From 474cce002acbe20c7d598496338bf7bd3b1a6999 Mon Sep 17 00:00:00 2001 From: Jacob Merson Date: Sat, 27 Jul 2024 18:43:25 -0700 Subject: [PATCH 01/55] Update apfElement.cc This commit fixes #440 which will now work with any number of components. --- apf/apfElement.cc | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/apf/apfElement.cc b/apf/apfElement.cc index 161de8df1..534e6a35c 100644 --- a/apf/apfElement.cc +++ b/apf/apfElement.cc @@ -121,9 +121,12 @@ void Element::getNodeData() void Element::getElementNodeData(NewArray& d) { - d.allocated() ? d.resize(nen) : d.allocate(nen); - for (int i = 0; i < nen; i++) - d[i] = nodeData[i]; + d.resize(nodeData.size()); + // to get the iterator 1 past the end without indexing one past the + // end we get the address to the last element then do ptr arithmetic + // to get one past that. Indexing at nodeData.size() can lead to segfault + // as you are actually accessing that memory. + std::copy(&nodeData[0], (&nodeData[nodeData.size()-1])+1, &d[0]); } }//namespace apf From 5fe40eab5f5a6f31d53ee80413db38212a278823 Mon Sep 17 00:00:00 2001 From: Cameron Smith Date: Thu, 8 Aug 2024 16:28:16 -0400 Subject: [PATCH 02/55] spr: add thesis section to ref --- spr/spr.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spr/spr.tex b/spr/spr.tex index 226cb02b4..ebd0c40c4 100644 --- a/spr/spr.tex +++ b/spr/spr.tex @@ -11,7 +11,7 @@ \section{Overview} An SPR-based error estimation procedure is defined in detail -in Jie Wan's thesis. +in Section 2.2.2 of Jie Wan's RPI thesis. We have reimplemented this system using the latest APF libraries and it supports the Albany adaptive cycle. This document details the inner workings of this estimator. From 3e9f07b85151e80e035ad94b29d3f0d458026ed9 Mon Sep 17 00:00:00 2001 From: Cameron Smith Date: Fri, 23 Aug 2024 20:41:14 -0400 Subject: [PATCH 03/55] silence warning the warning with GCC 12.3.0 loop variable 'm' creates a copy from type 'const std::pair' [-Werror=range-loop-construct] --- mds/mdsCGNS.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mds/mdsCGNS.cc b/mds/mdsCGNS.cc index acdef4aae..4434ba426 100644 --- a/mds/mdsCGNS.cc +++ b/mds/mdsCGNS.cc @@ -177,19 +177,19 @@ struct MeshDataGroup if (components.size() == 1) { std::cout << "Scalar Group has " << components.size() << " related componenets: " << std::endl; - for (const auto m : components) + for (const auto& m : components) std::cout << "Field " << m.second.name << " @ " << m.second.si << " " << m.second.fi << std::endl; } else if (components.size() == 3) { std::cout << "Vector Group has " << components.size() << " related componenets: " << std::endl; - for (const auto m : components) + for (const auto& m : components) std::cout << "Field " << m.second.name << " @ " << m.second.si << " " << m.second.fi << std::endl; } else if (components.size() == 9) { std::cout << "Matrix Group has " << components.size() << " related componenets: " << std::endl; - for (const auto m : components) + for (const auto& m : components) std::cout << "Field " << m.second.name << " @ " << m.second.si << " " << m.second.fi << std::endl; } else From 4aa2326813a9214f2b1c741e0526ba4be2d86fb7 Mon Sep 17 00:00:00 2001 From: Cameron Smith Date: Fri, 23 Aug 2024 22:20:27 -0400 Subject: [PATCH 04/55] cgns: support spack install see #391 --- apf/apfCGNS.cc | 4 ++-- mds/mdsCGNS.cc | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apf/apfCGNS.cc b/apf/apfCGNS.cc index 4debbb58b..445a6e353 100644 --- a/apf/apfCGNS.cc +++ b/apf/apfCGNS.cc @@ -1051,11 +1051,11 @@ void WriteCGNS(const char *prefix, apf::Mesh *m, const apf::CGNSBCMap &cgnsBCMap auto communicator = PCU_Get_Comm(); cgp_mpi_comm(communicator); // - cgp_pio_mode(CGNS_ENUMV(CGP_INDEPENDENT)); + cgp_pio_mode(CGP_INDEPENDENT); CGNS cgns; cgns.fname = std::string(prefix); - if (cgp_open(prefix, CGNS_ENUMV(CG_MODE_WRITE), &cgns.index)) + if (cgp_open(prefix, CG_MODE_WRITE, &cgns.index)) cgp_error_exit(); { diff --git a/mds/mdsCGNS.cc b/mds/mdsCGNS.cc index 4434ba426..1d884cca0 100644 --- a/mds/mdsCGNS.cc +++ b/mds/mdsCGNS.cc @@ -1056,8 +1056,8 @@ apf::Mesh2 *DoIt(gmi_model *g, const std::string &fname, apf::CGNSBCMap &cgnsBCM int cgid = -1; auto comm = PCU_Get_Comm(); cgp_mpi_comm(comm); - cgp_pio_mode(CGNS_ENUMV(CGP_INDEPENDENT)); - cgp_open(fname.c_str(), CGNS_ENUMV(CG_MODE_READ), &cgid); + cgp_pio_mode(CGP_INDEPENDENT); + cgp_open(fname.c_str(), CG_MODE_READ, &cgid); int nbases = -1; cg_nbases(cgid, &nbases); From 9f91f219ccb4ba3234fd9f7c1aaf2deeb36fc4f7 Mon Sep 17 00:00:00 2001 From: Cameron Smith Date: Sat, 24 Aug 2024 11:08:58 -0400 Subject: [PATCH 05/55] replace VLAs when compiling with cgns enabled c++14 is enabled and these were being flagged as warnings which were promotted to errors --- test/convert.cc | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/test/convert.cc b/test/convert.cc index 6813e45b1..ac537ba99 100644 --- a/test/convert.cc +++ b/test/convert.cc @@ -23,6 +23,7 @@ #include #include #include +#include //std::array using namespace std; @@ -246,7 +247,7 @@ void addFathersTag(pGModel simModel, pParMesh sim_mesh, apf::Mesh* simApfMesh, c int nvert=i; PList_delete(listV); - double coordNewPt[nvert][3]; + std::vector> coordNewPt(nvert,{0,0,0}); for(i=0; i< nvert ; i++) { int* markedData; if(!EN_getDataPtr((pEntity)vrts[i],myFather,(void**)&markedData)){ // not sure about marked yet @@ -347,13 +348,13 @@ void addFathersTag(pGModel simModel, pParMesh sim_mesh, apf::Mesh* simApfMesh, c int* vtxData = new int[1]; vtxData[0] = count2D; EN_attachDataPtr((pEntity)vrts[i],myFather,(void*)vtxData); - V_coord(vrts[i],coordNewPt[i]); + V_coord(vrts[i],coordNewPt[i].data()); fprintf ( fcr, "%.15E %.15E %d %d %d %d \n", coordNewPt[i][0],coordNewPt[i][1], vClassDim, foundESTag, foundETag, foundEETag ); } } - double coordFather[nvert][3]; + std::vector> coordFather(nvert,{0,0,0}); int fatherIds[4]; //store the ids of the fathers (vertices) on the root face for(i=0; i< nvert ; i++) { int* fatherIdPtr; @@ -365,7 +366,7 @@ void addFathersTag(pGModel simModel, pParMesh sim_mesh, apf::Mesh* simApfMesh, c } assert(exists); fatherIds[i] = fatherIdPtr[0]; - V_coord(vrts[i],coordFather[i]); + V_coord(vrts[i],coordFather[i].data()); fprintf ( fcn, "%d ", fatherIds[i]); } fprintf ( fcn, "\n"); From 279c82c5c265b15723fb31feb70a2fb31c27989a Mon Sep 17 00:00:00 2001 From: Cameron Smith Date: Sat, 24 Aug 2024 11:42:12 -0400 Subject: [PATCH 06/55] clean under asan sanitizer with gcc 12.3.0 --- test/convert.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test/convert.cc b/test/convert.cc index ac537ba99..d14e533cd 100644 --- a/test/convert.cc +++ b/test/convert.cc @@ -194,6 +194,7 @@ void addFathersTag(pGModel simModel, pParMesh sim_mesh, apf::Mesh* simApfMesh, c int id = GEN_tag(gface); if(id==ExtruRootId) ExtruRootFace=gface; } + GFIter_delete(gfIter); assert(ExtruRootFace != NULL); // all of the work so far assumes translation extrusion. Rotation extrusion (sweeping extruded entiy over an arc of some angle about // a given axis) is useful but this would require some code change. The principle is the same. Every root entity has another @@ -345,7 +346,7 @@ void addFathersTag(pGModel simModel, pParMesh sim_mesh, apf::Mesh* simApfMesh, c } PCU_ALWAYS_ASSERT(foundEETag != 0); count2D++; - int* vtxData = new int[1]; + int* vtxData = new int; vtxData[0] = count2D; EN_attachDataPtr((pEntity)vrts[i],myFather,(void*)vtxData); V_coord(vrts[i],coordNewPt[i].data()); @@ -415,7 +416,7 @@ void addFathersTag(pGModel simModel, pParMesh sim_mesh, apf::Mesh* simApfMesh, c } } my2Dfath=fatherIds[iMin]; - int* vtxData = new int[1]; + int* vtxData = new int; vtxData[0] = my2Dfath; EN_attachDataPtr((pEntity)sonVtx,myFather,(void*)vtxData); } @@ -425,6 +426,7 @@ void addFathersTag(pGModel simModel, pParMesh sim_mesh, apf::Mesh* simApfMesh, c } PList_delete(faces); } //end root face iterator + FIter_delete(fIter); } apf::MeshSIM* cake = reinterpret_cast(simApfMesh); cake->createIntTag("fathers2D", myFather, 1); From 0e5dd3688ebb136c493b33b17e7dbe62ee65174e Mon Sep 17 00:00:00 2001 From: Cameron Smith Date: Sun, 25 Aug 2024 06:40:01 -0400 Subject: [PATCH 07/55] add sim+cgns build --- ...enabled_pr_comment_trigger_self_hosted.yml | 48 ++++++++++++++++--- 1 file changed, 41 insertions(+), 7 deletions(-) diff --git a/.github/workflows/simmetrix_enabled_pr_comment_trigger_self_hosted.yml b/.github/workflows/simmetrix_enabled_pr_comment_trigger_self_hosted.yml index 00a64d3cc..b56d45c04 100644 --- a/.github/workflows/simmetrix_enabled_pr_comment_trigger_self_hosted.yml +++ b/.github/workflows/simmetrix_enabled_pr_comment_trigger_self_hosted.yml @@ -27,8 +27,8 @@ jobs: submodules: recursive path: 'core_${{ github.event.issue.number }}' - - name: build - id: build + - name: build_sim + id: build_sim shell: bash run: | set +e #avoid exiting when lua modules return non-zero on 'warning' messages @@ -41,7 +41,7 @@ jobs: set -e cmake -S core_${{ github.event.issue.number }} \ - -B ${RUNNER_TEMP}/build \ + -B ${RUNNER_TEMP}/buildSim \ -DCMAKE_CXX_COMPILER=mpicxx \ -DCMAKE_C_COMPILER=mpicc \ -DCMAKE_VERBOSE_MAKEFILE=ON \ @@ -55,16 +55,50 @@ jobs: -DIS_TESTING=ON \ -DSCOREC_CXX_WARNINGS=ON \ -DCMAKE_BUILD_TYPE=Release - cmake --build ${RUNNER_TEMP}/build -j 4 - ctest --test-dir ${RUNNER_TEMP}/build --output-on-failure + cmake --build ${RUNNER_TEMP}/buildSim -j 4 + ctest --test-dir ${RUNNER_TEMP}/buildSim --output-on-failure + + - name: build_sim_cgns + id: build_sim_cgns + shell: bash + run: | + set +e #avoid exiting when lua modules return non-zero on 'warning' messages + module use /opt/scorec/spack/rhel9/v0201_4/lmod/linux-rhel9-x86_64/Core/ + module load gcc/12.3.0-iil3lno + module load mpich/4.1.1-xpoyz4t + module load simmetrix-simmodsuite/2024.0-240119dev-7abimo4 + module load zoltan/3.83-hap4ggo + module load cmake/3.26.3-2duxfcd + module load cgns/develop-cc4dfwp + set -e + + cmake -S core_${{ github.event.issue.number }} \ + -B ${RUNNER_TEMP}/buildSimCgns\ + -DCMAKE_CXX_COMPILER=mpicxx \ + -DCMAKE_C_COMPILER=mpicc \ + -DCMAKE_VERBOSE_MAKEFILE=ON \ + -DENABLE_ZOLTAN=ON \ + -DENABLE_SIMMETRIX=ON \ + -DSIM_MPI=mpich4.1.1 \ + -DSIM_PARASOLID=ON \ + -DENABLE_CGNS=on \ + -DSIM_ACIS=ON \ + -DSKIP_SIMMETRIX_VERSION_CHECK=ON \ + -DMESHES=${{github.workspace}}/core_${{ github.event.issue.number }}/pumi-meshes \ + -DIS_TESTING=ON \ + -DSCOREC_CXX_WARNINGS=ON \ + -DCMAKE_BUILD_TYPE=Release + cmake --build ${RUNNER_TEMP}/buildSimCgns -j 4 + ctest --test-dir ${RUNNER_TEMP}/buildSimCgns --output-on-failure - name: Save Result Link if: ${{ !cancelled() }} #prepare report unless the job was cancelled run: | mkdir -p ./pr echo "${{ github.event.issue.number }}" > ./pr/issueNumber - echo -n "Test Result: ${{ steps.build.outcome }} " > ./pr/message - echo "[(details)](https://github.com/${{github.repository}}/actions/runs/${{ github.run_id }})" >> ./pr/message + echo "[Build Log](https://github.com/${{github.repository}}/actions/runs/${{ github.run_id }})" >> ./pr/message + echo "Simmetrix Test Result: ${{ steps.build_sim.outcome }} " > ./pr/message + echo "Simmetrix + CGNS Test Result: ${{ steps.build_sim_cgns.outcome }} " > ./pr/message - name: Upload result if: ${{ !cancelled() }} #upload unless the job was cancelled From 3d3a6ef59429a656053c7800cfd73a2e2c6a44f4 Mon Sep 17 00:00:00 2001 From: Cameron Smith Date: Sun, 25 Aug 2024 06:40:43 -0400 Subject: [PATCH 08/55] formatting --- ...ix_enabled_pr_comment_trigger_self_hosted.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/simmetrix_enabled_pr_comment_trigger_self_hosted.yml b/.github/workflows/simmetrix_enabled_pr_comment_trigger_self_hosted.yml index b56d45c04..c6d52886e 100644 --- a/.github/workflows/simmetrix_enabled_pr_comment_trigger_self_hosted.yml +++ b/.github/workflows/simmetrix_enabled_pr_comment_trigger_self_hosted.yml @@ -2,7 +2,7 @@ name: simmetrx_enabled_pr_comment_trigger_self_hosted # Controls when the workflow will run on: - issue_comment: + issue_comment: types: [created] # Allows you to run this workflow manually from the Actions tab @@ -26,20 +26,20 @@ jobs: ref: refs/pull/${{ github.event.issue.number }}/head submodules: recursive path: 'core_${{ github.event.issue.number }}' - + - name: build_sim id: build_sim shell: bash run: | set +e #avoid exiting when lua modules return non-zero on 'warning' messages module use /opt/scorec/spack/rhel9/v0201_4/lmod/linux-rhel9-x86_64/Core/ - module load gcc/12.3.0-iil3lno + module load gcc/12.3.0-iil3lno module load mpich/4.1.1-xpoyz4t module load simmetrix-simmodsuite/2024.0-240119dev-7abimo4 module load zoltan/3.83-hap4ggo module load cmake/3.26.3-2duxfcd set -e - + cmake -S core_${{ github.event.issue.number }} \ -B ${RUNNER_TEMP}/buildSim \ -DCMAKE_CXX_COMPILER=mpicxx \ @@ -54,7 +54,7 @@ jobs: -DMESHES=${{github.workspace}}/core_${{ github.event.issue.number }}/pumi-meshes \ -DIS_TESTING=ON \ -DSCOREC_CXX_WARNINGS=ON \ - -DCMAKE_BUILD_TYPE=Release + -DCMAKE_BUILD_TYPE=Release cmake --build ${RUNNER_TEMP}/buildSim -j 4 ctest --test-dir ${RUNNER_TEMP}/buildSim --output-on-failure @@ -64,14 +64,14 @@ jobs: run: | set +e #avoid exiting when lua modules return non-zero on 'warning' messages module use /opt/scorec/spack/rhel9/v0201_4/lmod/linux-rhel9-x86_64/Core/ - module load gcc/12.3.0-iil3lno + module load gcc/12.3.0-iil3lno module load mpich/4.1.1-xpoyz4t module load simmetrix-simmodsuite/2024.0-240119dev-7abimo4 module load zoltan/3.83-hap4ggo module load cmake/3.26.3-2duxfcd module load cgns/develop-cc4dfwp set -e - + cmake -S core_${{ github.event.issue.number }} \ -B ${RUNNER_TEMP}/buildSimCgns\ -DCMAKE_CXX_COMPILER=mpicxx \ @@ -87,7 +87,7 @@ jobs: -DMESHES=${{github.workspace}}/core_${{ github.event.issue.number }}/pumi-meshes \ -DIS_TESTING=ON \ -DSCOREC_CXX_WARNINGS=ON \ - -DCMAKE_BUILD_TYPE=Release + -DCMAKE_BUILD_TYPE=Release cmake --build ${RUNNER_TEMP}/buildSimCgns -j 4 ctest --test-dir ${RUNNER_TEMP}/buildSimCgns --output-on-failure From 6e9ee8da90af2c32113b4f136a01469712490a56 Mon Sep 17 00:00:00 2001 From: Cameron Smith Date: Sun, 25 Aug 2024 06:59:47 -0400 Subject: [PATCH 09/55] move nightly test+merge to rhel9 --- cdash/nightly.cmake | 14 ++++++++++++-- cdash/nightly.sh | 15 +++++++-------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/cdash/nightly.cmake b/cdash/nightly.cmake index 596d3f5d5..342947d0c 100644 --- a/cdash/nightly.cmake +++ b/cdash/nightly.cmake @@ -5,7 +5,7 @@ SET(CTEST_TEST_TYPE Nightly) set(CTEST_BUILD_CONFIGURATION RelWithDebInfo) set(CTEST_NIGHTLY_START_TIME "17:00:00 EST") -set(CTEST_SITE "cranium.scorec.rpi.edu" ) +set(CTEST_SITE "checkers.scorec.rpi.edu" ) set(CTEST_DROP_METHOD "http") set(CTEST_DROP_SITE "my.cdash.org") set(CTEST_DROP_LOCATION "/submit.php?project=SCOREC") @@ -123,6 +123,11 @@ function(check_current_branch BRANCH_NAME CONFIG_OPTS ERRVAR) file(MAKE_DIRECTORY "${CTEST_BINARY_DIRECTORY}/${BRANCH_NAME}") + execute_process(COMMAND df -h /tmp OUTPUT_VARIABLE outVar) + message(STATUS "df result {\n${outVar}}") + execute_process(COMMAND pwd OUTPUT_VARIABLE outVar) + message(STATUS "pwd result output {\n${outVar}}") + ctest_configure( BUILD "${CTEST_BINARY_DIRECTORY}/${BRANCH_NAME}" SOURCE "${CTEST_SOURCE_DIRECTORY}/${CTEST_PROJECT_NAME}" @@ -134,6 +139,11 @@ function(check_current_branch BRANCH_NAME CONFIG_OPTS message("${BRANCH_NAME} config passed") endif() + execute_process(COMMAND df -h /tmp OUTPUT_VARIABLE outVar) + message(STATUS "df result {\n${outVar}}") + execute_process(COMMAND pwd OUTPUT_VARIABLE outVar) + message(STATUS "pwd result output {\n${outVar}}") + ctest_build( BUILD "${CTEST_BINARY_DIRECTORY}/${BRANCH_NAME}" NUMBER_ERRORS NUM_BUILD_ERRORS @@ -313,7 +323,7 @@ SET(CONFIGURE_OPTIONS-sim "${CONFIGURE_OPTIONS}" "-DENABLE_SIMMETRIX:BOOL=ON" "-DSIM_PARASOLID:BOOL=ON" - "-DSIM_MPI:STRING=mpich3.3.2" + "-DSIM_MPI:STRING=mpich4.1.1" ) setup_repo() diff --git a/cdash/nightly.sh b/cdash/nightly.sh index cf4c37b9b..302d2aea5 100755 --- a/cdash/nightly.sh +++ b/cdash/nightly.sh @@ -8,14 +8,13 @@ export PATH=/usr/share/lmod/lmod/libexec:$PATH #setup spack modules unset MODULEPATH -module unuse /opt/scorec/spack/lmod/linux-rhel7-x86_64/Core -module use /opt/scorec/modules -module use /opt/scorec/spack/v0154_2/lmod/linux-rhel7-x86_64/Core -module load gcc/10.1.0 -module load mpich/3.3.2 -module load simmetrix-simmodsuite/17.0-220516 -module load zoltan/3.83-int32 -module load cmake/3.20.0 +module use /opt/scorec/spack/rhel9/v0201_4/lmod/linux-rhel9-x86_64/Core/ +module load gcc/12.3.0-iil3lno +module load mpich/4.1.1-xpoyz4t +module load simmetrix-simmodsuite/2024.0-240119dev-7abimo4 +module load zoltan/3.83-hap4ggo +module load cmake/3.26.3-2duxfcd +module load cgns/develop-cc4dfwp #cdash output root d=/lore/cwsmith/nightlyBuilds/ From 399ac8f30770ef514c8ace22c7ccc17ee2ef16ab Mon Sep 17 00:00:00 2001 From: Cameron Smith Date: Sun, 25 Aug 2024 07:01:47 -0400 Subject: [PATCH 10/55] user name change --- cdash/nightly.cmake | 2 +- cdash/nightly.sh | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cdash/nightly.cmake b/cdash/nightly.cmake index 342947d0c..8ad7b72d6 100644 --- a/cdash/nightly.cmake +++ b/cdash/nightly.cmake @@ -12,7 +12,7 @@ set(CTEST_DROP_LOCATION "/submit.php?project=SCOREC") set(CTEST_DROP_SITE_CDASH TRUE) set(CTEST_BUILD_NAME "linux-gcc-${CTEST_BUILD_CONFIGURATION}") -set(CTEST_DASHBOARD_ROOT "/lore/cwsmith/nightlyBuilds/" ) +set(CTEST_DASHBOARD_ROOT "/lore/smithc11/nightlyBuilds/" ) set(CTEST_CMAKE_GENERATOR "Unix Makefiles") set(CTEST_BUILD_FLAGS -j4) diff --git a/cdash/nightly.sh b/cdash/nightly.sh index 302d2aea5..e7da2bccc 100755 --- a/cdash/nightly.sh +++ b/cdash/nightly.sh @@ -1,6 +1,6 @@ #!/bin/bash -x source /etc/profile -source /users/cwsmith/.bash_profile +source /users/smithc11/.bash_profile #setup lmod export PATH=/usr/share/lmod/lmod/libexec:$PATH @@ -17,7 +17,7 @@ module load cmake/3.26.3-2duxfcd module load cgns/develop-cc4dfwp #cdash output root -d=/lore/cwsmith/nightlyBuilds/ +d=/lore/smithc11/nightlyBuilds/ cd $d #remove compilation directories created by previous nightly.cmake runs [ -d build ] && rm -rf build/ From 07122b11ef9c35417f5048ce2b382d549871ee81 Mon Sep 17 00:00:00 2001 From: Cameron Smith Date: Tue, 27 Aug 2024 22:57:04 -0400 Subject: [PATCH 11/55] add approved self-hosted user --- .../simmetrix_enabled_pr_comment_trigger_self_hosted.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/simmetrix_enabled_pr_comment_trigger_self_hosted.yml b/.github/workflows/simmetrix_enabled_pr_comment_trigger_self_hosted.yml index c6d52886e..f8755a0bf 100644 --- a/.github/workflows/simmetrix_enabled_pr_comment_trigger_self_hosted.yml +++ b/.github/workflows/simmetrix_enabled_pr_comment_trigger_self_hosted.yml @@ -18,7 +18,8 @@ jobs: if: | github.event.issue.pull_request && contains(github.event.comment.body, '/runtests') && - (github.event.comment.user.login == 'cwsmith') + ((github.event.comment.user.login == 'cwsmith') || + (github.event.comment.user.login == 'jacobmerson' ) steps: # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - uses: actions/checkout@v4 From 8f0ba68a772f7ce3e0a301587acbb549d69775f5 Mon Sep 17 00:00:00 2001 From: Cameron Smith Date: Wed, 28 Aug 2024 13:21:09 -0400 Subject: [PATCH 12/55] missed a paren --- .../simmetrix_enabled_pr_comment_trigger_self_hosted.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/simmetrix_enabled_pr_comment_trigger_self_hosted.yml b/.github/workflows/simmetrix_enabled_pr_comment_trigger_self_hosted.yml index f8755a0bf..2602d944a 100644 --- a/.github/workflows/simmetrix_enabled_pr_comment_trigger_self_hosted.yml +++ b/.github/workflows/simmetrix_enabled_pr_comment_trigger_self_hosted.yml @@ -19,7 +19,7 @@ jobs: github.event.issue.pull_request && contains(github.event.comment.body, '/runtests') && ((github.event.comment.user.login == 'cwsmith') || - (github.event.comment.user.login == 'jacobmerson' ) + (github.event.comment.user.login == 'jacobmerson')) steps: # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - uses: actions/checkout@v4 From b07cc4ed527822afc54e93384fc4a482b1db0374 Mon Sep 17 00:00:00 2001 From: Cameron Smith Date: Wed, 28 Aug 2024 13:45:15 -0400 Subject: [PATCH 13/55] need module command --- .../simmetrix_enabled_pr_comment_trigger_self_hosted.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/simmetrix_enabled_pr_comment_trigger_self_hosted.yml b/.github/workflows/simmetrix_enabled_pr_comment_trigger_self_hosted.yml index 2602d944a..2a7e79245 100644 --- a/.github/workflows/simmetrix_enabled_pr_comment_trigger_self_hosted.yml +++ b/.github/workflows/simmetrix_enabled_pr_comment_trigger_self_hosted.yml @@ -33,6 +33,7 @@ jobs: shell: bash run: | set +e #avoid exiting when lua modules return non-zero on 'warning' messages + source /etc/profile #provides module command module use /opt/scorec/spack/rhel9/v0201_4/lmod/linux-rhel9-x86_64/Core/ module load gcc/12.3.0-iil3lno module load mpich/4.1.1-xpoyz4t From f038fcf060752c52034d451e958cd128899d64bd Mon Sep 17 00:00:00 2001 From: Cameron Smith Date: Wed, 28 Aug 2024 14:02:26 -0400 Subject: [PATCH 14/55] missed the other env --- .../simmetrix_enabled_pr_comment_trigger_self_hosted.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/simmetrix_enabled_pr_comment_trigger_self_hosted.yml b/.github/workflows/simmetrix_enabled_pr_comment_trigger_self_hosted.yml index 2a7e79245..7916bd8b3 100644 --- a/.github/workflows/simmetrix_enabled_pr_comment_trigger_self_hosted.yml +++ b/.github/workflows/simmetrix_enabled_pr_comment_trigger_self_hosted.yml @@ -65,6 +65,7 @@ jobs: shell: bash run: | set +e #avoid exiting when lua modules return non-zero on 'warning' messages + source /etc/profile #provides module command module use /opt/scorec/spack/rhel9/v0201_4/lmod/linux-rhel9-x86_64/Core/ module load gcc/12.3.0-iil3lno module load mpich/4.1.1-xpoyz4t From 2c3f073ad9c4473c129cf15843d432880f9ffe08 Mon Sep 17 00:00:00 2001 From: Cameron Smith Date: Wed, 28 Aug 2024 16:43:36 -0400 Subject: [PATCH 15/55] append to log file --- .../simmetrix_enabled_pr_comment_trigger_self_hosted.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/simmetrix_enabled_pr_comment_trigger_self_hosted.yml b/.github/workflows/simmetrix_enabled_pr_comment_trigger_self_hosted.yml index 7916bd8b3..58f780b9c 100644 --- a/.github/workflows/simmetrix_enabled_pr_comment_trigger_self_hosted.yml +++ b/.github/workflows/simmetrix_enabled_pr_comment_trigger_self_hosted.yml @@ -100,8 +100,8 @@ jobs: mkdir -p ./pr echo "${{ github.event.issue.number }}" > ./pr/issueNumber echo "[Build Log](https://github.com/${{github.repository}}/actions/runs/${{ github.run_id }})" >> ./pr/message - echo "Simmetrix Test Result: ${{ steps.build_sim.outcome }} " > ./pr/message - echo "Simmetrix + CGNS Test Result: ${{ steps.build_sim_cgns.outcome }} " > ./pr/message + echo "Simmetrix Test Result: ${{ steps.build_sim.outcome }} " >> ./pr/message + echo "Simmetrix + CGNS Test Result: ${{ steps.build_sim_cgns.outcome }} " >> ./pr/message - name: Upload result if: ${{ !cancelled() }} #upload unless the job was cancelled From 1106f01ac5ebad00a39ed269a7aac9f2fd10ae29 Mon Sep 17 00:00:00 2001 From: Aiden Woodruff Date: Thu, 29 Aug 2024 09:37:44 -0400 Subject: [PATCH 16/55] Implement capstone gmi functions implement gmi_closest_point implement gmi_is_point_in_region implement gmi_is_in_closure_of Signed-off-by: Aiden Woodruff --- gmi_cap/CMakeLists.txt | 2 +- gmi_cap/gmi_cap.cc | 38 ++++++++++++++++++++++++++++++++------ 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/gmi_cap/CMakeLists.txt b/gmi_cap/CMakeLists.txt index 1ab03efda..5e2cb3ea2 100644 --- a/gmi_cap/CMakeLists.txt +++ b/gmi_cap/CMakeLists.txt @@ -13,7 +13,7 @@ set(HEADERS gmi_cap.h) add_library(gmi_cap ${SOURCES}) -target_link_libraries(gmi_cap PUBLIC gmi pcu capstone_module framework_testing) +target_link_libraries(gmi_cap PUBLIC gmi pcu lion capstone_module framework_testing) # Include directories target_include_directories(gmi_cap PUBLIC diff --git a/gmi_cap/gmi_cap.cc b/gmi_cap/gmi_cap.cc index 851c331ea..e6b258346 100644 --- a/gmi_cap/gmi_cap.cc +++ b/gmi_cap/gmi_cap.cc @@ -13,6 +13,7 @@ #include #include #include +#include gmi_ent* toGmiEntity(M_GTopo topo) @@ -219,7 +220,15 @@ static void closest_point(struct gmi_model* m, struct gmi_ent* e, (void)e; (void)to; (void)to_p; - printf("_closest_point_ not implemented!\n"); + cap_model* cm = reinterpret_cast(m); + M_GTopo topo = fromGmiEntity(e); + vec3d xyz_in, xyz_out, param_out; + xyz_in[0] = from[0]; xyz_in[1] = from[1]; xyz_in[2] = from[2]; + lion_eprint(1, "gmi_cap: FIXME: no seedparam!\n"); + MG_API_CALL(cm->geomInterface, get_closest_point_param(topo, xyz_in, nullptr, + xyz_out, param_out)); + to[0] = xyz_out[0]; to[1] = xyz_out[1]; to[2] = xyz_out[2]; + to_p[0] = param_out[0]; to_p[1] = param_out[1]; } static void normal(struct gmi_model* m, struct gmi_ent* e, @@ -254,10 +263,14 @@ static void first_derivative(struct gmi_model* m, struct gmi_ent* e, static int is_point_in_region(struct gmi_model* m, struct gmi_ent* e, double point[3]) { - (void)m; - (void)e; - (void)point; - printf("_is_point_in_region_ not implemented!\n"); + cap_model* cm = (cap_model*) m; + std::vector topos; + MG_API_CALL(cm->geomInterface, find_point_containment(vec3d(point), + Geometry::REGION, topos, 0.0)); + M_GTopo gtopo = fromGmiEntity(e); + for (size_t i = 0; i < topos.size(); ++i) { + if (topos[i] == gtopo) return 1; + } return 0; } @@ -267,7 +280,20 @@ static int is_in_closure_of(struct gmi_model* m, struct gmi_ent* e, (void)m; (void)e; (void)et; - printf("_is_in_closure_of_ not implemented!\n"); + if (get_dim(m, e) < get_dim(m, et)) { + cap_model* cm = (cap_model*)m; + M_GTopo ce = fromGmiEntity(e); + M_GTopo cet = fromGmiEntity(et); + GeometryTopo ce_type; + MG_API_CALL(cm->geomInterface, get_topo_type(ce, ce_type)); + std::vector adj; + MG_API_CALL(cm->geomInterface, get_adjacency(cet, ce_type, adj)); + for (size_t i = 0; i < adj.size(); ++i) { + if (ce == adj[i]) { + return 1; + } + } + } return 0; } From c5ab193d40092b78f65f37b0587b467880cc9fbd Mon Sep 17 00:00:00 2001 From: Cameron Smith Date: Fri, 30 Aug 2024 11:22:19 -0400 Subject: [PATCH 17/55] heredoc for multiline message --- ...immetrix_enabled_pr_comment_trigger_self_hosted.yml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/.github/workflows/simmetrix_enabled_pr_comment_trigger_self_hosted.yml b/.github/workflows/simmetrix_enabled_pr_comment_trigger_self_hosted.yml index 58f780b9c..7a0883fc4 100644 --- a/.github/workflows/simmetrix_enabled_pr_comment_trigger_self_hosted.yml +++ b/.github/workflows/simmetrix_enabled_pr_comment_trigger_self_hosted.yml @@ -99,9 +99,13 @@ jobs: run: | mkdir -p ./pr echo "${{ github.event.issue.number }}" > ./pr/issueNumber - echo "[Build Log](https://github.com/${{github.repository}}/actions/runs/${{ github.run_id }})" >> ./pr/message - echo "Simmetrix Test Result: ${{ steps.build_sim.outcome }} " >> ./pr/message - echo "Simmetrix + CGNS Test Result: ${{ steps.build_sim_cgns.outcome }} " >> ./pr/message + message=$(cat << HEREDOC + [Build Log](https://github.com/${{github.repository}}/actions/runs/${{github.run_id}}) + Simmetrix Test Result: ${{steps.build_sim.outcome}} + Simmetrix + CGNS Test Result: ${{steps.build_sim_cgns.outcome}} + HEREDOC + ) + echo "$message" > ./pr/message - name: Upload result if: ${{ !cancelled() }} #upload unless the job was cancelled From f079f68ececc4286ca58e9ebacdbfd7a3ab03370 Mon Sep 17 00:00:00 2001 From: Cameron Smith Date: Fri, 6 Sep 2024 16:10:14 -0400 Subject: [PATCH 18/55] complete user cmake example --- doc/{user_CMakeLists.cmake => CMakeLists.txt} | 5 +++-- doc/mylibrary.cpp | 9 +++++++++ doc/mylibrary.h | 4 ++++ doc/myprogram.cpp | 10 ++++++++++ 4 files changed, 26 insertions(+), 2 deletions(-) rename doc/{user_CMakeLists.cmake => CMakeLists.txt} (90%) create mode 100644 doc/mylibrary.cpp create mode 100644 doc/mylibrary.h create mode 100644 doc/myprogram.cpp diff --git a/doc/user_CMakeLists.cmake b/doc/CMakeLists.txt similarity index 90% rename from doc/user_CMakeLists.cmake rename to doc/CMakeLists.txt index a83281340..c218c4632 100644 --- a/doc/user_CMakeLists.cmake +++ b/doc/CMakeLists.txt @@ -31,8 +31,9 @@ else() endif() #this is just example code, do your own thing -add_executable(mylibrary mylibrary.cpp) +add_library(mylibrary mylibrary.cpp) add_executable(myprogram myprogram.cpp) +target_include_directories(myprogram PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) #for any targets that use PUMI, just use this command #to it to include the right directories and link to all @@ -40,4 +41,4 @@ add_executable(myprogram myprogram.cpp) #we recommend PUBLIC if the target is a library and #PRIVATE if the target is an executable target_link_libraries(mylibrary PUBLIC SCOREC::core) -target_link_libraries(myprogram PRIVATE SCOREC::core) +target_link_libraries(myprogram PRIVATE mylibrary) diff --git a/doc/mylibrary.cpp b/doc/mylibrary.cpp new file mode 100644 index 000000000..e20dbf63a --- /dev/null +++ b/doc/mylibrary.cpp @@ -0,0 +1,9 @@ +#include +#include +#include +#include +void makeMesh() { + gmi_register_mesh(); + apf::Mesh2* m = apf::makeMdsBox(1,1,1,1,1,1,0); + apf::destroyMesh(m); +} diff --git a/doc/mylibrary.h b/doc/mylibrary.h new file mode 100644 index 000000000..655125a61 --- /dev/null +++ b/doc/mylibrary.h @@ -0,0 +1,4 @@ +#ifndef MYLIBRARY_H +#define MYLIBRARH_H +void makeMesh(); +#endif diff --git a/doc/myprogram.cpp b/doc/myprogram.cpp new file mode 100644 index 000000000..1049a50b3 --- /dev/null +++ b/doc/myprogram.cpp @@ -0,0 +1,10 @@ +#include +#include "mylibrary.h" +int main(int argc, char** argv) { + MPI_Init(&argc,&argv); + PCU_Comm_Init(); + makeMesh(); + PCU_Comm_Free(); + MPI_Finalize(); + return 0; +} From dc3ff3cde0be75e64539a3d4241a770e8059292e Mon Sep 17 00:00:00 2001 From: Cameron Smith Date: Fri, 6 Sep 2024 16:19:52 -0400 Subject: [PATCH 19/55] install and build user project --- .github/workflows/cmake.yml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index 39ed4a701..a00e7a727 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -36,7 +36,7 @@ jobs: env: MPICH_CXX: ${{matrix.compiler.CXX}} MPICH_CC: ${{matrix.compiler.CC}} - run: cmake --build ${{github.workspace}}/build --config ${{matrix.build_type}} -j + run: cmake --build ${{github.workspace}}/build --config ${{matrix.build_type}} -j --target install - name: Test env: @@ -44,3 +44,13 @@ jobs: MPICH_CC: ${{matrix.compiler.CC}} working-directory: ${{github.workspace}}/build run: ctest --output-on-failure -C ${{matrix.build_type}} + + - name: Build User Project + # only need to test with a single build config if the installed cmake config files work + if: ${{ matrix.compiler == 'GNU' }} && ${{ matrix.build_type == 'Release' }} + env: + MPICH_CXX: ${{matrix.compiler.CXX}} + MPICH_CC: ${{matrix.compiler.CC}} + run: | + cmake -S ${{github.workspace}}/doc -B ${{github.workspace}}/buildExample -DCMAKE_CXX_COMPILER=mpicxx -DSCOREC_PREFIX=${{github.workspace}}/build/install + cmake --build ${{github.workspace}}/buildExample From 3cb981e7aad9193fb3f1db7de4092980d19aa84d Mon Sep 17 00:00:00 2001 From: Cameron Smith Date: Fri, 6 Sep 2024 16:25:43 -0400 Subject: [PATCH 20/55] set install path --- .github/workflows/cmake.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index a00e7a727..075a07d89 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -30,7 +30,7 @@ jobs: env: MPICH_CXX: ${{matrix.compiler.CXX}} MPICH_CC: ${{matrix.compiler.CC}} - run: cmake -S ${{github.workspace}} -B ${{github.workspace}}/build -DCMAKE_CXX_COMPILER=mpicxx -DCMAKE_C_COMPILER=mpicc -DCMAKE_VERBOSE_MAKEFILE=ON -DMESHES=${{github.workspace}}/pumi-meshes -DIS_TESTING=ON -DSCOREC_CXX_WARNINGS=ON -DCMAKE_BUILD_TYPE=${{matrix.build_type}} + run: cmake -S ${{github.workspace}} -B ${{github.workspace}}/build -DCMAKE_CXX_COMPILER=mpicxx -DCMAKE_C_COMPILER=mpicc -DCMAKE_VERBOSE_MAKEFILE=ON -DMESHES=${{github.workspace}}/pumi-meshes -DIS_TESTING=ON -DSCOREC_CXX_WARNINGS=ON -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DCMAKE_INSTALL_PREFIX=${{github.workspace}}/build/install - name: Build env: From 19e9453e35ea8dd6be2d68adaa4be7232d8afe23 Mon Sep 17 00:00:00 2001 From: Cameron Smith Date: Fri, 6 Sep 2024 16:30:18 -0400 Subject: [PATCH 21/55] fix typo --- doc/mylibrary.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/mylibrary.h b/doc/mylibrary.h index 655125a61..2777caadb 100644 --- a/doc/mylibrary.h +++ b/doc/mylibrary.h @@ -1,4 +1,4 @@ #ifndef MYLIBRARY_H -#define MYLIBRARH_H +#define MYLIBRARY_H void makeMesh(); #endif From 10de84359268f20fb8014c679a267faab5e49f57 Mon Sep 17 00:00:00 2001 From: Cameron Smith Date: Fri, 6 Sep 2024 16:41:14 -0400 Subject: [PATCH 22/55] fix ci conditional --- .github/workflows/cmake.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index 075a07d89..68116e6f0 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -47,7 +47,7 @@ jobs: - name: Build User Project # only need to test with a single build config if the installed cmake config files work - if: ${{ matrix.compiler == 'GNU' }} && ${{ matrix.build_type == 'Release' }} + if: ${{ matrix.compiler == 'GNU' && matrix.build_type == 'Release' }} env: MPICH_CXX: ${{matrix.compiler.CXX}} MPICH_CC: ${{matrix.compiler.CC}} From 60c94ce9860db5c9f9d58e0b907f6b78a9afb569 Mon Sep 17 00:00:00 2001 From: Cameron Smith Date: Fri, 6 Sep 2024 21:36:33 -0400 Subject: [PATCH 23/55] compiler comparison attempt --- .github/workflows/cmake.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index 68116e6f0..8b4fe2a60 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -12,8 +12,8 @@ jobs: fail-fast: false matrix: compiler: - - { compiler: GNU, CC: gcc-10, CXX: g++-10 } - - { compiler: LLVM, CC: clang, CXX: clang++ } + - { compiler: "GNU", CC: gcc-10, CXX: g++-10 } + - { compiler: "LLVM", CC: clang, CXX: clang++ } build_type: [Debug, Release] steps: @@ -47,7 +47,7 @@ jobs: - name: Build User Project # only need to test with a single build config if the installed cmake config files work - if: ${{ matrix.compiler == 'GNU' && matrix.build_type == 'Release' }} + if: matrix.compiler == 'GNU' # && matrix.build_type == 'Release' #the compiler comparison is wrong env: MPICH_CXX: ${{matrix.compiler.CXX}} MPICH_CC: ${{matrix.compiler.CC}} From f3e9bd31c38a4493cb4eaa293412e3df6ec12bac Mon Sep 17 00:00:00 2001 From: Cameron Smith Date: Fri, 6 Sep 2024 21:51:55 -0400 Subject: [PATCH 24/55] update checkout actions --- .github/workflows/cmake.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index 8b4fe2a60..306d356b0 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -17,7 +17,7 @@ jobs: build_type: [Debug, Release] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 with: submodules: recursive From 88a39f6c4db82e82595c47cfc7fdfb56cbf3fec0 Mon Sep 17 00:00:00 2001 From: Cameron Smith Date: Fri, 6 Sep 2024 21:56:16 -0400 Subject: [PATCH 25/55] name is a field of the compiler entry --- .github/workflows/cmake.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index 306d356b0..445d9905e 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -12,8 +12,8 @@ jobs: fail-fast: false matrix: compiler: - - { compiler: "GNU", CC: gcc-10, CXX: g++-10 } - - { compiler: "LLVM", CC: clang, CXX: clang++ } + - { name: GNU, CC: gcc-10, CXX: g++-10 } + - { name: LLVM, CC: clang, CXX: clang++ } build_type: [Debug, Release] steps: @@ -47,7 +47,7 @@ jobs: - name: Build User Project # only need to test with a single build config if the installed cmake config files work - if: matrix.compiler == 'GNU' # && matrix.build_type == 'Release' #the compiler comparison is wrong + if: matrix.compiler.name == 'GNU' && matrix.build_type == 'Release' env: MPICH_CXX: ${{matrix.compiler.CXX}} MPICH_CC: ${{matrix.compiler.CC}} From a1f08e5da1c120c8d7fff8c02af3c9e582ab8d2b Mon Sep 17 00:00:00 2001 From: Aiden Woodruff Date: Thu, 29 Aug 2024 10:23:13 -0400 Subject: [PATCH 26/55] Set bob install dir to CMAKE_LIBDIR - Fixes issues on 64bit systems when LIBDIR=lib64. CMake would relink to $ORIGIN:$ORIGIN/../lib64 and all the libs would be in lib. Signed-off-by: Aiden Woodruff --- cmake/bob.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/bob.cmake b/cmake/bob.cmake index 52c312666..eae99e9fb 100644 --- a/cmake/bob.cmake +++ b/cmake/bob.cmake @@ -156,8 +156,8 @@ endmacro(bob_public_dep) function(bob_export_target tgt_name) install(TARGETS ${tgt_name} EXPORT ${tgt_name}-target RUNTIME DESTINATION bin - ARCHIVE DESTINATION lib - LIBRARY DESTINATION lib) + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) install(EXPORT ${tgt_name}-target NAMESPACE ${PROJECT_NAME}:: DESTINATION lib/cmake/${PROJECT_NAME}) set(${PROJECT_NAME}_EXPORTED_TARGETS From 7cc2e23864cb1dc95ede55502ce7a79414db4c39 Mon Sep 17 00:00:00 2001 From: Aiden Woodruff Date: Fri, 6 Sep 2024 11:18:17 -0400 Subject: [PATCH 27/55] Replace other lib with LIBDIR and bin with BINDIR - Update CMake exported target install dir to CMAKE_INSTALL_LIBDIR. - Update executable destination to CMAKE_INSTALL_BINDIR. - Add quotes to directory names in case of spaces. Signed-off-by: Aiden Woodruff --- cmake/bob.cmake | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/cmake/bob.cmake b/cmake/bob.cmake index eae99e9fb..72c192a7f 100644 --- a/cmake/bob.cmake +++ b/cmake/bob.cmake @@ -155,11 +155,11 @@ endmacro(bob_public_dep) function(bob_export_target tgt_name) install(TARGETS ${tgt_name} EXPORT ${tgt_name}-target - RUNTIME DESTINATION bin - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}") install(EXPORT ${tgt_name}-target NAMESPACE ${PROJECT_NAME}:: - DESTINATION lib/cmake/${PROJECT_NAME}) + DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}") set(${PROJECT_NAME}_EXPORTED_TARGETS ${${PROJECT_NAME}_EXPORTED_TARGETS} ${tgt_name} PARENT_SCOPE) endfunction(bob_export_target) @@ -174,7 +174,7 @@ endmacro(bob_end_subdir) function(bob_end_package) include(CMakePackageConfigHelpers) set(INCLUDE_INSTALL_DIR include) - set(LIB_INSTALL_DIR lib) + set(LIB_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}") set(CONFIG_CONTENT " set(${PROJECT_NAME}_VERSION ${${PROJECT_NAME}_VERSION}) include(CMakeFindDependencyMacro) @@ -213,7 +213,7 @@ set(${PROJECT_NAME}_CXX_FLAGS \"${CMAKE_CXX_FLAGS}\") ") install(FILES "${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" - DESTINATION lib/cmake/${PROJECT_NAME}) + DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}") if(PROJECT_VERSION) file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake @@ -224,6 +224,6 @@ set(${PROJECT_NAME}_CXX_FLAGS \"${CMAKE_CXX_FLAGS}\") COMPATIBILITY SameMajorVersion) install(FILES "${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake" - DESTINATION lib/cmake/${PROJECT_NAME}) + DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}") endif() endfunction(bob_end_package) From 7df25b303aa8ad9ff09f2cec85d85040816047ad Mon Sep 17 00:00:00 2001 From: Aiden Woodruff Date: Fri, 6 Sep 2024 11:30:13 -0400 Subject: [PATCH 28/55] Replace include with CMAKE_INSTALL_INCLUDEDIR Signed-off-by: Aiden Woodruff --- cmake/bob.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/bob.cmake b/cmake/bob.cmake index 72c192a7f..4cbd4f84c 100644 --- a/cmake/bob.cmake +++ b/cmake/bob.cmake @@ -173,7 +173,7 @@ endmacro(bob_end_subdir) function(bob_end_package) include(CMakePackageConfigHelpers) - set(INCLUDE_INSTALL_DIR include) + set(INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_INCLUDEDIR}") set(LIB_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}") set(CONFIG_CONTENT " set(${PROJECT_NAME}_VERSION ${${PROJECT_NAME}_VERSION}) From 02c41e5888e5dee601d1eea4e8dab3d9c4535a87 Mon Sep 17 00:00:00 2001 From: Aditya Joshi Date: Fri, 9 Aug 2024 16:43:14 -0400 Subject: [PATCH 29/55] Fix logic checking periodic model faces --- ma/maSnap.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ma/maSnap.cc b/ma/maSnap.cc index 195dca005..73217e73b 100644 --- a/ma/maSnap.cc +++ b/ma/maSnap.cc @@ -477,8 +477,10 @@ static void interpolateParametricCoordinatesOnRegularFace( { double range[2]; int dim = m->getModelType(g); + bool gface_isPeriodic = 0; for (int d=0; d < dim; ++d) { bool isPeriodic = m->getPeriodicRange(g,d,range); + if ((dim == 2) && (isPeriodic > 0)) gface_isPeriodic = 1; p[d] = interpolateParametricCoordinate(t,a[d],b[d],range,isPeriodic, 0); } @@ -494,6 +496,8 @@ static void interpolateParametricCoordinatesOnRegularFace( // this need to be done for faces, only if (dim != 2) return; + if (!gface_isPeriodic) + return; Vector x; bool ok; From 2e031e00036b4423240b66ef359dd2354ac7e4b7 Mon Sep 17 00:00:00 2001 From: Aditya Joshi Date: Fri, 9 Aug 2024 16:49:23 -0400 Subject: [PATCH 30/55] spell check --- ma/maSnap.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ma/maSnap.cc b/ma/maSnap.cc index 73217e73b..d75426e8d 100644 --- a/ma/maSnap.cc +++ b/ma/maSnap.cc @@ -486,7 +486,7 @@ static void interpolateParametricCoordinatesOnRegularFace( /* check if the new point is inside the model. * otherwise re-run the above loop with last option - * in "interpolateParametricCoordinae" being 1. + * in "interpolateParametricCoordinate" being 1. * Notes * 1) we are assuming manifold surfaces * 2) we only check for faces that are periodic From 289b634cb4b3cceb8b7966ac1129f6ed20249046 Mon Sep 17 00:00:00 2001 From: Aiden Woodruff Date: Tue, 10 Sep 2024 10:48:14 -0400 Subject: [PATCH 31/55] Remove FIXME and replace with comment - We decided that it is ok to use the inefficient get_closest_point_param call without seedparam for general calls. Signed-off-by: Aiden Woodruff --- gmi_cap/gmi_cap.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/gmi_cap/gmi_cap.cc b/gmi_cap/gmi_cap.cc index e6b258346..ce6495460 100644 --- a/gmi_cap/gmi_cap.cc +++ b/gmi_cap/gmi_cap.cc @@ -224,7 +224,9 @@ static void closest_point(struct gmi_model* m, struct gmi_ent* e, M_GTopo topo = fromGmiEntity(e); vec3d xyz_in, xyz_out, param_out; xyz_in[0] = from[0]; xyz_in[1] = from[1]; xyz_in[2] = from[2]; - lion_eprint(1, "gmi_cap: FIXME: no seedparam!\n"); + // Capstone recommends replacing nullptr with `seedparam` -- a known nearby + // parametric point. This interface doesn't have that functionality, but if + // it becomes added, this call should be updated. MG_API_CALL(cm->geomInterface, get_closest_point_param(topo, xyz_in, nullptr, xyz_out, param_out)); to[0] = xyz_out[0]; to[1] = xyz_out[1]; to[2] = xyz_out[2]; From 367396e82c7022e1fed3fd1373c9e70d963865fb Mon Sep 17 00:00:00 2001 From: Aiden Woodruff Date: Fri, 20 Sep 2024 17:46:57 -0400 Subject: [PATCH 32/55] Add apf::smoothCAPAnisoSizes Signed-off-by: Aiden Woodruff --- apf_cap/apfCAP.cc | 78 +++++++++++++++++++++++++++++++++++++++++++++++ apf_cap/apfCAP.h | 25 +++++++++++++++ 2 files changed, 103 insertions(+) diff --git a/apf_cap/apfCAP.cc b/apf_cap/apfCAP.cc index 8e59797e8..8b75d9606 100644 --- a/apf_cap/apfCAP.cc +++ b/apf_cap/apfCAP.cc @@ -5,9 +5,14 @@ #include #include #include +#include #include #include +#include +#ifdef HAVE_CAPSTONE_SIZINGMETRICTOOL +#include +#endif namespace apf { @@ -942,5 +947,78 @@ Mesh2* createMesh(MeshDatabaseInterface* mdb, GeometryDatabaseInterface* gdb) return m; } +bool has_smoothCAPAnisoSizes(void) noexcept { +#ifdef HAVE_CAPSTONE_SIZINGMETRICTOOL + return true; +#else + return false; +#endif +} + +bool smoothCAPAnisoSizes(apf::Mesh2* mesh, std::string analysis, + apf::Field* scales, apf::Field* frames) { +#ifdef HAVE_CAPSTONE_SIZINGMETRICTOOL + apf::MeshCAP* m = dynamic_cast(mesh); + if (!m) { + lion_eprint(1, "ERROR: smoothCAPAnisoSizes: mesh is not an apf::MeshCAP*\n"); + return false; + } + std::vector sizing6(m->count(0)); + apf::Matrix3x3 Q; + apf::Vector3 H; + apf::MeshIterator* it = m->begin(0); + for (apf::MeshEntity* e = m->iterate(it); e; e = m->iterate(it)) { + apf::getVector(scales, e, 0, H); + apf::getMatrix(frames, e, 0, Q); + apf::Matrix3x3 L(H[0], 0, 0, 0, H[1], 0, 0, 0, H[2]); + apf::Matrix3x3 t = Q * L * apf::invert(Q); + size_t id; + MG_API_CALL(m->getMesh(), get_id(fromEntity(e), id)); + PCU_DEBUG_ASSERT(id != 0); + --id; + sizing6[id][0] = t[0][0]; + sizing6[id][1] = t[0][1]; + sizing6[id][2] = t[0][2]; + sizing6[id][3] = t[1][1]; + sizing6[id][4] = t[1][2]; + sizing6[id][5] = t[2][2]; + } + m->end(it); + auto smooth_tool = get_sizing_metric_tool(m->getMesh()->get_context(), + "CreateSmoothingBase"); + if (smooth_tool == nullptr) { + lion_eprint(1, "ERROR: Unable to find \"CreateSmoothingBase\"\n"); + return false; + } + smooth_tool->set_context(m->getMesh()->get_context()); + M_MModel mmodel; + MG_API_CALL(m->getMesh(), get_current_model(mmodel)); + smooth_tool->set_metric(mmodel, "sizing6", sizing6); + std::vector ometric; + smooth_tool->smooth_metric(mmodel, analysis, "sizing6", ometric); + it = m->begin(0); + for (apf::MeshEntity* e = m->iterate(it); e; e = m->iterate(it)) { + size_t id; + MG_API_CALL(m->getMesh(), get_id(fromEntity(e), id)); + PCU_DEBUG_ASSERT(id != 0); + --id; + const Metric6& m = ometric[id]; + apf::Matrix3x3 t(m[0], m[1], m[2], + m[1], m[3], m[4], + m[2], m[4], m[5]); + PCU_DEBUG_ASSERT(apf::eigen(t, &Q[0], &H[0]) == 3); + apf::setMatrix(frames, e, 0, Q); + apf::setVector(scales, e, 0, H); + } + m->end(it); + return true; +#else + (void) mesh; + (void) analysis; + (void) scales; + (void) frames; + apf::fail("smoothCAPAnisoSizes: Capstone does not have SizingMetricTool."); +#endif +} }//namespace apf diff --git a/apf_cap/apfCAP.h b/apf_cap/apfCAP.h index 102716bed..9b8c5005d 100644 --- a/apf_cap/apfCAP.h +++ b/apf_cap/apfCAP.h @@ -182,6 +182,31 @@ class MeshCAP : public Mesh2 std::vector tags; }; +/** + * \brief Test for smoothCAPAnisoSizes support. + * + * \return A boolean indicating whether support was compiled. False indicates + * the call would fail. + * + * \details smoothCAPAnisoSizes is only compiled if support for the underlying + * call is detected in the version of Capstone apf_cap was compiled + * against. Otherwise the call will always apf::fail. Use this + * function to programmatically test for the capability. + */ +bool has_smoothCAPAnisoSizes(void) noexcept; + +/** + * \brief Use the SizingMetricTool to smooth a size field on a Capstone mesh. + * + * \param m A Capstone mesh. + * \param analysis The Capstone analysis to use. + * \param frames An apf::Field of apf::Matrix3x3 with orthogonal basis frames. + * \param scales An apf::Field of apf::Vector3 with frame scales (eigenvalues). + * \return A boolean indicating success. + * \pre m must be an apf::MeshCAP. + */ +bool smoothCAPAnisoSizes(apf::Mesh2* m, std::string analysis, + apf::Field* frames, apf::Field* scales); }//namespace apf From 594fd521b54379139f3ef2eb3d8ddc63cde925e6 Mon Sep 17 00:00:00 2001 From: Aiden Woodruff Date: Fri, 20 Sep 2024 17:50:12 -0400 Subject: [PATCH 33/55] Add apf::smoothCAPAnisoSizes compile flags - If given HAVE_CAPSTONE_SIZINGMETRICTOOL, compile apf_cap with C++14 and link to framework_meshing. - Install to CMAKE_INSTALL_INCLUDEDIR. - Remove -I${CMAKE_BINARY_DIR} because there's no apf_capConfig.h.in. Signed-off-by: Aiden Woodruff --- apf_cap/CMakeLists.txt | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/apf_cap/CMakeLists.txt b/apf_cap/CMakeLists.txt index d4d2a74a6..5dcb4a580 100644 --- a/apf_cap/CMakeLists.txt +++ b/apf_cap/CMakeLists.txt @@ -16,14 +16,19 @@ add_library(apf_cap ${SOURCES}) target_link_libraries(apf_cap PUBLIC apf gmi_cap) target_link_libraries(apf_cap PUBLIC capstone_module framework_testing) -target_include_directories(apf_cap PUBLIC - $ - $ - ) -#directory containing apf_simConfig.h -target_include_directories(apf_cap PRIVATE - $) +if(HAVE_CAPSTONE_SIZINGMETRICTOOL) +target_compile_definitions(apf_cap PRIVATE HAVE_CAPSTONE_SIZINGMETRICTOOL) +target_link_libraries(apf_cap PRIVATE framework_meshing) +target_compile_features(apf_cap PRIVATE cxx_std_14) +endif() + +include(GNUInstallDirs) + +target_include_directories(apf_cap PUBLIC + $ + $ +) scorec_export_library(apf_cap) From 91bbfe968b454680c9453c8ae19ad00a0c65a684 Mon Sep 17 00:00:00 2001 From: Aiden Woodruff Date: Sat, 21 Sep 2024 20:27:24 -0400 Subject: [PATCH 34/55] Add feature test for sizing metric tool - I had to add C++14 to the check_include_file_cxx call. Signed-off-by: Aiden Woodruff --- apf_cap/CMakeLists.txt | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/apf_cap/CMakeLists.txt b/apf_cap/CMakeLists.txt index 5dcb4a580..597d6406a 100644 --- a/apf_cap/CMakeLists.txt +++ b/apf_cap/CMakeLists.txt @@ -7,6 +7,10 @@ if(NOT ENABLE_CAPSTONE) return() endif() +include(CMakePushCheckState) +include(CheckIncludeFileCXX) +cmake_policy(SET CMP0075 NEW) # Observe CMAKE_REQUIRED_LIBRARIES. + #Sources & Headers set(SOURCES apfCAP.cc) set(HEADERS apfCAP.h) @@ -17,6 +21,14 @@ target_link_libraries(apf_cap PUBLIC apf gmi_cap) target_link_libraries(apf_cap PUBLIC capstone_module framework_testing) +set(CMAKE_CXX_OLD_STANDARD "${CMAKE_CXX_STANDARD}") +cmake_push_check_state(RESET) +set(CMAKE_CXX_STANDARD 14) +set(CMAKE_REQUIRED_LIBRARIES "framework_meshing") +check_include_file_cxx("CreateMG_SizingMetricTool.h" HAVE_CAPSTONE_SIZINGMETRICTOOL) +cmake_pop_check_state() +set(CMAKE_CXX_STANDARD "${CMAKE_CXX_OLD_STANDARD}") + if(HAVE_CAPSTONE_SIZINGMETRICTOOL) target_compile_definitions(apf_cap PRIVATE HAVE_CAPSTONE_SIZINGMETRICTOOL) target_link_libraries(apf_cap PRIVATE framework_meshing) From ecc2e72ea182de0e47e25f520a32f9aff928b257 Mon Sep 17 00:00:00 2001 From: Aiden Woodruff Date: Sat, 21 Sep 2024 20:29:20 -0400 Subject: [PATCH 35/55] Add apf::smoothCAPAnisoSizes compilation test - Add compilation test to check that the compile definition worked. Signed-off-by: Aiden Woodruff --- test/CMakeLists.txt | 3 +++ test/cap_smooth.cc | 8 ++++++++ test/testing.cmake | 3 +++ 3 files changed, 14 insertions(+) create mode 100644 test/cap_smooth.cc diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 2495c0567..36cbaa07b 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -212,6 +212,9 @@ endif() if(ENABLE_CAPSTONE) util_exe_func(capVol capVol.cc) target_include_directories(capVol PRIVATE "${PROJECT_SOURCE_DIR}/capstone_clis") + if(HAVE_CAPSTONE_SIZINGMETRICTOOL) + util_exe_func(cap_smooth cap_smooth.cc) + endif() endif() # send all the newly added utility executable targets diff --git a/test/cap_smooth.cc b/test/cap_smooth.cc new file mode 100644 index 000000000..c66cb6115 --- /dev/null +++ b/test/cap_smooth.cc @@ -0,0 +1,8 @@ +#include +#include + +int main (void) { + PCU_ALWAYS_ASSERT(apf::has_smoothCAPAnisoSizes()); + // FIXME: Test apf::smoothCAPAnisoSizes. + return 0; +} diff --git a/test/testing.cmake b/test/testing.cmake index e8b97537a..1d0e617c5 100644 --- a/test/testing.cmake +++ b/test/testing.cmake @@ -895,4 +895,7 @@ if(ENABLE_CAPSTONE) mpi_test(capVolWing 1 ./capVol -vg 2 ${MESHES}/cap/wing_surf_only.cre) mpi_test(capVolCube 1 ./capVol -vg 3 ${MESHES}/cap/cube_surf_only.cre) mpi_test(capVolCyl2 1 ./capVol -vg 4 ${MESHES}/cap/cyl_surf_only.cre) + if(HAVE_CAPSTONE_SIZINGMETRICTOOL) + mpi_test(cap_smooth 1 ./cap_smooth) + endif() endif() From 5abc2b9eeb672f491db19762516276e531f71587 Mon Sep 17 00:00:00 2001 From: Aiden Woodruff Date: Mon, 23 Sep 2024 11:47:22 -0400 Subject: [PATCH 36/55] Add gmi_cap isInClosureOf test Signed-off-by: Aiden Woodruff --- test/CMakeLists.txt | 1 + test/cap_inClosureOf.cc | 49 +++++++++++++++++++++++++++++++++++++++++ test/testing.cmake | 1 + 3 files changed, 51 insertions(+) create mode 100644 test/cap_inClosureOf.cc diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 2495c0567..6eaf38735 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -212,6 +212,7 @@ endif() if(ENABLE_CAPSTONE) util_exe_func(capVol capVol.cc) target_include_directories(capVol PRIVATE "${PROJECT_SOURCE_DIR}/capstone_clis") + test_exe_func(cap_inClosureOf cap_inClosureOf.cc) endif() # send all the newly added utility executable targets diff --git a/test/cap_inClosureOf.cc b/test/cap_inClosureOf.cc new file mode 100644 index 000000000..05a2be88a --- /dev/null +++ b/test/cap_inClosureOf.cc @@ -0,0 +1,49 @@ +#include +#include +#include +#include +#include +#include +#include + +int main (int argc, char* argv[]) { + MPI_Init(&argc, &argv); + PCU_Comm_Init(); + lion_set_verbosity(1); + gmi_register_cap(); + + PCU_ALWAYS_ASSERT(argc == 2); + std::string creFile(argv[1]); + // 1. Load model. + CapstoneModule cs("cap_inClosureOf", "Geometry Database : SMLIB", + "Mesh Database : Create", "Attribution Database : Create"); + cs.load_files(v_string(1, creFile)); + // 2. CreateMesh. + apf::Mesh2* m = apf::createMesh(cs.get_mesh(), cs.get_geometry()); + // 3. Get region 1 ModelEntity*. + apf::ModelEntity* rgn = m->findModelEntity(3, 1); + PCU_ALWAYS_ASSERT(rgn); + // 4. Assert each model entity is in the closure of that region. + //FIXME: gmi_iter + for (int d = 0; d < 3; ++d) { + apf::MeshIterator* it = m->begin(d); + for (apf::MeshEntity* e = m->iterate(it); e; e = m->iterate(it)) { + apf::ModelEntity* ge = m->toModel(e); + PCU_ALWAYS_ASSERT(m->isInClosureOf(ge, rgn)); + } + } + // 5. Test face 1 for edges 3, 5, 8, 12 and verts 3, 4, 7, 8. + apf::ModelEntity* f1 = m->findModelEntity(2, 1); + PCU_ALWAYS_ASSERT(m->isInClosureOf(m->findModelEntity(1, 3), f1)); + PCU_ALWAYS_ASSERT(m->isInClosureOf(m->findModelEntity(1, 5), f1)); + PCU_ALWAYS_ASSERT(m->isInClosureOf(m->findModelEntity(1, 8), f1)); + PCU_ALWAYS_ASSERT(m->isInClosureOf(m->findModelEntity(1, 12), f1)); + PCU_ALWAYS_ASSERT(m->isInClosureOf(m->findModelEntity(0, 3), f1)); + PCU_ALWAYS_ASSERT(m->isInClosureOf(m->findModelEntity(0, 4), f1)); + PCU_ALWAYS_ASSERT(m->isInClosureOf(m->findModelEntity(0, 7), f1)); + PCU_ALWAYS_ASSERT(m->isInClosureOf(m->findModelEntity(0, 8), f1)); + + apf::destroyMesh(m); + PCU_Comm_Free(); + MPI_Finalize(); +} diff --git a/test/testing.cmake b/test/testing.cmake index e8b97537a..08f06d2b2 100644 --- a/test/testing.cmake +++ b/test/testing.cmake @@ -895,4 +895,5 @@ if(ENABLE_CAPSTONE) mpi_test(capVolWing 1 ./capVol -vg 2 ${MESHES}/cap/wing_surf_only.cre) mpi_test(capVolCube 1 ./capVol -vg 3 ${MESHES}/cap/cube_surf_only.cre) mpi_test(capVolCyl2 1 ./capVol -vg 4 ${MESHES}/cap/cyl_surf_only.cre) + mpi_test(cap_inClosureOf 1 ./cap_inClosureOf ${MESHES}/cap/cube_surf_only.cre) endif() From ed783394864415c5fde0ab11fc538123a9a922f7 Mon Sep 17 00:00:00 2001 From: Aiden Woodruff Date: Tue, 24 Sep 2024 23:02:13 -0400 Subject: [PATCH 37/55] fix: Move function call outside of debug assert - Move std::eigen call outside of PCU_DEBUG_ASSERT so that it is called in Release mode. Signed-off-by: Aiden Woodruff --- apf_cap/apfCAP.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apf_cap/apfCAP.cc b/apf_cap/apfCAP.cc index 8b75d9606..ea66f83af 100644 --- a/apf_cap/apfCAP.cc +++ b/apf_cap/apfCAP.cc @@ -1006,7 +1006,8 @@ bool smoothCAPAnisoSizes(apf::Mesh2* mesh, std::string analysis, apf::Matrix3x3 t(m[0], m[1], m[2], m[1], m[3], m[4], m[2], m[4], m[5]); - PCU_DEBUG_ASSERT(apf::eigen(t, &Q[0], &H[0]) == 3); + int n = apf::eigen(t, &Q[0], &H[0]); + PCU_DEBUG_ASSERT(n == 3); apf::setMatrix(frames, e, 0, Q); apf::setVector(scales, e, 0, H); } From 32c22af207424a82ceb28896d609e6d010b9c5b6 Mon Sep 17 00:00:00 2001 From: Aiden Woodruff Date: Thu, 3 Oct 2024 17:55:32 -0400 Subject: [PATCH 38/55] Add test/cap_closestPoint - Test a few points on a square face and edge. Signed-off-by: Aiden Woodruff --- test/CMakeLists.txt | 1 + test/cap_closestPoint.cc | 39 +++++++++++++++++++++++++++++++++++++++ test/testing.cmake | 1 + 3 files changed, 41 insertions(+) create mode 100644 test/cap_closestPoint.cc diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 6eaf38735..0de50a896 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -213,6 +213,7 @@ if(ENABLE_CAPSTONE) util_exe_func(capVol capVol.cc) target_include_directories(capVol PRIVATE "${PROJECT_SOURCE_DIR}/capstone_clis") test_exe_func(cap_inClosureOf cap_inClosureOf.cc) + test_exe_func(cap_closestPoint cap_closestPoint.cc) endif() # send all the newly added utility executable targets diff --git a/test/cap_closestPoint.cc b/test/cap_closestPoint.cc new file mode 100644 index 000000000..dbde459fe --- /dev/null +++ b/test/cap_closestPoint.cc @@ -0,0 +1,39 @@ +#include +#include +#include +#include +#include +#include +#include + +int main (int argc, char* argv[]) { + MPI_Init(&argc, &argv); + PCU_Comm_Init(); + lion_set_verbosity(1); + gmi_register_cap(); + + PCU_ALWAYS_ASSERT(argc == 2); + std::string creFile(argv[1]); + // 1. Load model. + CapstoneModule cs("cap_inClosureOf", "Geometry Database : SMLIB", + "Mesh Database : Create", "Attribution Database : Create"); + cs.load_files(v_string(1, creFile)); + // 2. CreateMesh. + apf::Mesh2* m = apf::createMesh(cs.get_mesh(), cs.get_geometry()); + + PCU_ALWAYS_ASSERT(m->canGetClosestPoint()); + + apf::ModelEntity* face = m->findModelEntity(2, 1); + apf::Vector3 from(0.3, 0.4, -0.8), to, p; + m->getClosestPoint(face, from, to, p); + PCU_ALWAYS_ASSERT((to - apf::Vector3(0.3, 0.4, -0.5)).getLength() < 0.0001); + + apf::ModelEntity* edge = m->findModelEntity(1, 1); + from = apf::Vector3(0.6, 0.34, 0.6); + m->getClosestPoint(edge, from, to, p); + PCU_ALWAYS_ASSERT((to - apf::Vector3(0.5, 0.34, 0.5)).getLength() < 0.0001); + + apf::destroyMesh(m); + PCU_Comm_Free(); + MPI_Finalize(); +} diff --git a/test/testing.cmake b/test/testing.cmake index 08f06d2b2..14bd718f8 100644 --- a/test/testing.cmake +++ b/test/testing.cmake @@ -896,4 +896,5 @@ if(ENABLE_CAPSTONE) mpi_test(capVolCube 1 ./capVol -vg 3 ${MESHES}/cap/cube_surf_only.cre) mpi_test(capVolCyl2 1 ./capVol -vg 4 ${MESHES}/cap/cyl_surf_only.cre) mpi_test(cap_inClosureOf 1 ./cap_inClosureOf ${MESHES}/cap/cube_surf_only.cre) + mpi_test(cap_closestPoint 1 ./cap_closestPoint ${MESHES}/cap/cube_surf_only.cre) endif() From 4a3fe52c239643e33bb125814a4b33c636622d59 Mon Sep 17 00:00:00 2001 From: Aiden Woodruff Date: Mon, 7 Oct 2024 10:49:19 -0400 Subject: [PATCH 39/55] Fix smoothCAPAnisoSizes eigenvalues and transpose - retab (fix indentation). - Use apf::transpose instead of apf::invert with orthogonal frames guarantee. - Convert size field lengths to eigenvalues. - Convert eigenvalues from apf::eigen back to size field lengths. - Transpose apf::eigen eigenvectors into columns for MeshAdapt. Signed-off-by: Aiden Woodruff --- apf_cap/apfCAP.cc | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/apf_cap/apfCAP.cc b/apf_cap/apfCAP.cc index ea66f83af..1d508dd40 100644 --- a/apf_cap/apfCAP.cc +++ b/apf_cap/apfCAP.cc @@ -545,7 +545,7 @@ static MeshEntity* commonDown(Mesh2* m, MeshEntity* a, MeshEntity* b, int dim) for (int i = 0; i < na; i++) for (int j = 0; j < nb; j++) if (aDown[i] == bDown[j]) - return aDown[i]; + return aDown[i]; return 0; } @@ -623,7 +623,7 @@ class TagCAP { public: TagCAP(MeshDatabaseInterface* m, - const char* n, + const char* n, int c): mesh(m), count(c), @@ -958,20 +958,25 @@ bool has_smoothCAPAnisoSizes(void) noexcept { bool smoothCAPAnisoSizes(apf::Mesh2* mesh, std::string analysis, apf::Field* scales, apf::Field* frames) { #ifdef HAVE_CAPSTONE_SIZINGMETRICTOOL + // Ensure input is a MeshCAP. apf::MeshCAP* m = dynamic_cast(mesh); if (!m) { lion_eprint(1, "ERROR: smoothCAPAnisoSizes: mesh is not an apf::MeshCAP*\n"); return false; } + + // Extract metric tensors from MeshAdapt frames and scales. std::vector sizing6(m->count(0)); apf::Matrix3x3 Q; apf::Vector3 H; apf::MeshIterator* it = m->begin(0); for (apf::MeshEntity* e = m->iterate(it); e; e = m->iterate(it)) { - apf::getVector(scales, e, 0, H); - apf::getMatrix(frames, e, 0, Q); - apf::Matrix3x3 L(H[0], 0, 0, 0, H[1], 0, 0, 0, H[2]); - apf::Matrix3x3 t = Q * L * apf::invert(Q); + apf::getVector(scales, e, 0, H); // Desired element lengths. + apf::getMatrix(frames, e, 0, Q); // MeshAdapt uses column vectors. + apf::Matrix3x3 L(1.0/(H[0]*H[0]), 0, 0, + 0, 1.0/(H[1]*H[1]), 0, + 0, 0, 1.0/(H[2]*H[2])); + apf::Matrix3x3 t = Q * L * apf::transpose(Q); // Invert orthogonal frames. size_t id; MG_API_CALL(m->getMesh(), get_id(fromEntity(e), id)); PCU_DEBUG_ASSERT(id != 0); @@ -1006,8 +1011,12 @@ bool smoothCAPAnisoSizes(apf::Mesh2* mesh, std::string analysis, apf::Matrix3x3 t(m[0], m[1], m[2], m[1], m[3], m[4], m[2], m[4], m[5]); - int n = apf::eigen(t, &Q[0], &H[0]); + int n = apf::eigen(t, &Q[0], &H[0]); // Eigenvectors in rows of Q. PCU_DEBUG_ASSERT(n == 3); + Q = apf::transpose(Q); // Put eigenvectors back into columns for MeshAdapt. + for (int i = 0; i < 3; ++i) { + H[i] = 1.0/sqrt(H[i]); + } apf::setMatrix(frames, e, 0, Q); apf::setVector(scales, e, 0, H); } From 1555069c8a9401ddf8ef1ce29eae48f62505ce86 Mon Sep 17 00:00:00 2001 From: Aiden Woodruff Date: Tue, 8 Oct 2024 12:44:22 -0400 Subject: [PATCH 40/55] Clarify that orthogonal basis frames are columns (#459) --- ma/maInput.h | 2 +- ma/maSize.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ma/maInput.h b/ma/maInput.h index b6829c0c6..c226b8438 100644 --- a/ma/maInput.h +++ b/ma/maInput.h @@ -153,7 +153,7 @@ const Input* configure( \param sizes a vector field of desired element sizes along the axes of the anisotropic frame \param frames a matrix field containing anisotropic frames - for each vertex + for each vertex along the columns \param s if non-zero, use that to transfer all fields. otherwise, transfer any associated fields with default algorithms \param logInterpolation if true uses logarithmic interpolation */ diff --git a/ma/maSize.h b/ma/maSize.h index b48a03cfa..dd88dc643 100644 --- a/ma/maSize.h +++ b/ma/maSize.h @@ -83,7 +83,7 @@ class AnisotropicFunction public: virtual ~AnisotropicFunction(); /** \brief get the size field value at this vertex - \param r the orthonormal basis frame + \param r the orthonormal basis frame on each column \param h the desired element sizes along each of the frame's basis vectors */ virtual void getValue(Entity* vert, Matrix& r, Vector& h) = 0; From 8db614cbd783d3b0078061e05207d93e094b4403 Mon Sep 17 00:00:00 2001 From: Aiden Woodruff Date: Thu, 10 Oct 2024 14:31:49 -0400 Subject: [PATCH 41/55] fix: Correct smoothCAPAnisoSizes param order - Update declaration to match definition. Signed-off-by: Aiden Woodruff --- apf_cap/apfCAP.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apf_cap/apfCAP.h b/apf_cap/apfCAP.h index 9b8c5005d..9fee1ce48 100644 --- a/apf_cap/apfCAP.h +++ b/apf_cap/apfCAP.h @@ -206,7 +206,7 @@ bool has_smoothCAPAnisoSizes(void) noexcept; * \pre m must be an apf::MeshCAP. */ bool smoothCAPAnisoSizes(apf::Mesh2* m, std::string analysis, - apf::Field* frames, apf::Field* scales); + apf::Field* scales, apf::Field* frames); }//namespace apf From 27a38064b2956017eb3563f071b8e8b6b20b9ae7 Mon Sep 17 00:00:00 2001 From: Cameron Smith Date: Mon, 21 Oct 2024 13:22:58 -0400 Subject: [PATCH 42/55] increase versions for simmodsuite 2025.0.241016 --- cmake/FindSimModSuite.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/FindSimModSuite.cmake b/cmake/FindSimModSuite.cmake index 3ed47f0f6..17760e972 100644 --- a/cmake/FindSimModSuite.cmake +++ b/cmake/FindSimModSuite.cmake @@ -84,7 +84,7 @@ string(REGEX REPLACE "${SIM_VERSION}") set(MIN_VALID_SIM_VERSION 15.0.191017) -set(MAX_VALID_SIM_VERSION 2024.1.240606) +set(MAX_VALID_SIM_VERSION 2025.0.241016) if( ${SKIP_SIMMETRIX_VERSION_CHECK} ) message(STATUS "Skipping Simmetrix SimModSuite version check." " This may result in undefined behavior") @@ -124,7 +124,7 @@ endif() option(SIM_PARASOLID "Use Parasolid through Simmetrix" OFF) if (SIM_PARASOLID) set(MIN_SIM_PARASOLID_VERSION 290) - set(MAX_SIM_PARASOLID_VERSION 361) + set(MAX_SIM_PARASOLID_VERSION 370) foreach(version RANGE ${MAX_SIM_PARASOLID_VERSION} ${MIN_SIM_PARASOLID_VERSION} -1) From 3f33c98d57814aca8568bbc0de43a2aa29a2c25a Mon Sep 17 00:00:00 2001 From: Cameron Smith Date: Mon, 21 Oct 2024 16:26:10 -0400 Subject: [PATCH 43/55] simplify and improve logic for setting C++ standard Added a 'bob' cmake helper function to set the C++ standard. The modifications do not change the default behavior of using C++11. The user is given the ability to increase the standard to > C++11, or enable the use of extensions, by passing CMAKE_CXX_STANDARD and CMAKE_CXX_EXTENSIONS, respectively, to cmake. Following approach given in "Professional CMake: 19th Edition". --- CMakeLists.txt | 20 +++++++------------- cmake/bob.cmake | 27 ++++++++++++++++++++------- 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4f1ab11c3..dad94b45d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,12 +13,7 @@ include(cmake/xsdk.cmake) option(USE_XSDK_DEFAULTS "enable the XDSK v0.3.0 default configuration" NO) -#requre c++11 without extensions -set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_CXX_EXTENSION OFF) -if(NOT ENABLE_CGNS) - set(CMAKE_CXX_STANDARD 11) -endif() +bob_set_cxx_standard(11) xsdk_begin_package() bob_begin_package() @@ -27,9 +22,12 @@ if(USE_XSDK_DEFAULTS) xsdk_compiler_flags() endif() -# require c++14 option(ENABLE_CGNS "Enable the CGNS reader: requires c++14 extensions" OFF) message(STATUS "ENABLE_CGNS: ${ENABLE_CGNS}") +if(ENABLE_CGNS) + message(STATUS "enabling cxx14") + bob_set_cxx_standard(14) +endif() # Set some default compiler flags that should always be used if(NOT USE_XSDK_DEFAULTS) @@ -37,10 +35,9 @@ if(NOT USE_XSDK_DEFAULTS) bob_begin_cxx_flags() bob_end_cxx_flags() set(CMAKE_C_FLAGS "${CMAKE_CXX_FLAGS}") - if(ENABLE_CGNS) #takes precedence over SCOREC_ENABLE_CXX11 - message(STATUS "enabling cxx14") + if(ENABLE_CGNS) bob_cxx14_flags() - elseif(SCOREC_ENABLE_CXX11) + else() bob_cxx11_flags() endif() endif() @@ -193,9 +190,6 @@ add_library(core INTERFACE) target_link_libraries(core INTERFACE ${SCOREC_EXPORTED_TARGETS}) if(ENABLE_CGNS) target_link_libraries(core INTERFACE ${CMAKE_DL_LIBS}) #HDF5 uses dlopen - target_compile_features(core INTERFACE cxx_std_14) -else() - target_compile_features(core INTERFACE cxx_std_11) endif() scorec_export_library(core) diff --git a/cmake/bob.cmake b/cmake/bob.cmake index 4cbd4f84c..4bf5dcce9 100644 --- a/cmake/bob.cmake +++ b/cmake/bob.cmake @@ -77,13 +77,27 @@ function(bob_begin_cxx_flags) set(CMAKE_CXX_FLAGS "${FLAGS}" PARENT_SCOPE) endfunction(bob_begin_cxx_flags) -function(bob_cxx11_flags) - set(FLAGS "${CMAKE_CXX_FLAGS}") - if(CMAKE_CXX_COMPILER_ID MATCHES "PGI") - set(FLAGS "${FLAGS} -std=c++11") +# The following is from the book,"Professional CMake: 19th edition" +macro(bob_set_cxx_standard standard) + # Require C++, but let a parent project ask for something higher + if(DEFINED CMAKE_CXX_STANDARD) + if(CMAKE_CXX_STANDARD EQUAL 98 OR CMAKE_CXX_STANDARD LESS ${standard}) + message(FATAL_ERROR "This project requires at least C++${standard}") + endif() else() - set(FLAGS "${FLAGS} --std=c++11") + set(CMAKE_CXX_STANDARD ${standard}) + endif() + message(STATUS "CMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD}") + # Always enforce the language constraint + set(CMAKE_CXX_STANDARD_REQUIRED ON) + # We don't need compiler extensions, but let a parent ask for them + if(NOT DEFINED CMAKE_CXX_EXTENSIONS) + set(CMAKE_CXX_EXTENSIONS OFF) endif() +endmacro() + +function(bob_cxx11_flags) + set(FLAGS "${CMAKE_CXX_FLAGS}") if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") if (${PROJECT_NAME}_CXX_WARNINGS) set(FLAGS "${FLAGS} -Wno-c++98-compat-pedantic -Wno-c++98-compat") @@ -94,8 +108,7 @@ endfunction(bob_cxx11_flags) function(bob_cxx14_flags) set(FLAGS "${CMAKE_CXX_FLAGS}") - # clang only: -Werror=return-stack-address -Werror=mismatched-tags - set(FLAGS "${FLAGS} --std=c++14 -Wall -Wextra -Wpedantic -Werror -Wno-extra-semi -Werror=unused-parameter -Wno-error=deprecated-declarations") + set(FLAGS "${FLAGS} -Wall -Wextra -Wpedantic -Werror -Wno-extra-semi -Werror=unused-parameter -Wno-error=deprecated-declarations") if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") if (${PROJECT_NAME}_CXX_WARNINGS) set(FLAGS "${FLAGS} -Wno-c++98-compat-pedantic -Wno-c++98-compat") From 16aa1112ab7c006defe15341b58503024e0a95e6 Mon Sep 17 00:00:00 2001 From: Cameron Smith Date: Tue, 22 Oct 2024 13:49:59 -0400 Subject: [PATCH 44/55] bob_set_cxx_standard should only be called once calling it more than once could be done if the standard was decreased, otherwise, the check against CMAKE_CXX_STANDARD will fail --- CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index dad94b45d..ae43799ed 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,8 +13,6 @@ include(cmake/xsdk.cmake) option(USE_XSDK_DEFAULTS "enable the XDSK v0.3.0 default configuration" NO) -bob_set_cxx_standard(11) - xsdk_begin_package() bob_begin_package() @@ -24,7 +22,9 @@ endif() option(ENABLE_CGNS "Enable the CGNS reader: requires c++14 extensions" OFF) message(STATUS "ENABLE_CGNS: ${ENABLE_CGNS}") -if(ENABLE_CGNS) +if(NOT ENABLE_CGNS) + bob_set_cxx_standard(11) +else() message(STATUS "enabling cxx14") bob_set_cxx_standard(14) endif() From 54a63512d8c4c8e19fc89f7dd285bcda67346831 Mon Sep 17 00:00:00 2001 From: Cameron Smith Date: Fri, 25 Oct 2024 14:48:43 -0400 Subject: [PATCH 45/55] copy inputs needed for smoke tests to repo use var for smoke test meshes dir --- CMakeLists.txt | 2 + smoke_test_meshes/pipe/pipe.dmg | 13 + smoke_test_meshes/pipe/pipe.smd | 391 + smoke_test_meshes/pipe/pipe.sms | 19006 +++++++++++++++++++++++++++++ smoke_test_meshes/pipe/pipe0.smb | Bin 0 -> 235600 bytes test/smokeTesting.cmake | 2 +- test/testing.cmake | 2 +- 7 files changed, 19414 insertions(+), 2 deletions(-) create mode 100644 smoke_test_meshes/pipe/pipe.dmg create mode 100644 smoke_test_meshes/pipe/pipe.smd create mode 100644 smoke_test_meshes/pipe/pipe.sms create mode 100644 smoke_test_meshes/pipe/pipe0.smb diff --git a/CMakeLists.txt b/CMakeLists.txt index ae43799ed..70fba0900 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -57,6 +57,8 @@ message(STATUS "IS_TESTING: ${IS_TESTING}") set(MESHES "${CMAKE_SOURCE_DIR}/pumi-meshes" CACHE STRING "Directory of test meshes") message(STATUS "MESHES: ${MESHES}") +set(SMOKE_TEST_MESHES "${CMAKE_SOURCE_DIR}/smoke_test_meshes" CACHE STRING "Directory of +meshes used for smoke testing") option(BUILD_EXES "Build executables" ON) message(STATUS "BUILD_EXES: ${BUILD_EXES}") diff --git a/smoke_test_meshes/pipe/pipe.dmg b/smoke_test_meshes/pipe/pipe.dmg new file mode 100644 index 000000000..ef277437a --- /dev/null +++ b/smoke_test_meshes/pipe/pipe.dmg @@ -0,0 +1,13 @@ +1 3 2 0 +0 0 0 +0 0 0 +4 -42 -42 +18 -42 -42 +25 1 +0 +1 1 +0 +16 1 +0 +30 1 +0 diff --git a/smoke_test_meshes/pipe/pipe.smd b/smoke_test_meshes/pipe/pipe.smd new file mode 100644 index 000000000..95781326b --- /dev/null +++ b/smoke_test_meshes/pipe/pipe.smd @@ -0,0 +1,391 @@ +smi 5 0 + smd 18 +simple 18 1 +* +1 +-1 -1 0 +1 1 5 +1 1007 9 0 +0 0 -1 -1 0 +1 1 5 +_sim_empty +-1 +0 0 0 0 + +0 +1 3 2 0 +0 0 0 0 +31 +1 5 4 -1 -1 +2 5 4 -1 -1 +4 1 9 0 210 0 2 -1 -1 +1 2 +_sim_empty +-1 +1 0.5 -1 1.2246467991473532e-16 5 +1 1 +7 4 1 1e-08 +1 0 5 1 +1 1.9999999999999996 5 0.33333333333333337 +-0.99999999999999978 2 5 0.33333333333333337 +-1 1.2246467991473532e-16 5 1 +-1.0000000000000002 -1.9999999999999996 5 0.33333333333333337 +1 -1.9999999999999996 5 0.33333333333333337 +1 0 5 1 +0 0 0 0 0.5 0.5 0.5 1 1 1 1 +3 5 18 -1 -1 +4 5 18 -1 -1 +18 1 9 0 210 0 2 -1 -1 +3 4 +_sim_empty +-1 +1 0.5 -1 1.2246467991473532e-16 0 +1 1 +7 4 1 1e-08 +1 0 0 1 +1 1.9999999999999996 0 0.33333333333333337 +-0.99999999999999978 2 0 0.33333333333333337 +-1 1.2246467991473532e-16 0 1 +-1.0000000000000002 -1.9999999999999996 0 0.33333333333333337 +1 -1.9999999999999996 0 0.33333333333333337 +1 0 0 1 +0 0 0 0 0.5 0.5 0.5 1 1 1 1 +1 6 25 1 0 2 +1 4 1 0 3 6 25 1 0 4 +1 18 3 1 2 6 25 0 0 1 +1 4 2 1 4 6 25 0 0 3 +1 18 4 0 25 2 9 0 203 0 +2 1 3 + + 2 2 4 + +0 +_sim_empty +-1 +1 0.00011238968005049493 0.42516224571744082 -0.99999989890303986 0.00044965977171321849 2.8741887714127956 +0 +1 1 +7 2 4 2 1 0 1 1e-08 + -1 0 5 1 -1 0 0 1 + -1 1.9999999999999996 5 0.33333333333333337 -1 1.9999999999999996 0 0.33333333333333337 + 0.99999999999999978 2 5 0.33333333333333337 0.99999999999999978 2 0 0.33333333333333337 + 1 1.2246467991473532e-16 5 1 1 1.2246467991473532e-16 0 1 + 1.0000000000000002 -1.9999999999999996 5 0.33333333333333337 1.0000000000000002 -1.9999999999999996 0 0.33333333333333337 + -1 -1.9999999999999996 5 0.33333333333333337 -1 -1.9999999999999996 0 0.33333333333333337 + -1 0 5 1 -1 0 0 1 + 0 0 0 0 0.5 0.5 0.5 1 1 1 1 + 0 0 1 1 +5 6 1 1 0 6 +1 4 1 1 6 6 1 0 0 5 +1 4 2 0 1 2 9 0 203 0 +1 5 + + 1 6 + +0 +_sim_empty +-1 +1 0.00011238968005049493 0.42516224571744082 -1.0117725232875778 -0.1514716146678996 5.0000000000000009 +0 +1 1 +2 2 2 2 0 0 0 1e-08 + -1.012 -1.012 5 -1.012 1.012 5 + 1.012 -1.012 5 1.012 1.012 5 + 0 0 1 1 + 0 0 1 1 +7 6 16 1 0 8 +1 18 3 0 8 6 16 0 0 7 +1 18 4 1 16 2 9 0 203 0 +1 7 + + 1 8 + +0 +_sim_empty +-1 +1 0.00011238968005049493 0.42516224571744082 -1.0117725232875778 -0.1514716146678996 0 +0 +-1 1 +2 2 2 2 0 0 0 1e-08 + -1.012 -1.012 0 -1.012 1.012 0 + 1.012 -1.012 0 1.012 1.012 0 + 0 0 1 1 + 0 0 1 1 +1 8 30 3 +25 0 1 0 16 0 30 3 9 0 205 0 1 +1 +0 +0 +_sim_empty +-1 +0 -1 +3 8 31 3 +25 1 16 1 1 1 31 3 8 0 303 0 1 +3 +0 +0 +_sim_empty +-1 +0 +0 -1 +0 -1 +0 -1 + auxmm 2 +0 + attributes 10 +AttDBVersion 10 8 +0 1 0 23 24 +1 2 3 +0 +9 Smoothing +0 +0 0 1 +0 +0 +1 1 +0 +2 +1 2 4 +0 +13 SmoothingType +0 +0 0 1 +0 +0 +1 1 +0 +0 +1 2 5 +0 +12 Optimization +0 +0 0 1 +0 +0 +1 1 +0 +1 +1 2 6 +0 +16 FixIntersections +0 +0 0 1 +0 +0 +1 1 +0 +1 +1 2 7 +0 +16 EnforceGradation +0 +0 0 1 +0 +0 +1 1 +0 +0 +1 3 8 +0 +17 FaceRotationLimit +0 +0 0 1 +0 +0 +2 1 +0 +15 +1 7 2 +0 +13 SurfaceMesher +0 +0 0 1 +0 +6 3 4 5 6 7 8 +1 2 10 +0 +11 EnforceSize +0 +0 0 1 +0 +0 +1 1 +0 +0 +1 2 11 +0 +9 Smoothing +0 +0 0 1 +0 +0 +1 1 +0 +1 +1 2 12 +0 +13 SmoothingType +0 +0 0 1 +0 +0 +1 1 +0 +0 +1 2 13 +0 +12 Optimization +0 +0 0 1 +0 +0 +1 1 +0 +1 +1 7 9 +0 +12 VolumeMesher +0 +0 0 1 +0 +4 10 11 12 13 +1 10 14 +1 * +6 simple +0 +0 0 1 +0 +0 +1 +4 +41 file:///lore/dibanez/meshes/pipe/pipe.smd24 model.nonmanifold.simple6 # 1 0 0 1 3 15 +9 mesh size +8 MeshSize +8 Relative +0 0 1 +0 +0 +2 -1 +0 +4 0.15 +1 3 16 +13 min curv size +11 MinCurvSize +8 Relative +0 0 1 +0 +0 +2 1 +0 +0.0030000000000000001 +1 3 17 +9 mesh curv +8 MeshCurv +8 Relative +0 0 1 +0 +0 +2 1 +0 +0.14999999999999999 +1 2 19 +0 +13 mixedElements +0 +0 0 1 +0 +0 +1 1 +0 +1 +1 2 20 +0 +6 blends +0 +0 0 1 +0 +0 +1 1 +0 +0 +1 2 21 +0 +11 propagation +0 +0 0 1 +0 +0 +1 1 +0 +0 +1 3 22 +0 +5 first +0 +0 0 1 +0 +0 +2 1 +0 +0.002 +1 3 23 +0 +5 total +0 +0 0 1 +0 +0 +2 1 +0 +0.25 +1 3 24 +0 +9 numLayers +0 +0 0 1 +0 +0 +2 1 +0 +7 +1 7 18 +2 bl +13 BoundaryLayer +5 Type1 +0 0 1 +0 +6 19 20 21 22 23 24 +3 1 1 +4 pipe +7 Meshing +0 +3 0 1 +0 +6 2 9 15 16 17 18 +14 +4 4 +1 +1 +9 1 1 15 +2 +1 +9 1 1 16 +3 +1 +9 1 1 17 +4 +1 +2 25 1 18 + +3 +smd 8 +auxmm 2419 +attributes 2436 + +
+4 +41 file:///lore/dibanez/meshes/pipe/pipe.smd24 model.nonmanifold.simple6 # 1 0 0 +0 +0 +
+3870 3922 diff --git a/smoke_test_meshes/pipe/pipe.sms b/smoke_test_meshes/pipe/pipe.sms new file mode 100644 index 000000000..a23129d0a --- /dev/null +++ b/smoke_test_meshes/pipe/pipe.sms @@ -0,0 +1,19006 @@ +smi 5 0 + smd 18 +simple 18 1 +* +1 +-1 -1 0 +1 1 5 +1 1007 9 0 +0 0 -1 -1 0 +1 1 5 +_sim_empty +-1 +0 0 0 0 + +0 +1 3 2 0 +0 0 0 0 +31 +1 5 4 -1 -1 +2 5 4 -1 -1 +4 1 9 0 210 0 2 -1 -1 +1 2 +_sim_empty +-1 +1 0.5 -1 1.2246467991473532e-16 5 +1 1 +7 4 1 1e-08 +1 0 5 1 +1 1.9999999999999996 5 0.33333333333333337 +-0.99999999999999978 2 5 0.33333333333333337 +-1 1.2246467991473532e-16 5 1 +-1.0000000000000002 -1.9999999999999996 5 0.33333333333333337 +1 -1.9999999999999996 5 0.33333333333333337 +1 0 5 1 +0 0 0 0 0.5 0.5 0.5 1 1 1 1 +3 5 18 -1 -1 +4 5 18 -1 -1 +18 1 9 0 210 0 2 -1 -1 +3 4 +_sim_empty +-1 +1 0.5 -1 1.2246467991473532e-16 0 +1 1 +7 4 1 1e-08 +1 0 0 1 +1 1.9999999999999996 0 0.33333333333333337 +-0.99999999999999978 2 0 0.33333333333333337 +-1 1.2246467991473532e-16 0 1 +-1.0000000000000002 -1.9999999999999996 0 0.33333333333333337 +1 -1.9999999999999996 0 0.33333333333333337 +1 0 0 1 +0 0 0 0 0.5 0.5 0.5 1 1 1 1 +1 6 25 1 0 2 +1 4 1 0 3 6 25 1 0 4 +1 18 3 1 2 6 25 0 0 1 +1 4 2 1 4 6 25 0 0 3 +1 18 4 0 25 2 9 0 203 0 +2 1 3 + + 2 2 4 + +0 +_sim_empty +-1 +1 0.00011238968005049493 0.42516224571744082 -0.99999989890303986 0.00044965977171321849 2.8741887714127956 +0 +1 1 +7 2 4 2 1 0 1 1e-08 + -1 0 5 1 -1 0 0 1 + -1 1.9999999999999996 5 0.33333333333333337 -1 1.9999999999999996 0 0.33333333333333337 + 0.99999999999999978 2 5 0.33333333333333337 0.99999999999999978 2 0 0.33333333333333337 + 1 1.2246467991473532e-16 5 1 1 1.2246467991473532e-16 0 1 + 1.0000000000000002 -1.9999999999999996 5 0.33333333333333337 1.0000000000000002 -1.9999999999999996 0 0.33333333333333337 + -1 -1.9999999999999996 5 0.33333333333333337 -1 -1.9999999999999996 0 0.33333333333333337 + -1 0 5 1 -1 0 0 1 + 0 0 0 0 0.5 0.5 0.5 1 1 1 1 + 0 0 1 1 +5 6 1 1 0 6 +1 4 1 1 6 6 1 0 0 5 +1 4 2 0 1 2 9 0 203 0 +1 5 + + 1 6 + +0 +_sim_empty +-1 +1 0.00011238968005049493 0.42516224571744082 -1.0117725232875778 -0.1514716146678996 5.0000000000000009 +0 +1 1 +2 2 2 2 0 0 0 1e-08 + -1.012 -1.012 5 -1.012 1.012 5 + 1.012 -1.012 5 1.012 1.012 5 + 0 0 1 1 + 0 0 1 1 +7 6 16 1 0 8 +1 18 3 0 8 6 16 0 0 7 +1 18 4 1 16 2 9 0 203 0 +1 7 + + 1 8 + +0 +_sim_empty +-1 +1 0.00011238968005049493 0.42516224571744082 -1.0117725232875778 -0.1514716146678996 0 +0 +-1 1 +2 2 2 2 0 0 0 1e-08 + -1.012 -1.012 0 -1.012 1.012 0 + 1.012 -1.012 0 1.012 1.012 0 + 0 0 1 1 + 0 0 1 1 +1 8 30 3 +25 0 1 0 16 0 30 3 9 0 205 0 1 +1 +0 +0 +_sim_empty +-1 +0 -1 +3 8 31 3 +25 1 16 1 1 1 31 3 8 0 303 0 1 +3 +0 +0 +_sim_empty +-1 +0 +0 -1 +0 -1 +0 -1 + sms 10 +sms 10 0 +0 0 +1889 4438 3332 784 784 +1e-08 5.0000000000000002e-14 +4 1h 14 +1 0 5 0 +0.75 +4 1g 15 +0.15156076963999687 0.98844794152556748 5 0.23094484063740223 +0.75 +4 1g 15 +-0.96181516383013721 0.27369981846250147 5 0.43878372083603578 +0.75 +4 1g 15 +-0.49437043022527999 -0.8692513317325844 5.0000000000000009 0.68388122535573448 +0.78348088264465332 +4 1g 15 +0.75145085330426564 0.65978906861836606 4.9999999999999991 0.13681530871724187 +0.75 +4 1g 15 +-0.55091430892621729 0.83456181569752419 5 0.32507437255756255 +0.75 +4 1g 15 +-0.91084583566631161 -0.41274673063434214 5 0.58881650264776586 +0.75 +4 1g 15 +0.28723454664400522 -0.95786027958894515 5 0.78667709969379307 +0.78348088264465332 +4 1g 15 +0.85705043614982923 -0.51523252022304222 5.0000000000000009 0.89140576193937404 +0.75 +i 1h 15 +1 0 0 0 +0.75 +i 1g 15 +0.15156076963999687 0.98844794152556748 0 0.23094484063740223 +0.78183388710021973 +i 1g 15 +-0.96181516383013721 0.27369981846250147 0 0.43878372083603578 +0.75 +i 1g 15 +-0.49437043022527999 -0.8692513317325844 0 0.68388122535573448 +0.75 +i 1g 15 +0.77416669841917263 0.63298177150590795 0 0.13147958661760667 +0.75 +i 1g 15 +-0.60876550390877848 0.79335021349382084 0 0.33486428073671903 +0.78183388710021973 +i 1g 15 +-0.91084583566631161 -0.41274673063434214 0 0.58881650264776586 +0.75 +i 1g 15 +0.25230056663122963 -0.96764891571145784 0 0.7820560955535103 +0.75 +i 1g 15 +0.81947391504363531 -0.57311648254351999 0 0.88023096575128612 +0.75 +p 1g 27 +0.98220385373427732 0.18781796961295916 2.4053089699572121 0.45672440535108266 0.51893820600855756 +0.75 +p 1g 27 +-0.25019427787513621 0.96819565342886116 2.394855498614481 0.21822034976054538 0.52102890027710391 +0.75 +p 1g 27 +0.55344982398726605 -0.8328825201242156 2.5162782026441395 0.67451100685523502 0.49674435947117229 +0.75 +p 1g 27 +-0.87780553518471049 -0.47901716294834762 2.7649889236901668 0.89837649575256595 0.44700221526196654 +0.75 +p 1g 28 +0.99936554163094438 0.035616206994703505 3.7958999395181774 0.4912490107051925 0.24082001209636464 +0.75 +p 1g 27 +0.96976402301721054 -0.24404454442063481 1.2310765484607151 0.55511870990342227 0.753784690307857 +0.75 +p 1g 27 +0.9301688826424741 0.36713192419571922 1.3115861201496712 0.42009493856814339 0.73768277597006582 +0.75 +p 1g 27 +-0.62114365393663151 0.78369672780626698 1.2449346419094229 0.16294152696285938 0.75101307161811537 +0.75 +p 1g 27 +-0.092477661206123357 0.99571475944561827 3.8264401481430177 0.23841547110271757 0.23471197037139646 +0.75 +p 1g 27 +0.40085177208006539 0.91614292379533824 2.6968668955808361 0.30229930490859358 0.46062662088383277 +0.75 +p 1g 26 +0.10666866610136036 -0.99429462216797493 1.1055054178368329 0.73662827135523712 0.77889891643263343 +0.75 +p 1g 27 +-0.53761023544619557 -0.84319347408734469 3.8885220601809012 0.82291831310768837 0.22229558796381968 +0.75 +p 1g 27 +0.95076465924015685 -0.30991379888599369 2.4639252948828121 0.56854442253209192 0.50721494102343745 +0.75 +p 1g 27 +-0.99824654804625335 0.059193152591664043 3.8004408249168709 0.014385148826794527 0.23991183501662613 +0.75 +p 1g 27 +-0.25271758976911946 -0.96754008693246718 2.5952687663826239 0.78211085652683243 0.48094624672347508 +0.75 +p 1g 27 +-0.9509439931530328 -0.30936309069791235 1.3422852959039804 0.93156613698461666 0.7315429408192039 +0.75 +p 1g 28 +0.99949502155305736 -0.031775806687687043 4.4584566159028931 0.50782165682830382 0.10830867681942125 +0.75 +p 1g 27 +0.99997505385821261 0.0070634029521718395 3.0143594289395681 0.49824034190072347 0.39712811421208633 +0.75 +p 1g 27 +0.9193087842837242 -0.39353698573168561 0.57816179575675541 0.58507635719459661 0.88436764084864894 +0.75 +p 1g 27 +0.9998207012820034 -0.018935820234761286 1.864540581052246 0.50468997128503001 0.62709188378955083 +0.75 +p 1g 27 +0.98086549915667298 0.19468660088493678 0.68036559256409335 0.45525581738970694 0.86392688148718133 +0.75 +p 1g 27 +-0.17021764714675364 0.9854064910481477 1.7372446562434833 0.22856639837808587 0.65255106875130331 +0.75 +p 1g 27 +0.45989356230861028 0.88797404880272035 1.5043317087326891 0.310897760035454 0.69913365825346219 +0.75 +p 1g 27 +-0.28720489593995335 0.9578691704758644 0.55276342291556702 0.2133268529543591 0.8894473154168866 +0.75 +p 1g 27 +-0.0024843292089017678 0.99999691404942925 4.4060359318539426 0.24968945836972922 0.11879281362921147 +0.75 +p 1g 27 +-0.23115882752623557 0.97291602744363093 3.1014374063734849 0.22070848121374997 0.37971251872530293 +0.75 +p 1g 27 +0.63394725808018926 0.77337628226666622 3.8694461665463225 0.33937009934376428 0.22611076669073574 +0.75 +p 1g 27 +0.86365094201626591 0.50409031963966178 1.9201627573229494 0.39355037904624851 0.61596744853541008 +0.75 +p 1g 28 +0.097164585881284987 -0.99526832726180836 1.7990199926683494 0.7378256241837623 0.64019600146633004 +0.75 +p 1g 27 +0.60803954346923905 -0.79390674110862591 1.2554152984217657 0.66526321720973725 0.74891694031564682 +0.75 +p 1g 27 +-0.18687670749833615 -0.98238337536553488 0.61645489224013539 0.77356717547934917 0.87670902155197294 +0.75 +p 1g 27 +-0.13110201481644951 -0.99136888276315538 4.4419707046573302 0.7664587806848896 0.11160585906853394 +0.75 +p 1g 27 +0.34243431608958902 -0.93954177084590296 3.2035612859464 0.70586144092939007 0.35928774281072001 +0.75 +p 1g 27 +-0.4382506723006655 -0.89885279563898246 3.2693354330215518 0.80769940056796108 0.34613291339568963 +0.75 +p 1g 27 +0.77558394613596948 -0.63124443957642706 3.843737050034318 0.63113615480930629 0.23125258999313636 +0.75 +p 1g 28 +-0.80536835623111647 0.59277467117074889 4.2947010070171538 0.1235903497826311 0.14105979859656939 +0.75 +p 1g 27 +-0.80993168651222647 0.58652422216261479 3.4700621749266864 0.12237325544765455 0.30598756501466268 +0.75 +p 1g 27 +-0.99810068797049967 0.061603706648347245 3.0561805742064481 0.014954501920103724 0.38876388515871035 +0.75 +p 1g 27 +-0.99822607367390148 -0.059537432238773773 4.4415602360829727 0.98553346094735816 0.11168795278340543 +0.75 +p 1g 27 +-0.99903168298668021 -0.043996549737466785 0.6525293720618347 0.98923251548051239 0.86949412558763306 +0.75 +p 1g 27 +-0.95982600655447392 0.28059586087768912 1.3264049653739971 0.06262121097739759 0.73471900692520065 +0.75 +p 1g 28 +-0.99977402526083958 0.021257902383309584 2.1980317040704072 0.0052591703506854603 0.56039365918591855 +0.75 +p 1g 27 +0.85660037135753375 0.51598042965807878 2.8548404941336742 0.39126177927487088 0.42903190117326523 +0.75 +p 1g 27 +-0.75585624301470389 0.65473761148699616 1.9912743861102713 0.13580421485442198 0.60174512277794567 +0.75 +p 1g 27 +0.38453810897286689 0.92310911746530366 2.0835244040267304 0.29998911729456307 0.58329511919465393 +0.75 +p 1g 26 +-0.051602231822012873 0.9986677173469598 1.2045472980673066 0.24354542136067145 0.75909054038653867 +0.75 +p 1g 27 +0.49582447479215441 0.86842276006394736 3.285916524538977 0.31634265078947987 0.34281669509220475 +0.75 +p 1g 27 +0.70335878655249173 0.71083501417657136 4.4456282694171652 0.35278004318420791 0.11087434611656713 +0.75 +p 1g 27 +-0.4933489379710958 -0.86983149253334768 1.252467032435715 0.81596168424015048 0.74950659351285698 +0.75 +p 1g 27 +0.77783108128240663 -0.62847339561117643 1.8646204161114863 0.63058891791252114 0.6270759167777028 +0.75 +p 1g 27 +0.47817086395272002 -0.8782668301072909 0.5947198252453566 0.68635477448039084 0.88105603495092866 +0.75 +p 1g 27 +-0.91292447705009327 -0.4081285326987239 3.4637156817522845 0.9120811694122205 0.30725686364954302 +0.75 +p 1g 27 +0.12905368846642834 -0.99163760794617373 3.8471832513078259 0.73380055589034698 0.23056334973843487 +0.75 +p 1g 27 +0.895890756431027 -0.44427441130616835 3.1396268669942362 0.59492372962198992 0.37207462660115281 +0.75 +p 1g 27 +-0.81062945466853542 0.58555946514747081 2.7411730889031443 0.1221855798399305 0.45176538221937101 +0.75 +p 1g 27 +-0.77348894338712382 -0.63380979359573675 4.4624570156153904 0.8683566389458357 0.10750859687692184 +0.75 +p 1g 27 +-0.79198710686549667 -0.61053781419238939 0.64395609877361104 0.87293829736351791 0.87120878024527781 +0.75 +p 1g 27 +-0.85553161105311926 0.51775057941913893 0.62943873371013692 0.10907901755166166 0.87411225325797259 +0.75 +p 1g 28 +0.55077434432754346 0.83465419284309861 0.7505134489184756 0.32505152012789235 0.84989731021630488 +0.75 +p 1g 26 +0.8982469132780273 0.43949116349079886 3.3664680364565225 0.40600076889318276 0.32670639270869561 +0.75 +p 1g 27 +-0.73597488456213933 -0.67700883989335447 2.0035848148458832 0.85971541518662209 0.59928303703082342 +0.75 +p 1g 27 +0.62663624853218969 -0.77931188366757498 4.4320819641881819 0.66195525440422698 0.11358360716236367 +0.75 +p 1g 26 +-0.91760772693232373 -0.39748718152173657 4.002826274497771 0.91415315629820881 0.19943474510044579 +0.75 +p 1g 26 +0.77517658163561054 0.63174462188745995 2.3921407042042802 0.36876499717507172 0.52157185915914395 +0.75 +1 1g 28 +0.56358813994192469 0.49484180143192374 5 0.77845263831122757 0.74448705604344056 +0.57679623365402222 +1 0 2g +0.30947631357929817 -0.085499945175813274 5 0.65290331698581927 0.45775694408309614 +0.75 +1 0 2b +-0.090806931633042931 0.30628768861027189 5 0.45513491520106575 0.6513279093924268 +0.75 +1 0 2c +-0.22352971337693978 -0.20897185818177555 4.9999999999999991 0.38956041829202576 0.39675303449517013 +0.75 +1 1g 25 +0.99800000000000022 0 5 0.99308300395256921 0.5 +0.44155648350715637 +1 1g 25 +0.99401254680557294 0 5 0.99111291838220006 0.5 +0.43980911374092102 +1 1g 25 +0.98606265531669912 0 5 0.98718510638176837 0.5 +0.43635940551757812 +1 1g 25 +0.97021274521037038 0 5 0.97935412312765335 0.5 +0.42962056398391724 +1 1g 25 +0.9386123578679384 0 5 0.96374128353159016 0.5 +0.41676831245422363 +1 1g 25 +0.87560982514108066 0 5 0.93261354997088963 0.5 +0.52627754211425781 +1 1g 26 +0.74994795159765704 0.65846949048112935 5 0.87052764406998862 0.82533077592941173 +0.49019050598144531 +1 1g 26 +0.74695157649219401 0.65583861245181885 5 0.86904722158705239 0.82403093500583935 +0.48824715614318848 +1 1g 26 +0.74097762374920362 0.6505933609507577 5 0.86609566390770931 0.82143940758436651 +0.48440331220626831 +1 1g 26 +0.72906719527500674 0.64013576352401835 5 0.86021106485919308 0.81627261043676791 +0.47686493396759033 +1 1g 26 +0.70532105724179117 0.61928617339137526 5 0.84847878322222881 0.80597142954119327 +0.46236115694046021 +1 1g 26 +0.65797775026386396 0.57771779100292342 5 0.82508782127661262 0.78543369120697804 +0.63355189561843872 +1 1g 26 +0.8553363352775295 -0.5142020551825961 5 0.92259700359561736 0.24594760119436954 +0.44813662767410278 +1 1g 26 +0.851918886778119 -0.5121475896239599 5 0.92090854089828011 0.24696265334784592 +0.44636273384094238 +1 1g 26 +0.8451054288102362 -0.50805154699664745 5 0.91754220791019581 0.24898638982379073 +0.44285959005355835 +1 1g 26 +0.83152125644067132 -0.49988515786725479 5 0.9108306602967744 0.25302116706163302 +0.43601223826408386 +1 1g 26 +0.80443813068633707 -0.48360361065678847 5 0.89744966931143133 0.26106540975455117 +0.4229351282119751 +1 1g 26 +0.75044178253424076 -0.45114265693949329 5 0.87077163168687788 0.27710343036586299 +0.60030734539031982 +1 1g 26 +0.15125764810071674 0.98647104564251642 5 0.57473203957545294 0.98738688025816024 +0.4952576756477356 +1 1g 26 +0.15065330662566595 0.9825296557405554 5 0.57443345189015116 0.98543955323149968 +0.49329394102096558 +1 1g 26 +0.14944841495305783 0.97467160186302659 5 0.57383814968036451 0.9815571155449736 +0.48940911889076233 +1 1g 26 +0.14704619037861788 0.95900479084506063 5 0.5726512798313329 0.97381659626732242 +0.48178774118423462 +1 1g 26 +0.14225681135207702 0.92776945302502312 5 0.57028498584588783 0.95838411710722482 +0.46711313724517822 +1 1g 26 +0.13270809900272518 0.8654947292402636 5 0.56556724259027924 0.92761597294479425 +0.63303065299987793 +1 1g 26 +-0.5498124803083646 0.83289269206612926 5 0.22835351763420716 0.91150824706824574 +0.49914416670799255 +1 1g 26 +-0.54761573528738117 0.82956491588817927 5 0.22943886596473262 0.90986408887755887 +0.49716478586196899 +1 1g 26 +-0.54323602631174994 0.82293024001262682 5 0.2316027537985425 0.90658608696276033 +0.49324852228164673 +1 1g 26 +-0.53450408403897898 0.80970251025564655 5.0000000000000009 0.23591695452619615 0.90005064735950913 +0.48556351661682129 +1 1g 26 +-0.51709497848442199 0.78333003361840159 5 0.24451829126263741 0.88702076759802451 +0.47075805068016052 +1 1g 26 +-0.48238598170660307 0.73075052551233333 5 0.26166700508567048 0.86104274975905792 +0.67944455146789551 +1 1g 26 +-0.49338168936482957 -0.86751282906911931 5.0000000000000009 0.25623434319919497 0.071386942159526109 +0.49915617704391479 +1 1g 26 +-0.49141041041359712 -0.86404673006964183 4.9999999999999991 0.257208295250199 0.073099441665196621 +0.49717676639556885 +1 1g 26 +-0.48748021913799838 -0.85713627630580913 5 0.25915008935869638 0.07651369747736704 +0.49326041340827942 +1 1g 26 +-0.47964449225970091 -0.84335872083804098 5 0.26302149591912022 0.083320790099782133 +0.48557519912719727 +1 1g 26 +-0.46402219517393689 -0.81589004205736648 5.0000000000000009 0.27074002214726439 0.096892271710787334 +0.47076931595802307 +1 1g 26 +-0.43287560596447777 -0.76112500658201965 5 0.28612865317960584 0.12395009556224319 +0.60813313722610474 +1 1g 26 +0.28666007755071699 -0.95594455902976716 5 0.64163047309818033 0.027695375973435146 +0.53264302015304565 +1 1g 26 +0.2855147432401518 -0.95212513599810567 5.0000000000000009 0.64106459646252556 0.029582442688683083 +0.53052884340286255 +1 1g 26 +0.28323125976247598 -0.94451025071387129 5 0.63993639316327866 0.033344737789589289 +0.52634197473526001 +1 1g 26 +0.27867861801873622 -0.92932825138796327 5 0.63768706423850607 0.040845725598832337 +0.51810973882675171 +1 1g 26 +0.26960189508665805 -0.89905949553302256 5.0000000000000009 0.6332025173353053 0.055800644499494866 +0.50218093395233154 +1 1g 26 +0.25150539116143494 -0.83871187192046293 5.0000000000000009 0.62426155689794216 0.085616664070917545 +0.6370697021484375 +1 1g 26 +-0.95989153350247702 0.27315241882557645 5.0000000000000009 0.025745289771503508 0.63495672866876307 +0.48821288347244263 +1 1g 26 +-0.95605634055501409 0.27206105361013383 5 0.027640147947127488 0.63441751660579737 +0.48627752065658569 +1 1g 26 +-0.94841001437021122 0.26988516975283272 5 0.031417977089816598 0.63334247517432452 +0.48244968056678772 +1 1g 26 +-0.9331653304845996 0.26554705223408354 5 0.038949935531324358 0.63119913647929027 +0.47494369745254517 +1 1g 26 +-0.90277159875574253 0.25689803195511474 5 0.053966601405265567 0.62692590511616342 +0.46050664782524109 +1 1g 26 +-0.84217480741934647 0.23965425018509598 4.9999999999999991 0.083905727559611412 0.61840625009145056 +0.63761711120605469 +1 1g 26 +-0.90902414399497911 -0.41192123717307344 5.0000000000000009 0.050877399211966913 0.29648160218721675 +0.46158847212791443 +1 1g 26 +-0.90539218885792061 -0.41027542890351604 4.9999999999999991 0.052671843449643915 0.29729474856545651 +0.45976036787033081 +1 1g 26 +-0.89815106330128136 -0.40699413718258576 4.9999999999999991 0.056249474653517158 0.29891594012718098 +0.45614811778068542 +1 1g 26 +-0.88371423868524634 -0.40045213860535017 5.0000000000000009 0.063382293139700494 0.30214815286296931 +0.44907927513122559 +1 1g 26 +-0.85493115746894954 -0.38740918204298219 5 0.077603183068700801 0.30859230136216304 +0.43554392457008362 +1 1g 26 +-0.79754556289826095 -0.36140509263828807 4.9999999999999991 0.10595574955619512 0.32144017162139921 +0.57787853479385376 +1 1g 25 +0.74999999995172661 0 5 0.87055335965994396 0.5 +0.47871017456054688 +1 1g 26 +0.64278782707100324 -0.38642439014240371 5 0.81758291851334153 0.30907885862529461 +0.55299520492553711 +1 1g 27 +0.11367057722268131 0.74133595609646008 5 0.55616135238274766 0.86627270558125502 +0.58091360330581665 +1 1g 26 +-0.41318573166806566 0.62592136173285851 5 0.29585685194265532 0.80924968465062175 +0.62930130958557129 +1 1g 26 +-0.37077782264509396 -0.65193849875747689 4.9999999999999991 0.31680937616349114 0.17789599863761024 +0.55925559997558594 +1 1g 27 +0.21542590996913802 -0.71839520964546977 5 0.60643572626933695 0.14506165531350312 +0.58389085531234741 +1 1g 27 +-0.72136137282617341 0.20527486383366275 4.9999999999999991 0.14359615967086292 0.60142038726959623 +0.59208071231842041 +1 1g 26 +-0.68313437670576505 -0.30956004795582964 5 0.16248301546157856 0.34705531227478775 +0.53405076265335083 +g 1g 29 +0.58062502377700542 0.47473632859887793 0 0.78687007103606987 0.73455352203501878 +0.64761459827423096 +g 0 2j +0.29892046084178964 -0.099907664360389281 0 0.64768797472420436 0.45063850575079584 +0.75 +g 0 2h +-0.094962446336162076 0.3038130332250637 0 0.45308179528845749 0.65010525356969551 +0.75 +g 0 2d +-0.24597067354624769 -0.22242129936942839 0 0.37847298737833612 0.39010805367123103 +0.75 +g 1g 26 +0.99800000000000022 0 0 0.99308300395256921 0.5 +0.44985860586166382 +g 1g 26 +0.99401254680557294 0 0 0.99111291838220006 0.5 +0.44807776808738708 +g 1g 26 +0.98606265531669912 0 0 0.98718510638176837 0.5 +0.44456067681312561 +g 1g 26 +0.97021274521037038 0 0 0.97935412312765335 0.5 +0.43768492341041565 +g 1g 26 +0.9386123578679384 0 0 0.96374128353159016 0.5 +0.42454904317855835 +g 1g 26 +0.87560982514108066 0 0 0.93261354997088963 0.5 +0.61236846446990967 +g 1g 26 +0.81783496721354787 -0.5719702495784329 0 0.90406865969048811 0.21740600317271097 +0.45690900087356567 +g 1g 26 +0.8145673533332578 -0.56968497442933574 0 0.90245422595516689 0.21853509168511073 +0.45509973168373108 +g 1g 26 +0.80805262463069871 -0.56512876058262962 0 0.89923548647761797 0.22078618548289047 +0.45152544975280762 +g 1g 26 +0.79506403674277615 -0.55604491585385907 0 0.8928181999717274 0.22527425106034632 +0.4445335865020752 +g 1g 26 +0.76916834361037845 -0.53793421301315081 0 0.88002388518299335 0.2342222267721587 +0.4311574399471283 +g 1g 26 +0.71753941145903699 -0.50182642306539937 0 0.85451551949557158 0.25206204394002013 +0.60148227214813232 +g 1g 26 +0.77261836502233416 0.63171580796289639 0 0.88172844121656824 0.81211255334135191 +0.49036264419555664 +g 1g 26 +0.76953141154770355 0.62919182277609087 0 0.88020326657495229 0.81086552508700138 +0.48841860890388489 +g 1g 26 +0.76337687030097146 0.62415968637818409 0 0.87716248532656693 0.80837929168882616 +0.48457339406013489 +g 1g 26 +0.75110639772371413 0.61412698220087081 0 0.87109999887535283 0.80342242203600334 +0.47703218460083008 +g 1g 26 +0.7266424301860559 0.59412451304058567 0 0.85901305839232012 0.79353977917024987 +0.46252259612083435 +g 1g 26 +0.67786796743285838 0.5542450582657813 0 0.83491500367236082 0.77383649123803422 +0.69174498319625854 +g 1g 26 +0.15125764810071674 0.98647104564251642 0 0.57473203957545294 0.98738688025816024 +0.53048497438430786 +g 1g 26 +0.15065330662566595 0.9825296557405554 0 0.57443345189015116 0.98543955323149968 +0.52837949991226196 +g 1g 26 +0.14944841495305783 0.97467160186302659 0 0.57383814968036451 0.9815571155449736 +0.52421009540557861 +g 1g 26 +0.14704619037861788 0.95900479084506063 0 0.5726512798313329 0.97381659626732242 +0.51601302623748779 +g 1g 26 +0.14225681135207702 0.92776945302502312 0 0.57028498584588783 0.95838411710722482 +0.50015634298324585 +g 1g 26 +0.13270809900272518 0.8654947292402636 0 0.56556724259027924 0.92761597294479425 +0.6878020167350769 +g 1g 26 +-0.60754797290096074 0.79176351306683346 0 0.19982807662996005 0.89118750645594536 +0.50170218944549561 +g 1g 26 +-0.60512054894774292 0.78860006622373779 0 0.20102739676494918 0.88962453864809177 +0.49971252679824829 +g 1g 26 +-0.60028092924949872 0.7822930181137876 0 0.20341851321665089 0.88650840815898591 +0.49577558040618896 +g 1g 26 +-0.59063205073671066 0.76971848854707359 0 0.20818574568344339 0.88029569592246715 +0.48804870247840881 +g 1g 26 +-0.57139482501248251 0.7446483145024676 0 0.21769030384758772 0.86790924629568555 +0.47315716743469238 +g 1g 26 +-0.53304105642948796 0.6946652417129634 0 0.23663979425420553 0.84321405222972501 +0.62768250703811646 +g 1g 26 +-0.49338168936482957 -0.86751282906911931 0 0.25623434319919497 0.071386942159526109 +0.4861263632774353 +g 1g 26 +-0.49141041041359712 -0.86404673006964183 0 0.257208295250199 0.073099441665196621 +0.4841994047164917 +g 1g 26 +-0.48748021913799838 -0.85713627630580913 0 0.25915008935869638 0.07651369747736704 +0.48038843274116516 +g 1g 26 +-0.47964449225970091 -0.84335872083804098 0 0.26302149591912022 0.083320790099782133 +0.47291666269302368 +g 1g 26 +-0.46402219517393689 -0.81589004205736648 0 0.27074002214726439 0.096892271710787334 +0.45855003595352173 +g 1g 26 +-0.43287560596447777 -0.76112500658201965 0 0.28612865317960584 0.12395009556224319 +0.6385502815246582 +g 1g 26 +0.25179596549796701 -0.96571361788003496 0 0.62440512129346193 0.022868765869547954 +0.50999683141708374 +g 1g 26 +0.25078992879759754 -0.9618551631199973 0 0.62390806758774586 0.024775117035574411 +0.50797379016876221 +g 1g 26 +0.24878416667029798 -0.95416245924076515 0 0.62291707839441601 0.02857586005891051 +0.50396978855133057 +g 1g 26 +0.2447852253694171 -0.93882531091225196 0 0.62094131688212306 0.036153502513709572 +0.49610728025436401 +g 1g 26 +0.23681242973715524 -0.90824723036428545 0 0.61700218860531386 0.051261249820017091 +0.48093697428703308 +g 1g 26 +0.22091685503096628 -0.84728289788406597 0 0.60914864379000311 0.081381967448583989 +0.63571244478225708 +g 1g 26 +-0.95989153350247702 0.27315241882557645 0 0.025745289771503508 0.63495672866876307 +0.46503674983978271 +g 1g 26 +-0.95605634055501409 0.27206105361013383 0 0.027640147947127488 0.63441751660579737 +0.46319475769996643 +g 1g 26 +-0.94841001437021122 0.26988516975283272 0 0.031417977089816598 0.63334247517432452 +0.45955458283424377 +g 1g 26 +-0.9331653304845996 0.26554705223408354 0 0.038949935531324358 0.63119913647929027 +0.45242899656295776 +g 1g 26 +-0.90277159875574253 0.25689803195511474 0 0.053966601405265567 0.62692590511616342 +0.43877652287483215 +g 1g 26 +-0.84217480741934647 0.23965425018509598 0 0.083905727559611412 0.61840625009145056 +0.62076008319854736 +g 1g 26 +-0.90902414399497911 -0.41192123717307344 0 0.050877399211966913 0.29648160218721675 +0.46158847212791443 +g 1g 26 +-0.90539218885792061 -0.41027542890351604 0 0.052671843449643915 0.29729474856545651 +0.45976036787033081 +g 1g 26 +-0.89815106330128136 -0.40699413718258576 0 0.056249474653517158 0.29891594012718098 +0.45614811778068542 +g 1g 26 +-0.88371423868524634 -0.40045213860535017 0 0.063382293139700494 0.30214815286296931 +0.44907927513122559 +g 1g 26 +-0.85493115746894954 -0.38740918204298219 0 0.077603183068700801 0.30859230136216304 +0.43554392457008362 +g 1g 26 +-0.79754556289826095 -0.36140509263828807 0 0.10595574955619512 0.32144017162139921 +0.62641119956970215 +g 1g 26 +0.74999999995172661 0 0 0.87055335965994396 0.5 +0.57204043865203857 +g 1g 26 +0.61460543624317288 -0.42983736187996668 0 0.8036588123731091 0.28762976191701251 +0.55805295705795288 +g 1g 26 +0.11367057722268131 0.74133595609646008 0 0.55616135238274766 0.86627270558125502 +0.63739383220672607 +g 1g 26 +-0.45657412790219787 0.59501266008206799 0 0.27441989728152277 0.79397858699706914 +0.58028143644332886 +g 1g 26 +-0.37077782264509396 -0.65193849875747689 0 0.31680937616349114 0.17789599863761024 +0.59412038326263428 +g 1g 28 +0.18922542496124248 -0.72573668673688185 0 0.59349082260930952 0.14143444331181729 +0.58805394172668457 +g 1g 27 +-0.72136137282617341 0.20527486383366275 0 0.14359615967086292 0.60142038726959623 +0.58020204305648804 +g 1g 26 +-0.68313437670576505 -0.30956004795582964 0 0.16248301546157856 0.34705531227478775 +0.5858839750289917 +u 1g 38 +0.98023944602680879 0.18744233367373325 2.4053089699572121 +0.75 +u 1g 38 +0.97632295413265746 0.18669341831082925 2.4053089699572121 +0.75 +u 1g 38 +0.96851454007551652 0.18520028583274567 2.4053089699572121 +0.75 +u 1g 38 +0.9529466972877384 0.18222338789802706 2.4053089699572121 +0.75 +u 1g 38 +0.92190867506050578 0.17628826730838842 2.4053089699572121 +0.75 +u 1g 38 +0.86002734462116637 0.16445525953115603 2.4053089699572121 +0.53082263469696045 +u 1g 3c +0.73665289025329406 0.1408634772006529 2.4053089699572121 +0.50571924448013306 +u 1g 38 +0.94886312992167654 -0.30929397128822167 2.4639252948828121 +0.75 +u 1g 38 +0.94507200034404093 -0.30805820452085669 2.4639252948828121 +0.75 +u 1g 38 +0.93751352447162584 -0.30559442344880844 2.4639252948828121 +0.75 +u 1g 38 +0.92244399009039491 -0.30068231759575453 2.4639252948828121 +0.75 +u 1g 38 +0.8923994585869105 -0.29088892150819257 2.4639252948828121 +0.75 +u 1g 38 +0.83249887702759295 -0.27136356725137295 2.4639252948828121 +0.60741275548934937 +u 1g 3f +0.71307349438422118 -0.23243534914953465 2.4639252948828121 +0.58014398813247681 +u 1g 38 +0.99797510375049614 0.0070492761462674965 3.0143594289395681 +0.75 +u 1g 38 +0.99398775002764173 0.0070211111576023331 3.0143594289395681 +0.75 +u 1g 38 +0.98603805685788848 0.0069649578705903792 3.0143594289395681 +0.75 +u 1g 38 +0.97018854214566441 0.0068530035687536794 3.0143594289395681 +0.75 +u 1g 38 +0.93858894311097552 0.0066297972995093754 3.0143594289395681 +0.75 +u 1g 38 +0.87558798205423227 0.0061847850238521953 3.0143594289395681 +0.58470290899276733 +u 1g 3f +0.74998129034538741 0.005297552213787941 3.0143594289395681 +0.56141030788421631 +u 1g 38 +0.99782105987943936 -0.018897948594291763 1.864540581052246 +0.75 +u 1g 38 +0.99383432163025809 -0.018822442897407567 1.864540581052246 +0.75 +u 1g 38 +0.98588585554673669 -0.0186719051812884 1.864540581052246 +0.75 +u 1g 38 +0.9700387873089702 -0.018371774132777831 1.864540581052246 +0.75 +u 1g 38 +0.93844406587547691 -0.017773394878712715 1.864540581052246 +0.75 +u 1g 38 +0.87545282942196778 -0.01658039024466228 1.864540581052246 +0.59281277656555176 +u 1g 3e +0.74986552591323807 -0.014201865175156893 1.864540581052246 +0.56416356563568115 +u 1g 38 +0.86192364013223333 0.50308213900038246 1.9201627573229494 +0.75 +u 1g 38 +0.85847987242462054 0.50107210244505551 1.9201627573229494 +0.75 +u 1g 38 +0.85161394115132782 0.4970646391033286 1.9201627573229494 +0.75 +u 1g 38 +0.83792515135712375 0.48907485285156932 1.9201627573229494 +0.75 +u 1g 38 +0.81063344706075346 0.47314540349538564 1.9201627573229494 +0.75 +u 1g 38 +0.75622125032179233 0.44138643663499577 1.9201627573229494 +0.55654704570770264 +u 1g 3d +0.64773820647050828 0.3780677397054123 1.9201627573229494 +0.52251636981964111 +u 1g 38 +0.85488717061481867 0.51494846879876266 2.8548404941336742 +0.75 +u 1g 38 +0.85147151672770161 0.51289102098626072 2.8548404941336742 +0.75 +u 1g 38 +0.84466163672608041 0.50878903256009667 2.8548404941336742 +0.75 +u 1g 38 +0.83108459784301547 0.50061078913339119 2.8548404941336742 +0.75 +u 1g 38 +0.80401569431044628 0.48430560769508141 2.8548404941336742 +0.75 +u 1g 38 +0.75004770138015497 0.45179753378913029 2.8548404941336742 +0.52678990364074707 +u 1g 3g +0.64245027847679959 0.38698532221865134 2.8548404941336742 +0.49414288997650146 +u 1g 37 +0.77362622847233931 0.63048113264368499 2.3921407042042802 +0.75 +u 1g 37 +0.77053524813565133 0.62796208053307767 2.3921407042042802 +0.75 +u 1g 37 +0.76437267842693235 0.62293977934039291 2.3921407042042802 +0.75 +u 1g 37 +0.75208619929147658 0.61292668387331994 2.3921407042042802 +0.75 +u 1g 37 +0.72759031905300886 0.59296330912017792 2.3921407042042802 +0.75 +u 1g 37 +0.67875223109941774 0.55316179790469699 2.3921407042042802 +0.48229959607124329 +u 1g 39 +0.58138243618928775 0.47380846638509866 2.3921407042042802 +0.45161861181259155 +u 1g 38 +-0.24969388931938594 0.96625926212200342 2.394855498614481 +0.75 +u 1g 38 +-0.24869625134684534 0.96239862727090808 2.394855498614481 +0.75 +u 1g 38 +-0.24670723398660094 0.95470157688614965 2.394855498614481 +0.75 +u 1g 38 +-0.24274167717316214 0.93935576281396382 2.394855498614481 +0.75 +u 1g 38 +-0.23483544108144777 0.90876040514235268 2.394855498614481 +0.75 +u 1g 38 +-0.219072567901547 0.8477616268011996 2.394855498614481 +0.65051817893981934 +u 1g 3e +-0.1876457083942745 0.72614674002490809 2.394855498614481 +0.61051779985427856 +u 1g 38 +0.40005006853590525 0.91431063794774758 2.6968668955808361 +0.75 +u 1g 38 +0.3984516908568328 0.91065756091970806 2.6968668955808361 +0.75 +u 1g 38 +0.39526496276567358 0.90337432408723572 2.6968668955808361 +0.75 +u 1g 38 +0.38891149821224191 0.88885354110053028 2.6968668955808361 +0.75 +u 1g 38 +0.37624442694761157 0.85990306984756937 2.6968668955808361 +0.75 +u 1g 38 +0.3509897500585184 0.80218374530867465 2.6968668955808361 +0.59029960632324219 +u 1g 3f +0.30063882904069866 0.68710719280227861 2.6968668955808361 +0.5516284704208374 +u 1g 38 +-0.23069650987118309 0.97097019538874363 3.1014374063734849 +0.75 +u 1g 38 +-0.22977477486594358 0.96709073826720415 3.1014374063734849 +0.75 +u 1g 38 +-0.22793708727041478 0.95935616142124136 3.1014374063734849 +0.75 +u 1g 38 +-0.22427324063383955 0.9439355298452532 3.1014374063734849 +0.75 +u 1g 38 +-0.21696853214638806 0.91319100652637419 3.1014374063734849 +0.75 +u 1g 38 +-0.20240494055006436 0.8518948326668726 3.1014374063734849 +0.68223363161087036 +u 1g 3d +-0.17336912063351789 0.72968702053575751 3.1014374063734849 +0.63839125633239746 +u 1g 38 +-0.16987721185246013 0.98343567806605137 1.7372446562434833 +0.75 +u 1g 38 +-0.16919847695159693 0.97950641580551223 1.7372446562434833 +0.75 +u 1g 38 +-0.16784526512728887 0.97167254112924784 1.7372446562434833 +0.75 +u 1g 38 +-0.16514733072150201 0.95605393682794171 1.7372446562434833 +0.75 +u 1g 38 +-0.15976838713914718 0.92491471002107351 1.7372446562434833 +0.75 +u 1g 38 +-0.14904424425409513 0.86283160531955472 1.7372446562434833 +0.60509669780731201 +u 1g 3h +-0.12766323535184826 0.73905486823854227 1.7372446562434833 +0.56725007295608521 +u 1g 38 +-0.75434453052867445 0.65342813626402219 1.9912743861102713 +0.75 +u 1g 38 +-0.75133058913793782 0.65081740068358673 1.9912743861102713 +0.75 +u 1g 38 +-0.74532161402478325 0.64561230771858091 1.9912743861102713 +0.75 +u 1g 38 +-0.73334136051969268 0.63523477543327955 1.9912743861102713 +0.75 +u 1g 38 +-0.70945601046523254 0.61454481330263167 1.9912743861102713 +0.75 +u 1g 38 +-0.66183515277789906 0.57329468550741758 1.9912743861102713 +0.69093996286392212 +u 1g 3b +-0.5668921822245403 0.49105320858364088 1.9912743861102713 +0.65692734718322754 +u 1g 38 +0.38376903275492114 0.92126289923037308 2.0835244040267304 +0.75 +u 1g 38 +0.38223570504391829 0.91758204483113126 2.0835244040267304 +0.75 +u 1g 38 +0.37917866880424739 0.91024342751489229 2.0835244040267304 +0.75 +u 1g 38 +0.37308377434456974 0.89561223098473464 2.0835244040267304 +0.75 +u 1g 38 +0.36093222115310081 0.86644162531350044 2.0835244040267304 +0.75 +u 1g 38 +0.33670534635781385 0.808283412929932 2.0835244040267304 +0.57817363739013672 +u 1g 3g +0.28840358171108732 0.69233183805441645 2.0835244040267304 +0.54026037454605103 +u 1g 38 +-0.80900819575919836 0.58438834621717584 2.7411730889031443 +0.75 +u 1g 38 +-0.80577584875068353 0.58205345525734653 2.7411730889031443 +0.75 +u 1g 38 +-0.7993314325483839 0.57739832104914135 2.7411730889031443 +0.75 +u 1g 38 +-0.7864830285623452 0.56811725616464392 2.7411730889031443 +0.75 +u 1g 38 +-0.76086682380363502 0.54961335025395652 2.7411730889031443 +0.75 +u 1g 38 +-0.70979511505652593 0.51272162088748174 2.7411730889031443 +0.68917447328567505 +u 1g 3f +-0.6079720909622699 0.43916959883233631 2.7411730889031443 +0.65237540006637573 +u 1g 38 +-0.25221215458958124 -0.96560500675860228 2.5952687663826239 +0.75 +u 1g 38 +-0.25120445502896843 -0.96174698594822716 2.5952687663826239 +0.75 +u 1g 38 +-0.24919537761297428 -0.95405514724597873 2.5952687663826239 +0.75 +u 1g 38 +-0.24518982653284563 -0.9387197238438294 2.5952687663826239 +0.75 +u 1g 38 +-0.2372038528078956 -0.90814508232743307 2.5952687663826239 +0.75 +u 1g 38 +-0.22128200458781408 -0.8471876063359236 2.5952687663826239 +0.73829203844070435 +u 1g 3h +-0.18953819231464014 -0.72565506515264411 2.5952687663826239 +0.69407260417938232 +u 1g 39 +0.096970256709522418 -0.99327779060728472 1.7990199926683494 +0.75 +u 1g 39 +0.0965828174711649 -0.98930920473643247 1.7990199926683494 +0.75 +u 1g 39 +0.095810369556847352 -0.98139692953238844 1.7990199926683494 +0.75 +u 1g 39 +0.094270319605110314 -0.96562201601361242 1.7990199926683494 +0.75 +u 1g 39 +0.09119988105529471 -0.93417115136248485 1.7990199926683494 +0.75 +u 1g 39 +0.085078266053417492 -0.87146672600216801 1.7990199926683494 +0.74420046806335449 +u 1g 3g +0.072873439406273333 -0.74645124539831154 1.7990199926683494 +0.70191895961761475 +u 1g 38 +0.55234292433929155 -0.8312167550839672 2.5162782026441395 +0.75 +u 1g 38 +0.55013606907067836 -0.82789567501851535 2.5162782026441395 +0.75 +u 1g 38 +0.54573620302544346 -0.82127434936054833 2.5162782026441395 +0.75 +u 1g 38 +0.53696407306688176 -0.80807323628744687 2.5162782026441395 +0.75 +u 1g 38 +0.51947484425428336 -0.7817538260407807 2.5162782026441395 +0.75 +u 1g 38 +0.4846061036058521 -0.72928011780902724 2.5162782026441395 +0.70748043060302734 +u 1g 3g +0.41508736796373291 -0.62466189005295603 2.5162782026441395 +0.66897106170654297 +u 1g 38 +0.34174944745740982 -0.93766268730421121 3.2035612859464 +0.75 +u 1g 38 +0.34038400664983692 -0.93391630846875395 3.2035612859464 +0.75 +u 1g 38 +0.33766169099485804 -0.92644705334126498 3.2035612859464 +0.75 +u 1g 38 +0.33223413786751582 -0.9115554007322163 3.2035612859464 +0.75 +u 1g 38 +0.32141308083974401 -0.8818655168490912 3.2035612859464 +0.75 +u 1g 38 +0.29983885163351059 -0.82267200568312249 3.2035612859464 +0.70294022560119629 +u 1g 3i +0.25682573705066136 -0.70465632808907264 3.2035612859464 +0.66098129749298096 +u 1g 38 +0.77627541911984177 -0.62721644881995409 1.8646204161114863 +0.75 +u 1g 38 +0.77317385409005757 -0.62471044057101188 1.8646204161114863 +0.75 +u 1g 38 +0.76699018139718922 -0.6197141452722591 1.8646204161114863 +0.75 +u 1g 38 +0.75466162868095443 -0.60975289844760261 1.8646204161114863 +0.75 +u 1g 38 +0.7300818652254476 -0.58989289571187586 1.8646204161114863 +0.75 +u 1g 38 +0.68107653707098581 -0.55029748003692336 1.8646204161114863 +0.65613967180252075 +u 1g 3g +0.58337331092425659 -0.47135504667804384 1.8646204161114863 +0.62059104442596436 +u 1g 38 +0.89409897491816492 -0.44338586248355599 3.1396268669942362 +0.75 +u 1g 38 +0.8905266524595763 -0.44161433906299097 3.1396268669942362 +0.75 +u 1g 38 +0.88340441816006476 -0.43808240570182377 3.1396268669942362 +0.75 +u 1g 38 +0.86920463020554195 -0.43104069622007879 3.1396268669942362 +0.75 +u 1g 38 +0.84089413528581702 -0.41700145273647288 3.1396268669942362 +0.75 +u 1g 38 +0.78445074858408204 -0.38901103959845063 3.1396268669942362 +0.67451578378677368 +u 1g 3h +0.67191806728002268 -0.33320580845817965 3.1396268669942362 +0.64279049634933472 +u 1g 38 +-0.43737417095606418 -0.89705509004770445 3.2693354330215518 +0.75 +u 1g 38 +-0.43562666691283908 -0.89347095659641407 3.2693354330215518 +0.75 +u 1g 38 +-0.43214262162312289 -0.88632517440661351 3.2693354330215518 +0.75 +u 1g 38 +-0.42519638786311914 -0.87207843839691324 3.2693354330215518 +0.75 +u 1g 38 +-0.41134749686533689 -0.84367434189089352 3.2693354330215518 +0.75 +u 1g 38 +-0.38373659454114689 -0.7870443392170211 3.2693354330215518 +0.67236781120300293 +u 1g 3b +-0.32868800420434352 -0.67413959668584644 3.2693354330215518 +0.63029599189758301 +u 1g 38 +-0.87604992411434113 -0.47805912862245092 2.7649889236901668 +0.75 +u 1g 38 +-0.87254971562898309 -0.4761490701058671 2.7649889236901668 +0.75 +u 1g 38 +-0.86557125687593206 -0.47234093563911966 2.7649889236901668 +0.75 +u 1g 38 +-0.85165811805241642 -0.46474855666699966 2.7649889236901668 +0.75 +u 1g 38 +-0.82391912312924875 -0.44961142877415899 2.7649889236901668 +0.75 +u 1g 38 +-0.76861515117095724 -0.41943213428877923 2.7649889236901668 +0.69253575801849365 +u 1g 3g +-0.65835415134615849 -0.35926287218813702 2.7649889236901668 +0.65565139055252075 +u 1g 38 +-0.99610448659455864 0.061480499235050549 3.0561805742064481 +0.75 +u 1g 38 +-0.99212460681795078 0.061234857338187045 3.0561805742064481 +0.75 +u 1g 38 +-0.98418981465361532 0.060745114555020283 3.0561805742064481 +0.75 +u 1g 38 +-0.96837000847221788 0.059768701342427316 3.0561805742064481 +0.75 +u 1g 38 +-0.93682964012560221 0.057822000350609984 3.0561805742064481 +0.75 +u 1g 38 +-0.8739467688670417 0.053940810806401743 3.0561805742064481 +0.66254991292953491 +u 1g 3d +-0.7485755159296934 0.046202779983286583 3.0561805742064481 +0.63441425561904907 +u 1g 39 +-0.99777447721031787 0.021215386578542966 2.1980317040704072 +0.75 +u 1g 39 +-0.99378792507958624 0.02113062168777782 2.1980317040704072 +0.75 +u 1g 39 +-0.98583983006536824 0.020961623670549445 2.1980317040704072 +0.75 +u 1g 39 +-0.9699935016383413 0.020624687828724876 2.1980317040704072 +0.75 +u 1g 39 +-0.93840025518519632 0.019952929879324691 2.1980317040704072 +0.75 +u 1g 39 +-0.87541195943923811 0.018613628188715901 2.1980317040704072 +0.7726973295211792 +u 1g 3n +-0.74983051889736729 0.015943426786456064 2.1980317040704072 +0.74118232727050781 +u 1g 38 +-0.91109862809599307 -0.40731227563332645 3.4637156817522845 +0.75 +u 1g 38 +-0.90745838447370897 -0.40568488221188004 3.4637156817522845 +0.75 +u 1g 38 +-0.9002007339436241 -0.40244030466341202 3.4637156817522845 +0.75 +u 1g 38 +-0.88573096304851273 -0.39597150410830934 3.4637156817522845 +0.75 +u 1g 38 +-0.85688219595934256 -0.38307448438953123 3.4637156817522845 +0.75 +u 1g 38 +-0.79936564171684477 -0.35736135315141548 3.4637156817522845 +0.60032397508621216 +u 1g 3f +-0.68469335774350026 -0.3060963995043412 3.4637156817522845 +0.56735002994537354 +u 1g 38 +-0.73450293479301509 -0.67565482221356776 2.0035848148458832 +0.75 +u 1g 38 +-0.73156826938854969 -0.67295528115227965 2.0035848148458832 +0.75 +u 1g 38 +-0.72571734891774442 -0.66757313433811927 2.0035848148458832 +0.75 +u 1g 38 +-0.71405221315691869 -0.65684260508461956 2.0035848148458832 +0.75 +u 1g 38 +-0.69079512173045343 -0.63544886350973895 2.0035848148458832 +0.75 +u 1g 38 +-0.64442683997968198 -0.59279559191798603 2.0035848148458832 +0.74621683359146118 +u 1g 3d +-0.55198116338607672 -0.5077566298873345 2.0035848148458832 +0.70554983615875244 +u 1g 39 +0.99750621200746858 -0.031564532952037913 4.4584566159028931 +0.75 +u 1g 39 +0.99354106951963606 -0.031143310885981577 4.4584566159028931 +0.75 +u 1g 39 +0.98563565947990284 -0.030303509249551813 4.4584566159028931 +0.75 +u 1g 39 +0.96987443322180766 -0.028629174390618316 4.4584566159028931 +0.75 +u 1g 39 +0.93845085722634258 -0.025291008449720782 4.4584566159028931 +0.75 +u 1g 39 +0.87580083798462216 -0.018635618227440934 4.4584566159028931 +0.69399011135101318 +u 1g 3b +0.75089382830646267 -0.0053665897264465138 4.4584566159028931 +0.64637976884841919 +u 1g 38 +0.77405571078881741 -0.62995428581670898 3.843737050034318 +0.75 +u 1g 38 +0.77100882733039822 -0.62738207195146389 3.843737050034318 +0.75 +u 1g 38 +0.76493417474073799 -0.62225378075460336 3.843737050034318 +0.75 +u 1g 38 +0.7528229783039001 -0.61202937019716619 3.843737050034318 +0.75 +u 1g 38 +0.72867656384369817 -0.59164469092797256 3.843737050034318 +0.75 +u 1g 38 +0.68053521510705139 -0.55100321369331329 3.843737050034318 +0.69281136989593506 +u 1g 3b +0.58455452770506533 -0.46997521958052368 3.843737050034318 +0.65164560079574585 +u 1g 39 +0.9973668105476825 0.035544974580714095 3.7958999395181774 +0.75 +u 1g 39 +0.99338188722630583 0.035402956622359691 3.7958999395181774 +0.75 +u 1g 39 +0.98543703961262052 0.035119811641506543 3.7958999395181774 +0.75 +u 1g 39 +0.96959718561440733 0.03455529796231209 3.7958999395181774 +0.75 +u 1g 39 +0.93801684740219016 0.033429812025611232 3.7958999395181774 +0.75 +u 1g 39 +0.87505428715949285 0.031185900778820903 3.7958999395181774 +0.70904046297073364 +u 1g 3i +0.74952415617496593 0.02671215524430838 3.7958999395181774 +0.66927486658096313 +u 1g 38 +0.63274486883889802 0.77177807698810319 3.8694461665463225 +0.75 +u 1g 38 +0.63034763342833211 0.7685916926164249 3.8694461665463225 +0.75 +u 1g 38 +0.62556820143050462 0.76223891334566418 3.8694461665463225 +0.75 +u 1g 38 +0.61603932073686252 0.74957320834732155 3.8694461665463225 +0.75 +u 1g 38 +0.59704133785627334 0.72432125541966497 3.8694461665463225 +0.75 +u 1g 38 +0.55916455409383481 0.67397576523621128 3.8694461665463225 +0.64646625518798828 +u 1g 3g +0.48364860288975431 0.57360062240770515 3.8694461665463225 +0.60127997398376465 +u 1g 38 +0.70191757964110002 0.70944831931519892 4.4456282694171652 +0.75 +u 1g 38 +0.69904420708977033 0.70668362888786118 4.4456282694171652 +0.75 +u 1g 38 +0.69331548781048102 0.70117159204981638 4.4456282694171652 +0.75 +u 1g 38 +0.6818939878153919 0.69018209760098548 4.4456282694171652 +0.75 +u 1g 38 +0.65912263949510796 0.6682720502284204 4.4456282694171652 +0.75 +u 1g 38 +0.61372279669454366 0.62458940603552837 4.4456282694171652 +0.68255525827407837 +u 1g 3c +0.52320792259374382 0.53749815647154287 4.4456282694171652 +0.63372790813446045 +u 1g 37 +0.8964504194514713 0.43861218116381728 3.3664680364565225 +0.75 +u 1g 37 +0.89286870192773649 0.43685973072003342 3.3664680364565225 +0.75 +u 1g 37 +0.88572773643696057 0.43336582365996279 3.3664680364565225 +0.75 +u 1g 37 +0.8714906036082164 0.42639992822610773 3.3664680364565225 +0.75 +u 1g 37 +0.84310565321948683 0.41251183722622237 3.3664680364565225 +0.75 +u 1g 37 +0.78651382266888914 0.38482278081522864 3.3664680364565225 +0.54369848966598511 +u 1g 3f +0.67368518491515939 0.3296183725968837 3.3664680364565225 +0.51030659675598145 +u 1g 38 +0.92830854487718917 0.36639766034732779 1.3115861201496712 +0.75 +u 1g 38 +0.92459953999473976 0.36493373898341741 1.3115861201496712 +0.75 +u 1g 38 +0.91720479831140533 0.3620150800239601 1.3115861201496712 +0.75 +u 1g 38 +0.90246170513781765 0.3561960720282944 1.3115861201496712 +0.75 +u 1g 38 +0.87306800815243824 0.34459456101793728 1.3115861201496712 +0.75 +u 1g 38 +0.81446501268225124 0.32146431994872232 1.3115861201496712 +0.63627201318740845 +u 1g 3f +0.69762666193695344 0.27534894312906694 1.3115861201496712 +0.59998011589050293 +u 1g 38 +0.96782449497117617 -0.24355645533179354 1.2310765484607151 +0.75 +u 1g 38 +0.96395760631975569 -0.24258333913356098 1.2310765484607151 +0.75 +u 1g 38 +0.95624808756695545 -0.24064321148696535 1.2310765484607151 +0.75 +u 1g 38 +0.94087741497778077 -0.2367751273959583 1.2310765484607151 +0.75 +u 1g 38 +0.91023249621968172 -0.22906322526345888 1.2310765484607151 +0.75 +u 1g 38 +0.84913490662221081 -0.21368780086678679 1.2310765484607151 +0.63582652807235718 +u 1g 3b +0.72732301721609449 -0.18303340830369533 1.2310765484607151 +0.60355931520462036 +u 1g 38 +0.91749714599362575 -0.39268965657141253 0.57816179575675541 +0.75 +u 1g 38 +0.91388523455012594 -0.39100031388798145 0.57816179575675541 +0.75 +u 1g 38 +0.90668407063844025 -0.38763222644821682 0.57816179575675541 +0.75 +u 1g 38 +0.89232691861681812 -0.38091718093781712 0.57816179575675541 +0.75 +u 1g 38 +0.86370268277107154 -0.36752921610223366 0.57816179575675541 +0.75 +u 1g 38 +0.80663378244049277 -0.34083727452697105 0.57816179575675541 +0.63993561267852783 +u 1g 3c +0.6928539979776881 -0.28762084067709953 0.57816179575675541 +0.60787051916122437 +u 1g 38 +0.60682346438230061 -0.79231892762640865 1.2554152984217657 +0.75 +u 1g 38 +0.60439893516235621 -0.78915326165549782 1.2554152984217657 +0.75 +u 1g 38 +0.59956508677083153 -0.78284178921139902 1.2554152984217657 +0.75 +u 1g 38 +0.58992771466575078 -0.77025843873201871 1.2554152984217657 +0.75 +u 1g 38 +0.57071342957260729 -0.74517067819921823 1.2554152984217657 +0.75 +u 1g 38 +0.53240539833596301 -0.69515254276044913 1.2554152984217657 +0.65200787782669067 +u 1g 3c +0.45602965757257735 -0.5954300557931449 1.2554152984217657 +0.61871522665023804 +u 1g 38 +0.97891862400293217 0.19422869572472715 0.68036559256409335 +0.75 +u 1g 38 +0.97503708722746485 0.19331575802781586 0.68036559256409335 +0.75 +u 1g 38 +0.96729836412015302 0.1914956098598849 0.68036559256409335 +0.75 +u 1g 38 +0.95186946603263434 0.18786673204661145 0.68036559256409335 +0.75 +u 1g 38 +0.92110846154985071 0.18063174183224995 0.68036559256409335 +0.75 +u 1g 38 +0.85977942875551949 0.16620714941129758 0.68036559256409335 +0.66299885511398315 +u 1g 3h +0.73750610489207835 0.13744845584767965 0.68036559256409335 +0.62786972522735596 +u 1g 38 +0.45897377518399307 0.88619810070511496 1.5043317087326891 +0.75 +u 1g 38 +0.45713997112986915 0.8826573457476482 1.5043317087326891 +0.75 +u 1g 38 +0.4534838672130842 0.87559804841473088 1.5043317087326891 +0.75 +u 1g 38 +0.44619459559201335 0.86152373956445483 1.5043317087326891 +0.75 +u 1g 38 +0.43166178088677037 0.83346341567226123 1.5043317087326891 +0.75 +u 1g 38 +0.40268732167655102 0.77751880160196762 1.5043317087326891 +0.61902463436126709 +u 1g 3e +0.34492017170925726 0.66598053655917511 1.5043317087326891 +0.58069127798080444 +u 1g 39 +0.54976544428242879 0.8329273110582136 0.7505134489184756 +0.75 +u 1g 39 +0.5477539734285537 0.82948438091344479 0.7505134489184756 +0.75 +u 1g 39 +0.54374365048766293 0.82262011951147085 0.7505134489184756 +0.75 +u 1g 39 +0.53574816297699335 0.80893465898412886 0.7505134489184756 +0.75 +u 1g 39 +0.51980734686928243 0.7816495923356509 0.7505134489184756 +0.75 +u 1g 39 +0.4880257178140488 0.7272506292518357 0.7505134489184756 +0.74119299650192261 +u 1g 3i +0.42466183866385421 0.61879396969079459 0.7505134489184756 +0.70031082630157471 +u 1g 38 +-0.95790635454136497 0.28003466915593372 1.3264049653739971 +0.75 +u 1g 38 +-0.95407909326543505 0.27891580629413393 1.3264049653739971 +0.75 +u 1g 38 +-0.94644858066512816 0.27668509964792926 1.3264049653739971 +0.75 +u 1g 38 +-0.93123542474352305 0.27223768047680991 1.3264049653739971 +0.75 +u 1g 38 +-0.90090455115506196 0.26337074258639176 1.3264049653739971 +0.75 +u 1g 38 +-0.84043308176502474 0.24569249267842436 1.3264049653739971 +0.70239078998565674 +u 1g 3c +-0.71986950486952161 0.21044689564472152 1.3264049653739971 +0.67587006092071533 +u 1g 38 +-0.61990136662875828 0.78212933435065446 1.2449346419094229 +0.75 +u 1g 38 +-0.61742458538167055 0.77900438032990127 1.2449346419094229 +0.75 +u 1g 38 +-0.61248656073387187 0.77277407638365614 1.2449346419094229 +0.75 +u 1g 38 +-0.60264148965585962 0.7603525536973027 1.2449346419094229 +0.75 +u 1g 38 +-0.58301310959616848 0.73558743353962819 1.2449346419094229 +0.75 +u 1g 38 +-0.54387948621094595 0.68621255479808263 1.2449346419094229 +0.6561698317527771 +u 1g 3i +-0.46585774042248912 0.58777254581686877 1.2449346419094229 +0.62483978271484375 +u 1g 38 +-0.2866473490105515 0.95594845669668893 0.55276342291556702 +0.75 +u 1g 38 +-0.28553575286820826 0.95211907854951217 0.55276342291556702 +0.75 +u 1g 38 +-0.28331953407385851 0.94448434548669757 0.55276342291556702 +0.75 +u 1g 38 +-0.27890099971831883 0.92926277511673827 0.55276342291556702 +0.75 +u 1g 38 +-0.27009165025297754 0.89891512541879248 0.55276342291556702 +0.75 +u 1g 38 +-0.25252821591977753 0.83841020905307784 0.55276342291556702 +0.67777490615844727 +u 1g 3a +-0.21751152975126276 0.71777994803257028 0.55276342291556702 +0.63904458284378052 +u 1g 37 +-0.051499027358368844 0.99667038191226587 1.2045472980673066 +0.75 +u 1g 37 +-0.051293265874250593 0.99268824113255949 1.2045472980673066 +0.75 +u 1g 37 +-0.050883033730681891 0.98474894114621014 1.2045472980673066 +0.75 +u 1g 37 +-0.050065142995017041 0.96892014760016809 1.2045472980673066 +0.75 +u 1g 37 +-0.048434492481707461 0.93736186090562168 1.2045472980673066 +0.75 +u 1g 37 +-0.045183421182562203 0.87444326536021366 1.2045472980673066 +0.5982816219329834 +u 1g 38 +-0.03870167386401864 0.74900078796201097 1.2045472980673066 +0.56343621015548706 +u 1g 38 +-0.85388329429985177 0.51661786061868675 0.62943873371013692 +0.75 +u 1g 38 +-0.85059700134822969 0.51435952901906146 0.62943873371013692 +0.75 +u 1g 38 +-0.84404503168434519 0.5098570332435608 0.62943873371013692 +0.75 +u 1g 38 +-0.83098219550132235 0.50088028766210335 0.62943873371013692 +0.75 +u 1g 38 +-0.80493847156818588 0.48298311123993237 0.62943873371013692 +0.75 +u 1g 38 +-0.7530144064722043 0.44730103459202658 0.62943873371013692 +0.65233582258224487 +u 1g 3e +-0.64949201685489732 0.37616072933528377 0.62943873371013692 +0.62184661626815796 +u 1g 38 +-0.002508829073465372 0.99799706411590006 4.4060359318539426 +0.75 +u 1g 38 +-0.0025576751050739588 0.99400991011298734 4.4060359318539426 +0.75 +u 1g 38 +-0.0026550607374603331 0.98606061513019361 4.4060359318539426 +0.75 +u 1g 38 +-0.0028492210629355095 0.97021189429390153 4.4060359318539426 +0.75 +u 1g 38 +-0.0032363236679590112 0.93861387803077323 4.4060359318539426 +0.75 +u 1g 38 +-0.0040081004274450235 0.87561607258778751 4.4060359318539426 +0.68216228485107422 +u 1g 3d +-0.0055468122799435795 0.75001567231002153 4.4060359318539426 +0.63438069820404053 +u 1g 38 +-0.092292705883711107 0.99372332992672707 3.8264401481430177 +0.75 +u 1g 38 +-0.091923955538121604 0.98975296392843737 3.8264401481430177 +0.75 +u 1g 38 +-0.091188768166388115 0.98183713963697483 3.8264401481430177 +0.75 +u 1g 38 +-0.089723005549427526 0.96605515020821686 3.8264401481430177 +0.75 +u 1g 38 +-0.086800675634791824 0.93459017812715883 3.8264401481430177 +0.75 +u 1g 38 +-0.080974348758149794 0.87185762640857112 3.8264401481430177 +0.71029049158096313 +u 1g 3d +-0.06935824590012836 0.74678606953614746 3.8264401481430177 +0.66228967905044556 +u 1g 38 +-0.80831182313920202 0.5853511737182896 3.4700621749266864 +0.75 +u 1g 38 +-0.80508225844855108 0.58301243583501838 3.4700621749266864 +0.75 +u 1g 38 +-0.79864338942737856 0.57834963191322963 3.4700621749266864 +0.75 +u 1g 38 +-0.78580604500389239 0.56905327571676767 3.4700621749266864 +0.75 +u 1g 38 +-0.76021188998919675 0.5505188831107104 3.4700621749266864 +0.75 +u 1g 38 +-0.70918414240319128 0.51356637160881558 3.4700621749266864 +0.70192885398864746 +u 1g 3h +-0.60744876484507193 0.43989316659364774 3.4700621749266864 +0.66285836696624756 +u 1g 38 +0.4948328258425701 0.86668591454381949 3.285916524538977 +0.75 +u 1g 38 +0.49285574895668499 0.86322311943508934 3.285916524538977 +0.75 +u 1g 38 +0.48891399818455966 0.85631925272611287 3.285916524538977 +0.75 +u 1g 38 +0.48105522483058627 0.84255483004480924 3.285916524538977 +0.75 +u 1g 38 +0.46538697937329626 0.81511233444980458 3.285916524538977 +0.75 +u 1g 38 +0.43414878167342658 0.76039950108812771 3.285916524538977 +0.61547887325286865 +u 1g 3h +0.37186835607018087 0.65131707000603911 3.285916524538977 +0.57595008611679077 +u 1g 39 +-0.80382992448275048 0.59149669317578191 4.2947010070171538 +0.75 +u 1g 39 +-0.80076271218803552 0.5889487544565627 4.2947010070171538 +0.75 +u 1g 39 +-0.79464752945676187 0.58386886126398507 4.2947010070171538 +0.75 +u 1g 39 +-0.78245552699860044 0.57374094309493895 4.2947010070171538 +0.75 +u 1g 39 +-0.75814800742447097 0.55354864326690922 4.2947010070171538 +0.75 +u 1g 39 +-0.70968545913723957 0.51329071804085546 4.2947010070171538 +0.74144315719604492 +u 1g 3h +-0.61306438764823989 0.43302742176903736 4.2947010070171538 +0.69727271795272827 +u 1g 37 +0.10644389901152801 -0.99230729236260073 1.1055054178368329 +0.75 +u 1g 37 +0.10599577488635095 -0.98834510007219112 1.1055054178368329 +0.75 +u 1g 37 +0.1051023378991324 -0.98044557191952697 1.1055054178368329 +0.75 +u 1g 37 +0.10332106881478041 -0.96469607253612299 1.1055054178368329 +0.75 +u 1g 37 +0.099769705264513606 -0.93329587672263203 1.1055054178368329 +0.75 +u 1g 37 +0.092689257297971908 -0.87069247117156112 1.1055054178368329 +0.57814764976501465 +u 1g 3o +0.078572779866891027 -0.74587839644824383 1.1055054178368329 +0.54788017272949219 +u 1g 38 +-0.49236224009515361 -0.86809182954828101 1.252467032435715 +0.75 +u 1g 38 +-0.49039503429647352 -0.86462341718476565 1.252467032435715 +0.75 +u 1g 38 +-0.48647296377345228 -0.85770835120552058 1.252467032435715 +0.75 +u 1g 38 +-0.47865342745555756 -0.8439216002412131 1.252467032435715 +0.75 +u 1g 38 +-0.46306340992069345 -0.81643458815451353 1.252467032435715 +0.75 +u 1g 38 +-0.43198117731040908 -0.76163300107932996 1.252467032435715 +0.68321496248245239 +u 1g 3b +-0.37001170345450635 -0.65237361935802129 1.252467032435715 +0.64574819803237915 +u 1g 38 +-0.18653552233442325 -0.98041269206172221 0.61645489224013539 +0.75 +u 1g 38 +-0.18585529239855544 -0.97648368834422627 0.61645489224013539 +0.75 +u 1g 38 +-0.18449909988319493 -0.9686503291321038 0.61645489224013539 +0.75 +u 1g 38 +-0.18179522279437874 -0.95303275252536734 0.61645489224013539 +0.75 +u 1g 38 +-0.17640443112680951 -0.92189557466049654 0.61645489224013539 +0.75 +u 1g 38 +-0.16565666639913945 -0.85981655498913412 0.61645489224013539 +0.63549381494522095 +u 1g 3e +-0.14422856200098988 -0.7360479623413948 0.61645489224013539 +0.5998833179473877 +u 1g 38 +0.4772294625366002 -0.87650224421430423 0.5947198252453566 +0.75 +u 1g 38 +0.47535256549462757 -0.87298414238638888 0.5947198252453566 +0.75 +u 1g 38 +0.47161054594181523 -0.86597000920036837 0.5947198252453566 +0.75 +u 1g 38 +0.46414998203208008 -0.85198574531100091 0.5947198252453566 +0.75 +u 1g 38 +0.44927565733502955 -0.8241049464523158 0.5947198252453566 +0.75 +u 1g 38 +0.41962032057092935 -0.76851825621619385 0.5947198252453566 +0.62452805042266846 +u 1g 3c +0.36049568691501765 -0.65769359344136613 0.5947198252453566 +0.59119969606399536 +u 1g 38 +-0.53645659507706056 -0.84155973178860177 3.8885220601809012 +0.75 +u 1g 38 +-0.53415655158949671 -0.83830249631460518 3.8885220601809012 +0.75 +u 1g 38 +-0.52957089371359278 -0.83180845931671055 3.8885220601809012 +0.75 +u 1g 38 +-0.5204283456406813 -0.81886112503071906 3.8885220601809012 +0.75 +u 1g 38 +-0.50220060438141401 -0.79304768030172279 3.8885220601809012 +0.75 +u 1g 38 +-0.46585947182568582 -0.74158272897982069 3.8885220601809012 +0.61064404249191284 +u 1g 3a +-0.39340518927646684 -0.63897568670504312 3.8885220601809012 +0.57441073656082153 +u 1g 38 +-0.13076450383279964 -0.98939756687372626 4.4419707046573302 +0.75 +u 1g 38 +-0.13009159920784516 -0.98546730195346166 4.4419707046573302 +0.75 +u 1g 38 +-0.12875001135968542 -0.97763142824783489 4.4419707046573302 +0.75 +u 1g 38 +-0.12607525198431083 -0.96200883842852025 4.4419707046573302 +0.75 +u 1g 38 +-0.12074251307648018 -0.93086166558839478 4.4419707046573302 +0.75 +u 1g 38 +-0.11011048967994261 -0.86876271866902877 4.4419707046573302 +0.64273172616958618 +u 1g 3d +-0.088913141852068778 -0.74495439653693551 4.4419707046573302 +0.60182327032089233 +u 1g 38 +0.12886621623562639 -0.98964641379123097 3.8471832513078259 +0.75 +u 1g 38 +0.12849244786283756 -0.98567651704430537 3.8471832513078259 +0.75 +u 1g 38 +0.12774725591681127 -0.97776162831176827 3.8471832513078259 +0.75 +u 1g 38 +0.1262615469139893 -0.96198150413172323 3.8471832513078259 +0.75 +u 1g 38 +0.12329944935934352 -0.93052025084663459 3.8471832513078259 +0.75 +u 1g 38 +0.11739383668110498 -0.86779511339048077 3.8471832513078259 +0.66495233774185181 +u 1g 3f +0.10561965961165917 -0.74273833853027027 3.8471832513078259 +0.62381136417388916 +u 1g 37 +-0.91578758137137506 -0.39665828458184671 4.002826274497771 +0.75 +u 1g 37 +-0.91215870875571137 -0.39500569070643937 4.002826274497771 +0.75 +u 1g 37 +-0.90492372890396289 -0.39171087034264757 4.002826274497771 +0.75 +u 1g 37 +-0.89049915714322758 -0.38514189935031495 4.002826274497771 +0.75 +u 1g 37 +-0.86174050477043407 -0.3720451671665771 4.002826274497771 +0.75 +u 1g 37 +-0.80440361463477661 -0.34593386387527603 4.002826274497771 +0.50968843698501587 +u 1g 3e +-0.69008953176980437 -0.29387506401549912 4.002826274497771 +0.48126009106636047 +u 1g 38 +-0.77199276238665515 -0.6324826001607633 4.4624570156153904 +0.75 +u 1g 38 +-0.76900978653177521 -0.62983653930980943 4.4624570156153904 +0.75 +u 1g 38 +-0.76306254823105524 -0.62456101741341719 4.4624570156153904 +0.75 +u 1g 38 +-0.7512053810509427 -0.61404306909439743 4.4624570156153904 +0.75 +u 1g 38 +-0.72756543147634467 -0.59307315578265007 4.4624570156153904 +0.75 +u 1g 38 +-0.68043383525268109 -0.5512648818717566 4.4624570156153904 +0.58349370956420898 +u 1g 3c +-0.58646631829243256 -0.46791061419201829 4.4624570156153904 +0.54956495761871338 +u 1g 38 +-0.99625005495016083 0.059074766286480715 3.8004408249168709 +0.75 +u 1g 38 +-0.992269593563328 0.058838736361090875 3.8004408249168709 +0.75 +u 1g 38 +-0.98433364182721772 0.058368157221102814 3.8004408249168709 +0.75 +u 1g 38 +-0.96851152377673144 0.057429951073614725 3.8004408249168709 +0.75 +u 1g 38 +-0.93696654619522413 0.055559424523698456 3.8004408249168709 +0.75 +u 1g 38 +-0.87407448538246746 0.051830105990336266 3.8004408249168709 +0.61142361164093018 +u 1g 3g +-0.74868491098650169 0.044394864440890594 3.8004408249168709 +0.58164620399475098 +u 1g 38 +-0.99623561102613667 -0.059342346493900411 4.4415602360829727 +0.75 +u 1g 38 +-0.99226717270452769 -0.058953398855609164 4.4415602360829727 +0.75 +u 1g 38 +-0.9843551916733343 -0.0581779436042245 4.4415602360829727 +0.75 +u 1g 38 +-0.96858086465479487 -0.056631897844589975 4.4415602360829727 +0.75 +u 1g 38 +-0.93713116932478813 -0.053549505293097356 4.4415602360829727 +0.75 +u 1g 38 +-0.87442907527109071 -0.047404057280133562 4.4415602360829727 +0.59134036302566528 +u 1g 3b +-0.7494182426552477 -0.035151714124894394 4.4415602360829727 +0.55726224184036255 +u 1g 38 +-0.94904210516672671 -0.30874436451651655 1.3422852959039804 +0.75 +u 1g 38 +-0.94525026050350736 -0.3075107936722753 1.3422852959039804 +0.75 +u 1g 38 +-0.93769035894594466 -0.30505139067056436 1.3422852959039804 +0.75 +u 1g 38 +-0.92261798213831558 -0.30014801349278636 1.3422852959039804 +0.75 +u 1g 38 +-0.89256778361372069 -0.29037201999728041 1.3422852959039804 +0.75 +u 1g 38 +-0.83265590356368813 -0.27088136175110339 1.3422852959039804 +0.71731328964233398 +u 1g 3h +-0.71320799481886954 -0.23202231800850037 1.3422852959039804 +0.68698960542678833 +u 1g 38 +-0.99703398683742195 -0.043900580496358144 0.6525293720618347 +0.75 +u 1g 38 +-0.99305112689149477 -0.043709244067845453 0.6525293720618347 +0.75 +u 1g 38 +-0.98511039308432313 -0.043327771541303843 0.6525293720618347 +0.75 +u 1g 38 +-0.96927874089157218 -0.042567219619031586 0.6525293720618347 +0.75 +u 1g 38 +-0.93771475483705014 -0.041050887023035484 0.6525293720618347 +0.75 +u 1g 38 +-0.87478479632607165 -0.038027734396176169 0.6525293720618347 +0.6554219126701355 +u 1g 3g +-0.74931966428118779 -0.032000394596570704 0.6525293720618347 +0.62641894817352295 +u 1g 38 +-0.79047785014399108 -0.60922550929314145 0.64395609877361104 +0.75 +u 1g 38 +-0.787468804876302 -0.60660913211185707 0.64395609877361104 +0.75 +u 1g 38 +-0.78146959129389071 -0.60139279133718782 0.64395609877361104 +0.75 +u 1g 38 +-0.76950879961227259 -0.59099283399460023 0.64395609877361104 +0.75 +u 1g 38 +-0.74566225111289974 -0.57025816243079686 0.64395609877361104 +0.75 +u 1g 38 +-0.6981187531179569 -0.52891889624955424 0.64395609877361104 +0.66395998001098633 +u 1g 3e +-0.6033300166408696 -0.44649970175471976 0.64395609877361104 +0.63165879249572754 +u 1g 38 +0.62551958944271957 -0.77765264514406374 4.4320819641881819 +0.75 +u 1g 38 +0.62329327651602273 -0.77434457716861793 4.4320819641881819 +0.75 +u 1g 38 +0.61885461722034696 -0.76774919406058129 4.4320819641881819 +0.75 +u 1g 38 +0.61000514412658891 -0.75459980333927568 4.4320819641881819 +0.75 +u 1g 38 +0.59236171424823758 -0.72838351332105533 4.4320819641881819 +0.75 +u 1g 38 +0.55718553883369615 -0.67611539863146486 4.4320819641881819 +0.66113740205764771 +u 1g 3h +0.48705386232147518 -0.57190706818861958 4.4320819641881819 +0.61747419834136963 +u 0 38 +0.25461236783643376 0.2861289539766807 0.45528875939046354 +0.72515541315078735 +u 0 37 +-0.32318056507247761 -0.087865289808800998 0.32303240784136572 +0.69082939624786377 +u 0 39 +-0.15270888654080236 -0.27963139618953747 0.32197804938680552 +0.69082939624786377 +u 0 39 +-0.24018238151425769 -0.070016089331878709 0.32804396781224088 +0.68820947408676147 +u 0 3b +-0.17578988664781622 0.13169881935546429 0.31471936685506846 +0.68592333793640137 +u 0 3c +0.053325514265274043 0.22332488011180587 0.62471517941995836 +0.62485814094543457 +u 0 39 +0.18876082564963792 0.14952299210532322 0.37795839462309788 +0.68893486261367798 +u 0 39 +0.098119826990985357 -0.4105270334773542 0.34008493413165736 +0.67494165897369385 +u 0 38 +0.06485778055243796 -0.25542960866089676 0.59326474198499324 +0.62976425886154175 +u 0 3c +0.29663877144554424 -0.29929975324685759 0.64841024240211431 +0.61387652158737183 +u 0 38 +0.40739179512990231 -0.29916718894492916 0.56928256372005581 +0.60953474044799805 +u 0 3b +-0.32592586039697891 -0.20173395437166813 0.98737096994258156 +0.58714956045150757 +u 0 38 +-0.31631402528914104 -0.4530283934220819 0.97679302755188124 +0.58976948261260986 +u 0 37 +-0.31218764857041226 -0.4328454464538099 1.195731815474274 +0.61743485927581787 +u 0 38 +-0.17106565391141523 0.22687571367226539 0.70108259922903726 +0.66336488723754883 +u 0 3j +-0.13548335869717198 -0.096071356446989123 0.65469111621400156 +0.66598480939865112 +u 0 3d +0.28293215751772205 -0.064976342084085897 0.90398559859151639 +0.62409549951553345 +u 0 3b +0.18400868440068452 -0.035867992198040793 0.65441516649695708 +0.6500970721244812 +u 0 39 +-0.075539223173742051 0.37181699062914425 0.5465296402279427 +0.66107869148254395 +u 0 38 +0.38783805580847808 -0.45764361889824329 0.85144010247159596 +0.57787537574768066 +u 0 3d +-0.13179744021403392 -0.2531949180670624 1.361061584778297 +0.65285241603851318 +u 0 3a +-0.18769834488758064 -0.066502913222972665 1.1743421557844149 +0.58635997772216797 +u 0 38 +-0.0049140414249558839 -0.0038287549881380611 1.2501749701655944 +0.62177753448486328 +u 0 3j +0.10878636087719122 0.076440836704197074 1.0337239045962123 +0.55565822124481201 +u 0 3a +0.40294789854149277 -0.46445590237596956 1.168290983148774 +0.57571971416473389 +u 0 38 +0.49207843750662361 -0.0057944824574529836 1.0358874772579603 +0.65951299667358398 +u 0 36 +0.45613851771189684 0.17334609706275977 0.95335964672785423 +0.65193510055541992 +u 0 3b +0.52359798113679068 -0.15881424937561689 1.2758013993840462 +0.60934770107269287 +u 0 3b +0.4080394423794847 -0.30421497030028211 0.89293550520046305 +0.58787494897842407 +u 0 3b +-0.37403371018603349 -0.084146609310950402 1.152045127298845 +0.61187511682510376 +u 0 3b +-0.37838106653461812 0.29794908702045902 0.93516451558224278 +0.59492754936218262 +u 0 3b +-0.11595155452554144 0.43368572266875788 0.86967833722673515 +0.66257530450820923 +u 0 38 +-0.38294676811750583 0.095191723132922471 1.5585318243937001 +0.62711983919143677 +u 0 3g +-0.3925616675740492 0.33301303758307838 1.9176373707106444 +0.65421617031097412 +u 0 3c +-0.28008651155524589 -0.13685705740451115 1.8512131727704819 +0.63639998435974121 +u 0 3a +-0.24128806293830243 -0.22856738123842543 1.5958601517178661 +0.69445431232452393 +u 0 3d +-0.037623216324087078 -0.011288585436431516 1.7709395244418238 +0.63458454608917236 +u 0 3f +-0.1881766508116017 0.1982574742843406 1.4264778251478161 +0.63384044170379639 +u 0 3g +0.17080298613399614 -0.047004634123816828 1.5559341067309962 +0.64130508899688721 +u 0 3g +0.31600770520831845 -0.036716055213081918 1.3918401418791231 +0.59970325231552124 +u 0 38 +-0.014614018432254603 0.035855697604681214 1.3290153260663014 +0.64348483085632324 +u 0 3d +0.11588446075723216 0.43156074447296788 1.278260381029547 +0.61240994930267334 +u 0 37 +-0.10828419912847308 0.58155274530902568 2.0282655300397123 +0.59859383106231689 +u 0 39 +0.26003748555933004 0.55856130397197723 1.8287037067832164 +0.54488325119018555 +u 0 39 +0.023204841291848115 0.43860517979923891 1.957540949249716 +0.58972185850143433 +u 0 3d +0.23585296170201087 0.14117793714017562 1.8008593920667204 +0.59392058849334717 +u 0 38 +0.017199145513588684 -0.0052237839806785827 1.9161600490397412 +0.63875919580459595 +u 0 3c +-0.034039114931297715 -0.27400190288527215 2.0614673266878056 +0.68088668584823608 +u 0 3d +0.091486671844348888 0.238425671704242 1.9279074835812586 +0.61054545640945435 +u 0 37 +0.51225637107754873 0.3130971490033434 1.6929065453932044 +0.57242739200592041 +u 0 37 +-0.26505800867042156 -0.35180956069797825 2.0548550812918571 +0.72155064344406128 +u 0 3b +-0.18699570353097866 -0.31579598277608667 2.2872960547180523 +0.70507669448852539 +u 0 37 +-0.12037675250423287 -0.50026339733945957 2.1858798054797988 +0.68726044893264771 +u 0 3b +-0.22581003309469655 -0.039047262335253012 2.5297791457439409 +0.65229523181915283 +u 0 3g +0.042859379332617291 0.018512754663517154 2.0403368893786054 +0.65267294645309448 +u 0 38 +-0.10165367899415882 0.28771003510683485 2.0636529455013761 +0.63184934854507446 +u 0 39 +-0.23071346859313999 0.35413763242043628 2.1407780540485688 +0.64072132110595703 +u 0 3h +0.094440455844262305 0.054546838288769196 2.4678456600126069 +0.63974440097808838 +u 0 39 +0.10906727033002239 -0.17384533124225945 2.2411896755677843 +0.66066312789916992 +u 0 3b +0.32609287731487063 0.28586107570733815 2.4197734281900116 +0.59533089399337769 +u 0 3d +0.11392174893138429 0.21071073984329375 2.2434667089450779 +0.62345075607299805 +u 0 38 +0.43234660817620219 0.3602866115894382 2.2119043355572545 +0.52298980951309204 +u 0 37 +0.43853383004767749 0.18635133345310026 1.6025855761929637 +0.60064113140106201 +u 0 35 +0.13506128422831615 -0.57850471258878344 2.8124927088114169 +0.66843152046203613 +u 0 3b +0.28336368012810798 -0.34924917003821021 2.8115506657914162 +0.62774145603179932 +u 0 3a +0.35786309850221576 0.031222651374661292 2.6065725491124878 +0.61029976606369019 +u 0 3d +0.12162803738798703 -0.0063952222354325692 2.6823701124948167 +0.62285053730010986 +u 0 38 +0.55101689931334685 0.22233879859411682 2.6067234706251101 +0.56588625907897949 +u 0 38 +-0.088990712231831928 0.41933734514591625 2.73932548144038 +0.60200190544128418 +u 0 38 +0.23454057892164085 0.55833617137720437 2.9781389502535793 +0.56626707315444946 +u 0 3a +0.080968102234478645 0.36048052467138464 2.8081828620441351 +0.57325911521911621 +u 0 39 +0.11203656926201835 0.23811314138603532 2.8991871857177292 +0.60689282417297363 +u 0 3f +0.045813569499614459 -0.17698265998717455 2.8896741763148674 +0.60853087902069092 +u 0 3c +-0.16592354625758593 0.14096679491092637 2.7487319058242883 +0.60363996028900146 +u 0 38 +-0.090432171686281454 -0.48830110961103446 2.935804623292503 +0.65831637382507324 +u 0 3b +-0.24587488943951602 -0.32922677405289302 3.1298709300764243 +0.6476978063583374 +u 0 3g +0.0059829414322788918 0.045197394287099367 3.0233649222371421 +0.59791231155395508 +u 0 3c +0.54072549269790082 -0.083903847581599217 3.5501386119516081 +0.58097612857818604 +u 0 3b +0.38116873270797014 -0.21046171710458578 3.366822285694786 +0.5856439471244812 +u 0 3e +-0.038328724324835362 -0.14350151423744653 3.0979037206003421 +0.63860237598419189 +u 0 3e +0.30176673090666212 0.0068161928930322337 3.2562156396949709 +0.61846566200256348 +u 0 39 +0.50718890228567759 0.1195707024144768 3.1769600543614289 +0.60937029123306274 +u 0 3d +-0.18835357992975627 0.34875992499466285 3.1710485493727125 +0.60518217086791992 +u 0 38 +-0.21393381034641945 -0.50537636379670692 3.3336384838493425 +0.61416566371917725 +u 0 37 +-0.27697379863126415 -0.51824441625155715 3.6302260475835277 +0.59558069705963135 +u 0 3c +-0.014241909729762742 -0.36800212213376265 3.6088114522347423 +0.6094977855682373 +u 0 3g +0.018790735294003144 -0.050609770463916251 3.4177266179605867 +0.53882831335067749 +u 0 3a +-0.11313692950395898 0.16429191520414527 3.3889008208168554 +0.57165002822875977 +u 0 3a +-0.053062618726446908 0.21659405110096897 2.9555105341700614 +0.56427860260009766 +u 0 39 +-0.039911887284878489 0.46569679028020811 3.4222042056685837 +0.61940419673919678 +u 0 3d +-0.22107231375432118 -0.3396208156422576 3.7894695291512872 +0.60272878408432007 +u 0 3b +-0.0060921388629590111 0.043154861030120797 3.7964265497820073 +0.62546050548553467 +u 0 3h +0.029946068129599327 -0.13362992807435348 3.6304316671512291 +0.61831247806549072 +u 0 3f +0.1306517483970146 0.26402498324268919 3.603819886904617 +0.66606664657592773 +u 0 3d +0.30624035936551774 -0.30341155706360379 3.7700549868956741 +0.64654314517974854 +u 0 3a +0.066730818651915713 0.35882401109863582 3.4113458733282798 +0.5865824818611145 +u 0 37 +0.23104493967700257 0.48426684559547267 3.5408058345123314 +0.58629810810089111 +u 0 39 +-0.27287168825029523 -0.51643465308424341 3.9559561880695191 +0.55253571271896362 +u 0 3c +-0.10151783472416459 -0.43289106610205935 4.2174541193429764 +0.54936712980270386 +u 0 39 +-0.13251815404837369 0.30899774342429787 3.8349434957315967 +0.59146308898925781 +u 0 3g +0.027149603409979108 -0.10522097178902361 3.9041377460764366 +0.5878453254699707 +u 0 36 +0.30898979052044273 -0.072509145976131811 3.849530610263419 +0.6125456690788269 +u 0 37 +-0.052767502032369518 -0.3819251417980114 3.9232816622660445 +0.56645286083221436 +u 0 39 +0.095574669214299246 -0.55447545314278335 3.8661295551076096 +0.61302816867828369 +u 0 39 +0.38153464404392978 0.07046922601571215 3.8447194713526067 +0.62646281719207764 +u 0 38 +-0.40902157844331505 0.39559046698851902 3.8134404865299443 +0.62196791172027588 +u 0 3e +-0.1163380388910908 0.11913757146670675 3.9845120265568816 +0.54127001762390137 +u 0 3a +-0.064707892379242793 0.50331402208837128 4.0820735867817382 +0.64927637577056885 +u 0 3f +0.42037468498957492 0.01523318308334278 4.1233572659384308 +0.60937708616256714 +u 0 3c +-0.30331450879083455 -0.12912970763630077 4.3797083534161168 +0.6495479941368103 +u 0 38 +-0.50925543177287236 -0.062122266304797794 4.3785139323610611 +0.62341880798339844 +u 0 3e +-0.021776896773406204 -0.020536774262909719 4.3598530545084975 +0.65737342834472656 +u 0 3a +-0.15639722536836551 0.1606324356946931 4.6473505035085765 +0.72363638877868652 +u 0 37 +0.41234686889997862 0.046218498419671128 4.5105757422034651 +0.62560105323791504 +u 0 3a +0.18958218643763819 0.3045238681104368 4.6780931615542265 +0.69219034910202026 +u 0 3a +0.25170401088163841 0.11647141027307376 4.4114881140506155 +0.62592744827270508 +u 0 36 +-0.42541185360562511 -0.3201872619311309 2.3950109783717024 +0.71560436487197876 +u 0 39 +-0.57477980762143766 0.027203719679354317 3.4666091451568444 +0.6110110878944397 +u 0 37 +0.61487615948045526 -0.0061234227784829048 3.3359821808286982 +0.57375288009643555 +u 0 37 +0.30091174850126579 0.12887873561794433 3.4419497703301118 +0.52805459499359131 +u 0 37 +-0.55402209588424434 0.023224257668680501 2.7534905617900649 +0.65406137704849243 +u 0 37 +0.53217111166415165 -0.0097663512485398341 3.3158663954290732 +0.55329912900924683 +4 1g 12 0 4 +4 1g 12 4 1 +4 1g 12 1 5 +4 1g 12 5 2 +4 1g 12 2 6 +4 1g 12 6 3 +4 1g 12 3 7 +4 1g 12 7 8 +4 1g 12 8 0 +i 1g 12 9 d +i 1g 12 d a +i 1g 12 a e +i 1g 12 e b +i 1g 12 b f +i 1g 12 f c +i 1g 12 c g +i 1g 12 g h +i 1g 12 h 9 +p 1g 23 n o +p 1g 23 j r +p 1g 23 i u +p 1g 23 k u +p 1g 23 k w +p 1g 23 l w +p 1g 23 0 y +p 1g 23 4 y +p 1g 23 8 y +p 1g 23 m y +p 1g 23 i z +p 1g 23 u z +p 1g 23 m z +p 1g 23 h A +p 1g 23 9 A +p 1g 23 n A +p 1g 23 n B +p 1g 23 o B +p 1g 23 i B +p 1g 23 u B +p 1g 23 d C +p 1g 23 9 C +p 1g 23 o C +p 1g 23 A C +p 1g 23 j D +p 1g 23 p D +p 1g 23 o E +p 1g 23 D E +p 1g 23 e F +p 1g 23 a F +p 1g 23 p F +p 1g 23 1 G +p 1g 23 5 G +p 1g 23 q G +p 1g 23 j H +p 1g 23 r H +p 1g 23 q H +p 1g 23 m I +p 1g 23 q I +p 1g 23 G I +p 1g 23 o J +p 1g 23 B J +p 1g 23 E J +p 1g 23 i J +p 1g 23 k K +p 1g 23 w K +p 1g 23 s K +p 1g 23 n L +p 1g 23 A L +p 1g 23 s L +p 1g 23 K L +p 1g 23 c M +p 1g 23 g M +p 1g 23 s M +p 1g 23 3 N +p 1g 23 7 N +p 1g 23 t N +p 1g 23 k O +p 1g 23 w O +p 1g 23 l P +p 1g 23 t P +p 1g 23 O P +p 1g 23 w P +p 1g 23 m Q +p 1g 23 y Q +p 1g 23 O Q +p 1g 23 5 R +p 1g 23 2 R +p 1g 23 G R +p 1g 23 v R +p 1g 23 q S +p 1g 23 H S +p 1g 23 v S +p 1g 23 R S +p 1g 23 X T +p 1g 23 l T +p 1g 23 v T +p 1g 23 v U +p 1g 23 R U +p 1g 23 6 U +p 1g 23 2 U +p 1g 23 b V +p 1g 23 f V +p 1g 23 x V +p 1g 23 p W +p 1g 23 x W +p 1g 23 V W +p 1g 23 l X +p 1g 23 x X +p 1g 23 W X +p 1g 23 i Y +p 1g 23 z Y +p 1g 23 r Y +p 1g 23 d 1c +p 1g 23 C 1c +p 1g 23 a 1c +p 1g 23 j Z +p 1g 23 D Z +p 1g 23 X Z +p 1g 23 W Z +p 1g 23 p Z +p 1g 23 j % +p 1g 23 D % +p 1g 23 r % +p 1g 23 J % +p 1g 23 E % +p 1g 23 p @ +p 1g 23 F @ +p 1g 23 E @ +p 1g 23 q 10 +p 1g 23 I 10 +p 1g 23 H 10 +p 1g 23 r 10 +p 1g 23 G 11 +p 1g 23 I 11 +p 1g 23 4 11 +p 1g 23 y 11 +p 1g 23 1 11 +p 1g 23 m 11 +p 1g 23 s 12 +p 1g 23 K 12 +p 1g 23 x 12 +p 1g 23 K 13 +p 1g 23 L 13 +p 1g 23 u 13 +p 1g 23 B 13 +p 1g 23 k 13 +p 1g 23 n 13 +p 1g 23 g 14 +p 1g 23 M 14 +p 1g 23 A 14 +p 1g 23 L 14 +p 1g 23 h 14 +p 1g 23 s 14 +p 1g 23 v 15 +p 1g 23 T 15 +p 1g 23 l 15 +p 1g 23 P 15 +p 1g 23 t 16 +p 1g 23 Q 16 +p 1g 23 N 16 +p 1g 23 O 17 +p 1g 23 Q 17 +p 1g 23 u 17 +p 1g 23 z 17 +p 1g 23 k 17 +p 1g 23 m 17 +p 1g 23 H 18 +p 1g 23 S 18 +p 1g 23 j 18 +p 1g 23 T 18 +p 1g 23 Z 18 +p 1g 23 X 18 +p 1g 23 6 19 +p 1g 23 U 19 +p 1g 23 3 19 +p 1g 23 N 19 +p 1g 23 f 1a +p 1g 23 V 1a +p 1g 23 x 1a +p 1g 23 c 1a +p 1g 23 M 1a +p 1g 23 12 1a +p 1g 23 b 1b +p 1g 23 V 1b +p 1g 23 W 1b +p 1g 23 F 1b +p 1g 23 e 1b +p 1g 23 E 1c +p 1g 23 @ 1c +p 1g 23 o 1c +p 1g 23 z 1d +p 1g 23 Y 1d +p 1g 23 I 1d +p 1g 23 10 1d +p 1g 23 m 1d +p 1g 23 l 1e +p 1g 23 X 1e +p 1g 23 w 1e +p 1g 23 x 1e +p 1g 23 12 1e +p 1g 23 K 1e +p 1g 23 7 1f +p 1g 23 8 1f +p 1g 23 y 1f +p 1g 23 N 1f +p 1g 23 16 1f +p 1g 23 Q 1f +p 1g 23 15 1g +p 1g 23 t 1g +p 1g 23 U 1g +p 1g 23 19 1g +p 1g 23 v 1g +p 1g 23 C n +p 1g 23 @ D +p 1g 23 r 1h +p 1g 23 1h J +p 1g 23 1h Y +p 1g 23 1h % +p 1g 23 16 O +p 1g 23 p 1b +p 1g 23 i 1h +p 1g 23 1c F +p 1g 23 T S +p 1g 23 M 12 +p 1g 23 Y 10 +p 1g 23 15 t +p 1g 23 16 P +p 1g 23 R q +p 1g 23 t 19 +1 0 25 1i 1j +1 0 23 1i 1k +1 0 24 1j 1k +1 0 24 1k 1l +1 0 25 1j 1l +1 1g 23 0 1m +1 1g 23 1m 1n +1 1g 23 1n 1o +1 1g 23 1o 1p +1 1g 23 1p 1q +1 1g 23 1q 1r +1 1g 23 1r 2c +1 1g 24 4 1s +1 1g 24 1s 1t +1 1g 24 1t 1u +1 1g 24 1u 1v +1 1g 24 1v 1w +1 1g 24 1w 1x +1 1g 24 1x 1i +1 1g 23 1m 1s +1 1g 23 1n 1t +1 1g 23 1o 1u +1 1g 23 1p 1v +1 1g 23 1q 1w +1 1g 23 1r 1x +1 1g 24 8 1y +1 1g 24 1y 1z +1 1g 24 1z 1A +1 1g 24 1A 1B +1 1g 24 1B 1C +1 1g 24 1C 1D +1 1g 24 1D 2d +1 1g 23 1m 1y +1 1g 23 1n 1z +1 1g 23 1o 1A +1 1g 23 1p 1B +1 1g 23 1q 1C +1 1g 23 1r 1D +1 1g 24 1 1E +1 1g 24 1E 1F +1 1g 24 1F 1G +1 1g 24 1G 1H +1 1g 24 1H 1I +1 1g 24 1I 1J +1 1g 24 1J 2e +1 1g 24 5 1K +1 1g 24 1K 1L +1 1g 24 1L 1M +1 1g 24 1M 1N +1 1g 24 1N 1O +1 1g 24 1O 1P +1 1g 24 1P 2f +1 1g 23 1E 1K +1 1g 23 1F 1L +1 1g 23 1G 1M +1 1g 23 1H 1N +1 1g 23 1I 1O +1 1g 23 1J 1P +1 1g 24 3 1Q +1 1g 24 1Q 1R +1 1g 24 1R 1S +1 1g 24 1S 1T +1 1g 24 1T 1U +1 1g 24 1U 1V +1 1g 24 1V 2g +1 1g 24 7 1W +1 1g 24 1W 1X +1 1g 24 1X 1Y +1 1g 24 1Y 1Z +1 1g 24 1Z 1% +1 1g 24 1% 1@ +1 1g 24 1@ 2h +1 1g 23 1Q 1W +1 1g 23 1R 1X +1 1g 23 1S 1Y +1 1g 23 1T 1Z +1 1g 23 1U 1% +1 1g 23 1V 1@ +1 1g 24 2 20 +1 1g 24 20 21 +1 1g 24 21 22 +1 1g 24 22 23 +1 1g 24 23 24 +1 1g 24 24 25 +1 1g 24 25 2i +1 1g 23 20 1K +1 1g 23 21 1L +1 1g 23 22 1M +1 1g 23 23 1N +1 1g 23 24 1O +1 1g 23 25 1P +1 1g 24 6 26 +1 1g 24 26 27 +1 1g 24 27 28 +1 1g 24 28 29 +1 1g 24 29 2a +1 1g 24 2a 2b +1 1g 24 2b 2j +1 1g 23 20 26 +1 1g 23 21 27 +1 1g 23 22 28 +1 1g 23 23 29 +1 1g 23 24 2a +1 1g 23 25 2b +1 1g 23 1E 1s +1 1g 23 1F 1t +1 1g 23 1G 1u +1 1g 23 1H 1v +1 1g 23 1I 1w +1 1g 23 1J 1x +1 1g 23 1Q 26 +1 1g 23 1R 27 +1 1g 23 1S 28 +1 1g 23 1T 29 +1 1g 23 1U 2a +1 1g 23 1V 2b +1 1g 23 1W 1y +1 1g 23 1X 1z +1 1g 23 1Y 1A +1 1g 23 1Z 1B +1 1g 23 1% 1C +1 1g 23 1@ 1D +1 0 23 2c 1j +1 1g 23 2c 1i +1 0 24 2d 1j +1 1g 23 2c 2d +1 0 24 2e 1k +1 1g 24 2e 1i +1 0 24 2f 1k +1 1g 23 2e 2f +1 0 24 2g 1l +1 0 24 2h 1j +1 0 23 2h 1l +1 1g 23 2h 2d +1 1g 23 2g 2h +1 0 24 2i 1k +1 0 23 2i 1l +1 1g 23 2i 2f +1 0 24 2j 1l +1 1g 23 2g 2j +1 1g 23 2i 2j +g 0 24 2k 2l +g 0 25 2k 2m +g 0 25 2l 2m +g 0 25 2m 2n +g 0 25 2l 2n +g 1g 24 9 2o +g 1g 24 2o 2p +g 1g 24 2p 2q +g 1g 24 2q 2r +g 1g 24 2r 2s +g 1g 24 2s 2t +g 1g 24 2t 3e +g 1g 24 h 2u +g 1g 24 2u 2v +g 1g 24 2v 2w +g 1g 24 2w 2x +g 1g 24 2x 2y +g 1g 24 2y 2z +g 1g 24 2z 3f +g 1g 23 2o 2u +g 1g 23 2p 2v +g 1g 23 2q 2w +g 1g 23 2r 2x +g 1g 23 2s 2y +g 1g 23 2t 2z +g 1g 24 d 2A +g 1g 24 2A 2B +g 1g 24 2B 2C +g 1g 24 2C 2D +g 1g 24 2D 2E +g 1g 24 2E 2F +g 1g 24 2F 2k +g 1g 23 2o 2A +g 1g 23 2p 2B +g 1g 23 2q 2C +g 1g 23 2r 2D +g 1g 23 2s 2E +g 1g 23 2t 2F +g 1g 24 a 2G +g 1g 24 2G 2H +g 1g 24 2H 2I +g 1g 24 2I 2J +g 1g 24 2J 2K +g 1g 24 2K 2L +g 1g 24 2L 3g +g 1g 24 e 2M +g 1g 24 2M 2N +g 1g 24 2N 2O +g 1g 24 2O 2P +g 1g 24 2P 2Q +g 1g 24 2Q 2R +g 1g 24 2R 3h +g 1g 23 2G 2M +g 1g 23 2H 2N +g 1g 23 2I 2O +g 1g 23 2J 2P +g 1g 23 2K 2Q +g 1g 23 2L 2R +g 1g 24 c 2S +g 1g 24 2S 2T +g 1g 24 2T 2U +g 1g 24 2U 2V +g 1g 24 2V 2W +g 1g 24 2W 2X +g 1g 24 2X 3i +g 1g 24 g 2Y +g 1g 24 2Y 2Z +g 1g 24 2Z 2% +g 1g 24 2% 2@ +g 1g 24 2@ 30 +g 1g 24 30 31 +g 1g 24 31 3j +g 1g 23 2S 2Y +g 1g 23 2T 2Z +g 1g 23 2U 2% +g 1g 23 2V 2@ +g 1g 23 2W 30 +g 1g 23 2X 31 +g 1g 24 b 32 +g 1g 24 32 33 +g 1g 24 33 34 +g 1g 24 34 35 +g 1g 24 35 36 +g 1g 24 36 37 +g 1g 24 37 3k +g 1g 24 f 38 +g 1g 24 38 39 +g 1g 24 39 3a +g 1g 24 3a 3b +g 1g 24 3b 3c +g 1g 24 3c 3d +g 1g 24 3d 3l +g 1g 23 32 38 +g 1g 23 33 39 +g 1g 23 34 3a +g 1g 23 35 3b +g 1g 23 36 3c +g 1g 23 37 3d +g 1g 23 2G 2A +g 1g 23 2H 2B +g 1g 23 2I 2C +g 1g 23 2J 2D +g 1g 23 2K 2E +g 1g 23 2L 2F +g 1g 23 2Y 2u +g 1g 23 2Z 2v +g 1g 23 2% 2w +g 1g 23 2@ 2x +g 1g 23 30 2y +g 1g 23 31 2z +g 1g 23 2S 38 +g 1g 23 2T 39 +g 1g 23 2U 3a +g 1g 23 2V 3b +g 1g 23 2W 3c +g 1g 23 2X 3d +g 1g 23 32 2M +g 1g 23 33 2N +g 1g 23 34 2O +g 1g 23 35 2P +g 1g 23 36 2Q +g 1g 23 37 2R +g 0 24 3e 2l +g 1g 23 3e 2k +g 0 24 3f 2l +g 1g 23 3e 3f +g 0 24 3g 2m +g 1g 23 3g 2k +g 0 24 3h 2m +g 1g 23 3g 3h +g 0 24 3i 2n +g 0 24 3j 2l +g 0 24 3j 2n +g 1g 23 3j 3f +g 1g 23 3i 3j +g 0 24 3k 2m +g 0 23 3k 2n +g 1g 23 3k 3h +g 0 24 3l 2n +g 1g 23 3i 3l +g 1g 23 3k 3l +u 1g 36 i 3m +u 1g 36 3m 3n +u 1g 36 3n 3o +u 1g 36 3o 3p +u 1g 36 3p 3q +u 1g 36 3q 3r +u 1g 36 3r 3s +u 1g 36 u 3t +u 1g 36 3t 3u +u 1g 36 3u 3v +u 1g 36 3v 3w +u 1g 36 3w 3x +u 1g 36 3x 3y +u 1g 36 3y 3z +u 1g 34 3m 3t +u 1g 34 3n 3u +u 1g 34 3o 3v +u 1g 34 3p 3w +u 1g 34 3q 3x +u 1g 34 3r 3y +u 1g 37 3s 3z +u 1g 36 z 3A +u 1g 36 3A 3B +u 1g 36 3B 3C +u 1g 36 3C 3D +u 1g 36 3D 3E +u 1g 36 3E 3F +u 1g 36 3F 3G +u 1g 34 3t 3A +u 1g 34 3u 3B +u 1g 34 3v 3C +u 1g 34 3w 3D +u 1g 34 3x 3E +u 1g 34 3y 3F +u 1g 36 3z 3G +u 1g 34 3m 3A +u 1g 34 3n 3B +u 1g 34 3o 3C +u 1g 34 3p 3D +u 1g 34 3q 3E +u 1g 34 3r 3F +u 1g 34 3s 3G +u 1g 36 B 3H +u 1g 36 3H 3I +u 1g 36 3I 3J +u 1g 36 3J 3K +u 1g 36 3K 3L +u 1g 36 3L 3M +u 1g 36 3M 3N +u 1g 34 3t 3H +u 1g 34 3u 3I +u 1g 34 3v 3J +u 1g 34 3w 3K +u 1g 34 3x 3L +u 1g 34 3y 3M +u 1g 34 3z 3N +u 1g 34 3m 3H +u 1g 34 3n 3I +u 1g 34 3o 3J +u 1g 34 3p 3K +u 1g 34 3q 3L +u 1g 34 3r 3M +u 1g 34 3s 3N +u 1g 36 J 3O +u 1g 36 3O 3P +u 1g 36 3P 3Q +u 1g 36 3Q 3R +u 1g 36 3R 3S +u 1g 36 3S 3T +u 1g 36 3T 3U +u 1g 34 3H 3O +u 1g 34 3I 3P +u 1g 34 3J 3Q +u 1g 34 3K 3R +u 1g 34 3L 3S +u 1g 34 3M 3T +u 1g 36 3N 3U +u 1g 34 3m 3O +u 1g 34 3n 3P +u 1g 34 3o 3Q +u 1g 34 3p 3R +u 1g 34 3q 3S +u 1g 34 3r 3T +u 1g 35 3s 3U +u 1g 36 Y 3V +u 1g 36 3V 3W +u 1g 36 3W 3X +u 1g 36 3X 3Y +u 1g 36 3Y 3Z +u 1g 36 3Z 3% +u 1g 36 3% 3@ +u 1g 34 3A 3V +u 1g 34 3B 3W +u 1g 34 3C 3X +u 1g 34 3D 3Y +u 1g 34 3E 3Z +u 1g 34 3F 3% +u 1g 39 3G 3@ +u 1g 34 3m 3V +u 1g 34 3n 3W +u 1g 34 3o 3X +u 1g 34 3p 3Y +u 1g 34 3q 3Z +u 1g 34 3r 3% +u 1g 34 3s 3@ +u 1g 35 1h 40 +u 1g 35 40 41 +u 1g 35 41 42 +u 1g 35 42 43 +u 1g 35 43 44 +u 1g 35 44 45 +u 1g 35 45 46 +u 1g 34 3V 40 +u 1g 34 3W 41 +u 1g 34 3X 42 +u 1g 34 3Y 43 +u 1g 34 3Z 44 +u 1g 34 3% 45 +u 1g 34 3@ 46 +u 1g 34 3m 40 +u 1g 34 3n 41 +u 1g 34 3o 42 +u 1g 34 3p 43 +u 1g 34 3q 44 +u 1g 34 3r 45 +u 1g 36 3s 46 +u 1g 34 3O 40 +u 1g 34 3P 41 +u 1g 34 3Q 42 +u 1g 34 3R 43 +u 1g 34 3S 44 +u 1g 34 3T 45 +u 1g 34 3U 46 +u 1g 36 j 47 +u 1g 36 47 48 +u 1g 36 48 49 +u 1g 36 49 4a +u 1g 36 4a 4b +u 1g 36 4b 4c +u 1g 36 4c 4d +u 1g 36 r 4e +u 1g 36 4e 4f +u 1g 36 4f 4g +u 1g 36 4g 4h +u 1g 36 4h 4i +u 1g 36 4i 4j +u 1g 36 4j 4k +u 1g 34 47 4e +u 1g 34 48 4f +u 1g 34 49 4g +u 1g 34 4a 4h +u 1g 34 4b 4i +u 1g 34 4c 4j +u 1g 36 4d 4k +u 1g 36 H 4l +u 1g 36 4l 4m +u 1g 36 4m 4n +u 1g 36 4n 4o +u 1g 36 4o 4p +u 1g 36 4p 4q +u 1g 36 4q 4r +u 1g 34 4e 4l +u 1g 34 4f 4m +u 1g 34 4g 4n +u 1g 34 4h 4o +u 1g 34 4i 4p +u 1g 34 4j 4q +u 1g 36 4k 4r +u 1g 34 47 4l +u 1g 34 48 4m +u 1g 34 49 4n +u 1g 34 4a 4o +u 1g 34 4b 4p +u 1g 34 4c 4q +u 1g 34 4d 4r +u 1g 36 D 4s +u 1g 36 4s 4t +u 1g 36 4t 4u +u 1g 36 4u 4v +u 1g 36 4v 4w +u 1g 36 4w 4x +u 1g 36 4x 4y +u 1g 36 Z 4z +u 1g 36 4z 4A +u 1g 36 4A 4B +u 1g 36 4B 4C +u 1g 36 4C 4D +u 1g 36 4D 4E +u 1g 36 4E 4F +u 1g 34 4s 4z +u 1g 34 4t 4A +u 1g 34 4u 4B +u 1g 34 4v 4C +u 1g 34 4w 4D +u 1g 34 4x 4E +u 1g 36 4y 4F +u 1g 34 47 4s +u 1g 34 48 4t +u 1g 34 49 4u +u 1g 34 4a 4v +u 1g 34 4b 4w +u 1g 34 4c 4x +u 1g 34 4d 4y +u 1g 34 47 4z +u 1g 34 48 4A +u 1g 34 49 4B +u 1g 34 4a 4C +u 1g 34 4b 4D +u 1g 34 4c 4E +u 1g 36 4d 4F +u 1g 36 % 4G +u 1g 36 4G 4H +u 1g 36 4H 4I +u 1g 36 4I 4J +u 1g 36 4J 4K +u 1g 36 4K 4L +u 1g 36 4L 4M +u 1g 34 4s 4G +u 1g 34 4t 4H +u 1g 34 4u 4I +u 1g 34 4v 4J +u 1g 34 4w 4K +u 1g 34 4x 4L +u 1g 35 4y 4M +u 1g 34 47 4G +u 1g 34 48 4H +u 1g 34 49 4I +u 1g 34 4a 4J +u 1g 34 4b 4K +u 1g 34 4c 4L +u 1g 37 4d 4M +u 1g 34 4e 4G +u 1g 34 4f 4H +u 1g 34 4g 4I +u 1g 34 4h 4J +u 1g 34 4i 4K +u 1g 34 4j 4L +u 1g 34 4k 4M +u 1g 36 18 4N +u 1g 36 4N 4O +u 1g 36 4O 4P +u 1g 36 4P 4Q +u 1g 36 4Q 4R +u 1g 36 4R 4S +u 1g 36 4S 4T +u 1g 34 4l 4N +u 1g 34 4m 4O +u 1g 34 4n 4P +u 1g 34 4o 4Q +u 1g 34 4p 4R +u 1g 34 4q 4S +u 1g 36 4r 4T +u 1g 34 47 4N +u 1g 34 48 4O +u 1g 34 49 4P +u 1g 34 4a 4Q +u 1g 34 4b 4R +u 1g 34 4c 4S +u 1g 36 4d 4T +u 1g 34 4z 4N +u 1g 34 4A 4O +u 1g 34 4B 4P +u 1g 34 4C 4Q +u 1g 34 4D 4R +u 1g 34 4E 4S +u 1g 33 4F 4T +u 1g 36 w 4U +u 1g 36 4U 4V +u 1g 36 4V 4W +u 1g 36 4W 4X +u 1g 36 4X 4Y +u 1g 36 4Y 4Z +u 1g 36 4Z 4% +u 1g 37 K 4@ +u 1g 37 4@ 50 +u 1g 37 50 51 +u 1g 37 51 52 +u 1g 37 52 53 +u 1g 37 53 54 +u 1g 37 54 55 +u 1g 34 4U 4@ +u 1g 34 4V 50 +u 1g 34 4W 51 +u 1g 34 4X 52 +u 1g 34 4Y 53 +u 1g 34 4Z 54 +u 1g 34 4% 55 +u 1g 36 k 56 +u 1g 36 56 57 +u 1g 36 57 58 +u 1g 36 58 59 +u 1g 36 59 5a +u 1g 36 5a 5b +u 1g 36 5b 5c +u 1g 34 56 4U +u 1g 34 57 4V +u 1g 34 58 4W +u 1g 34 59 4X +u 1g 34 5a 4Y +u 1g 34 5b 4Z +u 1g 39 5c 4% +u 1g 34 56 4@ +u 1g 34 57 50 +u 1g 34 58 51 +u 1g 34 59 52 +u 1g 34 5a 53 +u 1g 34 5b 54 +u 1g 35 5c 55 +u 1g 36 O 5d +u 1g 36 5d 5e +u 1g 36 5e 5f +u 1g 36 5f 5g +u 1g 36 5g 5h +u 1g 36 5h 5i +u 1g 36 5i 5j +u 1g 34 4U 5d +u 1g 34 4V 5e +u 1g 34 4W 5f +u 1g 34 4X 5g +u 1g 34 4Y 5h +u 1g 34 4Z 5i +u 1g 35 4% 5j +u 1g 34 56 5d +u 1g 34 57 5e +u 1g 34 58 5f +u 1g 34 59 5g +u 1g 34 5a 5h +u 1g 34 5b 5i +u 1g 35 5c 5j +u 1g 36 13 5k +u 1g 36 5k 5l +u 1g 36 5l 5m +u 1g 36 5m 5n +u 1g 36 5n 5o +u 1g 36 5o 5p +u 1g 36 5p 5q +u 1g 34 4@ 5k +u 1g 34 50 5l +u 1g 34 51 5m +u 1g 34 52 5n +u 1g 34 53 5o +u 1g 34 54 5p +u 1g 36 55 5q +u 1g 34 56 5k +u 1g 34 57 5l +u 1g 34 58 5m +u 1g 34 59 5n +u 1g 34 5a 5o +u 1g 34 5b 5p +u 1g 35 5c 5q +u 1g 34 56 3t +u 1g 34 57 3u +u 1g 34 58 3v +u 1g 34 59 3w +u 1g 34 5a 3x +u 1g 34 5b 3y +u 1g 37 5c 3z +u 1g 34 3t 5k +u 1g 34 3u 5l +u 1g 34 3v 5m +u 1g 34 3w 5n +u 1g 34 3x 5o +u 1g 34 3y 5p +u 1g 35 3z 5q +u 1g 36 17 5r +u 1g 36 5r 5s +u 1g 36 5s 5t +u 1g 36 5t 5u +u 1g 36 5u 5v +u 1g 36 5v 5w +u 1g 36 5w 5x +u 1g 34 5d 5r +u 1g 34 5e 5s +u 1g 34 5f 5t +u 1g 34 5g 5u +u 1g 34 5h 5v +u 1g 34 5i 5w +u 1g 37 5j 5x +u 1g 34 56 5r +u 1g 34 57 5s +u 1g 34 58 5t +u 1g 34 59 5u +u 1g 34 5a 5v +u 1g 34 5b 5w +u 1g 34 5c 5x +u 1g 34 3t 5r +u 1g 34 3u 5s +u 1g 34 3v 5t +u 1g 34 3w 5u +u 1g 34 3x 5v +u 1g 34 3y 5w +u 1g 34 3z 5x +u 1g 36 P 5y +u 1g 36 5y 5z +u 1g 36 5z 5A +u 1g 36 5A 5B +u 1g 36 5B 5C +u 1g 36 5C 5D +u 1g 36 5D 5E +u 1g 34 4U 5y +u 1g 34 4V 5z +u 1g 34 4W 5A +u 1g 34 4X 5B +u 1g 34 4Y 5C +u 1g 34 4Z 5D +u 1g 34 4% 5E +u 1g 36 l 5F +u 1g 36 5F 5G +u 1g 36 5G 5H +u 1g 36 5H 5I +u 1g 36 5I 5J +u 1g 36 5J 5K +u 1g 36 5K 5L +u 1g 34 5F 4U +u 1g 34 5G 4V +u 1g 34 5H 4W +u 1g 34 5I 4X +u 1g 34 5J 4Y +u 1g 34 5K 4Z +u 1g 37 5L 4% +u 1g 34 5F 5y +u 1g 34 5G 5z +u 1g 34 5H 5A +u 1g 34 5I 5B +u 1g 34 5J 5C +u 1g 34 5K 5D +u 1g 35 5L 5E +u 1g 36 T 5M +u 1g 36 5M 5N +u 1g 36 5N 5O +u 1g 36 5O 5P +u 1g 36 5P 5Q +u 1g 36 5Q 5R +u 1g 36 5R 5S +u 1g 34 5F 5M +u 1g 34 5G 5N +u 1g 34 5H 5O +u 1g 34 5I 5P +u 1g 34 5J 5Q +u 1g 34 5K 5R +u 1g 37 5L 5S +u 1g 37 X 5T +u 1g 37 5T 5U +u 1g 37 5U 5V +u 1g 37 5V 5W +u 1g 37 5W 5X +u 1g 37 5X 5Y +u 1g 37 5Y 5Z +u 1g 34 5F 5T +u 1g 34 5G 5U +u 1g 34 5H 5V +u 1g 34 5I 5W +u 1g 34 5J 5X +u 1g 34 5K 5Y +u 1g 36 5L 5Z +u 1g 34 5M 5T +u 1g 34 5N 5U +u 1g 34 5O 5V +u 1g 34 5P 5W +u 1g 34 5Q 5X +u 1g 34 5R 5Y +u 1g 34 5S 5Z +u 1g 36 15 5% +u 1g 36 5% 5@ +u 1g 36 5@ 60 +u 1g 36 60 61 +u 1g 36 61 62 +u 1g 36 62 63 +u 1g 36 63 64 +u 1g 34 5M 5% +u 1g 34 5N 5@ +u 1g 34 5O 60 +u 1g 34 5P 61 +u 1g 34 5Q 62 +u 1g 34 5R 63 +u 1g 35 5S 64 +u 1g 34 5F 5% +u 1g 34 5G 5@ +u 1g 34 5H 60 +u 1g 34 5I 61 +u 1g 34 5J 62 +u 1g 34 5K 63 +u 1g 34 5L 64 +u 1g 34 5y 5% +u 1g 34 5z 5@ +u 1g 34 5A 60 +u 1g 34 5B 61 +u 1g 34 5C 62 +u 1g 34 5D 63 +u 1g 36 5E 64 +u 1g 36 1e 65 +u 1g 36 65 66 +u 1g 36 66 67 +u 1g 36 67 68 +u 1g 36 68 69 +u 1g 36 69 6a +u 1g 36 6a 6b +u 1g 34 5T 65 +u 1g 34 5U 66 +u 1g 34 5V 67 +u 1g 34 5W 68 +u 1g 34 5X 69 +u 1g 34 5Y 6a +u 1g 37 5Z 6b +u 1g 34 5F 65 +u 1g 34 5G 66 +u 1g 34 5H 67 +u 1g 34 5I 68 +u 1g 34 5J 69 +u 1g 34 5K 6a +u 1g 34 5L 6b +u 1g 34 4U 65 +u 1g 34 4V 66 +u 1g 34 4W 67 +u 1g 34 4X 68 +u 1g 34 4Y 69 +u 1g 34 4Z 6a +u 1g 36 4% 6b +u 1g 37 y 6c +u 1g 37 6c 6d +u 1g 37 6d 6e +u 1g 37 6e 6f +u 1g 37 6f 6g +u 1g 37 6g 6h +u 1g 37 6h 6i +u 1g 36 Q 6j +u 1g 36 6j 6k +u 1g 36 6k 6l +u 1g 36 6l 6m +u 1g 36 6m 6n +u 1g 36 6n 6o +u 1g 36 6o 6p +u 1g 34 6c 6j +u 1g 34 6d 6k +u 1g 34 6e 6l +u 1g 34 6f 6m +u 1g 34 6g 6n +u 1g 34 6h 6o +u 1g 34 6i 6p +u 1g 37 m 6q +u 1g 37 6q 6r +u 1g 37 6r 6s +u 1g 37 6s 6t +u 1g 37 6t 6u +u 1g 37 6u 6v +u 1g 37 6v 6w +u 1g 34 6q 6c +u 1g 34 6r 6d +u 1g 34 6s 6e +u 1g 34 6t 6f +u 1g 34 6u 6g +u 1g 34 6v 6h +u 1g 34 6w 6i +u 1g 34 6q 6j +u 1g 34 6r 6k +u 1g 34 6s 6l +u 1g 34 6t 6m +u 1g 34 6u 6n +u 1g 34 6v 6o +u 1g 36 6w 6p +u 1g 36 I 6x +u 1g 36 6x 6y +u 1g 36 6y 6z +u 1g 36 6z 6A +u 1g 36 6A 6B +u 1g 36 6B 6C +u 1g 36 6C 6D +u 1g 36 11 6E +u 1g 36 6E 6F +u 1g 36 6F 6G +u 1g 36 6G 6H +u 1g 36 6H 6I +u 1g 36 6I 6J +u 1g 36 6J 6K +u 1g 34 6x 6E +u 1g 34 6y 6F +u 1g 34 6z 6G +u 1g 34 6A 6H +u 1g 34 6B 6I +u 1g 34 6C 6J +u 1g 35 6D 6K +u 1g 34 6q 6x +u 1g 34 6r 6y +u 1g 34 6s 6z +u 1g 34 6t 6A +u 1g 34 6u 6B +u 1g 34 6v 6C +u 1g 36 6w 6D +u 1g 34 6q 6E +u 1g 34 6r 6F +u 1g 34 6s 6G +u 1g 34 6t 6H +u 1g 34 6u 6I +u 1g 34 6v 6J +u 1g 34 6w 6K +u 1g 34 6c 6E +u 1g 34 6d 6F +u 1g 34 6e 6G +u 1g 34 6f 6H +u 1g 34 6g 6I +u 1g 34 6h 6J +u 1g 36 6i 6K +u 1g 34 6j 5r +u 1g 34 6k 5s +u 1g 34 6l 5t +u 1g 34 6m 5u +u 1g 34 6n 5v +u 1g 34 6o 5w +u 1g 35 6p 5x +u 1g 34 6q 5r +u 1g 34 6r 5s +u 1g 34 6s 5t +u 1g 34 6t 5u +u 1g 34 6u 5v +u 1g 34 6v 5w +u 1g 35 6w 5x +u 1g 34 6q 3A +u 1g 34 6r 3B +u 1g 34 6s 3C +u 1g 34 6t 3D +u 1g 34 6u 3E +u 1g 34 6v 3F +u 1g 34 6w 3G +u 1g 34 3A 5r +u 1g 34 3B 5s +u 1g 34 3C 5t +u 1g 34 3D 5u +u 1g 34 3E 5v +u 1g 34 3F 5w +u 1g 38 3G 5x +u 1g 35 1d 6L +u 1g 35 6L 6M +u 1g 35 6M 6N +u 1g 35 6N 6O +u 1g 35 6O 6P +u 1g 35 6P 6Q +u 1g 35 6Q 6R +u 1g 34 6x 6L +u 1g 34 6y 6M +u 1g 34 6z 6N +u 1g 34 6A 6O +u 1g 34 6B 6P +u 1g 34 6C 6Q +u 1g 35 6D 6R +u 1g 34 6q 6L +u 1g 34 6r 6M +u 1g 34 6s 6N +u 1g 34 6t 6O +u 1g 34 6u 6P +u 1g 34 6v 6Q +u 1g 37 6w 6R +u 1g 34 3A 6L +u 1g 34 3B 6M +u 1g 34 3C 6N +u 1g 34 3D 6O +u 1g 34 3E 6P +u 1g 34 3F 6Q +u 1g 35 3G 6R +u 1g 36 o 6S +u 1g 36 6S 6T +u 1g 36 6T 6U +u 1g 36 6U 6V +u 1g 36 6V 6W +u 1g 36 6W 6X +u 1g 36 6X 6Y +u 1g 34 6S 3H +u 1g 34 6T 3I +u 1g 34 6U 3J +u 1g 34 6V 3K +u 1g 34 6W 3L +u 1g 34 6X 3M +u 1g 37 6Y 3N +u 1g 36 n 6Z +u 1g 36 6Z 6% +u 1g 36 6% 6@ +u 1g 36 6@ 70 +u 1g 36 70 71 +u 1g 36 71 72 +u 1g 36 72 73 +u 1g 34 6Z 6S +u 1g 34 6% 6T +u 1g 34 6@ 6U +u 1g 34 70 6V +u 1g 34 71 6W +u 1g 34 72 6X +u 1g 35 73 6Y +u 1g 34 6Z 3H +u 1g 34 6% 3I +u 1g 34 6@ 3J +u 1g 34 70 3K +u 1g 34 71 3L +u 1g 34 72 3M +u 1g 34 73 3N +u 1g 36 A 74 +u 1g 36 74 75 +u 1g 36 75 76 +u 1g 36 76 77 +u 1g 36 77 78 +u 1g 36 78 79 +u 1g 36 79 7a +u 1g 34 6Z 74 +u 1g 34 6% 75 +u 1g 34 6@ 76 +u 1g 34 70 77 +u 1g 34 71 78 +u 1g 34 72 79 +u 1g 35 73 7a +u 1g 36 L 7b +u 1g 36 7b 7c +u 1g 36 7c 7d +u 1g 36 7d 7e +u 1g 36 7e 7f +u 1g 36 7f 7g +u 1g 36 7g 7h +u 1g 34 74 7b +u 1g 34 75 7c +u 1g 34 76 7d +u 1g 34 77 7e +u 1g 34 78 7f +u 1g 34 79 7g +u 1g 35 7a 7h +u 1g 34 6Z 7b +u 1g 34 6% 7c +u 1g 34 6@ 7d +u 1g 34 70 7e +u 1g 34 71 7f +u 1g 34 72 7g +u 1g 35 73 7h +u 1g 34 7b 5k +u 1g 34 7c 5l +u 1g 34 7d 5m +u 1g 34 7e 5n +u 1g 34 7f 5o +u 1g 34 7g 5p +u 1g 36 7h 5q +u 1g 34 6Z 5k +u 1g 34 6% 5l +u 1g 34 6@ 5m +u 1g 34 70 5n +u 1g 34 71 5o +u 1g 34 72 5p +u 1g 34 73 5q +u 1g 34 3H 5k +u 1g 34 3I 5l +u 1g 34 3J 5m +u 1g 34 3K 5n +u 1g 34 3L 5o +u 1g 34 3M 5p +u 1g 38 3N 5q +u 1g 36 C 7i +u 1g 36 7i 7j +u 1g 36 7j 7k +u 1g 36 7k 7l +u 1g 36 7l 7m +u 1g 36 7m 7n +u 1g 36 7n 7o +u 1g 34 74 7i +u 1g 34 75 7j +u 1g 34 76 7k +u 1g 34 77 7l +u 1g 34 78 7m +u 1g 34 79 7n +u 1g 36 7a 7o +u 1g 34 6Z 7i +u 1g 34 6% 7j +u 1g 34 6@ 7k +u 1g 34 70 7l +u 1g 34 71 7m +u 1g 34 72 7n +u 1g 35 73 7o +u 1g 34 6S 7i +u 1g 34 6T 7j +u 1g 34 6U 7k +u 1g 34 6V 7l +u 1g 34 6W 7m +u 1g 34 6X 7n +u 1g 35 6Y 7o +u 1g 34 6S 3O +u 1g 34 6T 3P +u 1g 34 6U 3Q +u 1g 34 6V 3R +u 1g 34 6W 3S +u 1g 34 6X 3T +u 1g 34 6Y 3U +u 1g 36 E 7p +u 1g 36 7p 7q +u 1g 36 7q 7r +u 1g 36 7r 7s +u 1g 36 7s 7t +u 1g 36 7t 7u +u 1g 36 7u 7v +u 1g 34 7p 3O +u 1g 34 7q 3P +u 1g 34 7r 3Q +u 1g 34 7s 3R +u 1g 34 7t 3S +u 1g 34 7u 3T +u 1g 35 7v 3U +u 1g 34 6S 7p +u 1g 34 6T 7q +u 1g 34 6U 7r +u 1g 34 6V 7s +u 1g 34 6W 7t +u 1g 34 6X 7u +u 1g 37 6Y 7v +u 1g 37 1c 7w +u 1g 37 7w 7x +u 1g 37 7x 7y +u 1g 37 7y 7z +u 1g 37 7z 7A +u 1g 37 7A 7B +u 1g 37 7B 7C +u 1g 34 7p 7w +u 1g 34 7q 7x +u 1g 34 7r 7y +u 1g 34 7s 7z +u 1g 34 7t 7A +u 1g 34 7u 7B +u 1g 34 7v 7C +u 1g 34 6S 7w +u 1g 34 6T 7x +u 1g 34 6U 7y +u 1g 34 6V 7z +u 1g 34 6W 7A +u 1g 34 6X 7B +u 1g 36 6Y 7C +u 1g 34 7i 7w +u 1g 34 7j 7x +u 1g 34 7k 7y +u 1g 34 7l 7z +u 1g 34 7m 7A +u 1g 34 7n 7B +u 1g 37 7o 7C +u 1g 36 W 7D +u 1g 36 7D 7E +u 1g 36 7E 7F +u 1g 36 7F 7G +u 1g 36 7G 7H +u 1g 36 7H 7I +u 1g 36 7I 7J +u 1g 34 7D 4z +u 1g 34 7E 4A +u 1g 34 7F 4B +u 1g 34 7G 4C +u 1g 34 7H 4D +u 1g 34 7I 4E +u 1g 34 7J 4F +u 1g 36 p 7K +u 1g 36 7K 7L +u 1g 36 7L 7M +u 1g 36 7M 7N +u 1g 36 7N 7O +u 1g 36 7O 7P +u 1g 36 7P 7Q +u 1g 34 7K 7D +u 1g 34 7L 7E +u 1g 34 7M 7F +u 1g 34 7N 7G +u 1g 34 7O 7H +u 1g 34 7P 7I +u 1g 38 7Q 7J +u 1g 34 7K 4z +u 1g 34 7L 4A +u 1g 34 7M 4B +u 1g 34 7N 4C +u 1g 34 7O 4D +u 1g 34 7P 4E +u 1g 34 7Q 4F +u 1g 34 7K 4s +u 1g 34 7L 4t +u 1g 34 7M 4u +u 1g 34 7N 4v +u 1g 34 7O 4w +u 1g 34 7P 4x +u 1g 36 7Q 4y +u 1g 36 F 7R +u 1g 36 7R 7S +u 1g 36 7S 7T +u 1g 36 7T 7U +u 1g 36 7U 7V +u 1g 36 7V 7W +u 1g 36 7W 7X +u 1g 34 7K 7R +u 1g 34 7L 7S +u 1g 34 7M 7T +u 1g 34 7N 7U +u 1g 34 7O 7V +u 1g 34 7P 7W +u 1g 34 7Q 7X +u 1g 35 @ 7Y +u 1g 35 7Y 7Z +u 1g 35 7Z 7% +u 1g 35 7% 7@ +u 1g 35 7@ 80 +u 1g 35 80 81 +u 1g 35 81 82 +u 1g 34 7R 7Y +u 1g 34 7S 7Z +u 1g 34 7T 7% +u 1g 34 7U 7@ +u 1g 34 7V 80 +u 1g 34 7W 81 +u 1g 34 7X 82 +u 1g 34 7K 7Y +u 1g 34 7L 7Z +u 1g 34 7M 7% +u 1g 34 7N 7@ +u 1g 34 7O 80 +u 1g 34 7P 81 +u 1g 35 7Q 82 +u 1g 34 4s 7Y +u 1g 34 4t 7Z +u 1g 34 4u 7% +u 1g 34 4v 7@ +u 1g 34 4w 80 +u 1g 34 4x 81 +u 1g 34 4y 82 +u 1g 36 1b 83 +u 1g 36 83 84 +u 1g 36 84 85 +u 1g 36 85 86 +u 1g 36 86 87 +u 1g 36 87 88 +u 1g 36 88 89 +u 1g 34 7D 83 +u 1g 34 7E 84 +u 1g 34 7F 85 +u 1g 34 7G 86 +u 1g 34 7H 87 +u 1g 34 7I 88 +u 1g 34 7J 89 +u 1g 34 7K 83 +u 1g 34 7L 84 +u 1g 34 7M 85 +u 1g 34 7N 86 +u 1g 34 7O 87 +u 1g 34 7P 88 +u 1g 35 7Q 89 +u 1g 34 7R 83 +u 1g 34 7S 84 +u 1g 34 7T 85 +u 1g 34 7U 86 +u 1g 34 7V 87 +u 1g 34 7W 88 +u 1g 36 7X 89 +u 1g 36 G 8a +u 1g 36 8a 8b +u 1g 36 8b 8c +u 1g 36 8c 8d +u 1g 36 8d 8e +u 1g 36 8e 8f +u 1g 36 8f 8g +u 1g 34 8a 6x +u 1g 34 8b 6y +u 1g 34 8c 6z +u 1g 34 8d 6A +u 1g 34 8e 6B +u 1g 34 8f 6C +u 1g 35 8g 6D +u 1g 36 q 8h +u 1g 36 8h 8i +u 1g 36 8i 8j +u 1g 36 8j 8k +u 1g 36 8k 8l +u 1g 36 8l 8m +u 1g 36 8m 8n +u 1g 34 8h 8a +u 1g 34 8i 8b +u 1g 34 8j 8c +u 1g 34 8k 8d +u 1g 34 8l 8e +u 1g 34 8m 8f +u 1g 34 8n 8g +u 1g 34 8h 6x +u 1g 34 8i 6y +u 1g 34 8j 6z +u 1g 34 8k 6A +u 1g 34 8l 6B +u 1g 34 8m 6C +u 1g 37 8n 6D +u 1g 36 S 8o +u 1g 36 8o 8p +u 1g 36 8p 8q +u 1g 36 8q 8r +u 1g 36 8r 8s +u 1g 36 8s 8t +u 1g 36 8t 8u +u 1g 34 4l 8o +u 1g 34 4m 8p +u 1g 34 4n 8q +u 1g 34 4o 8r +u 1g 34 4p 8s +u 1g 34 4q 8t +u 1g 35 4r 8u +u 1g 34 8h 4l +u 1g 34 8i 4m +u 1g 34 8j 4n +u 1g 34 8k 4o +u 1g 34 8l 4p +u 1g 34 8m 4q +u 1g 34 8n 4r +u 1g 34 8h 8o +u 1g 34 8i 8p +u 1g 34 8j 8q +u 1g 34 8k 8r +u 1g 34 8l 8s +u 1g 34 8m 8t +u 1g 37 8n 8u +u 1g 36 10 8v +u 1g 36 8v 8w +u 1g 36 8w 8x +u 1g 36 8x 8y +u 1g 36 8y 8z +u 1g 36 8z 8A +u 1g 36 8A 8B +u 1g 34 6x 8v +u 1g 34 6y 8w +u 1g 34 6z 8x +u 1g 34 6A 8y +u 1g 34 6B 8z +u 1g 34 6C 8A +u 1g 34 6D 8B +u 1g 34 8h 8v +u 1g 34 8i 8w +u 1g 34 8j 8x +u 1g 34 8k 8y +u 1g 34 8l 8z +u 1g 34 8m 8A +u 1g 35 8n 8B +u 1g 34 4l 8v +u 1g 34 4m 8w +u 1g 34 4n 8x +u 1g 34 4o 8y +u 1g 34 4p 8z +u 1g 34 4q 8A +u 1g 36 4r 8B +u 1g 37 R 8C +u 1g 37 8C 8D +u 1g 37 8D 8E +u 1g 37 8E 8F +u 1g 37 8F 8G +u 1g 37 8G 8H +u 1g 37 8H 8I +u 1g 34 8C 8o +u 1g 34 8D 8p +u 1g 34 8E 8q +u 1g 34 8F 8r +u 1g 34 8G 8s +u 1g 34 8H 8t +u 1g 34 8I 8u +u 1g 34 8h 8C +u 1g 34 8i 8D +u 1g 34 8j 8E +u 1g 34 8k 8F +u 1g 34 8l 8G +u 1g 34 8m 8H +u 1g 35 8n 8I +u 1g 34 8a 8C +u 1g 34 8b 8D +u 1g 34 8c 8E +u 1g 34 8d 8F +u 1g 34 8e 8G +u 1g 34 8f 8H +u 1g 37 8g 8I +u 1g 34 4e 8v +u 1g 34 4f 8w +u 1g 34 4g 8x +u 1g 34 4h 8y +u 1g 34 4i 8z +u 1g 34 4j 8A +u 1g 34 4k 8B +u 1g 34 4e 3V +u 1g 34 4f 3W +u 1g 34 4g 3X +u 1g 34 4h 3Y +u 1g 34 4i 3Z +u 1g 34 4j 3% +u 1g 38 4k 3@ +u 1g 34 4e 40 +u 1g 34 4f 41 +u 1g 34 4g 42 +u 1g 34 4h 43 +u 1g 34 4i 44 +u 1g 34 4j 45 +u 1g 35 4k 46 +u 1g 34 4G 40 +u 1g 34 4H 41 +u 1g 34 4I 42 +u 1g 34 4J 43 +u 1g 34 4K 44 +u 1g 34 4L 45 +u 1g 35 4M 46 +u 1g 34 3V 8v +u 1g 34 3W 8w +u 1g 34 3X 8x +u 1g 34 3Y 8y +u 1g 34 3Z 8z +u 1g 34 3% 8A +u 1g 37 3@ 8B +u 1g 35 s 8J +u 1g 35 8J 8K +u 1g 35 8K 8L +u 1g 35 8L 8M +u 1g 35 8M 8N +u 1g 35 8N 8O +u 1g 35 8O 8P +u 1g 34 8J 4@ +u 1g 34 8K 50 +u 1g 34 8L 51 +u 1g 34 8M 52 +u 1g 34 8N 53 +u 1g 34 8O 54 +u 1g 35 8P 55 +u 1g 34 4@ 7b +u 1g 34 50 7c +u 1g 34 51 7d +u 1g 34 52 7e +u 1g 34 53 7f +u 1g 34 54 7g +u 1g 34 55 7h +u 1g 34 8J 7b +u 1g 34 8K 7c +u 1g 34 8L 7d +u 1g 34 8M 7e +u 1g 34 8N 7f +u 1g 34 8O 7g +u 1g 37 8P 7h +u 1g 36 12 8Q +u 1g 36 8Q 8R +u 1g 36 8R 8S +u 1g 36 8S 8T +u 1g 36 8T 8U +u 1g 36 8U 8V +u 1g 36 8V 8W +u 1g 34 4@ 8Q +u 1g 34 50 8R +u 1g 34 51 8S +u 1g 34 52 8T +u 1g 34 53 8U +u 1g 34 54 8V +u 1g 35 55 8W +u 1g 34 8J 8Q +u 1g 34 8K 8R +u 1g 34 8L 8S +u 1g 34 8M 8T +u 1g 34 8N 8U +u 1g 34 8O 8V +u 1g 36 8P 8W +u 1g 36 M 8X +u 1g 36 8X 8Y +u 1g 36 8Y 8Z +u 1g 36 8Z 8% +u 1g 36 8% 8@ +u 1g 36 8@ 90 +u 1g 36 90 91 +u 1g 36 14 92 +u 1g 36 92 93 +u 1g 36 93 94 +u 1g 36 94 95 +u 1g 36 95 96 +u 1g 36 96 97 +u 1g 36 97 98 +u 1g 34 8X 92 +u 1g 34 8Y 93 +u 1g 34 8Z 94 +u 1g 34 8% 95 +u 1g 34 8@ 96 +u 1g 34 90 97 +u 1g 35 91 98 +u 1g 34 8J 8X +u 1g 34 8K 8Y +u 1g 34 8L 8Z +u 1g 34 8M 8% +u 1g 34 8N 8@ +u 1g 34 8O 90 +u 1g 37 8P 91 +u 1g 34 8J 92 +u 1g 34 8K 93 +u 1g 34 8L 94 +u 1g 34 8M 95 +u 1g 34 8N 96 +u 1g 34 8O 97 +u 1g 35 8P 98 +u 1g 34 7b 92 +u 1g 34 7c 93 +u 1g 34 7d 94 +u 1g 34 7e 95 +u 1g 34 7f 96 +u 1g 34 7g 97 +u 1g 34 7h 98 +u 1g 34 8X 8Q +u 1g 34 8Y 8R +u 1g 34 8Z 8S +u 1g 34 8% 8T +u 1g 34 8@ 8U +u 1g 34 90 8V +u 1g 34 91 8W +u 1g 36 t 99 +u 1g 36 99 9a +u 1g 36 9a 9b +u 1g 36 9b 9c +u 1g 36 9c 9d +u 1g 36 9d 9e +u 1g 36 9e 9f +u 1g 36 N 9g +u 1g 36 9g 9h +u 1g 36 9h 9i +u 1g 36 9i 9j +u 1g 36 9j 9k +u 1g 36 9k 9l +u 1g 36 9l 9m +u 1g 34 99 9g +u 1g 34 9a 9h +u 1g 34 9b 9i +u 1g 34 9c 9j +u 1g 34 9d 9k +u 1g 34 9e 9l +u 1g 34 9f 9m +u 1g 36 16 9n +u 1g 36 9n 9o +u 1g 36 9o 9p +u 1g 36 9p 9q +u 1g 36 9q 9r +u 1g 36 9r 9s +u 1g 36 9s 9t +u 1g 34 9g 9n +u 1g 34 9h 9o +u 1g 34 9i 9p +u 1g 34 9j 9q +u 1g 34 9k 9r +u 1g 34 9l 9s +u 1g 35 9m 9t +u 1g 34 99 9n +u 1g 34 9a 9o +u 1g 34 9b 9p +u 1g 34 9c 9q +u 1g 34 9d 9r +u 1g 34 9e 9s +u 1g 36 9f 9t +u 1g 35 1g 9u +u 1g 35 9u 9v +u 1g 35 9v 9w +u 1g 35 9w 9x +u 1g 35 9x 9y +u 1g 35 9y 9z +u 1g 35 9z 9A +u 1g 34 5% 9u +u 1g 34 5@ 9v +u 1g 34 60 9w +u 1g 34 61 9x +u 1g 34 62 9y +u 1g 34 63 9z +u 1g 34 64 9A +u 1g 34 99 9u +u 1g 34 9a 9v +u 1g 34 9b 9w +u 1g 34 9c 9x +u 1g 34 9d 9y +u 1g 34 9e 9z +u 1g 35 9f 9A +u 1g 34 99 5% +u 1g 34 9a 5@ +u 1g 34 9b 60 +u 1g 34 9c 61 +u 1g 34 9d 62 +u 1g 34 9e 63 +u 1g 35 9f 64 +u 1g 34 99 5y +u 1g 34 9a 5z +u 1g 34 9b 5A +u 1g 34 9c 5B +u 1g 34 9d 5C +u 1g 34 9e 5D +u 1g 34 9f 5E +u 1g 34 5y 9n +u 1g 34 5z 9o +u 1g 34 5A 9p +u 1g 34 5B 9q +u 1g 34 5C 9r +u 1g 34 5D 9s +u 1g 35 5E 9t +u 1g 36 19 9B +u 1g 36 9B 9C +u 1g 36 9C 9D +u 1g 36 9D 9E +u 1g 36 9E 9F +u 1g 36 9F 9G +u 1g 36 9G 9H +u 1g 34 9B 9u +u 1g 34 9C 9v +u 1g 34 9D 9w +u 1g 34 9E 9x +u 1g 34 9F 9y +u 1g 34 9G 9z +u 1g 37 9H 9A +u 1g 34 99 9B +u 1g 34 9a 9C +u 1g 34 9b 9D +u 1g 34 9c 9E +u 1g 34 9d 9F +u 1g 34 9e 9G +u 1g 34 9f 9H +u 1g 34 9g 9B +u 1g 34 9h 9C +u 1g 34 9i 9D +u 1g 34 9j 9E +u 1g 34 9k 9F +u 1g 34 9l 9G +u 1g 37 9m 9H +u 1g 36 v 9I +u 1g 36 9I 9J +u 1g 36 9J 9K +u 1g 36 9K 9L +u 1g 36 9L 9M +u 1g 36 9M 9N +u 1g 36 9N 9O +u 1g 34 9I 8C +u 1g 34 9J 8D +u 1g 34 9K 8E +u 1g 34 9L 8F +u 1g 34 9M 8G +u 1g 34 9N 8H +u 1g 37 9O 8I +u 1g 34 9I 8o +u 1g 34 9J 8p +u 1g 34 9K 8q +u 1g 34 9L 8r +u 1g 34 9M 8s +u 1g 34 9N 8t +u 1g 37 9O 8u +u 1g 36 U 9P +u 1g 36 9P 9Q +u 1g 36 9Q 9R +u 1g 36 9R 9S +u 1g 36 9S 9T +u 1g 36 9T 9U +u 1g 36 9U 9V +u 1g 34 8C 9P +u 1g 34 8D 9Q +u 1g 34 8E 9R +u 1g 34 8F 9S +u 1g 34 8G 9T +u 1g 34 8H 9U +u 1g 36 8I 9V +u 1g 34 9I 9P +u 1g 34 9J 9Q +u 1g 34 9K 9R +u 1g 34 9L 9S +u 1g 34 9M 9T +u 1g 34 9N 9U +u 1g 34 9O 9V +u 1g 34 9I 5M +u 1g 34 9J 5N +u 1g 34 9K 5O +u 1g 34 9L 5P +u 1g 34 9M 5Q +u 1g 34 9N 5R +u 1g 34 9O 5S +u 1g 34 9I 5% +u 1g 34 9J 5@ +u 1g 34 9K 60 +u 1g 34 9L 61 +u 1g 34 9M 62 +u 1g 34 9N 63 +u 1g 36 9O 64 +u 1g 34 9I 9u +u 1g 34 9J 9v +u 1g 34 9K 9w +u 1g 34 9L 9x +u 1g 34 9M 9y +u 1g 34 9N 9z +u 1g 38 9O 9A +u 1g 34 9P 9u +u 1g 34 9Q 9v +u 1g 34 9R 9w +u 1g 34 9S 9x +u 1g 34 9T 9y +u 1g 34 9U 9z +u 1g 34 9V 9A +u 1g 34 8o 5M +u 1g 34 8p 5N +u 1g 34 8q 5O +u 1g 34 8r 5P +u 1g 34 8s 5Q +u 1g 34 8t 5R +u 1g 36 8u 5S +u 1g 34 5d 5y +u 1g 34 5e 5z +u 1g 34 5f 5A +u 1g 34 5g 5B +u 1g 34 5h 5C +u 1g 34 5i 5D +u 1g 36 5j 5E +u 1g 34 4@ 65 +u 1g 34 50 66 +u 1g 34 51 67 +u 1g 34 52 68 +u 1g 34 53 69 +u 1g 34 54 6a +u 1g 37 55 6b +u 1g 36 x 9W +u 1g 36 9W 9X +u 1g 36 9X 9Y +u 1g 36 9Y 9Z +u 1g 36 9Z 9% +u 1g 36 9% 9@ +u 1g 36 9@ a0 +u 1g 36 V a1 +u 1g 36 a1 a2 +u 1g 36 a2 a3 +u 1g 36 a3 a4 +u 1g 36 a4 a5 +u 1g 36 a5 a6 +u 1g 36 a6 a7 +u 1g 34 9W a1 +u 1g 34 9X a2 +u 1g 34 9Y a3 +u 1g 34 9Z a4 +u 1g 34 9% a5 +u 1g 34 9@ a6 +u 1g 35 a0 a7 +u 1g 34 a1 7D +u 1g 34 a2 7E +u 1g 34 a3 7F +u 1g 34 a4 7G +u 1g 34 a5 7H +u 1g 34 a6 7I +u 1g 35 a7 7J +u 1g 34 9W 7D +u 1g 34 9X 7E +u 1g 34 9Y 7F +u 1g 34 9Z 7G +u 1g 34 9% 7H +u 1g 34 9@ 7I +u 1g 37 a0 7J +u 1g 34 7D 5T +u 1g 34 7E 5U +u 1g 34 7F 5V +u 1g 34 7G 5W +u 1g 34 7H 5X +u 1g 34 7I 5Y +u 1g 34 7J 5Z +u 1g 34 9W 5T +u 1g 34 9X 5U +u 1g 34 9Y 5V +u 1g 34 9Z 5W +u 1g 34 9% 5X +u 1g 34 9@ 5Y +u 1g 35 a0 5Z +u 1g 36 1a a8 +u 1g 36 a8 a9 +u 1g 36 a9 aa +u 1g 36 aa ab +u 1g 36 ab ac +u 1g 36 ac ad +u 1g 36 ad ae +u 1g 34 a1 a8 +u 1g 34 a2 a9 +u 1g 34 a3 aa +u 1g 34 a4 ab +u 1g 34 a5 ac +u 1g 34 a6 ad +u 1g 38 a7 ae +u 1g 34 9W a8 +u 1g 34 9X a9 +u 1g 34 9Y aa +u 1g 34 9Z ab +u 1g 34 9% ac +u 1g 34 9@ ad +u 1g 35 a0 ae +u 1g 34 9W 8Q +u 1g 34 9X 8R +u 1g 34 9Y 8S +u 1g 34 9Z 8T +u 1g 34 9% 8U +u 1g 34 9@ 8V +u 1g 37 a0 8W +u 1g 34 8Q a8 +u 1g 34 8R a9 +u 1g 34 8S aa +u 1g 34 8T ab +u 1g 34 8U ac +u 1g 34 8V ad +u 1g 34 8W ae +u 1g 34 8Q 65 +u 1g 34 8R 66 +u 1g 34 8S 67 +u 1g 34 8T 68 +u 1g 34 8U 69 +u 1g 34 8V 6a +u 1g 34 8W 6b +u 1g 34 9W 65 +u 1g 34 9X 66 +u 1g 34 9Y 67 +u 1g 34 9Z 68 +u 1g 34 9% 69 +u 1g 34 9@ 6a +u 1g 35 a0 6b +u 1g 34 6c 1s +u 1g 34 6d 1t +u 1g 34 6e 1u +u 1g 34 6f 1v +u 1g 34 6g 1w +u 1g 34 6h 1x +u 1g 34 6i 1i +u 1g 34 6c 1m +u 1g 34 6d 1n +u 1g 34 6e 1o +u 1g 34 6f 1p +u 1g 34 6g 1q +u 1g 34 6h 1r +u 1g 34 6i 2c +u 1g 34 6c 1y +u 1g 34 6d 1z +u 1g 34 6e 1A +u 1g 34 6f 1B +u 1g 34 6g 1C +u 1g 34 6h 1D +u 1g 34 6i 2d +u 1g 34 6E 1s +u 1g 34 6F 1t +u 1g 34 6G 1u +u 1g 34 6H 1v +u 1g 34 6I 1w +u 1g 34 6J 1x +u 1g 35 6K 1i +u 1g 36 1f af +u 1g 36 af ag +u 1g 36 ag ah +u 1g 36 ah ai +u 1g 36 ai aj +u 1g 36 aj ak +u 1g 36 ak al +u 1g 34 6c af +u 1g 34 6d ag +u 1g 34 6e ah +u 1g 34 6f ai +u 1g 34 6g aj +u 1g 34 6h ak +u 1g 36 6i al +u 1g 34 af 1y +u 1g 34 ag 1z +u 1g 34 ah 1A +u 1g 34 ai 1B +u 1g 34 aj 1C +u 1g 34 ak 1D +u 1g 34 al 2d +u 1g 34 6j af +u 1g 34 6k ag +u 1g 34 6l ah +u 1g 34 6m ai +u 1g 34 6n aj +u 1g 34 6o ak +u 1g 35 6p al +u 1g 34 3V 6L +u 1g 34 3W 6M +u 1g 34 3X 6N +u 1g 34 3Y 6O +u 1g 34 3Z 6P +u 1g 34 3% 6Q +u 1g 34 3@ 6R +u 1g 34 74 2o +u 1g 34 75 2p +u 1g 34 76 2q +u 1g 34 77 2r +u 1g 34 78 2s +u 1g 34 79 2t +u 1g 34 7a 3e +u 1g 34 74 2u +u 1g 34 75 2v +u 1g 34 76 2w +u 1g 34 77 2x +u 1g 34 78 2y +u 1g 34 79 2z +u 1g 34 7a 3f +u 1g 34 7i 2o +u 1g 34 7j 2p +u 1g 34 7k 2q +u 1g 34 7l 2r +u 1g 34 7m 2s +u 1g 34 7n 2t +u 1g 34 7o 3e +u 1g 34 74 92 +u 1g 34 75 93 +u 1g 34 76 94 +u 1g 34 77 95 +u 1g 34 78 96 +u 1g 34 79 97 +u 1g 36 7a 98 +u 1g 34 92 2u +u 1g 34 93 2v +u 1g 34 94 2w +u 1g 34 95 2x +u 1g 34 96 2y +u 1g 34 97 2z +u 1g 34 98 3f +u 1g 34 7i 2A +u 1g 34 7j 2B +u 1g 34 7k 2C +u 1g 34 7l 2D +u 1g 34 7m 2E +u 1g 34 7n 2F +u 1g 36 7o 2k +u 1g 34 7w 2A +u 1g 34 7x 2B +u 1g 34 7y 2C +u 1g 34 7z 2D +u 1g 34 7A 2E +u 1g 34 7B 2F +u 1g 35 7C 2k +u 1g 34 4s 7p +u 1g 34 4t 7q +u 1g 34 4u 7r +u 1g 34 4v 7s +u 1g 34 4w 7t +u 1g 34 4x 7u +u 1g 37 4y 7v +u 1g 34 7p 4G +u 1g 34 7q 4H +u 1g 34 7r 4I +u 1g 34 7s 4J +u 1g 34 7t 4K +u 1g 34 7u 4L +u 1g 34 7v 4M +u 1g 34 7p 7Y +u 1g 34 7q 7Z +u 1g 34 7r 7% +u 1g 34 7s 7@ +u 1g 34 7t 80 +u 1g 34 7u 81 +u 1g 34 7v 82 +u 1g 34 3O 4G +u 1g 34 3P 4H +u 1g 34 3Q 4I +u 1g 34 3R 4J +u 1g 34 3S 4K +u 1g 34 3T 4L +u 1g 36 3U 4M +u 1g 34 7Y 7w +u 1g 34 7Z 7x +u 1g 34 7% 7y +u 1g 34 7@ 7z +u 1g 34 80 7A +u 1g 34 81 7B +u 1g 35 82 7C +u 1g 34 7R 2M +u 1g 34 7S 2N +u 1g 34 7T 2O +u 1g 34 7U 2P +u 1g 34 7V 2Q +u 1g 34 7W 2R +u 1g 34 7X 3h +u 1g 34 7R 2G +u 1g 34 7S 2H +u 1g 34 7T 2I +u 1g 34 7U 2J +u 1g 34 7V 2K +u 1g 34 7W 2L +u 1g 34 7X 3g +u 1g 34 83 2M +u 1g 34 84 2N +u 1g 34 85 2O +u 1g 34 86 2P +u 1g 34 87 2Q +u 1g 34 88 2R +u 1g 34 89 3h +u 1g 34 7R 7w +u 1g 34 7S 7x +u 1g 34 7T 7y +u 1g 34 7U 7z +u 1g 34 7V 7A +u 1g 34 7W 7B +u 1g 36 7X 7C +u 1g 34 7w 2G +u 1g 34 7x 2H +u 1g 34 7y 2I +u 1g 34 7z 2J +u 1g 34 7A 2K +u 1g 34 7B 2L +u 1g 34 7C 3g +u 1g 34 8a 1K +u 1g 34 8b 1L +u 1g 34 8c 1M +u 1g 34 8d 1N +u 1g 34 8e 1O +u 1g 34 8f 1P +u 1g 34 8g 2f +u 1g 34 8a 1E +u 1g 34 8b 1F +u 1g 34 8c 1G +u 1g 34 8d 1H +u 1g 34 8e 1I +u 1g 34 8f 1J +u 1g 35 8g 2e +u 1g 34 8C 1K +u 1g 34 8D 1L +u 1g 34 8E 1M +u 1g 34 8F 1N +u 1g 34 8G 1O +u 1g 34 8H 1P +u 1g 34 8I 2f +u 1g 34 8a 6E +u 1g 34 8b 6F +u 1g 34 8c 6G +u 1g 34 8d 6H +u 1g 34 8e 6I +u 1g 34 8f 6J +u 1g 35 8g 6K +u 1g 34 6E 1E +u 1g 34 6F 1F +u 1g 34 6G 1G +u 1g 34 6H 1H +u 1g 34 6I 1I +u 1g 34 6J 1J +u 1g 34 6K 2e +u 1g 34 8o 4N +u 1g 34 8p 4O +u 1g 34 8q 4P +u 1g 34 8r 4Q +u 1g 34 8s 4R +u 1g 34 8t 4S +u 1g 34 8u 4T +u 1g 34 8v 6L +u 1g 34 8w 6M +u 1g 34 8x 6N +u 1g 34 8y 6O +u 1g 34 8z 6P +u 1g 34 8A 6Q +u 1g 37 8B 6R +u 1g 34 8X 2Y +u 1g 34 8Y 2Z +u 1g 34 8Z 2% +u 1g 34 8% 2@ +u 1g 34 8@ 30 +u 1g 34 90 31 +u 1g 35 91 3j +u 1g 34 8X 2S +u 1g 34 8Y 2T +u 1g 34 8Z 2U +u 1g 34 8% 2V +u 1g 34 8@ 2W +u 1g 34 90 2X +u 1g 34 91 3i +u 1g 34 92 2Y +u 1g 34 93 2Z +u 1g 34 94 2% +u 1g 34 95 2@ +u 1g 34 96 30 +u 1g 34 97 31 +u 1g 35 98 3j +u 1g 34 8X a8 +u 1g 34 8Y a9 +u 1g 34 8Z aa +u 1g 34 8% ab +u 1g 34 8@ ac +u 1g 34 90 ad +u 1g 37 91 ae +u 1g 34 a8 2S +u 1g 34 a9 2T +u 1g 34 aa 2U +u 1g 34 ab 2V +u 1g 34 ac 2W +u 1g 34 ad 2X +u 1g 34 ae 3i +u 1g 34 9g 1W +u 1g 34 9h 1X +u 1g 34 9i 1Y +u 1g 34 9j 1Z +u 1g 34 9k 1% +u 1g 34 9l 1@ +u 1g 35 9m 2h +u 1g 34 9g 1Q +u 1g 34 9h 1R +u 1g 34 9i 1S +u 1g 34 9j 1T +u 1g 34 9k 1U +u 1g 34 9l 1V +u 1g 34 9m 2g +u 1g 34 9B 1Q +u 1g 34 9C 1R +u 1g 34 9D 1S +u 1g 34 9E 1T +u 1g 34 9F 1U +u 1g 34 9G 1V +u 1g 34 9H 2g +u 1g 34 9g af +u 1g 34 9h ag +u 1g 34 9i ah +u 1g 34 9j ai +u 1g 34 9k aj +u 1g 34 9l ak +u 1g 36 9m al +u 1g 34 af 1W +u 1g 34 ag 1X +u 1g 34 ah 1Y +u 1g 34 ai 1Z +u 1g 34 aj 1% +u 1g 34 ak 1@ +u 1g 34 al 2h +u 1g 34 9n af +u 1g 34 9o ag +u 1g 34 9p ah +u 1g 34 9q ai +u 1g 34 9r aj +u 1g 34 9s ak +u 1g 36 9t al +u 1g 34 5d 6j +u 1g 34 5e 6k +u 1g 34 5f 6l +u 1g 34 5g 6m +u 1g 34 5h 6n +u 1g 34 5i 6o +u 1g 35 5j 6p +u 1g 34 6j 9n +u 1g 34 6k 9o +u 1g 34 6l 9p +u 1g 34 6m 9q +u 1g 34 6n 9r +u 1g 34 6o 9s +u 1g 34 6p 9t +u 1g 34 5d 9n +u 1g 34 5e 9o +u 1g 34 5f 9p +u 1g 34 5g 9q +u 1g 34 5h 9r +u 1g 34 5i 9s +u 1g 36 5j 9t +u 1g 34 8C 20 +u 1g 34 8D 21 +u 1g 34 8E 22 +u 1g 34 8F 23 +u 1g 34 8G 24 +u 1g 34 8H 25 +u 1g 34 8I 2i +u 1g 34 9P 20 +u 1g 34 9Q 21 +u 1g 34 9R 22 +u 1g 34 9S 23 +u 1g 34 9T 24 +u 1g 34 9U 25 +u 1g 35 9V 2i +u 1g 34 5M 4N +u 1g 34 5N 4O +u 1g 34 5O 4P +u 1g 34 5P 4Q +u 1g 34 5Q 4R +u 1g 34 5R 4S +u 1g 36 5S 4T +u 1g 34 5T 4N +u 1g 34 5U 4O +u 1g 34 5V 4P +u 1g 34 5W 4Q +u 1g 34 5X 4R +u 1g 34 5Y 4S +u 1g 37 5Z 4T +u 1g 34 9P 26 +u 1g 34 9Q 27 +u 1g 34 9R 28 +u 1g 34 9S 29 +u 1g 34 9T 2a +u 1g 34 9U 2b +u 1g 34 9V 2j +u 1g 34 9P 9B +u 1g 34 9Q 9C +u 1g 34 9R 9D +u 1g 34 9S 9E +u 1g 34 9T 9F +u 1g 34 9U 9G +u 1g 35 9V 9H +u 1g 34 9B 26 +u 1g 34 9C 27 +u 1g 34 9D 28 +u 1g 34 9E 29 +u 1g 34 9F 2a +u 1g 34 9G 2b +u 1g 34 9H 2j +u 1g 34 a1 38 +u 1g 34 a2 39 +u 1g 34 a3 3a +u 1g 34 a4 3b +u 1g 34 a5 3c +u 1g 34 a6 3d +u 1g 34 a7 3l +u 1g 34 a1 32 +u 1g 34 a2 33 +u 1g 34 a3 34 +u 1g 34 a4 35 +u 1g 34 a5 36 +u 1g 34 a6 37 +u 1g 35 a7 3k +u 1g 34 a8 38 +u 1g 34 a9 39 +u 1g 34 aa 3a +u 1g 34 ab 3b +u 1g 34 ac 3c +u 1g 34 ad 3d +u 1g 34 ae 3l +u 1g 34 a1 83 +u 1g 34 a2 84 +u 1g 34 a3 85 +u 1g 34 a4 86 +u 1g 34 a5 87 +u 1g 34 a6 88 +u 1g 37 a7 89 +u 1g 34 83 32 +u 1g 34 84 33 +u 1g 34 85 34 +u 1g 34 86 35 +u 1g 34 87 36 +u 1g 34 88 37 +u 1g 34 89 3k +u 1g 34 5T 4z +u 1g 34 5U 4A +u 1g 34 5V 4B +u 1g 34 5W 4C +u 1g 34 5X 4D +u 1g 34 5Y 4E +u 1g 36 5Z 4F +u 0 36 2n ae +u 0 35 2n 91 +u 0 35 a7 2n +u 0 37 2l 7o +u 0 35 2l 7a +u 0 35 2l 98 +u 0 35 5Z 4d +u 0 35 2m 7X +u 0 36 2m 89 +u 0 35 2m 7C +u 0 36 9H 1l +u 0 36 9V 1l +u 0 35 1k 8I +u 0 35 1l 9m +u 0 36 6i 1j +u 0 37 al 1j +u 0 35 9m 1j +u 0 34 1j 6K +u 0 34 1k 9V +u 0 35 1k 8g +u 0 36 am 7C +u 0 35 am 2m +u 0 34 am 2k +u 0 34 am 7o +u 0 34 2m an +u 0 34 an ae +u 0 35 2l ao +u 0 35 ao ae +u 0 33 an ao +u 0 36 ao 2n +u 0 35 an 2n +u 0 34 a7 ap +u 0 35 ap 2l +u 0 34 ae ap +u 0 35 ao ap +u 0 36 an ap +u 0 35 an a7 +u 0 34 2l aq +u 0 35 aq 89 +u 0 35 a7 aq +u 0 35 ap aq +u 0 38 aq 2m +u 0 35 aq ar +u 0 34 7o as +u 0 35 as 2m +u 0 34 2m ar +u 0 35 ar as +u 0 34 aq as +u 0 36 as 2l +u 0 35 as am +u 0 37 2l at +u 0 36 at 91 +u 0 35 91 ao +u 0 34 at ao +u 0 34 at 2n +u 0 35 at 98 +u 0 35 2l au +u 0 34 au ao +u 0 34 91 av +u 0 35 av 7o +u 0 35 2l av +u 0 35 av at +u 0 35 91 au +u 0 35 av au +u 0 34 au at +u 0 36 2l aB +u 0 35 ap aB +u 0 35 98 aw +u 0 34 aw 7o +u 0 35 98 av +u 0 36 av aw +u 0 33 aw at +u 0 35 aw 2l +u 0 36 aB ar +u 0 37 aq aB +u 0 35 aw 7a +u 0 35 a7 ax +u 0 36 ax 8P +u 0 35 ae ay +u 0 35 ay 8P +u 0 34 ae ax +u 0 35 ax ay +u 0 35 a0 az +u 0 35 az 8P +u 0 35 a0 ax +u 0 34 az ax +u 0 36 ae aB +u 0 36 a7 aB +u 0 35 aA aB +u 0 36 aB ax +u 0 35 7C aC +u 0 36 aC 8P +u 0 34 aC aB +u 0 34 aB ay +u 0 35 aB au +u 0 34 ay az +u 0 34 ay 91 +u 0 34 aD 7C +u 0 34 8P aD +u 0 36 aD aC +u 0 35 91 aB +u 0 36 aB aD +u 0 36 7o aD +u 0 35 av aD +u 0 35 89 aE +u 0 35 aE 7C +u 0 36 aE 2m +u 0 34 aE 7X +u 0 36 7C ar +u 0 36 ar aE +u 0 35 7a aF +u 0 35 aF 8P +u 0 34 aF 7h +u 0 35 aF 98 +u 0 35 a0 aG +u 0 38 8P aG +u 0 34 az aG +u 0 35 aG 8W +u 0 34 az 8W +u 0 35 8P aH +u 0 36 aH 7Q +u 0 34 aI 7Q +u 0 34 8P aI +u 0 35 aH aI +u 0 34 aG aI +u 0 35 aG aH +u 0 37 8P aJ +u 0 35 7Q aJ +u 0 35 aJ aH +u 0 35 aI aJ +u 0 34 73 aK +u 0 36 aK 8P +u 0 34 aK aF +u 0 36 aK 7h +u 0 35 aC aL +u 0 34 aM 7C +u 0 34 aL aM +u 0 34 7h aN +u 0 35 aN 6Y +u 0 35 aJ aN +u 0 35 aL aN +u 0 34 aC aN +u 0 36 7o aO +u 0 34 aO 8P +u 0 37 8P av +u 0 35 aO av +u 0 34 aw aO +u 0 36 7o aC +u 0 36 aC aO +u 0 34 av aC +u 0 35 7a aO +u 0 35 aF aO +u 0 34 aF aw +u 0 34 8P aP +u 0 36 aP ax +u 0 36 a0 aP +u 0 34 az aP +u 0 34 aH ax +u 0 36 aP aH +u 0 35 aQ a7 +u 0 34 aJ ax +u 0 35 ax aQ +u 0 36 aQ aJ +u 0 36 aQ 7Q +u 0 36 7C aJ +u 0 38 aC aJ +u 0 34 aA aQ +u 0 34 aJ aA +u 0 35 73 aO +u 0 36 aO aK +u 0 34 aM 7o +u 0 35 89 aA +u 0 34 aA aE +u 0 36 7Q aR +u 0 36 aR 7C +u 0 35 aR aA +u 0 35 aE aR +u 0 34 aQ aR +u 0 34 aR 82 +u 0 35 a0 aS +u 0 37 5Z aT +u 0 36 aT 4y +u 0 36 aS aT +u 0 35 aT 7J +u 0 33 aS 7Q +u 0 35 6b aU +u 0 36 aU aT +u 0 35 a0 aU +u 0 34 aS aU +u 0 36 a0 aV +u 0 36 aV 55 +u 0 34 aV 8W +u 0 34 aV 6b +u 0 34 55 aG +u 0 35 aG aV +u 0 35 55 aW +u 0 35 aW 4y +u 0 36 aW aU +u 0 34 aV aS +u 0 34 aS aW +u 0 35 aW aV +u 0 35 aV aU +u 0 35 a0 aX +u 0 35 4y aX +u 0 36 aX aS +u 0 38 aX 7Q +u 0 36 55 aY +u 0 35 aY 7v +u 0 36 aW aY +u 0 35 aW aX +u 0 34 aV aY +u 0 37 aY aX +u 0 35 aX aV +u 0 35 7h aZ +u 0 34 aZ 7v +u 0 34 7h aY +u 0 3a aY aZ +u 0 36 aG aY +u 0 36 aG aX +u 0 33 aX aZ +u 0 34 aZ aG +u 0 37 7Q a@ +u 0 34 7Q a% +u 0 34 a% a@ +u 0 35 aI a% +u 0 35 a% aG +u 0 34 aI a@ +u 0 36 aN aZ +u 0 36 a% aX +u 0 35 aZ a% +u 0 35 a@ aX +u 0 36 a@ 7v +u 0 34 aM 6Y +u 0 34 4F b0 +u 0 35 b0 4M +u 0 34 b0 4d +u 0 35 b0 4y +u 0 36 aT 4F +u 0 36 4y b1 +u 0 35 b1 3U +u 0 34 4F b2 +u 0 35 4y b2 +u 0 34 b1 b2 +u 0 35 4M b2 +u 0 35 b0 b2 +u 0 33 b1 b0 +u 0 36 b1 4M +u 0 34 5q b4 +u 0 34 b3 b4 +u 0 36 5q b5 +u 0 35 b5 5Z +u 0 34 b4 b5 +u 0 34 aT b4 +u 0 35 b3 4y +u 0 35 4y b6 +u 0 35 3U b3 +u 0 35 b1 b3 +u 0 35 3U b6 +u 0 35 b6 b2 +u 0 34 b4 b6 +u 0 36 3N b3 +u 0 35 b1 7v +u 0 34 3N b7 +u 0 35 b7 7v +u 0 35 7v b3 +u 0 35 b7 b3 +u 0 33 b1 b7 +u 0 35 b7 3U +u 0 35 aW 5q +u 0 34 5Z b8 +u 0 34 b8 55 +u 0 35 b8 6b +u 0 34 b8 aU +u 0 35 b3 aW +u 0 36 55 b5 +u 0 35 b8 b5 +u 0 34 aW b5 +u 0 35 5q b3 +u 0 37 5Z b9 +u 0 35 b9 5c +u 0 34 6b ba +u 0 34 ba 5c +u 0 35 6b b9 +u 0 35 b9 ba +u 0 34 ba 4% +u 0 36 b9 4% +u 0 34 b8 b9 +u 0 34 ba b8 +u 0 35 ba 55 +u 0 36 4% bb +u 0 34 4T bb +u 0 36 5L bb +u 0 36 bb 5Z +u 0 35 3N bc +u 0 36 bc 5Z +u 0 36 5q bc +u 0 35 b5 bc +u 0 37 bc b6 +u 0 36 bc b4 +u 0 34 bd b2 +u 0 34 bd bc +u 0 35 5Z be +u 0 35 be 4M +u 0 35 4F be +u 0 34 b0 be +u 0 35 be 4d +u 0 34 4M bd +u 0 35 be bd +u 0 36 5c bf +u 0 36 bf 4d +u 0 35 b9 bf +u 0 34 4% bf +u 0 36 bb bf +u 0 34 b9 bb +u 0 35 5c b5 +u 0 35 b9 b5 +u 0 35 3z bg +u 0 35 bg 5Z +u 0 35 5c bg +u 0 34 bg b9 +u 0 34 5q bg +u 0 35 b5 bg +u 0 35 3z bh +u 0 34 bh 4d +u 0 35 3z bf +u 0 35 bh bf +u 0 35 bg bf +u 0 35 3z bc +u 0 35 bg bc +u 0 34 3s bi +u 0 36 bi 5Z +u 0 34 bi bg +u 0 35 3s bc +u 0 37 bc bi +u 0 35 3s bj +u 0 35 bj 4M +u 0 35 3U bc +u 0 35 bi bj +u 0 34 be bi +u 0 35 3s bh +u 0 36 bi bh +u 0 34 bj 46 +u 0 35 bk 7v +u 0 34 5q aZ +u 0 34 aZ bk +u 0 36 5q aY +u 0 34 bk aY +u 0 35 3N bk +u 0 34 b7 bk +u 0 34 bk 6Y +u 0 37 aN 73 +u 0 35 82 a@ +u 0 34 6Y a@ +u 0 35 aR 7X +u 0 34 bl 4% +u 0 34 bl 5j +u 0 33 bl 5c +u 0 35 4% bm +u 0 35 bm 3G +u 0 35 5x bm +u 0 34 bm bl +u 0 37 bm 5c +u 0 34 5c bn +u 0 35 bn 4k +u 0 35 3G bn +u 0 34 3@ bn +u 0 35 4% bo +u 0 34 bo 4k +u 0 34 5c bo +u 0 36 bn bo +u 0 35 bm bo +u 0 36 bo 3@ +u 0 34 bm bn +u 0 36 4k bf +u 0 35 bf bn +u 0 34 bo bb +u 0 37 bf bo +u 0 34 3z bp +u 0 34 bp 4k +u 0 36 3z bn +u 0 35 bp bn +u 0 36 4k bh +u 0 35 bp bh +u 0 34 bh bn +u 0 34 3G bp +u 0 35 3@ bp +u 0 34 b7 6Y +u 0 35 bj 3U +u 0 35 bp 3s +u 0 34 4k bq +u 0 35 bq 4T +u 0 34 bq 4d +u 0 35 bq 4r +u 0 35 4r br +u 0 34 br 3@ +u 0 36 br 8B +u 0 34 br 4k +u 0 35 bs bq +u 0 34 4r bs +u 0 35 bs br +u 0 35 bt bs +u 0 36 bt 3@ +u 0 34 3@ bs +u 0 37 5L bu +u 0 35 bu 3G +u 0 35 4% bu +u 0 36 bu bm +u 0 35 bo bv +u 0 37 bu bo +u 0 34 bu 3@ +u 0 35 bv bu +u 0 36 4T bv +u 0 34 bv bq +u 0 34 5L bw +u 0 36 bw 5j +u 0 36 bw 4% +u 0 34 bw 5E +u 0 35 5j bu +u 0 35 bu bw +u 0 34 bw bm +u 0 35 bm 5j +u 0 34 5S bx +u 0 36 bx 5j +u 0 36 5L bx +u 0 34 bx bw +u 0 35 bx 5E +u 0 34 3G by +u 0 35 by 5S +u 0 35 5L by +u 0 37 by bu +u 0 34 bu bx +u 0 35 4T by +u 0 35 bt by +u 0 34 6p bz +u 0 35 bz 6R +u 0 36 5j bA +u 0 34 6p bA +u 0 37 bz bA +u 0 36 bA 5x +u 0 35 bz 5x +u 0 36 5S bB +u 0 35 5j bB +u 0 36 bB bx +u 0 35 5x by +u 0 36 by bB +u 0 35 bC 8B +u 0 34 8B bD +u 0 35 bD 5x +u 0 35 5x bC +u 0 35 bC bD +u 0 36 bB bC +u 0 34 5S bE +u 0 37 bE 8B +u 0 35 bE bB +u 0 35 bE bC +u 0 36 6R bC +u 0 35 bA bC +u 0 36 bD 6R +u 0 35 5j bF +u 0 35 bF 64 +u 0 35 9t bG +u 0 35 bG 64 +u 0 34 9t bF +u 0 34 bF bG +u 0 34 bG 5E +u 0 35 bF 5E +u 0 36 64 bx +u 0 34 bF bx +u 0 35 64 bH +u 0 36 9t bH +u 0 34 bH bG +u 0 35 5j bH +u 0 35 bF bH +u 0 34 bA bH +u 0 35 64 bI +u 0 35 bI bH +u 0 35 bz bI +u 0 36 bA bI +u 0 34 bI bF +u 0 35 bJ bE +u 0 34 bC bJ +u 0 36 bJ bI +u 0 36 bI bC +u 0 35 4r bK +u 0 35 bK br +u 0 35 4T bK +u 0 35 bs bK +u 0 35 3@ by +u 0 35 by bK +u 0 34 8B bK +u 0 35 bE bK +u 0 36 8B by +u 0 36 bE by +u 0 35 bD 3G +u 0 35 bD by +u 0 35 8B bL +u 0 35 bL 8u +u 0 36 8u bE +u 0 35 bE bL +u 0 36 8u bJ +u 0 34 bJ bL +u 0 34 bL 4r +u 0 36 bE 4r +u 0 33 br bE +u 0 34 bG 9f +u 0 35 9O bM +u 0 35 bM 9t +u 0 36 64 bM +u 0 34 bM bG +u 0 35 bM 9f +u 0 36 9O bN +u 0 35 64 bO +u 0 36 bO 6w +u 0 35 9O bO +u 0 36 bN bO +u 0 36 6w bP +u 0 36 bP 8u +u 0 35 8u bO +u 0 36 bP bO +u 0 35 8u bN +u 0 35 bN bP +u 0 35 bM bO +u 0 35 9t bQ +u 0 35 bQ 6w +u 0 33 bN bM +u 0 36 bO bQ +u 0 35 bR 6R +u 0 34 bR bI +u 0 35 8B bR +u 0 35 bR bL +u 0 35 bR bJ +u 0 36 bO bH +u 0 37 bQ 6p +u 0 36 bQ bH +u 0 35 6R bP +u 0 36 bP bR +u 0 38 bI bO +u 0 35 bP bI +u 0 38 bz 6w +u 0 34 bz bO +u 0 34 8n bS +u 0 34 bS 6R +u 0 34 bS 6D +u 0 35 bS 8B +u 0 35 bL 8n +u 0 34 bR bS +u 0 34 bL bS +u 0 35 9t bT +u 0 35 bT 9A +u 0 34 9m bT +u 0 34 bT 9H +u 0 35 bT 9f +u 0 36 9A bU +u 0 36 bU al +u 0 36 9m bU +u 0 34 bU 9H +u 0 34 9t bU +u 0 36 bT bU +u 0 35 bV 6D +u 0 34 9O bW +u 0 34 bX bW +u 0 37 bM bW +u 0 34 9A bY +u 0 34 bT bY +u 0 35 bY bZ +u 0 36 bZ 9t +u 0 35 b% 6D +u 0 34 b% bX +u 0 35 bW b% +u 0 35 bZ bW +u 0 33 al bY +u 0 35 bY bU +u 0 34 bX bQ +u 0 35 b% 6w +u 0 34 6D bN +u 0 35 bN bV +u 0 35 8n bP +u 0 37 6D bP +u 0 34 8n b@ +u 0 34 b@ 9O +u 0 35 b@ 8u +u 0 36 b@ 8I +u 0 34 9A c0 +u 0 35 c0 6D +u 0 36 9O c0 +u 0 35 bV c0 +u 0 36 6D c1 +u 0 36 c1 8I +u 0 33 8I bV +u 0 35 bV c1 +u 0 36 8I c0 +u 0 35 c1 c0 +u 0 35 8n bV +u 0 36 b@ bV +u 0 33 b@ c1 +u 0 35 c1 8n +u 0 34 b@ bN +u 0 35 9A bW +u 0 37 bW c0 +u 0 37 al c2 +u 0 36 c2 6D +u 0 34 6p c2 +u 0 35 b% c2 +u 0 35 c2 6i +u 0 34 c0 b% +u 0 35 c2 c0 +u 0 34 c0 bU +u 0 35 bW bY +u 0 35 8I c3 +u 0 35 c3 9m +u 0 34 9H c4 +u 0 34 c4 8I +u 0 35 9H c3 +u 0 36 c3 c4 +u 0 35 9A c3 +u 0 34 c4 9A +u 0 35 c3 1l +u 0 34 c4 1l +u 0 36 al c5 +u 0 35 c5 8I +u 0 34 9m c5 +u 0 36 c3 c5 +u 0 35 bU c5 +u 0 35 c3 bU +u 0 35 1j c6 +u 0 36 c6 8I +u 0 34 1j c3 +u 0 35 c6 c3 +u 0 36 1j c5 +u 0 35 c5 c6 +u 0 35 c6 1l +u 0 36 c4 9V +u 0 36 c5 c0 +u 0 34 c2 c1 +u 0 35 c1 c5 +u 0 35 c5 c2 +u 0 34 al c7 +u 0 35 c7 6K +u 0 34 c7 6i +u 0 35 c7 1j +u 0 35 6K c2 +u 0 34 c7 c2 +u 0 37 1j c8 +u 0 36 c8 8g +u 0 34 al c9 +u 0 35 c9 8g +u 0 34 1j c9 +u 0 35 c8 c9 +u 0 35 6K c9 +u 0 35 c7 c9 +u 0 33 c8 c7 +u 0 36 c8 6K +u 0 35 8g c5 +u 0 36 c9 c5 +u 0 34 8g c6 +u 0 34 c6 c8 +u 0 34 c5 c8 +u 0 34 6D c9 +u 0 36 c9 c2 +u 0 35 c1 8g +u 0 34 c1 c9 +u 0 36 c6 1k +u 0 35 c8 1k +u 0 34 au aD +u 0 35 aA ar +u 0 36 b3 b6 +u 0 35 bd b6 +u 0 35 be b2 +u 0 34 bc bj +u 0 35 bt bv +u 0 35 bt bK +u 0 35 bS bP +u 0 34 5Z ca +u 0 34 ca 4% +u 0 34 6b ca +u 0 34 b9 ca +u 0 34 bb ca +u 0 34 5L ca +u 0 33 an aq +u 0 35 7Q aT +u 0 35 4y a@ +u 0 34 bp 46 +u 0 36 9A bM +u 0 35 64 cb +u 0 35 cb 8u +u 0 35 5S cb +u 0 34 9O cb +u 0 35 bO cb +u 0 35 bI cb +u 0 34 9O c3 +u 0 34 c4 9O +u 0 34 3z bm +u 0 34 c6 9V +u 0 34 c4 c6 +u 0 34 3@ bD +u 0 35 5x cc +u 0 35 cc 6R +u 0 34 6w cc +u 0 34 3G cc +u 0 34 bz cc +u 0 34 bD cc +u 0 34 7J aQ +u 0 36 aQ 89 +u 0 34 aB as +u 0 34 as 2k +u 0 33 aE am +u 0 35 am ar +u 0 34 3j at +u 0 35 aB aQ +u 0 36 aB aJ +u 0 37 aB 8P +u 0 34 89 aB +u 0 35 8W ay +u 0 34 aD am +u 0 35 aD as +u 0 34 aK 7a +u 0 34 aL aO +u 0 36 a@ aJ +u 0 34 aM aC +u 0 34 av aF +u 0 35 aG aP +u 0 36 aJ aR +u 0 34 aT a0 +u 0 37 a@ aZ +u 0 35 aI aZ +u 0 33 aY a% +u 0 36 aW b4 +u 0 36 b6 aT +u 0 36 aU b5 +u 0 35 aU 55 +u 0 34 b6 aW +u 0 36 aY b3 +u 0 34 3N aY +u 0 34 ba b5 +u 0 35 bi 3z +u 0 35 bi bf +u 0 36 bf 5Z +u 0 36 4M bi +u 0 35 bh 46 +u 0 34 bk b3 +u 0 34 5q aN +u 0 36 6Y aZ +u 0 36 aZ aJ +u 0 35 bv bs +u 0 36 by bv +u 0 35 bu 5x +u 0 33 bw bl +u 0 35 bB bu +u 0 34 bB 5L +u 0 35 by bC +u 0 35 bB bJ +u 0 36 bC bR +u 0 35 bI bx +u 0 36 bI bB +u 0 35 bI 5j +u 0 35 bE 4T +u 0 35 bP bJ +u 0 35 bP bL +u 0 36 bM bH +u 0 34 bz bQ +u 0 34 bQ 5j +u 0 35 bQ bA +u 0 34 6w bI +u 0 35 bN bW +u 0 35 al bZ +u 0 35 bN b% +u 0 34 bX 6w +u 0 36 bW bQ +u 0 34 c0 b@ +u 0 35 bW bU +u 0 36 bW c2 +u 0 36 c0 bN +u 0 34 c8 2e +u 0 34 c8 1i +u 0 34 8P au +u 0 35 2l aD +u 0 34 aE aq +u 0 34 aA aq +u 0 35 aD ar +u 0 35 ar aJ +u 0 34 ar aC +u 0 34 ar aR +u 0 35 bv bK +u 0 35 a7 2m +u 0 34 a@ aY +u 0 34 bx cb +u 0 35 c0 c3 +u 0 37 6w c2 +u 0 34 ap 2m +u 0 34 2n ap +u 0 34 ay a0 +u 0 35 ao aB +u 0 36 aN aK +u 0 34 aK aC +u 0 34 73 aL +u 0 35 7C a@ +u 0 35 aL 6Y +u 0 34 aP 7Q +u 0 35 89 aR +u 0 36 8P aZ +u 0 35 aX aP +u 0 34 aH a% +u 0 34 aH aX +u 0 36 aW aT +u 0 35 bc aT +u 0 35 b2 aT +u 0 35 aT bd +u 0 36 5Z aU +u 0 35 aZ 3N +u 0 35 bc b3 +u 0 36 b6 4M +u 0 35 bd bi +u 0 34 a@ aR +u 0 36 6Y aJ +u 0 34 bt bu +u 0 34 bt bo +u 0 35 bo bs +u 0 34 br bt +u 0 34 bt 8B +u 0 36 bs 4k +u 0 36 bv bb +u 0 35 bv bf +u 0 35 bB 5x +u 0 35 bI cd +u 0 35 cd 6R +u 0 34 bz cd +u 0 34 6w cd +u 0 34 bP cd +u 0 34 bR cd +u 0 34 bC cd +u 0 34 cb bJ +u 0 34 bO bJ +u 0 34 bE bR +u 0 34 bO bA +u 0 35 bM bT +u 0 34 bM bY +u 0 35 bM bZ +u 0 34 bZ bQ +u 0 34 bX bO +u 0 36 bO bW +u 0 34 c2 bX +u 0 35 c2 bQ +u 0 34 bP b% +u 0 34 bV bP +u 0 34 bV 8u +u 0 35 4y aY +u 0 34 bB 8u +u 0 34 aZ aK +u 0 34 aK aJ +u 0 34 aO aN +u 0 35 7o aL +u 0 34 aJ aM +u 0 34 aJ aL +u 0 34 aH aQ +u 0 35 aQ aP +u 0 34 aY 8P +u 0 34 bc aU +u 0 34 aU b4 +u 0 34 5Z bd +u 0 34 aT be +u 0 34 b6 bj +u 0 34 b6 bi +u 0 35 b1 b6 +u 0 35 4d bi +u 0 34 aN 3N +u 0 34 bK bq +u 0 34 bo 3G +u 0 34 bu bb +u 0 34 bA bB +u 0 35 cb bB +u 0 34 bZ bT +u 0 34 bU bZ +u 0 35 al bQ +u 0 34 bH bZ +u 0 34 bW bH +u 0 36 bW al +u 0 35 bO b% +u 0 34 bj bh +u 0 34 bs bf +u 0 35 bq bf +u 0 34 5L bv +u 0 35 bf 4T +u 0 34 bW c5 +u 0 35 4M bh +u 0 35 5L ce +u 0 35 ce 4T +u 0 34 5Z ce +u 0 34 5S ce +u 0 34 by ce +u 0 34 bb ce +u 0 34 bv ce +u 0 34 aS 7J +u 0 34 aX 7J +u 0 35 aP 7J +u 0 33 bA cf +u 0 34 cf 6R +u 0 35 bz cf +u 0 35 bC cf +u 0 34 bD cf +u 0 34 cc cf +u 0 34 aX aT +u 0 34 a7 aP +u 0 35 bC bz +u 0 35 5x cf +p 1g 23+p-q-1 +p 1g 23+r-p-9 +p 1g 23+t-u-l +p 1g 23-w+i+x +p 1g 23-z+j+A +p 1g 23-B+l+C +p 1g 23-E+a+D +p 1g 23+E-G-x +p 1g 23-M+c+L +p 1g 23+O-P-3 +p 1g 23+R-S-k +p 1g 23-V+Q+W +p 1g 23+X-Y-A +p 1g 23-X+J+Z +p 1g 23-%+B+Y +p 1g 23-@+n+10 +p 1g 23+12-13-y +p 1g 23+14-15-11 +p 1g 23-16+g+17 +p 1g 23+19-1a-7 +p 1g 23+1c-1d-n +p 1g 23-1e+o+1h +p 1g 23-1h+1d+1g +p 1g 23-1i+s+1j +p 1g 23+1l-1m-4 +p 1g 23-1l+P+1n +p 1g 23-1p+T+1q +p 1g 23-1r+1o+1s +p 1g 23-1t-1G+1u +p 1g 23+1w-1x-1o +p 1g 23-1z+1m+1x +p 1g 23+1z-1y-5 +p 1g 23-1A+e+1B +p 1g 23+1E-1F-1C +p 1g 23+1H-1I-1E +p 1g 23+1J-1K-t +p 1g 23+1M-1N-D +p 1g 23-1M+b+1O +p 1g 23-1P+H+1Q +p 1g 23-1S+1I+1R +p 1g 23-1T+1D+1S +p 1g 23+1T-1Q-I +p 1g 23+1U-1V-H +p 1g 23-1U+k+1W +p 1g 23+1Y-1X-Z +p 1g 23+1V-1Y-K +p 1g 23+1Z-1%-N +p 1g 23-20+V+21 +p 1g 23+20-22-T +p 1g 23-23+S+22 +p 1g 23+24-25-W +p 1g 23-26+q+27 +p 1g 23+28-24-O +p 1g 23+26-28-2 +p 1g 23-29+U+25 +p 1g 23+29-27-s +p 1g 23-2a+11+2b +p 1g 23-2d+15+2e +p 1g 23+2f-2g-C +p 1g 23-2h+@+2d +p 1g 23+2h-2f-m +p 1g 23+2i-2e-12 +p 1g 23-2i+z+2g +p 1g 23+2j-2k-17 +p 1g 23-2l+13+2m +p 1g 23-2j+h+2n +p 1g 23-2n+w+2l +p 1g 23-2o+18+2k +p 1g 23+2o-2m-14 +p 1g 23-2p+1v+2q +p 1g 23+2r-2q-1u +p 1g 23-2r+1e+2s +p 1g 23+2t-2v-1b +p 1g 23+2w-2x-1k +p 1g 23-2y+u+2z +p 1g 23+2A-2w-1c +p 1g 23-2A+m+2y +p 1g 23-2B+1i+2x +p 1g 23+2B-2z-v +p 1g 23+2C-2D-1q +p 1g 23+2E-2C-R +p 1g 23-2E+1P+2G +p 1g 23+2H-2G-1R +p 1g 23-2H+1t+2F +p 1g 23-2I+1y+2J +p 1g 23+2K-2L-19 +p 1g 23+2I-2K-6 +p 1g 23+2M-2N-1B +p 1g 23-2O+1C+2N +p 1g 23-2M+f+2P +p 1g 23-2P+16+2Q +p 1g 23+2O-2R-2c +p 1g 23-2S+1A+2T +p 1g 23-2T+1F+2U +p 1g 23+2W-2V-L +p 1g 23-2W+d+2S +p 1g 23+2X-2Y-1@ +p 1g 23+2Z-2X-J +p 1g 23-2%+1K+2@ +p 1g 23+30-31-21 +p 1g 23+32-30-U +p 1g 23-32+v+2% +p 1g 23-33+1G+34 +p 1g 23+33-35-o +p 1g 23-36+2c+37 +p 1g 23+36-34-1H +p 1g 23+38-37-2b +p 1g 23+35-38-10 +p 1g 23+39-3a-8 +p 1g 23+3a-3b-r +p 1g 23-39+1a+3c +p 1g 23-3c+2v+3d +p 1g 23+3e-3d-2u +p 1g 23+3b-3e-1j +p 1g 23+3h-3i-2J +p 1g 23-3j+2p+3f +p 1g 23+3j-3h-1w +p 1g 23+3k+y+G +p 1g 23-3k-F-j +p 1g 23+3l+K+1@ +p 1g 23-3l-1Z+I +p 1g 23-3m+1L-3o +p 1g 23+3m+3p-1W +p 1g 23+3n+1X-3p +p 1g 23+3q+1k+2u +p 1g 23+3r-2U-1D +p 1g 23-3r+N+2V +p 1g 23+3s+3o-1J +p 1g 23-3s+%-3n +p 1g 23+3t+1%+2Y +p 1g 23+3u+2D-2F +p 1g 23-3u-1v+1r +p 1g 23+3v+2R-2Q +p 1g 23-3v-18+2a +p 1g 23-2Z+F+1N +p 1g 23-3t-1O+M +p 1g 23+3w+31-2@ +p 1g 23-3w-1L+23 +p 1g 23+3x+3g-3f +p 1g 23-3x-2s-1f +p 1g 23+3y-1g-3q +p 1g 23-3y-2t+1f +p 1g 23+3z+1p-1s +p 1g 23-3z-1n-Q +p 1g 23+3A+3i-3g +p 1g 23-3A+1b+2L +1 0 23+3C-3D-3B +1 0 23-3F+3D+3E +1 1g 24+1+3N-3U-3G +1 1g 24+3U+3O-3V-3H +1 1g 24+3V+3P-3W-3I +1 1g 24+3W+3Q-3X-3J +1 1g 24+3X+3R-3Y-3K +1 1g 24+3Y+3S-3Z-3L +1 1g 24+3Z+3T-5w-3M +1 1g 24+9+3G+45-3% +1 1g 24-45+3H+46-3@ +1 1g 24-46+3I+47-40 +1 1g 24-47+3J+48-41 +1 1g 24-48+3K+49-42 +1 1g 24-49+3L+4a-43 +1 1g 24-4a+3M+5y-44 +1 1g 24+3+4i-4p-4b +1 1g 24+4p+4j-4q-4c +1 1g 24+4q+4k-4r-4d +1 1g 24+4r+4l-4s-4e +1 1g 24+4s+4m-4t-4f +1 1g 24+4t+4n-4u-4g +1 1g 24+4u+4o-5C-4h +1 1g 24+7+4C-4J-4v +1 1g 24+4J+4D-4K-4w +1 1g 24+4K+4E-4L-4x +1 1g 24+4L+4F-4M-4y +1 1g 24+4M+4G-4N-4z +1 1g 24+4N+4H-4O-4A +1 1g 24+4O+4I-5H-4B +1 1g 24+4+4P+4W-4i +1 1g 24-4W+4Q+4X-4j +1 1g 24-4X+4R+4Y-4k +1 1g 24-4Y+4S+4Z-4l +1 1g 24-4Z+4T+4%-4m +1 1g 24-4%+4U+4@-4n +1 1g 24-4@+4V+5K-4o +1 1g 24+5+50-57-4P +1 1g 24+57+51-58-4Q +1 1g 24+58+52-59-4R +1 1g 24+59+53-5a-4S +1 1g 24+5a+54-5b-4T +1 1g 24+5b+55-5c-4U +1 1g 24+5c+56-5N-4V +1 1g 24+2+4b+5d-3N +1 1g 24-5d+4c+5e-3O +1 1g 24-5e+4d+5f-3P +1 1g 24-5f+4e+5g-3Q +1 1g 24-5g+4f+5h-3R +1 1g 24-5h+4g+5i-3S +1 1g 24-5i+4h+5A-3T +1 1g 24+6+4v+5j-50 +1 1g 24-5j+4w+5k-51 +1 1g 24-5k+4x+5l-52 +1 1g 24-5l+4y+5m-53 +1 1g 24-5m+4z+5n-54 +1 1g 24-5n+4A+5o-55 +1 1g 24-5o+4B+5M-56 +1 1g 24+8+3%-5p-4C +1 1g 24+5p+3@-5q-4D +1 1g 24+5q+40-5r-4E +1 1g 24+5r+41-5s-4F +1 1g 24+5s+42-5t-4G +1 1g 24+5t+43-5u-4H +1 1g 24+5u+44-5G-4I +1 0 23-5v+5w+3B +1 0 23-5x-5y+5v +1 0 23+5z-3C-5A +1 0 23+5B-5z+5C +1 0 23+5E+3F-5F +1 0 23-5E+5G+5x +1 0 23+5H+5F-5D +1 0 23-5I+5J-3E +1 0 23+5I-5B-5K +1 0 23-5L-5M+5D +1 0 23+5N+5L-5J +g 0 23+5O+5Q-5P +g 0 23-5R-5Q+5S +g 1g 24-i+5%-65-5T +g 1g 24+65+5@-66-5U +g 1g 24+66+60-67-5V +g 1g 24+67+61-68-5W +g 1g 24+68+62-69-5X +g 1g 24+69+63-6a-5Y +g 1g 24+6a+64-7L-5Z +g 1g 24-a+5T+6i-6b +g 1g 24-6i+5U+6j-6c +g 1g 24-6j+5V+6k-6d +g 1g 24-6k+5W+6l-6e +g 1g 24-6l+5X+6m-6f +g 1g 24-6m+5Y+6n-6g +g 1g 24-6n+5Z+7J-6h +g 1g 24-c+6o+6C-6v +g 1g 24-6C+6p+6D-6w +g 1g 24-6D+6q+6E-6x +g 1g 24-6E+6r+6F-6y +g 1g 24-6F+6s+6G-6z +g 1g 24-6G+6t+6H-6A +g 1g 24-6H+6u+7P-6B +g 1g 24-g+6I+6W-6P +g 1g 24-6W+6J+6X-6Q +g 1g 24-6X+6K+6Y-6R +g 1g 24-6Y+6L+6Z-6S +g 1g 24-6Z+6M+6%-6T +g 1g 24-6%+6N+6@-6U +g 1g 24-6@+6O+7U-6V +g 1g 24-e+70+7e-77 +g 1g 24-7e+71+7f-78 +g 1g 24-7f+72+7g-79 +g 1g 24-7g+73+7h-7a +g 1g 24-7h+74+7i-7b +g 1g 24-7i+75+7j-7c +g 1g 24-7j+76+7%-7d +g 1g 24-b+6b-7k-6o +g 1g 24+7k+6c-7l-6p +g 1g 24+7l+6d-7m-6q +g 1g 24+7m+6e-7n-6r +g 1g 24+7n+6f-7o-6s +g 1g 24+7o+6g-7p-6t +g 1g 24+7p+6h-7N-6u +g 1g 24-h+6P+7q-5% +g 1g 24-7q+6Q+7r-5@ +g 1g 24-7r+6R+7s-60 +g 1g 24-7s+6S+7t-61 +g 1g 24-7t+6T+7u-62 +g 1g 24-7u+6U+7v-63 +g 1g 24-7v+6V+7T-64 +g 1g 24-f+77-7w-6I +g 1g 24+7w+78-7x-6J +g 1g 24+7x+79-7y-6K +g 1g 24+7y+7a-7z-6L +g 1g 24+7z+7b-7A-6M +g 1g 24+7A+7c-7B-6N +g 1g 24+7B+7d-7Z-6O +g 1g 24-d+6v-7C-70 +g 1g 24+7C+6w-7D-71 +g 1g 24+7D+6x-7E-72 +g 1g 24+7E+6y-7F-73 +g 1g 24+7F+6z-7G-74 +g 1g 24+7G+6A-7H-75 +g 1g 24+7H+6B-7X-76 +g 0 23+7I-5O-7J +g 0 23+7K-7I+7L +g 0 23-7M+7N+5P +g 0 23-7O-7P+7M +g 0 23-7R+7S-5S +g 0 23+7R-7K-7T +g 0 23-7U+7Q-7S +g 0 23+7V+5R-7W +g 0 23-7V+7X+7O +g 0 23+7Y-7Q+7Z +g 0 23-7%+7W-7Y +u 1g 34+l+86-8d-7@ +u 1g 34+8d+87-8e-80 +u 1g 34+8e+88-8f-81 +u 1g 34+8f+89-8g-82 +u 1g 34+8g+8a-8h-83 +u 1g 34+8h+8b-8i-84 +u 1g 34+8i+8c-8j-85 +u 1g 34+u+8k-8r-86 +u 1g 34+8r+8l-8s-87 +u 1g 34+8s+8m-8t-88 +u 1g 34+8t+8n-8u-89 +u 1g 34+8u+8o-8v-8a +u 1g 34+8v+8p-8w-8b +u 1g 34+8w+8q-8x-8c +u 1g 34+t+8k-8y-7@ +u 1g 34+8y+8l-8z-80 +u 1g 34+8z+8m-8A-81 +u 1g 34+8A+8n-8B-82 +u 1g 34+8B+8o-8C-83 +u 1g 34+8C+8p-8D-84 +u 1g 34+8D+8q-8E-85 +u 1g 33+8d+8r-8y +u 1g 33+8e+8s-8z +u 1g 33+8f+8t-8A +u 1g 33+8g+8u-8B +u 1g 33+8h+8v-8C +u 1g 33+8i+8w-8D +u 1g 33+8j+8x-8E +u 1g 34+C+8F-8M-86 +u 1g 34+8M+8G-8N-87 +u 1g 34+8N+8H-8O-88 +u 1g 34+8O+8I-8P-89 +u 1g 34+8P+8J-8Q-8a +u 1g 34+8Q+8K-8R-8b +u 1g 34+8R+8L-8S-8c +u 1g 34+B+8F-8T-7@ +u 1g 34+8T+8G-8U-80 +u 1g 34+8U+8H-8V-81 +u 1g 34+8V+8I-8W-82 +u 1g 34+8W+8J-8X-83 +u 1g 34+8X+8K-8Y-84 +u 1g 34+8Y+8L-8Z-85 +u 1g 33-8M-8d+8T +u 1g 33-8N-8e+8U +u 1g 33-8O-8f+8V +u 1g 33-8P-8g+8W +u 1g 33-8Q-8h+8X +u 1g 33-8R-8i+8Y +u 1g 33-8S-8j+8Z +u 1g 34+Y+8%-95-8F +u 1g 34+95+8@-96-8G +u 1g 34+96+90-97-8H +u 1g 34+97+91-98-8I +u 1g 34+98+92-99-8J +u 1g 34+99+93-9a-8K +u 1g 34+9a+94-9b-8L +u 1g 34+%+8%-9c-7@ +u 1g 34+9c+8@-9d-80 +u 1g 34+9d+90-9e-81 +u 1g 34+9e+91-9f-82 +u 1g 34+9f+92-9g-83 +u 1g 34+9g+93-9h-84 +u 1g 34+9h+94-9i-85 +u 1g 33-95-8T+9c +u 1g 33-96-8U+9d +u 1g 33-97-8V+9e +u 1g 33-98-8W+9f +u 1g 33-99-8X+9g +u 1g 33-9a-8Y+9h +u 1g 33-9b-8Z+9i +u 1g 34+1K+9j-9q-8k +u 1g 34+9q+9k-9r-8l +u 1g 34+9r+9l-9s-8m +u 1g 34+9s+9m-9t-8n +u 1g 34+9t+9n-9u-8o +u 1g 34+9u+9o-9v-8p +u 1g 34+9v+9p-9w-8q +u 1g 34+1J+9j-9x-7@ +u 1g 34+9x+9k-9y-80 +u 1g 34+9y+9l-9z-81 +u 1g 34+9z+9m-9A-82 +u 1g 34+9A+9n-9B-83 +u 1g 34+9B+9o-9C-84 +u 1g 34+9C+9p-9D-85 +u 1g 33+8y+9q-9x +u 1g 33+8z+9r-9y +u 1g 33+8A+9s-9z +u 1g 33+8B+9t-9A +u 1g 33+8C+9u-9B +u 1g 33+8D+9v-9C +u 1g 33+8E+9w-9D +u 1g 34-3o+9E-9L-9j +u 1g 34+9L+9F-9M-9k +u 1g 34+9M+9G-9N-9l +u 1g 34+9N+9H-9O-9m +u 1g 34+9O+9I-9P-9n +u 1g 34+9P+9J-9Q-9o +u 1g 34+9Q+9K-9R-9p +u 1g 34+3s+9E-9S-7@ +u 1g 34+9S+9F-9T-80 +u 1g 34+9T+9G-9U-81 +u 1g 34+9U+9H-9V-82 +u 1g 34+9V+9I-9W-83 +u 1g 34+9W+9J-9X-84 +u 1g 34+9X+9K-9Y-85 +u 1g 33+9x+9L-9S +u 1g 33+9y+9M-9T +u 1g 33+9z+9N-9U +u 1g 33+9A+9O-9V +u 1g 33+9B+9P-9W +u 1g 33+9C+9Q-9X +u 1g 33+9D+9R-9Y +u 1g 34-3n+9E-9Z-8% +u 1g 34+9Z+9F-9%-8@ +u 1g 34+9%+9G-9@-90 +u 1g 34+9@+9H-a0-91 +u 1g 34+a0+9I-a1-92 +u 1g 34+a1+9J-a2-93 +u 1g 34+a2+9K-a3-94 +u 1g 33-9Z-9c+9S +u 1g 33-9%-9d+9T +u 1g 33-9@-9e+9U +u 1g 33-a0-9f+9V +u 1g 33-a1-9g+9W +u 1g 33-a2-9h+9X +u 1g 33-a3-9i+9Y +u 1g 34+k+ab-ai-a4 +u 1g 34+ai+ac-aj-a5 +u 1g 34+aj+ad-ak-a6 +u 1g 34+ak+ae-al-a7 +u 1g 34+al+af-am-a8 +u 1g 34+am+ag-an-a9 +u 1g 34+an+ah-ao-aa +u 1g 34+S+ap-aw-ab +u 1g 34+aw+aq-ax-ac +u 1g 34+ax+ar-ay-ad +u 1g 34+ay+as-az-ae +u 1g 34+az+at-aA-af +u 1g 34+aA+au-aB-ag +u 1g 34+aB+av-aC-ah +u 1g 34+R+ap-aD-a4 +u 1g 34+aD+aq-aE-a5 +u 1g 34+aE+ar-aF-a6 +u 1g 34+aF+as-aG-a7 +u 1g 34+aG+at-aH-a8 +u 1g 34+aH+au-aI-a9 +u 1g 34+aI+av-aJ-aa +u 1g 33+ai+aw-aD +u 1g 33+aj+ax-aE +u 1g 33+ak+ay-aF +u 1g 33+al+az-aG +u 1g 33+am+aA-aH +u 1g 33+an+aB-aI +u 1g 33+ao+aC-aJ +u 1g 34+1Q+aR-aY-aK +u 1g 34+aY+aS-aZ-aL +u 1g 34+aZ+aT-a%-aM +u 1g 34+a%+aU-a@-aN +u 1g 34+a@+aV-b0-aO +u 1g 34+b0+aW-b1-aP +u 1g 34+b1+aX-b2-aQ +u 1g 34+H+aK-b3-a4 +u 1g 34+b3+aL-b4-a5 +u 1g 34+b4+aM-b5-a6 +u 1g 34+b5+aN-b6-a7 +u 1g 34+b6+aO-b7-a8 +u 1g 34+b7+aP-b8-a9 +u 1g 34+b8+aQ-b9-aa +u 1g 34+1P+aR-ba-a4 +u 1g 34+ba+aS-bb-a5 +u 1g 34+bb+aT-bc-a6 +u 1g 34+bc+aU-bd-a7 +u 1g 34+bd+aV-be-a8 +u 1g 34+be+aW-bf-a9 +u 1g 34+bf+aX-bg-aa +u 1g 33-aY-b3+ba +u 1g 33-aZ-b4+bb +u 1g 33-a%-b5+bc +u 1g 33-a@-b6+bd +u 1g 33-b0-b7+be +u 1g 33-b1-b8+bf +u 1g 33-b2-b9+bg +u 1g 34+1V+bh-bo-aK +u 1g 34+bo+bi-bp-aL +u 1g 34+bp+bj-bq-aM +u 1g 34+bq+bk-br-aN +u 1g 34+br+bl-bs-aO +u 1g 34+bs+bm-bt-aP +u 1g 34+bt+bn-bu-aQ +u 1g 34+1U+bh-bv-a4 +u 1g 34+bv+bi-bw-a5 +u 1g 34+bw+bj-bx-a6 +u 1g 34+bx+bk-by-a7 +u 1g 34+by+bl-bz-a8 +u 1g 34+bz+bm-bA-a9 +u 1g 34+bA+bn-bB-aa +u 1g 33+b3+bo-bv +u 1g 33+b4+bp-bw +u 1g 33+b5+bq-bx +u 1g 33+b6+br-by +u 1g 33+b7+bs-bz +u 1g 33+b8+bt-bA +u 1g 33+b9+bu-bB +u 1g 34+1W+bh-bC-ab +u 1g 34+bC+bi-bD-ac +u 1g 34+bD+bj-bE-ad +u 1g 34+bE+bk-bF-ae +u 1g 34+bF+bl-bG-af +u 1g 34+bG+bm-bH-ag +u 1g 34+bH+bn-bI-ah +u 1g 33-bC-ai+bv +u 1g 33-bD-aj+bw +u 1g 33-bE-ak+bx +u 1g 33-bF-al+by +u 1g 33-bG-am+bz +u 1g 33-bH-an+bA +u 1g 33-bI-ao+bB +u 1g 34+2C+bJ-bQ-ap +u 1g 34+bQ+bK-bR-aq +u 1g 34+bR+bL-bS-ar +u 1g 34+bS+bM-bT-as +u 1g 34+bT+bN-bU-at +u 1g 34+bU+bO-bV-au +u 1g 34+bV+bP-bW-av +u 1g 34+2E+bJ-bX-a4 +u 1g 34+bX+bK-bY-a5 +u 1g 34+bY+bL-bZ-a6 +u 1g 34+bZ+bM-b%-a7 +u 1g 34+b%+bN-b@-a8 +u 1g 34+b@+bO-c0-a9 +u 1g 34+c0+bP-c1-aa +u 1g 33+aD+bQ-bX +u 1g 33+aE+bR-bY +u 1g 33+aF+bS-bZ +u 1g 33+aG+bT-b% +u 1g 33+aH+bU-b@ +u 1g 33+aI+bV-c0 +u 1g 33+aJ+bW-c1 +u 1g 34+2G+bJ-c2-aR +u 1g 34+c2+bK-c3-aS +u 1g 34+c3+bL-c4-aT +u 1g 34+c4+bM-c5-aU +u 1g 34+c5+bN-c6-aV +u 1g 34+c6+bO-c7-aW +u 1g 34+c7+bP-c8-aX +u 1g 33-c2-ba+bX +u 1g 33-c3-bb+bY +u 1g 33-c4-bc+bZ +u 1g 33-c5-bd+b% +u 1g 33-c6-be+b@ +u 1g 33-c7-bf+c0 +u 1g 33-c8-bg+c1 +u 1g 34+10+cg-cn-c9 +u 1g 34+cn+ch-co-ca +u 1g 34+co+ci-cp-cb +u 1g 34+cp+cj-cq-cc +u 1g 34+cq+ck-cr-cd +u 1g 34+cr+cl-cs-ce +u 1g 34+cs+cm-ct-cf +u 1g 34+n+c9-cB-cu +u 1g 34+cB+ca-cC-cv +u 1g 34+cC+cb-cD-cw +u 1g 34+cD+cc-cE-cx +u 1g 34+cE+cd-cF-cy +u 1g 34+cF+ce-cG-cz +u 1g 34+cG+cf-cH-cA +u 1g 34+@+cg-cI-cu +u 1g 34+cI+ch-cJ-cv +u 1g 34+cJ+ci-cK-cw +u 1g 34+cK+cj-cL-cx +u 1g 34+cL+ck-cM-cy +u 1g 34+cM+cl-cN-cz +u 1g 34+cN+cm-cO-cA +u 1g 33-cn-cB+cI +u 1g 33-co-cC+cJ +u 1g 33-cp-cD+cK +u 1g 33-cq-cE+cL +u 1g 33-cr-cF+cM +u 1g 33-cs-cG+cN +u 1g 33-ct-cH+cO +u 1g 34+1d+cP-cW-c9 +u 1g 34+cW+cQ-cX-ca +u 1g 34+cX+cR-cY-cb +u 1g 34+cY+cS-cZ-cc +u 1g 34+cZ+cT-c%-cd +u 1g 34+c%+cU-c@-ce +u 1g 34+c@+cV-d0-cf +u 1g 34+1c+cP-d1-cu +u 1g 34+d1+cQ-d2-cv +u 1g 34+d2+cR-d3-cw +u 1g 34+d3+cS-d4-cx +u 1g 34+d4+cT-d5-cy +u 1g 34+d5+cU-d6-cz +u 1g 34+d6+cV-d7-cA +u 1g 33+cB+cW-d1 +u 1g 33+cC+cX-d2 +u 1g 33+cD+cY-d3 +u 1g 33+cE+cZ-d4 +u 1g 33+cF+c%-d5 +u 1g 33+cG+c@-d6 +u 1g 33+cH+d0-d7 +u 1g 34+2d+d8-df-cg +u 1g 34+df+d9-dg-ch +u 1g 34+dg+da-dh-ci +u 1g 34+dh+db-di-cj +u 1g 34+di+dc-dj-ck +u 1g 34+dj+dd-dk-cl +u 1g 34+dk+de-dl-cm +u 1g 34+2h+d8-dm-cu +u 1g 34+dm+d9-dn-cv +u 1g 34+dn+da-do-cw +u 1g 34+do+db-dp-cx +u 1g 34+dp+dc-dq-cy +u 1g 34+dq+dd-dr-cz +u 1g 34+dr+de-ds-cA +u 1g 33-df-cI+dm +u 1g 33-dg-cJ+dn +u 1g 33-dh-cK+do +u 1g 33-di-cL+dp +u 1g 33-dj-cM+dq +u 1g 33-dk-cN+dr +u 1g 33-dl-cO+ds +u 1g 34+m+86-dt-cu +u 1g 34+dt+87-du-cv +u 1g 34+du+88-dv-cw +u 1g 34+dv+89-dw-cx +u 1g 34+dw+8a-dx-cy +u 1g 34+dx+8b-dy-cz +u 1g 34+dy+8c-dz-cA +u 1g 34+2f+d8-dA-86 +u 1g 34+dA+d9-dB-87 +u 1g 34+dB+da-dC-88 +u 1g 34+dC+db-dD-89 +u 1g 34+dD+dc-dE-8a +u 1g 34+dE+dd-dF-8b +u 1g 34+dF+de-dG-8c +u 1g 33+dt+dA-dm +u 1g 33+du+dB-dn +u 1g 33+dv+dC-do +u 1g 33+dw+dD-dp +u 1g 33+dx+dE-dq +u 1g 33+dy+dF-dr +u 1g 33+dz+dG-ds +u 1g 34+2w+dH-dO-cP +u 1g 34+dO+dI-dP-cQ +u 1g 34+dP+dJ-dQ-cR +u 1g 34+dQ+dK-dR-cS +u 1g 34+dR+dL-dS-cT +u 1g 34+dS+dM-dT-cU +u 1g 34+dT+dN-dU-cV +u 1g 34+2A+dH-dV-cu +u 1g 34+dV+dI-dW-cv +u 1g 34+dW+dJ-dX-cw +u 1g 34+dX+dK-dY-cx +u 1g 34+dY+dL-dZ-cy +u 1g 34+dZ+dM-d%-cz +u 1g 34+d%+dN-d@-cA +u 1g 33+d1+dO-dV +u 1g 33+d2+dP-dW +u 1g 33+d3+dQ-dX +u 1g 33+d4+dR-dY +u 1g 33+d5+dS-dZ +u 1g 33+d6+dT-d% +u 1g 33+d7+dU-d@ +u 1g 34+2y+dH-e0-86 +u 1g 34+e0+dI-e1-87 +u 1g 34+e1+dJ-e2-88 +u 1g 34+e2+dK-e3-89 +u 1g 34+e3+dL-e4-8a +u 1g 34+e4+dM-e5-8b +u 1g 34+e5+dN-e6-8c +u 1g 33-e0-dt+dV +u 1g 33-e1-du+dW +u 1g 33-e2-dv+dX +u 1g 33-e3-dw+dY +u 1g 33-e4-dx+dZ +u 1g 33-e5-dy+d% +u 1g 33-e6-dz+d@ +u 1g 34+1h+e7-ee-c9 +u 1g 34+ee+e8-ef-ca +u 1g 34+ef+e9-eg-cb +u 1g 34+eg+ea-eh-cc +u 1g 34+eh+eb-ei-cd +u 1g 34+ei+ec-ej-ce +u 1g 34+ej+ed-ek-cf +u 1g 34+o+c9-es-el +u 1g 34+es+ca-et-em +u 1g 34+et+cb-eu-en +u 1g 34+eu+cc-ev-eo +u 1g 34+ev+cd-ew-ep +u 1g 34+ew+ce-ex-eq +u 1g 34+ex+cf-ey-er +u 1g 34+1e+e7-ez-el +u 1g 34+ez+e8-eA-em +u 1g 34+eA+e9-eB-en +u 1g 34+eB+ea-eC-eo +u 1g 34+eC+eb-eD-ep +u 1g 34+eD+ec-eE-eq +u 1g 34+eE+ed-eF-er +u 1g 33-ee-es+ez +u 1g 33-ef-et+eA +u 1g 33-eg-eu+eB +u 1g 33-eh-ev+eC +u 1g 33-ei-ew+eD +u 1g 33-ej-ex+eE +u 1g 33-ek-ey+eF +u 1g 34+1u+eG-eN-el +u 1g 34+eN+eH-eO-em +u 1g 34+eO+eI-eP-en +u 1g 34+eP+eJ-eQ-eo +u 1g 34+eQ+eK-eR-ep +u 1g 34+eR+eL-eS-eq +u 1g 34+eS+eM-eT-er +u 1g 34+1G+eU-e@-el +u 1g 34+e@+eV-f0-em +u 1g 34+f0+eW-f1-en +u 1g 34+f1+eX-f2-eo +u 1g 34+f2+eY-f3-ep +u 1g 34+f3+eZ-f4-eq +u 1g 34+f4+e%-f5-er +u 1g 34-1t+eU-f6-eG +u 1g 34+f6+eV-f7-eH +u 1g 34+f7+eW-f8-eI +u 1g 34+f8+eX-f9-eJ +u 1g 34+f9+eY-fa-eK +u 1g 34+fa+eZ-fb-eL +u 1g 34+fb+e%-fc-eM +u 1g 33-eN+e@-f6 +u 1g 33-eO+f0-f7 +u 1g 33-eP+f1-f8 +u 1g 33-eQ+f2-f9 +u 1g 33-eR+f3-fa +u 1g 33-eS+f4-fb +u 1g 33-eT+f5-fc +u 1g 34+2q+fd-fk-eG +u 1g 34+fk+fe-fl-eH +u 1g 34+fl+ff-fm-eI +u 1g 34+fm+fg-fn-eJ +u 1g 34+fn+fh-fo-eK +u 1g 34+fo+fi-fp-eL +u 1g 34+fp+fj-fq-eM +u 1g 34+2r+fd-fr-el +u 1g 34+fr+fe-fs-em +u 1g 34+fs+ff-ft-en +u 1g 34+ft+fg-fu-eo +u 1g 34+fu+fh-fv-ep +u 1g 34+fv+fi-fw-eq +u 1g 34+fw+fj-fx-er +u 1g 33+eN+fk-fr +u 1g 33+eO+fl-fs +u 1g 33+eP+fm-ft +u 1g 33+eQ+fn-fu +u 1g 33+eR+fo-fv +u 1g 33+eS+fp-fw +u 1g 33+eT+fq-fx +u 1g 34+2s+fd-fy-e7 +u 1g 34+fy+fe-fz-e8 +u 1g 34+fz+ff-fA-e9 +u 1g 34+fA+fg-fB-ea +u 1g 34+fB+fh-fC-eb +u 1g 34+fC+fi-fD-ec +u 1g 34+fD+fj-fE-ed +u 1g 33-fy-ez+fr +u 1g 33-fz-eA+fs +u 1g 33-fA-eB+ft +u 1g 33-fB-eC+fu +u 1g 33-fC-eD+fv +u 1g 33-fD-eE+fw +u 1g 33-fE-eF+fx +u 1g 34+34+fF-fM-eU +u 1g 34+fM+fG-fN-eV +u 1g 34+fN+fH-fO-eW +u 1g 34+fO+fI-fP-eX +u 1g 34+fP+fJ-fQ-eY +u 1g 34+fQ+fK-fR-eZ +u 1g 34+fR+fL-fS-e% +u 1g 34+33+fF-fT-el +u 1g 34+fT+fG-fU-em +u 1g 34+fU+fH-fV-en +u 1g 34+fV+fI-fW-eo +u 1g 34+fW+fJ-fX-ep +u 1g 34+fX+fK-fY-eq +u 1g 34+fY+fL-fZ-er +u 1g 33-fM-e@+fT +u 1g 33-fN-f0+fU +u 1g 33-fO-f1+fV +u 1g 33-fP-f2+fW +u 1g 33-fQ-f3+fX +u 1g 33-fR-f4+fY +u 1g 33-fS-f5+fZ +u 1g 34+35+fF-f%-c9 +u 1g 34+f%+fG-f@-ca +u 1g 34+f@+fH-g0-cb +u 1g 34+g0+fI-g1-cc +u 1g 34+g1+fJ-g2-cd +u 1g 34+g2+fK-g3-ce +u 1g 34+g3+fL-g4-cf +u 1g 33+es+f%-fT +u 1g 33+et+f@-fU +u 1g 33+eu+g0-fV +u 1g 33+ev+g1-fW +u 1g 33+ew+g2-fX +u 1g 33+ex+g3-fY +u 1g 33+ey+g4-fZ +u 1g 34+1j+gc-gj-g5 +u 1g 34+gj+gd-gk-g6 +u 1g 34+gk+ge-gl-g7 +u 1g 34+gl+gf-gm-g8 +u 1g 34+gm+gg-gn-g9 +u 1g 34+gn+gh-go-ga +u 1g 34+go+gi-gp-gb +u 1g 34+s+g5-gx-gq +u 1g 34+gx+g6-gy-gr +u 1g 34+gy+g7-gz-gs +u 1g 34+gz+g8-gA-gt +u 1g 34+gA+g9-gB-gu +u 1g 34+gB+ga-gC-gv +u 1g 34+gC+gb-gD-gw +u 1g 34+1i+gc-gE-gq +u 1g 34+gE+gd-gF-gr +u 1g 34+gF+ge-gG-gs +u 1g 34+gG+gf-gH-gt +u 1g 34+gH+gg-gI-gu +u 1g 34+gI+gh-gJ-gv +u 1g 34+gJ+gi-gK-gw +u 1g 33-gj-gx+gE +u 1g 33-gk-gy+gF +u 1g 33-gl-gz+gG +u 1g 33-gm-gA+gH +u 1g 33-gn-gB+gI +u 1g 33-go-gC+gJ +u 1g 33-gp-gD+gK +u 1g 34+25+gS-gZ-gL +u 1g 34+gZ+gT-g%-gM +u 1g 34+g%+gU-g@-gN +u 1g 34+g@+gV-h0-gO +u 1g 34+h0+gW-h1-gP +u 1g 34+h1+gX-h2-gQ +u 1g 34+h2+gY-h3-gR +u 1g 34+U+gL-h4-gq +u 1g 34+h4+gM-h5-gr +u 1g 34+h5+gN-h6-gs +u 1g 34+h6+gO-h7-gt +u 1g 34+h7+gP-h8-gu +u 1g 34+h8+gQ-h9-gv +u 1g 34+h9+gR-ha-gw +u 1g 34+29+gS-hb-gq +u 1g 34+hb+gT-hc-gr +u 1g 34+hc+gU-hd-gs +u 1g 34+hd+gV-he-gt +u 1g 34+he+gW-hf-gu +u 1g 34+hf+gX-hg-gv +u 1g 34+hg+gY-hh-gw +u 1g 33-gZ-h4+hb +u 1g 33-g%-h5+hc +u 1g 33-g@-h6+hd +u 1g 33-h0-h7+he +u 1g 33-h1-h8+hf +u 1g 33-h2-h9+hg +u 1g 33-h3-ha+hh +u 1g 34+27+gS-hi-g5 +u 1g 34+hi+gT-hj-g6 +u 1g 34+hj+gU-hk-g7 +u 1g 34+hk+gV-hl-g8 +u 1g 34+hl+gW-hm-g9 +u 1g 34+hm+gX-hn-ga +u 1g 34+hn+gY-ho-gb +u 1g 33+gx+hi-hb +u 1g 33+gy+hj-hc +u 1g 33+gz+hk-hd +u 1g 33+gA+hl-he +u 1g 33+gB+hm-hf +u 1g 33+gC+hn-hg +u 1g 33+gD+ho-hh +u 1g 34+2x+dH-hp-gc +u 1g 34+hp+dI-hq-gd +u 1g 34+hq+dJ-hr-ge +u 1g 34+hr+dK-hs-gf +u 1g 34+hs+dL-ht-gg +u 1g 34+ht+dM-hu-gh +u 1g 34+hu+dN-hv-gi +u 1g 34+2B+dH-hw-gq +u 1g 34+hw+dI-hx-gr +u 1g 34+hx+dJ-hy-gs +u 1g 34+hy+dK-hz-gt +u 1g 34+hz+dL-hA-gu +u 1g 34+hA+dM-hB-gv +u 1g 34+hB+dN-hC-gw +u 1g 33-hp-gE+hw +u 1g 33-hq-gF+hx +u 1g 33-hr-gG+hy +u 1g 33-hs-gH+hz +u 1g 33-ht-gI+hA +u 1g 33-hu-gJ+hB +u 1g 33-hv-gK+hC +u 1g 34+v+8k-hD-gq +u 1g 34+hD+8l-hE-gr +u 1g 34+hE+8m-hF-gs +u 1g 34+hF+8n-hG-gt +u 1g 34+hG+8o-hH-gu +u 1g 34+hH+8p-hI-gv +u 1g 34+hI+8q-hJ-gw +u 1g 34+2z+dH-hK-8k +u 1g 34+hK+dI-hL-8l +u 1g 34+hL+dJ-hM-8m +u 1g 34+hM+dK-hN-8n +u 1g 34+hN+dL-hO-8o +u 1g 34+hO+dM-hP-8p +u 1g 34+hP+dN-hQ-8q +u 1g 33+hD+hK-hw +u 1g 33+hE+hL-hx +u 1g 33+hF+hM-hy +u 1g 33+hG+hN-hz +u 1g 33+hH+hO-hA +u 1g 33+hI+hP-hB +u 1g 33+hJ+hQ-hC +u 1g 34+30+hR-hY-gL +u 1g 34+hY+hS-hZ-gM +u 1g 34+hZ+hT-h%-gN +u 1g 34+h%+hU-h@-gO +u 1g 34+h@+hV-i0-gP +u 1g 34+i0+hW-i1-gQ +u 1g 34+i1+hX-i2-gR +u 1g 34+32+hR-i3-gq +u 1g 34+i3+hS-i4-gr +u 1g 34+i4+hT-i5-gs +u 1g 34+i5+hU-i6-gt +u 1g 34+i6+hV-i7-gu +u 1g 34+i7+hW-i8-gv +u 1g 34+i8+hX-i9-gw +u 1g 33+h4+hY-i3 +u 1g 33+h5+hZ-i4 +u 1g 33+h6+h%-i5 +u 1g 33+h7+h@-i6 +u 1g 33+h8+i0-i7 +u 1g 33+h9+i1-i8 +u 1g 33+ha+i2-i9 +u 1g 34+2%+hR-ia-8k +u 1g 34+ia+hS-ib-8l +u 1g 34+ib+hT-ic-8m +u 1g 34+ic+hU-id-8n +u 1g 34+id+hV-ie-8o +u 1g 34+ie+hW-if-8p +u 1g 34+if+hX-ig-8q +u 1g 33-ia-hD+i3 +u 1g 33-ib-hE+i4 +u 1g 33-ic-hF+i5 +u 1g 33-id-hG+i6 +u 1g 33-ie-hH+i7 +u 1g 33-if-hI+i8 +u 1g 33-ig-hJ+i9 +u 1g 34+A+8F-io-ih +u 1g 34+io+8G-ip-ii +u 1g 34+ip+8H-iq-ij +u 1g 34+iq+8I-ir-ik +u 1g 34+ir+8J-is-il +u 1g 34+is+8K-it-im +u 1g 34+it+8L-iu-in +u 1g 34+j+ih-iC-iv +u 1g 34+iC+ii-iD-iw +u 1g 34+iD+ij-iE-ix +u 1g 34+iE+ik-iF-iy +u 1g 34+iF+il-iG-iz +u 1g 34+iG+im-iH-iA +u 1g 34+iH+in-iI-iB +u 1g 34+z+8F-iJ-iv +u 1g 34+iJ+8G-iK-iw +u 1g 34+iK+8H-iL-ix +u 1g 34+iL+8I-iM-iy +u 1g 34+iM+8J-iN-iz +u 1g 34+iN+8K-iO-iA +u 1g 34+iO+8L-iP-iB +u 1g 33-io-iC+iJ +u 1g 33-ip-iD+iK +u 1g 33-iq-iE+iL +u 1g 33-ir-iF+iM +u 1g 33-is-iG+iN +u 1g 33-it-iH+iO +u 1g 33-iu-iI+iP +u 1g 34+y+iQ-iX-iv +u 1g 34+iX+iR-iY-iw +u 1g 34+iY+iS-iZ-ix +u 1g 34+iZ+iT-i%-iy +u 1g 34+i%+iU-i@-iz +u 1g 34+i@+iV-j0-iA +u 1g 34+j0+iW-j1-iB +u 1g 34+13+j2-j9-iQ +u 1g 34+j9+j3-ja-iR +u 1g 34+ja+j4-jb-iS +u 1g 34+jb+j5-jc-iT +u 1g 34+jc+j6-jd-iU +u 1g 34+jd+j7-je-iV +u 1g 34+je+j8-jf-iW +u 1g 34+12+j2-jg-iv +u 1g 34+jg+j3-jh-iw +u 1g 34+jh+j4-ji-ix +u 1g 34+ji+j5-jj-iy +u 1g 34+jj+j6-jk-iz +u 1g 34+jk+j7-jl-iA +u 1g 34+jl+j8-jm-iB +u 1g 33+iX+j9-jg +u 1g 33+iY+ja-jh +u 1g 33+iZ+jb-ji +u 1g 33+i%+jc-jj +u 1g 33+i@+jd-jk +u 1g 33+j0+je-jl +u 1g 33+j1+jf-jm +u 1g 34+2e+d8-jn-j2 +u 1g 34+jn+d9-jo-j3 +u 1g 34+jo+da-jp-j4 +u 1g 34+jp+db-jq-j5 +u 1g 34+jq+dc-jr-j6 +u 1g 34+jr+dd-js-j7 +u 1g 34+js+de-jt-j8 +u 1g 34+2i+d8-ju-iv +u 1g 34+ju+d9-jv-iw +u 1g 34+jv+da-jw-ix +u 1g 34+jw+db-jx-iy +u 1g 34+jx+dc-jy-iz +u 1g 34+jy+dd-jz-iA +u 1g 34+jz+de-jA-iB +u 1g 33+jg+jn-ju +u 1g 33+jh+jo-jv +u 1g 33+ji+jp-jw +u 1g 33+jj+jq-jx +u 1g 33+jk+jr-jy +u 1g 33+jl+js-jz +u 1g 33+jm+jt-jA +u 1g 34+2g+d8-jB-8F +u 1g 34+jB+d9-jC-8G +u 1g 34+jC+da-jD-8H +u 1g 34+jD+db-jE-8I +u 1g 34+jE+dc-jF-8J +u 1g 34+jF+dd-jG-8K +u 1g 34+jG+de-jH-8L +u 1g 33-jB-iJ+ju +u 1g 33-jC-iK+jv +u 1g 33-jD-iL+jw +u 1g 33-jE-iM+jx +u 1g 33-jF-iN+jy +u 1g 33-jG-iO+jz +u 1g 33-jH-iP+jA +u 1g 34+G+jI-jP-iQ +u 1g 34+jP+jJ-jQ-iR +u 1g 34+jQ+jK-jR-iS +u 1g 34+jR+jL-jS-iT +u 1g 34+jS+jM-jT-iU +u 1g 34+jT+jN-jU-iV +u 1g 34+jU+jO-jV-iW +u 1g 34-3k+jI-jW-iv +u 1g 34+jW+jJ-jX-iw +u 1g 34+jX+jK-jY-ix +u 1g 34+jY+jL-jZ-iy +u 1g 34+jZ+jM-j%-iz +u 1g 34+j%+jN-j@-iA +u 1g 34+j@+jO-k0-iB +u 1g 33-jP-iX+jW +u 1g 33-jQ-iY+jX +u 1g 33-jR-iZ+jY +u 1g 33-jS-i%+jZ +u 1g 33-jT-i@+j% +u 1g 33-jU-j0+j@ +u 1g 33-jV-j1+k0 +u 1g 34+F+jI-k1-ih +u 1g 34+k1+jJ-k2-ii +u 1g 34+k2+jK-k3-ij +u 1g 34+k3+jL-k4-ik +u 1g 34+k4+jM-k5-il +u 1g 34+k5+jN-k6-im +u 1g 34+k6+jO-k7-in +u 1g 33+iC+k1-jW +u 1g 33+iD+k2-jX +u 1g 33+iE+k3-jY +u 1g 33+iF+k4-jZ +u 1g 33+iG+k5-j% +u 1g 33+iH+k6-j@ +u 1g 33+iI+k7-k0 +u 1g 34+X+8%-k8-ih +u 1g 34+k8+8@-k9-ii +u 1g 34+k9+90-ka-ij +u 1g 34+ka+91-kb-ik +u 1g 34+kb+92-kc-il +u 1g 34+kc+93-kd-im +u 1g 34+kd+94-ke-in +u 1g 33+io+95-k8 +u 1g 33+ip+96-k9 +u 1g 33+iq+97-ka +u 1g 33+ir+98-kb +u 1g 33+is+99-kc +u 1g 33+it+9a-kd +u 1g 33+iu+9b-ke +u 1g 34+Z+8%-km-kf +u 1g 34+km+8@-kn-kg +u 1g 34+kn+90-ko-kh +u 1g 34+ko+91-kp-ki +u 1g 34+kp+92-kq-kj +u 1g 34+kq+93-kr-kk +u 1g 34+kr+94-ks-kl +u 1g 34+J+kf-kt-ih +u 1g 34+kt+kg-ku-ii +u 1g 34+ku+kh-kv-ij +u 1g 34+kv+ki-kw-ik +u 1g 34+kw+kj-kx-il +u 1g 34+kx+kk-ky-im +u 1g 34+ky+kl-kz-in +u 1g 33-km-kt+k8 +u 1g 33-kn-ku+k9 +u 1g 33-ko-kv+ka +u 1g 33-kp-kw+kb +u 1g 33-kq-kx+kc +u 1g 33-kr-ky+kd +u 1g 33-ks-kz+ke +u 1g 34+2X+kA-kH-kf +u 1g 34+kH+kB-kI-kg +u 1g 34+kI+kC-kJ-kh +u 1g 34+kJ+kD-kK-ki +u 1g 34+kK+kE-kL-kj +u 1g 34+kL+kF-kM-kk +u 1g 34+kM+kG-kN-kl +u 1g 34+2Z+kA-kO-ih +u 1g 34+kO+kB-kP-ii +u 1g 34+kP+kC-kQ-ij +u 1g 34+kQ+kD-kR-ik +u 1g 34+kR+kE-kS-il +u 1g 34+kS+kF-kT-im +u 1g 34+kT+kG-kU-in +u 1g 33+kt+kH-kO +u 1g 33+ku+kI-kP +u 1g 33+kv+kJ-kQ +u 1g 33+kw+kK-kR +u 1g 33+kx+kL-kS +u 1g 33+ky+kM-kT +u 1g 33+kz+kN-kU +u 1g 34+1N+kA-kV-jI +u 1g 34+kV+kB-kW-jJ +u 1g 34+kW+kC-kX-jK +u 1g 34+kX+kD-kY-jL +u 1g 34+kY+kE-kZ-jM +u 1g 34+kZ+kF-k%-jN +u 1g 34+k%+kG-k@-jO +u 1g 33-kV-k1+kO +u 1g 33-kW-k2+kP +u 1g 33-kX-k3+kQ +u 1g 33-kY-k4+kR +u 1g 33-kZ-k5+kS +u 1g 33-k%-k6+kT +u 1g 33-k@-k7+kU +u 1g 34+1S+aR-l7-l0 +u 1g 34+l7+aS-l8-l1 +u 1g 34+l8+aT-l9-l2 +u 1g 34+l9+aU-la-l3 +u 1g 34+la+aV-lb-l4 +u 1g 34+lb+aW-lc-l5 +u 1g 34+lc+aX-ld-l6 +u 1g 34+1D+l0-ll-le +u 1g 34+ll+l1-lm-lf +u 1g 34+lm+l2-ln-lg +u 1g 34+ln+l3-lo-lh +u 1g 34+lo+l4-lp-li +u 1g 34+lp+l5-lq-lj +u 1g 34+lq+l6-lr-lk +u 1g 34+1T+aR-ls-le +u 1g 34+ls+aS-lt-lf +u 1g 34+lt+aT-lu-lg +u 1g 34+lu+aU-lv-lh +u 1g 34+lv+aV-lw-li +u 1g 34+lw+aW-lx-lj +u 1g 34+lx+aX-ly-lk +u 1g 33-l7-ll+ls +u 1g 33-l8-lm+lt +u 1g 33-l9-ln+lu +u 1g 33-la-lo+lv +u 1g 33-lb-lp+lw +u 1g 33-lc-lq+lx +u 1g 33-ld-lr+ly +u 1g 34+I+aK-lz-le +u 1g 34+lz+aL-lA-lf +u 1g 34+lA+aM-lB-lg +u 1g 34+lB+aN-lC-lh +u 1g 34+lC+aO-lD-li +u 1g 34+lD+aP-lE-lj +u 1g 34+lE+aQ-lF-lk +u 1g 33+lz+aY-ls +u 1g 33+lA+aZ-lt +u 1g 33+lB+a%-lu +u 1g 33+lC+a@-lv +u 1g 33+lD+b0-lw +u 1g 33+lE+b1-lx +u 1g 33+lF+b2-ly +u 1g 34+N+lG-lN-le +u 1g 34+lN+lH-lO-lf +u 1g 34+lO+lI-lP-lg +u 1g 34+lP+lJ-lQ-lh +u 1g 34+lQ+lK-lR-li +u 1g 34+lR+lL-lS-lj +u 1g 34+lS+lM-lT-lk +u 1g 34+1%+lU-l@-lG +u 1g 34+l@+lV-m0-lH +u 1g 34+m0+lW-m1-lI +u 1g 34+m1+lX-m2-lJ +u 1g 34+m2+lY-m3-lK +u 1g 34+m3+lZ-m4-lL +u 1g 34+m4+l%-m5-lM +u 1g 34+1Z+lU-m6-le +u 1g 34+m6+lV-m7-lf +u 1g 34+m7+lW-m8-lg +u 1g 34+m8+lX-m9-lh +u 1g 34+m9+lY-ma-li +u 1g 34+ma+lZ-mb-lj +u 1g 34+mb+l%-mc-lk +u 1g 33+lN+l@-m6 +u 1g 33+lO+m0-m7 +u 1g 33+lP+m1-m8 +u 1g 33+lQ+m2-m9 +u 1g 33+lR+m3-ma +u 1g 33+lS+m4-mb +u 1g 33+lT+m5-mc +u 1g 34-3l+lU-md-aK +u 1g 34+md+lV-me-aL +u 1g 34+me+lW-mf-aM +u 1g 34+mf+lX-mg-aN +u 1g 34+mg+lY-mh-aO +u 1g 34+mh+lZ-mi-aP +u 1g 34+mi+l%-mj-aQ +u 1g 33-lz+m6-md +u 1g 33-lA+m7-me +u 1g 33-lB+m8-mf +u 1g 33-lC+m9-mg +u 1g 33-lD+ma-mh +u 1g 33-lE+mb-mi +u 1g 33-lF+mc-mj +u 1g 34+2U+mk-mr-l0 +u 1g 34+mr+ml-ms-l1 +u 1g 34+ms+mm-mt-l2 +u 1g 34+mt+mn-mu-l3 +u 1g 34+mu+mo-mv-l4 +u 1g 34+mv+mp-mw-l5 +u 1g 34+mw+mq-mx-l6 +u 1g 34+3r+mk-my-le +u 1g 34+my+ml-mz-lf +u 1g 34+mz+mm-mA-lg +u 1g 34+mA+mn-mB-lh +u 1g 34+mB+mo-mC-li +u 1g 34+mC+mp-mD-lj +u 1g 34+mD+mq-mE-lk +u 1g 33+ll+mr-my +u 1g 33+lm+ms-mz +u 1g 33+ln+mt-mA +u 1g 33+lo+mu-mB +u 1g 33+lp+mv-mC +u 1g 33+lq+mw-mD +u 1g 33+lr+mx-mE +u 1g 34+2V+mk-mF-lG +u 1g 34+mF+ml-mG-lH +u 1g 34+mG+mm-mH-lI +u 1g 34+mH+mn-mI-lJ +u 1g 34+mI+mo-mJ-lK +u 1g 34+mJ+mp-mK-lL +u 1g 34+mK+mq-mL-lM +u 1g 33-mF-lN+my +u 1g 33-mG-lO+mz +u 1g 33-mH-lP+mA +u 1g 33-mI-lQ+mB +u 1g 33-mJ-lR+mC +u 1g 33-mK-lS+mD +u 1g 33-mL-lT+mE +u 1g 34+W+gL-mT-mM +u 1g 34+mT+gM-mU-mN +u 1g 34+mU+gN-mV-mO +u 1g 34+mV+gO-mW-mP +u 1g 34+mW+gP-mX-mQ +u 1g 34+mX+gQ-mY-mR +u 1g 34+mY+gR-mZ-mS +u 1g 34+Q+mM-n5-m% +u 1g 34+n5+mN-n6-m@ +u 1g 34+n6+mO-n7-n0 +u 1g 34+n7+mP-n8-n1 +u 1g 34+n8+mQ-n9-n2 +u 1g 34+n9+mR-na-n3 +u 1g 34+na+mS-nb-n4 +u 1g 34+V+gL-nc-m% +u 1g 34+nc+gM-nd-m@ +u 1g 34+nd+gN-ne-n0 +u 1g 34+ne+gO-nf-n1 +u 1g 34+nf+gP-ng-n2 +u 1g 34+ng+gQ-nh-n3 +u 1g 34+nh+gR-ni-n4 +u 1g 33-mT-n5+nc +u 1g 33-mU-n6+nd +u 1g 33-mV-n7+ne +u 1g 33-mW-n8+nf +u 1g 33-mX-n9+ng +u 1g 33-mY-na+nh +u 1g 33-mZ-nb+ni +u 1g 34+1q+nj-nq-ap +u 1g 34+nq+nk-nr-aq +u 1g 34+nr+nl-ns-ar +u 1g 34+ns+nm-nt-as +u 1g 34+nt+nn-nu-at +u 1g 34+nu+no-nv-au +u 1g 34+nv+np-nw-av +u 1g 34+T+ap-nx-m% +u 1g 34+nx+aq-ny-m@ +u 1g 34+ny+ar-nz-n0 +u 1g 34+nz+as-nA-n1 +u 1g 34+nA+at-nB-n2 +u 1g 34+nB+au-nC-n3 +u 1g 34+nC+av-nD-n4 +u 1g 34+1p+nj-nE-m% +u 1g 34+nE+nk-nF-m@ +u 1g 34+nF+nl-nG-n0 +u 1g 34+nG+nm-nH-n1 +u 1g 34+nH+nn-nI-n2 +u 1g 34+nI+no-nJ-n3 +u 1g 34+nJ+np-nK-n4 +u 1g 33-nq-nx+nE +u 1g 33-nr-ny+nF +u 1g 33-ns-nz+nG +u 1g 33-nt-nA+nH +u 1g 33-nu-nB+nI +u 1g 33-nv-nC+nJ +u 1g 33-nw-nD+nK +u 1g 34+21+nL-nS-gL +u 1g 34+nS+nM-nT-gM +u 1g 34+nT+nN-nU-gN +u 1g 34+nU+nO-nV-gO +u 1g 34+nV+nP-nW-gP +u 1g 34+nW+nQ-nX-gQ +u 1g 34+nX+nR-nY-gR +u 1g 34+20+nL-nZ-m% +u 1g 34+nZ+nM-n%-m@ +u 1g 34+n%+nN-n@-n0 +u 1g 34+n@+nO-o0-n1 +u 1g 34+o0+nP-o1-n2 +u 1g 34+o1+nQ-o2-n3 +u 1g 34+o2+nR-o3-n4 +u 1g 33-nS-nc+nZ +u 1g 33-nT-nd+n% +u 1g 33-nU-ne+n@ +u 1g 33-nV-nf+o0 +u 1g 33-nW-ng+o1 +u 1g 33-nX-nh+o2 +u 1g 33-nY-ni+o3 +u 1g 34+22+nL-o4-ap +u 1g 34+o4+nM-o5-aq +u 1g 34+o5+nN-o6-ar +u 1g 34+o6+nO-o7-as +u 1g 34+o7+nP-o8-at +u 1g 34+o8+nQ-o9-au +u 1g 34+o9+nR-oa-av +u 1g 33+nx+o4-nZ +u 1g 33+ny+o5-n% +u 1g 33+nz+o6-n@ +u 1g 33+nA+o7-o0 +u 1g 33+nB+o8-o1 +u 1g 33+nC+o9-o2 +u 1g 33+nD+oa-o3 +u 1g 34+1s+nj-oi-ob +u 1g 34+oi+nk-oj-oc +u 1g 34+oj+nl-ok-od +u 1g 34+ok+nm-ol-oe +u 1g 34+ol+nn-om-of +u 1g 34+om+no-on-og +u 1g 34+on+np-oo-oh +u 1g 34-3z+ob-op-m% +u 1g 34+op+oc-oq-m@ +u 1g 34+oq+od-or-n0 +u 1g 34+or+oe-os-n1 +u 1g 34+os+of-ot-n2 +u 1g 34+ot+og-ou-n3 +u 1g 34+ou+oh-ov-n4 +u 1g 33+oi-nE+op +u 1g 33+oj-nF+oq +u 1g 33+ok-nG+or +u 1g 33+ol-nH+os +u 1g 33+om-nI+ot +u 1g 33+on-nJ+ou +u 1g 33+oo-nK+ov +u 1g 34+1n+ob-ow-mM +u 1g 34+ow+oc-ox-mN +u 1g 34+ox+od-oy-mO +u 1g 34+oy+oe-oz-mP +u 1g 34+oz+of-oA-mQ +u 1g 34+oA+og-oB-mR +u 1g 34+oB+oh-oC-mS +u 1g 33+n5+ow-op +u 1g 33+n6+ox-oq +u 1g 33+n7+oy-or +u 1g 33+n8+oz-os +u 1g 33+n9+oA-ot +u 1g 33+na+oB-ou +u 1g 33+nb+oC-ov +u 1g 34+23+nL-oD-ab +u 1g 34+oD+nM-oE-ac +u 1g 34+oE+nN-oF-ad +u 1g 34+oF+nO-oG-ae +u 1g 34+oG+nP-oH-af +u 1g 34+oH+nQ-oI-ag +u 1g 34+oI+nR-oJ-ah +u 1g 33-o4-aw+oD +u 1g 33-o5-ax+oE +u 1g 33-o6-ay+oF +u 1g 33-o7-az+oG +u 1g 33-o8-aA+oH +u 1g 33-o9-aB+oI +u 1g 33-oa-aC+oJ +u 1g 34+1L+9j-oK-ab +u 1g 34+oK+9k-oL-ac +u 1g 34+oL+9l-oM-ad +u 1g 34+oM+9m-oN-ae +u 1g 34+oN+9n-oO-af +u 1g 34+oO+9o-oP-ag +u 1g 34+oP+9p-oQ-ah +u 1g 34+3m+9E-oR-ab +u 1g 34+oR+9F-oS-ac +u 1g 34+oS+9G-oT-ad +u 1g 34+oT+9H-oU-ae +u 1g 34+oU+9I-oV-af +u 1g 34+oV+9J-oW-ag +u 1g 34+oW+9K-oX-ah +u 1g 33-9L-oK+oR +u 1g 33-9M-oL+oS +u 1g 33-9N-oM+oT +u 1g 33-9O-oN+oU +u 1g 33-9P-oO+oV +u 1g 33-9Q-oP+oW +u 1g 33-9R-oQ+oX +u 1g 34-3p+9E-oY-bh +u 1g 34+oY+9F-oZ-bi +u 1g 34+oZ+9G-o%-bj +u 1g 34+o%+9H-o@-bk +u 1g 34+o@+9I-p0-bl +u 1g 34+p0+9J-p1-bm +u 1g 34+p1+9K-p2-bn +u 1g 33+bC+oY-oR +u 1g 33+bD+oZ-oS +u 1g 33+bE+o%-oT +u 1g 33+bF+o@-oU +u 1g 33+bG+p0-oV +u 1g 33+bH+p1-oW +u 1g 33+bI+p2-oX +u 1g 34+3w+nL-p3-9j +u 1g 34+p3+nM-p4-9k +u 1g 34+p4+nN-p5-9l +u 1g 34+p5+nO-p6-9m +u 1g 34+p6+nP-p7-9n +u 1g 34+p7+nQ-p8-9o +u 1g 34+p8+nR-p9-9p +u 1g 33-oD+oK+p3 +u 1g 33-oE+oL+p4 +u 1g 33-oF+oM+p5 +u 1g 33-oG+oN+p6 +u 1g 33-oH+oO+p7 +u 1g 33-oI+oP+p8 +u 1g 33-oJ+oQ+p9 +u 1g 34+11+cg-ph-pa +u 1g 34+ph+ch-pi-pb +u 1g 34+pi+ci-pj-pc +u 1g 34+pj+cj-pk-pd +u 1g 34+pk+ck-pl-pe +u 1g 34+pl+cl-pm-pf +u 1g 34+pm+cm-pn-pg +u 1g 34+15+j2-po-cg +u 1g 34+po+j3-pp-ch +u 1g 34+pp+j4-pq-ci +u 1g 34+pq+j5-pr-cj +u 1g 34+pr+j6-ps-ck +u 1g 34+ps+j7-pt-cl +u 1g 34+pt+j8-pu-cm +u 1g 34+14+j2-pv-pa +u 1g 34+pv+j3-pw-pb +u 1g 34+pw+j4-px-pc +u 1g 34+px+j5-py-pd +u 1g 34+py+j6-pz-pe +u 1g 34+pz+j7-pA-pf +u 1g 34+pA+j8-pB-pg +u 1g 33+ph+po-pv +u 1g 33+pi+pp-pw +u 1g 33+pj+pq-px +u 1g 33+pk+pr-py +u 1g 33+pl+ps-pz +u 1g 33+pm+pt-pA +u 1g 33+pn+pu-pB +u 1g 34+2b+pC-pJ-cg +u 1g 34+pJ+pD-pK-ch +u 1g 34+pK+pE-pL-ci +u 1g 34+pL+pF-pM-cj +u 1g 34+pM+pG-pN-ck +u 1g 34+pN+pH-pO-cl +u 1g 34+pO+pI-pP-cm +u 1g 34+2a+pC-pQ-pa +u 1g 34+pQ+pD-pR-pb +u 1g 34+pR+pE-pS-pc +u 1g 34+pS+pF-pT-pd +u 1g 34+pT+pG-pU-pe +u 1g 34+pU+pH-pV-pf +u 1g 34+pV+pI-pW-pg +u 1g 33-pJ-ph+pQ +u 1g 33-pK-pi+pR +u 1g 33-pL-pj+pS +u 1g 33-pM-pk+pT +u 1g 33-pN-pl+pU +u 1g 33-pO-pm+pV +u 1g 33-pP-pn+pW +u 1g 34+2k+q2-q9-pX +u 1g 34+q9+q3-qa-pY +u 1g 34+qa+q4-qb-pZ +u 1g 34+qb+q5-qc-p% +u 1g 34+qc+q6-qd-p@ +u 1g 34+qd+q7-qe-q0 +u 1g 34+qe+q8-qf-q1 +u 1g 34+18+pX-qg-pa +u 1g 34+qg+pY-qh-pb +u 1g 34+qh+pZ-qi-pc +u 1g 34+qi+p%-qj-pd +u 1g 34+qj+p@-qk-pe +u 1g 34+qk+q0-ql-pf +u 1g 34+ql+q1-qm-pg +u 1g 34+2o+q2-qn-pa +u 1g 34+qn+q3-qo-pb +u 1g 34+qo+q4-qp-pc +u 1g 34+qp+q5-qq-pd +u 1g 34+qq+q6-qr-pe +u 1g 34+qr+q7-qs-pf +u 1g 34+qs+q8-qt-pg +u 1g 33-q9-qg+qn +u 1g 33-qa-qh+qo +u 1g 33-qb-qi+qp +u 1g 33-qc-qj+qq +u 1g 33-qd-qk+qr +u 1g 33-qe-ql+qs +u 1g 33-qf-qm+qt +u 1g 34+2m+q2-qu-j2 +u 1g 34+qu+q3-qv-j3 +u 1g 34+qv+q4-qw-j4 +u 1g 34+qw+q5-qx-j5 +u 1g 34+qx+q6-qy-j6 +u 1g 34+qy+q7-qz-j7 +u 1g 34+qz+q8-qA-j8 +u 1g 33+pv+qu-qn +u 1g 33+pw+qv-qo +u 1g 33+px+qw-qp +u 1g 33+py+qx-qq +u 1g 33+pz+qy-qr +u 1g 33+pA+qz-qs +u 1g 33+pB+qA-qt +u 1g 34+3v+pC-qB-pX +u 1g 34+qB+pD-qC-pY +u 1g 34+qC+pE-qD-pZ +u 1g 34+qD+pF-qE-p% +u 1g 34+qE+pG-qF-p@ +u 1g 34+qF+pH-qG-q0 +u 1g 34+qG+pI-qH-q1 +u 1g 33-pQ+qg+qB +u 1g 33-pR+qh+qC +u 1g 33-pS+qi+qD +u 1g 33-pT+qj+qE +u 1g 33-pU+qk+qF +u 1g 33-pV+ql+qG +u 1g 33-pW+qm+qH +u 1g 34+1b+qP-qW-qI +u 1g 34+qW+qQ-qX-qJ +u 1g 34+qX+qR-qY-qK +u 1g 34+qY+qS-qZ-qL +u 1g 34+qZ+qT-q%-qM +u 1g 34+q%+qU-q@-qN +u 1g 34+q@+qV-r0-qO +u 1g 34+2v+r1-r8-qP +u 1g 34+r8+r2-r9-qQ +u 1g 34+r9+r3-ra-qR +u 1g 34+ra+r4-rb-qS +u 1g 34+rb+r5-rc-qT +u 1g 34+rc+r6-rd-qU +u 1g 34+rd+r7-re-qV +u 1g 34+2t+r1-rf-qI +u 1g 34+rf+r2-rg-qJ +u 1g 34+rg+r3-rh-qK +u 1g 34+rh+r4-ri-qL +u 1g 34+ri+r5-rj-qM +u 1g 34+rj+r6-rk-qN +u 1g 34+rk+r7-rl-qO +u 1g 33+qW+r8-rf +u 1g 33+qX+r9-rg +u 1g 33+qY+ra-rh +u 1g 33+qZ+rb-ri +u 1g 33+q%+rc-rj +u 1g 33+q@+rd-rk +u 1g 33+r0+re-rl +u 1g 34+3f+rm-rt-fd +u 1g 34+rt+rn-ru-fe +u 1g 34+ru+ro-rv-ff +u 1g 34+rv+rp-rw-fg +u 1g 34+rw+rq-rx-fh +u 1g 34+rx+rr-ry-fi +u 1g 34+ry+rs-rz-fj +u 1g 34+3g+rm-rA-qI +u 1g 34+rA+rn-rB-qJ +u 1g 34+rB+ro-rC-qK +u 1g 34+rC+rp-rD-qL +u 1g 34+rD+rq-rE-qM +u 1g 34+rE+rr-rF-qN +u 1g 34+rF+rs-rG-qO +u 1g 34-3x+fd-rH-qI +u 1g 34+rH+fe-rI-qJ +u 1g 34+rI+ff-rJ-qK +u 1g 34+rJ+fg-rK-qL +u 1g 34+rK+fh-rL-qM +u 1g 34+rL+fi-rM-qN +u 1g 34+rM+fj-rN-qO +u 1g 33+rt-rA+rH +u 1g 33+ru-rB+rI +u 1g 33+rv-rC+rJ +u 1g 33+rw-rD+rK +u 1g 33+rx-rE+rL +u 1g 33+ry-rF+rM +u 1g 33+rz-rG+rN +u 1g 34+1f+e7-rO-qI +u 1g 34+rO+e8-rP-qJ +u 1g 34+rP+e9-rQ-qK +u 1g 34+rQ+ea-rR-qL +u 1g 34+rR+eb-rS-qM +u 1g 34+rS+ec-rT-qN +u 1g 34+rT+ed-rU-qO +u 1g 33+rO+fy-rH +u 1g 33+rP+fz-rI +u 1g 33+rQ+fA-rJ +u 1g 33+rR+fB-rK +u 1g 33+rS+fC-rL +u 1g 33+rT+fD-rM +u 1g 33+rU+fE-rN +u 1g 34-3y+r1-rV-e7 +u 1g 34+rV+r2-rW-e8 +u 1g 34+rW+r3-rX-e9 +u 1g 34+rX+r4-rY-ea +u 1g 34+rY+r5-rZ-eb +u 1g 34+rZ+r6-r%-ec +u 1g 34+r%+r7-r@-ed +u 1g 33-rO+rf-rV +u 1g 33-rP+rg-rW +u 1g 33-rQ+rh-rX +u 1g 33-rR+ri-rY +u 1g 33-rS+rj-rZ +u 1g 33-rT+rk-r% +u 1g 33-rU+rl-r@ +u 1g 34+3i+rm-s7-s0 +u 1g 34+s7+rn-s8-s1 +u 1g 34+s8+ro-s9-s2 +u 1g 34+s9+rp-sa-s3 +u 1g 34+sa+rq-sb-s4 +u 1g 34+sb+rr-sc-s5 +u 1g 34+sc+rs-sd-s6 +u 1g 34+3A+s0-se-qI +u 1g 34+se+s1-sf-qJ +u 1g 34+sf+s2-sg-qK +u 1g 34+sg+s3-sh-qL +u 1g 34+sh+s4-si-qM +u 1g 34+si+s5-sj-qN +u 1g 34+sj+s6-sk-qO +u 1g 33+rA-s7-se +u 1g 33+rB-s8-sf +u 1g 33+rC-s9-sg +u 1g 33+rD-sa-sh +u 1g 33+rE-sb-si +u 1g 33+rF-sc-sj +u 1g 33+rG-sd-sk +u 1g 34+2L+s0-sl-qP +u 1g 34+sl+s1-sm-qQ +u 1g 34+sm+s2-sn-qR +u 1g 34+sn+s3-so-qS +u 1g 34+so+s4-sp-qT +u 1g 34+sp+s5-sq-qU +u 1g 34+sq+s6-sr-qV +u 1g 33-sl-qW+se +u 1g 33-sm-qX+sf +u 1g 33-sn-qY+sg +u 1g 33-so-qZ+sh +u 1g 33-sp-q%+si +u 1g 33-sq-q@+sj +u 1g 33-sr-r0+sk +u 1g 33+8M+jB-dA +u 1g 33+8N+jC-dB +u 1g 33+8O+jD-dC +u 1g 33+8P+jE-dD +u 1g 33+8Q+jF-dE +u 1g 33+8R+jG-dF +u 1g 33+8S+jH-dG +u 1g 33-hK-8r+e0 +u 1g 33-hL-8s+e1 +u 1g 33-hM-8t+e2 +u 1g 33-hN-8u+e3 +u 1g 33-hO-8v+e4 +u 1g 33-hP-8w+e5 +u 1g 33-hQ-8x+e6 +u 1g 34+1o+ob-sz-ss +u 1g 34+sz+oc-sA-st +u 1g 34+sA+od-sB-su +u 1g 34+sB+oe-sC-sv +u 1g 34+sC+of-sD-sw +u 1g 34+sD+og-sE-sx +u 1g 34+sE+oh-sF-sy +u 1g 34+1r+nj-sG-ss +u 1g 34+sG+nk-sH-st +u 1g 34+sH+nl-sI-su +u 1g 34+sI+nm-sJ-sv +u 1g 34+sJ+nn-sK-sw +u 1g 34+sK+no-sL-sx +u 1g 34+sL+np-sM-sy +u 1g 33-oi-sz+sG +u 1g 33-oj-sA+sH +u 1g 33-ok-sB+sI +u 1g 33-ol-sC+sJ +u 1g 33-om-sD+sK +u 1g 33-on-sE+sL +u 1g 33-oo-sF+sM +u 1g 34+1x+sN-sU-ob +u 1g 34+sU+sO-sV-oc +u 1g 34+sV+sP-sW-od +u 1g 34+sW+sQ-sX-oe +u 1g 34+sX+sR-sY-of +u 1g 34+sY+sS-sZ-og +u 1g 34+sZ+sT-s%-oh +u 1g 34+1w+sN-s@-ss +u 1g 34+s@+sO-t0-st +u 1g 34+t0+sP-t1-su +u 1g 34+t1+sQ-t2-sv +u 1g 34+t2+sR-t3-sw +u 1g 34+t3+sS-t4-sx +u 1g 34+t4+sT-t5-sy +u 1g 33+sz+sU-s@ +u 1g 33+sA+sV-t0 +u 1g 33+sB+sW-t1 +u 1g 33+sC+sX-t2 +u 1g 33+sD+sY-t3 +u 1g 33+sE+sZ-t4 +u 1g 33+sF+s%-t5 +u 1g 34+1v+eG-t6-ss +u 1g 34+t6+eH-t7-st +u 1g 34+t7+eI-t8-su +u 1g 34+t8+eJ-t9-sv +u 1g 34+t9+eK-ta-sw +u 1g 34+ta+eL-tb-sx +u 1g 34+tb+eM-tc-sy +u 1g 34+2p+fd-td-ss +u 1g 34+td+fe-te-st +u 1g 34+te+ff-tf-su +u 1g 34+tf+fg-tg-sv +u 1g 34+tg+fh-th-sw +u 1g 34+th+fi-ti-sx +u 1g 34+ti+fj-tj-sy +u 1g 33-fk-t6+td +u 1g 33-fl-t7+te +u 1g 33-fm-t8+tf +u 1g 33-fn-t9+tg +u 1g 33-fo-ta+th +u 1g 33-fp-tb+ti +u 1g 33-fq-tc+tj +u 1g 34+3j+rm-tk-ss +u 1g 34+tk+rn-tl-st +u 1g 34+tl+ro-tm-su +u 1g 34+tm+rp-tn-sv +u 1g 34+tn+rq-to-sw +u 1g 34+to+rr-tp-sx +u 1g 34+tp+rs-tq-sy +u 1g 33-rt-td+tk +u 1g 33-ru-te+tl +u 1g 33-rv-tf+tm +u 1g 33-rw-tg+tn +u 1g 33-rx-th+to +u 1g 33-ry-ti+tp +u 1g 33-rz-tj+tq +u 1g 34+3h+rm-tr-sN +u 1g 34+tr+rn-ts-sO +u 1g 34+ts+ro-tt-sP +u 1g 34+tt+rp-tu-sQ +u 1g 34+tu+rq-tv-sR +u 1g 34+tv+rr-tw-sS +u 1g 34+tw+rs-tx-sT +u 1g 33+s@+tr-tk +u 1g 33+t0+ts-tl +u 1g 33+t1+tt-tm +u 1g 33+t2+tu-tn +u 1g 33+t3+tv-to +u 1g 33+t4+tw-tp +u 1g 33+t5+tx-tq +u 1g 34-3u+eG-ty-nj +u 1g 34+ty+eH-tz-nk +u 1g 34+tz+eI-tA-nl +u 1g 34+tA+eJ-tB-nm +u 1g 34+tB+eK-tC-nn +u 1g 34+tC+eL-tD-no +u 1g 34+tD+eM-tE-np +u 1g 33-sG+t6-ty +u 1g 33-sH+t7-tz +u 1g 33-sI+t8-tA +u 1g 33-sJ+t9-tB +u 1g 33-sK+ta-tC +u 1g 33-sL+tb-tD +u 1g 33-sM+tc-tE +u 1g 34+1g+e7-tF-cP +u 1g 34+tF+e8-tG-cQ +u 1g 34+tG+e9-tH-cR +u 1g 34+tH+ea-tI-cS +u 1g 34+tI+eb-tJ-cT +u 1g 34+tJ+ec-tK-cU +u 1g 34+tK+ed-tL-cV +u 1g 33-tF-cW+ee +u 1g 33-tG-cX+ef +u 1g 33-tH-cY+eg +u 1g 33-tI-cZ+eh +u 1g 33-tJ-c%+ei +u 1g 33-tK-c@+ej +u 1g 33-tL-d0+ek +u 1g 34+38+fF-tM-cg +u 1g 34+tM+fG-tN-ch +u 1g 34+tN+fH-tO-ci +u 1g 34+tO+fI-tP-cj +u 1g 34+tP+fJ-tQ-ck +u 1g 34+tQ+fK-tR-cl +u 1g 34+tR+fL-tS-cm +u 1g 33+cn+tM-f% +u 1g 33+co+tN-f@ +u 1g 33+cp+tO-g0 +u 1g 33+cq+tP-g1 +u 1g 33+cr+tQ-g2 +u 1g 33+cs+tR-g3 +u 1g 33+ct+tS-g4 +u 1g 34+1C+t%-u5-tT +u 1g 34+u5+t@-u6-tU +u 1g 34+u6+u0-u7-tV +u 1g 34+u7+u1-u8-tW +u 1g 34+u8+u2-u9-tX +u 1g 34+u9+u3-ua-tY +u 1g 34+ua+u4-ub-tZ +u 1g 34+1F+l0-uc-t% +u 1g 34+uc+l1-ud-t@ +u 1g 34+ud+l2-ue-u0 +u 1g 34+ue+l3-uf-u1 +u 1g 34+uf+l4-ug-u2 +u 1g 34+ug+l5-uh-u3 +u 1g 34+uh+l6-ui-u4 +u 1g 34+1E+l0-uj-tT +u 1g 34+uj+l1-uk-tU +u 1g 34+uk+l2-ul-tV +u 1g 34+ul+l3-um-tW +u 1g 34+um+l4-un-tX +u 1g 34+un+l5-uo-tY +u 1g 34+uo+l6-up-tZ +u 1g 33+u5+uc-uj +u 1g 33+u6+ud-uk +u 1g 33+u7+ue-ul +u 1g 33+u8+uf-um +u 1g 33+u9+ug-un +u 1g 33+ua+uh-uo +u 1g 33+ub+ui-up +u 1g 34+1I+eU-uq-l0 +u 1g 34+uq+eV-ur-l1 +u 1g 34+ur+eW-us-l2 +u 1g 34+us+eX-ut-l3 +u 1g 34+ut+eY-uu-l4 +u 1g 34+uu+eZ-uv-l5 +u 1g 34+uv+e%-uw-l6 +u 1g 34+1H+eU-ux-tT +u 1g 34+ux+eV-uy-tU +u 1g 34+uy+eW-uz-tV +u 1g 34+uz+eX-uA-tW +u 1g 34+uA+eY-uB-tX +u 1g 34+uB+eZ-uC-tY +u 1g 34+uC+e%-uD-tZ +u 1g 33+uj+uq-ux +u 1g 33+uk+ur-uy +u 1g 33+ul+us-uz +u 1g 33+um+ut-uA +u 1g 33+un+uu-uB +u 1g 33+uo+uv-uC +u 1g 33+up+uw-uD +u 1g 34+2N+uE-uL-t% +u 1g 34+uL+uF-uM-t@ +u 1g 34+uM+uG-uN-u0 +u 1g 34+uN+uH-uO-u1 +u 1g 34+uO+uI-uP-u2 +u 1g 34+uP+uJ-uQ-u3 +u 1g 34+uQ+uK-uR-u4 +u 1g 34+2O+uE-uS-tT +u 1g 34+uS+uF-uT-tU +u 1g 34+uT+uG-uU-tV +u 1g 34+uU+uH-uV-tW +u 1g 34+uV+uI-uW-tX +u 1g 34+uW+uJ-uX-tY +u 1g 34+uX+uK-uY-tZ +u 1g 33-uL-u5+uS +u 1g 33-uM-u6+uT +u 1g 33-uN-u7+uU +u 1g 33-uO-u8+uV +u 1g 33-uP-u9+uW +u 1g 33-uQ-ua+uX +u 1g 33-uR-ub+uY +u 1g 34+2c+pC-uZ-tT +u 1g 34+uZ+pD-u%-tU +u 1g 34+u%+pE-u@-tV +u 1g 34+u@+pF-v0-tW +u 1g 34+v0+pG-v1-tX +u 1g 34+v1+pH-v2-tY +u 1g 34+v2+pI-v3-tZ +u 1g 34+2R+uE-v4-pC +u 1g 34+v4+uF-v5-pD +u 1g 34+v5+uG-v6-pE +u 1g 34+v6+uH-v7-pF +u 1g 34+v7+uI-v8-pG +u 1g 34+v8+uJ-v9-pH +u 1g 34+v9+uK-va-pI +u 1g 33+uZ+v4-uS +u 1g 33+u%+v5-uT +u 1g 33+u@+v6-uU +u 1g 33+v0+v7-uV +u 1g 33+v1+v8-uW +u 1g 33+v2+v9-uX +u 1g 33+v3+va-uY +u 1g 34+37+fF-vb-pC +u 1g 34+vb+fG-vc-pD +u 1g 34+vc+fH-vd-pE +u 1g 34+vd+fI-ve-pF +u 1g 34+ve+fJ-vf-pG +u 1g 34+vf+fK-vg-pH +u 1g 34+vg+fL-vh-pI +u 1g 34+36+fF-vi-tT +u 1g 34+vi+fG-vj-tU +u 1g 34+vj+fH-vk-tV +u 1g 34+vk+fI-vl-tW +u 1g 34+vl+fJ-vm-tX +u 1g 34+vm+fK-vn-tY +u 1g 34+vn+fL-vo-tZ +u 1g 33-vb-uZ+vi +u 1g 33-vc-u%+vj +u 1g 33-vd-u@+vk +u 1g 33-ve-v0+vl +u 1g 33-vf-v1+vm +u 1g 33-vg-v2+vn +u 1g 33-vh-v3+vo +u 1g 33+ux+fM-vi +u 1g 33+uy+fN-vj +u 1g 33+uz+fO-vk +u 1g 33+uA+fP-vl +u 1g 33+uB+fQ-vm +u 1g 33+uC+fR-vn +u 1g 33+uD+fS-vo +u 1g 34-q+3N-vp-g5 +u 1g 34+vp+3O-vq-g6 +u 1g 34+vq+3P-vr-g7 +u 1g 34+vr+3Q-vs-g8 +u 1g 34+vs+3R-vt-g9 +u 1g 34+vt+3S-vu-ga +u 1g 34+vu+3T-vv-gb +u 1g 34-p+3G-vw-g5 +u 1g 34+vw+3H-vx-g6 +u 1g 34+vx+3I-vy-g7 +u 1g 34+vy+3J-vz-g8 +u 1g 34+vz+3K-vA-g9 +u 1g 34+vA+3L-vB-ga +u 1g 34+vB+3M-vC-gb +u 1g 33+3U-vp+vw +u 1g 33+3V-vq+vx +u 1g 33+3W-vr+vy +u 1g 33+3X-vs+vz +u 1g 33+3Y-vt+vA +u 1g 33+3Z-vu+vB +u 1g 33+5w-vv+vC +u 1g 34-r+3%-vD-g5 +u 1g 34+vD+3@-vE-g6 +u 1g 34+vE+40-vF-g7 +u 1g 34+vF+41-vG-g8 +u 1g 34+vG+42-vH-g9 +u 1g 34+vH+43-vI-ga +u 1g 34+vI+44-vJ-gb +u 1g 33-45-vw+vD +u 1g 33-46-vx+vE +u 1g 33-47-vy+vF +u 1g 33-48-vz+vG +u 1g 33-49-vA+vH +u 1g 33-4a-vB+vI +u 1g 33-5y-vC+vJ +u 1g 34-26+3N-vK-gS +u 1g 34+vK+3O-vL-gT +u 1g 34+vL+3P-vM-gU +u 1g 34+vM+3Q-vN-gV +u 1g 34+vN+3R-vO-gW +u 1g 34+vO+3S-vP-gX +u 1g 34+vP+3T-vQ-gY +u 1g 33-hi+vp-vK +u 1g 33-hj+vq-vL +u 1g 33-hk+vr-vM +u 1g 33-hl+vs-vN +u 1g 33-hm+vt-vO +u 1g 33-hn+vu-vP +u 1g 33-ho+vv-vQ +u 1g 34+3b+vR-vY-g5 +u 1g 34+vY+vS-vZ-g6 +u 1g 34+vZ+vT-v%-g7 +u 1g 34+v%+vU-v@-g8 +u 1g 34+v@+vV-w0-g9 +u 1g 34+w0+vW-w1-ga +u 1g 34+w1+vX-w2-gb +u 1g 34-3a+3%-w3-vR +u 1g 34+w3+3@-w4-vS +u 1g 34+w4+40-w5-vT +u 1g 34+w5+41-w6-vU +u 1g 34+w6+42-w7-vV +u 1g 34+w7+43-w8-vW +u 1g 34+w8+44-w9-vX +u 1g 33-vD+vY+w3 +u 1g 33-vE+vZ+w4 +u 1g 33-vF+v%+w5 +u 1g 33-vG+v@+w6 +u 1g 33-vH+w0+w7 +u 1g 33-vI+w1+w8 +u 1g 33-vJ+w2+w9 +u 1g 34+3e+vR-wa-gc +u 1g 34+wa+vS-wb-gd +u 1g 34+wb+vT-wc-ge +u 1g 34+wc+vU-wd-gf +u 1g 34+wd+vV-we-gg +u 1g 34+we+vW-wf-gh +u 1g 34+wf+vX-wg-gi +u 1g 33+gj+wa-vY +u 1g 33+gk+wb-vZ +u 1g 33+gl+wc-v% +u 1g 33+gm+wd-v@ +u 1g 33+gn+we-w0 +u 1g 33+go+wf-w1 +u 1g 33+gp+wg-w2 +u 1g 34+2@+hR-wh-9j +u 1g 34+wh+hS-wi-9k +u 1g 34+wi+hT-wj-9l +u 1g 34+wj+hU-wk-9m +u 1g 34+wk+hV-wl-9n +u 1g 34+wl+hW-wm-9o +u 1g 34+wm+hX-wn-9p +u 1g 33-wh-9q+ia +u 1g 33-wi-9r+ib +u 1g 33-wj-9s+ic +u 1g 33-wk-9t+id +u 1g 33-wl-9u+ie +u 1g 33-wm-9v+if +u 1g 33-wn-9w+ig +u 1g 34-x+5T-wo-iQ +u 1g 34+wo+5U-wp-iR +u 1g 34+wp+5V-wq-iS +u 1g 34+wq+5W-wr-iT +u 1g 34+wr+5X-ws-iU +u 1g 34+ws+5Y-wt-iV +u 1g 34+wt+5Z-wu-iW +u 1g 34-w+5%-wv-iQ +u 1g 34+wv+5@-ww-iR +u 1g 34+ww+60-wx-iS +u 1g 34+wx+61-wy-iT +u 1g 34+wy+62-wz-iU +u 1g 34+wz+63-wA-iV +u 1g 34+wA+64-wB-iW +u 1g 33+wo+65-wv +u 1g 33+wp+66-ww +u 1g 33+wq+67-wx +u 1g 33+wr+68-wy +u 1g 33+ws+69-wz +u 1g 33+wt+6a-wA +u 1g 33+wu+7L-wB +u 1g 34-E+5T-wC-jI +u 1g 34+wC+5U-wD-jJ +u 1g 34+wD+5V-wE-jK +u 1g 34+wE+5W-wF-jL +u 1g 34+wF+5X-wG-jM +u 1g 34+wG+5Y-wH-jN +u 1g 34+wH+5Z-wI-jO +u 1g 33-wo+jP+wC +u 1g 33-wp+jQ+wD +u 1g 33-wq+jR+wE +u 1g 33-wr+jS+wF +u 1g 33-ws+jT+wG +u 1g 33-wt+jU+wH +u 1g 33-wu+jV+wI +u 1g 34+2l+q2-wJ-iQ +u 1g 34+wJ+q3-wK-iR +u 1g 34+wK+q4-wL-iS +u 1g 34+wL+q5-wM-iT +u 1g 34+wM+q6-wN-iU +u 1g 34+wN+q7-wO-iV +u 1g 34+wO+q8-wP-iW +u 1g 33-qu-j9+wJ +u 1g 33-qv-ja+wK +u 1g 33-qw-jb+wL +u 1g 33-qx-jc+wM +u 1g 33-qy-jd+wN +u 1g 33-qz-je+wO +u 1g 33-qA-jf+wP +u 1g 34-2n+5%-wQ-q2 +u 1g 34+wQ+5@-wR-q3 +u 1g 34+wR+60-wS-q4 +u 1g 34+wS+61-wT-q5 +u 1g 34+wT+62-wU-q6 +u 1g 34+wU+63-wV-q7 +u 1g 34+wV+64-wW-q8 +u 1g 33-wJ+wv-wQ +u 1g 33-wK+ww-wR +u 1g 33-wL+wx-wS +u 1g 33-wM+wy-wT +u 1g 33-wN+wz-wU +u 1g 33-wO+wA-wV +u 1g 33-wP+wB-wW +u 1g 34-D+6b-wX-jI +u 1g 34+wX+6c-wY-jJ +u 1g 34+wY+6d-wZ-jK +u 1g 34+wZ+6e-w%-jL +u 1g 34+w%+6f-w@-jM +u 1g 34+w@+6g-x0-jN +u 1g 34+x0+6h-x1-jO +u 1g 33+wX-6i-wC +u 1g 33+wY-6j-wD +u 1g 33+wZ-6k-wE +u 1g 33+w%-6l-wF +u 1g 33+w@-6m-wG +u 1g 33+x0-6n-wH +u 1g 33+x1-7J-wI +u 1g 34-1M+6b-x2-kA +u 1g 34+x2+6c-x3-kB +u 1g 34+x3+6d-x4-kC +u 1g 34+x4+6e-x5-kD +u 1g 34+x5+6f-x6-kE +u 1g 34+x6+6g-x7-kF +u 1g 34+x7+6h-x8-kG +u 1g 33-wX+kV+x2 +u 1g 33-wY+kW+x3 +u 1g 33-wZ+kX+x4 +u 1g 33-w%+kY+x5 +u 1g 33-w@+kZ+x6 +u 1g 33-x0+k%+x7 +u 1g 33-x1+k@+x8 +u 1g 34+K+kf-x9-aK +u 1g 34+x9+kg-xa-aL +u 1g 34+xa+kh-xb-aM +u 1g 34+xb+ki-xc-aN +u 1g 34+xc+kj-xd-aO +u 1g 34+xd+kk-xe-aP +u 1g 34+xe+kl-xf-aQ +u 1g 34+1Y+bh-xg-kf +u 1g 34+xg+bi-xh-kg +u 1g 34+xh+bj-xi-kh +u 1g 34+xi+bk-xj-ki +u 1g 34+xj+bl-xk-kj +u 1g 34+xk+bm-xl-kk +u 1g 34+xl+bn-xm-kl +u 1g 33+x9+xg-bo +u 1g 33+xa+xh-bp +u 1g 33+xb+xi-bq +u 1g 33+xc+xj-br +u 1g 33+xd+xk-bs +u 1g 33+xe+xl-bt +u 1g 33+xf+xm-bu +u 1g 34+1@+lU-xn-kf +u 1g 34+xn+lV-xo-kg +u 1g 34+xo+lW-xp-kh +u 1g 34+xp+lX-xq-ki +u 1g 34+xq+lY-xr-kj +u 1g 34+xr+lZ-xs-kk +u 1g 34+xs+l%-xt-kl +u 1g 33-xn-x9+md +u 1g 33-xo-xa+me +u 1g 33-xp-xb+mf +u 1g 33-xq-xc+mg +u 1g 33-xr-xd+mh +u 1g 33-xs-xe+mi +u 1g 33-xt-xf+mj +u 1g 34+1X+bh-xu-8% +u 1g 34+xu+bi-xv-8@ +u 1g 34+xv+bj-xw-90 +u 1g 34+xw+bk-xx-91 +u 1g 34+xx+bl-xy-92 +u 1g 34+xy+bm-xz-93 +u 1g 34+xz+bn-xA-94 +u 1g 33+km+xu-xg +u 1g 33+kn+xv-xh +u 1g 33+ko+xw-xi +u 1g 33+kp+xx-xj +u 1g 33+kq+xy-xk +u 1g 33+kr+xz-xl +u 1g 33+ks+xA-xm +u 1g 34+2Y+kA-xB-lU +u 1g 34+xB+kB-xC-lV +u 1g 34+xC+kC-xD-lW +u 1g 34+xD+kD-xE-lX +u 1g 34+xE+kE-xF-lY +u 1g 34+xF+kF-xG-lZ +u 1g 34+xG+kG-xH-l% +u 1g 33+xn+xB-kH +u 1g 33+xo+xC-kI +u 1g 33+xp+xD-kJ +u 1g 33+xq+xE-kK +u 1g 33+xr+xF-kL +u 1g 33+xs+xG-kM +u 1g 33+xt+xH-kN +u 1g 34-L+6v-xI-lG +u 1g 34+xI+6w-xJ-lH +u 1g 34+xJ+6x-xK-lI +u 1g 34+xK+6y-xL-lJ +u 1g 34+xL+6z-xM-lK +u 1g 34+xM+6A-xN-lL +u 1g 34+xN+6B-xO-lM +u 1g 34-M+6o-xP-lG +u 1g 34+xP+6p-xQ-lH +u 1g 34+xQ+6q-xR-lI +u 1g 34+xR+6r-xS-lJ +u 1g 34+xS+6s-xT-lK +u 1g 34+xT+6t-xU-lL +u 1g 34+xU+6u-xV-lM +u 1g 33+xI-6C-xP +u 1g 33+xJ-6D-xQ +u 1g 33+xK-6E-xR +u 1g 33+xL-6F-xS +u 1g 33+xM-6G-xT +u 1g 33+xN-6H-xU +u 1g 33+xO-7P-xV +u 1g 34-2W+6v-xW-mk +u 1g 34+xW+6w-xX-ml +u 1g 34+xX+6x-xY-mm +u 1g 34+xY+6y-xZ-mn +u 1g 34+xZ+6z-x%-mo +u 1g 34+x%+6A-x@-mp +u 1g 34+x@+6B-y0-mq +u 1g 33-xI+mF+xW +u 1g 33-xJ+mG+xX +u 1g 33-xK+mH+xY +u 1g 33-xL+mI+xZ +u 1g 33-xM+mJ+x% +u 1g 33-xN+mK+x@ +u 1g 33-xO+mL+y0 +u 1g 34-3t+kA-y1-lG +u 1g 34+y1+kB-y2-lH +u 1g 34+y2+kC-y3-lI +u 1g 34+y3+kD-y4-lJ +u 1g 34+y4+kE-y5-lK +u 1g 34+y5+kF-y6-lL +u 1g 34+y6+kG-y7-lM +u 1g 33-xB-l@+y1 +u 1g 33-xC-m0+y2 +u 1g 33-xD-m1+y3 +u 1g 33-xE-m2+y4 +u 1g 33-xF-m3+y5 +u 1g 33-xG-m4+y6 +u 1g 33-xH-m5+y7 +u 1g 34-1O+6o-y8-kA +u 1g 34+y8+6p-y9-kB +u 1g 34+y9+6q-ya-kC +u 1g 34+ya+6r-yb-kD +u 1g 34+yb+6s-yc-kE +u 1g 34+yc+6t-yd-kF +u 1g 34+yd+6u-ye-kG +u 1g 33+xP-y8-y1 +u 1g 33+xQ-y9-y2 +u 1g 33+xR-ya-y3 +u 1g 33+xS-yb-y4 +u 1g 33+xT-yc-y5 +u 1g 33+xU-yd-y6 +u 1g 33+xV-ye-y7 +u 1g 34-P+4i-yf-mM +u 1g 34+yf+4j-yg-mN +u 1g 34+yg+4k-yh-mO +u 1g 34+yh+4l-yi-mP +u 1g 34+yi+4m-yj-mQ +u 1g 34+yj+4n-yk-mR +u 1g 34+yk+4o-yl-mS +u 1g 34-O+4b-ym-mM +u 1g 34+ym+4c-yn-mN +u 1g 34+yn+4d-yo-mO +u 1g 34+yo+4e-yp-mP +u 1g 34+yp+4f-yq-mQ +u 1g 34+yq+4g-yr-mR +u 1g 34+yr+4h-ys-mS +u 1g 33+4p-yf+ym +u 1g 33+4q-yg+yn +u 1g 33+4r-yh+yo +u 1g 33+4s-yi+yp +u 1g 33+4t-yj+yq +u 1g 33+4u-yk+yr +u 1g 33+5C-yl+ys +u 1g 34-1l+4i-yt-ob +u 1g 34+yt+4j-yu-oc +u 1g 34+yu+4k-yv-od +u 1g 34+yv+4l-yw-oe +u 1g 34+yw+4m-yx-of +u 1g 34+yx+4n-yy-og +u 1g 34+yy+4o-yz-oh +u 1g 33-ow+yf-yt +u 1g 33-ox+yg-yu +u 1g 33-oy+yh-yv +u 1g 33-oz+yi-yw +u 1g 33-oA+yj-yx +u 1g 33-oB+yk-yy +u 1g 33-oC+yl-yz +u 1g 34+24+gS-yA-mM +u 1g 34+yA+gT-yB-mN +u 1g 34+yB+gU-yC-mO +u 1g 34+yC+gV-yD-mP +u 1g 34+yD+gW-yE-mQ +u 1g 34+yE+gX-yF-mR +u 1g 34+yF+gY-yG-mS +u 1g 33+mT+gZ-yA +u 1g 33+mU+g%-yB +u 1g 33+mV+g@-yC +u 1g 33+mW+h0-yD +u 1g 33+mX+h1-yE +u 1g 33+mY+h2-yF +u 1g 33+mZ+h3-yG +u 1g 34-28+4b-yH-gS +u 1g 34+yH+4c-yI-gT +u 1g 34+yI+4d-yJ-gU +u 1g 34+yJ+4e-yK-gV +u 1g 34+yK+4f-yL-gW +u 1g 34+yL+4g-yM-gX +u 1g 34+yM+4h-yN-gY +u 1g 33-ym+yA+yH +u 1g 33-yn+yB+yI +u 1g 33-yo+yC+yJ +u 1g 33-yp+yD+yK +u 1g 33-yq+yE+yL +u 1g 33-yr+yF+yM +u 1g 33-ys+yG+yN +u 1g 34+2D+bJ-yO-nj +u 1g 34+yO+bK-yP-nk +u 1g 34+yP+bL-yQ-nl +u 1g 34+yQ+bM-yR-nm +u 1g 34+yR+bN-yS-nn +u 1g 34+yS+bO-yT-no +u 1g 34+yT+bP-yU-np +u 1g 33+nq+yO-bQ +u 1g 33+nr+yP-bR +u 1g 33+ns+yQ-bS +u 1g 33+nt+yR-bT +u 1g 33+nu+yS-bU +u 1g 33+nv+yT-bV +u 1g 33+nw+yU-bW +u 1g 34+31+hR-yV-nL +u 1g 34+yV+hS-yW-nM +u 1g 34+yW+hT-yX-nN +u 1g 34+yX+hU-yY-nO +u 1g 34+yY+hV-yZ-nP +u 1g 34+yZ+hW-y%-nQ +u 1g 34+y%+hX-y@-nR +u 1g 33+nS+yV-hY +u 1g 33+nT+yW-hZ +u 1g 33+nU+yX-h% +u 1g 33+nV+yY-h@ +u 1g 33+nW+yZ-i0 +u 1g 33+nX+y%-i1 +u 1g 33+nY+y@-i2 +u 1g 33-oY-xu+9Z +u 1g 33-oZ-xv+9% +u 1g 33-o%-xw+9@ +u 1g 33-o@-xx+a0 +u 1g 33-p0-xy+a1 +u 1g 33-p1-xz+a2 +u 1g 33-p2-xA+a3 +u 1g 33-jn-po+df +u 1g 33-jo-pp+dg +u 1g 33-jp-pq+dh +u 1g 33-jq-pr+di +u 1g 33-jr-ps+dj +u 1g 33-js-pt+dk +u 1g 33-jt-pu+dl +u 1g 33+pJ+vb-tM +u 1g 33+pK+vc-tN +u 1g 33+pL+vd-tO +u 1g 33+pM+ve-tP +u 1g 33+pN+vf-tQ +u 1g 33+pO+vg-tR +u 1g 33+pP+vh-tS +u 1g 34-17+6P-z0-pX +u 1g 34+z0+6Q-z1-pY +u 1g 34+z1+6R-z2-pZ +u 1g 34+z2+6S-z3-p% +u 1g 34+z3+6T-z4-p@ +u 1g 34+z4+6U-z5-q0 +u 1g 34+z5+6V-z6-q1 +u 1g 34-16+6I-z7-pX +u 1g 34+z7+6J-z8-pY +u 1g 34+z8+6K-z9-pZ +u 1g 34+z9+6L-za-p% +u 1g 34+za+6M-zb-p@ +u 1g 34+zb+6N-zc-q0 +u 1g 34+zc+6O-zd-q1 +u 1g 33+z0-6W-z7 +u 1g 33+z1-6X-z8 +u 1g 33+z2-6Y-z9 +u 1g 33+z3-6Z-za +u 1g 33+z4-6%-zb +u 1g 33+z5-6@-zc +u 1g 33+z6-7U-zd +u 1g 34-2j+6P-ze-q2 +u 1g 34+ze+6Q-zf-q3 +u 1g 34+zf+6R-zg-q4 +u 1g 34+zg+6S-zh-q5 +u 1g 34+zh+6T-zi-q6 +u 1g 34+zi+6U-zj-q7 +u 1g 34+zj+6V-zk-q8 +u 1g 33-z0+q9+ze +u 1g 33-z1+qa+zf +u 1g 33-z2+qb+zg +u 1g 33-z3+qc+zh +u 1g 33-z4+qd+zi +u 1g 33-z5+qe+zj +u 1g 33-z6+qf+zk +u 1g 34+2Q+uE-zl-pX +u 1g 34+zl+uF-zm-pY +u 1g 34+zm+uG-zn-pZ +u 1g 34+zn+uH-zo-p% +u 1g 34+zo+uI-zp-p@ +u 1g 34+zp+uJ-zq-q0 +u 1g 34+zq+uK-zr-q1 +u 1g 34-2P+6I-zs-uE +u 1g 34+zs+6J-zt-uF +u 1g 34+zt+6K-zu-uG +u 1g 34+zu+6L-zv-uH +u 1g 34+zv+6M-zw-uI +u 1g 34+zw+6N-zx-uJ +u 1g 34+zx+6O-zy-uK +u 1g 33-zl+z7-zs +u 1g 33-zm+z8-zt +u 1g 33-zn+z9-zu +u 1g 33-zo+za-zv +u 1g 33-zp+zb-zw +u 1g 33-zq+zc-zx +u 1g 33-zr+zd-zy +u 1g 33+zl-v4-qB +u 1g 33+zm-v5-qC +u 1g 33+zn-v6-qD +u 1g 33+zo-v7-qE +u 1g 33+zp-v8-qF +u 1g 33+zq-v9-qG +u 1g 33+zr-va-qH +u 1g 34-1a+4C-zz-qP +u 1g 34+zz+4D-zA-qQ +u 1g 34+zA+4E-zB-qR +u 1g 34+zB+4F-zC-qS +u 1g 34+zC+4G-zD-qT +u 1g 34+zD+4H-zE-qU +u 1g 34+zE+4I-zF-qV +u 1g 34-19+4v-zG-qP +u 1g 34+zG+4w-zH-qQ +u 1g 34+zH+4x-zI-qR +u 1g 34+zI+4y-zJ-qS +u 1g 34+zJ+4z-zK-qT +u 1g 34+zK+4A-zL-qU +u 1g 34+zL+4B-zM-qV +u 1g 33+4J-zz+zG +u 1g 33+4K-zA+zH +u 1g 33+4L-zB+zI +u 1g 33+4M-zC+zJ +u 1g 33+4N-zD+zK +u 1g 33+4O-zE+zL +u 1g 33+5H-zF+zM +u 1g 34-2K+4v-zN-s0 +u 1g 34+zN+4w-zO-s1 +u 1g 34+zO+4x-zP-s2 +u 1g 34+zP+4y-zQ-s3 +u 1g 34+zQ+4z-zR-s4 +u 1g 34+zR+4A-zS-s5 +u 1g 34+zS+4B-zT-s6 +u 1g 33-zG+sl+zN +u 1g 33-zH+sm+zO +u 1g 33-zI+sn+zP +u 1g 33-zJ+so+zQ +u 1g 33-zK+sp+zR +u 1g 33-zL+sq+zS +u 1g 33-zM+sr+zT +u 1g 34+3c+vR-zU-qP +u 1g 34+zU+vS-zV-qQ +u 1g 34+zV+vT-zW-qR +u 1g 34+zW+vU-zX-qS +u 1g 34+zX+vV-zY-qT +u 1g 34+zY+vW-zZ-qU +u 1g 34+zZ+vX-z%-qV +u 1g 34-39+4C-z@-vR +u 1g 34+z@+4D-A0-vS +u 1g 34+A0+4E-A1-vT +u 1g 34+A1+4F-A2-vU +u 1g 34+A2+4G-A3-vV +u 1g 34+A3+4H-A4-vW +u 1g 34+A4+4I-A5-vX +u 1g 33-zU+zz-z@ +u 1g 33-zV+zA-A0 +u 1g 33-zW+zB-A1 +u 1g 33-zX+zC-A2 +u 1g 33-zY+zD-A3 +u 1g 33-zZ+zE-A4 +u 1g 33-z%+zF-A5 +u 1g 34+3d+vR-A6-r1 +u 1g 34+A6+vS-A7-r2 +u 1g 34+A7+vT-A8-r3 +u 1g 34+A8+vU-A9-r4 +u 1g 34+A9+vV-Aa-r5 +u 1g 34+Aa+vW-Ab-r6 +u 1g 34+Ab+vX-Ac-r7 +u 1g 33-A6-r8+zU +u 1g 33-A7-r9+zV +u 1g 33-A8-ra+zW +u 1g 33-A9-rb+zX +u 1g 33-Aa-rc+zY +u 1g 33-Ab-rd+zZ +u 1g 33-Ac-re+z% +u 1g 34+1k+gc-Ad-cP +u 1g 34+Ad+gd-Ae-cQ +u 1g 34+Ae+ge-Af-cR +u 1g 34+Af+gf-Ag-cS +u 1g 34+Ag+gg-Ah-cT +u 1g 34+Ah+gh-Ai-cU +u 1g 34+Ai+gi-Aj-cV +u 1g 33+Ad+hp-dO +u 1g 33+Ae+hq-dP +u 1g 33+Af+hr-dQ +u 1g 33+Ag+hs-dR +u 1g 33+Ah+ht-dS +u 1g 33+Ai+hu-dT +u 1g 33+Aj+hv-dU +u 1g 34+2u+r1-Ak-gc +u 1g 34+Ak+r2-Al-gd +u 1g 34+Al+r3-Am-ge +u 1g 34+Am+r4-An-gf +u 1g 34+An+r5-Ao-gg +u 1g 34+Ao+r6-Ap-gh +u 1g 34+Ap+r7-Aq-gi +u 1g 34-3q+r1-Ar-cP +u 1g 34+Ar+r2-As-cQ +u 1g 34+As+r3-At-cR +u 1g 34+At+r4-Au-cS +u 1g 34+Au+r5-Av-cT +u 1g 34+Av+r6-Aw-cU +u 1g 34+Aw+r7-Ax-cV +u 1g 33-Ak-Ad+Ar +u 1g 33-Al-Ae+As +u 1g 33-Am-Af+At +u 1g 33-An-Ag+Au +u 1g 33-Ao-Ah+Av +u 1g 33-Ap-Ai+Aw +u 1g 33-Aq-Aj+Ax +u 1g 33-Ar+tF+rV +u 1g 33-As+tG+rW +u 1g 33-At+tH+rX +u 1g 33-Au+tI+rY +u 1g 33-Av+tJ+rZ +u 1g 33-Aw+tK+r% +u 1g 33-Ax+tL+r@ +u 1g 33+Ak+A6-wa +u 1g 33+Al+A7-wb +u 1g 33+Am+A8-wc +u 1g 33+An+A9-wd +u 1g 33+Ao+Aa-we +u 1g 33+Ap+Ab-wf +u 1g 33+Aq+Ac-wg +u 1g 34-1m+4P-Ay-ob +u 1g 34+Ay+4Q-Az-oc +u 1g 34+Az+4R-AA-od +u 1g 34+AA+4S-AB-oe +u 1g 34+AB+4T-AC-of +u 1g 34+AC+4U-AD-og +u 1g 34+AD+4V-AE-oh +u 1g 33-4W-Ay+yt +u 1g 33-4X-Az+yu +u 1g 33-4Y-AA+yv +u 1g 33-4Z-AB+yw +u 1g 33-4%-AC+yx +u 1g 33-4@-AD+yy +u 1g 33-5K-AE+yz +u 1g 34-1z+4P-AF-sN +u 1g 34+AF+4Q-AG-sO +u 1g 34+AG+4R-AH-sP +u 1g 34+AH+4S-AI-sQ +u 1g 34+AI+4T-AJ-sR +u 1g 34+AJ+4U-AK-sS +u 1g 34+AK+4V-AL-sT +u 1g 33-sU+Ay-AF +u 1g 33-sV+Az-AG +u 1g 33-sW+AA-AH +u 1g 33-sX+AB-AI +u 1g 33-sY+AC-AJ +u 1g 33-sZ+AD-AK +u 1g 33-s%+AE-AL +u 1g 34+2F+bJ-AM-eG +u 1g 34+AM+bK-AN-eH +u 1g 34+AN+bL-AO-eI +u 1g 34+AO+bM-AP-eJ +u 1g 34+AP+bN-AQ-eK +u 1g 34+AQ+bO-AR-eL +u 1g 34+AR+bP-AS-eM +u 1g 33+AM-yO+ty +u 1g 33+AN-yP+tz +u 1g 33+AO-yQ+tA +u 1g 33+AP-yR+tB +u 1g 33+AQ-yS+tC +u 1g 33+AR-yT+tD +u 1g 33+AS-yU+tE +u 1g 34+2H+bJ-AT-eU +u 1g 34+AT+bK-AU-eV +u 1g 34+AU+bL-AV-eW +u 1g 34+AV+bM-AW-eX +u 1g 34+AW+bN-AX-eY +u 1g 34+AX+bO-AY-eZ +u 1g 34+AY+bP-AZ-e% +u 1g 33-AM+f6+AT +u 1g 33-AN+f7+AU +u 1g 33-AO+f8+AV +u 1g 33-AP+f9+AW +u 1g 33-AQ+fa+AX +u 1g 33-AR+fb+AY +u 1g 33-AS+fc+AZ +u 1g 34-1y+50-A%-sN +u 1g 34+A%+51-A@-sO +u 1g 34+A@+52-B0-sP +u 1g 34+B0+53-B1-sQ +u 1g 34+B1+54-B2-sR +u 1g 34+B2+55-B3-sS +u 1g 34+B3+56-B4-sT +u 1g 33+57-A%+AF +u 1g 33+58-A@+AG +u 1g 33+59-B0+AH +u 1g 33+5a-B1+AI +u 1g 33+5b-B2+AJ +u 1g 33+5c-B3+AK +u 1g 33+5N-B4+AL +u 1g 34+2J+s0-B5-sN +u 1g 34+B5+s1-B6-sO +u 1g 34+B6+s2-B7-sP +u 1g 34+B7+s3-B8-sQ +u 1g 34+B8+s4-B9-sR +u 1g 34+B9+s5-Ba-sS +u 1g 34+Ba+s6-Bb-sT +u 1g 34-2I+50-Bc-s0 +u 1g 34+Bc+51-Bd-s1 +u 1g 34+Bd+52-Be-s2 +u 1g 34+Be+53-Bf-s3 +u 1g 34+Bf+54-Bg-s4 +u 1g 34+Bg+55-Bh-s5 +u 1g 34+Bh+56-Bi-s6 +u 1g 33-B5+A%-Bc +u 1g 33-B6+A@-Bd +u 1g 33-B7+B0-Be +u 1g 33-B8+B1-Bf +u 1g 33-B9+B2-Bg +u 1g 33-Ba+B3-Bh +u 1g 33-Bb+B4-Bi +u 1g 33+B5+s7-tr +u 1g 33+B6+s8-ts +u 1g 33+B7+s9-tt +u 1g 33+B8+sa-tu +u 1g 33+B9+sb-tv +u 1g 33+Ba+sc-tw +u 1g 33+Bb+sd-tx +u 1g 34-1B+77-Bj-t% +u 1g 34+Bj+78-Bk-t@ +u 1g 34+Bk+79-Bl-u0 +u 1g 34+Bl+7a-Bm-u1 +u 1g 34+Bm+7b-Bn-u2 +u 1g 34+Bn+7c-Bo-u3 +u 1g 34+Bo+7d-Bp-u4 +u 1g 34-1A+70-Bq-t% +u 1g 34+Bq+71-Br-t@ +u 1g 34+Br+72-Bs-u0 +u 1g 34+Bs+73-Bt-u1 +u 1g 34+Bt+74-Bu-u2 +u 1g 34+Bu+75-Bv-u3 +u 1g 34+Bv+76-Bw-u4 +u 1g 33+Bj-7e-Bq +u 1g 33+Bk-7f-Br +u 1g 33+Bl-7g-Bs +u 1g 33+Bm-7h-Bt +u 1g 33+Bn-7i-Bu +u 1g 33+Bo-7j-Bv +u 1g 33+Bp-7%-Bw +u 1g 34-2M+77-Bx-uE +u 1g 34+Bx+78-By-uF +u 1g 34+By+79-Bz-uG +u 1g 34+Bz+7a-BA-uH +u 1g 34+BA+7b-BB-uI +u 1g 34+BB+7c-BC-uJ +u 1g 34+BC+7d-BD-uK +u 1g 33-Bj+uL+Bx +u 1g 33-Bk+uM+By +u 1g 33-Bl+uN+Bz +u 1g 33-Bm+uO+BA +u 1g 33-Bn+uP+BB +u 1g 33-Bo+uQ+BC +u 1g 33-Bp+uR+BD +u 1g 34+2T+mk-BE-t% +u 1g 34+BE+ml-BF-t@ +u 1g 34+BF+mm-BG-u0 +u 1g 34+BG+mn-BH-u1 +u 1g 34+BH+mo-BI-u2 +u 1g 34+BI+mp-BJ-u3 +u 1g 34+BJ+mq-BK-u4 +u 1g 34-2S+70-BL-mk +u 1g 34+BL+71-BM-ml +u 1g 34+BM+72-BN-mm +u 1g 34+BN+73-BO-mn +u 1g 34+BO+74-BP-mo +u 1g 34+BP+75-BQ-mp +u 1g 34+BQ+76-BR-mq +u 1g 33-BE+Bq-BL +u 1g 33-BF+Br-BM +u 1g 33-BG+Bs-BN +u 1g 33-BH+Bt-BO +u 1g 33-BI+Bu-BP +u 1g 33-BJ+Bv-BQ +u 1g 33-BK+Bw-BR +u 1g 33-mr-uc+BE +u 1g 33-ms-ud+BF +u 1g 33-mt-ue+BG +u 1g 33-mu-uf+BH +u 1g 33-mv-ug+BI +u 1g 33-mw-uh+BJ +u 1g 33-mx-ui+BK +u 1g 34+1R+aR-BS-eU +u 1g 34+BS+aS-BT-eV +u 1g 34+BT+aT-BU-eW +u 1g 34+BU+aU-BV-eX +u 1g 34+BV+aV-BW-eY +u 1g 34+BW+aW-BX-eZ +u 1g 34+BX+aX-BY-e% +u 1g 33-BS-uq+l7 +u 1g 33-BT-ur+l8 +u 1g 33-BU-us+l9 +u 1g 33-BV-ut+la +u 1g 33-BW-uu+lb +u 1g 33-BX-uv+lc +u 1g 33-BY-uw+ld +u 1g 33+BS+c2-AT +u 1g 33+BT+c3-AU +u 1g 33+BU+c4-AV +u 1g 33+BV+c5-AW +u 1g 33+BW+c6-AX +u 1g 33+BX+c7-AY +u 1g 33+BY+c8-AZ +u 1g 33+wh-yV-p3 +u 1g 33+wi-yW-p4 +u 1g 33+wj-yX-p5 +u 1g 33+wk-yY-p6 +u 1g 33+wl-yZ-p7 +u 1g 33+wm-y%-p8 +u 1g 33+wn-y@-p9 +u 1g 33-5d-yH+vK +u 1g 33-5e-yI+vL +u 1g 33-5f-yJ+vM +u 1g 33-5g-yK+vN +u 1g 33-5h-yL+vO +u 1g 33-5i-yM+vP +u 1g 33-5A-yN+vQ +u 1g 33+wQ-7q-ze +u 1g 33+wR-7r-zf +u 1g 33+wS-7s-zg +u 1g 33+wT-7t-zh +u 1g 33+wU-7u-zi +u 1g 33+wV-7v-zj +u 1g 33+wW-7T-zk +u 1g 33-5j-zN+Bc +u 1g 33-5k-zO+Bd +u 1g 33-5l-zP+Be +u 1g 33-5m-zQ+Bf +u 1g 33-5n-zR+Bg +u 1g 33-5o-zS+Bh +u 1g 33-5M-zT+Bi +u 1g 33+zs+7w-Bx +u 1g 33+zt+7x-By +u 1g 33+zu+7y-Bz +u 1g 33+zv+7z-BA +u 1g 33+zw+7A-BB +u 1g 33+zx+7B-BC +u 1g 33+zy+7Z-BD +u 1g 33+BL+7C-xW +u 1g 33+BM+7D-xX +u 1g 33+BN+7E-xY +u 1g 33+BO+7F-xZ +u 1g 33+BP+7G-x% +u 1g 33+BQ+7H-x@ +u 1g 33+BR+7X-y0 +u 1g 33+y8+7k-x2 +u 1g 33+y9+7l-x3 +u 1g 33+ya+7m-x4 +u 1g 33+yb+7n-x5 +u 1g 33+yc+7o-x6 +u 1g 33+yd+7p-x7 +u 1g 33+ye+7N-x8 +u 1g 33+5p-w3+z@ +u 1g 33+5q-w4+A0 +u 1g 33+5r-w5+A1 +u 1g 33+5s-w6+A2 +u 1g 33+5t-w7+A3 +u 1g 33+5u-w8+A4 +u 1g 33+5G-w9+A5 +u 0 33+7S+B%+z6 +u 0 33-7Q-zd-B% +u 0 33+7Q+BZ+zy +u 0 33-7Y-BD-BZ +u 0 33-zr-B%+BZ +u 0 33+Bp+7Y-B@ +u 0 33-Bw+B@-7W +u 0 33+BZ-uR+B@ +u 0 33+7I+C1+wu +u 0 33-7K-wB-C1 +u 0 33+7K+C2+wW +u 0 33-7R-zk-C2 +u 0 33+7I+C0+wI +u 0 33+C1+jV-C0 +u 0 33+C1+wP-C2 +u 0 33-7M-xV-C4 +u 0 33+7O+C4+xO +u 0 33-7O-y0-C5 +u 0 33+7V+C5+BR +u 0 33-7M-ye-C6 +u 0 33-C4+C6-y7 +u 0 33+mL-C5+C4 +u 0 33-bg-C3+BY +u 0 33+c1-AZ+C3 +u 0 33+5P+C6+x8 +u 0 33+C0+x1+5O +u 0 33-Bb+C8-C7 +u 0 33+B4+5L-C8 +u 0 33-Bi+C7-5L +u 0 33+5D+Ca+zM +u 0 33-5F-zF-Ca +u 0 33-5D-zT+C7 +u 0 33+AL+5J-C8 +u 0 33+Ca+sr+C7 +u 0 33-vJ+Cb-5x +u 0 33+w2+Cc-Cb +u 0 33+w9+5x-Cc +u 0 33-z%+Cd-Cc +u 0 33+zF+5E-Cd +u 0 33-A5+Cc-5E +u 0 33-Cb+ho-Ce +u 0 33-5v-vC+Cb +u 0 33-Cd-Ca-3F +u 0 33+Cb-3B-vv +u 0 33-AE-C9-5I +u 0 33+yz+5B+C9 +u 0 33-3E+Cf+C8 +u 0 33+C9+s%-Cf +u 0 33+5B+Cg+yl +u 0 33+C9-oC-Cg +u 0 33+5z+Cg+ys +u 0 33+Cf+AL+5I +u 0 33-vQ-Ce-3B +u 0 33-Ci+Ch-C6 +u 0 33+Cj-x8-Ch +u 0 33+5P-Ci+Cj +u 0 33+Ck+k@-Ch +u 0 33-x1-Ck+Cj +u 0 33-Cp+Cm-Co +u 0 33+Cq-5S+Cn +u 0 33-Cq+Co-BZ +u 0 33+Cr+BZ-Cm +u 0 33-Cr-Cl+5R +u 0 33-Cp+Cr-Cq +u 0 33+Cu-Cs+uR +u 0 33-Cu-Co+Cv +u 0 33-Cv-Cn-Ct +u 0 33+Cx+uR-Cm +u 0 33+Cw-Cu-Cm +u 0 33+Cw-Cs-Cx +u 0 33+Cw-Cv-Cp +u 0 33+CA+Cz-BK +u 0 33-CA+Cs+CB +u 0 33-CB+Ct+Cy +u 0 33+CC+C5-Cz +u 0 33-CC-Cy+5Q +u 0 33+CG+CH+CF +u 0 33+CJ+5Q-CF +u 0 33-CJ-CE-C0 +u 0 33+CD-CG-CC +u 0 33+CI+CJ+Cy +u 0 33+CI+CF-CC +u 0 33+CI-CH-CD +u 0 33+CK+Ck+CE +u 0 33+CK+Ci-CF +u 0 33+CN+Co-zr +u 0 33-CN-CM+CO +u 0 33-CO-CL+Cn +u 0 33+CP-5S+CL +u 0 33-CP+CM-B% +u 0 33+CN+Cq+B% +u 0 33-CO+CP-Cq +u 0 33+CQ-qf-CM +u 0 33-CQ-CL+C2 +u 0 33+CR+CS-Cn +u 0 33-CV+C0-CU +u 0 33+CV+CW-CL +u 0 33-CW-CT-CM +u 0 33-CX+CT+CY +u 0 33+CZ-CL+CR +u 0 33+CR-CY-CV +u 0 33+CS-CN+CX +u 0 33+CZ+CM+CX +u 0 33+CZ+CO-CS +u 0 33+CZ-CW+CY +u 0 33-C%-Ct+C@ +u 0 33-C@-Cs+Dk +u 0 33-Cu+Dj-C@ +u 0 33+Dr-CR+C% +u 0 33-D2-qf+CT +u 0 33+D2+D3-D0 +u 0 33-D3+CU-D1 +u 0 33+D5+C2+D0 +u 0 33-D5+D1-C0 +u 0 33+D2+CW+CQ +u 0 33+D3+D5+CV +u 0 33+D4+CQ+D0 +u 0 33+D4-CL-D5 +u 0 33+D4-CW+D3 +u 0 33+D7-N4-Cz +u 0 33+D7-Dk+CA +u 0 33+D7-C%+Cy +u 0 33+D7-C@+CB +u 0 33+D7+D6-CD +u 0 33+D8+jV-D1 +u 0 33-D8-D0-wP +u 0 33+C1-D8+D5 +u 0 33-Dd-uR+D9 +u 0 33+Dd+De-Db +u 0 33-De+Da-Dc +u 0 33+Dh-D9-ub +u 0 33-Dh+Df+Di +u 0 33-Di+Dg-Da +u 0 33+Dd-Dh+uY +u 0 33+Dk-Dj-uR +u 0 33-Dq-Dj+Db +u 0 33+Dm-D9+Dk +u 0 33+Dm-Dd+Dj +u 0 33+Dm+De-Dq +u 0 33-B@-Cx+Cr +u 0 33-Dc+Ds+Dg +u 0 33+Dt+zr+Db +u 0 33-Dt+Dc+qm +u 0 33+Dv+Dw+Do +u 0 33-Dw+Du+Dn +u 0 33-Dx+zr+Dj +u 0 33-Dp-Dw-Dy +u 0 33-Dq-Dx-Dt +u 0 33+Dz+Du-k@ +u 0 33-Dz-CU+DA +u 0 33+Dx+Dr-CX +u 0 33+DD+C6-DC +u 0 33-DD-DB-C5 +u 0 33+DE+y7-DC +u 0 33-DE-DB-mL +u 0 33-C4-DD+DE +u 0 33+DF+DG+DC +u 0 33+DG+DD+CG +u 0 33+DJ-jf+DH +u 0 33-DJ+DI+pB +u 0 33+DK-qt-DI +u 0 33-DK-DH+wP +u 0 33-qA-DJ+DK +u 0 33-DM-Dg+DN +u 0 33-DN-Df+DL +u 0 33+DO-v3+DL +u 0 33+DP-pW-Dg +u 0 33-DP-Df+v3 +u 0 33+DM+DO-pW +u 0 33-DN+DP-DO +u 0 33-DT+DQ+DU +u 0 33-DU+DR-DS +u 0 33-DM+DT-DV +u 0 33+DW-DQ+DM +u 0 33+DW+DU-DV +u 0 33+DY+DZ+DR +u 0 33-DZ-DX+DQ +u 0 33+D%-DX+DT +u 0 33+D%-DY-DS +u 0 33+D%+DZ+DU +u 0 33-E1+E0-DI +u 0 33+E2-jm+D@ +u 0 33-E2+E0+pB +u 0 33+E1+DJ-E2 +u 0 33+E9-Ea+E3 +u 0 33-Ds-N5-DP +u 0 33+Ed-CT-qm +u 0 33-Ed-Ec+Ee +u 0 33-Ee-Eb-CU +u 0 33-Ef+D1+Eb +u 0 33-D3-Ee-Ef +u 0 33+D2-Ed+qt +u 0 33-Eg+k@+Dn +u 0 33+Eg+Eh-Eb +u 0 33-Eh+Do-Ec +u 0 33-Ed+Dv-DA +u 0 33+Ei+Do+Ed +u 0 33+Ei-Eg-CU +u 0 33+Dw-Eg+Dz +u 0 33+Ei+Eh+Ee +u 0 33+Ei-Dw-DA +u 0 33+Ej-Eb-jV +u 0 33-Ej+DH+Ek +u 0 33-Ek+DI-Ec +u 0 33+Ef-Ej-D8 +u 0 33+El+D8+DH +u 0 33+El-D0-DK +u 0 33+El+Ef-Ek +u 0 33-En-Em-Da +u 0 33-Eo+Df+Ep +u 0 33-Ep+Dg+Em +u 0 33+Di-En-Ep +u 0 33+Dh-En-Eo +u 0 33-Eq-DQ-Da +u 0 33-Er-Em+DQ +u 0 33+En-Eq-Er +u 0 33-Et-DX-Da +u 0 33-Eu-D9-Es +u 0 33+Ev+Et+Eu +u 0 33-Et+DZ+Eq +u 0 33-Ev+Ew+DY +u 0 33-Ex+Dn+Ey +u 0 33-Ey+Do+DX +u 0 33+EA+Ez+Ev +u 0 33-EB+k0+Eb +u 0 33+EB+EC-D@ +u 0 33-EC+Ec-E0 +u 0 33-Ek-E1-EC +u 0 33-Ej-j1+EB +u 0 33-ED+E4-k@ +u 0 33-E8-Ey+Ea +u 0 33+EE+EF-DB +u 0 33-EJ+DC-EH +u 0 33+EI+EF+EJ +u 0 33+EL-mc+EG +u 0 33-EL+EH-xH +u 0 33+EK-EG-Ew +u 0 33+EK+EI+Ez +u 0 33+EQ+uw+EN +u 0 33+EU-ES-vo +u 0 33-EU+EM+EV +u 0 33+EP-ET-EV +u 0 33+EY-v3+EW +u 0 33-EY+EX+pP +u 0 33+EZ-tS-EX +u 0 33-EZ-EW+vo +u 0 33-vh-EY+EZ +u 0 33+E%+E@+EX +u 0 33-E@-DL+EW +u 0 33-E%+pP-DO +u 0 33-E@+DO-EY +u 0 33-F5-F0-EX +u 0 33-F3-EW+EM +u 0 33+F5+F3+F4 +u 0 33-F4+EV-F2 +u 0 33+F6-EU+EW +u 0 33+F6-EV-F3 +u 0 33+F6-F2+F5 +u 0 33+F6-ES-EZ +u 0 33-F9-F7+EM +u 0 33+F8+Fa+lF +u 0 33+F9+ER-Fa +u 0 33-Fd-F0+Fb +u 0 33-Fh-F7+EW +u 0 33-Ff+EX+Fb +u 0 33+Fh+Ff+Fg +u 0 33+Fe-F8-F1 +u 0 33-Fd+F5+Ff +u 0 33-F9+Fh+F3 +u 0 33+Fe-Fg-Fd +u 0 33+Fe+F9+F4 +u 0 33+Fe+Fh-F5 +u 0 33-Fk-pu+Fb +u 0 33+Fk+Fl-Fi +u 0 33-Fl+Fc-Fj +u 0 33-Fn-DL+F7 +u 0 33+Fm-Fb+E% +u 0 33+E@-Fh-Fn +u 0 33+Fl-Fo-Fg +u 0 33+Fm-Ff-E@ +u 0 33+Fm+Fl+Fp +u 0 33+Fm+Fg-Fn +u 0 33+Fr+Fs-Fq +u 0 33-Fv+DS+Fq +u 0 33+Ft-Fr-DS +u 0 33+Ft+Fu+DV +u 0 33+Ft+Fs-Fv +u 0 33-Fw-E6+Fi +u 0 33-Fx+Fu+Fn +u 0 33+Fy+Fx+Fo +u 0 33+Fy+Fu-Fp +u 0 33+Fr+Fx+Fa +u 0 33+Fz+Fa+Fq +u 0 33+Fz-Fx+Fs +u 0 33-FB+E4-kU +u 0 33-k7-FB+ED +u 0 33+FE+bg+FC +u 0 33-FE+FD-bB +u 0 33+FF+bu-FD +u 0 33-FF-FC-b2 +u 0 33-b9-FE+FF +u 0 33+FG-BY+EN +u 0 33-FG+EO+b2 +u 0 33+ld-FG+EQ +u 0 33+FK-FJ-b2 +u 0 33-FK+FH+FL +u 0 33-FM-FD+FN +u 0 33-FN-FC+FJ +u 0 33+FP-xA-FI +u 0 33-FP-FH+bu +u 0 33+FK-FN+FF +u 0 33-FL+FP+FM +u 0 33+FO+FF+FH +u 0 33+FO+FD-FP +u 0 33+FO+FN-FL +u 0 33-FU-FQ+FS +u 0 33+FX-Mm+FW +u 0 33+FY-G1+9b +u 0 33-FY-FI+FZ +u 0 33-FZ-FH-FW +u 0 33-FK+FX+F@ +u 0 33-Mm-FY+F% +u 0 33+G2+ks-FI +u 0 33-G2-FH+xf +u 0 33+xm-FP+G2 +u 0 33+G5+FW+xf +u 0 33-G5-G4+G6 +u 0 33-G6-G3+G1 +u 0 33+G8-ks-G4 +u 0 33-G8-G3+9b +u 0 33+FY-G6+G8 +u 0 33-FZ+G2+G5 +u 0 33+G7+G8-FI +u 0 33+G7+G4-G2 +u 0 33+G7+G6-FZ +u 0 33-G9-F0+dl +u 0 33-Ge+FW-F1 +u 0 33+Hm-Fb+dl +u 0 33+No-G5-Fc +u 0 33+Fd-Hm-G9 +u 0 33+Gc-fS+Ga +u 0 33-Gc+Gb+tS +u 0 33+Gd-ES-Gc +u 0 33+Gf-FS-dl +u 0 33-Gf-Gb+Gg +u 0 33-Gg-Ga-FT +u 0 33+Gh-Gf+F0 +u 0 33+Gi+Ge+G9 +u 0 33+Gi-G1+jH +u 0 33-Gn-fS+Gj +u 0 33+Gn+Go-Gl +u 0 33-Go+Gk-Gm +u 0 33+Gp+g4+Gl +u 0 33-Gp+Gm+cH +u 0 33+Gq-cH-Gk +u 0 33-Gn-g4-Gq +u 0 33-Go+Gq-Gp +u 0 33-Gr-Ga+Gj +u 0 33+Gt-cO-Gm +u 0 33-Gt-Gl-tS +u 0 33+Gn-Gr+Gc +u 0 33+Gs+Gc+Gl +u 0 33+Gs+Gb-Gt +u 0 33+Gs+Gr+Go +u 0 33-Gw+ey+Gu +u 0 33+Gv+Gx+AZ +u 0 33-Gw+f5-Gx +u 0 33+GA-Gy+jH +u 0 33-GA+FS+GB +u 0 33-GB+FT-Gz +u 0 33+GD-FQ+GA +u 0 33+GD+FU+GB +u 0 33+GD+G0-GC +u 0 33+GI-GG+BY +u 0 33-GI+FC+GJ +u 0 33-GJ+FD-GH +u 0 33+GK-C3+GG +u 0 33-GK+GH-bB +u 0 33+GI+GK+bg +u 0 33-GJ+FE-GK +u 0 33-GL-GH+GM +u 0 33+GE-FM+GL +u 0 33-GP+Gk+GN +u 0 33+GQ-GN+cH +u 0 33-GQ+Gu+GR +u 0 33+GP-GQ-Gq +u 0 33+GS+Gx+Gj +u 0 33+GS-Gu-Gq +u 0 33+GS+GR-GP +u 0 33+GT-FS-ds +u 0 33-GT-Gk+GU +u 0 33-GU-Gj-FT +u 0 33+Gr+GU-Gg +u 0 33-cO+GT-Gf +u 0 33-GX+dz+GV +u 0 33+GX+GY+Gk +u 0 33-GY+GW+Gj +u 0 33+GZ-GV+dG +u 0 33-GZ+FS+G% +u 0 33-G%+FT-GW +u 0 33-GY-G%-GU +u 0 33+GX-GZ-ds +u 0 33+GX-G%-GT +u 0 33+H1-GN+dz +u 0 33-H1+G@+H2 +u 0 33-H2+H0-GO +u 0 33+H3-GN+GX +u 0 33+H3-H1+GV +u 0 33+H3-GP-GY +u 0 33+H4-Gy-8S +u 0 33-H4+GV+H5 +u 0 33-H5+GW-Gz +u 0 33-H8+H7-GW +u 0 33-H9+8Z+Gy +u 0 33+H9+Ha-H6 +u 0 33-Ha+Gz-H7 +u 0 33-H5-H8-Ha +u 0 33-H4-8j+H9 +u 0 33+H5-GB+G% +u 0 33+H4-GA-dG +u 0 33+H5-GA+GZ +u 0 33-Hd-9b+Gy +u 0 33-Hf-GG-H7 +u 0 33-He-H6+Hb +u 0 33+H9-Hd-9i +u 0 33+Hg-G@-8j +u 0 33+Hh-Hg+H6 +u 0 33+Hi-p2-Hc +u 0 33-Hi-Hb+9Y +u 0 33+ct-Gt+Gp +u 0 33-Hk-jt+Fi +u 0 33-Hl+Fj-Hj +u 0 33-Hn+Hj-Fc +u 0 33-Hl-Fl-Hn +u 0 33-jt+Fk-Hm +u 0 33+Hk-Fl-Hm +u 0 33-Ho+G3+Hp +u 0 33-Hp+G4-Hj +u 0 33-Hq+Hj-kz +u 0 33+Ny+Fj-kz +u 0 33+Hl+Hq+Ny +u 0 33+Hr+jm+E6 +u 0 33-Hr+E7-iI +u 0 33+Hs-Fq+mc +u 0 33+Hu-lT+EG +u 0 33-Hu+EH-y7 +u 0 33+m5-EL+Hu +u 0 33-EJ+DE-Hu +u 0 33+Hs+FA+xt +u 0 33-Ht+kz-FA +u 0 33-Hw+Hv+d0 +u 0 33+Hx+cH-Hv +u 0 33+d7-Hw+Hx +u 0 33-HA-hQ-Hz +u 0 33-HB-Hy-Hv +u 0 33+HC+cH+Hy +u 0 33-HA-d@-HC +u 0 33-HB+HC-Hx +u 0 33-HF+9w+HG +u 0 33-HG-oQ-HE +u 0 33+HJ-HH-cH +u 0 33-HJ+HD+HK +u 0 33-HK+HE-HI +u 0 33-HL-Hy+HH +u 0 33-HM+HI+oQ +u 0 33+HM+HG+HK +u 0 33+HN-HF-Hz +u 0 33+HN+HK-HL +u 0 33+HL-HJ-HC +u 0 33+HN-HD-HC +u 0 33-HO-ao-GO +u 0 33+HO+HP+HE +u 0 33-HP-GN+HD +u 0 33-HQ-HH+Gu +u 0 33+HR+HI+HO +u 0 33+HR-HJ+GN +u 0 33+HR-HH+GQ +u 0 33+HR-HK-HP +u 0 33+HR+HQ+GR +u 0 33+HU-HD+dz +u 0 33-HU+HS+HV +u 0 33-HV+HT-HE +u 0 33+HW+H0+ao +u 0 33-HW-HT+HX +u 0 33-HX-HS+G@ +u 0 33-H1+HU-HP +u 0 33+HY-HU+G@ +u 0 33+H2-HO+HW +u 0 33+HY+HE+HW +u 0 33+HY-HP-H2 +u 0 33+HY-HV+HX +u 0 33+HZ-HS+8x +u 0 33-HZ+9w+H% +u 0 33-H%-oQ-HT +u 0 33+HV-HG+H% +u 0 33+HU-HF-8x +u 0 33+HV-HF+HZ +u 0 33+H@+kz-G4 +u 0 33-H@-G3-iu +u 0 33-Hp+H@-Hq +u 0 33-Ho-iu-Hq +u 0 33+ke-G8+H@ +u 0 33+I0+xA-Hc +u 0 33-I0-Hb+9i +u 0 33-I1-HS-8j +u 0 33+HZ+I1+8E +u 0 33-H%-9D-I1 +u 0 33+HX-Hg-I1 +u 0 33-a3-I0+Hi +u 0 33+I4+ao+I2 +u 0 33-I4+I3-c1 +u 0 33+I5+bW-I3 +u 0 33-I5-I2+aC +u 0 33-aJ-I4+I5 +u 0 33+I8-p9-I7 +u 0 33-I8-I6+oa +u 0 33+I9+aC+I6 +u 0 33-I9+I7-oQ +u 0 33+oJ-I8+I9 +u 0 33+Ib+Ic-I6 +u 0 33-Ia-Ib-I5 +u 0 33+If-Id+Ie +u 0 33-Ii-ey+Ig +u 0 33+Ii+Ij-Hy +u 0 33-Ij+Ih-Hz +u 0 33-Im+Ih+9w +u 0 33+Il-HH+Ii +u 0 33+Il-HL-Ij +u 0 33+Il+Ik+In +u 0 33+Il+HM-Im +u 0 33+Io+Ip+I3 +u 0 33+Is-ey+Iq +u 0 33-Is+Ir-d0 +u 0 33+It-tL-Ir +u 0 33-It-Iq+eF +u 0 33-ek-Is+It +u 0 33+Iu+Iv+Ir +u 0 33-Iv-Ig+Iq +u 0 33-Iv-Ii-Is +u 0 33-Ij-Iu-Ix +u 0 33+Iw+Ix-Ir +u 0 33+Iw-Hy-Is +u 0 33+Iw-Ij+Iv +u 0 33-IA+eT+Iy +u 0 33+IA+IB-Iq +u 0 33-IB+Iz-Ir +u 0 33+IC-tL-Iz +u 0 33-IA+eF-IC +u 0 33-IB+IC-It +u 0 33-IF+eT-IE +u 0 33+IF+IG-Ig +u 0 33-IG-ID-Ih +u 0 33+IH+Iz+Iu +u 0 33+IH-IA+Ig +u 0 33+IH+IB-Iv +u 0 33+II+IE+AS +u 0 33+HA+Ix+dU +u 0 33+HB+Hw-Ix +u 0 33+IN-IM+Aj +u 0 33-IN+IK+IO +u 0 33+IP-dU+IM +u 0 33+IQ-hv+IK +u 0 33+IN+IP-hv +u 0 33-IO+IQ-IP +u 0 33+IS+IT+Iz +u 0 33-IT-IR+Iy +u 0 33-IU-hQ+ID +u 0 33-IV+IE+IR +u 0 33+IZ+I%+IY +u 0 33-I%+IW+IX +u 0 33-J2-J0+IR +u 0 33-J3+J1-IW +u 0 33+I@-J3+J2 +u 0 33+J4+IW+y@ +u 0 33-J6-IX+y@ +u 0 33+J5-IZ-IP +u 0 33-I%-J4-J6 +u 0 33-Jb-Ax+J7 +u 0 33+Jb+Jc-J9 +u 0 33-Jc+J8-Ja +u 0 33+Jd+fE-Ja +u 0 33-Jd-J9-r@ +u 0 33+Je-tL+J7 +u 0 33-Je+J8-fE +u 0 33-Jb-r@-Je +u 0 33-Jc+Je-Jd +u 0 33+Jf-Iy+fq +u 0 33-Jf-J8+Jg +u 0 33-Jg-J7-Iz +u 0 33+Jf+IC+fE +u 0 33-Jg+Je-IC +u 0 33+Ji+Jj-J9 +u 0 33-Jj-Jh-Ja +u 0 33-Jk+J7+Jl +u 0 33-Jl+J8+Jh +u 0 33+Jc-Jj-Jl +u 0 33+Ax+Ji-Jk +u 0 33-Jb+Ji-Jl +u 0 33-Jo-Jn+Jh +u 0 33-Jr-Jn-J8 +u 0 33+Jm-Jk+IM +u 0 33+IO+Jq-Jp +u 0 33+Jl-Jo+Jr +u 0 33+Jm-Jo-Jq +u 0 33-Js-Jt-J3 +u 0 33+Jv+Jt+Ju +u 0 33+Jv-J5+Jq +u 0 33+Jw+Jx-I6 +u 0 33+Ic-Jx-Jz +u 0 33-bW+Jw-Jy +u 0 33-Ib+Jw-Jz +u 0 33-JA-9w+ID +u 0 33+JB-Jy+II +u 0 33-JC-J1+JD +u 0 33-JE-J1+JF +u 0 33-JF-J0-IE +u 0 33+JD-JB-JF +u 0 33-p9+JA-JE +u 0 33+JC-JB-JE +u 0 33+JG+hQ-IY +u 0 33-J2+JF+IV +u 0 33+JH-JE+IX +u 0 33+JH-IU-IY +u 0 33+JH-ID-JG +u 0 33+ig-J6+JG +u 0 33-JK+tE+J0 +u 0 33+JK+JL+JJ +u 0 33-JL+J1+JI +u 0 33+JM+JN+JJ +u 0 33+Js+JL-JN +u 0 33+Js-JK+JM +u 0 33+JO+nw-JJ +u 0 33-JO-JI-oa +u 0 33-JP+J1-oa +u 0 33-JK-nw-JP +u 0 33-JL+JP-JO +u 0 33+Jw-JD+JP +u 0 33+Jx+I8+JC +u 0 33+JQ+JP+I6 +u 0 33+JQ+J1-I8 +u 0 33+JQ+JD+Jx +u 0 33+JR+rl+J9 +u 0 33-JR+Ja-rN +u 0 33-rU-JR+Jd +u 0 33-JU-tj+JS +u 0 33+JU+JV+Ja +u 0 33-JV+JT+J9 +u 0 33+JW+rl-JT +u 0 33-JU-rN-JW +u 0 33-JV+JW-JR +u 0 33+J%-JY-tj +u 0 33-J%+JX+J@ +u 0 33-K2-K1+K3 +u 0 33-K3-K0-JZ +u 0 33-K4-sM+JX +u 0 33+K4+K5+K1 +u 0 33+J@-K3-K5 +u 0 33+J%-K2-sM +u 0 33+J@-K2+K4 +u 0 33-K9-JX+JS +u 0 33-Ka+JZ-K8 +u 0 33+K6-JY+JU +u 0 33+K6-J%+JS +u 0 33+K6-J@+K9 +u 0 33-Kd+y@-Kb +u 0 33+Kd+Ke-JI +u 0 33+Kf+Ju-Kc +u 0 33+Kf+JN-Ke +u 0 33-Kg-JY+Jh +u 0 33+Kh-gK-K8 +u 0 33-Kh-K7-Aq +u 0 33+Ki-Kg+Ka +u 0 33+Ki-Ji+K7 +u 0 33-Kj-i9+K0 +u 0 33+Kj+Kk+Kb +u 0 33-Kl-Jn+JY +u 0 33+Km-Kc-Kk +u 0 33+Km+Kl-K3 +u 0 33+Kn+i9-IL +u 0 33-Kn-IK-gK +u 0 33+Jo-Kg-Kl +u 0 33+Ko-Kl-Jp +u 0 33+Ko+JZ-Kn +u 0 33+Kr+i2-Kq +u 0 33-Kr-Kp+ni +u 0 33+Ks-o3+Kp +u 0 33-Ks+Kq-y@ +u 0 33-nY-Kr+Ks +u 0 33+Kt+nK-JJ +u 0 33-Kt-JI-o3 +u 0 33-nD-Kt+JO +u 0 33-Ku+Kb-Kq +u 0 33-Ku-Kd-Ks +u 0 33+Kv+Ks+JI +u 0 33+Kv-Kp-Kt +u 0 33+Kv-Ku+Ke +u 0 33-Ky+re+Kw +u 0 33+Ky+Kz-sr +u 0 33-Kz+Kx-sd +u 0 33+KA+rG-Kx +u 0 33-KA-Kw-rl +u 0 33-Ky-r0-KA +u 0 33-Kz+KA+sk +u 0 33-KD+z%-KC +u 0 33+KD+KE-sr +u 0 33-KE-KB-sd +u 0 33+KF+KC-Ac +u 0 33-KF+Kw+KG +u 0 33-KG+Kx+KB +u 0 33+Kz-KE-KG +u 0 33-re+KD-KF +u 0 33-Ky+KD-KG +u 0 33+KK-KI+JS +u 0 33-KM+Kx+KL +u 0 33+KR+KQ+KJ +u 0 33+KT+KU+KC +u 0 33-KU-KL+KB +u 0 33+KG-KU-KM +u 0 33-KW+KP-ha +u 0 33+KX+KY+KH +u 0 33+hC-IQ+Kn +u 0 33+KZ+K1-nK +u 0 33-KZ+ni+K% +u 0 33-K%-ha+K0 +u 0 33+K%-Kj-i2 +u 0 33+L1-nK+K@ +u 0 33-L1+L0+sM +u 0 33+L2-sF-L0 +u 0 33-L2-K@+ov +u 0 33+oo-L1+L2 +u 0 33+L5-L3-tq +u 0 33-L6+KH-L4 +u 0 33+L9+La+L8 +u 0 33-La+KH+L7 +u 0 33-Lb-L8+Lc +u 0 33-Lc-L7-L4 +u 0 33-L6+La+Lc +u 0 33-L5+sF+Lb +u 0 33-L6-L9+Lb +u 0 33+Ld+KH-ni +u 0 33-Ld+K@+Le +u 0 33+Lg+ov-L8 +u 0 33-Lg-L7-ni +u 0 33+Le-L9-L2 +u 0 33-La-Ld-Lg +u 0 33+Lf+Lg+K@ +u 0 33+Lf+L8-L2 +u 0 33+Lf-La-Le +u 0 33-Lh+L0+JX +u 0 33+KX+K5-K% +u 0 33-Lh+L1+K4 +u 0 33+Li+Lj-L3 +u 0 33+Li-KI+tq +u 0 33-Lj-KI+L5 +u 0 33+Lh+KY-Le +u 0 33+Lm-Lk-wg +u 0 33-Ln+KP-Ll +u 0 33-Lo-Lk-w2 +u 0 33-Lm-gp-Lo +u 0 33-Lp+L4-KP +u 0 33-Lr-L3+KB +u 0 33-Lq+Ll-L4 +u 0 33-Ln-Lp-Lq +u 0 33+Ls-KL+Li +u 0 33+Lj+Lp-KR +u 0 33+Ls+KN+KS +u 0 33-Lx-sr-Lu +u 0 33+Lx+Ly-Lv +u 0 33-Ly-Lt-Lw +u 0 33+Lz-Lx+sd +u 0 33-LA-Lv+sd +u 0 33-Ly-Lz-LA +u 0 33+LB+Ca-Lu +u 0 33+LC-C7+Lv +u 0 33+Lx+LB-C7 +u 0 33+Ly+LC-LB +u 0 33+LF-LD-z% +u 0 33-LF-Lu+LG +u 0 33-LG-Lt-LE +u 0 33-LH+KC+LD +u 0 33-LF+KD+LH +u 0 33+LI-KD-Lu +u 0 33+LI-KB+Lz +u 0 33+LI+LH-LG +u 0 33+LI+KE+Lx +u 0 33+LL+Lu+Cd +u 0 33-LL+LJ+LM +u 0 33-LM+LK+Lt +u 0 33-LN-Cc+LD +u 0 33+LN+LO-LJ +u 0 33-LO+LE-LK +u 0 33-LG-LM-LO +u 0 33-LF+Cd+LN +u 0 33-LG-LL+LN +u 0 33-LP-LJ+3F +u 0 33-LL+3F-LB +u 0 33+LM+LB-LP +u 0 33+LQ-s%-Lw +u 0 33-LQ-Lv-Bb +u 0 33+tx-LA+LQ +u 0 33-LU-LD+Lk +u 0 33-LS+Ll+L7 +u 0 33-LT+L8-LE +u 0 33+LU+LS+LT +u 0 33+LR-Lb-LE +u 0 33-Lc-LS+Lq +u 0 33+LR+Lr+LH +u 0 33+LR-Lc+LT +u 0 33+LR-Lq-LU +u 0 33+LX+w2+LV +u 0 33-LX+LW-ho +u 0 33+LY+Ce-LW +u 0 33-LY-LV+Cc +u 0 33-Cb-LX+LY +u 0 33+LZ+Ll+h3 +u 0 33-LZ-LW+L% +u 0 33-L%-LV+Lk +u 0 33-LZ-ho-Lo +u 0 33+L%+Lo-LX +u 0 33+M3-M1+Cc +u 0 33-M3+L@+M4 +u 0 33-M4+M0-M2 +u 0 33+M5+M2+yG +u 0 33-M5-LW+M6 +u 0 33-M6-LV+M1 +u 0 33+M8-yG-M0 +u 0 33-M8-L@+Ce +u 0 33+M3-M6+LY +u 0 33-M4+M8+M5 +u 0 33+M7+LY+L@ +u 0 33+M7+LW-M8 +u 0 33+M7+M6-M4 +u 0 33+M9+LE-oC +u 0 33-M9-M2+Ma +u 0 33-Ma-M1+LD +u 0 33-Mb+oC-LK +u 0 33+Mb+Mc+M0 +u 0 33-Mc-LJ+L@ +u 0 33+Md-L@+LN +u 0 33+LN-Ma-M3 +u 0 33+LO-Mb+M9 +u 0 33+Md+M0+M9 +u 0 33+Md-Mc-LO +u 0 33+Md+M4+Ma +u 0 33-Me-mZ-M2 +u 0 33+Me+Mf+Ll +u 0 33-Mf-M1+Lk +u 0 33+Mg+oC-L8 +u 0 33-Mg-L7-mZ +u 0 33+LU-Mf+Ma +u 0 33+Mh-Me+L7 +u 0 33+Mh+Mf+LS +u 0 33+Mh+Ma-LT +u 0 33+LT-M9-Mg +u 0 33+Mh+M2-Mg +u 0 33+Mf-L%+M6 +u 0 33-Me+h3+M5 +u 0 33+Mf-LZ+M5 +u 0 33+C8-LC+LQ +u 0 33+nb-Mg+Lg +u 0 33+Mi-3D+LJ +u 0 33-Mi+LK-C9 +u 0 33+Mj-3D+L@ +u 0 33-Mj+M0-Cg +u 0 33+Mb+Mi+Cg +u 0 33+Mc+Mj-Mi +u 0 33-3E-Mi+LP +u 0 33+Dr+Mk-Dy +u 0 33-CY+DA-Mk +u 0 33-Dl+Ml-D6 +u 0 33+EF-DG-Ml +u 0 33-FR+Mm-G0 +u 0 33-GF+Mn-GC +u 0 33+GE-F@-Mn +u 0 33+GI+Mo-FJ +u 0 33-GM+Mo-GE +u 0 33-GJ+FN-Mo +u 0 33+Mo-FM-GH +u 0 33-Ha+Mp-He +u 0 33-Hd-I0-Mp +u 0 33+H9+Mp-Hb +u 0 33-IJ+Mr-JB +u 0 33+Id+Jz-Mr +u 0 33+Kp+Ms-KZ +u 0 33-Kr+Ms-K% +u 0 33+Ku+Ms+Kk +u 0 33+Ms-Kj-Kq +u 0 33+E%-DM+pn +u 0 33-fS+Mt-Mv +u 0 33+Mv+Mu+g4 +u 0 33-Gj+Mt-Mw +u 0 33+Mw+Mu-Gq +u 0 33+Mw-Mv+Gn +u 0 33+Mx-Mt-Gx +u 0 33-Gu-Mu-Mx +u 0 33-Gw+My-Mx +u 0 33+GS+Mx-Mw +u 0 33+My-Mt-f5 +u 0 33+ey-Mu-My +u 0 33+fZ+Mv-My +u 0 33-CB-Cw+Mz +u 0 33+Mz+CC+Cl +u 0 33-Mz+Cx+CA +u 0 33+MA+FG-ly +u 0 33+MA+EQ-lr +u 0 33+MA-EP+ER +u 0 33+MA+EO-lF +u 0 33+MB-Fq+lF +u 0 33+MB-Hs-mj +u 0 33+MB+FA-xf +u 0 33+MB+Fz-F8 +u 0 33-9R+H%+MC +u 0 33+MC-9Y-I1 +u 0 33-MC+HT+oX +u 0 33+IA-Jf-fx +u 0 33+MD+JW+rG +u 0 33+MD-JU+rz +u 0 33+MD-JS+tq +u 0 33+MD+KK-Li +u 0 33+MG-ME-fq +u 0 33-tE-MF-MG +u 0 33+tj+ME-MH +u 0 33+MH+MF-sM +u 0 33+MH-MG-tc +u 0 33-JY+ME-MI +u 0 33+MI+MF+K2 +u 0 33+MI-MH+J% +u 0 33-Jn+ME-MJ +u 0 33+MJ-MI-Kl +u 0 33+MK-Lt-sF +u 0 33-MK+tq+Lz +u 0 33-LQ+ML+t5 +u 0 33+ML+sF-Lw +u 0 33-ML+LA-tq +u 0 33-Ly-MK-ML +u 0 33+MM-HA-e6 +u 0 33+MM+Hz-8x +u 0 33+MM+HN-HU +u 0 33+MM+HC+dz +u 0 33-Cf-Mi+MN +u 0 33+MN-s%-LK +u 0 33-MN+LP-C8 +u 0 33+LM+Ly+MO +u 0 33+MO+LK-Lw +u 0 33-MO+LC-LP +u 0 33-MN-MO+LQ +u 0 33+MP+J6-wn +u 0 33+MP-IX-p9 +u 0 33+MP+JH-JA +u 0 33+MP+JG+9w +u 0 33+hC+MQ-MS +u 0 33+MS+MR-i9 +u 0 33+hQ+MQ-MT +u 0 33+MT+MR-ig +u 0 33+MT-MS+hJ +u 0 33+MU-MQ-IQ +u 0 33+IL-MR-MU +u 0 33+Kn+MS-MU +u 0 33+MV-MQ-IY +u 0 33+J6-MR-MV +u 0 33+MV-MT-JG +u 0 33+MW+Es+ui +u 0 33-MW-lr-Ew +u 0 33+EE+Ez+MX +u 0 33+MX-BK-Es +u 0 33-MX+Ew+mE +u 0 33+mx-MX-MW +u 0 33+MY+CJ+C% +u 0 33+MY-CI+D7 +u 0 33+MY-CH-D6 +u 0 33-CF+MZ+5P +u 0 33+MZ-Cj-CK +u 0 33-MZ+CJ-5O +u 0 33-CE+x1-MZ +u 0 33+Ci-DD+M% +u 0 33+M%+Ch-DC +u 0 33+M@-DF-Ch +u 0 33-M@-CK-CH +u 0 33-M%-DG-M@ +u 0 33+N0+CQ+zk +u 0 33+N0-CL-7R +u 0 33+N0+CP-7S +u 0 33+N0+CM+z6 +u 0 33+Dk+N1+Es +u 0 33+N1-Eu-Dm +u 0 33-N1-Dl+Ez +u 0 33+N2-Ev-N1 +u 0 33+N2+Et-Dm +u 0 33-N2-Dl-EA +u 0 33-Dp+Ey-N2 +u 0 33+N3-Da-Dm +u 0 33+N3-Dc-Dq +u 0 33+N3+qm+Dx +u 0 33+N3+Dv-Dy +u 0 33+N3-Do+Dp +u 0 33+N3+DX-N2 +u 0 33+N4-Dl-EE +u 0 33+N4+N1+MX +u 0 33+N4-Dk+BK +u 0 33-va+N5-Db +u 0 33-N5-qH-Dt +u 0 33-pW-Dc-N5 +u 0 33+De+Ds+Di +u 0 33-Du+N6+Ch +u 0 33+N6+Ck+Dz +u 0 33+N7+CK-N6 +u 0 33+N7-CE+Dz +u 0 33-N7-Dy+MY +u 0 33+N8+Ej+EC +u 0 33+N8-j1+D@ +u 0 33+N8+jf-E2 +u 0 33+N8+DH-E1 +u 0 33-N9-E3+Eh +u 0 33-OG+Ht+Na +u 0 33-Na-Fv+D% +u 0 33+Nb+E3+E5 +u 0 33+Nb-Dn-E4 +u 0 33+Nb-Eg-ED +u 0 33+Nc+Ek+Ee +u 0 33+Nc+DI+Ed +u 0 33+Nc+DK+D2 +u 0 33+Nc+El-D3 +u 0 33+Nd-Eo+DL +u 0 33+Nd+Er-DW +u 0 33+Nd-Em+DM +u 0 33+Nd-Ep+DN +u 0 33+Ne-EK+Ev +u 0 33+Ne-EG+DY +u 0 33+Ne+EH+Ex +u 0 33+Ne+EI-EA +u 0 33+Nf+EM+EP +u 0 33+Nf+EU+ET +u 0 33+Nf+uD+EN +u 0 33+Nf+up-EQ +u 0 33+Ng+Fy+Fs +u 0 33+Ng+Fj-FA +u 0 33+Ng-Fo-Fz +u 0 33+Nh+Fy-Ft +u 0 33+Nh+Fp+DV +u 0 33+Nh-Ng-Fv +u 0 33+Ni-Fy-Fl +u 0 33+Ni+Fu+Fm +u 0 33+Ni+Fx-Fg +u 0 33+Nj+FU-Gh +u 0 33+Nj-FR+Ge +u 0 33+Nk+EO+FX +u 0 33+Nk+FV+G0 +u 0 33-Nl-F2+Gh +u 0 33-Gd+Gg-Nl +u 0 33+Nm-EX+F6 +u 0 33+Nm+F0+F2 +u 0 33+Nm+Gf-Nl +u 0 33+Nm-Gb+Gd +u 0 33+Nm+tS+ES +u 0 33+Nn-Ge+Mm +u 0 33+Nn+Nj+G0 +u 0 33+Nn+F1+FX +u 0 33+FS-Gh+G9 +u 0 33+No+Ge+Fd +u 0 33+No-Gi+Hm +u 0 33+FQ-Nj+G9 +u 0 33+FQ-FR-Gi +u 0 33+Np+No-G1 +u 0 33+Np-Hn-Ho +u 0 33+Np-Hm-jH +u 0 33+Nq-Gf-Gt +u 0 33+Nq-Gg-Gs +u 0 33+Nq-GU+Go +u 0 33+Nq-GT-Gm +u 0 33+Hd+GC-F% +u 0 33+FY-OC-Hd +u 0 33+Nr+H4+Ha +u 0 33+Nr-8j+H6 +u 0 33+Nr+G@-Hh +u 0 33+Nr+GV-H8 +u 0 33+Ns-H3-H8 +u 0 33+Ns-H1-Nr +u 0 33+Ns-H2-Hh +u 0 33+Nt-GW+H3 +u 0 33+Nt+Gj+GP +u 0 33+Nt-Gx+GR +u 0 33+Nt+C3-GO +u 0 33+Nt-H7+Ns +u 0 33+Nu-Hf+GH +u 0 33+Nu+He+Hc +u 0 33+Nv-oX+HW +u 0 33+Nv-MC+HX +u 0 33+Nv-9Y+Hg +u 0 33+Nw-No-Hn +u 0 33+Nw-G1+Ho +u 0 33+Nw-G6+Hp +u 0 33+Nw-G5-Hj +u 0 33+Nx+Fw-Hk +u 0 33+Nx+Hr+jA +u 0 33+Nx-E6+jt +u 0 33+Ny-Fw+E7 +u 0 33+Fq+Na-DY +u 0 33+Nz+E8+Fw +u 0 33+Nz-D%+Nh +u 0 33+Nz-Na+Ng +u 0 33-Ny+Ht+Ng +u 0 33+NA+Ia-Ip +u 0 33+NA-Id+Mq +u 0 33-JA-Im-IG +u 0 33-JA-Ie+IJ +u 0 33+I7+If+Ic +u 0 33+NB-Io+II +u 0 33+NB-Mq+IJ +u 0 33+NB+In-IG +u 0 33+NC-dU+Iu +u 0 33+NC+HA-Ij +u 0 33+NC-hQ-Ih +u 0 33+NC+IU+IG +u 0 33-Ix+HC+d7 +u 0 33+ND-HB-Iw +u 0 33+ND+Hw-Ir +u 0 33+ND+Hv-Is +u 0 33+IS+NE-Iu +u 0 33+NE+IH-IT +u 0 33-NE-IV+IG +u 0 33+NF+Ig-NE +u 0 33+NF+IA-IT +u 0 33-NF-IV-IF +u 0 33-IR-eT-NF +u 0 33+NG-I@-IV +u 0 33+NG-IZ+IU +u 0 33+NG+I%+JH +u 0 33+NG+IW+JE +u 0 33+NG-J3+JF +u 0 33+NH-Jt-I@ +u 0 33-J2-Js-NH +u 0 33+NI-Kd-IW +u 0 33+NI+Kf-Jt +u 0 33+NI+Kc+Jv +u 0 33+NI+Kb+J4 +u 0 33+Jn+NJ-Jf +u 0 33-NJ+Jr+Jg +u 0 33+NK+IT-NJ +u 0 33+NK+NH+Ju +u 0 33+Jv-I@-NK +u 0 33+NL+IM+Jq +u 0 33+NL+Jk-Jo +u 0 33+NL+J7-Jr +u 0 33+NL-Iz-NJ +u 0 33+NL+IS-NK +u 0 33+NM+Jy-JD +u 0 33+NM+II-JF +u 0 33+NM-AS+J0 +u 0 33+NM-yU+JK +u 0 33+NM-bW-JP +u 0 33+NN+Ju-Km +u 0 33+NN-JM-K1 +u 0 33+NN-Kf-Kk +u 0 33+NO-Ke-Kk +u 0 33+NO-JN-NN +u 0 33+NO+JJ-K1 +u 0 33+NO+Kt+KZ +u 0 33+NO+Kv+Ms +u 0 33+NP+Jj-JV +u 0 33+NP-Jh+JU +u 0 33+NP-Kg-K6 +u 0 33+NP-Ji-JT +u 0 33+NQ+Kh+IK +u 0 33+NQ+K8-Kn +u 0 33+NQ-Ka-Ko +u 0 33+K7+NR+Ax +u 0 33+NR+Jk-Ki +u 0 33-NR+Kh-Aj +u 0 33+NS-IM-NR +u 0 33+NS+Jm-Ki +u 0 33-NS+Kh+IN +u 0 33-NQ+IO-NS +u 0 33+NT-Jp+Kn +u 0 33+NT+Kl+JZ +u 0 33+NT-Km-K0 +u 0 33+NU-KK-K9 +u 0 33+NU-KI+JX +u 0 33+NV+KO+Ac +u 0 33+NV-KN-KT +u 0 33+NW+KP+KX +u 0 33+NW-KR-NU +u 0 33+NX-K8-KV +u 0 33+NX-KW+KQ +u 0 33+NY-KV+KJ +u 0 33+L2+Lb+NZ +u 0 33+NZ+Le+L6 +u 0 33-NZ-L5-L0 +u 0 33+Li+N%-KB +u 0 33+N%-KU-Ls +u 0 33-N%+Lj+Lr +u 0 33-N@+Lj-Lq +u 0 33+KR+Ln-N@ +u 0 33+O0+NU+Lj +u 0 33+O0-JX+L5 +u 0 33+O0-Lh-NZ +u 0 33+O0+KY+L6 +u 0 33+O0-KX-L4 +u 0 33+O0+NW-Lp +u 0 33-M0+O1-ys +u 0 33+O1+5z-Mj +u 0 33-O1+M8+yN +u 0 33+O2-5A-O1 +u 0 33+O2+3C-Mj +u 0 33-O2+M8+vQ +u 0 33-L@-3B-O2 +u 0 33+O3-CX-qm +u 0 33+O3-Dr+N3 +u 0 33+O3+Mk-Dv +u 0 33+O3-CY-Ed +u 0 33+O4+N7+CJ +u 0 33+O4-Dy-C% +u 0 33+O4-Mk-CR +u 0 33+O4-DA-CV +u 0 33+O4-Dz-C0 +u 0 33+CC-DD+O5 +u 0 33+O5+CD+DG +u 0 33-O5-DB-Cz +u 0 33-O5-EF+O6 +u 0 33+O6+CD-Ml +u 0 33-O6-EE-Cz +u 0 33-O6+Dl-D7 +u 0 33-M@-N6+O7 +u 0 33+O7-D6+Dy +u 0 33-O7+Du+DF +u 0 33+Ml+O8+EA +u 0 33+O8-N2+D6 +u 0 33-O8-DF+Ex +u 0 33+O9+Ey-O8 +u 0 33+O9+Dp+D6 +u 0 33-O9-DF+Dn +u 0 33-O7+Dw-O9 +u 0 33+Oa-EJ-DG +u 0 33+Oa+EI+Ml +u 0 33+Oa-Ne-O8 +u 0 33+Oa+EH+DF +u 0 33-NA+Ob-Jz +u 0 33+Ob-Jy+Io +u 0 33-Ob-Mq+Mr +u 0 33-NB+JB-Ob +u 0 33+Oc+5R-B@ +u 0 33+Oc-7V-Bw +u 0 33+Oc+C5-BK +u 0 33+Oc-CC-CA +u 0 33+Oc+Cl+Cx +u 0 33+Od+Fg-Fz +u 0 33-Od+FA-Fc +u 0 33+Ng-Fl-Od +u 0 33+Oe-MG+Iy +u 0 33+Oe-ME+Jf +u 0 33+Oe-MJ+NJ +u 0 33+Of+LG+LR +u 0 33+Of-Lt+Lb +u 0 33+Of-MK+L5 +u 0 33+Of-Lz+L3 +u 0 33+Of+LI-Lr +u 0 33+Og+Lo-gD +u 0 33+Og-LZ-hh +u 0 33+Og+Ll-ha +u 0 33+Og-Ln+KW +u 0 33+Og-Lm-gK +u 0 33-CC-CB+Oh +u 0 33+Oh-5Q-Ct +u 0 33-Oh-Cw-Cl +u 0 33-Cv+Cq+Oi +u 0 33+Oi+Ct+5S +u 0 33-Oi-Cr+Cw +u 0 33-Oh-Oi-5R +u 0 33-Ci+M@-CG +u 0 33+Oj+uY+Db +u 0 33+Oj+v3+N5 +u 0 33+Oj+Df-Ds +u 0 33+Oj+Dh+De +u 0 33+Ok-C@-Cv +u 0 33+Ok-Dj-Co +u 0 33+Ok-Dx+CN +u 0 33+Ok+Dr+CS +u 0 33+Ok-C%+Cn +u 0 33+Ol+E2+E6 +u 0 33+Eh+EC+Om +u 0 33+Om+Do-E0 +u 0 33-Ea-Om-Ol +u 0 33+On+E9+Hr +u 0 33+On+N9-EB +u 0 33+Oo+FA+kN +u 0 33+Oo-Hs+xH +u 0 33+Oo+Na-Ex +u 0 33+Oo-Ht+kU +u 0 33+Op-FB-E5 +u 0 33+Op-E7-E9 +u 0 33+Op-iI+On +u 0 33+Oq-DR-Er +u 0 33+Or-EJ-DB +u 0 33+Or+Hu+mL +u 0 33+Or-EG+mE +u 0 33+Or-EK+MX +u 0 33+Or+EI-EE +u 0 33+Os-Nh-DT +u 0 33+Os+Fp-DM +u 0 33+Os-Fi-pB +u 0 33+Os+Nz-DX +u 0 33-Eo+F7+Ot +u 0 33+Ot+Oq-Fa +u 0 33-Ot-Fn+Nd +u 0 33-DU+Ou-Ft +u 0 33+Ou-Fr-DR +u 0 33-Ou-DW-Fu +u 0 33+Ov-Fx-Ou +u 0 33+Ov+Fa-DR +u 0 33-Ov-DW+Fn +u 0 33-Er-Ot-Ov +u 0 33+Ow-ET-F2 +u 0 33+Ow+FV-Nj +u 0 33+Ow-Nk+Nn +u 0 33+Ow+EO-F1 +u 0 33+Ow-EP+F4 +u 0 33+Ox-Nk-GC +u 0 33+Ox+FV-GD +u 0 33+Ox-EN-Gz +u 0 33+FK+Oy+EO +u 0 33+Oy-Nk+F@ +u 0 33-Oy-FJ-FG +u 0 33+GF+Ox+Oz +u 0 33+Oz+Mn+Nk +u 0 33-GE-Oz-Oy +u 0 33+OA-ES-fS +u 0 33+OA-EU+uD +u 0 33+OA+ET-EN +u 0 33+OA+Nl+FT +u 0 33+OA-Gd-Ga +u 0 33+OB+Np+Fl +u 0 33+OB+jH+Hk +u 0 33+OB-iu+Ny +u 0 33+OB+Ho-Hl +u 0 33+OC+FR-GD +u 0 33+OC+Mm-GC +u 0 33+OC-G1+Gy +u 0 33+OC-Gi+GA +u 0 33+OD+FM-F@ +u 0 33+OD+GL+Mn +u 0 33+OD-xA+F% +u 0 33+OE-Ha-GF +u 0 33+OE-Nu+GL +u 0 33+OE-Hf+GM +u 0 33+OF-Ne-Na +u 0 33+OF-EG+Fq +u 0 33+OF+EL+Hs +u 0 33+OF+EH+Oo +u 0 33+OG-Ex-kU +u 0 33+OG+E8+E7 +u 0 33+OG-Nz-Ny +u 0 33-IG-IJ+OH +u 0 33+OH-In-Mq +u 0 33-OH+Ie-Im +u 0 33-OH+OI-Il +u 0 33+OI+Ik-Mq +u 0 33-OI+Ie-HM +u 0 33+OJ-NA-Ik +u 0 33-OJ+HM+If +u 0 33+Id-OJ-OI +u 0 33+OK+Id+Ic +u 0 33+OK+Ie-I7 +u 0 33-OK-Jx-Mr +u 0 33+JE-IJ+OL +u 0 33+OL-p9-Ie +u 0 33-OL+Mr-JC +u 0 33+I8-OL-OK +u 0 33+OM+I2-Ia +u 0 33+OM+aC+Ib +u 0 33+OM-I9-Ic +u 0 33+OM+oQ+If +u 0 33+OM-HI+OJ +u 0 33+ON-Gv+Io +u 0 33-ON-Ik+HQ +u 0 33-GR-ON+OO +u 0 33-OO-Ik-HR +u 0 33+OP+IU+IV +u 0 33+OP+IZ-I@ +u 0 33+OP-dU+IS +u 0 33+OP-NC-NE +u 0 33+OS-OQ-Jp +u 0 33+IL-OR-OS +u 0 33+NT+OQ-OT +u 0 33+OT+OR-i9 +u 0 33+OS-OT-Kn +u 0 33+Km+OQ-OU +u 0 33+OU+OR+Kj +u 0 33+OV-OQ-Kc +u 0 33+Kb-OR-OV +u 0 33-Kk+OU-OV +u 0 33-K0+OT-OU +u 0 33+OW-OQ+Jv +u 0 33-J4-OR-OW +u 0 33+NI+OV-OW +u 0 33+OX-JM-MF +u 0 33-OX-MJ-Ju +u 0 33-OX-MI+OY +u 0 33+OY-JM+K2 +u 0 33-OY-Kl-Ju +u 0 33-OY-K3+NN +u 0 33+OZ+Ke-JL +u 0 33+OZ+Kf+Js +u 0 33+OZ-NI-J3 +u 0 33+OZ-Kd-J1 +u 0 33+O%-IO+Ko +u 0 33+O%-NS-Ka +u 0 33+O%+Jm-Kg +u 0 33+O%+Jq+Kl +u 0 33+O@+Kx+MD +u 0 33+O@+KA-JW +u 0 33+O@-Kw-JT +u 0 33+P0-Ls-KK +u 0 33+P0-KL+MD +u 0 33+P0-KM-O@ +u 0 33+P1-KN-P0 +u 0 33+P1+KO-JT +u 0 33-P1+KK-KS +u 0 33+P2-K7-KO +u 0 33-P2+KS+NY +u 0 33-NX+P3+JZ +u 0 33+P3+Ka-KV +u 0 33-KK+K6+P4 +u 0 33+P4+NY-Ka +u 0 33-P4-J@+NU +u 0 33+KJ-P4-P3 +u 0 33+P5+KJ+N@ +u 0 33+P5-KQ+Ln +u 0 33+P5+NX+Og +u 0 33+P6-NY+N@ +u 0 33+P6-KV-P5 +u 0 33+P6+K8+Og +u 0 33+P6+Kh+Lm +u 0 33+P7+KP+K% +u 0 33+P7-NW+K5 +u 0 33+P7+KW+K0 +u 0 33-KH+P8-K% +u 0 33+P8-K5+KY +u 0 33-P8-Ld+KZ +u 0 33+P9-K1-P8 +u 0 33+P9+K4+KY +u 0 33-P9-Ld+nK +u 0 33-Le+L1-P9 +u 0 33-CH-O7+N7 +u 0 33+Pa-Fd+F1 +u 0 33+Pa+Fg-F8 +u 0 33+Pa-Od-MB +u 0 33+Pa+Fc-xf +u 0 33+Pa+No+FW +u 0 33+Pb+JM-NH +u 0 33+Pb+JK+J2 +u 0 33+Pb+tE+IR +u 0 33+Fi+Pc+E2 +u 0 33+Pc+E0+Os +u 0 33-Pc-Fw+Ol +u 0 33-Ey-Om+Pd +u 0 33+Pd-DX-E0 +u 0 33-Pd-Ol-E8 +u 0 33+Nz-Pd-Pc +u 0 33-D@-Hr+Ol +u 0 33+Pe-Ea+Eh +u 0 33+Pe+Ol-EC +u 0 33+Pe+Hr+EB +u 0 33+Pe-E9+N9 +u 0 33+Pf+E5+ED +u 0 33+Pf-E3-Eg +u 0 33+Pf+N9-Eb +u 0 33+Pf-On+k0 +u 0 33+Pf+Op+k7 +u 0 33+Ex+Pg+E4 +u 0 33+Pg+FB+OG +u 0 33-Pg-Ey-Nb +u 0 33+Ph+E5-Pg +u 0 33+Ph+Op+OG +u 0 33-Ph-Ey+E3 +u 0 33+E8-E9-Ph +u 0 33+Pi+Ev+DZ +u 0 33+Pi-Eu-Eq +u 0 33-Pi+DR-Ew +u 0 33+Pj+En+Eu +u 0 33-Pj+Ew-Oq +u 0 33-Er-Pj-Pi +u 0 33+Pk+DM+Fm +u 0 33+Pk+Os-Fl +u 0 33+Pk+pB+Fk +u 0 33+Pk+pn+Fb +u 0 33-Gz+Pl-OA +u 0 33+Pl+ET-Ox +u 0 33-Pl-GB-Nl +u 0 33-Nj+F2+Pm +u 0 33+Pm-FV-ET +u 0 33-Pm+Nl-FU +u 0 33+GD-Pm-Pl +u 0 33+Pn+GF+Gz +u 0 33+Pn-Oz-EN +u 0 33+Pn-GM-GG +u 0 33+Pn+OE+H7 +u 0 33+Po-GG+EN +u 0 33+Po+GM-Oz +u 0 33+Po+Mo+Oy +u 0 33+Po-GI-FG +u 0 33+F%+Pp+I0 +u 0 33+Pp+Hc-OD +u 0 33-Pp-GC+Mp +u 0 33+Pq+He-Pp +u 0 33+Pq-Nu-OD +u 0 33-Pq-GC+Ha +u 0 33-Mn+OE-Pq +u 0 33+Pr+F@-FL +u 0 33+Pr-FX+FH +u 0 33+Pr-Mm-FZ +u 0 33+Pr-F%-FI +u 0 33+Pr+OD-FP +u 0 33+Ps-Hf+GK +u 0 33+Ps+Hh+H0 +u 0 33+Ps+Ns+GO +u 0 33+Ps+H7+C3 +u 0 33+Ps-Nu-bB +u 0 33+Pt-iu-E7 +u 0 33+Pt-OB-Fw +u 0 33+Pt+jH+Nx +u 0 33+Pt-iP-Hr +u 0 33+Pu+I5+Jw +u 0 33+Pu-Ia+Jz +u 0 33+Pu-Ip+Ob +u 0 33+Pu+I3+Jy +u 0 33+Pv-Hz+HL +u 0 33+Pv+HF+HK +u 0 33+Pv+9w-HM +u 0 33+Pv-Ih+Il +u 0 33+Pw-HQ-Il +u 0 33+Pw-Gu+Ii +u 0 33+Pw-Gw+Ig +u 0 33+Pw-ON+In +u 0 33+Px+I@-J5 +u 0 33+Px+OP-IP +u 0 33+Px-IS+IM +u 0 33+Px-NK-Jq +u 0 33+Py+IT+Oe +u 0 33+Py-IR+MG +u 0 33+Py+Pb-MF +u 0 33+Py+NH-OX +u 0 33+Py-NK+MJ +u 0 33-O@+P1+Pz +u 0 33+Pz-Kw-KO +u 0 33-Pz-KN-KM +u 0 33-NV-KC+PA +u 0 33+PA+KO+KF +u 0 33-PA-KU+KN +u 0 33-Pz-PA-KG +u 0 33+PB-K7+Ac +u 0 33+PB-P2-NV +u 0 33+PB-P6-Lk +u 0 33+PB+Kh+wg +u 0 33+PC+P2+Ki +u 0 33+PC-P1+NP +u 0 33+PC+KO+Ji +u 0 33+PD-NP+KK +u 0 33+PD-Kg+P4 +u 0 33+PD-Ki-NY +u 0 33+PD+PC+KS +u 0 33+PE+NV+KS +u 0 33+PE+PB-NY +u 0 33+PE+Lk-N@ +u 0 33+PE-KC-N% +u 0 33+PE+KT-Ls +u 0 33+PF+KQ+P3 +u 0 33+PF+KW-JZ +u 0 33+PF-P7+K3 +u 0 33+PF-NW+J@ +u 0 33+PF-KR-P4 +u 0 33+Hb+PG-Hg +u 0 33+PG+Nv-Hi +u 0 33-PG-He+Hh +u 0 33+HR+OJ+PH +u 0 33+PH-OO+NA +u 0 33-PH+OM+HO +u 0 33-PH+Ia+PI +u 0 33+PI-OO+Ip +u 0 33-PI-I2+HO +u 0 33-PI+I4-GO +u 0 33+PJ-NB-IF +u 0 33+PJ+In-Ig +u 0 33+PJ+ON-Gw +u 0 33+PK+Gv+GR +u 0 33+PK+Io+OO +u 0 33+PK-I3+PI +u 0 33+PK-c1-GO +u 0 33+PK-AZ-Nt +u 0 33+PL+LR-Lj +u 0 33+PL-LH-N% +u 0 33+PL-LD-PE +u 0 33+PL+LU-N@ +u 0 33+PM+H0+bB +u 0 33+PM-Hh-Nu +u 0 33+PM-PG+Hc +u 0 33+PM+Nv-p2 +u 0 33+PM-HW+bI +u 0 33-f5+PN-PP +u 0 33+PP+PO-AZ +u 0 33-eT+PN-PQ +u 0 33+PQ+PO-AS +u 0 33+PQ-PP-fc +u 0 33-IF+PN-PR +u 0 33+PR+PO+II +u 0 33-IE+PR-PQ +u 0 33+PS-PN+Gw +u 0 33-Gv-PO-PS +u 0 33+Gx+PP-PS +u 0 33+PT-PN+PJ +u 0 33-Io-PO-PT +u 0 33+NB+PT-PR +u 0 33+PS-PT+ON +u 0 33-EQ-EP+PU +u 0 33+PU-lr-ER +u 0 33-PU-EM+up +u 0 33-PU-F9+PV +u 0 33+PV-lr-Fa +u 0 33-PV-F7+up +u 0 33-PV+Ot+PW +u 0 33+PW-lr-Oq +u 0 33-PW-Eo+up +u 0 33-PW-Pj-MW +u 0 33+PZ-PX-IO +u 0 33+IL-PY-PZ +u 0 33+P%-PX+J5 +u 0 33-J4-PY-P% +u 0 33+J6-PY-P@ +u 0 33+P%-P@-I% +u 0 33+Q0+PY-MR +u 0 33+Q0-PZ+MU +u 0 33+P@-Q0-MV +u 0 33-Ow+Fe+Q1 +u 0 33+Q1+EO+F8 +u 0 33-Q1+F9+EP +u 0 33-Q1+Fa+MA +u 0 33+Q2-Eo+ub +u 0 33+Q2+En-D9 +u 0 33+Q2-Pj+Es +u 0 33+Q2+PW-ui +u 0 33+Q3+OS-OW +u 0 33+Q3+Jp+Jv +u 0 33+Q3+IO+J5 +u 0 33+Q3+PZ-P% +u 0 33+Q3+IL+J4 +u 0 33+Q4-PX+IP +u 0 33+Q4-PZ+IQ +u 0 33+Q4-Q0-MQ +u 0 33+Q4-P@+IY +u 0 33+Q4-P%-IZ +u 1g 5+3+4H+4O-4V+50 +u 1g 5-50+4I+4P-4W+51 +u 1g 5-51+4J+4Q-4X+52 +u 1g 5-52+4K+4R-4Y+53 +u 1g 5-53+4L+4S-4Z+54 +u 1g 5-54+4M+4T-4%+55 +u 1g 5-55+4N+4U-4@+56 +u 1g 5+6-57-4H+5e+5l +u 1g 5-5l-58-4I+5f+5m +u 1g 5-5m-59-4J+5g+5n +u 1g 5-5n-5a-4K+5h+5o +u 1g 5-5o-5b-4L+5i+5p +u 1g 5-5p-5c-4M+5j+5q +u 1g 5-5q-5d-4N+5k+5r +u 1g 5+f-5s-5e+5z+5G +u 1g 5-5G-5t-5f+5A+5H +u 1g 5-5H-5u-5g+5B+5I +u 1g 5-5I-5v-5h+5C+5J +u 1g 5-5J-5w-5i+5D+5K +u 1g 5-5K-5x-5j+5E+5L +u 1g 5-5L-5y-5k+5F+5M +u 1g 5+A+4V+5N-5U+5@ +u 1g 5-5@+4W+5O-5V+60 +u 1g 5-60+4X+5P-5W+61 +u 1g 5-61+4Y+5Q-5X+62 +u 1g 5-62+4Z+5R-5Y+63 +u 1g 5-63+4%+5S-5Z+64 +u 1g 5-64+4@+5T-5%+65 +u 1g 5+20+5U+66-6d+6k +u 1g 5-6k+5V+67-6e+6l +u 1g 5-6l+5W+68-6f+6m +u 1g 5-6m+5X+69-6g+6n +u 1g 5-6n+5Y+6a-6h+6o +u 1g 5-6o+5Z+6b-6i+6p +u 1g 5-6p+5%+6c-6j+6q +u 1g 5+21-6r-5z+6d+6y +u 1g 5-6y-6s-5A+6e+6z +u 1g 5-6z-6t-5B+6f+6A +u 1g 5-6A-6u-5C+6g+6B +u 1g 5-6B-6v-5D+6h+6C +u 1g 5-6C-6w-5E+6i+6D +u 1g 5-6D-6x-5F+6j+6E +u 1g 5+b+6F+6M-6T+6% +u 1g 5-6%+6G+6N-6U+6@ +u 1g 5-6@+6H+6O-6V+70 +u 1g 5-70+6I+6P-6W+71 +u 1g 5-71+6J+6Q-6X+72 +u 1g 5-72+6K+6R-6Y+73 +u 1g 5-73+6L+6S-6Z+74 +u 1g 5+D-75-7c+7j+7q +u 1g 5-7q-76-7d+7k+7r +u 1g 5-7r-77-7e+7l+7s +u 1g 5-7s-78-7f+7m+7t +u 1g 5-7t-79-7g+7n+7u +u 1g 5-7u-7a-7h+7o+7v +u 1g 5-7v-7b-7i+7p+7w +u 1g 5+H+7c+7x-7E+7L +u 1g 5-7L+7d+7y-7F+7M +u 1g 5-7M+7e+7z-7G+7N +u 1g 5-7N+7f+7A-7H+7O +u 1g 5-7O+7g+7B-7I+7P +u 1g 5-7P+7h+7C-7J+7Q +u 1g 5-7Q+7i+7D-7K+7R +u 1g 5+I-7S-6F+7E+7Z +u 1g 5-7Z-7T-6G+7F+7% +u 1g 5-7%-7U-6H+7G+7@ +u 1g 5-7@-7V-6I+7H+80 +u 1g 5-80-7W-6J+7I+81 +u 1g 5-81-7X-6K+7J+82 +u 1g 5-82-7Y-6L+7K+83 +u 1g 5+1h+6T+84-8b+8i +u 1g 5-8i+6U+85-8c+8j +u 1g 5-8j+6V+86-8d+8k +u 1g 5-8k+6W+87-8e+8l +u 1g 5-8l+6X+88-8f+8m +u 1g 5-8m+6Y+89-8g+8n +u 1g 5-8n+6Z+8a-8h+8o +u 1g 5+1i-8p-7j+8b+8w +u 1g 5-8w-8q-7k+8c+8x +u 1g 5-8x-8r-7l+8d+8y +u 1g 5-8y-8s-7m+8e+8z +u 1g 5-8z-8t-7n+8f+8A +u 1g 5-8A-8u-7o+8g+8B +u 1g 5-8B-8v-7p+8h+8C +u 1g 5+g-8D-8K+8R+8Y +u 1g 5-8Y-8E-8L+8S+8Z +u 1g 5-8Z-8F-8M+8T+8% +u 1g 5-8%-8G-8N+8U+8@ +u 1g 5-8@-8H-8O+8V+90 +u 1g 5-90-8I-8P+8W+91 +u 1g 5-91-8J-8Q+8X+92 +u 1g 5+l+8K+93-9a+9h +u 1g 5-9h+8L+94-9b+9i +u 1g 5-9i+8M+95-9c+9j +u 1g 5-9j+8N+96-9d+9k +u 1g 5-9k+8O+97-9e+9l +u 1g 5-9l+8P+98-9f+9m +u 1g 5-9m+8Q+99-9g+9n +u 1g 5+Y-9o-8R+9v+9C +u 1g 5-9C-9p-8S+9w+9D +u 1g 5-9D-9q-8T+9x+9E +u 1g 5-9E-9r-8U+9y+9F +u 1g 5-9F-9s-8V+9z+9G +u 1g 5-9G-9t-8W+9A+9H +u 1g 5-9H-9u-8X+9B+9I +u 1g 5+Z+9J+9Q-9v+9X +u 1g 5-9X+9K+9R-9w+9Y +u 1g 5-9Y+9L+9S-9x+9Z +u 1g 5-9Z+9M+9T-9y+9% +u 1g 5-9%+9N+9U-9z+9@ +u 1g 5-9@+9O+9V-9A+a0 +u 1g 5-a0+9P+9W-9B+a1 +u 1g 5+1c+9a+a2-a9+ag +u 1g 5-ag+9b+a3-aa+ah +u 1g 5-ah+9c+a4-ab+ai +u 1g 5-ai+9d+a5-ac+aj +u 1g 5-aj+9e+a6-ad+ak +u 1g 5-ak+9f+a7-ae+al +u 1g 5-al+9g+a8-af+am +u 1g 5+1d-an-9J+a9+au +u 1g 5-au-ao-9K+aa+av +u 1g 5-av-ap-9L+ab+aw +u 1g 5-aw-aq-9M+ac+ax +u 1g 5-ax-ar-9N+ad+ay +u 1g 5-ay-as-9O+ae+az +u 1g 5-az-at-9P+af+aA +u 1g 5+m-aB-aI+aP+aW +u 1g 5-aW-aC-aJ+aQ+aX +u 1g 5-aX-aD-aK+aR+aY +u 1g 5-aY-aE-aL+aS+aZ +u 1g 5-aZ-aF-aM+aT+a% +u 1g 5-a%-aG-aN+aU+a@ +u 1g 5-a@-aH-aO+aV+b0 +u 1g 5+t-b1+b8-bf+bm +u 1g 5-bm-b2+b9-bg+bn +u 1g 5-bn-b3+ba-bh+bo +u 1g 5-bo-b4+bb-bi+bp +u 1g 5-bp-b5+bc-bj+bq +u 1g 5-bq-b6+bd-bk+br +u 1g 5-br-b7+be-bl+bs +u 1g 5+17+b1+bt-bA+bH +u 1g 5-bH+b2+bu-bB+bI +u 1g 5-bI+b3+bv-bC+bJ +u 1g 5-bJ+b4+bw-bD+bK +u 1g 5-bK+b5+bx-bE+bL +u 1g 5-bL+b6+by-bF+bM +u 1g 5-bM+b7+bz-bG+bN +u 1g 5+18-bO-aP+bA+bV +u 1g 5-bV-bP-aQ+bB+bW +u 1g 5-bW-bQ-aR+bC+bX +u 1g 5-bX-bR-aS+bD+bY +u 1g 5-bY-bS-aT+bE+bZ +u 1g 5-bZ-bT-aU+bF+b% +u 1g 5-b%-bU-aV+bG+b@ +u 1g 5+1D-c0-b8+c7+ce +u 1g 5-ce-c1-b9+c8+cf +u 1g 5-cf-c2-ba+c9+cg +u 1g 5-cg-c3-bb+ca+ch +u 1g 5-ch-c4-bc+cb+ci +u 1g 5-ci-c5-bd+cc+cj +u 1g 5-cj-c6-be+cd+ck +u 1g 5+1E+aI+cl-c7+cs +u 1g 5-cs+aJ+cm-c8+ct +u 1g 5-ct+aK+cn-c9+cu +u 1g 5-cu+aL+co-ca+cv +u 1g 5-cv+aM+cp-cb+cw +u 1g 5-cw+aN+cq-cc+cx +u 1g 5-cx+aO+cr-cd+cy +u 1g 5+o-cz-cG+cN+cU +u 1g 5-cU-cA-cH+cO+cV +u 1g 5-cV-cB-cI+cP+cW +u 1g 5-cW-cC-cJ+cQ+cX +u 1g 5-cX-cD-cK+cR+cY +u 1g 5-cY-cE-cL+cS+cZ +u 1g 5-cZ-cF-cM+cT+c% +u 1g 5+T-c@-d6+dd+dk +u 1g 5-dk-d0-d7+de+dl +u 1g 5-dl-d1-d8+df+dm +u 1g 5-dm-d2-d9+dg+dn +u 1g 5-dn-d3-da+dh+do +u 1g 5-do-d4-db+di+dp +u 1g 5-dp-d5-dc+dj+dq +u 1g 5+U+cG+dr-dd+dy +u 1g 5-dy+cH+ds-de+dz +u 1g 5-dz+cI+dt-df+dA +u 1g 5-dA+cJ+du-dg+dB +u 1g 5-dB+cK+dv-dh+dC +u 1g 5-dC+cL+dw-di+dD +u 1g 5-dD+cM+dx-dj+dE +u 1g 5+1e-dF-cN+dM+dT +u 1g 5-dT-dG-cO+dN+dU +u 1g 5-dU-dH-cP+dO+dV +u 1g 5-dV-dI-cQ+dP+dW +u 1g 5-dW-dJ-cR+dQ+dX +u 1g 5-dX-dK-cS+dR+dY +u 1g 5-dY-dL-cT+dS+dZ +u 1g 5+1f+d%+e5-dM+ec +u 1g 5-ec+d@+e6-dN+ed +u 1g 5-ed+e0+e7-dO+ee +u 1g 5-ee+e1+e8-dP+ef +u 1g 5-ef+e2+e9-dQ+eg +u 1g 5-eg+e3+ea-dR+eh +u 1g 5-eh+e4+eb-dS+ei +u 1g 5+1B+d6+ej-eq+ex +u 1g 5-ex+d7+ek-er+ey +u 1g 5-ey+d8+el-es+ez +u 1g 5-ez+d9+em-et+eA +u 1g 5-eA+da+en-eu+eB +u 1g 5-eB+db+eo-ev+eC +u 1g 5-eC+dc+ep-ew+eD +u 1g 5+1C-eE-d%+eq+eL +u 1g 5-eL-eF-d@+er+eM +u 1g 5-eM-eG-e0+es+eN +u 1g 5-eN-eH-e1+et+eO +u 1g 5-eO-eI-e2+eu+eP +u 1g 5-eP-eJ-e3+ev+eQ +u 1g 5-eQ-eK-e4+ew+eR +u 1g 5+5-eS-eZ+f4+fb +u 1g 5-fb-eT-e%+f5+fc +u 1g 5-fc-eU-e@+f6+fd +u 1g 5-fd-eV-f0+f7+fe +u 1g 5-fe-eW-f1+f8+ff +u 1g 5-ff-eX-f2+f9+fg +u 1g 5-fg-eY-f3+fa+fh +u 1g 5+h+fi+fp-fw+fD +u 1g 5-fD+fj+fq-fx+fE +u 1g 5-fE+fk+fr-fy+fF +u 1g 5-fF+fl+fs-fz+fG +u 1g 5-fG+fm+ft-fA+fH +u 1g 5-fH+fn+fu-fB+fI +u 1g 5-fI+fo+fv-fC+fJ +u 1g 5+%+fw+fK-fR+fY +u 1g 5-fY+fx+fL-fS+fZ +u 1g 5-fZ+fy+fM-fT+f% +u 1g 5-f%+fz+fN-fU+f@ +u 1g 5-f@+fA+fO-fV+g0 +u 1g 5-g0+fB+fP-fW+g1 +u 1g 5-g1+fC+fQ-fX+g2 +u 1g 5+@-g3-f4+fR+ga +u 1g 5-ga-g4-f5+fS+gb +u 1g 5-gb-g5-f6+fT+gc +u 1g 5-gc-g6-f7+fU+gd +u 1g 5-gd-g7-f8+fV+ge +u 1g 5-ge-g8-f9+fW+gf +u 1g 5-gf-g9-fa+fX+gg +u 1g 5+1S-gh-fi+go+gv +u 1g 5-gv-gi-fj+gp+gw +u 1g 5-gw-gj-fk+gq+gx +u 1g 5-gx-gk-fl+gr+gy +u 1g 5-gy-gl-fm+gs+gz +u 1g 5-gz-gm-fn+gt+gA +u 1g 5-gA-gn-fo+gu+gB +u 1g 5+1T+eZ+gC-go+gJ +u 1g 5-gJ+e%+gD-gp+gK +u 1g 5-gK+e@+gE-gq+gL +u 1g 5-gL+f0+gF-gr+gM +u 1g 5-gM+f1+gG-gs+gN +u 1g 5-gN+f2+gH-gt+gO +u 1g 5-gO+f3+gI-gu+gP +u 1g 5+d+eS+5s-gQ+gX +u 1g 5-gX+eT+5t-gR+gY +u 1g 5-gY+eU+5u-gS+gZ +u 1g 5-gZ+eV+5v-gT+g% +u 1g 5-g%+eW+5w-gU+g@ +u 1g 5-g@+eX+5x-gV+h0 +u 1g 5-h0+eY+5y-gW+h1 +u 1g 5+e-h2-h9+gQ+hg +u 1g 5-hg-h3-ha+gR+hh +u 1g 5-hh-h4-hb+gS+hi +u 1g 5-hi-h5-hc+gT+hj +u 1g 5-hj-h6-hd+gU+hk +u 1g 5-hk-h7-he+gV+hl +u 1g 5-hl-h8-hf+gW+hm +u 1g 5+1y+h9+hn-hu+hB +u 1g 5-hB+ha+ho-hv+hC +u 1g 5-hC+hb+hp-hw+hD +u 1g 5-hD+hc+hq-hx+hE +u 1g 5-hE+hd+hr-hy+hF +u 1g 5-hF+he+hs-hz+hG +u 1g 5-hG+hf+ht-hA+hH +u 1g 5+27-hI-gC+hu+hP +u 1g 5-hP-hJ-gD+hv+hQ +u 1g 5-hQ-hK-gE+hw+hR +u 1g 5-hR-hL-gF+hx+hS +u 1g 5-hS-hM-gG+hy+hT +u 1g 5-hT-hN-gH+hz+hU +u 1g 5-hU-hO-gI+hA+hV +u 1g 5+F-hW-i1+i8+if +u 1g 5-if-hX-i2+i9+ig +u 1g 5-ig-hY-i3+ia+ih +u 1g 5-ih-hZ-i4+ib+ii +u 1g 5-ii-h%-i5+ic+ij +u 1g 5-ij-h@-i6+id+ik +u 1g 5-ik-i0-i7+ie+il +u 1g 5+G+im+75-i8+it +u 1g 5-it+in+76-i9+iu +u 1g 5-iu+io+77-ia+iv +u 1g 5-iv+ip+78-ib+iw +u 1g 5-iw+iq+79-ic+ix +u 1g 5-ix+ir+7a-id+iy +u 1g 5-iy+is+7b-ie+iz +u 1g 5+L+iA+iH-iO+iV +u 1g 5-iV+iB+iI-iP+iW +u 1g 5-iW+iC+iJ-iQ+iX +u 1g 5-iX+iD+iK-iR+iY +u 1g 5-iY+iE+iL-iS+iZ +u 1g 5-iZ+iF+iM-iT+i% +u 1g 5-i%+iG+iN-iU+i@ +u 1g 5+1V-im+iO-j0+j7 +u 1g 5-j7-in+iP-j1+j8 +u 1g 5-j8-io+iQ-j2+j9 +u 1g 5-j9-ip+iR-j3+ja +u 1g 5-ja-iq+iS-j4+jb +u 1g 5-jb-ir+iT-j5+jc +u 1g 5-jc-is+iU-j6+jd +u 1g 5+1%+i1+je-jl+js +u 1g 5-js+i2+jf-jm+jt +u 1g 5-jt+i3+jg-jn+ju +u 1g 5-ju+i4+jh-jo+jv +u 1g 5-jv+i5+ji-jp+jw +u 1g 5-jw+i6+jj-jq+jx +u 1g 5-jx+i7+jk-jr+jy +u 1g 5+1@-jz-iA+jl+jG +u 1g 5-jG-jA-iB+jm+jH +u 1g 5-jH-jB-iC+jn+jI +u 1g 5-jI-jC-iD+jo+jJ +u 1g 5-jJ-jD-iE+jp+jK +u 1g 5-jK-jE-iF+jq+jL +u 1g 5-jL-jF-iG+jr+jM +u 1g 5+c-jN-jU+j@+k6 +u 1g 5-k6-jO-jV+k0+k7 +u 1g 5-k7-jP-jW+k1+k8 +u 1g 5-k8-jQ-jX+k2+k9 +u 1g 5-k9-jR-jY+k3+ka +u 1g 5-ka-jS-jZ+k4+kb +u 1g 5-kb-jT-j%+k5+kc +u 1g 5+r-kd-kk+kr+ky +u 1g 5-ky-ke-kl+ks+kz +u 1g 5-kz-kf-km+kt+kA +u 1g 5-kA-kg-kn+ku+kB +u 1g 5-kB-kh-ko+kv+kC +u 1g 5-kC-ki-kp+kw+kD +u 1g 5-kD-kj-kq+kx+kE +u 1g 5+M-kF-j@+kM+kT +u 1g 5-kT-kG-k0+kN+kU +u 1g 5-kU-kH-k1+kO+kV +u 1g 5-kV-kI-k2+kP+kW +u 1g 5-kW-kJ-k3+kQ+kX +u 1g 5-kX-kK-k4+kR+kY +u 1g 5-kY-kL-k5+kS+kZ +u 1g 5+N+kk+k%-kM+l5 +u 1g 5-l5+kl+k@-kN+l6 +u 1g 5-l6+km+l0-kO+l7 +u 1g 5-l7+kn+l1-kP+l8 +u 1g 5-l8+ko+l2-kQ+l9 +u 1g 5-l9+kp+l3-kR+la +u 1g 5-la+kq+l4-kS+lb +u 1g 5+2f+lc-kr+lj+lq +u 1g 5-lq+ld-ks+lk+lr +u 1g 5-lr+le-kt+ll+ls +u 1g 5-ls+lf-ku+lm+lt +u 1g 5-lt+lg-kv+ln+lu +u 1g 5-lu+lh-kw+lo+lv +u 1g 5-lv+li-kx+lp+lw +u 1g 5+2g+jU+lx-lj+lE +u 1g 5-lE+jV+ly-lk+lF +u 1g 5-lF+jW+lz-ll+lG +u 1g 5-lG+jX+lA-lm+lH +u 1g 5-lH+jY+lB-ln+lI +u 1g 5-lI+jZ+lC-lo+lJ +u 1g 5-lJ+j%+lD-lp+lK +u 1g 5+O-k%-6M+lL+lS +u 1g 5-lS-k@-6N+lM+lT +u 1g 5-lT-l0-6O+lN+lU +u 1g 5-lU-l1-6P+lO+lV +u 1g 5-lV-l2-6Q+lP+lW +u 1g 5-lW-l3-6R+lQ+lX +u 1g 5-lX-l4-6S+lR+lY +u 1g 5+1W-66-lZ+m4+mb +u 1g 5-mb-67-l%+m5+mc +u 1g 5-mc-68-l@+m6+md +u 1g 5-md-69-m0+m7+me +u 1g 5-me-6a-m1+m8+mf +u 1g 5-mf-6b-m2+m9+mg +u 1g 5-mg-6c-m3+ma+mh +u 1g 5+1X+7S+mi-m4+mp +u 1g 5-mp+7T+mj-m5+mq +u 1g 5-mq+7U+mk-m6+mr +u 1g 5-mr+7V+ml-m7+ms +u 1g 5-ms+7W+mm-m8+mt +u 1g 5-mt+7X+mn-m9+mu +u 1g 5-mu+7Y+mo-ma+mv +u 1g 5+2a-lL+lZ+mw+mD +u 1g 5-mD-lM+l%+mx+mE +u 1g 5-mE-lN+l@+my+mF +u 1g 5-mF-lO+m0+mz+mG +u 1g 5-mG-lP+m1+mA+mH +u 1g 5-mH-lQ+m2+mB+mI +u 1g 5-mI-lR+m3+mC+mJ +u 1g 5+i+mK+mR-mY+n3 +u 1g 5-n3+mL+mS-mZ+n4 +u 1g 5-n4+mM+mT-m%+n5 +u 1g 5-n5+mN+mU-m@+n6 +u 1g 5-n6+mO+mV-n0+n7 +u 1g 5-n7+mP+mW-n1+n8 +u 1g 5-n8+mQ+mX-n2+n9 +u 1g 5+V-na-mK+nh+no +u 1g 5-no-nb-mL+ni+np +u 1g 5-np-nc-mM+nj+nq +u 1g 5-nq-nd-mN+nk+nr +u 1g 5-nr-ne-mO+nl+ns +u 1g 5-ns-nf-mP+nm+nt +u 1g 5-nt-ng-mQ+nn+nu +u 1g 5+14-nv-nC+nJ+nQ +u 1g 5-nQ-nw-nD+nK+nR +u 1g 5-nR-nx-nE+nL+nS +u 1g 5-nS-ny-nF+nM+nT +u 1g 5-nT-nz-nG+nN+nU +u 1g 5-nU-nA-nH+nO+nV +u 1g 5-nV-nB-nI+nP+nW +u 1g 5+15+mY+nX-nJ+o2 +u 1g 5-o2+mZ+nY-nK+o3 +u 1g 5-o3+m%+nZ-nL+o4 +u 1g 5-o4+m@+n%-nM+o5 +u 1g 5-o5+n0+n@-nN+o6 +u 1g 5-o6+n1+o0-nO+o7 +u 1g 5-o7+n2+o1-nP+o8 +u 1g 5+26-nh+nC+o9+og +u 1g 5-og-ni+nD+oa+oh +u 1g 5-oh-nj+nE+ob+oi +u 1g 5-oi-nk+nF+oc+oj +u 1g 5-oj-nl+nG+od+ok +u 1g 5-ok-nm+nH+oe+ol +u 1g 5-ol-nn+nI+of+om +u 1g 5+19+on+ou-oB+oI +u 1g 5-oI+oo+ov-oC+oJ +u 1g 5-oJ+op+ow-oD+oK +u 1g 5-oK+oq+ox-oE+oL +u 1g 5-oL+or+oy-oF+oM +u 1g 5-oM+os+oz-oG+oN +u 1g 5-oN+ot+oA-oH+oO +u 1g 5+2b+oP-oW+p1+p8 +u 1g 5-p8+oQ-oX+p2+p9 +u 1g 5-p9+oR-oY+p3+pa +u 1g 5-pa+oS-oZ+p4+pb +u 1g 5-pb+oT-o%+p5+pc +u 1g 5-pc+oU-o@+p6+pd +u 1g 5-pd+oV-p0+p7+pe +u 1g 5+2c+pf+bO-p1+pm +u 1g 5-pm+pg+bP-p2+pn +u 1g 5-pn+ph+bQ-p3+po +u 1g 5-po+pi+bR-p4+pp +u 1g 5-pp+pj+bS-p5+pq +u 1g 5-pq+pk+bT-p6+pr +u 1g 5-pr+pl+bU-p7+ps +u 1g 5+2e-pf+oB-pt+pA +u 1g 5-pA-pg+oC-pu+pB +u 1g 5-pB-ph+oD-pv+pC +u 1g 5-pC-pi+oE-pw+pD +u 1g 5-pD-pj+oF-px+pE +u 1g 5-pE-pk+oG-py+pF +u 1g 5-pF-pl+oH-pz+pG +u 1g 5+2h+oW-pH-pO+pV +u 1g 5-pV+oX-pI-pP+pW +u 1g 5-pW+oY-pJ-pQ+pX +u 1g 5-pX+oZ-pK-pR+pY +u 1g 5-pY+o%-pL-pS+pZ +u 1g 5-pZ+o@-pM-pT+p% +u 1g 5-p%+p0-pN-pU+p@ +u 1g 5+2i-q0-on+pO+q7 +u 1g 5-q7-q1-oo+pP+q8 +u 1g 5-q8-q2-op+pQ+q9 +u 1g 5-q9-q3-oq+pR+qa +u 1g 5-qa-q4-or+pS+qb +u 1g 5-qb-q5-os+pT+qc +u 1g 5-qc-q6-ot+pU+qd +u 1g 5+X+57+g3-9Q+qe +u 1g 5-qe+58+g4-9R+qf +u 1g 5-qf+59+g5-9S+qg +u 1g 5-qg+5a+g6-9T+qh +u 1g 5-qh+5b+g7-9U+qi +u 1g 5-qi+5c+g8-9V+qj +u 1g 5-qj+5d+g9-9W+qk +u 1g 5+1b-e5-4O+an+ql +u 1g 5-ql-e6-4P+ao+qm +u 1g 5-qm-e7-4Q+ap+qn +u 1g 5-qn-e8-4R+aq+qo +u 1g 5-qo-e9-4S+ar+qp +u 1g 5-qp-ea-4T+as+qq +u 1g 5-qq-eb-4U+at+qr +u 1g 5+s-lc-qs+qz+qG +u 1g 5-qG-ld-qt+qA+qH +u 1g 5-qH-le-qu+qB+qI +u 1g 5-qI-lf-qv+qC+qJ +u 1g 5-qJ-lg-qw+qD+qK +u 1g 5-qK-lh-qx+qE+qL +u 1g 5-qL-li-qy+qF+qM +u 1g 5+u+qs+qN-qU+q@ +u 1g 5-q@+qt+qO-qV+r0 +u 1g 5-r0+qu+qP-qW+r1 +u 1g 5-r1+qv+qQ-qX+r2 +u 1g 5-r2+qw+qR-qY+r3 +u 1g 5-r3+qx+qS-qZ+r4 +u 1g 5-r4+qy+qT-q%+r5 +u 1g 5+16-bt-r6+rd+rk +u 1g 5-rk-bu-r7+re+rl +u 1g 5-rl-bv-r8+rf+rm +u 1g 5-rm-bw-r9+rg+rn +u 1g 5-rn-bx-ra+rh+ro +u 1g 5-ro-by-rb+ri+rp +u 1g 5-rp-bz-rc+rj+rq +u 1g 5+1Q-oP-rd+rr+ry +u 1g 5-ry-oQ-re+rs+rz +u 1g 5-rz-oR-rf+rt+rA +u 1g 5-rA-oS-rg+ru+rB +u 1g 5-rB-oT-rh+rv+rC +u 1g 5-rC-oU-ri+rw+rD +u 1g 5-rD-oV-rj+rx+rE +u 1g 5+1R+qU+rF-rr+rM +u 1g 5-rM+qV+rG-rs+rN +u 1g 5-rN+qW+rH-rt+rO +u 1g 5-rO+qX+rI-ru+rP +u 1g 5-rP+qY+rJ-rv+rQ +u 1g 5-rQ+qZ+rK-rw+rR +u 1g 5-rR+q%+rL-rx+rS +u 1g 5+24-qz+r6-rT+r% +u 1g 5-r%-qA+r7-rU+r@ +u 1g 5-r@-qB+r8-rV+s0 +u 1g 5-s0-qC+r9-rW+s1 +u 1g 5-s1-qD+ra-rX+s2 +u 1g 5-s2-qE+rb-rY+s3 +u 1g 5-s3-qF+rc-rZ+s4 +u 1g 5+n-s5-93+aB+sc +u 1g 5-sc-s6-94+aC+sd +u 1g 5-sd-s7-95+aD+se +u 1g 5-se-s8-96+aE+sf +u 1g 5-sf-s9-97+aF+sg +u 1g 5-sg-sa-98+aG+sh +u 1g 5-sh-sb-99+aH+si +u 1g 5+1I+8D+sj-cl+sq +u 1g 5-sq+8E+sk-cm+sr +u 1g 5-sr+8F+sl-cn+ss +u 1g 5-ss+8G+sm-co+st +u 1g 5-st+8H+sn-cp+su +u 1g 5-su+8I+so-cq+sv +u 1g 5-sv+8J+sp-cr+sw +u 1g 5+y+sx+sE-sL+sS +u 1g 5-sS+sy+sF-sM+sT +u 1g 5-sT+sz+sG-sN+sU +u 1g 5-sU+sA+sH-sO+sV +u 1g 5-sV+sB+sI-sP+sW +u 1g 5-sW+sC+sJ-sQ+sX +u 1g 5-sX+sD+sK-sR+sY +u 1g 5+z+sL+sZ-t4+tb +u 1g 5-tb+sM+s%-t5+tc +u 1g 5-tc+sN+s@-t6+td +u 1g 5-td+sO+t0-t7+te +u 1g 5-te+sP+t1-t8+tf +u 1g 5-tf+sQ+t2-t9+tg +u 1g 5-tg+sR+t3-ta+th +u 1g 5+1p-ti-sx+tp+tw +u 1g 5-tw-tj-sy+tq+tx +u 1g 5-tx-tk-sz+tr+ty +u 1g 5-ty-tl-sA+ts+tz +u 1g 5-tz-tm-sB+tt+tA +u 1g 5-tA-tn-sC+tu+tB +u 1g 5-tB-to-sD+tv+tC +u 1g 5+1s+tD+tK-tp+tR +u 1g 5-tR+tE+tL-tq+tS +u 1g 5-tS+tF+tM-tr+tT +u 1g 5-tT+tG+tN-ts+tU +u 1g 5-tU+tH+tO-tt+tV +u 1g 5-tV+tI+tP-tu+tW +u 1g 5-tW+tJ+tQ-tv+tX +u 1g 5+1F-tY-tD+u3+ua +u 1g 5-ua-tZ-tE+u4+ub +u 1g 5-ub-t%-tF+u5+uc +u 1g 5-uc-t@-tG+u6+ud +u 1g 5-ud-u0-tH+u7+ue +u 1g 5-ue-u1-tI+u8+uf +u 1g 5-uf-u2-tJ+u9+ug +u 1g 5+1G+t4+c0-u3+uh +u 1g 5-uh+t5+c1-u4+ui +u 1g 5-ui+t6+c2-u5+uj +u 1g 5-uj+t7+c3-u6+uk +u 1g 5-uk+t8+c4-u7+ul +u 1g 5-ul+t9+c5-u8+um +u 1g 5-um+ta+c6-u9+un +u 1g 5+1+2l-uo+uv+uC +u 1g 5-uC+2m-up+uw+uD +u 1g 5-uD+2n-uq+ux+uE +u 1g 5-uE+2o-ur+uy+uF +u 1g 5-uF+2p-us+uz+uG +u 1g 5-uG+2q-ut+uA+uH +u 1g 5-uH+2r-uu+uB+uI +u 1g 5+2+2s-uv+uJ+uQ +u 1g 5-uQ+2t-uw+uK+uR +u 1g 5-uR+2u-ux+uL+uS +u 1g 5-uS+2v-uy+uM+uT +u 1g 5-uT+2w-uz+uN+uU +u 1g 5-uU+2x-uA+uO+uV +u 1g 5-uV+2y-uB+uP+uW +u 1g 5+Q-dr+uo-uX+v2 +u 1g 5-v2-ds+up-uY+v3 +u 1g 5-v3-dt+uq-uZ+v4 +u 1g 5-v4-du+ur-u%+v5 +u 1g 5-v5-dv+us-u@+v6 +u 1g 5-v6-dw+ut-v0+v7 +u 1g 5-v7-dx+uu-v1+v8 +u 1g 5+1K-uJ+v9+vg+vn +u 1g 5-vn-uK+va+vh+vo +u 1g 5-vo-uL+vb+vi+vp +u 1g 5-vp-uM+vc+vj+vq +u 1g 5-vq-uN+vd+vk+vr +u 1g 5-vr-uO+ve+vl+vs +u 1g 5-vs-uP+vf+vm+vt +u 1g 5+1O+cz+vu-v9+vB +u 1g 5-vB+cA+vv-va+vC +u 1g 5-vC+cB+vw-vb+vD +u 1g 5-vD+cC+vx-vc+vE +u 1g 5-vE+cD+vy-vd+vF +u 1g 5-vF+cE+vz-ve+vG +u 1g 5-vG+cF+vA-vf+vH +u 1g 5+1z-vI-5N+eE+vP +u 1g 5-vP-vJ-5O+eF+vQ +u 1g 5-vQ-vK-5P+eG+vR +u 1g 5-vR-vL-5Q+eH+vS +u 1g 5-vS-vM-5R+eI+vT +u 1g 5-vT-vN-5S+eJ+vU +u 1g 5-vU-vO-5T+eK+vV +u 1g 5+4+vW+3x-w1+w8 +u 1g 5-w8+vX+3y-w2+w9 +u 1g 5-w9+vY+3z-w3+wa +u 1g 5-wa+vZ+3A-w4+wb +u 1g 5-wb+v%+3B-w5+wc +u 1g 5-wc+v@+3C-w6+wd +u 1g 5-wd+w0+3D-w7+we +u 1g 5+8-vW+gh+wf+wm +u 1g 5-wm-vX+gi+wg+wn +u 1g 5-wn-vY+gj+wh+wo +u 1g 5-wo-vZ+gk+wi+wp +u 1g 5-wp-v%+gl+wj+wq +u 1g 5-wq-v@+gm+wk+wr +u 1g 5-wr-w0+gn+wl+ws +u 1g 5+11-nX-fp+wt+wA +u 1g 5-wA-nY-fq+wu+wB +u 1g 5-wB-nZ-fr+wv+wC +u 1g 5-wC-n%-fs+ww+wD +u 1g 5-wD-n@-ft+wx+wE +u 1g 5-wE-o0-fu+wy+wF +u 1g 5-wF-o1-fv+wz+wG +u 1g 5+13-wt+w1-wH+wO +u 1g 5-wO-wu+w2-wI+wP +u 1g 5-wP-wv+w3-wJ+wQ +u 1g 5-wQ-ww+w4-wK+wR +u 1g 5-wR-wx+w5-wL+wS +u 1g 5-wS-wy+w6-wM+wT +u 1g 5-wT-wz+w7-wN+wU +u 1g 5+7+wV+3E-wf+x0 +u 1g 5-x0+wW+3F-wg+x1 +u 1g 5-x1+wX+3G-wh+x2 +u 1g 5-x2+wY+3H-wi+x3 +u 1g 5-x3+wZ+3I-wj+x4 +u 1g 5-x4+w%+3J-wk+x5 +u 1g 5-x5+w@+3K-wl+x6 +u 1g 5+B-wV+hI+x7+xe +u 1g 5-xe-wW+hJ+x8+xf +u 1g 5-xf-wX+hK+x9+xg +u 1g 5-xg-wY+hL+xa+xh +u 1g 5-xh-wZ+hM+xb+xi +u 1g 5-xi-w%+hN+xc+xj +u 1g 5-xj-w@+hO+xd+xk +u 1g 5+K+xl+xs-7x+xz +u 1g 5-xz+xm+xt-7y+xA +u 1g 5-xA+xn+xu-7z+xB +u 1g 5-xB+xo+xv-7A+xC +u 1g 5-xC+xp+xw-7B+xD +u 1g 5-xD+xq+xx-7C+xE +u 1g 5-xE+xr+xy-7D+xF +u 1g 5+1U-xG-xl+j0+xN +u 1g 5-xN-xH-xm+j1+xO +u 1g 5-xO-xI-xn+j2+xP +u 1g 5-xP-xJ-xo+j3+xQ +u 1g 5-xQ-xK-xp+j4+xR +u 1g 5-xR-xL-xq+j5+xS +u 1g 5-xS-xM-xr+j6+xT +u 1g 5+J+h2+xU-xs+x@ +u 1g 5-x@+h3+xV-xt+y0 +u 1g 5-y0+h4+xW-xu+y1 +u 1g 5-y1+h5+xX-xv+y2 +u 1g 5-y2+h6+xY-xw+y3 +u 1g 5-y3+h7+xZ-xx+y4 +u 1g 5-y4+h8+x%-xy+y5 +u 1g 5+1x+xG+y6-hn+yd +u 1g 5-yd+xH+y7-ho+ye +u 1g 5-ye+xI+y8-hp+yf +u 1g 5-yf+xJ+y9-hq+yg +u 1g 5-yg+xK+ya-hr+yh +u 1g 5-yh+xL+yb-hs+yi +u 1g 5-yi+xM+yc-ht+yj +u 1g 5+9+yk+3L-yr+yy +u 1g 5-yy+yl+3M-ys+yz +u 1g 5-yz+ym+3N-yt+yA +u 1g 5-yA+yn+3O-yu+yB +u 1g 5-yB+yo+3P-yv+yC +u 1g 5-yC+yp+3Q-yw+yD +u 1g 5-yD+yq+3R-yx+yE +u 1g 5+1v-yk+jz+yF+yM +u 1g 5-yM-yl+jA+yG+yN +u 1g 5-yN-ym+jB+yH+yO +u 1g 5-yO-yn+jC+yI+yP +u 1g 5-yP-yo+jD+yJ+yQ +u 1g 5-yQ-yp+jE+yK+yR +u 1g 5-yR-yq+jF+yL+yS +u 1g 5+22-y6-iH+yT+y% +u 1g 5-y%-y7-iI+yU+y@ +u 1g 5-y@-y8-iJ+yV+z0 +u 1g 5-z0-y9-iK+yW+z1 +u 1g 5-z1-ya-iL+yX+z2 +u 1g 5-z2-yb-iM+yY+z3 +u 1g 5-z3-yc-iN+yZ+z4 +u 1g 5+28+yr-z5-yT+zc +u 1g 5-zc+ys-z6-yU+zd +u 1g 5-zd+yt-z7-yV+ze +u 1g 5-ze+yu-z8-yW+zf +u 1g 5-zf+yv-z9-yX+zg +u 1g 5-zg+yw-za-yY+zh +u 1g 5-zh+yx-zb-yZ+zi +u 1g 5+a+2z-zj+zq+zx +u 1g 5-zx+2A-zk+zr+zy +u 1g 5-zy+2B-zl+zs+zz +u 1g 5-zz+2C-zm+zt+zA +u 1g 5-zA+2D-zn+zu+zB +u 1g 5-zB+2E-zo+zv+zC +u 1g 5-zC+2F-zp+zw+zD +u 1g 5+q-lx+zj-zE+zL +u 1g 5-zL-ly+zk-zF+zM +u 1g 5-zM-lz+zl-zG+zN +u 1g 5-zN-lA+zm-zH+zO +u 1g 5-zO-lB+zn-zI+zP +u 1g 5-zP-lC+zo-zJ+zQ +u 1g 5-zQ-lD+zp-zK+zR +u 1g 5+P+jN+c@-zS+zZ +u 1g 5-zZ+jO+d0-zT+z% +u 1g 5-z%+jP+d1-zU+z@ +u 1g 5-z@+jQ+d2-zV+A0 +u 1g 5-A0+jR+d3-zW+A1 +u 1g 5-A1+jS+d4-zX+A2 +u 1g 5-A2+jT+d5-zY+A3 +u 1g 5+R-zq+zS+A4+Ab +u 1g 5-Ab-zr+zT+A5+Ac +u 1g 5-Ac-zs+zU+A6+Ad +u 1g 5-Ad-zt+zV+A7+Ae +u 1g 5-Ae-zu+zW+A8+Af +u 1g 5-Af-zv+zX+A9+Ag +u 1g 5-Ag-zw+zY+Aa+Ah +u 1g 5+1g+kd+Ai-84+Ap +u 1g 5-Ap+ke+Aj-85+Aq +u 1g 5-Aq+kf+Ak-86+Ar +u 1g 5-Ar+kg+Al-87+As +u 1g 5-As+kh+Am-88+At +u 1g 5-At+ki+An-89+Au +u 1g 5-Au+kj+Ao-8a+Av +u 1g 5+1A+kF+Aw-ej+AD +u 1g 5-AD+kG+Ax-ek+AE +u 1g 5-AE+kH+Ay-el+AF +u 1g 5-AF+kI+Az-em+AG +u 1g 5-AG+kJ+AA-en+AH +u 1g 5-AH+kK+AB-eo+AI +u 1g 5-AI+kL+AC-ep+AJ +u 1g 5+1Y-mi-xU+6r+AK +u 1g 5-AK-mj-xV+6s+AL +u 1g 5-AL-mk-xW+6t+AM +u 1g 5-AM-ml-xX+6u+AN +u 1g 5-AN-mm-xY+6v+AO +u 1g 5-AO-mn-xZ+6w+AP +u 1g 5-AP-mo-x%+6x+AQ +u 1g 5+W-fK-mR+9o+AR +u 1g 5-AR-fL-mS+9p+AS +u 1g 5-AS-fM-mT+9q+AT +u 1g 5-AT-fN-mU+9r+AU +u 1g 5-AU-fO-mV+9s+AV +u 1g 5-AV-fP-mW+9t+AW +u 1g 5-AW-fQ-mX+9u+AX +u 1g 5+1H+na+tY-sj+AY +u 1g 5-AY+nb+tZ-sk+AZ +u 1g 5-AZ+nc+t%-sl+A% +u 1g 5-A%+nd+t@-sm+A@ +u 1g 5-A@+ne+u0-sn+B0 +u 1g 5-B0+nf+u1-so+B1 +u 1g 5-B1+ng+u2-sp+B2 +u 1g 5+j+B3+3S-Ba+Bh +u 1g 5-Bh+B4+3T-Bb+Bi +u 1g 5-Bi+B5+3U-Bc+Bj +u 1g 5-Bj+B6+3V-Bd+Bk +u 1g 5-Bk+B7+3W-Be+Bl +u 1g 5-Bl+B8+3X-Bf+Bm +u 1g 5-Bm+B9+3Y-Bg+Bn +u 1g 5+10-B3+nv+Bo+Bv +u 1g 5-Bv-B4+nw+Bp+Bw +u 1g 5-Bw-B5+nx+Bq+Bx +u 1g 5-Bx-B6+ny+Br+By +u 1g 5-By-B7+nz+Bs+Bz +u 1g 5-Bz-B8+nA+Bt+BA +u 1g 5-BA-B9+nB+Bu+BB +u 1g 5+1r-BC+Ba-BJ+BQ +u 1g 5-BQ-BD+Bb-BK+BR +u 1g 5-BR-BE+Bc-BL+BS +u 1g 5-BS-BF+Bd-BM+BT +u 1g 5-BT-BG+Be-BN+BU +u 1g 5-BU-BH+Bf-BO+BV +u 1g 5-BV-BI+Bg-BP+BW +u 1g 5+25+BC-tK-o9+BX +u 1g 5-BX+BD-tL-oa+BY +u 1g 5-BY+BE-tM-ob+BZ +u 1g 5-BZ+BF-tN-oc+B% +u 1g 5-B%+BG-tO-od+B@ +u 1g 5-B@+BH-tP-oe+C0 +u 1g 5-C0+BI-tQ-of+C1 +u 1g 5+k+2G-C2+C9+Cg +u 1g 5-Cg+2H-C3+Ca+Ch +u 1g 5-Ch+2I-C4+Cb+Ci +u 1g 5-Ci+2J-C5+Cc+Cj +u 1g 5-Cj+2K-C6+Cd+Ck +u 1g 5-Ck+2L-C7+Ce+Cl +u 1g 5-Cl+2M-C8+Cf+Cm +u 1g 5+1m-C9+q0+Cn+Cu +u 1g 5-Cu-Ca+q1+Co+Cv +u 1g 5-Cv-Cb+q2+Cp+Cw +u 1g 5-Cw-Cc+q3+Cq+Cx +u 1g 5-Cx-Cd+q4+Cr+Cy +u 1g 5-Cy-Ce+q5+Cs+Cz +u 1g 5-Cz-Cf+q6+Ct+CA +u 1g 5+1L-CB+C2-CI+CP +u 1g 5-CP-CC+C3-CJ+CQ +u 1g 5-CQ-CD+C4-CK+CR +u 1g 5-CR-CE+C5-CL+CS +u 1g 5-CS-CF+C6-CM+CT +u 1g 5-CT-CG+C7-CN+CU +u 1g 5-CU-CH+C8-CO+CV +u 1g 5+1M-CW-ou+CB+D1 +u 1g 5-D1-CX-ov+CC+D2 +u 1g 5-D2-CY-ow+CD+D3 +u 1g 5-D3-CZ-ox+CE+D4 +u 1g 5-D4-C%-oy+CF+D5 +u 1g 5-D5-C@-oz+CG+D6 +u 1g 5-D6-D0-oA+CH+D7 +u 1g 5+1a+D8+dF-a2+Df +u 1g 5-Df+D9+dG-a3+Dg +u 1g 5-Dg+Da+dH-a4+Dh +u 1g 5-Dh+Db+dI-a5+Di +u 1g 5-Di+Dc+dJ-a6+Dj +u 1g 5-Dj+Dd+dK-a7+Dk +u 1g 5-Dk+De+dL-a8+Dl +u 1g 5+1Z-Dm-D8+Dt+DA +u 1g 5-DA-Dn-D9+Du+DB +u 1g 5-DB-Do-Da+Dv+DC +u 1g 5-DC-Dp-Db+Dw+DD +u 1g 5-DD-Dq-Dc+Dx+DE +u 1g 5-DE-Dr-Dd+Dy+DF +u 1g 5-DF-Ds-De+Dz+DG +u 1g 5+2d-Dt+s5+pt+DH +u 1g 5-DH-Du+s6+pu+DI +u 1g 5-DI-Dv+s7+pv+DJ +u 1g 5-DJ-Dw+s8+pw+DK +u 1g 5-DK-Dx+s9+px+DL +u 1g 5-DL-Dy+sa+py+DM +u 1g 5-DM-Dz+sb+pz+DN +u 1g 5+1N+Dm+CW-vu+DO +u 1g 5-DO+Dn+CX-vv+DP +u 1g 5-DP+Do+CY-vw+DQ +u 1g 5-DQ+Dp+CZ-vx+DR +u 1g 5-DR+Dq+C%-vy+DS +u 1g 5-DS+Dr+C@-vz+DT +u 1g 5-DT+Ds+D0-vA+DU +u 1g 5+p+2N-DV+zE+E0 +u 1g 5-E0+2O-DW+zF+E1 +u 1g 5-E1+2P-DX+zG+E2 +u 1g 5-E2+2Q-DY+zH+E3 +u 1g 5-E3+2R-DZ+zI+E4 +u 1g 5-E4+2S-D%+zJ+E5 +u 1g 5-E5+2T-D@+zK+E6 +u 1g 5+v-qN+DV-E7+Ee +u 1g 5-Ee-qO+DW-E8+Ef +u 1g 5-Ef-qP+DX-E9+Eg +u 1g 5-Eg-qQ+DY-Ea+Eh +u 1g 5-Eh-qR+DZ-Eb+Ei +u 1g 5-Ei-qS+D%-Ec+Ej +u 1g 5-Ej-qT+D@-Ed+Ek +u 1g 5+23+El-Ai+rT+Es +u 1g 5-Es+Em-Aj+rU+Et +u 1g 5-Et+En-Ak+rV+Eu +u 1g 5-Eu+Eo-Al+rW+Ev +u 1g 5-Ev+Ep-Am+rX+Ew +u 1g 5-Ew+Eq-An+rY+Ex +u 1g 5-Ex+Er-Ao+rZ+Ey +u 1g 5+1k-El+bf+Ez+EG +u 1g 5-EG-Em+bg+EA+EH +u 1g 5-EH-En+bh+EB+EI +u 1g 5-EI-Eo+bi+EC+EJ +u 1g 5-EJ-Ep+bj+ED+EK +u 1g 5-EK-Eq+bk+EE+EL +u 1g 5-EL-Er+bl+EF+EM +u 1g 5+w+2U-EN+E7+EU +u 1g 5-EU+2V-EO+E8+EV +u 1g 5-EV+2W-EP+E9+EW +u 1g 5-EW+2X-EQ+Ea+EX +u 1g 5-EX+2Y-ER+Eb+EY +u 1g 5-EY+2Z-ES+Ec+EZ +u 1g 5-EZ+2%-ET+Ed+E% +u 1g 5+1l-E@+EN-F6+Fd +u 1g 5-Fd-F0+EO-F7+Fe +u 1g 5-Fe-F1+EP-F8+Ff +u 1g 5-Ff-F2+EQ-F9+Fg +u 1g 5-Fg-F3+ER-Fa+Fh +u 1g 5-Fh-F4+ES-Fb+Fi +u 1g 5-Fi-F5+ET-Fc+Fj +u 1g 5+1P+E@+pH-rF+Fk +u 1g 5-Fk+F0+pI-rG+Fl +u 1g 5-Fl+F1+pJ-rH+Fm +u 1g 5-Fm+F2+pK-rI+Fn +u 1g 5-Fn+F3+pL-rJ+Fo +u 1g 5-Fo+F4+pM-rK+Fp +u 1g 5-Fp+F5+pN-rL+Fq +u 1g 5+x+Fr+3Z-Fy+FF +u 1g 5-FF+Fs+3%-Fz+FG +u 1g 5-FG+Ft+3@-FA+FH +u 1g 5-FH+Fu+40-FB+FI +u 1g 5-FI+Fv+41-FC+FJ +u 1g 5-FJ+Fw+42-FD+FK +u 1g 5-FK+Fx+43-FE+FL +u 1g 5+1o-Fr+ti+FM+FT +u 1g 5-FT-Fs+tj+FN+FU +u 1g 5-FU-Ft+tk+FO+FV +u 1g 5-FV-Fu+tl+FP+FW +u 1g 5-FW-Fv+tm+FQ+FX +u 1g 5-FX-Fw+tn+FR+FY +u 1g 5-FY-Fx+to+FS+FZ +u 1g 5+1t-F%+Fy-G5+Gc +u 1g 5-Gc-F@+Fz-G6+Gd +u 1g 5-Gd-G0+FA-G7+Ge +u 1g 5-Ge-G1+FB-G8+Gf +u 1g 5-Gf-G2+FC-G9+Gg +u 1g 5-Gg-G3+FD-Ga+Gh +u 1g 5-Gh-G4+FE-Gb+Gi +u 1g 5+1u-je-sE+F%+Gj +u 1g 5-Gj-jf-sF+F@+Gk +u 1g 5-Gk-jg-sG+G0+Gl +u 1g 5-Gl-jh-sH+G1+Gm +u 1g 5-Gm-ji-sI+G2+Gn +u 1g 5-Gn-jj-sJ+G3+Go +u 1g 5-Go-jk-sK+G4+Gp +u 1g 5+E-Gq-sZ+hW+Gx +u 1g 5-Gx-Gr-s%+hX+Gy +u 1g 5-Gy-Gs-s@+hY+Gz +u 1g 5-Gz-Gt-t0+hZ+GA +u 1g 5-GA-Gu-t1+h%+GB +u 1g 5-GB-Gv-t2+h@+GC +u 1g 5-GC-Gw-t3+i0+GD +u 1g 5+1j+Gq+8p-Ez+GE +u 1g 5-GE+Gr+8q-EA+GF +u 1g 5-GF+Gs+8r-EB+GG +u 1g 5-GG+Gt+8s-EC+GH +u 1g 5-GH+Gu+8t-ED+GI +u 1g 5-GI+Gv+8u-EE+GJ +u 1g 5-GJ+Gw+8v-EF+GK +u 1g 5+29+vI-Aw-mw+GL +u 1g 5-GL+vJ-Ax-mx+GM +u 1g 5-GM+vK-Ay-my+GN +u 1g 5-GN+vL-Az-mz+GO +u 1g 5-GO+vM-AA-mA+GP +u 1g 5-GP+vN-AB-mB+GQ +u 1g 5-GQ+vO-AC-mC+GR +u 1g 5+S+2@-A4+uX+GS +u 1g 5-GS+30-A5+uY+GT +u 1g 5-GT+31-A6+uZ+GU +u 1g 5-GU+32-A7+u%+GV +u 1g 5-GV+33-A8+u@+GW +u 1g 5-GW+34-A9+v0+GX +u 1g 5-GX+35-Aa+v1+GY +u 1g 5+12+wH+4b-Bo+GZ +u 1g 5-GZ+wI+4c-Bp+G% +u 1g 5-G%+wJ+4d-Bq+G@ +u 1g 5-G@+wK+4e-Br+H0 +u 1g 5-H0+wL+4f-Bs+H1 +u 1g 5-H1+wM+4g-Bt+H2 +u 1g 5-H2+wN+4h-Bu+H3 +u 1g 5+1n+36-Cn+F6+H4 +u 1g 5-H4+37-Co+F7+H5 +u 1g 5-H5+38-Cp+F8+H6 +u 1g 5-H6+39-Cq+F9+H7 +u 1g 5-H7+3a-Cr+Fa+H8 +u 1g 5-H8+3b-Cs+Fb+H9 +u 1g 5-H9+3c-Ct+Fc+Ha +u 1g 5+1q+BJ+4i-FM+Hb +u 1g 5-Hb+BK+4j-FN+Hc +u 1g 5-Hc+BL+4k-FO+Hd +u 1g 5-Hd+BM+4l-FP+He +u 1g 5-He+BN+4m-FQ+Hf +u 1g 5-Hf+BO+4n-FR+Hg +u 1g 5-Hg+BP+4o-FS+Hh +u 1g 5+1w+G5+4p-yF+Hi +u 1g 5-Hi+G6+4q-yG+Hj +u 1g 5-Hj+G7+4r-yH+Hk +u 1g 5-Hk+G8+4s-yI+Hl +u 1g 5-Hl+G9+4t-yJ+Hm +u 1g 5-Hm+Ga+4u-yK+Hn +u 1g 5-Hn+Gb+4v-yL+Ho +u 1g 5+C+z5+44-x7+Hp +u 1g 5-Hp+z6+45-x8+Hq +u 1g 5-Hq+z7+46-x9+Hr +u 1g 5-Hr+z8+47-xa+Hs +u 1g 5-Hs+z9+48-xb+Ht +u 1g 5-Ht+za+49-xc+Hu +u 1g 5-Hu+zb+4a-xd+Hv +u 1g 5+1J+3d-vg+CI+Hw +u 1g 5-Hw+3e-vh+CJ+Hx +u 1g 5-Hx+3f-vi+CK+Hy +u 1g 5-Hy+3g-vj+CL+Hz +u 1g 5-Hz+3h-vk+CM+HA +u 1g 5-HA+3i-vl+CN+HB +u 1g 5-HB+3j-vm+CO+HC +u 0 4+4C+HD+HE-Bn +u 0 4+4F-Hh+HF+HG +u 0 4-BW+HH-HE-HF +u 0 4-FL+HI+4G+HJ +u 0 4-HG-HI-FZ-HK +u 0 4+4x-we+HL+HM +u 0 4+4B-H3+HN+HO +u 0 4-HL+HP+HQ-ws +u 0 4-HR-HM-wU-HN +u 0 4+4z+HS-yE+HT +u 0 4+4E+HU-Ho+HV +u 0 4-HS+HW-zi+HX +u 0 4-yS-HT+HY-HU +u 0 4-8C-GK+HZ+H% +u 0 4+4y-H@-Hv-HW +u 0 4-HP+4w+I0-x6 +u 0 4-Fj+I1+I2+I3 +u 0 4+3q+I4+I5-Cm +u 0 4+3t+I6-Ha-I3 +u 0 4-E%+3u-I2+I7 +u 0 4-I4-I6+I8-CA +u 0 4-vt+I9+Ia+Ib +u 0 4-CV+Ic+Id+Ie +u 0 4+3l+Ig-uW-I9 +u 0 4+3p-Ib-HC-Ie +u 0 4-Id-I5+3o+Ih +u 0 4-Ig+3k-uI+Ii +u 0 4-E6+3s+Ij+Ik +u 0 4-Ik-zR+In+Io +u 0 4+3n-zD+Ip-In +u 0 4-Il+3r+Iq-I7 +u 0 4-Iq-Im-Ek-Ij +u 0 4-v8-If-Ii+Ir +u 0 4-Iu+H@+Is+It +u 0 4+Iw-It+Iv-xk +u 0 4-IC+Ix+IA+Iz +u 0 4-IH+IJ+IE-Ix +u 0 4-II+IH+ID-IG +u 0 4-IU+IV+IP+IS +u 0 4-IT+IU+IQ-IO +u 0 4-J1+IY-Iz-HH +u 0 4+J1+J0+J2+IZ +u 0 4-J2+I%+I@-Iy +u 0 4-Je+Ja-I%-J5 +u 0 4-Ja+Jf+J7+Jb +u 0 4-Jf+Jd+J8+J9 +u 0 4-Jd+Je-IZ+Jc +u 0 4-Ji-ID-JJ+Jh +u 0 4-Jp-Jk-J8+J3 +u 0 4-Jq-Jm-Jo-J6 +u 0 4-Jr+Jt+Jp-Jl +u 0 4-Js+Jr+J4-Jn +u 0 4-Jt+Js-J7+Jq +u 0 4-Ju+Jv-Xd-IK +u 0 4-Jv+Jx-Jh-IL +u 0 4-Jx+Jw-Jg-IM +u 0 4+JB+Jo+Jz-HQ +u 0 4-JB+HR+JA+Jn +u 0 4+JI-tC+JF+JC +u 0 4-JL+JM-JC+JJ +u 0 4-JM+JN-JD-JK +u 0 4+JO-IA+IG+HK +u 0 4-JW+JK+JU-JQ +u 0 4+K2-K0+J%-HX +u 0 4-K2-HY+J@-K1 +u 0 4+K9+K8+K5-wG +u 0 4-K9-o8+K6+K7 +u 0 4+Kf-Kd+Kg+Ka +u 0 4-Kg+Kb-Ke-Kc +u 0 4-Kl+Kk+Kh+Kj +u 0 4-Ko+Kq+Kn-Kh +u 0 4-Kq+Kp+Km-Ki +u 0 4-Ku-Kr-K6+Kt +u 0 4-Xg+Kd+JP+Kw +u 0 4-KB+Jm+Kz+KA +u 0 4+KC-nW+Kx+Jk +u 0 4-KL+KH-JS+KG +u 0 4-KH+KK+KF-Ky +u 0 4-KK+KI+KE-Kz +u 0 4-KI+KL+KJ+JY +u 0 4-KJ-JT+KD+JX +u 0 4-KS+KQ+KP-KN +u 0 4-KP-KA-KM-Jz +u 0 4-KQ+KR-JA-K8 +u 0 4-KW-JH+KT+KV +u 0 4-KX-JG+KW+KU +u 0 4-K%-KT+KY+KZ +u 0 4-L2+K@-Kn-KY +u 0 4-La+KO+Kr+L9 +u 0 4+Lb+L7-gB+KM +u 0 4+Lt+Ls+Lp-ug +u 0 4-Lt-B2+Lq+Lr +u 0 4+Lw+Lx-Lq+Lu +u 0 4-Lx+Lv+Kc-Lp +u 0 4-LD+LC-Ln+Lz +u 0 4-LC+LF-Lm-Ls +u 0 4-LE+LD+LB+LA +u 0 4-LQ+LS-LM+LO +u 0 4-LS+LR+LP-LA +u 0 4-LO+LJ-Ly-LL +u 0 4-LP+LG-LK-Lz +u 0 4-L%+LX+LL-Lu +u 0 4-M0+L%+LM+LY +u 0 4-LY-Lv+LK+LW +u 0 4-M5+M3+M1+M2 +u 0 4-Mb+Mc+Ma-M1 +u 0 4+Me+Lc-Md-hV +u 0 4+Mj+Mi+Mf-7w +u 0 4-Mj-7R+Mg+Mh +u 0 4+Mm-Ll+Mk-GD +u 0 4-Mt+Mn+Mq-Mi +u 0 4-Mv+Mx+Mt+Mo +u 0 4-Mw+Mv-Mh+Ms +u 0 4-Mx+Mw+Mp+Mu +u 0 4+MH+MG-Ms-xF +u 0 4-MH-y5-Mr+MF +u 0 4-MN+MA+MK-MM +u 0 4-MO+MC-MG+MI +u 0 4-MP+MR+MN+MB +u 0 4-MQ+MP-ML-MF +u 0 4-MR+MQ+MJ+MO +u 0 4-MW-LJ-MU+MS +u 0 4+Na+Nb+N7+N5 +u 0 4-Nb+N6+N9+N8 +u 0 4-Nf-N4+Nc+MX +u 0 4-Ng+Ni+Nf-N5 +u 0 4-Nh+Ng+MY+Ne +u 0 4-Np+Nq+My-Nn +u 0 4-Nx+Ns+Nv-HZ +u 0 4+Nx-Mf+Ny+Nt +u 0 4-Ny+Nu-Mg+Nw +u 0 4-NG+NH-ND+NE +u 0 4-NE-NB-NC-N9 +u 0 4-NL-Nc-NK+N0 +u 0 4+NM+M%-NI-9I +u 0 4-NT+NP+NS+NK +u 0 4-NV+NO+NT+NJ +u 0 4-NU+NV+NR+NI +u 0 4+NU-a1+NQ+NN +u 0 4-N@+NZ+NB-NO +u 0 4-NZ+N%+NW-NN +u 0 4-O7+O2+O3+O6 +u 0 4+O8+O4-5r+O0 +u 0 4-O9-O2+No-NS +u 0 4-Ob+O9+Nn-NR +u 0 4-Oa-O1+Ob-NQ +u 0 4+Oa-qk+Nm-O0 +u 0 4-Of-O4+Oc-5M +u 0 4+Ok-N7-Ne-sw +u 0 4-Ok-92-Nd-N8 +u 0 4-Oo+Om+LV+On +u 0 4-Op+Ol+LU+Oq +u 0 4-Ov-Om-Ot+Ou +u 0 4+OB-Oz+Lh-i@ +u 0 4-OB-z4+Li-OA +u 0 4-OC+Lf+K0+OA +u 0 4-OH-9n+OF+OG +u 0 4-OM+OJ+OK-OG +u 0 4-OU-OT-OO-OR +u 0 4-OY+OW-OQ+OX +u 0 4-OX-OS-OP-OK +u 0 4-P4+P1+OR-O% +u 0 4-P5+P3-P0+ND +u 0 4-P2+P4+OQ-O@ +u 0 4-P3+P2+OP+NC +u 0 4-Pc-NW+P6+O@ +u 0 4-Pg+Pd+Pc-NX +u 0 4-Pd+Ph+P7+Pb +u 0 4-Ph+Pf+P8+Pa +u 0 4-Pf+Pg+O%+Pe +u 0 4-Pe-NY+OZ+P9 +u 0 4-Pl-P8+OO-Pk +u 0 4-Pn+Pl+ON-Pj +u 0 4-Pm-P7+Pn-Pi +u 0 4-Pq+Os+Po+Ot +u 0 4-Pr+Or+Pp+Pq +u 0 4+Ps-Po+ML-hm +u 0 4-Ps-h1+MM-Pp +u 0 4-Pw+Pi-Pv-56 +u 0 4+Pw-65+Px+Pj +u 0 4-Py-Pb-Og+Pv +u 0 4+Pz+Oj-Pu-6E +u 0 4-Pz-AQ-Pt+Oi +u 0 4+PE+PD+PA-74 +u 0 4-PE-8o+PB+PC +u 0 4+PJ-PH-PG-lY +u 0 4-PJ-mJ-PF-PI +u 0 4-PS+PR+OS-PO +u 0 4+P%+PZ+PW-b0 +u 0 4-P%-si+PX+PY +u 0 4-Q4+Q5+PO+Q1 +u 0 4-Q5+Q3+Q2+P@ +u 0 4-Q1+Q0+PN-PW +u 0 4+Qa+Qb-PZ+Q7 +u 0 4-Qb+Q8+Q9-PY +u 0 4-Qh+Qf-Q8-P@ +u 0 4-Qg+Qh-Q7-Q0 +u 0 4-Qp+Ql+Qn-Dl +u 0 4+Qp-Qo+Qq+Qm +u 0 4-QD+Qw-QA+QB +u 0 4-QL+QE-DN-QJ +u 0 4+QL+QM-QI+QF +u 0 4-QM+QG-QK-QH +u 0 4+QQ+QK+QR+QO +u 0 4-QR+QP+QJ-Q9 +u 0 4-QW-QG+QT+QV +u 0 4-QY-QF+QS+QW +u 0 4-QX-QE+QY+QU +u 0 4-R1-QV+QZ-Q% +u 0 4-R9-PK+R6+R7 +u 0 4-Rh-Rc+Rf+Rd +u 0 4-Rj+Qx-Re-Qu +u 0 4-Rm+Rl-Qt-Ri +u 0 4-Rt+Rs-Rp+Rr +u 0 4+Rx+Ry+Ru+Rp +u 0 4-Ry+Rq-Rw+Rv +u 0 4-RB+RD+Rz-R6 +u 0 4-RC+RB+Rw+PG +u 0 4-RD+RC+Rc+RA +u 0 4+RG+QI+RE-pG +u 0 4-RG-ps+RF+QH +u 0 4+RL+RM-RF+RI +u 0 4-RM+RJ+RK-RE +u 0 4-RV+RT+RP+RS +u 0 4-RU-RO+RV+RR +u 0 4-RY+RZ+RN-RH +u 0 4-RZ+R%+RO+RW +u 0 4-Sf-QZ+S3+Sa +u 0 4+Sm-Sk-Sj-kZ +u 0 4-Sm-AJ-Si-Sl +u 0 4+Sp-Ru+Sn-kE +u 0 4-Sp-lb+So-Rv +u 0 4-Su+Ss+Sr+S0 +u 0 4-Sr+Sq+R@+Sl +u 0 4-Ss+St+Sk-So +u 0 4-SA+Sv-oO+Sz +u 0 4+SA+SB-qd+Sw +u 0 4-SB+Sx+Sy-p@ +u 0 4-SI-Sx+SE+SH +u 0 4-SK-Sw+SD+SI +u 0 4-SJ-Sv+SK+SG +u 0 4+SJ+SF+SC-D7 +u 0 4-SQ-SH+SP+SM +u 0 4+ST+Se+Qo-dZ +u 0 4-SX-SW+S8-eD +u 0 4+T0+S@+SY-lw +u 0 4-T0-qM+SZ+S% +u 0 4-T7+T2-T4-T6 +u 0 4-T9+T7-T3-T5 +u 0 4-Th+Ti+T3+Te +u 0 4-Ti+Tg+Tf-Tb +u 0 4-Tf+T4-Ta+Td +u 0 4-Tg+Th+Tc-S@ +u 0 4-Tl+Tj-SZ-RR +u 0 4-Tn+Tm+To-T1 +u 0 4-Tt-Tq-vH+Ts +u 0 4-Tx+Tr+Tu+Tw +u 0 4-TF+TG+TC+TE +u 0 4-TJ-TB+TH-I8 +u 0 4+TJ-TI+TK-TC +u 0 4-TP-TL-SC-TO +u 0 4-TS+TQ+TP-TM +u 0 4-TQ+TT-SD+TB +u 0 4-TT+TR-SE-TE +u 0 4-T%+TN+TW+TZ +u 0 4-U0+T%+TV+TY +u 0 4-T@+TM+TU+U0 +u 0 4+T@+TX-Ic+TL +u 0 4-U2-TU-Ih-TH +u 0 4+U2+U3-U1-TV +u 0 4-U6-Fq+TF-U5 +u 0 4-Ub+Ue+T5+U9 +u 0 4-Ue+Uf+Uc+Ua +u 0 4-Uc+T6+U8-Tw +u 0 4+Uk+Uj+Ug-Ia +u 0 4-Uk+If+Uh+Ui +u 0 4+Uo+Up-Uh-Um +u 0 4-Up-Un-Ts-Ug +u 0 4-Uy+Uq+Uv-Uj +u 0 4-Uz+Us+Uw+Ut +u 0 4-UA+UC+Uy+Ur +u 0 4-UB+UA-Ui+Ux +u 0 4-UC+UB+Uu+Uz +u 0 4-UN+UJ+UI-TY +u 0 4-UJ+UO-Ur+UK +u 0 4-UK-TX+UF-Uq +u 0 4-UO+UM-Us+UE +u 0 4-UM+UN+UH+UL +u 0 4-UL-TZ+UG+UD +u 0 4-UU-U7+UR-UF +u 0 4-UW+UV+UQ-U8 +u 0 4-UV+UZ+UP-UT +u 0 4-UX+UW+UU-Ua +u 0 4-UZ+UX-UE+UY +u 0 4-UY-U9-UD-US +u 0 4-U%-UR+Un-Uv +u 0 4-V0+U%+Um-Uu +u 0 4-U@-UQ+Ul+V0 +u 0 4+U@-Ut-A3-UP +u 0 4+V1+U5+TI-I1 +u 0 4+V2-Tc+US-lK +u 0 4-V2-kc+UT-Td +u 0 4-V7-UG-V4-Io +u 0 4+V7+V6+V8-UH +u 0 4-V8-UI+V5-V3 +u 0 4+V9+U1+V3+2k +u 0 4-Vh-Nt-Vj-Mq +u 0 4+Nz+Vi-Vk+NA +u 0 4-Nu+Vj-Mp+Vk +u 0 4+Vn+Oe-Vl-O5 +u 0 4-Vn+Of-Vm+Pu +u 0 4-Vr+Sj+Vq-SV +u 0 4+Si-Vt+SX+Vr +u 0 4-Sq-Vs+S9+Vt +u 0 4-Vu-Lw-Kf-nu +u 0 4+Vz+N4-Vv+Vx +u 0 4-Vz+Vy-Vw-Na +u 0 4+VC+VA-VE-Nl +u 0 4-VC+Nj-VF+VB +u 0 4+VD-Vx-VA-NF +u 0 4-VD+NG-VB-Vy +u 0 4+VG+VE+Vv-ck +u 0 4-VG-cy+Vw+VF +u 0 4+VH+VJ+II+IL +u 0 4-VK+VL-Mm-il +u 0 4-VN+VK+Ml-iz +u 0 4-VO+VP+Oy-jd +u 0 4-VP+VQ-OD-xT +u 0 4-VR+VO+Mb-LH +u 0 4-VS-6q-Px+VT +u 0 4+VS+VU+Pk-mh +u 0 4-VV-Qa-QQ-b@ +u 0 4+VV-bN+QN+Q6 +u 0 4-VW+VX-RL-pe +u 0 4-VX+VY+RH-rE +u 0 4-VY+VZ-SL+Tn +u 0 4+W2-rq+V%+W0 +u 0 4-W2+W1+V@-s4 +u 0 4+W5-RN-W0+W3 +u 0 4-W5+W4-W1+RU +u 0 4+W7-Sa-W3+W6 +u 0 4-Wa-U4+Wb-r5 +u 0 4+Wa-rS+Wc+U6 +u 0 4-Wd+TD-W8-Wb +u 0 4+Wd-Wc-W9-TG +u 0 4-We+Wf+OI-qr +u 0 4-Wf+Wg-OV+Pm +u 0 4-Wg+Wh+OY-P6 +u 0 4-Wh+We-OL-aA +u 0 4-Wi+Im+V4+Wj +u 0 4+Wi+Wk-V9+Il +u 0 4-Wl-TW-TD+Wm +u 0 4+Wl+Wn-TK-U3 +u 0 4-Wo-Wj-Wm+U4 +u 0 4+Wo-V1-Wn-Wk +u 0 4-Wp+Wq-QB-GR +u 0 4-Wq+Wr-Rk+Rg +u 0 4-Wr+Ws+Rm+Ra +u 0 4-Ws+Wp+Rn-vV +u 0 4+Wx-ei-Wt+Wv +u 0 4-Wx+Ww-Wu-eR +u 0 4+WA+Wy+Wt-ST +u 0 4-WA+Sd+Wu+Wz +u 0 4+WD+Ri-Wv-WB +u 0 4-WD-WC-Ww-Rn +u 0 4-WJ-Gp-WH-WE +u 0 4+WJ-WF-WI-jy +u 0 4-WK+WL+IT-Jw +u 0 4-WL+WM-IV+Jy +u 0 4-WN+IX+WO+Iu +u 0 4+WN+3v+WP-IQ +u 0 4-WQ-IW-Iw-WO +u 0 4+WQ-WP-I0-IR +u 0 4-WR-Is-J%+WS +u 0 4-WV-WS-K3-WT +u 0 4-WW+WX-J4-HO +u 0 4-WX+WY-I@+4A +u 0 4-WY+WZ-J0-HD +u 0 4-WZ+WW-J3-BB +u 0 4-W%+JL+W@-L0 +u 0 4-X1+X2-L1-W@ +u 0 4+X1-X0+L6+X3 +u 0 4-X5+X6-JE-JN +u 0 4-X6+X7-JR+JW +u 0 4-X8+X9+JS+JV +u 0 4-X9+Xa-L5-X4 +u 0 4-Xa+X5-K@-X2 +u 0 4-Xb+Xc+X0-WG +u 0 4-Xc+Xd+W%+WH +u 0 4+Xe+JQ+Xf-C1 +u 0 4+Xg-Xf+JR-om +u 0 4+JE-JP+JH+Xh +u 0 4-Xi-JX+Xj-Iv +u 0 4-Xk+Xl+IW-Xj +u 0 4-Xn+Xo-Lb+L8 +u 0 4-Xo+Xp-fJ+Ks +u 0 4-Xp+Xq-K5+Ku +u 0 4-Xq+Xn+KN+La +u 0 4-Xv+Xw-KD-Lc +u 0 4-Xx+Xy-KO+Ky +u 0 4-Xy+Xz-K7-KC +u 0 4-Xz+XA-KR+Jl +u 0 4-XA+Xx+KS+KB +u 0 4-XC+XD-KZ-Kk +u 0 4-XD+XE-KV-Ka +u 0 4-XE+XB-KU-Kb +u 0 4-XF+XG-Lj-L3 +u 0 4-XI+XF+Lk-L6 +u 0 4-XJ+XK+Ln+Lo +u 0 4-XL+XM-th+Ll +u 0 4-XP+XN-M8-Mc +u 0 4-XQ+XR+M9-M4 +u 0 4-XS+XQ-XN+M5 +u 0 4-XT+XU-M9-L@ +u 0 4-XU+XV+M7+M0 +u 0 4-XV+XT+M8+LZ +u 0 4-Y0+Y1+Ly+LE +u 0 4-Y1+Y2+N1-X% +u 0 4-Y2+Y3-M@+X@ +u 0 4-Y3+Y4-MY+MZ +u 0 4-Y4+Y0-Lr-LF +u 0 4-Y5+Y6-XX+Ve +u 0 4-Y7+Y5-MT+Mz +u 0 4-Y8-M%-N1-MS +u 0 4-Y9+Ya+N2+MW +u 0 4-Yb-My-XW+Y8 +u 0 4-Yc+Yb+XX-N2 +u 0 4-Yf+Yd-Ya-N3 +u 0 4-Yg+Yh+M@+Nh +u 0 4-Yh+Yi+NL-Ni +u 0 4-Yi+Yj-NJ-N6 +u 0 4-Yj+Yg-NM+Nd +u 0 4+Yl-Oc+10u-MA +u 0 4-Yl-ME-10t-Yk +u 0 4-Ym+Yn-O8+O5 +u 0 4-Yn+Yo+Og+Oh +u 0 4-Yp+Ym+O1+O7 +u 0 4-Yq+Yr-N%+Yp +u 0 4-Yr+Ys+NX-Yo +u 0 4-Yt+Yu-NP+N@ +u 0 4-Yu+Yv+NF-NH +u 0 4-Yx+Yt-O3+Yq +u 0 4-YA+YB-VU-Pa +u 0 4-YB+YC-VT+Py +u 0 4-YD+YE-Yd+Ye +u 0 4-YE+YF-MK-Or +u 0 4-YF+YG-MJ-Os +u 0 4-YG+YD+MV-On +u 0 4+Op+MU+LT-AX +u 0 4-YI+YJ+Ow-g2 +u 0 4-YJ+YH+M6-Ol +u 0 4+YL-Kp+Xt-M2 +u 0 4-YN+YO-Xt+XS +u 0 4-10I-Xs-YO+YP +u 0 4-YP-Ou-OE+XO +u 0 4-Ra+YS-PQ-Qe +u 0 4-YY+YZ-Qj-Q2 +u 0 4-YZ+Y%-OI+PP +u 0 4-Y%+Y@+Qt+Qe +u 0 4-Z0+Qk+OM+OH +u 0 4+Z0-am+OL+Qj +u 0 4-Z1+Z2-Qk-Q3 +u 0 4-Z2+Z3-OF-PX +u 0 4-Z3+Z1-OJ+Q4 +u 0 4-Z4+Qr+Z5-Qf +u 0 4-Z7+Z8+Qg-Z5 +u 0 4+Z7-Z6+Qd+Z9 +u 0 4-Za+Qs-Q6-Z8 +u 0 4+Za-Z9+Qc+Qu +u 0 4-Zc+Zd-Qv-Rl +u 0 4-Zd+Ze-Qw+Rk +u 0 4-Ze+Zf-Qy-Rd +u 0 4-Zf+Zb+Qz+Rj +u 0 4-Zh-Qz+R3-Zg +u 0 4-Zj+Zk+S1-R4 +u 0 4-Zl+Zi-R@+QA +u 0 4+Zm-QO+Zn+Q% +u 0 4-Zq+R4+Zg-Zp +u 0 4-Zr+Zs+Q@-R2 +u 0 4-Zs+Zt-QU+R1 +u 0 4-Zt+Zu-QP-Zn +u 0 4-Zu+Zv-Qr+Zo +u 0 4-Zw+Zx-Rb-Rf +u 0 4-Zx+Zy+Qi+Re +u 0 4-Zy+Zz-Ey+Ro +u 0 4-Zz+ZA-Av-Rx +u 0 4-ZA+Zw+R8-Rz +u 0 4-ZD+ZB-S1+Sb +u 0 4-ZE+ZF+S2+ZD +u 0 4-ZF+ZG-Rr-ZC +u 0 4-ZG+ZH-Sn-SU +u 0 4-ZH+ZI-St-Vq +u 0 4-ZI+ZE+Su+Vs +u 0 4-ZJ+ZK-QT-RI +u 0 4-ZK+ZL-S3+RY +u 0 4-ZM+ZJ-QS-RJ +u 0 4-ZN+ZO+S4-Se +u 0 4-ZO+ZP-RX+Sh +u 0 4-ZQ+S7+ZR+QX +u 0 4+ZQ-DG+ZS+S5 +u 0 4-ZT+ZU-Q@-ZR +u 0 4+ZT-ZS-Ql+ZV +u 0 4+ZW-ZV-Qm+ZN +u 0 4-ZX+ZY+Sg-Sh +u 0 4-ZY+ZZ+Sc-RQ +u 0 4-Z@+Z%+SL-RW +u 0 4-%7-Te+T9+%8 +u 0 4+%7+%9-T8-S% +u 0 4-%a+Ty+%b-SP +u 0 4+%a+Tv+%c-Tm +u 0 4+%e-%d+Tx+Tz +u 0 4-%f+%g+Z@-To +u 0 4-%g+%h-Tj-%9 +u 0 4-%h+%i-Tp-%8 +u 0 4-%i+%j+SS-T2 +u 0 4-%j+%k-%2-Tu +u 0 4-%k+%f+%3-Tz +u 0 4-%l-V6+%m-Ip +u 0 4+%l-Ah+%n-Uw +u 0 4-%o+%p+3m-%m +u 0 4+%o-%n-GY+%q +u 0 4-%r-V5+2j-%p +u 0 4+%r-%q-Ir-Ux +u 0 4-%s+%t+JZ-X7 +u 0 4-%t+%u-Va+X8 +u 0 4-%u+%v-Vb-KG +u 0 4-%v+%s-J9-Kx +u 0 4-%w+%x-Xm+WK +u 0 4-%x+%y+Va-Jj +u 0 4-%y+%z+Vb-Jb +u 0 4-%z+%A-JY+J6 +u 0 4-%A+%w-Xl+IR +u 0 4-%B-IS-K4+%C +u 0 4+%B+%D-J@-IN +u 0 4-%E-%C-Vd+%F +u 0 4+%E+%G+Le-%D +u 0 4-%H-%F-Vc-Jy +u 0 4+%H+Ju+Xb-%G +u 0 4+%I+%K+Xi+WT +u 0 4-%L+Vc+%M-X3 +u 0 4-%O+%P+X4-%M +u 0 4+%O-%N-L4+%Q +u 0 4-%R-%J-JV-%P +u 0 4+%R-%Q+JT-%K +u 0 4-%S+%T-Lg+Vd +u 0 4-%T+%U+XI+%L +u 0 4-%U+%V-XH+%N +u 0 4-%V+%S-Lf+K3 +u 0 4+%W+Vp+%Y+YR +u 0 4-%Z-YV+Rb-%X +u 0 4+%Z-%Y+Vo+YW +u 0 4-%%+%@+4D-HJ +u 0 4-%@+@0-HV-Gi +u 0 4-@0+@1+IN+IK +u 0 4-@1+@2-VI-VJ +u 0 4-@2+%%-IB-JO +u 0 4-@5+XP-LZ-@3 +u 0 4+@5-@4-LV-XO +u 0 4-@6+@7-V%-QN +u 0 4-@7+@8-W6-Zm +u 0 4-@9+@a-TN+Ub +u 0 4-@a+@b+W8+T8 +u 0 4-@b+@c+W9+T1 +u 0 4-@c+@d-TR-Tv +u 0 4-@d+@9+TS-Ud +u 0 4-@e+@f-Uo-dE +u 0 4-@f+@g-Ul-dq +u 0 4-@g+@h-Tr+SR +u 0 4-@i+@e+Tt-c% +u 0 4-@j+IO+IM+@k +u 0 4+@j+@l-VH+VI +u 0 4-@m+IF+Iy+@n +u 0 4+@m+@o+IC-IJ +u 0 4-@p-@k-@n+3w +u 0 4+@p+IB-@o-@l +u 0 4-@q-IX-WU-IP +u 0 4+@q+K4+WV+WR +u 0 4-@r+@s-tX-Xe +u 0 4-@s+@t+Ke-Kw +u 0 4-@t+@u+JG-Xh +u 0 4-@u+@r-JI+JD +u 0 4-@v+@w+Ji-IE +u 0 4-@w+@x-JU-IY +u 0 4-@x+@y-JZ-Jc +u 0 4-@y+@z+Jj+J5 +u 0 4-@z+@v+Jg-IF +u 0 4-@B-KF-L9+@C +u 0 4-@G+@H+OD-yj +u 0 4-@I+@J+Xs+10G +u 0 4-@J+@G+OE-hH +u 0 4-@L+@M-Ox-@E +u 0 4-@O+@P+OC+K1 +u 0 4-@P+@Q+Oz-jM +u 0 4-@Q+@R+Lj+WI +u 0 4-@R+@S-Lk+WG +u 0 4-@S+@O+Lg-Le +u 0 4-@T+@U-XR-Kj +u 0 4-@W+@T+YN+Ko +u 0 4+@X+@Z-LW-XB +u 0 4-@%+Ki+@@-M3 +u 0 4+@%+M4+100+Kl +u 0 4-101+102-Ma-@@ +u 0 4+101-100-M7+103 +u 0 4-104+@N-@Y-102 +u 0 4+104-103-@Z+XC +u 0 4-106+107+XZ-Y6 +u 0 4-107+108-XY+Y7 +u 0 4-109+105-Lo-LB +u 0 4-10a+10b-XZ+Nr +u 0 4-10d-MD+10e+XY +u 0 4+10d-Ml+10f-Mn +u 0 4-10g-Vf+10a+10h +u 0 4-10i-Vg-10h-10e +u 0 4-10j+10k+Lm-un +u 0 4-10k+10l-XK+XL +u 0 4-10m+10n-X@-N0 +u 0 4-10n+10j-MZ-MX +u 0 4-10o+10p+Yf-Oq +u 0 4-10q+10r+Pr+Ov +u 0 4-10r+10o-Ye+Oo +u 0 4-10s+10t-Ve-Nr +u 0 4-10u+10v+N3-Nm +u 0 4-10v+10s+Yc+Np +u 0 4-10w+10x-NA+Vg +u 0 4-10A+10B-Yy-Nz +u 0 4-10C+10D-XG-YL +u 0 4-10D+10E-Lh-Oy +u 0 4-10E+10F-Li-@H +u 0 4-10F+10C+XH+@I +u 0 4-10H+10I+YM+YK +u 0 4-10J+YX-YW+10K +u 0 4+10J+10L+YT-YS +u 0 4-10M-10K+10N-PT +u 0 4+10M+PU+10O-10L +u 0 4-10R-YR-10P-10N +u 0 4+10R-10O-10Q+PM +u 0 4-10S+10T-PM+YU +u 0 4+10S-R7-Vp+10U +u 0 4-10V-Rg-YT+10W +u 0 4+10V+10X-Vo+Rh +u 0 4-10Y+PF-10W-10T +u 0 4+10Y-10U-10X-RA +u 0 4-10Z+10%-PD+PL +u 0 4-10%+10@+PH+PK +u 0 4-10@+110+PI-YU +u 0 4-110+111+OT+10Q +u 0 4+114+115-113+P5 +u 0 4-116+117+Zc-Zb +u 0 4-118+119+YY+Z4 +u 0 4-119+116-Y@+Z6 +u 0 4+11e+ZX-11c-11a +u 0 4-11e-11b-11d-Sd +u 0 4+11j+11h+11f-Sb +u 0 4-11j-S9+11g+11i +u 0 4+11k-11f+11c-ZZ +u 0 4-11k-S8+11d-11g +u 0 4+11n+11l-11h-Zk +u 0 4-11n+Zl-11i+11m +u 0 4-11q-11o-W4+11r +u 0 4+11q+11s-W7-11p +u 0 4-11t-11r-RP+ZC +u 0 4+11t-ZB-Sc-11s +u 0 4-11u+11v-S2-Rs +u 0 4-11v+11w+Zj-R3 +u 0 4-11w+11x-Zi+Qy +u 0 4-11x+11u-S0-Rq +u 0 4-11y+11z-ZW-ZP +u 0 4-11z+11A-ZU-S6 +u 0 4-11A+11B+R2+Sf +u 0 4-11B+11y+R0-Sg +u 0 4-11C+11D-Sy+VW +u 0 4-11D+11E-Sz-RK +u 0 4-11F+11G-Ty-VZ +u 0 4-11G+11H-SM+11C +u 0 4+11I+11F+TA+11K +u 0 4-11N-%4+11O+RX +u 0 4+11P+11R-R%-Z% +u 0 4-11S+%6-11Q-11O +u 0 4-11T+11U+SN-%e +u 0 4-11U+11V-%5-@h +u 0 4-11W+11X-%6+11T +u 0 4-11X+11Y+%4-11V +u 0 4-11Y+11Z-S4+@i +u 0 4-11%+11@+%2-Tk +u 0 4-120+11%-SR+SW +u 0 4-121-SS+122+Tk +u 0 4+121+SV+123+Ta +u 0 4-124+125-RS-122 +u 0 4+124-123+SU+126 +u 0 4-127+Tp+Tl-125 +u 0 4+127-126-SY+Tb +u 0 4-128+WU-%I+Xk +u 0 4+128+Xm+%J-WM +u 0 4-129+12a+LQ-LN +u 0 4-12a+12b+@3+VR +u 0 4-12b+12c+@4-VQ +u 0 4-12c+12d-MV-MI +u 0 4-12d+129+Y9+MT +u 0 4-12e+12f+Rt+Zh +u 0 4-12f+12g-Ro-Qx +u 0 4-12h-@V+12i-Kt +u 0 4+12h-@A+12j-M6 +u 0 4-12k+L5-@C+12l +u 0 4+12k+12m-@D-Ld +u 0 4-12n+@W-12l-12i +u 0 4+12n-12j-12m-YM +u 0 4-12o-Ks-Ow+@A +u 0 4-12p+12q+@D+@B +u 0 4-12q+12r+12o-L8 +u 0 4-12r+12s+@E-@F +u 0 4-12s+12p-Kv-Xr +u 0 4-12t+12u+Xu-Xw +u 0 4-12u+12v+Xr-KE +u 0 4-12v+12w+@F-L7 +u 0 4-12w+12x-@M-gP +u 0 4-12x+12t+@K-Me +u 0 4-12y-10G+12z+Md +u 0 4+12y+Xv+12A+L4 +u 0 4-12B+12C-@K-12z +u 0 4+12B-12A-Xu+12D +u 0 4-12E+10H+@L-12C +u 0 4+12E-12D+Kv+Ld +u 0 4-12F+12G+L1+L2 +u 0 4+12F-Km+L3+12H +u 0 4-12K+K%-12I-12G +u 0 4+12K-12H-12J-@N +u 0 4-12L+12M-@U+L@ +u 0 4-12M+12N+@V-LU +u 0 4-12N+12O-n9-LT +u 0 4-12O+12L+Vu-LX +u 0 4-12P+10c+12Q-10l +u 0 4+12P+10m+12R-No +u 0 4-12S+106-105+12T +u 0 4+12S+12U+X%+XW +u 0 4-12V-10b-12T-12Q +u 0 4+12V-12R-12U-Nq +u 0 4-12W+12X+10g-10c +u 0 4-12Y+12Z-10B+Od +u 0 4-12Z+12W+10z-O6 +u 0 4-12%+12@+12Y-12X +u 0 4-12@+130-Vi+10i +u 0 4-130+131+Vh-10f +u 0 4-131+12%-Ns-Mk +u 0 4-132+10y+133+Pt +u 0 4+132+Vm+134+Yk +u 0 4-135+136+Yz-133 +u 0 4+135-134+Vl+137 +u 0 4-138-10x+10A-136 +u 0 4+138-137-10z+Vf +u 0 4-139+13a+MD-Mo +u 0 4-13a+13b-Mz-MC +u 0 4-13b+13c+ME-MB +u 0 4-13c+13d-10y+Mr +u 0 4-13d+139+10w-Mu +u 0 4-13f+13g-Ys+NY +u 0 4-13g+13h+Yx-Yw +u 0 4-13h+13e-Od-Nv +u 0 4-13e+13i+Yy-Nw +u 0 4-13j+13k+10q-YK +u 0 4-13k+13l-10p-YH +u 0 4-13l+13m-gg+YI +u 0 4-13m+13j-fh+Ox +u 0 4-13n+13o-PL+R9 +u 0 4-13o+13p-YQ-%W +u 0 4-13p+13q-PV+%X +u 0 4-13q+13n-PC-R8 +u 0 4-13r+13s+OV-OW +u 0 4-13s+13t-ON+OU +u 0 4-13t+13u+PQ-PU +u 0 4-13u+13r-PP+PS +u 0 4-13v+13w+P0-PR +u 0 4-13w+13x-Nj-PN +u 0 4-13y+13v+113+PT +u 0 4-13z+13A-117-QC +u 0 4-13A+13B+118-Qn +u 0 4-13B+13C-Zv+Zr +u 0 4-13C+13z+Zq-R5 +u 0 4-13D+13E-Qs+@6 +u 0 4-13E+13F-12g-V@ +u 0 4-13F+13G+12e+11o +u 0 4-13G+13H+Zp+11p +u 0 4-13H+13D-Zo-@8 +u 0 4-13I-11E+11J+13J +u 0 4+13I+13K-11I-11H +u 0 4-13L-%0-SF+13M +u 0 4+13L+13N+SO+%1 +u 0 4-13O-13J-13M-SG +u 0 4+13O+SQ-13N-13K +u 0 4-13P+13Q+11L+%0 +u 0 4-13R+13S-11Z+Tq +u 0 4-13S+13P-S5-DU +u 0 4-13U+13V-11J+ZM +u 0 4-13V+13T-11L-S7 +u 0 4-13W+13X-ZL-11P +u 0 4-13X+13Y+S6+11Q +u 0 4-13Y+13Z-13T-11M +u 0 4-13Z+13W+13U-11K +u 0 4-13%+13@-13Q+11M +u 0 4-13@+140+13R+11W +u 0 4-141+142-SO-%b +u 0 4-142+13%-%1-TA +u 0 4-143+144+%5+11N +u 0 4-144+145+120+RQ +u 0 4-145+146-11@-RT +u 0 4-146+147-%3-11R +u 0 4-147+143-SN+11S +u 0 4-148-Oj+149-YC +u 0 4+148-Oh+14a-Oe +u 0 4-14b-115+10P+14c +u 0 4+14b+14d-111-P1 +u 0 4-14e-14c+YQ+14f +u 0 4+14e+14g+10Z-14d +u 0 4+14h-OZ-PA-14g +u 0 4-14i+14j-YX-Qd +u 0 4-14j+14k+13y-13x +u 0 4-14l+14m-112-114 +u 0 4-14m+14n+PV-14f +u 0 4-14n+14o-PB-14h +u 0 4-14o+14p-H%+Yw +u 0 4-14p+14l-Nk-Yv +u 0 4-14q+14r+Ud-%c +u 0 4-14r+14s+TO+141 +u 0 4-14s+14t+U7-140 +u 0 4-14t+14q-Uf+%d +u 0 4-14u+14v+13f-13i +u 0 4-14v+14w-14a-Yz +u 0 4-14w+14x-149-Oi +u 0 4-14x+14y+YA-mv +u 0 4-14y+14u-P9-83 +u 0 4+14D-bs-14z+14B +u 0 4-14D+14C-14A-EM +u 0 4+14G-14B+14E-Qc +u 0 4-14G-Qi+14F-14C +u 0 4+14J+14H+14z+Nl +u 0 4-14J+Nk+14A+14I +u 0 4+14M-14E-14K+14i +u 0 4-14M+YV-14L-14F +u 0 4+14N-14k+14K-14H +u 0 4-14N-14I+14L+112 +u 0 4-14O-VL+VM+14P +u 0 4+14O+14Q+XJ-XM +u 0 4-14R-14P-LI+14S +u 0 4+14R+14T-LG-14Q +u 0 4-14U-14S+@Y+14V +u 0 4+14U+14W-@X-14T +u 0 4-14X-14V+12J+WF +u 0 4-151-14@+150+QD +u 0 4-153+152+14Z-Wz +u 0 4-154-150-152+WC +u 0 4-155-108+LN+156 +u 0 4+155+157-LR+109 +u 0 4-158-156+LH+VN +u 0 4+158-VM+LI-157 +u 0 4-159+15a+KX-JF +u 0 4-15a+15b+12I+L0 +u 0 4-15b+15c+14X+WE +u 0 4-15c+159-14W-sY +u 0 4-15d+15e+11a-11l +u 0 4-15e+15f-R0+R5 +u 0 4-15f+15g-14Y+14% +u 0 4-15g+15h-14Z+14@ +u 0 4-15h+15d+11b-11m +u 0 4-15i+15j+14Y-Qq +u 0 4-15j+15k+153-Wy +u 0 4-15k+15l+154+WB +u 0 4-15l+15m+151+Qv +u 0 4-15m+15i-14%+QC + advmesh 3 +adv 3 0 +01 +11 +21 +31 +41 +51 +61 +71 +81 +91 +a1 +b1 +c1 +d1 +e1 +f1 +g1 +h1 +i1 +j1 +k1 +l1 +m1 +n1 +o1 +p1 +q1 +r1 +s1 +t1 +u1 +v1 +w1 +x1 +y1 +z1 +A1 +B1 +C1 +D1 +E1 +F1 +G1 +H1 +I1 +J1 +K1 +L1 +M1 +N1 +O1 +P1 +Q1 +R1 +S1 +T1 +U1 +V1 +W1 +X1 +Y1 +Z1 +%1 +@1 +101 +111 +121 +131 +141 +151 +161 +171 +181 +191 +1a1 +1b1 +1c1 +1d1 +1e1 +1f1 +1g1 +1h1 +1i1 +1m1 +1n1 +1o1 +1p1 +1q1 +1r1 +1s1 +1t1 +1u1 +1v1 +1w1 +1x1 +1y1 +1z1 +1A1 +1B1 +1C1 +1D1 +1E1 +1F1 +1G1 +1H1 +1I1 +1J1 +1K1 +1L1 +1M1 +1N1 +1O1 +1P1 +1Q1 +1R1 +1S1 +1T1 +1U1 +1V1 +1W1 +1X1 +1Y1 +1Z1 +1%1 +1@1 +201 +211 +221 +231 +241 +251 +261 +271 +281 +291 +2a1 +2b1 +2c1 +2d1 +2e1 +2f1 +2g1 +2h1 +2i1 +2j1 +2k1 +2o1 +2p1 +2q1 +2r1 +2s1 +2t1 +2u1 +2v1 +2w1 +2x1 +2y1 +2z1 +2A1 +2B1 +2C1 +2D1 +2E1 +2F1 +2G1 +2H1 +2I1 +2J1 +2K1 +2L1 +2M1 +2N1 +2O1 +2P1 +2Q1 +2R1 +2S1 +2T1 +2U1 +2V1 +2W1 +2X1 +2Y1 +2Z1 +2%1 +2@1 +301 +311 +321 +331 +341 +351 +361 +371 +381 +391 +3a1 +3b1 +3c1 +3d1 +3e1 +3f1 +3g1 +3h1 +3i1 +3j1 +3k1 +3l1 +3m1 +3n1 +3o1 +3p1 +3q1 +3r1 +3s1 +3t1 +3u1 +3v1 +3w1 +3x1 +3y1 +3z1 +3A1 +3B1 +3C1 +3D1 +3E1 +3F1 +3G1 +3H1 +3I1 +3J1 +3K1 +3L1 +3M1 +3N1 +3O1 +3P1 +3Q1 +3R1 +3S1 +3T1 +3U1 +3V1 +3W1 +3X1 +3Y1 +3Z1 +3%1 +3@1 +401 +411 +421 +431 +441 +451 +461 +471 +481 +491 +4a1 +4b1 +4c1 +4d1 +4e1 +4f1 +4g1 +4h1 +4i1 +4j1 +4k1 +4l1 +4m1 +4n1 +4o1 +4p1 +4q1 +4r1 +4s1 +4t1 +4u1 +4v1 +4w1 +4x1 +4y1 +4z1 +4A1 +4B1 +4C1 +4D1 +4E1 +4F1 +4G1 +4H1 +4I1 +4J1 +4K1 +4L1 +4M1 +4N1 +4O1 +4P1 +4Q1 +4R1 +4S1 +4T1 +4U1 +4V1 +4W1 +4X1 +4Y1 +4Z1 +4%1 +4@1 +501 +511 +521 +531 +541 +551 +561 +571 +581 +591 +5a1 +5b1 +5c1 +5d1 +5e1 +5f1 +5g1 +5h1 +5i1 +5j1 +5k1 +5l1 +5m1 +5n1 +5o1 +5p1 +5q1 +5r1 +5s1 +5t1 +5u1 +5v1 +5w1 +5x1 +5y1 +5z1 +5A1 +5B1 +5C1 +5D1 +5E1 +5F1 +5G1 +5H1 +5I1 +5J1 +5K1 +5L1 +5M1 +5N1 +5O1 +5P1 +5Q1 +5R1 +5S1 +5T1 +5U1 +5V1 +5W1 +5X1 +5Y1 +5Z1 +5%1 +5@1 +601 +611 +621 +631 +641 +651 +661 +671 +681 +691 +6a1 +6b1 +6c1 +6d1 +6e1 +6f1 +6g1 +6h1 +6i1 +6j1 +6k1 +6l1 +6m1 +6n1 +6o1 +6p1 +6q1 +6r1 +6s1 +6t1 +6u1 +6v1 +6w1 +6x1 +6y1 +6z1 +6A1 +6B1 +6C1 +6D1 +6E1 +6F1 +6G1 +6H1 +6I1 +6J1 +6K1 +6L1 +6M1 +6N1 +6O1 +6P1 +6Q1 +6R1 +6S1 +6T1 +6U1 +6V1 +6W1 +6X1 +6Y1 +6Z1 +6%1 +6@1 +701 +711 +721 +731 +741 +751 +761 +771 +781 +791 +7a1 +7b1 +7c1 +7d1 +7e1 +7f1 +7g1 +7h1 +7i1 +7j1 +7k1 +7l1 +7m1 +7n1 +7o1 +7p1 +7q1 +7r1 +7s1 +7t1 +7u1 +7v1 +7w1 +7x1 +7y1 +7z1 +7A1 +7B1 +7C1 +7D1 +7E1 +7F1 +7G1 +7H1 +7I1 +7J1 +7K1 +7L1 +7M1 +7N1 +7O1 +7P1 +7Q1 +7R1 +7S1 +7T1 +7U1 +7V1 +7W1 +7X1 +7Y1 +7Z1 +7%1 +7@1 +801 +811 +821 +831 +841 +851 +861 +871 +881 +891 +8a1 +8b1 +8c1 +8d1 +8e1 +8f1 +8g1 +8h1 +8i1 +8j1 +8k1 +8l1 +8m1 +8n1 +8o1 +8p1 +8q1 +8r1 +8s1 +8t1 +8u1 +8v1 +8w1 +8x1 +8y1 +8z1 +8A1 +8B1 +8C1 +8D1 +8E1 +8F1 +8G1 +8H1 +8I1 +8J1 +8K1 +8L1 +8M1 +8N1 +8O1 +8P1 +8Q1 +8R1 +8S1 +8T1 +8U1 +8V1 +8W1 +8X1 +8Y1 +8Z1 +8%1 +8@1 +901 +911 +921 +931 +941 +951 +961 +971 +981 +991 +9a1 +9b1 +9c1 +9d1 +9e1 +9f1 +9g1 +9h1 +9i1 +9j1 +9k1 +9l1 +9m1 +9n1 +9o1 +9p1 +9q1 +9r1 +9s1 +9t1 +9u1 +9v1 +9w1 +9x1 +9y1 +9z1 +9A1 +9B1 +9C1 +9D1 +9E1 +9F1 +9G1 +9H1 +9I1 +9J1 +9K1 +9L1 +9M1 +9N1 +9O1 +9P1 +9Q1 +9R1 +9S1 +9T1 +9U1 +9V1 +9W1 +9X1 +9Y1 +9Z1 +9%1 +9@1 +a01 +a11 +a21 +a31 +a41 +a51 +a61 +a71 +a81 +a91 +aa1 +ab1 +ac1 +ad1 +ae1 +af1 +ag1 +ah1 +ai1 +aj1 +ak1 +al1 +0c +1c +2c +3c +4c +5c +6c +7c +8c +9c +ac +bc +cc +dc +ec +fc +gc +hc +ic +jc +kc +lc +mc +nc +oc +pc +qc +rc +sc +tc +uc +vc +wc +xc +yc +zc +Ac +Bc +Cc +Dc +Ec +Fc +Gc +Hc +Ic +Jc +Kc +Lc +Mc +Nc +Oc +Pc +Qc +Rc +Sc +Tc +Uc +Vc +Wc +Xc +Yc +Zc +%c +@c +10c +11c +12c +13c +14c +15c +16c +17c +18c +19c +1ac +1bc +1cc +1dc +1ec +1fc +1gc +1hc +1ic +1jc +1kc +1lc +1mc +1nc +1oc +1pc +1qc +1rc +1sc +1tc +1uc +1vc +1wc +1xc +1yc +1zc +1Ac +1Bc +1Cc +1Dc +1Ec +1Fc +1Gc +1Hc +1Ic +1Jc +1Kc +1Lc +1Mc +1Nc +1Oc +1Pc +1Qc +1Rc +1Sc +1Tc +1Uc +1Vc +1Wc +1Xc +1Yc +1Zc +1%c +1@c +20c +21c +22c +23c +24c +25c +26c +27c +28c +29c +2ac +2bc +2cc +2dc +2ec +2fc +2gc +2hc +2ic +2jc +2kc +2lc +2mc +2nc +2oc +2pc +2qc +2rc +2sc +2tc +2uc +2vc +2wc +2xc +2yc +2zc +2Ac +2Bc +2Cc +2Dc +2Ec +2Fc +2Gc +2Hc +2Ic +2Jc +2Kc +2Lc +2Mc +2Nc +2Oc +2Pc +2Qc +2Rc +2Sc +2Tc +2Uc +2Vc +2Wc +2Xc +2Yc +2Zc +2%c +2@c +30c +31c +32c +33c +34c +35c +36c +37c +38c +39c +3ac +3bc +3cc +3dc +3ec +3fc +3gc +3hc +3ic +3jc +3kc +3lc +3mc +3nc +3oc +3pc +3qc +3rc +3sc +3tc +3uc +3vc +3wc +3xc +3yc +3zc +3Fb +3Gb +3Hb +3Ib +3Jb +3Kb +3Lb +3Mb +3Nb +3Ob +3Pb +3Qb +3Rb +3Sb +3T9 +3U9 +3V9 +3W9 +3X9 +3Y9 +3Zb +3%b +3@b +40b +41b +42b +43b +449 +459 +469 +479 +489 +499 +4ab +4bb +4cb +4db +4eb +4fb +4gb +4hb +4ib +4jb +4kb +4lb +4mb +4nb +4o9 +4p9 +4q9 +4r9 +4s9 +4t9 +4ub +4vb +4wb +4xb +4yb +4zb +4Ab +4Bb +4Cb +4Db +4Eb +4Fb +4Gb +4Hb +4I9 +4J9 +4K9 +4L9 +4M9 +4N9 +4Ob +4Pb +4Qb +4Rb +4Sb +4Tb +4Ub +4V9 +4W9 +4X9 +4Y9 +4Z9 +4%9 +4@b +50b +51b +52b +53b +54b +55b +569 +579 +589 +599 +5a9 +5b9 +5c9 +5d9 +5e9 +5f9 +5g9 +5h9 +5i9 +5j9 +5k9 +5l9 +5m9 +5n9 +5o9 +5p9 +5q9 +5r9 +5s9 +5t9 +5vd +5xd +5zd +5Bd +5Fd +5Gd +5Jd +5Ld +5Md +5Sb +5Tb +5Ub +5Vb +5Wb +5Xb +5Yb +5Zb +5%b +5@b +60b +61b +62b +63b +649 +659 +669 +679 +689 +699 +6ab +6bb +6cb +6db +6eb +6fb +6gb +6h9 +6i9 +6j9 +6k9 +6l9 +6m9 +6nb +6ob +6pb +6qb +6rb +6sb +6tb +6ub +6vb +6wb +6xb +6yb +6zb +6Ab +6B9 +6C9 +6D9 +6E9 +6F9 +6G9 +6Hb +6Ib +6Jb +6Kb +6Lb +6Mb +6Nb +6Ob +6Pb +6Qb +6Rb +6Sb +6Tb +6Ub +6V9 +6W9 +6X9 +6Y9 +6Z9 +6%9 +6@b +70b +71b +72b +73b +74b +75b +76b +77b +78b +79b +7ab +7bb +7cb +7d9 +7e9 +7f9 +7g9 +7h9 +7i9 +7j9 +7k9 +7l9 +7m9 +7n9 +7o9 +7p9 +7q9 +7r9 +7s9 +7t9 +7u9 +7v9 +7w9 +7x9 +7y9 +7z9 +7A9 +7B9 +7C9 +7D9 +7E9 +7F9 +7G9 +7Id +7Kd +7Md +7Od +7Sd +7Td +7Wd +7Yd +7Zd +7%b +7@b +80b +81b +82b +83b +84b +85b +86b +87b +88b +89b +8ab +8bb +8c9 +8d9 +8e9 +8f9 +8g9 +8h9 +8id +8jb +8kb +8lb +8mb +8nb +8ob +8pb +8q9 +8r9 +8s9 +8t9 +8u9 +8v9 +8wd +8x9 +8y9 +8z9 +8A9 +8B9 +8C9 +8Dd +8Eb +8Fb +8Gb +8Hb +8Ib +8Jb +8Kb +8L9 +8M9 +8N9 +8O9 +8P9 +8Q9 +8Rd +8S9 +8T9 +8U9 +8V9 +8W9 +8X9 +8Yd +8Zb +8%b +8@b +90b +91b +92b +93b +949 +959 +969 +979 +989 +999 +9ad +9b9 +9c9 +9d9 +9e9 +9f9 +9g9 +9hd +9ib +9jb +9kb +9lb +9mb +9nb +9ob +9p9 +9q9 +9r9 +9s9 +9t9 +9u9 +9vd +9w9 +9x9 +9y9 +9z9 +9A9 +9B9 +9Cd +9Db +9Eb +9Fb +9Gb +9Hb +9Ib +9Jb +9K9 +9L9 +9M9 +9N9 +9O9 +9P9 +9Qd +9R9 +9S9 +9T9 +9U9 +9V9 +9W9 +9Xd +9Y9 +9Z9 +9%9 +9@9 +a09 +a19 +a2d +a3b +a4b +a5b +a6b +a7b +a8b +a9b +aab +abb +acb +adb +aeb +afb +agb +ah9 +ai9 +aj9 +ak9 +al9 +am9 +and +aob +apb +aqb +arb +asb +atb +aub +av9 +aw9 +ax9 +ay9 +az9 +aA9 +aBd +aC9 +aD9 +aE9 +aF9 +aG9 +aH9 +aId +aJb +aKb +aLb +aMb +aNb +aOb +aPb +aQb +aRb +aSb +aTb +aUb +aVb +aWb +aX9 +aY9 +aZ9 +a%9 +a@9 +b09 +b1d +b29 +b39 +b49 +b59 +b69 +b79 +b8d +b99 +ba9 +bb9 +bc9 +bd9 +be9 +bfd +bgb +bhb +bib +bjb +bkb +blb +bmb +bn9 +bo9 +bp9 +bq9 +br9 +bs9 +btd +bu9 +bv9 +bw9 +bx9 +by9 +bz9 +bAd +bB9 +bC9 +bD9 +bE9 +bF9 +bG9 +bHd +bIb +bJb +bKb +bLb +bMb +bNb +bOb +bP9 +bQ9 +bR9 +bS9 +bT9 +bU9 +bVd +bW9 +bX9 +bY9 +bZ9 +b%9 +b@9 +c0d +c19 +c29 +c39 +c49 +c59 +c69 +c7d +c8b +c9b +cab +cbb +ccb +cdb +ceb +cfb +cgb +chb +cib +cjb +ckb +clb +cm9 +cn9 +co9 +cp9 +cq9 +cr9 +csd +ctb +cub +cvb +cwb +cxb +cyb +czb +cA9 +cB9 +cC9 +cD9 +cE9 +cF9 +cGd +cH9 +cI9 +cJ9 +cK9 +cL9 +cM9 +cNd +cOb +cPb +cQb +cRb +cSb +cTb +cUb +cV9 +cW9 +cX9 +cY9 +cZ9 +c%9 +c@d +d09 +d19 +d29 +d39 +d49 +d59 +d6d +d7b +d8b +d9b +dab +dbb +dcb +ddb +de9 +df9 +dg9 +dh9 +di9 +dj9 +dkd +dl9 +dm9 +dn9 +do9 +dp9 +dq9 +drd +ds9 +dt9 +du9 +dv9 +dw9 +dx9 +dyd +dz9 +dA9 +dB9 +dC9 +dD9 +dE9 +dFd +dGb +dHb +dIb +dJb +dKb +dLb +dMb +dN9 +dO9 +dP9 +dQ9 +dR9 +dS9 +dTd +dU9 +dV9 +dW9 +dX9 +dY9 +dZ9 +d%d +d@9 +e09 +e19 +e29 +e39 +e49 +e5d +e6b +e7b +e8b +e9b +eab +ebb +ecb +ed9 +ee9 +ef9 +eg9 +eh9 +ei9 +ejd +ekb +elb +emb +enb +eob +epb +eqb +er9 +es9 +et9 +eu9 +ev9 +ew9 +exd +ey9 +ez9 +eA9 +eB9 +eC9 +eD9 +eEd +eFb +eGb +eHb +eIb +eJb +eKb +eLb +eM9 +eN9 +eO9 +eP9 +eQ9 +eR9 +eSd +eTb +eUb +eVb +eWb +eXb +eYb +eZb +e%9 +e@9 +f09 +f19 +f29 +f39 +f4d +f59 +f69 +f79 +f89 +f99 +fa9 +fbd +fcb +fdb +feb +ffb +fgb +fhb +fib +fj9 +fk9 +fl9 +fm9 +fn9 +fo9 +fpd +fq9 +fr9 +fs9 +ft9 +fu9 +fv9 +fwd +fx9 +fy9 +fz9 +fA9 +fB9 +fC9 +fDd +fEb +fFb +fGb +fHb +fIb +fJb +fKb +fL9 +fM9 +fN9 +fO9 +fP9 +fQ9 +fRd +fS9 +fT9 +fU9 +fV9 +fW9 +fX9 +fYd +fZ9 +f%9 +f@9 +g09 +g19 +g29 +g3d +g4b +g5b +g6b +g7b +g8b +g9b +gab +gbb +gcb +gdb +geb +gfb +ggb +ghb +gi9 +gj9 +gk9 +gl9 +gm9 +gn9 +god +gpb +gqb +grb +gsb +gtb +gub +gvb +gw9 +gx9 +gy9 +gz9 +gA9 +gB9 +gCd +gD9 +gE9 +gF9 +gG9 +gH9 +gI9 +gJd +gKb +gLb +gMb +gNb +gOb +gPb +gQb +gRb +gSb +gTb +gUb +gVb +gWb +gXb +gY9 +gZ9 +g%9 +g@9 +h09 +h19 +h2d +h39 +h49 +h59 +h69 +h79 +h89 +h9d +ha9 +hb9 +hc9 +hd9 +he9 +hf9 +hgd +hh9 +hi9 +hj9 +hk9 +hl9 +hm9 +hnd +ho9 +hp9 +hq9 +hr9 +hs9 +ht9 +hud +hv9 +hw9 +hx9 +hy9 +hz9 +hA9 +hBd +hC9 +hD9 +hE9 +hF9 +hG9 +hH9 +hId +hJ9 +hK9 +hL9 +hM9 +hN9 +hO9 +hPd +hQb +hRb +hSb +hTb +hUb +hVb +hWb +hX9 +hY9 +hZ9 +h%9 +h@9 +i09 +i1d +i29 +i39 +i49 +i59 +i69 +i79 +i8d +i99 +ia9 +ib9 +ic9 +id9 +ie9 +ifd +igb +ihb +iib +ijb +ikb +ilb +imb +in9 +io9 +ip9 +iq9 +ir9 +is9 +itd +iub +ivb +iwb +ixb +iyb +izb +iAb +iB9 +iC9 +iD9 +iE9 +iF9 +iG9 +iHd +iI9 +iJ9 +iK9 +iL9 +iM9 +iN9 +iOd +iPb +iQb +iRb +iSb +iTb +iUb +iVb +iW9 +iX9 +iY9 +iZ9 +i%9 +i@9 +j0d +j1b +j2b +j3b +j4b +j5b +j6b +j7b +j89 +j99 +ja9 +jb9 +jc9 +jd9 +jed +jf9 +jg9 +jh9 +ji9 +jj9 +jk9 +jld +jm9 +jn9 +jo9 +jp9 +jq9 +jr9 +jsd +jt9 +ju9 +jv9 +jw9 +jx9 +jy9 +jzd +jA9 +jB9 +jC9 +jD9 +jE9 +jF9 +jGd +jHb +jIb +jJb +jKb +jLb +jMb +jNb +jO9 +jP9 +jQ9 +jR9 +jS9 +jT9 +jUd +jV9 +jW9 +jX9 +jY9 +jZ9 +j%9 +j@d +k09 +k19 +k29 +k39 +k49 +k59 +k6d +k79 +k89 +k99 +ka9 +kb9 +kc9 +kdd +keb +kfb +kgb +khb +kib +kjb +kkb +kl9 +km9 +kn9 +ko9 +kp9 +kq9 +krd +ks9 +kt9 +ku9 +kv9 +kw9 +kx9 +kyd +kzb +kAb +kBb +kCb +kDb +kEb +kFb +kG9 +kH9 +kI9 +kJ9 +kK9 +kL9 +kMd +kN9 +kO9 +kP9 +kQ9 +kR9 +kS9 +kTd +kU9 +kV9 +kW9 +kX9 +kY9 +kZ9 +k%d +k@b +l0b +l1b +l2b +l3b +l4b +l5b +l69 +l79 +l89 +l99 +la9 +lb9 +lcd +ldb +leb +lfb +lgb +lhb +lib +ljb +lk9 +ll9 +lm9 +ln9 +lo9 +lp9 +lqd +lr9 +ls9 +lt9 +lu9 +lv9 +lw9 +lxd +ly9 +lz9 +lA9 +lB9 +lC9 +lD9 +lEd +lFb +lGb +lHb +lIb +lJb +lKb +lLb +lM9 +lN9 +lO9 +lP9 +lQ9 +lR9 +lSd +lTb +lUb +lVb +lWb +lXb +lYb +lZb +l%9 +l@9 +m09 +m19 +m29 +m39 +m4d +m59 +m69 +m79 +m89 +m99 +ma9 +mbd +mc9 +md9 +me9 +mf9 +mg9 +mh9 +mid +mjb +mkb +mlb +mmb +mnb +mob +mpb +mq9 +mr9 +ms9 +mt9 +mu9 +mv9 +mwd +mx9 +my9 +mz9 +mA9 +mB9 +mC9 +mDd +mE9 +mF9 +mG9 +mH9 +mI9 +mJ9 +mKd +mLb +mMb +mNb +mOb +mPb +mQb +mRb +mS9 +mT9 +mU9 +mV9 +mW9 +mX9 +mYd +mZb +m%b +m@b +n0b +n1b +n2b +n3b +n49 +n59 +n69 +n79 +n89 +n99 +nad +nb9 +nc9 +nd9 +ne9 +nf9 +ng9 +nhd +nib +njb +nkb +nlb +nmb +nnb +nob +np9 +nq9 +nr9 +ns9 +nt9 +nu9 +nvd +nw9 +nx9 +ny9 +nz9 +nA9 +nB9 +nCd +nD9 +nE9 +nF9 +nG9 +nH9 +nI9 +nJd +nKb +nLb +nMb +nNb +nOb +nPb +nQb +nR9 +nS9 +nT9 +nU9 +nV9 +nW9 +nXd +nY9 +nZ9 +n%9 +n@9 +o09 +o19 +o2d +o39 +o49 +o59 +o69 +o79 +o89 +o9d +oab +obb +ocb +odb +oeb +ofb +ogb +oh9 +oi9 +oj9 +ok9 +ol9 +om9 +ond +oo9 +op9 +oq9 +or9 +os9 +ot9 +oud +ov9 +ow9 +ox9 +oy9 +oz9 +oA9 +oBd +oC9 +oD9 +oE9 +oF9 +oG9 +oH9 +oId +oJ9 +oK9 +oL9 +oM9 +oN9 +oO9 +oPd +oQ9 +oR9 +oS9 +oT9 +oU9 +oV9 +oWd +oX9 +oY9 +oZ9 +o%9 +o@9 +p09 +p1d +p29 +p39 +p49 +p59 +p69 +p79 +p8d +p9b +pab +pbb +pcb +pdb +peb +pfb +pg9 +ph9 +pi9 +pj9 +pk9 +pl9 +pmd +pn9 +po9 +pp9 +pq9 +pr9 +ps9 +ptd +pu9 +pv9 +pw9 +px9 +py9 +pz9 +pAd +pBb +pCb +pDb +pEb +pFb +pGb +pHb +pI9 +pJ9 +pK9 +pL9 +pM9 +pN9 +pOd +pP9 +pQ9 +pR9 +pS9 +pT9 +pU9 +pVd +pWb +pXb +pYb +pZb +p%b +p@b +q0b +q1b +q2b +q3b +q4b +q5b +q6b +q7b +q89 +q99 +qa9 +qb9 +qc9 +qd9 +qed +qf9 +qg9 +qh9 +qi9 +qj9 +qk9 +qld +qm9 +qn9 +qo9 +qp9 +qq9 +qr9 +qsd +qt9 +qu9 +qv9 +qw9 +qx9 +qy9 +qzd +qA9 +qB9 +qC9 +qD9 +qE9 +qF9 +qGd +qHb +qIb +qJb +qKb +qLb +qMb +qNb +qOb +qPb +qQb +qRb +qSb +qTb +qUb +qV9 +qW9 +qX9 +qY9 +qZ9 +q%9 +q@d +r0b +r1b +r2b +r3b +r4b +r5b +r6b +r79 +r89 +r99 +ra9 +rb9 +rc9 +rdd +re9 +rf9 +rg9 +rh9 +ri9 +rj9 +rkd +rlb +rmb +rnb +rob +rpb +rqb +rrb +rs9 +rt9 +ru9 +rv9 +rw9 +rx9 +ryd +rz9 +rA9 +rB9 +rC9 +rD9 +rE9 +rFd +rG9 +rH9 +rI9 +rJ9 +rK9 +rL9 +rMd +rN9 +rO9 +rP9 +rQ9 +rR9 +rS9 +rTd +rU9 +rV9 +rW9 +rX9 +rY9 +rZ9 +r%d +r@b +s0b +s1b +s2b +s3b +s4b +s5b +s69 +s79 +s89 +s99 +sa9 +sb9 +scd +sd9 +se9 +sf9 +sg9 +sh9 +si9 +sjd +sk9 +sl9 +sm9 +sn9 +so9 +sp9 +sqd +srb +ssb +stb +sub +svb +swb +sxb +sy9 +sz9 +sA9 +sB9 +sC9 +sD9 +sEd +sF9 +sG9 +sH9 +sI9 +sJ9 +sK9 +sLd +sMb +sNb +sOb +sPb +sQb +sRb +sSb +sT9 +sU9 +sV9 +sW9 +sX9 +sY9 +sZd +s%9 +s@9 +t09 +t19 +t29 +t39 +t4d +t59 +t69 +t79 +t89 +t99 +ta9 +tbd +tc9 +td9 +te9 +tf9 +tg9 +th9 +tid +tj9 +tk9 +tl9 +tm9 +tn9 +to9 +tpd +tq9 +tr9 +ts9 +tt9 +tu9 +tv9 +twd +tx9 +ty9 +tz9 +tA9 +tB9 +tC9 +tDd +tE9 +tF9 +tG9 +tH9 +tI9 +tJ9 +tKd +tL9 +tM9 +tN9 +tO9 +tP9 +tQ9 +tRd +tSb +tTb +tUb +tVb +tWb +tXb +tYb +tZb +t%b +t@b +u0b +u1b +u2b +u3b +u49 +u59 +u69 +u79 +u89 +u99 +uad +ub9 +uc9 +ud9 +ue9 +uf9 +ug9 +uhd +ui9 +uj9 +uk9 +ul9 +um9 +un9 +uod +up9 +uq9 +ur9 +us9 +ut9 +uu9 +uvd +uw9 +ux9 +uy9 +uz9 +uA9 +uB9 +uCd +uDb +uEb +uFb +uGb +uHb +uIb +uJb +uK9 +uL9 +uM9 +uN9 +uO9 +uP9 +uQd +uR9 +uS9 +uT9 +uU9 +uV9 +uW9 +uXd +uY9 +uZ9 +u%9 +u@9 +v09 +v19 +v2d +v39 +v49 +v59 +v69 +v79 +v89 +v9d +va9 +vb9 +vc9 +vd9 +ve9 +vf9 +vgd +vh9 +vi9 +vj9 +vk9 +vl9 +vm9 +vnd +vo9 +vp9 +vq9 +vr9 +vs9 +vt9 +vud +vv9 +vw9 +vx9 +vy9 +vz9 +vA9 +vBd +vC9 +vD9 +vE9 +vF9 +vG9 +vH9 +vId +vJ9 +vK9 +vL9 +vM9 +vN9 +vO9 +vPd +vQb +vRb +vSb +vTb +vUb +vVb +vWb +vX9 +vY9 +vZ9 +v%9 +v@9 +w09 +w1d +w29 +w39 +w49 +w59 +w69 +w79 +w8d +w99 +wa9 +wb9 +wc9 +wd9 +we9 +wfd +wg9 +wh9 +wi9 +wj9 +wk9 +wl9 +wmd +wn9 +wo9 +wp9 +wq9 +wr9 +ws9 +wtd +wu9 +wv9 +ww9 +wx9 +wy9 +wz9 +wAd +wB9 +wC9 +wD9 +wE9 +wF9 +wG9 +wHd +wI9 +wJ9 +wK9 +wL9 +wM9 +wN9 +wOd +wP9 +wQ9 +wR9 +wS9 +wT9 +wU9 +wVd +wW9 +wX9 +wY9 +wZ9 +w%9 +w@9 +x0d +x19 +x29 +x39 +x49 +x59 +x69 +x7d +x89 +x99 +xa9 +xb9 +xc9 +xd9 +xed +xf9 +xg9 +xh9 +xi9 +xj9 +xk9 +xld +xm9 +xn9 +xo9 +xp9 +xq9 +xr9 +xsd +xt9 +xu9 +xv9 +xw9 +xx9 +xy9 +xzd +xA9 +xB9 +xC9 +xD9 +xE9 +xF9 +xGd +xH9 +xI9 +xJ9 +xK9 +xL9 +xM9 +xNd +xO9 +xP9 +xQ9 +xR9 +xS9 +xT9 +xUd +xV9 +xW9 +xX9 +xY9 +xZ9 +x%9 +x@d +y09 +y19 +y29 +y39 +y49 +y59 +y6d +y79 +y89 +y99 +ya9 +yb9 +yc9 +ydd +ye9 +yf9 +yg9 +yh9 +yi9 +yj9 +ykd +yl9 +ym9 +yn9 +yo9 +yp9 +yq9 +yrd +ys9 +yt9 +yu9 +yv9 +yw9 +yx9 +yyd +yz9 +yA9 +yB9 +yC9 +yD9 +yE9 +yFd +yG9 +yH9 +yI9 +yJ9 +yK9 +yL9 +yMd +yN9 +yO9 +yP9 +yQ9 +yR9 +yS9 +yTd +yU9 +yV9 +yW9 +yX9 +yY9 +yZ9 +y%d +y@9 +z09 +z19 +z29 +z39 +z49 +z5d +z69 +z79 +z89 +z99 +za9 +zb9 +zcd +zd9 +ze9 +zf9 +zg9 +zh9 +zi9 +zjd +zk9 +zl9 +zm9 +zn9 +zo9 +zp9 +zqd +zr9 +zs9 +zt9 +zu9 +zv9 +zw9 +zxd +zy9 +zz9 +zA9 +zB9 +zC9 +zD9 +zEd +zF9 +zG9 +zH9 +zI9 +zJ9 +zK9 +zLd +zM9 +zN9 +zO9 +zP9 +zQ9 +zR9 +zSd +zT9 +zU9 +zV9 +zW9 +zX9 +zY9 +zZd +z%9 +z@9 +A09 +A19 +A29 +A39 +A4d +A59 +A69 +A79 +A89 +A99 +Aa9 +Abd +Ac9 +Ad9 +Ae9 +Af9 +Ag9 +Ah9 +Aid +Aj9 +Ak9 +Al9 +Am9 +An9 +Ao9 +Apd +Aq9 +Ar9 +As9 +At9 +Au9 +Av9 +Awd +Ax9 +Ay9 +Az9 +AA9 +AB9 +AC9 +ADd +AE9 +AF9 +AG9 +AH9 +AI9 +AJ9 +AKd +AL9 +AM9 +AN9 +AO9 +AP9 +AQ9 +ARd +AS9 +AT9 +AU9 +AV9 +AW9 +AX9 +AYd +AZ9 +A%9 +A@9 +B09 +B19 +B29 +B3d +B49 +B59 +B69 +B79 +B89 +B99 +Bad +Bb9 +Bc9 +Bd9 +Be9 +Bf9 +Bg9 +Bhd +Bi9 +Bj9 +Bk9 +Bl9 +Bm9 +Bn9 +Bod +Bp9 +Bq9 +Br9 +Bs9 +Bt9 +Bu9 +Bvd +Bw9 +Bx9 +By9 +Bz9 +BA9 +BB9 +BCd +BD9 +BE9 +BF9 +BG9 +BH9 +BI9 +BJd +BK9 +BL9 +BM9 +BN9 +BO9 +BP9 +BQd +BR9 +BS9 +BT9 +BU9 +BV9 +BW9 +BXd +0h +1h +2h +3h +4h +5h +6h +7h +8h +9h +ah +bh +ch +dh +eh +fh +gh +hh +ih +jh +kh +lh +mh +nh +oh +ph +qh +rh +sh +th +uh +vh +wh +xh +yh +zh +Ah +Bh +Ch +Dh +Eh +Fh +Gh +Hh +Ih +Jh +Kh +Lh +Mh +Nh +Oh +Ph +Qh +Rh +Sh +Th +Uh +Vh +Wh +Xh +Yh +Zh +%h +@h +10h +11h +12h +13h +14h +15h +16h +17h +18h +19h +1ah +1bh +1ch +1dh +1eh +1fh +1gh +1hh +1ih +1jh +1kh +1lh +1mh +1nh +1oh +1ph +1qh +1rh +1sh +1th +1uh +1vh +1wh +1xh +1yh +1zh +1Ah +1Bh +1Ch +1Dh +1Eh +1Fh +1Gh +1Hh +1Ih +1Jh +1Kh +1Lh +1Mh +1Nh +1Oh +1Ph +1Qh +1Rh +1Sh +1Th +1Uh +1Vh +1Wh +1Xh +1Yh +1Zh +1%h +1@h +20h +21h +22h +23h +24h +25h +26h +27h +28h +29h +2ah +2bh +2ch +2dh +2eh +2fh +2gh +2hh +2kk +2lk +2mk +2nk +2ok +2pk +2qk +2rk +2sk +2tk +2uk +2vk +2wk +2xk +2yk +2zk +2Ak +2Bk +2Ck +2Dk +2Ek +2Fk +2Gk +2Hk +2Ik +2Jk +2Kk +2Lk +2Mk +2Nk +2Ok +2Pk +2Qk +2Rk +2Sk +2Tk +2Uk +2Vk +2Wk +2Xk +2Yk +2Zk +2%k +2@k +30k +31k +32k +33k +34k +35k +36k +37k +38k +39k +3ak +3bk +3ck +3dk +3ek +3fk +3gk +3hk +3ik +3wk +3xk +3yk +3zk +3Ak +3Bk +3Ck +3Dk +3Ek +3Fk +3Gk +3Hk +3Ik +3Jk +3Kk +3Lk +3Mk +3Nk +3Ok +3Pk +3Qk +3Rk +3Sk +3Tk +3Uk +3Vk +3Wk +3Xk +3Yk +3Zk +3%k +3@k +40k +41k +42k +43k +44k +45k +46k +47k +48k +49k +4ak +4bk +4ck +4dk +4ek +4fk +4gk +4hk +4ik +4jk +4kk +4lk +4mk +4nk +4ok +4pk +4qk +4rk +4sk +4tk +4uk +4Gk +4Hk +4Ik +4Jk +4Kk +4Lk +4Mk +4Nk +4Ok +4Pk +4Qk +4Rk +4Sk +4Tk +4Uk +4Vk +4Wk +4Xk +4Yk +4Zk +4%k +4@h +50h +51h +52h +53h +54h +55h +56k +57k +58k +59k +5ak +5bk +5ck +5dk +5ek +5fk +5gk +5hk +5ik +5jk +5kh +5lh +5mh +5nh +5oh +5ph +5qh +5rk +5sk +5tk +5uk +5vk +5wk +5xk +5yk +5zk +5Ak +5Bk +5Ck +5Dk +5Ek +5Fh +5Gh +5Hh +5Ih +5Jh +5Kh +5Lh +5Mk +5Nk +5Ok +5Pk +5Qk +5Rk +5Sk +5Tk +5Uk +5Vk +5Wk +5Xk +5Yk +5Zk +5%h +5@h +60h +61h +62h +63h +64h +65k +66k +67k +68k +69k +6ak +6bk +6ck +6dk +6ek +6fk +6gk +6hk +6ik +6jh +6kh +6lh +6mh +6nh +6oh +6ph +6qk +6rk +6sk +6tk +6uk +6vk +6wk +6xh +6yh +6zh +6Ah +6Bh +6Ch +6Dh +6Ek +6Fk +6Gk +6Hk +6Ik +6Jk +6Kk +6Lk +6Mk +6Nk +6Ok +6Pk +6Qk +6Rk +6Sk +6Tk +6Uk +6Vk +6Wk +6Xk +6Yk +6Zh +6%h +6@h +70h +71h +72h +73h +74k +75k +76k +77k +78k +79k +7ak +7bk +7ck +7dk +7ek +7fk +7gk +7hk +7ik +7jk +7kk +7lk +7mk +7nk +7ok +7ph +7qh +7rh +7sh +7th +7uh +7vh +7wk +7xk +7yk +7zk +7Ak +7Bk +7Ck +7Dk +7Ek +7Fk +7Gk +7Hk +7Ik +7Jk +7Kh +7Lh +7Mh +7Nh +7Oh +7Ph +7Qh +7Rk +7Sk +7Tk +7Uk +7Vk +7Wk +7Xk +7Yh +7Zh +7%h +7@h +80h +81h +82h +83k +84k +85k +86k +87k +88k +89k +8ak +8bk +8ck +8dk +8ek +8fk +8gk +8hh +8ih +8jh +8kh +8lh +8mh +8nh +8ok +8pk +8qk +8rk +8sk +8tk +8uk +8vh +8wh +8xh +8yh +8zh +8Ah +8Bh +8Ck +8Dk +8Ek +8Fk +8Gk +8Hk +8Ik +8Jk +8Kk +8Lk +8Mk +8Nk +8Ok +8Pk +8Qk +8Rk +8Sk +8Tk +8Uk +8Vk +8Wk +8Xh +8Yh +8Zh +8%h +8@h +90h +91h +92k +93k +94k +95k +96k +97k +98k +99k +9ak +9bk +9ck +9dk +9ek +9fk +9gh +9hh +9ih +9jh +9kh +9lh +9mh +9nk +9ok +9pk +9qk +9rk +9sk +9tk +9uk +9vk +9wk +9xk +9yk +9zk +9Ak +9Bh +9Ch +9Dh +9Eh +9Fh +9Gh +9Hh +9Ik +9Jk +9Kk +9Lk +9Mk +9Nk +9Ok +9Pk +9Qk +9Rk +9Sk +9Tk +9Uk +9Vk +9Wh +9Xh +9Yh +9Zh +9%h +9@h +a0h +a1k +a2k +a3k +a4k +a5k +a6k +a7k +a8k +a9k +aak +abk +ack +adk +aek +afh +agh +ahh +aih +ajh +akh +alh +amk +ank +aok +apk +aqk +ark +ask +ath +auh +avh +awh +axh +ayh +azh +aAk +aBk +aCk +aDk +aEk +aFk +aGk +aHk +aIk +aJk +aKk +aLk +aMk +aNk +aOk +aPk +aQk +aRk +aSk +aTk +aUk +aVh +aWh +aXh +aYh +aZh +a%h +a@h +b0k +b1k +b2k +b3k +b4k +b5k +b6k +b7k +b8k +b9k +bak +bbk +bck +bdk +bek +bfk +bgk +bhk +bik +bjk +bkk +blh +bmh +bnh +boh +bph +bqh +brh +bsk +btk +buk +bvk +bwk +bxk +byk +bzk +bAk +bBk +bCk +bDk +bEk +bFk +bGh +bHh +bIh +bJh +bKh +bLh +bMh +bNk +bOk +bPk +bQk +bRk +bSk +bTk +bUh +bVh +bWh +bXh +bYh +bZh +b%h +b@k +c0k +c1k +c2k +c3k +c4k +c5k +c6k +c7k +c8k +c9k +cak +cbk +cck +cdh +ceh +cfh +cgh +chh +cih +cjh +ckk +clk +cmk +cnk +cok +cpk +cqk +crh +csh +cth +cuh +cvh +cwh +cxh +cyk +czk +cAk +cBk +cCk +cDk +cEk +cFk +cGk +cHk +cIk +cJk +cKk +cLk +cMk +cNk +cOk +cPk +cQk +cRk +cSk +cTh +cUh +cVh +cWh +cXh +cYh +cZh +c%k +c@k +d0k +d1k +d2k +d3k +d4k +d5k +d6k +d7k +d8k +d9k +dak +dbk +dck +ddk +dek +dfk +dgk +dhk +dik +djh +dkh +dlh +dmh +dnh +doh +dph +dqk +drk +dsk +dtk +duk +dvk +dwk +dxh +dyh +dzh +dAh +dBh +dCh +dDh +dEk +dFk +dGk +dHk +dIk +dJk +dKk +dLk +dMk +dNk +dOk +dPk +dQk +dRk +dSh +dTh +dUh +dVh +dWh +dXh +dYh +dZk +d%k +d@k +e0k +e1k +e2k +e3k +e4k +e5k +e6k +e7k +e8k +e9k +eak +ebh +ech +edh +eeh +efh +egh +ehh +eik +ejk +ekk +elk +emk +enk +eok +epk +eqk +erk +esk +etk +euk +evk +ewh +exh +eyh +ezh +eAh +eBh +eCh +eDk +eEk +eFk +eGk +eHk +eIk +eJk +eKh +eLh +eMh +eNh +eOh +ePh +eQh +eRk +eSk +eTk +eUk +eVk +eWk +eXk +eYk +eZk +e%k +e@k +f0k +f1k +f2k +f3k +f4k +f5k +f6k +f7k +f8k +f9k +fah +fbh +fch +fdh +feh +ffh +fgh +fhk +fik +fjk +fkk +flk +fmk +fnk +fok +fpk +fqk +frk +fsk +ftk +fuk +fvk +fwk +fxk +fyk +fzk +fAk +fBk +fCh +fDh +fEh +fFh +fGh +fHh +fIh +fJk +fKk +fLk +fMk +fNk +fOk +fPk +fQk +fRk +fSk +fTk +fUk +fVk +fWk +fXh +fYh +fZh +f%h +f@h +g0h +g1h +g2k +g3k +g4k +g5k +g6k +g7k +g8k +g9h +gah +gbh +gch +gdh +geh +gfh +ggk +ghk +gik +gjk +gkk +glk +gmk +gnk +gok +gpk +gqk +grk +gsk +gtk +guh +gvh +gwh +gxh +gyh +gzh +gAh +gBk +gCk +gDk +gEk +gFk +gGk +gHk +gIh +gJh +gKh +gLh +gMh +gNh +gOh +gPk +gQk +gRk +gSk +gTk +gUk +gVk +gWh +gXh +gYh +gZh +g%h +g@h +h0h +h1k +h2k +h3k +h4k +h5k +h6k +h7k +h8k +h9k +hak +hbk +hck +hdk +hek +hfh +hgh +hhh +hih +hjh +hkh +hlh +hmk +hnk +hok +hpk +hqk +hrk +hsk +htk +huk +hvk +hwk +hxk +hyk +hzk +hAh +hBh +hCh +hDh +hEh +hFh +hGh +hHk +hIk +hJk +hKk +hLk +hMk +hNk +hOh +hPh +hQh +hRh +hSh +hTh +hUh +hVk +hWk +hXk +hYk +hZk +h%k +h@k +i0k +i1k +i2k +i3k +i4k +i5k +i6k +i7k +i8k +i9k +iak +ibk +ick +idk +ieh +ifh +igh +ihh +iih +ijh +ikh +ilk +imk +ink +iok +ipk +iqk +irk +ish +ith +iuh +ivh +iwh +ixh +iyh +izk +iAk +iBk +iCk +iDk +iEk +iFk +iGk +iHk +iIk +iJk +iKk +iLk +iMk +iNk +iOk +iPk +iQk +iRk +iSk +iTk +iUh +iVh +iWh +iXh +iYh +iZh +i%h +i@k +j0k +j1k +j2k +j3k +j4k +j5k +j6h +j7h +j8h +j9h +jah +jbh +jch +jdk +jek +jfk +jgk +jhk +jik +jjk +jkk +jlk +jmk +jnk +jok +jpk +jqk +jrh +jsh +jth +juh +jvh +jwh +jxh +jyk +jzk +jAk +jBk +jCk +jDk +jEk +jFh +jGh +jHh +jIh +jJh +jKh +jLh +jMk +jNk +jOk +jPk +jQk +jRk +jSk +jTk +jUk +jVk +jWk +jXk +jYk +jZk +j%k +j@k +k0k +k1k +k2k +k3k +k4k +k5h +k6h +k7h +k8h +k9h +kah +kbh +kck +kdk +kek +kfk +kgk +khk +kik +kjk +kkk +klk +kmk +knk +kok +kpk +kqk +krk +ksk +ktk +kuk +kvk +kwk +kxh +kyh +kzh +kAh +kBh +kCh +kDh +kEk +kFk +kGk +kHk +kIk +kJk +kKk +kLk +kMk +kNk +kOk +kPk +kQk +kRk +kSh +kTh +kUh +kVh +kWh +kXh +kYh +kZk +k%k +k@k +l0k +l1k +l2k +l3k +l4h +l5h +l6h +l7h +l8h +l9h +lah +lbk +lck +ldk +lek +lfk +lgk +lhk +lik +ljk +lkk +llk +lmk +lnk +lok +lph +lqh +lrh +lsh +lth +luh +lvh +lwk +lxk +lyk +lzk +lAk +lBk +lCk +lDh +lEh +lFh +lGh +lHh +lIh +lJh +lKk +lLk +lMk +lNk +lOk +lPk +lQk +lRh +lSh +lTh +lUh +lVh +lWh +lXh +lYk +lZk +l%k +l@k +m0k +m1k +m2k +m3k +m4k +m5k +m6k +m7k +m8k +m9k +mah +mbh +mch +mdh +meh +mfh +mgh +mhk +mik +mjk +mkk +mlk +mmk +mnk +moh +mph +mqh +mrh +msh +mth +muh +mvk +mwk +mxk +myk +mzk +mAk +mBk +mCh +mDh +mEh +mFh +mGh +mHh +mIh +mJk +mKk +mLk +mMk +mNk +mOk +mPk +mQk +mRk +mSk +mTk +mUk +mVk +mWk +mXk +mYk +mZk +m%k +m@k +n0k +n1k +n2h +n3h +n4h +n5h +n6h +n7h +n8h +n9k +nak +nbk +nck +ndk +nek +nfk +ngk +nhk +nik +njk +nkk +nlk +nmk +nnh +noh +nph +nqh +nrh +nsh +nth +nuk +nvk +nwk +nxk +nyk +nzk +nAk +nBk +nCk +nDk +nEk +nFk +nGk +nHk +nIk +nJk +nKk +nLk +nMk +nNk +nOk +nPh +nQh +nRh +nSh +nTh +nUh +nVh +nWk +nXk +nYk +nZk +n%k +n@k +o0k +o1h +o2h +o3h +o4h +o5h +o6h +o7h +o8k +o9k +oak +obk +ock +odk +oek +ofh +ogh +ohh +oih +ojh +okh +olh +omk +onk +ook +opk +oqk +ork +osk +otk +ouk +ovk +owk +oxk +oyk +ozk +oAk +oBk +oCk +oDk +oEk +oFk +oGk +oHh +oIh +oJh +oKh +oLh +oMh +oNh +oOk +oPk +oQk +oRk +oSk +oTk +oUk +oVk +oWk +oXk +oYk +oZk +o%k +o@k +p0k +p1k +p2k +p3k +p4k +p5k +p6k +p7h +p8h +p9h +pah +pbh +pch +pdh +pek +pfk +pgk +phk +pik +pjk +pkk +plh +pmh +pnh +poh +pph +pqh +prh +psk +ptk +puk +pvk +pwk +pxk +pyk +pzh +pAh +pBh +pCh +pDh +pEh +pFh +pGk +pHk +pIk +pJk +pKk +pLk +pMk +pNk +pOk +pPk +pQk +pRk +pSk +pTk +pUh +pVh +pWh +pXh +pYh +pZh +p%h +p@k +q0k +q1k +q2k +q3k +q4k +q5k +q6h +q7h +q8h +q9h +qah +qbh +qch +qdh +qeh +qfh +qgh +qhh +qih +qjh +qkh +qlh +qmh +qnh +qoh +qph +qqh +qrk +qsk +qtk +quk +qvk +qwk +qxk +qyk +qzk +qAk +qBk +qCk +qDk +qEk +qFh +qGh +qHh +qIh +qJh +qKh +qLh +qMk +qNk +qOk +qPk +qQk +qRk +qSk +qTk +qUk +qVk +qWk +qXk +qYk +qZk +q%h +q@h +r0h +r1h +r2h +r3h +r4h +r5k +r6k +r7k +r8k +r9k +rak +rbk +rck +rdk +rek +rfk +rgk +rhk +rik +rjh +rkh +rlh +rmh +rnh +roh +rph +rqk +rrk +rsk +rtk +ruk +rvk +rwk +rxh +ryh +rzh +rAh +rBh +rCh +rDh +rEk +rFk +rGk +rHk +rIk +rJk +rKk +rLh +rMh +rNh +rOh +rPh +rQh +rRh +rSk +rTk +rUk +rVk +rWk +rXk +rYk +rZh +r%h +r@h +s0h +s1h +s2h +s3h +s4k +s5k +s6k +s7k +s8k +s9k +sak +sbh +sch +sdh +seh +sfh +sgh +shh +sik +sjk +skk +slk +smk +snk +sok +sph +sqh +srh +ssh +sth +suh +svh +swk +sxk +syk +szk +sAk +sBk +sCk +sDk +sEk +sFk +sGk +sHk +sIk +sJk +sKk +sLk +sMk +sNk +sOk +sPk +sQk +sRh +sSh +sTh +sUh +sVh +sWh +sXh +sYk +sZk +s%k +s@k +t0k +t1k +t2k +t3k +t4k +t5k +t6k +t7k +t8k +t9k +tah +tbh +tch +tdh +teh +tfh +tgh +thk +tik +tjk +tkk +tlk +tmk +tnk +tok +tpk +tqk +trk +tsk +ttk +tuk +tvh +twh +txh +tyh +tzh +tAh +tBh +tCk +tDk +tEk +tFk +tGk +tHk +tIk +tJk +tKk +tLk +tMk +tNk +tOk +tPk +tQh +tRh +tSh +tTh +tUh +tVh +tWh +tXk +tYk +tZk +t%k +t@k +u0k +u1k +u2k +u3k +u4k +u5k +u6k +u7k +u8k +u9h +uah +ubh +uch +udh +ueh +ufh +ugh +uhh +uih +ujh +ukh +ulh +umh +unk +uok +upk +uqk +urk +usk +utk +uuk +uvk +uwk +uxk +uyk +uzk +uAk +uBh +uCh +uDh +uEh +uFh +uGh +uHh +uIk +uJk +uKk +uLk +uMk +uNk +uOk +uPh +uQh +uRh +uSh +uTh +uUh +uVh +uWk +uXk +uYk +uZk +u%k +u@k +v0k +v1h +v2h +v3h +v4h +v5h +v6h +v7h +v8k +v9k +vak +vbk +vck +vdk +vek +vfk +vgk +vhk +vik +vjk +vkk +vlk +vmh +vnh +voh +vph +vqh +vrh +vsh +vtk +vuk +vvk +vwk +vxk +vyk +vzk +vAh +vBh +vCh +vDh +vEh +vFh +vGh +vHk +vIk +vJk +vKk +vLk +vMk +vNk +vOh +vPh +vQh +vRh +vSh +vTh +vUh +vVk +vWk +vXk +vYk +vZk +v%k +v@k +w0k +w1k +w2k +w3k +w4k +w5k +w6k +w7h +w8h +w9h +wah +wbh +wch +wdh +wek +wfk +wgk +whk +wik +wjk +wkk +wlh +wmh +wnh +woh +wph +wqh +wrh +wsk +wtk +wuk +wvk +wwk +wxk +wyk +wzh +wAh +wBh +wCh +wDh +wEh +wFh +wGk +wHk +wIk +wJk +wKk +wLk +wMk +wNh +wOh +wPh +wQh +wRh +wSh +wTh +wUk +wVk +wWk +wXk +wYk +wZk +w%k +w@h +x0h +x1h +x2h +x3h +x4h +x5h +x6k +x7k +x8k +x9k +xak +xbk +xck +xdh +xeh +xfh +xgh +xhh +xih +xjh +xkk +xlk +xmk +xnk +xok +xpk +xqk +xrk +xsk +xtk +xuk +xvk +xwk +xxk +xyh +xzh +xAh +xBh +xCh +xDh +xEh +xFk +xGk +xHk +xIk +xJk +xKk +xLk +xMh +xNh +xOh +xPh +xQh +xRh +xSh +xTk +xUk +xVk +xWk +xXk +xYk +xZk +x%h +x@h +y0h +y1h +y2h +y3h +y4h +y5k +y6k +y7k +y8k +y9k +yak +ybk +ych +ydh +yeh +yfh +ygh +yhh +yih +yjk +ykk +ylk +ymk +ynk +yok +ypk +yqk +yrk +ysk +ytk +yuk +yvk +ywk +yxh +yyh +yzh +yAh +yBh +yCh +yDh +yEk +yFk +yGk +yHk +yIk +yJk +yKk +yLh +yMh +yNh +yOh +yPh +yQh +yRh +ySk +yTk +yUk +yVk +yWk +yXk +yYk +yZh +y%h +y@h +z0h +z1h +z2h +z3h +z4k +z5k +z6k +z7k +z8k +z9k +zak +zbh +zch +zdh +zeh +zfh +zgh +zhh +zik +zjk +zkk +zlk +zmk +znk +zok +zpk +zqk +zrk +zsk +ztk +zuk +zvk +zwh +zxh +zyh +zzh +zAh +zBh +zCh +zDk +zEk +zFk +zGk +zHk +zIk +zJk +zKh +zLh +zMh +zNh +zOh +zPh +zQh +zRk +zSk +zTk +zUk +zVk +zWk +zXk +zYh +zZh +z%h +z@h +A0h +A1h +A2h +A3k +A4k +A5k +A6k +A7k +A8k +A9k +Aah +Abh +Ach +Adh +Aeh +Afh +Agh +Ahk +Aik +Ajk +Akk +Alk +Amk +Ank +Aoh +Aph +Aqh +Arh +Ash +Ath +Auh +Avk +Awk +Axk +Ayk +Azk +AAk +ABk +ACh +ADh +AEh +AFh +AGh +AHh +AIh +AJh +AKh +ALh +AMh +ANh +AOh +APh +AQh +ARh +ASh +ATh +AUh +AVh +AWh +AXh +AYh +AZh +A%h +A@h +B0h +B1h +B2k +B3k +B4k +B5k +B6k +B7k +B8k +B9k +Bak +Bbk +Bck +Bdk +Bek +Bfk +Bgh +Bhh +Bih +Bjh +Bkh +Blh +Bmh +Bnk +Bok +Bpk +Bqk +Brk +Bsk +Btk +Buh +Bvh +Bwh +Bxh +Byh +Bzh +BAh +BBk +BCk +BDk +BEk +BFk +BGk +BHk +BIk +BJk +BKk +BLk +BMk +BNk +BOk +BPh +BQh +BRh +BSh +BTh +BUh +BVh +BWh +BXh +BYh +BZh +B%h +B@h +C0h +C1k +C2k +C3k +C4k +C5k +C6k +C7k +C8k +C9k +Cak +Cbk +Cck +Cdk +Cek +Cfh +Cgh +Chh +Cih +Cjh +Ckh +Clh +Cmk +Cnk +Cok +Cpk +Cqk +Crk +Csk +Cth +Cuh +Cvh +Cwh +Cxh +Cyh +Czh +CAk +CBk +CCk +CDk +CEk +CFk +CGk +CHk +CIk +CJk +CKk +CLk +CMk +CNk +COh +CPh +CQh +CRh +CSh +CTh +CUh +CVk +CWk +CXk +CYk +CZk +C%k +C@k +D0h +D1h +D2h +D3h +D4h +D5h +D6h +D7k +D8k +D9k +Dak +Dbk +Dck +Ddk +Deh +Dfh +Dgh +Dhh +Dih +Djh +Dkh +Dlk +Dmk +Dnk +Dok +Dpk +Dqk +Drk +Dsk +Dtk +Duk +Dvk +Dwk +Dxk +Dyk +Dzh +DAh +DBh +DCh +DDh +DEh +DFh +DGh +DHh +DIh +DJh +DKh +DLh +DMh +DNh +DOh +DPh +DQh +DRh +DSh +DTh +DUk +DVk +DWk +DXk +DYk +DZk +D%k +D@h +E0h +E1h +E2h +E3h +E4h +E5h +E6k +E7k +E8k +E9k +Eak +Ebk +Eck +Edh +Eeh +Efh +Egh +Ehh +Eih +Ejh +Ekk +Elk +Emk +Enk +Eok +Epk +Eqk +Erh +Esh +Eth +Euh +Evh +Ewh +Exh +Eyk +Ezk +EAk +EBk +ECk +EDk +EEk +EFh +EGh +EHh +EIh +EJh +EKh +ELh +EMk +ENk +EOk +EPk +EQk +ERk +ESk +ETh +EUh +EVh +EWh +EXh +EYh +EZh +E%k +E@k +F0k +F1k +F2k +F3k +F4k +F5k +F6k +F7k +F8k +F9k +Fak +Fbk +Fch +Fdh +Feh +Ffh +Fgh +Fhh +Fih +Fjh +Fkh +Flh +Fmh +Fnh +Foh +Fph +Fqk +Frk +Fsk +Ftk +Fuk +Fvk +Fwk +Fxk +Fyk +Fzk +FAk +FBk +FCk +FDk +FEh +FFh +FGh +FHh +FIh +FJh +FKh +FLk +FMk +FNk +FOk +FPk +FQk +FRk +FSh +FTh +FUh +FVh +FWh +FXh +FYh +FZk +F%k +F@k +G0k +G1k +G2k +G3k +G4k +G5k +G6k +G7k +G8k +G9k +Gak +Gbh +Gch +Gdh +Geh +Gfh +Ggh +Ghh +Gih +Gjh +Gkh +Glh +Gmh +Gnh +Goh +Gpk +Gqk +Grk +Gsk +Gtk +Guk +Gvk +Gwh +Gxh +Gyh +Gzh +GAh +GBh +GCh +GDh +GEh +GFh +GGh +GHh +GIh +GJh +GKh +GLh +GMh +GNh +GOh +GPh +GQh +GRh +GSh +GTh +GUh +GVh +GWh +GXh +GYh +GZh +G%h +G@h +H0h +H1h +H2h +H3h +H4h +H5h +H6h +H7h +H8h +H9h +Hah +Hbh +Hch +Hdh +Heh +Hfh +Hgh +Hhh +Hih +Hjh +Hkh +Hlh +Hmh +Hnh +Hoh +Hph +Hqh +Hrh +Hsh +Hth +Huh +Hvh +Hwh +Hxh +Hyh +Hzh +HAh +HBh +0p +1p +2p +3p +4p +5p +6p +7p +8p +9p +ap +bp +cp +dp +ep +fp +gp +hp +ip +jp +kp +lp +mp +np +op +pp +qp +rp +sp +tp +up +vp +wp +xp +yp +zp +Ap +Bp +Cp +Dp +Ep +Fp +Gp +Hp +Ip +Jp +Kp +Lp +Mp +Np +Op +Pp +Qp +Rp +Sp +Tp +Up +Vp +Wp +Xp +Yp +Zp +%p +@p +10p +11p +12p +13p +14p +15p +16p +17p +18p +19p +1ap +1bp +1cp +1dp +1ep +1fp +1gp +1hp +1ip +1jp +1kp +1lp +1mp +1np +1op +1pp +1qp +1rp +1sp +1tp +1up +1vp +1wp +1xp +1yp +1zp +1Ap +1Bp +1Cp +1Dp +1Ep +1Fp +1Gp +1Hp +1Ip +1Jp +1Kp +1Lp +1Mp +1Np +1Op +1Pp +1Qp +1Rp +1Sp +1Tp +1Up +1Vp +1Wp +1Xp +1Yp +1Zp +1%p +1@p +20p +21p +22p +23p +24p +25p +26p +27p +28p +29p +2ap +2bp +2cp +2dp +2ep +2fp +2gp +2hp +2ip +2jp +2kp +2lp +2mp +2np +2op +2pp +2qp +2rp +2sp +2tp +2up +2vp +2wp +2xp +2yp +2zp +2Ap +2Bp +2Cp +2Dp +2Ep +2Fp +2Gp +2Hp +2Ip +2Jp +2Kp +2Lp +2Mp +2Np +2Op +2Pp +2Qp +2Rp +2Sp +2Tp +2Up +2Vp +2Wp +2Xp +2Yp +2Zp +2%p +2@p +30p +31p +32p +33p +34p +35p +36p +37p +38p +39p +3ap +3bp +3cp +3dp +3ep +3fp +3gp +3hp +3ip +3jp +3kp +3lp +3mp +3np +3op +3pp +3qp +3rp +3sp +3tp +3up +3vp +3wp +3xp +3yp +3zp +3Ap +3Bp +3Cp +3Dp +3Ep +3Fp +3Gp +3Hp +3Ip +3Jp +3Kp +3Lp +3Mp +3Np +3Op +3Pp +3Qp +3Rp +3Sp +3Tp +3Up +3Vp +3Wp +3Xp +3Yp +3Zp +3%p +3@p +40p +41p +42p +43p +44p +45p +46p +47p +48p +49p +4ap +4bp +4cp +4dp +4ep +4fp +4gp +4hp +4ip +4jp +4kp +4lp +4mp +4np +4op +4pp +4qp +4rp +4sp +4tp +4up +4vp +4wp +4xp +4yp +4zp +4Ap +4Bp +4Cp +4Dp +4Ep +4Fp +4Gp +4Hp +4Ip +4Jp +4Kp +4Lp +4Mp +4Np +4Op +4Pp +4Qp +4Rp +4Sp +4Tp +4Up +4Vp +4Wp +4Xp +4Yp +4Zp +4%p +4@p +50p +51p +52p +53p +54p +55p +56p +57p +58p +59p +5ap +5bp +5cp +5dp +5ep +5fp +5gp +5hp +5ip +5jp +5kp +5lp +5mp +5np +5op +5pp +5qp +5rp +5sp +5tp +5up +5vp +5wp +5xp +5yp +5zp +5Ap +5Bp +5Cp +5Dp +5Ep +5Fp +5Gp +5Hp +5Ip +5Jp +5Kp +5Lp +5Mp +5Np +5Op +5Pp +5Qp +5Rp +5Sp +5Tp +5Up +5Vp +5Wp +5Xp +5Yp +5Zp +5%p +5@p +60p +61p +62p +63p +64p +65p +66p +67p +68p +69p +6ap +6bp +6cp +6dp +6ep +6fp +6gp +6hp +6ip +6jp +6kp +6lp +6mp +6np +6op +6pp +6qp +6rp +6sp +6tp +6up +6vp +6wp +6xp +6yp +6zp +6Ap +6Bp +6Cp +6Dp +6Ep +6Fp +6Gp +6Hp +6Ip +6Jp +6Kp +6Lp +6Mp +6Np +6Op +6Pp +6Qp +6Rp +6Sp +6Tp +6Up +6Vp +6Wp +6Xp +6Yp +6Zp +6%p +6@p +70p +71p +72p +73p +74p +75p +76p +77p +78p +79p +7ap +7bp +7cp +7dp +7ep +7fp +7gp +7hp +7ip +7jp +7kp +7lp +7mp +7np +7op +7pp +7qp +7rp +7sp +7tp +7up +7vp +7wp +7xp +7yp +7zp +7Ap +7Bp +7Cp +7Dp +7Ep +7Fp +7Gp +7Hp +7Ip +7Jp +7Kp +7Lp +7Mp +7Np +7Op +7Pp +7Qp +7Rp +7Sp +7Tp +7Up +7Vp +7Wp +7Xp +7Yp +7Zp +7%p +7@p +80p +81p +82p +83p +84p +85p +86p +87p +88p +89p +8ap +8bp +8cp +8dp +8ep +8fp +8gp +8hp +8ip +8jp +8kp +8lp +8mp +8np +8op +8pp +8qp +8rp +8sp +8tp +8up +8vp +8wp +8xp +8yp +8zp +8Ap +8Bp +8Cp +8Dp +8Ep +8Fp +8Gp +8Hp +8Ip +8Jp +8Kp +8Lp +8Mp +8Np +8Op +8Pp +8Qp +8Rp +8Sp +8Tp +8Up +8Vp +8Wp +8Xp +8Yp +8Zp +8%p +8@p +90p +91p +92p +93p +94p +95p +96p +97p +98p +99p +9ap +9bp +9cp +9dp +9ep +9fp +9gp +9hp +9ip +9jp +9kp +9lp +9mp +9np +9op +9pp +9qp +9rp +9sp +9tp +9up +9vp +9wp +9xp +9yp +9zp +9Ap +9Bp +9Cp +9Dp +9Ep +9Fp +9Gp +9Hp +9Ip +9Jp +9Kp +9Lp +9Mp +9Np +9Op +9Pp +9Qp +9Rp +9Sp +9Tp +9Up +9Vp +9Wp +9Xp +9Yp +9Zp +9%p +9@p +a0p +a1p +a2p +a3p +a4p +a5p +a6p +a7p +a8p +a9p +aap +abp +acp +adp +aep +afp +agp +ahp +aip +ajp +akp +alp +amp +anp +aop +app +aqp +arp +asp +atp +aup +avp +awp +axp +ayp +azp +aAp +aBp +aCp +aDp +aEp +aFp +aGp +aHp +aIp +aJp +aKp +aLp +aMp +aNp +aOp +aPp +aQp +aRp +aSp +aTp +aUp +aVp +aWp +aXp +aYp +aZp +a%p +a@p +b0p +b1p +b2p +b3p +b4p +b5p +b6p +b7p +b8p +b9p +bap +bbp +bcp +bdp +bep +bfp +bgp +bhp +bip +bjp +bkp +blp +bmp +bnp +bop +bpp +bqp +brp +bsp +btp +bup +bvp +bwp +bxp +byp +bzp +bAp +bBp +bCp +bDp +bEp +bFp +bGp +bHp +bIp +bJp +bKp +bLp +bMp +bNp +bOp +bPp +bQp +bRp +bSp +bTp +bUp +bVp +bWp +bXp +bYp +bZp +b%p +b@p +c0p +c1p +c2p +c3p +c4p +c5p +c6p +c7p +c8p +c9p +cap +cbp +ccp +cdp +cep +cfp +cgp +chp +cip +cjp +ckp +clp +cmp +cnp +cop +cpp +cqp +crp +csp +ctp +cup +cvp +cwp +cxp +cyp +czp +cAp +cBp +cCp +cDp +cEp +cFp +cGp +cHp +cIp +cJp +cKp +cLp +cMp +cNp +cOp +cPp +cQp +cRp +cSp +cTp +cUp +cVp +cWp +cXp +cYp +cZp +c%p +c@p +d0p +d1p +d2p +d3p +d4p +d5p +d6p +d7p +d8p +d9p +dap +dbp +dcp +ddp +dep +dfp +dgp +dhp +dip +djp +dkp +dlp +dmp +dnp +dop +dpp +dqp +drp +dsp +dtp +dup +dvp +dwp +dxp +dyp +dzp +dAp +dBp +dCp +dDp +dEp +dFp +dGp +dHp +dIp +dJp +dKp +dLp +dMp +dNp +dOp +dPp +dQp +dRp +dSp +dTp +dUp +dVp +dWp +dXp +dYp +dZp +d%p +d@p +e0p +e1p +e2p +e3p +e4p +e5p +e6p +e7p +e8p +e9p +eap +ebp +ecp +edp +eep +efp +egp +ehp +eip +ejp +ekp +elp +emp +enp +eop +epp +eqp +erp +esp +etp +eup +evp +ewp +exp +eyp +ezp +eAp +eBp +eCp +eDp +eEp +eFp +eGp +eHp +eIp +eJp +eKp +eLp +eMp +eNp +eOp +ePp +eQp +eRp +eSp +eTp +eUp +eVp +eWp +eXp +eYp +eZp +e%p +e@p +f0p +f1p +f2p +f3p +f4p +f5p +f6p +f7p +f8p +f9p +fap +fbp +fcp +fdp +fep +ffp +fgp +fhp +fip +fjp +fkp +flp +fmp +fnp +fop +fpp +fqp +frp +fsp +ftp +fup +fvp +fwp +fxp +fyp +fzp +fAp +fBp +fCp +fDp +fEp +fFp +fGp +fHp +fIp +fJp +fKp +fLp +fMp +fNp +fOp +fPp +fQp +fRp +fSp +fTp +fUp +fVp +fWp +fXp +fYp +fZp +-end- + +3 +smd 8 +sms 2419 +advmesh 233096 + +
+4 +41 file:///lore/dibanez/meshes/pipe/pipe.sms9 mesh.full6 # 1 0 0 +0 +1 +5 model4 +10 ./pipe.smd24 model.nonmanifold.simple6 # 1 0 0 +
+260231 260280 diff --git a/smoke_test_meshes/pipe/pipe0.smb b/smoke_test_meshes/pipe/pipe0.smb new file mode 100644 index 0000000000000000000000000000000000000000..669ebd6b2760cda08831f28611ee4aee9d426cd6 GIT binary patch literal 235600 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 Date: Thu, 29 Aug 2024 15:16:58 -0400 Subject: [PATCH 46/55] Moved capStone2VTK to test/cap2vtk Signed-off-by: Aiden Woodruff --- capstone_clis/CMakeLists.txt | 1 - test/CMakeLists.txt | 1 + capstone_clis/capStone2VTK.cc => test/cap2vtk.cc | 0 3 files changed, 1 insertion(+), 1 deletion(-) rename capstone_clis/capStone2VTK.cc => test/cap2vtk.cc (100%) diff --git a/capstone_clis/CMakeLists.txt b/capstone_clis/CMakeLists.txt index 5d1c29f00..0b69317e4 100644 --- a/capstone_clis/CMakeLists.txt +++ b/capstone_clis/CMakeLists.txt @@ -22,7 +22,6 @@ if(ENABLE_CAPSTONE) util_exe_func(capStoneGeomTest capStoneGeomTest.cc) util_exe_func(capStoneAttachSolution capStoneAttachSolution.cc) util_exe_func(capStoneCheckParametrization capStoneCheckParametrization.cc) - util_exe_func(capStone2VTK capStone2VTK.cc) endif() bob_end_subdir() diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 7c874b151..de36ea2f5 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -217,6 +217,7 @@ if(ENABLE_CAPSTONE) if(HAVE_CAPSTONE_SIZINGMETRICTOOL) util_exe_func(cap_smooth cap_smooth.cc) endif() + util_exe_func(cap2vtk cap2vtk.cc) endif() # send all the newly added utility executable targets diff --git a/capstone_clis/capStone2VTK.cc b/test/cap2vtk.cc similarity index 100% rename from capstone_clis/capStone2VTK.cc rename to test/cap2vtk.cc From 8346e811c10e4e139f2608e450330a1bf659cd19 Mon Sep 17 00:00:00 2001 From: Aiden Woodruff Date: Sat, 31 Aug 2024 19:19:50 -0400 Subject: [PATCH 47/55] Remove exe sources which are not in CMake - My rationale is that these are old ad-hoc tests. - Removed B737 test as well. The CRE is not available so it should not be a test. Signed-off-by: Aiden Woodruff --- capstone_clis/CMakeLists.txt | 1 - capstone_clis/capStoneAnalyzeArea.cc | 247 ---- capstone_clis/capStoneAnalyzeEdgeLengths.cc | 253 ---- capstone_clis/capStoneAttachSolution2.cc | 1108 ---------------- .../capStoneAttachSolutionStrandOnly.cc | 1161 ----------------- capstone_clis/capStoneAttachSolutionUni.cc | 951 -------------- capstone_clis/capStoneCurve.cc | 200 --- capstone_clis/capStoneIsoAdaptB737.cc | 379 ------ 8 files changed, 4300 deletions(-) delete mode 100644 capstone_clis/capStoneAnalyzeArea.cc delete mode 100644 capstone_clis/capStoneAnalyzeEdgeLengths.cc delete mode 100644 capstone_clis/capStoneAttachSolution2.cc delete mode 100644 capstone_clis/capStoneAttachSolutionStrandOnly.cc delete mode 100644 capstone_clis/capStoneAttachSolutionUni.cc delete mode 100644 capstone_clis/capStoneCurve.cc delete mode 100644 capstone_clis/capStoneIsoAdaptB737.cc diff --git a/capstone_clis/CMakeLists.txt b/capstone_clis/CMakeLists.txt index 0b69317e4..48bba44de 100644 --- a/capstone_clis/CMakeLists.txt +++ b/capstone_clis/CMakeLists.txt @@ -18,7 +18,6 @@ endfunction(test_exe_func) if(ENABLE_CAPSTONE) util_exe_func(capStoneAnisoAdapt capStoneAnisoAdapt.cc) util_exe_func(capStoneAnisoAdaptWing capStoneAnisoAdaptWing.cc) - util_exe_func(capStoneIsoAdaptB737 capStoneIsoAdaptB737.cc) util_exe_func(capStoneGeomTest capStoneGeomTest.cc) util_exe_func(capStoneAttachSolution capStoneAttachSolution.cc) util_exe_func(capStoneCheckParametrization capStoneCheckParametrization.cc) diff --git a/capstone_clis/capStoneAnalyzeArea.cc b/capstone_clis/capStoneAnalyzeArea.cc deleted file mode 100644 index fdf4a0c90..000000000 --- a/capstone_clis/capStoneAnalyzeArea.cc +++ /dev/null @@ -1,247 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -#include "CapstoneModule.h" -#include "CreateMG_Framework_Core.h" -#include "CreateMG_Framework_Analysis.h" -#include "CreateMG_Framework_Application.h" -#include "CreateMG_Framework_Attributes.h" -#include "CreateMG_Framework_Core.h" -#include "CreateMG_Framework_Geometry.h" -#include "CreateMG_Framework_Mesh.h" - -using namespace CreateMG; -using namespace CreateMG::Attribution; -using namespace CreateMG::Mesh; -using namespace CreateMG::Geometry; - - -double totalArea(apf::Mesh2* m); - -double addSizeDistribution(apf::Mesh2* m, int factor, - std::vector& binCount, std::vector& binArea); - - -int main(int argc, char** argv) -{ - MPI_Init(&argc, &argv); - PCU_Comm_Init(); - lion_set_verbosity(1); - double initialTime = PCU_Time(); - - if (argc != 3) { - if(0==PCU_Comm_Self()) - std::cerr << "usage: " << argv[0] - << " \n"; - return EXIT_FAILURE; - } - - - gmi_register_mesh(); - gmi_register_null(); - - const char* creFileName = argv[1]; - int factor = atoi(argv[2]); - - // load capstone mesh - // create an instance of the Capstone Module activating CREATE/CREATE/CREATE - // for the Geometry/Mesh/Attribution databases - /* const std::string gdbName("Geometry Database : Create");// Switch Create with SMLIB for CAD */ - const std::string gdbName("Geometry Database : SMLIB");// Switch Create with SMLIB for CAD - const std::string mdbName("Mesh Database : Create"); - const std::string adbName("Attribution Database : Create"); - - CapstoneModule cs("the_module", gdbName.c_str(), mdbName.c_str(), adbName.c_str()); - - GeometryDatabaseInterface *g = cs.get_geometry(); - MeshDatabaseInterface *m = cs.get_mesh(); - AppContext *c = cs.get_context(); - - - PCU_ALWAYS_ASSERT(g); - PCU_ALWAYS_ASSERT(m); - PCU_ALWAYS_ASSERT(c); - - v_string filenames; - filenames.push_back(creFileName); - - M_GModel gmodel = cs.load_files(filenames); - - int numbreps = 0; - MG_CALL(g->get_num_breps(numbreps)); - std::cout << "number of b reps is " << numbreps << std::endl; - if(numbreps == 0) - error(HERE, ERR_INVALID_INPUT, "Model is empty"); - - M_MModel mmodel; - // Pick the volume mesh model from associated mesh models to this geom model - std::vector mmodels; - MG_API_CALL(m, get_associated_mesh_models(gmodel, mmodels)); - for(std::size_t i = 0; i < mmodels.size(); ++i) - { - M_MModel ammodel = mmodels[i]; - std::size_t numregs = 0; - std::size_t numfaces = 0; - std::size_t numedges = 0; - std::size_t numverts = 0; - MG_API_CALL(m, set_current_model(ammodel)); - MG_API_CALL(m, get_num_topos(TOPO_REGION, numregs)); - MG_API_CALL(m, get_num_topos(TOPO_FACE, numfaces)); - MG_API_CALL(m, get_num_topos(TOPO_EDGE, numedges)); - MG_API_CALL(m, get_num_topos(TOPO_VERTEX, numverts)); - std::cout << "num regions is " << numregs << std::endl; - std::cout << "num faces is " << numfaces << std::endl; - std::cout << "num edges is " << numedges << std::endl; - std::cout << "num verts is " << numverts << std::endl; - std::cout << "-----------" << std::endl; - if(numregs > 0) - { - mmodel = ammodel; - break; - } - } - - /* SET THE ADJACENCIES */ - MG_API_CALL(m, set_adjacency_state(REGION2FACE| - REGION2EDGE| - REGION2VERTEX| - FACE2EDGE| - FACE2VERTEX)); - MG_API_CALL(m, set_reverse_states()); - MG_API_CALL(m, set_adjacency_scope(TOPO_EDGE, SCOPE_FULL)); - MG_API_CALL(m, set_adjacency_scope(TOPO_FACE, SCOPE_FULL)); - MG_API_CALL(m, compute_adjacency()); - - - gmi_cap_start(); - gmi_register_cap(); - - printf("---- CapStone Mesh Loaded. \n"); - - // create the mesh object (this one is CapStone underneath) - printf("\n---- Creating Mesh Wrapper Object. \n"); - apf::Mesh2* mesh = apf::createMesh(m,g); - printf("---- Creating Mesh Wrapper Object: Done. \n"); - - // add size distribution based on area - std::vector binCount; - std::vector binArea; - double minArea = addSizeDistribution(mesh, factor, binCount, binArea); - - printf("min area is %f\n", minArea); - - int a_lower_factor = 1; - for (std::size_t i = 0; i < binCount.size(); i++) { - double mn = i == 0 ? 0 : a_lower_factor * minArea; - double mx = i == 0 ? minArea : 4 * a_lower_factor * minArea; - printf("bin %lu's [%f,%f] count/area is %d/%g \n", i, mn, mx, binCount[i], binArea[i]); - a_lower_factor *= i == 0 ? 1 : 4; - } - - double totalBinArea = 0.0; - int totalBinCount = 0; - - for (std::size_t i = 0; i < binCount.size(); i++) { - totalBinCount += binCount[i]; - totalBinArea += binArea[i]; - } - - printf("total area is %E \n", totalArea(mesh)); - printf("total bin area is %E \n", totalBinArea); - printf("total bin count is %lu \n", totalBinCount); - - gmi_cap_stop(); - PCU_Comm_Free(); - MPI_Finalize(); -} - -double totalArea(apf::Mesh2* m) -{ - double area = 0.0; - apf::MeshEntity* e; - apf::MeshIterator* it; - it = m->begin(2); - while ( (e = m->iterate(it)) ) - area += apf::measure(m, e); - m->end(it); - return area; -} - -double addSizeDistribution(apf::Mesh2* m, int factor, - std::vector& binCount, std::vector& binArea) -{ - // find the min length edge - apf::MeshEntity* e; - apf::MeshIterator* it; - - double minLength = 1.0e12; - it = m->begin(1); - while ( (e = m->iterate(it)) ) { - double l = apf::measure(m, e); - if (l < minLength) - minLength = l; - } - m->end(it); - - double minArea = minLength * minLength / 2.; - - // initialize the arrays - for (int i = 1; i <= factor*factor; i*=4) { - binCount.push_back(0); - binArea.push_back(0.0); - } - - binCount.push_back(0); - binCount.push_back(0); - binArea.push_back(0.0); - binArea.push_back(0.0); - - it = m->begin(2); - while ( (e = m->iterate(it)) ) { - double a = apf::measure(m, e); - if (a < minArea){ - binCount[0] += 1; - binArea[0] += a; - continue; - } - int count = 1; - int i; - for (i = 1; i <= factor*factor; i*=4) { - if ((a >= i * minArea) && (a < 4 * i * minArea)) { - binCount[count] += 1; - binArea[count] += a; - } - count++; - } - i = i/4; - if (a >= 4 * i * minArea) { - binCount[count] += 1; - binArea[count] += a; - } - } - m->end(it); - return minArea; -} diff --git a/capstone_clis/capStoneAnalyzeEdgeLengths.cc b/capstone_clis/capStoneAnalyzeEdgeLengths.cc deleted file mode 100644 index 31dd09403..000000000 --- a/capstone_clis/capStoneAnalyzeEdgeLengths.cc +++ /dev/null @@ -1,253 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -#include "CapstoneModule.h" -#include "CreateMG_Framework_Core.h" -#include "CreateMG_Framework_Analysis.h" -#include "CreateMG_Framework_Application.h" -#include "CreateMG_Framework_Attributes.h" -#include "CreateMG_Framework_Core.h" -#include "CreateMG_Framework_Geometry.h" -#include "CreateMG_Framework_Mesh.h" - -using namespace CreateMG; -using namespace CreateMG::Attribution; -using namespace CreateMG::Mesh; -using namespace CreateMG::Geometry; - - -double totalArea(apf::Mesh2* m); - -double addSizeDistribution(apf::Mesh2* m, int factor, - std::vector& binCount, std::vector& binArea); - -void edgeLengthStats(apf::Mesh2* m); - -int main(int argc, char** argv) -{ - MPI_Init(&argc, &argv); - PCU_Comm_Init(); - lion_set_verbosity(1); - double initialTime = PCU_Time(); - - if (argc != 3) { - if(0==PCU_Comm_Self()) - std::cerr << "usage: " << argv[0] - << " \n"; - return EXIT_FAILURE; - } - - - gmi_register_mesh(); - gmi_register_null(); - - const char* creFileName = argv[1]; - int factor = atoi(argv[2]); - - // load capstone mesh - // create an instance of the Capstone Module activating CREATE/CREATE/CREATE - // for the Geometry/Mesh/Attribution databases - /* const std::string gdbName("Geometry Database : Create");// Switch Create with SMLIB for CAD */ - const std::string gdbName("Geometry Database : SMLIB");// Switch Create with SMLIB for CAD - const std::string mdbName("Mesh Database : Create"); - const std::string adbName("Attribution Database : Create"); - - CapstoneModule cs("the_module", gdbName.c_str(), mdbName.c_str(), adbName.c_str()); - - GeometryDatabaseInterface *g = cs.get_geometry(); - MeshDatabaseInterface *m = cs.get_mesh(); - AppContext *c = cs.get_context(); - - - PCU_ALWAYS_ASSERT(g); - PCU_ALWAYS_ASSERT(m); - PCU_ALWAYS_ASSERT(c); - - v_string filenames; - filenames.push_back(creFileName); - - M_GModel gmodel = cs.load_files(filenames); - - int numbreps = 0; - MG_CALL(g->get_num_breps(numbreps)); - std::cout << "number of b reps is " << numbreps << std::endl; - if(numbreps == 0) - error(HERE, ERR_INVALID_INPUT, "Model is empty"); - - M_MModel mmodel; - // Pick the volume mesh model from associated mesh models to this geom model - std::vector mmodels; - MG_API_CALL(m, get_associated_mesh_models(gmodel, mmodels)); - for(std::size_t i = 0; i < mmodels.size(); ++i) - { - M_MModel ammodel = mmodels[i]; - std::size_t numregs = 0; - std::size_t numfaces = 0; - std::size_t numedges = 0; - std::size_t numverts = 0; - MG_API_CALL(m, set_current_model(ammodel)); - MG_API_CALL(m, get_num_topos(TOPO_REGION, numregs)); - MG_API_CALL(m, get_num_topos(TOPO_FACE, numfaces)); - MG_API_CALL(m, get_num_topos(TOPO_EDGE, numedges)); - MG_API_CALL(m, get_num_topos(TOPO_VERTEX, numverts)); - std::cout << "num regions is " << numregs << std::endl; - std::cout << "num faces is " << numfaces << std::endl; - std::cout << "num edges is " << numedges << std::endl; - std::cout << "num verts is " << numverts << std::endl; - std::cout << "-----------" << std::endl; - if(numregs > 0) - { - mmodel = ammodel; - break; - } - } - - /* SET THE ADJACENCIES */ - MG_API_CALL(m, set_adjacency_state(REGION2FACE| - REGION2EDGE| - REGION2VERTEX| - FACE2EDGE| - FACE2VERTEX)); - MG_API_CALL(m, set_reverse_states()); - MG_API_CALL(m, set_adjacency_scope(TOPO_EDGE, SCOPE_FULL)); - MG_API_CALL(m, set_adjacency_scope(TOPO_FACE, SCOPE_FULL)); - MG_API_CALL(m, compute_adjacency()); - - - gmi_cap_start(); - gmi_register_cap(); - - printf("---- CapStone Mesh Loaded. \n"); - - // create the mesh object (this one is CapStone underneath) - printf("\n---- Creating Mesh Wrapper Object. \n"); - apf::Mesh2* mesh = apf::createMesh(m,g); - printf("---- Creating Mesh Wrapper Object: Done. \n"); - - // add size distribution based on area - std::vector binCount; - std::vector binArea; - edgeLengthStats(mesh); - - gmi_cap_stop(); - PCU_Comm_Free(); - MPI_Finalize(); -} - -double totalArea(apf::Mesh2* m) -{ - double area = 0.0; - apf::MeshEntity* e; - apf::MeshIterator* it; - it = m->begin(2); - while ( (e = m->iterate(it)) ) - area += apf::measure(m, e); - m->end(it); - return area; -} - -double addSizeDistribution(apf::Mesh2* m, int factor, - std::vector& binCount, std::vector& binArea) -{ - // find the min length edge - apf::MeshEntity* e; - apf::MeshIterator* it; - - double minLength = 1.0e12; - it = m->begin(1); - while ( (e = m->iterate(it)) ) { - double l = apf::measure(m, e); - if (l < minLength) - minLength = l; - } - m->end(it); - - double minArea = minLength * minLength / 2.; - - // initialize the arrays - for (int i = 1; i <= factor*factor; i*=4) { - binCount.push_back(0); - binArea.push_back(0.0); - } - - binCount.push_back(0); - binCount.push_back(0); - binArea.push_back(0.0); - binArea.push_back(0.0); - - it = m->begin(2); - while ( (e = m->iterate(it)) ) { - double a = apf::measure(m, e); - if (a < minArea){ - binCount[0] += 1; - binArea[0] += a; - continue; - } - int count = 1; - int i; - for (i = 1; i <= factor*factor; i*=4) { - if ((a >= i * minArea) && (a < 4 * i * minArea)) { - binCount[count] += 1; - binArea[count] += a; - } - count++; - } - i = i/4; - if (a >= 4 * i * minArea) { - binCount[count] += 1; - binArea[count] += a; - } - } - m->end(it); - return minArea; -} - -void edgeLengthStats(apf::Mesh2* m) -{ - // find the min length edge - apf::MeshEntity* e; - apf::MeshIterator* it; - - double minLength = 1.0e12; - double maxLength = 0.0; - double avgLength = 0.0; - double count = 0; - it = m->begin(1); - while ( (e = m->iterate(it)) ) { - double l = apf::measure(m, e); - if (l < minLength) - minLength = l; - if (l > maxLength) - maxLength = l; - avgLength += l; - count++; - } - m->end(it); - avgLength /= count; - - printf("min/max/avg lengths are: %E/%E/%E\n", minLength, maxLength, avgLength); - printf("num tris is %d\n", m->count(2)); -} diff --git a/capstone_clis/capStoneAttachSolution2.cc b/capstone_clis/capStoneAttachSolution2.cc deleted file mode 100644 index 7d73b0592..000000000 --- a/capstone_clis/capStoneAttachSolution2.cc +++ /dev/null @@ -1,1108 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -#include "CapstoneModule.h" -#include "CreateMG_Framework_Core.h" -#include "CreateMG_Framework_Analysis.h" -#include "CreateMG_Framework_Application.h" -#include "CreateMG_Framework_Attributes.h" -#include "CreateMG_Framework_Core.h" -#include "CreateMG_Framework_Geometry.h" -#include "CreateMG_Framework_Mesh.h" - -using namespace CreateMG; -using namespace CreateMG::Attribution; -using namespace CreateMG::Mesh; -using namespace CreateMG::Geometry; - - -typedef std::vector row; - -std::vector readTable(const char* name); - -std::vector extractSurfaceData(const std::vector &table, - const int strandSize, const int col); - -void removeUnusedVerts(apf::Mesh2* m, int offset); - -apf::Mesh2* createVolumeMesh(apf::Mesh2* m, const std::vector &t, int s, - std::vector > &surfToStrandMap); - -apf::Field* addScalarField(apf::Mesh2* m, const std::vector t, const char* name, int col, int strandSize); - -apf::Field* addVector3Field(apf::Mesh2* m, const std::vector t, const char* name, - int col0, int col1, int col2, int strandSize); - -void writeCre(CapstoneModule& cs, const std::string& fileName); - -struct SortingStruct -{ - apf::Vector3 v; - double wm; - bool operator<(const SortingStruct &other) const - { - return wm < other.wm; - } -}; - -//gradation routines from Proteus - -int gradeSizeModify(apf::Mesh* m, apf::Field* size_iso,double gradingFactor, - double size[2], apf::Adjacent edgAdjVert, - apf::Adjacent vertAdjEdg, - std::queue &markedEdges, - apf::MeshTag* isMarked, - int fieldType, - int vecPos, //which idx of sizeVec to modify - int idxFlag) - -//General function to actually modify sizes -{ - (void)vecPos; - //Determine a switching scheme depending on which vertex needs a modification - int idx1,idx2; - if(idxFlag == 0){ - idx1=0; - idx2=1; - } - else{ - idx1=1; - idx2 = 0; - } - - int marker[3] = {0,1,0}; - double marginVal = 0.01; - int needsParallel=0; - - if(fieldType == apf::SCALAR){ - //apf::Field* size_iso = m->findField("size"); - - if(size[idx1]>(gradingFactor*size[idx2])*(1+marginVal)) - { - if(m->isOwned(edgAdjVert[idx1])) - { - size[idx1] = gradingFactor*size[idx2]; - apf::setScalar(size_iso,edgAdjVert[idx1],0,size[idx1]); - m->getAdjacent(edgAdjVert[idx1], 1, vertAdjEdg); - for (std::size_t i=0; igetIntTag(vertAdjEdg[i],isMarked,&marker[2]); - //if edge is not already marked - if(!marker[2]){ - m->setIntTag(vertAdjEdg[i],isMarked,&marker[1]); - markedEdges.push(vertAdjEdg[i]); - } - } - } //end isOwned - else - { //Pack information to owning processor - needsParallel=1; - apf::Copies remotes; - m->getRemotes(edgAdjVert[idx1],remotes); - double newSize = gradingFactor*size[idx2]; - int owningPart=m->getOwner(edgAdjVert[idx1]); - PCU_COMM_PACK(owningPart, remotes[owningPart]); - PCU_COMM_PACK(owningPart,newSize); - } - } - - }//end if apf::SCALAR - return needsParallel; -} - -void markEdgesInitial(apf::Mesh* m, apf::Field* size_iso, std::queue &markedEdges,double gradingFactor) -//Function used to initially determine which edges need to be considered for gradation -{ - //marker structure for 0) not marked 1) marked 2)storage - int marker[3] = {0,1,0}; - - double size[2]; - apf::MeshTag* isMarked = m->findTag("isMarked"); -// apf::Field* size_iso = m->findField("size"); - apf::Adjacent edgAdjVert; - apf::MeshEntity* edge; - apf::MeshIterator* it = m->begin(1); - while((edge=m->iterate(it))){ - m->getAdjacent(edge, 0, edgAdjVert); - for (std::size_t i=0; i < edgAdjVert.getSize(); ++i){ - size[i]=apf::getScalar(size_iso,edgAdjVert[i],0); - } - if( (size[0] > gradingFactor*size[1]) || (size[1] > gradingFactor*size[0]) ){ - //add edge to a queue - markedEdges.push(edge); - //tag edge to indicate that it is part of queue - m->setIntTag(edge,isMarked,&marker[1]); - } - else{ - m->setIntTag(edge,isMarked,&marker[0]); - } - } - m->end(it); -} - -int serialGradation(apf::Mesh* m,apf::Field* size_iso, std::queue &markedEdges,double gradingFactor) -//Function used loop over the mesh edge queue for gradation and modify the sizes -{ - double size[2]; - //marker structure for 0) not marked 1) marked 2)storage - int marker[3] = {0,1,0}; - apf::MeshTag* isMarked = m->findTag("isMarked"); -// apf::Field* size_iso = m->findField("size"); - apf::Adjacent edgAdjVert; - apf::Adjacent vertAdjEdg; - apf::MeshEntity* edge; - int needsParallel=0; - - //perform serial gradation while packing necessary info for parallel - while(!markedEdges.empty()){ - edge = markedEdges.front(); - m->getAdjacent(edge, 0, edgAdjVert); - for (std::size_t i=0; i < edgAdjVert.getSize(); ++i){ - size[i] = apf::getScalar(size_iso,edgAdjVert[i],0); - } - - needsParallel+=gradeSizeModify(m,size_iso, gradingFactor, size, edgAdjVert, - vertAdjEdg, markedEdges, isMarked, apf::SCALAR,0, 0); - needsParallel+=gradeSizeModify(m,size_iso, gradingFactor, size, edgAdjVert, - vertAdjEdg, markedEdges, isMarked, apf::SCALAR,0, 1); - - m->setIntTag(edge,isMarked,&marker[0]); - markedEdges.pop(); - } - return needsParallel; -} - -int gradeMesh(apf::Mesh* m,apf::Field* size_iso) -//Function to grade isotropic mesh through comparison of edge vertex size ratios -//This implementation accounts for parallel meshes as well -//First do serial gradation. -//If a shared entity has its size modified, then send new size to owning copy. -//After full loop over entities, have owning copy take minimum of all sizes received -//Flag adjacent entities to owning copy. -//Communicate to remote copies that a size was modified, and flag adjacent edges to remote copies for further gradation -{ - //unique to this code - //apf::Field* size_iso = m->findField("size"); - double gradingFactor = 1.2; - // - - apf::MeshEntity* edge; - apf::Adjacent edgAdjVert; - apf::Adjacent vertAdjEdg; - std::queue markedEdges; - apf::MeshTag* isMarked = m->createIntTag("isMarked",1); - - //marker structure for 0) not marked 1) marked 2)storage - int marker[3] = {0,1,0}; - - apf::MeshIterator* it; - markEdgesInitial(m,size_iso,markedEdges,gradingFactor); - - int needsParallel=1; - while(needsParallel) - { - PCU_Comm_Begin(); - needsParallel = serialGradation(m,size_iso,markedEdges,gradingFactor); - - PCU_Add_Ints(&needsParallel,1); - PCU_Comm_Send(); - - apf::MeshEntity* ent; - double receivedSize; - double currentSize; - double newSize; - - //Need a container to get all entitites that need to be updated on remotes - std::queue updateRemoteVertices; - - apf::Copies remotes; - //owning copies are receiving - while(PCU_Comm_Receive()) - { - PCU_COMM_UNPACK(ent); - PCU_COMM_UNPACK(receivedSize); - - if(!m->isOwned(ent)){ - std::cout<<"THERE WAS AN ERROR"<getAdjacent(ent, 1, vertAdjEdg); - for (std::size_t i=0; igetIntTag(vertAdjEdg[i],isMarked,&marker[2]); - if(!marker[2]) - { - markedEdges.push(edge); - //tag edge to indicate that it is part of queue - m->setIntTag(edge,isMarked,&marker[1]); - } - } - updateRemoteVertices.push(ent); - } - - PCU_Comm_Begin(); - - while(!updateRemoteVertices.empty()) - { - ent = updateRemoteVertices.front(); - //get remote copies and send updated mesh sizes - m->getRemotes(ent,remotes); - currentSize = apf::getScalar(size_iso,ent,0); - for(apf::Copies::iterator iter=remotes.begin(); iter!=remotes.end();++iter) - { - PCU_COMM_PACK(iter->first, iter->second); - } - updateRemoteVertices.pop(); - } - - PCU_Comm_Send(); - //while remote copies are receiving - while(PCU_Comm_Receive()) - { - //unpack - PCU_COMM_UNPACK(ent); - //PCU_COMM_UNPACK(receivedSize); - assert(!m->isOwned(ent)); - - if(m->isOwned(ent)){ - std::cout<<"Problem occurred\n"; - std::exit(1); - } - - //add adjacent edges into Q - m->getAdjacent(ent, 1, vertAdjEdg); - for (std::size_t i=0; igetIntTag(vertAdjEdg[i],isMarked,&marker[2]); - if(!marker[2]) - { - markedEdges.push(edge); - //tag edge to indicate that it is part of queue - m->setIntTag(edge,isMarked,&marker[1]); - } - } - } - apf::synchronize(size_iso); - - } //end outer while - - //Cleanup of edge marker field - it = m->begin(1); - while((edge=m->iterate(it))){ - m->removeTag(edge,isMarked); - } - m->end(it); - m->destroyTag(isMarked); - - //apf::synchronize(size_iso); - return needsParallel; -} - -//Eigenvalue routines for volume and surface meshes -// - //function to get volume-based eigenvalues -//apf::Field* getLambdaMax(mesh,hessianField,) -void getLambdaMax(apf::Mesh* mesh,apf::Field* hessianField,apf::Field* lambdaMaxField) -{ - apf::MeshEntity* vert; - apf::MeshIterator* it; - it = mesh->begin(0); - //apf::Field* lambdaMaxField = apf::createLagrangeField(mesh,"lambdaMax",apf::SCALAR,1); - while( (vert = mesh->iterate(it)) ) - { - apf::Matrix3x3 metric; - apf::getMatrix(hessianField, vert, 0, metric); - apf::Vector3 eigenVectors[3]; - double eigenValues[3]; - metric = (metric+apf::transpose(metric))/2.0; - apf::eigen(metric, eigenVectors, eigenValues); - - // Sort the eigenvalues and corresponding vectors - // Larger eigenvalues means a need for a finer mesh - SortingStruct ssa[3]; - for (int i = 0; i < 3; ++i) - { - ssa[i].v = eigenVectors[i]; - ssa[i].wm = std::fabs(eigenValues[i]); - } - std::sort(ssa, ssa + 3); - - assert(ssa[2].wm >= ssa[1].wm); - assert(ssa[1].wm >= ssa[0].wm); - apf::setScalar(lambdaMaxField,vert,0,ssa[2].wm); - } - mesh->end(it); -} - -/* -void getVolMaxPair(apf::Mesh* mesh,apf::Mesh* volMesh,apf::Field* lambdaMaxField,apf::Field* currentSize,double &lambda_max,double &h_lambdamax) -{ - apf::MeshIterator* it = mesh->begin(0); - apf::MeshIterator* itVol = volMesh->begin(0); - apf::MeshEntity* vert, *vertVol; - while( (vert = mesh->iterate(it)) ) - { - apf::MeshEntity* vertVol = volMesh->iterate(itVol); - if(lambda_max < apf::getScalar(lambdaMaxField,vertVol,0)) - { - lambda_max = apf::getScalar(lambdaMaxField,vertVol,0); - h_lambdamax = apf::getScalar(currentSize,vert,0); - } - } - volMesh->end(itVol); - mesh->end(it); -} -*/ - -void getVolMaxPair(apf::Mesh* mesh,std::vector > surfToStrandMap, apf::Field* lambdaMaxField,apf::Field* lambdaStrandMax, apf::Field* currentSize,double &lambda_max,double &h_lambdamax) -{ - apf::MeshIterator* it = mesh->begin(0); - apf::MeshEntity* vert, *vertVol; - int counter = 0; - while( (vert = mesh->iterate(it)) ) - { - //the goal of this loop is to identify lambda max global, find corresponding surface h-max global, and then set the surface lambda field - int strandSize = surfToStrandMap[counter].size(); - for(int i=0; iend(it); -} - -void getSurfMaxPair(apf::Mesh* mesh,apf::Field* lambdaMaxField,apf::Field* currentSize,double &lambda_max,double &h_lambdamax) -{ - apf::MeshIterator* it = mesh->begin(0); - apf::MeshEntity* vert; - while( (vert = mesh->iterate(it)) ) - { - if(lambda_max < apf::getScalar(lambdaMaxField,vert,0)) - { - lambda_max = apf::getScalar(lambdaMaxField,vert,0); - h_lambdamax = apf::getScalar(currentSize,vert,0); - } - } - mesh->end(it); -} - -void setSizeField(apf::Mesh* mesh, apf::Field* lambdaMaxField,apf::Field* sizeField,double lambda_max,double lambda_cutoff, double h_lambdamax,double h_global,double factor) -{ - apf::MeshIterator* it=mesh->begin(0); - apf::MeshEntity* vert; - int counter3 = 0; - double h_special = -1; - while( (vert = mesh->iterate(it)) ) - { - double h_v = h_special; //set default size as user specified input - double lambda_vert = apf::getScalar(lambdaMaxField,vert,0); - if(lambda_vert > lambda_cutoff) - { - h_v = sqrt(lambda_max/lambda_vert/factor)*h_lambdamax; - } - else - counter3++; - //h_global is user-specified max size - if(h_v > h_global) //maximum value for size field - h_v = h_global; - apf::setScalar(sizeField,vert,0,h_v); - } - mesh->end(it); - -} - -void isotropicIntersect(apf::Mesh* m, std::queue sizeFieldList,apf::Field* finalSizeField,apf::Field* finalChoiceField) -{ - apf::MeshEntity *vert; - apf::MeshIterator *it = m->begin(0); - - apf::Field *field = sizeFieldList.front(); - apf::copyData(finalSizeField,field); - sizeFieldList.pop(); - int choiceIdx = 1; //assumes the initial field was set to choice 0 - while(!sizeFieldList.empty()) - { - field = sizeFieldList.front(); - while(vert = m->iterate(it)) - { - double value1 = apf::getScalar(finalSizeField,vert,0); - double value2 = apf::getScalar(field,vert,0); - double minValue = std::min(value1,value2); - apf::setScalar(finalSizeField,vert,0,minValue); - if(value1 > value2) - { - apf::setScalar(finalChoiceField,vert,0,choiceIdx); - } - } - sizeFieldList.pop(); - choiceIdx++; - } - m->end(it); -} - - -// - -int main(int argc, char** argv) -{ - MPI_Init(&argc, &argv); - PCU_Comm_Init(); - - double initialTime = PCU_Time(); - - if (argc != 7) { - if(0==PCU_Comm_Self()) - std::cerr << "usage: " << argv[0] - << " \n"; - return EXIT_FAILURE; - } - - - gmi_register_mesh(); - gmi_register_null(); - - const char* creFileName = argv[1]; - const char* dataFileName = argv[2]; - int offset = atoi(argv[3]); - const int strandSize = atoi(argv[4]); - double h_global = atof(argv[5]); - double factor = atof(argv[6]); - - // load capstone mesh - // create an instance of the Capstone Module activating CREATE/CREATE/CREATE - // for the Geometry/Mesh/Attribution databases - /* const std::string gdbName("Geometry Database : Create");// Switch Create with SMLIB for CAD */ - const std::string gdbName("Geometry Database : SMLIB");// Switch Create with SMLIB for CAD - const std::string mdbName("Mesh Database : Create"); - const std::string adbName("Attribution Database : Create"); - - CapstoneModule cs("the_module", gdbName.c_str(), mdbName.c_str(), adbName.c_str()); - - GeometryDatabaseInterface *g = cs.get_geometry(); - MeshDatabaseInterface *m = cs.get_mesh(); - AppContext *c = cs.get_context(); - - - PCU_ALWAYS_ASSERT(g); - PCU_ALWAYS_ASSERT(m); - PCU_ALWAYS_ASSERT(c); - - v_string filenames; - filenames.push_back(creFileName); - - M_GModel gmodel = cs.load_files(filenames); - - int numbreps = 0; - MG_CALL(g->get_num_breps(numbreps)); - std::cout << "number of b reps is " << numbreps << std::endl; - if(numbreps == 0) - error(HERE, ERR_INVALID_INPUT, "Model is empty"); - - M_MModel mmodel; - // Pick the volume mesh model from associated mesh models to this geom model - std::vector mmodels; - MG_API_CALL(m, get_associated_mesh_models(gmodel, mmodels)); - for(std::size_t i = 0; i < mmodels.size(); ++i) - { - M_MModel ammodel = mmodels[i]; - std::size_t numregs = 0; - std::size_t numfaces = 0; - std::size_t numedges = 0; - std::size_t numverts = 0; - MG_API_CALL(m, set_current_model(ammodel)); - MG_API_CALL(m, get_num_topos(TOPO_REGION, numregs)); - MG_API_CALL(m, get_num_topos(TOPO_FACE, numfaces)); - MG_API_CALL(m, get_num_topos(TOPO_EDGE, numedges)); - MG_API_CALL(m, get_num_topos(TOPO_VERTEX, numverts)); - std::cout << "num regions is " << numregs << std::endl; - std::cout << "num faces is " << numfaces << std::endl; - std::cout << "num edges is " << numedges << std::endl; - std::cout << "num verts is " << numverts << std::endl; - std::cout << "-----------" << std::endl; - if(numregs > 0) - { - mmodel = ammodel; - break; - } - } - - /* SET THE ADJACENCIES */ - MG_API_CALL(m, set_adjacency_state(REGION2FACE| - REGION2EDGE| - REGION2VERTEX| - FACE2EDGE| - FACE2VERTEX)); - MG_API_CALL(m, set_reverse_states()); - MG_API_CALL(m, set_adjacency_scope(TOPO_EDGE, SCOPE_FULL)); - MG_API_CALL(m, set_adjacency_scope(TOPO_FACE, SCOPE_FULL)); - MG_API_CALL(m, compute_adjacency()); - - - gmi_cap_start(); - gmi_register_cap(); - - printf("---- CapStone Mesh Loaded. \n"); - - // read the data into a vector array for now - printf("\n---- Reading Strand Data. \n"); - std::vector table = readTable(dataFileName); - printf("---- Reading Strand Data: Done. \n"); - - // create the mesh object (this one is CapStone underneath) - printf("\n---- Creating Mesh Wrapper Object. \n"); - apf::Mesh2* mesh = apf::createMesh(m,g); - printf("---- Creating Mesh Wrapper Object: Done. \n"); - - // remove unused verts - if (offset > 0) { - printf("\n---- Removing Extra Verts. \n"); - removeUnusedVerts(mesh, offset); - printf("---- Removing Extra Verts: Done. \n"); - } - - // make the volume mesh (this one is MDS underneath) - printf("\n---- Creating Volume Mesh. \n"); - // create an empty array with the correct sizes to hold the surface 2 strand map - std::vector > surfToStrandMap(mesh->count(0), - std::vector(strandSize, NULL)); - apf::Mesh2* volMesh = createVolumeMesh(mesh, table, strandSize, surfToStrandMap); - printf("---- Creating Volume Mesh: Done. \n"); - - // get all fields and add them to the mesh - printf("\n---- Adding Fields to Volume Mesh. \n"); - apf::Field* rhoField = addScalarField(volMesh, table, "rho", 3, strandSize); - apf::Field* rho_uvwField = addVector3Field(volMesh, table, "rho_uvw", 4, 5, 6, strandSize); - apf::Field* eField = addScalarField(volMesh, table, "e", 7, strandSize); - apf::Field* nuField = addScalarField(volMesh, table, "nu", 8, strandSize); - printf("---- Adding Fields to Volume Mesh: Done. \n"); - - printf("\n---- Printing Volume/Strand Mesh Stats. \n"); - printf("number of mesh verts: %zu\n", volMesh->count(0)); - printf("number of mesh regions(hexes): %zu\n", volMesh->count(3)); - printf("---- Printing Volume/Strand Mesh Stats: Done. \n"); - - double constructionTime = PCU_Time(); - std::cout<<"TIMER: Finished converting capstone mesh to volume mesh "<begin(0); - double minNu = 1.0; - while( (vert = volMesh->iterate(it)) ) - { - double rhoVal = apf::getScalar(rhoField,vert,0); - apf::Vector3 rhoVelocity; - apf::getVector(rho_uvwField,vert,0,rhoVelocity); - double speed = rhoVelocity.getLength()/rhoVal; - apf::setScalar(speedField,vert,0,speed); - if(apf::getScalar(nuField,vert,0)end(it); - apf::Field* gradSpeedField = apf::recoverGradientByVolume(speedField); - apf::Field* hessianSpeedField = apf::recoverGradientByVolume(gradSpeedField); - //End getSpeed - - apf::Field* surfaceSpeedField = apf::createLagrangeField(mesh,"surface_speed",apf::SCALAR,1); - it = mesh->begin(0); - apf::MeshIterator* itVol = volMesh->begin(0); - - while( (vert = mesh->iterate(it)) ) - { - apf::MeshEntity* vertVol = volMesh->iterate(itVol); - double rhoVal = apf::getScalar(rhoField,vertVol,0); - double eVal = apf::getScalar(eField,vertVol,0); - double speedVal = apf::getScalar(speedField,vertVol,0); - apf::setScalar(surfaceRhoField,vert,0,rhoVal); - apf::setScalar(surfaceEField,vert,0,eVal); - apf::setScalar(surfaceSpeedField,vert,0,speedVal); - } - mesh->end(it); - volMesh->end(itVol); - std::cout<<"Finished surface fields from volume\n"; - - double getSurfaceTime = PCU_Time(); - std::cout<<"TIMER: Finished computing speed and transferring fields to surface "<begin(0); - while( (vert = volMesh->iterate(itVol)) ) - { - double rho_e = apf::getScalar(eField,vert,0); - double rho = apf::getScalar(rhoField,vert,0); - double speedVal = apf::getScalar(speedField,vert,0); - double pressure_gamma = rho_e-0.5*rho*speedVal*speedVal; - apf::setScalar(pressureField,vert,0,pressure_gamma); - } - volMesh->end(itVol); - apf::Field* gradPressureField = apf::recoverGradientByVolume(pressureField); - apf::Field* hessianPressureField = apf::recoverGradientByVolume(gradPressureField); - - //get eigenvalues in the volume mesh - getLambdaMax(volMesh,hessianPressureField,lambdaMaxField); - //getLambdaMax(volMesh,hessianEField,lambdaMaxField); - - struct FieldOfInterest{ - FieldOfInterest() - { - lambda_max = 0.0; - h_lambdamax = 0.0; - } - double lambda_max; - double h_lambdamax; - apf::Field* lambdaMaxField; - apf::Field* lambdaStrandMax; - apf::Field* sizeField; - double lambda_cutoff() - { - return lambda_max*1e-10; - } - }; - - - FieldOfInterest eBased; - eBased.lambdaMaxField = lambdaMaxField; - eBased.lambdaStrandMax = apf::createLagrangeField(mesh,"surf_lambda_strandMax",apf::SCALAR,1); - eBased.sizeField = apf::createLagrangeField(mesh,"surface_size_e",apf::SCALAR,1); - - getVolMaxPair(mesh,surfToStrandMap,eBased.lambdaMaxField,eBased.lambdaStrandMax,currentSize,eBased.lambda_max,eBased.h_lambdamax); - - //set size field - - setSizeField(mesh,eBased.lambdaStrandMax,eBased.sizeField,eBased.lambda_max,eBased.lambda_cutoff(),eBased.h_lambdamax,h_global,factor); - - double getPressureTime = PCU_Time(); - std::cout<<"TIMER: Finished pressure size field "<begin(0); - int vIDcounter = 0; //better way to do this would be with a numbering system - //apf::Numbering* nVID = volMesh->findNumbering; //this would be for a volume mesh - - while( (vert = mesh->iterate(it)) ) - { - apf::Vector3 pointVol; - apf::Vector3 pointSurf; - apf::MeshEntity* volVert = surfToStrandMap[vIDcounter][1]; - double speed = apf::getScalar(speedField,volVert,0); - mesh->getPoint(vert,0,pointSurf); - volMesh->getPoint(volVert,0,pointVol); - apf::Vector3 differenceVec = pointVol-pointSurf; - double shearStress = speed/differenceVec.getLength(); - apf::setScalar(surfaceShearField,vert,0,shearStress); - vIDcounter++; - } - mesh->end(it); - - FieldOfInterest shearBased; - shearBased.lambdaMaxField = apf::createLagrangeField(mesh,"surflambdaMax",apf::SCALAR,1); - shearBased.sizeField = apf::createLagrangeField(mesh,"surface_size",apf::SCALAR,1); - - //get surface shear gradient - std::cout<<"Reached gradshearfield\n"; - apf::Field* gradShearField = apf::recoverGradientByVolume(surfaceShearField); - std::cout<<"Got gradshearfield\n"; - - it=mesh->begin(0); - while( (vert = mesh->iterate(it)) ) - { - apf::Vector3 gradShear; - apf::getVector(gradShearField,vert,0,gradShear); - apf::setScalar(shearBased.lambdaMaxField,vert,0,gradShear.getLength()); - } - mesh->end(it); - - std::cout<<"Got surf lambda max\n"; - getSurfMaxPair(mesh,shearBased.lambdaMaxField,currentSize,shearBased.lambda_max,shearBased.h_lambdamax); - - std::cout<<"Got surf lambda max pair\n"; - //set size field - setSizeField(mesh,shearBased.lambdaMaxField,shearBased.sizeField,shearBased.lambda_max,shearBased.lambda_cutoff(),shearBased.h_lambdamax,h_global,factor); - - std::cout<<"set size field\n"; - - double getShearTime = PCU_Time(); - std::cout<<"TIMER: Finished skin friction size field "< sizeFieldList; - sizeFieldList.push(eBased.sizeField); - sizeFieldList.push(shearBased.sizeField); - apf::Field* finalChoiceField = apf::createLagrangeField(mesh,"finalChoice",apf::SCALAR,1); - it = mesh->begin(0); - while( (vert = mesh->iterate(it)) ) - { - apf::setScalar(finalChoiceField,vert,0,0); - } - - isotropicIntersect(mesh,sizeFieldList,finalSizeField,finalChoiceField); - - double getIntersectionTime = PCU_Time(); - std::cout<<"TIMER: get mesh intersection "<shouldRunPreZoltan = true; - in->shouldRunMidZoltan = true; - in->shouldRunPostZoltan = true; - in->maximumImbalance = 1.05; - in->maximumIterations = 10; - in->shouldSnap = true; - in->shouldTransferParametric = true; - in->shouldForceAdaptation = true; - ma::adaptVerbose(in); - - double adaptTime = PCU_Time(); - std::cout<<"TIMER: adaptMesh "<countFields();i++) - { - apf::destroyField(mesh->getField(i)); - } - for(int i =0;icountFields();i++) - { - apf::destroyField(volMesh->getField(i)); - } - - gmi_cap_stop(); - PCU_Comm_Free(); - MPI_Finalize(); -} - -std::vector readTable(const char* name) -{ - std::vector table; - std::ifstream file(name); - while(!file.eof()){ - std::string str; - std::getline(file, str); - std::stringstream ss(str); - double value; - row r; - while (ss >> value) - r.push_back(value); - if (r.size() > 0) - table.push_back(r); - } - return table; -} - -static std::vector extractNthStrandData(const std::vector &table, - const int strandSize, const int n, const int col) -{ - std::vector outData; - int i = 0; - while (i*strandSize+(strandSize-n) < int(table.size())) { - outData.push_back(table[i*strandSize+(strandSize - n)][col]); - i++; - } - return outData; -} - -std::vector extractSurfaceData(const std::vector &table, - const int strandSize, const int col) -{ - // surface data corresponds to strand 1; - return extractNthStrandData(table, strandSize, 1, col); -} - -apf::Field* addScalarField(apf::Mesh2* m, const std::vector t, const char* name, int col, int strandSize) -{ - apf::Numbering* nLayer = m->findNumbering("layer_num"); - apf::Numbering* nVid = m->findNumbering("vid_num"); - PCU_ALWAYS_ASSERT(nLayer); - PCU_ALWAYS_ASSERT(nVid); - - apf::Field* f = apf::createFieldOn(m, name, apf::SCALAR); - apf::MeshEntity* e; - apf::MeshIterator* it = m->begin(0); - int count = 0; - while ( (e = m->iterate(it)) ) { - int layer = apf::getNumber(nLayer, e, 0, 0); - int vid = apf::getNumber(nVid, e, 0, 0); - double value = t[vid*strandSize+(strandSize - layer)][col]; - apf::setScalar(f, e, 0, value); - count++; - } - m->end(it); - return f; -} - -apf::Field* addVector3Field(apf::Mesh2* m, const std::vector t, const char* name, - int col0, int col1, int col2, int strandSize) -{ - apf::Numbering* nLayer = m->findNumbering("layer_num"); - apf::Numbering* nVid = m->findNumbering("vid_num"); - PCU_ALWAYS_ASSERT(nLayer); - PCU_ALWAYS_ASSERT(nVid); - - apf::Field* f = apf::createFieldOn(m, name, apf::VECTOR); - apf::MeshEntity* e; - apf::MeshIterator* it = m->begin(0); - int count = 0; - while ( (e = m->iterate(it)) ) { - int layer = apf::getNumber(nLayer, e, 0, 0); - int vid = apf::getNumber(nVid, e, 0, 0); - double value0 = t[vid*strandSize+(strandSize - layer)][col0]; - double value1 = t[vid*strandSize+(strandSize - layer)][col1]; - double value2 = t[vid*strandSize+(strandSize - layer)][col2]; - apf::setVector(f, e, 0, apf::Vector3(value0, value1, value2)); - count++; - } - m->end(it); - return f; -} - - - -void removeUnusedVerts(apf::Mesh2* m, int offset) -{ - apf::MeshEntity* e; - apf::MeshIterator* it = m->begin(0); - int count = 0; - while ( (e = m->iterate(it)) ) { - if (count < offset) { - PCU_ALWAYS_ASSERT(m->countUpward(e) == 0); - m->destroy(e); - } - else - PCU_ALWAYS_ASSERT(m->countUpward(e) != 0); - count++; - } - m->end(it); -} - -static std::vector -readLayerCoordinates(int layer, const std::vector &t, int s) -{ - std::vector xs = extractNthStrandData(t, s, layer, 0); - std::vector ys = extractNthStrandData(t, s, layer, 1); - std::vector zs = extractNthStrandData(t, s, layer, 2); - - std::vector res; - - for (std::size_t i = 0; i < xs.size(); i++) - res.push_back(apf::Vector3(xs[i], ys[i], zs[i])); - - return res; -} - - -apf::Mesh2* createVolumeMesh(apf::Mesh2* m, const std::vector &t, int s, std::vector > &surfToStrandMap) -{ - // add numbering to the surface mash - apf::Numbering* n = apf::createNumbering(m, "surf_verts_num", apf::getLagrange(1) , 1); - apf::MeshEntity* e; - apf::MeshIterator* it = m->begin(0); - int count = 0; - while ( (e = m->iterate(it)) ) { - apf::number(n, e, 0, 0, count); - count++; - } - m->end(it); - - - // get the original faces - std::vector faces; - it = m->begin(2); - while ( (e = m->iterate(it)) ) - faces.push_back(e); - m->end(it); - - // create and empty mds mesh - apf::Mesh2* vMesh = apf::makeEmptyMdsMesh(gmi_load(".null"), 3, false); - apf::Numbering* nLayer = apf::createNumbering(vMesh, "layer_num", apf::getLagrange(1) , 1); - apf::Numbering* nVID = apf::createNumbering(vMesh, "vid_num", apf::getLagrange(1) , 1); - - // process each layer - // layer = 1 corresponds to the surface nodes - // treat it out side of the loop - std::vector coords = readLayerCoordinates(1, t, s); - std::vector lastVs; - for (std::size_t i = 0; i < coords.size(); i++) { - apf::MeshEntity* v = vMesh->createVertex(0, coords[i], apf::Vector3(0, 0, 0)); - apf::number(nLayer, v, 0, 0, 1); - apf::number(nVID, v, 0, 0, i); - lastVs.push_back(v); - } - - PCU_ALWAYS_ASSERT(coords.size() == lastVs.size()); - - // now process the remaining layers - for (int layer = 2; layer < s+1; layer++) { - // read the coords first - std::vector coords = readLayerCoordinates(layer, t, s); - // create the new verts - std::vector vs; - for (std::size_t i = 0; i < coords.size(); i++) { - apf::MeshEntity* v = vMesh->createVertex(0, coords[i], apf::Vector3(0, 0, 0)); - apf::number(nLayer, v, 0, 0, layer); - apf::number(nVID, v, 0, 0, i); - vs.push_back(v); - } - - // create the prisms - for (std::size_t i = 0; i < faces.size(); i++) { - apf::MeshEntity* f = faces[i]; - apf::MeshEntity* dv[3]; - m->getDownward(f, 0, dv); - int id0 = apf::getNumber(n, dv[0], 0, 0); - int id1 = apf::getNumber(n, dv[1], 0, 0); - int id2 = apf::getNumber(n, dv[2], 0, 0); - - apf::MeshEntity* prismVs[6]; - - prismVs[0] = lastVs[id0]; - prismVs[1] = lastVs[id1]; - prismVs[2] = lastVs[id2]; - - prismVs[3] = vs[id0]; - prismVs[4] = vs[id1]; - prismVs[5] = vs[id2]; - - apf::buildElement(vMesh, 0, apf::Mesh::PRISM, prismVs); - } - // set the lastVs to Vs - for (std::size_t i = 0; i < vs.size(); i++) - lastVs[i] = vs[i]; - } - vMesh->acceptChanges(); - apf::deriveMdsModel(vMesh); - apf::verify(vMesh); - - // create the surface to strand map - it = vMesh->begin(0); - while ( (e = vMesh->iterate(it)) ) { - int layer = apf::getNumber(nLayer, e, 0, 0) - 1; - int vid = apf::getNumber(nVID, e, 0, 0); - PCU_ALWAYS_ASSERT((layer >= 0) && (layer < s)); - PCU_ALWAYS_ASSERT((vid >= 0) && (vid < (int)m->count(0))); - surfToStrandMap[vid][layer] = e; - } - vMesh->end(it); - - // return the volume mesh - return vMesh; -} - -void writeCre(CapstoneModule& cs, const std::string& fileName) -{ - GeometryDatabaseInterface *gdbi = cs.get_geometry(); - MeshDatabaseInterface *mdbi = cs.get_mesh(); - AppContext *ctx = cs.get_context(); - - // Get the VTK writer. - Writer *creWriter = get_writer(ctx, "Create Native Writer"); - if (!creWriter) - error(HERE, ERR_GENERIC, "Could not find the CRE writer"); - - IdMapping idmapping; - std::vector mmodels; - M_GModel gmodel; - M_MModel mmodel; - gdbi->get_current_model(gmodel); - mdbi->get_current_model(mmodel); - mmodels.clear(); - mmodels.push_back(mmodel); - creWriter->write(ctx, gmodel, mmodels, fileName.c_str(), idmapping); -} diff --git a/capstone_clis/capStoneAttachSolutionStrandOnly.cc b/capstone_clis/capStoneAttachSolutionStrandOnly.cc deleted file mode 100644 index e39994f52..000000000 --- a/capstone_clis/capStoneAttachSolutionStrandOnly.cc +++ /dev/null @@ -1,1161 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -#include "CapstoneModule.h" -#include "CreateMG_Framework_Core.h" -#include "CreateMG_Framework_Analysis.h" -#include "CreateMG_Framework_Application.h" -#include "CreateMG_Framework_Attributes.h" -#include "CreateMG_Framework_Core.h" -#include "CreateMG_Framework_Geometry.h" -#include "CreateMG_Framework_Mesh.h" - -using namespace CreateMG; -using namespace CreateMG::Attribution; -using namespace CreateMG::Mesh; -using namespace CreateMG::Geometry; - - -typedef std::vector row; - -struct FieldOfInterest{ - FieldOfInterest() - { - lambda_max = 0.0; - h_lambdamax = 0.0; - } - double lambda_max; - double h_lambdamax; - apf::Field* lambdaMaxField; - apf::Field* lambdaStrandMax; - apf::Field* sizeField; - double lambda_cutoff() - { - return lambda_max*1e-10; - } -}; - -std::vector readTable(const char* name); - -std::vector extractSurfaceData(const std::vector &table, - const int strandSize, const int col); - -apf::Mesh2* createVolumeMesh(apf::Mesh2* m, const std::vector &t, int s, - std::vector > &surfToStrandMap); - -apf::Field* addScalarField(apf::Mesh2* m, const std::vector t, const char* name, int col, int strandSize); - -apf::Field* addVector3Field(apf::Mesh2* m, const std::vector t, const char* name, - int col0, int col1, int col2, int strandSize); - -void writeCre(CapstoneModule& cs, const std::string& fileName); - -void writeMdsMesh(apf::Mesh2* m, const char* name, const char* fieldName); - -void computeSizeDistribution(apf::Mesh2* m, int factor, - std::vector& binCount, std::vector& binArea); - - -void adjustRefinementLevel(apf::Mesh2* m, apf::Field* finalSize, - apf::Field* currentSize, int maxLevel); - -struct SortingStruct -{ - apf::Vector3 v; - double wm; - bool operator<(const SortingStruct &other) const - { - return wm < other.wm; - } -}; - -//gradation routines from Proteus - -int gradeSizeModify(apf::Mesh* m, apf::Field* size_iso,double gradingFactor, - double size[2], apf::Adjacent edgAdjVert, - apf::Adjacent vertAdjEdg, - std::queue &markedEdges, - apf::MeshTag* isMarked, - int fieldType, - int vecPos, //which idx of sizeVec to modify - int idxFlag) - -//General function to actually modify sizes -{ - (void)vecPos; - //Determine a switching scheme depending on which vertex needs a modification - int idx1,idx2; - if(idxFlag == 0){ - idx1=0; - idx2=1; - } - else{ - idx1=1; - idx2 = 0; - } - - int marker[3] = {0,1,0}; - double marginVal = 0.01; - int needsParallel=0; - - if(fieldType == apf::SCALAR){ - //apf::Field* size_iso = m->findField("size"); - - if(size[idx1]>(gradingFactor*size[idx2])*(1+marginVal)) - { - if(m->isOwned(edgAdjVert[idx1])) - { - size[idx1] = gradingFactor*size[idx2]; - apf::setScalar(size_iso,edgAdjVert[idx1],0,size[idx1]); - m->getAdjacent(edgAdjVert[idx1], 1, vertAdjEdg); - for (std::size_t i=0; igetIntTag(vertAdjEdg[i],isMarked,&marker[2]); - //if edge is not already marked - if(!marker[2]){ - m->setIntTag(vertAdjEdg[i],isMarked,&marker[1]); - markedEdges.push(vertAdjEdg[i]); - } - } - } //end isOwned - else - { //Pack information to owning processor - needsParallel=1; - apf::Copies remotes; - m->getRemotes(edgAdjVert[idx1],remotes); - double newSize = gradingFactor*size[idx2]; - int owningPart=m->getOwner(edgAdjVert[idx1]); - PCU_COMM_PACK(owningPart, remotes[owningPart]); - PCU_COMM_PACK(owningPart,newSize); - } - } - - }//end if apf::SCALAR - return needsParallel; -} - -void markEdgesInitial(apf::Mesh* m, apf::Field* size_iso, std::queue &markedEdges,double gradingFactor) -//Function used to initially determine which edges need to be considered for gradation -{ - //marker structure for 0) not marked 1) marked 2)storage - int marker[3] = {0,1,0}; - - double size[2]; - apf::MeshTag* isMarked = m->findTag("isMarked"); -// apf::Field* size_iso = m->findField("size"); - apf::Adjacent edgAdjVert; - apf::MeshEntity* edge; - apf::MeshIterator* it = m->begin(1); - while((edge=m->iterate(it))){ - m->getAdjacent(edge, 0, edgAdjVert); - for (std::size_t i=0; i < edgAdjVert.getSize(); ++i){ - size[i]=apf::getScalar(size_iso,edgAdjVert[i],0); - } - if( (size[0] > gradingFactor*size[1]) || (size[1] > gradingFactor*size[0]) ){ - //add edge to a queue - markedEdges.push(edge); - //tag edge to indicate that it is part of queue - m->setIntTag(edge,isMarked,&marker[1]); - } - else{ - m->setIntTag(edge,isMarked,&marker[0]); - } - } - m->end(it); -} - -int serialGradation(apf::Mesh* m,apf::Field* size_iso, std::queue &markedEdges,double gradingFactor) -//Function used loop over the mesh edge queue for gradation and modify the sizes -{ - double size[2]; - //marker structure for 0) not marked 1) marked 2)storage - int marker[3] = {0,1,0}; - apf::MeshTag* isMarked = m->findTag("isMarked"); -// apf::Field* size_iso = m->findField("size"); - apf::Adjacent edgAdjVert; - apf::Adjacent vertAdjEdg; - apf::MeshEntity* edge; - int needsParallel=0; - - //perform serial gradation while packing necessary info for parallel - while(!markedEdges.empty()){ - edge = markedEdges.front(); - m->getAdjacent(edge, 0, edgAdjVert); - for (std::size_t i=0; i < edgAdjVert.getSize(); ++i){ - size[i] = apf::getScalar(size_iso,edgAdjVert[i],0); - } - - needsParallel+=gradeSizeModify(m,size_iso, gradingFactor, size, edgAdjVert, - vertAdjEdg, markedEdges, isMarked, apf::SCALAR,0, 0); - needsParallel+=gradeSizeModify(m,size_iso, gradingFactor, size, edgAdjVert, - vertAdjEdg, markedEdges, isMarked, apf::SCALAR,0, 1); - - m->setIntTag(edge,isMarked,&marker[0]); - markedEdges.pop(); - } - return needsParallel; -} - -int gradeMesh(apf::Mesh* m,apf::Field* size_iso) -//Function to grade isotropic mesh through comparison of edge vertex size ratios -//This implementation accounts for parallel meshes as well -//First do serial gradation. -//If a shared entity has its size modified, then send new size to owning copy. -//After full loop over entities, have owning copy take minimum of all sizes received -//Flag adjacent entities to owning copy. -//Communicate to remote copies that a size was modified, and flag adjacent edges to remote copies for further gradation -{ - //unique to this code - //apf::Field* size_iso = m->findField("size"); - double gradingFactor = 1.2; - // - - apf::MeshEntity* edge; - apf::Adjacent edgAdjVert; - apf::Adjacent vertAdjEdg; - std::queue markedEdges; - apf::MeshTag* isMarked = m->createIntTag("isMarked",1); - - //marker structure for 0) not marked 1) marked 2)storage - int marker[3] = {0,1,0}; - - apf::MeshIterator* it; - markEdgesInitial(m,size_iso,markedEdges,gradingFactor); - - int needsParallel=1; - while(needsParallel) - { - PCU_Comm_Begin(); - needsParallel = serialGradation(m,size_iso,markedEdges,gradingFactor); - - PCU_Add_Ints(&needsParallel,1); - PCU_Comm_Send(); - - apf::MeshEntity* ent; - double receivedSize; - double currentSize; - double newSize; - - //Need a container to get all entitites that need to be updated on remotes - std::queue updateRemoteVertices; - - apf::Copies remotes; - //owning copies are receiving - while(PCU_Comm_Receive()) - { - PCU_COMM_UNPACK(ent); - PCU_COMM_UNPACK(receivedSize); - - if(!m->isOwned(ent)){ - std::cout<<"THERE WAS AN ERROR"<getAdjacent(ent, 1, vertAdjEdg); - for (std::size_t i=0; igetIntTag(vertAdjEdg[i],isMarked,&marker[2]); - if(!marker[2]) - { - markedEdges.push(edge); - //tag edge to indicate that it is part of queue - m->setIntTag(edge,isMarked,&marker[1]); - } - } - updateRemoteVertices.push(ent); - } - - PCU_Comm_Begin(); - - while(!updateRemoteVertices.empty()) - { - ent = updateRemoteVertices.front(); - //get remote copies and send updated mesh sizes - m->getRemotes(ent,remotes); - currentSize = apf::getScalar(size_iso,ent,0); - for(apf::Copies::iterator iter=remotes.begin(); iter!=remotes.end();++iter) - { - PCU_COMM_PACK(iter->first, iter->second); - } - updateRemoteVertices.pop(); - } - - PCU_Comm_Send(); - //while remote copies are receiving - while(PCU_Comm_Receive()) - { - //unpack - PCU_COMM_UNPACK(ent); - //PCU_COMM_UNPACK(receivedSize); - assert(!m->isOwned(ent)); - - if(m->isOwned(ent)){ - std::cout<<"Problem occurred\n"; - std::exit(1); - } - - //add adjacent edges into Q - m->getAdjacent(ent, 1, vertAdjEdg); - for (std::size_t i=0; igetIntTag(vertAdjEdg[i],isMarked,&marker[2]); - if(!marker[2]) - { - markedEdges.push(edge); - //tag edge to indicate that it is part of queue - m->setIntTag(edge,isMarked,&marker[1]); - } - } - } - apf::synchronize(size_iso); - - } //end outer while - - //Cleanup of edge marker field - it = m->begin(1); - while((edge=m->iterate(it))){ - m->removeTag(edge,isMarked); - } - m->end(it); - m->destroyTag(isMarked); - - //apf::synchronize(size_iso); - return needsParallel; -} - -//Eigenvalue routines for volume and surface meshes -// - //function to get volume-based eigenvalues -//apf::Field* getLambdaMax(mesh,hessianField,) -void getLambdaMax(apf::Mesh* mesh,apf::Field* hessianField,apf::Field* lambdaMaxField) -{ - apf::MeshEntity* vert; - apf::MeshIterator* it; - it = mesh->begin(0); - //apf::Field* lambdaMaxField = apf::createLagrangeField(mesh,"lambdaMax",apf::SCALAR,1); - while( (vert = mesh->iterate(it)) ) - { - apf::Matrix3x3 metric; - apf::getMatrix(hessianField, vert, 0, metric); - apf::Vector3 eigenVectors[3]; - double eigenValues[3]; - metric = (metric+apf::transpose(metric))/2.0; - apf::eigen(metric, eigenVectors, eigenValues); - - // Sort the eigenvalues and corresponding vectors - // Larger eigenvalues means a need for a finer mesh - SortingStruct ssa[3]; - for (int i = 0; i < 3; ++i) - { - ssa[i].v = eigenVectors[i]; - ssa[i].wm = std::fabs(eigenValues[i]); - } - std::sort(ssa, ssa + 3); - - assert(ssa[2].wm >= ssa[1].wm); - assert(ssa[1].wm >= ssa[0].wm); - apf::setScalar(lambdaMaxField,vert,0,ssa[2].wm); - } - mesh->end(it); -} - -void getVolMaxPair(apf::Mesh* mesh,std::vector > surfToStrandMap, apf::Field* lambdaMaxField,apf::Field* lambdaStrandMax, apf::Field* currentSize,double &lambda_max,double &h_lambdamax) -{ - apf::MeshIterator* it = mesh->begin(0); - apf::MeshEntity* vert, *vertVol; - int counter = 0; - while( (vert = mesh->iterate(it)) ) - { - //the goal of this loop is to identify lambda max global, find corresponding surface h-max global, and then set the surface lambda field - int strandSize = surfToStrandMap[counter].size(); - for(int i=0; iend(it); -} - -void getSurfMaxPair(apf::Mesh* mesh,apf::Field* lambdaMaxField,apf::Field* currentSize,double &lambda_max,double &h_lambdamax) -{ - apf::MeshIterator* it = mesh->begin(0); - apf::MeshEntity* vert; - while( (vert = mesh->iterate(it)) ) - { - if(lambda_max < apf::getScalar(lambdaMaxField,vert,0)) - { - lambda_max = apf::getScalar(lambdaMaxField,vert,0); - h_lambdamax = apf::getScalar(currentSize,vert,0); - } - } - mesh->end(it); -} - -void setSizeField(apf::Mesh* mesh, apf::Field* lambdaMaxField,apf::Field* sizeField,double lambda_max,double lambda_cutoff, double h_lambdamax,double h_global,double factor) -{ - apf::MeshIterator* it=mesh->begin(0); - apf::MeshEntity* vert; - int counter3 = 0; - double h_special = -1; - while( (vert = mesh->iterate(it)) ) - { - double h_v = h_special; //set default size as user specified input - double lambda_vert = apf::getScalar(lambdaMaxField,vert,0); - if(lambda_vert > lambda_cutoff) - { - h_v = sqrt(lambda_max/lambda_vert/factor)*h_lambdamax; - } - else - counter3++; - //h_global is user-specified max size - if(h_v > h_global) //maximum value for size field - h_v = h_global; - apf::setScalar(sizeField,vert,0,h_v); - } - mesh->end(it); - -} - -static std::vector decodeBitFields(const char* bitFields) -{ - std::vector res; - res.resize(strlen(bitFields)); - printf("length is %d\n", strlen(bitFields)); - for (int i = 0; i < strlen(bitFields); i++) { - if (bitFields[i] == '0') - res[i] = false; - else if (bitFields[i] == '1') - res[i] = true; - else - PCU_ALWAYS_ASSERT(0); - } - return res; -} - -void isotropicIntersect(apf::Mesh* m, std::queue sizeFieldList, const char* bitFields, apf::Field* finalSizeField,apf::Field* finalChoiceField) -{ - std::vector userInput = decodeBitFields(bitFields); - PCU_ALWAYS_ASSERT(userInput.size() == sizeFieldList.size()); - printf("HERE\n"); - apf::MeshEntity *vert; - apf::MeshIterator *it = m->begin(0); - - apf::Field *field = sizeFieldList.front(); - apf::copyData(finalSizeField,field); - sizeFieldList.pop(); - int choiceIdx = 1; //assumes the initial field was set to choice 0 - while(!sizeFieldList.empty()) - { - field = sizeFieldList.front(); - while( (vert = m->iterate(it)) ) - { - double value1 = apf::getScalar(finalSizeField,vert,0); - double value2 = apf::getScalar(field,vert,0); - if (!userInput[0]) value1 *= 1.e16; - if (!userInput[1]) value2 *= 1.e16; - double minValue = std::min(value1,value2); - apf::setScalar(finalSizeField,vert,0,minValue); - if(value1 > value2) - { - apf::setScalar(finalChoiceField,vert,0,choiceIdx); - } - } - sizeFieldList.pop(); - choiceIdx++; - } - m->end(it); -} - - -// - -int main(int argc, char** argv) -{ - MPI_Init(&argc, &argv); - PCU_Comm_Init(); - lion_set_verbosity(1); - double initialTime = PCU_Time(); - - if (argc != 7) { - if(0==PCU_Comm_Self()) { - std::cerr << "usage: " << argv[0] - << " \n"; - std::cerr << "*target field(s) is a bit string to select which field(s) are used for error estimation\n"; - std::cerr << "1st bit --- pressure\n"; - std::cerr << "2nd bit --- skin friction\n"; - } - return EXIT_FAILURE; - } - - - gmi_register_mesh(); - gmi_register_null(); - - const char* dataFileName = argv[1]; - const char* bitFields = argv[2]; - const int strandSize = atoi(argv[3]); - double h_global = atof(argv[4]); - double factor = atof(argv[5]); - const int maxLevel = atoi(argv[6]); - - gmi_cap_start(); - gmi_register_cap(); - - // read the data into a vector array for now - printf("\n---- Reading Strand Data. \n"); - std::vector table = readTable(dataFileName); - printf("---- Reading Strand Data: Done. \n"); - - // create the mesh object (this one is CapStone underneath) - printf("\n---- Creating Mesh Wrapper Object. \n"); - apf::Mesh2* mesh = apf::createMesh(m,g); - printf("---- Creating Mesh Wrapper Object: Done. \n"); - - // make the volume mesh (this one is MDS underneath) - printf("\n---- Creating Volume Mesh. \n"); - // create an empty array with the correct sizes to hold the surface 2 strand map - int surfVertCount = - std::vector > surfToStrandMap(surfVertCount, - std::vector(strandSize, NULL)); - apf::Mesh2* volMesh = createVolumeMesh(mesh, table, strandSize, surfToStrandMap); - printf("---- Creating Volume Mesh: Done. \n"); - - // get all fields and add them to the mesh - printf("\n---- Adding Fields to Volume Mesh. \n"); - apf::Field* rhoField = addScalarField(volMesh, table, "rho", 3, strandSize); - apf::Field* rho_uvwField = addVector3Field(volMesh, table, "rho_uvw", 4, 5, 6, strandSize); - apf::Field* eField = addScalarField(volMesh, table, "e", 7, strandSize); - apf::Field* nuField = addScalarField(volMesh, table, "nu", 8, strandSize); - printf("---- Adding Fields to Volume Mesh: Done. \n"); - - printf("\n---- Printing Volume/Strand Mesh Stats. \n"); - printf("number of mesh verts: %zu\n", volMesh->count(0)); - printf("number of mesh regions(hexes): %zu\n", volMesh->count(3)); - printf("---- Printing Volume/Strand Mesh Stats: Done. \n"); - - double constructionTime = PCU_Time(); - std::cout<<"TIMER: Finished converting capstone mesh to volume mesh "<begin(0); - while( (vert = volMesh->iterate(it)) ) - { - double rhoVal = apf::getScalar(rhoField,vert,0); - apf::Vector3 rhoVelocity; - apf::getVector(rho_uvwField,vert,0,rhoVelocity); - double speed = rhoVelocity.getLength()/rhoVal; - apf::setScalar(speedField,vert,0,speed); - } - volMesh->end(it); - //End getSpeed - - apf::Field* surfaceSpeedField = apf::createLagrangeField(mesh,"surface_speed",apf::SCALAR,1); - it = mesh->begin(0); - apf::MeshIterator* itVol = volMesh->begin(0); - while( (vert = mesh->iterate(it)) ) - { - apf::MeshEntity* vertVol = volMesh->iterate(itVol); - double rhoVal = apf::getScalar(rhoField,vertVol,0); - double eVal = apf::getScalar(eField,vertVol,0); - double speedVal = apf::getScalar(speedField,vertVol,0); - apf::setScalar(surfaceRhoField,vert,0,rhoVal); - apf::setScalar(surfaceEField,vert,0,eVal); - apf::setScalar(surfaceSpeedField,vert,0,speedVal); - } - mesh->end(it); - volMesh->end(itVol); - std::cout<<"Finished surface fields from volume\n"; - - double getSurfaceTime = PCU_Time(); - std::cout<<"TIMER: Finished computing speed and transferring fields to surface "<begin(0); - while( (vert = volMesh->iterate(itVol)) ) - { - double rho_e = apf::getScalar(eField,vert,0); - double rho = apf::getScalar(rhoField,vert,0); - double speedVal = apf::getScalar(speedField,vert,0); - double pressure_gamma = rho_e-0.5*rho*speedVal*speedVal; - apf::setScalar(pressureField,vert,0,pressure_gamma); - } - volMesh->end(itVol); - apf::Field* gradPressureField = apf::recoverGradientByVolume(pressureField); - apf::Field* hessianPressureField = apf::recoverGradientByVolume(gradPressureField); - - //get eigenvalues in the volume mesh - getLambdaMax(volMesh,hessianPressureField,lambdaMaxField); - - - FieldOfInterest eBased; - eBased.lambdaMaxField = lambdaMaxField; - eBased.lambdaStrandMax = apf::createLagrangeField(mesh,"surf_lambda_strandMax",apf::SCALAR,1); - eBased.sizeField = apf::createLagrangeField(mesh,"surface_size_e",apf::SCALAR,1); - - getVolMaxPair(mesh,surfToStrandMap,eBased.lambdaMaxField,eBased.lambdaStrandMax,currentSize,eBased.lambda_max,eBased.h_lambdamax); - - //set size field - - setSizeField(mesh,eBased.lambdaStrandMax,eBased.sizeField,eBased.lambda_max,eBased.lambda_cutoff(),eBased.h_lambdamax,h_global,factor); - - double getPressureTime = PCU_Time(); - std::cout<<"TIMER: Finished pressure size field "<begin(0); - int vIDcounter = 0; //better way to do this would be with a numbering system - //apf::Numbering* nVID = volMesh->findNumbering; //this would be for a volume mesh - - while( (vert = mesh->iterate(it)) ) - { - apf::Vector3 pointVol; - apf::Vector3 pointSurf; - apf::MeshEntity* volVert = surfToStrandMap[vIDcounter][1]; - double speed = apf::getScalar(speedField,volVert,0); - mesh->getPoint(vert,0,pointSurf); - volMesh->getPoint(volVert,0,pointVol); - apf::Vector3 differenceVec = pointVol-pointSurf; - double shearStress = speed/differenceVec.getLength(); - apf::setScalar(surfaceShearField,vert,0,shearStress); - vIDcounter++; - } - mesh->end(it); - - FieldOfInterest shearBased; - shearBased.lambdaMaxField = apf::createLagrangeField(mesh,"surflambdaMax",apf::SCALAR,1); - shearBased.sizeField = apf::createLagrangeField(mesh,"surface_size",apf::SCALAR,1); - - //get surface shear gradient - std::cout<<"Reached gradshearfield\n"; - apf::Field* gradShearField = apf::recoverGradientByVolume(surfaceShearField); - std::cout<<"Got gradshearfield\n"; - - it=mesh->begin(0); - while( (vert = mesh->iterate(it)) ) - { - apf::Vector3 gradShear; - apf::getVector(gradShearField,vert,0,gradShear); - apf::setScalar(shearBased.lambdaMaxField,vert,0,gradShear.getLength()); - } - mesh->end(it); - - std::cout<<"Got surf lambda max\n"; - getSurfMaxPair(mesh,shearBased.lambdaMaxField,currentSize,shearBased.lambda_max,shearBased.h_lambdamax); - - std::cout<<"Got surf lambda max pair\n"; - //set size field - setSizeField(mesh,shearBased.lambdaMaxField,shearBased.sizeField,shearBased.lambda_max,shearBased.lambda_cutoff(),shearBased.h_lambdamax,h_global,factor); - - std::cout<<"set size field\n"; - - double getShearTime = PCU_Time(); - std::cout<<"TIMER: Finished skin friction size field "< sizeFieldList; - sizeFieldList.push(eBased.sizeField); - sizeFieldList.push(shearBased.sizeField); - apf::Field* finalChoiceField = apf::createLagrangeField(mesh,"finalChoice",apf::SCALAR,1); - it = mesh->begin(0); - while( (vert = mesh->iterate(it)) ) - { - apf::setScalar(finalChoiceField,vert,0,0); - } - - isotropicIntersect(mesh,sizeFieldList,bitFields,finalSizeField,finalChoiceField); - - double getIntersectionTime = PCU_Time(); - std::cout<<"TIMER: get mesh intersection "<shouldRunPreZoltan = true; - in->shouldRunMidZoltan = true; - in->shouldRunPostZoltan = true; - in->maximumImbalance = 1.05; - in->maximumIterations = log2(factor) + 2; - in->shouldSnap = true; - in->shouldTransferParametric = true; - /* in->shouldTransferToClosestPoint = true; */ - in->shouldForceAdaptation = true; - /* in->debugFolder = "debug"; */ - ma::adaptVerbose(in, false); - - double adaptTime = PCU_Time(); - std::cout<<"TIMER: adaptMesh "< binCount; - std::vector binArea; - computeSizeDistribution(mesh, factor, binCount, binArea); - - for (std::size_t i = 0; i < binCount.size(); i++) { - printf("bin %lu's count/area is %d/%g \n", i, binCount[i], binArea[i]); - } - - - // write the adapted mesh to vtk - apf::writeVtkFiles("adaptedMesh", mesh); - // write the adapted mesh to smb - // Note: This is for statistic measurements using - // measureIsoStats.cc - // The last argument is the name of the field to be used - // in measureIsoStats.cc - writeMdsMesh(mesh, "adaptedMesh.smb", "adapt_size"); - // write the adapted mesh to cre - writeCre(cs, "adaptedMesh.cre"); - - // clean up and exit calls - //destroy all fields... - for(int i =0;icountFields();i++) - { - apf::destroyField(mesh->getField(i)); - } - for(int i =0;icountFields();i++) - { - apf::destroyField(volMesh->getField(i)); - } - - gmi_cap_stop(); - PCU_Comm_Free(); - MPI_Finalize(); -} - -std::vector readTable(const char* name) -{ - std::vector table; - std::ifstream file(name); - while(!file.eof()){ - std::string str; - std::getline(file, str); - std::stringstream ss(str); - double value; - row r; - while (ss >> value) - r.push_back(value); - if (r.size() > 0) - table.push_back(r); - } - return table; -} - -static std::vector extractNthStrandData(const std::vector &table, - const int strandSize, const int n, const int col) -{ - std::vector outData; - int i = 0; - while (i*strandSize+(strandSize-n) < int(table.size())) { - outData.push_back(table[i*strandSize+(strandSize - n)][col]); - i++; - } - return outData; -} - -std::vector extractSurfaceData(const std::vector &table, - const int strandSize, const int col) -{ - // surface data corresponds to strand 1; - return extractNthStrandData(table, strandSize, 1, col); -} - -apf::Field* addScalarField(apf::Mesh2* m, const std::vector t, const char* name, int col, int strandSize) -{ - apf::Numbering* nLayer = m->findNumbering("layer_num"); - apf::Numbering* nVid = m->findNumbering("vid_num"); - PCU_ALWAYS_ASSERT(nLayer); - PCU_ALWAYS_ASSERT(nVid); - - apf::Field* f = apf::createFieldOn(m, name, apf::SCALAR); - apf::MeshEntity* e; - apf::MeshIterator* it = m->begin(0); - int count = 0; - while ( (e = m->iterate(it)) ) { - int layer = apf::getNumber(nLayer, e, 0, 0); - int vid = apf::getNumber(nVid, e, 0, 0); - double value = t[vid*strandSize+(strandSize - layer)][col]; - apf::setScalar(f, e, 0, value); - count++; - } - m->end(it); - return f; -} - -apf::Field* addVector3Field(apf::Mesh2* m, const std::vector t, const char* name, - int col0, int col1, int col2, int strandSize) -{ - apf::Numbering* nLayer = m->findNumbering("layer_num"); - apf::Numbering* nVid = m->findNumbering("vid_num"); - PCU_ALWAYS_ASSERT(nLayer); - PCU_ALWAYS_ASSERT(nVid); - - apf::Field* f = apf::createFieldOn(m, name, apf::VECTOR); - apf::MeshEntity* e; - apf::MeshIterator* it = m->begin(0); - int count = 0; - while ( (e = m->iterate(it)) ) { - int layer = apf::getNumber(nLayer, e, 0, 0); - int vid = apf::getNumber(nVid, e, 0, 0); - double value0 = t[vid*strandSize+(strandSize - layer)][col0]; - double value1 = t[vid*strandSize+(strandSize - layer)][col1]; - double value2 = t[vid*strandSize+(strandSize - layer)][col2]; - apf::setVector(f, e, 0, apf::Vector3(value0, value1, value2)); - count++; - } - m->end(it); - return f; -} - - - -static std::vector -readLayerCoordinates(int layer, const std::vector &t, int s) -{ - std::vector xs = extractNthStrandData(t, s, layer, 0); - std::vector ys = extractNthStrandData(t, s, layer, 1); - std::vector zs = extractNthStrandData(t, s, layer, 2); - - std::vector res; - - for (std::size_t i = 0; i < xs.size(); i++) - res.push_back(apf::Vector3(xs[i], ys[i], zs[i])); - - return res; -} - - -apf::Mesh2* createVolumeMesh(apf::Mesh2* m, const std::vector &t, int s, std::vector > &surfToStrandMap) -{ - // add numbering to the surface mash - apf::Numbering* n = apf::createNumbering(m, "surf_verts_num", apf::getLagrange(1) , 1); - apf::MeshEntity* e; - apf::MeshIterator* it = m->begin(0); - int count = 0; - while ( (e = m->iterate(it)) ) { - apf::number(n, e, 0, 0, count); - count++; - } - m->end(it); - - - // get the original faces - std::vector faces; - it = m->begin(2); - while ( (e = m->iterate(it)) ) - faces.push_back(e); - m->end(it); - - // create and empty mds mesh - apf::Mesh2* vMesh = apf::makeEmptyMdsMesh(gmi_load(".null"), 3, false); - apf::Numbering* nLayer = apf::createNumbering(vMesh, "layer_num", apf::getLagrange(1) , 1); - apf::Numbering* nVID = apf::createNumbering(vMesh, "vid_num", apf::getLagrange(1) , 1); - - // process each layer - // layer = 1 corresponds to the surface nodes - // treat it out side of the loop - std::vector coords = readLayerCoordinates(1, t, s); - std::vector lastVs; - for (std::size_t i = 0; i < coords.size(); i++) { - apf::MeshEntity* v = vMesh->createVertex(0, coords[i], apf::Vector3(0, 0, 0)); - apf::number(nLayer, v, 0, 0, 1); - apf::number(nVID, v, 0, 0, i); - lastVs.push_back(v); - } - - PCU_ALWAYS_ASSERT(coords.size() == lastVs.size()); - - // now process the remaining layers - for (int layer = 2; layer < s+1; layer++) { - // read the coords first - std::vector coords = readLayerCoordinates(layer, t, s); - // create the new verts - std::vector vs; - for (std::size_t i = 0; i < coords.size(); i++) { - apf::MeshEntity* v = vMesh->createVertex(0, coords[i], apf::Vector3(0, 0, 0)); - apf::number(nLayer, v, 0, 0, layer); - apf::number(nVID, v, 0, 0, i); - vs.push_back(v); - } - - // create the prisms - for (std::size_t i = 0; i < faces.size(); i++) { - apf::MeshEntity* f = faces[i]; - apf::MeshEntity* dv[3]; - m->getDownward(f, 0, dv); - int id0 = apf::getNumber(n, dv[0], 0, 0); - int id1 = apf::getNumber(n, dv[1], 0, 0); - int id2 = apf::getNumber(n, dv[2], 0, 0); - - apf::MeshEntity* prismVs[6]; - - prismVs[0] = lastVs[id0]; - prismVs[1] = lastVs[id1]; - prismVs[2] = lastVs[id2]; - - prismVs[3] = vs[id0]; - prismVs[4] = vs[id1]; - prismVs[5] = vs[id2]; - - apf::buildElement(vMesh, 0, apf::Mesh::PRISM, prismVs); - } - // set the lastVs to Vs - for (std::size_t i = 0; i < vs.size(); i++) - lastVs[i] = vs[i]; - } - vMesh->acceptChanges(); - apf::deriveMdsModel(vMesh); - apf::verify(vMesh); - - // create the surface to strand map - it = vMesh->begin(0); - while ( (e = vMesh->iterate(it)) ) { - int layer = apf::getNumber(nLayer, e, 0, 0) - 1; - int vid = apf::getNumber(nVID, e, 0, 0); - PCU_ALWAYS_ASSERT((layer >= 0) && (layer < s)); - PCU_ALWAYS_ASSERT((vid >= 0) && (vid < (int)m->count(0))); - surfToStrandMap[vid][layer] = e; - } - vMesh->end(it); - - // return the volume mesh - return vMesh; -} - -void writeCre(CapstoneModule& cs, const std::string& fileName) -{ - GeometryDatabaseInterface *gdbi = cs.get_geometry(); - MeshDatabaseInterface *mdbi = cs.get_mesh(); - AppContext *ctx = cs.get_context(); - - // Get the VTK writer. - Writer *creWriter = get_writer(ctx, "Create Native Writer"); - if (!creWriter) - error(HERE, ERR_GENERIC, "Could not find the CRE writer"); - - IdMapping idmapping; - std::vector mmodels; - M_GModel gmodel; - M_MModel mmodel; - gdbi->get_current_model(gmodel); - mdbi->get_current_model(mmodel); - mmodels.clear(); - mmodels.push_back(mmodel); - creWriter->write(ctx, gmodel, mmodels, fileName.c_str(), idmapping); -} - -void writeMdsMesh(apf::Mesh2* m, const char* name, const char* fieldName) -{ - // this would be the smb mesh with a field associated with it - apf::Mesh2* outMesh = apf::makeEmptyMdsMesh(gmi_load(".null"), 2, false); - - // add numbering to the surface mash - apf::Numbering* n = apf::createNumbering(m, "v_num", apf::getLagrange(1) , 1); - apf::MeshEntity* e; - apf::MeshIterator* it = m->begin(0); - int count = 0; - while ( (e = m->iterate(it)) ) { - apf::number(n, e, 0, 0, count); - count++; - } - m->end(it); - - - int numVerts = m->count(0); - apf::MeshEntity* vMap[numVerts]; - - apf::MeshEntity* v; - it = m->begin(0); - while( (v = m->iterate(it)) ) { - apf::Vector3 p; - m->getPoint(v, 0, p); - apf::MeshEntity* nv = outMesh->createVertex(0, p, apf::Vector3(0, 0, 0)); - int id = apf::getNumber(n, v, 0, 0); - vMap[id] = nv; - } - m->end(it); - - it = m->begin(2); - while( (e = m->iterate(it)) ) { - apf::MeshEntity* vs[3]; - m->getDownward(e, 0, vs); - apf::MeshEntity* triVs[3]; - triVs[0] = vMap[apf::getNumber(n, vs[0], 0, 0)]; - triVs[1] = vMap[apf::getNumber(n, vs[1], 0, 0)]; - triVs[2] = vMap[apf::getNumber(n, vs[2], 0, 0)]; - apf::buildElement(outMesh, 0, apf::Mesh::TRIANGLE, triVs); - } - m->end(it); - - outMesh->acceptChanges(); - apf::deriveMdsModel(outMesh); - outMesh->verify(); - apf::verify(outMesh); - - apf::destroyNumbering(n); - - // get the field on input mesh - apf::Field* inputField = m->findField(fieldName); - PCU_ALWAYS_ASSERT(inputField); - - // create the corresponding field for the out mesh - apf::Field* outputField = apf::createFieldOn(outMesh, "sizes", apf::SCALAR); - - it = m->begin(0); - apf::MeshIterator* outIt = outMesh->begin(0); - while( (v = m->iterate(it)) ) { - double value = apf::getScalar(inputField, v, 0); - apf::MeshEntity* outV = outMesh->iterate(outIt); - apf::setScalar(outputField, outV, 0, value); - } - m->end(it); - outMesh->end(outIt); - outMesh->writeNative(name); - - // clean up outMesh - outMesh->destroyNative(); - apf::destroyMesh(outMesh); -} - - -void computeSizeDistribution(apf::Mesh2* m, int factor, - std::vector& binCount, std::vector& binArea) -{ - // find the min length edge - apf::MeshEntity* e; - apf::MeshIterator* it; - - double minLength = 1.0e12; - it = m->begin(1); - while ( (e = m->iterate(it)) ) { - double l = apf::measure(m, e); - if (l < minLength) - minLength = l; - } - m->end(it); - - double minArea = minLength * minLength / 2.; - - // initialize the arrays - for (int i = 1; i <= factor; i*=2) { - binCount.push_back(0); - binArea.push_back(0.0); - } - - - it = m->begin(2); - while ( (e = m->iterate(it)) ) { - double a = apf::measure(m, e); - int count = 0; - for (int i = 1; i <= factor; i*=2) { - if (a >= i * minArea && a < 4 * i * minArea) { - binCount[count] += 1; - binArea[count] += a; - break; - } - count++; - } - } - m->end(it); -} - -void adjustRefinementLevel(apf::Mesh2* m, apf::Field* finalSize, - apf::Field* currentSize, int maxLevel) -{ - apf::MeshEntity* v; - apf::MeshIterator* it = m->begin(0); - - while( (v = m->iterate(it)) ) { - double currnetS = apf::getScalar(currentSize, v, 0); - double finalS = apf::getScalar(finalSize, v, 0); - if (currnetS < finalS) continue; - if (log2(currnetS/finalS) > maxLevel) - finalS = currnetS / pow(2, maxLevel); - apf::setScalar(finalSize, v, 0, finalS); - } - m->end(it); -} diff --git a/capstone_clis/capStoneAttachSolutionUni.cc b/capstone_clis/capStoneAttachSolutionUni.cc deleted file mode 100644 index 504cc9e03..000000000 --- a/capstone_clis/capStoneAttachSolutionUni.cc +++ /dev/null @@ -1,951 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -#include "CapstoneModule.h" -#include "CreateMG_Framework_Core.h" -#include "CreateMG_Framework_Analysis.h" -#include "CreateMG_Framework_Application.h" -#include "CreateMG_Framework_Attributes.h" -#include "CreateMG_Framework_Core.h" -#include "CreateMG_Framework_Geometry.h" -#include "CreateMG_Framework_Mesh.h" - -using namespace CreateMG; -using namespace CreateMG::Attribution; -using namespace CreateMG::Mesh; -using namespace CreateMG::Geometry; - - -typedef std::vector row; - -std::vector readTable(const char* name); - -std::vector extractSurfaceData(const std::vector &table, - const int strandSize, const int col); - -void removeUnusedVerts(apf::Mesh2* m, int offset); - -apf::Mesh2* createVolumeMesh(apf::Mesh2* m, const std::vector &t, int s, - std::vector > &surfToStrandMap); - -apf::Field* addScalarField(apf::Mesh2* m, const std::vector t, const char* name, int col, int strandSize); - -apf::Field* addVector3Field(apf::Mesh2* m, const std::vector t, const char* name, - int col0, int col1, int col2, int strandSize); - -void writeCre(CapstoneModule& cs, const std::string& fileName); - -void writeMdsMesh(apf::Mesh2* m, const char* name, const char* fieldName); - -struct SortingStruct -{ - apf::Vector3 v; - double wm; - bool operator<(const SortingStruct &other) const - { - return wm < other.wm; - } -}; - -//gradation routines from Proteus - -int gradeSizeModify(apf::Mesh* m, apf::Field* size_iso,double gradingFactor, - double size[2], apf::Adjacent edgAdjVert, - apf::Adjacent vertAdjEdg, - std::queue &markedEdges, - apf::MeshTag* isMarked, - int fieldType, - int vecPos, //which idx of sizeVec to modify - int idxFlag) - -//General function to actually modify sizes -{ - (void)vecPos; - //Determine a switching scheme depending on which vertex needs a modification - int idx1,idx2; - if(idxFlag == 0){ - idx1=0; - idx2=1; - } - else{ - idx1=1; - idx2 = 0; - } - - int marker[3] = {0,1,0}; - double marginVal = 0.01; - int needsParallel=0; - - if(fieldType == apf::SCALAR){ - //apf::Field* size_iso = m->findField("size"); - - if(size[idx1]>(gradingFactor*size[idx2])*(1+marginVal)) - { - if(m->isOwned(edgAdjVert[idx1])) - { - size[idx1] = gradingFactor*size[idx2]; - apf::setScalar(size_iso,edgAdjVert[idx1],0,size[idx1]); - m->getAdjacent(edgAdjVert[idx1], 1, vertAdjEdg); - for (std::size_t i=0; igetIntTag(vertAdjEdg[i],isMarked,&marker[2]); - //if edge is not already marked - if(!marker[2]){ - m->setIntTag(vertAdjEdg[i],isMarked,&marker[1]); - markedEdges.push(vertAdjEdg[i]); - } - } - } //end isOwned - else - { //Pack information to owning processor - needsParallel=1; - apf::Copies remotes; - m->getRemotes(edgAdjVert[idx1],remotes); - double newSize = gradingFactor*size[idx2]; - int owningPart=m->getOwner(edgAdjVert[idx1]); - PCU_COMM_PACK(owningPart, remotes[owningPart]); - PCU_COMM_PACK(owningPart,newSize); - } - } - - }//end if apf::SCALAR - return needsParallel; -} - -void markEdgesInitial(apf::Mesh* m, apf::Field* size_iso, std::queue &markedEdges,double gradingFactor) -//Function used to initially determine which edges need to be considered for gradation -{ - //marker structure for 0) not marked 1) marked 2)storage - int marker[3] = {0,1,0}; - - double size[2]; - apf::MeshTag* isMarked = m->findTag("isMarked"); -// apf::Field* size_iso = m->findField("size"); - apf::Adjacent edgAdjVert; - apf::MeshEntity* edge; - apf::MeshIterator* it = m->begin(1); - while((edge=m->iterate(it))){ - m->getAdjacent(edge, 0, edgAdjVert); - for (std::size_t i=0; i < edgAdjVert.getSize(); ++i){ - size[i]=apf::getScalar(size_iso,edgAdjVert[i],0); - } - if( (size[0] > gradingFactor*size[1]) || (size[1] > gradingFactor*size[0]) ){ - //add edge to a queue - markedEdges.push(edge); - //tag edge to indicate that it is part of queue - m->setIntTag(edge,isMarked,&marker[1]); - } - else{ - m->setIntTag(edge,isMarked,&marker[0]); - } - } - m->end(it); -} - -int serialGradation(apf::Mesh* m,apf::Field* size_iso, std::queue &markedEdges,double gradingFactor) -//Function used loop over the mesh edge queue for gradation and modify the sizes -{ - double size[2]; - //marker structure for 0) not marked 1) marked 2)storage - int marker[3] = {0,1,0}; - apf::MeshTag* isMarked = m->findTag("isMarked"); -// apf::Field* size_iso = m->findField("size"); - apf::Adjacent edgAdjVert; - apf::Adjacent vertAdjEdg; - apf::MeshEntity* edge; - int needsParallel=0; - - //perform serial gradation while packing necessary info for parallel - while(!markedEdges.empty()){ - edge = markedEdges.front(); - m->getAdjacent(edge, 0, edgAdjVert); - for (std::size_t i=0; i < edgAdjVert.getSize(); ++i){ - size[i] = apf::getScalar(size_iso,edgAdjVert[i],0); - } - - needsParallel+=gradeSizeModify(m,size_iso, gradingFactor, size, edgAdjVert, - vertAdjEdg, markedEdges, isMarked, apf::SCALAR,0, 0); - needsParallel+=gradeSizeModify(m,size_iso, gradingFactor, size, edgAdjVert, - vertAdjEdg, markedEdges, isMarked, apf::SCALAR,0, 1); - - m->setIntTag(edge,isMarked,&marker[0]); - markedEdges.pop(); - } - return needsParallel; -} - -int gradeMesh(apf::Mesh* m,apf::Field* size_iso) -//Function to grade isotropic mesh through comparison of edge vertex size ratios -//This implementation accounts for parallel meshes as well -//First do serial gradation. -//If a shared entity has its size modified, then send new size to owning copy. -//After full loop over entities, have owning copy take minimum of all sizes received -//Flag adjacent entities to owning copy. -//Communicate to remote copies that a size was modified, and flag adjacent edges to remote copies for further gradation -{ - //unique to this code - //apf::Field* size_iso = m->findField("size"); - double gradingFactor = 1.2; - // - - apf::MeshEntity* edge; - apf::Adjacent edgAdjVert; - apf::Adjacent vertAdjEdg; - std::queue markedEdges; - apf::MeshTag* isMarked = m->createIntTag("isMarked",1); - - //marker structure for 0) not marked 1) marked 2)storage - int marker[3] = {0,1,0}; - - apf::MeshIterator* it; - markEdgesInitial(m,size_iso,markedEdges,gradingFactor); - - int needsParallel=1; - while(needsParallel) - { - PCU_Comm_Begin(); - needsParallel = serialGradation(m,size_iso,markedEdges,gradingFactor); - - PCU_Add_Ints(&needsParallel,1); - PCU_Comm_Send(); - - apf::MeshEntity* ent; - double receivedSize; - double currentSize; - double newSize; - - //Need a container to get all entitites that need to be updated on remotes - std::queue updateRemoteVertices; - - apf::Copies remotes; - //owning copies are receiving - while(PCU_Comm_Receive()) - { - PCU_COMM_UNPACK(ent); - PCU_COMM_UNPACK(receivedSize); - - if(!m->isOwned(ent)){ - std::cout<<"THERE WAS AN ERROR"<getAdjacent(ent, 1, vertAdjEdg); - for (std::size_t i=0; igetIntTag(vertAdjEdg[i],isMarked,&marker[2]); - if(!marker[2]) - { - markedEdges.push(edge); - //tag edge to indicate that it is part of queue - m->setIntTag(edge,isMarked,&marker[1]); - } - } - updateRemoteVertices.push(ent); - } - - PCU_Comm_Begin(); - - while(!updateRemoteVertices.empty()) - { - ent = updateRemoteVertices.front(); - //get remote copies and send updated mesh sizes - m->getRemotes(ent,remotes); - currentSize = apf::getScalar(size_iso,ent,0); - for(apf::Copies::iterator iter=remotes.begin(); iter!=remotes.end();++iter) - { - PCU_COMM_PACK(iter->first, iter->second); - } - updateRemoteVertices.pop(); - } - - PCU_Comm_Send(); - //while remote copies are receiving - while(PCU_Comm_Receive()) - { - //unpack - PCU_COMM_UNPACK(ent); - //PCU_COMM_UNPACK(receivedSize); - assert(!m->isOwned(ent)); - - if(m->isOwned(ent)){ - std::cout<<"Problem occurred\n"; - std::exit(1); - } - - //add adjacent edges into Q - m->getAdjacent(ent, 1, vertAdjEdg); - for (std::size_t i=0; igetIntTag(vertAdjEdg[i],isMarked,&marker[2]); - if(!marker[2]) - { - markedEdges.push(edge); - //tag edge to indicate that it is part of queue - m->setIntTag(edge,isMarked,&marker[1]); - } - } - } - apf::synchronize(size_iso); - - } //end outer while - - //Cleanup of edge marker field - it = m->begin(1); - while((edge=m->iterate(it))){ - m->removeTag(edge,isMarked); - } - m->end(it); - m->destroyTag(isMarked); - - //apf::synchronize(size_iso); - return needsParallel; -} - -//Eigenvalue routines for volume and surface meshes -// - //function to get volume-based eigenvalues -//apf::Field* getLambdaMax(mesh,hessianField,) -void getLambdaMax(apf::Mesh* mesh,apf::Field* hessianField,apf::Field* lambdaMaxField) -{ - apf::MeshEntity* vert; - apf::MeshIterator* it; - it = mesh->begin(0); - //apf::Field* lambdaMaxField = apf::createLagrangeField(mesh,"lambdaMax",apf::SCALAR,1); - while( (vert = mesh->iterate(it)) ) - { - apf::Matrix3x3 metric; - apf::getMatrix(hessianField, vert, 0, metric); - apf::Vector3 eigenVectors[3]; - double eigenValues[3]; - metric = (metric+apf::transpose(metric))/2.0; - apf::eigen(metric, eigenVectors, eigenValues); - - // Sort the eigenvalues and corresponding vectors - // Larger eigenvalues means a need for a finer mesh - SortingStruct ssa[3]; - for (int i = 0; i < 3; ++i) - { - ssa[i].v = eigenVectors[i]; - ssa[i].wm = std::fabs(eigenValues[i]); - } - std::sort(ssa, ssa + 3); - - assert(ssa[2].wm >= ssa[1].wm); - assert(ssa[1].wm >= ssa[0].wm); - apf::setScalar(lambdaMaxField,vert,0,ssa[2].wm); - } - mesh->end(it); -} - -/* -void getVolMaxPair(apf::Mesh* mesh,apf::Mesh* volMesh,apf::Field* lambdaMaxField,apf::Field* currentSize,double &lambda_max,double &h_lambdamax) -{ - apf::MeshIterator* it = mesh->begin(0); - apf::MeshIterator* itVol = volMesh->begin(0); - apf::MeshEntity* vert, *vertVol; - while( (vert = mesh->iterate(it)) ) - { - apf::MeshEntity* vertVol = volMesh->iterate(itVol); - if(lambda_max < apf::getScalar(lambdaMaxField,vertVol,0)) - { - lambda_max = apf::getScalar(lambdaMaxField,vertVol,0); - h_lambdamax = apf::getScalar(currentSize,vert,0); - } - } - volMesh->end(itVol); - mesh->end(it); -} -*/ - -void getVolMaxPair(apf::Mesh* mesh,std::vector > surfToStrandMap, apf::Field* lambdaMaxField,apf::Field* lambdaStrandMax, apf::Field* currentSize,double &lambda_max,double &h_lambdamax) -{ - apf::MeshIterator* it = mesh->begin(0); - apf::MeshEntity* vert, *vertVol; - int counter = 0; - while( (vert = mesh->iterate(it)) ) - { - //the goal of this loop is to identify lambda max global, find corresponding surface h-max global, and then set the surface lambda field - int strandSize = surfToStrandMap[counter].size(); - for(int i=0; iend(it); -} - -void getSurfMaxPair(apf::Mesh* mesh,apf::Field* lambdaMaxField,apf::Field* currentSize,double &lambda_max,double &h_lambdamax) -{ - apf::MeshIterator* it = mesh->begin(0); - apf::MeshEntity* vert; - while( (vert = mesh->iterate(it)) ) - { - if(lambda_max < apf::getScalar(lambdaMaxField,vert,0)) - { - lambda_max = apf::getScalar(lambdaMaxField,vert,0); - h_lambdamax = apf::getScalar(currentSize,vert,0); - } - } - mesh->end(it); -} - -void setSizeField(apf::Mesh* mesh, apf::Field* lambdaMaxField,apf::Field* sizeField,double lambda_max,double lambda_cutoff, double h_lambdamax,double h_global,double factor) -{ - apf::MeshIterator* it=mesh->begin(0); - apf::MeshEntity* vert; - int counter3 = 0; - double h_special = -1; - while( (vert = mesh->iterate(it)) ) - { - double h_v = h_special; //set default size as user specified input - double lambda_vert = apf::getScalar(lambdaMaxField,vert,0); - if(lambda_vert > lambda_cutoff) - { - h_v = sqrt(lambda_max/lambda_vert/factor)*h_lambdamax; - } - else - counter3++; - //h_global is user-specified max size - if(h_v > h_global) //maximum value for size field - h_v = h_global; - apf::setScalar(sizeField,vert,0,h_v); - } - mesh->end(it); - -} - -void isotropicIntersect(apf::Mesh* m, std::queue sizeFieldList,apf::Field* finalSizeField,apf::Field* finalChoiceField) -{ - apf::MeshEntity *vert; - apf::MeshIterator *it = m->begin(0); - - apf::Field *field = sizeFieldList.front(); - apf::copyData(finalSizeField,field); - sizeFieldList.pop(); - int choiceIdx = 1; //assumes the initial field was set to choice 0 - while(!sizeFieldList.empty()) - { - field = sizeFieldList.front(); - while( (vert = m->iterate(it)) ) - { - double value1 = apf::getScalar(finalSizeField,vert,0); - double value2 = apf::getScalar(field,vert,0); - double minValue = std::min(value1,value2); - apf::setScalar(finalSizeField,vert,0,minValue); - if(value1 > value2) - { - apf::setScalar(finalChoiceField,vert,0,choiceIdx); - } - } - sizeFieldList.pop(); - choiceIdx++; - } - m->end(it); -} - - -// - -int main(int argc, char** argv) -{ - MPI_Init(&argc, &argv); - PCU_Comm_Init(); - lion_set_verbosity(1); - double initialTime = PCU_Time(); - - if (argc != 7) { - if(0==PCU_Comm_Self()) - std::cerr << "usage: " << argv[0] - << " \n"; - return EXIT_FAILURE; - } - - - gmi_register_mesh(); - gmi_register_null(); - - const char* creFileName = argv[1]; - const char* dataFileName = argv[2]; - int offset = atoi(argv[3]); - const int strandSize = atoi(argv[4]); - double h_global = atof(argv[5]); - double factor = atof(argv[6]); - - // load capstone mesh - // create an instance of the Capstone Module activating CREATE/CREATE/CREATE - // for the Geometry/Mesh/Attribution databases - /* const std::string gdbName("Geometry Database : Create");// Switch Create with SMLIB for CAD */ - const std::string gdbName("Geometry Database : SMLIB");// Switch Create with SMLIB for CAD - const std::string mdbName("Mesh Database : Create"); - const std::string adbName("Attribution Database : Create"); - - CapstoneModule cs("the_module", gdbName.c_str(), mdbName.c_str(), adbName.c_str()); - - GeometryDatabaseInterface *g = cs.get_geometry(); - MeshDatabaseInterface *m = cs.get_mesh(); - AppContext *c = cs.get_context(); - - - PCU_ALWAYS_ASSERT(g); - PCU_ALWAYS_ASSERT(m); - PCU_ALWAYS_ASSERT(c); - - v_string filenames; - filenames.push_back(creFileName); - - M_GModel gmodel = cs.load_files(filenames); - - int numbreps = 0; - MG_CALL(g->get_num_breps(numbreps)); - std::cout << "number of b reps is " << numbreps << std::endl; - if(numbreps == 0) - error(HERE, ERR_INVALID_INPUT, "Model is empty"); - - M_MModel mmodel; - // Pick the volume mesh model from associated mesh models to this geom model - std::vector mmodels; - MG_API_CALL(m, get_associated_mesh_models(gmodel, mmodels)); - for(std::size_t i = 0; i < mmodels.size(); ++i) - { - M_MModel ammodel = mmodels[i]; - std::size_t numregs = 0; - std::size_t numfaces = 0; - std::size_t numedges = 0; - std::size_t numverts = 0; - MG_API_CALL(m, set_current_model(ammodel)); - MG_API_CALL(m, get_num_topos(TOPO_REGION, numregs)); - MG_API_CALL(m, get_num_topos(TOPO_FACE, numfaces)); - MG_API_CALL(m, get_num_topos(TOPO_EDGE, numedges)); - MG_API_CALL(m, get_num_topos(TOPO_VERTEX, numverts)); - std::cout << "num regions is " << numregs << std::endl; - std::cout << "num faces is " << numfaces << std::endl; - std::cout << "num edges is " << numedges << std::endl; - std::cout << "num verts is " << numverts << std::endl; - std::cout << "-----------" << std::endl; - if(numregs > 0) - { - mmodel = ammodel; - break; - } - } - - /* SET THE ADJACENCIES */ - MG_API_CALL(m, set_adjacency_state(REGION2FACE| - REGION2EDGE| - REGION2VERTEX| - FACE2EDGE| - FACE2VERTEX)); - MG_API_CALL(m, set_reverse_states()); - MG_API_CALL(m, set_adjacency_scope(TOPO_EDGE, SCOPE_FULL)); - MG_API_CALL(m, set_adjacency_scope(TOPO_FACE, SCOPE_FULL)); - MG_API_CALL(m, compute_adjacency()); - - - gmi_cap_start(); - gmi_register_cap(); - - printf("---- CapStone Mesh Loaded. \n"); - - apf::Mesh2* mesh = apf::createMesh(m,g); - - //adapt the mesh - ma::Input* in; - in = ma::configureUniformRefine(mesh, 1); - ma::validateInput(in); - in->shouldRunPreZoltan = true; - in->shouldRunMidZoltan = true; - in->shouldRunPostZoltan = true; - in->maximumImbalance = 1.05; - in->maximumIterations = log2(factor) + 2; - in->shouldSnap = true; - in->shouldTransferParametric = true; - /* in->shouldTransferToClosestPoint = true; */ - in->shouldForceAdaptation = true; - in->debugFolder = "debug"; - ma::adaptVerbose(in, true); - - double adaptTime = PCU_Time(); - - - // write the adapted mesh to vtk - apf::writeVtkFiles("adaptedMesh", mesh); - // write the adapted mesh to smb - // Note: This is for statistic measurements using - // measureIsoStats.cc - // The last argument is the name of the field to be used - // in measureIsoStats.cc - writeMdsMesh(mesh, "adaptedMesh.smb", "adapt_size"); - // write the adapted mesh to cre - writeCre(cs, "adaptedMesh.cre"); - - - // clean up and exit calls - //destroy all fields... - for(int i =0;icountFields();i++) - { - apf::destroyField(mesh->getField(i)); - } - - gmi_cap_stop(); - PCU_Comm_Free(); - MPI_Finalize(); -} - -std::vector readTable(const char* name) -{ - std::vector table; - std::ifstream file(name); - while(!file.eof()){ - std::string str; - std::getline(file, str); - std::stringstream ss(str); - double value; - row r; - while (ss >> value) - r.push_back(value); - if (r.size() > 0) - table.push_back(r); - } - return table; -} - -static std::vector extractNthStrandData(const std::vector &table, - const int strandSize, const int n, const int col) -{ - std::vector outData; - int i = 0; - while (i*strandSize+(strandSize-n) < int(table.size())) { - outData.push_back(table[i*strandSize+(strandSize - n)][col]); - i++; - } - return outData; -} - -std::vector extractSurfaceData(const std::vector &table, - const int strandSize, const int col) -{ - // surface data corresponds to strand 1; - return extractNthStrandData(table, strandSize, 1, col); -} - -apf::Field* addScalarField(apf::Mesh2* m, const std::vector t, const char* name, int col, int strandSize) -{ - apf::Numbering* nLayer = m->findNumbering("layer_num"); - apf::Numbering* nVid = m->findNumbering("vid_num"); - PCU_ALWAYS_ASSERT(nLayer); - PCU_ALWAYS_ASSERT(nVid); - - apf::Field* f = apf::createFieldOn(m, name, apf::SCALAR); - apf::MeshEntity* e; - apf::MeshIterator* it = m->begin(0); - int count = 0; - while ( (e = m->iterate(it)) ) { - int layer = apf::getNumber(nLayer, e, 0, 0); - int vid = apf::getNumber(nVid, e, 0, 0); - double value = t[vid*strandSize+(strandSize - layer)][col]; - apf::setScalar(f, e, 0, value); - count++; - } - m->end(it); - return f; -} - -apf::Field* addVector3Field(apf::Mesh2* m, const std::vector t, const char* name, - int col0, int col1, int col2, int strandSize) -{ - apf::Numbering* nLayer = m->findNumbering("layer_num"); - apf::Numbering* nVid = m->findNumbering("vid_num"); - PCU_ALWAYS_ASSERT(nLayer); - PCU_ALWAYS_ASSERT(nVid); - - apf::Field* f = apf::createFieldOn(m, name, apf::VECTOR); - apf::MeshEntity* e; - apf::MeshIterator* it = m->begin(0); - int count = 0; - while ( (e = m->iterate(it)) ) { - int layer = apf::getNumber(nLayer, e, 0, 0); - int vid = apf::getNumber(nVid, e, 0, 0); - double value0 = t[vid*strandSize+(strandSize - layer)][col0]; - double value1 = t[vid*strandSize+(strandSize - layer)][col1]; - double value2 = t[vid*strandSize+(strandSize - layer)][col2]; - apf::setVector(f, e, 0, apf::Vector3(value0, value1, value2)); - count++; - } - m->end(it); - return f; -} - - - -void removeUnusedVerts(apf::Mesh2* m, int offset) -{ - apf::MeshEntity* e; - apf::MeshIterator* it = m->begin(0); - int count = 0; - while ( (e = m->iterate(it)) ) { - if (count < offset) { - PCU_ALWAYS_ASSERT(m->countUpward(e) == 0); - m->destroy(e); - } - else - PCU_ALWAYS_ASSERT(m->countUpward(e) != 0); - count++; - } - m->end(it); -} - -static std::vector -readLayerCoordinates(int layer, const std::vector &t, int s) -{ - std::vector xs = extractNthStrandData(t, s, layer, 0); - std::vector ys = extractNthStrandData(t, s, layer, 1); - std::vector zs = extractNthStrandData(t, s, layer, 2); - - std::vector res; - - for (std::size_t i = 0; i < xs.size(); i++) - res.push_back(apf::Vector3(xs[i], ys[i], zs[i])); - - return res; -} - - -apf::Mesh2* createVolumeMesh(apf::Mesh2* m, const std::vector &t, int s, std::vector > &surfToStrandMap) -{ - // add numbering to the surface mash - apf::Numbering* n = apf::createNumbering(m, "surf_verts_num", apf::getLagrange(1) , 1); - apf::MeshEntity* e; - apf::MeshIterator* it = m->begin(0); - int count = 0; - while ( (e = m->iterate(it)) ) { - apf::number(n, e, 0, 0, count); - count++; - } - m->end(it); - - - // get the original faces - std::vector faces; - it = m->begin(2); - while ( (e = m->iterate(it)) ) - faces.push_back(e); - m->end(it); - - // create and empty mds mesh - apf::Mesh2* vMesh = apf::makeEmptyMdsMesh(gmi_load(".null"), 3, false); - apf::Numbering* nLayer = apf::createNumbering(vMesh, "layer_num", apf::getLagrange(1) , 1); - apf::Numbering* nVID = apf::createNumbering(vMesh, "vid_num", apf::getLagrange(1) , 1); - - // process each layer - // layer = 1 corresponds to the surface nodes - // treat it out side of the loop - std::vector coords = readLayerCoordinates(1, t, s); - std::vector lastVs; - for (std::size_t i = 0; i < coords.size(); i++) { - apf::MeshEntity* v = vMesh->createVertex(0, coords[i], apf::Vector3(0, 0, 0)); - apf::number(nLayer, v, 0, 0, 1); - apf::number(nVID, v, 0, 0, i); - lastVs.push_back(v); - } - - PCU_ALWAYS_ASSERT(coords.size() == lastVs.size()); - - // now process the remaining layers - for (int layer = 2; layer < s+1; layer++) { - // read the coords first - std::vector coords = readLayerCoordinates(layer, t, s); - // create the new verts - std::vector vs; - for (std::size_t i = 0; i < coords.size(); i++) { - apf::MeshEntity* v = vMesh->createVertex(0, coords[i], apf::Vector3(0, 0, 0)); - apf::number(nLayer, v, 0, 0, layer); - apf::number(nVID, v, 0, 0, i); - vs.push_back(v); - } - - // create the prisms - for (std::size_t i = 0; i < faces.size(); i++) { - apf::MeshEntity* f = faces[i]; - apf::MeshEntity* dv[3]; - m->getDownward(f, 0, dv); - int id0 = apf::getNumber(n, dv[0], 0, 0); - int id1 = apf::getNumber(n, dv[1], 0, 0); - int id2 = apf::getNumber(n, dv[2], 0, 0); - - apf::MeshEntity* prismVs[6]; - - prismVs[0] = lastVs[id0]; - prismVs[1] = lastVs[id1]; - prismVs[2] = lastVs[id2]; - - prismVs[3] = vs[id0]; - prismVs[4] = vs[id1]; - prismVs[5] = vs[id2]; - - apf::buildElement(vMesh, 0, apf::Mesh::PRISM, prismVs); - } - // set the lastVs to Vs - for (std::size_t i = 0; i < vs.size(); i++) - lastVs[i] = vs[i]; - } - vMesh->acceptChanges(); - apf::deriveMdsModel(vMesh); - apf::verify(vMesh); - - // create the surface to strand map - it = vMesh->begin(0); - while ( (e = vMesh->iterate(it)) ) { - int layer = apf::getNumber(nLayer, e, 0, 0) - 1; - int vid = apf::getNumber(nVID, e, 0, 0); - PCU_ALWAYS_ASSERT((layer >= 0) && (layer < s)); - PCU_ALWAYS_ASSERT((vid >= 0) && (vid < (int)m->count(0))); - surfToStrandMap[vid][layer] = e; - } - vMesh->end(it); - - // return the volume mesh - return vMesh; -} - -void writeCre(CapstoneModule& cs, const std::string& fileName) -{ - GeometryDatabaseInterface *gdbi = cs.get_geometry(); - MeshDatabaseInterface *mdbi = cs.get_mesh(); - AppContext *ctx = cs.get_context(); - - // Get the VTK writer. - Writer *creWriter = get_writer(ctx, "Create Native Writer"); - if (!creWriter) - error(HERE, ERR_GENERIC, "Could not find the CRE writer"); - - IdMapping idmapping; - std::vector mmodels; - M_GModel gmodel; - M_MModel mmodel; - gdbi->get_current_model(gmodel); - mdbi->get_current_model(mmodel); - mmodels.clear(); - mmodels.push_back(mmodel); - creWriter->write(ctx, gmodel, mmodels, fileName.c_str(), idmapping); -} - -void writeMdsMesh(apf::Mesh2* m, const char* name, const char* fieldName) -{ - // this would be the smb mesh with a field associated with it - apf::Mesh2* outMesh = apf::makeEmptyMdsMesh(gmi_load(".null"), 2, false); - - // add numbering to the surface mash - apf::Numbering* n = apf::createNumbering(m, "v_num", apf::getLagrange(1) , 1); - apf::MeshEntity* e; - apf::MeshIterator* it = m->begin(0); - int count = 0; - while ( (e = m->iterate(it)) ) { - apf::number(n, e, 0, 0, count); - count++; - } - m->end(it); - - - int numVerts = m->count(0); - apf::MeshEntity* vMap[numVerts]; - - apf::MeshEntity* v; - it = m->begin(0); - while( (v = m->iterate(it)) ) { - apf::Vector3 p; - m->getPoint(v, 0, p); - apf::MeshEntity* nv = outMesh->createVertex(0, p, apf::Vector3(0, 0, 0)); - int id = apf::getNumber(n, v, 0, 0); - vMap[id] = nv; - } - m->end(it); - - it = m->begin(2); - while( (e = m->iterate(it)) ) { - apf::MeshEntity* vs[3]; - m->getDownward(e, 0, vs); - apf::MeshEntity* triVs[3]; - triVs[0] = vMap[apf::getNumber(n, vs[0], 0, 0)]; - triVs[1] = vMap[apf::getNumber(n, vs[1], 0, 0)]; - triVs[2] = vMap[apf::getNumber(n, vs[2], 0, 0)]; - apf::buildElement(outMesh, 0, apf::Mesh::TRIANGLE, triVs); - } - m->end(it); - - outMesh->acceptChanges(); - apf::deriveMdsModel(outMesh); - outMesh->verify(); - apf::verify(outMesh); - - apf::destroyNumbering(n); - - // get the field on input mesh - apf::Field* inputField = m->findField(fieldName); - PCU_ALWAYS_ASSERT(inputField); - - // create the corresponding field for the out mesh - apf::Field* outputField = apf::createFieldOn(outMesh, "sizes", apf::SCALAR); - - it = m->begin(0); - apf::MeshIterator* outIt = outMesh->begin(0); - while( (v = m->iterate(it)) ) { - double value = apf::getScalar(inputField, v, 0); - apf::MeshEntity* outV = outMesh->iterate(outIt); - apf::setScalar(outputField, outV, 0, value); - } - m->end(it); - outMesh->end(outIt); - outMesh->writeNative(name); - - // clean up outMesh - outMesh->destroyNative(); - apf::destroyMesh(outMesh); -} diff --git a/capstone_clis/capStoneCurve.cc b/capstone_clis/capStoneCurve.cc deleted file mode 100644 index 8d525da10..000000000 --- a/capstone_clis/capStoneCurve.cc +++ /dev/null @@ -1,200 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// === includes for safe_mkdir === -#include -#include /*required for mode_t for mkdir on some systems*/ -#include /*using POSIX mkdir call for SMB "foo/" path*/ -#include /* for checking the error from mkdir */ - - -#include "CapstoneModule.h" -#include "CreateMG_Framework_Core.h" -#include "CreateMG_Framework_Analysis.h" -#include "CreateMG_Framework_Application.h" -#include "CreateMG_Framework_Attributes.h" -#include "CreateMG_Framework_Core.h" -#include "CreateMG_Framework_Geometry.h" -#include "CreateMG_Framework_Mesh.h" - -using namespace CreateMG; -using namespace CreateMG::Attribution; -using namespace CreateMG::Mesh; -using namespace CreateMG::Geometry; - -void safe_mkdir(const char* path) -{ - mode_t const mode = S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH; - int err; - errno = 0; - err = mkdir(path, mode); - if (err != 0 && errno != EEXIST) - { - reel_fail("Err: could not create directory \"%s\"\n", path); - } -} - -void inspectFace(apf::Mesh2* m, apf::MeshEntity* e) -{ - apf::MeshEntity* down[12]; - int ndv = m->getDownward(e, 0, down); - int nde = m->getDownward(e, 1, down); - int ndf = m->getDownward(e, 2, down); - printf("downward v/e/f %d/%d/%d\n", ndv, nde, ndf); -} - -void inspectRegion(apf::Mesh2* m, apf::MeshEntity* e) -{ - apf::MeshEntity* down[12]; - int ndv = m->getDownward(e, 0, down); - int nde = m->getDownward(e, 1, down); - int ndf = m->getDownward(e, 2, down); - int ndr = m->getDownward(e, 3, down); - printf("downward v/e/f/r %d/%d/%d/%d\n", ndv, nde, ndf, ndr); -} - -void writeVtk(CapstoneModule& cs, const std::string& vtkFileName) -{ - GeometryDatabaseInterface *gdbi = cs.get_geometry(); - MeshDatabaseInterface *mdbi = cs.get_mesh(); - AppContext *ctx = cs.get_context(); - - // Get the VTK writer. - Writer *vtkWriter = get_writer(ctx, "VTK File - Generic Writer"); - if (!vtkWriter) - error(HERE, ERR_GENERIC, "Could not find the VTK writer"); - - // This IO Tool re-indexes the vertices for the elements classified in the gregions set and writes out the VTK file - // the sets for edges and faces are empty so the mesh edge/faces classified over the egdes and faces wont get written explicitly - - /* std::vector vgregions; */ - /* vgregions.insert(vgregions.end(), gregions.begin(), gregions.end()); */ - /* vtkWriter->input().set_value("Regions", vgregions); */ - - IdMapping idmapping; - std::vector mmodels; - M_GModel gmodel; - M_MModel mmodel; - gdbi->get_current_model(gmodel); - mdbi->get_current_model(mmodel); - mmodels.clear(); - mmodels.push_back(mmodel); - vtkWriter->write(ctx, gmodel, mmodels, vtkFileName.c_str(), idmapping); - - //cs.save_mesh_file(SystemTool::get_real_app_path().append("/booleaned.vtk"),ommodel); - -} - -int main(int argc, char** argv) -{ - MPI_Init(&argc, &argv); - PCU_Comm_Init(); - - lion_set_verbosity(1); - - gmi_cap_start(); - gmi_register_cap(); - - // load capstone mesh - - // create an instance of the Capstone Module activating CREATE/CREATE/CREATE - // for the Geometry/Mesh/Attribution databases - const std::string gdbName("Geometry Database : SMLIB");// Switch Create with SMLIB for CAD - const std::string mdbName("Mesh Database : Create"); - const std::string adbName("Attribution Database : Create"); - - CapstoneModule cs("test", gdbName.c_str(), mdbName.c_str(), adbName.c_str()); - - GeometryDatabaseInterface *g = cs.get_geometry(); - MeshDatabaseInterface *m = cs.get_mesh(); - AppContext *c = cs.get_context(); - - PCU_ALWAYS_ASSERT(g); - PCU_ALWAYS_ASSERT(m); - PCU_ALWAYS_ASSERT(c); - - v_string filenames; - filenames.push_back(argv[1]); - - M_GModel gmodel = cs.load_files(filenames); - - M_MModel mmodel; - // Pick the volume mesh model from associated mesh models to this geom model - std::vector mmodels; - MG_API_CALL(m, get_associated_mesh_models(gmodel, mmodels)); - - for(std::size_t i = 0; i < mmodels.size(); ++i) - { - M_MModel ammodel = mmodels[i]; - std::size_t numregs = 0; - MG_API_CALL(m, set_current_model(ammodel)); - MG_API_CALL(m, get_num_topos(TOPO_REGION, numregs)); - if(numregs > 0) - { - mmodel = ammodel; - break; - } - } - - MG_API_CALL(m, set_adjacency_state(REGION2FACE| - REGION2EDGE| - REGION2VERTEX| - FACE2EDGE| - FACE2VERTEX)); - MG_API_CALL(m, set_reverse_states()); - MG_API_CALL(m, set_adjacency_scope(TOPO_EDGE, SCOPE_FULL)); - MG_API_CALL(m, set_adjacency_scope(TOPO_FACE, SCOPE_FULL)); - MG_API_CALL(m, compute_adjacency()); - - /* writeVtk(cs, "before.vtk"); */ - apf::Mesh2* apfCapMesh = apf::createMesh(m, g); - - apf::Field* tf = apf::createFieldOn(apfCapMesh, "test_field", apf::VECTOR); - apf::MeshEntity* ent; - apf::MeshIterator* it = apfCapMesh->begin(0); - while( (ent = apfCapMesh->iterate(it)) ) { - apf::Vector3 p = ma::getPosition(apfCapMesh, ent); - double x = p[0]; - double y = p[1]; - double z = p[2]; - apf::Vector3 s(y, z, 2*x); - apf::setVector(tf, ent, 0, s); - } - apfCapMesh->end(it); - - apf::writeVtkFiles("before", apfCapMesh); - - int order = 2; - crv::BezierCurver bc(apfCapMesh, order, 0); - bc.run(); - - crv::writeCurvedVtuFiles(apfCapMesh, apf::Mesh::TRIANGLE, order + 2, "curved"); - crv::writeCurvedWireFrame(apfCapMesh, order + 10, "curved"); - - - M_MModel mmdl; - m->get_current_model(mmdl); - std::string info; - m->print_info(mmdl, info); - std::cout << info << std::endl; - - apf::writeVtkFiles("after", apfCapMesh); - /* writeVtk(cs, "after.vtk"); */ - - gmi_cap_stop(); - PCU_Comm_Free(); - MPI_Finalize(); -} diff --git a/capstone_clis/capStoneIsoAdaptB737.cc b/capstone_clis/capStoneIsoAdaptB737.cc deleted file mode 100644 index e2cf07f00..000000000 --- a/capstone_clis/capStoneIsoAdaptB737.cc +++ /dev/null @@ -1,379 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "CapstoneModule.h" -/* #include "CreateMG_Framework_Core.h" */ -/* #include "CreateMG_Framework_Analysis.h" */ -/* #include "CreateMG_Framework_Application.h" */ -/* #include "CreateMG_Framework_Attributes.h" */ -/* #include "CreateMG_Framework_Core.h" */ -/* #include "CreateMG_Framework_Geometry.h" */ -/* #include "CreateMG_Framework_Mesh.h" */ - - -using namespace CreateMG; -using namespace CreateMG::Attribution; -using namespace CreateMG::Mesh; -using namespace CreateMG::Geometry; - -class B737 : public ma::IsotropicFunction -{ - public: - B737(ma::Mesh* m) - { - mesh = m; - } - virtual double getValue(ma::Entity* v) - { - // get current size - apf::Up up; - mesh->getUp(v, up); - double sum = 0; - double count = 0; - for (int i = 0; i < up.n; i++) { - ma::Entity* currentEdge = up.e[i]; - ma::Entity* vs[2]; - mesh->getDownward(currentEdge, 0, vs); - ma::Vector diff = ma::getPosition(mesh, vs[0]) - ma::getPosition(mesh, vs[1]); - sum += diff.getLength(); - count++; - } - double currentSize = sum/count; - - // compute the size multiplier - double y = 1.; - int tag = mesh->getModelTag(mesh->toModel(v)); - int type = mesh->getModelType(mesh->toModel(v)); - if (type == 2 && (tag == 66 || tag == 86)) - y = 3; - if (type == 1 && tag == 178) - y = 3; - // new size is multiplier * currentSize - return y*currentSize; - } - private: - ma::Mesh* mesh; -}; - - -void writeCre(CapstoneModule& cs, const std::string& vtkFileName) -{ - GeometryDatabaseInterface *gdbi = cs.get_geometry(); - MeshDatabaseInterface *mdbi = cs.get_mesh(); - AppContext *ctx = cs.get_context(); - - // Get the VTK writer. - Writer *creWriter = get_writer(ctx, "Create Native Writer"); - if (!creWriter) - error(HERE, ERR_GENERIC, "Could not find the CRE writer"); - - IdMapping idmapping; - std::vector mmodels; - M_GModel gmodel; - M_MModel mmodel; - gdbi->get_current_model(gmodel); - mdbi->get_current_model(mmodel); - mmodels.clear(); - mmodels.push_back(mmodel); - creWriter->write(ctx, gmodel, mmodels, vtkFileName.c_str(), idmapping); -} - -void gradeSize(apf::Mesh2* m, apf::Field* f, double beta) -{ - std::queue q; - apf::MeshEntity* e; - apf::MeshIterator* it = m->begin(1); - while( (e = m->iterate(it)) ) { - apf::MeshEntity* vs[2]; - m->getDownward(e, 0, vs); - double s0 = apf::getScalar(f, vs[0], 0); - double s1 = apf::getScalar(f, vs[1], 0); - double factor; - if (s0 > s1) factor = s0/s1; - else factor = s1/s0; - if (factor > beta) - q.push(e); - } - m->end(it); - - while(!q.empty()) { - apf::MeshEntity* e = q.front(); - q.pop(); - - apf::MeshEntity* vs[2]; - m->getDownward(e, 0, vs); - double s0 = apf::getScalar(f, vs[0], 0); - double s1 = apf::getScalar(f, vs[1], 0); - - apf::Up up; - if (s1 > beta*s0) { - s1 = beta*s0; - apf::setScalar(f, vs[1], 0, s1); - m->getUp(vs[1], up); - } - else if (s0 > beta*s1) { - s0 = beta*s1; - apf::setScalar(f, vs[0], 0, s0); - m->getUp(vs[0], up); - } - else - continue; - - for (int i = 0; i < up.n; i++) { - q.push(up.e[i]); - } - } -} - -static double triQuality(apf::Mesh2* m, apf::MeshEntity* tri) -{ - apf::Vector3 p0; - apf::Vector3 p1; - apf::Vector3 p2; - - apf::MeshEntity* vs[3]; - m->getDownward(tri, 0, vs); - - m->getPoint(vs[0], 0, p0); - m->getPoint(vs[1], 0, p1); - m->getPoint(vs[2], 0, p2); - - apf::Vector3 d1 = p1 - p0; - apf::Vector3 d2 = p2 - p0; - - apf::Vector3 c = apf::cross(d1, d2); - - double areaSquare = c*c / 4.; - - apf::MeshEntity* es[3]; - m->getDownward(tri, 1, es); - double sum = 0; - for (int i = 0; i < 3; i++) { - apf::MeshEntity* vs[2]; - m->getDownward(es[i], 0, vs); - apf::Vector3 p0; - apf::Vector3 p1; - m->getPoint(vs[0], 0, p0); - m->getPoint(vs[1], 0, p1); - sum += (p1-p0)*(p1-p0); - } - return 48*areaSquare/sum/sum; -} - - -void stats(apf::Mesh2* m, apf::Field* f, double desiredQ, double &minQ, int &nQ, int &nMinL, int &nMaxL) -{ - apf::MeshEntity* e; - apf::MeshIterator* it; - - nQ = nMinL = nMaxL = 0; - - minQ = 1000.0; - it = m->begin(2); - while ( (e = m->iterate(it)) ) { - double q = triQuality(m, e); - if (q < minQ) - minQ = q; - if (q < desiredQ) - nQ++; - } - m->end(it); - - it = m->begin(1); - while ( (e = m->iterate(it)) ) { - apf::MeshEntity* vs[2]; - m->getDownward(e, 0, vs); - apf::Vector3 p0; - apf::Vector3 p1; - m->getPoint(vs[0], 0, p0); - m->getPoint(vs[1], 0, p1); - double length = (p1-p0).getLength(); - double s0 = apf::getScalar(f, vs[0],0); - double s1 = apf::getScalar(f, vs[1],0); - double normalizedLength = 2*length/(s0+s1); - if (normalizedLength < 0.5) - nMinL++; - if (normalizedLength > 1.5) - nMaxL++; - } - m->end(it); -} - -int main(int argc, char** argv) -{ - /* INIT CALLS */ - MPI_Init(&argc, &argv); - PCU_Comm_Init(); - - if (argc < 2) { - if (PCU_Comm_Self() == 0) { - printf("USAGE: %s \n", argv[0]); - } - MPI_Finalize(); - exit(EXIT_FAILURE); - } - - const char* inFileName = argv[1]; - - gmi_cap_start(); - gmi_register_cap(); - - /* LOAD CAPSTONE MESH */ - // create an instance of the Capstone Module activating CREATE/CREATE/CREATE - // for the Geometry/Mesh/Attribution databases - const std::string gdbName("Geometry Database : SMLIB");// Switch Create with SMLIB for CAD - const std::string mdbName("Mesh Database : Create"); - const std::string adbName("Attribution Database : Create"); - - CapstoneModule cs("test", gdbName.c_str(), mdbName.c_str(), adbName.c_str()); - - GeometryDatabaseInterface *g = cs.get_geometry(); - MeshDatabaseInterface *m = cs.get_mesh(); - AppContext *c = cs.get_context(); - - PCU_ALWAYS_ASSERT(g); - PCU_ALWAYS_ASSERT(m); - PCU_ALWAYS_ASSERT(c); - - v_string filenames; - filenames.push_back(inFileName); - - M_GModel gmodel = cs.load_files(filenames); - - M_MModel mmodel; - // Pick the volume mesh model from associated mesh models to this geom model - std::vector mmodels; - MG_API_CALL(m, get_associated_mesh_models(gmodel, mmodels)); - PCU_ALWAYS_ASSERT(mmodels.size() == 1); - MG_API_CALL(m, set_current_model(mmodels[0])); - - /* SET THE ADJACENCIES */ - MG_API_CALL(m, set_adjacency_state(REGION2FACE| - REGION2EDGE| - REGION2VERTEX| - FACE2EDGE| - FACE2VERTEX)); - MG_API_CALL(m, set_reverse_states()); - MG_API_CALL(m, set_adjacency_scope(TOPO_EDGE, SCOPE_FULL)); - MG_API_CALL(m, set_adjacency_scope(TOPO_FACE, SCOPE_FULL)); - MG_API_CALL(m, compute_adjacency()); - - /* CONVERT THE MESH TO APF::MESH2 */ - apf::Mesh2* apfCapMesh = apf::createMesh(m, g); - - /* ADD A TEST FIELD TO THE MESH TO DEMONSTRATE SOLUTION TRANSFER */ - apf::Field* tf = apf::createFieldOn(apfCapMesh, "test_field", apf::VECTOR); - apf::MeshEntity* ent; - apf::MeshIterator* it = apfCapMesh->begin(0); - while( (ent = apfCapMesh->iterate(it)) ) { - apf::Vector3 p = ma::getPosition(apfCapMesh, ent); - double x = p[0]; - double y = p[1]; - double z = p[2]; - apf::Vector3 s(y, z, 2*x); - apf::setVector(tf, ent, 0, s); - } - apfCapMesh->end(it); - - /* WRITE THE BEFORE ADAPT MESH TO VTK USING APF VTK WRITER */ - apf::writeVtkFiles("before", apfCapMesh); - - - /* SIZE SETUP AND CALL ADAPT */ - - // setting the isotropic sizes - ma::IsotropicFunction* sf = new B737(apfCapMesh); - apf::Field* adaptSize = apf::createFieldOn(apfCapMesh, "adapt_size", apf::SCALAR); - apf::MeshEntity* v; - it = apfCapMesh->begin(0); - while( (v = apfCapMesh->iterate(it)) ) { - apf::setScalar(adaptSize, v, 0, sf->getValue(v)); - } - apfCapMesh->end(it); - apf::writeVtkFiles("size_before_grade", apfCapMesh); - - // grading the size field - gradeSize(apfCapMesh, adaptSize, 1.4); - apf::writeVtkFiles("size_after_grade", apfCapMesh); - - // adapt setup - ma::Input* in; - in = ma::makeAdvanced(ma::configure(apfCapMesh, adaptSize)); - in->shouldSnap = true; - in->shouldTransferParametric = true; - in->shouldFixShape = true; - in->shouldForceAdaptation = true; - if (apfCapMesh->getDimension() == 2) - in->goodQuality = 0.04; - else // 3D meshes - in->goodQuality = 0.027; // this is the mean-ratio cubed - in->maximumIterations = 10; - - ma::adaptVerbose(in, false); - - - /* CREATE A CONSTANT FIELD ON THE MESH WITH QUALITIES */ - apf::Field* qual = apf::createField(apfCapMesh, "quality", apf::SCALAR, apf::getConstant(2)); - apf::MeshEntity* f; - it = apfCapMesh->begin(2); - while ( (f = apfCapMesh->iterate(it)) ) { - double q = triQuality(apfCapMesh, f); - apf::setScalar(qual, f, 0, q); - } - apfCapMesh->end(it); - - - /* WRITE THE AFTER ADAPT MESH TO VTK USING APF VTK WRITER */ - apf::writeVtkFiles("after", apfCapMesh); - - - /* PRINTING OUT SOME STATES */ - size_t vCount = apfCapMesh->count(0); - size_t eCount = apfCapMesh->count(1); - size_t fCount = apfCapMesh->count(2); - - double minQ; - int nQ, nMinL, nMaxL; - - - stats(apfCapMesh, adaptSize, 0.2*0.2, minQ, nQ, nMinL, nMaxL); - - printf("vCount is %d\n", (int) vCount); - printf("eCount is %d\n", (int) eCount); - printf("fCount is %d\n", (int) fCount); - printf("minQ is %f\n", minQ); - printf("nQ is %d\n", nQ); - printf("nMinL is %d\n", nMinL); - printf("nMaxL is %d\n", nMaxL); - - /* PRINT ADAPTED MESH INFO */ - M_MModel mmdl; - m->get_current_model(mmdl); - std::string info; - m->print_info(mmdl, info); - - /* WRITE THE ADAPTED MESH IN NATIVE CREATE FORMAT */ - writeCre(cs, "after.cre"); - - /* CLEAN UPS */ - delete sf; - - /* EXIT CALLS */ - gmi_cap_stop(); - PCU_Comm_Free(); - MPI_Finalize(); -} From 4569131814e58bebbce203b12536ebbc0d74a4f0 Mon Sep 17 00:00:00 2001 From: Aiden Woodruff Date: Thu, 5 Sep 2024 14:40:25 -0400 Subject: [PATCH 48/55] Move some capstone_clis to test - Moved capStoneCheckParameterization because it's a good utility to confirm the curved mesh is correct. - Moved capStoneGeomTest because it can be used to examine a geometry. Signed-off-by: Aiden Woodruff --- capstone_clis/CMakeLists.txt | 2 -- test/CMakeLists.txt | 2 ++ .../capStoneCheckParametrization.cc => test/capCheckParam.cc | 0 capstone_clis/capStoneGeomTest.cc => test/capGeomTest.cc | 0 4 files changed, 2 insertions(+), 2 deletions(-) rename capstone_clis/capStoneCheckParametrization.cc => test/capCheckParam.cc (100%) rename capstone_clis/capStoneGeomTest.cc => test/capGeomTest.cc (100%) diff --git a/capstone_clis/CMakeLists.txt b/capstone_clis/CMakeLists.txt index 48bba44de..71205ba74 100644 --- a/capstone_clis/CMakeLists.txt +++ b/capstone_clis/CMakeLists.txt @@ -18,9 +18,7 @@ endfunction(test_exe_func) if(ENABLE_CAPSTONE) util_exe_func(capStoneAnisoAdapt capStoneAnisoAdapt.cc) util_exe_func(capStoneAnisoAdaptWing capStoneAnisoAdaptWing.cc) - util_exe_func(capStoneGeomTest capStoneGeomTest.cc) util_exe_func(capStoneAttachSolution capStoneAttachSolution.cc) - util_exe_func(capStoneCheckParametrization capStoneCheckParametrization.cc) endif() bob_end_subdir() diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index de36ea2f5..e0c303870 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -218,6 +218,8 @@ if(ENABLE_CAPSTONE) util_exe_func(cap_smooth cap_smooth.cc) endif() util_exe_func(cap2vtk cap2vtk.cc) + util_exe_func(capGeomTest capGeomTest.cc) + util_exe_func(capCheckParam capCheckParam.cc) endif() # send all the newly added utility executable targets diff --git a/capstone_clis/capStoneCheckParametrization.cc b/test/capCheckParam.cc similarity index 100% rename from capstone_clis/capStoneCheckParametrization.cc rename to test/capCheckParam.cc diff --git a/capstone_clis/capStoneGeomTest.cc b/test/capGeomTest.cc similarity index 100% rename from capstone_clis/capStoneGeomTest.cc rename to test/capGeomTest.cc From 5211c7504a62c53e207f2af11aad0df7196a8957 Mon Sep 17 00:00:00 2001 From: Aiden Woodruff Date: Thu, 5 Sep 2024 14:44:34 -0400 Subject: [PATCH 49/55] Remove capStoneAnisoAdaptWing - It is a copy of capStoneAnisoAdapt with a specific shock field. Signed-off-by: Aiden Woodruff --- capstone_clis/CMakeLists.txt | 1 - capstone_clis/capStoneAnisoAdaptWing.cc | 228 ------------------------ 2 files changed, 229 deletions(-) delete mode 100644 capstone_clis/capStoneAnisoAdaptWing.cc diff --git a/capstone_clis/CMakeLists.txt b/capstone_clis/CMakeLists.txt index 71205ba74..24e89dbbb 100644 --- a/capstone_clis/CMakeLists.txt +++ b/capstone_clis/CMakeLists.txt @@ -17,7 +17,6 @@ endfunction(test_exe_func) # Capstone utilities if(ENABLE_CAPSTONE) util_exe_func(capStoneAnisoAdapt capStoneAnisoAdapt.cc) - util_exe_func(capStoneAnisoAdaptWing capStoneAnisoAdaptWing.cc) util_exe_func(capStoneAttachSolution capStoneAttachSolution.cc) endif() diff --git a/capstone_clis/capStoneAnisoAdaptWing.cc b/capstone_clis/capStoneAnisoAdaptWing.cc deleted file mode 100644 index 5db6666be..000000000 --- a/capstone_clis/capStoneAnisoAdaptWing.cc +++ /dev/null @@ -1,228 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -#include "CapstoneModule.h" - -#include "capStoneSizeFields.h" - -using namespace CreateMG; -using namespace CreateMG::Attribution; -using namespace CreateMG::Mesh; -using namespace CreateMG::Geometry; - -/* class WingShock : public ma::AnisotropicFunction */ -/* { */ -/* public: */ -/* WingShock(ma::Mesh* m, double inFactor) */ -/* { */ -/* mesh = m; */ -/* factor = inFactor; */ -/* } */ -/* virtual void getValue(ma::Entity* v, ma::Matrix& R, ma::Vector& H) */ -/* { */ -/* ma::Vector p = ma::getPosition(mesh,v); */ -/* double x = p[0]; */ -/* double x0 = 0.5; */ -/* double planeSize = 0.03125; */ -/* double spanSize = 0.5; */ -/* double delta = 0.5; */ - -/* double beta = 0.3; */ -/* double x1 = 0.2; */ -/* double f = beta + x * (1. - beta) / x1; */ -/* double multipier = (x <= x1) ? 1.0 : f; */ - -/* double s0 = planeSize / factor; */ -/* double alpha = planeSize * (1. - 1./factor) / delta; */ -/* double hx = s0 + alpha * std::abs(x - x0); */ -/* double hy = spanSize; */ -/* double hz = spanSize; */ -/* hx *= multipier; */ -/* hy *= multipier; */ - -/* ma::Vector h; */ - -/* h = ma::Vector(hx, hy, hz); */ -/* /1* // principal directions *1/ */ -/* ma::Matrix r(1.0, 0.0, 0.0, */ -/* 0.0, 1.0, 0.0, */ -/* 0.0, 0.0, 1.0); */ -/* H = h; */ -/* R = r; */ -/* } */ -/* private: */ -/* ma::Mesh* mesh; */ -/* double factor; */ -/* }; */ - -void writeCre(CapstoneModule& cs, const std::string& vtkFileName) -{ - GeometryDatabaseInterface *gdbi = cs.get_geometry(); - MeshDatabaseInterface *mdbi = cs.get_mesh(); - AppContext *ctx = cs.get_context(); - - // Get the VTK writer. - Writer *creWriter = get_writer(ctx, "Create Native Writer"); - if (!creWriter) - error(HERE, ERR_GENERIC, "Could not find the CRE writer"); - - IdMapping idmapping; - std::vector mmodels; - M_GModel gmodel; - M_MModel mmodel; - gdbi->get_current_model(gmodel); - mdbi->get_current_model(mmodel); - mmodels.clear(); - mmodels.push_back(mmodel); - creWriter->write(ctx, gmodel, mmodels, vtkFileName.c_str(), idmapping); -} - -int main(int argc, char** argv) -{ - /* INIT CALLS */ - MPI_Init(&argc, &argv); - PCU_Comm_Init(); - - if (argc < 2) { - if (PCU_Comm_Self() == 0) { - printf("USAGE: %s \n", argv[0]); - } - MPI_Finalize(); - exit(EXIT_FAILURE); - } - - const char* createFileName = argv[1]; - - gmi_cap_start(); - gmi_register_cap(); - - /* LOAD CAPSTONE MESH */ - // create an instance of the Capstone Module activating CREATE/CREATE/CREATE - // for the Geometry/Mesh/Attribution databases - const std::string gdbName("Geometry Database : SMLIB");// Switch Create with SMLIB for CAD - const std::string mdbName("Mesh Database : Create"); - const std::string adbName("Attribution Database : Create"); - - CapstoneModule cs("test", gdbName.c_str(), mdbName.c_str(), adbName.c_str()); - - GeometryDatabaseInterface *g = cs.get_geometry(); - MeshDatabaseInterface *m = cs.get_mesh(); - AppContext *c = cs.get_context(); - - PCU_ALWAYS_ASSERT(g); - PCU_ALWAYS_ASSERT(m); - PCU_ALWAYS_ASSERT(c); - - v_string filenames; - filenames.push_back(createFileName); - - M_GModel gmodel = cs.load_files(filenames); - - M_MModel mmodel; - // Pick the volume mesh model from associated mesh models to this geom model - std::vector mmodels; - MG_API_CALL(m, get_associated_mesh_models(gmodel, mmodels)); - PCU_ALWAYS_ASSERT(mmodels.size() == 1); - MG_API_CALL(m, set_current_model(mmodels[0])); - - /* SET THE ADJACENCIES */ - MG_API_CALL(m, set_adjacency_state(REGION2FACE| - REGION2EDGE| - REGION2VERTEX| - FACE2EDGE| - FACE2VERTEX)); - MG_API_CALL(m, set_reverse_states()); - MG_API_CALL(m, set_adjacency_scope(TOPO_EDGE, SCOPE_FULL)); - MG_API_CALL(m, set_adjacency_scope(TOPO_FACE, SCOPE_FULL)); - MG_API_CALL(m, compute_adjacency()); - - /* CONVERT THE MESH TO APF::MESH2 */ - apf::Mesh2* apfCapMesh = apf::createMesh(m, g); - - /* ADD A TEST FIELD TO THE MESH TO DEMONSTRATE SOLUTION TRANSFER */ - apf::Field* tf = apf::createFieldOn(apfCapMesh, "test_field", apf::VECTOR); - apf::MeshEntity* ent; - apf::MeshIterator* it = apfCapMesh->begin(0); - while( (ent = apfCapMesh->iterate(it)) ) { - apf::Vector3 p = ma::getPosition(apfCapMesh, ent); - double x = p[0]; - double y = p[1]; - double z = p[2]; - apf::Vector3 s(y, z, 2*x); - apf::setVector(tf, ent, 0, s); - } - apfCapMesh->end(it); - - /* WRITE THE BEFORE ADAPT MESH TO VTK USING APF VTK WRITER */ - apf::writeVtkFiles("before", apfCapMesh); - - - /* SETUP AND CALL ADAPT */ - - // setting the aniso size field "scales" and "frames" - ma::IsotropicFunction* sf = 0; - sf = new Uniform(apfCapMesh, 50); - // make pumi fields that hold the "frames" and "scales" for anisotropic size fields - // here we are using user-defined size-fields. Usually, "frames" and "scales" come - // from a solution driven error estimation procedure - /* apf::Field* frameField = apf::createFieldOn(apfCapMesh, "adapt_frames", apf::MATRIX); */ - /* apf::Field* scaleField = apf::createFieldOn(apfCapMesh, "adapt_scales", apf::VECTOR); */ - apf::Field* scaleField = apf::createFieldOn(apfCapMesh, "adapt_scales", apf::SCALAR); - apf::MeshEntity* v; - it = apfCapMesh->begin(0); - while( (v = apfCapMesh->iterate(it)) ) { - /* apf::Vector3 s; */ - /* apf::Matrix3x3 f; */ - apf::setScalar(scaleField, v, 0, sf->getValue(v)); - } - apfCapMesh->end(it); - - // adapt setup - ma::Input* in; - in = ma::makeAdvanced(ma::configure(apfCapMesh, scaleField)); - /* in = ma::configure(apfCapMesh, scaleField, frameField); */ - in->shouldSnap = true; - in->shouldTransferParametric = true; - in->shouldFixShape = true; - in->shouldForceAdaptation = true; - if (apfCapMesh->getDimension() == 2) - in->goodQuality = 0.04; // this is mean-ratio squared - else // 3D meshes - in->goodQuality = 0.027; // this is the mean-ratio cubed - in->maximumIterations = 10; - - ma::adaptVerbose(in, false); - - /* WRITE THE AFTER ADAPT MESH TO VTK USING APF VTK WRITER */ - apf::writeVtkFiles("after", apfCapMesh); - - - /* PRINT ADAPTED MESH INFO */ - M_MModel mmdl; - m->get_current_model(mmdl); - std::string info; - m->print_info(mmdl, info); - - /* WRITE THE ADAPTED MESH IN NATIVE CREATE FORMAT */ - writeCre(cs, "after.cre"); - - /* CLEAN UPS */ - delete sf; - - /* EXIT CALLS */ - gmi_cap_stop(); - PCU_Comm_Free(); - MPI_Finalize(); -} From b9eada0d46d10bbfb1f4f51e6529a66ac13111e2 Mon Sep 17 00:00:00 2001 From: Aiden Woodruff Date: Fri, 6 Sep 2024 11:04:31 -0400 Subject: [PATCH 50/55] Move capStoneSizeFields to test - Remove capStoneAnisoAdapt which became capVol. - Move capStoneSizeFields.h to test/capVolSizeFields.h. - Update `#include` and CMake include_directories. Signed-off-by: Aiden Woodruff --- capstone_clis/CMakeLists.txt | 1 - capstone_clis/capStoneAnisoAdapt.cc | 202 ------------------ test/capVol.cc | 2 +- .../capVolSizeFields.h | 0 4 files changed, 1 insertion(+), 204 deletions(-) delete mode 100644 capstone_clis/capStoneAnisoAdapt.cc rename capstone_clis/capStoneSizeFields.h => test/capVolSizeFields.h (100%) diff --git a/capstone_clis/CMakeLists.txt b/capstone_clis/CMakeLists.txt index 24e89dbbb..0e7fc414d 100644 --- a/capstone_clis/CMakeLists.txt +++ b/capstone_clis/CMakeLists.txt @@ -16,7 +16,6 @@ endfunction(test_exe_func) # Capstone utilities if(ENABLE_CAPSTONE) - util_exe_func(capStoneAnisoAdapt capStoneAnisoAdapt.cc) util_exe_func(capStoneAttachSolution capStoneAttachSolution.cc) endif() diff --git a/capstone_clis/capStoneAnisoAdapt.cc b/capstone_clis/capStoneAnisoAdapt.cc deleted file mode 100644 index c6d71cff9..000000000 --- a/capstone_clis/capStoneAnisoAdapt.cc +++ /dev/null @@ -1,202 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -#include "CapstoneModule.h" - -using namespace CreateMG; -using namespace CreateMG::Attribution; -using namespace CreateMG::Mesh; -using namespace CreateMG::Geometry; - -#include "capStoneSizeFields.h" - - -void writeCre(CapstoneModule& cs, const std::string& vtkFileName) -{ - GeometryDatabaseInterface *gdbi = cs.get_geometry(); - MeshDatabaseInterface *mdbi = cs.get_mesh(); - AppContext *ctx = cs.get_context(); - - // Get the VTK writer. - Writer *creWriter = get_writer(ctx, "Create Native Writer"); - if (!creWriter) - error(HERE, ERR_GENERIC, "Could not find the CRE writer"); - - IdMapping idmapping; - std::vector mmodels; - M_GModel gmodel; - M_MModel mmodel; - gdbi->get_current_model(gmodel); - mdbi->get_current_model(mmodel); - mmodels.clear(); - mmodels.push_back(mmodel); - creWriter->write(ctx, gmodel, mmodels, vtkFileName.c_str(), idmapping); -} - -int main(int argc, char** argv) -{ - /* INIT CALLS */ - MPI_Init(&argc, &argv); - PCU_Comm_Init(); - - if (argc < 3) { - if (PCU_Comm_Self() == 0) { - printf("USAGE: %s \n", argv[0]); - printf("Size-fields:\n"); - printf("%d, for uniform anisotropic size-field\n", 1); - printf("%d, for wing-shock size-field\n", 2); - printf("%d, for cube-shock size-field\n", 3); - } - MPI_Finalize(); - exit(EXIT_FAILURE); - } - - const char* createFileName = argv[1]; - int mode = atoi(argv[2]); - - gmi_cap_start(); - gmi_register_cap(); - - /* LOAD CAPSTONE MESH */ - // create an instance of the Capstone Module activating CREATE/CREATE/CREATE - // for the Geometry/Mesh/Attribution databases - const std::string gdbName("Geometry Database : SMLIB");// Switch Create with SMLIB for CAD - const std::string mdbName("Mesh Database : Create"); - const std::string adbName("Attribution Database : Create"); - - CapstoneModule cs("test", gdbName.c_str(), mdbName.c_str(), adbName.c_str()); - - GeometryDatabaseInterface *g = cs.get_geometry(); - MeshDatabaseInterface *m = cs.get_mesh(); - AppContext *c = cs.get_context(); - - PCU_ALWAYS_ASSERT(g); - PCU_ALWAYS_ASSERT(m); - PCU_ALWAYS_ASSERT(c); - - v_string filenames; - filenames.push_back(createFileName); - - M_GModel gmodel = cs.load_files(filenames); - - M_MModel mmodel; - // Pick the volume mesh model from associated mesh models to this geom model - std::vector mmodels; - MG_API_CALL(m, get_associated_mesh_models(gmodel, mmodels)); - PCU_ALWAYS_ASSERT(mmodels.size() == 1); - MG_API_CALL(m, set_current_model(mmodels[0])); - - /* SET THE ADJACENCIES */ - MG_API_CALL(m, set_adjacency_state(REGION2FACE| - REGION2EDGE| - REGION2VERTEX| - FACE2EDGE| - FACE2VERTEX)); - MG_API_CALL(m, set_reverse_states()); - MG_API_CALL(m, set_adjacency_scope(TOPO_EDGE, SCOPE_FULL)); - MG_API_CALL(m, set_adjacency_scope(TOPO_FACE, SCOPE_FULL)); - MG_API_CALL(m, compute_adjacency()); - - /* CONVERT THE MESH TO APF::MESH2 */ - apf::Mesh2* apfCapMesh = apf::createMesh(m, g); - - /* ADD A TEST FIELD TO THE MESH TO DEMONSTRATE SOLUTION TRANSFER */ - apf::Field* tf = apf::createFieldOn(apfCapMesh, "test_field", apf::VECTOR); - apf::MeshEntity* ent; - apf::MeshIterator* it = apfCapMesh->begin(0); - while( (ent = apfCapMesh->iterate(it)) ) { - apf::Vector3 p = ma::getPosition(apfCapMesh, ent); - double x = p[0]; - double y = p[1]; - double z = p[2]; - apf::Vector3 s(y, z, 2*x); - apf::setVector(tf, ent, 0, s); - } - apfCapMesh->end(it); - - /* WRITE THE BEFORE ADAPT MESH TO VTK USING APF VTK WRITER */ - apf::writeVtkFiles("before", apfCapMesh); - - - /* SETUP AND CALL ADAPT */ - ma::Input* in; - - // choose a size field here - ma::AnisotropicFunction* sf = 0; - switch (mode) { - case 1: - sf = new UniformAniso(apfCapMesh); - break; - case 2: - sf = new WingShock(apfCapMesh, 50); - break; - case 3: - sf = new Shock(apfCapMesh); - break; - } - - // make pumi fields that hold the "frames" and "scales" for anisotropic size fields - // here we are using user-defined size-fields. Usually, "frames" and "scales" come - // from a solution driven error estimation procedure - apf::Field* frameField = apf::createFieldOn(apfCapMesh, "adapt_frames", apf::MATRIX); - apf::Field* scaleField = apf::createFieldOn(apfCapMesh, "adapt_scales", apf::VECTOR); - - apf::MeshEntity* v; - it = apfCapMesh->begin(0); - while( (v = apfCapMesh->iterate(it)) ) { - apf::Vector3 s; - apf::Matrix3x3 f; - sf->getValue(v, f, s); - apf::setVector(scaleField, v, 0, s); - apf::setMatrix(frameField, v, 0, f); - } - apfCapMesh->end(it); - - in = ma::makeAdvanced(ma::configure(apfCapMesh, scaleField, frameField)); - in->shouldSnap = true; - in->shouldTransferParametric = true; - in->shouldFixShape = true; - in->shouldForceAdaptation = true; - if (apfCapMesh->getDimension() == 2) - in->goodQuality = 0.04; // this is mean-ratio squared - else // 3D meshes - in->goodQuality = 0.027; // this is the mean-ratio cubed - in->maximumIterations = 10; - - ma::adaptVerbose(in, false); - - /* apfCapMesh->verify(); */ - - /* WRITE THE AFTER ADAPT MESH TO VTK USING APF VTK WRITER */ - apf::writeVtkFiles("after", apfCapMesh); - - - /* PRINT ADAPTED MESH INFO */ - M_MModel mmdl; - m->get_current_model(mmdl); - std::string info; - m->print_info(mmdl, info); - - /* WRITE THE ADAPTED MESH IN NATIVE CREATE FORMAT */ - writeCre(cs, "after.cre"); - - /* CLEAN UPS */ - delete sf; - - /* EXIT CALLS */ - gmi_cap_stop(); - PCU_Comm_Free(); - MPI_Finalize(); -} diff --git a/test/capVol.cc b/test/capVol.cc index a9149c585..8bd064686 100644 --- a/test/capVol.cc +++ b/test/capVol.cc @@ -24,7 +24,7 @@ using namespace CreateMG::Attribution; using namespace CreateMG::Mesh; using namespace CreateMG::Geometry; -#include "capStoneSizeFields.h" +#include "capVolSizeFields.h" namespace { diff --git a/capstone_clis/capStoneSizeFields.h b/test/capVolSizeFields.h similarity index 100% rename from capstone_clis/capStoneSizeFields.h rename to test/capVolSizeFields.h From d3606ced62b030b459073092b56e175f0d0bd6f4 Mon Sep 17 00:00:00 2001 From: Aiden Woodruff Date: Tue, 29 Oct 2024 20:31:33 -0400 Subject: [PATCH 51/55] Remove capStoneAttachSolution.cc - Remove capstone_clis CMake file. - Remove capStoneAttachSolution.cc. I thought robin-data would be the input but couldn't figure out how to use this test. Signed-off-by: Aiden Woodruff --- CMakeLists.txt | 1 - capstone_clis/CMakeLists.txt | 22 - capstone_clis/capStoneAttachSolution.cc | 1426 ----------------------- 3 files changed, 1449 deletions(-) delete mode 100644 capstone_clis/CMakeLists.txt delete mode 100644 capstone_clis/capStoneAttachSolution.cc diff --git a/CMakeLists.txt b/CMakeLists.txt index 70fba0900..831af6895 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -197,7 +197,6 @@ scorec_export_library(core) if(BUILD_EXES) add_subdirectory(test) - add_subdirectory(capstone_clis) endif() if(PUMI_PYTHON_INTERFACE) diff --git a/capstone_clis/CMakeLists.txt b/capstone_clis/CMakeLists.txt deleted file mode 100644 index 0e7fc414d..000000000 --- a/capstone_clis/CMakeLists.txt +++ /dev/null @@ -1,22 +0,0 @@ -function(util_exe_func exename srcname) - add_executable(${exename} ${srcname}) - target_link_libraries(${exename} core apf_cap) - bob_export_target(${exename}) - bob_end_subdir() -endfunction(util_exe_func) - -function(test_exe_func exename srcname) - if(IS_TESTING) - add_executable(${exename} ${srcname}) - else() - add_executable(${exename} EXCLUDE_FROM_ALL ${srcname}) - endif() - target_link_libraries(${exename} core) -endfunction(test_exe_func) - -# Capstone utilities -if(ENABLE_CAPSTONE) - util_exe_func(capStoneAttachSolution capStoneAttachSolution.cc) -endif() - -bob_end_subdir() diff --git a/capstone_clis/capStoneAttachSolution.cc b/capstone_clis/capStoneAttachSolution.cc deleted file mode 100644 index 28b850a78..000000000 --- a/capstone_clis/capStoneAttachSolution.cc +++ /dev/null @@ -1,1426 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -#include "CapstoneModule.h" -#include "CreateMG_Framework_Core.h" -#include "CreateMG_Framework_Analysis.h" -#include "CreateMG_Framework_Application.h" -#include "CreateMG_Framework_Attributes.h" -#include "CreateMG_Framework_Core.h" -#include "CreateMG_Framework_Geometry.h" -#include "CreateMG_Framework_Mesh.h" - -using namespace CreateMG; -using namespace CreateMG::Attribution; -using namespace CreateMG::Mesh; -using namespace CreateMG::Geometry; - - -typedef std::vector row; - -struct FieldOfInterest{ - FieldOfInterest() - { - lambda_max = 0.0; - h_lambdamax = 0.0; - whichLayerHasLambdaMax = NULL; - } - double lambda_max; - double h_lambdamax; - apf::Field* lambdaMaxField; - apf::Field* lambdaStrandMax; - apf::Field* sizeField; - apf::Field* whichLayerHasLambdaMax; - double lambda_cutoff() - { - return lambda_max*1e-10; - } -}; - -std::vector readTable(const char* name); - -std::vector extractSurfaceData(const std::vector &table, - const int strandSize, const int col); - -apf::Mesh2* createVolumeMesh(apf::Mesh2* m, const std::vector &t, int s, - std::vector > &surfToStrandMap); - -apf::Field* addScalarField(apf::Mesh2* m, const std::vector t, const char* name, int col, int strandSize); - -apf::Field* addVector3Field(apf::Mesh2* m, const std::vector t, const char* name, - int col0, int col1, int col2, int strandSize); - -void writeCre(CapstoneModule& cs, const std::string& fileName); - -void writeMdsMesh(apf::Mesh2* m, const char* name, const char* fieldName); - -void computeSizeDistribution(apf::Mesh2* m, int factor, - std::vector& binCount, std::vector& binArea); - - -void adjustRefinementLevel(apf::Mesh2* m, apf::Field* finalSize, - apf::Field* currentSize, int maxLevel); - -struct SortingStruct -{ - apf::Vector3 v; - double wm; - bool operator<(const SortingStruct &other) const - { - return wm < other.wm; - } -}; - -//gradation routines from Proteus - -int gradeSizeModify(apf::Mesh* m, apf::Field* size_iso,double gradingFactor, - double size[2], apf::Adjacent edgAdjVert, - apf::Adjacent vertAdjEdg, - std::queue &markedEdges, - apf::MeshTag* isMarked, - int fieldType, - int vecPos, //which idx of sizeVec to modify - int idxFlag) - -//General function to actually modify sizes -{ - (void)vecPos; - //Determine a switching scheme depending on which vertex needs a modification - int idx1,idx2; - if(idxFlag == 0){ - idx1=0; - idx2=1; - } - else{ - idx1=1; - idx2 = 0; - } - - int marker[3] = {0,1,0}; - double marginVal = 0.01; - int needsParallel=0; - - if(fieldType == apf::SCALAR){ - //apf::Field* size_iso = m->findField("size"); - - if(size[idx1]>(gradingFactor*size[idx2])*(1+marginVal)) - { - if(m->isOwned(edgAdjVert[idx1])) - { - size[idx1] = gradingFactor*size[idx2]; - apf::setScalar(size_iso,edgAdjVert[idx1],0,size[idx1]); - m->getAdjacent(edgAdjVert[idx1], 1, vertAdjEdg); - for (std::size_t i=0; igetIntTag(vertAdjEdg[i],isMarked,&marker[2]); - //if edge is not already marked - if(!marker[2]){ - m->setIntTag(vertAdjEdg[i],isMarked,&marker[1]); - markedEdges.push(vertAdjEdg[i]); - } - } - } //end isOwned - else - { //Pack information to owning processor - needsParallel=1; - apf::Copies remotes; - m->getRemotes(edgAdjVert[idx1],remotes); - double newSize = gradingFactor*size[idx2]; - int owningPart=m->getOwner(edgAdjVert[idx1]); - PCU_COMM_PACK(owningPart, remotes[owningPart]); - PCU_COMM_PACK(owningPart,newSize); - } - } - - }//end if apf::SCALAR - return needsParallel; -} - -void markEdgesInitial(apf::Mesh* m, apf::Field* size_iso, std::queue &markedEdges,double gradingFactor) -//Function used to initially determine which edges need to be considered for gradation -{ - //marker structure for 0) not marked 1) marked 2)storage - int marker[3] = {0,1,0}; - - double size[2]; - apf::MeshTag* isMarked = m->findTag("isMarked"); -// apf::Field* size_iso = m->findField("size"); - apf::Adjacent edgAdjVert; - apf::MeshEntity* edge; - apf::MeshIterator* it = m->begin(1); - while((edge=m->iterate(it))){ - m->getAdjacent(edge, 0, edgAdjVert); - for (std::size_t i=0; i < edgAdjVert.getSize(); ++i){ - size[i]=apf::getScalar(size_iso,edgAdjVert[i],0); - } - if( (size[0] > gradingFactor*size[1]) || (size[1] > gradingFactor*size[0]) ){ - //add edge to a queue - markedEdges.push(edge); - //tag edge to indicate that it is part of queue - m->setIntTag(edge,isMarked,&marker[1]); - } - else{ - m->setIntTag(edge,isMarked,&marker[0]); - } - } - m->end(it); -} - -int serialGradation(apf::Mesh* m,apf::Field* size_iso, std::queue &markedEdges,double gradingFactor) -//Function used loop over the mesh edge queue for gradation and modify the sizes -{ - double size[2]; - //marker structure for 0) not marked 1) marked 2)storage - int marker[3] = {0,1,0}; - apf::MeshTag* isMarked = m->findTag("isMarked"); -// apf::Field* size_iso = m->findField("size"); - apf::Adjacent edgAdjVert; - apf::Adjacent vertAdjEdg; - apf::MeshEntity* edge; - int needsParallel=0; - - //perform serial gradation while packing necessary info for parallel - while(!markedEdges.empty()){ - edge = markedEdges.front(); - m->getAdjacent(edge, 0, edgAdjVert); - for (std::size_t i=0; i < edgAdjVert.getSize(); ++i){ - size[i] = apf::getScalar(size_iso,edgAdjVert[i],0); - } - - needsParallel+=gradeSizeModify(m,size_iso, gradingFactor, size, edgAdjVert, - vertAdjEdg, markedEdges, isMarked, apf::SCALAR,0, 0); - needsParallel+=gradeSizeModify(m,size_iso, gradingFactor, size, edgAdjVert, - vertAdjEdg, markedEdges, isMarked, apf::SCALAR,0, 1); - - m->setIntTag(edge,isMarked,&marker[0]); - markedEdges.pop(); - } - return needsParallel; -} - -int gradeMesh(apf::Mesh* m,apf::Field* size_iso) -//Function to grade isotropic mesh through comparison of edge vertex size ratios -//This implementation accounts for parallel meshes as well -//First do serial gradation. -//If a shared entity has its size modified, then send new size to owning copy. -//After full loop over entities, have owning copy take minimum of all sizes received -//Flag adjacent entities to owning copy. -//Communicate to remote copies that a size was modified, and flag adjacent edges to remote copies for further gradation -{ - //unique to this code - //apf::Field* size_iso = m->findField("size"); - double gradingFactor = 1.2; - // - - apf::MeshEntity* edge; - apf::Adjacent edgAdjVert; - apf::Adjacent vertAdjEdg; - std::queue markedEdges; - apf::MeshTag* isMarked = m->createIntTag("isMarked",1); - - //marker structure for 0) not marked 1) marked 2)storage - int marker[3] = {0,1,0}; - - apf::MeshIterator* it; - markEdgesInitial(m,size_iso,markedEdges,gradingFactor); - - int needsParallel=1; - while(needsParallel) - { - PCU_Comm_Begin(); - needsParallel = serialGradation(m,size_iso,markedEdges,gradingFactor); - - PCU_Add_Ints(&needsParallel,1); - PCU_Comm_Send(); - - apf::MeshEntity* ent; - double receivedSize; - double currentSize; - double newSize; - - //Need a container to get all entitites that need to be updated on remotes - std::queue updateRemoteVertices; - - apf::Copies remotes; - //owning copies are receiving - while(PCU_Comm_Receive()) - { - PCU_COMM_UNPACK(ent); - PCU_COMM_UNPACK(receivedSize); - - if(!m->isOwned(ent)){ - std::cout<<"THERE WAS AN ERROR"<getAdjacent(ent, 1, vertAdjEdg); - for (std::size_t i=0; igetIntTag(vertAdjEdg[i],isMarked,&marker[2]); - if(!marker[2]) - { - markedEdges.push(edge); - //tag edge to indicate that it is part of queue - m->setIntTag(edge,isMarked,&marker[1]); - } - } - updateRemoteVertices.push(ent); - } - - PCU_Comm_Begin(); - - while(!updateRemoteVertices.empty()) - { - ent = updateRemoteVertices.front(); - //get remote copies and send updated mesh sizes - m->getRemotes(ent,remotes); - currentSize = apf::getScalar(size_iso,ent,0); - for(apf::Copies::iterator iter=remotes.begin(); iter!=remotes.end();++iter) - { - PCU_COMM_PACK(iter->first, iter->second); - } - updateRemoteVertices.pop(); - } - - PCU_Comm_Send(); - //while remote copies are receiving - while(PCU_Comm_Receive()) - { - //unpack - PCU_COMM_UNPACK(ent); - //PCU_COMM_UNPACK(receivedSize); - assert(!m->isOwned(ent)); - - if(m->isOwned(ent)){ - std::cout<<"Problem occurred\n"; - std::exit(1); - } - - //add adjacent edges into Q - m->getAdjacent(ent, 1, vertAdjEdg); - for (std::size_t i=0; igetIntTag(vertAdjEdg[i],isMarked,&marker[2]); - if(!marker[2]) - { - markedEdges.push(edge); - //tag edge to indicate that it is part of queue - m->setIntTag(edge,isMarked,&marker[1]); - } - } - } - apf::synchronize(size_iso); - - } //end outer while - - //Cleanup of edge marker field - it = m->begin(1); - while((edge=m->iterate(it))){ - m->removeTag(edge,isMarked); - } - m->end(it); - m->destroyTag(isMarked); - - //apf::synchronize(size_iso); - return needsParallel; -} - -//Eigenvalue routines for volume and surface meshes -// - //function to get volume-based eigenvalues -//apf::Field* getLambdaMax(mesh,hessianField,) -void getLambdaMax(apf::Mesh* mesh,apf::Field* hessianField,apf::Field* lambdaMaxField, apf::Field* lambdaMaxEVecField = NULL) -{ - apf::MeshEntity* vert; - apf::MeshIterator* it; - it = mesh->begin(0); - //apf::Field* lambdaMaxField = apf::createLagrangeField(mesh,"lambdaMax",apf::SCALAR,1); - while( (vert = mesh->iterate(it)) ) - { - apf::Matrix3x3 metric; - apf::getMatrix(hessianField, vert, 0, metric); - apf::Vector3 eigenVectors[3]; - double eigenValues[3]; - metric = (metric+apf::transpose(metric))/2.0; - apf::eigen(metric, eigenVectors, eigenValues); - - // Sort the eigenvalues and corresponding vectors - // Larger eigenvalues means a need for a finer mesh - SortingStruct ssa[3]; - for (int i = 0; i < 3; ++i) - { - ssa[i].v = eigenVectors[i]; - ssa[i].wm = std::fabs(eigenValues[i]); - } - std::sort(ssa, ssa + 3); - - assert(ssa[2].wm >= ssa[1].wm); - assert(ssa[1].wm >= ssa[0].wm); - apf::setScalar(lambdaMaxField,vert,0,ssa[2].wm); - if (lambdaMaxEVecField) - { - apf::setVector(lambdaMaxEVecField,vert,0,ssa[2].v); - } - } - mesh->end(it); -} - -void getVolMaxPair(apf::Mesh* mesh,std::vector > surfToStrandMap, apf::Field* lambdaMaxField,apf::Field* lambdaStrandMax, apf::Field* currentSize,double &lambda_max,double &h_lambdamax, apf::Field* whichLayerHasLambdaMax = NULL) -{ - apf::MeshIterator* it = mesh->begin(0); - apf::MeshEntity* vert, *vertVol; - int counter = 0; - while( (vert = mesh->iterate(it)) ) - { - //the goal of this loop is to identify lambda max global, find corresponding surface h-max global, and then set the surface lambda field - int strandSize = surfToStrandMap[counter].size(); - for(int i=0; iend(it); -} - -void getSurfMaxPair(apf::Mesh* mesh,apf::Field* lambdaMaxField,apf::Field* currentSize,double &lambda_max,double &h_lambdamax) -{ - apf::MeshIterator* it = mesh->begin(0); - apf::MeshEntity* vert; - while( (vert = mesh->iterate(it)) ) - { - if(lambda_max < apf::getScalar(lambdaMaxField,vert,0)) - { - lambda_max = apf::getScalar(lambdaMaxField,vert,0); - h_lambdamax = apf::getScalar(currentSize,vert,0); - } - } - mesh->end(it); -} - -void setSizeField(apf::Mesh* mesh, apf::Field* lambdaMaxField,apf::Field* sizeField,double lambda_max,double lambda_cutoff, double h_lambdamax,double h_global,double factor) -{ - apf::MeshIterator* it=mesh->begin(0); - apf::MeshEntity* vert; - int counter3 = 0; - double h_special = -1; - while( (vert = mesh->iterate(it)) ) - { - double h_v = h_special; //set default size as user specified input - double lambda_vert = apf::getScalar(lambdaMaxField,vert,0); - if(lambda_vert > lambda_cutoff) - { - h_v = sqrt(lambda_max/lambda_vert/factor)*h_lambdamax; - } - else - counter3++; - //h_global is user-specified max size - if(h_v > h_global) //maximum value for size field - h_v = h_global; - apf::setScalar(sizeField,vert,0,h_v); - } - mesh->end(it); - -} - -void setSizeFieldAlt(apf::Mesh* mesh, apf::Field* lambdaMaxField,apf::Field* sizeField,apf::Field* currentSize,double lambda_max,double lambda_cutoff,double h_global,double factor) -{ - apf::MeshIterator* it=mesh->begin(0); - apf::MeshEntity* vert; - int counter3 = 0; - double h_special = -1; - while( (vert = mesh->iterate(it)) ) - { - double h_v = h_special; //set default size as user specified input - double lambda_vert = apf::getScalar(lambdaMaxField,vert,0); - double h_v_curr = apf::getScalar(currentSize,vert,0); - if(lambda_vert > lambda_cutoff) - { - h_v = sqrt(lambda_max/lambda_vert/factor)*h_v_curr; - } - else - { - h_v = h_global; - } - //h_global is user-specified max size - if(h_v > h_global) //maximum value for size field - h_v = h_global; - apf::setScalar(sizeField,vert,0,h_v); - } - mesh->end(it); - -} - -void setSizeFieldAlt2(apf::Mesh* mesh, apf::Field* lambdaMaxField,apf::Field* sizeField,apf::Field* currentSize,double lambda_cutoff,double h_global,double factor) -{ - apf::MeshIterator* it=mesh->begin(0); - apf::MeshEntity* vert; - int counter3 = 0; - double h_special = -1; - while( (vert = mesh->iterate(it)) ) - { - double h_v = h_special; //set default size as user specified input - double lambda_vert = apf::getScalar(lambdaMaxField,vert,0); - double h_v_curr = apf::getScalar(currentSize,vert,0); - if(lambda_vert > lambda_cutoff) - { - h_v = h_v_curr / factor; - } - else - { - h_v = h_global; - } - //h_global is user-specified max size - if(h_v > h_global) //maximum value for size field - h_v = h_global; - apf::setScalar(sizeField,vert,0,h_v); - } - mesh->end(it); - -} - -static std::vector decodeBitFields(const char* bitFields) -{ - std::vector res; - res.resize(strlen(bitFields)); - printf("bitfields length is %zd\n", strlen(bitFields)); - PCU_ALWAYS_ASSERT_VERBOSE(strlen(bitFields) == 4, "bitfields length needs to be 4"); - for (unsigned i = 0; i < strlen(bitFields); i++) { - if (bitFields[i] == '0') - res[i] = false; - else if (bitFields[i] == '1') - res[i] = true; - else - PCU_ALWAYS_ASSERT_VERBOSE(0, "Bit fields need to be 0 or 1"); - } - PCU_ALWAYS_ASSERT_VERBOSE((bitFields[2] == '0') || (bitFields[3] == '0'), - "Both bit field 2 and bit field 3 cannot be 1"); - return res; -} - -void isotropicIntersect(apf::Mesh* m, std::queue sizeFieldList, - const std::vector& userInput, apf::Field* finalSizeField, - apf::Field* finalChoiceField) -{ - // std::vector userInput = decodeBitFields(bitFields); - PCU_ALWAYS_ASSERT(userInput.size() == sizeFieldList.size()); - apf::MeshEntity *vert; - - apf::Field *field = sizeFieldList.front(); - apf::MeshIterator *it = m->begin(0); - double largeNum = 1.e16; - while( (vert = m->iterate(it)) ) - { - apf::setScalar(finalSizeField,vert,0,largeNum); - apf::setScalar(finalChoiceField,vert,0,-1); - } - m->end(it); - int choiceIdx = 0; //assumes the initial field was set to choice 0 - while(!sizeFieldList.empty()) - { - if (userInput[choiceIdx]) { - field = sizeFieldList.front(); - apf::MeshIterator *it = m->begin(0); - while( (vert = m->iterate(it)) ) - { - double value1 = apf::getScalar(finalSizeField,vert,0); - double value2 = apf::getScalar(field,vert,0); - double minValue = std::min(value1,value2); - apf::setScalar(finalSizeField,vert,0,minValue); - if(value1 > value2) - { - apf::setScalar(finalChoiceField,vert,0,choiceIdx); - } - } - m->end(it); - } - sizeFieldList.pop(); - choiceIdx++; - } -} - - -// - -int main(int argc, char** argv) -{ - MPI_Init(&argc, &argv); - PCU_Comm_Init(); - lion_set_verbosity(1); - double initialTime = PCU_Time(); - - if (argc != 9) { - if(0==PCU_Comm_Self()) { - std::cerr << "usage: " << argv[0] - << " \n"; - std::cerr << "*target field(s) is a bit string to select which field(s) are used for error estimation\n"; - std::cerr << "1st bit --- pressure\n"; - std::cerr << "2nd bit --- skin friction\n"; - } - return EXIT_FAILURE; - } - - - gmi_register_mesh(); - gmi_register_null(); - - const char* creFileName = argv[1]; - const char* dataFileName = argv[2]; - const char* bitFields = argv[3]; - const int strandSize = atoi(argv[4]); - double h_global = atof(argv[5]); - double factor = atof(argv[6]); - const int maxLevel = atoi(argv[7]); - const int nIgnoredLayers = atoi(argv[8]); - - // Some input validation - std::vector userInputFields = decodeBitFields(bitFields); - - // load capstone mesh - // create an instance of the Capstone Module activating CREATE/CREATE/CREATE - // for the Geometry/Mesh/Attribution databases - /* const std::string gdbName("Geometry Database : Create");// Switch Create with SMLIB for CAD */ - const std::string gdbName("Geometry Database : SMLIB");// Switch Create with SMLIB for CAD - const std::string mdbName("Mesh Database : Create"); - const std::string adbName("Attribution Database : Create"); - - CapstoneModule cs("the_module", gdbName.c_str(), mdbName.c_str(), adbName.c_str()); - - GeometryDatabaseInterface *g = cs.get_geometry(); - MeshDatabaseInterface *m = cs.get_mesh(); - AppContext *c = cs.get_context(); - - - PCU_ALWAYS_ASSERT(g); - PCU_ALWAYS_ASSERT(m); - PCU_ALWAYS_ASSERT(c); - - v_string filenames; - filenames.push_back(creFileName); - - M_GModel gmodel = cs.load_files(filenames); - - int numbreps = 0; - MG_CALL(g->get_num_breps(numbreps)); - std::cout << "number of b reps is " << numbreps << std::endl; - if(numbreps == 0) - error(HERE, ERR_INVALID_INPUT, "Model is empty"); - - M_MModel mmodel; - // Pick the volume mesh model from associated mesh models to this geom model - std::vector mmodels; - MG_API_CALL(m, get_associated_mesh_models(gmodel, mmodels)); - for(std::size_t i = 0; i < mmodels.size(); ++i) - { - M_MModel ammodel = mmodels[i]; - std::size_t numregs = 0; - std::size_t numfaces = 0; - std::size_t numedges = 0; - std::size_t numverts = 0; - MG_API_CALL(m, set_current_model(ammodel)); - MG_API_CALL(m, get_num_topos(TOPO_REGION, numregs)); - MG_API_CALL(m, get_num_topos(TOPO_FACE, numfaces)); - MG_API_CALL(m, get_num_topos(TOPO_EDGE, numedges)); - MG_API_CALL(m, get_num_topos(TOPO_VERTEX, numverts)); - std::cout << "num regions is " << numregs << std::endl; - std::cout << "num faces is " << numfaces << std::endl; - std::cout << "num edges is " << numedges << std::endl; - std::cout << "num verts is " << numverts << std::endl; - std::cout << "-----------" << std::endl; - if(numregs > 0) - { - mmodel = ammodel; - break; - } - } - - /* SET THE ADJACENCIES */ - MG_API_CALL(m, set_adjacency_state(REGION2FACE| - REGION2EDGE| - REGION2VERTEX| - FACE2EDGE| - FACE2VERTEX)); - MG_API_CALL(m, set_reverse_states()); - MG_API_CALL(m, set_adjacency_scope(TOPO_EDGE, SCOPE_FULL)); - MG_API_CALL(m, set_adjacency_scope(TOPO_FACE, SCOPE_FULL)); - MG_API_CALL(m, compute_adjacency()); - - - gmi_cap_start(); - gmi_register_cap(); - - printf("---- CapStone Mesh Loaded. \n"); - - // read the data into a vector array for now - printf("\n---- Reading Strand Data. \n"); - std::vector table = readTable(dataFileName); - printf("---- Reading Strand Data: Done. \n"); - - // create the mesh object (this one is CapStone underneath) - printf("\n---- Creating Mesh Wrapper Object. \n"); - apf::Mesh2* mesh = apf::createMesh(m,g); - printf("---- Creating Mesh Wrapper Object: Done. \n"); - - // make the volume mesh (this one is MDS underneath) - printf("\n---- Creating Volume Mesh. \n"); - // create an empty array with the correct sizes to hold the surface 2 strand map - std::vector > surfToStrandMap(mesh->count(0), - std::vector(strandSize, NULL)); - apf::Mesh2* volMesh = createVolumeMesh(mesh, table, strandSize, surfToStrandMap); - printf("---- Creating Volume Mesh: Done. \n"); - - // get all fields and add them to the mesh - printf("\n---- Adding Fields to Volume Mesh. \n"); - apf::Field* rhoField = addScalarField(volMesh, table, "rho", 3, strandSize); - apf::Field* rho_uvwField = addVector3Field(volMesh, table, "rho_uvw", 4, 5, 6, strandSize); - apf::Field* eField = addScalarField(volMesh, table, "e", 7, strandSize); - apf::Field* nuField = addScalarField(volMesh, table, "nu", 8, strandSize); - printf("---- Adding Fields to Volume Mesh: Done. \n"); - - printf("\n---- Printing Volume/Strand Mesh Stats. \n"); - printf("number of mesh verts: %zu\n", volMesh->count(0)); - printf("number of mesh regions(hexes): %zu\n", volMesh->count(3)); - printf("---- Printing Volume/Strand Mesh Stats: Done. \n"); - - double constructionTime = PCU_Time(); - std::cout<<"TIMER: Finished converting capstone mesh to volume mesh "<begin(0); - while( (vert = volMesh->iterate(it)) ) - { - double rhoVal = apf::getScalar(rhoField,vert,0); - apf::Vector3 rhoVelocity; - apf::getVector(rho_uvwField,vert,0,rhoVelocity); - double speed = rhoVelocity.getLength()/rhoVal; - apf::setScalar(speedField,vert,0,speed); - } - volMesh->end(it); - // Also get its Hessian - apf::Field* gradSpeedField = apf::recoverGradientByVolume(speedField); - apf::Field* hessianSpeedField = apf::recoverGradientByVolume(gradSpeedField); - //End getSpeed - - apf::Field* lmaxHSpeedH2Field = apf::createLagrangeField(volMesh,"lmax_hess_speed_x_h2",apf::SCALAR,1); - apf::Field* lhSpeedDotNormal = apf::createLagrangeField(volMesh,"lhSpeedDotNormal",apf::SCALAR,1); - - //get eigenvalues in the volume mesh - getLambdaMax(volMesh,hessianSpeedField,speedLambdaMaxField,speedLambdaMaxEVecField); - // NOTE: Following loop assumes that each vector in surfToStrandMap contains - // vertices starting from layer_num 1 to 51 along a strand - APF_ITERATE(std::vector >,surfToStrandMap,it) - { - double lhSpeed; - double h; - apf::Vector3 thisPoint, lastPoint, nextPoint; - apf::Vector3 diff0, diff1; - apf::Vector3 evec, strand_dir; - volMesh->getPoint((*it)[0], 0, thisPoint); - volMesh->getPoint((*it)[1], 0, nextPoint); - diff1 = nextPoint - thisPoint; - lhSpeed = apf::getScalar(speedLambdaMaxField, (*it)[0], 0); - strand_dir = diff1; - h = diff1.getLength(); - apf::setScalar(lmaxHSpeedH2Field, (*it)[0], 0, lhSpeed * h * h); - - apf::getVector(speedLambdaMaxEVecField, (*it)[0], 0, evec); - evec = evec.normalize(); - strand_dir = strand_dir.normalize(); - apf::setScalar(lhSpeedDotNormal, (*it)[0], 0, std::fabs(strand_dir * evec)); - - for (int i = 1; i < (strandSize - 1); i++) - { - lastPoint = thisPoint; - thisPoint = nextPoint; - volMesh->getPoint((*it)[i + 1], 0, nextPoint); - diff0 = thisPoint - lastPoint; - diff1 = nextPoint - thisPoint; - strand_dir = nextPoint - lastPoint; - lhSpeed = apf::getScalar(speedLambdaMaxField, (*it)[i], 0); - h = (diff0.getLength() + diff1.getLength()) / 2.0; - apf::setScalar(lmaxHSpeedH2Field, (*it)[i], 0, lhSpeed * h * h); - - apf::getVector(speedLambdaMaxEVecField, (*it)[i], 0, evec); - evec = evec.normalize(); - strand_dir = strand_dir.normalize(); - apf::setScalar(lhSpeedDotNormal, (*it)[i], 0, std::fabs(strand_dir * evec)); - } - - lastPoint = thisPoint; - thisPoint = nextPoint; - diff0 = thisPoint - lastPoint; - strand_dir = thisPoint - lastPoint; - lhSpeed = apf::getScalar(speedLambdaMaxField, (*it)[strandSize - 1], 0); - h = diff0.getLength(); - apf::setScalar(lmaxHSpeedH2Field, (*it)[strandSize - 1], 0, lhSpeed * h * h); - - apf::getVector(speedLambdaMaxEVecField, (*it)[strandSize - 1], 0, evec); - evec = evec.normalize(); - strand_dir = strand_dir.normalize(); - apf::setScalar(lhSpeedDotNormal, (*it)[strandSize - 1], 0, std::fabs(strand_dir * evec)); - } - - FieldOfInterest speedBased; - speedBased.lambdaMaxField = lmaxHSpeedH2Field; - speedBased.lambdaStrandMax = apf::createLagrangeField(mesh,"surf_lhSpeed_x_h2_strandMax",apf::SCALAR,1); - speedBased.whichLayerHasLambdaMax = apf::createLagrangeField(mesh,"surf_idx_lhSpeed_x_h2_strandMax",apf::SCALAR,1); - speedBased.sizeField = apf::createLagrangeField(mesh,"surface_size_lhSpeed_x_h2",apf::SCALAR,1); - - getVolMaxPair(mesh,surfToStrandMap,speedBased.lambdaMaxField,speedBased.lambdaStrandMax,currentSize,speedBased.lambda_max,speedBased.h_lambdamax,speedBased.whichLayerHasLambdaMax); - - // printf("before->speedBased.lambda_max: %15.10e\n", speedBased.lambda_max); - // printf("before->speedBased.h_lambdamax: %15.10e\n", speedBased.h_lambdamax); - double cutoff = speedBased.lambda_max; - speedBased.h_lambdamax = 0.0; - speedBased.lambda_max = 0.0; - it = mesh->begin(0); - while( (vert = mesh->iterate(it)) ) - { - double idx_with_lmax = apf::getScalar(speedBased.whichLayerHasLambdaMax, vert, 0); - if (idx_with_lmax < nIgnoredLayers) - { - apf::setScalar(speedBased.lambdaStrandMax, vert, 0, 0.0); - } - else if (speedBased.lambda_max < apf::getScalar(speedBased.lambdaStrandMax, vert, 0)) - { - speedBased.lambda_max = apf::getScalar(speedBased.lambdaStrandMax, vert, 0); - // printf("->speedBased.lambda_max: %15.10e\n", speedBased.lambda_max); - // printf("->speedBased.lambda_max should be: %15.10e\n", apf::getScalar(speedBased.lambdaStrandMax, vert, 0)); - speedBased.h_lambdamax = apf::getScalar(currentSize,vert,0); - } - } - mesh->end(it); - // printf("after->speedBased.lambda_max: %15.10e\n", speedBased.lambda_max); - // printf("after->speedBased.h_lambdamax: %15.10e\n", speedBased.h_lambdamax); - - // Using a separate size field computation to capture free shear layer - if (bitFields[2] == '1') { - setSizeFieldAlt(mesh,speedBased.lambdaStrandMax,speedBased.sizeField,currentSize,speedBased.lambda_max,speedBased.lambda_cutoff(),h_global,factor); - } else if (bitFields[3] == '1') { - // TODO: Change from hard-coding - double factor_fsl = 4.0; - setSizeFieldAlt2(mesh,speedBased.lambdaStrandMax,speedBased.sizeField,currentSize,speedBased.lambda_cutoff(),h_global,factor_fsl); - } - - apf::Field* surfaceSpeedField = apf::createLagrangeField(mesh,"surface_speed",apf::SCALAR,1); - it = mesh->begin(0); - apf::MeshIterator* itVol = volMesh->begin(0); - while( (vert = mesh->iterate(it)) ) - { - apf::MeshEntity* vertVol = volMesh->iterate(itVol); - double rhoVal = apf::getScalar(rhoField,vertVol,0); - double eVal = apf::getScalar(eField,vertVol,0); - double speedVal = apf::getScalar(speedField,vertVol,0); - apf::setScalar(surfaceRhoField,vert,0,rhoVal); - apf::setScalar(surfaceEField,vert,0,eVal); - apf::setScalar(surfaceSpeedField,vert,0,speedVal); - } - mesh->end(it); - volMesh->end(itVol); - std::cout<<"Finished surface fields from volume\n"; - - double getSurfaceTime = PCU_Time(); - std::cout<<"TIMER: Finished computing speed and transferring fields to surface "<begin(0); - while( (vert = volMesh->iterate(itVol)) ) - { - double rho_e = apf::getScalar(eField,vert,0); - double rho = apf::getScalar(rhoField,vert,0); - double speedVal = apf::getScalar(speedField,vert,0); - double pressure_gamma = rho_e-0.5*rho*speedVal*speedVal; - apf::setScalar(pressureField,vert,0,pressure_gamma); - } - volMesh->end(itVol); - apf::Field* gradPressureField = apf::recoverGradientByVolume(pressureField); - apf::Field* hessianPressureField = apf::recoverGradientByVolume(gradPressureField); - - //get eigenvalues in the volume mesh - getLambdaMax(volMesh,hessianPressureField,lambdaMaxField); - - - FieldOfInterest eBased; - eBased.lambdaMaxField = lambdaMaxField; - eBased.lambdaStrandMax = apf::createLagrangeField(mesh,"surf_lambda_strandMax",apf::SCALAR,1); - eBased.sizeField = apf::createLagrangeField(mesh,"surface_size_e",apf::SCALAR,1); - - getVolMaxPair(mesh,surfToStrandMap,eBased.lambdaMaxField,eBased.lambdaStrandMax,currentSize,eBased.lambda_max,eBased.h_lambdamax); - - //set size field - - setSizeField(mesh,eBased.lambdaStrandMax,eBased.sizeField,eBased.lambda_max,eBased.lambda_cutoff(),eBased.h_lambdamax,h_global,factor); - - double getPressureTime = PCU_Time(); - std::cout<<"TIMER: Finished pressure size field "<begin(0); - int vIDcounter = 0; //better way to do this would be with a numbering system - //apf::Numbering* nVID = volMesh->findNumbering; //this would be for a volume mesh - - while( (vert = mesh->iterate(it)) ) - { - apf::Vector3 pointVol; - apf::Vector3 pointSurf; - apf::MeshEntity* volVert = surfToStrandMap[vIDcounter][1]; - double speed = apf::getScalar(speedField,volVert,0); - mesh->getPoint(vert,0,pointSurf); - volMesh->getPoint(volVert,0,pointVol); - apf::Vector3 differenceVec = pointVol-pointSurf; - double shearStress = speed/differenceVec.getLength(); - apf::setScalar(surfaceShearField,vert,0,shearStress); - vIDcounter++; - } - mesh->end(it); - - FieldOfInterest shearBased; - shearBased.lambdaMaxField = apf::createLagrangeField(mesh,"surflambdaMax",apf::SCALAR,1); - shearBased.sizeField = apf::createLagrangeField(mesh,"surface_size",apf::SCALAR,1); - - //get surface shear gradient - std::cout<<"Reached gradshearfield\n"; - apf::Field* gradShearField = apf::recoverGradientByVolume(surfaceShearField); - std::cout<<"Got gradshearfield\n"; - - it=mesh->begin(0); - while( (vert = mesh->iterate(it)) ) - { - apf::Vector3 gradShear; - apf::getVector(gradShearField,vert,0,gradShear); - apf::setScalar(shearBased.lambdaMaxField,vert,0,gradShear.getLength()); - } - mesh->end(it); - - std::cout<<"Got surf lambda max\n"; - getSurfMaxPair(mesh,shearBased.lambdaMaxField,currentSize,shearBased.lambda_max,shearBased.h_lambdamax); - - std::cout<<"Got surf lambda max pair\n"; - //set size field - setSizeField(mesh,shearBased.lambdaMaxField,shearBased.sizeField,shearBased.lambda_max,shearBased.lambda_cutoff(),shearBased.h_lambdamax,h_global,factor); - - std::cout<<"set size field\n"; - - double getShearTime = PCU_Time(); - std::cout<<"TIMER: Finished skin friction size field "< sizeFieldList; - sizeFieldList.push(eBased.sizeField); - sizeFieldList.push(shearBased.sizeField); - sizeFieldList.push(speedBased.sizeField); - sizeFieldList.push(speedBased.sizeField); - apf::Field* finalChoiceField = apf::createLagrangeField(mesh,"finalChoice",apf::SCALAR,1); - it = mesh->begin(0); - while( (vert = mesh->iterate(it)) ) - { - apf::setScalar(finalChoiceField,vert,0,0); - } - - isotropicIntersect(mesh,sizeFieldList,userInputFields,finalSizeField,finalChoiceField); - - double getIntersectionTime = PCU_Time(); - std::cout<<"TIMER: get mesh intersection "<shouldRunPreZoltan = true; - in->shouldRunMidZoltan = true; - in->shouldRunPostZoltan = true; - in->maximumImbalance = 1.05; - in->maximumIterations = log2(factor) + 2; - in->shouldSnap = true; - in->shouldTransferParametric = true; - /* in->shouldTransferToClosestPoint = true; */ - in->shouldForceAdaptation = true; - /* in->debugFolder = "debug"; */ - ma::adaptVerbose(in, false); - - double adaptTime = PCU_Time(); - std::cout<<"TIMER: adaptMesh "< binCount; - std::vector binArea; - computeSizeDistribution(mesh, factor, binCount, binArea); - - for (std::size_t i = 0; i < binCount.size(); i++) { - printf("bin %lu's count/area is %d/%g \n", i, binCount[i], binArea[i]); - } - - - // write the adapted mesh to vtk - apf::writeVtkFiles("adaptedMesh", mesh); - // write the adapted mesh to smb - // Note: This is for statistic measurements using - // measureIsoStats.cc - // The last argument is the name of the field to be used - // in measureIsoStats.cc - writeMdsMesh(mesh, "adaptedMesh.smb", "adapt_size"); - // write the adapted mesh to cre - writeCre(cs, "adaptedMesh.cre"); - - // clean up and exit calls - //destroy all fields... - for(int i =0;icountFields();i++) - { - apf::destroyField(mesh->getField(i)); - } - for(int i =0;icountFields();i++) - { - apf::destroyField(volMesh->getField(i)); - } - - gmi_cap_stop(); - PCU_Comm_Free(); - MPI_Finalize(); -} - -std::vector readTable(const char* name) -{ - std::vector table; - std::ifstream file(name); - while(!file.eof()){ - std::string str; - std::getline(file, str); - std::stringstream ss(str); - double value; - row r; - while (ss >> value) - r.push_back(value); - if (r.size() > 0) - table.push_back(r); - } - return table; -} - -static std::vector extractNthStrandData(const std::vector &table, - const int strandSize, const int n, const int col) -{ - std::vector outData; - int i = 0; - while (i*strandSize+(strandSize-n) < int(table.size())) { - outData.push_back(table[i*strandSize+(strandSize - n)][col]); - i++; - } - return outData; -} - -std::vector extractSurfaceData(const std::vector &table, - const int strandSize, const int col) -{ - // surface data corresponds to strand 1; - return extractNthStrandData(table, strandSize, 1, col); -} - -apf::Field* addScalarField(apf::Mesh2* m, const std::vector t, const char* name, int col, int strandSize) -{ - apf::Numbering* nLayer = m->findNumbering("layer_num"); - apf::Numbering* nVid = m->findNumbering("vid_num"); - PCU_ALWAYS_ASSERT(nLayer); - PCU_ALWAYS_ASSERT(nVid); - - apf::Field* f = apf::createFieldOn(m, name, apf::SCALAR); - apf::MeshEntity* e; - apf::MeshIterator* it = m->begin(0); - int count = 0; - while ( (e = m->iterate(it)) ) { - int layer = apf::getNumber(nLayer, e, 0, 0); - int vid = apf::getNumber(nVid, e, 0, 0); - double value = t[vid*strandSize+(strandSize - layer)][col]; - apf::setScalar(f, e, 0, value); - count++; - } - m->end(it); - return f; -} - -apf::Field* addVector3Field(apf::Mesh2* m, const std::vector t, const char* name, - int col0, int col1, int col2, int strandSize) -{ - apf::Numbering* nLayer = m->findNumbering("layer_num"); - apf::Numbering* nVid = m->findNumbering("vid_num"); - PCU_ALWAYS_ASSERT(nLayer); - PCU_ALWAYS_ASSERT(nVid); - - apf::Field* f = apf::createFieldOn(m, name, apf::VECTOR); - apf::MeshEntity* e; - apf::MeshIterator* it = m->begin(0); - int count = 0; - while ( (e = m->iterate(it)) ) { - int layer = apf::getNumber(nLayer, e, 0, 0); - int vid = apf::getNumber(nVid, e, 0, 0); - double value0 = t[vid*strandSize+(strandSize - layer)][col0]; - double value1 = t[vid*strandSize+(strandSize - layer)][col1]; - double value2 = t[vid*strandSize+(strandSize - layer)][col2]; - apf::setVector(f, e, 0, apf::Vector3(value0, value1, value2)); - count++; - } - m->end(it); - return f; -} - - - -static std::vector -readLayerCoordinates(int layer, const std::vector &t, int s) -{ - std::vector xs = extractNthStrandData(t, s, layer, 0); - std::vector ys = extractNthStrandData(t, s, layer, 1); - std::vector zs = extractNthStrandData(t, s, layer, 2); - - std::vector res; - - for (std::size_t i = 0; i < xs.size(); i++) - res.push_back(apf::Vector3(xs[i], ys[i], zs[i])); - - return res; -} - - -apf::Mesh2* createVolumeMesh(apf::Mesh2* m, const std::vector &t, int s, std::vector > &surfToStrandMap) -{ - // add numbering to the surface mash - apf::Numbering* n = apf::createNumbering(m, "surf_verts_num", apf::getLagrange(1) , 1); - apf::MeshEntity* e; - apf::MeshIterator* it = m->begin(0); - int count = 0; - while ( (e = m->iterate(it)) ) { - apf::number(n, e, 0, 0, count); - count++; - } - m->end(it); - - - // get the original faces - std::vector faces; - it = m->begin(2); - while ( (e = m->iterate(it)) ) - faces.push_back(e); - m->end(it); - - // create and empty mds mesh - apf::Mesh2* vMesh = apf::makeEmptyMdsMesh(gmi_load(".null"), 3, false); - apf::Numbering* nLayer = apf::createNumbering(vMesh, "layer_num", apf::getLagrange(1) , 1); - apf::Numbering* nVID = apf::createNumbering(vMesh, "vid_num", apf::getLagrange(1) , 1); - - // process each layer - // layer = 1 corresponds to the surface nodes - // treat it out side of the loop - std::vector coords = readLayerCoordinates(1, t, s); - std::vector lastVs; - for (std::size_t i = 0; i < coords.size(); i++) { - apf::MeshEntity* v = vMesh->createVertex(0, coords[i], apf::Vector3(0, 0, 0)); - apf::number(nLayer, v, 0, 0, 1); - apf::number(nVID, v, 0, 0, i); - lastVs.push_back(v); - } - - PCU_ALWAYS_ASSERT(coords.size() == lastVs.size()); - - // now process the remaining layers - for (int layer = 2; layer < s+1; layer++) { - // read the coords first - std::vector coords = readLayerCoordinates(layer, t, s); - // create the new verts - std::vector vs; - for (std::size_t i = 0; i < coords.size(); i++) { - apf::MeshEntity* v = vMesh->createVertex(0, coords[i], apf::Vector3(0, 0, 0)); - apf::number(nLayer, v, 0, 0, layer); - apf::number(nVID, v, 0, 0, i); - vs.push_back(v); - } - - // create the prisms - for (std::size_t i = 0; i < faces.size(); i++) { - apf::MeshEntity* f = faces[i]; - apf::MeshEntity* dv[3]; - m->getDownward(f, 0, dv); - int id0 = apf::getNumber(n, dv[0], 0, 0); - int id1 = apf::getNumber(n, dv[1], 0, 0); - int id2 = apf::getNumber(n, dv[2], 0, 0); - - apf::MeshEntity* prismVs[6]; - - prismVs[0] = lastVs[id0]; - prismVs[1] = lastVs[id1]; - prismVs[2] = lastVs[id2]; - - prismVs[3] = vs[id0]; - prismVs[4] = vs[id1]; - prismVs[5] = vs[id2]; - - apf::buildElement(vMesh, 0, apf::Mesh::PRISM, prismVs); - } - // set the lastVs to Vs - for (std::size_t i = 0; i < vs.size(); i++) - lastVs[i] = vs[i]; - } - vMesh->acceptChanges(); - apf::deriveMdsModel(vMesh); - apf::verify(vMesh); - - // create the surface to strand map - it = vMesh->begin(0); - while ( (e = vMesh->iterate(it)) ) { - int layer = apf::getNumber(nLayer, e, 0, 0) - 1; - int vid = apf::getNumber(nVID, e, 0, 0); - PCU_ALWAYS_ASSERT((layer >= 0) && (layer < s)); - PCU_ALWAYS_ASSERT((vid >= 0) && (vid < (int)m->count(0))); - surfToStrandMap[vid][layer] = e; - } - vMesh->end(it); - - // return the volume mesh - return vMesh; -} - -void writeCre(CapstoneModule& cs, const std::string& fileName) -{ - GeometryDatabaseInterface *gdbi = cs.get_geometry(); - MeshDatabaseInterface *mdbi = cs.get_mesh(); - AppContext *ctx = cs.get_context(); - - // Get the VTK writer. - Writer *creWriter = get_writer(ctx, "Create Native Writer"); - if (!creWriter) - error(HERE, ERR_GENERIC, "Could not find the CRE writer"); - - IdMapping idmapping; - std::vector mmodels; - M_GModel gmodel; - M_MModel mmodel; - gdbi->get_current_model(gmodel); - mdbi->get_current_model(mmodel); - mmodels.clear(); - mmodels.push_back(mmodel); - creWriter->write(ctx, gmodel, mmodels, fileName.c_str(), idmapping); -} - -void writeMdsMesh(apf::Mesh2* m, const char* name, const char* fieldName) -{ - // this would be the smb mesh with a field associated with it - apf::Mesh2* outMesh = apf::makeEmptyMdsMesh(gmi_load(".null"), 2, false); - - // add numbering to the surface mash - apf::Numbering* n = apf::createNumbering(m, "v_num", apf::getLagrange(1) , 1); - apf::MeshEntity* e; - apf::MeshIterator* it = m->begin(0); - int count = 0; - while ( (e = m->iterate(it)) ) { - apf::number(n, e, 0, 0, count); - count++; - } - m->end(it); - - - int numVerts = m->count(0); - apf::MeshEntity* vMap[numVerts]; - - apf::MeshEntity* v; - it = m->begin(0); - while( (v = m->iterate(it)) ) { - apf::Vector3 p; - m->getPoint(v, 0, p); - apf::MeshEntity* nv = outMesh->createVertex(0, p, apf::Vector3(0, 0, 0)); - int id = apf::getNumber(n, v, 0, 0); - vMap[id] = nv; - } - m->end(it); - - it = m->begin(2); - while( (e = m->iterate(it)) ) { - apf::MeshEntity* vs[3]; - m->getDownward(e, 0, vs); - apf::MeshEntity* triVs[3]; - triVs[0] = vMap[apf::getNumber(n, vs[0], 0, 0)]; - triVs[1] = vMap[apf::getNumber(n, vs[1], 0, 0)]; - triVs[2] = vMap[apf::getNumber(n, vs[2], 0, 0)]; - apf::buildElement(outMesh, 0, apf::Mesh::TRIANGLE, triVs); - } - m->end(it); - - outMesh->acceptChanges(); - apf::deriveMdsModel(outMesh); - outMesh->verify(); - apf::verify(outMesh); - - apf::destroyNumbering(n); - - // get the field on input mesh - apf::Field* inputField = m->findField(fieldName); - PCU_ALWAYS_ASSERT(inputField); - - // create the corresponding field for the out mesh - apf::Field* outputField = apf::createFieldOn(outMesh, "sizes", apf::SCALAR); - - it = m->begin(0); - apf::MeshIterator* outIt = outMesh->begin(0); - while( (v = m->iterate(it)) ) { - double value = apf::getScalar(inputField, v, 0); - apf::MeshEntity* outV = outMesh->iterate(outIt); - apf::setScalar(outputField, outV, 0, value); - } - m->end(it); - outMesh->end(outIt); - outMesh->writeNative(name); - - // clean up outMesh - outMesh->destroyNative(); - apf::destroyMesh(outMesh); -} - - -void computeSizeDistribution(apf::Mesh2* m, int factor, - std::vector& binCount, std::vector& binArea) -{ - // find the min length edge - apf::MeshEntity* e; - apf::MeshIterator* it; - - double minLength = 1.0e12; - it = m->begin(1); - while ( (e = m->iterate(it)) ) { - double l = apf::measure(m, e); - if (l < minLength) - minLength = l; - } - m->end(it); - - double minArea = minLength * minLength / 2.; - - // initialize the arrays - for (int i = 1; i <= factor; i*=2) { - binCount.push_back(0); - binArea.push_back(0.0); - } - - - it = m->begin(2); - while ( (e = m->iterate(it)) ) { - double a = apf::measure(m, e); - int count = 0; - for (int i = 1; i <= factor; i*=2) { - if (a >= i * minArea && a < 4 * i * minArea) { - binCount[count] += 1; - binArea[count] += a; - break; - } - count++; - } - } - m->end(it); -} - -void adjustRefinementLevel(apf::Mesh2* m, apf::Field* finalSize, - apf::Field* currentSize, int maxLevel) -{ - apf::MeshEntity* v; - apf::MeshIterator* it = m->begin(0); - - while( (v = m->iterate(it)) ) { - double currnetS = apf::getScalar(currentSize, v, 0); - double finalS = apf::getScalar(finalSize, v, 0); - if (currnetS < finalS) continue; - if (log2(currnetS/finalS) > maxLevel) - finalS = currnetS / pow(2, maxLevel); - apf::setScalar(finalSize, v, 0, finalS); - } - m->end(it); -} From 43afdd0830c6d3b53a54d692e84ba66d8da553dc Mon Sep 17 00:00:00 2001 From: Cameron Smith Date: Fri, 1 Nov 2024 12:34:38 -0400 Subject: [PATCH 52/55] generate: fix mem leaks of simmodsuite objects fixes #465 running valgrind memcheck on a 28M upright mesh generation on 16 ranks reports no leaks on all ranks ==1567914== HEAP SUMMARY: ==1567914== in use at exit: 40 bytes in 1 blocks ==1567914== total heap usage: 293,194,361 allocs, 293,194,360 frees, 27,011,094,588 bytes allocated ==1567914== ==1567914== LEAK SUMMARY: ==1567914== definitely lost: 0 bytes in 0 blocks ==1567914== indirectly lost: 0 bytes in 0 blocks ==1567914== possibly lost: 0 bytes in 0 blocks ==1567914== still reachable: 40 bytes in 1 blocks ==1567914== suppressed: 0 bytes in 0 blocks ==1567914== Rerun with --leak-check=full to see details of leaked memory --- test/generate.cc | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/test/generate.cc b/test/generate.cc index 473716a88..31a1399ed 100644 --- a/test/generate.cc +++ b/test/generate.cc @@ -91,6 +91,7 @@ pParMesh generate(pGModel mdl, std::string meshCaseName) { MeshingOptions meshingOptions; MS_processSimModelerMeshingAtts(mcaseFile, mcase, &meshingOptions); MS_processSimModelerAdvMeshingAtts(mcaseFile, mcase); + AttCase_unassociate(mcaseFile); AttCase_setModel(mcase, mdl); pParMesh pmesh; @@ -132,7 +133,7 @@ pParMesh generate(pGModel mdl, std::string meshCaseName) { if(0==PCU_Comm_Self()) printf(" %f seconds\n", MPI_Wtime()-vtime); } - + MS_deleteMeshCase(mcase); return pmesh; } @@ -284,7 +285,7 @@ void simStart() { SimPartitionedMesh_start(NULL,NULL); if(should_log) Sim_logOn("generate_sim.log"); - MS_init(); + SimAdvMeshing_start(); SimModel_start(); #ifdef SIM_PARASOLID SimParasolid_start(1); @@ -294,17 +295,11 @@ void simStart() { #endif SimDiscrete_start(0); Sim_readLicenseFile(NULL); - MS_init(); - SimAdvMeshing_start(); Sim_setMessageHandler(messageHandler); } void simStop() { - SimAdvMeshing_stop(); - SimModel_stop(); - SimPartitionedMesh_stop(); Sim_unregisterAllKeys(); - SimModel_stop(); SimDiscrete_stop(0); #ifdef SIM_ACIS SimAcis_stop(1); @@ -312,7 +307,9 @@ void simStop() { #ifdef SIM_PARASOLID SimParasolid_stop(1); #endif - MS_exit(); + SimModel_stop(); + SimAdvMeshing_stop(); + SimPartitionedMesh_stop(); } } //end unnamed namespace @@ -355,6 +352,7 @@ int main(int argc, char** argv) mesh->destroyNative(); apf::destroyMesh(mesh); + GM_release(simModel); simStop(); Sim_logOff(); PCU_Comm_Free(); From f87525cae7597322edfb2ccf1c7d4437402d9481 Mon Sep 17 00:00:00 2001 From: Cameron Smith Date: Fri, 1 Nov 2024 21:13:30 -0400 Subject: [PATCH 53/55] pumi version 2.2.9 see issue #405 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 831af6895..105d6df1a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,7 +6,7 @@ endif() # This is the top level CMake file for the SCOREC build cmake_minimum_required(VERSION 3.8) -project(SCOREC VERSION 2.2.8 LANGUAGES CXX C) +project(SCOREC VERSION 2.2.9 LANGUAGES CXX C) include(cmake/bob.cmake) include(cmake/xsdk.cmake) From 22340969d1af105b8c2dc5934b2b1222eaf1226c Mon Sep 17 00:00:00 2001 From: Aiden Woodruff Date: Mon, 4 Nov 2024 11:37:44 -0500 Subject: [PATCH 54/55] Fix unused variable warning introduced by #446 (#453) Suppress warning by casting to void. Signed-off-by: Aiden Woodruff --- ma/maSnap.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ma/maSnap.cc b/ma/maSnap.cc index d75426e8d..0411cce55 100644 --- a/ma/maSnap.cc +++ b/ma/maSnap.cc @@ -509,6 +509,8 @@ static void interpolateParametricCoordinatesOnRegularFace( bool isPeriodic = m->getPeriodicRange(g,d,range); p[d] = interpolateParametricCoordinate(t,a[d],b[d],range,isPeriodic, 1); } +#else + (void) gface_isPeriodic; #endif } From 019162684739e3cd091bc5d38ce02311da7cb187 Mon Sep 17 00:00:00 2001 From: Angel Castillo Date: Mon, 11 Nov 2024 13:25:30 -0500 Subject: [PATCH 55/55] test globus (#466) - refactor globus compute scripts - Moves all of the files that globus uses unto Github. - Moves globus code to separate repository so that it can be reused. --- .github/workflows/frontier/install.sh | 20 ++++++++ .github/workflows/frontier/run.sh | 11 +++++ .github/workflows/globus-test.yml | 19 ++++++++ .github/workflows/perlmutter/install.sh | 19 ++++++++ .github/workflows/perlmutter/run.sh | 9 ++++ .github/workflows/systems.yml | 63 ------------------------- .github/workflows/test_on_system.py | 38 --------------- CMakeLists.txt | 2 +- 8 files changed, 79 insertions(+), 102 deletions(-) create mode 100644 .github/workflows/frontier/install.sh create mode 100644 .github/workflows/frontier/run.sh create mode 100644 .github/workflows/globus-test.yml create mode 100644 .github/workflows/perlmutter/install.sh create mode 100644 .github/workflows/perlmutter/run.sh delete mode 100644 .github/workflows/systems.yml delete mode 100644 .github/workflows/test_on_system.py diff --git a/.github/workflows/frontier/install.sh b/.github/workflows/frontier/install.sh new file mode 100644 index 000000000..806f5bb19 --- /dev/null +++ b/.github/workflows/frontier/install.sh @@ -0,0 +1,20 @@ +#!/bin/bash -e + +module load PrgEnv-amd + +branch=$1 +cd /lustre/orion/phy122/scratch/castia5/globus-compute/core-test + +# Core +rm build-core -rf +rm core -rf +git clone https://github.com/SCOREC/core.git +cd core && git checkout $branch && git clone https://github.com/SCOREC/pumi-meshes.git && cd - +cmake -S core -B build-core \ + -DCMAKE_C_COMPILER=cc \ + -DCMAKE_CXX_COMPILER=CC \ + -DENABLE_ZOLTAN=OFF \ + -DMPIRUN=/usr/bin/srun \ + -DMPIRUN_PROCFLAG="--ntasks" \ + -DIS_TESTING=True +cmake --build build-core -j 24 \ No newline at end of file diff --git a/.github/workflows/frontier/run.sh b/.github/workflows/frontier/run.sh new file mode 100644 index 000000000..35fe1e7a0 --- /dev/null +++ b/.github/workflows/frontier/run.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +name=core + +cd /lustre/orion/phy122/scratch/castia5/globus-compute/$name-test + +module load PrgEnv-amd + +cd build-$name +salloc --account=PHY122 --time=00:20:00 -q debug --nodes=1 --ntasks=1 --cpus-per-task=1 --gpus-per-task=1 --gpus=1 ctest +cat $PWD/Testing/Temporary/LastTest.log \ No newline at end of file diff --git a/.github/workflows/globus-test.yml b/.github/workflows/globus-test.yml new file mode 100644 index 000000000..17bcd301e --- /dev/null +++ b/.github/workflows/globus-test.yml @@ -0,0 +1,19 @@ +name: Globus-Systems +on: + schedule: + # Monday 7:35 UTC or 03:35 EDT + - cron: '35 7 * * 1' + +jobs: + + perlmutter-test: + uses: SCOREC/github-actions/.github/workflows/globus-test.yml@main + secrets: inherit + with: + machine: "perlmutter" + + frontier-test: + uses: SCOREC/github-actions/.github/workflows/globus-test.yml@main + secrets: inherit + with: + machine: "frontier" \ No newline at end of file diff --git a/.github/workflows/perlmutter/install.sh b/.github/workflows/perlmutter/install.sh new file mode 100644 index 000000000..9f1c97bea --- /dev/null +++ b/.github/workflows/perlmutter/install.sh @@ -0,0 +1,19 @@ +#!/bin/bash -e + +branch=$1 + +cd $SCRATCH/globus-compute/core-test + +# core +rm build-core -rf +rm core -rf +git clone https://github.com/SCOREC/core.git +cd core && git checkout $branch && git clone https://github.com/SCOREC/pumi-meshes.git && cd - +cmake -S core -B build-core \ + -DCMAKE_C_COMPILER=cc \ + -DCMAKE_CXX_COMPILER=CC \ + -DENABLE_ZOLTAN=OFF \ + -DMPIRUN=/usr/bin/srun \ + -DMPIRUN_PROCFLAG="--ntasks" \ + -DIS_TESTING=True +cmake --build build-core -j 24 \ No newline at end of file diff --git a/.github/workflows/perlmutter/run.sh b/.github/workflows/perlmutter/run.sh new file mode 100644 index 000000000..a2b68c081 --- /dev/null +++ b/.github/workflows/perlmutter/run.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +name=core + +cd $SCRATCH/globus-compute/$name-test + +cd build-$name +salloc --time 00:20:00 --constrain=gpu --qos=interactive --nodes=1 --ntasks-per-node=40 --cpus-per-task=1 --gpus=1 --account=m4564 ctest +cat $PWD/Testing/Temporary/LastTest.log \ No newline at end of file diff --git a/.github/workflows/systems.yml b/.github/workflows/systems.yml deleted file mode 100644 index 292968d9e..000000000 --- a/.github/workflows/systems.yml +++ /dev/null @@ -1,63 +0,0 @@ -name: Systems -on: - schedule: - # Monday 4:30 UTC or 00:30 EDT - - cron: '30 4 * * 1' - -concurrency: - group: systems-core - cancel-in-progress: true - -jobs: - test: - runs-on: ubuntu-latest - timeout-minutes: 30 - strategy: - matrix: - machine: ["Perlmutter", "Frontier"] - - steps: - - - name: checkout core - uses: actions/checkout@v4 - with: - path: core - - - name: setup python - uses: actions/setup-python@v5 - with: - python-version: '3.10' - - - name: install packing - run: sudo apt install python3-packaging - - - name: install globus - run: | - python -m ensurepip --upgrade --user - python -m pip install globus-compute-endpoint - - - name: use globus - working-directory: core/.github/workflows - env: - GLOBUS_ID: ${{ secrets.GLOBUS_COMPUTE_ID }} - GLOBUS_SECRET: ${{ secrets.GLOBUS_COMPUTE_SECRET }} - run: | - export GLOBUS_COMPUTE_CLIENT_ID="$GLOBUS_ID" - export GLOBUS_COMPUTE_CLIENT_SECRET="$GLOBUS_SECRET" - if [ ${{matrix.machine}} == Perlmutter ]; then TARGET_ENDPOINT=0dd4499a-8d76-4977-bae9-841e4bb2f616; fi - if [ ${{matrix.machine}} == Frontier ]; then TARGET_ENDPOINT=d625c6cf-de7a-4228-ac44-56247a642fe0; fi - python test_on_system.py ${{ github.event.repository.name }} ${{ github.sha }} $TARGET_ENDPOINT - - - name: print build log - working-directory: core/.github/workflows - run: cat core-result/Build.log - - - name: print test log - working-directory: core/.github/workflows - run: cat core-result/Test.log - - - name: check failed test - working-directory: core/.github/workflows - run: if grep "Failed" core-result/Test.log; then return 1; fi - - \ No newline at end of file diff --git a/.github/workflows/test_on_system.py b/.github/workflows/test_on_system.py deleted file mode 100644 index 1c1f6d539..000000000 --- a/.github/workflows/test_on_system.py +++ /dev/null @@ -1,38 +0,0 @@ -# How to use -# 1. Login to https://app.globus.org/settings/developers and copy a project app id and secret -# 2. Use the id and secret to create and endpoint https://funcx.readthedocs.io/en/latest/sdk.html#client-credentials-with-clients -# $ export FUNCX_SDK_CLIENT_ID="b0500dab-ebd4-430f-b962-0c85bd43bdbb" -# $ export FUNCX_SDK_CLIENT_SECRET="ABCDEFGHIJKLMNOP0123456789=" -# 3. Set up an endpoint on the computer that will run the tests, using these instructions: https://funcx.readthedocs.io/en/latest/endpoints.html -# 4. Create install-test.sh and run-test.sh on target computer - -from globus_compute_sdk import Executor -import sys -import os - -name = sys.argv[1] -branch = sys.argv[2] -endpoint = sys.argv[3] - -def run_on_endpoint(name, branch): - import subprocess - - install = subprocess.run(["./install-test.sh "+name+" "+branch], shell=True, encoding="utf_8", stdout=subprocess.PIPE, stderr=subprocess.STDOUT) - if install.returncode == 1: - return (install, None) - - result = subprocess.run(["./run-test.sh "+name], shell=True, encoding="utf_8", stdout=subprocess.PIPE, stderr=subprocess.STDOUT) - return (install, result) - -gce = Executor(endpoint_id = endpoint) -future = gce.submit(run_on_endpoint, name, branch) -result = future.result() - -os.popen("mkdir -p "+name+"-result").read() -with open(name+"-result/Build.log", "w") as text_file: - text_file.write("%s" % result[0].stdout) - text_file.close() -if result[0].returncode == 0: - with open(name+"-result/Test.log", "w") as text_file: - text_file.write("%s" % result[1].stdout) - text_file.close() diff --git a/CMakeLists.txt b/CMakeLists.txt index 105d6df1a..1e4ed553b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,7 +6,7 @@ endif() # This is the top level CMake file for the SCOREC build cmake_minimum_required(VERSION 3.8) -project(SCOREC VERSION 2.2.9 LANGUAGES CXX C) +project(SCOREC VERSION 2.2.10 LANGUAGES CXX C) include(cmake/bob.cmake) include(cmake/xsdk.cmake)