Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge branch 'mc++'
authorGabriel Corona <gabriel.corona@loria.fr>
Fri, 21 Mar 2014 11:45:05 +0000 (12:45 +0100)
committerGabriel Corona <gabriel.corona@loria.fr>
Fri, 21 Mar 2014 11:45:05 +0000 (12:45 +0100)
Conflicts:
src/simgrid/sg_config.c
src/xbt/mmalloc/mm_diff.c

228 files changed:
.cproject
.gitignore
CMakeLists.txt
ChangeLog
NEWS
buildtools/Cmake/AddTests.cmake
buildtools/Cmake/CompleteInFiles.cmake
buildtools/Cmake/DefinePackages.cmake
buildtools/Cmake/Distrib.cmake
buildtools/Cmake/Flags.cmake
buildtools/Cmake/GenerateDoc.cmake
buildtools/Cmake/MaintainerMode.cmake
buildtools/Cmake/MakeExe.cmake
buildtools/Cmake/MakeJava.cmake
buildtools/Cmake/MakeLib.cmake
buildtools/Cmake/Modules/FindNS3.cmake
buildtools/Cmake/Scripts/java_bundle.sh
buildtools/jenkins/run.sh
buildtools/pipol/rc.debian
buildtools/pipol/rc.fedora
buildtools/pipol/rc.mac
buildtools/pipol/rc.ubuntu
contrib/benchmarking_code_block/Rdhist.R [new file with mode: 0644]
contrib/benchmarking_code_block/Rhist.R
contrib/benchmarking_code_block/Rplot_hist.R [new file with mode: 0644]
contrib/benchmarking_code_block/inject.h
doc/doxygen/module-surf.doc
doc/doxygen/options.doc
doc/doxygen/platform.doc
examples/java/bittorrent/Peer.java
examples/java/surfPlugin/CMakeLists.txt [new file with mode: 0644]
examples/java/surfPlugin/Receiver.java [new file with mode: 0644]
examples/java/surfPlugin/Sender.java [new file with mode: 0644]
examples/java/surfPlugin/TestPlugin.java [new file with mode: 0644]
examples/java/surfPlugin/TracePlugin.java [new file with mode: 0644]
examples/java/surfPlugin/surfPluginDeployment.xml [new file with mode: 0644]
examples/java/surfPlugin/surfPluginPlatform.xml [new file with mode: 0644]
examples/java/surfPlugin/surf_plugin.tesh [new file with mode: 0644]
examples/msg/io/file.c
examples/msg/io/file_unlink.c
examples/msg/io/io.tesh
examples/msg/io/storage.c
examples/msg/io/storage.tesh
examples/msg/pastry/pastry.c
examples/msg/suspend/suspend.c
examples/msg/suspend/suspend.tesh
examples/platforms/content/small_content.txt
examples/platforms/content/storage_content.txt
examples/platforms/content/win_storage_content.txt
examples/platforms/storage.xml
examples/simdag/io/io.tesh
examples/simdag/io/sd_io.c
examples/smpi/energy/f77/sef.f
examples/smpi/energy/f90/sef90.f90
examples/smpi/energy/se.c
include/instr/jedule/jedule_platform.h
include/instr/jedule/jedule_sd_binding.h
include/msg/datatypes.h
include/msg/msg.h
include/simdag/simdag.h
include/simgrid/platf.h
include/simgrid/simix.h
include/surf/simgrid_dtd.h
include/surf/surf_routing.h
include/xbt/misc.h
include/xbt/xbt_os_thread.h
src/bindings/java/jmsg_file.c
src/bindings/java/jmsg_file.h
src/bindings/java/jmsg_process.c
src/bindings/java/org/simgrid/NativeLib.java [new file with mode: 0644]
src/bindings/java/org/simgrid/msg/Msg.java
src/bindings/java/surf.i [new file with mode: 0644]
src/bindings/java/surf_swig.cpp [new file with mode: 0644]
src/bindings/java/surf_swig.hpp [new file with mode: 0644]
src/include/mc/mc.h
src/include/surf/surf.h
src/instr/instr_config.c
src/instr/jedule/jedule_platform.c
src/instr/jedule/jedule_sd_binding.c
src/mc/mc_memory.c
src/msg/msg_global.c
src/msg/msg_gos.c
src/msg/msg_host.c
src/msg/msg_io.c
src/msg/msg_private.h
src/msg/msg_process.c
src/simdag/dax_dtd.c
src/simdag/dax_dtd.h
src/simdag/private.h
src/simdag/sd_workstation.c
src/simgrid/sg_config.c
src/simix/simcalls.in
src/simix/simcalls_generated_args_getter_setter.h
src/simix/simcalls_generated_body.c
src/simix/simcalls_generated_case.c
src/simix/simcalls_generated_enum.h
src/simix/simcalls_generated_res_getter_setter.h
src/simix/simcalls_generated_string.c
src/simix/smx_context.c
src/simix/smx_context_raw.c
src/simix/smx_context_sysv.c
src/simix/smx_context_thread.c
src/simix/smx_deployment.c
src/simix/smx_global.c
src/simix/smx_host.c
src/simix/smx_host_private.h
src/simix/smx_io.c
src/simix/smx_io_private.h
src/simix/smx_network.c
src/simix/smx_private.h
src/simix/smx_process.c
src/simix/smx_process_private.h
src/simix/smx_smurf.c
src/simix/smx_smurf_private.h
src/simix/smx_user.c
src/smpi/private.h
src/smpi/smpi_base.c
src/smpi/smpi_coll.c
src/smpi/smpi_f77.c
src/smpi/smpi_global.c
src/smpi/smpi_pmpi.c
src/smpi/smpirun.in
src/surf/cpu_ti.cpp
src/surf/cpu_ti.hpp
src/surf/instr_surf.c
src/surf/network_interface.cpp
src/surf/network_interface.hpp
src/surf/network_smpi.cpp
src/surf/platf_generator.c
src/surf/simgrid.dtd
src/surf/simgrid_dtd.c
src/surf/storage_interface.cpp
src/surf/storage_interface.hpp
src/surf/storage_n11.cpp
src/surf/storage_n11.hpp
src/surf/surf_c_bindings.cpp
src/surf/surf_interface.cpp
src/surf/surf_interface.hpp
src/surf/surf_routing.cpp
src/surf/surf_routing_dijkstra.cpp
src/surf/surf_routing_floyd.cpp
src/surf/surf_routing_full.cpp
src/surf/surf_routing_generic.cpp
src/surf/surfxml_parse.c
src/surf/surfxml_parseplatf.c
src/surf/vm_workstation_hl13.cpp
src/surf/vm_workstation_hl13.hpp
src/surf/workstation_clm03.cpp
src/surf/workstation_clm03.hpp
src/surf/workstation_interface.cpp
src/surf/workstation_interface.hpp
src/xbt/automaton/parserPromela.tab.cacc
src/xbt/automaton/parserPromela.tab.hacc
src/xbt/config.c
src/xbt/dynar.c
src/xbt/graphxml.c
src/xbt/lib.c
src/xbt/mmalloc/mm_diff.c
src/xbt/mmalloc/mm_legacy.c
src/xbt/mmalloc/mm_module.c
src/xbt/mmalloc/mmorecore.c
src/xbt/set.c
src/xbt/xbt_main.c
src/xbt/xbt_os_thread.c
teshsuite/msg/CMakeLists.txt
teshsuite/msg/host_on_off.c [new file with mode: 0644]
teshsuite/msg/host_on_off.tesh [new file with mode: 0644]
teshsuite/msg/host_on_off_d.xml [new file with mode: 0644]
teshsuite/msg/host_on_off_p.xml [new file with mode: 0644]
teshsuite/msg/process.c [new file with mode: 0644]
teshsuite/msg/process.tesh [new file with mode: 0644]
teshsuite/msg/process_d.xml [new file with mode: 0644]
teshsuite/msg/process_p.xml [new file with mode: 0644]
teshsuite/msg/storage/platform.xml
teshsuite/msg/storage/storage_basic.c
teshsuite/msg/storage/storage_basic.tesh
teshsuite/msg/storage/storage_content_c.txt
teshsuite/msg/storage/storage_content_s1.txt
teshsuite/msg/storage/storage_content_s2.txt
teshsuite/msg/task_destroy_cancel.c [new file with mode: 0644]
teshsuite/msg/task_destroy_cancel.tesh [new file with mode: 0644]
teshsuite/msg/task_destroy_cancel_d.xml [new file with mode: 0644]
teshsuite/msg/task_destroy_cancel_p.xml [new file with mode: 0644]
teshsuite/simdag/platforms/CMakeLists.txt
teshsuite/simdag/platforms/basic_parsing_test.c
teshsuite/simdag/platforms/bogus_disk_attachment.tesh [new file with mode: 0644]
teshsuite/simdag/platforms/bogus_disk_attachment.xml [new file with mode: 0644]
teshsuite/simdag/platforms/bogus_missing_dst_gateway.xml [new file with mode: 0644]
teshsuite/simdag/platforms/bogus_missing_gateway.tesh [new file with mode: 0644]
teshsuite/simdag/platforms/bogus_missing_src_gateway.xml [new file with mode: 0644]
teshsuite/simdag/platforms/bogus_two_hosts_asymetric-2.xml [moved from teshsuite/simdag/platforms/two_hosts_asymetric_BOGUS2.xml with 100% similarity]
teshsuite/simdag/platforms/bogus_two_hosts_asymetric.tesh [new file with mode: 0644]
teshsuite/simdag/platforms/bogus_two_hosts_asymetric.xml [moved from teshsuite/simdag/platforms/two_hosts_asymetric_BOGUS.xml with 100% similarity]
teshsuite/simdag/platforms/two_hosts_asymetric.tesh [deleted file]
teshsuite/simix/CMakeLists.txt
teshsuite/simix/stack_overflow.c [new file with mode: 0644]
teshsuite/simix/stack_overflow.tesh [new file with mode: 0644]
teshsuite/simix/stack_overflow.xml [new file with mode: 0644]
teshsuite/smpi/allreduce_coll_large.tesh
teshsuite/smpi/mpich3-test/f90/datatype/indtype.f90
teshsuite/smpi/mpich3-test/f90/datatype/structf.f90
teshsuite/smpi/mpich3-test/topo/CMakeLists.txt [new file with mode: 0644]
teshsuite/smpi/mpich3-test/topo/cartcreates.c [new file with mode: 0644]
teshsuite/smpi/mpich3-test/topo/cartmap1.c [new file with mode: 0644]
teshsuite/smpi/mpich3-test/topo/cartshift1.c [new file with mode: 0644]
teshsuite/smpi/mpich3-test/topo/cartsuball.c [new file with mode: 0644]
teshsuite/smpi/mpich3-test/topo/cartzero.c [new file with mode: 0644]
teshsuite/smpi/mpich3-test/topo/dgraph_unwgt.c [new file with mode: 0644]
teshsuite/smpi/mpich3-test/topo/dims1.c [new file with mode: 0644]
teshsuite/smpi/mpich3-test/topo/dims2.c [new file with mode: 0644]
teshsuite/smpi/mpich3-test/topo/distgraph1.c [new file with mode: 0644]
teshsuite/smpi/mpich3-test/topo/graphcr.c [new file with mode: 0644]
teshsuite/smpi/mpich3-test/topo/graphcr2.c [new file with mode: 0644]
teshsuite/smpi/mpich3-test/topo/graphmap1.c [new file with mode: 0644]
teshsuite/smpi/mpich3-test/topo/neighb_coll.c [new file with mode: 0644]
teshsuite/smpi/mpich3-test/topo/testlist [new file with mode: 0644]
teshsuite/smpi/mpich3-test/topo/topodup.c [new file with mode: 0644]
teshsuite/smpi/mpich3-test/topo/topotest.c [new file with mode: 0644]
teshsuite/xbt/mmalloc_test.c
tools/tesh/background.tesh
tools/tesh/bg-set-signal.tesh
tools/tesh/catch-return.tesh
tools/tesh/catch-signal.tesh
tools/tesh/set-return.tesh
tools/tesh/set-signal.tesh
tools/tesh/setenv.tesh
tools/tesh/signal.c
tools/tesh/tesh.h

index 12679b9..f9a184c 100644 (file)
--- a/.cproject
+++ b/.cproject
@@ -1,23 +1,42 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <?fileVersion 5.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage2">
        <storageModule moduleId="org.eclipse.cdt.core.settings">
-               <cconfiguration id="cdt.managedbuild.toolchain.gnu.base.1053321950">
-                       <storageModule externalCElementFile="cdt.managedbuild.toolchain.gnu.base.1053321950_org.eclipse.cdt.core.settings" id="cdt.managedbuild.toolchain.gnu.base.1053321950" name="Default"/>
-                       <storageModule externalCElementFile="cdt.managedbuild.toolchain.gnu.base.1053321950_cdtBuildSystem" version="4.0.0"/>
-                       <storageModule externalCElementFile="cdt.managedbuild.toolchain.gnu.base.1053321950_org.eclipse.cdt.core.externalSettings"/>
+               <cconfiguration id="cdt.managedbuild.config.gnu.exe.debug.2015407975">
+                       <storageModule externalCElementFile="cdt.managedbuild.config.gnu.exe.debug.2015407975_org.eclipse.cdt.core.settings" id="cdt.managedbuild.config.gnu.exe.debug.2015407975" name="Debug"/>
+                       <storageModule externalCElementFile="cdt.managedbuild.config.gnu.exe.debug.2015407975_cdtBuildSystem" version="4.0.0"/>
+                       <storageModule externalCElementFile="cdt.managedbuild.config.gnu.exe.debug.2015407975_org.eclipse.cdt.core.externalSettings"/>
+               </cconfiguration>
+               <cconfiguration id="cdt.managedbuild.config.gnu.exe.release.114488438">
+                       <storageModule externalCElementFile="cdt.managedbuild.config.gnu.exe.release.114488438_org.eclipse.cdt.core.settings" id="cdt.managedbuild.config.gnu.exe.release.114488438" name="Release"/>
+                       <storageModule externalCElementFile="cdt.managedbuild.config.gnu.exe.release.114488438_cdtBuildSystem" version="4.0.0"/>
+                       <storageModule externalCElementFile="cdt.managedbuild.config.gnu.exe.release.114488438_org.eclipse.cdt.core.externalSettings"/>
                </cconfiguration>
        </storageModule>
        <storageModule moduleId="cdtBuildSystem" version="4.0.0">
-               <project id="simgrid.null.1652888656" name="simgrid"/>
+               <project id="simgrid.cdt.managedbuild.target.gnu.exe.761220255" name="Executable" projectType="cdt.managedbuild.target.gnu.exe"/>
        </storageModule>
        <storageModule moduleId="scannerConfiguration">
                <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+               <scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.release.114488438;cdt.managedbuild.config.gnu.exe.release.114488438.;cdt.managedbuild.tool.gnu.cpp.compiler.exe.release.1274273113;cdt.managedbuild.tool.gnu.cpp.compiler.input.172936601">
+                       <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+               </scannerConfigBuildInfo>
+               <scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.release.114488438;cdt.managedbuild.config.gnu.exe.release.114488438.;cdt.managedbuild.tool.gnu.c.compiler.exe.release.1343200016;cdt.managedbuild.tool.gnu.c.compiler.input.437437566">
+                       <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+               </scannerConfigBuildInfo>
+               <scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.debug.2015407975;cdt.managedbuild.config.gnu.exe.debug.2015407975.;cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug.317634629;cdt.managedbuild.tool.gnu.cpp.compiler.input.575478253">
+                       <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+               </scannerConfigBuildInfo>
+               <scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.debug.2015407975;cdt.managedbuild.config.gnu.exe.debug.2015407975.;cdt.managedbuild.tool.gnu.c.compiler.exe.debug.1036608105;cdt.managedbuild.tool.gnu.c.compiler.input.1837769819">
+                       <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+               </scannerConfigBuildInfo>
        </storageModule>
        <storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
        <storageModule moduleId="refreshScope" versionNumber="2">
-               <configuration configurationName="Default">
+               <configuration configurationName="Release">
+                       <resource resourceType="PROJECT" workspacePath="/simgrid"/>
+               </configuration>
+               <configuration configurationName="Debug">
                        <resource resourceType="PROJECT" workspacePath="/simgrid"/>
                </configuration>
        </storageModule>
-       <storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>
 </cproject>
index 1dfeaaf..6dc00ee 100644 (file)
@@ -132,6 +132,12 @@ examples/msg/simulation.trace
 examples/msg/toto.txt
 examples/msg/z_gtnets.trace
 examples/msg/gpu/test_MSG_gpu_task_create
+examples/msg/cloud/bound
+examples/msg/cloud/migrate_vm
+examples/msg/cloud/multicore
+examples/msg/cloud/scale
+examples/msg/cloud/simple_vm
+examples/msg/cloud/two_tasks_vm
 examples/msg/energy/e1/e1
 examples/msg/energy/e2/e2
 examples/msg/energy/e3/e3
@@ -147,6 +153,7 @@ examples/msg/tracing/tasks
 examples/msg/tracing/volume
 examples/msg/io/file
 examples/msg/io/file_unlink
+examples/msg/io/storage
 examples/msg/mc/bugged3
 examples/msg/mc/test/snapshot_comparison1
 examples/msg/mc/test/snapshot_comparison2
@@ -217,6 +224,9 @@ examples/msg/mc/bugged1
 examples/msg/parallel_contexts/pcontexts
 examples/msg/parallel_contexts/pcontexts2
 examples/msg/pmm/msg_pmm
+examples/smpi/energy/f77/sef
+examples/smpi/energy/f90/sef90
+examples/smpi/energy/se
 examples/smpi/toto.txt
 examples/smpi/MM/MM_mpi
 examples/smpi/smpi_replay
@@ -618,6 +628,7 @@ teshsuite/smpi/mpich3-test/f77/datatype/hindex1f
 teshsuite/smpi/mpich3-test/f77/datatype/hindexed_blockf
 teshsuite/smpi/mpich3-test/f77/datatype/packef
 teshsuite/smpi/mpich3-test/f77/datatype/typeaints.h
+teshsuite/smpi/mpich3-test/f77/datatype/typeaints
 teshsuite/smpi/mpich3-test/f77/datatype/typecntsf
 teshsuite/smpi/mpich3-test/f77/datatype/typem2f
 teshsuite/smpi/mpich3-test/f77/datatype/typename3f
@@ -714,9 +725,14 @@ teshsuite/smpi/mpich3-test/pt2pt/sendself
 teshsuite/smpi/mpich3-test/pt2pt/waitany-null
 teshsuite/smpi/mpich3-test/pt2pt/waittestnull
 
+teshsuite/msg/host_on_off
+teshsuite/msg/process
+teshsuite/msg/storage/storage_basic
+teshsuite/msg/task_destroy_cancel
 teshsuite/msg/pid
 teshsuite/msg/get_sender
 teshsuite/msg/trace/test_trace_integration
+teshsuite/simix/check_defaults
 teshsuite/simdag/availability/availability_test
 teshsuite/simdag/basic0
 teshsuite/simdag/basic1
index cfae0bb..8ea7ddf 100644 (file)
@@ -57,7 +57,7 @@ set(SIMGRID_VERSION_MINOR "11")
 set(SIMGRID_VERSION_PATCH "0")
 set(SIMGRID_VERSION_EXTRA "-devel") # Extra words to add to version string (e.g. -rc1)
 
-set(SIMGRID_VERSION_DATE  "2013") # Year for copyright information
+set(SIMGRID_VERSION_DATE  "2014") # Year for copyright information
 
 if(${SIMGRID_VERSION_PATCH} EQUAL "0")
   set(release_version "${SIMGRID_VERSION_MAJOR}.${SIMGRID_VERSION_MINOR}")
index 4df2e78..5abdda7 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -14,6 +14,8 @@ SimGrid (3.11) NOT RELEASED; urgency=low
      generate the tarball, or keep using cmake -E tar, but use git-ls-files
      to get the list of files to pack.
 
+ The Class Release.
+
  Tools:
  * Normalizing pointers addresses tool for better diff between logs
 
@@ -29,10 +31,13 @@ SimGrid (3.11) NOT RELEASED; urgency=low
    - creation of a VM on a PM
    - migration of a VM from a PM to another PM
 
- Simcalls:
- * Simcalls are now generated by a python script
-   - generate files include by simgrid
-   - check that all the functions exists and propose prototypes
+ SIMIX:
+ * Protect context stacks against stack overflow. The number of protected memory
+   pages allocated on the top of each stack (1 by default) can be configured
+   with the new command line option --cfg=contexts/guard_size:<value>.
+ * Simcalls are now generated by a python script that
+   - generates files included by SimGrid
+   - checks that all the functions exist, and proposes prototypes
  * Clean simcalls
    - remove sem_destroy, file_set_data, comm_destroy, vm_set_state,
      host_set_data, host_get_data
@@ -46,7 +51,7 @@ SimGrid (3.11) NOT RELEASED; urgency=low
  * Translate surf routings from C to C++
  * Add callbacks using sigc++ or boost::signals2
    - Add callback functions for resource creation/destruction
-   - Add callback finctions for action state change
+   - Add callback functions for action state change
    - Handle Energy as a plugin
  * Replace swag by boost::intrusive
  * Add new routing model for torus clusters
@@ -68,7 +73,7 @@ SimGrid (3.11) NOT RELEASED; urgency=low
  * Supernovae build mode is definitively removed. It was used to improve
    inlining and inter-module optimizations. It is nowadays superseded by
    link-time optimizations commonly available in compilers.
- * Update ns3 find lib
+ * Update ns-3 find lib. Bindings for ns-3 should work again now.
  * Add boost dependency for surf++
 
  -- $date Da SimGrid team <simgrid-devel@lists.gforge.inria.fr>
@@ -293,7 +298,7 @@ SimGrid (3.8) stable; urgency=low
  * New option "enable_mallocators" to disable mallocators, for debugging
    purpose ("on" by default).
 
- Simix:
+ SIMIX:
  * Bug fixes around the resource failures: don't let the processes
    survive the host they are running onto.
  * Add an interface to auto-restart processes when the host in which they are
diff --git a/NEWS b/NEWS
index 716b19f..6388d4a 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -5,10 +5,10 @@ __   _____ _ __ ___(_) ___  _ __   |___ / / / |
   \_/ \___|_|  |___/_|\___/|_| |_| |____(_)_|_|
 
 The Class Release. Major changes:
- * Surf is now in C++ and documented
- * Virtual Machine model
- * Surf callbacks to create plugins
- * Simcalls generated by python script
+ * Surf is now in C++ (and documented!)
+ * Virtual Machine model for Cloud Simulation
+ * Surf callbacks: plug your code directly in Surf!
+ * Simcalls are script-generated to clean the mess
                     _               _____  _  ___
 __   _____ _ __ ___(_) ___  _ __   |___ / / |/ _ \
 \ \ / / _ \ '__/ __| |/ _ \| '_ \    |_ \ | | | | |
index 658b0c7..f9b62f9 100644 (file)
@@ -110,10 +110,37 @@ if(NOT enable_memcheck)
     ADD_TEST(tesh-msg-pid-ucontext              ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/pid.tesh)
   endif()
 
+  ADD_TEST(tesh-msg-host-on-off-thread          ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/host_on_off.tesh)
+  if(HAVE_RAWCTX)
+    ADD_TEST(tesh-msg-host-on-off-raw           ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/host_on_off.tesh)
+  endif()
+  if(CONTEXT_UCONTEXT)
+    ADD_TEST(tesh-msg-host-on-off-ucontext      ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/host_on_off.tesh)
+  endif()
+
+  ADD_TEST(tesh-msg-task-destroy-cancel-thread          ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/task_destroy_cancel.tesh)
+  if(HAVE_RAWCTX)
+    ADD_TEST(tesh-msg-task-destroy-cancel-raw           ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/task_destroy_cancel.tesh)
+  endif()
+  if(CONTEXT_UCONTEXT)
+    ADD_TEST(tesh-msg-task-destroy-cancel-ucontext      ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/task_destroy_cancel.tesh)
+  endif()
+
+  ADD_TEST(tesh-msg-process-thread          ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/process.tesh)
+  if(HAVE_RAWCTX)
+    ADD_TEST(tesh-msg-process-raw           ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/process.tesh)
+  endif()
+  if(CONTEXT_UCONTEXT)
+    ADD_TEST(tesh-msg-process-ucontext      ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/process.tesh)
+  endif()
+
+
   # these tests need the assertion mechanism
   # exclude them from memcheck, as they normally die, leaving lots of unfree'd objects
   IF(enable_debug AND NOT enable_memcheck)
-    ADD_TEST(tesh-simdag-parser-bogus-symmetric ${TESH_COMMAND} ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms two_hosts_asymetric.tesh)
+    ADD_TEST(tesh-parser-bogus-symmetric     ${TESH_COMMAND} ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms bogus_two_hosts_asymetric.tesh)
+    ADD_TEST(tesh-parser-bogus-missing-gw ${TESH_COMMAND} ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms bogus_missing_gateway.tesh)
+    ADD_TEST(tesh-disk-attachment ${TESH_COMMAND} ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms bogus_disk_attachment.tesh)
   ENDIF()
 
   ADD_TEST(tesh-simdag-bypass                   ${TESH_COMMAND} ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms --setenv srcdir=${CMAKE_HOME_DIRECTORY} --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms basic_parsing_test_bypass.tesh)
@@ -447,12 +474,30 @@ if(NOT enable_memcheck)
       endif()
     endif()
 
-    ADD_TEST(smpi-energy                        ${TESH_COMMAND} ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/smpi/energy --cd ${CMAKE_BINARY_DIR}/examples/smpi/energy ${CMAKE_HOME_DIRECTORY}/examples/smpi/energy/energy.tesh)
+    ADD_TEST(smpi-energy-thread                 ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/smpi/energy --cd ${CMAKE_BINARY_DIR}/examples/smpi/energy ${CMAKE_HOME_DIRECTORY}/examples/smpi/energy/energy.tesh)
     if(SMPI_F2C)
-      ADD_TEST(smpi-energy-f77                  ${TESH_COMMAND} ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/smpi/energy --cd ${CMAKE_BINARY_DIR}/examples/smpi/energy ${CMAKE_HOME_DIRECTORY}/examples/smpi/energy/f77/energy.tesh)
+      ADD_TEST(smpi-energy-f77-thread           ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/smpi/energy --cd ${CMAKE_BINARY_DIR}/examples/smpi/energy ${CMAKE_HOME_DIRECTORY}/examples/smpi/energy/f77/energy.tesh)
     endif()
     if(SMPI_F90)
-      ADD_TEST(smpi-energy-f90                  ${TESH_COMMAND} ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/smpi/energy --cd ${CMAKE_BINARY_DIR}/examples/smpi/energy ${CMAKE_HOME_DIRECTORY}/examples/smpi/energy/f90/energy.tesh)
+      ADD_TEST(smpi-energy-f90-thread           ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/smpi/energy --cd ${CMAKE_BINARY_DIR}/examples/smpi/energy ${CMAKE_HOME_DIRECTORY}/examples/smpi/energy/f90/energy.tesh)
+    endif()
+    if(CONTEXT_UCONTEXT)
+      ADD_TEST(smpi-energy-ucontext             ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/smpi/energy --cd ${CMAKE_BINARY_DIR}/examples/smpi/energy ${CMAKE_HOME_DIRECTORY}/examples/smpi/energy/energy.tesh)
+      if(SMPI_F2C)
+        ADD_TEST(smpi-energy-f77-ucontext       ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/smpi/energy --cd ${CMAKE_BINARY_DIR}/examples/smpi/energy ${CMAKE_HOME_DIRECTORY}/examples/smpi/energy/f77/energy.tesh)
+      endif()
+      if(SMPI_F90)
+        ADD_TEST(smpi-energy-f90-ucontext       ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/smpi/energy --cd ${CMAKE_BINARY_DIR}/examples/smpi/energy ${CMAKE_HOME_DIRECTORY}/examples/smpi/energy/f90/energy.tesh)
+      endif()
+    endif()
+    if(HAVE_RAWCTX)
+      ADD_TEST(smpi-energy-raw                  ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/smpi/energy --cd ${CMAKE_BINARY_DIR}/examples/smpi/energy ${CMAKE_HOME_DIRECTORY}/examples/smpi/energy/energy.tesh)
+      if(SMPI_F2C)
+        ADD_TEST(smpi-energy-f77-raw            ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/smpi/energy --cd ${CMAKE_BINARY_DIR}/examples/smpi/energy ${CMAKE_HOME_DIRECTORY}/examples/smpi/energy/f77/energy.tesh)
+      endif()
+      if(SMPI_F90)
+        ADD_TEST(smpi-energy-f90-raw            ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/smpi/energy --cd ${CMAKE_BINARY_DIR}/examples/smpi/energy ${CMAKE_HOME_DIRECTORY}/examples/smpi/energy/f90/energy.tesh)
+      endif()
     endif()
 
     if(HAVE_TRACING)
@@ -580,6 +625,7 @@ if(NOT enable_memcheck)
     ADD_TEST(java-pingPong                      ${TESH_COMMAND} ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/java --setenv classpath=${TESH_CLASSPATH} --cd ${CMAKE_BINARY_DIR}/examples/java ${CMAKE_HOME_DIRECTORY}/examples/java/pingPong/pingpong.tesh)
     ADD_TEST(java-priority                      ${TESH_COMMAND} ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/java --setenv classpath=${TESH_CLASSPATH} --cd ${CMAKE_BINARY_DIR}/examples/java ${CMAKE_HOME_DIRECTORY}/examples/java/priority/priority.tesh)
     ADD_TEST(java-startKillTime                 ${TESH_COMMAND} ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/java --setenv classpath=${TESH_CLASSPATH} --cd ${CMAKE_BINARY_DIR}/examples/java ${CMAKE_HOME_DIRECTORY}/examples/java/startKillTime/startKillTime.tesh)
+    ADD_TEST(java-surf-plugin                   ${TESH_COMMAND} ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/java --setenv classpath=${TESH_CLASSPATH} --cd ${CMAKE_BINARY_DIR}/examples/java ${CMAKE_HOME_DIRECTORY}/examples/java/surfPlugin/surf_plugin.tesh)
     ADD_TEST(java-suspend                       ${TESH_COMMAND} ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/java --setenv classpath=${TESH_CLASSPATH} --cd ${CMAKE_BINARY_DIR}/examples/java ${CMAKE_HOME_DIRECTORY}/examples/java/suspend/suspend.tesh)
     if(HAVE_TRACING)
       ADD_TEST(java-tracing                     ${TESH_COMMAND} ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/java --setenv classpath=${TESH_CLASSPATH} --cd ${CMAKE_BINARY_DIR}/examples/java ${CMAKE_HOME_DIRECTORY}/examples/java/tracing/tracingPingPong.tesh)
@@ -599,6 +645,14 @@ if(NOT enable_memcheck)
     ADD_TEST(scala-masterslave                  ${TESH_COMMAND} ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/scala --setenv classpath=${TESH_CLASSPATH} --cd ${CMAKE_BINARY_DIR}/examples/scala ${CMAKE_HOME_DIRECTORY}/examples/scala/masterslave/masterslave.tesh)
   endif()
 
+  ADD_TEST(stack-overflow-thread                ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simix/stack_overflow.tesh)
+  if(CONTEXT_UCONTEXT)
+    ADD_TEST(stack-overflow-ucontext            ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simix/stack_overflow.tesh)
+  endif()
+  if(HAVE_RAWCTX)
+    ADD_TEST(stack-overflow-raw                 ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simix/stack_overflow.tesh)
+  endif()
+
   # examples/msg/mc
   if(HAVE_MC)
     if(CONTEXT_UCONTEXT)
@@ -615,6 +669,23 @@ if(NOT enable_memcheck)
     endif()
   endif()
 
+  ###
+  ### Declare that we know that some tests are broken
+  ###
+  if(release)
+    if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
+      # These tests are known to fail on Mac OS X (the expected error message is
+      # not shown).
+      set_tests_properties(stack-overflow-thread PROPERTIES WILL_FAIL true)
+      if(CONTEXT_UCONTEXT)
+        set_tests_properties(stack-overflow-ucontext PROPERTIES WILL_FAIL true)
+      endif()
+      if(HAVE_RAWCTX)
+        set_tests_properties(stack-overflow-raw PROPERTIES WILL_FAIL true)
+      endif()
+    endif()
+  endif()
+
 endif()
 
 ADD_TEST(tesh-simdag-full-links01               ${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms/basic_parsing_test ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms/two_clusters.xml FULL_LINK)
index 98cc461..1e21249 100644 (file)
@@ -84,6 +84,9 @@ if(enable_java)
   find_package(JNI REQUIRED)
   message("-- [Java] JNI found: ${JNI_FOUND}")
   message("-- [Java] JNI include dirs: ${JNI_INCLUDE_DIRS}")
+  find_package(SWIG REQUIRED)
+  include(UseSWIG)
+  message("-- [Java] Swig found: ${SWIG_FOUND}")
   set(HAVE_Java 1)
 endif()
 if(enable_scala)
@@ -107,6 +110,8 @@ else()
 endif()
 
 # Checks for header libraries functions.
+CHECK_LIBRARY_EXISTS(dl      dlopen                  "" HAVE_DLOPEN_IN_LIBDL)
+CHECK_LIBRARY_EXISTS(execinfo backtrace              "" HAVE_BACKTRACE_IN_LIBEXECINFO)
 CHECK_LIBRARY_EXISTS(pthread pthread_create          "" pthread)
 CHECK_LIBRARY_EXISTS(pthread sem_init                "" HAVE_SEM_INIT_LIB)
 CHECK_LIBRARY_EXISTS(pthread sem_open                "" HAVE_SEM_OPEN_LIB)
@@ -250,7 +255,10 @@ CHECK_TYPE_SIZE(void* SIZEOF_VOIDP)
 ### Check for GNU dynamic linker
 CHECK_INCLUDE_FILE("dlfcn.h" HAVE_DLFCN_H)
 if (HAVE_DLFCN_H)
-    execute_process(COMMAND ${CMAKE_C_COMPILER} ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/test_prog/prog_gnu_dynlinker.c -ldl -o test_gnu_ld
+    if(HAVE_DLOPEN_IN_LIBDL)
+      set(DL_LIBRARY "-ldl")
+    endif(HAVE_DLOPEN_IN_LIBDL)
+    execute_process(COMMAND ${CMAKE_C_COMPILER} ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/test_prog/prog_gnu_dynlinker.c ${DL_LIBRARY} -o test_gnu_ld
       WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
       OUTPUT_VARIABLE HAVE_GNU_LD_compil
     )
index 0f610f7..3b5ee1a 100644 (file)
@@ -460,6 +460,9 @@ set(JMSG_C_SRC
 )
 
 set(JMSG_JAVA_SRC
+  src/bindings/java/org/simgrid/NativeLib.java
+  #src/bindings/java/org/simgrid/NativeException.java
+
   src/bindings/java/org/simgrid/msg/As.java    
   src/bindings/java/org/simgrid/msg/Comm.java
   src/bindings/java/org/simgrid/msg/File.java
@@ -470,8 +473,7 @@ set(JMSG_JAVA_SRC
   src/bindings/java/org/simgrid/msg/Msg.java
   src/bindings/java/org/simgrid/msg/MsgException.java
   src/bindings/java/org/simgrid/msg/Mutex.java
-  src/bindings/java/org/simgrid/msg/NativeException.java
-  src/bindings/java/org/simgrid/msg/NativeLib.java
+  src/bindings/java/org/simgrid/msg/NativeException.java    
   src/bindings/java/org/simgrid/msg/Process.java
   src/bindings/java/org/simgrid/msg/ProcessKilledError.java
   src/bindings/java/org/simgrid/msg/ProcessNotFoundException.java
@@ -484,6 +486,30 @@ set(JMSG_JAVA_SRC
   src/bindings/java/org/simgrid/msg/VM.java
 )
 
+set(JSURF_SWIG_SRC
+  src/bindings/java/surf.i
+)
+set(JSURF_JAVA_C_SRC
+  src/bindings/java/surf_swig.cpp
+  src/bindings/java/surf_swig.hpp
+)
+
+set(JSURF_JAVA_GENERATED_SRC
+  ${CMAKE_BINARY_DIR}/src/bindings/java/org/simgrid/surf/Surf.java
+  ${CMAKE_BINARY_DIR}/src/bindings/java/org/simgrid/surf/SurfJNI.java
+  ${CMAKE_BINARY_DIR}/src/bindings/java/org/simgrid/surf/Plugin.java
+  ${CMAKE_BINARY_DIR}/src/bindings/java/org/simgrid/surf/Model.java
+  ${CMAKE_BINARY_DIR}/src/bindings/java/org/simgrid/surf/Resource.java
+  ${CMAKE_BINARY_DIR}/src/bindings/java/org/simgrid/surf/Action.java  
+  ${CMAKE_BINARY_DIR}/src/bindings/java/org/simgrid/surf/Cpu.java
+  ${CMAKE_BINARY_DIR}/src/bindings/java/org/simgrid/surf/CpuAction.java  
+  ${CMAKE_BINARY_DIR}/src/bindings/java/org/simgrid/surf/NetworkLink.java  
+  ${CMAKE_BINARY_DIR}/src/bindings/java/org/simgrid/surf/NetworkAction.java  
+
+  ${CMAKE_BINARY_DIR}/src/bindings/java/org/simgrid/surf/LmmConstraint.java  
+  ${CMAKE_BINARY_DIR}/src/bindings/java/org/simgrid/surf/XbtDict.java
+) 
+
 set(JTRACE_C_SRC
   src/bindings/java/jtrace.c
   src/bindings/java/jtrace.h
@@ -880,6 +906,7 @@ set(EXAMPLES_CMAKEFILES_TXT
   examples/java/cloud/CMakeLists.txt
   examples/java/cloud/migration/CMakeLists.txt
   examples/java/commTime/CMakeLists.txt
+  examples/java/surfPlugin/CMakeLists.txt
   examples/java/io/CMakeLists.txt
   examples/java/kademlia/CMakeLists.txt
   examples/java/master_slave_bypass/CMakeLists.txt
@@ -961,6 +988,7 @@ set(TESHSUITE_CMAKEFILES_TXT
   teshsuite/smpi/mpich3-test/coll/CMakeLists.txt
   teshsuite/smpi/mpich3-test/datatype/CMakeLists.txt
   teshsuite/smpi/mpich3-test/group/CMakeLists.txt
+  teshsuite/smpi/mpich3-test/topo/CMakeLists.txt
   teshsuite/smpi/mpich3-test/init/CMakeLists.txt
   teshsuite/smpi/mpich3-test/pt2pt/CMakeLists.txt
   teshsuite/smpi/mpich3-test/f77/util/CMakeLists.txt
index 74b539b..2bb482a 100644 (file)
@@ -189,6 +189,8 @@ set(source_to_pack
   ${JEDULE_SRC}
   ${JMSG_C_SRC}
   ${JMSG_JAVA_SRC}
+  ${JSURF_SWIG_SRC}
+  ${JSURF_JAVA_C_SRC}
   ${LUA_SRC}
   ${MC_SRC}
   ${MSG_SRC}
index eb9d3f4..5e959e3 100644 (file)
@@ -19,7 +19,7 @@ if(enable_compile_warnings)
     endif()
   endif()
 
-  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wno-unused-function -Wno-unused-parameter -Wno-strict-aliasing -Wno-format-nonliteral -Werror")
 
   set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -Wall") # FIXME: Q&D hack
 
index 0ef519a..6d9769e 100644 (file)
@@ -3,6 +3,7 @@
 find_path(DOXYGEN_PATH  NAMES doxygen  PATHS NO_DEFAULT_PATHS)
 find_path(JAVADOC_PATH  NAMES javadoc   PATHS NO_DEFAULT_PATHS)
 find_path(FIG2DEV_PATH  NAMES fig2dev  PATHS NO_DEFAULT_PATHS)
+mark_as_advanced(JAVADOC_PATH)
 
 if(DOXYGEN_PATH)
 
index cd89912..fe93a14 100644 (file)
@@ -6,6 +6,7 @@ set(FLEXML_MIN_PATCH 6)
 # the rest should only be changed if you understand what you're doing
 if(enable_maintainer_mode AND NOT WIN32)
   find_program(PYTHON_EXE NAMES python)
+  mark_as_advanced(PYTHON_EXE)
   if (PYTHON_EXE)
     add_custom_command(
       OUTPUT
index b9a64be..299103e 100644 (file)
@@ -19,6 +19,7 @@ add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/java/mutualExclusion)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/java/pingPong)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/java/priority)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/java/startKillTime)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/java/surfPlugin)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/java/suspend)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/java/tracing)
 
@@ -97,6 +98,7 @@ add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich3-test/coll)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich3-test/comm)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich3-test/datatype)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich3-test/group)
+add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich3-test/topo)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich3-test/init)
 add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich3-test/pt2pt)
 
index f1c43de..8091c98 100644 (file)
@@ -29,8 +29,6 @@ message("-- [Java] simgrid-java includes: ${CHECK_INCLUDES}")
 target_link_libraries(simgrid-java simgrid)
 
 
-
-
 if(WIN32)
   exec_program("java -d32 -version"
                 OUTPUT_VARIABLE IS_32_BITS_JVM)
@@ -65,6 +63,8 @@ set(LIBSIMGRID_SO
   libsimgrid${CMAKE_SHARED_LIBRARY_SUFFIX})
 set(LIBSIMGRID_JAVA_SO
   ${CMAKE_SHARED_LIBRARY_PREFIX}simgrid-java${CMAKE_SHARED_LIBRARY_SUFFIX})
+set(LIBSURF_JAVA_SO
+  ${CMAKE_SHARED_LIBRARY_PREFIX}surf-java${CMAKE_SHARED_LIBRARY_SUFFIX})
 
 ## Don't strip libraries if not in release mode
 ##
@@ -78,15 +78,16 @@ endif()
 ##
 if(CMAKE_VERSION VERSION_LESS "2.8.12")
   set(CMAKE_JAVA_TARGET_OUTPUT_NAME simgrid)
-  add_jar(simgrid-java_pre_jar ${JMSG_JAVA_SRC})
+  add_jar(simgrid-java_pre_jar ${JMSG_JAVA_SRC} ${JSURF_JAVA_GENERATED_SRC})
 else()
-  add_jar(simgrid-java_pre_jar ${JMSG_JAVA_SRC} OUTPUT_NAME simgrid)
+  add_jar(simgrid-java_pre_jar ${JMSG_JAVA_SRC} ${JSURF_JAVA_GENERATED_SRC} OUTPUT_NAME simgrid)
 endif()
 
 set(JAVA_BUNDLE "${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/Scripts/java_bundle.sh")
 set(JAVA_BUNDLE_SO_FILES
   ${CMAKE_BINARY_DIR}/lib/${LIBSIMGRID_SO}
   ${CMAKE_BINARY_DIR}/lib/${LIBSIMGRID_JAVA_SO}
+  ${CMAKE_BINARY_DIR}/lib/${LIBSURF_JAVA_SO}
   )
 set(JAVA_BUNDLE_TXT_FILES
   ${CMAKE_HOME_DIRECTORY}/COPYING
@@ -111,3 +112,15 @@ add_custom_command(
   COMMAND ${CMAKE_COMMAND} -E touch ${SIMGRID_JAR}_finalized
   )
 add_custom_target(simgrid-java_jar ALL DEPENDS ${SIMGRID_JAR}_finalized)
+
+set(CMAKE_SWIG_FLAGS "-package" "org.simgrid.surf")
+set(CMAKE_SWIG_OUTDIR "${CMAKE_HOME_DIRECTORY}/src/bindings/java/org/simgrid/surf")
+set(CMAKE_SWIG_OUTDIR "${CMAKE_BINARY_DIR}/src/bindings/java/org/simgrid/surf")
+
+set_source_files_properties(${JSURF_SWIG_SRC} PROPERTIES CPLUSPLUS 1)
+#set_source_files_properties(${SURF_SWIG_FILE} PROPERTIES SWIG_FLAGS "-includeall")
+include_directories(${JNI_INCLUDE_DIRS})
+swig_add_module(surf-java java ${JSURF_SWIG_SRC} ${JSURF_JAVA_C_SRC})
+swig_link_libraries(surf-java simgrid)
+
+add_dependencies(simgrid-java surf-java)
index 25fdfad..ef15efa 100644 (file)
@@ -20,7 +20,16 @@ add_dependencies(simgrid maintainer_files)
 
 # Compute the dependencies of SimGrid
 #####################################
-set(SIMGRID_DEP "-lm -lstdc++")
+set(SIMGRID_DEP "-lm")
+
+if(${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD"
+    AND NOT ${CMAKE_SYSTEM_VERSION} VERSION_LESS 10.0
+    AND ${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang")
+  # FreeBSD from 10.0 provide a internal C++ stack (unused by gcc)
+  set(SIMGRID_DEP "${SIMGRID_DEP} -lc++")
+else()
+  set(SIMGRID_DEP "${SIMGRID_DEP} -lstdc++")
+endif()
 
 if(pthread)
   if(${CONTEXT_THREADS})
@@ -90,7 +99,7 @@ if(HAVE_MC)
 endif()
 
 if(MMALLOC_WANT_OVERRIDE_LEGACY AND HAVE_GNU_LD)
-  SET(SIMGRID_DEP "${SIMGRID_DEP} -ldl")
+  SET(SIMGRID_DEP "${SIMGRID_DEP} ${DL_LIBRARY}")
 endif()
 
 if(HAVE_NS3)
@@ -107,6 +116,10 @@ if(HAVE_POSIX_GETTIME)
   SET(SIMGRID_DEP "${SIMGRID_DEP} -lrt")
 endif()
 
+if(HAVE_BACKTRACE_IN_LIBEXECINFO)
+  SET(SIMGRID_DEP "${SIMGRID_DEP} -lexecinfo")
+endif(HAVE_BACKTRACE_IN_LIBEXECINFO)
+
 # Compute the dependencies of SMPI
 ##################################
 if(enable_smpi AND APPLE)
index 2e0afbd..eb64091 100644 (file)
@@ -57,35 +57,24 @@ if(HAVE_CORE_MODULE_H)
     message(STATUS "Warning: NS-3 version <= 3.10")
     set(HAVE_NS3 1)
     set(NS3_VERSION_MINOR 10)
-    string(REPLACE "/libns3.${LIB_EXE}" "" HAVE_NS3_LIB "${HAVE_NS3_LIB}")
+    get_filename_component(NS3_LIBRARY_PATH "${HAVE_NS3_LIB}" PATH)
   endif()
   if(HAVE_NS3_CORE_LIB)
     message(STATUS "NS-3 version > 3.10")
     string(REGEX REPLACE ".*ns3.([0-9]+)-core.*" "\\1" NS3_VERSION_MINOR "${HAVE_NS3_CORE_LIB}")
     set(HAVE_NS3 1)
-    string(REPLACE "/libns3-core.${LIB_EXE}" "" HAVE_NS3_LIB "${HAVE_NS3_CORE_LIB}")
+    get_filename_component(NS3_LIBRARY_PATH "${HAVE_NS3_CORE_LIB}" PATH)
   endif()
 endif()
 
 if(HAVE_NS3)
-  string(REGEX MATCH "${HAVE_NS3_LIB}" operation "$ENV{LD_LIBRARY_PATH}")
+  string(REGEX MATCH "${NS3_LIBRARY_PATH}" operation "$ENV{LD_LIBRARY_PATH}")
   if(NOT operation)
-    message(STATUS "Warning: To use NS-3 don't forget to set LD_LIBRARY_PATH with:     export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${HAVE_NS3_LIB}")
-  else()
-
-    string(REGEX MATCH "-L${HAVE_NS3_LIB} " operation1 "${CMAKE_C_FLAGS}")
-    if(NOT operation1)
-      SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}-L${HAVE_NS3_LIB} ")
-    endif()
-
-    string(REGEX MATCH "-I${HAVE_CORE_MODULE_H} " operation1 "${CMAKE_C_FLAGS}")
-    if(NOT operation1)
-      SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}-I${HAVE_CORE_MODULE_H} ")
-    endif()
-
-    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}-I${HAVE_CORE_MODULE_H} -L${HAVE_NS3_LIB} ")
-    message(STATUS "TEST: ${CMAKE_CXX_FLAGS}")
+    message(STATUS "Warning: To use NS-3 don't forget to set LD_LIBRARY_PATH with: export LD_LIBRARY_PATH=${NS3_LIBRARY_PATH}\${LD_LIBRARY_PATH:+:\$LD_LIBRARY_PATH}")
   endif()
+
+  link_directories(${NS3_LIBRARY_PATH})
+  include_directories(${HAVE_CORE_MODULE_H})
 else()
   message(STATUS "Warning: To use NS-3 Please install ns3 at least version 3.10 (http://www.nsnam.org/releases/)")
 endif()
index 1c232b8..c0d51ce 100755 (executable)
@@ -20,7 +20,7 @@ JAVA=$2
 STRIP=$3
 shift 3
 
-JSG_BUNDLE=$("$JAVA" -classpath "$SIMGRID_JAR" org.simgrid.msg.NativeLib)
+JSG_BUNDLE=$("$JAVA" -classpath "$SIMGRID_JAR" org.simgrid.NativeLib)
 
 # sanity check
 case "$JSG_BUNDLE" in
index 1d1ad6c..96f8afb 100755 (executable)
@@ -75,7 +75,7 @@ fi
 
 echo "running tests with $NUMBER_OF_PROCESSORS processors"
 
-ctest -T test --no-compress-output  --timeout 100 -j$NUMBER_OF_PROCESSORS || true
+ctest --output-on-failure -T test --no-compress-output  --timeout 100 -j$NUMBER_OF_PROCESSORS || true
 if [ -f Testing/TAG ] ; then
    xsltproc $WORKSPACE/buildtools/jenkins/ctest2junit.xsl -o "$WORKSPACE/CTestResults.xml" Testing/`head -n 1 < Testing/TAG`/Test.xml
 fi
index 8a65eff..67e8688 100644 (file)
@@ -4,6 +4,7 @@ sudo aptitude update
 
 sudo aptitude -y install cmake
 sudo aptitude -y install default-jdk
+sudo aptitude -y install swig
 sudo aptitude -y install f2c
 sudo aptitude -y install g++
 sudo aptitude -y install gcc
@@ -21,6 +22,7 @@ which_gcc=`which gcc`         #gcc gcc necessary
 which_gpp=`which g++`          #gcc g++ necessary
 which_make=`which make`                #make necessary
 which_java=`which java`                #java optional
+which_swig=`which swig`                #swig optional
 which_lua=`which lua`          #lua
 which_cmake=`which cmake`      #cmake necessary
 which_unzip=`which unzip`      #unzip for gtnets
@@ -35,6 +37,7 @@ echo $which_cmake
 echo $which_unzip
 echo $which_lua
 echo $which_java
+echo $which_swig
 echo $which_make
 echo $which_gcc
 echo $which_gpp
index 6dcc08b..9c0f818 100644 (file)
@@ -11,6 +11,7 @@ sudo yum -y -q install gcc
 sudo yum -y -q install git-core
 sudo yum -y -q install graphviz-dev graphviz
 sudo yum -y -q install java-1.6.0-openjdk
+sudo yum -y -q install swig
 sudo yum -y -q install libunwind libunwind-devel
 sudo yum -y -q install lua-devel lua
 sudo yum -y -q install make
@@ -24,6 +25,7 @@ which_gcc=`which gcc`         #gcc gcc necessary
 which_gpp=`which g++`          #gcc g++ necessary
 which_make=`which make`                #make necessary
 which_java=`which java`                #java optional
+which_swig=`which swig`                #swig optional
 which_lua=`which lua`          #lua
 which_cmake=`which cmake`      #cmake necessary
 which_unzip=`which unzip`      #unzip for gtnets
@@ -38,6 +40,7 @@ echo $which_cmake
 echo $which_unzip
 echo $which_lua
 echo $which_java
+echo $which_swig
 echo $which_make
 echo $which_gcc
 echo $which_gpp
@@ -48,4 +51,4 @@ echo $which_perl
 echo $which_f2c
 echo $which_gcov
 echo $which_git
-echo "FIN------------------------------------"
\ No newline at end of file
+echo "FIN------------------------------------"
index 9fc740a..7538a6c 100644 (file)
@@ -4,6 +4,7 @@
 #sudo port install gcc46
 #sudo port install graphviz-devel
 #sudo port install lua
+#sudo port install swig
 #sudo port select bf2c
 
 sudo port install ruby19
@@ -16,6 +17,7 @@ which_gcc=`which gcc`         #gcc gcc necessary
 which_gpp=`which g++`          #gcc g++ necessary
 which_make=`which make`                #make necessary
 which_java=`which java`                #java optional
+which_java=`which swig`                #swig optional
 which_lua=`which lua`          #lua
 which_cmake=`which cmake`      #cmake necessary
 which_unzip=`which unzip`      #unzip for gtnets
@@ -30,6 +32,7 @@ echo $which_cmake
 echo $which_unzip
 echo $which_lua
 echo $which_java
+echo $which_swig
 echo $which_make
 echo $which_gcc
 echo $which_gpp
@@ -39,4 +42,4 @@ echo $which_perl
 echo $which_f2c
 echo $which_gcov
 echo $which_git
-echo "FIN------------------------------------"
\ No newline at end of file
+echo "FIN------------------------------------"
index b2b9d25..19658e8 100644 (file)
@@ -4,6 +4,7 @@ sudo apt-get update
 
 sudo apt-get -y -qq install cmake
 sudo apt-get -y -qq install default-jdk
+sudo apt-get -y -qq install swig
 sudo apt-get -y -qq install f2c
 sudo apt-get -y -qq install g++
 sudo apt-get -y -qq install gcc
@@ -33,6 +34,7 @@ which_gcc=`which gcc`         #gcc gcc necessary
 which_gpp=`which g++`          #gcc g++ necessary
 which_make=`which make`                #make necessary
 which_java=`which java`                #java optional
+which_swig=`which swig`                #swig optional
 which_lua=`which lua`          #lua
 which_cmake=`which cmake`      #cmake necessary
 which_unzip=`which unzip`      #unzip for gtnets
@@ -47,6 +49,7 @@ echo $which_cmake
 echo $which_unzip
 echo $which_lua
 echo $which_java
+echo $which_swig
 echo $which_make
 echo $which_gcc
 echo $which_gpp
@@ -57,4 +60,4 @@ echo $which_perl
 echo $which_f2c
 echo $which_gcov
 echo $which_git
-echo "FIN------------------------------------"
\ No newline at end of file
+echo "FIN------------------------------------"
diff --git a/contrib/benchmarking_code_block/Rdhist.R b/contrib/benchmarking_code_block/Rdhist.R
new file mode 100644 (file)
index 0000000..76ff210
--- /dev/null
@@ -0,0 +1,313 @@
+#-------------------------------------------------------------------------------
+# Copyright (c) 2012 University of Illinois, NCSA.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the
+# University of Illinois/NCSA Open Source License
+# which accompanies this distribution, and is available at
+# http://opensource.ncsa.illinois.edu/license.html
+#-------------------------------------------------------------------------------
+##--------------------------------------------------------------------------------------------------#
+##' Variable-width (dagonally cut) histogram
+##'
+##'
+##' When constructing a histogram, it is common to make all bars the same width.
+##' One could also choose to make them all have the same area.
+##' These two options have complementary strengths and weaknesses; the equal-width histogram oversmooths in regions of high density, and is poor at identifying sharp peaks; the equal-area histogram oversmooths in regions of low density, and so does not identify outliers.
+##' We describe a compromise approach which avoids both of these defects. We regard the histogram as an exploratory device, rather than as an estimate of a density.
+##' @name dhist
+##' @title Diagonally Cut Histogram
+##' @param x is a numeric vector (the data)
+##' @param a is the scaling factor, default is 5 * IQR
+##' @param nbins is the number of bins, default is assigned by the Stuges method
+##' @param rx is the range used for the left of the left-most bin to the right of the right-most bin
+##' @param eps used to set artificial bound on min width / max height of bins as described in Denby and Mallows (2009) on page 24.
+##' @param xlab is label for the x axis
+##' @param plot = TRUE produces the plot, FALSE returns the heights, breaks and counts
+##' @param lab.spikes = TRUE labels the \% of data in the spikes
+##' @return list with two elements, heights of length n and breaks of length n+1 indicating the heights and break points of the histogram bars.
+##' @author Lorraine Denby, Colin Mallows
+##' @references Lorraine Denby, Colin Mallows. Journal of Computational and Graphical Statistics. March 1, 2009, 18(1): 21-31. doi:10.1198/jcgs.2009.0002.
+dhist <- function(x, a=5*iqr(x),
+                nbins=nclass.Sturges(x), rx = range(x,na.rm = TRUE),
+                eps=.15, xlab = "x", plot = TRUE,lab.spikes = TRUE)
+{
+
+  if(is.character(nbins))
+    nbins <- switch(casefold(nbins),
+                    sturges = nclass.Sturges(x),
+                    fd = nclass.FD(x),
+                    scott = nclass.scott(x),
+                    stop("Nclass method not recognized"))
+  else if(is.function(nbins))
+    nbins <- nbins(x)
+
+  x <- sort(x[!is.na(x)])
+  if(a == 0)
+    a <- diff(range(x))/100000000
+  if(a != 0 & a != Inf) {
+    n <- length(x)
+    h <- (rx[2] + a - rx[1])/nbins
+    ybr <- rx[1] + h * (0:nbins)
+    yupper <- x + (a * (1:n))/n
+                                        # upper and lower corners in the ecdf
+    ylower <- yupper - a/n
+                                        #
+    cmtx <- cbind(cut(yupper, breaks = ybr), cut(yupper, breaks =
+                                ybr, left.include = TRUE), cut(ylower, breaks = ybr),
+                  cut(ylower, breaks = ybr, left.include = TRUE))
+    cmtx[1, 3] <- cmtx[1, 4] <- 1
+                                        # to replace NAs when default r is used
+    cmtx[n, 1] <- cmtx[n, 2] <- nbins
+                                        #
+                                        #checksum <- apply(cmtx, 1, sum) %% 4
+    checksum <- (cmtx[, 1] + cmtx[, 2] + cmtx[, 3] + cmtx[, 4]) %%
+    4
+                                        # will be 2 for obs. that straddle two bins
+    straddlers <- (1:n)[checksum == 2]
+                                        # to allow for zero counts
+    if(length(straddlers) > 0) {
+      counts <- table(c(1:nbins, cmtx[ - straddlers, 1]))
+    } else {
+      counts <- table(c(1:nbins, cmtx[, 1]))
+    }
+    counts <- counts - 1
+                                        #
+    if(length(straddlers) > 0) {
+      for(i in straddlers) {
+        binno <- cmtx[i, 1]
+        theta <- ((yupper[i] - ybr[binno]) * n)/a
+        counts[binno - 1] <- counts[binno - 1] + (
+                                                  1 - theta)
+        counts[binno] <- counts[binno] + theta
+      }
+    }
+    xbr <- ybr
+    xbr[-1] <- ybr[-1] - (a * cumsum(counts))/n
+    spike<-eps*diff(rx)/nbins
+    flag.vec<-c(diff(xbr)<spike,F)
+    if ( sum(abs(diff(xbr))<=spike) >1) {
+      xbr.new<-xbr
+      counts.new<-counts
+      diff.xbr<-abs(diff(xbr))
+      amt.spike<-diff.xbr[length(diff.xbr)]
+      for (i in rev(2:length(diff.xbr))) {
+        if (diff.xbr[i-1] <= spike&diff.xbr[i] <= spike &
+            !is.na(diff.xbr[i])) {
+          amt.spike <- amt.spike+diff.xbr[i-1]
+          counts.new[i-1] <- counts.new[i-1]+counts.new[i]
+          xbr.new[i] <- NA
+          counts.new[i] <- NA
+          flag.vec[i-1] <- T
+        }
+        else amt.spike<-diff.xbr[i-1]
+      }
+      flag.vec<-flag.vec[!is.na(xbr.new)]
+      flag.vec<-flag.vec[-length(flag.vec)]
+      counts<-counts.new[!is.na(counts.new)]
+      xbr<-xbr.new[!is.na(xbr.new)]
+
+    }
+    else flag.vec<-flag.vec[-length(flag.vec)]
+    widths <- abs(diff(xbr))
+    ## N.B. argument "widths" in barplot must be xbr
+    heights <- counts/widths
+  }
+  bin.size <- length(x)/nbins
+  cut.pt <- unique(c(min(x) - abs(min(x))/1000,
+                     approx(seq(length(x)), x, (1:(nbins - 1)) * bin.size, rule = 2)$y, max(x)))
+  aa <- hist(x, breaks = cut.pt, plot = FALSE, probability = TRUE)
+  if(a == Inf) {
+    heights <- aa$counts
+    xbr <- aa$breaks
+  }
+  amt.height<-3
+  q75<-quantile(heights,.75)
+  if (sum(flag.vec)!=0) {
+    amt<-max(heights[!flag.vec])
+    ylim.height<-amt*amt.height
+    ind.h<-flag.vec&heights> ylim.height
+    flag.vec[heights<ylim.height*(amt.height-1)/amt.height]<-F
+    heights[ind.h] <- ylim.height
+  }
+  amt.txt<-0
+  end.y<-(-10000)
+  if(plot) {
+    barplot(heights, abs(diff(xbr)), space = 0, density = -1, xlab =
+            xlab, plot = TRUE, xaxt = "n",yaxt='n')
+    at <- pretty(xbr)
+    axis(1, at = at - xbr[1], labels = as.character(at))
+    if (lab.spikes) {
+      if (sum(flag.vec)>=1) {
+        usr<-par('usr')
+        for ( i in seq(length(xbr)-1)) {
+          if (!flag.vec[i]) {
+            amt.txt<-0
+            if (xbr[i]-xbr[1]<end.y) amt.txt<-1
+          }
+          else {
+            amt.txt<-amt.txt+1
+            end.y<-xbr[i]-xbr[1]+3*par('cxy')[1]
+          }
+          if (flag.vec[i]) {
+            txt<-paste(' ',format(round(counts[i]/
+                                        sum(counts)*100)),'%',sep='')
+            par(xpd = TRUE)
+            text(xbr[i+1]-xbr[1],ylim.height-par('cxy')[2]*(amt.txt-1),txt, adj=0)
+          }}
+      }
+      else print('no spikes or more than one spike')
+    }
+    invisible(list(heights = heights, xbr = xbr))
+  }
+  else {
+    return(list(heights = heights, xbr = xbr,counts=counts))
+  }
+}
+#==================================================================================================#
+
+
+#--------------------------------------------------------------------------------------------------#
+##' Calculate interquartile range
+##'
+##' Calculates the 25th and 75th quantiles given a vector x; used in function \link{dhist}.
+##' @name iqr
+##' @title Interquartile range
+##' @param x vector
+##' @return numeric vector of length 2, with the 25th and 75th quantiles of input vector x.
+iqr <- function(x){
+  return(diff(quantile(x, c(0.25, 0.75), na.rm = TRUE)))
+}
+##==================================================================================================#
+
+##--------------------------------------------------------------------------------------------------#
+##' Creates empty ggplot object
+##'
+##' An empty base plot to which layers created by other functions
+##' (\code{\link{plot.data}}, \code{\link{plot.prior.density}},
+##' \code{\link{plot.posterior.density}}) can be added.
+##' @name create.base.plot
+##' @title Create Base Plot
+##' @return empty ggplot object
+##' @export
+##' @author David LeBauer
+create.base.plot <- function() {
+  base.plot <- ggplot()
+  return(base.plot)
+}
+#==================================================================================================#
+
+
+
+
+##--------------------------------------------------------------------------------------------------#
+##' Add data to an existing plot or create a new one from \code{\link{create.base.plot}}
+##'
+##' Used to add raw data or summary statistics to the plot of a distribution.
+##' The height of Y is arbitrary, and can be set to optimize visualization.
+##' If SE estimates are available, tehse wil be plotted
+##' @name plot.data
+##' @title Add data to plot
+##' @param trait.data data to be plotted
+##' @param base.plot a ggplot object (grob),
+##' created by \code{\link{create.base.plot}} if none provided
+##' @param ymax maximum height of y
+##' @seealso \code{\link{create.base.plot}}
+##' @return updated plot object
+##' @author David LeBauer
+##' @export
+##' @examples
+##' \dontrun{plot.data(data.frame(Y = c(1, 2), se = c(1,2)), base.plot = NULL, ymax = 10)}
+plot.data <- function(trait.data, base.plot = NULL, ymax, color = 'black') {
+  if(is.null(base.plot)) base.plot <- create.base.plot()
+  n.pts <- nrow(trait.data)
+  if(n.pts == 1){
+    ymax <- ymax/8
+  } else if (n.pts < 5) {
+    ymax <- ymax / 4
+  } else {
+    ymax <- ymax / 2
+  }
+  y.pts <- seq(0, ymax, length.out = 1 + n.pts)[-1]
+  plot.data <- data.frame(x = trait.data$Y,
+                          y = y.pts,
+                          se = trait.data$se,
+                          control = !trait.data$trt == 1 & trait.data$ghs == 1)
+  new.plot <- base.plot +
+    geom_point(data = plot.data,
+               aes(x = x, y = y,
+               color = control)) +
+                 geom_segment(data = plot.data,
+                              aes(x = x - se, y = y, xend = x + se, yend = y,
+                                  color = control)) +
+                                    scale_color_manual(values = c('black', 'grey')) +
+                                      opts(legend_position = "none")
+  return(new.plot)
+}
+##==================================================================================================#
+
+
+#--------------------------------------------------------------------------------------------------#
+##' Add borders to .. content for \description{} (no empty lines) ..
+##'
+##' Has ggplot2 display only specified borders, e.g. ("L"-shaped) borders, rather than a rectangle or no border. Note that the order can be significant; for example, if you specify the L border option and then a theme, the theme settings will override the border option, so you need to specify the theme (if any) before the border option, as above.
+##' @name theme_border
+##' @title Theme border for plot
+##' @param type
+##' @param colour
+##' @param size
+##' @param linetype
+##' @return adds borders to ggplot as a side effect
+##' @author Rudolf Cardinal
+##' @author \url{ggplot2 google group}{https://groups.google.com/forum/?fromgroups#!topic/ggplot2/-ZjRE2OL8lE}
+##' @examples
+##' \dontrun{
+##' df = data.frame( x=c(1,2,3), y=c(4,5,6) )
+##' ggplot(data=df, aes(x=x, y=y)) + geom_point() + theme_bw() +
+##' opts(panel.border = theme_border(c("bottom","left")) )
+##' ggplot(data=df, aes(x=x, y=y)) + geom_point() + theme_bw() +
+##' opts(panel.border = theme_border(c("b","l")) )
+##' }
+theme_border <- function(type = c("left", "right", "bottom", "top",
+                           "none"), colour = "black", size = 1, linetype = 1) {
+  type <- match.arg(type, several.ok=TRUE)
+  structure(
+            function(x = 0, y = 0, width = 1, height = 1, ...) {
+              xlist <- c()
+              ylist <- c()
+              idlist <- c()
+              if ("bottom" %in% type) { # bottom
+                xlist <- append(xlist, c(x, x+width))
+                ylist <- append(ylist, c(y, y))
+                idlist <- append(idlist, c(1,1))
+              }
+              if ("top" %in% type) { # top
+                xlist <- append(xlist, c(x, x+width))
+                ylist <- append(ylist, c(y+height, y+height))
+                idlist <- append(idlist, c(2,2))
+              }
+              if ("left" %in% type) { # left
+                xlist <- append(xlist, c(x, x))
+                ylist <- append(ylist, c(y, y+height))
+                idlist <- append(idlist, c(3,3))
+              }
+              if ("right" %in% type) { # right
+                xlist <- append(xlist, c(x+width, x+width))
+                ylist <- append(ylist, c(y, y+height))
+                idlist <- append(idlist, c(4,4))
+              }
+              polylineGrob(
+                           x=xlist, y=ylist, id=idlist, ..., default.units = "npc",
+                           gp=gpar(lwd=size, col=colour, lty=linetype),
+                           )
+            },
+            class = "theme",
+            type = "box",
+            call = match.call()
+            )
+}
+#==================================================================================================#
+
+
+####################################################################################################
+### EOF. End of R script file.                         
+####################################################################################################
index 92fe61b..991060e 100644 (file)
@@ -3,15 +3,55 @@
 # Can be called from the bash script with the following code:
 # export R_INPUT=$inputfile
 # export R_OUTPUT=$outputfile
+# export R_TYPE=$hist_type
+
 # R CMD BATCH $this_script.R
+#or
+# Rscript $this_script.R
 
 # Use functions from bench.h to benchmark execution time of the desired block,
 # then Rhist.R script to read all timings and produce histograms
 # and finally inject.h to inject values instead of executing block
 
+# This is a small function to help merging empty nbins for dhist histograms
+merge_empty_bins <- function (h)
+{
+  i<-1
+  j<-1
+  counts2<--1
+  breaks2<-h$breaks[1]
+
+  if (length(h$counts)>1)
+    for(i in 1:(length(h$counts)-1))
+      {
+        if(h$counts[i]!=0 || h$counts[i+1]!=0)
+          {
+            counts2[j]<-h$counts[i]
+            breaks2[j+1]<-h$breaks[i+1];
+            j<-j+1
+          }
+      }
   
+  counts2[j]<-h$counts[length(h$counts)]
+  breaks2[j+1]<-h$breaks[length(h$breaks)]
+
+  h$counts<-counts2
+  h$breaks<-breaks2
+
+  return (h)
+}
+
+# Main
+source("analysis/hist_script/Rdhist.R")
+
 inputfile<-Sys.getenv("R_INPUT")
 outputfile<-Sys.getenv("R_OUTPUT")
+type<-Sys.getenv("R_TYPE")
+
+if (!(type %in% c("mean","default","sturges","scott")))
+  {
+    stop("Wrong histogram type")
+  }
 
 df<-read.table(inputfile,header=F)
 df<-df[,c(1,4)]
@@ -21,17 +61,49 @@ attach(df)
 for(i in unique(NAME))
 {
   vector1<-df[NAME==i,2]
-  h<-hist(vector1)
-  
+
+  if (length(vector1)==1)
+    {
+      #If there is only one element
+      h<-hist(vector1) # Just for R compatibility reasons
+      h$breaks<-c(vector1,vector1)
+      h$counts<-1
+    }
+  else
+    {
+      if (type=="mean")
+        {
+          #Mean value only
+          h<-hist(vector1) # Just for R compatibility reasons
+          h$breaks<-c(mean(vector1),mean(vector1))
+          h$counts<-length(vector1)
+        }
+      else
+        if (type=="default")
+          #Standard HISTOGRAM:
+          h<-hist(vector1)
+        else
+          {
+            #Dhist:
+            h<-dhist(vector1,nbins=type, plot = FALSE, lab.spikes = FALSE, a=5*iqr(vector1), eps=0.15)
+            h$breaks<-h$xbr
+            h$count<-as.vector(h$counts)
+            h$counts<-h$count
+            h<-merge_empty_bins(h)
+          }
+    }
+    
   cat(i, file = outputfile, sep = "\t", append = TRUE)
-  cat("  ", file = outputfile, sep = "\t", append = TRUE)
-  cat(sprintf("%.8f", mean(vector1)), file =outputfile, sep = "\t ", append = TRUE)
+  cat("\t", file = outputfile,  append = TRUE)
+  cat(sum(h$counts), file =outputfile, sep = "\t", append = TRUE)
+  cat("\t", file = outputfile,  append = TRUE)
+  cat(sprintf("%.8f", mean(vector1)), file =outputfile, sep = "\t", append = TRUE)
   cat("\t", file = outputfile,  append = TRUE)
   cat(length(h$breaks), file = outputfile, append = TRUE)
   cat("\t", file = outputfile,  append = TRUE)
-  cat(sprintf("%.8f", h$breaks), file = outputfile, sep = " \t", append = TRUE)
+  cat(sprintf("%.8f", h$breaks), file = outputfile, sep = "\t", append = TRUE)
   cat("\t", file = outputfile,  append = TRUE)
   h$density = h$counts/sum(h$counts)
-  cat(sprintf("%.14f", h$density), file = outputfile, sep = " \t", append = TRUE)
+  cat(sprintf("%.8f", h$density), file = outputfile, sep = "\t", append = TRUE)
   cat("\n", file = outputfile,  append = TRUE)
 }
diff --git a/contrib/benchmarking_code_block/Rplot_hist.R b/contrib/benchmarking_code_block/Rplot_hist.R
new file mode 100644 (file)
index 0000000..1f7487a
--- /dev/null
@@ -0,0 +1,72 @@
+# R script showing .pdf file with plots of all injection histograms for a certain file
+
+# Can be called from the command line with:
+# Rscript $this_script.R inputfile
+
+# Necessary libraries
+library(plyr)
+library(ggplot2)
+library(data.table)
+library(grid)
+
+# Functions for arranging multiple plots
+vp.layout <- function(x, y) viewport(layout.pos.row=x, layout.pos.col=y)
+arrange_ggplot2 <- function(list, nrow=NULL, ncol=NULL, as.table=FALSE) {
+n <- length(list)
+if(is.null(nrow) & is.null(ncol)) { nrow = floor(n/2) ; ncol = ceiling(n/nrow)}
+if(is.null(nrow)) { nrow = ceiling(n/ncol)}
+if(is.null(ncol)) { ncol = ceiling(n/nrow)}
+## NOTE see n2mfrow in grDevices for possible alternative
+grid.newpage()
+pushViewport(viewport(layout=grid.layout(nrow,ncol) ) )
+ii.p <- 1
+for(ii.row in seq(1, nrow)){
+ii.table.row <- ii.row
+if(as.table) {ii.table.row <- nrow - ii.table.row + 1}
+for(ii.col in seq(1, ncol)){
+ii.table <- ii.p
+if(ii.p > n) break
+print(list[[ii.table]], vp=vp.layout(ii.table.row, ii.col))
+ii.p <- ii.p + 1
+}
+}
+}
+
+### Main
+
+# Reading command line argument with the input file path
+args <- commandArgs(trailingOnly = TRUE)
+fp  <- file(args[1], open = "r")
+
+plots<-list()
+i<-1
+
+# Reading histograms one by one, line by line
+while (length(oneLine <- readLines(fp, n = 1, warn = FALSE)) > 0)
+{ myVector <- (strsplit(oneLine, "\t")) 
+  
+  dfl <- ldply (myVector, data.frame)
+
+  name<-as.character(dfl[1,])
+  nbins<-as.numeric(as.character(dfl[4,]))
+  allbreaks<-as.numeric(as.character(dfl[5:(5+nbins-1),]))
+  
+  dh<-data.frame(Name=as.character(dfl[1,]), Total=as.numeric(as.character(dfl[2,])), Mean=as.numeric(as.character(dfl[3,])), Nbins=as.numeric(as.character(dfl[4,])))
+  dh<-cbind(dh,Bstart=allbreaks[-length(allbreaks)])
+  dh<-cbind(dh,Bend=allbreaks[-1])
+  dh<-cbind(dh,Density=as.numeric(as.character(dfl[(5+nbins):(5+nbins*2-2),])))
+
+  # Plotting single histogram, if it only has one value then use geom_bar
+  if (nbins > 2)
+    plots[[i]]<-ggplot(data=data.frame(dh), aes(xmin=Bstart, xmax=Bend, ymin=0, ymax=Density)) + geom_rect(aes(fill=Density)) + theme_bw() + scale_x_continuous("Time [s]", allbreaks) + labs(title=name, y=element_text("Density %"))
+  else
+    plots[[i]]<-ggplot(data=data.frame(dh), aes(factor(Bstart))) + geom_bar(aes(fill=Density)) + theme_bw() + labs(title=name, y=element_text("Density %"), x=element_text("Time [s]"))
+
+  i<-i+1
+}
+
+# Printing all plots together in a table
+arrange_ggplot2(plots, as.table=TRUE)
+
+# End
+write("Done producing a histogram plot. Open Rplots.pdf located in this folder to see the results", stdout())
index f4d9fa2..57e2c82 100644 (file)
 #include "xbt/dict.h"
 #include "xbt/sysdep.h"
 
-#define MAX_LINE_INJ 1000
+#define MAX_LINE_INJ 10000
 
 /*
  * Histogram entry for each measured block
  * Each entry is guarded inside xbt dictionary which is read from the file */
 typedef struct xbt_hist {
        int n;
+       int counts;
        double mean;
        double *breaks;
        double *percentage;
@@ -68,7 +69,7 @@ static inline void xbt_inject_init(char *inputfile)
                printf("Error input file is empty!");//Skipping first row
        while (fgets(line, 200, fpInput) != NULL)
        {
-               key = strtok(line, " \t");
+               key = strtok(line, "\t");
 
                data = xbt_dict_get_or_null(mydict, key);
                if (data)
@@ -77,15 +78,16 @@ static inline void xbt_inject_init(char *inputfile)
                data = (xbt_hist_t *) xbt_new(xbt_hist_t, 1);
 
                data->block_id = key;
-               data->mean = atof(strtok(NULL, " \t"));
-               data->n = atoi(strtok(NULL, " \t"));
+               data->counts = atoi(strtok(NULL, "\t"));
+               data->mean = atof(strtok(NULL, "\t"));
+               data->n = atoi(strtok(NULL, "\t"));
 
                data->breaks = (double*) malloc(sizeof(double) * data->n);
                data->percentage = (double*) malloc(sizeof(double) * (data->n - 1));
                for (i = 0; i < data->n; i++)
-                       data->breaks[i] = atof(strtok(NULL, " \t"));
+                       data->breaks[i] = atof(strtok(NULL, "\t"));
                for (i = 0; i < (data->n - 1); i++)
-                       data->percentage[i] = atof(strtok(NULL, " \t"));
+                       data->percentage[i] = atof(strtok(NULL, "\t"));
 
                xbt_dict_set(mydict, key, data, NULL);
        }
@@ -103,7 +105,10 @@ static inline void inject_init_starpu(char *inputfile, xbt_dict_t *dict, RngStre
        mydict = *dict;
        FILE* fpInput = fopen(inputfile, "r");
        if (fpInput == NULL)
+       {
                printf("Error while opening the inputfile");
+               return;
+       }
 
        fseek(fpInput, 0, 0);
 
@@ -113,12 +118,15 @@ static inline void inject_init_starpu(char *inputfile, xbt_dict_t *dict, RngStre
        xbt_hist_t* data;
 
        if (fgets(line, MAX_LINE_INJ, fpInput) == NULL)
+       {
                printf("Error input file is empty!");//Skipping first row
+               return;
+       }
 
 
        while (fgets(line, MAX_LINE_INJ, fpInput) != NULL)
        {
-               key = strtok(line, " \t");
+               key = strtok(line, "\t");
 
                data = xbt_dict_get_or_null(mydict, key);
                if (data)
@@ -126,16 +134,17 @@ static inline void inject_init_starpu(char *inputfile, xbt_dict_t *dict, RngStre
 
                data = (xbt_hist_t *) xbt_new(xbt_hist_t, 1);
                data->block_id = key;
-               data->mean = atof(strtok(NULL, " \t"));
-               data->n = atoi(strtok(NULL, " \t"));
+               data->counts = atoi(strtok(NULL, "\t"));
+               data->mean = atof(strtok(NULL, "\t"));
+               data->n = atoi(strtok(NULL, "\t"));
                data->breaks = (double*) malloc(sizeof(double) * data->n);
                data->percentage = (double*) malloc(sizeof(double) * (data->n - 1));
 
                for (i = 0; i < data->n; i++)
-                       data->breaks[i] = atof(strtok(NULL, " \t"));
+                       data->breaks[i] = atof(strtok(NULL, "\t"));
                        for (i = 0; i < (data->n - 1); i++)
                        {
-                               data->percentage[i] = atof(strtok(NULL, " \t"));
+                               data->percentage[i] = atof(strtok(NULL, "\t"));
                        }
 
                xbt_dict_set(mydict, key, data, NULL);
index 7e3733f..e4aed28 100644 (file)
@@ -3,9 +3,8 @@
   \section SURF_doc Surf documentation
    Surf is composed several components:
    - \ref SURF_simulation
-   - \ref SURF_actions
-   - \ref SURF_resources
    - \ref SURF_build_api
+   - \ref SURF_c_bindings
    - \ref SURF_interface
    - \ref SURF_routing_interface
    - \ref SURF_cpu_interface
@@ -13,6 +12,7 @@
    - \ref SURF_storage_interface
    - \ref SURF_workstation_interface
    - \ref SURF_vm_workstation_interface
+   - \ref SURF_lmm
    - \ref SURF_callbacks
    - \ref SURF_plugin_energy
    
 */
 
 /**
-@defgroup SURF_routing_interface   SURF Routing Interface
+@defgroup SURF_interface   SURF Interface
 @ingroup SURF_API
-@brief Describes the routing interface
+@brief Describes the general interface for all components (Cpu, Network, Storage, Workstation, WorkstationVM)
 
-@htmlonly <!-- DOXYGEN_NAVBAR_LABEL="Surf Routing" --> @endhtmlonly
+@htmlonly <!-- DOXYGEN_NAVBAR_LABEL="Surf Interface" --> @endhtmlonly
 */
 
 /**
-@defgroup SURF_interface   SURF Interface
+@defgroup SURF_routing_interface   SURF Routing Interface
 @ingroup SURF_API
-@brief Describes the general interface for all components (Cpu, Network, Storage, Workstation, WorkstationVM)
+@brief Describes the routing interface
 
-@htmlonly <!-- DOXYGEN_NAVBAR_LABEL="Surf Interface" --> @endhtmlonly
+@htmlonly <!-- DOXYGEN_NAVBAR_LABEL="Surf Routing" --> @endhtmlonly
 */
 
 /**
 @brief Describes how to use the energy plugin.
 
 @htmlonly <!-- DOXYGEN_NAVBAR_LABEL="Energy plugin" --> @endhtmlonly
-*/
\ No newline at end of file
+*/
index b9ab520..b70680d 100644 (file)
@@ -391,7 +391,7 @@ stacks), leading to segfaults with corrupted stack traces.
 
 If you want to push the scalability limits of your code, you really
 want to reduce the \b contexts/stack_size item. Its default value
-is 128 (in KiB), while our Chord simulation works with stacks as small
+is 8192 (in KiB), while our Chord simulation works with stacks as small
 as 16 KiB, for example. For the thread factory, the default value 
 is the one of the system, if it is too large/small, it has to be set 
 with this parameter.
index 5c3ae9e..e06e223 100644 (file)
@@ -366,7 +366,7 @@ the router name is defined as the resulting String in the following
 java line of code: 
 
 @verbatim
-router_name = prefix + clusterId + router_ + suffix;
+router_name = prefix + clusterId + _router + suffix;
 @endverbatim
 
 
@@ -383,11 +383,11 @@ The second examples creates one router and 100 machines, which names
 are the following:
 \verbatim
 c-my_cluster_1_router.me
-c-0.my_cluster_1.me
-c-1.my_cluster_1.me
-c-2.my_cluster_1.me
+c-0.me
+c-1.me
+c-2.me
 ...
-c-99.my_cluster_1.me
+c-99.me
 \endverbatim
 
 \subsubsection pf_peer peer
@@ -637,8 +637,9 @@ the tool you use for rendering your simulation, for example.
 \li <b>id (mandatory)</b>: the identifier of the storage to be used
     when referring to it. 
 \li <b>typeId (mandatory)</b>: the identifier of the storage_type that
-    this storage  belongs to. 
-
+    this storage belongs to. 
+\li <b>attach (mandatory)</b>: the host (name) to which the storage is 
+       attached to.
 
 \subsubsection pf_sto_mo mount
 
index 10fd6c5..6ce5a54 100644 (file)
@@ -419,10 +419,9 @@ public class Peer extends Process {
                        return;
                }
                if (true || pieces < 3) {
-                       int i = 0, peerPiece;
+                       int peerPiece;
                        do {
                                currentPiece = stream.randInt(0,Common.FILE_PIECES - 1);
-                               i++;
                        } while (!(bitfield[currentPiece] == '0' && !currentPieces.contains(currentPiece)));
                }
                else {
diff --git a/examples/java/surfPlugin/CMakeLists.txt b/examples/java/surfPlugin/CMakeLists.txt
new file mode 100644 (file)
index 0000000..2773890
--- /dev/null
@@ -0,0 +1,47 @@
+cmake_minimum_required(VERSION 2.6)
+
+set(example java_surf_plugin)
+set(sources
+   ${CMAKE_CURRENT_SOURCE_DIR}/TestPlugin.java
+   ${CMAKE_CURRENT_SOURCE_DIR}/TracePlugin.java
+   ${CMAKE_CURRENT_SOURCE_DIR}/Sender.java
+   ${CMAKE_CURRENT_SOURCE_DIR}/Receiver.java
+  )
+
+if(enable_java)
+  add_custom_command(
+    COMMENT "Building ${example}..."
+    OUTPUT ${example}_compiled
+    DEPENDS ${sources} simgrid-java_jar ${SIMGRID_JAR}
+    COMMAND ${JAVA_COMPILE} -classpath ${SIMGRID_JAR}
+                             -d ${CMAKE_CURRENT_BINARY_DIR}/.. ${sources}
+    COMMAND ${CMAKE_COMMAND} -E remove ${example}_compiled
+    COMMAND ${CMAKE_COMMAND} -E touch ${example}_compiled
+  )
+  add_custom_target(${example} ALL DEPENDS ${example}_compiled)
+endif()
+
+set(tesh_files
+  ${tesh_files}
+  ${CMAKE_CURRENT_SOURCE_DIR}/surf_plugin.tesh
+  PARENT_SCOPE
+  )
+set(xml_files
+  ${xml_files}
+  ${CMAKE_CURRENT_SOURCE_DIR}/surfPluginPlatform.xml
+  ${CMAKE_CURRENT_SOURCE_DIR}/surfPluginDeployment.xml  
+  PARENT_SCOPE
+  )
+set(examples_src
+  ${examples_src}
+  ${sources}
+  PARENT_SCOPE
+  )
+set(bin_files
+  ${bin_files}
+  PARENT_SCOPE
+  )
+set(txt_files
+  ${txt_files}
+  PARENT_SCOPE
+  )
diff --git a/examples/java/surfPlugin/Receiver.java b/examples/java/surfPlugin/Receiver.java
new file mode 100644 (file)
index 0000000..8d8158f
--- /dev/null
@@ -0,0 +1,36 @@
+/* Copyright (c) 2006-2014. The SimGrid Team.
+ * All rights reserved.                                                     */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+package surfPlugin;
+import org.simgrid.msg.Host;
+import org.simgrid.msg.Msg;
+import org.simgrid.msg.MsgException;
+import org.simgrid.msg.Task;
+import org.simgrid.msg.Process;
+
+public class Receiver extends Process {
+   public Receiver(Host host, String name, String[]args) {
+               super(host,name,args);
+   } 
+   final double commSizeLat = 1;
+   final double commSizeBw = 100000000;
+    
+   public void main(String[] args) throws MsgException {
+        
+      Msg.info("helloo!");
+      double communicationTime=0;
+
+      Msg.info("try to get a task");
+        
+      Task task = Task.receive(getHost().getName());
+      double timeGot = Msg.getClock();
+            
+      Msg.info("Got at time "+ timeGot);
+      task.execute();
+       
+      Msg.info("goodbye!");
+    }
+}
diff --git a/examples/java/surfPlugin/Sender.java b/examples/java/surfPlugin/Sender.java
new file mode 100644 (file)
index 0000000..2f4a382
--- /dev/null
@@ -0,0 +1,55 @@
+/* Copyright (c) 2006-2014. The SimGrid Team.
+ * All rights reserved.                                                     */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+package surfPlugin;
+import org.simgrid.msg.Host;
+import org.simgrid.msg.HostNotFoundException;
+import org.simgrid.msg.Msg;
+import org.simgrid.msg.MsgException;
+import org.simgrid.msg.Process;
+import org.simgrid.msg.Task;
+
+public class Sender extends Process {
+       public Sender(Host host, String name, String[] args) {
+               super(host,name,args);
+       }
+    private final double commSizeLat = 1;
+    final double commSizeBw = 100000000;
+   
+    public void main(String[] args) throws MsgException {
+       
+       Msg.info("helloo!");
+        
+       int hostCount = args.length;
+        
+       Msg.info("host count: " + hostCount);
+       String mailboxes[] = new String[hostCount]; 
+       double time;
+       double computeDuration = 10000;
+       Task task;
+        
+       for(int pos = 0; pos < args.length ; pos++) {
+         try {
+            mailboxes[pos] = Host.getByName(args[pos]).getName();
+         } catch (HostNotFoundException e) {
+            Msg.info("Invalid deployment file: " + e.toString());           
+            System.exit(1);
+         }
+        }
+        
+        for (int pos = 0; pos < hostCount; pos++) { 
+          time = Msg.getClock(); 
+            
+          Msg.info("sender time: " + time);
+          
+          task = new Task("no name",computeDuration,commSizeLat);
+            
+          task.send(mailboxes[pos]);
+        } 
+        
+        Msg.info("goodbye!");
+    }
+}
diff --git a/examples/java/surfPlugin/TestPlugin.java b/examples/java/surfPlugin/TestPlugin.java
new file mode 100644 (file)
index 0000000..a4b334c
--- /dev/null
@@ -0,0 +1,36 @@
+/* Copyright (c) 2006-2014. The SimGrid Team.
+ * All rights reserved.                                                     */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+package surfPlugin;
+import org.simgrid.msg.Msg;
+import org.simgrid.msg.NativeException;
+import org.simgrid.surf.Surf;
+import org.simgrid.surf.Cpu;
+
+public class TestPlugin {
+
+  /* This only contains the launcher. If you do nothing more than than you can run
+  *   java simgrid.msg.Msg
+  * which also contains such a launcher
+  */
+  static TracePlugin tp = new TracePlugin();
+
+  public static void main(String[] args) throws NativeException {
+    /* initialize the MSG simulation. Must be done before anything else (even logging). */
+    Msg.init(args);
+    if(args.length < 2) {
+      Msg.info("Usage   : TestPlugin platform_file deployment_file");
+      Msg.info("example : TestPlugin ping_pong_platform.xml ping_pong_deployment.xml");
+      System.exit(1);
+    }
+
+    /* construct the platform and deploy the application */
+    Msg.createEnvironment(args[0]);
+    Msg.deployApplication(args[1]);
+    /*  execute the simulation. */
+    Msg.run();
+  }
+}
diff --git a/examples/java/surfPlugin/TracePlugin.java b/examples/java/surfPlugin/TracePlugin.java
new file mode 100644 (file)
index 0000000..6de1823
--- /dev/null
@@ -0,0 +1,53 @@
+package surfPlugin;
+
+import org.simgrid.surf.*;
+import org.simgrid.msg.Msg;
+import java.util.HashMap;
+
+public class TracePlugin extends Plugin {
+
+  public TracePlugin() {
+    activateCpuCreatedCallback();
+    activateCpuDestructedCallback();
+    activateCpuStateChangedCallback();
+    activateCpuActionStateChangedCallback();
+
+    activateNetworkLinkCreatedCallback();
+    activateNetworkLinkDestructedCallback();
+    activateNetworkLinkStateChangedCallback();
+    activateNetworkActionStateChangedCallback();
+  }
+
+  public void cpuCreatedCallback(Cpu cpu) {
+    Msg.info("Trace: Cpu created "+cpu.getName());
+  }
+
+  public void cpuDestructedCallback(Cpu cpu) {
+    Msg.info("Trace: Cpu destructed "+cpu.getName());
+  }
+
+  public void cpuStateChangedCallback(Cpu cpu){
+    Msg.info("Trace: Cpu state changed "+cpu.getName());
+  }
+
+  public void cpuActionStateChangedCallback(CpuAction action){
+    Msg.info("Trace: CpuAction state changed "+action.getModel().getName());
+  }
+
+  public void networkLinkCreatedCallback(NetworkLink link) {
+    Msg.info("Trace: NetworkLink created "+link.getName());
+  }
+
+  public void networkLinkDestructedCallback(NetworkLink link) {
+    Msg.info("Trace: NetworkLink destructed "+link.getName());
+  }
+
+  public void networkLinkStateChangedCallback(NetworkLink link){
+    Msg.info("Trace: NetworkLink state changed "+link.getName());
+  }
+
+  public void networkActionStateChangedCallback(NetworkAction action){
+    Msg.info("Trace: NetworkAction state changed "+action.getModel().getName());
+  }
+
+}
diff --git a/examples/java/surfPlugin/surfPluginDeployment.xml b/examples/java/surfPlugin/surfPluginDeployment.xml
new file mode 100644 (file)
index 0000000..9101480
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version='1.0'?>
+<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
+<platform version="3">
+  <process host="Jacquelin" function="surfPlugin.Sender">
+      <argument value="Boivin"/>
+  </process>
+<process host="Boivin" function="surfPlugin.Receiver"/>
+</platform>
diff --git a/examples/java/surfPlugin/surfPluginPlatform.xml b/examples/java/surfPlugin/surfPluginPlatform.xml
new file mode 100644 (file)
index 0000000..be9a6e1
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version='1.0'?>
+ <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
+ <platform version="3">
+ <AS  id="AS0"  routing="Full">
+   <host id="Jacquelin" power="137.333Mf"/>
+   <host id="Boivin" power="98.095Mf"/>
+   <link id="link" bandwidth="1MBps" latency="100ms"/>
+   <route src="Jacquelin" dst="Boivin">
+     <link_ctn id="link"/>
+   </route>
+ </AS>
+ </platform>
diff --git a/examples/java/surfPlugin/surf_plugin.tesh b/examples/java/surfPlugin/surf_plugin.tesh
new file mode 100644 (file)
index 0000000..a369378
--- /dev/null
@@ -0,0 +1,27 @@
+#! tesh
+
+$ java -classpath ${classpath:=.} surfPlugin/TestPlugin ${srcdir:=.}/surfPlugin/surfPluginPlatform.xml ${srcdir:=.}/surfPlugin/surfPluginDeployment.xml
+> [0.000000] [jmsg/INFO] Using regular java threads. Coroutines could speed your simulation up.
+> [0.000000] [jmsg/INFO] Trace: NetworkLink created __loopback__
+> [0.000000] [jmsg/INFO] Trace: NetworkLink state changed __loopback__
+> [0.000000] [jmsg/INFO] Trace: Cpu created Jacquelin
+> [0.000000] [jmsg/INFO] Trace: Cpu state changed Jacquelin
+> [0.000000] [jmsg/INFO] Trace: Cpu created Boivin
+> [0.000000] [jmsg/INFO] Trace: Cpu state changed Boivin
+> [0.000000] [jmsg/INFO] Trace: NetworkLink created link
+> [0.000000] [jmsg/INFO] Trace: NetworkLink state changed link
+> [Jacquelin:surfPlugin.Sender:(1) 0.000000] [jmsg/INFO] helloo!
+> [Jacquelin:surfPlugin.Sender:(1) 0.000000] [jmsg/INFO] host count: 1
+> [Jacquelin:surfPlugin.Sender:(1) 0.000000] [jmsg/INFO] sender time: 0.0
+> [Boivin:surfPlugin.Receiver:(2) 0.000000] [jmsg/INFO] helloo!
+> [Boivin:surfPlugin.Receiver:(2) 0.000000] [jmsg/INFO] try to get a task
+> [1.301001] [jmsg/INFO] Trace: NetworkAction state changed network
+> [Boivin:surfPlugin.Receiver:(2) 1.301001] [jmsg/INFO] Got at time 1.3010010824742269
+> [Jacquelin:surfPlugin.Sender:(1) 1.301001] [jmsg/INFO] goodbye!
+> [1.301103] [jmsg/INFO] Trace: CpuAction state changed cpu
+> [Boivin:surfPlugin.Receiver:(2) 1.301103] [jmsg/INFO] goodbye!
+> [1.301103] [jmsg/INFO] MSG_main finished; Cleaning up the simulation...
+> [1.301103] [jmsg/INFO] Trace: Cpu destructed Jacquelin
+> [1.301103] [jmsg/INFO] Trace: Cpu destructed Boivin
+> [1.301103] [jmsg/INFO] Trace: NetworkLink destructed link
+> [1.301103] [jmsg/INFO] Trace: NetworkLink destructed __loopback__
index 1da705b..fdc8a30 100644 (file)
  * - <b>io/file.c</b> Example with the disk resource
  */
 
-#define FILENAME1 "./doc/simgrid/examples/platforms/g5k.xml"
-#define FILENAME2 ".\\Windows\\setupact.log"
-#define FILENAME3 "./doc/simgrid/examples/platforms/g5k_cabinets.xml"
-#define FILENAME4 "./doc/simgrid/examples/platforms/nancy.xml"
+#define FILENAME1 "/home/doc/simgrid/examples/platforms/g5k.xml"
+#define FILENAME2 "c:\\Windows\\setupact.log"
+#define FILENAME3 "/home/doc/simgrid/examples/platforms/g5k_cabinets.xml"
+#define FILENAME4 "/home/doc/simgrid/examples/platforms/nancy.xml"
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -33,38 +33,36 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(io_file,
 int host(int argc, char *argv[])
 {
   msg_file_t file = NULL;
-  char* mount = xbt_strdup("/home");
   sg_size_t read,write;
 
   if(!strcmp(MSG_process_get_name(MSG_process_self()),"0")){
-    file = MSG_file_open(mount,FILENAME1, NULL);
+    file = MSG_file_open(FILENAME1, NULL);
     MSG_file_dump(file);
   } else if(!strcmp(MSG_process_get_name(MSG_process_self()),"1")) {
-    free(mount);
-    mount = xbt_strdup("/windows");
-    file = MSG_file_open(mount,FILENAME2, NULL);
+    file = MSG_file_open(FILENAME2, NULL);
   } else if(!strcmp(MSG_process_get_name(MSG_process_self()),"2")){
-    file = MSG_file_open(mount,FILENAME3, NULL);
+    file = MSG_file_open(FILENAME3, NULL);
   } else if(!strcmp(MSG_process_get_name(MSG_process_self()),"3"))
-    file = MSG_file_open(mount,FILENAME4, NULL);
+    file = MSG_file_open(FILENAME4, NULL);
   else xbt_die("FILENAME NOT DEFINED %s",MSG_process_get_name(MSG_process_self()));
 
-  XBT_INFO("\tOpen file '%s'",file->fullname);
+  const char* filename = MSG_file_get_name(file);
+  XBT_INFO("\tOpen file '%s'",filename);
 
   read = MSG_file_read(file, 10000000);     // Read for 10MB
-  XBT_INFO("\tHave read    %llu on %s",read,file->fullname);
+  XBT_INFO("\tHave read    %llu on %s",read,filename);
 
   write = MSG_file_write(file, 100000);  // Write for 100KB
-  XBT_INFO("\tHave written %llu on %s",write,file->fullname);
+  XBT_INFO("\tHave written %llu on %s",write,filename);
 
   read = MSG_file_read(file, 110000);     // Read for 110KB
-  XBT_INFO("\tHave read    %llu on %s (of size %llu)",read,file->fullname,
+  XBT_INFO("\tHave read    %llu on %s (of size %llu)",read,filename,
       MSG_file_get_size(file));
 
-  XBT_INFO("\tClose file '%s'",file->fullname);
+  XBT_INFO("\tClose file '%s'",filename);
   MSG_file_close(file);
 
-  free(mount);
+
   return 0;
 }
 
index 49f0523..66db927 100644 (file)
@@ -15,7 +15,7 @@
  * - <b>io/file.c</b> Example with the disk resource
  */
 
-#define FILENAME1 "./doc/simgrid/examples/platforms/g5k.xml"
+#define FILENAME1 "/home/doc/simgrid/examples/platforms/g5k.xml"
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -30,59 +30,56 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(io_file,
 int host(int argc, char *argv[])
 {
   msg_file_t file = NULL;
-  char* mount = xbt_strdup("/home");
   sg_size_t write;
 
   // First open
   XBT_INFO("\tOpen file '%s'",FILENAME1);
-  file = MSG_file_open(mount,FILENAME1, NULL);
+  file = MSG_file_open(FILENAME1, NULL);
 
   // Unlink the file
-  XBT_INFO("\tUnlink file '%s'",file->fullname);
+  XBT_INFO("\tUnlink file '%s'",MSG_file_get_name(file));
   MSG_file_unlink(file);
 
   // Re Open the file wich is in fact created
   XBT_INFO("\tOpen file '%s'",FILENAME1);
-  file = MSG_file_open(mount,FILENAME1, NULL);
+  file = MSG_file_open(FILENAME1, NULL);
 
   // Write into the new file
   write = MSG_file_write(file,100000);  // Write for 100Ko
-  XBT_INFO("\tHave written %llu on %s",write,file->fullname);
+  XBT_INFO("\tHave written %llu on %s",write,MSG_file_get_name(file));
 
   // Close the file
-  XBT_INFO("\tClose file '%s'",file->fullname);
+  XBT_INFO("\tClose file '%s'",MSG_file_get_name(file));
   MSG_file_close(file);
 
-  xbt_dict_t dict_ls;
-  char* key;
-  surf_stat_t data = NULL;
-  xbt_dict_cursor_t cursor = NULL;
-
-  dict_ls = MSG_file_ls(mount,"./");
-  XBT_INFO(" ");XBT_INFO("ls ./");
-  xbt_dict_foreach(dict_ls,cursor,key,data){
-    if(data) XBT_INFO("FILE : %s",key);
-    else     XBT_INFO("DIR  : %s",key);
-  }
-  xbt_dict_free(&dict_ls);
-
-  dict_ls = MSG_file_ls(mount,"./doc/simgrid/examples/platforms/");
-  XBT_INFO(" ");XBT_INFO("ls ./doc/simgrid/examples/platforms/");
-  xbt_dict_foreach(dict_ls,cursor,key,data){
-    if(data) XBT_INFO("FILE : %s",key);
-    else     XBT_INFO("DIR  : %s",key);
-  }
-  xbt_dict_free(&dict_ls);
-
-  dict_ls = MSG_file_ls(mount,"./doc/simgrid/examples/msg/");
-  XBT_INFO(" ");XBT_INFO("ls ./doc/simgrid/examples/msg/");
-  xbt_dict_foreach(dict_ls,cursor,key,data){
-    if(data) XBT_INFO("FILE : %s",key);
-    else     XBT_INFO("DIR  : %s",key);
-  }
-  xbt_dict_free(&dict_ls);
-
-  free(mount);
+//  xbt_dict_t dict_ls;
+//  char* key;
+//  surf_stat_t data = NULL;
+//  xbt_dict_cursor_t cursor = NULL;
+//
+//  dict_ls = MSG_file_ls(mount,"./");
+//  XBT_INFO(" ");XBT_INFO("ls ./");
+//  xbt_dict_foreach(dict_ls,cursor,key,data){
+//    if(data) XBT_INFO("FILE : %s",key);
+//    else     XBT_INFO("DIR  : %s",key);
+//  }
+//  xbt_dict_free(&dict_ls);
+//
+//  dict_ls = MSG_file_ls(mount,"./doc/simgrid/examples/platforms/");
+//  XBT_INFO(" ");XBT_INFO("ls ./doc/simgrid/examples/platforms/");
+//  xbt_dict_foreach(dict_ls,cursor,key,data){
+//    if(data) XBT_INFO("FILE : %s",key);
+//    else     XBT_INFO("DIR  : %s",key);
+//  }
+//  xbt_dict_free(&dict_ls);
+//
+//  dict_ls = MSG_file_ls(mount,"./doc/simgrid/examples/msg/");
+//  XBT_INFO(" ");XBT_INFO("ls ./doc/simgrid/examples/msg/");
+//  xbt_dict_foreach(dict_ls,cursor,key,data){
+//    if(data) XBT_INFO("FILE : %s",key);
+//    else     XBT_INFO("DIR  : %s",key);
+//  }
+//  xbt_dict_free(&dict_ls);
 
   return 0;
 }
index e612c10..9013c6e 100644 (file)
@@ -2,56 +2,40 @@
 
 $ ${bindir:=.}/io/file ${srcdir:=.}/examples/platforms/storage.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
 > [  0.000000] (0:@) Number of host '4'
-> [  0.000000] (2:1@alice)     Open file '.\Windows\setupact.log'
-> [  0.000000] (3:2@carl)      Open file './doc/simgrid/examples/platforms/g5k_cabinets.xml'
-> [  0.000000] (4:3@bob)       Open file './doc/simgrid/examples/platforms/nancy.xml'
+> [  0.000000] (2:1@alice)     Open file 'c:\Windows\setupact.log'
+> [  0.000000] (3:2@carl)      Open file '/home/doc/simgrid/examples/platforms/g5k_cabinets.xml'
+> [  0.000000] (4:3@bob)       Open file '/home/doc/simgrid/examples/platforms/nancy.xml'
 > [  0.000000] (1:0@denise) File Descriptor information:
->              Full name: './doc/simgrid/examples/platforms/g5k.xml'
+>              Full path: '/home/doc/simgrid/examples/platforms/g5k.xml'
 >              Size: 17028
 >              Mount point: '/home'
 >              Storage Id: 'Disk4'
 >              Storage Type: 'single_SSD'
 >              Content Type: 'txt_unix'
-> [  0.000000] (1:0@denise)    Open file './doc/simgrid/examples/platforms/g5k.xml'
-> [  0.000040] (4:3@bob)       Have read    4028 on ./doc/simgrid/examples/platforms/nancy.xml
-> [  0.000085] (1:0@denise)    Have read    17028 on ./doc/simgrid/examples/platforms/g5k.xml
-> [  0.000226] (3:2@carl)      Have read    22645 on ./doc/simgrid/examples/platforms/g5k_cabinets.xml
-> [  0.000508] (2:1@alice)     Have read    101663 on .\Windows\setupact.log
-> [  0.001752] (1:0@denise)    Have written 100000 on ./doc/simgrid/examples/platforms/g5k.xml
-> [  0.002175] (2:1@alice)     Have written 100000 on .\Windows\setupact.log
-> [  0.002439] (1:0@denise)    Have read    110000 on ./doc/simgrid/examples/platforms/g5k.xml (of size 117026)
-> [  0.002439] (1:0@denise)    Close file './doc/simgrid/examples/platforms/g5k.xml'
-> [  0.002862] (2:1@alice)     Have read    110000 on .\Windows\setupact.log (of size 201662)
-> [  0.002862] (2:1@alice)     Close file '.\Windows\setupact.log'
-> [  0.003374] (4:3@bob)       Have written 100000 on ./doc/simgrid/examples/platforms/nancy.xml
-> [  0.003560] (3:2@carl)      Have written 100000 on ./doc/simgrid/examples/platforms/g5k_cabinets.xml
-> [  0.004529] (4:3@bob)       Have read    104023 on ./doc/simgrid/examples/platforms/nancy.xml (of size 104023)
-> [  0.004529] (4:3@bob)       Close file './doc/simgrid/examples/platforms/nancy.xml'
-> [  0.004782] (3:2@carl)      Have read    110000 on ./doc/simgrid/examples/platforms/g5k_cabinets.xml (of size 122641)
-> [  0.004782] (3:2@carl)      Close file './doc/simgrid/examples/platforms/g5k_cabinets.xml'
+> [  0.000000] (1:0@denise)    Open file '/home/doc/simgrid/examples/platforms/g5k.xml'
+> [  0.000040] (4:3@bob)       Have read    4028 on /home/doc/simgrid/examples/platforms/nancy.xml
+> [  0.000085] (1:0@denise)    Have read    17028 on /home/doc/simgrid/examples/platforms/g5k.xml
+> [  0.000226] (3:2@carl)      Have read    22645 on /home/doc/simgrid/examples/platforms/g5k_cabinets.xml
+> [  0.000508] (2:1@alice)     Have read    101663 on c:\Windows\setupact.log
+> [  0.001752] (1:0@denise)    Have written 100000 on /home/doc/simgrid/examples/platforms/g5k.xml
+> [  0.002175] (2:1@alice)     Have written 100000 on c:\Windows\setupact.log
+> [  0.002439] (1:0@denise)    Have read    110000 on /home/doc/simgrid/examples/platforms/g5k.xml (of size 117026)
+> [  0.002439] (1:0@denise)    Close file '/home/doc/simgrid/examples/platforms/g5k.xml'
+> [  0.002862] (2:1@alice)     Have read    110000 on c:\Windows\setupact.log (of size 201662)
+> [  0.002862] (2:1@alice)     Close file 'c:\Windows\setupact.log'
+> [  0.003374] (4:3@bob)       Have written 100000 on /home/doc/simgrid/examples/platforms/nancy.xml
+> [  0.003560] (3:2@carl)      Have written 100000 on /home/doc/simgrid/examples/platforms/g5k_cabinets.xml
+> [  0.004529] (4:3@bob)       Have read    104023 on /home/doc/simgrid/examples/platforms/nancy.xml (of size 104023)
+> [  0.004529] (4:3@bob)       Close file '/home/doc/simgrid/examples/platforms/nancy.xml'
+> [  0.004782] (3:2@carl)      Have read    110000 on /home/doc/simgrid/examples/platforms/g5k_cabinets.xml (of size 122641)
+> [  0.004782] (3:2@carl)      Close file '/home/doc/simgrid/examples/platforms/g5k_cabinets.xml'
 > [  0.004782] (0:@) Simulation time 0.00478201
 
 $ ${bindir:=.}/io/file_unlink ${srcdir:=.}/examples/platforms/storage.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
 > [  0.000000] (0:@) Number of host '4'
-> [  0.000000] (1:0@denise)    Open file './doc/simgrid/examples/platforms/g5k.xml'
-> [  0.000000] (1:0@denise)    Unlink file './doc/simgrid/examples/platforms/g5k.xml'
-> [  0.000000] (1:0@denise)    Open file './doc/simgrid/examples/platforms/g5k.xml'
-> [  0.001667] (1:0@denise)    Have written 100000 on ./doc/simgrid/examples/platforms/g5k.xml
-> [  0.001667] (1:0@denise)    Close file './doc/simgrid/examples/platforms/g5k.xml'
-> [  0.001667] (1:0@denise)  
-> [  0.001667] (1:0@denise) ls ./
-> [  0.001667] (1:0@denise) DIR  : include
-> [  0.001667] (1:0@denise) DIR  : lib
-> [  0.001667] (1:0@denise) DIR  : bin
-> [  0.001667] (1:0@denise) DIR  : doc
-> [  0.001667] (1:0@denise)  
-> [  0.001667] (1:0@denise) ls ./doc/simgrid/examples/platforms/
-> [  0.001667] (1:0@denise) FILE : g5k.xml
-> [  0.001667] (1:0@denise)  
-> [  0.001667] (1:0@denise) ls ./doc/simgrid/examples/msg/
-> [  0.001667] (1:0@denise) DIR  : alias
-> [  0.001667] (1:0@denise) DIR  : trace
-> [  0.001667] (1:0@denise) FILE : README
-> [  0.001667] (1:0@denise) DIR  : parallel_task
-> [  0.001667] (1:0@denise) DIR  : icomms
-> [  0.001667] (0:@) Simulation time 0.00166667
\ No newline at end of file
+> [  0.000000] (1:0@denise)    Open file '/home/doc/simgrid/examples/platforms/g5k.xml'
+> [  0.000000] (1:0@denise)    Unlink file '/home/doc/simgrid/examples/platforms/g5k.xml'
+> [  0.000000] (1:0@denise)    Open file '/home/doc/simgrid/examples/platforms/g5k.xml'
+> [  0.001667] (1:0@denise)    Have written 100000 on /home/doc/simgrid/examples/platforms/g5k.xml
+> [  0.001667] (1:0@denise)    Close file '/home/doc/simgrid/examples/platforms/g5k.xml'
+> [  0.001667] (0:@) Simulation time 0.00166667
index e2778d0..66a1fd4 100644 (file)
@@ -36,7 +36,7 @@ static int host(int argc, char *argv[]){
   msg_storage_t storage;
 
   // Retrieve all mount points of current host
-  xbt_dict_t storage_list = MSG_host_get_storage_list(MSG_host_self());
+  xbt_dict_t storage_list = MSG_host_get_mounted_storage_list(MSG_host_self());
 
   xbt_dict_foreach(storage_list,cursor,mount_name,storage_name)  {
     // For each disk mounted on host
@@ -56,14 +56,12 @@ static int host(int argc, char *argv[]){
 
 
   // Create a 200,000 bytes file named './tmp/data.txt' on /sd1
-
-  char* mount = xbt_strdup("/home");
-  char* file_name = xbt_strdup("./tmp/data.txt");
+  char* file_name = xbt_strdup("/home/tmp/data.txt");
   msg_file_t file = NULL;
   sg_size_t write, read, file_size;
 
   // Open an non-existing file amounts to create it!
-  file = MSG_file_open(mount, file_name, NULL);
+  file = MSG_file_open(file_name, NULL);
   write = MSG_file_write(file, 200000);  // Write 200,000 bytes
   XBT_INFO("Create a %llu bytes file named '%s' on /sd1", write, file_name);
   MSG_file_dump(file);
@@ -84,15 +82,14 @@ static int host(int argc, char *argv[]){
   MSG_file_dump(file);
 
   MSG_file_close(file);
-  free(mount);
   free(file_name);
 
   storage_name = xbt_strdup("Disk4");
   storage = MSG_storage_get_by_name(storage_name);
 
   // Now rename file from ./tmp/data.txt to ./tmp/simgrid.readme
-  XBT_INFO("*** Renaming './tmp/data.txt' into './tmp/simgrid.readme'");
-  MSG_storage_file_rename(storage, "./tmp/data.txt", "./tmp/simgrid.readme");
+  XBT_INFO("*** Renaming '/tmp/data.txt' into '/tmp/simgrid.readme'");
+  MSG_storage_file_rename(storage, "/tmp/data.txt", "/tmp/simgrid.readme");
 
   // Now attach some user data to disk1
   XBT_INFO("*** Get/set data for storage element: %s ***",storage_name);
@@ -101,9 +98,10 @@ static int host(int argc, char *argv[]){
 
   XBT_INFO("Get data: '%s'", data);
 
-  MSG_storage_set_data(storage,strdup("Some user data"));
+  MSG_storage_set_data(storage, xbt_strdup("Some user data"));
   data = MSG_storage_get_data(storage);
   XBT_INFO("Set and get data: '%s'", data);
+  xbt_free(data);
   xbt_free(storage_name);
 
 
index 3cd10b5..e0e74b2 100644 (file)
 #! ./tesh
 
-$ ${bindir:=.}/io/storage ${srcdir:=.}/examples/platforms/storage.xml "--log=root.fmt:[%8.6r]%e(%i@%h)%e%m%n"
-> [0.000000] (1@denise) *** Storage info on denise ***
-> [0.000000] (1@denise) Storage name: Disk4, mount name: /home
-> [0.000000] (1@denise) Total size: 536870912000 bytes
-> [0.000000] (1@denise) Free size: 536857690006 bytes
-> [0.000000] (1@denise) Used size: 13221994 bytes
-> [0.000000] (1@denise) Storage name: Disk2, mount name: /windows
-> [0.000000] (1@denise) Total size: 536870912000 bytes
-> [0.000000] (1@denise) Free size: 534479374867 bytes
-> [0.000000] (1@denise) Used size: 2391537133 bytes
-> [0.003333] (1@denise) Create a 200000 bytes file named './tmp/data.txt' on /sd1
-> [0.003333] (1@denise) File Descriptor information:
->              Full name: './tmp/data.txt'
+$ ${bindir:=.}/io/storage ${srcdir:=.}/examples/platforms/storage.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
+> [  0.000000] (1:(null)@denise) *** Storage info on denise ***
+> [  0.000000] (1:(null)@denise) Storage name: Disk2, mount name: c:
+> [  0.000000] (1:(null)@denise) Total size: 536870912000 bytes
+> [  0.000000] (1:(null)@denise) Free size: 534479374867 bytes
+> [  0.000000] (1:(null)@denise) Used size: 2391537133 bytes
+> [  0.000000] (1:(null)@denise) Storage name: Disk4, mount name: /home
+> [  0.000000] (1:(null)@denise) Total size: 536870912000 bytes
+> [  0.000000] (1:(null)@denise) Free size: 536857690006 bytes
+> [  0.000000] (1:(null)@denise) Used size: 13221994 bytes
+> [  0.003333] (1:(null)@denise) Create a 200000 bytes file named '/home/tmp/data.txt' on /sd1
+> [  0.003333] (1:(null)@denise) File Descriptor information:
+>              Full path: '/home/tmp/data.txt'
 >              Size: 200000
 >              Mount point: '/home'
 >              Storage Id: 'Disk4'
 >              Storage Type: 'single_SSD'
 >              Content Type: 'txt_unix'
-> [0.003333] (1@denise) Free size: 536857490006 bytes
-> [0.003333] (1@denise) Used size: 13421994 bytes
-> [0.004583] (1@denise) Read 200000 bytes on ./tmp/data.txt
-> [0.007917] (1@denise) Write 100000 bytes on ./tmp/data.txt
-> [0.007917] (1@denise) File Descriptor information:
->              Full name: './tmp/data.txt'
+> [  0.003333] (1:(null)@denise) Free size: 536857490006 bytes
+> [  0.003333] (1:(null)@denise) Used size: 13421994 bytes
+> [  0.004583] (1:(null)@denise) Read 200000 bytes on /home/tmp/data.txt
+> [  0.007917] (1:(null)@denise) Write 100000 bytes on /home/tmp/data.txt
+> [  0.007917] (1:(null)@denise) File Descriptor information:
+>              Full path: '/home/tmp/data.txt'
 >              Size: 300000
 >              Mount point: '/home'
 >              Storage Id: 'Disk4'
 >              Storage Type: 'single_SSD'
 >              Content Type: 'txt_unix'
-> [0.007917] (1@denise) *** Renaming './tmp/data.txt' into './tmp/simgrid.readme'
-> [0.007917] (1@denise) *** Get/set data for storage element: Disk4 ***
-> [0.007917] (1@denise) Get data: '(null)'
-> [0.007917] (1@denise) Set and get data: 'Some user data'
-> [0.007917] (1@denise) *** Dump content of denise ***
-> [0.007917] (1@denise) Print the content of mount point: /home
-> [0.007917] (1@denise) ./doc/simgrid/examples/platforms/g5k.xml size: 17028 bytes
-> [0.007917] (1@denise) ./include/surf/simgrid_dtd.h size: 23583 bytes
-> [0.007917] (1@denise) ./bin/smpicc size: 918 bytes
-> [0.007917] (1@denise) ./doc/simgrid/examples/smpi/mc_bugged2.c size: 1387 bytes
-> [0.007917] (1@denise) ./include/simdag/simdag.h size: 10325 bytes
-> [0.007917] (1@denise) ./doc/simgrid/examples/smpi/NAS/sys/README size: 1461 bytes
-> [0.007917] (1@denise) ./tmp/simgrid.readme size: 300000 bytes
-> [0.007917] (1@denise) ./doc/simgrid/examples/smpi/NAS/common/randdp.c size: 1441 bytes
-> [0.007917] (1@denise) ./include/msg/datatypes.h size: 4635 bytes
-> [0.007917] (1@denise) ./doc/simgrid/examples/smpi/NAS/EP/randlc.c size: 3300 bytes
-> [0.007917] (1@denise) ./doc/simgrid/examples/msg/parallel_task/test_ptask_deployment.xml size: 654 bytes
-> [0.007917] (1@denise) ./doc/simgrid/examples/msg/icomms/small_platform.xml size: 972 bytes
-> [0.007917] (1@denise) ./doc/simgrid/examples/msg/trace/test9.xml size: 598 bytes
-> [0.007917] (1@denise) ./include/simix/simix.h size: 13003 bytes
-> [0.007917] (1@denise) ./include/mc/modelchecker.h size: 96 bytes
-> [0.007917] (1@denise) ./doc/simgrid/examples/msg/README size: 4805 bytes
-> [0.007917] (1@denise) ./doc/simgrid/examples/smpi/NAS/README size: 1857 bytes
-> [0.007917] (1@denise) ./include/instr/instr.h size: 5750 bytes
-> [0.007917] (1@denise) ./doc/simgrid/html/group__XBT__str.html size: 36192 bytes
-> [0.007917] (1@denise) ./doc/simgrid/examples/smpi/NAS/EP/README size: 347 bytes
-> [0.007917] (1@denise) ./bin/tesh size: 356434 bytes
-> [0.007917] (1@denise) ./doc/simgrid/examples/smpi/NAS/DT/README size: 999 bytes
-> [0.007917] (1@denise) ./doc/simgrid/examples/smpi/NAS/FT/README size: 276 bytes
-> [0.007917] (1@denise) ./lib/libsimgrid.so.3.6.2 size: 12710497 bytes
-> [0.007917] (1@denise) ./doc/simgrid/examples/xbt/sem_basic.c size: 1970 bytes
-> [0.007917] (1@denise) ./doc/simgrid/examples/msg/alias/masterslave_forwarder_with_alias.c size: 6217 bytes
-> [0.007917] (1@denise) ./doc/simgrid/examples/smpi/NAS/SP/README size: 926 bytes
-> [0.007917] (1@denise) ./include/xbt/fifo.h size: 3626 bytes
-> [0.007917] (1@denise) ./doc/simgrid/examples/smpi/NAS/MPI_dummy/README size: 2406 bytes
-> [0.007917] (1@denise) ./doc/simgrid/examples/smpi/NAS/MG/README size: 5465 bytes
-> [0.007917] (1@denise) ./include/smpi/mpif.h size: 4826 bytes
-> [0.007917] (1@denise) Print the content of mount point: /windows
-> [0.007917] (1@denise) .\Windows\dcmdev64.exe size: 93288 bytes
-> [0.007917] (1@denise) .\Windows\WLXPGSS.SCR size: 322048 bytes
-> [0.007917] (1@denise) .\Windows\twain_32.dll size: 50176 bytes
-> [0.007917] (1@denise) .\Windows\bootstat.dat size: 67584 bytes
-> [0.007917] (1@denise) .\Windows\avastSS.scr size: 41664 bytes
-> [0.007917] (1@denise) .\Windows\font1.sii size: 4907 bytes
-> [0.007917] (1@denise) .\Windows\write.exe size: 10752 bytes
-> [0.007917] (1@denise) .\Windows\font2.sii size: 8698 bytes
-> [0.007917] (1@denise) .\Windows\DtcInstall.log size: 1955 bytes
-> [0.007917] (1@denise) .\Windows\vmgcoinstall.log size: 1585 bytes
-> [0.007917] (1@denise) .\Windows\_isusr32.dll size: 180320 bytes
-> [0.007917] (1@denise) .\Windows\winhlp32.exe size: 10752 bytes
-> [0.007917] (1@denise) .\Windows\setuperr.log size: 0 bytes
-> [0.007917] (1@denise) .\Windows\system.ini size: 219 bytes
-> [0.007917] (1@denise) .\Windows\hapint.exe size: 382056 bytes
-> [0.007917] (1@denise) .\Windows\Professional.xml size: 31881 bytes
-> [0.007917] (1@denise) .\Windows\setupact.log size: 101663 bytes
-> [0.007917] (1@denise) .\Windows\notepad.exe size: 243712 bytes
-> [0.007917] (1@denise) .\Windows\explorer.exe size: 2380944 bytes
-> [0.007917] (1@denise) .\Windows\bfsvc.exe size: 75264 bytes
-> [0.007917] (1@denise) .\Windows\WMSysPr9.prx size: 316640 bytes
-> [0.007917] (1@denise) .\Windows\PFRO.log size: 6770 bytes
-> [0.007917] (1@denise) .\Windows\csup.txt size: 12 bytes
-> [0.007917] (1@denise) .\Windows\win.ini size: 92 bytes
-> [0.007917] (1@denise) .\Windows\mib.bin size: 43131 bytes
-> [0.007917] (1@denise) .\Windows\Starter.xml size: 31537 bytes
-> [0.007917] (1@denise) .\Windows\CoreSingleLanguage.xml size: 31497 bytes
-> [0.007917] (1@denise) .\Windows\regedit.exe size: 159232 bytes
-> [0.007917] (1@denise) .\Windows\dchcfg64.exe size: 335464 bytes
-> [0.007917] (1@denise) .\Windows\HelpPane.exe size: 883712 bytes
-> [0.007917] (1@denise) .\Windows\WindowsUpdate.log size: 1518934 bytes
-> [0.007917] (1@denise) .\Windows\hh.exe size: 17408 bytes
-> [0.007917] (1@denise) .\Windows\DPINST.LOG size: 18944 bytes
-> [0.007917] (1@denise) .\Windows\DirectX.log size: 10486 bytes
-> [0.007917] (1@denise) .\Windows\splwow64.exe size: 126464 bytes
-> [0.007917] (1@denise) .\Windows\MEMORY.DMP size: 2384027342 bytes
-> [0.007917] (0@) Simulated time: 0.00791667
+> [  0.007917] (1:(null)@denise) *** Renaming '/tmp/data.txt' into '/tmp/simgrid.readme'
+> [  0.007917] (1:(null)@denise) *** Get/set data for storage element: Disk4 ***
+> [  0.007917] (1:(null)@denise) Get data: '(null)'
+> [  0.007917] (1:(null)@denise) Set and get data: 'Some user data'
+> [  0.007917] (1:(null)@denise) *** Dump content of denise ***
+> [  0.007917] (1:(null)@denise) Print the content of mount point: c:
+> [  0.007917] (1:(null)@denise) \Windows\win.ini size: 92 bytes
+> [  0.007917] (1:(null)@denise) \Windows\mib.bin size: 43131 bytes
+> [  0.007917] (1:(null)@denise) \Windows\DtcInstall.log size: 1955 bytes
+> [  0.007917] (1:(null)@denise) \Windows\vmgcoinstall.log size: 1585 bytes
+> [  0.007917] (1:(null)@denise) \Windows\Starter.xml size: 31537 bytes
+> [  0.007917] (1:(null)@denise) \Windows\_isusr32.dll size: 180320 bytes
+> [  0.007917] (1:(null)@denise) \Windows\winhlp32.exe size: 10752 bytes
+> [  0.007917] (1:(null)@denise) \Windows\setuperr.log size: 0 bytes
+> [  0.007917] (1:(null)@denise) \Windows\system.ini size: 219 bytes
+> [  0.007917] (1:(null)@denise) \Windows\hapint.exe size: 382056 bytes
+> [  0.007917] (1:(null)@denise) \Windows\Professional.xml size: 31881 bytes
+> [  0.007917] (1:(null)@denise) \Windows\regedit.exe size: 159232 bytes
+> [  0.007917] (1:(null)@denise) \Windows\setupact.log size: 101663 bytes
+> [  0.007917] (1:(null)@denise) \Windows\WindowsUpdate.log size: 1518934 bytes
+> [  0.007917] (1:(null)@denise) \Windows\explorer.exe size: 2380944 bytes
+> [  0.007917] (1:(null)@denise) \Windows\DirectX.log size: 10486 bytes
+> [  0.007917] (1:(null)@denise) \Windows\WMSysPr9.prx size: 316640 bytes
+> [  0.007917] (1:(null)@denise) \Windows\PFRO.log size: 6770 bytes
+> [  0.007917] (1:(null)@denise) \Windows\csup.txt size: 12 bytes
+> [  0.007917] (1:(null)@denise) \Windows\WLXPGSS.SCR size: 322048 bytes
+> [  0.007917] (1:(null)@denise) \Windows\avastSS.scr size: 41664 bytes
+> [  0.007917] (1:(null)@denise) \Windows\font1.sii size: 4907 bytes
+> [  0.007917] (1:(null)@denise) \Windows\write.exe size: 10752 bytes
+> [  0.007917] (1:(null)@denise) \Windows\font2.sii size: 8698 bytes
+> [  0.007917] (1:(null)@denise) \Windows\CoreSingleLanguage.xml size: 31497 bytes
+> [  0.007917] (1:(null)@denise) \Windows\dchcfg64.exe size: 335464 bytes
+> [  0.007917] (1:(null)@denise) \Windows\notepad.exe size: 243712 bytes
+> [  0.007917] (1:(null)@denise) \Windows\HelpPane.exe size: 883712 bytes
+> [  0.007917] (1:(null)@denise) \Windows\hh.exe size: 17408 bytes
+> [  0.007917] (1:(null)@denise) \Windows\DPINST.LOG size: 18944 bytes
+> [  0.007917] (1:(null)@denise) \Windows\bfsvc.exe size: 75264 bytes
+> [  0.007917] (1:(null)@denise) \Windows\splwow64.exe size: 126464 bytes
+> [  0.007917] (1:(null)@denise) \Windows\MEMORY.DMP size: 2384027342 bytes
+> [  0.007917] (1:(null)@denise) \Windows\dcmdev64.exe size: 93288 bytes
+> [  0.007917] (1:(null)@denise) \Windows\twain_32.dll size: 50176 bytes
+> [  0.007917] (1:(null)@denise) \Windows\bootstat.dat size: 67584 bytes
+> [  0.007917] (1:(null)@denise) Print the content of mount point: /home
+> [  0.007917] (1:(null)@denise) /include/simix/simix.h size: 13003 bytes
+> [  0.007917] (1:(null)@denise) /include/mc/modelchecker.h size: 96 bytes
+> [  0.007917] (1:(null)@denise) /doc/simgrid/examples/msg/README size: 4805 bytes
+> [  0.007917] (1:(null)@denise) /include/instr/instr.h size: 5750 bytes
+> [  0.007917] (1:(null)@denise) /doc/simgrid/examples/smpi/mc_bugged2.c size: 1387 bytes
+> [  0.007917] (1:(null)@denise) /doc/simgrid/html/group__XBT__str.html size: 36192 bytes
+> [  0.007917] (1:(null)@denise) /doc/simgrid/examples/smpi/NAS/EP/README size: 347 bytes
+> [  0.007917] (1:(null)@denise) /doc/simgrid/examples/smpi/NAS/DT/README size: 999 bytes
+> [  0.007917] (1:(null)@denise) /doc/simgrid/examples/smpi/NAS/FT/README size: 276 bytes
+> [  0.007917] (1:(null)@denise) /lib/libsimgrid.so.3.6.2 size: 12710497 bytes
+> [  0.007917] (1:(null)@denise) /doc/simgrid/examples/smpi/NAS/sys/README size: 1461 bytes
+> [  0.007917] (1:(null)@denise) /doc/simgrid/examples/msg/alias/masterslave_forwarder_with_alias.c size: 6217 bytes
+> [  0.007917] (1:(null)@denise) /doc/simgrid/examples/smpi/NAS/SP/README size: 926 bytes
+> [  0.007917] (1:(null)@denise) /tmp/simgrid.readme size: 300000 bytes
+> [  0.007917] (1:(null)@denise) /doc/simgrid/examples/msg/parallel_task/test_ptask_deployment.xml size: 654 bytes
+> [  0.007917] (1:(null)@denise) /doc/simgrid/examples/msg/icomms/small_platform.xml size: 972 bytes
+> [  0.007917] (1:(null)@denise) /doc/simgrid/examples/smpi/NAS/MG/README size: 5465 bytes
+> [  0.007917] (1:(null)@denise) /doc/simgrid/examples/msg/trace/test9.xml size: 598 bytes
+> [  0.007917] (1:(null)@denise) /include/smpi/mpif.h size: 4826 bytes
+> [  0.007917] (1:(null)@denise) /doc/simgrid/examples/smpi/NAS/README size: 1857 bytes
+> [  0.007917] (1:(null)@denise) /bin/tesh size: 356434 bytes
+> [  0.007917] (1:(null)@denise) /include/simdag/simdag.h size: 10325 bytes
+> [  0.007917] (1:(null)@denise) /doc/simgrid/examples/xbt/sem_basic.c size: 1970 bytes
+> [  0.007917] (1:(null)@denise) /include/xbt/fifo.h size: 3626 bytes
+> [  0.007917] (1:(null)@denise) /doc/simgrid/examples/smpi/NAS/common/randdp.c size: 1441 bytes
+> [  0.007917] (1:(null)@denise) /include/msg/datatypes.h size: 4635 bytes
+> [  0.007917] (1:(null)@denise) /doc/simgrid/examples/smpi/NAS/EP/randlc.c size: 3300 bytes
+> [  0.007917] (1:(null)@denise) /doc/simgrid/examples/smpi/NAS/MPI_dummy/README size: 2406 bytes
+> [  0.007917] (1:(null)@denise) /doc/simgrid/examples/platforms/g5k.xml size: 17028 bytes
+> [  0.007917] (1:(null)@denise) /include/surf/simgrid_dtd.h size: 23583 bytes
+> [  0.007917] (1:(null)@denise) /bin/smpicc size: 918 bytes
+> [  0.007917] (0:@) Simulated time: 0.00791667
index 45300c7..da3f463 100644 (file)
@@ -213,7 +213,7 @@ static void handle_task(node_t node, msg_task_t task) {
     /*
      * Try to join the ring
      */
-    case TASK_JOIN:;
+    case TASK_JOIN: {
       int next = routing_next(node, task_data->answer_id);
       XBT_DEBUG("Join request from %08x forwarding to %08x", task_data->answer_id, next);      
       type = TASK_JOIN_LAST_REPLY;
@@ -240,7 +240,7 @@ static void handle_task(node_t node, msg_task_t task) {
       task_sent = MSG_task_create(NULL, COMP_SIZE, COMM_SIZE, req_data);
       MSG_task_send_with_timeout(task_sent, task_data->answer_to, timeout);
       break;
-
+    }
     /*
      * Join reply from all the node touched by the join
      */
index 1ce043b..b12fbf4 100644 (file)
 XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test,
                              "Messages specific for this msg example");
 
+#define SLEEP(duration)                                 \
+  if (MSG_process_sleep(duration) != MSG_OK)            \
+    xbt_die("What's going on??? I failed to sleep!");   \
+  else                                                  \
+    (void)0
+
 /** @addtogroup MSG_examples
  * 
  * - <b>suspend/suspend.c</b>: Demonstrates how to suspend and resume processes using @ref MSG_process_suspend and @ref MSG_process_resume.
@@ -23,6 +29,15 @@ static int lazy_guy(int argc, char *argv[])
   XBT_INFO("Nobody's watching me ? Let's go to sleep.");
   MSG_process_suspend(MSG_process_self());
   XBT_INFO("Uuuh ? Did somebody call me ?");
+
+  XBT_INFO("Going to sleep...");
+  SLEEP(10.0);
+  XBT_INFO("Mmm... waking up.");
+
+  XBT_INFO("Going to sleep one more time...");
+  SLEEP(10.0);
+  XBT_INFO("Waking up once for all!");
+
   XBT_INFO("Mmmh, goodbye now.");
   return 0;
 }                               /* end_of_lazy_guy */
@@ -36,9 +51,26 @@ static int dream_master(int argc, char *argv[])
   XBT_INFO("Let's create a lazy guy.");
   lazy = MSG_process_create("Lazy", lazy_guy, NULL, MSG_host_self());
   XBT_INFO("Let's wait a little bit...");
-  MSG_process_sleep(10.0);
+  SLEEP(10.0);
   XBT_INFO("Let's wake the lazy guy up! >:) BOOOOOUUUHHH!!!!");
   MSG_process_resume(lazy);
+
+  SLEEP(5.0);
+  XBT_INFO("Suspend the lazy guy while he's sleeping...");
+  MSG_process_suspend(lazy);
+  XBT_INFO("Let him finish his siesta.");
+  SLEEP(10.0);
+  XBT_INFO("Wake up, lazy guy!");
+  MSG_process_resume(lazy);
+
+  SLEEP(5.0);
+  XBT_INFO("Suspend again the lazy guy while he's sleeping...");
+  MSG_process_suspend(lazy);
+  XBT_INFO("This time, don't let him finish his siesta.");
+  SLEEP(2.0);
+  XBT_INFO("Wake up, lazy guy!");
+  MSG_process_resume(lazy);
+
   XBT_INFO("OK, goodbye now.");
   return 0;
 }                               /* end_of_dram_master */
index d6177b1..8a6014f 100644 (file)
@@ -7,8 +7,18 @@ $ $SG_TEST_EXENV suspend/suspend ${srcdir:=.}/msg_platform.xml ${srcdir:=.}/susp
 > [  0.000000] (1:dream_master@Jacquelin) Let's create a lazy guy.
 > [  0.000000] (1:dream_master@Jacquelin) Let's wait a little bit...
 > [  0.000000] (2:Lazy@Jacquelin) Nobody's watching me ? Let's go to sleep.
-> [ 10.000000] (0:@) Simulation time 10
 > [ 10.000000] (1:dream_master@Jacquelin) Let's wake the lazy guy up! >:) BOOOOOUUUHHH!!!!
-> [ 10.000000] (1:dream_master@Jacquelin) OK, goodbye now.
 > [ 10.000000] (2:Lazy@Jacquelin) Uuuh ? Did somebody call me ?
-> [ 10.000000] (2:Lazy@Jacquelin) Mmmh, goodbye now.
+> [ 10.000000] (2:Lazy@Jacquelin) Going to sleep...
+> [ 15.000000] (1:dream_master@Jacquelin) Suspend the lazy guy while he's sleeping...
+> [ 15.000000] (1:dream_master@Jacquelin) Let him finish his siesta.
+> [ 25.000000] (1:dream_master@Jacquelin) Wake up, lazy guy!
+> [ 25.000000] (2:Lazy@Jacquelin) Mmm... waking up.
+> [ 25.000000] (2:Lazy@Jacquelin) Going to sleep one more time...
+> [ 30.000000] (1:dream_master@Jacquelin) Suspend again the lazy guy while he's sleeping...
+> [ 30.000000] (1:dream_master@Jacquelin) This time, don't let him finish his siesta.
+> [ 32.000000] (1:dream_master@Jacquelin) Wake up, lazy guy!
+> [ 32.000000] (1:dream_master@Jacquelin) OK, goodbye now.
+> [ 35.000000] (0:@) Simulation time 35
+> [ 35.000000] (2:Lazy@Jacquelin) Waking up once for all!
+> [ 35.000000] (2:Lazy@Jacquelin) Mmmh, goodbye now.
index 41bab56..80d00dd 100644 (file)
@@ -1,30 +1,30 @@
-./doc/simgrid/examples/platforms/g5k.xml  17028
-./doc/simgrid/examples/smpi/mc_bugged2.c  1387
-./doc/simgrid/examples/smpi/NAS/README  1857
-./doc/simgrid/examples/smpi/NAS/MPI_dummy/README 2406
-./doc/simgrid/examples/smpi/NAS/common/randdp.c 1441
-./doc/simgrid/examples/smpi/NAS/sys/README  1461
-./doc/simgrid/examples/smpi/NAS/SP/README  926
-./doc/simgrid/examples/smpi/NAS/FT/README  276
-./doc/simgrid/examples/smpi/NAS/DT/README  999
-./doc/simgrid/examples/smpi/NAS/EP/README  347
-./doc/simgrid/examples/smpi/NAS/EP/randlc.c  3300
-./doc/simgrid/examples/smpi/NAS/MG/README  5465
-./doc/simgrid/examples/xbt/sem_basic.c  1970
-./doc/simgrid/examples/msg/README  4805
-./doc/simgrid/examples/msg/icomms/small_platform.xml 972
-./doc/simgrid/examples/msg/parallel_task/test_ptask_deployment.xml  654
-./doc/simgrid/examples/msg/alias/masterslave_forwarder_with_alias.c  6217
-./doc/simgrid/examples/msg/trace/test9.xml  598
-./doc/simgrid/html/group__XBT__str.html  36192
-./include/smpi/mpif.h  4826
-./include/xbt/fifo.h  3626
-./include/msg/datatypes.h 4635
-./include/mc/modelchecker.h  96
-./include/surf/simgrid_dtd.h  23583
-./include/instr/instr.h  5750
-./include/simdag/simdag.h  10325
-./include/simix/simix.h  13003
-./lib/libsimgrid.so.3.6.2  12710497
-./bin/smpicc  918
-./bin/tesh  356434
\ No newline at end of file
+/doc/simgrid/examples/platforms/g5k.xml  17028
+/doc/simgrid/examples/smpi/mc_bugged2.c  1387
+/doc/simgrid/examples/smpi/NAS/README  1857
+/doc/simgrid/examples/smpi/NAS/MPI_dummy/README 2406
+/doc/simgrid/examples/smpi/NAS/common/randdp.c 1441
+/doc/simgrid/examples/smpi/NAS/sys/README  1461
+/doc/simgrid/examples/smpi/NAS/SP/README  926
+/doc/simgrid/examples/smpi/NAS/FT/README  276
+/doc/simgrid/examples/smpi/NAS/DT/README  999
+/doc/simgrid/examples/smpi/NAS/EP/README  347
+/doc/simgrid/examples/smpi/NAS/EP/randlc.c  3300
+/doc/simgrid/examples/smpi/NAS/MG/README  5465
+/doc/simgrid/examples/xbt/sem_basic.c  1970
+/doc/simgrid/examples/msg/README  4805
+/doc/simgrid/examples/msg/icomms/small_platform.xml 972
+/doc/simgrid/examples/msg/parallel_task/test_ptask_deployment.xml  654
+/doc/simgrid/examples/msg/alias/masterslave_forwarder_with_alias.c  6217
+/doc/simgrid/examples/msg/trace/test9.xml  598
+/doc/simgrid/html/group__XBT__str.html  36192
+/include/smpi/mpif.h  4826
+/include/xbt/fifo.h  3626
+/include/msg/datatypes.h 4635
+/include/mc/modelchecker.h  96
+/include/surf/simgrid_dtd.h  23583
+/include/instr/instr.h  5750
+/include/simdag/simdag.h  10325
+/include/simix/simix.h  13003
+/lib/libsimgrid.so.3.6.2  12710497
+/bin/smpicc  918
+/bin/tesh  356434
\ No newline at end of file
index b115c53..8e39931 100644 (file)
-./doc/simgrid/examples/cxx/autoDestination/FinalizeTask.cxx  71
-./doc/simgrid/examples/cxx/autoDestination/autoDestination_deployment.xml  1262
-./doc/simgrid/examples/cxx/autoDestination/Main.cxx  148
-./doc/simgrid/examples/cxx/autoDestination/Slave.cxx  870
-./doc/simgrid/examples/cxx/autoDestination/BasicTask.cxx  65
-./doc/simgrid/examples/cxx/autoDestination/Master.cxx  1891
-./doc/simgrid/examples/cxx/autoDestination/autoDestination_platform.xml  2133932
-./doc/simgrid/examples/cxx/autoDestination/Forwarder.cxx  1137
-./doc/simgrid/explicitDestination/FinalizeTask.cxx 71
-./doc/simgrid/examples/cxx/basic/Main.cxx  148
-./doc/simgrid/examples/cxx/basic/Slave.cxx  693
-./doc/simgrid/examples/cxx/basic/BasicTask.cxx  65
-./doc/simgrid/examples/cxx/basic/basic_platform.xml  2133932  
-./doc/simgrid/examples/cxx/basic/Master.cxx  2148
-./doc/simgrid/examples/cxx/basic/basic_deployment.xml 1188
-./doc/simgrid/examples/cxx/basic/Forwarder.cxx  1244
-./doc/simgrid/examples/cxx/explicitDestination/FinalizeTask.cxx  71
-./doc/simgrid/examples/cxx/explicitDestination/Main.cxx  148
-./doc/simgrid/examples/cxx/explicitDestination/explicitDestination_platform.xml  2133932
-./doc/simgrid/examples/cxx/explicitDestination/Slave.cxx  913
-./doc/simgrid/examples/cxx/explicitDestination/BasicTask.cxx  65
-./doc/simgrid/examples/cxx/explicitDestination/explicitDestination_deployment.xml  1188
-./doc/simgrid/examples/cxx/explicitDestination/Master.cxx  1896
-./doc/simgrid/examples/cxx/explicitDestination/Forwarder.cxx  1181
-./doc/simgrid/examples/cxx/ping_pong/Main.cxx  149
-./doc/simgrid/examples/cxx/ping_pong/Sender.cxx 1073
-./doc/simgrid/examples/cxx/ping_pong/ping_pong_deployment.xml  275
-./doc/simgrid/examples/cxx/ping_pong/ping_pong_platform.xml  4718
-./doc/simgrid/examples/cxx/ping_pong/Receiver.cxx 957
-./doc/simgrid/examples/cxx/ping_pong/PingPongTask.cxx 71
-./doc/simgrid/examples/cxx/comm_time/FinalizeTask.cxx 71
-./doc/simgrid/examples/cxx/comm_time/Main.cxx  146
-./doc/simgrid/examples/cxx/comm_time/CommTimeTask.cxx 71
-./doc/simgrid/examples/cxx/comm_time/Slave.cxx  889
-./doc/simgrid/examples/cxx/comm_time/comm_time_platform.xml  2133932
-./doc/simgrid/examples/cxx/comm_time/Master.cxx  1730
-./doc/simgrid/examples/cxx/comm_time/comm_time_deployment.xml  1884
-./doc/simgrid/examples/cxx/suspend/Main.cxx  150
-./doc/simgrid/examples/cxx/suspend/suspend_platform.xml  2133932
-./doc/simgrid/examples/cxx/suspend/suspend_deployment.xml  187
-./doc/simgrid/examples/cxx/suspend/DreamMaster.cxx 826
-./doc/simgrid/examples/cxx/suspend/LazyGuy.cxx  429
-./doc/simgrid/examples/smpi/mc_bugged2.c  1387
-./doc/simgrid/examples/smpi/scatter.c  3496
-./doc/simgrid/examples/smpi/mc_bugged1.c  1411
-./doc/simgrid/examples/smpi/get_processor_name.c  649
-./doc/simgrid/examples/smpi/NAS/README  1857
-./doc/simgrid/examples/smpi/NAS/EP-sampling/README  347
-./doc/simgrid/examples/smpi/NAS/EP-sampling/randlc.c  3300
-./doc/simgrid/examples/smpi/NAS/EP-sampling/ep.c  13723
-./doc/simgrid/examples/smpi/NAS/EP-trace/README  347
-./doc/simgrid/examples/smpi/NAS/EP-trace/randlc.c  3300
-./doc/simgrid/examples/smpi/NAS/EP-trace/ep-trace.c  13850
-./doc/simgrid/examples/smpi/NAS/config/NAS.samples/README  394
-./doc/simgrid/examples/smpi/NAS/IS-trace/is-trace.c 38276
-./doc/simgrid/examples/smpi/NAS/DT-trace/README 999
-./doc/simgrid/examples/smpi/NAS/DT-trace/DGraph.c 5451
-./doc/simgrid/examples/smpi/NAS/DT-trace/dt.c  23031
-./doc/simgrid/examples/smpi/NAS/IS/is.c  38077
-./doc/simgrid/examples/smpi/NAS/MPI_dummy/README 2406
-./doc/simgrid/examples/smpi/NAS/MPI_dummy/mpi_dummy.c 5660
-./doc/simgrid/examples/smpi/NAS/MPI_dummy/wtime_sgi64.c  1700
-./doc/simgrid/examples/smpi/NAS/MPI_dummy/wtime.c 228
-./doc/simgrid/examples/smpi/NAS/common/randdp.c 1441
-./doc/simgrid/examples/smpi/NAS/common/c_timers.c 1159
-./doc/simgrid/examples/smpi/NAS/common/c_print_results.c  3086
-./doc/simgrid/examples/smpi/NAS/sys/README  1461
-./doc/simgrid/examples/smpi/NAS/sys/setparams.c 38805
-./doc/simgrid/examples/smpi/NAS/SP/README  926
-./doc/simgrid/examples/smpi/NAS/FT/README  276
-./doc/simgrid/examples/smpi/NAS/DT/README  999
-./doc/simgrid/examples/smpi/NAS/DT/DGraph.c  5451
-./doc/simgrid/examples/smpi/NAS/DT/dt.c  22620
-./doc/simgrid/examples/smpi/NAS/EP/README  347
-./doc/simgrid/examples/smpi/NAS/EP/randlc.c  3300
-./doc/simgrid/examples/smpi/NAS/EP/ep.c  13688
-./doc/simgrid/examples/smpi/NAS/DT-folding/README 999
-./doc/simgrid/examples/smpi/NAS/DT-folding/DGraph.c 5451
-./doc/simgrid/examples/smpi/NAS/DT-folding/dt.c 22704
-./doc/simgrid/examples/smpi/NAS/MG/README  5465
-./doc/simgrid/examples/smpi/bcast.c  983
-./doc/simgrid/examples/smpi/compute2.c  628
-./doc/simgrid/examples/smpi/sendrecv.c  1652
-./doc/simgrid/examples/smpi/allreduce.c  2135
-./doc/simgrid/examples/smpi/mvmul.c  7069
-./doc/simgrid/examples/smpi/alltoallv.c  4441
-./doc/simgrid/examples/smpi/smpi_traced.c  8529
-./doc/simgrid/examples/smpi/compute3.c  816
-./doc/simgrid/examples/smpi/reduce.c  3545
-./doc/simgrid/examples/smpi/bcbench.c  2466
-./doc/simgrid/examples/smpi/ttest01.c  1273
-./doc/simgrid/examples/smpi/compute.c  622
-./doc/simgrid/examples/smpi/barrier.c  766
-./doc/simgrid/examples/smpi/alltoall_basic.c  1453
-./doc/simgrid/examples/smpi/pingpong.c  2286
-./doc/simgrid/examples/smpi/alltoall2.c  2799
-./doc/simgrid/examples/smpi/split.c  705
-./doc/simgrid/examples/xbt/sem_basic.c  1970
-./doc/simgrid/examples/xbt/sem_sched.c  7207
-./doc/simgrid/examples/msg/small_platform.xml  4582
-./doc/simgrid/examples/msg/README  4805
-./doc/simgrid/examples/msg/properties/deployment_properties.xml  272
-./doc/simgrid/examples/msg/properties/msg_prop.c 3853
-./doc/simgrid/examples/msg/ns3/3links-p.xml  856
-./doc/simgrid/examples/msg/ns3/dogbone-d.xml  582
-./doc/simgrid/examples/msg/ns3/Two_clusters.xml 1817
-./doc/simgrid/examples/msg/ns3/3links-d.xml  927
-./doc/simgrid/examples/msg/ns3/3links-d-timer.xml 1280
-./doc/simgrid/examples/msg/ns3/ns3.c  5177
-./doc/simgrid/examples/msg/ns3/Two_clusters-d.xml 369
-./doc/simgrid/examples/msg/ns3/One_cluster-d.xml 367
-./doc/simgrid/examples/msg/ns3/dogbone-p.xml  1497
-./doc/simgrid/examples/msg/ns3/3hosts_2links_p.xml 566
-./doc/simgrid/examples/msg/ns3/3hosts_2links_d.xml 352
-./doc/simgrid/examples/msg/ns3/One_cluster.xml  658
-./doc/simgrid/examples/msg/migration/migration.c 2922
-./doc/simgrid/examples/msg/small_platform_with_failures.xml  4746
-./doc/simgrid/examples/msg/icomms/small_platform.xml 972
-./doc/simgrid/examples/msg/icomms/deployment_peer.xml 678
-./doc/simgrid/examples/msg/icomms/deployment_peer05.xml  891
-./doc/simgrid/examples/msg/icomms/deployment_peer02.xml  855
-./doc/simgrid/examples/msg/icomms/peer2.c  4276
-./doc/simgrid/examples/msg/icomms/deployment_peer03.xml  851
-./doc/simgrid/examples/msg/icomms/deployment_peer04.xml  852
-./doc/simgrid/examples/msg/icomms/peer.c  5102
-./doc/simgrid/examples/msg/icomms/deployment_peer01.xml  855
-./doc/simgrid/examples/msg/icomms/peer3.c  5258
-./doc/simgrid/examples/msg/parallel_task/test_ptask_deployment.xml  654
-./doc/simgrid/examples/msg/parallel_task/test_ptask.c 5423
-./doc/simgrid/examples/msg/parallel_task/test_ptask_platform.xml  2380
-./doc/simgrid/examples/msg/parallel_task/parallel_task.c  2708
-./doc/simgrid/examples/msg/alias/masterslave_forwarder_with_alias.c  6217
-./doc/simgrid/examples/msg/trace/test9.xml  598
-./doc/simgrid/examples/msg/trace/test3.xml  372
-./doc/simgrid/examples/msg/trace/test_trace_integration.xml  206
-./doc/simgrid/examples/msg/trace/test2.xml  370
-./doc/simgrid/examples/msg/trace/test7.xml  501
-./doc/simgrid/examples/msg/trace/test11.xml  683
-./doc/simgrid/examples/msg/trace/test4.xml  371
-./doc/simgrid/examples/msg/trace/test10.xml  598
-./doc/simgrid/examples/msg/trace/test6.xml  372
-./doc/simgrid/examples/msg/trace/test8.xml  498
-./doc/simgrid/examples/msg/trace/test5.xml  371
-./doc/simgrid/examples/msg/trace/test_trace_integration.c  1960
-./doc/simgrid/examples/msg/trace/test1.xml  366
-./doc/simgrid/examples/msg/parallel_contexts/pcontexts_platform.xml  1002
-./doc/simgrid/examples/msg/parallel_contexts/deployment_pcontexts2_4.xml 467
-./doc/simgrid/examples/msg/parallel_contexts/pcontexts2.c  2236
-./doc/simgrid/examples/msg/parallel_contexts/deployment_pcontexts_2.xml 242
-./doc/simgrid/examples/msg/parallel_contexts/deployment_pcontexts_4.xml 353
-./doc/simgrid/examples/msg/parallel_contexts/pcontexts.c  1752
-./doc/simgrid/examples/msg/tracing/deployment.xml 800
-./doc/simgrid/examples/msg/tracing/ms.c  4374
-./doc/simgrid/examples/msg/tracing/platform.xml 3930
-./doc/simgrid/examples/msg/tracing/tasks.c  3594
-./doc/simgrid/examples/msg/tracing/procmig-deploy.xml 223
-./doc/simgrid/examples/msg/tracing/procmig.c  3282
-./doc/simgrid/examples/msg/tracing/categories.c 3358
-./doc/simgrid/examples/msg/sendrecv/README  689
-./doc/simgrid/examples/msg/sendrecv/deployment_sendrecv.xml  321
-./doc/simgrid/examples/msg/sendrecv/sendrecv.c  5098
-./doc/simgrid/examples/msg/sendrecv/platform_sendrecv.xml  528
-./doc/simgrid/examples/msg/gtnets/onelink-p.xml 439
-./doc/simgrid/examples/msg/gtnets/fullduplex-p.xml 575
-./doc/simgrid/examples/msg/gtnets/dogbone-d.xml 576
-./doc/simgrid/examples/msg/gtnets/waxman-d.xml  46642
-./doc/simgrid/examples/msg/gtnets/waxman-p.xml 4964600  
-./doc/simgrid/examples/msg/gtnets/fullduplex-d.xml 1029
-./doc/simgrid/examples/msg/gtnets/onelink-d.xml 356
-./doc/simgrid/examples/msg/gtnets/gtnets.c  6172
-./doc/simgrid/examples/msg/gtnets/dogbone-p.xml 1482
-./doc/simgrid/examples/msg/pmm/msg_pmm.c  9688
-./doc/simgrid/examples/msg/pmm/pmm_9_deploy.xml 786
-./doc/simgrid/examples/msg/mc/bugged1.c  1378
-./doc/simgrid/examples/msg/mc/deploy_bugged3.xml 377
-./doc/simgrid/examples/msg/mc/deploy_mutex.xml  925
-./doc/simgrid/examples/msg/mc/platform.xml  876
-./doc/simgrid/examples/msg/mc/deploy_bugged2.xml 377
-./doc/simgrid/examples/msg/mc/random_test.c  563
-./doc/simgrid/examples/msg/mc/deploy_bugged1.xml 459
-./doc/simgrid/examples/msg/mc/bugged3.c  1827
-./doc/simgrid/examples/msg/mc/deploy_random_test.xml 468
-./doc/simgrid/examples/msg/mc/bugged2.c  1957
-./doc/simgrid/examples/msg/mc/centralized_mutex.c 3375
-./doc/simgrid/examples/msg/token_ring/two_clusters.xml 1007
-./doc/simgrid/examples/msg/token_ring/ring_call.c 4205
-./doc/simgrid/examples/msg/token_ring/two_peers.xml 556
-./doc/simgrid/examples/msg/msg_platform.xml 2261806  
-./doc/simgrid/examples/msg/priority/deployment_priority.xml  406
-./doc/simgrid/examples/msg/priority/priority.c  2394
-./doc/simgrid/examples/msg/actions/actions.c  19339
-./doc/simgrid/examples/msg/actions/deployment.xml 249
-./doc/simgrid/examples/msg/actions/NAS_LU_S_4/platform_flat.xml  6805
-./doc/simgrid/examples/msg/actions/NAS_LU_S_4/platform.xml  387
-./doc/simgrid/examples/msg/actions/NAS_LU_S_4/deploy_MPI_4.xml  605
-./doc/simgrid/examples/msg/actions/sim.0.bordereau.lu.b.8/toto.xml  1066
-./doc/simgrid/examples/msg/actions/sim.0.bordereau.lu.b.8/titi.xml  1066
-./doc/simgrid/examples/msg/actions/deployment_split.xml  525
-./doc/simgrid/examples/msg/actions/homogeneous_3_hosts.xml  906
-./doc/simgrid/examples/msg/actions/bcast_deployment.xml  224
-./doc/simgrid/examples/msg/actions/actions_deployment_split.xml  501
-./doc/simgrid/examples/msg/masterslave/masterslave_bypass.c  9082
-./doc/simgrid/examples/msg/masterslave/deployment_masterslave_mailbox.xml 990
-./doc/simgrid/examples/msg/masterslave/masterslave_cluster.c  6773
-./doc/simgrid/examples/msg/masterslave/masterslave_console.c  3952
-./doc/simgrid/examples/msg/masterslave/platform_clusters.xml  930
-./doc/simgrid/examples/msg/masterslave/deployment_masterslave_mailbox_multicore.xml  1078
-./doc/simgrid/examples/msg/masterslave/masterslave_failure.c  7120
-./doc/simgrid/examples/msg/masterslave/deployment_masterslave_vivaldi.xml 4170
-./doc/simgrid/examples/msg/masterslave/deployment_masterslave_forwarder.xml 1382
-./doc/simgrid/examples/msg/masterslave/masterslave_forwarder.c  6438
-./doc/simgrid/examples/msg/masterslave/platform_script.lua  2535
-./doc/simgrid/examples/msg/masterslave/deployment_masterslave.xml  998
-./doc/simgrid/examples/msg/masterslave/jumbo_deployment.xml  6805
-./doc/simgrid/examples/msg/masterslave/jumbo_deployment_masterslave_mailbox.xml  878
-./doc/simgrid/examples/msg/masterslave/masterslave_mailbox.c  4118
-./doc/simgrid/examples/msg/suspend/suspend.c  2692
-./doc/simgrid/examples/msg/suspend/deployment_suspend.xml  183
-./doc/simgrid/examples/msg/small_platform_with_routers.xml  5295
-./doc/simgrid/examples/msg/chord/chord90.xml  13992
-./doc/simgrid/examples/msg/chord/chord.xml  2236
-./doc/simgrid/examples/msg/chord/chord10k.xml 1624671  
-./doc/simgrid/examples/msg/chord/chord.c  28995
-./doc/simgrid/examples/lua/multi_matrix/quicksort_platform.xml  4628
-./doc/simgrid/examples/lua/multi_matrix/mult_matrix.lua  227
-./doc/simgrid/examples/lua/multi_matrix/receiver.lua 1199
-./doc/simgrid/examples/lua/multi_matrix/quicksort_deployment.xml  524
-./doc/simgrid/examples/lua/multi_matrix/sender.lua 748
-./doc/simgrid/examples/lua/mult_matrix.lua  2196
-./doc/simgrid/examples/lua/README  1416
-./doc/simgrid/examples/lua/deploy.xml  879
-./doc/simgrid/examples/lua/splaySim/master.lua  1125
-./doc/simgrid/examples/lua/splaySim/slave.lua  729
-./doc/simgrid/examples/lua/splaySim/splay_platform.lua 1950
-./doc/simgrid/examples/lua/splaySim/splay_ctrl.lua 304
-./doc/simgrid/examples/lua/splaySim/splay_deploy_masterslave.lua  487
-./doc/simgrid/examples/lua/tracing/master.lua  1390
-./doc/simgrid/examples/lua/tracing/slave.lua  713
-./doc/simgrid/examples/lua/tracing/master_slave_trace.lua  491
-./doc/simgrid/examples/lua/SimSplay/sim_splay.lua 2298
-./doc/simgrid/examples/lua/SimSplay/splay_school.lua 402
-./doc/simgrid/examples/lua/SimSplay/chord.lua  1906
-./doc/simgrid/examples/lua/SimSplay/platform_script.lua  1706
-./doc/simgrid/examples/lua/console/master.lua  1125
-./doc/simgrid/examples/lua/console/deploy.lua  480
-./doc/simgrid/examples/lua/console/slave.lua  730
-./doc/simgrid/examples/lua/console/platform.lua 2424
-./doc/simgrid/examples/lua/console/master_slave_bypass.lua  158
-./doc/simgrid/examples/lua/masterslave/master.lua 1125
-./doc/simgrid/examples/lua/masterslave/slave.lua 730
-./doc/simgrid/examples/lua/masterslave/platform.lua 2424
-./doc/simgrid/examples/lua/masterslave/master_slave.lua  378
-./doc/simgrid/examples/simdag/properties/sd_prop.c 3012
-./doc/simgrid/examples/simdag/dax/Strassen.xml  9663
-./doc/simgrid/examples/simdag/dax/Montage_25.xml 23087
-./doc/simgrid/examples/simdag/dax/Sipht_30.xml 267014   
-./doc/simgrid/examples/simdag/dax/dax_test.c  4346
-./doc/simgrid/examples/simdag/dax/Montage_50.xml 48868
-./doc/simgrid/examples/simdag/dax/Inspiral_30.xml 28774
-./doc/simgrid/examples/simdag/dax/sagittaire.xml 289
-./doc/simgrid/examples/simdag/scheduling/minmin_test.c 11328
-./doc/simgrid/examples/simdag/scheduling/Montage_25.xml  23087
-./doc/simgrid/examples/simdag/scheduling/simulacrum_7_hosts.xml  5670
-./doc/simgrid/examples/simdag/sd_seq_access.c  4153
-./doc/simgrid/examples/simdag/sd_test_console.c 6976
-./doc/simgrid/examples/simdag/metaxml/sd_meta.c 2207
-./doc/simgrid/examples/simdag/2clusters.xml  14326
-./doc/simgrid/examples/simdag/sd_test2.c  7538
-./doc/simgrid/examples/simdag/platform_script.lua 1864
-./doc/simgrid/examples/simdag/simdag_trace.c  4354
-./doc/simgrid/examples/simdag/sd_test.c  6964
-./doc/simgrid/examples/simdag/dot/dot_test2.c  1622
-./doc/simgrid/examples/simdag/dot/simulate_dot.c 3590
-./doc/simgrid/examples/simdag/dot/dot_test.c  4002
-./doc/simgrid/examples/platforms/g5k.xml  17028
-./doc/simgrid/examples/platforms/One_cluster_no_backbone.xml  482
-./doc/simgrid/examples/platforms/g5k_cabinets.xml 22645
-./doc/simgrid/examples/platforms/nancy.xml  4028
-./doc/simgrid/examples/platforms/lcg_sept2004_grid.xml 15970
-./doc/simgrid/examples/platforms/Two_clusters.xml 930
-./doc/simgrid/examples/platforms/vivaldi.xml  3274
-./doc/simgrid/examples/platforms/gridpp_grid_2004.xml 6096
-./doc/simgrid/examples/platforms/griffon.xml  1879
-./doc/simgrid/examples/platforms/median_harvard.xml 28125
-./doc/simgrid/examples/platforms/prop.xml  1273
-./doc/simgrid/examples/platforms/One_cluster.xml 661
-./doc/simgrid/examples/platforms/gdx.xml  2323
-./doc/simgrid/examples/platforms/multicore_machine.xml 222
-./doc/simgrid/html/group__XBT__str.html  36192
-./doc/simgrid/html/group__XBT__cfg__decl.html  14505
-./doc/simgrid/html/bug.html 2130
-./doc/simgrid/html/group__MSG__C.html  10658
-./doc/simgrid/html/structs__xbt__strbuff__t.html 2512
-./doc/simgrid/html/MSG_ex_master_slave_lua_bypass.html 4803
-./doc/simgrid/html/simgrid_modules2.png  11932
-./doc/simgrid/html/classsimgrid_1_1msg_1_1Msg.html 1519
-./doc/simgrid/html/group__SURF__actions.html  13562
-./doc/simgrid/html/publis_intra.html  435
-./doc/simgrid/html/simgrid_logo_small.png  8326
-./doc/simgrid/html/group__SURF__resources.html  4203
-./doc/simgrid/html/structsurf__cpu__model__extension__public.html  2751
-./doc/simgrid/html/tabs.css 1095
-./doc/simgrid/html/group__XBT__set.html  6991
-./doc/simgrid/html/group__XBT__set__curs.html  9653
-./doc/simgrid/html/structxbt__ex__t.html  10014
-./doc/simgrid/html/pages.html 5794
-./doc/simgrid/html/MSG_ex_master_slave_scrip_lua.html 30160
-./doc/simgrid/html/group__XBT__API.html  6276
-./doc/simgrid/html/classsimgrid_1_1msg_1_1MsgException.html  1519
-./doc/simgrid/html/todo.html 3202
-./doc/simgrid/html/nav_f.png 159
-./doc/simgrid/html/group__XBT__queue.html  23050
-./doc/simgrid/html/group__XBT__fifo__cons.html  9876
-./doc/simgrid/html/structsurf__model.html  17707
-./doc/simgrid/html/MSG_ex_asynchronous_communications.html  43212
-./doc/simgrid/html/Paje_MSG_screenshot_thn.jpg  30326
-./doc/simgrid/html/structsurf__network__model__extension__public.html  2783
-./doc/simgrid/html/structsurf__model__description.html 2621
-./doc/simgrid/html/group__m__host__management.html 19042
-./doc/simgrid/html/group__XBT__fifo__perl.html  14045
-./doc/simgrid/html/modules.html  12734
-./doc/simgrid/html/annotated.html  7707
-./doc/simgrid/html/group__XBT__fifo.html  6191
-./doc/simgrid/html/group__XBT__parmap.html  3765
-./doc/simgrid/html/tracing.html  58483
-./doc/simgrid/html/structs__surf__metric__t.html 2523
-./doc/simgrid/html/classsimgrid_1_1msg_1_1Task.html 1519
-./doc/simgrid/html/group__XBT__swag.html  5923
-./doc/simgrid/html/functions_vars.html  11436
-./doc/simgrid/html/group__XBT__swag__type.html  8194
-./doc/simgrid/html/win_install_02.png  60084
-./doc/simgrid/html/simgrid_modules.png  8309
-./doc/simgrid/html/group__XBT__error.html  8348
-./doc/simgrid/html/group__XBT__dynar__cons.html 15743
-./doc/simgrid/html/simgrid_logo.png  21536
-./doc/simgrid/html/group__XBT__fifo__misc.html  7717
-./doc/simgrid/html/group__XBT__context.html  3460
-./doc/simgrid/html/group__m__channel__management.html 8963
-./doc/simgrid/html/structm__task.html  4188
-./doc/simgrid/html/group__XBT__swag__curs.html  8561
-./doc/simgrid/html/group__XBT__log.html  60965
-./doc/simgrid/html/open.png 118
-./doc/simgrid/html/group__msg__simulation.html  9008
-./doc/simgrid/html/group__XBT__dynar__cursor.html 11976
-./doc/simgrid/html/group__XBT__log__cats.html  5102
-./doc/simgrid/html/win_install_03.png  55802
-./doc/simgrid/html/poster_thumbnail.png  3249
-./doc/simgrid/html/group__m__datatypes__management__details.html  7557
-./doc/simgrid/html/group__XBT__set__basic.html  24314
-./doc/simgrid/html/win_install_01.png  61053
-./doc/simgrid/html/closed.png 126
-./doc/simgrid/html/group__XBT__adt.html  6958
-./doc/simgrid/html/index.html 9659
-./doc/simgrid/html/group__SD__link__management.html 17867
-./doc/simgrid/html/group__MSG__JAVA.html  5443
-./doc/simgrid/html/group__SURF__simulation.html 10385
-./doc/simgrid/html/structm__host.html  4188
-./doc/simgrid/html/group__XBT__dynar__array.html 22436
-./doc/simgrid/html/simgrid.css 386
-./doc/simgrid/html/group__SD__task__dependency__management.html  15389
-./doc/simgrid/html/group__XBT__grounding.html  7225
-./doc/simgrid/html/pls.html 11863
-./doc/simgrid/html/group__XBT__dynar__ctn.html  12693
-./doc/simgrid/html/functions.html  11564
-./doc/simgrid/html/group__XBT__dynar__speed.html 9616
-./doc/simgrid/html/installSimgrid.html  24837
-./doc/simgrid/html/triva-graph_configuration.png 59769
-./doc/simgrid/html/triva-graph_visualization.png 55335
-./doc/simgrid/html/MSG_ex_master_slave.html  51294
-./doc/simgrid/html/doxygen.png 3942
-./doc/simgrid/html/group__XBT__mallocator__cons.html 10757
-./doc/simgrid/html/group__API__index.html 125324   
-./doc/simgrid/html/group__XBT__dict__cons.html  9746
-./doc/simgrid/html/group__XBT__swag__func.html  19885
-./doc/simgrid/html/group__SimGrid__API.html  4674
-./doc/simgrid/html/group__XBT__dynar__misc.html 9591
-./doc/simgrid/html/structxbt__set__elm__.html  5121
-./doc/simgrid/html/group__XBT__cfg__get.html  19320
-./doc/simgrid/html/bindings.html  23685
-./doc/simgrid/html/group__XBT__dict.html  6916
-./doc/simgrid/html/use.html 3904
-./doc/simgrid/html/group__XBT__dict__basic.html 20935
-./doc/simgrid/html/group__XBT__graph.html  23682
-./doc/simgrid/html/group__XBT__mallocator.html  6444
-./doc/simgrid/html/structsurf__workstation__model__extension__public.html 11076
-./doc/simgrid/html/publis.html 435
-./doc/simgrid/html/group__XBT__misc.html  4663
-./doc/simgrid/html/simdag.html 226
-./doc/simgrid/html/Paje_MSG_screenshot.jpg 340759   
-./doc/simgrid/html/group__msg__gos__functions.html 65293
-./doc/simgrid/html/classsimgrid_1_1msg_1_1Host.html 1519
-./doc/simgrid/html/publis_extern.html  435
-./doc/simgrid/html/group__MSG__LUA.html  5094
-./doc/simgrid/html/group__XBT__dynar.html  14081
-./doc/simgrid/html/structs__model__type.html  2480
-./doc/simgrid/html/group__XBT__synchro.html  19296
-./doc/simgrid/html/bc_s.png 677
-./doc/simgrid/html/classes.html  6934
-./doc/simgrid/html/group__XBT__fifo__direct.html 29778
-./doc/simgrid/html/group__XBT__cfg__use.html  37757
-./doc/simgrid/html/group__XBT__mallocator__objects.html  9306
-./doc/simgrid/html/classsimgrid_1_1msg_1_1Process.html 1519
-./doc/simgrid/html/group__XBT__dict__multi.html 18525
-./doc/simgrid/html/group__m__datatypes__management.html  16459
-./doc/simgrid/html/tab_b.png 178
-./doc/simgrid/html/group__SD__simulation.html  45009
-./doc/simgrid/html/group__msg__easier__life.html 50885
-./doc/simgrid/html/group__m__task__management.html 35307
-./doc/simgrid/html/tab_a.png 140
-./doc/simgrid/html/group__XBT__config.html  16354
-./doc/simgrid/html/options.html  7629
-./doc/simgrid/html/group__XBT__dict__nnul.html  18891
-./doc/simgrid/html/win_install_04.png  52033
-./doc/simgrid/html/structsurf__action.html  8353
-./doc/simgrid/html/group__XBT__ex.html  32537
-./doc/simgrid/html/group__SURF__API.html  6659
-./doc/simgrid/html/doxygen.css 12350
-./doc/simgrid/html/group__XBT__set__cons.html  7965
-./doc/simgrid/html/group__SURF__build__api.html 7821
-./doc/simgrid/html/group__m__process__management.html 47169
-./doc/simgrid/html/group__XBT__dict__curs.html  19747
-./doc/simgrid/html/group__SD__datatypes__management.html  20816
-./doc/simgrid/html/group__SD__API.html  8379
-./doc/simgrid/html/group__SMPI__API.html  4776
-./doc/simgrid/html/group__XBT__dynar__perl.html 12131
-./doc/simgrid/html/group__XBT__cfg__register.html 15874
-./doc/simgrid/html/publis_core.html  435
-./doc/simgrid/html/group__SD__workstation__management.html  46397
-./doc/simgrid/html/MSG_ex_master_slave_lua.html 4794
-./doc/simgrid/html/group__MSG__API.html  6026
-./doc/simgrid/html/msg.html 227
-./doc/simgrid/html/group__SD__task__management.html 60347
-./doc/simgrid/html/group__XBT__syscall.html  10095
-./doc/simgrid/html/group__XBT__heap.html  18482
-./doc/simgrid/html/structsurf__action__state.html 7301
-./doc/simgrid/html/tab_s.png 189
-./doc/simgrid/html/tab_h.png 192
-./doc/simgrid/html/nav_h.png  97  
-./include/smpi/mpif.h  4826
-./include/smpi/smpif.h  1139
-./include/smpi/mpi.h  510
-./include/smpi/smpi_cocci.h 3187
-./include/smpi/smpi.h  24101
-./include/xbt/fifo.h  3626
-./include/xbt/dict.h  7459
-./include/xbt/str.h  2111
-./include/xbt/log.h  25433
-./include/xbt/misc.h  8031
-./include/xbt/synchro_core.h 4477
-./include/xbt/mmalloc.h 1976
-./include/xbt/replay_trace_reader.h  917
-./include/xbt/function_types.h  1111
-./include/xbt/strbuff.h  1281
-./include/xbt/virtu.h  684
-./include/xbt/asserts.h  1871
-./include/xbt/ex.h  23255
-./include/xbt/graph.h  5668
-./include/xbt/graphxml.h  5474
-./include/xbt/queue.h  2252
-./include/xbt/matrix.h  3027
-./include/xbt/setset.h  2422
-./include/xbt/time.h  743
-./include/xbt/lib.h  2014
-./include/xbt/hash.h  1064
-./include/xbt/set.h  4383
-./include/xbt/config.h  9224
-./include/xbt/sysdep.h  4941
-./include/xbt/swag.h  5352
-./include/xbt/graphxml_parse.h  1926
-./include/xbt/peer.h  870
-./include/xbt/module.h  648
-./include/xbt/cunit.h  5523
-./include/xbt/parmap.h  1166
-./include/xbt/mallocator.h  2296
-./include/xbt/dynar.h  9553
-./include/xbt/heap.h  1444
-./include/xbt.h  876
-./include/msg/datatypes.h 4635
-./include/msg/msg.h  12038
-./include/simgrid_config.h 3641
-./include/mc/modelchecker.h  96
-./include/surf/simgrid_dtd.h  23583
-./include/surf/surf_routing.h  1167
-./include/surf/surfxml_parse.h  5343
-./include/instr/instr.h  5750
-./include/simdag/simdag.h  10325
-./include/simdag/datatypes.h  3715
-./include/simix/simix.h  13003
-./include/simix/datatypes.h  3346
-./include/simix/context.h  4040
-./lib/libsimgrid.so.3.6.2  12710497
-./bin/smpicc  918
-./bin/smpirun  7292
-./bin/smpif2c  1990
-./bin/simgrid_update_xml  5018
-./bin/graphicator  66986
-./bin/simgrid-colorizer  2993
-./bin/smpiff  820
-./bin/tesh  356434
+/doc/simgrid/examples/cxx/autoDestination/FinalizeTask.cxx  71
+/doc/simgrid/examples/cxx/autoDestination/autoDestination_deployment.xml  1262
+/doc/simgrid/examples/cxx/autoDestination/Main.cxx  148
+/doc/simgrid/examples/cxx/autoDestination/Slave.cxx  870
+/doc/simgrid/examples/cxx/autoDestination/BasicTask.cxx  65
+/doc/simgrid/examples/cxx/autoDestination/Master.cxx  1891
+/doc/simgrid/examples/cxx/autoDestination/autoDestination_platform.xml  2133932
+/doc/simgrid/examples/cxx/autoDestination/Forwarder.cxx  1137
+/doc/simgrid/explicitDestination/FinalizeTask.cxx 71
+/doc/simgrid/examples/cxx/basic/Main.cxx  148
+/doc/simgrid/examples/cxx/basic/Slave.cxx  693
+/doc/simgrid/examples/cxx/basic/BasicTask.cxx  65
+/doc/simgrid/examples/cxx/basic/basic_platform.xml  2133932  
+/doc/simgrid/examples/cxx/basic/Master.cxx  2148
+/doc/simgrid/examples/cxx/basic/basic_deployment.xml 1188
+/doc/simgrid/examples/cxx/basic/Forwarder.cxx  1244
+/doc/simgrid/examples/cxx/explicitDestination/FinalizeTask.cxx  71
+/doc/simgrid/examples/cxx/explicitDestination/Main.cxx  148
+/doc/simgrid/examples/cxx/explicitDestination/explicitDestination_platform.xml  2133932
+/doc/simgrid/examples/cxx/explicitDestination/Slave.cxx  913
+/doc/simgrid/examples/cxx/explicitDestination/BasicTask.cxx  65
+/doc/simgrid/examples/cxx/explicitDestination/explicitDestination_deployment.xml  1188
+/doc/simgrid/examples/cxx/explicitDestination/Master.cxx  1896
+/doc/simgrid/examples/cxx/explicitDestination/Forwarder.cxx  1181
+/doc/simgrid/examples/cxx/ping_pong/Main.cxx  149
+/doc/simgrid/examples/cxx/ping_pong/Sender.cxx 1073
+/doc/simgrid/examples/cxx/ping_pong/ping_pong_deployment.xml  275
+/doc/simgrid/examples/cxx/ping_pong/ping_pong_platform.xml  4718
+/doc/simgrid/examples/cxx/ping_pong/Receiver.cxx 957
+/doc/simgrid/examples/cxx/ping_pong/PingPongTask.cxx 71
+/doc/simgrid/examples/cxx/comm_time/FinalizeTask.cxx 71
+/doc/simgrid/examples/cxx/comm_time/Main.cxx  146
+/doc/simgrid/examples/cxx/comm_time/CommTimeTask.cxx 71
+/doc/simgrid/examples/cxx/comm_time/Slave.cxx  889
+/doc/simgrid/examples/cxx/comm_time/comm_time_platform.xml  2133932
+/doc/simgrid/examples/cxx/comm_time/Master.cxx  1730
+/doc/simgrid/examples/cxx/comm_time/comm_time_deployment.xml  1884
+/doc/simgrid/examples/cxx/suspend/Main.cxx  150
+/doc/simgrid/examples/cxx/suspend/suspend_platform.xml  2133932
+/doc/simgrid/examples/cxx/suspend/suspend_deployment.xml  187
+/doc/simgrid/examples/cxx/suspend/DreamMaster.cxx 826
+/doc/simgrid/examples/cxx/suspend/LazyGuy.cxx  429
+/doc/simgrid/examples/smpi/mc_bugged2.c  1387
+/doc/simgrid/examples/smpi/scatter.c  3496
+/doc/simgrid/examples/smpi/mc_bugged1.c  1411
+/doc/simgrid/examples/smpi/get_processor_name.c  649
+/doc/simgrid/examples/smpi/NAS/README  1857
+/doc/simgrid/examples/smpi/NAS/EP-sampling/README  347
+/doc/simgrid/examples/smpi/NAS/EP-sampling/randlc.c  3300
+/doc/simgrid/examples/smpi/NAS/EP-sampling/ep.c  13723
+/doc/simgrid/examples/smpi/NAS/EP-trace/README  347
+/doc/simgrid/examples/smpi/NAS/EP-trace/randlc.c  3300
+/doc/simgrid/examples/smpi/NAS/EP-trace/ep-trace.c  13850
+/doc/simgrid/examples/smpi/NAS/config/NAS.samples/README  394
+/doc/simgrid/examples/smpi/NAS/IS-trace/is-trace.c 38276
+/doc/simgrid/examples/smpi/NAS/DT-trace/README 999
+/doc/simgrid/examples/smpi/NAS/DT-trace/DGraph.c 5451
+/doc/simgrid/examples/smpi/NAS/DT-trace/dt.c  23031
+/doc/simgrid/examples/smpi/NAS/IS/is.c  38077
+/doc/simgrid/examples/smpi/NAS/MPI_dummy/README 2406
+/doc/simgrid/examples/smpi/NAS/MPI_dummy/mpi_dummy.c 5660
+/doc/simgrid/examples/smpi/NAS/MPI_dummy/wtime_sgi64.c  1700
+/doc/simgrid/examples/smpi/NAS/MPI_dummy/wtime.c 228
+/doc/simgrid/examples/smpi/NAS/common/randdp.c 1441
+/doc/simgrid/examples/smpi/NAS/common/c_timers.c 1159
+/doc/simgrid/examples/smpi/NAS/common/c_print_results.c  3086
+/doc/simgrid/examples/smpi/NAS/sys/README  1461
+/doc/simgrid/examples/smpi/NAS/sys/setparams.c 38805
+/doc/simgrid/examples/smpi/NAS/SP/README  926
+/doc/simgrid/examples/smpi/NAS/FT/README  276
+/doc/simgrid/examples/smpi/NAS/DT/README  999
+/doc/simgrid/examples/smpi/NAS/DT/DGraph.c  5451
+/doc/simgrid/examples/smpi/NAS/DT/dt.c  22620
+/doc/simgrid/examples/smpi/NAS/EP/README  347
+/doc/simgrid/examples/smpi/NAS/EP/randlc.c  3300
+/doc/simgrid/examples/smpi/NAS/EP/ep.c  13688
+/doc/simgrid/examples/smpi/NAS/DT-folding/README 999
+/doc/simgrid/examples/smpi/NAS/DT-folding/DGraph.c 5451
+/doc/simgrid/examples/smpi/NAS/DT-folding/dt.c 22704
+/doc/simgrid/examples/smpi/NAS/MG/README  5465
+/doc/simgrid/examples/smpi/bcast.c  983
+/doc/simgrid/examples/smpi/compute2.c  628
+/doc/simgrid/examples/smpi/sendrecv.c  1652
+/doc/simgrid/examples/smpi/allreduce.c  2135
+/doc/simgrid/examples/smpi/mvmul.c  7069
+/doc/simgrid/examples/smpi/alltoallv.c  4441
+/doc/simgrid/examples/smpi/smpi_traced.c  8529
+/doc/simgrid/examples/smpi/compute3.c  816
+/doc/simgrid/examples/smpi/reduce.c  3545
+/doc/simgrid/examples/smpi/bcbench.c  2466
+/doc/simgrid/examples/smpi/ttest01.c  1273
+/doc/simgrid/examples/smpi/compute.c  622
+/doc/simgrid/examples/smpi/barrier.c  766
+/doc/simgrid/examples/smpi/alltoall_basic.c  1453
+/doc/simgrid/examples/smpi/pingpong.c  2286
+/doc/simgrid/examples/smpi/alltoall2.c  2799
+/doc/simgrid/examples/smpi/split.c  705
+/doc/simgrid/examples/xbt/sem_basic.c  1970
+/doc/simgrid/examples/xbt/sem_sched.c  7207
+/doc/simgrid/examples/msg/small_platform.xml  4582
+/doc/simgrid/examples/msg/README  4805
+/doc/simgrid/examples/msg/properties/deployment_properties.xml  272
+/doc/simgrid/examples/msg/properties/msg_prop.c 3853
+/doc/simgrid/examples/msg/ns3/3links-p.xml  856
+/doc/simgrid/examples/msg/ns3/dogbone-d.xml  582
+/doc/simgrid/examples/msg/ns3/Two_clusters.xml 1817
+/doc/simgrid/examples/msg/ns3/3links-d.xml  927
+/doc/simgrid/examples/msg/ns3/3links-d-timer.xml 1280
+/doc/simgrid/examples/msg/ns3/ns3.c  5177
+/doc/simgrid/examples/msg/ns3/Two_clusters-d.xml 369
+/doc/simgrid/examples/msg/ns3/One_cluster-d.xml 367
+/doc/simgrid/examples/msg/ns3/dogbone-p.xml  1497
+/doc/simgrid/examples/msg/ns3/3hosts_2links_p.xml 566
+/doc/simgrid/examples/msg/ns3/3hosts_2links_d.xml 352
+/doc/simgrid/examples/msg/ns3/One_cluster.xml  658
+/doc/simgrid/examples/msg/migration/migration.c 2922
+/doc/simgrid/examples/msg/small_platform_with_failures.xml  4746
+/doc/simgrid/examples/msg/icomms/small_platform.xml 972
+/doc/simgrid/examples/msg/icomms/deployment_peer.xml 678
+/doc/simgrid/examples/msg/icomms/deployment_peer05.xml  891
+/doc/simgrid/examples/msg/icomms/deployment_peer02.xml  855
+/doc/simgrid/examples/msg/icomms/peer2.c  4276
+/doc/simgrid/examples/msg/icomms/deployment_peer03.xml  851
+/doc/simgrid/examples/msg/icomms/deployment_peer04.xml  852
+/doc/simgrid/examples/msg/icomms/peer.c  5102
+/doc/simgrid/examples/msg/icomms/deployment_peer01.xml  855
+/doc/simgrid/examples/msg/icomms/peer3.c  5258
+/doc/simgrid/examples/msg/parallel_task/test_ptask_deployment.xml  654
+/doc/simgrid/examples/msg/parallel_task/test_ptask.c 5423
+/doc/simgrid/examples/msg/parallel_task/test_ptask_platform.xml  2380
+/doc/simgrid/examples/msg/parallel_task/parallel_task.c  2708
+/doc/simgrid/examples/msg/alias/masterslave_forwarder_with_alias.c  6217
+/doc/simgrid/examples/msg/trace/test9.xml  598
+/doc/simgrid/examples/msg/trace/test3.xml  372
+/doc/simgrid/examples/msg/trace/test_trace_integration.xml  206
+/doc/simgrid/examples/msg/trace/test2.xml  370
+/doc/simgrid/examples/msg/trace/test7.xml  501
+/doc/simgrid/examples/msg/trace/test11.xml  683
+/doc/simgrid/examples/msg/trace/test4.xml  371
+/doc/simgrid/examples/msg/trace/test10.xml  598
+/doc/simgrid/examples/msg/trace/test6.xml  372
+/doc/simgrid/examples/msg/trace/test8.xml  498
+/doc/simgrid/examples/msg/trace/test5.xml  371
+/doc/simgrid/examples/msg/trace/test_trace_integration.c  1960
+/doc/simgrid/examples/msg/trace/test1.xml  366
+/doc/simgrid/examples/msg/parallel_contexts/pcontexts_platform.xml  1002
+/doc/simgrid/examples/msg/parallel_contexts/deployment_pcontexts2_4.xml 467
+/doc/simgrid/examples/msg/parallel_contexts/pcontexts2.c  2236
+/doc/simgrid/examples/msg/parallel_contexts/deployment_pcontexts_2.xml 242
+/doc/simgrid/examples/msg/parallel_contexts/deployment_pcontexts_4.xml 353
+/doc/simgrid/examples/msg/parallel_contexts/pcontexts.c  1752
+/doc/simgrid/examples/msg/tracing/deployment.xml 800
+/doc/simgrid/examples/msg/tracing/ms.c  4374
+/doc/simgrid/examples/msg/tracing/platform.xml 3930
+/doc/simgrid/examples/msg/tracing/tasks.c  3594
+/doc/simgrid/examples/msg/tracing/procmig-deploy.xml 223
+/doc/simgrid/examples/msg/tracing/procmig.c  3282
+/doc/simgrid/examples/msg/tracing/categories.c 3358
+/doc/simgrid/examples/msg/sendrecv/README  689
+/doc/simgrid/examples/msg/sendrecv/deployment_sendrecv.xml  321
+/doc/simgrid/examples/msg/sendrecv/sendrecv.c  5098
+/doc/simgrid/examples/msg/sendrecv/platform_sendrecv.xml  528
+/doc/simgrid/examples/msg/gtnets/onelink-p.xml 439
+/doc/simgrid/examples/msg/gtnets/fullduplex-p.xml 575
+/doc/simgrid/examples/msg/gtnets/dogbone-d.xml 576
+/doc/simgrid/examples/msg/gtnets/waxman-d.xml  46642
+/doc/simgrid/examples/msg/gtnets/waxman-p.xml 4964600  
+/doc/simgrid/examples/msg/gtnets/fullduplex-d.xml 1029
+/doc/simgrid/examples/msg/gtnets/onelink-d.xml 356
+/doc/simgrid/examples/msg/gtnets/gtnets.c  6172
+/doc/simgrid/examples/msg/gtnets/dogbone-p.xml 1482
+/doc/simgrid/examples/msg/pmm/msg_pmm.c  9688
+/doc/simgrid/examples/msg/pmm/pmm_9_deploy.xml 786
+/doc/simgrid/examples/msg/mc/bugged1.c  1378
+/doc/simgrid/examples/msg/mc/deploy_bugged3.xml 377
+/doc/simgrid/examples/msg/mc/deploy_mutex.xml  925
+/doc/simgrid/examples/msg/mc/platform.xml  876
+/doc/simgrid/examples/msg/mc/deploy_bugged2.xml 377
+/doc/simgrid/examples/msg/mc/random_test.c  563
+/doc/simgrid/examples/msg/mc/deploy_bugged1.xml 459
+/doc/simgrid/examples/msg/mc/bugged3.c  1827
+/doc/simgrid/examples/msg/mc/deploy_random_test.xml 468
+/doc/simgrid/examples/msg/mc/bugged2.c  1957
+/doc/simgrid/examples/msg/mc/centralized_mutex.c 3375
+/doc/simgrid/examples/msg/token_ring/two_clusters.xml 1007
+/doc/simgrid/examples/msg/token_ring/ring_call.c 4205
+/doc/simgrid/examples/msg/token_ring/two_peers.xml 556
+/doc/simgrid/examples/msg/msg_platform.xml 2261806  
+/doc/simgrid/examples/msg/priority/deployment_priority.xml  406
+/doc/simgrid/examples/msg/priority/priority.c  2394
+/doc/simgrid/examples/msg/actions/actions.c  19339
+/doc/simgrid/examples/msg/actions/deployment.xml 249
+/doc/simgrid/examples/msg/actions/NAS_LU_S_4/platform_flat.xml  6805
+/doc/simgrid/examples/msg/actions/NAS_LU_S_4/platform.xml  387
+/doc/simgrid/examples/msg/actions/NAS_LU_S_4/deploy_MPI_4.xml  605
+/doc/simgrid/examples/msg/actions/sim.0.bordereau.lu.b.8/toto.xml  1066
+/doc/simgrid/examples/msg/actions/sim.0.bordereau.lu.b.8/titi.xml  1066
+/doc/simgrid/examples/msg/actions/deployment_split.xml  525
+/doc/simgrid/examples/msg/actions/homogeneous_3_hosts.xml  906
+/doc/simgrid/examples/msg/actions/bcast_deployment.xml  224
+/doc/simgrid/examples/msg/actions/actions_deployment_split.xml  501
+/doc/simgrid/examples/msg/masterslave/masterslave_bypass.c  9082
+/doc/simgrid/examples/msg/masterslave/deployment_masterslave_mailbox.xml 990
+/doc/simgrid/examples/msg/masterslave/masterslave_cluster.c  6773
+/doc/simgrid/examples/msg/masterslave/masterslave_console.c  3952
+/doc/simgrid/examples/msg/masterslave/platform_clusters.xml  930
+/doc/simgrid/examples/msg/masterslave/deployment_masterslave_mailbox_multicore.xml  1078
+/doc/simgrid/examples/msg/masterslave/masterslave_failure.c  7120
+/doc/simgrid/examples/msg/masterslave/deployment_masterslave_vivaldi.xml 4170
+/doc/simgrid/examples/msg/masterslave/deployment_masterslave_forwarder.xml 1382
+/doc/simgrid/examples/msg/masterslave/masterslave_forwarder.c  6438
+/doc/simgrid/examples/msg/masterslave/platform_script.lua  2535
+/doc/simgrid/examples/msg/masterslave/deployment_masterslave.xml  998
+/doc/simgrid/examples/msg/masterslave/jumbo_deployment.xml  6805
+/doc/simgrid/examples/msg/masterslave/jumbo_deployment_masterslave_mailbox.xml  878
+/doc/simgrid/examples/msg/masterslave/masterslave_mailbox.c  4118
+/doc/simgrid/examples/msg/suspend/suspend.c  2692
+/doc/simgrid/examples/msg/suspend/deployment_suspend.xml  183
+/doc/simgrid/examples/msg/small_platform_with_routers.xml  5295
+/doc/simgrid/examples/msg/chord/chord90.xml  13992
+/doc/simgrid/examples/msg/chord/chord.xml  2236
+/doc/simgrid/examples/msg/chord/chord10k.xml 1624671  
+/doc/simgrid/examples/msg/chord/chord.c  28995
+/doc/simgrid/examples/lua/multi_matrix/quicksort_platform.xml  4628
+/doc/simgrid/examples/lua/multi_matrix/mult_matrix.lua  227
+/doc/simgrid/examples/lua/multi_matrix/receiver.lua 1199
+/doc/simgrid/examples/lua/multi_matrix/quicksort_deployment.xml  524
+/doc/simgrid/examples/lua/multi_matrix/sender.lua 748
+/doc/simgrid/examples/lua/mult_matrix.lua  2196
+/doc/simgrid/examples/lua/README  1416
+/doc/simgrid/examples/lua/deploy.xml  879
+/doc/simgrid/examples/lua/splaySim/master.lua  1125
+/doc/simgrid/examples/lua/splaySim/slave.lua  729
+/doc/simgrid/examples/lua/splaySim/splay_platform.lua 1950
+/doc/simgrid/examples/lua/splaySim/splay_ctrl.lua 304
+/doc/simgrid/examples/lua/splaySim/splay_deploy_masterslave.lua  487
+/doc/simgrid/examples/lua/tracing/master.lua  1390
+/doc/simgrid/examples/lua/tracing/slave.lua  713
+/doc/simgrid/examples/lua/tracing/master_slave_trace.lua  491
+/doc/simgrid/examples/lua/SimSplay/sim_splay.lua 2298
+/doc/simgrid/examples/lua/SimSplay/splay_school.lua 402
+/doc/simgrid/examples/lua/SimSplay/chord.lua  1906
+/doc/simgrid/examples/lua/SimSplay/platform_script.lua  1706
+/doc/simgrid/examples/lua/console/master.lua  1125
+/doc/simgrid/examples/lua/console/deploy.lua  480
+/doc/simgrid/examples/lua/console/slave.lua  730
+/doc/simgrid/examples/lua/console/platform.lua 2424
+/doc/simgrid/examples/lua/console/master_slave_bypass.lua  158
+/doc/simgrid/examples/lua/masterslave/master.lua 1125
+/doc/simgrid/examples/lua/masterslave/slave.lua 730
+/doc/simgrid/examples/lua/masterslave/platform.lua 2424
+/doc/simgrid/examples/lua/masterslave/master_slave.lua  378
+/doc/simgrid/examples/simdag/properties/sd_prop.c 3012
+/doc/simgrid/examples/simdag/dax/Strassen.xml  9663
+/doc/simgrid/examples/simdag/dax/Montage_25.xml 23087
+/doc/simgrid/examples/simdag/dax/Sipht_30.xml 267014   
+/doc/simgrid/examples/simdag/dax/dax_test.c  4346
+/doc/simgrid/examples/simdag/dax/Montage_50.xml 48868
+/doc/simgrid/examples/simdag/dax/Inspiral_30.xml 28774
+/doc/simgrid/examples/simdag/dax/sagittaire.xml 289
+/doc/simgrid/examples/simdag/scheduling/minmin_test.c 11328
+/doc/simgrid/examples/simdag/scheduling/Montage_25.xml  23087
+/doc/simgrid/examples/simdag/scheduling/simulacrum_7_hosts.xml  5670
+/doc/simgrid/examples/simdag/sd_seq_access.c  4153
+/doc/simgrid/examples/simdag/sd_test_console.c 6976
+/doc/simgrid/examples/simdag/metaxml/sd_meta.c 2207
+/doc/simgrid/examples/simdag/2clusters.xml  14326
+/doc/simgrid/examples/simdag/sd_test2.c  7538
+/doc/simgrid/examples/simdag/platform_script.lua 1864
+/doc/simgrid/examples/simdag/simdag_trace.c  4354
+/doc/simgrid/examples/simdag/sd_test.c  6964
+/doc/simgrid/examples/simdag/dot/dot_test2.c  1622
+/doc/simgrid/examples/simdag/dot/simulate_dot.c 3590
+/doc/simgrid/examples/simdag/dot/dot_test.c  4002
+/doc/simgrid/examples/platforms/g5k.xml  17028
+/doc/simgrid/examples/platforms/One_cluster_no_backbone.xml  482
+/doc/simgrid/examples/platforms/g5k_cabinets.xml 22645
+/doc/simgrid/examples/platforms/nancy.xml  4028
+/doc/simgrid/examples/platforms/lcg_sept2004_grid.xml 15970
+/doc/simgrid/examples/platforms/Two_clusters.xml 930
+/doc/simgrid/examples/platforms/vivaldi.xml  3274
+/doc/simgrid/examples/platforms/gridpp_grid_2004.xml 6096
+/doc/simgrid/examples/platforms/griffon.xml  1879
+/doc/simgrid/examples/platforms/median_harvard.xml 28125
+/doc/simgrid/examples/platforms/prop.xml  1273
+/doc/simgrid/examples/platforms/One_cluster.xml 661
+/doc/simgrid/examples/platforms/gdx.xml  2323
+/doc/simgrid/examples/platforms/multicore_machine.xml 222
+/doc/simgrid/html/group__XBT__str.html  36192
+/doc/simgrid/html/group__XBT__cfg__decl.html  14505
+/doc/simgrid/html/bug.html 2130
+/doc/simgrid/html/group__MSG__C.html  10658
+/doc/simgrid/html/structs__xbt__strbuff__t.html 2512
+/doc/simgrid/html/MSG_ex_master_slave_lua_bypass.html 4803
+/doc/simgrid/html/simgrid_modules2.png  11932
+/doc/simgrid/html/classsimgrid_1_1msg_1_1Msg.html 1519
+/doc/simgrid/html/group__SURF__actions.html  13562
+/doc/simgrid/html/publis_intra.html  435
+/doc/simgrid/html/simgrid_logo_small.png  8326
+/doc/simgrid/html/group__SURF__resources.html  4203
+/doc/simgrid/html/structsurf__cpu__model__extension__public.html  2751
+/doc/simgrid/html/tabs.css 1095
+/doc/simgrid/html/group__XBT__set.html  6991
+/doc/simgrid/html/group__XBT__set__curs.html  9653
+/doc/simgrid/html/structxbt__ex__t.html  10014
+/doc/simgrid/html/pages.html 5794
+/doc/simgrid/html/MSG_ex_master_slave_scrip_lua.html 30160
+/doc/simgrid/html/group__XBT__API.html  6276
+/doc/simgrid/html/classsimgrid_1_1msg_1_1MsgException.html  1519
+/doc/simgrid/html/todo.html 3202
+/doc/simgrid/html/nav_f.png 159
+/doc/simgrid/html/group__XBT__queue.html  23050
+/doc/simgrid/html/group__XBT__fifo__cons.html  9876
+/doc/simgrid/html/structsurf__model.html  17707
+/doc/simgrid/html/MSG_ex_asynchronous_communications.html  43212
+/doc/simgrid/html/Paje_MSG_screenshot_thn.jpg  30326
+/doc/simgrid/html/structsurf__network__model__extension__public.html  2783
+/doc/simgrid/html/structsurf__model__description.html 2621
+/doc/simgrid/html/group__m__host__management.html 19042
+/doc/simgrid/html/group__XBT__fifo__perl.html  14045
+/doc/simgrid/html/modules.html  12734
+/doc/simgrid/html/annotated.html  7707
+/doc/simgrid/html/group__XBT__fifo.html  6191
+/doc/simgrid/html/group__XBT__parmap.html  3765
+/doc/simgrid/html/tracing.html  58483
+/doc/simgrid/html/structs__surf__metric__t.html 2523
+/doc/simgrid/html/classsimgrid_1_1msg_1_1Task.html 1519
+/doc/simgrid/html/group__XBT__swag.html  5923
+/doc/simgrid/html/functions_vars.html  11436
+/doc/simgrid/html/group__XBT__swag__type.html  8194
+/doc/simgrid/html/win_install_02.png  60084
+/doc/simgrid/html/simgrid_modules.png  8309
+/doc/simgrid/html/group__XBT__error.html  8348
+/doc/simgrid/html/group__XBT__dynar__cons.html 15743
+/doc/simgrid/html/simgrid_logo.png  21536
+/doc/simgrid/html/group__XBT__fifo__misc.html  7717
+/doc/simgrid/html/group__XBT__context.html  3460
+/doc/simgrid/html/group__m__channel__management.html 8963
+/doc/simgrid/html/structm__task.html  4188
+/doc/simgrid/html/group__XBT__swag__curs.html  8561
+/doc/simgrid/html/group__XBT__log.html  60965
+/doc/simgrid/html/open.png 118
+/doc/simgrid/html/group__msg__simulation.html  9008
+/doc/simgrid/html/group__XBT__dynar__cursor.html 11976
+/doc/simgrid/html/group__XBT__log__cats.html  5102
+/doc/simgrid/html/win_install_03.png  55802
+/doc/simgrid/html/poster_thumbnail.png  3249
+/doc/simgrid/html/group__m__datatypes__management__details.html  7557
+/doc/simgrid/html/group__XBT__set__basic.html  24314
+/doc/simgrid/html/win_install_01.png  61053
+/doc/simgrid/html/closed.png 126
+/doc/simgrid/html/group__XBT__adt.html  6958
+/doc/simgrid/html/index.html 9659
+/doc/simgrid/html/group__SD__link__management.html 17867
+/doc/simgrid/html/group__MSG__JAVA.html  5443
+/doc/simgrid/html/group__SURF__simulation.html 10385
+/doc/simgrid/html/structm__host.html  4188
+/doc/simgrid/html/group__XBT__dynar__array.html 22436
+/doc/simgrid/html/simgrid.css 386
+/doc/simgrid/html/group__SD__task__dependency__management.html  15389
+/doc/simgrid/html/group__XBT__grounding.html  7225
+/doc/simgrid/html/pls.html 11863
+/doc/simgrid/html/group__XBT__dynar__ctn.html  12693
+/doc/simgrid/html/functions.html  11564
+/doc/simgrid/html/group__XBT__dynar__speed.html 9616
+/doc/simgrid/html/installSimgrid.html  24837
+/doc/simgrid/html/triva-graph_configuration.png 59769
+/doc/simgrid/html/triva-graph_visualization.png 55335
+/doc/simgrid/html/MSG_ex_master_slave.html  51294
+/doc/simgrid/html/doxygen.png 3942
+/doc/simgrid/html/group__XBT__mallocator__cons.html 10757
+/doc/simgrid/html/group__API__index.html 125324   
+/doc/simgrid/html/group__XBT__dict__cons.html  9746
+/doc/simgrid/html/group__XBT__swag__func.html  19885
+/doc/simgrid/html/group__SimGrid__API.html  4674
+/doc/simgrid/html/group__XBT__dynar__misc.html 9591
+/doc/simgrid/html/structxbt__set__elm__.html  5121
+/doc/simgrid/html/group__XBT__cfg__get.html  19320
+/doc/simgrid/html/bindings.html  23685
+/doc/simgrid/html/group__XBT__dict.html  6916
+/doc/simgrid/html/use.html 3904
+/doc/simgrid/html/group__XBT__dict__basic.html 20935
+/doc/simgrid/html/group__XBT__graph.html  23682
+/doc/simgrid/html/group__XBT__mallocator.html  6444
+/doc/simgrid/html/structsurf__workstation__model__extension__public.html 11076
+/doc/simgrid/html/publis.html 435
+/doc/simgrid/html/group__XBT__misc.html  4663
+/doc/simgrid/html/simdag.html 226
+/doc/simgrid/html/Paje_MSG_screenshot.jpg 340759   
+/doc/simgrid/html/group__msg__gos__functions.html 65293
+/doc/simgrid/html/classsimgrid_1_1msg_1_1Host.html 1519
+/doc/simgrid/html/publis_extern.html  435
+/doc/simgrid/html/group__MSG__LUA.html  5094
+/doc/simgrid/html/group__XBT__dynar.html  14081
+/doc/simgrid/html/structs__model__type.html  2480
+/doc/simgrid/html/group__XBT__synchro.html  19296
+/doc/simgrid/html/bc_s.png 677
+/doc/simgrid/html/classes.html  6934
+/doc/simgrid/html/group__XBT__fifo__direct.html 29778
+/doc/simgrid/html/group__XBT__cfg__use.html  37757
+/doc/simgrid/html/group__XBT__mallocator__objects.html  9306
+/doc/simgrid/html/classsimgrid_1_1msg_1_1Process.html 1519
+/doc/simgrid/html/group__XBT__dict__multi.html 18525
+/doc/simgrid/html/group__m__datatypes__management.html  16459
+/doc/simgrid/html/tab_b.png 178
+/doc/simgrid/html/group__SD__simulation.html  45009
+/doc/simgrid/html/group__msg__easier__life.html 50885
+/doc/simgrid/html/group__m__task__management.html 35307
+/doc/simgrid/html/tab_a.png 140
+/doc/simgrid/html/group__XBT__config.html  16354
+/doc/simgrid/html/options.html  7629
+/doc/simgrid/html/group__XBT__dict__nnul.html  18891
+/doc/simgrid/html/win_install_04.png  52033
+/doc/simgrid/html/structsurf__action.html  8353
+/doc/simgrid/html/group__XBT__ex.html  32537
+/doc/simgrid/html/group__SURF__API.html  6659
+/doc/simgrid/html/doxygen.css 12350
+/doc/simgrid/html/group__XBT__set__cons.html  7965
+/doc/simgrid/html/group__SURF__build__api.html 7821
+/doc/simgrid/html/group__m__process__management.html 47169
+/doc/simgrid/html/group__XBT__dict__curs.html  19747
+/doc/simgrid/html/group__SD__datatypes__management.html  20816
+/doc/simgrid/html/group__SD__API.html  8379
+/doc/simgrid/html/group__SMPI__API.html  4776
+/doc/simgrid/html/group__XBT__dynar__perl.html 12131
+/doc/simgrid/html/group__XBT__cfg__register.html 15874
+/doc/simgrid/html/publis_core.html  435
+/doc/simgrid/html/group__SD__workstation__management.html  46397
+/doc/simgrid/html/MSG_ex_master_slave_lua.html 4794
+/doc/simgrid/html/group__MSG__API.html  6026
+/doc/simgrid/html/msg.html 227
+/doc/simgrid/html/group__SD__task__management.html 60347
+/doc/simgrid/html/group__XBT__syscall.html  10095
+/doc/simgrid/html/group__XBT__heap.html  18482
+/doc/simgrid/html/structsurf__action__state.html 7301
+/doc/simgrid/html/tab_s.png 189
+/doc/simgrid/html/tab_h.png 192
+/doc/simgrid/html/nav_h.png  97  
+/include/smpi/mpif.h  4826
+/include/smpi/smpif.h  1139
+/include/smpi/mpi.h  510
+/include/smpi/smpi_cocci.h 3187
+/include/smpi/smpi.h  24101
+/include/xbt/fifo.h  3626
+/include/xbt/dict.h  7459
+/include/xbt/str.h  2111
+/include/xbt/log.h  25433
+/include/xbt/misc.h  8031
+/include/xbt/synchro_core.h 4477
+/include/xbt/mmalloc.h 1976
+/include/xbt/replay_trace_reader.h  917
+/include/xbt/function_types.h  1111
+/include/xbt/strbuff.h  1281
+/include/xbt/virtu.h  684
+/include/xbt/asserts.h  1871
+/include/xbt/ex.h  23255
+/include/xbt/graph.h  5668
+/include/xbt/graphxml.h  5474
+/include/xbt/queue.h  2252
+/include/xbt/matrix.h  3027
+/include/xbt/setset.h  2422
+/include/xbt/time.h  743
+/include/xbt/lib.h  2014
+/include/xbt/hash.h  1064
+/include/xbt/set.h  4383
+/include/xbt/config.h  9224
+/include/xbt/sysdep.h  4941
+/include/xbt/swag.h  5352
+/include/xbt/graphxml_parse.h  1926
+/include/xbt/peer.h  870
+/include/xbt/module.h  648
+/include/xbt/cunit.h  5523
+/include/xbt/parmap.h  1166
+/include/xbt/mallocator.h  2296
+/include/xbt/dynar.h  9553
+/include/xbt/heap.h  1444
+/include/xbt.h  876
+/include/msg/datatypes.h 4635
+/include/msg/msg.h  12038
+/include/simgrid_config.h 3641
+/include/mc/modelchecker.h  96
+/include/surf/simgrid_dtd.h  23583
+/include/surf/surf_routing.h  1167
+/include/surf/surfxml_parse.h  5343
+/include/instr/instr.h  5750
+/include/simdag/simdag.h  10325
+/include/simdag/datatypes.h  3715
+/include/simix/simix.h  13003
+/include/simix/datatypes.h  3346
+/include/simix/context.h  4040
+/lib/libsimgrid.so.3.6.2  12710497
+/bin/smpicc  918
+/bin/smpirun  7292
+/bin/smpif2c  1990
+/bin/simgrid_update_xml  5018
+/bin/graphicator  66986
+/bin/simgrid-colorizer  2993
+/bin/smpiff  820
+/bin/tesh  356434
index cf109af..48972ca 100644 (file)
@@ -1,36 +1,36 @@
-.\Windows\avastSS.scr 41664\r
-.\Windows\bfsvc.exe 75264\r
-.\Windows\bootstat.dat 67584\r
-.\Windows\CoreSingleLanguage.xml 31497\r
-.\Windows\csup.txt 12\r
-.\Windows\dchcfg64.exe 335464\r
-.\Windows\dcmdev64.exe 93288\r
-.\Windows\DirectX.log 10486\r
-.\Windows\DPINST.LOG 18944\r
-.\Windows\DtcInstall.log 1955\r
-.\Windows\explorer.exe 2380944\r
-.\Windows\font1.sii 4907\r
-.\Windows\font2.sii 8698\r
-.\Windows\hapint.exe 382056\r
-.\Windows\HelpPane.exe 883712\r
-.\Windows\hh.exe 17408\r
-.\Windows\MEMORY.DMP 2384027342\r
-.\Windows\mib.bin 43131\r
-.\Windows\notepad.exe 243712\r
-.\Windows\PFRO.log 6770\r
-.\Windows\Professional.xml 31881\r
-.\Windows\regedit.exe 159232\r
-.\Windows\setupact.log 101663\r
-.\Windows\setuperr.log 0\r
-.\Windows\splwow64.exe 126464\r
-.\Windows\Starter.xml 31537\r
-.\Windows\system.ini 219\r
-.\Windows\twain_32.dll 50176\r
-.\Windows\vmgcoinstall.log 1585\r
-.\Windows\win.ini 92\r
-.\Windows\WindowsUpdate.log 1518934\r
-.\Windows\winhlp32.exe 10752\r
-.\Windows\WLXPGSS.SCR 322048\r
-.\Windows\WMSysPr9.prx 316640\r
-.\Windows\write.exe 10752\r
-.\Windows\_isusr32.dll 180320
\ No newline at end of file
+\Windows\avastSS.scr 41664\r
+\Windows\bfsvc.exe 75264\r
+\Windows\bootstat.dat 67584\r
+\Windows\CoreSingleLanguage.xml 31497\r
+\Windows\csup.txt 12\r
+\Windows\dchcfg64.exe 335464\r
+\Windows\dcmdev64.exe 93288\r
+\Windows\DirectX.log 10486\r
+\Windows\DPINST.LOG 18944\r
+\Windows\DtcInstall.log 1955\r
+\Windows\explorer.exe 2380944\r
+\Windows\font1.sii 4907\r
+\Windows\font2.sii 8698\r
+\Windows\hapint.exe 382056\r
+\Windows\HelpPane.exe 883712\r
+\Windows\hh.exe 17408\r
+\Windows\MEMORY.DMP 2384027342\r
+\Windows\mib.bin 43131\r
+\Windows\notepad.exe 243712\r
+\Windows\PFRO.log 6770\r
+\Windows\Professional.xml 31881\r
+\Windows\regedit.exe 159232\r
+\Windows\setupact.log 101663\r
+\Windows\setuperr.log 0\r
+\Windows\splwow64.exe 126464\r
+\Windows\Starter.xml 31537\r
+\Windows\system.ini 219\r
+\Windows\twain_32.dll 50176\r
+\Windows\vmgcoinstall.log 1585\r
+\Windows\win.ini 92\r
+\Windows\WindowsUpdate.log 1518934\r
+\Windows\winhlp32.exe 10752\r
+\Windows\WLXPGSS.SCR 322048\r
+\Windows\WMSysPr9.prx 316640\r
+\Windows\write.exe 10752\r
+\Windows\_isusr32.dll 180320
\ No newline at end of file
index 7f755de..988e40b 100644 (file)
       <model_prop id="Bconnection" value="220MBps" />
    </storage_type>
 
-    <storage id="Disk1" typeId="single_HDD" />
+    <storage id="Disk1" typeId="single_HDD" attach="bob" />
     <storage id="Disk2" typeId="single_SSD"
              content="content/win_storage_content.txt"
-             content_type="txt_windows" />
-    <storage id="Disk3" typeId="single_HDD" />
+             content_type="txt_windows" attach="alice" />
+    <storage id="Disk3" typeId="single_HDD" attach="carl" />
     <storage id="Disk4" typeId="single_SSD"
              content="content/small_content.txt"
-             content_type="txt_unix" />
+             content_type="txt_unix" attach="denise"/>
 
     <host id="bob" power="1Gf">
       <mount storageId="Disk1" name="/home"/>
     </host>
 
     <host id="alice" power="1Gf">
-      <mount storageId="Disk2" name="/windows"/>
+      <mount storageId="Disk2" name="c:"/>
     </host>
 
     <host id="carl" power="1Gf">
@@ -45,7 +45,7 @@
     </host>
 
     <host id="denise" power="1Gf">
-      <mount storageId="Disk2" name="/windows"/>       
+      <mount storageId="Disk2" name="c:"/>     
       <mount storageId="Disk4" name="/home"/>  
     </host>
 
index 928bd2e..2f2ceed 100644 (file)
@@ -1,8 +1,8 @@
 #! ./tesh
 
 $ ${bindir:=.}/io/sd_io ${srcdir:=.}/examples/platforms/storage.xml 
+> [0.000000] [sd_io/INFO] Workstation 'denise' mounts 'c:'
 > [0.000000] [sd_io/INFO] Workstation 'denise' mounts '/home'
-> [0.000000] [sd_io/INFO] Workstation 'denise' mounts '/windows'
-> [0.000000] [sd_io/INFO] Workstation 'alice' mounts '/windows'
+> [0.000000] [sd_io/INFO] Workstation 'alice' mounts 'c:'
 > [0.000000] [sd_io/INFO] Workstation 'carl' mounts '/home'
 > [0.000000] [sd_io/INFO] Workstation 'bob' mounts '/home'
index 9d62bc6..990144f 100644 (file)
@@ -32,7 +32,7 @@ int main(int argc, char **argv)
   total_nworkstations = SD_workstation_get_number();
 
   for (ctr=0; ctr<total_nworkstations;ctr++){
-    current_storage_list = SD_workstation_get_storage_list(workstations[ctr]);
+    current_storage_list = SD_workstation_get_mounted_storage_list(workstations[ctr]);
     xbt_dict_foreach(current_storage_list,cursor,mount_name,storage_name)
       XBT_INFO("Workstation '%s' mounts '%s'",
          SD_workstation_get_name(workstations[ctr]), mount_name);
index 51a6ea2..a4c4644 100644 (file)
       double precision p, t, e
 
       call MPI_Init(ierr)
+      if (ierr .ne. MPI_SUCCESS) then
+         print *, 'MPI_Init failed:', ierr
+         stop 1
+      endif
       call MPI_Comm_rank(MPI_COMM_WORLD, rank, ierr)
+      if (ierr .ne. MPI_SUCCESS) then
+         print *, 'MPI_Comm_rank failed:', ierr
+         call MPI_Abort(MPI_COMM_WORLD, 1, ierr)
+         stop 1
+      endif
 
       pstates = smpi_get_host_nb_pstates()
 
       end do
 
       call MPI_Finalize(ierr)
+      if (ierr .ne. MPI_SUCCESS) then
+         print *, 'MPI_Finalize failed:', ierr
+         call MPI_Abort(MPI_COMM_WORLD, 1, ierr)
+         stop 1
+      endif
 
       end program main
index f1db81a..833bf73 100644 (file)
@@ -13,7 +13,16 @@ program main
   double precision p, t, e
 
   call MPI_Init(ierr)
+  if (ierr .ne. MPI_SUCCESS) then
+     print *, 'MPI_Init failed:', ierr
+     stop 1
+  endif
   call MPI_Comm_rank(MPI_COMM_WORLD, rank, ierr)
+  if (ierr .ne. MPI_SUCCESS) then
+     print *, 'MPI_Comm_rank failed:', ierr
+     call MPI_Abort(MPI_COMM_WORLD, 1, ierr)
+     stop 1
+  endif
 
   pstates = smpi_get_host_nb_pstates()
 
@@ -40,5 +49,10 @@ program main
   end do
 
   call MPI_Finalize(ierr)
+  if (ierr .ne. MPI_SUCCESS) then
+     print *, 'MPI_Finalize failed:', ierr
+     call MPI_Abort(MPI_COMM_WORLD, 1, ierr)
+     stop 1
+  endif
 
 end program main
index ba969e5..2c4571a 100644 (file)
@@ -16,13 +16,20 @@ int main(int argc, char *argv[])
   char buf[1024];
   char *s;
   size_t sz, x;
+  int err;
 
-  if (MPI_Init(&argc, &argv) != MPI_SUCCESS) {
-    fprintf(stderr, "MPI initialization failed!\n");
+  err = MPI_Init(&argc, &argv);
+  if (err != MPI_SUCCESS) {
+    fprintf(stderr, "MPI_init failed: %d\n", err);
     exit(EXIT_FAILURE);
   }
 
-  MPI_Comm_rank(MPI_COMM_WORLD, &rank);   /* Get id of this process */
+  err = MPI_Comm_rank(MPI_COMM_WORLD, &rank);   /* Get id of this process */
+  if (err != MPI_SUCCESS) {
+    fprintf(stderr, "MPI_Comm_rank failed: %d", err);
+    MPI_Abort(MPI_COMM_WORLD, EXIT_FAILURE);
+    exit(EXIT_FAILURE);
+  }
 
   pstates = smpi_get_host_nb_pstates();
 
@@ -59,5 +66,12 @@ int main(int argc, char *argv[])
             MPI_Wtime(), rank, smpi_get_host_consumed_energy());
   }
 
-  return MPI_Finalize();
+  err = MPI_Finalize();
+  if (err != MPI_SUCCESS) {
+    fprintf(stderr, "MPI_Finalize failed: %d\n", err);
+    MPI_Abort(MPI_COMM_WORLD, EXIT_FAILURE);
+    exit(EXIT_FAILURE);
+  }
+
+  return EXIT_SUCCESS;
 }
index f015b77..a623892 100644 (file)
@@ -57,7 +57,8 @@ void jed_free_jedule(jedule_t jedule);
 
 void jedule_add_meta_info(jedule_t jedule, char *key, char *value);
 
-void jed_simgrid_create_container(jed_simgrid_container_t *container, char *name);
+void jed_simgrid_create_container(jed_simgrid_container_t *container,
+                                  const char *name);
 
 void jed_simgrid_add_container(jed_simgrid_container_t parent,
     jed_simgrid_container_t child);
index 53d62ee..4bed8e1 100644 (file)
@@ -9,7 +9,6 @@
 
 #include "simgrid_config.h"
 
-#include "simdag/private.h"
 #include "simdag/datatypes.h"
 #include "simdag/simdag.h"
 
index ed95a57..b76e6c3 100644 (file)
@@ -96,30 +96,33 @@ static inline msg_vm_priv_t MSG_vm_priv(msg_vm_t vm){
   return (msg_vm_priv_t) xbt_lib_get_level(vm, MSG_HOST_LEVEL);
 }
 
-/* ******************************** File ************************************ */
+/** ******************************** File ************************************ */
+
+/** @brief File datatype.
+*  @ingroup msg_file_management
+*
+*  You should consider this as an opaque object.
+*/
+typedef xbt_dictelm_t msg_file_t;
+typedef s_xbt_dictelm_t s_msg_file_t;
+
+extern int MSG_FILE_LEVEL;
 typedef struct simdata_file *simdata_file_t;
 
-typedef struct s_msg_file_info {
+typedef struct msg_file_priv  {
+  char *fullpath;
   sg_size_t size;
   char* mount_point;
   char* storageId;
   char* storage_type;
   char* content_type;
-} s_msg_file_info_t, *msg_file_info_t;
+  void *data;
+  simdata_file_t simdata;
+} s_msg_file_priv_t, *msg_file_priv_t;
 
-typedef struct msg_file {
-  char *fullname;               /**< @brief file full name (path+name)*/
-  simdata_file_t simdata;       /**< @brief simulator data  */
-  msg_file_info_t info;
-} s_msg_file_t;
-
-/** @brief File datatype.
- *  @ingroup msg_file_management
- *
- *  You should consider this as an opaque object.
- */
-
-typedef struct msg_file *msg_file_t;
+static inline msg_file_priv_t MSG_file_priv(msg_file_t file){
+  return (msg_file_priv_t )xbt_lib_get_level(file, MSG_FILE_LEVEL);
+}
 
 /* ******************************** Storage ************************************ */
 /* TODO: PV: to comment */
@@ -135,10 +138,14 @@ typedef xbt_dictelm_t msg_storage_t;
 typedef s_xbt_dictelm_t s_msg_storage_t;
 
 typedef struct msg_storage_priv  {
-  // TODO PV: fill it (or not) !
-  void * dummy;
+  const char *host;
+  void *data;
 } s_msg_storage_priv_t, *msg_storage_priv_t;
 
+static inline msg_storage_priv_t MSG_storage_priv(msg_storage_t storage){
+  return (msg_storage_priv_t )xbt_lib_get_level(storage, MSG_STORAGE_LEVEL);
+}
+
 /*************** Begin GPU ***************/
 typedef struct simdata_gpu_task *simdata_gpu_task_t;
 
index 9f983ca..cf6e52b 100644 (file)
@@ -83,8 +83,7 @@ XBT_PUBLIC(xbt_dynar_t) MSG_environment_as_get_hosts(msg_as_t as);
 /************************** File handling ***********************************/
 XBT_PUBLIC(sg_size_t) MSG_file_read(msg_file_t fd, sg_size_t size);
 XBT_PUBLIC(sg_size_t) MSG_file_write(msg_file_t fd, sg_size_t size);
-XBT_PUBLIC(msg_file_t) MSG_file_open(const char* mount, const char* path,
-                                     void* data);
+XBT_PUBLIC(msg_file_t) MSG_file_open(const char* fullpath, void* data);
 XBT_PUBLIC(void*) MSG_file_get_data(msg_file_t fd);
 XBT_PUBLIC(msg_error_t) MSG_file_set_data(msg_file_t fd, void * data);
 XBT_PUBLIC(int) MSG_file_close(msg_file_t fd);
@@ -95,6 +94,8 @@ XBT_PUBLIC(xbt_dict_t) MSG_file_ls(const char *mount, const char *path);
 XBT_PUBLIC(msg_error_t) MSG_file_seek(msg_file_t fd, sg_size_t offset, int origin);
 XBT_PUBLIC(sg_size_t) MSG_file_tell (msg_file_t fd);
 XBT_PUBLIC(void) __MSG_file_get_info(msg_file_t fd);
+XBT_PUBLIC(void) __MSG_file_priv_free(msg_file_priv_t priv);
+XBT_PUBLIC(const char *) MSG_file_get_name(msg_file_t storage);
 /************************** Storage handling ***********************************/
 XBT_PUBLIC(msg_host_t) MSG_get_storage_by_name(const char *name);
 XBT_PUBLIC(const char *) MSG_storage_get_name(msg_storage_t storage);
@@ -110,6 +111,7 @@ XBT_PUBLIC(xbt_dict_t) MSG_storage_get_content(msg_storage_t storage);
 XBT_PUBLIC(sg_size_t) MSG_storage_get_size(msg_storage_t storage);
 XBT_PUBLIC(msg_error_t) MSG_storage_file_move(msg_file_t fd, msg_host_t dest, char* mount, char* fullname);
 XBT_PUBLIC(msg_error_t) MSG_storage_file_rename(msg_storage_t storage, const char* src,  const char* dest);
+XBT_PUBLIC(const char *) MSG_storage_get_host(msg_storage_t storage);
 /************************** AS Router handling ************************************/
 XBT_PUBLIC(const char *) MSG_as_router_get_property_value(const char* asr, const char *name);
 XBT_PUBLIC(xbt_dict_t) MSG_as_router_get_properties(const char* asr);
@@ -152,7 +154,8 @@ XBT_PUBLIC(xbt_dynar_t) MSG_hosts_as_dynar(void);
 XBT_PUBLIC(int) MSG_get_host_number(void);
 XBT_PUBLIC(void) MSG_host_get_params(msg_host_t ind_pm, ws_params_t params);
 XBT_PUBLIC(void) MSG_host_set_params(msg_host_t ind_pm, ws_params_t params);
-XBT_PUBLIC(xbt_dict_t) MSG_host_get_storage_list(msg_host_t host);
+XBT_PUBLIC(xbt_dict_t) MSG_host_get_mounted_storage_list(msg_host_t host);
+XBT_PUBLIC(xbt_dynar_t) MSG_host_get_attached_storage_list(msg_host_t host);
 XBT_PUBLIC(xbt_dict_t) MSG_host_get_storage_content(msg_host_t host);
 /************************** Process handling *********************************/
 XBT_PUBLIC(msg_process_t) MSG_process_create(const char *name,
index 4f2a3e5..eee8f60 100644 (file)
@@ -106,7 +106,10 @@ XBT_PUBLIC(double) SD_route_get_communication_time(SD_workstation_t src,
 XBT_PUBLIC(SD_task_t) SD_workstation_get_current_task(SD_workstation_t
                                                       workstation);
 XBT_PUBLIC(xbt_dict_t)
-    SD_workstation_get_storage_list(SD_workstation_t workstation);
+    SD_workstation_get_mounted_storage_list(SD_workstation_t workstation);
+XBT_PUBLIC(xbt_dynar_t)
+    SD_workstation_get_attached_storage_list(SD_workstation_t workstation);
+XBT_PUBLIC(const char*) SD_storage_get_host(SD_storage_t storage);
 /** @} */
 
 /************************** Task handling ************************************/
index f3619f3..4031d13 100644 (file)
@@ -241,6 +241,7 @@ typedef struct {
   const char* content;
   const char* content_type;
   xbt_dict_t properties;
+  const char* attach;
 } s_sg_platf_storage_cbarg_t, *sg_platf_storage_cbarg_t;
 
 #define SG_PLATF_STORAGE_INITIALIZER {NULL,NULL,NULL,NULL}
index 91a6269..6114538 100644 (file)
@@ -69,7 +69,6 @@ typedef struct s_smx_cond *smx_cond_t;
 typedef struct s_smx_sem *smx_sem_t;
 
 /********************************** File *************************************/
-
 typedef struct s_smx_file *smx_file_t;
 
 /********************************** Storage *************************************/
@@ -79,8 +78,6 @@ typedef struct s_smx_storage_priv *smx_storage_priv_t;
 /********************************** Action *************************************/
 typedef struct s_smx_action *smx_action_t; /* FIXME: replace by specialized action handlers */
 
-
-
 /* ****************************** Process *********************************** */
 /** @brief Process datatype
     @ingroup simix_process_management
@@ -113,7 +110,8 @@ typedef void (*smx_creation_func_t) ( /* process */ smx_process_t*,
                                       /* argc */ int,
                                       /* argv */ char**,
                                       /* props */ xbt_dict_t,
-                                      /* auto_restart */ int);
+                                      /* auto_restart */ int,
+                                      /* parent_process */ smx_process_t);
 
 
 /******************************* Networking ***********************************/
@@ -170,6 +168,8 @@ XBT_PUBLIC(smx_ctx_factory_initializer_t) smx_factory_initializer_to_use;
 extern char* smx_context_factory_name;
 extern int smx_context_stack_size;
 extern int smx_context_stack_size_was_set;
+extern int smx_context_guard_size;
+extern int smx_context_guard_size_was_set;
 
 /* *********************** */
 /* Context type definition */
@@ -263,7 +263,7 @@ XBT_PUBLIC(void) SIMIX_host_on(smx_host_t host);
 XBT_PUBLIC(void) SIMIX_host_off(smx_host_t host, smx_process_t issuer);
 XBT_PUBLIC(void) SIMIX_host_self_set_data(void *data);
 XBT_PUBLIC(void*) SIMIX_host_self_get_data(void);
-XBT_PUBLIC(xbt_dict_t) SIMIX_host_get_storage_list(smx_host_t host);
+XBT_PUBLIC(xbt_dict_t) SIMIX_host_get_mounted_storage_list(smx_host_t host);
 /********************************* Process ************************************/
 XBT_PUBLIC(int) SIMIX_process_count(void);
 XBT_PUBLIC(smx_process_t) SIMIX_process_self(void);
@@ -286,10 +286,6 @@ XBT_PUBLIC(int) SIMIX_comm_has_send_match(smx_rdv_t rdv, int (*match_fun)(void*,
 XBT_PUBLIC(int) SIMIX_comm_has_recv_match(smx_rdv_t rdv, int (*match_fun)(void*, void*), void* data);
 XBT_PUBLIC(void) SIMIX_comm_finish(smx_action_t action);
 
-/*********************************** File *************************************/
-XBT_PUBLIC(void*) SIMIX_file_get_data(smx_file_t fd);
-XBT_PUBLIC(void) SIMIX_file_set_data(smx_file_t fd, void *data);
-
 /******************************************************************************/
 /*                            SIMIX simcalls                                  */
 /******************************************************************************/
@@ -338,7 +334,8 @@ XBT_PUBLIC(void) simcall_host_execution_set_priority(smx_action_t execution, dou
 XBT_PUBLIC(void) simcall_host_execution_set_bound(smx_action_t execution, double bound);
 XBT_PUBLIC(void) simcall_host_execution_set_affinity(smx_action_t execution, smx_host_t host, unsigned long mask);
 XBT_PUBLIC(e_smx_state_t) simcall_host_execution_wait(smx_action_t execution);
-XBT_PUBLIC(xbt_dict_t) simcall_host_get_storage_list(smx_host_t host);
+XBT_PUBLIC(xbt_dict_t) simcall_host_get_mounted_storage_list(smx_host_t host);
+XBT_PUBLIC(xbt_dynar_t) simcall_host_get_attached_storage_list(smx_host_t host);
 XBT_PUBLIC(void) simcall_host_get_params(smx_host_t vm, ws_params_t param);
 XBT_PUBLIC(void) simcall_host_set_params(smx_host_t vm, ws_params_t param);
 
@@ -493,7 +490,7 @@ XBT_PUBLIC(void *) simcall_file_get_data(smx_file_t fd);
 XBT_PUBLIC(void) simcall_file_set_data(smx_file_t fd, void *data);
 XBT_PUBLIC(sg_size_t) simcall_file_read(smx_file_t fd, sg_size_t size);
 XBT_PUBLIC(sg_size_t) simcall_file_write(smx_file_t fd, sg_size_t size);
-XBT_PUBLIC(smx_file_t) simcall_file_open(const char* storage, const char* path);
+XBT_PUBLIC(smx_file_t) simcall_file_open(const char* fullpath);
 XBT_PUBLIC(int) simcall_file_close(smx_file_t fd);
 XBT_PUBLIC(int) simcall_file_unlink(smx_file_t fd);
 XBT_PUBLIC(xbt_dict_t) simcall_file_ls(const char* mount, const char* path);
@@ -509,9 +506,10 @@ XBT_PUBLIC(void*) SIMIX_storage_get_data(smx_storage_t storage);
 XBT_PUBLIC(void) SIMIX_storage_set_data(smx_storage_t storage, void *data);
 XBT_PUBLIC(xbt_dict_t) SIMIX_storage_get_content(smx_storage_t storage);
 XBT_PUBLIC(xbt_dict_t) simcall_storage_get_content(smx_storage_t storage);
-XBT_PUBLIC(const char*) SIMIX_storage_get_name(smx_host_t host);
+XBT_PUBLIC(const char*) SIMIX_storage_get_name(smx_storage_t storage);
 XBT_PUBLIC(sg_size_t) SIMIX_storage_get_size(smx_storage_t storage);
 XBT_PUBLIC(void) simcall_storage_file_rename(smx_storage_t storage, const char* src,  const char* dest);
+XBT_PUBLIC(const char*) SIMIX_storage_get_host(smx_storage_t storage);
 /************************** AS router   **********************************/
 XBT_PUBLIC(xbt_dict_t) SIMIX_asr_get_properties(const char *name);
 /************************** AS router simcalls ***************************/
index cb57fd8..4066bb3 100644 (file)
@@ -62,14 +62,14 @@ XBT_PUBLIC(void) STag_surfxml_AS(void);
 XBT_PUBLIC(void) ETag_surfxml_AS(void);
 XBT_PUBLIC(void) STag_surfxml_storage___type(void);
 XBT_PUBLIC(void) ETag_surfxml_storage___type(void);
-XBT_PUBLIC(void) STag_surfxml_storage(void);
-XBT_PUBLIC(void) ETag_surfxml_storage(void);
 XBT_PUBLIC(void) STag_surfxml_mount(void);
 XBT_PUBLIC(void) ETag_surfxml_mount(void);
 XBT_PUBLIC(void) STag_surfxml_mstorage(void);
 XBT_PUBLIC(void) ETag_surfxml_mstorage(void);
 XBT_PUBLIC(void) STag_surfxml_host(void);
 XBT_PUBLIC(void) ETag_surfxml_host(void);
+XBT_PUBLIC(void) STag_surfxml_storage(void);
+XBT_PUBLIC(void) ETag_surfxml_storage(void);
 XBT_PUBLIC(void) STag_surfxml_gpu(void);
 XBT_PUBLIC(void) ETag_surfxml_gpu(void);
 XBT_PUBLIC(void) STag_surfxml_host___link(void);
@@ -202,6 +202,8 @@ typedef int AT_surfxml_random_mean;
 #define AU_surfxml_random_mean NULL
 typedef int AT_surfxml_storage___type_size;
 #define AU_surfxml_storage___type_size NULL
+typedef int AT_surfxml_storage_attach;
+#define AU_surfxml_storage_attach NULL
 typedef int AT_surfxml_cluster_bb___lat;
 #define AU_surfxml_cluster_bb___lat NULL
 typedef int AT_surfxml_link_latency;
@@ -276,12 +278,12 @@ typedef int AT_surfxml_peer_id;
 #define AU_surfxml_peer_id NULL
 typedef int AT_surfxml_cabinet_radical;
 #define AU_surfxml_cabinet_radical NULL
+typedef int AT_surfxml_cluster_loopback___lat;
+#define AU_surfxml_cluster_loopback___lat NULL
 typedef int AT_surfxml_storage_content___type;
 #define AU_surfxml_storage_content___type NULL
 typedef int AT_surfxml_cluster_router___id;
 #define AU_surfxml_cluster_router___id NULL
-typedef int AT_surfxml_cluster_loopback___lat;
-#define AU_surfxml_cluster_loopback___lat NULL
 typedef enum { AU_surfxml_cluster_sharing___policy, A_surfxml_cluster_sharing___policy_SHARED,A_surfxml_cluster_sharing___policy_FULLDUPLEX,A_surfxml_cluster_sharing___policy_FATPIPE } AT_surfxml_cluster_sharing___policy;
 typedef int AT_surfxml_bypassRoute_dst;
 #define AU_surfxml_bypassRoute_dst NULL
@@ -289,10 +291,10 @@ typedef int AT_surfxml_cabinet_power;
 #define AU_surfxml_cabinet_power NULL
 typedef int AT_surfxml_host_core;
 #define AU_surfxml_host_core NULL
-typedef int AT_surfxml_storage___type_model;
-#define AU_surfxml_storage___type_model NULL
 typedef int AT_surfxml_host_availability;
 #define AU_surfxml_host_availability NULL
+typedef int AT_surfxml_storage___type_model;
+#define AU_surfxml_storage___type_model NULL
 typedef int AT_surfxml_bypassRoute_src;
 #define AU_surfxml_bypassRoute_src NULL
 typedef int AT_surfxml_backbone_latency;
@@ -491,6 +493,9 @@ XBT_PUBLIC_DATA(short int) surfxml_random_mean_isset;
 XBT_PUBLIC_DATA(AT_surfxml_storage___type_size) AX_surfxml_storage___type_size;
 #define A_surfxml_storage___type_size (surfxml_bufferstack + AX_surfxml_storage___type_size)
 XBT_PUBLIC_DATA(short int) surfxml_storage___type_size_isset;
+XBT_PUBLIC_DATA(AT_surfxml_storage_attach) AX_surfxml_storage_attach;
+#define A_surfxml_storage_attach (surfxml_bufferstack + AX_surfxml_storage_attach)
+XBT_PUBLIC_DATA(short int) surfxml_storage_attach_isset;
 XBT_PUBLIC_DATA(AT_surfxml_cluster_bb___lat) AX_surfxml_cluster_bb___lat;
 #define A_surfxml_cluster_bb___lat (surfxml_bufferstack + AX_surfxml_cluster_bb___lat)
 XBT_PUBLIC_DATA(short int) surfxml_cluster_bb___lat_isset;
@@ -608,15 +613,15 @@ XBT_PUBLIC_DATA(short int) surfxml_peer_id_isset;
 XBT_PUBLIC_DATA(AT_surfxml_cabinet_radical) AX_surfxml_cabinet_radical;
 #define A_surfxml_cabinet_radical (surfxml_bufferstack + AX_surfxml_cabinet_radical)
 XBT_PUBLIC_DATA(short int) surfxml_cabinet_radical_isset;
+XBT_PUBLIC_DATA(AT_surfxml_cluster_loopback___lat) AX_surfxml_cluster_loopback___lat;
+#define A_surfxml_cluster_loopback___lat (surfxml_bufferstack + AX_surfxml_cluster_loopback___lat)
+XBT_PUBLIC_DATA(short int) surfxml_cluster_loopback___lat_isset;
 XBT_PUBLIC_DATA(AT_surfxml_storage_content___type) AX_surfxml_storage_content___type;
 #define A_surfxml_storage_content___type (surfxml_bufferstack + AX_surfxml_storage_content___type)
 XBT_PUBLIC_DATA(short int) surfxml_storage_content___type_isset;
 XBT_PUBLIC_DATA(AT_surfxml_cluster_router___id) AX_surfxml_cluster_router___id;
 #define A_surfxml_cluster_router___id (surfxml_bufferstack + AX_surfxml_cluster_router___id)
 XBT_PUBLIC_DATA(short int) surfxml_cluster_router___id_isset;
-XBT_PUBLIC_DATA(AT_surfxml_cluster_loopback___lat) AX_surfxml_cluster_loopback___lat;
-#define A_surfxml_cluster_loopback___lat (surfxml_bufferstack + AX_surfxml_cluster_loopback___lat)
-XBT_PUBLIC_DATA(short int) surfxml_cluster_loopback___lat_isset;
 XBT_PUBLIC_DATA(AT_surfxml_cluster_sharing___policy) AX_surfxml_cluster_sharing___policy;
 #define A_surfxml_cluster_sharing___policy AX_surfxml_cluster_sharing___policy
 XBT_PUBLIC_DATA(short int) surfxml_cluster_sharing___policy_isset;
@@ -629,12 +634,12 @@ XBT_PUBLIC_DATA(short int) surfxml_cabinet_power_isset;
 XBT_PUBLIC_DATA(AT_surfxml_host_core) AX_surfxml_host_core;
 #define A_surfxml_host_core (surfxml_bufferstack + AX_surfxml_host_core)
 XBT_PUBLIC_DATA(short int) surfxml_host_core_isset;
-XBT_PUBLIC_DATA(AT_surfxml_storage___type_model) AX_surfxml_storage___type_model;
-#define A_surfxml_storage___type_model (surfxml_bufferstack + AX_surfxml_storage___type_model)
-XBT_PUBLIC_DATA(short int) surfxml_storage___type_model_isset;
 XBT_PUBLIC_DATA(AT_surfxml_host_availability) AX_surfxml_host_availability;
 #define A_surfxml_host_availability (surfxml_bufferstack + AX_surfxml_host_availability)
 XBT_PUBLIC_DATA(short int) surfxml_host_availability_isset;
+XBT_PUBLIC_DATA(AT_surfxml_storage___type_model) AX_surfxml_storage___type_model;
+#define A_surfxml_storage___type_model (surfxml_bufferstack + AX_surfxml_storage___type_model)
+XBT_PUBLIC_DATA(short int) surfxml_storage___type_model_isset;
 XBT_PUBLIC_DATA(AT_surfxml_bypassRoute_src) AX_surfxml_bypassRoute_src;
 #define A_surfxml_bypassRoute_src (surfxml_bufferstack + AX_surfxml_bypassRoute_src)
 XBT_PUBLIC_DATA(short int) surfxml_bypassRoute_src_isset;
index 5c0e90c..a7a5a50 100644 (file)
@@ -39,7 +39,7 @@ XBT_PUBLIC(xbt_lib_t) storage_lib;
 XBT_PUBLIC(int) ROUTING_STORAGE_LEVEL;        //Routing storage level
 XBT_PUBLIC(int) ROUTING_STORAGE_HOST_LEVEL;
 XBT_PUBLIC(int) SURF_STORAGE_LEVEL;  // Surf storage level
-
+XBT_PUBLIC(xbt_lib_t) file_lib;
 XBT_PUBLIC(xbt_lib_t) storage_type_lib;
 XBT_PUBLIC(int) ROUTING_STORAGE_TYPE_LEVEL;   //Routing storage_type level
 
index 43fb347..14e48b0 100644 (file)
 
 SG_BEGIN_DECL()
 
+/** Cache the size of a memory page for the current system. */
+XBT_PUBLIC_DATA(int) xbt_pagesize;
+
 XBT_PUBLIC(const char *) xbt_procname(void);
 
 #define XBT_BACKTRACE_SIZE 10   /* FIXME: better place? Do document */
index eede122..655c882 100644 (file)
@@ -68,6 +68,7 @@ XBT_PUBLIC(void) xbt_os_thread_yield(void);
 XBT_PUBLIC(void) xbt_os_thread_cancel(xbt_os_thread_t thread);
 XBT_PUBLIC(void *) xbt_os_thread_getparam(void);
 XBT_PUBLIC(void) xbt_os_thread_setstacksize(int stack_size);
+XBT_PUBLIC(void) xbt_os_thread_setguardsize(int guard_size);
 
   /** \brief Thread mutex data type (opaque structure) */
 typedef struct xbt_os_mutex_ *xbt_os_mutex_t;
index f8adbda..1210a74 100644 (file)
@@ -26,15 +26,13 @@ Java_org_simgrid_msg_File_nativeInit(JNIEnv *env, jclass cls) {
   xbt_assert((jfile_field_bind != NULL), "Can't find \"bind\" field in File class.");
 }
 JNIEXPORT void JNICALL
-Java_org_simgrid_msg_File_open(JNIEnv *env, jobject jfile, jobject jstorage, jobject jpath) {
-  const char *storage = (*env)->GetStringUTFChars(env, jstorage, 0);
+Java_org_simgrid_msg_File_open(JNIEnv *env, jobject jfile, jobject jpath) {
   const char *path = (*env)->GetStringUTFChars(env, jpath, 0);
   msg_file_t file;
 
-  file = MSG_file_open(storage, path, NULL);
+  file = MSG_file_open(path, NULL);
   jfile_bind(env, jfile, file);
 
-  (*env)->ReleaseStringUTFChars(env, jstorage, storage);
   (*env)->ReleaseStringUTFChars(env, jpath, path);
 }
 JNIEXPORT jlong JNICALL
index 05dc575..e2c0352 100644 (file)
@@ -28,7 +28,7 @@ Java_org_simgrid_msg_File_nativeInit(JNIEnv*, jclass);
  * Signature   (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
  */
 JNIEXPORT void JNICALL
-Java_org_simgrid_msg_File_open(JNIEnv*, jobject, jobject, jobject);
+Java_org_simgrid_msg_File_open(JNIEnv*, jobject, jobject);
 /**
  * Class                       org_simgrid_msg_File
  * Method                      read
index fd7b069..ed259b7 100644 (file)
@@ -405,7 +405,7 @@ Java_org_simgrid_msg_Process_setKillTime (JNIEnv *env , jobject jprocess, jdoubl
 
 JNIEXPORT jint JNICALL
 Java_org_simgrid_msg_Process_getCount(JNIEnv * env, jclass cls) {
-       /* FIXME: the next test on SimGrid version is to ensure that this still compiles with SG 3.8 while the C function were added in SG 3.9 only.
+       /* The next test on SimGrid version is to ensure that this still compiles with SG 3.8 while the C function were added in SG 3.9 only.
         * This kind of pimple becomes mandatory when you get so slow to release the java version that it begins evolving further after the C release date.
         */
 #if SIMGRID_VERSION >= 30900
diff --git a/src/bindings/java/org/simgrid/NativeLib.java b/src/bindings/java/org/simgrid/NativeLib.java
new file mode 100644 (file)
index 0000000..130c904
--- /dev/null
@@ -0,0 +1,112 @@
+package org.simgrid;
+
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.File;
+
+public final class NativeLib {
+
+    public static String getPath() {
+        String prefix = "NATIVE";
+        String os = System.getProperty("os.name");
+        String arch = System.getProperty("os.arch");
+
+        if (os.toLowerCase().startsWith("^win"))
+            os = "Windows";
+        else if (os.contains("OS X"))
+            os = "Darwin";
+
+        if (arch.matches("^i[3-6]86$"))
+            arch = "x86";
+        else if (arch.equalsIgnoreCase("amd64"))
+            arch = "x86_64";
+
+        os = os.replace(' ', '_');
+        arch = arch.replace(' ', '_');
+
+        return prefix + "/" + os + "/" + arch + "/";
+    }
+    public static void nativeInit(String name) {
+        try {
+            /* prefer the version on disk, if existing */
+            System.loadLibrary(name);
+        } catch (UnsatisfiedLinkError e) {
+            /* If not found, unpack the one bundled into the jar file and use it */
+            loadLib(name);
+        }
+    }
+
+    private static void loadLib (String name) {
+        String Path = NativeLib.getPath();
+
+        String filename=name;
+        InputStream in = NativeLib.class.getClassLoader().getResourceAsStream(Path+filename);
+               
+        if (in == null) {
+           filename = "lib"+name+".so";
+            in = NativeLib.class.getClassLoader().getResourceAsStream(Path+filename);
+        } 
+       if (in == null) {
+           filename = name+".dll";
+           in =  NativeLib.class.getClassLoader().getResourceAsStream(Path+filename);
+       }  
+       if (in == null) {
+           filename = "lib"+name+".dll";
+           in =  NativeLib.class.getClassLoader().getResourceAsStream(Path+filename);
+       }  
+       if (in == null) {
+           filename = "lib"+name+".dylib";
+           in =  NativeLib.class.getClassLoader().getResourceAsStream(Path+filename);
+       }  
+       if (in == null) {
+           throw new RuntimeException("Cannot find library "+name+" in path "+Path+". Sorry, but this jar does not seem to be usable on your machine.");
+       }
+       try {
+           // We must write the lib onto the disk before loading it -- stupid operating systems
+           File fileOut = new File(filename);
+           fileOut = File.createTempFile(name+"-", ".tmp");
+           // don't leak the file on disk, but remove it on JVM shutdown
+           Runtime.getRuntime().addShutdownHook(new Thread(new FileCleaner(fileOut.getAbsolutePath())));
+           OutputStream out = new FileOutputStream(fileOut);
+                       
+           /* copy the library in position */  
+           byte[] buffer = new byte[4096]; 
+           int bytes_read; 
+           while ((bytes_read = in.read(buffer)) != -1)     // Read until EOF
+                   out.write(buffer, 0, bytes_read); 
+                     
+           /* close all file descriptors, and load that shit */
+           in.close();
+           out.close();
+           System.load(fileOut.getAbsolutePath());
+
+       } catch (Exception e) {
+           System.err.println("Cannot load the bindings to the "+name+" library: ");
+           e.printStackTrace();
+           System.err.println("This jar file does not seem to fit your system, sorry");
+           System.exit(1);
+       }
+    }
+    
+       /* A hackish mechanism used to remove the file containing our library when the JVM shuts down */
+       private static class FileCleaner implements Runnable {
+               private String target;
+               public FileCleaner(String name) {
+                       target = name;
+               }
+        public void run() {
+            try {
+                new File(target).delete();
+            } catch(Exception e) {
+                System.out.println("Unable to clean temporary file "+target+" during shutdown.");
+                e.printStackTrace();
+            }
+        }    
+       }
+
+
+    public static void main(String[] args) {
+        System.out.println(getPath());
+    }
+}
index 108c7b5..ec212a7 100644 (file)
@@ -7,6 +7,7 @@
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
 package org.simgrid.msg;
+import org.simgrid.NativeLib;
 
 import java.io.FileOutputStream;
 import java.io.InputStream;
@@ -17,98 +18,19 @@ import java.io.File;
 public final class Msg {
        /* Statically load the library which contains all native functions used in here */
        static private boolean isNativeInited = false;
-       public static void nativeInit() {
-               if (isNativeInited)
-                       return;
-               try {
-                       /* prefer the version on disk, if existing */
-                       System.loadLibrary("simgrid-java");
-               } catch (UnsatisfiedLinkError e) {
-                       /* If not found, unpack the one bundled into the jar file and use it */
-                       loadLib("simgrid");
-                       loadLib("simgrid-java");
-               }
+        public static void nativeInit() {
+                if (isNativeInited)
+                      return;
+                NativeLib.nativeInit("simgrid");
+                NativeLib.nativeInit("simgrid-java");      
                isNativeInited = true;
+
        }
+
        static {
-               nativeInit();
+                nativeInit();
        }
-       private static void loadLib (String name) {
-               String Path = NativeLib.getPath();
-
-               String filename=name;
-               InputStream in = Msg.class.getClassLoader().getResourceAsStream(Path+filename);
-               
-               if (in == null) {
-                       filename = "lib"+name+".so";
-                       in = Msg.class.getClassLoader().getResourceAsStream(Path+filename);
-               } 
-               if (in == null) {
-                       filename = name+".dll";
-                       in = Msg.class.getClassLoader().getResourceAsStream(Path+filename);
-               }  
-               if (in == null) {
-                       filename = "lib"+name+".dll";
-                       in = Msg.class.getClassLoader().getResourceAsStream(Path+filename);
-               }  
-               if (in == null) {
-                       filename = "lib"+name+".dylib";
-                       in = Msg.class.getClassLoader().getResourceAsStream(Path+filename);
-               }  
-               if (in == null) {
-                       throw new RuntimeException("Cannot find library "+name+" in path "+Path+". Sorry, but this jar does not seem to be usable on your machine.");
-               }
-// Caching the file on disk: desactivated because it could fool the users              
-//             if (new File(filename).isFile()) {
-//                     // file was already unpacked -- use it directly
-//                     System.load(new File(".").getAbsolutePath()+File.separator+filename);
-//                     return;
-//             }
-               try {
-                       // We must write the lib onto the disk before loading it -- stupid operating systems
-                       File fileOut = new File(filename);
-//                     if (!new File(".").canWrite()) {
-//                             System.out.println("Cannot write in ."+File.separator+filename+"; unpacking the library into a temporary file instead");
-                               fileOut = File.createTempFile("simgrid-", ".tmp");
-                               // don't leak the file on disk, but remove it on JVM shutdown
-                               Runtime.getRuntime().addShutdownHook(new Thread(new FileCleaner(fileOut.getAbsolutePath())));
-//                     }
-//                     System.out.println("Unpacking SimGrid native library to " + fileOut.getAbsolutePath());
-                       OutputStream out = new FileOutputStream(fileOut);
-                       
-                       /* copy the library in position */  
-                       byte[] buffer = new byte[4096]; 
-                       int bytes_read; 
-                       while ((bytes_read = in.read(buffer)) != -1)     // Read until EOF
-                               out.write(buffer, 0, bytes_read); 
-                     
-                       /* close all file descriptors, and load that shit */
-                       in.close();
-                       out.close();
-                       System.load(fileOut.getAbsolutePath());
-               } catch (Exception e) {
-                       System.err.println("Cannot load the bindings to the simgrid library: ");
-                       e.printStackTrace();
-                       System.err.println("This jar file does not seem to fit your system, sorry");
-                       System.exit(1);
-               }
-       }               
-       /* A hackish mechanism used to remove the file containing our library when the JVM shuts down */
-       private static class FileCleaner implements Runnable {
-               private String target;
-               public FileCleaner(String name) {
-                       target = name;
-               }
-        public void run() {
-            try {
-                new File(target).delete();
-            } catch(Exception e) {
-                System.out.println("Unable to clean temporary file "+target+" during shutdown.");
-                e.printStackTrace();
-            }
-        }    
-       }
-
+        
     /** Retrieve the simulation time
      * @return The simulation time.
      */
diff --git a/src/bindings/java/surf.i b/src/bindings/java/surf.i
new file mode 100644 (file)
index 0000000..3fc9033
--- /dev/null
@@ -0,0 +1,96 @@
+/* File : example.i */
+%module(directors="1") Surf
+
+%pragma(java) jniclassimports=%{
+import org.simgrid.NativeLib;
+
+%}
+%pragma(java) jniclasscode=%{
+  static {
+    NativeLib.nativeInit("surf-java");
+    Runtime.getRuntime().addShutdownHook(
+      new Thread() {
+        public void run() {
+          Thread.currentThread().setName( "Destroyer" );
+          Surf.clean();
+        }
+      }
+    );
+  }
+%}
+
+%{
+#include "src/surf/cpu_interface.hpp"
+#include "src/surf/network_interface.hpp"
+#include "src/bindings/java/surf_swig.hpp"
+#include "src/xbt/dict_private.h"
+typedef struct lmm_constraint *lmm_constraint_t;
+%}
+
+%feature("director") Plugin;
+
+%include "src/bindings/java/surf_swig.hpp"
+
+%nodefaultctor Model;
+class Model {
+public:
+  const char *getName();
+};
+
+class Resource {
+public:
+  Resource();
+  const char *getName();
+  virtual bool isUsed()=0;
+  lmm_constraint *getConstraint();
+  s_xbt_dict *getProperties();
+};
+
+class Cpu : public Resource {
+public:
+  Cpu();
+  ~Cpu();
+  double getCurrentPowerPeak();
+};
+
+class NetworkLink : public Resource {
+public:
+  NetworkLink();
+  ~NetworkLink();
+};
+
+class Action {
+public:
+  Model *getModel();
+};
+
+class CpuAction : public Action {
+public:
+%extend {
+  Cpu *getCpu() {return getActionCpu($self);}
+}
+};
+
+%nodefaultctor NetworkAction;
+class NetworkAction : public Action {
+public:
+%extend {
+  double getLatency() {return $self->m_latency;}
+}
+};
+
+
+%rename lmm_constraint LmmConstraint;
+struct lmm_constraint {
+%extend {
+  double getUsage() {return lmm_constraint_get_usage($self);}
+}
+};
+
+%rename s_xbt_dict XbtDict;
+struct s_xbt_dict {
+%extend {
+  char *getValue(char *key) {return (char*)xbt_dict_get_or_null($self, key);}
+}
+};
+
diff --git a/src/bindings/java/surf_swig.cpp b/src/bindings/java/surf_swig.cpp
new file mode 100644 (file)
index 0000000..b5a376f
--- /dev/null
@@ -0,0 +1,48 @@
+#include <boost/lambda/bind.hpp>
+#include "src/surf/surf_interface.hpp"
+#include "surf_swig.hpp"
+#include "src/simix/smx_private.h"
+
+
+double getClock() {
+  return surf_get_clock();
+}
+
+void clean() {
+  SIMIX_clean();
+}
+
+void Plugin::activateCpuCreatedCallback(){
+  surf_callback_connect(cpuCreatedCallbacks, boost::bind(&Plugin::cpuCreatedCallback, this, _1));
+}
+
+void Plugin::activateCpuDestructedCallback(){
+  surf_callback_connect(cpuDestructedCallbacks, boost::bind(&Plugin::cpuDestructedCallback, this, _1));
+}
+
+void Plugin::activateCpuStateChangedCallback(){
+  surf_callback_connect(cpuStateChangedCallbacks, boost::bind(&Plugin::cpuStateChangedCallback, this, _1));
+}
+
+void Plugin::activateCpuActionStateChangedCallback(){
+  surf_callback_connect(cpuActionStateChangedCallbacks, boost::bind(&Plugin::cpuActionStateChangedCallback, this, _1));
+}
+
+
+void Plugin::activateNetworkLinkCreatedCallback(){
+  surf_callback_connect(networkLinkCreatedCallbacks, boost::bind(&Plugin::networkLinkCreatedCallback, this, _1));
+}
+
+void Plugin::activateNetworkLinkDestructedCallback(){
+  surf_callback_connect(networkLinkDestructedCallbacks, boost::bind(&Plugin::networkLinkDestructedCallback, this, _1));
+}
+
+void Plugin::activateNetworkLinkStateChangedCallback(){
+  surf_callback_connect(networkLinkStateChangedCallbacks, boost::bind(&Plugin::networkLinkStateChangedCallback, this, _1));
+}
+
+void Plugin::activateNetworkActionStateChangedCallback(){
+  surf_callback_connect(networkActionStateChangedCallbacks, boost::bind(&Plugin::networkActionStateChangedCallback, this, _1));
+}
+
+
diff --git a/src/bindings/java/surf_swig.hpp b/src/bindings/java/surf_swig.hpp
new file mode 100644 (file)
index 0000000..39eb67d
--- /dev/null
@@ -0,0 +1,50 @@
+#include <cstdio>
+#include <iostream>
+#include "src/surf/cpu_interface.hpp"
+#include "src/surf/network_interface.hpp"
+#include "src/surf/maxmin_private.hpp"
+
+double getClock();
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+void clean();
+#ifdef __cplusplus
+}
+#endif
+
+class Plugin {
+public:
+ virtual ~Plugin() {
+   std::cout << "Plugin::~Plugin()" << std:: endl;
+ }
+
+ void activateCpuCreatedCallback();
+ virtual void cpuCreatedCallback(Cpu *cpu) {}
+
+ void activateCpuDestructedCallback();
+ virtual void cpuDestructedCallback(Cpu *cpu) {}
+
+ void activateCpuStateChangedCallback();
+ virtual void cpuStateChangedCallback(Cpu *cpu) {}
+
+ void activateCpuActionStateChangedCallback();
+ virtual void cpuActionStateChangedCallback(CpuAction *action) {}
+
+
+ void activateNetworkLinkCreatedCallback();
+ virtual void networkLinkCreatedCallback(NetworkLink *link) {}
+
+ void activateNetworkLinkDestructedCallback();
+ virtual void networkLinkDestructedCallback(NetworkLink *link) {}
+
+ void activateNetworkLinkStateChangedCallback();
+ virtual void networkLinkStateChangedCallback(NetworkLink *link) {}
+
+ void activateNetworkActionStateChangedCallback();
+ virtual void networkActionStateChangedCallback(NetworkAction *action) {}
+
+};
+
+
index 21d00c1..d7a6973 100644 (file)
@@ -17,7 +17,7 @@
 #include "xbt/automaton.h"
 #include "xbt/dynar.h"
 
-#define STD_HEAP_SIZE   20480000        /* Maximum size of the system's heap */
+#define STD_HEAP_SIZE   (50*1024*1024)        /* Maximum size of the system's heap */
 
 SG_BEGIN_DECL()
 
index 196cb15..0eeb7c2 100644 (file)
@@ -413,7 +413,7 @@ XBT_PUBLIC(surf_action_t) surf_workstation_sleep(surf_resource_t resource, doubl
  * @param path The path to the file
  * @return The surf action corresponding to the openning
  */
-XBT_PUBLIC(surf_action_t) surf_workstation_open(surf_resource_t workstation, const char* mount, const char* path);
+XBT_PUBLIC(surf_action_t) surf_workstation_open(surf_resource_t workstation, const char* fullpath);
 
 /**
  * @brief Close a file descriptor on a workstation
@@ -640,12 +640,20 @@ XBT_PUBLIC(void) surf_workstation_set_power_peak_at(surf_resource_t host, int ps
 XBT_PUBLIC(double) surf_workstation_get_consumed_energy(surf_resource_t host);
 
 /**
- * @brief Get the list of storages of a workstation
+ * @brief Get the list of storages mounted on a workstation
  * 
  * @param workstation The surf workstation
  * @return Dictionary of mount point, Storage
  */
-XBT_PUBLIC(xbt_dict_t) surf_workstation_get_storage_list(surf_resource_t workstation);
+XBT_PUBLIC(xbt_dict_t) surf_workstation_get_mounted_storage_list(surf_resource_t workstation);
+
+/**
+ * @brief Get the list of storages attached to a workstation
+ *
+ * @param workstation The surf workstation
+ * @return Dictionary of storage
+ */
+XBT_PUBLIC(xbt_dynar_t) surf_workstation_get_attached_storage_list(surf_resource_t workstation);
 
 /**
  * @brief Unlink a file descriptor
@@ -898,6 +906,15 @@ XBT_PUBLIC(surf_file_t) surf_storage_action_get_file(surf_action_t action);
  */
 XBT_PUBLIC(xbt_dict_t) surf_storage_action_get_ls_dict(surf_action_t action);
 
+
+/**
+ * @brief Get the host the storage is attached to
+ *
+ * @param resource The surf storage
+ * @return The host name
+ */
+XBT_PUBLIC(const char * ) surf_storage_get_host(surf_resource_t resource);
+
 XBT_PUBLIC(surf_model_t) surf_resource_model(const void *host, int level);
 
 /** @} */
index 8fa57c0..4093e78 100644 (file)
@@ -353,110 +353,110 @@ void TRACE_global_init(int *argc, char **argv)
   /* tracing */
   xbt_cfg_register(&_sg_cfg_set, OPT_TRACING,
                    "Enable Tracing.",
-                   xbt_cfgelm_boolean, 0, 1, NULL, NULL);
+                   xbt_cfgelm_boolean, 1, 1, NULL, NULL);
   xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING, "no");
 
   /* register platform in the trace */
   xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_PLATFORM,
                    "Register the platform in the trace as a hierarchy.",
-                   xbt_cfgelm_boolean, 0, 1, NULL, NULL);
+                   xbt_cfgelm_boolean, 1, 1, NULL, NULL);
   xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_PLATFORM, "no");
 
   /* register platform in the trace */
   xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_TOPOLOGY,
                    "Register the platform topology in the trace as a graph.",
-                   xbt_cfgelm_boolean, 0, 1, NULL, NULL);
+                   xbt_cfgelm_boolean, 1, 1, NULL, NULL);
   xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_TOPOLOGY, "yes");
 
   /* smpi */
   xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_SMPI,
                    "Tracing of the SMPI interface.",
-                   xbt_cfgelm_boolean, 0, 1, NULL, NULL);
+                   xbt_cfgelm_boolean, 1, 1, NULL, NULL);
   xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_SMPI, "no");
 
   /* smpi grouped */
   xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_SMPI_GROUP,
                    "Group MPI processes by host.",
-                   xbt_cfgelm_boolean, 0, 1, NULL, NULL);
+                   xbt_cfgelm_boolean, 1, 1, NULL, NULL);
   xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_SMPI_GROUP, "no");
 
   /* smpi computing */
   xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_SMPI_COMPUTING,
                    "Generate states for timing out of SMPI parts of the application",
-                   xbt_cfgelm_boolean, 0, 1, NULL, NULL);
+                   xbt_cfgelm_boolean, 1, 1, NULL, NULL);
   xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_SMPI_COMPUTING, "no");
 
   /* smpi internals */
   xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_SMPI_INTERNALS,
                    "View internal messages sent by Collective communications in SMPI",
-                   xbt_cfgelm_boolean, 0, 1, NULL, NULL);
+                   xbt_cfgelm_boolean, 1, 1, NULL, NULL);
   xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_SMPI_INTERNALS, "no");
 
   /* tracing categorized resource utilization traces */
   xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_CATEGORIZED,
                    "Tracing categorized resource utilization of hosts and links.",
-                   xbt_cfgelm_boolean, 0, 1, NULL, NULL);
+                   xbt_cfgelm_boolean, 1, 1, NULL, NULL);
   xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_CATEGORIZED, "no");
 
   /* tracing uncategorized resource utilization */
   xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_UNCATEGORIZED,
                    "Tracing uncategorized resource utilization of hosts and links.",
-                   xbt_cfgelm_boolean, 0, 1, NULL, NULL);
+                   xbt_cfgelm_boolean, 1, 1, NULL, NULL);
   xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_UNCATEGORIZED, "no");
 
   /* msg process */
   xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_MSG_PROCESS,
                    "Tracing of MSG process behavior.",
-                   xbt_cfgelm_boolean, 0, 1, NULL, NULL);
+                   xbt_cfgelm_boolean, 1, 1, NULL, NULL);
   xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_MSG_PROCESS, "no");
 
   /* msg process */
   xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_MSG_VM,
                    "Tracing of MSG process behavior.",
-                   xbt_cfgelm_boolean, 0, 1, NULL, NULL);
+                   xbt_cfgelm_boolean, 1, 1, NULL, NULL);
   xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_MSG_VM, "no");
 
   /* disable tracing link */
   xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_DISABLE_LINK,
                    "Do not trace link bandwidth and latency.",
-                   xbt_cfgelm_boolean, 0, 1, NULL, NULL);
+                   xbt_cfgelm_boolean, 1, 1, NULL, NULL);
   xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_DISABLE_LINK, "no");
 
   /* disable tracing link */
   xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_DISABLE_POWER,
                    "Do not trace host power.",
-                   xbt_cfgelm_boolean, 0, 1, NULL, NULL);
+                   xbt_cfgelm_boolean, 1, 1, NULL, NULL);
   xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_DISABLE_POWER, "no");
 
 
   /* tracing buffer */
   xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_BUFFER,
                    "Buffer trace events to put them in temporal order.",
-                   xbt_cfgelm_boolean, 0, 1, NULL, NULL);
+                   xbt_cfgelm_boolean, 1, 1, NULL, NULL);
   xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_BUFFER, "yes");
 
   /* tracing one link only */
   xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_ONELINK_ONLY,
                    "Use only routes with one link to trace platform.",
-                   xbt_cfgelm_boolean, 0, 1, NULL, NULL);
+                   xbt_cfgelm_boolean, 1, 1, NULL, NULL);
   xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_ONELINK_ONLY, "no");
 
   /* disable destroy */
   xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_DISABLE_DESTROY,
                    "Disable platform containers destruction.",
-                   xbt_cfgelm_boolean, 0, 1, NULL, NULL);
+                   xbt_cfgelm_boolean, 1, 1, NULL, NULL);
   xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_DISABLE_DESTROY, "no");
 
   /* basic -- Avoid extended events (impoverished trace file) */
   xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_BASIC,
                    "Avoid extended events (impoverished trace file).",
-                   xbt_cfgelm_boolean, 0, 1, NULL, NULL);
+                   xbt_cfgelm_boolean, 1, 1, NULL, NULL);
   xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_BASIC, "no");
 
   /* display_sizes -- Extended events with message size information */
   xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_DISPLAY_SIZES,
                    "(smpi only for now) Extended events with message size information",
-                   xbt_cfgelm_boolean, 0, 1, NULL, NULL);
+                   xbt_cfgelm_boolean, 1, 1, NULL, NULL);
   xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_DISPLAY_SIZES, "no");
 
   /* format -- Switch the ouput format of Tracing */
index b096eed..370058c 100644 (file)
@@ -60,7 +60,9 @@ static void jed_free_container(jed_simgrid_container_t container) {
   xbt_free(container);
 }
 
-void jed_simgrid_create_container(jed_simgrid_container_t *container, char *name) {
+void jed_simgrid_create_container(jed_simgrid_container_t *container,
+                                  const char *name)
+{
   xbt_assert( name != NULL );
 
   *container = xbt_new0(s_jed_simgrid_container_t,1);
index ab945ff..4d11263 100644 (file)
@@ -16,6 +16,8 @@
 #include "instr/jedule/jedule_platform.h"
 #include "instr/jedule/jedule_output.h"
 
+#include "simdag/private.h"
+
 #include <stdio.h>
 
 #ifdef HAVE_JEDULE
@@ -57,31 +59,33 @@ static void create_hierarchy(AS_t current_comp,
                              jed_simgrid_container_t current_container)
 {
   xbt_dict_cursor_t cursor = NULL;
-  unsigned int dynar_cursor;
   char *key;
   AS_t elem;
-  sg_routing_edge_t network_elem;
+  xbt_dict_t routing_sons = surf_AS_get_routing_sons(current_comp);
 
-  if(xbt_dict_is_empty(current_comp->routing_sons)) {
+  if (xbt_dict_is_empty(routing_sons)) {
     // I am no AS
     // add hosts to jedule platform
+    xbt_dynar_t table = surf_AS_get_hosts(current_comp);
     xbt_dynar_t hosts;
+    unsigned int dynar_cursor;
+    sg_host_t host_elem;
 
     hosts = xbt_dynar_new(sizeof(char*), NULL);
 
-    xbt_dynar_foreach(current_comp->index_network_elm,
-          dynar_cursor, network_elem) {
-      xbt_dynar_push_as(hosts, char*, network_elem->name);
+    xbt_dynar_foreach(table, dynar_cursor, host_elem) {
+      xbt_dynar_push_as(hosts, char*, sg_host_name(host_elem));
     }
 
     jed_simgrid_add_resources(current_container, hosts);
     xbt_dynar_free(&hosts);
+    xbt_dynar_free(&table);
   } else {
-    xbt_dict_foreach(current_comp->routing_sons, cursor, key, elem) {
+    xbt_dict_foreach(routing_sons, cursor, key, elem) {
       jed_simgrid_container_t child_container;
-      jed_simgrid_create_container(&child_container, elem->name);
+      jed_simgrid_create_container(&child_container, surf_AS_get_name(elem));
       jed_simgrid_add_container(current_container, child_container);
-      XBT_DEBUG("name : %s\n", elem->name);
+      XBT_DEBUG("name : %s\n", surf_AS_get_name(elem));
       create_hierarchy(elem, child_container);
     }
   }
@@ -94,20 +98,15 @@ void jedule_setup_platform()
 
   jed_simgrid_container_t root_container;
 
-
   jed_create_jedule(&jedule);
 
-  root_comp = routing_platf->root;
-  XBT_DEBUG("root name %s\n", root_comp->name);
+  root_comp = surf_AS_get_routing_root();
+  XBT_DEBUG("root name %s\n", surf_AS_get_name(root_comp));
 
-  // that doesn't work
-  // type = root_comp->get_network_element_type(root_comp->name);
-
-  jed_simgrid_create_container(&root_container, root_comp->name);
+  jed_simgrid_create_container(&root_container, surf_AS_get_name(root_comp));
   jedule->root_container = root_container;
 
   create_hierarchy(root_comp, root_container);
-
 }
 
 
index cc6350b..f734ec7 100644 (file)
@@ -30,7 +30,7 @@ void MC_memory_init()
   raw_heap = NULL;
 #else
   /* Create the second region a page after the first one ends + safety gap */
-  raw_heap = xbt_mheap_new(-1, (char*)(std_heap) + STD_HEAP_SIZE + getpagesize());
+  raw_heap = xbt_mheap_new(-1, (char*)(std_heap) + STD_HEAP_SIZE + xbt_pagesize);
   xbt_assert(raw_heap != NULL);
 #endif
 }
index eee4578..52d88d8 100644 (file)
@@ -71,7 +71,7 @@ void MSG_init_nocheck(int *argc, char **argv) {
   XBT_DEBUG("ADD MSG LEVELS");
   MSG_HOST_LEVEL = xbt_lib_add_level(host_lib, (void_f_pvoid_t) __MSG_host_priv_free);
   MSG_STORAGE_LEVEL = xbt_lib_add_level(storage_lib, (void_f_pvoid_t) __MSG_storage_destroy);
-
+  MSG_FILE_LEVEL = xbt_lib_add_level(file_lib, (void_f_pvoid_t) __MSG_file_destroy);
   if(sg_cfg_get_boolean("clean_atexit")) atexit(MSG_exit);
 }
 
index b80ae0f..dbf0eac 100644 (file)
@@ -430,12 +430,10 @@ msg_comm_t MSG_task_isend_internal(msg_task_t task, const char *alias,
   }
 
 #ifdef HAVE_TRACING
-    if (TRACE_is_enabled()) {
-      simcall_set_category(comm->s_comm, task->category);
-    }
-#endif
+  if (TRACE_is_enabled()) {
+    simcall_set_category(act, task->category);
+  }
 
-#ifdef HAVE_TRACING
   if (call_end)
     TRACE_msg_task_put_end();
 #endif
index 5c2eec8..00e126c 100644 (file)
@@ -402,10 +402,21 @@ double MSG_get_host_consumed_energy(msg_host_t host) {
  * \param host a host
  * \return a dict containing all mount point on the host (mount_name => msg_storage_t)
  */
-xbt_dict_t MSG_host_get_storage_list(msg_host_t host)
+xbt_dict_t MSG_host_get_mounted_storage_list(msg_host_t host)
 {
   xbt_assert((host != NULL), "Invalid parameters");
-  return (simcall_host_get_storage_list(host));
+  return (simcall_host_get_mounted_storage_list(host));
+}
+
+/** \ingroup m_host_management
+ * \brief Return the list of storages attached to an host.
+ * \param host a host
+ * \return a dynar containing all storages (name) attached to the host
+ */
+xbt_dynar_t MSG_host_get_attached_storage_list(msg_host_t host)
+{
+  xbt_assert((host != NULL), "Invalid parameters");
+  return (simcall_host_get_attached_storage_list(host));
 }
 
 /** \ingroup msg_host_management
@@ -422,7 +433,7 @@ xbt_dict_t MSG_host_get_storage_content(msg_host_t host)
   char* mount_name;
   xbt_dict_cursor_t cursor = NULL;
 
-  xbt_dict_t storage_list = simcall_host_get_storage_list(host);
+  xbt_dict_t storage_list = simcall_host_get_mounted_storage_list(host);
 
   xbt_dict_foreach(storage_list,cursor,mount_name,storage_name){
     storage = (msg_storage_t)xbt_lib_get_elm_or_null(storage_lib,storage_name);
index 0037056..ec54dd9 100644 (file)
@@ -19,15 +19,17 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(msg_io, msg,
 
 /********************************* File **************************************/
 void __MSG_file_get_info(msg_file_t fd){
-  xbt_dynar_t info = simcall_file_get_info(fd->simdata->smx_file);
+
+  msg_file_priv_t priv = MSG_file_priv(fd);
+  xbt_dynar_t info = simcall_file_get_info(priv->simdata->smx_file);
   sg_size_t *psize;
 
-  fd->info->content_type = xbt_dynar_pop_as(info, char *);
-  fd->info->storage_type = xbt_dynar_pop_as(info, char *);
-  fd->info->storageId = xbt_dynar_pop_as(info, char *);
-  fd->info->mount_point = xbt_dynar_pop_as(info, char *);
+  priv->content_type = xbt_dynar_pop_as(info, char *);
+  priv->storage_type = xbt_dynar_pop_as(info, char *);
+  priv->storageId = xbt_dynar_pop_as(info, char *);
+  priv->mount_point = xbt_dynar_pop_as(info, char *);
   psize = xbt_dynar_pop_as(info, sg_size_t*);
-  fd->info->size = *psize;
+  priv->size = *psize;
   xbt_free(psize);
   xbt_dynar_free_container(&info);
 }
@@ -41,8 +43,8 @@ void __MSG_file_get_info(msg_file_t fd){
  */
 msg_error_t MSG_file_set_data(msg_file_t fd, void *data)
 {
-  SIMIX_file_set_data(fd->simdata->smx_file,data);
-
+  msg_file_priv_t priv = MSG_file_priv(fd);
+  priv->data = data;
   return MSG_OK;
 }
 
@@ -55,7 +57,8 @@ msg_error_t MSG_file_set_data(msg_file_t fd, void *data)
  */
 void *MSG_file_get_data(msg_file_t fd)
 {
-  return SIMIX_file_get_data(fd->simdata->smx_file);
+  msg_file_priv_t priv = MSG_file_priv(fd);
+  return priv->data;
 }
 
 /** \ingroup msg_file_management
@@ -65,19 +68,20 @@ void *MSG_file_get_data(msg_file_t fd)
  */
 
 void MSG_file_dump (msg_file_t fd){
-//   THROW_UNIMPLEMENTED;
   /* Update the cached information first */
   __MSG_file_get_info(fd);
+
+  msg_file_priv_t priv = MSG_file_priv(fd);
   XBT_INFO("File Descriptor information:\n"
-           "\t\tFull name: '%s'\n"
+           "\t\tFull path: '%s'\n"
            "\t\tSize: %llu\n"
            "\t\tMount point: '%s'\n"
            "\t\tStorage Id: '%s'\n"
            "\t\tStorage Type: '%s'\n"
            "\t\tContent Type: '%s'",
-           fd->fullname, fd->info->size, fd->info->mount_point,
-           fd->info->storageId, fd->info->storage_type,
-           fd->info->content_type);
+           priv->fullpath, priv->size, priv->mount_point,
+           priv->storageId, priv->storage_type,
+           priv->content_type);
 }
 
 /** \ingroup msg_file_management
@@ -89,7 +93,8 @@ void MSG_file_dump (msg_file_t fd){
  */
 sg_size_t MSG_file_read(msg_file_t fd, sg_size_t size)
 {
-  return simcall_file_read(fd->simdata->smx_file, size);
+  msg_file_priv_t priv = MSG_file_priv(fd);
+  return simcall_file_read(priv->simdata->smx_file, size);
 }
 
 /** \ingroup msg_file_management
@@ -101,27 +106,37 @@ sg_size_t MSG_file_read(msg_file_t fd, sg_size_t size)
  */
 sg_size_t MSG_file_write(msg_file_t fd, sg_size_t size)
 {
-  return simcall_file_write(fd->simdata->smx_file, size);
+  msg_file_priv_t priv = MSG_file_priv(fd);
+  return simcall_file_write(priv->simdata->smx_file, size);
 }
 
 /** \ingroup msg_file_management
  * \brief Opens the file whose name is the string pointed to by path
  *
  * \param mount is the mount point where find the file is located
- * \param fullname is the file location on the storage
+ * \param fullpath is the file location on the storage
  * \param data user data to attach to the file
  *
  * \return An #msg_file_t associated to the file
  */
-msg_file_t MSG_file_open(const char* mount, const char* fullname, void* data)
+msg_file_t MSG_file_open(const char* fullpath, void* data)
+{
+  msg_file_priv_t priv = xbt_new(s_msg_file_priv_t, 1);
+  priv->data = data;
+  priv->fullpath = xbt_strdup(fullpath);
+  priv->simdata = xbt_new0(s_simdata_file_t,1);
+  priv->simdata->smx_file = simcall_file_open(fullpath);
+  xbt_lib_set(file_lib, fullpath, MSG_FILE_LEVEL, priv);
+  return (msg_file_t) xbt_lib_get_elm_or_null(file_lib, fullpath);
+}
+
+/**
+ * \brief Frees private data of a file (internal call only)
+ */
+void __MSG_file_priv_free(msg_file_priv_t priv)
 {
-  msg_file_t file = xbt_new(s_msg_file_t,1);
-  file->fullname = xbt_strdup(fullname);
-  file->simdata = xbt_new0(s_simdata_file_t,1);
-  file->info = xbt_new0(s_msg_file_info_t,1);
-  file->simdata->smx_file = simcall_file_open(mount, fullname);
-  SIMIX_file_set_data(file->simdata->smx_file, data);
-  return file;
+  xbt_free(&priv->simdata->smx_file);
+  free(priv);
 }
 
 /** \ingroup msg_file_management
@@ -132,11 +147,9 @@ msg_file_t MSG_file_open(const char* mount, const char* fullname, void* data)
  */
 int MSG_file_close(msg_file_t fd)
 {
-  int res = simcall_file_close(fd->simdata->smx_file);
-  free(fd->fullname);
-  xbt_free(fd->simdata);
-  xbt_free(fd->info);
-  xbt_free(fd);
+  msg_file_priv_t priv = MSG_file_priv(fd);
+  int res = simcall_file_close(priv->simdata->smx_file);
+  xbt_lib_unset(file_lib, priv->fullpath, MSG_FILE_LEVEL, 1);
   return res;
 }
 
@@ -148,11 +161,8 @@ int MSG_file_close(msg_file_t fd)
  */
 int MSG_file_unlink(msg_file_t fd)
 {
-  int res = simcall_file_unlink(fd->simdata->smx_file);
-  free(fd->fullname);
-  xbt_free(fd->simdata);
-  xbt_free(fd->info);
-  xbt_free(fd);
+  msg_file_priv_t priv = MSG_file_priv(fd);
+  int res = simcall_file_unlink(priv->simdata->smx_file);
   return res;
 }
 
@@ -163,7 +173,8 @@ int MSG_file_unlink(msg_file_t fd)
  * \return the size of the file (as a #sg_size_t)
  */
 sg_size_t MSG_file_get_size(msg_file_t fd){
-  return simcall_file_get_size(fd->simdata->smx_file);
+  msg_file_priv_t priv = MSG_file_priv(fd);
+  return simcall_file_get_size(priv->simdata->smx_file);
 }
 
 /** \ingroup msg_file_management
@@ -190,7 +201,7 @@ xbt_dict_t MSG_file_ls(const char *mount, const char *path)
   return simcall_file_ls(mount, path);
 }
 
-/*
+/**
  * \ingroup msg_file_management
  * \brief Set the file position indicator in the msg_file_t by adding offset bytes
  * to the position specified by origin (either SEEK_SET, SEEK_CUR, or SEEK_END).
@@ -198,7 +209,7 @@ xbt_dict_t MSG_file_ls(const char *mount, const char *path)
  * \param fd : file object that identifies the stream
  * \param offset : number of bytes to offset from origin
  * \param origin : Position used as reference for the offset. It is specified by
- * one of the following constants defined in <cstdio> exclusively to be used as
+ * one of the following constants defined in \<stdio.h\> exclusively to be used as
  * arguments for this function (SEEK_SET = beginning of file, SEEK_CUR = current
  * position of the file pointer, SEEK_END = end of file)
  *
@@ -208,11 +219,11 @@ xbt_dict_t MSG_file_ls(const char *mount, const char *path)
  */
 msg_error_t MSG_file_seek(msg_file_t fd, sg_size_t offset, int origin)
 {
-  //THROW_UNIMPLEMENTED;
-  return simcall_file_seek(fd->simdata->smx_file, offset, origin);
+  msg_file_priv_t priv = MSG_file_priv(fd);
+  return simcall_file_seek(priv->simdata->smx_file, offset, origin);
 }
 
-/*
+/**
  * \ingroup msg_file_management
  * \brief Returns the current value of the position indicator of the file
  *
@@ -222,10 +233,25 @@ msg_error_t MSG_file_seek(msg_file_t fd, sg_size_t offset, int origin)
  */
 sg_size_t MSG_file_tell(msg_file_t fd)
 {
-  return simcall_file_tell(fd->simdata->smx_file);
+  msg_file_priv_t priv = MSG_file_priv(fd);
+  return simcall_file_tell(priv->simdata->smx_file);
+}
+
+const char *MSG_file_get_name(msg_file_t fd) {
+  xbt_assert((fd != NULL), "Invalid parameters");
+  msg_file_priv_t priv = MSG_file_priv(fd);
+  return priv->fullpath;
 }
 
 
+/*
+ * \brief Destroys a file (internal call only)
+ */
+void __MSG_file_destroy(msg_file_priv_t file) {
+  xbt_free(file->fullpath);
+  xbt_free(file->simdata);
+  xbt_free(file);
+}
 /********************************* Storage **************************************/
 
 /** @addtogroup msg_storage_management
@@ -237,7 +263,9 @@ sg_size_t MSG_file_tell(msg_file_t fd)
 msg_storage_t __MSG_storage_create(smx_storage_t storage)
 {
   const char *name = SIMIX_storage_get_name(storage);
+  const char *host = SIMIX_storage_get_host(storage);
   msg_storage_priv_t storage_private = xbt_new0(s_msg_storage_priv_t, 1);
+  storage_private->host = host;
   xbt_lib_set(storage_lib,name,MSG_STORAGE_LEVEL,storage_private);
   return xbt_lib_get_elm_or_null(storage_lib, name);
 }
@@ -246,10 +274,10 @@ msg_storage_t __MSG_storage_create(smx_storage_t storage)
  * \brief Destroys a storage (internal call only)
  */
 void __MSG_storage_destroy(msg_storage_priv_t storage) {
-
   free(storage);
 }
 
+
 /** \ingroup msg_storage_management
  *
  * \brief Returns the name of the #msg_storage_t.
@@ -324,12 +352,11 @@ xbt_dynar_t MSG_storages_as_dynar(void) {
   xbt_dynar_t res = xbt_dynar_new(sizeof(msg_storage_t),NULL);
 
   xbt_lib_foreach(storage_lib, cursor, key, data) {
-    if(routing_get_network_element_type(key) == MSG_STORAGE_LEVEL) {
+         if(xbt_lib_get_level(xbt_lib_get_elm_or_null(storage_lib, key), MSG_STORAGE_LEVEL) != NULL) {
       xbt_dictelm_t elm = xbt_dict_cursor_get_elm(cursor);
       xbt_dynar_push(res, &elm);
     }
   }
-
   return res;
 }
 
@@ -341,8 +368,8 @@ xbt_dynar_t MSG_storages_as_dynar(void) {
  */
 msg_error_t MSG_storage_set_data(msg_storage_t storage, void *data)
 {
-  SIMIX_storage_set_data(storage,data);
-
+  msg_storage_priv_t priv = MSG_storage_priv(storage);
+  priv->data = data;
   return MSG_OK;
 }
 
@@ -355,7 +382,9 @@ msg_error_t MSG_storage_set_data(msg_storage_t storage, void *data)
  */
 void *MSG_storage_get_data(msg_storage_t storage)
 {
-  return SIMIX_storage_get_data(storage);
+  xbt_assert((storage != NULL), "Invalid parameters");
+  msg_storage_priv_t priv = MSG_storage_priv(storage);
+  return priv->data;
 }
 
 /** \ingroup msg_storage_management
@@ -374,7 +403,7 @@ sg_size_t MSG_storage_get_size(msg_storage_t storage)
   return SIMIX_storage_get_size(storage);
 }
 
-/*
+/**
  * \ingroup msg_storage_management
  *
  * \brief Rename the file in the contents of its associated storage.
@@ -385,7 +414,7 @@ msg_error_t MSG_storage_file_rename(msg_storage_t storage, const char* src,  con
   return MSG_OK;
 }
 
-/*
+/**
  * \ingroup msg_storage_management
  * \brief Move a file to another location. Depending on the values of dest, dest, mount,
  * and fullname, this move can be local or remote and, within a host, on the same
@@ -397,3 +426,15 @@ msg_error_t MSG_storage_file_move (msg_file_t fd, msg_host_t dest, char* mount,
   THROW_UNIMPLEMENTED;
   return MSG_OK;
 }
+
+/** \ingroup msg_storage_management
+ *
+ * \brief Returns the host name the storage is attached to
+ *
+ * This functions checks whether a storage is a valid pointer or not and return its name.
+ */
+const char *MSG_storage_get_host(msg_storage_t storage) {
+  xbt_assert((storage != NULL), "Invalid parameters");
+  msg_storage_priv_t priv = MSG_storage_priv(storage);
+  return priv->host;
+}
index d4cc33b..5644882 100644 (file)
@@ -50,11 +50,6 @@ typedef struct simdata_file {
   smx_file_t smx_file;
 } s_simdata_file_t;
 
-/********************************* Storage **************************************/
-typedef struct simdata_storage {
-  smx_storage_t smx_storage;
-} s_simdata_storage_t;
-
 /*************** Begin GPU ***************/
 typedef struct simdata_gpu_task {
   double computation_amount;    /* Computation size */
@@ -146,12 +141,15 @@ msg_host_t __MSG_host_create(smx_host_t workstation);
 msg_storage_t __MSG_storage_create(smx_storage_t storage);
 void __MSG_host_destroy(msg_host_t host);
 void __MSG_storage_destroy(msg_storage_priv_t host);
+void __MSG_file_destroy(msg_file_priv_t host);
 
 void MSG_process_cleanup_from_SIMIX(smx_process_t smx_proc);
 void MSG_process_create_from_SIMIX(smx_process_t *process, const char *name,
                                    xbt_main_func_t code, void *data,
-                                   const char *hostname, double kill_time,  int argc,
-                                   char **argv, xbt_dict_t properties, int auto_restart);
+                                   const char *hostname, double kill_time,
+                                   int argc, char **argv,
+                                   xbt_dict_t properties, int auto_restart,
+                                   smx_process_t parent_process);
 void MSG_comm_copy_data_from_SIMIX(smx_action_t comm, void* buff, size_t buff_size);
 
 void _MSG_action_init(void);
index 6fbe364..6a64e9d 100644 (file)
@@ -56,9 +56,11 @@ void MSG_process_cleanup_from_SIMIX(smx_process_t smx_proc)
 
 /* This function creates a MSG process. It has the prototype enforced by SIMIX_function_register_process_create */
 void MSG_process_create_from_SIMIX(smx_process_t* process, const char *name,
-                                    xbt_main_func_t code, void *data,
-                                    const char *hostname, double kill_time, int argc, char **argv,
-                                    xbt_dict_t properties, int auto_restart)
+                                   xbt_main_func_t code, void *data,
+                                   const char *hostname, double kill_time,
+                                   int argc, char **argv,
+                                   xbt_dict_t properties, int auto_restart,
+                                   smx_process_t parent_process)
 {
   msg_host_t host = MSG_get_host_by_name(hostname);
   msg_process_t p = MSG_process_create_with_environment(name, code, data,
index 2fcbd20..8e1cded 100644 (file)
@@ -1337,81 +1337,81 @@ const char dax__flexml_version[] = "1.9.6";
 int dax__pcdata_ix;
 extern char *dax__bufferstack;
 #define dax__pcdata (dax__bufferstack + dax__pcdata_ix)
+AT_dax__adag_version AX_dax__adag_version;
+#define A_dax__adag_version (dax__bufferstack + AX_dax__adag_version)
+short int dax__adag_version_isset;
+AT_dax__uses_type AX_dax__uses_type;
+#define A_dax__uses_type (dax__bufferstack + AX_dax__uses_type)
+short int dax__uses_type_isset;
+AT_dax__uses_optional AX_dax__uses_optional;
+#define A_dax__uses_optional AX_dax__uses_optional
+short int dax__uses_optional_isset;
+AT_dax__adag_name AX_dax__adag_name;
+#define A_dax__adag_name (dax__bufferstack + AX_dax__adag_name)
+short int dax__adag_name_isset;
+AT_dax__child_ref AX_dax__child_ref;
+#define A_dax__child_ref (dax__bufferstack + AX_dax__child_ref)
+short int dax__child_ref_isset;
+AT_dax__adag_xmlns AX_dax__adag_xmlns;
+#define A_dax__adag_xmlns (dax__bufferstack + AX_dax__adag_xmlns)
+short int dax__adag_xmlns_isset;
+AT_dax__uses_transfer AX_dax__uses_transfer;
+#define A_dax__uses_transfer AX_dax__uses_transfer
+short int dax__uses_transfer_isset;
 AT_dax__job_id AX_dax__job_id;
 #define A_dax__job_id (dax__bufferstack + AX_dax__job_id)
 short int dax__job_id_isset;
+AT_dax__uses_file AX_dax__uses_file;
+#define A_dax__uses_file (dax__bufferstack + AX_dax__uses_file)
+short int dax__uses_file_isset;
 AT_dax__parent_ref AX_dax__parent_ref;
 #define A_dax__parent_ref (dax__bufferstack + AX_dax__parent_ref)
 short int dax__parent_ref_isset;
-AT_dax__adag_fileCount AX_dax__adag_fileCount;
-#define A_dax__adag_fileCount (dax__bufferstack + AX_dax__adag_fileCount)
-short int dax__adag_fileCount_isset;
-AT_dax__adag_jobCount AX_dax__adag_jobCount;
-#define A_dax__adag_jobCount (dax__bufferstack + AX_dax__adag_jobCount)
-short int dax__adag_jobCount_isset;
-AT_dax__adag_xmlns AX_dax__adag_xmlns;
-#define A_dax__adag_xmlns (dax__bufferstack + AX_dax__adag_xmlns)
-short int dax__adag_xmlns_isset;
-AT_dax__uses_register AX_dax__uses_register;
-#define A_dax__uses_register AX_dax__uses_register
-short int dax__uses_register_isset;
-AT_dax__adag_name AX_dax__adag_name;
-#define A_dax__adag_name (dax__bufferstack + AX_dax__adag_name)
-short int dax__adag_name_isset;
-AT_dax__adag_xsi_c_schemaLocation AX_dax__adag_xsi_c_schemaLocation;
-#define A_dax__adag_xsi_c_schemaLocation (dax__bufferstack + AX_dax__adag_xsi_c_schemaLocation)
-short int dax__adag_xsi_c_schemaLocation_isset;
-AT_dax__job_level AX_dax__job_level;
-#define A_dax__job_level (dax__bufferstack + AX_dax__job_level)
-short int dax__job_level_isset;
-AT_dax__uses_optional AX_dax__uses_optional;
-#define A_dax__uses_optional AX_dax__uses_optional
-short int dax__uses_optional_isset;
+AT_dax__adag_count AX_dax__adag_count;
+#define A_dax__adag_count (dax__bufferstack + AX_dax__adag_count)
+short int dax__adag_count_isset;
+AT_dax__adag_xmlns_c_xsi AX_dax__adag_xmlns_c_xsi;
+#define A_dax__adag_xmlns_c_xsi (dax__bufferstack + AX_dax__adag_xmlns_c_xsi)
+short int dax__adag_xmlns_c_xsi_isset;
+AT_dax__adag_index AX_dax__adag_index;
+#define A_dax__adag_index (dax__bufferstack + AX_dax__adag_index)
+short int dax__adag_index_isset;
 AT_dax__uses_size AX_dax__uses_size;
 #define A_dax__uses_size (dax__bufferstack + AX_dax__uses_size)
 short int dax__uses_size_isset;
-AT_dax__uses_link AX_dax__uses_link;
-#define A_dax__uses_link AX_dax__uses_link
-short int dax__uses_link_isset;
-AT_dax__uses_transfer AX_dax__uses_transfer;
-#define A_dax__uses_transfer AX_dax__uses_transfer
-short int dax__uses_transfer_isset;
-AT_dax__uses_type AX_dax__uses_type;
-#define A_dax__uses_type (dax__bufferstack + AX_dax__uses_type)
-short int dax__uses_type_isset;
 AT_dax__adag_childCount AX_dax__adag_childCount;
 #define A_dax__adag_childCount (dax__bufferstack + AX_dax__adag_childCount)
 short int dax__adag_childCount_isset;
-AT_dax__job_namespace AX_dax__job_namespace;
-#define A_dax__job_namespace (dax__bufferstack + AX_dax__job_namespace)
-short int dax__job_namespace_isset;
-AT_dax__child_ref AX_dax__child_ref;
-#define A_dax__child_ref (dax__bufferstack + AX_dax__child_ref)
-short int dax__child_ref_isset;
-AT_dax__uses_file AX_dax__uses_file;
-#define A_dax__uses_file (dax__bufferstack + AX_dax__uses_file)
-short int dax__uses_file_isset;
-AT_dax__job_version AX_dax__job_version;
-#define A_dax__job_version (dax__bufferstack + AX_dax__job_version)
-short int dax__job_version_isset;
+AT_dax__uses_link AX_dax__uses_link;
+#define A_dax__uses_link AX_dax__uses_link
+short int dax__uses_link_isset;
 AT_dax__job_runtime AX_dax__job_runtime;
 #define A_dax__job_runtime (dax__bufferstack + AX_dax__job_runtime)
 short int dax__job_runtime_isset;
-AT_dax__adag_index AX_dax__adag_index;
-#define A_dax__adag_index (dax__bufferstack + AX_dax__adag_index)
-short int dax__adag_index_isset;
-AT_dax__adag_version AX_dax__adag_version;
-#define A_dax__adag_version (dax__bufferstack + AX_dax__adag_version)
-short int dax__adag_version_isset;
-AT_dax__adag_count AX_dax__adag_count;
-#define A_dax__adag_count (dax__bufferstack + AX_dax__adag_count)
-short int dax__adag_count_isset;
+AT_dax__job_level AX_dax__job_level;
+#define A_dax__job_level (dax__bufferstack + AX_dax__job_level)
+short int dax__job_level_isset;
+AT_dax__job_namespace AX_dax__job_namespace;
+#define A_dax__job_namespace (dax__bufferstack + AX_dax__job_namespace)
+short int dax__job_namespace_isset;
 AT_dax__job_name AX_dax__job_name;
 #define A_dax__job_name (dax__bufferstack + AX_dax__job_name)
 short int dax__job_name_isset;
-AT_dax__adag_xmlns_c_xsi AX_dax__adag_xmlns_c_xsi;
-#define A_dax__adag_xmlns_c_xsi (dax__bufferstack + AX_dax__adag_xmlns_c_xsi)
-short int dax__adag_xmlns_c_xsi_isset;
+AT_dax__adag_jobCount AX_dax__adag_jobCount;
+#define A_dax__adag_jobCount (dax__bufferstack + AX_dax__adag_jobCount)
+short int dax__adag_jobCount_isset;
+AT_dax__job_version AX_dax__job_version;
+#define A_dax__job_version (dax__bufferstack + AX_dax__job_version)
+short int dax__job_version_isset;
+AT_dax__adag_xsi_c_schemaLocation AX_dax__adag_xsi_c_schemaLocation;
+#define A_dax__adag_xsi_c_schemaLocation (dax__bufferstack + AX_dax__adag_xsi_c_schemaLocation)
+short int dax__adag_xsi_c_schemaLocation_isset;
+AT_dax__uses_register AX_dax__uses_register;
+#define A_dax__uses_register AX_dax__uses_register
+short int dax__uses_register_isset;
+AT_dax__adag_fileCount AX_dax__adag_fileCount;
+#define A_dax__adag_fileCount (dax__bufferstack + AX_dax__adag_fileCount)
+short int dax__adag_fileCount_isset;
 
 /* XML state. */
 #ifdef FLEX_DEBUG
@@ -2204,10 +2204,10 @@ YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</adag>' expected.",dax_text[0]);
        YY_BREAK
 case YY_STATE_EOF(S_dax__adag_1):
-case YY_STATE_EOF(S_dax__adag_3):
+case YY_STATE_EOF(S_dax__adag_5):
 case YY_STATE_EOF(E_dax__adag):
+case YY_STATE_EOF(S_dax__adag_3):
 case YY_STATE_EOF(S_dax__adag):
-case YY_STATE_EOF(S_dax__adag_5):
 FAIL("Premature EOF: `</adag>' expected.");
        YY_BREAK
 
@@ -2313,7 +2313,7 @@ YY_RULE_SETUP
   if (!AX_dax__job_runtime) FAIL("Required attribute `runtime' not set for `job' element.");
   LEAVE; STag_dax__job(); dax__pcdata_ix = 0; ETag_dax__job(); popbuffer(); /* attribute */
   switch (YY_START) {
-   case S_dax__adag: case S_dax__adag_3: case S_dax__adag_2: SET(S_dax__adag_3); break;
+   case S_dax__adag_2: case S_dax__adag_3: case S_dax__adag: SET(S_dax__adag_3); break;
   }
  }
        YY_BREAK
@@ -2337,7 +2337,7 @@ YY_RULE_SETUP
   ETag_dax__job();
   popbuffer(); /* attribute */
   switch (YY_START) {
-   case S_dax__adag: case S_dax__adag_3: case S_dax__adag_2: SET(S_dax__adag_3); break;
+   case S_dax__adag_2: case S_dax__adag_3: case S_dax__adag: SET(S_dax__adag_3); break;
   }
  }
        YY_BREAK
@@ -2350,9 +2350,9 @@ case 65:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</job>' expected.",dax_text[0]);
        YY_BREAK
-case YY_STATE_EOF(S_dax__job_2):
-case YY_STATE_EOF(E_dax__job):
 case YY_STATE_EOF(S_dax__job):
+case YY_STATE_EOF(E_dax__job):
+case YY_STATE_EOF(S_dax__job_2):
 FAIL("Premature EOF: `</job>' expected.");
        YY_BREAK
 
@@ -2486,7 +2486,7 @@ YY_RULE_SETUP
   if (!AX_dax__uses_size) FAIL("Required attribute `size' not set for `uses' element.");
   LEAVE; STag_dax__uses(); dax__pcdata_ix = 0; ETag_dax__uses(); popbuffer(); /* attribute */
   switch (YY_START) {
-   case S_dax__job_2: case S_dax__job_1: case S_dax__job: SET(S_dax__job_2); break;
+   case S_dax__job: case S_dax__job_2: case S_dax__job_1: SET(S_dax__job_2); break;
   }
  }
        YY_BREAK
@@ -2510,7 +2510,7 @@ YY_RULE_SETUP
   ETag_dax__uses();
   popbuffer(); /* attribute */
   switch (YY_START) {
-   case S_dax__job_2: case S_dax__job_1: case S_dax__job: SET(S_dax__job_2); break;
+   case S_dax__job: case S_dax__job_2: case S_dax__job_1: SET(S_dax__job_2); break;
   }
  }
        YY_BREAK
@@ -2565,7 +2565,7 @@ YY_RULE_SETUP
   if (!AX_dax__child_ref) FAIL("Required attribute `ref' not set for `child' element.");
   LEAVE; STag_dax__child(); dax__pcdata_ix = 0; ETag_dax__child(); popbuffer(); /* attribute */
   switch (YY_START) {
-   case S_dax__adag_4: case S_dax__adag_1: case S_dax__adag_3: case S_dax__adag: case S_dax__adag_5: SET(S_dax__adag_5); break;
+   case S_dax__adag_1: case S_dax__adag_4: case S_dax__adag_5: case S_dax__adag_3: case S_dax__adag: SET(S_dax__adag_5); break;
   }
  }
        YY_BREAK
@@ -2589,7 +2589,7 @@ YY_RULE_SETUP
   ETag_dax__child();
   popbuffer(); /* attribute */
   switch (YY_START) {
-   case S_dax__adag_4: case S_dax__adag_1: case S_dax__adag_3: case S_dax__adag: case S_dax__adag_5: SET(S_dax__adag_5); break;
+   case S_dax__adag_1: case S_dax__adag_4: case S_dax__adag_5: case S_dax__adag_3: case S_dax__adag: SET(S_dax__adag_5); break;
   }
  }
        YY_BREAK
@@ -2602,9 +2602,9 @@ case 107:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</child>' expected.",dax_text[0]);
        YY_BREAK
-case YY_STATE_EOF(S_dax__child):
-case YY_STATE_EOF(E_dax__child):
 case YY_STATE_EOF(S_dax__child_2):
+case YY_STATE_EOF(E_dax__child):
+case YY_STATE_EOF(S_dax__child):
 FAIL("Premature EOF: `</child>' expected.");
        YY_BREAK
 
index 8629a08..e31871d 100644 (file)
@@ -60,132 +60,132 @@ XBT_PUBLIC(void) STag_dax__parent(void);
 XBT_PUBLIC(void) ETag_dax__parent(void);
 
 /* XML application data. */
-typedef int AT_dax__adag_name;
-#define AU_dax__adag_name NULL
-typedef int AT_dax__job_level;
-#define AU_dax__job_level NULL
+typedef int AT_dax__adag_version;
+#define AU_dax__adag_version NULL
 typedef int AT_dax__uses_type;
 #define AU_dax__uses_type NULL
-typedef int AT_dax__adag_fileCount;
-#define AU_dax__adag_fileCount NULL
+typedef enum { AU_dax__uses_optional, A_dax__uses_optional_false,A_dax__uses_optional_true } AT_dax__uses_optional;
+typedef int AT_dax__adag_name;
+#define AU_dax__adag_name NULL
 typedef int AT_dax__child_ref;
 #define AU_dax__child_ref NULL
-typedef enum { AU_dax__uses_link, A_dax__uses_link_input,A_dax__uses_link_output } AT_dax__uses_link;
-typedef int AT_dax__adag_count;
-#define AU_dax__adag_count NULL
-typedef int AT_dax__uses_file;
-#define AU_dax__uses_file NULL
-typedef int AT_dax__adag_xsi_c_schemaLocation;
-#define AU_dax__adag_xsi_c_schemaLocation NULL
-typedef int AT_dax__job_runtime;
-#define AU_dax__job_runtime NULL
-typedef int AT_dax__job_namespace;
-#define AU_dax__job_namespace NULL
 typedef int AT_dax__adag_xmlns;
 #define AU_dax__adag_xmlns NULL
+typedef enum { AU_dax__uses_transfer, A_dax__uses_transfer_false,A_dax__uses_transfer_true } AT_dax__uses_transfer;
 typedef int AT_dax__job_id;
 #define AU_dax__job_id NULL
-typedef int AT_dax__job_version;
-#define AU_dax__job_version NULL
-typedef enum { AU_dax__uses_optional, A_dax__uses_optional_false,A_dax__uses_optional_true } AT_dax__uses_optional;
+typedef int AT_dax__uses_file;
+#define AU_dax__uses_file NULL
+typedef int AT_dax__parent_ref;
+#define AU_dax__parent_ref NULL
+typedef int AT_dax__adag_count;
+#define AU_dax__adag_count NULL
 typedef int AT_dax__adag_xmlns_c_xsi;
 #define AU_dax__adag_xmlns_c_xsi NULL
+typedef int AT_dax__adag_index;
+#define AU_dax__adag_index NULL
 typedef int AT_dax__uses_size;
 #define AU_dax__uses_size NULL
-typedef int AT_dax__job_name;
-#define AU_dax__job_name NULL
 typedef int AT_dax__adag_childCount;
 #define AU_dax__adag_childCount NULL
-typedef enum { AU_dax__uses_transfer, A_dax__uses_transfer_false,A_dax__uses_transfer_true } AT_dax__uses_transfer;
-typedef int AT_dax__parent_ref;
-#define AU_dax__parent_ref NULL
-typedef int AT_dax__adag_version;
-#define AU_dax__adag_version NULL
+typedef enum { AU_dax__uses_link, A_dax__uses_link_input,A_dax__uses_link_output } AT_dax__uses_link;
+typedef int AT_dax__job_runtime;
+#define AU_dax__job_runtime NULL
+typedef int AT_dax__job_level;
+#define AU_dax__job_level NULL
+typedef int AT_dax__job_namespace;
+#define AU_dax__job_namespace NULL
+typedef int AT_dax__job_name;
+#define AU_dax__job_name NULL
 typedef int AT_dax__adag_jobCount;
 #define AU_dax__adag_jobCount NULL
+typedef int AT_dax__job_version;
+#define AU_dax__job_version NULL
+typedef int AT_dax__adag_xsi_c_schemaLocation;
+#define AU_dax__adag_xsi_c_schemaLocation NULL
 typedef enum { AU_dax__uses_register, A_dax__uses_register_false,A_dax__uses_register_true } AT_dax__uses_register;
-typedef int AT_dax__adag_index;
-#define AU_dax__adag_index NULL
+typedef int AT_dax__adag_fileCount;
+#define AU_dax__adag_fileCount NULL
 
 /* FleXML-provided data. */
 XBT_PUBLIC_DATA(int) dax__pcdata_ix;
 XBT_PUBLIC_DATA(char *) dax__bufferstack;
 #define dax__pcdata (dax__bufferstack + dax__pcdata_ix)
-XBT_PUBLIC_DATA(AT_dax__adag_name) AX_dax__adag_name;
-#define A_dax__adag_name (dax__bufferstack + AX_dax__adag_name)
-XBT_PUBLIC_DATA(short int) dax__adag_name_isset;
-XBT_PUBLIC_DATA(AT_dax__job_level) AX_dax__job_level;
-#define A_dax__job_level (dax__bufferstack + AX_dax__job_level)
-XBT_PUBLIC_DATA(short int) dax__job_level_isset;
+XBT_PUBLIC_DATA(AT_dax__adag_version) AX_dax__adag_version;
+#define A_dax__adag_version (dax__bufferstack + AX_dax__adag_version)
+XBT_PUBLIC_DATA(short int) dax__adag_version_isset;
 XBT_PUBLIC_DATA(AT_dax__uses_type) AX_dax__uses_type;
 #define A_dax__uses_type (dax__bufferstack + AX_dax__uses_type)
 XBT_PUBLIC_DATA(short int) dax__uses_type_isset;
-XBT_PUBLIC_DATA(AT_dax__adag_fileCount) AX_dax__adag_fileCount;
-#define A_dax__adag_fileCount (dax__bufferstack + AX_dax__adag_fileCount)
-XBT_PUBLIC_DATA(short int) dax__adag_fileCount_isset;
+XBT_PUBLIC_DATA(AT_dax__uses_optional) AX_dax__uses_optional;
+#define A_dax__uses_optional AX_dax__uses_optional
+XBT_PUBLIC_DATA(short int) dax__uses_optional_isset;
+XBT_PUBLIC_DATA(AT_dax__adag_name) AX_dax__adag_name;
+#define A_dax__adag_name (dax__bufferstack + AX_dax__adag_name)
+XBT_PUBLIC_DATA(short int) dax__adag_name_isset;
 XBT_PUBLIC_DATA(AT_dax__child_ref) AX_dax__child_ref;
 #define A_dax__child_ref (dax__bufferstack + AX_dax__child_ref)
 XBT_PUBLIC_DATA(short int) dax__child_ref_isset;
-XBT_PUBLIC_DATA(AT_dax__uses_link) AX_dax__uses_link;
-#define A_dax__uses_link AX_dax__uses_link
-XBT_PUBLIC_DATA(short int) dax__uses_link_isset;
-XBT_PUBLIC_DATA(AT_dax__adag_count) AX_dax__adag_count;
-#define A_dax__adag_count (dax__bufferstack + AX_dax__adag_count)
-XBT_PUBLIC_DATA(short int) dax__adag_count_isset;
-XBT_PUBLIC_DATA(AT_dax__uses_file) AX_dax__uses_file;
-#define A_dax__uses_file (dax__bufferstack + AX_dax__uses_file)
-XBT_PUBLIC_DATA(short int) dax__uses_file_isset;
-XBT_PUBLIC_DATA(AT_dax__adag_xsi_c_schemaLocation) AX_dax__adag_xsi_c_schemaLocation;
-#define A_dax__adag_xsi_c_schemaLocation (dax__bufferstack + AX_dax__adag_xsi_c_schemaLocation)
-XBT_PUBLIC_DATA(short int) dax__adag_xsi_c_schemaLocation_isset;
-XBT_PUBLIC_DATA(AT_dax__job_runtime) AX_dax__job_runtime;
-#define A_dax__job_runtime (dax__bufferstack + AX_dax__job_runtime)
-XBT_PUBLIC_DATA(short int) dax__job_runtime_isset;
-XBT_PUBLIC_DATA(AT_dax__job_namespace) AX_dax__job_namespace;
-#define A_dax__job_namespace (dax__bufferstack + AX_dax__job_namespace)
-XBT_PUBLIC_DATA(short int) dax__job_namespace_isset;
 XBT_PUBLIC_DATA(AT_dax__adag_xmlns) AX_dax__adag_xmlns;
 #define A_dax__adag_xmlns (dax__bufferstack + AX_dax__adag_xmlns)
 XBT_PUBLIC_DATA(short int) dax__adag_xmlns_isset;
+XBT_PUBLIC_DATA(AT_dax__uses_transfer) AX_dax__uses_transfer;
+#define A_dax__uses_transfer AX_dax__uses_transfer
+XBT_PUBLIC_DATA(short int) dax__uses_transfer_isset;
 XBT_PUBLIC_DATA(AT_dax__job_id) AX_dax__job_id;
 #define A_dax__job_id (dax__bufferstack + AX_dax__job_id)
 XBT_PUBLIC_DATA(short int) dax__job_id_isset;
-XBT_PUBLIC_DATA(AT_dax__job_version) AX_dax__job_version;
-#define A_dax__job_version (dax__bufferstack + AX_dax__job_version)
-XBT_PUBLIC_DATA(short int) dax__job_version_isset;
-XBT_PUBLIC_DATA(AT_dax__uses_optional) AX_dax__uses_optional;
-#define A_dax__uses_optional AX_dax__uses_optional
-XBT_PUBLIC_DATA(short int) dax__uses_optional_isset;
+XBT_PUBLIC_DATA(AT_dax__uses_file) AX_dax__uses_file;
+#define A_dax__uses_file (dax__bufferstack + AX_dax__uses_file)
+XBT_PUBLIC_DATA(short int) dax__uses_file_isset;
+XBT_PUBLIC_DATA(AT_dax__parent_ref) AX_dax__parent_ref;
+#define A_dax__parent_ref (dax__bufferstack + AX_dax__parent_ref)
+XBT_PUBLIC_DATA(short int) dax__parent_ref_isset;
+XBT_PUBLIC_DATA(AT_dax__adag_count) AX_dax__adag_count;
+#define A_dax__adag_count (dax__bufferstack + AX_dax__adag_count)
+XBT_PUBLIC_DATA(short int) dax__adag_count_isset;
 XBT_PUBLIC_DATA(AT_dax__adag_xmlns_c_xsi) AX_dax__adag_xmlns_c_xsi;
 #define A_dax__adag_xmlns_c_xsi (dax__bufferstack + AX_dax__adag_xmlns_c_xsi)
 XBT_PUBLIC_DATA(short int) dax__adag_xmlns_c_xsi_isset;
+XBT_PUBLIC_DATA(AT_dax__adag_index) AX_dax__adag_index;
+#define A_dax__adag_index (dax__bufferstack + AX_dax__adag_index)
+XBT_PUBLIC_DATA(short int) dax__adag_index_isset;
 XBT_PUBLIC_DATA(AT_dax__uses_size) AX_dax__uses_size;
 #define A_dax__uses_size (dax__bufferstack + AX_dax__uses_size)
 XBT_PUBLIC_DATA(short int) dax__uses_size_isset;
-XBT_PUBLIC_DATA(AT_dax__job_name) AX_dax__job_name;
-#define A_dax__job_name (dax__bufferstack + AX_dax__job_name)
-XBT_PUBLIC_DATA(short int) dax__job_name_isset;
 XBT_PUBLIC_DATA(AT_dax__adag_childCount) AX_dax__adag_childCount;
 #define A_dax__adag_childCount (dax__bufferstack + AX_dax__adag_childCount)
 XBT_PUBLIC_DATA(short int) dax__adag_childCount_isset;
-XBT_PUBLIC_DATA(AT_dax__uses_transfer) AX_dax__uses_transfer;
-#define A_dax__uses_transfer AX_dax__uses_transfer
-XBT_PUBLIC_DATA(short int) dax__uses_transfer_isset;
-XBT_PUBLIC_DATA(AT_dax__parent_ref) AX_dax__parent_ref;
-#define A_dax__parent_ref (dax__bufferstack + AX_dax__parent_ref)
-XBT_PUBLIC_DATA(short int) dax__parent_ref_isset;
-XBT_PUBLIC_DATA(AT_dax__adag_version) AX_dax__adag_version;
-#define A_dax__adag_version (dax__bufferstack + AX_dax__adag_version)
-XBT_PUBLIC_DATA(short int) dax__adag_version_isset;
+XBT_PUBLIC_DATA(AT_dax__uses_link) AX_dax__uses_link;
+#define A_dax__uses_link AX_dax__uses_link
+XBT_PUBLIC_DATA(short int) dax__uses_link_isset;
+XBT_PUBLIC_DATA(AT_dax__job_runtime) AX_dax__job_runtime;
+#define A_dax__job_runtime (dax__bufferstack + AX_dax__job_runtime)
+XBT_PUBLIC_DATA(short int) dax__job_runtime_isset;
+XBT_PUBLIC_DATA(AT_dax__job_level) AX_dax__job_level;
+#define A_dax__job_level (dax__bufferstack + AX_dax__job_level)
+XBT_PUBLIC_DATA(short int) dax__job_level_isset;
+XBT_PUBLIC_DATA(AT_dax__job_namespace) AX_dax__job_namespace;
+#define A_dax__job_namespace (dax__bufferstack + AX_dax__job_namespace)
+XBT_PUBLIC_DATA(short int) dax__job_namespace_isset;
+XBT_PUBLIC_DATA(AT_dax__job_name) AX_dax__job_name;
+#define A_dax__job_name (dax__bufferstack + AX_dax__job_name)
+XBT_PUBLIC_DATA(short int) dax__job_name_isset;
 XBT_PUBLIC_DATA(AT_dax__adag_jobCount) AX_dax__adag_jobCount;
 #define A_dax__adag_jobCount (dax__bufferstack + AX_dax__adag_jobCount)
 XBT_PUBLIC_DATA(short int) dax__adag_jobCount_isset;
+XBT_PUBLIC_DATA(AT_dax__job_version) AX_dax__job_version;
+#define A_dax__job_version (dax__bufferstack + AX_dax__job_version)
+XBT_PUBLIC_DATA(short int) dax__job_version_isset;
+XBT_PUBLIC_DATA(AT_dax__adag_xsi_c_schemaLocation) AX_dax__adag_xsi_c_schemaLocation;
+#define A_dax__adag_xsi_c_schemaLocation (dax__bufferstack + AX_dax__adag_xsi_c_schemaLocation)
+XBT_PUBLIC_DATA(short int) dax__adag_xsi_c_schemaLocation_isset;
 XBT_PUBLIC_DATA(AT_dax__uses_register) AX_dax__uses_register;
 #define A_dax__uses_register AX_dax__uses_register
 XBT_PUBLIC_DATA(short int) dax__uses_register_isset;
-XBT_PUBLIC_DATA(AT_dax__adag_index) AX_dax__adag_index;
-#define A_dax__adag_index (dax__bufferstack + AX_dax__adag_index)
-XBT_PUBLIC_DATA(short int) dax__adag_index_isset;
+XBT_PUBLIC_DATA(AT_dax__adag_fileCount) AX_dax__adag_fileCount;
+#define A_dax__adag_fileCount (dax__bufferstack + AX_dax__adag_fileCount)
+XBT_PUBLIC_DATA(short int) dax__adag_fileCount_isset;
 
 /* XML application utilities. */
 XBT_PUBLIC(int) dax__element_context(int);
index 513dd1e..ada782b 100644 (file)
@@ -73,8 +73,12 @@ static inline SD_workstation_priv_t SD_workstation_priv(SD_workstation_t host){
 typedef s_xbt_dictelm_t s_SD_storage_t;
 typedef struct SD_storage {
   void *data;                   /* user data */
+  const char *host;
 } s_SD_storage_priv_t, *SD_storage_priv_t;
 
+static inline SD_storage_priv_t SD_storage_priv(SD_storage_t storage){
+  return xbt_lib_get_level(storage, SD_STORAGE_LEVEL);
+}
 
 /* Task */
 typedef struct SD_task {
index 730ef98..108e640 100644 (file)
@@ -45,8 +45,8 @@ SD_storage_t __SD_storage_create(void *surf_storage, void *data)
 
   storage = xbt_new(s_SD_storage_priv_t, 1);
   storage->data = data;     /* user data */
-
   name = surf_resource_name(surf_storage);
+  storage->host = surf_storage_get_host(surf_storage_resource_by_name(name));
   xbt_lib_set(storage_lib,name, SD_STORAGE_LEVEL, storage);
   return xbt_lib_get_elm_or_null(storage_lib, name);
 }
@@ -476,8 +476,29 @@ void SD_workstation_set_access_mode(SD_workstation_t workstation,
  * \param workstation a workstation
  * \return a dynar containing all mounted storages on the workstation
  */
-xbt_dict_t SD_workstation_get_storage_list(SD_workstation_t workstation){
-  return surf_workstation_get_storage_list(workstation);
+xbt_dict_t SD_workstation_get_mounted_storage_list(SD_workstation_t workstation){
+  return surf_workstation_get_mounted_storage_list(workstation);
+}
+
+/**
+ * \brief Return the list of mounted storages on a workstation.
+ *
+ * \param workstation a workstation
+ * \return a dynar containing all mounted storages on the workstation
+ */
+xbt_dynar_t SD_workstation_get_attached_storage_list(SD_workstation_t workstation){
+  return surf_workstation_get_attached_storage_list(workstation);
+}
+
+/**
+ * \brief Returns the host name the storage is attached to
+ *
+ * This functions checks whether a storage is a valid pointer or not and return its name.
+ */
+const char *SD_storage_get_host(msg_storage_t storage) {
+  xbt_assert((storage != NULL), "Invalid parameters");
+  SD_storage_priv_t priv = SD_storage_priv(storage);
+  return priv->host;
 }
 
 /* Returns whether a task can start now on a workstation*/
index 4ebfb8e..9a97006 100644 (file)
@@ -388,6 +388,12 @@ static void _sg_cfg_cb_context_stack_size(const char *name, int pos)
   smx_context_stack_size = xbt_cfg_get_int(_sg_cfg_set, name) * 1024;
 }
 
+static void _sg_cfg_cb_context_guard_size(const char *name, int pos)
+{
+  smx_context_guard_size_was_set = 1;
+  smx_context_guard_size = xbt_cfg_get_int(_sg_cfg_set, name) * xbt_pagesize;
+}
+
 static void _sg_cfg_cb_contexts_nthreads(const char *name, int pos)
 {
   SIMIX_context_set_nthreads(xbt_cfg_get_int(_sg_cfg_set, name));
@@ -477,7 +483,7 @@ void sg_config_init(int *argc, char **argv)
     describe_model(description, surf_plugin_description,
                    "plugin", "The plugins");
     xbt_cfg_register(&_sg_cfg_set, "plugin", description,
-                     xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__plugin, NULL);
+                     xbt_cfgelm_string, 0, 1, &_sg_cfg_cb__plugin, NULL);
 
     describe_model(description, surf_cpu_model_description,
                    "model", "The model to use for the CPU");
@@ -538,7 +544,8 @@ void sg_config_init(int *argc, char **argv)
     xbt_cfg_register(&_sg_cfg_set, "network/sender_gap",
                      "Minimum gap between two overlapping sends",
                      xbt_cfgelm_double, 1, 1, _sg_cfg_cb__sender_gap, NULL);
-    /* default for "network/sender_gap" is set in network.c */
+    /* real default for "network/sender_gap" is set in network_smpi.cpp */
+    xbt_cfg_setdefault_double(_sg_cfg_set, "network/sender_gap", NAN);
 
     xbt_cfg_register(&_sg_cfg_set, "network/latency_factor",
                      "Correction factor to apply to the provided latency (default value set by network model)",
@@ -553,96 +560,97 @@ void sg_config_init(int *argc, char **argv)
     xbt_cfg_register(&_sg_cfg_set, "network/weight_S",
                      "Correction factor to apply to the weight of competing streams (default value set by network model)",
                      xbt_cfgelm_double, 1, 1, _sg_cfg_cb__weight_S, NULL);
-    /* default for "network/weight_S" is set in network.c */
+    /* real default for "network/weight_S" is set in network_*.cpp */
+    xbt_cfg_setdefault_double(_sg_cfg_set, "network/weight_S", NAN);
 
     /* Inclusion path */
     xbt_cfg_register(&_sg_cfg_set, "path",
                      "Lookup path for inclusions in platform and deployment XML files",
-                     xbt_cfgelm_string, 0, 0, _sg_cfg_cb__surf_path, NULL);
+                     xbt_cfgelm_string, 1, 0, _sg_cfg_cb__surf_path, NULL);
 
     xbt_cfg_register(&_sg_cfg_set, "cpu/maxmin_selective_update",
                      "Update the constraint set propagating recursively to others constraints (off by default when optim is set to lazy)",
-                     xbt_cfgelm_boolean, 0, 1, NULL, NULL);
+                     xbt_cfgelm_boolean, 1, 1, NULL, NULL);
     xbt_cfg_setdefault_boolean(_sg_cfg_set, "cpu/maxmin_selective_update", "no");
 
     xbt_cfg_register(&_sg_cfg_set, "network/maxmin_selective_update",
                      "Update the constraint set propagating recursively to others constraints (off by default when optim is set to lazy)",
-                     xbt_cfgelm_boolean, 0, 1, NULL, NULL);
+                     xbt_cfgelm_boolean, 1, 1, NULL, NULL);
     xbt_cfg_setdefault_boolean(_sg_cfg_set, "network/maxmin_selective_update", "no");
 
 #ifdef HAVE_MC
     /* do model-checking */
     xbt_cfg_register(&_sg_cfg_set, "model-check",
                      "Verify the system through model-checking instead of simulating it (EXPERIMENTAL)",
-                     xbt_cfgelm_boolean, 0, 1, _sg_cfg_cb_model_check, NULL);
+                     xbt_cfgelm_boolean, 1, 1, _sg_cfg_cb_model_check, NULL);
     xbt_cfg_setdefault_boolean(_sg_cfg_set, "model-check", "no");
 
     /* do stateful model-checking */
     xbt_cfg_register(&_sg_cfg_set, "model-check/checkpoint",
                      "Specify the amount of steps between checkpoints during stateful model-checking (default: 0 => stateless verification). "
                      "If value=1, one checkpoint is saved for each step => faster verification, but huge memory consumption; higher values are good compromises between speed and memory consumption.",
-                     xbt_cfgelm_int, 0, 1, _mc_cfg_cb_checkpoint, NULL);
+                     xbt_cfgelm_int, 1, 1, _mc_cfg_cb_checkpoint, NULL);
     xbt_cfg_setdefault_int(_sg_cfg_set, "model-check/checkpoint", 0);
 
     /* do liveness model-checking */
     xbt_cfg_register(&_sg_cfg_set, "model-check/property",
                      "Specify the name of the file containing the property. It must be the result of the ltl2ba program.",
-                     xbt_cfgelm_string, 0, 1, _mc_cfg_cb_property, NULL);
+                     xbt_cfgelm_string, 1, 1, _mc_cfg_cb_property, NULL);
     xbt_cfg_setdefault_string(_sg_cfg_set, "model-check/property", "");
 
     /* do communications determinism model-checking */
     xbt_cfg_register(&_sg_cfg_set, "model-check/communications_determinism",
                      "Enable/disable the detection of determinism in the communications schemes",
-                     xbt_cfgelm_boolean, 0, 1, _mc_cfg_cb_comms_determinism, NULL);
+                     xbt_cfgelm_boolean, 1, 1, _mc_cfg_cb_comms_determinism, NULL);
     xbt_cfg_setdefault_boolean(_sg_cfg_set, "model-check/communications_determinism", "no");
 
     /* do send determinism model-checking */
     xbt_cfg_register(&_sg_cfg_set, "model-check/send_determinism",
                      "Enable/disable the detection of send-determinism in the communications schemes",
-                     xbt_cfgelm_boolean, 0, 1, _mc_cfg_cb_send_determinism, NULL);
+                     xbt_cfgelm_boolean, 1, 1, _mc_cfg_cb_send_determinism, NULL);
     xbt_cfg_setdefault_boolean(_sg_cfg_set, "model-check/send_determinism", "no");
 
     /* Specify the kind of model-checking reduction */
     xbt_cfg_register(&_sg_cfg_set, "model-check/reduction",
                      "Specify the kind of exploration reduction (either none or DPOR)",
-                     xbt_cfgelm_string, 0, 1, _mc_cfg_cb_reduce, NULL);
+                     xbt_cfgelm_string, 1, 1, _mc_cfg_cb_reduce, NULL);
     xbt_cfg_setdefault_string(_sg_cfg_set, "model-check/reduction", "dpor");
 
     /* Enable/disable timeout for wait requests with model-checking */
     xbt_cfg_register(&_sg_cfg_set, "model-check/timeout",
                      "Enable/Disable timeout for wait requests",
-                     xbt_cfgelm_boolean, 0, 1, _mc_cfg_cb_timeout, NULL);
+                     xbt_cfgelm_boolean, 1, 1, _mc_cfg_cb_timeout, NULL);
     xbt_cfg_setdefault_boolean(_sg_cfg_set, "model-check/timeout", "no");
 
     /* Enable/disable global hash computation with model-checking */
     xbt_cfg_register(&_sg_cfg_set, "model-check/hash",
                      "Enable/Disable state hash for state comparison",
-                     xbt_cfgelm_boolean, 0, 1, _mc_cfg_cb_hash, NULL);
+                     xbt_cfgelm_boolean, 1, 1, _mc_cfg_cb_hash, NULL);
     xbt_cfg_setdefault_boolean(_sg_cfg_set, "model-check/hash", "no");
 
     /* Set max depth exploration */
     xbt_cfg_register(&_sg_cfg_set, "model-check/max_depth",
                      "Specify the max depth of exploration (default : 1000)",
-                     xbt_cfgelm_int, 0, 1, _mc_cfg_cb_max_depth, NULL);
+                     xbt_cfgelm_int, 1, 1, _mc_cfg_cb_max_depth, NULL);
     xbt_cfg_setdefault_int(_sg_cfg_set, "model-check/max_depth", 1000);
 
     /* Set number of visited state stored for state comparison reduction*/
     xbt_cfg_register(&_sg_cfg_set, "model-check/visited",
                      "Specify the number of visited state stored for state comparison reduction. If value=5, the last 5 visited states are stored",
-                     xbt_cfgelm_int, 0, 1, _mc_cfg_cb_visited, NULL);
+                     xbt_cfgelm_int, 1, 1, _mc_cfg_cb_visited, NULL);
     xbt_cfg_setdefault_int(_sg_cfg_set, "model-check/visited", 0);
 
     /* Set file name for dot output of graph state */
     xbt_cfg_register(&_sg_cfg_set, "model-check/dot_output",
                      "Specify the name of dot file corresponding to graph state",
-                     xbt_cfgelm_string, 0, 1, _mc_cfg_cb_dot_output, NULL);
+                     xbt_cfgelm_string, 1, 1, _mc_cfg_cb_dot_output, NULL);
     xbt_cfg_setdefault_string(_sg_cfg_set, "model-check/dot_output", "");
 #endif
 
     /* do verbose-exit */
     xbt_cfg_register(&_sg_cfg_set, "verbose-exit",
                      "Activate the \"do nothing\" mode in Ctrl-C",
-                     xbt_cfgelm_boolean, 0, 1, _sg_cfg_cb_verbose_exit, NULL);
+                     xbt_cfgelm_boolean, 1, 1, _sg_cfg_cb_verbose_exit, NULL);
     xbt_cfg_setdefault_boolean(_sg_cfg_set, "verbose-exit", "yes");
 
     /* context factory */
@@ -666,14 +674,22 @@ void sg_config_init(int *argc, char **argv)
                      xbt_cfgelm_string, 1, 1, _sg_cfg_cb_context_factory, NULL);
     xbt_cfg_setdefault_string(_sg_cfg_set, "contexts/factory", dflt_ctx_fact);
 
-    /* stack size of contexts in Ko */
+    /* stack size of contexts in KiB */
     xbt_cfg_register(&_sg_cfg_set, "contexts/stack_size",
-                     "Stack size of contexts in Kib",
+                     "Stack size of contexts in KiB",
                      xbt_cfgelm_int, 1, 1, _sg_cfg_cb_context_stack_size, NULL);
-    xbt_cfg_setdefault_int(_sg_cfg_set, "contexts/stack_size", 128);
+    xbt_cfg_setdefault_int(_sg_cfg_set, "contexts/stack_size", 8*1024);
     /* No, it was not set yet (the above setdefault() changed this to 1). */
     smx_context_stack_size_was_set = 0;
 
+    /* guard size for contexts stacks in memory pages */
+    xbt_cfg_register(&_sg_cfg_set, "contexts/guard_size",
+                     "Guard size for contexts stacks in memory pages",
+                     xbt_cfgelm_int, 1, 1, _sg_cfg_cb_context_guard_size, NULL);
+    xbt_cfg_setdefault_int(_sg_cfg_set, "contexts/guard_size", 1);
+    /* No, it was not set yet (the above setdefault() changed this to 1). */
+    smx_context_guard_size_was_set = 0;
+
     /* number of parallel threads for user processes */
     xbt_cfg_register(&_sg_cfg_set, "contexts/nthreads",
                      "Number of parallel threads used to execute user contexts",
@@ -703,7 +719,7 @@ void sg_config_init(int *argc, char **argv)
 
     xbt_cfg_register(&_sg_cfg_set, "network/crosstraffic",
                      "Activate the interferences between uploads and downloads for fluid max-min models (LV08, CM02)",
-                     xbt_cfgelm_boolean, 0, 1, _sg_cfg_cb__surf_network_crosstraffic, NULL);
+                     xbt_cfgelm_boolean, 1, 1, _sg_cfg_cb__surf_network_crosstraffic, NULL);
     xbt_cfg_setdefault_boolean(_sg_cfg_set, "network/crosstraffic", "no");
 
 #ifdef HAVE_GTNETS
@@ -795,47 +811,47 @@ void sg_config_init(int *argc, char **argv)
 
     xbt_cfg_register(&_sg_cfg_set, "smpi/gather",
                      "Which collective to use for gather",
-                     xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__coll_gather, NULL);
+                     xbt_cfgelm_string, 0, 1, &_sg_cfg_cb__coll_gather, NULL);
 
     xbt_cfg_register(&_sg_cfg_set, "smpi/allgather",
                      "Which collective to use for allgather",
-                     xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__coll_allgather, NULL);
+                     xbt_cfgelm_string, 0, 1, &_sg_cfg_cb__coll_allgather, NULL);
 
     xbt_cfg_register(&_sg_cfg_set, "smpi/barrier",
                      "Which collective to use for barrier",
-                     xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__coll_barrier, NULL);
+                     xbt_cfgelm_string, 0, 1, &_sg_cfg_cb__coll_barrier, NULL);
 
     xbt_cfg_register(&_sg_cfg_set, "smpi/reduce_scatter",
                      "Which collective to use for reduce_scatter",
-                     xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__coll_reduce_scatter, NULL);
+                     xbt_cfgelm_string, 0, 1, &_sg_cfg_cb__coll_reduce_scatter, NULL);
 
     xbt_cfg_register(&_sg_cfg_set, "smpi/scatter",
                      "Which collective to use for scatter",
-                     xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__coll_scatter, NULL);
+                     xbt_cfgelm_string, 0, 1, &_sg_cfg_cb__coll_scatter, NULL);
 
     xbt_cfg_register(&_sg_cfg_set, "smpi/allgatherv",
                      "Which collective to use for allgatherv",
-                     xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__coll_allgatherv, NULL);
+                     xbt_cfgelm_string, 0, 1, &_sg_cfg_cb__coll_allgatherv, NULL);
 
     xbt_cfg_register(&_sg_cfg_set, "smpi/allreduce",
                      "Which collective to use for allreduce",
-                     xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__coll_allreduce, NULL);
+                     xbt_cfgelm_string, 0, 1, &_sg_cfg_cb__coll_allreduce, NULL);
 
     xbt_cfg_register(&_sg_cfg_set, "smpi/alltoall",
                      "Which collective to use for alltoall",
-                     xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__coll_alltoall, NULL);
+                     xbt_cfgelm_string, 0, 1, &_sg_cfg_cb__coll_alltoall, NULL);
 
     xbt_cfg_register(&_sg_cfg_set, "smpi/alltoallv",
                      "Which collective to use for alltoallv",
-                     xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__coll_alltoallv, NULL);
+                     xbt_cfgelm_string, 0, 1, &_sg_cfg_cb__coll_alltoallv, NULL);
 
     xbt_cfg_register(&_sg_cfg_set, "smpi/bcast",
                      "Which collective to use for bcast",
-                     xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__coll_bcast, NULL);
+                     xbt_cfgelm_string, 0, 1, &_sg_cfg_cb__coll_bcast, NULL);
 
     xbt_cfg_register(&_sg_cfg_set, "smpi/reduce",
                      "Which collective to use for reduce",
-                     xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__coll_reduce, NULL);
+                     xbt_cfgelm_string, 0, 1, &_sg_cfg_cb__coll_reduce, NULL);
 #endif // HAVE_SMPI
 
     xbt_cfg_register(&_sg_cfg_set, "clean_atexit",
@@ -853,6 +869,7 @@ void sg_config_init(int *argc, char **argv)
       xbt_cfg_setdefault_string(_sg_cfg_set, "path", initial_path);
     }
 
+    xbt_cfg_check(_sg_cfg_set);
     _sg_cfg_init_status = 1;
 
     sg_config_cmd_line(argc, argv);
index fcf133e..59865c8 100644 (file)
@@ -30,7 +30,8 @@ host_execution_set_priority True (void) (execution, void*, smx_action_t) (priori
 host_execution_set_bound True (void) (execution, void*, smx_action_t) (bound, double)
 host_execution_set_affinity True (void) (execution, void*, smx_action_t) (ws, void*, smx_host_t) (mask, unsigned long)
 host_execution_wait False (int) (execution, void*, smx_action_t)
-host_get_storage_list True (void*, xbt_dict_t) (host, void*, smx_host_t)
+host_get_mounted_storage_list True (void*, xbt_dict_t) (host, void*, smx_host_t)
+host_get_attached_storage_list True (void*, xbt_dynar_t) (host, void*, smx_host_t)
 host_get_params True (void) (ind_vm, void*, smx_host_t) (params, void*, ws_params_t)
 host_set_params True (void) (ind_vm, void*, smx_host_t) (params, void*, ws_params_t)
 vm_create True (void*) (name, const char*) (ind_pm, void*, smx_host_t)
@@ -68,7 +69,7 @@ process_auto_restart_set True (void) (process, void*, smx_process_t) (auto_resta
 process_restart True (void*, smx_process_t) (process, void*, smx_process_t)
 rdv_create True (void*, smx_rdv_t) (name, const char*)
 rdv_destroy True (void) (rdv, void*, smx_rdv_t)
-rdv_get_by_name True (void*, smx_host_t) (name, const char*)
+#rdv_get_by_name True (void*, smx_host_t) (name, const char*)
 rdv_comm_count_by_host True (unsigned int) (rdv, void*, smx_rdv_t) (host, void*, smx_host_t)
 rdv_get_head True (void*, smx_action_t) (rdv, void*, smx_rdv_t)
 rdv_set_receiver True (void) (rdv, void*, smx_rdv_t) (receiver, void*, smx_process_t)
@@ -107,11 +108,9 @@ sem_would_block True (int) (sem, void*, smx_sem_t)
 sem_acquire False (void) (sem, void*, smx_sem_t)
 sem_acquire_timeout False (void) (sem, void*, smx_sem_t) (timeout, double)
 sem_get_capacity True (int) (sem, void*, smx_sem_t)
-file_get_data True (void*) (fd, void*, smx_file_t)
-file_set_data True (void) (fd, void*, smx_file_t) (data, void*)
 file_read False (sg_size_t) (fd, void*, smx_file_t) (size, sg_size_t)
 file_write False (sg_size_t) (fd, void*, smx_file_t) (size, sg_size_t)
-file_open False (void*, smx_file_t) (mount, const char*) (path, const char*)
+file_open False (void*, smx_file_t) (fullpath, const char*)
 file_close False (int) (fd, void*, smx_file_t)
 file_unlink True (int) (fd, void*, smx_file_t)
 file_ls False (void*, xbt_dict_t) (mount, const char*) (path, const char*)
index af7235f..e76f174 100644 (file)
@@ -257,10 +257,16 @@ static inline smx_action_t simcall_host_execution_wait__get__execution(smx_simca
 static inline void simcall_host_execution_wait__set__execution(smx_simcall_t simcall, void* arg){
     simcall->args[0].dp = arg;
 }
-static inline smx_host_t simcall_host_get_storage_list__get__host(smx_simcall_t simcall){
+static inline smx_host_t simcall_host_get_mounted_storage_list__get__host(smx_simcall_t simcall){
   return (smx_host_t) simcall->args[0].dp;
 }
-static inline void simcall_host_get_storage_list__set__host(smx_simcall_t simcall, void* arg){
+static inline void simcall_host_get_mounted_storage_list__set__host(smx_simcall_t simcall, void* arg){
+    simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_host_get_attached_storage_list__get__host(smx_simcall_t simcall){
+  return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_host_get_attached_storage_list__set__host(smx_simcall_t simcall, void* arg){
     simcall->args[0].dp = arg;
 }
 static inline smx_host_t simcall_host_get_params__get__ind_vm(smx_simcall_t simcall){
@@ -606,12 +612,6 @@ static inline smx_rdv_t simcall_rdv_destroy__get__rdv(smx_simcall_t simcall){
 static inline void simcall_rdv_destroy__set__rdv(smx_simcall_t simcall, void* arg){
     simcall->args[0].dp = arg;
 }
-static inline const char* simcall_rdv_get_by_name__get__name(smx_simcall_t simcall){
-  return  simcall->args[0].cc;
-}
-static inline void simcall_rdv_get_by_name__set__name(smx_simcall_t simcall, const char* arg){
-    simcall->args[0].cc = arg;
-}
 static inline smx_rdv_t simcall_rdv_comm_count_by_host__get__rdv(smx_simcall_t simcall){
   return (smx_rdv_t) simcall->args[0].dp;
 }
@@ -1052,24 +1052,6 @@ static inline smx_sem_t simcall_sem_get_capacity__get__sem(smx_simcall_t simcall
 static inline void simcall_sem_get_capacity__set__sem(smx_simcall_t simcall, void* arg){
     simcall->args[0].dp = arg;
 }
-static inline smx_file_t simcall_file_get_data__get__fd(smx_simcall_t simcall){
-  return (smx_file_t) simcall->args[0].dp;
-}
-static inline void simcall_file_get_data__set__fd(smx_simcall_t simcall, void* arg){
-    simcall->args[0].dp = arg;
-}
-static inline smx_file_t simcall_file_set_data__get__fd(smx_simcall_t simcall){
-  return (smx_file_t) simcall->args[0].dp;
-}
-static inline void simcall_file_set_data__set__fd(smx_simcall_t simcall, void* arg){
-    simcall->args[0].dp = arg;
-}
-static inline void* simcall_file_set_data__get__data(smx_simcall_t simcall){
-  return  simcall->args[1].dp;
-}
-static inline void simcall_file_set_data__set__data(smx_simcall_t simcall, void* arg){
-    simcall->args[1].dp = arg;
-}
 static inline smx_file_t simcall_file_read__get__fd(smx_simcall_t simcall){
   return (smx_file_t) simcall->args[0].dp;
 }
@@ -1094,18 +1076,12 @@ static inline sg_size_t simcall_file_write__get__size(smx_simcall_t simcall){
 static inline void simcall_file_write__set__size(smx_simcall_t simcall, sg_size_t arg){
     simcall->args[1].sgsz = arg;
 }
-static inline const char* simcall_file_open__get__mount(smx_simcall_t simcall){
+static inline const char* simcall_file_open__get__fullpath(smx_simcall_t simcall){
   return  simcall->args[0].cc;
 }
-static inline void simcall_file_open__set__mount(smx_simcall_t simcall, const char* arg){
+static inline void simcall_file_open__set__fullpath(smx_simcall_t simcall, const char* arg){
     simcall->args[0].cc = arg;
 }
-static inline const char* simcall_file_open__get__path(smx_simcall_t simcall){
-  return  simcall->args[1].cc;
-}
-static inline void simcall_file_open__set__path(smx_simcall_t simcall, const char* arg){
-    simcall->args[1].cc = arg;
-}
 static inline smx_file_t simcall_file_close__get__fd(smx_simcall_t simcall){
   return (smx_file_t) simcall->args[0].dp;
 }
index b81e906..c37a78b 100644 (file)
     }    
     return self->simcall.result.i;
   }
-  inline static xbt_dict_t simcall_BODY_host_get_storage_list(smx_host_t host) {
+  inline static xbt_dict_t simcall_BODY_host_get_mounted_storage_list(smx_host_t host) {
     smx_process_t self = SIMIX_process_self();
-    self->simcall.call = SIMCALL_HOST_GET_STORAGE_LIST;
+    self->simcall.call = SIMCALL_HOST_GET_MOUNTED_STORAGE_LIST;
+    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+    memset(self->simcall.args, 0, sizeof(self->simcall.args));
+    self->simcall.args[0].dp = (void*) host;
+    if (self != simix_global->maestro_process) {
+      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+      SIMIX_process_yield(self);
+    } else {
+      SIMIX_simcall_pre(&self->simcall, 0);
+    }    
+    return self->simcall.result.dp;
+  }
+  inline static xbt_dynar_t simcall_BODY_host_get_attached_storage_list(smx_host_t host) {
+    smx_process_t self = SIMIX_process_self();
+    self->simcall.call = SIMCALL_HOST_GET_ATTACHED_STORAGE_LIST;
     memset(&self->simcall.result, 0, sizeof(self->simcall.result));
     memset(self->simcall.args, 0, sizeof(self->simcall.args));
     self->simcall.args[0].dp = (void*) host;
     }    
     
   }
-  inline static smx_host_t simcall_BODY_rdv_get_by_name(const char* name) {
-    smx_process_t self = SIMIX_process_self();
-    self->simcall.call = SIMCALL_RDV_GET_BY_NAME;
-    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
-    memset(self->simcall.args, 0, sizeof(self->simcall.args));
-    self->simcall.args[0].cc = (const char*) name;
-    if (self != simix_global->maestro_process) {
-      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
-                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
-      SIMIX_process_yield(self);
-    } else {
-      SIMIX_simcall_pre(&self->simcall, 0);
-    }    
-    return self->simcall.result.dp;
-  }
   inline static unsigned int simcall_BODY_rdv_comm_count_by_host(smx_rdv_t rdv, smx_host_t host) {
     smx_process_t self = SIMIX_process_self();
     self->simcall.call = SIMCALL_RDV_COMM_COUNT_BY_HOST;
     }    
     return self->simcall.result.i;
   }
-  inline static void* simcall_BODY_file_get_data(smx_file_t fd) {
-    smx_process_t self = SIMIX_process_self();
-    self->simcall.call = SIMCALL_FILE_GET_DATA;
-    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
-    memset(self->simcall.args, 0, sizeof(self->simcall.args));
-    self->simcall.args[0].dp = (void*) fd;
-    if (self != simix_global->maestro_process) {
-      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
-                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
-      SIMIX_process_yield(self);
-    } else {
-      SIMIX_simcall_pre(&self->simcall, 0);
-    }    
-    return self->simcall.result.dp;
-  }
-  inline static void simcall_BODY_file_set_data(smx_file_t fd, void* data) {
-    smx_process_t self = SIMIX_process_self();
-    self->simcall.call = SIMCALL_FILE_SET_DATA;
-    memset(&self->simcall.result, 0, sizeof(self->simcall.result));
-    memset(self->simcall.args, 0, sizeof(self->simcall.args));
-    self->simcall.args[0].dp = (void*) fd;
-    self->simcall.args[1].dp = (void*) data;
-    if (self != simix_global->maestro_process) {
-      XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
-                SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
-      SIMIX_process_yield(self);
-    } else {
-      SIMIX_simcall_pre(&self->simcall, 0);
-    }    
-    
-  }
   inline static sg_size_t simcall_BODY_file_read(smx_file_t fd, sg_size_t size) {
     smx_process_t self = SIMIX_process_self();
     self->simcall.call = SIMCALL_FILE_READ;
     }    
     return self->simcall.result.sgsz;
   }
-  inline static smx_file_t simcall_BODY_file_open(const char* mount, const char* path) {
+  inline static smx_file_t simcall_BODY_file_open(const char* fullpath) {
     smx_process_t self = SIMIX_process_self();
     self->simcall.call = SIMCALL_FILE_OPEN;
     memset(&self->simcall.result, 0, sizeof(self->simcall.result));
     memset(self->simcall.args, 0, sizeof(self->simcall.args));
-    self->simcall.args[0].cc = (const char*) mount;
-    self->simcall.args[1].cc = (const char*) path;
+    self->simcall.args[0].cc = (const char*) fullpath;
     if (self != simix_global->maestro_process) {
       XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
                 SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
index 1fc92a5..cc672ef 100644 (file)
@@ -129,8 +129,13 @@ case SIMCALL_HOST_EXECUTION_WAIT:
        SIMIX_pre_host_execution_wait(simcall , (smx_action_t) simcall->args[0].dp);
        break;  
 
-case SIMCALL_HOST_GET_STORAGE_LIST:
-      simcall->result.dp = SIMIX_pre_host_get_storage_list(simcall , (smx_host_t) simcall->args[0].dp);
+case SIMCALL_HOST_GET_MOUNTED_STORAGE_LIST:
+      simcall->result.dp = SIMIX_pre_host_get_mounted_storage_list(simcall , (smx_host_t) simcall->args[0].dp);
+      SIMIX_simcall_answer(simcall);
+      break;  
+
+case SIMCALL_HOST_GET_ATTACHED_STORAGE_LIST:
+      simcall->result.dp = SIMIX_pre_host_get_attached_storage_list(simcall , (smx_host_t) simcall->args[0].dp);
       SIMIX_simcall_answer(simcall);
       break;  
 
@@ -317,11 +322,6 @@ case SIMCALL_RDV_DESTROY:
       SIMIX_simcall_answer(simcall);
       break;  
 
-case SIMCALL_RDV_GET_BY_NAME:
-      simcall->result.dp = SIMIX_pre_rdv_get_by_name(simcall ,  simcall->args[0].cc);
-      SIMIX_simcall_answer(simcall);
-      break;  
-
 case SIMCALL_RDV_COMM_COUNT_BY_HOST:
       simcall->result.ui = SIMIX_pre_rdv_comm_count_by_host(simcall , (smx_rdv_t) simcall->args[0].dp, (smx_host_t) simcall->args[1].dp);
       SIMIX_simcall_answer(simcall);
@@ -501,16 +501,6 @@ case SIMCALL_SEM_GET_CAPACITY:
       SIMIX_simcall_answer(simcall);
       break;  
 
-case SIMCALL_FILE_GET_DATA:
-      simcall->result.dp = SIMIX_pre_file_get_data(simcall , (smx_file_t) simcall->args[0].dp);
-      SIMIX_simcall_answer(simcall);
-      break;  
-
-case SIMCALL_FILE_SET_DATA:
-       SIMIX_pre_file_set_data(simcall , (smx_file_t) simcall->args[0].dp,  simcall->args[1].dp);
-      SIMIX_simcall_answer(simcall);
-      break;  
-
 case SIMCALL_FILE_READ:
        SIMIX_pre_file_read(simcall , (smx_file_t) simcall->args[0].dp,  simcall->args[1].sgsz);
        break;  
@@ -520,7 +510,7 @@ case SIMCALL_FILE_WRITE:
        break;  
 
 case SIMCALL_FILE_OPEN:
-       SIMIX_pre_file_open(simcall ,  simcall->args[0].cc,  simcall->args[1].cc);
+       SIMIX_pre_file_open(simcall ,  simcall->args[0].cc);
        break;  
 
 case SIMCALL_FILE_CLOSE:
index 50460e2..f3a064e 100644 (file)
@@ -30,7 +30,8 @@ SIMCALL_HOST_EXECUTION_SET_PRIORITY,
 SIMCALL_HOST_EXECUTION_SET_BOUND,
 SIMCALL_HOST_EXECUTION_SET_AFFINITY,
 SIMCALL_HOST_EXECUTION_WAIT,
-SIMCALL_HOST_GET_STORAGE_LIST,
+SIMCALL_HOST_GET_MOUNTED_STORAGE_LIST,
+SIMCALL_HOST_GET_ATTACHED_STORAGE_LIST,
 SIMCALL_HOST_GET_PARAMS,
 SIMCALL_HOST_SET_PARAMS,
 SIMCALL_VM_CREATE,
@@ -68,7 +69,6 @@ SIMCALL_PROCESS_AUTO_RESTART_SET,
 SIMCALL_PROCESS_RESTART,
 SIMCALL_RDV_CREATE,
 SIMCALL_RDV_DESTROY,
-SIMCALL_RDV_GET_BY_NAME,
 SIMCALL_RDV_COMM_COUNT_BY_HOST,
 SIMCALL_RDV_GET_HEAD,
 SIMCALL_RDV_SET_RECEIVER,
@@ -107,8 +107,6 @@ SIMCALL_SEM_WOULD_BLOCK,
 SIMCALL_SEM_ACQUIRE,
 SIMCALL_SEM_ACQUIRE_TIMEOUT,
 SIMCALL_SEM_GET_CAPACITY,
-SIMCALL_FILE_GET_DATA,
-SIMCALL_FILE_SET_DATA,
 SIMCALL_FILE_READ,
 SIMCALL_FILE_WRITE,
 SIMCALL_FILE_OPEN,
index 2e051f6..bcee194 100644 (file)
@@ -123,10 +123,16 @@ static inline int simcall_host_execution_wait__get__result(smx_simcall_t simcall
 static inline void simcall_host_execution_wait__set__result(smx_simcall_t simcall, int result){
     simcall->result.i = result;
 }
-static inline xbt_dict_t simcall_host_get_storage_list__get__result(smx_simcall_t simcall){
+static inline xbt_dict_t simcall_host_get_mounted_storage_list__get__result(smx_simcall_t simcall){
   return (xbt_dict_t) simcall->result.dp;
 }
-static inline void simcall_host_get_storage_list__set__result(smx_simcall_t simcall, void* result){
+static inline void simcall_host_get_mounted_storage_list__set__result(smx_simcall_t simcall, void* result){
+    simcall->result.dp = result;
+}
+static inline xbt_dynar_t simcall_host_get_attached_storage_list__get__result(smx_simcall_t simcall){
+  return (xbt_dynar_t) simcall->result.dp;
+}
+static inline void simcall_host_get_attached_storage_list__set__result(smx_simcall_t simcall, void* result){
     simcall->result.dp = result;
 }
 
@@ -259,12 +265,6 @@ static inline void simcall_rdv_create__set__result(smx_simcall_t simcall, void*
 }
 
 
-static inline smx_host_t simcall_rdv_get_by_name__get__result(smx_simcall_t simcall){
-  return (smx_host_t) simcall->result.dp;
-}
-static inline void simcall_rdv_get_by_name__set__result(smx_simcall_t simcall, void* result){
-    simcall->result.dp = result;
-}
 static inline unsigned int simcall_rdv_comm_count_by_host__get__result(smx_simcall_t simcall){
   return  simcall->result.ui;
 }
@@ -425,14 +425,6 @@ static inline int simcall_sem_get_capacity__get__result(smx_simcall_t simcall){
 static inline void simcall_sem_get_capacity__set__result(smx_simcall_t simcall, int result){
     simcall->result.i = result;
 }
-static inline void* simcall_file_get_data__get__result(smx_simcall_t simcall){
-  return  simcall->result.dp;
-}
-static inline void simcall_file_get_data__set__result(smx_simcall_t simcall, void* result){
-    simcall->result.dp = result;
-}
-
-
 static inline sg_size_t simcall_file_read__get__result(smx_simcall_t simcall){
   return  simcall->result.sgsz;
 }
index 6bbf280..ed629fa 100644 (file)
@@ -30,7 +30,8 @@
 [SIMCALL_HOST_EXECUTION_SET_BOUND] = "SIMCALL_HOST_EXECUTION_SET_BOUND",
 [SIMCALL_HOST_EXECUTION_SET_AFFINITY] = "SIMCALL_HOST_EXECUTION_SET_AFFINITY",
 [SIMCALL_HOST_EXECUTION_WAIT] = "SIMCALL_HOST_EXECUTION_WAIT",
-[SIMCALL_HOST_GET_STORAGE_LIST] = "SIMCALL_HOST_GET_STORAGE_LIST",
+[SIMCALL_HOST_GET_MOUNTED_STORAGE_LIST] = "SIMCALL_HOST_GET_MOUNTED_STORAGE_LIST",
+[SIMCALL_HOST_GET_ATTACHED_STORAGE_LIST] = "SIMCALL_HOST_GET_ATTACHED_STORAGE_LIST",
 [SIMCALL_HOST_GET_PARAMS] = "SIMCALL_HOST_GET_PARAMS",
 [SIMCALL_HOST_SET_PARAMS] = "SIMCALL_HOST_SET_PARAMS",
 [SIMCALL_VM_CREATE] = "SIMCALL_VM_CREATE",
@@ -68,7 +69,6 @@
 [SIMCALL_PROCESS_RESTART] = "SIMCALL_PROCESS_RESTART",
 [SIMCALL_RDV_CREATE] = "SIMCALL_RDV_CREATE",
 [SIMCALL_RDV_DESTROY] = "SIMCALL_RDV_DESTROY",
-[SIMCALL_RDV_GET_BY_NAME] = "SIMCALL_RDV_GET_BY_NAME",
 [SIMCALL_RDV_COMM_COUNT_BY_HOST] = "SIMCALL_RDV_COMM_COUNT_BY_HOST",
 [SIMCALL_RDV_GET_HEAD] = "SIMCALL_RDV_GET_HEAD",
 [SIMCALL_RDV_SET_RECEIVER] = "SIMCALL_RDV_SET_RECEIVER",
 [SIMCALL_SEM_ACQUIRE] = "SIMCALL_SEM_ACQUIRE",
 [SIMCALL_SEM_ACQUIRE_TIMEOUT] = "SIMCALL_SEM_ACQUIRE_TIMEOUT",
 [SIMCALL_SEM_GET_CAPACITY] = "SIMCALL_SEM_GET_CAPACITY",
-[SIMCALL_FILE_GET_DATA] = "SIMCALL_FILE_GET_DATA",
-[SIMCALL_FILE_SET_DATA] = "SIMCALL_FILE_SET_DATA",
 [SIMCALL_FILE_READ] = "SIMCALL_FILE_READ",
 [SIMCALL_FILE_WRITE] = "SIMCALL_FILE_WRITE",
 [SIMCALL_FILE_OPEN] = "SIMCALL_FILE_OPEN",
index 214ea71..0bfad29 100644 (file)
 #include "smx_private.h"
 #include "simgrid/sg_config.h"
 #include "internal_config.h"
+#include "simgrid/modelchecker.h"
+#include <sys/mman.h>
+
+#ifdef HAVE_VALGRIND_VALGRIND_H
+# include <valgrind/valgrind.h>
+#endif
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_context, simix,
                                 "Context switching mechanism");
 
 char* smx_context_factory_name = NULL; /* factory name specified by --cfg=contexts/factory:value */
 smx_ctx_factory_initializer_t smx_factory_initializer_to_use = NULL;
-int smx_context_stack_size = 128 * 1024;
+int smx_context_stack_size;
 int smx_context_stack_size_was_set = 0;
+int smx_context_guard_size;
+int smx_context_guard_size_was_set = 0;
 #ifdef HAVE_THREAD_LOCAL_STORAGE
 static __thread smx_context_t smx_current_context_parallel;
 #else
@@ -99,6 +107,68 @@ void SIMIX_context_mod_exit(void)
   xbt_dict_remove((xbt_dict_t) _sg_cfg_set,"contexts/factory");
 }
 
+void *SIMIX_context_stack_new(void)
+{
+  void *stack;
+
+  if (smx_context_guard_size > 0 && !MC_is_active()) {
+    size_t size = smx_context_stack_size + smx_context_guard_size;
+#ifdef HAVE_MC
+    /* Cannot use posix_memalign when HAVE_MC. Align stack by hand, and save the
+     * pointer returned by xbt_malloc0. */
+    char *alloc = xbt_malloc0(size + xbt_pagesize);
+    stack = alloc - ((uintptr_t)alloc & (xbt_pagesize - 1)) + xbt_pagesize;
+    *((void **)stack - 1) = alloc;
+#else
+    if (posix_memalign(&stack, xbt_pagesize, size) != 0)
+      xbt_die("Failed to allocate stack.");
+#endif
+    if (mprotect(stack, smx_context_guard_size, PROT_NONE) == -1) {
+      XBT_WARN("Failed to protect stack: %s", strerror(errno));
+      /* That's not fatal, pursue anyway. */
+    }
+    stack = (char *)stack + smx_context_guard_size;
+  } else {
+    stack = xbt_malloc0(smx_context_stack_size);
+  }
+
+#ifdef HAVE_VALGRIND_VALGRIND_H
+  unsigned int valgrind_stack_id =
+    VALGRIND_STACK_REGISTER(stack, (char *)stack + smx_context_stack_size);
+  memcpy((char *)stack + smx_context_usable_stack_size, &valgrind_stack_id,
+         sizeof valgrind_stack_id);
+#endif
+
+  return stack;
+}
+
+void SIMIX_context_stack_delete(void *stack)
+{
+  if (!stack)
+    return;
+
+#ifdef HAVE_VALGRIND_VALGRIND_H
+  unsigned int valgrind_stack_id;
+  memcpy(&valgrind_stack_id, (char *)stack + smx_context_usable_stack_size,
+         sizeof valgrind_stack_id);
+  VALGRIND_STACK_DEREGISTER(valgrind_stack_id);
+#endif
+
+  if (smx_context_guard_size > 0 && !MC_is_active()) {
+    stack = (char *)stack - smx_context_guard_size;
+    if (mprotect(stack, smx_context_guard_size,
+                 PROT_READ | PROT_WRITE | PROT_EXEC) == -1) {
+      XBT_WARN("Failed to remove page protection: %s", strerror(errno));
+      /* try to pursue anyway */
+    }
+#ifdef HAVE_MC
+    /* Retrieve the saved pointer.  See SIMIX_context_stack_new above. */
+    stack = *((void **)stack - 1);
+#endif
+  }
+  xbt_free(stack);
+}
+
 /**
  * \brief Returns whether some parallel threads are used
  * for the user contexts.
index d475f6b..37e0763 100644 (file)
 #include "xbt/parmap.h"
 #include "mc/mc.h"
 
-#ifdef HAVE_VALGRIND_VALGRIND_H
-#  include <valgrind/valgrind.h>
-#endif                          /* HAVE_VALGRIND_VALGRIND_H */
-
 typedef char * raw_stack_t;
 typedef void (*rawctx_entry_point_t)(void *);
 
@@ -21,9 +17,6 @@ typedef struct s_smx_ctx_raw {
   s_smx_ctx_base_t super;         /* Fields of super implementation */
   char *malloced_stack;           /* malloced area containing the stack */
   raw_stack_t stack_top;          /* pointer to stack top (within previous area) */
-#ifdef HAVE_VALGRIND_VALGRIND_H
-  unsigned int valgrind_stack_id; /* the valgrind stack id */
-#endif
 #ifdef TIME_BENCH_PER_SR
   unsigned int thread;            /* Just for measuring purposes */
 #endif
@@ -62,6 +55,7 @@ __asm__ (
 #endif
    "   mov %rdi,%rax\n"      /* stack */
    "   add %rsi,%rax\n"      /* size  */
+   "   andq $-16, %rax\n"    /* align stack */
    "   movq $0,   -8(%rax)\n" /* @return for func */
    "   mov %rdx,-16(%rax)\n" /* func */
    "   mov %rcx,-24(%rax)\n" /* arg/rdi */
@@ -137,6 +131,7 @@ __asm__ (
 #endif
    "   movl 4(%esp),%eax\n"   /* stack */
    "   addl 8(%esp),%eax\n"   /* size  */
+   "   andl $-16, %eax\n"     /* align stack */
    "   movl 12(%esp),%ecx\n"  /* func  */
    "   movl 16(%esp),%edx\n"  /* arg   */
    "   movl %edx, -4(%eax)\n"
@@ -316,16 +311,11 @@ smx_ctx_raw_create_context(xbt_main_func_t code, int argc, char **argv,
   /* if the user provided a function for the process then use it,
      otherwise it is the context for maestro */
      if (code) {
-       context->malloced_stack = xbt_malloc0(smx_context_stack_size);
+       context->malloced_stack = SIMIX_context_stack_new();
        context->stack_top =
-           raw_makecontext(context->malloced_stack, smx_context_stack_size,
-               (void_f_pvoid_t) smx_ctx_raw_wrapper, context);
-
-#ifdef HAVE_VALGRIND_VALGRIND_H
-       context->valgrind_stack_id =
-           VALGRIND_STACK_REGISTER(context->malloced_stack,
-               context->malloced_stack + smx_context_stack_size);
-#endif                          /* HAVE_VALGRIND_VALGRIND_H */
+           raw_makecontext(context->malloced_stack,
+                           smx_context_usable_stack_size,
+                           (void_f_pvoid_t)smx_ctx_raw_wrapper, context);
 
      } else {
        if(process != NULL && raw_maestro_context==NULL)
@@ -346,13 +336,7 @@ smx_ctx_raw_create_context(xbt_main_func_t code, int argc, char **argv,
 static void smx_ctx_raw_free(smx_context_t context)
 {
   if (context) {
-
-#ifdef HAVE_VALGRIND_VALGRIND_H
-    VALGRIND_STACK_DEREGISTER(((smx_ctx_raw_t)
-        context)->valgrind_stack_id);
-#endif                          /* HAVE_VALGRIND_VALGRIND_H */
-
-    free(((smx_ctx_raw_t) context)->malloced_stack);
+    SIMIX_context_stack_delete(((smx_ctx_raw_t) context)->malloced_stack);
   }
   smx_ctx_base_free(context);
 }
index b1906cc..d8f90fe 100644 (file)
 #  include <ucontext.h>           /* context relative declarations */
 #endif
 
-#ifdef HAVE_VALGRIND_VALGRIND_H
-#  include <valgrind/valgrind.h>
-#endif                          /* HAVE_VALGRIND_VALGRIND_H */
-
 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix_context);
 
 typedef struct s_smx_ctx_sysv {
   s_smx_ctx_base_t super;       /* Fields of super implementation */
   ucontext_t uc;                /* the ucontext that executes the code */
-#ifdef HAVE_VALGRIND_VALGRIND_H
-  unsigned int valgrind_stack_id;       /* the valgrind stack id */
-#endif
-  char stack[0];                /* the thread stack (must remain the last element of the structure) */
+  char *stack;                  /* the thread stack */
 } s_smx_ctx_sysv_t, *smx_ctx_sysv_t;
 
 #ifdef CONTEXT_THREADS
@@ -46,12 +39,6 @@ static unsigned long sysv_process_index = 0;   /* index of the next process to r
 static smx_ctx_sysv_t sysv_maestro_context;
 
 static int smx_ctx_sysv_factory_finalize(smx_context_factory_t *factory);
-static smx_context_t
-smx_ctx_sysv_create_context_sized(size_t structure_size,
-                                  xbt_main_func_t code, int argc,
-                                  char **argv,
-                                  void_pfn_smxprocess_t cleanup_func,
-                                  smx_process_t process);
 static void smx_ctx_sysv_free(smx_context_t context);
 static smx_context_t
 smx_ctx_sysv_create_context(xbt_main_func_t code, int argc, char **argv,
@@ -117,40 +104,35 @@ static int smx_ctx_sysv_factory_finalize(smx_context_factory_t *factory)
 }
 
 static smx_context_t
-smx_ctx_sysv_create_context_sized(size_t size, xbt_main_func_t code,
-                                  int argc, char **argv,
-                                  void_pfn_smxprocess_t cleanup_func,
-                                  smx_process_t process)
+smx_ctx_sysv_create_context(xbt_main_func_t code, int argc, char **argv,
+                            void_pfn_smxprocess_t cleanup_func,
+                            smx_process_t process)
 {
   int ctx_addr[CTX_ADDR_LEN];
   smx_ctx_sysv_t context =
-      (smx_ctx_sysv_t) smx_ctx_base_factory_create_context_sized(size,
-                                                                 code,
-                                                                 argc,
-                                                                 argv,
-                                                                 cleanup_func,
-                                                                 process);
+    (smx_ctx_sysv_t) smx_ctx_base_factory_create_context_sized(
+      sizeof(s_smx_ctx_sysv_t),
+      code,
+      argc,
+      argv,
+      cleanup_func,
+      process);
 
   /* if the user provided a function for the process then use it,
      otherwise it is the context for maestro */
   if (code) {
 
+    context->stack = SIMIX_context_stack_new();
     getcontext(&(context->uc));
 
     context->uc.uc_link = NULL;
 
     context->uc.uc_stack.ss_sp =
-        pth_skaddr_makecontext(context->stack, smx_context_stack_size);
+        pth_skaddr_makecontext(context->stack, smx_context_usable_stack_size);
 
     context->uc.uc_stack.ss_size =
-        pth_sksize_makecontext(context->stack, smx_context_stack_size);
-
-#ifdef HAVE_VALGRIND_VALGRIND_H
-    context->valgrind_stack_id =
-        VALGRIND_STACK_REGISTER(context->uc.uc_stack.ss_sp,
-                                ((char *) context->uc.uc_stack.ss_sp) +
-                                context->uc.uc_stack.ss_size);
-#endif                          /* HAVE_VALGRIND_VALGRIND_H */
+        pth_sksize_makecontext(context->stack, smx_context_usable_stack_size);
+
     memcpy(ctx_addr, &context, sizeof(smx_ctx_sysv_t));
     switch (CTX_ADDR_LEN) {
     case 1:
@@ -171,35 +153,17 @@ smx_ctx_sysv_create_context_sized(size_t size, xbt_main_func_t code,
   }
 
   if(MC_is_active() && code)
-    MC_new_stack_area(context, ((smx_context_t)context)->process->name,
-                      &(context->uc), size);
+    MC_new_stack_area(context->stack, ((smx_context_t)context)->process->name,
+                      &(context->uc), smx_context_usable_stack_size);
 
   return (smx_context_t) context;
 }
 
-static smx_context_t
-smx_ctx_sysv_create_context(xbt_main_func_t code, int argc, char **argv,
-                            void_pfn_smxprocess_t cleanup_func,
-                            smx_process_t process)
-{
-
-  return smx_ctx_sysv_create_context_sized(sizeof(s_smx_ctx_sysv_t) +
-                                           smx_context_stack_size,
-                                           code, argc, argv, cleanup_func,
-                                           process);
-
-}
-
 static void smx_ctx_sysv_free(smx_context_t context)
 {
 
   if (context) {
-
-#ifdef HAVE_VALGRIND_VALGRIND_H
-    VALGRIND_STACK_DEREGISTER(((smx_ctx_sysv_t)
-                               context)->valgrind_stack_id);
-#endif                          /* HAVE_VALGRIND_VALGRIND_H */
-
+    SIMIX_context_stack_delete(((smx_ctx_sysv_t)context)->stack);
   }
   smx_ctx_base_free(context);
 }
index ea06db0..ee35dfd 100644 (file)
@@ -94,6 +94,8 @@ smx_ctx_thread_factory_create_context(xbt_main_func_t code, int argc,
     context->end = xbt_os_sem_init(0);
     if (smx_context_stack_size_was_set)
       xbt_os_thread_setstacksize(smx_context_stack_size);
+    if (smx_context_guard_size_was_set)
+      xbt_os_thread_setguardsize(smx_context_guard_size);
 
     /* create and start the process */
     /* NOTE: The first argument to xbt_os_thread_create used to be the process *
@@ -151,6 +153,13 @@ static void *smx_ctx_thread_wrapper(void *param)
 {
   smx_ctx_thread_t context = (smx_ctx_thread_t) param;
 
+  /* Install alternate signal stack, for SIGSEGV handler. */
+  stack_t stack;
+  stack.ss_sp = sigsegv_stack;
+  stack.ss_size = sizeof sigsegv_stack;
+  stack.ss_flags = 0;
+  sigaltstack(&stack, NULL);
+
   /* Tell the maestro we are starting, and wait for its green light */
   xbt_os_sem_release(context->end);
   xbt_os_sem_acquire(context->begin);
index 894de3c..d1fcee1 100644 (file)
@@ -80,7 +80,7 @@ static void parse_process(sg_platf_process_cbarg_t process)
                                             process->argc,
                                             (char**)(process->argv),
                                             current_property_set,
-                                            auto_restart);
+                                            auto_restart, NULL);
     else
       simcall_process_create(&process_created, (char*)(process->argv)[0], parse_code, NULL, sg_host_name(host), kill_time, process->argc,
           (char**)process->argv, current_property_set,auto_restart);
index 5d2b942..7df250c 100644 (file)
@@ -24,8 +24,6 @@ static void* SIMIX_action_mallocator_new_f(void);
 static void SIMIX_action_mallocator_free_f(void* action);
 static void SIMIX_action_mallocator_reset_f(void* action);
 
-static void SIMIX_clean(void);
-
 /* FIXME: Yeah, I'll do it in a portable maner one day [Mt] */
 #include <signal.h>
 
@@ -42,6 +40,64 @@ static void _XBT_CALL inthandler(int ignored)
   exit(1);
 }
 
+static void _XBT_CALL segvhandler(int signum, siginfo_t *siginfo, void *context)
+{
+  if (siginfo->si_signo == SIGSEGV && siginfo->si_code == SEGV_ACCERR) {
+    fprintf(stderr,
+            "Access violation detected. This can result from a stack overflow.\n"
+            "Try to increase stack size with --cfg=contexts/stack_size (current size is %d KiB).\n",
+            smx_context_stack_size / 1024);
+    if (XBT_LOG_ISENABLED(simix_kernel, xbt_log_priority_debug)) {
+      fprintf(stderr,
+              "siginfo = {si_signo = %d, si_errno = %d, si_code = %d, si_addr = %p}\n",
+              siginfo->si_signo, siginfo->si_errno, siginfo->si_code, siginfo->si_addr);
+    }
+  }
+  raise(signum);
+}
+
+char sigsegv_stack[SIGSTKSZ];   /* alternate stack for SIGSEGV handler */
+
+/**
+ * Install signal handler for SIGSEGV.  Check that nobody has already installed
+ * its own handler.  For example, the Java VM does this.
+ */
+static void install_segvhandler(void)
+{
+  stack_t stack, old_stack;
+  stack.ss_sp = sigsegv_stack;
+  stack.ss_size = sizeof sigsegv_stack;
+  stack.ss_flags = 0;
+
+  if (sigaltstack(&stack, &old_stack) == -1) {
+    XBT_WARN("Failed to register alternate signal stack: %s",
+             strerror(errno));
+    return;
+  }
+  if (!(old_stack.ss_flags & SS_DISABLE)) {
+    XBT_DEBUG("An alternate stack was already installed (sp=%p, size=%zd, flags=%x). Restore it.",
+              old_stack.ss_sp, old_stack.ss_size, old_stack.ss_flags);
+    sigaltstack(&old_stack, NULL);
+  }
+
+  struct sigaction action, old_action;
+  action.sa_sigaction = segvhandler;
+  action.sa_flags = SA_ONSTACK | SA_RESETHAND | SA_SIGINFO;
+  sigemptyset(&action.sa_mask);
+
+  if (sigaction(SIGSEGV, &action, &old_action) == -1) {
+    XBT_WARN("Failed to register signal handler for SIGSEGV: %s",
+             strerror(errno));
+    return;
+  }
+  if ((old_action.sa_flags & SA_SIGINFO) || old_action.sa_handler != SIG_DFL) {
+    XBT_DEBUG("A signal handler was already installed for SIGSEGV (%p). Restore it.",
+             (old_action.sa_flags & SA_SIGINFO) ?
+             (void*)old_action.sa_sigaction : (void*)old_action.sa_handler);
+    sigaction(SIGSEGV, &old_action, NULL);
+  }
+}
+
 /********************************* SIMIX **************************************/
 
 XBT_INLINE double SIMIX_timer_next(void)
@@ -99,6 +155,9 @@ void SIMIX_global_init(int *argc, char **argv)
     /* Prepare to display some more info when dying on Ctrl-C pressing */
     signal(SIGINT, inthandler);
 
+    /* Install SEGV handler */
+    install_segvhandler();
+
     /* register a function to be called by SURF after the environment creation */
     sg_platf_init();
     sg_platf_postparse_add_cb(SIMIX_post_create_environment);
@@ -124,12 +183,14 @@ void SIMIX_global_init(int *argc, char **argv)
  *
  * This functions remove the memory used by SIMIX
  */
-static void SIMIX_clean(void)
+int cleaned = 0;
+void SIMIX_clean(void)
 {
 #ifdef TIME_BENCH_PER_SR
   smx_ctx_raw_new_sr();
 #endif
-
+  if (cleaned) return; // to avoid double cleaning by java and C
+  cleaned = 1;
   /* Kill everyone (except maestro) */
   SIMIX_process_killall(simix_global->maestro_process, 1);
 
@@ -317,7 +378,7 @@ void SIMIX_run(void)
     /* Handle any pending timer */
     while (xbt_heap_size(simix_timers) > 0 && SIMIX_get_clock() >= SIMIX_timer_next()) {
        //FIXME: make the timers being real callbacks
-       // (i.e. provide dispatchers that read and expand the args) 
+       // (i.e. provide dispatchers that read and expand the args)
        timer = xbt_heap_pop(simix_timers);
        if (timer->func)
          ((void (*)(void*))timer->func)(timer->args);
@@ -327,8 +388,7 @@ void SIMIX_run(void)
     /* Wake up all processes waiting for a Surf action to finish */
     xbt_dynar_foreach(model_list, iter, model) {
       while ((action = surf_model_extract_failed_action_set(model)))
-
-      SIMIX_simcall_post((smx_action_t) surf_action_get_data(action));
+        SIMIX_simcall_post((smx_action_t) surf_action_get_data(action));
 
       while ((action = surf_model_extract_done_action_set(model)))
         if (surf_action_get_data(action) == NULL)
@@ -352,7 +412,7 @@ void SIMIX_run(void)
 
 
     XBT_DEBUG("### time %f, empty %d", time, xbt_dynar_is_empty(simix_global->process_to_run));
-    // !(time == -1.0 && xbt_dynar_is_empty()) 
+    // !(time == -1.0 && xbt_dynar_is_empty())
 
 
   } while (time != -1.0 || !xbt_dynar_is_empty(simix_global->process_to_run));
index 2f88f82..83c4cf7 100644 (file)
@@ -53,7 +53,7 @@ void SIMIX_host_on(smx_host_t h)
   xbt_assert((host != NULL), "Invalid parameters");
 
   if (surf_resource_get_state(surf_workstation_resource_priv(h))==SURF_RESOURCE_OFF) {
-       surf_resource_set_state(surf_workstation_resource_priv(h), SURF_RESOURCE_ON);
+    surf_resource_set_state(surf_workstation_resource_priv(h), SURF_RESOURCE_ON);
     unsigned int cpt;
     smx_process_arg_t arg;
     xbt_dynar_foreach(host->boot_processes,cpt,arg) {
@@ -70,19 +70,19 @@ void SIMIX_host_on(smx_host_t h)
                                               arg->argc,
                                               arg->argv,
                                               arg->properties,
-                                              arg->auto_restart);
-      }
-      else {
+                                              arg->auto_restart,
+                                              NULL);
+      else {
         simcall_process_create(&process,
-                                              arg->argv[0],
-                                              arg->code,
-                                              NULL,
-                                              arg->hostname,
-                                              arg->kill_time,
-                                              arg->argc,
-                                              arg->argv,
-                                              arg->properties,
-                                              arg->auto_restart);
+                               arg->argv[0],
+                               arg->code,
+                               NULL,
+                               arg->hostname,
+                               arg->kill_time,
+                               arg->argc,
+                               arg->argv,
+                               arg->properties,
+                               arg->auto_restart);
       }
     }
   }
@@ -103,8 +103,8 @@ void SIMIX_host_off(smx_host_t h, smx_process_t issuer)
 
   xbt_assert((host != NULL), "Invalid parameters");
   
-  if (surf_resource_get_state(surf_workstation_resource_priv(h))==SURF_RESOURCE_OFF) {
-       surf_resource_set_state(surf_workstation_resource_priv(h), SURF_RESOURCE_ON);
+  if (surf_resource_get_state(surf_workstation_resource_priv(h))==SURF_RESOURCE_ON) {
+       surf_resource_set_state(surf_workstation_resource_priv(h), SURF_RESOURCE_OFF);
 
     /* Clean Simulator data */
     if (xbt_swag_size(host->process_list) != 0) {
@@ -391,7 +391,8 @@ void SIMIX_host_restart_processes(smx_host_t host)
                                             arg->argc,
                                             arg->argv,
                                             arg->properties,
-                                            arg->auto_restart);
+                                            arg->auto_restart,
+                                            NULL);
     } else {
       simcall_process_create(&process,
                              arg->argv[0],
@@ -462,7 +463,7 @@ smx_action_t SIMIX_host_execute(const char *name,
     }
   }
 
-  XBT_DEBUG("Create execute action %p", action);
+  XBT_DEBUG("Create execute action %p: %s", action, action->name);
 
   return action;
 }
@@ -524,15 +525,6 @@ smx_action_t SIMIX_host_parallel_execute(const char *name,
   return action;
 }
 
-//FIXME: REMOVE not used
-static surf_model_t get_ws_model_from_action(smx_action_t action)
-{
-  xbt_assert(action->type == SIMIX_ACTION_EXECUTE);
-  smx_host_t host = action->execution.host;
-  surf_model_t model = surf_resource_model(host, SURF_WKS_LEVEL);
-  return model;
-}
-
 void SIMIX_pre_host_execution_destroy(smx_simcall_t simcall, smx_action_t action){
   SIMIX_host_execution_destroy(action);
 }
@@ -758,12 +750,22 @@ void SIMIX_pre_host_set_params(smx_simcall_t simcall, smx_host_t ind_vm, ws_para
   SIMIX_host_set_params(ind_vm, params);
 }
 
-xbt_dict_t SIMIX_pre_host_get_storage_list(smx_simcall_t simcall, smx_host_t host){
-  return SIMIX_host_get_storage_list(host);
+xbt_dict_t SIMIX_pre_host_get_mounted_storage_list(smx_simcall_t simcall, smx_host_t host){
+  return SIMIX_host_get_mounted_storage_list(host);
+}
+
+xbt_dict_t SIMIX_host_get_mounted_storage_list(smx_host_t host){
+  xbt_assert((host != NULL), "Invalid parameters (simix host is NULL)");
+
+  return surf_workstation_get_mounted_storage_list(host);
+}
+
+xbt_dynar_t SIMIX_pre_host_get_attached_storage_list(smx_simcall_t simcall, smx_host_t host){
+  return SIMIX_host_get_attached_storage_list(host);
 }
 
-xbt_dict_t SIMIX_host_get_storage_list(smx_host_t host){
+xbt_dynar_t SIMIX_host_get_attached_storage_list(smx_host_t host){
   xbt_assert((host != NULL), "Invalid parameters (simix host is NULL)");
 
-  return surf_workstation_get_storage_list(host);
+  return surf_workstation_get_attached_storage_list(host);
 }
index 3fe2fa7..2e17bcf 100644 (file)
@@ -66,8 +66,8 @@ void SIMIX_host_execution_set_priority(smx_action_t action, double priority);
 void SIMIX_host_execution_set_bound(smx_action_t action, double bound);
 void SIMIX_host_execution_set_affinity(smx_action_t action, smx_host_t host, unsigned long mask);
 void SIMIX_pre_host_execution_wait(smx_simcall_t simcall, smx_action_t action);
-xbt_dict_t SIMIX_host_get_storage_list(smx_host_t host);
-
+xbt_dict_t SIMIX_host_get_mounted_storage_list(smx_host_t host);
+xbt_dynar_t SIMIX_host_get_attached_storage_list(smx_host_t host);
 // pre prototypes
 smx_host_t SIMIX_pre_host_get_by_name(smx_simcall_t, const char*);
 const char* SIMIX_pre_host_self_get_name(smx_simcall_t);
@@ -101,7 +101,8 @@ void SIMIX_host_execution_suspend(smx_action_t action);
 void SIMIX_host_execution_resume(smx_action_t action);
 
 void SIMIX_post_host_execute(smx_action_t action);
-xbt_dict_t SIMIX_pre_host_get_storage_list(smx_simcall_t, smx_host_t);
+xbt_dict_t SIMIX_pre_host_get_mounted_storage_list(smx_simcall_t, smx_host_t);
+xbt_dynar_t SIMIX_pre_host_get_attached_storage_list(smx_simcall_t, smx_host_t);
 #ifdef HAVE_TRACING
 void SIMIX_pre_set_category(smx_simcall_t simcall, smx_action_t action,
                            const char *category);
index f504da4..5bfbe20 100644 (file)
@@ -49,26 +49,6 @@ void SIMIX_storage_destroy(void *s)
   free(storage);
 }
 
-void* SIMIX_pre_file_get_data(smx_simcall_t simcall,smx_file_t fd){
-  return SIMIX_file_get_data(fd);
-}
-
-void* SIMIX_file_get_data(smx_file_t fd){
-  xbt_assert((fd != NULL), "Invalid parameters (simix file is NULL)");
-
-  return fd->data;
-}
-
-void SIMIX_pre_file_set_data(smx_simcall_t simcall, smx_file_t fd, void *data) {
-  SIMIX_file_set_data(fd, data);
-}
-
-void SIMIX_file_set_data(smx_file_t fd, void *data){
-  xbt_assert((fd != NULL), "Invalid parameter");
-
-  fd->data = data;
-}
-
 //SIMIX FILE READ
 void SIMIX_pre_file_read(smx_simcall_t simcall, smx_file_t fd, sg_size_t size)
 {
@@ -140,16 +120,14 @@ smx_action_t SIMIX_file_write(smx_process_t process, smx_file_t fd, sg_size_t si
 }
 
 //SIMIX FILE OPEN
-void SIMIX_pre_file_open(smx_simcall_t simcall, const char* mount,
-                         const char* path)
+void SIMIX_pre_file_open(smx_simcall_t simcall, const char* fullpath)
 {
-  smx_action_t action = SIMIX_file_open(simcall->issuer, mount, path);
+  smx_action_t action = SIMIX_file_open(simcall->issuer, fullpath);
   xbt_fifo_push(action->simcalls, simcall);
   simcall->issuer->waiting_action = action;
 }
 
-smx_action_t SIMIX_file_open(smx_process_t process ,const char* mount,
-                             const char* path)
+smx_action_t SIMIX_file_open(smx_process_t process, const char* fullpath)
 {
   smx_action_t action;
   smx_host_t host = process->smx_host;
@@ -168,7 +146,7 @@ smx_action_t SIMIX_file_open(smx_process_t process ,const char* mount,
 #endif
 
   action->io.host = host;
-  action->io.surf_io = surf_workstation_open(host, mount, path);
+  action->io.surf_io = surf_workstation_open(host, fullpath);
 
   surf_action_set_data(action->io.surf_io, action);
   XBT_DEBUG("Create io action %p", action);
@@ -361,26 +339,6 @@ const char* SIMIX_storage_get_name(smx_storage_t storage){
   return sg_storage_name(storage);
 }
 
-void SIMIX_pre_storage_set_data(smx_simcall_t simcall, smx_storage_t storage, void *data) {
-  SIMIX_storage_set_data(storage, data);
-}
-void SIMIX_storage_set_data(smx_storage_t storage, void *data){
-  xbt_assert((storage != NULL), "Invalid parameters");
-  xbt_assert((SIMIX_storage_priv(storage)->data == NULL), "Data already set");
-
-  SIMIX_storage_priv(storage)->data = data;
-}
-
-void* SIMIX_pre_storage_get_data(smx_simcall_t simcall,smx_storage_t storage){
-  return SIMIX_storage_get_data(storage);
-}
-
-void* SIMIX_storage_get_data(smx_storage_t storage){
-  xbt_assert((storage != NULL), "Invalid parameters (simix storage is NULL)");
-
-  return SIMIX_storage_priv(storage)->data;
-}
-
 xbt_dict_t SIMIX_pre_storage_get_content(smx_simcall_t simcall, smx_storage_t storage){
   return SIMIX_storage_get_content(storage);
 }
@@ -395,6 +353,15 @@ sg_size_t SIMIX_storage_get_size(smx_storage_t storage){
   return surf_storage_get_size(storage);
 }
 
+const char* SIMIX_pre_storage_get_host(smx_simcall_t simcall, smx_storage_t storage){
+   return SIMIX_storage_get_host(storage);
+}
+
+const char* SIMIX_storage_get_host(smx_storage_t storage){
+  xbt_assert((storage != NULL), "Invalid parameters");
+  return surf_storage_get_host(storage);
+}
+
 void SIMIX_post_io(smx_action_t action)
 {
   xbt_fifo_item_t i;
@@ -406,12 +373,12 @@ void SIMIX_post_io(smx_action_t action)
 
   xbt_fifo_foreach(action->simcalls,i,simcall,smx_simcall_t) {
     switch (simcall->call) {
-    case SIMCALL_FILE_OPEN:;
+    case SIMCALL_FILE_OPEN: {
       smx_file_t tmp = xbt_new(s_smx_file_t,1);
       tmp->surf_file = surf_storage_action_get_file(action->io.surf_io);
       simcall_file_open__set__result(simcall, tmp);
       break;
-
+    }
     case SIMCALL_FILE_CLOSE:
       xbt_free(simcall_file_close__get__fd(simcall));
       simcall_file_close__set__result(simcall, 0);
index 6bd066e..860c9f6 100644 (file)
@@ -17,17 +17,14 @@ typedef struct s_smx_storage_priv {
 
 
 static inline smx_storage_priv_t SIMIX_storage_priv(smx_storage_t storage){
-  return xbt_lib_get_level(storage, SIMIX_STORAGE_LEVEL);
+  return (smx_storage_priv_t) xbt_lib_get_level(storage, SIMIX_STORAGE_LEVEL);
 }
 
 smx_storage_t SIMIX_storage_create(const char *name, void *storage, void *data);
 void SIMIX_storage_destroy(void *s);
-void* SIMIX_pre_file_get_data(smx_simcall_t simcall,smx_file_t fd);
-void SIMIX_pre_file_set_data(smx_simcall_t simcall, smx_file_t fd, void *data);
 void SIMIX_pre_file_read(smx_simcall_t simcall, smx_file_t fd, sg_size_t size);
 void SIMIX_pre_file_write(smx_simcall_t simcall,smx_file_t fd, sg_size_t size);
-void SIMIX_pre_file_open(smx_simcall_t simcall, const char* mount,
-                        const char* path);
+void SIMIX_pre_file_open(smx_simcall_t simcall, const char* fullpath);
 void SIMIX_pre_file_close(smx_simcall_t simcall, smx_file_t fd);
 int SIMIX_pre_file_unlink(smx_simcall_t simcall, smx_file_t fd);
 void SIMIX_pre_file_ls(smx_simcall_t simcall,
@@ -38,12 +35,9 @@ xbt_dynar_t SIMIX_pre_file_get_info(smx_simcall_t simcall, smx_file_t fd);
 int SIMIX_pre_file_seek(smx_simcall_t simcall, smx_file_t fd, sg_size_t offset, int origin);
 void SIMIX_pre_storage_file_rename(smx_simcall_t simcall,smx_storage_t storage, const char* src, const char* dest);
 
-void* SIMIX_file_get_data(smx_file_t fd);
-void SIMIX_file_set_data(smx_file_t fd, void *data);
 smx_action_t SIMIX_file_read(smx_process_t process, smx_file_t fd, sg_size_t size);
 smx_action_t SIMIX_file_write(smx_process_t process, smx_file_t fd, sg_size_t size);
-smx_action_t SIMIX_file_open(smx_process_t process, const char* storage,
-                             const char* path);
+smx_action_t SIMIX_file_open(smx_process_t process, const char* fullpath);
 smx_action_t SIMIX_file_close(smx_process_t process, smx_file_t fd);
 int SIMIX_file_unlink(smx_process_t process, smx_file_t fd);
 smx_action_t SIMIX_file_ls(smx_process_t process, const char *mount,
@@ -63,14 +57,11 @@ sg_size_t SIMIX_storage_get_used_size(smx_process_t process,const char* name);
 xbt_dict_t SIMIX_storage_get_properties(smx_storage_t storage);
 xbt_dict_t SIMIX_pre_storage_get_properties(smx_simcall_t, smx_storage_t);
 
-void SIMIX_pre_storage_set_data(smx_simcall_t, smx_storage_t, void*);
-void* SIMIX_pre_storage_get_data(smx_simcall_t, smx_storage_t);
-
 xbt_dict_t SIMIX_pre_storage_get_content(smx_simcall_t simcall, smx_storage_t storage);
 xbt_dict_t SIMIX_storage_get_content(smx_storage_t storage);
 
 const char* SIMIX_pre_storage_get_name(smx_simcall_t simcall, smx_storage_t storage);
-
+const char* SIMIX_pre_storage_get_host(smx_simcall_t simcall, smx_storage_t storage);
 void SIMIX_post_io(smx_action_t action);
 void SIMIX_io_destroy(smx_action_t action);
 void SIMIX_io_finish(smx_action_t action);
index 09ab3cf..b6c5e60 100644 (file)
@@ -359,7 +359,7 @@ void SIMIX_pre_comm_send(smx_simcall_t simcall, smx_rdv_t rdv,
   smx_action_t comm = SIMIX_comm_isend(simcall->issuer, rdv, task_size, rate,
                                       src_buff, src_buff_size, match_fun, NULL,
                                       data, 0);
-  simcall->mc_value = 0;
+  SIMCALL_SET_MC_VALUE(simcall, 0);
   SIMIX_pre_comm_wait(simcall, comm, timeout);
 }
 smx_action_t SIMIX_pre_comm_isend(smx_simcall_t simcall, smx_rdv_t rdv,
@@ -454,7 +454,7 @@ void SIMIX_pre_comm_recv(smx_simcall_t simcall, smx_rdv_t rdv,
 {
   smx_action_t comm = SIMIX_comm_irecv(simcall->issuer, rdv, dst_buff,
                                       dst_buff_size, match_fun, data, rate);
-  simcall->mc_value = 0;
+  SIMCALL_SET_MC_VALUE(simcall, 0);
   SIMIX_pre_comm_wait(simcall, comm, timeout);
 }
 
@@ -602,7 +602,7 @@ void SIMIX_pre_comm_wait(smx_simcall_t simcall, smx_action_t action, double time
   simcall->issuer->waiting_action = action;
 
   if (MC_is_active()) {
-    int idx = simcall->mc_value;
+    int idx = SIMCALL_GET_MC_VALUE(simcall);
     if (idx == 0) {
       action->state = SIMIX_DONE;
     } else {
@@ -666,7 +666,7 @@ void SIMIX_pre_comm_testany(smx_simcall_t simcall, xbt_dynar_t actions)
   simcall_comm_testany__set__result(simcall, -1);
 
   if (MC_is_active()){
-    int idx = simcall->mc_value;
+    int idx = SIMCALL_GET_MC_VALUE(simcall);
     if(idx == -1){
       SIMIX_simcall_answer(simcall);
     }else{
@@ -696,7 +696,7 @@ void SIMIX_pre_comm_waitany(smx_simcall_t simcall, xbt_dynar_t actions)
   unsigned int cursor = 0;
 
   if (MC_is_active()){
-    int idx = simcall->mc_value;
+    int idx = SIMCALL_GET_MC_VALUE(simcall);
     action = xbt_dynar_get_as(actions, idx, smx_action_t);
     xbt_fifo_push(action->simcalls, simcall);
     simcall_comm_waitany__set__result(simcall, idx);
index 8462493..db37ffb 100644 (file)
@@ -59,6 +59,14 @@ extern unsigned long simix_process_maxpid;
 
 extern xbt_dict_t watched_hosts_lib;
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+void SIMIX_clean(void);
+#ifdef __cplusplus
+}
+#endif
+
 /******************************** Exceptions *********************************/
 
 #define SMX_EXCEPTION(issuer, c, v, m)                                  \
@@ -135,8 +143,8 @@ typedef struct s_smx_action {
       smx_rdv_t rdv;                  /* Rendez-vous where the comm is queued */
 
 #ifdef HAVE_MC
-      smx_rdv_t rdv_cpy;              /* Copy of the rendez-vous where the comm is queued, MC needs it for DPOR 
-                                         (comm.rdv set to NULL when the communication is removed from the mailbox 
+      smx_rdv_t rdv_cpy;              /* Copy of the rendez-vous where the comm is queued, MC needs it for DPOR
+                                         (comm.rdv set to NULL when the communication is removed from the mailbox
                                          (used as garbage collector)) */
 #endif
       int refcount;                   /* Number of processes involved in the cond */
@@ -165,7 +173,7 @@ typedef struct s_smx_action {
 
       void* src_data;                 /* User data associated to communication */
       void* dst_data;
-    } comm;    
+    } comm;
 
     struct {
       smx_host_t host;                /* The host that is sleeping */
@@ -198,26 +206,24 @@ typedef struct s_smx_action {
 #endif
 } s_smx_action_t;
 
-/* FIXME: check if we can delete this function */
-static XBT_INLINE e_smx_state_t SIMIX_action_map_state(e_surf_action_state_t state)
-{
-  switch (state) {
-    case SURF_ACTION_READY:
-      return SIMIX_READY;
-    case SURF_ACTION_RUNNING:
-      return SIMIX_RUNNING;
-    case SURF_ACTION_FAILED:
-      return SIMIX_FAILED;
-    case SURF_ACTION_DONE:
-      return SIMIX_DONE;
-    default:
-      xbt_die("Unexpected SURF action state");
-  }
-}
-
 void SIMIX_context_mod_init(void);
 void SIMIX_context_mod_exit(void);
 
+XBT_PUBLIC_DATA(char sigsegv_stack[SIGSTKSZ]);
+
+/* We are using the bottom of the stack to save some information, like the
+ * valgrind_stack_id. Define smx_context_usable_stack_size to give the remaining
+ * size for the stack. */
+#ifdef HAVE_VALGRIND_VALGRIND_H
+# define smx_context_usable_stack_size                                  \
+  (smx_context_stack_size - sizeof(unsigned int)) /* for valgrind_stack_id */
+#else
+# define smx_context_usable_stack_size smx_context_stack_size
+#endif
+
+void *SIMIX_context_stack_new(void);
+void SIMIX_context_stack_delete(void *stack);
+
 void SIMIX_context_set_current(smx_context_t context);
 smx_context_t SIMIX_context_get_current(void);
 
@@ -234,12 +240,12 @@ void SIMIX_ctx_raw_factory_init(smx_context_factory_t *factory);
 /* Scenario for the end of a context:
  *
  * CASE 1: death after end of the main function
- *   the context_wrapper, called internally by the context module, calls 
- *   SIMIX_context_stop after user code stops, smx_context_stop calls user 
+ *   the context_wrapper, called internally by the context module, calls
+ *   SIMIX_context_stop after user code stops, smx_context_stop calls user
  *   cleanup_func if any (in context settings), add current process to trashbin
  *   and yields back to maestro.
  *   From time to time, maestro calls SIMIX_context_empty_trash, which destroy
- *   all the process and context data structures, and frees the memory 
+ *   all the process and context data structures, and frees the memory
  *
  * CASE 2: brutal death
  *   SIMIX_process_kill (from any process) set process->iwannadie = 1 and then
@@ -270,7 +276,7 @@ static XBT_INLINE smx_context_t SIMIX_context_new(xbt_main_func_t code,
 }
 
 /**
- * \brief destroy a context 
+ * \brief destroy a context
  * \param context the context to destroy
  * Argument must be stopped first -- runs in maestro context
  */
@@ -309,7 +315,7 @@ static XBT_INLINE void SIMIX_context_runall(void)
 }
 
 /**
- \brief returns the current running context 
+ \brief returns the current running context
  */
 static XBT_INLINE smx_context_t SIMIX_context_self(void)
 {
index 74a4d26..8378a66 100644 (file)
@@ -137,18 +137,12 @@ void SIMIX_create_maestro_process()
   /* Create maestro process and intilialize it */
   maestro = xbt_new0(s_smx_process_t, 1);
   maestro->pid = simix_process_maxpid++;
+  maestro->ppid = -1;
   maestro->name = (char *) "";
   maestro->running_ctx = xbt_new(xbt_running_ctx_t, 1);
   XBT_RUNNING_CTX_INITIALIZE(maestro->running_ctx);
   maestro->context = SIMIX_context_new(NULL, 0, NULL, NULL, maestro);
   maestro->simcall.issuer = maestro;
-
-  if (SIMIX_process_self()) {
-    maestro->ppid = SIMIX_process_get_PID(SIMIX_process_self());
-  } else {
-    maestro->ppid = -1;
-  }
-
   simix_global->maestro_process = maestro;
   return;
 }
@@ -185,17 +179,17 @@ void SIMIX_process_stop(smx_process_t arg) {
 smx_process_t SIMIX_process_create_from_wrapper(smx_process_arg_t args) {
 
   smx_process_t process;
-  simix_global->create_process_function(
-      &process,
-      args->name,
-      args->code,
-      args->data,
-      args->hostname,
-      args->kill_time,
-      args->argc,
-      args->argv,
-      args->properties,
-      args->auto_restart);
+  simix_global->create_process_function(&process,
+                                        args->name,
+                                        args->code,
+                                        args->data,
+                                        args->hostname,
+                                        args->kill_time,
+                                        args->argc,
+                                        args->argv,
+                                        args->properties,
+                                        args->auto_restart,
+                                        NULL);
   xbt_free(args);
   return process;
 }
@@ -211,8 +205,9 @@ void SIMIX_pre_process_create(smx_simcall_t simcall,
                           int argc, char **argv,
                           xbt_dict_t properties,
                           int auto_restart){
-  return SIMIX_process_create(process, name, code, data, hostname,
-                              kill_time, argc, argv, properties, auto_restart);
+  SIMIX_process_create(process, name, code, data, hostname,
+                       kill_time, argc, argv, properties, auto_restart,
+                       simcall->issuer);
 }
 /**
  * \brief Internal function to create a process.
@@ -231,8 +226,9 @@ void SIMIX_process_create(smx_process_t *process,
                           double kill_time,
                           int argc, char **argv,
                           xbt_dict_t properties,
-                          int auto_restart) {
-
+                          int auto_restart,
+                          smx_process_t parent_process)
+{
   *process = NULL;
   smx_host_t host = SIMIX_host_get_by_name(hostname);
 
@@ -258,8 +254,8 @@ void SIMIX_process_create(smx_process_t *process,
     (*process)->comms = xbt_fifo_new();
     (*process)->simcall.issuer = *process;
     
-     if (SIMIX_process_self()) {
-       (*process)->ppid = SIMIX_process_get_PID(SIMIX_process_self());
+     if (parent_process) {
+       (*process)->ppid = SIMIX_process_get_PID(parent_process);
      } else {
        (*process)->ppid = -1;
      }
@@ -722,7 +718,6 @@ void SIMIX_post_process_sleep(smx_action_t action)
 {
   smx_simcall_t simcall;
   e_smx_state_t state;
-
   xbt_assert(action->type == SIMIX_ACTION_SLEEP);
 
   while ((simcall = xbt_fifo_shift(action->simcalls))) {
@@ -747,9 +742,15 @@ void SIMIX_post_process_sleep(smx_action_t action)
     }
     simcall_process_sleep__set__result(simcall, state);
     simcall->issuer->waiting_action = NULL;
-    SIMIX_simcall_answer(simcall);
-
+    if (simcall->issuer->suspended) {
+      XBT_DEBUG("Wait! This process is suspended and can't wake up now.");
+      simcall->issuer->suspended = 0;
+      SIMIX_pre_process_suspend(simcall, simcall->issuer);
+    } else {
+      SIMIX_simcall_answer(simcall);
+    }
   }
+
   SIMIX_process_sleep_destroy(action);
 }
 
@@ -771,6 +772,7 @@ void SIMIX_process_sleep_suspend(smx_action_t action)
 
 void SIMIX_process_sleep_resume(smx_action_t action)
 {
+  XBT_DEBUG("Action state is %d on process_sleep_resume.", action->state);
   xbt_assert(action->type == SIMIX_ACTION_SLEEP);
   surf_action_resume(action->sleep.surf_sleep);
 }
@@ -803,10 +805,11 @@ void SIMIX_process_yield(smx_process_t self)
     SIMIX_process_stop(self);
   }
 
-  if(self->suspended) {
+  if (self->suspended) {
+    XBT_DEBUG("Hey! I'm suspended.");
     xbt_assert(!self->doexception, "Gloups! This exception may be lost by subsequent calls.");
     self->suspended = 0;
-    SIMIX_process_suspend(self,self);
+    SIMIX_process_suspend(self, self);
   }
 
   if (self->doexception) {
@@ -949,19 +952,19 @@ smx_process_t SIMIX_process_restart(smx_process_t process, smx_process_t issuer)
                                           arg.argc,
                                           arg.argv,
                                           arg.properties,
-                                          arg.auto_restart);
-  }
-  else {
+                                          arg.auto_restart,
+                                          NULL);
+  else {
     simcall_process_create(&new_process,
-                                          arg.argv[0],
-                                          arg.code,
-                                          arg.data,
-                                          arg.hostname,
-                                          arg.kill_time,
-                                          arg.argc,
-                                          arg.argv,
-                                          arg.properties,
-                                          arg.auto_restart);
+                           arg.argv[0],
+                           arg.code,
+                           arg.data,
+                           arg.hostname,
+                           arg.kill_time,
+                           arg.argc,
+                           arg.argv,
+                           arg.properties,
+                           arg.auto_restart);
 
   }
   return new_process;
index ac0126e..eb269f9 100644 (file)
@@ -70,7 +70,8 @@ void SIMIX_process_create(smx_process_t *process,
                           double kill_time,
                           int argc, char **argv,
                           xbt_dict_t properties,
-                          int auto_restart);
+                          int auto_restart,
+                          smx_process_t parent_process);
 void SIMIX_process_runall(void);
 void SIMIX_process_kill(smx_process_t process, smx_process_t issuer);
 void SIMIX_process_killall(smx_process_t issuer, int reset_pid);
index 77623e7..515446b 100644 (file)
@@ -56,14 +56,14 @@ void SIMIX_simcall_answer(smx_simcall_t simcall)
 void SIMIX_simcall_pre(smx_simcall_t simcall, int value)
 {
   XBT_DEBUG("Handling simcall %p: %s", simcall, SIMIX_simcall_name(simcall->call));
-  simcall->mc_value = value;
+  SIMCALL_SET_MC_VALUE(simcall, value);
   if (simcall->issuer->context->iwannadie && simcall->call != SIMCALL_PROCESS_CLEANUP)
     return;
   switch (simcall->call) {
 #include "simcalls_generated_case.c"
-    case NUM_SIMCALLS:;
+    case NUM_SIMCALLS:
       break;
-    case SIMCALL_NONE:;
+    case SIMCALL_NONE:
       THROWF(arg_error,0,"Asked to do the noop syscall on %s@%s",
           SIMIX_process_get_name(simcall->issuer),
           SIMIX_host_get_name(SIMIX_process_get_host(simcall->issuer))
index f14c89d..dbd5f92 100644 (file)
@@ -58,7 +58,9 @@ union u_smx_scalar {
 typedef struct s_smx_simcall {
   e_smx_simcall_t call;
   smx_process_t issuer;
+#ifdef HAVE_MC
   int mc_value;
+#endif
   union u_smx_scalar args[10];
   union u_smx_scalar result;
   //FIXME: union u_smx_scalar retval;
@@ -72,6 +74,14 @@ typedef struct s_smx_simcall {
   };
 } s_smx_simcall_t, *smx_simcall_t;
 
+#if HAVE_MC
+#define SIMCALL_SET_MC_VALUE(simcall, value) ((simcall)->mc_value = (value))
+#define SIMCALL_GET_MC_VALUE(simcall) ((simcall)->mc_value)
+#else
+#define SIMCALL_SET_MC_VALUE(simcall, value) ((void)0)
+#define SIMCALL_GET_MC_VALUE(simcall) 0
+#endif
+
 #include "simcalls_generated_res_getter_setter.h"
 #include "simcalls_generated_args_getter_setter.h"
 
index 9b6720e..61ffbfe 100644 (file)
@@ -1314,30 +1314,6 @@ int simcall_sem_get_capacity(smx_sem_t sem)
   return simcall_BODY_sem_get_capacity(sem);
 }
 
-/**
- * \ingroup simix_file_management
- * \brief Returns the user data associated to a file.
- *
- * \param fd A simix file
- * \return the user data of this file
- */
-void* simcall_file_get_data(smx_file_t fd)
-{
-  return simcall_BODY_file_get_data(fd);
-}
-
-/**
- * \ingroup simix_file_management
- * \brief Sets the user data associated to a file.
- *
- * \param fd A SIMIX file
- * \param data The user data to set
- */
-void simcall_file_set_data(smx_file_t fd, void *data)
-{
-  simcall_BODY_file_set_data(fd, data);
-}
-
 /**
  * \ingroup simix_file_management
  *
@@ -1360,9 +1336,9 @@ sg_size_t simcall_file_write(smx_file_t fd, sg_size_t size)
  * \ingroup simix_file_management
  * \brief
  */
-smx_file_t simcall_file_open(const char* mount, const char* path)
+smx_file_t simcall_file_open(const char* fullpath)
 {
-  return simcall_BODY_file_open(mount, path);
+  return simcall_BODY_file_open(fullpath);
 }
 
 /**
@@ -1459,9 +1435,20 @@ sg_size_t simcall_storage_get_used_size (const char* name){
  * \param host A SIMIX host
  * \return a dict containing all storages mounted on the host
  */
-xbt_dict_t simcall_host_get_storage_list(smx_host_t host)
+xbt_dict_t simcall_host_get_mounted_storage_list(smx_host_t host)
+{
+  return simcall_BODY_host_get_mounted_storage_list(host);
+}
+
+/**
+ * \ingroup simix_storage_management
+ * \brief Returns the list of storages attached to an host.
+ * \param host A SIMIX host
+ * \return a dict containing all storages attached to the host
+ */
+xbt_dynar_t simcall_host_get_attached_storage_list(smx_host_t host)
 {
-  return simcall_BODY_host_get_storage_list(host);
+  return simcall_BODY_host_get_attached_storage_list(host);
 }
 
 /**
index 4906753..a0af750 100644 (file)
@@ -28,6 +28,7 @@ typedef struct s_smpi_process_data *smpi_process_data_t;
 #define ISEND          0x20
 #define SSEND          0x40
 #define PREPARED       0x80
+#define FINISHED       0x100
 
 
 enum smpi_process_state{
index fa4e70d..5362b82 100644 (file)
@@ -226,8 +226,11 @@ static MPI_Request build_request(void *buf, int count,
   request->truncated = 0;
   request->real_size = 0;
   request->real_tag = 0;
+  if(flags & PERSISTENT)
+    request->refcount = 1;
+  else
+    request->refcount = 0;
 
-  request->refcount=1;
 #ifdef HAVE_TRACING
   request->send = 0;
   request->recv = 0;
@@ -290,7 +293,6 @@ MPI_Request smpi_mpi_send_init(void *buf, int count, MPI_Datatype datatype,
   MPI_Request request = NULL; /* MC needs the comm to be set to NULL during the call */
   request = build_request(buf==MPI_BOTTOM ? (void*)0 : buf, count, datatype, smpi_process_index(), smpi_group_index(smpi_comm_group(comm), dst), tag,
                           comm, PERSISTENT | SEND | PREPARED);
-  request->refcount++;
   return request;
 }
 
@@ -300,7 +302,6 @@ MPI_Request smpi_mpi_ssend_init(void *buf, int count, MPI_Datatype datatype,
   MPI_Request request = NULL; /* MC needs the comm to be set to NULL during the call */
   request = build_request(buf==MPI_BOTTOM ? (void*)0 : buf, count, datatype, smpi_process_index(), smpi_group_index(smpi_comm_group(comm), dst), tag,
                           comm, PERSISTENT | SSEND | SEND | PREPARED);
-  request->refcount++;
   return request;
 }
 
@@ -310,7 +311,6 @@ MPI_Request smpi_mpi_recv_init(void *buf, int count, MPI_Datatype datatype,
   MPI_Request request = NULL; /* MC needs the comm to be set to NULL during the call */
   request = build_request(buf==MPI_BOTTOM ? (void*)0 : buf, count, datatype, src == MPI_ANY_SOURCE ? MPI_ANY_SOURCE : smpi_group_index(smpi_comm_group(comm), src), smpi_process_index(), tag,
                           comm, PERSISTENT | RECV | PREPARED);
-  request->refcount++;
   return request;
 }
 
@@ -320,6 +320,9 @@ void smpi_mpi_start(MPI_Request request)
 
   xbt_assert(!request->action, "Cannot (re)start a non-finished communication");
   request->flags &= ~PREPARED;
+  request->flags &= ~FINISHED;
+  request->refcount++;
+
   if (request->flags & RECV) {
     print_request("New recv", request);
     //FIXME: if receive is posted with a large size, but send is smaller, mailboxes may not match !
@@ -364,6 +367,8 @@ void smpi_mpi_start(MPI_Request request)
       XBT_DEBUG("Send request %p is not in the permanent receive mailbox (buf: %p)",request,request->buf);
       mailbox = smpi_process_remote_mailbox(receiver);
     }
+
+    void* buf = request->buf;
     if ( (! (request->flags & SSEND)) && (request->size < sg_cfg_get_int("smpi/send_is_detached_thres"))) {
       void *oldbuf = NULL;
       request->detached = 1;
@@ -371,8 +376,8 @@ void smpi_mpi_start(MPI_Request request)
       if(request->old_type->has_subtype == 0){
         oldbuf = request->buf;
         if (!_xbt_replay_is_active() && oldbuf && request->size!=0){
-          request->buf = xbt_malloc(request->size);
-          memcpy(request->buf,oldbuf,request->size);
+          buf = xbt_malloc(request->size);
+          memcpy(buf,oldbuf,request->size);
         }
       }
       XBT_DEBUG("Send request %p is detached; buf %p copied into %p",request,oldbuf,request->buf);
@@ -384,20 +389,20 @@ void smpi_mpi_start(MPI_Request request)
     smpi_comm_use(request->comm);
 
     //if we are giving back the control to the user without waiting for completion, we have to inject timings
-    double sleeptime =0.0;
+    double sleeptime = 0.0;
     if(request->detached || (request->flags & (ISEND|SSEND))){// issend should be treated as isend
       //isend and send timings may be different
       sleeptime = (request->flags & ISEND)? smpi_ois(request->size) : smpi_os(request->size);
     }
 
-    if(sleeptime!=0.0){
+    if(sleeptime != 0.0){
         simcall_process_sleep(sleeptime);
         XBT_DEBUG("sending size of %zu : sleep %f ", request->size, smpi_os(request->size));
     }
 
     request->action =
       simcall_comm_isend(mailbox, request->size, -1.0,
-                         request->buf, request->real_size,
+                         buf, request->real_size,
                          &match_send,
                          &xbt_free, // how to free the userdata if a detached send fails
                          request,
@@ -437,7 +442,6 @@ void smpi_mpi_request_free(MPI_Request * request)
         *request = MPI_REQUEST_NULL;
     }else{
         print_request("Decrementing", (*request));
-
     }
   }else{
       xbt_die("freeing an already free request");
@@ -449,7 +453,7 @@ MPI_Request smpi_isend_init(void *buf, int count, MPI_Datatype datatype,
 {
   MPI_Request request = NULL; /* MC needs the comm to be set to NULL during the call */
   request = build_request(buf==MPI_BOTTOM ? (void*)0 : buf , count, datatype, smpi_process_index(), smpi_group_index(smpi_comm_group(comm), dst), tag,
-                          comm, NON_PERSISTENT | ISEND | SEND | PREPARED);
+                          comm, PERSISTENT | ISEND | SEND | PREPARED);
   return request;
 }
 
@@ -480,7 +484,7 @@ MPI_Request smpi_irecv_init(void *buf, int count, MPI_Datatype datatype,
 {
   MPI_Request request = NULL; /* MC needs the comm to be set to NULL during the call */
   request = build_request(buf==MPI_BOTTOM ? (void*)0 : buf, count, datatype, src == MPI_ANY_SOURCE ? MPI_ANY_SOURCE : smpi_group_index(smpi_comm_group(comm), src), smpi_process_index(), tag,
-                          comm, NON_PERSISTENT | RECV | PREPARED);
+                          comm, PERSISTENT | RECV | PREPARED);
   return request;
 }
 
@@ -548,6 +552,8 @@ void smpi_mpi_sendrecv(void *sendbuf, int sendcount, MPI_Datatype sendtype,
     smpi_irecv_init(recvbuf, recvcount, recvtype, src, recvtag, comm);
   smpi_mpi_startall(2, requests);
   smpi_mpi_waitall(2, requests, stats);
+  smpi_mpi_request_free(&requests[0]);
+  smpi_mpi_request_free(&requests[1]);
   if(status != MPI_STATUS_IGNORE) {
     // Copy receive status
     *status = stats[1];
@@ -564,7 +570,8 @@ static void finish_wait(MPI_Request * request, MPI_Status * status)
   MPI_Request req = *request;
   smpi_empty_status(status);
 
-  if(!(req->detached && req->flags & SEND) && !(req->flags & PREPARED)){
+  if(!(req->detached && req->flags & SEND)
+      && !(req->flags & PREPARED)){
     if(status != MPI_STATUS_IGNORE) {
       int src = req->src == MPI_ANY_SOURCE ? req->real_src : req->src;
       status->MPI_SOURCE = smpi_group_rank(smpi_comm_group(req->comm), src);
@@ -606,12 +613,12 @@ static void finish_wait(MPI_Request * request, MPI_Status * status)
   if(req->detached_sender!=NULL){
     smpi_mpi_request_free(&(req->detached_sender));
   }
-
-  if(req->flags & NON_PERSISTENT) {
-    smpi_mpi_request_free(request);
-  } else {
+  if(req->flags & PERSISTENT)
     req->action = NULL;
-  }
+  req->flags |= FINISHED;
+
+  smpi_mpi_request_free(request);
+
 }
 
 int smpi_mpi_test(MPI_Request * request, MPI_Status * status) {
@@ -625,6 +632,7 @@ int smpi_mpi_test(MPI_Request * request, MPI_Status * status) {
       flag = simcall_comm_test((*request)->action);
     if (flag) {
       finish_wait(request, status);
+      if (*request != MPI_REQUEST_NULL && !((*request)->flags & PERSISTENT))
       *request = MPI_REQUEST_NULL;
     }
   }
@@ -657,6 +665,7 @@ int smpi_mpi_testany(int count, MPI_Request requests[], int *index,
     if(i != -1) {
       *index = map[i];
       finish_wait(&requests[*index], status);
+      if (requests[*index] != MPI_REQUEST_NULL && (requests[*index]->flags & NON_PERSISTENT))
       requests[*index] = MPI_REQUEST_NULL;
       flag = 1;
     }
@@ -709,7 +718,7 @@ void smpi_mpi_probe(int source, int tag, MPI_Comm comm, MPI_Status* status){
 void smpi_mpi_iprobe(int source, int tag, MPI_Comm comm, int* flag, MPI_Status* status){
 
   MPI_Request request =build_request(NULL, 0, MPI_CHAR, source == MPI_ANY_SOURCE ? MPI_ANY_SOURCE : smpi_group_index(smpi_comm_group(comm), source), smpi_comm_rank(comm), tag,
-            comm, NON_PERSISTENT | RECV);
+            comm, PERSISTENT | RECV);
 
   //to avoid deadlock, we have to sleep some time here, or the timer won't advance and we will only do iprobe simcalls
   double sleeptime= sg_cfg_get_double("smpi/iprobe");
@@ -771,7 +780,8 @@ void smpi_mpi_wait(MPI_Request * request, MPI_Status * status)
   }
 
   finish_wait(request, status);
-  *request = MPI_REQUEST_NULL;
+  if (*request != MPI_REQUEST_NULL && ((*request)->flags & NON_PERSISTENT))
+      *request = MPI_REQUEST_NULL;
   // FIXME for a detached send, finish_wait is not called:
 }
 
@@ -790,7 +800,9 @@ int smpi_mpi_waitany(int count, MPI_Request requests[],
     size = 0;
     XBT_DEBUG("Wait for one of %d", count);
     for(i = 0; i < count; i++) {
-      if (requests[i] != MPI_REQUEST_NULL && !(requests[i]->flags & PREPARED)) {
+      if (requests[i] != MPI_REQUEST_NULL
+          && !(requests[i]->flags & PREPARED)
+          && !(requests[i]->flags & FINISHED)) {
         if (requests[i]->action != NULL) {
           XBT_DEBUG("Waiting any %p ", requests[i]);
           xbt_dynar_push(comms, &requests[i]->action);
@@ -801,6 +813,7 @@ int smpi_mpi_waitany(int count, MPI_Request requests[],
          size=0;//so we free the dynar but don't do the waitany call
          index=i;
          finish_wait(&requests[i], status);//cleanup if refcount = 0
+         if (requests[i] != MPI_REQUEST_NULL && (requests[i]->flags & NON_PERSISTENT))
          requests[i]=MPI_REQUEST_NULL;//set to null
          break;
          }
@@ -813,6 +826,7 @@ int smpi_mpi_waitany(int count, MPI_Request requests[],
       if (i != -1) {
         index = map[i];
         finish_wait(&requests[index], status);
+        if (requests[i] != MPI_REQUEST_NULL && (requests[i]->flags & NON_PERSISTENT))
         requests[index] = MPI_REQUEST_NULL;
       }
     }
@@ -846,6 +860,7 @@ int smpi_mpi_waitall(int count, MPI_Request requests[],
     }
   }
   for(c = 0; c < count; c++) {
+
     if (MC_is_active()) {
       smpi_mpi_wait(&requests[c], pstat);
       index = c;
@@ -853,6 +868,7 @@ int smpi_mpi_waitall(int count, MPI_Request requests[],
       index = smpi_mpi_waitany(count, requests, pstat);
       if (index == MPI_UNDEFINED)
         break;
+      if (requests[index] != MPI_REQUEST_NULL && (requests[index]->flags & NON_PERSISTENT))
       requests[index]=MPI_REQUEST_NULL;
     }
     if (status != MPI_STATUSES_IGNORE) {
@@ -882,6 +898,7 @@ int smpi_mpi_waitsome(int incount, MPI_Request requests[], int *indices,
       if(status != MPI_STATUSES_IGNORE) {
         status[index] = *pstat;
       }
+     if (requests[index] != MPI_REQUEST_NULL && (requests[index]->flags & NON_PERSISTENT))
      requests[index]=MPI_REQUEST_NULL;
     }else{
       return MPI_UNDEFINED;
@@ -907,8 +924,8 @@ int smpi_mpi_testsome(int incount, MPI_Request requests[], int *indices,
          if(status != MPI_STATUSES_IGNORE) {
            status[i] = *pstat;
          }
+         if ((requests[i] != MPI_REQUEST_NULL) && requests[i]->flags & NON_PERSISTENT)
          requests[i]=MPI_REQUEST_NULL;
-
       }
     }else{
       count_dead++;
@@ -965,6 +982,9 @@ void smpi_mpi_gather(void *sendbuf, int sendcount, MPI_Datatype sendtype,
     // Wait for completion of irecv's.
     smpi_mpi_startall(size - 1, requests);
     smpi_mpi_waitall(size - 1, requests, MPI_STATUS_IGNORE);
+    for(src = 0; src < size-1; src++) {
+      smpi_mpi_request_free(&requests[src]);
+    }
     xbt_free(requests);
   }
 }
@@ -1029,6 +1049,9 @@ void smpi_mpi_gatherv(void *sendbuf, int sendcount, MPI_Datatype sendtype,
     // Wait for completion of irecv's.
     smpi_mpi_startall(size - 1, requests);
     smpi_mpi_waitall(size - 1, requests, MPI_STATUS_IGNORE);
+    for(src = 0; src < size-1; src++) {
+      smpi_mpi_request_free(&requests[src]);
+    }
     xbt_free(requests);
   }
 }
@@ -1069,6 +1092,9 @@ void smpi_mpi_allgather(void *sendbuf, int sendcount,
   // Wait for completion of all comms.
   smpi_mpi_startall(2 * (size - 1), requests);
   smpi_mpi_waitall(2 * (size - 1), requests, MPI_STATUS_IGNORE);
+  for(other = 0; other < 2*(size-1); other++) {
+    smpi_mpi_request_free(&requests[other]);
+  }
   xbt_free(requests);
 }
 
@@ -1108,6 +1134,9 @@ void smpi_mpi_allgatherv(void *sendbuf, int sendcount,
   // Wait for completion of all comms.
   smpi_mpi_startall(2 * (size - 1), requests);
   smpi_mpi_waitall(2 * (size - 1), requests, MPI_STATUS_IGNORE);
+  for(other = 0; other < 2*(size-1); other++) {
+    smpi_mpi_request_free(&requests[other]);
+  }
   xbt_free(requests);
 }
 
@@ -1148,6 +1177,9 @@ void smpi_mpi_scatter(void *sendbuf, int sendcount, MPI_Datatype sendtype,
     // Wait for completion of isend's.
     smpi_mpi_startall(size - 1, requests);
     smpi_mpi_waitall(size - 1, requests, MPI_STATUS_IGNORE);
+    for(dst = 0; dst < size-1; dst++) {
+      smpi_mpi_request_free(&requests[dst]);
+    }
     xbt_free(requests);
   }
 }
@@ -1189,6 +1221,9 @@ void smpi_mpi_scatterv(void *sendbuf, int *sendcounts, int *displs,
     // Wait for completion of isend's.
     smpi_mpi_startall(size - 1, requests);
     smpi_mpi_waitall(size - 1, requests, MPI_STATUS_IGNORE);
+    for(dst = 0; dst < size-1; dst++) {
+      smpi_mpi_request_free(&requests[dst]);
+    }
     xbt_free(requests);
   }
 }
@@ -1251,6 +1286,8 @@ void smpi_mpi_reduce(void *sendbuf, void *recvbuf, int count,
       XBT_DEBUG("finished waiting any request with index %d", index);
       if(index == MPI_UNDEFINED) {
         break;
+      }else{
+        smpi_mpi_request_free(&requests[index]);
       }
       if(op) /* op can be MPI_OP_NULL that does nothing */
         smpi_op_apply(op, tmpbufs[index], recvbuf, &count, &datatype);
@@ -1336,6 +1373,9 @@ void smpi_mpi_scan(void *sendbuf, void *recvbuf, int count,
   for(index = 0; index < rank; index++) {
     xbt_free(tmpbufs[index]);
   }
+  for(index = 0; index < size-1; index++) {
+    smpi_mpi_request_free(&requests[index]);
+  }
   xbt_free(tmpbufs);
   xbt_free(requests);
 }
@@ -1405,6 +1445,9 @@ void smpi_mpi_exscan(void *sendbuf, void *recvbuf, int count,
   for(index = 0; index < rank; index++) {
     xbt_free(tmpbufs[index]);
   }
+  for(index = 0; index < size-1; index++) {
+    smpi_mpi_request_free(&requests[index]);
+  }
   xbt_free(tmpbufs);
   xbt_free(requests);
 }
index 346408c..688121e 100644 (file)
@@ -274,6 +274,9 @@ static void tree_bcast(void *buf, int count, MPI_Datatype datatype,
   }
   smpi_mpi_startall(tree->numChildren, requests);
   smpi_mpi_waitall(tree->numChildren, requests, MPI_STATUS_IGNORE);
+  for(i = 0; i < tree->numChildren; i++) {
+    if(requests[i]!=MPI_REQUEST_NULL) smpi_mpi_request_free(&requests[i]);
+  }
   xbt_free(requests);
 }
 
@@ -312,6 +315,9 @@ static void tree_antibcast(void *buf, int count, MPI_Datatype datatype,
   }
   smpi_mpi_startall(tree->numChildren, requests);
   smpi_mpi_waitall(tree->numChildren, requests, MPI_STATUS_IGNORE);
+  for(i = 0; i < tree->numChildren; i++) {
+    if(requests[i]!=MPI_REQUEST_NULL) smpi_mpi_request_free(&requests[i]);
+  }
   xbt_free(requests);
 }
 
@@ -437,6 +443,9 @@ int smpi_coll_tuned_alltoall_bruck(void *sendbuf, int sendcount,
     smpi_mpi_startall(count, requests);
     XBT_DEBUG("<%d> wait for %d requests", rank, count);
     smpi_mpi_waitall(count, requests, MPI_STATUS_IGNORE);
+    for(i = 0; i < count; i++) {
+      if(requests[i]!=MPI_REQUEST_NULL) smpi_mpi_request_free(&requests[i]);
+    }
     xbt_free(requests);
   }
   return MPI_SUCCESS;
@@ -493,6 +502,9 @@ int smpi_coll_tuned_alltoall_basic_linear(void *sendbuf, int sendcount,
     smpi_mpi_startall(count, requests);
     XBT_DEBUG("<%d> wait for %d requests", rank, count);
     smpi_mpi_waitall(count, requests, MPI_STATUS_IGNORE);
+    for(i = 0; i < count; i++) {
+      if(requests[i]!=MPI_REQUEST_NULL) smpi_mpi_request_free(&requests[i]);
+    }
     xbt_free(requests);
   }
   return err;
@@ -555,6 +567,9 @@ int smpi_coll_basic_alltoallv(void *sendbuf, int *sendcounts,
     smpi_mpi_startall(count, requests);
     XBT_DEBUG("<%d> wait for %d requests", rank, count);
     smpi_mpi_waitall(count, requests, MPI_STATUS_IGNORE);
+    for(i = 0; i < count; i++) {
+      if(requests[i]!=MPI_REQUEST_NULL) smpi_mpi_request_free(&requests[i]);
+    }
     xbt_free(requests);
   }
   return err;
index 7c3e483..95c40d7 100644 (file)
@@ -23,29 +23,24 @@ static int running_processes = 0;
 /* Bindings for MPI special values */
 union u_smpi_common {
   struct s_smpi_common {
-    integer mpi_in_place;
-    integer mpi_bottom;
-    integer mpi_status_ignore;
-    integer mpi_statuses_ignore;
-  } f90;                        /* with gftortran */
-  struct s_smpi_common *f77;    /* with f2c */
-} smpi_;
+    integer _MPI_IN_PLACE;
+    integer _MPI_BOTTOM;
+    integer _MPI_STATUS_IGNORE;
+    integer _MPI_STATUSES_IGNORE;
+  } *f77;                       /* with f2c, remains NULL with gfortran */
+  struct s_smpi_common f90;     /* with gfortran */
+} smpi_ = { NULL };
 
 /* Convert between Fortran and C */
-static XBT_INLINE void *f2c_addr(void *addr, void *cval, void *chk1, void *chk2)
-{
-  return (addr == chk1 || addr == chk2) ? cval : addr;
-}
-#define F2C_ADDR(addr, cval, fval) \
-  f2c_addr(addr, cval, &smpi_.f90.fval, &smpi_.f77[smpi_current_rank].fval)
-#define F2C_BOTTOM(addr) \
-  F2C_ADDR(addr, MPI_BOTTOM, mpi_bottom)
-#define F2C_IN_PLACE(addr) \
-  F2C_ADDR(addr, MPI_IN_PLACE, mpi_in_place)
-#define F2C_STATUS_IGNORE(addr) \
-  F2C_ADDR(addr, MPI_STATUS_IGNORE, mpi_status_ignore)
-#define F2C_STATUSES_IGNORE(addr) \
-  F2C_ADDR(addr, MPI_STATUSES_IGNORE, mpi_statuses_ignore)
+#define F2C_ADDR(addr, val)                                             \
+  (((void *)(addr) == (void *)(smpi_.f77                                \
+                               ? &smpi_.f77[smpi_current_rank]._ ## val \
+                               : &smpi_.f90._ ## val))                  \
+   ? (val) : (void *)(addr))
+#define F2C_BOTTOM(addr)          F2C_ADDR(addr, MPI_BOTTOM)
+#define F2C_IN_PLACE(addr)        F2C_ADDR(addr, MPI_IN_PLACE)
+#define F2C_STATUS_IGNORE(addr)   F2C_ADDR(addr, MPI_STATUS_IGNORE)
+#define F2C_STATUSES_IGNORE(addr) F2C_ADDR(addr, MPI_STATUSES_IGNORE)
 
 #define KEY_SIZE (sizeof(int) * 2 + 1)
 
index 3bdb895..37f8dd0 100644 (file)
@@ -86,6 +86,8 @@ void smpi_process_init(int *argc, char ***argv)
     simcall_rdv_set_receiver(data->mailbox_small, proc);
     XBT_DEBUG("<%d> New process in the game: %p", index, proc);
   }
+  if (smpi_process_data() == NULL)
+    xbt_die("smpi_process_data() returned NULL. You probably gave a NULL parameter to MPI_Init. Although it's required by MPI-2, this is currently not supported by SMPI.");
 }
 
 void smpi_process_destroy(void)
index f59f2e6..cfd9b5b 100644 (file)
@@ -1020,7 +1020,6 @@ int PMPI_Request_free(MPI_Request * request)
   if (*request == MPI_REQUEST_NULL) {
     retval = MPI_ERR_ARG;
   } else {
-    if((*request)->flags & PERSISTENT)(*request)->refcount--;
     smpi_mpi_request_free(request);
     retval = MPI_SUCCESS;
   }
index 7126a55..90c0d1e 100755 (executable)
@@ -426,10 +426,6 @@ fi
 ${EXEC} ${TRACEOPTIONS} ${SIMOPTS} ${PLATFORMTMP} ${APPLICATIONTMP}
 status=$?
 
-if [ ${status} = 139 ]; then echo "ERROR: A segmentation fault was triggered. 
-A common cause in SimGrid may be the use of a too small stack size for the simulated processes (default 128KiB).
-Please see contexts/stack_size parameter , or http://simgrid.org/simgrid/latest/doc/options.html#options_virt_stacksize "; fi
-
 if [ -z "${KEEP}" ] ; then
    if [ -z "${PLATFORM}" ]; then
        rm ${PLATFORMTMP}
index af08127..fc07dd5 100644 (file)
@@ -468,11 +468,6 @@ CpuTiPtr CpuTiModel::createResource(const char *name,
   return cpu;
 }
 
-CpuTiActionPtr CpuTiModel::createAction(double /*cost*/, bool /*failed*/)
-{
-  return NULL;//new CpuTiAction(this, cost, failed);
-}
-
 double CpuTiModel::shareResources(double now)
 {
   void *_cpu, *_cpu_next;
index 4e1ac71..b44ff97 100644 (file)
@@ -92,7 +92,6 @@ public:
                           e_surf_resource_state_t state_initial,
                           tmgr_trace_t state_trace,
                           xbt_dict_t cpu_properties);
-  CpuTiActionPtr createAction(double cost, bool failed);
   double shareResources(double now);
   void updateActionsState(double now, double delta);
   void addTraces();
index f0f3df2..9a2764a 100644 (file)
@@ -6,7 +6,6 @@
 
 #include "instr/instr_private.h"
 #include "surf/surf_private.h"
-//FIXME:#include "surf/network_gtnets_private.h"
 
 #ifdef HAVE_TRACING
 
index 244b688..49e4c6d 100644 (file)
@@ -28,13 +28,6 @@ surf_callback(void, NetworkActionPtr) networkActionStateChangedCallbacks;
 
 NetworkModelPtr surf_network_model = NULL;
 
-xbt_dynar_t NetworkModel::getRoute(RoutingEdgePtr src, RoutingEdgePtr dst)
-{
-  xbt_dynar_t route = NULL;
-  routing_platf->getRouteAndLatency(src, dst, &route, NULL);
-  return route;
-}
-
 double NetworkModel::latencyFactor(double /*size*/) {
   return sg_latency_factor;
 }
index 994991b..8988357 100644 (file)
@@ -133,17 +133,6 @@ public:
   virtual ActionPtr communicate(RoutingEdgePtr src, RoutingEdgePtr dst,
                                           double size, double rate)=0;
 
-  /**
-   * @brief Get the route between two RoutingEdge
-   * @details [TODO]
-   * 
-   * @param src [TODO]
-   * @param dst [TODO]
-   * 
-   * @return A xbt_dynar_t of [TODO]
-   */
-  virtual xbt_dynar_t getRoute(RoutingEdgePtr src, RoutingEdgePtr dst); //FIXME: kill field? That is done by the routing nowadays
-
   /**
    * @brief Function pointer to the function to use to solve the lmm_system_t
    * 
index e9dea0e..68174da 100644 (file)
@@ -40,7 +40,7 @@ static xbt_dynar_t parse_factor(const char *smpi_coef_string)
 
     radical_elements2 = xbt_str_split(value, ":");
     if (xbt_dynar_length(radical_elements2) != 2)
-      xbt_die("Malformed radical for smpi factor!");
+      surf_parse_error("Malformed radical for smpi factor!");
     fact.factor = atol(xbt_dynar_get_as(radical_elements2, 0, char *));
     fact.value = atof(xbt_dynar_get_as(radical_elements2, 1, char *));
     xbt_dynar_push_as(smpi_factor, s_smpi_factor_t, fact);
index 756cf0a..fadf745 100644 (file)
@@ -670,6 +670,7 @@ void platf_generate(void) {
         node_data->router_id = bprintf("router-%d", ++last_router);
         router_parameters.id = node_data->router_id;
         sg_platf_new_router(&router_parameters);
+        break;
     }
   }
 
@@ -699,6 +700,7 @@ void platf_generate(void) {
         break;
       case HOST:
         route_parameters.src = src_data->host_parameters.id;
+        break;
     }
     switch(dst_data->kind) {
       case ROUTER:
@@ -709,6 +711,7 @@ void platf_generate(void) {
         break;
       case HOST:
         route_parameters.dst = dst_data->host_parameters.id;
+        break;
     }
     sg_platf_route_begin(&route_parameters);
     sg_platf_route_add_link(link_parameters->id, &route_parameters);
index 6438fc4..15d00b1 100644 (file)
 <!ATTLIST storage_type content  CDATA "">
 <!ATTLIST storage_type content_type  CDATA "txt_unix">
 
-<!ELEMENT storage (prop*)>
-<!ATTLIST storage id CDATA #REQUIRED>
-<!ATTLIST storage typeId CDATA #REQUIRED>
-<!ATTLIST storage content  CDATA "">
-<!ATTLIST storage content_type  CDATA "txt_unix">
-
 <!ELEMENT mount EMPTY>
 <!ATTLIST mount storageId CDATA #REQUIRED>
 <!ATTLIST mount name CDATA #REQUIRED>
 <!ATTLIST host coordinates  CDATA "">
 <!ATTLIST host pstate CDATA "0.0">
 
+<!ELEMENT storage (prop*)>
+<!ATTLIST storage id CDATA #REQUIRED>
+<!ATTLIST storage typeId CDATA #REQUIRED>
+<!ATTLIST storage content  CDATA "">
+<!ATTLIST storage content_type  CDATA "txt_unix">
+<!ATTLIST storage attach CDATA #REQUIRED>
+
 <!ELEMENT gpu EMPTY>
 <!ATTLIST gpu name CDATA #REQUIRED>
 
index 18336c9..3ceb04d 100644 (file)
@@ -403,8 +403,8 @@ static void yy_fatal_error (yyconst char msg[]  );
        *yy_cp = '\0'; \
        (yy_c_buf_p) = yy_cp;
 
-#define YY_NUM_RULES 589
-#define YY_END_OF_BUFFER 590
+#define YY_NUM_RULES 591
+#define YY_END_OF_BUFFER 592
 /* This struct is not used in this scanner,
    but its presence is necessary. */
 struct yy_trans_info
@@ -412,7 +412,7 @@ struct yy_trans_info
        flex_int32_t yy_verify;
        flex_int32_t yy_nxt;
        };
-static yyconst flex_int16_t yy_accept[3458] =
+static yyconst flex_int16_t yy_accept[3469] =
     {   0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
@@ -442,349 +442,349 @@ static yyconst flex_int16_t yy_accept[3458] =
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,  590,  588,   15,   10,   10,   15,   15,  568,
-       10,  568,    5,    6,    5,    8,    9,    8,  584,  576,
-      577,  585,  582,  585,  583,  587,  576,  577,  587,  588,
+        0,    0,  592,  590,   15,   10,   10,   15,   15,  570,
+       10,  570,    5,    6,    5,    8,    9,    8,  586,  578,
+      579,  587,  584,  587,  585,  589,  578,  579,  589,  590,
        22,   10,   22,   22,   22,   20,   22,   26,   10,   26,
 
-       26,  588,   26,  588,  588,   26,   33,   10,   33,   33,
+       26,  590,   26,  590,  590,   26,   33,   10,   33,   33,
        33,   31,   33,   37,   10,   37,   37,   48,   10,   48,
-       48,   48,   46,   48,   48,   48,  585,  584,   78,   10,
+       48,   48,   46,   48,   48,   48,  587,  586,   78,   10,
        78,   78,   78,   76,   78,   78,   78,   78,   78,   82,
        10,   82,  101,   10,  101,  101,  101,   99,  101,  101,
       101,  105,   10,  105,  128,   10,  128,  128,  128,  126,
-      128,  128,  132,   10,  132,  132,  588,  132,  588,  132,
-      132,  588,  588,  132,  588,  132,  588,  132,  147,   10,
+      128,  128,  132,   10,  132,  132,  590,  132,  590,  132,
+      132,  590,  590,  132,  590,  132,  590,  132,  147,   10,
       147,  147,  147,  145,  147,  147,  147,  147,  151,   10,
-      151,  588,  151,  164,   10,  164,  164,  164,  162,  164,
-
-      164,  164,  168,   10,  168,  168,  177,   10,  177,  177,
-      177,  175,  177,  177,  181,   10,  181,  190,   10,  190,
-      190,  190,  188,  190,  190,  194,   10,  194,  219,   10,
-      219,  219,  219,  217,  219,  219,  219,  219,  219,  223,
-       10,  223,  588,  223,  230,   10,  230,  230,  230,  228,
-      230,  234,   10,  234,  245,   10,  245,  245,  245,  243,
-      245,  245,  245,  249,   10,  249,  302,   10,  302,  302,
-      302,  300,  302,  302,  302,  302,  302,  302,  302,  302,
-      302,  306,   10,  306,  306,  325,   10,  325,  325,  325,
-      323,  325,  325,  325,  325,  325,  325,  329,   10,  329,
-
-      350,   10,  350,  350,  350,  348,  350,  350,  350,  350,
-      350,  350,  350,  354,   10,  354,  363,   10,  363,  363,
-      363,  361,  363,  363,  367,   10,  367,  378,   10,  378,
-      378,  378,  376,  378,  378,  378,  382,   10,  382,  409,
-       10,  409,  409,  409,  407,  409,  409,  409,  409,  413,
-       10,  413,  413,  426,   10,  426,  426,  426,  424,  426,
-      426,  430,   10,  430,  588,  430,  447,   10,  447,  447,
-      447,  445,  447,  447,  447,  451,   10,  451,  451,  464,
-       10,  464,  464,  464,  462,  464,  464,  468,   10,  468,
-      477,   10,  477,  477,  477,  475,  477,  477,  481,   10,
-
-      481,  481,  494,   10,  494,  494,  494,  492,  494,  494,
-      494,  498,   10,  498,  498,  515,   10,  515,  515,  515,
-      513,  515,  515,  515,  515,  515,  519,   10,  519,  588,
-      519,  526,   10,  526,  526,  526,  524,  526,  530,   10,
-      530,  537,   10,  537,  537,  537,  535,  537,  541,   10,
-      541,  541,  550,   10,  550,  550,  550,  548,  550,  550,
-      554,   10,  554,  563,   10,  563,  563,  563,  561,  563,
-      563,  567,   10,  567,   10,    0,    2,    2,    0,    4,
-        7,  579,  578,    0,    0,    0,    0,    0,    0,    0,
-       21,   23,   23,    0,    0,    0,    0,    0,    0,    0,
+      151,  590,  151,  160,   10,  160,  160,  160,  158,  160,
+
+      160,  164,   10,  164,  173,   10,  173,  173,  173,  171,
+      173,  173,  177,   10,  177,  202,   10,  202,  202,  202,
+      200,  202,  202,  202,  202,  202,  206,   10,  206,  590,
+      206,  221,   10,  221,  221,  221,  219,  221,  221,  221,
+      221,  225,   10,  225,  225,  232,   10,  232,  232,  232,
+      230,  232,  236,   10,  236,  247,   10,  247,  247,  247,
+      245,  247,  247,  247,  251,   10,  251,  304,   10,  304,
+      304,  304,  302,  304,  304,  304,  304,  304,  304,  304,
+      304,  304,  308,   10,  308,  308,  327,   10,  327,  327,
+      327,  325,  327,  327,  327,  327,  327,  327,  331,   10,
+
+      331,  352,   10,  352,  352,  352,  350,  352,  352,  352,
+      352,  352,  352,  352,  356,   10,  356,  365,   10,  365,
+      365,  365,  363,  365,  365,  369,   10,  369,  380,   10,
+      380,  380,  380,  378,  380,  380,  380,  384,   10,  384,
+      411,   10,  411,  411,  411,  409,  411,  411,  411,  411,
+      415,   10,  415,  415,  428,   10,  428,  428,  428,  426,
+      428,  428,  432,   10,  432,  590,  432,  449,   10,  449,
+      449,  449,  447,  449,  449,  449,  453,   10,  453,  453,
+      466,   10,  466,  466,  466,  464,  466,  466,  470,   10,
+      470,  479,   10,  479,  479,  479,  477,  479,  479,  483,
+
+       10,  483,  483,  496,   10,  496,  496,  496,  494,  496,
+      496,  496,  500,   10,  500,  500,  517,   10,  517,  517,
+      517,  515,  517,  517,  517,  517,  517,  521,   10,  521,
+      590,  521,  528,   10,  528,  528,  528,  526,  528,  532,
+       10,  532,  539,   10,  539,  539,  539,  537,  539,  543,
+       10,  543,  543,  552,   10,  552,  552,  552,  550,  552,
+      552,  556,   10,  556,  565,   10,  565,  565,  565,  563,
+      565,  565,  569,   10,  569,   10,    0,    2,    2,    0,
+        4,    7,  581,  580,    0,    0,    0,    0,    0,    0,
+        0,   21,   23,   23,    0,    0,    0,    0,    0,    0,
 
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,   32,   34,   34,
-        0,   47,   49,   49,   49,   49,    0,    0,    0,   77,
-       79,   79,   79,   79,   79,   79,   79,   79,   79,    0,
-      100,  102,  102,  102,  102,    0,  127,  129,  129,  129,
+        0,    0,    0,    0,    0,    0,    0,    0,   32,   34,
+       34,    0,   47,   49,   49,   49,   49,    0,    0,    0,
+       77,   79,   79,   79,   79,   79,   79,   79,   79,   79,
+        0,  100,  102,  102,  102,  102,    0,  127,  129,  129,
+      129,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,  146,
-      148,  148,  148,  148,  148,    0,    0,  163,  165,  165,
-      165,  165,    0,  176,  178,  178,  178,    0,  189,  191,
-      191,  191,    0,  218,  220,  220,  220,  220,  220,  220,
-
-      220,    0,    0,  229,  231,  231,    0,  244,  246,  246,
-      246,  246,    0,  301,  303,  303,  303,  303,  303,  303,
-      303,  303,  303,  303,  303,  303,  303,  303,  303,  303,
-      303,    0,  324,  326,  326,  326,  326,  326,  326,  326,
-      326,    0,  349,  351,  351,  351,  351,  351,  351,  351,
-      351,    0,  362,  364,  364,  364,    0,  377,  379,  379,
-      379,  379,    0,  408,  410,  410,  410,  410,  410,  410,
-        0,  425,  427,  427,  427,  427,    0,    0,  446,  448,
-      448,  448,  448,  448,    0,  463,  465,  465,  465,    0,
-      476,  478,  478,  478,    0,  493,  495,  495,  495,  495,
-
-        0,  514,  516,  516,  516,  516,  516,  516,    0,    0,
-      525,  527,  527,    0,  536,  538,  538,    0,  549,  551,
-      551,  551,    0,  562,  564,  564,  564,    0,    0,    0,
-        0,    0,    3,    0,    0,    0,    0,    0,    0,    0,
-      586,    0,   23,    0,    0,  107,    0,    0,    0,    0,
+      146,  148,  148,  148,  148,  148,    0,    0,  159,  161,
+      161,  161,    0,  172,  174,  174,  174,    0,  201,  203,
+      203,  203,  203,  203,  203,  203,    0,    0,  220,  222,
+
+      222,  222,  222,  222,    0,  231,  233,  233,    0,  246,
+      248,  248,  248,  248,    0,  303,  305,  305,  305,  305,
+      305,  305,  305,  305,  305,  305,  305,  305,  305,  305,
+      305,  305,  305,    0,  326,  328,  328,  328,  328,  328,
+      328,  328,  328,    0,  351,  353,  353,  353,  353,  353,
+      353,  353,  353,    0,  364,  366,  366,  366,    0,  379,
+      381,  381,  381,  381,    0,  410,  412,  412,  412,  412,
+      412,  412,    0,  427,  429,  429,  429,  429,    0,    0,
+      448,  450,  450,  450,  450,  450,    0,  465,  467,  467,
+      467,    0,  478,  480,  480,  480,    0,  495,  497,  497,
+
+      497,  497,    0,  516,  518,  518,  518,  518,  518,  518,
+        0,    0,  527,  529,  529,    0,  538,  540,  540,    0,
+      551,  553,  553,  553,    0,  564,  566,  566,  566,    0,
+        0,    0,    0,    0,    3,    0,    0,    0,    0,    0,
+        0,    0,  588,    0,   23,    0,    0,  107,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  106,
+        0,    0,    0,    0,    0,    0,   34,    0,    0,   49,
+        0,    0,   49,    0,    0,    0,  583,   79,    0,    0,
+       79,   79,   79,   79,   79,   79,    0,    0,  102,  102,
+
+      102,    0,    0,    0,    0,  129,    0,    0,  107,    0,
         0,    0,    0,    0,    0,    0,    0,  106,    0,    0,
-        0,    0,    0,    0,   34,    0,    0,   49,    0,    0,
-       49,    0,    0,    0,  581,   79,    0,    0,   79,   79,
-       79,   79,   79,   79,    0,    0,  102,  102,  102,    0,
-
-        0,    0,    0,  129,    0,    0,  107,    0,    0,    0,
-        0,    0,    0,    0,    0,  106,    0,    0,    0,    0,
-      148,    0,    0,  148,  148,    0,    0,    0,  165,    0,
-        0,  165,    0,    0,  178,  178,    0,    0,  191,  191,
-        0,    0,  220,  220,  220,    0,    0,  220,  220,  220,
-        0,    0,    0,    0,  231,    0,    0,  246,    0,    0,
-        0,    0,    0,    0,  303,  303,    0,    0,  303,    0,
-        0,  303,  303,  303,  303,  303,  303,  303,  303,  303,
-      303,  303,    0,    0,    0,    0,    0,    0,  326,  326,
-      326,  326,  326,    0,    0,  351,  351,  351,    0,    0,
-
-      351,  351,  351,    0,    0,  364,    0,    0,    0,    0,
-      379,    0,    0,  379,    0,    0,  410,    0,    0,  410,
-      410,  410,    0,    0,  427,  427,  427,    0,    0,    0,
-      448,  448,  448,  448,    0,    0,  465,    0,    0,    0,
-        0,  478,  478,    0,    0,  495,  495,  495,    0,    0,
-      516,  516,  516,  516,  516,    0,    0,    0,  527,    0,
-        0,    0,    0,    0,    0,    0,    0,  551,    0,    0,
-        0,    0,  564,    0,    0,    0,   14,    1,    0,    0,
-      574,    0,    0,    0,  571,  570,    0,    0,   23,    0,
-        0,   25,    0,  107,    0,    0,    0,    0,    0,    0,
-
-        0,  224,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,  106,    0,    0,
-        0,    0,    0,    0,   34,    0,    0,   36,    0,   49,
-        0,   41,   40,   49,    0,    0,    0,   51,    0,   79,
-        0,   55,   54,    0,    0,   79,    0,    0,   79,   79,
-       79,    0,    0,   81,    0,  102,  102,  102,    0,    0,
-      104,    0,    0,  109,  108,  129,    0,    0,  131,    0,
-        0,    0,    0,  225,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,  148,    0,  136,  135,  148,  148,    0,
-        0,  150,    0,    0,  165,    0,  155,  154,  165,    0,
-
-        0,  167,    0,  178,  178,    0,    0,  180,    0,  191,
-      191,    0,    0,  193,    0,  220,  220,  220,    0,  198,
-      197,  220,  220,  220,    0,    0,  222,    0,    0,    0,
-      231,    0,    0,  233,    0,  246,    0,  238,  237,    0,
-      240,  239,    0,    0,  248,    0,  303,  303,  303,  303,
-        0,  265,  264,  303,    0,  253,  252,    0,    0,  303,
-      303,  303,  303,  303,  303,  303,  303,  303,  303,    0,
-        0,  305,    0,    0,  320,  319,    0,  310,  309,    0,
-        0,  326,  326,  326,  326,    0,    0,  328,    0,  351,
-      351,  351,  351,    0,  333,  332,    0,    0,  351,  351,
-
-        0,    0,  353,    0,  364,    0,  358,  357,    0,    0,
-      366,    0,  379,    0,  371,  370,  379,    0,    0,  381,
-        0,  410,    0,  386,  385,  410,  410,  410,    0,    0,
-      412,    0,    0,    0,    0,    0,  427,    0,    0,  429,
-        0,    0,    0,    0,  448,  448,    0,    0,  448,    0,
-        0,  450,    0,  465,    0,  455,  454,    0,    0,  467,
-        0,    0,    0,    0,    0,    0,    0,  480,    0,    0,
-        0,  495,  495,    0,    0,    0,    0,  497,    0,  516,
-      516,  516,  516,  516,    0,    0,  518,    0,    0,  527,
-        0,    0,  529,    0,    0,  534,  533,    0,    0,  540,
-
-        0,    0,  545,  544,  551,    0,    0,  553,    0,    0,
-      558,  557,  564,    0,    0,  566,    0,    0,    0,  575,
-      569,    0,    0,    0,   23,    0,    0,    0,    0,    0,
-        0,    0,    0,  224,  195,    0,  383,    0,    0,    0,
-      331,    0,    0,  542,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,  330,    0,    0,    0,    0,    0,    0,
-        0,   49,    0,    0,   79,    0,   59,   58,    0,    0,
-        0,   57,   56,   79,    0,    0,   79,    0,  102,    0,
-        0,  102,    0,  129,    0,  130,    0,    0,    0,  225,
-      196,  384,  543,    0,    0,    0,    0,    0,    0,  148,
-
-      148,    0,    0,    0,    0,  165,  165,    0,    0,    0,
-      178,    0,    0,    0,  191,    0,  220,  220,    0,    0,
-      220,  220,  220,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,  303,  303,  303,  303,    0,    0,    0,  267,
-      266,  303,  303,  303,  303,  303,  303,  303,  303,  303,
-      303,  303,    0,    0,  322,  321,  326,  326,  326,  326,
-        0,  351,  351,  351,  351,    0,  341,  340,  351,  351,
-        0,  364,    0,  379,  379,    0,  410,  410,  410,  410,
-        0,    0,  419,  418,    0,  417,  416,  427,    0,  383,
-        0,  436,  435,  448,  448,    0,  434,  433,  448,    0,
-
-      465,    0,    0,  474,  473,    0,  472,  471,    0,    0,
-      487,  486,  495,  495,    0,  485,  484,    0,  516,    0,
-        0,  516,  516,  516,    0,    0,  527,    0,    0,  551,
-        0,  564,    0,    0,    0,    0,   12,    0,  572,  573,
-        0,   23,    0,    0,    0,    0,    0,    0,    0,    0,
-      195,    0,    0,  383,    0,    0,  169,    0,  331,    0,
-        0,  542,    0,  414,    0,   39,    0,    0,    0,    0,
-        0,  330,    0,   38,    0,   30,   29,    0,    0,   43,
-       42,   49,    0,    0,   79,    0,   61,   60,   79,    0,
-       65,   64,   79,    0,  102,    0,    0,    0,    0,    0,
-
-        0,  129,    0,    0,    0,  196,    0,  384,  543,  415,
-        0,    0,    0,  415,  414,  148,    0,    0,    0,  140,
-      139,    0,    0,  165,  165,    0,    0,  174,  173,  178,
-        0,    0,  187,  186,  191,    0,  220,  220,    0,  202,
-      201,    0,    0,  220,    0,    0,  220,    0,  170,    0,
-        0,  227,  226,    0,  232,    0,  242,  241,    0,  303,
-        0,    0,  303,  303,    0,  263,  262,  303,  303,    0,
-        0,  303,  303,  303,  303,  303,  303,  303,  303,    0,
-        0,    0,  326,  326,  326,    0,  351,    0,    0,  351,
-      351,    0,    0,  351,    0,  364,    0,  379,  379,    0,
-
-      410,  410,  410,    0,    0,  410,    0,  427,    0,    0,
-      448,  448,  448,    0,  465,    0,    0,  495,  495,    0,
-      516,    0,  502,  501,  516,  516,  516,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,   11,    0,   23,    0,    0,    0,    0,    0,
-        0,    0,  532,    0,    0,    0,    0,  169,    0,    0,
-        0,   53,  414,  355,    0,   39,    0,  531,   52,    0,
-        0,    0,    0,   38,    0,    0,   49,    0,    0,   79,
-       79,   79,    0,  102,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,   96,   95,    0,  129,    0,    0,    0,
-
-        0,  415,  356,    0,    0,    0,  148,    0,  138,  137,
-        0,    0,  165,    0,    0,    0,  178,    0,    0,    0,
-        0,  220,  220,    0,  200,  199,    0,    0,    0,    0,
-        0,  220,    0,  221,  170,    0,    0,  303,    0,  281,
-      280,    0,    0,  303,  303,  303,    0,  261,  260,    0,
-        0,  303,  303,  303,  303,    0,    0,  303,  303,    0,
-        0,  318,  317,    0,    0,  326,    0,    0,    0,  351,
-        0,  337,  336,    0,    0,  351,    0,  335,  334,  351,
-        0,  352,  364,    0,  379,  379,    0,  410,  410,  410,
-        0,    0,    0,  410,    0,  411,  427,    0,    0,    0,
-
-        0,    0,    0,  448,    0,  465,    0,    0,    0,    0,
-        0,    0,    0,  516,  516,  516,  516,    0,    0,    0,
-      523,  522,    0,    0,    0,  547,  546,    0,  552,    0,
-      560,  559,    0,    0,    0,    0,    0,    0,    0,    0,
-      431,    0,    0,    0,    0,  308,  251,  532,    0,   28,
-        0,    0,    0,    0,  500,   53,  355,  152,    0,  531,
-       52,  307,  250,   27,  499,    0,    0,   49,    0,    0,
-       50,   79,    0,    0,   79,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,  432,    0,    0,    0,    0,  356,  153,    0,    0,
-
-      148,    0,    0,    0,    0,  165,    0,  157,  156,    0,
-      178,    0,  179,    0,  185,  184,    0,  220,  220,    0,
-      216,  215,    0,    0,  220,    0,    0,  303,    0,  283,
-      282,  303,  303,  303,    0,  255,  254,    0,    0,  303,
-      303,  303,    0,  257,  256,  303,  303,    0,    0,  312,
-      311,    0,    0,    0,  314,  313,    0,  351,    0,  339,
-      338,  351,  351,  364,    0,  379,    0,    0,    0,  410,
-        0,    0,  410,  410,    0,    0,  410,  427,    0,  428,
-        0,    0,  440,  439,    0,  438,  437,  448,    0,  465,
-        0,    0,    0,  491,  490,    0,  489,  488,    0,  516,
-
-      516,  516,  516,    0,    0,    0,    0,    0,    0,    0,
-        0,   17,    0,   19,   18,    0,  431,  520,  368,    0,
-        0,  308,  251,    0,   28,  452,    0,  182,   16,  500,
-      152,    0,    0,  307,  250,   27,  499,    0,    0,   49,
-      580,   79,    0,   67,   66,   79,    0,   80,    0,   98,
-       97,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,  432,  369,    0,    0,    0,
-      153,    0,    0,  142,  141,  148,    0,    0,    0,  159,
-      158,  165,    0,  178,    0,  220,  220,    0,    0,    0,
-        0,  220,  183,    0,  303,  303,  303,  303,    0,  259,
-
-      258,  303,  303,  303,  303,    0,    0,    0,    0,  316,
-      315,    0,  351,  351,  351,  364,    0,  365,  379,    0,
-      375,  374,    0,  410,    0,  392,  391,  410,  410,    0,
-        0,    0,    0,  410,  427,  453,  448,    0,  465,    0,
-        0,    0,    0,    0,  516,  516,  516,    0,  521,    0,
-        0,  539,    0,    0,    0,    0,   17,    0,  520,  368,
-        0,    0,  235,  452,    0,  182,   16,    0,    0,    0,
-        0,   35,   49,    0,    0,   79,    0,    0,    0,    0,
+        0,    0,  148,    0,    0,  148,  148,    0,    0,    0,
+      161,  161,    0,    0,  174,  174,    0,    0,  203,  203,
+      203,    0,    0,  203,  203,  203,    0,    0,    0,    0,
+      222,  222,    0,    0,  222,    0,    0,  233,    0,    0,
+      248,    0,    0,    0,    0,    0,    0,  305,  305,    0,
+        0,  305,    0,    0,  305,  305,  305,  305,  305,  305,
+      305,  305,  305,  305,  305,    0,    0,    0,    0,    0,
+        0,  328,  328,  328,  328,  328,    0,    0,  353,  353,
+
+      353,    0,    0,  353,  353,  353,    0,    0,  366,    0,
+        0,    0,    0,  381,    0,    0,  381,    0,    0,  412,
+        0,    0,  412,  412,  412,    0,    0,  429,  429,  429,
+        0,    0,    0,  450,  450,  450,  450,    0,    0,  467,
+        0,    0,    0,    0,  480,  480,    0,    0,  497,  497,
+      497,    0,    0,  518,  518,  518,  518,  518,    0,    0,
+        0,  529,    0,    0,    0,    0,    0,    0,    0,    0,
+      553,    0,    0,    0,    0,  566,    0,    0,    0,   14,
+        1,    0,    0,  576,    0,    0,    0,  573,  572,    0,
+        0,   23,    0,    0,   25,    0,  107,    0,    0,    0,
+
+        0,    0,    0,    0,  226,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,  369,    0,    0,
-
-      236,    0,  148,    0,    0,  165,    0,  166,    0,    0,
-        0,  220,  220,    0,  208,    0,  207,  220,  183,    0,
-      303,  303,  303,  303,  303,    0,    0,  303,  303,  303,
-        0,    0,    0,    0,  304,    0,  327,  351,  351,  351,
-      364,    0,    0,    0,    0,    0,  410,  410,  410,    0,
-      396,    0,  395,  410,  427,  453,  448,    0,  449,    0,
-        0,    0,    0,    0,    0,  504,  503,    0,    0,  516,
-      516,    0,  517,  521,    0,    0,    0,    0,    0,    0,
-       24,    0,    0,  235,  555,    0,    0,    0,   49,    0,
+      106,    0,    0,    0,    0,    0,    0,   34,    0,    0,
+       36,    0,   49,    0,   41,   40,   49,    0,    0,    0,
+       51,    0,   79,    0,   55,   54,    0,    0,   79,    0,
+        0,   79,   79,   79,    0,    0,   81,    0,  102,  102,
+      102,    0,    0,  104,    0,    0,  109,  108,  129,    0,
+        0,  131,    0,    0,    0,    0,  227,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,  148,    0,  136,  135,
+      148,  148,    0,    0,  150,    0,    0,  161,  161,    0,
+
+        0,  163,    0,  174,  174,    0,    0,  176,    0,  203,
+      203,  203,    0,  181,  180,  203,  203,  203,    0,    0,
+      205,    0,    0,    0,  222,  222,    0,  210,  209,  222,
+        0,    0,  224,    0,  233,    0,    0,  235,    0,  248,
+        0,  240,  239,    0,  242,  241,    0,    0,  250,    0,
+      305,  305,  305,  305,    0,  267,  266,  305,    0,  255,
+      254,    0,    0,  305,  305,  305,  305,  305,  305,  305,
+      305,  305,  305,    0,    0,  307,    0,    0,  322,  321,
+        0,  312,  311,    0,    0,  328,  328,  328,  328,    0,
+        0,  330,    0,  353,  353,  353,  353,    0,  335,  334,
+
+        0,    0,  353,  353,    0,    0,  355,    0,  366,    0,
+      360,  359,    0,    0,  368,    0,  381,    0,  373,  372,
+      381,    0,    0,  383,    0,  412,    0,  388,  387,  412,
+      412,  412,    0,    0,  414,    0,    0,    0,    0,    0,
+      429,    0,    0,  431,    0,    0,    0,    0,  450,  450,
+        0,    0,  450,    0,    0,  452,    0,  467,    0,  457,
+      456,    0,    0,  469,    0,    0,    0,    0,    0,    0,
+        0,  482,    0,    0,    0,  497,  497,    0,    0,    0,
+        0,  499,    0,  518,  518,  518,  518,  518,    0,    0,
+      520,    0,    0,  529,    0,    0,  531,    0,    0,  536,
+
+      535,    0,    0,  542,    0,    0,  547,  546,  553,    0,
+        0,  555,    0,    0,  560,  559,  566,    0,    0,  568,
+        0,    0,    0,  577,  571,    0,    0,    0,   23,    0,
+        0,    0,    0,    0,    0,    0,    0,  226,  178,    0,
+      385,    0,    0,    0,  333,    0,    0,  544,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,  332,    0,    0,
+        0,    0,    0,    0,    0,   49,    0,    0,   79,    0,
+       59,   58,    0,    0,    0,   57,   56,   79,    0,    0,
+       79,    0,  102,    0,    0,  102,    0,  129,    0,  130,
+        0,    0,    0,  227,  179,  386,  545,    0,    0,    0,
+
+        0,    0,    0,  148,  148,    0,    0,    0,    0,    0,
+        0,  161,    0,    0,    0,  174,    0,  203,  203,    0,
+        0,  203,  203,  203,    0,    0,    0,  222,  222,  222,
+        0,    0,    0,    0,    0,    0,    0,  305,  305,  305,
+      305,    0,    0,    0,  269,  268,  305,  305,  305,  305,
+      305,  305,  305,  305,  305,  305,  305,    0,    0,  324,
+      323,  328,  328,  328,  328,    0,  353,  353,  353,  353,
+        0,  343,  342,  353,  353,    0,  366,    0,  381,  381,
+        0,  412,  412,  412,  412,    0,    0,  421,  420,    0,
+      419,  418,  429,    0,  385,    0,  438,  437,  450,  450,
+
+        0,  436,  435,  450,    0,  467,    0,    0,  476,  475,
+        0,  474,  473,    0,    0,  489,  488,  497,  497,    0,
+      487,  486,    0,  518,    0,    0,  518,  518,  518,    0,
+        0,  529,    0,    0,  553,    0,  566,    0,    0,    0,
+        0,   12,    0,  574,  575,    0,   23,    0,    0,    0,
+        0,    0,    0,    0,    0,  178,    0,    0,  385,    0,
+        0,  152,    0,  333,    0,    0,  544,    0,  416,    0,
+       39,    0,    0,    0,    0,    0,  332,    0,   38,    0,
+       30,   29,    0,    0,   43,   42,   49,    0,    0,   79,
+        0,   61,   60,   79,    0,   65,   64,   79,    0,  102,
+
+        0,    0,    0,    0,    0,    0,  129,    0,    0,    0,
+      179,    0,  386,  545,  417,    0,    0,    0,  417,  416,
+      148,    0,    0,    0,  140,  139,    0,    0,    0,  157,
+      156,  161,    0,    0,  170,  169,  174,    0,  203,  203,
+        0,  185,  184,    0,    0,  203,    0,    0,  203,    0,
+      153,    0,  222,  222,  222,    0,    0,  229,  228,    0,
+      234,    0,  244,  243,    0,  305,    0,    0,  305,  305,
+        0,  265,  264,  305,  305,    0,    0,  305,  305,  305,
+      305,  305,  305,  305,  305,    0,    0,    0,  328,  328,
+      328,    0,  353,    0,    0,  353,  353,    0,    0,  353,
+
+        0,  366,    0,  381,  381,    0,  412,  412,  412,    0,
+        0,  412,    0,  429,    0,    0,  450,  450,  450,    0,
+      467,    0,    0,  497,  497,    0,  518,    0,  504,  503,
+      518,  518,  518,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,   11,    0,
+       23,    0,    0,    0,    0,    0,    0,    0,  534,    0,
+        0,    0,    0,  152,    0,    0,    0,   53,  416,  357,
+        0,   39,    0,  533,   52,    0,    0,    0,    0,   38,
+        0,    0,   49,    0,    0,   79,   79,   79,    0,  102,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,   96,
+
+       95,    0,  129,    0,    0,    0,    0,  417,  358,    0,
+        0,    0,  148,    0,  138,  137,    0,    0,  161,    0,
+        0,    0,    0,  203,  203,    0,  183,  182,    0,    0,
+        0,    0,    0,  203,    0,  204,  153,    0,    0,    0,
+      222,    0,    0,    0,    0,  305,    0,  283,  282,    0,
+        0,  305,  305,  305,    0,  263,  262,    0,    0,  305,
+      305,  305,  305,    0,    0,  305,  305,    0,    0,  320,
+      319,    0,    0,  328,    0,    0,    0,  353,    0,  339,
+      338,    0,    0,  353,    0,  337,  336,  353,    0,  354,
+      366,    0,  381,  381,    0,  412,  412,  412,    0,    0,
+
+        0,  412,    0,  413,  429,    0,    0,    0,    0,    0,
+        0,  450,    0,  467,    0,    0,    0,    0,    0,    0,
+        0,  518,  518,  518,  518,    0,    0,    0,  525,  524,
+        0,    0,    0,  549,  548,    0,  554,    0,  562,  561,
+        0,    0,    0,    0,    0,    0,    0,    0,  433,    0,
+        0,    0,    0,  310,  253,  534,    0,   28,    0,    0,
+        0,    0,  502,   53,  357,  207,    0,  533,   52,  309,
+      252,   27,  501,    0,    0,   49,    0,    0,   50,   79,
         0,    0,   79,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  434,
+
+        0,    0,    0,    0,  358,  208,    0,    0,  148,    0,
+        0,  161,    0,  162,    0,  168,  167,    0,  203,  203,
+        0,  199,  198,    0,    0,  203,    0,    0,  218,  217,
+        0,    0,  222,    0,  212,  211,    0,    0,  305,    0,
+      285,  284,  305,  305,  305,    0,  257,  256,    0,    0,
+      305,  305,  305,    0,  259,  258,  305,  305,    0,    0,
+      314,  313,    0,    0,    0,  316,  315,    0,  353,    0,
+      341,  340,  353,  353,  366,    0,  381,    0,    0,    0,
+      412,    0,    0,  412,  412,    0,    0,  412,  429,    0,
+      430,    0,    0,  442,  441,    0,  440,  439,  450,    0,
+
+      467,    0,    0,    0,  493,  492,    0,  491,  490,    0,
+      518,  518,  518,  518,    0,    0,    0,    0,    0,    0,
+        0,    0,   17,    0,   19,   18,    0,  433,  522,  370,
+        0,    0,  310,  253,    0,   28,  454,    0,  165,   16,
+      502,  207,    0,    0,  309,  252,   27,  501,    0,    0,
+       49,  582,   79,    0,   67,   66,   79,    0,   80,    0,
+       98,   97,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,  434,  371,    0,    0,
+        0,  208,    0,    0,  142,  141,  148,    0,    0,  161,
+        0,  203,  203,    0,    0,    0,    0,  203,  166,    0,
+
+      214,  213,  222,    0,    0,  305,  305,  305,  305,    0,
+      261,  260,  305,  305,  305,  305,    0,    0,    0,    0,
+      318,  317,    0,  353,  353,  353,  366,    0,  367,  381,
+        0,  377,  376,    0,  412,    0,  394,  393,  412,  412,
+        0,    0,    0,    0,  412,  429,  455,  450,    0,  467,
+        0,    0,    0,    0,    0,  518,  518,  518,    0,  523,
+        0,    0,  541,    0,    0,    0,    0,   17,    0,  522,
+      370,    0,    0,  237,  454,    0,  165,   16,    0,    0,
+        0,    0,   35,   49,    0,    0,   79,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
 
+        0,    0,    0,    0,    0,    0,    0,    0,  371,    0,
+        0,  238,    0,  148,    0,    0,    0,    0,    0,  203,
+      203,    0,  191,    0,  190,  203,  166,  222,    0,  223,
+        0,  305,  305,  305,  305,  305,    0,    0,  305,  305,
+      305,    0,    0,    0,    0,  306,    0,  329,  353,  353,
+      353,  366,    0,    0,    0,    0,    0,  412,  412,  412,
+        0,  398,    0,  397,  412,  429,  455,  450,    0,  451,
+        0,    0,    0,    0,    0,    0,  506,  505,    0,    0,
+      518,  518,    0,  519,  523,    0,    0,    0,    0,    0,
+        0,   24,    0,    0,  237,  557,    0,    0,    0,   49,
+
+        0,    0,    0,   79,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,  236,    0,
-      148,    0,  556,  165,    0,  172,  171,    0,  192,  220,
-      220,  210,  209,    0,    0,    0,  303,  303,  303,  303,
-      303,    0,  293,  292,  303,    0,    0,  303,    0,    0,
-        0,    0,  351,  351,    0,    0,  364,    0,  373,  372,
-        0,  380,    0,  388,  387,  410,  410,  410,  398,  397,
-        0,    0,  427,  448,    0,    0,    0,    0,  466,    0,
-        0,    0,  508,  507,    0,    0,    0,    0,    0,  528,
-        0,    0,    0,    0,    0,  469,  555,    0,    0,    0,
-
-        0,    0,    0,    0,    0,    0,    0,    0,   79,    0,
-        0,    0,    0,   88,    0,    0,    0,    0,   87,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  238,
+        0,  148,    0,  558,    0,  155,  154,    0,  175,  203,
+      203,  193,  192,    0,    0,  222,    0,  305,  305,  305,
+      305,  305,    0,  295,  294,  305,    0,    0,  305,    0,
+        0,    0,    0,  353,  353,    0,    0,  366,    0,  375,
+      374,    0,  382,    0,  390,  389,  412,  412,  412,  400,
+      399,    0,    0,  429,  450,    0,    0,    0,    0,  468,
+        0,    0,    0,  510,  509,    0,    0,    0,    0,    0,
+
+      530,    0,    0,    0,    0,    0,  471,  557,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,   79,
+        0,    0,    0,    0,   88,    0,    0,    0,    0,   87,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,  470,    0,  148,    0,  556,  165,  220,
-        0,    0,    0,  212,  211,    0,  247,  303,  303,  303,
-        0,    0,  303,  303,    0,  291,  290,  303,    0,    0,
-        0,    0,  351,    0,    0,    0,  347,  346,    0,    0,
-      410,  410,  410,    0,  400,  399,    0,    0,    0,    0,
+        0,    0,    0,    0,  472,    0,  148,    0,  558,  203,
+        0,    0,    0,  195,  194,  222,    0,  249,  305,  305,
+      305,    0,    0,  305,  305,    0,  293,  292,  305,    0,
+        0,    0,    0,  353,    0,    0,    0,  349,  348,    0,
+        0,  412,  412,  412,    0,  402,  401,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,  506,  505,    0,    0,    0,    0,    0,  469,
 
-      133,    0,    0,    0,   45,   44,    0,    0,    0,    0,
-        0,    0,    0,    0,   79,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,  470,  134,    0,
-        0,    0,    0,    0,    0,    0,  220,    0,  214,  213,
-      303,  303,    0,    0,    0,  297,  296,    0,    0,  303,
-      303,    0,    0,    0,    0,  351,    0,  343,  342,    0,
-      360,  359,  410,    0,    0,  410,    0,    0,    0,    0,
+        0,    0,    0,  508,  507,    0,    0,    0,    0,    0,
+      471,  133,    0,    0,    0,   45,   44,    0,    0,    0,
+        0,    0,    0,    0,    0,   79,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,  565,    0,    0,    0,    0,
-
-      482,  133,   84,   83,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,   94,    0,    0,    0,
-       93,    0,    0,    0,    0,    0,  111,  119,    0,    0,
-        0,    0,  110,  118,    0,  483,  134,    0,  144,  143,
-        0,    0,  161,  160,    0,  204,  203,  220,  303,  303,
-        0,  295,  294,    0,  299,  298,  303,  303,    0,    0,
-        0,    0,  351,  410,    0,  394,  393,  410,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,  457,    0,
-        0,  456,    0,  479,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,  482,   84,   83,    0,    0,
-
-        0,    0,    0,    0,    0,    0,    0,   63,   62,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,  113,    0,
-        0,    0,  112,    0,  483,    0,  149,  220,  303,  303,
-        0,    0,  303,  275,    0,  274,    0,  351,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,  472,  134,
+        0,    0,    0,    0,    0,  203,    0,  197,  196,    0,
+        0,  305,  305,    0,    0,    0,  299,  298,    0,    0,
+      305,  305,    0,    0,    0,    0,  353,    0,  345,  344,
+        0,  362,  361,  412,    0,    0,  412,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,   75,   71,    0,    0,
-       74,   70,    0,   92,    0,    0,   91,    0,    0,    0,
-      103,    0,    0,    0,    0,    0,    0,  220,  303,  303,
-        0,    0,    0,    0,    0,  277,  276,  351,    0,  390,
-
-      389,    0,    0,    0,  423,    0,  422,    0,  444,    0,
-      443,    0,  459,  461,  458,  460,    0,  496,  510,    0,
-      509,    0,    0,    0,    0,   12,    0,   12,    0,    0,
-        0,    0,    0,   86,   90,   85,   89,  123,    0,    0,
-      121,  122,    0,    0,  120,  220,  303,  303,    0,    0,
-        0,    0,    0,  279,  278,  351,    0,    0,    0,    0,
-      421,  420,  442,  441,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,  115,    0,    0,  114,
+
+        0,    0,    0,    0,    0,    0,  567,    0,    0,    0,
+        0,  484,  133,   84,   83,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,   94,    0,    0,
+        0,   93,    0,    0,    0,    0,    0,  111,  119,    0,
+        0,    0,    0,  110,  118,    0,  485,  134,    0,  144,
+      143,    0,    0,  187,  186,  203,    0,  216,  215,  305,
+      305,    0,  297,  296,    0,  301,  300,  305,  305,    0,
+        0,    0,    0,  353,  412,    0,  396,  395,  412,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  459,
+        0,    0,  458,    0,  481,    0,    0,    0,    0,    0,
+
+        0,    0,    0,    0,    0,    0,  484,   84,   83,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,   63,   62,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  113,
+        0,    0,    0,  112,    0,  485,    0,  149,  203,  305,
+      305,    0,    0,  305,  277,    0,  276,    0,  353,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,   75,   71,    0,
+        0,   74,   70,    0,   92,    0,    0,   91,    0,    0,
+        0,  103,    0,    0,    0,    0,    0,    0,  203,  305,
+
+      305,    0,    0,    0,    0,    0,  279,  278,  353,    0,
+      392,  391,    0,    0,    0,  425,    0,  424,    0,  446,
+        0,  445,    0,  461,  463,  460,  462,    0,  498,  512,
+        0,  511,    0,    0,    0,    0,   12,    0,   12,    0,
+        0,    0,    0,    0,   86,   90,   85,   89,  123,    0,
+        0,  121,  122,    0,    0,  120,  203,  305,  305,    0,
+        0,    0,    0,    0,  281,  280,  353,    0,    0,    0,
+        0,  423,  422,  444,  443,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,  115,    0,    0,
+      114,    0,    0,    0,    0,    0,    0,    0,    0,    0,
 
-        0,    0,    0,    0,    0,   69,    0,   68,    0,    0,
-        0,    0,    0,    0,  206,  205,    0,  289,  288,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,  345,
-      344,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-       11,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,  512,  511,    0,   73,   72,    0,    0,
+        0,    0,    0,    0,    0,    0,   69,    0,   68,    0,
+        0,    0,    0,    0,    0,  189,  188,    0,  291,  290,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+      347,  346,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,   11,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,  514,  513,    0,   73,   72,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
 
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-      125,  117,  124,  116,    0,    0,    0,    0,    0,    0,
-      269,    0,    0,  268,    0,    0,  402,    0,    0,  401,
-        0,    0,    0,    0,    0,  273,    0,  272,    0,  404,
-        0,  403,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,  285,    0,  284,    0,    0,    0,
-        0,    0,    0,  287,  286,  271,  270,  406,  405,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,  125,  117,  124,  116,    0,    0,    0,    0,    0,
+        0,  271,    0,    0,  270,    0,    0,  404,    0,    0,
+      403,    0,    0,    0,    0,    0,  275,    0,  274,    0,
+      406,    0,  405,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,  287,    0,  286,    0,    0,
+        0,    0,    0,    0,  289,  288,  273,  272,  408,  407,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
 
@@ -793,7 +793,8 @@ static yyconst flex_int16_t yy_accept[3458] =
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,   13,    0
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,   13,    0
     } ;
 
 static yyconst flex_int32_t yy_ec[256] =
@@ -840,7 +841,7 @@ static yyconst flex_int32_t yy_meta[75] =
         5,    5,    5,    5
     } ;
 
-static yyconst flex_int16_t yy_base[3970] =
+static yyconst flex_int16_t yy_base[3981] =
     {   0,
         0,    0,    0,    3,    6,    9,   12,   29,   16,   19,
        14,   17,   33,   36,   49,   55,   45,   61,   66,   72,
@@ -854,12 +855,12 @@ static yyconst flex_int16_t yy_base[3970] =
       801,  804,  807,  811,  814,  867,  870,  873,  877,  880,
 
       897,  903,  921,  988,  941,  944,  947,  951, 1008, 1011,
-     1014, 1018, 1055, 1123, 1075, 1078, 1081, 1085, 1143, 1146,
-     1149, 1153, 1191, 1258, 1211, 1214, 1325, 1393, 1217, 1221,
-     1461, 1528, 1224, 1278, 1281, 1284, 1288, 1291, 1345, 1348,
-     1595, 1657, 1351, 1355, 1719, 1788, 1358, 1413, 1857,    0,
-     1416, 1419, 1423, 1426, 1481, 1484, 1487, 1491, 1931, 1998,
-     1548, 1551, 2065, 2132, 1554, 1558, 2199, 2256, 1615, 1618,
+     1014, 1018, 1055, 1122, 1075, 1078, 1189, 1257, 1081, 1085,
+     1325, 1392, 1088, 1142, 1145, 1148, 1152, 1155, 1209, 1212,
+     1459, 1527, 1215, 1219, 1222, 1277, 1280, 1283, 1287, 1290,
+     1595, 1657, 1345, 1348, 1719, 1788, 1351, 1355, 1857,    0,
+     1412, 1415, 1418, 1422, 1479, 1482, 1485, 1489, 1931, 1998,
+     1547, 1550, 2065, 2132, 1553, 1557, 2199, 2256, 1615, 1618,
      2313, 2373, 1621, 1625, 2433, 2500, 1628, 1677, 1680, 1683,
      1687, 1690, 1739, 1742, 2567, 2634, 1745, 1749, 1752, 1808,
      1811, 1814, 1818, 1821, 2701, 2768, 1951, 1954, 1957, 1961,
@@ -870,2254 +871,2262 @@ static yyconst flex_int16_t yy_base[3970] =
      2333, 2336, 2339, 2343, 2346, 2393, 2396, 2399, 3351, 3421,
      2403, 2406, 3491, 3548, 2453, 2456, 2459, 2463, 2466, 2520,
      2523, 2526, 3605, 3675, 2530, 2533, 3745, 3815, 2587, 2590,
-        0,    0, 9416,12593,12593,   95,  100,   29,   41,12593,
-      103,   51,12593,12593, 9405,12593,12593, 9394,12593, 9405,
-     9405,  202,12593,12593,12593,12593, 9403, 9399, 9354,  153,
-    12593,  161, 9380,    0,  145,12593, 9342,12593,  165, 3881,
-
-       73, 2599,  315,  357, 9382, 9329,12593,  168, 9368,    0,
-      152,12593, 9330,12593,  261, 9374,   31,12593,  266, 9361,
-        0,  245,12593, 9323, 9327, 9321,  421, 9326,12593,  269,
-     9352,    0,  340,12593, 9314, 9314,  271, 9316,  238,12593,
-      441,  484,12593,  504, 9340,    0,  401,12593, 9299, 9301,
-     9287,12593,  561,  548,12593,  571, 9332,    0,  481,12593,
-     9299, 9283,12593,  628, 3945, 9281,  163, 2533,  567,  206,
-       38, 9332,  954, 2607,  639,  907,  437,   79,12593,  634,
-     9319,    0,  546,12593, 9275, 9285, 9269, 9274,12593,  638,
-      313,  559,  368,12593,  697, 9310,    0,  549,12593, 9262,
-
-     9272, 9250,12593,  704,  426,  497,12593,  707, 9298,    0,
-      747,12593, 9268, 9248,12593,  767,  753,12593,  773, 9291,
-        0,  757,12593, 9261, 9236,12593,  831,  818,12593,  838,
-     9284,    0,  758,12593, 9233, 9239, 9245,  251, 9228,12593,
-      841,  466, 9234,  530,12593,  906, 9270,    0,  815,12593,
-     9240,12593,  914,  891,12593,  977, 9268,    0,  816,12593,
-     9220, 9230, 9217,12593,  981,  965,12593, 1021, 9256,    0,
-      881,12593, 9205,  203, 9211, 9217,  378,   85,  639,  972,
-     9205,12593, 1040,  564,  814,12593, 1044, 9247,    0,  953,
-    12593, 9191, 9209, 9211,  157, 8639, 8618,12593, 1048, 1086,
-
-    12593, 1106, 8665,    0,  966,12593, 8614, 8612, 8619, 8629,
-     8631, 8616, 8609,12593, 1111, 1099,12593, 1114, 8656,    0,
-     1032,12593, 8611, 8614,12593, 1156, 1160,12593, 1173, 8645,
-        0, 1033,12593, 8614, 8603, 8604,12593, 1180, 1228,12593,
-     1183, 8632,    0, 1100,12593, 8601, 8593, 8595,   15,12593,
-     1186,  899,  963,12593, 1241, 8622,    0, 1157,12593, 8569,
-      181,12593, 1244, 1243,  432,  303,12593, 1248, 8614,    0,
-     1158,12593, 8563, 8557,  299,12593, 1308, 1229,  350,12593,
-     1311, 8607,    0, 1295,12593, 8560, 8554,12593, 1315, 1362,
-    12593, 1319, 8585,    0, 1303,12593, 8528, 8528,12593, 1375,
-
-     1378,  685,12593, 1378, 8572,    0, 1363,12593, 8517, 8511,
-     8513,12593, 1445, 1438,  744,12593, 1449, 8557,    0, 1365,
-    12593, 8503, 8508, 8503, 8497, 8485,12593, 1454, 1447,  560,
-     1007,12593, 1511, 8527,    0, 1370,12593, 8492,12593, 1517,
-     1559,12593, 1520, 8520,    0, 1495,12593, 8480,12593, 1579,
-     1210, 1433,12593, 1584, 8511,    0, 1496,12593, 8477, 8475,
-    12593, 1587, 1632,12593, 1645, 8503,    0, 1563,12593, 8469,
-     8463,12593, 1648, 1633, 1707,  719, 8437,12593, 8496, 8467,
-    12593,12593,12593, 1700,  375, 8418, 8416, 8410, 8457, 8416,
-    12593,    0, 8408, 8396, 8420, 8382,  104, 1037, 8383, 8380,
-
-     8379, 8383,  889, 1646, 1105, 8371, 8371, 1510, 1577, 8397,
-     1701, 8372, 1709, 8361, 1719, 1720, 1721,12593,    0, 8362,
-     8364,12593,    0, 8359, 2098, 8344,  666, 8341, 8387,12593,
-        0, 8336, 2165, 8321, 8330, 8311, 8320, 8317, 8299, 8280,
-    12593,    0, 8292, 8272, 8284, 8263,12593,    0, 2232, 8261,
-     8306, 8284,  172, 8248, 8246, 8246, 1777, 1639, 8233, 1778,
-     8259,  724,  814,  841,  888, 1770, 1792, 1779, 1046,12593,
-        0, 8234, 2289, 8240, 8216, 8212,  897,12593,    0, 8216,
-     2596, 8208, 8204,12593,    0, 8197, 8194, 8194,12593,    0,
-     8189, 8185, 8186,12593,    0, 8192,  621, 2614, 8168, 8167,
-
-     8184, 8176, 1027,12593,    0, 8169, 8167,12593,    0, 8148,
-     2656, 2666, 8158,12593,    0, 8164, 8153, 2674, 8134, 2680,
-     8130, 8117, 8114, 8103, 8118, 8117, 8097, 8095, 8094, 8087,
-     8071, 8082,12593,    0, 2721, 2724, 8060, 8056, 8072, 8065,
-     8062, 8063,12593,    0, 8059, 8058, 8038, 2727, 8032, 8027,
-     8041, 8025,12593,    0, 8020, 2730, 8015,12593,    0, 8018,
-     2733, 8010, 8023,12593,    0, 8006, 2788, 7997, 8011, 8010,
-     7988,12593,    0, 7979, 7994, 7979, 7973, 7976,12593,    0,
-     7964, 7973, 7951, 7939, 7976,12593,    0, 7931, 2791, 7935,
-    12593,    0, 7912, 7922, 7922,12593,    0, 7902, 7910, 7906,
-
-     7897,12593,    0, 7884, 7869, 7875, 7877, 7875, 7858, 7847,
-    12593,    0, 7851, 7857,12593,    0, 2794, 7854,12593,    0,
-     2797, 7835, 7830,12593,    0, 2800, 7832, 7823, 7863, 7867,
-     1558, 7811,12593, 1833,    0, 7807, 7797, 7840, 7835, 7788,
-    12593, 7796, 7776, 2600, 2855, 1981, 7787, 7788, 7766, 7755,
-     7734, 7737, 7726, 7726, 7741, 7712,  330, 7705, 7710, 7713,
-     7697, 7690, 7682, 7686, 7699, 7684, 7682, 1990, 7693, 7672,
-     7676, 7673, 7661, 7674, 7668, 2858, 2863, 7667, 2866, 2048,
-     7661, 7682, 2869, 2914,12593, 7652, 2917, 2117, 2924, 7633,
-     2927, 7637, 7640, 7635, 2920, 2983, 7621, 7628, 7624, 2969,
-
-     2972, 2975, 2184, 7606, 2979, 3037, 2363, 7617, 7603, 7596,
-     7590, 7594, 7588, 7581, 7581, 2423, 7575, 7573, 7566, 7565,
-     7564, 3040, 2550, 7574, 7573, 3044, 3047, 1070, 7550, 3050,
-     2621, 7564, 3103, 3106, 7562, 7548, 3114, 3117, 7559, 7558,
-     3129, 3173, 7548, 7531, 7543, 3109, 2685, 7541, 7540, 7520,
-     3179, 3183, 1340, 7504, 7518, 3186, 3245, 7504, 3239, 2755,
-     3248, 2822, 3252, 3257, 7508, 1920, 3304, 3002, 7510, 3308,
-     3068, 3313, 7491, 7483, 7479, 7477, 7472, 7460, 7451, 7448,
-     7457, 7447, 3322, 3383, 3331, 3137, 3371, 3205, 3374, 3392,
-     3397, 3450, 3459, 3444, 3468, 7451,   37, 7433, 3454, 3403,
-
-     3512, 7445, 7427, 3516, 3519, 7428, 3522, 3411, 3525, 3571,
-     7440, 3574, 3473, 7432, 3577, 3580, 7425, 3583, 3481, 7423,
-     7408, 7405, 3628, 3634, 3637, 3640, 3700, 3643, 3704, 7408,
-     3695, 3723, 3709, 3770, 3713, 3766, 7415, 3774, 3662, 3777,
-     3780, 3792, 3836, 3839, 3843, 3846, 3854, 3849, 3867, 3878,
-     7413, 7384, 7391, 7395, 7375, 3872, 3887, 7385, 7364, 3875,
-     3897, 3906, 3732, 3909, 3920, 3916, 3804, 7363, 3924, 3952,
-     3956, 3967, 7361, 3977, 3983, 7403,12593,12593, 1210, 7350,
-    12593, 7387, 7386, 7334,12593,12593, 7332, 7330, 7333, 3987,
-     4012,12593, 4017, 1714, 7325, 7318, 7325, 7329, 7306, 7289,
-
-     7300, 1781, 7282, 7282, 7271, 7269, 7258, 7237, 7223, 7218,
-      446, 7229, 7212, 7208, 7222, 7215, 7215, 2057, 7197, 7185,
-     7190, 7179,  716, 7183, 4020, 4023, 4027,12593, 4031, 4038,
-     4046,12593,12593, 4056, 7208, 4059, 4065,12593, 4068, 7156,
-     4074,12593,12593, 4087, 4090, 4099, 4105, 4119, 7167, 4108,
-     7165, 4111, 4130,12593, 4133, 7153, 4136, 7151, 4139, 4142,
-    12593, 4145, 4154,12593,12593, 7146, 4164, 4167,12593, 4170,
-     7136, 7139, 7144, 2250, 7124, 7131, 1922, 7104, 7101, 7116,
-     7115, 7094, 7087, 7100, 4173,12593,12593, 7088, 4189, 4194,
-     4197,12593, 4200, 7093, 7090, 4203,12593,12593, 7105, 4219,
-
-     4222,12593, 4225, 4228, 4231, 4234, 4249,12593, 4253, 4256,
-     4262, 4274, 4280,12593, 4283, 7074, 7073, 4287, 4293,12593,
-    12593, 7058, 7054, 7064, 4305, 4308,12593, 4311, 7048, 7046,
-     4314, 4317, 4332,12593, 4336, 4339, 4344,12593,12593, 4357,
-    12593,12593, 4365, 4368,12593, 4371, 7047, 7025, 7046, 7037,
-     4377,12593,12593, 4390, 4393,12593,12593, 4404, 4408, 7024,
-     7040, 7023, 7024, 7028, 7007, 7002, 7004, 6992, 1376, 4416,
-     4422,12593, 4425, 4428,12593,12593, 4437,12593,12593, 4445,
-     4448, 6982, 6989, 6987, 6973, 4456, 4459,12593, 4463, 6958,
-     6954, 6943, 6955, 4466,12593,12593, 4478, 4482, 6939, 6947,
-
-     4496, 4499,12593, 4502, 6947, 4505,12593,12593, 4521, 4524,
-    12593, 4527, 6912, 4530,12593,12593, 6898, 4546, 4549,12593,
-     4554, 6888, 4558,12593,12593, 6888, 6884, 6886, 4568, 4573,
-    12593, 4577, 4580, 4583, 4598, 4604, 6885, 4612, 4616,12593,
-     4620, 6864, 4623, 4641, 6852, 6847, 4627, 4649, 6832, 4657,
-     4660,12593, 4663, 6833, 4666,12593,12593, 4682, 4688,12593,
-     4691, 4694, 4697, 4712, 4715, 4723, 4730,12593, 4734, 4737,
-     4742, 6800, 6800, 4755, 4758, 4766, 4769,12593, 4773, 6794,
-     4776, 6802, 6796, 6776, 4779, 4788,12593, 4798, 6773, 6774,
-     4801, 4807,12593, 4810, 4813,12593,12593, 4821, 4829,12593,
-
-     4832, 4836,12593,12593, 6754, 4844, 4851,12593, 4854, 4864,
-    12593,12593, 6733, 4873, 4876,12593, 4879, 1216, 4882,12593,
-    12593, 6749, 6747, 6707, 6670, 4885, 6588, 6592, 6517, 6486,
-     6486, 6397, 6407, 2307, 2483, 6285, 2492, 6194, 6168, 6087,
-     2495,   12,   36, 2559,  131,  264,  311,  352,  389,  436,
-      488,  488,  549, 2562,  590,  632, 4888, 4906, 4916, 4919,
-     4923,  703,  802, 4931,  782, 4937,12593,12593, 4945, 4952,
-     4963,12593,12593,  797, 4971, 4975,  836, 4983,  830, 4989,
-     4992, 5002, 5007,  835, 5010,12593,  851,  980,  964, 2662,
-     2693, 2763, 2830,  980, 1043, 1099, 1106, 1154, 1178, 1192,
-
-     5013, 5020, 5034, 5042, 1197, 1236, 1249, 5045, 5048, 5051,
-     1286, 5066, 5069, 5072, 1304, 5080, 1315, 1308, 5087, 5090,
-     5099, 1332, 5110, 5113, 1320, 1323, 5117, 5121, 5135, 5138,
-     5142, 5150, 1383, 5157, 1365, 1386, 5160, 5163, 5171,12593,
-    12593, 1389, 1394, 5180, 1382, 1411, 1411, 1430, 1455, 1432,
-     1462, 1464, 5183, 5186,12593,12593, 5194, 5198, 5202, 5205,
-     5208, 1495, 5212, 1495, 1508, 5223,12593,12593, 5233, 1519,
-     5236, 1536, 5239, 1554, 1583, 5242, 1578, 1604, 1594, 5245,
-     5251, 5270,12593,12593, 5278,12593,12593, 1605, 5265, 3010,
-     5286,12593,12593, 1628, 1646, 5294,12593,12593, 1632, 5302,
-
-     1639, 5309, 5312,12593,12593, 5321,12593,12593, 5332, 5335,
-    12593,12593, 1667, 1707, 5344,12593,12593, 5352, 1702, 5355,
-     5358, 1709, 1721, 1756, 5367, 1766, 5373, 5376, 5380, 5386,
-     5391, 5395, 5400, 1951, 1829, 5404,12593, 1831,12593,12593,
-     1790, 1792, 5413, 1788, 1894, 1899, 1907, 1923, 1936, 1935,
-     3076, 1954, 1977, 3266, 1986, 1990, 3279, 1991, 3342, 1978,
-     1976, 3377, 1992, 3530, 2008, 3540, 2026, 2035, 2051, 2052,
-     2055, 3380, 2041, 3670, 5419,12593,12593, 5427, 5433,12593,
-    12593, 2053, 2078, 5446, 2056, 5456,12593,12593, 2067, 5466,
-    12593,12593, 2058, 5474, 2062, 5477, 2851, 3945, 5485, 5489,
-
-     5498, 2076, 2080, 2100, 2104, 3727, 2112, 4268, 4631, 5503,
-     2119, 2108, 2110, 5506, 5509, 2117, 5512, 5517, 5526,12593,
-    12593, 5536, 2143, 2126, 5539, 5542, 5546,12593,12593, 2142,
-     5557, 5561,12593,12593, 5576, 5579, 2147, 2136, 5584,12593,
-    12593, 5594, 5598, 5607, 5612, 5615, 2161, 5626, 5016, 2181,
-     5630,12593,12593, 5638,12593, 5645,12593,12593, 5653, 2188,
-     5657, 5660, 5668, 2173, 5675,12593,12593, 2175, 2191, 5686,
-     5689, 5700, 2184, 2200, 2194, 2201, 5704, 2223, 2232, 5707,
-     5710, 5722, 5713, 5718, 5731, 5736, 2245, 5739, 5742, 5750,
-     2234, 5757, 5761, 2244, 5769, 2237, 5777, 2249, 2232, 5781,
-
-     2254, 2239, 2274, 5784, 5790, 2290, 5802, 2286, 5805, 2302,
-     5808, 5813, 5816, 5834, 2298, 5837, 5840, 5843, 5846, 5849,
-     2293, 5864,12593,12593, 2301, 2302, 2300, 5872, 2316, 5875,
-     5884, 5893, 5898, 5902, 5906, 5920, 5924, 5927, 5942, 2352,
-     2351, 2396,12593, 2338, 5945, 5948, 2359, 2353, 2356, 2450,
-     2354, 2362, 5935, 2374, 2379, 2396, 2409, 5954, 2420, 2410,
-     2411, 5957, 5963, 5967, 2429, 5970, 2440, 5973, 5976, 2424,
-     2450, 2486, 2475, 5979, 2492, 5983, 2498, 2536, 5986, 2532,
-     5989, 2539, 5992, 5995, 2584, 2571, 2649, 2573, 2588, 2576,
-     2668, 2586, 6013,12593,12593, 6021, 6024, 2573, 2566, 2716,
-
-     2574, 6027, 6030, 2579, 2717, 2722, 6035, 6042,12593,12593,
-     6053, 2597, 6056, 6059, 6062, 6077, 2632, 6082, 6086, 6089,
-     6097, 2615, 2625, 6107,12593,12593, 6116, 6119, 6127, 2656,
-     2664, 2660, 6135,12593, 6138, 2687, 6141, 2688, 6145,12593,
-    12593, 6154, 6160, 2693, 2703, 2703, 6168,12593,12593, 6176,
-     6179, 6187, 2706, 2736, 2748, 6190, 6194, 2740, 2735, 6208,
-     6211,12593,12593, 6219, 6223, 6231, 6237, 6240, 6249, 2752,
-     6256,12593,12593, 6264, 6268, 2763, 6276,12593,12593, 2760,
-     6284,12593, 2769, 6287, 2753, 6290, 6293, 2754, 6296, 2779,
-     6308, 2793, 2794, 2794, 6316,12593, 2806, 6319, 2796, 6322,
-
-     6325, 6343, 6346, 2819, 6355, 2814, 6361, 6364, 6367, 6370,
-     6385, 6388, 6396, 2817, 2825, 2821, 2834, 6399, 2846, 6404,
-    12593,12593, 6418, 6422, 6426,12593,12593, 6437,12593, 6441,
-    12593,12593, 6449, 2915, 2894, 2922, 2871, 6456, 6470, 6478,
-     6452, 2865, 2884, 2908, 2885, 6481, 6484, 6487, 2903, 6490,
-     2922, 2924, 2938, 2932, 6497, 6500, 6503, 6506, 2934, 6509,
-     6512, 6515, 6518, 6521, 6524, 2935, 6527, 2943, 2956, 6530,
-    12593, 2941, 6533, 6536, 2960, 6553, 6556, 6559, 2975, 2976,
-     3005, 3020, 3013, 3025, 3022, 3025, 3031, 3030, 6567, 6574,
-     6579, 6587, 3022, 3042, 3019, 3037, 6592, 6595, 6598, 6601,
-
-     3046, 6609, 3056, 6612, 6617, 3056, 6630,12593,12593, 6638,
-     3073, 6643,12593, 6646,12593,12593, 6657, 3067, 3068, 6662,
-    12593,12593, 3157, 3177, 3082, 3091, 6670, 3085, 6676,12593,
-    12593, 3085, 3088, 3118, 6690,12593,12593, 6684, 6698, 3120,
-     3109, 3118, 6707,12593,12593, 3130, 6715, 6718, 6722,12593,
-    12593, 6733, 6737, 6745,12593,12593, 6753, 3131, 6756,12593,
-    12593, 3126, 3135, 3130, 6765, 3144, 6768, 6772, 6786, 3145,
-     6789, 6792, 3156, 3149, 3218, 3239, 3155, 3165, 6800,12593,
-     3171, 6807,12593,12593, 6820,12593,12593, 3188, 6815, 3182,
-     6829, 6834, 6837,12593,12593, 6849,12593,12593, 6857, 6861,
-
-     6867, 6871, 6879, 6885, 3189, 6889, 6892, 6897, 6904, 3255,
-     3321, 6900, 6912,12593,12593, 6923, 6926, 6929, 6932, 3196,
-     3209, 6942, 6945, 3220, 6951, 6954, 3237, 6960, 6963, 6966,
-     6969, 3245, 3252, 6972, 6975, 6978, 6983, 3257, 6986, 3253,
-    12593, 6989, 6992,12593,12593, 7000, 7007,12593, 7011,12593,
-    12593, 3297, 3288, 3303, 3304, 3311, 3314, 3308, 3323, 3335,
-     3363, 7019, 7022, 5419, 5856, 7030, 7033, 3325, 3323, 3343,
-     7038, 3336, 7041,12593,12593, 3335, 7049, 3347, 7052,12593,
-    12593, 3345, 7060, 7068, 7063, 3362, 3384, 3417, 3443, 3423,
-     3446, 3406, 7071, 7074, 3403, 3410, 3409, 3480, 7082,12593,
-
-    12593, 7096, 3411, 3427, 3420, 7099, 7102, 7110, 7117,12593,
-    12593, 7125, 3429, 3436, 3482, 3493, 7129,12593, 7135, 7138,
-    12593,12593, 7148, 7154, 7157,12593,12593, 7167, 7172, 3520,
-     3558, 3543, 3562, 7175, 3540, 7178, 3541, 7185, 7181, 7193,
-     7205, 7212, 7208, 7217, 7227, 7234, 7237, 7240, 7245, 7255,
-     7259,12593, 7262, 7268, 3581, 3578, 7274, 7281, 7289, 7292,
-     3529, 3531, 7295, 7300, 3539, 7303, 7306, 3531, 3559, 3565,
-     7309,12593, 3555, 7312, 7315, 3592, 3607, 3605, 3620, 3609,
-     3620, 3617, 3613, 3632, 3621, 3632, 7323, 3640, 3644, 3743,
-     3642, 3652, 3650, 3663, 3828, 3660, 3680, 7331, 3676, 3672,
-
-     7334, 3670, 3680, 7337, 3707, 3721, 7342,12593, 7345, 7349,
-     7357, 3719, 3721, 3792,12593, 3790,12593, 7363, 7366, 7369,
-     3733, 3756, 3747, 3743, 3795, 7372, 7377, 3794, 7390, 3807,
-     7393, 3856, 3906, 7404,12593, 7409,12593, 3796, 3799, 7412,
-     3800, 7415, 7433, 7418, 7441, 7444, 3830, 3834, 3844, 3899,
-    12593, 3905,12593, 7452, 3855, 7423, 3874, 7455,12593, 7459,
-     7463, 7477, 7480, 7484, 7487,12593,12593, 7499, 7503, 7511,
-     7517, 7520,12593, 7523, 7531, 7535, 3932, 3941, 3945, 7539,
-    12593, 3870, 3890, 7542, 7550, 3898, 3911, 3924, 7554, 7558,
-     4049, 4091, 3921, 3958, 3971, 3975, 3982, 4004, 3987, 4006,
-
-     4012, 4016, 4035, 7566, 3976, 3995, 3991, 3996, 4002, 3995,
-     4004, 4023, 4023, 4035, 4035, 4028, 4031, 4051, 7572, 4041,
-     4067, 7575, 7578, 4077, 7581,12593,12593, 7589,12593, 4078,
-     7597,12593,12593, 7600, 7604, 7618, 4079, 4090, 4102, 7621,
-     4096, 7627,12593,12593, 4121, 7639, 7643, 4112, 4148, 4147,
-     4152, 4150, 4115, 7651, 7657, 7660, 7669, 7675,12593,12593,
-     7683,12593, 7687,12593,12593, 4132, 4157, 4154,12593,12593,
-     7695, 7698, 7706, 7709, 7713, 4452, 4613, 7727,12593, 7730,
-     7733, 7736,12593,12593, 7752, 7755, 7763, 7766, 7774,12593,
-     7777, 4195, 4199, 4242, 4145, 7781, 7784, 4163, 4167, 4189,
-
-     7787, 7798, 4203, 4207, 4310, 4208, 4212, 4322, 4187, 4242,
-     4226, 4229, 4237,12593, 4268, 4256, 4256, 4263,12593, 7806,
-     4256, 4265, 4253, 4267, 4276, 4281, 4282, 4295, 4282, 4302,
-     4311, 4316, 4308, 7809, 4324, 7812, 7815, 7818, 7821, 7825,
-     7830, 7844, 7852,12593,12593, 7860,12593, 4334, 4321, 7863,
-     7866, 7872, 7884, 4336, 7887,12593,12593, 4336, 4368, 4360,
-     4378, 4363, 4355, 7895, 7898, 7906,12593,12593, 7914, 7917,
-     4344, 7925, 4362, 7928,12593,12593, 7936, 7939, 7947, 7950,
-     4379, 4380, 4384, 4386, 4397, 4398, 7958, 7961, 7965, 4521,
-     4540, 7973,12593,12593, 7981, 4424, 4435, 7984, 4400, 7834,
-
-     7987, 4388, 4403, 7990,12593,12593, 4451, 4439, 4443, 4461,
-     4473, 4461, 4475, 4484, 8003, 4475, 4495, 4512, 4498, 4481,
-     4513, 4528, 4516, 8006, 4472, 4475, 4491, 4539, 4548, 4503,
-     4500, 4506, 4538, 4582, 4585, 4535, 4545, 8010, 8013, 8016,
-     8025, 8021, 8034, 8040, 8048, 8052, 4549, 8060,12593,12593,
-     4550, 4549, 8068, 8073, 8082,12593,12593, 8090, 8093, 4538,
-     4546, 4581, 4587, 4597, 4600, 4595, 8101,12593,12593, 8109,
-    12593,12593, 4603, 8117, 8120, 4584, 8128, 4636, 4643, 8136,
-     4675, 4677, 4630, 4639, 4670, 4636, 4647, 4678, 8144, 8147,
-     4674, 4679, 4677, 4683, 8150,12593, 4743, 8153, 8156, 8159,
-
-     8178, 8181, 8184, 8187, 4688, 4702, 4705, 4696, 4707, 4721,
-     4724, 4713, 8190, 8193, 4726, 4735,12593, 4736, 4755, 4755,
-    12593, 4757, 8201, 4735, 4726, 4790,12593,12593, 4754, 4754,
-     4752, 4817,12593,12593, 4776, 8204, 8208, 8214,12593,12593,
-     8222, 8225,12593,12593, 8234,12593,12593, 4772, 4786, 4787,
-     8242,12593,12593, 8250,12593,12593, 8258, 4783, 4845, 4820,
-     4851, 4823, 4806, 8261, 8264,12593,12593, 8272, 4833, 4846,
-     4859, 4871, 4862, 4874, 4865, 4878, 4871, 4885,12593, 4878,
-     4888,12593, 8279,12593, 8282, 4890, 4885, 4902, 4891, 4917,
-     8285, 8291, 8304, 8335, 8382, 8312, 8315, 8318, 4917, 4938,
-
-     4939, 4910, 4927, 4948, 4950, 4920, 8323,12593,12593, 4956,
-     4930, 4935, 4961, 4938, 4950, 8346, 4922, 4923,12593, 4940,
-     4933, 4934,12593, 4945, 8355, 8358,12593, 4947, 4965, 4975,
-     8361, 8365, 8373,12593, 5022,12593, 5020, 4971, 8393, 8402,
-     8411, 8414, 5027, 4995, 5032, 5003, 5050, 5020, 5052, 5024,
-     5058, 5060, 5068, 5070, 8422, 5074, 5045, 5078, 5055, 5084,
-     8429, 5129, 5089, 8449, 8496, 5083,12593,12593, 5067, 5093,
-    12593,12593, 5072,12593, 5116, 5120,12593, 5122, 5123, 8442,
-    12593, 5172, 5085, 5141, 5182, 5107, 5159, 5118, 5140, 5121,
-     8469, 5195, 5236, 8461, 8479,12593,12593, 5166, 8516,12593,
-
-    12593, 8524, 5239, 5281,12593, 5217,12593, 5224,12593, 5251,
-    12593, 5249,12593,12593,12593,12593, 8487,12593,12593, 5238,
-    12593, 5239, 5271, 5311, 5322, 5277, 5331, 5277, 8490, 5279,
-     5273, 5294, 5293,12593,12593,12593,12593,12593, 5258, 5339,
-    12593,12593, 5260, 5403,12593, 8532, 8535, 8542, 5344, 5320,
-     5369, 5344, 8546,12593,12593, 8554, 5391, 5357, 5397, 5380,
-    12593,12593,12593,12593, 5388, 5402, 8560, 5435, 5430, 5443,
-     8563, 5450, 5441, 5455, 5449, 5410,12593, 5433, 5421,12593,
-     5436, 8566, 8572, 8584, 8587, 8595, 8598, 5450, 5464, 5481,
-     5477, 5489, 5502, 8606, 8609, 5485, 5494, 5511, 5494, 5503,
-
-     5525, 5513, 5514, 8617, 5537,12593, 5532,12593, 5534, 5505,
-     5522, 5508, 5525, 8620,12593,12593, 8629,12593,12593, 8637,
-     5567, 5581, 5547, 5556, 5554, 5566, 5572, 5574, 8645,12593,
-    12593, 5585, 5590, 5589, 5598, 5604, 5600, 5637, 5635, 5630,
-    12593, 5646, 5644, 5596, 5611, 5599, 5618, 5658, 5653, 5661,
-     5656, 5656, 5669, 5670, 5667, 5674, 5674, 5688, 5705, 5710,
-     5717, 5724, 5729,12593,12593, 5775,12593,12593, 5690, 5709,
-     5699, 5715, 5734, 5755, 5742, 5768, 5754, 5759, 5777, 5776,
-     5780, 5798, 5787, 5785, 5803, 5792, 5792, 5809, 5844, 5849,
-     5850, 5850, 5852, 5826, 5833, 5835, 5851, 5873, 5874, 5908,
-
-     5891, 5882, 5911, 5906, 5897, 5929, 5915, 5905, 5944, 5981,
-    12593,12593,12593,12593, 5933, 5958, 5970, 5978, 5999, 5976,
-    12593, 6001, 5980,12593, 6012, 5987,12593, 6012, 6003,12593,
-     6062, 6003, 6017, 6010, 6024,12593, 6024,12593, 6026,12593,
-     6041,12593, 6044, 8655, 6046, 6068, 6050, 6068, 6043, 6050,
-     6059, 6062, 8658, 6101,12593, 6103,12593, 6108, 6106, 6118,
-     6117, 6130, 6148,12593,12593,12593,12593,12593,12593, 6107,
-     6139, 6140, 6156, 6167, 6199, 6285, 6317, 6225, 6235, 6261,
-     6264, 6132, 6310, 6145, 6283, 6196, 6255, 6288, 6340, 6164,
-     6198, 6358, 6360, 6286, 6331, 6385, 6398, 6391, 6394, 6373,
-
-     6413, 6185, 6322, 6475, 6526, 6441, 6529, 6114, 6417, 6617,
-     6624, 6552, 6610, 6416, 6544, 6559, 6588, 6618, 6649, 6312,
-     6602, 6678, 6694, 6414, 6661, 6604, 6663, 6531, 6554, 6315,
-     6656, 6675, 6688, 6566, 6636, 6722, 6724, 6664, 6733, 6743,
-     6777, 6730, 6760, 6794, 6836, 6763, 6805, 6808, 6810, 6890,
-     6977, 6442, 6902, 8666, 8669,12593,12593, 8689, 8698, 8707,
-     8716, 8725, 8734, 8743, 8752, 8761, 8770, 8779, 8788, 8797,
-     8806, 8815, 8824, 8833, 8842, 8851, 8860, 8869, 8878, 8887,
-     8896, 8905, 8914, 8923, 8932, 8941, 8950, 8959, 8968, 8977,
-     8986, 8995, 9004, 9013, 9022, 9031, 9040, 9049, 9058, 9067,
-
-     9076, 9085, 9094, 9103, 9112, 9121, 9130, 9139, 9148, 9157,
-     9166, 9175, 9184, 9193, 9202, 9211, 9220, 9229, 9238, 9247,
-     9254, 9261, 9268, 9275, 9282, 9289, 9296, 9303, 9310, 9317,
-     9324, 9331, 9338, 9345, 9352, 9359, 9366, 9373, 9380, 9387,
-     9394, 9401, 9408, 9415, 9422, 9429, 9436, 9443, 9450, 9459,
-     9466, 9471, 9478, 9483, 9490, 9495, 9502, 9507, 9514, 9519,
-     9526, 9531, 9538, 9543, 9550, 9555, 9562, 9567, 9574, 9579,
-     9586, 9591, 9598, 9603, 9610, 9615, 9622, 9627, 9634, 9639,
-     9646, 9651, 9658, 9663, 9670, 9675, 9682, 9687, 9694, 9699,
-     9706, 9711, 9718, 9723, 9730, 9735, 9742, 9747, 9754, 9759,
-
-     9766, 9771, 9778, 9783, 9790, 9795, 9802, 9807, 9816, 9822,
-     9829, 9837, 9844, 9852, 9859, 9867, 9874, 9882, 9889, 9897,
-     9904, 9912, 9919, 9927, 9934, 9942, 9949, 9957, 9964, 9972,
-     9979, 9987, 9994,10002,10009,10017,10024,10032,10040,10048,
-    10055,10063,10070,10078,10085,10093,10100,10108,10116,10124,
-    10132,10140,10147,10155,10163,10171,10179,10187,10194,10202,
-    10209,10217,10225,10232,10240,10247,10255,10264,10270,10277,
-    10285,10293,10301,10309,10317,10324,10332,10339,10347,10354,
-    10362,10369,10377,10384,10392,10400,10408,10416,10424,10431,
-    10439,10447,10455,10463,10471,10478,10486,10493,10501,10508,
-
-    10516,10523,10531,10538,10546,10553,10561,10568,10576,10583,
-    10591,10598,10606,10614,10621,10629,10636,10644,10651,10659,
-    10667,10674,10682,10689,10697,10706,10715,10722,10730,10738,
-    10745,10753,10760,10768,10775,10783,10790,10797,10805,10812,
-    10820,10827,10835,10842,10850,10857,10865,10873,10881,10888,
-    10896,10904,10912,10919,10927,10934,10942,10949,10957,10964,
-    10972,10979,10987,10994,11002,11009,11017,11025,11032,11040,
-    11047,11055,11063,11071,11079,11087,11095,11103,11111,11120,
-    11129,11136,11144,11152,11159,11167,11174,11182,11189,11197,
-    11204,11211,11219,11226,11234,11241,11249,11257,11265,11272,
-
-    11280,11288,11295,11303,11311,11319,11326,11334,11341,11349,
-    11356,11364,11371,11379,11386,11394,11402,11410,11417,11425,
-    11433,11441,11449,11456,11464,11472,11480,11488,11496,11505,
-    11514,11522,11530,11538,11545,11553,11560,11568,11576,11584,
-    11592,11600,11608,11616,11624,11631,11639,11647,11654,11662,
-    11669,11677,11685,11693,11700,11707,11715,11722,11730,11737,
-    11744,11752,11759,11767,11774,11782,11790,11798,11805,11813,
-    11821,11829,11837,11846,11855,11863,11871,11878,11885,11893,
-    11901,11908,11916,11923,11931,11938,11946,11953,11961,11968,
-    11976,11984,11991,11998,12006,12013,12021,12028,12035,12042,
-
-    12050,12057,12065,12073,12081,12089,12097,12105,12113,12121,
-    12130,12139,12147,12155,12162,12170,12178,12185,12193,12200,
-    12208,12216,12224,12231,12239,12246,12254,12262,12269,12276,
-    12284,12292,12300,12307,12314,12322,12330,12338,12346,12354,
-    12362,12370,12378,12386,12395,12404,12412,12419,12426,12434,
-    12441,12449,12456,12464,12471,12479,12486,12493,12500,12508,
-    12515,12522,12529,12538,12547,12556,12565,12574,12583
+        0,    0, 9426,12639,12639,   95,  100,   29,   41,12639,
+      103,   51,12639,12639, 9415,12639,12639, 9404,12639, 9415,
+     9415,  202,12639,12639,12639,12639, 9413, 9409, 9364,  153,
+    12639,  161, 9390,    0,  145,12639, 9352,12639,  165, 3881,
+
+       73, 2599,  315,  357, 9392, 9339,12639,  168, 9378,    0,
+      152,12639, 9340,12639,  261, 9384,   31,12639,  266, 9371,
+        0,  245,12639, 9333, 9337, 9331,  421, 9336,12639,  269,
+     9362,    0,  340,12639, 9324, 9324,  271, 9326,  238,12639,
+      441,  484,12639,  504, 9350,    0,  401,12639, 9309, 9311,
+     9297,12639,  561,  548,12639,  571, 9342,    0,  481,12639,
+     9309, 9293,12639,  628, 3945, 9291,  163, 2533,  567,  206,
+       38, 9342,  954, 2607,  639,  907,  437,   79,12639,  634,
+     9329,    0,  546,12639, 9285, 9295, 9279, 9284,12639,  638,
+      313,  559,  368,12639,  697, 9320,    0,  549,12639, 9286,
+
+     9266,12639,  704,  750,12639,  707, 9313,    0,  747,12639,
+     9279, 9254,12639,  771,  758,12639,  774, 9306,    0,  748,
+    12639, 9251, 9257, 9267,  251, 9246,12639,  831,  429, 9252,
+      497,12639,  837, 9292,    0,  815,12639, 9239, 9243, 9253,
+     8660,12639,  840,  530,  564,12639,  906, 8712,    0,  816,
+    12639, 8681,12639,  914,  891,12639,  977, 8709,    0,  825,
+    12639, 8665, 8675, 8662,12639,  981,  965,12639, 1021, 8705,
+        0,  881,12639, 8654,  203, 8659, 8669,  970,   85,  429,
+      972, 8656,12639, 1040,  814,  833,12639, 1044, 8691,    0,
+      953,12639, 8639, 8656, 8651,  157, 8649, 8628,12639, 1048,
+
+     1092,12639, 1105, 8675,    0,  966,12639, 8620, 8618, 8624,
+     8629, 8630, 8612, 8605,12639, 1108, 1093,12639, 1116, 8652,
+        0, 1032,12639, 8599, 8599,12639, 1172, 1159,12639, 1175,
+     8630,    0, 1033,12639, 8591, 8587, 8588,12639, 1179, 1226,
+    12639, 1183, 8609,    0, 1095,12639, 8578, 8572, 8573,   15,
+    12639, 1239,  899, 1074,12639, 1242, 8597,    0, 1167,12639,
+     8549,  181,12639, 1246, 1242,  367,  303,12639, 1307, 8585,
+        0, 1234,12639, 8537, 8527,  299,12639, 1310, 1310,  350,
+    12639, 1313, 8572,    0, 1302,12639, 8529, 8533,12639, 1358,
+     1363,12639, 1377, 8557,    0, 1362,12639, 8509, 8508,12639,
+
+     1383, 1430,  370,12639, 1425, 8549,    0, 1426,12639, 8501,
+     8495, 8491,12639, 1442, 1436,  488,12639, 1448, 8534,    0,
+     1432,12639, 8482, 8469, 8474, 8467, 8456,12639, 1509, 1445,
+      560, 1103,12639, 1515, 8502,    0, 1494,12639, 8472,12639,
+     1518, 1558,12639, 1521, 8499,    0, 1559,12639, 8453,12639,
+     1579, 1141, 1344,12639, 1583, 8484,    0, 1567,12639, 8441,
+     8443,12639, 1587, 1632,12639, 1590, 8468,    0, 1629,12639,
+     8434, 8436,12639, 1645, 1633, 1707,  677, 8412,12639, 8472,
+     8461,12639,12639,12639, 1700,  375, 8411, 8404, 8398, 8446,
+     8404,12639,    0, 8389, 8390, 8413, 8377,  104, 1328, 8374,
+
+     8361, 8356, 8360,  621, 1646,  695, 8347, 8330, 1701,  912,
+     8352, 1719, 8328, 1709, 8313, 1724, 1777, 1778,12639,    0,
+     8318, 8319,12639,    0, 8315, 2098, 8307,  666, 8300, 8337,
+    12639,    0, 8292, 2165, 8276, 8297, 8281, 8289, 8284, 8283,
+     8258,12639,    0, 8270, 8255, 8267, 8235,12639,    0, 2232,
+     8233, 8278, 8256,  172, 8230, 8229, 8229, 1788, 1171, 8216,
+     1789, 8241,  707,  814,  841, 1022, 1577, 1913, 1639, 1179,
+    12639,    0, 8216, 2289, 8225, 8201, 8200,  889,12639,    0,
+     8203, 8196, 8197,12639,    0, 8185, 8181, 8182,12639,    0,
+     8174,  826, 2596, 8151, 8151, 8167, 8158,  897,12639,    0,
+
+     8143, 8127, 2614, 8124, 8119,12639,    0, 8119, 8123,12639,
+        0, 8102, 2656, 2666, 8116,12639,    0, 8121, 8114, 2674,
+     8095, 2680, 8091, 8092, 8088, 8075, 8092, 8091, 8066, 8085,
+     8079, 8072, 8061, 8072,12639,    0, 2721, 2724, 8050, 8042,
+     8057, 8053, 8050, 8042,12639,    0, 8043, 8042, 8022, 2727,
+     8016, 8007, 8028, 8002,12639,    0, 7982, 2730, 7977,12639,
+        0, 7963, 2733, 7950, 7967,12639,    0, 7953, 2788, 7935,
+     7953, 7943, 7931,12639,    0, 7913, 7929, 7909, 7903, 7910,
+    12639,    0, 7890, 7908, 7900, 7889, 7926,12639,    0, 7874,
+     2791, 7879,12639,    0, 7869, 7881, 7881,12639,    0, 7858,
+
+     7853, 7849, 7848,12639,    0, 7831, 7825, 7828, 7839, 7831,
+     7791, 7787,12639,    0, 7789, 7796,12639,    0, 2794, 7792,
+    12639,    0, 2797, 7782, 7760,12639,    0, 2800, 7763, 7752,
+     7792, 7800, 1615, 7741,12639, 1970,    0, 7737, 7736, 7781,
+     7779, 7731,12639, 7744, 7724, 2600, 2855, 1714, 7722, 7725,
+     7710, 7723, 7702, 7708, 7699, 7689, 7704, 7683,  458, 7676,
+     7689, 7684, 7669, 7668, 7656, 7661, 7669, 7655, 7653, 1990,
+     7657, 7637, 7650, 7647, 7631, 7640, 7634, 2858, 2863, 7632,
+     2866, 2048, 7627, 7658, 2869, 2914,12639, 7624, 2917, 2117,
+     2924, 7614, 2927, 7611, 7615, 7617, 2920, 2983, 7603, 7610,
+
+     7610, 2969, 2972, 2975, 2184, 7587, 2979, 3037, 2363, 7596,
+     7582, 7575, 7572, 7576, 7559, 7552, 7553, 2423, 7551, 7549,
+     7529, 7528, 7514, 3040, 2550, 7528, 7526, 3044, 3047,  868,
+     7525, 7501, 3050, 3103, 7513, 7508, 3106, 3114, 7503, 7492,
+     7496, 3109, 2621, 7495, 7496, 7476, 3117, 3129, 1204, 7474,
+     7486, 7459, 3170, 2685, 7472, 3173, 3180, 7470, 3183, 3242,
+     7460, 3176, 2755, 3237, 2822, 3247, 3250, 7463, 1993, 3255,
+     3002, 7462, 3305, 3069, 3308, 7457, 7439, 7449, 7443, 7439,
+     7426, 7419, 7407, 7411, 7393, 3312, 3315, 3318, 3137, 3374,
+     3204, 3377, 3384, 3397, 3387, 3453, 3443, 3467, 7397,   37,
+
+     7387, 3446, 3405, 3456, 7398, 7373, 3511, 3519, 7373, 3515,
+     3474, 3522, 3525, 7386, 3571, 3574, 7375, 3582, 3625, 7372,
+     3628, 3594, 7369, 7355, 7342, 3633, 3640, 3636, 3646, 3654,
+     3696, 3704, 7346, 3699, 3709, 3723, 3770, 3766, 3775, 7350,
+     3778, 3727, 3781, 3835, 3838, 3841, 3844, 3847, 3850, 3872,
+     3875, 3878, 3885, 7351, 7312, 7318, 7322, 7308, 3893, 3897,
+     7317, 7302, 3905, 3908, 3949, 3735, 3952, 3957, 3967, 3801,
+     7300, 3977, 3987, 3980, 3912, 7299, 4012, 4015, 7346,12639,
+    12639, 1141, 7275,12639, 7317, 7310, 7259,12639,12639, 7250,
+     7245, 7248, 4019, 4022,12639, 4025, 1848, 7240, 7228, 7237,
+
+     7245, 7235, 7224, 7221, 2250, 7205, 7209, 7209, 7213, 7188,
+     7185, 7176, 7173, 1450, 7187, 7170, 7167, 7181, 7167, 7168,
+     2307, 7157, 7146, 7151, 7137, 1782, 7150, 4044, 4034, 4047,
+    12639, 4053, 4056, 4062,12639,12639, 4077, 7170, 4080, 4083,
+    12639, 4086, 7127, 4089,12639,12639, 4105, 4108, 4117, 4123,
+     4128, 7131, 4141, 7129, 4144, 4147,12639, 4150, 7123, 4153,
+     7121, 4159, 4171,12639, 4174, 4178,12639,12639, 7116, 4186,
+     4193,12639, 4196, 7108, 7104, 7113, 2483, 7092, 7100, 2054,
+     7088, 7088, 7101, 7089, 7069, 7063, 7076, 4199,12639,12639,
+     7067, 4207, 4215, 4218,12639, 4225, 7073, 4228, 4237, 4240,
+
+     4246,12639, 4249, 4255, 4259, 4273, 4277,12639, 4280, 7041,
+     7048, 4268, 4292,12639,12639, 7029, 7026, 7039, 4288, 4300,
+    12639, 4303, 7018, 7016, 7021, 7018, 4307,12639,12639, 7039,
+     4322, 4325,12639, 4329, 4332, 4335, 4354,12639, 4357, 4350,
+     4362,12639,12639, 4376,12639,12639, 4384, 4387,12639, 4391,
+     6992, 6979, 6997, 6985, 4394,12639,12639, 4406, 4410,12639,
+    12639, 4418, 4425, 6971, 6984, 6967, 6974, 6966, 6941, 6936,
+     6931, 6919,  637, 4436, 4439,12639, 4442, 4445,12639,12639,
+     4461,12639,12639, 4469, 4472, 6909, 6916, 6921, 6900, 4480,
+     4483,12639, 4487, 6896, 6891, 6878, 6893, 4490,12639,12639,
+
+     4502, 4506, 6878, 6866, 4514, 4520,12639, 4523, 6866, 4526,
+    12639,12639, 4542, 4545,12639, 4548, 6841, 4551,12639,12639,
+     6848, 4567, 4570,12639, 4575, 6830, 4579,12639,12639, 6838,
+     6833, 6831, 4589, 4594,12639, 4598, 4601, 4604, 4619, 4625,
+     6828, 4633, 4637,12639, 4641, 6819, 4644, 4662, 6801, 6732,
+     4648, 4670, 6695, 4678, 4681,12639, 4684, 6689, 4687,12639,
+    12639, 4703, 4709,12639, 4712, 4715, 4718, 4733, 4736, 4744,
+     4751,12639, 4755, 4758, 4763, 6598, 6595, 4776, 4779, 4787,
+     4790,12639, 4794, 6536, 4797, 6555, 6552, 6520, 4800, 4809,
+    12639, 4819, 6517, 6481, 4822, 4828,12639, 4831, 4834,12639,
+
+    12639, 4842, 4850,12639, 4853, 4857,12639,12639, 6475, 4865,
+     4872,12639, 4875, 4885,12639,12639, 6450, 4894, 4897,12639,
+     4900, 1280, 4903,12639,12639, 6462, 6436, 6398, 6335, 4906,
+     6250, 6247, 6246, 6167, 6159, 6038, 6019, 2492, 2495,   20,
+     2559,  134,  249,  294, 2562,  345,  352, 2662,  383,  444,
+      450,  497,  561,  580,  667,  697,  698, 2693,  744,  759,
+     4909, 4927, 4937, 4940, 4944,  771,  802, 4952,  782, 4958,
+    12639,12639, 4966, 4973, 4984,12639,12639,  981, 4992, 4996,
+      978, 5004, 1032, 5010, 5013, 5023, 5028, 1059, 5031,12639,
+     1093, 1179, 1165, 2763, 3010, 3077, 2830, 1200, 1239, 1229,
+
+     1230, 1246, 1265, 1259, 5034, 5041, 5055, 5063, 1264, 5066,
+     5069, 1286, 5078, 5084, 5087, 1312, 5097, 1316, 1333, 5102,
+     5105, 5116, 1370, 5120, 5123, 1364, 1368, 1379, 1392, 1403,
+     5128, 5134, 5143, 5152, 5155, 5160, 5173, 1409, 5176, 1407,
+     1446, 5179, 5183, 5197,12639,12639, 1449, 1477, 5205, 1471,
+     1509, 1496, 1504, 1519, 1497, 1513, 1548, 5208, 5211,12639,
+    12639, 5219, 5223, 5227, 5230, 5233, 1603, 5241, 1587, 1599,
+     5248,12639,12639, 5259, 1625, 5262, 1639, 5265, 1640, 1649,
+     5268, 1650, 1684, 1696, 5277, 5289, 5295,12639,12639, 5304,
+    12639,12639, 1691, 5312, 3212, 5315,12639,12639, 1706, 1726,
+
+     5332,12639,12639, 1710, 5327, 1713, 5340, 5347,12639,12639,
+     5355,12639,12639, 5363, 5366,12639,12639, 1715, 1734, 5375,
+    12639,12639, 5383, 1729, 5389, 5392, 1736, 1762, 1779, 5402,
+     1767, 5407, 5411, 5414, 5417, 5421, 5425, 5435, 1951, 1827,
+     5443,12639, 1833,12639,12639, 1793, 1885, 5446, 1902, 1921,
+     1917, 1919, 1936, 1937, 1959, 3275, 1969, 1985, 3279, 1987,
+     1992, 3342, 1992, 3346, 1984, 1992, 3380, 2000, 3415, 2008,
+     3482, 2026, 2035, 2051, 2054, 2056, 3450, 2043, 3666, 5455,
+    12639,12639, 5467, 5470,12639,12639, 2067, 2087, 5479, 2060,
+     5488,12639,12639, 2070, 5499,12639,12639, 2061, 5507, 2080,
+
+     5512, 2851, 3032, 5520, 5531, 5526, 2108, 2103, 2109, 2107,
+     3486, 2115, 3589, 3796, 5539, 2122, 2118, 2124, 5545, 5548,
+     2126, 5552, 5555, 5563,12639,12639, 5571, 2147, 5574,12639,
+    12639, 2144, 5582, 5586,12639,12639, 5594, 5597, 2148, 2153,
+     5606,12639,12639, 5619, 5622, 5630, 5633, 5637, 2176, 5651,
+     3809, 2189, 5654, 5657, 5662, 5665, 5680,12639,12639, 5675,
+    12639, 5688,12639,12639, 5696, 2189, 5699, 5702, 5717, 2175,
+     5720,12639,12639, 2176, 2193, 5728, 5731, 5739, 2188, 2201,
+     2200, 2218, 5746, 2238, 2240, 5749, 5752, 5757, 5770, 5773,
+     5776, 5779, 2246, 5782, 5794, 5802, 2236, 5805, 5809, 2245,
+
+     5823, 2239, 5826, 2253, 2233, 5832, 2260, 2256, 2289, 5835,
+     5847, 2298, 5855, 2287, 5858, 2304, 5861, 5864, 5867, 5870,
+     2299, 5889, 5885, 5893, 5896, 5899, 2295, 5904,12639,12639,
+     2305, 2308, 2301, 5914, 2318, 5919, 5922, 5938, 5941, 5944,
+     5947, 5966, 5969, 5972, 5980, 2352, 2402, 2396,12639, 2338,
+     5987, 5990, 2359, 2351, 2353, 2450, 2350, 2362, 3931, 2374,
+     2379, 2405, 2411, 4652, 2421, 2412, 2415, 5037, 5993, 5999,
+     2438, 6005, 2441, 6009, 6012, 2448, 2465, 2486, 2473, 6015,
+     2491, 6018, 2498, 2536, 6021, 2532, 6024, 2539, 6027, 6030,
+     2584, 2573, 2649, 2574, 2590, 2586, 2668, 2590, 6033,12639,
+
+    12639, 6042, 6048, 2575, 2569, 2716, 2575, 6052, 6055, 2608,
+     2717, 2722, 6061, 6069,12639,12639, 6079, 2598, 2642, 6082,
+     6089, 6092, 6101, 2617, 2643, 6108,12639,12639, 6116, 6120,
+     6134, 2664, 2681, 2684, 6128,12639, 6142, 2687, 6149, 6152,
+     6160, 6163, 6167, 6181, 6184, 2688, 6187,12639,12639, 6195,
+     6203, 2693, 2703, 2703, 6213,12639,12639, 6221, 6224, 6235,
+     2706, 2736, 2748, 6239, 6243, 2740, 2735, 6253, 6257,12639,
+    12639, 6265, 6268, 6276, 6279, 6283, 6297, 2752, 6301,12639,
+    12639, 6309, 6312, 2762, 6320,12639,12639, 2755, 6328,12639,
+     2768, 6331, 2750, 6334, 6337, 2753, 6340, 2774, 6343, 2791,
+
+     2793, 2773, 6352,12639, 2794, 6358, 2795, 6361, 6364, 6372,
+     6380, 2807, 6390, 2813, 6399, 6402, 6405, 6409, 6423, 6426,
+     6434, 2815, 2818, 2817, 2833, 6437, 2829, 6442,12639,12639,
+     6457, 6460, 6464,12639,12639, 6472,12639, 6479,12639,12639,
+     6487, 2888, 2964, 2922, 2871, 6492, 6496, 6510, 6514, 2865,
+     2882, 2898, 2878, 6517, 6520, 6523, 2883, 6529, 2885, 2882,
+     2912, 2929, 6534, 6537, 6540, 6543, 2928, 6546, 6549, 6552,
+     6555, 6558, 6561, 2930, 6564, 2940, 2952, 6567,12639, 2934,
+     6570, 6576, 2953, 6590, 6593, 6596, 2972, 2970, 2970, 3010,
+     3013, 3025, 3027, 3034, 3042, 3039, 6604, 6611, 6616, 6624,
+
+     3046, 3075, 3059, 3062, 6629, 6632, 6635, 6638, 3059, 6646,
+     3070, 3090, 6649,12639, 6654,12639,12639, 6668, 3084, 3077,
+     6672,12639,12639, 3163, 3164, 3087, 3095, 6680,12639,12639,
+     6688, 6691, 3120, 6699,12639,12639, 6707, 6710, 3134, 6713,
+    12639,12639, 3139, 3144, 3161, 6722,12639,12639, 6730, 6733,
+     3159, 3148, 3173, 6741,12639,12639, 3193, 6749, 6752, 6755,
+    12639,12639, 6767, 6771, 6779,12639,12639, 6787, 3183, 6790,
+    12639,12639, 3179, 3195, 3193, 6799, 3209, 6802, 6806, 6820,
+     3210, 6823, 6826, 3214, 3205, 3298, 3299, 3212, 3224, 6834,
+    12639, 3238, 6841,12639,12639, 6854,12639,12639, 3272, 6849,
+
+     3266, 6863, 6868, 6871,12639,12639, 6883,12639,12639, 6891,
+     6895, 6901, 6905, 6913, 6919, 3261, 6923, 6926, 6931, 6938,
+     3322, 3353, 6934, 6946,12639,12639, 6957, 6960, 6963, 6966,
+     3270, 3270, 6976, 6979, 3282, 6985, 6988, 3304, 6994, 6997,
+     7000, 7003, 3306, 3330, 7006, 7009, 7012, 7017, 3332, 7020,
+     3327,12639, 7023, 7026,12639,12639, 7034, 7041,12639, 7045,
+    12639,12639, 3377, 3364, 3379, 3378, 3386, 3388, 3375, 3417,
+     3429, 3436, 7053, 7056, 7039, 7043, 7073, 7080, 3398, 3397,
+     3414, 7084, 3406, 7087,12639,12639, 3406, 7095, 3419, 7101,
+     7104, 3463, 3479, 3506, 3529, 3509, 3531, 3488, 7107, 7119,
+
+    12639,12639, 3470, 7110, 7115, 3487, 3491, 3490, 3521, 7130,
+    12639,12639, 7142, 3501, 3517, 3518, 7145, 7149, 7163, 7166,
+    12639,12639, 7176, 3525, 3534, 3536, 3546, 7182,12639, 7185,
+     7188,12639,12639, 7196, 7203, 7206,12639,12639, 7215, 7221,
+     3574, 3598, 3594, 3624, 7224, 3585, 7138, 3592, 7227, 7233,
+     7242, 7251, 7254, 7257, 7261, 7276, 7279, 7283, 7286, 7297,
+     7305, 7308,12639, 7313, 7317, 3639, 3647, 7320, 7327, 7336,
+     7339, 3583, 3586, 7342, 7346, 3597, 7349, 7352, 3590, 3602,
+     3604, 7355,12639, 3598, 7358, 7361, 3615, 3662, 3661, 3675,
+     3669, 3681, 3677, 3675, 3699, 3687, 3702, 7380, 3683, 3714,
+
+     3727, 3712, 3731, 3730, 3736, 3796, 3731, 3749, 7383, 3745,
+     3741, 7386, 3785, 3795, 7389, 3799, 7392, 7395, 7403, 3798,
+     3801, 3864,12639, 3862,12639, 7410, 7413, 3809, 7416,12639,
+     7423, 3815, 3836, 3828, 3833, 3857, 7428, 7431, 3859, 7442,
+     3869, 7446, 3900, 3935, 7456,12639, 7460,12639, 3855, 3859,
+     7464, 3862, 7467, 7475, 7470, 7485, 7489, 3889, 3884, 3886,
+     3958,12639, 3956,12639, 7497, 3913, 7503, 3916, 7506,12639,
+     7509, 7515, 7527, 7530, 7534, 7537,12639,12639, 7549, 7553,
+     7561, 7567, 7570,12639, 7573, 7581, 7585, 3973, 3983, 3967,
+     7589,12639, 3909, 3932, 7592, 7600, 3924, 3939, 3945, 7604,
+
+     7608, 4006, 4080, 3941, 3978, 3988, 4010, 4021, 4046, 4031,
+     4040, 4045, 4048, 4063, 7616, 4007, 4019, 4031, 4037, 4037,
+     4031, 4033, 4055, 4053, 4062, 4061, 4058, 4060, 4080, 7622,
+     4074, 4086, 7625, 7628, 7631,12639,12639, 7639,12639, 4068,
+     7647,12639,12639, 7650, 7654, 4105, 7668, 4086, 4101, 4107,
+     7671, 4100, 7677,12639,12639, 4112, 7689, 7693, 4103, 4150,
+     4149, 4153, 4156, 4120, 7701, 7707, 7710, 7719, 7725,12639,
+    12639, 7733,12639, 7737,12639,12639, 4147, 4154, 4157,12639,
+    12639, 7745, 7748, 7756, 7759, 7763, 4305, 4425, 7777,12639,
+     7780, 7783, 7786,12639,12639, 7802, 7805, 7813, 7816, 7824,
+
+    12639, 7827, 4205, 4253, 4279, 4147, 7831, 7834, 4171, 4182,
+     4183, 7837, 7848, 4198, 4201, 4233, 4208, 4228, 4328, 4203,
+     4242, 4243, 4267, 4272,12639, 4292, 4277, 4276, 4280,12639,
+     7856, 4276, 4285, 4274, 4302, 4314, 4323, 4306, 4316, 4303,
+     4321, 4330, 4335, 4331, 7859, 4348, 7862, 7865, 7868, 7871,
+     7875, 7880, 7893,12639,12639, 7901, 7904,12639, 4354, 4342,
+     7908, 7911, 7919, 7914, 4355, 7932,12639,12639, 4362, 4395,
+     4380, 4401, 4386, 4382, 7940, 7943, 7951,12639,12639, 7959,
+     7962, 4372, 7970, 4382, 7973,12639,12639, 7981, 7984, 7992,
+     7995, 4399, 4400, 4415, 4417, 4419, 4420, 8003, 8006, 8010,
+
+     4476, 4495, 8018,12639,12639, 8026, 4493, 4511, 8029, 4408,
+     8032, 8035, 4400, 4401, 8038,12639,12639, 4455, 4444, 4445,
+     4467, 4475, 4463, 4467, 4491, 8048, 4496, 4516, 4533, 4519,
+     4502, 4534, 4549, 4537, 8051, 4495, 4497, 4515, 4569, 4574,
+     4524, 4518, 4522, 4542, 4590, 4602, 4552, 4562, 8055, 8058,
+     8061, 8070, 8066, 8079, 8085, 4562, 8097,12639,12639, 8093,
+     8105, 4565, 4564, 8113, 8118, 8127,12639,12639, 8135, 8138,
+     4552, 4564, 4592, 4592, 4602, 4608, 4604, 8146,12639,12639,
+     8154,12639,12639, 4606, 8162, 8165, 4589, 8173, 4657, 4664,
+     8181, 4696, 4698, 4626, 4635, 4669, 4634, 4643, 4685, 8189,
+
+     8192, 4665, 4671, 4670, 4677, 8195,12639, 4764, 8198, 8201,
+     8204, 8223, 8226, 8229, 8232, 4673, 4699, 4701, 4689, 4695,
+     4718, 4724, 4712, 8235, 8238, 4727, 4733,12639, 4738, 4741,
+     4743,12639, 4746, 8246, 4733, 4719, 4799,12639,12639, 4754,
+     4755, 4741, 4806,12639,12639, 4765, 8249, 8253, 8259,12639,
+    12639, 8267, 8270,12639,12639, 4770, 8279,12639,12639, 4771,
+     4784, 8287,12639,12639, 8295,12639,12639, 8303, 4780, 4843,
+     4811, 4855, 4826, 4814, 8306, 8309,12639,12639, 8317, 4836,
+     4854, 4845, 4857, 4848, 4864, 4857, 4890, 4883, 4893,12639,
+     4886, 4896,12639, 8324,12639, 8327, 4899, 4888, 4906, 4895,
+
+     4915, 8330, 8336, 8349, 8380, 8427, 8357, 8360, 8363, 4912,
+     4939, 4943, 4911, 4933, 4954, 4956, 4926, 8368,12639,12639,
+     4965, 4940, 4947, 4972, 4950, 4951, 8391, 4923, 4925,12639,
+     4935, 4935, 4938,12639, 4952, 8400, 8403,12639, 4950, 4958,
+     4969, 8406, 8410, 8418,12639, 5015,12639, 5014, 4968, 8438,
+     8447, 8456, 8459, 5040, 5008, 5040, 5011, 5046, 5015, 5046,
+     5023, 5057, 5068, 5067, 5068, 8467, 5078, 5052, 5085, 5055,
+     5095, 8474, 5096, 5124, 8494, 8541, 5083,12639,12639, 5072,
+     5098,12639,12639, 5075,12639, 5122, 5128,12639, 5132, 5133,
+     8487,12639, 5191, 5101, 5145, 5156, 5118, 5161, 5118, 5120,
+
+     5111, 8514, 5163, 5220, 8506, 8524,12639,12639, 5135, 8561,
+    12639,12639, 8569, 5247, 5250,12639, 5190,12639, 5196,12639,
+     5210,12639, 5209,12639,12639,12639,12639, 8532,12639,12639,
+     5197,12639, 5218, 5285, 5267, 5235, 5242, 5274, 5249, 8535,
+     5269, 5274, 5288, 5285,12639,12639,12639,12639,12639, 5244,
+     5316,12639,12639, 5252, 5328,12639, 8577, 8580, 8587, 5304,
+     5294, 5332, 5310, 8591,12639,12639, 8599, 5333, 5333, 5341,
+     5342,12639,12639,12639,12639, 5338, 5350, 8605, 5383, 5376,
+     5391, 8608, 5396, 5385, 5421, 5411, 5372,12639, 5391, 5379,
+    12639, 5394, 8611, 8617, 8629, 8632, 8640, 8643, 5411, 5419,
+
+     5432, 5416, 5427, 5440, 8651, 8654, 5425, 5434, 5453, 5437,
+     5445, 5462, 5446, 5449, 8662, 5473,12639, 5461,12639, 5464,
+     5438, 5455, 5441, 5461, 8665,12639,12639, 8674,12639,12639,
+     8682, 5492, 5499, 5480, 5487, 5487, 5507, 5512, 5515, 8690,
+    12639,12639, 5523, 5529, 5525, 5531, 5548, 5544, 5581, 5584,
+     5574,12639, 5597, 5595, 5537, 5551, 5547, 5562, 5605, 5600,
+     5608, 5613, 5614, 5620, 5621, 5618, 5626, 5636, 5640, 5647,
+     5648, 5645, 5655, 5661,12639,12639, 5668,12639,12639, 5626,
+     5643, 5642, 5657, 5672, 5691, 5675, 5695, 5690, 5687, 5713,
+     5702, 5704, 5721, 5720, 5721, 5739, 5730, 5727, 5745, 5770,
+
+     5781, 5782, 5782, 5784, 5757, 5764, 5777, 5778, 5793, 5783,
+     5816, 5797, 5794, 5823, 5814, 5805, 5838, 5819, 5810, 5839,
+     5894,12639,12639,12639,12639, 5825, 5850, 5847, 5855, 5878,
+     5852,12639, 5885, 5871,12639, 5921, 5896,12639, 5921, 5899,
+    12639, 5945, 5898, 5911, 5917, 5930,12639, 5931,12639, 5933,
+    12639, 5934,12639, 5936, 8700, 5938, 5971, 5954, 5976, 5943,
+     5960, 5961, 6004, 8703, 6054,12639, 6052,12639, 6060, 6059,
+     6063, 6065, 6057, 6059,12639,12639,12639,12639,12639,12639,
+     6107, 6113, 6127, 6152, 6077, 6096, 6158, 6215, 6137, 6180,
+     6182, 6191, 6198, 6209, 6193, 6231, 6067, 6119, 6087, 6242,
+
+     6228, 6305, 6233, 6338, 6212, 6365, 6282, 6370, 6359, 6376,
+     6105, 6255, 6357, 6423, 6367, 6427, 6379, 6401, 6157, 6396,
+     6467, 6486, 6451, 6452, 6307, 6403, 6509, 6557, 6589, 6639,
+     6271, 6435, 6570, 6653, 6591, 6623, 6563, 6596, 6667, 6686,
+     6601, 6698, 6647, 6709, 6701, 6718, 6665, 6721, 6767, 6775,
+     6743, 6777, 6726, 6764, 6800, 6828, 6794, 6797, 6793, 6811,
+     6839, 6844, 6856, 6080, 8711, 8714,12639,12639, 8734, 8743,
+     8752, 8761, 8770, 8779, 8788, 8797, 8806, 8815, 8824, 8833,
+     8842, 8851, 8860, 8869, 8878, 8887, 8896, 8905, 8914, 8923,
+     8932, 8941, 8950, 8959, 8968, 8977, 8986, 8995, 9004, 9013,
+
+     9022, 9031, 9040, 9049, 9058, 9067, 9076, 9085, 9094, 9103,
+     9112, 9121, 9130, 9139, 9148, 9157, 9166, 9175, 9184, 9193,
+     9202, 9211, 9220, 9229, 9238, 9247, 9256, 9265, 9274, 9283,
+     9292, 9299, 9306, 9313, 9320, 9327, 9334, 9341, 9348, 9355,
+     9362, 9369, 9376, 9383, 9390, 9397, 9404, 9411, 9418, 9425,
+     9432, 9439, 9446, 9453, 9460, 9467, 9474, 9481, 9488, 9495,
+     9504, 9511, 9516, 9523, 9528, 9535, 9540, 9547, 9552, 9559,
+     9564, 9571, 9576, 9583, 9588, 9595, 9600, 9607, 9612, 9619,
+     9624, 9631, 9636, 9643, 9648, 9655, 9660, 9667, 9672, 9679,
+     9684, 9691, 9696, 9703, 9708, 9715, 9720, 9727, 9732, 9739,
+
+     9744, 9751, 9756, 9763, 9768, 9775, 9780, 9787, 9792, 9799,
+     9804, 9811, 9816, 9823, 9828, 9835, 9840, 9847, 9852, 9861,
+     9867, 9874, 9882, 9889, 9897, 9904, 9912, 9919, 9927, 9934,
+     9942, 9949, 9957, 9964, 9972, 9979, 9987, 9994,10002,10009,
+    10017,10024,10032,10039,10047,10054,10062,10069,10077,10085,
+    10093,10100,10108,10115,10123,10130,10138,10145,10153,10161,
+    10169,10177,10185,10192,10200,10208,10216,10224,10232,10239,
+    10247,10254,10262,10270,10277,10285,10292,10300,10309,10315,
+    10322,10330,10338,10346,10354,10362,10369,10377,10384,10392,
+    10399,10407,10414,10422,10430,10438,10446,10454,10461,10469,
+
+    10476,10484,10492,10500,10508,10516,10523,10531,10538,10546,
+    10553,10561,10568,10576,10583,10591,10598,10606,10613,10621,
+    10628,10636,10643,10651,10659,10666,10674,10681,10689,10696,
+    10704,10712,10719,10727,10734,10742,10751,10760,10767,10775,
+    10783,10790,10798,10805,10813,10820,10828,10835,10842,10850,
+    10857,10865,10872,10880,10887,10895,10902,10910,10918,10926,
+    10933,10941,10949,10957,10964,10972,10979,10987,10994,11002,
+    11009,11017,11024,11032,11039,11047,11054,11062,11070,11077,
+    11085,11092,11100,11108,11116,11124,11132,11140,11148,11156,
+    11165,11174,11181,11189,11197,11204,11212,11219,11227,11234,
+
+    11242,11249,11256,11264,11271,11279,11287,11295,11302,11310,
+    11318,11326,11334,11341,11349,11357,11365,11372,11380,11387,
+    11395,11402,11410,11417,11425,11432,11440,11448,11456,11463,
+    11471,11479,11487,11495,11502,11510,11518,11526,11534,11542,
+    11551,11560,11568,11576,11584,11591,11599,11606,11614,11622,
+    11630,11638,11646,11654,11661,11669,11677,11684,11692,11700,
+    11708,11715,11723,11731,11739,11746,11753,11761,11768,11776,
+    11783,11790,11798,11805,11813,11820,11828,11836,11844,11851,
+    11859,11867,11875,11883,11892,11901,11909,11917,11924,11931,
+    11939,11947,11954,11962,11969,11977,11984,11991,11999,12007,
+
+    12014,12022,12030,12037,12044,12052,12059,12067,12074,12081,
+    12088,12096,12103,12111,12119,12127,12135,12143,12151,12159,
+    12167,12176,12185,12193,12201,12208,12216,12224,12231,12239,
+    12247,12255,12262,12269,12277,12285,12292,12300,12308,12315,
+    12322,12330,12338,12346,12353,12360,12368,12376,12384,12392,
+    12400,12408,12416,12424,12432,12441,12450,12458,12465,12472,
+    12480,12487,12495,12503,12510,12517,12525,12532,12539,12546,
+    12554,12561,12568,12575,12584,12593,12602,12611,12620,12629
     } ;
 
-static yyconst flex_int16_t yy_def[3970] =
+static yyconst flex_int16_t yy_def[3981] =
     {   0,
-     3458, 3458, 3459, 3459, 3459, 3459, 3460, 3460, 3461, 3461,
-     3462, 3462, 3463, 3463, 3463, 3463, 3464, 3464, 3458, 3458,
-     3465, 3465, 3466, 3466, 3466, 3466, 3458, 3458, 3466, 3466,
-     3466, 3466, 3458, 3458, 3466, 3466, 3458, 3458, 3466, 3466,
-     3466, 3466, 3467, 3467, 3468, 3468, 3458, 3458, 3468, 3468,
-     3468, 3468, 3469, 3469, 3463, 3463, 3470, 3470, 3471, 3471,
-     3472, 3472, 3473, 3473, 3474, 3474, 3475, 3475, 3475, 3475,
-     3458, 3458, 3475, 3475, 3475, 3475, 3458, 3458, 3475, 3475,
-     3475, 3475, 3458, 3458, 3475, 3475, 3458, 3458, 3475, 3475,
-     3475, 3475, 3458, 3458, 3475, 3475, 3458, 3458, 3475, 3475,
-
-     3475, 3475, 3476, 3476, 3477, 3477, 3458, 3458, 3477, 3477,
-     3477, 3477, 3478, 3478, 3479, 3479, 3458, 3458, 3479, 3479,
-     3479, 3479, 3480, 3480, 3481, 3481, 3482, 3482, 3483, 3483,
-     3484, 3484, 3485, 3485, 3458, 3458, 3485, 3485, 3485, 3485,
-     3486, 3486, 3487, 3487, 3488, 3488, 3489, 3489, 3457,  149,
-     3490, 3490, 3458, 3458, 3490, 3490, 3490, 3490, 3491, 3491,
-     3492, 3492, 3493, 3493, 3494, 3494, 3495, 3495, 3496, 3496,
-     3497, 3497, 3498, 3498, 3499, 3499, 3500, 3500, 3458, 3458,
-     3500, 3500, 3500, 3500, 3501, 3501, 3502, 3502, 3458, 3458,
-     3502, 3502, 3502, 3502, 3503, 3503, 3504, 3504, 3458, 3458,
-
-     3504, 3504, 3504, 3504, 3505, 3505, 3506, 3506, 3507, 3507,
-     3508, 3508, 3458, 3458, 3508, 3508, 3508, 3508, 3509, 3509,
-     3510, 3510, 3458, 3458, 3510, 3510, 3510, 3510, 3511, 3511,
-     3512, 3512, 3458, 3458, 3512, 3512, 3512, 3512, 3513, 3513,
-     3514, 3514, 3515, 3515, 3516, 3516, 3458, 3458, 3516, 3516,
-     3516, 3516, 3517, 3517, 3518, 3518, 3519, 3519, 3520, 3520,
-     3458, 3458, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3521, 3457, 3457, 3521, 3457, 3457, 3457,
-
-      300,  300,  302,  300,  303,  303, 3457, 3457, 3457, 3522,
-     3457, 3457, 3522, 3457, 3457,  304,  303, 3457, 3457, 3457,
-     3523, 3457, 3457, 3523, 3523, 3523, 3457, 3457, 3457, 3457,
-     3457, 3524, 3457, 3457, 3524, 3524, 3524, 3524, 3524, 3457,
-     3457, 3457, 3457, 3457, 3457, 3525, 3457, 3457, 3525, 3525,
-     3525, 3457, 3457, 3457, 3457, 3457, 3457, 3526, 3457, 3457,
-     3526, 3526, 3457, 3457, 3457,  365,  303,  303,  304,  369,
-      368,  368,  368,  368,  369,  375,  373,  373, 3457, 3457,
-     3457, 3527, 3457, 3457, 3527, 3527, 3527, 3527, 3457, 3457,
-      303,  303,  303, 3457, 3457, 3457, 3528, 3457, 3457, 3528,
-
-     3528, 3528, 3457, 3457,  303,  303, 3457, 3457, 3457, 3529,
-     3457, 3457, 3529, 3529, 3457, 3457, 3457, 3457, 3457, 3457,
-     3530, 3457, 3457, 3530, 3530, 3457, 3457, 3457, 3457, 3457,
-     3457, 3531, 3457, 3457, 3531, 3531, 3531, 3531, 3531, 3457,
-     3457,  392,  392,  303, 3457, 3457, 3457, 3532, 3457, 3457,
-     3532, 3457, 3457, 3457, 3457, 3457, 3457, 3533, 3457, 3457,
-     3533, 3533, 3533, 3457, 3457, 3457, 3457, 3457, 3457, 3534,
-     3457, 3457, 3534, 3534, 3534, 3534, 3534, 3534, 3534, 3534,
-     3534, 3457, 3457,  303,  303, 3457, 3457, 3457, 3535, 3457,
-     3457, 3535, 3535, 3535, 3535, 3535, 3535, 3457, 3457, 3457,
-
-     3457, 3457, 3457, 3536, 3457, 3457, 3536, 3536, 3536, 3536,
-     3536, 3536, 3536, 3457, 3457, 3457, 3457, 3457, 3457, 3537,
-     3457, 3457, 3537, 3537, 3457, 3457, 3457, 3457, 3457, 3457,
-     3538, 3457, 3457, 3538, 3538, 3538, 3457, 3457, 3457, 3457,
-     3457, 3457, 3539, 3457, 3457, 3539, 3539, 3539, 3539, 3457,
-     3457,  303,  303, 3457, 3457, 3457, 3540, 3457, 3457, 3540,
-     3540, 3457, 3457,  303,  373,  373, 3457, 3457, 3457, 3541,
-     3457, 3457, 3541, 3541, 3541, 3457, 3457,  373,  373, 3457,
-     3457, 3457, 3542, 3457, 3457, 3542, 3542, 3457, 3457, 3457,
-     3457, 3457, 3457, 3543, 3457, 3457, 3543, 3543, 3457, 3457,
-
-      373,  373, 3457, 3457, 3457, 3544, 3457, 3457, 3544, 3544,
-     3544, 3457, 3457,  373,  373, 3457, 3457, 3457, 3545, 3457,
-     3457, 3545, 3545, 3545, 3545, 3545, 3457, 3457,  303,  392,
-      303, 3457, 3457, 3457, 3546, 3457, 3457, 3546, 3457, 3457,
-     3457, 3457, 3457, 3457, 3547, 3457, 3457, 3547, 3457, 3457,
-      303,  303, 3457, 3457, 3457, 3548, 3457, 3457, 3548, 3548,
-     3457, 3457, 3457, 3457, 3457, 3457, 3549, 3457, 3457, 3549,
-     3549, 3457, 3457, 3457, 3457, 3550, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3551, 3551, 3552, 3457, 3457, 3457, 3457, 3457, 3457,
-
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3553, 3553,
-     3554, 3457, 3555, 3555, 3555, 3555, 3457, 3556, 3457, 3457,
-     3557, 3557, 3557, 3557, 3557, 3557, 3557, 3557, 3557, 3558,
-     3457, 3559, 3559, 3559, 3559, 3560, 3457, 3561, 3561, 3561,
-     3562, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3563, 3563, 3563, 3563, 3563, 3564, 3457, 3457, 3565, 3565,
-     3565, 3565, 3566, 3457, 3567, 3567, 3567, 3568, 3457, 3569,
-     3569, 3569, 3570, 3457, 3571, 3571, 3571, 3571, 3571, 3571,
-
-     3571, 3572, 3457, 3457, 3573, 3573, 3574, 3457, 3575, 3575,
-     3575, 3575, 3576, 3457, 3577, 3577, 3577, 3577, 3577, 3577,
-     3577, 3577, 3577, 3577, 3577, 3577, 3577, 3577, 3577, 3577,
-     3577, 3578, 3457, 3579, 3579, 3579, 3579, 3579, 3579, 3579,
-     3579, 3580, 3457, 3581, 3581, 3581, 3581, 3581, 3581, 3581,
-     3581, 3582, 3457, 3583, 3583, 3583, 3584, 3457, 3585, 3585,
-     3585, 3585, 3586, 3457, 3587, 3587, 3587, 3587, 3587, 3587,
-     3588, 3457, 3589, 3589, 3589, 3589, 3590, 3457, 3457, 3591,
-     3591, 3591, 3591, 3591, 3592, 3457, 3593, 3593, 3593, 3594,
-     3457, 3595, 3595, 3595, 3596, 3457, 3597, 3597, 3597, 3597,
-
-     3598, 3457, 3599, 3599, 3599, 3599, 3599, 3599, 3600, 3457,
-     3457, 3601, 3601, 3602, 3457, 3603, 3603, 3604, 3457, 3605,
-     3605, 3605, 3606, 3457, 3607, 3607, 3607, 3608, 3609, 3457,
-     3609, 3457, 3457, 3457, 3610, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3611, 3612, 3612, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3613, 3614, 3614, 3615, 3457, 3457,
-     3615, 3457, 3616, 3616, 3457, 3617, 3457, 3457, 3617, 3617,
-     3617, 3617, 3617, 3617, 3618, 3618, 3619, 3619, 3619, 3620,
-
-     3620, 3457, 3457, 3621, 3622, 3622, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3623, 3457, 3457, 3623, 3623, 3624, 3624, 3457, 3625, 3457,
-     3457, 3625, 3626, 3626, 3627, 3627, 3628, 3628, 3629, 3629,
-     3630, 3630, 3631, 3631, 3631, 3457, 3457, 3631, 3631, 3631,
-     3632, 3632, 3457, 3457, 3633, 3634, 3634, 3635, 3457, 3457,
-     3457, 3457, 3636, 3636, 3637, 3637, 3457, 3457, 3637, 3457,
-     3457, 3637, 3637, 3637, 3637, 3637, 3637, 3637, 3637, 3637,
-     3637, 3637, 3638, 3638, 3457, 3457, 3457, 3457, 3639, 3639,
-     3639, 3639, 3639, 3640, 3640, 3641, 3641, 3641, 3457, 3457,
-
-     3641, 3641, 3641, 3642, 3642, 3643, 3457, 3457, 3644, 3644,
-     3645, 3457, 3457, 3645, 3646, 3646, 3647, 3457, 3457, 3647,
-     3647, 3647, 3648, 3648, 3649, 3649, 3649, 3650, 3650, 3457,
-     3651, 3651, 3651, 3651, 3652, 3652, 3653, 3457, 3457, 3654,
-     3654, 3655, 3655, 3656, 3656, 3657, 3657, 3657, 3658, 3658,
-     3659, 3659, 3659, 3659, 3659, 3660, 3660, 3457, 3661, 3662,
-     3662, 3457, 3457, 3663, 3663, 3457, 3457, 3664, 3665, 3665,
-     3457, 3457, 3666, 3667, 3667, 3668, 3457, 3457, 3668, 3457,
-     3457, 3669, 3457, 3457, 3457, 3457, 3457, 3457, 3670, 3457,
-     3671, 3457, 3671, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3672, 3457, 3673, 3457, 3673, 3674,
-     3457, 3457, 3457, 3674, 3457, 3457, 3675, 3457, 3675, 3676,
-     3457, 3457, 3457, 3457, 3457, 3676, 3457, 3457, 3676, 3676,
-     3676, 3457, 3677, 3457, 3677, 3678, 3678, 3678, 3457, 3679,
-     3457, 3679, 3457, 3457, 3457, 3680, 3457, 3681, 3457, 3681,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3682, 3457, 3457, 3457, 3682, 3682, 3457,
-     3683, 3457, 3683, 3457, 3684, 3457, 3457, 3457, 3684, 3457,
-
-     3685, 3457, 3685, 3686, 3686, 3457, 3687, 3457, 3687, 3688,
-     3688, 3457, 3689, 3457, 3689, 3690, 3690, 3690, 3457, 3457,
-     3457, 3690, 3690, 3690, 3457, 3691, 3457, 3691, 3457, 3457,
-     3692, 3457, 3693, 3457, 3693, 3694, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3695, 3457, 3695, 3696, 3696, 3696, 3696,
-     3457, 3457, 3457, 3696, 3457, 3457, 3457, 3457, 3457, 3696,
-     3696, 3696, 3696, 3696, 3696, 3696, 3696, 3696, 3696, 3457,
-     3697, 3457, 3697, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3698, 3698, 3698, 3698, 3457, 3699, 3457, 3699, 3700,
-     3700, 3700, 3700, 3457, 3457, 3457, 3457, 3457, 3700, 3700,
-
-     3457, 3701, 3457, 3701, 3702, 3457, 3457, 3457, 3457, 3703,
-     3457, 3703, 3704, 3457, 3457, 3457, 3704, 3457, 3705, 3457,
-     3705, 3706, 3457, 3457, 3457, 3706, 3706, 3706, 3457, 3707,
-     3457, 3707, 3457, 3457, 3457, 3457, 3708, 3457, 3709, 3457,
-     3709, 3457, 3457, 3457, 3710, 3710, 3457, 3457, 3710, 3457,
-     3711, 3457, 3711, 3712, 3457, 3457, 3457, 3457, 3713, 3457,
-     3713, 3457, 3457, 3457, 3457, 3457, 3714, 3457, 3714, 3457,
-     3457, 3715, 3715, 3457, 3457, 3457, 3716, 3457, 3716, 3717,
-     3717, 3717, 3717, 3717, 3457, 3718, 3457, 3718, 3457, 3719,
-     3457, 3720, 3457, 3720, 3457, 3457, 3457, 3457, 3721, 3457,
-
-     3721, 3457, 3457, 3457, 3722, 3457, 3723, 3457, 3723, 3457,
-     3457, 3457, 3724, 3457, 3725, 3457, 3725, 3726, 3727, 3457,
-     3457, 3457, 3457, 3457, 3728, 3729, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3730, 3457,
-     3457, 3731, 3457, 3732, 3733, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3733, 3457, 3457, 3733, 3734, 3735, 3457,
-     3457, 3735, 3736, 3737, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3738,
-
-     3738, 3457, 3457, 3739, 3457, 3740, 3740, 3741, 3457, 3457,
-     3742, 3743, 3457, 3457, 3744, 3745, 3746, 3746, 3457, 3457,
-     3746, 3746, 3746, 3747, 3457, 3457, 3457, 3457, 3748, 3457,
-     3457, 3749, 3750, 3750, 3750, 3750, 3457, 3457, 3457, 3457,
-     3457, 3750, 3750, 3750, 3750, 3750, 3750, 3750, 3750, 3750,
-     3750, 3750, 3751, 3457, 3457, 3457, 3752, 3752, 3752, 3752,
-     3753, 3754, 3754, 3754, 3754, 3457, 3457, 3457, 3754, 3754,
-     3755, 3756, 3757, 3758, 3758, 3759, 3760, 3760, 3760, 3760,
-     3761, 3457, 3457, 3457, 3457, 3457, 3457, 3762, 3763, 3457,
-     3457, 3457, 3457, 3764, 3764, 3457, 3457, 3457, 3764, 3765,
-
-     3766, 3767, 3457, 3457, 3457, 3457, 3457, 3457, 3768, 3457,
-     3457, 3457, 3769, 3769, 3457, 3457, 3457, 3770, 3771, 3457,
-     3457, 3771, 3771, 3771, 3772, 3457, 3773, 3774, 3775, 3776,
-     3777, 3778, 3779, 3780, 3781, 3781, 3457, 3781, 3457, 3457,
-     3457, 3782, 3783, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3784, 3457, 3457,
-     3457, 3785, 3457, 3786, 3787, 3457, 3457, 3457, 3787, 3457,
-     3457, 3457, 3787, 3788, 3789, 3457, 3457, 3457, 3457, 3457,
-
-     3790, 3791, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3792, 3457, 3457, 3457, 3457,
-     3457, 3793, 3457, 3794, 3794, 3795, 3457, 3457, 3457, 3796,
-     3797, 3457, 3457, 3457, 3798, 3799, 3800, 3800, 3457, 3457,
-     3457, 3457, 3457, 3800, 3457, 3457, 3800, 3801, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3802, 3803,
-     3457, 3457, 3803, 3803, 3457, 3457, 3457, 3803, 3803, 3457,
-     3457, 3803, 3803, 3803, 3803, 3803, 3803, 3803, 3803, 3804,
-     3457, 3457, 3805, 3805, 3805, 3806, 3807, 3457, 3457, 3807,
-     3807, 3457, 3457, 3807, 3808, 3809, 3810, 3811, 3811, 3812,
-
-     3813, 3813, 3813, 3457, 3457, 3813, 3814, 3815, 3816, 3457,
-     3817, 3817, 3817, 3818, 3819, 3820, 3821, 3822, 3822, 3823,
-     3824, 3457, 3457, 3457, 3824, 3824, 3824, 3825, 3457, 3457,
-     3457, 3826, 3827, 3457, 3457, 3828, 3457, 3457, 3829, 3830,
-     3831, 3831, 3457, 3457, 3832, 3833, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3834, 3835, 3457, 3836, 3837,
-     3837, 3837, 3838, 3839, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3840, 3841, 3457, 3457, 3457,
-
-     3457, 3457, 3457, 3457, 3457, 3457, 3842, 3457, 3457, 3457,
-     3843, 3457, 3844, 3457, 3457, 3845, 3846, 3847, 3457, 3457,
-     3848, 3849, 3849, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3849, 3457, 3457, 3457, 3457, 3850, 3851, 3457, 3457,
-     3457, 3457, 3457, 3851, 3851, 3851, 3457, 3457, 3457, 3457,
-     3457, 3851, 3851, 3851, 3851, 3457, 3457, 3851, 3851, 3852,
-     3457, 3457, 3457, 3457, 3457, 3853, 3457, 3457, 3854, 3855,
-     3457, 3457, 3457, 3457, 3457, 3855, 3457, 3457, 3457, 3855,
-     3457, 3457, 3856, 3857, 3858, 3858, 3859, 3860, 3860, 3860,
-     3457, 3457, 3457, 3860, 3457, 3457, 3861, 3862, 3457, 3457,
-
-     3457, 3457, 3457, 3863, 3864, 3865, 3866, 3867, 3457, 3457,
-     3457, 3457, 3868, 3869, 3869, 3869, 3869, 3870, 3457, 3457,
-     3457, 3457, 3871, 3872, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3873, 3874, 3875, 3875, 3457, 3457, 3457, 3876,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3877, 3878, 3457, 3457,
-     3457, 3879, 3457, 3457, 3879, 3880, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3881, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-
-     3882, 3883, 3457, 3457, 3457, 3884, 3457, 3457, 3457, 3885,
-     3886, 3457, 3457, 3457, 3457, 3457, 3887, 3888, 3888, 3457,
-     3457, 3457, 3457, 3457, 3888, 3457, 3889, 3890, 3457, 3457,
-     3457, 3890, 3890, 3890, 3457, 3457, 3457, 3457, 3457, 3890,
-     3890, 3890, 3457, 3457, 3457, 3890, 3890, 3891, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3892, 3893, 3457, 3457,
-     3457, 3893, 3893, 3894, 3895, 3896, 3457, 3457, 3897, 3898,
-     3457, 3457, 3898, 3898, 3457, 3457, 3898, 3899, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3900, 3901, 3902,
-     3903, 3904, 3457, 3457, 3457, 3457, 3457, 3457, 3905, 3906,
-
-     3906, 3906, 3906, 3907, 3457, 3908, 3909, 3910, 3911, 3912,
-     3912, 3457, 3457, 3457, 3457, 3913, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3914, 3915,
-     3457, 3916, 3457, 3457, 3457, 3916, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3917, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3918, 3919, 3457, 3457, 3457,
-     3457, 3920, 3921, 3922, 3923, 3924, 3924, 3457, 3457, 3457,
-     3457, 3924, 3457, 3925, 3926, 3926, 3926, 3926, 3457, 3457,
-
-     3457, 3926, 3926, 3926, 3926, 3457, 3457, 3927, 3457, 3457,
-     3457, 3928, 3929, 3929, 3929, 3930, 3457, 3457, 3931, 3457,
-     3457, 3457, 3932, 3933, 3457, 3457, 3457, 3933, 3933, 3457,
-     3457, 3457, 3457, 3933, 3934, 3457, 3935, 3936, 3937, 3938,
-     3939, 3940, 3457, 3457, 3941, 3941, 3941, 3942, 3457, 3943,
-     3457, 3457, 3944, 3945, 3946, 3946, 3457, 3947, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3948, 3457, 3457, 3949, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3950, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-
-     3457, 3457, 3951, 3952, 3457, 3953, 3457, 3457, 3457, 3457,
-     3954, 3955, 3955, 3457, 3457, 3457, 3457, 3955, 3457, 3956,
-     3957, 3957, 3957, 3957, 3957, 3457, 3457, 3957, 3957, 3957,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3958, 3958, 3958,
-     3959, 3457, 3457, 3960, 3457, 3457, 3961, 3961, 3961, 3457,
-     3457, 3457, 3457, 3961, 3962, 3457, 3963, 3457, 3457, 3457,
-     3457, 3938, 3939, 3940, 3457, 3457, 3457, 3457, 3457, 3941,
-     3941, 3457, 3457, 3457, 3943, 3944, 3945, 3946, 3946, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3948, 3457,
-     3457, 3457, 3949, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-
-     3457, 3457, 3457, 3950, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3951, 3952, 3457, 3953, 3457, 3457, 3457, 3457, 3457, 3955,
-     3955, 3457, 3457, 3457, 3457, 3956, 3957, 3957, 3957, 3957,
-     3957, 3457, 3457, 3457, 3957, 3457, 3457, 3957, 3457, 3457,
-     3457, 3457, 3958, 3958, 3457, 3457, 3959, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3961, 3961, 3961, 3457, 3457,
-     3457, 3457, 3962, 3963, 3457, 3457, 3457, 3457, 3457, 3939,
-     3940, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3944, 3945, 3946, 3946, 3457, 3457, 3457, 3457, 3457, 3457,
-
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3949, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3950,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3951, 3952, 3457, 3953, 3955,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3957, 3957, 3957,
-     3457, 3457, 3957, 3957, 3457, 3457, 3457, 3957, 3457, 3457,
-     3457, 3457, 3958, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3961, 3961, 3961, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3939, 3940, 3457, 3457,
-     3457, 3457, 3457, 3457, 3944, 3945, 3946, 3946, 3457, 3457,
-
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3949, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3950, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3952, 3457, 3457, 3457, 3457, 3955, 3457, 3457, 3457,
-     3957, 3957, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3957,
-     3957, 3457, 3457, 3457, 3457, 3958, 3457, 3457, 3457, 3457,
-     3457, 3457, 3961, 3457, 3457, 3961, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3939, 3940,
-     3457, 3457, 3457, 3457, 3457, 3457, 3945, 3946, 3946, 3946,
-
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3950, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3952, 3457, 3457, 3457, 3457, 3457, 3457, 3955, 3957, 3957,
-     3457, 3457, 3457, 3457, 3457, 3457, 3957, 3957, 3457, 3457,
-     3457, 3457, 3958, 3961, 3457, 3457, 3457, 3961, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3940, 3457, 3457, 3457, 3457, 3945,
-     3946, 3946, 3946, 3964, 3965, 3457, 3457, 3457, 3457, 3457,
-
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3950, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3955, 3957, 3957,
-     3457, 3457, 3957, 3457, 3457, 3457, 3457, 3958, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3940, 3457, 3457, 3457, 3457, 3945,
-     3946, 3966, 3967, 3964, 3965, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3955, 3957, 3957,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3958, 3457, 3457,
-
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3945, 3966, 3946, 3968, 3967, 3969, 3946, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3955, 3957, 3957, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3958, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3945, 3968, 3457, 3969,
-     3946, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-
-     3457, 3457, 3457, 3945, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3945,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3945, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3945, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3945,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3945, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3945, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3945, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3945, 3945, 3457, 3457, 3457, 3457, 3457, 3457, 3945,
-     3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945,
-     3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945,
-     3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945,
-
-     3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945,
-     3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945,
-     3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945,
-     3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945,
-     3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945,
-     3945, 3945, 3945, 3945, 3945, 3457,    0, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457
+     3469, 3469, 3470, 3470, 3470, 3470, 3471, 3471, 3472, 3472,
+     3473, 3473, 3474, 3474, 3474, 3474, 3475, 3475, 3469, 3469,
+     3476, 3476, 3477, 3477, 3477, 3477, 3469, 3469, 3477, 3477,
+     3477, 3477, 3469, 3469, 3477, 3477, 3469, 3469, 3477, 3477,
+     3477, 3477, 3478, 3478, 3479, 3479, 3469, 3469, 3479, 3479,
+     3479, 3479, 3480, 3480, 3474, 3474, 3481, 3481, 3482, 3482,
+     3483, 3483, 3484, 3484, 3485, 3485, 3486, 3486, 3486, 3486,
+     3469, 3469, 3486, 3486, 3486, 3486, 3469, 3469, 3486, 3486,
+     3486, 3486, 3469, 3469, 3486, 3486, 3469, 3469, 3486, 3486,
+     3486, 3486, 3469, 3469, 3486, 3486, 3469, 3469, 3486, 3486,
+
+     3486, 3486, 3487, 3487, 3488, 3488, 3469, 3469, 3488, 3488,
+     3488, 3488, 3489, 3489, 3490, 3490, 3491, 3491, 3492, 3492,
+     3493, 3493, 3494, 3494, 3469, 3469, 3494, 3494, 3494, 3494,
+     3495, 3495, 3496, 3496, 3469, 3469, 3496, 3496, 3496, 3496,
+     3497, 3497, 3498, 3498, 3499, 3499, 3500, 3500, 3468,  149,
+     3501, 3501, 3469, 3469, 3501, 3501, 3501, 3501, 3502, 3502,
+     3503, 3503, 3504, 3504, 3505, 3505, 3506, 3506, 3507, 3507,
+     3508, 3508, 3509, 3509, 3510, 3510, 3511, 3511, 3469, 3469,
+     3511, 3511, 3511, 3511, 3512, 3512, 3513, 3513, 3469, 3469,
+     3513, 3513, 3513, 3513, 3514, 3514, 3515, 3515, 3469, 3469,
+
+     3515, 3515, 3515, 3515, 3516, 3516, 3517, 3517, 3518, 3518,
+     3519, 3519, 3469, 3469, 3519, 3519, 3519, 3519, 3520, 3520,
+     3521, 3521, 3469, 3469, 3521, 3521, 3521, 3521, 3522, 3522,
+     3523, 3523, 3469, 3469, 3523, 3523, 3523, 3523, 3524, 3524,
+     3525, 3525, 3526, 3526, 3527, 3527, 3469, 3469, 3527, 3527,
+     3527, 3527, 3528, 3528, 3529, 3529, 3530, 3530, 3531, 3531,
+     3469, 3469, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3532, 3468, 3468, 3532, 3468, 3468, 3468,
+
+      300,  300,  302,  300,  303,  303, 3468, 3468, 3468, 3533,
+     3468, 3468, 3533, 3468, 3468,  304,  303, 3468, 3468, 3468,
+     3534, 3468, 3468, 3534, 3534, 3534, 3468, 3468, 3468, 3468,
+     3468, 3535, 3468, 3468, 3535, 3535, 3535, 3535, 3535, 3468,
+     3468, 3468, 3468, 3468, 3468, 3536, 3468, 3468, 3536, 3536,
+     3536, 3468, 3468, 3468, 3468, 3468, 3468, 3537, 3468, 3468,
+     3537, 3537, 3468, 3468, 3468,  365,  303,  303,  304,  369,
+      368,  368,  368,  368,  369,  375,  373,  373, 3468, 3468,
+     3468, 3538, 3468, 3468, 3538, 3538, 3538, 3538, 3468, 3468,
+      303,  303,  303, 3468, 3468, 3468, 3539, 3468, 3468, 3539,
+
+     3539, 3468, 3468, 3468, 3468, 3468, 3468, 3540, 3468, 3468,
+     3540, 3540, 3468, 3468, 3468, 3468, 3468, 3468, 3541, 3468,
+     3468, 3541, 3541, 3541, 3541, 3541, 3468, 3468,  392,  392,
+      303, 3468, 3468, 3468, 3542, 3468, 3468, 3542, 3542, 3542,
+     3542, 3468, 3468,  303,  303, 3468, 3468, 3468, 3543, 3468,
+     3468, 3543, 3468, 3468, 3468, 3468, 3468, 3468, 3544, 3468,
+     3468, 3544, 3544, 3544, 3468, 3468, 3468, 3468, 3468, 3468,
+     3545, 3468, 3468, 3545, 3545, 3545, 3545, 3545, 3545, 3545,
+     3545, 3545, 3468, 3468,  303,  303, 3468, 3468, 3468, 3546,
+     3468, 3468, 3546, 3546, 3546, 3546, 3546, 3546, 3468, 3468,
+
+     3468, 3468, 3468, 3468, 3547, 3468, 3468, 3547, 3547, 3547,
+     3547, 3547, 3547, 3547, 3468, 3468, 3468, 3468, 3468, 3468,
+     3548, 3468, 3468, 3548, 3548, 3468, 3468, 3468, 3468, 3468,
+     3468, 3549, 3468, 3468, 3549, 3549, 3549, 3468, 3468, 3468,
+     3468, 3468, 3468, 3550, 3468, 3468, 3550, 3550, 3550, 3550,
+     3468, 3468,  303,  303, 3468, 3468, 3468, 3551, 3468, 3468,
+     3551, 3551, 3468, 3468,  303,  373,  373, 3468, 3468, 3468,
+     3552, 3468, 3468, 3552, 3552, 3552, 3468, 3468,  373,  373,
+     3468, 3468, 3468, 3553, 3468, 3468, 3553, 3553, 3468, 3468,
+     3468, 3468, 3468, 3468, 3554, 3468, 3468, 3554, 3554, 3468,
+
+     3468,  373,  373, 3468, 3468, 3468, 3555, 3468, 3468, 3555,
+     3555, 3555, 3468, 3468,  373,  373, 3468, 3468, 3468, 3556,
+     3468, 3468, 3556, 3556, 3556, 3556, 3556, 3468, 3468,  303,
+      392,  303, 3468, 3468, 3468, 3557, 3468, 3468, 3557, 3468,
+     3468, 3468, 3468, 3468, 3468, 3558, 3468, 3468, 3558, 3468,
+     3468,  303,  303, 3468, 3468, 3468, 3559, 3468, 3468, 3559,
+     3559, 3468, 3468, 3468, 3468, 3468, 3468, 3560, 3468, 3468,
+     3560, 3560, 3468, 3468, 3468, 3468, 3561, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3562, 3562, 3563, 3468, 3468, 3468, 3468, 3468,
+
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3564,
+     3564, 3565, 3468, 3566, 3566, 3566, 3566, 3468, 3567, 3468,
+     3468, 3568, 3568, 3568, 3568, 3568, 3568, 3568, 3568, 3568,
+     3569, 3468, 3570, 3570, 3570, 3570, 3571, 3468, 3572, 3572,
+     3572, 3573, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3574, 3574, 3574, 3574, 3574, 3575, 3468, 3468, 3576,
+     3576, 3576, 3577, 3468, 3578, 3578, 3578, 3579, 3468, 3580,
+     3580, 3580, 3580, 3580, 3580, 3580, 3581, 3468, 3468, 3582,
+
+     3582, 3582, 3582, 3582, 3583, 3468, 3584, 3584, 3585, 3468,
+     3586, 3586, 3586, 3586, 3587, 3468, 3588, 3588, 3588, 3588,
+     3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588,
+     3588, 3588, 3588, 3589, 3468, 3590, 3590, 3590, 3590, 3590,
+     3590, 3590, 3590, 3591, 3468, 3592, 3592, 3592, 3592, 3592,
+     3592, 3592, 3592, 3593, 3468, 3594, 3594, 3594, 3595, 3468,
+     3596, 3596, 3596, 3596, 3597, 3468, 3598, 3598, 3598, 3598,
+     3598, 3598, 3599, 3468, 3600, 3600, 3600, 3600, 3601, 3468,
+     3468, 3602, 3602, 3602, 3602, 3602, 3603, 3468, 3604, 3604,
+     3604, 3605, 3468, 3606, 3606, 3606, 3607, 3468, 3608, 3608,
+
+     3608, 3608, 3609, 3468, 3610, 3610, 3610, 3610, 3610, 3610,
+     3611, 3468, 3468, 3612, 3612, 3613, 3468, 3614, 3614, 3615,
+     3468, 3616, 3616, 3616, 3617, 3468, 3618, 3618, 3618, 3619,
+     3620, 3468, 3620, 3468, 3468, 3468, 3621, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3622, 3623, 3623, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3624, 3625, 3625, 3626,
+     3468, 3468, 3626, 3468, 3627, 3627, 3468, 3628, 3468, 3468,
+     3628, 3628, 3628, 3628, 3628, 3628, 3629, 3629, 3630, 3630,
+
+     3630, 3631, 3631, 3468, 3468, 3632, 3633, 3633, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3634, 3468, 3468, 3634, 3634, 3635, 3635, 3468,
+     3636, 3636, 3637, 3637, 3638, 3638, 3639, 3639, 3640, 3640,
+     3640, 3468, 3468, 3640, 3640, 3640, 3641, 3641, 3468, 3468,
+     3642, 3642, 3468, 3468, 3642, 3643, 3643, 3644, 3645, 3645,
+     3646, 3468, 3468, 3468, 3468, 3647, 3647, 3648, 3648, 3468,
+     3468, 3648, 3468, 3468, 3648, 3648, 3648, 3648, 3648, 3648,
+     3648, 3648, 3648, 3648, 3648, 3649, 3649, 3468, 3468, 3468,
+     3468, 3650, 3650, 3650, 3650, 3650, 3651, 3651, 3652, 3652,
+
+     3652, 3468, 3468, 3652, 3652, 3652, 3653, 3653, 3654, 3468,
+     3468, 3655, 3655, 3656, 3468, 3468, 3656, 3657, 3657, 3658,
+     3468, 3468, 3658, 3658, 3658, 3659, 3659, 3660, 3660, 3660,
+     3661, 3661, 3468, 3662, 3662, 3662, 3662, 3663, 3663, 3664,
+     3468, 3468, 3665, 3665, 3666, 3666, 3667, 3667, 3668, 3668,
+     3668, 3669, 3669, 3670, 3670, 3670, 3670, 3670, 3671, 3671,
+     3468, 3672, 3673, 3673, 3468, 3468, 3674, 3674, 3468, 3468,
+     3675, 3676, 3676, 3468, 3468, 3677, 3678, 3678, 3679, 3468,
+     3468, 3679, 3468, 3468, 3680, 3468, 3468, 3468, 3468, 3468,
+     3468, 3681, 3468, 3682, 3468, 3682, 3468, 3468, 3468, 3468,
+
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3683, 3468, 3684,
+     3468, 3684, 3685, 3468, 3468, 3468, 3685, 3468, 3468, 3686,
+     3468, 3686, 3687, 3468, 3468, 3468, 3468, 3468, 3687, 3468,
+     3468, 3687, 3687, 3687, 3468, 3688, 3468, 3688, 3689, 3689,
+     3689, 3468, 3690, 3468, 3690, 3468, 3468, 3468, 3691, 3468,
+     3692, 3468, 3692, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3693, 3468, 3468, 3468,
+     3693, 3693, 3468, 3694, 3468, 3694, 3468, 3695, 3695, 3468,
+
+     3696, 3468, 3696, 3697, 3697, 3468, 3698, 3468, 3698, 3699,
+     3699, 3699, 3468, 3468, 3468, 3699, 3699, 3699, 3468, 3700,
+     3468, 3700, 3468, 3468, 3701, 3701, 3468, 3468, 3468, 3701,
+     3468, 3702, 3468, 3702, 3703, 3468, 3704, 3468, 3704, 3705,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3706, 3468, 3706,
+     3707, 3707, 3707, 3707, 3468, 3468, 3468, 3707, 3468, 3468,
+     3468, 3468, 3468, 3707, 3707, 3707, 3707, 3707, 3707, 3707,
+     3707, 3707, 3707, 3468, 3708, 3468, 3708, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3709, 3709, 3709, 3709, 3468,
+     3710, 3468, 3710, 3711, 3711, 3711, 3711, 3468, 3468, 3468,
+
+     3468, 3468, 3711, 3711, 3468, 3712, 3468, 3712, 3713, 3468,
+     3468, 3468, 3468, 3714, 3468, 3714, 3715, 3468, 3468, 3468,
+     3715, 3468, 3716, 3468, 3716, 3717, 3468, 3468, 3468, 3717,
+     3717, 3717, 3468, 3718, 3468, 3718, 3468, 3468, 3468, 3468,
+     3719, 3468, 3720, 3468, 3720, 3468, 3468, 3468, 3721, 3721,
+     3468, 3468, 3721, 3468, 3722, 3468, 3722, 3723, 3468, 3468,
+     3468, 3468, 3724, 3468, 3724, 3468, 3468, 3468, 3468, 3468,
+     3725, 3468, 3725, 3468, 3468, 3726, 3726, 3468, 3468, 3468,
+     3727, 3468, 3727, 3728, 3728, 3728, 3728, 3728, 3468, 3729,
+     3468, 3729, 3468, 3730, 3468, 3731, 3468, 3731, 3468, 3468,
+
+     3468, 3468, 3732, 3468, 3732, 3468, 3468, 3468, 3733, 3468,
+     3734, 3468, 3734, 3468, 3468, 3468, 3735, 3468, 3736, 3468,
+     3736, 3737, 3738, 3468, 3468, 3468, 3468, 3468, 3739, 3740,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3741, 3468, 3468, 3742, 3468, 3743, 3744, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3744, 3468, 3468,
+     3744, 3745, 3746, 3468, 3468, 3746, 3747, 3748, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+
+     3468, 3468, 3468, 3749, 3749, 3468, 3468, 3750, 3468, 3468,
+     3468, 3751, 3752, 3468, 3468, 3753, 3754, 3755, 3755, 3468,
+     3468, 3755, 3755, 3755, 3756, 3468, 3468, 3757, 3757, 3757,
+     3758, 3468, 3468, 3759, 3468, 3468, 3760, 3761, 3761, 3761,
+     3761, 3468, 3468, 3468, 3468, 3468, 3761, 3761, 3761, 3761,
+     3761, 3761, 3761, 3761, 3761, 3761, 3761, 3762, 3468, 3468,
+     3468, 3763, 3763, 3763, 3763, 3764, 3765, 3765, 3765, 3765,
+     3468, 3468, 3468, 3765, 3765, 3766, 3767, 3768, 3769, 3769,
+     3770, 3771, 3771, 3771, 3771, 3772, 3468, 3468, 3468, 3468,
+     3468, 3468, 3773, 3774, 3468, 3468, 3468, 3468, 3775, 3775,
+
+     3468, 3468, 3468, 3775, 3776, 3777, 3778, 3468, 3468, 3468,
+     3468, 3468, 3468, 3779, 3468, 3468, 3468, 3780, 3780, 3468,
+     3468, 3468, 3781, 3782, 3468, 3468, 3782, 3782, 3782, 3783,
+     3468, 3784, 3785, 3786, 3787, 3788, 3789, 3790, 3791, 3792,
+     3792, 3468, 3792, 3468, 3468, 3468, 3793, 3794, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3795, 3468, 3468, 3468, 3796, 3468, 3797, 3798,
+     3468, 3468, 3468, 3798, 3468, 3468, 3468, 3798, 3799, 3800,
+
+     3468, 3468, 3468, 3468, 3468, 3801, 3802, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3803, 3468, 3468, 3468, 3468, 3468, 3804, 3468, 3468, 3468,
+     3468, 3805, 3806, 3468, 3468, 3468, 3807, 3808, 3809, 3809,
+     3468, 3468, 3468, 3468, 3468, 3809, 3468, 3468, 3809, 3810,
+     3468, 3468, 3811, 3811, 3811, 3812, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3813, 3814, 3468, 3468, 3814, 3814,
+     3468, 3468, 3468, 3814, 3814, 3468, 3468, 3814, 3814, 3814,
+     3814, 3814, 3814, 3814, 3814, 3815, 3468, 3468, 3816, 3816,
+     3816, 3817, 3818, 3468, 3468, 3818, 3818, 3468, 3468, 3818,
+
+     3819, 3820, 3821, 3822, 3822, 3823, 3824, 3824, 3824, 3468,
+     3468, 3824, 3825, 3826, 3827, 3468, 3828, 3828, 3828, 3829,
+     3830, 3831, 3832, 3833, 3833, 3834, 3835, 3468, 3468, 3468,
+     3835, 3835, 3835, 3836, 3468, 3468, 3468, 3837, 3838, 3468,
+     3468, 3839, 3468, 3468, 3840, 3841, 3842, 3842, 3468, 3468,
+     3843, 3844, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3845, 3846, 3468, 3847, 3848, 3848, 3848, 3849, 3850,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+
+     3468, 3851, 3852, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3853, 3468, 3468, 3468, 3854, 3468, 3855, 3856,
+     3468, 3468, 3857, 3858, 3858, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3858, 3468, 3468, 3468, 3468, 3468, 3468,
+     3859, 3468, 3468, 3860, 3861, 3862, 3468, 3468, 3468, 3468,
+     3468, 3862, 3862, 3862, 3468, 3468, 3468, 3468, 3468, 3862,
+     3862, 3862, 3862, 3468, 3468, 3862, 3862, 3863, 3468, 3468,
+     3468, 3468, 3468, 3864, 3468, 3468, 3865, 3866, 3468, 3468,
+     3468, 3468, 3468, 3866, 3468, 3468, 3468, 3866, 3468, 3468,
+     3867, 3868, 3869, 3869, 3870, 3871, 3871, 3871, 3468, 3468,
+
+     3468, 3871, 3468, 3468, 3872, 3873, 3468, 3468, 3468, 3468,
+     3468, 3874, 3875, 3876, 3877, 3878, 3468, 3468, 3468, 3468,
+     3879, 3880, 3880, 3880, 3880, 3881, 3468, 3468, 3468, 3468,
+     3882, 3883, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3884, 3885, 3886, 3886, 3468, 3468, 3468, 3887, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3888, 3889, 3468, 3468, 3468, 3890,
+     3468, 3468, 3890, 3891, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3892, 3468, 3468, 3468,
+
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3893, 3894,
+     3468, 3895, 3468, 3468, 3468, 3468, 3468, 3896, 3897, 3897,
+     3468, 3468, 3468, 3468, 3468, 3897, 3468, 3468, 3468, 3468,
+     3468, 3468, 3898, 3468, 3468, 3468, 3899, 3900, 3901, 3468,
+     3468, 3468, 3901, 3901, 3901, 3468, 3468, 3468, 3468, 3468,
+     3901, 3901, 3901, 3468, 3468, 3468, 3901, 3901, 3902, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3903, 3904, 3468,
+     3468, 3468, 3904, 3904, 3905, 3906, 3907, 3468, 3468, 3908,
+     3909, 3468, 3468, 3909, 3909, 3468, 3468, 3909, 3910, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3911, 3912,
+
+     3913, 3914, 3915, 3468, 3468, 3468, 3468, 3468, 3468, 3916,
+     3917, 3917, 3917, 3917, 3918, 3468, 3919, 3920, 3921, 3922,
+     3923, 3923, 3468, 3468, 3468, 3468, 3924, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3925,
+     3926, 3468, 3927, 3468, 3468, 3468, 3927, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3928, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3929, 3930, 3468, 3931,
+     3932, 3933, 3933, 3468, 3468, 3468, 3468, 3933, 3468, 3468,
+
+     3468, 3468, 3934, 3935, 3936, 3937, 3937, 3937, 3937, 3468,
+     3468, 3468, 3937, 3937, 3937, 3937, 3468, 3468, 3938, 3468,
+     3468, 3468, 3939, 3940, 3940, 3940, 3941, 3468, 3468, 3942,
+     3468, 3468, 3468, 3943, 3944, 3468, 3468, 3468, 3944, 3944,
+     3468, 3468, 3468, 3468, 3944, 3945, 3468, 3946, 3947, 3948,
+     3949, 3950, 3951, 3468, 3468, 3952, 3952, 3952, 3953, 3468,
+     3954, 3468, 3468, 3955, 3956, 3957, 3957, 3468, 3958, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3959, 3468, 3468, 3960, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3961, 3468, 3468,
+
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3962, 3963, 3468, 3468, 3468, 3964, 3965,
+     3965, 3468, 3468, 3468, 3468, 3965, 3468, 3966, 3468, 3468,
+     3967, 3968, 3968, 3968, 3968, 3968, 3468, 3468, 3968, 3968,
+     3968, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3969, 3969,
+     3969, 3970, 3468, 3468, 3971, 3468, 3468, 3972, 3972, 3972,
+     3468, 3468, 3468, 3468, 3972, 3973, 3468, 3974, 3468, 3468,
+     3468, 3468, 3949, 3950, 3951, 3468, 3468, 3468, 3468, 3468,
+     3952, 3952, 3468, 3468, 3468, 3954, 3955, 3956, 3957, 3957,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3959,
+
+     3468, 3468, 3468, 3960, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3961, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3962, 3963, 3468, 3468, 3468, 3468, 3468, 3468, 3965,
+     3965, 3468, 3468, 3468, 3468, 3966, 3967, 3968, 3968, 3968,
+     3968, 3968, 3468, 3468, 3468, 3968, 3468, 3468, 3968, 3468,
+     3468, 3468, 3468, 3969, 3969, 3468, 3468, 3970, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3972, 3972, 3972, 3468,
+     3468, 3468, 3468, 3973, 3974, 3468, 3468, 3468, 3468, 3468,
+     3950, 3951, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+
+     3468, 3955, 3956, 3957, 3957, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3960,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3961, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3962, 3963, 3468, 3965,
+     3468, 3468, 3468, 3468, 3468, 3966, 3468, 3468, 3968, 3968,
+     3968, 3468, 3468, 3968, 3968, 3468, 3468, 3468, 3968, 3468,
+     3468, 3468, 3468, 3969, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3972, 3972, 3972, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3950, 3951, 3468,
+
+     3468, 3468, 3468, 3468, 3468, 3955, 3956, 3957, 3957, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3960, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3961, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3963, 3468, 3468, 3965, 3468, 3468, 3468, 3468,
+     3468, 3968, 3968, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3968, 3968, 3468, 3468, 3468, 3468, 3969, 3468, 3468, 3468,
+     3468, 3468, 3468, 3972, 3468, 3468, 3972, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3950,
+
+     3951, 3468, 3468, 3468, 3468, 3468, 3468, 3956, 3957, 3957,
+     3957, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3961, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3963, 3468, 3468, 3468, 3965, 3468, 3468, 3468, 3968,
+     3968, 3468, 3468, 3468, 3468, 3468, 3468, 3968, 3968, 3468,
+     3468, 3468, 3468, 3969, 3972, 3468, 3468, 3468, 3972, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3951, 3468, 3468, 3468, 3468,
+
+     3956, 3957, 3957, 3957, 3975, 3976, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3961, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3965, 3968,
+     3968, 3468, 3468, 3968, 3468, 3468, 3468, 3468, 3969, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3951, 3468, 3468, 3468, 3468,
+     3956, 3957, 3977, 3978, 3975, 3976, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3965, 3968,
+
+     3968, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3969, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3956, 3977, 3957, 3979, 3978, 3980, 3957,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3965, 3968, 3968, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3969, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3956, 3979, 3468,
+     3980, 3957, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3956, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3956, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3956, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3956,
+
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3956, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3956, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3956, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3956, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3956, 3956, 3468, 3468, 3468, 3468, 3468, 3468,
+     3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956,
+     3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956,
+
+     3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956,
+     3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956,
+     3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956,
+     3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956,
+     3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956,
+     3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956,
+     3956, 3956, 3956, 3956, 3956, 3956, 3468,    0, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468
     } ;
 
-static yyconst flex_int16_t yy_nxt[12668] =
+static yyconst flex_int16_t yy_nxt[12714] =
     {   0,
-     3457,  266,  267,  266,  266,  267,  266,  266,  267,  266,
+     3468,  266,  267,  266,  266,  267,  266,  266,  267,  266,
       266,  267,  266,  271,  267,  271,  277,  268,  274,  277,
-      268,  274, 3457,  269, 3457,  275,  269, 3457,  275,  272,
-      271,  267,  271,  676,  278,  280,  281,  278,  280,  281,
-      282,  283,  721,  282,  283,  676,  272,  287,  288,  677,
-      284,  280,  281,  284,  285,  679,  282,  280,  281,  710,
-      285,  678,  282,  287,  288, 1760,  284,  267,  267,  267,
-      869,  678,  284,  267,  267,  267,  299,  267,  299,  299,
-      267,  299,  870,  290,  299,  267,  299,  697, 1761,  290,
-      751,  289,  300, 1391,  713,  300,  675,  675,  675, 1392,
-
-      301,  675,  675,  675,  675,  675,  675,  289,  291,  292,
+      268,  274, 3468,  269, 3468,  275,  269, 3468,  275,  272,
+      271,  267,  271,  677,  278,  280,  281,  278,  280,  281,
+      282,  283,  722,  282,  283,  677,  272,  287,  288,  678,
+      284,  280,  281,  284,  285,  680,  282,  280,  281,  711,
+      285,  679,  282,  287,  288, 3468,  284,  267,  267,  267,
+      871,  679,  284,  267,  267,  267,  299,  267,  299,  299,
+      267,  299,  872,  290,  299,  267,  299,  698, 1758,  290,
+      752,  289,  300, 1395,  714,  300,  676,  676,  676, 1396,
+
+      301,  676,  676,  676,  676,  676,  676,  289,  291,  292,
       267,  292,  291,  291,  291,  291,  291,  291,  291,  293,
-      291,  291,  291,  708,  291,  295,  291,  296,  291,  299,
-      267,  299,  267,  267,  267,  267,  267,  267,  709,  299,
-      267,  299,  299,  267,  299,  301,  714,  824,  302,  679,
-      825,  302,  948,  291,  291,  300,  679,  679,  300,  299,
-      267,  299,  675,  675,  675,  678,  675,  675,  675,  675,
-      675,  675,  678,  678, 3457,  303,  949,  297,  291,  292,
+      291,  291,  291,  709,  291,  295,  291,  296,  291,  299,
+      267,  299,  267,  267,  267,  267,  267,  267,  710,  299,
+      267,  299,  299,  267,  299,  301,  715,  826,  302,  680,
+      827,  302,  950,  291,  291,  300,  680,  680,  300,  299,
+      267,  299,  676,  676,  676,  679,  676,  676,  676,  676,
+      676,  676,  679,  679, 3468,  303,  951,  297,  291,  292,
       267,  292,  291,  291,  291,  291,  291,  291,  291,  293,
-      291,  291,  291, 1763,  291,  295,  291,  296,  291,  299,
+      291,  291,  291, 1761,  291,  295,  291,  296,  291,  299,
 
-      267,  299,  267,  267,  267,  267,  267,  267,  684,  299,
-      267,  299,  299,  267,  299,  303,  690,  751,  304,  838,
-     1008,  304,  839,  291,  291,  301,  760,  752,  301,  267,
+      267,  299,  267,  267,  267,  267,  267,  267,  685,  299,
+      267,  299,  299,  267,  299,  303,  691,  752,  304,  840,
+     1010,  304,  841,  291,  291,  301,  761,  753,  301,  267,
       267,  267,  267,  267,  267,  299,  267,  299,  299,  267,
-      299,  299,  267,  299, 1009,  305,  875,  297,  305,  679,
-      685,  303,  817,  876,  303,  764,  686,  306,  299,  267,
-      299,  687,  675,  675,  675,  678,  688,  675,  675,  675,
-      675,  675,  675,  818,  306,  307,  308,  267,  308,  307,
+      299,  299,  267,  299, 1011,  305,  877,  297,  305,  680,
+      686,  303,  819,  878,  303,  765,  687,  306,  299,  267,
+      299,  688,  676,  676,  676,  679,  689,  676,  676,  676,
+      676,  676,  676,  820,  306,  307,  308,  267,  308,  307,
       307,  307,  307,  307,  307,  307,  309,  307,  307,  307,
-      738,  307,  311,  307,  312,  307,  315,  267,  315,  315,
+      739,  307,  311,  307,  312,  307,  315,  267,  315,  315,
 
-      267,  315,  267,  267,  267,  739,  267,  267,  267,  315,
-      267,  315,  316,  799,  877,  316, 1764,  800,  304,  734,
-      307,  307,  304,  735,  776,  316,  694,  736,  313,  307,
+      267,  315,  267,  267,  267,  740,  267,  267,  267,  315,
+      267,  315,  316,  794,  879,  316, 1762,  795,  304,  735,
+      307,  307,  304,  736,  777,  316,  695,  737,  313,  307,
       308,  267,  308,  307,  307,  307,  307,  307,  307,  307,
-      309,  307,  307,  307,  679,  307,  311,  307,  312,  307,
-      315,  267,  315,  315,  267,  315,  315,  267,  315, 1765,
-      678,  885,  280,  281,  883,  715,  316,  282, 3457,  317,
-      714,  884,  317,  777,  307,  307,  760,  327,  716,  776,
-      709, 1206,  313,  318,  319,  267,  319,  318,  318,  318,
-      318,  318,  318,  318,  320,  318,  318,  318, 1207,  318,
-
-      322,  318,  323,  318, 1766,  679,  328,  708,  341,  267,
-      341,  341,  267,  341,  353,  267,  353,  714,  280,  281,
-      717,  678,  709,  282,  342,  727,  821,  342,  318,  318,
-      354,  713,  728,  327,  822,  936,  324,  783,  937,  325,
-      823,  678,  675,  675,  675, 1767,  326,  318,  319,  267,
+      309,  307,  307,  307,  680,  307,  311,  307,  312,  307,
+      315,  267,  315,  315,  267,  315,  315,  267,  315, 1763,
+      679,  887,  280,  281,  885,  716,  316,  282, 3468,  317,
+      715,  886,  317,  778,  307,  307,  761,  327,  717,  777,
+      710,  897,  313,  318,  319,  267,  319,  318,  318,  318,
+      318,  318,  318,  318,  320,  318,  318,  318, 1765,  318,
+
+      322,  318,  323,  318, 1766,  680,  328,  709,  341,  267,
+      341,  341,  267,  341,  353,  267,  353,  715,  280,  281,
+      718,  679,  710,  282,  342,  728,  880,  342,  318,  318,
+      354,  714,  729,  327,  715,  938,  324,  715,  939,  325,
+      797,  679,  676,  676,  676, 1768,  326,  318,  319,  267,
       319,  318,  318,  318,  318,  318,  318,  318,  320,  318,
       318,  318,  328,  318,  322,  318,  323,  318,  353,  267,
-      353,  364,  267,  364,  364,  267,  364,  802,  364,  267,
-      364,  364,  267,  364,  354,  679,  765,  365,  679,  760,
-      365,  878,  318,  318,  366,  740, 1543,  366, 1768,  714,
+      353,  364,  267,  364,  364,  267,  364,  828,  364,  267,
+      364,  364,  267,  364,  354,  680,  766,  365,  680,  798,
+      365,  829,  318,  318,  366,  741, 1769,  366, 1770,  903,
 
-      324,  678,  766,  325,  678,  675,  675,  675,  783, 1544,
+      324,  679,  767,  325,  679,  676,  676,  676,  797, 1209,
       326,  329,  330,  267,  330,  329,  329,  329,  329,  329,
-      329,  329,  331,  329,  329,  329,  803,  329,  333,  329,
+      329,  329,  331,  329,  329,  329, 1210,  329,  333,  329,
       334,  329,  267,  267,  267,  267,  267,  267,  364,  267,
-      364,  802,  364,  267,  364,  364,  267,  364,  367, 1769,
-      679,  367,  679,  679,  365, 1770,  329,  329,  365,  746,
-      713,  368,  675,  675,  675,  335,  678,  336,  678,  678,
-     3457,  337,  675,  675,  675,  832,  338,  339,  329,  330,
+      364,  805,  364,  267,  364,  364,  267,  364,  367, 1771,
+      680,  367,  680,  680,  365,  715,  329,  329,  365,  747,
+      714,  368,  676,  676,  676,  335,  679,  336,  679,  679,
+     3468,  337,  676,  676,  676,  805,  338,  339,  329,  330,
       267,  330,  329,  329,  329,  329,  329,  329,  329,  331,
-      329,  329,  329,  713,  329,  333,  329,  334,  329,  364,
+      329,  329,  329,  761,  329,  333,  329,  334,  329,  364,
 
-      267,  364,  267,  267,  267,  267,  267,  267,  910,  364,
-      267,  364,  364,  267,  364,  368,  763, 1771,  369,  777,
-      703,  369,  760,  329,  329,  370,  756,  760,  370,  675,
-      675,  675,  335,  759,  336,  675,  675,  675,  337,  675,
-      675,  675, 1773,  338,  339,  343,  344,  267,  344,  343,
+      267,  364,  267,  267,  267,  267,  267,  267,  912,  364,
+      267,  364,  364,  267,  364,  368,  764, 1772,  369,  778,
+      704,  369,  761,  329,  329,  370,  757,  714,  370,  676,
+      676,  676,  335,  760,  336,  676,  676,  676,  337,  676,
+      676,  676, 1773,  338,  339,  343,  344,  267,  344,  343,
       343,  343,  343,  343,  343,  343,  345,  343,  343,  343,
-      710,  343,  347,  343,  348,  343,  364,  267,  364,  364,
-      267,  364,  267,  267,  267,  930,  267,  267,  267,  364,
-      267,  364,  371, 1044, 1774,  371, 1045,  826,  372,  767,
-      343,  343,  372,  754,  755,  368,  895,  349,  675,  675,
-
-      675,  827,  713,  350,  768,  675,  675,  675,  675,  675,
-      675,  982,  351,  343,  344,  267,  344,  343,  343,  343,
-      343,  343,  343,  343,  345,  343,  343,  343,  930,  343,
+      711,  343,  347,  343,  348,  343,  364,  267,  364,  364,
+      267,  364,  267,  267,  267,  932,  267,  267,  267,  364,
+      267,  364,  371,  959, 1656,  371,  932,  960,  372,  768,
+      343,  343,  372,  755,  756,  368, 1657,  349,  676,  676,
+
+      676,  933,  714,  350,  769,  676,  676,  676,  676,  676,
+      676,  984,  351,  343,  344,  267,  344,  343,  343,  343,
+      343,  343,  343,  343,  345,  343,  343,  343, 1774,  343,
       347,  343,  348,  343,  364,  267,  364,  267,  267,  267,
-      267,  267,  267,  931,  364,  267,  364,  364,  267,  364,
-      368,  679,  714,  373, 1782,  901,  373,  679,  343,  343,
-      371,  679,  679,  371,  788,  349, 1555,  678,  675,  675,
-      675,  350,  948,  678,  675,  675,  675,  678,  678, 1544,
+      267,  267,  267,  964,  364,  267,  364,  364,  267,  364,
+      368,  680,  680,  373,  680,  950,  373,  965,  343,  343,
+      371,  783,  680,  371, 1775,  349, 1776,  679,  679,  788,
+      679,  350,  676,  676,  676,  676,  676,  676,  679, 1019,
       351,  355,  356,  267,  356,  355,  355,  355,  355,  355,
-      355,  355,  357,  355,  355,  355, 1017,  355,  359,  355,
+      355,  355,  357,  355,  355,  355, 1778,  355,  359,  355,
 
       360,  355,  364,  267,  364,  364,  267,  364,  267,  267,
-      267,  714,  267,  267,  267,  364,  267,  364,  374,  679,
-      679,  374,  679, 1783,  375,  832,  355,  355,  375,  793,
-     1785,  376,  675,  675,  675,  678,  678,  361,  678,  675,
-      675,  675,  675,  675,  675, 1789,  362,  355,  356,  267,
+      267, 1779,  267,  267,  267,  364,  267,  364,  374,  680,
+      680,  374, 1787, 1788,  375,  834,  355,  355,  375,  680,
+     1790,  376,  676,  676,  676,  679,  679,  361,  676,  676,
+      676,  676,  676,  676,  834,  679,  362,  355,  356,  267,
       356,  355,  355,  355,  355,  355,  355,  355,  357,  355,
-      355,  355, 1008,  355,  359,  355,  360,  355,  364,  267,
-      364,  267,  267,  267,  267,  267,  267,  713,  364,  267,
-      364,  364,  267,  364,  376,  679,  949,  377, 1793, 1008,
-      377, 1795,  355,  355,  374,  679, 1802,  374,  364,  267,
+      355,  355, 1010,  355,  359,  355,  360,  355,  364,  267,
+      364,  267,  267,  267,  267,  267,  267,  761,  364,  267,
+      364,  364,  267,  364,  376,  680,  951,  377, 1040, 1010,
+      377, 1041,  355,  355,  374,  680,  714,  374,  364,  267,
 
-      364,  678,  807,  361,  364,  267,  364,  675,  675,  675,
-      871,  678,  362, 1017,  378,  675,  675,  675,  751, 1803,
+      364,  679,  809,  361,  364,  267,  364,  676,  676,  676,
+      873,  679,  362, 1019,  378,  676,  676,  676,  752, 1297,
       378,  379,  380,  267,  380,  379,  379,  379,  379,  379,
-      379,  379,  381,  379,  379,  379,  948,  379,  383,  379,
+      379,  379,  381,  379,  379,  379, 1210,  379,  383,  379,
       384,  379,  390,  267,  390,  390,  267,  390,  267,  267,
-      267,  957,  267,  267,  267,  958,  769,  679,  391, 1028,
-     1018,  391,  760,  958,  392, 3457,  379,  379,  392,  679,
-      679,  385,  758,  678,  871,  710,  813,  386,  675,  675,
-      675,  387,  675,  675,  675,  678,  678,  388,  379,  380,
+      267, 1030,  267,  267,  267,  960,  770,  680,  391, 1049,
+      969,  391,  761, 1050,  392, 3468,  379,  379,  392,  680,
+      680,  385,  759,  679,  965,  711,  815,  386,  676,  676,
+      676,  387,  676,  676,  676,  679,  679,  388,  379,  380,
       267,  380,  379,  379,  379,  379,  379,  379,  379,  381,
 
-      379,  379,  379,  697,  379,  383,  379,  384,  379,  390,
-      267,  390,  390,  267,  390,  390,  267,  390,  909,  390,
-      267,  390,  675,  675,  675,  391,  713,  828,  391, 1804,
-     1805,  393, 1810,  379,  379,  393,  679,  679,  385,  829,
-      830,  675,  675,  675,  386,  675,  675,  675,  387,  675,
-      675,  675,  678,  678,  388,  394,  395,  267,  395,  394,
+      379,  379,  379,  698,  379,  383,  379,  384,  379,  390,
+      267,  390,  390,  267,  390,  390,  267,  390,  823,  390,
+      267,  390,  676,  676,  676,  391,  824,  830,  391, 1794,
+     1798,  393,  825,  379,  379,  393,  680,  680,  385,  831,
+      832,  676,  676,  676,  386,  676,  676,  676,  387,  676,
+      676,  676,  679,  679,  388,  394,  395,  267,  395,  394,
       394,  394,  394,  394,  394,  394,  396,  394,  394,  394,
-      713,  394,  398,  394,  399,  394,  404,  267,  404,  404,
-      267,  404,  267,  267,  267,  950,  267,  267,  267, 1053,
-      679, 1811,  405, 1054, 1008,  405,  951,  842,  367,  952,
-
-      394,  394,  367,  679,  679,  400,  678,  675,  675,  675,
-      852,  401,  675,  675,  675,  675,  675,  675, 1018,  678,
-      678, 1294,  402,  394,  395,  267,  395,  394,  394,  394,
-      394,  394,  394,  394,  396,  394,  394,  394, 1207,  394,
-      398,  394,  399,  394,  404,  267,  404,  404,  267,  404,
-      404,  267,  404,  962,  404,  267,  404,  675,  675,  675,
-      405,  679,  679,  405,  679, 1812,  406,  963,  394,  394,
-      406,  857, 1813,  400,  675,  675,  675,  678,  678,  401,
-      678,  675,  675,  675,  675,  675,  675,  675,  675,  675,
-      402,  407,  408,  267,  408,  407,  407,  407,  407,  407,
-
-      407,  407,  409,  407,  407,  407, 1814,  407,  411,  407,
-      412,  407,  416,  267,  416,  416,  267,  416,  427,  267,
-      427,  918,  427,  267,  427,  441,  267,  441,  417, 1177,
-     1815,  417,  679, 1518,  428, 1177,  407,  407,  428,  863,
-      885,  442,  675,  675,  675,  675,  675,  675,  678,  675,
-      675,  675,  413, 1816,  877, 1734, 1823,  414,  407,  408,
-      267,  408,  407,  407,  407,  407,  407,  407,  407,  409,
-      407,  407,  407,  760,  407,  411,  407,  412,  407,  441,
-      267,  441,  267,  267,  267,  267,  267,  267,  878,  441,
-      267,  441,  441,  267,  441,  442,  714, 1824,  443,  679,
-
-     1825,  443,  878,  407,  407,  442,  713,  679,  442,  675,
-      675,  675,  675,  675,  675,  678,  675,  675,  675,  413,
-      675,  675,  675,  678,  414,  418,  419,  267,  419,  418,
-      418,  418,  418,  418,  418,  418,  420,  418,  418,  418,
-     1830,  418,  422,  418,  423,  418,  441,  267,  441,  441,
-      267,  441,  453,  267,  453, 1835,  453,  267,  453,  465,
-      267,  465,  444, 1837, 1838,  444,  679,  679,  454,  679,
-      418,  418,  454,  890,  679,  466,  675,  675,  675,  675,
-      675,  675,  678,  678, 1844,  678,  424, 1849, 1850,  895,
-      678, 1206,  425,  418,  419,  267,  419,  418,  418,  418,
-
-      418,  418,  418,  418,  420,  418,  418,  418, 1329,  418,
-      422,  418,  423,  418,  465,  267,  465,  483,  267,  483,
-      483,  267,  483, 1651,  267,  267,  267,  267,  267,  267,
-      466, 1860, 1863,  484, 1864, 1652,  484,  878,  418,  418,
-      367, 1868, 1869,  367,  918,  714,  675,  675,  675,  901,
-      675,  675,  675, 1872,  424,  675,  675,  675,  909, 1873,
-      425,  429,  430,  267,  430,  429,  429,  429,  429,  429,
-      429,  429,  431,  429,  429,  429, 1874,  429,  433,  429,
-      434,  429,  483,  267,  483,  483,  267,  483,  483,  267,
-      483, 1875,  483,  267,  483,  910,  713,  878,  484,  679,
-
-      679,  484, 1876, 1877,  485,  714,  429,  429,  485,  435,
-      760,  436,  675,  675,  675,  678,  678,  437,  675,  675,
-      675,  675,  675,  675,  438, 1878, 1879,  439,  429,  430,
-      267,  430,  429,  429,  429,  429,  429,  429,  429,  431,
-      429,  429,  429, 1887,  429,  433,  429,  434,  429,  499,
-      267,  499,  499,  267,  499,  515,  267,  515,  950,  515,
-      267,  515, 1890,  679, 1891,  500, 1894,  679,  500,  951,
-      914,  516,  966,  429,  429,  516,  435, 1177,  436,  678,
-      675,  675,  675,  678,  437,  675,  675,  675,  675,  675,
-      675,  438, 1896, 1179,  439,  445,  446,  267,  446,  445,
-
-      445,  445,  445,  445,  445,  445,  447,  445,  445,  445,
-     1898,  445,  449,  445,  450,  445,  526,  267,  526,  526,
-      267,  526,  538,  267,  538,  967,  538,  267,  538,  551,
-      267,  551,  527, 1899, 1901,  527,  679,  679,  539,  963,
-      445,  445,  539,  923,  928,  552,  675,  675,  675,  675,
-      675,  675,  678,  678, 1902, 1903,  451,  445,  446,  267,
-      446,  445,  445,  445,  445,  445,  445,  445,  447,  445,
-      445,  445, 1908,  445,  449,  445,  450,  445,  551,  267,
-      551,  267,  267,  267,  267,  267,  267,  967,  551,  267,
-      551,  551,  267,  551,  552, 1911, 1912,  367,  959, 1913,
-
-      367, 1014,  445,  445,  552,  960, 1915,  552,  675,  675,
-      675,  961,  934,  934,  934, 1194, 1194, 1194,  451,  455,
-      456,  267,  456,  455,  455,  455,  455,  455,  455,  455,
-      457,  455,  455,  455, 1918,  455,  459,  455,  460,  455,
-      551,  267,  551,  551,  267,  551,  563,  267,  563,  969,
-      563,  267,  563,  267,  267,  267,  553, 1919, 1921,  553,
-      970,  972,  564,  952,  455,  455,  564,  969,  960,  565,
-      461,  935,  972,  959,  973,  462, 1925, 1926,  970,  960,
-      960,  966, 1534, 1534, 1534,  961,  973,  463,  455,  456,
-      267,  456,  455,  455,  455,  455,  455,  455,  455,  457,
-
-      455,  455,  455, 1927,  455,  459,  455,  460,  455,  267,
-      267,  267,  563,  267,  563,  563,  267,  563,  967,  563,
-      267,  563,  563,  267,  563,  565, 1929,  967,  564,  959,
-      972,  564, 1019,  455,  455,  566,  960,  960,  566,  461,
-      950, 1020, 1013, 1013,  462,  934,  934,  934, 1737, 1181,
-     1943,  970, 1944, 1945,  966, 1947,  463,  467,  468,  267,
-      468,  467,  467,  467,  467,  467,  467,  467,  469,  467,
-      467,  467,  470,  467,  471,  467,  472,  467,  470,  470,
-      470,  470,  470,  470,  470,  470,  470,  470,  470,  470,
-      470,  470,  470,  470,  470,  470,  470,  470,  470,  470,
-
-      470,  470,  467,  467,  470,  473,  474,  475,  470,  470,
-      470,  470,  470,  476,  470,  470,  477,  470,  470,  470,
-      478,  470,  479,  480,  481,  470,  470,  470,  470,  470,
-      470,  486,  487,  267,  487,  486,  486,  486,  486,  486,
-      486,  486,  488,  486,  486,  486, 1948,  486,  490,  486,
-      491,  486,  577,  267,  577,  577,  267,  577,  267,  267,
-      267, 1949,  267,  267,  267,  577,  267,  577,  578, 1348,
-     1177,  578, 1555, 1950,  565, 1951,  486,  486,  565, 1349,
-      492,  578, 1194, 1194, 1194, 1593, 1350,  493, 1952, 1953,
-      494, 1218, 1218, 1218,  495, 1940,  496,  497,  486,  487,
-
-      267,  487,  486,  486,  486,  486,  486,  486,  486,  488,
-      486,  486,  486, 1954,  486,  490,  486,  491,  486,  577,
-      267,  577,  577,  267,  577,  577,  267,  577, 1955,  589,
-      267,  589,  589,  267,  589,  578, 1956, 1957,  579, 1959,
-     1960,  579, 1961,  486,  486,  590, 1195,  492,  590, 1231,
-     1231, 1231, 1962, 1232,  493, 1195, 1233,  494, 1218, 1218,
-     1218,  495, 1965,  496,  497,  501,  502,  267,  502,  501,
-      501,  501,  501,  501,  501,  501,  503,  501,  501,  501,
-     1968,  501,  505,  501,  506,  501,  600,  267,  600,  600,
-      267,  600,  267,  267,  267, 1969,  267,  267,  267,  979,
-
-      979,  979,  601, 1970, 1971,  601, 1972, 1973,  565, 1977,
-      501,  501,  565,  507,  508,  509,  980, 1978, 1241, 1241,
-     1241,  510, 1242, 1980,  511, 1243, 1981, 1982,  512, 1984,
-     1997,  513,  501,  502,  267,  502,  501,  501,  501,  501,
-      501,  501,  501,  503,  501,  501,  501, 1998,  501,  505,
-      501,  506,  501,  600,  267,  600,  600,  267,  600,  600,
-      267,  600, 1999,  600,  267,  600,  987,  987,  987,  601,
-     2000, 2001,  601, 2004, 2005,  602, 2006,  501,  501,  602,
-      507,  508,  509,  988, 2007, 1263, 1263, 1263,  510, 1264,
-     2012,  511, 1265, 2013, 2017,  512, 2022, 2023,  513,  517,
-
-      518,  267,  518,  517,  517,  517,  517,  517,  517,  517,
-      519,  517,  517,  517, 2032,  517,  521,  517,  522,  517,
-      613,  267,  613,  613,  267,  613,  267,  267,  267, 2036,
-      267,  267,  267, 1002, 1002, 1002,  614, 2038, 2044,  614,
-     2045, 2046,  565, 2052,  517,  517,  565, 2053, 2054,  523,
-     1003, 1590, 1590, 1590, 2055,  524,  517,  518,  267,  518,
-      517,  517,  517,  517,  517,  517,  517,  519,  517,  517,
-      517, 2058,  517,  521,  517,  522,  517,  613,  267,  613,
-      613,  267,  613,  613,  267,  613, 2059,  613,  267,  613,
-     1022, 1022, 1022,  614, 2070, 2076,  614, 2080, 2083,  615,
-
-     2085,  517,  517,  615, 2086, 2088,  523, 1023, 1534, 1534,
-     1534, 2089,  524,  528,  529,  267,  529,  528,  528,  528,
-      528,  528,  528,  528,  530,  528,  528,  528, 2090,  528,
-      532,  528,  533,  528,  628,  267,  628,  628,  267,  628,
-      267,  267,  267, 2094,  267,  267,  267,  628,  267,  628,
-      629, 2097, 2099,  629, 2106, 2114,  630, 2115,  528,  528,
-      630, 2116,  534,  629, 1194, 1194, 1194, 2117, 2119,  535,
-     1737, 1177,  536,  528,  529,  267,  529,  528,  528,  528,
-      528,  528,  528,  528,  530,  528,  528,  528, 2134,  528,
-      532,  528,  533,  528,  628,  267,  628,  628,  267,  628,
-
-      628,  267,  628, 2137,  640,  267,  640,  640,  267,  640,
-      629, 2141, 2135,  631, 2142, 1737,  631, 2143,  528,  528,
-      641, 2146,  534,  641, 1218, 1218, 1218, 2147, 1271,  535,
-     2149, 2150,  536,  540,  541,  267,  541,  540,  540,  540,
-      540,  540,  540,  540,  542,  540,  540,  540, 2136,  540,
-      544,  540,  545,  540,  650,  267,  650,  650,  267,  650,
-      267,  267,  267, 2151,  267,  267,  267,  650,  267,  650,
-      651, 2144, 2152,  651, 2153, 2154,  367, 2155,  540,  540,
-      367, 2158,  546,  651, 1751, 1751, 1751, 2145, 1271,  547,
-     2159, 2162,  548, 1754, 1754, 1754, 1759, 1759, 1759,  549,
-
-      540,  541,  267,  541,  540,  540,  540,  540,  540,  540,
-      540,  542,  540,  540,  540, 2163,  540,  544,  540,  545,
-      540,  650,  267,  650,  650,  267,  650,  650,  267,  650,
-     1752,  662,  267,  662,  662,  267,  662,  651, 2164, 1755,
-      652, 2165, 2166,  652,  751,  540,  540,  663, 2168,  546,
-      663, 1285, 1285, 1285,  761, 1286,  547, 2169, 1287,  548,
-     1762, 1762, 1762, 1772, 1772, 1772,  549,  554,  555,  267,
-      555,  554,  554,  554,  554,  554,  554,  554,  556,  554,
-      554,  554,  762,  554,  558,  554,  559,  554,  673,  267,
-      673,  673,  267,  673, 2172, 2175,  713, 1030, 1030, 1030,
-
-      707, 1190, 1190, 1190,  674, 2179, 2180,  674, 2183, 2184,
-     3457, 2185,  554,  554, 1031, 1046, 1046, 1046,  560, 1192,
-      710, 2188, 1296, 1296, 1296, 2192, 1297, 2193,  710, 1298,
-     2196, 2198, 1047,  561,  554,  555,  267,  555,  554,  554,
-      554,  554,  554,  554,  554,  556,  554,  554,  554,  711,
-      554,  558,  554,  559,  554,  712,  765, 1059, 1059, 1059,
-     2203, 2211,  713, 1590, 1590, 1590,  714, 1061, 1061, 1061,
-     2181, 2218,  766, 2219, 1060, 1067, 1067, 1067, 2182,  554,
-      554, 1070, 1070, 1070, 1062,  560, 1319, 1319, 1319, 2186,
-     1320, 2223, 1068, 1321, 1806, 1806, 1806, 2187, 1071, 2224,
-
-      561,  567,  568,  267,  568,  567,  567,  567,  567,  567,
-      567,  567,  569,  567,  567,  567, 2225,  567,  571,  567,
-      572,  567, 1085, 1085, 1085, 1087, 1087, 1087, 1099, 1099,
-     1099, 1107, 1107, 1107, 1112, 1112, 1112, 2194, 2194, 1086,
-     1807, 2226, 1088, 2144, 2228, 1100,  567,  567, 1108, 2232,
-     2233, 1113,  573, 2195, 2145,  574, 1337, 1337, 1337, 2195,
-     1338, 2234, 2240, 1339, 1808, 1808, 1808,  575,  567,  568,
-      267,  568,  567,  567,  567,  567,  567,  567,  567,  569,
-      567,  567,  567, 2241,  567,  571,  567,  572,  567, 1118,
-     1118, 1118, 1138, 1138, 1138, 1162, 1162, 1162, 1166, 1166,
-
-     1166, 1171, 1171, 1171, 2242, 2246, 1119, 2247, 2258, 1139,
-     1755, 2262, 1163,  567,  567, 1167, 2263, 2264, 1172,  573,
-     2266, 2270,  574, 1340, 1340, 1340, 2274, 1341, 2275, 2276,
-     1342, 1809, 1809, 1809,  575,  580,  581,  267,  581,  580,
-      580,  580,  580,  580,  580,  580,  582,  580,  580,  580,
-     2277,  580,  584,  580,  585,  580, 1190, 1190, 1190, 1226,
-     1226, 1226, 2278, 2281, 1226, 1226, 1226,  979,  979,  979,
-     1236, 1236, 1236, 1985, 1192, 2288, 2290, 1228, 2300, 1986,
-      580,  580, 1228, 1987,  980, 2301,  586, 1988, 1238, 2302,
-     2303,  587,  580,  581,  267,  581,  580,  580,  580,  580,
-
-      580,  580,  580,  582,  580,  580,  580, 2305,  580,  584,
-      580,  585,  580, 1737, 1193, 1236, 1236, 1236,  987,  987,
-      987, 1252, 1252, 1252, 1229, 1244, 1244, 1244, 1247, 1247,
-     1247, 2312, 2318, 1238, 1177,  988, 2319,  580,  580, 1254,
-     2309, 1737, 1245,  586, 2310, 1248, 2320, 2321,  587,  591,
-      592,  267,  592,  591,  591,  591,  591,  591,  591,  591,
-      593,  591,  591,  591, 2324,  591,  595,  591,  596,  591,
-     1259, 1259, 1259, 1259, 1259, 1259, 1002, 1002, 1002, 1239,
-     1267, 1267, 1267, 2326, 1252, 1252, 1252, 2311, 1261, 2327,
-     2328, 1261, 2329, 1003,  591,  591, 2333, 2338, 1269, 2340,
-
-      597, 2341, 1254, 1351, 1351, 1351, 2342, 1352, 2346, 2352,
-     1353, 1754, 1754, 1754, 2353,  598,  591,  592,  267,  592,
-      591,  591,  591,  591,  591,  591,  591,  593,  591,  591,
-      591, 1255,  591,  595,  591,  596,  591, 1262, 1267, 1267,
-     1267, 1022, 1022, 1022, 2354, 1290, 1290, 1290, 1290, 1290,
-     1290, 1030, 1030, 1030, 2355, 2356, 1269, 1910, 1023, 2357,
-     2358,  591,  591, 1292, 2359, 2360, 1292,  597, 1031, 1355,
-     1355, 1355, 2361, 1356, 2367, 1270, 1357, 1751, 1751, 1751,
-     2368, 2369,  598,  603,  604,  267,  604,  603,  603,  603,
-      603,  603,  603,  603,  605,  603,  603,  603, 2370,  603,
-
-      607,  603,  608,  603, 1300, 1300, 1300, 1300, 1300, 1300,
-     1046, 1046, 1046, 2376, 1293, 1306, 1306, 1306, 1306, 1306,
-     1306, 2378, 1302, 2382, 2384, 1302, 2386, 1047,  603,  603,
-     1312, 1312, 1312, 1308,  609, 2387, 1308,  610, 1374, 1374,
-     1374, 2392, 1375, 2393, 2395, 1376, 2396, 2397, 1314,  611,
-      603,  604,  267,  604,  603,  603,  603,  603,  603,  603,
-      603,  605,  603,  603,  603, 2398,  603,  607,  603,  608,
-      603, 2402, 2403, 1303, 1312, 1312, 1312, 2404, 2405, 1309,
-     1325, 1325, 1325, 2388, 1325, 1325, 1325, 1332, 1332, 1332,
-     2413, 2389, 1314, 2414, 2415,  603,  603, 2416, 1327, 2419,
-
-     2424,  609, 1327, 2390,  610, 1334, 1377, 1377, 1377, 2428,
-     1378, 2391, 2429, 1379, 2434, 2435,  611,  616,  617,  267,
-      617,  616,  616,  616,  616,  616,  616,  616,  618,  616,
-      616,  616, 2436,  616,  620,  616,  621,  616, 2437, 1315,
-     1059, 1059, 1059, 2439, 2430, 1328, 1332, 1332, 1332, 1061,
-     1061, 1061, 2431, 1343, 1343, 1343, 2449, 1060, 1343, 1343,
-     1343, 2461,  616,  616, 1334, 2432, 1062, 1754, 1754, 1754,
-      622, 1345,  623, 2433, 1737,  624, 1345, 2462, 2463,  625,
-     1958, 1958, 1958,  626,  616,  617,  267,  617,  616,  616,
-      616,  616,  616,  616,  616,  618,  616,  616,  616, 2465,
-
-      616,  620,  616,  621,  616, 1067, 1067, 1067, 1335, 1070,
-     1070, 1070, 2468, 2469, 1358, 1358, 1358, 2455, 2470, 1346,
-     2473, 2477, 1068, 1370, 1370, 1370, 1071, 2478, 2479,  616,
-      616, 1359, 1085, 1085, 1085, 2480, 2481,  622, 2482,  623,
-     1737, 1372,  624, 1759, 1759, 1759,  625, 2483, 2484, 1086,
-      626,  632,  633,  267,  633,  632,  632,  632,  632,  632,
-      632,  632,  634,  632,  632,  632, 2485,  632,  636,  632,
-      637,  632, 1087, 1087, 1087, 1380, 1380, 1380, 1762, 1762,
-     1762, 1772, 1772, 1772, 1370, 1370, 1370, 2456, 2486, 1088,
-     2499, 2500, 1381, 3457, 3457, 3457,  632,  632, 3457, 3457,
-
-     3457, 2501, 1372, 2502, 1394, 1394, 1394, 2503, 1395, 2505,
-     3457, 1396, 1406, 1406, 1406, 3457, 1407, 2506, 2512, 1408,
-      638,  632,  633,  267,  633,  632,  632,  632,  632,  632,
-      632,  632,  634,  632,  632,  632, 2513,  632,  636,  632,
-      637,  632, 1373, 2514, 1382, 1386, 1386, 1386, 2515, 2516,
-     1383, 3457, 3457, 3457, 2517, 1099, 1099, 1099, 2518, 2521,
-     3457, 3457, 3457, 1388, 2522, 2523,  632,  632, 3457, 1386,
-     1386, 1386, 1100, 2528, 1414, 1414, 1414, 3457, 1415, 2529,
-     2530, 1416, 1423, 1423, 1423, 2538, 1424, 1388, 2539, 1425,
-      638,  642,  643,  267,  643,  642,  642,  642,  642,  642,
-
-      642,  642,  644,  642,  642,  642, 1384,  642,  646,  642,
-      647,  642, 1385, 1397, 1397, 1397, 1389, 1401, 1401, 1401,
-     1401, 1401, 1401, 1107, 1107, 1107, 1409, 1409, 1409, 2524,
-     1398, 1963, 1963, 1963, 2540, 1403,  642,  642, 1403, 2525,
-     1108, 1966, 1966, 1966, 1411, 2541, 2550,  648,  642,  643,
-      267,  643,  642,  642,  642,  642,  642,  642,  642,  644,
-      642,  642,  642, 2551,  642,  646,  642,  647,  642, 2552,
-     2553, 1404, 1409, 1409, 1409, 1112, 1112, 1112, 1418, 1418,
-     1418, 1418, 1418, 1418, 1118, 1118, 1118, 1967, 2555, 2557,
-     1411, 2582, 1113,  642,  642, 1964, 1420, 1737, 2583, 1420,
-
-     1737, 1119, 2585, 2586,  648,  653,  654,  267,  654,  653,
-      653,  653,  653,  653,  653,  653,  655,  653,  653,  653,
-     2587,  653,  657,  653,  658,  653, 2588, 2589, 1421, 1429,
-     1429, 1429, 2578, 1412, 2579, 1429, 1429, 1429, 1433, 1433,
-     1433, 1435, 1435, 1435, 1438, 1438, 1438, 1431, 2593, 2594,
-      653,  653, 2595, 1431, 2596, 1434, 2597, 2598, 1436, 2599,
-     2600,  659, 1440, 1455, 1455, 1455, 2601, 1456, 2602, 2603,
-     1457, 1974, 1974, 1974,  660,  653,  654,  267,  654,  653,
-      653,  653,  653,  653,  653,  653,  655,  653,  653,  653,
-     1432,  653,  657,  653,  658,  653, 1443, 1443, 1443, 2605,
-
-     2606, 3457, 3457, 3457, 2609, 1438, 1438, 1438, 2610, 2611,
-     1447, 1447, 1447, 1444, 1450, 1450, 1450, 1975, 3457, 2612,
-      653,  653, 2615, 1440, 3457, 3457, 3457, 1448, 1806, 1806,
-     1806,  659, 1452, 1495, 1495, 1495, 2616, 1496, 2617, 2618,
-     1497, 3457, 2620, 2621,  660,  664,  665,  267,  665,  664,
-      664,  664,  664,  664,  664,  664,  666,  664,  664,  664,
-     1437,  664,  668,  664,  669,  664, 1441, 1450, 1450, 1450,
-     2623, 3457, 3457, 3457, 1445, 1138, 1138, 1138, 1458, 1458,
-     1458, 1458, 1458, 1458, 2624, 1452, 2630, 2631, 3457, 1446,
-      664,  664, 1139, 1462, 1462, 1462, 1460, 2632, 2633, 1460,
-
-     2637,  670, 2607, 2638, 1453, 1502, 1502, 1502, 2639, 1503,
-     1463, 2608, 1504, 2640,  671,  664,  665,  267,  665,  664,
-      664,  664,  664,  664,  664,  664,  666,  664,  664,  664,
-     1449,  664,  668,  664,  669,  664, 1461, 1464, 1464, 1464,
-     1466, 1466, 1466, 2641, 1466, 1466, 1466, 1470, 1470, 1470,
-     1474, 1474, 1474, 2645, 1465, 3457, 3457, 3457, 1468, 2648,
-      664,  664, 1468, 2653, 1471, 2654, 2657, 1475, 1476, 1476,
-     1476,  670, 3457, 1485, 1485, 1485, 1491, 1491, 1491, 1476,
-     1476, 1476, 2649, 2666,  671,  679, 1478, 2613, 1485, 1485,
-     1485, 1487,  694, 2667, 1493, 2650, 2614, 1478, 1491, 1491,
-
-     1491,  678,  695, 2668, 2669, 1472, 1487, 1162, 1162, 1162,
-     1498, 1498, 1498, 2670, 2673, 1469, 1493, 1166, 1166, 1166,
-     1473, 1498, 1498, 1498, 1163, 1506, 1506, 1506, 1500,  696,
-      697,  698, 2651, 2674, 1167,  699,  700,  701, 2695, 1500,
-      702,  703, 2696, 1508,  704, 2652,  705,  706,  707,  679,
-     1479, 1177, 1488, 1506, 1506, 1506,  751, 1171, 1171, 1171,
-     1737, 2698, 1494, 2699, 1737,  678,  752, 1989, 1510, 1510,
-     1510, 1508, 1511, 1990, 1172, 1512, 2700, 1991, 1514, 1514,
-     1514, 1992, 1501, 2709, 1514, 1514, 1514, 2710, 1190, 1190,
-     1190, 2692, 2711,  696,  753,  708, 1516, 2693, 2712,  754,
-
-      755,  701, 1516, 2713,  756,  703, 1192, 2694,  757, 2714,
-      758,  759,  707, 1190, 1190, 1190, 2715, 1509, 1190, 1190,
-     1190, 1557, 1557, 1557, 1226, 1226, 1226, 2716, 1226, 1226,
-     1226, 1192, 1226, 1226, 1226, 2717, 1192, 2718, 1558, 1560,
-     1560, 1560, 1228, 2719, 2721, 1517, 1228, 1231, 1231, 1231,
-     1228, 1232, 2722, 2723, 1233, 2724, 1561, 3457, 3457, 3457,
-     1236, 1236, 1236, 2725, 2726, 1526, 1236, 1236, 1236, 1236,
-     1236, 1236, 2727, 2703, 3457, 1241, 1241, 1241, 1238, 1242,
-     2728, 1559, 1243, 2704, 1238, 2729, 2705, 1238, 1244, 1244,
-     1244, 1566, 1566, 1566, 2730, 1567, 2731, 2732, 1568, 2733,
-
-     1569, 1569, 1569, 2734, 2735, 1245, 1247, 1247, 1247, 1575,
-     1575, 1575, 1252, 1252, 1252, 2706, 1564, 1570, 1562, 2736,
-     1571, 1571, 1571, 1248, 1572, 2707, 1576, 1573, 2708, 2739,
-     1254, 1252, 1252, 1252, 1252, 1252, 1252, 1580, 1580, 1580,
-     1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1254,
-     2740, 2748, 1254, 2749, 1581, 1263, 1263, 1263, 1261, 1264,
-     2750, 1261, 1265, 2753, 1261, 1267, 1267, 1267, 1267, 1267,
-     1267, 1585, 1585, 1585, 1285, 1285, 1285, 2754, 1286, 2758,
-     2759, 1287, 2760, 1269, 2761, 2762, 1269, 2763, 2771, 1586,
-     1602, 1602, 1602, 1583, 1578, 1290, 1290, 1290, 1290, 1290,
-
-     1290, 1290, 1290, 1290, 1296, 1296, 1296, 1603, 1297, 2772,
-     2773, 1298, 2799, 1292, 1177, 2801, 1292, 2802, 1737, 1292,
-     1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1609,
-     1609, 1609, 3457, 3457, 3457, 1306, 1306, 1306, 1302, 2803,
-     2807, 1302, 2808, 2796, 1302, 2811, 1610, 2812, 2815, 3457,
-     1306, 1306, 1306, 1308, 1306, 1306, 1306, 1613, 1613, 1613,
-     2797, 1737, 1604, 3457, 3457, 3457, 2816, 2817, 1308, 1808,
-     1808, 1808, 1308, 2818, 1614, 1312, 1312, 1312, 2819, 1611,
-     3457, 1312, 1312, 1312, 1312, 1312, 1312, 1608, 1619, 1619,
-     1619, 1615, 2820, 1314, 1319, 1319, 1319, 2821, 1320, 1314,
-
-     2822, 1321, 1314, 2798, 2823, 1620, 1325, 1325, 1325, 1325,
-     1325, 1325, 1325, 1325, 1325, 1627, 1627, 1627, 1332, 1332,
-     1332, 1612, 2825, 2826, 1327, 2827, 2828, 1327, 2829, 2830,
-     1327, 2809, 1628, 1332, 1332, 1332, 1334, 1332, 1332, 1332,
-     1630, 1630, 1630, 2813, 2810, 1337, 1337, 1337, 2831, 1338,
-     1616, 1334, 1339, 2832, 2833, 1334, 2814, 1631, 1340, 1340,
-     1340, 2834, 1341, 2835, 2836, 1342, 1343, 1343, 1343, 1343,
-     1343, 1343, 1343, 1343, 1343, 2837, 2839, 1624, 1351, 1351,
-     1351, 2851, 1352, 2852, 1345, 1353, 2860, 1345, 2861, 2862,
-     1345, 1637, 1637, 1637, 1355, 1355, 1355, 2863, 1356, 2864,
-
-     2865, 1357, 2866, 2873, 1629, 1358, 1358, 1358, 1638, 1639,
-     1639, 1639, 2876, 1640, 2883, 2884, 1641, 1370, 1370, 1370,
-     2885, 2886, 1359, 1370, 1370, 1370, 1370, 1370, 1370, 1374,
-     1374, 1374, 2887, 1375, 2888, 1372, 1376, 1632, 1377, 1377,
-     1377, 1372, 1378, 1177, 1372, 1379, 1380, 1380, 1380, 1654,
-     1654, 1654, 2901, 1655, 1737, 2903, 1656, 1386, 1386, 1386,
-     1386, 1386, 1386, 1381, 1386, 1386, 1386, 1394, 1394, 1394,
-     2904, 1395, 2905, 2906, 1396, 1388, 2781, 2907, 1388, 1397,
-     1397, 1397, 1388, 1666, 1666, 1666, 2782, 1667, 2908, 2898,
-     1668, 2897, 2783, 1653, 2909, 2910, 1398, 1401, 1401, 1401,
-
-     1401, 1401, 1401, 1401, 1401, 1401, 1406, 1406, 1406, 2911,
-     1407, 2912, 1661, 1408, 2915, 1403, 2916, 2917, 1403, 2918,
-     2919, 1403, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409,
-     1409, 1414, 1414, 1414, 2920, 1415, 2921, 2922, 1416, 2924,
-     1411, 2925, 2926, 1411, 2927, 2891, 1411, 1418, 1418, 1418,
-     1418, 1418, 1418, 2928, 1671, 1418, 1418, 1418, 2892, 1423,
-     1423, 1423, 2929, 1424, 2893, 1420, 1425, 2930, 1420, 1429,
-     1429, 1429, 2931, 1420, 1429, 1429, 1429, 2894, 1429, 1429,
-     1429, 1433, 1433, 1433, 1682, 1682, 1682, 1431, 1683, 2932,
-     2933, 1684, 1431, 2934, 2935, 1673, 1431, 2936, 1434, 1435,
-
-     1435, 1435, 2948, 2949, 1676, 1685, 1685, 1685, 2950, 1686,
-     2957, 2958, 1687, 1438, 1438, 1438, 1436, 1438, 1438, 1438,
-     2959, 1438, 1438, 1438, 1443, 1443, 1443, 2960, 1447, 1447,
-     1447, 1440, 1809, 1809, 1809, 1440, 2961, 2784, 1681, 1440,
-     2962, 1444, 1691, 1691, 1691, 1448, 1692, 2785, 2963, 1693,
-     1696, 1696, 1696, 2786, 1697, 2964, 2968, 1698, 1450, 1450,
-     1450, 1450, 1450, 1450, 1450, 1450, 1450, 1455, 1455, 1455,
-     2969, 1456, 2977, 2978, 1457, 2979, 1452, 2971, 2980, 1452,
-     2970, 2981, 1452, 1458, 1458, 1458, 2982, 2972, 1689, 1458,
-     1458, 1458, 1458, 1458, 1458, 1462, 1462, 1462, 1703, 1703,
-
-     1703, 1460, 1704, 2986, 2987, 1705, 2988, 1460, 2989, 2973,
-     1460, 2975, 1463, 1464, 1464, 1464, 1706, 1706, 1706, 2974,
-     1707, 2976, 2999, 1708, 1466, 1466, 1466, 3000, 1700, 3001,
-     1465, 1466, 1466, 1466, 3002, 1466, 1466, 1466, 1470, 1470,
-     1470, 3003, 1468, 1710, 1710, 1710, 3004, 1711, 3005, 1468,
-     1712, 3006, 1702, 1468, 3010, 1471, 1474, 1474, 1474, 1715,
-     1715, 1715, 1177, 1716, 3011, 3012, 1717, 1476, 1476, 1476,
-     1476, 1476, 1476, 1475, 1476, 1476, 1476, 1720, 1720, 1720,
-     1485, 1485, 1485, 3013, 3014, 1478, 3015, 3017, 1478, 1485,
-     1485, 1485, 1478, 3018, 1721, 3019, 2990, 1709, 1487, 1485,
-
-     1485, 1485, 1491, 1491, 1491, 3020, 3021, 1487, 1491, 1491,
-     1491, 1491, 1491, 1491, 1495, 1495, 1495, 1487, 1496, 3022,
-     1493, 1497, 1498, 1498, 1498, 3023, 1493, 3024, 3028, 1493,
-     1498, 1498, 1498, 1498, 1498, 1498, 1718, 1502, 1502, 1502,
-     1500, 1503, 3029, 3030, 1504, 1506, 1506, 1506, 1500, 3033,
-     3034, 1500, 1506, 1506, 1506, 1506, 1506, 1506, 3035, 3036,
-     1725, 3037, 3038, 1508, 1728, 1510, 1510, 1510, 3043, 1511,
-     1508, 3044, 1512, 1508, 1514, 1514, 1514, 1514, 1514, 1514,
-     1514, 1514, 1514, 1736, 1736, 1736, 1190, 1190, 1190, 1557,
-     1557, 1557, 1516, 1729, 3045, 1516, 3046, 3047, 1516, 3048,
-
-     3049, 1737, 1738, 3050, 1192, 3051, 1558, 1775, 1775, 1775,
-     3052, 1776, 3053, 3054, 1777, 3056, 1731, 1226, 1226, 1226,
-     1560, 1560, 1560, 3057, 1779, 1779, 1779, 3058, 1780, 3059,
-     1733, 1781, 1236, 1236, 1236, 1228, 1177, 1561, 1566, 1566,
-     1566, 3066, 1567, 3067, 3068, 1568, 1569, 1569, 1569, 3069,
-     1238, 3070, 1743, 1786, 1786, 1786, 3071, 1787, 3072, 3073,
-     1788, 3074, 3075, 1570, 1571, 1571, 1571, 3076, 1572, 3077,
-     3078, 1573, 1575, 1575, 1575, 1778, 1790, 1790, 1790, 3060,
-     1791, 1784, 3079, 1792, 1252, 1252, 1252, 3082, 3083, 1576,
-     1580, 1580, 1580, 1796, 1796, 1796, 3084, 1797, 3085, 3086,
-
-     1798, 3087, 1254, 1799, 1799, 1799, 3088, 1581, 1259, 1259,
-     1259, 1585, 1585, 1585, 1817, 1817, 1817, 2035, 2035, 2035,
-     1800, 1602, 1602, 1602, 3089, 3090, 1261, 3096, 3097, 1586,
-     3098, 1818, 3105, 3106, 1794, 1819, 1819, 1819, 1603, 1820,
-     3107, 3108, 1821, 1290, 1290, 1290, 1300, 1300, 1300, 1609,
-     1609, 1609, 1827, 1827, 1827, 3109, 1828, 1801, 3110, 1829,
-     3111, 1292, 3112, 3113, 1302, 3114, 1610, 1306, 1306, 1306,
-     1613, 1613, 1613, 1832, 1832, 1832, 3115, 1833, 3116, 3119,
-     1834, 1312, 1312, 1312, 3120, 1308, 3121, 1614, 1619, 1619,
-     1619, 1839, 1839, 1839, 3122, 1840, 3130, 3125, 1841, 1314,
-
-     1842, 1842, 1842, 1177, 3131, 1620, 3132, 1822, 3128, 3133,
-     1826, 1845, 1845, 1845, 1325, 1325, 1325, 1843, 1627, 1627,
-     1627, 3134, 1851, 1851, 1851, 3135, 1852, 1831, 1846, 1853,
-     3136, 3137, 1327, 3140, 3125, 1628, 1854, 1854, 1854, 1630,
-     1630, 1630, 1836, 1856, 1856, 1856, 3141, 1857, 3126, 3123,
-     1858, 1343, 1343, 1343, 1855, 3144, 1631, 1847, 1861, 1861,
-     1861, 1637, 1637, 1637, 1865, 1865, 1865, 3145, 1866, 1345,
-     3146, 1867, 1639, 1639, 1639, 1862, 1640, 3138, 1638, 1641,
-     1848, 1870, 1870, 1870, 1370, 1370, 1370, 1654, 1654, 1654,
-     3142, 1655, 3147, 3148, 1656, 1881, 1881, 1881, 1871, 3457,
-
-     3457, 3457, 1372, 3457, 3457, 3457, 3457, 3457, 3457, 1386,
-     1386, 1386, 1882, 1888, 1888, 1888, 3457, 1859, 3156, 3139,
-     3457, 3149, 3161, 3457, 1666, 1666, 1666, 1388, 1667, 3143,
-     1889, 1668, 3162, 3150, 1892, 1892, 1892, 1401, 1401, 1401,
-     1409, 1409, 1409, 1418, 1418, 1418, 1904, 1904, 1904, 1880,
-     1884, 1893, 1429, 1429, 1429, 1403, 3163, 3164, 1411, 3165,
-     3166, 1420, 3151, 1905, 1886, 3157, 1438, 1438, 1438, 1883,
-     1431, 1682, 1682, 1682, 3152, 1683, 1885, 3158, 1684, 1685,
-     1685, 1685, 3169, 1686, 1440, 3169, 1687, 1691, 1691, 1691,
-     1177, 1692, 1906, 3172, 1693, 1696, 1696, 1696, 3173, 1697,
-
-     1900, 1895, 1698, 1450, 1450, 1450, 1897, 3159, 3174, 1907,
-     1458, 1458, 1458, 1703, 1703, 1703, 3125, 1704, 3175, 3160,
-     1705, 1452, 1706, 1706, 1706, 3176, 1707, 3179, 1460, 1708,
-     3126, 3167, 1909, 1466, 1466, 1466, 1710, 1710, 1710, 3125,
-     1711, 1737, 1738, 1712, 3177, 1715, 1715, 1715, 3190, 1716,
-     3128, 1468, 1717, 1476, 1476, 1476, 1720, 1720, 1720, 1922,
-     1922, 1922, 3178, 1923, 1914, 3188, 1924, 1916, 1485, 1485,
-     1485, 1478, 3193, 1721, 1930, 1930, 1930, 1491, 1491, 1491,
-     1917, 1498, 1498, 1498, 3189, 3198, 1487, 1934, 1934, 1934,
-     3191, 1931, 1506, 1506, 1506, 1493, 1937, 1937, 1937, 1500,
-
-     1920, 1514, 1514, 1514, 1935, 1736, 1736, 1736, 3201, 3192,
-     1508, 3180, 3196, 1938, 1190, 1190, 1190, 1928, 3199, 1516,
-     1775, 1775, 1775, 1737, 1776, 3202, 3181, 1777, 1226, 1226,
-     1226, 3197, 1192, 1933, 1779, 1779, 1779, 3200, 1780, 3203,
-     3169, 1781, 2488, 2489, 1932, 2490, 1228, 1236, 1236, 1236,
-     3205, 3169, 1939, 2491, 1936, 3206, 1941, 1786, 1786, 1786,
-     2492, 1787, 3207, 3208, 1788, 1238, 1946, 1790, 1790, 1790,
-     3209, 1791, 3210, 1942, 1792, 1252, 1252, 1252, 1796, 1796,
-     1796, 3211, 1797, 3212, 3213, 1798, 1799, 1799, 1799, 3223,
-     1993, 1993, 1993, 1254, 1994, 1976, 3224, 1995, 1979, 1259,
-
-     1259, 1259, 3225, 1800, 2002, 2002, 2002, 2002, 2002, 2002,
-     1963, 1963, 1963, 1817, 1817, 1817, 3226, 1261, 2008, 2008,
-     2008, 3227, 2009, 3228, 3232, 2010, 3233, 1819, 1819, 1819,
-     1818, 1820, 3234, 3235, 1821, 3236, 1983, 1290, 1290, 1290,
-     2014, 2014, 2014, 1300, 1300, 1300, 3237, 1827, 1827, 1827,
-     1996, 1828, 3238, 3239, 1829, 1292, 3241, 2015, 1306, 1306,
-     1306, 1302, 1832, 1832, 1832, 3242, 1833, 3243, 2003, 1834,
-     3244, 1964, 3245, 3246, 2003, 3247, 1308, 2019, 2019, 2019,
-     1312, 1312, 1312, 3252, 2011, 1839, 1839, 1839, 3253, 1840,
-     2016, 3254, 1841, 3248, 2020, 1842, 1842, 1842, 1314, 2024,
-
-     2024, 2024, 3255, 2025, 3256, 3249, 2026, 3250, 2027, 2027,
-     2027, 3257, 1843, 1845, 1845, 1845, 2029, 2029, 2029, 3251,
-     2030, 3258, 3259, 2031, 2018, 2028, 3260, 2033, 2033, 2033,
-     1846, 1851, 1851, 1851, 3261, 1852, 3262, 3263, 1853, 1854,
-     1854, 1854, 3264, 3265, 2021, 2034, 1856, 1856, 1856, 1177,
-     1857, 3267, 3268, 1858, 1343, 1343, 1343, 1855, 1861, 1861,
-     1861, 2039, 2039, 2039, 3269, 2040, 3270, 3271, 2041, 2042,
-     2042, 2042, 1345, 3272, 3266, 1862, 1865, 1865, 1865, 3273,
-     1866, 3274, 3275, 1867, 3276, 3277, 2043, 1870, 1870, 1870,
-     2047, 2047, 2047, 3278, 2048, 3279, 3280, 2049, 3281, 3282,
-
-     2037, 2050, 2050, 2050, 1871, 2056, 2056, 2056, 1370, 1370,
-     1370, 1881, 1881, 1881, 2064, 2064, 2064, 3283, 2051, 3457,
-     3457, 3457, 2057, 2061, 2061, 2061, 1372, 2062, 1882, 3284,
-     2063, 2065, 2067, 2067, 2067, 3285, 3457, 1386, 1386, 1386,
-     1888, 1888, 1888, 2071, 2071, 2071, 3286, 2072, 3287, 2068,
-     2073, 2074, 2074, 2074, 3288, 1388, 3290, 1889, 1892, 1892,
-     1892, 3291, 2077, 2077, 2077, 3292, 2078, 3293, 2075, 2079,
-     2081, 2081, 2081, 3294, 2060, 1893, 3295, 2066, 1409, 1409,
-     1409, 3296, 1418, 1418, 1418, 1904, 1904, 1904, 2082, 3297,
-     3298, 2091, 2091, 2091, 1177, 2092, 1411, 2069, 2093, 3299,
-
-     1420, 3300, 1905, 2095, 2095, 2095, 1438, 1438, 1438, 2100,
-     2100, 2100, 3301, 3289, 2102, 2102, 2102, 3457, 3457, 3457,
-     3302, 2096, 3303, 3304, 1440, 3305, 2101, 3306, 3307, 2084,
-     2087, 2103, 3308, 3309, 3457, 1450, 1450, 1450, 1458, 1458,
-     1458, 1466, 1466, 1466, 2109, 2109, 2109, 2111, 2111, 2111,
-     1476, 1476, 1476, 1452, 3311, 3312, 1460, 2098, 3313, 1468,
-     3314, 2110, 3315, 1177, 2112, 1922, 1922, 1922, 1478, 1923,
-     3316, 3317, 1924, 1485, 1485, 1485, 1930, 1930, 1930, 2493,
-     2494, 2104, 2495, 3310, 2107, 2120, 2120, 2120, 3318, 2121,
-     2496, 1487, 2122, 1931, 1491, 1491, 1491, 2497, 3319, 1498,
-
-     1498, 1498, 2105, 1934, 1934, 1934, 2108, 2125, 2125, 2125,
-     3320, 2126, 1493, 3321, 2127, 2113, 3322, 1500, 3323, 3324,
-     1935, 2128, 2128, 2128, 2118, 1937, 1937, 1937, 2130, 2130,
-     2130, 3325, 2131, 3326, 3327, 2132, 2148, 2148, 2148, 2129,
-     3328, 3329, 1938, 1514, 1514, 1514, 2138, 2138, 2138, 1190,
-     1190, 1190, 3330, 2123, 2124, 1958, 1958, 1958, 2156, 2156,
-     2156, 1516, 3332, 2139, 1963, 1963, 1963, 1192, 2157, 2157,
-     2157, 1966, 1966, 1966, 2160, 2160, 2160, 2161, 2161, 2161,
-     1974, 1974, 1974, 3333, 1226, 1226, 1226, 2170, 2170, 2170,
-     2173, 2173, 2173, 1252, 1252, 1252, 2177, 2177, 2177, 3334,
-
-     1177, 2133, 1228, 3335, 3336, 2171, 3331, 2174, 3337, 3338,
-     2140, 1254, 3339, 2178, 1993, 1993, 1993, 3340, 1994, 3341,
-     3342, 1995, 1259, 1259, 1259, 2190, 2190, 2190, 2002, 2002,
-     2002, 2197, 2197, 2197, 2167, 3343, 2199, 2199, 2199, 3345,
-     1261, 3346, 2191, 2008, 2008, 2008, 3347, 2009, 3348, 3349,
-     2010, 3350, 2176, 2200, 1290, 1290, 1290, 2204, 2204, 2204,
-     2014, 2014, 2014, 2207, 2207, 2207, 3351, 2208, 2189, 3352,
-     2209, 3354, 1292, 3355, 2205, 3356, 3357, 2015, 1300, 1300,
-     1300, 1177, 2201, 2212, 2212, 2212, 3358, 2019, 2019, 2019,
-     2214, 2214, 2214, 3359, 2215, 3344, 1302, 2216, 1312, 1312,
-
-     1312, 2213, 3360, 2206, 2020, 3361, 3364, 2202, 2024, 2024,
-     2024, 3365, 2025, 3366, 3367, 2026, 1314, 2027, 2027, 2027,
-     2220, 2220, 2220, 3368, 2221, 3369, 1177, 2222, 2029, 2029,
-     2029, 2210, 2030, 1177, 2028, 2031, 2033, 2033, 2033, 2035,
-     2035, 2035, 1343, 1343, 1343, 2217, 2039, 2039, 2039, 1177,
-     2040, 1177, 1758, 2041, 2034, 2042, 2042, 2042, 1177, 1177,
-     1345, 2229, 2229, 2229, 1177, 2230, 3410, 1177, 2231, 2047,
-     2047, 2047, 2043, 2048, 3372, 1177, 2049, 2050, 2050, 2050,
-     2235, 2235, 2235, 1177, 2236, 3370, 1177, 2237, 2238, 2238,
-     2238, 2056, 2056, 2056, 2051, 2243, 2243, 2243, 3384, 2244,
-
-     2227, 3386, 2245, 3371, 1177, 2239, 3373, 3374, 2057, 1370,
-     1370, 1370, 2061, 2061, 2061, 1177, 2062, 1177, 1177, 2063,
-     2064, 2064, 2064, 3375, 2249, 2249, 2249, 1372, 2250, 3392,
-     3376, 2251, 2252, 2252, 2252, 1757, 3380, 2065, 2067, 2067,
-     2067, 2254, 2254, 2254, 1177, 2255, 3381, 3404, 2256, 2253,
-     1386, 1386, 1386, 1756, 1177, 2068, 3388, 2071, 2071, 2071,
-     2248, 2072, 3377, 3393, 2073, 2074, 2074, 2074, 1388, 2259,
-     2259, 2259, 3382, 2260, 1177, 3383, 2261, 2077, 2077, 2077,
-     1177, 2078, 2075, 1177, 2079, 2081, 2081, 2081, 1409, 1409,
-     1409, 2267, 2267, 2267, 1418, 1418, 1418, 2271, 2271, 2271,
-
-     3378, 2257, 1177, 2082, 1177, 1177, 1411, 1177, 2268, 2091,
-     2091, 2091, 1420, 2092, 2272, 3389, 2093, 2095, 2095, 2095,
-     2279, 2279, 2279, 2100, 2100, 2100, 2282, 2282, 2282, 1177,
-     2283, 1177, 3379, 2284, 1177, 2096, 1177, 3396, 2280, 3387,
-     2101, 1177, 3390, 2273, 2102, 2102, 2102, 2285, 2285, 2285,
-     1177, 2286, 2265, 1753, 2287, 2269, 1450, 1450, 1450, 1177,
-     3422, 2103, 1458, 1458, 1458, 1466, 1466, 1466, 2109, 2109,
-     2109, 2293, 2293, 2293, 1452, 2294, 3385, 1177, 2295, 1177,
-     1460, 3432, 3397, 1468, 3405, 2110, 2111, 2111, 2111, 2296,
-     2296, 2296, 1177, 2297, 3391, 3398, 2298, 1476, 1476, 1476,
-
-     1485, 1485, 1485, 2112, 1177, 2120, 2120, 2120, 3399, 2121,
-     1177, 2291, 2122, 1177, 3394, 1478, 3395, 1177, 1487, 1491,
-     1491, 1491, 2289, 1498, 1498, 1498, 3402, 2125, 2125, 2125,
-     2292, 2126, 1177, 1177, 2127, 1177, 1177, 1493, 2128, 2128,
-     2128, 1500, 2130, 2130, 2130, 3400, 2131, 3454, 3401, 2132,
-     1514, 1514, 1514, 2317, 2317, 2317, 2129, 2138, 2138, 2138,
-     1177, 1177, 2299, 1750, 1749, 2304, 3403, 3426, 1516, 3411,
-     2306, 2313, 2313, 2313, 2139, 2314, 2307, 3416, 2315, 1190,
-     1190, 1190, 2322, 2322, 2322, 2323, 2323, 2323, 2148, 2148,
-     2148, 2325, 2325, 2325, 1177, 3408, 2308, 1192, 2330, 2330,
-
-     2330, 2156, 2156, 2156, 2157, 2157, 2157, 2331, 2331, 2331,
-     2160, 2160, 2160, 2161, 2161, 2161, 2334, 2334, 2334, 2335,
-     2335, 2335, 2336, 2336, 2336, 2337, 2337, 2337, 1226, 1226,
-     1226, 2170, 2170, 2170, 2173, 2173, 2173, 2343, 2343, 2343,
-     3406, 2344, 3430, 2316, 2345, 1177, 1228, 1748, 1177, 2171,
-     1177, 2174, 1747, 2332, 2347, 2347, 2347, 2177, 2177, 2177,
-     2349, 2349, 2349, 1177, 2350, 3431, 1746, 2351, 1259, 1259,
-     1259, 1177, 2348, 1177, 2178, 2190, 2190, 2190, 1177, 2339,
-     2363, 2363, 2363, 3409, 2364, 1177, 1261, 2365, 2366, 2366,
-     2366, 3407, 2191, 2197, 2197, 2197, 2371, 2371, 2371, 2199,
-
-     2199, 2199, 2373, 2373, 2373, 3417, 2374, 1177, 3414, 2375,
-     1290, 1290, 1290, 2204, 2204, 2204, 2200, 2362, 2379, 2379,
-     2379, 1177, 2380, 1177, 3418, 2381, 3436, 3412, 1292, 1177,
-     2205, 2207, 2207, 2207, 3413, 2208, 1177, 1177, 2209, 1300,
-     1300, 1300, 2372, 1177, 2212, 2212, 2212, 2214, 2214, 2214,
-     3423, 2215, 1745, 3419, 2216, 1177, 1744, 1302, 1312, 1312,
-     1312, 2377, 2213, 2220, 2220, 2220, 3415, 2221, 1177, 3428,
-     2222, 1343, 1343, 1343, 3420, 1177, 1314, 2229, 2229, 2229,
-     1177, 2230, 1177, 1177, 2231, 2238, 2238, 2238, 3424, 1345,
-     2383, 2235, 2235, 2235, 1177, 2236, 3437, 1177, 2237, 2399,
-
-     2399, 2399, 2239, 2400, 3425, 3421, 2401, 1177, 2243, 2243,
-     2243, 2385, 2244, 1177, 3427, 2245, 2406, 2406, 2406, 1370,
-     1370, 1370, 3433, 2249, 2249, 2249, 2394, 2250, 3429, 3440,
-     2251, 3434, 1742, 2407, 2252, 2252, 2252, 1372, 2409, 2409,
-     2409, 1177, 2410, 1177, 3435, 2411, 2254, 2254, 2254, 1177,
-     2255, 2253, 1177, 2256, 1386, 1386, 1386, 2259, 2259, 2259,
-     1741, 2260, 1177, 1740, 2261, 1739, 2417, 2417, 2417, 2267,
-     2267, 2267, 1388, 2420, 2420, 2420, 3438, 2421, 3439, 1177,
-     2422, 3444, 1177, 2408, 2418, 1732, 2268, 1418, 1418, 1418,
-     2271, 2271, 2271, 2425, 2425, 2425, 1177, 2426, 3441, 3442,
-
-     2427, 2279, 2279, 2279, 3446, 1420, 1730, 2272, 2282, 2282,
-     2282, 3445, 2283, 1177, 3448, 2284, 1450, 1450, 1450, 2280,
-     2412, 2285, 2285, 2285, 1177, 2286, 1727, 1177, 2287, 1177,
-     1458, 1458, 1458, 3443, 1452, 1466, 1466, 1466, 2293, 2293,
-     2293, 1726, 2294, 1724, 1723, 2295, 3447, 2423, 1460, 1722,
-     2296, 2296, 2296, 1468, 2297, 1177, 3449, 2298, 1476, 1476,
-     1476, 1719, 2443, 2443, 2443, 1714, 1713, 2438, 3457, 3457,
-     3457, 2441, 3457, 3457, 3457, 3450, 1478, 3451, 2442, 2444,
-     3457, 3457, 3457, 1701, 1699, 3457, 1485, 1485, 1485, 3457,
-     1491, 1491, 1491, 2451, 2451, 2451, 2440, 3457, 1514, 1514,
-
-     1514, 2457, 2457, 2457, 1487, 2454, 2454, 2454, 1493, 1177,
-     3454, 2452, 1695, 2313, 2313, 2313, 1516, 2314, 1694, 2445,
-     2315, 1177, 1690, 1177, 1190, 1190, 1190, 2317, 2317, 2317,
-     2459, 2459, 2459, 2460, 2460, 2460, 2446, 1688, 1680, 2447,
-     1679, 3452, 1192, 2322, 2322, 2322, 2323, 2323, 2323, 1678,
-     2450, 2448, 2325, 2325, 2325, 2464, 2464, 2464, 1677, 1675,
-     2453, 2466, 2466, 2466, 2467, 2467, 2467, 2330, 2330, 2330,
-     2331, 2331, 2331, 2334, 2334, 2334, 2335, 2335, 2335, 2336,
-     2336, 2336, 1674, 2458, 2337, 2337, 2337, 2471, 2471, 2471,
-     2474, 2474, 2474, 2343, 2343, 2343, 1177, 2344, 1672, 1670,
-
-     2345, 3457, 3457, 3457, 1669, 2472, 1665, 2475, 2347, 2347,
-     2347, 1664, 2349, 2349, 2349, 1663, 2350, 1662, 3457, 2351,
-     1259, 1259, 1259, 2363, 2363, 2363, 2348, 2364, 3453, 1660,
-     2365, 2366, 2366, 2366, 2498, 2498, 2498, 1659, 1261, 2371,
-     2371, 2371, 2373, 2373, 2373, 1658, 2374, 1657, 1650, 2375,
-     1290, 1290, 1290, 2379, 2379, 2379, 1649, 2380, 1648, 1647,
-     2381, 2507, 2507, 2507, 1312, 1312, 1312, 2476, 1292, 2509,
-     2509, 2509, 2519, 2519, 2519, 1343, 1343, 1343, 1646, 2508,
-     1645, 2487, 1314, 2399, 2399, 2399, 2510, 2400, 1644, 1643,
-     2401, 1642, 1636, 1345, 1635, 1634, 2504, 2526, 2526, 2526,
-
-     2406, 2406, 2406, 2531, 2531, 2531, 1633, 2532, 1626, 1625,
-     2533, 2534, 2534, 2534, 2527, 2511, 1623, 2407, 2409, 2409,
-     2409, 1622, 2410, 1621, 1618, 2411, 2536, 2536, 2536, 2535,
-     2417, 2417, 2417, 1617, 1607, 2520, 2542, 2542, 2542, 2420,
-     2420, 2420, 1606, 2421, 2537, 1605, 2422, 1601, 2418, 1418,
-     1418, 1418, 1600, 2543, 1599, 2545, 2545, 2545, 2425, 2425,
-     2425, 1598, 2426, 1597, 1596, 2427, 1595, 1420, 3457, 3457,
-     3457, 1594, 2546, 3457, 3457, 3457, 3457, 3457, 3457, 2556,
-     2556, 2556, 2560, 2560, 2560, 3457, 2558, 2558, 2558, 1592,
-     3457, 1591, 1589, 3457, 1458, 1458, 1458, 1588, 1587, 2561,
-
-     2544, 2547, 1584, 1582, 2559, 1579, 1466, 1466, 1466, 2443,
-     2443, 2443, 1460, 1476, 1476, 1476, 1577, 1574, 2565, 2565,
-     2565, 1565, 2566, 2548, 1468, 2567, 2444, 2554, 2568, 2568,
-     2568, 1478, 1563, 1556, 2549, 3457, 3457, 3457, 3457, 3457,
-     3457, 2572, 2572, 2572, 1554, 2569, 2574, 2574, 2574, 1553,
-     2564, 1552, 3457, 1551, 2562, 3457, 1491, 1491, 1491, 2573,
-     2451, 2451, 2451, 1514, 1514, 1514, 1550, 2563, 1549, 2454,
-     2454, 2454, 1548, 1547, 1493, 2457, 2457, 2457, 2452, 1546,
-     1545, 1516, 2580, 2580, 2580, 1542, 2570, 1177, 1541, 2571,
-     2459, 2459, 2459, 2460, 2460, 2460, 2584, 2584, 2584, 1540,
-
-     2581, 2464, 2464, 2464, 2466, 2466, 2466, 2467, 2467, 2467,
-     2471, 2471, 2471, 2474, 2474, 2474, 2590, 2590, 2590, 1539,
-     2591, 1538, 2575, 2592, 1259, 1259, 1259, 2576, 2472, 1537,
-     2475, 2577, 2498, 2498, 2498, 2619, 2619, 2619, 1290, 1290,
-     1290, 1536, 1261, 2507, 2507, 2507, 2509, 2509, 2509, 1535,
-     2625, 2625, 2625, 1533, 2626, 1532, 1292, 2627, 2628, 2628,
-     2628, 2508, 1531, 2510, 2634, 2634, 2634, 2519, 2519, 2519,
-     1343, 1343, 1343, 2526, 2526, 2526, 2629, 1530, 2642, 2642,
-     2642, 2635, 2643, 1529, 2604, 2644, 1528, 1527, 1345, 1525,
-     2527, 2646, 2646, 2646, 2531, 2531, 2531, 1524, 2532, 1523,
-
-     1522, 2533, 1521, 1520, 2622, 2534, 2534, 2534, 2647, 1519,
-     2536, 2536, 2536, 2655, 2655, 2655, 2542, 2542, 2542, 2661,
-     2661, 2661, 1177, 2535, 2556, 2556, 2556, 2636, 2537, 1513,
-     2656, 1505, 1490, 2543, 2658, 2658, 2658, 2662, 2659, 1489,
-     1484, 2660, 2545, 2545, 2545, 2663, 2663, 2663, 1483, 2664,
-     1482, 1481, 2665, 2671, 2671, 2671, 2558, 2558, 2558, 2546,
-     2560, 2560, 2560, 1480, 2675, 2675, 2675, 1454, 2676, 1442,
-     2672, 2677, 1428, 1427, 2559, 1426, 1422, 2561, 2678, 2678,
-     2678, 1466, 1466, 1466, 1417, 1476, 1476, 1476, 2565, 2565,
-     2565, 1413, 2566, 1405, 1400, 2567, 2679, 1399, 1393, 1468,
-
-     2568, 2568, 2568, 1478, 2682, 2682, 2682, 1390, 2683, 1369,
-     1368, 2684, 2685, 2685, 2685, 1367, 1366, 2569, 2687, 2687,
-     2687, 2572, 2572, 2572, 2574, 2574, 2574, 1365, 1364, 2686,
-     1363, 1362, 2689, 2689, 2689, 2688, 1514, 1514, 1514, 2573,
-     2580, 2580, 2580, 2584, 2584, 2584, 1361, 1360, 2680, 2681,
-     2690, 2697, 2697, 2697, 1516, 2701, 2701, 2701, 2581, 2590,
-     2590, 2590, 1354, 2591, 1347, 1336, 2592, 1259, 1259, 1259,
-     1331, 1330, 2702, 2619, 2619, 2619, 1290, 1290, 1290, 2738,
-     2738, 2738, 2625, 2625, 2625, 1261, 2626, 1324, 1323, 2627,
-     2628, 2628, 2628, 1322, 1292, 1318, 1317, 2691, 2741, 2741,
-
-     2741, 2634, 2634, 2634, 1316, 2743, 2743, 2743, 2629, 2744,
-     1311, 1310, 2745, 1305, 1304, 2742, 1299, 1295, 2635, 2746,
-     2746, 2746, 2751, 2751, 2751, 1289, 1288, 2720, 2642, 2642,
-     2642, 1284, 2643, 1283, 1282, 2644, 1281, 2747, 1280, 2752,
-     2646, 2646, 2646, 1279, 2755, 2755, 2755, 2737, 2756, 1278,
-     1277, 2757, 2764, 2764, 2764, 1276, 1275, 2647, 2655, 2655,
-     2655, 2766, 2766, 2766, 1274, 2767, 1273, 1272, 2768, 2765,
-     2769, 2769, 2769, 1266, 1258, 2656, 2658, 2658, 2658, 1257,
-     2659, 1256, 1251, 2660, 2661, 2661, 2661, 2770, 2663, 2663,
-     2663, 1250, 2664, 1249, 1246, 2665, 2671, 2671, 2671, 2774,
-
-     2774, 2774, 2662, 2775, 1240, 1235, 2776, 2777, 2777, 2777,
-     2779, 2779, 2779, 2672, 2675, 2675, 2675, 1234, 2676, 1230,
-     1225, 2677, 1224, 1223, 2778, 1222, 1221, 2780, 2678, 2678,
-     2678, 1466, 1466, 1466, 1476, 1476, 1476, 2682, 2682, 2682,
-     1220, 2683, 1219, 1217, 2684, 1216, 2679, 1215, 1214, 1468,
-     1213, 1212, 1478, 2685, 2685, 2685, 2789, 2789, 2789, 1211,
-     2790, 1210, 1209, 2791, 2687, 2687, 2687, 2792, 2792, 2792,
-     2686, 2793, 1208, 1205, 2794, 2689, 2689, 2689, 1514, 1514,
-     1514, 2688, 2800, 2800, 2800, 2697, 2697, 2697, 2701, 2701,
-     2701, 1204, 1203, 2690, 1202, 2788, 1516, 2787, 1201, 2804,
-
-     2804, 2804, 1200, 2805, 1199, 2702, 2806, 1259, 1259, 1259,
-     2838, 2838, 2838, 2840, 2840, 2840, 1290, 1290, 1290, 2738,
-     2738, 2738, 2843, 2843, 2843, 1261, 2845, 2845, 2845, 1198,
-     2841, 2741, 2741, 2741, 1292, 2800, 2800, 2800, 1197, 2844,
-     2795, 1196, 1189, 2846, 1188, 2848, 2848, 2848, 2742, 2849,
-     1187, 1186, 2850, 2743, 2743, 2743, 1185, 2744, 2824, 1184,
-     2745, 2746, 2746, 2746, 2853, 2853, 2853, 2751, 2751, 2751,
-     1183, 1180, 2847, 2855, 2855, 2855, 1178, 2856, 2842, 2747,
-     2857, 2854, 1177, 1175, 2752, 2858, 2858, 2858, 2755, 2755,
-     2755, 1173, 2756, 1170, 1168, 2757, 2764, 2764, 2764, 2867,
-
-     2867, 2867, 2859, 2868, 1165, 1161, 2869, 2766, 2766, 2766,
-     1159, 2767, 1158, 2765, 2768, 2769, 2769, 2769, 2870, 2870,
-     2870, 1157, 2871, 1155, 1154, 2872, 2874, 2874, 2874, 2774,
-     2774, 2774, 2770, 2775, 1153, 1152, 2776, 2777, 2777, 2777,
-     2877, 2877, 2877, 2875, 2878, 1151, 1150, 2879, 2779, 2779,
-     2779, 2880, 2880, 2880, 2778, 2881, 1148, 1147, 2882, 1466,
-     1466, 1466, 1476, 1476, 1476, 2780, 2789, 2789, 2789, 1146,
-     2790, 1145, 1143, 2791, 2792, 2792, 2792, 1468, 2793, 1142,
-     1478, 2794, 2895, 2895, 2895, 2899, 2899, 2899, 2902, 2902,
-     2902, 2804, 2804, 2804, 1141, 2805, 1137, 1136, 2806, 1134,
-
-     2896, 1133, 2900, 1737, 2913, 2913, 2913, 1259, 1259, 1259,
-     2889, 2838, 2838, 2838, 2937, 2937, 2937, 2840, 2840, 2840,
-     1132, 2914, 1290, 1290, 1290, 1261, 2938, 2938, 2938, 2890,
-     2939, 1131, 1130, 2940, 2841, 2843, 2843, 2843, 1129, 1127,
-     1292, 2942, 2942, 2942, 1126, 2943, 1125, 1124, 2944, 2845,
-     2845, 2845, 2844, 2945, 2945, 2945, 2923, 2946, 1122, 1121,
-     2947, 2848, 2848, 2848, 1120, 2849, 2846, 1117, 2850, 2853,
-     2853, 2853, 1116, 2941, 2951, 2951, 2951, 1114, 2952, 1111,
-     1110, 2953, 1106, 2855, 2855, 2855, 2854, 2856, 1105, 1103,
-     2857, 2858, 2858, 2858, 2954, 2954, 2954, 1102, 2955, 1101,
-
-     1098, 2956, 2867, 2867, 2867, 1097, 2868, 1096, 2859, 2869,
-     2870, 2870, 2870, 1095, 2871, 1093, 1092, 2872, 2874, 2874,
-     2874, 2965, 2965, 2965, 1091, 2966, 1090, 1089, 2967, 2877,
-     2877, 2877, 1084, 2878, 1082, 2875, 2879, 2880, 2880, 2880,
-     1081, 2881, 1080, 1079, 2882, 2983, 2983, 2983, 1476, 1476,
-     1476, 2895, 2895, 2895, 2991, 2991, 2991, 2899, 2899, 2899,
-     2993, 2993, 2993, 2984, 2994, 1078, 1478, 2995, 1077, 2896,
-     1076, 2992, 1737, 1075, 2900, 1737, 1074, 1073, 1737, 2996,
-     2996, 2996, 2902, 2902, 2902, 2997, 2997, 2997, 2998, 2998,
-     2998, 2913, 2913, 2913, 3007, 3007, 3007, 1072, 3008, 1069,
-
-     1066, 3009, 1259, 1259, 1259, 3025, 3025, 3025, 2914, 2937,
-     2937, 2937, 1065, 1064, 2985, 2938, 2938, 2938, 1058, 2939,
-     1261, 1057, 2940, 3026, 3026, 3026, 2942, 2942, 2942, 1055,
-     2943, 1052, 1050, 2944, 1049, 2945, 2945, 2945, 1048, 2946,
-     1043, 3027, 2947, 2951, 2951, 2951, 1042, 2952, 1040, 1039,
-     2953, 2954, 2954, 2954, 1038, 2955, 1036, 1035, 2956, 3031,
-     3031, 3031, 3039, 3039, 3039, 2965, 2965, 2965, 3016, 2966,
-     1034, 1032, 2967, 3041, 3041, 3041, 3032, 1029, 1027, 3040,
-     2983, 2983, 2983, 1476, 1476, 1476, 2991, 2991, 2991, 1025,
-     3042, 1024, 3061, 3061, 3061, 1021, 3062, 1016, 2984, 3063,
-
-     1015, 1478, 1012, 2992, 1737, 2993, 2993, 2993, 1011, 2994,
-     1737, 1010, 2995, 2996, 2996, 2996, 2997, 2997, 2997, 2998,
-     2998, 2998, 1007, 1737, 3007, 3007, 3007, 1006, 3008, 1004,
-     1001, 3009,  999,  998, 3055, 1735, 1735, 1735, 1735, 1735,
-     1735, 1735, 1735, 1735,  997,  996, 1735, 3080, 3080, 3080,
-      994, 1735, 1735, 1735, 1737, 1735, 3025, 3025, 3025, 3026,
-     3026, 3026, 3031, 3031, 3031, 3081, 3091, 3091, 3091,  993,
-     3092,  992,  991, 3093, 3094, 3094, 3094, 3027,  990, 3032,
-     1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735,
-     1735, 3095,  989, 1735, 3039, 3039, 3039,  986, 1735, 1735,
-
-     1735, 1737, 1735, 3099, 3099, 3099,  985, 3100,  984,  981,
-     3101, 3040, 3041, 3041, 3041, 3102, 3102, 3102,  978, 3103,
-      977,  975, 3104, 3117, 3117, 3117,  974, 1735, 1735, 3042,
-     3061, 3061, 3061,  971, 3062,  968,  965, 3063,  964,  956,
-      955, 3118,  954, 3080, 3080, 3080,  953,  947, 1737, 1735,
-     1735, 1735, 1735, 1735, 3129, 1735, 1735, 1735,  946,  945,
-     1735, 3081, 3094, 3094, 3094, 1735, 1735, 1735, 1737, 1735,
-     3091, 3091, 3091,  943, 3092,  942,  941, 3093,  940, 3095,
-     3153, 3153, 3153,  939, 3154,  938,  933, 3155, 3117, 3117,
-     3117, 3171, 3171, 3171, 1735, 1735, 1735, 1735, 1735, 1735,
-
-     1735, 1735, 1735, 1735, 3129,  930, 3118, 1735,  932, 1737,
-     1738,  927, 1735, 1735, 1735, 1737, 1735, 3099, 3099, 3099,
-      926, 3100,  924,  922, 3101, 3102, 3102, 3102,  921, 3103,
-      919,  917, 3104, 3182, 3182, 3182, 3184, 3184, 3184,  915,
-      913, 1735, 1735, 3186, 3186, 3186,  911, 3153, 3153, 3153,
-     3183, 3154,  908, 3185, 3155, 3194, 3194, 3194,  907,  906,
-     3187, 3204, 3204, 3204, 3171, 3171, 3171, 3182, 3182, 3182,
-      905,  904, 3195, 3214, 3214, 3214,  902, 3215,  900, 1177,
-     3216,  899, 1737,  898, 3183, 3184, 3184, 3184, 3217, 3217,
-     3217,  896, 3218,  894,  893, 3219, 3186, 3186, 3186, 3220,
-
-     3220, 3220, 3185, 3221,  891,  889, 3222, 3194, 3194, 3194,
-     3229, 3229, 3229, 3187, 3230, 1941,  888, 3231, 3204, 3204,
-     3204, 3214, 3214, 3214, 3195, 3215,  886,  882, 3216,  881,
-     3217, 3217, 3217,  879, 3218,  874, 1177, 3219, 3220, 3220,
-     3220,  872, 3221,  868,  867, 3222, 3229, 3229, 3229,  866,
-     3230,  864,  862, 3231,  861, 3240, 3353, 3353, 3353, 3353,
-     3353, 3353,  860, 3362,  858,  856, 3363, 3455, 3455, 3455,
-     3455, 3455, 3455,  855, 1177,  853,  851, 1177,  850,  849,
-      848,  847,  846,  845,  843, 3456,  841,  840, 3456,  264,
-      264,  264,  264,  264,  264,  264,  264,  264,  265,  265,
-
-      265,  265,  265,  265,  265,  265,  265,  270,  270,  270,
-      270,  270,  270,  270,  270,  270,  273,  273,  273,  273,
-      273,  273,  273,  273,  273,  276,  276,  276,  276,  276,
-      276,  276,  276,  276,  279,  279,  279,  279,  279,  279,
-      279,  279,  279,  286,  286,  286,  286,  286,  286,  286,
-      286,  286,  294,  294,  294,  294,  294,  294,  294,  294,
-      294,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      310,  310,  310,  310,  310,  310,  310,  310,  310,  314,
-      314,  314,  314,  314,  314,  314,  314,  314,  321,  321,
-      321,  321,  321,  321,  321,  321,  321,  332,  332,  332,
-
-      332,  332,  332,  332,  332,  332,  340,  340,  340,  340,
-      340,  340,  340,  340,  340,  346,  346,  346,  346,  346,
-      346,  346,  346,  346,  352,  352,  352,  352,  352,  352,
-      352,  352,  352,  358,  358,  358,  358,  358,  358,  358,
-      358,  358,  363,  363,  363,  363,  363,  363,  363,  363,
-      363,  382,  382,  382,  382,  382,  382,  382,  382,  382,
-      389,  389,  389,  389,  389,  389,  389,  389,  389,  397,
-      397,  397,  397,  397,  397,  397,  397,  397,  403,  403,
-      403,  403,  403,  403,  403,  403,  403,  410,  410,  410,
-      410,  410,  410,  410,  410,  410,  415,  415,  415,  415,
-
-      415,  415,  415,  415,  415,  421,  421,  421,  421,  421,
-      421,  421,  421,  421,  426,  426,  426,  426,  426,  426,
-      426,  426,  426,  432,  432,  432,  432,  432,  432,  432,
-      432,  432,  440,  440,  440,  440,  440,  440,  440,  440,
-      440,  448,  448,  448,  448,  448,  448,  448,  448,  448,
-      452,  452,  452,  452,  452,  452,  452,  452,  452,  458,
-      458,  458,  458,  458,  458,  458,  458,  458,  464,  464,
-      464,  464,  464,  464,  464,  464,  464,  482,  482,  482,
-      482,  482,  482,  482,  482,  482,  489,  489,  489,  489,
-      489,  489,  489,  489,  489,  498,  498,  498,  498,  498,
-
-      498,  498,  498,  498,  504,  504,  504,  504,  504,  504,
-      504,  504,  504,  514,  514,  514,  514,  514,  514,  514,
-      514,  514,  520,  520,  520,  520,  520,  520,  520,  520,
-      520,  525,  525,  525,  525,  525,  525,  525,  525,  525,
-      531,  531,  531,  531,  531,  531,  531,  531,  531,  537,
-      537,  537,  537,  537,  537,  537,  537,  537,  543,  543,
-      543,  543,  543,  543,  543,  543,  543,  550,  550,  550,
-      550,  550,  550,  550,  550,  550,  557,  557,  557,  557,
-      557,  557,  557,  557,  557,  562,  562,  562,  562,  562,
-      562,  562,  562,  562,  570,  570,  570,  570,  570,  570,
-
-      570,  570,  570,  576,  576,  576,  576,  576,  576,  576,
-      576,  576,  583,  583,  583,  583,  583,  583,  583,  583,
-      583,  588,  588,  588,  588,  588,  588,  588,  588,  588,
-      594,  594,  594,  594,  594,  594,  594,  594,  594,  599,
-      599,  599,  599,  599,  599,  599,  599,  599,  606,  606,
-      606,  606,  606,  606,  606,  606,  606,  612,  612,  612,
-      612,  612,  612,  612,  612,  612,  619,  619,  619,  619,
-      619,  619,  619,  619,  619,  627,  627,  627,  627,  627,
-      627,  627,  627,  627,  635,  635,  635,  635,  635,  635,
-      635,  635,  635,  639,  639,  639,  639,  639,  639,  639,
-
-      639,  639,  645,  645,  645,  645,  645,  645,  645,  645,
-      645,  649,  649,  649,  649,  649,  649,  649,  649,  649,
-      656,  656,  656,  656,  656,  656,  656,  656,  656,  661,
-      661,  661,  661,  661,  661,  661,  661,  661,  667,  667,
-      667,  667,  667,  667,  667,  667,  667,  672,  672,  672,
-      672,  672,  672,  672,  672,  672,  692,  692,  692,  837,
-      836,  835,  692,  719,  719,  719,  833,  831,  820,  719,
-      723,  723,  723,  819,  816,  814,  723,  731,  731,  731,
-      812,  811,  810,  731,  742,  742,  742,  808,  806,  804,
-      742,  748,  748,  748,  803,  801,  798,  748,  771,  771,
-
-      771,  797,  796,  794,  771,  779,  779,  779,  792,  791,
-      789,  779,  785,  785,  785,  787,  786,  784,  785,  790,
-      790,  790,  782,  781,  780,  790,  795,  795,  795,  778,
-      775,  774,  795,  805,  805,  805,  773,  772,  770,  805,
-      809,  809,  809, 3457,  717,  750,  809,  815,  815,  815,
-      749,  747,  745,  815,  834,  834,  834,  744,  743,  741,
-      834,  844,  844,  844,  737,  733,  732,  844,  854,  854,
-      854,  730,  729,  726,  854,  859,  859,  859,  725,  724,
-      722,  859,  865,  865,  865,  721,  720,  718,  865,  873,
-      873,  873,  713, 3457,  693,  873,  880,  880,  880,  691,
-
-      689,  683,  880,  887,  887,  887,  682,  683,  682,  887,
-      892,  892,  892,  681,  680, 3457,  892,  897,  897,  897,
-     3457, 3457, 3457,  897,  903,  903,  903, 3457, 3457, 3457,
-      903,  912,  912,  912, 3457, 3457, 3457,  912,  916,  916,
-      916, 3457, 3457, 3457,  916,  920,  920,  920, 3457, 3457,
-     3457,  920,  925,  925,  925, 3457, 3457, 3457,  925,  929,
-      929,  929,  929,  929,  929,  929, 3457,  929,  692,  692,
-      692, 3457, 3457, 3457,  692,  944, 3457, 3457, 3457,  944,
-      719,  719,  719, 3457, 3457, 3457,  719,  976, 3457, 3457,
-     3457,  976,  723,  723,  723, 3457, 3457, 3457,  723,  983,
-
-     3457, 3457, 3457,  983,  731,  731,  731, 3457, 3457, 3457,
-      731,  995, 3457, 3457, 3457,  995,  742,  742,  742, 3457,
-     3457, 3457,  742, 1000, 3457, 3457, 3457, 1000,  748,  748,
-      748, 3457, 3457, 3457,  748, 1005, 3457, 3457, 3457, 1005,
-      771,  771,  771, 3457, 3457, 3457,  771, 1026, 3457, 3457,
-     3457, 1026,  779,  779,  779, 3457, 3457, 3457,  779, 1033,
-     3457, 3457, 3457, 1033,  785,  785,  785, 3457, 3457, 3457,
-      785, 1037, 3457, 3457, 3457, 1037,  790,  790,  790, 3457,
-     3457, 3457,  790, 1041, 3457, 3457, 3457, 1041,  795,  795,
-      795, 3457, 3457, 3457,  795, 1051, 3457, 3457, 3457, 1051,
-
-      805,  805,  805, 3457, 3457, 3457,  805, 1056, 3457, 3457,
-     3457, 1056,  809,  809,  809, 3457, 3457, 3457,  809, 1063,
-     3457, 3457, 3457, 1063,  815,  815,  815, 3457, 3457, 3457,
-      815, 1083, 3457, 3457, 3457, 1083,  834,  834,  834, 3457,
-     3457, 3457,  834, 1094, 3457, 3457, 3457, 1094,  844,  844,
-      844, 3457, 3457, 3457,  844, 1104, 3457, 3457, 3457, 1104,
-      854,  854,  854, 3457, 3457, 3457,  854, 1109, 3457, 3457,
-     3457, 1109,  859,  859,  859, 3457, 3457, 3457,  859, 1115,
-     3457, 3457, 3457, 1115,  865,  865,  865, 3457, 3457, 3457,
-      865, 1123, 3457, 3457, 3457, 1123,  873,  873,  873, 3457,
-
-     3457, 3457,  873, 1128, 3457, 3457, 3457, 1128,  880,  880,
-      880, 3457, 3457, 3457,  880, 1135, 3457, 3457, 3457, 1135,
-      887,  887,  887, 3457, 3457, 3457,  887, 1140, 3457, 3457,
-     3457, 1140,  892,  892,  892, 3457, 3457, 3457,  892, 1144,
-     3457, 3457, 3457, 1144,  897,  897,  897, 3457, 3457, 3457,
-      897, 1149, 3457, 3457, 3457, 1149,  903,  903,  903, 3457,
-     3457, 3457,  903, 1156, 3457, 3457, 3457, 1156,  912,  912,
-      912, 3457, 3457, 3457,  912, 1160, 3457, 3457, 3457, 1160,
-      916,  916,  916, 3457, 3457, 3457,  916, 1164, 3457, 3457,
-     3457, 1164,  920,  920,  920, 3457, 3457, 3457,  920, 1169,
-
-     3457, 3457, 3457, 1169,  925,  925,  925, 3457, 3457, 3457,
-      925, 1174, 3457, 3457, 3457, 1174, 1176, 1176, 1176, 1176,
-     1176, 1176, 1176, 1176, 1176, 1182, 3457, 3457, 3457, 3457,
-     1182,  692,  692,  692, 3457, 3457, 3457,  692, 1191, 1191,
-     1191, 1191, 3457, 3457, 1191, 1191,  719,  719,  719, 3457,
-     3457, 3457,  719, 1227, 1227, 1227, 1227, 3457, 3457, 1227,
-     1227,  723,  723,  723, 3457, 3457, 3457,  723, 1237, 1237,
-     1237, 1237, 3457, 3457, 1237, 1237,  731,  731,  731, 3457,
-     3457, 3457,  731, 1253, 1253, 1253, 1253, 3457, 3457, 1253,
-     1253,  742,  742,  742, 3457, 3457, 3457,  742, 1260, 1260,
-
-     1260, 1260, 3457, 3457, 1260, 1260,  748,  748,  748, 3457,
-     3457, 3457,  748, 1268, 1268, 1268, 1268, 3457, 3457, 1268,
-     1268,  771,  771,  771, 3457, 3457, 3457,  771, 1291, 1291,
-     1291, 1291, 3457, 3457, 1291, 1291,  779,  779,  779, 3457,
-     3457, 3457,  779, 1301, 1301, 1301, 1301, 3457, 3457, 1301,
-     1301,  785,  785,  785, 3457, 3457, 3457,  785, 1307, 1307,
-     1307, 1307, 3457, 3457, 1307, 1307,  790,  790,  790, 3457,
-     3457, 3457,  790, 1313, 1313, 1313, 1313, 3457, 3457, 1313,
-     1313,  795,  795,  795, 3457, 3457, 3457,  795, 1326, 1326,
-     1326, 1326, 3457, 3457, 1326, 1326,  805,  805,  805, 3457,
-
-     3457, 3457,  805, 1333, 1333, 1333, 1333, 3457, 3457, 1333,
-     1333,  809,  809,  809, 3457, 3457, 3457,  809, 1344, 1344,
-     1344, 1344, 3457, 3457, 1344, 1344,  815,  815,  815, 3457,
-     3457, 3457,  815, 1371, 1371, 1371, 1371, 3457, 3457, 1371,
-     1371,  834,  834,  834,  834, 3457,  834, 3457,  834, 1387,
-     1387, 1387, 1387, 3457, 3457, 1387, 1387,  844,  844,  844,
-     3457, 3457, 3457,  844, 1402, 1402, 1402, 1402, 3457, 3457,
-     1402, 1402,  854,  854,  854, 3457, 3457, 3457,  854, 1410,
-     1410, 1410, 1410, 3457, 3457, 1410, 1410,  859,  859,  859,
-     3457, 3457, 3457,  859, 1419, 1419, 1419, 1419, 3457, 3457,
-
-     1419, 1419,  865,  865,  865, 3457, 3457, 3457,  865, 1430,
-     1430, 1430, 1430, 3457, 3457, 1430, 1430,  873,  873,  873,
-      873, 3457,  873, 3457,  873, 1439, 1439, 1439, 1439, 3457,
-     3457, 1439, 1439,  880,  880,  880,  880, 3457,  880, 3457,
-      880, 1451, 1451, 1451, 1451, 3457, 3457, 1451, 1451,  887,
-      887,  887, 3457, 3457, 3457,  887, 1459, 1459, 1459, 1459,
-     3457, 3457, 1459, 1459,  892,  892,  892,  892, 3457,  892,
-     3457,  892, 1467, 1467, 1467, 1467, 3457, 3457, 1467, 1467,
-      897,  897,  897,  897, 3457,  897, 3457,  897, 1477, 1477,
-     1477, 1477, 3457, 3457, 1477, 1477,  903,  903,  903, 3457,
-
-     3457, 3457,  903, 1486, 1486, 1486, 1486, 3457, 3457, 1486,
-     1486,  912,  912,  912, 3457, 3457, 3457,  912, 1492, 1492,
-     1492, 1492, 3457, 3457, 1492, 1492, 1499, 1499, 1499, 1499,
-     3457, 3457, 1499, 1499,  920,  920,  920, 3457, 3457, 3457,
-      920, 1507, 1507, 1507, 1507, 3457, 3457, 1507, 1507,  925,
-      925,  925, 3457, 3457, 3457,  925, 1515, 1515, 1515, 1515,
-     3457, 3457, 1515, 1515, 1176, 1176, 1176, 1176, 1176, 1176,
-     1176, 1176, 1176, 1182, 3457, 1182, 3457, 3457, 1182,  692,
-      692,  692, 3457, 3457, 3457,  692, 1191, 1191, 1191, 1191,
-     3457, 3457, 1191, 1191,  719,  719,  719,  719, 3457,  719,
-
-     3457,  719, 1227, 1227, 1227, 1227, 3457, 3457, 1227, 1227,
-      723,  723,  723,  723, 3457,  723, 3457,  723, 1237, 1237,
-     1237, 1237, 3457, 3457, 1237, 1237,  731,  731,  731, 3457,
-     3457, 3457,  731, 1253, 1253, 1253, 1253, 3457, 3457, 1253,
-     1253,  742,  742,  742, 3457, 3457, 3457,  742, 1260, 1260,
-     1260, 1260, 3457, 3457, 1260, 1260,  748,  748,  748, 3457,
-     3457, 3457,  748, 1268, 1268, 1268, 1268, 3457, 3457, 1268,
-     1268,  771,  771,  771, 3457, 3457, 3457,  771, 1291, 1291,
-     1291, 1291, 3457, 3457, 1291, 1291,  779,  779,  779, 3457,
-     3457, 3457,  779, 1301, 1301, 1301, 1301, 3457, 3457, 1301,
-
-     1301,  785,  785,  785,  785, 3457,  785, 3457,  785, 1307,
-     1307, 1307, 1307, 3457, 3457, 1307, 1307,  790,  790,  790,
-      790, 3457,  790, 3457,  790, 1313, 1313, 1313, 1313, 3457,
-     3457, 1313, 1313,  795,  795,  795, 3457, 3457, 3457,  795,
-     1326, 1326, 1326, 1326, 3457, 3457, 1326, 1326,  805,  805,
-      805,  805, 3457,  805, 3457,  805, 1333, 1333, 1333, 1333,
-     3457, 3457, 1333, 1333,  809,  809,  809,  809, 3457,  809,
-     3457,  809, 1344, 1344, 1344, 1344, 3457, 3457, 1344, 1344,
-      815,  815,  815, 3457, 3457, 3457,  815, 1371, 1371, 1371,
-     1371, 3457, 3457, 1371, 1371,  834,  834,  834, 3457, 3457,
-
-     3457,  834, 1387, 1387, 1387, 1387, 3457, 3457, 1387, 1387,
-      844,  844,  844, 3457, 3457, 3457,  844, 1402, 1402, 1402,
-     1402, 3457, 3457, 1402, 1402,  854,  854,  854, 3457, 3457,
-     3457,  854, 1410, 1410, 1410, 1410, 3457, 3457, 1410, 1410,
-      859,  859,  859, 3457, 3457, 3457,  859, 1419, 1419, 1419,
-     1419, 3457, 3457, 1419, 1419,  865,  865,  865, 3457, 3457,
-     3457,  865, 1430, 1430, 1430, 1430, 3457, 3457, 1430, 1430,
-      873,  873,  873, 3457, 3457, 3457,  873, 1439, 1439, 1439,
-     1439, 3457, 3457, 1439, 1439,  880,  880,  880, 3457, 3457,
-     3457,  880, 1451, 1451, 1451, 1451, 3457, 3457, 1451, 1451,
-
-      887,  887,  887, 3457, 3457, 3457,  887, 1459, 1459, 1459,
-     1459, 3457, 3457, 1459, 1459, 1467, 1467, 1467, 1467, 3457,
-     3457, 1467, 1467,  897,  897,  897, 3457, 3457, 3457,  897,
-     1477, 1477, 1477, 1477, 3457, 3457, 1477, 1477,  903,  903,
-      903, 3457, 3457, 3457,  903, 1486, 1486, 1486, 1486, 3457,
-     3457, 1486, 1486,  912,  912,  912, 3457, 3457, 3457,  912,
-     1492, 1492, 1492, 1492, 3457, 3457, 1492, 1492, 1499, 1499,
-     1499, 1499, 3457, 3457, 1499, 1499,  920,  920,  920, 3457,
-     3457, 3457,  920, 1507, 1507, 1507, 1507, 3457, 3457, 1507,
-     1507,  925,  925,  925, 3457, 3457, 3457,  925, 1515, 1515,
-
-     1515, 1515, 3457, 3457, 1515, 1515, 1176, 1176, 1176, 1176,
-     1176, 1176, 1176, 1176, 1176, 1735, 1735, 1735, 1735, 1735,
-     1735, 1735, 1735, 1735,  692,  692,  692, 3457, 3457, 3457,
-      692, 1191, 1191, 1191, 1191, 3457, 3457, 1191, 1191, 1227,
-     1227, 1227, 1227, 3457, 3457, 1227, 1227,  723,  723,  723,
-     3457, 3457, 3457,  723, 1237, 1237, 1237, 1237, 3457, 3457,
-     1237, 1237,  731,  731,  731, 3457, 3457, 3457,  731, 1253,
-     1253, 1253, 1253, 3457, 3457, 1253, 1253,  742,  742,  742,
-     3457, 3457, 3457,  742, 1260, 1260, 1260, 1260, 3457, 3457,
-     1260, 1260,  748,  748,  748, 3457, 3457, 3457,  748,  771,
-
-      771,  771, 3457, 3457, 3457,  771, 1291, 1291, 1291, 1291,
-     3457, 3457, 1291, 1291,  779,  779,  779, 3457, 3457, 3457,
-      779, 1301, 1301, 1301, 1301, 3457, 3457, 1301, 1301,  785,
-      785,  785, 3457, 3457, 3457,  785, 1307, 1307, 1307, 1307,
-     3457, 3457, 1307, 1307,  790,  790,  790, 3457, 3457, 3457,
-      790, 1313, 1313, 1313, 1313, 3457, 3457, 1313, 1313,  795,
-      795,  795, 3457, 3457, 3457,  795, 1326, 1326, 1326, 1326,
-     3457, 3457, 1326, 1326, 1333, 1333, 1333, 1333, 3457, 3457,
-     1333, 1333, 1344, 1344, 1344, 1344, 3457, 3457, 1344, 1344,
-      815,  815,  815, 3457, 3457, 3457,  815, 1371, 1371, 1371,
-
-     1371, 3457, 3457, 1371, 1371,  834,  834,  834,  834, 3457,
-      834, 3457,  834, 1387, 1387, 1387, 1387, 3457, 3457, 1387,
-     1387,  844,  844,  844, 3457, 3457, 3457,  844, 1402, 1402,
-     1402, 1402, 3457, 3457, 1402, 1402,  854,  854,  854, 3457,
-     3457, 3457,  854, 1410, 1410, 1410, 1410, 3457, 3457, 1410,
-     1410,  859,  859,  859, 3457, 3457, 3457,  859, 1419, 1419,
-     1419, 1419, 3457, 3457, 1419, 1419,  865,  865,  865, 3457,
-     3457, 3457,  865, 1430, 1430, 1430, 1430, 3457, 3457, 1430,
-     1430,  873,  873,  873, 3457, 3457, 3457,  873, 1439, 1439,
-     1439, 1439, 3457, 3457, 1439, 1439,  880,  880,  880, 3457,
-
-     3457, 3457,  880, 1451, 1451, 1451, 1451, 3457, 3457, 1451,
-     1451,  887,  887,  887, 3457, 3457, 3457,  887, 1459, 1459,
-     1459, 1459, 3457, 3457, 1459, 1459, 1467, 1467, 1467, 1467,
-     3457, 3457, 1467, 1467,  897,  897,  897, 3457, 3457, 3457,
-      897, 1477, 1477, 1477, 1477, 3457, 3457, 1477, 1477,  903,
-      903,  903, 3457, 3457, 3457,  903, 1486, 1486, 1486, 1486,
-     3457, 3457, 1486, 1486,  912,  912,  912,  912, 3457,  912,
-     3457,  912, 1492, 1492, 1492, 1492, 3457, 3457, 1492, 1492,
-     1499, 1499, 1499, 1499, 3457, 3457, 1499, 1499,  920,  920,
-      920,  920, 3457,  920, 3457,  920, 1507, 1507, 1507, 1507,
-
-     3457, 3457, 1507, 1507,  925,  925,  925,  925, 3457,  925,
-     3457,  925, 1515, 1515, 1515, 1515, 3457, 3457, 1515, 1515,
-     1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1735,
-     1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735,  692,  692,
-      692, 3457, 3457, 3457,  692, 1191, 1191, 1191, 1191, 3457,
-     3457, 1191, 1191, 1227, 1227, 1227, 1227, 3457, 3457, 1227,
-     1227,  723,  723,  723, 3457, 3457, 3457,  723, 1237, 1237,
-     1237, 1237, 3457, 3457, 1237, 1237,  731,  731,  731, 3457,
-     3457, 3457,  731, 1253, 1253, 1253, 1253, 3457, 3457, 1253,
-     1253,  742,  742,  742, 3457, 3457, 3457,  742, 1260, 1260,
-
-     1260, 1260, 3457, 3457, 1260, 1260,  748,  748,  748, 3457,
-     3457, 3457,  748,  771,  771,  771, 3457, 3457, 3457,  771,
-     1291, 1291, 1291, 1291, 3457, 3457, 1291, 1291,  779,  779,
-      779, 3457, 3457, 3457,  779, 1301, 1301, 1301, 1301, 3457,
-     3457, 1301, 1301,  785,  785,  785, 3457, 3457, 3457,  785,
-     1307, 1307, 1307, 1307, 3457, 3457, 1307, 1307,  790,  790,
-      790,  790, 3457,  790, 3457,  790, 1313, 1313, 1313, 1313,
-     3457, 3457, 1313, 1313,  795,  795,  795, 3457, 3457, 3457,
-      795, 1326, 1326, 1326, 1326, 3457, 3457, 1326, 1326, 1344,
-     1344, 1344, 1344, 3457, 3457, 1344, 1344,  815,  815,  815,
-
-     3457, 3457, 3457,  815, 1371, 1371, 1371, 1371, 3457, 3457,
-     1371, 1371,  834,  834,  834,  834, 3457,  834, 3457,  834,
-     1387, 1387, 1387, 1387, 3457, 3457, 1387, 1387,  844,  844,
-      844, 3457, 3457, 3457,  844, 1402, 1402, 1402, 1402, 3457,
-     3457, 1402, 1402,  854,  854,  854, 3457, 3457, 3457,  854,
-     1410, 1410, 1410, 1410, 3457, 3457, 1410, 1410,  859,  859,
-      859, 3457, 3457, 3457,  859, 1419, 1419, 1419, 1419, 3457,
-     3457, 1419, 1419,  865,  865,  865, 3457, 3457, 3457,  865,
-     1430, 1430, 1430, 1430, 3457, 3457, 1430, 1430,  873,  873,
-      873, 3457, 3457, 3457,  873, 1439, 1439, 1439, 1439, 3457,
-
-     3457, 1439, 1439,  880,  880,  880,  880, 3457,  880, 3457,
-      880, 1451, 1451, 1451, 1451, 3457, 3457, 1451, 1451,  887,
-      887,  887, 3457, 3457, 3457,  887, 1459, 1459, 1459, 1459,
-     3457, 3457, 1459, 1459, 1467, 1467, 1467, 1467, 3457, 3457,
-     1467, 1467,  897,  897,  897,  897, 3457,  897, 3457,  897,
-     1477, 1477, 1477, 1477, 3457, 3457, 1477, 1477,  903,  903,
-      903, 3457, 3457, 3457,  903, 1486, 1486, 1486, 1486, 3457,
-     3457, 1486, 1486, 1492, 1492, 1492, 1492, 3457, 3457, 1492,
-     1492, 1499, 1499, 1499, 1499, 3457, 3457, 1499, 1499, 1507,
-     1507, 1507, 1507, 3457, 3457, 1507, 1507, 1515, 1515, 1515,
-
-     1515, 3457, 3457, 1515, 1515, 1176, 1176, 1176, 1176, 1176,
-     1176, 1176, 1176, 1176, 1735, 1735, 1735, 1735, 1735, 1735,
-     1735, 1735, 1735,  692,  692,  692,  692, 3457,  692, 3457,
-      692, 1191, 1191, 1191, 1191, 3457, 3457, 1191, 1191, 1227,
-     1227, 1227, 1227, 3457, 3457, 1227, 1227,  723,  723,  723,
-     3457, 3457, 3457,  723, 1237, 1237, 1237, 1237, 3457, 3457,
-     1237, 1237,  731,  731,  731, 3457, 3457, 3457,  731, 1253,
-     1253, 1253, 1253, 3457, 3457, 1253, 1253,  742,  742,  742,
-      742, 3457,  742, 3457,  742, 1260, 1260, 1260, 1260, 3457,
-     3457, 1260, 1260,  748,  748,  748,  748, 3457,  748, 3457,
-
-      748,  771,  771,  771,  771, 3457,  771, 3457,  771, 1291,
-     1291, 1291, 1291, 3457, 3457, 1291, 1291,  779,  779,  779,
-      779, 3457,  779, 3457,  779, 1301, 1301, 1301, 1301, 3457,
-     3457, 1301, 1301,  785,  785,  785, 3457, 3457, 3457,  785,
-     1307, 1307, 1307, 1307, 3457, 3457, 1307, 1307, 1313, 1313,
-     1313, 1313, 3457, 3457, 1313, 1313,  795,  795,  795, 3457,
-     3457, 3457,  795, 1344, 1344, 1344, 1344, 3457, 3457, 1344,
-     1344,  815,  815,  815, 3457, 3457, 3457,  815, 1371, 1371,
-     1371, 1371, 3457, 3457, 1371, 1371,  834,  834,  834,  834,
-     3457,  834, 3457,  834, 1387, 1387, 1387, 1387, 3457, 3457,
-
-     1387, 1387,  844,  844,  844, 3457, 3457, 3457,  844,  854,
-      854,  854, 3457, 3457, 3457,  854, 1410, 1410, 1410, 1410,
-     3457, 3457, 1410, 1410,  859,  859,  859, 3457, 3457, 3457,
-      859, 1419, 1419, 1419, 1419, 3457, 3457, 1419, 1419,  865,
-      865,  865, 3457, 3457, 3457,  865,  873,  873,  873, 3457,
-     3457, 3457,  873, 1439, 1439, 1439, 1439, 3457, 3457, 1439,
-     1439,  880,  880,  880, 3457, 3457, 3457,  880, 1451, 1451,
-     1451, 1451, 3457, 3457, 1451, 1451,  887,  887,  887, 3457,
-     3457, 3457,  887, 1459, 1459, 1459, 1459, 3457, 3457, 1459,
-     1459, 1467, 1467, 1467, 1467, 3457, 3457, 1467, 1467, 1477,
-
-     1477, 1477, 1477, 3457, 3457, 1477, 1477,  903,  903,  903,
-     3457, 3457, 3457,  903, 1486, 1486, 1486, 1486, 3457, 3457,
-     1486, 1486, 1492, 1492, 1492, 1492, 3457, 3457, 1492, 1492,
-     1499, 1499, 1499, 1499, 3457, 3457, 1499, 1499, 1515, 1515,
-     1515, 1515, 3457, 3457, 1515, 1515, 1176, 1176, 1176, 1176,
-     1176, 1176, 1176, 1176, 1176, 1735, 1735, 1735, 1735, 1735,
-     1735, 1735, 1735, 1735, 1191, 1191, 1191, 1191, 3457, 3457,
-     1191, 1191, 1227, 1227, 1227, 1227, 3457, 3457, 1227, 1227,
-      723,  723,  723, 3457, 3457, 3457,  723,  731,  731,  731,
-     3457, 3457, 3457,  731, 1253, 1253, 1253, 1253, 3457, 3457,
-
-     1253, 1253, 1260, 1260, 1260, 1260, 3457, 3457, 1260, 1260,
-      771,  771,  771, 3457, 3457, 3457,  771, 1291, 1291, 1291,
-     1291, 3457, 3457, 1291, 1291,  779,  779,  779, 3457, 3457,
-     3457,  779, 1301, 1301, 1301, 1301, 3457, 3457, 1301, 1301,
-      785,  785,  785, 3457, 3457, 3457,  785, 1313, 1313, 1313,
-     1313, 3457, 3457, 1313, 1313,  795,  795,  795, 3457, 3457,
-     3457,  795, 1344, 1344, 1344, 1344, 3457, 3457, 1344, 1344,
-      815,  815,  815, 3457, 3457, 3457,  815, 1371, 1371, 1371,
-     1371, 3457, 3457, 1371, 1371, 1387, 1387, 1387, 1387, 3457,
-     3457, 1387, 1387,  844,  844,  844, 3457, 3457, 3457,  844,
-
-      854,  854,  854, 3457, 3457, 3457,  854, 1410, 1410, 1410,
-     1410, 3457, 3457, 1410, 1410,  859,  859,  859, 3457, 3457,
-     3457,  859, 1419, 1419, 1419, 1419, 3457, 3457, 1419, 1419,
-      865,  865,  865, 3457, 3457, 3457,  865,  873,  873,  873,
-     3457, 3457, 3457,  873,  880,  880,  880, 3457, 3457, 3457,
-      880, 1451, 1451, 1451, 1451, 3457, 3457, 1451, 1451,  887,
-      887,  887, 3457, 3457, 3457,  887, 1459, 1459, 1459, 1459,
-     3457, 3457, 1459, 1459, 1467, 1467, 1467, 1467, 3457, 3457,
-     1467, 1467, 1477, 1477, 1477, 1477, 3457, 3457, 1477, 1477,
-      903,  903,  903,  903, 3457,  903, 3457,  903, 1486, 1486,
-
-     1486, 1486, 3457, 3457, 1486, 1486, 1492, 1492, 1492, 1492,
-     3457, 3457, 1492, 1492, 1499, 1499, 1499, 1499, 3457, 3457,
-     1499, 1499, 1515, 1515, 1515, 1515, 3457, 3457, 1515, 1515,
-     1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1735,
-     1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1191, 1191,
-     1191, 1191, 3457, 3457, 1191, 1191, 1227, 1227, 1227, 1227,
-     3457, 3457, 1227, 1227,  723,  723,  723, 3457, 3457, 3457,
-      723,  731,  731,  731,  731, 3457,  731, 3457,  731, 1260,
-     1260, 1260, 1260, 3457, 3457, 1260, 1260,  771,  771,  771,
-     3457, 3457, 3457,  771, 1291, 1291, 1291, 1291, 3457, 3457,
-
-     1291, 1291,  779,  779,  779, 3457, 3457, 3457,  779, 1301,
-     1301, 1301, 1301, 3457, 3457, 1301, 1301,  785,  785,  785,
-      785, 3457,  785, 3457,  785, 1313, 1313, 1313, 1313, 3457,
-     3457, 1313, 1313,  795,  795,  795, 3457, 3457, 3457,  795,
-     1344, 1344, 1344, 1344, 3457, 3457, 1344, 1344,  815,  815,
-      815, 3457, 3457, 3457,  815, 1371, 1371, 1371, 1371, 3457,
-     3457, 1371, 1371, 1387, 1387, 1387, 1387, 3457, 3457, 1387,
-     1387,  844,  844,  844, 3457, 3457, 3457,  844,  854,  854,
-      854, 3457, 3457, 3457,  854,  859,  859,  859,  859, 3457,
-      859, 3457,  859, 1419, 1419, 1419, 1419, 3457, 3457, 1419,
-
-     1419,  865,  865,  865,  865, 3457,  865, 3457,  865,  873,
-      873,  873, 3457, 3457, 3457,  873,  880,  880,  880, 3457,
-     3457, 3457,  880, 1451, 1451, 1451, 1451, 3457, 3457, 1451,
-     1451,  887,  887,  887,  887, 3457,  887, 3457,  887, 1459,
-     1459, 1459, 1459, 3457, 3457, 1459, 1459, 1467, 1467, 1467,
-     1467, 3457, 3457, 1467, 1467, 1477, 1477, 1477, 1477, 3457,
-     3457, 1477, 1477,  903,  903,  903,  903, 3457,  903, 3457,
-      903, 1486, 1486, 1486, 1486, 3457, 3457, 1486, 1486, 1492,
-     1492, 1492, 1492, 3457, 3457, 1492, 1492, 1515, 1515, 1515,
-     1515, 3457, 3457, 1515, 1515, 1176, 1176, 1176, 1176, 1176,
-
-     1176, 1176, 1176, 1176, 1735, 1735, 1735, 1735, 1735, 1735,
-     1735, 1735, 1735, 1191, 1191, 1191, 1191, 3457, 3457, 1191,
-     1191,  723,  723,  723, 3457, 3457, 3457,  723,  731,  731,
-      731, 3457, 3457, 3457,  731, 1260, 1260, 1260, 1260, 3457,
-     3457, 1260, 1260,  771,  771,  771, 3457, 3457, 3457,  771,
-     1291, 1291, 1291, 1291, 3457, 3457, 1291, 1291,  779,  779,
-      779, 3457, 3457, 3457,  779, 1313, 1313, 1313, 1313, 3457,
-     3457, 1313, 1313,  795,  795,  795, 3457, 3457, 3457,  795,
-     1344, 1344, 1344, 1344, 3457, 3457, 1344, 1344,  815,  815,
-      815, 3457, 3457, 3457,  815,  844,  844,  844, 3457, 3457,
-
-     3457,  844,  854,  854,  854, 3457, 3457, 3457,  854, 1419,
-     1419, 1419, 1419, 3457, 3457, 1419, 1419,  865,  865,  865,
-     3457, 3457, 3457,  865,  873,  873,  873, 3457, 3457, 3457,
-      873,  880,  880,  880, 3457, 3457, 3457,  880, 3064, 3064,
-     3064, 3064, 3064, 3064, 3064, 3064, 3064, 3065, 3065, 3065,
-     3065, 3065, 3065, 3065, 3065, 3065, 3124, 3124, 3124, 3124,
-     3124, 3124, 3124, 3124, 3124, 3127, 3127, 3127, 3127, 3127,
-     3127, 3127, 3127, 3127, 3168, 3168, 3168, 3168, 3168, 3168,
-     3168, 3168, 3168, 3170, 3170, 3170, 3170, 3170, 3170, 3170,
-     3170, 3170,  263, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457
+      950,  394,  398,  394,  399,  394,  403,  267,  403,  403,
+      267,  403,  414,  267,  414,  873,  414,  267,  414,  428,
+      267,  428,  404, 1800, 1020,  404,  680,  680,  415,  680,
+
+      394,  394,  415,  844,  854,  429,  676,  676,  676,  676,
+      676,  676,  679,  679,  911,  679,  400,  676,  676,  676,
+     1807,  401,  394,  395,  267,  395,  394,  394,  394,  394,
+      394,  394,  394,  396,  394,  394,  394,  714,  394,  398,
+      394,  399,  394,  428,  267,  428,  267,  267,  267,  267,
+      267,  267,  920,  428,  267,  428,  428,  267,  428,  429,
+     1180, 1808,  430,  680, 1522,  430,  714,  394,  394,  429,
+      859,  680,  429,  676,  676,  676,  676,  676,  676,  679,
+      676,  676,  676,  400,  676,  676,  676,  679,  401,  405,
+      406,  267,  406,  405,  405,  405,  405,  405,  405,  405,
+
+      407,  405,  405,  405,  761,  405,  409,  405,  410,  405,
+      428,  267,  428,  428,  267,  428,  443,  267,  443,  969,
+      443,  267,  443,  267,  267,  267,  431, 1010, 1809,  431,
+      680, 1810,  444, 1016,  405,  405,  444,  865,  680,  367,
+      676,  676,  676,  676,  676,  676,  679,  676,  676,  676,
+      411, 1020, 1815,  879,  679, 1209,  412,  405,  406,  267,
+      406,  405,  405,  405,  405,  405,  405,  405,  407,  405,
+      405,  405, 1323,  405,  409,  405,  410,  405,  267,  267,
+      267,  443,  267,  443,  443,  267,  443, 1816,  443,  267,
+      443,  443,  267,  443,  367, 1817, 1818,  444, 1819, 1180,
+
+      444,  880,  405,  405,  445,  714,  680,  445,  676,  676,
+      676,  676,  676,  676,  676,  676,  676, 1820,  411, 1739,
+     1821,  887,  679, 1828,  412,  416,  417,  267,  417,  416,
+      416,  416,  416,  416,  416,  416,  418,  416,  416,  416,
+     1832,  416,  420,  416,  421,  416,  454,  267,  454,  454,
+      267,  454,  466,  267,  466,  920,  466,  267,  466,  676,
+      676,  676,  455, 1837, 1839,  455,  680,  680,  467,  880,
+      416,  416,  467,  422,  892,  423,  952,  715,  676,  676,
+      676,  424,  679,  679,  676,  676,  676,  953,  425, 1840,
+      954,  426,  416,  417,  267,  417,  416,  416,  416,  416,
+
+      416,  416,  416,  418,  416,  416,  416,  714,  416,  420,
+      416,  421,  416,  484,  267,  484,  484,  267,  484,  267,
+      267,  267, 1846,  267,  267,  267,  676,  676,  676,  485,
+      680, 1851,  485, 1852, 1853,  367,  680,  416,  416,  367,
+      422,  897,  423,  676,  676,  676,  679,  903,  424,  676,
+      676,  676,  679, 1854, 1855,  425,  911, 1866,  426,  432,
+      433,  267,  433,  432,  432,  432,  432,  432,  432,  432,
+      434,  432,  432,  432, 1869,  432,  436,  432,  437,  432,
+      484,  267,  484,  484,  267,  484,  484,  267,  484,  880,
+      484,  267,  484,  912, 1870,  880,  485,  715,  680,  485,
+
+     1547, 1874,  486,  715,  432,  432,  486,  438,  761,  439,
+      676,  676,  676, 1548,  679,  440,  676,  676,  676,  676,
+      676,  676,  676,  676,  676, 1875,  441,  432,  433,  267,
+      433,  432,  432,  432,  432,  432,  432,  432,  434,  432,
+      432,  432, 1878,  432,  436,  432,  437,  432,  500,  267,
+      500,  500,  267,  500,  516,  267,  516, 1879,  516,  267,
+      516, 1880,  680,  680,  501, 1881, 1882,  501, 1883,  916,
+      517,  680,  432,  432,  517,  438, 1884,  439,  679,  679,
+      676,  676,  676,  440,  676,  676,  676,  679,  676,  676,
+      676,  676,  676,  676,  441,  446,  447,  267,  447,  446,
+
+      446,  446,  446,  446,  446,  446,  448,  446,  446,  446,
+     1885,  446,  450,  446,  451,  446,  527,  267,  527,  527,
+      267,  527,  539,  267,  539,  969,  539,  267,  539,  552,
+      267,  552,  528,  680, 1180,  528,  680,  680,  540, 1021,
+      446,  446,  540,  925,  930,  553,  676,  676,  676,  679,
+     1182, 1893,  679,  679, 1896, 1897,  452,  446,  447,  267,
+      447,  446,  446,  446,  446,  446,  446,  446,  448,  446,
+      446,  446, 1900,  446,  450,  446,  451,  446,  552,  267,
+      552,  267,  267,  267,  267,  267,  267,  969,  552,  267,
+      552,  552,  267,  552,  553, 1902, 1904,  367,  961, 1905,
+
+      367, 1022,  446,  446,  553,  962, 1907,  553,  676,  676,
+      676,  963,  936,  936,  936, 1197, 1197, 1197,  452,  456,
+      457,  267,  457,  456,  456,  456,  456,  456,  456,  456,
+      458,  456,  456,  456, 1908,  456,  460,  456,  461,  456,
+      552,  267,  552,  552,  267,  552,  564,  267,  564,  952,
+      564,  267,  564,  267,  267,  267,  554, 1909, 1914,  554,
+      953,  974,  565,  968,  456,  456,  565,  971,  962,  566,
+      462,  937,  971, 1917,  975,  463, 1918, 1919,  972, 1198,
+     1921,  954, 1924,  972, 1925, 1927,  968,  464,  456,  457,
+      267,  457,  456,  456,  456,  456,  456,  456,  456,  458,
+
+      456,  456,  456, 1931,  456,  460,  456,  461,  456,  267,
+      267,  267,  564,  267,  564,  564,  267,  564, 1932,  564,
+      267,  564,  564,  267,  564,  566, 1933, 1935,  565,  974,
+      961,  565, 1559,  456,  456,  567,  962,  962,  567,  462,
+      961,  974,  963,  975,  463, 1548, 1742,  962,  962, 1197,
+     1197, 1197, 1949, 1015, 1015, 1950,  464,  468,  469,  267,
+      469,  468,  468,  468,  468,  468,  468,  468,  470,  468,
+      468,  468,  471,  468,  472,  468,  473,  468,  471,  471,
+      471,  471,  471,  471,  471,  471,  471,  471,  471,  471,
+      471,  471,  471,  471,  471,  471,  471,  471,  471,  471,
+
+      471,  471,  468,  468,  471,  474,  475,  476,  471,  471,
+      471,  471,  471,  477,  471,  471,  478,  471,  471,  471,
+      479,  471,  480,  481,  482,  471,  471,  471,  471,  471,
+      471,  487,  488,  267,  488,  487,  487,  487,  487,  487,
+      487,  487,  489,  487,  487,  487, 1951,  487,  491,  487,
+      492,  487,  578,  267,  578,  578,  267,  578,  267,  267,
+      267,  952,  267,  267,  267,  578,  267,  578,  579, 1953,
+     1180,  579,  972, 1954,  566,  968,  487,  487,  566, 1955,
+      493,  579,  936,  936,  936, 1956, 1184,  494, 1957, 1958,
+      495, 1221, 1221, 1221,  496, 1946,  497,  498,  487,  488,
+
+      267,  488,  487,  487,  487,  487,  487,  487,  487,  489,
+      487,  487,  487, 1959,  487,  491,  487,  492,  487,  578,
+      267,  578,  578,  267,  578,  578,  267,  578, 1960,  590,
+      267,  590,  590,  267,  590,  579, 1961, 1962,  580, 1963,
+     1965,  580, 1352,  487,  487,  591, 1966,  493,  591, 1234,
+     1234, 1234, 1353, 1235,  494, 1198, 1236,  495, 1967, 1354,
+     1968,  496, 1971,  497,  498,  502,  503,  267,  503,  502,
+      502,  502,  502,  502,  502,  502,  504,  502,  502,  502,
+     1974,  502,  506,  502,  507,  502,  601,  267,  601,  601,
+      267,  601,  267,  267,  267, 1975,  267,  267,  267,  981,
+
+      981,  981,  602, 1976, 1559,  602, 1977, 1978,  566, 1979,
+      502,  502,  566,  508,  509,  510,  982, 1597, 1244, 1244,
+     1244,  511, 1245, 1983,  512, 1246, 1984, 1986,  513, 1987,
+     1988,  514,  502,  503,  267,  503,  502,  502,  502,  502,
+      502,  502,  502,  504,  502,  502,  502, 1990,  502,  506,
+      502,  507,  502,  601,  267,  601,  601,  267,  601,  601,
+      267,  601, 2003,  601,  267,  601,  989,  989,  989,  602,
+     2004, 2005,  602, 2006, 2007,  603, 2010,  502,  502,  603,
+      508,  509,  510,  990, 2011, 1266, 1266, 1266,  511, 1267,
+     2012,  512, 1268, 2013, 2018,  513, 2019, 2024,  514,  518,
+
+      519,  267,  519,  518,  518,  518,  518,  518,  518,  518,
+      520,  518,  518,  518, 2025,  518,  522,  518,  523,  518,
+      614,  267,  614,  614,  267,  614,  267,  267,  267, 2034,
+      267,  267,  267, 1004, 1004, 1004,  615, 2038, 2046,  615,
+     2052, 2053,  566, 2054,  518,  518,  566, 2060, 2061,  524,
+     1005, 1538, 1538, 1538, 2062,  525,  518,  519,  267,  519,
+      518,  518,  518,  518,  518,  518,  518,  520,  518,  518,
+      518, 2063,  518,  522,  518,  523,  518,  614,  267,  614,
+      614,  267,  614,  614,  267,  614, 2066,  614,  267,  614,
+     1024, 1024, 1024,  615, 2067, 2078,  615, 2084, 2088,  616,
+
+     2091,  518,  518,  616, 2093, 2094,  524, 1025, 1221, 1221,
+     1221, 2096,  525,  529,  530,  267,  530,  529,  529,  529,
+      529,  529,  529,  529,  531,  529,  529,  529, 2097,  529,
+      533,  529,  534,  529,  629,  267,  629,  629,  267,  629,
+      267,  267,  267, 2098,  267,  267,  267,  629,  267,  629,
+      630, 2102, 2105,  630, 2107, 2114,  631, 2122,  529,  529,
+      631, 2123,  535,  630, 1197, 1197, 1197, 2124, 2125,  536,
+     2127, 1180,  537,  529,  530,  267,  530,  529,  529,  529,
+      529,  529,  529,  529,  531,  529,  529,  529, 2142,  529,
+      533,  529,  534,  529,  629,  267,  629,  629,  267,  629,
+
+      629,  267,  629, 2145,  641,  267,  641,  641,  267,  641,
+      630, 2149, 2150,  632, 2151, 1742,  632, 2154,  529,  529,
+      642, 1742,  535,  642, 1221, 1221, 1221, 2155, 1274,  536,
+     2157, 2158,  537,  541,  542,  267,  542,  541,  541,  541,
+      541,  541,  541,  541,  543,  541,  541,  541, 2144,  541,
+      545,  541,  546,  541,  651,  267,  651,  651,  267,  651,
+      267,  267,  267, 2143,  267,  267,  267,  651,  267,  651,
+      652, 2152, 2159,  652, 2160, 2161,  367, 2162,  541,  541,
+      367, 2163,  547,  652, 1594, 1594, 1594, 2153, 1274,  548,
+     2166, 2167,  549, 1538, 1538, 1538, 1756, 1756, 1756,  550,
+
+      541,  542,  267,  542,  541,  541,  541,  541,  541,  541,
+      541,  543,  541,  541,  541, 2170,  541,  545,  541,  546,
+      541,  651,  267,  651,  651,  267,  651,  651,  267,  651,
+     2171,  663,  267,  663,  663,  267,  663,  652, 2172, 2173,
+      653, 2174, 1757,  653,  752,  541,  541,  664, 2176,  547,
+      664, 1288, 1288, 1288,  762, 1289,  548, 2177, 1290,  549,
+     1759, 1759, 1759, 1764, 1764, 1764,  550,  555,  556,  267,
+      556,  555,  555,  555,  555,  555,  555,  555,  557,  555,
+      555,  555,  763,  555,  559,  555,  560,  555,  674,  267,
+      674,  674,  267,  674, 2180, 2183,  714, 1042, 1042, 1042,
+
+      708, 1193, 1193, 1193,  675, 2187, 1760,  675, 2188, 2191,
+     3468, 2192,  555,  555, 1043, 1053, 1053, 1053,  561, 1195,
+      711, 2193, 1313, 1313, 1313, 2196, 1314, 2200,  711, 1315,
+     2201, 2204, 1054,  562,  555,  556,  267,  556,  555,  555,
+      555,  555,  555,  555,  555,  557,  555,  555,  555,  712,
+      555,  559,  555,  560,  555,  713,  766, 1062, 1062, 1062,
+     2206, 2211,  714, 1767, 1767, 1767,  715, 1064, 1064, 1064,
+     2189, 2212,  767, 2219, 1063, 1070, 1070, 1070, 2190,  555,
+      555, 1073, 1073, 1073, 1065,  561, 1327, 1327, 1327, 2194,
+     1328, 2220, 1071, 1329, 1777, 1777, 1777, 2195, 1074, 2224,
+
+      562,  568,  569,  267,  569,  568,  568,  568,  568,  568,
+      568,  568,  570,  568,  568,  568, 2225,  568,  572,  568,
+      573,  568, 1088, 1088, 1088, 1090, 1090, 1090, 1102, 1102,
+     1102, 1110, 1110, 1110, 1115, 1115, 1115, 2202, 2202, 1089,
+     2226, 2227, 1091, 2152, 2239, 1103,  568,  568, 1111, 2243,
+     2244, 1116,  574, 2203, 2153,  575, 1341, 1341, 1341, 2203,
+     1342, 2245, 2251, 1343, 1594, 1594, 1594,  576,  568,  569,
+      267,  569,  568,  568,  568,  568,  568,  568,  568,  570,
+      568,  568,  568, 2252,  568,  572,  568,  573,  568, 1121,
+     1121, 1121, 1141, 1141, 1141, 1165, 1165, 1165, 1169, 1169,
+
+     1169, 1174, 1174, 1174, 2253, 2257, 1122, 2258, 2269, 1142,
+     2273, 2274, 1166,  568,  568, 1170, 2275, 2277, 1175,  574,
+     2281, 2285,  575, 1344, 1344, 1344, 2286, 1345, 2287, 2288,
+     1346, 1814, 1814, 1814,  576,  581,  582,  267,  582,  581,
+      581,  581,  581,  581,  581,  581,  583,  581,  581,  581,
+     2289,  581,  585,  581,  586,  581, 1193, 1193, 1193, 1229,
+     1229, 1229, 2292, 2299, 1229, 1229, 1229,  981,  981,  981,
+     1239, 1239, 1239, 1991, 1195, 2301, 2311, 1231, 2312, 1992,
+      581,  581, 1231, 1993,  982, 2313,  587, 1994, 1241, 2314,
+     2316,  588,  581,  582,  267,  582,  581,  581,  581,  581,
+
+      581,  581,  581,  583,  581,  581,  581, 1180,  581,  585,
+      581,  586,  581, 2320, 1196, 1239, 1239, 1239,  989,  989,
+      989, 1255, 1255, 1255, 1232, 1247, 1247, 1247, 1250, 1250,
+     1250, 2323, 2329, 1241, 2330,  990, 2331,  581,  581, 1257,
+     2332, 1742, 1248,  587, 2335, 1251, 2337, 2338,  588,  592,
+      593,  267,  593,  592,  592,  592,  592,  592,  592,  592,
+      594,  592,  592,  592, 2339,  592,  596,  592,  597,  592,
+     1262, 1262, 1262, 1262, 1262, 1262, 1004, 1004, 1004, 1242,
+     1270, 1270, 1270, 1742, 1255, 1255, 1255, 2322, 1264, 2340,
+     2344, 1264, 2349, 1005,  592,  592, 2351, 2352, 1272, 2353,
+
+      598, 2357, 1257, 1355, 1355, 1355, 2363, 1356, 2364, 2365,
+     1357, 1811, 1811, 1811, 2321,  599,  592,  593,  267,  593,
+      592,  592,  592,  592,  592,  592,  592,  594,  592,  592,
+      592, 1258,  592,  596,  592,  597,  592, 1265, 1270, 1270,
+     1270, 1024, 1024, 1024, 2366, 1293, 1293, 1293, 1293, 1293,
+     1293, 1300, 1300, 1300, 1995, 2367, 1272, 1812, 1025, 2368,
+     1996,  592,  592, 1295, 1997, 2369, 1295,  598, 1998, 1302,
+     1359, 1359, 1359, 2370, 1360, 1273, 2371, 1361, 1813, 1813,
+     1813, 2372,  599,  604,  605,  267,  605,  604,  604,  604,
+      604,  604,  604,  604,  606,  604,  604,  604, 2378,  604,
+
+      608,  604,  609,  604, 1300, 1300, 1300, 1306, 1306, 1306,
+     1042, 1042, 1042, 2379, 1296, 1306, 1306, 1306, 1319, 1319,
+     1319, 2380, 1302, 2381, 1760, 1308, 2387, 1043,  604,  604,
+     1319, 1319, 1319, 1308,  610, 2389, 1321,  611, 1378, 1378,
+     1378, 2390, 1379, 2392, 2393, 1380, 2398, 2399, 1321,  612,
+      604,  605,  267,  605,  604,  604,  604,  604,  604,  604,
+      604,  606,  604,  604,  604, 1303,  604,  608,  604,  609,
+      604, 1053, 1053, 1053, 1331, 1331, 1331, 1062, 1062, 1062,
+     1309, 1331, 1331, 1331, 1336, 1336, 1336, 2403, 1054, 2394,
+     2396, 1322, 1333, 2406, 1063,  604,  604, 2395, 2397, 1333,
+
+     2407,  610, 1338, 2408,  611, 1381, 1381, 1381, 2409, 1382,
+     2413, 2414, 1383, 1759, 1759, 1759,  612,  617,  618,  267,
+      618,  617,  617,  617,  617,  617,  617,  617,  619,  617,
+      617,  617, 2415,  617,  621,  617,  622,  617, 1064, 1064,
+     1064, 2416, 2424, 1336, 1336, 1336, 2425, 1334, 1347, 1347,
+     1347, 1347, 1347, 1347, 2426, 1065, 1070, 1070, 1070, 1916,
+     2427, 1338,  617,  617, 2430, 2435, 1349, 2439, 2440, 1349,
+      623, 2445,  624, 1071, 2446,  625, 1756, 1756, 1756,  626,
+     1759, 1759, 1759,  627,  617,  618,  267,  618,  617,  617,
+      617,  617,  617,  617,  617,  619,  617,  617,  617, 2447,
+
+      617,  621,  617,  622,  617, 1339, 1073, 1073, 1073, 1362,
+     1362, 1362, 1350, 1374, 1374, 1374, 1374, 1374, 1374, 1088,
+     1088, 1088, 2448, 1074, 2441, 2443, 1363, 2450, 2460,  617,
+      617, 1376, 2442, 2444, 1376, 2472, 1089,  623, 2473,  624,
+     2474, 1742,  625, 1964, 1964, 1964,  626, 1764, 1764, 1764,
+      627,  633,  634,  267,  634,  633,  633,  633,  633,  633,
+      633,  633,  635,  633,  633,  633, 2476,  633,  637,  633,
+      638,  633, 1742, 2479, 1377, 1090, 1090, 1090, 1384, 1384,
+     1384, 1767, 1767, 1767, 2466, 3468, 3468, 3468, 3468, 3468,
+     3468, 2480, 1091, 2481, 2484, 1385,  633,  633, 3468, 3468,
+
+     3468, 2488, 3468, 2489, 2490, 3468, 1398, 1398, 1398, 2491,
+     1399, 2492, 2493, 1400, 2494, 3468, 1969, 1969, 1969, 2467,
+      639,  633,  634,  267,  634,  633,  633,  633,  633,  633,
+      633,  633,  635,  633,  633,  633, 1386,  633,  637,  633,
+      638,  633, 2495, 1388, 1390, 1390, 1390, 1102, 1102, 1102,
+     1387, 1777, 1777, 1777, 3468, 3468, 3468, 1401, 1401, 1401,
+     2496, 2497, 1392, 2510, 1103, 2511,  633,  633, 1390, 1390,
+     1390, 3468, 2512, 2513, 1402, 1410, 1410, 1410, 2514, 1411,
+     1970, 2516, 1412, 1972, 1972, 1972, 1392, 1811, 1811, 1811,
+      639,  643,  644,  267,  644,  643,  643,  643,  643,  643,
+
+      643,  643,  645,  643,  643,  643, 1389,  643,  647,  643,
+      648,  643, 1405, 1405, 1405, 1393, 1110, 1110, 1110, 2520,
+     1405, 1405, 1405, 1413, 1413, 1413, 1413, 1413, 1413, 1973,
+     1407, 2521, 2522, 1111, 2523, 2524,  643,  643, 1407, 2525,
+     2526, 1415, 2528, 2532, 1415, 2533, 2534,  649,  643,  644,
+      267,  644,  643,  643,  643,  643,  643,  643,  643,  645,
+      643,  643,  643, 2539,  643,  647,  643,  648,  643, 2540,
+     2535, 1408, 1115, 1115, 1115, 1418, 1418, 1418, 2541, 1419,
+     2536, 2549, 1420, 1422, 1422, 1422, 2550, 1416, 2551, 1116,
+     1813, 1813, 1813,  643,  643, 1427, 1427, 1427, 2552, 1428,
+
+     2561, 1424, 1429, 2562,  649,  654,  655,  267,  655,  654,
+      654,  654,  654,  654,  654,  654,  656,  654,  654,  654,
+     2563,  654,  658,  654,  659,  654, 1422, 1422, 1422, 1121,
+     1121, 1121, 2564, 2566, 1433, 1433, 1433, 1437, 1437, 1437,
+     2568, 1433, 1433, 1433, 1424, 2593, 1122, 1439, 1439, 1439,
+      654,  654, 1435, 2594, 1438, 3468, 3468, 3468, 1742, 1435,
+     2596,  660, 2597, 2598, 1440, 2599, 1742, 1980, 1980, 1980,
+     2600, 2604, 3468, 1425,  661,  654,  655,  267,  655,  654,
+      654,  654,  654,  654,  654,  654,  656,  654,  654,  654,
+     2589,  654,  658,  654,  659,  654, 1436, 1442, 1442, 1442,
+
+     1447, 1447, 1447, 2590, 2605, 1442, 1442, 1442, 2606, 2607,
+     3468, 3468, 3468, 1981, 1441, 1444, 2608, 1448, 2609, 2610,
+      654,  654, 2611, 1444, 1451, 1451, 1451, 3468, 1459, 1459,
+     1459,  660, 1460, 2612, 2613, 1461, 1499, 1499, 1499, 2614,
+     1500, 1452, 2616, 1501,  661,  665,  666,  267,  666,  665,
+      665,  665,  665,  665,  665,  665,  667,  665,  665,  665,
+     1449,  665,  669,  665,  670,  665, 1445, 1454, 1454, 1454,
+     2617, 3468, 3468, 3468, 2620, 1450, 1454, 1454, 1454, 1141,
+     1141, 1141, 1462, 1462, 1462, 1456, 2618, 2621, 3468, 2622,
+      665,  665, 2623, 2626, 1456, 2619, 1142, 1814, 1814, 1814,
+
+     1464,  671, 1506, 1506, 1506, 2627, 1507, 2628, 2629, 1508,
+     2037, 2037, 2037, 1457,  672,  665,  666,  267,  666,  665,
+      665,  665,  665,  665,  665,  665,  667,  665,  665,  665,
+     1453,  665,  669,  665,  670,  665, 1462, 1462, 1462, 1466,
+     1466, 1466, 1468, 1468, 1468, 1470, 1470, 1470, 1470, 1470,
+     1470, 1474, 1474, 1474, 1464, 2624, 1467, 2631, 2632, 1469,
+      665,  665, 2634, 1472, 2625, 2640, 1472, 2641, 1475, 2642,
+     2643,  671, 2646, 3468, 3468, 3468, 1478, 1478, 1478, 1480,
+     1480, 1480, 2648, 2649,  672,  680, 1480, 1480, 1480, 2650,
+     3468, 1465,  695, 1479, 1489, 1489, 1489, 1482, 1489, 1489,
+
+     1489,  679,  696, 2651, 1482, 2652, 1495, 1495, 1495, 1495,
+     1495, 1495, 1491, 1514, 1514, 1514, 1491, 1515, 2656, 1473,
+     1516, 2659, 2664, 1476, 1497, 2665, 2660, 1497, 2668,  697,
+      698,  699, 2156, 2156, 2156,  700,  701,  702, 1477, 2661,
+      703,  704, 2677, 2678,  705, 2679,  706,  707,  708,  680,
+     1165, 1165, 1165, 1502, 1502, 1502,  752, 1483, 1502, 1502,
+     1502, 2662, 1492, 2680, 2681,  679,  753, 1166, 1169, 1169,
+     1169, 1504, 2684, 1498, 2663, 2685, 1504, 2706, 1510, 1510,
+     1510, 1174, 1174, 1174, 2707, 1170, 1742, 2709, 1510, 1510,
+     1510, 2710, 1180,  697,  754,  709, 1512, 2711, 1175,  755,
+
+      756,  702, 1742, 2720,  757,  704, 1512, 2721,  758, 2722,
+      759,  760,  708, 1518, 1518, 1518, 1518, 1518, 1518, 1505,
+     1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 2705,
+     2714, 1520, 2703, 2723, 1520, 1229, 1229, 1229, 1195, 2704,
+     2715, 1195, 2724, 2716, 1195, 1561, 1561, 1561, 1229, 1229,
+     1229, 2725, 1513, 1231, 1229, 1229, 1229, 1564, 1564, 1564,
+     2726, 2727, 1562, 1234, 1234, 1234, 1231, 1235, 2728, 2729,
+     1236, 2730, 1231, 1530, 1565, 2732, 2733, 1521, 3468, 3468,
+     3468, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239,
+     1244, 1244, 1244, 2734, 1245, 3468, 2735, 1246, 2736, 1241,
+
+     2737, 2738, 1241, 1563, 2717, 1241, 1247, 1247, 1247, 1570,
+     1570, 1570, 2739, 1571, 2718, 2740, 1572, 2719, 1573, 1573,
+     1573, 2741, 2742, 1248, 1250, 1250, 1250, 2743, 2744, 1575,
+     1575, 1575, 2745, 1576, 1568, 1574, 1577, 2746, 2747, 1566,
+     2750, 1251, 1579, 1579, 1579, 1255, 1255, 1255, 1255, 1255,
+     1255, 1255, 1255, 1255, 1584, 1584, 1584, 2756, 2759, 1580,
+     1262, 1262, 1262, 1257, 2760, 2761, 1257, 2764, 2765, 1257,
+     2769, 1585, 1262, 1262, 1262, 1262, 1262, 1262, 1264, 1266,
+     1266, 1266, 2770, 1267, 2771, 2772, 1268, 1270, 1270, 1270,
+     1264, 2773, 2774, 1264, 1270, 1270, 1270, 1589, 1589, 1589,
+
+     1288, 1288, 1288, 2782, 1289, 1272, 2783, 1290, 1606, 1606,
+     1606, 1582, 1272, 2784, 2810, 1590, 1293, 1293, 1293, 1293,
+     1293, 1293, 1587, 2812, 1180, 1607, 1293, 1293, 1293, 1610,
+     1610, 1610, 2813, 2814, 1295, 2818, 2819, 1295, 3468, 3468,
+     3468, 1300, 1300, 1300, 1295, 2822, 1611, 1300, 1300, 1300,
+     1300, 1300, 1300, 2807, 2820, 3468, 1614, 1614, 1614, 1302,
+     3468, 3468, 3468, 2823, 2826, 1302, 2827, 2821, 1302, 1620,
+     1620, 1620, 1742, 1615, 1306, 1306, 1306, 3468, 1306, 1306,
+     1306, 1306, 1306, 1306, 2828, 1612, 1621, 1608, 1616, 1319,
+     1319, 1319, 1308, 1313, 1313, 1313, 1308, 1314, 1742, 1308,
+
+     1315, 1319, 1319, 1319, 1319, 1319, 1319, 1321, 1327, 1327,
+     1327, 2829, 1328, 2830, 2808, 1329, 2831, 1613, 2832, 1321,
+     2833, 2834, 1321, 1331, 1331, 1331, 1331, 1331, 1331, 2792,
+     1331, 1331, 1331, 1632, 1632, 1632, 1336, 1336, 1336, 2793,
+     2809, 1333, 2836, 2837, 1333, 2794, 2838, 1617, 1333, 2824,
+     1633, 1635, 1635, 1635, 1338, 1336, 1336, 1336, 1336, 1336,
+     1336, 2839, 2825, 1341, 1341, 1341, 2840, 1342, 1636, 1625,
+     1343, 2841, 2842, 1338, 2843, 2844, 1338, 1344, 1344, 1344,
+     2845, 1345, 2846, 2847, 1346, 1347, 1347, 1347, 1347, 1347,
+     1347, 1631, 1347, 1347, 1347, 1355, 1355, 1355, 2848, 1356,
+
+     2850, 2862, 1357, 1349, 2863, 2871, 1349, 1642, 1642, 1642,
+     1349, 1359, 1359, 1359, 2872, 1360, 2873, 2874, 1361, 1362,
+     1362, 1362, 2875, 2876, 1643, 1634, 1644, 1644, 1644, 2877,
+     1645, 2884, 2887, 1646, 2894, 2895, 1363, 1374, 1374, 1374,
+     1374, 1374, 1374, 1374, 1374, 1374, 1378, 1378, 1378, 2795,
+     1379, 2896, 2897, 1380, 2898, 1376, 2899, 1637, 1376, 2796,
+     2912, 1376, 1381, 1381, 1381, 2797, 1382, 2914, 2915, 1383,
+     1384, 1384, 1384, 1659, 1659, 1659, 2916, 1660, 2917, 2918,
+     1661, 1390, 1390, 1390, 1390, 1390, 1390, 1385, 1390, 1390,
+     1390, 1398, 1398, 1398, 2919, 1399, 2920, 2921, 1400, 1392,
+
+     2902, 2922, 1392, 1401, 1401, 1401, 1392, 1671, 1671, 1671,
+     1658, 1672, 1180, 2903, 1673, 1405, 1405, 1405, 2923, 2904,
+     1402, 1405, 1405, 1405, 1405, 1405, 1405, 1410, 1410, 1410,
+     1742, 1411, 2905, 1407, 1412, 2926, 1666, 2927, 2928, 1407,
+     2929, 2930, 1407, 1413, 1413, 1413, 1413, 1413, 1413, 1413,
+     1413, 1413, 1418, 1418, 1418, 2931, 1419, 2932, 2933, 1420,
+     2908, 1415, 2935, 2936, 1415, 2909, 2937, 1415, 1422, 1422,
+     1422, 1422, 1422, 1422, 2938, 1676, 1422, 1422, 1422, 2939,
+     1427, 1427, 1427, 2940, 1428, 2941, 1424, 1429, 2942, 1424,
+     1433, 1433, 1433, 2943, 1424, 1433, 1433, 1433, 2944, 1433,
+
+     1433, 1433, 1437, 1437, 1437, 1687, 1687, 1687, 1435, 1688,
+     2945, 2946, 1689, 1435, 2947, 2956, 1678, 1435, 2960, 1438,
+     1439, 1439, 1439, 2961, 2968, 1681, 1690, 1690, 1690, 2969,
+     1691, 2970, 2971, 1692, 1442, 1442, 1442, 1440, 1442, 1442,
+     1442, 2972, 1442, 1442, 1442, 1447, 1447, 1447, 2973, 1451,
+     1451, 1451, 1444, 1964, 1964, 1964, 1444, 2974, 2975, 1686,
+     1444, 2979, 1448, 1696, 1696, 1696, 1452, 1697, 2988, 2989,
+     1698, 1701, 1701, 1701, 2990, 1702, 2991, 2992, 1703, 1454,
+     1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1459, 1459,
+     1459, 2980, 1460, 2993, 2997, 1461, 2998, 1456, 2982, 2999,
+
+     1456, 2981, 3000, 1456, 1462, 1462, 1462, 3010, 2983, 1694,
+     1462, 1462, 1462, 1462, 1462, 1462, 1466, 1466, 1466, 1708,
+     1708, 1708, 1464, 1709, 3011, 3012, 1710, 3013, 1464, 3014,
+     2984, 1464, 2986, 1467, 1468, 1468, 1468, 1711, 1711, 1711,
+     2985, 1712, 2987, 3015, 1713, 1470, 1470, 1470, 3016, 1705,
+     3017, 1469, 1470, 1470, 1470, 3021, 1470, 1470, 1470, 1474,
+     1474, 1474, 3022, 1472, 1715, 1715, 1715, 3023, 1716, 3024,
+     1472, 1717, 3025, 1707, 1472, 3026, 1475, 1478, 1478, 1478,
+     1720, 1720, 1720, 1180, 1721, 3028, 3029, 1722, 1480, 1480,
+     1480, 1480, 1480, 1480, 1479, 1480, 1480, 1480, 1725, 1725,
+
+     1725, 1489, 1489, 1489, 3030, 3031, 1482, 3032, 3033, 1482,
+     1489, 1489, 1489, 1482, 3034, 1726, 3035, 3001, 1714, 1491,
+     1489, 1489, 1489, 1495, 1495, 1495, 3039, 3040, 1491, 1495,
+     1495, 1495, 1495, 1495, 1495, 1499, 1499, 1499, 1491, 1500,
+     3041, 1497, 1501, 1502, 1502, 1502, 3044, 1497, 3045, 3046,
+     1497, 1502, 1502, 1502, 1502, 1502, 1502, 1723, 1506, 1506,
+     1506, 1504, 1507, 3047, 3048, 1508, 1510, 1510, 1510, 1504,
+     3049, 3054, 1504, 1510, 1510, 1510, 1510, 1510, 1510, 3055,
+     3056, 1730, 3057, 3058, 1512, 1733, 1514, 1514, 1514, 3059,
+     1515, 1512, 3060, 1516, 1512, 1518, 1518, 1518, 1518, 1518,
+
+     1518, 1518, 1518, 1518, 1741, 1741, 1741, 1193, 1193, 1193,
+     1561, 1561, 1561, 1520, 1734, 3061, 1520, 3062, 3063, 1520,
+     3064, 3065, 1742, 1743, 3067, 1195, 3068, 1562, 1780, 1780,
+     1780, 3069, 1781, 3070, 1180, 1782, 3077, 1736, 1229, 1229,
+     1229, 1564, 1564, 1564, 3078, 1784, 1784, 1784, 3079, 1785,
+     3080, 1738, 1786, 1239, 1239, 1239, 1231, 3081, 1565, 1570,
+     1570, 1570, 3082, 1571, 3083, 3084, 1572, 1573, 1573, 1573,
+     3085, 1241, 3086, 1748, 1791, 1791, 1791, 3071, 1792, 3087,
+     3088, 1793, 3089, 3090, 1574, 1575, 1575, 1575, 3093, 1576,
+     3094, 3095, 1577, 1579, 1579, 1579, 1783, 1795, 1795, 1795,
+
+     3096, 1796, 1789, 3097, 1797, 1255, 1255, 1255, 3098, 3099,
+     1580, 1584, 1584, 1584, 1801, 1801, 1801, 3100, 1802, 3101,
+     3107, 1803, 3108, 1257, 1804, 1804, 1804, 3109, 1585, 1262,
+     1262, 1262, 1589, 1589, 1589, 1822, 1822, 1822, 2164, 2164,
+     2164, 1805, 1606, 1606, 1606, 3116, 3117, 1264, 3118, 3119,
+     1590, 3120, 1823, 3121, 3122, 1799, 1824, 1824, 1824, 1607,
+     1825, 3123, 3124, 1826, 1293, 1293, 1293, 1610, 1610, 1610,
+     1829, 1829, 1829, 3125, 1830, 3126, 3127, 1831, 1806, 1300,
+     1300, 1300, 1295, 3130, 1611, 1614, 1614, 1614, 1834, 1834,
+     1834, 3131, 1835, 3132, 3133, 1836, 3141, 1302, 1306, 1306,
+
+     1306, 3136, 1615, 1620, 1620, 1620, 1841, 1841, 1841, 3142,
+     1842, 3143, 3144, 1843, 1180, 3137, 1308, 1844, 1844, 1844,
+     1621, 1847, 1847, 1847, 1319, 1319, 1319, 3145, 1827, 1331,
+     1331, 1331, 3136, 3146, 1845, 1632, 1632, 1632, 1848, 1833,
+     3147, 3148, 1321, 3139, 1857, 1857, 1857, 1333, 1858, 3151,
+     3152, 1859, 1633, 1860, 1860, 1860, 1635, 1635, 1635, 1838,
+     3134, 1862, 1862, 1862, 3153, 1863, 3155, 1849, 1864, 3156,
+     3157, 1861, 3158, 1636, 1347, 1347, 1347, 1867, 1867, 1867,
+     1642, 1642, 1642, 3159, 1871, 1871, 1871, 3167, 1872, 3160,
+     1850, 1873, 1349, 1856, 1868, 3172, 3149, 1643, 1644, 1644,
+
+     1644, 3161, 1645, 3154, 3173, 1646, 1876, 1876, 1876, 1374,
+     1374, 1374, 1659, 1659, 1659, 3174, 1660, 3175, 3176, 1661,
+     1887, 1887, 1887, 1877, 3468, 3468, 3468, 1376, 3468, 3468,
+     3468, 3468, 3468, 3468, 1390, 1390, 1390, 1888, 3150, 3177,
+     1865, 3468, 1894, 1894, 1894, 3468, 3162, 3180, 3468, 1671,
+     1671, 1671, 1392, 1672, 1742, 1743, 1673, 3180, 3163, 1895,
+     1898, 1898, 1898, 1405, 1405, 1405, 1413, 1413, 1413, 1422,
+     1422, 1422, 3136, 3168, 1886, 1890, 3170, 1899, 1910, 1910,
+     1910, 1407, 3136, 3183, 1415, 3169, 3137, 1424, 3171, 1892,
+     1433, 1433, 1433, 3139, 1889, 1911, 1687, 1687, 1687, 3184,
+
+     1688, 1891, 3185, 1689, 1180, 1690, 1690, 1690, 1435, 1691,
+     3186, 3187, 1692, 1442, 1442, 1442, 1696, 1696, 1696, 3190,
+     1697, 3188, 3201, 1698, 1912, 3199, 1906, 1901, 1454, 1454,
+     1454, 1444, 1903, 1701, 1701, 1701, 3191, 1702, 3204, 3189,
+     1703, 1462, 1462, 1462, 3200, 3178, 1456, 1913, 1708, 1708,
+     1708, 3192, 1709, 3202, 3207, 1710, 1711, 1711, 1711, 1464,
+     1712, 3209, 3210, 1713, 1470, 1470, 1470, 1715, 1715, 1715,
+     3212, 1716, 3203, 3208, 1717, 3213, 1720, 1720, 1720, 1915,
+     1721, 3211, 1472, 1722, 1480, 1480, 1480, 3214, 3180, 1920,
+     1725, 1725, 1725, 1928, 1928, 1928, 3216, 1929, 1922, 3180,
+
+     1930, 3217, 1482, 1489, 1489, 1489, 3218, 1726, 1936, 1936,
+     1936, 1923, 1495, 1495, 1495, 1502, 1502, 1502, 1940, 1940,
+     1940, 1491, 1510, 1510, 1510, 1937, 1943, 1943, 1943, 3219,
+     1497, 1926, 3220, 1504, 3221, 1941, 1518, 1518, 1518, 3222,
+     1512, 3223, 3224, 1944, 1741, 1741, 1741, 1193, 1193, 1193,
+     3234, 3235, 1934, 3236, 1520, 3237, 1780, 1780, 1780, 3238,
+     1781, 3239, 1742, 1782, 3243, 1195, 3244, 1939, 1229, 1229,
+     1229, 1784, 1784, 1784, 3245, 1785, 3246, 3247, 1786, 1938,
+     1239, 1239, 1239, 3248, 1942, 3249, 1231, 1945, 3250, 1791,
+     1791, 1791, 3252, 1792, 3253, 1947, 1793, 3254, 1241, 1952,
+
+     1795, 1795, 1795, 3255, 1796, 3256, 3257, 1797, 1255, 1255,
+     1255, 3258, 1948, 1801, 1801, 1801, 3263, 1802, 3259, 3264,
+     1803, 1804, 1804, 1804, 3265, 3261, 1257, 1262, 1262, 1262,
+     3260, 1985, 1999, 1999, 1999, 1982, 2000, 3262, 1805, 2001,
+     2008, 2008, 2008, 3266, 3267, 1264, 2008, 2008, 2008, 1969,
+     1969, 1969, 3268, 1822, 1822, 1822, 2014, 2014, 2014, 3269,
+     2015, 3270, 3271, 2016, 1824, 1824, 1824, 3272, 1825, 1989,
+     1823, 1826, 1293, 1293, 1293, 1829, 1829, 1829, 2002, 1830,
+     3273, 3274, 1831, 1300, 1300, 1300, 3275, 1834, 1834, 1834,
+     1295, 1835, 3276, 1180, 1836, 2021, 2021, 2021, 1306, 1306,
+
+     1306, 1302, 3278, 3279, 2009, 3280, 3281, 1841, 1841, 1841,
+     1970, 1842, 2022, 2009, 1843, 3282, 1308, 3283, 3277, 2017,
+     1844, 1844, 1844, 2026, 2026, 2026, 3284, 2027, 3285, 3286,
+     2028, 2029, 2029, 2029, 1847, 1847, 1847, 1845, 2031, 2031,
+     2031, 3287, 2032, 3288, 3289, 2033, 3290, 3291, 2030, 2020,
+     3292, 1848, 2035, 2035, 2035, 2039, 2039, 2039, 3468, 3468,
+     3468, 3293, 2023, 2042, 2042, 2042, 1331, 1331, 1331, 3294,
+     2036, 3295, 2040, 3296, 3297, 3468, 1860, 1860, 1860, 3298,
+     2043, 1857, 1857, 1857, 1333, 1858, 3299, 1180, 1859, 1862,
+     1862, 1862, 3301, 1863, 1861, 3302, 1864, 1347, 1347, 1347,
+
+     1867, 1867, 1867, 2047, 2047, 2047, 3300, 2048, 3303, 3304,
+     2049, 3305, 3306, 2044, 3307, 1349, 3308, 1868, 2050, 2050,
+     2050, 1871, 1871, 1871, 2041, 1872, 3309, 3310, 1873, 1876,
+     1876, 1876, 2055, 2055, 2055, 2051, 2056, 3311, 3312, 2057,
+     2058, 2058, 2058, 2045, 3313, 3314, 1877, 2064, 2064, 2064,
+     1374, 1374, 1374, 1887, 1887, 1887, 3315, 2059, 2069, 2069,
+     2069, 3316, 2070, 3317, 2065, 2071, 3318, 3319, 1376, 3320,
+     1888, 2072, 2072, 2072, 3468, 3468, 3468, 2075, 2075, 2075,
+     1390, 1390, 1390, 1894, 1894, 1894, 3322, 3323, 2073, 1180,
+     3324, 3468, 3325, 3326, 2076, 2079, 2079, 2079, 1392, 2080,
+
+     1895, 3327, 2081, 2082, 2082, 2082, 1898, 1898, 1898, 3321,
+     2085, 2085, 2085, 3328, 2086, 3329, 2068, 2087, 3330, 3331,
+     2083, 3332, 3333, 1899, 2089, 2089, 2089, 1413, 1413, 1413,
+     3334, 3335, 2074, 1422, 1422, 1422, 1910, 1910, 1910, 3336,
+     2077, 3337, 2090, 3338, 3339, 1415, 3340, 3341, 2099, 2099,
+     2099, 1424, 2100, 1911, 3343, 2101, 2103, 2103, 2103, 1442,
+     1442, 1442, 2108, 2108, 2108, 2110, 2110, 2110, 3468, 3468,
+     3468, 1454, 1454, 1454, 2104, 3344, 3345, 1444, 2092, 2109,
+     3346, 2095, 2111, 3347, 3348, 3468, 1470, 1470, 1470, 1456,
+     1462, 1462, 1462, 3349, 2117, 2117, 2117, 2119, 2119, 2119,
+
+     1480, 1480, 1480, 3350, 1472, 1928, 1928, 1928, 1464, 1929,
+     2106, 2118, 1930, 1180, 2120, 1489, 1489, 1489, 1482, 3342,
+     1936, 1936, 1936, 2128, 2128, 2128, 3351, 2129, 3352, 3353,
+     2130, 3354, 2112, 1491, 3356, 3357, 2115, 1937, 2113, 1495,
+     1495, 1495, 1502, 1502, 1502, 1940, 1940, 1940, 2133, 2133,
+     2133, 2116, 2134, 3358, 3359, 2135, 3360, 1497, 3361, 3362,
+     1504, 3363, 1941, 3365, 1180, 2121, 2126, 2136, 2136, 2136,
+     1943, 1943, 1943, 2138, 2138, 2138, 3366, 2139, 3355, 3367,
+     2140, 1518, 1518, 1518, 3368, 2137, 3369, 1944, 2146, 2146,
+     2146, 1193, 1193, 1193, 1969, 1969, 1969, 2132, 2131, 1520,
+
+     2165, 2165, 2165, 3370, 3371, 2147, 1972, 1972, 1972, 1195,
+     2168, 2168, 2168, 2169, 2169, 2169, 1980, 1980, 1980, 1229,
+     1229, 1229, 2178, 2178, 2178, 2181, 2181, 2181, 1255, 1255,
+     1255, 2185, 2185, 2185, 1999, 1999, 1999, 1231, 2000, 2141,
+     2179, 2001, 2182, 1262, 1262, 1262, 1257, 3372, 2186, 2198,
+     2198, 2198, 2148, 2008, 2008, 2008, 2205, 2205, 2205, 3375,
+     3376, 1264, 2207, 2207, 2207, 3377, 2199, 3378, 3379, 2175,
+     2014, 2014, 2014, 3380, 2015, 1755, 1180, 2016, 1180, 2208,
+     1293, 1293, 1293, 2213, 2213, 2213, 1180, 2184, 3465, 2197,
+     2021, 2021, 2021, 2215, 2215, 2215, 1180, 2216, 1295, 1180,
+
+     2217, 2214, 1306, 1306, 1306, 1754, 1180, 2022, 2209, 2026,
+     2026, 2026, 3381, 2027, 3382, 1180, 2028, 2029, 2029, 2029,
+     1308, 2221, 2221, 2221, 1180, 2222, 1180, 3399, 2223, 2035,
+     2035, 2035, 1180, 2210, 2030, 2031, 2031, 2031, 1180, 2032,
+     3387, 3401, 2033, 2037, 2037, 2037, 1180, 2036, 3391, 2218,
+     2039, 2039, 2039, 2228, 2228, 2228, 1180, 2229, 3413, 3388,
+     2230, 2231, 2231, 2231, 2042, 2042, 2042, 2040, 2234, 2234,
+     2234, 1180, 2235, 3389, 3383, 2236, 1180, 1180, 2232, 3400,
+     3384, 2043, 1331, 1331, 1331, 1347, 1347, 1347, 2047, 2047,
+     2047, 3392, 2048, 3393, 3385, 2049, 2050, 2050, 2050, 1180,
+
+     1333, 1180, 3394, 1349, 2240, 2240, 2240, 2233, 2241, 3421,
+     1180, 2242, 1180, 2051, 2055, 2055, 2055, 1180, 2056, 3386,
+     1753, 2057, 2058, 2058, 2058, 2246, 2246, 2246, 1180, 2247,
+     3390, 1180, 2248, 1752, 1180, 2237, 2249, 2249, 2249, 2059,
+     2064, 2064, 2064, 2238, 2254, 2254, 2254, 1180, 2255, 3397,
+     1180, 2256, 1180, 2250, 1374, 1374, 1374, 2065, 2069, 2069,
+     2069, 1180, 2070, 3407, 3395, 2071, 2072, 2072, 2072, 2260,
+     2260, 2260, 1376, 2261, 1180, 3396, 2262, 2263, 2263, 2263,
+     2075, 2075, 2075, 2073, 2265, 2265, 2265, 3398, 2266, 3405,
+     1180, 2267, 3409, 3403, 2264, 1751, 3402, 2076, 1390, 1390,
+
+     1390, 1180, 2079, 2079, 2079, 2259, 2080, 1750, 3414, 2081,
+     2082, 2082, 2082, 2270, 2270, 2270, 1392, 2271, 1749, 3433,
+     2272, 2085, 2085, 2085, 1180, 2086, 1180, 2083, 2087, 2089,
+     2089, 2089, 1413, 1413, 1413, 2278, 2278, 2278, 1422, 1422,
+     1422, 2282, 2282, 2282, 2099, 2099, 2099, 2090, 2100, 2268,
+     1415, 2101, 2279, 2103, 2103, 2103, 1424, 1180, 2283, 2290,
+     2290, 2290, 2108, 2108, 2108, 2293, 2293, 2293, 3427, 2294,
+     3404, 2104, 2295, 2110, 2110, 2110, 1180, 2291, 1180, 2109,
+     3410, 2296, 2296, 2296, 1180, 2297, 1180, 2284, 2298, 1180,
+     2111, 1454, 1454, 1454, 3406, 1180, 2276, 1747, 1180, 2280,
+
+     1462, 1462, 1462, 1470, 1470, 1470, 2117, 2117, 2117, 1456,
+     2304, 2304, 2304, 3411, 2305, 1180, 3408, 2306, 1464, 3415,
+     1180, 1472, 1180, 2118, 2119, 2119, 2119, 2307, 2307, 2307,
+     3412, 2308, 3417, 3419, 2309, 1480, 1480, 1480, 1489, 1489,
+     1489, 2120, 1180, 2128, 2128, 2128, 1180, 2129, 3422, 2302,
+     2130, 1746, 1745, 1482, 1180, 3420, 1491, 2300, 1495, 1495,
+     1495, 1502, 1502, 1502, 3428, 2133, 2133, 2133, 2303, 2134,
+     1180, 1180, 2135, 2136, 2136, 2136, 1497, 3423, 1744, 1504,
+     2138, 2138, 2138, 3434, 2139, 3416, 1180, 2140, 1518, 1518,
+     1518, 2137, 3418, 2146, 2146, 2146, 3424, 2324, 2324, 2324,
+
+     2310, 2325, 1737, 2315, 2326, 1180, 1520, 3425, 3426, 2317,
+     2147, 1193, 1193, 1193, 2318, 2328, 2328, 2328, 2333, 2333,
+     2333, 2334, 2334, 2334, 2156, 2156, 2156, 1735, 1180, 1195,
+     2336, 2336, 2336, 1732, 2319, 2341, 2341, 2341, 2164, 2164,
+     2164, 2165, 2165, 2165, 2342, 2342, 2342, 2168, 2168, 2168,
+     2169, 2169, 2169, 2345, 2345, 2345, 2346, 2346, 2346, 2347,
+     2347, 2347, 2348, 2348, 2348, 1229, 1229, 1229, 2178, 2178,
+     2178, 2181, 2181, 2181, 3429, 2327, 1180, 2354, 2354, 2354,
+     3435, 2355, 1180, 1231, 2356, 1731, 2179, 1729, 2182, 1180,
+     2343, 2358, 2358, 2358, 2185, 2185, 2185, 2360, 2360, 2360,
+
+     1728, 2361, 1727, 1724, 2362, 1262, 1262, 1262, 1180, 2359,
+     1180, 2186, 2198, 2198, 2198, 1180, 2350, 2374, 2374, 2374,
+     1180, 2375, 3430, 1264, 2376, 2377, 2377, 2377, 3439, 2199,
+     2205, 2205, 2205, 2382, 2382, 2382, 2207, 2207, 2207, 2384,
+     2384, 2384, 1180, 2385, 3437, 3431, 2386, 1293, 1293, 1293,
+     2213, 2213, 2213, 2208, 2373, 2215, 2215, 2215, 1180, 2216,
+     1719, 3440, 2217, 3436, 1718, 1295, 1180, 3443, 2214, 1306,
+     1306, 1306, 1180, 2221, 2221, 2221, 3438, 2222, 3441, 2383,
+     2223, 2228, 2228, 2228, 1180, 2229, 1180, 1308, 2230, 2231,
+     2231, 2231, 2400, 2400, 2400, 3432, 2401, 3442, 2388, 2402,
+
+     2234, 2234, 2234, 3445, 2235, 1180, 2232, 2236, 1331, 1331,
+     1331, 1347, 1347, 1347, 2240, 2240, 2240, 1180, 2241, 3449,
+     1180, 2242, 2391, 2246, 2246, 2246, 1333, 2247, 1180, 1349,
+     2248, 2249, 2249, 2249, 2410, 2410, 2410, 1180, 2411, 1706,
+     1180, 2412, 2254, 2254, 2254, 1180, 2255, 1704, 2250, 2256,
+     2417, 2417, 2417, 1374, 1374, 1374, 2260, 2260, 2260, 2404,
+     2261, 3447, 1180, 2262, 3444, 3446, 2405, 2418, 2263, 2263,
+     2263, 1376, 2420, 2420, 2420, 3450, 2421, 3455, 3448, 2422,
+     2265, 2265, 2265, 1180, 2266, 2264, 1180, 2267, 1390, 1390,
+     1390, 2270, 2270, 2270, 1180, 2271, 1180, 1700, 2272, 3453,
+
+     2428, 2428, 2428, 2278, 2278, 2278, 1392, 2431, 2431, 2431,
+     3457, 2432, 1180, 1180, 2433, 3456, 1180, 2419, 2429, 1180,
+     2279, 1422, 1422, 1422, 2282, 2282, 2282, 2436, 2436, 2436,
+     1180, 2437, 3451, 3454, 2438, 2290, 2290, 2290, 3458, 1424,
+     3452, 2283, 2293, 2293, 2293, 3459, 2294, 1180, 3460, 2295,
+     1454, 1454, 1454, 2291, 2423, 2296, 2296, 2296, 1180, 2297,
+     3461, 3465, 2298, 1180, 1462, 1462, 1462, 1699, 1456, 1470,
+     1470, 1470, 2304, 2304, 2304, 1180, 2305, 1695, 3462, 2306,
+     1693, 2434, 1464, 1685, 2307, 2307, 2307, 1472, 2308, 1684,
+     3463, 2309, 1480, 1480, 1480, 3464, 2454, 2454, 2454, 1683,
+
+     1682, 2449, 3468, 3468, 3468, 2452, 3468, 3468, 3468, 1680,
+     1482, 1679, 2453, 2455, 3468, 3468, 3468, 1677, 1675, 3468,
+     1489, 1489, 1489, 3468, 1495, 1495, 1495, 2462, 2462, 2462,
+     2451, 3468, 1518, 1518, 1518, 2468, 2468, 2468, 1491, 2465,
+     2465, 2465, 1497, 1674, 1670, 2463, 1669, 2324, 2324, 2324,
+     1520, 2325, 1668, 2456, 2326, 1667, 1665, 1180, 1193, 1193,
+     1193, 2328, 2328, 2328, 2470, 2470, 2470, 2471, 2471, 2471,
+     2457, 1664, 1663, 2458, 1662, 1655, 1195, 2333, 2333, 2333,
+     2334, 2334, 2334, 1654, 2461, 2459, 2336, 2336, 2336, 2475,
+     2475, 2475, 1653, 1652, 2464, 2477, 2477, 2477, 2478, 2478,
+
+     2478, 2341, 2341, 2341, 2342, 2342, 2342, 2345, 2345, 2345,
+     2346, 2346, 2346, 2347, 2347, 2347, 1651, 2469, 2348, 2348,
+     2348, 2482, 2482, 2482, 2485, 2485, 2485, 2354, 2354, 2354,
+     1650, 2355, 1649, 1648, 2356, 3468, 3468, 3468, 1647, 2483,
+     1641, 2486, 2358, 2358, 2358, 1640, 2360, 2360, 2360, 1639,
+     2361, 1638, 3468, 2362, 1262, 1262, 1262, 2374, 2374, 2374,
+     2359, 2375, 2499, 2500, 2376, 2501, 2504, 2505, 1630, 2506,
+     1629, 1628, 1264, 2502, 2377, 2377, 2377, 2507, 1627, 1626,
+     2503, 2509, 2509, 2509, 2508, 2382, 2382, 2382, 2384, 2384,
+     2384, 1624, 2385, 1623, 1622, 2386, 1293, 1293, 1293, 1619,
+
+     1618, 2487, 2517, 2517, 2517, 1306, 1306, 1306, 2527, 2527,
+     2527, 2529, 2529, 2529, 1295, 2498, 1347, 1347, 1347, 2518,
+     2400, 2400, 2400, 1308, 2401, 1609, 1605, 2402, 1604, 2530,
+     1603, 2410, 2410, 2410, 1349, 2411, 1602, 1601, 2412, 2567,
+     2567, 2567, 2515, 2537, 2537, 2537, 2417, 2417, 2417, 1600,
+     2542, 2542, 2542, 1599, 2543, 1598, 2519, 2544, 1596, 1595,
+     2538, 1593, 1592, 2418, 2545, 2545, 2545, 2420, 2420, 2420,
+     1591, 2421, 1588, 1586, 2422, 1583, 2531, 2547, 2547, 2547,
+     1581, 1578, 2546, 2428, 2428, 2428, 2553, 2553, 2553, 2431,
+     2431, 2431, 1569, 2432, 1567, 2548, 2433, 1422, 1422, 1422,
+
+     1560, 2429, 1558, 2554, 2556, 2556, 2556, 2436, 2436, 2436,
+     1557, 2437, 1556, 1555, 2438, 1424, 3468, 3468, 3468, 1554,
+     1553, 2557, 3468, 3468, 3468, 3468, 3468, 3468, 2569, 2569,
+     2569, 1552, 1551, 3468, 2571, 2571, 2571, 1550, 1549, 3468,
+     1546, 1545, 3468, 1462, 1462, 1462, 2570, 1544, 2555, 1543,
+     2558, 2572, 1470, 1470, 1470, 1480, 1480, 1480, 2454, 2454,
+     2454, 1464, 2576, 2576, 2576, 1542, 2577, 1541, 1540, 2578,
+     1472, 2559, 1539, 1482, 1537, 2455, 2565, 2579, 2579, 2579,
+     3468, 3468, 3468, 2560, 3468, 3468, 3468, 2583, 2583, 2583,
+     1536, 1535, 2575, 1534, 2580, 1533, 1532, 3468, 2585, 2585,
+
+     2585, 3468, 1531, 2573, 1529, 2584, 1495, 1495, 1495, 2462,
+     2462, 2462, 1528, 2574, 1518, 1518, 1518, 1527, 2465, 2465,
+     2465, 2468, 2468, 2468, 1497, 1526, 1525, 2463, 2591, 2591,
+     2591, 2581, 1520, 1524, 1523, 2582, 1180, 2470, 2470, 2470,
+     2471, 2471, 2471, 2595, 2595, 2595, 2592, 2475, 2475, 2475,
+     2477, 2477, 2477, 2478, 2478, 2478, 2482, 2482, 2482, 2485,
+     2485, 2485, 2601, 2601, 2601, 1180, 2602, 1517, 1509, 2603,
+     1494, 1493, 2586, 1488, 2483, 1487, 2486, 1486, 2587, 1485,
+     2588, 1262, 1262, 1262, 2509, 2509, 2509, 2630, 2630, 2630,
+     1293, 1293, 1293, 2517, 2517, 2517, 2635, 2635, 2635, 1264,
+
+     2636, 1484, 1458, 2637, 2638, 2638, 2638, 1446, 1295, 1432,
+     2518, 2644, 2644, 2644, 2527, 2527, 2527, 2529, 2529, 2529,
+     1431, 1430, 2639, 1426, 1347, 1347, 1347, 1421, 2645, 2537,
+     2537, 2537, 2653, 2653, 2653, 2530, 2654, 1417, 1409, 2655,
+     1404, 2615, 1349, 2657, 2657, 2657, 2538, 2542, 2542, 2542,
+     1403, 2543, 1397, 1394, 2544, 1373, 2633, 2545, 2545, 2545,
+     2658, 2547, 2547, 2547, 1372, 2666, 2666, 2666, 2553, 2553,
+     2553, 2672, 2672, 2672, 1371, 2546, 2669, 2669, 2669, 2548,
+     2670, 2647, 2667, 2671, 1370, 2554, 2556, 2556, 2556, 2673,
+     2674, 2674, 2674, 1369, 2675, 1368, 1367, 2676, 2682, 2682,
+
+     2682, 1366, 1365, 2557, 2567, 2567, 2567, 2569, 2569, 2569,
+     2571, 2571, 2571, 1364, 1358, 2683, 2686, 2686, 2686, 1351,
+     2687, 1340, 1335, 2688, 1330, 2570, 1326, 2572, 2689, 2689,
+     2689, 1470, 1470, 1470, 1325, 1480, 1480, 1480, 2576, 2576,
+     2576, 1324, 2577, 1318, 1317, 2578, 2690, 1316, 1312, 1472,
+     2579, 2579, 2579, 1482, 2693, 2693, 2693, 1311, 2694, 1310,
+     1305, 2695, 2696, 2696, 2696, 1304, 1299, 2580, 2698, 2698,
+     2698, 2583, 2583, 2583, 2585, 2585, 2585, 1298, 1292, 2697,
+     1291, 1287, 2700, 2700, 2700, 2699, 1518, 1518, 1518, 2584,
+     2591, 2591, 2591, 2595, 2595, 2595, 1286, 1285, 2691, 2692,
+
+     2701, 2708, 2708, 2708, 1520, 2712, 2712, 2712, 2592, 2601,
+     2601, 2601, 1284, 2602, 1283, 1282, 2603, 1262, 1262, 1262,
+     1281, 1280, 2713, 2630, 2630, 2630, 1293, 1293, 1293, 2749,
+     2749, 2749, 2635, 2635, 2635, 1264, 2636, 1279, 1278, 2637,
+     2638, 2638, 2638, 1277, 1295, 1276, 1275, 2702, 2751, 2751,
+     2751, 2644, 2644, 2644, 1269, 2753, 2753, 2753, 2639, 2754,
+     1261, 1260, 2755, 1259, 1254, 2752, 1253, 1252, 2645, 2757,
+     2757, 2757, 2762, 2762, 2762, 1249, 1243, 2731, 2653, 2653,
+     2653, 1238, 2654, 1237, 1233, 2655, 1228, 2758, 1227, 2763,
+     2657, 2657, 2657, 1226, 2766, 2766, 2766, 2748, 2767, 1225,
+
+     1224, 2768, 2775, 2775, 2775, 1223, 1222, 2658, 2666, 2666,
+     2666, 2777, 2777, 2777, 1220, 2778, 1219, 1218, 2779, 2776,
+     2780, 2780, 2780, 1217, 1216, 2667, 2669, 2669, 2669, 1215,
+     2670, 1214, 1213, 2671, 2672, 2672, 2672, 2781, 2674, 2674,
+     2674, 1212, 2675, 1211, 1208, 2676, 2682, 2682, 2682, 2785,
+     2785, 2785, 2673, 2786, 1207, 1206, 2787, 2788, 2788, 2788,
+     2790, 2790, 2790, 2683, 2686, 2686, 2686, 1205, 2687, 1204,
+     1203, 2688, 1202, 1201, 2789, 1200, 1199, 2791, 2689, 2689,
+     2689, 1470, 1470, 1470, 1480, 1480, 1480, 2693, 2693, 2693,
+     1192, 2694, 1191, 1190, 2695, 1189, 2690, 1188, 1187, 1472,
+
+     1186, 1183, 1482, 2696, 2696, 2696, 2800, 2800, 2800, 1181,
+     2801, 1180, 1178, 2802, 2698, 2698, 2698, 2803, 2803, 2803,
+     2697, 2804, 1176, 1173, 2805, 2700, 2700, 2700, 1518, 1518,
+     1518, 2699, 2811, 2811, 2811, 2708, 2708, 2708, 2712, 2712,
+     2712, 1171, 1168, 2701, 1164, 2799, 1520, 2798, 1162, 2815,
+     2815, 2815, 1161, 2816, 1160, 2713, 2817, 1262, 1262, 1262,
+     2849, 2849, 2849, 2851, 2851, 2851, 1293, 1293, 1293, 2749,
+     2749, 2749, 2854, 2854, 2854, 1264, 2751, 2751, 2751, 1158,
+     2852, 2857, 2857, 2857, 1295, 2858, 1157, 1156, 2859, 2855,
+     2806, 1155, 1154, 2752, 2753, 2753, 2753, 1153, 2754, 1151,
+
+     1150, 2755, 2860, 2860, 2860, 2757, 2757, 2757, 2835, 2864,
+     2864, 2864, 2762, 2762, 2762, 2869, 2869, 2869, 2856, 2861,
+     2866, 2866, 2866, 2758, 2867, 1149, 2865, 2868, 2853, 2763,
+     1148, 1146, 2870, 2766, 2766, 2766, 1145, 2767, 1144, 1140,
+     2768, 2775, 2775, 2775, 2878, 2878, 2878, 1139, 2879, 1137,
+     1136, 2880, 2777, 2777, 2777, 1135, 2778, 1134, 2776, 2779,
+     2780, 2780, 2780, 2881, 2881, 2881, 1133, 2882, 1132, 1130,
+     2883, 2885, 2885, 2885, 2785, 2785, 2785, 2781, 2786, 1129,
+     1128, 2787, 2788, 2788, 2788, 2888, 2888, 2888, 2886, 2889,
+     1127, 1125, 2890, 2790, 2790, 2790, 2891, 2891, 2891, 2789,
+
+     2892, 1124, 1123, 2893, 1470, 1470, 1470, 1480, 1480, 1480,
+     2791, 2800, 2800, 2800, 1120, 2801, 1119, 1117, 2802, 2803,
+     2803, 2803, 1472, 2804, 1114, 1482, 2805, 2906, 2906, 2906,
+     2910, 2910, 2910, 2811, 2811, 2811, 2913, 2913, 2913, 2815,
+     2815, 2815, 1113, 2816, 1109, 2907, 2817, 2911, 1742, 2924,
+     2924, 2924, 1262, 1262, 1262, 2900, 2849, 2849, 2849, 2948,
+     2948, 2948, 2851, 2851, 2851, 1108, 2925, 1293, 1293, 1293,
+     1264, 2949, 2949, 2949, 2901, 2950, 1106, 1105, 2951, 2852,
+     2854, 2854, 2854, 1104, 1101, 1295, 2953, 2953, 2953, 1100,
+     2954, 1099, 1098, 2955, 2860, 2860, 2860, 2855, 2857, 2857,
+
+     2857, 2934, 2858, 1096, 1095, 2859, 2957, 2957, 2957, 1094,
+     2958, 2861, 1093, 2959, 2864, 2864, 2864, 1092, 2952, 2962,
+     2962, 2962, 1087, 2963, 1085, 1084, 2964, 1083, 2866, 2866,
+     2866, 2865, 2867, 1082, 1081, 2868, 2869, 2869, 2869, 2965,
+     2965, 2965, 1080, 2966, 1079, 1078, 2967, 2878, 2878, 2878,
+     1077, 2879, 1076, 2870, 2880, 2881, 2881, 2881, 1075, 2882,
+     1072, 1069, 2883, 2885, 2885, 2885, 2976, 2976, 2976, 1068,
+     2977, 1067, 1061, 2978, 2888, 2888, 2888, 1060, 2889, 1058,
+     2886, 2890, 2891, 2891, 2891, 1057, 2892, 1055, 1052, 2893,
+     2994, 2994, 2994, 1480, 1480, 1480, 2906, 2906, 2906, 3002,
+
+     3002, 3002, 2910, 2910, 2910, 3004, 3004, 3004, 2995, 3005,
+     1051, 1482, 3006, 1048, 2907, 1046, 3003, 1742, 1045, 2911,
+     1742, 1044, 1039, 1742, 3007, 3007, 3007, 2913, 2913, 2913,
+     3008, 3008, 3008, 3009, 3009, 3009, 2924, 2924, 2924, 3018,
+     3018, 3018, 1038, 3019, 1036, 1035, 3020, 1262, 1262, 1262,
+     3036, 3036, 3036, 2925, 2948, 2948, 2948, 1034, 1032, 2996,
+     2949, 2949, 2949, 1031, 2950, 1264, 1029, 2951, 3037, 3037,
+     3037, 2953, 2953, 2953, 1027, 2954, 1026, 1023, 2955, 1018,
+     2957, 2957, 2957, 1017, 2958, 1014, 3038, 2959, 2962, 2962,
+     2962, 1013, 2963, 1012, 1009, 2964, 2965, 2965, 2965, 1008,
+
+     2966, 1006, 1003, 2967, 3042, 3042, 3042, 3050, 3050, 3050,
+     2976, 2976, 2976, 3027, 2977, 1001, 1000, 2978, 3052, 3052,
+     3052, 3043,  999,  998, 3051, 2994, 2994, 2994, 1480, 1480,
+     1480, 3002, 3002, 3002,  996, 3053,  995, 3072, 3072, 3072,
+      994, 3073,  993, 2995, 3074,  992, 1482,  991, 3003, 1742,
+     3004, 3004, 3004,  988, 3005, 1742,  987, 3006, 3007, 3007,
+     3007, 3008, 3008, 3008, 3009, 3009, 3009,  986, 1742, 3018,
+     3018, 3018,  983, 3019,  980,  979, 3020,  977,  976, 3066,
+     1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740,  973,
+      970, 1740, 3091, 3091, 3091,  967, 1740, 1740, 1740, 1742,
+
+     1740, 3036, 3036, 3036, 3037, 3037, 3037, 3042, 3042, 3042,
+     3092, 3102, 3102, 3102,  966, 3103,  958,  957, 3104, 3105,
+     3105, 3105, 3038,  956, 3043, 1740, 1740, 1740, 1740, 1740,
+     1740, 1740, 1740, 1740, 1740, 1740, 3106,  955, 1740, 3050,
+     3050, 3050,  949, 1740, 1740, 1740, 1742, 1740, 3110, 3110,
+     3110,  948, 3111,  947,  945, 3112, 3051, 3052, 3052, 3052,
+     3113, 3113, 3113,  944, 3114,  943,  942, 3115, 3128, 3128,
+     3128,  941, 1740, 1740, 3053, 3072, 3072, 3072,  940, 3073,
+      935,  932, 3074,  934,  929,  928, 3129,  926, 3091, 3091,
+     3091,  924,  923, 1742, 1740, 1740, 1740, 1740, 1740, 3140,
+
+     1740, 1740, 1740,  921,  919, 1740, 3092, 3105, 3105, 3105,
+     1740, 1740, 1740, 1742, 1740, 3102, 3102, 3102,  917, 3103,
+      915,  913, 3104,  910, 3106, 3164, 3164, 3164,  909, 3165,
+      908,  907, 3166, 3128, 3128, 3128, 3182, 3182, 3182, 1740,
+     1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 3140,
+      906, 3129, 1740,  904, 1742, 1743,  902, 1740, 1740, 1740,
+     1742, 1740, 3110, 3110, 3110,  901, 3111,  900,  898, 3112,
+     3113, 3113, 3113,  896, 3114,  895,  893, 3115, 3193, 3193,
+     3193, 3195, 3195, 3195,  891,  890, 1740, 1740, 3197, 3197,
+     3197,  888, 3164, 3164, 3164, 3194, 3165,  884, 3196, 3166,
+
+     3205, 3205, 3205,  883,  881, 3198, 3215, 3215, 3215, 3182,
+     3182, 3182, 3193, 3193, 3193,  876,  874, 3206, 3225, 3225,
+     3225,  870, 3226,  869, 1180, 3227,  868, 1742,  866, 3194,
+     3195, 3195, 3195, 3228, 3228, 3228,  864, 3229,  863,  862,
+     3230, 3197, 3197, 3197, 3231, 3231, 3231, 3196, 3232,  860,
+      858, 3233, 3205, 3205, 3205, 3240, 3240, 3240, 3198, 3241,
+     1947,  857, 3242, 3215, 3215, 3215, 3225, 3225, 3225, 3206,
+     3226,  855,  853, 3227,  852, 3228, 3228, 3228,  851, 3229,
+      850, 1180, 3230, 3231, 3231, 3231,  849, 3232,  848,  847,
+     3233, 3240, 3240, 3240,  845, 3241,  843,  842, 3242,  839,
+
+     3251, 3364, 3364, 3364, 3364, 3364, 3364,  838, 3373,  837,
+      835, 3374, 3466, 3466, 3466, 3466, 3466, 3466,  833, 1180,
+      822,  821, 1180,  818,  816,  814,  813,  812,  810,  808,
+     3467,  806,  804, 3467,  264,  264,  264,  264,  264,  264,
+      264,  264,  264,  265,  265,  265,  265,  265,  265,  265,
+      265,  265,  270,  270,  270,  270,  270,  270,  270,  270,
+      270,  273,  273,  273,  273,  273,  273,  273,  273,  273,
+      276,  276,  276,  276,  276,  276,  276,  276,  276,  279,
+      279,  279,  279,  279,  279,  279,  279,  279,  286,  286,
+      286,  286,  286,  286,  286,  286,  286,  294,  294,  294,
+
+      294,  294,  294,  294,  294,  294,  298,  298,  298,  298,
+      298,  298,  298,  298,  298,  310,  310,  310,  310,  310,
+      310,  310,  310,  310,  314,  314,  314,  314,  314,  314,
+      314,  314,  314,  321,  321,  321,  321,  321,  321,  321,
+      321,  321,  332,  332,  332,  332,  332,  332,  332,  332,
+      332,  340,  340,  340,  340,  340,  340,  340,  340,  340,
+      346,  346,  346,  346,  346,  346,  346,  346,  346,  352,
+      352,  352,  352,  352,  352,  352,  352,  352,  358,  358,
+      358,  358,  358,  358,  358,  358,  358,  363,  363,  363,
+      363,  363,  363,  363,  363,  363,  382,  382,  382,  382,
+
+      382,  382,  382,  382,  382,  389,  389,  389,  389,  389,
+      389,  389,  389,  389,  397,  397,  397,  397,  397,  397,
+      397,  397,  397,  402,  402,  402,  402,  402,  402,  402,
+      402,  402,  408,  408,  408,  408,  408,  408,  408,  408,
+      408,  413,  413,  413,  413,  413,  413,  413,  413,  413,
+      419,  419,  419,  419,  419,  419,  419,  419,  419,  427,
+      427,  427,  427,  427,  427,  427,  427,  427,  435,  435,
+      435,  435,  435,  435,  435,  435,  435,  442,  442,  442,
+      442,  442,  442,  442,  442,  442,  449,  449,  449,  449,
+      449,  449,  449,  449,  449,  453,  453,  453,  453,  453,
+
+      453,  453,  453,  453,  459,  459,  459,  459,  459,  459,
+      459,  459,  459,  465,  465,  465,  465,  465,  465,  465,
+      465,  465,  483,  483,  483,  483,  483,  483,  483,  483,
+      483,  490,  490,  490,  490,  490,  490,  490,  490,  490,
+      499,  499,  499,  499,  499,  499,  499,  499,  499,  505,
+      505,  505,  505,  505,  505,  505,  505,  505,  515,  515,
+      515,  515,  515,  515,  515,  515,  515,  521,  521,  521,
+      521,  521,  521,  521,  521,  521,  526,  526,  526,  526,
+      526,  526,  526,  526,  526,  532,  532,  532,  532,  532,
+      532,  532,  532,  532,  538,  538,  538,  538,  538,  538,
+
+      538,  538,  538,  544,  544,  544,  544,  544,  544,  544,
+      544,  544,  551,  551,  551,  551,  551,  551,  551,  551,
+      551,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+      563,  563,  563,  563,  563,  563,  563,  563,  563,  571,
+      571,  571,  571,  571,  571,  571,  571,  571,  577,  577,
+      577,  577,  577,  577,  577,  577,  577,  584,  584,  584,
+      584,  584,  584,  584,  584,  584,  589,  589,  589,  589,
+      589,  589,  589,  589,  589,  595,  595,  595,  595,  595,
+      595,  595,  595,  595,  600,  600,  600,  600,  600,  600,
+      600,  600,  600,  607,  607,  607,  607,  607,  607,  607,
+
+      607,  607,  613,  613,  613,  613,  613,  613,  613,  613,
+      613,  620,  620,  620,  620,  620,  620,  620,  620,  620,
+      628,  628,  628,  628,  628,  628,  628,  628,  628,  636,
+      636,  636,  636,  636,  636,  636,  636,  636,  640,  640,
+      640,  640,  640,  640,  640,  640,  640,  646,  646,  646,
+      646,  646,  646,  646,  646,  646,  650,  650,  650,  650,
+      650,  650,  650,  650,  650,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  662,  662,  662,  662,  662,  662,
+      662,  662,  662,  668,  668,  668,  668,  668,  668,  668,
+      668,  668,  673,  673,  673,  673,  673,  673,  673,  673,
+
+      673,  693,  693,  693,  803,  802,  801,  693,  720,  720,
+      720,  799,  798,  796,  720,  724,  724,  724,  793,  792,
+      791,  724,  732,  732,  732,  789,  787,  786,  732,  743,
+      743,  743,  784,  782,  781,  743,  749,  749,  749,  779,
+      776,  775,  749,  772,  772,  772,  774,  773,  771,  772,
+      780,  780,  780, 3468,  718,  751,  780,  785,  785,  785,
+      750,  748,  746,  785,  790,  790,  790,  745,  744,  742,
+      790,  800,  800,  800,  738,  734,  733,  800,  807,  807,
+      807,  731,  730,  727,  807,  811,  811,  811,  726,  725,
+      723,  811,  817,  817,  817,  722,  721,  719,  817,  836,
+
+      836,  836,  714, 3468,  694,  836,  846,  846,  846,  692,
+      690,  684,  846,  856,  856,  856,  683,  684,  683,  856,
+      861,  861,  861,  682,  681, 3468,  861,  867,  867,  867,
+     3468, 3468, 3468,  867,  875,  875,  875, 3468, 3468, 3468,
+      875,  882,  882,  882, 3468, 3468, 3468,  882,  889,  889,
+      889, 3468, 3468, 3468,  889,  894,  894,  894, 3468, 3468,
+     3468,  894,  899,  899,  899, 3468, 3468, 3468,  899,  905,
+      905,  905, 3468, 3468, 3468,  905,  914,  914,  914, 3468,
+     3468, 3468,  914,  918,  918,  918, 3468, 3468, 3468,  918,
+      922,  922,  922, 3468, 3468, 3468,  922,  927,  927,  927,
+
+     3468, 3468, 3468,  927,  931,  931,  931,  931,  931,  931,
+      931, 3468,  931,  693,  693,  693, 3468, 3468, 3468,  693,
+      946, 3468, 3468, 3468,  946,  720,  720,  720, 3468, 3468,
+     3468,  720,  978, 3468, 3468, 3468,  978,  724,  724,  724,
+     3468, 3468, 3468,  724,  985, 3468, 3468, 3468,  985,  732,
+      732,  732, 3468, 3468, 3468,  732,  997, 3468, 3468, 3468,
+      997,  743,  743,  743, 3468, 3468, 3468,  743, 1002, 3468,
+     3468, 3468, 1002,  749,  749,  749, 3468, 3468, 3468,  749,
+     1007, 3468, 3468, 3468, 1007,  772,  772,  772, 3468, 3468,
+     3468,  772, 1028, 3468, 3468, 3468, 1028,  780,  780,  780,
+
+     3468, 3468, 3468,  780, 1033, 3468, 3468, 3468, 1033,  785,
+      785,  785, 3468, 3468, 3468,  785, 1037, 3468, 3468, 3468,
+     1037,  790,  790,  790, 3468, 3468, 3468,  790, 1047, 3468,
+     3468, 3468, 1047,  800,  800,  800, 3468, 3468, 3468,  800,
+     1056, 3468, 3468, 3468, 1056,  807,  807,  807, 3468, 3468,
+     3468,  807, 1059, 3468, 3468, 3468, 1059,  811,  811,  811,
+     3468, 3468, 3468,  811, 1066, 3468, 3468, 3468, 1066,  817,
+      817,  817, 3468, 3468, 3468,  817, 1086, 3468, 3468, 3468,
+     1086,  836,  836,  836, 3468, 3468, 3468,  836, 1097, 3468,
+     3468, 3468, 1097,  846,  846,  846, 3468, 3468, 3468,  846,
+
+     1107, 3468, 3468, 3468, 1107,  856,  856,  856, 3468, 3468,
+     3468,  856, 1112, 3468, 3468, 3468, 1112,  861,  861,  861,
+     3468, 3468, 3468,  861, 1118, 3468, 3468, 3468, 1118,  867,
+      867,  867, 3468, 3468, 3468,  867, 1126, 3468, 3468, 3468,
+     1126,  875,  875,  875, 3468, 3468, 3468,  875, 1131, 3468,
+     3468, 3468, 1131,  882,  882,  882, 3468, 3468, 3468,  882,
+     1138, 3468, 3468, 3468, 1138,  889,  889,  889, 3468, 3468,
+     3468,  889, 1143, 3468, 3468, 3468, 1143,  894,  894,  894,
+     3468, 3468, 3468,  894, 1147, 3468, 3468, 3468, 1147,  899,
+      899,  899, 3468, 3468, 3468,  899, 1152, 3468, 3468, 3468,
+
+     1152,  905,  905,  905, 3468, 3468, 3468,  905, 1159, 3468,
+     3468, 3468, 1159,  914,  914,  914, 3468, 3468, 3468,  914,
+     1163, 3468, 3468, 3468, 1163,  918,  918,  918, 3468, 3468,
+     3468,  918, 1167, 3468, 3468, 3468, 1167,  922,  922,  922,
+     3468, 3468, 3468,  922, 1172, 3468, 3468, 3468, 1172,  927,
+      927,  927, 3468, 3468, 3468,  927, 1177, 3468, 3468, 3468,
+     1177, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+     1185, 3468, 3468, 3468, 3468, 1185,  693,  693,  693, 3468,
+     3468, 3468,  693, 1194, 1194, 1194, 1194, 3468, 3468, 1194,
+     1194,  720,  720,  720, 3468, 3468, 3468,  720, 1230, 1230,
+
+     1230, 1230, 3468, 3468, 1230, 1230,  724,  724,  724, 3468,
+     3468, 3468,  724, 1240, 1240, 1240, 1240, 3468, 3468, 1240,
+     1240,  732,  732,  732, 3468, 3468, 3468,  732, 1256, 1256,
+     1256, 1256, 3468, 3468, 1256, 1256,  743,  743,  743, 3468,
+     3468, 3468,  743, 1263, 1263, 1263, 1263, 3468, 3468, 1263,
+     1263,  749,  749,  749, 3468, 3468, 3468,  749, 1271, 1271,
+     1271, 1271, 3468, 3468, 1271, 1271,  772,  772,  772, 3468,
+     3468, 3468,  772, 1294, 1294, 1294, 1294, 3468, 3468, 1294,
+     1294,  780,  780,  780, 3468, 3468, 3468,  780, 1301, 1301,
+     1301, 1301, 3468, 3468, 1301, 1301,  785,  785,  785, 3468,
+
+     3468, 3468,  785, 1307, 1307, 1307, 1307, 3468, 3468, 1307,
+     1307,  790,  790,  790, 3468, 3468, 3468,  790, 1320, 1320,
+     1320, 1320, 3468, 3468, 1320, 1320,  800,  800,  800, 3468,
+     3468, 3468,  800, 1332, 1332, 1332, 1332, 3468, 3468, 1332,
+     1332,  807,  807,  807, 3468, 3468, 3468,  807, 1337, 1337,
+     1337, 1337, 3468, 3468, 1337, 1337,  811,  811,  811, 3468,
+     3468, 3468,  811, 1348, 1348, 1348, 1348, 3468, 3468, 1348,
+     1348,  817,  817,  817, 3468, 3468, 3468,  817, 1375, 1375,
+     1375, 1375, 3468, 3468, 1375, 1375,  836,  836,  836,  836,
+     3468,  836, 3468,  836, 1391, 1391, 1391, 1391, 3468, 3468,
+
+     1391, 1391,  846,  846,  846, 3468, 3468, 3468,  846, 1406,
+     1406, 1406, 1406, 3468, 3468, 1406, 1406,  856,  856,  856,
+     3468, 3468, 3468,  856, 1414, 1414, 1414, 1414, 3468, 3468,
+     1414, 1414,  861,  861,  861, 3468, 3468, 3468,  861, 1423,
+     1423, 1423, 1423, 3468, 3468, 1423, 1423,  867,  867,  867,
+     3468, 3468, 3468,  867, 1434, 1434, 1434, 1434, 3468, 3468,
+     1434, 1434,  875,  875,  875,  875, 3468,  875, 3468,  875,
+     1443, 1443, 1443, 1443, 3468, 3468, 1443, 1443,  882,  882,
+      882,  882, 3468,  882, 3468,  882, 1455, 1455, 1455, 1455,
+     3468, 3468, 1455, 1455,  889,  889,  889, 3468, 3468, 3468,
+
+      889, 1463, 1463, 1463, 1463, 3468, 3468, 1463, 1463,  894,
+      894,  894,  894, 3468,  894, 3468,  894, 1471, 1471, 1471,
+     1471, 3468, 3468, 1471, 1471,  899,  899,  899,  899, 3468,
+      899, 3468,  899, 1481, 1481, 1481, 1481, 3468, 3468, 1481,
+     1481,  905,  905,  905, 3468, 3468, 3468,  905, 1490, 1490,
+     1490, 1490, 3468, 3468, 1490, 1490,  914,  914,  914, 3468,
+     3468, 3468,  914, 1496, 1496, 1496, 1496, 3468, 3468, 1496,
+     1496, 1503, 1503, 1503, 1503, 3468, 3468, 1503, 1503,  922,
+      922,  922, 3468, 3468, 3468,  922, 1511, 1511, 1511, 1511,
+     3468, 3468, 1511, 1511,  927,  927,  927, 3468, 3468, 3468,
+
+      927, 1519, 1519, 1519, 1519, 3468, 3468, 1519, 1519, 1179,
+     1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1185, 3468,
+     1185, 3468, 3468, 1185,  693,  693,  693, 3468, 3468, 3468,
+      693, 1194, 1194, 1194, 1194, 3468, 3468, 1194, 1194,  720,
+      720,  720,  720, 3468,  720, 3468,  720, 1230, 1230, 1230,
+     1230, 3468, 3468, 1230, 1230,  724,  724,  724,  724, 3468,
+      724, 3468,  724, 1240, 1240, 1240, 1240, 3468, 3468, 1240,
+     1240,  732,  732,  732, 3468, 3468, 3468,  732, 1256, 1256,
+     1256, 1256, 3468, 3468, 1256, 1256,  743,  743,  743, 3468,
+     3468, 3468,  743, 1263, 1263, 1263, 1263, 3468, 3468, 1263,
+
+     1263,  749,  749,  749, 3468, 3468, 3468,  749, 1271, 1271,
+     1271, 1271, 3468, 3468, 1271, 1271,  772,  772,  772, 3468,
+     3468, 3468,  772, 1294, 1294, 1294, 1294, 3468, 3468, 1294,
+     1294,  780,  780,  780,  780, 3468,  780, 3468,  780, 1301,
+     1301, 1301, 1301, 3468, 3468, 1301, 1301,  785,  785,  785,
+      785, 3468,  785, 3468,  785, 1307, 1307, 1307, 1307, 3468,
+     3468, 1307, 1307,  790,  790,  790, 3468, 3468, 3468,  790,
+     1320, 1320, 1320, 1320, 3468, 3468, 1320, 1320,  800,  800,
+      800, 3468, 3468, 3468,  800, 1332, 1332, 1332, 1332, 3468,
+     3468, 1332, 1332,  807,  807,  807,  807, 3468,  807, 3468,
+
+      807, 1337, 1337, 1337, 1337, 3468, 3468, 1337, 1337,  811,
+      811,  811,  811, 3468,  811, 3468,  811, 1348, 1348, 1348,
+     1348, 3468, 3468, 1348, 1348,  817,  817,  817, 3468, 3468,
+     3468,  817, 1375, 1375, 1375, 1375, 3468, 3468, 1375, 1375,
+      836,  836,  836, 3468, 3468, 3468,  836, 1391, 1391, 1391,
+     1391, 3468, 3468, 1391, 1391,  846,  846,  846, 3468, 3468,
+     3468,  846, 1406, 1406, 1406, 1406, 3468, 3468, 1406, 1406,
+      856,  856,  856, 3468, 3468, 3468,  856, 1414, 1414, 1414,
+     1414, 3468, 3468, 1414, 1414,  861,  861,  861, 3468, 3468,
+     3468,  861, 1423, 1423, 1423, 1423, 3468, 3468, 1423, 1423,
+
+      867,  867,  867, 3468, 3468, 3468,  867, 1434, 1434, 1434,
+     1434, 3468, 3468, 1434, 1434,  875,  875,  875, 3468, 3468,
+     3468,  875, 1443, 1443, 1443, 1443, 3468, 3468, 1443, 1443,
+      882,  882,  882, 3468, 3468, 3468,  882, 1455, 1455, 1455,
+     1455, 3468, 3468, 1455, 1455,  889,  889,  889, 3468, 3468,
+     3468,  889, 1463, 1463, 1463, 1463, 3468, 3468, 1463, 1463,
+     1471, 1471, 1471, 1471, 3468, 3468, 1471, 1471,  899,  899,
+      899, 3468, 3468, 3468,  899, 1481, 1481, 1481, 1481, 3468,
+     3468, 1481, 1481,  905,  905,  905, 3468, 3468, 3468,  905,
+     1490, 1490, 1490, 1490, 3468, 3468, 1490, 1490,  914,  914,
+
+      914, 3468, 3468, 3468,  914, 1496, 1496, 1496, 1496, 3468,
+     3468, 1496, 1496, 1503, 1503, 1503, 1503, 3468, 3468, 1503,
+     1503,  922,  922,  922, 3468, 3468, 3468,  922, 1511, 1511,
+     1511, 1511, 3468, 3468, 1511, 1511,  927,  927,  927, 3468,
+     3468, 3468,  927, 1519, 1519, 1519, 1519, 3468, 3468, 1519,
+     1519, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+     1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740,  693,
+      693,  693, 3468, 3468, 3468,  693, 1194, 1194, 1194, 1194,
+     3468, 3468, 1194, 1194, 1230, 1230, 1230, 1230, 3468, 3468,
+     1230, 1230,  724,  724,  724, 3468, 3468, 3468,  724, 1240,
+
+     1240, 1240, 1240, 3468, 3468, 1240, 1240,  732,  732,  732,
+     3468, 3468, 3468,  732, 1256, 1256, 1256, 1256, 3468, 3468,
+     1256, 1256,  743,  743,  743, 3468, 3468, 3468,  743, 1263,
+     1263, 1263, 1263, 3468, 3468, 1263, 1263,  749,  749,  749,
+     3468, 3468, 3468,  749,  772,  772,  772, 3468, 3468, 3468,
+      772, 1294, 1294, 1294, 1294, 3468, 3468, 1294, 1294,  780,
+      780,  780, 3468, 3468, 3468,  780, 1301, 1301, 1301, 1301,
+     3468, 3468, 1301, 1301,  785,  785,  785, 3468, 3468, 3468,
+      785, 1307, 1307, 1307, 1307, 3468, 3468, 1307, 1307,  790,
+      790,  790, 3468, 3468, 3468,  790, 1320, 1320, 1320, 1320,
+
+     3468, 3468, 1320, 1320,  800,  800,  800, 3468, 3468, 3468,
+      800, 1332, 1332, 1332, 1332, 3468, 3468, 1332, 1332, 1337,
+     1337, 1337, 1337, 3468, 3468, 1337, 1337, 1348, 1348, 1348,
+     1348, 3468, 3468, 1348, 1348,  817,  817,  817, 3468, 3468,
+     3468,  817, 1375, 1375, 1375, 1375, 3468, 3468, 1375, 1375,
+      836,  836,  836,  836, 3468,  836, 3468,  836, 1391, 1391,
+     1391, 1391, 3468, 3468, 1391, 1391,  846,  846,  846, 3468,
+     3468, 3468,  846, 1406, 1406, 1406, 1406, 3468, 3468, 1406,
+     1406,  856,  856,  856, 3468, 3468, 3468,  856, 1414, 1414,
+     1414, 1414, 3468, 3468, 1414, 1414,  861,  861,  861, 3468,
+
+     3468, 3468,  861, 1423, 1423, 1423, 1423, 3468, 3468, 1423,
+     1423,  867,  867,  867, 3468, 3468, 3468,  867, 1434, 1434,
+     1434, 1434, 3468, 3468, 1434, 1434,  875,  875,  875, 3468,
+     3468, 3468,  875, 1443, 1443, 1443, 1443, 3468, 3468, 1443,
+     1443,  882,  882,  882, 3468, 3468, 3468,  882, 1455, 1455,
+     1455, 1455, 3468, 3468, 1455, 1455,  889,  889,  889, 3468,
+     3468, 3468,  889, 1463, 1463, 1463, 1463, 3468, 3468, 1463,
+     1463, 1471, 1471, 1471, 1471, 3468, 3468, 1471, 1471,  899,
+      899,  899, 3468, 3468, 3468,  899, 1481, 1481, 1481, 1481,
+     3468, 3468, 1481, 1481,  905,  905,  905, 3468, 3468, 3468,
+
+      905, 1490, 1490, 1490, 1490, 3468, 3468, 1490, 1490,  914,
+      914,  914,  914, 3468,  914, 3468,  914, 1496, 1496, 1496,
+     1496, 3468, 3468, 1496, 1496, 1503, 1503, 1503, 1503, 3468,
+     3468, 1503, 1503,  922,  922,  922,  922, 3468,  922, 3468,
+      922, 1511, 1511, 1511, 1511, 3468, 3468, 1511, 1511,  927,
+      927,  927,  927, 3468,  927, 3468,  927, 1519, 1519, 1519,
+     1519, 3468, 3468, 1519, 1519, 1179, 1179, 1179, 1179, 1179,
+     1179, 1179, 1179, 1179, 1740, 1740, 1740, 1740, 1740, 1740,
+     1740, 1740, 1740,  693,  693,  693, 3468, 3468, 3468,  693,
+     1194, 1194, 1194, 1194, 3468, 3468, 1194, 1194, 1230, 1230,
+
+     1230, 1230, 3468, 3468, 1230, 1230,  724,  724,  724, 3468,
+     3468, 3468,  724, 1240, 1240, 1240, 1240, 3468, 3468, 1240,
+     1240,  732,  732,  732, 3468, 3468, 3468,  732, 1256, 1256,
+     1256, 1256, 3468, 3468, 1256, 1256,  743,  743,  743, 3468,
+     3468, 3468,  743, 1263, 1263, 1263, 1263, 3468, 3468, 1263,
+     1263,  749,  749,  749, 3468, 3468, 3468,  749,  772,  772,
+      772, 3468, 3468, 3468,  772, 1294, 1294, 1294, 1294, 3468,
+     3468, 1294, 1294,  780,  780,  780, 3468, 3468, 3468,  780,
+     1301, 1301, 1301, 1301, 3468, 3468, 1301, 1301,  785,  785,
+      785,  785, 3468,  785, 3468,  785, 1307, 1307, 1307, 1307,
+
+     3468, 3468, 1307, 1307,  790,  790,  790, 3468, 3468, 3468,
+      790, 1320, 1320, 1320, 1320, 3468, 3468, 1320, 1320,  800,
+      800,  800,  800, 3468,  800, 3468,  800, 1332, 1332, 1332,
+     1332, 3468, 3468, 1332, 1332, 1348, 1348, 1348, 1348, 3468,
+     3468, 1348, 1348,  817,  817,  817, 3468, 3468, 3468,  817,
+     1375, 1375, 1375, 1375, 3468, 3468, 1375, 1375,  836,  836,
+      836,  836, 3468,  836, 3468,  836, 1391, 1391, 1391, 1391,
+     3468, 3468, 1391, 1391,  846,  846,  846, 3468, 3468, 3468,
+      846, 1406, 1406, 1406, 1406, 3468, 3468, 1406, 1406,  856,
+      856,  856, 3468, 3468, 3468,  856, 1414, 1414, 1414, 1414,
+
+     3468, 3468, 1414, 1414,  861,  861,  861, 3468, 3468, 3468,
+      861, 1423, 1423, 1423, 1423, 3468, 3468, 1423, 1423,  867,
+      867,  867, 3468, 3468, 3468,  867, 1434, 1434, 1434, 1434,
+     3468, 3468, 1434, 1434,  875,  875,  875, 3468, 3468, 3468,
+      875, 1443, 1443, 1443, 1443, 3468, 3468, 1443, 1443,  882,
+      882,  882,  882, 3468,  882, 3468,  882, 1455, 1455, 1455,
+     1455, 3468, 3468, 1455, 1455,  889,  889,  889, 3468, 3468,
+     3468,  889, 1463, 1463, 1463, 1463, 3468, 3468, 1463, 1463,
+     1471, 1471, 1471, 1471, 3468, 3468, 1471, 1471,  899,  899,
+      899,  899, 3468,  899, 3468,  899, 1481, 1481, 1481, 1481,
+
+     3468, 3468, 1481, 1481,  905,  905,  905, 3468, 3468, 3468,
+      905, 1490, 1490, 1490, 1490, 3468, 3468, 1490, 1490, 1496,
+     1496, 1496, 1496, 3468, 3468, 1496, 1496, 1503, 1503, 1503,
+     1503, 3468, 3468, 1503, 1503, 1511, 1511, 1511, 1511, 3468,
+     3468, 1511, 1511, 1519, 1519, 1519, 1519, 3468, 3468, 1519,
+     1519, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+     1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740,  693,
+      693,  693,  693, 3468,  693, 3468,  693, 1194, 1194, 1194,
+     1194, 3468, 3468, 1194, 1194, 1230, 1230, 1230, 1230, 3468,
+     3468, 1230, 1230,  724,  724,  724, 3468, 3468, 3468,  724,
+
+     1240, 1240, 1240, 1240, 3468, 3468, 1240, 1240,  732,  732,
+      732, 3468, 3468, 3468,  732, 1256, 1256, 1256, 1256, 3468,
+     3468, 1256, 1256,  743,  743,  743,  743, 3468,  743, 3468,
+      743, 1263, 1263, 1263, 1263, 3468, 3468, 1263, 1263,  749,
+      749,  749,  749, 3468,  749, 3468,  749,  772,  772,  772,
+      772, 3468,  772, 3468,  772, 1294, 1294, 1294, 1294, 3468,
+     3468, 1294, 1294,  780,  780,  780, 3468, 3468, 3468,  780,
+     1301, 1301, 1301, 1301, 3468, 3468, 1301, 1301, 1307, 1307,
+     1307, 1307, 3468, 3468, 1307, 1307,  790,  790,  790, 3468,
+     3468, 3468,  790,  800,  800,  800,  800, 3468,  800, 3468,
+
+      800, 1332, 1332, 1332, 1332, 3468, 3468, 1332, 1332, 1348,
+     1348, 1348, 1348, 3468, 3468, 1348, 1348,  817,  817,  817,
+     3468, 3468, 3468,  817, 1375, 1375, 1375, 1375, 3468, 3468,
+     1375, 1375,  836,  836,  836,  836, 3468,  836, 3468,  836,
+     1391, 1391, 1391, 1391, 3468, 3468, 1391, 1391,  846,  846,
+      846, 3468, 3468, 3468,  846,  856,  856,  856, 3468, 3468,
+     3468,  856, 1414, 1414, 1414, 1414, 3468, 3468, 1414, 1414,
+      861,  861,  861, 3468, 3468, 3468,  861, 1423, 1423, 1423,
+     1423, 3468, 3468, 1423, 1423,  867,  867,  867, 3468, 3468,
+     3468,  867,  875,  875,  875, 3468, 3468, 3468,  875, 1443,
+
+     1443, 1443, 1443, 3468, 3468, 1443, 1443,  882,  882,  882,
+     3468, 3468, 3468,  882, 1455, 1455, 1455, 1455, 3468, 3468,
+     1455, 1455,  889,  889,  889, 3468, 3468, 3468,  889, 1463,
+     1463, 1463, 1463, 3468, 3468, 1463, 1463, 1471, 1471, 1471,
+     1471, 3468, 3468, 1471, 1471, 1481, 1481, 1481, 1481, 3468,
+     3468, 1481, 1481,  905,  905,  905, 3468, 3468, 3468,  905,
+     1490, 1490, 1490, 1490, 3468, 3468, 1490, 1490, 1496, 1496,
+     1496, 1496, 3468, 3468, 1496, 1496, 1503, 1503, 1503, 1503,
+     3468, 3468, 1503, 1503, 1519, 1519, 1519, 1519, 3468, 3468,
+     1519, 1519, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+
+     1179, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740,
+     1194, 1194, 1194, 1194, 3468, 3468, 1194, 1194, 1230, 1230,
+     1230, 1230, 3468, 3468, 1230, 1230,  724,  724,  724, 3468,
+     3468, 3468,  724,  732,  732,  732, 3468, 3468, 3468,  732,
+     1256, 1256, 1256, 1256, 3468, 3468, 1256, 1256, 1263, 1263,
+     1263, 1263, 3468, 3468, 1263, 1263,  772,  772,  772, 3468,
+     3468, 3468,  772, 1294, 1294, 1294, 1294, 3468, 3468, 1294,
+     1294,  780,  780,  780, 3468, 3468, 3468,  780, 1307, 1307,
+     1307, 1307, 3468, 3468, 1307, 1307,  790,  790,  790, 3468,
+     3468, 3468,  790,  800,  800,  800, 3468, 3468, 3468,  800,
+
+     1332, 1332, 1332, 1332, 3468, 3468, 1332, 1332, 1348, 1348,
+     1348, 1348, 3468, 3468, 1348, 1348,  817,  817,  817, 3468,
+     3468, 3468,  817, 1375, 1375, 1375, 1375, 3468, 3468, 1375,
+     1375, 1391, 1391, 1391, 1391, 3468, 3468, 1391, 1391,  846,
+      846,  846, 3468, 3468, 3468,  846,  856,  856,  856, 3468,
+     3468, 3468,  856, 1414, 1414, 1414, 1414, 3468, 3468, 1414,
+     1414,  861,  861,  861, 3468, 3468, 3468,  861, 1423, 1423,
+     1423, 1423, 3468, 3468, 1423, 1423,  867,  867,  867, 3468,
+     3468, 3468,  867,  875,  875,  875, 3468, 3468, 3468,  875,
+      882,  882,  882, 3468, 3468, 3468,  882, 1455, 1455, 1455,
+
+     1455, 3468, 3468, 1455, 1455,  889,  889,  889, 3468, 3468,
+     3468,  889, 1463, 1463, 1463, 1463, 3468, 3468, 1463, 1463,
+     1471, 1471, 1471, 1471, 3468, 3468, 1471, 1471, 1481, 1481,
+     1481, 1481, 3468, 3468, 1481, 1481,  905,  905,  905,  905,
+     3468,  905, 3468,  905, 1490, 1490, 1490, 1490, 3468, 3468,
+     1490, 1490, 1496, 1496, 1496, 1496, 3468, 3468, 1496, 1496,
+     1503, 1503, 1503, 1503, 3468, 3468, 1503, 1503, 1519, 1519,
+     1519, 1519, 3468, 3468, 1519, 1519, 1179, 1179, 1179, 1179,
+     1179, 1179, 1179, 1179, 1179, 1740, 1740, 1740, 1740, 1740,
+     1740, 1740, 1740, 1740, 1194, 1194, 1194, 1194, 3468, 3468,
+
+     1194, 1194, 1230, 1230, 1230, 1230, 3468, 3468, 1230, 1230,
+      724,  724,  724, 3468, 3468, 3468,  724,  732,  732,  732,
+      732, 3468,  732, 3468,  732, 1263, 1263, 1263, 1263, 3468,
+     3468, 1263, 1263,  772,  772,  772, 3468, 3468, 3468,  772,
+     1294, 1294, 1294, 1294, 3468, 3468, 1294, 1294,  780,  780,
+      780,  780, 3468,  780, 3468,  780, 1307, 1307, 1307, 1307,
+     3468, 3468, 1307, 1307,  790,  790,  790, 3468, 3468, 3468,
+      790,  800,  800,  800, 3468, 3468, 3468,  800, 1332, 1332,
+     1332, 1332, 3468, 3468, 1332, 1332, 1348, 1348, 1348, 1348,
+     3468, 3468, 1348, 1348,  817,  817,  817, 3468, 3468, 3468,
+
+      817, 1375, 1375, 1375, 1375, 3468, 3468, 1375, 1375, 1391,
+     1391, 1391, 1391, 3468, 3468, 1391, 1391,  846,  846,  846,
+     3468, 3468, 3468,  846,  856,  856,  856, 3468, 3468, 3468,
+      856,  861,  861,  861,  861, 3468,  861, 3468,  861, 1423,
+     1423, 1423, 1423, 3468, 3468, 1423, 1423,  867,  867,  867,
+      867, 3468,  867, 3468,  867,  875,  875,  875, 3468, 3468,
+     3468,  875,  882,  882,  882, 3468, 3468, 3468,  882, 1455,
+     1455, 1455, 1455, 3468, 3468, 1455, 1455,  889,  889,  889,
+      889, 3468,  889, 3468,  889, 1463, 1463, 1463, 1463, 3468,
+     3468, 1463, 1463, 1471, 1471, 1471, 1471, 3468, 3468, 1471,
+
+     1471, 1481, 1481, 1481, 1481, 3468, 3468, 1481, 1481,  905,
+      905,  905,  905, 3468,  905, 3468,  905, 1490, 1490, 1490,
+     1490, 3468, 3468, 1490, 1490, 1496, 1496, 1496, 1496, 3468,
+     3468, 1496, 1496, 1519, 1519, 1519, 1519, 3468, 3468, 1519,
+     1519, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+     1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1194,
+     1194, 1194, 1194, 3468, 3468, 1194, 1194,  724,  724,  724,
+     3468, 3468, 3468,  724,  732,  732,  732, 3468, 3468, 3468,
+      732, 1263, 1263, 1263, 1263, 3468, 3468, 1263, 1263,  772,
+      772,  772, 3468, 3468, 3468,  772, 1294, 1294, 1294, 1294,
+
+     3468, 3468, 1294, 1294, 1307, 1307, 1307, 1307, 3468, 3468,
+     1307, 1307,  790,  790,  790, 3468, 3468, 3468,  790,  800,
+      800,  800, 3468, 3468, 3468,  800, 1348, 1348, 1348, 1348,
+     3468, 3468, 1348, 1348,  817,  817,  817, 3468, 3468, 3468,
+      817,  846,  846,  846, 3468, 3468, 3468,  846,  856,  856,
+      856, 3468, 3468, 3468,  856, 1423, 1423, 1423, 1423, 3468,
+     3468, 1423, 1423,  867,  867,  867, 3468, 3468, 3468,  867,
+      875,  875,  875, 3468, 3468, 3468,  875,  882,  882,  882,
+     3468, 3468, 3468,  882, 3075, 3075, 3075, 3075, 3075, 3075,
+     3075, 3075, 3075, 3076, 3076, 3076, 3076, 3076, 3076, 3076,
+
+     3076, 3076, 3135, 3135, 3135, 3135, 3135, 3135, 3135, 3135,
+     3135, 3138, 3138, 3138, 3138, 3138, 3138, 3138, 3138, 3138,
+     3179, 3179, 3179, 3179, 3179, 3179, 3179, 3179, 3179, 3181,
+     3181, 3181, 3181, 3181, 3181, 3181, 3181, 3181,  263, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468
     } ;
 
-static yyconst flex_int16_t yy_chk[12668] =
+static yyconst flex_int16_t yy_chk[12714] =
     {   0,
         0,    3,    3,    3,    4,    4,    4,    5,    5,    5,
         6,    6,    6,    7,    7,    7,   11,    3,    9,   12,
@@ -3125,204 +3134,204 @@ static yyconst flex_int16_t yy_chk[12668] =
         8,    8,    8,  268,   11,   13,   13,   12,   14,   14,
        13,   13,  317,   14,   14,  269,    8,   17,   17,  268,
        13,   15,   15,   14,   15,  272,   15,   16,   16,  371,
-       16,  269,   16,   18,   18, 1542,   15,   19,   19,   19,
-      549,  272,   16,   20,   20,   20,   23,   23,   23,   24,
-       24,   24,  549,   19,   25,   25,   25,  371, 1543,   20,
-      378,   17,   23, 1097,  317,   24,  266,  266,  266, 1097,
+       16,  269,   16,   18,   18,    0,   15,   19,   19,   19,
+      550,  272,   16,   20,   20,   20,   23,   23,   23,   24,
+       24,   24,  550,   19,   25,   25,   25,  371, 1540,   20,
+      378,   17,   23, 1100,  317,   24,  266,  266,  266, 1100,
 
        25,  267,  267,  267,  271,  271,  271,   18,   21,   21,
        21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
        21,   21,   21,  301,   21,   21,   21,   21,   21,   26,
        26,   26,   27,   27,   27,   28,   28,   28,  301,   29,
-       29,   29,   30,   30,   30,   26,  378,  478,   27,  295,
-      478,   28,  697,   21,   21,   29,  311,  290,   30,   31,
+       29,   29,   30,   30,   30,   26,  378,  479,   27,  295,
+      479,   28,  698,   21,   21,   29,  311,  290,   30,   31,
        31,   31,  292,  292,  292,  295,  299,  299,  299,  308,
-      308,  308,  311,  290,  367,   31,  697,   21,   22,   22,
+      308,  308,  311,  290,  367,   31,  698,   21,   22,   22,
        22,   22,   22,   22,   22,   22,   22,   22,   22,   22,
-       22,   22,   22, 1545,   22,   22,   22,   22,   22,   32,
+       22,   22,   22, 1542,   22,   22,   22,   22,   22,   32,
 
        32,   32,   33,   33,   33,   34,   34,   34,  282,   35,
-       35,   35,   36,   36,   36,   32,  290,  370,   33,  495,
-      753,   34,  495,   22,   22,   35,  367,  370,   36,   37,
+       35,   35,   36,   36,   36,   32,  290,  370,   33,  496,
+      754,   34,  496,   22,   22,   35,  367,  370,   36,   37,
        37,   37,   38,   38,   38,   39,   39,   39,   40,   40,
-       40,   41,   41,   41,  753,   37,  561,   22,   38,  322,
-      282,   39,  474,  561,   40,  370,  282,   41,   42,   42,
+       40,   41,   41,   41,  754,   37,  562,   22,   38,  322,
+      282,   39,  475,  562,   40,  370,  282,   41,   42,   42,
        42,  282,  315,  315,  315,  322,  282,  319,  319,  319,
-      330,  330,  330,  474,   42,   43,   43,   43,   43,   43,
+      330,  330,  330,  475,   42,   43,   43,   43,   43,   43,
        43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
       339,   43,   43,   43,   43,   43,   45,   45,   45,   46,
 
        46,   46,   47,   47,   47,  339,   48,   48,   48,   49,
-       49,   49,   45,  438,  566,   46, 1546,  438,   47,  337,
+       49,   49,   45,  425,  567,   46, 1543,  425,   47,  337,
        43,   43,   48,  337,  391,   49,  303,  337,   43,   44,
        44,   44,   44,   44,   44,   44,   44,   44,   44,   44,
        44,   44,   44,   44,  333,   44,   44,   44,   44,   44,
-       50,   50,   50,   51,   51,   51,   52,   52,   52, 1547,
-      333,  579,   55,   55,  575,  303,   50,   55,  304,   51,
-      566,  575,   52,  391,   44,   44,  391,   55,  303,  393,
-      303,  957,   44,   53,   53,   53,   53,   53,   53,   53,
-       53,   53,   53,   53,   53,   53,   53,   53,  957,   53,
-
-       53,   53,   53,   53, 1548,  347,   55,  304,   59,   59,
-       59,   60,   60,   60,   63,   63,   63,  579,   56,   56,
-      304,  347,  304,   56,   59,  327,  477,   60,   53,   53,
-       63,  393,  327,   56,  477,  685,   53,  405,  685,   53,
-      477,  327,  341,  341,  341, 1549,   53,   54,   54,   54,
+       50,   50,   50,   51,   51,   51,   52,   52,   52, 1544,
+      333,  580,   55,   55,  576,  303,   50,   55,  304,   51,
+      567,  576,   52,  391,   44,   44,  391,   55,  303,  393,
+      303,  603,   44,   53,   53,   53,   53,   53,   53,   53,
+       53,   53,   53,   53,   53,   53,   53,   53, 1546,   53,
+
+       53,   53,   53,   53, 1547,  347,   55,  304,   59,   59,
+       59,   60,   60,   60,   63,   63,   63,  580,   56,   56,
+      304,  347,  304,   56,   59,  327,  566,   60,   53,   53,
+       63,  393,  327,   56,  566,  686,   53,  603,  686,   53,
+      429,  327,  341,  341,  341, 1549,   53,   54,   54,   54,
        54,   54,   54,   54,   54,   54,   54,   54,   54,   54,
        54,   54,   56,   54,   54,   54,   54,   54,   64,   64,
-       64,   67,   67,   67,   68,   68,   68,  442,   69,   69,
-       69,   70,   70,   70,   64,  359,  377,   67,  342,  405,
-       68,  565,   54,   54,   69,  342, 1211,   70, 1550,  565,
+       64,   67,   67,   67,   68,   68,   68,  480,   69,   69,
+       69,   70,   70,   70,   64,  359,  377,   67,  342,  429,
+       68,  480,   54,   54,   69,  342, 1550,   70, 1551,  616,
 
-       54,  359,  377,   54,  342,  344,  344,  344,  406, 1211,
+       54,  359,  377,   54,  342,  344,  344,  344,  431,  959,
        54,   57,   57,   57,   57,   57,   57,   57,   57,   57,
-       57,   57,   57,   57,   57,   57,  442,   57,   57,   57,
+       57,   57,   57,   57,   57,   57,  959,   57,   57,   57,
        57,   57,   71,   71,   71,   72,   72,   72,   73,   73,
-       73,  444,   74,   74,   74,   75,   75,   75,   71, 1551,
-      383,   72,  354,  398,   73, 1552,   57,   57,   74,  354,
-      406,   75,  353,  353,  353,   57,  383,   57,  354,  398,
-      392,   57,  356,  356,  356,  484,   57,   57,   58,   58,
+       73,  444,   74,   74,   74,   75,   75,   75,   71, 1552,
+      383,   72,  354,  398,   73,  616,   57,   57,   74,  354,
+      431,   75,  353,  353,  353,   57,  383,   57,  354,  398,
+      392,   57,  356,  356,  356,  445,   57,   57,   58,   58,
        58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
        58,   58,   58,  444,   58,   58,   58,   58,   58,   76,
 
-       76,   76,   77,   77,   77,   78,   78,   78,  630,   79,
+       76,   76,   77,   77,   77,   78,   78,   78,  631,   79,
        79,   79,   80,   80,   80,   76,  369, 1553,   77,  392,
-      630,   78,  392,   58,   58,   79,  369,  484,   80,  364,
+      631,   78,  392,   58,   58,   79,  369,  445,   80,  364,
       364,  364,   58,  369,   58,  380,  380,  380,   58,  390,
-      390,  390, 1555,   58,   58,   61,   61,   61,   61,   61,
+      390,  390, 1554,   58,   58,   61,   61,   61,   61,   61,
        61,   61,   61,   61,   61,   61,   61,   61,   61,   61,
       375,   61,   61,   61,   61,   61,   81,   81,   81,   82,
-       82,   82,   83,   83,   83,  727,   84,   84,   84,   85,
-       85,   85,   81,  797, 1556,   82,  797,  479,   83,  375,
-       61,   61,   84,  375,  375,   85,  602,   61,  395,  395,
+       82,   82,   83,   83,   83,  728,   84,   84,   84,   85,
+       85,   85,   81,  704, 1373,   82,  677,  704,   83,  375,
+       61,   61,   84,  375,  375,   85, 1373,   61,  395,  395,
 
-      395,  479,  375,   61,  375,  404,  404,  404,  408,  408,
-      408,  727,   61,   62,   62,   62,   62,   62,   62,   62,
-       62,   62,   62,   62,   62,   62,   62,   62,  676,   62,
+      395,  677,  375,   61,  375,  403,  403,  403,  406,  406,
+      406,  728,   61,   62,   62,   62,   62,   62,   62,   62,
+       62,   62,   62,   62,   62,   62,   62,   62, 1555,   62,
        62,   62,   62,   62,   86,   86,   86,   87,   87,   87,
-       88,   88,   88,  676,   89,   89,   89,   90,   90,   90,
-       86,  411,  602,   87, 1562,  615,   88,  417,   62,   62,
-       89,  422,  433,   90,  417,   62, 1223,  411,  416,  416,
-      416,   62,  762,  417,  419,  419,  419,  422,  433, 1223,
+       88,   88,   88,  706,   89,   89,   89,   90,   90,   90,
+       86,  409,  420,   87,  404,  763,   88,  706,   62,   62,
+       89,  404,  415,   90, 1556,   62, 1557,  409,  420,  415,
+      404,   62,  414,  414,  414,  417,  417,  417,  415,  763,
        62,   65,   65,   65,   65,   65,   65,   65,   65,   65,
-       65,   65,   65,   65,   65,   65,  762,   65,   65,   65,
+       65,   65,   65,   65,   65,   65, 1559,   65,   65,   65,
 
        65,   65,   91,   91,   91,   92,   92,   92,   93,   93,
-       93,  615,   94,   94,   94,   95,   95,   95,   91,  449,
-      459,   92,  428, 1563,   93,  485,   65,   65,   94,  428,
-     1565,   95,  427,  427,  427,  449,  459,   65,  428,  430,
-      430,  430,  441,  441,  441, 1574,   65,   66,   66,   66,
+       93, 1560,   94,   94,   94,   95,   95,   95,   91,  436,
+      450,   92, 1566, 1567,   93,  485,   65,   65,   94,  460,
+     1569,   95,  428,  428,  428,  436,  450,   65,  433,  433,
+      433,  443,  443,  443,  486,  460,   65,   66,   66,   66,
        66,   66,   66,   66,   66,   66,   66,   66,   66,   66,
-       66,   66,  763,   66,   66,   66,   66,   66,   96,   96,
+       66,   66,  764,   66,   66,   66,   66,   66,   96,   96,
        96,   97,   97,   97,   98,   98,   98,  485,   99,   99,
-       99,  100,  100,  100,   96,  471,  763,   97, 1577,  764,
-       98, 1579,   66,   66,   99,  454, 1584,  100,  101,  101,
+       99,  100,  100,  100,   96,  472,  764,   97,  792,  765,
+       98,  792,   66,   66,   99,  455,  486,  100,  101,  101,
 
-      101,  471,  454,   66,  102,  102,  102,  446,  446,  446,
-      552,  454,   66,  764,  101,  453,  453,  453,  376, 1587,
+      101,  472,  455,   66,  102,  102,  102,  447,  447,  447,
+      553,  455,   66,  765,  101,  454,  454,  454,  376, 1030,
       102,  103,  103,  103,  103,  103,  103,  103,  103,  103,
-      103,  103,  103,  103,  103,  103,  765,  103,  103,  103,
+      103,  103,  103,  103,  103,  103, 1030,  103,  103,  103,
       103,  103,  105,  105,  105,  106,  106,  106,  107,  107,
-      107,  703,  108,  108,  108,  703,  376,  490,  105,  777,
-      765,  106,  552,  777,  107,  373,  103,  103,  108,  466,
-      505,  103,  376,  490,  553,  373,  466,  103,  456,  456,
-      456,  103,  465,  465,  465,  466,  505,  103,  104,  104,
+      107,  778,  108,  108,  108,  778,  376,  491,  105,  798,
+      710,  106,  553,  798,  107,  373,  103,  103,  108,  467,
+      506,  103,  376,  491,  710,  373,  467,  103,  457,  457,
+      457,  103,  466,  466,  466,  467,  506,  103,  104,  104,
       104,  104,  104,  104,  104,  104,  104,  104,  104,  104,
 
       104,  104,  104,  373,  104,  104,  104,  104,  104,  109,
-      109,  109,  110,  110,  110,  111,  111,  111,  631,  112,
-      112,  112,  468,  468,  468,  109,  553,  480,  110, 1588,
-     1589,  111, 1594,  104,  104,  112,  521,  532,  104,  480,
-      480,  483,  483,  483,  104,  487,  487,  487,  104,  499,
-      499,  499,  521,  532,  104,  113,  113,  113,  113,  113,
+      109,  109,  110,  110,  110,  111,  111,  111,  478,  112,
+      112,  112,  469,  469,  469,  109,  478,  481,  110, 1578,
+     1581,  111,  478,  104,  104,  112,  522,  533,  104,  481,
+      481,  484,  484,  484,  104,  488,  488,  488,  104,  500,
+      500,  500,  522,  533,  104,  113,  113,  113,  113,  113,
       113,  113,  113,  113,  113,  113,  113,  113,  113,  113,
-      631,  113,  113,  113,  113,  113,  115,  115,  115,  116,
-      116,  116,  117,  117,  117,  698,  118,  118,  118,  803,
-      500, 1595,  115,  803,  769,  116,  698,  500,  117,  698,
-
-      113,  113,  118,  516,  544,  113,  500,  502,  502,  502,
-      516,  113,  515,  515,  515,  518,  518,  518,  769,  516,
-      544, 1028,  113,  114,  114,  114,  114,  114,  114,  114,
-      114,  114,  114,  114,  114,  114,  114,  114, 1028,  114,
-      114,  114,  114,  114,  119,  119,  119,  120,  120,  120,
-      121,  121,  121,  705,  122,  122,  122,  526,  526,  526,
-      119,  558,  571,  120,  527, 1596,  121,  705,  114,  114,
-      122,  527, 1597,  114,  529,  529,  529,  558,  571,  114,
-      527,  538,  538,  538,  541,  541,  541,  551,  551,  551,
-      114,  123,  123,  123,  123,  123,  123,  123,  123,  123,
-
-      123,  123,  123,  123,  123,  123, 1598,  123,  123,  123,
-      123,  123,  125,  125,  125,  126,  126,  126,  129,  129,
-      129,  651,  130,  130,  130,  133,  133,  133,  125, 1179,
-     1599,  126,  539, 1179,  129, 1518,  123,  123,  130,  539,
-      578,  133,  555,  555,  555,  563,  563,  563,  539,  568,
-      568,  568,  123, 1600,  564, 1518, 1605,  123,  124,  124,
-      124,  124,  124,  124,  124,  124,  124,  124,  124,  124,
-      124,  124,  124,  651,  124,  124,  124,  124,  124,  134,
-      134,  134,  135,  135,  135,  136,  136,  136,  578,  137,
-      137,  137,  138,  138,  138,  134,  578, 1606,  135,  584,
-
-     1607,  136,  564,  124,  124,  137,  564,  595,  138,  577,
-      577,  577,  581,  581,  581,  584,  589,  589,  589,  124,
-      592,  592,  592,  595,  124,  127,  127,  127,  127,  127,
-      127,  127,  127,  127,  127,  127,  127,  127,  127,  127,
-     1611,  127,  127,  127,  127,  127,  139,  139,  139,  140,
-      140,  140,  143,  143,  143, 1615,  144,  144,  144,  147,
-      147,  147,  139, 1617, 1618,  140,  590,  607,  143,  620,
-      127,  127,  144,  590,  636,  147,  600,  600,  600,  604,
-      604,  604,  590,  607, 1622,  620,  127, 1625, 1626,  601,
-      636, 1053,  127,  128,  128,  128,  128,  128,  128,  128,
-
-      128,  128,  128,  128,  128,  128,  128,  128, 1053,  128,
-      128,  128,  128,  128,  148,  148,  148,  151,  151,  151,
-      152,  152,  152, 1369,  153,  153,  153,  154,  154,  154,
-      148, 1633, 1635,  151, 1636, 1369,  152,  601,  128,  128,
-      153, 1642, 1643,  154,  652,  601,  613,  613,  613,  614,
-      617,  617,  617, 1645,  128,  628,  628,  628,  629, 1646,
-      128,  131,  131,  131,  131,  131,  131,  131,  131,  131,
-      131,  131,  131,  131,  131,  131, 1647,  131,  131,  131,
-      131,  131,  155,  155,  155,  156,  156,  156,  157,  157,
-      157, 1648,  158,  158,  158,  629,  652,  614,  155,  646,
-
-      657,  156, 1649, 1650,  157,  614,  131,  131,  158,  131,
-      629,  131,  633,  633,  633,  646,  657,  131,  640,  640,
-      640,  643,  643,  643,  131, 1651, 1652,  131,  132,  132,
+      766,  113,  113,  113,  113,  113,  115,  115,  115,  116,
+      116,  116,  119,  119,  119,  554,  120,  120,  120,  123,
+      123,  123,  115, 1583,  766,  116,  501,  517,  119,  545,
+
+      113,  113,  120,  501,  517,  123,  503,  503,  503,  516,
+      516,  516,  501,  517,  632,  545,  113,  519,  519,  519,
+     1588,  113,  114,  114,  114,  114,  114,  114,  114,  114,
+      114,  114,  114,  114,  114,  114,  114,  554,  114,  114,
+      114,  114,  114,  124,  124,  124,  125,  125,  125,  126,
+      126,  126,  652,  127,  127,  127,  128,  128,  128,  124,
+     1182, 1591,  125,  528, 1182,  126,  632,  114,  114,  127,
+      528,  559,  128,  527,  527,  527,  530,  530,  530,  528,
+      539,  539,  539,  114,  542,  542,  542,  559,  114,  117,
+      117,  117,  117,  117,  117,  117,  117,  117,  117,  117,
+
+      117,  117,  117,  117,  652,  117,  117,  117,  117,  117,
+      129,  129,  129,  130,  130,  130,  133,  133,  133,  759,
+      134,  134,  134,  135,  135,  135,  129,  770, 1592,  130,
+      540, 1593,  133,  759,  117,  117,  134,  540,  572,  135,
+      552,  552,  552,  556,  556,  556,  540,  564,  564,  564,
+      117,  770, 1598,  565,  572, 1049,  117,  118,  118,  118,
+      118,  118,  118,  118,  118,  118,  118,  118,  118,  118,
+      118,  118, 1049,  118,  118,  118,  118,  118,  136,  136,
+      136,  137,  137,  137,  138,  138,  138, 1599,  139,  139,
+      139,  140,  140,  140,  136, 1600, 1601,  137, 1602, 1522,
+
+      138,  565,  118,  118,  139,  565,  585,  140,  569,  569,
+      569,  578,  578,  578,  582,  582,  582, 1603,  118, 1522,
+     1604,  579,  585, 1609,  118,  121,  121,  121,  121,  121,
+      121,  121,  121,  121,  121,  121,  121,  121,  121,  121,
+     1612,  121,  121,  121,  121,  121,  143,  143,  143,  144,
+      144,  144,  147,  147,  147,  653,  148,  148,  148,  590,
+      590,  590,  143, 1616, 1618,  144,  596,  591,  147,  579,
+      121,  121,  148,  121,  591,  121,  699,  579,  593,  593,
+      593,  121,  596,  591,  601,  601,  601,  699,  121, 1619,
+      699,  121,  122,  122,  122,  122,  122,  122,  122,  122,
+
+      122,  122,  122,  122,  122,  122,  122,  653,  122,  122,
+      122,  122,  122,  151,  151,  151,  152,  152,  152,  153,
+      153,  153, 1623,  154,  154,  154,  605,  605,  605,  151,
+      608, 1626,  152, 1627, 1628,  153,  621,  122,  122,  154,
+      122,  602,  122,  614,  614,  614,  608,  615,  122,  618,
+      618,  618,  621, 1629, 1630,  122,  630, 1638,  122,  131,
+      131,  131,  131,  131,  131,  131,  131,  131,  131,  131,
+      131,  131,  131,  131, 1640,  131,  131,  131,  131,  131,
+      155,  155,  155,  156,  156,  156,  157,  157,  157,  602,
+      158,  158,  158,  630, 1641,  615,  155,  602,  637,  156,
+
+     1214, 1647,  157,  615,  131,  131,  158,  131,  630,  131,
+      629,  629,  629, 1214,  637,  131,  634,  634,  634,  641,
+      641,  641,  644,  644,  644, 1648,  131,  132,  132,  132,
       132,  132,  132,  132,  132,  132,  132,  132,  132,  132,
-      132,  132,  132, 1662,  132,  132,  132,  132,  132,  161,
-      161,  161,  162,  162,  162,  165,  165,  165,  708,  166,
-      166,  166, 1664,  641, 1665,  161, 1670,  668,  162,  708,
-      641,  165,  708,  132,  132,  166,  132,  931,  132,  641,
-      650,  650,  650,  668,  132,  654,  654,  654,  662,  662,
-      662,  132, 1672,  931,  132,  141,  141,  141,  141,  141,
+      132,  132, 1650,  132,  132,  132,  132,  132,  161,  161,
+      161,  162,  162,  162,  165,  165,  165, 1651,  166,  166,
+      166, 1652,  642,  647,  161, 1653, 1654,  162, 1655,  642,
+      165,  658,  132,  132,  166,  132, 1656,  132,  642,  647,
+      651,  651,  651,  132,  655,  655,  655,  658,  663,  663,
+      663,  666,  666,  666,  132,  141,  141,  141,  141,  141,
 
       141,  141,  141,  141,  141,  141,  141,  141,  141,  141,
-     1674,  141,  141,  141,  141,  141,  169,  169,  169,  170,
-      170,  170,  173,  173,  173,  709,  174,  174,  174,  177,
-      177,  177,  169, 1675, 1677,  170,  663,  674,  173,  709,
-      141,  141,  174,  663,  674,  177,  665,  665,  665,  673,
-      673,  673,  663,  674, 1678, 1679,  141,  142,  142,  142,
+     1657,  141,  141,  141,  141,  141,  169,  169,  169,  170,
+      170,  170,  173,  173,  173,  767,  174,  174,  174,  177,
+      177,  177,  169,  669,  933,  170,  664,  675,  173,  767,
+      141,  141,  174,  664,  675,  177,  674,  674,  674,  669,
+      933, 1667,  664,  675, 1669, 1670,  141,  142,  142,  142,
       142,  142,  142,  142,  142,  142,  142,  142,  142,  142,
-      142,  142, 1688,  142,  142,  142,  142,  142,  178,  178,
-      178,  179,  179,  179,  180,  180,  180,  758,  181,  181,
-      181,  182,  182,  182,  178, 1694, 1695,  179,  704, 1699,
+      142,  142, 1675,  142,  142,  142,  142,  142,  178,  178,
+      178,  179,  179,  179,  180,  180,  180,  769,  181,  181,
+      181,  182,  182,  182,  178, 1677, 1679,  179,  705, 1680,
 
-      180,  758,  142,  142,  181,  704, 1701,  182,  675,  675,
-      675,  704,  684,  684,  684, 1194, 1194, 1194,  142,  145,
+      180,  769,  142,  142,  181,  705, 1682,  182,  676,  676,
+      676,  705,  685,  685,  685,  948,  948,  948,  142,  145,
       145,  145,  145,  145,  145,  145,  145,  145,  145,  145,
-      145,  145,  145,  145, 1713,  145,  145,  145,  145,  145,
-      183,  183,  183,  184,  184,  184,  187,  187,  187,  711,
-      188,  188,  188,  189,  189,  189,  183, 1714, 1719,  184,
-      711,  713,  187,  711,  145,  145,  188,  715,  713,  189,
-      145,  684,  716,  717,  713,  145, 1722, 1723,  715,  716,
-      717,  715, 1202, 1202, 1202,  716,  717,  145,  146,  146,
+      145,  145,  145,  145, 1683,  145,  145,  145,  145,  145,
+      183,  183,  183,  184,  184,  184,  187,  187,  187,  709,
+      188,  188,  188,  189,  189,  189,  183, 1684, 1693,  184,
+      709,  714,  187,  709,  145,  145,  188,  712,  714,  189,
+      145,  685,  716, 1699,  714,  145, 1700, 1704,  712,  948,
+     1706,  712, 1718,  716, 1719, 1724,  716,  145,  146,  146,
       146,  146,  146,  146,  146,  146,  146,  146,  146,  146,
 
-      146,  146,  146, 1724,  146,  146,  146,  146,  146,  190,
-      190,  190,  191,  191,  191,  192,  192,  192,  766,  193,
-      193,  193,  194,  194,  194,  190, 1726,  768,  191,  757,
-      760,  192,  766,  146,  146,  193,  757,  760,  194,  146,
-      767,  768,  757,  760,  146,  934,  934,  934, 1735,  934,
-     1738,  767, 1741, 1742,  767, 1744,  146,  149,  149,  149,
+      146,  146,  146, 1727,  146,  146,  146,  146,  146,  190,
+      190,  190,  191,  191,  191,  192,  192,  192, 1728,  193,
+      193,  193,  194,  194,  194,  190, 1729, 1731,  191,  717,
+      718,  192, 1226,  146,  146,  193,  717,  718,  194,  146,
+      758,  761,  717,  718,  146, 1226, 1740,  758,  761, 1197,
+     1197, 1197, 1743,  758,  761, 1746,  146,  149,  149,  149,
       149,  149,  149,  149,  149,  149,  149,  149,  149,  149,
       149,  149,  149,  149,  149,  149,  149,  149,  149,  149,
       149,  149,  149,  149,  149,  149,  149,  149,  149,  149,
@@ -3332,1190 +3341,1196 @@ static yyconst flex_int16_t yy_chk[12668] =
       149,  149,  149,  149,  149,  149,  149,  149,  149,  149,
       149,  149,  149,  149,  149,  149,  149,  149,  149,  149,
       149,  159,  159,  159,  159,  159,  159,  159,  159,  159,
-      159,  159,  159,  159,  159,  159, 1745,  159,  159,  159,
+      159,  159,  159,  159,  159,  159, 1747,  159,  159,  159,
       159,  159,  197,  197,  197,  198,  198,  198,  199,  199,
-      199, 1746,  200,  200,  200,  201,  201,  201,  197, 1066,
-     1734,  198, 1277, 1747,  199, 1748,  159,  159,  200, 1066,
-      159,  201,  946,  946,  946, 1277, 1066,  159, 1749, 1750,
-      159,  968,  968,  968,  159, 1734,  159,  159,  160,  160,
+      199,  768,  200,  200,  200,  201,  201,  201,  197, 1749,
+     1739,  198,  768, 1750,  199,  768,  159,  159,  200, 1751,
+      159,  201,  936,  936,  936, 1752,  936,  159, 1753, 1754,
+      159,  970,  970,  970,  159, 1739,  159,  159,  160,  160,
 
       160,  160,  160,  160,  160,  160,  160,  160,  160,  160,
-      160,  160,  160, 1752,  160,  160,  160,  160,  160,  202,
-      202,  202,  203,  203,  203,  204,  204,  204, 1753,  207,
-      207,  207,  208,  208,  208,  202, 1755, 1756,  203, 1758,
-     1760,  204, 1761,  160,  160,  207,  946,  160,  208,  980,
-      980,  980, 1763,  980,  160,  968,  980,  160, 1218, 1218,
-     1218,  160, 1765,  160,  160,  163,  163,  163,  163,  163,
+      160,  160,  160, 1755,  160,  160,  160,  160,  160,  202,
+      202,  202,  203,  203,  203,  204,  204,  204, 1757,  207,
+      207,  207,  208,  208,  208,  202, 1758, 1760,  203, 1761,
+     1763,  204, 1069,  160,  160,  207, 1765,  160,  208,  982,
+      982,  982, 1069,  982,  160,  970,  982,  160, 1766, 1069,
+     1768,  160, 1770,  160,  160,  163,  163,  163,  163,  163,
       163,  163,  163,  163,  163,  163,  163,  163,  163,  163,
-     1767,  163,  163,  163,  163,  163,  211,  211,  211,  212,
-      212,  212,  213,  213,  213, 1768,  214,  214,  214,  725,
-
-      725,  725,  211, 1769, 1770,  212, 1771, 1773,  213, 1782,
-      163,  163,  214,  163,  163,  163,  725, 1783,  988,  988,
-      988,  163,  988, 1785,  163,  988, 1789, 1793,  163, 1795,
-     1802,  163,  164,  164,  164,  164,  164,  164,  164,  164,
-      164,  164,  164,  164,  164,  164,  164, 1803,  164,  164,
+     1772,  163,  163,  163,  163,  163,  211,  211,  211,  212,
+      212,  212,  213,  213,  213, 1773,  214,  214,  214,  726,
+
+      726,  726,  211, 1774, 1280,  212, 1775, 1776,  213, 1778,
+      163,  163,  214,  163,  163,  163,  726, 1280,  990,  990,
+      990,  163,  990, 1787,  163,  990, 1788, 1790,  163, 1794,
+     1798,  163,  164,  164,  164,  164,  164,  164,  164,  164,
+      164,  164,  164,  164,  164,  164,  164, 1800,  164,  164,
       164,  164,  164,  215,  215,  215,  216,  216,  216,  217,
-      217,  217, 1804,  218,  218,  218,  733,  733,  733,  215,
-     1805, 1807,  216, 1811, 1812,  217, 1813,  164,  164,  218,
-      164,  164,  164,  733, 1816, 1003, 1003, 1003,  164, 1003,
-     1823,  164, 1003, 1824, 1830,  164, 1837, 1838,  164,  167,
+      217,  217, 1807,  218,  218,  218,  734,  734,  734,  215,
+     1808, 1809,  216, 1810, 1812,  217, 1816,  164,  164,  218,
+      164,  164,  164,  734, 1817, 1005, 1005, 1005,  164, 1005,
+     1818,  164, 1005, 1821, 1828,  164, 1832, 1839,  164,  167,
 
       167,  167,  167,  167,  167,  167,  167,  167,  167,  167,
-      167,  167,  167,  167, 1847,  167,  167,  167,  167,  167,
-      221,  221,  221,  222,  222,  222,  223,  223,  223, 1850,
-      224,  224,  224,  749,  749,  749,  221, 1860, 1864,  222,
-     1868, 1869,  223, 1873,  167,  167,  224, 1874, 1875,  167,
-      749, 1274, 1274, 1274, 1876,  167,  168,  168,  168,  168,
+      167,  167,  167,  167, 1840,  167,  167,  167,  167,  167,
+      221,  221,  221,  222,  222,  222,  223,  223,  223, 1849,
+      224,  224,  224,  750,  750,  750,  221, 1852, 1866,  222,
+     1870, 1874,  223, 1875,  167,  167,  224, 1879, 1880,  167,
+      750, 1205, 1205, 1205, 1881,  167,  168,  168,  168,  168,
       168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
-      168, 1878,  168,  168,  168,  168,  168,  225,  225,  225,
-      226,  226,  226,  227,  227,  227, 1879,  228,  228,  228,
-      773,  773,  773,  225, 1887, 1891,  226, 1894, 1896,  227,
+      168, 1882,  168,  168,  168,  168,  168,  225,  225,  225,
+      226,  226,  226,  227,  227,  227, 1884,  228,  228,  228,
+      774,  774,  774,  225, 1885, 1893,  226, 1897, 1900,  227,
 
-     1898,  168,  168,  228, 1899, 1901,  168,  773, 1534, 1534,
-     1534, 1902,  168,  171,  171,  171,  171,  171,  171,  171,
-      171,  171,  171,  171,  171,  171,  171,  171, 1903,  171,
+     1902,  168,  168,  228, 1904, 1905,  168,  774, 1221, 1221,
+     1221, 1907,  168,  171,  171,  171,  171,  171,  171,  171,
+      171,  171,  171,  171,  171,  171,  171,  171, 1908,  171,
       171,  171,  171,  171,  231,  231,  231,  232,  232,  232,
-      233,  233,  233, 1906,  234,  234,  234,  235,  235,  235,
-      231, 1908, 1910,  232, 1915, 1921,  233, 1925,  171,  171,
-      234, 1926,  171,  235, 1007, 1007, 1007, 1927, 1929,  171,
-     1941, 1940,  171,  172,  172,  172,  172,  172,  172,  172,
-      172,  172,  172,  172,  172,  172,  172,  172, 1940,  172,
+      233,  233,  233, 1909,  234,  234,  234,  235,  235,  235,
+      231, 1912, 1914,  232, 1916, 1921,  233, 1927,  171,  171,
+      234, 1931,  171,  235, 1009, 1009, 1009, 1932, 1933,  171,
+     1935, 1946,  171,  172,  172,  172,  172,  172,  172,  172,
+      172,  172,  172,  172,  172,  172,  172,  172, 1946,  172,
       172,  172,  172,  172,  236,  236,  236,  237,  237,  237,
 
-      238,  238,  238, 1944,  241,  241,  241,  242,  242,  242,
-      236, 1947, 1941,  237, 1948, 1942,  238, 1949,  172,  172,
-      241, 1951,  172,  242, 1016, 1016, 1016, 1952, 1007,  172,
-     1954, 1955,  172,  175,  175,  175,  175,  175,  175,  175,
-      175,  175,  175,  175,  175,  175,  175,  175, 1942,  175,
+      238,  238,  238, 1950,  241,  241,  241,  242,  242,  242,
+      236, 1953, 1954,  237, 1955, 1948,  238, 1957,  172,  172,
+      241, 1947,  172,  242, 1018, 1018, 1018, 1958, 1009,  172,
+     1960, 1961,  172,  175,  175,  175,  175,  175,  175,  175,
+      175,  175,  175,  175,  175,  175,  175,  175, 1948,  175,
       175,  175,  175,  175,  245,  245,  245,  246,  246,  246,
-      247,  247,  247, 1956,  248,  248,  248,  249,  249,  249,
-      245, 1950, 1957,  246, 1959, 1960,  247, 1961,  175,  175,
-      248, 1965,  175,  249, 1535, 1535, 1535, 1950, 1016,  175,
-     1967, 1970,  175, 1537, 1537, 1537, 1541, 1541, 1541,  175,
+      247,  247,  247, 1947,  248,  248,  248,  249,  249,  249,
+      245, 1956, 1962,  246, 1963, 1965,  247, 1966,  175,  175,
+      248, 1967,  175,  249, 1277, 1277, 1277, 1956, 1018,  175,
+     1971, 1973,  175, 1538, 1538, 1538, 1539, 1539, 1539,  175,
 
       176,  176,  176,  176,  176,  176,  176,  176,  176,  176,
-      176,  176,  176,  176,  176, 1971,  176,  176,  176,  176,
+      176,  176,  176,  176,  176, 1976,  176,  176,  176,  176,
       176,  250,  250,  250,  251,  251,  251,  252,  252,  252,
-     1535,  255,  255,  255,  256,  256,  256,  250, 1972, 1537,
-      251, 1973, 1975,  252,  368,  176,  176,  255, 1977,  176,
-      256, 1023, 1023, 1023,  368, 1023,  176, 1978, 1023,  176,
-     1544, 1544, 1544, 1554, 1554, 1554,  176,  185,  185,  185,
+     1977,  255,  255,  255,  256,  256,  256,  250, 1978, 1979,
+      251, 1981, 1539,  252,  368,  176,  176,  255, 1983,  176,
+      256, 1025, 1025, 1025,  368, 1025,  176, 1984, 1025,  176,
+     1541, 1541, 1541, 1545, 1545, 1545,  176,  185,  185,  185,
       185,  185,  185,  185,  185,  185,  185,  185,  185,  185,
       185,  185,  368,  185,  185,  185,  185,  185,  259,  259,
-      259,  260,  260,  260, 1980, 1982,  368,  781,  781,  781,
+      259,  260,  260,  260, 1986, 1988,  368,  793,  793,  793,
 
-      368,  944,  944,  944,  259, 1985, 1986,  260, 1988, 1989,
-      302, 1990,  185,  185,  781,  798,  798,  798,  185,  944,
-      302, 1992, 1031, 1031, 1031, 1998, 1031, 1999,  374, 1031,
-     2001, 2004,  798,  185,  186,  186,  186,  186,  186,  186,
+      368,  946,  946,  946,  259, 1991, 1541,  260, 1992, 1994,
+      302, 1995,  185,  185,  793,  803,  803,  803,  185,  946,
+      302, 1996, 1043, 1043, 1043, 1998, 1043, 2004,  374, 1043,
+     2005, 2007,  803,  185,  186,  186,  186,  186,  186,  186,
       186,  186,  186,  186,  186,  186,  186,  186,  186,  302,
-      186,  186,  186,  186,  186,  302,  374,  811,  811,  811,
-     2012, 2017,  302, 1590, 1590, 1590,  302,  812,  812,  812,
-     1987, 2022,  374, 2023,  811,  818,  818,  818, 1987,  186,
-      186,  820,  820,  820,  812,  186, 1047, 1047, 1047, 1991,
-     1047, 2030,  818, 1047, 1591, 1591, 1591, 1991,  820, 2031,
+      186,  186,  186,  186,  186,  302,  374,  813,  813,  813,
+     2010, 2018,  302, 1548, 1548, 1548,  302,  814,  814,  814,
+     1993, 2019,  374, 2024,  813,  820,  820,  820, 1993,  186,
+      186,  822,  822,  822,  814,  186, 1054, 1054, 1054, 1997,
+     1054, 2025,  820, 1054, 1558, 1558, 1558, 1997,  822, 2032,
 
       186,  195,  195,  195,  195,  195,  195,  195,  195,  195,
-      195,  195,  195,  195,  195,  195, 2032,  195,  195,  195,
-      195,  195,  835,  835,  835,  836,  836,  836,  848,  848,
-      848,  856,  856,  856,  861,  861,  861, 2000, 2005,  835,
-     1591, 2036,  836, 2006, 2038,  848,  195,  195,  856, 2044,
-     2045,  861,  195, 2000, 2005,  195, 1060, 1060, 1060, 2006,
-     1060, 2046, 2053, 1060, 1592, 1592, 1592,  195,  196,  196,
+      195,  195,  195,  195,  195,  195, 2033,  195,  195,  195,
+      195,  195,  837,  837,  837,  838,  838,  838,  850,  850,
+      850,  858,  858,  858,  863,  863,  863, 2006, 2011,  837,
+     2034, 2038,  838, 2012, 2046,  850,  195,  195,  858, 2052,
+     2053,  863,  195, 2006, 2011,  195, 1063, 1063, 1063, 2012,
+     1063, 2054, 2061, 1063, 1594, 1594, 1594,  195,  196,  196,
       196,  196,  196,  196,  196,  196,  196,  196,  196,  196,
-      196,  196,  196, 2054,  196,  196,  196,  196,  196,  867,
-      867,  867,  889,  889,  889,  917,  917,  917,  921,  921,
+      196,  196,  196, 2062,  196,  196,  196,  196,  196,  869,
+      869,  869,  891,  891,  891,  919,  919,  919,  923,  923,
 
-      921,  926,  926,  926, 2055, 2058,  867, 2059, 2070,  889,
-     1592, 2076,  917,  196,  196,  921, 2080, 2083,  926,  196,
-     2085, 2088,  196, 1062, 1062, 1062, 2090, 1062, 2092, 2093,
-     1062, 1593, 1593, 1593,  196,  205,  205,  205,  205,  205,
+      923,  928,  928,  928, 2063, 2066,  869, 2067, 2078,  891,
+     2084, 2088,  919,  196,  196,  923, 2091, 2093,  928,  196,
+     2096, 2098,  196, 1065, 1065, 1065, 2100, 1065, 2101, 2102,
+     1065, 1597, 1597, 1597,  196,  205,  205,  205,  205,  205,
       205,  205,  205,  205,  205,  205,  205,  205,  205,  205,
-     2094,  205,  205,  205,  205,  205,  945,  945,  945,  976,
-      976,  976, 2097, 2099,  977,  977,  977,  979,  979,  979,
-      983,  983,  983, 1797,  945, 2104, 2106,  976, 2114, 1797,
-      205,  205,  977, 1797,  979, 2115,  205, 1797,  983, 2116,
-     2117,  205,  206,  206,  206,  206,  206,  206,  206,  206,
-
-      206,  206,  206,  206,  206,  206,  206, 2119,  206,  206,
-      206,  206,  206, 2135,  945,  984,  984,  984,  987,  987,
-      987,  995,  995,  995,  977,  989,  989,  989,  991,  991,
-      991, 2137, 2142,  984, 2134,  987, 2143,  206,  206,  995,
-     2134, 2136,  989,  206, 2135,  991, 2144, 2145,  206,  209,
+     2105,  205,  205,  205,  205,  205,  947,  947,  947,  978,
+      978,  978, 2107, 2112,  979,  979,  979,  981,  981,  981,
+      985,  985,  985, 1802,  947, 2114, 2122,  978, 2123, 1802,
+      205,  205,  979, 1802,  981, 2124,  205, 1802,  985, 2125,
+     2127,  205,  206,  206,  206,  206,  206,  206,  206,  206,
+
+      206,  206,  206,  206,  206,  206,  206, 2142,  206,  206,
+      206,  206,  206, 2142,  947,  986,  986,  986,  989,  989,
+      989,  997,  997,  997,  979,  991,  991,  991,  993,  993,
+      993, 2145, 2150,  986, 2151,  989, 2152,  206,  206,  997,
+     2153, 2144,  991,  206, 2157,  993, 2159, 2160,  206,  209,
       209,  209,  209,  209,  209,  209,  209,  209,  209,  209,
-      209,  209,  209,  209, 2149,  209,  209,  209,  209,  209,
-     1000, 1000, 1000, 1001, 1001, 1001, 1002, 1002, 1002,  984,
-     1005, 1005, 1005, 2151,  996,  996,  996, 2136, 1000, 2152,
-     2153, 1001, 2154, 1002,  209,  209, 2159, 2166, 1005, 2168,
+      209,  209,  209,  209, 2161,  209,  209,  209,  209,  209,
+     1002, 1002, 1002, 1003, 1003, 1003, 1004, 1004, 1004,  986,
+     1007, 1007, 1007, 2143,  998,  998,  998, 2144, 1002, 2162,
+     2167, 1003, 2174, 1004,  209,  209, 2176, 2177, 1007, 2180,
 
-      209, 2169,  996, 1068, 1068, 1068, 2172, 1068, 2175, 2179,
-     1068, 1690, 1690, 1690, 2180,  209,  210,  210,  210,  210,
+      209, 2183,  998, 1071, 1071, 1071, 2187, 1071, 2188, 2189,
+     1071, 1595, 1595, 1595, 2143,  209,  210,  210,  210,  210,
       210,  210,  210,  210,  210,  210,  210,  210,  210,  210,
-      210,  996,  210,  210,  210,  210,  210, 1001, 1006, 1006,
-     1006, 1022, 1022, 1022, 2181, 1026, 1026, 1026, 1027, 1027,
-     1027, 1030, 1030, 1030, 2182, 2183, 1006, 1690, 1022, 2184,
-     2185,  210,  210, 1026, 2186, 2187, 1027,  210, 1030, 1071,
-     1071, 1071, 2188, 1071, 2193, 1006, 1071, 1751, 1751, 1751,
-     2194, 2195,  210,  219,  219,  219,  219,  219,  219,  219,
-      219,  219,  219,  219,  219,  219,  219,  219, 2196,  219,
-
-      219,  219,  219,  219, 1033, 1033, 1033, 1034, 1034, 1034,
-     1046, 1046, 1046, 2201, 1027, 1037, 1037, 1037, 1038, 1038,
-     1038, 2203, 1033, 2206, 2211, 1034, 2218, 1046,  219,  219,
-     1041, 1041, 1041, 1037,  219, 2219, 1038,  219, 1086, 1086,
-     1086, 2225, 1086, 2226, 2228, 1086, 2232, 2233, 1041,  219,
+      210,  998,  210,  210,  210,  210,  210, 1003, 1008, 1008,
+     1008, 1024, 1024, 1024, 2190, 1028, 1028, 1028, 1029, 1029,
+     1029, 1033, 1033, 1033, 1803, 2191, 1008, 1595, 1024, 2192,
+     1803,  210,  210, 1028, 1803, 2193, 1029,  210, 1803, 1033,
+     1074, 1074, 1074, 2194, 1074, 1008, 2195, 1074, 1596, 1596,
+     1596, 2196,  210,  219,  219,  219,  219,  219,  219,  219,
+      219,  219,  219,  219,  219,  219,  219,  219, 2201,  219,
+
+      219,  219,  219,  219, 1034, 1034, 1034, 1037, 1037, 1037,
+     1042, 1042, 1042, 2202, 1029, 1038, 1038, 1038, 1047, 1047,
+     1047, 2203, 1034, 2204, 1596, 1037, 2209, 1042,  219,  219,
+     1048, 1048, 1048, 1038,  219, 2211, 1047,  219, 1089, 1089,
+     1089, 2212, 1089, 2219, 2220, 1089, 2226, 2227, 1048,  219,
       220,  220,  220,  220,  220,  220,  220,  220,  220,  220,
-      220,  220,  220,  220,  220, 2234,  220,  220,  220,  220,
-      220, 2240, 2241, 1034, 1042, 1042, 1042, 2242, 2246, 1038,
-     1051, 1051, 1051, 2223, 1052, 1052, 1052, 1056, 1056, 1056,
-     2258, 2223, 1042, 2262, 2263,  220,  220, 2264, 1051, 2266,
+      220,  220,  220,  220,  220, 1034,  220,  220,  220,  220,
+      220, 1053, 1053, 1053, 1056, 1056, 1056, 1062, 1062, 1062,
+     1038, 1057, 1057, 1057, 1059, 1059, 1059, 2233, 1053, 2224,
+     2225, 1048, 1056, 2239, 1062,  220,  220, 2224, 2225, 1057,
 
-     2270,  220, 1052, 2224,  220, 1056, 1088, 1088, 1088, 2273,
-     1088, 2224, 2274, 1088, 2277, 2278,  220,  229,  229,  229,
+     2243,  220, 1059, 2244,  220, 1091, 1091, 1091, 2245, 1091,
+     2251, 2252, 1091, 1695, 1695, 1695,  220,  229,  229,  229,
       229,  229,  229,  229,  229,  229,  229,  229,  229,  229,
-      229,  229, 2281,  229,  229,  229,  229,  229, 2288, 1042,
-     1059, 1059, 1059, 2290, 2275, 1052, 1057, 1057, 1057, 1061,
-     1061, 1061, 2275, 1063, 1063, 1063, 2305, 1059, 1064, 1064,
-     1064, 2320,  229,  229, 1057, 2276, 1061, 1754, 1754, 1754,
-      229, 1063,  229, 2276, 2310,  229, 1064, 2321, 2324,  229,
-     1757, 1757, 1757,  229,  230,  230,  230,  230,  230,  230,
-      230,  230,  230,  230,  230,  230,  230,  230,  230, 2327,
-
-      230,  230,  230,  230,  230, 1067, 1067, 1067, 1057, 1070,
-     1070, 1070, 2332, 2333, 1072, 1072, 1072, 2310, 2338, 1064,
-     2340, 2352, 1067, 1083, 1083, 1083, 1070, 2353, 2354,  230,
-      230, 1072, 1085, 1085, 1085, 2355, 2356,  230, 2357,  230,
-     2311, 1083,  230, 1759, 1759, 1759,  230, 2358, 2359, 1085,
+      229,  229, 2253,  229,  229,  229,  229,  229, 1064, 1064,
+     1064, 2257, 2269, 1060, 1060, 1060, 2273, 1057, 1066, 1066,
+     1066, 1067, 1067, 1067, 2274, 1064, 1070, 1070, 1070, 1695,
+     2275, 1060,  229,  229, 2277, 2281, 1066, 2284, 2285, 1067,
+      229, 2288,  229, 1070, 2289,  229, 1756, 1756, 1756,  229,
+     1759, 1759, 1759,  229,  230,  230,  230,  230,  230,  230,
+      230,  230,  230,  230,  230,  230,  230,  230,  230, 2292,
+
+      230,  230,  230,  230,  230, 1060, 1073, 1073, 1073, 1075,
+     1075, 1075, 1067, 1086, 1086, 1086, 1087, 1087, 1087, 1088,
+     1088, 1088, 2299, 1073, 2286, 2287, 1075, 2301, 2316,  230,
+      230, 1086, 2286, 2287, 1087, 2331, 1088,  230, 2332,  230,
+     2335, 2321,  230, 1762, 1762, 1762,  230, 1764, 1764, 1764,
       230,  239,  239,  239,  239,  239,  239,  239,  239,  239,
-      239,  239,  239,  239,  239,  239, 2360,  239,  239,  239,
-      239,  239, 1087, 1087, 1087, 1089, 1089, 1089, 1762, 1762,
-     1762, 1772, 1772, 1772, 1084, 1084, 1084, 2311, 2361, 1087,
-     2368, 2369, 1089, 1090, 1090, 1090,  239,  239, 1091, 1091,
+      239,  239,  239,  239,  239,  239, 2338,  239,  239,  239,
+      239,  239, 2322, 2343, 1087, 1090, 1090, 1090, 1092, 1092,
+     1092, 1767, 1767, 1767, 2321, 1093, 1093, 1093, 1095, 1095,
+     1095, 2344, 1090, 2349, 2351, 1092,  239,  239, 1094, 1094,
 
-     1091, 2370, 1084, 2372, 1100, 1100, 1100, 2376, 1100, 2378,
-     1090, 1100, 1108, 1108, 1108, 1091, 1108, 2382, 2386, 1108,
+     1094, 2363, 1093, 2364, 2365, 1095, 1103, 1103, 1103, 2366,
+     1103, 2367, 2368, 1103, 2369, 1094, 1769, 1769, 1769, 2322,
       239,  240,  240,  240,  240,  240,  240,  240,  240,  240,
-      240,  240,  240,  240,  240,  240, 2387,  240,  240,  240,
-      240,  240, 1084, 2388, 1090, 1094, 1094, 1094, 2389, 2390,
-     1091, 1092, 1092, 1092, 2391, 1099, 1099, 1099, 2392, 2395,
-     1093, 1093, 1093, 1094, 2396, 2397,  240,  240, 1092, 1095,
-     1095, 1095, 1099, 2403, 1113, 1113, 1113, 1093, 1113, 2404,
-     2405, 1113, 1119, 1119, 1119, 2413, 1119, 1095, 2414, 1119,
+      240,  240,  240,  240,  240,  240, 1093,  240,  240,  240,
+      240,  240, 2370, 1095, 1097, 1097, 1097, 1102, 1102, 1102,
+     1094, 1777, 1777, 1777, 1096, 1096, 1096, 1104, 1104, 1104,
+     2371, 2372, 1097, 2379, 1102, 2380,  240,  240, 1098, 1098,
+     1098, 1096, 2381, 2383, 1104, 1111, 1111, 1111, 2387, 1111,
+     1769, 2389, 1111, 1771, 1771, 1771, 1098, 1811, 1811, 1811,
       240,  243,  243,  243,  243,  243,  243,  243,  243,  243,
 
-      243,  243,  243,  243,  243,  243, 1092,  243,  243,  243,
-      243,  243, 1093, 1101, 1101, 1101, 1095, 1104, 1104, 1104,
-     1105, 1105, 1105, 1107, 1107, 1107, 1109, 1109, 1109, 2398,
-     1101, 1764, 1764, 1764, 2415, 1104,  243,  243, 1105, 2398,
-     1107, 1766, 1766, 1766, 1109, 2416, 2430,  243,  244,  244,
+      243,  243,  243,  243,  243,  243, 1096,  243,  243,  243,
+      243,  243, 1107, 1107, 1107, 1098, 1110, 1110, 1110, 2392,
+     1108, 1108, 1108, 1112, 1112, 1112, 1113, 1113, 1113, 1771,
+     1107, 2393, 2394, 1110, 2395, 2396,  243,  243, 1108, 2397,
+     2398, 1112, 2403, 2406, 1113, 2407, 2408,  243,  244,  244,
       244,  244,  244,  244,  244,  244,  244,  244,  244,  244,
-      244,  244,  244, 2431,  244,  244,  244,  244,  244, 2432,
-     2433, 1105, 1110, 1110, 1110, 1112, 1112, 1112, 1115, 1115,
-     1115, 1116, 1116, 1116, 1118, 1118, 1118, 1766, 2435, 2437,
-     1110, 2461, 1112,  244,  244, 1764, 1115, 2456, 2462, 1116,
+      244,  244,  244, 2414,  244,  244,  244,  244,  244, 2415,
+     2409, 1108, 1115, 1115, 1115, 1116, 1116, 1116, 2416, 1116,
+     2409, 2424, 1116, 1118, 1118, 1118, 2425, 1113, 2426, 1115,
+     1813, 1813, 1813,  244,  244, 1122, 1122, 1122, 2427, 1122,
 
-     2455, 1118, 2465, 2468,  244,  253,  253,  253,  253,  253,
+     2441, 1118, 1122, 2442,  244,  253,  253,  253,  253,  253,
       253,  253,  253,  253,  253,  253,  253,  253,  253,  253,
-     2469,  253,  253,  253,  253,  253, 2470, 2473, 1116, 1123,
-     1123, 1123, 2455, 1110, 2456, 1124, 1124, 1124, 1125, 1125,
-     1125, 1126, 1126, 1126, 1128, 1128, 1128, 1123, 2476, 2477,
-      253,  253, 2478, 1124, 2479, 1125, 2480, 2481, 1126, 2482,
-     2483,  253, 1128, 1139, 1139, 1139, 2484, 1139, 2485, 2486,
-     1139, 1774, 1774, 1774,  253,  254,  254,  254,  254,  254,
+     2443,  253,  253,  253,  253,  253, 1119, 1119, 1119, 1121,
+     1121, 1121, 2444, 2446, 1126, 1126, 1126, 1128, 1128, 1128,
+     2448, 1127, 1127, 1127, 1119, 2472, 1121, 1129, 1129, 1129,
+      253,  253, 1126, 2473, 1128, 1130, 1130, 1130, 2466, 1127,
+     2476,  253, 2479, 2480, 1129, 2481, 2467, 1779, 1779, 1779,
+     2484, 2487, 1130, 1119,  253,  254,  254,  254,  254,  254,
       254,  254,  254,  254,  254,  254,  254,  254,  254,  254,
-     1124,  254,  254,  254,  254,  254, 1131, 1131, 1131, 2488,
+     2466,  254,  254,  254,  254,  254, 1127, 1131, 1131, 1131,
 
-     2489, 1127, 1127, 1127, 2491, 1129, 1129, 1129, 2492, 2493,
-     1133, 1133, 1133, 1131, 1135, 1135, 1135, 1774, 1127, 2494,
-      254,  254, 2496, 1129, 1132, 1132, 1132, 1133, 1806, 1806,
-     1806,  254, 1135, 1163, 1163, 1163, 2497, 1163, 2499, 2500,
-     1163, 1132, 2502, 2503,  254,  257,  257,  257,  257,  257,
+     1134, 1134, 1134, 2467, 2488, 1132, 1132, 1132, 2489, 2490,
+     1135, 1135, 1135, 1779, 1130, 1131, 2491, 1134, 2492, 2493,
+      254,  254, 2494, 1132, 1136, 1136, 1136, 1135, 1142, 1142,
+     1142,  254, 1142, 2495, 2496, 1142, 1166, 1166, 1166, 2497,
+     1166, 1136, 2499, 1166,  254,  257,  257,  257,  257,  257,
       257,  257,  257,  257,  257,  257,  257,  257,  257,  257,
-     1127,  257,  257,  257,  257,  257, 1129, 1136, 1136, 1136,
-     2505, 1134, 1134, 1134, 1132, 1138, 1138, 1138, 1140, 1140,
-     1140, 1141, 1141, 1141, 2506, 1136, 2512, 2513, 1134, 1132,
-      257,  257, 1138, 1142, 1142, 1142, 1140, 2514, 2516, 1141,
+     1135,  257,  257,  257,  257,  257, 1132, 1138, 1138, 1138,
+     2500, 1137, 1137, 1137, 2502, 1135, 1139, 1139, 1139, 1141,
+     1141, 1141, 1143, 1143, 1143, 1138, 2501, 2503, 1137, 2504,
+      257,  257, 2505, 2507, 1139, 2501, 1141, 1814, 1814, 1814,
 
-     2521,  257, 2490, 2522, 1136, 1167, 1167, 1167, 2523, 1167,
-     1142, 2490, 1167, 2524,  257,  258,  258,  258,  258,  258,
+     1143,  257, 1170, 1170, 1170, 2508, 1170, 2510, 2511, 1170,
+     1851, 1851, 1851, 1139,  257,  258,  258,  258,  258,  258,
       258,  258,  258,  258,  258,  258,  258,  258,  258,  258,
-     1134,  258,  258,  258,  258,  258, 1141, 1143, 1143, 1143,
-     1144, 1144, 1144, 2525, 1145, 1145, 1145, 1146, 1146, 1146,
-     1148, 1148, 1148, 2528, 1143, 1147, 1147, 1147, 1144, 2530,
-      258,  258, 1145, 2538, 1146, 2539, 2541, 1148, 1149, 1149,
-     1149,  258, 1147, 1156, 1156, 1156, 1160, 1160, 1160, 1150,
-     1150, 1150, 2532, 2547,  258,  300, 1149, 2495, 1157, 1157,
-     1157, 1156,  300, 2548, 1160, 2532, 2495, 1150, 1161, 1161,
-
-     1161,  300,  300, 2549, 2550, 1147, 1157, 1162, 1162, 1162,
-     1164, 1164, 1164, 2552, 2555, 1145, 1161, 1166, 1166, 1166,
-     1147, 1165, 1165, 1165, 1162, 1169, 1169, 1169, 1164,  300,
-      300,  300, 2533, 2557, 1166,  300,  300,  300, 2582, 1165,
-      300,  300, 2583, 1169,  300, 2533,  300,  300,  300,  365,
-     1150, 2577, 1157, 1170, 1170, 1170,  365, 1171, 1171, 1171,
-     2578, 2586, 1161, 2587, 2579,  365,  365, 1798, 1172, 1172,
-     1172, 1170, 1172, 1798, 1171, 1172, 2588, 1798, 1174, 1174,
-     1174, 1798, 1165, 2593, 1175, 1175, 1175, 2594, 1190, 1190,
-     1190, 2577, 2595,  365,  365,  365, 1174, 2578, 2596,  365,
-
-      365,  365, 1175, 2597,  365,  365, 1190, 2579,  365, 2598,
-      365,  365,  365, 1191, 1191, 1191, 2599, 1170, 1193, 1193,
-     1193, 1225, 1225, 1225, 1226, 1226, 1226, 2600, 1227, 1227,
-     1227, 1191, 1229, 1229, 1229, 2601, 1193, 2602, 1225, 1230,
-     1230, 1230, 1226, 2603, 2605, 1175, 1227, 1231, 1231, 1231,
-     1229, 1231, 2606, 2607, 1231, 2608, 1230, 1234, 1234, 1234,
-     1236, 1236, 1236, 2609, 2610, 1193, 1237, 1237, 1237, 1239,
-     1239, 1239, 2611, 2591, 1234, 1241, 1241, 1241, 1236, 1241,
-     2612, 1229, 1241, 2591, 1237, 2613, 2591, 1239, 1244, 1244,
-     1244, 1245, 1245, 1245, 2614, 1245, 2615, 2616, 1245, 2617,
-
-     1246, 1246, 1246, 2618, 2620, 1244, 1247, 1247, 1247, 1250,
-     1250, 1250, 1252, 1252, 1252, 2592, 1239, 1246, 1234, 2621,
-     1248, 1248, 1248, 1247, 1248, 2592, 1250, 1248, 2592, 2624,
-     1252, 1253, 1253, 1253, 1255, 1255, 1255, 1257, 1257, 1257,
-     1259, 1259, 1259, 1260, 1260, 1260, 1262, 1262, 1262, 1253,
-     2630, 2637, 1255, 2638, 1257, 1263, 1263, 1263, 1259, 1263,
-     2639, 1260, 1263, 2641, 1262, 1267, 1267, 1267, 1268, 1268,
-     1268, 1270, 1270, 1270, 1285, 1285, 1285, 2645, 1285, 2648,
-     2649, 1285, 2650, 1267, 2651, 2652, 1268, 2653, 2666, 1270,
-     1289, 1289, 1289, 1262, 1255, 1290, 1290, 1290, 1291, 1291,
-
-     1291, 1293, 1293, 1293, 1296, 1296, 1296, 1289, 1296, 2667,
-     2668, 1296, 2695, 1290, 2692, 2698, 1291, 2699, 2693, 1293,
-     1300, 1300, 1300, 1301, 1301, 1301, 1303, 1303, 1303, 1304,
-     1304, 1304, 1305, 1305, 1305, 1306, 1306, 1306, 1300, 2700,
-     2703, 1301, 2704, 2692, 1303, 2706, 1304, 2707, 2709, 1305,
-     1307, 1307, 1307, 1306, 1309, 1309, 1309, 1310, 1310, 1310,
-     2693, 2694, 1293, 1311, 1311, 1311, 2710, 2711, 1307, 1808,
-     1808, 1808, 1309, 2712, 1310, 1312, 1312, 1312, 2713, 1305,
-     1311, 1313, 1313, 1313, 1315, 1315, 1315, 1303, 1318, 1318,
-     1318, 1311, 2715, 1312, 1319, 1319, 1319, 2716, 1319, 1313,
-
-     2717, 1319, 1315, 2694, 2718, 1318, 1325, 1325, 1325, 1326,
-     1326, 1326, 1328, 1328, 1328, 1331, 1331, 1331, 1332, 1332,
-     1332, 1309, 2721, 2722, 1325, 2723, 2724, 1326, 2725, 2726,
-     1328, 2705, 1331, 1333, 1333, 1333, 1332, 1335, 1335, 1335,
-     1336, 1336, 1336, 2708, 2705, 1337, 1337, 1337, 2727, 1337,
-     1315, 1333, 1337, 2728, 2729, 1335, 2708, 1336, 1340, 1340,
-     1340, 2730, 1340, 2731, 2732, 1340, 1343, 1343, 1343, 1344,
-     1344, 1344, 1346, 1346, 1346, 2733, 2735, 1328, 1351, 1351,
-     1351, 2748, 1351, 2749, 1343, 1351, 2754, 1344, 2758, 2759,
-     1346, 1354, 1354, 1354, 1355, 1355, 1355, 2760, 1355, 2761,
-
-     2762, 1355, 2763, 2771, 1335, 1358, 1358, 1358, 1354, 1359,
-     1359, 1359, 2773, 1359, 2781, 2782, 1359, 1370, 1370, 1370,
-     2783, 2784, 1358, 1371, 1371, 1371, 1373, 1373, 1373, 1374,
-     1374, 1374, 2785, 1374, 2786, 1370, 1374, 1346, 1377, 1377,
-     1377, 1371, 1377, 2796, 1373, 1377, 1380, 1380, 1380, 1381,
-     1381, 1381, 2799, 1381, 2797, 2802, 1381, 1386, 1386, 1386,
-     1387, 1387, 1387, 1380, 1389, 1389, 1389, 1394, 1394, 1394,
-     2803, 1394, 2807, 2808, 1394, 1386, 2676, 2809, 1387, 1397,
-     1397, 1397, 1389, 1398, 1398, 1398, 2676, 1398, 2810, 2797,
-     1398, 2796, 2676, 1373, 2811, 2812, 1397, 1401, 1401, 1401,
-
-     1402, 1402, 1402, 1404, 1404, 1404, 1406, 1406, 1406, 2813,
-     1406, 2814, 1389, 1406, 2816, 1401, 2817, 2818, 1402, 2819,
-     2820, 1404, 1409, 1409, 1409, 1410, 1410, 1410, 1412, 1412,
-     1412, 1414, 1414, 1414, 2821, 1414, 2822, 2823, 1414, 2825,
-     1409, 2826, 2827, 1410, 2828, 2790, 1412, 1418, 1418, 1418,
-     1419, 1419, 1419, 2829, 1404, 1421, 1421, 1421, 2790, 1423,
-     1423, 1423, 2830, 1423, 2791, 1418, 1423, 2831, 1419, 1429,
-     1429, 1429, 2832, 1421, 1430, 1430, 1430, 2791, 1432, 1432,
-     1432, 1433, 1433, 1433, 1434, 1434, 1434, 1429, 1434, 2833,
-     2834, 1434, 1430, 2835, 2836, 1412, 1432, 2837, 1433, 1435,
-
-     1435, 1435, 2847, 2851, 1421, 1436, 1436, 1436, 2852, 1436,
-     2860, 2861, 1436, 1438, 1438, 1438, 1435, 1439, 1439, 1439,
-     2862, 1441, 1441, 1441, 1443, 1443, 1443, 2863, 1447, 1447,
-     1447, 1438, 1809, 1809, 1809, 1439, 2864, 2677, 1432, 1441,
-     2865, 1443, 1444, 1444, 1444, 1447, 1444, 2677, 2866, 1444,
-     1448, 1448, 1448, 2677, 1448, 2873, 2876, 1448, 1450, 1450,
-     1450, 1451, 1451, 1451, 1453, 1453, 1453, 1455, 1455, 1455,
-     2878, 1455, 2883, 2884, 1455, 2885, 1450, 2879, 2886, 1451,
-     2878, 2887, 1453, 1458, 1458, 1458, 2888, 2879, 1441, 1459,
-     1459, 1459, 1461, 1461, 1461, 1462, 1462, 1462, 1463, 1463,
-
-     1463, 1458, 1463, 2891, 2892, 1463, 2893, 1459, 2894, 2881,
-     1461, 2882, 1462, 1464, 1464, 1464, 1465, 1465, 1465, 2881,
-     1465, 2882, 2905, 1465, 1466, 1466, 1466, 2906, 1453, 2907,
-     1464, 1467, 1467, 1467, 2908, 1469, 1469, 1469, 1470, 1470,
-     1470, 2909, 1466, 1471, 1471, 1471, 2910, 1471, 2911, 1467,
-     1471, 2912, 1461, 1469, 2915, 1470, 1474, 1474, 1474, 1475,
-     1475, 1475, 2897, 1475, 2916, 2918, 1475, 1476, 1476, 1476,
-     1477, 1477, 1477, 1474, 1479, 1479, 1479, 1481, 1481, 1481,
-     1485, 1485, 1485, 2919, 2920, 1476, 2922, 2924, 1477, 1486,
-     1486, 1486, 1479, 2925, 1481, 2926, 2897, 1469, 1485, 1488,
-
-     1488, 1488, 1491, 1491, 1491, 2929, 2930, 1486, 1492, 1492,
-     1492, 1494, 1494, 1494, 1495, 1495, 1495, 1488, 1495, 2931,
-     1491, 1495, 1498, 1498, 1498, 2932, 1492, 2935, 2948, 1494,
-     1499, 1499, 1499, 1501, 1501, 1501, 1479, 1502, 1502, 1502,
-     1498, 1502, 2949, 2950, 1502, 1506, 1506, 1506, 1499, 2958,
-     2959, 1501, 1507, 1507, 1507, 1509, 1509, 1509, 2960, 2961,
-     1488, 2962, 2963, 1506, 1494, 1510, 1510, 1510, 2969, 1510,
-     1507, 2970, 1510, 1509, 1514, 1514, 1514, 1515, 1515, 1515,
-     1517, 1517, 1517, 1519, 1519, 1519, 1526, 1526, 1526, 1557,
-     1557, 1557, 1514, 1501, 2971, 1515, 2972, 2973, 1517, 2974,
-
-     2975, 1519, 1519, 2976, 1526, 2977, 1557, 1558, 1558, 1558,
-     2978, 1558, 2980, 2981, 1558, 2986, 1509, 1559, 1559, 1559,
-     1560, 1560, 1560, 2987, 1561, 1561, 1561, 2988, 1561, 2989,
-     1517, 1561, 1564, 1564, 1564, 1559, 2990, 1560, 1566, 1566,
-     1566, 2999, 1566, 3000, 3001, 1566, 1569, 1569, 1569, 3002,
-     1564, 3003, 1526, 1570, 1570, 1570, 3004, 1570, 3005, 3006,
-     1570, 3010, 3011, 1569, 1571, 1571, 1571, 3012, 1571, 3013,
-     3014, 1571, 1575, 1575, 1575, 1559, 1576, 1576, 1576, 2990,
-     1576, 1564, 3015, 1576, 1578, 1578, 1578, 3017, 3018, 1575,
-     1580, 1580, 1580, 1581, 1581, 1581, 3020, 1581, 3021, 3022,
-
-     1581, 3024, 1578, 1582, 1582, 1582, 3028, 1580, 1583, 1583,
-     1583, 1585, 1585, 1585, 1601, 1601, 1601, 1849, 1849, 1849,
-     1582, 1602, 1602, 1602, 3029, 3030, 1583, 3035, 3037, 1585,
-     3038, 1601, 3043, 3044, 1578, 1603, 1603, 1603, 1602, 1603,
-     3045, 3046, 1603, 1604, 1604, 1604, 1608, 1608, 1608, 1609,
-     1609, 1609, 1610, 1610, 1610, 3047, 1610, 1583, 3048, 1610,
-     3049, 1604, 3050, 3051, 1608, 3052, 1609, 1612, 1612, 1612,
-     1613, 1613, 1613, 1614, 1614, 1614, 3053, 1614, 3054, 3056,
-     1614, 1616, 1616, 1616, 3057, 1612, 3058, 1613, 1619, 1619,
-     1619, 1620, 1620, 1620, 3059, 1620, 3066, 3063, 1620, 1616,
-
-     1621, 1621, 1621, 3060, 3069, 1619, 3070, 1604, 3063, 3073,
-     1608, 1623, 1623, 1623, 1624, 1624, 1624, 1621, 1627, 1627,
-     1627, 3075, 1628, 1628, 1628, 3076, 1628, 1612, 1623, 1628,
-     3078, 3079, 1624, 3083, 3062, 1627, 1629, 1629, 1629, 1630,
-     1630, 1630, 1616, 1631, 1631, 1631, 3084, 1631, 3062, 3060,
-     1631, 1632, 1632, 1632, 1629, 3086, 1630, 1623, 1634, 1634,
-     1634, 1637, 1637, 1637, 1638, 1638, 1638, 3087, 1638, 1632,
-     3088, 1638, 1639, 1639, 1639, 1634, 1639, 3082, 1637, 1639,
-     1624, 1644, 1644, 1644, 1653, 1653, 1653, 1654, 1654, 1654,
-     3085, 1654, 3089, 3090, 1654, 1657, 1657, 1657, 1644, 1658,
-
-     1658, 1658, 1653, 1659, 1659, 1659, 1660, 1660, 1660, 1661,
-     1661, 1661, 1657, 1663, 1663, 1663, 1658, 1632, 3098, 3082,
-     1659, 3092, 3106, 1660, 1666, 1666, 1666, 1661, 1666, 3085,
-     1663, 1666, 3108, 3092, 1669, 1669, 1669, 1671, 1671, 1671,
-     1673, 1673, 1673, 1676, 1676, 1676, 1680, 1680, 1680, 1653,
-     1659, 1669, 1681, 1681, 1681, 1671, 3110, 3112, 1673, 3120,
-     3122, 1676, 3093, 1680, 1661, 3103, 1689, 1689, 1689, 1658,
-     1681, 1682, 1682, 1682, 3093, 1682, 1660, 3103, 1682, 1685,
-     1685, 1685, 3126, 1685, 1689, 3128, 1685, 1691, 1691, 1691,
-     3123, 1691, 1680, 3130, 1691, 1696, 1696, 1696, 3131, 1696,
-
-     1676, 1671, 1696, 1700, 1700, 1700, 1673, 3104, 3132, 1681,
-     1702, 1702, 1702, 1703, 1703, 1703, 3124, 1703, 3133, 3104,
-     1703, 1700, 1706, 1706, 1706, 3139, 1706, 3143, 1702, 1706,
-     3124, 3123, 1689, 1709, 1709, 1709, 1710, 1710, 1710, 3127,
-     1710, 3125, 3125, 1710, 3140, 1715, 1715, 1715, 3150, 1715,
-     3127, 1709, 1715, 1718, 1718, 1718, 1720, 1720, 1720, 1721,
-     1721, 1721, 3140, 1721, 1700, 3149, 1721, 1702, 1725, 1725,
-     1725, 1718, 3152, 1720, 1727, 1727, 1727, 1728, 1728, 1728,
-     1709, 1729, 1729, 1729, 3149, 3158, 1725, 1730, 1730, 1730,
-     3151, 1727, 1731, 1731, 1731, 1728, 1732, 1732, 1732, 1729,
-
-     1718, 1733, 1733, 1733, 1730, 1736, 1736, 1736, 3160, 3151,
-     1731, 3144, 3157, 1732, 1743, 1743, 1743, 1725, 3159, 1733,
-     1775, 1775, 1775, 1736, 1775, 3165, 3144, 1775, 1778, 1778,
-     1778, 3157, 1743, 1729, 1779, 1779, 1779, 3159, 1779, 3166,
-     3168, 1779, 2364, 2364, 1728, 2364, 1778, 1784, 1784, 1784,
-     3169, 3170, 1733, 2364, 1731, 3172, 1736, 1786, 1786, 1786,
-     2364, 1786, 3173, 3174, 1786, 1784, 1743, 1790, 1790, 1790,
-     3175, 1790, 3176, 1736, 1790, 1794, 1794, 1794, 1796, 1796,
-     1796, 3178, 1796, 3179, 3181, 1796, 1799, 1799, 1799, 3188,
-     1800, 1800, 1800, 1794, 1800, 1778, 3189, 1800, 1784, 1801,
-
-     1801, 1801, 3190, 1799, 1810, 1810, 1810, 1814, 1814, 1814,
-     1815, 1815, 1815, 1817, 1817, 1817, 3191, 1801, 1818, 1818,
-     1818, 3192, 1818, 3193, 3196, 1818, 3197, 1819, 1819, 1819,
-     1817, 1819, 3198, 3199, 1819, 3200, 1794, 1822, 1822, 1822,
-     1825, 1825, 1825, 1826, 1826, 1826, 3201, 1827, 1827, 1827,
-     1801, 1827, 3202, 3203, 1827, 1822, 3205, 1825, 1831, 1831,
-     1831, 1826, 1832, 1832, 1832, 3207, 1832, 3209, 1810, 1832,
-     3210, 1814, 3211, 3212, 1815, 3213, 1831, 1835, 1835, 1835,
-     1836, 1836, 1836, 3223, 1822, 1839, 1839, 1839, 3224, 1839,
-     1826, 3225, 1839, 3221, 1835, 1842, 1842, 1842, 1836, 1843,
-
-     1843, 1843, 3226, 1843, 3227, 3221, 1843, 3222, 1844, 1844,
-     1844, 3228, 1842, 1845, 1845, 1845, 1846, 1846, 1846, 3222,
-     1846, 3232, 3233, 1846, 1831, 1844, 3234, 1848, 1848, 1848,
-     1845, 1851, 1851, 1851, 3235, 1851, 3236, 3237, 1851, 1854,
-     1854, 1854, 3238, 3239, 1836, 1848, 1856, 1856, 1856, 3240,
-     1856, 3242, 3243, 1856, 1859, 1859, 1859, 1854, 1861, 1861,
-     1861, 1862, 1862, 1862, 3244, 1862, 3245, 3246, 1862, 1863,
-     1863, 1863, 1859, 3247, 3240, 1861, 1865, 1865, 1865, 3248,
-     1865, 3249, 3250, 1865, 3251, 3252, 1863, 1870, 1870, 1870,
-     1871, 1871, 1871, 3253, 1871, 3254, 3255, 1871, 3256, 3257,
-
-     1859, 1872, 1872, 1872, 1870, 1877, 1877, 1877, 1880, 1880,
-     1880, 1881, 1881, 1881, 1883, 1883, 1883, 3258, 1872, 1884,
-     1884, 1884, 1877, 1882, 1882, 1882, 1880, 1882, 1881, 3259,
-     1882, 1883, 1885, 1885, 1885, 3260, 1884, 1886, 1886, 1886,
-     1888, 1888, 1888, 1889, 1889, 1889, 3261, 1889, 3262, 1885,
-     1889, 1890, 1890, 1890, 3263, 1886, 3269, 1888, 1892, 1892,
-     1892, 3270, 1893, 1893, 1893, 3271, 1893, 3272, 1890, 1893,
-     1895, 1895, 1895, 3273, 1880, 1892, 3274, 1884, 1897, 1897,
-     1897, 3275, 1900, 1900, 1900, 1904, 1904, 1904, 1895, 3276,
-     3277, 1905, 1905, 1905, 3266, 1905, 1897, 1886, 1905, 3278,
-
-     1900, 3279, 1904, 1907, 1907, 1907, 1909, 1909, 1909, 1911,
-     1911, 1911, 3280, 3266, 1912, 1912, 1912, 1913, 1913, 1913,
-     3281, 1907, 3282, 3283, 1909, 3284, 1911, 3285, 3286, 1897,
-     1900, 1912, 3287, 3288, 1913, 1914, 1914, 1914, 1916, 1916,
-     1916, 1917, 1917, 1917, 1918, 1918, 1918, 1919, 1919, 1919,
-     1920, 1920, 1920, 1914, 3290, 3291, 1916, 1909, 3292, 1917,
-     3293, 1918, 3294, 3289, 1919, 1922, 1922, 1922, 1920, 1922,
-     3295, 3296, 1922, 1928, 1928, 1928, 1930, 1930, 1930, 2365,
-     2365, 1913, 2365, 3289, 1916, 1931, 1931, 1931, 3297, 1931,
-     2365, 1928, 1931, 1930, 1932, 1932, 1932, 2365, 3298, 1933,
-
-     1933, 1933, 1914, 1934, 1934, 1934, 1917, 1935, 1935, 1935,
-     3299, 1935, 1932, 3300, 1935, 1920, 3301, 1933, 3302, 3303,
-     1934, 1936, 1936, 1936, 1928, 1937, 1937, 1937, 1938, 1938,
-     1938, 3304, 1938, 3305, 3306, 1938, 1953, 1953, 1953, 1936,
-     3307, 3308, 1937, 1939, 1939, 1939, 1945, 1945, 1945, 1946,
-     1946, 1946, 3309, 1932, 1933, 1958, 1958, 1958, 1962, 1962,
-     1962, 1939, 3315, 1945, 1963, 1963, 1963, 1946, 1964, 1964,
-     1964, 1966, 1966, 1966, 1968, 1968, 1968, 1969, 1969, 1969,
-     1974, 1974, 1974, 3316, 1976, 1976, 1976, 1979, 1979, 1979,
-     1981, 1981, 1981, 1983, 1983, 1983, 1984, 1984, 1984, 3317,
-
-     3310, 1939, 1976, 3318, 3319, 1979, 3310, 1981, 3320, 3322,
-     1946, 1983, 3323, 1984, 1993, 1993, 1993, 3325, 1993, 3326,
-     3328, 1993, 1996, 1996, 1996, 1997, 1997, 1997, 2002, 2002,
-     2002, 2003, 2003, 2003, 1976, 3329, 2007, 2007, 2007, 3332,
-     1996, 3333, 1997, 2008, 2008, 2008, 3334, 2008, 3335, 3337,
-     2008, 3339, 1983, 2007, 2011, 2011, 2011, 2013, 2013, 2013,
-     2014, 2014, 2014, 2015, 2015, 2015, 3341, 2015, 1996, 3343,
-     2015, 3345, 2011, 3346, 2013, 3347, 3348, 2014, 2016, 2016,
-     2016, 3331, 2007, 2018, 2018, 2018, 3349, 2019, 2019, 2019,
-     2020, 2020, 2020, 3350, 2020, 3331, 2016, 2020, 2021, 2021,
-
-     2021, 2018, 3351, 2013, 2019, 3352, 3354, 2011, 2024, 2024,
-     2024, 3356, 2024, 3358, 3359, 2024, 2021, 2027, 2027, 2027,
-     2028, 2028, 2028, 3360, 2028, 3361, 3370, 2028, 2029, 2029,
-     2029, 2016, 2029, 3408, 2027, 2029, 2033, 2033, 2033, 2035,
-     2035, 2035, 2037, 2037, 2037, 2021, 2039, 2039, 2039, 3362,
-     2039, 3382, 1540, 2039, 2033, 2042, 2042, 2042, 3371, 3372,
-     2037, 2043, 2043, 2043, 3384, 2043, 3408, 3363, 2043, 2047,
-     2047, 2047, 2042, 2047, 3370, 3373, 2047, 2050, 2050, 2050,
-     2051, 2051, 2051, 3390, 2051, 3362, 3374, 2051, 2052, 2052,
-     2052, 2056, 2056, 2056, 2050, 2057, 2057, 2057, 3382, 2057,
-
-     2037, 3384, 2057, 3363, 3402, 2052, 3371, 3372, 2056, 2060,
-     2060, 2060, 2061, 2061, 2061, 3386, 2061, 3391, 3375, 2061,
-     2064, 2064, 2064, 3373, 2065, 2065, 2065, 2060, 2065, 3390,
-     3374, 2065, 2066, 2066, 2066, 1539, 3378, 2064, 2067, 2067,
-     2067, 2068, 2068, 2068, 3378, 2068, 3379, 3402, 2068, 2066,
-     2069, 2069, 2069, 1538, 3379, 2067, 3386, 2071, 2071, 2071,
-     2060, 2071, 3375, 3391, 2071, 2074, 2074, 2074, 2069, 2075,
-     2075, 2075, 3380, 2075, 3387, 3381, 2075, 2077, 2077, 2077,
-     3380, 2077, 2074, 3381, 2077, 2081, 2081, 2081, 2084, 2084,
-     2084, 2086, 2086, 2086, 2087, 2087, 2087, 2089, 2089, 2089,
-
-     3376, 2069, 3385, 2081, 3376, 3394, 2084, 3388, 2086, 2091,
-     2091, 2091, 2087, 2091, 2089, 3387, 2091, 2095, 2095, 2095,
-     2098, 2098, 2098, 2100, 2100, 2100, 2101, 2101, 2101, 3383,
-     2101, 3420, 3377, 2101, 3430, 2095, 3377, 3394, 2098, 3385,
-     2100, 3403, 3388, 2089, 2102, 2102, 2102, 2103, 2103, 2103,
-     3395, 2103, 2084, 1536, 2103, 2087, 2105, 2105, 2105, 3389,
-     3420, 2102, 2107, 2107, 2107, 2108, 2108, 2108, 2109, 2109,
-     2109, 2110, 2110, 2110, 2105, 2110, 3383, 3392, 2110, 3393,
-     2107, 3430, 3395, 2108, 3403, 2109, 2111, 2111, 2111, 2112,
-     2112, 2112, 3400, 2112, 3389, 3396, 2112, 2113, 2113, 2113,
-
-     2118, 2118, 2118, 2111, 3396, 2120, 2120, 2120, 3397, 2120,
-     3398, 2107, 2120, 3399, 3392, 2113, 3393, 3397, 2118, 2123,
-     2123, 2123, 2105, 2124, 2124, 2124, 3400, 2125, 2125, 2125,
-     2108, 2125, 3401, 3424, 2125, 3414, 3409, 2123, 2128, 2128,
-     2128, 2124, 2130, 2130, 2130, 3398, 2130, 3452, 3399, 2130,
-     2133, 2133, 2133, 2141, 2141, 2141, 2128, 2138, 2138, 2138,
-     3406, 3452, 2113, 1533, 1532, 2118, 3401, 3424, 2133, 3409,
-     2123, 2139, 2139, 2139, 2138, 2139, 2124, 3414, 2139, 2140,
-     2140, 2140, 2146, 2146, 2146, 2147, 2147, 2147, 2148, 2148,
-     2148, 2150, 2150, 2150, 3404, 3406, 2133, 2140, 2155, 2155,
-
-     2155, 2156, 2156, 2156, 2157, 2157, 2157, 2158, 2158, 2158,
-     2160, 2160, 2160, 2161, 2161, 2161, 2162, 2162, 2162, 2163,
-     2163, 2163, 2164, 2164, 2164, 2165, 2165, 2165, 2167, 2167,
-     2167, 2170, 2170, 2170, 2173, 2173, 2173, 2174, 2174, 2174,
-     3404, 2174, 3428, 2140, 2174, 3405, 2167, 1531, 3407, 2170,
-     3428, 2173, 1530, 2158, 2176, 2176, 2176, 2177, 2177, 2177,
-     2178, 2178, 2178, 3415, 2178, 3429, 1529, 2178, 2189, 2189,
-     2189, 3412, 2176, 3429, 2177, 2190, 2190, 2190, 3416, 2167,
-     2191, 2191, 2191, 3407, 2191, 3434, 2189, 2191, 2192, 2192,
-     2192, 3405, 2190, 2197, 2197, 2197, 2198, 2198, 2198, 2199,
-
-     2199, 2199, 2200, 2200, 2200, 3415, 2200, 3417, 3412, 2200,
-     2202, 2202, 2202, 2204, 2204, 2204, 2199, 2189, 2205, 2205,
-     2205, 3421, 2205, 3426, 3416, 2205, 3434, 3410, 2202, 3413,
-     2204, 2207, 2207, 2207, 3411, 2207, 3410, 3418, 2207, 2210,
-     2210, 2210, 2198, 3411, 2212, 2212, 2212, 2214, 2214, 2214,
-     3421, 2214, 1528, 3417, 2214, 3435, 1527, 2210, 2217, 2217,
-     2217, 2202, 2212, 2220, 2220, 2220, 3413, 2220, 3419, 3426,
-     2220, 2227, 2227, 2227, 3418, 3431, 2217, 2229, 2229, 2229,
-     3425, 2229, 3427, 3438, 2229, 2238, 2238, 2238, 3422, 2227,
-     2210, 2235, 2235, 2235, 3432, 2235, 3435, 3422, 2235, 2239,
-
-     2239, 2239, 2238, 2239, 3423, 3419, 2239, 3433, 2243, 2243,
-     2243, 2217, 2243, 3423, 3425, 2243, 2247, 2247, 2247, 2248,
-     2248, 2248, 3431, 2249, 2249, 2249, 2227, 2249, 3427, 3438,
-     2249, 3432, 1525, 2247, 2252, 2252, 2252, 2248, 2253, 2253,
-     2253, 3436, 2253, 3437, 3433, 2253, 2254, 2254, 2254, 3442,
-     2254, 2252, 3439, 2254, 2257, 2257, 2257, 2259, 2259, 2259,
-     1524, 2259, 3440, 1523, 2259, 1522, 2265, 2265, 2265, 2267,
-     2267, 2267, 2257, 2268, 2268, 2268, 3436, 2268, 3437, 3443,
-     2268, 3442, 3446, 2248, 2265, 1513, 2267, 2269, 2269, 2269,
-     2271, 2271, 2271, 2272, 2272, 2272, 3441, 2272, 3439, 3440,
-
-     2272, 2279, 2279, 2279, 3444, 2269, 1505, 2271, 2282, 2282,
-     2282, 3443, 2282, 3444, 3446, 2282, 2289, 2289, 2289, 2279,
-     2257, 2285, 2285, 2285, 3447, 2285, 1490, 3448, 2285, 3449,
-     2291, 2291, 2291, 3441, 2289, 2292, 2292, 2292, 2293, 2293,
-     2293, 1489, 2293, 1484, 1483, 2293, 3445, 2269, 2291, 1482,
-     2296, 2296, 2296, 2292, 2296, 3445, 3447, 2296, 2299, 2299,
-     2299, 1480, 2300, 2300, 2300, 1473, 1472, 2289, 2301, 2301,
-     2301, 2292, 2302, 2302, 2302, 3448, 2299, 3449, 2299, 2300,
-     2303, 2303, 2303, 1454, 1449, 2301, 2304, 2304, 2304, 2302,
-     2306, 2306, 2306, 2307, 2307, 2307, 2291, 2303, 2308, 2308,
-
-     2308, 2312, 2312, 2312, 2304, 2309, 2309, 2309, 2306, 3450,
-     3453, 2307, 1446, 2313, 2313, 2313, 2308, 2313, 1445, 2301,
-     2313, 3453, 1442, 2309, 2316, 2316, 2316, 2317, 2317, 2317,
-     2318, 2318, 2318, 2319, 2319, 2319, 2302, 1437, 1428, 2303,
-     1427, 3450, 2316, 2322, 2322, 2322, 2323, 2323, 2323, 1426,
-     2306, 2304, 2325, 2325, 2325, 2326, 2326, 2326, 1422, 1417,
-     2308, 2328, 2328, 2328, 2329, 2329, 2329, 2330, 2330, 2330,
-     2331, 2331, 2331, 2334, 2334, 2334, 2335, 2335, 2335, 2336,
-     2336, 2336, 1413, 2316, 2337, 2337, 2337, 2339, 2339, 2339,
-     2342, 2342, 2342, 2343, 2343, 2343, 3451, 2343, 1405, 1400,
-
-     2343, 2346, 2346, 2346, 1399, 2339, 1393, 2342, 2347, 2347,
-     2347, 1392, 2349, 2349, 2349, 1391, 2349, 1390, 2346, 2349,
-     2362, 2362, 2362, 2363, 2363, 2363, 2347, 2363, 3451, 1385,
-     2363, 2366, 2366, 2366, 2367, 2367, 2367, 1384, 2362, 2371,
-     2371, 2371, 2373, 2373, 2373, 1383, 2373, 1382, 1368, 2373,
-     2377, 2377, 2377, 2379, 2379, 2379, 1367, 2379, 1366, 1365,
-     2379, 2383, 2383, 2383, 2385, 2385, 2385, 2346, 2377, 2384,
-     2384, 2384, 2393, 2393, 2393, 2394, 2394, 2394, 1364, 2383,
-     1363, 2362, 2385, 2399, 2399, 2399, 2384, 2399, 1362, 1361,
-     2399, 1360, 1350, 2394, 1349, 1348, 2377, 2402, 2402, 2402,
-
-     2406, 2406, 2406, 2407, 2407, 2407, 1347, 2407, 1330, 1329,
-     2407, 2408, 2408, 2408, 2402, 2385, 1324, 2406, 2409, 2409,
-     2409, 1323, 2409, 1322, 1317, 2409, 2412, 2412, 2412, 2408,
-     2417, 2417, 2417, 1316, 1299, 2394, 2419, 2419, 2419, 2420,
-     2420, 2420, 1295, 2420, 2412, 1294, 2420, 1288, 2417, 2423,
-     2423, 2423, 1284, 2419, 1283, 2424, 2424, 2424, 2425, 2425,
-     2425, 1282, 2425, 1281, 1280, 2425, 1279, 2423, 2428, 2428,
-     2428, 1278, 2424, 2429, 2429, 2429, 2434, 2434, 2434, 2436,
-     2436, 2436, 2439, 2439, 2439, 2428, 2438, 2438, 2438, 1276,
-     2429, 1275, 1273, 2434, 2440, 2440, 2440, 1272, 1271, 2439,
-
-     2423, 2424, 1266, 1258, 2438, 1256, 2441, 2441, 2441, 2443,
-     2443, 2443, 2440, 2442, 2442, 2442, 1251, 1249, 2444, 2444,
-     2444, 1240, 2444, 2428, 2441, 2444, 2443, 2434, 2445, 2445,
-     2445, 2442, 1235, 1224, 2429, 2446, 2446, 2446, 2447, 2447,
-     2447, 2448, 2448, 2448, 1222, 2445, 2449, 2449, 2449, 1221,
-     2442, 1220, 2446, 1219, 2440, 2447, 2450, 2450, 2450, 2448,
-     2451, 2451, 2451, 2453, 2453, 2453, 1217, 2441, 1216, 2454,
-     2454, 2454, 1215, 1214, 2450, 2457, 2457, 2457, 2451, 1213,
-     1212, 2453, 2458, 2458, 2458, 1210, 2446, 2454, 1209, 2447,
-     2459, 2459, 2459, 2460, 2460, 2460, 2463, 2463, 2463, 1208,
-
-     2458, 2464, 2464, 2464, 2466, 2466, 2466, 2467, 2467, 2467,
-     2471, 2471, 2471, 2474, 2474, 2474, 2475, 2475, 2475, 1207,
-     2475, 1206, 2450, 2475, 2487, 2487, 2487, 2453, 2471, 1205,
-     2474, 2454, 2498, 2498, 2498, 2501, 2501, 2501, 2504, 2504,
-     2504, 1204, 2487, 2507, 2507, 2507, 2509, 2509, 2509, 1203,
-     2510, 2510, 2510, 1201, 2510, 1200, 2504, 2510, 2511, 2511,
-     2511, 2507, 1199, 2509, 2518, 2518, 2518, 2519, 2519, 2519,
-     2520, 2520, 2520, 2526, 2526, 2526, 2511, 1198, 2527, 2527,
-     2527, 2518, 2527, 1197, 2487, 2527, 1196, 1195, 2520, 1189,
-     2526, 2529, 2529, 2529, 2531, 2531, 2531, 1188, 2531, 1187,
-
-     1184, 2531, 1183, 1182, 2504, 2534, 2534, 2534, 2529, 1180,
-     2536, 2536, 2536, 2540, 2540, 2540, 2542, 2542, 2542, 2544,
-     2544, 2544, 1176, 2534, 2556, 2556, 2556, 2520, 2536, 1173,
-     2540, 1168, 1159, 2542, 2543, 2543, 2543, 2544, 2543, 1158,
-     1155, 2543, 2545, 2545, 2545, 2546, 2546, 2546, 1154, 2546,
-     1153, 1152, 2546, 2554, 2554, 2554, 2558, 2558, 2558, 2545,
-     2560, 2560, 2560, 1151, 2561, 2561, 2561, 1137, 2561, 1130,
-     2554, 2561, 1122, 1121, 2558, 1120, 1117, 2560, 2562, 2562,
-     2562, 2563, 2563, 2563, 1114, 2564, 2564, 2564, 2565, 2565,
-     2565, 1111, 2565, 1106, 1103, 2565, 2562, 1102, 1098, 2563,
-
-     2568, 2568, 2568, 2564, 2569, 2569, 2569, 1096, 2569, 1082,
-     1081, 2569, 2570, 2570, 2570, 1080, 1079, 2568, 2571, 2571,
-     2571, 2572, 2572, 2572, 2574, 2574, 2574, 1078, 1077, 2570,
-     1076, 1075, 2575, 2575, 2575, 2571, 2576, 2576, 2576, 2572,
-     2580, 2580, 2580, 2584, 2584, 2584, 1074, 1073, 2563, 2564,
-     2575, 2585, 2585, 2585, 2576, 2589, 2589, 2589, 2580, 2590,
-     2590, 2590, 1069, 2590, 1065, 1058, 2590, 2604, 2604, 2604,
-     1055, 1054, 2589, 2619, 2619, 2619, 2622, 2622, 2622, 2623,
-     2623, 2623, 2625, 2625, 2625, 2604, 2625, 1050, 1049, 2625,
-     2628, 2628, 2628, 1048, 2622, 1045, 1044, 2576, 2631, 2631,
-
-     2631, 2634, 2634, 2634, 1043, 2635, 2635, 2635, 2628, 2635,
-     1040, 1039, 2635, 1036, 1035, 2631, 1032, 1029, 2634, 2636,
-     2636, 2636, 2640, 2640, 2640, 1025, 1024, 2604, 2642, 2642,
-     2642, 1021, 2642, 1020, 1019, 2642, 1018, 2636, 1017, 2640,
-     2646, 2646, 2646, 1015, 2647, 2647, 2647, 2622, 2647, 1014,
-     1013, 2647, 2654, 2654, 2654, 1012, 1011, 2646, 2655, 2655,
-     2655, 2656, 2656, 2656, 1010, 2656, 1009, 1008, 2656, 2654,
-     2657, 2657, 2657, 1004,  999, 2655, 2658, 2658, 2658,  998,
-     2658,  997,  994, 2658, 2661, 2661, 2661, 2657, 2663, 2663,
-     2663,  993, 2663,  992,  990, 2663, 2671, 2671, 2671, 2672,
-
-     2672, 2672, 2661, 2672,  986,  982, 2672, 2673, 2673, 2673,
-     2674, 2674, 2674, 2671, 2675, 2675, 2675,  981, 2675,  978,
-      975, 2675,  974,  973, 2673,  972,  971, 2674, 2678, 2678,
-     2678, 2680, 2680, 2680, 2681, 2681, 2681, 2682, 2682, 2682,
-      970, 2682,  969,  967, 2682,  966, 2678,  965,  964, 2680,
-      963,  962, 2681, 2685, 2685, 2685, 2686, 2686, 2686,  961,
-     2686,  960,  959, 2686, 2687, 2687, 2687, 2688, 2688, 2688,
-     2685, 2688,  958,  956, 2688, 2689, 2689, 2689, 2691, 2691,
-     2691, 2687, 2696, 2696, 2696, 2697, 2697, 2697, 2701, 2701,
-     2701,  955,  954, 2689,  953, 2681, 2691, 2680,  952, 2702,
-
-     2702, 2702,  951, 2702,  950, 2701, 2702, 2720, 2720, 2720,
-     2734, 2734, 2734, 2736, 2736, 2736, 2737, 2737, 2737, 2738,
-     2738, 2738, 2739, 2739, 2739, 2720, 2740, 2740, 2740,  949,
-     2736, 2741, 2741, 2741, 2737, 2800, 2800, 2800,  948, 2739,
-     2691,  947,  943, 2740,  942, 2742, 2742, 2742, 2741, 2742,
-      940,  939, 2742, 2743, 2743, 2743,  938, 2743, 2720,  937,
-     2743, 2746, 2746, 2746, 2750, 2750, 2750, 2751, 2751, 2751,
-      936,  932, 2740, 2752, 2752, 2752,  930, 2752, 2737, 2746,
-     2752, 2750,  929,  928, 2751, 2753, 2753, 2753, 2755, 2755,
-     2755,  927, 2755,  923,  922, 2755, 2764, 2764, 2764, 2765,
-
-     2765, 2765, 2753, 2765,  918,  914, 2765, 2766, 2766, 2766,
-      913, 2766,  910, 2764, 2766, 2769, 2769, 2769, 2770, 2770,
-     2770,  909, 2770,  908,  907, 2770, 2772, 2772, 2772, 2774,
-     2774, 2774, 2769, 2774,  906,  905, 2774, 2777, 2777, 2777,
-     2778, 2778, 2778, 2772, 2778,  904,  901, 2778, 2779, 2779,
-     2779, 2780, 2780, 2780, 2777, 2780,  900,  899, 2780, 2787,
-     2787, 2787, 2788, 2788, 2788, 2779, 2789, 2789, 2789,  898,
-     2789,  895,  894, 2789, 2792, 2792, 2792, 2787, 2792,  893,
-     2788, 2792, 2795, 2795, 2795, 2798, 2798, 2798, 2801, 2801,
-     2801, 2804, 2804, 2804,  890, 2804,  888,  885, 2804,  884,
-
-     2795,  883, 2798, 2798, 2815, 2815, 2815, 2824, 2824, 2824,
-     2787, 2838, 2838, 2838, 2839, 2839, 2839, 2840, 2840, 2840,
-      882, 2815, 2842, 2842, 2842, 2824, 2841, 2841, 2841, 2788,
-     2841,  881,  878, 2841, 2840, 2843, 2843, 2843,  877,  876,
-     2842, 2844, 2844, 2844,  875, 2844,  874,  871, 2844, 2845,
-     2845, 2845, 2843, 2846, 2846, 2846, 2824, 2846,  870,  869,
-     2846, 2848, 2848, 2848,  868, 2848, 2845,  866, 2848, 2853,
-     2853, 2853,  863, 2842, 2854, 2854, 2854,  862, 2854,  860,
-      857, 2854,  855, 2855, 2855, 2855, 2853, 2855,  852,  851,
-     2855, 2858, 2858, 2858, 2859, 2859, 2859,  850, 2859,  849,
-
-      847, 2859, 2867, 2867, 2867,  846, 2867,  845, 2858, 2867,
-     2870, 2870, 2870,  842, 2870,  841,  840, 2870, 2874, 2874,
-     2874, 2875, 2875, 2875,  839, 2875,  838,  837, 2875, 2877,
-     2877, 2877,  832, 2877,  831, 2874, 2877, 2880, 2880, 2880,
-      830, 2880,  829,  828, 2880, 2889, 2889, 2889, 2890, 2890,
-     2890, 2895, 2895, 2895, 2898, 2898, 2898, 2899, 2899, 2899,
-     2900, 2900, 2900, 2889, 2900,  827, 2890, 2900,  826, 2895,
-      825, 2898, 2898,  824, 2899, 2899,  823,  822, 2900, 2901,
-     2901, 2901, 2902, 2902, 2902, 2903, 2903, 2903, 2904, 2904,
-     2904, 2913, 2913, 2913, 2914, 2914, 2914,  821, 2914,  819,
-
-      817, 2914, 2923, 2923, 2923, 2936, 2936, 2936, 2913, 2937,
-     2937, 2937,  816,  813, 2890, 2938, 2938, 2938,  810, 2938,
-     2923,  807, 2938, 2941, 2941, 2941, 2942, 2942, 2942,  806,
-     2942,  802,  801, 2942,  800, 2945, 2945, 2945,  799, 2945,
-      796, 2941, 2945, 2951, 2951, 2951,  793, 2951,  792,  791,
-     2951, 2954, 2954, 2954,  788, 2954,  787,  786, 2954, 2957,
-     2957, 2957, 2964, 2964, 2964, 2965, 2965, 2965, 2923, 2965,
-      783,  782, 2965, 2968, 2968, 2968, 2957,  780,  776, 2964,
-     2983, 2983, 2983, 2985, 2985, 2985, 2991, 2991, 2991,  775,
-     2968,  774, 2992, 2992, 2992,  772, 2992,  761, 2983, 2992,
-
-      759, 2985,  756, 2991, 2991, 2993, 2993, 2993,  755, 2993,
-     2992,  754, 2993, 2996, 2996, 2996, 2997, 2997, 2997, 2998,
-     2998, 2998,  752, 2993, 3007, 3007, 3007,  751, 3007,  750,
-      746, 3007,  745,  744, 2985, 2994, 2994, 2994, 2994, 2994,
-     2994, 2994, 2994, 2994,  743,  740, 2994, 3016, 3016, 3016,
-      739, 2994, 2994, 2994, 2994, 2994, 3025, 3025, 3025, 3026,
-     3026, 3026, 3031, 3031, 3031, 3016, 3032, 3032, 3032,  738,
-     3032,  737,  736, 3032, 3033, 3033, 3033, 3026,  735, 3031,
-     2994, 2994, 2995, 2995, 2995, 2995, 2995, 2995, 2995, 2995,
-     2995, 3033,  734, 2995, 3039, 3039, 3039,  732, 2995, 2995,
-
-     2995, 2995, 2995, 3040, 3040, 3040,  729, 3040,  728,  726,
-     3040, 3039, 3041, 3041, 3041, 3042, 3042, 3042,  724, 3042,
-      721,  720, 3042, 3055, 3055, 3055,  714, 2995, 2995, 3041,
-     3061, 3061, 3061,  712, 3061,  710,  707, 3061,  706,  702,
-      701, 3055,  700, 3080, 3080, 3080,  699,  696, 3061, 3064,
-     3064, 3064, 3064, 3064, 3064, 3064, 3064, 3064,  695,  694,
-     3064, 3080, 3094, 3094, 3094, 3064, 3064, 3064, 3064, 3064,
-     3091, 3091, 3091,  693, 3091,  690,  689, 3091,  688, 3094,
-     3095, 3095, 3095,  687, 3095,  686,  680, 3095, 3117, 3117,
-     3117, 3129, 3129, 3129, 3064, 3064, 3065, 3065, 3065, 3065,
-
-     3065, 3065, 3065, 3065, 3065,  679, 3117, 3065,  677, 3129,
-     3129,  671, 3065, 3065, 3065, 3065, 3065, 3099, 3099, 3099,
-      670, 3099,  666,  660, 3099, 3102, 3102, 3102,  659, 3102,
-      655,  648, 3102, 3146, 3146, 3146, 3147, 3147, 3147,  644,
-      638, 3065, 3065, 3148, 3148, 3148,  634, 3153, 3153, 3153,
-     3146, 3153,  626, 3147, 3153, 3156, 3156, 3156,  625,  624,
-     3148, 3167, 3167, 3167, 3171, 3171, 3171, 3182, 3182, 3182,
-      623,  622, 3156, 3183, 3183, 3183,  618, 3183,  611, 3167,
-     3183,  610, 3171,  609, 3182, 3184, 3184, 3184, 3185, 3185,
-     3185,  605, 3185,  598,  597, 3185, 3186, 3186, 3186, 3187,
-
-     3187, 3187, 3184, 3187,  593,  587, 3187, 3194, 3194, 3194,
-     3195, 3195, 3195, 3186, 3195, 3171,  586, 3195, 3204, 3204,
-     3204, 3214, 3214, 3214, 3194, 3214,  582,  574, 3214,  573,
-     3217, 3217, 3217,  569, 3217,  560, 3204, 3217, 3220, 3220,
-     3220,  556, 3220,  548,  547, 3220, 3229, 3229, 3229,  546,
-     3229,  542,  536, 3229,  535, 3204, 3344, 3344, 3344, 3353,
-     3353, 3353,  534, 3353,  530,  524, 3353, 3454, 3454, 3454,
-     3455, 3455, 3455,  523, 3344,  519,  513, 3353,  512,  511,
-      510,  509,  508,  507,  503, 3454,  497,  496, 3455, 3458,
-     3458, 3458, 3458, 3458, 3458, 3458, 3458, 3458, 3459, 3459,
-
-     3459, 3459, 3459, 3459, 3459, 3459, 3459, 3460, 3460, 3460,
-     3460, 3460, 3460, 3460, 3460, 3460, 3461, 3461, 3461, 3461,
-     3461, 3461, 3461, 3461, 3461, 3462, 3462, 3462, 3462, 3462,
-     3462, 3462, 3462, 3462, 3463, 3463, 3463, 3463, 3463, 3463,
-     3463, 3463, 3463, 3464, 3464, 3464, 3464, 3464, 3464, 3464,
-     3464, 3464, 3465, 3465, 3465, 3465, 3465, 3465, 3465, 3465,
-     3465, 3466, 3466, 3466, 3466, 3466, 3466, 3466, 3466, 3466,
-     3467, 3467, 3467, 3467, 3467, 3467, 3467, 3467, 3467, 3468,
-     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3469, 3469,
-     3469, 3469, 3469, 3469, 3469, 3469, 3469, 3470, 3470, 3470,
-
-     3470, 3470, 3470, 3470, 3470, 3470, 3471, 3471, 3471, 3471,
-     3471, 3471, 3471, 3471, 3471, 3472, 3472, 3472, 3472, 3472,
-     3472, 3472, 3472, 3472, 3473, 3473, 3473, 3473, 3473, 3473,
-     3473, 3473, 3473, 3474, 3474, 3474, 3474, 3474, 3474, 3474,
-     3474, 3474, 3475, 3475, 3475, 3475, 3475, 3475, 3475, 3475,
-     3475, 3476, 3476, 3476, 3476, 3476, 3476, 3476, 3476, 3476,
-     3477, 3477, 3477, 3477, 3477, 3477, 3477, 3477, 3477, 3478,
-     3478, 3478, 3478, 3478, 3478, 3478, 3478, 3478, 3479, 3479,
-     3479, 3479, 3479, 3479, 3479, 3479, 3479, 3480, 3480, 3480,
-     3480, 3480, 3480, 3480, 3480, 3480, 3481, 3481, 3481, 3481,
-
-     3481, 3481, 3481, 3481, 3481, 3482, 3482, 3482, 3482, 3482,
-     3482, 3482, 3482, 3482, 3483, 3483, 3483, 3483, 3483, 3483,
-     3483, 3483, 3483, 3484, 3484, 3484, 3484, 3484, 3484, 3484,
-     3484, 3484, 3485, 3485, 3485, 3485, 3485, 3485, 3485, 3485,
-     3485, 3486, 3486, 3486, 3486, 3486, 3486, 3486, 3486, 3486,
-     3487, 3487, 3487, 3487, 3487, 3487, 3487, 3487, 3487, 3488,
-     3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3489, 3489,
-     3489, 3489, 3489, 3489, 3489, 3489, 3489, 3490, 3490, 3490,
-     3490, 3490, 3490, 3490, 3490, 3490, 3491, 3491, 3491, 3491,
-     3491, 3491, 3491, 3491, 3491, 3492, 3492, 3492, 3492, 3492,
-
-     3492, 3492, 3492, 3492, 3493, 3493, 3493, 3493, 3493, 3493,
-     3493, 3493, 3493, 3494, 3494, 3494, 3494, 3494, 3494, 3494,
-     3494, 3494, 3495, 3495, 3495, 3495, 3495, 3495, 3495, 3495,
-     3495, 3496, 3496, 3496, 3496, 3496, 3496, 3496, 3496, 3496,
-     3497, 3497, 3497, 3497, 3497, 3497, 3497, 3497, 3497, 3498,
-     3498, 3498, 3498, 3498, 3498, 3498, 3498, 3498, 3499, 3499,
-     3499, 3499, 3499, 3499, 3499, 3499, 3499, 3500, 3500, 3500,
-     3500, 3500, 3500, 3500, 3500, 3500, 3501, 3501, 3501, 3501,
-     3501, 3501, 3501, 3501, 3501, 3502, 3502, 3502, 3502, 3502,
-     3502, 3502, 3502, 3502, 3503, 3503, 3503, 3503, 3503, 3503,
-
-     3503, 3503, 3503, 3504, 3504, 3504, 3504, 3504, 3504, 3504,
-     3504, 3504, 3505, 3505, 3505, 3505, 3505, 3505, 3505, 3505,
-     3505, 3506, 3506, 3506, 3506, 3506, 3506, 3506, 3506, 3506,
-     3507, 3507, 3507, 3507, 3507, 3507, 3507, 3507, 3507, 3508,
-     3508, 3508, 3508, 3508, 3508, 3508, 3508, 3508, 3509, 3509,
-     3509, 3509, 3509, 3509, 3509, 3509, 3509, 3510, 3510, 3510,
-     3510, 3510, 3510, 3510, 3510, 3510, 3511, 3511, 3511, 3511,
-     3511, 3511, 3511, 3511, 3511, 3512, 3512, 3512, 3512, 3512,
-     3512, 3512, 3512, 3512, 3513, 3513, 3513, 3513, 3513, 3513,
-     3513, 3513, 3513, 3514, 3514, 3514, 3514, 3514, 3514, 3514,
-
-     3514, 3514, 3515, 3515, 3515, 3515, 3515, 3515, 3515, 3515,
-     3515, 3516, 3516, 3516, 3516, 3516, 3516, 3516, 3516, 3516,
-     3517, 3517, 3517, 3517, 3517, 3517, 3517, 3517, 3517, 3518,
-     3518, 3518, 3518, 3518, 3518, 3518, 3518, 3518, 3519, 3519,
-     3519, 3519, 3519, 3519, 3519, 3519, 3519, 3520, 3520, 3520,
-     3520, 3520, 3520, 3520, 3520, 3520, 3521, 3521, 3521,  494,
-      493,  492, 3521, 3522, 3522, 3522,  488,  481,  476, 3522,
-     3523, 3523, 3523,  475,  473,  469, 3523, 3524, 3524, 3524,
-      463,  462,  461, 3524, 3525, 3525, 3525,  457,  451,  447,
-     3525, 3526, 3526, 3526,  443,  439,  437, 3526, 3527, 3527,
-
-     3527,  436,  435,  431, 3527, 3528, 3528, 3528,  425,  424,
-      420, 3528, 3529, 3529, 3529,  414,  413,  409, 3529, 3530,
-     3530, 3530,  402,  401,  400, 3530, 3531, 3531, 3531,  396,
-      388,  387, 3531, 3532, 3532, 3532,  386,  385,  381, 3532,
-     3533, 3533, 3533,  372,  366,  362, 3533, 3534, 3534, 3534,
-      361,  357,  351, 3534, 3535, 3535, 3535,  350,  349,  345,
-     3535, 3536, 3536, 3536,  338,  336,  335, 3536, 3537, 3537,
-     3537,  331,  328,  326, 3537, 3538, 3538, 3538,  325,  324,
-      320, 3538, 3539, 3539, 3539,  316,  313,  309, 3539, 3540,
-     3540, 3540,  306,  305,  297, 3540, 3541, 3541, 3541,  293,
-
-      289,  288, 3541, 3542, 3542, 3542,  287,  281,  280, 3542,
-     3543, 3543, 3543,  278,  275,  263, 3543, 3544, 3544, 3544,
-        0,    0,    0, 3544, 3545, 3545, 3545,    0,    0,    0,
-     3545, 3546, 3546, 3546,    0,    0,    0, 3546, 3547, 3547,
-     3547,    0,    0,    0, 3547, 3548, 3548, 3548,    0,    0,
-        0, 3548, 3549, 3549, 3549,    0,    0,    0, 3549, 3550,
-     3550, 3550, 3550, 3550, 3550, 3550,    0, 3550, 3551, 3551,
-     3551,    0,    0,    0, 3551, 3552,    0,    0,    0, 3552,
-     3553, 3553, 3553,    0,    0,    0, 3553, 3554,    0,    0,
+     1137,  258,  258,  258,  258,  258, 1144, 1144, 1144, 1145,
+     1145, 1145, 1146, 1146, 1146, 1147, 1147, 1147, 1148, 1148,
+     1148, 1149, 1149, 1149, 1144, 2506, 1145, 2513, 2514, 1146,
+      258,  258, 2516, 1147, 2506, 2520, 1148, 2521, 1149, 2522,
+     2524,  258, 2528, 1150, 1150, 1150, 1151, 1151, 1151, 1152,
+     1152, 1152, 2532, 2533,  258,  300, 1153, 1153, 1153, 2534,
+     1150, 1144,  300, 1151, 1159, 1159, 1159, 1152, 1160, 1160,
+
+     1160,  300,  300, 2535, 1153, 2536, 1163, 1163, 1163, 1164,
+     1164, 1164, 1159, 1175, 1175, 1175, 1160, 1175, 2539, 1148,
+     1175, 2541, 2549, 1150, 1163, 2550, 2543, 1164, 2552,  300,
+      300,  300, 1959, 1959, 1959,  300,  300,  300, 1150, 2543,
+      300,  300, 2558, 2559,  300, 2560,  300,  300,  300,  365,
+     1165, 1165, 1165, 1167, 1167, 1167,  365, 1153, 1168, 1168,
+     1168, 2544, 1160, 2561, 2563,  365,  365, 1165, 1169, 1169,
+     1169, 1167, 2566, 1164, 2544, 2568, 1168, 2593, 1172, 1172,
+     1172, 1174, 1174, 1174, 2594, 1169, 2590, 2597, 1173, 1173,
+     1173, 2598, 2588,  365,  365,  365, 1172, 2599, 1174,  365,
+
+      365,  365, 2589, 2604,  365,  365, 1173, 2605,  365, 2606,
+      365,  365,  365, 1177, 1177, 1177, 1178, 1178, 1178, 1168,
+     1193, 1193, 1193, 1194, 1194, 1194, 1196, 1196, 1196, 2590,
+     2602, 1177, 2588, 2607, 1178, 1229, 1229, 1229, 1193, 2589,
+     2602, 1194, 2608, 2602, 1196, 1228, 1228, 1228, 1230, 1230,
+     1230, 2609, 1173, 1229, 1232, 1232, 1232, 1233, 1233, 1233,
+     2610, 2611, 1228, 1234, 1234, 1234, 1230, 1234, 2612, 2613,
+     1234, 2614, 1232, 1196, 1233, 2616, 2617, 1178, 1237, 1237,
+     1237, 1239, 1239, 1239, 1240, 1240, 1240, 1242, 1242, 1242,
+     1244, 1244, 1244, 2618, 1244, 1237, 2619, 1244, 2620, 1239,
+
+     2621, 2622, 1240, 1232, 2603, 1242, 1247, 1247, 1247, 1248,
+     1248, 1248, 2623, 1248, 2603, 2624, 1248, 2603, 1249, 1249,
+     1249, 2625, 2626, 1247, 1250, 1250, 1250, 2627, 2628, 1251,
+     1251, 1251, 2629, 1251, 1242, 1249, 1251, 2631, 2632, 1237,
+     2640, 1250, 1253, 1253, 1253, 1255, 1255, 1255, 1256, 1256,
+     1256, 1258, 1258, 1258, 1260, 1260, 1260, 2646, 2648, 1253,
+     1262, 1262, 1262, 1255, 2649, 2650, 1256, 2652, 2656, 1258,
+     2659, 1260, 1263, 1263, 1263, 1265, 1265, 1265, 1262, 1266,
+     1266, 1266, 2660, 1266, 2661, 2662, 1266, 1270, 1270, 1270,
+     1263, 2663, 2664, 1265, 1271, 1271, 1271, 1273, 1273, 1273,
+
+     1288, 1288, 1288, 2677, 1288, 1270, 2678, 1288, 1292, 1292,
+     1292, 1258, 1271, 2679, 2706, 1273, 1293, 1293, 1293, 1294,
+     1294, 1294, 1265, 2709, 2703, 1292, 1296, 1296, 1296, 1298,
+     1298, 1298, 2710, 2711, 1293, 2714, 2715, 1294, 1299, 1299,
+     1299, 1300, 1300, 1300, 1296, 2717, 1298, 1301, 1301, 1301,
+     1303, 1303, 1303, 2703, 2716, 1299, 1304, 1304, 1304, 1300,
+     1305, 1305, 1305, 2718, 2720, 1301, 2721, 2716, 1303, 1312,
+     1312, 1312, 2704, 1304, 1306, 1306, 1306, 1305, 1307, 1307,
+     1307, 1309, 1309, 1309, 2722, 1299, 1312, 1296, 1305, 1319,
+     1319, 1319, 1306, 1313, 1313, 1313, 1307, 1313, 2705, 1309,
+
+     1313, 1320, 1320, 1320, 1322, 1322, 1322, 1319, 1327, 1327,
+     1327, 2723, 1327, 2724, 2704, 1327, 2726, 1303, 2727, 1320,
+     2728, 2729, 1322, 1331, 1331, 1331, 1332, 1332, 1332, 2687,
+     1334, 1334, 1334, 1335, 1335, 1335, 1336, 1336, 1336, 2687,
+     2705, 1331, 2732, 2733, 1332, 2687, 2734, 1309, 1334, 2719,
+     1335, 1340, 1340, 1340, 1336, 1337, 1337, 1337, 1339, 1339,
+     1339, 2735, 2719, 1341, 1341, 1341, 2736, 1341, 1340, 1322,
+     1341, 2737, 2738, 1337, 2739, 2740, 1339, 1344, 1344, 1344,
+     2741, 1344, 2742, 2743, 1344, 1347, 1347, 1347, 1348, 1348,
+     1348, 1334, 1350, 1350, 1350, 1355, 1355, 1355, 2744, 1355,
+
+     2746, 2759, 1355, 1347, 2760, 2765, 1348, 1358, 1358, 1358,
+     1350, 1359, 1359, 1359, 2769, 1359, 2770, 2771, 1359, 1362,
+     1362, 1362, 2772, 2773, 1358, 1339, 1363, 1363, 1363, 2774,
+     1363, 2782, 2784, 1363, 2792, 2793, 1362, 1374, 1374, 1374,
+     1375, 1375, 1375, 1377, 1377, 1377, 1378, 1378, 1378, 2688,
+     1378, 2794, 2795, 1378, 2796, 1374, 2797, 1350, 1375, 2688,
+     2810, 1377, 1381, 1381, 1381, 2688, 1381, 2813, 2814, 1381,
+     1384, 1384, 1384, 1385, 1385, 1385, 2818, 1385, 2819, 2820,
+     1385, 1390, 1390, 1390, 1391, 1391, 1391, 1384, 1393, 1393,
+     1393, 1398, 1398, 1398, 2821, 1398, 2822, 2823, 1398, 1390,
+
+     2801, 2824, 1391, 1401, 1401, 1401, 1393, 1402, 1402, 1402,
+     1377, 1402, 2807, 2801, 1402, 1405, 1405, 1405, 2825, 2802,
+     1401, 1406, 1406, 1406, 1408, 1408, 1408, 1410, 1410, 1410,
+     2808, 1410, 2802, 1405, 1410, 2827, 1393, 2828, 2829, 1406,
+     2830, 2831, 1408, 1413, 1413, 1413, 1414, 1414, 1414, 1416,
+     1416, 1416, 1418, 1418, 1418, 2832, 1418, 2833, 2834, 1418,
+     2807, 1413, 2836, 2837, 1414, 2808, 2838, 1416, 1422, 1422,
+     1422, 1423, 1423, 1423, 2839, 1408, 1425, 1425, 1425, 2840,
+     1427, 1427, 1427, 2841, 1427, 2842, 1422, 1427, 2843, 1423,
+     1433, 1433, 1433, 2844, 1425, 1434, 1434, 1434, 2845, 1436,
+
+     1436, 1436, 1437, 1437, 1437, 1438, 1438, 1438, 1433, 1438,
+     2846, 2847, 1438, 1434, 2848, 2856, 1416, 1436, 2862, 1437,
+     1439, 1439, 1439, 2863, 2871, 1425, 1440, 1440, 1440, 2872,
+     1440, 2873, 2874, 1440, 1442, 1442, 1442, 1439, 1443, 1443,
+     1443, 2875, 1445, 1445, 1445, 1447, 1447, 1447, 2876, 1451,
+     1451, 1451, 1442, 1964, 1964, 1964, 1443, 2877, 2884, 1436,
+     1445, 2887, 1447, 1448, 1448, 1448, 1451, 1448, 2894, 2895,
+     1448, 1452, 1452, 1452, 2896, 1452, 2897, 2898, 1452, 1454,
+     1454, 1454, 1455, 1455, 1455, 1457, 1457, 1457, 1459, 1459,
+     1459, 2889, 1459, 2899, 2902, 1459, 2903, 1454, 2890, 2904,
+
+     1455, 2889, 2905, 1457, 1462, 1462, 1462, 2916, 2890, 1445,
+     1463, 1463, 1463, 1465, 1465, 1465, 1466, 1466, 1466, 1467,
+     1467, 1467, 1462, 1467, 2917, 2918, 1467, 2919, 1463, 2920,
+     2892, 1465, 2893, 1466, 1468, 1468, 1468, 1469, 1469, 1469,
+     2892, 1469, 2893, 2921, 1469, 1470, 1470, 1470, 2922, 1457,
+     2923, 1468, 1471, 1471, 1471, 2926, 1473, 1473, 1473, 1474,
+     1474, 1474, 2927, 1470, 1475, 1475, 1475, 2929, 1475, 2930,
+     1471, 1475, 2931, 1465, 1473, 2933, 1474, 1478, 1478, 1478,
+     1479, 1479, 1479, 2908, 1479, 2935, 2936, 1479, 1480, 1480,
+     1480, 1481, 1481, 1481, 1478, 1483, 1483, 1483, 1485, 1485,
+
+     1485, 1489, 1489, 1489, 2937, 2940, 1480, 2941, 2942, 1481,
+     1490, 1490, 1490, 1483, 2943, 1485, 2946, 2908, 1473, 1489,
+     1492, 1492, 1492, 1495, 1495, 1495, 2956, 2960, 1490, 1496,
+     1496, 1496, 1498, 1498, 1498, 1499, 1499, 1499, 1492, 1499,
+     2961, 1495, 1499, 1502, 1502, 1502, 2969, 1496, 2970, 2971,
+     1498, 1503, 1503, 1503, 1505, 1505, 1505, 1483, 1506, 1506,
+     1506, 1502, 1506, 2972, 2973, 1506, 1510, 1510, 1510, 1503,
+     2974, 2980, 1505, 1511, 1511, 1511, 1513, 1513, 1513, 2981,
+     2982, 1492, 2983, 2984, 1510, 1498, 1514, 1514, 1514, 2985,
+     1514, 1511, 2986, 1514, 1513, 1518, 1518, 1518, 1519, 1519,
+
+     1519, 1521, 1521, 1521, 1523, 1523, 1523, 1530, 1530, 1530,
+     1561, 1561, 1561, 1518, 1505, 2987, 1519, 2988, 2989, 1521,
+     2991, 2992, 1523, 1523, 2997, 1530, 2998, 1561, 1562, 1562,
+     1562, 2999, 1562, 3000, 3001, 1562, 3010, 1513, 1563, 1563,
+     1563, 1564, 1564, 1564, 3011, 1565, 1565, 1565, 3012, 1565,
+     3013, 1521, 1565, 1568, 1568, 1568, 1563, 3014, 1564, 1570,
+     1570, 1570, 3015, 1570, 3016, 3017, 1570, 1573, 1573, 1573,
+     3021, 1568, 3022, 1530, 1574, 1574, 1574, 3001, 1574, 3023,
+     3024, 1574, 3025, 3026, 1573, 1575, 1575, 1575, 3028, 1575,
+     3029, 3031, 1575, 1579, 1579, 1579, 1563, 1580, 1580, 1580,
+
+     3032, 1580, 1568, 3033, 1580, 1582, 1582, 1582, 3035, 3039,
+     1579, 1584, 1584, 1584, 1585, 1585, 1585, 3040, 1585, 3041,
+     3046, 1585, 3048, 1582, 1586, 1586, 1586, 3049, 1584, 1587,
+     1587, 1587, 1589, 1589, 1589, 1605, 1605, 1605, 1968, 1968,
+     1968, 1586, 1606, 1606, 1606, 3054, 3055, 1587, 3056, 3057,
+     1589, 3058, 1605, 3059, 3060, 1582, 1607, 1607, 1607, 1606,
+     1607, 3061, 3062, 1607, 1608, 1608, 1608, 1610, 1610, 1610,
+     1611, 1611, 1611, 3063, 1611, 3064, 3065, 1611, 1587, 1613,
+     1613, 1613, 1608, 3067, 1610, 1614, 1614, 1614, 1615, 1615,
+     1615, 3068, 1615, 3069, 3070, 1615, 3077, 1613, 1617, 1617,
+
+     1617, 3073, 1614, 1620, 1620, 1620, 1621, 1621, 1621, 3080,
+     1621, 3081, 3084, 1621, 3071, 3073, 1617, 1622, 1622, 1622,
+     1620, 1624, 1624, 1624, 1625, 1625, 1625, 3086, 1608, 1631,
+     1631, 1631, 3074, 3087, 1622, 1632, 1632, 1632, 1624, 1613,
+     3089, 3090, 1625, 3074, 1633, 1633, 1633, 1631, 1633, 3094,
+     3095, 1633, 1632, 1634, 1634, 1634, 1635, 1635, 1635, 1617,
+     3071, 1636, 1636, 1636, 3096, 1636, 3097, 1624, 1636, 3098,
+     3099, 1634, 3100, 1635, 1637, 1637, 1637, 1639, 1639, 1639,
+     1642, 1642, 1642, 3101, 1643, 1643, 1643, 3109, 1643, 3103,
+     1625, 1643, 1637, 1631, 1639, 3117, 3093, 1642, 1644, 1644,
+
+     1644, 3103, 1644, 3096, 3119, 1644, 1649, 1649, 1649, 1658,
+     1658, 1658, 1659, 1659, 1659, 3121, 1659, 3123, 3131, 1659,
+     1662, 1662, 1662, 1649, 1663, 1663, 1663, 1658, 1664, 1664,
+     1664, 1665, 1665, 1665, 1666, 1666, 1666, 1662, 3093, 3133,
+     1637, 1663, 1668, 1668, 1668, 1664, 3104, 3137, 1665, 1671,
+     1671, 1671, 1666, 1671, 3136, 3136, 1671, 3139, 3104, 1668,
+     1674, 1674, 1674, 1676, 1676, 1676, 1678, 1678, 1678, 1681,
+     1681, 1681, 3135, 3114, 1658, 1664, 3115, 1674, 1685, 1685,
+     1685, 1676, 3138, 3141, 1678, 3114, 3135, 1681, 3115, 1666,
+     1686, 1686, 1686, 3138, 1663, 1685, 1687, 1687, 1687, 3142,
+
+     1687, 1665, 3143, 1687, 3134, 1690, 1690, 1690, 1686, 1690,
+     3144, 3150, 1690, 1694, 1694, 1694, 1696, 1696, 1696, 3154,
+     1696, 3151, 3161, 1696, 1685, 3160, 1681, 1676, 1705, 1705,
+     1705, 1694, 1678, 1701, 1701, 1701, 3155, 1701, 3163, 3151,
+     1701, 1707, 1707, 1707, 3160, 3134, 1705, 1686, 1708, 1708,
+     1708, 3155, 1708, 3162, 3168, 1708, 1711, 1711, 1711, 1707,
+     1711, 3169, 3170, 1711, 1714, 1714, 1714, 1715, 1715, 1715,
+     3171, 1715, 3162, 3168, 1715, 3176, 1720, 1720, 1720, 1694,
+     1720, 3170, 1714, 1720, 1723, 1723, 1723, 3177, 3179, 1705,
+     1725, 1725, 1725, 1726, 1726, 1726, 3180, 1726, 1707, 3181,
+
+     1726, 3183, 1723, 1730, 1730, 1730, 3184, 1725, 1732, 1732,
+     1732, 1714, 1733, 1733, 1733, 1734, 1734, 1734, 1735, 1735,
+     1735, 1730, 1736, 1736, 1736, 1732, 1737, 1737, 1737, 3185,
+     1733, 1723, 3186, 1734, 3187, 1735, 1738, 1738, 1738, 3189,
+     1736, 3190, 3192, 1737, 1741, 1741, 1741, 1748, 1748, 1748,
+     3199, 3200, 1730, 3201, 1738, 3202, 1780, 1780, 1780, 3203,
+     1780, 3204, 1741, 1780, 3207, 1748, 3208, 1734, 1783, 1783,
+     1783, 1784, 1784, 1784, 3209, 1784, 3210, 3211, 1784, 1733,
+     1789, 1789, 1789, 3212, 1736, 3213, 1783, 1738, 3214, 1791,
+     1791, 1791, 3216, 1791, 3218, 1741, 1791, 3220, 1789, 1748,
+
+     1795, 1795, 1795, 3221, 1795, 3222, 3223, 1795, 1799, 1799,
+     1799, 3224, 1741, 1801, 1801, 1801, 3234, 1801, 3232, 3235,
+     1801, 1804, 1804, 1804, 3236, 3233, 1799, 1806, 1806, 1806,
+     3232, 1789, 1805, 1805, 1805, 1783, 1805, 3233, 1804, 1805,
+     1815, 1815, 1815, 3237, 3238, 1806, 1819, 1819, 1819, 1820,
+     1820, 1820, 3239, 1822, 1822, 1822, 1823, 1823, 1823, 3243,
+     1823, 3244, 3245, 1823, 1824, 1824, 1824, 3246, 1824, 1799,
+     1822, 1824, 1827, 1827, 1827, 1829, 1829, 1829, 1806, 1829,
+     3247, 3248, 1829, 1833, 1833, 1833, 3249, 1834, 1834, 1834,
+     1827, 1834, 3250, 3251, 1834, 1837, 1837, 1837, 1838, 1838,
+
+     1838, 1833, 3253, 3254, 1815, 3255, 3256, 1841, 1841, 1841,
+     1819, 1841, 1837, 1820, 1841, 3257, 1838, 3258, 3251, 1827,
+     1844, 1844, 1844, 1845, 1845, 1845, 3259, 1845, 3260, 3261,
+     1845, 1846, 1846, 1846, 1847, 1847, 1847, 1844, 1848, 1848,
+     1848, 3262, 1848, 3263, 3264, 1848, 3265, 3266, 1846, 1833,
+     3267, 1847, 1850, 1850, 1850, 1853, 1853, 1853, 1854, 1854,
+     1854, 3268, 1838, 1855, 1855, 1855, 1856, 1856, 1856, 3269,
+     1850, 3270, 1853, 3271, 3272, 1854, 1860, 1860, 1860, 3273,
+     1855, 1857, 1857, 1857, 1856, 1857, 3274, 3277, 1857, 1862,
+     1862, 1862, 3280, 1862, 1860, 3281, 1862, 1865, 1865, 1865,
+
+     1867, 1867, 1867, 1868, 1868, 1868, 3277, 1868, 3282, 3283,
+     1868, 3284, 3285, 1856, 3286, 1865, 3287, 1867, 1869, 1869,
+     1869, 1871, 1871, 1871, 1854, 1871, 3288, 3289, 1871, 1876,
+     1876, 1876, 1877, 1877, 1877, 1869, 1877, 3290, 3291, 1877,
+     1878, 1878, 1878, 1865, 3292, 3293, 1876, 1883, 1883, 1883,
+     1886, 1886, 1886, 1887, 1887, 1887, 3294, 1878, 1888, 1888,
+     1888, 3295, 1888, 3296, 1883, 1888, 3297, 3298, 1886, 3299,
+     1887, 1889, 1889, 1889, 1890, 1890, 1890, 1891, 1891, 1891,
+     1892, 1892, 1892, 1894, 1894, 1894, 3301, 3302, 1889, 3300,
+     3303, 1890, 3304, 3305, 1891, 1895, 1895, 1895, 1892, 1895,
+
+     1894, 3306, 1895, 1896, 1896, 1896, 1898, 1898, 1898, 3300,
+     1899, 1899, 1899, 3307, 1899, 3308, 1886, 1899, 3309, 3310,
+     1896, 3311, 3312, 1898, 1901, 1901, 1901, 1903, 1903, 1903,
+     3313, 3314, 1890, 1906, 1906, 1906, 1910, 1910, 1910, 3315,
+     1892, 3316, 1901, 3317, 3318, 1903, 3319, 3320, 1911, 1911,
+     1911, 1906, 1911, 1910, 3326, 1911, 1913, 1913, 1913, 1915,
+     1915, 1915, 1917, 1917, 1917, 1918, 1918, 1918, 1919, 1919,
+     1919, 1920, 1920, 1920, 1913, 3327, 3328, 1915, 1903, 1917,
+     3329, 1906, 1918, 3330, 3331, 1919, 1923, 1923, 1923, 1920,
+     1922, 1922, 1922, 3333, 1924, 1924, 1924, 1925, 1925, 1925,
+
+     1926, 1926, 1926, 3334, 1923, 1928, 1928, 1928, 1922, 1928,
+     1915, 1924, 1928, 3321, 1925, 1934, 1934, 1934, 1926, 3321,
+     1936, 1936, 1936, 1937, 1937, 1937, 3336, 1937, 3337, 3339,
+     1937, 3340, 1919, 1934, 3343, 3344, 1922, 1936, 1920, 1938,
+     1938, 1938, 1939, 1939, 1939, 1940, 1940, 1940, 1941, 1941,
+     1941, 1923, 1941, 3345, 3346, 1941, 3348, 1938, 3350, 3352,
+     1939, 3354, 1940, 3356, 3342, 1926, 1934, 1942, 1942, 1942,
+     1943, 1943, 1943, 1944, 1944, 1944, 3357, 1944, 3342, 3358,
+     1944, 1945, 1945, 1945, 3359, 1942, 3360, 1943, 1951, 1951,
+     1951, 1952, 1952, 1952, 1969, 1969, 1969, 1939, 1938, 1945,
+
+     1970, 1970, 1970, 3361, 3362, 1951, 1972, 1972, 1972, 1952,
+     1974, 1974, 1974, 1975, 1975, 1975, 1980, 1980, 1980, 1982,
+     1982, 1982, 1985, 1985, 1985, 1987, 1987, 1987, 1989, 1989,
+     1989, 1990, 1990, 1990, 1999, 1999, 1999, 1982, 1999, 1945,
+     1985, 1999, 1987, 2002, 2002, 2002, 1989, 3363, 1990, 2003,
+     2003, 2003, 1952, 2008, 2008, 2008, 2009, 2009, 2009, 3365,
+     3367, 2002, 2013, 2013, 2013, 3369, 2003, 3370, 3371, 1982,
+     2014, 2014, 2014, 3372, 2014, 1537, 3373, 2014, 3374, 2013,
+     2017, 2017, 2017, 2020, 2020, 2020, 3397, 1989, 3464, 2002,
+     2021, 2021, 2021, 2022, 2022, 2022, 3385, 2022, 2017, 3464,
+
+     2022, 2020, 2023, 2023, 2023, 1536, 3399, 2021, 2013, 2026,
+     2026, 2026, 3373, 2026, 3374, 3386, 2026, 2029, 2029, 2029,
+     2023, 2030, 2030, 2030, 3411, 2030, 3381, 3397, 2030, 2035,
+     2035, 2035, 3382, 2017, 2029, 2031, 2031, 2031, 3398, 2031,
+     3385, 3399, 2031, 2037, 2037, 2037, 3383, 2035, 3389, 2023,
+     2039, 2039, 2039, 2040, 2040, 2040, 3389, 2040, 3411, 3386,
+     2040, 2041, 2041, 2041, 2042, 2042, 2042, 2039, 2043, 2043,
+     2043, 3384, 2043, 3387, 3381, 2043, 3419, 3387, 2041, 3398,
+     3382, 2042, 2044, 2044, 2044, 2045, 2045, 2045, 2047, 2047,
+     2047, 3390, 2047, 3391, 3383, 2047, 2050, 2050, 2050, 3390,
+
+     2044, 3391, 3392, 2045, 2051, 2051, 2051, 2041, 2051, 3419,
+     3392, 2051, 3395, 2050, 2055, 2055, 2055, 3393, 2055, 3384,
+     1535, 2055, 2058, 2058, 2058, 2059, 2059, 2059, 3394, 2059,
+     3388, 3405, 2059, 1534, 3388, 2044, 2060, 2060, 2060, 2058,
+     2064, 2064, 2064, 2045, 2065, 2065, 2065, 3401, 2065, 3395,
+     3396, 2065, 3403, 2060, 2068, 2068, 2068, 2064, 2069, 2069,
+     2069, 3400, 2069, 3405, 3393, 2069, 2072, 2072, 2072, 2073,
+     2073, 2073, 2068, 2073, 3412, 3394, 2073, 2074, 2074, 2074,
+     2075, 2075, 2075, 2072, 2076, 2076, 2076, 3396, 2076, 3403,
+     3431, 2076, 3407, 3401, 2074, 1533, 3400, 2075, 2077, 2077,
+
+     2077, 3407, 2079, 2079, 2079, 2068, 2079, 1532, 3412, 2079,
+     2082, 2082, 2082, 2083, 2083, 2083, 2077, 2083, 1531, 3431,
+     2083, 2085, 2085, 2085, 3402, 2085, 3425, 2082, 2085, 2089,
+     2089, 2089, 2092, 2092, 2092, 2094, 2094, 2094, 2095, 2095,
+     2095, 2097, 2097, 2097, 2099, 2099, 2099, 2089, 2099, 2077,
+     2092, 2099, 2094, 2103, 2103, 2103, 2095, 3404, 2097, 2106,
+     2106, 2106, 2108, 2108, 2108, 2109, 2109, 2109, 3425, 2109,
+     3402, 2103, 2109, 2110, 2110, 2110, 3413, 2106, 3409, 2108,
+     3408, 2111, 2111, 2111, 3406, 2111, 3415, 2097, 2111, 3408,
+     2110, 2113, 2113, 2113, 3404, 3410, 2092, 1529, 3417, 2095,
+
+     2115, 2115, 2115, 2116, 2116, 2116, 2117, 2117, 2117, 2113,
+     2118, 2118, 2118, 3409, 2118, 3420, 3406, 2118, 2115, 3413,
+     3418, 2116, 3426, 2117, 2119, 2119, 2119, 2120, 2120, 2120,
+     3410, 2120, 3415, 3417, 2120, 2121, 2121, 2121, 2126, 2126,
+     2126, 2119, 3414, 2128, 2128, 2128, 3416, 2128, 3420, 2115,
+     2128, 1528, 1527, 2121, 3432, 3418, 2126, 2113, 2131, 2131,
+     2131, 2132, 2132, 2132, 3426, 2133, 2133, 2133, 2116, 2133,
+     3423, 3424, 2133, 2136, 2136, 2136, 2131, 3421, 1526, 2132,
+     2138, 2138, 2138, 3432, 2138, 3414, 3421, 2138, 2141, 2141,
+     2141, 2136, 3416, 2146, 2146, 2146, 3422, 2147, 2147, 2147,
+
+     2121, 2147, 1517, 2126, 2147, 3422, 2141, 3423, 3424, 2131,
+     2146, 2148, 2148, 2148, 2132, 2149, 2149, 2149, 2154, 2154,
+     2154, 2155, 2155, 2155, 2156, 2156, 2156, 1509, 3427, 2148,
+     2158, 2158, 2158, 1494, 2141, 2163, 2163, 2163, 2164, 2164,
+     2164, 2165, 2165, 2165, 2166, 2166, 2166, 2168, 2168, 2168,
+     2169, 2169, 2169, 2170, 2170, 2170, 2171, 2171, 2171, 2172,
+     2172, 2172, 2173, 2173, 2173, 2175, 2175, 2175, 2178, 2178,
+     2178, 2181, 2181, 2181, 3427, 2148, 3428, 2182, 2182, 2182,
+     3433, 2182, 3437, 2175, 2182, 1493, 2178, 1488, 2181, 3433,
+     2166, 2184, 2184, 2184, 2185, 2185, 2185, 2186, 2186, 2186,
+
+     1487, 2186, 1486, 1484, 2186, 2197, 2197, 2197, 3429, 2184,
+     3435, 2185, 2198, 2198, 2198, 3438, 2175, 2199, 2199, 2199,
+     3441, 2199, 3428, 2197, 2199, 2200, 2200, 2200, 3437, 2198,
+     2205, 2205, 2205, 2206, 2206, 2206, 2207, 2207, 2207, 2208,
+     2208, 2208, 3436, 2208, 3435, 3429, 2208, 2210, 2210, 2210,
+     2213, 2213, 2213, 2207, 2197, 2215, 2215, 2215, 3430, 2215,
+     1477, 3438, 2215, 3434, 1476, 2210, 3443, 3441, 2213, 2218,
+     2218, 2218, 3434, 2221, 2221, 2221, 3436, 2221, 3439, 2206,
+     2221, 2228, 2228, 2228, 3447, 2228, 3439, 2218, 2228, 2231,
+     2231, 2231, 2232, 2232, 2232, 3430, 2232, 3440, 2210, 2232,
+
+     2234, 2234, 2234, 3443, 2234, 3440, 2231, 2234, 2237, 2237,
+     2237, 2238, 2238, 2238, 2240, 2240, 2240, 3442, 2240, 3447,
+     3445, 2240, 2218, 2246, 2246, 2246, 2237, 2246, 3444, 2238,
+     2246, 2249, 2249, 2249, 2250, 2250, 2250, 3446, 2250, 1458,
+     3448, 2250, 2254, 2254, 2254, 3453, 2254, 1453, 2249, 2254,
+     2258, 2258, 2258, 2259, 2259, 2259, 2260, 2260, 2260, 2237,
+     2260, 3445, 3451, 2260, 3442, 3444, 2238, 2258, 2263, 2263,
+     2263, 2259, 2264, 2264, 2264, 3448, 2264, 3453, 3446, 2264,
+     2265, 2265, 2265, 3454, 2265, 2263, 3449, 2265, 2268, 2268,
+     2268, 2270, 2270, 2270, 3450, 2270, 3452, 1450, 2270, 3451,
+
+     2276, 2276, 2276, 2278, 2278, 2278, 2268, 2279, 2279, 2279,
+     3455, 2279, 3459, 3457, 2279, 3454, 3458, 2259, 2276, 3455,
+     2278, 2280, 2280, 2280, 2282, 2282, 2282, 2283, 2283, 2283,
+     3460, 2283, 3449, 3452, 2283, 2290, 2290, 2290, 3456, 2280,
+     3450, 2282, 2293, 2293, 2293, 3457, 2293, 3456, 3458, 2293,
+     2300, 2300, 2300, 2290, 2268, 2296, 2296, 2296, 3461, 2296,
+     3459, 3463, 2296, 3462, 2302, 2302, 2302, 1449, 2300, 2303,
+     2303, 2303, 2304, 2304, 2304, 3463, 2304, 1446, 3460, 2304,
+     1441, 2280, 2302, 1432, 2307, 2307, 2307, 2303, 2307, 1431,
+     3461, 2307, 2310, 2310, 2310, 3462, 2311, 2311, 2311, 1430,
+
+     1426, 2300, 2312, 2312, 2312, 2303, 2313, 2313, 2313, 1421,
+     2310, 1417, 2310, 2311, 2314, 2314, 2314, 1409, 1404, 2312,
+     2315, 2315, 2315, 2313, 2317, 2317, 2317, 2318, 2318, 2318,
+     2302, 2314, 2319, 2319, 2319, 2323, 2323, 2323, 2315, 2320,
+     2320, 2320, 2317, 1403, 1397, 2318, 1396, 2324, 2324, 2324,
+     2319, 2324, 1395, 2312, 2324, 1394, 1389, 2320, 2327, 2327,
+     2327, 2328, 2328, 2328, 2329, 2329, 2329, 2330, 2330, 2330,
+     2313, 1388, 1387, 2314, 1386, 1372, 2327, 2333, 2333, 2333,
+     2334, 2334, 2334, 1371, 2317, 2315, 2336, 2336, 2336, 2337,
+     2337, 2337, 1370, 1369, 2319, 2339, 2339, 2339, 2340, 2340,
+
+     2340, 2341, 2341, 2341, 2342, 2342, 2342, 2345, 2345, 2345,
+     2346, 2346, 2346, 2347, 2347, 2347, 1368, 2327, 2348, 2348,
+     2348, 2350, 2350, 2350, 2353, 2353, 2353, 2354, 2354, 2354,
+     1367, 2354, 1366, 1365, 2354, 2357, 2357, 2357, 1364, 2350,
+     1354, 2353, 2358, 2358, 2358, 1353, 2360, 2360, 2360, 1352,
+     2360, 1351, 2357, 2360, 2373, 2373, 2373, 2374, 2374, 2374,
+     2358, 2374, 2375, 2375, 2374, 2375, 2376, 2376, 1330, 2376,
+     1326, 1325, 2373, 2375, 2377, 2377, 2377, 2376, 1324, 1323,
+     2375, 2378, 2378, 2378, 2376, 2382, 2382, 2382, 2384, 2384,
+     2384, 1318, 2384, 1317, 1316, 2384, 2388, 2388, 2388, 1311,
+
+     1310, 2357, 2390, 2390, 2390, 2391, 2391, 2391, 2399, 2399,
+     2399, 2404, 2404, 2404, 2388, 2373, 2405, 2405, 2405, 2390,
+     2400, 2400, 2400, 2391, 2400, 1297, 1291, 2400, 1287, 2404,
+     1286, 2410, 2410, 2410, 2405, 2410, 1285, 1284, 2410, 2447,
+     2447, 2447, 2388, 2413, 2413, 2413, 2417, 2417, 2417, 1283,
+     2418, 2418, 2418, 1282, 2418, 1281, 2391, 2418, 1279, 1278,
+     2413, 1276, 1275, 2417, 2419, 2419, 2419, 2420, 2420, 2420,
+     1274, 2420, 1269, 1261, 2420, 1259, 2405, 2423, 2423, 2423,
+     1254, 1252, 2419, 2428, 2428, 2428, 2430, 2430, 2430, 2431,
+     2431, 2431, 1243, 2431, 1238, 2423, 2431, 2434, 2434, 2434,
+
+     1227, 2428, 1225, 2430, 2435, 2435, 2435, 2436, 2436, 2436,
+     1224, 2436, 1223, 1222, 2436, 2434, 2439, 2439, 2439, 1220,
+     1219, 2435, 2440, 2440, 2440, 2445, 2445, 2445, 2449, 2449,
+     2449, 1218, 1217, 2439, 2450, 2450, 2450, 1216, 1215, 2440,
+     1213, 1212, 2445, 2451, 2451, 2451, 2449, 1211, 2434, 1210,
+     2435, 2450, 2452, 2452, 2452, 2453, 2453, 2453, 2454, 2454,
+     2454, 2451, 2455, 2455, 2455, 1209, 2455, 1208, 1207, 2455,
+     2452, 2439, 1206, 2453, 1204, 2454, 2445, 2456, 2456, 2456,
+     2457, 2457, 2457, 2440, 2458, 2458, 2458, 2459, 2459, 2459,
+     1203, 1202, 2453, 1201, 2456, 1200, 1199, 2457, 2460, 2460,
+
+     2460, 2458, 1198, 2451, 1192, 2459, 2461, 2461, 2461, 2462,
+     2462, 2462, 1191, 2452, 2464, 2464, 2464, 1190, 2465, 2465,
+     2465, 2468, 2468, 2468, 2461, 1187, 1186, 2462, 2469, 2469,
+     2469, 2457, 2464, 1185, 1183, 2458, 2465, 2470, 2470, 2470,
+     2471, 2471, 2471, 2474, 2474, 2474, 2469, 2475, 2475, 2475,
+     2477, 2477, 2477, 2478, 2478, 2478, 2482, 2482, 2482, 2485,
+     2485, 2485, 2486, 2486, 2486, 1179, 2486, 1176, 1171, 2486,
+     1162, 1161, 2461, 1158, 2482, 1157, 2485, 1156, 2464, 1155,
+     2465, 2498, 2498, 2498, 2509, 2509, 2509, 2512, 2512, 2512,
+     2515, 2515, 2515, 2517, 2517, 2517, 2518, 2518, 2518, 2498,
+
+     2518, 1154, 1140, 2518, 2519, 2519, 2519, 1133, 2515, 1125,
+     2517, 2526, 2526, 2526, 2527, 2527, 2527, 2529, 2529, 2529,
+     1124, 1123, 2519, 1120, 2531, 2531, 2531, 1117, 2526, 2537,
+     2537, 2537, 2538, 2538, 2538, 2529, 2538, 1114, 1109, 2538,
+     1106, 2498, 2531, 2540, 2540, 2540, 2537, 2542, 2542, 2542,
+     1105, 2542, 1101, 1099, 2542, 1085, 2515, 2545, 2545, 2545,
+     2540, 2547, 2547, 2547, 1084, 2551, 2551, 2551, 2553, 2553,
+     2553, 2555, 2555, 2555, 1083, 2545, 2554, 2554, 2554, 2547,
+     2554, 2531, 2551, 2554, 1082, 2553, 2556, 2556, 2556, 2555,
+     2557, 2557, 2557, 1081, 2557, 1080, 1079, 2557, 2565, 2565,
+
+     2565, 1078, 1077, 2556, 2567, 2567, 2567, 2569, 2569, 2569,
+     2571, 2571, 2571, 1076, 1072, 2565, 2572, 2572, 2572, 1068,
+     2572, 1061, 1058, 2572, 1055, 2569, 1052, 2571, 2573, 2573,
+     2573, 2574, 2574, 2574, 1051, 2575, 2575, 2575, 2576, 2576,
+     2576, 1050, 2576, 1046, 1045, 2576, 2573, 1044, 1041, 2574,
+     2579, 2579, 2579, 2575, 2580, 2580, 2580, 1040, 2580, 1039,
+     1036, 2580, 2581, 2581, 2581, 1035, 1032, 2579, 2582, 2582,
+     2582, 2583, 2583, 2583, 2585, 2585, 2585, 1031, 1027, 2581,
+     1026, 1023, 2586, 2586, 2586, 2582, 2587, 2587, 2587, 2583,
+     2591, 2591, 2591, 2595, 2595, 2595, 1022, 1021, 2574, 2575,
+
+     2586, 2596, 2596, 2596, 2587, 2600, 2600, 2600, 2591, 2601,
+     2601, 2601, 1020, 2601, 1019, 1017, 2601, 2615, 2615, 2615,
+     1016, 1015, 2600, 2630, 2630, 2630, 2633, 2633, 2633, 2634,
+     2634, 2634, 2635, 2635, 2635, 2615, 2635, 1014, 1013, 2635,
+     2638, 2638, 2638, 1012, 2633, 1011, 1010, 2587, 2641, 2641,
+     2641, 2644, 2644, 2644, 1006, 2645, 2645, 2645, 2638, 2645,
+     1001, 1000, 2645,  999,  996, 2641,  995,  994, 2644, 2647,
+     2647, 2647, 2651, 2651, 2651,  992,  988, 2615, 2653, 2653,
+     2653,  984, 2653,  983,  980, 2653,  977, 2647,  976, 2651,
+     2657, 2657, 2657,  975, 2658, 2658, 2658, 2633, 2658,  974,
+
+      973, 2658, 2665, 2665, 2665,  972,  971, 2657, 2666, 2666,
+     2666, 2667, 2667, 2667,  969, 2667,  968,  967, 2667, 2665,
+     2668, 2668, 2668,  966,  965, 2666, 2669, 2669, 2669,  964,
+     2669,  963,  962, 2669, 2672, 2672, 2672, 2668, 2674, 2674,
+     2674,  961, 2674,  960,  958, 2674, 2682, 2682, 2682, 2683,
+     2683, 2683, 2672, 2683,  957,  956, 2683, 2684, 2684, 2684,
+     2685, 2685, 2685, 2682, 2686, 2686, 2686,  955, 2686,  954,
+      953, 2686,  952,  951, 2684,  950,  949, 2685, 2689, 2689,
+     2689, 2691, 2691, 2691, 2692, 2692, 2692, 2693, 2693, 2693,
+      945, 2693,  944,  942, 2693,  941, 2689,  940,  939, 2691,
+
+      938,  934, 2692, 2696, 2696, 2696, 2697, 2697, 2697,  932,
+     2697,  931,  930, 2697, 2698, 2698, 2698, 2699, 2699, 2699,
+     2696, 2699,  929,  925, 2699, 2700, 2700, 2700, 2702, 2702,
+     2702, 2698, 2707, 2707, 2707, 2708, 2708, 2708, 2712, 2712,
+     2712,  924,  920, 2700,  916, 2692, 2702, 2691,  915, 2713,
+     2713, 2713,  912, 2713,  911, 2712, 2713, 2731, 2731, 2731,
+     2745, 2745, 2745, 2747, 2747, 2747, 2748, 2748, 2748, 2749,
+     2749, 2749, 2750, 2750, 2750, 2731, 2751, 2751, 2751,  910,
+     2747, 2752, 2752, 2752, 2748, 2752,  909,  908, 2752, 2750,
+     2702,  907,  906, 2751, 2753, 2753, 2753,  903, 2753,  902,
+
+      901, 2753, 2756, 2756, 2756, 2757, 2757, 2757, 2731, 2761,
+     2761, 2761, 2762, 2762, 2762, 2764, 2764, 2764, 2750, 2756,
+     2763, 2763, 2763, 2757, 2763,  900, 2761, 2763, 2748, 2762,
+      897,  896, 2764, 2766, 2766, 2766,  895, 2766,  892,  890,
+     2766, 2775, 2775, 2775, 2776, 2776, 2776,  887, 2776,  886,
+      885, 2776, 2777, 2777, 2777,  884, 2777,  883, 2775, 2777,
+     2780, 2780, 2780, 2781, 2781, 2781,  880, 2781,  879,  878,
+     2781, 2783, 2783, 2783, 2785, 2785, 2785, 2780, 2785,  877,
+      876, 2785, 2788, 2788, 2788, 2789, 2789, 2789, 2783, 2789,
+      873,  872, 2789, 2790, 2790, 2790, 2791, 2791, 2791, 2788,
+
+     2791,  871,  870, 2791, 2798, 2798, 2798, 2799, 2799, 2799,
+     2790, 2800, 2800, 2800,  868, 2800,  865,  864, 2800, 2803,
+     2803, 2803, 2798, 2803,  862, 2799, 2803, 2806, 2806, 2806,
+     2809, 2809, 2809, 2811, 2811, 2811, 2812, 2812, 2812, 2815,
+     2815, 2815,  859, 2815,  857, 2806, 2815, 2809, 2809, 2826,
+     2826, 2826, 2835, 2835, 2835, 2798, 2849, 2849, 2849, 2850,
+     2850, 2850, 2851, 2851, 2851,  854, 2826, 2853, 2853, 2853,
+     2835, 2852, 2852, 2852, 2799, 2852,  853,  852, 2852, 2851,
+     2854, 2854, 2854,  851,  849, 2853, 2855, 2855, 2855,  848,
+     2855,  847,  844, 2855, 2860, 2860, 2860, 2854, 2857, 2857,
+
+     2857, 2835, 2857,  843,  842, 2857, 2861, 2861, 2861,  841,
+     2861, 2860,  840, 2861, 2864, 2864, 2864,  839, 2853, 2865,
+     2865, 2865,  834, 2865,  833,  832, 2865,  831, 2866, 2866,
+     2866, 2864, 2866,  830,  829, 2866, 2869, 2869, 2869, 2870,
+     2870, 2870,  828, 2870,  827,  826, 2870, 2878, 2878, 2878,
+      825, 2878,  824, 2869, 2878, 2881, 2881, 2881,  823, 2881,
+      821,  819, 2881, 2885, 2885, 2885, 2886, 2886, 2886,  818,
+     2886,  815,  812, 2886, 2888, 2888, 2888,  809, 2888,  808,
+     2885, 2888, 2891, 2891, 2891,  805, 2891,  804,  802, 2891,
+     2900, 2900, 2900, 2901, 2901, 2901, 2906, 2906, 2906, 2909,
+
+     2909, 2909, 2910, 2910, 2910, 2911, 2911, 2911, 2900, 2911,
+      801, 2901, 2911,  797, 2906,  796, 2909, 2909,  795, 2910,
+     2910,  794,  791, 2911, 2912, 2912, 2912, 2913, 2913, 2913,
+     2914, 2914, 2914, 2915, 2915, 2915, 2924, 2924, 2924, 2925,
+     2925, 2925,  788, 2925,  787,  786, 2925, 2934, 2934, 2934,
+     2947, 2947, 2947, 2924, 2948, 2948, 2948,  783,  782, 2901,
+     2949, 2949, 2949,  781, 2949, 2934,  777, 2949, 2952, 2952,
+     2952, 2953, 2953, 2953,  776, 2953,  775,  773, 2953,  762,
+     2957, 2957, 2957,  760, 2957,  757, 2952, 2957, 2962, 2962,
+     2962,  756, 2962,  755,  753, 2962, 2965, 2965, 2965,  752,
+
+     2965,  751,  747, 2965, 2968, 2968, 2968, 2975, 2975, 2975,
+     2976, 2976, 2976, 2934, 2976,  746,  745, 2976, 2979, 2979,
+     2979, 2968,  744,  741, 2975, 2994, 2994, 2994, 2996, 2996,
+     2996, 3002, 3002, 3002,  740, 2979,  739, 3003, 3003, 3003,
+      738, 3003,  737, 2994, 3003,  736, 2996,  735, 3002, 3002,
+     3004, 3004, 3004,  733, 3004, 3003,  730, 3004, 3007, 3007,
+     3007, 3008, 3008, 3008, 3009, 3009, 3009,  729, 3004, 3018,
+     3018, 3018,  727, 3018,  725,  722, 3018,  721,  715, 2996,
+     3005, 3005, 3005, 3005, 3005, 3005, 3005, 3005, 3005,  713,
+      711, 3005, 3027, 3027, 3027,  708, 3005, 3005, 3005, 3005,
+
+     3005, 3036, 3036, 3036, 3037, 3037, 3037, 3042, 3042, 3042,
+     3027, 3043, 3043, 3043,  707, 3043,  703,  702, 3043, 3044,
+     3044, 3044, 3037,  701, 3042, 3005, 3005, 3006, 3006, 3006,
+     3006, 3006, 3006, 3006, 3006, 3006, 3044,  700, 3006, 3050,
+     3050, 3050,  697, 3006, 3006, 3006, 3006, 3006, 3051, 3051,
+     3051,  696, 3051,  695,  694, 3051, 3050, 3052, 3052, 3052,
+     3053, 3053, 3053,  691, 3053,  690,  689, 3053, 3066, 3066,
+     3066,  688, 3006, 3006, 3052, 3072, 3072, 3072,  687, 3072,
+      681,  680, 3072,  678,  672,  671, 3066,  667, 3091, 3091,
+     3091,  661,  660, 3072, 3075, 3075, 3075, 3075, 3075, 3075,
+
+     3075, 3075, 3075,  656,  649, 3075, 3091, 3105, 3105, 3105,
+     3075, 3075, 3075, 3075, 3075, 3102, 3102, 3102,  645, 3102,
+      639,  635, 3102,  627, 3105, 3106, 3106, 3106,  626, 3106,
+      625,  624, 3106, 3128, 3128, 3128, 3140, 3140, 3140, 3075,
+     3075, 3076, 3076, 3076, 3076, 3076, 3076, 3076, 3076, 3076,
+      623, 3128, 3076,  619, 3140, 3140,  612, 3076, 3076, 3076,
+     3076, 3076, 3110, 3110, 3110,  611, 3110,  610,  606, 3110,
+     3113, 3113, 3113,  599, 3113,  598,  594, 3113, 3157, 3157,
+     3157, 3158, 3158, 3158,  588,  587, 3076, 3076, 3159, 3159,
+     3159,  583, 3164, 3164, 3164, 3157, 3164,  575, 3158, 3164,
+
+     3167, 3167, 3167,  574,  570, 3159, 3178, 3178, 3178, 3182,
+     3182, 3182, 3193, 3193, 3193,  561,  557, 3167, 3194, 3194,
+     3194,  549, 3194,  548, 3178, 3194,  547, 3182,  543, 3193,
+     3195, 3195, 3195, 3196, 3196, 3196,  537, 3196,  536,  535,
+     3196, 3197, 3197, 3197, 3198, 3198, 3198, 3195, 3198,  531,
+      525, 3198, 3205, 3205, 3205, 3206, 3206, 3206, 3197, 3206,
+     3182,  524, 3206, 3215, 3215, 3215, 3225, 3225, 3225, 3205,
+     3225,  520,  514, 3225,  513, 3228, 3228, 3228,  512, 3228,
+      511, 3215, 3228, 3231, 3231, 3231,  510, 3231,  509,  508,
+     3231, 3240, 3240, 3240,  504, 3240,  498,  497, 3240,  495,
+
+     3215, 3355, 3355, 3355, 3364, 3364, 3364,  494, 3364,  493,
+      489, 3364, 3465, 3465, 3465, 3466, 3466, 3466,  482, 3355,
+      477,  476, 3364,  474,  470,  464,  463,  462,  458,  452,
+     3465,  448,  441, 3466, 3469, 3469, 3469, 3469, 3469, 3469,
+     3469, 3469, 3469, 3470, 3470, 3470, 3470, 3470, 3470, 3470,
+     3470, 3470, 3471, 3471, 3471, 3471, 3471, 3471, 3471, 3471,
+     3471, 3472, 3472, 3472, 3472, 3472, 3472, 3472, 3472, 3472,
+     3473, 3473, 3473, 3473, 3473, 3473, 3473, 3473, 3473, 3474,
+     3474, 3474, 3474, 3474, 3474, 3474, 3474, 3474, 3475, 3475,
+     3475, 3475, 3475, 3475, 3475, 3475, 3475, 3476, 3476, 3476,
+
+     3476, 3476, 3476, 3476, 3476, 3476, 3477, 3477, 3477, 3477,
+     3477, 3477, 3477, 3477, 3477, 3478, 3478, 3478, 3478, 3478,
+     3478, 3478, 3478, 3478, 3479, 3479, 3479, 3479, 3479, 3479,
+     3479, 3479, 3479, 3480, 3480, 3480, 3480, 3480, 3480, 3480,
+     3480, 3480, 3481, 3481, 3481, 3481, 3481, 3481, 3481, 3481,
+     3481, 3482, 3482, 3482, 3482, 3482, 3482, 3482, 3482, 3482,
+     3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3484,
+     3484, 3484, 3484, 3484, 3484, 3484, 3484, 3484, 3485, 3485,
+     3485, 3485, 3485, 3485, 3485, 3485, 3485, 3486, 3486, 3486,
+     3486, 3486, 3486, 3486, 3486, 3486, 3487, 3487, 3487, 3487,
+
+     3487, 3487, 3487, 3487, 3487, 3488, 3488, 3488, 3488, 3488,
+     3488, 3488, 3488, 3488, 3489, 3489, 3489, 3489, 3489, 3489,
+     3489, 3489, 3489, 3490, 3490, 3490, 3490, 3490, 3490, 3490,
+     3490, 3490, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3492, 3492, 3492, 3492, 3492, 3492, 3492, 3492, 3492,
+     3493, 3493, 3493, 3493, 3493, 3493, 3493, 3493, 3493, 3494,
+     3494, 3494, 3494, 3494, 3494, 3494, 3494, 3494, 3495, 3495,
+     3495, 3495, 3495, 3495, 3495, 3495, 3495, 3496, 3496, 3496,
+     3496, 3496, 3496, 3496, 3496, 3496, 3497, 3497, 3497, 3497,
+     3497, 3497, 3497, 3497, 3497, 3498, 3498, 3498, 3498, 3498,
+
+     3498, 3498, 3498, 3498, 3499, 3499, 3499, 3499, 3499, 3499,
+     3499, 3499, 3499, 3500, 3500, 3500, 3500, 3500, 3500, 3500,
+     3500, 3500, 3501, 3501, 3501, 3501, 3501, 3501, 3501, 3501,
+     3501, 3502, 3502, 3502, 3502, 3502, 3502, 3502, 3502, 3502,
+     3503, 3503, 3503, 3503, 3503, 3503, 3503, 3503, 3503, 3504,
+     3504, 3504, 3504, 3504, 3504, 3504, 3504, 3504, 3505, 3505,
+     3505, 3505, 3505, 3505, 3505, 3505, 3505, 3506, 3506, 3506,
+     3506, 3506, 3506, 3506, 3506, 3506, 3507, 3507, 3507, 3507,
+     3507, 3507, 3507, 3507, 3507, 3508, 3508, 3508, 3508, 3508,
+     3508, 3508, 3508, 3508, 3509, 3509, 3509, 3509, 3509, 3509,
+
+     3509, 3509, 3509, 3510, 3510, 3510, 3510, 3510, 3510, 3510,
+     3510, 3510, 3511, 3511, 3511, 3511, 3511, 3511, 3511, 3511,
+     3511, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512,
+     3513, 3513, 3513, 3513, 3513, 3513, 3513, 3513, 3513, 3514,
+     3514, 3514, 3514, 3514, 3514, 3514, 3514, 3514, 3515, 3515,
+     3515, 3515, 3515, 3515, 3515, 3515, 3515, 3516, 3516, 3516,
+     3516, 3516, 3516, 3516, 3516, 3516, 3517, 3517, 3517, 3517,
+     3517, 3517, 3517, 3517, 3517, 3518, 3518, 3518, 3518, 3518,
+     3518, 3518, 3518, 3518, 3519, 3519, 3519, 3519, 3519, 3519,
+     3519, 3519, 3519, 3520, 3520, 3520, 3520, 3520, 3520, 3520,
+
+     3520, 3520, 3521, 3521, 3521, 3521, 3521, 3521, 3521, 3521,
+     3521, 3522, 3522, 3522, 3522, 3522, 3522, 3522, 3522, 3522,
+     3523, 3523, 3523, 3523, 3523, 3523, 3523, 3523, 3523, 3524,
+     3524, 3524, 3524, 3524, 3524, 3524, 3524, 3524, 3525, 3525,
+     3525, 3525, 3525, 3525, 3525, 3525, 3525, 3526, 3526, 3526,
+     3526, 3526, 3526, 3526, 3526, 3526, 3527, 3527, 3527, 3527,
+     3527, 3527, 3527, 3527, 3527, 3528, 3528, 3528, 3528, 3528,
+     3528, 3528, 3528, 3528, 3529, 3529, 3529, 3529, 3529, 3529,
+     3529, 3529, 3529, 3530, 3530, 3530, 3530, 3530, 3530, 3530,
+     3530, 3530, 3531, 3531, 3531, 3531, 3531, 3531, 3531, 3531,
+
+     3531, 3532, 3532, 3532,  440,  439,  438, 3532, 3533, 3533,
+     3533,  434,  430,  426, 3533, 3534, 3534, 3534,  424,  423,
+      422, 3534, 3535, 3535, 3535,  418,  412,  411, 3535, 3536,
+     3536, 3536,  407,  401,  400, 3536, 3537, 3537, 3537,  396,
+      388,  387, 3537, 3538, 3538, 3538,  386,  385,  381, 3538,
+     3539, 3539, 3539,  372,  366,  362, 3539, 3540, 3540, 3540,
+      361,  357,  351, 3540, 3541, 3541, 3541,  350,  349,  345,
+     3541, 3542, 3542, 3542,  338,  336,  335, 3542, 3543, 3543,
+     3543,  331,  328,  326, 3543, 3544, 3544, 3544,  325,  324,
+      320, 3544, 3545, 3545, 3545,  316,  313,  309, 3545, 3546,
+
+     3546, 3546,  306,  305,  297, 3546, 3547, 3547, 3547,  293,
+      289,  288, 3547, 3548, 3548, 3548,  287,  281,  280, 3548,
+     3549, 3549, 3549,  278,  275,  263, 3549, 3550, 3550, 3550,
+        0,    0,    0, 3550, 3551, 3551, 3551,    0,    0,    0,
+     3551, 3552, 3552, 3552,    0,    0,    0, 3552, 3553, 3553,
+     3553,    0,    0,    0, 3553, 3554, 3554, 3554,    0,    0,
         0, 3554, 3555, 3555, 3555,    0,    0,    0, 3555, 3556,
-
-        0,    0,    0, 3556, 3557, 3557, 3557,    0,    0,    0,
-     3557, 3558,    0,    0,    0, 3558, 3559, 3559, 3559,    0,
-        0,    0, 3559, 3560,    0,    0,    0, 3560, 3561, 3561,
-     3561,    0,    0,    0, 3561, 3562,    0,    0,    0, 3562,
-     3563, 3563, 3563,    0,    0,    0, 3563, 3564,    0,    0,
-        0, 3564, 3565, 3565, 3565,    0,    0,    0, 3565, 3566,
-        0,    0,    0, 3566, 3567, 3567, 3567,    0,    0,    0,
-     3567, 3568,    0,    0,    0, 3568, 3569, 3569, 3569,    0,
-        0,    0, 3569, 3570,    0,    0,    0, 3570, 3571, 3571,
-     3571,    0,    0,    0, 3571, 3572,    0,    0,    0, 3572,
-
-     3573, 3573, 3573,    0,    0,    0, 3573, 3574,    0,    0,
-        0, 3574, 3575, 3575, 3575,    0,    0,    0, 3575, 3576,
-        0,    0,    0, 3576, 3577, 3577, 3577,    0,    0,    0,
-     3577, 3578,    0,    0,    0, 3578, 3579, 3579, 3579,    0,
-        0,    0, 3579, 3580,    0,    0,    0, 3580, 3581, 3581,
-     3581,    0,    0,    0, 3581, 3582,    0,    0,    0, 3582,
-     3583, 3583, 3583,    0,    0,    0, 3583, 3584,    0,    0,
-        0, 3584, 3585, 3585, 3585,    0,    0,    0, 3585, 3586,
-        0,    0,    0, 3586, 3587, 3587, 3587,    0,    0,    0,
-     3587, 3588,    0,    0,    0, 3588, 3589, 3589, 3589,    0,
-
-        0,    0, 3589, 3590,    0,    0,    0, 3590, 3591, 3591,
-     3591,    0,    0,    0, 3591, 3592,    0,    0,    0, 3592,
-     3593, 3593, 3593,    0,    0,    0, 3593, 3594,    0,    0,
-        0, 3594, 3595, 3595, 3595,    0,    0,    0, 3595, 3596,
-        0,    0,    0, 3596, 3597, 3597, 3597,    0,    0,    0,
-     3597, 3598,    0,    0,    0, 3598, 3599, 3599, 3599,    0,
-        0,    0, 3599, 3600,    0,    0,    0, 3600, 3601, 3601,
-     3601,    0,    0,    0, 3601, 3602,    0,    0,    0, 3602,
-     3603, 3603, 3603,    0,    0,    0, 3603, 3604,    0,    0,
-        0, 3604, 3605, 3605, 3605,    0,    0,    0, 3605, 3606,
-
-        0,    0,    0, 3606, 3607, 3607, 3607,    0,    0,    0,
-     3607, 3608,    0,    0,    0, 3608, 3609, 3609, 3609, 3609,
-     3609, 3609, 3609, 3609, 3609, 3610,    0,    0,    0,    0,
-     3610, 3611, 3611, 3611,    0,    0,    0, 3611, 3612, 3612,
-     3612, 3612,    0,    0, 3612, 3612, 3613, 3613, 3613,    0,
-        0,    0, 3613, 3614, 3614, 3614, 3614,    0,    0, 3614,
-     3614, 3615, 3615, 3615,    0,    0,    0, 3615, 3616, 3616,
-     3616, 3616,    0,    0, 3616, 3616, 3617, 3617, 3617,    0,
-        0,    0, 3617, 3618, 3618, 3618, 3618,    0,    0, 3618,
-     3618, 3619, 3619, 3619,    0,    0,    0, 3619, 3620, 3620,
-
-     3620, 3620,    0,    0, 3620, 3620, 3621, 3621, 3621,    0,
-        0,    0, 3621, 3622, 3622, 3622, 3622,    0,    0, 3622,
-     3622, 3623, 3623, 3623,    0,    0,    0, 3623, 3624, 3624,
-     3624, 3624,    0,    0, 3624, 3624, 3625, 3625, 3625,    0,
-        0,    0, 3625, 3626, 3626, 3626, 3626,    0,    0, 3626,
-     3626, 3627, 3627, 3627,    0,    0,    0, 3627, 3628, 3628,
-     3628, 3628,    0,    0, 3628, 3628, 3629, 3629, 3629,    0,
-        0,    0, 3629, 3630, 3630, 3630, 3630,    0,    0, 3630,
-     3630, 3631, 3631, 3631,    0,    0,    0, 3631, 3632, 3632,
-     3632, 3632,    0,    0, 3632, 3632, 3633, 3633, 3633,    0,
-
-        0,    0, 3633, 3634, 3634, 3634, 3634,    0,    0, 3634,
-     3634, 3635, 3635, 3635,    0,    0,    0, 3635, 3636, 3636,
-     3636, 3636,    0,    0, 3636, 3636, 3637, 3637, 3637,    0,
-        0,    0, 3637, 3638, 3638, 3638, 3638,    0,    0, 3638,
-     3638, 3639, 3639, 3639, 3639,    0, 3639,    0, 3639, 3640,
-     3640, 3640, 3640,    0,    0, 3640, 3640, 3641, 3641, 3641,
-        0,    0,    0, 3641, 3642, 3642, 3642, 3642,    0,    0,
-     3642, 3642, 3643, 3643, 3643,    0,    0,    0, 3643, 3644,
-     3644, 3644, 3644,    0,    0, 3644, 3644, 3645, 3645, 3645,
-        0,    0,    0, 3645, 3646, 3646, 3646, 3646,    0,    0,
-
-     3646, 3646, 3647, 3647, 3647,    0,    0,    0, 3647, 3648,
-     3648, 3648, 3648,    0,    0, 3648, 3648, 3649, 3649, 3649,
-     3649,    0, 3649,    0, 3649, 3650, 3650, 3650, 3650,    0,
-        0, 3650, 3650, 3651, 3651, 3651, 3651,    0, 3651,    0,
-     3651, 3652, 3652, 3652, 3652,    0,    0, 3652, 3652, 3653,
-     3653, 3653,    0,    0,    0, 3653, 3654, 3654, 3654, 3654,
-        0,    0, 3654, 3654, 3655, 3655, 3655, 3655,    0, 3655,
-        0, 3655, 3656, 3656, 3656, 3656,    0,    0, 3656, 3656,
-     3657, 3657, 3657, 3657,    0, 3657,    0, 3657, 3658, 3658,
-     3658, 3658,    0,    0, 3658, 3658, 3659, 3659, 3659,    0,
-
-        0,    0, 3659, 3660, 3660, 3660, 3660,    0,    0, 3660,
-     3660, 3661, 3661, 3661,    0,    0,    0, 3661, 3662, 3662,
-     3662, 3662,    0,    0, 3662, 3662, 3663, 3663, 3663, 3663,
+     3556, 3556,    0,    0,    0, 3556, 3557, 3557, 3557,    0,
+        0,    0, 3557, 3558, 3558, 3558,    0,    0,    0, 3558,
+     3559, 3559, 3559,    0,    0,    0, 3559, 3560, 3560, 3560,
+
+        0,    0,    0, 3560, 3561, 3561, 3561, 3561, 3561, 3561,
+     3561,    0, 3561, 3562, 3562, 3562,    0,    0,    0, 3562,
+     3563,    0,    0,    0, 3563, 3564, 3564, 3564,    0,    0,
+        0, 3564, 3565,    0,    0,    0, 3565, 3566, 3566, 3566,
+        0,    0,    0, 3566, 3567,    0,    0,    0, 3567, 3568,
+     3568, 3568,    0,    0,    0, 3568, 3569,    0,    0,    0,
+     3569, 3570, 3570, 3570,    0,    0,    0, 3570, 3571,    0,
+        0,    0, 3571, 3572, 3572, 3572,    0,    0,    0, 3572,
+     3573,    0,    0,    0, 3573, 3574, 3574, 3574,    0,    0,
+        0, 3574, 3575,    0,    0,    0, 3575, 3576, 3576, 3576,
+
+        0,    0,    0, 3576, 3577,    0,    0,    0, 3577, 3578,
+     3578, 3578,    0,    0,    0, 3578, 3579,    0,    0,    0,
+     3579, 3580, 3580, 3580,    0,    0,    0, 3580, 3581,    0,
+        0,    0, 3581, 3582, 3582, 3582,    0,    0,    0, 3582,
+     3583,    0,    0,    0, 3583, 3584, 3584, 3584,    0,    0,
+        0, 3584, 3585,    0,    0,    0, 3585, 3586, 3586, 3586,
+        0,    0,    0, 3586, 3587,    0,    0,    0, 3587, 3588,
+     3588, 3588,    0,    0,    0, 3588, 3589,    0,    0,    0,
+     3589, 3590, 3590, 3590,    0,    0,    0, 3590, 3591,    0,
+        0,    0, 3591, 3592, 3592, 3592,    0,    0,    0, 3592,
+
+     3593,    0,    0,    0, 3593, 3594, 3594, 3594,    0,    0,
+        0, 3594, 3595,    0,    0,    0, 3595, 3596, 3596, 3596,
+        0,    0,    0, 3596, 3597,    0,    0,    0, 3597, 3598,
+     3598, 3598,    0,    0,    0, 3598, 3599,    0,    0,    0,
+     3599, 3600, 3600, 3600,    0,    0,    0, 3600, 3601,    0,
+        0,    0, 3601, 3602, 3602, 3602,    0,    0,    0, 3602,
+     3603,    0,    0,    0, 3603, 3604, 3604, 3604,    0,    0,
+        0, 3604, 3605,    0,    0,    0, 3605, 3606, 3606, 3606,
+        0,    0,    0, 3606, 3607,    0,    0,    0, 3607, 3608,
+     3608, 3608,    0,    0,    0, 3608, 3609,    0,    0,    0,
+
+     3609, 3610, 3610, 3610,    0,    0,    0, 3610, 3611,    0,
+        0,    0, 3611, 3612, 3612, 3612,    0,    0,    0, 3612,
+     3613,    0,    0,    0, 3613, 3614, 3614, 3614,    0,    0,
+        0, 3614, 3615,    0,    0,    0, 3615, 3616, 3616, 3616,
+        0,    0,    0, 3616, 3617,    0,    0,    0, 3617, 3618,
+     3618, 3618,    0,    0,    0, 3618, 3619,    0,    0,    0,
+     3619, 3620, 3620, 3620, 3620, 3620, 3620, 3620, 3620, 3620,
+     3621,    0,    0,    0,    0, 3621, 3622, 3622, 3622,    0,
+        0,    0, 3622, 3623, 3623, 3623, 3623,    0,    0, 3623,
+     3623, 3624, 3624, 3624,    0,    0,    0, 3624, 3625, 3625,
+
+     3625, 3625,    0,    0, 3625, 3625, 3626, 3626, 3626,    0,
+        0,    0, 3626, 3627, 3627, 3627, 3627,    0,    0, 3627,
+     3627, 3628, 3628, 3628,    0,    0,    0, 3628, 3629, 3629,
+     3629, 3629,    0,    0, 3629, 3629, 3630, 3630, 3630,    0,
+        0,    0, 3630, 3631, 3631, 3631, 3631,    0,    0, 3631,
+     3631, 3632, 3632, 3632,    0,    0,    0, 3632, 3633, 3633,
+     3633, 3633,    0,    0, 3633, 3633, 3634, 3634, 3634,    0,
+        0,    0, 3634, 3635, 3635, 3635, 3635,    0,    0, 3635,
+     3635, 3636, 3636, 3636,    0,    0,    0, 3636, 3637, 3637,
+     3637, 3637,    0,    0, 3637, 3637, 3638, 3638, 3638,    0,
+
+        0,    0, 3638, 3639, 3639, 3639, 3639,    0,    0, 3639,
+     3639, 3640, 3640, 3640,    0,    0,    0, 3640, 3641, 3641,
+     3641, 3641,    0,    0, 3641, 3641, 3642, 3642, 3642,    0,
+        0,    0, 3642, 3643, 3643, 3643, 3643,    0,    0, 3643,
+     3643, 3644, 3644, 3644,    0,    0,    0, 3644, 3645, 3645,
+     3645, 3645,    0,    0, 3645, 3645, 3646, 3646, 3646,    0,
+        0,    0, 3646, 3647, 3647, 3647, 3647,    0,    0, 3647,
+     3647, 3648, 3648, 3648,    0,    0,    0, 3648, 3649, 3649,
+     3649, 3649,    0,    0, 3649, 3649, 3650, 3650, 3650, 3650,
+        0, 3650,    0, 3650, 3651, 3651, 3651, 3651,    0,    0,
+
+     3651, 3651, 3652, 3652, 3652,    0,    0,    0, 3652, 3653,
+     3653, 3653, 3653,    0,    0, 3653, 3653, 3654, 3654, 3654,
+        0,    0,    0, 3654, 3655, 3655, 3655, 3655,    0,    0,
+     3655, 3655, 3656, 3656, 3656,    0,    0,    0, 3656, 3657,
+     3657, 3657, 3657,    0,    0, 3657, 3657, 3658, 3658, 3658,
+        0,    0,    0, 3658, 3659, 3659, 3659, 3659,    0,    0,
+     3659, 3659, 3660, 3660, 3660, 3660,    0, 3660,    0, 3660,
+     3661, 3661, 3661, 3661,    0,    0, 3661, 3661, 3662, 3662,
+     3662, 3662,    0, 3662,    0, 3662, 3663, 3663, 3663, 3663,
         0,    0, 3663, 3663, 3664, 3664, 3664,    0,    0,    0,
+
      3664, 3665, 3665, 3665, 3665,    0,    0, 3665, 3665, 3666,
-     3666, 3666,    0,    0,    0, 3666, 3667, 3667, 3667, 3667,
-        0,    0, 3667, 3667, 3668, 3668, 3668, 3668, 3668, 3668,
-     3668, 3668, 3668, 3669,    0, 3669,    0,    0, 3669, 3670,
-     3670, 3670,    0,    0,    0, 3670, 3671, 3671, 3671, 3671,
-        0,    0, 3671, 3671, 3672, 3672, 3672, 3672,    0, 3672,
-
-        0, 3672, 3673, 3673, 3673, 3673,    0,    0, 3673, 3673,
-     3674, 3674, 3674, 3674,    0, 3674,    0, 3674, 3675, 3675,
-     3675, 3675,    0,    0, 3675, 3675, 3676, 3676, 3676,    0,
-        0,    0, 3676, 3677, 3677, 3677, 3677,    0,    0, 3677,
-     3677, 3678, 3678, 3678,    0,    0,    0, 3678, 3679, 3679,
-     3679, 3679,    0,    0, 3679, 3679, 3680, 3680, 3680,    0,
-        0,    0, 3680, 3681, 3681, 3681, 3681,    0,    0, 3681,
-     3681, 3682, 3682, 3682,    0,    0,    0, 3682, 3683, 3683,
-     3683, 3683,    0,    0, 3683, 3683, 3684, 3684, 3684,    0,
-        0,    0, 3684, 3685, 3685, 3685, 3685,    0,    0, 3685,
-
-     3685, 3686, 3686, 3686, 3686,    0, 3686,    0, 3686, 3687,
-     3687, 3687, 3687,    0,    0, 3687, 3687, 3688, 3688, 3688,
-     3688,    0, 3688,    0, 3688, 3689, 3689, 3689, 3689,    0,
-        0, 3689, 3689, 3690, 3690, 3690,    0,    0,    0, 3690,
-     3691, 3691, 3691, 3691,    0,    0, 3691, 3691, 3692, 3692,
-     3692, 3692,    0, 3692,    0, 3692, 3693, 3693, 3693, 3693,
-        0,    0, 3693, 3693, 3694, 3694, 3694, 3694,    0, 3694,
-        0, 3694, 3695, 3695, 3695, 3695,    0,    0, 3695, 3695,
-     3696, 3696, 3696,    0,    0,    0, 3696, 3697, 3697, 3697,
-     3697,    0,    0, 3697, 3697, 3698, 3698, 3698,    0,    0,
-
-        0, 3698, 3699, 3699, 3699, 3699,    0,    0, 3699, 3699,
-     3700, 3700, 3700,    0,    0,    0, 3700, 3701, 3701, 3701,
-     3701,    0,    0, 3701, 3701, 3702, 3702, 3702,    0,    0,
-        0, 3702, 3703, 3703, 3703, 3703,    0,    0, 3703, 3703,
-     3704, 3704, 3704,    0,    0,    0, 3704, 3705, 3705, 3705,
-     3705,    0,    0, 3705, 3705, 3706, 3706, 3706,    0,    0,
-        0, 3706, 3707, 3707, 3707, 3707,    0,    0, 3707, 3707,
-     3708, 3708, 3708,    0,    0,    0, 3708, 3709, 3709, 3709,
-     3709,    0,    0, 3709, 3709, 3710, 3710, 3710,    0,    0,
-        0, 3710, 3711, 3711, 3711, 3711,    0,    0, 3711, 3711,
-
-     3712, 3712, 3712,    0,    0,    0, 3712, 3713, 3713, 3713,
-     3713,    0,    0, 3713, 3713, 3714, 3714, 3714, 3714,    0,
-        0, 3714, 3714, 3715, 3715, 3715,    0,    0,    0, 3715,
-     3716, 3716, 3716, 3716,    0,    0, 3716, 3716, 3717, 3717,
-     3717,    0,    0,    0, 3717, 3718, 3718, 3718, 3718,    0,
-        0, 3718, 3718, 3719, 3719, 3719,    0,    0,    0, 3719,
-     3720, 3720, 3720, 3720,    0,    0, 3720, 3720, 3721, 3721,
-     3721, 3721,    0,    0, 3721, 3721, 3722, 3722, 3722,    0,
-        0,    0, 3722, 3723, 3723, 3723, 3723,    0,    0, 3723,
-     3723, 3724, 3724, 3724,    0,    0,    0, 3724, 3725, 3725,
-
-     3725, 3725,    0,    0, 3725, 3725, 3726, 3726, 3726, 3726,
-     3726, 3726, 3726, 3726, 3726, 3727, 3727, 3727, 3727, 3727,
-     3727, 3727, 3727, 3727, 3728, 3728, 3728,    0,    0,    0,
-     3728, 3729, 3729, 3729, 3729,    0,    0, 3729, 3729, 3730,
-     3730, 3730, 3730,    0,    0, 3730, 3730, 3731, 3731, 3731,
-        0,    0,    0, 3731, 3732, 3732, 3732, 3732,    0,    0,
-     3732, 3732, 3733, 3733, 3733,    0,    0,    0, 3733, 3734,
-     3734, 3734, 3734,    0,    0, 3734, 3734, 3735, 3735, 3735,
-        0,    0,    0, 3735, 3736, 3736, 3736, 3736,    0,    0,
-     3736, 3736, 3737, 3737, 3737,    0,    0,    0, 3737, 3738,
-
-     3738, 3738,    0,    0,    0, 3738, 3739, 3739, 3739, 3739,
-        0,    0, 3739, 3739, 3740, 3740, 3740,    0,    0,    0,
-     3740, 3741, 3741, 3741, 3741,    0,    0, 3741, 3741, 3742,
-     3742, 3742,    0,    0,    0, 3742, 3743, 3743, 3743, 3743,
-        0,    0, 3743, 3743, 3744, 3744, 3744,    0,    0,    0,
-     3744, 3745, 3745, 3745, 3745,    0,    0, 3745, 3745, 3746,
-     3746, 3746,    0,    0,    0, 3746, 3747, 3747, 3747, 3747,
-        0,    0, 3747, 3747, 3748, 3748, 3748, 3748,    0,    0,
-     3748, 3748, 3749, 3749, 3749, 3749,    0,    0, 3749, 3749,
-     3750, 3750, 3750,    0,    0,    0, 3750, 3751, 3751, 3751,
-
-     3751,    0,    0, 3751, 3751, 3752, 3752, 3752, 3752,    0,
-     3752,    0, 3752, 3753, 3753, 3753, 3753,    0,    0, 3753,
-     3753, 3754, 3754, 3754,    0,    0,    0, 3754, 3755, 3755,
-     3755, 3755,    0,    0, 3755, 3755, 3756, 3756, 3756,    0,
-        0,    0, 3756, 3757, 3757, 3757, 3757,    0,    0, 3757,
-     3757, 3758, 3758, 3758,    0,    0,    0, 3758, 3759, 3759,
-     3759, 3759,    0,    0, 3759, 3759, 3760, 3760, 3760,    0,
-        0,    0, 3760, 3761, 3761, 3761, 3761,    0,    0, 3761,
-     3761, 3762, 3762, 3762,    0,    0,    0, 3762, 3763, 3763,
-     3763, 3763,    0,    0, 3763, 3763, 3764, 3764, 3764,    0,
-
-        0,    0, 3764, 3765, 3765, 3765, 3765,    0,    0, 3765,
-     3765, 3766, 3766, 3766,    0,    0,    0, 3766, 3767, 3767,
-     3767, 3767,    0,    0, 3767, 3767, 3768, 3768, 3768, 3768,
-        0,    0, 3768, 3768, 3769, 3769, 3769,    0,    0,    0,
-     3769, 3770, 3770, 3770, 3770,    0,    0, 3770, 3770, 3771,
-     3771, 3771,    0,    0,    0, 3771, 3772, 3772, 3772, 3772,
-        0,    0, 3772, 3772, 3773, 3773, 3773, 3773,    0, 3773,
-        0, 3773, 3774, 3774, 3774, 3774,    0,    0, 3774, 3774,
-     3775, 3775, 3775, 3775,    0,    0, 3775, 3775, 3776, 3776,
-     3776, 3776,    0, 3776,    0, 3776, 3777, 3777, 3777, 3777,
-
-        0,    0, 3777, 3777, 3778, 3778, 3778, 3778,    0, 3778,
-        0, 3778, 3779, 3779, 3779, 3779,    0,    0, 3779, 3779,
-     3780, 3780, 3780, 3780, 3780, 3780, 3780, 3780, 3780, 3781,
-     3781, 3781, 3781, 3781, 3781, 3781, 3781, 3781, 3782, 3782,
-     3782,    0,    0,    0, 3782, 3783, 3783, 3783, 3783,    0,
-        0, 3783, 3783, 3784, 3784, 3784, 3784,    0,    0, 3784,
-     3784, 3785, 3785, 3785,    0,    0,    0, 3785, 3786, 3786,
-     3786, 3786,    0,    0, 3786, 3786, 3787, 3787, 3787,    0,
-        0,    0, 3787, 3788, 3788, 3788, 3788,    0,    0, 3788,
-     3788, 3789, 3789, 3789,    0,    0,    0, 3789, 3790, 3790,
-
-     3790, 3790,    0,    0, 3790, 3790, 3791, 3791, 3791,    0,
-        0,    0, 3791, 3792, 3792, 3792,    0,    0,    0, 3792,
-     3793, 3793, 3793, 3793,    0,    0, 3793, 3793, 3794, 3794,
-     3794,    0,    0,    0, 3794, 3795, 3795, 3795, 3795,    0,
-        0, 3795, 3795, 3796, 3796, 3796,    0,    0,    0, 3796,
-     3797, 3797, 3797, 3797,    0,    0, 3797, 3797, 3798, 3798,
-     3798, 3798,    0, 3798,    0, 3798, 3799, 3799, 3799, 3799,
-        0,    0, 3799, 3799, 3800, 3800, 3800,    0,    0,    0,
-     3800, 3801, 3801, 3801, 3801,    0,    0, 3801, 3801, 3802,
-     3802, 3802, 3802,    0,    0, 3802, 3802, 3803, 3803, 3803,
-
-        0,    0,    0, 3803, 3804, 3804, 3804, 3804,    0,    0,
-     3804, 3804, 3805, 3805, 3805, 3805,    0, 3805,    0, 3805,
+     3666, 3666, 3666,    0, 3666,    0, 3666, 3667, 3667, 3667,
+     3667,    0,    0, 3667, 3667, 3668, 3668, 3668, 3668,    0,
+     3668,    0, 3668, 3669, 3669, 3669, 3669,    0,    0, 3669,
+     3669, 3670, 3670, 3670,    0,    0,    0, 3670, 3671, 3671,
+     3671, 3671,    0,    0, 3671, 3671, 3672, 3672, 3672,    0,
+        0,    0, 3672, 3673, 3673, 3673, 3673,    0,    0, 3673,
+     3673, 3674, 3674, 3674, 3674,    0,    0, 3674, 3674, 3675,
+     3675, 3675,    0,    0,    0, 3675, 3676, 3676, 3676, 3676,
+        0,    0, 3676, 3676, 3677, 3677, 3677,    0,    0,    0,
+
+     3677, 3678, 3678, 3678, 3678,    0,    0, 3678, 3678, 3679,
+     3679, 3679, 3679, 3679, 3679, 3679, 3679, 3679, 3680,    0,
+     3680,    0,    0, 3680, 3681, 3681, 3681,    0,    0,    0,
+     3681, 3682, 3682, 3682, 3682,    0,    0, 3682, 3682, 3683,
+     3683, 3683, 3683,    0, 3683,    0, 3683, 3684, 3684, 3684,
+     3684,    0,    0, 3684, 3684, 3685, 3685, 3685, 3685,    0,
+     3685,    0, 3685, 3686, 3686, 3686, 3686,    0,    0, 3686,
+     3686, 3687, 3687, 3687,    0,    0,    0, 3687, 3688, 3688,
+     3688, 3688,    0,    0, 3688, 3688, 3689, 3689, 3689,    0,
+        0,    0, 3689, 3690, 3690, 3690, 3690,    0,    0, 3690,
+
+     3690, 3691, 3691, 3691,    0,    0,    0, 3691, 3692, 3692,
+     3692, 3692,    0,    0, 3692, 3692, 3693, 3693, 3693,    0,
+        0,    0, 3693, 3694, 3694, 3694, 3694,    0,    0, 3694,
+     3694, 3695, 3695, 3695, 3695,    0, 3695,    0, 3695, 3696,
+     3696, 3696, 3696,    0,    0, 3696, 3696, 3697, 3697, 3697,
+     3697,    0, 3697,    0, 3697, 3698, 3698, 3698, 3698,    0,
+        0, 3698, 3698, 3699, 3699, 3699,    0,    0,    0, 3699,
+     3700, 3700, 3700, 3700,    0,    0, 3700, 3700, 3701, 3701,
+     3701,    0,    0,    0, 3701, 3702, 3702, 3702, 3702,    0,
+        0, 3702, 3702, 3703, 3703, 3703, 3703,    0, 3703,    0,
+
+     3703, 3704, 3704, 3704, 3704,    0,    0, 3704, 3704, 3705,
+     3705, 3705, 3705,    0, 3705,    0, 3705, 3706, 3706, 3706,
+     3706,    0,    0, 3706, 3706, 3707, 3707, 3707,    0,    0,
+        0, 3707, 3708, 3708, 3708, 3708,    0,    0, 3708, 3708,
+     3709, 3709, 3709,    0,    0,    0, 3709, 3710, 3710, 3710,
+     3710,    0,    0, 3710, 3710, 3711, 3711, 3711,    0,    0,
+        0, 3711, 3712, 3712, 3712, 3712,    0,    0, 3712, 3712,
+     3713, 3713, 3713,    0,    0,    0, 3713, 3714, 3714, 3714,
+     3714,    0,    0, 3714, 3714, 3715, 3715, 3715,    0,    0,
+        0, 3715, 3716, 3716, 3716, 3716,    0,    0, 3716, 3716,
+
+     3717, 3717, 3717,    0,    0,    0, 3717, 3718, 3718, 3718,
+     3718,    0,    0, 3718, 3718, 3719, 3719, 3719,    0,    0,
+        0, 3719, 3720, 3720, 3720, 3720,    0,    0, 3720, 3720,
+     3721, 3721, 3721,    0,    0,    0, 3721, 3722, 3722, 3722,
+     3722,    0,    0, 3722, 3722, 3723, 3723, 3723,    0,    0,
+        0, 3723, 3724, 3724, 3724, 3724,    0,    0, 3724, 3724,
+     3725, 3725, 3725, 3725,    0,    0, 3725, 3725, 3726, 3726,
+     3726,    0,    0,    0, 3726, 3727, 3727, 3727, 3727,    0,
+        0, 3727, 3727, 3728, 3728, 3728,    0,    0,    0, 3728,
+     3729, 3729, 3729, 3729,    0,    0, 3729, 3729, 3730, 3730,
+
+     3730,    0,    0,    0, 3730, 3731, 3731, 3731, 3731,    0,
+        0, 3731, 3731, 3732, 3732, 3732, 3732,    0,    0, 3732,
+     3732, 3733, 3733, 3733,    0,    0,    0, 3733, 3734, 3734,
+     3734, 3734,    0,    0, 3734, 3734, 3735, 3735, 3735,    0,
+        0,    0, 3735, 3736, 3736, 3736, 3736,    0,    0, 3736,
+     3736, 3737, 3737, 3737, 3737, 3737, 3737, 3737, 3737, 3737,
+     3738, 3738, 3738, 3738, 3738, 3738, 3738, 3738, 3738, 3739,
+     3739, 3739,    0,    0,    0, 3739, 3740, 3740, 3740, 3740,
+        0,    0, 3740, 3740, 3741, 3741, 3741, 3741,    0,    0,
+     3741, 3741, 3742, 3742, 3742,    0,    0,    0, 3742, 3743,
+
+     3743, 3743, 3743,    0,    0, 3743, 3743, 3744, 3744, 3744,
+        0,    0,    0, 3744, 3745, 3745, 3745, 3745,    0,    0,
+     3745, 3745, 3746, 3746, 3746,    0,    0,    0, 3746, 3747,
+     3747, 3747, 3747,    0,    0, 3747, 3747, 3748, 3748, 3748,
+        0,    0,    0, 3748, 3749, 3749, 3749,    0,    0,    0,
+     3749, 3750, 3750, 3750, 3750,    0,    0, 3750, 3750, 3751,
+     3751, 3751,    0,    0,    0, 3751, 3752, 3752, 3752, 3752,
+        0,    0, 3752, 3752, 3753, 3753, 3753,    0,    0,    0,
+     3753, 3754, 3754, 3754, 3754,    0,    0, 3754, 3754, 3755,
+     3755, 3755,    0,    0,    0, 3755, 3756, 3756, 3756, 3756,
+
+        0,    0, 3756, 3756, 3757, 3757, 3757,    0,    0,    0,
+     3757, 3758, 3758, 3758, 3758,    0,    0, 3758, 3758, 3759,
+     3759, 3759, 3759,    0,    0, 3759, 3759, 3760, 3760, 3760,
+     3760,    0,    0, 3760, 3760, 3761, 3761, 3761,    0,    0,
+        0, 3761, 3762, 3762, 3762, 3762,    0,    0, 3762, 3762,
+     3763, 3763, 3763, 3763,    0, 3763,    0, 3763, 3764, 3764,
+     3764, 3764,    0,    0, 3764, 3764, 3765, 3765, 3765,    0,
+        0,    0, 3765, 3766, 3766, 3766, 3766,    0,    0, 3766,
+     3766, 3767, 3767, 3767,    0,    0,    0, 3767, 3768, 3768,
+     3768, 3768,    0,    0, 3768, 3768, 3769, 3769, 3769,    0,
+
+        0,    0, 3769, 3770, 3770, 3770, 3770,    0,    0, 3770,
+     3770, 3771, 3771, 3771,    0,    0,    0, 3771, 3772, 3772,
+     3772, 3772,    0,    0, 3772, 3772, 3773, 3773, 3773,    0,
+        0,    0, 3773, 3774, 3774, 3774, 3774,    0,    0, 3774,
+     3774, 3775, 3775, 3775,    0,    0,    0, 3775, 3776, 3776,
+     3776, 3776,    0,    0, 3776, 3776, 3777, 3777, 3777,    0,
+        0,    0, 3777, 3778, 3778, 3778, 3778,    0,    0, 3778,
+     3778, 3779, 3779, 3779, 3779,    0,    0, 3779, 3779, 3780,
+     3780, 3780,    0,    0,    0, 3780, 3781, 3781, 3781, 3781,
+        0,    0, 3781, 3781, 3782, 3782, 3782,    0,    0,    0,
+
+     3782, 3783, 3783, 3783, 3783,    0,    0, 3783, 3783, 3784,
+     3784, 3784, 3784,    0, 3784,    0, 3784, 3785, 3785, 3785,
+     3785,    0,    0, 3785, 3785, 3786, 3786, 3786, 3786,    0,
+        0, 3786, 3786, 3787, 3787, 3787, 3787,    0, 3787,    0,
+     3787, 3788, 3788, 3788, 3788,    0,    0, 3788, 3788, 3789,
+     3789, 3789, 3789,    0, 3789,    0, 3789, 3790, 3790, 3790,
+     3790,    0,    0, 3790, 3790, 3791, 3791, 3791, 3791, 3791,
+     3791, 3791, 3791, 3791, 3792, 3792, 3792, 3792, 3792, 3792,
+     3792, 3792, 3792, 3793, 3793, 3793,    0,    0,    0, 3793,
+     3794, 3794, 3794, 3794,    0,    0, 3794, 3794, 3795, 3795,
+
+     3795, 3795,    0,    0, 3795, 3795, 3796, 3796, 3796,    0,
+        0,    0, 3796, 3797, 3797, 3797, 3797,    0,    0, 3797,
+     3797, 3798, 3798, 3798,    0,    0,    0, 3798, 3799, 3799,
+     3799, 3799,    0,    0, 3799, 3799, 3800, 3800, 3800,    0,
+        0,    0, 3800, 3801, 3801, 3801, 3801,    0,    0, 3801,
+     3801, 3802, 3802, 3802,    0,    0,    0, 3802, 3803, 3803,
+     3803,    0,    0,    0, 3803, 3804, 3804, 3804, 3804,    0,
+        0, 3804, 3804, 3805, 3805, 3805,    0,    0,    0, 3805,
      3806, 3806, 3806, 3806,    0,    0, 3806, 3806, 3807, 3807,
-     3807,    0,    0,    0, 3807, 3808, 3808, 3808, 3808,    0,
-        0, 3808, 3808, 3809, 3809, 3809,    0,    0,    0, 3809,
-     3810, 3810, 3810, 3810,    0,    0, 3810, 3810, 3811, 3811,
-     3811,    0,    0,    0, 3811, 3812, 3812, 3812, 3812,    0,
-        0, 3812, 3812, 3813, 3813, 3813,    0,    0,    0, 3813,
-     3814, 3814, 3814, 3814,    0,    0, 3814, 3814, 3815, 3815,
-     3815,    0,    0,    0, 3815, 3816, 3816, 3816, 3816,    0,
-
-        0, 3816, 3816, 3817, 3817, 3817, 3817,    0, 3817,    0,
-     3817, 3818, 3818, 3818, 3818,    0,    0, 3818, 3818, 3819,
-     3819, 3819,    0,    0,    0, 3819, 3820, 3820, 3820, 3820,
-        0,    0, 3820, 3820, 3821, 3821, 3821, 3821,    0,    0,
-     3821, 3821, 3822, 3822, 3822, 3822,    0, 3822,    0, 3822,
-     3823, 3823, 3823, 3823,    0,    0, 3823, 3823, 3824, 3824,
-     3824,    0,    0,    0, 3824, 3825, 3825, 3825, 3825,    0,
-        0, 3825, 3825, 3826, 3826, 3826, 3826,    0,    0, 3826,
+     3807, 3807,    0, 3807,    0, 3807, 3808, 3808, 3808, 3808,
+
+        0,    0, 3808, 3808, 3809, 3809, 3809,    0,    0,    0,
+     3809, 3810, 3810, 3810, 3810,    0,    0, 3810, 3810, 3811,
+     3811, 3811, 3811,    0, 3811,    0, 3811, 3812, 3812, 3812,
+     3812,    0,    0, 3812, 3812, 3813, 3813, 3813, 3813,    0,
+        0, 3813, 3813, 3814, 3814, 3814,    0,    0,    0, 3814,
+     3815, 3815, 3815, 3815,    0,    0, 3815, 3815, 3816, 3816,
+     3816, 3816,    0, 3816,    0, 3816, 3817, 3817, 3817, 3817,
+        0,    0, 3817, 3817, 3818, 3818, 3818,    0,    0,    0,
+     3818, 3819, 3819, 3819, 3819,    0,    0, 3819, 3819, 3820,
+     3820, 3820,    0,    0,    0, 3820, 3821, 3821, 3821, 3821,
+
+        0,    0, 3821, 3821, 3822, 3822, 3822,    0,    0,    0,
+     3822, 3823, 3823, 3823, 3823,    0,    0, 3823, 3823, 3824,
+     3824, 3824,    0,    0,    0, 3824, 3825, 3825, 3825, 3825,
+        0,    0, 3825, 3825, 3826, 3826, 3826,    0,    0,    0,
      3826, 3827, 3827, 3827, 3827,    0,    0, 3827, 3827, 3828,
-     3828, 3828, 3828,    0,    0, 3828, 3828, 3829, 3829, 3829,
-
-     3829,    0,    0, 3829, 3829, 3830, 3830, 3830, 3830, 3830,
-     3830, 3830, 3830, 3830, 3831, 3831, 3831, 3831, 3831, 3831,
-     3831, 3831, 3831, 3832, 3832, 3832, 3832,    0, 3832,    0,
-     3832, 3833, 3833, 3833, 3833,    0,    0, 3833, 3833, 3834,
-     3834, 3834, 3834,    0,    0, 3834, 3834, 3835, 3835, 3835,
-        0,    0,    0, 3835, 3836, 3836, 3836, 3836,    0,    0,
-     3836, 3836, 3837, 3837, 3837,    0,    0,    0, 3837, 3838,
-     3838, 3838, 3838,    0,    0, 3838, 3838, 3839, 3839, 3839,
-     3839,    0, 3839,    0, 3839, 3840, 3840, 3840, 3840,    0,
-        0, 3840, 3840, 3841, 3841, 3841, 3841,    0, 3841,    0,
-
-     3841, 3842, 3842, 3842, 3842,    0, 3842,    0, 3842, 3843,
-     3843, 3843, 3843,    0,    0, 3843, 3843, 3844, 3844, 3844,
-     3844,    0, 3844,    0, 3844, 3845, 3845, 3845, 3845,    0,
+     3828, 3828, 3828,    0, 3828,    0, 3828, 3829, 3829, 3829,
+     3829,    0,    0, 3829, 3829, 3830, 3830, 3830,    0,    0,
+        0, 3830, 3831, 3831, 3831, 3831,    0,    0, 3831, 3831,
+     3832, 3832, 3832, 3832,    0,    0, 3832, 3832, 3833, 3833,
+     3833, 3833,    0, 3833,    0, 3833, 3834, 3834, 3834, 3834,
+
+        0,    0, 3834, 3834, 3835, 3835, 3835,    0,    0,    0,
+     3835, 3836, 3836, 3836, 3836,    0,    0, 3836, 3836, 3837,
+     3837, 3837, 3837,    0,    0, 3837, 3837, 3838, 3838, 3838,
+     3838,    0,    0, 3838, 3838, 3839, 3839, 3839, 3839,    0,
+        0, 3839, 3839, 3840, 3840, 3840, 3840,    0,    0, 3840,
+     3840, 3841, 3841, 3841, 3841, 3841, 3841, 3841, 3841, 3841,
+     3842, 3842, 3842, 3842, 3842, 3842, 3842, 3842, 3842, 3843,
+     3843, 3843, 3843,    0, 3843,    0, 3843, 3844, 3844, 3844,
+     3844,    0,    0, 3844, 3844, 3845, 3845, 3845, 3845,    0,
         0, 3845, 3845, 3846, 3846, 3846,    0,    0,    0, 3846,
+
      3847, 3847, 3847, 3847,    0,    0, 3847, 3847, 3848, 3848,
-     3848, 3848,    0,    0, 3848, 3848, 3849, 3849, 3849,    0,
-        0,    0, 3849, 3850, 3850, 3850, 3850,    0,    0, 3850,
-     3850, 3851, 3851, 3851,    0,    0,    0, 3851, 3852, 3852,
-     3852, 3852,    0,    0, 3852, 3852, 3853, 3853, 3853, 3853,
-        0, 3853,    0, 3853, 3854, 3854, 3854, 3854,    0,    0,
-
-     3854, 3854, 3855, 3855, 3855,    0,    0,    0, 3855, 3856,
-     3856, 3856,    0,    0,    0, 3856, 3857, 3857, 3857, 3857,
-        0,    0, 3857, 3857, 3858, 3858, 3858,    0,    0,    0,
-     3858, 3859, 3859, 3859, 3859,    0,    0, 3859, 3859, 3860,
-     3860, 3860,    0,    0,    0, 3860, 3861, 3861, 3861,    0,
-        0,    0, 3861, 3862, 3862, 3862, 3862,    0,    0, 3862,
-     3862, 3863, 3863, 3863,    0,    0,    0, 3863, 3864, 3864,
-     3864, 3864,    0,    0, 3864, 3864, 3865, 3865, 3865,    0,
-        0,    0, 3865, 3866, 3866, 3866, 3866,    0,    0, 3866,
-     3866, 3867, 3867, 3867, 3867,    0,    0, 3867, 3867, 3868,
-
-     3868, 3868, 3868,    0,    0, 3868, 3868, 3869, 3869, 3869,
-        0,    0,    0, 3869, 3870, 3870, 3870, 3870,    0,    0,
-     3870, 3870, 3871, 3871, 3871, 3871,    0,    0, 3871, 3871,
-     3872, 3872, 3872, 3872,    0,    0, 3872, 3872, 3873, 3873,
-     3873, 3873,    0,    0, 3873, 3873, 3874, 3874, 3874, 3874,
-     3874, 3874, 3874, 3874, 3874, 3875, 3875, 3875, 3875, 3875,
-     3875, 3875, 3875, 3875, 3876, 3876, 3876, 3876,    0,    0,
-     3876, 3876, 3877, 3877, 3877, 3877,    0,    0, 3877, 3877,
-     3878, 3878, 3878,    0,    0,    0, 3878, 3879, 3879, 3879,
-        0,    0,    0, 3879, 3880, 3880, 3880, 3880,    0,    0,
-
-     3880, 3880, 3881, 3881, 3881, 3881,    0,    0, 3881, 3881,
-     3882, 3882, 3882,    0,    0,    0, 3882, 3883, 3883, 3883,
-     3883,    0,    0, 3883, 3883, 3884, 3884, 3884,    0,    0,
-        0, 3884, 3885, 3885, 3885, 3885,    0,    0, 3885, 3885,
-     3886, 3886, 3886,    0,    0,    0, 3886, 3887, 3887, 3887,
-     3887,    0,    0, 3887, 3887, 3888, 3888, 3888,    0,    0,
-        0, 3888, 3889, 3889, 3889, 3889,    0,    0, 3889, 3889,
-     3890, 3890, 3890,    0,    0,    0, 3890, 3891, 3891, 3891,
-     3891,    0,    0, 3891, 3891, 3892, 3892, 3892, 3892,    0,
-        0, 3892, 3892, 3893, 3893, 3893,    0,    0,    0, 3893,
-
-     3894, 3894, 3894,    0,    0,    0, 3894, 3895, 3895, 3895,
-     3895,    0,    0, 3895, 3895, 3896, 3896, 3896,    0,    0,
-        0, 3896, 3897, 3897, 3897, 3897,    0,    0, 3897, 3897,
-     3898, 3898, 3898,    0,    0,    0, 3898, 3899, 3899, 3899,
-        0,    0,    0, 3899, 3900, 3900, 3900,    0,    0,    0,
-     3900, 3901, 3901, 3901, 3901,    0,    0, 3901, 3901, 3902,
-     3902, 3902,    0,    0,    0, 3902, 3903, 3903, 3903, 3903,
-        0,    0, 3903, 3903, 3904, 3904, 3904, 3904,    0,    0,
-     3904, 3904, 3905, 3905, 3905, 3905,    0,    0, 3905, 3905,
-     3906, 3906, 3906, 3906,    0, 3906,    0, 3906, 3907, 3907,
-
-     3907, 3907,    0,    0, 3907, 3907, 3908, 3908, 3908, 3908,
-        0,    0, 3908, 3908, 3909, 3909, 3909, 3909,    0,    0,
-     3909, 3909, 3910, 3910, 3910, 3910,    0,    0, 3910, 3910,
-     3911, 3911, 3911, 3911, 3911, 3911, 3911, 3911, 3911, 3912,
-     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3913, 3913,
-     3913, 3913,    0,    0, 3913, 3913, 3914, 3914, 3914, 3914,
-        0,    0, 3914, 3914, 3915, 3915, 3915,    0,    0,    0,
-     3915, 3916, 3916, 3916, 3916,    0, 3916,    0, 3916, 3917,
-     3917, 3917, 3917,    0,    0, 3917, 3917, 3918, 3918, 3918,
-        0,    0,    0, 3918, 3919, 3919, 3919, 3919,    0,    0,
-
-     3919, 3919, 3920, 3920, 3920,    0,    0,    0, 3920, 3921,
-     3921, 3921, 3921,    0,    0, 3921, 3921, 3922, 3922, 3922,
-     3922,    0, 3922,    0, 3922, 3923, 3923, 3923, 3923,    0,
-        0, 3923, 3923, 3924, 3924, 3924,    0,    0,    0, 3924,
-     3925, 3925, 3925, 3925,    0,    0, 3925, 3925, 3926, 3926,
-     3926,    0,    0,    0, 3926, 3927, 3927, 3927, 3927,    0,
-        0, 3927, 3927, 3928, 3928, 3928, 3928,    0,    0, 3928,
-     3928, 3929, 3929, 3929,    0,    0,    0, 3929, 3930, 3930,
-     3930,    0,    0,    0, 3930, 3931, 3931, 3931, 3931,    0,
-     3931,    0, 3931, 3932, 3932, 3932, 3932,    0,    0, 3932,
-
-     3932, 3933, 3933, 3933, 3933,    0, 3933,    0, 3933, 3934,
-     3934, 3934,    0,    0,    0, 3934, 3935, 3935, 3935,    0,
-        0,    0, 3935, 3936, 3936, 3936, 3936,    0,    0, 3936,
-     3936, 3937, 3937, 3937, 3937,    0, 3937,    0, 3937, 3938,
-     3938, 3938, 3938,    0,    0, 3938, 3938, 3939, 3939, 3939,
-     3939,    0,    0, 3939, 3939, 3940, 3940, 3940, 3940,    0,
-        0, 3940, 3940, 3941, 3941, 3941, 3941,    0, 3941,    0,
-     3941, 3942, 3942, 3942, 3942,    0,    0, 3942, 3942, 3943,
+     3848,    0,    0,    0, 3848, 3849, 3849, 3849, 3849,    0,
+        0, 3849, 3849, 3850, 3850, 3850, 3850,    0, 3850,    0,
+     3850, 3851, 3851, 3851, 3851,    0,    0, 3851, 3851, 3852,
+     3852, 3852, 3852,    0, 3852,    0, 3852, 3853, 3853, 3853,
+     3853,    0, 3853,    0, 3853, 3854, 3854, 3854, 3854,    0,
+        0, 3854, 3854, 3855, 3855, 3855,    0,    0,    0, 3855,
+     3856, 3856, 3856, 3856,    0,    0, 3856, 3856, 3857, 3857,
+     3857, 3857,    0,    0, 3857, 3857, 3858, 3858, 3858,    0,
+        0,    0, 3858, 3859, 3859, 3859, 3859,    0, 3859,    0,
+
+     3859, 3860, 3860, 3860, 3860,    0,    0, 3860, 3860, 3861,
+     3861, 3861, 3861,    0,    0, 3861, 3861, 3862, 3862, 3862,
+        0,    0,    0, 3862, 3863, 3863, 3863, 3863,    0,    0,
+     3863, 3863, 3864, 3864, 3864, 3864,    0, 3864,    0, 3864,
+     3865, 3865, 3865, 3865,    0,    0, 3865, 3865, 3866, 3866,
+     3866,    0,    0,    0, 3866, 3867, 3867, 3867,    0,    0,
+        0, 3867, 3868, 3868, 3868, 3868,    0,    0, 3868, 3868,
+     3869, 3869, 3869,    0,    0,    0, 3869, 3870, 3870, 3870,
+     3870,    0,    0, 3870, 3870, 3871, 3871, 3871,    0,    0,
+        0, 3871, 3872, 3872, 3872,    0,    0,    0, 3872, 3873,
+
+     3873, 3873, 3873,    0,    0, 3873, 3873, 3874, 3874, 3874,
+        0,    0,    0, 3874, 3875, 3875, 3875, 3875,    0,    0,
+     3875, 3875, 3876, 3876, 3876,    0,    0,    0, 3876, 3877,
+     3877, 3877, 3877,    0,    0, 3877, 3877, 3878, 3878, 3878,
+     3878,    0,    0, 3878, 3878, 3879, 3879, 3879, 3879,    0,
+        0, 3879, 3879, 3880, 3880, 3880,    0,    0,    0, 3880,
+     3881, 3881, 3881, 3881,    0,    0, 3881, 3881, 3882, 3882,
+     3882, 3882,    0,    0, 3882, 3882, 3883, 3883, 3883, 3883,
+        0,    0, 3883, 3883, 3884, 3884, 3884, 3884,    0,    0,
+     3884, 3884, 3885, 3885, 3885, 3885, 3885, 3885, 3885, 3885,
+
+     3885, 3886, 3886, 3886, 3886, 3886, 3886, 3886, 3886, 3886,
+     3887, 3887, 3887, 3887,    0,    0, 3887, 3887, 3888, 3888,
+     3888, 3888,    0,    0, 3888, 3888, 3889, 3889, 3889,    0,
+        0,    0, 3889, 3890, 3890, 3890,    0,    0,    0, 3890,
+     3891, 3891, 3891, 3891,    0,    0, 3891, 3891, 3892, 3892,
+     3892, 3892,    0,    0, 3892, 3892, 3893, 3893, 3893,    0,
+        0,    0, 3893, 3894, 3894, 3894, 3894,    0,    0, 3894,
+     3894, 3895, 3895, 3895,    0,    0,    0, 3895, 3896, 3896,
+     3896, 3896,    0,    0, 3896, 3896, 3897, 3897, 3897,    0,
+        0,    0, 3897, 3898, 3898, 3898,    0,    0,    0, 3898,
+
+     3899, 3899, 3899, 3899,    0,    0, 3899, 3899, 3900, 3900,
+     3900, 3900,    0,    0, 3900, 3900, 3901, 3901, 3901,    0,
+        0,    0, 3901, 3902, 3902, 3902, 3902,    0,    0, 3902,
+     3902, 3903, 3903, 3903, 3903,    0,    0, 3903, 3903, 3904,
+     3904, 3904,    0,    0,    0, 3904, 3905, 3905, 3905,    0,
+        0,    0, 3905, 3906, 3906, 3906, 3906,    0,    0, 3906,
+     3906, 3907, 3907, 3907,    0,    0,    0, 3907, 3908, 3908,
+     3908, 3908,    0,    0, 3908, 3908, 3909, 3909, 3909,    0,
+        0,    0, 3909, 3910, 3910, 3910,    0,    0,    0, 3910,
+     3911, 3911, 3911,    0,    0,    0, 3911, 3912, 3912, 3912,
+
+     3912,    0,    0, 3912, 3912, 3913, 3913, 3913,    0,    0,
+        0, 3913, 3914, 3914, 3914, 3914,    0,    0, 3914, 3914,
+     3915, 3915, 3915, 3915,    0,    0, 3915, 3915, 3916, 3916,
+     3916, 3916,    0,    0, 3916, 3916, 3917, 3917, 3917, 3917,
+        0, 3917,    0, 3917, 3918, 3918, 3918, 3918,    0,    0,
+     3918, 3918, 3919, 3919, 3919, 3919,    0,    0, 3919, 3919,
+     3920, 3920, 3920, 3920,    0,    0, 3920, 3920, 3921, 3921,
+     3921, 3921,    0,    0, 3921, 3921, 3922, 3922, 3922, 3922,
+     3922, 3922, 3922, 3922, 3922, 3923, 3923, 3923, 3923, 3923,
+     3923, 3923, 3923, 3923, 3924, 3924, 3924, 3924,    0,    0,
+
+     3924, 3924, 3925, 3925, 3925, 3925,    0,    0, 3925, 3925,
+     3926, 3926, 3926,    0,    0,    0, 3926, 3927, 3927, 3927,
+     3927,    0, 3927,    0, 3927, 3928, 3928, 3928, 3928,    0,
+        0, 3928, 3928, 3929, 3929, 3929,    0,    0,    0, 3929,
+     3930, 3930, 3930, 3930,    0,    0, 3930, 3930, 3931, 3931,
+     3931, 3931,    0, 3931,    0, 3931, 3932, 3932, 3932, 3932,
+        0,    0, 3932, 3932, 3933, 3933, 3933,    0,    0,    0,
+     3933, 3934, 3934, 3934,    0,    0,    0, 3934, 3935, 3935,
+     3935, 3935,    0,    0, 3935, 3935, 3936, 3936, 3936, 3936,
+        0,    0, 3936, 3936, 3937, 3937, 3937,    0,    0,    0,
+
+     3937, 3938, 3938, 3938, 3938,    0,    0, 3938, 3938, 3939,
+     3939, 3939, 3939,    0,    0, 3939, 3939, 3940, 3940, 3940,
+        0,    0,    0, 3940, 3941, 3941, 3941,    0,    0,    0,
+     3941, 3942, 3942, 3942, 3942,    0, 3942,    0, 3942, 3943,
      3943, 3943, 3943,    0,    0, 3943, 3943, 3944, 3944, 3944,
-     3944,    0,    0, 3944, 3944, 3945, 3945, 3945, 3945, 3945,
-
-     3945, 3945, 3945, 3945, 3946, 3946, 3946, 3946, 3946, 3946,
-     3946, 3946, 3946, 3947, 3947, 3947, 3947,    0,    0, 3947,
-     3947, 3948, 3948, 3948,    0,    0,    0, 3948, 3949, 3949,
-     3949,    0,    0,    0, 3949, 3950, 3950, 3950, 3950,    0,
-        0, 3950, 3950, 3951, 3951, 3951,    0,    0,    0, 3951,
-     3952, 3952, 3952, 3952,    0,    0, 3952, 3952, 3953, 3953,
-     3953,    0,    0,    0, 3953, 3954, 3954, 3954, 3954,    0,
-        0, 3954, 3954, 3955, 3955, 3955,    0,    0,    0, 3955,
-     3956, 3956, 3956, 3956,    0,    0, 3956, 3956, 3957, 3957,
-     3957,    0,    0,    0, 3957, 3958, 3958, 3958,    0,    0,
-
-        0, 3958, 3959, 3959, 3959,    0,    0,    0, 3959, 3960,
-     3960, 3960, 3960,    0,    0, 3960, 3960, 3961, 3961, 3961,
-        0,    0,    0, 3961, 3962, 3962, 3962,    0,    0,    0,
-     3962, 3963, 3963, 3963,    0,    0,    0, 3963, 3964, 3964,
-     3964, 3964, 3964, 3964, 3964, 3964, 3964, 3965, 3965, 3965,
-     3965, 3965, 3965, 3965, 3965, 3965, 3966, 3966, 3966, 3966,
-     3966, 3966, 3966, 3966, 3966, 3967, 3967, 3967, 3967, 3967,
-     3967, 3967, 3967, 3967, 3968, 3968, 3968, 3968, 3968, 3968,
-     3968, 3968, 3968, 3969, 3969, 3969, 3969, 3969, 3969, 3969,
-     3969, 3969, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
-     3457, 3457, 3457, 3457, 3457, 3457, 3457
+     3944,    0, 3944,    0, 3944, 3945, 3945, 3945,    0,    0,
+        0, 3945, 3946, 3946, 3946,    0,    0,    0, 3946, 3947,
+     3947, 3947, 3947,    0,    0, 3947, 3947, 3948, 3948, 3948,
+     3948,    0, 3948,    0, 3948, 3949, 3949, 3949, 3949,    0,
+        0, 3949, 3949, 3950, 3950, 3950, 3950,    0,    0, 3950,
+
+     3950, 3951, 3951, 3951, 3951,    0,    0, 3951, 3951, 3952,
+     3952, 3952, 3952,    0, 3952,    0, 3952, 3953, 3953, 3953,
+     3953,    0,    0, 3953, 3953, 3954, 3954, 3954, 3954,    0,
+        0, 3954, 3954, 3955, 3955, 3955, 3955,    0,    0, 3955,
+     3955, 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956,
+     3957, 3957, 3957, 3957, 3957, 3957, 3957, 3957, 3957, 3958,
+     3958, 3958, 3958,    0,    0, 3958, 3958, 3959, 3959, 3959,
+        0,    0,    0, 3959, 3960, 3960, 3960,    0,    0,    0,
+     3960, 3961, 3961, 3961, 3961,    0,    0, 3961, 3961, 3962,
+     3962, 3962,    0,    0,    0, 3962, 3963, 3963, 3963, 3963,
+
+        0,    0, 3963, 3963, 3964, 3964, 3964, 3964,    0,    0,
+     3964, 3964, 3965, 3965, 3965,    0,    0,    0, 3965, 3966,
+     3966, 3966,    0,    0,    0, 3966, 3967, 3967, 3967, 3967,
+        0,    0, 3967, 3967, 3968, 3968, 3968,    0,    0,    0,
+     3968, 3969, 3969, 3969,    0,    0,    0, 3969, 3970, 3970,
+     3970,    0,    0,    0, 3970, 3971, 3971, 3971, 3971,    0,
+        0, 3971, 3971, 3972, 3972, 3972,    0,    0,    0, 3972,
+     3973, 3973, 3973,    0,    0,    0, 3973, 3974, 3974, 3974,
+        0,    0,    0, 3974, 3975, 3975, 3975, 3975, 3975, 3975,
+     3975, 3975, 3975, 3976, 3976, 3976, 3976, 3976, 3976, 3976,
+
+     3976, 3976, 3977, 3977, 3977, 3977, 3977, 3977, 3977, 3977,
+     3977, 3978, 3978, 3978, 3978, 3978, 3978, 3978, 3978, 3978,
+     3979, 3979, 3979, 3979, 3979, 3979, 3979, 3979, 3979, 3980,
+     3980, 3980, 3980, 3980, 3980, 3980, 3980, 3980, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+
+     3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468,
+     3468, 3468, 3468
     } ;
 
 /* Table of booleans, true if rule could match eol. */
-static yyconst flex_int32_t yy_rule_can_match_eol[590] =
+static yyconst flex_int32_t yy_rule_can_match_eol[592] =
     {   0,
 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 
     0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 
@@ -4524,29 +4539,29 @@ static yyconst flex_int32_t yy_rule_can_match_eol[590] =
     1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 
     0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
     1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 
+    1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 
+    0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+    0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 
+    0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 
     1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 
-    1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 
-    1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 
-    0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 
-    1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
-    0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
-    1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
-    1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 
-    1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 
-    1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
-    1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 
-    1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+    1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
     1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 
-    1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 
-    1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 
-    1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 
-    1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 
-    1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 
-    0, 0, 0, 0, 1, 0, 0, 0, 1, 0,     };
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 
+    1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 
+    0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 
+    1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 
+    1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 
+    1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 
+    0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 
+    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 
+    1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 
+    0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 
+    1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 
+    1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0,     };
 
 static yy_state_type yy_last_accepting_state;
 static char *yy_last_accepting_cpos;
@@ -4797,6 +4812,9 @@ short int surfxml_random_mean_isset;
 AT_surfxml_storage___type_size AX_surfxml_storage___type_size;
 #define A_surfxml_storage___type_size (surfxml_bufferstack + AX_surfxml_storage___type_size)
 short int surfxml_storage___type_size_isset;
+AT_surfxml_storage_attach AX_surfxml_storage_attach;
+#define A_surfxml_storage_attach (surfxml_bufferstack + AX_surfxml_storage_attach)
+short int surfxml_storage_attach_isset;
 AT_surfxml_cluster_bb___lat AX_surfxml_cluster_bb___lat;
 #define A_surfxml_cluster_bb___lat (surfxml_bufferstack + AX_surfxml_cluster_bb___lat)
 short int surfxml_cluster_bb___lat_isset;
@@ -4914,15 +4932,15 @@ short int surfxml_peer_id_isset;
 AT_surfxml_cabinet_radical AX_surfxml_cabinet_radical;
 #define A_surfxml_cabinet_radical (surfxml_bufferstack + AX_surfxml_cabinet_radical)
 short int surfxml_cabinet_radical_isset;
+AT_surfxml_cluster_loopback___lat AX_surfxml_cluster_loopback___lat;
+#define A_surfxml_cluster_loopback___lat (surfxml_bufferstack + AX_surfxml_cluster_loopback___lat)
+short int surfxml_cluster_loopback___lat_isset;
 AT_surfxml_storage_content___type AX_surfxml_storage_content___type;
 #define A_surfxml_storage_content___type (surfxml_bufferstack + AX_surfxml_storage_content___type)
 short int surfxml_storage_content___type_isset;
 AT_surfxml_cluster_router___id AX_surfxml_cluster_router___id;
 #define A_surfxml_cluster_router___id (surfxml_bufferstack + AX_surfxml_cluster_router___id)
 short int surfxml_cluster_router___id_isset;
-AT_surfxml_cluster_loopback___lat AX_surfxml_cluster_loopback___lat;
-#define A_surfxml_cluster_loopback___lat (surfxml_bufferstack + AX_surfxml_cluster_loopback___lat)
-short int surfxml_cluster_loopback___lat_isset;
 AT_surfxml_cluster_sharing___policy AX_surfxml_cluster_sharing___policy;
 #define A_surfxml_cluster_sharing___policy AX_surfxml_cluster_sharing___policy
 short int surfxml_cluster_sharing___policy_isset;
@@ -4935,12 +4953,12 @@ short int surfxml_cabinet_power_isset;
 AT_surfxml_host_core AX_surfxml_host_core;
 #define A_surfxml_host_core (surfxml_bufferstack + AX_surfxml_host_core)
 short int surfxml_host_core_isset;
-AT_surfxml_storage___type_model AX_surfxml_storage___type_model;
-#define A_surfxml_storage___type_model (surfxml_bufferstack + AX_surfxml_storage___type_model)
-short int surfxml_storage___type_model_isset;
 AT_surfxml_host_availability AX_surfxml_host_availability;
 #define A_surfxml_host_availability (surfxml_bufferstack + AX_surfxml_host_availability)
 short int surfxml_host_availability_isset;
+AT_surfxml_storage___type_model AX_surfxml_storage___type_model;
+#define A_surfxml_storage___type_model (surfxml_bufferstack + AX_surfxml_storage___type_model)
+short int surfxml_storage___type_model_isset;
 AT_surfxml_bypassRoute_src AX_surfxml_bypassRoute_src;
 #define A_surfxml_bypassRoute_src (surfxml_bufferstack + AX_surfxml_bypassRoute_src)
 short int surfxml_bypassRoute_src_isset;
@@ -5206,20 +5224,20 @@ const char* *surfxml_statenames=NULL;
 #define S_surfxml_storage___type_1 53
 #define S_surfxml_storage___type_2 54
 #define E_surfxml_storage___type 55
-#define AL_surfxml_storage 56
-#define S_surfxml_storage 57
-#define S_surfxml_storage_1 58
-#define S_surfxml_storage_2 59
-#define E_surfxml_storage 60
-#define AL_surfxml_mount 61
-#define E_surfxml_mount 62
-#define AL_surfxml_mstorage 63
-#define E_surfxml_mstorage 64
-#define AL_surfxml_host 65
-#define S_surfxml_host 66
-#define S_surfxml_host_1 67
-#define S_surfxml_host_2 68
-#define E_surfxml_host 69
+#define AL_surfxml_mount 56
+#define E_surfxml_mount 57
+#define AL_surfxml_mstorage 58
+#define E_surfxml_mstorage 59
+#define AL_surfxml_host 60
+#define S_surfxml_host 61
+#define S_surfxml_host_1 62
+#define S_surfxml_host_2 63
+#define E_surfxml_host 64
+#define AL_surfxml_storage 65
+#define S_surfxml_storage 66
+#define S_surfxml_storage_1 67
+#define S_surfxml_storage_2 68
+#define E_surfxml_storage 69
 #define AL_surfxml_gpu 70
 #define E_surfxml_gpu 71
 #define AL_surfxml_host___link 72
@@ -5501,10 +5519,10 @@ YY_DECL
   surfxml_bufferliteral('\0', &bnext, "0.0");
   surfxml_bufferliteral('\0', &bnext, "2147483647");
   surfxml_bufferliteral('\0', &bnext, "txt_unix");
-  surfxml_bufferliteral('\0', &bnext, "txt_unix");
   surfxml_bufferliteral('\0', &bnext, "1");
   surfxml_bufferliteral('\0', &bnext, "1.0");
   surfxml_bufferliteral('\0', &bnext, "0.0");
+  surfxml_bufferliteral('\0', &bnext, "txt_unix");
   surfxml_bufferliteral('\0', &bnext, "1");
   surfxml_bufferliteral('\0', &bnext, "0.0");
   surfxml_bufferliteral('\0', &bnext, "-1.0");
@@ -5565,11 +5583,6 @@ YY_DECL
   surfxml_statenames[S_surfxml_storage___type_1] = "storage_type";
   surfxml_statenames[S_surfxml_storage___type_2] = "storage_type";
   surfxml_statenames[E_surfxml_storage___type] = "storage_type";
-  surfxml_statenames[AL_surfxml_storage] = NULL;
-  surfxml_statenames[S_surfxml_storage] = "storage";
-  surfxml_statenames[S_surfxml_storage_1] = "storage";
-  surfxml_statenames[S_surfxml_storage_2] = "storage";
-  surfxml_statenames[E_surfxml_storage] = "storage";
   surfxml_statenames[AL_surfxml_mount] = NULL;
   surfxml_statenames[E_surfxml_mount] = "mount";
   surfxml_statenames[AL_surfxml_mstorage] = NULL;
@@ -5579,6 +5592,11 @@ YY_DECL
   surfxml_statenames[S_surfxml_host_1] = "host";
   surfxml_statenames[S_surfxml_host_2] = "host";
   surfxml_statenames[E_surfxml_host] = "host";
+  surfxml_statenames[AL_surfxml_storage] = NULL;
+  surfxml_statenames[S_surfxml_storage] = "storage";
+  surfxml_statenames[S_surfxml_storage_1] = "storage";
+  surfxml_statenames[S_surfxml_storage_2] = "storage";
+  surfxml_statenames[E_surfxml_storage] = "storage";
   surfxml_statenames[AL_surfxml_gpu] = NULL;
   surfxml_statenames[E_surfxml_gpu] = "gpu";
   surfxml_statenames[AL_surfxml_host___link] = NULL;
@@ -5694,13 +5712,13 @@ yy_match:
                        while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                                {
                                yy_current_state = (int) yy_def[yy_current_state];
-                               if ( yy_current_state >= 3458 )
+                               if ( yy_current_state >= 3469 )
                                        yy_c = yy_meta[(unsigned int) yy_c];
                                }
                        yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
                        ++yy_cp;
                        }
-               while ( yy_base[yy_current_state] != 12593 );
+               while ( yy_base[yy_current_state] != 12639 );
 
 yy_find_action:
                yy_act = yy_accept[yy_current_state];
@@ -6720,132 +6738,11 @@ if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</storage_type>' expecte
 case 152:
 /* rule 152 can match eol */
 YY_RULE_SETUP
-FAIL("Starting tag <storage> is not allowed here.");
+FAIL("Starting tag <mount> is not allowed here.");
        YY_BREAK
 case 153:
 /* rule 153 can match eol */
 YY_RULE_SETUP
-{
-  AX_surfxml_storage_id = 0;
-  surfxml_storage_id_isset = 0;
-  AX_surfxml_storage_typeId = 0;
-  surfxml_storage_typeId_isset = 0;
-  AX_surfxml_storage_content = 0;
-  surfxml_storage_content_isset = 0;
-  AX_surfxml_storage_content___type = 25;
-  surfxml_storage_content___type_isset = 0;
-  ENTER(AL_surfxml_storage); pushbuffer(0);
-  }
-       YY_BREAK
-
-case 154:
-/* rule 154 can match eol */
-YY_RULE_SETUP
-if (surfxml_storage_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_storage>");} surfxml_storage_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_id);
-       YY_BREAK
-case 155:
-/* rule 155 can match eol */
-YY_RULE_SETUP
-if (surfxml_storage_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_storage>");}  surfxml_storage_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_id);
-       YY_BREAK
-case 156:
-/* rule 156 can match eol */
-YY_RULE_SETUP
-if (surfxml_storage_typeId_isset != 0) {FAIL("Multiple definition of attribute typeId in <surfxml_storage>");} surfxml_storage_typeId_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_typeId);
-       YY_BREAK
-case 157:
-/* rule 157 can match eol */
-YY_RULE_SETUP
-if (surfxml_storage_typeId_isset != 0) {FAIL("Multiple definition of attribute typeId in <surfxml_storage>");}  surfxml_storage_typeId_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_typeId);
-       YY_BREAK
-case 158:
-/* rule 158 can match eol */
-YY_RULE_SETUP
-if (surfxml_storage_content_isset != 0) {FAIL("Multiple definition of attribute content in <surfxml_storage>");} surfxml_storage_content_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_content);
-       YY_BREAK
-case 159:
-/* rule 159 can match eol */
-YY_RULE_SETUP
-if (surfxml_storage_content_isset != 0) {FAIL("Multiple definition of attribute content in <surfxml_storage>");}  surfxml_storage_content_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_content);
-       YY_BREAK
-case 160:
-/* rule 160 can match eol */
-YY_RULE_SETUP
-if (surfxml_storage_content___type_isset != 0) {FAIL("Multiple definition of attribute content_type in <surfxml_storage>");} surfxml_storage_content___type_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_content___type);
-       YY_BREAK
-case 161:
-/* rule 161 can match eol */
-YY_RULE_SETUP
-if (surfxml_storage_content___type_isset != 0) {FAIL("Multiple definition of attribute content_type in <surfxml_storage>");}  surfxml_storage_content___type_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_content___type);
-       YY_BREAK
-case 162:
-YY_RULE_SETUP
-{
-  if (!AX_surfxml_storage_id) FAIL("Required attribute `id' not set for `storage' element.");
-  if (!AX_surfxml_storage_typeId) FAIL("Required attribute `typeId' not set for `storage' element.");
-  LEAVE; STag_surfxml_storage();surfxml_pcdata_ix = 0; ENTER(S_surfxml_storage);
- }
-       YY_BREAK
-case 163:
-YY_RULE_SETUP
-{
-  if (!AX_surfxml_storage_id) FAIL("Required attribute `id' not set for `storage' element.");
-  if (!AX_surfxml_storage_typeId) FAIL("Required attribute `typeId' not set for `storage' element.");
-  LEAVE; STag_surfxml_storage(); surfxml_pcdata_ix = 0; ETag_surfxml_storage(); popbuffer(); /* attribute */
-  switch (YY_START) {
-   case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
-   case S_surfxml_AS_1: case S_surfxml_AS_14: case S_surfxml_AS_13: case S_surfxml_AS: case S_surfxml_AS_3: SET(S_surfxml_AS_14); break;
-  }
- }
-       YY_BREAK
-case 164:
-YY_RULE_SETUP
-FAIL("Unexpected character `%c' in attribute list of storage element.", surf_parse_text[0]);
-       YY_BREAK
-case 165:
-YY_RULE_SETUP
-FAIL("Bad attribute `%s' in `storage' element start tag.",surf_parse_text);
-       YY_BREAK
-case YY_STATE_EOF(AL_surfxml_storage):
-FAIL("EOF in attribute list of `storage' element.");
-       YY_BREAK
-
-case 166:
-/* rule 166 can match eol */
-YY_RULE_SETUP
-{
-  LEAVE;
-  ETag_surfxml_storage();
-  popbuffer(); /* attribute */
-  switch (YY_START) {
-   case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
-   case S_surfxml_AS_1: case S_surfxml_AS_14: case S_surfxml_AS_13: case S_surfxml_AS: case S_surfxml_AS_3: SET(S_surfxml_AS_14); break;
-  }
- }
-       YY_BREAK
-case 167:
-/* rule 167 can match eol */
-YY_RULE_SETUP
-FAIL("Unexpected end-tag `%s': `</storage>' expected.",surf_parse_text);
-       YY_BREAK
-case 168:
-YY_RULE_SETUP
-FAIL("Unexpected character `%c': `</storage>' expected.",surf_parse_text[0]);
-       YY_BREAK
-case YY_STATE_EOF(E_surfxml_storage):
-case YY_STATE_EOF(S_surfxml_storage):
-case YY_STATE_EOF(S_surfxml_storage_2):
-if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</storage>' expected.");
-       YY_BREAK
-
-case 169:
-/* rule 169 can match eol */
-YY_RULE_SETUP
-FAIL("Starting tag <mount> is not allowed here.");
-       YY_BREAK
-case 170:
-/* rule 170 can match eol */
-YY_RULE_SETUP
 {
   AX_surfxml_mount_storageId = 0;
   surfxml_mount_storageId_isset = 0;
@@ -6855,27 +6752,27 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 171:
-/* rule 171 can match eol */
+case 154:
+/* rule 154 can match eol */
 YY_RULE_SETUP
 if (surfxml_mount_storageId_isset != 0) {FAIL("Multiple definition of attribute storageId in <surfxml_mount>");} surfxml_mount_storageId_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_mount_storageId);
        YY_BREAK
-case 172:
-/* rule 172 can match eol */
+case 155:
+/* rule 155 can match eol */
 YY_RULE_SETUP
 if (surfxml_mount_storageId_isset != 0) {FAIL("Multiple definition of attribute storageId in <surfxml_mount>");}  surfxml_mount_storageId_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_mount_storageId);
        YY_BREAK
-case 173:
-/* rule 173 can match eol */
+case 156:
+/* rule 156 can match eol */
 YY_RULE_SETUP
 if (surfxml_mount_name_isset != 0) {FAIL("Multiple definition of attribute name in <surfxml_mount>");} surfxml_mount_name_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_mount_name);
        YY_BREAK
-case 174:
-/* rule 174 can match eol */
+case 157:
+/* rule 157 can match eol */
 YY_RULE_SETUP
 if (surfxml_mount_name_isset != 0) {FAIL("Multiple definition of attribute name in <surfxml_mount>");}  surfxml_mount_name_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_mount_name);
        YY_BREAK
-case 175:
+case 158:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_mount_storageId) FAIL("Required attribute `storageId' not set for `mount' element.");
@@ -6883,7 +6780,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_mount();surfxml_pcdata_ix = 0; ENTER(E_surfxml_mount);
  }
        YY_BREAK
-case 176:
+case 159:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_mount_storageId) FAIL("Required attribute `storageId' not set for `mount' element.");
@@ -6894,11 +6791,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 177:
+case 160:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of mount element.", surf_parse_text[0]);
        YY_BREAK
-case 178:
+case 161:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `mount' element start tag.",surf_parse_text);
        YY_BREAK
@@ -6906,8 +6803,8 @@ case YY_STATE_EOF(AL_surfxml_mount):
 FAIL("EOF in attribute list of `mount' element.");
        YY_BREAK
 
-case 179:
-/* rule 179 can match eol */
+case 162:
+/* rule 162 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -6918,12 +6815,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 180:
-/* rule 180 can match eol */
+case 163:
+/* rule 163 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</mount>' expected.",surf_parse_text);
        YY_BREAK
-case 181:
+case 164:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</mount>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -6931,13 +6828,13 @@ case YY_STATE_EOF(E_surfxml_mount):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</mount>' expected.");
        YY_BREAK
 
-case 182:
-/* rule 182 can match eol */
+case 165:
+/* rule 165 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <mstorage> is not allowed here.");
        YY_BREAK
-case 183:
-/* rule 183 can match eol */
+case 166:
+/* rule 166 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_mstorage_typeId = 0;
@@ -6948,27 +6845,27 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 184:
-/* rule 184 can match eol */
+case 167:
+/* rule 167 can match eol */
 YY_RULE_SETUP
 if (surfxml_mstorage_typeId_isset != 0) {FAIL("Multiple definition of attribute typeId in <surfxml_mstorage>");} surfxml_mstorage_typeId_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_mstorage_typeId);
        YY_BREAK
-case 185:
-/* rule 185 can match eol */
+case 168:
+/* rule 168 can match eol */
 YY_RULE_SETUP
 if (surfxml_mstorage_typeId_isset != 0) {FAIL("Multiple definition of attribute typeId in <surfxml_mstorage>");}  surfxml_mstorage_typeId_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_mstorage_typeId);
        YY_BREAK
-case 186:
-/* rule 186 can match eol */
+case 169:
+/* rule 169 can match eol */
 YY_RULE_SETUP
 if (surfxml_mstorage_name_isset != 0) {FAIL("Multiple definition of attribute name in <surfxml_mstorage>");} surfxml_mstorage_name_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_mstorage_name);
        YY_BREAK
-case 187:
-/* rule 187 can match eol */
+case 170:
+/* rule 170 can match eol */
 YY_RULE_SETUP
 if (surfxml_mstorage_name_isset != 0) {FAIL("Multiple definition of attribute name in <surfxml_mstorage>");}  surfxml_mstorage_name_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_mstorage_name);
        YY_BREAK
-case 188:
+case 171:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_mstorage_typeId) FAIL("Required attribute `typeId' not set for `mstorage' element.");
@@ -6976,7 +6873,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_mstorage();surfxml_pcdata_ix = 0; ENTER(E_surfxml_mstorage);
  }
        YY_BREAK
-case 189:
+case 172:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_mstorage_typeId) FAIL("Required attribute `typeId' not set for `mstorage' element.");
@@ -6987,11 +6884,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 190:
+case 173:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of mstorage element.", surf_parse_text[0]);
        YY_BREAK
-case 191:
+case 174:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `mstorage' element start tag.",surf_parse_text);
        YY_BREAK
@@ -6999,8 +6896,8 @@ case YY_STATE_EOF(AL_surfxml_mstorage):
 FAIL("EOF in attribute list of `mstorage' element.");
        YY_BREAK
 
-case 192:
-/* rule 192 can match eol */
+case 175:
+/* rule 175 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -7011,12 +6908,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 193:
-/* rule 193 can match eol */
+case 176:
+/* rule 176 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</mstorage>' expected.",surf_parse_text);
        YY_BREAK
-case 194:
+case 177:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</mstorage>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -7024,22 +6921,22 @@ case YY_STATE_EOF(E_surfxml_mstorage):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</mstorage>' expected.");
        YY_BREAK
 
-case 195:
-/* rule 195 can match eol */
+case 178:
+/* rule 178 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <host> is not allowed here.");
        YY_BREAK
-case 196:
-/* rule 196 can match eol */
+case 179:
+/* rule 179 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_host_id = 0;
   surfxml_host_id_isset = 0;
   AX_surfxml_host_power = 0;
   surfxml_host_power_isset = 0;
-  AX_surfxml_host_core = 34;
+  AX_surfxml_host_core = 25;
   surfxml_host_core_isset = 0;
-  AX_surfxml_host_availability = 36;
+  AX_surfxml_host_availability = 27;
   surfxml_host_availability_isset = 0;
   AX_surfxml_host_availability___file = 0;
   surfxml_host_availability___file_isset = 0;
@@ -7049,107 +6946,107 @@ YY_RULE_SETUP
   surfxml_host_state___file_isset = 0;
   AX_surfxml_host_coordinates = 0;
   surfxml_host_coordinates_isset = 0;
-  AX_surfxml_host_pstate = 40;
+  AX_surfxml_host_pstate = 31;
   surfxml_host_pstate_isset = 0;
   ENTER(AL_surfxml_host); pushbuffer(0);
   }
        YY_BREAK
 
-case 197:
-/* rule 197 can match eol */
+case 180:
+/* rule 180 can match eol */
 YY_RULE_SETUP
 if (surfxml_host_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_host>");} surfxml_host_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_id);
        YY_BREAK
-case 198:
-/* rule 198 can match eol */
+case 181:
+/* rule 181 can match eol */
 YY_RULE_SETUP
 if (surfxml_host_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_host>");}  surfxml_host_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_id);
        YY_BREAK
-case 199:
-/* rule 199 can match eol */
+case 182:
+/* rule 182 can match eol */
 YY_RULE_SETUP
 if (surfxml_host_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_host>");} surfxml_host_power_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_power);
        YY_BREAK
-case 200:
-/* rule 200 can match eol */
+case 183:
+/* rule 183 can match eol */
 YY_RULE_SETUP
 if (surfxml_host_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_host>");}  surfxml_host_power_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_power);
        YY_BREAK
-case 201:
-/* rule 201 can match eol */
+case 184:
+/* rule 184 can match eol */
 YY_RULE_SETUP
 if (surfxml_host_core_isset != 0) {FAIL("Multiple definition of attribute core in <surfxml_host>");} surfxml_host_core_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_core);
        YY_BREAK
-case 202:
-/* rule 202 can match eol */
+case 185:
+/* rule 185 can match eol */
 YY_RULE_SETUP
 if (surfxml_host_core_isset != 0) {FAIL("Multiple definition of attribute core in <surfxml_host>");}  surfxml_host_core_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_core);
        YY_BREAK
-case 203:
-/* rule 203 can match eol */
+case 186:
+/* rule 186 can match eol */
 YY_RULE_SETUP
 if (surfxml_host_availability_isset != 0) {FAIL("Multiple definition of attribute availability in <surfxml_host>");} surfxml_host_availability_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_availability);
        YY_BREAK
-case 204:
-/* rule 204 can match eol */
+case 187:
+/* rule 187 can match eol */
 YY_RULE_SETUP
 if (surfxml_host_availability_isset != 0) {FAIL("Multiple definition of attribute availability in <surfxml_host>");}  surfxml_host_availability_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_availability);
        YY_BREAK
-case 205:
-/* rule 205 can match eol */
+case 188:
+/* rule 188 can match eol */
 YY_RULE_SETUP
 if (surfxml_host_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in <surfxml_host>");} surfxml_host_availability___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_availability___file);
        YY_BREAK
-case 206:
-/* rule 206 can match eol */
+case 189:
+/* rule 189 can match eol */
 YY_RULE_SETUP
 if (surfxml_host_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in <surfxml_host>");}  surfxml_host_availability___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_availability___file);
        YY_BREAK
-case 207:
-/* rule 207 can match eol */
-case 208:
-/* rule 208 can match eol */
+case 190:
+/* rule 190 can match eol */
+case 191:
+/* rule 191 can match eol */
 YY_RULE_SETUP
 A_surfxml_host_state = A_surfxml_host_state_ON;
        YY_BREAK
-case 209:
-/* rule 209 can match eol */
-case 210:
-/* rule 210 can match eol */
+case 192:
+/* rule 192 can match eol */
+case 193:
+/* rule 193 can match eol */
 YY_RULE_SETUP
 A_surfxml_host_state = A_surfxml_host_state_OFF;
        YY_BREAK
-case 211:
-/* rule 211 can match eol */
+case 194:
+/* rule 194 can match eol */
 YY_RULE_SETUP
 if (surfxml_host_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_host>");} surfxml_host_state___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_state___file);
        YY_BREAK
-case 212:
-/* rule 212 can match eol */
+case 195:
+/* rule 195 can match eol */
 YY_RULE_SETUP
 if (surfxml_host_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_host>");}  surfxml_host_state___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_state___file);
        YY_BREAK
-case 213:
-/* rule 213 can match eol */
+case 196:
+/* rule 196 can match eol */
 YY_RULE_SETUP
 if (surfxml_host_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in <surfxml_host>");} surfxml_host_coordinates_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_coordinates);
        YY_BREAK
-case 214:
-/* rule 214 can match eol */
+case 197:
+/* rule 197 can match eol */
 YY_RULE_SETUP
 if (surfxml_host_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in <surfxml_host>");}  surfxml_host_coordinates_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_coordinates);
        YY_BREAK
-case 215:
-/* rule 215 can match eol */
+case 198:
+/* rule 198 can match eol */
 YY_RULE_SETUP
 if (surfxml_host_pstate_isset != 0) {FAIL("Multiple definition of attribute pstate in <surfxml_host>");} surfxml_host_pstate_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_pstate);
        YY_BREAK
-case 216:
-/* rule 216 can match eol */
+case 199:
+/* rule 199 can match eol */
 YY_RULE_SETUP
 if (surfxml_host_pstate_isset != 0) {FAIL("Multiple definition of attribute pstate in <surfxml_host>");}  surfxml_host_pstate_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_pstate);
        YY_BREAK
-case 217:
+case 200:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_host_id) FAIL("Required attribute `id' not set for `host' element.");
@@ -7157,7 +7054,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_host();surfxml_pcdata_ix = 0; ENTER(S_surfxml_host);
  }
        YY_BREAK
-case 218:
+case 201:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_host_id) FAIL("Required attribute `id' not set for `host' element.");
@@ -7168,11 +7065,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 219:
+case 202:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of host element.", surf_parse_text[0]);
        YY_BREAK
-case 220:
+case 203:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `host' element start tag.",surf_parse_text);
        YY_BREAK
@@ -7180,8 +7077,8 @@ case YY_STATE_EOF(AL_surfxml_host):
 FAIL("EOF in attribute list of `host' element.");
        YY_BREAK
 
-case 221:
-/* rule 221 can match eol */
+case 204:
+/* rule 204 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -7192,12 +7089,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 222:
-/* rule 222 can match eol */
+case 205:
+/* rule 205 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</host>' expected.",surf_parse_text);
        YY_BREAK
-case 223:
+case 206:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</host>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -7207,13 +7104,148 @@ case YY_STATE_EOF(S_surfxml_host_2):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</host>' expected.");
        YY_BREAK
 
+case 207:
+/* rule 207 can match eol */
+YY_RULE_SETUP
+FAIL("Starting tag <storage> is not allowed here.");
+       YY_BREAK
+case 208:
+/* rule 208 can match eol */
+YY_RULE_SETUP
+{
+  AX_surfxml_storage_id = 0;
+  surfxml_storage_id_isset = 0;
+  AX_surfxml_storage_typeId = 0;
+  surfxml_storage_typeId_isset = 0;
+  AX_surfxml_storage_content = 0;
+  surfxml_storage_content_isset = 0;
+  AX_surfxml_storage_content___type = 35;
+  surfxml_storage_content___type_isset = 0;
+  AX_surfxml_storage_attach = 0;
+  surfxml_storage_attach_isset = 0;
+  ENTER(AL_surfxml_storage); pushbuffer(0);
+  }
+       YY_BREAK
+
+case 209:
+/* rule 209 can match eol */
+YY_RULE_SETUP
+if (surfxml_storage_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_storage>");} surfxml_storage_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_id);
+       YY_BREAK
+case 210:
+/* rule 210 can match eol */
+YY_RULE_SETUP
+if (surfxml_storage_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_storage>");}  surfxml_storage_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_id);
+       YY_BREAK
+case 211:
+/* rule 211 can match eol */
+YY_RULE_SETUP
+if (surfxml_storage_typeId_isset != 0) {FAIL("Multiple definition of attribute typeId in <surfxml_storage>");} surfxml_storage_typeId_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_typeId);
+       YY_BREAK
+case 212:
+/* rule 212 can match eol */
+YY_RULE_SETUP
+if (surfxml_storage_typeId_isset != 0) {FAIL("Multiple definition of attribute typeId in <surfxml_storage>");}  surfxml_storage_typeId_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_typeId);
+       YY_BREAK
+case 213:
+/* rule 213 can match eol */
+YY_RULE_SETUP
+if (surfxml_storage_content_isset != 0) {FAIL("Multiple definition of attribute content in <surfxml_storage>");} surfxml_storage_content_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_content);
+       YY_BREAK
+case 214:
+/* rule 214 can match eol */
+YY_RULE_SETUP
+if (surfxml_storage_content_isset != 0) {FAIL("Multiple definition of attribute content in <surfxml_storage>");}  surfxml_storage_content_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_content);
+       YY_BREAK
+case 215:
+/* rule 215 can match eol */
+YY_RULE_SETUP
+if (surfxml_storage_content___type_isset != 0) {FAIL("Multiple definition of attribute content_type in <surfxml_storage>");} surfxml_storage_content___type_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_content___type);
+       YY_BREAK
+case 216:
+/* rule 216 can match eol */
+YY_RULE_SETUP
+if (surfxml_storage_content___type_isset != 0) {FAIL("Multiple definition of attribute content_type in <surfxml_storage>");}  surfxml_storage_content___type_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_content___type);
+       YY_BREAK
+case 217:
+/* rule 217 can match eol */
+YY_RULE_SETUP
+if (surfxml_storage_attach_isset != 0) {FAIL("Multiple definition of attribute attach in <surfxml_storage>");} surfxml_storage_attach_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_attach);
+       YY_BREAK
+case 218:
+/* rule 218 can match eol */
+YY_RULE_SETUP
+if (surfxml_storage_attach_isset != 0) {FAIL("Multiple definition of attribute attach in <surfxml_storage>");}  surfxml_storage_attach_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_attach);
+       YY_BREAK
+case 219:
+YY_RULE_SETUP
+{
+  if (!AX_surfxml_storage_id) FAIL("Required attribute `id' not set for `storage' element.");
+  if (!AX_surfxml_storage_typeId) FAIL("Required attribute `typeId' not set for `storage' element.");
+  if (!AX_surfxml_storage_attach) FAIL("Required attribute `attach' not set for `storage' element.");
+  LEAVE; STag_surfxml_storage();surfxml_pcdata_ix = 0; ENTER(S_surfxml_storage);
+ }
+       YY_BREAK
+case 220:
+YY_RULE_SETUP
+{
+  if (!AX_surfxml_storage_id) FAIL("Required attribute `id' not set for `storage' element.");
+  if (!AX_surfxml_storage_typeId) FAIL("Required attribute `typeId' not set for `storage' element.");
+  if (!AX_surfxml_storage_attach) FAIL("Required attribute `attach' not set for `storage' element.");
+  LEAVE; STag_surfxml_storage(); surfxml_pcdata_ix = 0; ETag_surfxml_storage(); popbuffer(); /* attribute */
+  switch (YY_START) {
+   case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
+   case S_surfxml_AS_1: case S_surfxml_AS_14: case S_surfxml_AS_13: case S_surfxml_AS: case S_surfxml_AS_3: SET(S_surfxml_AS_14); break;
+  }
+ }
+       YY_BREAK
+case 221:
+YY_RULE_SETUP
+FAIL("Unexpected character `%c' in attribute list of storage element.", surf_parse_text[0]);
+       YY_BREAK
+case 222:
+YY_RULE_SETUP
+FAIL("Bad attribute `%s' in `storage' element start tag.",surf_parse_text);
+       YY_BREAK
+case YY_STATE_EOF(AL_surfxml_storage):
+FAIL("EOF in attribute list of `storage' element.");
+       YY_BREAK
+
+case 223:
+/* rule 223 can match eol */
+YY_RULE_SETUP
+{
+  LEAVE;
+  ETag_surfxml_storage();
+  popbuffer(); /* attribute */
+  switch (YY_START) {
+   case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
+   case S_surfxml_AS_1: case S_surfxml_AS_14: case S_surfxml_AS_13: case S_surfxml_AS: case S_surfxml_AS_3: SET(S_surfxml_AS_14); break;
+  }
+ }
+       YY_BREAK
 case 224:
 /* rule 224 can match eol */
 YY_RULE_SETUP
-FAIL("Starting tag <gpu> is not allowed here.");
+FAIL("Unexpected end-tag `%s': `</storage>' expected.",surf_parse_text);
        YY_BREAK
 case 225:
-/* rule 225 can match eol */
+YY_RULE_SETUP
+FAIL("Unexpected character `%c': `</storage>' expected.",surf_parse_text[0]);
+       YY_BREAK
+case YY_STATE_EOF(E_surfxml_storage):
+case YY_STATE_EOF(S_surfxml_storage):
+case YY_STATE_EOF(S_surfxml_storage_2):
+if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</storage>' expected.");
+       YY_BREAK
+
+case 226:
+/* rule 226 can match eol */
+YY_RULE_SETUP
+FAIL("Starting tag <gpu> is not allowed here.");
+       YY_BREAK
+case 227:
+/* rule 227 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_gpu_name = 0;
@@ -7222,24 +7254,24 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 226:
-/* rule 226 can match eol */
+case 228:
+/* rule 228 can match eol */
 YY_RULE_SETUP
 if (surfxml_gpu_name_isset != 0) {FAIL("Multiple definition of attribute name in <surfxml_gpu>");} surfxml_gpu_name_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_gpu_name);
        YY_BREAK
-case 227:
-/* rule 227 can match eol */
+case 229:
+/* rule 229 can match eol */
 YY_RULE_SETUP
 if (surfxml_gpu_name_isset != 0) {FAIL("Multiple definition of attribute name in <surfxml_gpu>");}  surfxml_gpu_name_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_gpu_name);
        YY_BREAK
-case 228:
+case 230:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_gpu_name) FAIL("Required attribute `name' not set for `gpu' element.");
   LEAVE; STag_surfxml_gpu();surfxml_pcdata_ix = 0; ENTER(E_surfxml_gpu);
  }
        YY_BREAK
-case 229:
+case 231:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_gpu_name) FAIL("Required attribute `name' not set for `gpu' element.");
@@ -7249,11 +7281,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 230:
+case 232:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of gpu element.", surf_parse_text[0]);
        YY_BREAK
-case 231:
+case 233:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `gpu' element start tag.",surf_parse_text);
        YY_BREAK
@@ -7261,8 +7293,8 @@ case YY_STATE_EOF(AL_surfxml_gpu):
 FAIL("EOF in attribute list of `gpu' element.");
        YY_BREAK
 
-case 232:
-/* rule 232 can match eol */
+case 234:
+/* rule 234 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -7273,12 +7305,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 233:
-/* rule 233 can match eol */
+case 235:
+/* rule 235 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</gpu>' expected.",surf_parse_text);
        YY_BREAK
-case 234:
+case 236:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</gpu>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -7286,13 +7318,13 @@ case YY_STATE_EOF(E_surfxml_gpu):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</gpu>' expected.");
        YY_BREAK
 
-case 235:
-/* rule 235 can match eol */
+case 237:
+/* rule 237 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <host_link> is not allowed here.");
        YY_BREAK
-case 236:
-/* rule 236 can match eol */
+case 238:
+/* rule 238 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_host___link_id = 0;
@@ -7305,37 +7337,37 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 237:
-/* rule 237 can match eol */
+case 239:
+/* rule 239 can match eol */
 YY_RULE_SETUP
 if (surfxml_host___link_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_host___link>");} surfxml_host___link_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host___link_id);
        YY_BREAK
-case 238:
-/* rule 238 can match eol */
+case 240:
+/* rule 240 can match eol */
 YY_RULE_SETUP
 if (surfxml_host___link_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_host___link>");}  surfxml_host___link_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host___link_id);
        YY_BREAK
-case 239:
-/* rule 239 can match eol */
+case 241:
+/* rule 241 can match eol */
 YY_RULE_SETUP
 if (surfxml_host___link_up_isset != 0) {FAIL("Multiple definition of attribute up in <surfxml_host___link>");} surfxml_host___link_up_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host___link_up);
        YY_BREAK
-case 240:
-/* rule 240 can match eol */
+case 242:
+/* rule 242 can match eol */
 YY_RULE_SETUP
 if (surfxml_host___link_up_isset != 0) {FAIL("Multiple definition of attribute up in <surfxml_host___link>");}  surfxml_host___link_up_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host___link_up);
        YY_BREAK
-case 241:
-/* rule 241 can match eol */
+case 243:
+/* rule 243 can match eol */
 YY_RULE_SETUP
 if (surfxml_host___link_down_isset != 0) {FAIL("Multiple definition of attribute down in <surfxml_host___link>");} surfxml_host___link_down_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host___link_down);
        YY_BREAK
-case 242:
-/* rule 242 can match eol */
+case 244:
+/* rule 244 can match eol */
 YY_RULE_SETUP
 if (surfxml_host___link_down_isset != 0) {FAIL("Multiple definition of attribute down in <surfxml_host___link>");}  surfxml_host___link_down_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host___link_down);
        YY_BREAK
-case 243:
+case 245:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_host___link_id) FAIL("Required attribute `id' not set for `host_link' element.");
@@ -7344,7 +7376,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_host___link();surfxml_pcdata_ix = 0; ENTER(E_surfxml_host___link);
  }
        YY_BREAK
-case 244:
+case 246:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_host___link_id) FAIL("Required attribute `id' not set for `host_link' element.");
@@ -7356,11 +7388,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 245:
+case 247:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of host_link element.", surf_parse_text[0]);
        YY_BREAK
-case 246:
+case 248:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `host_link' element start tag.",surf_parse_text);
        YY_BREAK
@@ -7368,8 +7400,8 @@ case YY_STATE_EOF(AL_surfxml_host___link):
 FAIL("EOF in attribute list of `host_link' element.");
        YY_BREAK
 
-case 247:
-/* rule 247 can match eol */
+case 249:
+/* rule 249 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -7380,12 +7412,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 248:
-/* rule 248 can match eol */
+case 250:
+/* rule 250 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</host_link>' expected.",surf_parse_text);
        YY_BREAK
-case 249:
+case 251:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</host_link>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -7393,13 +7425,13 @@ case YY_STATE_EOF(E_surfxml_host___link):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</host_link>' expected.");
        YY_BREAK
 
-case 250:
-/* rule 250 can match eol */
+case 252:
+/* rule 252 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <cluster> is not allowed here.");
        YY_BREAK
-case 251:
-/* rule 251 can match eol */
+case 253:
+/* rule 253 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_cluster_id = 0;
@@ -7446,226 +7478,226 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 252:
-/* rule 252 can match eol */
-YY_RULE_SETUP
-if (surfxml_cluster_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_cluster>");} surfxml_cluster_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_id);
-       YY_BREAK
-case 253:
-/* rule 253 can match eol */
-YY_RULE_SETUP
-if (surfxml_cluster_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_cluster>");}  surfxml_cluster_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_id);
-       YY_BREAK
 case 254:
 /* rule 254 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in <surfxml_cluster>");} surfxml_cluster_prefix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_prefix);
+if (surfxml_cluster_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_cluster>");} surfxml_cluster_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_id);
        YY_BREAK
 case 255:
 /* rule 255 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in <surfxml_cluster>");}  surfxml_cluster_prefix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_prefix);
+if (surfxml_cluster_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_cluster>");}  surfxml_cluster_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_id);
        YY_BREAK
 case 256:
 /* rule 256 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in <surfxml_cluster>");} surfxml_cluster_suffix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_suffix);
+if (surfxml_cluster_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in <surfxml_cluster>");} surfxml_cluster_prefix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_prefix);
        YY_BREAK
 case 257:
 /* rule 257 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in <surfxml_cluster>");}  surfxml_cluster_suffix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_suffix);
+if (surfxml_cluster_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in <surfxml_cluster>");}  surfxml_cluster_prefix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_prefix);
        YY_BREAK
 case 258:
 /* rule 258 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_radical_isset != 0) {FAIL("Multiple definition of attribute radical in <surfxml_cluster>");} surfxml_cluster_radical_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_radical);
+if (surfxml_cluster_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in <surfxml_cluster>");} surfxml_cluster_suffix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_suffix);
        YY_BREAK
 case 259:
 /* rule 259 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_radical_isset != 0) {FAIL("Multiple definition of attribute radical in <surfxml_cluster>");}  surfxml_cluster_radical_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_radical);
+if (surfxml_cluster_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in <surfxml_cluster>");}  surfxml_cluster_suffix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_suffix);
        YY_BREAK
 case 260:
 /* rule 260 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_cluster>");} surfxml_cluster_power_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_power);
+if (surfxml_cluster_radical_isset != 0) {FAIL("Multiple definition of attribute radical in <surfxml_cluster>");} surfxml_cluster_radical_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_radical);
        YY_BREAK
 case 261:
 /* rule 261 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_cluster>");}  surfxml_cluster_power_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_power);
+if (surfxml_cluster_radical_isset != 0) {FAIL("Multiple definition of attribute radical in <surfxml_cluster>");}  surfxml_cluster_radical_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_radical);
        YY_BREAK
 case 262:
 /* rule 262 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_core_isset != 0) {FAIL("Multiple definition of attribute core in <surfxml_cluster>");} surfxml_cluster_core_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_core);
+if (surfxml_cluster_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_cluster>");} surfxml_cluster_power_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_power);
        YY_BREAK
 case 263:
 /* rule 263 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_core_isset != 0) {FAIL("Multiple definition of attribute core in <surfxml_cluster>");}  surfxml_cluster_core_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_core);
+if (surfxml_cluster_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_cluster>");}  surfxml_cluster_power_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_power);
        YY_BREAK
 case 264:
 /* rule 264 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_bw_isset != 0) {FAIL("Multiple definition of attribute bw in <surfxml_cluster>");} surfxml_cluster_bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bw);
+if (surfxml_cluster_core_isset != 0) {FAIL("Multiple definition of attribute core in <surfxml_cluster>");} surfxml_cluster_core_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_core);
        YY_BREAK
 case 265:
 /* rule 265 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_bw_isset != 0) {FAIL("Multiple definition of attribute bw in <surfxml_cluster>");}  surfxml_cluster_bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bw);
+if (surfxml_cluster_core_isset != 0) {FAIL("Multiple definition of attribute core in <surfxml_cluster>");}  surfxml_cluster_core_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_core);
        YY_BREAK
 case 266:
 /* rule 266 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_lat_isset != 0) {FAIL("Multiple definition of attribute lat in <surfxml_cluster>");} surfxml_cluster_lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_lat);
+if (surfxml_cluster_bw_isset != 0) {FAIL("Multiple definition of attribute bw in <surfxml_cluster>");} surfxml_cluster_bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bw);
        YY_BREAK
 case 267:
 /* rule 267 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_lat_isset != 0) {FAIL("Multiple definition of attribute lat in <surfxml_cluster>");}  surfxml_cluster_lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_lat);
+if (surfxml_cluster_bw_isset != 0) {FAIL("Multiple definition of attribute bw in <surfxml_cluster>");}  surfxml_cluster_bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bw);
        YY_BREAK
 case 268:
 /* rule 268 can match eol */
+YY_RULE_SETUP
+if (surfxml_cluster_lat_isset != 0) {FAIL("Multiple definition of attribute lat in <surfxml_cluster>");} surfxml_cluster_lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_lat);
+       YY_BREAK
 case 269:
 /* rule 269 can match eol */
 YY_RULE_SETUP
-A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_SHARED;
+if (surfxml_cluster_lat_isset != 0) {FAIL("Multiple definition of attribute lat in <surfxml_cluster>");}  surfxml_cluster_lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_lat);
        YY_BREAK
 case 270:
 /* rule 270 can match eol */
 case 271:
 /* rule 271 can match eol */
 YY_RULE_SETUP
-A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_FULLDUPLEX;
+A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_SHARED;
        YY_BREAK
 case 272:
 /* rule 272 can match eol */
 case 273:
 /* rule 273 can match eol */
 YY_RULE_SETUP
-A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_FATPIPE;
+A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_FULLDUPLEX;
        YY_BREAK
 case 274:
 /* rule 274 can match eol */
 case 275:
 /* rule 275 can match eol */
 YY_RULE_SETUP
-A_surfxml_cluster_topology = A_surfxml_cluster_topology_FLAT;
+A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_FATPIPE;
        YY_BREAK
 case 276:
 /* rule 276 can match eol */
 case 277:
 /* rule 277 can match eol */
 YY_RULE_SETUP
-A_surfxml_cluster_topology = A_surfxml_cluster_topology_TORUS;
+A_surfxml_cluster_topology = A_surfxml_cluster_topology_FLAT;
        YY_BREAK
 case 278:
 /* rule 278 can match eol */
-YY_RULE_SETUP
-if (surfxml_cluster_topo___parameters_isset != 0) {FAIL("Multiple definition of attribute topo_parameters in <surfxml_cluster>");} surfxml_cluster_topo___parameters_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_topo___parameters);
-       YY_BREAK
 case 279:
 /* rule 279 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_topo___parameters_isset != 0) {FAIL("Multiple definition of attribute topo_parameters in <surfxml_cluster>");}  surfxml_cluster_topo___parameters_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_topo___parameters);
+A_surfxml_cluster_topology = A_surfxml_cluster_topology_TORUS;
        YY_BREAK
 case 280:
 /* rule 280 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_bb___bw_isset != 0) {FAIL("Multiple definition of attribute bb_bw in <surfxml_cluster>");} surfxml_cluster_bb___bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bb___bw);
+if (surfxml_cluster_topo___parameters_isset != 0) {FAIL("Multiple definition of attribute topo_parameters in <surfxml_cluster>");} surfxml_cluster_topo___parameters_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_topo___parameters);
        YY_BREAK
 case 281:
 /* rule 281 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_bb___bw_isset != 0) {FAIL("Multiple definition of attribute bb_bw in <surfxml_cluster>");}  surfxml_cluster_bb___bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bb___bw);
+if (surfxml_cluster_topo___parameters_isset != 0) {FAIL("Multiple definition of attribute topo_parameters in <surfxml_cluster>");}  surfxml_cluster_topo___parameters_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_topo___parameters);
        YY_BREAK
 case 282:
 /* rule 282 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_bb___lat_isset != 0) {FAIL("Multiple definition of attribute bb_lat in <surfxml_cluster>");} surfxml_cluster_bb___lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bb___lat);
+if (surfxml_cluster_bb___bw_isset != 0) {FAIL("Multiple definition of attribute bb_bw in <surfxml_cluster>");} surfxml_cluster_bb___bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bb___bw);
        YY_BREAK
 case 283:
 /* rule 283 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_bb___lat_isset != 0) {FAIL("Multiple definition of attribute bb_lat in <surfxml_cluster>");}  surfxml_cluster_bb___lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bb___lat);
+if (surfxml_cluster_bb___bw_isset != 0) {FAIL("Multiple definition of attribute bb_bw in <surfxml_cluster>");}  surfxml_cluster_bb___bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bb___bw);
        YY_BREAK
 case 284:
 /* rule 284 can match eol */
+YY_RULE_SETUP
+if (surfxml_cluster_bb___lat_isset != 0) {FAIL("Multiple definition of attribute bb_lat in <surfxml_cluster>");} surfxml_cluster_bb___lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bb___lat);
+       YY_BREAK
 case 285:
 /* rule 285 can match eol */
 YY_RULE_SETUP
-A_surfxml_cluster_bb___sharing___policy = A_surfxml_cluster_bb___sharing___policy_SHARED;
+if (surfxml_cluster_bb___lat_isset != 0) {FAIL("Multiple definition of attribute bb_lat in <surfxml_cluster>");}  surfxml_cluster_bb___lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bb___lat);
        YY_BREAK
 case 286:
 /* rule 286 can match eol */
 case 287:
 /* rule 287 can match eol */
 YY_RULE_SETUP
-A_surfxml_cluster_bb___sharing___policy = A_surfxml_cluster_bb___sharing___policy_FATPIPE;
+A_surfxml_cluster_bb___sharing___policy = A_surfxml_cluster_bb___sharing___policy_SHARED;
        YY_BREAK
 case 288:
 /* rule 288 can match eol */
-YY_RULE_SETUP
-if (surfxml_cluster_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in <surfxml_cluster>");} surfxml_cluster_availability___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_availability___file);
-       YY_BREAK
 case 289:
 /* rule 289 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in <surfxml_cluster>");}  surfxml_cluster_availability___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_availability___file);
+A_surfxml_cluster_bb___sharing___policy = A_surfxml_cluster_bb___sharing___policy_FATPIPE;
        YY_BREAK
 case 290:
 /* rule 290 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_cluster>");} surfxml_cluster_state___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_state___file);
+if (surfxml_cluster_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in <surfxml_cluster>");} surfxml_cluster_availability___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_availability___file);
        YY_BREAK
 case 291:
 /* rule 291 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_cluster>");}  surfxml_cluster_state___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_state___file);
+if (surfxml_cluster_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in <surfxml_cluster>");}  surfxml_cluster_availability___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_availability___file);
        YY_BREAK
 case 292:
 /* rule 292 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_router___id_isset != 0) {FAIL("Multiple definition of attribute router_id in <surfxml_cluster>");} surfxml_cluster_router___id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_router___id);
+if (surfxml_cluster_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_cluster>");} surfxml_cluster_state___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_state___file);
        YY_BREAK
 case 293:
 /* rule 293 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_router___id_isset != 0) {FAIL("Multiple definition of attribute router_id in <surfxml_cluster>");}  surfxml_cluster_router___id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_router___id);
+if (surfxml_cluster_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_cluster>");}  surfxml_cluster_state___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_state___file);
        YY_BREAK
 case 294:
 /* rule 294 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_limiter___link_isset != 0) {FAIL("Multiple definition of attribute limiter_link in <surfxml_cluster>");} surfxml_cluster_limiter___link_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_limiter___link);
+if (surfxml_cluster_router___id_isset != 0) {FAIL("Multiple definition of attribute router_id in <surfxml_cluster>");} surfxml_cluster_router___id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_router___id);
        YY_BREAK
 case 295:
 /* rule 295 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_limiter___link_isset != 0) {FAIL("Multiple definition of attribute limiter_link in <surfxml_cluster>");}  surfxml_cluster_limiter___link_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_limiter___link);
+if (surfxml_cluster_router___id_isset != 0) {FAIL("Multiple definition of attribute router_id in <surfxml_cluster>");}  surfxml_cluster_router___id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_router___id);
        YY_BREAK
 case 296:
 /* rule 296 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_loopback___bw_isset != 0) {FAIL("Multiple definition of attribute loopback_bw in <surfxml_cluster>");} surfxml_cluster_loopback___bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_loopback___bw);
+if (surfxml_cluster_limiter___link_isset != 0) {FAIL("Multiple definition of attribute limiter_link in <surfxml_cluster>");} surfxml_cluster_limiter___link_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_limiter___link);
        YY_BREAK
 case 297:
 /* rule 297 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_loopback___bw_isset != 0) {FAIL("Multiple definition of attribute loopback_bw in <surfxml_cluster>");}  surfxml_cluster_loopback___bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_loopback___bw);
+if (surfxml_cluster_limiter___link_isset != 0) {FAIL("Multiple definition of attribute limiter_link in <surfxml_cluster>");}  surfxml_cluster_limiter___link_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_limiter___link);
        YY_BREAK
 case 298:
 /* rule 298 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_loopback___lat_isset != 0) {FAIL("Multiple definition of attribute loopback_lat in <surfxml_cluster>");} surfxml_cluster_loopback___lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_loopback___lat);
+if (surfxml_cluster_loopback___bw_isset != 0) {FAIL("Multiple definition of attribute loopback_bw in <surfxml_cluster>");} surfxml_cluster_loopback___bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_loopback___bw);
        YY_BREAK
 case 299:
 /* rule 299 can match eol */
 YY_RULE_SETUP
-if (surfxml_cluster_loopback___lat_isset != 0) {FAIL("Multiple definition of attribute loopback_lat in <surfxml_cluster>");}  surfxml_cluster_loopback___lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_loopback___lat);
+if (surfxml_cluster_loopback___bw_isset != 0) {FAIL("Multiple definition of attribute loopback_bw in <surfxml_cluster>");}  surfxml_cluster_loopback___bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_loopback___bw);
        YY_BREAK
 case 300:
+/* rule 300 can match eol */
+YY_RULE_SETUP
+if (surfxml_cluster_loopback___lat_isset != 0) {FAIL("Multiple definition of attribute loopback_lat in <surfxml_cluster>");} surfxml_cluster_loopback___lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_loopback___lat);
+       YY_BREAK
+case 301:
+/* rule 301 can match eol */
+YY_RULE_SETUP
+if (surfxml_cluster_loopback___lat_isset != 0) {FAIL("Multiple definition of attribute loopback_lat in <surfxml_cluster>");}  surfxml_cluster_loopback___lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_loopback___lat);
+       YY_BREAK
+case 302:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_cluster_id) FAIL("Required attribute `id' not set for `cluster' element.");
@@ -7678,7 +7710,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_cluster();surfxml_pcdata_ix = 0; ENTER(S_surfxml_cluster);
  }
        YY_BREAK
-case 301:
+case 303:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_cluster_id) FAIL("Required attribute `id' not set for `cluster' element.");
@@ -7696,11 +7728,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 302:
+case 304:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of cluster element.", surf_parse_text[0]);
        YY_BREAK
-case 303:
+case 305:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `cluster' element start tag.",surf_parse_text);
        YY_BREAK
@@ -7708,8 +7740,8 @@ case YY_STATE_EOF(AL_surfxml_cluster):
 FAIL("EOF in attribute list of `cluster' element.");
        YY_BREAK
 
-case 304:
-/* rule 304 can match eol */
+case 306:
+/* rule 306 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -7722,12 +7754,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 305:
-/* rule 305 can match eol */
+case 307:
+/* rule 307 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</cluster>' expected.",surf_parse_text);
        YY_BREAK
-case 306:
+case 308:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</cluster>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -7737,13 +7769,13 @@ case YY_STATE_EOF(E_surfxml_cluster):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</cluster>' expected.");
        YY_BREAK
 
-case 307:
-/* rule 307 can match eol */
+case 309:
+/* rule 309 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <cabinet> is not allowed here.");
        YY_BREAK
-case 308:
-/* rule 308 can match eol */
+case 310:
+/* rule 310 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_cabinet_id = 0;
@@ -7764,77 +7796,77 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 309:
-/* rule 309 can match eol */
-YY_RULE_SETUP
-if (surfxml_cabinet_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_cabinet>");} surfxml_cabinet_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_id);
-       YY_BREAK
-case 310:
-/* rule 310 can match eol */
-YY_RULE_SETUP
-if (surfxml_cabinet_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_cabinet>");}  surfxml_cabinet_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_id);
-       YY_BREAK
 case 311:
 /* rule 311 can match eol */
 YY_RULE_SETUP
-if (surfxml_cabinet_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in <surfxml_cabinet>");} surfxml_cabinet_prefix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_prefix);
+if (surfxml_cabinet_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_cabinet>");} surfxml_cabinet_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_id);
        YY_BREAK
 case 312:
 /* rule 312 can match eol */
 YY_RULE_SETUP
-if (surfxml_cabinet_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in <surfxml_cabinet>");}  surfxml_cabinet_prefix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_prefix);
+if (surfxml_cabinet_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_cabinet>");}  surfxml_cabinet_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_id);
        YY_BREAK
 case 313:
 /* rule 313 can match eol */
 YY_RULE_SETUP
-if (surfxml_cabinet_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in <surfxml_cabinet>");} surfxml_cabinet_suffix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_suffix);
+if (surfxml_cabinet_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in <surfxml_cabinet>");} surfxml_cabinet_prefix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_prefix);
        YY_BREAK
 case 314:
 /* rule 314 can match eol */
 YY_RULE_SETUP
-if (surfxml_cabinet_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in <surfxml_cabinet>");}  surfxml_cabinet_suffix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_suffix);
+if (surfxml_cabinet_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in <surfxml_cabinet>");}  surfxml_cabinet_prefix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_prefix);
        YY_BREAK
 case 315:
 /* rule 315 can match eol */
 YY_RULE_SETUP
-if (surfxml_cabinet_radical_isset != 0) {FAIL("Multiple definition of attribute radical in <surfxml_cabinet>");} surfxml_cabinet_radical_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_radical);
+if (surfxml_cabinet_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in <surfxml_cabinet>");} surfxml_cabinet_suffix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_suffix);
        YY_BREAK
 case 316:
 /* rule 316 can match eol */
 YY_RULE_SETUP
-if (surfxml_cabinet_radical_isset != 0) {FAIL("Multiple definition of attribute radical in <surfxml_cabinet>");}  surfxml_cabinet_radical_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_radical);
+if (surfxml_cabinet_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in <surfxml_cabinet>");}  surfxml_cabinet_suffix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_suffix);
        YY_BREAK
 case 317:
 /* rule 317 can match eol */
 YY_RULE_SETUP
-if (surfxml_cabinet_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_cabinet>");} surfxml_cabinet_power_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_power);
+if (surfxml_cabinet_radical_isset != 0) {FAIL("Multiple definition of attribute radical in <surfxml_cabinet>");} surfxml_cabinet_radical_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_radical);
        YY_BREAK
 case 318:
 /* rule 318 can match eol */
 YY_RULE_SETUP
-if (surfxml_cabinet_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_cabinet>");}  surfxml_cabinet_power_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_power);
+if (surfxml_cabinet_radical_isset != 0) {FAIL("Multiple definition of attribute radical in <surfxml_cabinet>");}  surfxml_cabinet_radical_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_radical);
        YY_BREAK
 case 319:
 /* rule 319 can match eol */
 YY_RULE_SETUP
-if (surfxml_cabinet_bw_isset != 0) {FAIL("Multiple definition of attribute bw in <surfxml_cabinet>");} surfxml_cabinet_bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_bw);
+if (surfxml_cabinet_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_cabinet>");} surfxml_cabinet_power_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_power);
        YY_BREAK
 case 320:
 /* rule 320 can match eol */
 YY_RULE_SETUP
-if (surfxml_cabinet_bw_isset != 0) {FAIL("Multiple definition of attribute bw in <surfxml_cabinet>");}  surfxml_cabinet_bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_bw);
+if (surfxml_cabinet_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_cabinet>");}  surfxml_cabinet_power_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_power);
        YY_BREAK
 case 321:
 /* rule 321 can match eol */
 YY_RULE_SETUP
-if (surfxml_cabinet_lat_isset != 0) {FAIL("Multiple definition of attribute lat in <surfxml_cabinet>");} surfxml_cabinet_lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_lat);
+if (surfxml_cabinet_bw_isset != 0) {FAIL("Multiple definition of attribute bw in <surfxml_cabinet>");} surfxml_cabinet_bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_bw);
        YY_BREAK
 case 322:
 /* rule 322 can match eol */
 YY_RULE_SETUP
-if (surfxml_cabinet_lat_isset != 0) {FAIL("Multiple definition of attribute lat in <surfxml_cabinet>");}  surfxml_cabinet_lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_lat);
+if (surfxml_cabinet_bw_isset != 0) {FAIL("Multiple definition of attribute bw in <surfxml_cabinet>");}  surfxml_cabinet_bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_bw);
        YY_BREAK
 case 323:
+/* rule 323 can match eol */
+YY_RULE_SETUP
+if (surfxml_cabinet_lat_isset != 0) {FAIL("Multiple definition of attribute lat in <surfxml_cabinet>");} surfxml_cabinet_lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_lat);
+       YY_BREAK
+case 324:
+/* rule 324 can match eol */
+YY_RULE_SETUP
+if (surfxml_cabinet_lat_isset != 0) {FAIL("Multiple definition of attribute lat in <surfxml_cabinet>");}  surfxml_cabinet_lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_lat);
+       YY_BREAK
+case 325:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_cabinet_id) FAIL("Required attribute `id' not set for `cabinet' element.");
@@ -7847,7 +7879,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_cabinet();surfxml_pcdata_ix = 0; ENTER(E_surfxml_cabinet);
  }
        YY_BREAK
-case 324:
+case 326:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_cabinet_id) FAIL("Required attribute `id' not set for `cabinet' element.");
@@ -7866,11 +7898,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 325:
+case 327:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of cabinet element.", surf_parse_text[0]);
        YY_BREAK
-case 326:
+case 328:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `cabinet' element start tag.",surf_parse_text);
        YY_BREAK
@@ -7878,8 +7910,8 @@ case YY_STATE_EOF(AL_surfxml_cabinet):
 FAIL("EOF in attribute list of `cabinet' element.");
        YY_BREAK
 
-case 327:
-/* rule 327 can match eol */
+case 329:
+/* rule 329 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -7893,12 +7925,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 328:
-/* rule 328 can match eol */
+case 330:
+/* rule 330 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</cabinet>' expected.",surf_parse_text);
        YY_BREAK
-case 329:
+case 331:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</cabinet>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -7906,13 +7938,13 @@ case YY_STATE_EOF(E_surfxml_cabinet):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</cabinet>' expected.");
        YY_BREAK
 
-case 330:
-/* rule 330 can match eol */
+case 332:
+/* rule 332 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <peer> is not allowed here.");
        YY_BREAK
-case 331:
-/* rule 331 can match eol */
+case 333:
+/* rule 333 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_peer_id = 0;
@@ -7935,87 +7967,87 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 332:
-/* rule 332 can match eol */
-YY_RULE_SETUP
-if (surfxml_peer_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_peer>");} surfxml_peer_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_id);
-       YY_BREAK
-case 333:
-/* rule 333 can match eol */
-YY_RULE_SETUP
-if (surfxml_peer_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_peer>");}  surfxml_peer_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_id);
-       YY_BREAK
 case 334:
 /* rule 334 can match eol */
 YY_RULE_SETUP
-if (surfxml_peer_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_peer>");} surfxml_peer_power_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_power);
+if (surfxml_peer_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_peer>");} surfxml_peer_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_id);
        YY_BREAK
 case 335:
 /* rule 335 can match eol */
 YY_RULE_SETUP
-if (surfxml_peer_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_peer>");}  surfxml_peer_power_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_power);
+if (surfxml_peer_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_peer>");}  surfxml_peer_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_id);
        YY_BREAK
 case 336:
 /* rule 336 can match eol */
 YY_RULE_SETUP
-if (surfxml_peer_bw___in_isset != 0) {FAIL("Multiple definition of attribute bw_in in <surfxml_peer>");} surfxml_peer_bw___in_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_bw___in);
+if (surfxml_peer_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_peer>");} surfxml_peer_power_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_power);
        YY_BREAK
 case 337:
 /* rule 337 can match eol */
 YY_RULE_SETUP
-if (surfxml_peer_bw___in_isset != 0) {FAIL("Multiple definition of attribute bw_in in <surfxml_peer>");}  surfxml_peer_bw___in_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_bw___in);
+if (surfxml_peer_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_peer>");}  surfxml_peer_power_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_power);
        YY_BREAK
 case 338:
 /* rule 338 can match eol */
 YY_RULE_SETUP
-if (surfxml_peer_bw___out_isset != 0) {FAIL("Multiple definition of attribute bw_out in <surfxml_peer>");} surfxml_peer_bw___out_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_bw___out);
+if (surfxml_peer_bw___in_isset != 0) {FAIL("Multiple definition of attribute bw_in in <surfxml_peer>");} surfxml_peer_bw___in_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_bw___in);
        YY_BREAK
 case 339:
 /* rule 339 can match eol */
 YY_RULE_SETUP
-if (surfxml_peer_bw___out_isset != 0) {FAIL("Multiple definition of attribute bw_out in <surfxml_peer>");}  surfxml_peer_bw___out_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_bw___out);
+if (surfxml_peer_bw___in_isset != 0) {FAIL("Multiple definition of attribute bw_in in <surfxml_peer>");}  surfxml_peer_bw___in_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_bw___in);
        YY_BREAK
 case 340:
 /* rule 340 can match eol */
 YY_RULE_SETUP
-if (surfxml_peer_lat_isset != 0) {FAIL("Multiple definition of attribute lat in <surfxml_peer>");} surfxml_peer_lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_lat);
+if (surfxml_peer_bw___out_isset != 0) {FAIL("Multiple definition of attribute bw_out in <surfxml_peer>");} surfxml_peer_bw___out_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_bw___out);
        YY_BREAK
 case 341:
 /* rule 341 can match eol */
 YY_RULE_SETUP
-if (surfxml_peer_lat_isset != 0) {FAIL("Multiple definition of attribute lat in <surfxml_peer>");}  surfxml_peer_lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_lat);
+if (surfxml_peer_bw___out_isset != 0) {FAIL("Multiple definition of attribute bw_out in <surfxml_peer>");}  surfxml_peer_bw___out_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_bw___out);
        YY_BREAK
 case 342:
 /* rule 342 can match eol */
 YY_RULE_SETUP
-if (surfxml_peer_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in <surfxml_peer>");} surfxml_peer_coordinates_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_coordinates);
+if (surfxml_peer_lat_isset != 0) {FAIL("Multiple definition of attribute lat in <surfxml_peer>");} surfxml_peer_lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_lat);
        YY_BREAK
 case 343:
 /* rule 343 can match eol */
 YY_RULE_SETUP
-if (surfxml_peer_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in <surfxml_peer>");}  surfxml_peer_coordinates_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_coordinates);
+if (surfxml_peer_lat_isset != 0) {FAIL("Multiple definition of attribute lat in <surfxml_peer>");}  surfxml_peer_lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_lat);
        YY_BREAK
 case 344:
 /* rule 344 can match eol */
 YY_RULE_SETUP
-if (surfxml_peer_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in <surfxml_peer>");} surfxml_peer_availability___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_availability___file);
+if (surfxml_peer_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in <surfxml_peer>");} surfxml_peer_coordinates_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_coordinates);
        YY_BREAK
 case 345:
 /* rule 345 can match eol */
 YY_RULE_SETUP
-if (surfxml_peer_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in <surfxml_peer>");}  surfxml_peer_availability___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_availability___file);
+if (surfxml_peer_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in <surfxml_peer>");}  surfxml_peer_coordinates_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_coordinates);
        YY_BREAK
 case 346:
 /* rule 346 can match eol */
 YY_RULE_SETUP
-if (surfxml_peer_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_peer>");} surfxml_peer_state___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_state___file);
+if (surfxml_peer_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in <surfxml_peer>");} surfxml_peer_availability___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_availability___file);
        YY_BREAK
 case 347:
 /* rule 347 can match eol */
 YY_RULE_SETUP
-if (surfxml_peer_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_peer>");}  surfxml_peer_state___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_state___file);
+if (surfxml_peer_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in <surfxml_peer>");}  surfxml_peer_availability___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_availability___file);
        YY_BREAK
 case 348:
+/* rule 348 can match eol */
+YY_RULE_SETUP
+if (surfxml_peer_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_peer>");} surfxml_peer_state___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_state___file);
+       YY_BREAK
+case 349:
+/* rule 349 can match eol */
+YY_RULE_SETUP
+if (surfxml_peer_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_peer>");}  surfxml_peer_state___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_state___file);
+       YY_BREAK
+case 350:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_peer_id) FAIL("Required attribute `id' not set for `peer' element.");
@@ -8026,7 +8058,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_peer();surfxml_pcdata_ix = 0; ENTER(E_surfxml_peer);
  }
        YY_BREAK
-case 349:
+case 351:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_peer_id) FAIL("Required attribute `id' not set for `peer' element.");
@@ -8042,11 +8074,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 350:
+case 352:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of peer element.", surf_parse_text[0]);
        YY_BREAK
-case 351:
+case 353:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `peer' element start tag.",surf_parse_text);
        YY_BREAK
@@ -8054,8 +8086,8 @@ case YY_STATE_EOF(AL_surfxml_peer):
 FAIL("EOF in attribute list of `peer' element.");
        YY_BREAK
 
-case 352:
-/* rule 352 can match eol */
+case 354:
+/* rule 354 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -8068,12 +8100,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 353:
-/* rule 353 can match eol */
+case 355:
+/* rule 355 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</peer>' expected.",surf_parse_text);
        YY_BREAK
-case 354:
+case 356:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</peer>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -8081,13 +8113,13 @@ case YY_STATE_EOF(E_surfxml_peer):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</peer>' expected.");
        YY_BREAK
 
-case 355:
-/* rule 355 can match eol */
+case 357:
+/* rule 357 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <router> is not allowed here.");
        YY_BREAK
-case 356:
-/* rule 356 can match eol */
+case 358:
+/* rule 358 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_router_id = 0;
@@ -8098,34 +8130,34 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 357:
-/* rule 357 can match eol */
+case 359:
+/* rule 359 can match eol */
 YY_RULE_SETUP
 if (surfxml_router_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_router>");} surfxml_router_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_router_id);
        YY_BREAK
-case 358:
-/* rule 358 can match eol */
+case 360:
+/* rule 360 can match eol */
 YY_RULE_SETUP
 if (surfxml_router_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_router>");}  surfxml_router_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_router_id);
        YY_BREAK
-case 359:
-/* rule 359 can match eol */
+case 361:
+/* rule 361 can match eol */
 YY_RULE_SETUP
 if (surfxml_router_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in <surfxml_router>");} surfxml_router_coordinates_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_router_coordinates);
        YY_BREAK
-case 360:
-/* rule 360 can match eol */
+case 362:
+/* rule 362 can match eol */
 YY_RULE_SETUP
 if (surfxml_router_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in <surfxml_router>");}  surfxml_router_coordinates_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_router_coordinates);
        YY_BREAK
-case 361:
+case 363:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_router_id) FAIL("Required attribute `id' not set for `router' element.");
   LEAVE; STag_surfxml_router();surfxml_pcdata_ix = 0; ENTER(E_surfxml_router);
  }
        YY_BREAK
-case 362:
+case 364:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_router_id) FAIL("Required attribute `id' not set for `router' element.");
@@ -8135,11 +8167,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 363:
+case 365:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of router element.", surf_parse_text[0]);
        YY_BREAK
-case 364:
+case 366:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `router' element start tag.",surf_parse_text);
        YY_BREAK
@@ -8147,8 +8179,8 @@ case YY_STATE_EOF(AL_surfxml_router):
 FAIL("EOF in attribute list of `router' element.");
        YY_BREAK
 
-case 365:
-/* rule 365 can match eol */
+case 367:
+/* rule 367 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -8159,12 +8191,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 366:
-/* rule 366 can match eol */
+case 368:
+/* rule 368 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</router>' expected.",surf_parse_text);
        YY_BREAK
-case 367:
+case 369:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</router>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -8172,13 +8204,13 @@ case YY_STATE_EOF(E_surfxml_router):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</router>' expected.");
        YY_BREAK
 
-case 368:
-/* rule 368 can match eol */
+case 370:
+/* rule 370 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <backbone> is not allowed here.");
        YY_BREAK
-case 369:
-/* rule 369 can match eol */
+case 371:
+/* rule 371 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_backbone_id = 0;
@@ -8191,37 +8223,37 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 370:
-/* rule 370 can match eol */
+case 372:
+/* rule 372 can match eol */
 YY_RULE_SETUP
 if (surfxml_backbone_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_backbone>");} surfxml_backbone_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_backbone_id);
        YY_BREAK
-case 371:
-/* rule 371 can match eol */
+case 373:
+/* rule 373 can match eol */
 YY_RULE_SETUP
 if (surfxml_backbone_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_backbone>");}  surfxml_backbone_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_backbone_id);
        YY_BREAK
-case 372:
-/* rule 372 can match eol */
+case 374:
+/* rule 374 can match eol */
 YY_RULE_SETUP
 if (surfxml_backbone_bandwidth_isset != 0) {FAIL("Multiple definition of attribute bandwidth in <surfxml_backbone>");} surfxml_backbone_bandwidth_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_backbone_bandwidth);
        YY_BREAK
-case 373:
-/* rule 373 can match eol */
+case 375:
+/* rule 375 can match eol */
 YY_RULE_SETUP
 if (surfxml_backbone_bandwidth_isset != 0) {FAIL("Multiple definition of attribute bandwidth in <surfxml_backbone>");}  surfxml_backbone_bandwidth_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_backbone_bandwidth);
        YY_BREAK
-case 374:
-/* rule 374 can match eol */
+case 376:
+/* rule 376 can match eol */
 YY_RULE_SETUP
 if (surfxml_backbone_latency_isset != 0) {FAIL("Multiple definition of attribute latency in <surfxml_backbone>");} surfxml_backbone_latency_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_backbone_latency);
        YY_BREAK
-case 375:
-/* rule 375 can match eol */
+case 377:
+/* rule 377 can match eol */
 YY_RULE_SETUP
 if (surfxml_backbone_latency_isset != 0) {FAIL("Multiple definition of attribute latency in <surfxml_backbone>");}  surfxml_backbone_latency_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_backbone_latency);
        YY_BREAK
-case 376:
+case 378:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_backbone_id) FAIL("Required attribute `id' not set for `backbone' element.");
@@ -8230,7 +8262,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_backbone();surfxml_pcdata_ix = 0; ENTER(E_surfxml_backbone);
  }
        YY_BREAK
-case 377:
+case 379:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_backbone_id) FAIL("Required attribute `id' not set for `backbone' element.");
@@ -8243,11 +8275,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 378:
+case 380:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of backbone element.", surf_parse_text[0]);
        YY_BREAK
-case 379:
+case 381:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `backbone' element start tag.",surf_parse_text);
        YY_BREAK
@@ -8255,8 +8287,8 @@ case YY_STATE_EOF(AL_surfxml_backbone):
 FAIL("EOF in attribute list of `backbone' element.");
        YY_BREAK
 
-case 380:
-/* rule 380 can match eol */
+case 382:
+/* rule 382 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -8268,12 +8300,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 381:
-/* rule 381 can match eol */
+case 383:
+/* rule 383 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</backbone>' expected.",surf_parse_text);
        YY_BREAK
-case 382:
+case 384:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</backbone>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -8281,13 +8313,13 @@ case YY_STATE_EOF(E_surfxml_backbone):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</backbone>' expected.");
        YY_BREAK
 
-case 383:
-/* rule 383 can match eol */
+case 385:
+/* rule 385 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <link> is not allowed here.");
        YY_BREAK
-case 384:
-/* rule 384 can match eol */
+case 386:
+/* rule 386 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_link_id = 0;
@@ -8305,107 +8337,107 @@ YY_RULE_SETUP
   AX_surfxml_link_state___file = 0;
   surfxml_link_state___file_isset = 0;
   AX_surfxml_link_sharing___policy = A_surfxml_link_sharing___policy_SHARED;
-  surfxml_link_sharing___policy_isset = 0;
-  ENTER(AL_surfxml_link); pushbuffer(0);
-  }
-       YY_BREAK
-
-case 385:
-/* rule 385 can match eol */
-YY_RULE_SETUP
-if (surfxml_link_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_link>");} surfxml_link_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_id);
-       YY_BREAK
-case 386:
-/* rule 386 can match eol */
-YY_RULE_SETUP
-if (surfxml_link_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_link>");}  surfxml_link_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_id);
+  surfxml_link_sharing___policy_isset = 0;
+  ENTER(AL_surfxml_link); pushbuffer(0);
+  }
        YY_BREAK
+
 case 387:
 /* rule 387 can match eol */
 YY_RULE_SETUP
-if (surfxml_link_bandwidth_isset != 0) {FAIL("Multiple definition of attribute bandwidth in <surfxml_link>");} surfxml_link_bandwidth_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_bandwidth);
+if (surfxml_link_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_link>");} surfxml_link_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_id);
        YY_BREAK
 case 388:
 /* rule 388 can match eol */
 YY_RULE_SETUP
-if (surfxml_link_bandwidth_isset != 0) {FAIL("Multiple definition of attribute bandwidth in <surfxml_link>");}  surfxml_link_bandwidth_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_bandwidth);
+if (surfxml_link_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_link>");}  surfxml_link_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_id);
        YY_BREAK
 case 389:
 /* rule 389 can match eol */
 YY_RULE_SETUP
-if (surfxml_link_bandwidth___file_isset != 0) {FAIL("Multiple definition of attribute bandwidth_file in <surfxml_link>");} surfxml_link_bandwidth___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_bandwidth___file);
+if (surfxml_link_bandwidth_isset != 0) {FAIL("Multiple definition of attribute bandwidth in <surfxml_link>");} surfxml_link_bandwidth_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_bandwidth);
        YY_BREAK
 case 390:
 /* rule 390 can match eol */
 YY_RULE_SETUP
-if (surfxml_link_bandwidth___file_isset != 0) {FAIL("Multiple definition of attribute bandwidth_file in <surfxml_link>");}  surfxml_link_bandwidth___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_bandwidth___file);
+if (surfxml_link_bandwidth_isset != 0) {FAIL("Multiple definition of attribute bandwidth in <surfxml_link>");}  surfxml_link_bandwidth_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_bandwidth);
        YY_BREAK
 case 391:
 /* rule 391 can match eol */
 YY_RULE_SETUP
-if (surfxml_link_latency_isset != 0) {FAIL("Multiple definition of attribute latency in <surfxml_link>");} surfxml_link_latency_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_latency);
+if (surfxml_link_bandwidth___file_isset != 0) {FAIL("Multiple definition of attribute bandwidth_file in <surfxml_link>");} surfxml_link_bandwidth___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_bandwidth___file);
        YY_BREAK
 case 392:
 /* rule 392 can match eol */
 YY_RULE_SETUP
-if (surfxml_link_latency_isset != 0) {FAIL("Multiple definition of attribute latency in <surfxml_link>");}  surfxml_link_latency_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_latency);
+if (surfxml_link_bandwidth___file_isset != 0) {FAIL("Multiple definition of attribute bandwidth_file in <surfxml_link>");}  surfxml_link_bandwidth___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_bandwidth___file);
        YY_BREAK
 case 393:
 /* rule 393 can match eol */
 YY_RULE_SETUP
-if (surfxml_link_latency___file_isset != 0) {FAIL("Multiple definition of attribute latency_file in <surfxml_link>");} surfxml_link_latency___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_latency___file);
+if (surfxml_link_latency_isset != 0) {FAIL("Multiple definition of attribute latency in <surfxml_link>");} surfxml_link_latency_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_latency);
        YY_BREAK
 case 394:
 /* rule 394 can match eol */
 YY_RULE_SETUP
-if (surfxml_link_latency___file_isset != 0) {FAIL("Multiple definition of attribute latency_file in <surfxml_link>");}  surfxml_link_latency___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_latency___file);
+if (surfxml_link_latency_isset != 0) {FAIL("Multiple definition of attribute latency in <surfxml_link>");}  surfxml_link_latency_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_latency);
        YY_BREAK
 case 395:
 /* rule 395 can match eol */
+YY_RULE_SETUP
+if (surfxml_link_latency___file_isset != 0) {FAIL("Multiple definition of attribute latency_file in <surfxml_link>");} surfxml_link_latency___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_latency___file);
+       YY_BREAK
 case 396:
 /* rule 396 can match eol */
 YY_RULE_SETUP
-A_surfxml_link_state = A_surfxml_link_state_ON;
+if (surfxml_link_latency___file_isset != 0) {FAIL("Multiple definition of attribute latency_file in <surfxml_link>");}  surfxml_link_latency___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_latency___file);
        YY_BREAK
 case 397:
 /* rule 397 can match eol */
 case 398:
 /* rule 398 can match eol */
 YY_RULE_SETUP
-A_surfxml_link_state = A_surfxml_link_state_OFF;
+A_surfxml_link_state = A_surfxml_link_state_ON;
        YY_BREAK
 case 399:
 /* rule 399 can match eol */
-YY_RULE_SETUP
-if (surfxml_link_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_link>");} surfxml_link_state___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_state___file);
-       YY_BREAK
 case 400:
 /* rule 400 can match eol */
 YY_RULE_SETUP
-if (surfxml_link_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_link>");}  surfxml_link_state___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_state___file);
+A_surfxml_link_state = A_surfxml_link_state_OFF;
        YY_BREAK
 case 401:
 /* rule 401 can match eol */
+YY_RULE_SETUP
+if (surfxml_link_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_link>");} surfxml_link_state___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_state___file);
+       YY_BREAK
 case 402:
 /* rule 402 can match eol */
 YY_RULE_SETUP
-A_surfxml_link_sharing___policy = A_surfxml_link_sharing___policy_SHARED;
+if (surfxml_link_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_link>");}  surfxml_link_state___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_state___file);
        YY_BREAK
 case 403:
 /* rule 403 can match eol */
 case 404:
 /* rule 404 can match eol */
 YY_RULE_SETUP
-A_surfxml_link_sharing___policy = A_surfxml_link_sharing___policy_FATPIPE;
+A_surfxml_link_sharing___policy = A_surfxml_link_sharing___policy_SHARED;
        YY_BREAK
 case 405:
 /* rule 405 can match eol */
 case 406:
 /* rule 406 can match eol */
 YY_RULE_SETUP
-A_surfxml_link_sharing___policy = A_surfxml_link_sharing___policy_FULLDUPLEX;
+A_surfxml_link_sharing___policy = A_surfxml_link_sharing___policy_FATPIPE;
        YY_BREAK
 case 407:
+/* rule 407 can match eol */
+case 408:
+/* rule 408 can match eol */
+YY_RULE_SETUP
+A_surfxml_link_sharing___policy = A_surfxml_link_sharing___policy_FULLDUPLEX;
+       YY_BREAK
+case 409:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_link_id) FAIL("Required attribute `id' not set for `link' element.");
@@ -8413,7 +8445,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_link();surfxml_pcdata_ix = 0; ENTER(S_surfxml_link);
  }
        YY_BREAK
-case 408:
+case 410:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_link_id) FAIL("Required attribute `id' not set for `link' element.");
@@ -8425,11 +8457,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 409:
+case 411:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of link element.", surf_parse_text[0]);
        YY_BREAK
-case 410:
+case 412:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `link' element start tag.",surf_parse_text);
        YY_BREAK
@@ -8437,8 +8469,8 @@ case YY_STATE_EOF(AL_surfxml_link):
 FAIL("EOF in attribute list of `link' element.");
        YY_BREAK
 
-case 411:
-/* rule 411 can match eol */
+case 413:
+/* rule 413 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -8450,12 +8482,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 412:
-/* rule 412 can match eol */
+case 414:
+/* rule 414 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</link>' expected.",surf_parse_text);
        YY_BREAK
-case 413:
+case 415:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</link>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -8465,13 +8497,13 @@ case YY_STATE_EOF(S_surfxml_link):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</link>' expected.");
        YY_BREAK
 
-case 414:
-/* rule 414 can match eol */
+case 416:
+/* rule 416 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <route> is not allowed here.");
        YY_BREAK
-case 415:
-/* rule 415 can match eol */
+case 417:
+/* rule 417 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_route_src = 0;
@@ -8484,41 +8516,41 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 416:
-/* rule 416 can match eol */
-YY_RULE_SETUP
-if (surfxml_route_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_route>");} surfxml_route_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_route_src);
-       YY_BREAK
-case 417:
-/* rule 417 can match eol */
-YY_RULE_SETUP
-if (surfxml_route_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_route>");}  surfxml_route_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_route_src);
-       YY_BREAK
 case 418:
 /* rule 418 can match eol */
 YY_RULE_SETUP
-if (surfxml_route_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_route>");} surfxml_route_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_route_dst);
+if (surfxml_route_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_route>");} surfxml_route_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_route_src);
        YY_BREAK
 case 419:
 /* rule 419 can match eol */
 YY_RULE_SETUP
-if (surfxml_route_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_route>");}  surfxml_route_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_route_dst);
+if (surfxml_route_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_route>");}  surfxml_route_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_route_src);
        YY_BREAK
 case 420:
 /* rule 420 can match eol */
+YY_RULE_SETUP
+if (surfxml_route_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_route>");} surfxml_route_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_route_dst);
+       YY_BREAK
 case 421:
 /* rule 421 can match eol */
 YY_RULE_SETUP
-A_surfxml_route_symmetrical = A_surfxml_route_symmetrical_YES;
+if (surfxml_route_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_route>");}  surfxml_route_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_route_dst);
        YY_BREAK
 case 422:
 /* rule 422 can match eol */
 case 423:
 /* rule 423 can match eol */
 YY_RULE_SETUP
-A_surfxml_route_symmetrical = A_surfxml_route_symmetrical_NO;
+A_surfxml_route_symmetrical = A_surfxml_route_symmetrical_YES;
        YY_BREAK
 case 424:
+/* rule 424 can match eol */
+case 425:
+/* rule 425 can match eol */
+YY_RULE_SETUP
+A_surfxml_route_symmetrical = A_surfxml_route_symmetrical_NO;
+       YY_BREAK
+case 426:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_route_src) FAIL("Required attribute `src' not set for `route' element.");
@@ -8526,7 +8558,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_route();surfxml_pcdata_ix = 0; ENTER(S_surfxml_route);
  }
        YY_BREAK
-case 425:
+case 427:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_route_src) FAIL("Required attribute `src' not set for `route' element.");
@@ -8537,11 +8569,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 426:
+case 428:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of route element.", surf_parse_text[0]);
        YY_BREAK
-case 427:
+case 429:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `route' element start tag.",surf_parse_text);
        YY_BREAK
@@ -8549,8 +8581,8 @@ case YY_STATE_EOF(AL_surfxml_route):
 FAIL("EOF in attribute list of `route' element.");
        YY_BREAK
 
-case 428:
-/* rule 428 can match eol */
+case 430:
+/* rule 430 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -8561,12 +8593,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 429:
-/* rule 429 can match eol */
+case 431:
+/* rule 431 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</route>' expected.",surf_parse_text);
        YY_BREAK
-case 430:
+case 432:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</route>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -8576,13 +8608,13 @@ case YY_STATE_EOF(E_surfxml_route):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</route>' expected.");
        YY_BREAK
 
-case 431:
-/* rule 431 can match eol */
+case 433:
+/* rule 433 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <ASroute> is not allowed here.");
        YY_BREAK
-case 432:
-/* rule 432 can match eol */
+case 434:
+/* rule 434 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_ASroute_src = 0;
@@ -8599,61 +8631,61 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 433:
-/* rule 433 can match eol */
-YY_RULE_SETUP
-if (surfxml_ASroute_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_ASroute>");} surfxml_ASroute_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_src);
-       YY_BREAK
-case 434:
-/* rule 434 can match eol */
-YY_RULE_SETUP
-if (surfxml_ASroute_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_ASroute>");}  surfxml_ASroute_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_src);
-       YY_BREAK
 case 435:
 /* rule 435 can match eol */
 YY_RULE_SETUP
-if (surfxml_ASroute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_ASroute>");} surfxml_ASroute_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_dst);
+if (surfxml_ASroute_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_ASroute>");} surfxml_ASroute_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_src);
        YY_BREAK
 case 436:
 /* rule 436 can match eol */
 YY_RULE_SETUP
-if (surfxml_ASroute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_ASroute>");}  surfxml_ASroute_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_dst);
+if (surfxml_ASroute_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_ASroute>");}  surfxml_ASroute_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_src);
        YY_BREAK
 case 437:
 /* rule 437 can match eol */
 YY_RULE_SETUP
-if (surfxml_ASroute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in <surfxml_ASroute>");} surfxml_ASroute_gw___src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_gw___src);
+if (surfxml_ASroute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_ASroute>");} surfxml_ASroute_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_dst);
        YY_BREAK
 case 438:
 /* rule 438 can match eol */
 YY_RULE_SETUP
-if (surfxml_ASroute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in <surfxml_ASroute>");}  surfxml_ASroute_gw___src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_gw___src);
+if (surfxml_ASroute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_ASroute>");}  surfxml_ASroute_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_dst);
        YY_BREAK
 case 439:
 /* rule 439 can match eol */
 YY_RULE_SETUP
-if (surfxml_ASroute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in <surfxml_ASroute>");} surfxml_ASroute_gw___dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_gw___dst);
+if (surfxml_ASroute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in <surfxml_ASroute>");} surfxml_ASroute_gw___src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_gw___src);
        YY_BREAK
 case 440:
 /* rule 440 can match eol */
 YY_RULE_SETUP
-if (surfxml_ASroute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in <surfxml_ASroute>");}  surfxml_ASroute_gw___dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_gw___dst);
+if (surfxml_ASroute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in <surfxml_ASroute>");}  surfxml_ASroute_gw___src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_gw___src);
        YY_BREAK
 case 441:
 /* rule 441 can match eol */
+YY_RULE_SETUP
+if (surfxml_ASroute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in <surfxml_ASroute>");} surfxml_ASroute_gw___dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_gw___dst);
+       YY_BREAK
 case 442:
 /* rule 442 can match eol */
 YY_RULE_SETUP
-A_surfxml_ASroute_symmetrical = A_surfxml_ASroute_symmetrical_YES;
+if (surfxml_ASroute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in <surfxml_ASroute>");}  surfxml_ASroute_gw___dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_gw___dst);
        YY_BREAK
 case 443:
 /* rule 443 can match eol */
 case 444:
 /* rule 444 can match eol */
 YY_RULE_SETUP
-A_surfxml_ASroute_symmetrical = A_surfxml_ASroute_symmetrical_NO;
+A_surfxml_ASroute_symmetrical = A_surfxml_ASroute_symmetrical_YES;
        YY_BREAK
 case 445:
+/* rule 445 can match eol */
+case 446:
+/* rule 446 can match eol */
+YY_RULE_SETUP
+A_surfxml_ASroute_symmetrical = A_surfxml_ASroute_symmetrical_NO;
+       YY_BREAK
+case 447:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_ASroute_src) FAIL("Required attribute `src' not set for `ASroute' element.");
@@ -8663,7 +8695,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_ASroute();surfxml_pcdata_ix = 0; ENTER(S_surfxml_ASroute);
  }
        YY_BREAK
-case 446:
+case 448:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_ASroute_src) FAIL("Required attribute `src' not set for `ASroute' element.");
@@ -8676,11 +8708,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 447:
+case 449:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of ASroute element.", surf_parse_text[0]);
        YY_BREAK
-case 448:
+case 450:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `ASroute' element start tag.",surf_parse_text);
        YY_BREAK
@@ -8688,8 +8720,8 @@ case YY_STATE_EOF(AL_surfxml_ASroute):
 FAIL("EOF in attribute list of `ASroute' element.");
        YY_BREAK
 
-case 449:
-/* rule 449 can match eol */
+case 451:
+/* rule 451 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -8700,12 +8732,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 450:
-/* rule 450 can match eol */
+case 452:
+/* rule 452 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</ASroute>' expected.",surf_parse_text);
        YY_BREAK
-case 451:
+case 453:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</ASroute>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -8715,13 +8747,13 @@ case YY_STATE_EOF(S_surfxml_ASroute_2):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</ASroute>' expected.");
        YY_BREAK
 
-case 452:
-/* rule 452 can match eol */
+case 454:
+/* rule 454 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <link_ctn> is not allowed here.");
        YY_BREAK
-case 453:
-/* rule 453 can match eol */
+case 455:
+/* rule 455 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_link___ctn_id = 0;
@@ -8732,45 +8764,45 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 454:
-/* rule 454 can match eol */
+case 456:
+/* rule 456 can match eol */
 YY_RULE_SETUP
 if (surfxml_link___ctn_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_link___ctn>");} surfxml_link___ctn_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link___ctn_id);
        YY_BREAK
-case 455:
-/* rule 455 can match eol */
-YY_RULE_SETUP
-if (surfxml_link___ctn_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_link___ctn>");}  surfxml_link___ctn_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link___ctn_id);
-       YY_BREAK
-case 456:
-/* rule 456 can match eol */
 case 457:
 /* rule 457 can match eol */
 YY_RULE_SETUP
-A_surfxml_link___ctn_direction = A_surfxml_link___ctn_direction_UP;
+if (surfxml_link___ctn_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_link___ctn>");}  surfxml_link___ctn_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link___ctn_id);
        YY_BREAK
 case 458:
 /* rule 458 can match eol */
 case 459:
 /* rule 459 can match eol */
 YY_RULE_SETUP
-A_surfxml_link___ctn_direction = A_surfxml_link___ctn_direction_DOWN;
+A_surfxml_link___ctn_direction = A_surfxml_link___ctn_direction_UP;
        YY_BREAK
 case 460:
 /* rule 460 can match eol */
 case 461:
 /* rule 461 can match eol */
 YY_RULE_SETUP
-A_surfxml_link___ctn_direction = A_surfxml_link___ctn_direction_NONE;
+A_surfxml_link___ctn_direction = A_surfxml_link___ctn_direction_DOWN;
        YY_BREAK
 case 462:
+/* rule 462 can match eol */
+case 463:
+/* rule 463 can match eol */
+YY_RULE_SETUP
+A_surfxml_link___ctn_direction = A_surfxml_link___ctn_direction_NONE;
+       YY_BREAK
+case 464:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_link___ctn_id) FAIL("Required attribute `id' not set for `link_ctn' element.");
   LEAVE; STag_surfxml_link___ctn();surfxml_pcdata_ix = 0; ENTER(E_surfxml_link___ctn);
  }
        YY_BREAK
-case 463:
+case 465:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_link___ctn_id) FAIL("Required attribute `id' not set for `link_ctn' element.");
@@ -8783,11 +8815,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 464:
+case 466:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of link_ctn element.", surf_parse_text[0]);
        YY_BREAK
-case 465:
+case 467:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `link_ctn' element start tag.",surf_parse_text);
        YY_BREAK
@@ -8795,8 +8827,8 @@ case YY_STATE_EOF(AL_surfxml_link___ctn):
 FAIL("EOF in attribute list of `link_ctn' element.");
        YY_BREAK
 
-case 466:
-/* rule 466 can match eol */
+case 468:
+/* rule 468 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -8810,12 +8842,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 467:
-/* rule 467 can match eol */
+case 469:
+/* rule 469 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</link_ctn>' expected.",surf_parse_text);
        YY_BREAK
-case 468:
+case 470:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</link_ctn>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -8823,13 +8855,13 @@ case YY_STATE_EOF(E_surfxml_link___ctn):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</link_ctn>' expected.");
        YY_BREAK
 
-case 469:
-/* rule 469 can match eol */
+case 471:
+/* rule 471 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <bypassRoute> is not allowed here.");
        YY_BREAK
-case 470:
-/* rule 470 can match eol */
+case 472:
+/* rule 472 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_bypassRoute_src = 0;
@@ -8840,27 +8872,27 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 471:
-/* rule 471 can match eol */
+case 473:
+/* rule 473 can match eol */
 YY_RULE_SETUP
 if (surfxml_bypassRoute_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_bypassRoute>");} surfxml_bypassRoute_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassRoute_src);
        YY_BREAK
-case 472:
-/* rule 472 can match eol */
+case 474:
+/* rule 474 can match eol */
 YY_RULE_SETUP
 if (surfxml_bypassRoute_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_bypassRoute>");}  surfxml_bypassRoute_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassRoute_src);
        YY_BREAK
-case 473:
-/* rule 473 can match eol */
+case 475:
+/* rule 475 can match eol */
 YY_RULE_SETUP
 if (surfxml_bypassRoute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_bypassRoute>");} surfxml_bypassRoute_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassRoute_dst);
        YY_BREAK
-case 474:
-/* rule 474 can match eol */
+case 476:
+/* rule 476 can match eol */
 YY_RULE_SETUP
 if (surfxml_bypassRoute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_bypassRoute>");}  surfxml_bypassRoute_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassRoute_dst);
        YY_BREAK
-case 475:
+case 477:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_bypassRoute_src) FAIL("Required attribute `src' not set for `bypassRoute' element.");
@@ -8868,7 +8900,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_bypassRoute();surfxml_pcdata_ix = 0; ENTER(S_surfxml_bypassRoute);
  }
        YY_BREAK
-case 476:
+case 478:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_bypassRoute_src) FAIL("Required attribute `src' not set for `bypassRoute' element.");
@@ -8879,11 +8911,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 477:
+case 479:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of bypassRoute element.", surf_parse_text[0]);
        YY_BREAK
-case 478:
+case 480:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `bypassRoute' element start tag.",surf_parse_text);
        YY_BREAK
@@ -8891,8 +8923,8 @@ case YY_STATE_EOF(AL_surfxml_bypassRoute):
 FAIL("EOF in attribute list of `bypassRoute' element.");
        YY_BREAK
 
-case 479:
-/* rule 479 can match eol */
+case 481:
+/* rule 481 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -8903,12 +8935,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 480:
-/* rule 480 can match eol */
+case 482:
+/* rule 482 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</bypassRoute>' expected.",surf_parse_text);
        YY_BREAK
-case 481:
+case 483:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</bypassRoute>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -8918,13 +8950,13 @@ case YY_STATE_EOF(E_surfxml_bypassRoute):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</bypassRoute>' expected.");
        YY_BREAK
 
-case 482:
-/* rule 482 can match eol */
+case 484:
+/* rule 484 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <bypassASroute> is not allowed here.");
        YY_BREAK
-case 483:
-/* rule 483 can match eol */
+case 485:
+/* rule 485 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_bypassASroute_src = 0;
@@ -8936,50 +8968,50 @@ YY_RULE_SETUP
   AX_surfxml_bypassASroute_gw___dst = 0;
   surfxml_bypassASroute_gw___dst_isset = 0;
   ENTER(AL_surfxml_bypassASroute); pushbuffer(0);
-  }
-       YY_BREAK
-
-case 484:
-/* rule 484 can match eol */
-YY_RULE_SETUP
-if (surfxml_bypassASroute_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_bypassASroute>");} surfxml_bypassASroute_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_src);
-       YY_BREAK
-case 485:
-/* rule 485 can match eol */
-YY_RULE_SETUP
-if (surfxml_bypassASroute_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_bypassASroute>");}  surfxml_bypassASroute_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassASroute_src);
+  }
        YY_BREAK
+
 case 486:
 /* rule 486 can match eol */
 YY_RULE_SETUP
-if (surfxml_bypassASroute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_bypassASroute>");} surfxml_bypassASroute_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_dst);
+if (surfxml_bypassASroute_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_bypassASroute>");} surfxml_bypassASroute_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_src);
        YY_BREAK
 case 487:
 /* rule 487 can match eol */
 YY_RULE_SETUP
-if (surfxml_bypassASroute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_bypassASroute>");}  surfxml_bypassASroute_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassASroute_dst);
+if (surfxml_bypassASroute_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_bypassASroute>");}  surfxml_bypassASroute_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassASroute_src);
        YY_BREAK
 case 488:
 /* rule 488 can match eol */
 YY_RULE_SETUP
-if (surfxml_bypassASroute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in <surfxml_bypassASroute>");} surfxml_bypassASroute_gw___src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_gw___src);
+if (surfxml_bypassASroute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_bypassASroute>");} surfxml_bypassASroute_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_dst);
        YY_BREAK
 case 489:
 /* rule 489 can match eol */
 YY_RULE_SETUP
-if (surfxml_bypassASroute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in <surfxml_bypassASroute>");}  surfxml_bypassASroute_gw___src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassASroute_gw___src);
+if (surfxml_bypassASroute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_bypassASroute>");}  surfxml_bypassASroute_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassASroute_dst);
        YY_BREAK
 case 490:
 /* rule 490 can match eol */
 YY_RULE_SETUP
-if (surfxml_bypassASroute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in <surfxml_bypassASroute>");} surfxml_bypassASroute_gw___dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_gw___dst);
+if (surfxml_bypassASroute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in <surfxml_bypassASroute>");} surfxml_bypassASroute_gw___src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_gw___src);
        YY_BREAK
 case 491:
 /* rule 491 can match eol */
 YY_RULE_SETUP
-if (surfxml_bypassASroute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in <surfxml_bypassASroute>");}  surfxml_bypassASroute_gw___dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassASroute_gw___dst);
+if (surfxml_bypassASroute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in <surfxml_bypassASroute>");}  surfxml_bypassASroute_gw___src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassASroute_gw___src);
        YY_BREAK
 case 492:
+/* rule 492 can match eol */
+YY_RULE_SETUP
+if (surfxml_bypassASroute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in <surfxml_bypassASroute>");} surfxml_bypassASroute_gw___dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_gw___dst);
+       YY_BREAK
+case 493:
+/* rule 493 can match eol */
+YY_RULE_SETUP
+if (surfxml_bypassASroute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in <surfxml_bypassASroute>");}  surfxml_bypassASroute_gw___dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassASroute_gw___dst);
+       YY_BREAK
+case 494:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_bypassASroute_src) FAIL("Required attribute `src' not set for `bypassASroute' element.");
@@ -8989,7 +9021,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_bypassASroute();surfxml_pcdata_ix = 0; ENTER(S_surfxml_bypassASroute);
  }
        YY_BREAK
-case 493:
+case 495:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_bypassASroute_src) FAIL("Required attribute `src' not set for `bypassASroute' element.");
@@ -9002,11 +9034,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 494:
+case 496:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of bypassASroute element.", surf_parse_text[0]);
        YY_BREAK
-case 495:
+case 497:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `bypassASroute' element start tag.",surf_parse_text);
        YY_BREAK
@@ -9014,8 +9046,8 @@ case YY_STATE_EOF(AL_surfxml_bypassASroute):
 FAIL("EOF in attribute list of `bypassASroute' element.");
        YY_BREAK
 
-case 496:
-/* rule 496 can match eol */
+case 498:
+/* rule 498 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -9026,12 +9058,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 497:
-/* rule 497 can match eol */
+case 499:
+/* rule 499 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</bypassASroute>' expected.",surf_parse_text);
        YY_BREAK
-case 498:
+case 500:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</bypassASroute>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -9041,13 +9073,13 @@ case YY_STATE_EOF(S_surfxml_bypassASroute):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</bypassASroute>' expected.");
        YY_BREAK
 
-case 499:
-/* rule 499 can match eol */
+case 501:
+/* rule 501 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <process> is not allowed here.");
        YY_BREAK
-case 500:
-/* rule 500 can match eol */
+case 502:
+/* rule 502 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_process_host = 0;
@@ -9064,61 +9096,61 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 501:
-/* rule 501 can match eol */
-YY_RULE_SETUP
-if (surfxml_process_host_isset != 0) {FAIL("Multiple definition of attribute host in <surfxml_process>");} surfxml_process_host_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_host);
-       YY_BREAK
-case 502:
-/* rule 502 can match eol */
-YY_RULE_SETUP
-if (surfxml_process_host_isset != 0) {FAIL("Multiple definition of attribute host in <surfxml_process>");}  surfxml_process_host_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_host);
-       YY_BREAK
 case 503:
 /* rule 503 can match eol */
 YY_RULE_SETUP
-if (surfxml_process_function_isset != 0) {FAIL("Multiple definition of attribute function in <surfxml_process>");} surfxml_process_function_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_function);
+if (surfxml_process_host_isset != 0) {FAIL("Multiple definition of attribute host in <surfxml_process>");} surfxml_process_host_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_host);
        YY_BREAK
 case 504:
 /* rule 504 can match eol */
 YY_RULE_SETUP
-if (surfxml_process_function_isset != 0) {FAIL("Multiple definition of attribute function in <surfxml_process>");}  surfxml_process_function_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_function);
+if (surfxml_process_host_isset != 0) {FAIL("Multiple definition of attribute host in <surfxml_process>");}  surfxml_process_host_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_host);
        YY_BREAK
 case 505:
 /* rule 505 can match eol */
 YY_RULE_SETUP
-if (surfxml_process_start___time_isset != 0) {FAIL("Multiple definition of attribute start_time in <surfxml_process>");} surfxml_process_start___time_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_start___time);
+if (surfxml_process_function_isset != 0) {FAIL("Multiple definition of attribute function in <surfxml_process>");} surfxml_process_function_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_function);
        YY_BREAK
 case 506:
 /* rule 506 can match eol */
 YY_RULE_SETUP
-if (surfxml_process_start___time_isset != 0) {FAIL("Multiple definition of attribute start_time in <surfxml_process>");}  surfxml_process_start___time_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_start___time);
+if (surfxml_process_function_isset != 0) {FAIL("Multiple definition of attribute function in <surfxml_process>");}  surfxml_process_function_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_function);
        YY_BREAK
 case 507:
 /* rule 507 can match eol */
 YY_RULE_SETUP
-if (surfxml_process_kill___time_isset != 0) {FAIL("Multiple definition of attribute kill_time in <surfxml_process>");} surfxml_process_kill___time_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_kill___time);
+if (surfxml_process_start___time_isset != 0) {FAIL("Multiple definition of attribute start_time in <surfxml_process>");} surfxml_process_start___time_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_start___time);
        YY_BREAK
 case 508:
 /* rule 508 can match eol */
 YY_RULE_SETUP
-if (surfxml_process_kill___time_isset != 0) {FAIL("Multiple definition of attribute kill_time in <surfxml_process>");}  surfxml_process_kill___time_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_kill___time);
+if (surfxml_process_start___time_isset != 0) {FAIL("Multiple definition of attribute start_time in <surfxml_process>");}  surfxml_process_start___time_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_start___time);
        YY_BREAK
 case 509:
 /* rule 509 can match eol */
+YY_RULE_SETUP
+if (surfxml_process_kill___time_isset != 0) {FAIL("Multiple definition of attribute kill_time in <surfxml_process>");} surfxml_process_kill___time_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_kill___time);
+       YY_BREAK
 case 510:
 /* rule 510 can match eol */
 YY_RULE_SETUP
-A_surfxml_process_on___failure = A_surfxml_process_on___failure_DIE;
+if (surfxml_process_kill___time_isset != 0) {FAIL("Multiple definition of attribute kill_time in <surfxml_process>");}  surfxml_process_kill___time_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_kill___time);
        YY_BREAK
 case 511:
 /* rule 511 can match eol */
 case 512:
 /* rule 512 can match eol */
 YY_RULE_SETUP
-A_surfxml_process_on___failure = A_surfxml_process_on___failure_RESTART;
+A_surfxml_process_on___failure = A_surfxml_process_on___failure_DIE;
        YY_BREAK
 case 513:
+/* rule 513 can match eol */
+case 514:
+/* rule 514 can match eol */
+YY_RULE_SETUP
+A_surfxml_process_on___failure = A_surfxml_process_on___failure_RESTART;
+       YY_BREAK
+case 515:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_process_host) FAIL("Required attribute `host' not set for `process' element.");
@@ -9126,7 +9158,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_process();surfxml_pcdata_ix = 0; ENTER(S_surfxml_process);
  }
        YY_BREAK
-case 514:
+case 516:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_process_host) FAIL("Required attribute `host' not set for `process' element.");
@@ -9137,11 +9169,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 515:
+case 517:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of process element.", surf_parse_text[0]);
        YY_BREAK
-case 516:
+case 518:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `process' element start tag.",surf_parse_text);
        YY_BREAK
@@ -9149,8 +9181,8 @@ case YY_STATE_EOF(AL_surfxml_process):
 FAIL("EOF in attribute list of `process' element.");
        YY_BREAK
 
-case 517:
-/* rule 517 can match eol */
+case 519:
+/* rule 519 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -9161,12 +9193,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 518:
-/* rule 518 can match eol */
+case 520:
+/* rule 520 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</process>' expected.",surf_parse_text);
        YY_BREAK
-case 519:
+case 521:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</process>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -9176,13 +9208,13 @@ case YY_STATE_EOF(S_surfxml_process_2):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</process>' expected.");
        YY_BREAK
 
-case 520:
-/* rule 520 can match eol */
+case 522:
+/* rule 522 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <argument> is not allowed here.");
        YY_BREAK
-case 521:
-/* rule 521 can match eol */
+case 523:
+/* rule 523 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_argument_value = 0;
@@ -9191,24 +9223,24 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 522:
-/* rule 522 can match eol */
+case 524:
+/* rule 524 can match eol */
 YY_RULE_SETUP
 if (surfxml_argument_value_isset != 0) {FAIL("Multiple definition of attribute value in <surfxml_argument>");} surfxml_argument_value_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_argument_value);
        YY_BREAK
-case 523:
-/* rule 523 can match eol */
+case 525:
+/* rule 525 can match eol */
 YY_RULE_SETUP
 if (surfxml_argument_value_isset != 0) {FAIL("Multiple definition of attribute value in <surfxml_argument>");}  surfxml_argument_value_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_argument_value);
        YY_BREAK
-case 524:
+case 526:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_argument_value) FAIL("Required attribute `value' not set for `argument' element.");
   LEAVE; STag_surfxml_argument();surfxml_pcdata_ix = 0; ENTER(E_surfxml_argument);
  }
        YY_BREAK
-case 525:
+case 527:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_argument_value) FAIL("Required attribute `value' not set for `argument' element.");
@@ -9218,11 +9250,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 526:
+case 528:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of argument element.", surf_parse_text[0]);
        YY_BREAK
-case 527:
+case 529:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `argument' element start tag.",surf_parse_text);
        YY_BREAK
@@ -9230,8 +9262,8 @@ case YY_STATE_EOF(AL_surfxml_argument):
 FAIL("EOF in attribute list of `argument' element.");
        YY_BREAK
 
-case 528:
-/* rule 528 can match eol */
+case 530:
+/* rule 530 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -9242,12 +9274,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 529:
-/* rule 529 can match eol */
+case 531:
+/* rule 531 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</argument>' expected.",surf_parse_text);
        YY_BREAK
-case 530:
+case 532:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</argument>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -9255,13 +9287,13 @@ case YY_STATE_EOF(E_surfxml_argument):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</argument>' expected.");
        YY_BREAK
 
-case 531:
-/* rule 531 can match eol */
+case 533:
+/* rule 533 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <config> is not allowed here.");
        YY_BREAK
-case 532:
-/* rule 532 can match eol */
+case 534:
+/* rule 534 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_config_id = 0;
@@ -9270,23 +9302,23 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 533:
-/* rule 533 can match eol */
+case 535:
+/* rule 535 can match eol */
 YY_RULE_SETUP
 if (surfxml_config_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_config>");} surfxml_config_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_config_id);
        YY_BREAK
-case 534:
-/* rule 534 can match eol */
+case 536:
+/* rule 536 can match eol */
 YY_RULE_SETUP
 if (surfxml_config_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_config>");}  surfxml_config_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_config_id);
        YY_BREAK
-case 535:
+case 537:
 YY_RULE_SETUP
 {
   LEAVE; STag_surfxml_config();surfxml_pcdata_ix = 0; ENTER(S_surfxml_config);
  }
        YY_BREAK
-case 536:
+case 538:
 YY_RULE_SETUP
 {
   LEAVE; STag_surfxml_config(); surfxml_pcdata_ix = 0; ETag_surfxml_config(); popbuffer(); /* attribute */
@@ -9295,11 +9327,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 537:
+case 539:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of config element.", surf_parse_text[0]);
        YY_BREAK
-case 538:
+case 540:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `config' element start tag.",surf_parse_text);
        YY_BREAK
@@ -9307,8 +9339,8 @@ case YY_STATE_EOF(AL_surfxml_config):
 FAIL("EOF in attribute list of `config' element.");
        YY_BREAK
 
-case 539:
-/* rule 539 can match eol */
+case 541:
+/* rule 541 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -9319,12 +9351,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 540:
-/* rule 540 can match eol */
+case 542:
+/* rule 542 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</config>' expected.",surf_parse_text);
        YY_BREAK
-case 541:
+case 543:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</config>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -9336,13 +9368,13 @@ if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</config>' expected.");
 
 /* <!-- <!ATTLIST prop key CDATA #REQUIRED> -->
   * <!-- <!ATTLIST prop key CDATA #REQUIRED> -->  */
-case 542:
-/* rule 542 can match eol */
+case 544:
+/* rule 544 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <prop> is not allowed here.");
        YY_BREAK
-case 543:
-/* rule 543 can match eol */
+case 545:
+/* rule 545 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_prop_id = 0;
@@ -9353,27 +9385,27 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 544:
-/* rule 544 can match eol */
+case 546:
+/* rule 546 can match eol */
 YY_RULE_SETUP
 if (surfxml_prop_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_prop>");} surfxml_prop_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_prop_id);
        YY_BREAK
-case 545:
-/* rule 545 can match eol */
+case 547:
+/* rule 547 can match eol */
 YY_RULE_SETUP
 if (surfxml_prop_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_prop>");}  surfxml_prop_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_prop_id);
        YY_BREAK
-case 546:
-/* rule 546 can match eol */
+case 548:
+/* rule 548 can match eol */
 YY_RULE_SETUP
 if (surfxml_prop_value_isset != 0) {FAIL("Multiple definition of attribute value in <surfxml_prop>");} surfxml_prop_value_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_prop_value);
        YY_BREAK
-case 547:
-/* rule 547 can match eol */
+case 549:
+/* rule 549 can match eol */
 YY_RULE_SETUP
 if (surfxml_prop_value_isset != 0) {FAIL("Multiple definition of attribute value in <surfxml_prop>");}  surfxml_prop_value_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_prop_value);
        YY_BREAK
-case 548:
+case 550:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_prop_id) FAIL("Required attribute `id' not set for `prop' element.");
@@ -9381,7 +9413,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_prop();surfxml_pcdata_ix = 0; ENTER(E_surfxml_prop);
  }
        YY_BREAK
-case 549:
+case 551:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_prop_id) FAIL("Required attribute `id' not set for `prop' element.");
@@ -9399,11 +9431,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 550:
+case 552:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of prop element.", surf_parse_text[0]);
        YY_BREAK
-case 551:
+case 553:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `prop' element start tag.",surf_parse_text);
        YY_BREAK
@@ -9411,8 +9443,8 @@ case YY_STATE_EOF(AL_surfxml_prop):
 FAIL("EOF in attribute list of `prop' element.");
        YY_BREAK
 
-case 552:
-/* rule 552 can match eol */
+case 554:
+/* rule 554 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -9430,12 +9462,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 553:
-/* rule 553 can match eol */
+case 555:
+/* rule 555 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</prop>' expected.",surf_parse_text);
        YY_BREAK
-case 554:
+case 556:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</prop>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -9445,13 +9477,13 @@ if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</prop>' expected.");
 
 /* <!-- <!ATTLIST model_prop key CDATA #REQUIRED> -->
   * <!-- <!ATTLIST model_prop key CDATA #REQUIRED> -->  */
-case 555:
-/* rule 555 can match eol */
+case 557:
+/* rule 557 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <model_prop> is not allowed here.");
        YY_BREAK
-case 556:
-/* rule 556 can match eol */
+case 558:
+/* rule 558 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_model___prop_id = 0;
@@ -9462,27 +9494,27 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 557:
-/* rule 557 can match eol */
+case 559:
+/* rule 559 can match eol */
 YY_RULE_SETUP
 if (surfxml_model___prop_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_model___prop>");} surfxml_model___prop_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_model___prop_id);
        YY_BREAK
-case 558:
-/* rule 558 can match eol */
+case 560:
+/* rule 560 can match eol */
 YY_RULE_SETUP
 if (surfxml_model___prop_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_model___prop>");}  surfxml_model___prop_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_model___prop_id);
        YY_BREAK
-case 559:
-/* rule 559 can match eol */
+case 561:
+/* rule 561 can match eol */
 YY_RULE_SETUP
 if (surfxml_model___prop_value_isset != 0) {FAIL("Multiple definition of attribute value in <surfxml_model___prop>");} surfxml_model___prop_value_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_model___prop_value);
        YY_BREAK
-case 560:
-/* rule 560 can match eol */
+case 562:
+/* rule 562 can match eol */
 YY_RULE_SETUP
 if (surfxml_model___prop_value_isset != 0) {FAIL("Multiple definition of attribute value in <surfxml_model___prop>");}  surfxml_model___prop_value_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_model___prop_value);
        YY_BREAK
-case 561:
+case 563:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_model___prop_id) FAIL("Required attribute `id' not set for `model_prop' element.");
@@ -9490,7 +9522,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_model___prop();surfxml_pcdata_ix = 0; ENTER(E_surfxml_model___prop);
  }
        YY_BREAK
-case 562:
+case 564:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_model___prop_id) FAIL("Required attribute `id' not set for `model_prop' element.");
@@ -9501,11 +9533,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 563:
+case 565:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of model_prop element.", surf_parse_text[0]);
        YY_BREAK
-case 564:
+case 566:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `model_prop' element start tag.",surf_parse_text);
        YY_BREAK
@@ -9513,8 +9545,8 @@ case YY_STATE_EOF(AL_surfxml_model___prop):
 FAIL("EOF in attribute list of `model_prop' element.");
        YY_BREAK
 
-case 565:
-/* rule 565 can match eol */
+case 567:
+/* rule 567 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -9525,12 +9557,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 566:
-/* rule 566 can match eol */
+case 568:
+/* rule 568 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</model_prop>' expected.",surf_parse_text);
        YY_BREAK
-case 567:
+case 569:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</model_prop>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -9540,7 +9572,7 @@ if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</model_prop>' expected.
 
 /* EPILOG: after the root element. */
 
-case 568:
+case 570:
 YY_RULE_SETUP
 {SET(PROLOG); yyless(0); CLEANUP; return -1;}
        YY_BREAK
@@ -9551,58 +9583,58 @@ SUCCEED;
 /* CHARACTER DATA. */
 
 /* Non-defined standard entities... */
-case 569:
+case 571:
 YY_RULE_SETUP
 BUFFERPUTC('&');
        YY_BREAK
-case 570:
+case 572:
 YY_RULE_SETUP
 BUFFERPUTC('<');
        YY_BREAK
-case 571:
+case 573:
 YY_RULE_SETUP
 BUFFERPUTC('>');
        YY_BREAK
-case 572:
+case 574:
 YY_RULE_SETUP
 BUFFERPUTC('\'');
        YY_BREAK
-case 573:
+case 575:
 YY_RULE_SETUP
 BUFFERPUTC('"');
        YY_BREAK
 /* Character entities. */
-case 574:
+case 576:
 YY_RULE_SETUP
 BUFFERPUTC((unsigned char)atoi(surf_parse_text+2));
        YY_BREAK
-case 575:
+case 577:
 YY_RULE_SETUP
 BUFFERPUTC((unsigned char)strtol(surf_parse_text+3,NULL,16));
        YY_BREAK
 
-case 576:
-/* rule 576 can match eol */
-case 577:
-/* rule 577 can match eol */
 case 578:
 /* rule 578 can match eol */
 case 579:
 /* rule 579 can match eol */
+case 580:
+/* rule 580 can match eol */
+case 581:
+/* rule 581 can match eol */
 YY_RULE_SETUP
 BUFFERPUTC('\n');
        YY_BREAK
 
-case 580:
+case 582:
 YY_RULE_SETUP
 ENTER(CDATA);
        YY_BREAK
-case 581:
+case 583:
 YY_RULE_SETUP
 FAIL("Unexpected `]""]>' in character data.");
        YY_BREAK
 
-case 582:
+case 584:
 YY_RULE_SETUP
 BUFFERDONE; LEAVE;
        YY_BREAK
@@ -9610,7 +9642,7 @@ case YY_STATE_EOF(VALUE1):
 FAIL("EOF in literal (\"'\" expected).");
        YY_BREAK
 
-case 583:
+case 585:
 YY_RULE_SETUP
 BUFFERDONE; LEAVE;
        YY_BREAK
@@ -9618,22 +9650,22 @@ case YY_STATE_EOF(VALUE2):
 FAIL("EOF in literal (`\"' expected).");
        YY_BREAK
 
-case 584:
-/* rule 584 can match eol */
+case 586:
+/* rule 586 can match eol */
 YY_RULE_SETUP
 BUFFERPUTC(surf_parse_text[0]);
        YY_BREAK
-case 585:
+case 587:
 YY_RULE_SETUP
 FAIL("Spurious `%c' in character data.",surf_parse_text[0]);
        YY_BREAK
 
-case 586:
+case 588:
 YY_RULE_SETUP
 LEAVE;
        YY_BREAK
 /* "]""]"              BUFFERPUTC(surf_parse_text[0]); BUFFERPUTC(surf_parse_text[1]); */
-case 587:
+case 589:
 YY_RULE_SETUP
 BUFFERPUTC(surf_parse_text[0]);
        YY_BREAK
@@ -9645,13 +9677,13 @@ FAIL("EOF in CDATA section.");
 /* Ideally, this should be replaced by code in flexml.pl that
     generates just the states not covered by other rules. */
 
-case 588:
-/* rule 588 can match eol */
+case 590:
+/* rule 590 can match eol */
 YY_RULE_SETUP
 FAIL("Syntax error on character `%c'.", surf_parse_text[0]);
        YY_BREAK
 
-case 589:
+case 591:
 YY_RULE_SETUP
 ECHO;
        YY_BREAK
@@ -9668,8 +9700,8 @@ case YY_STATE_EOF(S_surfxml_AS_10):
 case YY_STATE_EOF(S_surfxml_AS_13):
 case YY_STATE_EOF(S_surfxml_AS_15):
 case YY_STATE_EOF(S_surfxml_storage___type_1):
-case YY_STATE_EOF(S_surfxml_storage_1):
 case YY_STATE_EOF(S_surfxml_host_1):
+case YY_STATE_EOF(S_surfxml_storage_1):
 case YY_STATE_EOF(S_surfxml_cluster_1):
 case YY_STATE_EOF(S_surfxml_link_1):
 case YY_STATE_EOF(S_surfxml_route_1):
@@ -9969,7 +10001,7 @@ static int yy_get_next_buffer (void)
                while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                        {
                        yy_current_state = (int) yy_def[yy_current_state];
-                       if ( yy_current_state >= 3458 )
+                       if ( yy_current_state >= 3469 )
                                yy_c = yy_meta[(unsigned int) yy_c];
                        }
                yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
@@ -9997,11 +10029,11 @@ static int yy_get_next_buffer (void)
        while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                {
                yy_current_state = (int) yy_def[yy_current_state];
-               if ( yy_current_state >= 3458 )
+               if ( yy_current_state >= 3469 )
                        yy_c = yy_meta[(unsigned int) yy_c];
                }
        yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
-       yy_is_jam = (yy_current_state == 3457);
+       yy_is_jam = (yy_current_state == 3468);
 
        return yy_is_jam ? 0 : yy_current_state;
 }
index 4ddc3c9..5e1ef73 100644 (file)
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_storage, surf,
                                 "Logging specific to the SURF storage module");
 
+xbt_lib_t file_lib;
 xbt_lib_t storage_lib;
 int ROUTING_STORAGE_LEVEL;      //Routing for storagelevel
 int ROUTING_STORAGE_HOST_LEVEL;
 int SURF_STORAGE_LEVEL;
 xbt_lib_t storage_type_lib;
 int ROUTING_STORAGE_TYPE_LEVEL; //Routing for storage_type level
-
 xbt_dynar_t mount_list = NULL;
 StorageModelPtr surf_storage_model = NULL;
 
@@ -64,7 +64,7 @@ Storage::Storage(ModelPtr model, const char *name, xbt_dict_t props,
 
 Storage::Storage(ModelPtr model, const char *name, xbt_dict_t props,
                         lmm_system_t maxminSystem, double bread, double bwrite, double bconnection,
-                    const char* type_id, char *content_name, char *content_type, sg_size_t size)
+                    const char* type_id, char *content_name, char *content_type, sg_size_t size, char *attach)
  :  Resource(model, name, props, lmm_constraint_new(maxminSystem, this, bconnection))
  , p_contentType(content_type)
  , m_size(size), m_usedSize(0)
@@ -72,6 +72,7 @@ Storage::Storage(ModelPtr model, const char *name, xbt_dict_t props,
  , p_writeActions(xbt_dynar_new(sizeof(ActionPtr),NULL)) {
   surf_callback_emit(storageCreatedCallbacks, this);
   p_content = parseContent(content_name);
+  p_attach = xbt_strdup(attach);
   setState(SURF_RESOURCE_ON);
   XBT_DEBUG("Create resource with Bconnection '%f' Bread '%f' Bwrite '%f' and Size '%llu'", bconnection, bread, bwrite, size);
   p_constraintRead  = lmm_constraint_new(maxminSystem, this, bread);
@@ -84,6 +85,7 @@ Storage::~Storage(){
   xbt_dynar_free(&p_writeActions);
   free(p_typeId);
   free(p_contentType);
+  free(p_attach);
 }
 
 xbt_dict_t Storage::parseContent(char *filename)
@@ -96,8 +98,9 @@ xbt_dict_t Storage::parseContent(char *filename)
   FILE *file = NULL;
 
   file = surf_fopen(filename, "r");
-  xbt_assert(file != NULL, "Cannot open file '%s' (path=%s)", filename,
-              xbt_str_join(surf_path, ":"));
+  if (file == NULL)
+    xbt_die("Cannot open file '%s' (path=%s)", filename,
+            xbt_str_join(surf_path, ":"));
 
   char *line = NULL;
   size_t len = 0;
@@ -105,10 +108,9 @@ xbt_dict_t Storage::parseContent(char *filename)
   char path[1024];
   sg_size_t size;
 
-
   while ((read = xbt_getline(&line, &len, file)) != -1) {
     if (read){
-    if(sscanf(line,"%s %llu", path, &size) == 2) {
+      if(sscanf(line,"%s %llu", path, &size) == 2) {
         m_usedSize += size;
         sg_size_t *psize = xbt_new(sg_size_t, 1);
         *psize = size;
index 23c82b4..7e17d8e 100644 (file)
@@ -85,10 +85,15 @@ public:
    * @param content_name [description]
    * @param content_type [description]
    * @param properties [description]
+   * @param attach [description]
    * @return The created Storage
    */
-  virtual StoragePtr createResource(const char* id, const char* type_id,
-                  const char* content_name, const char* content_type, xbt_dict_t properties)=0;
+  virtual StoragePtr createResource(const char* id,
+                                    const char* type_id,
+                                    const char* content_name,
+                                    const char* content_type,
+                                    xbt_dict_t properties,
+                                    const char *attach) = 0;
 
   xbt_dynar_t p_storageList;
 };
@@ -131,12 +136,13 @@ public:
    * @param content_name [description]
    * @param content_type [description]
    * @param size [description]
+   * @param attach [description]
    */
   Storage(ModelPtr model, const char *name, xbt_dict_t props,
           lmm_system_t maxminSystem, double bread, double bwrite,
           double bconnection,
           const char* type_id, char *content_name, char *content_type,
-          sg_size_t size);
+          sg_size_t size, char *attach);
 
   /**
    * @brief Storage destructor
@@ -166,6 +172,7 @@ public:
   sg_size_t m_size;
   sg_size_t m_usedSize;
   char * p_typeId;
+  char* p_attach;
 
   /**
    * @brief Open a file
@@ -175,7 +182,7 @@ public:
    * 
    * @return The StorageAction corresponding to the opening
    */
-  virtual StorageActionPtr open(const char* mount, const char* path)=0;
+  virtual StorageActionPtr open(char* mount, char* path)=0;
 
   /**
    * @brief Close a file
index 4e07fe5..289e657 100644 (file)
@@ -72,7 +72,8 @@ static void parse_storage_init(sg_platf_storage_cbarg_t storage)
                                      ((storage_type_t) stype)->type_id,
                                      storage->content,
                                      storage->content_type,
-                                     storage->properties);
+                                     storage->properties,
+                                     storage->attach);
 }
 
 static void parse_mstorage_init(sg_platf_mstorage_cbarg_t /*mstorage*/)
@@ -234,7 +235,7 @@ StorageN11Model::~StorageN11Model(){
 }
 
 StoragePtr StorageN11Model::createResource(const char* id, const char* type_id,
-               const char* content_name, const char* content_type, xbt_dict_t properties)
+               const char* content_name, const char* content_type, xbt_dict_t properties, const char* attach)
 {
 
   xbt_assert(!surf_storage_resource_priv(surf_storage_resource_by_name(id)),
@@ -249,7 +250,7 @@ StoragePtr StorageN11Model::createResource(const char* id, const char* type_id,
 
   StoragePtr storage = new StorageN11(this, id, properties, p_maxminSystem,
                  Bread, Bwrite, Bconnection,
-                 type_id, (char *)content_name, xbt_strdup(content_type), storage_type->size);
+                 type_id, (char *)content_name, xbt_strdup(content_type), storage_type->size, (char *) attach);
 
   xbt_lib_set(storage_lib, id, SURF_STORAGE_LEVEL, static_cast<ResourcePtr>(storage));
 
@@ -354,9 +355,9 @@ void StorageN11Model::updateActionsState(double /*now*/, double delta)
 
 StorageN11::StorageN11(StorageModelPtr model, const char* name, xbt_dict_t properties,
             lmm_system_t maxminSystem, double bread, double bwrite, double bconnection,
-            const char* type_id, char *content_name, char *content_type, sg_size_t size)
+            const char* type_id, char *content_name, char *content_type, sg_size_t size, char *attach)
  : Storage(model, name, properties,
-          maxminSystem, bread, bwrite, bconnection, type_id, content_name, content_type, size) {
+          maxminSystem, bread, bwrite, bconnection, type_id, content_name, content_type, size, attach) {
   XBT_DEBUG("Create resource with Bconnection '%f' Bread '%f' Bwrite '%f' and Size '%llu'", bconnection, bread, bwrite, size);
 }
 
@@ -405,9 +406,10 @@ StorageActionPtr StorageN11::ls(const char* path)
   return action;
 }
 
-StorageActionPtr StorageN11::open(const char* mount, const char* path)
+StorageActionPtr StorageN11::open(char* mount, char* path)
 {
   XBT_DEBUG("\tOpen file '%s'",path);
+
   sg_size_t size, *psize;
   psize = (sg_size_t*) xbt_dict_get_or_null(p_content, path);
   // if file does not exist create an empty file
@@ -428,6 +430,9 @@ StorageActionPtr StorageN11::open(const char* mount, const char* path)
 
   StorageActionPtr action = new StorageN11Action(getModel(), 0, getState() != SURF_RESOURCE_ON, this, OPEN);
   action->p_file = file;
+  free(path);
+  free(mount);
+
   return action;
 }
 
@@ -496,26 +501,6 @@ void StorageN11::rename(const char *src, const char *dest)
     XBT_DEBUG("File %s doesn't exist",src);
 }
 
-xbt_dict_t StorageN11::getContent()
-{
-  /* For the moment this action has no cost, but in the future we could take in account access latency of the disk */
-  /*surf_action_t action = storage_action_execute(storage,0, LS);*/
-
-  xbt_dict_t content_dict = xbt_dict_new_homogeneous(NULL);
-  xbt_dict_cursor_t cursor = NULL;
-  char *file;
-  sg_size_t *psize;
-
-  xbt_dict_foreach(p_content, cursor, file, psize){
-    xbt_dict_set(content_dict,file,psize,NULL);
-  }
-  return content_dict;
-}
-
-sg_size_t StorageN11::getSize(){
-  return m_size;
-}
-
 /**********
  * Action *
  **********/
index 5582e96..86139cc 100644 (file)
@@ -38,7 +38,7 @@ public:
   StorageN11Model();
   ~StorageN11Model();
   StoragePtr createResource(const char* id, const char* type_id,
-                  const char* content_name, const char* content_type, xbt_dict_t properties);
+                  const char* content_name, const char* content_type, xbt_dict_t properties, const char* attach);
   double shareResources(double now);
   void updateActionsState(double now, double delta);
 };
@@ -51,13 +51,11 @@ class StorageN11 : public Storage {
 public:
   StorageN11(StorageModelPtr model, const char* name, xbt_dict_t properties,
                     lmm_system_t maxminSystem, double bread, double bwrite, double bconnection,
-                    const char* type_id, char *content_name, char *content_type, sg_size_t size);
+                    const char* type_id, char *content_name, char *content_type, sg_size_t size, char *attach);
 
-  StorageActionPtr open(const char* mount, const char* path);
+  StorageActionPtr open(char* mount, char* path);
   StorageActionPtr close(surf_file_t fd);
   StorageActionPtr ls(const char *path);
-  xbt_dict_t getContent();
-  sg_size_t getSize();
   StorageActionPtr read(surf_file_t fd, sg_size_t size);//FIXME:why we have a useless param ptr ??
   StorageActionPtr write(surf_file_t fd, sg_size_t size);//FIXME:why we have a useless param ptr ??
   void rename(const char *src, const char *dest);
index 1bcc47f..c432691 100644 (file)
@@ -278,9 +278,12 @@ surf_action_t surf_workstation_model_communicate(surf_workstation_model_t model,
   return model->communicate(get_casted_workstation(src), get_casted_workstation(dst), size, rate);
 }
 
-xbt_dynar_t surf_workstation_model_get_route(surf_workstation_model_t model,
-                                                    surf_resource_t src, surf_resource_t dst){
-  return model->getRoute(get_casted_workstation(src), get_casted_workstation(dst));
+xbt_dynar_t surf_workstation_model_get_route(surf_workstation_model_t /*model*/,
+                                             surf_resource_t src, surf_resource_t dst){
+  xbt_dynar_t route = NULL;
+  routing_platf->getRouteAndLatency(get_casted_workstation(src)->p_netElm,
+                                           get_casted_workstation(dst)->p_netElm, &route, NULL);
+  return route;
 }
 
 void surf_vm_workstation_model_create(const char *name, surf_resource_t ind_phys_host){
@@ -349,12 +352,16 @@ double surf_workstation_get_consumed_energy(surf_resource_t resource){
   return cpuIt->second->getConsumedEnergy();
 }
 
-xbt_dict_t surf_workstation_get_storage_list(surf_resource_t workstation){
-  return get_casted_workstation(workstation)->getStorageList();
+xbt_dict_t surf_workstation_get_mounted_storage_list(surf_resource_t workstation){
+  return get_casted_workstation(workstation)->getMountedStorageList();
 }
 
-surf_action_t surf_workstation_open(surf_resource_t workstation, const char* mount, const char* path){
-  return get_casted_workstation(workstation)->open(mount, path);
+xbt_dynar_t surf_workstation_get_attached_storage_list(surf_resource_t workstation){
+  return get_casted_workstation(workstation)->getAttachedStorageList();
+}
+
+surf_action_t surf_workstation_open(surf_resource_t workstation, const char* fullpath){
+  return get_casted_workstation(workstation)->open(fullpath);
 }
 
 surf_action_t surf_workstation_close(surf_resource_t workstation, surf_file_t fd){
@@ -469,6 +476,10 @@ sg_size_t surf_storage_get_size(surf_resource_t resource){
   return static_cast<StoragePtr>(surf_storage_resource_priv(resource))->getSize();
 }
 
+const char* surf_storage_get_host(surf_resource_t resource){
+  return static_cast<StoragePtr>(surf_storage_resource_priv(resource))->p_attach;
+}
+
 void surf_storage_rename(surf_resource_t resource, const char* src, const char* dest){
   static_cast<StoragePtr>(surf_storage_resource_priv(resource))->rename(src, dest);
 }
index 4b1889a..6be998b 100644 (file)
@@ -334,7 +334,9 @@ int find_model_description(s_surf_model_description_t * table,
     if (!strcmp(name, table[i].name)) {
       return i;
     }
-  name_list = strdup(table[0].name);
+  if (!table[0].name)
+    xbt_die("No model is valid! This is a bug.");
+  name_list = xbt_strdup(table[0].name);
   for (i = 1; table[i].name; i++) {
     name_list = (char *) xbt_realloc(name_list, strlen(name_list) + strlen(table[i].name) + 3);
     strcat(name_list, ", ");
@@ -370,6 +372,11 @@ static XBT_INLINE void surf_workstation_free(void *r)
   delete static_cast<WorkstationPtr>(r);
 }
 
+static XBT_INLINE void surf_storage_free(void *r)
+{
+  delete static_cast<StoragePtr>(r);
+}
+
 
 void sg_version(int *ver_major,int *ver_minor,int *ver_patch) {
   *ver_major = SIMGRID_VERSION_MAJOR;
@@ -385,6 +392,7 @@ void surf_init(int *argc, char **argv)
   as_router_lib = xbt_lib_new();
   storage_lib = xbt_lib_new();
   storage_type_lib = xbt_lib_new();
+  file_lib = xbt_lib_new();
   watched_hosts_lib = xbt_dict_new_homogeneous(NULL);
 
   XBT_DEBUG("Add routing levels");
@@ -396,6 +404,7 @@ void surf_init(int *argc, char **argv)
   SURF_CPU_LEVEL = xbt_lib_add_level(host_lib,surf_cpu_free);
   SURF_WKS_LEVEL = xbt_lib_add_level(host_lib,surf_workstation_free);
   SURF_LINK_LEVEL = xbt_lib_add_level(link_lib,surf_link_free);
+  SURF_STORAGE_LEVEL = xbt_lib_add_level(storage_lib,surf_storage_free);
 
   xbt_init(argc, argv);
   if (!model_list)
@@ -436,7 +445,7 @@ void surf_exit(void)
   xbt_lib_free(&as_router_lib);
   xbt_lib_free(&storage_lib);
   xbt_lib_free(&storage_type_lib);
-
+  xbt_lib_free(&file_lib);
   xbt_dict_free(&watched_hosts_lib);
 
   xbt_dynar_foreach(model_list, iter, model)
index 7dac341..a56495f 100644 (file)
@@ -365,7 +365,6 @@ private:
   const char *p_name;
   xbt_dict_t p_properties;
   ModelPtr p_model;
-  void *p_resource;
   bool m_running;
   e_surf_resource_state_t m_stateCurrent;
 
@@ -632,6 +631,8 @@ public:
 
   s_xbt_swag_hookup_t p_stateHookup;
 
+  ModelPtr getModel() {return p_model;}
+
 protected:
   ActionListPtr p_stateSet;
   double m_priority; /**< priority (1.0 by default) */
@@ -640,8 +641,6 @@ protected:
   double m_maxDuration; /*< max_duration (may fluctuate until the task is completed) */
   double m_finish; /**< finish time : this is modified during the run and fluctuates until the task is completed */
 
-  ModelPtr getModel() {return p_model;}
-
 private:
   int resourceUsed(void *resource_id);
 
index 3828ad2..f62f852 100644 (file)
 
 #include "simgrid/platf_interface.h"    // platform creation API internal interface
 #include "simgrid/sg_config.h"
+#include "storage_interface.hpp"
 
 #include "surf/surfxml_parse_values.h"
 
+
 /**
  * @ingroup SURF_build_api
  * @brief A library containing all known workstations
@@ -28,6 +30,7 @@ int SIMIX_HOST_LEVEL;           //Simix host level
 int SIMIX_STORAGE_LEVEL;        //Simix storage level
 int MSG_HOST_LEVEL;             //Msg host level
 int MSG_STORAGE_LEVEL;          //Msg storage level
+int MSG_FILE_LEVEL;             //Msg file level
 int SD_HOST_LEVEL;              //Simdag host level
 int SD_STORAGE_LEVEL;           //Simdag storage level
 int COORD_HOST_LEVEL=0;         //Coordinates level
@@ -137,7 +140,7 @@ static void parse_S_host_link(sg_platf_host_link_cbarg_t host)
   // If dynar is is greater than edge id and if the host_link is already defined
   if((int)xbt_dynar_length(current_routing->p_linkUpDownList) > info->getId() &&
       xbt_dynar_get_as(current_routing->p_linkUpDownList, info->getId(), void*))
-    xbt_die("Host_link for '%s' is already defined!",host->id);
+       surf_parse_error("Host_link for '%s' is already defined!",host->id);
 
   XBT_DEBUG("Push Host_link for host '%s' to position %d", info->getName(), info->getId());
   xbt_dynar_set_as(current_routing->p_linkUpDownList, info->getId(), s_surf_parsing_link_up_down_t, link_up_down);
@@ -319,7 +322,7 @@ static void routing_parse_trace_connect(sg_platf_trace_connect_cbarg_t trace_con
         xbt_strdup(trace_connect->element), NULL);
     break;
   default:
-    xbt_die("Cannot connect trace %s to %s: kind of trace unknown",
+       surf_parse_error("Cannot connect trace %s to %s: kind of trace unknown",
         trace_connect->trace, trace_connect->element);
     break;
   }
@@ -1238,6 +1241,22 @@ static void routing_parse_peer(sg_platf_peer_cbarg_t peer)
 //   }
 // }
 
+static void check_disk_attachment()
+{
+  xbt_lib_cursor_t cursor;
+  char *key;
+  void **data;
+  RoutingEdgePtr host_elm;
+  xbt_lib_foreach(storage_lib, cursor, key, data) {
+    if(xbt_lib_get_level(xbt_lib_get_elm_or_null(storage_lib, key), SURF_STORAGE_LEVEL) != NULL) {
+         StoragePtr storage = static_cast<StoragePtr>(xbt_lib_get_level(xbt_lib_get_elm_or_null(storage_lib, key), SURF_STORAGE_LEVEL));
+         host_elm = sg_routing_edge_by_name_or_null(storage->p_attach);
+         if(!host_elm)
+                 surf_parse_error("Enable to attach storage %s: host %s doesn't exist.", storage->getName(), storage->p_attach);
+    }
+  }
+}
+
 void routing_register_callbacks()
 {
   sg_platf_host_add_cb(parse_S_host);
@@ -1253,6 +1272,7 @@ void routing_register_callbacks()
 
   sg_platf_peer_add_cb(routing_parse_peer);
   sg_platf_postparse_add_cb(routing_parse_postparse);
+  sg_platf_postparse_add_cb(check_disk_attachment);
 
   /* we care about the ASes while parsing the platf. Incredible, isnt it? */
   sg_platf_AS_end_add_cb(routing_AS_end);
index 48a3ae2..805dd10 100644 (file)
@@ -475,9 +475,9 @@ void AsDijkstra::parseRoute(sg_platf_route_cbarg_t route)
         route->gw_src->getName(), dst, route->gw_dst->getName());
     as_route = 1;
     if(route->gw_dst->getRcType() == SURF_NETWORK_ELEMENT_NULL)
-      xbt_die("The gw_dst '%s' does not exist!",route->gw_dst->getName());
+      surf_parse_error("The gw_dst '%s' does not exist!",route->gw_dst->getName());
     if(route->gw_src->getRcType() == SURF_NETWORK_ELEMENT_NULL)
-      xbt_die("The gw_src '%s' does not exist!",route->gw_src->getName());
+      surf_parse_error("The gw_src '%s' does not exist!",route->gw_src->getName());
   }
 
   RoutingEdgePtr src_net_elm, dst_net_elm;
index f116c4e..18d3c9e 100644 (file)
@@ -177,9 +177,9 @@ void AsFloyd::parseRoute(sg_platf_route_cbarg_t route)
     XBT_DEBUG("Load ASroute from \"%s(%s)\" to \"%s(%s)\"", src,
         route->gw_src->getName(), dst, route->gw_dst->getName());
     if(route->gw_dst->getRcType() == SURF_NETWORK_ELEMENT_NULL)
-      xbt_die("The dst_gateway '%s' does not exist!",route->gw_dst->getName());
+      surf_parse_error("The dst_gateway '%s' does not exist!",route->gw_dst->getName());
     if(route->gw_src->getRcType() == SURF_NETWORK_ELEMENT_NULL)
-      xbt_die("The src_gateway '%s' does not exist!",route->gw_src->getName());
+      surf_parse_error("The src_gateway '%s' does not exist!",route->gw_src->getName());
   }
 
   if(TO_FLOYD_LINK(src_net_elm->getId(), dst_net_elm->getId()))
index 4c0aeb0..d00fdb8 100644 (file)
@@ -54,17 +54,19 @@ AsFull::AsFull(){
 }
 
 AsFull::~AsFull(){
-  int table_size = (int)xbt_dynar_length(p_indexNetworkElm);
-  int i, j;
-  /* Delete routing table */
-  for (i = 0; i < table_size; i++)
-    for (j = 0; j < table_size; j++) {
-      if (TO_ROUTE_FULL(i,j)){
-        xbt_dynar_free(&TO_ROUTE_FULL(i,j)->link_list);
-        xbt_free(TO_ROUTE_FULL(i,j));
+  if (p_routingTable) {
+    int table_size = (int)xbt_dynar_length(p_indexNetworkElm);
+    int i, j;
+    /* Delete routing table */
+    for (i = 0; i < table_size; i++)
+      for (j = 0; j < table_size; j++) {
+        if (TO_ROUTE_FULL(i,j)){
+          xbt_dynar_free(&TO_ROUTE_FULL(i,j)->link_list);
+          xbt_free(TO_ROUTE_FULL(i,j));
+        }
       }
-    }
-  xbt_free(p_routingTable);
+    xbt_free(p_routingTable);
+  }
 }
 
 xbt_dynar_t AsFull::getOneLinkRoutes()
@@ -182,7 +184,7 @@ void AsFull::parseRoute(sg_platf_route_cbarg_t route)
           "between \"%s\" and \"%s\"", src, dst);
     }
   } else {
-    if (!route->gw_dst && !route->gw_dst)
+    if (!route->gw_src && !route->gw_dst)
       XBT_DEBUG("Load Route from \"%s\" to \"%s\"", src, dst);
     else {
       // FIXME We can call a gw which is down the current AS (cf g5k.xml) but not upper.
@@ -212,12 +214,17 @@ void AsFull::parseRoute(sg_platf_route_cbarg_t route)
       //                         "but '%s' is not in '%s'.",
       //                         route->dst_gateway, subas->name);
       as_route = 1;
-      XBT_DEBUG("Load ASroute from \"%s(%s)\" to \"%s(%s)\"",
-          src, route->gw_src->getName(), dst, route->gw_dst->getName());
-      if (route->gw_dst->getRcType() == SURF_NETWORK_ELEMENT_NULL)
-        xbt_die("The dst_gateway '%s' does not exist!", route->gw_dst->getName());
-      if (route->gw_src->getRcType() == SURF_NETWORK_ELEMENT_NULL)
-        xbt_die("The src_gateway '%s' does not exist!", route->gw_src->getName());
+      XBT_DEBUG("Load ASroute from \"%s\" to \"%s\"", src, dst);
+      if (!route->gw_src ||
+          route->gw_src->getRcType() == SURF_NETWORK_ELEMENT_NULL)
+       surf_parse_error("The src_gateway \"%s\" does not exist!",
+                route->gw_src ? route->gw_src->getName() : "(null)");
+      if (!route->gw_dst ||
+          route->gw_dst->getRcType() == SURF_NETWORK_ELEMENT_NULL)
+       surf_parse_error("The dst_gateway \"%s\" does not exist!",
+                route->gw_dst ? route->gw_dst->getName() : "(null)");
+      XBT_DEBUG("ASroute goes from \"%s\" to \"%s\"",
+                route->gw_src->getName(), route->gw_dst->getName());
     }
     TO_ROUTE_FULL(src_net_elm->getId(), dst_net_elm->getId()) = newExtendedRoute(p_hierarchy, route, 1);
     xbt_dynar_shrink(TO_ROUTE_FULL(src_net_elm->getId(), dst_net_elm->getId())->link_list, 0);
index 908e46e..c67abb4 100644 (file)
@@ -234,7 +234,8 @@ sg_platf_route_cbarg_t AsGeneric::getBypassRoute(RoutingEdgePtr src,
 
     if (src == NULL || dst == NULL)
       xbt_die("Ask for route \"from\"(%s) or \"to\"(%s) no found at AS \"%s\"",
-          src->getName(), dst->getName(), p_name);
+              src ? src->getName() : "(null)",
+              dst ? dst->getName() : "(null)", p_name);
 
     src_as = src->getRcComponent();
     dst_as = dst->getRcComponent();
@@ -439,20 +440,14 @@ AsPtr AsGeneric::processingUnitsExist(char *element)
 
 void AsGeneric::srcDstCheck(RoutingEdgePtr src, RoutingEdgePtr dst)
 {
-
-  RoutingEdgePtr src_data = src;
-  RoutingEdgePtr dst_data = dst;
-
-  if (src_data == NULL || dst_data == NULL)
+  if (src == NULL || dst == NULL)
     xbt_die("Ask for route \"from\"(%s) or \"to\"(%s) no found at AS \"%s\"",
-        src->getName(),
-        dst->getName(),
-        p_name);
+            src ? src->getName() : "(null)",
+            dst ? dst->getName() : "(null)",
+            p_name);
 
-  AsPtr src_as =
-      (src_data)->getRcComponent();
-  AsPtr dst_as =
-      (dst_data)->getRcComponent();
+  AsPtr src_as = src->getRcComponent();
+  AsPtr dst_as = dst->getRcComponent();
 
   if (src_as != dst_as)
     xbt_die("The src(%s in %s) and dst(%s in %s) are in differents AS",
index 6c757e5..ff091ec 100644 (file)
@@ -27,7 +27,6 @@ int ETag_surfxml_include_state(void);
 char* surf_parsed_filename = NULL; // to locate parse error messages
 
 xbt_dynar_t parsed_link_list = NULL;   /* temporary store of current list link of a route */
-extern AS_t current_routing;
 /*
  * Helping functions
  */
@@ -217,9 +216,6 @@ xbt_dict_t random_data_list = NULL;
 YY_BUFFER_STATE surf_input_buffer;
 FILE *surf_file_to_parse = NULL;
 
-static void init_randomness(void);
-static void add_randomness(void);
-
 /*
  * Stuff relative to storage
  */
@@ -239,6 +235,7 @@ void ETag_surfxml_storage(void)
   storage.content = A_surfxml_storage_content;
   storage.content_type = A_surfxml_storage_content___type;
   storage.properties = current_property_set;
+  storage.attach = A_surfxml_storage_attach;
   sg_platf_new_storage(&storage);
   current_property_set = NULL;
 }
@@ -768,6 +765,13 @@ void ETag_surfxml_ASroute(void){
   ASroute.gw_src = sg_routing_edge_by_name_or_null(A_surfxml_ASroute_gw___src);
   ASroute.gw_dst = sg_routing_edge_by_name_or_null(A_surfxml_ASroute_gw___dst);
 
+  if (A_surfxml_ASroute_gw___src && !ASroute.gw_src)
+    surf_parse_error("gw_src=\"%s\" not found for ASroute from \"%s\" to \"%s\"",
+                     A_surfxml_ASroute_gw___src, ASroute.src, ASroute.dst);
+  if (A_surfxml_ASroute_gw___dst && !ASroute.gw_dst)
+    surf_parse_error("gw_dst=\"%s\" not found for ASroute from \"%s\" to \"%s\"",
+                     A_surfxml_ASroute_gw___dst, ASroute.src, ASroute.dst);
+
   ASroute.link_list = parsed_link_list;
 
   switch (A_surfxml_ASroute_symmetrical) {
@@ -1049,8 +1053,6 @@ int_f_void_t surf_parse = _surf_parse;
  * With XML parser
  */
 
-/* Random tag functions */
-
 double get_cpu_power(const char *power)
 {
   double power_scale = 0.0;
@@ -1078,44 +1080,6 @@ double random_min, random_max, random_mean, random_std_deviation;
 e_random_generator_t random_generator;
 char *random_id;
 
-static void init_randomness(void)
-{
-  random_id = A_surfxml_random_id;
-  random_min = surf_parse_get_double(A_surfxml_random_min);
-  random_max = surf_parse_get_double(A_surfxml_random_max);
-  random_mean = surf_parse_get_double(A_surfxml_random_mean);
-  random_std_deviation = surf_parse_get_double(A_surfxml_random_std___deviation);
-  switch (A_surfxml_random_generator) {
-  case AU_surfxml_random_generator:
-  case A_surfxml_random_generator_NONE:
-    random_generator = NONE;
-    break;
-  case A_surfxml_random_generator_DRAND48:
-    random_generator = DRAND48;
-    break;
-  case A_surfxml_random_generator_RAND:
-    random_generator = RAND;
-    break;
-  case A_surfxml_random_generator_RNGSTREAM:
-    random_generator = RNGSTREAM;
-    break;
-  default:
-    surf_parse_error("Invalid random generator");
-    break;
-  }
-}
-
-static void add_randomness(void)
-{
-  /* If needed, additional properties can be added by using the prop tag */
-  random_data_t random =
-      random_new(random_generator, 0, random_min, random_max, random_mean,
-                 random_std_deviation);
-  xbt_dict_set(random_data_list, random_id, (void *) random,
-               &xbt_free_ref);
-}
-
-
 xbt_dict_t get_as_router_properties(const char* name)
 {
   return xbt_lib_get_or_null(as_router_lib, name, ROUTING_PROP_ASR_LEVEL);
index 198b745..2c93389 100644 (file)
@@ -119,6 +119,6 @@ void parse_platform_file(const char *file)
   /* Stop the flex parser */
   surf_parse_close();
   if (parse_status)
-    xbt_die("Parse error in %s", file);
+    surf_parse_error("Parse error in %s", file);
 }
 
index baad9ae..92b0246 100644 (file)
@@ -31,11 +31,6 @@ void WorkstationVMHL13Model::updateActionsState(double /*now*/, double /*delta*/
   return;
 }
 
-xbt_dynar_t WorkstationVMHL13Model::getRoute(WorkstationPtr src, WorkstationPtr dst){
-  XBT_DEBUG("ws_get_route");
-  return surf_network_model->getRoute(src->p_netElm, dst->p_netElm);
-}
-
 ActionPtr WorkstationVMHL13Model::communicate(WorkstationPtr src, WorkstationPtr dst, double size, double rate){
   return surf_network_model->communicate(src->p_netElm, dst->p_netElm, size, rate);
 }
index cf3d23f..24d6175 100644 (file)
@@ -39,7 +39,6 @@ public:
   void createResource(const char *name, void *ind_phys_workstation);
   double shareResources(double now);
   void adjustWeightOfDummyCpuActions() {};
-  xbt_dynar_t getRoute(WorkstationPtr src, WorkstationPtr dst);
   ActionPtr communicate(WorkstationPtr src, WorkstationPtr dst, double size, double rate);
   ActionPtr executeParallelTask(int workstation_nb,
                                           void **workstation_list,
index 1848fd5..254c1d1 100644 (file)
@@ -50,11 +50,6 @@ void surf_workstation_model_init_compound()
   sg_platf_host_add_cb(workstation_new);
 }
 
-WorkstationCLM03Model::WorkstationCLM03Model(const char *name)
- : WorkstationModel(name)
-{}
-
-
 WorkstationCLM03Model::WorkstationCLM03Model()
  : WorkstationModel("Workstation")
 {
@@ -139,13 +134,6 @@ ActionPtr WorkstationCLM03Model::executeParallelTask(int workstation_nb,
   return NULL;
 }
 
-/* returns an array of network_link_CM02_t */
-xbt_dynar_t WorkstationCLM03Model::getRoute(WorkstationPtr src, WorkstationPtr dst)
-{
-  XBT_DEBUG("ws_get_route");
-  return surf_network_model->getRoute(src->p_netElm, dst->p_netElm);
-}
-
 ActionPtr WorkstationCLM03Model::communicate(WorkstationPtr src, WorkstationPtr dst, double size, double rate){
   return surf_network_model->communicate(src->p_netElm, dst->p_netElm, size, rate);
 }
index 0028c52..f471b16 100644 (file)
@@ -31,7 +31,6 @@ typedef WorkstationCLM03Action *WorkstationCLM03ActionPtr;
 
 class WorkstationCLM03Model : public WorkstationModel {
 public:
-  WorkstationCLM03Model(const char *name);
   WorkstationCLM03Model();
   ~WorkstationCLM03Model();
   void parseInit(sg_platf_host_cbarg_t host);
@@ -45,7 +44,6 @@ public:
                                         double *computation_amount,
                                         double *communication_amount,
                                         double rate);
- xbt_dynar_t getRoute(WorkstationPtr src, WorkstationPtr dst);
  ActionPtr communicate(WorkstationPtr src, WorkstationPtr dst, double size, double rate);
 };
 
@@ -77,11 +75,6 @@ public:
  * Action *
  **********/
 
-class WorkstationCLM03Action : public WorkstationAction {
-public:
-  WorkstationCLM03Action(ModelPtr model, double cost, bool failed)
-  : WorkstationAction(model, cost, failed) {}
-};
 
 
 #endif /* SURF_WORKSTATION_CLM03_HPP_ */
index 1b41b0c..09f8af3 100644 (file)
@@ -170,7 +170,7 @@ StoragePtr Workstation::findStorageOnMountList(const char* mount)
   return st;
 }
 
-xbt_dict_t Workstation::getStorageList()
+xbt_dict_t Workstation::getMountedStorageList()
 {
   s_mount_t mnt;
   unsigned int i;
@@ -184,10 +184,60 @@ xbt_dict_t Workstation::getStorageList()
   return storage_list;
 }
 
-ActionPtr Workstation::open(const char* mount, const char* path) {
-  StoragePtr st = findStorageOnMountList(mount);
-  XBT_DEBUG("OPEN on disk '%s'", st->getName());
-  return st->open(mount, path);
+xbt_dynar_t Workstation::getAttachedStorageList()
+{
+  xbt_lib_cursor_t cursor;
+  char *key;
+  void **data;
+  xbt_dynar_t result = xbt_dynar_new(sizeof(void*), NULL);
+  xbt_lib_foreach(storage_lib, cursor, key, data) {
+    if(xbt_lib_get_level(xbt_lib_get_elm_or_null(storage_lib, key), SURF_STORAGE_LEVEL) != NULL) {
+         StoragePtr storage = static_cast<StoragePtr>(xbt_lib_get_level(xbt_lib_get_elm_or_null(storage_lib, key), SURF_STORAGE_LEVEL));
+         if(!strcmp((const char*)storage->p_attach,this->getName())){
+           xbt_dynar_push_as(result, void *,(void *)static_cast<ResourcePtr>(storage)->getName());
+         }
+       }
+  }
+  return result;
+}
+
+ActionPtr Workstation::open(const char* fullpath) {
+
+  StoragePtr st = NULL;
+  s_mount_t mnt;
+  unsigned int cursor;
+  size_t longest_prefix_length = 0;
+  char *path = NULL;
+  char *file_mount_name = NULL;
+  char *mount_name = NULL;
+
+  XBT_DEBUG("Search for storage name for '%s' on '%s'", fullpath, getName());
+  xbt_dynar_foreach(p_storage,cursor,mnt)
+  {
+    XBT_DEBUG("See '%s'",mnt.name);
+    file_mount_name = (char *) xbt_malloc ((strlen(mnt.name)+1));
+    strncpy(file_mount_name,fullpath,strlen(mnt.name));
+    file_mount_name[strlen(mnt.name)] = '\0';
+
+    if(!strcmp(file_mount_name,mnt.name) && strlen(mnt.name)>longest_prefix_length)
+    {/* The current mount name is found in the full path and is bigger than the previous*/
+      longest_prefix_length = strlen(mnt.name);
+      st = static_cast<StoragePtr>(mnt.storage);
+    }
+    free(file_mount_name);
+  }
+  if(longest_prefix_length>0)
+  { /* Mount point found, split fullpath into mount_name and path+filename*/
+       path = (char *) xbt_malloc ((strlen(fullpath)-longest_prefix_length+1));
+       mount_name = (char *) xbt_malloc ((longest_prefix_length+1));
+       strncpy(mount_name, fullpath, longest_prefix_length);
+       path[strlen(fullpath)-longest_prefix_length] = '\0';
+       mount_name[longest_prefix_length] = '\0';
+  }
+  else
+    xbt_die("Can't find mount point for '%s' on '%s'", fullpath, getName());
+
+  return st->open(mount_name, path);
 }
 
 ActionPtr Workstation::close(surf_file_t fd) {
index d0546b5..621771d 100644 (file)
@@ -107,17 +107,6 @@ public:
                                         double *communication_amount,
                                         double rate)=0;
 
- /**
-  * @brief [brief description]
-  * @details [long description]
-  * 
-  * @param src [description]
-  * @param dst [description]
-  * 
-  * @return [description]
-  */
- virtual xbt_dynar_t getRoute(WorkstationPtr src, WorkstationPtr dst)=0;
-
  /**
   * @brief [brief description]
   * @details [long description]
@@ -257,17 +246,24 @@ public:
    * 
    * @return The xbt_dict_t of mount_point: Storage
    */
-  virtual xbt_dict_t getStorageList();
+  virtual xbt_dict_t getMountedStorageList();
+
+  /**
+   * @brief Get the xbt_dynar_t of storages attached to the workstation
+   *
+   * @return The xbt_dynar_t of Storage names
+   */
+  virtual xbt_dynar_t getAttachedStorageList();
 
   /**
    * @brief Open a file
    * 
    * @param mount The mount point
-   * @param path The path to the file
+   * @param path The full path to the file
    * 
    * @return The StorageAction corresponding to the opening
    */
-  virtual ActionPtr open(const char* mount, const char* path);
+  virtual ActionPtr open(const char* fullpath);
 
   /**
    * @brief Close a file
@@ -408,6 +404,7 @@ public:
 /**********
  * Action *
  **********/
+
 /** @ingroup SURF_workstation_interface
  * @brief SURF workstation action interface class
  */
index 898e1e4..a0cf8ed 100644 (file)
@@ -1,19 +1,19 @@
-/* A Bison parser, made by GNU Bison 3.0.2.  */
+/* A Bison parser, made by GNU Bison 2.5.  */
 
 /* Bison implementation for Yacc-like parsers in C
-
-   Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc.
-
+   
+      Copyright (C) 1984, 1989-1990, 2000-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 3 of the License, or
    (at your option) any later version.
-
+   
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
-
+   
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
@@ -26,7 +26,7 @@
    special exception, which will cause the skeleton and the resulting
    Bison output files to be licensed under the GNU General Public
    License without this special exception.
-
+   
    This special exception was added by the Free Software Foundation in
    version 2.2 of Bison.  */
 
@@ -44,7 +44,7 @@
 #define YYBISON 1
 
 /* Bison version.  */
-#define YYBISON_VERSION "3.0.2"
+#define YYBISON_VERSION "2.5"
 
 /* Skeleton name.  */
 #define YYSKELETON_NAME "yacc.c"
 /* Pull parsers.  */
 #define YYPULL 1
 
+/* Using locations.  */
+#define YYLSP_NEEDED 0
 
 /* Substitute the variable and function names.  */
 #define yyparse         xbt_automaton_parser_parse
 #define yylex           xbt_automaton_parser_lex
 #define yyerror         xbt_automaton_parser_error
+#define yylval          xbt_automaton_parser_lval
+#define yychar          xbt_automaton_parser_char
 #define yydebug         xbt_automaton_parser_debug
 #define yynerrs         xbt_automaton_parser_nerrs
 
-#define yylval          xbt_automaton_parser_lval
-#define yychar          xbt_automaton_parser_char
 
 /* Copy the first part of user declarations.  */
-#line 7 "parserPromela.yacc" /* yacc.c:339  */
+
+/* Line 268 of yacc.c  */
+#line 7 "parserPromela.yacc"
 
 
 #include "automaton_lexer.yy.c"
 void yyerror(const char *s);
 
 
-#line 83 "parserPromela.tab.cacc" /* yacc.c:339  */
 
-# ifndef YY_NULLPTR
-#  if defined __cplusplus && 201103L <= __cplusplus
-#   define YY_NULLPTR nullptr
-#  else
-#   define YY_NULLPTR 0
-#  endif
-# endif
+/* Line 268 of yacc.c  */
+#line 89 "parserPromela.tab.cacc"
+
+/* Enabling traces.  */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
 
 /* Enabling verbose error messages.  */
 #ifdef YYERROR_VERBOSE
@@ -97,74 +100,71 @@ void yyerror(const char *s);
 # define YYERROR_VERBOSE 0
 #endif
 
-/* In a future release of Bison, this section will be replaced
-   by #include "parserPromela.tab.hacc".  */
-#ifndef YY_XBT_AUTOMATON_PARSER_PARSERPROMELA_TAB_HACC_INCLUDED
-# define YY_XBT_AUTOMATON_PARSER_PARSERPROMELA_TAB_HACC_INCLUDED
-/* Debug traces.  */
-#ifndef YYDEBUG
-# define YYDEBUG 0
-#endif
-#if YYDEBUG
-extern int xbt_automaton_parser_debug;
+/* Enabling the token table.  */
+#ifndef YYTOKEN_TABLE
+# define YYTOKEN_TABLE 0
 #endif
 
-/* Token type.  */
+
+/* Tokens.  */
 #ifndef YYTOKENTYPE
 # define YYTOKENTYPE
-  enum yytokentype
-  {
-    NEVER = 258,
-    IF = 259,
-    FI = 260,
-    IMPLIES = 261,
-    GOTO = 262,
-    AND = 263,
-    OR = 264,
-    NOT = 265,
-    LEFT_PAR = 266,
-    RIGHT_PAR = 267,
-    CASE = 268,
-    COLON = 269,
-    SEMI_COLON = 270,
-    CASE_TRUE = 271,
-    LEFT_BRACE = 272,
-    RIGHT_BRACE = 273,
-    LITT_ENT = 274,
-    LITT_CHAINE = 275,
-    LITT_REEL = 276,
-    ID = 277
-  };
+   /* Put the tokens into the symbol table, so that GDB and other debuggers
+      know about them.  */
+   enum yytokentype {
+     NEVER = 258,
+     IF = 259,
+     FI = 260,
+     IMPLIES = 261,
+     GOTO = 262,
+     AND = 263,
+     OR = 264,
+     NOT = 265,
+     LEFT_PAR = 266,
+     RIGHT_PAR = 267,
+     CASE = 268,
+     COLON = 269,
+     SEMI_COLON = 270,
+     CASE_TRUE = 271,
+     LEFT_BRACE = 272,
+     RIGHT_BRACE = 273,
+     LITT_ENT = 274,
+     LITT_CHAINE = 275,
+     LITT_REEL = 276,
+     ID = 277
+   };
 #endif
 
-/* Value type.  */
+
+
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-typedef union YYSTYPE YYSTYPE;
-union YYSTYPE
+typedef union YYSTYPE
 {
-#line 16 "parserPromela.yacc" /* yacc.c:355  */
+
+/* Line 293 of yacc.c  */
+#line 16 "parserPromela.yacc"
 
   double real;
   int integer;
   char* string;
   xbt_automaton_exp_label_t label;
 
-#line 153 "parserPromela.tab.cacc" /* yacc.c:355  */
-};
+
+
+/* Line 293 of yacc.c  */
+#line 156 "parserPromela.tab.cacc"
+} YYSTYPE;
 # define YYSTYPE_IS_TRIVIAL 1
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
 #endif
 
 
-extern YYSTYPE xbt_automaton_parser_lval;
-
-int xbt_automaton_parser_parse (void);
-
-#endif /* !YY_XBT_AUTOMATON_PARSER_PARSERPROMELA_TAB_HACC_INCLUDED  */
-
 /* Copy the second part of user declarations.  */
 
-#line 168 "parserPromela.tab.cacc" /* yacc.c:358  */
+
+/* Line 343 of yacc.c  */
+#line 168 "parserPromela.tab.cacc"
 
 #ifdef short
 # undef short
@@ -178,8 +178,11 @@ typedef unsigned char yytype_uint8;
 
 #ifdef YYTYPE_INT8
 typedef YYTYPE_INT8 yytype_int8;
-#else
+#elif (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 typedef signed char yytype_int8;
+#else
+typedef short int yytype_int8;
 #endif
 
 #ifdef YYTYPE_UINT16
@@ -199,7 +202,8 @@ typedef short int yytype_int16;
 #  define YYSIZE_T __SIZE_TYPE__
 # elif defined size_t
 #  define YYSIZE_T size_t
-# elif ! defined YYSIZE_T
+# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 #  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
 #  define YYSIZE_T size_t
 # else
@@ -213,68 +217,39 @@ typedef short int yytype_int16;
 # if defined YYENABLE_NLS && YYENABLE_NLS
 #  if ENABLE_NLS
 #   include <libintl.h> /* INFRINGES ON USER NAME SPACE */
-#   define YY_(Msgid) dgettext ("bison-runtime", Msgid)
+#   define YY_(msgid) dgettext ("bison-runtime", msgid)
 #  endif
 # endif
 # ifndef YY_
-#  define YY_(Msgid) Msgid
-# endif
-#endif
-
-#ifndef YY_ATTRIBUTE
-# if (defined __GNUC__                                               \
-      && (2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__)))  \
-     || defined __SUNPRO_C && 0x5110 <= __SUNPRO_C
-#  define YY_ATTRIBUTE(Spec) __attribute__(Spec)
-# else
-#  define YY_ATTRIBUTE(Spec) /* empty */
-# endif
-#endif
-
-#ifndef YY_ATTRIBUTE_PURE
-# define YY_ATTRIBUTE_PURE   YY_ATTRIBUTE ((__pure__))
-#endif
-
-#ifndef YY_ATTRIBUTE_UNUSED
-# define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE ((__unused__))
-#endif
-
-#if !defined _Noreturn \
-     && (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112)
-# if defined _MSC_VER && 1200 <= _MSC_VER
-#  define _Noreturn __declspec (noreturn)
-# else
-#  define _Noreturn YY_ATTRIBUTE ((__noreturn__))
+#  define YY_(msgid) msgid
 # endif
 #endif
 
 /* Suppress unused-variable warnings by "using" E.  */
 #if ! defined lint || defined __GNUC__
-# define YYUSE(E) ((void) (E))
+# define YYUSE(e) ((void) (e))
 #else
-# define YYUSE(E) /* empty */
+# define YYUSE(e) /* empty */
 #endif
 
-#if defined __GNUC__ && 407 <= __GNUC__ * 100 + __GNUC_MINOR__
-/* Suppress an incorrect diagnostic about yylval being uninitialized.  */
-# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
-    _Pragma ("GCC diagnostic push") \
-    _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\
-    _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
-# define YY_IGNORE_MAYBE_UNINITIALIZED_END \
-    _Pragma ("GCC diagnostic pop")
+/* Identity function, used to suppress warnings about constant conditions.  */
+#ifndef lint
+# define YYID(n) (n)
 #else
-# define YY_INITIAL_VALUE(Value) Value
-#endif
-#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
-# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
-# define YY_IGNORE_MAYBE_UNINITIALIZED_END
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static int
+YYID (int yyi)
+#else
+static int
+YYID (yyi)
+    int yyi;
 #endif
-#ifndef YY_INITIAL_VALUE
-# define YY_INITIAL_VALUE(Value) /* Nothing. */
+{
+  return yyi;
+}
 #endif
 
-
 #if ! defined yyoverflow || YYERROR_VERBOSE
 
 /* The parser invokes alloca or malloc; define the necessary symbols.  */
@@ -292,9 +267,9 @@ typedef short int yytype_int16;
 #    define alloca _alloca
 #   else
 #    define YYSTACK_ALLOC alloca
-#    if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS
+#    if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 #     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
-      /* Use EXIT_SUCCESS as a witness for stdlib.h.  */
 #     ifndef EXIT_SUCCESS
 #      define EXIT_SUCCESS 0
 #     endif
@@ -304,8 +279,8 @@ typedef short int yytype_int16;
 # endif
 
 # ifdef YYSTACK_ALLOC
-   /* Pacify GCC's 'empty if-body' warning.  */
-#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
+   /* Pacify GCC's `empty if-body' warning.  */
+#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
 #  ifndef YYSTACK_ALLOC_MAXIMUM
     /* The OS might guarantee only one guard page at the bottom of the stack,
        and a page size can be as small as 4096 bytes.  So we cannot safely
@@ -321,7 +296,7 @@ typedef short int yytype_int16;
 #  endif
 #  if (defined __cplusplus && ! defined EXIT_SUCCESS \
        && ! ((defined YYMALLOC || defined malloc) \
-             && (defined YYFREE || defined free)))
+            && (defined YYFREE || defined free)))
 #   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
 #   ifndef EXIT_SUCCESS
 #    define EXIT_SUCCESS 0
@@ -329,13 +304,15 @@ typedef short int yytype_int16;
 #  endif
 #  ifndef YYMALLOC
 #   define YYMALLOC malloc
-#   if ! defined malloc && ! defined EXIT_SUCCESS
+#   if ! defined malloc && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
 #   endif
 #  endif
 #  ifndef YYFREE
 #   define YYFREE free
-#   if ! defined free && ! defined EXIT_SUCCESS
+#   if ! defined free && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 void free (void *); /* INFRINGES ON USER NAME SPACE */
 #   endif
 #  endif
@@ -345,7 +322,7 @@ void free (void *); /* INFRINGES ON USER NAME SPACE */
 
 #if (! defined yyoverflow \
      && (! defined __cplusplus \
-         || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+        || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
 
 /* A type that is properly aligned for any stack member.  */
 union yyalloc
@@ -370,35 +347,35 @@ union yyalloc
    elements in the stack, and YYPTR gives the new location of the
    stack.  Advance YYPTR to a properly aligned location for the next
    stack.  */
-# define YYSTACK_RELOCATE(Stack_alloc, Stack)                           \
-    do                                                                  \
-      {                                                                 \
-        YYSIZE_T yynewbytes;                                            \
-        YYCOPY (&yyptr->Stack_alloc, Stack, yysize);                    \
-        Stack = &yyptr->Stack_alloc;                                    \
-        yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
-        yyptr += yynewbytes / sizeof (*yyptr);                          \
-      }                                                                 \
-    while (0)
+# define YYSTACK_RELOCATE(Stack_alloc, Stack)                          \
+    do                                                                 \
+      {                                                                        \
+       YYSIZE_T yynewbytes;                                            \
+       YYCOPY (&yyptr->Stack_alloc, Stack, yysize);                    \
+       Stack = &yyptr->Stack_alloc;                                    \
+       yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
+       yyptr += yynewbytes / sizeof (*yyptr);                          \
+      }                                                                        \
+    while (YYID (0))
 
 #endif
 
 #if defined YYCOPY_NEEDED && YYCOPY_NEEDED
-/* Copy COUNT objects from SRC to DST.  The source and destination do
+/* Copy COUNT objects from FROM to TO.  The source and destination do
    not overlap.  */
 # ifndef YYCOPY
 #  if defined __GNUC__ && 1 < __GNUC__
-#   define YYCOPY(Dst, Src, Count) \
-      __builtin_memcpy (Dst, Src, (Count) * sizeof (*(Src)))
+#   define YYCOPY(To, From, Count) \
+      __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
 #  else
-#   define YYCOPY(Dst, Src, Count)              \
-      do                                        \
-        {                                       \
-          YYSIZE_T yyi;                         \
-          for (yyi = 0; yyi < (Count); yyi++)   \
-            (Dst)[yyi] = (Src)[yyi];            \
-        }                                       \
-      while (0)
+#   define YYCOPY(To, From, Count)             \
+      do                                       \
+       {                                       \
+         YYSIZE_T yyi;                         \
+         for (yyi = 0; yyi < (Count); yyi++)   \
+           (To)[yyi] = (From)[yyi];            \
+       }                                       \
+      while (YYID (0))
 #  endif
 # endif
 #endif /* !YYCOPY_NEEDED */
@@ -414,19 +391,17 @@ union yyalloc
 #define YYNNTS  6
 /* YYNRULES -- Number of rules.  */
 #define YYNRULES  13
-/* YYNSTATES -- Number of states.  */
+/* YYNRULES -- Number of states.  */
 #define YYNSTATES  32
 
-/* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
-   by yylex, with out-of-bounds checking.  */
+/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 #define YYUNDEFTOK  2
 #define YYMAXUTOK   277
 
-#define YYTRANSLATE(YYX)                                                \
+#define YYTRANSLATE(YYX)                                               \
   ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
 
-/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM
-   as returned by yylex, without out-of-bounds checking.  */
+/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
 static const yytype_uint8 yytranslate[] =
 {
        0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
@@ -460,7 +435,25 @@ static const yytype_uint8 yytranslate[] =
 };
 
 #if YYDEBUG
-  /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
+/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
+   YYRHS.  */
+static const yytype_uint8 yyprhs[] =
+{
+       0,     0,     3,     8,     9,    10,    19,    20,    27,    31,
+      35,    39,    42,    44
+};
+
+/* YYRHS -- A `-1'-separated list of the rules' RHS.  */
+static const yytype_int8 yyrhs[] =
+{
+      24,     0,    -1,     3,    17,    25,    18,    -1,    -1,    -1,
+      22,    14,    26,     4,    27,     5,    15,    25,    -1,    -1,
+      13,    28,     6,     7,    22,    27,    -1,    11,    28,    12,
+      -1,    28,     9,    28,    -1,    28,     8,    28,    -1,    10,
+      28,    -1,    16,    -1,    22,    -1
+};
+
+/* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
 static const yytype_uint8 yyrline[] =
 {
        0,    53,    53,    56,    57,    57,    60,    61,    64,    65,
@@ -468,7 +461,7 @@ static const yytype_uint8 yyrline[] =
 };
 #endif
 
-#if YYDEBUG || YYERROR_VERBOSE || 0
+#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
    First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
 static const char *const yytname[] =
@@ -477,13 +470,13 @@ static const char *const yytname[] =
   "AND", "OR", "NOT", "LEFT_PAR", "RIGHT_PAR", "CASE", "COLON",
   "SEMI_COLON", "CASE_TRUE", "LEFT_BRACE", "RIGHT_BRACE", "LITT_ENT",
   "LITT_CHAINE", "LITT_REEL", "ID", "$accept", "automaton", "stateseq",
-  "$@1", "option", "exp", YY_NULLPTR
+  "$@1", "option", "exp", 0
 };
 #endif
 
 # ifdef YYPRINT
-/* YYTOKNUM[NUM] -- (External) token number corresponding to the
-   (internal) symbol number NUM (which must be that of a token).  */
+/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
+   token YYLEX-NUM.  */
 static const yytype_uint16 yytoknum[] =
 {
        0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
@@ -492,29 +485,23 @@ static const yytype_uint16 yytoknum[] =
 };
 # endif
 
-#define YYPACT_NINF -16
-
-#define yypact_value_is_default(Yystate) \
-  (!!((Yystate) == (-16)))
-
-#define YYTABLE_NINF -1
-
-#define yytable_value_is_error(Yytable_value) \
-  0
+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
+static const yytype_uint8 yyr1[] =
+{
+       0,    23,    24,    25,    26,    25,    27,    27,    28,    28,
+      28,    28,    28,    28
+};
 
-  /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
-     STATE-NUM.  */
-static const yytype_int8 yypact[] =
+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
+static const yytype_uint8 yyr2[] =
 {
-       0,   -15,    10,   -13,   -16,     2,     1,   -16,   -16,    16,
-       8,   -10,    17,   -10,   -10,   -16,   -16,     9,    11,   -16,
-      -1,    18,   -10,   -10,   -13,   -16,     5,   -16,   -16,   -16,
-       8,   -16
+       0,     2,     4,     0,     0,     8,     0,     6,     3,     3,
+       3,     2,     1,     1
 };
 
-  /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
-     Performed when YYTABLE does not specify something else to do.  Zero
-     means the default is an error.  */
+/* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM.
+   Performed when YYTABLE doesn't specify something else to do.  Zero
+   means the default is an error.  */
 static const yytype_uint8 yydefact[] =
 {
        0,     0,     0,     3,     1,     0,     0,     4,     2,     0,
@@ -523,21 +510,33 @@ static const yytype_uint8 yydefact[] =
        6,     7
 };
 
-  /* YYPGOTO[NTERM-NUM].  */
-static const yytype_int8 yypgoto[] =
+/* YYDEFGOTO[NTERM-NUM].  */
+static const yytype_int8 yydefgoto[] =
 {
-     -16,   -16,     4,   -16,    -7,    -9
+      -1,     2,     6,     9,    12,    17
 };
 
-  /* YYDEFGOTO[NTERM-NUM].  */
-static const yytype_int8 yydefgoto[] =
+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+   STATE-NUM.  */
+#define YYPACT_NINF -16
+static const yytype_int8 yypact[] =
 {
-      -1,     2,     6,     9,    12,    17
+       0,   -15,    10,   -13,   -16,     2,     1,   -16,   -16,    16,
+       8,   -10,    17,   -10,   -10,   -16,   -16,     9,    11,   -16,
+      -1,    18,   -10,   -10,   -13,   -16,     5,   -16,   -16,   -16,
+       8,   -16
 };
 
-  /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
-     positive, shift that token.  If negative, reduce the rule whose
-     number is the opposite.  If YYTABLE_NINF, syntax error.  */
+/* YYPGOTO[NTERM-NUM].  */
+static const yytype_int8 yypgoto[] =
+{
+     -16,   -16,     4,   -16,    -7,    -9
+};
+
+/* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
+   positive, shift that token.  If negative, reduce the rule which
+   number is the opposite.  If YYTABLE_NINF, syntax error.  */
+#define YYTABLE_NINF -1
 static const yytype_uint8 yytable[] =
 {
       13,    14,     3,     1,    19,    20,    15,    22,    23,     5,
@@ -545,6 +544,12 @@ static const yytype_uint8 yytable[] =
       10,    11,    18,    31,     0,    26,    24,    30,    29
 };
 
+#define yypact_value_is_default(yystate) \
+  ((yystate) == (-16))
+
+#define yytable_value_is_error(yytable_value) \
+  YYID (0)
+
 static const yytype_int8 yycheck[] =
 {
       10,    11,    17,     3,    13,    14,    16,     8,     9,    22,
@@ -552,8 +557,8 @@ static const yytype_int8 yycheck[] =
        4,    13,     5,    30,    -1,     7,    15,    22,    24
 };
 
-  /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
-     symbol of state STATE-NUM.  */
+/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+   symbol of state STATE-NUM.  */
 static const yytype_uint8 yystos[] =
 {
        0,     3,    24,    17,     0,    22,    25,    14,    18,    26,
@@ -562,55 +567,94 @@ static const yytype_uint8 yystos[] =
       22,    27
 };
 
-  /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
-static const yytype_uint8 yyr1[] =
-{
-       0,    23,    24,    25,    26,    25,    27,    27,    28,    28,
-      28,    28,    28,    28
-};
-
-  /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.  */
-static const yytype_uint8 yyr2[] =
-{
-       0,     2,     4,     0,     0,     8,     0,     6,     3,     3,
-       3,     2,     1,     1
-};
-
+#define yyerrok                (yyerrstatus = 0)
+#define yyclearin      (yychar = YYEMPTY)
+#define YYEMPTY                (-2)
+#define YYEOF          0
+
+#define YYACCEPT       goto yyacceptlab
+#define YYABORT                goto yyabortlab
+#define YYERROR                goto yyerrorlab
+
+
+/* Like YYERROR except do call yyerror.  This remains here temporarily
+   to ease the transition to the new meaning of YYERROR, for GCC.
+   Once GCC version 2 has supplanted version 1, this can go.  However,
+   YYFAIL appears to be in use.  Nevertheless, it is formally deprecated
+   in Bison 2.4.2's NEWS entry, where a plan to phase it out is
+   discussed.  */
+
+#define YYFAIL         goto yyerrlab
+#if defined YYFAIL
+  /* This is here to suppress warnings from the GCC cpp's
+     -Wunused-macros.  Normally we don't worry about that warning, but
+     some users do, and we want to make it easy for users to remove
+     YYFAIL uses, which will produce warnings from Bison 2.5.  */
+#endif
 
-#define yyerrok         (yyerrstatus = 0)
-#define yyclearin       (yychar = YYEMPTY)
-#define YYEMPTY         (-2)
-#define YYEOF           0
+#define YYRECOVERING()  (!!yyerrstatus)
 
-#define YYACCEPT        goto yyacceptlab
-#define YYABORT         goto yyabortlab
-#define YYERROR         goto yyerrorlab
+#define YYBACKUP(Token, Value)                                 \
+do                                                             \
+  if (yychar == YYEMPTY && yylen == 1)                         \
+    {                                                          \
+      yychar = (Token);                                                \
+      yylval = (Value);                                                \
+      YYPOPSTACK (1);                                          \
+      goto yybackup;                                           \
+    }                                                          \
+  else                                                         \
+    {                                                          \
+      yyerror (YY_("syntax error: cannot back up")); \
+      YYERROR;                                                 \
+    }                                                          \
+while (YYID (0))
+
+
+#define YYTERROR       1
+#define YYERRCODE      256
+
+
+/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
+   If N is 0, then set CURRENT to the empty location which ends
+   the previous symbol: RHS[0] (always defined).  */
+
+#define YYRHSLOC(Rhs, K) ((Rhs)[K])
+#ifndef YYLLOC_DEFAULT
+# define YYLLOC_DEFAULT(Current, Rhs, N)                               \
+    do                                                                 \
+      if (YYID (N))                                                    \
+       {                                                               \
+         (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;        \
+         (Current).first_column = YYRHSLOC (Rhs, 1).first_column;      \
+         (Current).last_line    = YYRHSLOC (Rhs, N).last_line;         \
+         (Current).last_column  = YYRHSLOC (Rhs, N).last_column;       \
+       }                                                               \
+      else                                                             \
+       {                                                               \
+         (Current).first_line   = (Current).last_line   =              \
+           YYRHSLOC (Rhs, 0).last_line;                                \
+         (Current).first_column = (Current).last_column =              \
+           YYRHSLOC (Rhs, 0).last_column;                              \
+       }                                                               \
+    while (YYID (0))
+#endif
 
 
-#define YYRECOVERING()  (!!yyerrstatus)
+/* This macro is provided for backward compatibility. */
 
-#define YYBACKUP(Token, Value)                                  \
-do                                                              \
-  if (yychar == YYEMPTY)                                        \
-    {                                                           \
-      yychar = (Token);                                         \
-      yylval = (Value);                                         \
-      YYPOPSTACK (yylen);                                       \
-      yystate = *yyssp;                                         \
-      goto yybackup;                                            \
-    }                                                           \
-  else                                                          \
-    {                                                           \
-      yyerror (YY_("syntax error: cannot back up")); \
-      YYERROR;                                                  \
-    }                                                           \
-while (0)
+#ifndef YY_LOCATION_PRINT
+# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
+#endif
 
-/* Error token number */
-#define YYTERROR        1
-#define YYERRCODE       256
 
+/* YYLEX -- calling `yylex' with the right arguments.  */
 
+#ifdef YYLEX_PARAM
+# define YYLEX yylex (YYLEX_PARAM)
+#else
+# define YYLEX yylex ()
+#endif
 
 /* Enable debugging if requested.  */
 #if YYDEBUG
@@ -620,46 +664,54 @@ while (0)
 #  define YYFPRINTF fprintf
 # endif
 
-# define YYDPRINTF(Args)                        \
-do {                                            \
-  if (yydebug)                                  \
-    YYFPRINTF Args;                             \
-} while (0)
-
-/* This macro is provided for backward compatibility. */
-#ifndef YY_LOCATION_PRINT
-# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
-#endif
-
+# define YYDPRINTF(Args)                       \
+do {                                           \
+  if (yydebug)                                 \
+    YYFPRINTF Args;                            \
+} while (YYID (0))
 
-# define YY_SYMBOL_PRINT(Title, Type, Value, Location)                    \
-do {                                                                      \
-  if (yydebug)                                                            \
-    {                                                                     \
-      YYFPRINTF (stderr, "%s ", Title);                                   \
-      yy_symbol_print (stderr,                                            \
-                  Type, Value); \
-      YYFPRINTF (stderr, "\n");                                           \
-    }                                                                     \
-} while (0)
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)                   \
+do {                                                                     \
+  if (yydebug)                                                           \
+    {                                                                    \
+      YYFPRINTF (stderr, "%s ", Title);                                          \
+      yy_symbol_print (stderr,                                           \
+                 Type, Value); \
+      YYFPRINTF (stderr, "\n");                                                  \
+    }                                                                    \
+} while (YYID (0))
 
 
-/*----------------------------------------.
-| Print this symbol's value on YYOUTPUT.  |
-`----------------------------------------*/
+/*--------------------------------.
+| Print this symbol on YYOUTPUT.  |
+`--------------------------------*/
 
+/*ARGSUSED*/
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 static void
 yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
+#else
+static void
+yy_symbol_value_print (yyoutput, yytype, yyvaluep)
+    FILE *yyoutput;
+    int yytype;
+    YYSTYPE const * const yyvaluep;
+#endif
 {
-  FILE *yyo = yyoutput;
-  YYUSE (yyo);
   if (!yyvaluep)
     return;
 # ifdef YYPRINT
   if (yytype < YYNTOKENS)
     YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
+# else
+  YYUSE (yyoutput);
 # endif
-  YYUSE (yytype);
+  switch (yytype)
+    {
+      default:
+       break;
+    }
 }
 
 
@@ -667,11 +719,22 @@ yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvalue
 | Print this symbol on YYOUTPUT.  |
 `--------------------------------*/
 
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 static void
 yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
+#else
+static void
+yy_symbol_print (yyoutput, yytype, yyvaluep)
+    FILE *yyoutput;
+    int yytype;
+    YYSTYPE const * const yyvaluep;
+#endif
 {
-  YYFPRINTF (yyoutput, "%s %s (",
-             yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]);
+  if (yytype < YYNTOKENS)
+    YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
+  else
+    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
 
   yy_symbol_value_print (yyoutput, yytype, yyvaluep);
   YYFPRINTF (yyoutput, ")");
@@ -682,8 +745,16 @@ yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
 | TOP (included).                                                   |
 `------------------------------------------------------------------*/
 
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 static void
 yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop)
+#else
+static void
+yy_stack_print (yybottom, yytop)
+    yytype_int16 *yybottom;
+    yytype_int16 *yytop;
+#endif
 {
   YYFPRINTF (stderr, "Stack now");
   for (; yybottom <= yytop; yybottom++)
@@ -694,42 +765,49 @@ yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop)
   YYFPRINTF (stderr, "\n");
 }
 
-# define YY_STACK_PRINT(Bottom, Top)                            \
-do {                                                            \
-  if (yydebug)                                                  \
-    yy_stack_print ((Bottom), (Top));                           \
-} while (0)
+# define YY_STACK_PRINT(Bottom, Top)                           \
+do {                                                           \
+  if (yydebug)                                                 \
+    yy_stack_print ((Bottom), (Top));                          \
+} while (YYID (0))
 
 
 /*------------------------------------------------.
 | Report that the YYRULE is going to be reduced.  |
 `------------------------------------------------*/
 
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yy_reduce_print (YYSTYPE *yyvsp, int yyrule)
+#else
 static void
-yy_reduce_print (yytype_int16 *yyssp, YYSTYPE *yyvsp, int yyrule)
+yy_reduce_print (yyvsp, yyrule)
+    YYSTYPE *yyvsp;
+    int yyrule;
+#endif
 {
-  unsigned long int yylno = yyrline[yyrule];
   int yynrhs = yyr2[yyrule];
   int yyi;
+  unsigned long int yylno = yyrline[yyrule];
   YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
-             yyrule - 1, yylno);
+            yyrule - 1, yylno);
   /* The symbols being reduced.  */
   for (yyi = 0; yyi < yynrhs; yyi++)
     {
       YYFPRINTF (stderr, "   $%d = ", yyi + 1);
-      yy_symbol_print (stderr,
-                       yystos[yyssp[yyi + 1 - yynrhs]],
-                       &(yyvsp[(yyi + 1) - (yynrhs)])
-                                              );
+      yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
+                      &(yyvsp[(yyi + 1) - (yynrhs)])
+                                      );
       YYFPRINTF (stderr, "\n");
     }
 }
 
-# define YY_REDUCE_PRINT(Rule)          \
-do {                                    \
-  if (yydebug)                          \
-    yy_reduce_print (yyssp, yyvsp, Rule); \
-} while (0)
+# define YY_REDUCE_PRINT(Rule)         \
+do {                                   \
+  if (yydebug)                         \
+    yy_reduce_print (yyvsp, Rule); \
+} while (YYID (0))
 
 /* Nonzero means print parse trace.  It is left uninitialized so that
    multiple parsers can coexist.  */
@@ -743,7 +821,7 @@ int yydebug;
 
 
 /* YYINITDEPTH -- initial size of the parser's stacks.  */
-#ifndef YYINITDEPTH
+#ifndef        YYINITDEPTH
 # define YYINITDEPTH 200
 #endif
 
@@ -766,8 +844,15 @@ int yydebug;
 #   define yystrlen strlen
 #  else
 /* Return the length of YYSTR.  */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 static YYSIZE_T
 yystrlen (const char *yystr)
+#else
+static YYSIZE_T
+yystrlen (yystr)
+    const char *yystr;
+#endif
 {
   YYSIZE_T yylen;
   for (yylen = 0; yystr[yylen]; yylen++)
@@ -783,8 +868,16 @@ yystrlen (const char *yystr)
 #  else
 /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
    YYDEST.  */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 static char *
 yystpcpy (char *yydest, const char *yysrc)
+#else
+static char *
+yystpcpy (yydest, yysrc)
+    char *yydest;
+    const char *yysrc;
+#endif
 {
   char *yyd = yydest;
   const char *yys = yysrc;
@@ -814,27 +907,27 @@ yytnamerr (char *yyres, const char *yystr)
       char const *yyp = yystr;
 
       for (;;)
-        switch (*++yyp)
-          {
-          case '\'':
-          case ',':
-            goto do_not_strip_quotes;
-
-          case '\\':
-            if (*++yyp != '\\')
-              goto do_not_strip_quotes;
-            /* Fall through.  */
-          default:
-            if (yyres)
-              yyres[yyn] = *yyp;
-            yyn++;
-            break;
-
-          case '"':
-            if (yyres)
-              yyres[yyn] = '\0';
-            return yyn;
-          }
+       switch (*++yyp)
+         {
+         case '\'':
+         case ',':
+           goto do_not_strip_quotes;
+
+         case '\\':
+           if (*++yyp != '\\')
+             goto do_not_strip_quotes;
+           /* Fall through.  */
+         default:
+           if (yyres)
+             yyres[yyn] = *yyp;
+           yyn++;
+           break;
+
+         case '"':
+           if (yyres)
+             yyres[yyn] = '\0';
+           return yyn;
+         }
     do_not_strip_quotes: ;
     }
 
@@ -857,11 +950,12 @@ static int
 yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
                 yytype_int16 *yyssp, int yytoken)
 {
-  YYSIZE_T yysize0 = yytnamerr (YY_NULLPTR, yytname[yytoken]);
+  YYSIZE_T yysize0 = yytnamerr (0, yytname[yytoken]);
   YYSIZE_T yysize = yysize0;
+  YYSIZE_T yysize1;
   enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
   /* Internationalized format string. */
-  const char *yyformat = YY_NULLPTR;
+  const char *yyformat = 0;
   /* Arguments of yyformat. */
   char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
   /* Number of reported tokens (one for the "unexpected", one per
@@ -869,6 +963,10 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
   int yycount = 0;
 
   /* There are many possibilities here to consider:
+     - Assume YYFAIL is not used.  It's too flawed to consider.  See
+       <http://lists.gnu.org/archive/html/bison-patches/2009-12/msg00024.html>
+       for details.  YYERROR is fine as it does not invoke this
+       function.
      - If this state is a consistent state with a default action, then
        the only way this function was invoked is if the default action
        is an error action.  In that case, don't check for expected
@@ -917,13 +1015,11 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
                     break;
                   }
                 yyarg[yycount++] = yytname[yyx];
-                {
-                  YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]);
-                  if (! (yysize <= yysize1
-                         && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
-                    return 2;
-                  yysize = yysize1;
-                }
+                yysize1 = yysize + yytnamerr (0, yytname[yyx]);
+                if (! (yysize <= yysize1
+                       && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
+                  return 2;
+                yysize = yysize1;
               }
         }
     }
@@ -943,12 +1039,10 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
 # undef YYCASE_
     }
 
-  {
-    YYSIZE_T yysize1 = yysize + yystrlen (yyformat);
-    if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
-      return 2;
-    yysize = yysize1;
-  }
+  yysize1 = yysize + yystrlen (yyformat);
+  if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
+    return 2;
+  yysize = yysize1;
 
   if (*yymsg_alloc < yysize)
     {
@@ -985,20 +1079,48 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
 | Release the memory associated to this symbol.  |
 `-----------------------------------------------*/
 
+/*ARGSUSED*/
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 static void
 yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
+#else
+static void
+yydestruct (yymsg, yytype, yyvaluep)
+    const char *yymsg;
+    int yytype;
+    YYSTYPE *yyvaluep;
+#endif
 {
   YYUSE (yyvaluep);
+
   if (!yymsg)
     yymsg = "Deleting";
   YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
 
-  YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
-  YYUSE (yytype);
-  YY_IGNORE_MAYBE_UNINITIALIZED_END
+  switch (yytype)
+    {
+
+      default:
+       break;
+    }
 }
 
 
+/* Prevent warnings from -Wmissing-prototypes.  */
+#ifdef YYPARSE_PARAM
+#if defined __STDC__ || defined __cplusplus
+int yyparse (void *YYPARSE_PARAM);
+#else
+int yyparse ();
+#endif
+#else /* ! YYPARSE_PARAM */
+#if defined __STDC__ || defined __cplusplus
+int yyparse (void);
+#else
+int yyparse ();
+#endif
+#endif /* ! YYPARSE_PARAM */
 
 
 /* The lookahead symbol.  */
@@ -1006,6 +1128,7 @@ int yychar;
 
 /* The semantic value of the lookahead symbol.  */
 YYSTYPE yylval;
+
 /* Number of syntax errors so far.  */
 int yynerrs;
 
@@ -1014,18 +1137,37 @@ int yynerrs;
 | yyparse.  |
 `----------*/
 
+#ifdef YYPARSE_PARAM
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+int
+yyparse (void *YYPARSE_PARAM)
+#else
+int
+yyparse (YYPARSE_PARAM)
+    void *YYPARSE_PARAM;
+#endif
+#else /* ! YYPARSE_PARAM */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 int
 yyparse (void)
+#else
+int
+yyparse ()
+
+#endif
+#endif
 {
     int yystate;
     /* Number of tokens to shift before error messages enabled.  */
     int yyerrstatus;
 
     /* The stacks and their tools:
-       'yyss': related to states.
-       'yyvs': related to semantic values.
+       `yyss': related to states.
+       `yyvs': related to semantic values.
 
-       Refer to the stacks through separate pointers, to allow yyoverflow
+       Refer to the stacks thru separate pointers, to allow yyoverflow
        to reallocate them elsewhere.  */
 
     /* The state stack.  */
@@ -1043,7 +1185,7 @@ yyparse (void)
   int yyn;
   int yyresult;
   /* Lookahead token as an internal (translated) token number.  */
-  int yytoken = 0;
+  int yytoken;
   /* The variables used to return semantic value and location from the
      action routines.  */
   YYSTYPE yyval;
@@ -1061,8 +1203,9 @@ yyparse (void)
      Keep to zero when no symbol should be popped.  */
   int yylen = 0;
 
-  yyssp = yyss = yyssa;
-  yyvsp = yyvs = yyvsa;
+  yytoken = 0;
+  yyss = yyssa;
+  yyvs = yyvsa;
   yystacksize = YYINITDEPTH;
 
   YYDPRINTF ((stderr, "Starting parse\n"));
@@ -1071,6 +1214,14 @@ yyparse (void)
   yyerrstatus = 0;
   yynerrs = 0;
   yychar = YYEMPTY; /* Cause a token to be read.  */
+
+  /* Initialize stack pointers.
+     Waste one element of value and location stack
+     so that they stay on the same level as the state stack.
+     The wasted elements are never initialized.  */
+  yyssp = yyss;
+  yyvsp = yyvs;
+
   goto yysetstate;
 
 /*------------------------------------------------------------.
@@ -1091,23 +1242,23 @@ yyparse (void)
 
 #ifdef yyoverflow
       {
-        /* Give user a chance to reallocate the stack.  Use copies of
-           these so that the &'s don't force the real ones into
-           memory.  */
-        YYSTYPE *yyvs1 = yyvs;
-        yytype_int16 *yyss1 = yyss;
-
-        /* Each stack pointer address is followed by the size of the
-           data in use in that stack, in bytes.  This used to be a
-           conditional around just the two extra args, but that might
-           be undefined if yyoverflow is a macro.  */
-        yyoverflow (YY_("memory exhausted"),
-                    &yyss1, yysize * sizeof (*yyssp),
-                    &yyvs1, yysize * sizeof (*yyvsp),
-                    &yystacksize);
-
-        yyss = yyss1;
-        yyvs = yyvs1;
+       /* Give user a chance to reallocate the stack.  Use copies of
+          these so that the &'s don't force the real ones into
+          memory.  */
+       YYSTYPE *yyvs1 = yyvs;
+       yytype_int16 *yyss1 = yyss;
+
+       /* Each stack pointer address is followed by the size of the
+          data in use in that stack, in bytes.  This used to be a
+          conditional around just the two extra args, but that might
+          be undefined if yyoverflow is a macro.  */
+       yyoverflow (YY_("memory exhausted"),
+                   &yyss1, yysize * sizeof (*yyssp),
+                   &yyvs1, yysize * sizeof (*yyvsp),
+                   &yystacksize);
+
+       yyss = yyss1;
+       yyvs = yyvs1;
       }
 #else /* no yyoverflow */
 # ifndef YYSTACK_RELOCATE
@@ -1115,22 +1266,22 @@ yyparse (void)
 # else
       /* Extend the stack our own way.  */
       if (YYMAXDEPTH <= yystacksize)
-        goto yyexhaustedlab;
+       goto yyexhaustedlab;
       yystacksize *= 2;
       if (YYMAXDEPTH < yystacksize)
-        yystacksize = YYMAXDEPTH;
+       yystacksize = YYMAXDEPTH;
 
       {
-        yytype_int16 *yyss1 = yyss;
-        union yyalloc *yyptr =
-          (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
-        if (! yyptr)
-          goto yyexhaustedlab;
-        YYSTACK_RELOCATE (yyss_alloc, yyss);
-        YYSTACK_RELOCATE (yyvs_alloc, yyvs);
+       yytype_int16 *yyss1 = yyss;
+       union yyalloc *yyptr =
+         (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+       if (! yyptr)
+         goto yyexhaustedlab;
+       YYSTACK_RELOCATE (yyss_alloc, yyss);
+       YYSTACK_RELOCATE (yyvs_alloc, yyvs);
 #  undef YYSTACK_RELOCATE
-        if (yyss1 != yyssa)
-          YYSTACK_FREE (yyss1);
+       if (yyss1 != yyssa)
+         YYSTACK_FREE (yyss1);
       }
 # endif
 #endif /* no yyoverflow */
@@ -1139,10 +1290,10 @@ yyparse (void)
       yyvsp = yyvs + yysize - 1;
 
       YYDPRINTF ((stderr, "Stack size increased to %lu\n",
-                  (unsigned long int) yystacksize));
+                 (unsigned long int) yystacksize));
 
       if (yyss + yystacksize - 1 <= yyssp)
-        YYABORT;
+       YYABORT;
     }
 
   YYDPRINTF ((stderr, "Entering state %d\n", yystate));
@@ -1171,7 +1322,7 @@ yybackup:
   if (yychar == YYEMPTY)
     {
       YYDPRINTF ((stderr, "Reading a token: "));
-      yychar = yylex ();
+      yychar = YYLEX;
     }
 
   if (yychar <= YYEOF)
@@ -1211,9 +1362,7 @@ yybackup:
   yychar = YYEMPTY;
 
   yystate = yyn;
-  YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
   *++yyvsp = yylval;
-  YY_IGNORE_MAYBE_UNINITIALIZED_END
 
   goto yynewstate;
 
@@ -1236,7 +1385,7 @@ yyreduce:
   yylen = yyr2[yyn];
 
   /* If YYLEN is nonzero, implement the default value of the action:
-     '$$ = $1'.
+     `$$ = $1'.
 
      Otherwise, the following line sets YYVAL to garbage.
      This behavior is undocumented and Bison
@@ -1250,55 +1399,65 @@ yyreduce:
   switch (yyn)
     {
         case 4:
-#line 57 "parserPromela.yacc" /* yacc.c:1646  */
-    { new_state((yyvsp[-1].string), 1);}
-#line 1256 "parserPromela.tab.cacc" /* yacc.c:1646  */
+
+/* Line 1806 of yacc.c  */
+#line 57 "parserPromela.yacc"
+    { new_state((yyvsp[(1) - (2)].string), 1);}
     break;
 
   case 7:
-#line 61 "parserPromela.yacc" /* yacc.c:1646  */
-    { new_transition((yyvsp[-1].string), (yyvsp[-4].label));}
-#line 1262 "parserPromela.tab.cacc" /* yacc.c:1646  */
+
+/* Line 1806 of yacc.c  */
+#line 61 "parserPromela.yacc"
+    { new_transition((yyvsp[(5) - (6)].string), (yyvsp[(2) - (6)].label));}
     break;
 
   case 8:
-#line 64 "parserPromela.yacc" /* yacc.c:1646  */
-    { (yyval.label) = (yyvsp[-1].label); }
-#line 1268 "parserPromela.tab.cacc" /* yacc.c:1646  */
+
+/* Line 1806 of yacc.c  */
+#line 64 "parserPromela.yacc"
+    { (yyval.label) = (yyvsp[(2) - (3)].label); }
     break;
 
   case 9:
-#line 65 "parserPromela.yacc" /* yacc.c:1646  */
-    { (yyval.label) = new_label(0, (yyvsp[-2].label), (yyvsp[0].label)); }
-#line 1274 "parserPromela.tab.cacc" /* yacc.c:1646  */
+
+/* Line 1806 of yacc.c  */
+#line 65 "parserPromela.yacc"
+    { (yyval.label) = new_label(0, (yyvsp[(1) - (3)].label), (yyvsp[(3) - (3)].label)); }
     break;
 
   case 10:
-#line 66 "parserPromela.yacc" /* yacc.c:1646  */
-    { (yyval.label) = new_label(1, (yyvsp[-2].label), (yyvsp[0].label)); }
-#line 1280 "parserPromela.tab.cacc" /* yacc.c:1646  */
+
+/* Line 1806 of yacc.c  */
+#line 66 "parserPromela.yacc"
+    { (yyval.label) = new_label(1, (yyvsp[(1) - (3)].label), (yyvsp[(3) - (3)].label)); }
     break;
 
   case 11:
-#line 67 "parserPromela.yacc" /* yacc.c:1646  */
-    { (yyval.label) = new_label(2, (yyvsp[0].label)); }
-#line 1286 "parserPromela.tab.cacc" /* yacc.c:1646  */
+
+/* Line 1806 of yacc.c  */
+#line 67 "parserPromela.yacc"
+    { (yyval.label) = new_label(2, (yyvsp[(2) - (2)].label)); }
     break;
 
   case 12:
-#line 68 "parserPromela.yacc" /* yacc.c:1646  */
+
+/* Line 1806 of yacc.c  */
+#line 68 "parserPromela.yacc"
     { (yyval.label) = new_label(4); }
-#line 1292 "parserPromela.tab.cacc" /* yacc.c:1646  */
     break;
 
   case 13:
-#line 69 "parserPromela.yacc" /* yacc.c:1646  */
-    { (yyval.label) = new_label(3, (yyvsp[0].string)); }
-#line 1298 "parserPromela.tab.cacc" /* yacc.c:1646  */
+
+/* Line 1806 of yacc.c  */
+#line 69 "parserPromela.yacc"
+    { (yyval.label) = new_label(3, (yyvsp[(1) - (1)].string)); }
     break;
 
 
-#line 1302 "parserPromela.tab.cacc" /* yacc.c:1646  */
+
+/* Line 1806 of yacc.c  */
+#line 1461 "parserPromela.tab.cacc"
       default: break;
     }
   /* User semantic actions sometimes alter yychar, and that requires
@@ -1320,7 +1479,7 @@ yyreduce:
 
   *++yyvsp = yyval;
 
-  /* Now 'shift' the result of the reduction.  Determine what state
+  /* Now `shift' the result of the reduction.  Determine what state
      that goes to, based on the state we popped back to and the rule
      number reduced by.  */
 
@@ -1335,9 +1494,9 @@ yyreduce:
   goto yynewstate;
 
 
-/*--------------------------------------.
-| yyerrlab -- here on detecting error |
-`--------------------------------------*/
+/*------------------------------------.
+| yyerrlab -- here on detecting error |
+`------------------------------------*/
 yyerrlab:
   /* Make sure we have latest lookahead translation.  See comments at
      user semantic actions for why this is necessary.  */
@@ -1388,20 +1547,20 @@ yyerrlab:
   if (yyerrstatus == 3)
     {
       /* If just tried and failed to reuse lookahead token after an
-         error, discard it.  */
+        error, discard it.  */
 
       if (yychar <= YYEOF)
-        {
-          /* Return failure if at end of input.  */
-          if (yychar == YYEOF)
-            YYABORT;
-        }
+       {
+         /* Return failure if at end of input.  */
+         if (yychar == YYEOF)
+           YYABORT;
+       }
       else
-        {
-          yydestruct ("Error: discarding",
-                      yytoken, &yylval);
-          yychar = YYEMPTY;
-        }
+       {
+         yydestruct ("Error: discarding",
+                     yytoken, &yylval);
+         yychar = YYEMPTY;
+       }
     }
 
   /* Else will try to reuse lookahead token after shifting the error
@@ -1420,7 +1579,7 @@ yyerrorlab:
   if (/*CONSTCOND*/ 0)
      goto yyerrorlab;
 
-  /* Do not reclaim the symbols of the rule whose action triggered
+  /* Do not reclaim the symbols of the rule which action triggered
      this YYERROR.  */
   YYPOPSTACK (yylen);
   yylen = 0;
@@ -1433,37 +1592,35 @@ yyerrorlab:
 | yyerrlab1 -- common code for both syntax error and YYERROR.  |
 `-------------------------------------------------------------*/
 yyerrlab1:
-  yyerrstatus = 3;      /* Each real token shifted decrements this.  */
+  yyerrstatus = 3;     /* Each real token shifted decrements this.  */
 
   for (;;)
     {
       yyn = yypact[yystate];
       if (!yypact_value_is_default (yyn))
-        {
-          yyn += YYTERROR;
-          if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
-            {
-              yyn = yytable[yyn];
-              if (0 < yyn)
-                break;
-            }
-        }
+       {
+         yyn += YYTERROR;
+         if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+           {
+             yyn = yytable[yyn];
+             if (0 < yyn)
+               break;
+           }
+       }
 
       /* Pop the current state because it cannot handle the error token.  */
       if (yyssp == yyss)
-        YYABORT;
+       YYABORT;
 
 
       yydestruct ("Error: popping",
-                  yystos[yystate], yyvsp);
+                 yystos[yystate], yyvsp);
       YYPOPSTACK (1);
       yystate = *yyssp;
       YY_STACK_PRINT (yyss, yyssp);
     }
 
-  YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
   *++yyvsp = yylval;
-  YY_IGNORE_MAYBE_UNINITIALIZED_END
 
 
   /* Shift the error token.  */
@@ -1487,7 +1644,7 @@ yyabortlab:
   yyresult = 1;
   goto yyreturn;
 
-#if !defined yyoverflow || YYERROR_VERBOSE
+#if !defined(yyoverflow) || YYERROR_VERBOSE
 /*-------------------------------------------------.
 | yyexhaustedlab -- memory exhaustion comes here.  |
 `-------------------------------------------------*/
@@ -1506,14 +1663,14 @@ yyreturn:
       yydestruct ("Cleanup: discarding lookahead",
                   yytoken, &yylval);
     }
-  /* Do not reclaim the symbols of the rule whose action triggered
+  /* Do not reclaim the symbols of the rule which action triggered
      this YYABORT or YYACCEPT.  */
   YYPOPSTACK (yylen);
   YY_STACK_PRINT (yyss, yyssp);
   while (yyssp != yyss)
     {
       yydestruct ("Cleanup: popping",
-                  yystos[*yyssp], yyvsp);
+                 yystos[*yyssp], yyvsp);
       YYPOPSTACK (1);
     }
 #ifndef yyoverflow
@@ -1524,9 +1681,14 @@ yyreturn:
   if (yymsg != yymsgbuf)
     YYSTACK_FREE (yymsg);
 #endif
-  return yyresult;
+  /* Make sure YYID is used.  */
+  return YYID (yyresult);
 }
-#line 72 "parserPromela.yacc" /* yacc.c:1906  */
+
+
+
+/* Line 2067 of yacc.c  */
+#line 72 "parserPromela.yacc"
 
 
 
@@ -1537,3 +1699,4 @@ void yyerror(const char *s){
 
 
 
+
index 587506e..27ae7bf 100644 (file)
@@ -1,19 +1,19 @@
-/* A Bison parser, made by GNU Bison 3.0.2.  */
+/* A Bison parser, made by GNU Bison 2.5.  */
 
 /* Bison interface for Yacc-like parsers in C
-
-   Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc.
-
+   
+      Copyright (C) 1984, 1989-1990, 2000-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 3 of the License, or
    (at your option) any later version.
-
+   
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
-
+   
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
    special exception, which will cause the skeleton and the resulting
    Bison output files to be licensed under the GNU General Public
    License without this special exception.
-
+   
    This special exception was added by the Free Software Foundation in
    version 2.2 of Bison.  */
 
-#ifndef YY_XBT_AUTOMATON_PARSER_PARSERPROMELA_TAB_HACC_INCLUDED
-# define YY_XBT_AUTOMATON_PARSER_PARSERPROMELA_TAB_HACC_INCLUDED
-/* Debug traces.  */
-#ifndef YYDEBUG
-# define YYDEBUG 0
-#endif
-#if YYDEBUG
-extern int xbt_automaton_parser_debug;
-#endif
 
-/* Token type.  */
+/* Tokens.  */
 #ifndef YYTOKENTYPE
 # define YYTOKENTYPE
-  enum yytokentype
-  {
-    NEVER = 258,
-    IF = 259,
-    FI = 260,
-    IMPLIES = 261,
-    GOTO = 262,
-    AND = 263,
-    OR = 264,
-    NOT = 265,
-    LEFT_PAR = 266,
-    RIGHT_PAR = 267,
-    CASE = 268,
-    COLON = 269,
-    SEMI_COLON = 270,
-    CASE_TRUE = 271,
-    LEFT_BRACE = 272,
-    RIGHT_BRACE = 273,
-    LITT_ENT = 274,
-    LITT_CHAINE = 275,
-    LITT_REEL = 276,
-    ID = 277
-  };
+   /* Put the tokens into the symbol table, so that GDB and other debuggers
+      know about them.  */
+   enum yytokentype {
+     NEVER = 258,
+     IF = 259,
+     FI = 260,
+     IMPLIES = 261,
+     GOTO = 262,
+     AND = 263,
+     OR = 264,
+     NOT = 265,
+     LEFT_PAR = 266,
+     RIGHT_PAR = 267,
+     CASE = 268,
+     COLON = 269,
+     SEMI_COLON = 270,
+     CASE_TRUE = 271,
+     LEFT_BRACE = 272,
+     RIGHT_BRACE = 273,
+     LITT_ENT = 274,
+     LITT_CHAINE = 275,
+     LITT_REEL = 276,
+     ID = 277
+   };
 #endif
 
-/* Value type.  */
+
+
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-typedef union YYSTYPE YYSTYPE;
-union YYSTYPE
+typedef union YYSTYPE
 {
-#line 16 "parserPromela.yacc" /* yacc.c:1909  */
+
+/* Line 2068 of yacc.c  */
+#line 16 "parserPromela.yacc"
 
   double real;
   int integer;
   char* string;
   xbt_automaton_exp_label_t label;
 
-#line 84 "parserPromela.tab.hacc" /* yacc.c:1909  */
-};
+
+
+/* Line 2068 of yacc.c  */
+#line 81 "parserPromela.tab.hacc"
+} YYSTYPE;
 # define YYSTYPE_IS_TRIVIAL 1
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
 #endif
 
-
 extern YYSTYPE xbt_automaton_parser_lval;
 
-int xbt_automaton_parser_parse (void);
 
-#endif /* !YY_XBT_AUTOMATON_PARSER_PARSERPROMELA_TAB_HACC_INCLUDED  */
index 0eb3145..49667dd 100644 (file)
@@ -380,10 +380,11 @@ void xbt_cfg_help(xbt_cfg_t cfg)
     printf("   %s: %s\n", name, variable->desc);
     printf("       Type: %s; ", xbt_cfgelm_type_name[variable->type]);
     if (variable->min != 1 || variable->max != 1) {
-      if (variable->min == 0 && variable->max == 0)
-        printf("Arity: no bound; ");
+      printf("Arity: min:%d to max:", variable->min);
+      if (variable->max == 0)
+        printf("(no bound); ");
       else
-        printf("Arity: min:%d to max:%d; ", variable->min, variable->max);
+        printf("%d; ", variable->max);
     }
     size = xbt_dynar_length(variable->content);
     printf("Current value%s: ", (size <= 1 ? "" : "s"));
@@ -453,6 +454,13 @@ void xbt_cfg_check(xbt_cfg_t cfg)
              size);
     }
 
+    if (variable->isdefault && size > variable->min) {
+      xbt_dict_cursor_free(&cursor);
+      THROWF(mismatch_error, 0,
+             "Config elem %s theoretically accepts %d %s, but has a default of %d values.",
+             name, variable->min, xbt_cfgelm_type_name[variable->type], size);
+    }
+
     if (variable->max > 0 && variable->max < size) {
       xbt_dict_cursor_free(&cursor);
       THROWF(mismatch_error, 0,
index 7b02657..26c9196 100644 (file)
@@ -82,17 +82,6 @@ _xbt_dynar_get_elm(void *const dst,
   memcpy(dst, elm, dynar->elmsize);
 }
 
-static XBT_INLINE
-    void
-_xbt_dynar_put_elm(const xbt_dynar_t dynar,
-                   const unsigned long idx, const void *const src)
-{
-  void *const elm = _xbt_dynar_elm(dynar, idx);
-  const unsigned long elmsize = dynar->elmsize;
-
-  memcpy(elm, src, elmsize);
-}
-
 void xbt_dynar_dump(xbt_dynar_t dynar)
 {
   XBT_INFO("Dynar dump: size=%lu; used=%lu; elmsize=%lu; data=%p; free_f=%p",
index 7c6579d..0f5a9e4 100644 (file)
@@ -474,8 +474,8 @@ static yyconst flex_int16_t yy_accept[564] =
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,   15,    0,    0,   13,
-        0,   14,    0
+        0,    0,    0,    0,    0,    0,   13,    0,    0,   14,
+        0,   15,    0
     } ;
 
 static yyconst flex_int32_t yy_ec[256] =
@@ -1135,42 +1135,42 @@ const char graphxml_flexml_version[] = "1.9.6";
 int graphxml_pcdata_ix;
 extern char *graphxml_bufferstack;
 #define graphxml_pcdata (graphxml_bufferstack + graphxml_pcdata_ix)
+AT_graphxml_node_name AX_graphxml_node_name;
+#define A_graphxml_node_name (graphxml_bufferstack + AX_graphxml_node_name)
+short int graphxml_node_name_isset;
 AT_graphxml_edge_source AX_graphxml_edge_source;
 #define A_graphxml_edge_source (graphxml_bufferstack + AX_graphxml_edge_source)
 short int graphxml_edge_source_isset;
-AT_graphxml_edge_target AX_graphxml_edge_target;
-#define A_graphxml_edge_target (graphxml_bufferstack + AX_graphxml_edge_target)
-short int graphxml_edge_target_isset;
-AT_graphxml_edge_name AX_graphxml_edge_name;
-#define A_graphxml_edge_name (graphxml_bufferstack + AX_graphxml_edge_name)
-short int graphxml_edge_name_isset;
 AT_graphxml_node_position___y AX_graphxml_node_position___y;
 #define A_graphxml_node_position___y (graphxml_bufferstack + AX_graphxml_node_position___y)
 short int graphxml_node_position___y_isset;
-AT_graphxml_node_data AX_graphxml_node_data;
-#define A_graphxml_node_data (graphxml_bufferstack + AX_graphxml_node_data)
-short int graphxml_node_data_isset;
-AT_graphxml_edge_length AX_graphxml_edge_length;
-#define A_graphxml_edge_length (graphxml_bufferstack + AX_graphxml_edge_length)
-short int graphxml_edge_length_isset;
-AT_graphxml_node_label AX_graphxml_node_label;
-#define A_graphxml_node_label (graphxml_bufferstack + AX_graphxml_node_label)
-short int graphxml_node_label_isset;
-AT_graphxml_edge_label AX_graphxml_edge_label;
-#define A_graphxml_edge_label (graphxml_bufferstack + AX_graphxml_edge_label)
-short int graphxml_edge_label_isset;
-AT_graphxml_graph_isDirected AX_graphxml_graph_isDirected;
-#define A_graphxml_graph_isDirected AX_graphxml_graph_isDirected
-short int graphxml_graph_isDirected_isset;
 AT_graphxml_node_position___x AX_graphxml_node_position___x;
 #define A_graphxml_node_position___x (graphxml_bufferstack + AX_graphxml_node_position___x)
 short int graphxml_node_position___x_isset;
 AT_graphxml_edge_data AX_graphxml_edge_data;
 #define A_graphxml_edge_data (graphxml_bufferstack + AX_graphxml_edge_data)
 short int graphxml_edge_data_isset;
-AT_graphxml_node_name AX_graphxml_node_name;
-#define A_graphxml_node_name (graphxml_bufferstack + AX_graphxml_node_name)
-short int graphxml_node_name_isset;
+AT_graphxml_edge_target AX_graphxml_edge_target;
+#define A_graphxml_edge_target (graphxml_bufferstack + AX_graphxml_edge_target)
+short int graphxml_edge_target_isset;
+AT_graphxml_graph_isDirected AX_graphxml_graph_isDirected;
+#define A_graphxml_graph_isDirected AX_graphxml_graph_isDirected
+short int graphxml_graph_isDirected_isset;
+AT_graphxml_node_label AX_graphxml_node_label;
+#define A_graphxml_node_label (graphxml_bufferstack + AX_graphxml_node_label)
+short int graphxml_node_label_isset;
+AT_graphxml_node_data AX_graphxml_node_data;
+#define A_graphxml_node_data (graphxml_bufferstack + AX_graphxml_node_data)
+short int graphxml_node_data_isset;
+AT_graphxml_edge_label AX_graphxml_edge_label;
+#define A_graphxml_edge_label (graphxml_bufferstack + AX_graphxml_edge_label)
+short int graphxml_edge_label_isset;
+AT_graphxml_edge_length AX_graphxml_edge_length;
+#define A_graphxml_edge_length (graphxml_bufferstack + AX_graphxml_edge_length)
+short int graphxml_edge_length_isset;
+AT_graphxml_edge_name AX_graphxml_edge_name;
+#define A_graphxml_edge_name (graphxml_bufferstack + AX_graphxml_edge_name)
+short int graphxml_edge_name_isset;
 
 /* XML state. */
 #ifdef FLEX_DEBUG
@@ -1744,17 +1744,17 @@ FAIL("Bad declaration %s.",xbt_graph_parse_text);
 case 13:
 /* rule 13 can match eol */
 YY_RULE_SETUP
-SET(ROOT_graphxml_node);
+SET(ROOT_graphxml_edge);
        YY_BREAK
 case 14:
 /* rule 14 can match eol */
 YY_RULE_SETUP
-SET(ROOT_graphxml_graph);
+SET(ROOT_graphxml_node);
        YY_BREAK
 case 15:
 /* rule 15 can match eol */
 YY_RULE_SETUP
-SET(ROOT_graphxml_edge);
+SET(ROOT_graphxml_graph);
        YY_BREAK
 case 16:
 /* rule 16 can match eol */
@@ -1851,11 +1851,11 @@ case 30:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</graph>' expected.",xbt_graph_parse_text[0]);
        YY_BREAK
-case YY_STATE_EOF(S_graphxml_graph_3):
-case YY_STATE_EOF(E_graphxml_graph):
 case YY_STATE_EOF(S_graphxml_graph_1):
-case YY_STATE_EOF(S_graphxml_graph):
+case YY_STATE_EOF(E_graphxml_graph):
+case YY_STATE_EOF(S_graphxml_graph_3):
 case YY_STATE_EOF(S_graphxml_graph_5):
+case YY_STATE_EOF(S_graphxml_graph):
 FAIL("Premature EOF: `</graph>' expected.");
        YY_BREAK
 
@@ -1951,7 +1951,7 @@ YY_RULE_SETUP
   if (!AX_graphxml_node_name) FAIL("Required attribute `name' not set for `node' element.");
   LEAVE; STag_graphxml_node(); graphxml_pcdata_ix = 0; ETag_graphxml_node(); popbuffer(); /* attribute */
   switch (YY_START) {
-   case S_graphxml_graph_3: case S_graphxml_graph_2: case S_graphxml_graph: SET(S_graphxml_graph_3); break;
+   case S_graphxml_graph_2: case S_graphxml_graph_3: case S_graphxml_graph: SET(S_graphxml_graph_3); break;
    case ROOT_graphxml_node: SET(EPILOG); break;
   }
  }
@@ -1976,7 +1976,7 @@ YY_RULE_SETUP
   ETag_graphxml_node();
   popbuffer(); /* attribute */
   switch (YY_START) {
-   case S_graphxml_graph_3: case S_graphxml_graph_2: case S_graphxml_graph: SET(S_graphxml_graph_3); break;
+   case S_graphxml_graph_2: case S_graphxml_graph_3: case S_graphxml_graph: SET(S_graphxml_graph_3); break;
    case ROOT_graphxml_node: SET(EPILOG); break;
   }
  }
@@ -2101,7 +2101,7 @@ YY_RULE_SETUP
   if (!AX_graphxml_edge_target) FAIL("Required attribute `target' not set for `edge' element.");
   LEAVE; STag_graphxml_edge(); graphxml_pcdata_ix = 0; ETag_graphxml_edge(); popbuffer(); /* attribute */
   switch (YY_START) {
-   case S_graphxml_graph_3: case S_graphxml_graph_1: case S_graphxml_graph: case S_graphxml_graph_4: case S_graphxml_graph_5: SET(S_graphxml_graph_5); break;
+   case S_graphxml_graph_1: case S_graphxml_graph_3: case S_graphxml_graph_5: case S_graphxml_graph_4: case S_graphxml_graph: SET(S_graphxml_graph_5); break;
    case ROOT_graphxml_edge: SET(EPILOG); break;
   }
  }
@@ -2126,7 +2126,7 @@ YY_RULE_SETUP
   ETag_graphxml_edge();
   popbuffer(); /* attribute */
   switch (YY_START) {
-   case S_graphxml_graph_3: case S_graphxml_graph_1: case S_graphxml_graph: case S_graphxml_graph_4: case S_graphxml_graph_5: SET(S_graphxml_graph_5); break;
+   case S_graphxml_graph_1: case S_graphxml_graph_3: case S_graphxml_graph_5: case S_graphxml_graph_4: case S_graphxml_graph: SET(S_graphxml_graph_5); break;
    case ROOT_graphxml_edge: SET(EPILOG); break;
   }
  }
index 8c594cf..7fa4bc7 100644 (file)
@@ -80,25 +80,28 @@ void xbt_lib_unset(xbt_lib_t lib, const char *key, int level, int invoke_callbac
   }
 
   void *obj = elts[level];
-
   if (!obj) {
      XBT_WARN("no key %s at level %d", key, level);
-  } else {
-     XBT_DEBUG("Remove %p of key %s at level %d", obj, key, level);
-     if (invoke_callback)
-       lib->free_f[level](obj);
-     elts[level] = NULL;
+     return;
   }
 
+  XBT_DEBUG("Remove %p of key %s at level %d", obj, key, level);
+  elts[level] = NULL;
+
   /* check if there still remains any elements of this key */
+  int empty = 1;
   int i;
-  for (i = 0; i < lib->levels; i++) {
+  for (i = 0; i < lib->levels && empty; i++) {
      if (elts[i] != NULL)
-       return;
+       empty = 0;
+  }
+  if (empty) {
+    /* there is no element at any level, so delete the key */
+    xbt_dict_remove(lib->dict, key);
   }
 
-  /* there is no element at any level, so delete the key */
-  xbt_dict_remove(lib->dict, key);
+  if (invoke_callback)
+    lib->free_f[level](obj);
 }
 
 void *xbt_lib_get_or_null(xbt_lib_t lib, const char *key, int level)
index a17a4a3..7258e6f 100644 (file)
@@ -347,7 +347,7 @@ int init_heap_information(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t i1,
 
   state->heaplimit = ((struct mdesc *)heap1)->heaplimit;
 
-  state->s_heap = (char *)mmalloc_get_current_heap() - STD_HEAP_SIZE - getpagesize();
+  state->s_heap = (char *)mmalloc_get_current_heap() - STD_HEAP_SIZE - xbt_pagesize;
 
   state->heapbase1 = (char *)heap1 + BLOCKSIZE;
   state->heapbase2 = (char *)heap2 + BLOCKSIZE;
@@ -1435,7 +1435,7 @@ int mmalloc_linear_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2){
   /* Heap information */
   state->heaplimit = ((struct mdesc *)heap1)->heaplimit;
 
-  state->s_heap = (char *)mmalloc_get_current_heap() - STD_HEAP_SIZE - getpagesize();
+  state->s_heap = (char *)mmalloc_get_current_heap() - STD_HEAP_SIZE - xbt_pagesize;
 
   state->heapbase1 = (char *)heap1 + BLOCKSIZE;
   state->heapbase2 = (char *)heap2 + BLOCKSIZE;
index 7984ad0..0073245 100644 (file)
@@ -7,6 +7,7 @@
 /* Redefine the classical malloc/free/realloc functions so that they fit well in the mmalloc framework */
 
 #include "mmprivate.h"
+#include "xbt_modinter.h"
 #include "internal_config.h"
 #include <math.h>
 
index 7cfde64..08f9de2 100644 (file)
@@ -323,7 +323,7 @@ void *mmalloc_preinit(void)
 {
   int res;
   if (__mmalloc_default_mdp == NULL) {
-    unsigned long mask = ~((unsigned long)getpagesize() - 1);
+    unsigned long mask = ~((unsigned long)xbt_pagesize - 1);
     void *addr = (void*)(((unsigned long)sbrk(0) + HEAP_OFFSET) & mask);
     __mmalloc_default_mdp = xbt_mheap_new(-1, addr);
     /* Fixme? only the default mdp in protected against forks */
index 5ad7cd3..014b8b8 100644 (file)
 #include <stdio.h>
 #include <fcntl.h>
 #include <sys/mman.h>
+#include <sys/wait.h>
 
 #include "mmprivate.h"
 
-/* Cache the pagesize for the current host machine.  Note that if the host
-   does not readily provide a getpagesize() function, we need to emulate it
-   elsewhere, not clutter up this file with lots of kluges to try to figure
-   it out. */
-
-static size_t pagesize;
-
-#define PAGE_ALIGN(addr) (void*) (((long)(addr) + pagesize - 1) & \
-                                  ~(pagesize - 1))
+#define PAGE_ALIGN(addr) (void*) (((long)(addr) + xbt_pagesize - 1) &   \
+                                  ~((long)xbt_pagesize - 1))
 
 /* Return MAP_PRIVATE if MDP represents /dev/zero.  Otherwise, return
    MAP_SHARED.  */
@@ -65,8 +59,6 @@ void *mmorecore(struct mdesc *mdp, ssize_t size)
   char buf = 0;                 /* Single byte to write to extend mapped file */
 
 //  fprintf(stderr,"increase %p by %u\n",mdp,size);
-  if (pagesize == 0)
-    pagesize = getpagesize();
 
   if (size == 0) {
     /* Just return the current "break" value. */
index 7f2030e..01d2982 100644 (file)
@@ -382,6 +382,9 @@ static void search_name(xbt_set_t head, const char *key)
   elm = (my_elem_t) xbt_set_get_by_name(head, key);
   xbt_test_log(" Found %s (under ID %u)\n",
                 elm ? elm->data : "(null)", elm ? elm->ID : -1);
+  if (elm == NULL)
+    THROWF(mismatch_error, 0,
+           "Got a null elm for name %s", key);
   if (strcmp(key, elm->name))
     THROWF(mismatch_error, 0, "The key (%s) is not the one expected (%s)",
            key, elm->name);
@@ -399,6 +402,9 @@ static void search_id(xbt_set_t head, int id, const char *key)
   elm = (my_elem_t) xbt_set_get_by_id(head, id);
   xbt_test_log("Found %s (data %s)",
                 elm ? elm->name : "(null)", elm ? elm->data : "(null)");
+  if (elm == NULL)
+    THROWF(mismatch_error, 0,
+           "Got a null elm for id %d", id);
   if (id != elm->ID)
     THROWF(mismatch_error, 0,
            "The found ID (%u) is not the one expected (%d)", elm->ID, id);
@@ -418,6 +424,8 @@ static void traverse(xbt_set_t set)
 
   xbt_set_foreach(set, cursor, elm) {
     xbt_test_assert(elm, "Dude ! Got a null elm during traversal!");
+    if (!elm)
+      continue;
     xbt_test_log("Id(%u):  %s->%s\n", elm->ID, elm->name, elm->data);
     xbt_test_assert(!strcmp(elm->name, elm->data),
                      "Key(%s) != value(%s). Aborting", elm->name,
@@ -489,7 +497,7 @@ XBT_TEST_UNIT("retrieve", test_set_retrieve, "Retrieving some values")
   xbt_test_add("Search 123");
   elm = (my_elem_t) xbt_set_get_by_name(set, "123");
   xbt_test_assert(elm, "elm must be there");
-  xbt_assert(!strcmp("123", elm->data));
+  xbt_assert(elm && !strcmp("123", elm->data));
 
   search_not_found(set, "Can't be found");
   search_not_found(set, "123 Can't be found");
index 26e8dd1..30c1a84 100644 (file)
@@ -9,7 +9,7 @@
 #include "xbt/misc.h"
 #include "simgrid_config.h"     /* _XBT_WIN32 */
 #include "internal_config.h"    /* MMALLOC_WANT_OVERRIDE_LEGACY */
-
+#include "portable.h"
 #include "xbt/sysdep.h"
 #include "xbt/log.h"
 #include "xbt/dynar.h"
@@ -35,6 +35,8 @@ xbt_dynar_t xbt_cmdline = NULL; /* all we got in argv */
 int xbt_initialized = 0;
 int _sg_do_clean_atexit = 1;
 
+int xbt_pagesize;
+
 /* Declare xbt_preinit and xbt_postexit as constructor/destructor of the library.
  * This is crude and rather compiler-specific, unfortunately.
  */
@@ -84,6 +86,8 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason,
 static void xbt_preinit(void) {
   unsigned int seed = 2147483647;
 
+  xbt_pagesize = sysconf(_SC_PAGESIZE);
+
 #ifdef MMALLOC_WANT_OVERRIDE_LEGACY
   mmalloc_preinit();
 #endif
index ff9d996..f295495 100644 (file)
@@ -54,10 +54,9 @@ static xbt_os_thread_t main_thread = NULL;
 static pthread_key_t xbt_self_thread_key;
 static int thread_mod_inited = 0;
 
-/* attribute structure to handle pthread stack size changing */
+/* defaults attribute for pthreads */
 //FIXME: find where to put this
-static pthread_attr_t attr;
-static int thread_attr_inited = 0;
+static pthread_attr_t thread_attr;
 
 /* frees the xbt_os_thread_t corresponding to the current thread */
 static void xbt_os_thread_free_thread_data(xbt_os_thread_t thread)
@@ -105,11 +104,12 @@ void xbt_os_thread_mod_preinit(void)
   if ((errcode = pthread_setspecific(xbt_self_thread_key, main_thread)))
     THROWF(system_error, errcode,
            "pthread_setspecific failed for xbt_self_thread_key");
-
   
   __xbt_running_ctx_fetch = _os_thread_get_running_ctx;
   __xbt_ex_terminate = _os_thread_ex_terminate;
 
+  pthread_attr_init(&thread_attr);
+
   thread_mod_inited = 1;
 
 #ifndef HAVE_SEM_INIT
@@ -182,7 +182,7 @@ xbt_os_thread_t xbt_os_thread_create(const char *name,
   XBT_RUNNING_CTX_INITIALIZE(res_thread->running_ctx);
   res_thread->extra_data = extra_data;
   
-  if ((errcode = pthread_create(&(res_thread->t), thread_attr_inited!=0? &attr: NULL,
+  if ((errcode = pthread_create(&(res_thread->t), &thread_attr,
                                 wrapper_start_routine, res_thread)))
     THROWF(system_error, errcode,
            "pthread_create failed: %s", strerror(errcode));
@@ -195,35 +195,47 @@ xbt_os_thread_t xbt_os_thread_create(const char *name,
 
 void xbt_os_thread_setstacksize(int stack_size)
 {
+  size_t alignment[] = {
+    xbt_pagesize,
+#ifdef PTHREAD_STACK_MIN
+    PTHREAD_STACK_MIN,
+#endif
+    0
+  };
   size_t sz;
   int res;
+  int i;
 
   if (stack_size < 0)
     xbt_die("stack size %d is negative, maybe it exceeds MAX_INT?", stack_size);
 
   sz = stack_size;
-  pthread_attr_init(&attr);
-  res = pthread_attr_setstacksize(&attr, sz);
+  res = pthread_attr_setstacksize(&thread_attr, sz);
 
-#ifdef PTHREAD_STACK_MIN
-  if (res == EINVAL) {
-    /* Invalid size, try again with a multiple of PTHREAD_STACK_MIN. */
-    size_t rem = sz % PTHREAD_STACK_MIN;
+  for (i = 0; res == EINVAL && alignment[i] > 0; i++) {
+    /* Invalid size, try again with next multiple of alignment[i]. */
+    size_t rem = sz % alignment[i];
     if (rem != 0 || sz == 0) {
-      size_t sz2 = sz - rem + PTHREAD_STACK_MIN;
-      XBT_DEBUG("pthread_attr_setstacksize failed for %#zx, try again with %#zx",
+      size_t sz2 = sz - rem + alignment[i];
+      XBT_DEBUG("pthread_attr_setstacksize failed for %zd, try again with %zd",
                 sz, sz2);
       sz = sz2;
-      res = pthread_attr_setstacksize(&attr, sz);
+      res = pthread_attr_setstacksize(&thread_attr, sz);
     }
   }
-#endif
 
   if (res == EINVAL)
-    XBT_WARN("invalid stack size (maybe too big): %#zx", sz);
+    XBT_WARN("invalid stack size (maybe too big): %zd", sz);
   else if (res != 0)
-    XBT_WARN("unknown error %d in pthread stacksize setting: %#zx", res, sz);
-  thread_attr_inited = 1;
+    XBT_WARN("unknown error %d in pthread stacksize setting: %zd", res, sz);
+}
+
+void xbt_os_thread_setguardsize(int guard_size)
+{
+  size_t sz = guard_size;
+  int res = pthread_attr_setguardsize(&thread_attr, sz);
+  if (res)
+    XBT_WARN("pthread_attr_setguardsize failed (%d) for size: %zd", res, sz);
 }
 
 const char *xbt_os_thread_name(xbt_os_thread_t t)
@@ -754,6 +766,11 @@ void xbt_os_thread_setstacksize(int size)
   stack_size = size;
 }
 
+void xbt_os_thread_setguardsize(int size)
+{
+  XBT_WARN("xbt_os_thread_setguardsize is not implemented (%d)", size);
+}
+
 const char *xbt_os_thread_name(xbt_os_thread_t t)
 {
   return t->name;
index 065b8f6..670d9dc 100644 (file)
@@ -4,34 +4,52 @@ set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")
 
 add_executable(get_sender ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/get_sender.c)
 add_executable(pid ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/pid.c)
+add_executable(host_on_off ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/host_on_off.c)
+add_executable(task_destroy_cancel ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/task_destroy_cancel.c)
+add_executable(process ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/process.c)
+
 
 ### Add definitions for compile
+target_link_libraries(get_sender simgrid)
+target_link_libraries(host_on_off simgrid)
+target_link_libraries(task_destroy_cancel simgrid)
+target_link_libraries(process simgrid)
 if(NOT WIN32)
-  target_link_libraries(get_sender simgrid)
   target_link_libraries(pid simgrid m pthread)
 else()
-  target_link_libraries(get_sender simgrid)
   target_link_libraries(pid simgrid)
 endif()
 
 set(tesh_files
   ${tesh_files}
   ${CMAKE_CURRENT_SOURCE_DIR}/get_sender.tesh
+  ${CMAKE_CURRENT_SOURCE_DIR}/host_on_off.tesh
   ${CMAKE_CURRENT_SOURCE_DIR}/pid.tesh
+  ${CMAKE_CURRENT_SOURCE_DIR}/process.tesh
+  ${CMAKE_CURRENT_SOURCE_DIR}/task_destroy_cancel.tesh
   PARENT_SCOPE
   )
 set(xml_files
   ${xml_files}
   ${CMAKE_CURRENT_SOURCE_DIR}/get_sender_d.xml
   ${CMAKE_CURRENT_SOURCE_DIR}/get_sender_p.xml
+  ${CMAKE_CURRENT_SOURCE_DIR}/host_on_off_d.xml
+  ${CMAKE_CURRENT_SOURCE_DIR}/host_on_off_p.xml
   ${CMAKE_CURRENT_SOURCE_DIR}/pid_d.xml
   ${CMAKE_CURRENT_SOURCE_DIR}/pid_p.xml
+  ${CMAKE_CURRENT_SOURCE_DIR}/process_d.xml
+  ${CMAKE_CURRENT_SOURCE_DIR}/process_p.xml
+  ${CMAKE_CURRENT_SOURCE_DIR}/task_destroy_cancel_d.xml
+  ${CMAKE_CURRENT_SOURCE_DIR}/task_destroy_cancel_p.xml
   PARENT_SCOPE
   )
 set(teshsuite_src
   ${teshsuite_src}
   ${CMAKE_CURRENT_SOURCE_DIR}/get_sender.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/host_on_off.c
   ${CMAKE_CURRENT_SOURCE_DIR}/pid.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/process.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/task_destroy_cancel.c
   PARENT_SCOPE
   )
 set(bin_files
diff --git a/teshsuite/msg/host_on_off.c b/teshsuite/msg/host_on_off.c
new file mode 100644 (file)
index 0000000..3b42831
--- /dev/null
@@ -0,0 +1,132 @@
+/* Copyright (c) 2010-2014. The SimGrid Team.
+ * All rights reserved.                                                     */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include <stdio.h>
+#include "msg/msg.h"            /* Yeah! If you want to use msg, you need to include msg/msg.h */
+#include "xbt/sysdep.h"         /* calloc, printf */
+
+/* Create a log channel to have nice outputs. */
+#include "xbt/log.h"
+#include "xbt/asserts.h"
+XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test,
+                             "Messages specific for this msg example");
+
+int master(int argc, char *argv[]);
+int slave(int argc, char *argv[]);
+
+/** Emitter function  */
+int master(int argc, char *argv[])
+{
+  double task_comp_size = 5E7;
+  double task_comm_size = 1E6;
+
+  char mailbox[256];
+  msg_task_t task = NULL;
+
+  sprintf(mailbox, "jupi");
+
+  task = MSG_task_create("task on", task_comp_size, task_comm_size, NULL);
+  XBT_INFO("Sending \"%s\"", task->name);
+  if (MSG_task_send_with_timeout(task, mailbox, 1) != MSG_OK)
+    MSG_task_destroy(task);
+
+  MSG_process_sleep(1);
+  MSG_host_off(MSG_get_host_by_name("Jupiter"));
+
+  task = MSG_task_create("task off", task_comp_size, task_comm_size, NULL);
+  XBT_INFO("Sending \"%s\"", task->name);
+  if (MSG_task_send_with_timeout(task, mailbox, 1) != MSG_OK)
+    MSG_task_destroy(task);
+
+  MSG_host_on(MSG_get_host_by_name("Jupiter"));
+
+  task = MSG_task_create("task on without proc", task_comp_size, task_comm_size, NULL);
+  XBT_INFO("Sending \"%s\"", task->name);
+  if (MSG_task_send_with_timeout(task, mailbox, 1) != MSG_OK)
+    MSG_task_destroy(task);
+
+  char **argvF = xbt_new(char*, 2);
+  argvF[0] = xbt_strdup("slave");
+  MSG_process_create_with_arguments("slave", slave, NULL, MSG_get_host_by_name("Jupiter"), 1, argvF);
+
+  task = MSG_task_create("task on with proc", task_comp_size, task_comm_size, NULL);
+  XBT_INFO("Sending \"%s\"", task->name);
+  if (MSG_task_send_with_timeout(task, mailbox, 1) != MSG_OK)
+    MSG_task_destroy(task);
+
+  task = MSG_task_create("finalize", 0, 0, 0);
+  XBT_INFO("Sending \"%s\"", task->name);
+  if (MSG_task_send_with_timeout(task, mailbox, 1) != MSG_OK)
+    MSG_task_destroy(task);
+
+  XBT_INFO("Goodbye now!");
+  return 0;
+}                               /* end_of_master */
+
+/** Receiver function  */
+int slave(int argc, char *argv[])
+{
+  msg_task_t task = NULL;
+  _XBT_GNUC_UNUSED int res;
+  int id = -1;
+  char mailbox[80];
+
+  sprintf(mailbox, "jupi");
+
+  while (1) {
+    res = MSG_task_receive(&(task), mailbox);
+    xbt_assert(res == MSG_OK, "MSG_task_get failed");
+
+    if (!strcmp(MSG_task_get_name(task), "finalize")) {
+      MSG_task_destroy(task);
+      break;
+    }
+    MSG_task_execute(task);
+    XBT_INFO("Task \"%s\" done", MSG_task_get_name(task));
+
+    MSG_task_destroy(task);
+    task = NULL;
+    id--;
+  }
+  XBT_INFO("I'm done. See you!");
+  return 0;
+}                               /* end_of_slave */
+
+/** Main function */
+int main(int argc, char *argv[])
+{
+  msg_error_t res;
+  const char *platform_file;
+  const char *application_file;
+
+  MSG_init(&argc, argv);
+  if (argc != 3) {
+    printf("Usage: %s platform_file deployment_file\n", argv[0]);
+    printf("example: %s msg_platform.xml msg_deployment.xml\n", argv[0]);
+    exit(1);
+  }
+  platform_file = argv[1];
+  application_file = argv[2];
+
+  /* MSG_config("workstation/model","KCCFLN05"); */
+  {                             /*  Simulation setting */
+    MSG_create_environment(platform_file);
+  }
+  {                             /*   Application deployment */
+    MSG_function_register("master", master);
+    MSG_function_register("slave", slave);
+
+    MSG_launch_application(application_file);
+  }
+  res = MSG_main();
+
+  XBT_INFO("Simulation time %g", MSG_get_clock());
+
+  if (res == MSG_OK)
+    return 0;
+  else
+    return 1;
+}                               /* end_of_main */
diff --git a/teshsuite/msg/host_on_off.tesh b/teshsuite/msg/host_on_off.tesh
new file mode 100644 (file)
index 0000000..2e3e456
--- /dev/null
@@ -0,0 +1,13 @@
+
+$ msg/host_on_off ${srcdir:=.}/msg/host_on_off_p.xml ${srcdir:=.}/msg/host_on_off_d.xml
+> [Tremblay:master:(1) 0.000000] [msg_test/INFO] Sending "task on"
+> [Jupiter:slave:(2) 0.682345] [msg_test/INFO] Task "task on" done
+> [Tremblay:master:(1) 1.027003] [msg_test/INFO] Sending "task off"
+> [Tremblay:master:(1) 2.027003] [msg_test/INFO] Sending "task on without proc"
+> [Tremblay:master:(1) 3.027003] [msg_test/INFO] Sending "task on with proc"
+> [Tremblay:master:(1) 3.054005] [msg_test/INFO] Sending "finalize"
+> [Jupiter:slave:(3) 3.709348] [msg_test/INFO] Task "task on with proc" done
+> [Tremblay:master:(1) 3.710127] [msg_test/INFO] Goodbye now!
+> [Jupiter:slave:(3) 3.710127] [msg_test/INFO] I'm done. See you!
+> [3.710127] [msg_test/INFO] Simulation time 3.71013
+
diff --git a/teshsuite/msg/host_on_off_d.xml b/teshsuite/msg/host_on_off_d.xml
new file mode 100644 (file)
index 0000000..5c8fc7f
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version='1.0'?>
+<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
+<platform version="3">
+  <!-- The master process (with some arguments) -->
+  <process host="Tremblay" function="master">
+  </process>
+
+  <!-- The slave processes (with mailbox to listen on as argument) -->
+  <process host="Jupiter" function="slave">
+  </process>
+</platform>
diff --git a/teshsuite/msg/host_on_off_p.xml b/teshsuite/msg/host_on_off_p.xml
new file mode 100644 (file)
index 0000000..1947841
--- /dev/null
@@ -0,0 +1,13 @@
+<?xml version='1.0'?>
+<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
+<platform version="3">
+  <!-- The hosts -->
+  <AS  id="AS0"  routing="Full">
+   <host id="Tremblay" power="98.095Mf"/>
+   <host id="Jupiter" power="76.296Mf"/>
+   <link id="1" bandwidth="41.279125MBps" latency="59.904us"/>
+   <route src="Tremblay" dst="Jupiter">
+    <link_ctn id="1"/>
+   </route>
+  </AS>
+</platform>
diff --git a/teshsuite/msg/process.c b/teshsuite/msg/process.c
new file mode 100644 (file)
index 0000000..e999b4b
--- /dev/null
@@ -0,0 +1,107 @@
+/* Copyright (c) 2010-2014. The SimGrid Team.
+ * All rights reserved.                                                     */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include <stdio.h>
+#include "msg/msg.h"            /* Yeah! If you want to use msg, you need to include msg/msg.h */
+#include "xbt/sysdep.h"         /* calloc, printf */
+
+/* Create a log channel to have nice outputs. */
+#include "xbt/log.h"
+#include "xbt/asserts.h"
+XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test,
+                             "Messages specific for this msg example");
+
+int master(int argc, char *argv[]);
+int slave(int argc, char *argv[]);
+
+/** Emitter function  */
+int master(int argc, char *argv[])
+{
+  xbt_swag_t process_list = MSG_host_get_process_list(MSG_host_self());
+  msg_process_t process = NULL;
+  MSG_process_sleep(1);
+  xbt_swag_foreach(process, process_list) {
+    XBT_INFO("Process(pid=%d, ppid=%d, name=%s)",
+             MSG_process_get_PID(process), MSG_process_get_PPID(process),
+             MSG_process_get_name(process));
+    if (MSG_process_self_PID() != MSG_process_get_PID(process))
+      MSG_process_kill(process);
+  }
+  process = MSG_process_create("slave from master",
+                               slave, NULL, MSG_host_self());
+  MSG_process_sleep(2);
+
+  XBT_INFO("Suspend Process(pid=%d)", MSG_process_get_PID(process));
+  MSG_process_suspend(process);
+
+  XBT_INFO("Process(pid=%d) is %ssuspended",
+           MSG_process_get_PID(process),
+           (MSG_process_is_suspended(process)) ? "" : "not ");
+  MSG_process_sleep(2);
+
+  XBT_INFO("Resume Process(pid=%d)", MSG_process_get_PID(process));
+  MSG_process_resume(process);
+
+  XBT_INFO("Process(pid=%d) is %ssuspended",
+           MSG_process_get_PID(process),
+           (MSG_process_is_suspended(process)) ? "" : "not ");
+  MSG_process_sleep(2);
+  MSG_process_kill(process);
+
+  XBT_INFO("Goodbye now!");
+  return 0;
+}                               /* end_of_master */
+
+/** Receiver function  */
+int slave(int argc, char *argv[])
+{
+  MSG_process_sleep(.5);
+  XBT_INFO("Slave started (PID:%d, PPID:%d)",
+           MSG_process_self_PID(), MSG_process_self_PPID());
+  while(1){
+    XBT_INFO("Plop i am %ssuspended",
+             (MSG_process_is_suspended(MSG_process_self())) ? "" : "not ");
+    MSG_process_sleep(1);
+  }
+  XBT_INFO("I'm done. See you!");
+  return 0;
+}                               /* end_of_slave */
+
+/** Main function */
+int main(int argc, char *argv[])
+{
+  msg_error_t res;
+  const char *platform_file;
+  const char *application_file;
+
+  MSG_init(&argc, argv);
+  if (argc != 3) {
+    printf("Usage: %s platform_file deployment_file\n", argv[0]);
+    printf("example: %s msg_platform.xml msg_deployment.xml\n", argv[0]);
+    exit(1);
+  }
+  platform_file = argv[1];
+  application_file = argv[2];
+
+  /* MSG_config("workstation/model","KCCFLN05"); */
+  {                             /*  Simulation setting */
+    MSG_create_environment(platform_file);
+  }
+  {                             /*   Application deployment */
+    MSG_function_register("master", master);
+    MSG_function_register("slave", slave);
+
+    MSG_launch_application(application_file);
+  }
+  res = MSG_main();
+
+  XBT_INFO("Simulation time %g", MSG_get_clock());
+
+  if (res == MSG_OK)
+    return 0;
+  else
+    return 1;
+}                               /* end_of_main */
diff --git a/teshsuite/msg/process.tesh b/teshsuite/msg/process.tesh
new file mode 100644 (file)
index 0000000..728b65c
--- /dev/null
@@ -0,0 +1,17 @@
+
+$ msg/process ${srcdir:=.}/msg/process_p.xml ${srcdir:=.}/msg/process_d.xml
+> [Tremblay:slave:(2) 0.500000] [msg_test/INFO] Slave started (PID:2, PPID:0)
+> [Tremblay:slave:(2) 0.500000] [msg_test/INFO] Plop i am not suspended
+> [Tremblay:master:(1) 1.000000] [msg_test/INFO] Process(pid=1, ppid=0, name=master)
+> [Tremblay:master:(1) 1.000000] [msg_test/INFO] Process(pid=2, ppid=0, name=slave)
+> [Tremblay:slave from master:(3) 1.500000] [msg_test/INFO] Slave started (PID:3, PPID:1)
+> [Tremblay:slave from master:(3) 1.500000] [msg_test/INFO] Plop i am not suspended
+> [Tremblay:slave from master:(3) 2.500000] [msg_test/INFO] Plop i am not suspended
+> [Tremblay:master:(1) 3.000000] [msg_test/INFO] Suspend Process(pid=3)
+> [Tremblay:master:(1) 3.000000] [msg_test/INFO] Process(pid=3) is suspended
+> [Tremblay:master:(1) 5.000000] [msg_test/INFO] Resume Process(pid=3)
+> [Tremblay:master:(1) 5.000000] [msg_test/INFO] Process(pid=3) is not suspended
+> [Tremblay:slave from master:(3) 5.000000] [msg_test/INFO] Plop i am not suspended
+> [Tremblay:slave from master:(3) 6.000000] [msg_test/INFO] Plop i am not suspended
+> [Tremblay:master:(1) 7.000000] [msg_test/INFO] Goodbye now!
+> [7.000000] [msg_test/INFO] Simulation time 7
diff --git a/teshsuite/msg/process_d.xml b/teshsuite/msg/process_d.xml
new file mode 100644 (file)
index 0000000..ee058c5
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version='1.0'?>
+<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
+<platform version="3">
+  <!-- The master process (with some arguments) -->
+  <process host="Tremblay" function="master">
+  </process>
+
+  <!-- The slave processes (with mailbox to listen on as argument) -->
+  <process host="Tremblay" function="slave">
+  </process>
+</platform>
\ No newline at end of file
diff --git a/teshsuite/msg/process_p.xml b/teshsuite/msg/process_p.xml
new file mode 100644 (file)
index 0000000..90e976a
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version='1.0'?>
+<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
+<platform version="3">
+  <!-- The hosts -->
+  <AS  id="AS0"  routing="Full">
+   <host id="Tremblay" power="98.095Mf"/>
+  </AS>
+</platform>
\ No newline at end of file
index 18382b2..aa6b271 100644 (file)
                </storage_type>
 
                <!-- DISKS -->
-               <storage id="cdisk" typeId="single_HDD" content="msg/storage/storage_content_c.txt" />
+               <storage id="cdisk" typeId="single_HDD" content="msg/storage/storage_content_c.txt" attach="client"/>
 
-               <storage id="sdisk1" typeId="single_SSD" content="msg/storage/storage_content_s1.txt">
+               <storage id="sdisk1" typeId="single_SSD" content="msg/storage/storage_content_s1.txt" attach="server">
                        <prop id="usage" value="File system"/>
                </storage>
                        
-               <storage id="sdisk2" typeId="single_HDD" content="msg/storage/storage_content_s2.txt" >
+               <storage id="sdisk2" typeId="single_HDD" content="msg/storage/storage_content_s2.txt" attach="server">
                        <prop id="usage" value="Cache"/>
                </storage>
 
index c386966..38e07ee 100644 (file)
@@ -12,7 +12,7 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(storage,"Messages specific for this simulation");
 void storage_info(msg_host_t host);
 void display_storage_properties(msg_storage_t storage);
 int hsm_put(const char *remote_host, const char *src, const char *dest);
-sg_size_t write_local_file(char *dest, sg_size_t file_size);
+sg_size_t write_local_file(const char *dest, sg_size_t file_size);
 sg_size_t read_local_file(const char *src);
 void dump_storage_by_name(char *name);
 void display_storage_content(msg_storage_t storage);
@@ -30,7 +30,7 @@ void storage_info(msg_host_t host)
   char* storage_name;
   msg_storage_t storage;
 
-  xbt_dict_t storage_list = MSG_host_get_storage_list(MSG_host_self());
+  xbt_dict_t storage_list = MSG_host_get_mounted_storage_list(MSG_host_self());
 
   xbt_dict_foreach(storage_list,cursor,mount_name,storage_name)
   {
@@ -76,10 +76,10 @@ int hsm_put(const char *remote_host, const char *src, const char *dest){
   return 1;
 }
 
-sg_size_t write_local_file(char *dest, sg_size_t file_size)
+sg_size_t write_local_file(const char *dest, sg_size_t file_size)
 {
   sg_size_t written;
-  msg_file_t file = MSG_file_open("/sd1",dest, NULL);
+  msg_file_t file = MSG_file_open(dest, NULL);
   written = MSG_file_write(file, file_size);
   XBT_INFO("%llu bytes on %llu bytes have been written by %s on /sd1",written, file_size, MSG_host_get_name(MSG_host_self()));
   MSG_file_close(file);
@@ -89,7 +89,7 @@ sg_size_t write_local_file(char *dest, sg_size_t file_size)
 sg_size_t read_local_file(const char *src)
 {
   sg_size_t read, file_size;
-  msg_file_t file = MSG_file_open("/sd1",src, NULL);
+  msg_file_t file = MSG_file_open(src, NULL);
   file_size = MSG_file_get_size(file);
 
   read = MSG_file_read(file, file_size);
@@ -132,16 +132,17 @@ void get_set_storage_data(const char *storage_name){
   char *data = MSG_storage_get_data(storage);
   XBT_INFO("Get data: '%s'", data);
 
-  MSG_storage_set_data(storage,strdup("Some data"));
+  MSG_storage_set_data(storage, xbt_strdup("Some data"));
   data = MSG_storage_get_data(storage);
   XBT_INFO("\tSet and get data: '%s'", data);
+  xbt_free(data);
 }
 
 int client(int argc, char *argv[])
 {
-  hsm_put("server","./doc/simgrid/examples/cxx/autoDestination/FinalizeTask.cxx","./scratch/toto.cxx");
-  hsm_put("server","./doc/simgrid/examples/cxx/autoDestination/autoDestination_deployment.xml","./scratch/titi.xml");
-  hsm_put("server","./doc/simgrid/examples/cxx/autoDestination/Slave.cxx","./scratch/tata.cxx");
+  hsm_put("server","/sd1/doc/simgrid/examples/cxx/autoDestination/FinalizeTask.cxx","/sd2/scratch/toto.cxx");
+  hsm_put("server","/sd1/doc/simgrid/examples/cxx/autoDestination/autoDestination_deployment.xml","/sd2/scratch/titi.xml");
+  hsm_put("server","/sd1/doc/simgrid/examples/cxx/autoDestination/Slave.cxx","/sd2/scratch/tata.cxx");
 
   msg_task_t finalize = MSG_task_create("finalize", 0, 0, NULL);
   MSG_task_send(finalize, "server");
index 210727f..3c3c5a6 100644 (file)
@@ -7,10 +7,10 @@ $ msg/storage/storage_basic --cfg=path:${srcdir:=.} ${srcdir:=.}/msg/storage/pla
 > [  0.000000] (1:server@server)               'usage' -> 'File system'
 > [  0.000000] (1:server@server) *** Dump a storage element ***
 > [  0.000000] (1:server@server) Print the content of the storage element: sdisk1
-> [  0.000000] (1:server@server)       ./doc/simgrid/examples/cxx/autoDestination/autoDestination_platform.xml size: 10 bytes
-> [  0.000000] (1:server@server)       ./doc/simgrid/examples/cxx/autoDestination/Forwarder.cxx size: 10 bytes
-> [  0.000000] (1:server@server)       ./doc/simgrid/examples/cxx/autoDestination/Master.cxx size: 10 bytes
-> [  0.000000] (1:server@server)       ./doc/simgrid/examples/cxx/basic/FinalizeTask.cxx size: 10 bytes
+> [  0.000000] (1:server@server)       /doc/simgrid/examples/cxx/autoDestination/Master.cxx size: 10 bytes
+> [  0.000000] (1:server@server)       /doc/simgrid/examples/cxx/basic/FinalizeTask.cxx size: 10 bytes
+> [  0.000000] (1:server@server)       /doc/simgrid/examples/cxx/autoDestination/Forwarder.cxx size: 10 bytes
+> [  0.000000] (1:server@server)       /doc/simgrid/examples/cxx/autoDestination/autoDestination_platform.xml size: 10 bytes
 > [  0.000000] (1:server@server)       Storage name: sdisk2, mount name: /sd2
 > [  0.000000] (1:server@server)               Free size: 805306367980 bytes
 > [  0.000000] (1:server@server)               Used size: 20 bytes
@@ -18,16 +18,16 @@ $ msg/storage/storage_basic --cfg=path:${srcdir:=.} ${srcdir:=.}/msg/storage/pla
 > [  0.000000] (1:server@server)               'usage' -> 'Cache'
 > [  0.000000] (1:server@server) *** Dump a storage element ***
 > [  0.000000] (1:server@server) Print the content of the storage element: sdisk2
-> [  0.000000] (1:server@server)       ./doc/simgrid/examples/cxx/basic/Slave.cxx size: 10 bytes
-> [  0.000000] (1:server@server)       ./doc/simgrid/examples/cxx/basic/Main.cxx size: 10 bytes
+> [  0.000000] (1:server@server)       /doc/simgrid/examples/cxx/basic/Main.cxx size: 10 bytes
+> [  0.000000] (1:server@server)       /doc/simgrid/examples/cxx/basic/Slave.cxx size: 10 bytes
 > [  0.000000] (1:server@server) Server waiting for transfers ...
-> [  0.005000] (2:client@client) client has read 500001 on ./doc/simgrid/examples/cxx/autoDestination/FinalizeTask.cxx
+> [  0.005000] (2:client@client) client has read 500001 on /sd1/doc/simgrid/examples/cxx/autoDestination/FinalizeTask.cxx
 > [  0.005000] (2:client@client) client sends 500001 to server
 > [  0.026647] (1:server@server) 500001 bytes on 500001 bytes have been written by server on /sd1
-> [  0.417980] (2:client@client) client has read 800000 on ./doc/simgrid/examples/cxx/autoDestination/autoDestination_deployment.xml
+> [  0.417980] (2:client@client) client has read 800000 on /sd1/doc/simgrid/examples/cxx/autoDestination/autoDestination_deployment.xml
 > [  0.417980] (2:client@client) client sends 800000 to server
 > [  0.452225] (1:server@server) 800000 bytes on 800000 bytes have been written by server on /sd1
-> [  1.283559] (2:client@client) client has read 45800000 on ./doc/simgrid/examples/cxx/autoDestination/Slave.cxx
+> [  1.283559] (2:client@client) client has read 45800000 on /sd1/doc/simgrid/examples/cxx/autoDestination/Slave.cxx
 > [  1.283559] (2:client@client) client sends 45800000 to server
 > [  3.207494] (1:server@server) 45800000 bytes on 45800000 bytes have been written by server on /sd1
 > [  3.208145] (2:client@client) *** GET/SET DATA for storage element: cdisk ***
@@ -35,27 +35,26 @@ $ msg/storage/storage_basic --cfg=path:${srcdir:=.} ${srcdir:=.}/msg/storage/pla
 > [  3.208145] (2:client@client)       Set and get data: 'Some data'
 > [  3.208145] (1:server@server) *** Storage info on server ***
 > [  3.208145] (1:server@server)       Storage name: sdisk1, mount name: /sd1
-> [  3.208145] (1:server@server)               Free size: 322075447159 bytes
-> [  3.208145] (1:server@server)               Used size: 47100041 bytes
+> [  3.208145] (1:server@server)               Free size: 322122547160 bytes
+> [  3.208145] (1:server@server)               Used size: 40 bytes
 > [  3.208145] (1:server@server)       Properties of mounted storage: sdisk1
 > [  3.208145] (1:server@server)               'usage' -> 'File system'
 > [  3.208145] (1:server@server) *** Dump a storage element ***
 > [  3.208145] (1:server@server) Print the content of the storage element: sdisk1
-> [  3.208145] (1:server@server)       ./scratch/titi.xml size: 800000 bytes
-> [  3.208145] (1:server@server)       ./doc/simgrid/examples/cxx/autoDestination/autoDestination_platform.xml size: 10 bytes
-> [  3.208145] (1:server@server)       ./scratch/tata.cxx size: 45800000 bytes
-> [  3.208145] (1:server@server)       ./doc/simgrid/examples/cxx/autoDestination/Forwarder.cxx size: 10 bytes
-> [  3.208145] (1:server@server)       ./scratch/toto.cxx size: 500001 bytes
-> [  3.208145] (1:server@server)       ./doc/simgrid/examples/cxx/autoDestination/Master.cxx size: 10 bytes
-> [  3.208145] (1:server@server)       ./doc/simgrid/examples/cxx/basic/FinalizeTask.cxx size: 10 bytes
+> [  3.208145] (1:server@server)       /doc/simgrid/examples/cxx/autoDestination/Master.cxx size: 10 bytes
+> [  3.208145] (1:server@server)       /doc/simgrid/examples/cxx/basic/FinalizeTask.cxx size: 10 bytes
+> [  3.208145] (1:server@server)       /doc/simgrid/examples/cxx/autoDestination/Forwarder.cxx size: 10 bytes
+> [  3.208145] (1:server@server)       /doc/simgrid/examples/cxx/autoDestination/autoDestination_platform.xml size: 10 bytes
 > [  3.208145] (1:server@server)       Storage name: sdisk2, mount name: /sd2
-> [  3.208145] (1:server@server)               Free size: 805306367980 bytes
-> [  3.208145] (1:server@server)               Used size: 20 bytes
+> [  3.208145] (1:server@server)               Free size: 805259267979 bytes
+> [  3.208145] (1:server@server)               Used size: 47100021 bytes
 > [  3.208145] (1:server@server)       Properties of mounted storage: sdisk2
 > [  3.208145] (1:server@server)               'usage' -> 'Cache'
 > [  3.208145] (1:server@server) *** Dump a storage element ***
 > [  3.208145] (1:server@server) Print the content of the storage element: sdisk2
-> [  3.208145] (1:server@server)       ./doc/simgrid/examples/cxx/basic/Slave.cxx size: 10 bytes
-> [  3.208145] (1:server@server)       ./doc/simgrid/examples/cxx/basic/Main.cxx size: 10 bytes
+> [  3.208145] (1:server@server)       /scratch/titi.xml size: 800000 bytes
+> [  3.208145] (1:server@server)       /scratch/tata.cxx size: 45800000 bytes
+> [  3.208145] (1:server@server)       /doc/simgrid/examples/cxx/basic/Main.cxx size: 10 bytes
+> [  3.208145] (1:server@server)       /scratch/toto.cxx size: 500001 bytes
+> [  3.208145] (1:server@server)       /doc/simgrid/examples/cxx/basic/Slave.cxx size: 10 bytes
 > [  3.208145] (0:@) Simulated time: 3.20814
-
index 1c5713f..e495e7e 100644 (file)
@@ -1,5 +1,5 @@
-./doc/simgrid/examples/cxx/autoDestination/FinalizeTask.cxx 500001        
-./doc/simgrid/examples/cxx/autoDestination/autoDestination_deployment.xml 800000          
-./doc/simgrid/examples/cxx/autoDestination/Main.cxx 75000000      
-./doc/simgrid/examples/cxx/autoDestination/Slave.cxx 45800000     
-./doc/simgrid/examples/cxx/autoDestination/BasicTask.cxx 400000         
+/doc/simgrid/examples/cxx/autoDestination/FinalizeTask.cxx 500001         
+/doc/simgrid/examples/cxx/autoDestination/autoDestination_deployment.xml 800000           
+/doc/simgrid/examples/cxx/autoDestination/Main.cxx 75000000       
+/doc/simgrid/examples/cxx/autoDestination/Slave.cxx 45800000      
+/doc/simgrid/examples/cxx/autoDestination/BasicTask.cxx 400000          
index 34cb554..f2adbfb 100644 (file)
@@ -1,4 +1,4 @@
-./doc/simgrid/examples/cxx/autoDestination/Master.cxx 10          
-./doc/simgrid/examples/cxx/autoDestination/autoDestination_platform.xml 10   
-./doc/simgrid/examples/cxx/autoDestination/Forwarder.cxx 10       
-./doc/simgrid/examples/cxx/basic/FinalizeTask.cxx 10         
+/doc/simgrid/examples/cxx/autoDestination/Master.cxx 10           
+/doc/simgrid/examples/cxx/autoDestination/autoDestination_platform.xml 10   
+/doc/simgrid/examples/cxx/autoDestination/Forwarder.cxx 10        
+/doc/simgrid/examples/cxx/basic/FinalizeTask.cxx 10          
index 06ed884..e1497a0 100644 (file)
@@ -1,2 +1,2 @@
-./doc/simgrid/examples/cxx/basic/Main.cxx 10
-./doc/simgrid/examples/cxx/basic/Slave.cxx 10   
\ No newline at end of file
+/doc/simgrid/examples/cxx/basic/Main.cxx 10
+/doc/simgrid/examples/cxx/basic/Slave.cxx 10   
\ No newline at end of file
diff --git a/teshsuite/msg/task_destroy_cancel.c b/teshsuite/msg/task_destroy_cancel.c
new file mode 100644 (file)
index 0000000..6dda8b5
--- /dev/null
@@ -0,0 +1,172 @@
+/* Copyright (c) 2010-2014. The SimGrid Team.
+ * All rights reserved.                                                     */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include <stdio.h>
+#include "msg/msg.h"            /* Yeah! If you want to use msg, you need to include msg/msg.h */
+#include "xbt/sysdep.h"         /* calloc, printf */
+
+/* Create a log channel to have nice outputs. */
+#include "xbt/log.h"
+#include "xbt/asserts.h"
+XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test,
+                             "Messages specific for this msg example");
+
+int master(int argc, char *argv[]);
+int slave(int argc, char *argv[]);
+
+/** Emitter function  */
+int master(int argc, char *argv[])
+{
+  double task_comp_size = 5E7;
+  double task_comm_size = 1E6;
+  double timeout = 1;
+
+  char mailbox[256];
+  msg_task_t task = NULL;
+  msg_comm_t comm = NULL;
+  xbt_ex_t ex;
+
+  sprintf(mailbox, "jupi");
+
+  task = MSG_task_create("normal", task_comp_size, task_comm_size, NULL);
+  XBT_INFO("Sending task: \"%s\"", task->name);
+  MSG_task_send_with_timeout(task, mailbox, timeout);
+
+  task = MSG_task_create("cancel directly", task_comp_size, task_comm_size, NULL);
+  XBT_INFO("Canceling task \"%s\" directly", task->name);
+  MSG_task_cancel(task);
+  MSG_task_destroy(task);
+
+  task = MSG_task_create("destroy directly", task_comp_size, task_comm_size, NULL);
+  XBT_INFO("Destroying task \"%s\" directly", task->name);
+  MSG_task_destroy(task);
+
+  task = MSG_task_create("cancel", task_comp_size, task_comm_size, NULL);
+  comm = MSG_task_isend(task, mailbox);
+  XBT_INFO("Canceling task \"%s\" during comm", task->name);
+  MSG_task_cancel(task);
+  TRY {
+    MSG_comm_wait(comm, -1);
+  }
+  CATCH (ex) {
+    xbt_ex_free(ex);
+    MSG_comm_destroy(comm);
+  }
+  MSG_task_destroy(task);
+
+  task = MSG_task_create("finalize", task_comp_size, task_comm_size, NULL);
+  comm = MSG_task_isend(task, mailbox);
+  XBT_INFO("Destroying task \"%s\" during comm", task->name);
+  MSG_task_destroy(task);
+  TRY {
+    MSG_comm_wait(comm, -1);
+  }
+  CATCH (ex) {
+    xbt_ex_free(ex);
+    MSG_comm_destroy(comm);
+  }
+
+  task = MSG_task_create("cancel", task_comp_size, task_comm_size, NULL);
+  MSG_task_send_with_timeout(task, mailbox, timeout);
+
+  task = MSG_task_create("finalize", task_comp_size, task_comm_size, NULL);
+  MSG_task_send_with_timeout(task, mailbox, timeout);
+
+  XBT_INFO("Goodbye now!");
+  return 0;
+}                               /* end_of_master */
+
+static int worker_main(int argc, char *argv[])
+{
+  msg_task_t task = MSG_process_get_data(MSG_process_self());
+  msg_error_t res;
+  XBT_INFO("Start %s", task->name);
+  res = MSG_task_execute(task);
+  XBT_INFO("Task %s", res == MSG_OK ? "done" : "failed");
+  MSG_task_destroy(task);
+  return 0;
+}
+
+/** Receiver function  */
+int slave(int argc, char *argv[])
+{
+  msg_task_t task;
+  _XBT_GNUC_UNUSED int res;
+  int id = -1;
+  char mailbox[80];
+  double start, end;
+  sprintf(mailbox, "jupi");
+
+  while (1) {
+    task = NULL;
+    res = MSG_task_receive(&(task), mailbox);
+    xbt_assert(res == MSG_OK, "MSG_task_get failed");
+    XBT_INFO("Handling task \"%s\"", MSG_task_get_name(task));
+
+    if (!strcmp(MSG_task_get_name(task), "finalize")) {
+      XBT_INFO("Destroying task \"%s\"", task->name);
+      MSG_task_destroy(task);
+      break;
+    }
+
+    if (!strcmp(MSG_task_get_name(task), "cancel")) {
+      MSG_process_create("worker1", worker_main, task, MSG_host_self());
+      XBT_INFO("Canceling task \"%s\"", task->name);
+      MSG_task_cancel(task);
+      continue;
+    }
+
+    start = MSG_get_clock();
+    MSG_task_execute(task);
+    end = MSG_get_clock();
+    XBT_INFO("Task \"%s\" done in %f (amount %f)"
+               , MSG_task_get_name(task)
+               , end - start
+               , MSG_task_get_remaining_computation(task));
+
+    MSG_task_destroy(task);
+    task = NULL;
+    id--;
+  }
+  XBT_INFO("I'm done. See you!");
+  return 0;
+}                               /* end_of_slave */
+
+/** Main function */
+int main(int argc, char *argv[])
+{
+  msg_error_t res;
+  const char *platform_file;
+  const char *application_file;
+
+  MSG_init(&argc, argv);
+  if (argc != 3) {
+    printf("Usage: %s platform_file deployment_file\n", argv[0]);
+    printf("example: %s msg_platform.xml msg_deployment.xml\n", argv[0]);
+    exit(1);
+  }
+  platform_file = argv[1];
+  application_file = argv[2];
+
+  /* MSG_config("workstation/model","KCCFLN05"); */
+  {                             /*  Simulation setting */
+    MSG_create_environment(platform_file);
+  }
+  {                             /*   Application deployment */
+    MSG_function_register("master", master);
+    MSG_function_register("slave", slave);
+
+    MSG_launch_application(application_file);
+  }
+  res = MSG_main();
+
+  XBT_INFO("Simulation time %g", MSG_get_clock());
+
+  if (res == MSG_OK)
+    return 0;
+  else
+    return 1;
+}                               /* end_of_main */
diff --git a/teshsuite/msg/task_destroy_cancel.tesh b/teshsuite/msg/task_destroy_cancel.tesh
new file mode 100644 (file)
index 0000000..d125183
--- /dev/null
@@ -0,0 +1,18 @@
+
+$ msg/task_destroy_cancel ${srcdir:=.}/msg/task_destroy_cancel_p.xml ${srcdir:=.}/msg/task_destroy_cancel_d.xml
+> [Tremblay:master:(1) 0.000000] [msg_test/INFO] Sending task: "normal"
+> [Jupiter:slave:(2) 0.027003] [msg_test/INFO] Handling task "normal"
+> [Tremblay:master:(1) 0.027003] [msg_test/INFO] Canceling task "cancel directly" directly
+> [Tremblay:master:(1) 0.027003] [msg_test/INFO] Destroying task "destroy directly" directly
+> [Tremblay:master:(1) 0.027003] [msg_test/INFO] Canceling task "cancel" during comm
+> [Tremblay:master:(1) 0.027003] [msg_test/INFO] Destroying task "finalize" during comm
+> [Jupiter:slave:(2) 0.682345] [msg_test/INFO] Task "normal" done in 0.655342 (amount 0.000000)
+> [Jupiter:slave:(2) 0.709348] [msg_test/INFO] Handling task "cancel"
+> [Jupiter:worker1:(3) 0.709348] [msg_test/INFO] Start cancel
+> [Jupiter:slave:(2) 0.709348] [msg_test/INFO] Canceling task "cancel"
+> [Jupiter:worker1:(3) 0.710127] [msg_test/INFO] Task failed
+> [Tremblay:master:(1) 0.736350] [msg_test/INFO] Goodbye now!
+> [Jupiter:slave:(2) 0.736350] [msg_test/INFO] Handling task "finalize"
+> [Jupiter:slave:(2) 0.736350] [msg_test/INFO] Destroying task "finalize"
+> [Jupiter:slave:(2) 0.736350] [msg_test/INFO] I'm done. See you!
+> [0.736350] [msg_test/INFO] Simulation time 0.73635
diff --git a/teshsuite/msg/task_destroy_cancel_d.xml b/teshsuite/msg/task_destroy_cancel_d.xml
new file mode 100644 (file)
index 0000000..5c8fc7f
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version='1.0'?>
+<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
+<platform version="3">
+  <!-- The master process (with some arguments) -->
+  <process host="Tremblay" function="master">
+  </process>
+
+  <!-- The slave processes (with mailbox to listen on as argument) -->
+  <process host="Jupiter" function="slave">
+  </process>
+</platform>
diff --git a/teshsuite/msg/task_destroy_cancel_p.xml b/teshsuite/msg/task_destroy_cancel_p.xml
new file mode 100644 (file)
index 0000000..1947841
--- /dev/null
@@ -0,0 +1,13 @@
+<?xml version='1.0'?>
+<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
+<platform version="3">
+  <!-- The hosts -->
+  <AS  id="AS0"  routing="Full">
+   <host id="Tremblay" power="98.095Mf"/>
+   <host id="Jupiter" power="76.296Mf"/>
+   <link id="1" bandwidth="41.279125MBps" latency="59.904us"/>
+   <route src="Tremblay" dst="Jupiter">
+    <link_ctn id="1"/>
+   </route>
+  </AS>
+</platform>
index 2db733e..5fe5c14 100644 (file)
@@ -36,7 +36,9 @@ set(tesh_files
   ${CMAKE_CURRENT_SOURCE_DIR}/basic_link_test.tesh
   ${CMAKE_CURRENT_SOURCE_DIR}/flatifier.tesh
   ${CMAKE_CURRENT_SOURCE_DIR}/get_full_link.tesh
-  ${CMAKE_CURRENT_SOURCE_DIR}/two_hosts_asymetric.tesh
+  ${CMAKE_CURRENT_SOURCE_DIR}/bogus_two_hosts_asymetric.tesh
+  ${CMAKE_CURRENT_SOURCE_DIR}/bogus_missing_gateway.tesh
+  ${CMAKE_CURRENT_SOURCE_DIR}/bogus_disk_attachment.tesh
   PARENT_SCOPE
   )
 set(xml_files
@@ -77,14 +79,17 @@ set(xml_files
   ${CMAKE_CURRENT_SOURCE_DIR}/two_clusters_router_id.xml
   ${CMAKE_CURRENT_SOURCE_DIR}/two_clusters_symmetric.xml
   ${CMAKE_CURRENT_SOURCE_DIR}/two_clusters.xml
-  ${CMAKE_CURRENT_SOURCE_DIR}/two_hosts_asymetric_BOGUS2.xml
-  ${CMAKE_CURRENT_SOURCE_DIR}/two_hosts_asymetric_BOGUS.xml
+  ${CMAKE_CURRENT_SOURCE_DIR}/bogus_missing_src_gateway.xml
+  ${CMAKE_CURRENT_SOURCE_DIR}/bogus_missing_dst_gateway.xml
+  ${CMAKE_CURRENT_SOURCE_DIR}/bogus_two_hosts_asymetric.xml
+  ${CMAKE_CURRENT_SOURCE_DIR}/bogus_two_hosts_asymetric-2.xml
   ${CMAKE_CURRENT_SOURCE_DIR}/two_hosts_one_link_fullduplex.xml
   ${CMAKE_CURRENT_SOURCE_DIR}/two_hosts_one_link_symmetrical.xml
   ${CMAKE_CURRENT_SOURCE_DIR}/two_hosts_one_link.xml
   ${CMAKE_CURRENT_SOURCE_DIR}/clusterA.xml
   ${CMAKE_CURRENT_SOURCE_DIR}/clusterB.xml
   ${CMAKE_CURRENT_SOURCE_DIR}/Dijkstra.xml
+  ${CMAKE_CURRENT_SOURCE_DIR}/bogus_disk_attachment.xml
   PARENT_SCOPE
   )
 set(teshsuite_src
index 245cd48..f34e57f 100644 (file)
@@ -9,8 +9,6 @@
 #include "simdag/simdag.h"
 #include "surf/surf_private.h"
 
-extern routing_platf_t routing_platf;
-
 int main(int argc, char **argv)
 {
   /* initialisation of SD */
diff --git a/teshsuite/simdag/platforms/bogus_disk_attachment.tesh b/teshsuite/simdag/platforms/bogus_disk_attachment.tesh
new file mode 100644 (file)
index 0000000..534cd7f
--- /dev/null
@@ -0,0 +1,4 @@
+! expect signal SIGABRT
+$ ${bindir:=.}/flatifier bogus_disk_attachment.xml "--log=root.fmt:[%10.6r]%e[%i:%P@%h]%e%m%n"
+> [  0.000000] [0:@] surf_workstation_model_init_ptask_L07
+> [  0.000000] [0:@] Parse error at bogus_disk_attachment.xml:26: Enable to attach storage cdisk: host plouf doesn't exist.
diff --git a/teshsuite/simdag/platforms/bogus_disk_attachment.xml b/teshsuite/simdag/platforms/bogus_disk_attachment.xml
new file mode 100644 (file)
index 0000000..c5ca5dc
--- /dev/null
@@ -0,0 +1,26 @@
+
+<!-- THIS FILE IS INVALID.
+
+It declares a storage attached to a nonexistant host (plouf)
+See bogus_disk_attachment.tesh -->
+
+<?xml version='1.0'?>
+<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
+
+<platform version="3">
+       <AS id="AS0" routing="Full">
+               <!-- STORAGE TYPES -->
+               <storage_type id="single_HDD" model="SSD" size="4000">
+                       <model_prop id="Bwrite" value="30000000" /> <!-- 30Mo/s -->
+                       <model_prop id="Bread" value="100000000" /> <!-- 100Mo/s -->
+                       <model_prop id="Bconnection" value="150000000" /> <!-- 150Mo/s -->
+               </storage_type>
+               
+               <storage id="cdisk" typeId="single_HDD"  attach="plouf" />
+
+               <!-- HOSTS -->
+               <host id="client" power="1000000000">
+                       <mount storageId="cdisk" name="/sd1" />
+               </host>
+       </AS>
+</platform>
\ No newline at end of file
diff --git a/teshsuite/simdag/platforms/bogus_missing_dst_gateway.xml b/teshsuite/simdag/platforms/bogus_missing_dst_gateway.xml
new file mode 100644 (file)
index 0000000..5ffbd2f
--- /dev/null
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
+<platform version="3">
+  <AS id="World" routing="Full">
+     <AS id="us" routing="Full">
+                <cluster id="cluster" suffix=".cluster.us" prefix="node-" radical="1-4" core="24" power="9.27114e8" bw="938e6" lat="270us"/>
+    </AS>
+    <AS id="fr" routing="Full">
+                <cluster id="grappe" suffix=".grappe.fr" prefix="noeud-" radical="1-4" core="24" power="9.27114e8" bw="938e6" lat="270us"/>
+    </AS>
+
+    <link id="backbone" bandwidth="1.25GBps" latency="500us"/>
+
+    <ASroute src="us" gw_src="node-cluster_router.cluster.us" dst="fr" gw_dst="neud-grappe_router.grappe.fr" symmetrical="YES">
+        <link_ctn id="backbone"/>
+    </ASroute>
+  </AS>
+</platform>
diff --git a/teshsuite/simdag/platforms/bogus_missing_gateway.tesh b/teshsuite/simdag/platforms/bogus_missing_gateway.tesh
new file mode 100644 (file)
index 0000000..f571ffa
--- /dev/null
@@ -0,0 +1,9 @@
+! expect signal SIGABRT
+$ ${bindir:=.}/flatifier bogus_missing_src_gateway.xml "--log=root.fmt:[%10.6r]%e[%i:%P@%h]%e%m%n"
+> [  0.000000] [0:@] surf_workstation_model_init_ptask_L07
+> [  0.000000] [0:@] Parse error at bogus_missing_src_gateway.xml:16: gw_src="nod-cluster_router.cluster.us" not found for ASroute from "us" to "fr"
+
+! expect signal SIGABRT
+$ ${bindir:=.}/flatifier bogus_missing_dst_gateway.xml "--log=root.fmt:[%10.6r]%e[%i:%P@%h]%e%m%n"
+> [  0.000000] [0:@] surf_workstation_model_init_ptask_L07
+> [  0.000000] [0:@] Parse error at bogus_missing_dst_gateway.xml:16: gw_dst="neud-grappe_router.grappe.fr" not found for ASroute from "us" to "fr"
diff --git a/teshsuite/simdag/platforms/bogus_missing_src_gateway.xml b/teshsuite/simdag/platforms/bogus_missing_src_gateway.xml
new file mode 100644 (file)
index 0000000..a97b589
--- /dev/null
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
+<platform version="3">
+  <AS id="World" routing="Full">
+     <AS id="us" routing="Full">
+                <cluster id="cluster" suffix=".cluster.us" prefix="node-" radical="1-4" core="24" power="9.27114e8" bw="938e6" lat="270us"/>
+    </AS>
+    <AS id="fr" routing="Full">
+                <cluster id="grappe" suffix=".grappe.fr" prefix="noeud-" radical="1-4" core="24" power="9.27114e8" bw="938e6" lat="270us"/>
+    </AS>
+
+    <link id="backbone" bandwidth="1.25GBps" latency="500us"/>
+
+    <ASroute src="us" gw_src="nod-cluster_router.cluster.us" dst="fr" gw_dst="noeud-grappe_router.grappe.fr" symmetrical="YES">
+        <link_ctn id="backbone"/>
+    </ASroute>
+  </AS>
+</platform>
diff --git a/teshsuite/simdag/platforms/bogus_two_hosts_asymetric.tesh b/teshsuite/simdag/platforms/bogus_two_hosts_asymetric.tesh
new file mode 100644 (file)
index 0000000..a18c417
--- /dev/null
@@ -0,0 +1,9 @@
+! expect signal SIGABRT
+$ ${bindir:=.}/flatifier bogus_two_hosts_asymetric.xml "--log=root.fmt:[%10.6r]%e[%i:%P@%h]%e%m%n"
+> [  0.000000] [0:@] surf_workstation_model_init_ptask_L07
+> [  0.000000] [0:@] Parse error at bogus_two_hosts_asymetric.xml:24: A route between "alice" and "bob" already exists with a different content. If you are trying to define a reverse route, you must set the symmetrical=no attribute to your routes tags.
+
+! expect signal SIGABRT
+$ ${bindir:=.}/flatifier bogus_two_hosts_asymetric-2.xml "--log=root.fmt:[%10.6r]%e[%i:%P@%h]%e%m%n"
+> [  0.000000] [0:@] surf_workstation_model_init_ptask_L07
+> [  0.000000] [0:@] Parse error at bogus_two_hosts_asymetric-2.xml:26: A route between "alice" and "bob" already exists with a different content. If you are trying to define a reverse route, you must set the symmetrical=no attribute to your routes tags.
diff --git a/teshsuite/simdag/platforms/two_hosts_asymetric.tesh b/teshsuite/simdag/platforms/two_hosts_asymetric.tesh
deleted file mode 100644 (file)
index 84cc390..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-! expect signal SIGABRT
-$ ${bindir:=.}/flatifier two_hosts_asymetric_BOGUS.xml "--log=root.fmt:[%10.6r]%e[%i:%P@%h]%e%m%n"
-> [  0.000000] [0:@] surf_workstation_model_init_ptask_L07
-> [  0.000000] [0:@] Parse error at two_hosts_asymetric_BOGUS.xml:24: A route between "alice" and "bob" already exists with a different content. If you are trying to define a reverse route, you must set the symmetrical=no attribute to your routes tags.
-
-! expect signal SIGABRT
-$ ${bindir:=.}/flatifier two_hosts_asymetric_BOGUS2.xml "--log=root.fmt:[%10.6r]%e[%i:%P@%h]%e%m%n"
-> [  0.000000] [0:@] surf_workstation_model_init_ptask_L07
-> [  0.000000] [0:@] Parse error at two_hosts_asymetric_BOGUS2.xml:26: A route between "alice" and "bob" already exists with a different content. If you are trying to define a reverse route, you must set the symmetrical=no attribute to your routes tags.
index 4c78962..8a22a1a 100644 (file)
@@ -5,20 +5,26 @@ set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")
 add_executable(check_defaults check_defaults.c)
 target_link_libraries(check_defaults simgrid)
 
+add_executable(stack_overflow stack_overflow.c)
+target_link_libraries(stack_overflow simgrid)
+
 set(tesh_files
   ${tesh_files}
   ${CMAKE_CURRENT_SOURCE_DIR}/factory_raw.tesh
   ${CMAKE_CURRENT_SOURCE_DIR}/factory_thread.tesh
   ${CMAKE_CURRENT_SOURCE_DIR}/factory_ucontext.tesh
+  ${CMAKE_CURRENT_SOURCE_DIR}/stack_overflow.tesh
   PARENT_SCOPE
   )
 set(xml_files
   ${xml_files}
+  ${CMAKE_CURRENT_SOURCE_DIR}/stack_overflow.xml
   PARENT_SCOPE
   )
 set(teshsuite_src
   ${teshsuite_src}
   ${CMAKE_CURRENT_SOURCE_DIR}/check_defaults.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/stack_overflow.c
   PARENT_SCOPE
   )
 set(bin_files
diff --git a/teshsuite/simix/stack_overflow.c b/teshsuite/simix/stack_overflow.c
new file mode 100644 (file)
index 0000000..0ae6ffa
--- /dev/null
@@ -0,0 +1,58 @@
+/* stack_overflow -- simple program generating a stack overflow          */
+
+/* Copyright (c) 2014. The SimGrid Team.
+ * All rights reserved.                                                     */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "simgrid/platf.h"
+#include "simgrid/simix.h"
+#include "surf/surfxml_parse.h"
+#include "xbt/log.h"
+
+XBT_LOG_NEW_DEFAULT_CATEGORY(test, "my log messages");
+
+static unsigned collatz(unsigned c0, unsigned n)
+{
+  unsigned x;
+  if (n == 0) {
+    x = c0;
+  } else {
+    x = collatz(c0, n - 1);
+    if (x % 2 == 0)
+      x = x / 2;
+    else
+      x = 3 * x + 1;
+  }
+  return x;
+}
+
+static int master(int argc, char *argv[])
+{
+  XBT_INFO("Launching our nice bugged recursive function...");
+  unsigned i = 1;
+  do {
+    i *= 2;
+    unsigned res = collatz(i, i);
+    XBT_VERB("collatz(%u, %u) returned %u", i, i, res);
+  } while (i <= 0x80000000u);
+  return 0;
+}
+
+int main(int argc, char *argv[])
+{
+  SIMIX_global_init(&argc, argv);
+
+  if (argc != 2) {
+    printf("Usage: %s platform_and_deployment.xml\n", argv[0]);
+    exit(EXIT_FAILURE);
+  }
+
+  SIMIX_function_register("master", master);
+  SIMIX_create_environment(argv[1]);
+  SIMIX_launch_application(argv[1]);
+  SIMIX_run();
+
+  return 0;
+}
diff --git a/teshsuite/simix/stack_overflow.tesh b/teshsuite/simix/stack_overflow.tesh
new file mode 100644 (file)
index 0000000..2606c83
--- /dev/null
@@ -0,0 +1,5 @@
+! expect signal SIGSEGV
+$ ./simix/stack_overflow --cfg=contexts/stack_size:96 ${srcdir:=.}/simix/stack_overflow.xml
+> [Tremblay:master:(0) 0.000000] [test/INFO] Launching our nice bugged recursive function...
+> Access violation detected. This can result from a stack overflow.
+> Try to increase stack size with --cfg=contexts/stack_size (current size is 96 KiB).
diff --git a/teshsuite/simix/stack_overflow.xml b/teshsuite/simix/stack_overflow.xml
new file mode 100644 (file)
index 0000000..8ac632a
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version='1.0'?>
+<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
+<platform version="3">
+
+  <!-- The hosts -->
+  <AS  id="AS0"  routing="Full">
+   <host id="Tremblay" power="98.095Mf"/>
+  </AS>
+
+  <!-- The master process (with some arguments) -->
+  <process host="Tremblay" function="master">
+  </process>
+
+</platform>
index ec96371..e13e40c 100644 (file)
@@ -4,7 +4,7 @@
 
 ! timeout 20
 p Test allreduce
-$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ./allreduce_coll 300000 --log=smpi_kernel.thres:warning
+$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ./allreduce_coll 30000 --log=smpi_kernel.thres:warning
 > You requested to use 16 processes, but there is only 5 processes in your hostfile...
 > [rank 0] -> Tremblay
 > [rank 1] -> Jupiter
index 5367f99..123a623 100644 (file)
@@ -23,7 +23,7 @@
       call mpi_comm_rank( MPI_COMM_WORLD, rank, ierr )
       if (size .lt. 2) then
          print *, "Must have at least 2 processes"
-         call MPI_Abort( 1, MPI_COMM_WORLD, ierr )
+         call MPI_Abort( MPI_COMM_WORLD, 1, ierr )
          stop
       endif
 
index 71e9735..8227ef0 100644 (file)
@@ -44,7 +44,7 @@
       call mpi_comm_size(MPI_COMM_WORLD, size, ierr )
       if (size .lt. 2) then
          print *, "Must have at least 2 processes"
-         call MPI_Abort( 1, MPI_COMM_WORLD, ierr )
+         call MPI_Abort( MPI_COMM_WORLD, 1, ierr )
          stop
       endif
 
diff --git a/teshsuite/smpi/mpich3-test/topo/CMakeLists.txt b/teshsuite/smpi/mpich3-test/topo/CMakeLists.txt
new file mode 100644 (file)
index 0000000..6bc6b43
--- /dev/null
@@ -0,0 +1,87 @@
+cmake_minimum_required(VERSION 2.6)
+
+if(enable_smpi AND enable_smpi_MPICH3_testsuite)
+  if(WIN32)
+    set(CMAKE_C_FLAGS "-include ${CMAKE_HOME_DIRECTORY}/include/smpi/smpi_main.h")
+  else()
+    set(CMAKE_C_COMPILER "${CMAKE_BINARY_DIR}/smpi_script/bin/smpicc")
+    set(CMAKE_Fortran_COMPILER "${CMAKE_BINARY_DIR}/smpi_script/bin/smpiff")
+  endif()
+
+  set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}")
+  include_directories("${CMAKE_HOME_DIRECTORY}/include/smpi")
+  include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../include/")
+
+
+#  add_executable(cartcreates cartcreates.c)
+#  add_executable(cartmap1 cartmap1.c)
+#  add_executable(cartshift1 cartshift1.c)
+#  add_executable(cartsuball cartsuball.c)
+#  add_executable(cartzero cartzero.c)
+#  add_executable(dgraph_unwgt dgraph_unwgt.c)
+#  add_executable(dims1 dims1.c)
+#  add_executable(dims2 dims2.c)
+#  add_executable(distgraph1 distgraph1.c)
+#  add_executable(graphcr2 graphcr2.c)
+#  add_executable(graphcr graphcr.c)
+#  add_executable(graphmap1 graphmap1.c)
+#  add_executable(neighb_coll neighb_coll.c)
+#  add_executable(topodup topodup.c)
+#  add_executable(topotest topotest.c)
+
+
+#  target_link_libraries(cartcreates simgrid mtest_c)
+#  target_link_libraries(cartmap1 simgrid mtest_c)
+#  target_link_libraries(cartshift1 simgrid mtest_c)
+#  target_link_libraries(cartsuball simgrid mtest_c)
+#  target_link_libraries(cartzero simgrid mtest_c)
+#  target_link_libraries(dgraph_unwgt simgrid mtest_c)
+#  target_link_libraries(dims1 simgrid mtest_c)
+#  target_link_libraries(dims2 simgrid mtest_c)
+#  target_link_libraries(distgraph1 simgrid mtest_c)
+#  target_link_libraries(graphcr2 simgrid mtest_c)
+#  target_link_libraries(graphcr simgrid mtest_c)
+#  target_link_libraries(graphmap1 simgrid mtest_c)
+#  target_link_libraries(neighb_coll simgrid mtest_c)
+#  target_link_libraries(topodup simgrid mtest_c)
+#  target_link_libraries(topotest simgrid mtest_c)
+
+endif()
+
+set(tesh_files
+  ${tesh_files}
+  PARENT_SCOPE
+  )
+set(xml_files
+  ${xml_files}
+  PARENT_SCOPE
+  )
+set(examples_src
+ ${examples_src}
+ ${CMAKE_CURRENT_SOURCE_DIR}/cartcreates.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/cartmap1.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/cartshift1.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/cartsuball.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/cartzero.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/dgraph_unwgt.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/dims1.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/dims2.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/distgraph1.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/graphcr2.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/graphcr.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/graphmap1.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/neighb_coll.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/testlist
+ ${CMAKE_CURRENT_SOURCE_DIR}/topodup.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/topotest.c
+  PARENT_SCOPE
+  )
+set(bin_files
+  ${bin_files}
+  PARENT_SCOPE
+  )
+set(txt_files
+  ${txt_files}
+  ${CMAKE_CURRENT_SOURCE_DIR}/testlist
+  PARENT_SCOPE
+  )
diff --git a/teshsuite/smpi/mpich3-test/topo/cartcreates.c b/teshsuite/smpi/mpich3-test/topo/cartcreates.c
new file mode 100644 (file)
index 0000000..92365d7
--- /dev/null
@@ -0,0 +1,54 @@
+/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
+/*
+ *
+ *  (C) 2003 by Argonne National Laboratory.
+ *      See COPYRIGHT in top-level directory.
+ */
+#include "mpi.h"
+#include <stdio.h>
+#include "mpitest.h"
+
+int main( int argc, char *argv[] )
+{
+    int errs = 0;
+    int size, rank;
+    int dims[2], periods[2];
+    MPI_Comm comm;
+
+    MTest_Init( &argc, &argv );
+
+    /* Create a new cartesian communicator in a subset of the processes */
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    if (size < 2) {
+       fprintf( stderr, "This test needs at least 2 processes\n" );
+       MPI_Abort( MPI_COMM_WORLD, 1 );
+    }
+    dims[0]    = size-1;
+    periods[0] = 1;
+    MPI_Cart_create( MPI_COMM_WORLD, 1, dims, periods, 0, &comm );
+
+    if (comm != MPI_COMM_NULL) {
+       int csize;
+       MPI_Comm_size( comm, &csize );
+       if (csize != dims[0]) {
+           errs++;
+           fprintf( stderr, 
+            "Sizes is wrong in cart communicator.  Is %d, should be %d\n", 
+            csize, dims[0] ); 
+       }
+       MPI_Barrier( comm );
+
+       MPI_Comm_free( &comm );
+    } 
+    else if (rank < dims[0]) {
+       errs++;
+       fprintf( stderr, "Communicator returned is null!" );
+    }
+
+    MTest_Finalize( errs );
+
+    MPI_Finalize();
+
+    return 0;
+}
diff --git a/teshsuite/smpi/mpich3-test/topo/cartmap1.c b/teshsuite/smpi/mpich3-test/topo/cartmap1.c
new file mode 100644 (file)
index 0000000..1ce5ad8
--- /dev/null
@@ -0,0 +1,64 @@
+/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
+/*
+ *
+ *  (C) 2003 by Argonne National Laboratory.
+ *      See COPYRIGHT in top-level directory.
+ */
+#include "mpi.h"
+#include <stdio.h>
+#include "mpitest.h"
+
+int main( int argc, char *argv[] )
+{
+    int errs = 0;
+    int dims[2];
+    int periods[2];
+    int size, rank, newrank;
+
+    MTest_Init( &argc, &argv );
+
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    
+    /* This defines a one dimensional cartision grid with a single point */
+    periods[0] = 1;
+    dims[0] = 1;
+
+    MPI_Cart_map( MPI_COMM_WORLD, 1, dims, periods, &newrank );
+    if (rank > 0) {
+       if (newrank != MPI_UNDEFINED) {
+           errs++;
+           printf( "rank outside of input communicator not UNDEFINED\n" );
+       }
+    }
+    else {
+       if (rank != newrank) {
+           errs++;
+           printf( "Newrank not defined and should be 0\n" );
+       }
+    }
+
+
+    /* As of MPI 2.1, a 0-dimensional topology is valid (its also a
+       point) */
+    MPI_Cart_map( MPI_COMM_WORLD, 0, dims, periods, &newrank );
+    if (rank > 0) {
+       if (newrank != MPI_UNDEFINED) {
+           errs++;
+           printf( "rank outside of input communicator not UNDEFINED\n" );
+       }
+    }
+    else {
+       /* rank == 0 */
+       if (rank != newrank) {
+           errs++;
+           printf( "Newrank not defined and should be 0\n" );
+       }
+    }
+
+
+    MTest_Finalize( errs );
+    MPI_Finalize();
+    return 0;
+  
+}
diff --git a/teshsuite/smpi/mpich3-test/topo/cartshift1.c b/teshsuite/smpi/mpich3-test/topo/cartshift1.c
new file mode 100644 (file)
index 0000000..679f12c
--- /dev/null
@@ -0,0 +1,96 @@
+/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
+/*
+ *
+ *  (C) 2003 by Argonne National Laboratory.
+ *      See COPYRIGHT in top-level directory.
+ */
+#include "mpi.h"
+#include <stdio.h>
+#include "mpitest.h"
+
+int main( int argc, char *argv[] )
+{
+    int errs = 0;
+    int size, rank;
+    int source, dest;
+    int dims[2], periods[2];
+    MPI_Comm comm;
+
+    MTest_Init( &argc, &argv );
+    
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    dims[0]    = size;
+    periods[0] = 1;
+    MPI_Cart_create( MPI_COMM_WORLD, 1, dims, periods, 0, &comm );
+    MPI_Cart_shift( comm, 0, 1, &source, &dest );
+    if (source != ((rank - 1 + size) % size)) {
+       errs++;
+       printf( "source for shift 1 is %d\n", source );
+    }
+    if (dest != ((rank + 1) % size)) {
+       errs++;
+       printf( "dest for shift 1 is %d\n", dest );
+    }
+    MPI_Cart_shift( comm, 0, 0, &source, &dest );
+    if (source != rank) {
+       errs++;
+       printf( "Source for shift 0 is %d\n", source );
+    }
+    if (dest != rank) {
+       errs++;
+       printf( "Dest for shift 0 is %d\n", dest );
+    }
+    MPI_Cart_shift( comm, 0, -1, &source, &dest );
+    if (source != ((rank + 1) % size)) {
+       errs++;
+       printf( "source for shift -1 is %d\n", source );
+    }
+    if (dest != ((rank - 1 + size) % size)) {
+       errs++;
+       printf( "dest for shift -1 is %d\n", dest );
+    }
+
+    /* Now, with non-periodic */
+    MPI_Comm_free( &comm );
+    periods[0] = 0;
+    MPI_Cart_create( MPI_COMM_WORLD, 1, dims, periods, 0, &comm );
+    MPI_Cart_shift( comm, 0, 1, &source, &dest );
+    if ((rank > 0 && source != (rank - 1)) || 
+       (rank == 0 && source != MPI_PROC_NULL)) {
+       errs++;
+       printf( "source for non-periodic shift 1 is %d\n", source );
+    }
+    if ((rank < size-1 && dest != rank + 1) || 
+       ((rank == size-1) && dest != MPI_PROC_NULL)) {
+       errs++;
+       printf( "dest for non-periodic shift 1 is %d\n", dest );
+    }
+    MPI_Cart_shift( comm, 0, 0, &source, &dest );
+    if (source != rank) {
+       errs++;
+       printf( "Source for non-periodic shift 0 is %d\n", source );
+    }
+    if (dest != rank) {
+       errs++;
+       printf( "Dest for non-periodic shift 0 is %d\n", dest );
+    }
+    MPI_Cart_shift( comm, 0, -1, &source, &dest );
+    if ((rank < size - 1 && source != rank + 1) ||
+       (rank == size - 1 && source != MPI_PROC_NULL)) {
+       
+       errs++;
+       printf( "source for non-periodic shift -1 is %d\n", source );
+    }
+    if ((rank > 0 && dest != rank - 1) ||
+       (rank == 0 && dest != MPI_PROC_NULL)) {
+       errs++;
+       printf( "dest for non-periodic shift -1 is %d\n", dest );
+    }
+    MPI_Comm_free( &comm );
+    
+    MTest_Finalize( errs );
+    MPI_Finalize();
+    return 0;
+  
+}
diff --git a/teshsuite/smpi/mpich3-test/topo/cartsuball.c b/teshsuite/smpi/mpich3-test/topo/cartsuball.c
new file mode 100644 (file)
index 0000000..890db5a
--- /dev/null
@@ -0,0 +1,54 @@
+/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
+/*
+ *
+ *  (C) 2003 by Argonne National Laboratory.
+ *      See COPYRIGHT in top-level directory.
+ */
+#include "mpi.h"
+#include <stdio.h>
+#include "mpitest.h"
+
+int main( int argc, char *argv[] )
+{
+    int errs = 0;
+    int size, dims[2], periods[2], remain[2];
+    int result, rank;
+    MPI_Comm comm, newcomm;
+
+    MTest_Init( &argc, &argv );
+
+    /* First, create a 1-dim cartesian communicator */
+    periods[0] = 0;
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+    dims[0] = size;
+    MPI_Cart_create( MPI_COMM_WORLD, 1, dims, periods, 0, &comm );
+    
+    /* Now, extract a communicator with no dimensions */
+    remain[0] = 0;
+    MPI_Cart_sub( comm, remain, &newcomm );
+
+    MPI_Comm_rank(comm, &rank);
+
+    if (rank == 0) {
+       /* This should be congruent to MPI_COMM_SELF */
+       MPI_Comm_compare( MPI_COMM_SELF, newcomm, &result );
+       if (result != MPI_CONGRUENT) {
+           errs++;
+           printf( "cart sub to size 0 did not give self\n" );
+       }
+       MPI_Comm_free( &newcomm );
+    }
+    else if (newcomm != MPI_COMM_NULL) {
+       errs++;
+       printf( "cart sub to size 0 did not give null\n" );
+    }
+
+    /* Free the new communicator so that storage leak tests will
+       be happy */
+    MPI_Comm_free( &comm );
+    
+    MTest_Finalize( errs );
+    MPI_Finalize();
+    return 0;
+  
+}
diff --git a/teshsuite/smpi/mpich3-test/topo/cartzero.c b/teshsuite/smpi/mpich3-test/topo/cartzero.c
new file mode 100644 (file)
index 0000000..c8e601e
--- /dev/null
@@ -0,0 +1,92 @@
+/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
+/*
+ *
+ *  (C) 2008 by Argonne National Laboratory.
+ *      See COPYRIGHT in top-level directory.
+ */
+#include "mpi.h"
+#include <stdio.h>
+#include "mpitest.h"
+
+/*  
+    Check that the MPI implementation properly handles zero-dimensional
+    Cartesian communicators - the original standard implies that these
+    should be consistent with higher dimensional topologies and thus 
+    these should work with any MPI implementation.  MPI 2.1 made this
+    requirement explicit.
+*/
+int main( int argc, char *argv[] )
+{
+    int errs = 0;
+    int size, rank, ndims;
+    MPI_Comm comm, newcomm;
+
+    MTest_Init( &argc, &argv );
+
+    /* Create a new cartesian communicator in a subset of the processes */
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    if (size < 2) {
+       fprintf( stderr, "This test needs at least 2 processes\n" );
+       MPI_Abort( MPI_COMM_WORLD, 1 );
+    }
+
+    MPI_Cart_create( MPI_COMM_WORLD, 0, NULL, NULL, 0, &comm );
+
+    if (comm != MPI_COMM_NULL) {
+       int csize;
+       MPI_Comm_size( comm, &csize );
+       if (csize != 1) {
+           errs++;
+           fprintf( stderr, 
+            "Sizes is wrong in cart communicator.  Is %d, should be 1\n", 
+            csize ); 
+       }
+
+       /* This function is not meaningful, but should not fail */
+       MPI_Dims_create(1, 0, NULL);
+
+       ndims = -1;
+       MPI_Cartdim_get(comm, &ndims);
+       if (ndims != 0) {
+           errs++;
+           fprintf(stderr, "MPI_Cartdim_get: ndims is %d, should be 0\n", ndims);
+       }
+
+       /* this function should not fail */
+       MPI_Cart_get(comm, 0, NULL, NULL, NULL);
+
+       MPI_Cart_rank(comm, NULL, &rank);
+       if (rank != 0) {
+           errs++;
+           fprintf(stderr, "MPI_Cart_rank: rank is %d, should be 0\n", rank);
+       }
+
+       /* this function should not fail */
+       MPI_Cart_coords(comm, 0, 0, NULL);
+
+       MPI_Cart_sub(comm, NULL, &newcomm);
+       ndims = -1;
+       MPI_Cartdim_get(newcomm, &ndims);
+       if (ndims != 0) {
+           errs++;
+           fprintf(stderr, 
+              "MPI_Cart_sub did not return zero-dimensional communicator\n");
+       }
+
+       MPI_Barrier( comm );
+
+       MPI_Comm_free( &comm );
+       MPI_Comm_free( &newcomm );
+    } 
+    else if (rank == 0) {
+       errs++;
+       fprintf( stderr, "Communicator returned is null!" );
+    }
+
+    MTest_Finalize( errs );
+
+    MPI_Finalize();
+
+    return 0;
+}
diff --git a/teshsuite/smpi/mpich3-test/topo/dgraph_unwgt.c b/teshsuite/smpi/mpich3-test/topo/dgraph_unwgt.c
new file mode 100644 (file)
index 0000000..e29b3a4
--- /dev/null
@@ -0,0 +1,171 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "mpi.h"
+#include "mpitest.h"
+
+#define RING_NUM_NEIGHBORS   2
+
+static int validate_dgraph(MPI_Comm dgraph_comm)
+{
+    int         comm_topo;
+    int         src_sz, dest_sz;
+    int         wgt_flag, ierr;
+    int         srcs[RING_NUM_NEIGHBORS], dests[RING_NUM_NEIGHBORS];
+    int        *src_wgts, *dest_wgts;
+
+    int         world_rank, world_size;
+    int         idx, nbr_sep;
+
+    comm_topo = MPI_UNDEFINED;
+    MPI_Topo_test(dgraph_comm, &comm_topo);
+    switch (comm_topo) {
+        case MPI_DIST_GRAPH :
+            break;
+        default:
+            fprintf(stderr, "dgraph_comm is NOT of type MPI_DIST_GRAPH\n");
+            return 0;
+    }
+
+    ierr = MPI_Dist_graph_neighbors_count(dgraph_comm,
+                                          &src_sz, &dest_sz, &wgt_flag);
+    if (ierr != MPI_SUCCESS) {
+        fprintf(stderr, "MPI_Dist_graph_neighbors_count() fails!\n");
+        return 0;
+    }
+/*
+    else
+        fprintf(stderr, "MPI_Dist_graph_neighbors_count() succeeds!\n");
+*/
+
+    if (wgt_flag) {
+        fprintf(stderr, "dgraph_comm is NOT created with MPI_UNWEIGHTED\n");
+        return 0;
+    }
+/*
+    else
+        fprintf(stderr, "dgraph_comm is created with MPI_UNWEIGHTED\n");
+*/
+    if (src_sz != RING_NUM_NEIGHBORS || dest_sz != RING_NUM_NEIGHBORS) {
+        fprintf(stderr, "source or destination edge array is not of size %d.\n",
+                         RING_NUM_NEIGHBORS);
+        fprintf(stderr, "src_sz = %d, dest_sz = %d\n", src_sz, dest_sz);
+        return 0;
+    }
+
+    /*
+       src_wgts and dest_wgts could be anything, e.g. NULL, since
+       MPI_Dist_graph_neighbors_count() returns MPI_UNWEIGHTED.
+       Since this program has a Fortran77 version, and standard Fortran77
+       has no pointer and NULL, so use MPI_UNWEIGHTED for the weighted arrays.
+    */
+    src_wgts  = MPI_UNWEIGHTED;
+    dest_wgts = MPI_UNWEIGHTED;
+    ierr = MPI_Dist_graph_neighbors(dgraph_comm,
+                                    src_sz, srcs, src_wgts,
+                                    dest_sz, dests, dest_wgts);
+    if (ierr != MPI_SUCCESS) {
+        fprintf(stderr, "MPI_Dist_graph_neighbors() fails!\n");
+        return 0;
+    }
+/*
+    else
+        fprintf(stderr, "MPI_Dist_graph_neighbors() succeeds!\n");
+*/
+
+    /*
+       Check if the neighbors returned from MPI are really
+       the nearest neighbors within a ring.
+    */
+    MPI_Comm_size(MPI_COMM_WORLD, &world_size);
+    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
+    for (idx=0; idx < src_sz; idx++) {
+        nbr_sep = abs(srcs[idx] - world_rank);
+        if ( nbr_sep != 1 && nbr_sep != (world_size-1) ) {
+            fprintf(stderr, "srcs[%d]=%d is NOT a neighbor of my rank %d.\n",
+                            idx, srcs[idx], world_rank);
+            return 0;
+        }  
+    }
+    for (idx=0; idx < dest_sz; idx++) {
+        nbr_sep = abs(dests[idx] - world_rank);
+        if ( nbr_sep != 1 && nbr_sep != (world_size-1) ) {
+            fprintf(stderr, "dests[%d]=%d is NOT a neighbor of my rank %d.\n",
+                            idx, dests[idx], world_rank);
+            return 0;
+        }  
+    }
+
+    /*
+    fprintf(stderr, "dgraph_comm is of type MPI_DIST_GRAPH "
+                    "of a bidirectional ring.\n");
+    */
+    return 1;
+}
+
+/*
+   Specify a distributed graph of a bidirectional ring of the MPI_COMM_WORLD,
+   i.e. everyone only talks to left and right neighbors. 
+*/
+int main(int argc, char *argv[])
+{
+    MPI_Comm    dgraph_comm;
+    int         world_size, world_rank, ierr;
+    int         errs = 0;
+
+    int         src_sz, dest_sz;
+    int         degs[1];
+    int         srcs[RING_NUM_NEIGHBORS], dests[RING_NUM_NEIGHBORS];
+    
+    MTest_Init(&argc, &argv);
+    MPI_Comm_size(MPI_COMM_WORLD, &world_size);
+    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
+
+    degs[0]  = 2;
+    srcs[0]  = world_rank;
+    dests[0] = world_rank-1 <  0          ? world_size-1 : world_rank-1 ;
+    dests[1] = world_rank+1 >= world_size ?            0 : world_rank+1 ;
+    ierr = MPI_Dist_graph_create(MPI_COMM_WORLD, 1, srcs, degs, dests,
+                                 MPI_UNWEIGHTED, MPI_INFO_NULL, 1,
+                                 &dgraph_comm);
+    if ( ierr != MPI_SUCCESS )  {
+        fprintf(stderr, "MPI_Dist_graph_create() fails!\n");
+        MPI_Abort(MPI_COMM_WORLD, 1);
+        return 1;
+    }
+    if (!validate_dgraph(dgraph_comm)) {
+        fprintf(stderr, "MPI_Dist_graph_create() does NOT create "
+                        "a bidirectional ring graph!\n");
+        MPI_Abort(MPI_COMM_WORLD, 1);
+        return 1;
+    }
+    MPI_Comm_free(&dgraph_comm);
+    
+    src_sz   = 2;
+    srcs[0]  = world_rank-1 <  0          ? world_size-1 : world_rank-1 ;
+    srcs[1]  = world_rank+1 >= world_size ?            0 : world_rank+1 ;
+    dest_sz  = 2;
+    dests[0] = world_rank-1 <  0          ? world_size-1 : world_rank-1 ;
+    dests[1] = world_rank+1 >= world_size ?            0 : world_rank+1 ;
+    ierr = MPI_Dist_graph_create_adjacent(MPI_COMM_WORLD,
+                                          src_sz, srcs, MPI_UNWEIGHTED,
+                                          dest_sz, dests, MPI_UNWEIGHTED,
+                                          MPI_INFO_NULL, 1, &dgraph_comm);
+    if ( ierr != MPI_SUCCESS ) {
+        fprintf(stderr, "MPI_Dist_graph_create_adjacent() fails!\n");
+        MPI_Abort(MPI_COMM_WORLD, 1);
+        return 1;
+    }
+    if (!validate_dgraph(dgraph_comm)) {
+        fprintf(stderr, "MPI_Dist_graph_create_adjacent() does NOT create "
+                        "a bidirectional ring graph!\n");
+        MPI_Abort(MPI_COMM_WORLD, 1);
+        return 1;
+    }
+    MPI_Comm_free(&dgraph_comm);
+
+    MTest_Finalize(errs);
+    MPI_Finalize();
+    return 0;
+}
diff --git a/teshsuite/smpi/mpich3-test/topo/dims1.c b/teshsuite/smpi/mpich3-test/topo/dims1.c
new file mode 100644 (file)
index 0000000..b429776
--- /dev/null
@@ -0,0 +1,144 @@
+/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
+/*
+ *  (C) 2003 by Argonne National Laboratory.
+ *      See COPYRIGHT in top-level directory.
+ */
+#include "mpi.h"
+#include <stdio.h>
+#include "mpitest.h"
+
+int prodof( int ndims, const int dims[] );
+int increasing( int ndims, const int dims[] );
+
+int prodof( int ndims, const int dims[] )
+{
+    int i, prod=1;
+    for (i=0; i<ndims; i++) 
+       prod *= dims[i];
+    return prod;
+}
+
+int increasing( int ndims, const int dims[] )
+{
+    int i, err=0;
+    for (i=1; i<ndims; i++) {
+       if (dims[i] > dims[i-1]) {
+           printf ("%d = dims[%d] > dims[%d] = %d\n", dims[i], i, 
+                   i-1, dims[i-1] );
+           err = 1;
+       }
+    }
+    return err;
+}
+int main( int argc, char *argv[] )
+{
+    int errs = 0;
+    int dims[4], nnodes, ndims;
+
+    MTest_Init( &argc, &argv );
+
+    /* Test multiple dims create values.  For each, make sure that the 
+       product of dims is the number of input nodes */
+    nnodes = 2*3*5*7*11;
+    ndims  = 2;
+    dims[0] = dims[1] = 0;
+    MPI_Dims_create( nnodes, ndims, dims );
+    if (prodof(ndims,dims) != nnodes) {
+       errs++;
+       printf( "dims create returned the wrong decomposition for %d in %d dims\n",
+               nnodes, ndims );
+    }
+    if (increasing( ndims, dims )) {
+       errs++;
+       printf( "dims create returned a decomposition with increasing dimensions (see MPI-1 standard section 6.5)\n" );
+       printf( "dims create returned the wrong decomposition for %d in %d dims\n",
+               nnodes, ndims );
+    }
+
+    /* Test multiple dims create values.  For each, make sure that the 
+       product of dims is the number of input nodes */
+    nnodes = 2*7;
+    ndims  = 2;
+    dims[0] = dims[1] = 0;
+    MPI_Dims_create( nnodes, ndims, dims );
+    if (prodof(ndims,dims) != nnodes) {
+       errs++;
+       printf( "dims create returned the wrong decomposition for %d in %d dims\n",
+               nnodes, ndims );
+    }
+    if (increasing( ndims, dims )) {
+       errs++;
+       printf( "dims create returned a decomposition with increasing dimensions (see MPI-1 standard section 6.5)\n" );
+       printf( "dims create returned the wrong decomposition for %d in %d dims\n",
+               nnodes, ndims );
+    }
+
+    nnodes = 2*2*3*3*5*7*11;
+    ndims  = 2;
+    dims[0] = dims[1] = 0;
+    MPI_Dims_create( nnodes, ndims, dims );
+    if (prodof(ndims,dims) != nnodes) {
+       errs++;
+       printf( "dims create returned the wrong decomposition for %d in %d dims\n",
+               nnodes, ndims );
+    }
+    if (increasing( ndims, dims )) {
+       errs++;
+       printf( "dims create returned a decomposition with increasing dimensions (see MPI-1 standard section 6.5)\n" );
+       printf( "dims create returned the wrong decomposition for %d in %d dims\n",
+               nnodes, ndims );
+    }
+
+    nnodes = 11;
+    ndims  = 2;
+    dims[0] = dims[1] = 0;
+    MPI_Dims_create( nnodes, ndims, dims );
+    if (prodof(ndims,dims) != nnodes) {
+       errs++;
+       printf( "dims create returned the wrong decomposition for %d in %d dims\n",
+               nnodes, ndims );
+    }
+    if (increasing( ndims, dims )) {
+       errs++;
+       printf( "dims create returned a decomposition with increasing dimensions (see MPI-1 standard section 6.5)\n" );
+       printf( "dims create returned the wrong decomposition for %d in %d dims\n",
+               nnodes, ndims );
+    }
+
+    nnodes = 5*7*11;
+    ndims  = 4;
+    dims[0] = dims[1] = dims[2] = dims[3] = 0;
+    MPI_Dims_create( nnodes, ndims, dims );
+    if (prodof(ndims,dims) != nnodes) {
+       errs++;
+       printf( "dims create returned the wrong decomposition for %d in %d dims\n",
+               nnodes, ndims );
+    }
+    if (increasing( ndims, dims )) {
+       errs++;
+       printf( "dims create returned a decomposition with increasing dimensions (see MPI-1 standard section 6.5)\n" );
+       printf( "dims create returned the wrong decomposition for %d in %d dims\n",
+               nnodes, ndims );
+    }
+
+    nnodes = 64;
+    ndims  = 4;
+    dims[0] = dims[1] = dims[2] = dims[3] = 0;
+    MPI_Dims_create( nnodes, ndims, dims );
+    if (prodof(ndims,dims) != nnodes) {
+       errs++;
+       printf( "dims create returned the wrong decomposition for %d in %d dims\n",
+               nnodes, ndims );
+    }
+    if (increasing( ndims, dims )) {
+       errs++;
+       printf( "dims create returned a decomposition with increasing dimensions (see MPI-1 standard section 6.5)\n" );
+       printf( "dims create returned the wrong decomposition for %d in %d dims\n",
+               nnodes, ndims );
+    }
+
+    MTest_Finalize( errs );
+    MPI_Finalize();
+    return 0;
+  
+}
diff --git a/teshsuite/smpi/mpich3-test/topo/dims2.c b/teshsuite/smpi/mpich3-test/topo/dims2.c
new file mode 100644 (file)
index 0000000..aa453eb
--- /dev/null
@@ -0,0 +1,93 @@
+/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
+/*
+ *  (C) 2003 by Argonne National Laboratory.
+ *      See COPYRIGHT in top-level directory.
+ */
+#include "mpi.h"
+#include <stdio.h>
+#include "mpitest.h"
+
+int prodof( int, const int[] );
+/*
+ * Test edge cases of Dims_create
+ */
+int prodof( int ndims, const int dims[] )
+{
+    int i, prod=1;
+    for (i=0; i<ndims; i++) 
+       prod *= dims[i];
+    return prod;
+}
+
+int main( int argc, char *argv[] )
+{
+    int errs = 0;
+    int dims[4], nnodes;
+
+    MTest_Init( &argc, &argv );
+
+    /* 2 dimensional tests */
+    for (nnodes=1; nnodes <= 32; nnodes = nnodes * 2) {
+       dims[0] = 0;
+       dims[1] = nnodes;
+       
+       MPI_Dims_create( nnodes, 2, dims );
+       if (prodof(2, dims) != nnodes) {
+           errs++;
+           printf( "Dims_create returned the wrong decomposition.  " );
+           printf( "Is [%d x %d], should be 1 x %d\n", dims[0], dims[1], 
+                   nnodes );
+       }
+       
+       /* Try calling Dims_create with nothing to do (all dimensions
+          specified) */
+       dims[0] = 1;
+       dims[1] = nnodes;
+       MPI_Dims_create( nnodes, 2, dims );
+       if (prodof(2, dims) != nnodes) {
+           errs++;
+           printf( "Dims_create returned the wrong decomposition (all given).  " );
+           printf( "Is [%d x %d], should be 1 x %d\n", dims[0], dims[1], 
+                   nnodes );
+       }
+
+    }
+
+    /* 4 dimensional tests */
+    for (nnodes=4; nnodes <= 32; nnodes = nnodes * 2) {
+       dims[0] = 0;
+       dims[1] = nnodes/2;
+       dims[2] = 0;
+       dims[3] = 2;
+       
+       MPI_Dims_create( nnodes, 4, dims );
+       if (prodof(4, dims) != nnodes) {
+           errs++;
+           printf( "Dims_create returned the wrong decomposition.  " );
+           printf( "Is [%d x %d x %d x %d], should be 1 x %d x 1 x 2\n", 
+                   dims[0], dims[1], dims[2], dims[3],
+                   nnodes/2 );
+       }
+       
+       /* Try calling Dims_create with nothing to do (all dimensions
+          specified) */
+       dims[0] = 1;
+       dims[1] = nnodes/2;
+       dims[2] = 1;
+       dims[3] = 2;
+       MPI_Dims_create( nnodes, 4, dims );
+       if (prodof(4, dims) != nnodes) {
+           errs++;
+           printf( "Dims_create returned the wrong decomposition (all given).  " );
+           printf( "Is [%d x %d x %d x %d], should be 1 x %d x 1 x 2\n", 
+                   dims[0], dims[1], dims[2], dims[3],
+                   nnodes/2 );
+       }
+
+    }
+
+    MTest_Finalize( errs );
+    MPI_Finalize();
+    return 0;
+  
+}
diff --git a/teshsuite/smpi/mpich3-test/topo/distgraph1.c b/teshsuite/smpi/mpich3-test/topo/distgraph1.c
new file mode 100644 (file)
index 0000000..de42586
--- /dev/null
@@ -0,0 +1,572 @@
+/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
+/*
+ *
+ *  (C) 2003 by Argonne National Laboratory.
+ *      See COPYRIGHT in top-level directory.
+ */
+
+#include "mpi.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include "mpitest.h"
+
+#define NUM_GRAPHS 10
+#define MAX_WEIGHT 100
+
+/* convenience globals */
+int size, rank;
+
+/* We need MPI 2.2 to be able to compile the following routines. */
+#if MTEST_HAVE_MIN_MPI_VERSION(2,2)
+
+/* Maybe use a bit vector instead? */
+int **layout;
+
+#define MAX_LAYOUT_NAME_LEN 256
+char graph_layout_name[MAX_LAYOUT_NAME_LEN] = {'\0'};
+
+static void create_graph_layout(int graph_num)
+{
+    int i, j;
+
+    if (rank == 0) {
+        switch (graph_num) {
+            case 0:
+                strncpy(graph_layout_name, "deterministic complete graph", MAX_LAYOUT_NAME_LEN);
+                for (i = 0; i < size; i++)
+                    for (j = 0; j < size; j++)
+                        layout[i][j] = (i + 2) * (j + 1);
+                break;
+            case 1:
+                strncpy(graph_layout_name, "every other edge deleted", MAX_LAYOUT_NAME_LEN);
+                for (i = 0; i < size; i++)
+                    for (j = 0; j < size; j++)
+                        layout[i][j] = (j % 2 ? (i + 2) * (j + 1) : 0);
+                break;
+            case 2:
+                strncpy(graph_layout_name, "only self-edges", MAX_LAYOUT_NAME_LEN);
+                for (i = 0; i < size; i++) {
+                    for (j = 0; j < size; j++) {
+                        if (i == rank && j == rank)
+                            layout[i][j] = 10 * (i + 1);
+                        else
+                            layout[i][j] = 0;
+                    }
+                }
+                break;
+            case 3:
+                strncpy(graph_layout_name, "no edges", MAX_LAYOUT_NAME_LEN);
+                for (i = 0; i < size; i++)
+                    for (j = 0; j < size; j++)
+                        layout[i][j] = 0;
+                break;
+            default:
+                strncpy(graph_layout_name, "a random incomplete graph", MAX_LAYOUT_NAME_LEN);
+                srand(graph_num);
+
+                /* Create a connectivity graph; layout[i,j]==w represents an outward
+                 * connectivity from i to j with weight w, w==0 is no edge. */
+                for (i = 0; i < size; i++) {
+                    for (j = 0; j < size; j++) {
+                        /* disable about a third of the edges */
+                        if (((rand() * 1.0) / RAND_MAX) < 0.33)
+                            layout[i][j] = 0;
+                        else
+                            layout[i][j] = rand() % MAX_WEIGHT;
+                    }
+                }
+                break;
+        }
+    }
+
+    /* because of the randomization we must determine the graph on rank 0 and
+     * send the layout to all other processes */
+    MPI_Bcast(graph_layout_name, MAX_LAYOUT_NAME_LEN, MPI_CHAR, 0, MPI_COMM_WORLD);
+    for (i = 0; i < size; ++i) {
+        MPI_Bcast(layout[i], size, MPI_INT, 0, MPI_COMM_WORLD);
+    }
+}
+
+static int verify_comm(MPI_Comm comm)
+{
+    int local_errs = 0;
+    int i, j;
+    int indegree, outdegree, weighted;
+    int *sources, *sweights, *destinations, *dweights;
+    int use_dup;
+    int topo_type = MPI_UNDEFINED;
+    MPI_Comm dupcomm = MPI_COMM_NULL;
+
+    sources = (int *) malloc(size * sizeof(int));
+    sweights = (int *) malloc(size * sizeof(int));
+    destinations = (int *) malloc(size * sizeof(int));
+    dweights = (int *) malloc(size * sizeof(int));
+
+    for (use_dup = 0; use_dup <= 1; ++use_dup) {
+        if (!use_dup) {
+            MPI_Dist_graph_neighbors_count(comm, &indegree, &outdegree, &weighted);
+        }
+        else {
+            MPI_Comm_dup(comm, &dupcomm);
+            comm = dupcomm; /* caller retains original comm value */
+        }
+
+        MPI_Topo_test(comm, &topo_type);
+        if (topo_type != MPI_DIST_GRAPH) {
+            fprintf(stderr, "topo_type != MPI_DIST_GRAPH\n");
+            ++local_errs;
+        }
+
+        j = 0;
+        for (i = 0; i < size; i++)
+            if (layout[i][rank])
+                j++;
+        if (j != indegree) {
+            fprintf(stderr, "indegree does not match, expected=%d got=%d, layout='%s'\n", indegree, j, graph_layout_name);
+            ++local_errs;
+        }
+
+        j = 0;
+        for (i = 0; i < size; i++)
+            if (layout[rank][i])
+                j++;
+        if (j != outdegree) {
+            fprintf(stderr, "outdegree does not match, expected=%d got=%d, layout='%s'\n", outdegree, j, graph_layout_name);
+            ++local_errs;
+        }
+
+        if ((indegree || outdegree) && (weighted == 0)) {
+            fprintf(stderr, "MPI_Dist_graph_neighbors_count thinks the graph is not weighted\n");
+            ++local_errs;
+        }
+
+
+        MPI_Dist_graph_neighbors(comm, indegree, sources, sweights, outdegree, destinations, dweights);
+
+        /* For each incoming and outgoing edge in the matrix, search if
+         * the query function listed it in the sources. */
+        for (i = 0; i < size; i++) {
+            if (layout[i][rank]) {
+                for (j = 0; j < indegree; j++) {
+                    assert(sources[j] >= 0);
+                    assert(sources[j] < size);
+                    if (sources[j] == i)
+                        break;
+                }
+                if (j == indegree) {
+                    fprintf(stderr, "no edge from %d to %d specified\n", i, rank);
+                    ++local_errs;
+                }
+                else {
+                    if (sweights[j] != layout[i][rank]) {
+                        fprintf(stderr, "incorrect weight for edge (%d,%d): %d instead of %d\n",
+                                i, rank, sweights[j], layout[i][rank]);
+                        ++local_errs;
+                    }
+                }
+            }
+            if (layout[rank][i]) {
+                for (j = 0; j < outdegree; j++) {
+                    assert(destinations[j] >= 0);
+                    assert(destinations[j] < size);
+                    if (destinations[j] == i)
+                        break;
+                }
+                if (j == outdegree) {
+                    fprintf(stderr, "no edge from %d to %d specified\n", rank, i);
+                    ++local_errs;
+                }
+                else {
+                    if (dweights[j] != layout[rank][i]) {
+                        fprintf(stderr, "incorrect weight for edge (%d,%d): %d instead of %d\n",
+                                rank, i, dweights[j], layout[rank][i]);
+                        ++local_errs;
+                    }
+                }
+            }
+        }
+
+        /* For each incoming and outgoing edge in the sources, we should
+         * have an entry in the matrix */
+        for (i = 0; i < indegree; i++) {
+            if (layout[sources[i]][rank] != sweights[i]) {
+                fprintf(stderr, "edge (%d,%d) has a weight %d instead of %d\n", i, rank,
+                        sweights[i], layout[sources[i]][rank]);
+                ++local_errs;
+            }
+        }
+        for (i = 0; i < outdegree; i++) {
+            if (layout[rank][destinations[i]] != dweights[i]) {
+                fprintf(stderr, "edge (%d,%d) has a weight %d instead of %d\n", rank, i,
+                        dweights[i], layout[rank][destinations[i]]);
+                ++local_errs;
+            }
+        }
+
+    }
+
+    if (dupcomm != MPI_COMM_NULL)
+        MPI_Comm_free(&dupcomm);
+
+    return local_errs;
+}
+
+#endif /* At least MPI 2.2 */
+
+int main(int argc, char *argv[])
+{
+    int errs = 0;
+    int i, j, k, p;
+    int indegree, outdegree, reorder;
+    int check_indegree, check_outdegree, check_weighted;
+    int *sources, *sweights, *destinations, *dweights, *degrees;
+    MPI_Comm comm;
+
+    MTest_Init(&argc, &argv);
+
+    MPI_Comm_size(MPI_COMM_WORLD, &size);
+    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+
+#if MTEST_HAVE_MIN_MPI_VERSION(2,2)
+    layout = (int **) malloc(size * sizeof(int *));
+    assert(layout);
+    for (i = 0; i < size; i++) {
+        layout[i] = (int *) malloc(size * sizeof(int));
+        assert(layout[i]);
+    }
+    /* alloc size*size ints to handle the all-on-one-process case */
+    sources = (int *) malloc(size * size * sizeof(int));
+    sweights = (int *) malloc(size * size * sizeof(int));
+    destinations = (int *) malloc(size * size * sizeof(int));
+    dweights = (int *) malloc(size * size * sizeof(int));
+    degrees = (int *) malloc(size * size * sizeof(int));
+
+    for (i = 0; i < NUM_GRAPHS; i++) {
+        create_graph_layout(i);
+        if (rank == 0) {
+            MTestPrintfMsg( 1, "using graph layout '%s'\n", graph_layout_name );
+        }
+
+        /* MPI_Dist_graph_create_adjacent */
+        if (rank == 0) {
+            MTestPrintfMsg( 1, "testing MPI_Dist_graph_create_adjacent\n" );
+        }
+        indegree = 0;
+        k = 0;
+        for (j = 0; j < size; j++) {
+            if (layout[j][rank]) {
+                indegree++;
+                sources[k] = j;
+                sweights[k++] = layout[j][rank];
+            }
+        }
+
+        outdegree = 0;
+        k = 0;
+        for (j = 0; j < size; j++) {
+            if (layout[rank][j]) {
+                outdegree++;
+                destinations[k] = j;
+                dweights[k++] = layout[rank][j];
+            }
+        }
+
+        for (reorder = 0; reorder <= 1; reorder++) {
+            MPI_Dist_graph_create_adjacent(MPI_COMM_WORLD, indegree, sources, sweights,
+                                           outdegree, destinations, dweights, MPI_INFO_NULL,
+                                           reorder, &comm);
+            MPI_Barrier(comm);
+            errs += verify_comm(comm);
+            MPI_Comm_free(&comm);
+        }
+
+        /* a weak check that passing MPI_UNWEIGHTED doesn't cause
+         * create_adjacent to explode */
+        MPI_Dist_graph_create_adjacent(MPI_COMM_WORLD, indegree, sources, MPI_UNWEIGHTED,
+                                       outdegree, destinations, MPI_UNWEIGHTED, MPI_INFO_NULL,
+                                       reorder, &comm);
+        MPI_Barrier(comm);
+        /* intentionally no verify here, weights won't match */
+        MPI_Comm_free(&comm);
+
+
+        /* MPI_Dist_graph_create() where each process specifies its
+         * outgoing edges */
+        if (rank == 0) {
+            MTestPrintfMsg( 1, 
+                          "testing MPI_Dist_graph_create w/ outgoing only\n" );
+        }
+        sources[0] = rank;
+        k = 0;
+        for (j = 0; j < size; j++) {
+            if (layout[rank][j]) {
+                destinations[k] = j;
+                dweights[k++] = layout[rank][j];
+            }
+        }
+        degrees[0] = k;
+        for (reorder = 0; reorder <= 1; reorder++) {
+            MPI_Dist_graph_create(MPI_COMM_WORLD, 1, sources, degrees, destinations, dweights,
+                                  MPI_INFO_NULL, reorder, &comm);
+            MPI_Barrier(comm);
+            errs += verify_comm(comm);
+            MPI_Comm_free(&comm);
+        }
+
+
+        /* MPI_Dist_graph_create() where each process specifies its
+         * incoming edges */
+        if (rank == 0) {
+            MTestPrintfMsg( 1, 
+                         "testing MPI_Dist_graph_create w/ incoming only\n" );
+        }
+        k = 0;
+        for (j = 0; j < size; j++) {
+            if (layout[j][rank]) {
+                sources[k] = j;
+                sweights[k] = layout[j][rank];
+                degrees[k] = 1;
+                destinations[k++] = rank;
+            }
+        }
+        for (reorder = 0; reorder <= 1; reorder++) {
+            MPI_Dist_graph_create(MPI_COMM_WORLD, k, sources, degrees, destinations, sweights,
+                                  MPI_INFO_NULL, reorder, &comm);
+            MPI_Barrier(comm);
+            errs += verify_comm(comm);
+            MPI_Comm_free(&comm);
+        }
+
+
+        /* MPI_Dist_graph_create() where rank 0 specifies the entire
+         * graph */
+        if (rank == 0) {
+            MTestPrintfMsg( 1, 
+               "testing MPI_Dist_graph_create w/ rank 0 specifies only\n" );
+        }
+        p = 0;
+        for (j = 0; j < size; j++) {
+            for (k = 0; k < size; k++) {
+                if (layout[j][k]) {
+                    sources[p] = j;
+                    sweights[p] = layout[j][k];
+                    degrees[p] = 1;
+                    destinations[p++] = k;
+                }
+            }
+        }
+        for (reorder = 0; reorder <= 1; reorder++) {
+            MPI_Dist_graph_create(MPI_COMM_WORLD, (rank == 0) ? p : 0, sources, degrees,
+                                  destinations, sweights, MPI_INFO_NULL, reorder, &comm);
+            MPI_Barrier(comm);
+            errs += verify_comm(comm);
+            MPI_Comm_free(&comm);
+        }
+
+        /* MPI_Dist_graph_create() where rank 0 specifies the entire
+         * graph and all other ranks pass NULL.  Can catch implementation
+         * problems when MPI_UNWEIGHTED==NULL. */
+        if (rank == 0) {
+            MTestPrintfMsg( 1, 
+           "testing MPI_Dist_graph_create w/ rank 0 specifies only -- NULLs\n");
+        }
+        p = 0;
+        for (j = 0; j < size; j++) {
+            for (k = 0; k < size; k++) {
+                if (layout[j][k]) {
+                    sources[p] = j;
+                    sweights[p] = layout[j][k];
+                    degrees[p] = 1;
+                    destinations[p++] = k;
+                }
+            }
+        }
+        for (reorder = 0; reorder <= 1; reorder++) {
+            if (rank == 0) {
+                MPI_Dist_graph_create(MPI_COMM_WORLD, p, sources, degrees,
+                                      destinations, sweights, MPI_INFO_NULL, reorder, &comm);
+            }
+            else {
+                MPI_Dist_graph_create(MPI_COMM_WORLD, 0, NULL, NULL,
+                                      NULL, NULL, MPI_INFO_NULL, reorder, &comm);
+            }
+            MPI_Barrier(comm);
+            errs += verify_comm(comm);
+            MPI_Comm_free(&comm);
+        }
+
+    }
+
+    /* now tests that don't depend on the layout[][] array */
+
+    /* The MPI-2.2 standard recommends implementations set
+     * MPI_UNWEIGHTED==NULL, but this leads to an ambiguity.  The draft
+     * MPI-3.0 standard specifically recommends _not_ setting it equal
+     * to NULL. */
+    if (MPI_UNWEIGHTED == NULL) {
+        fprintf(stderr, "MPI_UNWEIGHTED should not be NULL\n");
+        ++errs;
+    }
+
+    /* MPI_Dist_graph_create() with no graph */
+    if (rank == 0) {
+        MTestPrintfMsg( 1, "testing MPI_Dist_graph_create w/ no graph\n" );
+    }
+    for (reorder = 0; reorder <= 1; reorder++) {
+        MPI_Dist_graph_create(MPI_COMM_WORLD, 0, sources, degrees,
+                              destinations, sweights, MPI_INFO_NULL, reorder, &comm);
+        MPI_Dist_graph_neighbors_count(comm, &check_indegree, &check_outdegree, &check_weighted);
+        if (!check_weighted) {
+            fprintf(stderr, "expected weighted == TRUE for the \"no graph\" case\n");
+            ++errs;
+        }
+        MPI_Comm_free(&comm);
+    }
+
+    /* MPI_Dist_graph_create() with no graph -- passing MPI_WEIGHTS_EMPTY 
+       instead */
+    /* NOTE that MPI_WEIGHTS_EMPTY was added in MPI-3 and does not 
+       appear before then.  This part of the test thus requires a check
+       on the MPI major version */
+#if MPI_VERSION >= 3
+    if (rank == 0) {
+        MTestPrintfMsg( 1, "testing MPI_Dist_graph_create w/ no graph\n" );
+    }
+    for (reorder = 0; reorder <= 1; reorder++) {
+        MPI_Dist_graph_create(MPI_COMM_WORLD, 0, sources, degrees,
+                              destinations, MPI_WEIGHTS_EMPTY, MPI_INFO_NULL, reorder, &comm);
+        MPI_Dist_graph_neighbors_count(comm, &check_indegree, &check_outdegree, &check_weighted);
+        if (!check_weighted) {
+            fprintf(stderr, "expected weighted == TRUE for the \"no graph -- MPI_WEIGHTS_EMPTY\" case\n");
+            ++errs;
+        }
+        MPI_Comm_free(&comm);
+    }
+#endif
+
+    /* MPI_Dist_graph_create() with no graph -- passing NULLs instead */
+    if (rank == 0) {
+        MTestPrintfMsg( 1, 
+                      "testing MPI_Dist_graph_create w/ no graph -- NULLs\n" );
+    }
+    for (reorder = 0; reorder <= 1; reorder++) {
+        MPI_Dist_graph_create(MPI_COMM_WORLD, 0, NULL, NULL,
+                              NULL, NULL, MPI_INFO_NULL, reorder, &comm);
+        MPI_Dist_graph_neighbors_count(comm, &check_indegree, &check_outdegree, &check_weighted);
+        /* ambiguous if they are equal, only check when they are distinct values. */
+        if (MPI_UNWEIGHTED != NULL) {
+            if (!check_weighted) {
+                fprintf(stderr, "expected weighted == TRUE for the \"no graph -- NULLs\" case\n");
+                ++errs;
+            }
+        }
+        MPI_Comm_free(&comm);
+    }
+
+    /* MPI_Dist_graph_create() with no graph -- passing NULLs+MPI_UNWEIGHTED instead */
+    if (rank == 0) {
+        MTestPrintfMsg( 1, 
+        "testing MPI_Dist_graph_create w/ no graph -- NULLs+MPI_UNWEIGHTED\n" );
+    }
+    for (reorder = 0; reorder <= 1; reorder++) {
+        MPI_Dist_graph_create(MPI_COMM_WORLD, 0, NULL, NULL,
+                              NULL, MPI_UNWEIGHTED, MPI_INFO_NULL, reorder, &comm);
+        MPI_Dist_graph_neighbors_count(comm, &check_indegree, &check_outdegree, &check_weighted);
+        /* ambiguous if they are equal, only check when they are distinct values. */
+        if (MPI_UNWEIGHTED != NULL) {
+            if (check_weighted) {
+                fprintf(stderr, "expected weighted == FALSE for the \"no graph -- NULLs+MPI_UNWEIGHTED\" case\n");
+                ++errs;
+            }
+        }
+        MPI_Comm_free(&comm);
+    }
+
+    /* MPI_Dist_graph_create_adjacent() with no graph */
+    if (rank == 0) {
+        MTestPrintfMsg( 1, 
+                     "testing MPI_Dist_graph_create_adjacent w/ no graph\n" );
+    }
+    for (reorder = 0; reorder <= 1; reorder++) {
+        MPI_Dist_graph_create_adjacent(MPI_COMM_WORLD, 0, sources, sweights,
+                              0, destinations, dweights, MPI_INFO_NULL, reorder, &comm);
+        MPI_Dist_graph_neighbors_count(comm, &check_indegree, &check_outdegree, &check_weighted);
+        if (!check_weighted) {
+            fprintf(stderr, "expected weighted == TRUE for the \"no graph\" case\n");
+            ++errs;
+        }
+        MPI_Comm_free(&comm);
+    }
+
+    /* MPI_Dist_graph_create_adjacent() with no graph -- passing MPI_WEIGHTS_EMPTY instead */
+    /* NOTE that MPI_WEIGHTS_EMPTY was added in MPI-3 and does not 
+       appear before then.  This part of the test thus requires a check
+       on the MPI major version */
+#if MPI_VERSION >= 3
+    if (rank == 0) {
+        MTestPrintfMsg( 1, 
+  "testing MPI_Dist_graph_create_adjacent w/ no graph -- MPI_WEIGHTS_EMPTY\n" );
+    }
+    for (reorder = 0; reorder <= 1; reorder++) {
+        MPI_Dist_graph_create_adjacent(MPI_COMM_WORLD, 0, sources, MPI_WEIGHTS_EMPTY,
+                              0, destinations, MPI_WEIGHTS_EMPTY, MPI_INFO_NULL, reorder, &comm);
+        MPI_Dist_graph_neighbors_count(comm, &check_indegree, &check_outdegree, &check_weighted);
+        if (!check_weighted) {
+            fprintf(stderr, "expected weighted == TRUE for the \"no graph -- MPI_WEIGHTS_EMPTY\" case\n");
+            ++errs;
+        }
+        MPI_Comm_free(&comm);
+    }
+#endif
+
+    /* MPI_Dist_graph_create_adjacent() with no graph -- passing NULLs instead */
+    if (rank == 0) {
+        MTestPrintfMsg( 1, 
+              "testing MPI_Dist_graph_create_adjacent w/ no graph -- NULLs\n" );
+    }
+    for (reorder = 0; reorder <= 1; reorder++) {
+        MPI_Dist_graph_create_adjacent(MPI_COMM_WORLD, 0, NULL, NULL,
+                              0, NULL, NULL, MPI_INFO_NULL, reorder, &comm);
+        MPI_Dist_graph_neighbors_count(comm, &check_indegree, &check_outdegree, &check_weighted);
+        /* ambiguous if they are equal, only check when they are distinct values. */
+        if (MPI_UNWEIGHTED != NULL) {
+            if (!check_weighted) {
+                fprintf(stderr, "expected weighted == TRUE for the \"no graph -- NULLs\" case\n");
+                ++errs;
+            }
+        }
+        MPI_Comm_free(&comm);
+    }
+
+    /* MPI_Dist_graph_create_adjacent() with no graph -- passing NULLs+MPI_UNWEIGHTED instead */
+    if (rank == 0) {
+        MTestPrintfMsg( 1, 
+"testing MPI_Dist_graph_create_adjacent w/ no graph -- NULLs+MPI_UNWEIGHTED\n");
+    }
+    for (reorder = 0; reorder <= 1; reorder++) {
+        MPI_Dist_graph_create_adjacent(MPI_COMM_WORLD, 0, NULL, MPI_UNWEIGHTED,
+                              0, NULL, MPI_UNWEIGHTED, MPI_INFO_NULL, reorder, &comm);
+        MPI_Dist_graph_neighbors_count(comm, &check_indegree, &check_outdegree, &check_weighted);
+        /* ambiguous if they are equal, only check when they are distinct values. */
+        if (MPI_UNWEIGHTED != NULL) {
+            if (check_weighted) {
+                fprintf(stderr, "expected weighted == FALSE for the \"no graph -- NULLs+MPI_UNWEIGHTED\" case\n");
+                ++errs;
+            }
+        }
+        MPI_Comm_free(&comm);
+    }
+
+
+    for (i = 0; i < size; i++)
+        free(layout[i]);
+    free(layout);
+#endif
+
+    MTest_Finalize(errs);
+    MPI_Finalize();
+
+    return 0;
+}
diff --git a/teshsuite/smpi/mpich3-test/topo/graphcr.c b/teshsuite/smpi/mpich3-test/topo/graphcr.c
new file mode 100644 (file)
index 0000000..2bfac48
--- /dev/null
@@ -0,0 +1,34 @@
+/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
+/*
+ *
+ *  (C) 2003 by Argonne National Laboratory.
+ *      See COPYRIGHT in top-level directory.
+ */
+#include "mpi.h"
+#include <stdio.h>
+#include "mpitest.h"
+
+/*
+static char MTEST_Descrip[] = "Create a communicator with a graph that contains no processes";
+*/
+
+int main( int argc, char *argv[] )
+{
+    int errs = 0;
+    int *index = 0, *edges = 0;
+    MPI_Comm comm;
+
+    MTest_Init( &argc, &argv );
+
+    /* MPI 2.1, page 246, lines 29-30 make it clear that this is a valid
+       (not erroneous) call that must return MPI_COMM_NULL */
+    MPI_Graph_create( MPI_COMM_WORLD, 0, index, edges, 0, &comm );
+    if (comm != MPI_COMM_NULL) {
+       errs++;
+       fprintf( stderr, "Expected MPI_COMM_NULL from empty graph create\n" );
+    }
+       
+    MTest_Finalize( errs );
+    MPI_Finalize();
+    return 0;
+}
diff --git a/teshsuite/smpi/mpich3-test/topo/graphcr2.c b/teshsuite/smpi/mpich3-test/topo/graphcr2.c
new file mode 100644 (file)
index 0000000..6d5fd2a
--- /dev/null
@@ -0,0 +1,70 @@
+/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
+/*
+ *
+ *  (C) 2003 by Argonne National Laboratory.
+ *      See COPYRIGHT in top-level directory.
+ */
+#include "mpi.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include "mpitest.h"
+
+/*
+static char MTEST_Descrip[] = "Create a communicator with a graph that contains null edges and one that contains duplicate edges";
+*/
+
+int main( int argc, char *argv[] )
+{
+    int errs = 0;
+    int *index = 0, *edges = 0;
+    int rank, size, i, j, crank, csize;
+    MPI_Comm comm;
+
+    MTest_Init( &argc, &argv );
+
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+
+    index = (int *)malloc( size*sizeof(int) );
+    edges = (int *)malloc( size*sizeof(int) );
+    for (i=0; i<size; i++) {
+       index[i] = 1;
+       edges[i] = i;
+    }
+    /* As of MPI 2.1, self edges are permitted */
+    MPI_Graph_create( MPI_COMM_WORLD, size, index, edges, 0, &comm );
+    MPI_Comm_rank( comm, &crank );
+    MPI_Comm_size( comm, &csize );
+    if (csize != size) {
+       errs ++;
+       fprintf( stderr, "Graph create with self links has size %d should be %d", csize, size );
+    }
+    free( index );
+    free( edges );
+    MPI_Comm_free( &comm );
+
+    /* Create a graph with duplicate links */
+    index = (int *)malloc( size * sizeof(int) );
+    edges = (int *)malloc( size * 2 * sizeof(int) );
+    j = 0;
+    for (i=0; i<size; i++) {
+       index[i]   = j + 2;
+       edges[j++] = (i + 1) % size;
+       edges[j++] = (i + 1) % size; 
+    }
+    /* As of MPI 2.1, duplicate edges are permitted */
+    MPI_Graph_create( MPI_COMM_WORLD, size, index, edges, 0, &comm );
+    MPI_Comm_rank( comm, &crank );
+    MPI_Comm_size( comm, &csize );
+    if (csize != size) {
+       errs ++;
+       fprintf( stderr, "Graph create with duplicate links has size %d should be %d", csize, size );
+    }
+    free( index );
+    free( edges );
+    MPI_Comm_free( &comm );
+
+    MTest_Finalize( errs );
+    MPI_Finalize();
+    return 0;
+}
diff --git a/teshsuite/smpi/mpich3-test/topo/graphmap1.c b/teshsuite/smpi/mpich3-test/topo/graphmap1.c
new file mode 100644 (file)
index 0000000..4102db3
--- /dev/null
@@ -0,0 +1,40 @@
+/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
+/*
+ *
+ *  (C) 2003 by Argonne National Laboratory.
+ *      See COPYRIGHT in top-level directory.
+ */
+#include "mpi.h"
+#include <stdio.h>
+#include "mpitest.h"
+
+int main( int argc, char *argv[] )
+{
+    int errs = 0;
+    int newrank, merr, rank;
+    int index[2], edges[2];
+
+    MTest_Init( &argc, &argv );
+
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    /* Graph map where there are no nodes for this process */
+    MPI_Comm_set_errhandler( MPI_COMM_WORLD, MPI_ERRORS_RETURN );
+    /* Here is a singleton graph, containing only the root process */
+    index[0] = 0;
+    edges[0] = 0;
+    merr = MPI_Graph_map( MPI_COMM_WORLD, 1, index, edges, &newrank );
+    if (merr) {
+       errs++;
+       printf( "Graph map returned an error\n" );
+       MTestPrintError( merr );
+    }
+    if (rank != 0 && newrank != MPI_UNDEFINED) {
+       errs++;
+       printf( "Graph map with no local nodes did not return MPI_UNDEFINED\n" );
+    }
+    
+    MTest_Finalize( errs );
+    MPI_Finalize();
+    return 0;
+  
+}
diff --git a/teshsuite/smpi/mpich3-test/topo/neighb_coll.c b/teshsuite/smpi/mpich3-test/topo/neighb_coll.c
new file mode 100644 (file)
index 0000000..0c4a7fd
--- /dev/null
@@ -0,0 +1,179 @@
+/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
+/*
+ *  (C) 2012 by Argonne National Laboratory.
+ *      See COPYRIGHT in top-level directory.
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <mpi.h>
+#include "mpitest.h"
+
+#if !defined(USE_STRICT_MPI) && defined(MPICH)
+#define TEST_NEIGHB_COLL 1
+#endif
+
+/* assert-like macro that bumps the err count and emits a message */
+#define check(x_)                                                                 \
+    do {                                                                          \
+        if (!(x_)) {                                                              \
+            ++errs;                                                               \
+            if (errs < 10) {                                                      \
+                fprintf(stderr, "check failed: (%s), line %d\n", #x_, __LINE__); \
+            }                                                                     \
+        }                                                                         \
+    } while (0)
+
+int main(int argc, char *argv[])
+{
+    int errs = 0;
+    int wrank, wsize;
+    int periods[1] = { 0 };
+    MPI_Comm cart, dgraph, graph;
+
+    MPI_Init(&argc, &argv);
+    MPI_Comm_rank(MPI_COMM_WORLD, &wrank);
+    MPI_Comm_size(MPI_COMM_WORLD, &wsize);
+
+#if defined(TEST_NEIGHB_COLL)
+    /* a basic test for the 10 (5 patterns x {blocking,nonblocking}) MPI-3
+     * neighborhood collective routines */
+
+    /* (wrap)--> 0 <--> 1 <--> ... <--> p-1 <--(wrap) */
+    MPI_Cart_create(MPI_COMM_WORLD, 1, &wsize, periods, /*reorder=*/0, &cart);
+
+    /* allgather */
+    {
+        int sendbuf[1] = { wrank };
+        int recvbuf[2] = { 0xdeadbeef, 0xdeadbeef };
+
+        /* should see one send to each neighbor (rank-1 and rank+1) and one receive
+         * each from same */
+        MPI_Neighbor_allgather(sendbuf, 1, MPI_INT, recvbuf, 1, MPI_INT, cart);
+
+        if (wrank == 0)
+            check(recvbuf[0] == 0xdeadbeef);
+        else
+            check(recvbuf[0] == wrank - 1);
+
+        if (wrank == wsize - 1)
+            check(recvbuf[1] == 0xdeadbeef);
+        else
+            check(recvbuf[1] == wrank + 1);
+    }
+
+    /* allgatherv */
+    {
+        int sendbuf[1]    = { wrank };
+        int recvbuf[2]    = { 0xdeadbeef, 0xdeadbeef };
+        int recvcounts[2] = { 1, 1 };
+        int displs[2]     = { 1, 0};
+
+        /* should see one send to each neighbor (rank-1 and rank+1) and one receive
+         * each from same, but put them in opposite slots in the buffer */
+        MPI_Neighbor_allgatherv(sendbuf, 1, MPI_INT, recvbuf, recvcounts, displs, MPI_INT, cart);
+
+        if (wrank == 0)
+            check(recvbuf[1] == 0xdeadbeef);
+        else
+            check(recvbuf[1] == wrank - 1);
+
+        if (wrank == wsize - 1)
+            check(recvbuf[0] == 0xdeadbeef);
+        else
+            check(recvbuf[0] == wrank + 1);
+    }
+
+    /* alltoall */
+    {
+        int sendbuf[2]    = { -(wrank+1), wrank+1 };
+        int recvbuf[2]    = { 0xdeadbeef, 0xdeadbeef };
+
+        /* should see one send to each neighbor (rank-1 and rank+1) and one
+         * receive each from same */
+        MPI_Neighbor_alltoall(sendbuf, 1, MPI_INT, recvbuf, 1, MPI_INT, cart);
+
+        if (wrank == 0)
+            check(recvbuf[0] == 0xdeadbeef);
+        else
+            check(recvbuf[0] == wrank);
+
+        if (wrank == wsize - 1)
+            check(recvbuf[1] == 0xdeadbeef);
+        else
+            check(recvbuf[1] == -(wrank + 2));
+    }
+
+    /* alltoallv */
+    {
+        int sendbuf[2]    = { -(wrank+1), wrank+1 };
+        int recvbuf[2]    = { 0xdeadbeef, 0xdeadbeef };
+        int sendcounts[2] = { 1, 1 };
+        int recvcounts[2] = { 1, 1 };
+        int sdispls[2]    = { 0, 1 };
+        int rdispls[2]    = { 1, 0 };
+
+        /* should see one send to each neighbor (rank-1 and rank+1) and one receive
+         * each from same, but put them in opposite slots in the buffer */
+        MPI_Neighbor_alltoallv(sendbuf, sendcounts, sdispls, MPI_INT,
+                                recvbuf, recvcounts, rdispls, MPI_INT,
+                                cart);
+
+        if (wrank == 0)
+            check(recvbuf[1] == 0xdeadbeef);
+        else
+            check(recvbuf[1] == wrank);
+
+        if (wrank == wsize - 1)
+            check(recvbuf[0] == 0xdeadbeef);
+        else
+            check(recvbuf[0] == -(wrank + 2));
+    }
+
+    /* alltoallw */
+    {
+        int sendbuf[2]            = { -(wrank+1), wrank+1 };
+        int recvbuf[2]            = { 0xdeadbeef, 0xdeadbeef };
+        int sendcounts[2]         = { 1, 1 };
+        int recvcounts[2]         = { 1, 1 };
+        MPI_Aint sdispls[2]       = { 0, sizeof(int) };
+        MPI_Aint rdispls[2]       = { sizeof(int), 0 };
+        MPI_Datatype sendtypes[2] = { MPI_INT, MPI_INT };
+        MPI_Datatype recvtypes[2] = { MPI_INT, MPI_INT };
+
+        /* should see one send to each neighbor (rank-1 and rank+1) and one receive
+         * each from same, but put them in opposite slots in the buffer */
+        MPI_Neighbor_alltoallw(sendbuf, sendcounts, sdispls, sendtypes,
+                                recvbuf, recvcounts, rdispls, recvtypes,
+                                cart);
+
+        if (wrank == 0)
+            check(recvbuf[1] == 0xdeadbeef);
+        else
+            check(recvbuf[1] == wrank);
+
+        if (wrank == wsize - 1)
+            check(recvbuf[0] == 0xdeadbeef);
+        else
+            check(recvbuf[0] == -(wrank + 2));
+    }
+
+
+    MPI_Comm_free(&cart);
+#endif /* defined(TEST_NEIGHB_COLL) */
+
+    MPI_Reduce((wrank == 0 ? MPI_IN_PLACE : &errs), &errs, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);
+    if (wrank == 0) {
+        if (errs) {
+            printf("found %d errors\n", errs);
+        }
+        else {
+            printf(" No errors\n");
+        }
+    }
+    MPI_Finalize();
+
+    return 0;
+}
+
diff --git a/teshsuite/smpi/mpich3-test/topo/testlist b/teshsuite/smpi/mpich3-test/topo/testlist
new file mode 100644 (file)
index 0000000..0ec8867
--- /dev/null
@@ -0,0 +1,21 @@
+#need Cart implem
+#cartmap1 4
+#cartzero 4
+#cartshift1 4
+#cartsuball 4
+#cartcreates 4
+#need MPI_Dims_create
+#dims1 4
+#dims2 1
+#need MPI_Error_class, MPI_Comm_remote_size, MPI_Graph_map
+#graphmap1 4
+#need MPI_Topo_test, MPI_Cart_create
+#topotest 4
+#need MPI_Cart_create, MPI_Cart_get, MPI_Comm_remote_size, MPI_Dims_create ...
+#topodup 4
+#need MPI_Graph*
+#graphcr 4
+#graphcr2 4
+#distgraph1 4 mpiversion=2.2
+#dgraph_unwgt 4 mpiversion=2.2
+#neighb_coll 4 mpiversion=3.0
diff --git a/teshsuite/smpi/mpich3-test/topo/topodup.c b/teshsuite/smpi/mpich3-test/topo/topodup.c
new file mode 100644 (file)
index 0000000..f1c5515
--- /dev/null
@@ -0,0 +1,129 @@
+/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
+/*
+ *
+ *  (C) 2003 by Argonne National Laboratory.
+ *      See COPYRIGHT in top-level directory.
+ */
+#include "mpi.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include "mpitest.h"
+
+int main( int argc, char *argv[] )
+{
+    int errs = 0, i, k;
+    int dims[2], periods[2], wsize;
+    int outdims[2], outperiods[2], outcoords[2];
+    int topo_type;
+    int *index, *edges, *outindex, *outedges;
+    MPI_Comm comm1, comm2;
+
+    MTest_Init( &argc, &argv );
+
+    MPI_Comm_size( MPI_COMM_WORLD, &wsize );
+
+    /* Create a cartesian topology, get its characteristics, then 
+       dup it and check that the new communicator has the same properties */
+    dims[0] = dims[1] = 0;
+    MPI_Dims_create( wsize, 2, dims );
+    periods[0] = periods[1] = 0;
+    MPI_Cart_create( MPI_COMM_WORLD, 2, dims, periods, 0, &comm1 );
+
+    MPI_Comm_dup( comm1, &comm2 );
+    MPI_Topo_test( comm2, &topo_type );
+    if (topo_type != MPI_CART) {
+       errs++;
+       printf( "Topo type of duped cart was not cart\n" );
+    }
+    else {
+       MPI_Cart_get( comm2, 2, outdims, outperiods, outcoords );
+       for (i=0; i<2; i++) {
+           if (outdims[i] != dims[i]) {
+               errs++;
+               printf( "%d = outdims[%d] != dims[%d] = %d\n", outdims[i],
+                       i, i, dims[i] );
+           }
+           if (outperiods[i] != periods[i]) {
+               errs++;
+               printf( "%d = outperiods[%d] != periods[%d] = %d\n", 
+                       outperiods[i], i, i, periods[i] );
+           }
+       }
+    }
+    MPI_Comm_free( &comm2 );
+    MPI_Comm_free( &comm1 );
+
+    /* Now do the same with a graph topology */
+    if (wsize >= 3) {
+       index = (int*)malloc(wsize * sizeof(int) );
+       edges = (int*)malloc(wsize * 2 * sizeof(int) );
+       if (!index || !edges) {
+           printf( "Unable to allocate %d words for index or edges\n", 
+                   3 * wsize );
+           MPI_Abort( MPI_COMM_WORLD, 1 );
+       }
+       index[0] = 2;
+       for (i=1; i<wsize; i++) {
+           index[i] = 2 + index[i-1];
+       }
+       k=0;
+       for (i=0; i<wsize; i++) {
+           edges[k++] = (i-1+wsize) % wsize;
+           edges[k++] = (i+1) % wsize;
+       }
+       MPI_Graph_create( MPI_COMM_WORLD, wsize, index, edges, 0, &comm1 );
+       MPI_Comm_dup( comm1, &comm2 );
+       MPI_Topo_test( comm2, &topo_type );
+       if (topo_type != MPI_GRAPH) {
+           errs++;
+           printf( "Topo type of duped graph was not graph\n" );
+       }
+       else {
+           int nnodes, nedges;
+           MPI_Graphdims_get( comm2, &nnodes, &nedges );
+           if (nnodes != wsize) {
+               errs++;
+               printf( "Nnodes = %d, should be %d\n", nnodes, wsize );
+           }
+           if (nedges != 2*wsize) {
+               errs++;
+               printf( "Nedges = %d, should be %d\n", nedges, 2*wsize );
+           }
+           outindex = (int*)malloc(wsize * sizeof(int) );
+           outedges = (int*)malloc(wsize * 2 * sizeof(int) );
+           if (!outindex || !outedges) {
+               printf( "Unable to allocate %d words for outindex or outedges\n", 
+                       3 * wsize );
+               MPI_Abort( MPI_COMM_WORLD, 1 );
+           }
+           
+           MPI_Graph_get( comm2, wsize, 2*wsize, outindex, outedges );
+           for (i=0; i<wsize; i++) {
+               if (index[i] != outindex[i]) {
+                   printf( "%d = index[%d] != outindex[%d] = %d\n",
+                           index[i], i, i, outindex[i] );
+                   errs++;
+               }
+           }
+           for (i=0; i<2*wsize; i++) {
+               if (edges[i] != outedges[i]) {
+                   printf( "%d = edges[%d] != outedges[%d] = %d\n",
+                           edges[i], i, i, outedges[i] );
+                   errs++;
+               }
+           }
+           free( outindex );
+           free( outedges );
+       }
+       free( index );
+       free( edges );
+
+       MPI_Comm_free( &comm2 );
+       MPI_Comm_free( &comm1 );
+    }
+    
+    MTest_Finalize( errs );
+    MPI_Finalize();
+    return 0;
+  
+}
diff --git a/teshsuite/smpi/mpich3-test/topo/topotest.c b/teshsuite/smpi/mpich3-test/topo/topotest.c
new file mode 100644 (file)
index 0000000..64d8e08
--- /dev/null
@@ -0,0 +1,45 @@
+/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
+/*
+ *
+ *  (C) 2003 by Argonne National Laboratory.
+ *      See COPYRIGHT in top-level directory.
+ */
+#include "mpi.h"
+#include <stdio.h>
+#include "mpitest.h"
+
+int main( int argc, char *argv[] )
+{
+    int errs = 0;
+    int topo_type, size, dims[1], periods[1];
+    MPI_Comm comm;
+
+    MTest_Init( &argc, &argv );
+
+    /* Check that topo test returns the correct type, including 
+       MPI_UNDEFINED */
+
+    MPI_Topo_test( MPI_COMM_WORLD, &topo_type );
+    if (topo_type != MPI_UNDEFINED) {
+       errs++;
+       printf( "Topo type of comm world is not UNDEFINED\n" );
+    }
+
+    MPI_Comm_size( MPI_COMM_WORLD, &size );
+    dims[0] = size;
+    periods[0] = 0;
+    MPI_Cart_create( MPI_COMM_WORLD, 1, dims, periods, 0, &comm );
+    MPI_Topo_test( comm, &topo_type );
+    if (topo_type != MPI_CART) {
+       errs++;
+       printf( "Topo type of cart comm is not CART\n" );
+    }
+
+    MPI_Comm_free( &comm );
+    /* FIXME: still need graph example */
+
+    MTest_Finalize( errs );
+    MPI_Finalize();
+    return 0;
+  
+}
index a09704d..b9a074c 100644 (file)
@@ -27,7 +27,7 @@ int main(int argc, char**argv)
   xbt_init(&argc,argv);
 
   XBT_INFO("Allocating a new heap");
-  unsigned long mask = ~((unsigned long)getpagesize() - 1);
+  unsigned long mask = ~((unsigned long)xbt_pagesize - 1);
   void *addr = (void*)(((unsigned long)sbrk(0) + BUFFSIZE) & mask);
   heapA = xbt_mheap_new(-1, addr);
   if (heapA == NULL) {
index 359d2a5..1029d89 100644 (file)
@@ -43,7 +43,7 @@ $ cd temp_testdir_background
 < }
 $ mkfile delayed_cat.c
 
-$ gcc -Wall -o delayed_cat delayed_cat.c
+$ cc -Wall -o delayed_cat delayed_cat.c
 
 & ./delayed_cat
 > TOTO
index 3efe2c3..ff9c3d5 100644 (file)
@@ -13,7 +13,7 @@ $ cd temp_testdir-bg-set-signal
 < }
 $ mkfile segfault.c
 
-$ gcc -o segfault segfault.c
+$ cc -o segfault segfault.c
 ! expect signal SIGSEGV
 & ./segfault
 $ sleep 1
index ea794f1..f9d21a2 100644 (file)
@@ -12,7 +12,7 @@ $ cd temp_testdir-catch-return
 < }
 $ mkfile return1.c
 
-$ gcc -o return1 return1.c
+$ cc -o return1 return1.c
 
 ! expect return 41
 < $ ./return1
index 5c7b45f..64d37e8 100644 (file)
@@ -13,7 +13,7 @@ $ cd temp_testdir-catch-signal
 < }
 $ mkfile segfault.c
 
-$ gcc -o segfault segfault.c
+$ cc -o segfault segfault.c
 
 ! expect return 15
 < $ ./segfault
index ff0dd17..679234d 100644 (file)
@@ -12,7 +12,7 @@ $ cd temp_testdir-set-return
 < }
 $ mkfile return1.c
 
-$ gcc -o return1 return1.c
+$ cc -o return1 return1.c
 
 ! expect return 1
 $ ./return1
index 43f105e..314b7f0 100644 (file)
@@ -13,7 +13,7 @@ $ cd temp_testdir-set-signal
 < }
 $ mkfile segfault.c
 
-$ gcc -o segfault segfault.c
+$ cc -o segfault segfault.c
 ! expect signal SIGSEGV
 $ ./segfault
 $ cd ..
index 72d5566..632fd8b 100644 (file)
@@ -21,7 +21,7 @@ $ cd temp_testdir-setenv
 < }
 $ mkfile getenv.c
 
-$ gcc -o getenv getenv.c -g
+$ cc -o getenv getenv.c -g
 
 ! setenv tesh_test_toto=blah
 $ ./getenv
index a43da9b..204d52a 100644 (file)
@@ -48,7 +48,7 @@ static const s_signal_entry_t signals[] = {
 };
 
 
-const char *signal_name(unsigned int got, char *expected)
+const char *signal_name(int got, char *expected)
 {
   int i;
 
index cd9236d..1fc2d89 100644 (file)
@@ -17,7 +17,7 @@
 /******************************************/
 /* return the name of a signal, aliasing SIGBUS to SIGSEGV since
    segfault leads to any of them depending on the system */
-const char *signal_name(unsigned int got, char *expected);
+const char *signal_name(int got, char *expected);
 
 #include "run_context.h"