diff --git a/.github/workflows/test-spack.yml b/.github/workflows/test-spack.yml index 23439c7bc4e541e343d5eb40889461d8153c8958..b78a3475805b2caac1d67a67ac78e31291eaa1b8 100644 --- a/.github/workflows/test-spack.yml +++ b/.github/workflows/test-spack.yml @@ -35,6 +35,7 @@ jobs: uses: actions/checkout@v3 with: path: arbor + submodules: recursive - name: clone spack develop if: ${{ matrix.spack-version == 'develop' }} diff --git a/.gitmodules b/.gitmodules index cd515e55423d824434cdb01dc86558a8a87ecd7d..5ab557ea13aa0aeae42b58cc6df63ed3e6e1b460 100644 --- a/.gitmodules +++ b/.gitmodules @@ -26,3 +26,6 @@ path = ext/pugixml url = https://github.com/zeux/pugixml.git branch = master +[submodule "ext/units"] + path = ext/units + url = https://github.com/LLNL/units.git diff --git a/CMakeLists.txt b/CMakeLists.txt index 3a0e9e85d956037bcf69ea3115712e6b807f56d1..a765d7b2f2da00565f5f5b329f5b0f433c43ebd3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -259,6 +259,9 @@ install(FILES mechanisms/BuildModules.cmake DESTINATION ${ARB_INSTALL_DATADIR}) cmake_dependent_option(ARB_USE_BUNDLED_FMT "Use bundled FMT lib." ON "ARB_USE_BUNDLED_LIBS" OFF) cmake_dependent_option(ARB_USE_BUNDLED_PUGIXML "Use bundled XML lib." ON "ARB_USE_BUNDLED_LIBS" OFF) cmake_dependent_option(ARB_USE_BUNDLED_GTEST "Use bundled GoogleTest." ON "ARB_USE_BUNDLED_LIBS" OFF) +# TODO When we get a units spack package... +#cmake_dependent_option(ARB_USE_BUNDLED_UNITS "Use bundled LLNL units." ON "ARB_USE_BUNDLED_LIBS" OFF) +set(ARB_USE_BUNDLED_UNITS ON CACHE STRING "Use bundled LLNL units.") cmake_dependent_option(ARB_USE_BUNDLED_JSON "Use bundled Niels Lohmann's json library." ON "ARB_USE_BUNDLED_LIBS" OFF) if(NOT ARB_USE_BUNDLED_JSON) @@ -290,9 +293,20 @@ else() endif() endif() +add_library(ext-units INTERFACE) +if(ARB_USE_BUNDLED_UNITS) + target_link_libraries(ext-units INTERFACE units::units) +else() + message(FATAL, "TODO: At the time of Arbor 0.10.0 there is no Spack package") +endif() + + add_subdirectory(ext) install(TARGETS ext-hwloc EXPORT arbor-targets) install(TARGETS ext-random123 EXPORT arbor-targets) +target_link_libraries(arbor-public-deps INTERFACE ext-units) +install(TARGETS ext-units EXPORT arbor-targets) +install(TARGETS units compile_flags_target EXPORT arbor-targets) # Keep track of packages we need to add to the generated CMake config # file for arbor. diff --git a/arbor/backends/gpu/threshold_watcher.hpp b/arbor/backends/gpu/threshold_watcher.hpp index ccf15066fbaca55eaaf1f0e5c29f4d44b74368f0..d3d7e5824f57db5e9a498f046b7965ab793f9b96 100644 --- a/arbor/backends/gpu/threshold_watcher.hpp +++ b/arbor/backends/gpu/threshold_watcher.hpp @@ -72,7 +72,7 @@ public: v_prev_(num_cv), // TODO: allocates enough space for 10 spikes per watch. // A more robust approach might be needed to avoid overflows. - stack_(10*size(), context.gpu) + stack_(100*size(), context.gpu) { crossings_.reserve(stack_.capacity()); // reset() needs to be called before this is ready for use diff --git a/arbor/cable_cell.cpp b/arbor/cable_cell.cpp index 210fdd3cea655f3ee3e70f12d2ce1578660d6e62..21dd4e5392e64a48aea91253bea935cbe4beed26 100644 --- a/arbor/cable_cell.cpp +++ b/arbor/cable_cell.cpp @@ -2,7 +2,6 @@ #include <sstream> #include <unordered_map> #include <variant> -#include <vector> #include <arbor/cable_cell.hpp> #include <arbor/morph/label_dict.hpp> @@ -10,9 +9,6 @@ #include <arbor/morph/mprovider.hpp> #include <arbor/util/pp_util.hpp> -#include "util/piecewise.hpp" -#include "util/rangeutil.hpp" -#include "util/span.hpp" #include "util/strprintf.hpp" namespace arb { @@ -37,7 +33,7 @@ std::string show(const paintable& item) { else if constexpr (std::is_same_v<axial_resistivity, T>) { os << "axial-resistivity"; } - else if constexpr (std::is_same_v<temperature_K, T>) { + else if constexpr (std::is_same_v<temperature, T>) { os << "temperature-kelvin"; } else if constexpr (std::is_same_v<membrane_capacitance, T>) { diff --git a/arbor/cable_cell_param.cpp b/arbor/cable_cell_param.cpp index e3b425de7a45c956117d31184fedbe583975cada..a5c4e20792c16c0c467aba3c35b4c7abd22dcc7c 100644 --- a/arbor/cable_cell_param.cpp +++ b/arbor/cable_cell_param.cpp @@ -75,30 +75,30 @@ cable_cell_parameter_set neuron_parameter_defaults = { std::vector<defaultable> cable_cell_parameter_set::serialize() const { std::vector<defaultable> D; if (init_membrane_potential) { - D.push_back(arb::init_membrane_potential{*this->init_membrane_potential}); + D.push_back(arb::init_membrane_potential{*this->init_membrane_potential*units::mV}); } if (temperature_K) { - D.push_back(arb::temperature_K{*this->temperature_K}); + D.push_back(arb::temperature{*this->temperature_K*units::Kelvin}); } if (axial_resistivity) { - D.push_back(arb::axial_resistivity{*this->axial_resistivity}); + D.push_back(arb::axial_resistivity{*this->axial_resistivity*units::Ohm*units::cm}); } if (membrane_capacitance) { - D.push_back(arb::membrane_capacitance{*this->membrane_capacitance}); + D.push_back(arb::membrane_capacitance{*this->membrane_capacitance*units::F/units::m2}); } for (const auto& [name, data]: ion_data) { if (data.init_int_concentration) { - D.push_back(init_int_concentration{name, *data.init_int_concentration}); + D.push_back(init_int_concentration{name, *data.init_int_concentration*units::mM}); } if (data.init_ext_concentration) { - D.push_back(init_ext_concentration{name, *data.init_ext_concentration}); + D.push_back(init_ext_concentration{name, *data.init_ext_concentration*units::mM}); } if (data.init_reversal_potential) { - D.push_back(init_reversal_potential{name, *data.init_reversal_potential}); + D.push_back(init_reversal_potential{name, *data.init_reversal_potential*units::mV}); } if (data.diffusivity) { - D.push_back(ion_diffusivity{name, *data.diffusivity}); + D.push_back(ion_diffusivity{name, *data.diffusivity*units::m2/units::s}); } } @@ -133,32 +133,32 @@ decor& decor::set_default(defaultable what) { [this] (auto&& p) { using T = std::decay_t<decltype(p)>; if constexpr (std::is_same_v<init_membrane_potential, T>) { - if (p.value.type() != iexpr_type::scalar) throw cable_cell_error{"Default values cannot have a scale."}; - defaults_.init_membrane_potential = *p.value.get_scalar(); + if (p.scale.type() != iexpr_type::scalar) throw cable_cell_error{"Default values cannot have a scale."}; + defaults_.init_membrane_potential = *p.scale.get_scalar()*p.value; } else if constexpr (std::is_same_v<axial_resistivity, T>) { - if (p.value.type() != iexpr_type::scalar) throw cable_cell_error{"Default values cannot have a scale."}; - defaults_.axial_resistivity = *p.value.get_scalar(); + if (p.scale.type() != iexpr_type::scalar) throw cable_cell_error{"Default values cannot have a scale."}; + defaults_.axial_resistivity = *p.scale.get_scalar()*p.value; } - else if constexpr (std::is_same_v<temperature_K, T>) { - if (p.value.type() != iexpr_type::scalar) throw cable_cell_error{"Default values cannot have a scale."}; - defaults_.temperature_K = *p.value.get_scalar(); + else if constexpr (std::is_same_v<temperature, T>) { + if (p.scale.type() != iexpr_type::scalar) throw cable_cell_error{"Default values cannot have a scale."}; + defaults_.temperature_K = *p.scale.get_scalar()*p.value; } else if constexpr (std::is_same_v<membrane_capacitance, T>) { - if (p.value.type() != iexpr_type::scalar) throw cable_cell_error{"Default values cannot have a scale."}; - defaults_.membrane_capacitance = *p.value.get_scalar(); + if (p.scale.type() != iexpr_type::scalar) throw cable_cell_error{"Default values cannot have a scale."}; + defaults_.membrane_capacitance = *p.scale.get_scalar()*p.value; } else if constexpr (std::is_same_v<init_int_concentration, T>) { - if (p.value.type() != iexpr_type::scalar) throw cable_cell_error{"Default values cannot have a scale."}; - defaults_.ion_data[p.ion].init_int_concentration = *p.value.get_scalar(); + if (p.scale.type() != iexpr_type::scalar) throw cable_cell_error{"Default values cannot have a scale."}; + defaults_.ion_data[p.ion].init_int_concentration = *p.scale.get_scalar()*p.value; } else if constexpr (std::is_same_v<init_ext_concentration, T>) { - if (p.value.type() != iexpr_type::scalar) throw cable_cell_error{"Default values cannot have a scale."}; - defaults_.ion_data[p.ion].init_ext_concentration = *p.value.get_scalar(); + if (p.scale.type() != iexpr_type::scalar) throw cable_cell_error{"Default values cannot have a scale."}; + defaults_.ion_data[p.ion].init_ext_concentration = *p.scale.get_scalar()*p.value; } else if constexpr (std::is_same_v<init_reversal_potential, T>) { - if (p.value.type() != iexpr_type::scalar) throw cable_cell_error{"Default values cannot have a scale."}; - defaults_.ion_data[p.ion].init_reversal_potential = *p.value.get_scalar(); + if (p.scale.type() != iexpr_type::scalar) throw cable_cell_error{"Default values cannot have a scale."}; + defaults_.ion_data[p.ion].init_reversal_potential = *p.scale.get_scalar()*p.value; } else if constexpr (std::is_same_v<ion_reversal_potential_method, T>) { defaults_.reversal_potential_method[p.ion] = p.method; @@ -167,8 +167,9 @@ decor& decor::set_default(defaultable what) { defaults_.discretization = std::forward<cv_policy>(p); } else if constexpr (std::is_same_v<ion_diffusivity, T>) { - if (p.value.type() != iexpr_type::scalar) throw cable_cell_error{"Default values cannot have a scale."}; - defaults_.ion_data[p.ion].diffusivity = p.value.get_scalar(); + if (p.scale.type() != iexpr_type::scalar) throw cable_cell_error{"Default values cannot have a scale."}; + auto s = p.scale.get_scalar(); + defaults_.ion_data[p.ion].diffusivity = s ? std::optional{*s*p.value} : s; } }, what); diff --git a/arbor/fvm_layout.cpp b/arbor/fvm_layout.cpp index 5baa95c036f59e7a182a9eb189b71603839c9ac3..2e667031f34761bcf079e7ffe9409151ef14b0be 100644 --- a/arbor/fvm_layout.cpp +++ b/arbor/fvm_layout.cpp @@ -1,7 +1,6 @@ #include <algorithm> #include <optional> #include <set> -#include <stdexcept> #include <unordered_set> #include <unordered_map> #include <vector> @@ -20,17 +19,11 @@ #include "fvm_layout.hpp" #include "threading/threading.hpp" #include "util/maputil.hpp" -#include "util/meta.hpp" -#include "util/partition.hpp" #include "util/piecewise.hpp" #include "util/pw_over_cable.hpp" #include "util/rangeutil.hpp" -#include "util/transform.hpp" -#include "util/unique.hpp" #include "util/strprintf.hpp" -#include <iostream> - namespace arb { using util::assign; @@ -275,16 +268,16 @@ fvm_cv_discretize(const cable_cell& cell, const cable_cell_parameter_set& global double dflt_resistivity = *(dflt.axial_resistivity | global_dflt.axial_resistivity); double dflt_capacitance = *(dflt.membrane_capacitance | global_dflt.membrane_capacitance); - double dflt_potential = *(dflt.init_membrane_potential | global_dflt.init_membrane_potential); + double dflt_potential = *(dflt.init_membrane_potential | global_dflt.init_membrane_potential); double dflt_temperature = *(dflt.temperature_K | global_dflt.temperature_K); - const auto& assignments = cell.region_assignments(); - const auto& resistivity = assignments.get<axial_resistivity>(); - const auto& capacitance = assignments.get<membrane_capacitance>(); - const auto& potential = assignments.get<init_membrane_potential>(); - const auto& temperature = assignments.get<temperature_K>(); - const auto& diffusivity = assignments.get<ion_diffusivity>(); - const auto& provider = cell.provider(); + const auto& assignments = cell.region_assignments(); + const auto& resistivity = assignments.get<axial_resistivity>(); + const auto& capacitance = assignments.get<membrane_capacitance>(); + const auto& potential = assignments.get<init_membrane_potential>(); + const auto& temperature_K = assignments.get<temperature>(); + const auto& diffusivity = assignments.get<ion_diffusivity>(); + const auto& provider = cell.provider(); struct inv_diff { iexpr value; @@ -310,8 +303,9 @@ fvm_cv_discretize(const cable_cell& cell, const cable_cell_parameter_set& global auto diffusive = std::any_of(data.begin(), data.end(), [](const auto& kv) { - const auto& v = kv.second.value.get_scalar(); - return !v || *v != 0.0 || *v == *v; + const auto& [k, v] = kv; + auto s = v.scale.get_scalar(); + return !s || *s*v.value != 0.0; }); if (diffusive) { // Provide a (non-sensical) default. @@ -337,7 +331,7 @@ fvm_cv_discretize(const cable_cell& cell, const cable_cell_parameter_set& global for (msize_t i = 0; i<n_branch; ++i) { auto cable = mcable{i, 0., 1.}; auto scale_param = [&, ion=ion](const auto&, - const inv_diff& par) { + const inv_diff& par) -> double { auto ie = thingify(par.value, provider); auto sc = ie->eval(provider, cable); if (def <= 0.0 || std::isnan(def)) { @@ -360,9 +354,9 @@ fvm_cv_discretize(const cable_cell& cell, const cable_cell_parameter_set& global for (msize_t i = 0; i<n_branch; ++i) { auto cable = mcable{i, 0., 1.}; auto scale_param = [&](const auto&, - const axial_resistivity& par) { - auto ie = thingify(par.value, provider); - auto sc = ie->eval(provider, cable); + const axial_resistivity& par) -> double { + auto ie = thingify(par.scale, provider); + auto sc = par.value*ie->eval(provider, cable); return sc; }; ax_res_0.emplace_back(pw_over_cable(resistivity, cable, dflt_resistivity, scale_param)); @@ -419,15 +413,15 @@ fvm_cv_discretize(const cable_cell& cell, const cable_cell_parameter_set& global double cv_length = 0; for (mcable cable: cv_cables) { - auto scale_param = [&](const auto&, const auto& par) { - auto ie = thingify(par.value, provider); - auto sc = ie->eval(provider, cable); + auto scale_param = [&](const auto&, const auto& par) -> double { + auto ie = thingify(par.scale, provider); + auto sc = par.value*ie->eval(provider, cable); return sc; }; - auto pw_capacitance = pw_over_cable(capacitance, cable, dflt_capacitance, scale_param); - auto pw_potential = pw_over_cable(potential, cable, dflt_potential, scale_param); - auto pw_temperature = pw_over_cable(temperature, cable, dflt_temperature, scale_param); + auto pw_capacitance = pw_over_cable(capacitance, cable, dflt_capacitance, scale_param); + auto pw_potential = pw_over_cable(potential, cable, dflt_potential, scale_param); + auto pw_temperature = pw_over_cable(temperature_K, cable, dflt_temperature, scale_param); D.cv_area[i] += embedding.integrate_area(cable); D.cv_capacitance[i] += embedding.integrate_area(cable.branch, pw_capacitance); @@ -544,7 +538,7 @@ bool cables_intersect_location(Seq&& cables, const mlocation& x) { auto eqr = std::equal_range(begin(cables), end(cables), x.branch, cmp_branch{}); return util::any_of(util::make_range(eqr), - [&x](const mcable& c) { return c.prox_pos<=x.pos && x.pos<=c.dist_pos; }); + [&x](const mcable& c) { return c.prox_pos<=x.pos && x.pos<=c.dist_pos; }); } voltage_reference_pair fvm_voltage_reference_points(const morphology& morph, const cv_geometry& geom, arb_size_type cell_idx, const mlocation& site) { @@ -1312,9 +1306,9 @@ make_ion_config(fvm_ion_map build_data, for (const mcable& cable: data.D.geometry.cables(cv)) { auto scale_param = [&](const auto&, - const auto& par) { - auto ie = thingify(par.value, provider); - auto sc = ie->eval(provider, cable); + const auto& par) -> double { + auto ie = thingify(par.scale, provider); + auto sc = par.value*ie->eval(provider, cable); return sc; }; diff --git a/arbor/include/arbor/cable_cell.hpp b/arbor/include/arbor/cable_cell.hpp index e119508a49a440ae6a3e3fb53c2e8df960b49f4f..82958231603f96be7baca08775af7d1e206702fa 100644 --- a/arbor/include/arbor/cable_cell.hpp +++ b/arbor/include/arbor/cable_cell.hpp @@ -4,7 +4,6 @@ #include <string> #include <unordered_map> #include <utility> -#include <variant> #include <vector> #include <arbor/export.hpp> @@ -239,7 +238,7 @@ using location_assignment = using cable_cell_region_map = static_typed_map<region_assignment, density, voltage_process, init_membrane_potential, axial_resistivity, - temperature_K, membrane_capacitance, init_int_concentration, + temperature, membrane_capacitance, init_int_concentration, ion_diffusivity, init_ext_concentration, init_reversal_potential>; using cable_cell_location_map = static_typed_map<location_assignment, diff --git a/arbor/include/arbor/cable_cell_param.hpp b/arbor/include/arbor/cable_cell_param.hpp index 59bb5bb0148843354c2678bee743be8cfd2e417a..d68c0c73e21e59b774ef8443f5477ef508a9150b 100644 --- a/arbor/include/arbor/cable_cell_param.hpp +++ b/arbor/include/arbor/cable_cell_param.hpp @@ -13,14 +13,17 @@ #include <arbor/mechcat.hpp> #include <arbor/morph/locset.hpp> #include <arbor/morph/primitives.hpp> +#include <arbor/units.hpp> namespace arb { +namespace U = arb::units; + // Specialized arbor exception for errors in cell building. struct ARB_SYMBOL_VISIBLE cable_cell_error: arbor_exception { cable_cell_error(const std::string& what): - arbor_exception("cable_cell: "+what) {} + arbor_exception("cable_cell: " + what) {} }; // Ion inital concentration and reversal potential @@ -30,28 +33,43 @@ struct ARB_SYMBOL_VISIBLE cable_cell_error: arbor_exception { // separately (see below). struct cable_cell_ion_data { - std::optional<double> init_int_concentration; - std::optional<double> init_ext_concentration; - std::optional<double> init_reversal_potential; - std::optional<double> diffusivity; + std::optional<double> init_int_concentration; // mM + std::optional<double> init_ext_concentration; // mM + std::optional<double> init_reversal_potential; // mV + std::optional<double> diffusivity; // m²/s }; -// Clamp current is described by a sine wave with amplitude governed by a -// piecewise linear envelope. A frequency of zero indicates that the current is -// simply that given by the envelope. -// -// The envelope is given by a series of envelope_point values: -// * The time points must be monotonically increasing. -// * Onset and initial amplitude is given by the first point. -// * The amplitude for time after the last time point is that of the last -// amplitude point; an explicit zero amplitude point must be provided if the -// envelope is intended to have finite support. -// -// Periodic envelopes are not supported, but may well be a feature worth -// considering in the future. - +/** + * Current clamp; described by a sine wave with amplitude governed by a + * piecewise linear envelope. A frequency of zero indicates that the current is + * simply that given by the envelope. + * + * The envelope is given by a series of envelope_point values: + * * The time points must be monotonically increasing. + * * Onset and initial amplitude is given by the first point. + * * The amplitude for time after the last time point is that of the last + * amplitude point; an explicit zero amplitude point must be provided if the + * envelope is intended to have finite support. + * + * Periodic envelopes are not supported, but may well be a feature worth + * considering in the future. + */ struct ARB_SYMBOL_VISIBLE i_clamp { struct envelope_point { + /** + * Current at point in time + * + * @param t, must be convertible to time + * @param amplitude must be convertible to current + */ + envelope_point(const U::quantity& time, + const U::quantity& current): + t(time.value_as(U::ms)), + amplitude(current.value_as(U::nA)) { + + if (std::isnan(t)) throw std::domain_error{"Time must be finite and convertible to ms."}; + if (std::isnan(amplitude)) throw std::domain_error{"Amplitude must be finite and convertible to nA."}; + } double t; // [ms] double amplitude; // [nA] }; @@ -64,69 +82,147 @@ struct ARB_SYMBOL_VISIBLE i_clamp { // a trivial stimulus, providing no current at all. i_clamp() = default; - // The simple constructor describes a constant amplitude stimulus starting from t=0. - explicit i_clamp(double amplitude, double frequency = 0, double phase = 0): - envelope({{0., amplitude}}), - frequency(frequency), - phase(phase) + /** + * Constant amplitude stimulus starting at t = 0. + * + * @param amplitude must be convertible to current + * @param frequency, must be convertible to frequency; gives a sine current if not zero + * @param frequency, must be convertible to radians, phase shift of sine. + */ + + explicit i_clamp(const U::quantity& amplitude, + const U::quantity& frequency = 0*U::kHz, + const U::quantity& phase = 0*U::rad): + i_clamp{{{0.0*U::ms, amplitude}}, frequency, phase} {} // Describe a stimulus by envelope and frequency. - explicit i_clamp(std::vector<envelope_point> envelope, double frequency = 0, double phase = 0): + explicit i_clamp(std::vector<envelope_point> envelope, + const U::quantity& f = 0*U::kHz, + const U::quantity& phi = 0*U::rad): envelope(std::move(envelope)), - frequency(frequency), - phase(phase) - {} + frequency(f.value_as(U::kHz)), + phase(phi.value_as(U::rad)) + { + if (std::isnan(frequency)) throw std::domain_error{"Frequency must be finite and convertible to kHz."}; + if (std::isnan(phase)) throw std::domain_error{"Phase must be finite and convertible to rad."}; + } // A 'box' stimulus with fixed onset time, duration, and constant amplitude. - static i_clamp box(double onset, double duration, double amplitude, double frequency = 0, double phase = 0) { - return i_clamp({{onset, amplitude}, {onset+duration, amplitude}, {onset+duration, 0.}}, frequency, phase); + static i_clamp box(const U::quantity& onset, + const U::quantity& duration, + const U::quantity& amplitude, + const U::quantity& frequency = 0*U::kHz, + const U::quantity& phase = 0*U::rad) { + return i_clamp({{onset, amplitude}, {onset+duration, amplitude}, {onset+duration, 0.*U::nA}}, + frequency, + phase); } - }; // Threshold detector description. struct ARB_SYMBOL_VISIBLE threshold_detector { - double threshold; + threshold_detector(const U::quantity& m): threshold(m.value_as(U::mV)) { + if (std::isnan(threshold)) throw std::domain_error{"Threshold must be finite and in [mV]."}; + } + static threshold_detector from_raw_millivolts(double v) { return {v*U::mV}; } + double threshold; // [mV] }; // Setter types for painting physical and ion parameters or setting // cell-wide default: struct ARB_SYMBOL_VISIBLE init_membrane_potential { - iexpr value = NAN; // [mV] + double value = NAN; // [mV] + iexpr scale = 1; // [1] + + init_membrane_potential() = default; + init_membrane_potential(const U::quantity& m, iexpr scale=1): + value(m.value_as(U::mV)), scale{scale} { + if (std::isnan(value)) throw std::domain_error{"Value must be finite and in [mV]."}; + } }; -struct ARB_SYMBOL_VISIBLE temperature_K { - iexpr value = NAN; // [K] + +struct ARB_SYMBOL_VISIBLE temperature { + double value = NAN; // [K] + iexpr scale = 1; // [1] + + temperature() = default; + temperature(const U::quantity& m, iexpr scale=1): + value(m.value_as(U::Kelvin)), scale{scale} { + if (std::isnan(value)) throw std::domain_error{"Value must be finite and in [K]."}; + } }; struct ARB_SYMBOL_VISIBLE axial_resistivity { - iexpr value = NAN; // [Ω·cm] + double value = NAN; // [Ω·cm] + iexpr scale = 1; // [1] + + axial_resistivity() = default; + axial_resistivity(const U::quantity& m, iexpr scale=1): + value(m.value_as(U::cm*U::Ohm)), scale{scale} { + if (std::isnan(value)) throw std::domain_error{"Value must be finite and in [Ω·cm]."}; + } }; struct ARB_SYMBOL_VISIBLE membrane_capacitance { - iexpr value = NAN; // [F/m²] + double value = NAN; // [F/m²] + iexpr scale = 1; // [1] + + membrane_capacitance() = default; + membrane_capacitance(const U::quantity& m, iexpr scale=1): + value(m.value_as(U::F/U::m2)), scale{scale} { + if (std::isnan(value)) throw std::domain_error{"Value must be finite and in [F/m²]."}; + } }; struct ARB_SYMBOL_VISIBLE init_int_concentration { std::string ion = ""; - iexpr value = NAN; // [mM] + double value = NAN; // [mM] + iexpr scale = 1; // [1] + + init_int_concentration() = default; + init_int_concentration(const std::string& ion, const U::quantity& m, iexpr scale=1): + ion{ion}, value(m.value_as(U::mM)), scale{scale} { + if (std::isnan(value)) throw std::domain_error{"Value must be finite and in [mM]."}; + } }; struct ARB_SYMBOL_VISIBLE ion_diffusivity { std::string ion = ""; - iexpr value = NAN; // [m^2/s] + double value = NAN; // [m²/s] + iexpr scale = 1; // [1] + + ion_diffusivity() = default; + ion_diffusivity(const std::string& ion, const U::quantity& m, iexpr scale=1): + ion{ion}, value(m.value_as(U::m2/U::s)), scale{scale} { + if (std::isnan(value)) throw std::domain_error{"Value must be finite and in [m²/s]."}; + } }; struct ARB_SYMBOL_VISIBLE init_ext_concentration { std::string ion = ""; - iexpr value = NAN; // [mM] + double value = NAN; // [mM] + iexpr scale = 1; // [1] + + init_ext_concentration() = default; + init_ext_concentration(const std::string& ion, const U::quantity& m, iexpr scale=1): + ion{ion}, value(m.value_as(U::mM)), scale{scale} { + if (std::isnan(value)) throw std::domain_error{"Value must be finite and in [mM]."}; + } }; struct ARB_SYMBOL_VISIBLE init_reversal_potential { std::string ion = ""; - iexpr value = NAN; // [mV] + double value = NAN; // [mV] + iexpr scale = 1; // [1] + + init_reversal_potential() = default; + init_reversal_potential(const std::string& ion, const U::quantity& m, iexpr scale=1): + ion{ion}, value(m.value_as(U::mV)), scale{scale} { + if (std::isnan(value)) throw std::domain_error{"Value must be finite and in [mV]."}; + } }; // Mechanism description, viz. mechanism name and @@ -150,8 +246,12 @@ struct ARB_SYMBOL_VISIBLE mechanism_desc { }; // implicit - mechanism_desc(std::string name): name_(std::move(name)) {} - mechanism_desc(const char* name): name_(name) {} + mechanism_desc(std::string name): name_(std::move(name)) { + if (name_.empty()) throw cable_cell_error("mechanism_desc: null name"); + } + mechanism_desc(const char* name): name_(name) { + if (name_.empty()) throw cable_cell_error("mechanism_desc: null name"); + } mechanism_desc() = default; mechanism_desc(const mechanism_desc&) = default; @@ -255,7 +355,7 @@ struct ARB_SYMBOL_VISIBLE scaled_mechanism { using paintable = std::variant<init_membrane_potential, axial_resistivity, - temperature_K, + temperature, membrane_capacitance, ion_diffusivity, init_int_concentration, @@ -274,7 +374,7 @@ using placeable = using defaultable = std::variant<init_membrane_potential, axial_resistivity, - temperature_K, + temperature, membrane_capacitance, ion_diffusivity, init_int_concentration, @@ -351,18 +451,32 @@ struct ARB_SYMBOL_VISIBLE cable_cell_global_properties { cable_cell_parameter_set default_parameters; // Convenience methods for adding a new ion together with default ion values. - void add_ion(const std::string& ion_name, int charge, double init_iconc, double init_econc, double init_revpot, double diffusivity=0.0) { + void add_ion(const std::string& ion_name, + int charge, + const U::quantity& init_iconc, + const U::quantity& init_econc, + const U::quantity& init_revpot, + const U::quantity& diffusivity=0.0*U::m2/U::s) { ion_species[ion_name] = charge; auto &ion_data = default_parameters.ion_data[ion_name]; - ion_data.init_int_concentration = init_iconc; - ion_data.init_ext_concentration = init_econc; - ion_data.init_reversal_potential = init_revpot; - ion_data.diffusivity = diffusivity; + ion_data.init_int_concentration = init_iconc.value_as(U::mM); + if (std::isnan(*ion_data.init_int_concentration)) throw std::domain_error("init_int_concentration must be finite and convertible to mM"); + ion_data.init_ext_concentration = init_econc.value_as(U::mM); + if (std::isnan(*ion_data.init_ext_concentration)) throw std::domain_error("init_ext_concentration must be finite and convertible to mM"); + ion_data.init_reversal_potential = init_revpot.value_as(U::mV); + if (std::isnan(*ion_data.init_reversal_potential)) throw std::domain_error("init_reversal_potential must be finite and convertible to mV"); + ion_data.diffusivity = diffusivity.value_as(U::m2/U::s); + if (std::isnan(*ion_data.diffusivity) || *ion_data.diffusivity < 0) throw std::domain_error("diffusivity must be positive, finite, and convertible to m2/s"); } - void add_ion(const std::string& ion_name, int charge, double init_iconc, double init_econc, mechanism_desc revpot_mechanism, double diffusivity=0.0) { - add_ion(ion_name, charge, init_iconc, init_econc, 0, diffusivity); + void add_ion(const std::string& ion_name, + int charge, + const U::quantity& init_iconc, + const U::quantity& init_econc, + mechanism_desc revpot_mechanism, + const U::quantity& diffusivity=0.0*U::m2/U::s) { + add_ion(ion_name, charge, init_iconc, init_econc, 0*U::mV, diffusivity); default_parameters.reversal_potential_method[ion_name] = std::move(revpot_mechanism); } }; diff --git a/arbor/include/arbor/event_generator.hpp b/arbor/include/arbor/event_generator.hpp index c378ef7d0382e2fc907e51f423f1a85e1325d85d..cab7e5fe2bf5c5e3ef7b33e4cd3f7a1c7c8c4784 100644 --- a/arbor/include/arbor/event_generator.hpp +++ b/arbor/include/arbor/event_generator.hpp @@ -1,10 +1,5 @@ #pragma once -#include <algorithm> -#include <cstdint> -#include <memory> -#include <random> -#include <type_traits> #include <optional> #include <arbor/assert.hpp> @@ -101,34 +96,29 @@ private: inline event_generator empty_generator( cell_local_label_type target, - float weight) -{ + float weight) { return event_generator(std::move(target), weight, schedule()); } // Generate events at integer multiples of dt that lie between tstart and tstop. -inline event_generator regular_generator( - cell_local_label_type target, - float weight, - time_type tstart, - time_type dt, - time_type tstop=terminal_time) -{ +inline event_generator regular_generator(cell_local_label_type target, + float weight, + const units::quantity& tstart, + const units::quantity& dt, + const units::quantity& tstop=terminal_time*units::ms) { return event_generator(std::move(target), weight, regular_schedule(tstart, dt, tstop)); } -template <typename RNG> -inline event_generator poisson_generator( - cell_local_label_type target, - float weight, - time_type tstart, - time_type rate_kHz, - const RNG& rng, - time_type tstop=terminal_time) -{ - return event_generator(std::move(target), weight, poisson_schedule(tstart, rate_kHz, rng, tstop)); +inline event_generator poisson_generator(cell_local_label_type target, + float weight, + const units::quantity& tstart, + const units::quantity& rate_kHz, + seed_type seed = default_seed, + const units::quantity& tstop=terminal_time*units::ms) { + // TODO(TH) handle seed + return event_generator(std::move(target), weight, poisson_schedule(tstart, rate_kHz, seed, tstop)); } @@ -137,10 +127,16 @@ inline event_generator poisson_generator( template<typename S> inline event_generator explicit_generator(cell_local_label_type target, float weight, - const S& s) -{ + const S& s) { return event_generator(std::move(target), weight, explicit_schedule(s)); } +template<typename S> inline +event_generator explicit_generator_from_milliseconds(cell_local_label_type target, + float weight, + const S& s) { + return event_generator(std::move(target), weight, explicit_schedule_from_milliseconds(s)); +} + } // namespace arb diff --git a/arbor/include/arbor/iexpr.hpp b/arbor/include/arbor/iexpr.hpp index 15d8452795945fae709e25cfc8d17dbb32455c11..c0eea2de90f80d661ed5dba461b166431ba53338 100644 --- a/arbor/include/arbor/iexpr.hpp +++ b/arbor/include/arbor/iexpr.hpp @@ -74,14 +74,14 @@ struct ARB_SYMBOL_VISIBLE iexpr { static iexpr distal_distance(region reg); static iexpr interpolation(double prox_value, - locset prox_list, - double dist_value, - locset dist_list); + locset prox_list, + double dist_value, + locset dist_list); static iexpr interpolation(double prox_value, - region prox_list, - double dist_value, - region dist_list); + region prox_list, + double dist_value, + region dist_list); static iexpr radius(double scale); diff --git a/arbor/include/arbor/lif_cell.hpp b/arbor/include/arbor/lif_cell.hpp index fedee7a2561f90d337913017c1feb2b1efc15b0a..e9d5c2fdf5962ff391dd15d1460dc5c4cc43a022 100644 --- a/arbor/include/arbor/lif_cell.hpp +++ b/arbor/include/arbor/lif_cell.hpp @@ -3,27 +3,30 @@ #include <arbor/serdes.hpp> #include <arbor/common_types.hpp> #include <arbor/export.hpp> +#include <arbor/units.hpp> namespace arb { +namespace U = arb::units; +using namespace U::literals; + // Model parameters of leaky integrate and fire neuron model. struct ARB_SYMBOL_VISIBLE lif_cell { cell_tag_type source; // Label of source. cell_tag_type target; // Label of target. // Neuronal parameters. - double tau_m = 10; // Membrane potential decaying constant [ms]. - double V_th = 10; // Firing threshold [mV]. - double C_m = 20; // Membrane capacitance [pF]. - double E_L = 0; // Resting potential [mV]. - double E_R = E_L; // Reset potential [mV]. - double V_m = E_L; // Initial value of the Membrane potential [mV]. - double t_ref = 2; // Refractory period [ms]. + U::quantity tau_m = 10_ms; // Membrane potential decaying constant [ms]. + U::quantity V_th = 10_mV; // Firing threshold [mV]. + U::quantity C_m = 20_pF; // Membrane capacitance [pF]. + U::quantity E_L = 0_mV; // Resting potential [mV]. + U::quantity E_R = 0_mV; // Reset potential [mV]. + U::quantity V_m = 0_mV; // Initial value of the Membrane potential [mV]. + U::quantity t_ref = 2_ms; // Refractory period [ms]. lif_cell() = default; lif_cell(cell_tag_type source, cell_tag_type target): source(std::move(source)), target(std::move(target)) {} - ARB_SERDES_ENABLE(lif_cell, source, target, tau_m, V_th, C_m, E_L, E_R, V_m, t_ref); }; // LIF probe metadata, to be passed to sampler callbacks. Intentionally left blank. diff --git a/arbor/include/arbor/morph/isometry.hpp b/arbor/include/arbor/morph/isometry.hpp index cb06ee28dd58145a51fbc3fba2f8c4fa122da05f..3c10bd1c51f3791f84932e84670bc0c995baa3ba 100644 --- a/arbor/include/arbor/morph/isometry.hpp +++ b/arbor/include/arbor/morph/isometry.hpp @@ -7,6 +7,7 @@ namespace arb { // Represent a 3-d isometry as a rotation (via quaterion q_) // and a subsequent translation (tx_, ty_, tz_). struct ARB_ARBOR_API isometry { + using quaternion = arb::math::quaternion; isometry() = default; @@ -28,7 +29,6 @@ struct ARB_ARBOR_API isometry { } private: - using quaternion = arb::math::quaternion; quaternion q_{1, 0, 0, 0}; double tx_ = 0, ty_ = 0, tz_ = 0; diff --git a/arbor/include/arbor/recipe.hpp b/arbor/include/arbor/recipe.hpp index 797490f320e421651b76f658bfb24848656765ae..dbcba5fcde4d0b11881827405f418b5593aa3904 100644 --- a/arbor/include/arbor/recipe.hpp +++ b/arbor/include/arbor/recipe.hpp @@ -11,6 +11,8 @@ namespace arb { +namespace U = arb::units; + struct probe_info { cell_tag_type tag; @@ -40,7 +42,6 @@ struct probe_info { // are notionally described in terms of external cell identifiers instead // of internal gids, but we are not making the distinction between the // two in the current code. These two types could well be merged. - template<typename L> struct cell_connection_base { // Connection end-points are represented by pairs @@ -48,11 +49,14 @@ struct cell_connection_base { L source; cell_local_label_type target; - float weight; - float delay; + float weight; // [()] + float delay; // [ms] - cell_connection_base(L src, cell_local_label_type dst, float w, float d): - source(std::move(src)), target(std::move(dst)), weight(w), delay(d) {} + cell_connection_base(L src, cell_local_label_type dst, float w, const U::quantity& d): + source(std::move(src)), target(std::move(dst)), weight(w), delay(d.value_as(U::ms)) { + if (std::isnan(weight)) throw std::out_of_range("Connection weight must be finite."); + if (std::isnan(delay) || delay < 0) throw std::out_of_range("Connection delay must be non-negative and infinite in units of [ms]."); + } }; using cell_connection = cell_connection_base<cell_global_label_type>; @@ -61,10 +65,12 @@ using ext_cell_connection = cell_connection_base<cell_remote_label_type>; struct gap_junction_connection { cell_global_label_type peer; cell_local_label_type local; - double weight; //unit-less + double weight; // [()] gap_junction_connection(cell_global_label_type peer, cell_local_label_type local, double g): - peer(std::move(peer)), local(std::move(local)), weight(g) {} + peer(std::move(peer)), local(std::move(local)), weight(g) { + if (std::isnan(weight)) throw std::out_of_range("Gap junction weight must be finite."); + } }; struct ARB_ARBOR_API has_gap_junctions { diff --git a/arbor/include/arbor/schedule.hpp b/arbor/include/arbor/schedule.hpp index da3921bc361511c4ff985b00e6f0f86eb5fcd112..8856cceac254feb9af5838d6df898179bf8e3b77 100644 --- a/arbor/include/arbor/schedule.hpp +++ b/arbor/include/arbor/schedule.hpp @@ -1,190 +1,39 @@ #pragma once #include <algorithm> -#include <iterator> #include <memory> -#include <random> #include <type_traits> #include <utility> #include <vector> +#include <random> #include <arbor/assert.hpp> #include <arbor/common_types.hpp> #include <arbor/util/extra_traits.hpp> #include <arbor/export.hpp> #include <arbor/serdes.hpp> +#include <arbor/units.hpp> // Time schedules for probe–sampler associations. namespace arb { +using engine_type = std::mt19937_64; +using seed_type = std::remove_cv_t<decltype(engine_type::default_seed)>; + +constexpr static auto default_seed = engine_type::default_seed; + using time_event_span = std::pair<const time_type*, const time_type*>; inline time_event_span as_time_event_span(const std::vector<time_type>& v) { - return {v.data(), v.data()+v.size()}; + return {v.data(), v.data() + v.size()}; } -// Common schedules - -// Default schedule is empty. - -struct ARB_ARBOR_API empty_schedule { - void reset() {} - time_event_span events(time_type t0, time_type t1) { - static time_type no_time; - return {&no_time, &no_time}; - } -}; - -// Schedule at k·dt for integral k≥0 within the interval [t0, t1). -struct ARB_ARBOR_API regular_schedule_impl { - explicit regular_schedule_impl(time_type t0, time_type dt, time_type t1): - t0_(t0), t1_(t1), dt_(dt), oodt_(1./dt) - { - if (t0_<0) t0_ = 0; - }; - - void reset() {} - time_event_span events(time_type t0, time_type t1); - - ARB_SERDES_ENABLE(regular_schedule_impl, t0_, t1_, dt_, oodt_); - -private: - time_type t0_, t1_, dt_; - time_type oodt_; - - std::vector<time_type> times_; -}; - -// Schedule at times given explicitly via a provided sorted sequence. -struct ARB_ARBOR_API explicit_schedule_impl { - explicit_schedule_impl(const explicit_schedule_impl&) = default; - explicit_schedule_impl(explicit_schedule_impl&&) = default; - - template <typename Seq> - explicit explicit_schedule_impl(const Seq& seq): - start_index_(0) - { - using std::begin; - using std::end; - - times_.assign(begin(seq), end(seq)); - arb_assert(std::is_sorted(times_.begin(), times_.end())); - } - - void reset() { - start_index_ = 0; - } - - time_event_span events(time_type t0, time_type t1); - - ARB_SERDES_ENABLE(explicit_schedule_impl, start_index_, times_); - -private: - std::ptrdiff_t start_index_; - std::vector<time_type> times_; -}; - -// Schedule at Poisson point process with rate 1/mean_dt, -// restricted to non-negative times. -template <typename RandomNumberEngine> -class poisson_schedule_impl { -public: - poisson_schedule_impl(time_type tstart, time_type rate_kHz, const RandomNumberEngine& rng, time_type tstop): - tstart_(tstart), exp_(rate_kHz), rng_(rng), reset_state_(rng), next_(tstart), tstop_(tstop) - { - arb_assert(tstart_>=0); - arb_assert(tstart_ <= tstop_); - step(); - } - - void reset() { - rng_ = reset_state_; - next_ = tstart_; - step(); - } - - time_event_span events(time_type t0, time_type t1) { - // if we start after the maximal allowed time, we have nothing to do - if (t0 >= tstop_) return {}; - - // restrict by maximal allowed time - t1 = std::min(t1, tstop_); - - times_.clear(); - - while (next_<t0) { step(); } - - while (next_<t1) { - times_.push_back(next_); - step(); - } - - return as_time_event_span(times_); - } - - void step() { next_ += exp_(rng_); } - - time_type tstart_; - std::exponential_distribution<time_type> exp_; - RandomNumberEngine rng_; - RandomNumberEngine reset_state_; - time_type next_; - std::vector<time_type> times_; - time_type tstop_; -}; - // Type erased wrapper // A schedule describes a sequence of time values used for sampling. Schedules // are queried monotonically in time: if two method calls `events(t0, t1)` // and `events(t2, t3)` are made without an intervening call to `reset()`, // then 0 ≤ _t0_ ≤ _t1_ ≤ _t2_ ≤ _t3_. - -template<typename K> -void serialize(arb::serializer& s, const K& k, const arb::explicit_schedule_impl&); -template<typename K> -void deserialize(arb::serializer& s, const K& k, arb::explicit_schedule_impl&); - -template<typename K> -void serialize(arb::serializer& s, const K& k, const arb::regular_schedule_impl&); -template<typename K> -void deserialize(arb::serializer& s, const K& k, arb::regular_schedule_impl&); - -template <typename K> -ARB_ARBOR_API void serialize(::arb::serializer& ser, - const K& k, - const arb::empty_schedule& t) { - ser.begin_write_map(::arb::to_serdes_key(k)); - ser.end_write_map(); -} - -template <typename K> -ARB_ARBOR_API void deserialize(::arb::serializer& ser, - const K& k, - arb::empty_schedule& t) { - ser.begin_read_map(::arb::to_serdes_key(k)); - ser.end_read_map(); -} - -// These are custom to get the reset in. -template<typename K, typename R> -void serialize(::arb::serializer& ser, const K& k, const ::arb::poisson_schedule_impl<R>& t) { - ser.begin_write_map(arb::to_serdes_key(k)); - ARB_SERDES_WRITE(tstart_); - ARB_SERDES_WRITE(tstop_); - ser.end_write_map(); -} - -template<typename K, typename R> -void deserialize(::arb::serializer& ser, const K& k, ::arb::poisson_schedule_impl<R>& t) { - ser.begin_read_map(arb::to_serdes_key(k)); - ARB_SERDES_READ(tstart_); - ARB_SERDES_READ(tstop_); - ser.end_read_map(); - t.reset(); -} - -class schedule { -public: +struct ARB_ARBOR_API schedule { schedule(); template <typename Impl, typename = std::enable_if_t<!std::is_same_v<util::remove_cvref_t<Impl>, schedule>>> @@ -206,12 +55,13 @@ public: return *this; } - time_event_span events(time_type t0, time_type t1) { - return impl_->events(t0, t1); - } + time_event_span events(time_type t0, time_type t1) { return impl_->events(t0, t1); } void reset() { impl_->reset(); } + // Discard the next n events. Used in tests. + auto discard(std::size_t n) { return impl_->discard(n); } + template<typename K> friend ARB_ARBOR_API void serialize(serializer& s, const K& k, const schedule& v) { v.impl_->t_serialize(s, to_serdes_key(k)); } template<typename K> @@ -219,10 +69,10 @@ public: )); } private: - struct interface { virtual time_event_span events(time_type t0, time_type t1) = 0; virtual void reset() = 0; + virtual void discard(std::size_t n) = 0; virtual std::unique_ptr<interface> clone() = 0; virtual ~interface() {} virtual void t_serialize(serializer&, const std::string&k) const = 0; @@ -237,46 +87,37 @@ private: struct wrap: interface { explicit wrap(const Impl& impl): wrapped(impl) {} explicit wrap(Impl&& impl): wrapped(std::move(impl)) {} - virtual time_event_span events(time_type t0, time_type t1) override { return wrapped.events(t0, t1); } - virtual void reset() override { wrapped.reset(); } - virtual iface_ptr clone() override { return std::make_unique<wrap<Impl>>(wrapped); } - virtual void t_serialize(serializer& s, const std::string& k) const override { serialize(s, k, wrapped); } - virtual void t_deserialize(serializer& s, const std::string& k) override { deserialize(s, k, wrapped); } + time_event_span events(time_type t0, time_type t1) override { return wrapped.events(t0, t1); } + void reset() override { wrapped.reset(); } + void discard(std::size_t n) override { return wrapped.discard(n); } + iface_ptr clone() override { return std::make_unique<wrap<Impl>>(wrapped); } + void t_serialize(serializer& s, const std::string& k) const override { wrapped.t_serialize(s, k); } + void t_deserialize(serializer& s, const std::string& k) override { wrapped.t_deserialize(s, k); } Impl wrapped; }; }; // Constructors -inline schedule::schedule(): schedule(empty_schedule{}) {} -inline schedule regular_schedule(time_type t0, - time_type dt, - time_type t1 = std::numeric_limits<time_type>::max()) { - return schedule(regular_schedule_impl(t0, dt, t1)); -} +/// Regular schedule with start `t0`, interval `dt`, and optional end `t1`. +schedule ARB_ARBOR_API regular_schedule(const units::quantity& t0, + const units::quantity& dt, + const units::quantity& t1 = std::numeric_limits<time_type>::max()*units::ms); -inline schedule regular_schedule(time_type dt) { - return regular_schedule(0, dt); -} +/// Regular schedule with interval `dt`. +schedule ARB_ARBOR_API regular_schedule(const units::quantity& dt); -template <typename Seq> -inline schedule explicit_schedule(const Seq& seq) { - return schedule(explicit_schedule_impl(seq)); -} +schedule ARB_ARBOR_API explicit_schedule(const std::vector<units::quantity>& seq); +schedule ARB_ARBOR_API explicit_schedule_from_milliseconds(const std::vector<time_type>& seq); -inline schedule explicit_schedule(const std::initializer_list<time_type>& seq) { - return schedule(explicit_schedule_impl(seq)); -} +schedule ARB_ARBOR_API poisson_schedule(const units::quantity& tstart, + const units::quantity& rate, + seed_type seed = default_seed, + const units::quantity& tstop=terminal_time*units::ms); -template <typename RandomNumberEngine> -inline schedule poisson_schedule(time_type rate_kHz, const RandomNumberEngine& rng, time_type tstop=terminal_time) { - return schedule(poisson_schedule_impl<RandomNumberEngine>(0., rate_kHz, rng, tstop)); -} - -template <typename RandomNumberEngine> -inline schedule poisson_schedule(time_type tstart, time_type rate_kHz, const RandomNumberEngine& rng, time_type tstop=terminal_time) { - return schedule(poisson_schedule_impl<RandomNumberEngine>(tstart, rate_kHz, rng, tstop)); -} +schedule ARB_ARBOR_API poisson_schedule(const units::quantity& rate, + seed_type seed = default_seed, + const units::quantity& tstop=terminal_time*units::ms); } // namespace arb diff --git a/arbor/include/arbor/simulation.hpp b/arbor/include/arbor/simulation.hpp index c6cf845d9c5ca0ced75d30bde2edd191da2fb428..b5de7b4a5cd3f416ddceddd541fa8f2904f3d280 100644 --- a/arbor/include/arbor/simulation.hpp +++ b/arbor/include/arbor/simulation.hpp @@ -1,8 +1,6 @@ #pragma once -#include <array> #include <memory> -#include <unordered_map> #include <vector> #include <functional> @@ -50,7 +48,7 @@ public: void reset(); - time_type run(time_type tfinal, time_type dt); + time_type run(const units::quantity& tfinal, const units::quantity& dt); // Minimum delay in network τ time_type min_delay(); diff --git a/arbor/include/arbor/spike_event.hpp b/arbor/include/arbor/spike_event.hpp index d3ffdb5024443798f7d2cfbd230905a580a94846..d44cd7cd449b7b113a5c6e6e503758b51466190e 100644 --- a/arbor/include/arbor/spike_event.hpp +++ b/arbor/include/arbor/spike_event.hpp @@ -3,7 +3,6 @@ #include <arbor/arb_types.hpp> #include <iosfwd> -#include <tuple> #include <vector> #include <arbor/export.hpp> diff --git a/arbor/include/arbor/units.hpp b/arbor/include/arbor/units.hpp new file mode 100644 index 0000000000000000000000000000000000000000..c361209a561ebbd6dccde84a5c98a4fc80ff73d9 --- /dev/null +++ b/arbor/include/arbor/units.hpp @@ -0,0 +1,189 @@ +#pragma once + +#include <units/units.hpp> + +namespace arb::units { + +using quantity = ::units::precise_measurement; + +// Allow unary minus on quantities. Seemingly doesn't catch literals such as -10_mV +inline quantity operator-(const quantity& q) { return (-1*q); } + +using unit = ::units::precise_unit; +using ::units::to_string; +using ::units::unit_cast_from_string; + + +using ::units::precise::pico; +using ::units::precise::nano; +using ::units::precise::micro; +using ::units::precise::milli; +using ::units::precise::centi; +using ::units::precise::deci; + +using ::units::precise::kilo; +using ::units::precise::mega; +using ::units::precise::giga; + +using ::units::precise::deg; +using ::units::precise::rad; + +constexpr inline auto Celsius = ::units::precise::degC; +constexpr inline auto Kelvin = ::units::precise::Kelvin; + +using ::units::precise::s; +using ::units::precise::ms; +constexpr inline auto us = micro * s; +using ::units::precise::ns; + +using ::units::precise::m; +constexpr inline auto cm = centi * m; +constexpr inline auto mm = milli * m; +constexpr inline auto um = micro * m; +constexpr inline auto nm = nano * m; + +constexpr inline auto Ohm = ::units::precise::ohm; +constexpr inline auto kOhm = kilo * Ohm; +constexpr inline auto MOhm = mega * Ohm; + +// Siemens +constexpr inline auto S = Ohm.pow(-1); +constexpr inline auto mS = milli * S; +constexpr inline auto uS = micro * S; + +constexpr inline auto A = ::units::precise::Ampere; +constexpr inline auto mA = milli * A; +constexpr inline auto uA = micro * A; +constexpr inline auto nA = nano * A; +constexpr inline auto pA = pico * A; + +constexpr inline auto V = ::units::precise::volt; +constexpr inline auto mV = milli * V; + +constexpr inline auto Hz = ::units::precise::second.pow(-1); +constexpr inline auto kHz = kilo * Hz; + +constexpr inline auto F = ::units::precise::farad; +constexpr inline auto mF = milli * F; +constexpr inline auto uF = micro * F; +constexpr inline auto nF = nano * F; +constexpr inline auto pF = pico * F; + +constexpr inline auto m2 = m*m; +constexpr inline auto cm2 = cm*cm; +constexpr inline auto mm2 = mm*mm; +constexpr inline auto um2 = um*um; +constexpr inline auto nm2 = nm*nm; + +constexpr inline auto nil = ::units::precise::one; + +// Coulomb +constexpr inline auto C = ::units::precise::coulomb; + +// mol and molarity +using ::units::precise::mol; +constexpr inline auto M = mol / m.pow(3); +constexpr inline auto mM = milli * M; + +using ::units::is_valid; + +namespace literals { +constexpr inline quantity operator ""_s(long double v) { return v*s; } +constexpr inline quantity operator ""_ms(long double v) { return v*ms; } +constexpr inline quantity operator ""_us(long double v) { return v*us; } +constexpr inline quantity operator ""_ns(long double v) { return v*ns; } + +constexpr inline quantity operator ""_m(long double v) { return v*m; } +constexpr inline quantity operator ""_cm(long double v) { return v*cm; } +constexpr inline quantity operator ""_mm(long double v) { return v*mm; } +constexpr inline quantity operator ""_um(long double v) { return v*um; } +constexpr inline quantity operator ""_nm(long double v) { return v*nm; } + +constexpr inline quantity operator ""_m2(long double v) { return v*m2; } +constexpr inline quantity operator ""_cm2(long double v) { return v*cm2; } +constexpr inline quantity operator ""_mm2(long double v) { return v*mm2; } +constexpr inline quantity operator ""_um2(long double v) { return v*um2; } +constexpr inline quantity operator ""_nm2(long double v) { return v*nm2; } + +constexpr inline quantity operator ""_Ohm(long double v) { return v*Ohm; } +constexpr inline quantity operator ""_kOhm(long double v) { return v*kOhm; } +constexpr inline quantity operator ""_MOhm(long double v) { return v*MOhm; } + +constexpr inline quantity operator ""_S(long double v) { return v*S; } +constexpr inline quantity operator ""_mS(long double v) { return v*mS; } +constexpr inline quantity operator ""_uS(long double v) { return v*uS; } + +constexpr inline quantity operator ""_A(long double v) { return v*A; } +constexpr inline quantity operator ""_mA(long double v) { return v*mA; } +constexpr inline quantity operator ""_uA(long double v) { return v*uA; } +constexpr inline quantity operator ""_nA(long double v) { return v*nA; } +constexpr inline quantity operator ""_pA(long double v) { return v*pA; } + +constexpr inline quantity operator ""_V(long double v) { return v*V; } +constexpr inline quantity operator ""_mV(long double v) { return v*mV; } + +constexpr inline quantity operator ""_Hz(long double v) { return v*Hz; } +constexpr inline quantity operator ""_kHz(long double v) { return v*kHz; } + +constexpr inline quantity operator ""_F(long double v) { return v*F; } +constexpr inline quantity operator ""_mF(long double v) { return v*mF; } +constexpr inline quantity operator ""_uF(long double v) { return v*uF; } +constexpr inline quantity operator ""_nF(long double v) { return v*nF; } +constexpr inline quantity operator ""_pF(long double v) { return v*pF; } + +constexpr inline quantity operator ""_mol(long double v) { return v*mol; } +constexpr inline quantity operator ""_M(long double v) { return v*M; } +constexpr inline quantity operator ""_mM(long double v) { return v*mM; } + +constexpr inline quantity operator ""_C(long double v) { return v*C; } + +constexpr inline quantity operator ""_s(unsigned long long v) { return v*s; } +constexpr inline quantity operator ""_ms(unsigned long long v) { return v*ms; } +constexpr inline quantity operator ""_us(unsigned long long v) { return v*us; } +constexpr inline quantity operator ""_ns(unsigned long long v) { return v*ns; } + +constexpr inline quantity operator ""_m(unsigned long long v) { return v*m; } +constexpr inline quantity operator ""_cm(unsigned long long v) { return v*cm; } +constexpr inline quantity operator ""_mm(unsigned long long v) { return v*mm; } +constexpr inline quantity operator ""_um(unsigned long long v) { return v*um; } +constexpr inline quantity operator ""_nm(unsigned long long v) { return v*nm; } + +constexpr inline quantity operator ""_m2(unsigned long long v) { return v*m2; } +constexpr inline quantity operator ""_cm2(unsigned long long v) { return v*cm2; } +constexpr inline quantity operator ""_mm2(unsigned long long v) { return v*mm2; } +constexpr inline quantity operator ""_um2(unsigned long long v) { return v*um2; } +constexpr inline quantity operator ""_nm2(unsigned long long v) { return v*nm2; } + +constexpr inline quantity operator ""_Ohm(unsigned long long v) { return v*Ohm; } +constexpr inline quantity operator ""_kOhm(unsigned long long v) { return v*kOhm; } +constexpr inline quantity operator ""_MOhm(unsigned long long v) { return v*MOhm; } + +constexpr inline quantity operator ""_S(unsigned long long v) { return v*S; } +constexpr inline quantity operator ""_mS(unsigned long long v) { return v*mS; } +constexpr inline quantity operator ""_uS(unsigned long long v) { return v*uS; } + +constexpr inline quantity operator ""_A(unsigned long long v) { return v*A; } +constexpr inline quantity operator ""_mA(unsigned long long v) { return v*mA; } +constexpr inline quantity operator ""_uA(unsigned long long v) { return v*uA; } +constexpr inline quantity operator ""_nA(unsigned long long v) { return v*nA; } +constexpr inline quantity operator ""_pA(unsigned long long v) { return v*pA; } + +constexpr inline quantity operator ""_V(unsigned long long v) { return v*V; } +constexpr inline quantity operator ""_mV(unsigned long long v) { return v*mV; } + +constexpr inline quantity operator ""_Hz(unsigned long long v) { return v*Hz; } +constexpr inline quantity operator ""_kHz(unsigned long long v) { return v*kHz; } + +constexpr inline quantity operator ""_F(unsigned long long v) { return v*F; } +constexpr inline quantity operator ""_mF(unsigned long long v) { return v*mF; } +constexpr inline quantity operator ""_uF(unsigned long long v) { return v*uF; } +constexpr inline quantity operator ""_nF(unsigned long long v) { return v*nF; } +constexpr inline quantity operator ""_pF(unsigned long long v) { return v*pF; } + +constexpr inline quantity operator ""_mol(unsigned long long v) { return v*mol; } +constexpr inline quantity operator ""_M(unsigned long long v) { return v*M; } +constexpr inline quantity operator ""_mM(unsigned long long v) { return v*mM; } + +constexpr inline quantity operator ""_C(unsigned long long v) { return v*C; } +} // literals +} // units diff --git a/arbor/lif_cell_group.cpp b/arbor/lif_cell_group.cpp index 6698d0edefa9ea3584b2bbc0a93c5a3c0f64fed4..5af84c88748e3bd2d406c0ac397b31a9e3c8a202 100644 --- a/arbor/lif_cell_group.cpp +++ b/arbor/lif_cell_group.cpp @@ -18,7 +18,7 @@ lif_cell_group::lif_cell_group(const std::vector<cell_gid_type>& gids, for (auto gid: gids_) { const auto& cell = util::any_cast<lif_cell>(rec.get_cell_description(gid)); // set up cell state - cells_.push_back(cell); + cells_.emplace_back(cell); last_time_updated_.push_back(0.0); last_time_sampled_.push_back(-1.0); // tell our caller about this cell's connections @@ -95,7 +95,7 @@ void lif_cell_group::reset() { // produce voltage V_m at t1, given cell state at t0 and no spikes in [t0, t1) static double -lif_decay(const lif_cell& cell, double t0, double t1) { +lif_decay(const lif_lowered_cell& cell, double t0, double t1) { return (cell.V_m - cell.E_L)*exp((t0 - t1)/cell.tau_m) + cell.E_L; } diff --git a/arbor/lif_cell_group.hpp b/arbor/lif_cell_group.hpp index 9572d06bd8ea7f5d7b15754e7b98b7d15b509393..ff922334adc7b6683c7c043e4b2845155d3a1549 100644 --- a/arbor/lif_cell_group.hpp +++ b/arbor/lif_cell_group.hpp @@ -16,6 +16,46 @@ namespace arb { +// Model parameters of leaky integrate and fire neuron model. +struct ARB_SYMBOL_VISIBLE lif_lowered_cell { + cell_tag_type source; // Label of source. + cell_tag_type target; // Label of target. + + // Neuronal parameters. + double tau_m = 10; // Membrane potential decaying constant [ms]. + double V_th = 10; // Firing threshold [mV]. + double C_m = 20; // Membrane capacitance [pF]. + double E_L = 0; // Resting potential [mV]. + double E_R = E_L; // Reset potential [mV]. + double V_m = E_L; // Initial value of the Membrane potential [mV]. + double t_ref = 2; // Refractory period [ms]. + + lif_lowered_cell() = default; + lif_lowered_cell(const lif_cell& lif) { + source = lif.source; + target = lif.target; + + tau_m = lif.tau_m.value_as(U::ms); + V_th = lif.V_th.value_as(U::mV); + C_m = lif.C_m.value_as(U::pF); + E_L = lif.E_L.value_as(U::mV); + E_R = lif.E_R.value_as(U::mV); + V_m = lif.V_m.value_as(U::mV); + t_ref = lif.t_ref.value_as(U::ms); + + if (std::isnan(V_th)) throw std::out_of_range("V_th must be finite and in [mV]"); + if (std::isnan(tau_m) || tau_m < 0) throw std::out_of_range("tau_m must be positive, finite, and in [ms]"); + if (std::isnan(C_m) || C_m < 0) throw std::out_of_range("C_m must be positive, finite, and in [pF]"); + if (std::isnan(E_L)) throw std::out_of_range("E_L must be finite and in [mV]"); + if (std::isnan(E_R)) throw std::out_of_range("E_R must be finite and in [mV]"); + if (std::isnan(V_m)) throw std::out_of_range("V_m must be finite and in [mV]"); + if (std::isnan(t_ref) || t_ref < 0) throw std::out_of_range("t_ref must be positive, finite, and in [ms]"); + } + + ARB_SERDES_ENABLE(lif_lowered_cell, source, target, tau_m, V_th, C_m, E_L, E_R, V_m, t_ref); +}; + + struct ARB_ARBOR_API lif_cell_group: public cell_group { lif_cell_group() = default; @@ -59,7 +99,7 @@ private: std::vector<cell_gid_type> gids_; // Cells that belong to this group. - std::vector<lif_cell> cells_; + std::vector<lif_lowered_cell> cells_; // Spikes that are generated (not necessarily sorted). std::vector<spike> spikes_; diff --git a/arbor/schedule.cpp b/arbor/schedule.cpp index 2a0d6befd6028c2f9c3c92def54b914f19f21a2d..b31545d1d60a623ed86cbca5e39f67ae6e3e86b5 100644 --- a/arbor/schedule.cpp +++ b/arbor/schedule.cpp @@ -1,53 +1,269 @@ #include <algorithm> -#include <iterator> -#include <numeric> -#include <utility> #include <vector> #include <arbor/common_types.hpp> #include <arbor/schedule.hpp> -// Implementations for specific schedules. - namespace arb { -// Regular schedule implementation. +// Schedule at Poisson point process with rate 1/mean_dt, +// restricted to non-negative times. +struct poisson_schedule_impl { + poisson_schedule_impl(time_type tstart, time_type rate_kHz, seed_type seed, time_type tstop): + tstart_(tstart), rate_(rate_kHz), exp_(rate_kHz), rng_(seed), seed_(seed), next_(tstart), tstop_(tstop) { + if (!std::isfinite(tstart_)) throw std::domain_error("Poisson schedule: start must be finite and in [ms]"); + if (!std::isfinite(tstop_)) throw std::domain_error("Poisson schedule: stop must be finite and in [ms]"); + if (!std::isfinite(rate_kHz)) throw std::domain_error("Poisson schedule: rate must be finite and in [kHz]"); + if (!std::isfinite(tstart_) || tstart_ < 0) throw std::domain_error("Poisson schedule: start must be >= 0 and finite."); + if (!std::isfinite(tstop_) || tstop_ < tstart_) throw std::domain_error("Poisson schedule: stop must be >= start and finite."); + step(); + } + + void reset() { + rng_ = engine_type{seed_}; + if (discard_ > 0) rng_.discard(discard_); + exp_ = std::exponential_distribution<time_type>{rate_}; + next_ = tstart_; + step(); + } + + void discard(std::size_t n) { discard_ = n; reset(); } -time_event_span regular_schedule_impl::events(time_type t0, time_type t1) { - times_.clear(); + time_event_span events(time_type t0, time_type t1) { + // if we start after the maximal allowed time, we have nothing to do + if (t0 >= tstop_) return {}; - t0 = std::max(t0, t0_); - t1 = std::min(t1, t1_); + // restrict by maximal allowed time + t1 = std::min(t1, tstop_); - if (t1>t0) { - times_.reserve(1+std::size_t((t1-t0)*oodt_)); + times_.clear(); - long long n = t0*oodt_; - time_type t = n*dt_; + while (next_ < t0) { step(); } - while (t<t0) { - t = (++n)*dt_; + while (next_ < t1) { + times_.push_back(next_); + step(); } - while (t<t1) { - times_.push_back(t); - t = (++n)*dt_; + return as_time_event_span(times_); + } + + void step() { next_ += exp_(rng_); } + + template<typename K> + void t_serialize(::arb::serializer& ser, const K& k) const { + const auto& t = *this; + ser.begin_write_map(arb::to_serdes_key(k)); + ARB_SERDES_WRITE(tstart_); + ARB_SERDES_WRITE(tstop_); + ser.end_write_map(); + } + + template<typename K> + void t_deserialize(::arb::serializer& ser, const K& k) { + auto& t = *this; + ser.begin_read_map(arb::to_serdes_key(k)); + ARB_SERDES_READ(tstart_); + ARB_SERDES_READ(tstop_); + ser.end_read_map(); + t.reset(); + } + + time_type tstart_; + time_type rate_; + std::exponential_distribution<time_type> exp_; + engine_type rng_; + seed_type seed_; + time_type next_; + std::vector<time_type> times_; + time_type tstop_; + std::size_t discard_ = 0; +}; + +schedule poisson_schedule(const units::quantity& tstart, + const units::quantity& rate, + seed_type seed, + const units::quantity& tstop) { + return schedule(poisson_schedule_impl(tstart.value_as(units::ms), + rate.value_as(units::kHz), + seed, + tstop.value_as(units::ms))); +} + +schedule poisson_schedule(const units::quantity& rate, + seed_type seed, + const units::quantity& tstop) { + return poisson_schedule(0.*units::ms, rate, seed, tstop); +} + + +struct empty_schedule_impl { + void reset() {} + time_event_span events(time_type t0, time_type t1) { + static time_type no_time; + return {&no_time, &no_time}; + } + + + void t_serialize(::arb::serializer& ser, + const std::string& k) const { + ser.begin_write_map(::arb::to_serdes_key(k)); + ser.end_write_map(); + } + + void t_deserialize(::arb::serializer& ser, + const std::string& k) { + ser.begin_read_map(::arb::to_serdes_key(k)); + ser.end_read_map(); + } + + void discard(std::size_t) {} +}; + +schedule::schedule(): schedule(empty_schedule_impl{}) {} + +// Schedule at k·dt for integral k≥0 within the interval [t0, t1). +struct ARB_ARBOR_API regular_schedule_impl { + explicit regular_schedule_impl(time_type t0, time_type dt, time_type t1): + t0_(t0), t1_(t1), dt_(dt), oodt_(1./dt) { + if (!std::isfinite(t0_)) throw std::domain_error("Regular schedule: start must be finite and in [ms]"); + if (!std::isfinite(t1_)) throw std::domain_error("Regular schedule: stop must be finite and in [ms]"); + if (!std::isfinite(dt_)) throw std::domain_error("Regular schedule: step must be finite and in [ms]"); + if (dt_ <= 0) throw std::domain_error("regular schedule: dt must be > 0 and finite."); + if (t0_ < 0) throw std::domain_error("regular schedule: start must be >= 0 and finite."); + if (t1_ < t0_) throw std::domain_error("regular schedule: stop must be >= start and finite."); + }; + + void reset() {} + + ARB_SERDES_ENABLE(regular_schedule_impl, t0_, t1_, dt_, oodt_); + + template<typename K> + void t_serialize(::arb::serializer& ser, const K& k) const { + const auto& t = *this; + ser.begin_write_map(arb::to_serdes_key(k)); + ARB_SERDES_WRITE(t0_); + ARB_SERDES_WRITE(t1_); + ARB_SERDES_WRITE(dt_); + ser.end_write_map(); + } + + template<typename K> + void t_deserialize(::arb::serializer& ser, const K& k) { + auto& t = *this; + ser.begin_read_map(arb::to_serdes_key(k)); + ARB_SERDES_READ(t0_); + ARB_SERDES_READ(t1_); + ARB_SERDES_READ(dt_); + oodt_ = 1.0/dt_; + ser.end_read_map(); + } + + time_event_span events(time_type t0, time_type t1) { + times_.clear(); + + t0 = std::max(t0, t0_); + t1 = std::min(t1, t1_); + + if (t1>t0) { + times_.reserve(1+std::size_t((t1-t0)*oodt_)); + + long long n = t0*oodt_; + time_type t = n*dt_; + + while (t<t0) { + t = (++n)*dt_; + } + + while (t<t1) { + times_.push_back(t); + t = (++n)*dt_; + } } + + return as_time_event_span(times_); } - return as_time_event_span(times_); + void discard(std::size_t) {} + + time_type t0_, t1_, dt_; + time_type oodt_; + + std::vector<time_type> times_; +}; + +schedule regular_schedule(const units::quantity& t0, + const units::quantity& dt, + const units::quantity& t1) { + return schedule(regular_schedule_impl(t0.value_as(units::ms), + dt.value_as(units::ms), + t1.value_as(units::ms))); } -// Explicit schedule implementation. +schedule regular_schedule(const units::quantity& dt) { return regular_schedule(0*units::ms, dt); } -time_event_span explicit_schedule_impl::events(time_type t0, time_type t1) { - time_event_span view = as_time_event_span(times_); +// Schedule at times given explicitly via a provided sorted sequence. +struct explicit_schedule_impl { + explicit_schedule_impl(const explicit_schedule_impl&) = default; + explicit_schedule_impl(explicit_schedule_impl&&) = default; - const time_type* lb = std::lower_bound(view.first+start_index_, view.second, t0); - const time_type* ub = std::lower_bound(lb, view.second, t1); + explicit explicit_schedule_impl(std::vector<time_type> seq): + start_index_(0), times_(std::move(seq)) { + time_type last = -1; + for (auto t: times_) { + if (!std::isfinite(t)) throw std::domain_error("explicit schedule: times must be finite and in [ms]"); + if (t < 0) throw std::domain_error("explicit schedule: times must be >= 0 and finite."); + if (t < last) throw std::domain_error("explicit schedule: times must be sorted."); + last = t; + } + } - start_index_ = ub-view.first; - return {lb, ub}; + void reset() { start_index_ = 0; } + + time_event_span events(time_type t0, time_type t1) { + time_event_span view = as_time_event_span(times_); + + const time_type* lb = std::lower_bound(view.first+start_index_, view.second, t0); + const time_type* ub = std::lower_bound(lb, view.second, t1); + + start_index_ = ub-view.first; + return {lb, ub}; + } + + template<typename K> + void t_serialize(::arb::serializer& ser, const K& k) const { + const auto& t = *this; + ser.begin_write_map(arb::to_serdes_key(k)); + ARB_SERDES_WRITE(start_index_); + ARB_SERDES_WRITE(times_); + ser.end_write_map(); + } + + template<typename K> + void t_deserialize(::arb::serializer& ser, const K& k) { + auto& t = *this; + ser.begin_read_map(arb::to_serdes_key(k)); + ARB_SERDES_READ(start_index_); + ARB_SERDES_READ(times_); + ser.end_read_map(); + } + + void discard(std::size_t) {} + + std::ptrdiff_t start_index_; + std::vector<time_type> times_; +}; + +schedule explicit_schedule(const std::vector<units::quantity>& seq) { + std::vector<time_type> res; + res.reserve(seq.size()); + for (const auto& t: seq) res.push_back(t.value_as(units::ms)); + return schedule(explicit_schedule_impl(std::move(res))); } +schedule explicit_schedule_from_milliseconds(const std::vector<time_type>& seq) { + return schedule(explicit_schedule_impl(seq)); +} + + } // namespace arb diff --git a/arbor/simulation.cpp b/arbor/simulation.cpp index dac25d6fef281e67b90fd5ca5a496a466d9539a0..95963e85fd13f6067d271003d16d1dc9322fc079 100644 --- a/arbor/simulation.cpp +++ b/arbor/simulation.cpp @@ -1,5 +1,4 @@ #include <memory> -#include <set> #include <vector> #include <arbor/export.hpp> @@ -15,13 +14,10 @@ #include "cell_group.hpp" #include "cell_group_factory.hpp" #include "communication/communicator.hpp" -#include "execution_context.hpp" #include "merge_events.hpp" #include "thread_private_spike_store.hpp" #include "threading/threading.hpp" -#include "util/filter.hpp" #include "util/maputil.hpp" -#include "util/partition.hpp" #include "util/span.hpp" #include "profile/profiler_macro.hpp" @@ -398,6 +394,9 @@ time_type simulation_state::run(time_type tfinal, time_type dt) { // Requires state at end of run(), with epoch_.id==k: // * U(k) and D(k) have completed. + if (!std::isfinite(tfinal) || tfinal < 0) throw std::domain_error("simulation: tfinal must be finite, positive, and in [ms]"); + if (!std::isfinite(dt) || tfinal < 0) throw std::domain_error("simulation: dt must be finite, positive, and in [ms]"); + if (tfinal<=epoch_.t1) return epoch_.t1; // Compute following epoch, with max time tfinal. @@ -596,11 +595,12 @@ void simulation::reset() { void simulation::update(const connectivity& rec) { impl_->update(rec); } -time_type simulation::run(time_type tfinal, time_type dt) { - if (dt <= 0.0) { - throw domain_error("Finite time-step must be supplied."); - } - return impl_->run(tfinal, dt); +time_type simulation::run(const units::quantity& tfinal, const units::quantity& dt) { + auto dt_ms = dt.value_as(units::ms); + if (dt_ms <= 0.0 || std::isnan(dt_ms)) throw domain_error("Finite time-step must be supplied."); + auto tfinal_ms = tfinal.value_as(units::ms); + if (tfinal_ms <= 0.0 || std::isnan(tfinal_ms)) throw domain_error("Finite time-step must be supplied."); + return impl_->run(tfinal_ms, dt_ms); } sampler_association_handle simulation::add_sampler( diff --git a/arborio/cableio.cpp b/arborio/cableio.cpp index b0383b74a922e58eacff3e3b424e40c8ac6d9f3a..4ca05cc64a9c0362486aa49fe449172acd15b6cc 100644 --- a/arborio/cableio.cpp +++ b/arborio/cableio.cpp @@ -19,7 +19,7 @@ namespace arborio { using namespace arb; -ARB_ARBORIO_API std::string acc_version() {return "0.1-dev";} +ARB_ARBORIO_API std::string acc_version() {return "0.9-dev";} cableio_parse_error::cableio_parse_error(const std::string& msg, const arb::src_location& loc): arb::arbor_exception(msg+" at :"+ @@ -44,28 +44,31 @@ s_expr mksexp(const iexpr& j) { return parse_s_expr(s.str()); } s_expr mksexp(const init_membrane_potential& p) { - return slist("membrane-potential"_symbol, mksexp(p.value)); + return slist("membrane-potential"_symbol, p.value, mksexp(p.scale)); +} +s_expr mksexp(const arb::units::quantity& p) { + return slist("quantity"_symbol, p.value(), s_expr(arb::units::to_string(p.units()))); } s_expr mksexp(const axial_resistivity& r) { - return slist("axial-resistivity"_symbol, mksexp(r.value)); + return slist("axial-resistivity"_symbol, r.value, mksexp(r.scale)); } -s_expr mksexp(const temperature_K& t) { - return slist("temperature-kelvin"_symbol, mksexp(t.value)); +s_expr mksexp(const temperature& t) { + return slist("temperature-kelvin"_symbol, t.value, mksexp(t.scale)); } s_expr mksexp(const membrane_capacitance& c) { - return slist("membrane-capacitance"_symbol, mksexp(c.value)); + return slist("membrane-capacitance"_symbol, c.value, mksexp(c.scale)); } s_expr mksexp(const init_int_concentration& c) { - return slist("ion-internal-concentration"_symbol, s_expr(c.ion), mksexp(c.value)); + return slist("ion-internal-concentration"_symbol, s_expr(c.ion), c.value, mksexp(c.scale)); } s_expr mksexp(const init_ext_concentration& c) { - return slist("ion-external-concentration"_symbol, s_expr(c.ion), mksexp(c.value)); + return slist("ion-external-concentration"_symbol, s_expr(c.ion), c.value, mksexp(c.scale)); } s_expr mksexp(const init_reversal_potential& c) { - return slist("ion-reversal-potential"_symbol, s_expr(c.ion), mksexp(c.value)); + return slist("ion-reversal-potential"_symbol, s_expr(c.ion), c.value, mksexp(c.scale)); } s_expr mksexp(const ion_diffusivity& c) { - return slist("ion-diffusivity"_symbol, s_expr(c.ion), mksexp(c.value)); + return slist("ion-diffusivity"_symbol, s_expr(c.ion), c.value, mksexp(c.scale)); } s_expr mksexp(const i_clamp& c) { std::vector<s_expr> evlps; @@ -224,15 +227,13 @@ using branch_tuple = std::tuple<int,int,std::vector<arb::msegment>>; using version_tuple = std::tuple<std::string>; // Define makers for defaultables, paintables, placeables -#define ARBIO_DEFINE_ONE_ARG(name) arb::name make_##name(double val) { return arb::name{val};} +#define ARBIO_DEFINE_ONE_ARG(name) arb::name make_##name(double val) { return arb::name(val);} #define ARBIO_DEFINE_ION_ARG(name) arb::name make_##name(const std::string& ion, double val) { return arb::name{ion, val};} -#define ARBIO_DEFINE_IEXPR_ION_ARG(name) arb::name make_##name(const std::string& ion, iexpr val) { return arb::name{ion, val};} -#define ARBIO_DEFINE_IEXPR_ARG(name) arb::name make_##name(iexpr val) { return arb::name{val}; } +#define ARBIO_DEFINE_IEXPR_ION_ARG(name) arb::name make_##name(const std::string& ion, double base, iexpr scale) { arb::name res; res.ion = ion; res.value = base; res.scale = scale; return res; } +#define ARBIO_DEFINE_IEXPR_ARG(name) arb::name make_##name(double base, iexpr scale) { arb::name res; res.value = base; res.scale = scale; return res; } -ARB_PP_FOREACH(ARBIO_DEFINE_ONE_ARG, threshold_detector) -ARB_PP_FOREACH(ARBIO_DEFINE_IEXPR_ARG, init_membrane_potential, temperature_K, axial_resistivity, membrane_capacitance) -ARB_PP_FOREACH(ARBIO_DEFINE_ION_ARG, ion_diffusivity) -ARB_PP_FOREACH(ARBIO_DEFINE_IEXPR_ION_ARG, init_int_concentration, init_ext_concentration, init_reversal_potential) +ARB_PP_FOREACH(ARBIO_DEFINE_IEXPR_ARG, init_membrane_potential, temperature, axial_resistivity, membrane_capacitance) +ARB_PP_FOREACH(ARBIO_DEFINE_IEXPR_ION_ARG, ion_diffusivity, init_int_concentration, init_ext_concentration, init_reversal_potential) #undef ARBIO_DEFINE_ONE_ARG #undef ARBIO_DEFINE_ION_ARG @@ -244,18 +245,22 @@ std::vector<arb::i_clamp::envelope_point> make_envelope(const std::vector<std::v std::transform(vec.begin(), vec.end(), std::back_inserter(envlp), [](const auto& x) { auto t = std::get<envelope_tuple>(x); - return arb::i_clamp::envelope_point{std::get<0>(t), std::get<1>(t)}; + return arb::i_clamp::envelope_point{std::get<0>(t)*arb::units::ms, std::get<1>(t)*arb::units::nA}; }); return envlp; } arb::i_clamp make_i_clamp(const std::vector<arb::i_clamp::envelope_point>& envlp, double freq, double phase) { - return arb::i_clamp(envlp, freq, phase); + return arb::i_clamp(envlp, freq*arb::units::kHz, phase*arb::units::rad); } pulse_tuple make_envelope_pulse(double delay, double duration, double amplitude) { return pulse_tuple{delay, duration, amplitude}; } arb::i_clamp make_i_clamp_pulse(const pulse_tuple& p, double freq, double phase) { - return arb::i_clamp::box(std::get<0>(p), std::get<1>(p), std::get<2>(p), freq, phase); + return arb::i_clamp::box(std::get<0>(p)*arb::units::ms, + std::get<1>(p)*arb::units::ms, + std::get<2>(p)*arb::units::nA, + freq*arb::units::kHz, + phase*arb::units::rad); } arb::cv_policy make_cv_policy(const cv_policy& p) { return p; @@ -652,26 +657,21 @@ parse_hopefully<std::any> eval(const s_expr& e, const eval_map& map, const eval_ return util::unexpected(cableio_parse_error("Expression is not integer, real expression of the form (op <args>) nor tuple of the form (e0 e1 ... en)", location(e))); } -#define ARBIO_ADD_EVAL(name, fun, ty) { name, make_call<ty>(fun, "'" name "' with 1 argument (val:" #ty ")") } -#define ARBIO_ADD_ION_EVAL(name, fun, ty) { name, make_call<std::string, ty>(fun, "'" name "' with 2 argument (ion:string, val:" #ty ")") } +arb::units::quantity make_quantity(double v, std::string u) { return v*arb::units::unit_cast_from_string(u); } + +#define ARBIO_ADD_EVAL(name, fun) { name, make_call<double, iexpr>(fun, "'" name "' with 2 arguments: val:real and ex:iexpr") } +#define ARBIO_ADD_ION_EVAL(name, fun) { name, make_call<std::string, double, iexpr>(fun, "'" name "' with 3 arguments: ion:string, val:real, and ex:iexpr") } eval_map named_evals{ - ARBIO_ADD_EVAL("membrane-potential", make_init_membrane_potential, double), - ARBIO_ADD_EVAL("membrane-potential", make_init_membrane_potential, iexpr), - ARBIO_ADD_EVAL("temperature-kelvin", make_temperature_K, double), - ARBIO_ADD_EVAL("temperature-kelvin", make_temperature_K, iexpr), - ARBIO_ADD_EVAL("axial-resistivity", make_axial_resistivity, double), - ARBIO_ADD_EVAL("axial-resistivity", make_axial_resistivity, iexpr), - ARBIO_ADD_EVAL("membrane-capacitance", make_membrane_capacitance, double), - ARBIO_ADD_EVAL("membrane-capacitance", make_membrane_capacitance, iexpr), - ARBIO_ADD_ION_EVAL("ion-internal-concentration", make_init_int_concentration, double), - ARBIO_ADD_ION_EVAL("ion-internal-concentration", make_init_int_concentration, iexpr), - ARBIO_ADD_ION_EVAL("ion-external-concentration", make_init_ext_concentration, double), - ARBIO_ADD_ION_EVAL("ion-external-concentration", make_init_ext_concentration, iexpr), - ARBIO_ADD_ION_EVAL("ion-reversal-potential", make_init_reversal_potential, double), - ARBIO_ADD_ION_EVAL("ion-reversal-potential", make_init_reversal_potential, iexpr), - ARBIO_ADD_ION_EVAL("ion-diffusivity", make_ion_diffusivity, double), - // Intentionally left out! ARBIO_ADD_ION_EVAL("ion-diffusivity", make_ion_diffusivity, iexpr), + ARBIO_ADD_EVAL("membrane-potential", make_init_membrane_potential), + ARBIO_ADD_EVAL("temperature-kelvin", make_temperature), + ARBIO_ADD_EVAL("axial-resistivity", make_axial_resistivity), + ARBIO_ADD_EVAL("membrane-capacitance", make_membrane_capacitance), + ARBIO_ADD_ION_EVAL("ion-internal-concentration", make_init_int_concentration), + ARBIO_ADD_ION_EVAL("ion-external-concentration", make_init_ext_concentration), + ARBIO_ADD_ION_EVAL("ion-reversal-potential", make_init_reversal_potential), + ARBIO_ADD_ION_EVAL("ion-diffusivity", make_ion_diffusivity), + {"quantity", make_call<double, std::string>(make_quantity, "'quantity' with a value:real and a unit:string")}, {"envelope", make_arg_vec_call<envelope_tuple>(make_envelope, "'envelope' with one or more pairs of start time and amplitude (start:real amplitude:real)")}, {"envelope-pulse", make_call<double, double, double>(make_envelope_pulse, @@ -680,7 +680,7 @@ eval_map named_evals{ "'current-clamp' with 3 arguments (env:envelope freq:real phase:real)")}, {"current-clamp", make_call<pulse_tuple, double, double>(make_i_clamp_pulse, "'current-clamp' with 3 arguments (env:envelope_pulse freq:real phase:real)")}, - {"threshold-detector", make_call<double>(make_threshold_detector, + {"threshold-detector", make_call<double>(arb::threshold_detector::from_raw_millivolts, "'threshold-detector' with 1 argument (threshold:real)")}, {"mechanism", make_mech_call("'mechanism' with a name argument, and 0 or more parameter settings" "(name:string (param:string val:real))")}, @@ -700,7 +700,7 @@ eval_map named_evals{ {"place", make_call<locset, synapse, std::string>(make_place, "'place' with 3 arguments (ls:locset mech:synapse name:string)")}, {"paint", make_call<region, init_membrane_potential>(make_paint, "'paint' with 2 arguments (reg:region v:membrane-potential)")}, - {"paint", make_call<region, temperature_K>(make_paint, "'paint' with 2 arguments (reg:region v:temperature-kelvin)")}, + {"paint", make_call<region, temperature>(make_paint, "'paint' with 2 arguments (reg:region v:temperature-kelvin)")}, {"paint", make_call<region, membrane_capacitance>(make_paint, "'paint' with 2 arguments (reg:region v:membrane-capacitance)")}, {"paint", make_call<region, axial_resistivity>(make_paint, "'paint' with 2 arguments (reg:region v:axial-resistivity)")}, {"paint", make_call<region, init_int_concentration>(make_paint, "'paint' with 2 arguments (reg:region v:ion-internal-concentration)")}, @@ -711,7 +711,7 @@ eval_map named_evals{ {"paint", make_call<region, scaled_mechanism<density>>(make_paint, "'paint' with 2 arguments (reg:region v:scaled-mechanism)")}, {"default", make_call<init_membrane_potential>(make_default, "'default' with 1 argument (v:membrane-potential)")}, - {"default", make_call<temperature_K>(make_default, "'default' with 1 argument (v:temperature-kelvin)")}, + {"default", make_call<temperature>(make_default, "'default' with 1 argument (v:temperature-kelvin)")}, {"default", make_call<membrane_capacitance>(make_default, "'default' with 1 argument (v:membrane-capacitance)")}, {"default", make_call<axial_resistivity>(make_default, "'default' with 1 argument (v:axial-resistivity)")}, {"default", make_call<init_int_concentration>(make_default, "'default' with 1 argument (v:ion-internal-concentration)")}, diff --git a/arborio/parse_helpers.hpp b/arborio/parse_helpers.hpp index 5b0c37f9a7506fb46a42d52d1e578b81f42e7482..e1bc02f4cf93366e0eede306ab7d55c19aadfe50 100644 --- a/arborio/parse_helpers.hpp +++ b/arborio/parse_helpers.hpp @@ -3,7 +3,6 @@ #include <any> #include <string> #include <sstream> -#include <iostream> #include <typeinfo> #include <arbor/assert.hpp> @@ -12,6 +11,8 @@ #include <arbor/morph/locset.hpp> #include <arbor/morph/region.hpp> #include <arbor/iexpr.hpp> +#include <arbor/s_expr.hpp> + namespace arborio { using namespace arb; diff --git a/doc/concepts/decor.rst b/doc/concepts/decor.rst index 89e5ee7d4a60d0226f8e4885f1222a8c7e8d1254..ea96543e749861663d7f4d1329051876e86e6c65 100644 --- a/doc/concepts/decor.rst +++ b/doc/concepts/decor.rst @@ -204,7 +204,8 @@ resistivity, and membrane capacitance, as well as all ion parameters # initial value for the membrane potential as inhomogeneous expression. - decor.paint('(all)', Vm='(mul 42 (diameter))') + # we give a pair of a base value and a scaling iexpr + decor.paint('(all)', Vm=(23, '(mul 42 (diameter))')) .. _cablecell-ions: diff --git a/doc/concepts/units.rst b/doc/concepts/units.rst new file mode 100644 index 0000000000000000000000000000000000000000..d52ed30ef28759d1389611c31d5f94b6b05f633c --- /dev/null +++ b/doc/concepts/units.rst @@ -0,0 +1,192 @@ +.. _units: + +Units in Arbor +============== + +.. note:: + + This is a work in progress. The near goal term is to make this coverage + complete, but expect some exceptions. Notably, the interfaces of individual + mechanism are not yet integrated, since NMODL files -- despite explicitly + specifying units -- do not make good use of the feature. + +A large part of the interface of Arbor -- both in C++ and Python -- is covered +by units of measurement. This gives the API a way to communicate the intended +units of parameters and return values and users can largely use their preferred +system of units, as automatic conversion is provided. For performance reasons, +this extends to the outermost layer only, after which Arbor uses its own +internal system of measurement. + +We leverage the `units library <https://github.com/llnl/units>`_ published by LLNL. + +Arbor is focussed on SI units, and we provide the following presets for both the +C++ and Python modules. + +.. table:: Provided dimensionalities and units + :widths: auto + + ============= ======= + Dimension Unit + ============= ======= + Temperature Kelvin + Celsius + Length m + cm + mm + um + nm + Time s + ms + us + ns + Resistance Ohm + kOhm + MOhm + Conductivity S + mS + uS + Current A + mA + uA + nA + pA + Potential V + mV + Frequency Hz + kHz + Capacity F + mF + uF + nF + pF + Area m2 + cm2 + mm2 + um2 + nm2 + Charge C + Mol mol + Molarity M = mol/l + mM + Angle rad + deg + ============= ======= + +Further units may be derived from existing ones by mean of multiplication and +division with the obvious semantics, the existing metric prefixes, or by extending +the catalogue of units via the underlying units library. + +.. table:: Provided metric prefixes + :widths: auto + + ============= ======= ============= ======= + Prefix Scale Prefix Scale + ============= ======= ============= ======= + pico 1e-12 kilo 1e3 + nano 1e-9 mega 1e6 + micro 1e-6 giga 1e9 + milli 1e-3 + centi 1e-2 + ============= ======= ============= ======= + +Parameters are passed into Arbor via a ``quantity``, which comprise a value and +a unit. We construct a quantity by multiplication of a scalar value by a unit. +Multiplication of two quantities will result in the pointwise product of the +values and units; like one would expect. + +.. code-block:: python + + # two kilometers, dimension is length + l = 2 * km + + # three kilometers, but with the scaling factored out + s = 3 * kilo * m + + # multiplication of two lengths gives an area + a = l * s + # is now 6 square kilometers + +Units and quantities work intuitively and largely the same across C++ and +Python, but we provide some details below. + +C++ +--- + +Units are defined in the ``units`` namespace, and exist at runtime, since we +need to cater to dynamical language bindings. In the ``units::literals`` +namespace, we find user defined literals for all units above, e.g. ``10_mV``. +Integral powers of units are constructed using the ``.pow(int)`` member, e.g. +``m2 = m.pow(2)``. Units and quantities can be converted to and from strings +using the ``std::string to_string(const T&)`` and ``T from_string_cast(const std::string&)`` +functions. Conversion between different units is done like this + +.. code-block:: c++ + + namespace U = arb::units; + + // membrane capacitance in SI + auto c_m = 42*U::F/U::m.pow(2) // same as 42*U::F*U::m.pow(-2) + // convert to different unit and extract value + auto c_m_ = c_m.value_as(U::uF*U::cm.pow(-2)) + // invalid conversions result in NaN values, so check + if (std::isnan(c_m_)) throw std::domain_error("Invalid value"); + +however, Arbor does this whenever values pass its interface. + +.. cpp::namespace:: arb::units + +.. cpp:class:: unit + + Describes a unit of measurement. + + .. method:: pow(int) + + Raise unit to integral power. + +.. cpp:class:: quantity + + A tuple of a value and a unit of measurement. + + .. method:: value_as(unit) + + Convert to another unit and return converted value, possibly NaN, if + malformed. + + +Python +------ + +Units are defined in the ``units`` sub-module. Integral powers of units are +constructed using the ``**`` operator, e.g. ``m2 = m ** 2``. Units and +quantities can be converted to a string using the ``str()`` function. +Conversion between different units is done like this + +.. code-block:: python + + from arbor import units as U + from math import isnan + + # membrane capacitance in SI + c_m = 42*U.F/U.m**2 + # convert to different unit and extract value + c_m_ = c_m.value_as(U.uF*U.cm**-2) + # invalid conversions result in NaN values, so check + if isnan(c_m_): + raise ValueError("Invalid value") + +however, Arbor does this whenever values pass its interface. + +.. currentmodule:: arbor.units + +.. class:: unit + + Describes a unit of measurement. + +.. class:: quantity + + A tuple of a value and a unit of measurement. + + .. method:: value_as + + Convert to another unit and return converted value, possibly NaN, if + malformed. diff --git a/doc/cpp/cable_cell.rst b/doc/cpp/cable_cell.rst index 9013db7dcd8cf556d39911d0344463f5180c2ae7..1b564c3374a6a2c3f18bbb32aee7a4a126b37395 100644 --- a/doc/cpp/cable_cell.rst +++ b/doc/cpp/cable_cell.rst @@ -169,19 +169,19 @@ value should be taken from the cell or global parameter set. Internal and external concentrations are given in millimolars, i.e. mol/m³. Reversal potential is given in millivolts. - .. cpp:member:: util::optional<double> init_membrane_potential + .. cpp:member:: util::optional<units::quantity> init_membrane_potential Initial membrane potential in millivolts. - .. cpp:member:: util::optional<double> temperature_K + .. cpp:member:: util::optional<units::quantity> temperature Local temperature in Kelvin. - .. cpp:member:: util::optional<double> axial_resistivity + .. cpp:member:: util::optional<units::quantity> axial_resistivity Local resistivity of the intracellular medium, in ohm-centimetres. - .. cpp:member:: util::optional<double> membrane_capacitance + .. cpp:member:: util::optional<units::quantity> membrane_capacitance Local areal capacitance of the cell membrane, in Farads per square metre. diff --git a/doc/cpp/interconnectivity.rst b/doc/cpp/interconnectivity.rst index 9f572b1f90e833f2f045f7ac06aeb540d6f9d200..9bd2bc49a97d8dc6d56eb8b08a02aedeac2edab9 100644 --- a/doc/cpp/interconnectivity.rst +++ b/doc/cpp/interconnectivity.rst @@ -34,9 +34,9 @@ Interconnectivity the `expsyn` synapse interprets it as a conductance with units μS (micro-Siemens). - .. cpp:member:: float delay + .. cpp:member:: units::quantity delay - Delay of the connection (milliseconds). + Delay of the connection (milliseconds), must be positive and finite. .. cpp:class:: ext_cell_connection diff --git a/doc/cpp/lif_cell.rst b/doc/cpp/lif_cell.rst index 60a72881a4a63e19ecb28974f4499372b37bc2be..dec8f34e4f9667de27c1b2d8247fff4ff34356f8 100644 --- a/doc/cpp/lif_cell.rst +++ b/doc/cpp/lif_cell.rst @@ -25,30 +25,30 @@ LIF cells The label of the single built-in target on the cell. Used for forming connections to the cell in the :cpp:class:`recipe` by creating a :cpp:class:`connection`. - .. cpp:member:: double tau_m + .. cpp:member:: const arb::units::quantity& tau_m - Membrane potential decaying constant [ms]. + Membrane potential decaying constant [ms]. Must be finite and positive. - .. cpp:member:: double V_th + .. cpp:member:: const arb::units::quantity& V_th - Firing threshold [mV]. + Firing threshold [mV], must be finite. - .. cpp:member:: double C_m + .. cpp:member:: const arb::units::quantity& C_m - Membrane capacitance [pF]. + Membrane capacitance [pF], must be finite and positive. - .. cpp:member:: double E_L + .. cpp:member:: const arb::units::quantity& E_L - Resting potential [mV]. + Resting potential [mV], must be finite. - .. cpp:member:: double E_R + .. cpp:member:: const arb::units::quantity& E_R - Reset potential [mV]. + Reset potential [mV], must be finite. - .. cpp:member:: double V_m + .. cpp:member:: const arb::units::quantity& V_m - Initial value of the Membrane potential [mV]. + Initial value of the Membrane potential [mV], must be finite. - .. cpp:member:: double t_ref + .. cpp:member:: const arb::units::quantity& t_ref - Refractory period [ms]. + Refractory period [ms]. Must be finite and positive. diff --git a/doc/fileformat/cable_cell.rst b/doc/fileformat/cable_cell.rst index 7038520287c5a2492db2587dbb8497303582a565..be35921ba7738facd3bcc374efe32eefc0054d0b 100644 --- a/doc/fileformat/cable_cell.rst +++ b/doc/fileformat/cable_cell.rst @@ -396,7 +396,7 @@ Parsable arbor-components and meta-data The formats described above can be used to generate a :ref:`label dictionary <labels>`, :ref:`decoration <cablecell-decoration>`, :ref:`morphology <morph>`, or :ref:`cable cell <cablecell>` object. These are denoted as arbor-components. Arbor-components need to be accompanied by *meta-data* -specifying the version of the format being used. The only version currently supported is ``0.1-dev``. +specifying the version of the format being used. The only version currently supported is ``0.9-dev``. .. label:: (version val:string) @@ -418,7 +418,7 @@ Label-dict .. code:: lisp (arbor-component - (meta-data (version "0.1-dev")) + (meta-data (version "0.9-dev")) (label-dict (region-def "my_soma" (tag 1)) (locset-def "root" (root)))) @@ -429,7 +429,7 @@ Decoration .. code:: lisp (arbor-component - (meta-data (version "0.1-dev")) + (meta-data (version "0.9-dev")) (decor (default (membrane-potential -55.000000)) (place (locset "root") (synapse (mechanism "expsyn")) "root_synapse") @@ -441,7 +441,7 @@ Morphology .. code:: lisp (arbor-component - (meta-data (version "0.1-dev")) + (meta-data (version "0.9-dev")) (morphology (branch 0 -1 (segment 0 (point 0 0 0 2) (point 4 0 0 2) 1) @@ -454,7 +454,7 @@ Cable-cell .. code:: lisp (arbor-component - (meta-data (version "0.1-dev")) + (meta-data (version "0.9-dev")) (cable-cell (label-dict (region-def "my_soma" (tag 1)) diff --git a/doc/index.rst b/doc/index.rst index 66401c9bc7ad90af40d91be47243ee8fdbefd19d..a7d623b98c6a177536257ad24537563c35d5b68a 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -150,6 +150,7 @@ A full list of our software attributions can be found `here <https://github.com/ concepts/index concepts/recipe concepts/cell + concepts/units concepts/interconnectivity concepts/hardware concepts/domdec diff --git a/doc/python/interconnectivity.rst b/doc/python/interconnectivity.rst index e5c40905b5e33f78dc81da5f7633c032c182eea2..2063f412efa150b56e8b85805d5179e06c341265 100644 --- a/doc/python/interconnectivity.rst +++ b/doc/python/interconnectivity.rst @@ -38,7 +38,7 @@ Interconnectivity .. attribute:: delay - The delay time of the connection [ms]. Must be positive. + The delay time of the connection [ms]. Must be positive and finite. .. note:: @@ -66,7 +66,7 @@ Interconnectivity src = (2, "detector") # gid and locset label of the source dest = "syn" # gid of the destination is determined by the argument to `connections_on`. w = 0.01 # weight of the connection. Correspondes to 0.01 μS on expsyn mechanisms - d = 10 # delay in ms + d = 10 * arbor.units.ms # delay return [arbor.connection(src, dest, w, d)] .. class:: gap_junction_connection diff --git a/doc/python/lif_cell.rst b/doc/python/lif_cell.rst index e9450ef75fec9906759b969bc634196f63b2140a..4fae8c3271e0b1eb566808c39cb17568137ef682 100644 --- a/doc/python/lif_cell.rst +++ b/doc/python/lif_cell.rst @@ -10,20 +10,24 @@ LIF cells A benchmarking cell (leaky integrate-and-fire), used by Arbor developers to test communication performance, with neuronal parameters: - .. function:: lif_cell(source, target) + .. function:: lif_cell(source, target, **, tau_m, V_th, C_m, E_L, E_R, V_m, t_ref) - Constructor: assigns the label ``source`` to the single built-in source on the cell; and assigns the - label ``target`` to the single built-in target on the cell. + Constructor: assigns the label ``source`` to the single built-in source + on the cell; and assigns the label ``target`` to the single built-in + target on the cell. Optional parameters may be given and set the + correspoding physical parameters of the cell .. attribute:: source - The label of the single built-in source on the cell. Used for forming connections from the cell in the - :py:class:`arbor.recipe` by creating a :py:class:`arbor.connection`. + The label of the single built-in source on the cell. Used for forming + connections from the cell in the :py:class:`arbor.recipe` by creating a + :py:class:`arbor.connection`. .. attribute:: target - The label of the single built-in target on the cell. Used for forming connections to the cell in the - :py:class:`arbor.recipe` by creating a :py:class:`arbor.connection`. + The label of the single built-in target on the cell. Used for forming + connections to the cell in the :py:class:`arbor.recipe` by creating a + :py:class:`arbor.connection`. .. attribute:: tau_m diff --git a/doc/python/recipe.rst b/doc/python/recipe.rst index 6e23106dcd7e11f093620ef7d458b220d03f7575..6acc390867e69323a6940f1f80faef325fa28edf 100644 --- a/doc/python/recipe.rst +++ b/doc/python/recipe.rst @@ -79,7 +79,7 @@ Recipe ``connection.dest`` on the post-synaptic target ``gid``, and a valid source label ``connection.source.lid`` on the pre-synaptic source ``connection.source.gid``. See :class:`connection`. Note that in - contrast to :class:`cell_connection`, this uses two numeric identifiers + contrast to :class:`connection`, this uses two numeric identifiers for the source instead. By default returns an empty list. diff --git a/doc/tutorial/calcium_stdp_curve.rst b/doc/tutorial/calcium_stdp_curve.rst index d14d8bb07071c0ce83377d79516c1609a222cf1f..95bc2b221a232d84bd0354024e97c8a83dfb0983 100644 --- a/doc/tutorial/calcium_stdp_curve.rst +++ b/doc/tutorial/calcium_stdp_curve.rst @@ -80,98 +80,102 @@ details about the numerical solver can be found in the :ref:`developers guide <s The Model --------- -In this tutorial, the neuron model itself is simple with only -passive (leaky) membrane dynamics, and it receives regular synaptic current -input in one arbitrary chosen control volume (CV) to trigger regular spikes. +In this tutorial, the neuron model itself is simple with only passive (leaky) +membrane dynamics, and it receives regular synaptic current input in one +arbitrary chosen control volume (CV) to trigger regular spikes. First we import some required modules: .. literalinclude:: ../../python/example/calcium_stdp.py :language: python - :lines: 13-18 + :lines: 13-15 Next we set the simulation parameters in order to reproduce the plasticity curve: .. literalinclude:: ../../python/example/calcium_stdp.py :language: python - :lines: 20-41 - -The time lag resolution, together with the maximum time lag, determine the number of cases we want -to simulate. For each such case, however, we need to run many simulations in order to get a -statistically meaningful result. The number of simulations per case is given by the ensemble size -and the initial conditions. In our case, we have two inital states, :math:`\rho(0)=0` and -:math:`\rho(0)=1`, and for each initial state we want to run :math:`100` simulations. We note, that -the stochastic synapse mechanism does not alter the state of the cell, but couples one-way only by -reacting to spikes. Therefore, we are allowed to simply place :math:`100` synapses per initial state -onto the cell without worrying about interference. Moreover, this has the benefit of exposing + :lines: 20-40 + +The time lag resolution, together with the maximum time lag, determine the +number of cases we want to simulate. For each such case, however, we need to run +many simulations in order to get a statistically meaningful result. The number +of simulations per case is given by the ensemble size and the initial +conditions. In our case, we have two inital states, :math:`\rho(0)=0` and +:math:`\rho(0)=1`, and for each initial state we want to run :math:`100` +simulations. We note, that the stochastic synapse mechanism does not alter the +state of the cell, but couples one-way only by reacting to spikes. Therefore, we +are allowed to simply place :math:`100` synapses per initial state onto the cell +without worrying about interference. Moreover, this has the benefit of exposing parallelism that Arbor can take advantage of. -Thus, we create a simple cell with a midpoint at which we place our mechanisms: +Thus, we create a simple cell and mark the midpoint at which we place our mechanisms: .. literalinclude:: ../../python/example/calcium_stdp.py :language: python - :lines: 44-67 + :lines: 43-67 -Since our stochastic mechanism `calcium_based_synapse` is not within Arbor's default set of -mechanism, we need to extend the mechanism catalogue within the cable cell properties: +Since our stochastic mechanism `calcium_based_synapse` is not within Arbor's +default set of mechanism, we need to extend the mechanism catalogue within the +cable cell properties: .. literalinclude:: ../../python/example/calcium_stdp.py :language: python - :lines: 70-74 + :lines: 69-71 Our cell and cell properties can then later be used to create a simple recipe: .. literalinclude:: ../../python/example/calcium_stdp.py :language: python - :lines: 77-103 + :lines: 74-98 -Note, that the recipe takes a cell, cell properties and a list of event generators as constructor -arguments and returns them with its corresponding methods. Furthermore, the recipe also returns a -list of probes which contains only one item: A query for our mechanism's state variable -:math:`\rho`. Since we placed a number of these mechanisms on our cell, we will receive a vector of -values when probing. +Note, that the recipe takes a cell and a list of time offsets as constructor +arguments, which are used to create the cells of the ensemble. Furthermore, the +recipe also returns a list of probes which contains only one item: A query for +our mechanism's state variable :math:`\rho`. Since we placed a number of these +mechanisms on our cell, we will receive a vector of values when probing. Next we set up the simulation logic: .. literalinclude:: ../../python/example/calcium_stdp.py :language: python - :lines: 106-134 + :lines: 101-125 -The pre- and postsynaptic events are generated at explicit schedules, where the presynaptic event -is shifted in time by :math:`D -\text{time lag}` with respect to the presynaptic event, which in -turn is generated regularly with the frequency :math:`f`. The postsynaptic events are driven by the -deterministic synapse with weight `1.0`, while the presynaptic events are generated at the -stochastic calcium synapses. The postsynaptic weight can be set arbitrarily as long as it is large -enough to trigger the spikes. +The pre- and postsynaptic events are generated as regular schedules, where the +presynaptic event is shifted in time by :math:`D -\text{time lag}` with respect +to the presynaptic event, which in turn is generated regularly with the +frequency :math:`f`. The postsynaptic events are driven by the deterministic +synapse with weight `1.0`, while the presynaptic events are generated at the +stochastic calcium synapses. The postsynaptic weight can be set arbitrarily as +long as it is large enough to trigger the spikes. Thus, we have all ingredients to create the recipe .. literalinclude:: ../../python/example/calcium_stdp.py :language: python - :lines: 135-136 + :lines: 127-128 Now, we need to initialize the simulation, register a probe and run the simulation: .. literalinclude:: ../../python/example/calcium_stdp.py :language: python - :lines: 138-153 + :lines: 133-140 -Since we are interested in the long-term average value, we only query the probe at the end of the -simulation. +Since we are interested in the long-term average value, we only query the probe +at the end of the simulation. -After the simulation is finished, we calculate the change in synaptic strength by evaluating the -transition probabilies from initial DOWN state to final UP state and vice versa. +After the simulation is finished, we calculate the change in synaptic strength +by evaluating the transition probabilies from initial DOWN state to final UP +state and vice versa. .. literalinclude:: ../../python/example/calcium_stdp.py :language: python - :lines: 155-173 + :lines: 142-160 -Since we need to run our simulation for each time lag case anew, we spawn a bunch of threads to -carry out the work in parallel: +We process all configured timelags .. literalinclude:: ../../python/example/calcium_stdp.py :language: python - :lines: 176-177 + :lines: 163 The collected results can then be plotted: diff --git a/doc/tutorial/network_ring.rst b/doc/tutorial/network_ring.rst index dce2e62fc7d5352dff89334f0eddcda2aa7cf04c..cbe44933c851a406abe13a850c5d40aa6d116c34 100644 --- a/doc/tutorial/network_ring.rst +++ b/doc/tutorial/network_ring.rst @@ -27,7 +27,7 @@ We construct the following :term:`morphology` and label the soma and dendrite: .. literalinclude:: ../../python/example/network_ring.py :language: python - :lines: 20-46 + :lines: 12-42 In step **(2)** we create a :term:`label` for both the root and the site of the synapse. These locations will form the endpoints of the connections between the cells. @@ -40,7 +40,7 @@ These locations will form the endpoints of the connections between the cells. .. literalinclude:: ../../python/example/network_ring.py :language: python - :lines: 48-58 + :lines: 44-54 After we've created a basic :py:class:`arbor.decor`, step **(3)** places a synapse with an exponential decay (``'expsyn'``) on the ``'synapse_site'``. The synapse is given the label ``'syn'``, which is later used to form :py:class:`arbor.connection` objects terminating *at* the cell. @@ -63,67 +63,94 @@ Step **(4)** places a threshold detector at the ``'root'``. The detector is give .. literalinclude:: ../../python/example/network_ring.py :language: python - :lines: 60-71 + :lines: 56-65 The recipe ********** -To create a model with multiple connected cells, we need to use a :py:class:`recipe <arbor.recipe>`. -The recipe is where the different cells and the :ref:`connections <interconnectivity>` between them are defined. - -Step **(5)** shows a class definition for a recipe with multiple cells. Instantiating the class requires the desired -number of cells as input. Compared to the :ref:`simple cell recipe <tutorialsinglecellrecipe>`, the main differences -are connecting the cells **(8)**, returning a configurable number of cells **(6)** and returning a new cell per ``gid`` **(7)**. - -Step **(8)** creates an :py:class:`arbor.connection` between consecutive cells. If a cell has gid ``gid``, the -previous cell has a gid ``(gid-1)%self.ncells``. The connection has a weight of 0.01 (inducing a conductance of 0.01 μS -in the target mechanism ``expsyn``) and a delay of 5 ms. -The first two arguments to :py:class:`arbor.connection` are the **source** and **target** of the connection. - -The **source** is a :py:class:`arbor.cell_global_label` object containing a cell index ``gid``, the source label -corresponding to a valid detector label on the cell and an optional selection policy (for choosing a single detector -out of potentially many detectors grouped under the same label - remember, in this case the number of detectors labeled -'detector' is 1). -The :py:class:`arbor.cell_global_label` can be initialized with a ``(gid, label)`` tuple, in which case the selection -policy is the default :py:attr:`arbor.selection_policy.univalent`; or a ``(gid, (label, policy))`` tuple. - -The **target** is a :py:class:`arbor.cell_local_label` object containing a cell index ``gid``, the target label -corresponding to a valid synapse label on the cell and an optional selection policy (for choosing a single synapse -out of potentially many synapses grouped under the same label - remember, in this case the number of synapses labeled -'syn' is 1). -The :py:class:`arbor.cell_local_label` can be initialized with a ``label`` string, in which case the selection -policy is the default :py:attr:`arbor.selection_policy.univalent`; or a ``(label, policy)`` tuple. The ``gid`` -of the target cell doesn't need to be explicitly added to the connection, it is the argument to the -:py:func:`arbor.recipe.connections_on` method. - -Step **(9)** attaches an :py:class:`arbor.event_generator` on the 0th target (synapse) on the 0th cell; this means it -is connected to the ``"synapse_site"`` on cell 0. This initiates the signal cascade through the network. The -:class:`arbor.explicit_schedule` in instantiated with a list of times in milliseconds, so here a single event at the 1 -ms mark is emitted. Note that this synapse is connected twice, once to the event generator, and once to another cell. +.. literalinclude:: ../../python/example/network_ring.py + :language: python + :lines: 70-112 + +To create a model with multiple connected cells, we need to use a +:py:class:`recipe <arbor.recipe>`. The recipe is where the different cells and +the :ref:`connections <interconnectivity>` between them are defined. + +Step **(5)** shows a class definition for a recipe with multiple cells. +Instantiating the class requires the desired number of cells as input. Compared +to the :ref:`simple cell recipe <tutorialsinglecellrecipe>`, the main +differences are connecting the cells **(8)**, returning a configurable number of +cells **(6)** and returning a new cell per ``gid`` **(7)**. + +Step **(8)** creates an :py:class:`arbor.connection` between consecutive cells. +If a cell has gid ``gid``, the previous cell has a gid ``(gid-1)%self.ncells``. +The connection has a weight of 0.01 (inducing a conductance of 0.01 μS in the +target mechanism ``expsyn``) and a delay of 5 ms. The first two arguments to +:py:class:`arbor.connection` are the **source** and **target** of the +connection. + +The **source** is a :py:class:`arbor.cell_global_label` object containing a cell +index ``gid``, the source label corresponding to a valid detector label on the +cell and an optional selection policy (for choosing a single detector out of +potentially many detectors grouped under the same label - remember, in this case +the number of detectors labeled 'detector' is 1). The +:py:class:`arbor.cell_global_label` can be initialized with a ``(gid, label)`` +tuple, in which case the selection policy is the default +:py:attr:`arbor.selection_policy.univalent`; or a ``(gid, (label, policy))`` +tuple. + +The **target** is a :py:class:`arbor.cell_local_label` object containing a cell +index ``gid``, the target label corresponding to a valid synapse label on the +cell and an optional selection policy (for choosing a single synapse out of +potentially many synapses grouped under the same label - remember, in this case +the number of synapses labeled 'syn' is 1). The +:py:class:`arbor.cell_local_label` can be initialized with a ``label`` string, +in which case the selection policy is the default +:py:attr:`arbor.selection_policy.univalent`; or a ``(label, policy)`` tuple. The +``gid`` of the target cell doesn't need to be explicitly added to the +connection, it is the argument to the :py:func:`arbor.recipe.connections_on` +method. + +Step **(9)** attaches an :py:class:`arbor.event_generator` on the 0th target +(synapse) on the 0th cell; this means it is connected to the ``"synapse_site"`` +on cell 0. This initiates the signal cascade through the network. The +:class:`arbor.explicit_schedule` in instantiated with a list of times in +milliseconds, so here a single event at the 1 ms mark is emitted. Note that this +synapse is connected twice, once to the event generator, and once to another +cell. Step **(10)** places a :term:`probe` at the ``"root"`` of each cell. -Step **(11)** instantiates the recipe with 4 cells. - .. literalinclude:: ../../python/example/network_ring.py :language: python - :lines: 74-122 + :lines: 115-117 + +Step **(11)** instantiates the recipe with 4 cells. The execution ************* -To create a simulation, we need at minimum to supply the recipe, and in addition can supply a :class:`arbor.context` -and :py:class:`arbor.domain_decomposition`. The first lets Arbor know what hardware it should use, the second how to -destribute the work over that hardware. By default, contexts are configured to use 1 thread and domain decompositons to -divide work equally over all threads. +To create a simulation, we need at minimum to supply the recipe, and in addition +can supply a :class:`arbor.context` and :py:class:`arbor.domain_decomposition`. +The first lets Arbor know what hardware it should use, the second how to +destribute the work over that hardware. By default, contexts are configured to +use 1 thread and domain decompositons to divide work equally over all threads. -Step **(12)** creates a simulation object from the recipe. Optionally, the :py:class:`~arbor.simulation` constructor takes two more -parameters: a :class:`arbor.context` and a :class:`arbor.domain_decomposition`. In :ref:`a followup of this tutorial <tutorialgpu>` that will be demonstrated. -For now, it is enough to know that for simulations that don't require customized execution those arguments can be left out. Without -further arguments Arbor will use all locally available threads. +.. literalinclude:: ../../python/example/network_ring.py + :language: python + :lines: 119-137 + +Step **(12)** creates a simulation object from the recipe. Optionally, the +:py:class:`~arbor.simulation` constructor takes two more parameters: a +:class:`arbor.context` and a :class:`arbor.domain_decomposition`. In :ref:`a +followup of this tutorial <tutorialgpu>` that will be demonstrated. For now, it +is enough to know that for simulations that don't require customized execution +those arguments can be left out. Without further arguments Arbor will use all +locally available threads. -Step **(13)** sets all spike generators to record using the :py:class:`arbor.spike_recording.all` policy. -This means the timestamps of the generated events will be kept in memory. Be default, these are discarded. +Step **(13)** sets all spike generators to record using the +:py:class:`arbor.spike_recording.all` policy. This means the timestamps of the +generated events will be kept in memory. Be default, these are discarded. In addition to having the timestamps of spikes, we want to extract the voltage as a function of time. @@ -138,10 +165,6 @@ these handles for later use. Step **(15)** executes the simulation for a duration of 100 ms. -.. literalinclude:: ../../python/example/network_ring.py - :language: python - :lines: 124-140 - The results *********** @@ -149,7 +172,7 @@ Step **(16)** prints the timestamps of the spikes: .. literalinclude:: ../../python/example/network_ring.py :language: python - :lines: 142-145 + :lines: 139-142 Step **(17)** generates a plot of the sampling data. :py:func:`arbor.simulation.samples` takes a ``handle`` of the probe we wish to examine. It returns a list @@ -161,7 +184,7 @@ It could have described a :term:`locset`.) .. literalinclude:: ../../python/example/network_ring.py :language: python - :lines: 147- + :lines: 144- Since we have created ``ncells`` cells, we have ``ncells`` traces. We should be seeing phase shifted traces, as the action potential propagated through the network. diff --git a/doc/tutorial/network_ring_gpu.rst b/doc/tutorial/network_ring_gpu.rst index 5be7ba570b490d0b2c634bc72e52572abbf30024..6f0c0b2f533b1a5d2da771a254e592af14abddf9 100644 --- a/doc/tutorial/network_ring_gpu.rst +++ b/doc/tutorial/network_ring_gpu.rst @@ -3,7 +3,10 @@ GPU and profiling ================= -In this example, the ring network created in an :ref:`earlier tutorial <tutorialnetworkring>` will be used to run the model with a GPU. In addition, it is shown how to profile the performance difference. Only the differences with that tutorial will be described. +In this example, the ring network created in an :ref:`earlier tutorial +<tutorialnetworkring>` will be used to run the model with a GPU. In addition, it +is shown how to profile the performance difference. Only the differences with +that tutorial will be described. .. Note:: @@ -17,19 +20,25 @@ In this example, the ring network created in an :ref:`earlier tutorial <tutorial The hardware context ******************** -An :ref:`execution context <modelcontext>` describes the hardware resources on which the simulation will run. -It contains the thread pool used to parallelise work on the local CPU, and optionally describes GPU resources -and the MPI communicator for distributed simulations. In some other examples, the :class:`arbor.single_cell_model` -object created the execution context :class:`arbor.context` behind the scenes. The details of the execution -context can be customized by the user. We may specify the number of threads in the thread pool; determine the -id of the GPU to be used; or create our own MPI communicator. - -Step **(11)** creates a hardware context where we set the :py:attr:`~arbor.proc_allocation.gpu_id`. This requires -that you have built Arbor manually, with GPU support (see :ref:`here <in_python_adv>` how to do that). On a regular -consumer device with a single GPU, the index you should pass is ``0``. Change the value to run the example with and -without GPU. The number of threads :class:`~arbor.context.threads` are (when no MPI is used) set to -:py:func:`arbor.env.thread_concurrency`. This value corresponds to the number of locally available threads as best as -can be established by Arbor at the start of the program. +An :ref:`execution context <modelcontext>` describes the hardware resources on +which the simulation will run. It contains the thread pool used to parallelise +work on the local CPU, and optionally describes GPU resources and the MPI +communicator for distributed simulations. In some other examples, the +:class:`arbor.single_cell_model` object created the execution context +:class:`arbor.context` behind the scenes. The details of the execution context +can be customized by the user. We may specify the number of threads in the +thread pool; determine the id of the GPU to be used; or create our own MPI +communicator. + +Step **(11)** creates a hardware context where we set the +:py:attr:`~arbor.proc_allocation.gpu_id`. This requires that you have built +Arbor manually, with GPU support (see :ref:`here <in_python_adv>` how to do +that). On a regular consumer device with a single GPU, the index you should pass +is ``0``. Change the value to run the example with and without GPU. The number +of threads :class:`~arbor.context.threads` are (when no MPI is used) set to +:py:func:`arbor.env.thread_concurrency`. This value corresponds to the number of +locally available threads as best as can be established by Arbor at the start of +the program. .. note:: @@ -42,12 +51,17 @@ can be established by Arbor at the start of the program. Profiling ********* -Arbor comes with a :class:`arbor.meter_manager` to help you profile your simulations. In this case, you can run the -example with ``gpu_id=None`` and ``gpu_id=0`` and observe the difference with the :class:`~arbor.meter_manager`. +Arbor comes with a :class:`arbor.meter_manager` to help you profile your +simulations. In this case, you can run the example with ``gpu_id=None`` and +``gpu_id=0`` and observe the difference with the :class:`~arbor.meter_manager`. +If you are interested in more detailled report, Arbor also offers a region based +profiler which is aimed at developers and must be enabled at build time. -Step **(12)** sets up the meter manager and starts it using the (only) context. This way, only Arbor related execution is measured, not Python code. +Step **(12)** sets up the meter manager and starts it using the (only) context. +This way, only Arbor related execution is measured, not Python code. -Step **(13)** instantiates the recipe and sets the first checkpoint on the meter manager. We now have the time it took to construct the recipe. +Step **(13)** instantiates the recipe and sets the first checkpoint on the meter +manager. We now have the time it took to construct the recipe. .. literalinclude:: ../../python/example/network_ring_gpu.py :language: python @@ -56,32 +70,41 @@ Step **(13)** instantiates the recipe and sets the first checkpoint on the meter The domain decomposition ************************ -The domain decomposition describes the distribution of the cells over the available computational resources. -The :class:`arbor.single_cell_model` also handled that without our knowledge in the previous examples. -Now, we have to define it ourselves. - -The :class:`arbor.domain_decomposition` class can be manually created by the user, by deciding which cells -go on which ranks. Or we can use a load balancer that can partition the cells across ranks according to -some rules. Arbor provides :class:`arbor.partition_load_balance`, which, using the recipe and execution -context, creates the :class:`arbor.domain_decomposition` object for us. - -A way to customize :class:`arbor.partition_load_balance` is by providing a :class:`arbor.partition_hint`. They let -you configure how cells are distributed over the resources in the :class:`~arbor.context`, but without requiring you -to know the precise configuration of a :class:`~arbor.context` up front. Whether you run your simulation on your -laptop CPU, desktop GPU, CPU cluster of GPU cluster, using :class:`partition hints<arbor.partition_hint>` you can -just say: use GPUs, if available. You only have to change the :class:`~arbor.context` to actually define which -hardware Arbor will execute on. - -Step **(14)** creates a :class:`arbor.partition_hint`, and tells it to put 1000 cells in a groups allocated to GPUs, -and to prefer the utilisation of the GPU if present. In fact, the default distribution strategy of -:class:`arbor.partition_load_balance` already spreads out cells as evenly as possible over CPUs, and groups -(up to 1000) on GPUs, so strictly speaking it was not necessary to give that part of the hint. -Lastly, a dictionary is created with which hints are assigned to a particular :class:`arbor.cell_kind`. -Different kinds may favor different execution, hence the option. -In this simulation, there are only :class:`arbor.cell_kind.cable`, so we assign the hint to that kind. - -Step **(15)** creates a :class:`arbor.partition_load_balance` with the recipe, context and hints created above. -Another checkpoint will help us understand how long creating the load balancer took. +The domain decomposition describes the distribution of the cells over the +available computational resources. The :class:`arbor.single_cell_model` also +handled that without our knowledge in the previous examples. Now, we have to +define it ourselves. + +The :class:`arbor.domain_decomposition` class can be manually created by the +user, by deciding which cells go on which ranks. Or we can use a load balancer +that can partition the cells across ranks according to some rules. Arbor +provides :class:`arbor.partition_load_balance`, which, using the recipe and +execution context, creates the :class:`arbor.domain_decomposition` object for +us. + +A way to customize :class:`arbor.partition_load_balance` is by providing a +:class:`arbor.partition_hint`. They let you configure how cells are distributed +over the resources in the :class:`~arbor.context`, but without requiring you to +know the precise configuration of a :class:`~arbor.context` up front. Whether +you run your simulation on your laptop CPU, desktop GPU, CPU cluster of GPU +cluster, using :class:`partition hints<arbor.partition_hint>` you can just say: +use GPUs, if available. You only have to change the :class:`~arbor.context` to +actually define which hardware Arbor will execute on. + +Step **(14)** creates a :class:`arbor.partition_hint`, and tells it to put 1000 +cells in a groups allocated to GPUs, and to prefer the utilisation of the GPU if +present. In fact, the default distribution strategy of +:class:`arbor.partition_load_balance` already spreads out cells as evenly as +possible over CPUs, and groups (up to 1000) on GPUs, so strictly speaking it was +not necessary to give that part of the hint. Lastly, a dictionary is created +with which hints are assigned to a particular :class:`arbor.cell_kind`. +Different kinds may favor different execution, hence the option. In this +simulation, there are only :class:`arbor.cell_kind.cable`, so we assign the hint +to that kind. + +Step **(15)** creates a :class:`arbor.partition_load_balance` with the recipe, +context and hints created above. Another checkpoint will help us understand how +long creating the load balancer took. .. literalinclude:: ../../python/example/network_ring_gpu.py :language: python @@ -91,38 +114,43 @@ Another checkpoint will help us understand how long creating the load balancer t The simulation ************** -Step **(16)** creates a :class:`arbor.simulation`, sets the spike recorders to record, creates a :term:`handle` -to their eventual results and makes another checkpoint. +Step **(16)** creates a :class:`arbor.simulation`, sets the spike recorders to +record, creates a :term:`handle` to their eventual results and makes another +checkpoint. .. literalinclude:: ../../python/example/network_ring_gpu.py :language: python - :lines: 150-154 + :lines: 150-156 The execution ************* -Step **(17)** runs the simulation. Since we have more cells this time, which are connected in series, -it will take some time for the action potential to propagate. In the :ref:`ring network <tutorialnetworkring>` -we could see it takes about 5 ms for the signal to propagate through one cell, so let's set the runtime to -``5*ncells``. Then, another checkpoint, so that we'll know how long the simulation took. +Step **(17)** runs the simulation. Since we have more cells this time, which are +connected in series, it will take some time for the action potential to +propagate. In the :ref:`ring network <tutorialnetworkring>` we could see it +takes about 5 ms for the signal to propagate through one cell, so let's set the +runtime to ``5*ncells``. Then, another checkpoint, so that we'll know how long +the simulation took. .. literalinclude:: ../../python/example/network_ring_gpu.py :language: python - :lines: 156-159 + :lines: 158-161 The results *********** -The scientific results should be similar, other than number of cells, to those in :ref:`ring network <tutorialnetworkring>`, -so we'll not discuss them here. Let's turn our attention to the :class:`~arbor.meter_manager`. +The scientific results should be similar, other than number of cells, to those +in :ref:`ring network <tutorialnetworkring>`, so we'll not discuss them here. +Let's turn our attention to the :class:`~arbor.meter_manager`. .. literalinclude:: ../../python/example/network_ring_gpu.py :language: python - :lines: 161-163 + :lines: 163-165 -Step **(18)** shows how :class:`arbor.meter_report` can be used to read out the :class:`~arbor.meter_manager`. -It generates a table with the time between checkpoints. As an example, the following table is the result of a run -on a 2019 laptop CPU: +Step **(18)** shows how :class:`arbor.meter_report` can be used to read out the +:class:`~arbor.meter_manager`. It generates a table with the time between +checkpoints. As an example, the following table is the result of a run on a 2019 +laptop CPU: :: diff --git a/doc/tutorial/network_two_cells_gap_junctions.rst b/doc/tutorial/network_two_cells_gap_junctions.rst index 8e1293ec8054f200d9cbec7bcf0a2f5cd4f4c066..241bfb37a6fd01b65c4ab12050083320fa0e4583 100644 --- a/doc/tutorial/network_two_cells_gap_junctions.rst +++ b/doc/tutorial/network_two_cells_gap_junctions.rst @@ -3,9 +3,11 @@ Two cells connected via a gap junction ====================================== -In this example, we will set up two cells connected via a gap junction. -The cells have different leak potentials. -We will investigate how the equilibrium potentials of the two cells change because of the gap junction connection. +In this example, we will set up two cells connected via a gap junction. Each of +the cells has a passive leak current as its only dynamics. This plus the gap +junction will produce an equilibrium potential different from both the resting +potentials. We will investigate how the equilibrium potentials of the two cells +change due of the gap junction connection. .. figure:: network_two_cells_gap_junctions_circuit.svg :width: 400 @@ -22,6 +24,9 @@ We will investigate how the equilibrium potentials of the two cells change becau 3. Running the simulation and extracting the results. 4. Adding a gap junction connection. +We assume prior exposure to the concepts of cable cells, recipes, and simple +networks. + Walk-through ************ @@ -29,54 +34,73 @@ We set up a recipe for the simulation of two cells .. literalinclude:: ../../python/example/network_two_cells_gap_junctions.py :language: python - :lines: 13-45 + :lines: 13-37 in which we store the relevant parameters for the two cells, all of which are -shared except the equilibrium potentials in ``Vms``. Next, we define callbacks -to define our cell population: +shared except the equilibrium potentials in ``Vms``. These are used to build +the network. + +Let's quickly check some standard callbacks: -- ``num_cells`` returns the number of cells in the network, ie 2 +- ``num_cells`` returns the number of cells in the network, fixed as 2 - ``cell_kind`` specifies that we handle ``cable_cell`` exclusively. -- ``global_properties`` returns a list of standard parameters based on the defaults of the NEURON simulator. -- ``cell_description`` member function constructs the morphology and sets the properties of the cells as well as the gap junction mechanisms and the discretization policy. It returns the finished ``cable_cell``, matching the ``cell_kind`` callback. +- ``global_properties`` returns a list of standard parameters based on the + defaults of the NEURON simulator. +- ``probes`` record the membrane potential at the cell mid. -.. literalinclude:: ../../python/example/network_two_cells_gap_junctions.py - :language: python - :lines: 49-93 +The two remaining methods are: + +``cell_description`` +-------------------- -We build the network conections, here a single, bidirectional gap junction +We construct a basic, single segment morphology from the ``length`` and +``radius`` parameters. The decor sets the basic parameters and adds the passive +leak current ``pas`` with the given resting value ``Vms[gid]`` and conductivity +``g``. .. literalinclude:: ../../python/example/network_two_cells_gap_junctions.py :language: python - :lines: 97-105 + :lines: 58 -And, finally, we return a set of probes which are passed in during construction +The only new item is the placement of the gap junction endpoint at ``midpoint`` +with the basic, builtin ``gj`` dynamics type (other dynamics may be defined and +used). -.. literalinclude:: ../../python/example/network_two_cells_gap_junctions.py - :language: python - :lines: 108-109 -We parse the command line arguments which are used to set parameters in the recipe +``gap_junctions_on`` +------------------- + +Similar to ``connections_on``, this method returns a list of gap junction +connections and these are defined in the same manner. .. literalinclude:: ../../python/example/network_two_cells_gap_junctions.py :language: python - :lines: 113-147 + :lines: 69-70 + +By ``(gid + 1) % 2`` we define two connections, one per cell, between the cells. +This is due to the uni-directional definition of gap junctions in Arbor. -Next, we define a list of probes and construct the recipe and simulation +Running the simulation +********************** + +To allow runtime configuration, we define a parser for command line arguments +which are used to set parameters in the recipe .. literalinclude:: ../../python/example/network_two_cells_gap_junctions.py :language: python - :lines: 149-154 + :lines: 76-98 + -Having set up the simulation, we setting probe sampling on a regular grid with -width equal to the timestep :math:`dt`. Now, we can run it and access the sampling values +We then set up the simulation and configure sampling width equal to the timestep +:math:`dt`. Now, we can run the network. .. literalinclude:: ../../python/example/network_two_cells_gap_junctions.py :language: python - :lines: 156-178 + :lines: 100-110 All that is left to do is to put this into a plot. The output plot below shows -how the potential of the two cells approaches their equilibrium potentials +how the potential of the two cells approaches their equilibrium potentials, which +can be computed from the given parameters. .. math:: @@ -90,7 +114,7 @@ how the potential of the two cells approaches their equilibrium potentials The full code -************* +************** You can find the full code of the example at ``python/examples/network_two_cells_gap_junctions.py`` diff --git a/doc/tutorial/probe_lfpykit.rst b/doc/tutorial/probe_lfpykit.rst index 5d25710010e859cbcc91e796f5a603c7e4b475f7..b1126b2b2d33dd64c969876ce92600fae7f54a87 100644 --- a/doc/tutorial/probe_lfpykit.rst +++ b/doc/tutorial/probe_lfpykit.rst @@ -5,11 +5,12 @@ Extracellular signals (LFPykit) This example takes elements from other tutorials to create a geometrically detailed single cell model from an SWC morphology file, and adds predictions of -extracellular potentials using the `LFPykit <https://lfpykit.readthedocs.io/en/latest>`_ Python library. -LFPykit provides a few different classes facilitating -calculations of extracellular potentials and related electroencephalography (EEG) -and magnetoencephalography (MEG) signals from geometrically detailed neuron models under various assumptions. -These are signals that mainly stem from transmembrane currents. +extracellular potentials using the `LFPykit +<https://lfpykit.readthedocs.io/en/latest>`_ Python library. LFPykit provides a +few different classes facilitating calculations of extracellular potentials and +related electroencephalography (EEG) and magnetoencephalography (MEG) signals +from geometrically detailed neuron models under various assumptions. These are +signals that mainly stem from transmembrane currents. .. Note:: @@ -25,16 +26,15 @@ These are signals that mainly stem from transmembrane currents. The line source approximation ----------------------------- -First, let's describe how one can compute extracellular potentials from transmembrane currents of a number of segments, -assuming that each segment can be treated as an equivalent line current source using a formalism invented -by Gary R. Holt and Christof Koch [1]_. -The implementation used in this tutorial rely on :class:`lfpykit.LineSourcePotential`. -This class conveniently defines a 2D linear response matrix -:math:`\mathbf{M}` between transmembrane current array -:math:`\mathbf{I}` (nA) of a neuron model's -geometry (:class:`lfpykit.CellGeometry`) and the -corresponding extracellular electric potential in different extracellular locations -:math:`\mathbf{V}_{e}` (mV) so +First, let's describe how one can compute extracellular potentials from +transmembrane currents of a number of segments, assuming that each segment can +be treated as an equivalent line current source using a formalism invented by +Gary R. Holt and Christof Koch [1]_. The implementation used in this tutorial +rely on :class:`lfpykit.LineSourcePotential`. This class conveniently defines a +2D linear response matrix :math:`\mathbf{M}` between transmembrane current array +:math:`\mathbf{I}` (nA) of a neuron model's geometry +(:class:`lfpykit.CellGeometry`) and the corresponding extracellular electric +potential in different extracellular locations :math:`\mathbf{V}_{e}` (mV) so .. math:: \mathbf{V}_{e} = \mathbf{M} \mathbf{I} @@ -60,16 +60,18 @@ electrode point contact to the axis of the line segment is denoted segment is denoted :math:`h_{ji}` and longitudinal distance from the other end of the segment is denoted :math:`l_{ji}= L_i + h_{ji}`. -.. Note:: - - **Assumptions:** +.. admonition:: Assumptions - 1. The extracellular conductivity :math:`\sigma` is infinite, homogeneous, frequency independent (linear) and isotropic - 2. Each segment is treated as a straight line source with homogeneous current density between its start and end point coordinate. - Although Arbor allows segments to be defined as conical frusta with varying radius, we shall assume that any variation in - radius is small relative to overall segment length. + 1. The extracellular conductivity :math:`\sigma` is infinite, homogeneous, + frequency independent (linear) and isotropic + 2. Each segment is treated as a straight line source with homogeneous + current density between its start and end point coordinate. Although + Arbor allows segments to be defined as conical frusta with varying + radius, we shall assume that any variation in radius is small relative to + overall segment length. 3. Each extracellular measurement site is treated as a point - 4. The minimum distance to a line source is set equal to the average segment radius to avoid singularities. + 4. The minimum distance to a line source is set equal to the average segment + radius to avoid singularities. .. _tutorial_lfpykit-model: @@ -85,13 +87,14 @@ First we import some required modules: .. literalinclude:: ../../python/example/probe_lfpykit.py :language: python - :lines: 14-17 + :lines: 15-18 -We define a basic :class:`Recipe <arbor.recipe>` class, holding a cell and three probes (voltage, stimulus current and total current): +We define a basic :class:`Recipe <arbor.recipe>` class, holding a cell and three +probes (voltage, stimulus current and total current): .. literalinclude:: ../../python/example/probe_lfpykit.py :language: python - :lines: 22-54 + :lines: 24-51 Then, load a morphology on ``SWC`` file format (interpreted according to :ref:`Arbor's specifications <morph-formats>`). Similar to the tutorial :ref:`"A simple single cell model" <tutorialsinglecellswc>`, @@ -103,89 +106,81 @@ we use the morphology file in ``python/example/single_cell_detailed.swc``: A graphic depiction of ``single_cell_detailed.swc``. -Pass the filename as an argument to the simulation script: - -.. literalinclude:: ../../python/example/probe_lfpykit.py - :language: python - :lines: 57-66 - -As a target for a current stimuli we define an :class:`arbor.location` : +Read the morphology from a file or use the default .. literalinclude:: ../../python/example/probe_lfpykit.py :language: python - :lines: 68-69 + :lines: 54-65 -Next, we let a basic function define our cell model, taking the morphology and clamp location as -input. -The function defines various attributes (:class:`~arbor.label_dict`, :class:`~arbor.decor`) for -the cell model, -sets sinusoid current clamp as stimuli using :class:`~arbor.iclamp` -defines discretization policy (:class:`~arbor.cv_policy_fixed_per_branch`) -and returns the corresponding :class:`~arbor.place_pwlin` and :class:`~arbor.cable_cell` objects for use later: +As a target for a current stimulus we define .. literalinclude:: ../../python/example/probe_lfpykit.py :language: python - :lines: 72-114 + :lines: 67-68 -Store the function output: +Next, we define our cell model, based on the morphology and clamp location. We +set various attributes (:class:`~arbor.label_dict`, :class:`~arbor.decor`) for +the cell model, attaches a sinusoid current using :class:`~arbor.iclamp`, and +sets discretization policy ats :class:`~arbor.cv_policy_fixed_per_branch`. .. literalinclude:: ../../python/example/probe_lfpykit.py :language: python - :lines: 117-118 + :lines: 70-94 -Next, we instantiate :class:`Recipe`, and execute the model for a few hundred ms, -sampling the different signals every 1 ms: +Next, we instantiate :class:`Recipe`, configure the sampling, and execute the +model for a few hundred ms: .. literalinclude:: ../../python/example/probe_lfpykit.py :language: python - :lines: 120-133 + :lines: 99-112 -Extract recorded membrane voltages, electrode and transmembrane currents. -Note that membrane voltages at branch points and intersections between CVs are dropped as -we only illustrate membrane voltages of segments with finite lengths. +Extract recorded membrane voltages, electrode and transmembrane currents. Note +that membrane voltages at branch points and intersections between CVs are +dropped as we only illustrate membrane voltages of segments with finite lengths. .. literalinclude:: ../../python/example/probe_lfpykit.py :language: python - :lines: 135-150 + :lines: 114-133 -Finally we sum the stimulation and transmembrane currents, allowing the stimuli to mimic a synapse -current embedded in the membrane itself rather than an intracellular electrode current: +Finally we sum the stimulation and transmembrane currents, allowing the stimuli +to mimic a synapse current embedded in the membrane itself rather than an +intracellular electrode current: .. literalinclude:: ../../python/example/probe_lfpykit.py :language: python - :lines: 152-158 + :lines: 135-137 .. _tutorial_lfpykit-lfpykit: Compute extracellular potentials -------------------------------- -Here we utilize the LFPykit library to map -transmembrane currents recorded during the -simulation to extracellular potentials in vicinity to the cell. -We shall account for every segment in each CV using the so-called line-source approximation described :ref:`above <tutorial_lfpykit-linesource>`. +Here we utilize the LFPykit library to map trans-membrane currents recorded +during the simulation to extracellular potentials in vicinity to the cell. We +shall account for every segment in each CV using the so-called line-source +approximation described :ref:`above <tutorial_lfpykit-linesource>`. -First we define a couple of inherited classes to interface LFPykit -(as this library is not solely written for Arbor). -Starting with a class inherited from :class:`lfpykit.CellGeometry`: +First, we define a couple of inherited classes to interface with LFPykit, as +this library is not solely written for Arbor. Starting with a class inherited +from :class:`lfpykit.CellGeometry`: .. literalinclude:: ../../python/example/probe_lfpykit.py :language: python - :lines: 168-200 + :lines: 145-180 Then, a class inherited from :class:`lfpykit.LineSourcePotential`. Other use cases may inherit from any other parent class defined in :mod:`lfpykit.models` in a similar manner: .. literalinclude:: ../../python/example/probe_lfpykit.py :language: python - :lines: 202-251 + :lines: 183-231 -With these two classes one may then compute extracellular potentials from transmembrane -currents in space with a few lines of code: +With these two classes one may then compute extracellular potentials from +transmembrane currents in space with a few lines of code: .. literalinclude:: ../../python/example/probe_lfpykit.py :language: python - :lines: 254-276 + :lines: 234-256 .. _tutorial_lfpykit-illustration: diff --git a/doc/tutorial/single_cell_allen.rst b/doc/tutorial/single_cell_allen.rst index b1fae81fafdd41a7a34b94dee08f1cc787a4b94a..652e9193123fe987a51fcf43c573189e4cf38be8 100644 --- a/doc/tutorial/single_cell_allen.rst +++ b/doc/tutorial/single_cell_allen.rst @@ -37,33 +37,47 @@ In the "Biophysical - all active" model (zip) file you'll find: We will replicate the "Sweep 35" experiment, which applies a current of 150 nA for a duration of 1 s. -The morphology --------------- +Morphology and Labels +--------------------- .. literalinclude:: ../../python/example/single_cell_allen.py :language: python :dedent: - :lines: 74-80 + :lines: 80-81 -Step **(1)** loads the ``swc`` file using :func:`arbor.load_swc_neuron`. Since the ``swc`` specification is informal, a few different interpretations exist, and we use the appropriate one. The interpretations are described :ref:`here <formatswc-arbor>`. +Step **(1)** loads the ``swc`` file using :func:`arbor.load_swc_neuron`. Since +the ``swc`` specification is informal, a few different interpretations exist, +and we use the appropriate one. The interpretations are described :ref:`here +<formatswc-arbor>`. -Step **(2)** sets the labels to the defaults of the ``swc`` -`specification <http://www.neuronland.org/NLMorphologyConverter/MorphologyFormats/SWC/Spec.html>`_, -plus a label for the midpoint of the soma. (You can verify in the ``swc`` file, the first branch is the soma.) +.. literalinclude:: ../../python/example/single_cell_allen.py + :language: python + :dedent: + :lines: 83-86 + +Step **(2)** sets the labels to the defaults of the ``swc`` `specification +<http://www.neuronland.org/NLMorphologyConverter/MorphologyFormats/SWC/Spec.html>`_, +plus a label for the midpoint of the soma. (You can verify in the ``swc`` file, +the first branch is the soma.) The parameter fit ----------------- -The most complicated part is transferring the values for the appropriate parameters in parameter fit file to an -:class:`arbor.decor`. The file file is a ``json`` file, which is fortunate; Python comes with a ``json`` package -in its standard library. The `passive` and `conditions` block contains cell-wide defaults, while the `genome` -section contains the parameters for all the mechanism properties. In certain cases, parameters names include the -mechanism name, so some processing needs to take place. - -Step **(3)** shows the precise steps needed to load the fit parameter file into a list of global properties, -region specific properties, reversal potentials, and mechanism parameters. This is not a generic function that will successfully load any Allen model, but it can be used as a starting point. The function composes 4 components out of the ``json`` file: - -1. global electro-physiological parameters, +The most complicated part is transferring the values for the appropriate +parameters in parameter fit file to an :class:`arbor.decor`. The file file is a +``json`` file, which is fortunate; Python comes with a ``json`` package in its +standard library. The `passive` and `conditions` block contains cell-wide +defaults, while the `genome` section contains the parameters for all the +mechanism properties. In certain cases, parameters names include the mechanism +name, so some processing needs to take place. + +Step **(3)** shows the precise steps needed to load the fit parameter file into +a list of global properties, region specific properties, reversal potentials, +and mechanism parameters. This is not a generic function that will successfully +load any Allen model, but it can be used as a starting point. The function +composes 4 components out of the ``json`` file: + +1. global electro-physiological parameters 2. a set of electro-physiological parameters per region, 3. a set of reversal potentials per ion species and region, 4. a set of mechanisms with parameters per region. @@ -71,34 +85,44 @@ region specific properties, reversal potentials, and mechanism parameters. This .. literalinclude:: ../../python/example/single_cell_allen.py :language: python :dedent: - :lines: 12-72,82,83 + :lines: 19-76 The decor --------- -With the ingredients for the :class:`arbor.decor` extracted, we continue with the function that will return the cable cell from the model as an :class:`arbor.cable_cell`. +With the ingredients for the :class:`arbor.decor` extracted, we continue with +the function that will return the cable cell from the model as an +:class:`arbor.cable_cell`. .. literalinclude:: ../../python/example/single_cell_allen.py :language: python :dedent: - :lines: 85-117 + :lines: 79-138 Step **(4)** creates an empty :class:`arbor.decor`. -Step **(5)** assigns global (cell-wide) properties using :func:`arbor.decor.set_property`. In addition, initial -internal and external calcium concentrations are set, and configured to be determined by the Nernst equation. +Step **(5)** assigns global (cell-wide) properties using +:func:`arbor.decor.set_property`. In addition, initial internal and external +calcium concentrations are set, and configured to be determined by the Nernst +equation. .. note:: - Setting the calcium reversal potential to be determined by the Nernst equation has to be done manually, in order to mirror - `an implicit Neuron behavior <https://neuron.yale.edu/neuron/static/new_doc/modelspec/programmatic/ions.html>`_, - for which the fit parameters were obtained. This behavior can be stated as the following rule: - If the internal or external concentration of an ion is written, and its reversal potential is read but not - written, then the Nernst equation is used continuously during the simulation to update the reversal potential of - the ion according to the Nernst equation + Setting the calcium reversal potential to be determined by the Nernst + equation has to be done manually, in order to mirror `an implicit Neuron + behavior + <https://neuron.yale.edu/neuron/static/new_doc/modelspec/programmatic/ions.html>`_, + for which the fit parameters were obtained. This behavior can be stated as + the following rule: -Step **(6)** overrides the global properties for all *regions* for which the fit parameters file specifies adapted -values. Regional properties are :func:`painted <arbor.decor.paint>`, and are painted over (e.g. replacing) the defaults. + If the internal or external concentration of an ion is written, and its + reversal potential is read but not written, then the Nernst equation is used + continuously during the simulation to update the reversal potential of the + ion according to the Nernst equation + +Step **(6)** overrides the global properties for all *regions* for which the fit +parameters file specifies adapted values. Regional properties are :func:`painted +<arbor.decor.paint>`, and are painted over (e.g. replacing) the defaults. Step **(7)** sets the regional reversal potentials. @@ -106,10 +130,12 @@ Step **(8)** assigns the regional mechanisms. Now that the electro-physiology is all set up, let's move on to the experimental setup. -Step **(9)** configures the :class:`stimulus <arbor.iclamp>` of 150 nA for a duration of 1 s, starting after 200 ms -of the start of the simulation. We'll also install a :class:`arbor.threshold_detector` that triggers at -40 mV. (The -location is usually the soma, as is confirmed by coordinates found in the experimental dataset at -``488683423.nwb/general/intracellular_ephys/Electrode 1/location``) +Step **(9)** configures the :class:`stimulus <arbor.iclamp>` of 150 nA for a +duration of 1 s, starting after 200 ms of the start of the simulation. We'll +also install a :class:`arbor.threshold_detector` that triggers at -40 mV. (The +location is usually the soma, as is confirmed by coordinates found in the +experimental dataset at ``488683423.nwb/general/intracellular_ephys/Electrode +1/location``) Step **(10)** specifies a maximum :term:`control volume` length of 20 μm. @@ -121,45 +147,56 @@ The model .. literalinclude:: ../../python/example/single_cell_allen.py :language: python :dedent: - :lines: 120-131 + :lines: 141-152 -Step **(12)** instantiates the :class:`arbor.cable_cell` and an :class:`arbor.single_cell_model`. +Step **(12)** instantiates the :class:`arbor.cable_cell` and an +:class:`arbor.single_cell_model`. -Step **(13)** shows how to install a probe to the ``"midpoint"``, with a sampling frequency of 200 kHz. +Step **(13)** shows how to install a probe to the ``"midpoint"``, with a +sampling frequency of 200 kHz. -Step **(14)** installs the :class:`arbor.allen_catalogue`, thereby making its mechanisms available to the definitions added to the decor. +Step **(14)** installs the :class:`arbor.allen_catalogue`, thereby making its +mechanisms available to the definitions added to the decor. Step **(15)** starts the simulation for a duration of 1.4 s and a timestep of 5 ms. The result ---------- -Let's look at the result! In step **(16)** we first load the reference generated with Neuron and the AllenSDK. -Then, we extract Arbor's output, accessible after the simulation ran at -:class:`arbor.single_cell_model.traces`. Then, we plot them, together with the :class:`arbor.single_cell_model.spikes` in step **(17)**. +Let's look at the result! In step **(16)** we first load the reference generated +with Neuron and the AllenSDK. Then, we extract Arbor's output, accessible after +the simulation ran at :class:`arbor.single_cell_model.traces`. Then, we plot +them, together with the :class:`arbor.single_cell_model.spikes` in step +**(17)**. .. literalinclude:: ../../python/example/single_cell_allen.py :language: python :dedent: - :lines: 133- + :lines: 154- .. figure:: single_cell_allen_result.svg :width: 400 :align: center - Plot of experiment 35 of the Allen model, compared to the reference generated by the AllenSDK. In green: the threshold detector output; in shaded grey: the stimulus. + Plot of experiment 35 of the Allen model, compared to the reference + generated by the AllenSDK. In green: the threshold detector output; in + shaded grey: the stimulus. .. note:: - The careful observer notices that this trace does not match the experimental data shown on the Allen website - (or in the ``488683423.nwb`` file). Sweep 35 clearly has 5 spikes, not 4. That is because in the Allen SDK, - the axon in the ``swc`` file is replaced with a stub, see - `this paper <https://www.biorxiv.org/content/10.1101/2020.04.09.030239v1.full>`_ and `this AllenSDK Issue <https://github.com/AllenInstitute/AllenSDK/issues/1683>`_. - However, that adapted morphology is not exportable back to a modified ``swc`` file. When we tried to mimic - the procedure, we did not obtain the experimental trace. - - Therefore, we used the unmodified morphology in Arbor *and* the Neuron reference (by commenting out the - changes the Allen SDK makes to the morphology) in order to make a 1:1 comparison possible. + The careful observer notices that this trace does not match the experimental + data shown on the Allen website (or in the ``488683423.nwb`` file). Sweep 35 + clearly has 5 spikes, not 4. That is because in the Allen SDK, the axon in the + ``swc`` file is replaced with a stub, see `this paper + <https://www.biorxiv.org/content/10.1101/2020.04.09.030239v1.full>`_ and `this + AllenSDK Issue <https://github.com/AllenInstitute/AllenSDK/issues/1683>`_. + However, that adapted morphology is not exportable back to a modified ``swc`` + file. When we tried to mimic the procedure, we did not obtain the experimental + trace. + + Therefore, we used the unmodified morphology in Arbor *and* the Neuron + reference (by commenting out the changes the Allen SDK makes to the + morphology) in order to make a 1:1 comparison possible. The full code ------------- diff --git a/doc/tutorial/single_cell_detailed.rst b/doc/tutorial/single_cell_detailed.rst index d7cc8f0868ba9b23fd43d3922131fd5a077104ce..c5e638ba3604216021df488bbe662f9c7d20716d 100644 --- a/doc/tutorial/single_cell_detailed.rst +++ b/doc/tutorial/single_cell_detailed.rst @@ -41,39 +41,54 @@ We begin by constructing the following morphology: :width: 600 :align: center -This can be done by manually building a segment tree: +This can be done by manually building a segment tree. The important bit here is +that ``append`` will take an id to attach to and return the newly added id. This +is exceptionally handy when building a tree structure, as we can elect to +remember or overwrite the last id. Alternatively, you could use numeric ids -- +they are just sequentially numbered by insertion order --, but we find that this +becomes tedious quickly. The image above shows the numeric ids for the specific +insertion order below, but different orders will produce the same morphology. .. code-block:: python - import arbor - from arbor import mpoint - from arbor import mnpos - - # Define the morphology by manually building a segment tree - + # Construct an empty segment tree. tree = arbor.segment_tree() - # Start with segment 0: a cylindrical soma with tag 1 - tree.append(mnpos, mpoint(0.0, 0.0, 0.0, 2.0), mpoint( 40.0, 0.0, 0.0, 2.0), tag=1) - # Construct the first section of the dendritic tree with tag 3, - # comprised of segments 1 and 2, attached to soma segment 0. - tree.append(0, mpoint(40.0, 0.0, 0.0, 0.8), mpoint( 80.0, 0.0, 0.0, 0.8), tag=3) - tree.append(1, mpoint(80.0, 0.0, 0.0, 0.8), mpoint(120.0, -5.0, 0.0, 0.8), tag=3) - # Construct the rest of the dendritic tree: segments 3, 4 and 5. - tree.append(2, mpoint(120.0, -5.0, 0.0, 0.8), mpoint(200.0, 40.0, 0.0, 0.4), tag=3) - tree.append(3, mpoint(200.0, 40.0, 0.0, 0.4), mpoint(260.0, 60.0, 0.0, 0.2), tag=3) - tree.append(2, mpoint(120.0, -5.0, 0.0, 0.5), mpoint(190.0, -30.0, 0.0, 0.5), tag=3) - # Construct a special region of the tree made of segments 6, 7, and 8 - # differentiated from the rest of the tree using tag 4. - tree.append(5, mpoint(190.0, -30.0, 0.0, 0.5), mpoint(240.0, -70.0, 0.0, 0.2), tag=4) - tree.append(5, mpoint(190.0, -30.0, 0.0, 0.5), mpoint(230.0, -10.0, 0.0, 0.2), tag=4) - tree.append(7, mpoint(230.0, -10.0, 0.0, 0.2), mpoint(360.0, -20.0, 0.0, 0.2), tag=4) - # Construct segments 9 and 10 that make up the axon with tag 2. - # Segment 9 is at the root, where its proximal end will be connected to the - # proximal end of the soma segment. - tree.append(mnpos, mpoint( 0.0, 0.0, 0.0, 2.0), mpoint( -70.0, 0.0, 0.0, 0.4), tag=2) - tree.append(9, mpoint(-70.0, 0.0, 0.0, 0.4), mpoint(-100.0, 0.0, 0.0, 0.4), tag=2) - + # The root of the tree has no parent + root = arbor.mnpos + + # The root segment: a cylindrical soma with tag 1 + # NOTE: append returns the added segment's id, which we can use to + # attach the next segments. + soma = tree.append(root, (0.0, 0.0, 0.0, 2.0), (40.0, 0.0, 0.0, 2.0), tag=1) + + # Attach the first section of the dendritic tree with tag 3 to the soma + # up to the first fork + dend = tree.append(soma, (40.0, 0.0, 0.0, 0.8), ( 80.0, 0.0, 0.0, 0.8), tag=3) + dend = tree.append(dend, (80.0, 0.0, 0.0, 0.8), (120.0, -5.0, 0.0, 0.8), tag=3) + + # Construct upper part of the first fork + # NOTE: We do not overwrite the parent here, as we need to attach the + # lower fork later. Instead we use new names for this branch. + dend_u = tree.append(dend, (120.0, -5.0, 0.0, 0.8), (200.0, 40.0, 0.0, 0.4), tag=3) + dend_u = tree.append(dend_u, (200.0, 40.0, 0.0, 0.4), (260.0, 60.0, 0.0, 0.2), tag=3) + + # Construct lower part of the first fork + dend_l = tree.append(dend, (120.0, -5.0, 0.0, 0.5), (190.0, -30.0, 0.0, 0.5), tag=3) + + # Attach another fork to the last segment, ``p``. + # Upper part + dend_lu = tree.append(dend_l, (190.0, -30.0, 0.0, 0.5), (240.0, -70.0, 0.0, 0.2), tag=4) + # Lower part + dend_ll = tree.append(dend_l, (190.0, -30.0, 0.0, 0.5), (230.0, -10.0, 0.0, 0.2), tag=4) + dend_ll = tree.append(dend_ll, (230.0, -10.0, 0.0, 0.2), (360.0, -20.0, 0.0, 0.2), tag=4) + + # Construct the axon with tag 2, attaching to the root ``mnpos``, where its + # proximal end will be connected to the proximal end of the soma segment implicitly. + axon = tree.append(root, (0.0, 0.0, 0.0, 2.0), (-70.0, 0.0, 0.0, 0.4), tag=2) + axon = tree.append(axon, (-70.0, 0.0, 0.0, 0.4), (-100.0, 0.0, 0.0, 0.4), tag=2) + + # Turn segment tree into a morphology. morph = arbor.morphology(tree); The same morphology can be represented using an SWC file (interpreted according @@ -97,31 +112,39 @@ The morphology can then be loaded from ``single_cell_detailed.swc`` in the follo .. literalinclude:: ../../python/example/single_cell_detailed.py :language: python - :lines: 10-20 + :lines: 11-22 + +We allow passing of any valid SWC file so you can easily experiment with your +own morphologies but employ some Python magic to grab the default file which +lives in the same directory as the example. In general, using a data file for +constructing morphologies should be preferred. + The label dictionary ^^^^^^^^^^^^^^^^^^^^ -Next, we can define **region** and **location** expressions and give them labels. -The regions and locations are defined using an Arbor-specific DSL, and the labels -can be stored in a :class:`arbor.label_dict`. +Next, we can define **region** and **location** expressions and give them +labels. The regions and locations are defined using an Arbor-specific DSL, and +the labels can be stored in a :class:`arbor.label_dict`. .. Note:: - The expressions in the label dictionary don't actually refer to any concrete regions - or locations of the morphology at this point. They are merely descriptions that can be - applied to any morphology, and depending on its geometry, they will generate different - regions and locations. However, we will show some figures illustrating the effect of - applying these expressions to the above morphology, in order to better visualize the - final cell. + The expressions in the label dictionary don't actually refer to any concrete + regions or locations of the morphology at this point. They are merely queries + that can be applied to any morphology, and depending on its geometry, they + will generate different regions and locations. However, we will show some + figures illustrating the effect of applying these expressions to the above + morphology, in order to better visualize the final cell. - More information on region and location expressions is available :ref:`here <labels>`. + More information on region and location expressions is available :ref:`here + <labels>`. The SWC file format allows association of ``tags`` with parts of the morphology and reserves tag values 1-4 for commonly used sections (see `here <http://www.neuronland.org/NLMorphologyConverter/MorphologyFormats/SWC/Spec.html>`__ -for the SWC file format). In Arbor, these tags can be added to a :class:`arbor.label_dict` using -the :meth:`~arbor.label_dict.add_swc_tags` method, which will define +for the SWC file format). In Arbor, these tags can be added to a +:class:`arbor.label_dict` using the :meth:`~arbor.label_dict.add_swc_tags` +method, which will define .. list-table:: Default SWC Tags :widths: 25 25 50 @@ -162,9 +185,9 @@ Both ways will generate the following regions when applied to the previously def From left to right: regions "soma", "axon", "dend" and "last" -We can also define a region that represents the whole cell; and to make things a bit more interesting, -a region that includes the parts of the morphology that have a radius greater than 1.5 μm. This is done -in the following way: +We can also define a region that represents the whole cell; and to make things a +bit more interesting, a region that includes the parts of the morphology that +have a radius greater than 1.5 μm. This is done in the following way: .. literalinclude:: ../../python/example/single_cell_detailed.py :language: python @@ -227,6 +250,23 @@ This will generate the following 2 locsets when applied to the previously define Left: locset "custom_terminal"; right: locset "axon_terminal" +.. note:: + + We show the use of the label dictionary here, but everywhere a label is + valid, you can use the DSL expression directly, so + + .. code-block:: python + + decor.paint('(all)', arbor.density("pas")) + + is perfectly acceptable, as is + + .. code-block:: python + + all = '(all)' + decor.paint(all, arbor.density("pas")) + + The decorations ^^^^^^^^^^^^^^^ @@ -243,79 +283,87 @@ region or location expressions. More information on decors can be found :ref:`here <cablecell-decoration>`. -The decor object can have default values for properties, which can then be overridden on specific -regions. It is in general better to explicitly set all the default properties of your cell, -to avoid the confusion to having simulator-specific default values. This will therefore be our first -step: +The decor object can have default values for properties, which can then be +overridden on specific regions. It is in general better to explicitly set all +the default properties of your cell, to avoid the confusion to having +simulator-specific default values. This will therefore be our first step: .. literalinclude:: ../../python/example/single_cell_detailed.py :language: python - :lines: 48-52 - -We have set the default initial membrane voltage to -55 mV; the default initial -temperature to 300 K; the default axial resistivity to 35.4 Ω·cm; and the default membrane -capacitance to 0.01 F/m². - -We also set the initial properties of the *na* and *k* ions because they will be utilized -by the density mechanisms that we will be adding shortly. -For both ions we set the default initial concentration and external concentration measures in mM; -and we set the default initial reversal potential in mV. For the *na* ion, we additionally indicate -the the progression on the reversal potential during the simulation will be dictated by the -`Nernst equation <https://en.wikipedia.org/wiki/Nernst_equation>`_. - -It happens, however, that we want the temperature of the "custom" region defined in the label -dictionary earlier to be colder, and the initial voltage of the "soma" region to be higher. -We can override the default properties by *painting* new values on the relevant regions using -:meth:`arbor.decor.paint`. + :lines: 48-62 + +We have set the default initial membrane voltage mV; the default initial +temperature; the default axial resistivity to; and the default membrane +capacitance to. Also, the initial properties of the *na* and *k* ions have been +changed. They will be utilized by the density mechanisms that we will be adding +shortly. For both ions we set the default initial concentration and external +concentration measures; and we set the default initial reversal potential. For +the *na* ion, we additionally indicate the the progression on the reversal +potential during the simulation will be dictated by the `Nernst equation +<https://en.wikipedia.org/wiki/Nernst_equation>`_. In the case that defaults are +not set at the cell level, there is also a global default which we will define a +bit later. + +It happens, however, that we want the temperature of the "custom" region defined +in the label dictionary earlier to be colder, and the initial voltage of the +"soma" region to be higher. We can override the default properties by *painting* +new values on the relevant regions using :meth:`arbor.decor.paint`. .. literalinclude:: ../../python/example/single_cell_detailed.py :language: python - :lines: 53-55 + :lines: 63-65 -With the default and initial values taken care of, we now add some density mechanisms. Let's *paint* -a *pas* density mechanism everywhere on the cell using the previously defined "all" region; an *hh* -density mechanism on the "custom" region; and an *Ih* density mechanism on the "dend" region. The *Ih* -mechanism has a custom 'gbar' parameter. +With the default and initial values taken care of, we now add some density +mechanisms. Let's *paint* a *pas* density mechanism everywhere on the cell using +the previously defined "all" region; an *hh* density mechanism on the "custom" +region; and an *Ih* density mechanism on the "dend" region. The *Ih* mechanism +has a custom 'gbar' parameter. .. literalinclude:: ../../python/example/single_cell_detailed.py :language: python - :lines: 8,56-59 + :lines: 66-69 -The decor object is also used to *place* stimuli and threshold detectors on the cell using :meth:`arbor.decor.place`. -We place 3 current clamps of 2 nA on the "root" locset defined earlier, starting at time = 10, 30, 50 ms and -lasting 1ms each. As well as threshold detectors on the "axon_terminal" locset for voltages above -10 mV. -Every placement gets a label. The labels of detectors and synapses are used to form connection from and to them -in the recipe. +The decor object is also used to *place* stimuli and threshold detectors on the +cell using :meth:`arbor.decor.place`. We place 3 current clamps of 2 nA on the +"root" locset defined earlier, starting at time = 10, 30, 50 ms and lasting 1ms +each. As well as threshold detectors on the "axon_terminal" locset for voltages +above -10 mV. Every placement gets a label. The labels of detectors and synapses +are used to form connection from and to them in the recipe. .. literalinclude:: ../../python/example/single_cell_detailed.py :language: python - :lines: 60-64 + :lines: 70-74 .. Note:: - The number of individual locations in the ``'axon_terminal'`` locset depends on the underlying morphology and the - number of axon branches in the morphology. The number of detectors that get added on the cell is equal to the number - of locations in the locset, and the label ``'detector'`` refers to all of them. If we want to refer to a single - detector from the group (to form a network connection for example), we need a :py:class:`arbor.selection_policy`. - -Finally, there's one last property that impacts the behavior of a model: the discretisation. -Cells in Arbor are simulated as discrete components called control volumes (CV). The size of -a CV has an impact on the accuracy of the results of the simulation. Usually, smaller CVs -are more accurate because they simulate the continuous nature of a neuron more closely. - -The user controls the discretisation using a :class:`arbor.cv_policy`. There are a few different policies to -choose from, and they can be composed with one another. In this example, we would like the "soma" region -to be a single CV, and the rest of the morphology to be comprised of CVs with a maximum length of 1 μm: + The number of individual locations in the ``'axon_terminal'`` locset depends + on the underlying morphology and the number of axon branches in the + morphology. The number of detectors that get added on the cell is equal to + the number of locations in the locset, and the label ``'detector'`` refers to + all of them collectively. If we want to refer to a single detector from the + group (to form a network connection for example), we need a + :py:class:`arbor.selection_policy`. + +Finally, there's one last property that impacts the behavior of a model: the +discretisation. Cells in Arbor are simulated as discrete components called +control volumes (CV). The size of a CV has an impact on the accuracy of the +results of the simulation. Usually, smaller CVs are more accurate because they +simulate the continuous nature of a neuron more closely. + +The user controls the discretisation using a :class:`arbor.cv_policy`. There are +a few different policies to choose from, and they can be composed with one +another. In this example, we would like the "soma" region to be a single CV, and +the rest of the morphology to be comprised of CVs with a maximum length of 1 μm: .. literalinclude:: ../../python/example/single_cell_detailed.py :language: python - :lines: 65-66 + :lines: 75-76 Finally, we create the cell. .. literalinclude:: ../../python/example/single_cell_detailed.py :language: python - :lines: 68-70 + :lines: 79-80 The model ********* @@ -324,75 +372,82 @@ Having created the cell, we construct an :class:`arbor.single_cell_model`. .. literalinclude:: ../../python/example/single_cell_detailed.py :language: python - :lines: 72-74 + :lines: 82-83 The global properties ^^^^^^^^^^^^^^^^^^^^^ The global properties of a single cell model include: -1. The **mechanism catalogue**: A mechanism catalogue is a collection of density and point - mechanisms. Arbor has 3 built-in mechanism catalogues: ``default``, ``allen`` and ``bbp``. The mechanism - catalogue in the global properties of the model must include the catalogues of all the - mechanisms painted on the cell decor. The default is to use the ``default_catalogue``. +1. The **mechanism catalogue**: A mechanism catalogue is a collection of density + and point mechanisms. Arbor has 3 built-in mechanism catalogues: ``default``, + ``allen`` and ``bbp``. The mechanism catalogue in the global properties of + the model must include the catalogues of all the mechanisms painted on the + cell decor. The default is to use the ``default_catalogue``. -2. The default **parameters**: The initial membrane voltage; the initial temperature; the - axial resistivity; the membrane capacitance; the ion parameters; and the discretisation - policy. +2. The default **parameters**: The initial membrane voltage; the initial + temperature; the axial resistivity; the membrane capacitance; the ion + parameters; and the discretisation policy. .. Note:: - You may notice that the same parameters can be set both at the cell level and at - the model level. This is intentional. The model parameters apply to all the cells in a model, - whereas the cell parameters apply only to that specific cell. - - The idea is that the user is able to define a set of global properties for all cells in a model - which can then be overridden for individual cells, and overridden yet again on certain - regions of the cells. - - You may now be wondering why this is needed for the `single cell model` where there is only one - cell by design. You can use this feature to ease moving from simulating a set of single cell models - to simulating a network of these cells. - For example, a user may choose to individually test several single cell models before simulating - their interactions. By using the same global properties for each *model*, and customizing the *cell* - global properties, it becomes possible to use the cell descriptions of each cell, unchanged, in a + You may notice that the same parameters can be set both at the cell level and + at the model level. This is intentional. The model parameters apply to all + the cells in a model, whereas the cell parameters apply only to that specific + cell. + + The idea is that the user is able to define a set of global properties for + all cells in a model which can then be overridden for individual cells, and + overridden yet again on certain regions of the cells. + + You may now be wondering why this is needed for the `single cell model` where + there is only one cell by design. You can use this feature to ease moving + from simulating a set of single cell models to simulating a network of these + cells. For example, a user may choose to individually test several single + cell models before simulating their interactions. By using the same global + properties for each *model*, and customizing the *cell* global properties, it + becomes possible to use the cell descriptions of each cell, unchanged, in a larger network model. -Earlier in the example we mentioned that it is better to explicitly set all the default properties -of your cell, while that is true, it is better yet to set the default properties of the entire -model: +Earlier in the example we mentioned that it is better to explicitly set all the +default properties of your cell, while that is true, it is better yet to set the +default properties of the entire model: .. _tutorialsinglecellswc-gprop: .. literalinclude:: ../../python/example/single_cell_detailed.py :language: python - :lines: 76-80 + :lines: 85-94 -We set the same properties as we did earlier when we were creating the *decor* of the cell, except -for the initial membrane voltage, which is -65 mV as opposed to -55 mV. +We set the same properties as we did earlier when we were creating the *decor* +of the cell, except for the initial membrane voltage, which is -65 mV as opposed +to -55 mV. -During the decoration step, we also made use of 3 mechanisms: *pas*, *hh* and *Ih*. As it happens, -the *pas* and *hh* mechanisms are in the default Arbor catalogue, whereas the *Ih* mechanism is in -the "allen" catalogue. We can extend the default catalogue as follow: +During the decoration step, we also made use of 3 mechanisms: *pas*, *hh* and +*Ih*. As it happens, the *pas* and *hh* mechanisms are in the default Arbor +catalogue, whereas the *Ih* mechanism is in the "allen" catalogue. We can extend +the default catalogue as follow: .. literalinclude:: ../../python/example/single_cell_detailed.py :language: python - :lines: 82-86 + :lines: 96-100 Now all three mechanisms in the *decor* object have been made available to the model. The probes ^^^^^^^^^^ -The model is almost ready for simulation. Except that the only output we would be able to -measure at this point is the spikes from the threshold detectors placed in the decor. +The model itself is ready for simulation. Except that the only output we would +be able to measure at this point is the spikes from the threshold detectors +placed in the decor. -The :class:`arbor.single_cell_model` can also measure the voltage on specific locations of the cell. -We can indicate the location we would like to probe using labels from the :class:`label_dict`: +The :class:`arbor.single_cell_model` can also measure the voltage on specific +locations of the cell. We can indicate the location we would like to probe using +labels from the :class:`label_dict`: .. literalinclude:: ../../python/example/single_cell_detailed.py :language: python - :lines: 88-92 + :lines: 102-104 The simulation ^^^^^^^^^^^^^^ @@ -401,31 +456,35 @@ The cell and model descriptions are now complete and we can run the simulation: .. literalinclude:: ../../python/example/single_cell_detailed.py :language: python - :lines: 94-102 + :lines: 106-107 The results ^^^^^^^^^^^ -Finally we move on to the data collection segment of the example. We have added a threshold detector -on the "axon_terminal" locset. The :class:`arbor.single_cell_model` automatically registers all -spikes on the cell from all threshold detectors on the cell and saves the times at which they occurred. +Finally we move on to the data collection segment of the example. We have added +a threshold detector on the "axon_terminal" locset. The +:class:`arbor.single_cell_model` automatically registers all spikes on the cell +from all threshold detectors on the cell and saves the times at which they +occurred. .. literalinclude:: ../../python/example/single_cell_detailed.py :language: python - :lines: 98-102 + :lines: 109-112 -A more interesting result of the simulation is perhaps the output of the voltage probe previously -placed on the "custom_terminal" locset. The model saves the output of the probes as [time, value] -pairs which can then be plotted. We use `pandas` and `seaborn` for the plotting, but the user can -choose the any other library: +A more interesting result of the simulation is perhaps the output of the voltage +probe previously placed on the "custom_terminal" locset. The model saves the +output of the probes as [time, value] pairs which can then be plotted. We use +`pandas` and `seaborn` for the plotting, but the user can choose the any other +library: .. literalinclude:: ../../python/example/single_cell_detailed.py :language: python - :lines: 5,6,104- + :lines: 114-138 -The following plot is generated. The orange line is slightly delayed from the blue line, which is -what we'd expect because branch 4 is longer than branch 3 of the morphology. We also see 3 spikes, -corresponding to each of the current clamps placed on the cell. +The following plot is generated. The orange line is slightly delayed from the +blue line, which is what we'd expect because branch 4 is longer than branch 3 of +the morphology. We also see 3 spikes, corresponding to each of the current +clamps placed on the cell. .. figure:: single_cell_detailed_result.svg :width: 400 diff --git a/doc/tutorial/single_cell_detailed_recipe.rst b/doc/tutorial/single_cell_detailed_recipe.rst index 959d06241c4df26c02942f220ddb4344e0048579..a7bf6b21570dab17ea30c9326351713bc8b804c9 100644 --- a/doc/tutorial/single_cell_detailed_recipe.rst +++ b/doc/tutorial/single_cell_detailed_recipe.rst @@ -20,75 +20,82 @@ This time, we'll learn a bit more about setting up advanced features using a :cl The cell ******** -We can copy the cell description code or reuse ``single_cell_detailed.swc`` from the -:ref:`original example <tutorialsinglecellswc-cell>` where it is explained in detail. +We reuse the cell construction code from :ref:`original example +<tutorialsinglecellswc-cell>` where it is explained in detail. +Constructing cells outside the recipe is not required, but may be +convenient and potentially faster if many copies of the same cell +are required. The recipe ********** -The :class:`arbor.single_cell_model` of the original example created a :class:`arbor.recipe` under -the hood, and abstracted away the details so we were unaware of its existence. In this example, we will -examine the recipe in detail: how to create one, and why it is needed. +The :class:`arbor.single_cell_model` used in the original example created a +:class:`arbor.recipe` under the hood, and abstracted away the details so we were +unaware of its existence. In this example, we will examine the recipe in detail: +how to create one and why it is needed. .. literalinclude:: ../../python/example/single_cell_detailed_recipe.py :language: python - :lines: 74-109 + :lines: 78-126 Let's go through the recipe point by point. -Step **(5)** creates a ``single_recipe`` class that inherits from :class:`arbor.recipe`. -:meth:`arbor.recipe.num_cells`, :meth:`arbor.recipe.cell_kind` and :meth:`arbor.recipe.cell_description` -always have to be implemented by the user. We'll also implement :meth:`arbor.recipe.global_properties` to be able -to decorate :class:`arbor.cell_kind.cable` cells with mechanisms and :meth:`arbor.recipe.probes` to be able to -insert the probe. - -Step **(5.1)** defines the class constructor. As per :class:`arbor.recipe` instructions, we call -``arbor.recipe.__init__(self)`` to ensure correct initialization of memory in the C++ class. - -We then create the ``self.the_props`` variable. This will hold the global properties of the model, which apply -to all the cells in the network. We initialize it with :class:`arbor.cable_global_properties`, which comes with the -``default`` mechanism catalogue built-in. We set all the properties of the system similar to what we did in -the :ref:`original example <tutorialsinglecellswc-gprop>`. One last important step is to extend ``self.the_props`` -to include the Allen catalogue, because it holds the *Ih* mechanism. The *hh* and *pas* mechanisms came with the -default catalogue. - -Step **(5.2)** overrides the :meth:`~arbor.recipe.num_cells` method. It takes no arguments. We simply return 1, -as we are only simulating one cell in this example. - -Step **(5.3)** overrides the :meth:`~arbor.recipe.cell_kind` method. It takes one argument: ``gid``. -Given the gid, this method returns the kind of the cell. Our defined cell is a -:class:`arbor.cell_kind.cable`, so we simply return that. - -Step **(5.4)** overrides the :meth:`~arbor.recipe.cell_description` method. It takes one argument: ``gid``. -Given the gid, this method returns the cell description which is the cell object passed to the constructor -of the recipe. We return ``cell``, the cell created just above. - -Step **(5.5)** overrides the :meth:`~arbor.recipe.probes` method. It takes one argument: ``gid``. -Given the gid, this method returns all the probes on the cell. The probes can be of many different kinds -measuring different quantities on different locations of the cell. Like in the original example, we will -create the voltage probe at the ``"custom_terminal"`` locset. This probe was registered directly using the -:class:`arbor.single_cell_model` object. Now it has to be explicitly created and registered in the recipe. - -Step **(5.6)** overrides the :meth:`~arbor.recipe.global_properties` method. It takes one argument: ``kind``. -This method returns the default global properties of the model which apply to all cells in the network of -that kind. We only use ``cable`` cells in this example (but there are more) and thus always return a -``cable_cell_properties`` object. We return ``self.the_props`` which we defined in step **(1)**. - -.. Note:: - - You may wonder why the method :meth:`arbor.recipe.cell_kind` is required, since it can be inferred by examining the cell description. - The recipe was designed to allow building simulations efficiently in a distributed system with minimum - communication. Some parts of the model initialization require only the cell kind, - not the full cell description which can be quite expensive to build. Providing these - descriptions separately saves time and resources for the user. - - More information on the recipe can be found :ref:`here <modelrecipe>`. - -Now we can instantiate a ``single_recipe`` object. +Step **(5.1)** defines the class constructor. As per :class:`arbor.recipe` +instructions, we call ``arbor.recipe.__init__(self)`` as the very first thing. +This is to ensure correct initialization. + +We then create the ``self.the_props`` variable. This will hold the global +properties of the model, which apply to all the cells in the network. We +initialize it with :class:`arbor.cable_global_properties`, which comes with the +``default`` mechanism catalogue built-in. We set all the properties of the +system similar to what we did in the :ref:`original example +<tutorialsinglecellswc-gprop>`. One last important step is to extend +``self.the_props`` to include the Allen catalogue, because it holds the *Ih* +mechanism. The *hh* and *pas* mechanisms came with the default catalogue. + +Step **(5.2)** overrides the :meth:`~arbor.recipe.num_cells` method. It takes no +arguments and returns the count of cells in the simulation. The global id (gid) +of cells runs between 0 and the value returned from here and is used to query +recipes for cell descriptions. Technically, this method doesn't need overriding, +but the default is zero, resulting in an empty simulation. + +Step **(5.3)** overrides the :meth:`~arbor.recipe.cell_kind` method. It takes +one argument: ``gid``. Given the gid, this method returns the kind of the cell. +Our defined cell is a :class:`arbor.cell_kind.cable`, so we simply return that. +Arbor uses the kind to determine what description is expected from ``cell_description``; +if the two do not match, an error will occur. + +Step **(5.4)** overrides the :meth:`~arbor.recipe.cell_description` method. It +takes one argument: ``gid``. Given the gid, this method returns the cell +description which is the cell object passed to the constructor of the recipe. We +return ``cell``, the cell created just above. + +.. note:: + + While splitting the kind and description into two methods may seem redundant, + it allows Arbor to optimize the simulation layout before constructing any + cells. + +Step **(5.5)** overrides the :meth:`~arbor.recipe.probes` method. It takes one +argument: ``gid``. Given the gid, this method returns all the probes on the +cell. The probes can be of many different kinds measuring different quantities +on different locations of the cell. Like in the original example, we will create +the voltage probe at the ``"custom_terminal"`` locset. This probe was registered +directly using the :class:`arbor.single_cell_model` object. Now it has to be +explicitly created and registered in the recipe. + +Step **(5.6)** overrides the :meth:`~arbor.recipe.global_properties` method. It +takes one argument: ``kind``. This method returns the default global properties +of the model which apply to all cells in the network of that kind. We only use +``cable`` cells in this example (but there are more) and thus always return a +``cable_cell_properties`` object. We return ``self.the_props`` which we defined +in step **(1)**. .. literalinclude:: ../../python/example/single_cell_detailed_recipe.py :language: python - :lines: 112-113 + :lines: 129-130 + +Now we can instantiate a ``single_recipe`` object. The simulation ************** @@ -100,55 +107,60 @@ This was handled by the :class:`arbor.single_cell_model` object in the original .. literalinclude:: ../../python/example/single_cell_detailed_recipe.py :language: python - :lines: 115-122 + :lines: 135-138 -We would like to get a list of the spikes on the cell during the runtime of the simulation, and we would like -to plot the voltage registered by the probe on the "custom_terminal" locset. +We would like to get a list of the spikes on the cell during the runtime of the +simulation, and we would like to plot the voltage registered by the probe on the +"custom_terminal" locset. Without the call to ``sample``, the probe will be +present, but no data will recorded. This can help to toggle different probes and +possible save some memory on the unsampled ones. Sampling requires a unqiue +identifier for the probe we want to attach to, which consists of the gid of the +cell and the label we gave to the ``place`` method when setting the probe. Each +sampler is identified by an opaque handle that can be used to retrieve the +recorded data. -The lines handling probe sampling warrant a second look. First, we declared ``probeset_id`` to be a -:class:`arbor.cell_member`, with :class:`arbor.cell_member.gid` = 0 and :class:`arbor.cell_member.index` = 0. -This variable serves as a global identifier of a probe on a cell, namely the first declared probe on the -cell with ``gid = 0``, which is id of the only probe we created on the only cell in the model. - -Next, we instructed the simulation to sample ``probeset_id`` at a frequency of 50 kHz. That function returns a -:term:`handle` which we will use to :ref:`extract the results <pycablecell-probesample>` of the sampling after running the simulation. - -We can now run the simulation we just instantiated for a duration of 100 ms with a time step of 0.025 ms. +We can now run the simulation we just instantiated for a duration of 100 ms with +a time step of 0.025 ms. .. literalinclude:: ../../python/example/single_cell_detailed_recipe.py :language: python - :lines: 124-125 + :lines: 140-141 The results *********** -The last step is result collection. We instructed the simulation to record the spikes on the cell, and -to sample the probe. +The last step is result collection. We instructed the simulation to record the +spikes on the cell, and to sample the probe. We can print the times of the spikes: .. literalinclude:: ../../python/example/single_cell_detailed_recipe.py :language: python - :lines: 127-131 + :lines: 143-147 The probe results, again, warrant some more explanation: .. literalinclude:: ../../python/example/single_cell_detailed_recipe.py :language: python - :lines: 133-137 - -``sim.samples()`` takes a ``handle`` of the probe we wish to examine. It returns a list -of ``(data, meta)`` terms: ``data`` being the time and value series of the probed quantity; and -``meta`` being the location of the probe. The size of the returned list depends on the number of -discrete locations pointed to by the handle. We placed the probe on the "custom_terminal" locset which is -represented by 2 locations on the morphology. We therefore expect the length of ``sim.samples(handle)`` -to be 2. - -We plot the results using pandas and seaborn as we did in the original example, and expect the same results: + :lines: 159 + +``sim.samples`` takes a ``handle`` that is associated to the probe we wish to +examine. These opaque objects are returned from the calls to ``sim.sample``. +Each call returns a list of ``(data, meta)`` objects. Here, ``meta`` describes +the location set of the probe, which can be a single place or a list of places. +The other item -- ``data`` -- is a numpy array comprising one column for the +time and one for each eantry in the location list. The size of the returned list +depends on the number of discrete locations pointed to by the handle. We placed +the probe on the "custom_terminal" locset which is represented by 2 locations on +the morphology. We therefore expect the length of ``sim.samples(handle)`` to +be 2. + +We plot the results using pandas and seaborn as we did in the original example, +and expect the same results: .. literalinclude:: ../../python/example/single_cell_detailed_recipe.py :language: python - :lines: 139- + :lines: 149- The following plot is generated. Identical to the plot of the original example. @@ -160,4 +172,5 @@ The following plot is generated. Identical to the plot of the original example. The full code ************* -You can find the full code of the example at ``python/examples/single_cell_detailed_recipe.py``. +You can find the full code of the example at +``python/examples/single_cell_detailed_recipe.py``. diff --git a/doc/tutorial/single_cell_model.rst b/doc/tutorial/single_cell_model.rst index 49b096345c6bb0b6b34143cab4a62a228c503efb..769ea8380e1bff806472b5fd07fd71815fea3468 100644 --- a/doc/tutorial/single_cell_model.rst +++ b/doc/tutorial/single_cell_model.rst @@ -12,7 +12,8 @@ introduce Arbor's cell modelling concepts and approach. **Concepts covered in this example:** - 1. Intro to building a morphology from a :class:`arbor.segment_tree`. + 0. The Arbor library and units. + 1. Intro to morphologies. 2. Intro to region and locset expressions. 3. Intro to decors and cell decorations. 4. Building a :class:`arbor.cable_cell` object. @@ -21,56 +22,96 @@ introduce Arbor's cell modelling concepts and approach. .. _tutorialsinglecell-cell: +Setup and introduction to units +------------------------------- + +We begin by importing the Arbor library and its unit support. + +.. literalinclude:: ../../python/example/single_cell_model.py + :language: python + :lines: 4-5 + +As we will refer to both quite often, we assign aliases ``A`` and ``U``, to +minimize typing. Over the course of this introduction, you will notice that most +of Arbor's user interface is making use of units. This requires a bit of typing, +but makes the physical quantities obvious and allows for easy conversion of +models. You can use any sensible unit for a given dimension and Arbor will +convert as needed, e.g. you can write ``5 * U.mm`` instead of ``5000 * U.um``. +Handing a mismatching dimension to a method will cause a runtime error, so in +the example above, ``5 * U.mV`` will be rejected. + The cell -------- -The most trivial representation of a cell in Arbor is to model the entire cell as a -single cylinder. The following example shows the steps required to construct a model of a -cylindrical cell with a length of 6 μm and a radius of 3 μm; Hodgkin–Huxley dynamics -and a current clamp stimulus, then run the model for 30 ms. +The most trivial representation of a cell in Arbor is to model the entire cell +as a single cylinder. The following example shows the steps required to +construct a model of a cylindrical cell with a length of 6 μm and a radius of 3 +μm; Hodgkin–Huxley dynamics and a current clamp stimulus, then run the model for +30 ms. -The first step is to construct the cell. In Arbor, the abstract representation used to -define a cell with branching cable morphology is a ``cable_cell``, which holds a -description of the cell's morphology, named regions and locations on the morphology, and -descriptions of ion channels, synapses, threshold detectors and electrical properties. +The first step is to construct the cell. In Arbor, the abstract representation +used to define a cell with branching cable morphology is a ``cable_cell``, which +holds a description of the cell's morphology, named regions and locations on the +morphology, and descriptions of ion channels, synapses, threshold detectors and +electrical properties. We will go over these one by one. -Our *single-segment HH cell* has a simple morphology and dynamics, constructed as follows: +Our *cell* has a simple morphology comprising a single segment, which is why we +use an explicit construction. Normally, one would read the morphology from file +and Arbor handles most standard formats natively. .. literalinclude:: ../../python/example/single_cell_model.py :language: python - :lines: 4,6-23 - -Step **(1)** constructs a :class:`arbor.segment_tree` (see also :ref:`segment tree<morph-segment_tree>`). -The segment tree is the representation used to construct the morphology of a cell. A segment is -a tapered cone with a tag; the tag can be used to classify the type of the segment (for example -soma, dendrite etc). To create a segment tree representing our single-cylinder cell, we need to add -one segment to our ``tree`` object. We use the :meth:`arbor.segment_tree.append` method, which takes -4 arguments: the parent segment which does not exist for the first segment, so we use :class:`arbor.mnpos`; -the proximal :class:`arbor.mpoint` (location and radius) of the segment; the distal :class:`arbor.mpoint` -of the segment; and the tag. - -Step **(2)** creates a dictionary of labels (:class:`arbor.label_dict<arbor.label_dict>`). Labels give -names to :term:`regions<region>` and :term:`location<locset>` described using a DSL -based on s-expressions. Labels from the dictionary can then be used to facilitate adding synapses, -dynamics, stimuli and probes to the cell. We add two labels: - -* ``soma`` defines a *region* with ``(tag 1)``. Note that this corresponds to the - ``tag`` parameter that was used to define the single segment in step (1). -* ``midpoint`` defines a *location* at ``(location 0 0.5)``, which is the mid point ``0.5`` - of branch ``0``, which corresponds to the midpoint of the soma on the morphology defined in step (1). - -Step **(3)** constructs a :class:`arbor.decor` that describes the distribution and placement -of dynamics and properties on a cell. The cell's default properties can be modified, and we can use -:meth:`arbor.decor.paint` and :meth:`arbor.decor.place` to further customise it in the -following way: - -* :meth:`arbor.decor.set_property` is used to set some default properties on the entire cell. - In the above example we set the initial membrane potential to -40 mV. -* :meth:`arbor.decor.paint` is used to set properties or add dynamics to a region of the cell. - We call this method 'painting' to convey that we are working on sections of a cell, as opposed to - precise locations: for example, we might want to *paint* a density ion channel on all dendrites, - and then *place* a synapse at the tip of the axon. In the above example we paint - HH dynamics on the region we previously named ``"soma"`` in our label dictionary. + :lines: 9-11 + +This constructs a :class:`arbor.segment_tree` (see also :ref:`segment +tree<morph-segment_tree>`) containing a single segment. You can skip the rest of +this paragraph on first reading, it explains the details of constructing a +morphology from scratch. The segment tree is the representation used to +construct the morphology of a cell. A segment is a tapered cone with a tag; the +tag can be used to classify the type of the segment (for example soma, dendrite +etc). To create a segment tree representing our single-cylinder cell, we need to +add one segment to our ``tree`` object. We use the +:meth:`arbor.segment_tree.append` method, which takes 4 arguments: the parent +segment which does not exist for the first segment, so we use +:class:`arbor.mnpos`; the proximal :class:`arbor.mpoint` (location and radius) +of the segment; the distal :class:`arbor.mpoint` of the segment; and the tag. + +.. literalinclude:: ../../python/example/single_cell_model.py + :language: python + :lines: 13-14 + +Next, we create a dictionary of labels +(:class:`arbor.label_dict<arbor.label_dict>`) to assign properties to. This is a +handy tool to connect part of your morphology to semantically meaningful names. +Labels give names to :term:`regions<region>` and :term:`location<locset>` +described using a DSL based on s-expressions. Labels from the dictionary can +then be used to facilitate adding synapses, dynamics, stimuli and probes to the +cell. We add two labels: + +* ``soma`` defines a *region* with ``(tag 1)``. Note that this corresponds to + the ``tag`` parameter that was used to define the single segment in step (1). +* ``midpoint`` defines a *location* at ``(location 0 0.5)``, which is the mid + point ``0.5`` of branch ``0``, which corresponds to the midpoint of the soma + on the morphology defined in step (1). + +.. literalinclude:: ../../python/example/single_cell_model.py + :language: python + :lines: 16-23 + +The final piece constructs a :class:`arbor.decor` describing the distribution +and placement of dynamics and properties on a cell. The cell's default +properties can be modified, and we can use :meth:`arbor.decor.paint` and +:meth:`arbor.decor.place` to further customise it in the following way: + +* :meth:`arbor.decor.set_property` is used to set some default properties on the + entire cell. In the above example we set the initial membrane potential + to -40 mV. +* :meth:`arbor.decor.paint` is used to set properties or add dynamics to a + region of the cell. We call this method 'painting' to convey that we are + working on sections of a cell, as opposed to precise locations: for example, + we might want to *paint* a density ion channel on all dendrites, and then + *place* a synapse at the tip of the axon. In the above example we paint HH + dynamics on the region we previously named ``"soma"`` in our label dictionary. * :meth:`arbor.decor.place` is used to add objects on a precise :class:`arbor.location` on a cell. Examples of objects that are *placed* are synapses, threshold detectors, current stimuli, and probes. In the above example we place a current stimulus @@ -78,15 +119,23 @@ following way: on the location we previously labelled ``"midpoint"``. We also place a :class:`arbor.threshold_detector` with a threshold of -10 mV on the same location. -Step **(4)** constructs the :class:`arbor.cable_cell` from the segment tree and dictionary of labelled regions and locations. +.. literalinclude:: ../../python/example/single_cell_model.py + :language: python + :lines: 25-26 + +The three ingredients -- morphology, labels, and decor -- are joined into a cable cell. The single cell model --------------------- -Once the cell description has been built, the next step is to build and run the simulation. -Arbor provides an interface for constructing single cell models with the -:class:`arbor.single_cell_model` helper that creates a model from a cell description, with -an interface for recording outputs and running the simulation. +Once the cell description has been built, the next step is to build and run the +simulation. Arbor provides an interface for constructing single cell models with +the :class:`arbor.single_cell_model` helper that creates a model from a cell +description, with an interface for recording outputs and running the simulation. + +.. literalinclude:: ../../python/example/single_cell_model.py + :language: python + :lines: 28-29 The single cell model has 4 main functions: @@ -95,38 +144,44 @@ The single cell model has 4 main functions: 3. It **runs** the simulation. 4. It collects **spikes** from threshold detectors and voltage **traces** from registered probes. -Right now, we'll only set a probe and run the simulation. +Right now, we'll only set a probe. The model is complete without, but to see +the results, we need to extract some data. .. literalinclude:: ../../python/example/single_cell_model.py :language: python - :lines: 25-32 + :lines: 31-32 -Step **(5)** instantiates the :class:`arbor.single_cell_model` -with our single-compartment cell. +Note, that the probe is given a location from the label dictionary ``midpoint``, +the value to record ``voltage``, the sampling frequency, and finally a tag by +which we can reference it later, here ``Um``. -Step **(6)** adds a :meth:`arbor.single_cell_model.probe` -used to record variables from the model. Three pieces of information are -provided: the type of quantity we want probed (voltage), the location where we want to -probe ('"midpoint"'), and the frequency at which we want to sample (10 kHz). +Now, we can start the actual simulation: -Step **(7)** runs the actual simulation for a duration of 30 ms. +.. literalinclude:: ../../python/example/single_cell_model.py + :language: python + :lines: 34-35 The results ----------- -Our cell and model have been defined and we have run our simulation. Now we can look at what -the threshold detector and a voltage probes from our model have produced. +Our cell and model have been defined and we have run our simulation. Now we can +look at the resulting spikes and membrane potential. + +.. literalinclude:: ../../python/example/single_cell_model.py + :language: python + :lines: 37-40 + +To print the spike times, we use :meth:`arbor.single_cell_model.spikes`. A +single spike should be generated at around the same time the stimulus we +provided in step (3) gets activated (10ms). + +And, finally, we plot the membrane potential .. literalinclude:: ../../python/example/single_cell_model.py :language: python - :lines: 34-51 + :lines: 42-48 -Step **(8)** accesses :meth:`arbor.single_cell_model.spikes` -to print the spike times. A single spike should be generated at around the same time the stimulus -we provided in step (3) gets activated (10ms). -Step **(9)** plots the measured potentials during the runtime of the simulation. The sampled quantities -can be accessed through :meth:`arbor.single_cell_model.traces`. We should be seeing something like this: .. figure:: single_cell_model_result.svg @@ -138,4 +193,6 @@ We should be seeing something like this: The full code ------------- -You can find the source code for this example in full at ``python/examples/single_cell_model.py``. +You can find the source code for this example in full at +``python/examples/single_cell_model.py`` which comes in at roughly 10 lines of +Python to define and simulate a cell from scratch. diff --git a/doc/tutorial/single_cell_recipe.rst b/doc/tutorial/single_cell_recipe.rst index 40d3233578e6bb5da4c6a07bfeadb58443608de4..d5046d850a3582a382a0ec13f20d46d6dbce1122 100644 --- a/doc/tutorial/single_cell_recipe.rst +++ b/doc/tutorial/single_cell_recipe.rst @@ -6,10 +6,10 @@ A simple single cell recipe This example builds the same single cell model as :ref:`tutorialsinglecell`, except using a :class:`arbor.recipe` and :class:`arbor.simulation` instead of a :class:`arbor.single_cell_model`. -Recipes are an important concept in Arbor. They represent the most versatile tool -for building a complex network of cells. We will go though this example of a model -of a single cell, before using the recipe to represent more complex networks in -subsequent examples. +Recipes are an important concept in Arbor. They represent the most versatile +tool for building a complex network of cells. We will go though this example of +a model of a single cell, before using the recipe to represent more complex +networks in subsequent examples. .. Note:: @@ -32,18 +32,20 @@ where construction of the cell is explained in detail. The recipe ---------- -In the :ref:`original example <tutorialsinglecell-cell>`, the :class:`arbor.single_cell_model` creates -a :class:`arbor.recipe` under the hood, and abstracts away a few details that you may want control over -in more complex simulations. Let's go into those abstractions and create an analogous :class:`arbor.recipe` -manually. +In the :ref:`original example <tutorialsinglecell-cell>`, the +:class:`arbor.single_cell_model` creates a :class:`arbor.recipe` under the hood, +and abstracts away a few details that you may want control over in more complex +simulations. Let's go into those abstractions and create an analogous +:class:`arbor.recipe` manually. -Creating a recipe starts with creating a class that inherits from :class:`arbor.recipe`. There are a number of -methods that *must* be overridden, and a number than *can optionally* be overridden, as explained in the -:class:`arbor.recipe` documentation. Beyond this, it is up to you, the user, to structure your code as you -find convenient. +Creating a recipe starts with creating a class that inherits from +:class:`arbor.recipe`. There are a number of methods that *must* be overridden, +and a number than *can optionally* be overridden, as explained in the +:class:`arbor.recipe` documentation. Beyond this, it is up to you, the user, to +structure your code as you find convenient. -One of the methods that must be overridden is :meth:`arbor.recipe.num_cells`. It returns `0` by default and -models without cells are quite boring! +One of the methods that must be overridden is :meth:`arbor.recipe.num_cells`. It +returns `0` by default and models without cells are quite boring! .. literalinclude:: ../../python/example/single_cell_recipe.py :language: python @@ -51,78 +53,87 @@ models without cells are quite boring! Step **(4)** describes the recipe that will reflect our single cell model. -Step **(4.1)** defines the class constructor. It can take any shape you need, but it -is important to call base class' constructor. If the overridden methods of the class -need to return an object, it may be a good idea to have the returned object be a -member of the class. With this constructor, we could easily change the cell and probes -of the model, should we want to do so. Here we initialize the cell properties to match -Neuron's defaults using Arbor's built-in :meth:`arbor.neuron_cable_properties` and -extend with Arbor's own :meth:`arbor.default_catalogue`. +Step **(4.1)** defines the class constructor. It can take any shape you need, +but it is important to call base class' constructor as the first action. If the +overridden methods of the class need to return an object, it may be a good idea +to have the returned object be a member of the class. With this constructor, we +could easily change the cell and probes of the model, should we want to do so. +Here we initialize the cell properties to match Neuron's defaults using Arbor's +built-in :meth:`arbor.neuron_cable_properties` and extend with Arbor's own +:meth:`arbor.default_catalogue`. -Step **(4.2)** defines that this model has one cell. +Step **(4.2)** states that this model has one cell. -Step **(4.3)** returns :class:`arbor.cell_kind.cable`, the :class:`arbor.cell_kind` -associated with the cable cell defined above. If you mix multiple cell kinds and -descriptions in one recipe, make sure a particular ``gid`` returns matching cell kinds -and descriptions. +Step **(4.3)** returns :class:`arbor.cell_kind.cable`, the +:class:`arbor.cell_kind` associated with the cable cell defined above. If you +mix multiple cell kinds and descriptions in one recipe, make sure a particular +``gid`` returns matching cell kinds and descriptions. -Step **(4.4)** returns the cell description defined earlier. If we -were modelling multiple cells of different kinds, we would need to make sure that the +Step **(4.4)** returns the cell description defined earlier. If we were +modelling multiple cells of different kinds, we would need to make sure that the cell returned by :meth:`arbor.recipe.cell_description` has the same cell kind as returned by :meth:`arbor.recipe.cell_kind` for every :gen:`gid`. -Step **(4.5)** returns the same probe as in the ``single_cell_model``: a single voltage probe located at "midpoint". +Step **(4.5)** returns the same probe as in the ``single_cell_model``: a single +voltage probe located at "midpoint". -Step **(4.6)** returns the properties that will be applied to all cells of that kind in the model. +Step **(4.6)** returns the properties that will be applied to all cells of that +kind in the model. -More methods can be overridden if your model requires that, see :class:`arbor.recipe` for options. +More methods may be overridden if your model requires that, see +:class:`arbor.recipe` for options. Now we instantiate the recipe .. literalinclude:: ../../python/example/single_cell_recipe.py :language: python - :lines: 64-67 + :lines: 60-61 The simulation -------------- -:class:`arbor.single_cell_model` does not only take care of the recipe, it also takes -care of defining how the simulation will be run. When you create and use your own -recipe, you can to do this manually, in the form of defining a execution context -and a domain decomposition. Fortunately, the default constructors of -:class:`arbor.context` and :class:`arbor.partition_load_balance` are sufficient for -this model, and is what :class:`arbor.single_cell_model` does under the hood! -In addition, if all you need is the default context and domain decomposition, they can be -left out and the :class:`arbor.simulation` object can be contructed from just the recipe. +:class:`arbor.single_cell_model` does not only take care of the recipe, it also +takes care of defining how the simulation will be run. When you create and use +your own recipe, you can to do this manually, in the form of defining a +execution context and a domain decomposition. Fortunately, the default +constructors of :class:`arbor.context` and :class:`arbor.partition_load_balance` +are sufficient for this model, and is what :class:`arbor.single_cell_model` does +under the hood! In addition, if all you need is the default context and domain +decomposition, they can be left out and the :class:`arbor.simulation` object can +be contructed from just the recipe. The details of manual hardware configuration will be left for another tutorial. .. literalinclude:: ../../python/example/single_cell_recipe.py :language: python - :lines: 68-79 + :lines: 63-73 Step **(6)** instantiates the simulation. Step **(7)** sets up the probe added in step 5. In the -:class:`arbor.single_cell_model` version of this example, the probe frequency and -simulation duration are the same. Note that the frequency is set with a :class:`arbor.regular_schedule`, -which takes a time and not a frequency. Also note that spike recording must be -switched on. For :ref:`extraction of the probe traces <pycablecell-probesample>` later on, we store a :term:`handle`. +:class:`arbor.single_cell_model` version of this example, the probe frequency +and simulation duration are the same. Note that the frequency is set with a +:class:`arbor.regular_schedule`, which takes a time and not a frequency. Also +note that spike recording must be switched on. For :ref:`extraction of the probe +traces <pycablecell-probesample>` later on, we store a :term:`handle`. Then, we +start the simulation. The results ----------------------------------------------------- +----------- Apart from creating :class:`arbor.recipe` ourselves, we have changed nothing -about this simulation compared to :ref:`the original tutorial <tutorialsinglecell>`. -If we create the same analysis of the results we therefore expect the same results. +about this simulation compared to :ref:`the original tutorial +<tutorialsinglecell>`. If we create the same analysis of the results we +therefore expect the same results. .. literalinclude:: ../../python/example/single_cell_recipe.py :language: python - :lines: 80- + :lines: 75- Step **(8)** plots the measured potentials during the runtime of the simulation. -Retrieving the sampled quantities is a little different, these have to be accessed -through the simulation object: :meth:`arbor.simulation.spikes` and :meth:`arbor.simulation.samples`. +Retrieving the sampled quantities is a little different, these have to be +accessed through the simulation object: :meth:`arbor.simulation.spikes` and +:meth:`arbor.simulation.samples`. We should be seeing something like this: diff --git a/example/bench/bench.cpp b/example/bench/bench.cpp index 1057ff74f90053e22901c9e50044a74b014db927..0b4367238d775d289c0368295f32c6c7bde344cb 100644 --- a/example/bench/bench.cpp +++ b/example/bench/bench.cpp @@ -30,6 +30,8 @@ #include <arborenv/with_mpi.hpp> #endif +namespace U = arb::units; + struct bench_params { struct cell_params { double spike_freq_hz = 10; // Frequency in hz that cell will generate (poisson) spikes. @@ -85,14 +87,12 @@ public: } arb::util::unique_any get_cell_description(arb::cell_gid_type gid) const override { - std::mt19937_64 rng(gid); - // The time_sequence of the cell produces the series of time points at // which it will spike. We use a poisson_schedule with a random sequence // seeded with the gid. In this way, a cell's random stream depends only // on its gid, and will hence give reproducable results when run with // different MPI ranks and threads. - auto sched = arb::poisson_schedule(1e-3*params_.cell.spike_freq_hz, rng); + auto sched = arb::poisson_schedule(params_.cell.spike_freq_hz*arb::units::Hz, gid); return arb::benchmark_cell("src", "tgt", sched, params_.cell.realtime_ratio); } @@ -120,7 +120,7 @@ public: // Draw random source and adjust to avoid self-connections if neccesary. arb::cell_gid_type src = dist(rng); if (src>=gid) ++src; - arb::cell_connection con({src, "src"}, {"tgt"}, 1.f, params_.network.min_delay); + arb::cell_connection con({src, "src"}, {"tgt"}, 1.f, params_.network.min_delay*U::ms); cons.push_back(con); } @@ -169,7 +169,7 @@ int main(int argc, char** argv) { meters.checkpoint("model-build", context); // Run the simulation for 100 ms, with time steps of 0.01 ms. - sim.run(params.duration, 0.01); + sim.run(params.duration*arb::units::ms, 0.01*arb::units::ms); meters.checkpoint("model-run", context); // write meters diff --git a/example/brunel/brunel.cpp b/example/brunel/brunel.cpp index b68e8e3322bd702f3305190a97792a6d22c411d5..bfcfca9d0bb6d3c95c6ff6da00c2d5e592bac251 100644 --- a/example/brunel/brunel.cpp +++ b/example/brunel/brunel.cpp @@ -3,7 +3,6 @@ #include <fstream> #include <iomanip> #include <iostream> -#include <memory> #include <optional> #include <set> #include <vector> @@ -129,20 +128,17 @@ public: util::unique_any get_cell_description(cell_gid_type gid) const override { auto cell = lif_cell("src", "tgt"); - cell.tau_m = 10; - cell.V_th = 10; - cell.C_m = 20; - cell.E_L = 0; - cell.V_m = 0; - cell.t_ref = 2; + cell.tau_m = 10*U::ms; + cell.V_th = 10*U::mV; + cell.C_m = 20*U::pF; + cell.E_L = 0*U::mV; + cell.V_m = 0*U::mV; + cell.t_ref = 2*U::ms; return cell; } std::vector<event_generator> event_generators(cell_gid_type gid) const override { - std::mt19937_64 G; - G.seed(gid + seed_); - time_type t0 = 0; - return {poisson_generator({"tgt"}, weight_ext_, t0, lambda_, G)}; + return {poisson_generator({"tgt"}, weight_ext_, 0*arb::units::ms, lambda_*arb::units::kHz, gid + seed_)}; } private: @@ -263,7 +259,7 @@ int main(int argc, char** argv) { meters.checkpoint("model-init", context); // Run simulation. - sim.run(options.tfinal, options.dt); + sim.run(options.tfinal*arb::units::ms, options.dt*arb::units::ms); meters.checkpoint("model-simulate", context); @@ -324,7 +320,7 @@ void add_subset(cell_gid_type gid, while(m) { cell_gid_type val = dis(gen); if (!seen.count(val)) { - conns.push_back({{val, src}, {tgt}, weight, delay}); + conns.push_back({{val, src}, {tgt}, weight, delay*U::ms}); seen.insert(val); m--; } diff --git a/example/busyring/ring.cpp b/example/busyring/ring.cpp index a955a0a34a37e66f8ccbe2a800153154279e957f..1d53fceb387e01e5937eae1f80fb6b5bd942c940 100644 --- a/example/busyring/ring.cpp +++ b/example/busyring/ring.cpp @@ -1,11 +1,8 @@ #include <fstream> #include <iomanip> #include <iostream> -#include <sstream> #include <algorithm> #include <array> -#include <cstring> -#include <functional> #include <nlohmann/json.hpp> @@ -41,6 +38,7 @@ using arb::time_type; using arb::cable_probe_membrane_voltage; using namespace arborio::literals; +namespace U = arb::units; // Writes voltage trace as a json file. void write_trace_json(std::string fname, const arb::trace_data<double>& trace); @@ -90,7 +88,7 @@ public: const auto group_start = s*group; const auto group_end = std::min(group_start+s, num_cells_); cell_gid_type src = gid==group_start? group_end-1: gid-1; - cons.push_back(arb::cell_connection({src, "d"}, {"p"}, event_weight_, min_delay_)); + cons.push_back(arb::cell_connection({src, "d"}, {"p"}, event_weight_, min_delay_*U::ms)); // Used to pick source cell for a connection. std::uniform_int_distribution<cell_gid_type> dist(0, num_cells_-2); @@ -104,7 +102,7 @@ public: if (src==gid) ++src; const float delay = min_delay_+delay_dist(src_gen); cons.push_back( - arb::cell_connection({src, "d"}, {"p"}, 0.f, delay)); + arb::cell_connection({src, "d"}, {"p"}, 0.f, delay*U::ms)); } return cons; } @@ -113,7 +111,7 @@ public: // This generates a single event that will kick start the spiking on the sub-ring. std::vector<arb::event_generator> event_generators(cell_gid_type gid) const override { if (gid%params_.ring_size == 0) { - return {arb::explicit_generator({"p"}, event_weight_, std::vector<float>{1.0f})}; + return {arb::explicit_generator_from_milliseconds({"p"}, event_weight_, std::vector{1.0})}; } else { return {}; } @@ -231,7 +229,7 @@ int main(int argc, char** argv) { // the cell_member type points to (cell 0, probe 0) auto probe_id = arb::cell_address_type{0, "Um"}; // The schedule for sampling is 10 samples every 1 ms. - auto sched = arb::regular_schedule(0.1); + auto sched = arb::regular_schedule(0.1*U::ms); // Now attach the sampler at probe_id, with sampling schedule sched, writing to voltage sim.add_sampler(arb::one_probe(probe_id), sched, arb::make_simple_sampler(voltage)); } @@ -250,7 +248,7 @@ int main(int argc, char** argv) { // Run the simulation. if (root) sim.set_epoch_callback(arb::epoch_progress_bar()); if (root) std::cout << "running simulation\n" << std::endl; - sim.run(params.duration, params.dt); + sim.run(params.duration*U::ms, params.dt*U::ms); meters.checkpoint("model-run", context); @@ -394,14 +392,14 @@ arb::cable_cell complex_cell(arb::cell_gid_type gid, const cell_parameters& para arb::decor decor; - decor.paint(rall, arb::init_reversal_potential{"k", -107.0}); - decor.paint(rall, arb::init_reversal_potential{"na", 53.0}); + decor.paint(rall, arb::init_reversal_potential{"k", -107.0*U::mV}); + decor.paint(rall, arb::init_reversal_potential{"na", 53.0*U::mV}); - decor.paint(soma, arb::axial_resistivity{133.577}); - decor.paint(soma, arb::membrane_capacitance{4.21567e-2}); + decor.paint(soma, arb::axial_resistivity{133.577*U::Ohm*U::cm}); + decor.paint(soma, arb::membrane_capacitance{4.21567e-2*U::F/U::m2}); - decor.paint(dend, arb::axial_resistivity{68.355}); - decor.paint(dend, arb::membrane_capacitance{2.11248e-2}); + decor.paint(dend, arb::axial_resistivity{68.355*U::Ohm*U::cm}); + decor.paint(dend, arb::membrane_capacitance{2.11248e-2*U::F/U::m2}); decor.paint(soma, arb::density("pas/e=-76.4024", {{"g", 0.000119174}})); decor.paint(soma, arb::density("NaV", {{"gbar", 0.0499779}})); @@ -423,7 +421,7 @@ arb::cable_cell complex_cell(arb::cell_gid_type gid, const cell_parameters& para decor.place(syns, arb::synapse("expsyn"), "s"); } - decor.place(cntr, arb::threshold_detector{-20.0}, "d"); + decor.place(cntr, arb::threshold_detector{-20.0*U::mV}, "d"); decor.set_default(arb::cv_policy_every_segment()); @@ -443,10 +441,10 @@ arb::cable_cell branch_cell(arb::cell_gid_type gid, const cell_parameters& param decor.paint(soma, arb::density{"hh"}); decor.paint(dnds, arb::density{"pas"}); - decor.set_default(arb::axial_resistivity{100}); // [Ω·cm] + decor.set_default(arb::axial_resistivity{100*U::Ohm*U::cm}); // [Ω·cm] // Add spike threshold detector at the soma. - decor.place(arb::mlocation{0,0}, arb::threshold_detector{10}, "d"); + decor.place(arb::mlocation{0,0}, arb::threshold_detector{10*U::mV}, "d"); // Add a synapse to proximal end of first dendrite. decor.place(arb::mlocation{1, 0}, arb::synapse{"expsyn"}, "p"); diff --git a/example/diffusion/diffusion.cpp b/example/diffusion/diffusion.cpp index ba2405b074ace26ce07b9c997e03e34c7e20aa33..0d2952baca03eb0685496e79a2a10aaff0c3cb80 100644 --- a/example/diffusion/diffusion.cpp +++ b/example/diffusion/diffusion.cpp @@ -21,18 +21,20 @@ using namespace arborio::literals; using namespace arb; +namespace U = arb::units; + struct linear: public recipe { linear(double ext, double dx, double Xi, double beta): l{ext}, d{dx}, i{Xi}, b{beta} { gprop.default_parameters = neuron_parameter_defaults; gprop.default_parameters.discretization = cv_policy_max_extent{d}; - gprop.add_ion("bla", 1, 23, 42, 0, b); + gprop.add_ion("bla", 1, 23*U::mM, 42*U::mM, 0*U::mV, b*U::m2/U::s); } cell_size_type num_cells() const override { return 1; } cell_kind get_cell_kind(cell_gid_type) const override { return cell_kind::cable; } std::any get_global_properties(cell_kind) const override { return gprop; } std::vector<probe_info> get_probes(cell_gid_type) const override { return {{cable_probe_ion_diff_concentration_cell{"na"}, "nad"}}; } - std::vector<event_generator> event_generators(cell_gid_type) const override { return {explicit_generator({"Zap"}, 0.005, std::vector<float>{0.f})}; } + std::vector<event_generator> event_generators(cell_gid_type) const override { return {explicit_generator_from_milliseconds({"Zap"}, 0.005, std::vector{0.})}; } util::unique_any get_cell_description(cell_gid_type) const override { // Stick morphology // -----|----- @@ -41,9 +43,9 @@ struct linear: public recipe { tree.append(0, { -l, 0, 0, 3}, {l, 0, 0, 3}, 2); // Setup decor decor; - decor.set_default(init_int_concentration{"na", i}); - decor.set_default(ion_diffusivity{"na", b}); - decor.paint("(tag 1)"_reg, ion_diffusivity{"na", b}); + decor.set_default(init_int_concentration{"na", i*U::mM}); + decor.set_default(ion_diffusivity{"na", b*U::mM}); + decor.paint("(tag 1)"_reg, ion_diffusivity{"na", b*U::mM}); decor.place("(location 0 0.5)"_ls, synapse("inject/x=bla", {{"alpha", 200.0*l}}), "Zap"); decor.paint("(all)"_reg, density("decay/x=bla")); return cable_cell({tree}, decor); @@ -123,7 +125,7 @@ int main(int argc, char** argv) { auto C = make_context({1, O.gpu}); auto R = linear{O.L, O.dx, O.Xi, O.dX}; simulation S(R, C, partition_load_balance(R, C)); - S.add_sampler(all_probes, regular_schedule(O.ds), sampler); - S.run(O.T, O.dt); + S.add_sampler(all_probes, regular_schedule(O.ds*U::ms), sampler); + S.run(O.T*U::ms, O.dt*U::ms); out.close(); } diff --git a/example/drybench/drybench.cpp b/example/drybench/drybench.cpp index c5300d1aaab5131f4b4aab3d668c9ca0e6369e73..15e439584a7de5cf68038a56ff5e81657ee1bcec 100644 --- a/example/drybench/drybench.cpp +++ b/example/drybench/drybench.cpp @@ -1,10 +1,4 @@ -/* - * A miniapp that demonstrates how to use dry_run mode - * - */ - #include <fstream> -#include <iomanip> #include <iostream> #include <nlohmann/json.hpp> @@ -30,6 +24,8 @@ #include <sup/json_meter.hpp> #include <sup/json_params.hpp> +namespace U = arb::units; + struct bench_params { struct cell_params { double spike_freq_hz = 20; // Frequency in hz that cell will generate (poisson) spikes. @@ -79,7 +75,6 @@ std::ostream& operator<<(std::ostream& o, const bench_params& p); using arb::cell_gid_type; using arb::cell_lid_type; using arb::cell_size_type; -using arb::cell_member_type; using arb::cell_kind; using arb::time_type; @@ -100,8 +95,7 @@ public: } arb::util::unique_any get_cell_description(cell_gid_type gid) const override { - using RNG = std::mt19937_64; - auto gen = arb::poisson_schedule(params_.cell.spike_freq_hz/1000, RNG(gid)); + auto gen = arb::poisson_schedule(params_.cell.spike_freq_hz*arb::units::Hz, gid); return arb::benchmark_cell("src", "tgt", std::move(gen), params_.cell.realtime_ratio); } @@ -120,7 +114,7 @@ public: for (unsigned i=0; i<params_.network.fan_in; ++i) { auto src = source_distribution(src_gen); if (src>=gid) ++src; - conns.push_back(arb::cell_connection({src, "src"}, {"tgt"}, 1.f, params_.network.min_delay)); + conns.push_back(arb::cell_connection({src, "src"}, {"tgt"}, 1.f, params_.network.min_delay*U::ms)); } return conns; @@ -162,7 +156,7 @@ int main(int argc, char** argv) { meters.checkpoint("model-init", ctx); // Run the simulation for 100 ms, with time steps of 0.025 ms. - sim.run(params.duration, 0.025); + sim.run(params.duration*arb::units::ms, 0.025*arb::units::ms); meters.checkpoint("model-run", ctx); diff --git a/example/dryrun/branch_cell.hpp b/example/dryrun/branch_cell.hpp index 6b930d5d1750a59baf91e2b852aed121b1e1b536..665e4f53ed57a4afb0a17d1f31a3202095a415b3 100644 --- a/example/dryrun/branch_cell.hpp +++ b/example/dryrun/branch_cell.hpp @@ -17,6 +17,8 @@ using namespace arborio::literals; +namespace U = arb::units; + // Parameters used to generate the random cell morphologies. struct cell_parameters { cell_parameters() = default; @@ -35,7 +37,7 @@ struct cell_parameters { unsigned synapses = 1; }; -cell_parameters parse_cell_parameters(nlohmann::json& json) { +inline cell_parameters parse_cell_parameters(nlohmann::json& json) { cell_parameters params; sup::param_from_json(params.max_depth, "depth", json); sup::param_from_json(params.branch_probs, "branch-probs", json); @@ -55,7 +57,7 @@ double interp(const std::array<T,2>& r, unsigned i, unsigned n) { return r[0] + p*(r1-r0); } -arb::cable_cell branch_cell(arb::cell_gid_type gid, const cell_parameters& params) { +inline arb::cable_cell branch_cell(arb::cell_gid_type gid, const cell_parameters& params) { arb::segment_tree tree; // Add soma. @@ -110,12 +112,14 @@ arb::cable_cell branch_cell(arb::cell_gid_type gid, const cell_parameters& param labels.set("dend", tagged(dtag)); auto decor = arb::decor() - .set_default(arb::axial_resistivity{100}) // [Ω·cm] - .paint("soma"_lab, arb::density("hh")) // Add HH dynamics to soma. - .paint("dend"_lab, arb::density("pas")) // Leaky current everywhere else. - .place(arb::mlocation{0,0}, arb::threshold_detector{10}, "detector") // Add spike threshold detector at the soma. - .place(arb::mlocation{0, 0.5}, arb::synapse("expsyn"), "synapse") // Add a synapse to the mid point of the first dendrite. - .set_default(arb::cv_policy_every_segment()); // Make a CV between every sample in the sample tree. + .set_default(arb::axial_resistivity{100*U::Ohm*U::cm}) // [Ω·cm] + .paint("soma"_lab, arb::density("hh")) // Add HH dynamics to soma. + .paint("dend"_lab, arb::density("pas")) // Leaky current everywhere else. + .place(arb::mlocation{0,0}, + arb::threshold_detector{10*U::mV}, + "detector") // Add spike threshold detector at the soma. + .place(arb::mlocation{0, 0.5}, arb::synapse("expsyn"), "synapse") // Add a synapse to the mid point of the first dendrite. + .set_default(arb::cv_policy_every_segment()); // Make a CV between every sample in the sample tree. // Add additional synapses that will not be connected to anything. for (unsigned i=1u; i<params.synapses; ++i) { diff --git a/example/dryrun/dryrun.cpp b/example/dryrun/dryrun.cpp index 666bc5aae999c349c23f27ec08d6d98c5fca2d09..b49b651f0727540dce76fb79abd27444cd767177 100644 --- a/example/dryrun/dryrun.cpp +++ b/example/dryrun/dryrun.cpp @@ -1,8 +1,3 @@ -/* - * A miniapp that demonstrates how to use dry_run mode - * - */ - #include <any> #include <cassert> #include <fstream> @@ -56,7 +51,6 @@ run_params read_options(int argc, char** argv); using arb::cell_gid_type; using arb::cell_lid_type; using arb::cell_size_type; -using arb::cell_member_type; using arb::cell_kind; using arb::time_type; @@ -103,7 +97,7 @@ public: auto src = source_distribution(src_gen); if (src>=gid) ++src; - return {arb::cell_connection({src, "detector"}, {"synapse"}, event_weight_, min_delay_)}; + return {arb::cell_connection({src, "detector"}, {"synapse"}, event_weight_, min_delay_*U::ms)}; } // Return an event generator on every 20th gid. This function needs to generate events @@ -112,7 +106,7 @@ public: std::vector<arb::event_generator> event_generators(cell_gid_type gid) const override { std::vector<arb::event_generator> gens; if (gid%20 == 0) { - gens.push_back(arb::explicit_generator({"synapse"}, event_weight_, std::vector<float>{1.0f})); + gens.push_back(arb::explicit_generator_from_milliseconds({"synapse"}, event_weight_, std::vector{1.0})); } return gens; } @@ -179,8 +173,8 @@ int main(int argc, char** argv) { // The id of the only probe on the cell: the cell_member type points to (cell 0, probe 0) auto probeset_id = arb::cell_address_type{0, "Um"}; - // The schedule for sampling is 10 samples every 1 ms. - auto sched = arb::regular_schedule(1); + // The schedule for sampling every 1 ms. + auto sched = arb::regular_schedule(1*arb::units::ms); // This is where the voltage samples will be stored as (time, value) pairs arb::trace_vector<double> voltage; // Now attach the sampler at probeset_id, with sampling schedule sched, writing to voltage @@ -198,7 +192,7 @@ int main(int argc, char** argv) { meters.checkpoint("model-init", ctx); // Run the simulation for 100 ms, with time steps of 0.025 ms. - sim.run(params.duration, 0.025); + sim.run(params.duration*arb::units::ms, 0.025*arb::units::ms); meters.checkpoint("model-run", ctx); diff --git a/example/gap_junctions/gap_junctions.cpp b/example/gap_junctions/gap_junctions.cpp index 75e8f12dbf1e2c2936c414ed5ec8efbb87565443..bf20ad6facd0d9a833353ea434dcd7e4117bc4fe 100644 --- a/example/gap_junctions/gap_junctions.cpp +++ b/example/gap_junctions/gap_junctions.cpp @@ -34,6 +34,8 @@ using namespace arborio::literals; +namespace U = arb::units; + #ifdef ARB_MPI_ENABLED #include <mpi.h> #include <arborenv/with_mpi.hpp> @@ -84,7 +86,7 @@ public: if(gid % params_.n_cells_per_cable || (int)gid - 1 < 0) { return{}; } - return {arb::cell_connection({gid - 1, "detector"}, {"syn"}, params_.event_weight, params_.event_min_delay)}; + return {arb::cell_connection({gid - 1, "detector"}, {"syn"}, params_.event_weight, params_.event_min_delay*U::ms)}; } std::vector<arb::probe_info> get_probes(cell_gid_type gid) const override { @@ -175,7 +177,7 @@ int main(int argc, char** argv) { // Set up the probe that will measure voltage in the cell. - auto sched = arb::regular_schedule(0.025); + auto sched = arb::regular_schedule(0.025*U::ms); // This is where the voltage samples will be stored as (time, value) pairs std::vector<arb::trace_vector<double>> voltage_traces(decomp.num_local_cells()); @@ -200,7 +202,7 @@ int main(int argc, char** argv) { std::cout << "running simulation" << std::endl; // Run the simulation for 100 ms, with time steps of 0.025 ms. - sim.run(params.sim_duration, 0.025); + sim.run(params.sim_duration*U::ms, 0.025*U::ms); meters.checkpoint("model-run", context); @@ -275,15 +277,15 @@ arb::cable_cell gj_cell(cell_gid_type gid, unsigned ncell, double stim_duration) tree.append(0, {0,0,2*soma_rad, dend_rad}, {0,0,2*soma_rad+300, dend_rad}, 3); // dendrite auto decor = arb::decor{} - .set_default(arb::axial_resistivity{100}) // [Ω·cm] - .set_default(arb::membrane_capacitance{0.018}) // [F/m²] + .set_default(arb::axial_resistivity{100*U::Ohm*U::cm}) // [Ω·cm] + .set_default(arb::membrane_capacitance{0.018*U::F/U::m2}) // [F/m²] // Paint density channels on all parts of the cell .paint("(all)"_reg, arb::density{"nax", {{"gbar", 0.04}, {"sh", 10}}}) .paint("(all)"_reg, arb::density{"kdrmt", {{"gbar", 0.0001}}}) .paint("(all)"_reg, arb::density{"kamt", {{"gbar", 0.004}}}) .paint("(all)"_reg, arb::density{"pas/e=-65", {{"g", 1.0/12000.0}}}) // Add a spike detector to the soma. - .place(arb::mlocation{0,0}, arb::threshold_detector{10}, "detector") + .place(arb::mlocation{0,0}, arb::threshold_detector{10*U::mV}, "detector") // Add two gap junction sites. .place(arb::mlocation{0, 1}, arb::junction{"gj"}, "local_1") .place(arb::mlocation{0, 0}, arb::junction{"gj"}, "local_0") @@ -292,7 +294,7 @@ arb::cable_cell gj_cell(cell_gid_type gid, unsigned ncell, double stim_duration) // Attach a stimulus to the first cell of the first group if (!gid) { - auto stim = arb::i_clamp::box(0, stim_duration, 0.4); + auto stim = arb::i_clamp::box(0*U::ms, stim_duration*U::ms, 0.4*U::nA); decor.place(arb::mlocation{0, 0.5}, stim, "stim"); } diff --git a/example/generators/generators.cpp b/example/generators/generators.cpp index 08adb2cf86f7929ddc29d4960cc4c6fcfabf39c1..858fe05e6bfb4c801dac3d17e8782d75136b342a 100644 --- a/example/generators/generators.cpp +++ b/example/generators/generators.cpp @@ -10,7 +10,6 @@ #include <cassert> #include <fstream> #include <iomanip> -#include <iostream> #include <nlohmann/json.hpp> @@ -99,15 +98,14 @@ public: // Add excitatory generator gens.push_back( - arb::poisson_generator({"syn"}, // Target synapse index on cell `gid` - w_e, // Weight of events to deliver - t0, // Events start being delivered from this time - lambda_e, // Expected frequency (kHz) - RNG(29562872))); // Random number generator to use + arb::poisson_generator({"syn"}, // Target synapse index on cell `gid` + w_e, // Weight of events to deliver + t0*arb::units::ms, // Events start being delivered from this time + lambda_e*arb::units::kHz, // Expected frequency (kHz) + 29562872)); // Random number generator to use // Add inhibitory generator - gens.emplace_back( - arb::poisson_generator({"syn"}, w_i, t0, lambda_i, RNG(86543891))); + gens.emplace_back(arb::poisson_generator({"syn"}, w_i, t0*arb::units::ms, lambda_i*arb::units::kHz, 86543891)); return gens; } @@ -138,14 +136,14 @@ int main() { // The id of the only probe on the cell: the cell_member type points to (cell 0, probe 0) auto probeset_id = arb::cell_address_type{0, "Um"}; // The schedule for sampling is 10 samples every 1 ms. - auto sched = arb::regular_schedule(0.1); + auto sched = arb::regular_schedule(0.1*arb::units::ms); // This is where the voltage samples will be stored as (time, value) pairs arb::trace_vector<double> voltage; // Now attach the sampler at probeset_id, with sampling schedule sched, writing to voltage sim.add_sampler(arb::one_probe(probeset_id), sched, arb::make_simple_sampler(voltage)); // Run the simulation for 100 ms, with time steps of 0.01 ms. - sim.run(100, 0.01); + sim.run(100*arb::units::ms, 0.01*arb::units::ms); // Write the samples to a json file. write_trace_json(voltage.at(0)); diff --git a/example/lfp/lfp.cpp b/example/lfp/lfp.cpp index 041b1862935e9eb46eddb1f4c33a1f749ad76405..b02a5a97cf10d1b837986596be2b38ce8ec1573a 100644 --- a/example/lfp/lfp.cpp +++ b/example/lfp/lfp.cpp @@ -19,12 +19,13 @@ using std::any; using arb::util::any_cast; -using arb::util::any_ptr; using arb::util::unique_any; using arb::cell_gid_type; using namespace arborio::literals; +namespace U = arb::units; + // Recipe represents one cable cell with one synapse, together with probes for total trans-membrane current, membrane voltage, // ionic current density, and synaptic conductance. A sequence of spikes are presented to the one synapse on the cell. @@ -83,8 +84,8 @@ private: synapse_location_ = "(on-components 0.5 (tag 1))"_ls; auto dec = decor() // Use NEURON defaults for reversal potentials, ion concentrations etc., but override ra, cm. - .set_default(axial_resistivity{100}) // [Ω·cm] - .set_default(membrane_capacitance{0.01}) // [F/m²] + .set_default(axial_resistivity{100*U::Ohm*U::cm}) // [Ω·cm] + .set_default(membrane_capacitance{0.01*U::F/U::m2}) // [F/m²] // Twenty CVs per branch on the dendrites (tag 4). .set_default(cv_policy_fixed_per_branch(20, arb::reg::tagged(4))) // Add pas and hh mechanisms: @@ -185,7 +186,7 @@ int main(int argc, char** argv) { const double dt = 0.1; // [ms] // Weight 0.005 μS, onset at t = 0 ms, mean frequency 0.1 kHz. - auto events = arb::poisson_generator({"syn"}, .005, 0., 0.1, std::minstd_rand{}); + auto events = arb::poisson_generator({"syn"}, .005, 0.*U::ms, 100*U::Hz); lfp_demo_recipe recipe(events); arb::simulation sim(recipe); @@ -203,7 +204,7 @@ int main(int argc, char** argv) { lfp_sampler lfp(placed_cell, current_cables, electrodes, 3.0); - auto sample_schedule = arb::regular_schedule(sample_dt); + auto sample_schedule = arb::regular_schedule(sample_dt*U::ms); sim.add_sampler(arb::one_probe({0, "Itotal"}), sample_schedule, lfp.callback()); arb::trace_vector<double, arb::mlocation> membrane_voltage; @@ -215,7 +216,7 @@ int main(int argc, char** argv) { arb::trace_vector<double> synapse_g; sim.add_sampler(arb::one_probe({0, "expsyn-g"}), sample_schedule, make_simple_sampler(synapse_g)); - sim.run(t_stop, dt); + sim.run(t_stop*U::ms, dt*U::ms); // Output results in JSON format suitable for plotting by plot-lfp.py script. diff --git a/example/ornstein_uhlenbeck/ou.cpp b/example/ornstein_uhlenbeck/ou.cpp index d3669e62bcdcf2c7fc7ce098d01deea505ac2aef..369a54856f60aa806090f6e1ad54fce89bfedeb0 100644 --- a/example/ornstein_uhlenbeck/ou.cpp +++ b/example/ornstein_uhlenbeck/ou.cpp @@ -120,10 +120,10 @@ int main(int argc, char** argv) { // setup sampler and add it to the simulation with regular schedule std::vector<arb_value_type> data; sampler s{data, ncvs, nsteps}; - sim.add_sampler(arb::all_probes, arb::regular_schedule(dt), s); + sim.add_sampler(arb::all_probes, arb::regular_schedule(dt*arb::units::ms), s); // run the simulation - sim.run(nsteps*dt, dt); + sim.run(nsteps*dt*arb::units::ms, dt*arb::units::ms); // evaluate the mean for each time step across the ensembe of realizations // (each control volume is a independent realization of the Ornstein-Uhlenbeck process) diff --git a/example/plasticity/branch_cell.hpp b/example/plasticity/branch_cell.hpp index 527f26012c4a47dac2b285d25c66347f18054e55..23567cd93a96e00558a5530c8e9999f148c7d17c 100644 --- a/example/plasticity/branch_cell.hpp +++ b/example/plasticity/branch_cell.hpp @@ -118,7 +118,7 @@ arb::cable_cell branch_cell(arb::cell_gid_type gid, const cell_parameters& param decor.set_default(arb::axial_resistivity{100}); // [Ω·cm] // Add spike threshold detector at the soma. - decor.place(arb::mlocation{0,0}, arb::threshold_detector{10}, "detector"); + decor.place(arb::mlocation{0,0}, arb::threshold_detector{10*arb::units::mV}, "detector"); // Add a synapse to the mid point of the first dendrite. decor.place(arb::mlocation{0, 0.5}, arb::synapse("expsyn"), "primary_syn"); @@ -132,7 +132,5 @@ arb::cable_cell branch_cell(arb::cell_gid_type gid, const cell_parameters& param // Make a CV between every sample in the sample tree. decor.set_default(arb::cv_policy_every_segment()); - arb::cable_cell cell(arb::morphology(tree), labels, decor); - - return cell; + return {arb::morphology(tree), labels, decor}; } diff --git a/example/plasticity/plasticity.cpp b/example/plasticity/plasticity.cpp index ad07a91bc0e01de8c2570f0fa3489947f197d7d5..90299d8a853ab02e4b38f17fd63a4173098f4d0c 100644 --- a/example/plasticity/plasticity.cpp +++ b/example/plasticity/plasticity.cpp @@ -13,6 +13,8 @@ using namespace arborio::literals; +namespace U = arb::units; + // Fan out network with n members // - one spike source at gid 0 // - n-1 passive, soma-only cable cells @@ -55,17 +57,18 @@ struct recipe: public arb::recipe { return {}; } // Connect cell `to` to the spike source - void add_connection(arb::cell_gid_type to) { assert(to > 0); connected[to] = {arb::cell_connection({0, src}, {syn}, weight, delay)}; } + void add_connection(arb::cell_gid_type to) { assert(to > 0); connected[to] = { + arb::cell_connection({0, src}, {syn}, weight, delay*U::ms)}; } // Return the cell at gid arb::util::unique_any get_cell_description(arb::cell_gid_type gid) const override { // source at gid 0 - if (gid == 0) return arb::spike_source_cell{src, arb::regular_schedule(f_spike)}; + if (gid == 0) return arb::spike_source_cell{src, arb::regular_schedule(f_spike*arb::units::ms)}; // all others are receiving cable cells; single CV w/ HH arb::segment_tree tree; tree.append(arb::mnpos, {-r_soma, 0, 0, r_soma}, {r_soma, 0, 0, r_soma}, 1); auto decor = arb::decor{} .paint(all, arb::density("hh", {{"gl", 5}})) .place(center, arb::synapse("expsyn"), syn) - .place(center, arb::threshold_detector{-10.0}, det) + .place(center, arb::threshold_detector{-10.0*arb::units::mV}, det) .set_default(arb::cv_policy_every_segment()); return arb::cable_cell({tree}, decor); } @@ -110,11 +113,11 @@ int main(int argc, char** argv) { rec.add_connection(1); auto ctx = arb::make_context(arb::proc_allocation{8, -1}); auto sim = arb::simulation(rec, ctx); - sim.add_sampler(arb::all_probes, arb::regular_schedule(dt), sampler); + sim.add_sampler(arb::all_probes, arb::regular_schedule(dt*arb::units::ms), sampler); sim.set_global_spike_callback(spike_cb); print_header(0, 1); - sim.run(1.0, dt); + sim.run(1.0*arb::units::ms, dt*arb::units::ms); rec.add_connection(2); print_header(1, 2); - sim.run(2.0, dt); + sim.run(2.0*arb::units::ms, dt*arb::units::ms); } diff --git a/example/probe-demo/probe-demo.cpp b/example/probe-demo/probe-demo.cpp index 19982c66c5b31674430a731c2b4539a9ebe9f3e7..ed58297ae71d987007ca144471358b21583ff928 100644 --- a/example/probe-demo/probe-demo.cpp +++ b/example/probe-demo/probe-demo.cpp @@ -2,7 +2,6 @@ #include <functional> #include <iomanip> #include <iostream> -#include <stdexcept> #include <string> #include <tuple> #include <utility> @@ -119,15 +118,15 @@ struct cable_recipe: public arb::recipe { auto decor = arb::decor{} .paint(arb::reg::all(), arb::density("hh")) // HH mechanism over whole cell. - .place(arb::mlocation{0, 0.}, arb::i_clamp{1.}, "iclamp") // Inject a 1 nA current indefinitely. + .place(arb::mlocation{0, 0.}, arb::i_clamp{1.*arb::units::nA}, "iclamp") // Inject a 1 nA current indefinitely. .place(arb::mlocation{0, 0.}, arb::synapse("expsyn"), "synapse1") // a synapse .place(arb::mlocation{0, 0.5}, arb::synapse("expsyn"), "synapse2"); // another synapse return arb::cable_cell(tree, decor); } virtual std::vector<arb::event_generator> event_generators(arb::cell_gid_type) const override { - return {arb::poisson_generator({"synapse1"}, .005, 0., 0.1, std::minstd_rand{}), - arb::poisson_generator({"synapse2"}, .1, 0., 0.1, std::minstd_rand{})}; + return {arb::poisson_generator({"synapse1"}, .005, 0.*arb::units::ms, 0.1*arb::units::kHz), + arb::poisson_generator({"synapse2"}, .1, 0.*arb::units::ms, 0.1*arb::units::kHz)}; } }; @@ -144,13 +143,13 @@ int main(int argc, char** argv) { arb::simulation sim(R); sim.add_sampler(arb::all_probes, - arb::regular_schedule(opt.sample_dt), + arb::regular_schedule(opt.sample_dt*arb::units::ms), opt.scalar_probe? scalar_sampler: vector_sampler); // CSV header for sample output: std::cout << "t, " << (opt.scalar_probe? "x, ": "x0, x1, ") << opt.value_name << '\n'; - sim.run(opt.sim_end, opt.sim_dt); + sim.run(opt.sim_end*arb::units::ms, opt.sim_dt*arb::units::ms); } catch (to::option_error& e) { to::usage_error(argv[0], "[OPTIONS]... PROBE\nTry '--help' for more information.", e.what()); diff --git a/example/remote/remote.cpp b/example/remote/remote.cpp index bc75669b723ec0ac63554e3c73642c3281ecb629..9bbdf7c99e36b8690f1061b5118c0fe34f20c868 100644 --- a/example/remote/remote.cpp +++ b/example/remote/remote.cpp @@ -1,11 +1,14 @@ #include <iomanip> #include <iostream> -#include <cassert> #include <arbor/context.hpp> #include <arbor/lif_cell.hpp> #include <arbor/simulation.hpp> #include <arbor/version.hpp> +#include <arbor/recipe.hpp> +#include <arbor/units.hpp> + +namespace U = arb::units; #include <mpi.h> #include <arbor/communication/remote.hpp> @@ -19,20 +22,20 @@ struct remote_recipe: public arb::recipe { arb::cell_size_type num_cells() const override { return size; } arb::util::unique_any get_cell_description(arb::cell_gid_type) const override { auto lif = arb::lif_cell("src", "tgt"); - lif.tau_m = 2.0; - lif.V_th = -10.0; - lif.C_m = 20.0; - lif.E_L = -23.0; - lif.V_m = -23.0; - lif.E_R = -23.0; - lif.t_ref = 0.2; + lif.tau_m = 2.0*U::ms; + lif.V_th = -10.0*U::mV; + lif.C_m = 20.0*U::pF; + lif.E_L = -23.0*U::mV; + lif.V_m = -23.0*U::mV; + lif.E_R = -23.0*U::mV; + lif.t_ref = 0.2*U::ms; return lif; } std::vector<arb::ext_cell_connection> external_connections_on(arb::cell_gid_type) const override { std::vector<arb::ext_cell_connection> res; // Invent some fictious cells outside of Arbor's realm for (arb::cell_gid_type gid = 0; gid < 10; gid++) { - res.emplace_back(arb::cell_remote_label_type{gid}, arb::cell_local_label_type{"tgt"}, weight, delay); + res.emplace_back(arb::cell_remote_label_type{gid}, arb::cell_local_label_type{"tgt"}, weight, delay*U::ms); } return res; } @@ -75,9 +78,9 @@ int main() { std::cerr << "[ARB]" << mpi.rank << " " << mpi.local_rank << '\n'; std::cerr << "[ARB] Got min delay=" << mid << '\n'; sim.add_sampler(arb::all_probes, - arb::regular_schedule(0.05), + arb::regular_schedule(0.05*arb::units::ms), sampler); - sim.run(T, dt); + sim.run(T*arb::units::ms, dt*arb::units::ms); std::cout << std::fixed << std::setprecision(4); std::cerr << "[ARB] Trace\n"; for (const auto& [t, v]: trace) std::cout << " " << t << " " << v << '\n'; diff --git a/example/ring/branch_cell.hpp b/example/ring/branch_cell.hpp index 61740a99290f08445db1cf86caedc233dfdb2d7c..92aa9f61196b7cf63b96dd400704c6a527d312f7 100644 --- a/example/ring/branch_cell.hpp +++ b/example/ring/branch_cell.hpp @@ -17,6 +17,8 @@ using namespace arborio::literals; +namespace U = arb::units; + // Parameters used to generate the random cell morphologies. struct cell_parameters { cell_parameters() = default; @@ -35,7 +37,7 @@ struct cell_parameters { unsigned synapses = 1; }; -cell_parameters parse_cell_parameters(nlohmann::json& json) { +inline cell_parameters parse_cell_parameters(nlohmann::json& json) { cell_parameters params; sup::param_from_json(params.max_depth, "depth", json); sup::param_from_json(params.branch_probs, "branch-probs", json); @@ -55,7 +57,7 @@ double interp(const std::array<T,2>& r, unsigned i, unsigned n) { return r[0] + p*(r1-r0); } -arb::cable_cell branch_cell(arb::cell_gid_type gid, const cell_parameters& params) { +inline arb::cable_cell branch_cell(arb::cell_gid_type gid, const cell_parameters& params) { arb::segment_tree tree; // Add soma. @@ -113,8 +115,8 @@ arb::cable_cell branch_cell(arb::cell_gid_type gid, const cell_parameters& param auto decor = arb::decor{} .paint("soma"_lab, arb::density("hh")) .paint("dend"_lab, arb::density("pas")) - .set_default(arb::axial_resistivity{100}) // [Ω·cm] - .place(arb::mlocation{0,0}, arb::threshold_detector{10}, "detector") // Add spike threshold detector at the soma. + .set_default(arb::axial_resistivity{100*U::Ohm*U::cm}) // [Ω·cm] + .place(arb::mlocation{0,0}, arb::threshold_detector{10*U::mV}, "detector") // Add spike threshold detector at the soma. .place(arb::mlocation{0, 0.5}, arb::synapse("expsyn"), "primary_syn"); // Add a synapse to the mid point of the first dendrite. // Add additional synapses that will not be connected to anything. if (params.synapses > 1) { diff --git a/example/ring/ring.cpp b/example/ring/ring.cpp index 22d201f955da4a6f39b1a1e7c79bb1ae449d593e..db488dfcd4b6bc7585948a4f8dda613b3c71883e 100644 --- a/example/ring/ring.cpp +++ b/example/ring/ring.cpp @@ -1,10 +1,4 @@ -/* - * A miniapp that demonstrates how to make a ring model - * - */ - #include <any> -#include <cassert> #include <fstream> #include <iomanip> #include <iostream> @@ -90,7 +84,7 @@ public: std::vector<arb::cell_connection> connections_on(cell_gid_type gid) const override { std::vector<arb::cell_connection> cons; cell_gid_type src = gid? gid-1: num_cells_-1; - cons.push_back(arb::cell_connection({src, "detector"}, {"primary_syn"}, event_weight_, min_delay_)); + cons.push_back(arb::cell_connection({src, "detector"}, {"primary_syn"}, event_weight_, min_delay_*U::ms)); return cons; } @@ -99,7 +93,7 @@ public: std::vector<arb::event_generator> event_generators(cell_gid_type gid) const override { std::vector<arb::event_generator> gens; if (!gid) { - gens.push_back(arb::explicit_generator({"primary_syn"}, event_weight_, std::vector<float>{1.0f})); + gens.push_back(arb::explicit_generator_from_milliseconds({"primary_syn"}, event_weight_, std::vector{1.0})); } return gens; } @@ -168,8 +162,8 @@ int main(int argc, char** argv) { // The id of the only probe on the cell: the cell_member type points to (cell 0, probe 0) auto probeset_id = arb::cell_address_type{0, "Um"}; - // The schedule for sampling is 10 samples every 1 ms. - auto sched = arb::regular_schedule(1); + // The schedule for sampling every 1 ms. + auto sched = arb::regular_schedule(1*arb::units::ms); // This is where the voltage samples will be stored as (time, value) pairs arb::trace_vector<double> voltage; // Now attach the sampler at probeset_id, with sampling schedule sched, writing to voltage @@ -191,7 +185,7 @@ int main(int argc, char** argv) { } std::cout << "running simulation\n" << std::endl; // Run the simulation for 100 ms, with time steps of 0.025 ms. - sim.run(params.duration, 0.025); + sim.run(params.duration*arb::units::ms, 0.025*arb::units::ms); meters.checkpoint("model-run", context); diff --git a/example/single/single.cpp b/example/single/single.cpp index fe07488916c6dfa19ec04c0a2b26ae2f7fa3cdb7..d5590a5520f1cece44a2e1da81254f6bd348a6a0 100644 --- a/example/single/single.cpp +++ b/example/single/single.cpp @@ -1,6 +1,5 @@ #include <any> #include <fstream> -#include <iomanip> #include <iostream> #include <stdexcept> #include <string> @@ -87,18 +86,18 @@ int main(int argc, char** argv) { arb::simulation sim(R); // Attach a sampler to the probe described in the recipe, sampling every 0.1 ms. - arb::trace_vector<double> traces; - sim.add_sampler(arb::all_probes, arb::regular_schedule(0.1), arb::make_simple_sampler(traces)); - - // Trigger the single synapse (target is gid 0, index 0) at t = 1 ms with - // the given weight. + sim.add_sampler(arb::all_probes, + arb::regular_schedule(0.1*arb::units::ms), + arb::make_simple_sampler(traces)); + // Trigger the single synapse (target is gid 0, index 0) at t = 1 ms + // with the given weight. arb::spike_event spike = {0, 1., opt.syn_weight}; arb::cell_spike_events cell_spikes = {0, {spike}}; sim.inject_events({cell_spikes}); - sim.run(opt.t_end, opt.dt); + sim.run(opt.t_end*arb::units::ms, opt.dt*arb::units::ms); for (auto entry: traces.at(0)) { std::cout << entry.t << ", " << entry.v << "\n"; diff --git a/example/v_clamp/v-clamp.cpp b/example/v_clamp/v-clamp.cpp index 15eeb65e8f82d9518b7755400f62ae45e3545103..dbbc15170cf37fd4154db5c698513c2882d14a13 100644 --- a/example/v_clamp/v-clamp.cpp +++ b/example/v_clamp/v-clamp.cpp @@ -1,6 +1,5 @@ #include <any> #include <fstream> -#include <iomanip> #include <iostream> #include <stdexcept> #include <string> @@ -92,7 +91,7 @@ int main(int argc, char** argv) { // Attach a sampler to the probe described in the recipe, sampling every 0.1 ms. arb::trace_vector<double> traces; - sim.add_sampler(arb::all_probes, arb::regular_schedule(0.1), arb::make_simple_sampler(traces)); + sim.add_sampler(arb::all_probes, arb::regular_schedule(0.1*arb::units::ms), arb::make_simple_sampler(traces)); // Trigger the single synapse (target is gid 0, index 0) at t = 1 ms with // the given weight. @@ -101,7 +100,7 @@ int main(int argc, char** argv) { arb::cell_spike_events cell_spikes = {0, {spike}}; sim.inject_events({cell_spikes}); - sim.run(opt.t_end, opt.dt); + sim.run(opt.t_end*arb::units::ms, opt.dt*arb::units::ms); for (auto entry: traces.at(0)) { std::cout << entry.t << ", " << entry.v << "\n"; diff --git a/ext/CMakeLists.txt b/ext/CMakeLists.txt index 23b9c6587963264f77fd84c179828469eff3a638..009a5bc22377f370f99248ed411ac2c6fe4f96b6 100644 --- a/ext/CMakeLists.txt +++ b/ext/CMakeLists.txt @@ -118,3 +118,19 @@ else() target_link_libraries(ext-gtest INTERFACE GTest::gtest GTest::gtest_main) endif() endif() + +if (ARB_USE_BUNDLED_UNITS) + set(UNITS_ENABLE_TESTS OFF CACHE INTERNAL "") + set(UNITS_BUILD_STATIC_LIBRARY ON CACHE INTERNAL "") + set(UNITS_BUILD_SHARED_LIBRARY OFF CACHE INTERNAL "") + set(UNITS_BUILD_CONVERTER_APP OFF CACHE INTERNAL "") + set(UNITS_BUILD_WEBSERVER OFF CACHE INTERNAL "") + set(UNITS_INSTALL ON CACHE INTERNAL "") + # set(UNITS_NAMESPACE "llnl::units" CACHE INTERNAL "") + + add_subdirectory("${PROJECT_SOURCE_DIR}/ext/units" "${PROJECT_BINARY_DIR}/ext/units") + + mark_as_advanced(UNITS_BUILD_OBJECT_LIBRARY) + mark_as_advanced(UNITS_HEADER_ONLY) + mark_as_advanced(UNITS_NAMESPACE) +endif() diff --git a/ext/sup/include/sup/export.hpp b/ext/sup/include/sup/export.hpp new file mode 100644 index 0000000000000000000000000000000000000000..a446e3daee98febf6ce277d581996d336c45bd1f --- /dev/null +++ b/ext/sup/include/sup/export.hpp @@ -0,0 +1,41 @@ +#pragma once + +//#ifndef ARB_EXPORT_DEBUG +//# define ARB_EXPORT_DEBUG +//#endif + +#include <arbor/util/visibility.hpp> + +/* library build type (ARB_SUP_STATIC_LIBRARY/ARB_SUP_SHARED_LIBRARY) */ +#define ARB_SUP_STATIC_LIBRARY + +#ifndef ARB_SUP_EXPORTS +# if defined(arbor_sup_EXPORTS) + /* we are building arbor-sup dynamically */ +# ifdef ARB_EXPORT_DEBUG +# pragma message "we are building arbor-sup dynamically" +# endif +# define ARB_SUP_API ARB_SYMBOL_EXPORT +# elif defined(arbor_sup_EXPORTS_STATIC) + /* we are building arbor-sup statically */ +# ifdef ARB_EXPORT_DEBUG +# pragma message "we are building arbor-sup statically" +# endif +# define ARB_SUP_API +# else + /* we are using the library arbor-sup */ +# if defined(ARB_SUP_SHARED_LIBRARY) + /* we are importing arbor-sup dynamically */ +# ifdef ARB_EXPORT_DEBUG +# pragma message "we are importing arbor-sup dynamically" +# endif +# define ARB_SUP_API ARB_SYMBOL_IMPORT +# else + /* we are importing arbor-sup statically */ +# ifdef ARB_EXPORT_DEBUG +# pragma message "we are importing arbor-sup statically" +# endif +# define ARB_SUP_API +# endif +# endif +#endif diff --git a/ext/units b/ext/units new file mode 160000 index 0000000000000000000000000000000000000000..e7aff9f8e4cc1ce19b1ea7e7095036e64123601f --- /dev/null +++ b/ext/units @@ -0,0 +1 @@ +Subproject commit e7aff9f8e4cc1ce19b1ea7e7095036e64123601f diff --git a/mechanisms/stochastic/calcium_based_synapse.mod b/mechanisms/stochastic/calcium_based_synapse.mod index 4d45a19e1c58668c0deece261723c9ce2a1a05e3..d21656a8b406cab5b3f2646744d18963391af7bb 100644 --- a/mechanisms/stochastic/calcium_based_synapse.mod +++ b/mechanisms/stochastic/calcium_based_synapse.mod @@ -58,19 +58,9 @@ PARAMETER { tau_Ca = 20 (ms) } -ASSIGNED { - one_over_tau - one_over_tau_Ca - sigma_over_sqrt_tau -} - INITIAL { c = 0 rho = rho_0 - - one_over_tau = 1/tau - one_over_tau_Ca = 1/tau_Ca - sigma_over_sqrt_tau = sigma/(tau^0.5) } BREAKPOINT { @@ -82,12 +72,16 @@ WHITE_NOISE { } DERIVATIVE state { - LOCAL hsp - LOCAL hsd + LOCAL hsp, hsd, d_rho, d_w + hsp = step_right(c - theta_p) hsd = step_right(c - theta_d) - rho' = (-rho*(1-rho)*(rho_star-rho) + gamma_p*(1-rho)*hsp - gamma_d*rho*hsd)*one_over_tau + (hsp + hsd)^0.5*sigma_over_sqrt_tau*W - c' = -c*one_over_tau_Ca + + d_rho = (rho*(rho - 1)*(rho_star - rho) + gamma_p*(1 - rho)*hsp - gamma_d*rho*hsd)/tau + d_w = sigma*((hsp + hsd)/tau)^0.5 + + rho' = d_rho + d_w*W + c' = -c/tau_Ca } NET_RECEIVE(weight) { diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index de26283cd2d09ff40105e2056ae0b20b8f181a39..21b0bdc16fef4dd0cef28dd89b7100eb470ef7d1 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -36,11 +36,13 @@ set(pyarb_source mpi.cpp profiler.cpp pyarb.cpp + label_dict.cpp recipe.cpp schedule.cpp simulation.cpp single_cell_model.cpp env.cpp + units.cpp ) set_property(SOURCE config.cpp PROPERTY COMPILE_DEFINITIONS ARB_BINARY="${CMAKE_INSTALL_BINDIR}" APPEND) @@ -117,4 +119,5 @@ endif() install(TARGETS pyarb DESTINATION ${_python_module_install_path}) install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/__init__.py DESTINATION ${_python_module_install_path}) +install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/stubs/arbor/ DESTINATION ${_python_module_install_path}) install(FILES ${PROJECT_SOURCE_DIR}/VERSION ${PROJECT_SOURCE_DIR}/README.md ${PROJECT_SOURCE_DIR}/LICENSE DESTINATION ${_python_module_install_path}) diff --git a/python/cable_cell_io.cpp b/python/cable_cell_io.cpp index 61d8d9f0ed9466edb1c34064bba1116f529f9168..e3cff7aa8004e8c80d4b164cf33ab6bd67cfc702 100644 --- a/python/cable_cell_io.cpp +++ b/python/cable_cell_io.cpp @@ -3,8 +3,6 @@ #include <pybind11/iostream.h> #include <fstream> -#include <iostream> -#include <iomanip> #include <arbor/cable_cell.hpp> #include <arbor/util/any_visitor.hpp> @@ -13,8 +11,7 @@ #include "error.hpp" #include "util.hpp" -#include "strprintf.hpp" -#include "proxy.hpp" +#include "label_dict.hpp" namespace pyarb { @@ -53,6 +50,9 @@ void write_component(const arborio::cable_cell_component& component, py::object } void register_cable_loader(pybind11::module& m) { + pybind11::class_<arborio::meta_data> component_meta_data(m, "component_meta_data"); + pybind11::class_<arborio::cable_cell_component> cable_component(m, "cable_component"); + m.def("load_component", &load_component, pybind11::arg("filename_or_descriptor"), @@ -75,9 +75,7 @@ void register_cable_loader(pybind11::module& m) { "Write decor to file."); m.def("write_component", - [](const arb::label_dict& d, py::object fn) { - return write_component<arb::label_dict>(d, fn); - }, + [](const label_dict_proxy& d, py::object fn) { return write_component<arb::label_dict>(d.dict, fn); }, pybind11::arg("object"), pybind11::arg("filename_or_descriptor"), "Write label_dict to file."); @@ -99,12 +97,10 @@ void register_cable_loader(pybind11::module& m) { "Write cable_cell to file."); // arborio::meta_data - pybind11::class_<arborio::meta_data> component_meta_data(m, "component_meta_data"); component_meta_data .def_readwrite("version", &arborio::meta_data::version, "cable-cell component version."); // arborio::cable_cell_component - pybind11::class_<arborio::cable_cell_component> cable_component(m, "cable_component"); cable_component .def_readwrite("meta_data", &arborio::cable_cell_component::meta, "cable-cell component meta-data.") .def_property_readonly( diff --git a/python/cells.cpp b/python/cells.cpp index c1c446b53cddd9c5351e4ee3e96697645dde1e89..93415fb6a8ebf1863458ccb0bc55c91426afe3e0 100644 --- a/python/cells.cpp +++ b/python/cells.cpp @@ -1,15 +1,12 @@ #include <algorithm> -#include <any> -#include <cstddef> #include <optional> #include <string> -#include <unordered_map> #include <utility> -#include <vector> #include <pybind11/operators.h> -#include <pybind11/pybind11.h> #include <pybind11/stl.h> +#include <pybind11/cast.h> +#include <pybind11/pytypes.h> #include <arborio/cv_policy_parse.hpp> #include <arborio/label_parse.hpp> @@ -18,6 +15,7 @@ #include <arbor/cable_cell.hpp> #include <arbor/lif_cell.hpp> #include <arbor/cv_policy.hpp> +#include <arbor/cable_cell_param.hpp> #include <arbor/morph/cv_data.hpp> #include <arbor/morph/label_dict.hpp> #include <arbor/morph/locset.hpp> @@ -27,21 +25,21 @@ #include <arbor/spike_source_cell.hpp> #include <arbor/util/any_cast.hpp> #include <arbor/util/unique_any.hpp> +#include <arbor/cv_policy.hpp> -#include "arbor/cable_cell_param.hpp" -#include "arbor/cv_policy.hpp" #include "conversion.hpp" #include "error.hpp" -#include "proxy.hpp" -#include "pybind11/cast.h" -#include "pybind11/stl.h" -#include "pybind11/pytypes.h" +#include "label_dict.hpp" #include "schedule.hpp" #include "strprintf.hpp" #include "util.hpp" namespace pyarb { +namespace U = arb::units; + +namespace py = pybind11; + template <typename T> std::string to_string(const T& t) { std::stringstream ss; @@ -78,12 +76,21 @@ std::string to_string(const arb::cable_cell_global_properties& props) { } s += "}\n"; s += util::pprintf(" parameters: {Vm: {}, cm: {}, rL: {}, tempK: {}}\n", - D.init_membrane_potential, D.membrane_capacitance, - D.axial_resistivity, D.temperature_K); + D.init_membrane_potential, D.membrane_capacitance, + D.axial_resistivity, D.temperature_K); s += "}"; return s; } +struct ion_settings { + int charge = 0; + std::optional<double> internal_concentration; + std::optional<double> external_concentration; + std::optional<double> diffusivity; + std::optional<double> reversal_potential; + std::string reversal_potential_method = "const"; +}; + // // cv_policy helpers // @@ -110,7 +117,7 @@ arb::cv_policy make_cv_policy_max_extent(double cv_length, const std::string& re // Helper for finding a mechanism description in a Python object. // Allows rev_pot_method to be specified with string or mechanism_desc -std::optional<arb::mechanism_desc> maybe_method(pybind11::object method) { +std::optional<arb::mechanism_desc> maybe_method(py::object method) { if (!method.is_none()) { if (auto m=try_cast<std::string>(method)) { return *m; @@ -132,7 +139,8 @@ std::optional<arb::mechanism_desc> maybe_method(pybind11::object method) { std::string lif_str(const arb::lif_cell& c){ return util::pprintf( "<arbor.lif_cell: tau_m {}, V_th {}, C_m {}, E_L {}, V_m {}, t_ref {}>", - c.tau_m, c.V_th, c.C_m, c.E_L, c.V_m, c.t_ref); + U::to_string(c.tau_m), U::to_string(c.V_th), U::to_string(c.C_m), + U::to_string(c.E_L), U::to_string(c.V_m), U::to_string(c.t_ref)); } @@ -146,29 +154,77 @@ std::string scaled_density_desc_str(const arb::scaled_mechanism<arb::density>& p mechanism_desc_str(p.t_mech.mech), util::dictionary_csv(p.scale_expr)); } -void register_cells(pybind11::module& m) { - using namespace pybind11::literals; - using std::optional; +// Argument to construct a paintable object. +using Q = U::quantity; +using QnS = std::tuple<U::quantity, std::string>; +using paintable_arg = std::variant<Q, QnS>; - // arb::spike_source_cell +std::tuple<Q, arb::iexpr> value_and_scale(const paintable_arg& arg) { + if (std::holds_alternative<Q>(arg)) { + return {std::get<Q>(arg), 1}; + } + else { + const auto& [val, scale] = std::get<QnS>(arg); + return {val, arborio::parse_iexpr_expression(scale).unwrap()}; + } +} - pybind11::class_<arb::spike_source_cell> spike_source_cell(m, "spike_source_cell", +void register_cells(py::module& m) { + using namespace py::literals; + using std::optional; + + py::class_<arb::spike_source_cell> spike_source_cell(m, "spike_source_cell", "A spike source cell, that generates a user-defined sequence of spikes that act as inputs for other cells in the network."); + py::class_<arb::cell_cv_data> cell_cv_data(m, "cell_cv_data", + "Provides information on the CVs representing the discretization of a cable-cell."); + py::class_<arb::benchmark_cell> benchmark_cell(m, "benchmark_cell", + "A benchmarking cell, used by Arbor developers to test communication performance.\n" + "A benchmark cell generates spikes at a user-defined sequence of time points, and\n" + "the time taken to integrate a cell can be tuned by setting the realtime_ratio,\n" + "for example if realtime_ratio=2, a cell will take 2 seconds of CPU time to\n" + "simulate 1 second.\n"); + py::class_<arb::lif_cell> lif_cell(m, "lif_cell", "A leaky integrate-and-fire cell."); + py::class_<arb::cv_policy> cv_policy(m, "cv_policy", "Describes the rules used to discretize (compartmentalise) a cable cell morphology."); + py::class_<ion_settings> py_ion_data(m, "ion_settings"); + py::class_<arb::cable_cell_global_properties> gprop(m, "cable_global_properties"); + py::class_<arb::decor> decor(m, "decor", + "Description of the decorations to be applied to a cable cell, that is the painted,\n" + "placed and defaulted properties, mecahanisms, ion species etc."); + py::class_<arb::cable_cell> cable_cell(m, "cable_cell", + "Represents morphologically-detailed cell models, with morphology represented as a\n" + "tree of one-dimensional cable segments."); + py::class_<arb::init_membrane_potential> membrane_potential(m, "membrane_potential", "Setting the initial membrane voltage."); + py::class_<arb::ion_reversal_potential_method> revpot_method(m, "reversal_potential_method", "Describes the mechanism used to compute eX for ion X."); + py::class_<arb::membrane_capacitance> membrane_capacitance(m, "membrane_capacitance", "Setting the membrane capacitance."); + py::class_<arb::temperature> temperature_K(m, "temperature", "Setting the temperature."); + py::class_<arb::axial_resistivity> axial_resistivity(m, "axial_resistivity", "Setting the axial resistivity."); + py::class_<arb::init_reversal_potential> reversal_potential(m, "reversal_potential", "Setting the initial reversal potential."); + py::class_<arb::init_int_concentration> int_concentration(m, "int_concentration", "Setting the initial internal ion concentration."); + py::class_<arb::init_ext_concentration> ext_concentration(m, "ext_concentration", "Setting the initial external ion concentration."); + py::class_<arb::ion_diffusivity> ion_diffusivity(m, "ion_diffusivity", "Setting the ion diffusivity."); + py::class_<arb::density> density(m, "density", "For painting a density mechanism on a region."); + py::class_<arb::voltage_process> voltage_process(m, "voltage_process", "For painting a voltage_process mechanism on a region."); + py::class_<arb::scaled_mechanism<arb::density>> scaled_mechanism(m, "scaled_mechanism", "For painting a scaled density mechanism on a region."); + py::class_<arb::cable_cell_ion_data> ion_data(m, "ion_data"); + py::class_<arb::threshold_detector> detector(m, "threshold_detector", "A spike detector, generates a spike when voltage crosses a threshold. Can be used as source endpoint for an arbor.connection."); + py::class_<arb::synapse> synapse(m, "synapse", "For placing a synaptic mechanism on a locset."); + py::class_<arb::junction> junction(m, "junction", "For placing a gap-junction mechanism on a locset."); + py::class_<arb::i_clamp> i_clamp(m, "iclamp", "A current clamp for injecting a DC or fixed frequency current governed by a piecewise linear envelope."); spike_source_cell - .def(pybind11::init<>( + .def(py::init<>( [](arb::cell_tag_type source_label, const regular_schedule_shim& sched){ return arb::spike_source_cell{std::move(source_label), sched.schedule()};}), "source_label"_a, "schedule"_a, "Construct a spike source cell with a single source labeled 'source_label'.\n" "The cell generates spikes on 'source_label' at regular intervals.") - .def(pybind11::init<>( + .def(py::init<>( [](arb::cell_tag_type source_label, const explicit_schedule_shim& sched){ return arb::spike_source_cell{std::move(source_label), sched.schedule()};}), "source_label"_a, "schedule"_a, "Construct a spike source cell with a single source labeled 'source_label'.\n" "The cell generates spikes on 'source_label' at a sequence of user-defined times.") - .def(pybind11::init<>( + .def(py::init<>( [](arb::cell_tag_type source_label, const poisson_schedule_shim& sched){ return arb::spike_source_cell{std::move(source_label), sched.schedule()};}), "source_label"_a, "schedule"_a, @@ -177,29 +233,20 @@ void register_cells(pybind11::module& m) { .def("__repr__", [](const arb::spike_source_cell&){return "<arbor.spike_source_cell>";}) .def("__str__", [](const arb::spike_source_cell&){return "<arbor.spike_source_cell>";}); - // arb::benchmark_cell - - pybind11::class_<arb::benchmark_cell> benchmark_cell(m, "benchmark_cell", - "A benchmarking cell, used by Arbor developers to test communication performance.\n" - "A benchmark cell generates spikes at a user-defined sequence of time points, and\n" - "the time taken to integrate a cell can be tuned by setting the realtime_ratio,\n" - "for example if realtime_ratio=2, a cell will take 2 seconds of CPU time to\n" - "simulate 1 second.\n"); - benchmark_cell - .def(pybind11::init<>( + .def(py::init<>( [](arb::cell_tag_type source_label, arb::cell_tag_type target_label, const regular_schedule_shim& sched, double ratio){ return arb::benchmark_cell{std::move(source_label), std::move(target_label), sched.schedule(), ratio};}), "source_label"_a, "target_label"_a,"schedule"_a, "realtime_ratio"_a=1.0, "Construct a benchmark cell that generates spikes on 'source_label' at regular intervals.\n" "The cell has one source labeled 'source_label', and one target labeled 'target_label'.") - .def(pybind11::init<>( + .def(py::init<>( [](arb::cell_tag_type source_label, arb::cell_tag_type target_label, const explicit_schedule_shim& sched, double ratio){ return arb::benchmark_cell{std::move(source_label), std::move(target_label),sched.schedule(), ratio};}), "source_label"_a, "target_label"_a, "schedule"_a, "realtime_ratio"_a=1.0, "Construct a benchmark cell that generates spikes on 'source_label' at a sequence of user-defined times.\n" "The cell has one source labeled 'source_label', and one target labeled 'target_label'.") - .def(pybind11::init<>( + .def(py::init<>( [](arb::cell_tag_type source_label, arb::cell_tag_type target_label, const poisson_schedule_shim& sched, double ratio){ return arb::benchmark_cell{std::move(source_label), std::move(target_label), sched.schedule(), ratio};}), "source_label"_a, "target_label"_a, "schedule"_a, "realtime_ratio"_a=1.0, @@ -208,17 +255,35 @@ void register_cells(pybind11::module& m) { .def("__repr__", [](const arb::benchmark_cell&){return "<arbor.benchmark_cell>";}) .def("__str__", [](const arb::benchmark_cell&){return "<arbor.benchmark_cell>";}); - // arb::lif_cell - - pybind11::class_<arb::lif_cell> lif_cell(m, "lif_cell", - "A leaky integrate-and-fire cell."); - lif_cell - .def(pybind11::init<>( - [](arb::cell_tag_type source_label, arb::cell_tag_type target_label){ - return arb::lif_cell(std::move(source_label), std::move(target_label));}), + .def(py::init<>( + [](arb::cell_tag_type source_label, + arb::cell_tag_type target_label, + std::optional<U::quantity> tau_m, + std::optional<U::quantity> V_th, + std::optional<U::quantity> C_m, + std::optional<U::quantity> E_L, + std::optional<U::quantity> V_m, + std::optional<U::quantity> t_ref) { + auto cell = arb::lif_cell{std::move(source_label), std::move(target_label)}; + if (tau_m) cell.tau_m = *tau_m; + if (V_th) cell.V_th = *V_th; + if (C_m) cell.C_m = *C_m; + if (E_L) cell.E_L = *E_L; + if (V_m) cell.V_m = *V_m; + if (t_ref) cell.t_ref = *t_ref; + return cell; + }), "source_label"_a, "target_label"_a, - "Construct a lif cell with one source labeled 'source_label', and one target labeled 'target_label'.") + py::kw_only(), "tau_m"_a=py::none(), "V_th"_a=py::none(), "C_m"_a=py::none(), "E_L"_a=py::none(), "V_m"_a=py::none(), "t_ref"_a=py::none(), + "Construct a lif cell with one source labeled 'source_label', and one target labeled 'target_label'." + "Can optionally take physical parameters:\n" + " * tau_m: Membrane potential decaying constant [ms].\n" + " * V_th: Firing threshold [mV].\n" + " * C_m: Membrane capacitance [pF].\n" + " * E_L: Resting potential [mV].\n" + " * V_m: Initial value of the Membrane potential [mV].\n" + " * t_ref: Refractory period [ms].") .def_readwrite("tau_m", &arb::lif_cell::tau_m, "Membrane potential decaying constant [ms].") .def_readwrite("V_th", &arb::lif_cell::V_th, @@ -240,96 +305,14 @@ void register_cells(pybind11::module& m) { .def("__repr__", &lif_str) .def("__str__", &lif_str); - // arb::label_dict - - pybind11::class_<label_dict_proxy> label_dict(m, "label_dict", - "A dictionary of labelled region and locset definitions, with a\n" - "unique label assigned to each definition."); - label_dict - .def(pybind11::init<>(), - "Create an empty label dictionary.") - .def(pybind11::init<const std::unordered_map<std::string, std::string>&>(), - "Initialize a label dictionary from a dictionary with string labels as keys," - " and corresponding definitions as strings.") - .def(pybind11::init<const label_dict_proxy&>(), - "Initialize a label dictionary from another one") - .def(pybind11::init([](pybind11::iterator& it) { - label_dict_proxy ld; - for (; it != pybind11::iterator::sentinel(); ++it) { - const auto tuple = it->cast<pybind11::sequence>(); - const auto key = tuple[0].cast<std::string>(); - const auto value = tuple[1].cast<std::string>(); - ld.set(key, value); - } - return ld; - }), - "Initialize a label dictionary from an iterable of key, definition pairs") - .def("add_swc_tags", - [](label_dict_proxy& l) { return l.add_swc_tags(); }, - "Add standard SWC tagged regions.\n" - " - soma: (tag 1)\n" - " - axon: (tag 2)\n" - " - dend: (tag 3)\n" - " - apic: (tag 4)") - .def("__setitem__", - [](label_dict_proxy& l, const char* name, const char* desc) { - l.set(name, desc);}) - .def("__getitem__", - [](label_dict_proxy& l, const char* name) { - if (auto v = l.getitem(name)) return v.value(); - throw pybind11::key_error(name); - }) - .def("__len__", &label_dict_proxy::size) - .def("__iter__", - [](const label_dict_proxy &ld) { - return pybind11::make_key_iterator(ld.cache.begin(), ld.cache.end());}, - pybind11::keep_alive<0, 1>()) - .def("__contains__", - [](const label_dict_proxy &ld, const char* name) { - return ld.contains(name);}) - .def("keys", - [](const label_dict_proxy &ld) { - return pybind11::make_key_iterator(ld.cache.begin(), ld.cache.end());}, - pybind11::keep_alive<0, 1>()) - .def("items", - [](const label_dict_proxy &ld) { - return pybind11::make_iterator(ld.cache.begin(), ld.cache.end());}, - pybind11::keep_alive<0, 1>()) - .def("values", - [](const label_dict_proxy &ld) { - return pybind11::make_value_iterator(ld.cache.begin(), ld.cache.end()); - }, - pybind11::keep_alive<0, 1>()) - .def("append", [](label_dict_proxy& l, const label_dict_proxy& other, const char* prefix) { - l.import(other, prefix); - }, - "other"_a, "The label_dict to be imported" - "prefix"_a="", "optional prefix appended to the region and locset labels", - "Import the entries of a another label dictionary with an optional prefix.") - .def("update", [](label_dict_proxy& l, const label_dict_proxy& other) { - l.import(other); - }, - "other"_a, "The label_dict to be imported" - "Import the entries of a another label dictionary.") - .def_readonly("regions", &label_dict_proxy::regions, - "The region definitions.") - .def_readonly("locsets", &label_dict_proxy::locsets, - "The locset definitions.") - .def("__repr__", [](const label_dict_proxy& d){return d.to_string();}) - .def("__str__", [](const label_dict_proxy& d){return d.to_string();}); - - // arb::cv_policy wrappers - - pybind11::class_<arb::cv_policy> cv_policy(m, "cv_policy", - "Describes the rules used to discretize (compartmentalise) a cable cell morphology."); cv_policy - .def(pybind11::init([](const std::string& expression) { return arborio::parse_cv_policy_expression(expression).unwrap(); }), + .def(py::init([](const std::string& expression) { return arborio::parse_cv_policy_expression(expression).unwrap(); }), "expression"_a, "A valid CV policy expression") .def_property_readonly("domain", [](const arb::cv_policy& p) {return util::pprintf("{}", p.domain());}, "The domain on which the policy is applied.") - .def(pybind11::self + pybind11::self) - .def(pybind11::self | pybind11::self) + .def(py::self + py::self) + .def(py::self | py::self) .def("__repr__", [](const arb::cv_policy& p) { std::stringstream ss; ss << p; @@ -370,27 +353,25 @@ void register_cells(pybind11::module& m) { "Policy to use the same number of CVs for each branch."); // arb::cell_cv_data - pybind11::class_<arb::cell_cv_data> cell_cv_data(m, "cell_cv_data", - "Provides information on the CVs representing the discretization of a cable-cell."); cell_cv_data .def_property_readonly("num_cv", [](const arb::cell_cv_data& data){return data.size();}, "Return the number of CVs in the cell.") .def("cables", [](const arb::cell_cv_data& d, unsigned index) { - if (index >= d.size()) throw pybind11::index_error("index out of range"); + if (index >= d.size()) throw py::index_error("index out of range"); return d.cables(index); }, "index"_a, "Return a list of cables representing the CV at the given index.") .def("children", [](const arb::cell_cv_data& d, unsigned index) { - if (index >= d.size()) throw pybind11::index_error("index out of range"); + if (index >= d.size()) throw py::index_error("index out of range"); return d.children(index); }, "index"_a, "Return a list of indices of the CVs representing the children of the CV at the given index.") .def("parent", [](const arb::cell_cv_data& d, unsigned index) { - if (index >= d.size()) throw pybind11::index_error("index out of range"); + if (index >= d.size()) throw py::index_error("index out of range"); return d.parent(index); }, "index"_a, @@ -414,9 +395,9 @@ void register_cells(pybind11::module& m) { "Only 'area' and 'length' are supported)", integrate_along)); auto object_vec = arb::intersect_region(arborio::parse_region_expression(reg).unwrap(), cvs, integrate_area); - auto tuple_vec = std::vector<pybind11::tuple>(object_vec.size()); + auto tuple_vec = std::vector<py::tuple>(object_vec.size()); std::transform(object_vec.begin(), object_vec.end(), tuple_vec.begin(), - [](const auto& t) { return pybind11::make_tuple(t.idx, t.proportion); }); + [](const auto& t) { return py::make_tuple(t.idx, t.proportion); }); return tuple_vec; }, "reg"_a, "A region on a cell", @@ -427,79 +408,74 @@ void register_cells(pybind11::module& m) { "`proportion` is the proportion of the CV (itegrated by area or length) included in the region." ); - pybind11::class_<arb::init_membrane_potential> membrane_potential(m, "membrane_potential", "Setting the initial membrane voltage."); membrane_potential - .def(pybind11::init([](double v) -> arb::init_membrane_potential { return {v}; })) - .def("__repr__", [](const arb::init_membrane_potential& d){ - return "Vm=" + to_string(d.value);}); + .def(py::init([](const U::quantity& v) -> arb::init_membrane_potential { return {v }; })) + .def("__repr__", + [](const arb::init_membrane_potential& d){ + return "Vm=" + to_string(d.value) + " scale=" + to_string(d.scale);}); + + revpot_method + .def(py::init([](const std::string& ion, + const arb::mechanism_desc& d) -> arb::ion_reversal_potential_method { + return {ion, d}; + })) + .def("__repr__", [](const arb::ion_reversal_potential_method& d) { + return "ion" + d.ion + " method=" + d.method.name();}); - pybind11::class_<arb::membrane_capacitance> membrane_capacitance(m, "membrane_capacitance", "Setting the membrane capacitance."); membrane_capacitance - .def(pybind11::init([](double v) -> arb::membrane_capacitance { return {v}; })) + .def(py::init([](const U::quantity& v) -> arb::membrane_capacitance { return {v}; })) .def("__repr__", [](const arb::membrane_capacitance& d){return "Cm=" + to_string(d.value);}); - pybind11::class_<arb::temperature_K> temperature_K(m, "temperature_K", "Setting the temperature."); temperature_K - .def(pybind11::init([](double v) -> arb::temperature_K { return {v}; })) - .def("__repr__", [](const arb::temperature_K& d){return "T=" + to_string(d.value);}); + .def(py::init([](const U::quantity& v) -> arb::temperature { return {v}; })) + .def("__repr__", [](const arb::temperature& d){return "T=" + to_string(d.value);}); - pybind11::class_<arb::axial_resistivity> axial_resistivity(m, "axial_resistivity", "Setting the axial resistivity."); axial_resistivity - .def(pybind11::init([](double v) -> arb::axial_resistivity { return {v}; })) + .def(py::init([](const U::quantity& v) -> arb::axial_resistivity { return {v}; })) .def("__repr__", [](const arb::axial_resistivity& d){return "Ra" + to_string(d.value);}); - pybind11::class_<arb::init_reversal_potential> reversal_potential(m, "reversal_potential", "Setting the initial reversal potential."); reversal_potential - .def(pybind11::init([](const std::string& i, double v) -> arb::init_reversal_potential { return {i, v}; })) + .def(py::init([](const std::string& i, const U::quantity& v) -> arb::init_reversal_potential { return {i, v}; })) .def("__repr__", [](const arb::init_reversal_potential& d){return "e" + d.ion + "=" + to_string(d.value);}); - pybind11::class_<arb::init_int_concentration> int_concentration(m, "int_concentration", "Setting the initial internal ion concentration."); int_concentration - .def(pybind11::init([](const std::string& i, double v) -> arb::init_int_concentration { return {i, v}; })) + .def(py::init([](const std::string& i, const U::quantity& v) -> arb::init_int_concentration { return {i, v}; })) .def("__repr__", [](const arb::init_int_concentration& d){return d.ion + "i" + "=" + to_string(d.value);}); - pybind11::class_<arb::init_ext_concentration> ext_concentration(m, "ext_concentration", "Setting the initial external ion concentration."); ext_concentration - .def(pybind11::init([](const std::string& i, double v) -> arb::init_ext_concentration { return {i, v}; })) + .def(py::init([](const std::string& i, const U::quantity& v) -> arb::init_ext_concentration { return {i, v}; })) .def("__repr__", [](const arb::init_ext_concentration& d){return d.ion + "o" + "=" + to_string(d.value);}); - pybind11::class_<arb::ion_diffusivity> ion_diffusivity(m, "ion_diffusivity", "Setting the ion diffusivity."); ion_diffusivity - .def(pybind11::init([](const std::string& i, double v) -> arb::ion_diffusivity { return {i, v}; })) + .def(py::init([](const std::string& i, const U::quantity& v) -> arb::ion_diffusivity { return {i, v}; })) .def("__repr__", [](const arb::ion_diffusivity& d){return "D" + d.ion + "=" + to_string(d.value);}); - pybind11::class_<arb::density> density(m, "density", "For painting a density mechanism on a region."); density - .def(pybind11::init([](const std::string& name) {return arb::density(name);})) - .def(pybind11::init([](arb::mechanism_desc mech) {return arb::density(mech);})) - .def(pybind11::init([](const std::string& name, const std::unordered_map<std::string, double>& params) {return arb::density(name, params);})) - .def(pybind11::init([](arb::mechanism_desc mech, const std::unordered_map<std::string, double>& params) {return arb::density(mech, params);})) - .def(pybind11::init([](const std::string& name, pybind11::kwargs parms) {return arb::density(name, util::dict_to_map<double>(parms));})) - .def(pybind11::init([](arb::mechanism_desc mech, pybind11::kwargs params) {return arb::density(mech, util::dict_to_map<double>(params));})) + .def(py::init([](const std::string& name) {return arb::density(name);})) + .def(py::init([](arb::mechanism_desc mech) {return arb::density(mech);})) + .def(py::init([](const std::string& name, const std::unordered_map<std::string, double>& params) {return arb::density(name, params);})) + .def(py::init([](arb::mechanism_desc mech, const std::unordered_map<std::string, double>& params) {return arb::density(mech, params);})) + .def(py::init([](const std::string& name, py::kwargs parms) {return arb::density(name, util::dict_to_map<double>(parms));})) + .def(py::init([](arb::mechanism_desc mech, py::kwargs params) {return arb::density(mech, util::dict_to_map<double>(params));})) .def_readonly("mech", &arb::density::mech, "The underlying mechanism.") .def("__repr__", [](const arb::density& d){return "<arbor.density " + mechanism_desc_str(d.mech) + ">";}) .def("__str__", [](const arb::density& d){return "<arbor.density " + mechanism_desc_str(d.mech) + ">";}); - pybind11::class_<arb::voltage_process> voltage_process(m, "voltage_process", "For painting a voltage_process mechanism on a region."); voltage_process - .def(pybind11::init([](const std::string& name) {return arb::voltage_process(name);})) - .def(pybind11::init([](arb::mechanism_desc mech) {return arb::voltage_process(mech);})) - .def(pybind11::init([](const std::string& name, const std::unordered_map<std::string, double>& params) {return arb::voltage_process(name, params);})) - .def(pybind11::init([](arb::mechanism_desc mech, const std::unordered_map<std::string, double>& params) {return arb::voltage_process(mech, params);})) - .def(pybind11::init([](arb::mechanism_desc mech, pybind11::kwargs params) {return arb::voltage_process(mech, util::dict_to_map<double>(params));})) - .def(pybind11::init([](const std::string& name, pybind11::kwargs parms) {return arb::voltage_process(name, util::dict_to_map<double>(parms));})) + .def(py::init([](const std::string& name) {return arb::voltage_process(name);})) + .def(py::init([](arb::mechanism_desc mech) {return arb::voltage_process(mech);})) + .def(py::init([](const std::string& name, const std::unordered_map<std::string, double>& params) {return arb::voltage_process(name, params);})) + .def(py::init([](arb::mechanism_desc mech, const std::unordered_map<std::string, double>& params) {return arb::voltage_process(mech, params);})) + .def(py::init([](arb::mechanism_desc mech, py::kwargs params) {return arb::voltage_process(mech, util::dict_to_map<double>(params));})) + .def(py::init([](const std::string& name, py::kwargs parms) {return arb::voltage_process(name, util::dict_to_map<double>(parms));})) .def_readonly("mech", &arb::voltage_process::mech, "The underlying mechanism.") .def("__repr__", [](const arb::voltage_process& d){return "<arbor.voltage_process " + mechanism_desc_str(d.mech) + ">";}) .def("__str__", [](const arb::voltage_process& d){return "<arbor.voltage_process " + mechanism_desc_str(d.mech) + ">";}); - // arb::scaled_mechanism<arb::density> - - pybind11::class_<arb::scaled_mechanism<arb::density>> scaled_mechanism( - m, "scaled_mechanism", "For painting a scaled density mechanism on a region."); scaled_mechanism - .def(pybind11::init( + .def(py::init( [](arb::density dens) { return arb::scaled_mechanism<arb::density>(std::move(dens)); })) - .def(pybind11::init( + .def(py::init( [](arb::density dens, const std::unordered_map<std::string, std::string>& scales) { auto s = arb::scaled_mechanism<arb::density>(std::move(dens)); for (const auto& [k, v]: scales) { @@ -507,8 +483,8 @@ void register_cells(pybind11::module& m) { } return s; })) - .def(pybind11::init( - [](arb::density dens, pybind11::kwargs scales) { + .def(py::init( + [](arb::density dens, py::kwargs scales) { auto s = arb::scaled_mechanism<arb::density>(std::move(dens)); for (const auto& [k, v]: util::dict_to_map<std::string>(scales)) { s.scale(k, arborio::parse_iexpr_expression(v).unwrap()); @@ -521,8 +497,8 @@ void register_cells(pybind11::module& m) { s.scale(std::move(name), arborio::parse_iexpr_expression(ex).unwrap()); return s; }, - pybind11::arg("name"), - pybind11::arg("ex"), + py::arg("name"), + py::arg("ex"), "Add a scaling expression to a parameter.") .def("__repr__", [](const arb::scaled_mechanism<arb::density>& d) { @@ -532,60 +508,60 @@ void register_cells(pybind11::module& m) { return "<arbor.scaled_mechanism<density> " + scaled_density_desc_str(d) + ">"; }); - // arb::synapse - - pybind11::class_<arb::synapse> synapse(m, "synapse", "For placing a synaptic mechanism on a locset."); synapse - .def(pybind11::init([](const std::string& name) {return arb::synapse(name);})) - .def(pybind11::init([](arb::mechanism_desc mech) {return arb::synapse(mech);})) - .def(pybind11::init([](const std::string& name, const std::unordered_map<std::string, double>& params) {return arb::synapse(name, params);})) - .def(pybind11::init([](arb::mechanism_desc mech, const std::unordered_map<std::string, double>& params) {return arb::synapse(mech, params);})) - .def(pybind11::init([](const std::string& name, pybind11::kwargs parms) {return arb::synapse(name, util::dict_to_map<double>(parms));})) - .def(pybind11::init([](arb::mechanism_desc mech, pybind11::kwargs params) {return arb::synapse(mech, util::dict_to_map<double>(params));})) + .def(py::init([](const std::string& name) {return arb::synapse(name);})) + .def(py::init([](arb::mechanism_desc mech) {return arb::synapse(mech);})) + .def(py::init([](const std::string& name, const std::unordered_map<std::string, double>& params) {return arb::synapse(name, params);})) + .def(py::init([](arb::mechanism_desc mech, const std::unordered_map<std::string, double>& params) {return arb::synapse(mech, params);})) + .def(py::init([](const std::string& name, py::kwargs parms) {return arb::synapse(name, util::dict_to_map<double>(parms));})) + .def(py::init([](arb::mechanism_desc mech, py::kwargs params) {return arb::synapse(mech, util::dict_to_map<double>(params));})) .def_readonly("mech", &arb::synapse::mech, "The underlying mechanism.") .def("__repr__", [](const arb::synapse& s){return "<arbor.synapse " + mechanism_desc_str(s.mech) + ">";}) .def("__str__", [](const arb::synapse& s){return "<arbor.synapse " + mechanism_desc_str(s.mech) + ">";}); - // arb::junction - - pybind11::class_<arb::junction> junction(m, "junction", "For placing a gap-junction mechanism on a locset."); junction - .def(pybind11::init([](const std::string& name) {return arb::junction(name);})) - .def(pybind11::init([](arb::mechanism_desc mech) {return arb::junction(mech);})) - .def(pybind11::init([](const std::string& name, const std::unordered_map<std::string, double>& params) {return arb::junction(name, params);})) - .def(pybind11::init([](const std::string& name, pybind11::kwargs parms) {return arb::junction(name, util::dict_to_map<double>(parms));})) - .def(pybind11::init([](arb::mechanism_desc mech, const std::unordered_map<std::string, double>& params) {return arb::junction(mech, params);})) - .def(pybind11::init([](arb::mechanism_desc mech, pybind11::kwargs params) {return arb::junction(mech, util::dict_to_map<double>(params));})) + .def(py::init([](const std::string& name) {return arb::junction(name);})) + .def(py::init([](arb::mechanism_desc mech) {return arb::junction(mech);})) + .def(py::init([](const std::string& name, const std::unordered_map<std::string, double>& params) {return arb::junction(name, params);})) + .def(py::init([](const std::string& name, py::kwargs parms) {return arb::junction(name, util::dict_to_map<double>(parms));})) + .def(py::init([](arb::mechanism_desc mech, const std::unordered_map<std::string, double>& params) {return arb::junction(mech, params);})) + .def(py::init([](arb::mechanism_desc mech, py::kwargs params) {return arb::junction(mech, util::dict_to_map<double>(params));})) .def_readonly("mech", &arb::junction::mech, "The underlying mechanism.") .def("__repr__", [](const arb::junction& j){return "<arbor.junction " + mechanism_desc_str(j.mech) + ">";}) .def("__str__", [](const arb::junction& j){return "<arbor.junction " + mechanism_desc_str(j.mech) + ">";}); - // arb::i_clamp - - pybind11::class_<arb::i_clamp> i_clamp(m, "iclamp", - "A current clamp for injecting a DC or fixed frequency current governed by a piecewise linear envelope."); i_clamp - .def(pybind11::init( - [](double ts, double dur, double cur, double frequency, double phase) { + .def(py::init( + [](const U::quantity& ts, + const U::quantity& dur, + const U::quantity& cur, + const U::quantity& frequency, + const U::quantity& phase) { return arb::i_clamp::box(ts, dur, cur, frequency, phase); - }), "tstart"_a, "duration"_a, "current"_a, pybind11::kw_only(), "frequency"_a=0, "phase"_a=0, - "Construct finite duration current clamp, constant amplitude") - .def(pybind11::init( - [](double cur, double frequency, double phase) { + }), + "tstart"_a, "duration"_a, "current"_a, + py::kw_only(), py::arg_v("frequency", 0*U::kHz, "0.0*arbor.units.kHz"), py::arg_v("phase", 0*U::rad, "0.0*arbor.units.rad"), + "Construct finite duration current clamp, constant amplitude") + .def(py::init( + [](const U::quantity& cur, + const U::quantity& frequency, + const U::quantity& phase) { return arb::i_clamp{cur, frequency, phase}; - }), "current"_a, pybind11::kw_only(), "frequency"_a=0, "phase"_a=0, - "Construct constant amplitude current clamp") - .def(pybind11::init( - [](std::vector<std::pair<double, double>> envl, double frequency, double phase) { - arb::i_clamp clamp; - for (const auto& p: envl) { - clamp.envelope.push_back({p.first, p.second}); - } - clamp.frequency = frequency; - clamp.phase = phase; - return clamp; - }), "envelope"_a, pybind11::kw_only(), "frequency"_a=0, "phase"_a=0, - "Construct current clamp according to (time, amplitude) linear envelope") + }), + "current"_a, + py::kw_only(), py::arg_v("frequency", 0*U::kHz, "0.0*arbor.units.kHz"), py::arg_v("phase", 0*U::rad, "0.0*arbor.units.rad"), + "Construct constant amplitude current clamp") + .def(py::init( + [](std::vector<std::pair<const U::quantity&, const U::quantity&>> envl, + const U::quantity& frequency, + const U::quantity& phase) { + std::vector<arb::i_clamp::envelope_point> env; + for (const auto& [t, a]: envl) env.push_back({t, a}); + return arb::i_clamp{env, frequency, phase}; + }), + "envelope"_a, + py::kw_only(), py::arg_v("frequency", 0*U::kHz, "0.0*arbor.units.kHz"), py::arg_v("phase", 0*U::rad, "0.0*arbor.units.rad"), + "Construct current clamp according to (time, amplitude) linear envelope") .def_property_readonly("envelope", [](const arb::i_clamp& obj) { std::vector<std::pair<double, double>> envl; @@ -598,16 +574,13 @@ void register_cells(pybind11::module& m) { .def_readonly("frequency", &arb::i_clamp::frequency, "Oscillation frequency (kHz), zero implies DC stimulus.") .def_readonly("phase", &arb::i_clamp::phase, "Oscillation initial phase (rad)") .def("__repr__", [](const arb::i_clamp& c) { - return util::pprintf("<arbor.iclamp: frequency {} Hz>", c.frequency);}) + return util::pprintf("<arbor.iclamp: frequency {} kHz>", c.frequency);}) .def("__str__", [](const arb::i_clamp& c) { - return util::pprintf("<arbor.iclamp: frequency {} Hz>", c.frequency);}); + return util::pprintf("<arbor.iclamp: frequency {} kHz>", c.frequency);}); - // arb::threshold_detector - pybind11::class_<arb::threshold_detector> detector(m, "threshold_detector", - "A spike detector, generates a spike when voltage crosses a threshold. Can be used as source endpoint for an arbor.connection."); detector - .def(pybind11::init( - [](double thresh) { return arb::threshold_detector{thresh}; }), + .def(py::init( + [](const U::quantity& thresh) { return arb::threshold_detector{thresh}; }), "threshold"_a, "Voltage threshold of spike detector [mV]") .def_readonly("threshold", &arb::threshold_detector::threshold, "Voltage threshold of spike detector [mV]") .def("__repr__", [](const arb::threshold_detector& d){ @@ -615,24 +588,12 @@ void register_cells(pybind11::module& m) { .def("__str__", [](const arb::threshold_detector& d){ return util::pprintf("(threshold_detector {})", d.threshold);}); - // arb::cable_cell_global_properties - pybind11::class_<arb::cable_cell_ion_data> ion_data(m, "ion_data"); ion_data .def_readonly("internal_concentration", &arb::cable_cell_ion_data::init_int_concentration, "Internal concentration.") .def_readonly("external_concentration", &arb::cable_cell_ion_data::init_ext_concentration, "External concentration.") .def_readonly("diffusivity", &arb::cable_cell_ion_data::diffusivity, "Diffusivity.") .def_readonly("reversal_concentration", &arb::cable_cell_ion_data::init_reversal_potential, "Reversal potential."); - struct ion_settings { - int charge = 0; - std::optional<double> internal_concentration; - std::optional<double> external_concentration; - std::optional<double> diffusivity; - std::optional<double> reversal_potential; - std::string reversal_potential_method = "const"; - }; - - pybind11::class_<ion_settings> py_ion_data(m, "ion_settings"); ion_data .def_property_readonly("charge", [](const ion_settings& s) { return s.charge; }, "Valence.") .def_property_readonly("internal_concentration", [](const ion_settings& s) { return s.internal_concentration; }, "Internal concentration.") @@ -641,46 +602,42 @@ void register_cells(pybind11::module& m) { .def_property_readonly("reversal_potential", [](const ion_settings& s) { return s.reversal_potential; }, "Reversal potential.") .def_property_readonly("reversal_potential_method", [](const ion_settings& s) { return s.reversal_potential_method; }, "Reversal potential method."); - pybind11::class_<arb::cable_cell_global_properties> gprop(m, "cable_global_properties"); gprop - .def(pybind11::init<>()) - .def(pybind11::init<const arb::cable_cell_global_properties&>()) + .def(py::init<>()) + .def(py::init<const arb::cable_cell_global_properties&>()) .def("check", [](const arb::cable_cell_global_properties& props) { arb::check_global_properties(props);}, "Test whether all default parameters and ion species properties have been set.") .def_readwrite("coalesce_synapses", &arb::cable_cell_global_properties::coalesce_synapses, "Flag for enabling/disabling linear syanpse coalescing.") - // set cable properties - .def_property("membrane_potential", - [](const arb::cable_cell_global_properties& props) { return props.default_parameters.init_membrane_potential; }, - [](arb::cable_cell_global_properties& props, double u) { props.default_parameters.init_membrane_potential = u; }) .def_property("membrane_voltage_limit", [](const arb::cable_cell_global_properties& props) { return props.membrane_voltage_limit_mV; }, [](arb::cable_cell_global_properties& props, std::optional<double> u) { props.membrane_voltage_limit_mV = u; }) - .def_property("membrane_capacitance", - [](const arb::cable_cell_global_properties& props) { return props.default_parameters.membrane_capacitance; }, - [](arb::cable_cell_global_properties& props, double u) { props.default_parameters.membrane_capacitance = u; }) - .def_property("temperature", - [](const arb::cable_cell_global_properties& props) { return props.default_parameters.temperature_K; }, - [](arb::cable_cell_global_properties& props, double u) { props.default_parameters.temperature_K = u; }) - .def_property("axial_resistivity", - [](const arb::cable_cell_global_properties& props) { return props.default_parameters.axial_resistivity; }, - [](arb::cable_cell_global_properties& props, double u) { props.default_parameters.axial_resistivity = u; }) + // set cable properties + .def_property_readonly("membrane_potential", + [](const arb::cable_cell_global_properties& props) { return props.default_parameters.init_membrane_potential; }) + .def_property_readonly("membrane_capacitance", + [](const arb::cable_cell_global_properties& props) { return props.default_parameters.membrane_capacitance; }) + .def_property_readonly("temperature", + [](const arb::cable_cell_global_properties& props) { return props.default_parameters.temperature_K; }) + .def_property_readonly("axial_resistivity", + [](const arb::cable_cell_global_properties& props) { return props.default_parameters.axial_resistivity; }) .def("set_property", [](arb::cable_cell_global_properties& props, - optional<double> Vm, optional<double> cm, - optional<double> rL, optional<double> tempK) - { - if (Vm) props.default_parameters.init_membrane_potential = Vm; - if (cm) props.default_parameters.membrane_capacitance=cm; - if (rL) props.default_parameters.axial_resistivity=rL; - if (tempK) props.default_parameters.temperature_K=tempK; + optional<U::quantity> Vm, optional<U::quantity> cm, + optional<U::quantity> rL, optional<U::quantity> tempK) { + if (Vm) props.default_parameters.init_membrane_potential=Vm.value().value_as(U::mV); + if (cm) props.default_parameters.membrane_capacitance=cm.value().value_as(U::F/U::m2); + if (rL) props.default_parameters.axial_resistivity=rL.value().value_as(U::Ohm*U::cm); + if (tempK) props.default_parameters.temperature_K=tempK.value().value_as(U::Kelvin); }, - pybind11::arg_v("Vm", pybind11::none(), "initial membrane voltage [mV]."), - pybind11::arg_v("cm", pybind11::none(), "membrane capacitance [F/m²]."), - pybind11::arg_v("rL", pybind11::none(), "axial resistivity [Ω·cm]."), - pybind11::arg_v("tempK", pybind11::none(), "temperature [Kelvin]."), - "Set global default values for cable and cell properties.") + "Vm"_a=py::none(), "cm"_a=py::none(), "rL"_a=py::none(), "tempK"_a=py::none(), + "Set global default values for cable and cell properties.\n" + " * Vm: initial membrane voltage [mV].\n" + " * cm: membrane capacitance [F/m²].\n" + " * rL: axial resistivity [Ω·cm].\n" + " * tempK: temperature [Kelvin].\n" + "These values can be overridden on specific regions using the paint interface.") // add/modify ion species .def("unset_ion", [](arb::cable_cell_global_properties& props, const char* ion) { @@ -690,41 +647,40 @@ void register_cells(pybind11::module& m) { }, "Remove ion species from properties.") .def("set_ion", - [](arb::cable_cell_global_properties& props, const char* ion, - optional<double> valence, optional<double> int_con, - optional<double> ext_con, optional<double> rev_pot, - pybind11::object method, optional<double> diff) - { - if (!props.ion_species.count(ion) && !valence) { - throw std::runtime_error(util::pprintf("New ion species: '{}', missing valence", ion)); - } - if (valence) props.ion_species[ion] = *valence; - - auto& data = props.default_parameters.ion_data[ion]; - if (int_con) data.init_int_concentration = *int_con; - if (ext_con) data.init_ext_concentration = *ext_con; - if (rev_pot) data.init_reversal_potential = *rev_pot; - if (diff) data.diffusivity = *diff; - - if (auto m = maybe_method(method)) { - props.default_parameters.reversal_potential_method[ion] = *m; - } - }, - pybind11::arg("ion"), - pybind11::arg_v("valence", pybind11::none(), "valence of the ion species."), - pybind11::arg_v("int_con", pybind11::none(), "initial internal concentration [mM]."), - pybind11::arg_v("ext_con", pybind11::none(), "initial external concentration [mM]."), - pybind11::arg_v("rev_pot", pybind11::none(), "reversal potential [mV]."), - pybind11::arg_v("method", pybind11::none(), "method for calculating reversal potential."), - pybind11::arg_v("diff", pybind11::none(), "diffusivity [m^2/s]."), - "Set the global default properties of ion species named 'ion'.\n" - "There are 3 ion species predefined in arbor: 'ca', 'na' and 'k'.\n" - "If 'ion' in not one of these ions it will be added to the list, making it\n" - "available to mechanisms. The user has to provide the valence of a previously\n" - "undefined ion the first time this function is called with it as an argument.\n" - "Species concentrations and reversal potential can be overridden on\n" - "specific regions using the paint interface, while the method for calculating\n" - "reversal potential is global for all compartments in the cell, and can't be\n" + [](arb::cable_cell_global_properties& props, const char* ion, + optional<int> valence, optional<U::quantity> int_con, + optional<U::quantity> ext_con, optional<U::quantity> rev_pot, + py::object method, optional<U::quantity> diff) { + if (!props.ion_species.count(ion) && !valence) { + throw std::runtime_error(util::pprintf("New ion species: '{}', missing valence", ion)); + } + if (valence) props.ion_species[ion] = *valence; + + auto& data = props.default_parameters.ion_data[ion]; + if (int_con) data.init_int_concentration = int_con.value().value_as(U::mM); + if (ext_con) data.init_ext_concentration = ext_con.value().value_as(U::mM); + if (rev_pot) data.init_reversal_potential = rev_pot.value().value_as(U::mV); + if (diff) data.diffusivity = diff.value().value_as(U::m2/U::s); + + if (auto m = maybe_method(method)) { + props.default_parameters.reversal_potential_method[ion] = *m; + } + }, + "ion"_a, "valence"_a=py::none(), "int_con"_a=py::none(), "ext_con"_a=py::none(), "rev_pot"_a=py::none(), "method"_a =py::none(), "diff"_a=py::none(), + "Set the global default properties of ion species named 'ion'.\n" + " * valence: valence of the ion species [e].\n" + " * int_con: initial internal concentration [mM].\n" + " * ext_con: initial external concentration [mM].\n" + " * rev_pot: reversal potential [mV].\n" + " * method: mechanism for calculating reversal potential.\n" + " * diff: diffusivity [m^2/s].\n" + "There are 3 ion species predefined in arbor: 'ca', 'na' and 'k'.\n" + "If 'ion' in not one of these ions it will be added to the list, making it\n" + "available to mechanisms. The user has to provide the valence of a previously\n" + "undefined ion the first time this function is called with it as an argument.\n" + "Species concentrations and reversal potential can be overridden on\n" + "specific regions using the paint interface, while the method for calculating\n" + "reversal potential is global for all compartments in the cell, and can't be\n" "overriden locally.") .def_property_readonly("ion_data", [](const arb::cable_cell_global_properties& props) { return props.default_parameters.ion_data; }) @@ -766,56 +722,55 @@ void register_cells(pybind11::module& m) { }, "default NEURON cable_global_properties"); - // arb::decor - - pybind11::class_<arb::decor> decor(m, "decor", - "Description of the decorations to be applied to a cable cell, that is the painted,\n" - "placed and defaulted properties, mecahanisms, ion species etc."); decor - .def(pybind11::init<>()) - .def(pybind11::init<const arb::decor&>()) + .def(py::init<>()) + .def(py::init<const arb::decor&>()) // Set cell-wide default values for properties .def("set_property", - [](arb::decor& d, - optional<double> Vm, optional<double> cm, - optional<double> rL, optional<double> tempK) - { - if (Vm) d.set_default(arb::init_membrane_potential{*Vm}); - if (cm) d.set_default(arb::membrane_capacitance{*cm}); - if (rL) d.set_default(arb::axial_resistivity{*rL}); - if (tempK) d.set_default(arb::temperature_K{*tempK}); - return d; - }, - pybind11::arg_v("Vm", pybind11::none(), "initial membrane voltage [mV]."), - pybind11::arg_v("cm", pybind11::none(), "membrane capacitance [F/m²]."), - pybind11::arg_v("rL", pybind11::none(), "axial resistivity [Ω·cm]."), - pybind11::arg_v("tempK", pybind11::none(), "temperature [Kelvin]."), - "Set default values for cable and cell properties. These values can be overridden on specific regions using the paint interface.") + [](arb::decor& d, + optional<U::quantity> Vm, optional<U::quantity> cm, + optional<U::quantity> rL, optional<U::quantity> tempK) { + if (Vm) d.set_default(arb::init_membrane_potential{*Vm}); + if (cm) d.set_default(arb::membrane_capacitance{*cm}); + if (rL) d.set_default(arb::axial_resistivity{*rL}); + if (tempK) d.set_default(arb::temperature{*tempK}); + return d; + }, + "Vm"_a=py::none(), "cm"_a=py::none(), "rL"_a=py::none(), "tempK"_a=py::none(), + "Set default values for cable and cell properties:\n" + " * Vm: initial membrane voltage [mV].\n" + " * cm: membrane capacitance [F/m²].\n" + " * rL: axial resistivity [Ω·cm].\n" + " * tempK: temperature [Kelvin].\n" + "These values can be overridden on specific regions using the paint interface.") // modify parameters for an ion species. .def("set_ion", - [](arb::decor& d, const char* ion, - optional<double> int_con, optional<double> ext_con, - optional<double> rev_pot, pybind11::object method, - optional<double> diff) - { - if (int_con) d.set_default(arb::init_int_concentration{ion, *int_con}); - if (ext_con) d.set_default(arb::init_ext_concentration{ion, *ext_con}); - if (rev_pot) d.set_default(arb::init_reversal_potential{ion, *rev_pot}); - if (diff) d.set_default(arb::ion_diffusivity{ion, *diff}); - if (auto m = maybe_method(method)) d.set_default(arb::ion_reversal_potential_method{ion, *m}); - return d; - }, - pybind11::arg("ion"), - pybind11::arg_v("int_con", pybind11::none(), "initial internal concentration [mM]."), - pybind11::arg_v("ext_con", pybind11::none(), "initial external concentration [mM]."), - pybind11::arg_v("rev_pot", pybind11::none(), "reversal potential [mV]."), - pybind11::arg_v("method", pybind11::none(), "method for calculating reversal potential."), - pybind11::arg_v("diff", pybind11::none(), "diffusivity [m^2/s]."), - "Set the properties of ion species named 'ion' that will be applied\n" - "by default everywhere on the cell. Species concentrations and reversal\n" - "potential can be overridden on specific regions using the paint interface, \n" - "while the method for calculating reversal potential is global for all\n" - "compartments in the cell, and can't be overriden locally.") + [](arb::decor& d, const char* ion, + optional<U::quantity> int_con, optional<U::quantity> ext_con, + optional<U::quantity> rev_pot, py::object method, + optional<U::quantity> diff) { + if (int_con) d.set_default(arb::init_int_concentration{ion, *int_con}); + if (ext_con) d.set_default(arb::init_ext_concentration{ion, *ext_con}); + if (rev_pot) d.set_default(arb::init_reversal_potential{ion, *rev_pot}); + if (diff) d.set_default(arb::ion_diffusivity{ion, *diff}); + if (auto m = maybe_method(method)) d.set_default(arb::ion_reversal_potential_method{ion, *m}); + return d; + }, + "ion"_a, "int_con"_a=py::none(), "ext_con"_a=py::none(), "rev_pot"_a=py::none(), "method"_a =py::none(), "diff"_a=py::none(), + "Set the cell-level properties of ion species named 'ion'.\n" + " * int_con: initial internal concentration [mM].\n" + " * ext_con: initial external concentration [mM].\n" + " * rev_pot: reversal potential [mV].\n" + " * method: mechanism for calculating reversal potential.\n" + " * diff: diffusivity [m^2/s].\n" + "There are 3 ion species predefined in arbor: 'ca', 'na' and 'k'.\n" + "If 'ion' in not one of these ions it will be added to the list, making it\n" + "available to mechanisms. The user has to provide the valence of a previously\n" + "undefined ion the first time this function is called with it as an argument.\n" + "Species concentrations and reversal potential can be overridden on\n" + "specific regions using the paint interface, while the method for calculating\n" + "reversal potential is global for all compartments in the cell, and can't be\n" + "overriden locally.") .def("paintings", [](arb::decor& dec) { std::vector<std::tuple<std::string, arb::paintable>> result; @@ -862,77 +817,67 @@ void register_cells(pybind11::module& m) { .def("paint", [](arb::decor& dec, const char* region, - optional<std::variant<double, std::string>> Vm, - optional<std::variant<double, std::string>> cm, - optional<std::variant<double, std::string>> rL, - optional<std::variant<double, std::string>> tempK) { - auto r = arborio::parse_region_expression(region).unwrap(); + optional<paintable_arg> Vm, optional<paintable_arg> cm, + optional<paintable_arg> rL, optional<paintable_arg> tempK) { + auto reg = arborio::parse_region_expression(region).unwrap(); if (Vm) { - if (std::holds_alternative<double>(*Vm)) { - dec.paint(r, arb::init_membrane_potential{std::get<double>(*Vm)}); - } - else { - const auto& s = std::get<std::string>(*Vm); - auto ie = arborio::parse_iexpr_expression(s).unwrap(); - dec.paint(r, arb::init_membrane_potential{ie}); - } + const auto& [v, s] = value_and_scale(*Vm); + dec.paint(reg, arb::init_membrane_potential{v, s}); } if (cm) { - if (std::holds_alternative<double>(*cm)) { - dec.paint(r, arb::membrane_capacitance{std::get<double>(*cm)}); - } - else { - const auto& s = std::get<std::string>(*cm); - auto ie = arborio::parse_iexpr_expression(s).unwrap(); - dec.paint(r, arb::membrane_capacitance{ie}); - } + const auto& [v, s] = value_and_scale(*cm); + dec.paint(reg, arb::membrane_capacitance{v, s}); } if (rL) { - if (std::holds_alternative<double>(*rL)) { - dec.paint(r, arb::axial_resistivity{std::get<double>(*rL)}); - } - else { - const auto& s = std::get<std::string>(*rL); - auto ie = arborio::parse_iexpr_expression(s).unwrap(); - dec.paint(r, arb::axial_resistivity{ie}); - } + const auto& [v, s] = value_and_scale(*rL); + dec.paint(reg, arb::axial_resistivity{v, s}); } if (tempK) { - if (std::holds_alternative<double>(*tempK)) { - dec.paint(r, arb::temperature_K{std::get<double>(*tempK)}); - } - else { - const auto& s = std::get<std::string>(*tempK); - auto ie = arborio::parse_iexpr_expression(s).unwrap(); - dec.paint(r, arb::temperature_K{ie}); - } + const auto& [v, s] = value_and_scale(*tempK); + dec.paint(reg, arb::temperature{v, s}); } return dec; }, - pybind11::arg("region"), - pybind11::arg_v("Vm", pybind11::none(), "initial membrane voltage [mV]."), - pybind11::arg_v("cm", pybind11::none(), "membrane capacitance [F/m²]."), - pybind11::arg_v("rL", pybind11::none(), "axial resistivity [Ω·cm]."), - pybind11::arg_v("tempK", pybind11::none(), "temperature [Kelvin]."), - "Set cable properties on a region.") + "region"_a, "Vm"_a=py::none(), "cm"_a=py::none(), "rL"_a=py::none(), "tempK"_a=py::none(), + "Set cable properties on a region.\n" + "Set global default values for cable and cell properties.\n" + " * Vm: initial membrane voltage [mV].\n" + " * cm: membrane capacitance [F/m²].\n" + " * rL: axial resistivity [Ω·cm].\n" + " * tempK: temperature [Kelvin].\n" + "Each value can be given as a plain quantity or a tuple of (quantity, 'scale') where scale is an iexpr.") // Paint ion species initial conditions on a region. .def("paint", [](arb::decor& dec, const char* region, const char* name, - optional<double> int_con, optional<double> ext_con, - optional<double> rev_pot, optional<double> diff) { + optional<paintable_arg> int_con, optional<paintable_arg> ext_con, + optional<paintable_arg> rev_pot, optional<paintable_arg> diff) { auto r = arborio::parse_region_expression(region).unwrap(); - if (int_con) dec.paint(r, arb::init_int_concentration{name, *int_con}); - if (ext_con) dec.paint(r, arb::init_ext_concentration{name, *ext_con}); - if (rev_pot) dec.paint(r, arb::init_reversal_potential{name, *rev_pot}); - if (diff) dec.paint(r, arb::ion_diffusivity{name, *diff}); + if (int_con) { + const auto& [v, s] = value_and_scale(*int_con); + dec.paint(r, arb::init_int_concentration{name, v, s}); + } + if (ext_con) { + const auto& [v, s] = value_and_scale(*ext_con); + dec.paint(r, arb::init_ext_concentration{name, v, s}); + } + if (rev_pot) { + const auto& [v, s] = value_and_scale(*rev_pot); + dec.paint(r, arb::init_reversal_potential{name, v, s}); + } + if (diff) { + const auto& [v, s] = value_and_scale(*diff); + dec.paint(r, arb::ion_diffusivity{name, v, s}); + } return dec; }, - "region"_a, pybind11::kw_only(), "ion_name"_a, - pybind11::arg_v("int_con", pybind11::none(), "Initial internal concentration [mM]"), - pybind11::arg_v("ext_con", pybind11::none(), "Initial external concentration [mM]"), - pybind11::arg_v("rev_pot", pybind11::none(), "Initial reversal potential [mV]"), - pybind11::arg_v("diff", pybind11::none(), "Diffusivity [m^2/s]"), - "Set ion species properties conditions on a region.") + "region"_a, py::kw_only(), "ion"_a, "int_con"_a=py::none(), "ext_con"_a=py::none(), "rev_pot"_a=py::none(), "diff"_a=py::none(), + "Set ion species properties conditions on a region.\n" + " * int_con: initial internal concentration [mM].\n" + " * ext_con: initial external concentration [mM].\n" + " * rev_pot: reversal potential [mV].\n" + " * method: mechanism for calculating reversal potential.\n" + " * diff: diffusivity [m^2/s].\n" + "Each value can be given as a plain quantity or a tuple of (quantity, 'scale') where scale is an iexpr.\n") // Place synapses .def("place", [](arb::decor& dec, const char* locset, const arb::synapse& mechanism, const char* label_name) { @@ -967,39 +912,30 @@ void register_cells(pybind11::module& m) { "The group of spike detectors has the label 'label', used for forming connections between cells.") .def("discretization", [](arb::decor& dec, const arb::cv_policy& p) { return dec.set_default(p); }, - pybind11::arg("policy"), + py::arg("policy"), "A cv_policy used to discretise the cell into compartments for simulation") .def("discretization", [](arb::decor& dec, const std::string& p) { return dec.set_default(arborio::parse_cv_policy_expression(p).unwrap()); }, - pybind11::arg("policy"), + py::arg("policy"), "An s-expression string representing a cv_policy used to discretise the " "cell into compartments for simulation"); - // arb::cable_cell - - pybind11::class_<arb::cable_cell> cable_cell(m, "cable_cell", - "Represents morphologically-detailed cell models, with morphology represented as a\n" - "tree of one-dimensional cable segments."); cable_cell - .def(pybind11::init( + .def(py::init( [](const arb::morphology& m, const arb::decor& d, const std::optional<label_dict_proxy>& l) { if (l) return arb::cable_cell(m, d, l->dict); return arb::cable_cell(m, d); }), - "morphology"_a, - "decor"_a, - pybind11::arg_v("labels", pybind11::none(), "Labels"), + "morphology"_a, "decor"_a, "labels"_a=py::none(), "Construct with a morphology, decor, and label dictionary.") - .def(pybind11::init( + .def(py::init( [](const arb::segment_tree& t, const arb::decor& d, const std::optional<label_dict_proxy>& l) { if (l) return arb::cable_cell({t}, d, l->dict); return arb::cable_cell({t}, d); }), - "segment_tree"_a, - "decor"_a, - pybind11::arg_v("labels", pybind11::none(), "Labels"), + "segment_tree"_a, "decor"_a, "labels"_a=py::none(), "Construct with a morphology derived from a segment tree, decor, and label dictionary.") .def_property_readonly("num_branches", [](const arb::cable_cell& c) {return c.morphology().num_branches();}, diff --git a/python/example/brunel.py b/python/example/brunel.py index 00beea6bfa11b86c9719129658237ec80b0edef5..f163b9ab4325e6b6c5f1792c87f26ac6122a3982 100755 --- a/python/example/brunel.py +++ b/python/example/brunel.py @@ -1,6 +1,7 @@ #!/usr/bin/env python3 -import arbor +import arbor as A +from arbor import units as U import argparse import numpy as np from numpy.random import RandomState @@ -32,7 +33,7 @@ def sample_subset(gen, gid, start, end, m): return idx[:m] -class brunel_recipe(arbor.recipe): +class brunel_recipe(A.recipe): def __init__( self, nexc, @@ -45,7 +46,7 @@ class brunel_recipe(arbor.recipe): poiss_lambda, seed=42, ): - arbor.recipe.__init__(self) + A.recipe.__init__(self) # Make sure that in_degree_prop in the interval (0, 1] if not 0.0 < in_degree_prop <= 1.0: @@ -56,7 +57,7 @@ class brunel_recipe(arbor.recipe): self.ncells_exc_ = nexc self.ncells_inh_ = ninh - self.delay_ = delay + self.delay_ = delay * U.ms self.seed_ = seed # Set up the parameters. @@ -67,25 +68,25 @@ class brunel_recipe(arbor.recipe): self.in_degree_inh_ = round(in_degree_prop * ninh) # each cell receives next incoming Poisson sources with mean rate poiss_lambda, which is equivalent # to a single Poisson source with mean rate next*poiss_lambda - self.lambda_ = next * poiss_lambda + self.lambda_ = next * poiss_lambda * U.kHz def num_cells(self): return self.ncells_exc_ + self.ncells_inh_ def cell_kind(self, gid): - return arbor.cell_kind.lif + return A.cell_kind.lif def connections_on(self, gid): gen = RandomState(gid + self.seed_) connections = [] # Add incoming excitatory connections. connections = [ - arbor.connection((i, "src"), "tgt", self.weight_exc_, self.delay_) + A.connection((i, "src"), "tgt", self.weight_exc_, self.delay_) for i in sample_subset(gen, gid, 0, self.ncells_exc_, self.in_degree_exc_) ] # Add incoming inhibitory connections. connections += [ - arbor.connection((i, "src"), "tgt", self.weight_inh_, self.delay_) + A.connection((i, "src"), "tgt", self.weight_inh_, self.delay_) for i in sample_subset( gen, gid, @@ -98,19 +99,25 @@ class brunel_recipe(arbor.recipe): return connections def cell_description(self, gid): - cell = arbor.lif_cell("src", "tgt") - cell.tau_m = 10 - cell.V_th = 10 - cell.C_m = 20 - cell.E_L = 0 - cell.V_m = 0 - cell.t_ref = 2 - return cell + return A.lif_cell( + "src", + "tgt", + tau_m=10 * U.ms, + V_th=10 * U.mV, + V_m=0 * U.mV, + E_L=0 * U.mV, + C_m=20 * U.pF, + t_ref=2 * U.ms, + ) def event_generators(self, gid): - t0 = 0 - sched = arbor.poisson_schedule(t0, self.lambda_, gid + self.seed_) - return [arbor.event_generator("tgt", self.weight_ext_, sched)] + return [ + A.event_generator( + "tgt", + self.weight_ext_, + A.poisson_schedule(freq=self.lambda_, seed=gid + self.seed_), + ) + ] if __name__ == "__main__": @@ -228,12 +235,12 @@ if __name__ == "__main__": for k, v in vars(opt).items(): print(f"{k} = {v}") - context = arbor.context() - if arbor.config()["profiling"]: - arbor.profiler_initialize(context) + context = A.context() + if A.config()["profiling"]: + A.profiler_initialize(context) print(context) - meters = arbor.meter_manager() + meters = A.meter_manager() meters.start(context) recipe = brunel_recipe( @@ -250,27 +257,27 @@ if __name__ == "__main__": meters.checkpoint("recipe-create", context) - hint = arbor.partition_hint() + hint = A.partition_hint() hint.cpu_group_size = 5000 - hints = {arbor.cell_kind.lif: hint} - decomp = arbor.partition_load_balance(recipe, context, hints) + hints = {A.cell_kind.lif: hint} + decomp = A.partition_load_balance(recipe, context, hints) print(decomp) meters.checkpoint("load-balance", context) - sim = arbor.simulation(recipe, context, decomp) - sim.record(arbor.spike_recording.all) + sim = A.simulation(recipe, context, decomp) + sim.record(A.spike_recording.all) meters.checkpoint("simulation-init", context) - sim.run(opt.tfinal, opt.dt) + sim.run(opt.tfinal * U.ms, opt.dt * U.ms) meters.checkpoint("simulation-run", context) # Print profiling information - print(arbor.meter_report(meters, context)) - if arbor.config()["profiling"]: - print(arbor.profiler_summary()) + print(A.meter_report(meters, context)) + if A.config()["profiling"]: + print(A.profiler_summary()) # Print spike times print(f"{len(sim.spikes())} spikes generated.") diff --git a/python/example/calcium_stdp.py b/python/example/calcium_stdp.py index 4d3d576ea4170ffe5832f971f5f73606ab0f0153..b642beea8cbde1c2febcd71d8e4ad5a0e312fbf1 100644 --- a/python/example/calcium_stdp.py +++ b/python/example/calcium_stdp.py @@ -10,19 +10,17 @@ # The synapse dynamics is affected by additive white noise. The results reproduce the spike # timing-dependent plasticity curve for the DP case described in Table S1 (supplemental material). -import arbor -import random -import multiprocessing -import numpy # You may have to pip install these. -import pandas # You may have to pip install these. -import seaborn # You may have to pip install these. +import arbor as A +from arbor import units as U +import numpy as np # You may have to pip install these. +import pandas as pd # You may have to pip install these. +import seaborn as sns # You may have to pip install these. # (1) Set simulation paramters - -# Spike response delay (ms) -D = 13.7 -# Spike frequency in Hertz -f = 1.0 +# Spike response delay +D = 13.7 * U.ms +# Spike frequency +f = 1000 * U.Hz # Number of spike pairs num_spikes = 30 # time lag resolution @@ -32,155 +30,113 @@ stdp_max_dt = 100.0 # Ensemble size per initial value ensemble_per_rho_0 = 100 # Simulation time step -dt = 0.1 -# List of initial values for 2 states +dt = 0.1 * U.ms +# List of initial values for 2 states; we need a synapse for each sample path rho_0 = [0] * ensemble_per_rho_0 + [1] * ensemble_per_rho_0 -# We need a synapse for each sample path -num_synapses = len(rho_0) # Time lags between spike pairs (post-pre: < 0, pre-post: > 0) -stdp_dt = numpy.arange(-stdp_max_dt, stdp_max_dt + stdp_dt_step, stdp_dt_step) - +stdp_dt = np.arange(-stdp_max_dt, stdp_max_dt + stdp_dt_step, stdp_dt_step) * U.ms +# Time between stimuli +T = 1000.0 / f +# Simulation duration +tfinal = num_spikes * T # (2) Make the cell - # Create a morphology with a single (cylindrical) segment of length=diameter=6 μm -tree = arbor.segment_tree() -tree.append(arbor.mnpos, arbor.mpoint(-3, 0, 0, 3), arbor.mpoint(3, 0, 0, 3), tag=1) +tree = A.segment_tree() +tree.append(A.mnpos, (-3, 0, 0, 3), (3, 0, 0, 3), tag=1) # Define the soma and its midpoint -labels = arbor.label_dict({"soma": "(tag 1)", "midpoint": "(location 0 0.5)"}) +labels = A.label_dict({"soma": "(tag 1)", "midpoint": "(location 0 0.5)"}) # Create and set up a decor object decor = ( - arbor.decor() - .set_property(Vm=-40) - .paint('"soma"', arbor.density("pas")) - .place('"midpoint"', arbor.synapse("expsyn"), "driving_synapse") - .place('"midpoint"', arbor.threshold_detector(-10), "detector") + A.decor() + .set_property(Vm=-40 * U.mV) + .paint('"soma"', A.density("pas")) + .place('"midpoint"', A.synapse("expsyn"), "driving_synapse") + .place('"midpoint"', A.threshold_detector(-10 * U.mV), "detector") ) -for i in range(num_synapses): - mech = arbor.mechanism("calcium_based_synapse") - mech.set("rho_0", rho_0[i]) - decor.place('"midpoint"', arbor.synapse(mech), f"calcium_synapse_{i}") +for ix, rho in enumerate(rho_0): + decor.place( + '"midpoint"', + A.synapse("calcium_based_synapse", rho_0=rho), + f"calcium_synapse_{ix}", + ) # Create cell -cell = arbor.cable_cell(tree, decor, labels) - - -# (3) Create extended catalogue including stochastic mechanisms - -cable_properties = arbor.neuron_cable_properties() -cable_properties.catalogue = arbor.default_catalogue() -cable_properties.catalogue.extend(arbor.stochastic_catalogue(), "") - +cell = A.cable_cell(tree, decor, labels) -# (4) Recipe - -class stdp_recipe(arbor.recipe): - def __init__(self, cell, props, gens): - arbor.recipe.__init__(self) +# (3) Recipe +class stdp_recipe(A.recipe): + def __init__(self, cell, time_lags): + A.recipe.__init__(self) self.the_cell = cell - self.the_props = props - self.the_gens = gens + # create extended catalogue including stochastic mechanisms + self.the_props = A.neuron_cable_properties() + self.the_props.catalogue.extend(A.stochastic_catalogue(), "") + self.time_lags = time_lags + self.num = len(time_lags) def num_cells(self): - return 1 + return self.num - def cell_kind(self, gid): - return arbor.cell_kind.cable + def cell_kind(self, _): + return A.cell_kind.cable - def cell_description(self, gid): + def cell_description(self, _): return self.the_cell - def global_properties(self, kind): + def global_properties(self, _): return self.the_props - def probes(self, gid): - return [ - arbor.cable_probe_point_state_cell("calcium_based_synapse", "rho", "rho") - ] + def probes(self, _): + return [A.cable_probe_point_state_cell("calcium_based_synapse", "rho", "rho")] def event_generators(self, gid): - return self.the_gens - - -# (5) run simulation for a given time lag - - -def run(time_lag): - # Time between stimuli - T = 1000.0 / f - - # Simulation duration - t1 = num_spikes * T + # Time difference between post and pre spike including delay + d = D - self.time_lags[gid] + # Stimulus and sample times + t0_post = max(-d.value, 0) * U.ms + t0_pre = max(d.value, 0) * U.ms + sched_post = A.regular_schedule(t0_post, T, tfinal) + sched_pre = A.regular_schedule(t0_pre, T, tfinal) - # Time difference between post and pre spike including delay - d = -time_lag + D + # Create strong enough driving stimulus + generators = [A.event_generator("driving_synapse", 1.0, sched_post)] - # Stimulus and sample times - t0_post = 0.0 if d >= 0 else -d - t0_pre = d if d >= 0 else 0.0 - stimulus_times_post = numpy.arange(t0_post, t1, T) - stimulus_times_pre = numpy.arange(t0_pre, t1, T) - sched_post = arbor.explicit_schedule(stimulus_times_post) - sched_pre = arbor.explicit_schedule(stimulus_times_pre) + # Stimulus for calcium synapses + for ix, _ in enumerate(rho_0): + # Zero weight -> just modify synaptic weight via stdp + generators.append( + A.event_generator(f"calcium_synapse_{ix}", 0.0, sched_pre) + ) + return generators - # Create strong enough driving stimulus - generators = [arbor.event_generator("driving_synapse", 1.0, sched_post)] - # Stimulus for calcium synapses - for i in range(num_synapses): - # Zero weight -> just modify synaptic weight via stdp - generators.append(arbor.event_generator(f"calcium_synapse_{i}", 0.0, sched_pre)) +# (4) run simulation for all lags +# Create recipe +rec = stdp_recipe(cell, stdp_dt) - # Create recipe - recipe = stdp_recipe(cell, cable_properties, generators) +# Create simulation +print(A.config()) +sim = A.simulation(rec, seed=42) - # Select one thread and no GPU - alloc = arbor.proc_allocation(threads=1, gpu_id=None) - context = arbor.context(alloc, mpi=None) - domains = arbor.partition_load_balance(recipe, context) +# Register probe to read out stdp curve +handles = [ + sim.sample((gid, "rho"), A.explicit_schedule([tfinal - dt])) + for gid in range(len(stdp_dt)) +] - # Get random seed - random_seed = random.getrandbits(64) +sim.record(A.spike_recording.all) - # Create simulation - sim = arbor.simulation(recipe, context, domains, random_seed) +# Run simulation +sim.run(tfinal, dt) - # Register prope to read out stdp curve - handle = sim.sample((0, "rho"), arbor.explicit_schedule([t1 - dt])) - # Run simulation - sim.run(t1, dt) - - # Process sampled data - data, meta = sim.samples(handle)[0] - data_down = data[-1, 1 : ensemble_per_rho_0 + 1] - data_up = data[-1, ensemble_per_rho_0 + 1 :] - # Initial fraction of synapses in DOWN state - beta = 0.5 - # Synaptic strength ratio UP to DOWN (w1/w0) - b = 5 - # Transition indicator form DOWN to UP - P_UA = (data_down > 0.5).astype(float) - # Transition indicator from UP to DOWN - P_DA = (data_up < 0.5).astype(float) - # Return change in synaptic strength - ds_A = ( - (1 - P_UA) * beta - + P_DA * (1 - beta) - + b * (P_UA * beta + (1 - P_DA) * (1 - beta)) - ) / (beta + (1 - beta) * b) - return pandas.DataFrame({"ds": ds_A, "ms": time_lag, "type": "Arbor"}) - - -with multiprocessing.Pool() as p: - results = p.map(run, stdp_dt) - -results = map(run, stdp_dt) - -ref = numpy.array( +# (5) Process sampled data +# Add reference +ref = np.array( [ [-100, 0.9793814432989691], [-95, 0.981715028725338], @@ -225,11 +181,30 @@ ref = numpy.array( [100, 0.9918730512544945], ] ) -df_ref = pandas.DataFrame({"ds": ref[:, 1], "ms": ref[:, 0], "type": "Reference"}) -df = pandas.concat(results, ignore_index=True) -df = pandas.concat([df, df_ref], ignore_index=True) -plt = seaborn.relplot(kind="line", data=df, x="ms", y="ds", hue="type") +results = [pd.DataFrame({"ds": ref[:, 1], "ms": ref[:, 0], "type": "Reference"})] +for handle, time_lag in zip(handles, stdp_dt): + data, _ = sim.samples(handle)[0] + data_down = data[-1, 1 : ensemble_per_rho_0 + 1] + data_up = data[-1, ensemble_per_rho_0 + 1 :] + # Initial fraction of synapses in DOWN state + beta = 0.5 + # Synaptic strength ratio UP to DOWN (w1/w0) + b = 5 + # Transition indicator form DOWN to UP + P_UA = (data_down > 0.5).astype(float) + # Transition indicator from UP to DOWN + P_DA = (data_up < 0.5).astype(float) + # Return change in synaptic strength + ds_A = ( + (1 - P_UA) * beta + + P_DA * (1 - beta) + + b * (P_UA * beta + (1 - P_DA) * (1 - beta)) + ) / (beta + (1 - beta) * b) + results.append(pd.DataFrame({"ds": ds_A, "ms": time_lag.value, "type": "Arbor"})) + +df = pd.concat(results, ignore_index=True) +plt = sns.relplot(kind="line", data=df, x="ms", y="ds", hue="type") plt.set_xlabels("lag time difference (ms)") plt.set_ylabels("change in synaptic strenght (after/before)") plt._legend.set_title("") diff --git a/python/example/diffusion.py b/python/example/diffusion.py index cc51201a6ccc53db5459f13e6adef73db3f5d6fc..8dda5e78f7fe3d4bbbf2188f95aa3bd5de2161d3 100644 --- a/python/example/diffusion.py +++ b/python/example/diffusion.py @@ -1,6 +1,7 @@ #!/usr/bin/env python3 import arbor as A +from arbor import units as U import seaborn as sns import matplotlib.pyplot as plt @@ -15,35 +16,43 @@ class recipe(A.recipe): def num_cells(self): return 1 - def cell_kind(self, gid): + def cell_kind(self, _): return A.cell_kind.cable - def cell_description(self, gid): + def cell_description(self, _): return self.the_cell - def probes(self, gid): + def probes(self, _): return self.the_probes - def global_properties(self, kind): + def global_properties(self, _): return self.the_props - def event_generators(self, gid): - return [A.event_generator("Zap", 0.005, A.explicit_schedule([0.0]))] + def event_generators(self, _): + return [A.event_generator("Zap", 0.005, A.explicit_schedule([0.0 * U.ms]))] tree = A.segment_tree() -s = tree.append(A.mnpos, A.mpoint(-3, 0, 0, 3), A.mpoint(3, 0, 0, 3), tag=1) -_ = tree.append(s, A.mpoint(3, 0, 0, 1), A.mpoint(33, 0, 0, 1), tag=3) - -dec = A.decor() -dec.set_ion("na", int_con=0.0, diff=0.005) -dec.place("(location 0 0.5)", A.synapse("inject/x=na", {"alpha": 200.0}), "Zap") -dec.paint("(all)", A.density("decay/x=na")) -dec.discretization(A.cv_policy("(max-extent 5)")) - -# Set up ion diffusion -dec.set_ion("na", int_con=1.0, ext_con=140, rev_pot=50, diff=0.005) -dec.paint("(tag 1)", ion_name="na", int_con=100.0, diff=0.01) +s = A.mnpos +s = tree.append(s, (-3, 0, 0, 3), (3, 0, 0, 3), tag=1) +_ = tree.append(s, (3, 0, 0, 1), (33, 0, 0, 1), tag=3) + +dec = ( + A.decor() + .set_ion("na", int_con=0.0 * U.mM, diff=0.005 * U.m2 / U.s) + .place("(location 0 0.5)", A.synapse("inject/x=na", {"alpha": 200.0}), "Zap") + .paint("(all)", A.density("decay/x=na")) + .discretization(A.cv_policy("(max-extent 5)")) + # Set up ion diffusion + .set_ion( + "na", + int_con=1.0 * U.mM, + ext_con=140 * U.mM, + rev_pot=50 * U.mV, + diff=0.005 * U.m2 / U.s, + ) + .paint("(tag 1)", ion="na", int_con=100.0 * U.mM, diff=0.01 * U.m2 / U.s) +) prb = [ A.cable_probe_ion_diff_concentration_cell("na", "nad"), @@ -51,9 +60,9 @@ prb = [ cel = A.cable_cell(tree, dec) rec = recipe(cel, prb) sim = A.simulation(rec) -hdl = (sim.sample((0, "nad"), A.regular_schedule(0.1)),) +hdl = (sim.sample((0, "nad"), A.regular_schedule(0.1 * U.ms)),) -sim.run(tfinal=0.5) +sim.run(tfinal=0.5 * U.ms) sns.set_theme() fg, ax = plt.subplots() diff --git a/python/example/dynamic-catalogue.py b/python/example/dynamic-catalogue.py index 6ed1a83f71fd1f4dd613252439cccbe20106127d..da14b77fca8c2178695092f29dd04d847abc7f12 100644 --- a/python/example/dynamic-catalogue.py +++ b/python/example/dynamic-catalogue.py @@ -2,20 +2,21 @@ from pathlib import Path -import arbor as arb +import arbor as A +from arbor import units as U cat = Path("cat-catalogue.so").resolve() -class recipe(arb.recipe): +class recipe(A.recipe): def __init__(self): - arb.recipe.__init__(self) - self.tree = arb.segment_tree() - self.tree.append(arb.mnpos, (0, 0, 0, 10), (1, 0, 0, 10), 1) - self.props = arb.neuron_cable_properties() - self.props.catalogue = arb.load_catalogue(cat) - d = arb.decor().paint("(all)", "dummy").set_property(Vm=0.0) - self.cell = arb.cable_cell(self.tree, d) + A.recipe.__init__(self) + self.tree = A.segment_tree() + self.tree.append(A.mnpos, (0, 0, 0, 10), (1, 0, 0, 10), 1) + self.props = A.neuron_cable_properties() + self.props.catalogue = A.load_catalogue(cat) + d = A.decor().paint("(all)", "dummy").set_property(Vm=0.0 * U.mV) + self.cell = A.cable_cell(self.tree, d) def global_properties(self, _): return self.props @@ -24,7 +25,7 @@ class recipe(arb.recipe): return 1 def cell_kind(self, gid): - return arb.cell_kind.cable + return A.cell_kind.cable def cell_description(self, gid): return self.cell @@ -40,5 +41,5 @@ where <arbor> is the location of the arbor source tree.""" exit(1) rcp = recipe() -sim = arb.simulation(rcp) -sim.run(tfinal=30) +sim = A.simulation(rcp) +sim.run(tfinal=30 * U.ms) diff --git a/python/example/gap_junctions.py b/python/example/gap_junctions.py index 9dd5ac27fac856d6b1aab291e72560afd5110b14..67c028a661e8a3af3cf8cbc473463276eea93423 100644 --- a/python/example/gap_junctions.py +++ b/python/example/gap_junctions.py @@ -1,8 +1,9 @@ #!/usr/bin/env python3 -import arbor -import pandas -import seaborn +import arbor as A +from arbor import units as U +import pandas as pd +import seaborn as sns import matplotlib.pyplot as plt # Construct chains of cells linked with gap junctions, @@ -20,18 +21,16 @@ import matplotlib.pyplot as plt def make_cable_cell(gid): # Build a segment tree - tree = arbor.segment_tree() + tree = A.segment_tree() # Soma with radius 5 μm and length 2 * radius = 10 μm, (tag = 1) - s = tree.append( - arbor.mnpos, arbor.mpoint(-10, 0, 0, 5), arbor.mpoint(0, 0, 0, 5), tag=1 - ) + s = tree.append(A.mnpos, A.mpoint(-10, 0, 0, 5), A.mpoint(0, 0, 0, 5), tag=1) # Single dendrite with radius 2 μm and length 40 μm, (tag = 2) - tree.append(s, arbor.mpoint(0, 0, 0, 2), arbor.mpoint(40, 0, 0, 2), tag=2) + tree.append(s, A.mpoint(0, 0, 0, 2), A.mpoint(40, 0, 0, 2), tag=2) # Label dictionary for cell components - labels = arbor.label_dict( + labels = A.label_dict( { # Mark location for synapse site at midpoint of dendrite (branch 0 soma + dendrite) "synapse_site": "(location 0 0.6)", @@ -44,26 +43,26 @@ def make_cable_cell(gid): # Paint dynamics onto the cell, hh on soma and passive properties on dendrite decor = ( - arbor.decor() - .paint('"soma"', arbor.density("hh")) - .paint('"dend"', arbor.density("pas")) + A.decor() + .paint('"soma"', A.density("hh")) + .paint('"dend"', A.density("pas")) # Attach one synapse and gap junction each on their labeled sites - .place('"synapse_site"', arbor.synapse("expsyn"), "syn") - .place('"gj_site"', arbor.junction("gj"), "gj") + .place('"synapse_site"', A.synapse("expsyn"), "syn") + .place('"gj_site"', A.junction("gj"), "gj") # Attach detector to cell root - .place('"root"', arbor.threshold_detector(-10), "detector") + .place('"root"', A.threshold_detector(-10 * U.mV), "detector") ) - return arbor.cable_cell(tree, decor, labels) + return A.cable_cell(tree, decor, labels) # Create a recipe that generates connected chains of cells -class chain_recipe(arbor.recipe): +class chain_recipe(A.recipe): def __init__(self, ncells_per_chain, nchains): - arbor.recipe.__init__(self) + A.recipe.__init__(self) self.nchains = nchains self.ncells_per_chain = ncells_per_chain - self.props = arbor.neuron_cable_properties() + self.props = A.neuron_cable_properties() def num_cells(self): return self.ncells_per_chain * self.nchains @@ -72,7 +71,7 @@ class chain_recipe(arbor.recipe): return make_cable_cell(gid) def cell_kind(self, gid): - return arbor.cell_kind.cable + return A.cell_kind.cable # Create synapse connection between last cell of one chain and first cell of following chain def connections_on(self, gid): @@ -80,9 +79,7 @@ class chain_recipe(arbor.recipe): return [] else: src = gid - 1 - w = 0.05 - d = 10 - return [arbor.connection((src, "detector"), "syn", w, d)] + return [A.connection((src, "detector"), "syn", 0.05, 10 * U.ms)] # Create gap junction connections between a cell within a chain and its neighbor(s) def gap_junctions_on(self, gid): @@ -95,23 +92,23 @@ class chain_recipe(arbor.recipe): prev_cell = gid - 1 if next_cell < chain_end: - conns.append(arbor.gap_junction_connection((gid + 1, "gj"), "gj", 0.015)) + conns.append(A.gap_junction_connection((gid + 1, "gj"), "gj", 0.015)) if prev_cell >= chain_begin: - conns.append(arbor.gap_junction_connection((gid - 1, "gj"), "gj", 0.015)) + conns.append(A.gap_junction_connection((gid - 1, "gj"), "gj", 0.015)) return conns # Event generator at first cell def event_generators(self, gid): if gid == 0: - sched = arbor.explicit_schedule([1]) + sched = A.explicit_schedule([1 * U.ms]) weight = 0.1 - return [arbor.event_generator("syn", weight, sched)] + return [A.event_generator("syn", weight, sched)] return [] # Place a probe at the root of each cell def probes(self, gid): - return [arbor.cable_probe_membrane_voltage('"root"', "Um")] + return [A.cable_probe_membrane_voltage('"root"', "Um")] def global_properties(self, kind): return self.props @@ -130,18 +127,18 @@ ncells = nchains * ncells_per_chain recipe = chain_recipe(ncells_per_chain, nchains) # Create a default simulation -sim = arbor.simulation(recipe) +sim = A.simulation(recipe) # Set spike generators to record -sim.record(arbor.spike_recording.all) +sim.record(A.spike_recording.all) # Sampler handles = [ - sim.sample((gid, "Um"), arbor.regular_schedule(0.1)) for gid in range(ncells) + sim.sample((gid, "Um"), A.regular_schedule(0.1 * U.ms)) for gid in range(ncells) ] -# Run simulation for 100 ms -sim.run(100) +# Run simulation +sim.run(100 * U.ms) print("Simulation finished") # Print spike times @@ -155,11 +152,11 @@ df_list = [] for gid in range(ncells): samples, meta = sim.samples(handles[gid])[0] df_list.append( - pandas.DataFrame( + pd.DataFrame( {"t/ms": samples[:, 0], "U/mV": samples[:, 1], "Cell": f"cell {gid}"} ) ) -df = pandas.concat(df_list, ignore_index=True) -seaborn.relplot(data=df, kind="line", x="t/ms", y="U/mV", hue="Cell", errorbar=None) +df = pd.concat(df_list, ignore_index=True) +sns.relplot(data=df, kind="line", x="t/ms", y="U/mV", hue="Cell", errorbar=None) plt.show() diff --git a/python/example/network_ring.py b/python/example/network_ring.py index 73f7a4ce6aff4975777b3c3566393c48faf9c6d9..7dc460d4945c67ca2cfad787603605374a5cc455 100755 --- a/python/example/network_ring.py +++ b/python/example/network_ring.py @@ -1,54 +1,48 @@ #!/usr/bin/env python3 # This script is included in documentation. Adapt line numbers if touched. -import arbor +import arbor as A +from arbor import units as U import pandas # You may have to pip install these import seaborn # You may have to pip install these from math import sqrt -print(arbor.__path__) - -# Construct a cell with the following morphology. -# The soma (at the root of the tree) is marked 's', and -# the end of each branch i is marked 'bi'. -# -# b1 -# / -# s----b0 -# \ -# b2 - def make_cable_cell(gid): # (1) Build a segment tree - tree = arbor.segment_tree() - + # The dendrite (dend) attaches to the soma and has two simple segments + # attached. + # + # left + # / + # soma - dend + # \ + # right + tree = A.segment_tree() + root = A.mnpos # Soma (tag=1) with radius 6 μm, modelled as cylinder of length 2*radius - s = tree.append( - arbor.mnpos, arbor.mpoint(-12, 0, 0, 6), arbor.mpoint(0, 0, 0, 6), tag=1 - ) - - # (b0) Single dendrite (tag=3) of length 50 μm and radius 2 μm attached to soma. - b0 = tree.append(s, arbor.mpoint(0, 0, 0, 2), arbor.mpoint(50, 0, 0, 2), tag=3) - + soma = tree.append(root, (-12, 0, 0, 6), (0, 0, 0, 6), tag=1) + # Single dendrite (tag=3) of length 50 μm and radius 2 μm attached to soma. + dend = tree.append(soma, (0, 0, 0, 2), (50, 0, 0, 2), tag=3) # Attach two dendrites (tag=3) of length 50 μm to the end of the first dendrite. - # (b1) Radius tapers from 2 to 0.5 μm over the length of the dendrite. - tree.append( - b0, - arbor.mpoint(50, 0, 0, 2), - arbor.mpoint(50 + 50 / sqrt(2), 50 / sqrt(2), 0, 0.5), + # Radius tapers from 2 to 0.5 μm over the length of the dendrite. + l = 50 / sqrt(2) + _ = tree.append( + dend, + (50, 0, 0, 2), + (50 + l, l, 0, 0.5), tag=3, ) - # (b2) Constant radius of 1 μm over the length of the dendrite. - tree.append( - b0, - arbor.mpoint(50, 0, 0, 1), - arbor.mpoint(50 + 50 / sqrt(2), -50 / sqrt(2), 0, 1), + # Constant radius of 1 μm over the length of the dendrite. + _ = tree.append( + dend, + (50, 0, 0, 1), + (50 + l, -l, 0, 1), tag=3, ) # Associate labels to tags - labels = arbor.label_dict( + labels = A.label_dict( { "soma": "(tag 1)", "dend": "(tag 3)", @@ -61,29 +55,27 @@ def make_cable_cell(gid): # (3) Create a decor and a cable_cell decor = ( - arbor.decor() + A.decor() # Put hh dynamics on soma, and passive properties on the dendrites. - .paint('"soma"', arbor.density("hh")).paint('"dend"', arbor.density("pas")) + .paint('"soma"', A.density("hh")).paint('"dend"', A.density("pas")) # (4) Attach a single synapse. - .place('"synapse_site"', arbor.synapse("expsyn"), "syn") + .place('"synapse_site"', A.synapse("expsyn"), "syn") # Attach a detector with threshold of -10 mV. - .place('"root"', arbor.threshold_detector(-10), "detector") + .place('"root"', A.threshold_detector(-10 * U.mV), "detector") ) - return arbor.cable_cell(tree, decor, labels) + return A.cable_cell(tree, decor, labels) # (5) Create a recipe that generates a network of connected cells. -class ring_recipe(arbor.recipe): +class ring_recipe(A.recipe): def __init__(self, ncells): - # The base C++ class constructor must be called first, to ensure that - # all memory in the C++ class is initialized correctly. - arbor.recipe.__init__(self) + # Base class constructor must be called first for proper initialization. + A.recipe.__init__(self) self.ncells = ncells - self.props = arbor.neuron_cable_properties() + self.props = A.neuron_cable_properties() - # (6) The num_cells method that returns the total number of cells in the model - # must be implemented. + # (6) Returns the total number of cells in the model; must be implemented. def num_cells(self): return self.ncells @@ -91,31 +83,32 @@ class ring_recipe(arbor.recipe): def cell_description(self, gid): return make_cable_cell(gid) - # The kind method returns the type of cell with gid. - # Note: this must agree with the type returned by cell_description. - def cell_kind(self, gid): - return arbor.cell_kind.cable + # Return the type of cell; must be implemented and match cell_description. + def cell_kind(self, _): + return A.cell_kind.cable - # (8) Make a ring network. For each gid, provide a list of incoming connections. + # (8) For each gid, provide a list of incoming connections. def connections_on(self, gid): + # This defines the ring by connecting from the last gid. The first src + # comes from the _last_ gid, closing the ring. src = (gid - 1) % self.ncells w = 0.01 # 0.01 μS on expsyn - d = 5 # ms delay - return [arbor.connection((src, "detector"), "syn", w, d)] + d = 5 * U.ms + return [A.connection((src, "detector"), "syn", w, d)] # (9) Attach a generator to the first cell in the ring. def event_generators(self, gid): if gid == 0: - sched = arbor.explicit_schedule([1]) # one event at 1 ms + sched = A.explicit_schedule([1 * U.ms]) # one event at 1 ms weight = 0.1 # 0.1 μS on expsyn - return [arbor.event_generator("syn", weight, sched)] + return [A.event_generator("syn", weight, sched)] return [] # (10) Place a probe at the root of each cell. def probes(self, gid): - return [arbor.cable_probe_membrane_voltage('"root"', "Um")] + return [A.cable_probe_membrane_voltage('"root"', "Um")] - def global_properties(self, kind): + def global_properties(self, _): return self.props @@ -129,18 +122,18 @@ recipe = ring_recipe(ncells) # - Use GPU if present # - No MPI # Other constructors of simulation can be used to change all of these. -sim = arbor.simulation(recipe) +sim = A.simulation(recipe) # (13) Set spike generators to record -sim.record(arbor.spike_recording.all) +sim.record(A.spike_recording.all) # (14) Attach a sampler to the voltage probe on cell 0. Sample rate of 10 sample every ms. handles = [ - sim.sample((gid, "Um"), arbor.regular_schedule(0.1)) for gid in range(ncells) + sim.sample((gid, "Um"), A.regular_schedule(0.1 * U.ms)) for gid in range(ncells) ] # (15) Run simulation for 100 ms -sim.run(100) +sim.run(100 * U.ms) print("Simulation finished") # (16) Print spike times @@ -150,16 +143,15 @@ for sp in sim.spikes(): # (17) Plot the recorded voltages over time. print("Plotting results ...") -df_list = [] +dfs = [] for gid in range(ncells): samples, meta = sim.samples(handles[gid])[0] - df_list.append( + dfs.append( pandas.DataFrame( {"t/ms": samples[:, 0], "U/mV": samples[:, 1], "Cell": f"cell {gid}"} ) ) - -df = pandas.concat(df_list, ignore_index=True) +df = pandas.concat(dfs, ignore_index=True) seaborn.relplot( data=df, kind="line", x="t/ms", y="U/mV", hue="Cell", errorbar=None ).savefig("network_ring_result.svg") diff --git a/python/example/network_ring_gpu.py b/python/example/network_ring_gpu.py index e54e099992539dd2aeb98f5a3042c3672025b34a..fb46bdb565ca144bbdfefcba324dd3afca0f4c14 100644 --- a/python/example/network_ring_gpu.py +++ b/python/example/network_ring_gpu.py @@ -1,9 +1,10 @@ #!/usr/bin/env python3 # This script is included in documentation. Adapt line numbers if touched. -import arbor -import pandas # You may have to pip install these -import seaborn # You may have to pip install these +import arbor as A +from arbor import units as U +import pandas as pd # You may have to pip install these +import seaborn as sns # You may have to pip install these from math import sqrt # Construct a cell with the following morphology. @@ -17,37 +18,36 @@ from math import sqrt # b2 -def make_cable_cell(gid): +def make_cable_cell(_): # (1) Build a segment tree - tree = arbor.segment_tree() + tree = A.segment_tree() # Soma (tag=1) with radius 6 μm, modelled as cylinder of length 2*radius - s = tree.append( - arbor.mnpos, arbor.mpoint(-12, 0, 0, 6), arbor.mpoint(0, 0, 0, 6), tag=1 - ) + s = A.mnpos + s = tree.append(s, (-12, 0, 0, 6), (0, 0, 0, 6), tag=1) # Single dendrite (tag=3) of length 50 μm and radius 2 μm attached to soma. - b0 = tree.append(s, arbor.mpoint(0, 0, 0, 2), arbor.mpoint(50, 0, 0, 2), tag=3) + b0 = tree.append(s, (0, 0, 0, 2), (50, 0, 0, 2), tag=3) # Attach two dendrites (tag=3) of length 50 μm to the end of the first dendrite. # As there's no further use for them, we discard the returned handles. # (b1) Radius tapers from 2 to 0.5 μm over the length of the dendrite. _ = tree.append( b0, - arbor.mpoint(50, 0, 0, 2), - arbor.mpoint(50 + 50 / sqrt(2), 50 / sqrt(2), 0, 0.5), + (50, 0, 0, 2), + (50 + 50 / sqrt(2), 50 / sqrt(2), 0, 0.5), tag=3, ) # (b2) Constant radius of 1 μm over the length of the dendrite. _ = tree.append( b0, - arbor.mpoint(50, 0, 0, 1), - arbor.mpoint(50 + 50 / sqrt(2), -50 / sqrt(2), 0, 1), + (50, 0, 0, 1), + (50 + 50 / sqrt(2), -50 / sqrt(2), 0, 1), tag=3, ) # Associate labels to tags - labels = arbor.label_dict() + labels = A.label_dict() labels["soma"] = "(tag 1)" labels["dend"] = "(tag 3)" @@ -57,31 +57,31 @@ def make_cable_cell(gid): labels["root"] = "(root)" # (3) Create a decor and a cable_cell - decor = arbor.decor() + decor = A.decor() # Put hh dynamics on soma, and passive properties on the dendrites. - decor.paint('"soma"', arbor.density("hh")) - decor.paint('"dend"', arbor.density("pas")) + decor.paint('"soma"', A.density("hh")) + decor.paint('"dend"', A.density("pas")) # (4) Attach a single synapse. - decor.place('"synapse_site"', arbor.synapse("expsyn"), "syn") + decor.place('"synapse_site"', A.synapse("expsyn"), "syn") # Attach a detector with threshold of -10 mV. - decor.place('"root"', arbor.threshold_detector(-10), "detector") + decor.place('"root"', A.threshold_detector(-10 * U.mV), "detector") - cell = arbor.cable_cell(tree, decor, labels) + cell = A.cable_cell(tree, decor, labels) return cell # (5) Create a recipe that generates a network of connected cells. -class ring_recipe(arbor.recipe): +class ring_recipe(A.recipe): def __init__(self, ncells): # The base C++ class constructor must be called first, to ensure that # all memory in the C++ class is initialized correctly. - arbor.recipe.__init__(self) + A.recipe.__init__(self) self.ncells = ncells - self.props = arbor.neuron_cable_properties() + self.props = A.neuron_cable_properties() # (6) The num_cells method that returns the total number of cells in the model # must be implemented. @@ -94,40 +94,40 @@ class ring_recipe(arbor.recipe): # The kind method returns the type of cell with gid. # Note: this must agree with the type returned by cell_description. - def cell_kind(self, gid): - return arbor.cell_kind.cable + def cell_kind(self, _): + return A.cell_kind.cable # (8) Make a ring network. For each gid, provide a list of incoming connections. def connections_on(self, gid): src = (gid - 1) % self.ncells w = 0.01 # 0.01 μS on expsyn d = 5 # ms delay - return [arbor.connection((src, "detector"), "syn", w, d)] + return [A.connection((src, "detector"), "syn", w, d * U.ms)] # (9) Attach a generator to the first cell in the ring. def event_generators(self, gid): if gid == 0: - sched = arbor.explicit_schedule([1]) # one event at 1 ms + sched = A.explicit_schedule([1 * U.ms]) # one event at 1 ms weight = 0.1 # 0.1 μS on expsyn - return [arbor.event_generator("syn", weight, sched)] + return [A.event_generator("syn", weight, sched)] return [] # (10) Place a probe at the root of each cell. - def probes(self, gid): - return [arbor.cable_probe_membrane_voltage('"root"', "Um")] + def probes(self, _): + return [A.cable_probe_membrane_voltage('"root"', "Um")] - def global_properties(self, kind): + def global_properties(self, _): return self.props # (11) Set up the hardware context # gpu_id set to None will not use a GPU. # gpu_id=0 instructs Arbor to the first GPU present in your system -context = arbor.context(gpu_id=None) +context = A.context(gpu_id=None) print(context) # (12) Set up and start the meter manager -meters = arbor.meter_manager() +meters = A.meter_manager() meters.start(context) # (13) Instantiate recipe @@ -136,36 +136,38 @@ recipe = ring_recipe(ncells) meters.checkpoint("recipe-create", context) # (14) Define a hint at to the execution. -hint = arbor.partition_hint() +hint = A.partition_hint() hint.prefer_gpu = True hint.gpu_group_size = 1000 print(hint) -hints = {arbor.cell_kind.cable: hint} +hints = {A.cell_kind.cable: hint} # (15) Domain decomp -decomp = arbor.partition_load_balance(recipe, context, hints) +decomp = A.partition_load_balance(recipe, context, hints) print(decomp) meters.checkpoint("load-balance", context) # (16) Simulation init and set spike generators to record -sim = arbor.simulation(recipe, context, decomp) -sim.record(arbor.spike_recording.all) -handles = [sim.sample((gid, "Um"), arbor.regular_schedule(1)) for gid in range(ncells)] +sim = A.simulation(recipe, context, decomp) +sim.record(A.spike_recording.all) +handles = [ + sim.sample((gid, "Um"), A.regular_schedule(1 * U.ms)) for gid in range(ncells) +] meters.checkpoint("simulation-init", context) # (17) Run simulation -sim.run(ncells * 5) +sim.run(ncells * 5 * U.ms) print("Simulation finished") meters.checkpoint("simulation-run", context) # (18) Results # Print profiling information -print(f"{arbor.meter_report(meters, context)}") +print(f"{A.meter_report(meters, context)}") # Print spike times print("spikes:") -for sp in sim.spikes(): - print(" ", sp) +for (gid, lid), t in sim.spikes(): + print(f" * t={t:.3f}ms gid={gid} lid={lid}") # Plot the recorded voltages over time. print("Plotting results ...") @@ -173,12 +175,12 @@ df_list = [] for gid in range(ncells): samples, meta = sim.samples(handles[gid])[0] df_list.append( - pandas.DataFrame( + pd.DataFrame( {"t/ms": samples[:, 0], "U/mV": samples[:, 1], "Cell": f"cell {gid}"} ) ) -df = pandas.concat(df_list, ignore_index=True) -seaborn.relplot( +df = pd.concat(df_list, ignore_index=True) +sns.relplot( data=df, kind="line", x="t/ms", y="U/mV", hue="Cell", errorbar=None ).savefig("network_ring_gpu_result.svg") diff --git a/python/example/network_ring_mpi.py b/python/example/network_ring_mpi.py index 73621685ed8d4db6a63981af5746ca14b6ccbf38..98dfb73b1e5db565f45c2851bf31ce63fd98b54f 100644 --- a/python/example/network_ring_mpi.py +++ b/python/example/network_ring_mpi.py @@ -1,8 +1,9 @@ #!/usr/bin/env python3 # This script is included in documentation. Adapt line numbers if touched. -import arbor -import pandas +import arbor as A +from arbor import units as U +import pandas as pd from math import sqrt # Run with srun -n NJOBS python network_ring_mpi.py @@ -20,35 +21,34 @@ from math import sqrt def make_cable_cell(gid): # (1) Build a segment tree - tree = arbor.segment_tree() + tree = A.segment_tree() # Soma (tag=1) with radius 6 μm, modelled as cylinder of length 2*radius - s = tree.append( - arbor.mnpos, arbor.mpoint(-12, 0, 0, 6), arbor.mpoint(0, 0, 0, 6), tag=1 - ) + s = A.mnpos + s = tree.append(s, (-12, 0, 0, 6), (0, 0, 0, 6), tag=1) # Single dendrite (tag=3) of length 50 μm and radius 2 μm attached to soma. - b0 = tree.append(s, arbor.mpoint(0, 0, 0, 2), arbor.mpoint(50, 0, 0, 2), tag=3) + b0 = tree.append(s, (0, 0, 0, 2), (50, 0, 0, 2), tag=3) # Attach two dendrites (tag=3) of length 50 μm to the end of the first dendrite. # As there's no further use for them, we discard the returned handles. # (b1) Radius tapers from 2 to 0.5 μm over the length of the dendrite. _ = tree.append( b0, - arbor.mpoint(50, 0, 0, 2), - arbor.mpoint(50 + 50 / sqrt(2), 50 / sqrt(2), 0, 0.5), + (50, 0, 0, 2), + (50 + 50 / sqrt(2), 50 / sqrt(2), 0, 0.5), tag=3, ) # (b2) Constant radius of 1 μm over the length of the dendrite. _ = tree.append( b0, - arbor.mpoint(50, 0, 0, 1), - arbor.mpoint(50 + 50 / sqrt(2), -50 / sqrt(2), 0, 1), + (50, 0, 0, 1), + (50 + 50 / sqrt(2), -50 / sqrt(2), 0, 1), tag=3, ) # Associate labels to tags - labels = arbor.label_dict( + labels = A.label_dict( { "soma": "(tag 1)", "dend": "(tag 3)", @@ -61,26 +61,26 @@ def make_cable_cell(gid): # (3) Create a decor and a cable_cell decor = ( - arbor.decor() + A.decor() # Put hh dynamics on soma, and passive properties on the dendrites. - .paint('"soma"', arbor.density("hh")).paint('"dend"', arbor.density("pas")) + .paint('"soma"', A.density("hh")).paint('"dend"', A.density("pas")) # (4) Attach a single synapse. - .place('"synapse_site"', arbor.synapse("expsyn"), "syn") + .place('"synapse_site"', A.synapse("expsyn"), "syn") # Attach a detector with threshold of -10 mV. - .place('"root"', arbor.threshold_detector(-10), "detector") + .place('"root"', A.threshold_detector(-10), "detector") ) - return arbor.cable_cell(tree, decor, labels) + return A.cable_cell(tree, decor, labels) # (5) Create a recipe that generates a network of connected cells. -class ring_recipe(arbor.recipe): +class ring_recipe(A.recipe): def __init__(self, ncells): # The base C++ class constructor must be called first, to ensure that # all memory in the C++ class is initialized correctly. - arbor.recipe.__init__(self) + A.recipe.__init__(self) self.ncells = ncells - self.props = arbor.neuron_cable_properties() + self.props = A.neuron_cable_properties() # (6) The num_cells method that returns the total number of cells in the model # must be implemented. @@ -94,26 +94,26 @@ class ring_recipe(arbor.recipe): # The kind method returns the type of cell with gid. # Note: this must agree with the type returned by cell_description. def cell_kind(self, gid): - return arbor.cell_kind.cable + return A.cell_kind.cable # (8) Make a ring network. For each gid, provide a list of incoming connections. def connections_on(self, gid): src = (gid - 1) % self.ncells w = 0.01 # 0.01 μS on expsyn - d = 5 # ms delay - return [arbor.connection((src, "detector"), "syn", w, d)] + d = 5 * U.ms # delay + return [A.connection((src, "detector"), "syn", w, d)] # (9) Attach a generator to the first cell in the ring. def event_generators(self, gid): if gid == 0: - sched = arbor.explicit_schedule([1]) # one event at 1 ms + sched = A.explicit_schedule([1 * U.ms]) # one event at 1 ms weight = 0.1 # 0.1 μS on expsyn - return [arbor.event_generator("syn", weight, sched)] + return [A.event_generator("syn", weight, sched)] return [] # (10) Place a probe at the root of each cell. def probes(self, gid): - return [arbor.cable_probe_membrane_voltage('"root"')] + return [A.cable_probe_membrane_voltage('"root"')] def global_properties(self, kind): return self.props @@ -124,24 +124,24 @@ ncells = 500 recipe = ring_recipe(ncells) # (12) Create an MPI communicator, and use it to create a hardware context -arbor.mpi_init() -comm = arbor.mpi_comm() +A.mpi_init() +comm = A.mpi_comm() print(comm) -context = arbor.context(mpi=comm) +context = A.context(mpi=comm) print(context) # (13) Create a default domain decomposition and simulation -sim = arbor.simulation(recipe, context) +sim = A.simulation(recipe, context) # (14) Set spike generators to record -sim.record(arbor.spike_recording.all) +sim.record(A.spike_recording.all) # (15) Attach a sampler to the voltage probe on cell 0. Sample rate of 1 sample every ms. # Sampling period increased w.r.t network_ring.py to reduce amount of data -handles = [sim.sample((gid, 0), arbor.regular_schedule(1)) for gid in range(ncells)] +handles = [sim.sample((gid, 0), A.regular_schedule(1 * U.ms)) for gid in range(ncells)] # (16) Run simulation -sim.run(ncells * 5) +sim.run(ncells * 5 * U.ms) print("Simulation finished") # (17) Store the recorded voltages @@ -151,11 +151,11 @@ for gid in range(ncells): if len(sim.samples(handles[gid])): samples, meta = sim.samples(handles[gid])[0] df_list.append( - pandas.DataFrame( + pd.DataFrame( {"t/ms": samples[:, 0], "U/mV": samples[:, 1], "Cell": f"cell {gid}"} ) ) if len(df_list): - df = pandas.concat(df_list, ignore_index=True) + df = pd.concat(df_list, ignore_index=True) df.to_csv(f"result_mpi_{context.rank}.csv", float_format="%g") diff --git a/python/example/network_two_cells_gap_junctions.py b/python/example/network_two_cells_gap_junctions.py index 5a2db8574a2ea1838fcdb70d673233a900ece4cf..c1298230721f514f4bbd83489ef05945b04f7bee 100755 --- a/python/example/network_two_cells_gap_junctions.py +++ b/python/example/network_two_cells_gap_junctions.py @@ -1,216 +1,148 @@ #!/usr/bin/env python3 -from builtins import enumerate -import arbor -import argparse +import arbor as A +from arbor import units as U +from argparse import ArgumentParser import numpy as np - -import pandas # You may have to pip install these. -import seaborn # You may have to pip install these. +import pandas as pd # You may have to pip install these. +import seaborn as sns # You may have to pip install these. import matplotlib.pyplot as plt -class TwoCellsWithGapJunction(arbor.recipe): - def __init__( - self, probes, Vms, length, radius, cm, rL, g, gj_g, cv_policy_max_extent - ): +class TwoCellsWithGapJunction(A.recipe): + def __init__(self, Vms, length, radius, cm, rL, g, gj_g, max_extent): """ - probes -- list of probes - Vms -- membrane leak potentials of the two cells length -- length of cable in μm radius -- radius of cable in μm - cm -- membrane capacitance in F/m^2 + cm -- membrane capacitance in F/m² rL -- axial resistivity in Ω·cm - g -- membrane conductivity in S/cm^2 + g -- membrane conductivity in S/cm² gj_g -- gap junction conductivity in μS - - cv_policy_max_extent -- maximum extent of control volume in μm + max_extent -- maximum extent of control volume in μm """ - # The base C++ class constructor must be called first, to ensure that - # all memory in the C++ class is initialized correctly. - arbor.recipe.__init__(self) - - self.the_probes = probes + # Call base constructor first to ensure proper initialization + A.recipe.__init__(self) - self.Vms = Vms - self.length = length - self.radius = radius - self.cm = cm - self.rL = rL - self.g = g - self.gj_g = gj_g - - self.cv_policy_max_extent = cv_policy_max_extent - - self.the_props = arbor.neuron_cable_properties() + self.Vms = [Vm * U.mV for Vm in Vms] + self.length = length * U.um + self.radius = radius * U.um + self.area = self.length * 2 * np.pi * self.radius + self.cm = cm * U.F / U.m2 + self.rL = rL * U.Ohm * U.cm + self.g = g * U.S / U.cm2 + self.gj_g = gj_g * U.uS + self.max_extent = max_extent + self.the_props = A.neuron_cable_properties() def num_cells(self): return 2 - def cell_kind(self, gid): - assert gid in [0, 1] - return arbor.cell_kind.cable + def cell_kind(self, _): + return A.cell_kind.cable - def global_properties(self, kind): - assert kind == arbor.cell_kind.cable + def global_properties(self, _): return self.the_props def cell_description(self, gid): - """A high level description of the cell with global identifier gid. + tree = A.segment_tree() + r, l = self.radius.value, self.length.value + tree.append(A.mnpos, (0, 0, 0, r), (l, 0, 0, r), tag=1) - For example the morphology, synapses and ion channels required - to build a multi-compartment neuron. - """ - assert gid in [0, 1] - - tree = arbor.segment_tree() - - tree.append( - arbor.mnpos, - arbor.mpoint(0, 0, 0, self.radius), - arbor.mpoint(self.length, 0, 0, self.radius), - tag=1, - ) - - labels = arbor.label_dict({"cell": "(tag 1)", "gj_site": "(location 0 0.5)"}) + labels = A.label_dict({"midpoint": "(location 0 0.5)"}) decor = ( - arbor.decor() - .set_property(Vm=self.Vms[gid]) - .set_property(cm=self.cm) - .set_property(rL=self.rL) - # add a gap junction mechanism at the "gj_site" location and label that specific mechanism on that location "gj_label" - .place('"gj_site"', arbor.junction("gj", g=self.gj_g), "gj_label") - .paint('"cell"', arbor.density(f"pas/e={self.Vms[gid]}", g=self.g)) + A.decor() + .set_property(Vm=self.Vms[gid], cm=self.cm, rL=self.rL) + .place('"midpoint"', A.junction("gj", g=self.gj_g.value), "gj") + .paint("(all)", A.density(f"pas/e={self.Vms[gid].value}", g=self.g.value)) ) - if self.cv_policy_max_extent is not None: - policy = arbor.cv_policy_max_extent(self.cv_policy_max_extent) - decor.discretization(policy) + if self.max_extent is not None: + decor.discretization(A.cv_policy_max_extent(self.max_extent)) else: - decor.discretization(arbor.cv_policy_single()) + decor.discretization(A.cv_policy_single()) - return arbor.cable_cell(tree, decor, labels) + return A.cable_cell(tree, decor, labels) def gap_junctions_on(self, gid): - # create a bidirectional gap junction from cell 0 at label "gj_label" to cell 1 at label "gj_label" and back. - if gid == 0: - tgt = 1 - elif gid == 1: - tgt = 0 - else: - raise RuntimeError("Invalid GID for example.") - return [arbor.gap_junction_connection((tgt, "gj_label"), "gj_label", 1)] - - def probes(self, gid): - assert gid in [0, 1] - return self.the_probes - - -if __name__ == "__main__": - parser = argparse.ArgumentParser( - description="Two cells connected via a gap junction" + return [A.gap_junction_connection(((gid + 1) % 2, "gj"), "gj", 1)] + + def probes(self, _): + return [A.cable_probe_membrane_voltage('"midpoint"', "Um")] + + +# parse the command line arguments +parser = ArgumentParser(description="Two cells connected via a gap junction") + +parser.add_argument( + "--Vms", + help="membrane leak potentials [mV]", + type=float, + default=[-100, -60], + nargs=2, +) +parser.add_argument("--length", help="cell length [μm]", type=float, default=100) +parser.add_argument("--radius", help="cell radius [μm]", type=float, default=3) +parser.add_argument( + "--cm", help="membrane capacitance [F/m²]", type=float, default=0.005 +) +parser.add_argument("--rL", help="axial resistivity [Ω·cm]", type=float, default=90) +parser.add_argument("--g", help="leak conductivity [S/cm²]", type=float, default=0.001) +parser.add_argument( + "--gj_g", help="gap junction conductivity [μS]", type=float, default=0.01 +) +parser.add_argument("--max-extent", help="discretization length [μm]", type=float) + +args = parser.parse_args() + +# set up membrane voltage probes at the position of the gap junction +rec = TwoCellsWithGapJunction(**vars(args)) + +# configure the simulation and handles for the probes +sim = A.simulation(rec) + +T = 5 * U.ms +dt = 0.01 * U.ms + +# generate handles for all probes and gids. +handles = [sim.sample((gid, "Um"), A.regular_schedule(dt)) for gid in [0, 1]] + +# run the simulation +sim.run(tfinal=T, dt=dt) + +# retrieve the sampled membrane voltages +print("Plotting results ...") +df_list = [] +for gid, handle in enumerate(handles): + data, meta = sim.samples(handle)[0] + df_list.append( + pd.DataFrame({"t/ms": data[:, 0], "U/mV": data[:, 1], "Cell": f"{gid}"}) ) +df = pd.concat(df_list, ignore_index=True) - parser.add_argument( - "--Vms", - help="membrane leak potentials in mV", - type=float, - default=[-100, -60], - nargs=2, - ) - parser.add_argument("--length", help="cell length in μm", type=float, default=100) - parser.add_argument("--radius", help="cell radius in μm", type=float, default=3) - parser.add_argument( - "--cm", help="membrane capacitance in F/m^2", type=float, default=0.005 - ) - parser.add_argument( - "--rL", help="axial resistivity in Ω·cm", type=float, default=90 - ) - parser.add_argument( - "--g", help="membrane conductivity in S/cm^2", type=float, default=0.001 - ) +# plot the membrane potentials of the two cells as function of time +fg, ax = plt.subplots() +sns.lineplot(ax=ax, data=df, x="t/ms", y="U/mV", hue="Cell", errorbar=None) - parser.add_argument( - "--gj_g", help="gap junction conductivity in μS", type=float, default=0.01 - ) +# use total and gap junction conductance to compute weight +w = (rec.gj_g + rec.area * rec.g) / (2 * rec.gj_g + rec.area * rec.g) - parser.add_argument( - "--cv_policy_max_extent", - help="maximum extent of control volume in μm", - type=float, - ) - # parse the command line arguments - args = parser.parse_args() - - # set up membrane voltage probes at the position of the gap junction - probes = [arbor.cable_probe_membrane_voltage('"gj_site"', "Um")] - recipe = TwoCellsWithGapJunction(probes, **vars(args)) - - # configure the simulation and handles for the probes - sim = arbor.simulation(recipe) - - T = 5 - dt = 0.01 - handles = [ - sim.sample((gid, "Um"), arbor.regular_schedule(dt)) - for i, _ in enumerate(probes) - for gid in range(recipe.num_cells()) - ] - - # run the simulation for 5 ms - sim.run(tfinal=T, dt=dt) - - # retrieve the sampled membrane voltages and convert to a pandas DataFrame - print("Plotting results ...") - df_list = [] - for probe, handle in enumerate(handles): - samples, meta = sim.samples(handle)[0] - df_list.append( - pandas.DataFrame( - {"t/ms": samples[:, 0], "U/mV": samples[:, 1], "Cell": f"{probe}"} - ) - ) - df = pandas.concat(df_list, ignore_index=True) - - fig, ax = plt.subplots() - - # plot the membrane potentials of the two cells as function of time - seaborn.lineplot(ax=ax, data=df, x="t/ms", y="U/mV", hue="Cell", errorbar=None) - - # area of cells - area = args.length * 1e-6 * 2 * np.pi * args.radius * 1e-6 - - # total and gap junction conductance in base units - cell_g = area * args.g / 1e-4 - si_gj_g = args.gj_g * 1e-6 - - # weight - w = (si_gj_g + cell_g) / (2 * si_gj_g + cell_g) - - # indicate the expected equilibrium potentials - for i, j in [[0, 1], [1, 0]]: - weighted_potential = args.Vms[i] + w * (args.Vms[j] - args.Vms[i]) - ax.axhline(weighted_potential, linestyle="dashed", color="black", alpha=0.5) - ax.text( - 2, - weighted_potential, - f"$\\tilde U_{j} = U_{j} + w\\cdot(U_{j} - U_{i})$", - va="center", - ha="center", - backgroundcolor="w", - ) - ax.text( - 2, args.Vms[j], f"$U_{j}$", va="center", ha="center", backgroundcolor="w" - ) +# indicate the expected equilibrium potentials +def note(ax, x, y, txt): + ax.text(x, y, txt, va="center", ha="center", backgroundcolor="w") + - ax.set_xlim(0, T) +for i, j in [[0, 1], [1, 0]]: + Vj, Vi = args.Vms[j], args.Vms[i] + Vw = Vi + w.value * (Vj - Vi) + ax.axhline(Vi, linestyle="dashed", color="black", alpha=0.5) + ax.axhline(Vw, linestyle="dashed", color="black", alpha=0.5) + note(ax, 2, Vw, rf"$\tilde U_{j} = U_{j} + w\cdot(U_{j} - U_{i})$") + note(ax, 2, Vj, rf"$U_{j}$") - # plot the initial/nominal resting potentials - for gid, Vm in enumerate(args.Vms): - ax.axhline(Vm, linestyle="dashed", color="black", alpha=0.5) +ax.set_xlim(0, T.value) - fig.savefig("two_cell_gap_junctions_result.svg") +fg.savefig("two_cell_gap_junctions_result.svg") diff --git a/python/example/ou_lif/ou_lif.py b/python/example/ou_lif/ou_lif.py index dde3240480753a21be2031080406f6829dcba972..fe992a14c7ee59ac05060b6e641e602855dba076 100644 --- a/python/example/ou_lif/ou_lif.py +++ b/python/example/ou_lif/ou_lif.py @@ -4,7 +4,8 @@ import random import subprocess -import arbor as arb +import arbor as A +from arbor import units as U import numpy as np import matplotlib.pyplot as plt @@ -14,8 +15,8 @@ def make_catalogue(): out = subprocess.getoutput("arbor-build-catalogue ou_lif . --cpu True") print(out) # load the new catalogue and extend it with builtin stochastic catalogue - cat = arb.load_catalogue("./ou_lif-catalogue.so") - cat.extend(arb.stochastic_catalogue(), "") + cat = A.load_catalogue("./ou_lif-catalogue.so") + cat.extend(A.stochastic_catalogue(), "") return cat @@ -23,16 +24,16 @@ def make_cell(): # cell morphology # =============== - tree = arb.segment_tree() + tree = A.segment_tree() radius = 1e-10 # radius of cylinder (in µm) height = 2 * radius # height of cylinder (in µm) tree.append( - arb.mnpos, - arb.mpoint(-height / 2, 0, 0, radius), - arb.mpoint(height / 2, 0, 0, radius), + A.mnpos, + A.mpoint(-height / 2, 0, 0, radius), + A.mpoint(height / 2, 0, 0, radius), tag=1, ) - labels = arb.label_dict({"center": "(location 0 0.5)"}) + labels = A.label_dict({"center": "(location 0 0.5)"}) # LIF density mechanism # ===================== @@ -50,7 +51,7 @@ def make_cell(): # reversal potential in mV V_rev = -65.0 # spiking threshold in mV - V_th = -55.0 + V_th = -55.0 * U.mV # initial synaptic weight in nC h_0 = 4.20075 # leak resistance in MOhm @@ -58,7 +59,7 @@ def make_cell(): # membrane time constant in ms tau_mem = 2.0 - lif = arb.mechanism("lif") + lif = A.mechanism("lif") lif.set("R_leak", R_leak) lif.set("R_reset", 1e-10) # set to initial value to zero (background input is applied via stochastic ou_bg_mech) @@ -66,7 +67,7 @@ def make_cell(): lif.set("i_factor", i_factor) lif.set("V_rev", V_rev) lif.set("V_reset", -70.0) - lif.set("V_th", V_th) + lif.set("V_th", V_th.value_as(U.mV)) # refractory time in ms lif.set("t_ref", tau_mem) @@ -80,7 +81,7 @@ def make_cell(): # volatility in nA sigma_bg = 0.5 # instantiate mechanism - ou_bg = arb.mechanism("ou_input") + ou_bg = A.mechanism("ou_input") ou_bg.set("mu", mu_bg) ou_bg.set("sigma", sigma_bg) ou_bg.set("tau", tau_syn) @@ -99,7 +100,7 @@ def make_cell(): # volatility in nA sigma_stim = np.sqrt((1000.0 * N * f) / (2 * tau_syn)) * w_out # instantiate mechanism - ou_stim = arb.mechanism("ou_input") + ou_stim = A.mechanism("ou_input") ou_stim.set("mu", mu_stim) ou_stim.set("sigma", sigma_stim) ou_stim.set("tau", tau_syn) @@ -107,26 +108,26 @@ def make_cell(): # paint and place mechanisms # ========================== - decor = arb.decor() - decor.set_property(Vm=V_rev, cm=c_mem) - decor.paint("(all)", arb.density(lif)) - decor.place('"center"', arb.synapse(ou_stim), "ou_stim") - decor.place('"center"', arb.synapse(ou_bg), "ou_bg") - decor.place('"center"', arb.threshold_detector(V_th), "spike_detector") + decor = A.decor() + decor.set_property(Vm=V_rev * U.mV, cm=c_mem * U.Ohm * U.cm) + decor.paint("(all)", A.density(lif)) + decor.place('"center"', A.synapse(ou_stim), "ou_stim") + decor.place('"center"', A.synapse(ou_bg), "ou_bg") + decor.place('"center"', A.threshold_detector(V_th), "spike_detector") - return arb.cable_cell(tree, decor, labels) + return A.cable_cell(tree, decor, labels) -class ou_recipe(arb.recipe): +class ou_recipe(A.recipe): def __init__(self, cell, cat): - arb.recipe.__init__(self) + A.recipe.__init__(self) # simulation runtime parameters in ms - self.runtime = 20000 - self.dt = 0.2 + self.runtime = 20 * U.s + self.dt = 0.2 * U.ms # initialize catalogue and cell properties - self.the_props = arb.neuron_cable_properties() + self.the_props = A.neuron_cable_properties() self.the_props.catalogue = cat self.the_cell = cell @@ -141,7 +142,7 @@ class ou_recipe(arb.recipe): } def cell_kind(self, gid): - return arb.cell_kind.cable + return A.cell_kind.cable def cell_description(self, gid): return self.the_cell @@ -155,9 +156,9 @@ class ou_recipe(arb.recipe): def probes(self, gid): # probe membrane potential, total current, and external input currents return [ - arb.cable_probe_membrane_voltage('"center"'), - arb.cable_probe_total_ion_current_cell(), - arb.cable_probe_point_state_cell("ou_input", "I_ou"), + A.cable_probe_membrane_voltage('"center"', "Um"), + A.cable_probe_total_ion_current_cell("Itot"), + A.cable_probe_point_state_cell("ou_input", "I_ou", "Iou"), ] def event_generators(self, gid): @@ -170,81 +171,83 @@ class ou_recipe(arb.recipe): gens.extend(self.get_generators(self.bg_prot)) return gens - # Returns arb.event_generator instances that describe the specifics of a given + # Returns A.event_generator instances that describe the specifics of a given # input/stimulation protocol for a mechanism implementing an Ornstein-Uhlenbeck process. # Here, if the value of the 'weight' parameter is 1, stimulation is switched on, # whereas if it is -1, stimulation is switched off. def get_generators(self, protocol): prot_name = protocol["scheme"] # name of the protocol (defining its structure) - start_time = protocol["time_start"] # time at which the stimulus starts in s + start_time = ( + protocol["time_start"] * U.ms + ) # time at which the stimulus starts in ms label = protocol["label"] # target synapse (mechanism label) if prot_name == "ONEPULSE": # create regular schedules to implement a stimulation pulse that lasts for 0.1 s - stim_on = arb.event_generator( + stim_on = A.event_generator( label, 1, - arb.regular_schedule(start_time, self.dt, start_time + self.dt), + A.regular_schedule(start_time, self.dt, start_time + self.dt), ) - stim_off = arb.event_generator( + stim_off = A.event_generator( label, -1, - arb.regular_schedule( - start_time + 100, self.dt, start_time + 100 + self.dt + A.regular_schedule( + start_time + 0.1 * U.s, self.dt, start_time + 0.1 * U.s + self.dt ), ) return [stim_on, stim_off] elif prot_name == "TRIPLET": # create regular schedules to implement pulses that last for 0.1 s each - stim1_on = arb.event_generator( + stim1_on = A.event_generator( label, 1, - arb.regular_schedule(start_time, self.dt, start_time + self.dt), + A.regular_schedule(start_time, self.dt, start_time + self.dt), ) - stim1_off = arb.event_generator( + stim1_off = A.event_generator( label, -1, - arb.regular_schedule( - start_time + 100, self.dt, start_time + 100 + self.dt + A.regular_schedule( + start_time + 0.1 * U.s, self.dt, start_time + 0.1 * U.s + self.dt ), ) - stim2_on = arb.event_generator( + stim2_on = A.event_generator( label, 1, - arb.regular_schedule( - start_time + 500, self.dt, start_time + 500 + self.dt + A.regular_schedule( + start_time + 0.5 * U.s, self.dt, start_time + 0.5 * U.s + self.dt ), ) - stim2_off = arb.event_generator( + stim2_off = A.event_generator( label, -1, - arb.regular_schedule( - start_time + 600, self.dt, start_time + 600 + self.dt + A.regular_schedule( + start_time + 0.6 * U.s, self.dt, start_time + 0.6 * U.s + self.dt ), ) - stim3_on = arb.event_generator( + stim3_on = A.event_generator( label, 1, - arb.regular_schedule( - start_time + 1000, self.dt, start_time + 1000 + self.dt + A.regular_schedule( + start_time + 1 * U.s, self.dt, start_time + 1 * U.s + self.dt ), ) - stim3_off = arb.event_generator( + stim3_off = A.event_generator( label, -1, - arb.regular_schedule( - start_time + 1100, self.dt, start_time + 1100 + self.dt + A.regular_schedule( + start_time + 1.1 * U.s, self.dt, start_time + 1.1 * U.s + self.dt ), ) return [stim1_on, stim1_off, stim2_on, stim2_off, stim3_on, stim3_off] elif prot_name == "FULL": # create a regular schedule that lasts for the full runtime - stim_on = arb.event_generator( + stim_on = A.event_generator( label, 1, - arb.regular_schedule(start_time, self.dt, start_time + self.dt), + A.regular_schedule(start_time, self.dt, start_time + self.dt), ) return [stim_on] @@ -266,23 +269,23 @@ if __name__ == "__main__": print("random_seed = " + str(random_seed)) # select one thread and no GPU - alloc = arb.proc_allocation(threads=1, gpu_id=None) - context = arb.context(alloc, mpi=None) - domains = arb.partition_load_balance(recipe, context) + alloc = A.proc_allocation(threads=1, gpu_id=None) + context = A.context(alloc, mpi=None) + domains = A.partition_load_balance(recipe, context) # create simulation - sim = arb.simulation(recipe, context, domains, seed=random_seed) + sim = A.simulation(recipe, context, domains, seed=random_seed) # create schedule for recording - reg_sched = arb.regular_schedule(0, recipe.dt, recipe.runtime) + reg_sched = A.regular_schedule(0 * U.ms, recipe.dt, recipe.runtime) # set handles to probe membrane potential and currents gid = 0 - handle_mem = sim.sample((gid, 0), reg_sched) # membrane potential - handle_tot_curr = sim.sample((gid, 1), reg_sched) # total current - handle_curr = sim.sample((gid, 2), reg_sched) # input current + handle_mem = sim.sample((gid, "Um"), reg_sched) # membrane potential + handle_tot_curr = sim.sample((gid, "Itot"), reg_sched) # total current + handle_curr = sim.sample((gid, "Iou"), reg_sched) # input current - sim.record(arb.spike_recording.all) + sim.record(A.spike_recording.all) sim.run(tfinal=recipe.runtime, dt=recipe.dt) # get traces and spikes from simulator diff --git a/python/example/ou_lif/traces.svg b/python/example/ou_lif/traces.svg index 13a3c49c53c81a7fb3f56af40aad109ed9fe0548..b9a3a5c87667e465992117273f45d9870648a1fc 100644 --- a/python/example/ou_lif/traces.svg +++ b/python/example/ou_lif/traces.svg @@ -1,16 +1,16 @@ <?xml version="1.0" encoding="utf-8" standalone="no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="712.465pt" height="712.474375pt" viewBox="0 0 712.465 712.474375" xmlns="http://www.w3.org/2000/svg" version="1.1"> +<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="712.25125pt" height="711.754375pt" viewBox="0 0 712.25125 711.754375" xmlns="http://www.w3.org/2000/svg" version="1.1"> <metadata> <rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <cc:Work> <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/> - <dc:date>2022-11-09T15:50:52.860599</dc:date> + <dc:date>2023-11-30T19:09:25.458406</dc:date> <dc:format>image/svg+xml</dc:format> <dc:creator> <cc:Agent> - <dc:title>Matplotlib v3.6.1, https://matplotlib.org/</dc:title> + <dc:title>Matplotlib v3.7.1, https://matplotlib.org/</dc:title> </cc:Agent> </dc:creator> </cc:Work> @@ -21,18 +21,18 @@ </defs> <g id="figure_1"> <g id="patch_1"> - <path d="M 0 712.474375 -L 712.465 712.474375 -L 712.465 0 + <path d="M 0 711.754375 +L 712.25125 711.754375 +L 712.25125 0 L 0 0 z " style="fill: #ffffff"/> </g> <g id="axes_1"> <g id="patch_2"> - <path d="M 53.60625 156.368125 -L 705.265 156.368125 -L 705.265 22.318125 + <path d="M 53.60625 156.188125 +L 705.05125 156.188125 +L 705.05125 22.318125 L 53.60625 22.318125 z " style="fill: #ffffff"/> @@ -41,17 +41,17 @@ z <g id="xtick_1"> <g id="line2d_1"> <defs> - <path id="m1e6abe93e8" d="M 0 0 + <path id="m3a57de642d" d="M 0 0 L 0 3.5 " style="stroke: #000000; stroke-width: 0.8"/> </defs> <g> - <use xlink:href="#m1e6abe93e8" x="83.227102" y="156.368125" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m3a57de642d" x="83.217386" y="156.188125" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_1"> <!-- 0 --> - <g transform="translate(80.045852 170.966563) scale(0.1 -0.1)"> + <g transform="translate(80.036136 170.786562) scale(0.1 -0.1)"> <defs> <path id="DejaVuSans-30" d="M 2034 4250 Q 1547 4250 1301 3770 @@ -82,12 +82,12 @@ z <g id="xtick_2"> <g id="line2d_2"> <g> - <use xlink:href="#m1e6abe93e8" x="157.280714" y="156.368125" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m3a57de642d" x="157.245968" y="156.188125" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_2"> <!-- 2500 --> - <g transform="translate(144.555714 170.966563) scale(0.1 -0.1)"> + <g transform="translate(144.520968 170.786562) scale(0.1 -0.1)"> <defs> <path id="DejaVuSans-32" d="M 1228 531 L 3431 531 @@ -149,12 +149,12 @@ z <g id="xtick_3"> <g id="line2d_3"> <g> - <use xlink:href="#m1e6abe93e8" x="231.334326" y="156.368125" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m3a57de642d" x="231.274549" y="156.188125" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_3"> <!-- 5000 --> - <g transform="translate(218.609326 170.966563) scale(0.1 -0.1)"> + <g transform="translate(218.549549 170.786562) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-35"/> <use xlink:href="#DejaVuSans-30" x="63.623047"/> <use xlink:href="#DejaVuSans-30" x="127.246094"/> @@ -165,12 +165,12 @@ z <g id="xtick_4"> <g id="line2d_4"> <g> - <use xlink:href="#m1e6abe93e8" x="305.387938" y="156.368125" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m3a57de642d" x="305.30313" y="156.188125" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_4"> <!-- 7500 --> - <g transform="translate(292.662938 170.966563) scale(0.1 -0.1)"> + <g transform="translate(292.57813 170.786562) scale(0.1 -0.1)"> <defs> <path id="DejaVuSans-37" d="M 525 4666 L 3525 4666 @@ -193,12 +193,12 @@ z <g id="xtick_5"> <g id="line2d_5"> <g> - <use xlink:href="#m1e6abe93e8" x="379.441549" y="156.368125" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m3a57de642d" x="379.331711" y="156.188125" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_5"> <!-- 10000 --> - <g transform="translate(363.535299 170.966563) scale(0.1 -0.1)"> + <g transform="translate(363.425461 170.786562) scale(0.1 -0.1)"> <defs> <path id="DejaVuSans-31" d="M 794 531 L 1825 531 @@ -226,12 +226,12 @@ z <g id="xtick_6"> <g id="line2d_6"> <g> - <use xlink:href="#m1e6abe93e8" x="453.495161" y="156.368125" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m3a57de642d" x="453.360292" y="156.188125" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_6"> <!-- 12500 --> - <g transform="translate(437.588911 170.966563) scale(0.1 -0.1)"> + <g transform="translate(437.454042 170.786562) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-31"/> <use xlink:href="#DejaVuSans-32" x="63.623047"/> <use xlink:href="#DejaVuSans-35" x="127.246094"/> @@ -243,12 +243,12 @@ z <g id="xtick_7"> <g id="line2d_7"> <g> - <use xlink:href="#m1e6abe93e8" x="527.548773" y="156.368125" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m3a57de642d" x="527.388874" y="156.188125" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_7"> <!-- 15000 --> - <g transform="translate(511.642523 170.966563) scale(0.1 -0.1)"> + <g transform="translate(511.482624 170.786562) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-31"/> <use xlink:href="#DejaVuSans-35" x="63.623047"/> <use xlink:href="#DejaVuSans-30" x="127.246094"/> @@ -260,12 +260,12 @@ z <g id="xtick_8"> <g id="line2d_8"> <g> - <use xlink:href="#m1e6abe93e8" x="601.602385" y="156.368125" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m3a57de642d" x="601.417455" y="156.188125" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_8"> <!-- 17500 --> - <g transform="translate(585.696135 170.966563) scale(0.1 -0.1)"> + <g transform="translate(585.511205 170.786562) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-31"/> <use xlink:href="#DejaVuSans-37" x="63.623047"/> <use xlink:href="#DejaVuSans-35" x="127.246094"/> @@ -277,12 +277,12 @@ z <g id="xtick_9"> <g id="line2d_9"> <g> - <use xlink:href="#m1e6abe93e8" x="675.655996" y="156.368125" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m3a57de642d" x="675.446036" y="156.188125" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_9"> <!-- 20000 --> - <g transform="translate(659.749746 170.966563) scale(0.1 -0.1)"> + <g transform="translate(659.539786 170.786562) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-32"/> <use xlink:href="#DejaVuSans-30" x="63.623047"/> <use xlink:href="#DejaVuSans-30" x="127.246094"/> @@ -296,17 +296,17 @@ z <g id="ytick_1"> <g id="line2d_10"> <defs> - <path id="md51da362c2" d="M 0 0 + <path id="m1f66c02d2f" d="M 0 0 L -3.5 0 " style="stroke: #000000; stroke-width: 0.8"/> </defs> <g> - <use xlink:href="#md51da362c2" x="53.60625" y="119.712858" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m1f66c02d2f" x="53.60625" y="121.427109" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_10"> <!-- 0 --> - <g transform="translate(40.24375 123.512077) scale(0.1 -0.1)"> + <g transform="translate(40.24375 125.226327) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-30"/> </g> </g> @@ -314,12 +314,12 @@ L -3.5 0 <g id="ytick_2"> <g id="line2d_11"> <g> - <use xlink:href="#md51da362c2" x="53.60625" y="78.601523" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m1f66c02d2f" x="53.60625" y="83.084973" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_11"> <!-- 100 --> - <g transform="translate(27.51875 82.400742) scale(0.1 -0.1)"> + <g transform="translate(27.51875 86.884192) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-31"/> <use xlink:href="#DejaVuSans-30" x="63.623047"/> <use xlink:href="#DejaVuSans-30" x="127.246094"/> @@ -329,12 +329,12 @@ L -3.5 0 <g id="ytick_3"> <g id="line2d_12"> <g> - <use xlink:href="#md51da362c2" x="53.60625" y="37.490188" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m1f66c02d2f" x="53.60625" y="44.742838" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_12"> <!-- 200 --> - <g transform="translate(27.51875 41.289407) scale(0.1 -0.1)"> + <g transform="translate(27.51875 48.542057) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-32"/> <use xlink:href="#DejaVuSans-30" x="63.623047"/> <use xlink:href="#DejaVuSans-30" x="127.246094"/> @@ -343,7 +343,7 @@ L -3.5 0 </g> <g id="text_13"> <!-- V (mV) --> - <g transform="translate(21.439062 106.544688) rotate(-90) scale(0.1 -0.1)"> + <g transform="translate(21.439062 106.454687) rotate(-90) scale(0.1 -0.1)"> <defs> <path id="DejaVuSans-56" d="M 1831 0 L 50 4666 @@ -423,6007 +423,5762 @@ z </g> </g> <g id="line2d_13"> - <path d="M 83.227102 146.435226 -L 83.345588 145.941461 -L 83.375209 145.789607 -L 83.422604 146.146307 -L 83.588484 146.744954 -L 83.6655 146.97064 -L 83.695121 147.103152 -L 83.760288 146.828585 -L 83.949866 145.558749 -L 84.044654 145.870914 -L 84.109821 146.336797 -L 84.174989 146.035635 -L 84.252004 145.754317 -L 84.317171 145.865646 -L 84.323096 145.855004 -L 84.37049 145.996344 -L 84.417884 146.291829 -L 84.500824 146.573502 -L 84.53637 146.371762 -L 84.720023 145.158735 -L 84.791115 145.232093 -L 84.99254 145.713149 -L 85.03401 145.544445 -L 85.229512 144.71626 -L 85.241361 144.76638 -L 85.401316 145.776786 -L 85.537575 146.799816 -L 85.608666 146.597516 -L 85.774547 146.209824 -L 85.827865 145.953008 -L 85.928578 145.813282 -L 85.946351 145.866956 -L 86.112231 146.979139 -L 86.20702 146.604633 -L 86.218868 146.57541 -L 86.260338 146.815331 -L 86.284035 146.897333 -L 86.343278 146.694067 -L 86.651341 145.221244 -L 86.698736 145.328796 -L 86.775751 145.409138 -L 86.799449 145.304029 -L 87.24377 143.771512 -L 87.279316 143.836233 -L 87.356332 143.625629 -L 87.439272 143.83391 -L 87.611076 144.181794 -L 87.640698 144.137892 -L 87.717713 144.020147 -L 87.759183 144.095285 -L 87.942836 144.88371 -L 88.002079 144.664573 -L 88.280521 142.696763 -L 88.345688 143.0217 -L 88.387158 143.237344 -L 88.760388 145.237341 -L 88.795934 145.156402 -L 88.837404 145.149001 -L 88.855177 145.247062 -L 88.985511 145.874651 -L 89.03883 145.811573 -L 89.062527 145.732817 -L 89.157316 145.780677 -L 89.192861 145.735191 -L 89.228407 145.885684 -L 89.613486 147.944664 -L 89.649031 148.052062 -L 89.70235 148.167001 -L 89.737896 147.99547 -L 90.028186 146.55354 -L 90.040035 146.556473 -L 90.063732 146.587936 -L 90.099277 146.452883 -L 90.19999 146.219464 -L 90.24146 146.371558 -L 90.253309 146.394472 -L 90.294779 146.205138 -L 90.472508 145.523245 -L 90.508053 145.739888 -L 90.632463 146.429002 -L 90.668009 146.301417 -L 90.928678 144.911755 -L 90.958299 144.995155 -L 91.023467 145.27893 -L 91.088634 145.072811 -L 91.260438 143.687898 -L 91.355227 144.029995 -L 91.698835 146.243888 -L 91.728457 146.356609 -L 91.799548 146.733118 -L 91.87064 146.603858 -L 91.947656 146.357404 -L 92.024671 146.436098 -L 92.030596 146.447685 -L 92.060217 146.280077 -L 92.196476 145.296561 -L 92.261643 145.609665 -L 92.49269 146.24103 -L 92.498614 146.239459 -L 92.522312 146.246125 -L 92.540084 146.32206 -L 92.557857 146.354616 -L 92.6171 146.237197 -L 92.628949 146.243651 -L 92.682267 146.187152 -L 92.688192 146.15689 -L 92.836299 145.686333 -L 92.871845 145.73965 -L 93.328015 148.065655 -L 93.345788 148.064125 -L 93.381334 148.179999 -L 93.422804 148.234809 -L 93.458349 148.102326 -L 93.713094 146.343832 -L 93.772337 146.380944 -L 93.855277 146.283888 -L 93.890822 146.183973 -L 93.967838 146.282958 -L 94.157415 146.515014 -L 94.441781 147.697419 -L 94.57804 148.262391 -L 94.595813 148.220375 -L 94.649131 147.978451 -L 94.862406 147.190441 -L 94.957194 147.022129 -L 94.998664 147.101227 -L 95.105302 147.422494 -L 95.140847 147.296262 -L 95.460759 144.996778 -L 95.49038 145.07164 -L 95.57332 145.410194 -L 95.674033 145.527556 -L 95.691806 145.472259 -L 95.756973 145.452798 -L 95.768822 145.506498 -L 95.857686 146.191323 -L 95.916929 145.982119 -L 96.153901 145.077562 -L 96.254614 144.9625 -L 96.509358 144.171457 -L 96.544904 144.296019 -L 96.592298 144.37057 -L 96.62192 144.220496 -L 96.645617 144.129691 -L 96.693011 144.421864 -L 96.971453 146.227619 -L 97.042544 146.461402 -L 97.196576 146.989304 -L 97.238046 147.158763 -L 97.303213 146.994943 -L 97.646822 145.672532 -L 97.812702 145.167806 -L 97.860096 144.863627 -L 97.943036 144.958486 -L 98.203705 144.381904 -L 98.002279 145.034306 -L 98.274796 144.65653 -L 98.600632 146.072749 -L 98.636178 145.92793 -L 98.707269 145.36613 -L 98.790209 145.523297 -L 98.950165 145.363096 -L 98.973862 145.510518 -L 99.240455 146.94617 -L 99.281925 146.850636 -L 99.347092 146.720515 -L 99.406335 146.788628 -L 99.483351 146.880778 -L 99.501124 146.755843 -L 99.637383 146.101638 -L 99.726247 145.689238 -L 99.773641 145.904627 -L 99.809187 146.023682 -L 99.862506 145.867791 -L 99.9099 145.656823 -L 99.99284 145.716781 -L 100.152796 146.548748 -L 100.247584 147.161492 -L 100.3246 146.93959 -L 100.496405 146.23122 -L 100.555647 146.467989 -L 100.78077 147.219496 -L 100.792619 147.18055 -L 100.911105 146.596905 -L 100.988121 146.799885 -L 101.029591 146.706968 -L 101.627944 143.362653 -L 101.710884 143.629808 -L 101.817521 144.595202 -L 101.882688 144.988241 -L 101.95378 144.862311 -L 102.007098 144.807288 -L 102.042644 144.900919 -L 102.167054 145.703589 -L 102.24407 145.489088 -L 102.510663 144.568996 -L 102.563981 144.768042 -L 102.74171 145.950349 -L 102.830574 145.795332 -L 103.032 145.572707 -L 103.061622 145.71172 -L 103.227502 147.799279 -L 103.369685 149.025682 -L 103.393382 148.909381 -L 103.547413 147.445532 -L 103.636278 146.831928 -L 103.689596 147.089585 -L 103.867325 148.020161 -L 103.914719 147.85874 -L 104.163539 145.761262 -L 104.199085 145.897061 -L 104.205009 145.902404 -L 104.252404 145.808634 -L 104.524921 145.02648 -L 104.673028 144.868386 -L 104.696725 144.865321 -L 104.720423 144.950148 -L 105.342473 147.867889 -L 105.419489 147.580216 -L 105.484656 147.345573 -L 105.61499 146.800185 -L 105.644612 146.833579 -L 105.69793 146.887612 -L 105.709779 146.909163 -L 105.733476 146.934864 -L 105.763097 146.769528 -L 105.90528 146.026995 -L 105.928977 146.069947 -L 106.106706 146.561798 -L 106.118555 146.545238 -L 106.302208 145.861612 -L 106.373299 145.918434 -L 106.936107 147.676066 -L 106.977577 147.512125 -L 107.173078 146.345786 -L 107.41005 144.927339 -L 107.445595 144.986489 -L 107.682567 146.014493 -L 107.771431 146.131222 -L 107.789204 146.164506 -L 107.82475 145.956028 -L 107.925463 145.632009 -L 107.972857 145.769422 -L 108.251299 147.278453 -L 108.292769 147.131563 -L 108.476422 146.424873 -L 108.500119 146.360272 -L 108.535665 146.543199 -L 108.642302 147.077159 -L 108.683772 146.791423 -L 108.814106 146.42872 -L 108.837803 146.485716 -L 108.879273 146.586085 -L 108.914819 146.412205 -L 108.974062 146.196381 -L 109.033305 146.378748 -L 109.282125 147.017409 -L 109.305822 146.953133 -L 109.625734 145.820191 -L 109.667204 146.001499 -L 109.720522 146.236434 -L 109.773841 145.996479 -L 109.78569 145.970584 -L 109.821235 146.184624 -L 110.093753 147.115279 -L 110.099677 147.109815 -L 110.170768 146.620543 -L 110.44921 145.059329 -L 110.455134 145.06602 -L 110.508453 144.941241 -L 110.65656 144.824215 -L 110.662484 144.834537 -L 110.828364 145.170324 -L 110.852062 145.113241 -L 110.923153 144.993256 -L 110.958699 145.123994 -L 111.284535 146.249201 -L 111.343778 146.096075 -L 111.568901 145.792552 -L 111.622219 145.98144 -L 111.645916 146.029708 -L 111.711083 145.883702 -L 111.906585 145.168124 -L 111.936206 145.221892 -L 112.078389 146.380138 -L 112.202799 147.518562 -L 112.256118 147.456743 -L 112.279815 147.415127 -L 112.321285 147.56708 -L 112.350907 147.671944 -L 112.416074 147.506026 -L 112.647121 147.10229 -L 112.688591 147.180811 -L 112.718213 147.236689 -L 112.759683 147.037613 -L 112.795228 147.016044 -L 112.818926 147.075245 -L 112.860396 147.077728 -L 112.895941 147.11678 -L 112.919638 147.008896 -L 113.132913 145.761533 -L 113.192156 145.802179 -L 113.565386 144.850876 -L 113.630553 144.990263 -L 113.974162 145.553486 -L 114.222982 146.384136 -L 114.246679 146.454079 -L 114.406635 146.809647 -L 114.436256 146.680793 -L 114.548818 146.133914 -L 114.596212 146.290686 -L 114.720622 146.908945 -L 114.756168 146.741036 -L 114.963518 145.961242 -L 115.016837 146.097217 -L 115.265657 146.894133 -L 115.318975 146.671546 -L 115.644811 144.458405 -L 115.686281 144.165603 -L 115.757373 143.685368 -L 115.816616 143.906663 -L 116.083209 145.392736 -L 116.100982 145.36111 -L 116.19577 144.535214 -L 116.284635 143.833713 -L 116.337953 144.085102 -L 116.622319 145.30803 -L 116.628243 145.306223 -L 116.640092 145.314942 -L 116.657865 145.407071 -L 116.687486 145.472544 -L 116.740805 145.284361 -L 116.746729 145.279822 -L 116.782275 145.378711 -L 116.989625 145.699752 -L 117.042944 145.589677 -L 117.096262 145.474976 -L 117.250294 144.780919 -L 117.327309 145.019601 -L 117.386552 145.207872 -L 117.439871 145.043561 -L 117.611675 144.467901 -L 117.623524 144.495584 -L 117.664994 144.356303 -L 117.795328 143.670515 -L 117.848647 143.756972 -L 117.890117 143.769918 -L 117.919738 143.688232 -L 117.931587 143.660246 -L 117.978981 143.840466 -L 118.292969 145.769413 -L 118.346287 145.558323 -L 118.381833 145.331414 -L 118.447 145.654633 -L 118.606956 146.069935 -L 118.648426 145.948395 -L 118.713593 146.089816 -L 118.749139 146.181526 -L 118.802457 146.04256 -L 118.814306 146.041422 -L 118.867625 145.860275 -L 119.169763 144.914471 -L 119.246779 145.163722 -L 119.590388 146.377349 -L 119.673328 146.619772 -L 119.726646 146.556696 -L 119.756268 146.45152 -L 119.815511 146.622128 -L 120.088028 147.424375 -L 120.11765 147.56374 -L 120.188741 147.373359 -L 120.313151 146.953515 -L 120.354621 146.634408 -L 120.431637 146.838534 -L 120.53235 147.105875 -L 120.579744 146.935157 -L 120.680457 146.376161 -L 120.82264 145.874794 -L 120.834488 145.880354 -L 121.02999 146.896591 -L 121.077384 146.597918 -L 121.391372 144.34149 -L 121.426917 144.393204 -L 121.480236 144.095259 -L 121.592797 143.986008 -L 121.61057 143.99962 -L 121.669813 144.111902 -L 122.143756 145.865318 -L 122.262242 145.93279 -L 122.274091 145.881051 -L 122.368879 145.742035 -L 122.546608 145.339824 -L 122.576229 145.377235 -L 122.582154 145.383086 -L 122.611775 145.284222 -L 122.884292 144.453496 -L 122.890217 144.455312 -L 123.067945 144.989298 -L 123.097567 144.865651 -L 123.370084 143.869751 -L 123.482646 144.131863 -L 123.553737 144.420052 -L 123.618904 144.339842 -L 123.660374 144.276729 -L 123.707769 144.40357 -L 123.921043 146.126682 -L 124.033604 145.783803 -L 124.116545 145.15897 -L 124.306122 144.036112 -L 124.353516 144.213249 -L 124.655655 146.325959 -L 124.703049 145.768717 -L 124.833384 144.834308 -L 124.874854 144.883887 -L 124.898551 144.949956 -L 124.940021 144.792726 -L 125.141447 144.290049 -L 125.153295 144.303144 -L 125.200689 144.479881 -L 125.265857 144.304029 -L 125.354721 143.888066 -L 125.479131 143.176869 -L 125.538374 143.232394 -L 125.668708 143.397963 -L 125.674633 143.394759 -L 125.692405 143.399988 -L 125.704254 143.463741 -L 125.840513 143.766057 -L 126.018241 145.158307 -L 126.077484 144.790517 -L 126.272986 143.874461 -L 126.296683 144.01092 -L 126.551427 146.218012 -L 126.616594 146.076076 -L 127.054992 144.020194 -L 127.209023 143.313425 -L 127.262342 143.639327 -L 127.588178 145.224305 -L 127.594102 145.221252 -L 127.617799 145.328223 -L 127.884392 147.179062 -L 127.943635 147.071304 -L 128.079894 146.953462 -L 128.085818 146.958193 -L 128.145061 146.533966 -L 128.417578 144.57636 -L 128.4472 144.687439 -L 128.57161 145.04942 -L 128.601231 144.920896 -L 128.962613 143.513775 -L 128.980386 143.550008 -L 129.211433 145.097377 -L 129.282524 145.334024 -L 129.335843 145.187254 -L 129.436556 144.910862 -L 129.472102 144.977159 -L 129.478026 144.967545 -L 129.519496 145.103215 -L 129.768316 145.647578 -L 129.77424 145.626442 -L 129.839408 145.379739 -L 129.886802 145.584342 -L 130.040833 146.39743 -L 130.088228 146.290185 -L 130.159319 146.076063 -L 130.212638 146.212799 -L 130.254108 146.321735 -L 130.301502 146.150822 -L 130.384442 145.909731 -L 130.431837 145.969729 -L 130.455534 146.050614 -L 130.526625 145.922364 -L 130.834688 143.436247 -L 130.970947 142.672797 -L 131.000568 142.755632 -L 131.065735 142.880477 -L 131.130903 142.787292 -L 131.184221 142.578103 -L 131.23754 142.793062 -L 131.545603 145.175049 -L 131.598921 145.142123 -L 131.729256 145.48991 -L 131.824044 146.117029 -L 132.078789 147.908138 -L 132.209123 148.554682 -L 132.244669 148.444889 -L 132.280215 148.398027 -L 132.31576 148.529185 -L 132.481641 149.160948 -L 132.487565 149.155212 -L 132.552732 148.96345 -L 132.837098 147.419039 -L 133.050372 146.706575 -L 133.234025 146.090306 -L 133.346587 146.729202 -L 133.494694 147.293181 -L 133.57171 147.231429 -L 133.601331 147.234909 -L 133.625028 147.139044 -L 133.885697 145.432303 -L 133.933091 145.489738 -L 134.051577 145.956157 -L 134.181911 147.216758 -L 134.241154 147.073473 -L 134.306322 146.842661 -L 134.353716 147.025011 -L 134.44258 147.481862 -L 134.501823 147.330774 -L 134.632157 147.129359 -L 134.673627 147.194948 -L 134.744719 147.345729 -L 134.780265 147.200603 -L 135.106101 144.765821 -L 135.159419 144.950565 -L 135.242359 145.217201 -L 135.307526 145.16891 -L 135.378618 145.513278 -L 135.662984 146.777851 -L 135.757772 147.171545 -L 135.822939 146.999107 -L 136.048062 146.35771 -L 136.053987 146.366823 -L 136.089532 146.218924 -L 136.208018 145.325577 -L 136.409444 143.876132 -L 136.480536 144.292128 -L 136.723431 145.904805 -L 136.729356 145.90796 -L 136.753053 145.80955 -L 137.072964 144.666787 -L 137.090737 144.72497 -L 137.363255 145.803389 -L 137.422497 145.480717 -L 137.629848 143.766674 -L 137.665393 143.972433 -L 137.902365 145.575969 -L 137.937911 145.540902 -L 138.020851 145.422693 -L 138.062321 145.520494 -L 138.157109 145.354273 -L 138.245974 145.490584 -L 138.251898 145.504372 -L 138.305217 145.358825 -L 138.311141 145.349355 -L 138.364459 145.456329 -L 138.376308 145.454084 -L 138.453324 145.7822 -L 138.577734 146.061894 -L 138.583658 146.053507 -L 138.725841 145.485846 -L 138.631052 146.077071 -L 138.767311 145.769026 -L 138.90357 146.197569 -L 138.915418 146.181903 -L 139.081298 146.417895 -L 139.176087 146.718138 -L 139.282724 146.502839 -L 139.472301 145.961575 -L 139.513771 146.094064 -L 139.667803 146.546851 -L 139.73297 146.284945 -L 139.833683 146.03548 -L 139.869229 146.213919 -L 139.887002 146.209739 -L 139.910699 146.150466 -L 139.934396 146.147276 -L 140.070655 144.852403 -L 140.355021 142.371544 -L 140.384642 142.445156 -L 140.491279 143.657612 -L 140.746024 145.844253 -L 140.787494 145.832883 -L 141.054087 146.658055 -L 141.071859 146.580072 -L 141.261437 145.113127 -L 141.350301 145.35099 -L 141.439165 145.514033 -L 141.492484 145.443575 -L 141.628743 144.866042 -L 141.723531 145.121027 -L 141.842017 145.842465 -L 141.907184 145.572658 -L 142.096761 143.995256 -L 142.156004 144.393898 -L 142.381127 147.048438 -L 142.404824 147.027284 -L 142.434446 147.007557 -L 142.452219 146.954038 -L 142.683266 145.457648 -L 142.914313 144.382335 -L 142.938011 144.393682 -L 142.949859 144.44447 -L 143.157209 145.18425 -L 143.216452 145.679889 -L 143.465272 147.166802 -L 143.483045 147.08486 -L 143.767411 145.366153 -L 143.791108 145.426798 -L 143.838502 145.438333 -L 143.874048 145.357092 -L 143.879972 145.343334 -L 143.921442 145.471874 -L 143.992534 145.685539 -L 144.02808 145.467472 -L 144.170263 145.141305 -L 144.188035 145.158131 -L 144.223581 145.23126 -L 144.472401 146.477823 -L 144.496098 146.411423 -L 144.987814 144.941861 -L 145.02336 144.996174 -L 145.088527 145.159677 -L 145.224786 145.485396 -L 145.260332 145.314651 -L 145.426212 143.61246 -L 145.509152 143.928525 -L 145.603941 144.274427 -L 145.651335 144.173361 -L 145.769821 143.839329 -L 145.817215 144.002194 -L 145.906079 144.200747 -L 146.054186 144.971747 -L 146.113429 144.964256 -L 146.166748 145.1775 -L 146.350401 146.054791 -L 146.356325 146.04881 -L 146.409644 146.166187 -L 146.462962 146.388854 -L 146.539978 146.343173 -L 146.593297 146.64733 -L 146.69401 147.272902 -L 146.747328 147.225077 -L 146.85989 146.750229 -L 146.895436 146.983782 -L 147.079088 148.026527 -L 147.090937 147.999366 -L 147.114634 147.899789 -L 147.529334 145.008793 -L 147.600426 144.767271 -L 147.68929 144.798442 -L 147.760382 145.134892 -L 147.872943 146.038427 -L 147.997353 146.762371 -L 148.02105 146.675787 -L 148.109915 146.419524 -L 148.151385 146.604912 -L 148.435751 148.290338 -L 148.453524 148.236186 -L 148.838602 145.066793 -L 148.945239 145.465963 -L 149.004482 145.655622 -L 149.051877 145.446106 -L 149.158514 145.044629 -L 149.217757 145.201522 -L 149.395485 145.751376 -L 149.407334 145.735861 -L 149.668003 144.3938 -L 149.762791 144.656885 -L 149.792413 144.735253 -L 149.839807 144.499739 -L 149.946444 143.965084 -L 149.987914 144.2559 -L 150.207113 146.076104 -L 150.331523 146.781439 -L 150.361145 146.659141 -L 150.455933 146.101426 -L 150.509252 146.476751 -L 150.56257 146.981359 -L 150.639586 146.796328 -L 150.64551 146.772942 -L 150.716602 146.92465 -L 150.805466 147.287923 -L 150.852861 147.08087 -L 151.232015 144.669742 -L 151.273485 144.535912 -L 151.314955 144.754657 -L 151.557851 145.790257 -L 151.682261 146.331653 -L 151.889611 147.531914 -L 151.907384 147.500335 -L 152.073264 146.966895 -L 152.15028 147.116373 -L 152.185826 147.159039 -L 152.215447 147.066754 -L 152.369478 146.750943 -L 152.375403 146.76093 -L 152.493889 147.10227 -L 152.405024 146.722267 -L 152.529434 146.953539 -L 152.588677 146.792118 -L 152.641996 146.913385 -L 152.831573 147.514378 -L 152.867119 147.596145 -L 152.902664 147.401082 -L 153.044847 146.585117 -L 153.080393 146.655285 -L 153.086317 146.670753 -L 153.139636 146.513467 -L 153.26997 146.038703 -L 153.299592 146.145875 -L 153.518791 147.110554 -L 153.530639 147.084417 -L 153.820929 144.979947 -L 153.892021 145.324248 -L 153.969037 145.591131 -L 154.034204 145.528852 -L 154.081598 145.322671 -L 154.194159 145.119539 -L 154.211932 145.228485 -L 154.460752 146.574979 -L 154.472601 146.551175 -L 154.56739 146.392649 -L 154.620708 146.513426 -L 154.804361 147.135 -L 154.845831 147.005269 -L 155.142046 145.930547 -L 155.159819 145.947637 -L 155.171667 145.966184 -L 155.195364 145.830794 -L 155.379017 144.231804 -L 155.485654 144.841651 -L 156.368374 149.187988 -L 156.386146 149.154042 -L 156.854165 145.624968 -L 156.94303 146.078327 -L 157.23332 148.972319 -L 157.292563 149.308943 -L 157.345881 149.018285 -L 157.44067 148.260024 -L 157.517686 148.330529 -L 157.52361 148.336635 -L 157.547307 148.235464 -L 157.695414 147.51852 -L 157.766506 147.622175 -L 157.973856 148.442283 -L 157.997553 148.392204 -L 158.116039 148.321356 -L 158.193055 147.817058 -L 158.376707 146.643143 -L 158.430026 146.634725 -L 158.441875 146.561359 -L 158.60183 146.201354 -L 158.803256 145.977671 -L 158.6433 146.268775 -L 158.821029 146.032345 -L 158.909893 146.533194 -L 158.975061 146.322457 -L 158.980985 146.326425 -L 159.010606 146.216176 -L 159.289048 145.321308 -L 159.306821 145.395648 -L 159.443079 146.466854 -L 159.502322 145.973964 -L 159.632657 145.332543 -L 159.674127 145.523079 -L 159.73337 145.643009 -L 159.77484 145.475235 -L 159.822234 145.462386 -L 159.845931 145.562995 -L 160.035508 146.067953 -L 160.076978 145.957681 -L 160.094751 145.97977 -L 160.177691 145.731171 -L 160.266556 145.179114 -L 160.331723 145.374792 -L 160.462057 145.392421 -L 160.467981 145.426986 -L 160.497603 145.513334 -L 160.533149 145.290278 -L 160.544997 145.296356 -L 160.610164 145.574817 -L 160.72865 146.030203 -L 160.758272 145.97444 -L 160.971546 144.523615 -L 160.989319 144.440993 -L 161.054486 144.73572 -L 161.327003 146.596882 -L 161.338852 146.57935 -L 161.463262 146.479635 -L 161.747628 144.435339 -L 161.806871 144.913453 -L 162.091237 147.229514 -L 162.15048 147.007073 -L 162.186025 146.964083 -L 162.203798 146.91049 -L 162.239344 146.795424 -L 162.351905 146.234812 -L 162.411148 146.446732 -L 162.665893 148.115645 -L 162.766606 147.923674 -L 162.784378 147.956576 -L 162.819924 147.791052 -L 162.831773 147.744329 -L 162.902864 147.927993 -L 162.908789 147.922769 -L 162.944334 148.068734 -L 163.003577 148.321657 -L 163.056896 148.071387 -L 163.483445 145.196374 -L 163.536763 145.286663 -L 163.625627 145.634037 -L 163.904069 147.291522 -L 163.909993 147.285207 -L 163.951463 147.165546 -L 163.987009 147.37642 -L 164.058101 147.891064 -L 164.212132 148.912209 -L 164.241754 148.844201 -L 164.378012 147.856321 -L 164.650529 144.82171 -L 164.668302 144.866622 -L 164.846031 145.837843 -L 165.136321 148.19564 -L 165.195564 148.125518 -L 165.260731 148.425138 -L 165.343671 148.302789 -L 165.349596 148.306399 -L 165.373293 148.215702 -L 165.551021 145.621302 -L 165.705053 144.022266 -L 165.740599 144.174159 -L 166.030889 145.822525 -L 166.113829 146.22232 -L 166.327103 146.977913 -L 166.374498 146.783706 -L 166.463362 146.262106 -L 166.504832 146.570366 -L 166.670712 147.291061 -L 166.694409 147.263219 -L 166.706258 147.256109 -L 166.718106 147.182653 -L 166.724031 147.170061 -L 166.801046 146.677406 -L 167.014321 145.215675 -L 167.026169 145.190327 -L 167.073564 145.352873 -L 167.209822 145.484748 -L 167.263141 145.323769 -L 167.464567 143.832926 -L 167.52381 144.088814 -L 167.873343 145.528769 -L 168.110314 146.536273 -L 168.151784 146.436559 -L 168.246573 145.196395 -L 168.370983 144.003224 -L 168.424302 144.110241 -L 168.702743 145.185416 -L 168.714592 145.206697 -L 168.761986 145.001344 -L 168.815305 144.735803 -L 168.874547 144.96833 -L 169.307021 147.710818 -L 169.348491 147.822896 -L 169.407733 147.686932 -L 169.413658 147.694739 -L 169.520295 147.869694 -L 169.549916 147.771718 -L 169.940919 144.564468 -L 170.047557 144.926013 -L 170.160118 145.486027 -L 170.260831 146.121164 -L 170.420787 146.609486 -L 170.663683 146.835011 -L 170.693304 146.866742 -L 170.705153 146.923832 -L 170.77032 147.126426 -L 170.823639 147.022889 -L 171.025064 146.443302 -L 171.084307 146.212626 -L 171.256112 145.719881 -L 171.262036 145.715584 -L 171.279809 145.78342 -L 171.303506 145.806817 -L 171.410143 146.142644 -L 171.47531 145.958257 -L 171.546402 145.776788 -L 171.593796 145.949252 -L 171.653039 146.045819 -L 171.688585 145.872466 -L 171.747828 145.581724 -L 171.795222 145.875929 -L 171.967026 147.029961 -L 171.996648 146.965 -L 172.109209 146.518489 -L 172.162528 146.717215 -L 172.239544 147.213388 -L 172.322484 146.897513 -L 172.826048 144.616574 -L 172.968231 144.766947 -L 173.02155 144.867396 -L 173.157808 145.169839 -L 173.18743 145.111429 -L 173.572509 144.039438 -L 173.590281 144.04558 -L 173.655449 144.237846 -L 173.874647 145.095343 -L 173.969436 144.791705 -L 174.164938 144.657827 -L 173.999057 144.812011 -L 174.170862 144.674808 -L 174.241953 145.175952 -L 174.324893 144.918101 -L 174.449303 144.256666 -L 174.496698 144.542574 -L 174.781064 146.764452 -L 174.792912 146.757396 -L 174.828458 146.84624 -L 175.035808 147.517879 -L 175.041732 147.513891 -L 175.065429 147.610115 -L 175.100975 147.747546 -L 175.160218 147.542348 -L 175.444584 146.352471 -L 175.468281 146.383304 -L 175.503827 146.412325 -L 175.527524 146.327476 -L 175.557145 146.319212 -L 175.598615 146.314454 -L 175.610464 146.23956 -L 175.965921 143.930307 -L 175.995543 144.00745 -L 176.096256 143.799819 -L 176.155499 143.609273 -L 176.208817 143.807974 -L 176.587972 145.419278 -L 176.647215 145.220969 -L 176.759776 144.903948 -L 176.777549 144.985015 -L 176.836792 145.296025 -L 176.896035 145.083468 -L 177.411448 142.264515 -L 177.476615 148.490792 -L 177.524009 147.433686 -L 177.678041 146.506559 -L 177.713587 146.477944 -L 177.755057 146.582343 -L 177.873542 147.113661 -L 177.93871 147.095614 -L 178.003877 146.989656 -L 178.134211 146.848084 -L 178.157908 146.835655 -L 178.175681 146.774799 -L 178.31194 146.542266 -L 178.323788 146.535932 -L 178.371183 146.648354 -L 178.377107 146.638538 -L 178.495593 147.063201 -L 178.578533 146.894628 -L 178.661473 146.825554 -L 178.68517 146.919452 -L 178.862899 147.659965 -L 178.93399 147.53045 -L 178.945839 147.536643 -L 178.981384 147.425929 -L 179.479025 144.852851 -L 179.686375 143.633018 -L 179.751542 143.838211 -L 179.804861 144.112998 -L 179.881876 143.901691 -L 180.006286 143.353708 -L 180.053681 143.565211 -L 180.361744 145.130965 -L 180.373592 145.079655 -L 180.498002 144.960929 -L 180.503927 144.96703 -L 180.610564 144.487485 -L 180.752747 143.711813 -L 180.776444 143.802973 -L 180.918627 143.944447 -L 181.037113 144.098369 -L 181.410343 146.292398 -L 181.439964 146.228231 -L 181.582147 145.454068 -L 181.629542 145.631795 -L 181.872437 146.968019 -L 181.913907 146.854823 -L 181.996847 146.542857 -L 182.050166 146.728182 -L 182.168652 146.999763 -L 182.204198 146.902967 -L 182.233819 146.806233 -L 182.310835 146.923361 -L 182.358229 146.971724 -L 182.393775 146.862894 -L 182.512261 146.331058 -L 182.571504 146.457969 -L 182.678141 146.544545 -L 182.689989 146.504864 -L 183.015825 145.000752 -L 183.051371 144.955494 -L 183.116538 145.04182 -L 183.128387 145.05607 -L 183.163932 144.975645 -L 183.400904 143.872929 -L 183.442374 143.970948 -L 183.489768 144.096748 -L 183.537163 143.929694 -L 183.679346 143.119273 -L 183.732664 143.214255 -L 184.354714 145.881626 -L 184.419882 146.089565 -L 184.490973 146.503659 -L 184.550216 146.206561 -L 184.716096 145.37162 -L 184.739793 145.510486 -L 184.870128 146.157216 -L 184.958992 146.026124 -L 185.077478 145.688393 -L 185.160418 145.429861 -L 185.207812 145.621201 -L 185.427011 145.991195 -L 185.468481 145.884568 -L 185.498102 145.776009 -L 185.563269 145.958399 -L 185.616588 146.067934 -L 185.663982 145.935983 -L 185.829862 144.372607 -L 186.043137 143.033522 -L 186.054985 143.045477 -L 186.173471 143.992307 -L 186.3512 144.546283 -L 186.712581 145.326895 -L 187.026569 146.985488 -L 187.068039 146.937985 -L 187.145055 146.754738 -L 187.1806 146.938437 -L 187.26354 147.126653 -L 187.310935 147.059561 -L 187.459042 146.887107 -L 187.488663 146.944708 -L 187.796726 147.643301 -L 187.802651 147.631992 -L 187.832272 147.516442 -L 187.932985 146.882653 -L 188.027774 146.925745 -L 188.543187 144.489388 -L 188.667597 144.767773 -L 188.80978 145.098117 -L 188.821628 145.088765 -L 189.082297 144.3662 -L 189.129691 144.201591 -L 189.206707 144.249199 -L 189.485149 145.282281 -L 189.692499 147.054793 -L 189.716196 147.000844 -L 190.024259 146.755255 -L 190.065729 146.892521 -L 190.142745 147.42616 -L 190.225685 147.614809 -L 190.267155 147.50298 -L 190.409338 146.780124 -L 190.480429 146.967913 -L 190.510051 147.071606 -L 190.569294 146.845169 -L 190.575218 146.832829 -L 190.628536 146.964667 -L 190.681855 147.248102 -L 190.806265 148.150613 -L 190.847735 148.144374 -L 191.007691 148.803652 -L 191.049161 148.719835 -L 191.209117 148.403378 -L 191.3513 147.600314 -L 191.540877 145.485641 -L 191.629741 145.650738 -L 191.635666 145.657929 -L 191.677136 145.541024 -L 191.68306 145.52742 -L 191.712681 145.697779 -L 191.819319 145.968332 -L 191.84894 145.831824 -L 191.985199 145.520775 -L 192.008896 145.549755 -L 192.30511 146.10524 -L 192.352505 145.86532 -L 192.494687 144.783283 -L 192.548006 144.974724 -L 192.713886 145.165056 -L 192.619098 144.885529 -L 192.71981 145.162431 -L 192.832372 144.852791 -L 192.891615 144.589579 -L 192.962706 144.715097 -L 193.152284 144.974844 -L 193.258921 144.549514 -L 193.324088 144.861379 -L 193.359634 144.969986 -L 193.436649 144.872858 -L 193.501817 144.53678 -L 193.549211 144.762844 -L 193.798031 146.261613 -L 193.833577 146.318253 -L 193.869123 146.198636 -L 193.910593 146.036469 -L 193.969835 146.241928 -L 194.147564 147.075168 -L 194.171261 147.004748 -L 194.532643 144.534066 -L 194.568189 144.654152 -L 194.828857 147.220406 -L 194.917722 146.605209 -L 195.05398 146.132574 -L 195.077677 146.214117 -L 195.350195 147.488169 -L 195.362043 147.473634 -L 195.439059 147.054028 -L 195.622712 146.185115 -L 195.640485 146.217053 -L 195.711576 146.398786 -L 195.770819 146.568767 -L 195.830062 146.41279 -L 195.913002 146.095839 -L 195.978169 146.281093 -L 196.161822 145.93717 -L 196.215141 146.104313 -L 196.327702 146.28354 -L 196.3514 146.19004 -L 196.416567 145.923347 -L 196.487658 145.965114 -L 196.499507 145.972106 -L 196.529128 145.851221 -L 196.552825 145.788709 -L 196.594295 146.002147 -L 196.772024 146.754993 -L 196.777948 146.754371 -L 196.825343 146.677994 -L 196.84904 146.63146 -L 196.902358 146.839359 -L 197.109709 147.055704 -L 196.949753 146.753594 -L 197.115633 147.049579 -L 197.26374 146.19202 -L 197.405923 145.140476 -L 197.453317 145.256706 -L 197.713986 147.309235 -L 197.791002 147.105691 -L 197.808775 147.095111 -L 197.826548 147.194135 -L 197.862093 147.268655 -L 197.921336 147.129636 -L 197.92726 147.125998 -L 197.950958 147.22371 -L 198.022049 147.170881 -L 198.093141 147.362515 -L 198.259021 147.548517 -L 198.264945 147.544527 -L 198.377506 146.991292 -L 198.413052 146.781688 -L 198.490068 146.92764 -L 198.655948 147.255941 -L 198.993632 149.120473 -L 199.046951 148.809717 -L 199.396484 146.401761 -L 199.402408 146.405224 -L 199.43203 146.397888 -L 199.461651 146.498167 -L 199.580137 146.948649 -L 199.651229 146.795742 -L 199.663077 146.791275 -L 199.698623 146.888457 -L 199.76379 147.281106 -L 199.828957 147.007933 -L 199.935594 146.911872 -L 199.876352 147.040983 -L 199.959292 146.932276 -L 199.988913 147.002939 -L 200.065929 146.919008 -L 200.705752 145.328618 -L 200.735373 145.450275 -L 200.889405 145.545383 -L 200.895329 145.530053 -L 201.043436 145.251647 -L 201.061209 145.285806 -L 201.197468 145.810979 -L 201.238938 145.446174 -L 201.357424 145.121101 -L 201.375197 145.167398 -L 201.582547 145.790572 -L 201.606244 145.739504 -L 201.772124 144.818565 -L 201.819518 144.995787 -L 201.991323 146.13374 -L 202.068338 145.968792 -L 202.1809 145.185702 -L 202.352704 144.250584 -L 202.38825 144.424657 -L 202.684464 147.245056 -L 202.743707 147.107254 -L 202.84442 146.704808 -L 203.122862 144.71747 -L 203.282818 144.49978 -L 203.324288 144.65296 -L 203.543486 145.774793 -L 203.721215 146.150372 -L 203.881171 146.492855 -L 203.898944 146.459907 -L 203.981884 146.186626 -L 204.343265 144.971345 -L 204.366963 145.048455 -L 204.491373 145.638834 -L 204.698723 146.837361 -L 204.740193 146.6475 -L 204.864603 146.043803 -L 204.923846 146.233317 -L 204.92977 146.249253 -L 204.97124 146.071782 -L 205.036407 145.938696 -L 205.071953 146.145019 -L 205.119347 146.326793 -L 205.166742 146.108405 -L 205.267454 145.392989 -L 205.326697 145.579237 -L 205.581442 146.369077 -L 205.59329 146.352996 -L 205.664382 145.923577 -L 205.871732 145.067928 -L 205.919126 145.166592 -L 206.002066 145.695458 -L 206.031688 145.81088 -L 206.079082 145.541868 -L 206.167946 145.354622 -L 206.203492 145.442268 -L 206.381221 146.077709 -L 206.428615 145.890474 -L 206.576722 145.541239 -L 206.630041 145.694172 -L 206.920331 147.314928 -L 206.949953 147.269358 -L 207.151378 146.958152 -L 206.985498 147.331772 -L 207.252091 147.044326 -L 207.560154 148.474793 -L 207.5957 148.42662 -L 207.625321 148.358697 -L 207.67864 148.477996 -L 208.117037 150.274943 -L 208.152583 150.232402 -L 208.223675 149.581666 -L 208.525813 147.238068 -L 208.626526 146.7869 -L 208.827952 145.522851 -L 208.987908 144.926012 -L 209.070848 144.649208 -L 209.136015 144.817149 -L 209.254501 145.120856 -L 209.331517 145.065367 -L 209.408532 144.758751 -L 209.479624 144.896145 -L 209.550715 144.772625 -L 209.817308 143.64481 -L 209.876551 143.786594 -L 209.995037 143.90157 -L 210.018734 143.796088 -L 210.083901 143.49913 -L 210.149069 143.669339 -L 210.362343 145.357146 -L 210.534147 146.496213 -L 210.540072 146.504268 -L 210.575617 146.39155 -L 210.729649 146.017977 -L 210.741497 146.0377 -L 210.753346 146.05875 -L 210.824437 145.930984 -L 210.901453 145.537769 -L 211.037712 144.76834 -L 211.120652 144.945235 -L 211.292456 146.377699 -L 211.393169 146.303639 -L 211.434639 146.17156 -L 211.505731 146.283602 -L 211.570898 146.427294 -L 211.612368 146.295936 -L 211.659762 146.049259 -L 211.719005 146.281388 -L 211.748627 146.386944 -L 211.801945 146.156813 -L 211.926355 145.892242 -L 211.938204 145.938779 -L 212.13963 146.43847 -L 212.187024 146.289285 -L 212.406223 144.422685 -L 212.660967 142.414778 -L 212.684664 142.295186 -L 212.749831 148.490792 -L 212.797226 147.948333 -L 213.087516 146.570011 -L 213.111213 146.635232 -L 213.140834 146.799116 -L 213.194153 146.537627 -L 213.324487 145.564782 -L 213.407427 145.637791 -L 213.579232 145.211866 -L 213.739188 145.008787 -L 213.780658 144.923135 -L 213.833976 145.079288 -L 214.065024 146.169329 -L 214.337541 147.922614 -L 214.379011 147.800739 -L 214.533042 147.521973 -L 214.823333 146.197443 -L 214.841105 146.225746 -L 214.894424 146.344231 -L 214.935894 146.164386 -L 215.51055 143.707503 -L 215.528323 143.763905 -L 215.569793 143.770323 -L 215.587566 143.69764 -L 215.646809 143.459481 -L 215.700127 143.663074 -L 215.931175 144.583453 -L 215.948947 144.642366 -L 216.014115 144.468422 -L 216.061509 144.421572 -L 216.09113 144.530593 -L 216.369572 145.543483 -L 216.393269 145.593368 -L 216.434739 145.470415 -L 216.630241 144.701851 -L 216.849439 144.190252 -L 216.867212 144.141432 -L 216.902758 144.237841 -L 216.950152 144.21477 -L 216.991622 144.378993 -L 217.056789 144.187946 -L 217.092335 144.097486 -L 217.139729 144.28538 -L 217.376701 146.10844 -L 217.441868 145.848009 -L 217.726234 144.910298 -L 217.732158 144.912651 -L 217.862493 145.31752 -L 218.016524 147.561658 -L 218.158707 148.575697 -L 218.194253 148.556338 -L 218.223874 148.437371 -L 218.63265 145.553426 -L 218.905168 146.308827 -L 218.934789 146.390029 -L 218.988108 146.221494 -L 219.165836 145.137868 -L 219.213231 145.234966 -L 219.414656 146.271017 -L 219.491672 146.122002 -L 219.515369 146.044934 -L 219.604234 146.113452 -L 219.616082 146.11669 -L 219.645704 146.210657 -L 219.764189 146.523831 -L 219.793811 146.353434 -L 219.870827 146.143851 -L 219.906372 146.259955 -L 220.05448 146.950934 -L 220.090025 146.837925 -L 220.119647 146.821196 -L 220.155193 146.957852 -L 220.504726 148.336847 -L 220.522498 148.318294 -L 220.59359 148.180268 -L 220.712076 147.110731 -L 220.960896 144.671188 -L 221.037912 144.916589 -L 221.079382 144.897135 -L 221.097154 145.000474 -L 221.357823 146.293982 -L 221.369672 146.322957 -L 221.393369 146.159771 -L 221.648113 144.220024 -L 221.938404 144.644193 -L 221.991722 144.457292 -L 222.104284 143.797557 -L 222.157602 144.086004 -L 222.222769 144.308155 -L 222.282012 144.169112 -L 222.305709 144.088692 -L 222.364952 144.283776 -L 222.388649 144.40553 -L 222.453817 144.171279 -L 222.542681 143.450211 -L 222.55453 143.396964 -L 222.596 143.740473 -L 222.655242 144.093045 -L 222.714485 143.926158 -L 222.88629 143.344849 -L 222.904063 143.368942 -L 223.0107 143.744951 -L 223.235823 145.61139 -L 223.295066 145.827893 -L 223.360233 145.742645 -L 223.395779 145.796955 -L 223.443173 145.699248 -L 223.46687 145.717615 -L 223.484643 145.691426 -L 223.514264 145.856747 -L 223.603129 146.422624 -L 223.686069 146.174594 -L 223.8401 146.051048 -L 223.946737 145.502192 -L 224.00598 145.679717 -L 224.017829 145.720766 -L 224.08892 145.55152 -L 224.189633 145.282859 -L 224.219255 145.367929 -L 224.278498 146.032659 -L 224.551015 148.530089 -L 224.574712 148.457146 -L 224.645804 148.027678 -L 225.09605 143.946215 -L 225.208611 143.568903 -L 225.244157 143.728453 -L 225.516674 145.300241 -L 225.59369 145.855621 -L 225.682554 146.560573 -L 225.735873 146.354488 -L 225.854359 146.222861 -L 225.895829 146.120679 -L 225.960996 146.247742 -L 226.109103 146.506289 -L 226.1328 146.472022 -L 226.245362 146.064293 -L 226.67191 142.722237 -L 226.689683 142.774456 -L 226.825942 143.147583 -L 226.849639 143.105798 -L 226.897033 143.045222 -L 226.920731 143.184917 -L 227.009595 143.827506 -L 227.086611 144.39748 -L 227.157702 144.222774 -L 227.175475 144.187476 -L 227.234718 144.359904 -L 227.673115 145.987637 -L 227.750131 145.700844 -L 227.987103 144.566248 -L 228.022648 144.641764 -L 228.070043 144.548255 -L 228.17668 145.150971 -L 228.449197 146.181534 -L 228.484743 146.098739 -L 228.514364 146.084867 -L 228.526213 146.025064 -L 228.846124 144.905108 -L 228.869822 144.890415 -L 228.887594 144.98372 -L 229.136415 146.51152 -L 229.17196 146.389852 -L 229.474099 145.319898 -L 229.580736 145.392002 -L 229.651828 145.80939 -L 229.711071 145.5507 -L 229.953966 144.616814 -L 229.959891 144.626849 -L 230.113922 145.222153 -L 230.333121 146.519433 -L 230.51085 146.998198 -L 230.55232 146.802583 -L 230.741897 146.162423 -L 230.789291 146.306684 -L 230.919626 146.813375 -L 231.020338 147.318164 -L 231.085506 147.232159 -L 231.334326 146.585786 -L 231.42319 146.431363 -L 231.997846 143.185431 -L 232.015619 143.270915 -L 232.400698 147.093303 -L 232.525108 146.45646 -L 232.613972 146.044487 -L 232.685064 146.268724 -L 232.762079 147.047322 -L 232.886489 146.896869 -L 233.004975 146.801057 -L 233.123461 146.439677 -L 233.170855 146.546151 -L 233.324887 146.909953 -L 233.360433 146.715231 -L 233.561858 146.267189 -L 233.727739 146.039357 -L 233.816603 146.145146 -L 234.018029 146.509731 -L 234.053574 146.406229 -L 234.403107 144.166787 -L 234.62823 142.82088 -L 234.657852 142.959728 -L 234.687473 143.096527 -L 234.75264 142.855255 -L 234.877051 142.777276 -L 234.989612 143.328156 -L 235.173265 144.56145 -L 235.208811 144.477806 -L 235.350994 144.175438 -L 235.362842 144.204202 -L 235.463555 144.445833 -L 235.510949 144.241957 -L 235.747921 143.313932 -L 235.765694 143.394325 -L 235.813088 143.507884 -L 235.860483 143.305252 -L 235.943423 143.047286 -L 236.00859 143.135919 -L 236.026363 143.179652 -L 236.032287 143.219574 -L 236.29888 146.058073 -L 236.452911 147.40936 -L 236.476609 147.398588 -L 236.826142 148.585839 -L 236.909082 148.269201 -L 237.187523 146.661732 -L 237.424495 145.564448 -L 237.495586 145.84426 -L 237.578526 146.040831 -L 237.614072 145.891689 -L 237.631845 145.878021 -L 237.661466 145.991417 -L 237.886589 146.790947 -L 237.892514 146.781301 -L 238.360532 145.731337 -L 238.556034 146.584732 -L 238.621201 146.331865 -L 238.858173 145.260729 -L 239.124766 145.947929 -L 239.160311 145.689859 -L 239.219554 145.331458 -L 239.29657 145.409068 -L 239.343964 145.53747 -L 239.527617 146.181552 -L 239.610557 146.055704 -L 239.687573 146.116329 -L 239.705346 146.152201 -L 239.734967 145.933322 -L 240.007485 143.558195 -L 240.025258 143.602168 -L 240.102273 143.900689 -L 240.753945 147.578787 -L 240.872431 147.490423 -L 241.00869 147.213814 -L 241.020538 147.241181 -L 241.056084 147.286435 -L 241.079781 147.180939 -L 241.328601 145.737743 -L 241.42339 145.683674 -L 241.441163 145.738473 -L 241.612967 146.599244 -L 241.701831 146.521895 -L 241.968424 147.107364 -L 242.021743 146.933226 -L 242.258715 144.99108 -L 242.288336 144.743398 -L 242.353503 145.159588 -L 242.620096 147.070331 -L 242.631945 147.069241 -L 242.679339 147.173401 -L 242.756355 147.323312 -L 242.785976 147.166495 -L 243.022948 145.901791 -L 243.076266 146.040921 -L 243.141434 145.70958 -L 243.230298 145.156843 -L 243.301389 144.654942 -L 243.372481 144.724204 -L 243.437648 144.864874 -L 243.455421 144.921876 -L 243.538361 144.809841 -L 243.627225 144.351959 -L 243.692393 144.526184 -L 244.095244 146.341696 -L 244.160411 145.965966 -L 244.21373 145.862949 -L 244.2552 146.012132 -L 244.480323 146.351789 -L 244.50402 146.313673 -L 244.515869 146.280329 -L 244.563263 146.451821 -L 244.79431 147.664862 -L 244.829856 147.582255 -L 245.173465 146.055268 -L 245.20901 145.968892 -L 245.280102 145.619051 -L 245.327496 145.900733 -L 245.357118 146.012165 -L 245.398588 145.851567 -L 245.463755 145.672328 -L 245.517074 145.810907 -L 245.546695 145.840272 -L 245.588165 145.702123 -L 245.617786 145.58164 -L 245.677029 145.773758 -L 245.991017 146.67805 -L 246.05026 146.572431 -L 246.186518 146.313483 -L 246.204291 146.37917 -L 246.305004 146.914906 -L 246.405717 147.267618 -L 246.447187 147.158435 -L 246.46496 147.116843 -L 246.524203 147.303207 -L 246.636764 147.350449 -L 246.648613 147.316582 -L 246.814493 146.829269 -L 246.83819 146.93947 -L 247.027767 147.579651 -L 247.039616 147.548483 -L 247.329906 146.050068 -L 247.448392 146.370755 -L 247.537256 146.16176 -L 247.643893 145.998448 -L 247.66759 146.027014 -L 247.845319 147.021636 -L 247.957881 146.861557 -L 248.165231 146.09174 -L 248.188928 146.142823 -L 248.212625 146.071673 -L 248.271868 146.310472 -L 248.485142 148.049402 -L 248.532537 148.02738 -L 248.870221 146.631475 -L 248.899842 146.64348 -L 248.935388 146.487098 -L 248.959085 146.468408 -L 248.982783 146.589936 -L 249.284921 147.446393 -L 249.314543 147.291351 -L 249.373786 146.898323 -L 249.456726 146.962554 -L 249.468574 146.972535 -L 249.50412 146.875452 -L 249.598909 146.633661 -L 249.640379 146.763661 -L 249.966214 148.360825 -L 250.061003 147.977861 -L 250.173565 147.858666 -L 250.203186 147.889211 -L 250.274278 147.963578 -L 250.303899 148.000555 -L 250.345369 147.822835 -L 250.351293 147.822627 -L 250.37499 147.722391 -L 250.748221 145.518435 -L 250.813388 145.855569 -L 251.257709 147.809634 -L 251.399892 148.079662 -L 251.411741 148.025088 -L 251.761274 146.187617 -L 251.779047 146.246299 -L 251.933078 146.664532 -L 251.980473 146.610315 -L 252.039716 146.568112 -L 252.063413 146.650692 -L 252.093034 146.738742 -L 252.152277 146.549627 -L 252.158201 146.544813 -L 252.181899 146.662456 -L 252.264839 146.892292 -L 252.318157 146.781903 -L 252.448492 146.023122 -L 252.561053 146.248584 -L 252.566977 146.254704 -L 252.602523 146.160296 -L 252.946132 144.742937 -L 252.952056 144.754284 -L 253.04092 144.974866 -L 252.987602 144.684392 -L 253.100163 144.938913 -L 253.123861 144.909604 -L 253.183103 145.142944 -L 253.301589 145.58307 -L 253.325286 145.4794 -L 253.639274 144.125786 -L 253.657047 144.177199 -L 253.840699 144.83304 -L 253.92364 145.182832 -L 253.96511 145.006855 -L 253.976958 144.979894 -L 254.024352 145.19117 -L 254.267248 146.574404 -L 254.302794 146.418115 -L 254.569387 144.928936 -L 254.646403 145.269024 -L 254.776737 145.813133 -L 254.812283 145.78459 -L 254.936693 146.024516 -L 254.972239 145.954898 -L 255.321772 144.312634 -L 255.345469 144.212198 -L 255.392863 144.429298 -L 255.653532 146.783125 -L 255.730548 146.454496 -L 255.825336 145.965163 -L 255.866806 146.017695 -L 255.908276 145.929999 -L 255.937898 145.935939 -L 255.979368 145.757931 -L 256.091929 145.555793 -L 256.103778 145.576042 -L 256.121551 145.635896 -L 256.174869 145.404408 -L 256.58957 143.943298 -L 256.601418 144.015571 -L 256.785071 144.804276 -L 256.802844 144.78263 -L 256.927254 145.151252 -L 256.986497 144.943145 -L 257.217544 144.376675 -L 257.25309 144.432357 -L 257.264938 144.452075 -L 257.29456 144.327237 -L 257.353803 144.193656 -L 257.401197 144.357224 -L 257.614472 145.242803 -L 257.644093 145.084212 -L 257.786276 144.358487 -L 257.881065 144.611319 -L 258.503115 147.211128 -L 258.574206 147.440866 -L 258.834875 148.939854 -L 258.911891 149.028712 -L 258.941512 148.918315 -L 258.959285 148.867395 -L 259.054074 148.91483 -L 259.142938 148.653324 -L 259.261424 148.211247 -L 259.29697 148.353041 -L 259.332515 148.378237 -L 259.368061 148.241839 -L 259.486547 147.754443 -L 259.533941 147.875021 -L 259.616881 148.406375 -L 259.699821 148.057632 -L 259.87755 147.522502 -L 259.924944 147.615203 -L 259.96049 147.463513 -L 260.33372 145.658668 -L 260.398887 145.728471 -L 260.594389 145.822119 -L 260.677329 146.097594 -L 260.843209 146.648453 -L 260.878755 146.391514 -L 261.032786 144.822293 -L 261.097953 145.057136 -L 261.305304 145.863523 -L 261.346774 145.718646 -L 261.435638 145.736761 -L 261.565972 144.905334 -L 261.696307 144.57929 -L 261.791095 144.780385 -L 261.844414 144.893167 -L 261.885884 144.692299 -L 261.939202 144.496448 -L 262.010294 144.627657 -L 262.270963 145.646713 -L 262.29466 145.570564 -L 262.407221 145.523422 -L 262.413146 145.529677 -L 262.679739 146.326142 -L 262.685663 146.308072 -L 262.910786 145.7137 -L 262.940407 145.766027 -L 263.023347 146.020545 -L 263.070742 145.905935 -L 263.088515 145.870465 -L 263.141833 146.014948 -L 263.159606 145.997356 -L 263.207 145.891535 -L 263.236622 145.751612 -L 263.307713 145.906434 -L 263.426199 146.307348 -L 263.473593 146.28297 -L 263.574306 145.481236 -L 263.746111 144.713879 -L 263.752035 144.730397 -L 263.989006 146.014591 -L 264.178584 146.619269 -L 264.225978 146.734187 -L 264.273372 146.578328 -L 264.350388 145.719371 -L 264.599208 143.501526 -L 264.62883 143.557908 -L 264.688073 143.691713 -L 264.824331 144.132282 -L 265.25088 146.411264 -L 265.256804 146.391138 -L 265.606337 145.227944 -L 265.635959 145.339462 -L 265.754445 146.077532 -L 265.807763 145.814203 -L 266.03881 144.807979 -L 266.050659 144.81159 -L 266.068432 144.890718 -L 266.305403 145.879949 -L 266.435738 145.742652 -L 266.483132 145.408478 -L 266.542375 145.747159 -L 267.229592 149.0946 -L 267.259214 148.994231 -L 267.33623 148.787354 -L 267.413245 148.908588 -L 267.508034 149.082172 -L 267.54358 148.88195 -L 267.685763 147.161401 -L 267.845719 147.231662 -L 267.964204 146.93631 -L 268.094539 146.204369 -L 268.384829 143.169551 -L 268.515163 142.63187 -L 268.53886 142.754832 -L 268.858772 145.181682 -L 268.876545 145.132657 -L 268.888393 145.099307 -L 268.971333 145.197696 -L 269.018728 145.360443 -L 269.320866 147.142183 -L 269.338639 147.223066 -L 269.409731 147.03257 -L 269.474898 147.129085 -L 269.504519 146.981814 -L 269.676324 146.216197 -L 269.71187 146.269173 -L 269.765188 146.139295 -L 269.936993 145.403693 -L 269.978463 145.413494 -L 270.233207 144.689776 -L 270.019933 145.459854 -L 270.280601 144.909593 -L 270.547194 146.298392 -L 270.553119 146.288509 -L 270.600513 146.180365 -L 270.730847 145.169303 -L 270.87303 144.459317 -L 270.896727 144.484019 -L 271.074456 145.360592 -L 271.145547 145.074574 -L 271.28773 144.786237 -L 271.323276 144.832811 -L 271.382519 145.381995 -L 271.595793 146.772604 -L 271.631339 146.93132 -L 271.696506 146.738021 -L 271.773522 146.250539 -L 271.868311 146.411756 -L 271.951251 146.551665 -L 271.998645 146.433493 -L 272.034191 146.336836 -L 272.099358 146.477928 -L 272.235617 146.537937 -L 272.348178 146.358541 -L 272.425194 145.957878 -L 272.496285 146.065867 -L 272.519982 146.12881 -L 272.58515 145.969844 -L 272.70956 145.466712 -L 272.756954 145.635722 -L 272.91691 146.020549 -L 272.928758 146.013164 -L 272.982077 145.896116 -L 273.272367 145.093716 -L 273.070941 145.971689 -L 273.319762 145.234376 -L 273.533036 146.450605 -L 273.58043 146.408801 -L 273.722613 146.383032 -L 273.74631 146.443516 -L 273.82925 146.327571 -L 273.959585 146.274712 -L 274.001055 146.274449 -L 274.024752 146.355498 -L 274.119541 146.647212 -L 274.196556 146.850988 -L 274.243951 146.741952 -L 274.344663 146.107526 -L 274.534241 145.144986 -L 274.540165 145.149596 -L 274.741591 145.011097 -L 274.759364 145.038115 -L 274.895622 145.495421 -L 274.966714 145.241928 -L 275.073351 144.981554 -L 275.132594 145.071298 -L 275.191837 145.184236 -L 275.25108 145.104786 -L 275.328095 144.874518 -L 275.357717 145.089913 -L 275.636158 148.006584 -L 275.66578 147.925815 -L 275.802039 147.533479 -L 275.861281 147.605509 -L 276.009389 147.952333 -L 276.021237 147.926625 -L 276.074556 147.994406 -L 276.098253 147.893783 -L 276.240436 147.49781 -L 276.258209 147.523354 -L 276.471483 148.136574 -L 276.49518 148.020305 -L 276.708455 146.952636 -L 276.880259 146.81536 -L 276.755849 147.003894 -L 276.898032 146.87258 -L 276.933578 147.004285 -L 277.010594 146.868423 -L 277.075761 146.758621 -L 277.099458 146.950911 -L 277.176474 146.908075 -L 277.229792 147.085378 -L 277.478612 147.900207 -L 277.650417 148.567648 -L 277.656341 148.558428 -L 277.662265 148.560758 -L 277.685962 148.461914 -L 277.768902 148.035803 -L 277.845918 148.166069 -L 277.905161 148.253042 -L 277.952555 148.13689 -L 278.136208 147.930067 -L 278.302088 147.01712 -L 278.325786 147.082901 -L 278.390953 147.30954 -L 278.462044 147.253579 -L 278.491666 147.137601 -L 278.598303 146.400218 -L 278.651622 146.495881 -L 278.74641 146.646866 -L 278.799729 146.580007 -L 278.811577 146.552016 -L 278.864896 146.724058 -L 278.888593 146.746652 -L 278.935987 146.630516 -L 278.959685 146.718474 -L 279.131489 147.064774 -L 279.155186 147.043789 -L 279.291445 146.724184 -L 279.380309 146.581028 -L 279.421779 146.668784 -L 279.569886 146.796294 -L 279.646902 146.886832 -L 279.901647 147.858707 -L 279.931268 147.731247 -L 280.5 145.494186 -L 280.535545 145.570945 -L 280.683653 146.261634 -L 280.736971 146.092479 -L 280.825836 145.763777 -L 280.896927 145.949135 -L 280.99764 146.223983 -L 281.08058 146.190483 -L 281.169444 146.57561 -L 281.37087 147.384761 -L 281.41234 147.364499 -L 281.424189 147.375493 -L 281.471583 147.267509 -L 281.732252 146.114318 -L 282.064012 144.97377 -L 282.111406 145.065951 -L 282.123255 145.083189 -L 282.152876 144.902858 -L 282.235816 144.555651 -L 282.277286 144.761425 -L 282.490561 146.107484 -L 282.537955 145.872967 -L 282.686062 145.203964 -L 282.727532 145.332149 -L 283.053368 146.331126 -L 283.071141 146.271669 -L 283.112611 146.227926 -L 283.148157 146.356986 -L 283.385128 146.980978 -L 283.432523 147.105566 -L 283.491766 146.958611 -L 283.556933 146.481514 -L 283.687267 145.445787 -L 283.758359 145.714865 -L 283.99533 146.657964 -L 284.048649 146.815011 -L 284.125665 146.734861 -L 284.196756 146.904908 -L 284.415955 147.598334 -L 284.421879 147.579492 -L 284.481122 147.557267 -L 284.510743 147.615963 -L 284.522592 147.610436 -L 284.564062 147.772081 -L 284.611456 147.520199 -L 284.812882 146.854895 -L 284.824731 146.864582 -L 284.866201 146.898181 -L 284.913595 146.769572 -L 284.966914 146.634061 -L 285.038005 146.762545 -L 285.073551 146.855994 -L 285.103172 146.594781 -L 285.186112 146.001615 -L 285.251279 146.03784 -L 285.274977 145.969148 -L 285.357917 146.058754 -L 285.375689 146.081957 -L 285.440857 146.008629 -L 285.897027 142.994608 -L 285.926648 142.814467 -L 286.003664 142.962364 -L 286.341349 144.465843 -L 286.347273 144.45508 -L 286.424289 144.750615 -L 286.49538 144.579545 -L 286.643487 143.877661 -L 286.690882 144.186729 -L 286.856762 145.055056 -L 286.91008 145.044538 -L 287.010793 145.371447 -L 287.129279 145.818051 -L 287.1589 145.774001 -L 287.176673 145.750824 -L 287.224068 145.8521 -L 287.229992 145.85268 -L 287.455115 146.322791 -L 287.514358 146.107937 -L 287.650616 145.691328 -L 287.792799 144.863183 -L 287.857967 144.900755 -L 287.893512 144.816326 -L 287.940907 144.975947 -L 288.148257 145.447876 -L 288.154181 145.427495 -L 288.29044 145.13083 -L 288.391153 144.771423 -L 288.432623 144.879871 -L 288.49779 144.991007 -L 288.545184 144.900248 -L 288.716988 144.635356 -L 288.87102 144.788705 -L 289.013203 145.573768 -L 289.072446 145.371972 -L 289.102067 145.188785 -L 289.173159 145.384773 -L 289.416055 146.5347 -L 289.427903 146.527206 -L 289.611556 146.13253 -L 289.818906 145.280555 -L 289.913695 144.872915 -L 289.996635 145.036453 -L 290.126969 145.716874 -L 290.399487 148.103871 -L 290.446881 148.21194 -L 290.506124 148.101872 -L 290.606837 147.342304 -L 290.642382 147.270623 -L 290.701625 147.407719 -L 290.9149 147.755075 -L 290.920824 147.739319 -L 290.99784 147.461658 -L 291.045234 147.673858 -L 291.074855 147.800195 -L 291.134098 147.603515 -L 291.217038 147.410823 -L 291.270357 147.462805 -L 291.459934 146.759524 -L 291.91018 144.155275 -L 291.969423 144.468807 -L 292.182697 146.294907 -L 292.301183 146.194185 -L 292.354502 146.08659 -L 292.573701 144.552566 -L 292.656641 144.701147 -L 292.698111 144.847871 -L 292.781051 144.797671 -L 292.828445 144.757488 -L 292.858066 144.854131 -L 293.041719 145.745905 -L 293.083189 145.47765 -L 293.225372 144.439099 -L 293.302388 144.610043 -L 293.474192 145.339899 -L 293.521587 145.197725 -L 293.598603 145.219409 -L 293.563057 145.265534 -L 293.616375 145.249027 -L 293.675618 145.545862 -L 293.847423 146.273938 -L 293.959984 146.456244 -L 294.143637 147.003799 -L 294.001454 146.426338 -L 294.16141 146.990807 -L 294.374684 146.468789 -L 294.380609 146.478132 -L 294.433927 146.426172 -L 294.469473 146.540047 -L 294.528716 146.945047 -L 294.736066 148.495583 -L 294.747915 148.485573 -L 294.789385 148.252948 -L 295.180388 145.220172 -L 295.186312 145.224394 -L 295.292949 145.64032 -L 295.369965 145.920459 -L 295.423284 145.771104 -L 295.695801 144.428266 -L 295.790589 145.022163 -L 296.051258 147.200383 -L 296.08088 147.050789 -L 296.347473 145.721066 -L 296.359321 145.707182 -L 296.394867 145.839692 -L 296.501504 146.472195 -L 296.554823 146.22467 -L 296.625914 145.808865 -L 296.708854 145.943515 -L 296.904356 145.402657 -L 296.969523 145.581554 -L 296.975447 145.591085 -L 297.005069 145.451409 -L 297.224267 144.498255 -L 297.36645 143.704944 -L 297.396072 143.794957 -L 297.710059 145.462978 -L 297.751529 145.393672 -L 297.929258 145.427211 -L 297.935182 145.40544 -L 298.101062 145.175245 -L 298.249169 145.417021 -L 298.278791 145.310145 -L 298.426898 144.309977 -L 298.486141 144.484273 -L 298.53946 144.657826 -L 298.865295 145.939612 -L 299.025251 146.626806 -L 299.07857 146.965093 -L 299.131888 146.644084 -L 299.238526 146.17966 -L 299.28592 146.312965 -L 299.386633 146.799534 -L 299.428103 146.554826 -L 299.665074 145.008915 -L 299.682847 145.041651 -L 299.706544 144.980869 -L 299.74209 145.120082 -L 299.902046 145.644487 -L 299.913895 145.624216 -L 299.943516 145.603204 -L 299.973137 145.714491 -L 300.346368 147.143778 -L 300.387838 147.081322 -L 300.684052 145.366138 -L 300.749219 145.017914 -L 300.796614 145.344861 -L 300.992115 146.195531 -L 301.033585 146.122706 -L 301.258708 145.303091 -L 301.282405 145.319678 -L 301.317951 145.210902 -L 301.383118 145.114364 -L 301.418664 145.244696 -L 301.738576 147.214788 -L 301.797818 146.878041 -L 302.1592 145.067683 -L 302.171049 145.051434 -L 302.194746 145.13267 -L 302.224367 145.156535 -L 302.236216 145.161434 -L 302.277686 145.081589 -L 302.360626 144.721232 -L 302.402096 144.933831 -L 302.633143 146.895057 -L 302.733856 146.465342 -L 302.964903 146.21474 -L 303.035995 146.115511 -L 303.077465 146.197435 -L 303.148556 146.047026 -L 303.349982 145.008359 -L 303.415149 145.089118 -L 303.498089 145.930534 -L 303.782455 148.186953 -L 303.806152 148.086831 -L 303.960184 147.52757 -L 304.025351 147.555609 -L 304.143837 147.504371 -L 304.250474 146.247937 -L 304.517067 143.572084 -L 304.70072 142.298106 -L 304.765887 148.490792 -L 304.813282 147.333825 -L 305.008783 145.857038 -L 305.014707 145.860348 -L 305.038404 145.887021 -L 305.056177 145.938821 -L 305.269452 146.392838 -L 305.287225 146.405817 -L 305.304997 146.301507 -L 305.417559 145.556627 -L 305.476802 145.668915 -L 305.767092 146.912097 -L 305.784865 146.927317 -L 305.826335 146.77621 -L 306.063306 144.182499 -L 306.122549 144.359987 -L 306.720903 146.986401 -L 306.750524 146.94073 -L 306.863085 146.830941 -L 306.904556 146.462065 -L 307.123754 145.461936 -L 307.354801 145.362663 -L 307.40812 144.967521 -L 307.467363 145.316153 -L 307.591773 145.605785 -L 307.609546 145.539474 -L 307.645092 145.561297 -L 307.668789 145.620372 -L 307.828745 145.822871 -L 307.852442 145.830756 -L 307.876139 145.881231 -L 307.90576 145.89896 -L 308.006473 146.089444 -L 308.042019 145.913269 -L 308.296763 144.651961 -L 308.302688 144.664722 -L 308.569281 145.577294 -L 308.658145 145.429364 -L 308.717388 145.251147 -L 308.758858 145.470082 -L 308.865495 145.767382 -L 308.912889 145.698554 -L 308.983981 145.346188 -L 309.167634 144.754067 -L 309.262423 144.662106 -L 309.345363 144.371536 -L 309.386833 144.504148 -L 309.754138 146.220907 -L 309.813381 146.169472 -L 309.955564 145.778073 -L 309.99111 145.892271 -L 310.245854 147.187432 -L 310.429507 146.522216 -L 310.57169 145.813871 -L 310.61316 145.929795 -L 310.873829 146.950457 -L 310.968618 147.129255 -L 311.004163 147.016334 -L 311.294454 146.040141 -L 311.424788 145.936163 -L 311.436637 145.942997 -L 311.489955 146.289739 -L 311.803942 147.98164 -L 311.898731 147.775584 -L 312.088308 147.486112 -L 312.135703 147.504098 -L 312.1594 147.432764 -L 312.171248 147.375534 -L 312.271961 147.399814 -L 312.313431 147.304345 -L 312.343053 147.188318 -L 312.414144 147.345114 -L 312.420069 147.334866 -L 312.485236 147.409485 -L 312.538554 147.50271 -L 312.5741 147.374232 -L 312.633343 147.117716 -L 312.686662 147.354545 -L 312.876239 147.712491 -L 312.716283 147.316064 -L 312.929557 147.561328 -L 313.036195 147.032719 -L 313.095437 147.142342 -L 313.107286 147.150312 -L 313.136907 147.024705 -L 313.285015 146.387196 -L 313.326485 146.431203 -L 313.379803 146.484746 -L 313.415349 146.376832 -L 313.504213 146.1268 -L 313.883368 142.945403 -L 313.960384 143.199066 -L 313.972232 143.196102 -L 314.013702 143.286007 -L 314.250674 144.769326 -L 314.339538 144.592993 -L 314.428402 144.357636 -L 314.4521 144.303504 -L 314.523191 144.414934 -L 314.53504 144.456012 -L 314.57651 144.361541 -L 314.612055 144.355561 -L 314.635753 144.293253 -L 314.683147 144.451803 -L 314.772011 144.687796 -L 314.82533 144.648598 -L 315.038604 143.855699 -L 315.139317 143.960318 -L 315.234106 144.518964 -L 315.459229 146.983516 -L 315.506623 146.85615 -L 315.678427 146.53723 -L 315.702125 146.608916 -L 315.713973 146.631684 -L 315.767292 146.455728 -L 315.850232 146.199168 -L 315.909475 146.048384 -L 315.980566 146.0805 -L 316.033885 145.992656 -L 316.383418 144.946351 -L 316.626314 144.663898 -L 316.650011 144.717584 -L 316.762572 144.888463 -L 316.786269 144.868623 -L 316.815891 144.922941 -L 316.863285 144.802647 -L 316.981771 144.566083 -L 316.999544 144.638187 -L 317.402396 147.098923 -L 317.568276 147.044468 -L 317.858566 146.195681 -L 317.911884 146.46765 -L 317.941506 146.515611 -L 317.9889 146.330391 -L 318.231796 144.949318 -L 318.273266 145.158683 -L 318.368055 145.678087 -L 318.439146 145.479306 -L 318.646496 144.929099 -L 318.699815 145.15753 -L 318.930862 147.653501 -L 319.067121 147.504708 -L 319.108591 147.57452 -L 319.150061 147.444484 -L 319.179682 147.276913 -L 319.250774 147.487715 -L 319.333714 147.854202 -L 319.404805 148.129005 -L 319.446275 147.870426 -L 319.624004 147.434503 -L 319.653625 147.328462 -L 319.819505 146.94155 -L 319.843203 146.865908 -L 319.979461 146.638967 -L 320.139417 145.798275 -L 320.328994 144.632557 -L 320.370464 144.802521 -L 320.601512 146.063575 -L 320.637057 146.132232 -L 320.6963 145.98956 -L 320.856256 145.120142 -L 320.909575 145.04766 -L 320.951045 145.169756 -L 321.093228 145.828855 -L 321.146546 145.482922 -L 321.294653 144.206742 -L 321.347972 144.218158 -L 321.401291 144.534438 -L 321.608641 145.643524 -L 321.632338 145.592951 -L 321.709354 145.593291 -L 321.667884 145.656264 -L 321.727126 145.637638 -L 321.810066 146.016807 -L 321.999644 147.664203 -L 322.112205 147.560345 -L 322.11813 147.556476 -L 322.147751 147.656172 -L 322.153675 147.663726 -L 322.165524 147.695019 -L 322.24254 147.605182 -L 322.432117 146.94514 -L 322.515057 147.073573 -L 322.592073 146.948224 -L 322.603921 146.902468 -L 322.651316 147.177259 -L 322.692786 147.348097 -L 322.746104 147.047315 -L 322.86459 146.338318 -L 322.90606 146.434498 -L 322.983076 146.482892 -L 323.018621 146.413447 -L 323.36223 145.249957 -L 323.474792 144.553438 -L 323.522186 144.86221 -L 323.593277 145.020106 -L 323.640672 144.97229 -L 323.842098 144.65486 -L 323.907265 144.381101 -L 323.948735 144.620175 -L 324.191631 145.449448 -L 324.286419 145.614244 -L 324.310116 145.717179 -L 324.393056 145.592413 -L 324.588558 144.987582 -L 324.635952 145.083616 -L 324.772211 144.773931 -L 324.849227 144.981024 -L 325.021031 145.553625 -L 325.050653 145.522821 -L 325.145441 145.381645 -L 325.222457 145.054255 -L 325.287624 145.231056 -L 325.36464 145.509479 -L 325.40611 145.313869 -L 325.477201 144.954886 -L 325.524596 145.156555 -L 325.850432 147.902457 -L 325.90375 147.870595 -L 325.962993 147.724313 -L 326.460633 144.630895 -L 326.490255 144.762675 -L 326.715378 145.834997 -L 326.792393 145.597603 -L 326.863485 145.310383 -L 326.934576 145.432138 -L 326.993819 145.769302 -L 327.064911 145.530037 -L 327.201169 144.629272 -L 327.40852 142.956387 -L 327.467762 143.109154 -L 327.568475 143.257367 -L 327.876538 144.343026 -L 327.894311 144.302771 -L 327.941706 144.177728 -L 327.977251 144.329242 -L 328.433422 148.6676 -L 328.522286 148.43173 -L 328.682242 148.10797 -L 328.69409 148.144672 -L 328.700015 148.155623 -L 328.73556 147.995233 -L 328.865895 147.02282 -L 329.002153 147.181696 -L 329.15026 146.611544 -L 329.185806 146.827783 -L 329.286519 147.352197 -L 329.339838 147.304164 -L 329.375383 147.20885 -L 329.730841 145.561729 -L 329.742689 145.557586 -L 329.766387 145.666005 -L 329.920418 146.331799 -L 329.967812 146.277901 -L 330.009282 146.206426 -L 330.050752 146.375917 -L 330.109995 146.638383 -L 330.151465 146.375512 -L 330.400285 144.926404 -L 330.418058 144.947619 -L 330.542468 145.643448 -L 330.684651 147.451984 -L 330.755743 147.149302 -L 330.969017 144.891165 -L 331.087503 145.111971 -L 331.365945 147.411387 -L 331.466657 146.957277 -L 331.502203 146.881112 -L 331.591068 146.904786 -L 331.632538 147.010141 -L 331.697705 147.095916 -L 331.739175 146.993352 -L 332.142026 145.323267 -L 332.165724 145.41218 -L 332.224966 145.704239 -L 332.296058 145.581346 -L 332.527105 143.692579 -L 332.610045 144.264665 -L 332.847017 146.602054 -L 333.001048 147.001483 -L 333.024745 146.971286 -L 333.161004 146.314083 -L 333.332808 145.703308 -L 333.368354 145.779886 -L 333.61125 146.868684 -L 333.629023 146.819802 -L 333.65272 146.784862 -L 333.69419 146.896024 -L 333.723812 146.890806 -L 333.783054 146.958081 -L 333.824524 146.876955 -L 333.871919 146.620449 -L 333.937086 146.851973 -L 334.15036 145.93507 -L 334.31624 145.277581 -L 334.39918 145.027684 -L 334.458423 145.093319 -L 334.594682 145.317332 -L 334.713168 145.677869 -L 334.748714 145.54662 -L 334.861275 145.054234 -L 334.920518 145.269705 -L 335.465552 148.174905 -L 335.518871 148.056955 -L 335.631433 148.665873 -L 335.743994 149.644803 -L 335.809161 149.413747 -L 335.868404 149.346943 -L 335.90395 149.494188 -L 336.022436 149.851538 -L 336.099451 149.72834 -L 336.259407 148.631489 -L 336.573395 146.219184 -L 336.614865 146.303867 -L 336.685956 146.205132 -L 336.780745 146.22336 -L 336.745199 146.299261 -L 336.786669 146.238077 -L 336.822215 146.341815 -L 336.89923 146.246707 -L 337.02364 146.8597 -L 337.035489 146.913724 -L 337.088808 146.613396 -L 337.254688 146.013657 -L 337.296158 146.102866 -L 337.509432 147.153946 -L 337.562751 147.062525 -L 337.586448 146.972663 -L 337.645691 147.198124 -L 337.740479 147.325391 -L 337.770101 147.272743 -L 337.941905 146.719695 -L 338.084088 146.223184 -L 338.095937 146.226125 -L 338.214423 146.444772 -L 338.398076 147.765292 -L 338.457318 147.181917 -L 338.629123 146.311285 -L 338.676517 146.082719 -L 338.717987 145.873828 -L 338.77723 146.148664 -L 338.854246 146.643093 -L 338.907564 146.388864 -L 339.02605 145.70323 -L 339.073444 145.84465 -L 339.239325 146.753983 -L 339.298567 146.53105 -L 339.624403 144.457792 -L 339.630328 144.461246 -L 339.659949 144.556672 -L 339.719192 144.416615 -L 339.766586 144.216592 -L 339.837678 144.32535 -L 339.979861 144.317137 -L 339.997634 144.386599 -L 340.157589 145.059292 -L 340.246454 145.851658 -L 340.471577 146.970161 -L 340.477501 146.96493 -L 340.566365 146.814457 -L 340.761867 146.048601 -L 340.915898 145.64231 -L 340.981065 145.851558 -L 341.046233 146.28223 -L 341.123248 146.111925 -L 341.135097 146.073396 -L 341.170643 146.135286 -L 341.229886 146.132077 -L 341.348371 146.320644 -L 341.271356 146.106578 -L 341.383917 146.230955 -L 341.56757 145.108638 -L 341.620889 145.149671 -L 341.686056 145.227681 -L 341.739374 145.153936 -L 341.768996 145.081187 -L 341.869709 144.773328 -L 341.911179 144.836577 -L 341.946725 144.945755 -L 342.02374 144.839776 -L 342.035589 144.812905 -L 342.077059 145.001413 -L 342.290333 145.93821 -L 342.31403 145.781306 -L 342.568775 144.383092 -L 342.580624 144.398111 -L 342.882762 145.812747 -L 342.959778 145.688264 -L 342.989399 145.668282 -L 343.019021 145.756858 -L 343.11381 146.453033 -L 343.202674 146.360594 -L 343.285614 146.462075 -L 343.356705 146.756472 -L 343.421873 146.648384 -L 343.629223 145.53674 -L 343.688466 145.772765 -L 343.836573 146.415954 -L 343.86027 146.337658 -L 343.949134 146.032057 -L 344.014301 146.22524 -L 344.174257 147.062055 -L 344.2335 146.708744 -L 344.506017 145.874785 -L 344.511942 145.877426 -L 344.577109 146.065001 -L 344.612655 145.859548 -L 344.760762 144.875718 -L 344.808156 145.01368 -L 344.968112 145.17421 -L 344.985885 145.092144 -L 345.128068 144.165818 -L 345.199159 144.3883 -L 345.276175 144.539993 -L 345.311721 144.428231 -L 345.418358 144.494827 -L 345.436131 144.355741 -L 345.471677 144.211996 -L 345.530919 144.416663 -L 345.679027 144.747046 -L 345.726421 144.560505 -L 345.827134 143.919564 -L 345.892301 144.183059 -L 346.164818 145.761516 -L 346.40179 146.619879 -L 346.419563 146.675813 -L 346.490654 146.512091 -L 346.555821 146.033804 -L 346.69208 144.787675 -L 346.745399 144.856202 -L 346.893506 144.919742 -L 346.964597 144.696001 -L 347.029764 144.864672 -L 347.308206 145.814302 -L 347.616269 146.208277 -L 347.776225 146.597531 -L 347.805846 146.730683 -L 347.882862 146.574102 -L 347.977651 146.523471 -L 347.936181 146.633747 -L 348.001348 146.552698 -L 348.149455 146.842263 -L 348.238319 147.151728 -L 348.279789 147.037855 -L 348.392351 146.67654 -L 348.576004 145.066174 -L 348.688565 145.226687 -L 348.878143 146.432038 -L 349.02625 146.393825 -L 349.411329 145.198582 -L 349.44095 145.426634 -L 349.583133 146.173956 -L 349.618679 146.054984 -L 350.015606 143.376898 -L 350.151865 142.986688 -L 350.258502 142.672171 -L 350.347366 142.295479 -L 350.406609 148.490792 -L 350.459928 147.566033 -L 350.637656 146.307111 -L 350.779839 146.080972 -L 350.916098 145.827286 -L 350.957568 146.022996 -L 351.064205 146.228916 -L 351.087902 146.176995 -L 351.336723 144.837416 -L 351.390041 145.20393 -L 351.549997 145.726763 -L 351.929151 147.195321 -L 351.976546 146.99926 -L 352.142426 146.632914 -L 352.675612 145.3889 -L 352.705233 145.450494 -L 352.794098 145.624093 -L 352.882962 146.203568 -L 352.942205 145.83517 -L 353.185101 144.625556 -L 353.214722 144.778567 -L 353.309511 145.511887 -L 353.374678 145.397494 -L 353.433921 145.341525 -L 353.469467 145.435356 -L 353.475391 145.434554 -L 353.576104 145.273264 -L 353.605725 145.443872 -L 353.641271 145.631581 -L 353.69459 145.290466 -L 353.854545 144.743312 -L 353.896015 144.828128 -L 353.937485 144.765944 -L 353.996728 144.841783 -L 354.085593 145.186467 -L 354.138911 145.085706 -L 354.257397 144.564661 -L 354.346261 144.041156 -L 354.411429 144.276564 -L 354.452899 144.42816 -L 354.464747 144.471576 -L 354.518066 144.249908 -L 354.56546 144.043116 -L 354.618779 144.278657 -L 354.873523 146.260951 -L 354.956463 145.937731 -L 355.015706 145.738346 -L 355.10457 145.446484 -L 355.140116 145.628484 -L 355.347466 146.444453 -L 355.359315 146.438922 -L 355.371163 146.417304 -L 355.406709 146.607827 -L 355.424482 146.654927 -L 355.477801 146.446923 -L 355.572589 145.895644 -L 355.625908 146.077156 -L 355.726621 146.34456 -L 355.779939 146.697735 -L 355.851031 146.542454 -L 355.975441 145.82769 -L 356.016911 146.064831 -L 356.129472 146.343014 -L 356.153169 146.315625 -L 356.271655 146.607158 -L 356.366444 147.148181 -L 356.44346 147.091532 -L 356.496778 147.264307 -L 356.5264 147.4144 -L 356.597491 147.206815 -L 356.704128 146.596563 -L 356.769296 146.870308 -L 356.787068 146.934743 -L 356.840387 146.700246 -L 357.053661 145.644052 -L 357.154374 145.014726 -L 357.308406 144.121361 -L 357.320254 144.134312 -L 357.403194 144.557757 -L 357.628317 146.092469 -L 357.64609 146.051834 -L 357.823819 145.393226 -L 357.85344 145.449187 -L 358.066715 146.771062 -L 358.232595 147.528827 -L 358.357005 148.275152 -L 358.434021 147.936186 -L 358.599901 147.432611 -L 358.623598 147.450094 -L 358.629522 147.452979 -L 358.659144 147.3724 -L 359.19233 145.249644 -L 359.198254 145.259823 -L 359.221951 145.216248 -L 359.269345 145.341919 -L 359.375983 145.554346 -L 359.6485 147.254345 -L 359.68997 147.116648 -L 359.861774 146.485465 -L 360.10467 145.427648 -L 360.163913 144.890533 -L 360.288323 143.907032 -L 360.335717 143.929248 -L 360.371263 143.983745 -L 360.406809 143.850895 -L 360.513446 143.439943 -L 360.566765 143.615702 -L 360.720796 144.103819 -L 360.750418 144.05464 -L 360.756342 144.050053 -L 360.774115 144.161543 -L 360.963692 145.011019 -L 361.005162 144.894482 -L 361.058481 144.841633 -L 361.123648 144.870002 -L 361.277679 144.454164 -L 361.325074 144.665577 -L 361.710152 147.111204 -L 361.757547 146.96428 -L 361.994518 146.361668 -L 362.000443 146.366339 -L 362.02414 146.404567 -L 362.06561 146.292869 -L 362.184096 146.01387 -L 362.219641 146.13745 -L 362.31443 146.328428 -L 362.349976 146.226072 -L 362.462537 145.83592 -L 362.675812 143.869688 -L 362.735054 144.105377 -L 363.114209 146.348525 -L 363.173452 146.489738 -L 363.208998 146.274213 -L 363.274165 145.896221 -L 363.351181 146.067853 -L 363.410423 146.203324 -L 363.457818 146.055241 -L 363.600001 145.507732 -L 363.635546 145.631911 -L 363.671092 145.766174 -L 363.724411 145.544589 -L 363.872518 144.694523 -L 364.044322 143.680019 -L 364.068019 143.805187 -L 364.227975 144.221672 -L 364.299067 144.615979 -L 364.56566 145.207443 -L 364.583433 145.157973 -L 364.595281 145.135839 -L 364.654524 145.265805 -L 364.861874 146.062123 -L 364.89742 145.910249 -L 365.045527 145.369522 -L 365.075149 145.503409 -L 365.14624 145.868191 -L 365.205483 145.627564 -L 365.412833 144.791325 -L 365.430606 144.824384 -L 365.507622 145.434543 -L 365.691275 146.304851 -L 365.880852 147.02768 -L 365.963792 146.794297 -L 366.011186 146.638065 -L 366.064505 146.844187 -L 366.088202 146.750987 -L 366.224461 145.710823 -L 366.295552 145.909235 -L 366.372568 146.230655 -L 366.408114 145.9631 -L 366.556221 145.541772 -L 366.562145 145.542525 -L 366.621388 145.462364 -L 366.846511 146.258036 -L 367.036088 147.609151 -L 367.10718 147.470348 -L 367.344151 145.651567 -L 367.385621 145.77292 -L 367.486334 146.185933 -L 367.545577 146.074919 -L 367.581123 145.973521 -L 367.64629 146.087735 -L 367.669987 146.151642 -L 367.711457 145.857218 -L 367.829943 145.397222 -L 367.883262 145.541029 -L 367.89511 145.55395 -L 367.948429 145.47782 -L 368.06099 145.204751 -L 368.10246 145.278105 -L 368.683041 148.865426 -L 368.777829 148.549643 -L 369.097741 146.304268 -L 369.198454 145.997754 -L 369.245848 146.079388 -L 369.423577 147.061742 -L 369.453198 147.028599 -L 369.56576 146.871819 -L 369.583532 146.922289 -L 369.636851 146.958084 -L 369.672397 146.856263 -L 369.93899 145.93278 -L 369.986384 146.082591 -L 370.02193 145.887341 -L 370.087097 145.77748 -L 370.122643 145.896306 -L 370.193734 146.238352 -L 370.258901 146.133378 -L 370.495873 145.257508 -L 370.632132 145.82243 -L 370.715072 146.182613 -L 370.780239 146.022173 -L 370.85133 146.086892 -L 370.910573 146.363987 -L 370.969816 146.173601 -L 371.040908 145.639554 -L 371.14162 145.386405 -L 371.165318 145.484676 -L 371.503002 147.3089 -L 371.520775 147.258252 -L 371.568169 147.109065 -L 371.615564 147.306751 -L 371.876232 148.222819 -L 371.899929 148.185805 -L 371.947324 147.866063 -L 372.142825 146.740759 -L 372.166522 146.840587 -L 372.23169 147.115804 -L 372.290933 146.962638 -L 372.320554 147.050062 -L 372.403494 147.474627 -L 372.43904 147.112511 -L 372.569374 146.196433 -L 372.598996 146.223459 -L 372.818194 146.939536 -L 372.877437 146.658944 -L 373.126257 144.920498 -L 373.132182 144.931464 -L 373.244743 145.241565 -L 373.303986 145.005365 -L 373.35138 144.868289 -L 373.404699 145.03326 -L 373.43432 145.059521 -L 373.481715 144.942839 -L 373.594276 144.422279 -L 373.629822 144.5789 -L 374.269645 147.871952 -L 374.287418 147.865 -L 374.376282 147.906445 -L 374.631027 146.857918 -L 374.790982 146.050709 -L 374.850225 145.947932 -L 374.891695 146.106282 -L 374.98056 146.316725 -L 375.02203 146.196778 -L 375.264926 145.471719 -L 375.069424 146.222656 -L 375.306396 145.584662 -L 375.324168 145.655339 -L 375.401184 145.498792 -L 375.430806 145.486567 -L 375.460427 145.560294 -L 375.661853 146.087344 -L 375.691474 146.060244 -L 375.756642 146.146537 -L 375.792187 146.271712 -L 375.886976 146.568024 -L 375.93437 146.453668 -L 376.135796 145.244915 -L 376.313525 144.0598 -L 376.34907 144.11059 -L 376.728225 145.053902 -L 376.734149 145.05824 -L 376.769695 144.958149 -L 377.042212 143.279041 -L 377.101455 143.561178 -L 377.391745 144.754414 -L 377.409518 144.761335 -L 377.445064 144.671638 -L 377.492458 144.476637 -L 377.539853 144.684298 -L 377.658338 145.248662 -L 377.705733 145.151661 -L 377.89531 144.194469 -L 377.919007 144.253901 -L 378.250767 145.774115 -L 378.582527 146.205597 -L 378.819499 147.450943 -L 378.872818 147.450488 -L 378.89059 147.387207 -L 379.050546 147.036194 -L 379.056471 147.044007 -L 379.121638 147.156413 -L 379.169032 147.04195 -L 379.305291 146.649712 -L 379.328988 146.827077 -L 379.406004 147.150257 -L 379.441549 147.097543 -L 379.447474 62.448671 -L 379.453398 148.490792 -L 379.548186 148.490792 -L 379.571884 148.490792 -L 379.642975 59.877092 -L 379.678521 148.490792 -L 379.702218 148.490792 -L 379.773309 48.495945 -L 379.808855 148.490792 -L 379.832552 148.490792 -L 379.838477 51.26642 -L 379.93919 148.490792 -L 379.962887 148.490792 -L 379.968811 56.684325 -L 380.069524 148.490792 -L 380.093221 148.490792 -L 380.164313 52.340341 -L 380.199858 148.490792 -L 380.223555 148.490792 -L 380.294647 40.337579 -L 380.330193 148.490792 -L 380.35389 148.490792 -L 380.359814 43.504544 -L 380.460527 148.490792 -L 380.484224 148.490792 -L 380.490148 85.548396 -L 380.590861 148.490792 -L 380.614558 148.490792 -L 380.620483 67.756738 -L 380.721196 148.490792 -L 380.744893 148.490792 -L 380.815984 56.74291 -L 380.85153 148.490792 -L 380.875227 148.490792 -L 380.946319 47.587932 -L 380.981864 148.490792 -L 381.005562 148.490792 -L 381.011486 63.596265 -L 381.112199 148.490792 -L 381.135896 148.490792 -L 381.14182 36.484574 -L 381.242533 148.490792 -L 381.26623 148.490792 -L 381.272155 52.719537 -L 381.372867 148.490792 -L 381.396565 148.490792 -L 381.467656 65.670864 -L 381.503202 148.490792 -L 381.526899 148.490792 -L 381.532823 63.682924 -L 381.633536 148.490792 -L 381.657233 148.490792 -L 381.663158 51.654077 -L 381.763871 148.490792 -L 381.787568 148.490792 -L 381.793492 57.097672 -L 381.894205 148.490792 -L 381.917902 148.490792 -L 381.923826 59.902475 -L 382.024539 148.490792 -L 382.048236 148.490792 -L 382.119328 61.445534 -L 382.154874 148.490792 -L 382.178571 148.490792 -L 382.184495 73.226641 -L 382.285208 148.490792 -L 382.308905 148.490792 -L 382.314829 49.645923 -L 382.415542 148.490792 -L 382.534028 148.396775 -L 382.682135 146.916825 -L 382.901334 145.365951 -L 382.960577 145.477093 -L 383.132381 144.564972 -L 383.197548 144.191469 -L 383.250867 144.482459 -L 383.422671 145.019034 -L 383.481914 145.004264 -L 383.493763 144.965475 -L 383.529309 144.785874 -L 383.6004 144.971485 -L 383.624097 145.018585 -L 383.647794 144.913868 -L 383.701113 144.68076 -L 383.760356 144.864382 -L 384.038798 146.105513 -L 384.050646 146.101016 -L 384.18098 146.212827 -L 384.305391 146.775697 -L 384.352785 146.505619 -L 384.477195 146.398343 -L 384.660848 145.90715 -L 384.862274 144.23499 -L 384.974835 144.921302 -L 385.140715 145.951239 -L 385.164412 145.850825 -L 385.496173 144.336458 -L 385.573188 144.450116 -L 385.585037 144.486693 -L 385.638356 144.27184 -L 385.721296 143.738469 -L 385.798311 144.020378 -L 385.816084 144.058531 -L 385.863478 143.885161 -L 385.916797 143.622906 -L 385.958267 143.891213 -L 386.201163 145.946734 -L 386.408513 146.748505 -L 386.426286 146.68724 -L 386.550696 146.441614 -L 386.580317 146.464946 -L 386.651409 146.676784 -L 386.746198 146.961955 -L 386.80544 146.878859 -L 386.929851 146.493148 -L 386.971321 146.639129 -L 387.160898 147.491065 -L 387.202368 147.41912 -L 387.226065 147.382361 -L 387.273459 147.513763 -L 387.279384 147.514847 -L 387.362324 147.638998 -L 387.433415 147.951306 -L 387.486734 147.782373 -L 387.545977 147.538578 -L 387.628917 147.665547 -L 387.782948 147.289907 -L 388.002147 145.773165 -L 388.008071 145.779723 -L 388.150254 146.094421 -L 388.304286 146.353925 -L 388.345756 146.463515 -L 388.404998 146.308743 -L 388.564954 146.058617 -L 388.6005 146.133482 -L 388.68344 146.443676 -L 388.76638 146.4181 -L 388.819699 146.144704 -L 388.914487 145.792271 -L 389.003352 145.948482 -L 389.121837 146.2967 -L 389.163307 146.050036 -L 389.281793 145.704024 -L 389.317339 145.757067 -L 389.4299 146.078797 -L 389.506916 145.930732 -L 389.572083 145.714436 -L 389.619478 145.922418 -L 389.690569 146.249342 -L 389.767585 146.069373 -L 389.844601 146.188915 -L 389.868298 146.041615 -L 390.010481 145.280408 -L 390.063799 145.394633 -L 390.081572 145.432357 -L 390.134891 145.270547 -L 390.271149 144.541415 -L 390.318544 144.768916 -L 390.555515 146.549762 -L 390.632531 146.43015 -L 390.798411 145.878004 -L 391.011686 145.101085 -L 391.01761 145.093815 -L 391.047231 145.195471 -L 391.053156 145.195855 -L 391.219036 146.354454 -L 391.384916 147.797229 -L 391.414537 147.720332 -L 391.509326 147.908501 -L 391.544872 147.765023 -L 391.793692 145.866924 -L 391.918102 144.58267 -L 391.983269 144.795267 -L 392.255786 145.536815 -L 392.350575 145.664371 -L 392.599395 146.134868 -L 392.676411 146.030474 -L 392.759351 145.999987 -L 392.723805 146.065855 -L 392.777124 146.065071 -L 392.919307 146.382979 -L 392.990398 146.239282 -L 393.02002 146.173909 -L 393.049641 146.352467 -L 393.06149 146.399279 -L 393.132581 146.235731 -L 393.239218 145.416937 -L 393.576903 143.280226 -L 393.606524 143.2188 -L 393.647994 143.400947 -L 393.701313 143.989839 -L 393.920511 145.802609 -L 393.926436 145.80099 -L 394.009376 145.815477 -L 394.021224 145.762804 -L 394.252272 144.398092 -L 394.323363 51.484064 -L 394.26412 148.490792 -L 394.358909 148.490792 -L 394.382606 148.490792 -L 394.453697 49.647286 -L 394.489243 148.490792 -L 394.51294 148.490792 -L 394.584032 55.996166 -L 394.619578 148.490792 -L 394.643275 148.490792 -L 394.714366 65.911977 -L 394.749912 148.490792 -L 394.773609 148.490792 -L 394.844701 28.518294 -L 394.880246 148.490792 -L 394.903943 148.490792 -L 394.909868 34.564732 -L 395.010581 148.490792 -L 395.034278 148.490792 -L 395.040202 64.715956 -L 395.140915 148.490792 -L 395.164612 148.490792 -L 395.235704 51.830563 -L 395.271249 148.490792 -L 395.294946 148.490792 -L 395.300871 60.545987 -L 395.401584 148.490792 -L 395.425281 148.490792 -L 395.431205 68.4363 -L 395.531918 148.490792 -L 395.555615 148.490792 -L 395.626707 65.741926 -L 395.662252 148.490792 -L 395.68595 148.490792 -L 395.691874 62.518381 -L 395.792587 148.490792 -L 395.816284 148.490792 -L 395.822208 80.746672 -L 395.922921 148.490792 -L 395.946618 148.490792 -L 396.01771 75.035788 -L 396.053255 148.490792 -L 396.076953 148.490792 -L 396.148044 69.551277 -L 396.18359 148.490792 -L 396.207287 148.490792 -L 396.213211 69.861426 -L 396.313924 148.490792 -L 396.337621 148.490792 -L 396.408713 71.069153 -L 396.444259 148.490792 -L 396.467956 148.490792 -L 396.47388 90.725175 -L 396.574593 148.490792 -L 396.59829 148.490792 -L 396.669382 65.091012 -L 396.704927 148.490792 -L 396.728624 148.490792 -L 396.799716 49.245973 -L 396.835262 148.490792 -L 396.858959 148.490792 -L 396.864883 70.848458 -L 396.965596 148.490792 -L 396.989293 148.490792 -L 397.060385 71.91311 -L 397.09593 148.490792 -L 397.119627 148.490792 -L 397.125552 41.422285 -L 397.226265 148.490792 -L 397.285508 148.401068 -L 397.522479 146.027229 -L 397.717981 144.369566 -L 397.729829 144.390552 -L 397.735754 144.394922 -L 397.771299 144.286917 -L 397.800921 144.272764 -L 397.824618 144.361259 -L 398.197848 146.05536 -L 398.488138 147.232195 -L 398.51776 147.108416 -L 398.84952 145.324289 -L 398.855444 145.325099 -L 398.914687 145.486889 -L 399.092416 146.908204 -L 399.145734 146.630668 -L 399.317539 145.887121 -L 399.323463 145.888787 -L 399.38863 146.010778 -L 399.4301 145.898117 -L 399.47157 145.858703 -L 399.51304 145.970379 -L 399.518965 145.965571 -L 399.625602 146.188259 -L 399.684845 146.038776 -L 399.773709 145.615549 -L 399.815179 145.825337 -L 399.921816 146.583449 -L 399.986983 146.385931 -L 400.247652 145.483683 -L 400.526094 143.655657 -L 400.620882 143.466368 -L 400.686049 143.580705 -L 400.703822 143.62312 -L 400.739368 143.450525 -L 400.840081 143.320965 -L 400.863778 143.354035 -L 400.875627 143.393389 -L 400.917097 143.186994 -L 400.964491 142.924951 -L 401.041507 143.071082 -L 401.14222 143.341101 -L 401.207387 143.665187 -L 401.545071 145.25127 -L 401.568768 145.139884 -L 401.59839 145.066295 -L 401.645784 145.23158 -L 401.740573 145.480478 -L 401.782043 145.334294 -L 401.876832 144.856862 -L 401.93015 145.199029 -L 402.119727 146.139054 -L 402.374472 144.834322 -L 402.46926 144.38971 -L 402.534428 144.478135 -L 402.564049 144.589877 -L 402.617368 144.743863 -L 402.676611 144.601766 -L 402.688459 144.586736 -L 402.718081 144.701035 -L 402.747702 144.757704 -L 402.801021 144.590764 -L 403.037992 144.38905 -L 403.079462 144.486583 -L 403.263115 145.308791 -L 403.286812 145.409605 -L 403.375677 145.361354 -L 403.606724 144.358773 -L 403.68374 144.62993 -L 403.837771 145.020289 -L 403.885165 144.909165 -L 404.009576 144.857407 -L 404.0155 144.865001 -L 404.062894 145.03008 -L 404.133986 145.36389 -L 404.169531 145.083914 -L 404.406503 143.036724 -L 404.459821 143.246251 -L 404.708642 144.538138 -L 404.785657 144.46026 -L 404.838976 144.381992 -L 404.874522 144.527425 -L 405.081872 144.816345 -L 405.241828 145.501417 -L 405.265525 145.425233 -L 405.401783 144.947426 -L 405.431405 145.020397 -L 405.632831 145.94262 -L 405.650604 145.878668 -L 405.810559 144.419178 -L 405.887575 144.93168 -L 406.041607 145.511558 -L 406.077152 145.417244 -L 406.414837 144.02631 -L 406.456307 144.141602 -L 406.622187 144.655496 -L 406.657733 144.587141 -L 406.693278 144.54768 -L 406.7229 144.676649 -L 406.835461 145.287239 -L 406.882856 145.07305 -L 406.93025 144.692406 -L 407.001341 144.976512 -L 407.267934 146.507955 -L 407.309404 146.385248 -L 407.404193 145.579904 -L 407.439739 145.445143 -L 407.498982 145.617407 -L 407.67671 145.966243 -L 407.807045 146.497021 -L 407.866288 146.293458 -L 408.203972 143.706226 -L 408.245442 143.827123 -L 408.275064 143.892054 -L 408.334306 143.757805 -L 408.393549 143.562989 -L 408.435019 143.785092 -L 408.452792 143.848591 -L 408.523884 143.671741 -L 408.630521 143.311197 -L 408.677915 143.437825 -L 408.914887 144.199028 -L 408.950433 144.30197 -L 409.062994 145.316901 -L 409.068918 60.684348 -L 409.074843 148.490792 -L 409.169631 148.490792 -L 409.193328 148.490792 -L 409.26442 69.136517 -L 409.299966 148.490792 -L 409.323663 148.490792 -L 409.329587 70.575344 -L 409.4303 148.490792 -L 409.453997 148.490792 -L 409.459921 86.426203 -L 409.560634 148.490792 -L 409.584331 148.490792 -L 409.590256 79.949627 -L 409.690969 148.490792 -L 409.714666 148.490792 -L 409.72059 38.675608 -L 409.821303 148.490792 -L 409.845 148.490792 -L 409.850924 42.740663 -L 409.951637 148.490792 -L 409.975334 148.490792 -L 410.046426 62.438596 -L 410.081972 148.490792 -L 410.105669 148.490792 -L 410.111593 47.742504 -L 410.212306 148.490792 -L 410.236003 148.490792 -L 410.307095 40.589001 -L 410.34264 148.490792 -L 410.366338 148.490792 -L 410.437429 45.887029 -L 410.472975 148.490792 -L 410.496672 148.490792 -L 410.567763 50.97446 -L 410.603309 148.490792 -L 410.627006 148.490792 -L 410.632931 73.206687 -L 410.733643 148.490792 -L 410.757341 148.490792 -L 410.828432 48.141344 -L 410.863978 148.490792 -L 410.887675 148.490792 -L 410.893599 37.704096 -L 410.994312 148.490792 -L 411.018009 148.490792 -L 411.023934 28.411307 -L 411.124647 148.490792 -L 411.148344 148.490792 -L 411.154268 56.315072 -L 411.254981 148.490792 -L 411.278678 148.490792 -L 411.34977 91.264964 -L 411.385315 148.490792 -L 411.409012 148.490792 -L 411.480104 94.986495 -L 411.51565 148.490792 -L 411.539347 148.490792 -L 411.545271 71.225796 -L 411.645984 148.490792 -L 411.669681 148.490792 -L 411.675605 77.504338 -L 411.776318 148.490792 -L 411.800015 148.490792 -L 411.871107 70.565991 -L 411.906653 148.490792 -L 411.93035 148.490792 -L 412.001441 60.848392 -L 412.036987 148.490792 -L 412.078457 148.410268 -L 412.46946 145.115725 -L 412.576097 145.211607 -L 412.67681 145.127144 -L 412.706432 145.24513 -L 412.789372 145.577648 -L 412.872312 145.495509 -L 413.103359 144.738171 -L 413.121132 144.773522 -L 413.523984 145.505621 -L 413.547681 145.391706 -L 413.612848 145.084219 -L 413.660242 145.358423 -L 413.897214 146.532986 -L 413.909062 146.542072 -L 413.932759 146.378498 -L 413.997927 145.962514 -L 414.063094 146.168884 -L 414.092715 146.352863 -L 414.18158 146.272885 -L 414.282293 146.262369 -L 414.228974 146.359539 -L 414.311914 146.306678 -L 414.34746 146.269829 -L 414.359308 146.209011 -L 414.365233 146.19573 -L 414.412627 146.344033 -L 414.4304 146.364434 -L 414.477794 146.208935 -L 414.548886 145.720937 -L 414.63775 145.196828 -L 414.685144 145.384163 -L 414.904343 146.278394 -L 415.046526 146.685496 -L 415.082072 146.517374 -L 415.431605 144.305686 -L 415.46715 144.378901 -L 415.50862 144.477982 -L 415.544166 144.264514 -L 415.650803 144.256318 -L 415.621182 144.337932 -L 415.656728 144.262841 -L 415.911472 146.030718 -L 416.024033 146.845188 -L 416.083276 146.704435 -L 416.391339 145.789771 -L 416.468355 145.575855 -L 416.509825 145.754705 -L 416.68163 146.027762 -L 416.687554 146.02361 -L 416.794191 145.63141 -L 416.853434 145.853098 -L 416.877131 145.980247 -L 416.936374 145.77646 -L 416.965995 145.88167 -L 417.321453 147.186426 -L 417.351074 147.117872 -L 417.51103 145.855142 -L 417.665062 145.285274 -L 418.210096 142.833721 -L 418.25749 142.98197 -L 418.518159 145.339176 -L 418.595175 145.946532 -L 418.678115 145.888102 -L 418.755131 146.366408 -L 418.938784 147.279135 -L 418.956557 147.327198 -L 418.986178 147.114988 -L 419.110588 146.712939 -L 419.128361 146.740366 -L 419.418651 147.810572 -L 419.460121 147.509861 -L 419.608228 145.714421 -L 419.839276 143.761236 -L 419.862973 143.834445 -L 419.868897 143.847739 -L 419.916291 143.707706 -L 419.957761 143.644368 -L 419.999231 143.857376 -L 420.05255 144.140528 -L 420.13549 144.001948 -L 420.224354 143.826823 -L 420.253976 143.966751 -L 420.662752 146.146682 -L 420.668676 146.133911 -L 420.727919 146.258238 -L 420.816783 146.376202 -L 420.84048 146.28531 -L 421.225559 144.426906 -L 421.255181 144.361092 -L 421.278878 144.514406 -L 421.432909 145.959781 -L 421.527698 145.712766 -L 421.853534 144.448414 -L 421.877231 144.507138 -L 422.17937 145.634898 -L 422.208991 145.478106 -L 422.297855 145.052856 -L 422.351174 145.2542 -L 422.368947 145.296199 -L 422.410417 145.144308 -L 422.665161 144.349007 -L 422.671086 144.356918 -L 423.002846 146.08673 -L 423.210196 147.749276 -L 423.239817 147.67265 -L 423.559729 146.175892 -L 423.601199 146.222176 -L 423.767079 146.13006 -L 423.790776 146.240798 -L 423.891489 146.692949 -L 423.938884 146.482732 -L 423.974429 146.467512 -L 424.015899 146.569236 -L 424.483918 149.330804 -L 424.519464 149.19223 -L 424.72089 147.650895 -L 424.92824 146.366813 -L 425.028953 146.240146 -L 425.224454 145.303768 -L 425.390334 144.600952 -L 425.42588 144.67174 -L 425.562139 146.008455 -L 425.656927 146.464473 -L 425.692473 146.284055 -L 425.733943 146.060038 -L 425.816883 146.162858 -L 425.852429 146.330461 -L 425.899823 146.087835 -L 426.077552 144.992827 -L 426.166416 145.170337 -L 426.184189 145.151145 -L 426.21381 145.268015 -L 426.551495 146.935622 -L 426.575192 146.995913 -L 426.634435 146.852117 -L 426.877331 145.340195 -L 426.895104 145.353934 -L 426.918801 145.354765 -L 426.942498 145.268634 -L 427.019514 145.295149 -L 427.226864 144.65832 -L 427.30388 144.440282 -L 427.641564 142.31299 -L 427.700807 148.490792 -L 427.754126 147.495919 -L 428.05034 145.28235 -L 428.085886 145.396756 -L 428.263614 145.945387 -L 428.305084 145.74185 -L 428.447267 145.222021 -L 428.46504 145.229156 -L 428.536132 145.493182 -L 428.737558 146.339555 -L 428.7968 146.243765 -L 428.903438 146.718456 -L 429.004151 147.399824 -L 429.093015 147.325957 -L 429.122636 147.239041 -L 429.620277 144.79223 -L 429.67952 144.574647 -L 429.80393 143.86826 -L 429.851324 143.959057 -L 430.070523 145.418923 -L 430.129765 144.937793 -L 430.212706 144.607684 -L 430.266024 144.654058 -L 430.390434 145.20431 -L 430.59186 146.12319 -L 430.597784 146.12225 -L 430.870302 145.473069 -L 430.959166 145.643144 -L 431.00656 145.700139 -L 431.036182 145.563902 -L 431.083576 145.368295 -L 431.125046 145.629765 -L 431.42126 147.456081 -L 431.510125 147.737991 -L 431.545671 147.572876 -L 431.670081 147.053099 -L 431.693778 147.091355 -L 431.907052 148.656835 -L 432.019614 148.539797 -L 432.055159 148.391528 -L 432.108478 148.582407 -L 432.268434 149.441831 -L 432.333601 149.157135 -L 432.434314 148.683624 -L 432.487632 148.454932 -L 432.540951 148.691581 -L 432.71868 149.20113 -L 432.730528 149.188246 -L 432.813468 148.725133 -L 433.026743 147.209918 -L 433.062288 147.330645 -L 433.275563 148.30984 -L 433.352579 148.214738 -L 433.494762 147.186475 -L 433.725809 146.082573 -L 433.761355 146.000546 -L 433.814673 146.142628 -L 433.820597 146.145828 -L 433.844295 146.062698 -L 433.903538 145.779552 -L 433.950932 146.028404 -L 434.158282 147.696088 -L 434.193828 147.546505 -L 434.294541 147.468662 -L 434.318238 147.532629 -L 434.371556 147.33784 -L 434.572982 146.321539 -L 434.715165 145.502594 -L 434.750711 145.69846 -L 434.815878 145.496835 -L 434.975834 144.531815 -L 435.005455 144.677872 -L 435.21873 145.558573 -L 435.230578 145.548102 -L 435.289821 145.361673 -L 435.354988 145.462062 -L 435.396458 145.660785 -L 435.479398 145.553202 -L 435.526793 145.336984 -L 435.580111 145.054388 -L 435.621581 145.44373 -L 435.740067 146.37292 -L 435.805234 146.073131 -L 435.858553 145.72813 -L 435.92372 146.027927 -L 436.178464 146.651246 -L 436.196237 146.71103 -L 436.237707 146.54181 -L 436.450982 145.737258 -L 436.498376 145.878779 -L 436.533922 145.673423 -L 436.788666 144.235405 -L 436.865682 144.29465 -L 436.895303 144.223638 -L 437.007865 143.717221 -L 437.055259 143.972355 -L 437.203366 145.164532 -L 437.310004 144.938721 -L 437.351474 144.848202 -L 437.404792 144.968444 -L 437.410717 144.964807 -L 437.937978 146.879484 -L 438.05054 146.570351 -L 438.275663 146.221674 -L 438.281587 146.226249 -L 438.305284 146.130601 -L 438.583726 144.680822 -L 438.67259 144.90427 -L 438.761454 144.641349 -L 438.850319 144.401663 -L 438.891789 144.535455 -L 438.980653 144.734336 -L 439.199852 145.616689 -L 439.223549 145.583702 -L 439.519763 144.788468 -L 439.537536 144.850248 -L 439.721189 145.153219 -L 439.620476 144.772788 -L 439.744886 145.094035 -L 439.922615 144.455547 -L 439.934464 144.473149 -L 439.964085 144.512206 -L 440.005555 144.398108 -L 440.094419 144.108932 -L 440.141814 144.294051 -L 440.414331 145.684905 -L 440.420255 145.681729 -L 440.449877 145.590218 -L 440.473574 145.435836 -L 440.538741 145.736928 -L 440.680924 145.980109 -L 440.704621 146.074595 -L 440.983063 147.677464 -L 441.0897 147.555513 -L 441.308899 147.789442 -L 441.350369 147.640728 -L 441.593265 146.580704 -L 441.735447 146.755866 -L 441.859858 147.609023 -L 441.948722 147.767091 -L 441.972419 147.615236 -L 442.084981 146.982681 -L 442.144223 147.099967 -L 442.262709 147.530971 -L 442.280482 147.564231 -L 442.321952 147.305053 -L 442.416741 146.72802 -L 442.481908 146.861057 -L 442.784047 148.0176 -L 442.866987 148.192483 -L 442.908457 148.093932 -L 443.00917 147.372202 -L 443.293535 145.449441 -L 443.42387 145.547589 -L 443.643069 146.537516 -L 443.666766 146.39411 -L 443.814873 145.286723 -L 443.862267 145.710807 -L 443.96298 146.586275 -L 444.063693 146.450601 -L 444.081466 146.437692 -L 444.111087 146.367027 -L 444.117012 146.360237 -L 444.537636 144.738829 -L 444.620576 144.896619 -L 444.697592 145.039986 -L 444.756835 144.91808 -L 444.934564 144.514167 -L 445.011579 144.415918 -L 445.047125 144.555174 -L 445.100444 144.722937 -L 445.177459 144.6715 -L 445.455901 146.200038 -L 445.59216 147.650502 -L 445.651402 147.376477 -L 445.92392 145.917438 -L 445.953541 146.016244 -L 446.012784 146.355411 -L 446.066103 146.023493 -L 446.267529 144.294951 -L 446.356393 144.683972 -L 446.54597 145.209447 -L 446.557819 145.17908 -L 446.640759 145.07668 -L 446.682229 145.103212 -L 446.83626 144.889635 -L 446.859957 144.847967 -L 446.913276 144.985023 -L 447.019913 145.441822 -L 447.114702 145.361184 -L 447.191718 145.480655 -L 447.404992 146.217913 -L 447.452386 146.24568 -L 447.476083 146.156997 -L 447.523478 145.845842 -L 447.606418 145.976408 -L 447.701206 145.827848 -L 447.659736 146.003077 -L 447.736752 145.890998 -L 447.855238 146.390753 -L 447.890784 146.227575 -L 447.944102 145.903992 -L 448.003345 146.173313 -L 448.364727 146.073991 -L 448.554304 145.007174 -L 448.678714 145.250263 -L 448.820897 146.886779 -L 448.92161 146.327848 -L 448.974929 145.972548 -L 449.051944 146.09446 -L 449.075641 146.127826 -L 449.099339 145.998238 -L 449.229673 144.781965 -L 449.300764 144.856627 -L 449.531812 145.858745 -L 449.780632 147.810572 -L 449.798405 147.768998 -L 449.899118 147.701227 -L 449.910966 147.730607 -L 450.290121 149.967935 -L 450.367136 149.527889 -L 450.627805 147.915811 -L 450.876625 147.172336 -L 450.88255 147.173812 -L 450.941793 147.55125 -L 451.125445 149.053913 -L 451.190613 148.89993 -L 451.605313 147.398832 -L 451.682329 147.462904 -L 451.729723 147.549864 -L 451.777117 147.399813 -L 452.049635 146.795591 -L 452.505805 143.280414 -L 452.547275 143.364373 -L 452.559123 143.37159 -L 452.582821 143.281606 -L 452.760549 142.912164 -L 452.813868 143.110223 -L 452.938278 144.101736 -L 452.991596 143.92983 -L 453.038991 143.747054 -L 453.092309 143.953038 -L 453.3826 145.096543 -L 453.435918 144.941851 -L 453.512934 144.637456 -L 453.566253 144.837988 -L 453.655117 145.088444 -L 453.708435 144.9943 -L 453.850618 144.562631 -L 453.874316 144.579631 -L 453.88024 144.57502 -L 453.903937 144.676823 -L 454.134984 145.741808 -L 454.206076 145.59968 -L 454.37788 145.394932 -L 454.496366 145.214209 -L 454.508214 145.237766 -L 454.6267 145.870884 -L 454.774807 147.370089 -L 454.810353 147.555788 -L 454.887369 147.380932 -L 455.254675 145.908021 -L 455.331691 146.162642 -L 455.687148 148.028928 -L 455.698997 148.017036 -L 455.740467 148.121226 -L 455.912271 147.765116 -L 456.161091 146.774592 -L 456.167015 146.776733 -L 456.178864 146.785742 -L 456.21441 146.673301 -L 456.226258 146.682043 -L 456.29735 146.489817 -L 456.415835 145.864772 -L 456.492851 146.032883 -L 456.54617 146.164432 -L 456.599488 146.006211 -L 456.652807 145.936426 -L 456.688353 146.061461 -L 456.83646 146.57415 -L 456.866081 146.548353 -L 456.895703 146.626063 -L 456.949021 146.4917 -L 457.049734 146.18405 -L 457.103053 146.346758 -L 457.245236 146.434773 -L 457.274857 146.484652 -L 457.304479 146.358435 -L 457.760649 142.917483 -L 457.849513 142.987468 -L 457.879135 142.917334 -L 457.920605 143.049024 -L 457.985772 143.148163 -L 458.021318 143.025287 -L 458.039091 142.980485 -L 458.074636 143.231077 -L 458.406397 144.980711 -L 458.643368 146.911577 -L 458.684838 146.821845 -L 459.200251 145.622716 -L 459.2121 145.645556 -L 459.466844 146.176464 -L 459.478693 146.151202 -L 459.686043 145.576246 -L 459.739362 145.818099 -L 459.857847 146.044315 -L 459.87562 145.985473 -L 459.905242 145.921775 -L 459.952636 146.083541 -L 459.964485 146.097624 -L 460.005955 145.986389 -L 460.367336 144.578315 -L 460.420655 144.81074 -L 460.473973 144.770644 -L 460.485822 144.727278 -L 460.793885 143.518516 -L 460.847204 143.668867 -L 461.030857 145.292826 -L 461.143418 144.90606 -L 461.184888 144.798221 -L 461.220434 144.976488 -L 461.315222 145.432611 -L 461.368541 145.387745 -L 461.457405 145.27207 -L 461.498875 145.31255 -L 461.741771 146.192634 -L 461.789166 145.981488 -L 461.895803 145.656175 -L 461.931348 145.785784 -L 462.20979 146.873358 -L 462.37567 147.252684 -L 462.411216 147.072559 -L 462.494156 146.910089 -L 462.523777 147.059386 -L 462.630415 147.547396 -L 462.671885 147.309387 -L 462.985872 145.233768 -L 463.068812 145.231668 -L 463.033266 145.274176 -L 463.080661 145.266222 -L 463.128055 145.331512 -L 463.175449 145.208241 -L 463.329481 145.402128 -L 463.199146 145.179373 -L 463.370951 145.309086 -L 463.489436 144.891609 -L 463.631619 143.971462 -L 463.738257 144.158647 -L 463.779727 144.24219 -L 463.83897 144.108083 -L 464.093714 143.465201 -L 464.099638 143.475242 -L 464.241821 144.735143 -L 464.389928 145.157656 -L 464.395853 145.150861 -L 464.437323 145.16069 -L 464.466944 145.084515 -L 464.508414 144.950997 -L 464.54396 145.179712 -L 464.66837 146.068858 -L 464.727613 145.71936 -L 464.863872 145.486542 -L 465.088994 145.028135 -L 465.154162 145.277008 -L 465.468149 146.704671 -L 465.474073 146.688417 -L 465.551089 146.465442 -L 465.764363 144.951084 -L 465.811758 145.101089 -L 465.924319 145.181982 -L 465.942092 145.165168 -L 466.125745 144.767181 -L 466.149442 144.799115 -L 466.368641 146.005973 -L 466.404187 146.274766 -L 466.46343 145.826649 -L 466.528597 145.561884 -L 466.718174 144.817732 -L 466.824811 144.71899 -L 466.854433 144.786446 -L 467.16842 145.691321 -L 467.20989 145.64926 -L 467.269133 145.478819 -L 467.387619 145.243235 -L 467.411316 145.302043 -L 467.494256 145.525226 -L 467.683833 147.431394 -L 467.778622 146.866552 -L 467.991896 145.6462 -L 468.015593 145.761963 -L 468.145928 146.54806 -L 468.222943 146.283335 -L 468.394748 146.302164 -L 468.406596 146.231971 -L 468.613946 145.295281 -L 468.631719 145.272966 -L 468.655416 145.397232 -L 468.696886 145.595015 -L 468.767978 145.414461 -L 468.821297 145.319492 -L 468.892388 144.89253 -L 468.987177 145.114498 -L 469.141208 145.726584 -L 469.230072 145.535045 -L 469.384104 143.854247 -L 469.437423 143.602731 -L 469.496665 143.802057 -L 469.579606 143.878989 -L 469.609227 143.777544 -L 469.863971 142.947189 -L 469.869896 142.956486 -L 469.935063 143.11852 -L 469.976533 142.974723 -L 470.0417 142.758647 -L 470.08317 142.928573 -L 470.278672 143.639153 -L 470.367536 144.607556 -L 470.551189 145.815376 -L 470.74669 146.966701 -L 470.805933 146.455825 -L 471.019208 144.878293 -L 471.042905 144.948904 -L 471.155466 145.631941 -L 471.398362 147.228835 -L 471.451681 146.95386 -L 471.558318 146.669861 -L 471.587939 146.826977 -L 471.617561 146.926452 -L 471.659031 146.742108 -L 471.807138 146.217602 -L 471.955245 145.824158 -L 472.138898 144.709776 -L 472.150747 144.734625 -L 472.204066 144.765639 -L 472.233687 144.658289 -L 472.322551 143.990103 -L 472.387718 144.352304 -L 472.512129 144.682861 -L 472.535826 144.602642 -L 472.701706 143.962218 -L 472.725403 144.044375 -L 472.808343 144.215626 -L 472.879434 144.15648 -L 472.91498 144.032264 -L 472.95645 144.339272 -L 473.003845 144.690923 -L 473.069012 144.456895 -L 473.098633 144.367895 -L 473.151952 144.528373 -L 473.169725 144.511304 -L 473.228968 144.161879 -L 473.353378 144.250684 -L 473.37115 144.332089 -L 473.424469 144.234341 -L 473.460015 144.256689 -L 473.542955 144.134432 -L 473.578501 144.220435 -L 473.619971 144.463984 -L 474.064292 147.753597 -L 474.093914 147.682653 -L 474.129459 147.795111 -L 474.165005 147.800062 -L 474.236097 147.788562 -L 474.253869 147.752673 -L 474.638948 146.703668 -L 474.739661 146.633292 -L 475.095119 145.279585 -L 475.142513 145.295087 -L 475.320241 145.019892 -L 475.326166 145.033216 -L 475.385409 145.355037 -L 475.758639 146.768843 -L 475.800109 146.909314 -L 475.865276 146.715329 -L 475.95414 146.850383 -L 476.048929 147.472998 -L 476.137793 147.299711 -L 476.297749 146.591724 -L 476.368841 146.705246 -L 476.463629 147.217404 -L 476.540645 147.772816 -L 476.605812 147.583768 -L 476.836859 146.520417 -L 476.884254 146.765211 -L 476.967194 147.083281 -L 477.020512 146.997103 -L 477.275257 145.395544 -L 477.429288 144.192306 -L 477.50038 144.352984 -L 477.553698 144.556288 -L 477.87361 145.341541 -L 477.95655 145.30417 -L 477.962474 145.278099 -L 478.20537 144.690899 -L 478.258689 144.787673 -L 478.53713 145.627861 -L 478.584525 145.365612 -L 478.857042 144.468064 -L 478.910361 144.790953 -L 478.969603 145.106319 -L 479.022922 144.857124 -L 479.076241 144.491237 -L 479.135484 144.843268 -L 479.236196 145.071766 -L 479.277667 145.062599 -L 479.384304 145.460478 -L 479.479092 146.224824 -L 479.54426 146.10521 -L 479.556108 146.060161 -L 479.603502 146.296397 -L 479.644972 146.170189 -L 479.799004 145.446823 -L 479.852323 145.349162 -L 479.899717 145.538439 -L 480.095218 147.070522 -L 480.148537 147.056688 -L 480.426979 146.320335 -L 480.53954 145.730768 -L 480.598783 145.771108 -L 480.711344 145.93985 -L 480.729117 145.883262 -L 480.817982 144.818579 -L 480.877225 144.422585 -L 480.924619 144.792021 -L 481.143818 146.099734 -L 481.386713 147.100769 -L 481.416335 147.223942 -L 481.469653 147.352646 -L 481.534821 147.219671 -L 481.653306 146.483069 -L 481.973218 144.253498 -L 482.056158 144.470746 -L 482.559723 147.186591 -L 482.565647 147.181717 -L 483.069211 144.388532 -L 483.252864 143.40858 -L 483.264713 143.4477 -L 483.306183 143.590768 -L 483.720883 145.371226 -L 483.768278 145.220264 -L 483.845293 145.102412 -L 483.874915 145.246999 -L 484.117811 147.247075 -L 484.200751 147.083391 -L 484.248145 147.13518 -L 484.265918 147.038625 -L 484.348858 146.627238 -L 484.408101 146.764289 -L 484.455495 146.96506 -L 484.520662 146.802999 -L 484.733937 146.251962 -L 484.739861 146.266205 -L 484.828725 146.529245 -L 484.882044 146.35695 -L 484.95906 146.008685 -L 485.018302 146.299873 -L 485.042 146.340302 -L 485.101243 146.227341 -L 485.119015 146.246974 -L 485.196031 146.228989 -L 485.20788 146.168791 -L 485.515943 144.643385 -L 485.53964 144.659081 -L 485.847703 145.54943 -L 485.889173 145.490031 -L 486.32757 143.533386 -L 486.363116 143.655438 -L 486.475678 144.277724 -L 486.878529 146.197333 -L 486.908151 146.121628 -L 487.097728 145.402912 -L 486.967394 146.186102 -L 487.151047 145.686516 -L 487.405791 146.959252 -L 487.41764 146.94686 -L 487.696081 146.209487 -L 487.755324 146.465632 -L 487.927128 147.387904 -L 488.045614 147.315634 -L 488.134478 147.327491 -L 488.087084 147.270159 -L 488.152251 147.282467 -L 488.282586 146.979162 -L 488.318131 147.002074 -L 488.377374 146.987982 -L 488.395147 146.926739 -L 488.448466 146.839846 -L 488.484012 146.967284 -L 488.638043 148.024497 -L 488.720983 147.751076 -L 489.070516 146.181863 -L 489.319336 145.527574 -L 489.366731 145.679692 -L 489.372655 145.682354 -L 489.396352 145.581516 -L 489.502989 145.479939 -L 489.520762 145.506557 -L 489.556308 145.530869 -L 489.591854 145.427635 -L 489.799204 144.14402 -L 490.000629 142.877203 -L 490.006554 142.896562 -L 490.196131 143.923886 -L 490.267222 144.445431 -L 490.338314 144.219359 -L 490.486421 143.669559 -L 490.516043 143.788832 -L 490.616756 143.962453 -L 490.794484 144.529534 -L 490.824106 144.571723 -L 490.859651 144.466087 -L 490.883349 144.462608 -L 490.91297 144.401052 -L 490.978137 144.517079 -L 491.339519 146.773172 -L 491.434307 147.098305 -L 491.469853 147.033627 -L 491.683128 146.268122 -L 491.718673 146.422583 -L 491.831235 146.872578 -L 491.860856 146.753624 -L 492.038585 145.894528 -L 492.287405 144.572829 -L 492.317026 144.668817 -L 492.512528 145.262136 -L 492.743575 145.877625 -L 492.808742 145.673068 -L 492.909455 144.127682 -L 493.010168 142.862839 -L 493.063487 143.214282 -L 493.543354 146.17937 -L 493.70331 146.623798 -L 493.768477 146.522132 -L 493.928433 145.423155 -L 493.981752 145.653892 -L 494.11801 146.092688 -L 494.165405 145.86391 -L 494.248345 145.519713 -L 494.295739 145.643055 -L 494.307588 145.629249 -L 494.354982 145.764956 -L 494.360906 145.759734 -L 494.526786 146.192753 -L 494.793379 147.646901 -L 494.834849 147.747905 -L 494.870395 147.584361 -L 494.971108 147.190461 -L 495.036275 147.274228 -L 495.214004 147.31924 -L 495.225852 147.287672 -L 495.261398 147.349917 -L 495.397657 146.394178 -L 495.587234 145.845365 -L 495.593158 145.84905 -L 495.640553 145.889879 -L 495.670174 145.789871 -L 495.735341 145.65517 -L 495.78866 145.732802 -L 495.812357 145.789731 -L 495.853827 145.587991 -L 495.95454 145.340533 -L 495.984161 145.479694 -L 496.144117 146.161495 -L 496.191511 145.982449 -L 496.351467 145.599512 -L 496.41071 145.809129 -L 496.523272 146.263659 -L 496.588439 146.050474 -L 496.677303 145.579093 -L 496.748395 145.827312 -L 496.86688 146.199532 -L 496.896502 146.102174 -L 496.973518 145.613449 -L 497.044609 145.703204 -L 497.133473 146.583025 -L 497.174943 146.810685 -L 497.240111 146.558438 -L 497.400066 145.959845 -L 497.435612 146.111257 -L 497.465234 146.242495 -L 497.518552 145.916215 -L 497.631114 144.836056 -L 497.672584 145.381806 -L 497.885858 147.673682 -L 497.974722 148.043237 -L 498.03989 147.910851 -L 498.08136 147.959735 -L 498.110981 147.83832 -L 498.608621 145.131197 -L 498.656016 145.206482 -L 498.95223 146.037278 -L 499.064792 145.703353 -L 499.100337 145.893875 -L 499.248445 146.332273 -L 499.260293 146.328857 -L 499.414325 145.744237 -L 499.603902 145.131691 -L 499.663145 144.834131 -L 499.722388 145.047536 -L 499.775706 145.257718 -L 499.829025 145.01649 -L 499.876419 144.788429 -L 499.923813 145.118353 -L 499.959359 145.31482 -L 500.018602 145.031305 -L 500.196331 143.952511 -L 500.220028 143.978572 -L 500.374059 144.867236 -L 500.53994 145.355675 -L 500.658425 145.380751 -L 500.575485 145.413669 -L 500.66435 145.389305 -L 500.812457 145.666698 -L 500.984261 146.130629 -L 500.99611 146.124448 -L 501.031656 146.240159 -L 501.304173 147.195022 -L 501.363416 146.872044 -L 501.635933 145.362362 -L 501.74257 145.573825 -L 501.813662 145.719341 -L 501.878829 145.936971 -L 501.920299 145.718977 -L 502.092103 145.411863 -L 502.163195 145.205895 -L 502.28168 144.972099 -L 502.317226 145.096143 -L 502.577895 146.639337 -L 502.637138 146.451338 -L 502.684532 146.292872 -L 502.731926 146.493872 -L 502.779321 146.569761 -L 502.826715 146.442593 -L 502.891882 146.05869 -L 502.968898 146.154136 -L 503.028141 146.484388 -L 503.063687 146.564928 -L 503.117005 146.381449 -L 503.1644 146.272233 -L 503.235491 146.363613 -L 503.442841 147.072506 -L 503.549478 146.733503 -L 503.679813 146.36972 -L 503.709434 146.477874 -L 503.833844 146.526989 -L 503.78645 146.376185 -L 503.839768 146.522713 -L 503.857541 146.550331 -L 503.899011 146.451717 -L 503.976027 146.122671 -L 504.029346 146.294863 -L 504.355182 147.609521 -L 504.390727 147.5773 -L 504.432197 147.61593 -L 504.467743 147.532943 -L 504.686942 146.521705 -L 504.704715 146.561307 -L 504.852822 147.054223 -L 504.894292 146.995058 -L 505.166809 145.388464 -L 505.237901 145.674365 -L 505.593358 146.636736 -L 505.599282 146.616344 -L 506.055453 143.875625 -L 506.132468 144.121295 -L 506.156165 144.152617 -L 506.215408 144.042312 -L 506.227257 144.006281 -L 506.298348 144.138473 -L 506.375364 144.44292 -L 506.440531 144.300496 -L 506.511623 144.354375 -L 506.547169 144.225848 -L 506.594563 144.065622 -L 506.647881 144.247409 -L 506.677503 144.386729 -L 506.74267 144.191707 -L 506.778216 144.058232 -L 506.837459 144.282868 -L 506.95002 145.100079 -L 507.03296 145.569708 -L 507.104052 145.401866 -L 507.121825 145.376188 -L 507.15737 145.479488 -L 507.192916 145.470878 -L 507.234386 145.427241 -L 507.370645 145.956263 -L 507.524676 146.277111 -L 507.566146 146.13949 -L 507.714253 145.763136 -L 507.726102 145.773235 -L 507.743875 145.798398 -L 507.838663 145.519877 -L 508.087484 144.321885 -L 508.288909 143.417074 -L 508.336304 143.265714 -L 508.395547 143.44707 -L 508.845793 145.815005 -L 509.124234 147.926181 -L 509.260493 148.072684 -L 509.15978 147.870223 -L 509.296039 148.021233 -L 509.384903 147.942121 -L 509.402676 148.037398 -L 509.544859 148.61002 -L 509.580404 148.452929 -L 510.11359 146.12093 -L 510.226152 146.413445 -L 510.593458 147.841062 -L 510.605306 147.863496 -L 510.646776 147.672589 -L 510.800808 146.591528 -L 510.824505 146.71114 -L 511.031855 147.481517 -L 511.185887 148.040019 -L 511.233281 147.864571 -L 511.932347 144.281307 -L 512.121924 143.896179 -L 512.145622 144.049111 -L 512.216713 144.326579 -L 512.275956 144.294998 -L 512.376669 144.099799 -L 512.512927 143.752394 -L 512.536625 143.827467 -L 512.595868 144.213037 -L 512.826915 145.441174 -L 512.832839 145.461297 -L 512.886158 145.259528 -L 512.892082 145.252199 -L 512.927628 145.376459 -L 512.986871 145.54003 -L 513.040189 145.408175 -L 513.069811 145.399131 -L 513.093508 145.319944 -L 513.294934 144.40815 -L 513.306782 144.442842 -L 513.632618 145.706303 -L 513.638542 145.701864 -L 513.650391 145.708269 -L 513.674088 145.57914 -L 513.74518 145.486121 -L 513.774801 145.621622 -L 514.065091 147.155176 -L 514.094713 147.108408 -L 514.189501 146.769633 -L 514.230971 146.979944 -L 514.266517 147.091522 -L 514.313911 146.869436 -L 514.693066 145.36869 -L 514.349457 146.922145 -L 514.728612 145.455694 -L 514.853022 145.662932 -L 514.770082 145.428875 -L 514.912264 145.572743 -L 514.959659 145.302081 -L 515.089993 144.369229 -L 515.131463 144.578429 -L 515.303268 145.11488 -L 515.338813 145.021836 -L 515.451375 144.351522 -L 515.522466 144.679629 -L 515.581709 144.941013 -L 515.694271 144.903553 -L 515.706119 144.910333 -L 515.735741 144.799882 -L 515.806832 144.424405 -L 515.931242 144.051354 -L 515.960864 144.205183 -L 516.263002 145.455584 -L 516.2867 145.394207 -L 516.45258 144.550067 -L 516.517747 144.834875 -L 516.778416 146.158734 -L 516.808037 146.112365 -L 516.86728 145.791289 -L 517.204964 144.273611 -L 517.305677 143.828071 -L 517.40639 143.088165 -L 517.459709 143.479627 -L 517.690756 145.326635 -L 517.73815 145.246614 -L 517.82109 145.176131 -L 517.850712 145.249995 -L 517.998819 146.412296 -L 518.093608 145.977962 -L 518.395746 144.762337 -L 518.413519 144.795128 -L 518.490535 145.234778 -L 518.609021 145.970932 -L 518.656415 145.727908 -L 518.697885 145.57993 -L 518.768977 145.685367 -L 518.851917 146.672485 -L 518.982251 147.237316 -L 519.005948 147.211799 -L 519.183677 147.60647 -L 519.059267 147.078865 -L 519.219223 147.495898 -L 519.296238 147.098448 -L 519.444346 145.85698 -L 519.53321 145.926468 -L 519.562831 145.933679 -L 519.580604 145.994726 -L 519.598377 145.993693 -L 519.639847 146.027462 -L 519.669469 145.927957 -L 519.69909 145.975381 -L 519.811651 145.366829 -L 519.912364 144.646716 -L 519.953834 144.922686 -L 520.161184 145.712179 -L 520.173033 145.699732 -L 520.19673 145.701399 -L 520.220427 145.608025 -L 520.327065 144.946762 -L 520.421853 145.065084 -L 520.824705 147.612659 -L 520.878023 147.327229 -L 521.097222 146.576864 -L 521.103146 146.571433 -L 521.120919 146.651191 -L 521.292724 147.941052 -L 521.357891 147.760568 -L 521.363815 147.754111 -L 521.399361 147.833172 -L 521.423058 147.843542 -L 521.446755 147.891633 -L 521.482301 147.776527 -L 521.754818 146.151876 -L 521.790364 146.343957 -L 521.831834 146.436536 -L 521.873304 146.292518 -L 522.045108 145.659782 -L 522.056957 145.638057 -L 522.098427 145.786632 -L 522.483506 147.26643 -L 522.548673 147.413747 -L 522.590143 147.257956 -L 522.797493 146.080451 -L 522.833039 146.230837 -L 522.921903 146.589722 -L 522.963373 146.431571 -L 523.046313 145.981615 -L 523.093708 146.223934 -L 523.206269 146.765297 -L 523.247739 146.541866 -L 523.378073 145.836701 -L 523.478786 145.866222 -L 523.579499 145.626494 -L 523.620969 145.468929 -L 523.686136 145.609499 -L 523.840168 145.747106 -L 523.852016 145.739065 -L 523.881638 145.840015 -L 524.166004 147.223781 -L 524.385203 148.236381 -L 524.444445 148.238312 -L 524.462218 148.17452 -L 524.983556 145.593383 -L 525.096117 144.589694 -L 525.131663 144.734399 -L 525.309392 146.71373 -L 525.498969 148.263781 -L 525.552287 147.977735 -L 525.730016 146.482202 -L 525.824805 146.776815 -L 525.842578 146.803466 -L 525.895896 146.640983 -L 526.002533 145.98826 -L 526.221732 144.543721 -L 526.227656 144.550418 -L 526.257278 144.695526 -L 526.417234 145.378776 -L 526.541644 145.695934 -L 526.577189 145.596509 -L 526.701599 145.331485 -L 526.731221 145.362962 -L 526.837858 145.513223 -L 527.009663 145.987151 -L 527.015587 145.976409 -L 527.045208 145.961292 -L 527.068905 146.082446 -L 527.151845 146.464275 -L 527.211088 146.314909 -L 527.495454 145.694327 -L 527.501378 145.696213 -L 527.548773 145.933688 -L 527.554697 61.312808 -L 527.560621 148.490792 -L 527.65541 148.490792 -L 527.679107 148.490792 -L 527.685031 86.066353 -L 527.785744 148.490792 -L 527.809442 148.490792 -L 527.880533 64.466134 -L 527.916079 148.490792 -L 527.939776 148.490792 -L 527.9457 49.948058 -L 528.046413 148.490792 -L 528.07011 148.490792 -L 528.141202 67.870044 -L 528.176747 148.490792 -L 528.200445 148.490792 -L 528.206369 69.419423 -L 528.307082 148.490792 -L 528.330779 148.490792 -L 528.40187 90.31606 -L 528.437416 148.490792 -L 528.461113 148.490792 -L 528.467038 93.306073 -L 528.56775 148.490792 -L 528.591448 148.490792 -L 528.662539 74.842295 -L 528.698085 148.490792 -L 528.721782 148.490792 -L 528.792873 50.777813 -L 528.828419 148.490792 -L 528.852116 148.490792 -L 528.923208 49.195083 -L 528.958754 148.490792 -L 528.982451 148.490792 -L 528.988375 49.267629 -L 529.089088 148.490792 -L 529.112785 148.490792 -L 529.118709 57.985242 -L 529.219422 148.490792 -L 529.243119 148.490792 -L 529.249044 49.844985 -L 529.349757 148.490792 -L 529.373454 148.490792 -L 529.379378 65.534327 -L 529.480091 148.490792 -L 529.503788 148.490792 -L 529.57488 70.678385 -L 529.610425 148.490792 -L 529.634123 148.490792 -L 529.640047 98.590528 -L 529.74076 148.490792 -L 529.764457 148.490792 -L 529.835548 79.246737 -L 529.871094 148.490792 -L 529.894791 148.490792 -L 529.900716 73.012228 -L 530.001428 148.490792 -L 530.025126 148.490792 -L 530.096217 43.166607 -L 530.131763 148.490792 -L 530.15546 148.490792 -L 530.161384 45.106551 -L 530.262097 148.490792 -L 530.285794 148.490792 -L 530.291719 46.455904 -L 530.392431 148.490792 -L 530.416129 148.490792 -L 530.48722 81.874419 -L 530.522766 148.490792 -L 530.57016 148.401603 -L 531.050028 145.698832 -L 531.061876 145.729388 -L 531.369939 146.978054 -L 531.393636 146.888381 -L 531.559516 146.31993 -L 531.589138 146.375109 -L 531.654305 146.247032 -L 531.678002 146.182797 -L 531.737245 146.362566 -L 531.766867 146.476163 -L 531.849807 146.400532 -L 531.885352 146.305677 -L 531.938671 146.47053 -L 531.944595 146.467203 -L 531.968292 146.501188 -L 532.039384 146.419947 -L 532.187491 145.288232 -L 532.258583 145.086567 -L 532.300053 145.248225 -L 532.65551 146.697941 -L 532.69698 146.624894 -L 532.732526 146.394618 -L 532.892481 145.932126 -L 532.928027 146.060563 -L 533.15315 147.507622 -L 533.176847 147.437752 -L 533.295333 147.06807 -L 533.330879 147.144651 -L 533.496759 148.147317 -L 533.579699 147.760277 -L 534.047718 145.850147 -L 534.089188 145.977168 -L 534.172128 146.23133 -L 534.219522 146.127203 -L 534.225446 146.135569 -L 534.260992 146.001402 -L 534.397251 145.94242 -L 534.480191 145.612033 -L 534.586828 144.98018 -L 534.640147 145.283619 -L 535.137787 147.84157 -L 535.161484 147.892727 -L 535.191106 147.789211 -L 535.220727 147.776311 -L 535.268121 147.594872 -L 535.40438 146.510106 -L 535.463623 146.562301 -L 535.522866 146.669335 -L 535.57026 146.873068 -L 535.629503 146.649843 -L 535.69467 146.604451 -L 535.730216 146.684861 -L 536.032355 147.806216 -L 536.10937 147.398798 -L 536.245629 146.818516 -L 536.387812 146.433728 -L 536.405585 146.476372 -L 536.559616 146.689526 -L 536.713648 147.5607 -L 536.808436 148.098233 -L 536.849906 147.831174 -L 536.992089 146.621536 -L 537.069105 146.945523 -L 537.110575 147.076217 -L 537.205364 147.044722 -L 537.264607 147.087545 -L 537.28238 147.000642 -L 537.732625 144.073435 -L 537.744474 144.102337 -L 537.957748 145.190391 -L 538.058461 145.114501 -L 538.064386 145.108757 -L 538.11178 145.207853 -L 538.117704 145.206865 -L 538.200644 145.20118 -L 538.212493 145.149652 -L 538.336903 145.052042 -L 538.253963 145.163351 -L 538.342827 145.068364 -L 538.419843 145.499815 -L 538.680512 147.279918 -L 538.686436 147.275897 -L 538.751603 146.696354 -L 538.911559 145.959428 -L 538.953029 145.907216 -L 539.000423 146.022162 -L 539.237395 146.934318 -L 539.278865 146.725838 -L 539.349956 146.451395 -L 539.403275 146.583258 -L 539.456594 146.772322 -L 539.515836 146.60578 -L 539.557306 146.46823 -L 539.610625 146.649982 -L 540.019401 148.744907 -L 540.049022 148.686808 -L 540.15566 148.170889 -L 540.208978 148.479348 -L 540.297843 148.90146 -L 540.339313 148.762899 -L 540.44595 147.607209 -L 540.605906 146.596695 -L 540.641451 146.620114 -L 540.748089 146.923685 -L 540.807331 146.804679 -L 540.86065 146.887875 -L 540.990984 147.075077 -L 541.002833 147.060311 -L 541.02653 147.030348 -L 541.079849 147.176019 -L 541.127243 147.381741 -L 541.174637 147.133678 -L 541.216107 146.787115 -L 541.435306 145.4106 -L 541.541943 145.095078 -L 541.64858 144.464071 -L 541.707823 144.668293 -L 542.187691 146.645241 -L 542.371344 146.504915 -L 542.732725 144.832158 -L 542.768271 144.894429 -L 542.969697 145.790584 -L 543.034864 146.193585 -L 543.088183 145.869468 -L 543.117804 145.782416 -L 543.165198 145.976246 -L 543.188896 146.013475 -L 543.23629 145.913891 -L 543.254063 145.913348 -L 543.431791 145.149639 -L 543.491034 145.484314 -L 543.556202 145.8101 -L 543.633217 145.68951 -L 543.73393 145.902152 -L 543.805022 146.174727 -L 543.846492 145.923542 -L 543.98275 144.819259 -L 544.041993 145.053469 -L 544.563331 148.386275 -L 544.598876 148.443447 -L 544.634422 148.293264 -L 544.800302 147.488294 -L 544.835848 147.713627 -L 544.859545 147.822612 -L 544.918788 147.540833 -L 545.185381 145.528182 -L 545.262397 145.805541 -L 545.392731 145.714574 -L 545.635627 144.181168 -L 545.718567 143.780986 -L 545.754113 144.03138 -L 545.813356 144.380354 -L 545.884447 144.236878 -L 545.914069 144.134655 -L 545.961463 144.37079 -L 546.156964 145.09397 -L 546.216207 145.272469 -L 546.500573 146.564011 -L 546.553892 146.427347 -L 546.583513 146.330073 -L 546.796788 145.146483 -L 546.885652 145.576617 -L 546.903425 145.648441 -L 546.950819 145.34692 -L 547.152245 143.406461 -L 547.199639 143.57422 -L 547.584718 145.930704 -L 547.744674 147.762477 -L 547.786144 147.516104 -L 548.017191 146.263964 -L 548.052737 146.187698 -L 548.123828 146.273715 -L 548.200844 146.391926 -L 548.242314 146.319756 -L 548.295633 146.155338 -L 548.585923 144.938116 -L 548.627393 145.065587 -L 548.680711 145.042261 -L 548.763651 145.709166 -L 549.012472 147.705333 -L 549.036169 147.575364 -L 549.332383 145.965577 -L 549.35608 145.978575 -L 549.373853 146.060024 -L 549.385702 146.095105 -L 549.450869 145.896757 -L 549.456793 145.877418 -L 549.516036 146.060756 -L 549.634522 146.309613 -L 549.675992 146.136447 -L 549.782629 145.769443 -L 549.883342 145.196277 -L 549.936661 145.476533 -L 550.108465 146.026267 -L 550.345437 146.09412 -L 550.351361 146.079992 -L 550.369134 146.029056 -L 550.410604 146.240968 -L 550.463922 146.481006 -L 550.540938 146.427947 -L 550.866774 147.916391 -L 550.914168 147.789917 -L 551.02673 147.454439 -L 551.60731 143.394332 -L 551.696175 143.618099 -L 551.885752 144.51391 -L 552.241209 146.10723 -L 552.371543 145.852357 -L 552.691455 143.193788 -L 552.774395 142.31146 -L 552.833638 148.490792 -L 552.886957 147.672691 -L 553.23649 145.718279 -L 553.283884 145.425211 -L 553.420143 145.102725 -L 553.44384 145.119096 -L 553.473461 145.094647 -L 553.503083 145.188379 -L 553.562326 145.500486 -L 553.615644 145.222932 -L 553.698584 145.018528 -L 553.740054 145.129627 -L 553.787449 145.331788 -L 553.840767 145.064247 -L 554.089587 143.451085 -L 554.119209 143.494764 -L 554.261392 143.431453 -L 554.184376 143.560768 -L 554.279164 143.471431 -L 554.753108 146.732297 -L 554.907139 146.608051 -L 555.013776 146.371581 -L 555.049322 146.519439 -L 555.132262 146.730905 -L 555.185581 146.67601 -L 555.262596 146.851631 -L 555.517341 147.990149 -L 555.564735 147.760558 -L 555.825404 146.441094 -L 556.032754 145.745242 -L 556.0683 145.809734 -L 556.133467 145.729155 -L 556.340817 145.038538 -L 556.364514 145.127373 -L 556.465227 145.138355 -L 556.477076 145.114208 -L 556.506697 144.989183 -L 556.560016 145.235687 -L 556.625183 145.596337 -L 556.678502 145.362162 -L 556.761442 145.152627 -L 556.796987 145.252964 -L 556.826609 145.358171 -L 556.879927 145.168022 -L 557.099126 144.450408 -L 557.336098 144.041994 -L 557.365719 144.145508 -L 557.638236 146.051341 -L 557.709328 145.967206 -L 557.916678 145.307129 -L 557.750798 146.03519 -L 557.975921 145.57306 -L 558.088482 146.377395 -L 558.153649 146.333731 -L 558.272135 145.851574 -L 558.408394 144.735879 -L 558.455788 145.078965 -L 558.627593 145.854548 -L 558.657214 145.733599 -L 558.669063 145.702608 -L 558.746078 145.815837 -L 558.81717 145.956097 -L 558.894186 146.148563 -L 558.923807 145.993394 -L 559.054141 144.735699 -L 559.131157 145.281782 -L 559.225946 145.980455 -L 559.291113 145.973681 -L 559.31481 146.013894 -L 559.320734 146.044352 -L 559.445144 146.569259 -L 559.48069 146.474013 -L 559.883542 144.290189 -L 559.954633 143.842229 -L 560.013876 143.978416 -L 560.102741 143.754907 -L 560.144211 143.879937 -L 560.203453 143.988195 -L 560.262696 144.156356 -L 560.327864 144.034655 -L 560.381182 144.170265 -L 560.819579 146.277226 -L 560.86105 146.046751 -L 560.997308 145.038454 -L 561.062475 145.16947 -L 561.376463 146.606827 -L 561.44163 146.993554 -L 561.500873 147.26562 -L 561.560116 147.080757 -L 561.589737 147.011184 -L 561.625283 147.179864 -L 561.986664 148.747085 -L 561.998513 148.714849 -L 562.199939 147.132096 -L 562.401365 145.685133 -L 562.56132 144.785814 -L 562.685731 144.893278 -L 562.703503 144.863529 -L 562.744973 144.984728 -L 562.964172 145.626119 -L 563.023415 145.464566 -L 563.307781 144.130378 -L 563.438115 143.448775 -L 563.532904 143.5141 -L 563.580298 143.742189 -L 563.681011 143.950672 -L 563.716557 143.898758 -L 563.746178 143.8029 -L 563.840967 143.837253 -L 564.000923 144.852939 -L 564.137181 145.168581 -L 564.143106 145.158049 -L 564.202348 145.104988 -L 564.249743 145.192354 -L 564.362304 145.771965 -L 564.427471 145.527277 -L 564.658519 144.274902 -L 564.723686 144.342722 -L 564.782929 144.723946 -L 565.108765 147.178589 -L 565.173932 147.240851 -L 565.203553 147.117371 -L 565.357585 145.752963 -L 565.487919 146.041518 -L 565.564935 146.277484 -L 565.618254 146.127818 -L 565.653799 146.018923 -L 565.707118 146.183713 -L 565.795982 146.536068 -L 565.855225 146.35248 -L 566.068499 145.960318 -L 566.15144 146.099372 -L 566.157364 146.10848 -L 566.186985 145.957662 -L 566.506897 144.161466 -L 566.52467 144.165657 -L 566.743868 143.43927 -L 566.850506 143.569051 -L 566.886051 143.502224 -L 566.986764 143.914843 -L 567.282979 146.710053 -L 567.336297 146.595527 -L 567.454783 146.310152 -L 567.964272 144.427905 -L 567.987969 144.517125 -L 568.307881 145.815283 -L 568.408594 146.07023 -L 568.438215 145.977511 -L 568.556701 145.448574 -L 568.592247 145.602797 -L 568.835142 147.480235 -L 568.94178 148.366313 -L 568.989174 148.289787 -L 569.095811 148.058748 -L 569.279464 147.0318 -L 569.309086 147.11865 -L 569.492738 147.468761 -L 569.593451 147.393688 -L 569.623073 147.531619 -L 569.706013 148.174909 -L 569.865969 149.142157 -L 569.883742 149.033116 -L 570.06147 146.986971 -L 570.316215 144.945642 -L 570.322139 144.953719 -L 570.328063 144.972335 -L 570.375458 144.775737 -L 570.612429 142.818914 -L 570.683521 143.41762 -L 570.784233 143.781958 -L 570.825704 143.702032 -L 570.896795 143.58393 -L 570.961962 143.80124 -L 571.050826 144.151743 -L 571.447754 146.394995 -L 571.548467 146.226458 -L 571.589937 146.114743 -L 571.661028 146.237612 -L 571.868378 146.719119 -L 571.986864 146.607975 -L 572.093501 146.254748 -L 572.134971 146.340547 -L 572.567444 148.147453 -L 572.579293 148.099113 -L 572.76887 146.917367 -L 573.071009 145.8064 -L 573.1421 145.646472 -L 573.183571 145.838884 -L 573.651589 148.584305 -L 573.675286 148.566128 -L 573.734529 148.403334 -L 573.829318 147.982641 -L 573.900409 148.055691 -L 574.095911 147.084013 -L 574.338807 145.194601 -L 574.427671 145.28675 -L 574.528384 145.495322 -L 574.581703 145.312887 -L 574.700188 144.634357 -L 574.889766 143.401097 -L 574.919387 143.440567 -L 574.954933 143.485828 -L 575.008251 143.401377 -L 575.0201 143.401622 -L 575.073419 143.362993 -L 575.079343 143.32111 -L 575.174132 142.991008 -L 575.251147 143.074493 -L 575.31039 143.014342 -L 575.446649 143.848104 -L 575.997608 146.693309 -L 576.033153 146.491663 -L 576.163488 146.142054 -L 576.216806 146.26311 -L 576.323444 146.649687 -L 576.382687 146.922688 -L 576.436005 146.691541 -L 576.601885 146.420712 -L 576.631507 146.472441 -L 576.738144 146.10935 -L 576.93957 144.890793 -L 576.986964 145.132364 -L 577.004737 145.162062 -L 577.046207 145.032934 -L 577.265406 144.244752 -L 577.324648 144.380247 -L 577.543847 146.821749 -L 577.626787 146.590971 -L 577.715652 146.23682 -L 577.76897 146.36904 -L 577.958547 147.283689 -L 577.994093 147.1857 -L 578.379172 145.390633 -L 578.39102 145.408765 -L 578.432491 145.263012 -L 578.444339 145.244594 -L 578.515431 145.359633 -L 578.722781 145.962876 -L 578.758326 146.200125 -L 578.829418 145.927937 -L 579.001222 145.431523 -L 579.036768 145.589076 -L 579.084162 145.730937 -L 579.137481 145.57789 -L 579.190799 145.443148 -L 579.238194 145.64688 -L 579.528484 146.538735 -L 579.540333 146.554795 -L 579.6055 146.454691 -L 579.806926 146.082131 -L 579.848396 146.185169 -L 579.960957 146.704133 -L 580.120913 148.181916 -L 580.197929 147.878385 -L 580.304566 147.15319 -L 580.411203 147.206378 -L 580.529689 147.525356 -L 580.588932 147.318581 -L 580.654099 146.85394 -L 580.731115 147.021243 -L 580.89107 147.729245 -L 580.944389 147.671166 -L 581.335392 146.534172 -L 581.524969 146.050979 -L 581.756017 145.461794 -L 581.803411 145.192078 -L 582.016685 144.304759 -L 582.058155 144.242755 -L 582.081852 144.392933 -L 582.372143 147.061178 -L 582.413613 146.772287 -L 582.715751 145.223591 -L 582.739449 145.120096 -L 582.798691 144.723031 -L 582.857934 145.028335 -L 583.011966 145.90405 -L 583.10083 145.667778 -L 583.136376 145.655112 -L 583.154149 145.582125 -L 583.438515 144.882013 -L 583.491833 145.016252 -L 583.521455 144.845839 -L 583.604395 144.614788 -L 583.63994 144.732745 -L 583.924306 145.762579 -L 584.149429 145.572428 -L 584.374552 144.796022 -L 584.232369 145.649564 -L 584.421947 144.994693 -L 584.611524 146.093636 -L 584.753707 146.406595 -L 584.801101 146.5531 -L 584.955133 146.894689 -L 585.032148 146.894928 -L 585.049921 146.844191 -L 585.073618 146.801201 -L 585.126937 146.924816 -L 585.132861 146.915702 -L 585.280969 146.855796 -L 585.292817 146.838791 -L 585.322439 146.971597 -L 585.369833 147.293803 -L 585.446849 147.091084 -L 585.494243 146.997377 -L 585.529789 147.153739 -L 585.571259 147.232851 -L 585.618653 147.024558 -L 585.737139 146.291811 -L 585.796382 146.350056 -L 585.831927 146.381871 -L 585.8497 146.295894 -L 586.288098 143.320524 -L 586.311795 143.394781 -L 586.465826 145.401452 -L 586.602085 146.46149 -L 586.631706 146.342142 -L 586.685025 146.101315 -L 586.732419 146.374423 -L 586.880527 147.498766 -L 586.945694 147.330638 -L 587.194514 145.391908 -L 587.295227 145.532945 -L 587.301151 145.537989 -L 587.336697 145.435815 -L 587.609214 144.149867 -L 587.680306 144.402161 -L 588.006141 145.909304 -L 587.721776 144.393076 -L 588.041687 145.785656 -L 588.231264 145.243264 -L 588.26681 145.434425 -L 588.385296 146.22751 -L 588.456387 146.072412 -L 588.604495 144.736803 -L 588.758526 143.825619 -L 588.788148 143.916014 -L 588.865163 144.402512 -L 589.048816 145.420236 -L 589.066589 145.405018 -L 589.125832 145.185442 -L 589.256166 144.824383 -L 589.291712 144.916539 -L 589.392425 145.415989 -L 589.528684 146.067868 -L 589.558305 145.972211 -L 589.593851 146.055193 -L 589.664942 146.216981 -L 589.706412 146.088042 -L 589.919687 145.379956 -L 590.002627 145.388777 -L 590.026324 145.430763 -L 590.10334 145.521253 -L 590.138885 145.422345 -L 590.470646 144.479495 -L 590.482494 144.557702 -L 590.618753 145.180141 -L 590.648374 145.152889 -L 590.660223 145.149297 -L 590.707617 145.248447 -L 590.962362 146.751324 -L 591.068999 146.354268 -L 591.199333 145.822059 -L 591.246727 145.851744 -L 591.329668 145.593369 -L 591.382986 145.690637 -L 591.454078 145.848953 -L 591.51332 145.810368 -L 591.566639 145.892328 -L 591.596261 145.747089 -L 591.750292 144.892065 -L 591.851005 145.008048 -L 591.922096 145.205045 -L 592.052431 145.303625 -L 592.218311 145.911749 -L 592.52045 148.301277 -L 592.585617 147.785609 -L 592.952923 145.155379 -L 592.970696 145.093493 -L 593.047711 145.244841 -L 593.278759 145.573289 -L 593.355774 145.38096 -L 593.497957 145.20587 -L 593.539427 145.343126 -L 593.877112 146.675941 -L 593.960052 146.584198 -L 594.303661 144.213083 -L 594.374752 144.486068 -L 594.457692 145.02909 -L 594.540632 144.696728 -L 594.647269 144.455981 -L 594.676891 144.611527 -L 594.984954 146.218253 -L 594.990878 146.203535 -L 595.014575 146.121503 -L 595.06197 146.33242 -L 595.168607 146.702404 -L 595.192304 146.55931 -L 595.47667 144.779644 -L 595.589231 144.202889 -L 595.612928 144.28534 -L 596.14019 147.270509 -L 596.211282 147.084831 -L 596.454177 146.063777 -L 596.483799 146.182616 -L 596.708922 147.17004 -L 596.744468 147.091615 -L 596.756316 147.067897 -L 596.797786 147.242663 -L 596.910348 147.56431 -L 596.934045 147.486614 -L 597.052531 146.991486 -L 597.099925 147.023076 -L 597.159168 147.249358 -L 597.467231 148.980423 -L 597.520549 149.115599 -L 597.579792 149.387975 -L 597.615338 149.04153 -L 597.798991 146.762229 -L 597.85231 146.904821 -L 598.01819 147.853312 -L 598.089281 147.633601 -L 598.64024 145.16649 -L 598.752802 145.394016 -L 598.794272 145.47597 -L 598.829817 145.629478 -L 598.894985 145.428398 -L 599.090486 145.070633 -L 599.149729 145.266243 -L 599.351155 146.03209 -L 599.380776 145.953678 -L 599.665142 145.218282 -L 599.676991 145.233354 -L 599.736234 145.888528 -L 599.866568 146.78433 -L 599.902114 146.669509 -L 600.014675 145.40698 -L 600.180555 144.477785 -L 600.233874 144.404073 -L 600.275344 144.535146 -L 600.364208 144.862677 -L 600.76706 147.191699 -L 600.838151 147.016563 -L 601.075123 145.986794 -L 601.116593 146.091496 -L 601.211381 146.385587 -L 601.270624 146.191723 -L 601.406883 145.942358 -L 601.436504 145.976987 -L 601.55499 145.806294 -L 601.572763 145.742839 -L 601.632006 145.920148 -L 601.667552 146.107437 -L 601.744567 145.932724 -L 601.84528 146.264012 -L 601.910448 146.020866 -L 602.218511 144.41871 -L 602.230359 144.463373 -L 602.390315 146.603665 -L 602.573968 147.737455 -L 602.745772 148.138158 -L 602.799091 147.997781 -L 602.899804 146.950405 -L 603.01829 146.177079 -L 603.053835 146.339606 -L 603.077532 146.337908 -L 603.095305 146.254255 -L 603.284883 145.183787 -L 603.326353 145.316361 -L 603.379671 145.42495 -L 603.421141 145.285201 -L 603.628491 143.939242 -L 603.693659 144.140726 -L 603.865463 143.844885 -L 603.906933 143.735906 -L 604.025419 143.220694 -L 604.066889 143.128917 -L 604.102434 143.297505 -L 604.677091 146.336924 -L 604.718561 146.287969 -L 604.748182 146.305765 -L 604.777803 146.20725 -L 604.783728 146.203641 -L 604.872592 145.719116 -L 605.002926 144.443132 -L 605.109564 143.900892 -L 605.156958 143.924686 -L 605.162882 143.928433 -L 605.192504 143.844563 -L 605.251747 143.650368 -L 605.305065 143.805117 -L 605.60128 146.019246 -L 605.619052 145.936792 -L 605.962661 144.769495 -L 605.992283 144.85966 -L 606.43068 146.830547 -L 606.466226 146.701679 -L 606.667652 146.082947 -L 606.715046 145.818064 -L 606.774289 146.079588 -L 606.875002 146.759929 -L 606.92832 146.567216 -L 607.236383 144.403217 -L 607.319323 144.71428 -L 607.538522 145.635639 -L 607.568144 145.550287 -L 607.876207 143.876998 -L 608.000617 143.513761 -L 608.030238 143.522914 -L 608.172421 143.321742 -L 608.219815 143.424062 -L 608.302755 144.388321 -L 608.498257 145.791326 -L 608.510105 145.783772 -L 608.533803 145.904748 -L 608.622667 146.471439 -L 608.687834 146.360044 -L 608.693758 146.363706 -L 608.72338 146.268995 -L 608.871487 145.458013 -L 608.912957 145.596634 -L 609.084761 146.145967 -L 609.09661 146.138293 -L 609.232869 146.246777 -L 609.256566 146.322295 -L 609.327657 146.17292 -L 609.623872 144.733717 -L 609.819373 143.957151 -L 609.997102 142.758885 -L 610.044496 142.896294 -L 610.210376 143.461125 -L 610.263695 143.328408 -L 610.482894 142.674128 -L 610.548061 142.708625 -L 610.844275 144.439408 -L 610.927215 144.892567 -L 610.980534 144.649685 -L 611.045701 144.210561 -L 611.093095 144.534293 -L 611.22343 145.591257 -L 611.282673 145.403795 -L 611.507796 144.408108 -L 611.578887 144.606658 -L 611.732919 145.207093 -L 611.786237 145.003004 -L 611.96989 144.239487 -L 611.987663 144.260791 -L 612.040982 144.14065 -L 612.070603 144.310706 -L 612.396439 146.341561 -L 612.461606 146.55026 -L 612.479379 146.63149 -L 612.550471 146.473563 -L 612.556395 146.473314 -L 612.740048 146.056352 -L 612.793366 146.263279 -L 612.905928 147.103413 -L 613.000716 146.884032 -L 613.107354 146.892587 -L 613.059959 146.953463 -L 613.119202 146.911097 -L 613.373947 147.234994 -L 613.403568 147.01743 -L 613.610918 145.308813 -L 613.705707 145.471157 -L 613.76495 145.577592 -L 613.788647 145.631956 -L 613.853814 145.456963 -L 613.859738 145.44236 -L 613.913057 145.594591 -L 613.978224 145.789853 -L 614.031543 145.650236 -L 614.197423 145.120454 -L 614.215196 145.140797 -L 614.274439 145.239337 -L 614.309984 145.093244 -L 614.387 144.950883 -L 614.42847 145.063679 -L 614.493637 145.26851 -L 614.588426 145.151878 -L 614.618047 145.064855 -L 614.700987 145.157239 -L 615.234173 146.121801 -L 614.724685 145.14295 -L 615.263795 145.9934 -L 615.405978 145.346178 -L 615.447448 145.371385 -L 615.577782 145.16567 -L 615.601479 145.079243 -L 615.637025 145.273409 -L 615.684419 145.181908 -L 615.755511 145.378389 -L 615.814754 145.968913 -L 615.897694 145.739673 -L 615.992482 145.683156 -L 616.010255 145.754479 -L 616.18206 146.626289 -L 616.265 146.25351 -L 616.454577 145.554452 -L 616.531593 145.469095 -L 616.561214 145.48895 -L 616.63823 145.054439 -L 616.703397 144.691276 -L 616.768564 144.85615 -L 617.041082 146.784739 -L 617.0944 146.403378 -L 617.378766 145.055805 -L 617.396539 145.072457 -L 617.479479 145.224127 -L 617.520949 145.094285 -L 617.651283 144.884912 -L 617.686829 144.97999 -L 617.959346 145.248281 -L 618.036362 145.536374 -L 618.083756 145.364777 -L 618.107454 145.327578 -L 618.166696 145.463363 -L 618.332577 146.454972 -L 618.403668 146.101151 -L 618.534002 145.776815 -L 618.575472 145.925843 -L 618.658412 146.288117 -L 618.729504 146.165121 -L 618.883535 145.360641 -L 619.108658 143.590798 -L 619.209371 143.537005 -L 619.227144 143.569839 -L 619.440419 144.465156 -L 619.493737 144.295304 -L 619.67739 143.466915 -L 619.736633 143.154762 -L 619.8018 143.34686 -L 620.044696 144.316194 -L 620.139485 144.560126 -L 620.186879 144.458726 -L 620.25797 144.313086 -L 620.293516 144.472696 -L 620.305365 144.512378 -L 620.346835 144.27472 -L 620.536412 143.513099 -L 620.566033 143.53322 -L 620.625276 143.628534 -L 621.087371 147.188001 -L 621.128841 147.081981 -L 621.146614 147.097382 -L 621.170311 146.990793 -L 621.211781 146.817064 -L 621.271024 147.013568 -L 621.478374 147.930499 -L 621.608708 147.79423 -L 621.833831 146.895274 -L 621.904923 146.744707 -L 621.964166 146.821566 -L 621.993787 146.904394 -L 622.029333 146.736783 -L 622.503276 144.720138 -L 622.603989 144.601631 -L 622.645459 144.656733 -L 623.024613 146.530925 -L 623.030538 146.528467 -L 623.125326 146.907524 -L 623.255661 147.553886 -L 623.303055 147.341778 -L 623.468935 146.940379 -L 623.492632 146.837505 -L 623.551875 146.647948 -L 623.617042 146.730945 -L 623.634815 146.742707 -L 623.664437 146.590892 -L 623.824392 145.176876 -L 623.907332 145.519759 -L 623.984348 145.799566 -L 624.031742 145.601101 -L 624.079137 145.353492 -L 624.13838 145.616946 -L 624.22132 145.992488 -L 624.292411 145.798477 -L 624.458291 145.460386 -L 624.582701 145.254272 -L 624.600474 145.281784 -L 625.056644 146.759789 -L 625.068493 146.732647 -L 625.151433 146.565548 -L 625.186979 146.707432 -L 625.240297 147.04054 -L 625.311389 146.814237 -L 625.471345 146.490345 -L 625.495042 146.500234 -L 625.50689 146.55383 -L 625.54836 146.783785 -L 625.607603 146.498587 -L 625.820878 145.460291 -L 625.826802 145.472388 -L 625.945288 145.768033 -L 626.016379 145.713697 -L 626.075622 146.101407 -L 626.123016 146.387635 -L 626.188184 146.180255 -L 626.306669 145.698583 -L 626.413307 145.81054 -L 626.454777 145.695147 -L 626.502171 145.438347 -L 626.561414 145.662699 -L 626.691748 146.493969 -L 626.750991 146.371475 -L 626.910947 146.585221 -L 626.993887 146.880151 -L 627.041281 146.655907 -L 627.307874 145.237457 -L 627.337496 145.275237 -L 627.349344 145.264508 -L 627.408587 145.37684 -L 627.532997 145.919394 -L 627.580392 145.816606 -L 627.621862 145.798024 -L 627.657407 145.883682 -L 627.817363 146.641916 -L 627.876606 146.263807 -L 628.25576 143.305459 -L 628.261685 143.294102 -L 628.297231 143.447679 -L 628.445338 144.472281 -L 628.557899 144.325001 -L 628.587521 144.217881 -L 628.842265 142.828841 -L 628.984448 143.053726 -L 629.310284 144.447983 -L 629.565028 146.445688 -L 629.588726 146.3509 -L 629.59465 146.343463 -L 629.653893 146.44302 -L 629.665741 146.435821 -L 629.67759 146.377703 -L 629.92641 145.030334 -L 629.961956 145.089054 -L 629.973804 145.094328 -L 629.991577 145.177498 -L 630.05082 145.684505 -L 630.169306 146.715458 -L 630.2167 146.565827 -L 630.264094 146.460063 -L 630.311489 146.636749 -L 630.335186 146.702566 -L 630.38258 146.513669 -L 630.625476 144.645395 -L 630.643249 144.657899 -L 630.71434 144.38521 -L 630.803205 143.744724 -L 630.874296 144.014238 -L 631.022403 144.863416 -L 631.117192 145.412894 -L 631.164586 145.21295 -L 631.229754 144.889606 -L 631.342315 144.251732 -L 631.407482 144.406892 -L 631.697772 145.401344 -L 631.857728 146.328228 -L 631.875501 146.283909 -L 631.911047 146.185834 -L 631.97029 146.343933 -L 631.982138 146.362171 -L 632.035457 146.233668 -L 632.065078 146.283671 -L 632.076927 146.30117 -L 632.112473 146.193144 -L 632.183564 145.718279 -L 632.248731 146.054229 -L 632.278353 146.161367 -L 632.319823 145.890788 -L 632.390914 145.495189 -L 632.456081 145.672473 -L 632.556794 145.550829 -L 632.645659 145.310222 -L 632.681204 145.411488 -L 632.75822 145.60247 -L 632.793766 145.426939 -L 633.030737 144.749344 -L 633.042586 144.760953 -L 633.078132 144.852767 -L 633.13145 144.665763 -L 633.196617 144.355821 -L 633.25586 144.606112 -L 633.303255 144.705299 -L 633.350649 144.537962 -L 633.569848 143.777773 -L 633.587621 143.812619 -L 633.652788 144.186243 -L 633.848289 145.492708 -L 633.854214 145.497014 -L 633.877911 145.396922 -L 634.097109 143.957081 -L 634.180049 144.186592 -L 634.233368 144.473085 -L 634.328157 144.424743 -L 634.624371 145.514284 -L 634.665841 145.396918 -L 634.683614 145.384408 -L 634.707311 145.499464 -L 635.00945 147.253643 -L 635.062768 147.074785 -L 635.110163 147.233672 -L 635.38268 148.619746 -L 635.388604 148.61887 -L 635.412302 148.542795 -L 635.637425 147.1103 -L 635.67297 147.178269 -L 636.212081 145.237452 -L 636.265399 144.950648 -L 636.318718 145.224645 -L 636.502371 146.647416 -L 636.567538 146.231638 -L 636.650478 145.607405 -L 636.792661 144.867217 -L 636.816358 144.948427 -L 637.112572 146.268669 -L 637.248831 145.957635 -L 637.278453 146.138045 -L 637.515424 147.218492 -L 637.574667 147.122154 -L 637.705001 146.497673 -L 637.805714 146.795541 -L 637.859033 147.183149 -L 637.906427 147.356132 -L 637.971594 147.244506 -L 638.17302 146.854353 -L 638.244112 147.023428 -L 638.510705 147.81938 -L 638.516629 147.805541 -L 638.558099 147.689777 -L 638.623266 147.817408 -L 638.706206 148.182798 -L 638.789146 148.087073 -L 639.251241 145.799431 -L 639.280862 145.866139 -L 639.334181 146.274392 -L 639.417121 146.671473 -L 639.458591 146.518371 -L 639.742957 145.258652 -L 639.814048 144.727184 -L 639.879215 144.825001 -L 639.950307 144.79521 -L 639.96808 144.856104 -L 640.033247 145.254248 -L 640.110263 145.073264 -L 640.2169 144.775962 -L 640.252446 144.867891 -L 640.524963 146.773936 -L 640.584206 146.44866 -L 640.862647 145.245375 -L 640.886345 145.339756 -L 641.141089 146.475326 -L 641.188483 146.349276 -L 641.555789 144.142524 -L 641.591335 144.002028 -L 641.656502 144.164395 -L 641.727594 144.479151 -L 641.798685 144.27219 -L 641.828306 144.279329 -L 641.846079 144.370423 -L 641.875701 144.441473 -L 641.964565 144.399237 -L 642.047505 144.801649 -L 642.213385 145.903747 -L 642.225234 145.893641 -L 642.355568 145.627416 -L 642.391114 145.868725 -L 642.521448 146.700115 -L 642.574767 146.361066 -L 642.639934 146.141279 -L 642.705101 146.245745 -L 642.995391 146.948902 -L 643.030937 146.874358 -L 643.078331 146.758962 -L 643.155347 146.42363 -L 643.208666 146.607692 -L 643.327152 146.966614 -L 643.350849 146.869446 -L 643.469334 146.069573 -L 643.528577 146.302134 -L 643.79517 146.967126 -L 643.830716 146.872257 -L 644.014369 145.890154 -L 644.067688 146.133059 -L 644.115082 146.310475 -L 644.180249 146.155525 -L 644.233568 146.221495 -L 644.565328 144.876408 -L 644.962255 142.273635 -L 645.021498 148.490792 -L 645.074817 147.008751 -L 645.317713 143.744441 -L 645.365107 143.708688 -L 645.388804 143.825615 -L 645.519138 144.54752 -L 645.560608 144.466542 -L 645.773883 143.708067 -L 645.809429 143.698162 -L 645.827201 143.799586 -L 645.886444 144.010878 -L 645.939763 143.84606 -L 646.224129 143.113244 -L 646.271523 143.221701 -L 646.390009 144.580958 -L 646.650678 146.911818 -L 646.775088 145.959915 -L 646.858028 146.359034 -L 646.911346 146.515137 -L 646.976514 146.447676 -L 646.994286 146.414819 -L 647.029832 146.557254 -L 647.106848 146.871775 -L 647.148318 146.632405 -L 647.444532 144.759844 -L 647.527472 145.205994 -L 647.580791 145.387047 -L 647.645958 145.286462 -L 647.681504 145.247651 -L 647.71705 145.344049 -L 647.740747 145.316499 -L 647.823687 145.456151 -L 647.859233 145.357148 -L 647.983643 144.79107 -L 648.025113 145.039436 -L 648.392419 146.588194 -L 648.410191 146.606312 -L 648.451661 146.450353 -L 648.824892 144.699732 -L 648.91968 144.850547 -L 649.032242 144.523257 -L 649.115182 144.692645 -L 649.150728 144.822028 -L 649.381775 145.647905 -L 649.393623 145.661376 -L 649.417321 145.521068 -L 649.476563 145.249043 -L 649.529882 145.490492 -L 649.606898 145.590769 -L 649.636519 145.473807 -L 649.790551 144.60178 -L 649.879415 144.908712 -L 650.009749 145.597341 -L 650.039371 145.459583 -L 650.13416 145.282094 -L 650.157857 145.412069 -L 650.17563 145.476548 -L 650.223024 145.210608 -L 650.282267 145.046154 -L 650.335585 145.188395 -L 650.442223 145.578897 -L 650.578481 145.869245 -L 650.59033 145.857994 -L 650.596254 145.84906 -L 650.625876 146.000473 -L 650.667346 146.22563 -L 650.750286 146.10368 -L 650.910241 145.598959 -L 651.08797 145.120482 -L 651.093894 145.134711 -L 651.259774 145.866748 -L 651.425655 146.788912 -L 651.478973 146.86516 -L 651.532292 146.761689 -L 651.62708 145.850215 -L 651.79296 145.295991 -L 652.337995 143.637323 -L 652.379465 143.764527 -L 652.782317 145.332172 -L 652.468329 143.717911 -L 652.80009 145.298743 -L 652.918575 144.778623 -L 652.977818 144.943019 -L 653.137774 145.688575 -L 653.220714 146.143218 -L 653.285881 145.979196 -L 653.309578 145.93738 -L 653.368821 146.047036 -L 653.392518 145.997826 -L 653.688733 145.874457 -L 653.694657 145.883391 -L 653.783522 146.158666 -L 653.854613 146.031174 -L 653.931629 146.290157 -L 654.00272 146.759048 -L 654.079736 146.526048 -L 654.25154 145.986532 -L 654.287086 146.038417 -L 654.322632 145.914358 -L 654.606998 144.989869 -L 654.642543 144.890929 -L 654.725483 144.390056 -L 654.778802 144.715376 -L 654.956531 146.334337 -L 655.057244 145.946885 -L 655.537111 143.393916 -L 655.566733 143.337501 -L 655.708915 143.64902 -L 656.135464 145.683545 -L 656.230253 146.180837 -L 656.301344 146.585756 -L 656.372436 146.407192 -L 656.579786 145.935229 -L 656.597559 146.005413 -L 656.763439 147.161419 -L 656.787136 147.254088 -L 656.828606 146.889427 -L 657.118896 144.914745 -L 657.130745 144.944713 -L 657.154442 144.985967 -L 657.213685 144.704935 -L 657.308473 144.197614 -L 657.355868 144.375534 -L 657.503975 146.085714 -L 657.592839 146.9773 -L 657.646158 146.645033 -L 657.746871 146.063309 -L 657.800189 146.321623 -L 658.043085 145.487412 -L 658.17342 144.377036 -L 658.238587 144.552121 -L 658.309678 145.280889 -L 658.428164 145.929276 -L 658.46371 145.795634 -L 658.50518 145.734078 -L 658.54665 145.908352 -L 658.825091 147.843282 -L 658.91988 147.504066 -L 658.955426 147.649201 -L 659.139079 148.231984 -L 659.174624 148.082406 -L 659.411596 147.142377 -L 659.518233 147.268601 -L 659.607098 147.700221 -L 659.684113 147.443733 -L 659.695962 147.403008 -L 659.755205 147.580644 -L 659.761129 147.572161 -L 659.772978 147.567251 -L 659.790751 147.607396 -L 659.826296 147.633201 -L 659.861842 147.76181 -L 659.909236 147.522963 -L 660.158056 146.387052 -L 660.205451 146.474484 -L 660.276542 146.605137 -L 660.329861 146.557908 -L 660.347634 146.531429 -L 660.412801 146.642733 -L 660.418725 146.642646 -L 660.436498 146.661455 -L 660.827501 145.743742 -L 660.928214 145.469107 -L 660.969684 145.527486 -L 660.981533 145.504725 -L 661.040775 145.605471 -L 661.313293 146.215942 -L 661.319217 146.221207 -L 661.366611 146.120075 -L 661.37846 146.073404 -L 661.449551 146.214244 -L 661.4614 146.200825 -L 661.50287 146.275657 -L 661.615432 145.830722 -L 661.822782 144.817692 -L 661.852403 144.916346 -L 662.231558 145.971902 -L 661.911646 144.849083 -L 662.267103 145.903469 -L 662.355968 145.794079 -L 662.391513 145.870486 -L 662.622561 146.510901 -L 662.823986 146.276624 -L 663.025412 144.488062 -L 663.084655 144.588016 -L 663.108352 144.626938 -L 663.149822 144.500705 -L 663.274232 144.080004 -L 663.309778 144.22557 -L 663.392718 144.46908 -L 663.635614 145.685815 -L 663.914056 147.394246 -L 663.943677 147.407288 -L 663.955526 147.484012 -L 664.00292 147.779666 -L 664.068087 147.55497 -L 664.370226 146.040736 -L 664.453166 146.431263 -L 664.536106 146.497622 -L 664.571652 146.432105 -L 664.761229 145.854008 -L 664.856018 146.112042 -L 664.879715 146.122854 -L 664.921185 146.040653 -L 664.962655 145.845668 -L 665.010049 146.175761 -L 665.223323 148.014508 -L 665.294415 147.940468 -L 665.353658 147.509188 -L 665.851298 142.566392 -L 665.892768 142.401682 -L 665.987557 142.483973 -L 666.017178 142.595957 -L 666.313393 144.969085 -L 666.775487 146.973596 -L 666.852503 146.675178 -L 666.893973 146.639253 -L 666.91767 146.784442 -L 667.065777 147.423617 -L 667.136869 147.137792 -L 667.302749 146.655625 -L 667.433083 146.69064 -L 667.444932 146.648258 -L 667.462705 146.582598 -L 667.516023 146.788991 -L 667.681903 147.100582 -L 667.705601 147.13069 -L 667.735222 147.007097 -L 667.835935 146.115863 -L 667.895178 145.792295 -L 667.948496 146.043726 -L 667.978118 146.088457 -L 668.037361 145.972529 -L 668.173619 145.629378 -L 668.274332 145.497706 -L 668.292105 145.576085 -L 668.58832 147.123324 -L 668.647562 146.853022 -L 668.87861 145.612206 -L 668.884534 145.616736 -L 668.931928 145.758401 -L 669.139278 146.37938 -L 669.162976 146.289794 -L 669.204446 146.069826 -L 669.263689 146.349787 -L 669.411796 147.233386 -L 669.471039 146.980389 -L 669.636919 146.550052 -L 669.696162 146.696521 -L 669.713934 146.730708 -L 669.767253 146.593506 -L 669.87389 146.243315 -L 669.91536 146.46306 -L 669.95683 146.596238 -L 670.004225 146.388051 -L 670.051619 146.284272 -L 670.093089 146.439523 -L 670.187878 146.859968 -L 670.264893 146.677774 -L 670.649972 144.782898 -L 670.721064 144.82774 -L 671.017278 145.603343 -L 671.064672 145.680576 -L 671.123915 145.602213 -L 671.147612 145.600608 -L 671.17131 145.691646 -L 671.414205 146.995224 -L 671.437903 146.877631 -L 671.716344 144.646706 -L 671.882224 143.550344 -L 671.911846 143.613531 -L 672.00071 144.331526 -L 672.071801 144.015038 -L 672.184363 143.927177 -L 672.190287 143.928795 -L 672.45688 144.605625 -L 672.66423 145.721084 -L 672.693852 145.611909 -L 672.871581 145.328138 -L 672.895278 145.384741 -L 672.995991 145.864067 -L 673.078931 145.741556 -L 673.203341 145.871231 -L 673.227038 145.831258 -L 673.244811 145.809126 -L 673.304054 145.919038 -L 673.410691 146.406678 -L 673.541025 146.2828 -L 673.700981 145.26748 -L 673.736527 145.451911 -L 673.896482 145.978552 -L 673.943877 145.958283 -L 674.097908 145.683949 -L 674.133454 145.768021 -L 674.151227 145.80382 -L 674.21047 145.628452 -L 674.423744 144.749631 -L 674.536306 144.572125 -L 674.571851 144.669516 -L 674.714034 145.849677 -L 674.87399 146.987913 -L 674.891763 146.936811 -L 674.9984 146.566872 -L 675.045795 146.739892 -L 675.24722 147.0061 -L 675.472343 147.693127 -L 675.484192 147.685063 -L 675.596753 147.496336 -L 675.626375 147.587219 -L 675.644148 147.586679 -L 675.644148 147.586679 -" clip-path="url(#p751bab7541)" style="fill: none; stroke: #d62728; stroke-width: 1.5; stroke-linecap: square"/> + <path d="M 83.217386 146.349497 +L 83.300298 146.100228 +L 83.365444 146.3062 +L 83.424666 146.39599 +L 83.4602 146.280799 +L 83.495734 146.176465 +L 83.549034 146.334623 +L 83.720781 147.202464 +L 83.762237 147.147218 +L 83.833304 147.007319 +L 83.898449 146.575258 +L 84.176797 145.393611 +L 84.23602 145.301108 +L 84.437377 144.646672 +L 84.449222 144.624623 +L 84.490678 144.801178 +L 84.774948 146.117577 +L 84.982228 147.058444 +L 84.98815 147.057115 +L 84.999995 147.058624 +L 85.029606 146.946773 +L 85.284264 145.759384 +L 85.302031 145.79618 +L 85.438244 145.519887 +L 85.521156 145.105106 +L 85.604068 145.251274 +L 85.681058 145.555743 +L 85.835037 146.194017 +L 85.864648 146.1341 +L 86.10154 144.238715 +L 86.17853 144.545323 +L 86.557556 146.488268 +L 86.569401 146.472887 +L 86.699691 145.62321 +L 86.806292 144.996846 +L 86.85367 145.133578 +L 87.161629 145.840912 +L 87.285997 146.267845 +L 87.303764 146.23557 +L 87.392598 146.175076 +L 87.42221 146.195643 +L 87.439977 146.202529 +L 87.47551 146.083714 +L 87.564345 145.578293 +L 87.676868 145.723083 +L 87.730169 145.809369 +L 87.783469 145.702017 +L 88.026283 145.438425 +L 88.055894 145.575562 +L 88.334242 146.205963 +L 88.375698 146.110694 +L 88.446765 145.78081 +L 88.505988 145.941562 +L 88.618512 146.05493 +L 88.553366 145.846062 +L 88.642201 146.027579 +L 88.671812 145.949101 +L 88.719191 146.132915 +L 88.766569 146.483234 +L 88.920548 147.213622 +L 88.938315 147.193554 +L 89.062683 147.361906 +L 89.115984 147.667187 +L 89.187051 147.442631 +L 89.358797 147.071776 +L 89.376564 147.115686 +L 89.394331 147.125222 +L 89.423943 147.023753 +L 89.429865 147.021095 +L 89.524621 146.941001 +L 89.548311 147.034857 +L 89.601611 147.180893 +L 89.654912 147.031412 +L 89.927337 145.826685 +L 90.045783 145.911348 +L 90.11685 145.748369 +L 90.158306 145.917911 +L 90.181995 146.093489 +L 90.24714 145.748749 +L 90.377431 144.664553 +L 90.466265 144.847076 +L 90.507721 144.64719 +L 90.572866 144.286154 +L 90.638011 144.47956 +L 90.691312 144.501602 +L 90.720923 144.408659 +L 90.928203 143.608701 +L 90.975582 143.782211 +L 91.129561 143.838647 +L 91.171017 143.900432 +L 91.206551 143.758135 +L 91.253929 143.567036 +L 91.30723 143.821954 +L 91.727712 146.341763 +L 91.763246 146.2766 +L 91.781013 146.261306 +L 91.816546 146.366042 +L 91.822469 146.366271 +L 91.917225 146.446679 +L 91.85208 146.318826 +L 91.934992 146.383103 +L 92.011982 146.104443 +L 92.053438 146.272172 +L 92.083049 146.397 +L 92.142272 146.144195 +L 92.34363 145.222952 +L 92.39693 145.493128 +L 92.479842 145.666344 +L 92.515376 145.566515 +L 92.568677 145.450468 +L 92.621977 145.594032 +L 92.858869 146.599104 +L 92.88848 146.524123 +L 93.060227 146.060547 +L 93.077993 146.108763 +L 93.421486 146.824777 +L 93.445175 146.697228 +L 93.770901 144.993988 +L 93.782745 145.005168 +L 93.918958 145.439622 +L 94.007792 145.758876 +L 94.049248 145.62877 +L 94.120316 145.233568 +L 94.36313 143.969525 +L 94.374974 144.00026 +L 94.600021 144.67298 +L 94.629632 144.55021 +L 94.783612 143.984595 +L 94.842835 144.118671 +L 94.967203 144.014706 +L 94.973125 144.002112 +L 95.014581 144.149843 +L 95.292929 145.868225 +L 95.334385 145.807643 +L 95.559431 144.528962 +L 95.630499 144.874563 +L 95.891079 145.604808 +L 95.908846 145.567735 +L 96.07467 144.606725 +L 96.145738 144.888634 +L 96.193116 144.919472 +L 96.246417 144.836545 +L 96.311562 144.607346 +L 96.453697 143.596162 +L 96.524764 144.00574 +L 96.678744 144.31213 +L 96.69651 144.260067 +L 96.708355 144.221793 +L 96.7735 144.403243 +L 96.779422 144.400148 +L 96.809034 144.421167 +L 96.826801 144.491254 +L 97.164371 146.253856 +L 97.176216 146.220207 +L 97.294661 145.691053 +L 97.330195 145.841257 +L 97.507864 146.622823 +L 97.573009 147.028558 +L 97.667765 146.974003 +L 97.803978 146.665777 +L 98.177082 144.804393 +L 98.206693 144.903605 +L 98.265916 145.224849 +L 98.342906 145.009201 +L 98.372518 144.998564 +L 98.413974 145.072849 +L 98.66271 146.133956 +L 98.733777 145.827548 +L 98.739699 145.816387 +L 98.775233 145.953457 +L 98.988435 147.002984 +L 99.059503 147.396655 +L 99.28455 148.372584 +L 99.296394 148.39091 +L 99.349695 148.300911 +L 99.705032 146.390912 +L 100.089981 144.801643 +L 100.119592 144.861286 +L 100.249882 145.218036 +L 100.297261 145.100772 +L 100.504541 143.499214 +L 100.563764 143.849676 +L 101.049391 146.940426 +L 101.084925 146.849184 +L 101.132303 146.883396 +L 102.133169 143.568076 +L 102.168703 143.729831 +L 102.233848 144.117344 +L 102.31676 144.063966 +L 102.352294 144.256462 +L 102.47074 145.674839 +L 102.67802 146.611232 +L 102.683942 146.597555 +L 102.737243 146.59374 +L 102.75501 146.682578 +L 102.950445 147.400367 +L 102.96229 147.382935 +L 102.974134 147.34479 +L 103.045202 147.50258 +L 103.252482 148.045528 +L 103.276171 147.921972 +L 103.655197 145.037101 +L 103.684808 144.922836 +L 103.744031 145.143617 +L 103.850633 146.108978 +L 103.992767 145.963131 +L 104.087524 145.408894 +L 104.140825 145.637242 +L 104.383638 147.222066 +L 104.401405 147.248577 +L 104.431017 147.125234 +L 104.703442 146.221032 +L 104.75082 146.31394 +L 104.780431 146.461847 +L 104.898877 147.133477 +L 104.940333 146.985379 +L 105.348971 145.71965 +L 105.37266 145.776642 +L 105.420038 145.75548 +L 105.52664 145.911685 +L 105.585862 145.992418 +L 105.698386 145.653375 +L 105.870132 145.060381 +L 105.887899 145.122093 +L 106.302459 147.217075 +L 106.373527 146.960008 +L 106.610418 145.341459 +L 106.717019 145.644167 +L 106.90061 146.362957 +L 106.912455 146.348986 +L 106.9776 146.052411 +L 107.362548 143.779021 +L 107.486916 144.078211 +L 107.646818 144.69358 +L 107.682352 144.582692 +L 107.753419 144.331894 +L 107.80672 144.494449 +L 107.889632 144.743977 +L 107.93701 144.622511 +L 108.014 144.478752 +L 108.061378 144.601963 +L 108.185746 144.932549 +L 108.203513 144.845415 +L 108.381182 144.229917 +L 108.410793 144.305227 +L 108.849042 145.606041 +L 109.038555 146.351693 +L 109.0504 146.320916 +L 109.654473 144.214897 +L 109.701852 144.236758 +L 109.855831 144.658245 +L 109.950588 145.213854 +L 110.00981 145.180331 +L 110.157868 144.953823 +L 110.187479 145.008506 +L 110.305925 145.356172 +L 110.519127 146.077047 +L 110.560583 145.922071 +L 110.702718 145.628394 +L 110.70864 145.634929 +L 110.779708 145.729125 +L 110.921843 146.575205 +L 110.975143 146.164779 +L 111.164656 145.579028 +L 111.425237 145.223966 +L 111.431159 145.22826 +L 111.502227 145.328188 +L 111.56145 145.289639 +L 111.82203 143.898225 +L 111.981932 144.007273 +L 112.088533 144.329636 +L 112.206979 144.757658 +L 112.272124 144.680854 +L 112.331347 144.83662 +L 112.343191 144.854403 +L 112.39057 144.743646 +L 112.402414 144.748096 +L 112.526782 144.374158 +L 112.734062 143.964176 +L 112.769596 143.899241 +L 112.834741 144.004207 +L 112.864353 144.136006 +L 113.071633 145.034002 +L 113.089399 145.017623 +L 113.172311 145.224047 +L 113.355902 146.047661 +L 113.379591 145.93354 +L 113.569105 144.98909 +L 113.68755 144.718188 +L 113.717162 144.764264 +L 113.76454 144.859288 +L 113.811918 144.706445 +L 113.817841 144.687997 +L 113.89483 144.804127 +L 114.108033 145.688677 +L 114.25609 146.388872 +L 114.285701 146.319642 +L 114.297546 146.310753 +L 114.321235 146.419804 +L 114.498904 147.238585 +L 114.54036 147.102393 +L 114.842396 146.500605 +L 114.87793 146.639984 +L 114.966764 146.802824 +L 115.002298 146.672516 +L 115.156277 146.232347 +L 115.179967 146.301231 +L 115.227345 146.45877 +L 115.29249 146.323343 +L 115.647827 144.173293 +L 115.665594 144.221797 +L 115.772195 144.438066 +L 115.819574 144.331058 +L 115.926175 143.840035 +L 115.973553 144.085543 +L 116.32889 146.033215 +L 116.340735 146.006804 +L 116.512481 145.541441 +L 116.66646 144.691541 +L 116.696072 144.860793 +L 116.731606 144.884565 +L 116.778984 144.810306 +L 116.962575 144.232704 +L 116.992186 144.239263 +L 117.240922 143.830829 +L 117.246845 143.826674 +L 117.276456 143.941469 +L 117.921985 146.195081 +L 118.046353 147.451482 +L 118.152954 147.361423 +L 118.259556 146.49391 +L 118.520136 144.859023 +L 118.585281 144.653069 +L 118.674116 144.783057 +L 118.691882 144.689323 +L 118.780717 144.411299 +L 118.828095 144.519087 +L 118.875473 144.535049 +L 118.905085 144.461534 +L 119.076831 144.227232 +L 119.651293 145.893816 +L 119.692749 145.689911 +L 119.894107 144.892633 +L 119.959252 144.991236 +L 120.119154 145.521423 +L 120.148765 145.406879 +L 120.456724 144.169236 +L 120.474491 144.223205 +L 120.515947 144.485105 +L 120.610703 145.014771 +L 120.664004 144.825757 +L 120.776527 144.971357 +L 120.693615 144.770906 +L 120.806139 144.827793 +L 120.930507 144.452719 +L 120.960118 144.498427 +L 120.98973 144.470546 +L 121.025263 144.565012 +L 121.45759 146.425403 +L 121.522735 146.16118 +L 121.528658 146.15683 +L 121.552347 146.265921 +L 121.747782 147.478417 +L 121.866228 147.216222 +L 121.955062 146.999813 +L 122.002441 147.117169 +L 122.138653 147.433843 +L 122.186032 147.344341 +L 122.3637 146.372253 +L 122.411078 146.406373 +L 122.422923 146.397542 +L 122.452534 146.536269 +L 122.49399 146.594416 +L 122.541369 146.460076 +L 122.77826 145.471747 +L 122.796027 145.500751 +L 122.997385 146.322142 +L 123.06253 146.139339 +L 123.086219 146.098937 +L 123.13952 146.223797 +L 123.257965 146.395879 +L 123.293499 146.355297 +L 123.329033 146.239698 +L 123.4001 146.343367 +L 123.518546 146.850511 +L 123.589613 146.614105 +L 123.820583 145.596472 +L 123.832427 145.622341 +L 123.974562 146.478541 +L 124.140386 147.66132 +L 124.199609 147.425701 +L 124.329899 147.191024 +L 124.46019 147.083177 +L 124.602324 146.867141 +L 124.620091 146.922854 +L 124.637858 146.953052 +L 124.679314 146.763401 +L 124.809604 146.360518 +L 124.839216 146.443383 +L 124.868827 146.553983 +L 124.933972 146.387275 +L 125.21232 145.264983 +L 125.230087 145.245369 +L 125.277465 145.341656 +L 125.567657 146.624794 +L 125.591346 146.503791 +L 125.828238 145.376261 +L 125.869694 145.458032 +L 125.875616 145.453968 +L 125.893383 145.570176 +L 126.053285 146.582551 +L 126.076974 146.512931 +L 126.11843 146.339875 +L 126.183575 146.530495 +L 126.467845 148.015251 +L 126.527068 147.891573 +L 126.568524 147.713517 +L 126.633669 147.918086 +L 126.704736 147.989636 +L 126.728425 147.864043 +L 126.763959 147.952318 +L 126.894249 147.632547 +L 127.166674 145.878823 +L 127.320654 145.417802 +L 127.379877 145.28362 +L 127.575312 144.394324 +L 127.581235 144.416004 +L 127.69968 145.073972 +L 127.800359 145.7489 +L 127.847737 145.522788 +L 127.889193 145.634754 +L 127.978028 146.109697 +L 128.055017 145.949766 +L 128.084629 145.920285 +L 128.126085 146.063694 +L 128.291909 146.685163 +L 128.309676 146.631083 +L 128.357054 146.717576 +L 128.463655 146.528598 +L 128.5288 146.35471 +L 128.937438 143.684821 +L 128.972972 143.801726 +L 129.393454 146.4362 +L 129.399376 146.417355 +L 129.64219 145.425178 +L 129.754714 144.938197 +L 129.79617 145.072149 +L 129.967916 145.662213 +L 130.05675 145.997081 +L 130.281797 147.060473 +L 130.376554 147.272547 +L 130.435777 147.159391 +L 130.660823 146.257611 +L 130.702279 146.42702 +L 130.974705 147.94263 +L 130.998394 147.840502 +L 131.187907 147.177215 +L 131.282664 147.104579 +L 131.389265 146.810363 +L 131.436643 146.974504 +L 131.50771 147.196994 +L 131.566933 147.072698 +L 131.649845 146.644404 +L 131.709068 146.287285 +L 131.774213 146.510016 +L 131.987416 148.209478 +L 132.111784 148.056012 +L 132.224307 148.13298 +L 132.265763 148.018739 +L 132.36052 147.806383 +L 132.419743 147.916606 +L 132.473043 147.8616 +L 132.514499 147.950513 +L 132.555955 148.067054 +L 132.615178 147.931508 +L 132.857992 146.110102 +L 132.988282 144.958061 +L 133.041583 145.035847 +L 133.254785 145.512444 +L 133.272552 145.427553 +L 133.47391 144.545128 +L 133.503521 144.572564 +L 133.627889 144.513719 +L 133.847014 143.547184 +L 133.876625 143.640929 +L 133.977304 143.484777 +L 134.01876 143.669682 +L 134.320797 144.697842 +L 134.338563 144.642191 +L 134.409631 144.436439 +L 134.457009 144.614768 +L 134.652445 145.421106 +L 134.664289 145.382621 +L 134.948559 143.989269 +L 134.990015 144.201333 +L 135.179528 144.643926 +L 135.635544 146.421088 +L 135.677 146.307971 +L 135.765834 146.204769 +L 135.801368 146.250629 +L 135.819135 146.237069 +L 135.83098 146.161166 +L 136.044182 145.529074 +L 136.079716 145.691168 +L 136.239617 146.265941 +L 136.269229 146.241288 +L 136.58311 146.875795 +L 136.683789 146.686533 +L 136.79039 146.312604 +L 137.056893 145.516656 +L 137.163494 145.187659 +L 137.270095 144.802151 +L 137.311551 145.020214 +L 137.435919 145.642808 +L 137.495142 145.516982 +L 137.61951 144.791532 +L 137.720189 145.080059 +L 137.933391 146.551052 +L 138.004459 146.431867 +L 138.140671 146.429438 +L 138.152516 146.393838 +L 138.359796 145.776875 +L 138.454553 145.826098 +L 138.501931 145.659414 +L 138.614454 145.107997 +L 138.667755 145.270174 +L 138.892802 145.822056 +L 138.999403 146.376212 +L 139.153382 146.813485 +L 139.171149 146.739008 +L 139.366585 146.126246 +L 139.390274 146.156046 +L 139.408041 146.208427 +L 139.467263 146.018709 +L 139.544253 145.733939 +L 139.615321 145.890937 +L 139.792989 146.835316 +L 139.852212 146.497061 +L 140.189782 143.465186 +L 140.278617 143.475122 +L 140.296384 143.450106 +L 140.331917 143.578141 +L 140.444441 144.398573 +L 141.08997 148.758685 +L 141.243949 148.239508 +L 142.120448 143.192187 +L 142.167826 143.24659 +L 142.28035 143.529168 +L 142.535008 146.551184 +L 142.677143 147.572588 +L 142.712676 147.502548 +L 142.878501 146.835259 +L 143.038402 145.809609 +L 143.068014 145.859418 +L 143.304905 146.803587 +L 143.334517 146.732823 +L 143.458885 146.119792 +L 143.518107 146.267011 +L 143.65432 146.507692 +L 143.672087 146.468963 +L 143.93859 144.453791 +L 144.01558 144.50696 +L 144.051113 144.399973 +L 144.104414 144.234273 +L 144.163637 144.387589 +L 144.252471 144.613789 +L 144.299849 144.438057 +L 144.465673 143.982442 +L 144.471596 143.985555 +L 144.56043 144.051151 +L 144.738098 144.743808 +L 144.773632 144.580402 +L 144.850622 144.221989 +L 144.903923 144.405702 +L 144.951301 144.47683 +L 144.992757 144.359572 +L 145.046057 144.282776 +L 145.099358 144.3824 +L 145.128969 144.349946 +L 145.146736 144.289188 +L 145.235571 144.179094 +L 145.253337 144.275429 +L 145.496151 145.372803 +L 145.525763 145.276015 +L 145.555374 145.173043 +L 145.59683 145.448067 +L 145.887022 148.486726 +L 145.964012 148.1449 +L 146.266048 146.156586 +L 146.277893 146.163326 +L 146.301582 146.18036 +L 146.325271 146.075732 +L 146.538474 145.323416 +L 146.550318 145.328636 +L 146.627308 145.516937 +L 146.745754 145.704721 +L 146.76352 145.658123 +L 146.893811 144.678393 +L 146.982645 144.719053 +L 147.148469 143.596777 +L 147.237303 143.165371 +L 147.278759 143.418213 +L 147.640019 144.970599 +L 147.752542 145.230276 +L 147.841377 145.605325 +L 147.900599 145.379205 +L 147.912444 145.383644 +L 147.930211 145.467317 +L 148.250014 146.443251 +L 148.261859 146.434084 +L 148.29147 146.435319 +L 148.327004 146.351134 +L 148.415838 146.157757 +L 148.463217 146.283083 +L 148.688264 146.683034 +L 148.723797 146.634098 +L 148.777098 146.738786 +L 148.978456 147.647563 +L 148.996222 147.618805 +L 149.031756 147.543851 +L 149.073212 147.665574 +L 149.102824 147.648083 +L 149.138357 147.755705 +L 149.179813 147.52816 +L 149.440394 145.225225 +L 149.517384 145.50221 +L 149.541073 145.578771 +L 149.606218 145.386704 +L 149.777964 144.124429 +L 149.89641 144.360423 +L 150.074079 145.26829 +L 150.222136 145.986332 +L 150.275436 145.898924 +L 150.322815 145.933643 +L 150.358348 145.821016 +L 150.506406 145.589052 +L 150.524172 145.611993 +L 150.826209 147.043361 +L 150.891354 146.713466 +L 151.0631 145.425241 +L 151.092712 145.449291 +L 151.234847 144.767832 +L 151.323681 145.055485 +L 151.406593 145.353011 +L 151.453971 145.082542 +L 151.519117 144.888992 +L 151.578339 145.026989 +L 151.726397 145.482514 +L 151.773775 145.409627 +L 151.791542 145.414705 +L 151.815231 145.50759 +L 151.904065 145.774334 +L 151.963288 145.714073 +L 152.188335 146.251722 +L 152.229791 146.178337 +L 152.342314 145.706864 +L 152.407459 145.856233 +L 152.543672 146.475126 +L 152.579206 146.217685 +L 152.733185 145.708939 +L 152.739108 145.711013 +L 152.869398 145.893699 +L 152.87532 145.90746 +L 152.928621 145.770966 +L 152.940465 145.780393 +L 153.177357 145.112448 +L 153.615606 143.218045 +L 153.657062 143.416918 +L 153.994632 145.56113 +L 154.018321 145.522731 +L 154.024244 145.518477 +L 154.053855 145.60681 +L 154.154534 146.202921 +L 154.243368 145.973385 +L 154.308513 145.83225 +L 154.349969 146.006376 +L 154.450648 146.817321 +L 154.521716 146.699352 +L 154.53356 146.706774 +L 154.545405 146.776647 +L 154.557249 146.801092 +L 154.604628 146.872387 +L 154.634239 146.729939 +L 154.888898 145.801624 +L 154.97181 145.86393 +L 155.007343 145.894359 +L 155.066566 145.804569 +L 155.078411 145.800537 +L 155.119867 145.900276 +L 155.220546 146.523551 +L 155.321224 146.392159 +L 155.682484 144.652732 +L 155.706173 144.6846 +L 155.895686 145.289264 +L 156.079277 145.94979 +L 156.114811 145.787107 +L 156.333935 144.052271 +L 156.357625 144.174278 +L 156.659661 145.3993 +L 156.689273 145.40677 +L 156.707039 145.501485 +L 156.83733 146.349768 +L 156.908397 146.192453 +L 157.553926 143.911927 +L 157.583538 144.011847 +L 157.784896 144.685078 +L 157.790818 144.680223 +L 157.808585 144.76121 +L 157.974409 145.242872 +L 158.039554 145.118568 +L 158.086932 145.262571 +L 158.205378 145.572476 +L 158.258679 145.4239 +L 158.264601 145.409801 +L 158.317901 145.552011 +L 158.323824 145.569972 +L 158.36528 145.35925 +L 158.560715 144.33919 +L 158.57256 144.342434 +L 158.691005 144.421905 +L 158.791684 144.924915 +L 158.844985 144.705368 +L 158.880519 144.534916 +L 158.939741 144.83132 +L 159.2477 146.863067 +L 159.472747 147.72352 +L 159.484592 147.740695 +L 159.526048 147.635859 +L 159.798473 145.75935 +L 159.881385 146.100254 +L 160.047209 146.814112 +L 160.088665 146.714812 +L 160.811184 144.128994 +L 160.834873 144.186744 +L 161.172444 145.742936 +L 161.196133 145.733869 +L 161.2139 145.665187 +L 161.34419 144.593012 +L 161.55147 142.99673 +L 161.669916 142.880711 +L 161.687682 142.941272 +L 161.871273 144.953153 +L 162.025253 145.932876 +L 162.037097 145.916376 +L 162.131854 145.581279 +L 162.279911 144.986169 +L 162.339134 145.122575 +L 162.392435 145.224469 +L 162.45758 145.125013 +L 162.576025 144.605807 +L 162.771461 142.673715 +L 162.842528 142.928853 +L 162.931363 143.201591 +L 163.197865 144.692719 +L 163.263011 144.613747 +L 163.405146 145.523121 +L 163.730871 148.066178 +L 163.784172 147.615305 +L 163.991452 146.381493 +L 164.145431 145.667839 +L 164.19281 145.752012 +L 164.252032 146.022019 +L 164.311255 145.763374 +L 164.500769 144.790862 +L 164.53038 144.912488 +L 164.613292 145.145223 +L 165.010085 147.095945 +L 165.146298 146.863958 +L 165.199598 146.741884 +L 165.270666 146.244346 +L 165.341733 146.625692 +L 165.347655 146.630642 +L 165.389111 146.529595 +L 165.501635 146.434565 +L 165.43649 146.57529 +L 165.519402 146.478657 +L 165.649692 146.783987 +L 165.679304 146.694866 +L 165.803672 146.305199 +L 165.839205 146.450809 +L 166.093864 147.665563 +L 166.099786 147.653561 +L 166.117553 147.620317 +L 166.170853 147.785606 +L 166.271532 148.249701 +L 166.348522 148.068883 +L 166.401822 148.145939 +L 166.609103 147.548728 +L 166.988129 144.847587 +L 167.035507 144.936542 +L 167.053274 144.918941 +L 167.071041 144.854248 +L 167.22502 143.3412 +L 167.361233 143.69604 +L 167.438223 143.881193 +L 167.615891 145.022051 +L 167.710648 145.25517 +L 167.734337 145.192448 +L 167.823171 145.008503 +L 167.840938 144.939632 +L 167.912006 145.09724 +L 168.071907 145.764452 +L 168.113363 145.620297 +L 168.202198 145.30014 +L 168.243654 145.406775 +L 168.634524 148.030178 +L 168.711514 147.690541 +L 168.853649 146.927946 +L 168.895105 147.047506 +L 168.989862 147.342961 +L 169.031318 147.163372 +L 169.410344 144.245487 +L 169.487334 144.457008 +L 169.641313 144.85498 +L 169.712381 145.211742 +L 169.771603 144.976121 +L 169.854516 144.575175 +L 169.925583 144.801657 +L 169.99665 144.475693 +L 170.055873 144.30524 +L 170.097329 144.48631 +L 170.20393 145.292478 +L 170.28092 145.142785 +L 170.41121 144.908284 +L 170.440822 145.009937 +L 170.529656 145.540497 +L 170.630335 145.521485 +L 170.665869 145.461392 +L 170.707325 145.620747 +L 170.831693 146.458566 +L 170.920527 146.280067 +L 171.098196 145.785608 +L 171.246253 145.352495 +L 171.269942 145.330119 +L 171.299553 145.434407 +L 171.358776 145.664801 +L 171.423921 145.576378 +L 171.542367 145.15149 +L 171.897704 143.893637 +L 171.945083 144.107756 +L 172.235275 145.750817 +L 172.318187 146.047337 +L 172.395176 146.542431 +L 172.460322 146.350945 +L 172.602456 145.72733 +L 172.667602 145.962218 +L 172.815659 146.239217 +L 172.857115 146.153015 +L 173.099929 145.596266 +L 173.105851 145.602434 +L 173.111773 145.611264 +L 173.153229 145.477478 +L 173.401965 144.225039 +L 173.455266 144.687757 +L 173.715846 146.636806 +L 173.721769 146.628337 +L 173.763225 146.669319 +L 173.792836 146.555109 +L 173.988271 145.398972 +L 174.047494 145.08881 +L 174.106717 145.265937 +L 174.870692 147.62689 +L 174.91807 147.356536 +L 175.048361 147.119091 +L 175.291175 146.883137 +L 175.326708 147.038271 +L 175.468843 148.038982 +L 175.581367 148.769182 +L 175.628745 148.650569 +L 175.877481 148.003061 +L 175.895248 148.000286 +L 175.913015 147.950819 +L 175.936704 147.929704 +L 176.18544 146.570924 +L 176.357186 146.127707 +L 176.363108 146.12935 +L 176.540777 146.630443 +L 176.582233 146.497408 +L 176.854658 145.823499 +L 177.008638 145.14622 +L 177.044171 145.285278 +L 177.286985 146.099805 +L 177.488343 146.831323 +L 177.535721 146.719734 +L 177.719312 145.94237 +L 177.731157 145.95049 +L 177.790379 146.047645 +L 177.819991 145.913001 +L 177.926592 145.425996 +L 177.968048 145.579428 +L 178.175328 145.933382 +L 178.222706 146.140396 +L 178.512898 147.967346 +L 178.578044 147.781748 +L 179.051826 145.100965 +L 179.111049 145.166066 +L 179.193961 145.199874 +L 179.158428 145.123177 +L 179.21765 145.164949 +L 179.336096 145.024992 +L 179.365708 145.098663 +L 179.442697 145.441684 +L 179.472309 145.557555 +L 179.525609 145.349694 +L 179.703278 144.674684 +L 179.715123 144.688852 +L 180.141527 145.203874 +L 180.348807 145.985663 +L 180.354729 145.976519 +L 180.644922 144.77718 +L 180.727834 144.965008 +L 180.816668 145.231038 +L 180.858124 144.995953 +L 180.887735 144.955356 +L 180.929191 145.086689 +L 181.089093 145.28119 +L 181.148316 145.429587 +L 181.219383 145.340655 +L 181.231228 145.29558 +L 181.302295 145.491096 +L 181.414819 146.131813 +L 181.468119 146.031339 +L 181.616176 145.893672 +L 181.633943 145.897228 +L 181.657632 145.790397 +L 181.722778 145.616565 +L 181.793845 145.712754 +L 182.072193 146.635709 +L 182.149182 146.5251 +L 182.303162 146.43159 +L 182.332773 146.531529 +L 182.35054 146.561476 +L 182.397918 146.431712 +L 182.415685 146.46818 +L 183.17966 143.743136 +L 183.244805 144.035921 +L 183.54092 145.505834 +L 183.570531 145.419335 +L 183.641598 145.293338 +L 183.67121 145.447517 +L 183.688977 145.476376 +L 183.760044 145.365981 +L 183.837034 145.697152 +L 184.068003 146.865414 +L 184.109459 146.771549 +L 184.174604 146.809723 +L 184.441107 145.454929 +L 184.719455 143.072161 +L 184.778677 142.980238 +L 184.873434 142.680668 +L 184.91489 142.844518 +L 185.447896 146.784639 +L 185.578186 146.467967 +L 185.826922 144.489622 +L 185.915756 144.750334 +L 186.075658 145.463837 +L 186.093425 145.433347 +L 186.146726 145.246023 +L 186.194104 145.4651 +L 186.359928 145.96447 +L 186.371773 145.995565 +L 186.436918 145.860338 +L 186.448762 145.824317 +L 186.537597 145.908807 +L 186.555363 145.922997 +L 186.584975 145.831563 +L 186.863322 144.485417 +L 186.904778 144.427681 +L 186.940312 144.539068 +L 186.975846 144.485345 +L 187.040991 144.310553 +L 187.183126 144.086326 +L 187.224582 144.298478 +L 187.502929 145.525598 +L 187.532541 145.453017 +L 187.621375 145.382621 +L 187.573997 145.477866 +L 187.645064 145.462293 +L 187.668753 145.48047 +L 187.727976 145.39237 +L 187.745743 145.365305 +L 187.799044 145.491876 +L 188.130692 146.633356 +L 188.148458 146.611716 +L 188.349816 146.068378 +L 188.651853 144.377415 +L 188.734765 144.596531 +L 188.859133 144.59911 +L 188.912433 144.582972 +L 188.947967 144.666931 +L 189.001268 144.819296 +L 189.042724 144.614606 +L 189.309227 143.480557 +L 189.326994 143.501783 +L 189.386216 144.045815 +L 189.475051 144.815907 +L 189.546118 144.70223 +L 189.593496 144.670725 +L 189.623108 144.778542 +L 189.996212 146.597816 +L 190.04359 146.560412 +L 190.061357 146.539469 +L 190.108735 146.637726 +L 190.132424 146.617625 +L 190.138347 146.621695 +L 190.179803 146.536983 +L 190.191647 146.524127 +L 190.221259 146.436649 +L 190.286404 146.580313 +L 190.298248 146.587949 +L 190.32786 146.491138 +L 190.541062 145.954107 +L 190.588441 145.746128 +L 190.606207 145.686636 +L 190.689119 145.804133 +L 190.896399 146.522522 +L 190.920089 146.442467 +L 191.245814 145.265522 +L 191.251737 145.270572 +L 191.293193 145.211655 +L 191.423483 145.57004 +L 191.577462 146.614245 +L 191.618918 146.514902 +L 191.707753 146.437136 +L 192.11639 144.178188 +L 192.151924 144.083135 +L 192.199302 144.269648 +L 192.34736 144.999565 +L 192.489494 146.408426 +L 192.584251 146.829308 +L 192.619785 146.753832 +L 192.886288 146.307459 +L 192.898132 146.32833 +L 193.277159 148.207321 +L 193.330459 148.113114 +L 193.679874 146.475021 +L 193.839776 145.950211 +L 194.011522 144.942426 +L 194.112201 144.621466 +L 194.141812 144.715345 +L 194.272103 145.09308 +L 194.313559 144.995121 +L 194.372782 145.18961 +L 194.615595 146.432833 +L 194.722197 146.532291 +L 194.668896 146.396702 +L 194.745886 146.456069 +L 194.840642 146.179486 +L 195.148601 143.798663 +L 195.243358 143.787608 +L 195.184135 143.906183 +L 195.261125 143.829239 +L 195.515783 144.463169 +L 195.575006 144.303478 +L 195.610539 144.257402 +L 195.634229 144.356337 +L 195.681607 144.325858 +L 195.776363 144.50699 +L 195.847431 144.757136 +L 195.894809 144.576127 +L 195.930343 144.529567 +L 195.989566 144.629247 +L 196.131701 144.953123 +L 196.214613 145.391209 +L 196.28568 145.367457 +L 196.41597 145.711528 +L 196.49296 145.67223 +L 196.605484 145.800584 +L 196.694318 146.417287 +L 196.718007 146.520307 +L 196.812764 146.474606 +L 196.836453 146.576154 +L 196.871987 146.731402 +L 196.948976 146.590291 +L 197.120723 145.63586 +L 197.179945 145.884363 +L 197.52936 147.512906 +L 197.724796 147.897001 +L 197.760329 147.86097 +L 197.866931 147.472629 +L 197.926153 147.392554 +L 197.973532 147.492725 +L 198.0979 147.685955 +L 198.139356 147.653751 +L 198.216346 147.739333 +L 198.245957 147.642733 +L 198.370325 146.225963 +L 198.553916 145.085 +L 198.559838 145.088071 +L 198.636828 145.104859 +L 198.64275 145.146624 +L 198.707895 145.478086 +L 198.79673 145.35123 +L 198.897408 145.264213 +L 198.921098 145.299616 +L 199.00401 145.515695 +L 199.063233 145.430048 +L 199.252746 145.115014 +L 199.288279 145.217675 +L 199.377114 145.546021 +L 199.448181 145.52616 +L 199.590316 145.741512 +L 199.619927 145.602153 +L 200.004876 143.216035 +L 200.022643 143.183848 +L 200.075943 143.326726 +L 200.212156 144.333401 +L 200.283224 144.208398 +L 200.336524 144.283774 +L 200.372058 144.143681 +L 200.425358 144.06058 +L 200.466814 144.207221 +L 200.644483 145.904081 +L 200.786618 146.413306 +L 200.804385 146.382828 +L 200.816229 146.363624 +L 200.863608 146.522725 +L 200.934675 146.834801 +L 200.993898 146.643267 +L 201.260401 145.710392 +L 201.28409 145.779674 +L 201.307779 145.835907 +L 201.372924 145.701535 +L 201.378847 145.700574 +L 201.467681 146.035748 +L 201.680883 146.817383 +L 201.82894 146.934548 +L 201.834863 146.909657 +L 202.202044 145.818018 +L 202.207967 145.834259 +L 202.415247 146.310857 +L 202.610682 146.892357 +L 202.646216 146.716255 +L 202.687672 146.492446 +L 202.752817 146.704773 +L 202.817962 146.905887 +L 202.871263 146.787078 +L 202.900874 146.641358 +L 202.966019 146.856189 +L 203.244367 147.733982 +L 203.273978 147.658838 +L 203.570093 146.821626 +L 203.593782 146.884533 +L 203.71815 146.901199 +L 203.724072 146.897614 +L 203.854362 146.72486 +L 204.150477 144.999943 +L 204.18601 145.10156 +L 204.233389 145.194096 +L 204.286689 145.052385 +L 204.322223 144.973739 +L 204.357757 145.178138 +L 204.381446 145.288381 +L 204.458436 145.120877 +L 204.642026 144.436344 +L 204.67756 144.467589 +L 204.724938 144.727885 +L 204.908529 145.50327 +L 204.914452 145.497868 +L 205.157265 145.199498 +L 204.967752 145.559627 +L 205.175032 145.228227 +L 205.548136 146.588127 +L 205.559981 146.561876 +L 205.850173 145.666671 +L 205.939007 145.804004 +L 205.980463 145.910394 +L 206.045608 145.789892 +L 206.708904 144.348869 +L 206.726671 144.393909 +L 206.874728 144.912618 +L 206.939874 144.681256 +L 207.005019 144.422817 +L 207.070164 144.539487 +L 207.336667 145.083759 +L 207.348511 145.056038 +L 207.3722 144.95607 +L 207.44919 145.0988 +L 207.514335 145.350041 +L 207.828217 147.255065 +L 207.881517 147.156799 +L 207.928895 146.988179 +L 208.005885 146.62016 +L 208.047341 146.886948 +L 208.521124 148.927075 +L 208.592191 148.671442 +L 209.332477 143.938474 +L 209.569369 142.819965 +L 209.616747 142.952447 +L 209.782571 143.703943 +L 209.995773 144.960033 +L 210.131986 145.625357 +L 210.179364 145.520827 +L 210.274121 145.373669 +L 210.422178 144.491575 +L 210.457712 144.528242 +L 210.647225 144.758053 +L 210.653147 144.746835 +L 210.706448 144.571823 +L 210.753826 144.393038 +L 210.807127 144.640618 +L 210.895961 145.65961 +L 211.026251 146.765725 +L 211.067707 146.611745 +L 211.103241 146.553862 +L 211.168386 146.65777 +L 211.20392 146.616647 +L 211.209842 146.584367 +L 211.381588 145.913277 +L 211.4112 145.995878 +L 211.482267 146.027035 +L 211.529646 146.007807 +L 211.559257 145.997774 +L 211.577024 145.930938 +L 211.612558 145.84894 +L 211.67178 146.025184 +L 211.707314 146.125594 +L 211.849449 146.426953 +L 211.867216 146.362401 +L 212.021195 145.828922 +L 212.050807 145.909711 +L 212.16333 145.971447 +L 212.115952 145.82878 +L 212.175175 145.964303 +L 212.459445 145.776861 +L 212.684491 144.856503 +L 212.702258 144.884227 +L 212.820704 145.486383 +L 212.956917 145.898903 +L 212.998373 145.810049 +L 213.033906 145.699056 +L 213.104974 145.815629 +L 213.229342 146.249257 +L 213.454389 147.518486 +L 213.602446 148.698455 +L 213.661669 148.493114 +L 213.874871 147.884436 +L 213.892638 147.967438 +L 213.940016 148.037398 +L 213.987394 147.927029 +L 214.022928 147.859108 +L 214.058462 148.024777 +L 214.31312 149.286306 +L 214.336809 149.232686 +L 214.496711 148.466867 +L 214.573701 148.556377 +L 214.59739 148.590239 +L 214.644768 148.478575 +L 215.177774 146.554141 +L 215.189619 146.576025 +L 215.195541 146.586789 +L 215.225152 146.456071 +L 215.491655 144.500732 +L 215.562723 144.613793 +L 215.657479 145.367218 +L 215.864759 147.354907 +L 215.876604 147.337639 +L 216.077962 147.265458 +L 216.20233 146.82009 +L 216.279319 146.922224 +L 216.374076 147.313908 +L 216.427377 147.126268 +L 216.551745 146.118097 +L 216.705724 145.604517 +L 216.729413 145.617764 +L 216.788636 145.839336 +L 216.883393 146.215233 +L 216.936693 146.002085 +L 217.126206 145.345156 +L 217.138051 145.358444 +L 217.475621 146.287123 +L 217.511155 146.244751 +L 217.65329 146.780993 +L 217.700668 146.886832 +L 217.765813 146.779999 +L 217.949404 146.156539 +L 218.227752 144.731796 +L 218.245518 144.760486 +L 218.369886 144.985633 +L 218.707457 146.951054 +L 218.713379 146.949863 +L 218.831825 146.824122 +L 219.092405 143.424135 +L 219.199007 142.498982 +L 219.264152 148.266603 +L 219.31153 147.360206 +L 219.394442 146.990949 +L 219.447743 147.068228 +L 219.477354 146.940483 +L 219.631334 146.423368 +L 219.660945 146.504849 +L 219.868225 146.856443 +L 219.88007 146.825458 +L 219.998515 146.178032 +L 220.093272 146.42725 +L 220.099194 146.422915 +L 220.128806 146.533372 +L 220.21764 146.852958 +L 220.259096 146.598127 +L 220.29463 146.382329 +L 220.377542 146.494393 +L 220.454531 146.618911 +L 220.490065 146.486027 +L 220.667734 145.721936 +L 220.703267 145.863314 +L 220.898703 146.623822 +L 220.910547 146.584864 +L 220.91647 146.569284 +L 220.963848 146.742481 +L 221.171128 146.627206 +L 221.419864 145.53995 +L 221.556077 145.172225 +L 221.585688 145.181663 +L 221.775201 144.65229 +L 221.858113 144.177725 +L 221.935103 144.247174 +L 222.077238 144.736275 +L 222.118694 144.512541 +L 222.545098 143.143813 +L 222.562865 143.179783 +L 222.817524 144.247497 +L 223.155094 147.067008 +L 223.19655 147.090162 +L 223.214317 147.155747 +L 223.243928 147.298809 +L 223.303151 147.099613 +L 223.332763 147.000621 +L 223.391985 147.208977 +L 223.486742 147.397032 +L 223.53412 147.2763 +L 223.664411 146.583761 +L 223.723633 146.344923 +L 223.788779 146.427221 +L 223.936836 146.613695 +L 223.954603 146.579831 +L 224.084893 146.365243 +L 224.126349 146.458175 +L 224.268484 146.994729 +L 224.36324 146.930072 +L 224.428386 146.793488 +L 224.475764 146.932398 +L 224.511298 146.994061 +L 224.540909 146.876265 +L 224.937702 144.984566 +L 225.103526 144.521118 +L 225.13906 144.29454 +L 225.198283 144.659733 +L 225.612843 145.777364 +L 225.666143 146.127678 +L 225.885268 147.448027 +L 226.193227 148.517882 +L 226.216916 148.4819 +L 226.258372 148.368559 +L 226.406429 147.900425 +L 226.447885 147.999186 +L 226.471574 148.007178 +L 226.518953 147.902281 +L 226.708466 147.358116 +L 226.755844 147.472713 +L 226.844678 147.392083 +L 227.15856 145.721331 +L 227.223705 146.068325 +L 227.442829 147.063584 +L 227.472441 147.132384 +L 227.531664 147.360846 +L 227.590887 147.215423 +L 227.8337 145.521925 +L 227.98768 145.670134 +L 228.384473 144.798689 +L 228.390395 144.807814 +L 228.473307 145.320375 +L 228.573986 146.029785 +L 228.639131 145.826105 +L 228.751655 145.453373 +L 228.775344 145.563876 +L 229.000391 147.044266 +L 229.065536 146.950088 +L 229.213593 146.442785 +L 229.379417 145.023216 +L 229.432718 145.220363 +L 229.693298 147.450124 +L 229.764366 146.953478 +L 229.900578 146.759803 +L 229.906501 146.765342 +L 230.06048 146.854684 +L 230.096014 147.013738 +L 230.161159 146.81997 +L 230.386206 145.529118 +L 230.469118 145.703023 +L 230.486885 145.72324 +L 230.504652 145.804476 +L 230.510574 145.807654 +L 230.546108 145.710375 +L 230.640864 145.338024 +L 230.694165 145.48578 +L 230.735621 145.533784 +L 230.788921 145.431151 +L 231.073191 144.950269 +L 230.824455 145.478086 +L 231.114647 145.067865 +L 231.387072 145.692545 +L 231.392994 145.684834 +L 231.440373 145.602175 +L 231.487751 145.737822 +L 231.582508 146.549579 +L 231.671342 146.916086 +L 231.71872 146.852231 +L 231.772021 146.956914 +L 231.967456 148.183259 +L 231.991145 148.091085 +L 232.097747 147.748138 +L 232.251726 146.592552 +L 232.293182 146.658068 +L 232.352405 146.387898 +L 232.411628 146.577714 +L 232.453084 146.714439 +L 232.49454 146.507726 +L 232.75512 145.209938 +L 232.766965 145.214904 +L 232.790654 145.142222 +L 232.867644 145.308046 +L 232.974245 146.324722 +L 233.057157 146.17982 +L 233.128224 145.679122 +L 233.282204 145.833114 +L 233.305893 145.81841 +L 233.32366 145.747147 +L 233.58424 144.958953 +L 233.619774 145.238273 +L 233.791521 146.744999 +L 233.892199 146.732563 +L 234.07579 147.132046 +L 234.093557 147.111583 +L 234.099479 147.108111 +L 234.123169 147.189513 +L 234.306759 147.843069 +L 234.330449 147.773865 +L 234.383749 147.697032 +L 234.419283 147.854393 +L 234.460739 148.060788 +L 234.549573 148.030127 +L 234.596951 148.242928 +L 234.662097 148.677858 +L 234.739086 148.49893 +L 234.887144 148.389416 +L 234.964133 148.563981 +L 235.005589 148.385247 +L 235.39646 146.592401 +L 235.437916 146.728463 +L 235.503061 146.91368 +L 235.591896 146.838043 +L 235.822865 146.573711 +L 235.633352 146.897369 +L 235.864321 146.736165 +L 236.065679 147.698469 +L 236.136746 147.447796 +L 236.403249 145.191667 +L 236.444705 145.326141 +L 236.646063 146.51848 +L 236.711208 146.284569 +L 236.734897 146.272318 +L 236.782275 146.361993 +L 236.894799 146.402708 +L 236.829653 146.348785 +L 236.900721 146.394024 +L 236.971788 145.861029 +L 237.161302 144.434949 +L 237.20868 144.488947 +L 237.220524 144.505867 +L 237.26198 144.394435 +L 237.309359 144.278769 +L 237.33897 144.47742 +L 237.540328 146.402783 +L 237.646929 146.133966 +L 237.889743 145.315298 +L 237.913432 145.430167 +L 238.008188 145.48711 +L 238.020033 145.444381 +L 238.239158 144.674541 +L 238.251002 144.70076 +L 238.369448 145.13637 +L 238.434593 145.079984 +L 238.564883 145.329668 +L 238.618184 145.150399 +L 238.78993 144.095571 +L 238.843231 144.359392 +L 238.926143 144.336394 +L 238.973521 144.467856 +L 239.240024 145.802508 +L 239.388081 146.189433 +L 239.465071 146.4231 +L 239.470993 146.434766 +L 239.518372 146.328135 +L 239.542061 146.331348 +L 239.61905 146.371533 +L 239.630895 146.402653 +L 239.749341 146.719239 +L 239.796719 146.532812 +L 240.146134 144.650886 +L 240.270502 143.815385 +L 240.329725 143.424256 +L 240.39487 143.614836 +L 240.454093 143.973656 +L 240.537005 143.812616 +L 240.608072 143.719498 +L 240.637684 143.812751 +L 241.022632 145.58032 +L 241.028555 145.575924 +L 241.099622 145.770458 +L 241.389814 147.997339 +L 241.419426 147.987978 +L 241.472726 147.6317 +L 241.668162 146.128823 +L 241.709618 146.270779 +L 242.05311 147.692377 +L 242.124178 147.729053 +L 242.159711 147.674155 +L 242.230779 147.282628 +L 242.396603 146.686493 +L 242.592038 146.196788 +L 242.657183 146.329466 +L 242.82893 147.485914 +L 242.88223 147.068415 +L 243.006598 145.983241 +L 243.095433 146.087881 +L 243.1665 146.383474 +L 243.237567 146.201329 +L 243.37378 146.182087 +L 243.379702 146.143058 +L 243.723195 144.872221 +L 243.86533 144.289748 +L 243.912708 144.52341 +L 244.042998 144.702212 +L 244.096299 144.851579 +L 244.143677 144.684503 +L 244.232512 143.997693 +L 244.297657 144.393361 +L 244.599693 145.937863 +L 244.605616 145.92008 +L 244.801051 145.269016 +L 244.830663 145.437934 +L 245.209689 147.000229 +L 245.215611 147.017996 +L 245.280756 146.874924 +L 245.689394 144.656504 +L 245.784151 144.847853 +L 245.849296 144.782798 +L 245.855218 144.771518 +L 245.890752 144.637844 +L 245.961819 144.78793 +L 246.293467 146.497223 +L 246.329001 146.49021 +L 246.417835 146.224511 +L 246.642882 145.400166 +L 246.672494 145.481329 +L 246.84424 146.5583 +L 246.998219 146.340932 +L 247.081131 146.766697 +L 247.38909 147.779913 +L 247.418702 147.766317 +L 247.67336 147.630937 +L 248.147143 144.915384 +L 248.170832 144.963137 +L 248.2952 145.446916 +L 248.348501 145.168371 +L 248.490636 144.816334 +L 248.514325 144.858268 +L 248.567625 144.961083 +L 248.603159 144.82182 +L 248.810439 143.854396 +L 248.86374 143.588751 +L 248.922963 143.814378 +L 249.100631 144.960428 +L 249.337523 146.048035 +L 249.426357 145.842741 +L 249.479657 146.004145 +L 249.527036 146.004893 +L 249.544803 145.937465 +L 249.574414 145.854647 +L 249.621792 146.069681 +L 249.740238 146.414969 +L 249.775772 146.22343 +L 249.876451 145.604727 +L 249.935674 145.802395 +L 250.178487 147.074012 +L 250.243632 146.959043 +L 250.362078 146.04236 +L 250.52198 145.043237 +L 250.557514 145.164285 +L 250.628581 145.104566 +L 250.634503 145.085796 +L 250.723338 144.841896 +L 250.752949 145.025866 +L 250.80625 145.394914 +L 250.906928 145.369449 +L 251.037219 145.625198 +L 251.114209 145.833556 +L 251.155665 145.698728 +L 251.345178 145.353677 +L 251.374789 145.426668 +L 251.434012 145.610468 +L 251.48139 145.442164 +L 251.540613 145.042149 +L 251.593914 145.361591 +L 251.694593 145.923781 +L 251.753815 145.746811 +L 251.890028 146.101958 +L 251.97294 146.025534 +L 251.996629 145.932835 +L 252.055852 146.097426 +L 252.162453 146.670812 +L 252.233521 146.618802 +L 252.381578 146.44226 +L 252.624392 145.477474 +L 252.648081 145.523836 +L 253.459434 147.85192 +L 253.483123 147.72807 +L 253.548268 147.38797 +L 253.601569 147.639221 +L 253.749626 147.873317 +L 253.791082 147.933327 +L 253.826616 147.796529 +L 253.903605 147.594259 +L 254.359622 145.647878 +L 254.418844 145.843257 +L 254.489912 146.069015 +L 254.531368 145.897645 +L 254.714959 145.236365 +L 254.74457 145.251881 +L 254.839327 145.383309 +L 254.89855 145.510075 +L 254.940006 145.312886 +L 255.330876 142.496906 +L 255.396022 148.266603 +L 255.4434 147.476761 +L 255.638835 146.659088 +L 255.674369 146.758048 +L 255.692136 146.791972 +L 255.751359 146.618906 +L 255.946794 145.815674 +L 255.958639 145.823233 +L 256.124463 145.421813 +L 256.219219 145.610194 +L 256.290287 145.541537 +L 256.408733 145.161127 +L 256.456111 145.188878 +L 256.473878 145.177555 +L 256.497567 145.303612 +L 256.68708 146.192914 +L 256.716692 146.021633 +L 257.006884 144.758522 +L 257.060184 144.975644 +L 257.095718 144.953239 +L 257.125329 145.049036 +L 257.131252 145.055361 +L 257.172708 145.219752 +L 257.273386 145.766289 +L 257.338532 145.63145 +L 257.374065 145.596176 +L 257.421444 145.707827 +L 257.427366 145.697714 +L 257.575423 146.093806 +L 257.693869 146.480729 +L 257.729403 146.341087 +L 257.942605 145.47324 +L 257.972216 145.522006 +L 258.132118 145.810007 +L 258.339398 146.587657 +L 258.528911 147.207558 +L 258.534833 147.190515 +L 258.611823 147.109881 +L 258.641435 147.188573 +L 258.653279 147.209052 +L 258.694735 147.083092 +L 258.789492 146.55175 +L 258.878326 146.720082 +L 258.99085 146.997537 +L 259.014539 146.980412 +L 259.073762 146.876439 +L 259.103373 147.006428 +L 259.286964 147.86786 +L 259.346187 147.799988 +L 259.482399 146.818862 +L 259.985794 144.519886 +L 260.015405 144.626362 +L 260.412198 147.184551 +L 260.429965 147.244271 +L 260.483266 147.064138 +L 260.643167 146.26053 +L 260.690546 146.35194 +L 260.737924 146.470721 +L 260.785302 146.308457 +L 260.85637 145.790213 +L 260.93336 145.993498 +L 261.105106 146.298271 +L 261.128795 146.245128 +L 261.170251 146.420504 +L 261.436754 148.347183 +L 261.513744 147.91769 +L 261.73879 147.142309 +L 261.821702 146.281848 +L 261.975682 144.701194 +L 262.028983 144.891232 +L 262.141506 145.735997 +L 262.194807 145.976505 +L 262.248107 145.710317 +L 262.443543 145.245068 +L 262.585677 145.402497 +L 262.72189 145.739921 +L 262.745579 145.683657 +L 262.769268 145.621595 +L 262.810724 145.818557 +L 262.864025 146.350852 +L 262.92917 145.953562 +L 263.00616 145.708148 +L 263.047616 145.904974 +L 263.124606 146.272417 +L 263.171984 146.013353 +L 263.243051 145.539936 +L 263.296352 145.854318 +L 263.580622 147.633953 +L 263.604311 147.584565 +L 263.858969 146.802522 +L 263.870814 146.847199 +L 263.941881 146.925392 +L 263.96557 146.826498 +L 264.095861 145.998363 +L 264.155083 146.180053 +L 264.32683 146.709373 +L 264.344597 146.70231 +L 264.368286 146.739183 +L 264.421586 146.643853 +L 264.427509 146.642351 +L 264.480809 146.477816 +L 264.516343 146.704789 +L 264.622944 147.219985 +L 264.682167 147.043163 +L 264.711778 147.135065 +L 264.800613 147.65189 +L 264.865758 147.493658 +L 264.966437 147.003938 +L 265.007893 147.175137 +L 265.055271 147.250995 +L 265.114494 147.18377 +L 265.144105 147.12676 +L 265.197406 147.243268 +L 265.20925 147.242891 +L 265.351385 147.434998 +L 265.380997 147.575188 +L 265.452064 147.413457 +L 266.056137 144.770602 +L 266.103516 145.032588 +L 266.293029 145.915795 +L 266.316718 145.858162 +L 266.405552 145.44731 +L 266.488464 145.55783 +L 266.547687 145.530929 +L 266.707589 146.385217 +L 266.7372 146.573334 +L 266.808268 146.354979 +L 266.914869 145.780983 +L 267.418263 143.236496 +L 267.424186 143.243749 +L 267.530787 143.955619 +L 267.79729 145.55282 +L 267.903891 145.909636 +L 267.98088 145.767282 +L 268.099326 145.100297 +L 268.200005 145.429056 +L 268.448741 146.535633 +L 268.537575 146.411429 +L 268.584954 146.346695 +L 268.650099 146.431504 +L 268.656021 146.440105 +L 268.697477 146.332977 +L 268.916602 145.723917 +L 269.052814 145.844453 +L 269.088348 146.068461 +L 269.153493 145.768479 +L 269.514753 143.913561 +L 269.562131 144.029258 +L 269.668732 144.517445 +L 269.964846 147.166322 +L 270.012225 146.969126 +L 270.136593 146.266039 +L 270.201738 146.507368 +L 270.320184 147.324289 +L 270.41494 147.241108 +L 270.468241 147.210014 +L 270.486008 147.311526 +L 270.616298 148.005036 +L 270.651832 147.797263 +L 270.8295 146.881041 +L 270.841345 146.915083 +L 270.876879 146.976805 +L 270.918335 146.77621 +L 271.060469 145.845951 +L 271.096003 145.966667 +L 271.255905 146.447641 +L 271.273672 146.412419 +L 271.332895 146.24239 +L 271.445418 146.036096 +L 271.475029 146.069401 +L 271.480952 146.065259 +L 271.510563 146.178446 +L 271.711921 146.847637 +L 271.73561 146.754882 +L 272.043569 144.843846 +L 272.22716 143.638286 +L 272.256771 143.791143 +L 272.546963 145.054199 +L 272.588419 144.989625 +L 272.659487 144.36612 +L 272.973368 143.440049 +L 272.991135 143.452257 +L 273.115503 144.511643 +L 273.34055 145.808307 +L 273.346472 145.80724 +L 273.387928 145.94055 +L 273.447151 146.224306 +L 273.518218 146.123751 +L 273.843944 145.126731 +L 273.571519 146.235492 +L 273.903167 145.237008 +L 273.986079 145.337787 +L 274.01569 145.257904 +L 274.122292 144.844465 +L 274.157825 144.943701 +L 274.311805 145.749264 +L 274.359183 145.639373 +L 274.418406 145.760193 +L 274.601997 146.647529 +L 274.684909 146.406252 +L 274.838888 145.638531 +L 274.892189 145.869441 +L 274.951412 146.08145 +L 274.99879 145.86258 +L 275.235681 144.69106 +L 275.288982 144.788605 +L 275.342283 144.989222 +L 275.508107 145.517485 +L 275.531796 145.391788 +L 275.626552 144.980122 +L 275.673931 145.156532 +L 275.833832 145.65187 +L 275.875288 145.607166 +L 276.076646 145.781488 +L 276.248392 146.565782 +L 276.313538 146.811219 +L 276.37276 146.626038 +L 276.378683 146.620701 +L 276.414216 146.733486 +L 276.437906 146.783996 +L 276.473439 146.615398 +L 276.893922 143.831871 +L 276.953144 144.057433 +L 277.024212 144.791963 +L 277.095279 145.087997 +L 277.142658 144.903683 +L 277.426927 143.586689 +L 277.509839 143.919111 +L 277.835565 146.167903 +L 277.853332 146.20124 +L 277.882943 146.067128 +L 278.102068 144.885113 +L 278.161291 144.635275 +L 278.250125 144.21158 +L 278.309348 144.456394 +L 278.463328 144.686912 +L 278.46925 144.682136 +L 278.510706 144.651345 +L 278.528473 144.741467 +L 278.652841 145.223725 +L 278.67653 145.151774 +L 278.996333 143.378619 +L 279.049634 143.158679 +L 279.14439 142.843884 +L 279.179924 142.911233 +L 279.292448 143.609623 +L 279.760308 148.007288 +L 279.801764 147.799973 +L 280.121568 145.047575 +L 280.145257 145.126035 +L 280.311081 145.251469 +L 280.364382 145.337039 +L 280.512439 144.640469 +L 280.61904 143.925364 +L 280.690107 144.092297 +L 280.90331 143.506143 +L 280.921076 143.543335 +L 281.11059 144.106621 +L 281.365248 145.390779 +L 281.394859 145.552728 +L 281.471849 146.096635 +L 281.52515 145.815399 +L 281.625829 145.606725 +L 281.649518 145.678405 +L 281.815342 146.581052 +L 281.86272 146.50479 +L 281.951554 146.099899 +L 282.377959 142.495549 +L 282.443104 148.266603 +L 282.490482 147.473518 +L 282.76883 144.894209 +L 282.816208 144.736875 +L 283.041255 142.656065 +L 283.059022 142.47561 +L 283.124167 148.266603 +L 283.171545 147.384408 +L 283.301836 146.714083 +L 283.319602 146.729622 +L 283.378825 147.025328 +L 283.663095 147.925874 +L 283.710473 147.87869 +L 283.817075 147.177835 +L 283.959209 147.284399 +L 284.006588 147.070032 +L 284.243479 145.910252 +L 284.249401 145.916314 +L 284.338236 146.387049 +L 284.444837 146.195406 +L 284.610661 145.977064 +L 284.63435 146.061341 +L 284.740951 146.253999 +L 284.776485 146.13031 +L 285.054832 144.948977 +L 285.108133 145.078955 +L 285.149589 144.918558 +L 285.244346 144.777515 +L 285.268035 144.855215 +L 285.46347 145.359018 +L 285.481237 145.338302 +L 285.493082 145.324979 +L 285.534538 145.467534 +L 285.611527 145.766839 +L 285.658906 145.651711 +L 285.919486 144.642907 +L 285.937253 144.716006 +L 286.334046 146.696501 +L 286.381425 146.583663 +L 286.458414 146.213896 +L 286.553171 145.769363 +L 286.618316 145.882374 +L 287.098021 148.060037 +L 287.127633 148.013984 +L 287.192778 148.039302 +L 287.210545 148.080673 +L 287.565882 149.083129 +L 287.589571 149.020004 +L 287.873841 147.899424 +L 287.903452 147.949108 +L 287.921219 147.995924 +L 287.97452 147.821024 +L 288.359468 146.127409 +L 288.471992 145.913957 +L 288.513448 146.033372 +L 288.661505 147.148809 +L 288.744417 146.912154 +L 289.01092 144.852366 +L 289.099754 144.443795 +L 289.158977 144.549661 +L 289.312956 145.074093 +L 289.561692 147.111748 +L 289.573537 147.080137 +L 289.620915 147.019108 +L 289.662371 147.178303 +L 289.733439 147.421929 +L 289.792662 147.325057 +L 289.810428 147.325659 +L 289.834118 147.229096 +L 290.059165 146.25443 +L 290.106543 146.497215 +L 290.349357 147.154375 +L 290.426346 146.752543 +L 290.479647 146.447358 +L 290.550714 146.616249 +L 290.651393 146.718841 +L 290.675082 146.688879 +L 290.817217 146.318206 +L 290.929741 145.32738 +L 291.060031 144.732127 +L 291.08372 144.768472 +L 291.131098 144.907053 +L 291.184399 144.748978 +L 291.291 144.387474 +L 291.338378 144.450626 +L 291.415368 144.974932 +L 291.670026 146.115756 +L 291.723327 146.19109 +L 291.770705 146.085911 +L 291.895073 145.844256 +L 292.013519 145.29813 +L 292.072742 145.342686 +L 292.203032 145.525806 +L 292.220799 145.456732 +L 292.380701 144.054898 +L 292.528758 144.260835 +L 292.712349 143.900053 +L 292.878173 143.771085 +L 292.890017 143.823112 +L 293.340111 145.658581 +L 293.505935 145.457347 +L 293.51778 145.4795 +L 293.529624 145.497572 +L 293.541469 145.581025 +L 293.64807 146.459702 +L 293.736904 146.4406 +L 293.861272 146.354554 +L 293.914573 146.200799 +L 293.991563 146.263495 +L 294.169231 145.753222 +L 294.441657 143.851438 +L 294.536413 143.754017 +L 294.560102 143.843484 +L 295.104953 147.526693 +L 295.229321 147.056395 +L 295.430678 146.660389 +L 295.478057 146.329432 +L 295.643881 145.47034 +L 295.732715 145.265915 +L 295.762326 145.395535 +L 295.892617 146.410875 +L 295.945917 146.101611 +L 296.076208 145.982307 +L 295.987373 146.118502 +L 296.088052 146.014326 +L 296.123586 146.130159 +L 296.176886 145.952768 +L 296.313099 145.463846 +L 296.336788 145.534672 +L 296.467078 146.280879 +L 296.591447 146.140779 +L 296.621058 146.159666 +L 296.650669 146.063485 +L 296.869794 145.515444 +L 296.887561 145.531362 +L 296.982317 145.811312 +L 297.04154 145.698666 +L 297.106685 145.654454 +L 297.142219 145.745608 +L 297.154064 145.765565 +L 297.213287 145.656675 +L 297.254743 145.611529 +L 297.278432 145.730141 +L 297.479789 146.707586 +L 297.491634 146.693604 +L 297.515323 146.652276 +L 297.544935 146.79553 +L 297.604158 147.066571 +L 297.675225 146.94036 +L 297.858816 146.715491 +L 297.912116 146.670509 +L 297.918039 146.631062 +L 298.07794 145.812734 +L 298.10163 145.905494 +L 298.119396 145.95273 +L 298.178619 145.816813 +L 298.350366 144.804387 +L 298.385899 144.978411 +L 298.504345 145.439394 +L 298.545801 145.282979 +L 298.581335 145.175819 +L 298.652402 145.305932 +L 298.705703 145.316125 +L 298.735314 145.245638 +L 298.972206 144.783647 +L 298.978128 144.786624 +L 299.031429 144.90822 +L 299.149874 145.017594 +L 299.167641 144.982494 +L 299.19133 144.970074 +L 299.215019 145.097028 +L 299.416377 146.24589 +L 299.428222 146.242904 +L 299.505211 146.169794 +L 299.528901 146.269748 +L 299.582201 146.648777 +L 299.647346 146.307471 +L 299.765792 145.823292 +L 299.902005 145.073003 +L 299.937538 145.178592 +L 300.079673 145.393975 +L 300.085596 145.385046 +L 300.192197 144.653237 +L 300.275109 144.481596 +L 300.322487 144.55029 +L 300.494233 144.836057 +L 300.660057 145.036061 +L 300.772581 145.270668 +L 300.837726 145.129342 +L 301.074617 144.26228 +L 301.163452 144.076985 +L 301.228597 144.239655 +L 301.406265 144.408042 +L 301.435877 144.482571 +L 301.891893 146.673696 +L 301.915582 146.636647 +L 302.03995 145.998342 +L 302.122862 145.615579 +L 302.188007 145.765862 +L 302.561111 147.59568 +L 302.620334 147.78328 +L 302.691402 147.641958 +L 302.839459 146.314079 +L 303.052661 144.853472 +L 303.111884 144.712285 +L 303.159262 144.856516 +L 303.402076 146.04597 +L 303.425765 146.008592 +L 303.85217 144.633073 +L 303.881781 144.716453 +L 304.142362 146.006614 +L 304.219352 145.729478 +L 304.243041 145.681911 +L 304.32003 145.747067 +L 304.355564 145.838986 +L 304.408865 145.679751 +L 304.509544 145.223828 +L 304.551 145.508767 +L 304.710901 146.051799 +L 304.728668 146.042098 +L 304.764202 145.844237 +L 304.94187 145.080833 +L 305.09585 144.685016 +L 305.131384 144.780839 +L 305.17284 144.891544 +L 305.232063 145.035157 +L 305.297208 144.944676 +L 305.326819 144.894739 +L 305.374197 145.063921 +L 305.468954 145.264801 +L 305.498565 145.148849 +L 305.599244 144.636873 +L 305.688079 144.783321 +L 305.705845 144.826096 +L 305.759146 144.582545 +L 305.913125 143.644407 +L 305.996037 143.962354 +L 306.144095 144.557465 +L 306.191473 144.375492 +L 306.345452 143.998194 +L 306.434287 144.069984 +L 306.558655 144.328748 +L 306.594188 144.422444 +L 306.653411 144.278383 +L 306.688945 144.196985 +L 306.748168 144.338 +L 306.943603 144.88003 +L 306.973215 144.867103 +L 307.008748 144.780353 +L 307.275251 143.513353 +L 307.435153 142.754206 +L 307.494376 142.496528 +L 307.559521 148.266603 +L 307.606899 147.693784 +L 307.719423 147.487061 +L 307.743112 147.502682 +L 308.459709 143.989249 +L 308.548543 144.443401 +L 308.98087 145.655664 +L 309.03417 145.371425 +L 309.407274 143.089334 +L 309.425041 143.12947 +L 309.496109 143.818101 +L 309.656011 145.480813 +L 309.703389 145.43811 +L 309.756689 145.45738 +L 309.774456 145.53041 +L 310.076493 146.852167 +L 310.177172 146.709332 +L 310.443675 146.078558 +L 310.479208 146.197751 +L 310.50882 146.314589 +L 310.603576 146.295852 +L 310.674644 146.047604 +L 310.799012 145.404431 +L 310.834546 145.49995 +L 310.917458 145.633322 +L 310.982603 145.877888 +L 311.029981 145.671336 +L 311.148427 145.416532 +L 311.403085 143.46127 +L 311.409007 143.465395 +L 311.450463 143.32124 +L 311.54522 143.050316 +L 311.580754 143.159219 +L 311.82949 144.837393 +L 311.953858 144.535649 +L 311.971625 144.517774 +L 312.024925 144.622795 +L 312.095993 144.928238 +L 312.155215 144.715431 +L 312.208516 144.804376 +L 312.238127 144.883332 +L 312.285506 144.744561 +L 312.332884 144.575258 +L 312.398029 144.71784 +L 312.58162 146.052151 +L 312.688221 145.846188 +L 312.717833 145.926288 +L 312.842201 145.533862 +L 312.877734 145.368177 +L 312.960646 145.490066 +L 312.99618 145.37586 +L 313.049481 145.564657 +L 313.191616 145.791891 +L 313.215305 145.730502 +L 313.256761 145.642469 +L 313.298217 145.771202 +L 313.458118 146.230101 +L 313.469963 146.204281 +L 313.499574 146.162182 +L 313.56472 146.259124 +L 313.61802 146.186019 +L 313.671321 146.322463 +L 313.760155 146.564665 +L 313.801611 146.392194 +L 313.890445 145.701936 +L 313.949668 145.85696 +L 314.068114 146.478585 +L 314.10957 146.205252 +L 314.198404 146.030541 +L 314.23986 146.054934 +L 314.263549 146.105896 +L 314.299083 145.866594 +L 314.476752 145.570245 +L 314.482674 145.597809 +L 314.595197 145.746315 +L 314.607042 145.707634 +L 314.761021 144.961423 +L 314.826167 145.186312 +L 314.986068 145.34258 +L 315.009758 145.439816 +L 315.06898 145.208231 +L 315.252571 144.629085 +L 315.317716 144.996244 +L 315.448007 146.216708 +L 315.50723 146.075108 +L 315.584219 145.760969 +L 315.667131 145.866699 +L 315.850722 146.525213 +L 315.933634 146.433783 +L 316.063925 145.679077 +L 316.123147 145.994242 +L 316.283049 146.509526 +L 316.442951 146.766528 +L 316.638386 146.341401 +L 316.662075 146.362651 +L 316.691687 146.28488 +L 316.75091 146.441511 +L 316.999646 146.996781 +L 317.041102 147.032873 +L 317.082558 146.925514 +L 317.129936 146.64549 +L 317.349061 145.502051 +L 317.414206 145.412622 +L 317.44974 145.54868 +L 317.591874 146.373303 +L 317.686631 146.972742 +L 317.739932 146.82406 +L 318.006434 145.593245 +L 318.036046 145.63317 +L 318.113036 145.371681 +L 318.184103 145.198975 +L 318.237404 145.277284 +L 318.302549 145.089266 +L 318.367694 145.214306 +L 318.551285 145.625825 +L 318.432839 145.186492 +L 318.569052 145.618659 +L 318.728953 145.799457 +L 318.758565 145.663358 +L 319.184969 143.028056 +L 319.261959 143.103483 +L 319.309338 143.047903 +L 319.427783 143.556798 +L 319.492928 143.896481 +L 319.563996 143.851329 +L 319.617296 144.09187 +L 320.239136 146.856875 +L 320.357582 146.554338 +L 320.588551 145.273217 +L 320.76622 144.174401 +L 320.831365 144.285406 +L 321.086023 145.615967 +L 321.269614 146.366008 +L 321.38806 147.115026 +L 321.459128 146.78106 +L 321.607185 146.305476 +L 321.624952 146.33172 +L 321.921066 147.444495 +L 321.944755 147.40097 +L 321.968444 147.392531 +L 321.992133 147.490856 +L 322.003978 147.497785 +L 322.039512 147.389933 +L 322.507372 144.659945 +L 322.542906 144.727085 +L 322.57844 144.617276 +L 322.63174 144.486182 +L 322.679119 144.643127 +L 323.105523 146.63464 +L 323.372026 148.033552 +L 323.449016 147.742564 +L 323.762897 146.478483 +L 323.810275 146.373206 +L 324.100467 145.174269 +L 324.10639 145.170105 +L 324.130079 145.271724 +L 324.278136 145.766755 +L 324.31367 145.724313 +L 324.491338 145.47087 +L 324.52095 145.550597 +L 324.710463 146.758931 +L 324.882209 148.027453 +L 324.917743 147.928142 +L 325.166479 145.603145 +L 325.290847 144.362296 +L 325.338225 144.473988 +L 325.48036 144.981665 +L 325.551427 145.305907 +L 325.604728 145.08736 +L 325.675795 144.703511 +L 325.865309 144.03966 +L 325.912687 144.110804 +L 326.066666 145.143468 +L 326.339092 146.537614 +L 326.664817 145.459247 +L 326.771418 144.755766 +L 326.830641 144.948874 +L 327.079377 145.760909 +L 327.144523 146.130283 +L 327.197823 145.88302 +L 327.488015 143.931478 +L 327.511704 144.00847 +L 327.689373 144.6302 +L 327.867041 145.432145 +L 327.908498 145.294004 +L 328.021021 145.720996 +L 328.074322 145.888613 +L 328.133544 145.736663 +L 328.293446 145.385597 +L 328.317135 145.405202 +L 328.400047 145.514212 +L 328.512571 146.456201 +L 328.731695 147.457527 +L 328.891597 147.937859 +L 328.921208 147.928994 +L 329.08111 147.291604 +L 329.23509 147.436358 +L 329.252857 147.463813 +L 329.306157 147.33692 +L 329.318002 147.359578 +L 329.36538 147.261329 +L 329.501593 147.084051 +L 329.513437 147.095778 +L 329.566738 146.957336 +L 329.726639 146.33943 +L 329.768095 146.398647 +L 329.851007 146.557776 +L 329.886541 146.453169 +L 329.939842 146.372017 +L 329.981298 146.520737 +L 330.034598 146.63206 +L 330.093821 146.51734 +L 330.147122 146.27308 +L 330.206345 146.467331 +L 330.265568 146.735522 +L 330.330713 146.557558 +L 330.455081 146.423548 +L 330.47877 146.50229 +L 330.549837 146.749173 +L 330.591293 146.56761 +L 330.68605 145.985505 +L 330.727506 146.287943 +L 331.005853 147.885175 +L 331.017698 147.840139 +L 331.035465 147.834199 +L 331.070998 147.933582 +L 331.106532 148.079853 +L 331.142066 147.788575 +L 331.367113 146.253214 +L 331.473714 145.970447 +L 331.509248 145.804619 +L 331.568471 146.057701 +L 331.651383 146.517565 +L 331.704683 146.288054 +L 331.858663 146.195542 +L 331.917885 146.461379 +L 332.048176 146.556652 +L 332.06002 146.569231 +L 332.107399 146.439022 +L 332.131088 146.339212 +L 332.279145 146.062139 +L 332.332446 146.265013 +L 332.646327 147.917134 +L 332.68186 147.835328 +L 333.244478 144.422119 +L 333.309623 144.654784 +L 333.74195 146.475194 +L 333.801173 146.787484 +L 333.890007 146.732547 +L 333.925541 146.697848 +L 334.008453 147.301264 +L 334.322334 150.103125 +L 334.328256 150.101498 +L 334.428935 149.552749 +L 334.565148 149.02993 +L 334.588837 149.075959 +L 334.630293 148.971198 +L 334.902718 146.882443 +L 335.181065 145.112679 +L 335.329122 144.211559 +L 335.45349 144.331004 +L 335.518636 144.442969 +L 335.583781 144.982103 +L 335.660771 144.752788 +L 335.862128 144.120158 +L 335.897662 144.210849 +L 335.962807 144.560703 +L 336.045719 144.835652 +L 336.093097 144.735877 +L 336.122709 144.638266 +L 336.140476 144.605201 +L 336.181932 144.779796 +L 336.318144 145.708235 +L 336.371445 145.494063 +L 336.412901 145.387332 +L 336.454357 145.564985 +L 336.525424 145.806874 +L 336.572803 145.621809 +L 336.768238 145.250783 +L 336.786005 145.259333 +L 336.815616 145.266807 +L 336.833383 145.349117 +L 336.999207 146.061382 +L 337.076197 145.852901 +L 337.313088 145.032253 +L 337.330855 145.050429 +L 337.449301 145.022133 +L 337.461146 145.050038 +L 337.526291 144.911172 +L 337.573669 145.049113 +L 337.609203 144.932332 +L 337.709882 144.724247 +L 337.733571 144.815615 +L 338.071141 147.154119 +L 338.189587 147.082959 +L 338.207354 147.063063 +L 338.236965 147.214646 +L 338.24881 147.242014 +L 338.296188 147.008119 +L 338.30211 147.008283 +L 338.355411 147.240657 +L 338.45609 147.099481 +L 338.50939 147.249613 +L 338.639681 147.574462 +L 338.675214 147.497302 +L 338.817349 146.968872 +L 338.882494 147.250126 +L 338.912106 147.382003 +L 339.036474 147.664003 +L 339.048318 147.661503 +L 339.119386 147.476224 +L 339.344433 146.352583 +L 339.551713 145.89267 +L 339.599091 145.934737 +L 339.646469 146.063057 +L 339.711614 146.675539 +L 339.895205 147.848384 +L 339.966273 147.75309 +L 340.309765 145.480407 +L 340.32161 145.508894 +L 340.3986 145.690237 +L 340.576268 145.925102 +L 340.753937 145.502809 +L 340.795393 145.424205 +L 340.848693 145.551462 +L 341.091507 146.723047 +L 341.174419 146.624523 +L 341.713347 144.792612 +L 341.784415 144.988581 +L 341.920627 145.399054 +L 342.068685 145.655828 +L 342.240431 146.040732 +L 342.424022 146.512062 +L 342.477322 146.423351 +L 342.54839 146.110151 +L 342.625379 146.272853 +L 342.767514 147.235987 +L 342.844504 146.997489 +L 342.862271 147.012099 +L 343.235375 146.274825 +L 343.306442 146.068871 +L 343.359743 146.172115 +L 343.424888 146.439408 +L 343.495956 146.223141 +L 343.513722 146.199637 +L 343.543334 146.38369 +L 343.58479 146.575552 +L 343.649935 146.390233 +L 343.756536 146.36568 +L 343.774303 146.404656 +L 343.851293 146.770714 +L 343.904593 146.510615 +L 344.088184 145.647361 +L 344.301387 144.822786 +L 344.567889 143.636042 +L 344.627112 143.966844 +L 345.03575 146.99768 +L 345.083128 146.884598 +L 345.154196 146.497705 +L 345.213419 146.717132 +L 345.556911 148.276039 +L 345.60429 147.978492 +L 345.740502 147.129349 +L 345.799725 147.205604 +L 345.823414 147.268608 +L 345.924093 148.032663 +L 346.001083 147.80613 +L 346.415643 145.629166 +L 346.522244 145.120744 +L 346.575545 145.174565 +L 346.830203 146.657125 +L 346.924959 146.494168 +L 347.061172 146.416464 +L 347.280297 145.852662 +L 347.475732 144.42094 +L 347.5468 144.278735 +L 347.588256 144.39081 +L 347.665245 144.674243 +L 347.73039 144.510022 +L 347.736313 144.511547 +L 347.75408 144.432716 +L 347.854758 143.967386 +L 347.896214 144.245913 +L 348.263396 146.45374 +L 348.423298 146.928133 +L 348.701645 147.861689 +L 348.71349 147.867241 +L 348.731257 147.942042 +L 348.991837 149.241153 +L 349.039216 148.885905 +L 349.282029 147.444038 +L 349.566299 146.025733 +L 349.601833 146.223355 +L 349.720279 146.941159 +L 349.773579 146.711348 +L 349.868336 146.430599 +L 349.909792 146.650528 +L 349.998626 147.147466 +L 350.069694 147.005962 +L 350.342119 145.583223 +L 350.395419 145.689259 +L 350.454642 145.437631 +L 350.472409 145.333336 +L 350.543476 145.590418 +L 350.614544 145.764128 +L 350.774446 146.801886 +L 350.857358 146.662001 +L 350.898814 146.484127 +L 350.969881 146.257898 +L 351.023182 146.438693 +L 351.325218 147.367777 +L 351.35483 147.19823 +L 351.645022 144.026494 +L 351.716089 144.258176 +L 351.787157 144.513454 +L 351.852302 144.45678 +L 352.02997 144.008814 +L 352.071426 144.231979 +L 352.355696 145.984431 +L 352.491909 146.243975 +L 352.740645 147.127086 +L 352.752489 147.11542 +L 352.977536 146.142239 +L 353.137438 145.382335 +L 353.178894 145.443024 +L 353.374329 145.574064 +L 353.386174 145.531068 +L 353.528309 145.258127 +L 353.55792 145.359676 +L 353.593454 145.445899 +L 353.640832 145.282918 +L 353.676366 145.229591 +L 353.7119 145.368547 +L 353.717822 145.37026 +L 353.759278 145.496228 +L 353.818501 145.32765 +L 353.848112 145.333218 +L 353.871801 145.233322 +L 354.090926 144.309364 +L 354.132382 144.346957 +L 354.17976 144.534571 +L 354.351507 145.139716 +L 354.357429 145.132406 +L 354.446263 144.944324 +L 354.499564 145.115707 +L 354.517331 145.176229 +L 354.564709 144.972893 +L 354.576554 144.984164 +L 354.67131 144.69023 +L 354.730533 144.616785 +L 354.766067 144.794523 +L 354.985191 146.456656 +L 355.074026 145.908736 +L 355.198394 145.376445 +L 355.263539 145.47686 +L 355.281306 145.530543 +L 355.340529 145.326116 +L 355.393829 144.988041 +L 355.470819 145.177799 +L 355.618876 145.898912 +L 355.672177 145.832043 +L 355.749166 145.747064 +L 355.790622 145.876973 +L 355.897223 146.047962 +L 355.974213 145.997538 +L 356.074892 145.920365 +L 356.098581 145.986101 +L 356.317706 146.599482 +L 356.459841 146.945313 +L 356.513141 146.849503 +L 356.584209 146.57514 +L 356.607898 146.489957 +L 356.678965 146.670914 +L 356.720421 146.846108 +L 356.803333 146.75258 +L 356.892168 146.531835 +L 356.939546 146.662067 +L 357.093525 147.160862 +L 357.223816 147.966082 +L 357.294883 147.656309 +L 357.644298 145.218816 +L 357.662065 145.253883 +L 358.01148 148.409519 +L 358.118081 147.883504 +L 358.331283 147.275641 +L 358.34905 147.295726 +L 358.414195 147.201687 +L 358.568175 146.71754 +L 358.603708 146.782631 +L 358.662931 147.028548 +L 358.8406 147.673529 +L 358.858367 147.656528 +L 358.947201 147.451589 +L 359.000502 147.627898 +L 359.154481 147.929439 +L 359.207782 148.123454 +L 359.25516 147.861527 +L 359.415062 147.523266 +L 359.444673 147.479036 +L 359.486129 147.595613 +L 359.598653 147.749333 +L 359.622342 147.707085 +L 359.675642 147.571567 +L 359.740787 147.665789 +L 359.811855 147.809418 +L 359.847389 147.640134 +L 360.267871 145.724496 +L 360.285638 145.721799 +L 360.315249 145.823383 +L 360.380394 146.057201 +L 360.486996 145.999084 +L 360.611364 145.822965 +L 361.008157 144.296281 +L 361.114758 144.057264 +L 361.162136 144.144197 +L 361.173981 144.161349 +L 361.233204 144.061971 +L 361.286504 143.952068 +L 361.345727 144.082955 +L 361.446406 144.407612 +L 362.02679 147.230274 +L 362.091935 146.933737 +L 362.097857 146.925582 +L 362.133391 147.046965 +L 362.145236 147.088589 +L 362.216303 146.916271 +L 362.287371 146.508668 +L 362.346593 146.842911 +L 362.388049 146.961904 +L 362.453195 146.809606 +L 362.59533 146.300948 +L 362.64863 146.513068 +L 362.85591 147.363244 +L 362.861832 147.357656 +L 362.903288 147.257778 +L 362.956589 147.414984 +L 363.306004 148.73253 +L 363.371149 148.61741 +L 363.459983 148.301896 +L 363.525128 148.336206 +L 363.542895 148.360399 +L 363.578429 148.222911 +L 363.649497 147.903369 +L 363.933766 145.65707 +L 364.105513 145.077607 +L 364.17658 144.729108 +L 364.271337 144.437616 +L 364.318715 144.520568 +L 364.72143 145.940485 +L 364.804342 145.669629 +L 364.833954 145.591157 +L 364.881332 145.790542 +L 365.130068 146.719947 +L 365.201136 146.843265 +L 365.361037 147.68385 +L 365.408416 147.500407 +L 365.668996 146.571412 +L 365.811131 146.343693 +L 365.9888 145.148936 +L 366.065789 145.480345 +L 366.338215 146.810255 +L 366.397437 146.782868 +L 366.504039 146.244701 +L 366.622484 145.424125 +L 366.729085 145.506872 +L 366.794231 145.11995 +L 366.847531 144.825641 +L 366.930443 144.907679 +L 367.202868 144.304576 +L 367.220635 144.389222 +L 367.404226 145.432371 +L 367.463449 145.312551 +L 367.688496 144.985355 +L 367.706263 145.003323 +L 367.729952 144.907396 +L 367.889854 144.294831 +L 367.913543 144.304375 +L 368.002377 144.233035 +L 368.037911 144.045235 +L 368.103056 144.294488 +L 368.239269 144.489906 +L 368.257035 144.444385 +L 368.440626 144.041103 +L 368.60645 142.79506 +L 368.636062 142.903222 +L 369.103922 146.311647 +L 369.127612 146.252381 +L 369.293436 145.664252 +L 369.317125 145.722919 +L 369.364503 145.708106 +L 369.376348 145.639463 +L 369.43557 145.157432 +L 369.518482 144.752338 +L 369.565861 144.980418 +L 369.607317 145.066679 +L 369.66654 144.954469 +L 369.802752 144.804656 +L 369.814597 144.842443 +L 370.063333 145.953529 +L 370.0811 145.938255 +L 370.223235 146.584572 +L 370.442359 148.041044 +L 370.483815 147.991922 +L 370.578572 147.741573 +L 370.637795 147.827732 +L 370.732551 148.332344 +L 370.880608 148.995284 +L 370.91022 148.831014 +L 371.342547 145.374747 +L 371.366236 145.38297 +L 371.922931 147.024986 +L 372.029532 147.138022 +L 372.041376 147.127625 +L 372.07691 147.144605 +L 372.278268 146.182915 +L 372.651372 142.782228 +L 372.728362 143.010007 +L 372.823118 143.521492 +L 372.882341 143.257056 +L 373.083699 142.741806 +L 373.107388 142.831463 +L 373.136999 142.936824 +L 373.213989 142.812977 +L 373.302823 142.710815 +L 373.326513 142.80252 +L 373.664083 146.322185 +L 373.73515 145.990171 +L 373.930586 145.242571 +L 373.96612 145.114681 +L 374.060876 144.963991 +L 374.084565 145.004149 +L 374.102332 145.035868 +L 374.185244 144.968193 +L 374.516892 143.718335 +L 374.540581 143.760178 +L 374.552426 143.796981 +L 374.937375 145.270764 +L 374.984753 145.161067 +L 375.150577 144.845798 +L 375.156499 144.852427 +L 375.257178 144.950861 +L 375.505914 145.917221 +L 375.529603 145.905925 +L 375.671738 145.711936 +L 375.695427 145.771283 +L 375.748728 146.00424 +L 375.807951 145.798832 +L 375.896785 145.542656 +L 375.938241 145.668532 +L 375.967852 145.721824 +L 376.009308 145.55162 +L 376.252122 144.092604 +L 376.311345 144.404966 +L 376.50678 146.060429 +L 376.560081 146.008406 +L 376.58377 146.114393 +L 376.613382 146.202758 +L 376.666682 146.051957 +L 376.684449 146.063851 +L 376.873962 146.76317 +L 376.980563 147.276383 +L 377.027942 147.082692 +L 377.626093 144.017669 +L 377.632015 144.032094 +L 377.709005 144.341337 +L 378.093953 146.668961 +L 378.117642 146.606655 +L 378.247933 146.210452 +L 378.834239 144.874719 +L 379.154043 143.270556 +L 379.213265 143.199509 +L 379.242877 143.315092 +L 379.331711 143.836036 +L 379.337633 64.927587 +L 379.343556 148.266603 +L 379.438312 148.266603 +L 379.473846 148.266603 +L 379.479768 70.307916 +L 379.580447 148.266603 +L 379.615981 148.266603 +L 379.621903 71.602474 +L 379.722582 148.266603 +L 379.758116 148.266603 +L 379.835105 55.661938 +L 379.864717 148.266603 +L 379.900251 148.266603 +L 379.906173 49.985462 +L 380.006852 148.266603 +L 380.042386 148.266603 +L 380.048308 72.182861 +L 380.148987 148.266603 +L 380.18452 148.266603 +L 380.26151 76.644218 +L 380.291122 148.266603 +L 380.326655 148.266603 +L 380.403645 48.787082 +L 380.433256 148.266603 +L 380.46879 148.266603 +L 380.54578 54.667923 +L 380.575391 148.266603 +L 380.610925 148.266603 +L 380.687915 72.09699 +L 380.717526 148.266603 +L 380.75306 148.266603 +L 380.83005 62.972142 +L 380.859661 148.266603 +L 380.895195 148.266603 +L 380.901117 66.176537 +L 381.001796 148.266603 +L 381.03733 148.266603 +L 381.043252 76.048092 +L 381.143931 148.266603 +L 381.179465 148.266603 +L 381.256454 62.545657 +L 381.286066 148.266603 +L 381.321599 148.266603 +L 381.327522 44.580194 +L 381.428201 148.266603 +L 381.463734 148.266603 +L 381.540724 95.661956 +L 381.570335 148.266603 +L 381.605869 148.266603 +L 381.682859 62.462348 +L 381.71247 148.266603 +L 381.748004 148.266603 +L 381.753926 36.806562 +L 381.854605 148.266603 +L 381.890139 148.266603 +L 381.967129 53.569342 +L 381.99674 148.266603 +L 382.032274 148.266603 +L 382.038196 66.444747 +L 382.138875 148.266603 +L 382.174409 148.266603 +L 382.251398 73.367351 +L 382.28101 148.266603 +L 382.33431 148.15742 +L 382.423145 147.481698 +L 382.843627 145.641856 +L 382.920617 145.328201 +L 382.985762 145.549496 +L 383.068674 145.946565 +L 383.139741 145.763776 +L 383.311488 145.489233 +L 383.358866 145.669702 +L 383.376633 145.747912 +L 383.441778 145.524819 +L 383.755659 143.427018 +L 383.797115 143.553336 +L 383.986628 145.15235 +L 384.14653 146.329273 +L 384.182064 146.167581 +L 384.22352 145.955534 +L 384.294587 146.135414 +L 384.330121 146.128015 +L 384.347888 146.058543 +L 384.466334 145.866254 +L 384.4841 145.880041 +L 384.614391 146.130473 +L 384.720992 146.906431 +L 384.803904 146.700131 +L 384.815748 146.699319 +L 384.84536 146.778176 +L 385.011184 147.503362 +L 385.05264 147.369618 +L 385.603413 145.480792 +L 385.12963 147.39596 +L 385.638946 145.501271 +L 385.644869 145.5032 +L 385.662635 145.39302 +L 385.715936 145.246147 +L 385.769237 145.363242 +L 385.875838 145.88456 +L 385.935061 145.710412 +L 386.035739 144.963194 +L 386.118651 144.983296 +L 386.408844 144.005473 +L 386.545056 143.155779 +L 386.592434 143.29712 +L 386.716802 144.072847 +L 386.835248 145.075457 +L 386.906316 145.009009 +L 386.947772 145.121096 +L 387.083984 146.305039 +L 387.166896 145.804519 +L 387.40971 144.687291 +L 387.421554 144.710782 +L 387.528156 144.881417 +L 387.563689 144.805181 +L 387.575534 144.789425 +L 387.61699 144.945426 +L 387.658446 145.049364 +L 387.74728 145.003749 +L 387.913104 145.330832 +L 388.001939 145.438287 +L 388.037472 145.417781 +L 388.179607 145.577853 +L 388.226985 145.393298 +L 388.274364 145.303848 +L 388.309897 145.452032 +L 388.529022 146.866345 +L 388.558634 146.888643 +L 388.594167 146.804334 +L 388.629701 146.819298 +L 388.683002 146.949919 +L 388.777758 147.415075 +L 388.825136 147.155369 +L 388.955427 146.845935 +L 388.973194 146.909638 +L 389.06795 147.433599 +L 389.19824 148.001805 +L 389.22193 147.884474 +L 389.535811 146.674981 +L 389.547655 146.678157 +L 389.565422 146.690658 +L 389.600956 146.591479 +L 389.677946 146.38822 +L 389.719402 146.547012 +L 389.749013 146.590128 +L 389.790469 146.439933 +L 389.826003 146.41378 +L 389.855614 146.516233 +L 389.861537 146.520086 +L 389.89707 146.597016 +L 389.932604 146.435855 +L 389.997749 146.149413 +L 390.056972 146.249501 +L 390.31163 145.193727 +L 390.430076 144.432293 +L 390.477454 144.593959 +L 390.951237 147.874063 +L 390.986771 147.718691 +L 391.081528 147.097566 +L 391.146673 147.295016 +L 391.188129 147.362255 +L 391.271041 147.104761 +L 391.37172 146.405974 +L 391.430942 146.436602 +L 391.863269 145.150002 +L 391.869192 145.151882 +L 391.922492 145.247754 +L 392.011327 145.78025 +L 392.04686 145.914241 +L 392.100161 145.608126 +L 392.129772 145.623482 +L 392.153461 145.518176 +L 392.177151 145.465029 +L 392.230451 145.650169 +L 392.271907 145.731541 +L 392.313363 145.535295 +L 392.449576 145.373838 +L 392.485109 145.441712 +L 392.662778 145.790023 +L 392.739768 146.072728 +L 392.911514 146.99889 +L 392.964815 146.827353 +L 393.095105 146.239788 +L 393.148406 146.269457 +L 393.255007 146.259324 +L 393.272774 146.203666 +L 393.639955 144.908796 +L 393.734712 145.226311 +L 393.829468 145.456396 +L 393.870924 145.408868 +L 393.894614 145.381855 +L 393.947914 145.474872 +L 394.137427 146.107326 +L 394.14335 67.175528 +L 394.149272 148.266603 +L 394.244029 148.266603 +L 394.279562 148.266603 +L 394.285485 62.801721 +L 394.386163 148.266603 +L 394.421697 148.266603 +L 394.427619 65.092861 +L 394.528298 148.266603 +L 394.563832 148.266603 +L 394.640822 58.134004 +L 394.670433 148.266603 +L 394.705967 148.266603 +L 394.782957 56.440567 +L 394.812568 148.266603 +L 394.848102 148.266603 +L 394.925091 41.084915 +L 394.954703 148.266603 +L 394.990237 148.266603 +L 395.067226 53.869235 +L 395.096838 148.266603 +L 395.132372 148.266603 +L 395.138294 66.509325 +L 395.238973 148.266603 +L 395.274506 148.266603 +L 395.280429 66.795849 +L 395.381108 148.266603 +L 395.416641 148.266603 +L 395.422564 69.544544 +L 395.523242 148.266603 +L 395.558776 148.266603 +L 395.635766 68.26331 +L 395.665377 148.266603 +L 395.700911 148.266603 +L 395.706833 52.702143 +L 395.807512 148.266603 +L 395.843046 148.266603 +L 395.848968 64.326679 +L 395.949647 148.266603 +L 395.985181 148.266603 +L 396.06217 84.693628 +L 396.091782 148.266603 +L 396.127316 148.266603 +L 396.204305 73.605594 +L 396.233917 148.266603 +L 396.269451 148.266603 +L 396.34644 75.407311 +L 396.376052 148.266603 +L 396.411585 148.266603 +L 396.417508 67.789587 +L 396.518187 148.266603 +L 396.55372 148.266603 +L 396.63071 68.817491 +L 396.660321 148.266603 +L 396.695855 148.266603 +L 396.772845 61.979539 +L 396.802456 148.266603 +L 396.83799 148.266603 +L 396.843912 55.567317 +L 396.944591 148.266603 +L 396.980125 148.266603 +L 397.057115 50.775169 +L 397.086726 148.266603 +L 397.12226 148.266603 +L 397.317695 146.211013 +L 397.335462 146.216398 +L 397.696722 145.34056 +L 397.714488 145.474747 +L 397.921768 147.097842 +L 397.975069 146.874225 +L 398.200116 144.67267 +L 398.283028 144.816191 +L 398.354095 144.589207 +L 398.549531 143.280321 +L 398.57322 143.364041 +L 398.679821 143.884441 +L 398.715355 143.677383 +L 398.946324 142.868601 +L 398.981858 142.800521 +L 399.011469 142.941188 +L 399.200982 144.940923 +L 399.420107 146.59458 +L 399.55632 146.653084 +L 399.473408 146.532158 +L 399.580009 146.6368 +L 399.615542 146.528655 +L 399.710299 146.199472 +L 399.769522 146.261054 +L 399.858356 145.771984 +L 400.053792 144.541592 +L 400.107092 144.314575 +L 400.172237 144.465617 +L 400.320294 145.074121 +L 400.373595 144.941675 +L 400.533497 143.558338 +L 400.640098 143.942816 +L 400.699321 144.112961 +L 401.066503 145.801687 +L 401.190871 145.551864 +L 401.256016 145.683628 +L 401.445529 146.201822 +L 401.605431 146.993331 +L 401.670576 147.15724 +L 401.723876 147.053339 +L 401.771255 147.082012 +L 402.037758 145.96419 +L 402.162126 145.477198 +L 402.191737 145.601114 +L 402.606297 147.923449 +L 402.629986 147.875849 +L 402.801733 147.44895 +L 402.837266 147.562162 +L 402.866878 147.627213 +L 402.920178 147.504286 +L 403.08008 146.283452 +L 403.180759 146.755782 +L 403.245904 146.999519 +L 403.299205 146.794485 +L 403.601241 144.857515 +L 403.719687 145.147122 +L 403.755221 145.232301 +L 403.790754 145.028778 +L 403.921045 144.436447 +L 403.956578 144.469662 +L 404.015801 144.668572 +L 404.057257 144.480001 +L 404.300071 142.867042 +L 404.353372 142.99579 +L 405.028512 146.897895 +L 405.081813 146.639455 +L 405.727342 145.158941 +L 405.786565 145.343474 +L 405.970156 145.525697 +L 405.993845 145.484898 +L 406.094524 145.156924 +L 406.153747 145.431325 +L 406.402483 146.598429 +L 406.443939 146.744389 +L 406.503162 146.559415 +L 407.000634 144.978455 +L 407.018401 145.029187 +L 407.184225 145.438745 +L 407.213836 145.400493 +L 407.432961 145.11838 +L 407.806065 146.866994 +L 408.007422 147.974654 +L 408.025189 147.948766 +L 408.054801 147.923729 +L 408.084412 148.053989 +L 408.20878 148.747944 +L 408.262081 148.478598 +L 408.629262 146.771138 +L 408.759553 145.759983 +L 408.801009 145.966333 +L 408.943144 147.051136 +L 409.020133 61.231845 +L 408.954988 148.266603 +L 409.049745 148.266603 +L 409.085278 148.266603 +L 409.091201 57.472704 +L 409.19188 148.266603 +L 409.227413 148.266603 +L 409.304403 71.518363 +L 409.334015 148.266603 +L 409.369548 148.266603 +L 409.375471 66.380181 +L 409.476149 148.266603 +L 409.511683 148.266603 +L 409.517605 47.099697 +L 409.618284 148.266603 +L 409.653818 148.266603 +L 409.730808 58.145341 +L 409.760419 148.266603 +L 409.795953 148.266603 +L 409.872943 46.233677 +L 409.902554 148.266603 +L 409.938088 148.266603 +L 410.015077 61.235232 +L 410.044689 148.266603 +L 410.080223 148.266603 +L 410.157212 71.467175 +L 410.186824 148.266603 +L 410.222358 148.266603 +L 410.299347 85.665511 +L 410.328959 148.266603 +L 410.364492 148.266603 +L 410.370415 67.432954 +L 410.471094 148.266603 +L 410.506627 148.266603 +L 410.583617 78.253214 +L 410.613228 148.266603 +L 410.648762 148.266603 +L 410.725752 53.741267 +L 410.755363 148.266603 +L 410.790897 148.266603 +L 410.796819 60.767887 +L 410.897498 148.266603 +L 410.933032 148.266603 +L 410.938954 69.617676 +L 411.039633 148.266603 +L 411.075167 148.266603 +L 411.152156 51.478919 +L 411.181768 148.266603 +L 411.217302 148.266603 +L 411.294291 56.256729 +L 411.323903 148.266603 +L 411.359437 148.266603 +L 411.436426 28.403125 +L 411.466038 148.266603 +L 411.501571 148.266603 +L 411.507494 62.944725 +L 411.608173 148.266603 +L 411.643706 148.266603 +L 411.720696 77.901379 +L 411.750307 148.266603 +L 411.785841 148.266603 +L 411.862831 53.540183 +L 411.892442 148.266603 +L 411.933898 148.186918 +L 412.141178 147.006956 +L 412.241857 146.279922 +L 412.449137 144.997268 +L 412.567583 144.716735 +L 412.603117 144.91994 +L 412.721562 146.003719 +L 412.798552 145.523552 +L 412.970298 144.401259 +L 413.035444 144.658296 +L 413.319713 146.371236 +L 413.355247 146.443152 +L 413.384858 146.282457 +L 413.455926 146.026018 +L 413.515149 146.152682 +L 413.692817 146.957258 +L 413.734273 146.810718 +L 413.852719 146.676178 +L 413.870486 146.726587 +L 413.929709 147.10843 +L 413.941553 147.159317 +L 414.012621 146.959755 +L 414.018543 146.968163 +L 414.154756 146.588194 +L 414.356113 144.953789 +L 414.403492 144.632063 +L 414.468637 144.943155 +L 414.776596 146.056276 +L 414.86543 146.273729 +L 415.191156 148.098939 +L 415.208923 148.046685 +L 415.416203 146.690347 +L 415.510959 146.914485 +L 415.56426 146.993649 +L 415.587949 146.857152 +L 415.884063 145.185718 +L 415.913675 145.214061 +L 415.949209 145.118229 +L 416.1861 143.414969 +L 416.286779 143.894639 +L 416.411147 144.844982 +L 416.452603 144.753823 +L 416.505903 144.666152 +L 416.547359 144.802837 +L 416.742795 145.22363 +L 416.748717 145.219393 +L 416.979686 144.774295 +L 416.991531 144.792526 +L 417.038909 144.855016 +L 417.068521 144.71453 +L 417.269878 143.492148 +L 417.329101 143.697483 +L 417.417936 143.997722 +L 417.477158 143.942106 +L 417.826573 144.45603 +L 417.50677 143.915156 +L 417.850263 144.391691 +L 417.99832 143.885962 +L 418.045698 143.932048 +L 418.152299 144.440748 +L 418.483947 146.190944 +L 418.525403 146.291598 +L 418.560937 146.100222 +L 418.780061 144.791255 +L 418.839284 144.811859 +L 418.892585 144.761821 +L 418.90443 144.735297 +L 418.916274 144.721931 +L 418.945886 144.86415 +L 419.182777 145.897207 +L 419.236078 145.873191 +L 419.549959 145.247298 +L 419.745394 144.356994 +L 419.887529 143.56277 +L 419.94083 143.331528 +L 419.988208 143.566291 +L 420.438302 146.247451 +L 420.450146 146.243496 +L 420.633737 145.369682 +L 420.76995 145.636341 +L 420.888395 145.493297 +L 420.959463 145.264812 +L 421.024608 145.457381 +L 421.071986 145.523953 +L 421.125287 145.425379 +L 421.214121 144.802455 +L 421.267422 144.563491 +L 421.344412 144.669013 +L 421.492469 145.416635 +L 421.687904 146.569538 +L 421.764894 146.270606 +L 421.93664 145.594963 +L 422.179454 144.832174 +L 422.250521 144.667507 +L 422.286055 144.816536 +L 422.321589 144.953288 +L 422.398579 144.826693 +L 422.795372 143.171349 +L 422.848672 143.299536 +L 422.872361 143.337206 +L 422.943429 143.240148 +L 422.967118 143.196652 +L 423.032263 143.284248 +L 423.25731 144.254177 +L 423.352067 144.702267 +L 423.393523 144.635998 +L 423.458668 145.131335 +L 423.624492 145.716536 +L 423.654103 145.610898 +L 423.766627 145.032993 +L 423.843616 145.33909 +L 424.169342 146.284166 +L 424.258176 146.76259 +L 424.299633 146.955917 +L 424.3707 146.794682 +L 424.388467 146.810585 +L 424.429923 146.711932 +L 424.524679 146.22904 +L 424.589825 146.418714 +L 424.720115 146.320725 +L 424.945162 145.632975 +L 424.962929 145.711578 +L 425.105063 145.892922 +L 425.170209 145.804035 +L 425.578846 144.344121 +L 425.697292 144.512269 +L 425.715059 144.50552 +L 425.732826 144.430802 +L 425.922339 143.1928 +L 425.993406 143.257652 +L 426.064474 143.212594 +L 426.094085 143.29053 +L 426.171075 143.458459 +L 426.271754 144.320377 +L 426.473112 145.167664 +L 426.532335 145.097081 +L 426.556024 145.20656 +L 426.603402 145.439042 +L 426.656703 145.126049 +L 426.923205 142.666707 +L 426.93505 142.682447 +L 427.071263 143.237962 +L 427.385144 146.483208 +L 427.450289 146.245884 +L 427.562812 145.647566 +L 427.604268 145.822103 +L 427.853004 146.884404 +L 427.977372 147.028929 +L 428.024751 147.309258 +L 428.095818 147.092397 +L 428.279409 146.572736 +L 428.291254 146.591003 +L 428.326787 146.693766 +L 428.380088 146.508782 +L 428.427466 146.192612 +L 428.688047 144.24999 +L 428.74727 144.397925 +L 428.80057 144.630833 +L 429.126296 146.99257 +L 429.191441 146.947747 +L 429.209208 146.995319 +L 429.262509 146.793725 +L 429.552701 145.067899 +L 429.665224 145.265366 +L 429.718525 145.12923 +L 429.83697 144.754091 +L 429.878426 144.949632 +L 430.056095 145.410412 +L 430.062017 145.404037 +L 430.115318 145.544737 +L 430.263375 146.388647 +L 430.316676 146.17306 +L 430.4825 145.799592 +L 430.595023 145.606192 +L 430.630557 145.696121 +L 430.855604 146.970172 +L 430.944438 146.605752 +L 431.068806 145.9213 +L 431.122107 145.933825 +L 431.388609 146.365859 +L 431.418221 146.311771 +L 431.702491 145.596086 +L 432.164429 147.326226 +L 432.21773 146.987257 +L 432.614523 145.102338 +L 432.667823 145.16522 +L 432.786269 145.620389 +L 432.83957 145.387605 +L 432.940249 145.48927 +L 433.129762 146.690054 +L 433.218596 146.528115 +L 433.562089 144.719164 +L 433.579855 144.71532 +L 433.621311 144.633309 +L 433.840436 144.188705 +L 434.000338 144.375694 +L 434.124706 145.083098 +L 434.308297 145.956914 +L 434.320141 145.929272 +L 434.426742 145.779496 +L 434.444509 145.819022 +L 434.480043 145.996761 +L 434.533344 145.754767 +L 434.722857 145.308285 +L 434.870914 145.578557 +L 434.888681 145.545035 +L 434.930137 145.468657 +L 434.98936 145.563031 +L 435.013049 145.640297 +L 435.066349 145.43229 +L 435.184795 144.966918 +L 435.24994 145.214108 +L 435.392075 145.849931 +L 435.492754 145.696062 +L 435.575666 145.34641 +L 435.605277 145.225773 +L 435.6645 145.448432 +L 436.096827 149.128101 +L 436.150128 148.917943 +L 436.51731 145.760727 +L 436.564688 145.911358 +L 436.872647 146.87185 +L 436.878569 146.863658 +L 437.014782 146.341972 +L 437.304974 144.506776 +L 437.55371 143.308029 +L 437.565554 143.330299 +L 437.903125 144.403784 +L 437.997881 144.207601 +L 438.027493 144.240201 +L 438.057104 144.136184 +L 438.074871 144.124411 +L 438.09856 144.008404 +L 438.157783 144.316244 +L 438.418364 145.605237 +L 438.442053 145.516806 +L 438.495353 145.375209 +L 438.554576 145.507014 +L 438.578265 145.646361 +L 438.6671 145.534763 +L 438.903991 144.372908 +L 438.963214 144.618983 +L 439.182338 146.412862 +L 439.271173 146.036176 +L 439.306706 145.888624 +L 439.502142 144.980197 +L 439.531753 145.0106 +L 439.555443 145.048198 +L 439.567287 145.108867 +L 439.602821 145.419033 +L 439.733111 146.080585 +L 439.762723 146.029049 +L 439.780489 146.036655 +L 439.804179 145.920616 +L 440.082526 144.347391 +L 440.123982 144.630412 +L 440.408252 146.887772 +L 440.431941 146.820862 +L 440.722133 145.862739 +L 440.893879 144.786376 +L 440.964947 144.991611 +L 441.343973 147.114159 +L 441.420963 146.646517 +L 441.681543 144.392473 +L 442.096103 146.050395 +L 442.32115 148.409596 +L 442.409985 147.793018 +L 442.783089 146.092473 +L 442.800856 146.077985 +L 442.842312 146.187247 +L 443.061436 146.407161 +L 443.073281 146.416577 +L 443.120659 146.320466 +L 443.215416 146.16978 +L 443.250949 146.296563 +L 443.422696 147.350393 +L 443.475996 147.122041 +L 443.766188 145.532847 +L 443.8491 145.659167 +L 443.855023 145.672116 +L 443.896479 145.502186 +L 444.074147 145.071428 +L 444.091914 145.086865 +L 444.13337 144.82119 +L 444.281427 144.012124 +L 444.311039 144.099687 +L 444.542008 146.196346 +L 444.613075 146.013316 +L 444.618997 146.01801 +L 444.648609 145.910052 +L 444.891423 144.642338 +L 444.926956 144.515731 +L 445.003946 144.625139 +L 445.057247 144.744842 +L 445.294138 145.789981 +L 445.317827 145.71215 +L 445.495496 145.229127 +L 445.50734 145.255401 +L 445.643553 145.885112 +L 445.844911 146.560397 +L 445.856755 146.534416 +L 446.15287 145.869256 +L 446.277238 146.394762 +L 446.306849 146.515927 +L 446.366072 146.243966 +L 446.537818 145.713594 +L 446.756943 144.824822 +L 446.946456 143.37511 +L 446.987912 143.450858 +L 446.993834 143.466797 +L 447.029368 143.267368 +L 447.094513 143.064168 +L 447.141892 143.236525 +L 447.295871 144.001654 +L 447.497229 144.950019 +L 447.698586 145.623342 +L 447.722276 145.552581 +L 448.006545 144.534732 +L 448.07169 144.717287 +L 448.124991 144.511561 +L 448.166447 144.442312 +L 448.207903 144.597929 +L 448.521784 145.977862 +L 448.557318 145.891084 +L 448.77052 144.742632 +L 448.811976 144.477777 +L 448.871199 144.825704 +L 448.930422 145.02534 +L 449.001489 144.966388 +L 449.528573 146.388478 +L 449.552262 146.354276 +L 449.635174 146.485991 +L 449.641096 146.505293 +L 449.694397 146.306796 +L 449.777309 145.865736 +L 449.954978 144.810433 +L 449.966822 144.843255 +L 450.239247 145.873064 +L 450.257014 145.832403 +L 450.422838 145.497341 +L 450.428761 145.506158 +L 450.612351 145.871068 +L 450.636041 145.85481 +L 450.665652 145.846607 +L 450.689341 145.939869 +L 450.736719 145.984097 +L 450.772253 145.860977 +L 450.884777 145.717586 +L 450.914388 145.741499 +L 450.943999 145.755455 +L 450.967689 145.818131 +L 451.080212 146.081337 +L 451.103901 145.997075 +L 451.287492 145.180233 +L 451.328948 145.304345 +L 451.530306 146.289013 +L 451.583606 146.258361 +L 451.648752 146.505336 +L 451.731664 146.381826 +L 451.814576 146.015999 +L 452.146224 144.611892 +L 452.199524 144.766775 +L 452.282436 145.287663 +L 452.359426 145.099898 +L 452.489716 144.385929 +L 452.554861 144.779685 +L 452.631851 145.049596 +L 452.702919 145.016695 +L 452.987188 144.841106 +L 453.028644 144.95781 +L 453.129323 145.094754 +L 453.170779 145.02604 +L 453.443204 143.818867 +L 453.567572 143.930325 +L 453.739319 144.964069 +L 454.041355 148.033233 +L 454.088734 147.924047 +L 454.230868 148.114322 +L 454.278247 148.027323 +L 454.331547 147.656424 +L 454.59805 145.824798 +L 454.609895 145.867163 +L 454.834942 147.075914 +L 454.876398 146.867388 +L 455.077755 145.837001 +L 455.16659 146.193636 +L 455.516005 147.907908 +L 455.533771 147.888738 +L 455.592994 147.794449 +L 455.63445 147.939216 +L 455.669984 148.082855 +L 455.735129 147.939825 +L 455.936487 147.356559 +L 456.0727 146.856274 +L 456.120078 146.943368 +L 456.27998 147.618613 +L 456.380658 147.560914 +L 456.433959 147.572733 +L 456.469493 147.514379 +L 456.528716 147.275331 +L 456.570172 147.531087 +L 456.783374 148.639695 +L 456.830752 148.439817 +L 457.120944 146.480956 +L 457.174245 146.535234 +L 457.387447 147.722834 +L 457.565116 148.337665 +L 457.665795 147.966901 +L 457.967831 145.829302 +L 458.062588 145.549668 +L 458.139578 145.658168 +L 458.234334 145.928063 +L 458.287635 145.699561 +L 458.459381 145.194911 +L 458.642972 145.021282 +L 458.648894 145.030472 +L 458.737728 145.22997 +L 458.956853 146.461927 +L 458.998309 146.317556 +L 459.247045 145.2995 +L 459.306268 145.322367 +L 459.371413 145.150952 +L 459.412869 145.361937 +L 459.572771 145.767149 +L 459.578693 145.758311 +L 459.626071 145.848437 +L 459.72675 146.421325 +L 459.780051 146.16461 +L 459.815585 146.109495 +L 459.857041 146.21395 +L 460.022865 147.168375 +L 460.052476 146.99988 +L 460.621016 144.023883 +L 460.662472 144.139741 +L 460.70985 144.262338 +L 460.774995 144.130249 +L 460.887518 143.98036 +L 460.964508 143.713989 +L 461.011886 143.911478 +L 461.272467 145.428395 +L 461.343535 145.548651 +L 461.379068 145.392804 +L 461.550815 144.994659 +L 461.835084 146.489397 +L 461.917996 146.21156 +L 462.095665 145.997006 +L 462.113432 146.038217 +L 462.131199 146.059122 +L 462.166732 145.931389 +L 462.190422 145.783085 +L 462.273334 145.93378 +L 462.332556 145.865344 +L 462.338479 145.847569 +L 462.581292 145.3162 +L 462.646438 145.487353 +L 462.699738 145.78605 +L 462.853718 146.536235 +L 462.871484 146.49074 +L 463.149832 145.307802 +L 463.155754 145.312432 +L 463.167599 145.321877 +L 463.209055 145.194918 +L 463.303811 145.035596 +L 463.339345 145.092561 +L 463.540703 145.763282 +L 463.546625 145.759364 +L 463.605848 145.843312 +L 463.676915 145.749903 +L 463.730216 145.871876 +L 463.795361 145.99273 +L 463.830895 145.834178 +L 463.842739 145.775405 +L 463.907885 146.032626 +L 463.990797 146.369589 +L 464.032253 146.242753 +L 464.150698 145.83288 +L 464.192154 145.888536 +L 464.494191 146.403092 +L 464.535647 146.596856 +L 464.606714 146.41119 +L 464.660015 146.205462 +L 464.67186 146.175589 +L 464.737005 146.264217 +L 464.748849 146.263121 +L 464.843606 146.655701 +L 464.908751 146.465246 +L 465.027197 145.734632 +L 465.110109 145.908712 +L 465.133798 145.934498 +L 465.163409 145.838518 +L 465.198943 145.643976 +L 465.264088 145.901186 +L 465.364767 146.437211 +L 465.418068 146.299909 +L 465.447679 146.221177 +L 465.506902 146.381037 +L 465.844472 148.112317 +L 465.909617 147.90622 +L 466.069519 147.407599 +L 466.087286 147.458291 +L 466.282721 148.400302 +L 466.353789 148.212792 +L 466.87495 146.493882 +L 467.00524 145.918649 +L 467.040774 145.993802 +L 467.08223 145.855208 +L 467.105919 145.794322 +L 467.147375 146.003127 +L 467.188831 146.140258 +L 467.253976 146.026168 +L 467.4198 145.460211 +L 467.455334 145.485951 +L 467.479023 145.518226 +L 467.514557 145.361796 +L 467.698148 144.875739 +L 467.792905 145.1532 +L 467.887661 145.296394 +L 467.840283 145.135426 +L 467.923195 145.250007 +L 467.982418 144.954202 +L 468.112708 143.946304 +L 468.183775 144.149279 +L 468.337755 145.054917 +L 468.379211 145.246533 +L 468.462123 145.195543 +L 468.473967 145.187657 +L 468.503579 145.293388 +L 468.681248 146.073658 +L 468.716781 145.90874 +L 468.924061 144.457523 +L 469.042507 144.831101 +L 469.273476 146.416214 +L 469.326777 146.279583 +L 469.445222 145.826744 +L 469.51629 145.934441 +L 469.688036 145.665583 +L 469.877549 144.649069 +L 469.93085 144.680898 +L 469.948617 144.666879 +L 469.984151 144.775027 +L 469.995995 144.769387 +L 470.221042 145.422973 +L 470.457933 146.393915 +L 470.493467 146.397031 +L 470.523079 146.292726 +L 470.540845 146.264156 +L 470.588224 146.453442 +L 470.659291 146.642611 +L 470.694825 146.425077 +L 470.943561 145.296657 +L 470.949483 145.301691 +L 471.079774 145.441671 +L 471.168608 146.04981 +L 471.405499 146.990736 +L 471.411422 146.987103 +L 471.506178 146.873523 +L 471.547634 146.981154 +L 471.648313 147.281947 +L 471.683847 147.066116 +L 471.74307 146.925705 +L 471.778603 147.171181 +L 471.861515 147.827118 +L 471.920738 147.54372 +L 472.021417 146.540965 +L 472.216853 145.291878 +L 472.4952 144.624044 +L 472.270153 145.375271 +L 472.512967 144.676674 +L 472.619568 145.151187 +L 472.874226 146.944012 +L 472.897915 146.892162 +L 473.111118 146.940249 +L 473.128885 146.948383 +L 473.152574 146.85642 +L 473.306553 146.040331 +L 473.353932 146.146966 +L 473.4783 146.810057 +L 473.727036 148.676575 +L 473.780336 148.437807 +L 473.975772 148.002218 +L 474.236352 147.288163 +L 474.289653 147.395619 +L 474.331109 147.350458 +L 474.342953 147.306407 +L 474.923337 144.722709 +L 474.98256 144.658676 +L 475.05955 145.232189 +L 475.254986 146.534851 +L 475.355664 146.359938 +L 475.503722 146.120458 +L 475.639934 145.973166 +L 475.574789 146.169876 +L 475.651779 145.989655 +L 475.711002 146.06125 +L 475.776147 146.01354 +L 475.787991 146.030116 +L 475.799836 146.119183 +L 475.823525 146.224222 +L 475.88867 146.042558 +L 476.113717 145.06687 +L 476.137406 145.074768 +L 476.238085 145.100104 +L 476.24993 145.165047 +L 476.593422 146.874049 +L 476.682257 146.793525 +L 477.067205 145.538217 +L 477.126428 145.280365 +L 477.250796 144.60007 +L 477.292252 144.722286 +L 477.310019 144.771708 +L 477.36332 144.566836 +L 477.381086 144.546945 +L 477.410698 144.479038 +L 477.458076 144.381995 +L 477.49361 144.521241 +L 477.600211 145.169145 +L 477.647589 144.995519 +L 477.748268 144.618318 +L 477.801569 144.772729 +L 478.364186 147.48293 +L 478.417487 147.149313 +L 478.601077 145.869167 +L 478.624767 145.936434 +L 478.73729 146.211939 +L 478.778746 146.063329 +L 479.193306 145.009675 +L 479.199228 145.021705 +L 479.205151 145.027894 +L 479.22884 144.915082 +L 479.305829 144.626125 +L 479.347285 144.85681 +L 479.477576 145.622694 +L 479.548643 145.596558 +L 479.619711 146.127688 +L 479.702623 146.596413 +L 479.750001 146.407087 +L 480.004659 145.038344 +L 480.028348 145.079455 +L 480.087571 145.193961 +L 480.253395 145.722051 +L 480.336307 145.658747 +L 480.359996 145.700634 +L 480.383686 145.64086 +L 480.431064 145.878756 +L 480.579121 145.634738 +L 480.650189 145.342174 +L 480.709411 145.557416 +L 480.733101 145.643456 +L 480.821935 145.561276 +L 480.940381 145.995697 +L 481.076593 146.96851 +L 481.17135 146.721656 +L 481.360863 146.00914 +L 481.372707 146.029339 +L 481.455619 146.235301 +L 481.50892 146.084216 +L 481.603677 145.725117 +L 481.645133 145.913458 +L 481.698433 146.121178 +L 481.739889 145.87754 +L 482.13076 143.638558 +L 482.160372 143.578222 +L 482.231439 143.676232 +L 482.278817 143.778672 +L 482.385418 144.551256 +L 482.462408 144.937967 +L 482.509786 144.717469 +L 482.681533 144.413162 +L 482.717066 144.393452 +L 482.758523 144.48533 +L 483.001336 145.335679 +L 483.03687 145.247265 +L 483.202694 144.565956 +L 483.24415 144.700054 +L 483.315217 145.3632 +L 483.664632 148.227949 +L 483.682399 148.132807 +L 484.014047 145.954449 +L 484.037736 146.022793 +L 484.292395 147.36612 +L 484.381229 147.884262 +L 484.452296 147.806913 +L 484.48783 147.991138 +L 484.552975 147.754006 +L 485.115593 145.395071 +L 485.162971 145.449311 +L 485.26365 145.818474 +L 485.405785 146.394675 +L 485.465007 146.256835 +L 485.844034 145.606115 +L 485.849956 145.618631 +L 485.926946 146.495839 +L 485.998013 147.197699 +L 486.069081 147.032214 +L 486.305972 145.239987 +L 486.418496 145.61299 +L 486.483641 145.911217 +L 486.542864 145.715529 +L 486.667232 144.767207 +L 486.833056 144.904256 +L 486.880434 144.88526 +L 486.904123 144.968888 +L 486.97519 145.185163 +L 487.034413 145.087575 +L 487.058102 144.970476 +L 487.111403 145.216372 +L 487.170626 145.262793 +L 487.20616 145.157872 +L 487.460818 144.535335 +L 487.709554 144.375144 +L 487.839844 144.582575 +L 487.756932 144.34759 +L 487.869456 144.504096 +L 487.993824 143.680595 +L 488.070813 143.909584 +L 488.076736 143.90697 +L 488.094503 143.995615 +L 488.147803 144.213548 +L 488.230715 144.197626 +L 488.278094 144.063276 +L 488.31955 143.88886 +L 488.384695 144.085399 +L 488.65712 144.936318 +L 488.704498 144.816868 +L 488.751876 144.608894 +L 488.840711 144.688857 +L 488.935467 144.825252 +L 489.160514 145.62841 +L 489.391483 146.61398 +L 489.456629 146.426671 +L 489.551385 145.981466 +L 489.604686 146.121053 +L 489.681675 146.174315 +L 489.711287 146.093955 +L 489.734976 146.026403 +L 489.776432 146.128234 +L 489.817888 146.108768 +L 490.285749 147.660243 +L 490.344972 147.390748 +L 490.516718 146.540824 +L 490.552252 146.617193 +L 490.641086 146.767405 +L 490.664775 146.663887 +L 490.771376 146.5364 +L 490.783221 146.565317 +L 490.830599 146.850126 +L 490.907589 146.70698 +L 491.079335 146.275423 +L 491.103024 146.297023 +L 491.132636 146.292437 +L 491.150402 146.235475 +L 491.180014 146.152677 +L 491.233314 146.389935 +L 491.245159 146.445129 +L 491.304382 146.199846 +L 491.535351 145.190398 +L 491.624185 145.443969 +L 491.630108 145.46667 +L 491.671564 145.225455 +L 491.689331 145.177716 +L 491.760398 145.283994 +L 491.778165 145.302173 +L 491.825543 145.17019 +L 491.831465 145.17449 +L 491.861077 145.076937 +L 491.979523 144.728379 +L 492.009134 144.885667 +L 492.25787 145.65188 +L 492.299326 145.511808 +L 492.482917 143.75681 +L 492.589518 144.183455 +L 493.140291 147.822689 +L 493.187669 147.7288 +L 493.513395 146.214579 +L 493.762131 143.910496 +L 493.821354 143.566106 +L 493.886499 143.786995 +L 494.206302 145.205079 +L 494.224069 145.2652 +L 494.318826 145.209271 +L 494.342515 145.201671 +L 494.360282 145.268877 +L 494.383971 145.291067 +L 494.425427 145.364949 +L 494.455038 145.191684 +L 494.48465 145.25236 +L 494.579406 145.29505 +L 494.61494 145.238515 +L 494.650474 145.249307 +L 494.668241 145.319656 +L 494.95251 146.840067 +L 494.9762 146.7666 +L 495.088723 146.268057 +L 495.147946 146.356237 +L 495.266392 146.619549 +L 495.290081 146.519171 +L 495.361148 146.15723 +L 495.408526 146.468722 +L 495.829009 147.963435 +L 495.840853 147.986326 +L 495.882309 147.816585 +L 496.202113 145.885376 +L 496.326481 145.511286 +L 496.385704 145.675866 +L 496.622595 146.466554 +L 496.711429 146.972506 +L 496.829875 146.795307 +L 496.853564 146.768221 +L 496.89502 146.878323 +L 496.912787 146.883994 +L 496.948321 146.778794 +L 497.019388 146.700314 +L 497.043078 146.824865 +L 497.066767 146.896171 +L 497.137834 146.763879 +L 497.351036 146.124471 +L 497.374726 146.207288 +L 497.570161 147.397486 +L 497.59385 147.293061 +L 498.109089 144.422273 +L 498.132778 144.39029 +L 498.168312 144.596324 +L 498.36967 145.609764 +L 498.387437 145.562866 +L 498.452582 145.196817 +L 498.529571 145.286795 +L 498.612483 144.926506 +L 498.648017 144.814634 +L 498.695395 145.087283 +L 498.973743 146.866225 +L 499.032966 146.834183 +L 499.1218 147.038096 +L 499.163256 146.830626 +L 499.19879 146.678652 +L 499.269857 146.839522 +L 499.281702 146.859129 +L 499.311313 146.77913 +L 499.364614 146.78636 +L 499.435681 146.689408 +L 499.648884 144.92709 +L 499.678495 145.015033 +L 499.927231 146.278758 +L 499.998298 146.201244 +L 500.051599 146.114168 +L 500.081211 146.276872 +L 500.31218 147.152459 +L 500.36548 147.101522 +L 500.703051 146.413823 +L 500.762273 146.513603 +L 500.845185 146.63631 +L 500.916253 146.483189 +L 501.070232 146.298337 +L 501.105766 146.323867 +L 501.117611 146.358807 +L 501.182756 146.223527 +L 501.1946 146.194498 +L 501.27159 146.289812 +L 501.443336 146.414785 +L 501.467026 146.380559 +L 501.514404 146.50264 +L 501.585471 146.610249 +L 501.63285 146.489138 +L 501.828285 145.780293 +L 501.703917 146.546628 +L 501.89343 146.054094 +L 501.982264 146.175945 +L 502.011876 146.071477 +L 502.059254 145.835897 +L 502.130322 146.013572 +L 502.284301 146.738858 +L 502.349446 146.469636 +L 502.527115 145.735893 +L 502.568571 145.800542 +L 502.829151 146.581811 +L 502.846918 146.553661 +L 502.92983 146.339431 +L 503.166722 145.447065 +L 503.374002 144.946427 +L 503.427302 145.078004 +L 503.563515 145.843612 +L 503.634582 145.766104 +L 503.895163 145.919858 +L 503.91293 145.855496 +L 504.132054 145.120236 +L 504.137977 145.112606 +L 504.179433 145.240284 +L 504.345257 146.011172 +L 504.357101 146.002257 +L 504.511081 146.570955 +L 504.588071 146.315732 +L 504.878263 145.044521 +L 504.919719 145.242595 +L 505.103309 145.687304 +L 505.150688 145.5908 +L 505.180299 145.444859 +L 505.239522 145.688511 +L 505.251367 145.704637 +L 505.2869 145.546116 +L 505.381657 145.373595 +L 505.405346 145.481624 +L 505.583015 146.074763 +L 505.624471 146.146316 +L 505.719227 146.537241 +L 505.760683 146.365806 +L 505.938352 145.666561 +L 505.944274 145.669348 +L 505.997575 145.851922 +L 506.050875 145.670357 +L 506.163399 145.417729 +L 506.198932 145.577817 +L 506.222622 145.653725 +L 506.281844 145.427684 +L 506.441746 144.947568 +L 506.524658 144.811935 +L 506.55427 144.874883 +L 506.666793 145.692524 +L 506.791161 146.330527 +L 506.838539 146.209058 +L 506.862229 146.268726 +L 506.89184 146.292909 +L 506.903685 146.334186 +L 506.951063 146.129767 +L 507.093198 145.476067 +L 507.182032 145.287047 +L 507.217566 145.356466 +L 507.318245 145.574048 +L 507.353778 145.495651 +L 507.424846 145.540293 +L 507.489991 145.405085 +L 507.774261 144.771974 +L 507.827561 145.019782 +L 507.981541 145.382382 +L 508.00523 145.345914 +L 508.052608 145.501875 +L 508.099986 145.833209 +L 508.336878 147.941827 +L 508.372412 147.867164 +L 508.739593 148.773337 +L 508.781049 148.672966 +L 508.858039 147.996503 +L 509.11862 145.586801 +L 509.165998 145.603388 +L 509.183765 145.579878 +L 509.219299 145.700938 +L 509.278521 145.975805 +L 509.337744 145.769564 +L 509.468035 145.343482 +L 509.521335 145.401124 +L 509.568713 145.469411 +L 509.604247 145.305757 +L 509.627936 145.265223 +L 509.66347 145.445747 +L 509.704926 145.498938 +L 509.746382 145.363818 +L 509.787838 145.35026 +L 509.811527 145.423321 +L 510.066186 147.052132 +L 510.220165 146.852493 +L 510.374144 145.931604 +L 510.658414 143.771158 +L 510.69987 143.833854 +L 510.788704 144.102613 +L 510.883461 144.220718 +L 510.913073 144.124889 +L 510.960451 143.987262 +L 511.025596 144.12428 +L 511.043363 144.113114 +L 511.067052 144.242876 +L 511.375011 146.905277 +L 511.434234 146.670217 +L 511.659281 145.072804 +L 511.807338 145.270292 +L 511.848794 145.328453 +L 511.902094 145.241678 +L 512.008696 144.951215 +L 512.050152 145.083596 +L 512.115297 145.346754 +L 512.186364 145.210539 +L 512.251509 145.002242 +L 512.387722 144.524127 +L 512.429178 144.55931 +L 512.446945 144.582874 +L 512.518012 144.496888 +L 512.660147 143.927001 +L 512.707525 144.041045 +L 512.808204 144.603633 +L 512.879272 144.306522 +L 513.039173 143.824703 +L 513.175386 143.355146 +L 513.222764 143.526075 +L 513.820915 147.031848 +L 513.903827 147.250343 +L 514.087418 148.159176 +L 514.134796 147.835316 +L 514.342076 146.353195 +L 514.472367 145.846309 +L 514.5079 145.967208 +L 515.070518 148.098563 +L 515.141585 147.99916 +L 515.254109 147.444255 +L 515.473233 146.342692 +L 515.573912 145.739138 +L 515.650902 145.828377 +L 515.680513 145.715279 +L 515.739736 145.371226 +L 515.816726 145.500801 +L 515.82857 145.516416 +L 515.875949 145.413228 +L 515.958861 145.172401 +L 516.006239 145.297744 +L 516.053617 145.406986 +L 516.089151 145.261151 +L 516.266819 144.182304 +L 516.349732 144.457608 +L 516.39711 144.614313 +L 516.45041 144.441373 +L 516.5274 144.178348 +L 516.580701 144.351922 +L 516.622157 144.379623 +L 516.645846 144.266468 +L 516.740602 143.769666 +L 516.776136 144.060765 +L 517.042639 146.339076 +L 517.078173 146.254052 +L 517.196618 146.572116 +L 517.249919 146.332418 +L 517.457199 145.80185 +L 517.474966 145.818039 +L 517.528267 145.506269 +L 517.71778 144.969275 +L 517.741469 144.986362 +L 517.747391 144.980145 +L 517.782925 145.091285 +L 518.13234 147.480151 +L 518.191563 147.183734 +L 518.357387 146.803941 +L 518.446221 146.597859 +L 518.493599 146.30502 +L 518.558744 146.577991 +L 518.588356 146.643832 +L 518.659423 146.531911 +L 518.866703 145.672715 +L 518.96146 145.86283 +L 519.044372 146.048546 +L 519.079906 145.887416 +L 519.198351 145.495392 +L 519.251652 145.606942 +L 519.263496 145.621314 +L 519.310875 145.524555 +L 519.334564 145.534471 +L 519.346408 145.530303 +L 519.370098 145.618884 +L 519.381942 145.634437 +L 519.423398 145.628064 +L 519.447087 145.584152 +L 519.476699 145.580529 +L 519.541844 145.24654 +L 519.991938 143.477471 +L 520.003782 143.490902 +L 520.068927 143.435087 +L 520.092617 143.523328 +L 520.163684 143.936181 +L 520.240674 143.789674 +L 520.299897 143.639685 +L 520.347275 143.784369 +L 520.560477 145.167971 +L 520.613778 145.052823 +L 520.684845 144.725744 +L 520.744068 144.946174 +L 520.939504 146.406768 +L 520.98096 146.711008 +L 521.063872 146.532885 +L 521.247462 145.869216 +L 521.330374 145.460593 +L 521.389597 145.615109 +L 521.496198 145.771613 +L 521.52581 145.662368 +L 521.590955 145.367958 +L 521.6561 145.557158 +L 521.804157 145.730996 +L 521.827847 145.679202 +L 521.958137 145.359172 +L 521.981826 145.411125 +L 522.076583 145.483625 +L 522.035127 145.385105 +L 522.100272 145.443427 +L 522.177261 145.382472 +L 522.183184 145.36038 +L 522.366775 144.34594 +L 522.455609 144.490904 +L 522.668811 144.249149 +L 522.526676 144.534417 +L 522.686578 144.282525 +L 522.870169 144.959752 +L 522.994537 144.781866 +L 523.118905 144.602609 +L 523.142594 144.668831 +L 523.33803 145.985636 +L 523.563076 149.145401 +L 523.610455 148.983112 +L 524.072393 147.661591 +L 524.670544 143.67862 +L 524.706078 143.765773 +L 524.901513 144.086398 +L 524.91928 144.062209 +L 524.937047 144.042188 +L 525.002192 144.141235 +L 525.173938 144.70522 +L 525.470053 145.949599 +L 525.552965 146.079271 +L 525.576654 145.954356 +L 525.701022 145.473138 +L 525.736556 145.566934 +L 525.795778 145.733126 +L 525.849079 145.558617 +L 525.872768 145.506416 +L 525.931991 145.654026 +L 525.937913 145.650014 +L 526.026748 145.986372 +L 526.139271 146.085555 +L 526.145193 146.080216 +L 526.180727 145.861086 +L 526.352473 144.704964 +L 526.376163 144.779046 +L 526.44723 145.037835 +L 526.476841 145.191726 +L 526.57752 145.167616 +L 526.713733 145.061596 +L 526.86179 144.5224 +L 526.903246 144.627277 +L 527.305962 145.848778 +L 527.323728 145.816009 +L 527.388874 145.958374 +L 527.465863 49.827658 +L 527.400718 148.266603 +L 527.495475 148.266603 +L 527.531008 148.266603 +L 527.536931 57.40923 +L 527.63761 148.266603 +L 527.673143 148.266603 +L 527.750133 52.569194 +L 527.779744 148.266603 +L 527.815278 148.266603 +L 527.892268 34.903868 +L 527.921879 148.266603 +L 527.957413 148.266603 +L 527.963335 66.180147 +L 528.064014 148.266603 +L 528.099548 148.266603 +L 528.176538 75.945425 +L 528.206149 148.266603 +L 528.241683 148.266603 +L 528.318673 63.419785 +L 528.348284 148.266603 +L 528.383818 148.266603 +L 528.460807 44.595016 +L 528.490419 148.266603 +L 528.525953 148.266603 +L 528.531875 57.481169 +L 528.632554 148.266603 +L 528.668087 148.266603 +L 528.67401 57.853288 +L 528.774689 148.266603 +L 528.810222 148.266603 +L 528.816145 47.891368 +L 528.916823 148.266603 +L 528.952357 148.266603 +L 529.029347 59.64589 +L 529.058958 148.266603 +L 529.094492 148.266603 +L 529.171482 66.143823 +L 529.201093 148.266603 +L 529.236627 148.266603 +L 529.242549 66.18952 +L 529.343228 148.266603 +L 529.378762 148.266603 +L 529.455752 98.477529 +L 529.485363 148.266603 +L 529.520897 148.266603 +L 529.597886 54.485421 +L 529.627498 148.266603 +L 529.663032 148.266603 +L 529.668954 67.574548 +L 529.769633 148.266603 +L 529.805166 148.266603 +L 529.882156 94.264791 +L 529.911768 148.266603 +L 529.947301 148.266603 +L 530.024291 75.576059 +L 530.053902 148.266603 +L 530.089436 148.266603 +L 530.095358 78.338383 +L 530.196037 148.266603 +L 530.231571 148.266603 +L 530.308561 86.717073 +L 530.338172 148.266603 +L 530.38555 148.165354 +L 530.681665 145.989977 +L 530.74681 146.397318 +L 530.859333 146.524865 +L 530.871178 146.488989 +L 531.048847 146.190953 +L 531.066613 146.224235 +L 531.119914 146.444713 +L 531.185059 146.291565 +L 531.362728 145.69917 +L 531.380495 145.757273 +L 531.439717 145.837935 +L 531.487096 145.740643 +L 531.52263 145.845815 +L 531.688454 146.412359 +L 531.72991 146.399058 +L 532.061558 147.713179 +L 532.108936 147.608205 +L 532.286604 146.618242 +L 532.322138 146.660481 +L 532.339905 146.661239 +L 532.369516 146.56781 +L 532.523496 145.930157 +L 532.553107 145.97526 +L 532.576797 146.070942 +L 532.624175 145.889123 +L 532.647864 145.900017 +L 532.730776 145.608826 +L 532.843299 145.063276 +L 532.908445 145.146749 +L 532.920289 145.183692 +L 532.979512 144.956942 +L 533.121647 144.51549 +L 533.169025 144.723922 +L 533.553974 148.049709 +L 533.642808 147.734695 +L 533.832321 147.004057 +L 534.146202 145.192832 +L 534.199503 145.225483 +L 534.235037 145.272584 +L 534.276493 145.151865 +L 534.394938 144.711415 +L 534.454161 144.817523 +L 534.779887 145.734713 +L 534.809499 145.71674 +L 534.845032 145.728701 +L 534.862799 145.792348 +L 535.034545 146.2051 +L 535.04639 146.173625 +L 535.081924 146.063052 +L 535.141147 146.231527 +L 535.147069 146.225478 +L 535.200369 146.124334 +L 535.247748 146.25669 +L 535.449105 147.168067 +L 535.520173 146.745504 +L 535.733375 145.524185 +L 535.739297 145.533426 +L 535.863666 146.318523 +L 535.946578 145.935719 +L 535.993956 145.638688 +L 536.124246 144.522196 +L 536.201236 144.65316 +L 536.295992 145.011386 +L 536.473661 146.317242 +L 536.532884 146.243609 +L 536.592107 145.981295 +L 536.923755 145.08456 +L 536.935599 145.095897 +L 536.947444 145.126429 +L 537.012589 145.057361 +L 537.036278 145.059937 +L 537.190258 144.900769 +L 537.095501 145.09965 +L 537.213947 144.97799 +L 537.462683 145.575835 +L 537.27317 144.941315 +L 537.486372 145.475928 +L 537.693652 144.527759 +L 537.711419 144.572435 +L 537.788409 144.777283 +L 537.889087 145.946653 +L 538.108212 148.453234 +L 538.137824 148.395043 +L 538.226658 148.04785 +L 538.356948 148.102087 +L 538.404326 148.318869 +L 538.552384 149.122445 +L 538.658985 148.915474 +L 539.091312 146.93124 +L 539.292669 146.842651 +L 539.304514 146.887718 +L 539.588784 148.782663 +L 539.665773 148.564471 +L 539.730919 148.625924 +L 539.778297 148.549795 +L 539.831597 148.257429 +L 539.991499 147.587525 +L 540.003344 147.620193 +L 540.027033 147.703432 +L 540.092178 147.491488 +L 540.785086 142.973438 +L 540.791008 142.987184 +L 540.879842 143.806335 +L 541.075278 144.757047 +L 541.318091 145.569425 +L 541.347703 145.547621 +L 541.489838 145.445334 +L 541.791874 143.778677 +L 541.851097 143.923762 +L 541.91032 143.824679 +L 541.963621 143.842583 +L 542.052455 143.711801 +L 542.123522 143.675091 +L 542.129445 143.636614 +L 542.159056 143.546152 +L 542.224201 143.686594 +L 542.384103 143.968411 +L 542.520316 145.280581 +L 542.757207 146.719047 +L 542.774974 146.741635 +L 542.81643 146.628495 +L 542.857886 146.673933 +L 543.319824 144.164082 +L 543.461959 143.534654 +L 543.479726 143.620432 +L 543.728462 144.980006 +L 543.835063 145.618801 +L 543.935742 145.784611 +L 543.959431 145.748077 +L 544.030499 145.72562 +L 544.048265 145.803991 +L 544.314768 146.957632 +L 544.338457 146.938831 +L 544.391758 146.761382 +L 544.563504 146.412404 +L 544.62865 146.375458 +L 544.658261 146.456778 +L 544.68195 146.509973 +L 544.717484 146.339356 +L 544.753018 146.129594 +L 544.824085 146.335047 +L 544.865541 146.218735 +L 545.179422 144.903121 +L 545.386702 143.543987 +L 545.422236 143.612594 +L 545.51107 144.537096 +L 545.759806 147.19692 +L 545.854563 147.63629 +L 545.931553 147.858337 +L 545.973009 147.656854 +L 546.239511 145.358624 +L 546.346113 145.582569 +L 546.541548 145.944066 +L 546.600771 145.827813 +L 546.802129 145.498552 +L 546.825818 145.496775 +L 546.855429 145.587612 +L 546.885041 145.733688 +L 546.932419 145.420277 +L 547.027176 144.71106 +L 547.086398 144.861943 +L 547.133777 144.940526 +L 547.181155 144.824436 +L 547.210766 144.742628 +L 547.264067 144.888771 +L 547.495036 145.743513 +L 547.500958 145.735378 +L 547.86814 144.391841 +L 547.921441 144.696874 +L 548.170177 146.324078 +L 548.223477 146.195348 +L 548.2827 145.947705 +L 548.424835 145.293653 +L 548.454447 145.299883 +L 548.48998 145.254791 +L 548.56697 145.305793 +L 548.632115 145.257914 +L 548.661727 145.347061 +L 548.857162 146.767606 +L 548.969686 147.338363 +L 549.011142 147.212823 +L 549.248033 145.330756 +L 549.47308 143.85702 +L 549.555992 143.80633 +L 549.579681 143.902645 +L 549.786961 144.693018 +L 549.81065 144.683538 +L 550.177832 145.165637 +L 549.852106 144.656223 +L 550.183754 145.145259 +L 550.574625 143.498251 +L 550.704915 143.758464 +L 550.770061 144.04399 +L 550.829283 143.848938 +L 551.006952 143.033855 +L 551.066175 142.458424 +L 551.13132 148.266603 +L 551.178698 147.718789 +L 551.326756 147.154085 +L 551.350445 147.224269 +L 551.41559 147.326631 +L 551.445201 147.167473 +L 551.652481 145.465224 +L 551.711704 145.683608 +L 552.013741 146.179245 +L 551.788694 145.630117 +L 552.025585 146.165864 +L 552.45199 144.427937 +L 552.505291 144.511076 +L 552.558591 144.675877 +L 552.700726 144.796947 +L 552.730337 144.752273 +L 552.78956 144.625974 +L 552.848783 144.717072 +L 553.4114 146.312038 +L 553.423245 146.262085 +L 553.571302 145.944291 +L 553.589069 145.93113 +L 553.624603 146.044783 +L 553.90295 147.080102 +L 553.950328 146.902664 +L 554.157608 146.21805 +L 554.204987 146.415954 +L 554.222754 146.460576 +L 554.270132 146.256989 +L 554.47149 145.756851 +L 554.60178 145.273799 +L 554.655081 145.43869 +L 554.832749 146.784521 +L 554.957117 146.520107 +L 555.241387 145.234876 +L 555.265076 145.350649 +L 555.472356 145.926407 +L 555.531579 145.711597 +L 555.58488 145.480276 +L 555.667792 145.543637 +L 555.721092 145.595706 +L 555.750704 145.481792 +L 555.79216 145.331224 +L 555.84546 145.537713 +L 555.892838 145.568092 +L 555.946139 145.496304 +L 556.165264 145.067003 +L 556.218564 145.25389 +L 556.33701 145.510134 +L 556.384388 145.410518 +L 556.396233 145.378764 +L 556.449533 145.580748 +L 556.550212 146.364695 +L 556.639047 146.875783 +L 556.698269 146.746229 +L 556.982539 146.405262 +L 556.994384 146.443851 +L 557.03584 146.52344 +L 557.083218 146.360337 +L 557.189819 146.012749 +L 557.231275 146.160567 +L 557.379332 146.800516 +L 557.432633 146.650144 +L 557.628068 145.362131 +L 557.663602 145.532268 +L 557.829426 146.416403 +L 557.859038 146.361922 +L 557.953794 146.011066 +L 558.013017 146.171017 +L 558.042628 146.249536 +L 558.107774 146.106975 +L 558.474955 145.163523 +L 558.522334 145.238899 +L 558.705925 146.175286 +L 558.753303 146.154576 +L 558.960583 146.903154 +L 559.019806 146.797443 +L 559.404754 145.777501 +L 559.422521 145.835243 +L 559.487666 145.85605 +L 559.529122 145.811411 +L 559.665335 145.629637 +L 559.819314 145.178644 +L 559.825237 145.187932 +L 559.896304 145.251418 +L 559.931838 145.16941 +L 560.239797 143.851853 +L 560.281253 144.002628 +L 560.364165 144.152014 +L 560.405621 144.051337 +L 560.48261 144.295492 +L 560.97416 146.741195 +L 561.027461 146.734888 +L 561.057072 146.676948 +L 561.104451 146.335509 +L 561.276197 145.121437 +L 561.33542 145.330813 +L 561.684835 146.020179 +L 561.744057 146.117097 +L 561.767747 146.160181 +L 561.809203 146.006671 +L 561.815125 146.011345 +L 561.844736 145.92241 +L 561.921726 145.635577 +L 561.992794 145.706595 +L 562.075706 146.061053 +L 562.24153 146.561197 +L 562.253374 146.547438 +L 562.29483 146.500159 +L 562.306675 146.454219 +L 562.365898 146.061887 +L 562.436965 146.332666 +L 562.472499 146.50412 +L 562.531722 146.279512 +L 562.804147 143.869683 +L 562.881137 144.354708 +L 563.289774 147.446862 +L 563.360842 147.444806 +L 563.378609 147.385559 +L 563.716179 146.024648 +L 563.722101 146.031241 +L 563.728023 146.037603 +L 563.74579 145.937236 +L 563.852391 145.536917 +L 563.911614 145.551625 +L 563.929381 145.518056 +L 563.97676 145.69668 +L 564.189962 146.259185 +L 564.231418 146.134687 +L 564.272874 145.997744 +L 564.332097 146.142744 +L 564.604522 147.003574 +L 564.622289 146.967899 +L 564.711123 146.404701 +L 564.80588 145.303388 +L 564.871025 145.59123 +L 564.900636 145.726344 +L 564.965781 145.531672 +L 565.048693 145.362321 +L 565.096072 145.417246 +L 565.178984 145.610041 +L 565.255973 146.023846 +L 565.309274 145.785071 +L 565.587621 145.095508 +L 565.599466 145.131256 +L 565.617233 145.159651 +L 565.670533 144.996526 +L 565.729756 144.759771 +L 565.806746 144.881103 +L 566.008104 145.408493 +L 566.037715 145.31311 +L 566.316063 144.108288 +L 566.481887 143.959001 +L 566.505576 144.070113 +L 566.600332 144.27477 +L 566.647711 144.226481 +L 566.706934 144.572097 +L 566.837224 145.249913 +L 566.872758 145.16855 +L 567.097804 144.790921 +L 567.145183 144.992099 +L 567.393919 146.233707 +L 567.411686 146.222183 +L 567.666344 145.526136 +L 567.690033 145.614808 +L 567.879546 146.120025 +L 567.974303 146.337625 +L 568.205272 147.19722 +L 568.211194 147.194081 +L 568.276339 147.38982 +L 568.388863 148.037441 +L 568.454008 147.922103 +L 568.495464 147.73772 +L 568.726433 146.12919 +L 568.886335 143.997398 +L 568.945558 144.200519 +L 569.217983 145.308312 +L 569.259439 145.187856 +L 569.318662 144.845266 +L 569.395652 144.971616 +L 569.437108 145.132114 +L 569.52002 145.057839 +L 569.555553 145.143189 +L 569.798367 146.880727 +L 569.875357 147.314499 +L 569.922735 147.038385 +L 570.360984 145.952326 +L 570.615643 145.123411 +L 570.621565 145.132222 +L 570.775544 145.878848 +L 570.834767 145.543964 +L 570.911757 145.213348 +L 570.947291 145.507107 +L 571.124959 146.20153 +L 571.154571 146.327573 +L 571.207871 146.101978 +L 571.43884 145.385562 +L 571.46253 145.445164 +L 571.492141 145.503674 +L 571.527675 145.35448 +L 571.711266 144.543706 +L 571.72311 144.577248 +L 571.794178 145.066671 +L 571.888934 144.916171 +L 572.072525 144.909522 +L 572.078447 144.925576 +L 572.21466 145.561122 +L 572.339028 146.436983 +L 572.392329 146.109284 +L 572.516697 145.788007 +L 572.534463 145.847232 +L 572.569997 145.980801 +L 572.646987 145.85219 +L 572.8365 145.165672 +L 572.895723 144.673162 +L 573.037858 144.294275 +L 573.12077 143.969469 +L 573.17407 144.243191 +L 573.203682 144.328679 +L 573.280672 144.213549 +L 573.547174 144.573954 +L 573.659698 146.035211 +L 573.772221 146.721877 +L 573.807755 146.614117 +L 573.878823 146.382564 +L 573.926201 146.565822 +L 574.198626 147.336448 +L 574.23416 147.241702 +L 574.767165 144.836305 +L 574.873767 145.179577 +L 575.075124 145.583159 +L 575.122503 145.688051 +L 575.163959 145.534437 +L 575.252793 144.931137 +L 575.424539 143.724379 +L 575.471918 143.890667 +L 575.655508 144.576137 +L 575.732498 145.310652 +L 575.856866 146.515634 +L 575.916089 146.284574 +L 576.141136 145.001054 +L 576.158903 145.066793 +L 576.608997 147.837489 +L 576.792587 148.751589 +L 576.85181 148.459256 +L 577.272293 145.418046 +L 577.325593 145.212331 +L 577.532873 144.045808 +L 577.586174 144.230033 +L 577.75792 144.648786 +L 577.823065 145.067 +L 578.208014 147.657883 +L 578.285004 147.533203 +L 578.338304 147.619991 +L 578.421216 147.938557 +L 578.486361 147.719277 +L 578.74102 146.291807 +L 578.900921 145.889409 +L 579.031212 146.33979 +L 579.214803 146.741615 +L 579.250336 146.686636 +L 579.309559 146.792706 +L 579.345093 146.795076 +L 579.368782 146.714847 +L 579.380627 146.67184 +L 579.457616 146.825481 +L 579.469461 146.826481 +L 579.49315 146.727216 +L 579.765575 144.62491 +L 579.895866 144.244104 +L 579.90771 144.254312 +L 580.215669 144.681141 +L 580.298581 145.251185 +L 580.470327 146.115892 +L 580.499939 146.034729 +L 580.600618 145.332268 +L 580.790131 144.213215 +L 580.796053 144.206151 +L 580.825665 144.330291 +L 581.157313 145.981011 +L 581.169157 145.958644 +L 581.311292 145.621777 +L 581.352748 145.632971 +L 581.441582 145.725797 +L 581.58964 146.231673 +L 581.625173 146.113384 +L 581.838376 145.298455 +L 581.891676 145.1572 +L 581.944977 145.306839 +L 582.033811 145.702175 +L 582.18779 146.156986 +L 582.205557 146.11467 +L 582.41876 145.756332 +L 582.525361 145.388044 +L 582.667496 144.876507 +L 582.67934 144.925084 +L 582.708952 144.981393 +L 582.780019 144.876492 +L 583.028755 144.093683 +L 583.087978 144.160303 +L 583.330792 144.734112 +L 583.538072 144.200257 +L 583.674284 144.327401 +L 584.183601 145.33314 +L 584.254668 145.253162 +L 584.278358 145.134866 +L 584.343503 145.308422 +L 584.580394 145.980005 +L 584.675151 146.597269 +L 584.740296 146.505949 +L 584.77583 146.512182 +L 584.811363 146.416233 +L 585.208157 145.394025 +L 585.267379 145.4879 +L 585.291069 145.500438 +L 585.338447 145.375168 +L 585.539805 144.542609 +L 585.711551 142.790675 +L 585.788541 143.022602 +L 586.001743 143.852278 +L 586.132033 144.079885 +L 586.528826 145.382832 +L 586.647272 145.084287 +L 586.759796 144.456408 +L 586.807174 144.530284 +L 587.002609 145.183035 +L 587.079599 145.013841 +L 587.209889 144.776771 +L 587.227656 144.81136 +L 587.275035 144.828433 +L 587.298724 144.728472 +L 587.624449 142.65793 +L 587.701439 142.789215 +L 587.908719 142.650259 +L 587.938331 142.808278 +L 588.021243 143.039999 +L 588.068621 142.958802 +L 588.074543 142.941459 +L 588.110077 143.176645 +L 588.423958 144.947296 +L 588.447647 144.903338 +L 588.465414 144.850155 +L 588.542404 144.951473 +L 588.58386 144.945545 +L 588.613471 144.881764 +L 588.761528 144.034341 +L 588.980653 142.751235 +L 589.051721 143.088573 +L 589.525503 146.686944 +L 589.590649 146.928527 +L 589.661716 147.139985 +L 589.69725 146.906603 +L 589.833462 145.971009 +L 589.868996 146.171219 +L 589.987442 146.75417 +L 590.022976 146.547969 +L 590.384235 144.035462 +L 590.431613 143.92369 +L 590.484914 144.080037 +L 590.555981 144.997541 +L 590.698116 146.593453 +L 590.751417 146.464422 +L 590.757339 146.459026 +L 590.792873 146.563408 +L 590.834329 146.651117 +L 590.881707 146.468337 +L 591.077143 145.901327 +L 591.083065 145.885963 +L 591.118599 146.053624 +L 591.308112 146.949502 +L 591.319956 146.926218 +L 591.385101 146.391889 +L 591.545003 145.03315 +L 591.598304 145.13897 +L 592.237911 147.147525 +L 592.33859 146.914082 +L 592.480724 147.098303 +L 592.52218 147.010589 +L 593.01373 144.351501 +L 593.055186 144.594092 +L 593.292078 145.876552 +L 593.333534 145.809715 +L 593.457902 146.210903 +L 593.688871 147.453162 +L 593.765861 147.106586 +L 594.073819 145.089948 +L 594.198187 145.50277 +L 594.46469 147.078887 +L 594.553525 146.681021 +L 594.600903 146.533354 +L 594.660126 146.70067 +L 594.67197 146.707318 +L 594.713426 146.613409 +L 594.814105 146.163316 +L 594.997696 145.40126 +L 595.027308 145.425573 +L 595.068764 145.32208 +L 595.216821 144.5698 +L 595.287888 144.87247 +L 595.364878 145.310397 +L 595.459635 145.166268 +L 595.708371 144.167158 +L 595.761671 144.378891 +L 595.963029 144.823738 +L 595.986718 144.736864 +L 596.170309 144.220522 +L 596.235454 144.017784 +L 596.288755 144.191009 +L 596.76846 146.587422 +L 596.833605 146.030134 +L 597.02904 144.97513 +L 597.040885 144.995728 +L 597.064574 145.079008 +L 597.100108 144.894977 +L 597.348844 143.26197 +L 597.372533 143.271332 +L 597.3903 143.258314 +L 597.567969 143.941985 +L 598.213498 147.078256 +L 598.266798 147.009108 +L 598.337866 146.847276 +L 598.391166 146.546549 +L 598.474078 146.605435 +L 598.568835 146.757164 +L 598.592524 146.652939 +L 598.770193 144.967058 +L 598.847182 145.271124 +L 598.894561 145.318347 +L 598.900483 145.374161 +L 599.024851 146.21203 +L 599.078152 145.935688 +L 599.303198 145.246389 +L 599.368344 145.092557 +L 599.4098 145.232408 +L 599.67038 147.19065 +L 599.741448 147.024191 +L 599.936883 146.262743 +L 600.120474 145.221452 +L 600.132319 145.230501 +L 600.339599 144.698429 +L 600.392899 144.883824 +L 600.819304 147.117792 +L 600.902216 146.648774 +L 601.06804 146.066429 +L 601.091729 146.029941 +L 601.097651 145.991112 +L 601.12134 145.879686 +L 601.186486 146.153529 +L 601.364154 146.693356 +L 601.375999 146.678863 +L 601.423377 146.577572 +L 601.565512 145.930614 +L 601.725414 145.363693 +L 601.802403 145.092453 +L 601.861626 145.29154 +L 602.021528 145.740805 +L 602.045217 145.711383 +L 602.299875 144.690826 +L 602.335409 144.797429 +L 602.489389 146.590438 +L 602.678902 148.238124 +L 602.714435 148.117706 +L 603.188218 145.440799 +L 603.21783 145.463872 +L 603.419188 147.03582 +L 603.567245 146.748036 +L 603.804136 146.074817 +L 603.910737 145.850349 +L 603.940349 145.958732 +L 604.230541 146.796642 +L 604.271997 146.654115 +L 604.372676 146.174563 +L 604.408209 146.332544 +L 604.656945 147.162172 +L 604.680635 147.064203 +L 605.00636 145.127752 +L 605.030049 145.174069 +L 605.071505 145.081181 +L 605.184029 144.55452 +L 605.249174 144.778661 +L 605.36762 145.562629 +L 605.456454 145.364157 +L 605.521599 145.208039 +L 605.586744 145.288284 +L 605.717035 146.093881 +L 605.776258 145.99789 +L 605.853247 145.747273 +L 605.906548 145.867254 +L 606.030916 145.980484 +L 606.125672 146.538627 +L 606.173051 146.226273 +L 606.232274 146.054569 +L 606.279652 146.25579 +L 606.510621 147.28593 +L 606.563922 147.328761 +L 606.605378 147.24954 +L 606.783046 146.827839 +L 606.913337 145.698032 +L 607.067316 145.131165 +L 607.073238 145.134103 +L 607.191684 145.126691 +L 607.203529 145.09477 +L 607.250907 145.043166 +L 607.292363 145.16017 +L 607.369353 145.491404 +L 607.422653 145.341184 +L 607.653622 144.652833 +L 607.677312 144.701302 +L 607.807602 144.789429 +L 607.813524 144.78459 +L 607.884592 144.483551 +L 607.943814 144.738055 +L 608.470898 146.944871 +L 608.565655 146.349298 +L 608.814391 144.406188 +L 608.867691 144.623132 +L 608.956525 144.751078 +L 609.572443 147.563096 +L 609.602055 147.459881 +L 609.981081 144.684597 +L 610.028459 144.961554 +L 610.188361 145.418059 +L 610.377874 146.264343 +L 610.460786 146.152538 +L 610.502242 145.961252 +L 610.656222 144.883507 +L 610.691755 144.95704 +L 610.839813 145.172555 +L 610.857579 145.073215 +L 611.035248 143.526436 +L 611.112238 143.852044 +L 611.159616 144.040147 +L 611.224761 143.892891 +L 611.349129 143.491948 +L 611.396507 143.744921 +L 611.74 145.743913 +L 611.745922 145.739974 +L 612.338151 144.829577 +L 612.373685 144.871914 +L 612.432908 145.007249 +L 612.480286 144.886367 +L 612.616498 144.485662 +L 612.657954 144.564533 +L 612.7231 144.769912 +L 612.782323 144.623368 +L 612.829701 144.527813 +L 612.871157 144.659889 +L 612.989603 145.168257 +L 613.042903 144.948174 +L 613.232416 144.507988 +L 613.297561 144.583921 +L 613.469308 145.094785 +L 613.47523 145.071507 +L 613.575909 144.907003 +L 613.587753 144.887637 +L 613.641054 145.021424 +L 613.718044 145.379881 +L 613.771344 145.189625 +L 613.954935 144.488719 +L 614.221438 143.440041 +L 614.268816 143.658157 +L 614.647843 145.983095 +L 614.683376 145.964951 +L 615.044636 147.094604 +L 615.074247 147.070238 +L 615.097937 147.101828 +L 615.13347 146.971789 +L 615.228227 146.557965 +L 615.281527 146.682124 +L 615.41774 146.930679 +L 615.441429 146.813968 +L 615.808611 145.319224 +L 615.855989 145.232065 +L 615.891523 145.334303 +L 615.927057 145.27467 +L 616.004046 145.355187 +L 616.098803 145.871253 +L 616.294238 146.506148 +L 616.312005 146.44001 +L 616.507441 146.049255 +L 616.732488 145.279259 +L 616.773944 145.347139 +L 616.880545 145.46092 +L 617.058213 145.871614 +L 617.099669 145.771121 +L 617.170737 145.651141 +L 617.277338 145.464591 +L 617.342483 145.514141 +L 617.407628 145.566531 +L 617.413551 145.589107 +L 617.69782 146.629734 +L 617.810344 147.219635 +L 617.863644 147.134664 +L 617.916945 147.053893 +L 617.940634 147.190682 +L 618.124225 147.716705 +L 618.130147 147.701679 +L 618.627619 145.776841 +L 618.728298 145.371378 +L 618.81121 145.608673 +L 618.929656 145.617772 +L 618.9415 145.650235 +L 619.125091 146.599696 +L 619.17247 146.390711 +L 619.569263 144.395166 +L 619.598874 144.552604 +L 620.096346 146.995867 +L 620.191103 146.924037 +L 620.244403 146.757497 +L 620.28586 146.957784 +L 620.398383 147.400172 +L 620.475373 147.286574 +L 620.617508 147.527873 +L 620.664886 147.419198 +L 620.824788 147.14162 +L 620.990612 146.446776 +L 621.191969 144.915144 +L 621.233425 145.025537 +L 621.393327 145.789896 +L 621.464395 145.397077 +L 621.606529 144.193246 +L 621.671675 144.552532 +L 621.932255 146.339918 +L 621.938177 146.337585 +L 621.9974 146.159524 +L 622.021089 146.083552 +L 622.086235 146.256985 +L 622.109924 146.305706 +L 622.186913 146.214517 +L 622.48895 144.697269 +L 622.518562 144.806217 +L 623.021956 147.568917 +L 623.063412 147.498917 +L 623.122635 147.156022 +L 623.199624 146.800939 +L 623.270692 146.856609 +L 623.377293 147.414809 +L 623.430594 147.149044 +L 623.626029 146.299764 +L 623.667485 146.40749 +L 623.80962 146.962389 +L 623.845154 146.741349 +L 624.105734 145.51145 +L 624.14719 145.346426 +L 624.401849 144.105151 +L 624.573595 143.316163 +L 624.674274 143.01663 +L 624.709808 143.153517 +L 624.940777 144.254388 +L 625.485627 146.27097 +L 625.627762 146.221625 +L 625.894265 146.862231 +L 625.947565 146.691879 +L 626.533872 143.846586 +L 626.545716 143.858591 +L 626.557561 143.880475 +L 626.622706 143.774219 +L 626.764841 143.515953 +L 626.770763 143.528584 +L 626.901054 143.698914 +L 627.090567 145.110986 +L 627.143867 144.83837 +L 627.238624 144.607317 +L 627.28008 144.679515 +L 627.303769 144.72154 +L 627.339303 144.602425 +L 627.451826 144.377661 +L 627.475515 144.452702 +L 627.670951 145.075295 +L 627.795319 144.708505 +L 627.860464 144.734028 +L 627.972987 144.905979 +L 627.996677 144.751303 +L 628.091433 144.411673 +L 628.126967 144.540385 +L 628.286869 144.878491 +L 628.346091 144.676389 +L 628.423081 144.822044 +L 628.44677 144.892998 +L 628.511915 144.757519 +L 628.606672 144.513082 +L 628.665895 144.544761 +L 628.754729 143.944746 +L 628.825797 143.660918 +L 628.873175 143.858609 +L 628.967932 144.48534 +L 629.210745 146.146186 +L 629.240357 146.12773 +L 629.264046 146.058701 +L 629.29958 145.844045 +L 629.465404 144.68264 +L 629.536471 144.748054 +L 629.554238 144.708521 +L 629.607538 144.896778 +L 630.105011 147.554208 +L 630.110933 147.545034 +L 630.134622 147.491548 +L 630.187923 147.63529 +L 630.353747 147.964837 +L 630.365591 147.936756 +L 630.80384 145.731799 +L 630.815685 145.755587 +L 631.052576 146.14674 +L 631.082188 146.097586 +L 631.105877 146.001499 +L 631.182867 145.588299 +L 631.224323 145.868103 +L 631.330924 146.375513 +L 631.384224 146.291829 +L 631.413836 146.223907 +L 631.484903 146.330297 +L 631.496748 146.34459 +L 631.555971 146.25177 +L 631.674416 145.821866 +L 631.721795 146.066866 +L 631.769173 146.180081 +L 631.816551 145.962512 +L 632.094899 144.505548 +L 632.100821 144.513499 +L 632.373246 145.343787 +L 632.491692 146.088859 +L 632.657516 146.882921 +L 632.716739 146.66257 +L 632.847029 145.796099 +L 632.912174 145.940245 +L 633.119454 147.010651 +L 633.178677 146.869788 +L 633.196444 146.793675 +L 633.273434 146.923451 +L 633.362268 147.493838 +L 633.57547 148.141378 +L 633.605082 148.238925 +L 633.65246 148.046472 +L 633.753139 147.385418 +L 633.818284 147.483489 +L 633.99003 147.194955 +L 634.416435 145.499738 +L 634.534881 144.904956 +L 634.588181 144.675179 +L 634.641482 144.914388 +L 634.76585 145.693957 +L 634.996819 146.786422 +L 635.020508 146.738645 +L 635.038275 146.696307 +L 635.091576 146.859501 +L 635.210021 147.138106 +L 635.263322 146.994317 +L 635.535747 144.396277 +L 635.606815 144.816866 +L 635.707494 145.63242 +L 635.766716 145.40029 +L 635.950307 144.64977 +L 635.968074 144.669821 +L 635.979919 144.687934 +L 636.033219 144.57085 +L 636.080598 144.527678 +L 636.122054 144.641442 +L 636.175354 144.722548 +L 636.329334 145.459444 +L 636.430012 145.288984 +L 636.530691 144.604032 +L 636.690593 143.727285 +L 636.749816 143.788114 +L 636.809039 143.690688 +L 637.099231 143.112938 +L 637.128842 143.15886 +L 637.152531 143.196596 +L 637.205832 143.062299 +L 637.324278 142.700682 +L 637.365734 142.924863 +L 637.454568 143.750172 +L 637.709226 146.252292 +L 637.792138 146.774234 +L 637.863206 146.609849 +L 637.993496 145.602804 +L 638.076408 145.196725 +L 638.117864 145.400404 +L 638.242232 146.374752 +L 638.3133 146.031593 +L 638.419901 145.652234 +L 638.461357 145.779175 +L 638.479124 145.776237 +L 638.508735 145.679445 +L 638.52058 145.665539 +L 638.57388 145.803237 +L 638.627181 145.789393 +L 638.769316 146.212877 +L 638.775238 146.20701 +L 638.804849 146.308272 +L 638.98844 146.977124 +L 638.994363 146.953405 +L 639.118731 146.528314 +L 639.183876 146.653864 +L 639.391156 147.313767 +L 639.403 147.334967 +L 639.444456 147.218491 +L 640.072219 143.506524 +L 640.113675 143.606273 +L 640.196587 144.367588 +L 640.303188 145.050717 +L 640.338722 144.824566 +L 640.676292 143.11698 +L 640.741437 143.181724 +L 640.842116 143.894217 +L 640.907261 144.254738 +L 640.966484 144.096102 +L 641.221142 143.015878 +L 641.037551 144.170754 +L 641.268521 143.152674 +L 641.357355 142.937388 +L 641.398811 143.144159 +L 641.860749 145.175374 +L 641.896283 145.101735 +L 641.955506 144.966111 +L 642.014729 145.104796 +L 642.12133 145.61085 +L 642.192397 145.941995 +L 642.25162 145.78635 +L 642.38191 145.344322 +L 642.447056 145.610265 +L 642.689869 147.421234 +L 642.719481 147.350394 +L 642.938605 146.557334 +L 643.15773 145.462064 +L 643.163652 145.479666 +L 643.376855 146.093169 +L 643.601901 147.714505 +L 643.613746 147.690898 +L 643.933549 146.034522 +L 643.939472 146.04355 +L 644.087529 146.603001 +L 644.182286 146.342538 +L 644.40141 145.46399 +L 644.484322 145.516835 +L 644.904804 144.169591 +L 644.94626 144.305564 +L 645.064706 145.299476 +L 645.200919 145.886593 +L 645.212763 145.87763 +L 645.289753 145.606601 +L 645.331209 145.871769 +L 645.633246 147.685122 +L 645.692469 147.554744 +L 646.065573 146.609764 +L 646.101106 146.45511 +L 646.438677 143.970501 +L 646.545278 144.10744 +L 647.001294 146.181725 +L 647.04275 146.10857 +L 647.072361 146.001324 +L 647.155273 146.055891 +L 647.190807 146.202051 +L 647.25003 145.98214 +L 647.356631 145.465589 +L 647.404009 145.589475 +L 647.706046 146.510062 +L 647.990316 147.530775 +L 648.037694 147.469758 +L 648.185751 147.168382 +L 648.221285 147.346682 +L 648.588467 148.993305 +L 648.606234 148.966273 +L 648.742446 148.066321 +L 649.003027 146.125682 +L 649.103706 145.675995 +L 649.151084 145.855302 +L 649.228074 145.787638 +L 649.168851 145.825053 +L 649.233996 145.778409 +L 649.24584 145.77824 +L 649.26953 145.862201 +L 649.494576 146.739352 +L 649.577489 146.356429 +L 649.642634 146.648464 +L 649.790691 147.393047 +L 649.838069 147.171655 +L 649.962437 146.189661 +L 650.063116 146.212648 +L 650.104572 146.261566 +L 650.246707 145.687318 +L 650.5902 143.70103 +L 650.702723 143.856301 +L 650.874469 144.656884 +L 651.052138 145.183312 +L 651.140972 145.55868 +L 651.366019 146.43449 +L 651.383786 146.382927 +L 651.448931 146.203145 +L 651.508154 146.333679 +L 651.514076 146.340803 +L 651.567377 146.249849 +L 651.916792 145.433057 +L 651.976015 145.440784 +L 651.987859 145.518665 +L 652.106305 146.521033 +L 652.159605 146.306386 +L 652.325429 145.73741 +L 652.331352 145.749433 +L 652.372808 145.732255 +L 652.420186 145.812725 +L 652.58601 146.060069 +L 652.633388 146.040486 +L 652.663 146.139747 +L 652.668922 146.140174 +L 652.728145 146.180918 +L 652.739989 146.212105 +L 652.858435 146.750779 +L 652.976881 147.156318 +L 653.00057 147.088501 +L 653.243384 145.197078 +L 653.33814 145.699109 +L 653.456586 146.206843 +L 653.521731 146.103245 +L 653.705322 145.983957 +L 653.77639 145.928492 +L 653.800079 146.053036 +L 653.936291 146.362495 +L 653.948136 146.34993 +L 654.060659 146.240886 +L 654.072504 146.319216 +L 654.096193 146.417095 +L 654.155416 146.112301 +L 654.374541 144.857623 +L 654.410074 144.932246 +L 654.587743 146.005252 +L 654.688422 145.597984 +L 654.777256 145.046543 +L 654.877935 145.122935 +L 654.949002 145.161968 +L 655.079293 144.929044 +L 655.120749 145.167303 +L 655.30434 145.569092 +L 655.322106 145.567247 +L 655.351718 145.649406 +L 655.48793 146.232172 +L 655.535309 146.000491 +L 655.701133 145.569725 +L 655.90249 145.132338 +L 656.038703 145.51497 +L 656.103848 145.657543 +L 656.168993 145.602947 +L 656.257828 145.732659 +L 656.352584 145.934184 +L 656.399963 145.893065 +L 656.429574 145.855528 +L 656.459185 145.962402 +L 656.796756 147.304637 +L 656.855979 147.139947 +L 656.96258 146.49646 +L 657.086948 145.756051 +L 657.128404 145.880649 +L 657.329762 147.25603 +L 657.412674 147.73746 +L 657.483741 147.675134 +L 657.513352 147.75924 +L 657.566653 147.614399 +L 657.987135 143.044092 +L 658.070047 143.261387 +L 658.372084 144.740981 +L 658.54383 145.57676 +L 658.567519 145.528434 +L 658.922857 143.612659 +L 658.999846 144.08428 +L 659.136059 144.763248 +L 659.16567 144.757084 +L 659.444018 144.062355 +L 659.461785 144.093349 +L 660.01848 147.125639 +L 660.213915 148.955138 +L 660.284982 148.507509 +L 660.527796 146.272231 +L 660.581097 146.361025 +L 660.705465 146.674674 +L 660.752843 146.470437 +L 660.942356 145.511315 +L 661.043035 145.275059 +L 661.084491 145.358064 +L 661.125947 145.47168 +L 661.173325 145.291438 +L 661.214781 145.163124 +L 661.274004 145.352588 +L 661.368761 145.75516 +L 661.439828 145.671517 +L 661.570119 145.422699 +L 661.587886 145.475245 +L 661.623419 145.651362 +L 661.700409 145.484666 +L 661.812932 145.116795 +L 661.854388 145.204572 +L 661.996523 144.883422 +L 662.020212 144.97526 +L 662.399239 146.734862 +L 662.553218 147.349472 +L 662.588752 147.176825 +L 662.665742 146.970679 +L 662.719042 147.056398 +L 662.819721 147.209305 +L 662.855255 147.130823 +L 662.938167 146.85828 +L 662.950011 146.830868 +L 662.991467 147.088795 +L 663.086224 147.618399 +L 663.133602 147.440867 +L 663.275737 147.036546 +L 663.299426 147.114362 +L 663.406027 147.520177 +L 663.447483 147.4323 +L 663.856121 145.835311 +L 664.03379 145.071329 +L 664.063401 145.166768 +L 664.335826 146.274899 +L 664.389127 146.085877 +L 664.791843 143.539431 +L 664.821454 143.686779 +L 665.016889 144.579107 +L 665.336693 145.961511 +L 665.360382 146.00049 +L 665.401838 145.764898 +L 665.472905 145.520271 +L 665.532128 145.618197 +L 665.668341 146.41928 +L 665.751253 146.124761 +L 665.922999 144.969758 +L 665.988144 145.108791 +L 666.118435 145.497832 +L 666.171735 145.373332 +L 666.225036 145.341772 +L 666.284259 145.374597 +L 666.343482 145.27611 +L 666.384938 145.20105 +L 666.414549 145.312748 +L 666.65144 146.434747 +L 666.663285 146.411458 +L 666.906099 145.95011 +L 666.912021 145.963117 +L 667.048234 146.200911 +L 667.066001 146.192673 +L 667.172602 145.764389 +L 667.231825 145.923725 +L 667.332503 146.447137 +L 667.445027 146.209406 +L 667.533861 146.155637 +L 667.486483 146.306484 +L 667.575317 146.230198 +L 667.604929 146.282964 +L 667.658229 146.161949 +L 667.758908 145.378533 +L 667.847742 145.773973 +L 668.025411 146.162662 +L 668.055022 146.081599 +L 668.078712 146.038034 +L 668.12609 146.24311 +L 668.149779 146.303586 +L 668.20308 146.143684 +L 668.374826 145.361313 +L 668.428126 145.525181 +L 668.635406 146.882231 +L 668.712396 146.591524 +L 668.925598 145.208413 +L 668.972977 145.474478 +L 669.203946 146.237817 +L 669.257247 146.203801 +L 669.505983 146.985761 +L 669.559283 146.749509 +L 669.600739 146.497932 +L 669.689573 146.56366 +L 669.855397 145.164807 +L 670.056755 144.203742 +L 670.104134 144.168321 +L 670.133745 144.271179 +L 670.643062 147.204309 +L 670.648984 147.202154 +L 670.731896 147.434591 +L 670.779274 147.682372 +L 670.844419 147.455395 +L 671.004321 145.997976 +L 671.134611 145.119584 +L 671.187912 145.235775 +L 671.253057 145.428925 +L 671.324125 145.923174 +L 671.418881 146.855101 +L 671.507715 146.650703 +L 671.549171 146.493567 +L 671.703151 146.324691 +L 671.756451 146.422632 +L 671.945965 147.693738 +L 671.987421 147.561458 +L 672.135478 147.129669 +L 672.194701 147.201213 +L 672.248001 147.376452 +L 672.419748 148.005025 +L 672.437514 147.942106 +L 672.869841 146.525993 +L 672.899453 146.634266 +L 673.059354 147.015034 +L 673.065277 147.008444 +L 673.189645 146.520027 +L 673.473915 145.105521 +L 673.574593 145.163145 +L 673.598283 145.144902 +L 673.621972 145.11493 +L 673.687117 145.202537 +L 673.728573 145.26664 +L 673.764107 145.118142 +L 673.841096 145.10526 +L 673.864785 145.161939 +L 674.012843 145.925658 +L 674.143133 146.448939 +L 674.184589 146.412386 +L 674.415558 146.547138 +L 674.427403 146.498775 +L 674.569538 145.786074 +L 674.62876 145.939029 +L 674.800507 146.364826 +L 674.83604 146.186166 +L 675.084776 145.134556 +L 675.215067 144.829223 +L 675.238756 144.88646 +L 675.440114 145.023707 +L 675.440114 145.023707 +" clip-path="url(#p50b9393a22)" style="fill: none; stroke: #d62728; stroke-width: 1.5; stroke-linecap: square"/> </g> <g id="line2d_14"> <defs> - <path id="m7825ae7bfa" d="M 0 0.25 + <path id="m261a738c53" d="M 0 0.25 C 0.066301 0.25 0.129895 0.223658 0.176777 0.176777 C 0.223658 0.129895 0.25 0.066301 0.25 0 C 0.25 -0.066301 0.223658 -0.129895 0.176777 -0.176777 @@ -6435,223 +6190,206 @@ C -0.129895 0.223658 -0.066301 0.25 0 0.25 z " style="stroke: #0000ff"/> </defs> - <g clip-path="url(#p751bab7541)"> - <use xlink:href="#m7825ae7bfa" x="177.406765" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="212.680313" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="304.697282" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="350.341531" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="379.441883" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="379.50715" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="379.572301" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="379.637463" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="379.702615" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="379.767751" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="379.832928" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="379.898172" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="379.963285" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="380.028473" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="380.09361" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="380.158768" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="380.223983" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="380.28906" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="380.354238" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="380.419502" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="380.484805" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="380.55002" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="380.615011" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="380.680227" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="380.745351" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="380.810458" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="380.875624" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="380.940756" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="381.005992" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="381.071175" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="381.136222" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="381.201446" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="381.266612" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="381.331942" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="381.397062" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="381.462173" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="381.52733" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="381.592498" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="381.657611" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="381.722805" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="381.787967" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="381.853246" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="381.918314" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="381.983495" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="382.04873" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="382.113823" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="382.179056" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="382.244482" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="382.309275" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="382.374468" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="394.252417" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="394.317815" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="394.383027" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="394.448143" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="394.513367" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="394.578503" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="394.643759" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="394.708884" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="394.77399" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="394.839081" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="394.904264" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="394.969448" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="395.034714" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="395.099887" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="395.165041" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="395.230157" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="395.295362" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="395.360585" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="395.425737" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="395.491004" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="395.556144" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="395.621224" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="395.686375" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="395.751567" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="395.816823" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="395.882052" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="395.947272" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="396.012283" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="396.077468" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="396.142583" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="396.207752" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="396.27313" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="396.338421" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="396.40326" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="396.468588" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="396.533843" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="396.598968" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="396.663895" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="396.729076" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="396.79416" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="396.859429" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="396.924708" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="396.989842" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="397.054937" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="397.119969" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="397.185214" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="409.063203" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="409.128593" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="409.193822" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="409.258956" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="409.324132" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="409.389378" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="409.454586" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="409.519812" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="409.584864" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="409.650037" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="409.714998" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="409.780187" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="409.845346" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="409.910537" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="409.975803" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="410.040926" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="410.106031" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="410.171215" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="410.236421" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="410.301509" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="410.366737" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="410.431861" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="410.49707" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="410.562214" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="410.627492" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="410.692681" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="410.757816" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="410.822872" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="410.888005" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="410.953196" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="411.018314" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="411.083571" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="411.14874" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="411.213982" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="411.279321" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="411.344484" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="411.409718" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="411.474862" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="411.53982" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="411.605017" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="411.670196" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="411.735533" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="411.800609" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="411.865651" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="411.930874" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="411.995934" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="427.640494" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="527.549026" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="527.61443" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="527.679692" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="527.745103" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="527.810115" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="527.875043" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="527.940147" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="528.005354" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="528.070623" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="528.135731" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="528.200907" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="528.26617" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="528.331501" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="528.396574" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="528.461775" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="528.527041" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="528.592008" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="528.657111" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="528.722179" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="528.787323" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="528.852515" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="528.917651" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="528.982819" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="529.048" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="529.113189" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="529.178411" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="529.24349" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="529.308756" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="529.373894" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="529.43907" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="529.504263" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="529.569425" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="529.634855" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="529.700088" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="529.76517" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="529.830152" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="529.895275" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="529.960479" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="530.025586" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="530.09064" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="530.155813" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="530.221047" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="530.286152" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="530.351409" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="530.416984" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="530.481844" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="552.772528" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> - <use xlink:href="#m7825ae7bfa" x="644.957115" y="142.324092" style="fill: #0000ff; stroke: #0000ff"/> + <g clip-path="url(#p50b9393a22)"> + <use xlink:href="#m261a738c53" x="219.196481" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="255.325618" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="282.374006" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="283.055824" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="307.489356" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="379.33181" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="379.403211" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="379.474283" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="379.545412" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="379.616425" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="379.687613" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="379.758678" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="379.829551" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="379.900597" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="379.971693" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="380.042833" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="380.113994" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="380.185154" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="380.256063" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="380.327066" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="380.398065" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="380.469345" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="380.540221" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="380.611393" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="380.68244" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="380.753594" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="380.824527" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="380.89561" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="380.966896" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="381.037801" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="381.108951" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="381.180008" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="381.250929" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="381.321928" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="381.393108" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="381.464486" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="381.535449" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="381.606509" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="381.677334" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="381.74831" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="381.819459" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="381.890506" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="381.961566" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="382.03269" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="382.10392" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="382.174979" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="382.245931" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="394.137697" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="394.209008" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="394.279961" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="394.351053" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="394.422107" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="394.493249" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="394.564266" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="394.635277" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="394.706383" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="394.777405" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="394.848427" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="394.919487" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="394.990641" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="395.061665" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="395.132788" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="395.203905" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="395.274924" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="395.34602" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="395.417074" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="395.488236" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="395.559257" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="395.630269" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="395.701267" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="395.772335" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="395.843452" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="395.914597" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="395.985785" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="396.056784" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="396.12779" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="396.198839" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="396.269939" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="396.340985" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="396.412009" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="396.483115" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="396.55432" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="396.625216" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="396.696332" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="396.767317" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="396.838357" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="396.909442" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="396.980495" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="397.051542" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="408.943484" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="409.014602" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="409.085654" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="409.156785" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="409.227883" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="409.298925" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="409.369964" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="409.4411" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="409.51202" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="409.583123" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="409.654211" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="409.725263" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="409.796299" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="409.867354" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="409.938515" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="410.009547" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="410.080743" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="410.151734" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="410.223004" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="410.293969" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="410.364914" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="410.43599" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="410.507273" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="410.578181" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="410.649169" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="410.72019" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="410.791286" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="410.862363" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="410.933465" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="411.004711" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="411.075601" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="411.146586" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="411.217684" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="411.288739" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="411.359774" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="411.430788" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="411.501971" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="411.573084" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="411.644256" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="411.715258" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="411.786373" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="411.857268" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="527.389132" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="527.460287" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="527.531383" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="527.60252" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="527.673571" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="527.744567" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="527.815581" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="527.886646" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="527.957828" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="528.028997" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="528.100085" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="528.171086" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="528.242108" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="528.313152" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="528.38421" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="528.455214" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="528.526328" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="528.597398" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="528.668464" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="528.739549" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="528.810562" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="528.88167" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="528.952748" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="529.023809" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="529.095031" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="529.165974" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="529.237042" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="529.308181" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="529.379478" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="529.450513" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="529.521429" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="529.592327" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="529.663454" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="529.73458" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="529.806038" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="529.876865" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="529.947845" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="530.018837" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="530.089923" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="530.161105" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="530.232127" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="530.303192" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> + <use xlink:href="#m261a738c53" x="551.060727" y="142.515283" style="fill: #0000ff; stroke: #0000ff"/> </g> </g> <g id="patch_3"> - <path d="M 53.60625 156.368125 + <path d="M 53.60625 156.188125 L 53.60625 22.318125 " style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> </g> <g id="patch_4"> - <path d="M 705.265 156.368125 -L 705.265 22.318125 + <path d="M 705.05125 156.188125 +L 705.05125 22.318125 " style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> </g> <g id="patch_5"> - <path d="M 53.60625 156.368125 -L 705.265 156.368125 + <path d="M 53.60625 156.188125 +L 705.05125 156.188125 " style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> </g> <g id="patch_6"> <path d="M 53.60625 22.318125 -L 705.265 22.318125 +L 705.05125 22.318125 " style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> </g> <g id="text_14"> - <!-- random_seed = 2798952158420294619 --> - <g transform="translate(257.4725 16.318125) scale(0.12 -0.12)"> + <!-- random_seed = 10194554257935593856 --> + <g transform="translate(253.548125 16.318125) scale(0.12 -0.12)"> <defs> <path id="DejaVuSans-72" d="M 2631 2963 Q 2534 3019 2420 3045 @@ -6874,6 +6612,57 @@ Q 1038 3666 1038 3163 Q 1038 2656 1286 2365 Q 1534 2075 1959 2075 z +" transform="scale(0.015625)"/> + <path id="DejaVuSans-34" d="M 2419 4116 +L 825 1625 +L 2419 1625 +L 2419 4116 +z +M 2253 4666 +L 3047 4666 +L 3047 1625 +L 3713 1625 +L 3713 1100 +L 3047 1100 +L 3047 0 +L 2419 0 +L 2419 1100 +L 313 1100 +L 313 1709 +L 2253 4666 +z +" transform="scale(0.015625)"/> + <path id="DejaVuSans-33" d="M 2597 2516 +Q 3050 2419 3304 2112 +Q 3559 1806 3559 1356 +Q 3559 666 3084 287 +Q 2609 -91 1734 -91 +Q 1441 -91 1130 -33 +Q 819 25 488 141 +L 488 750 +Q 750 597 1062 519 +Q 1375 441 1716 441 +Q 2309 441 2620 675 +Q 2931 909 2931 1356 +Q 2931 1769 2642 2001 +Q 2353 2234 1838 2234 +L 1294 2234 +L 1294 2753 +L 1863 2753 +Q 2328 2753 2575 2939 +Q 2822 3125 2822 3475 +Q 2822 3834 2567 4026 +Q 2313 4219 1838 4219 +Q 1578 4219 1281 4162 +Q 984 4106 628 3988 +L 628 4550 +Q 988 4650 1302 4700 +Q 1616 4750 1894 4750 +Q 2613 4750 3031 4423 +Q 3450 4097 3450 3541 +Q 3450 3153 3228 2886 +Q 3006 2619 2597 2516 +z " transform="scale(0.015625)"/> <path id="DejaVuSans-38" d="M 2034 2216 Q 1584 2216 1326 1975 @@ -6913,25 +6702,6 @@ Q 2441 4250 2034 4250 Q 1625 4250 1398 4047 Q 1172 3844 1172 3481 z -" transform="scale(0.015625)"/> - <path id="DejaVuSans-34" d="M 2419 4116 -L 825 1625 -L 2419 1625 -L 2419 4116 -z -M 2253 4666 -L 3047 4666 -L 3047 1625 -L 3713 1625 -L 3713 1100 -L 3047 1100 -L 3047 0 -L 2419 0 -L 2419 1100 -L 313 1100 -L 313 1709 -L 2253 4666 -z " transform="scale(0.015625)"/> <path id="DejaVuSans-36" d="M 2113 2584 Q 1688 2584 1439 2293 @@ -6978,34 +6748,35 @@ z <use xlink:href="#DejaVuSans-20" x="676.464844"/> <use xlink:href="#DejaVuSans-3d" x="708.251953"/> <use xlink:href="#DejaVuSans-20" x="792.041016"/> - <use xlink:href="#DejaVuSans-32" x="823.828125"/> - <use xlink:href="#DejaVuSans-37" x="887.451172"/> - <use xlink:href="#DejaVuSans-39" x="951.074219"/> - <use xlink:href="#DejaVuSans-38" x="1014.697266"/> - <use xlink:href="#DejaVuSans-39" x="1078.320312"/> + <use xlink:href="#DejaVuSans-31" x="823.828125"/> + <use xlink:href="#DejaVuSans-30" x="887.451172"/> + <use xlink:href="#DejaVuSans-31" x="951.074219"/> + <use xlink:href="#DejaVuSans-39" x="1014.697266"/> + <use xlink:href="#DejaVuSans-34" x="1078.320312"/> <use xlink:href="#DejaVuSans-35" x="1141.943359"/> - <use xlink:href="#DejaVuSans-32" x="1205.566406"/> - <use xlink:href="#DejaVuSans-31" x="1269.189453"/> - <use xlink:href="#DejaVuSans-35" x="1332.8125"/> - <use xlink:href="#DejaVuSans-38" x="1396.435547"/> - <use xlink:href="#DejaVuSans-34" x="1460.058594"/> - <use xlink:href="#DejaVuSans-32" x="1523.681641"/> - <use xlink:href="#DejaVuSans-30" x="1587.304688"/> - <use xlink:href="#DejaVuSans-32" x="1650.927734"/> - <use xlink:href="#DejaVuSans-39" x="1714.550781"/> - <use xlink:href="#DejaVuSans-34" x="1778.173828"/> - <use xlink:href="#DejaVuSans-36" x="1841.796875"/> - <use xlink:href="#DejaVuSans-31" x="1905.419922"/> - <use xlink:href="#DejaVuSans-39" x="1969.042969"/> + <use xlink:href="#DejaVuSans-35" x="1205.566406"/> + <use xlink:href="#DejaVuSans-34" x="1269.189453"/> + <use xlink:href="#DejaVuSans-32" x="1332.8125"/> + <use xlink:href="#DejaVuSans-35" x="1396.435547"/> + <use xlink:href="#DejaVuSans-37" x="1460.058594"/> + <use xlink:href="#DejaVuSans-39" x="1523.681641"/> + <use xlink:href="#DejaVuSans-33" x="1587.304688"/> + <use xlink:href="#DejaVuSans-35" x="1650.927734"/> + <use xlink:href="#DejaVuSans-35" x="1714.550781"/> + <use xlink:href="#DejaVuSans-39" x="1778.173828"/> + <use xlink:href="#DejaVuSans-33" x="1841.796875"/> + <use xlink:href="#DejaVuSans-38" x="1905.419922"/> + <use xlink:href="#DejaVuSans-35" x="1969.042969"/> + <use xlink:href="#DejaVuSans-36" x="2032.666016"/> </g> </g> </g> <g id="axes_2"> <g id="patch_7"> - <path d="M 53.60625 329.218125 -L 705.265 329.218125 -L 705.265 195.168125 -L 53.60625 195.168125 + <path d="M 53.60625 328.858125 +L 705.05125 328.858125 +L 705.05125 194.988125 +L 53.60625 194.988125 z " style="fill: #ffffff"/> </g> @@ -7013,12 +6784,12 @@ z <g id="xtick_10"> <g id="line2d_15"> <g> - <use xlink:href="#m1e6abe93e8" x="83.227102" y="329.218125" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m3a57de642d" x="83.217386" y="328.858125" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_15"> <!-- 0 --> - <g transform="translate(80.045852 343.816562) scale(0.1 -0.1)"> + <g transform="translate(80.036136 343.456562) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-30"/> </g> </g> @@ -7026,12 +6797,12 @@ z <g id="xtick_11"> <g id="line2d_16"> <g> - <use xlink:href="#m1e6abe93e8" x="157.280714" y="329.218125" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m3a57de642d" x="157.245968" y="328.858125" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_16"> <!-- 2500 --> - <g transform="translate(144.555714 343.816562) scale(0.1 -0.1)"> + <g transform="translate(144.520968 343.456562) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-32"/> <use xlink:href="#DejaVuSans-35" x="63.623047"/> <use xlink:href="#DejaVuSans-30" x="127.246094"/> @@ -7042,12 +6813,12 @@ z <g id="xtick_12"> <g id="line2d_17"> <g> - <use xlink:href="#m1e6abe93e8" x="231.334326" y="329.218125" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m3a57de642d" x="231.274549" y="328.858125" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_17"> <!-- 5000 --> - <g transform="translate(218.609326 343.816562) scale(0.1 -0.1)"> + <g transform="translate(218.549549 343.456562) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-35"/> <use xlink:href="#DejaVuSans-30" x="63.623047"/> <use xlink:href="#DejaVuSans-30" x="127.246094"/> @@ -7058,12 +6829,12 @@ z <g id="xtick_13"> <g id="line2d_18"> <g> - <use xlink:href="#m1e6abe93e8" x="305.387938" y="329.218125" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m3a57de642d" x="305.30313" y="328.858125" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_18"> <!-- 7500 --> - <g transform="translate(292.662938 343.816562) scale(0.1 -0.1)"> + <g transform="translate(292.57813 343.456562) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-37"/> <use xlink:href="#DejaVuSans-35" x="63.623047"/> <use xlink:href="#DejaVuSans-30" x="127.246094"/> @@ -7074,12 +6845,12 @@ z <g id="xtick_14"> <g id="line2d_19"> <g> - <use xlink:href="#m1e6abe93e8" x="379.441549" y="329.218125" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m3a57de642d" x="379.331711" y="328.858125" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_19"> <!-- 10000 --> - <g transform="translate(363.535299 343.816562) scale(0.1 -0.1)"> + <g transform="translate(363.425461 343.456562) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-31"/> <use xlink:href="#DejaVuSans-30" x="63.623047"/> <use xlink:href="#DejaVuSans-30" x="127.246094"/> @@ -7091,12 +6862,12 @@ z <g id="xtick_15"> <g id="line2d_20"> <g> - <use xlink:href="#m1e6abe93e8" x="453.495161" y="329.218125" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m3a57de642d" x="453.360292" y="328.858125" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_20"> <!-- 12500 --> - <g transform="translate(437.588911 343.816562) scale(0.1 -0.1)"> + <g transform="translate(437.454042 343.456562) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-31"/> <use xlink:href="#DejaVuSans-32" x="63.623047"/> <use xlink:href="#DejaVuSans-35" x="127.246094"/> @@ -7108,12 +6879,12 @@ z <g id="xtick_16"> <g id="line2d_21"> <g> - <use xlink:href="#m1e6abe93e8" x="527.548773" y="329.218125" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m3a57de642d" x="527.388874" y="328.858125" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_21"> <!-- 15000 --> - <g transform="translate(511.642523 343.816562) scale(0.1 -0.1)"> + <g transform="translate(511.482624 343.456562) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-31"/> <use xlink:href="#DejaVuSans-35" x="63.623047"/> <use xlink:href="#DejaVuSans-30" x="127.246094"/> @@ -7125,12 +6896,12 @@ z <g id="xtick_17"> <g id="line2d_22"> <g> - <use xlink:href="#m1e6abe93e8" x="601.602385" y="329.218125" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m3a57de642d" x="601.417455" y="328.858125" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_22"> <!-- 17500 --> - <g transform="translate(585.696135 343.816562) scale(0.1 -0.1)"> + <g transform="translate(585.511205 343.456562) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-31"/> <use xlink:href="#DejaVuSans-37" x="63.623047"/> <use xlink:href="#DejaVuSans-35" x="127.246094"/> @@ -7142,12 +6913,12 @@ z <g id="xtick_18"> <g id="line2d_23"> <g> - <use xlink:href="#m1e6abe93e8" x="675.655996" y="329.218125" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m3a57de642d" x="675.446036" y="328.858125" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_23"> <!-- 20000 --> - <g transform="translate(659.749746 343.816562) scale(0.1 -0.1)"> + <g transform="translate(659.539786 343.456562) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-32"/> <use xlink:href="#DejaVuSans-30" x="63.623047"/> <use xlink:href="#DejaVuSans-30" x="127.246094"/> @@ -7161,12 +6932,12 @@ z <g id="ytick_4"> <g id="line2d_24"> <g> - <use xlink:href="#md51da362c2" x="53.60625" y="326.427818" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m1f66c02d2f" x="53.60625" y="317.86194" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_24"> <!-- −3 --> - <g transform="translate(31.864063 330.227037) scale(0.1 -0.1)"> + <g transform="translate(31.864063 321.661159) scale(0.1 -0.1)"> <defs> <path id="DejaVuSans-2212" d="M 678 2272 L 4684 2272 @@ -7174,38 +6945,6 @@ L 4684 1741 L 678 1741 L 678 2272 z -" transform="scale(0.015625)"/> - <path id="DejaVuSans-33" d="M 2597 2516 -Q 3050 2419 3304 2112 -Q 3559 1806 3559 1356 -Q 3559 666 3084 287 -Q 2609 -91 1734 -91 -Q 1441 -91 1130 -33 -Q 819 25 488 141 -L 488 750 -Q 750 597 1062 519 -Q 1375 441 1716 441 -Q 2309 441 2620 675 -Q 2931 909 2931 1356 -Q 2931 1769 2642 2001 -Q 2353 2234 1838 2234 -L 1294 2234 -L 1294 2753 -L 1863 2753 -Q 2328 2753 2575 2939 -Q 2822 3125 2822 3475 -Q 2822 3834 2567 4026 -Q 2313 4219 1838 4219 -Q 1578 4219 1281 4162 -Q 984 4106 628 3988 -L 628 4550 -Q 988 4650 1302 4700 -Q 1616 4750 1894 4750 -Q 2613 4750 3031 4423 -Q 3450 4097 3450 3541 -Q 3450 3153 3228 2886 -Q 3006 2619 2597 2516 -z " transform="scale(0.015625)"/> </defs> <use xlink:href="#DejaVuSans-2212"/> @@ -7216,12 +6955,12 @@ z <g id="ytick_5"> <g id="line2d_25"> <g> - <use xlink:href="#md51da362c2" x="53.60625" y="284.705648" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m1f66c02d2f" x="53.60625" y="278.932335" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_25"> <!-- −2 --> - <g transform="translate(31.864063 288.504867) scale(0.1 -0.1)"> + <g transform="translate(31.864063 282.731554) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-2212"/> <use xlink:href="#DejaVuSans-32" x="83.789062"/> </g> @@ -7230,12 +6969,12 @@ z <g id="ytick_6"> <g id="line2d_26"> <g> - <use xlink:href="#md51da362c2" x="53.60625" y="242.983477" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m1f66c02d2f" x="53.60625" y="240.00273" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_26"> <!-- −1 --> - <g transform="translate(31.864063 246.782696) scale(0.1 -0.1)"> + <g transform="translate(31.864063 243.801949) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-2212"/> <use xlink:href="#DejaVuSans-31" x="83.789062"/> </g> @@ -7244,19 +6983,19 @@ z <g id="ytick_7"> <g id="line2d_27"> <g> - <use xlink:href="#md51da362c2" x="53.60625" y="201.261307" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m1f66c02d2f" x="53.60625" y="201.073125" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_27"> <!-- 0 --> - <g transform="translate(40.24375 205.060526) scale(0.1 -0.1)"> + <g transform="translate(40.24375 204.872344) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-30"/> </g> </g> </g> <g id="text_28"> <!-- I_tot (nA) --> - <g transform="translate(25.50625 285.2275) rotate(-90) scale(0.1 -0.1)"> + <g transform="translate(25.50625 284.9575) rotate(-90) scale(0.1 -0.1)"> <defs> <path id="DejaVuSans-49" d="M 628 4666 L 1259 4666 @@ -7317,7 +7056,7 @@ z </g> <g id="text_29"> <!-- 1e12 --> - <g transform="translate(53.60625 192.168125) scale(0.1 -0.1)"> + <g transform="translate(53.60625 191.988125) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-31"/> <use xlink:href="#DejaVuSans-65" x="63.623047"/> <use xlink:href="#DejaVuSans-31" x="125.146484"/> @@ -7326,335 +7065,308 @@ z </g> </g> <g id="line2d_28"> - <path d="M 83.227102 201.261307 -L 177.405524 201.261307 -L 177.411448 207.580095 -L 177.512161 201.261307 -L 212.67874 201.261307 -L 212.684664 207.548968 -L 212.785377 201.261307 -L 304.694796 201.261307 -L 304.70072 207.546004 -L 304.801433 201.261307 -L 350.341442 201.261307 -L 350.347366 207.548671 -L 350.448079 201.261307 -L 379.441549 201.261307 -L 379.447474 288.581849 -L 379.548186 201.261307 -L 379.571884 201.261307 -L 379.642975 291.191637 -L 379.678521 201.261307 -L 379.702218 201.261307 -L 379.773309 302.741885 -L 379.808855 201.261307 -L 379.832552 201.261307 -L 379.838477 299.930247 -L 379.93919 201.261307 -L 379.962887 201.261307 -L 379.968811 294.431843 -L 380.069524 201.261307 -L 380.093221 201.261307 -L 380.164313 298.84037 -L 380.199858 201.261307 -L 380.223555 201.261307 -L 380.294647 311.021469 -L 380.330193 201.261307 -L 380.35389 201.261307 -L 380.359814 307.80745 -L 380.460527 201.261307 -L 380.484224 201.261307 -L 380.490148 265.138907 -L 380.590861 201.261307 -L 380.614558 201.261307 -L 380.620483 283.194914 -L 380.721196 201.261307 -L 380.744893 201.261307 -L 380.815984 294.372386 -L 380.85153 201.261307 -L 380.875227 201.261307 -L 380.946319 303.66339 -L 380.981864 201.261307 -L 381.005562 201.261307 -L 381.011486 287.417204 -L 381.112199 201.261307 -L 381.135896 201.261307 -L 381.14182 314.931723 -L 381.242533 201.261307 -L 381.26623 201.261307 -L 381.272155 298.45554 -L 381.372867 201.261307 -L 381.396565 201.261307 -L 381.467656 285.31178 -L 381.503202 201.261307 -L 381.526899 201.261307 -L 381.532823 287.329257 -L 381.633536 201.261307 -L 381.657233 201.261307 -L 381.663158 299.53683 -L 381.763871 201.261307 -L 381.787568 201.261307 -L 381.793492 294.012353 -L 381.894205 201.261307 -L 381.917902 201.261307 -L 381.923826 291.165877 -L 382.024539 201.261307 -L 382.048236 201.261307 -L 382.119328 289.599891 -L 382.154874 201.261307 -L 382.178571 201.261307 -L 382.184495 277.643739 -L 382.285208 201.261307 -L 382.308905 201.261307 -L 382.314829 301.574821 -L 382.415542 201.261307 -L 394.252272 201.261307 -L 394.323363 299.709369 -L 394.358909 201.261307 -L 394.382606 201.261307 -L 394.453697 301.573438 -L 394.489243 201.261307 -L 394.51294 201.261307 -L 394.584032 295.130226 -L 394.619578 201.261307 -L 394.643275 201.261307 -L 394.714366 285.067085 -L 394.749912 201.261307 -L 394.773609 201.261307 -L 394.844701 323.016366 -L 394.880246 201.261307 -L 394.903943 201.261307 -L 394.909868 316.88009 -L 395.010581 201.261307 -L 395.034278 201.261307 -L 395.040202 286.280876 -L 395.140915 201.261307 -L 395.164612 201.261307 -L 395.235704 299.357722 -L 395.271249 201.261307 -L 395.294946 201.261307 -L 395.300871 290.512803 -L 395.401584 201.261307 -L 395.425281 201.261307 -L 395.431205 282.505256 -L 395.531918 201.261307 -L 395.555615 201.261307 -L 395.626707 285.239663 -L 395.662252 201.261307 -L 395.68595 201.261307 -L 395.691874 288.511104 -L 395.792587 201.261307 -L 395.816284 201.261307 -L 395.822208 270.011975 -L 395.922921 201.261307 -L 395.946618 201.261307 -L 396.01771 275.807712 -L 396.053255 201.261307 -L 396.076953 201.261307 -L 396.148044 281.373712 -L 396.18359 201.261307 -L 396.207287 201.261307 -L 396.213211 281.058955 -L 396.313924 201.261307 -L 396.337621 201.261307 -L 396.408713 279.833283 -L 396.444259 201.261307 -L 396.467956 201.261307 -L 396.47388 259.88521 -L 396.574593 201.261307 -L 396.59829 201.261307 -L 396.669382 285.900248 -L 396.704927 201.261307 -L 396.728624 201.261307 -L 396.799716 301.980714 -L 396.835262 201.261307 -L 396.858959 201.261307 -L 396.864883 280.057257 -L 396.965596 201.261307 -L 396.989293 201.261307 -L 397.060385 278.976786 -L 397.09593 201.261307 -L 397.119627 201.261307 -L 397.125552 309.920647 -L 397.226265 201.261307 -L 409.062994 201.261307 -L 409.068918 290.372387 -L 409.169631 201.261307 -L 409.193328 201.261307 -L 409.26442 281.794634 -L 409.299966 201.261307 -L 409.323663 201.261307 -L 409.329587 280.334429 -L 409.4303 201.261307 -L 409.453997 201.261307 -L 409.459921 264.248057 -L 409.560634 201.261307 -L 409.584331 201.261307 -L 409.590256 270.820862 -L 409.690969 201.261307 -L 409.714666 201.261307 -L 409.72059 312.708134 -L 409.821303 201.261307 -L 409.845 201.261307 -L 409.850924 308.582681 -L 409.951637 201.261307 -L 409.975334 201.261307 -L 410.046426 288.592074 -L 410.081972 201.261307 -L 410.105669 201.261307 -L 410.111593 303.506522 -L 410.212306 201.261307 -L 410.236003 201.261307 -L 410.307095 310.766311 -L 410.34264 201.261307 -L 410.366338 201.261307 -L 410.437429 305.389566 -L 410.472975 201.261307 -L 410.496672 201.261307 -L 410.567763 300.226545 -L 410.603309 201.261307 -L 410.627006 201.261307 -L 410.632931 277.66399 -L 410.733643 201.261307 -L 410.757341 201.261307 -L 410.828432 303.101756 -L 410.863978 201.261307 -L 410.887675 201.261307 -L 410.893599 313.694081 -L 410.994312 201.261307 -L 411.018009 201.261307 -L 411.023934 323.124943 -L 411.124647 201.261307 -L 411.148344 201.261307 -L 411.154268 294.806582 -L 411.254981 201.261307 -L 411.278678 201.261307 -L 411.34977 259.337401 -L 411.385315 201.261307 -L 411.409012 201.261307 -L 411.480104 255.560576 -L 411.51565 201.261307 -L 411.539347 201.261307 -L 411.545271 279.674313 -L 411.645984 201.261307 -L 411.669681 201.261307 -L 411.675605 273.302484 -L 411.776318 201.261307 -L 411.800015 201.261307 -L 411.871107 280.343922 -L 411.906653 201.261307 -L 411.93035 201.261307 -L 412.001441 290.205905 -L 412.036987 201.261307 -L 427.63564 201.261307 -L 427.641564 207.5309 -L 427.742277 201.261307 -L 527.548773 201.261307 -L 527.554697 289.734589 -L 527.65541 201.261307 -L 527.679107 201.261307 -L 527.685031 264.613254 -L 527.785744 201.261307 -L 527.809442 201.261307 -L 527.880533 286.53441 -L 527.916079 201.261307 -L 527.939776 201.261307 -L 527.9457 301.268197 -L 528.046413 201.261307 -L 528.07011 201.261307 -L 528.141202 283.079925 -L 528.176747 201.261307 -L 528.200445 201.261307 -L 528.206369 281.507525 -L 528.307082 201.261307 -L 528.330779 201.261307 -L 528.40187 260.300404 -L 528.437416 201.261307 -L 528.461113 201.261307 -L 528.467038 257.265965 -L 528.56775 201.261307 -L 528.591448 201.261307 -L 528.662539 276.004079 -L 528.698085 201.261307 -L 528.721782 201.261307 -L 528.792873 300.426114 -L 528.828419 201.261307 -L 528.852116 201.261307 -L 528.923208 302.03236 -L 528.958754 201.261307 -L 528.982451 201.261307 -L 528.988375 301.958736 -L 529.089088 201.261307 -L 529.112785 201.261307 -L 529.118709 293.111596 -L 529.219422 201.261307 -L 529.243119 201.261307 -L 529.249044 301.372802 -L 529.349757 201.261307 -L 529.373454 201.261307 -L 529.379378 285.450346 -L 529.480091 201.261307 -L 529.503788 201.261307 -L 529.57488 280.229858 -L 529.610425 201.261307 -L 529.634123 201.261307 -L 529.640047 251.902993 -L 529.74076 201.261307 -L 529.764457 201.261307 -L 529.835548 271.534196 -L 529.871094 201.261307 -L 529.894791 201.261307 -L 529.900716 277.861338 -L 530.001428 201.261307 -L 530.025126 201.261307 -L 530.096217 308.150407 -L 530.131763 201.261307 -L 530.15546 201.261307 -L 530.161384 306.181639 -L 530.262097 201.261307 -L 530.285794 201.261307 -L 530.291719 304.812237 -L 530.392431 201.261307 -L 530.416129 201.261307 -L 530.48722 268.867472 -L 530.522766 201.261307 -L 552.768471 201.261307 -L 552.774395 207.532453 -L 552.875108 201.261307 -L 644.956331 201.261307 -L 644.962255 207.57084 -L 645.062968 201.261307 -L 675.644148 201.261307 -L 675.644148 201.261307 -" clip-path="url(#pf10296019e)" style="fill: none; stroke: #ff7f0e; stroke-width: 1.5; stroke-linecap: square"/> + <path d="M 83.217386 201.073125 +L 219.193084 201.073125 +L 219.199007 206.929116 +L 219.299685 201.073125 +L 255.324954 201.073125 +L 255.330876 206.931225 +L 255.431555 201.073125 +L 282.372037 201.073125 +L 282.377959 206.932602 +L 282.478638 201.073125 +L 283.0531 201.073125 +L 283.059022 206.952847 +L 283.159701 201.073125 +L 307.488454 201.073125 +L 307.494376 206.931609 +L 307.595055 201.073125 +L 379.331711 201.073125 +L 379.337633 285.689044 +L 379.438312 201.073125 +L 379.473846 201.073125 +L 379.479768 280.226278 +L 379.580447 201.073125 +L 379.615981 201.073125 +L 379.621903 278.911885 +L 379.722582 201.073125 +L 379.758116 201.073125 +L 379.835105 295.096658 +L 379.864717 201.073125 +L 379.900251 201.073125 +L 379.906173 300.860108 +L 380.006852 201.073125 +L 380.042386 201.073125 +L 380.048308 278.322606 +L 380.148987 201.073125 +L 380.18452 201.073125 +L 380.26151 273.792893 +L 380.291122 201.073125 +L 380.326655 201.073125 +L 380.403645 302.07685 +L 380.433256 201.073125 +L 380.46879 201.073125 +L 380.54578 296.105903 +L 380.575391 201.073125 +L 380.610925 201.073125 +L 380.687915 278.409793 +L 380.717526 201.073125 +L 380.75306 201.073125 +L 380.83005 287.674449 +L 380.859661 201.073125 +L 380.895195 201.073125 +L 380.901117 284.420957 +L 381.001796 201.073125 +L 381.03733 201.073125 +L 381.043252 274.398152 +L 381.143931 201.073125 +L 381.179465 201.073125 +L 381.256454 288.107468 +L 381.286066 201.073125 +L 381.321599 201.073125 +L 381.327522 306.348195 +L 381.428201 201.073125 +L 381.463734 201.073125 +L 381.540724 254.483769 +L 381.570335 201.073125 +L 381.605869 201.073125 +L 381.682859 288.192054 +L 381.71247 201.073125 +L 381.748004 201.073125 +L 381.753926 314.240932 +L 381.854605 201.073125 +L 381.890139 201.073125 +L 381.967129 297.221317 +L 381.99674 201.073125 +L 382.032274 201.073125 +L 382.038196 284.148638 +L 382.138875 201.073125 +L 382.174409 201.073125 +L 382.251398 277.119967 +L 382.28101 201.073125 +L 394.137427 201.073125 +L 394.14335 283.40666 +L 394.244029 201.073125 +L 394.279562 201.073125 +L 394.285485 287.847482 +L 394.386163 201.073125 +L 394.421697 201.073125 +L 394.427619 285.521237 +L 394.528298 201.073125 +L 394.563832 201.073125 +L 394.640822 292.586716 +L 394.670433 201.073125 +L 394.705967 201.073125 +L 394.782957 294.3061 +L 394.812568 201.073125 +L 394.848102 201.073125 +L 394.925091 309.897027 +L 394.954703 201.073125 +L 394.990237 201.073125 +L 395.067226 296.916829 +L 395.096838 201.073125 +L 395.132372 201.073125 +L 395.138294 284.08307 +L 395.238973 201.073125 +L 395.274506 201.073125 +L 395.280429 283.792156 +L 395.381108 201.073125 +L 395.416641 201.073125 +L 395.422564 281.001346 +L 395.523242 201.073125 +L 395.558776 201.073125 +L 395.635766 282.302211 +L 395.665377 201.073125 +L 395.700911 201.073125 +L 395.706833 298.101803 +L 395.807512 201.073125 +L 395.843046 201.073125 +L 395.848968 286.299158 +L 395.949647 201.073125 +L 395.985181 201.073125 +L 396.06217 265.620151 +L 396.091782 201.073125 +L 396.127316 201.073125 +L 396.204305 276.878074 +L 396.233917 201.073125 +L 396.269451 201.073125 +L 396.34644 275.048751 +L 396.376052 201.073125 +L 396.411585 201.073125 +L 396.417508 282.783192 +L 396.518187 201.073125 +L 396.55372 201.073125 +L 396.63071 281.739539 +L 396.660321 201.073125 +L 396.695855 201.073125 +L 396.772845 288.682261 +L 396.802456 201.073125 +L 396.83799 201.073125 +L 396.843912 295.19273 +L 396.944591 201.073125 +L 396.980125 201.073125 +L 397.057115 300.058301 +L 397.086726 201.073125 +L 408.943144 201.073125 +L 409.020133 289.441411 +L 409.049745 201.073125 +L 409.085278 201.073125 +L 409.091201 293.258148 +L 409.19188 201.073125 +L 409.227413 201.073125 +L 409.304403 278.997285 +L 409.334015 201.073125 +L 409.369548 201.073125 +L 409.375471 284.214193 +L 409.476149 201.073125 +L 409.511683 201.073125 +L 409.517605 303.790089 +L 409.618284 201.073125 +L 409.653818 201.073125 +L 409.730808 292.575205 +L 409.760419 201.073125 +L 409.795953 201.073125 +L 409.872943 304.669377 +L 409.902554 201.073125 +L 409.938088 201.073125 +L 410.015077 289.437972 +L 410.044689 201.073125 +L 410.080223 201.073125 +L 410.157212 279.049257 +L 410.186824 201.073125 +L 410.222358 201.073125 +L 410.299347 264.633377 +L 410.328959 201.073125 +L 410.364492 201.073125 +L 410.370415 283.145289 +L 410.471094 201.073125 +L 410.506627 201.073125 +L 410.583617 272.159244 +L 410.613228 201.073125 +L 410.648762 201.073125 +L 410.725752 297.046758 +L 410.755363 201.073125 +L 410.790897 201.073125 +L 410.796819 289.912477 +L 410.897498 201.073125 +L 410.933032 201.073125 +L 410.938954 280.927093 +L 411.039633 201.073125 +L 411.075167 201.073125 +L 411.152156 299.343769 +L 411.181768 201.073125 +L 411.217302 201.073125 +L 411.294291 294.492754 +L 411.323903 201.073125 +L 411.359437 201.073125 +L 411.436426 322.773125 +L 411.466038 201.073125 +L 411.501571 201.073125 +L 411.507494 287.702287 +L 411.608173 201.073125 +L 411.643706 201.073125 +L 411.720696 272.51647 +L 411.750307 201.073125 +L 411.785841 201.073125 +L 411.862831 297.250922 +L 411.892442 201.073125 +L 527.388874 201.073125 +L 527.465863 301.02033 +L 527.495475 201.073125 +L 527.531008 201.073125 +L 527.536931 293.322595 +L 527.63761 201.073125 +L 527.673143 201.073125 +L 527.750133 298.236789 +L 527.779744 201.073125 +L 527.815278 201.073125 +L 527.892268 316.172779 +L 527.921879 201.073125 +L 527.957413 201.073125 +L 527.963335 284.417292 +L 528.064014 201.073125 +L 528.099548 201.073125 +L 528.176538 274.502393 +L 528.206149 201.073125 +L 528.241683 201.073125 +L 528.318673 287.219947 +L 528.348284 201.073125 +L 528.383818 201.073125 +L 528.460807 306.333146 +L 528.490419 201.073125 +L 528.525953 201.073125 +L 528.531875 293.249554 +L 528.632554 201.073125 +L 528.668087 201.073125 +L 528.67401 292.871733 +L 528.774689 201.073125 +L 528.810222 201.073125 +L 528.816145 302.986287 +L 528.916823 201.073125 +L 528.952357 201.073125 +L 529.029347 291.051666 +L 529.058958 201.073125 +L 529.094492 201.073125 +L 529.171482 284.454172 +L 529.201093 201.073125 +L 529.236627 201.073125 +L 529.242549 284.407776 +L 529.343228 201.073125 +L 529.378762 201.073125 +L 529.455752 251.625056 +L 529.485363 201.073125 +L 529.520897 201.073125 +L 529.597886 296.291201 +L 529.627498 201.073125 +L 529.663032 201.073125 +L 529.668954 283.001527 +L 529.769633 201.073125 +L 529.805166 201.073125 +L 529.882156 255.902341 +L 529.911768 201.073125 +L 529.947301 201.073125 +L 530.024291 274.877418 +L 530.053902 201.073125 +L 530.089436 201.073125 +L 530.095358 272.07277 +L 530.196037 201.073125 +L 530.231571 201.073125 +L 530.308561 263.565704 +L 530.338172 201.073125 +L 551.060253 201.073125 +L 551.066175 206.970296 +L 551.166854 201.073125 +L 675.440114 201.073125 +L 675.440114 201.073125 +" clip-path="url(#p306958ab09)" style="fill: none; stroke: #ff7f0e; stroke-width: 1.5; stroke-linecap: square"/> </g> <g id="patch_8"> - <path d="M 53.60625 329.218125 -L 53.60625 195.168125 + <path d="M 53.60625 328.858125 +L 53.60625 194.988125 " style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> </g> <g id="patch_9"> - <path d="M 705.265 329.218125 -L 705.265 195.168125 + <path d="M 705.05125 328.858125 +L 705.05125 194.988125 " style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> </g> <g id="patch_10"> - <path d="M 53.60625 329.218125 -L 705.265 329.218125 + <path d="M 53.60625 328.858125 +L 705.05125 328.858125 " style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> </g> <g id="patch_11"> - <path d="M 53.60625 195.168125 -L 705.265 195.168125 + <path d="M 53.60625 194.988125 +L 705.05125 194.988125 " style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> </g> </g> <g id="axes_3"> <g id="patch_12"> - <path d="M 53.60625 502.068125 -L 705.265 502.068125 -L 705.265 368.018125 -L 53.60625 368.018125 + <path d="M 53.60625 501.528125 +L 705.05125 501.528125 +L 705.05125 367.658125 +L 53.60625 367.658125 z " style="fill: #ffffff"/> </g> @@ -7662,12 +7374,12 @@ z <g id="xtick_19"> <g id="line2d_29"> <g> - <use xlink:href="#m1e6abe93e8" x="83.227102" y="502.068125" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m3a57de642d" x="83.217386" y="501.528125" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_30"> <!-- 0 --> - <g transform="translate(80.045852 516.666562) scale(0.1 -0.1)"> + <g transform="translate(80.036136 516.126562) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-30"/> </g> </g> @@ -7675,12 +7387,12 @@ z <g id="xtick_20"> <g id="line2d_30"> <g> - <use xlink:href="#m1e6abe93e8" x="157.280714" y="502.068125" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m3a57de642d" x="157.245968" y="501.528125" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_31"> <!-- 2500 --> - <g transform="translate(144.555714 516.666562) scale(0.1 -0.1)"> + <g transform="translate(144.520968 516.126562) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-32"/> <use xlink:href="#DejaVuSans-35" x="63.623047"/> <use xlink:href="#DejaVuSans-30" x="127.246094"/> @@ -7691,12 +7403,12 @@ z <g id="xtick_21"> <g id="line2d_31"> <g> - <use xlink:href="#m1e6abe93e8" x="231.334326" y="502.068125" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m3a57de642d" x="231.274549" y="501.528125" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_32"> <!-- 5000 --> - <g transform="translate(218.609326 516.666562) scale(0.1 -0.1)"> + <g transform="translate(218.549549 516.126562) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-35"/> <use xlink:href="#DejaVuSans-30" x="63.623047"/> <use xlink:href="#DejaVuSans-30" x="127.246094"/> @@ -7707,12 +7419,12 @@ z <g id="xtick_22"> <g id="line2d_32"> <g> - <use xlink:href="#m1e6abe93e8" x="305.387938" y="502.068125" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m3a57de642d" x="305.30313" y="501.528125" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_33"> <!-- 7500 --> - <g transform="translate(292.662938 516.666562) scale(0.1 -0.1)"> + <g transform="translate(292.57813 516.126562) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-37"/> <use xlink:href="#DejaVuSans-35" x="63.623047"/> <use xlink:href="#DejaVuSans-30" x="127.246094"/> @@ -7723,12 +7435,12 @@ z <g id="xtick_23"> <g id="line2d_33"> <g> - <use xlink:href="#m1e6abe93e8" x="379.441549" y="502.068125" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m3a57de642d" x="379.331711" y="501.528125" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_34"> <!-- 10000 --> - <g transform="translate(363.535299 516.666562) scale(0.1 -0.1)"> + <g transform="translate(363.425461 516.126562) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-31"/> <use xlink:href="#DejaVuSans-30" x="63.623047"/> <use xlink:href="#DejaVuSans-30" x="127.246094"/> @@ -7740,12 +7452,12 @@ z <g id="xtick_24"> <g id="line2d_34"> <g> - <use xlink:href="#m1e6abe93e8" x="453.495161" y="502.068125" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m3a57de642d" x="453.360292" y="501.528125" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_35"> <!-- 12500 --> - <g transform="translate(437.588911 516.666562) scale(0.1 -0.1)"> + <g transform="translate(437.454042 516.126562) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-31"/> <use xlink:href="#DejaVuSans-32" x="63.623047"/> <use xlink:href="#DejaVuSans-35" x="127.246094"/> @@ -7757,12 +7469,12 @@ z <g id="xtick_25"> <g id="line2d_35"> <g> - <use xlink:href="#m1e6abe93e8" x="527.548773" y="502.068125" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m3a57de642d" x="527.388874" y="501.528125" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_36"> <!-- 15000 --> - <g transform="translate(511.642523 516.666562) scale(0.1 -0.1)"> + <g transform="translate(511.482624 516.126562) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-31"/> <use xlink:href="#DejaVuSans-35" x="63.623047"/> <use xlink:href="#DejaVuSans-30" x="127.246094"/> @@ -7774,12 +7486,12 @@ z <g id="xtick_26"> <g id="line2d_36"> <g> - <use xlink:href="#m1e6abe93e8" x="601.602385" y="502.068125" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m3a57de642d" x="601.417455" y="501.528125" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_37"> <!-- 17500 --> - <g transform="translate(585.696135 516.666562) scale(0.1 -0.1)"> + <g transform="translate(585.511205 516.126562) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-31"/> <use xlink:href="#DejaVuSans-37" x="63.623047"/> <use xlink:href="#DejaVuSans-35" x="127.246094"/> @@ -7791,12 +7503,12 @@ z <g id="xtick_27"> <g id="line2d_37"> <g> - <use xlink:href="#m1e6abe93e8" x="675.655996" y="502.068125" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m3a57de642d" x="675.446036" y="501.528125" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_38"> <!-- 20000 --> - <g transform="translate(659.749746 516.666562) scale(0.1 -0.1)"> + <g transform="translate(659.539786 516.126562) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-32"/> <use xlink:href="#DejaVuSans-30" x="63.623047"/> <use xlink:href="#DejaVuSans-30" x="127.246094"/> @@ -7810,12 +7522,12 @@ z <g id="ytick_8"> <g id="line2d_38"> <g> - <use xlink:href="#md51da362c2" x="53.60625" y="495.974943" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m1f66c02d2f" x="53.60625" y="495.443125" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_39"> <!-- 0 --> - <g transform="translate(40.24375 499.774162) scale(0.1 -0.1)"> + <g transform="translate(40.24375 499.242344) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-30"/> </g> </g> @@ -7823,12 +7535,12 @@ z <g id="ytick_9"> <g id="line2d_39"> <g> - <use xlink:href="#md51da362c2" x="53.60625" y="457.186923" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m1f66c02d2f" x="53.60625" y="460.189256" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_40"> <!-- 500 --> - <g transform="translate(27.51875 460.986142) scale(0.1 -0.1)"> + <g transform="translate(27.51875 463.988475) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-35"/> <use xlink:href="#DejaVuSans-30" x="63.623047"/> <use xlink:href="#DejaVuSans-30" x="127.246094"/> @@ -7838,12 +7550,12 @@ z <g id="ytick_10"> <g id="line2d_40"> <g> - <use xlink:href="#md51da362c2" x="53.60625" y="418.398903" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m1f66c02d2f" x="53.60625" y="424.935387" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_41"> <!-- 1000 --> - <g transform="translate(21.15625 422.198122) scale(0.1 -0.1)"> + <g transform="translate(21.15625 428.734606) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-31"/> <use xlink:href="#DejaVuSans-30" x="63.623047"/> <use xlink:href="#DejaVuSans-30" x="127.246094"/> @@ -7854,12 +7566,12 @@ z <g id="ytick_11"> <g id="line2d_41"> <g> - <use xlink:href="#md51da362c2" x="53.60625" y="379.610883" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m1f66c02d2f" x="53.60625" y="389.681518" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_42"> <!-- 1500 --> - <g transform="translate(21.15625 383.410102) scale(0.1 -0.1)"> + <g transform="translate(21.15625 393.480737) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-31"/> <use xlink:href="#DejaVuSans-35" x="63.623047"/> <use xlink:href="#DejaVuSans-30" x="127.246094"/> @@ -7869,7 +7581,7 @@ z </g> <g id="text_43"> <!-- I_stim (nA) --> - <g transform="translate(14.798437 461.922031) rotate(-90) scale(0.1 -0.1)"> + <g transform="translate(14.798437 461.472031) rotate(-90) scale(0.1 -0.1)"> <defs> <path id="DejaVuSans-69" d="M 603 3500 L 1178 3500 @@ -7900,304 +7612,332 @@ z </g> </g> <g id="line2d_42"> - <path d="M 83.227102 495.974943 -L 379.429701 495.974943 -L 379.512641 407.011088 -L 379.548186 424.615896 -L 379.554111 428.361139 -L 379.619278 400.751223 -L 379.637051 410.702833 -L 379.731839 415.936143 -L 379.678521 395.115683 -L 379.737764 408.61183 -L 379.826628 396.216683 -L 379.802931 410.018666 -L 379.838477 407.430984 -L 379.921417 432.426923 -L 379.951038 422.381805 -L 380.045827 397.496764 -L 380.0636 405.492814 -L 380.140615 415.475631 -L 380.164313 402.647986 -L 380.170237 399.426748 -L 380.235404 421.382572 -L 380.241328 425.490391 -L 380.288723 391.980998 -L 380.318344 402.260583 -L 380.347965 392.781544 -L 380.407208 412.259626 -L 380.4783 450.250523 -L 380.555316 442.785282 -L 380.632331 413.375533 -L 380.679726 425.915845 -L 380.68565 432.588756 -L 380.76859 413.055835 -L 380.780439 421.386946 -L 380.922622 394.6326 -L 380.964092 403.316174 -L 381.01741 418.950705 -L 381.05888 398.383042 -L 381.076653 410.041338 -L 381.159593 384.861363 -L 381.206987 401.814413 -L 381.337322 431.54841 -L 381.260306 399.638919 -L 381.34917 427.260329 -L 381.455808 411.623838 -L 381.426186 431.29488 -L 381.461732 416.32852 -L 381.568369 431.413904 -L 381.532823 407.952043 -L 381.574293 423.864395 -L 381.686855 389.537044 -L 381.698703 402.372801 -L 381.757946 423.643933 -L 381.811265 411.789732 -L 381.911978 404.984874 -L 381.864583 431.72268 -L 381.917902 410.798362 -L 381.994918 431.922841 -L 381.935675 407.669073 -L 382.071934 426.945218 -L 382.119328 411.633079 -L 382.178571 423.594037 -L 382.237814 451.187799 -L 382.285208 429.112069 -L 382.308905 400.848061 -L 382.391845 407.115448 -L 382.510331 495.974943 -L 394.240423 495.974943 -L 394.317439 402.70946 -L 394.358909 426.244318 -L 394.43 390.883231 -L 394.477395 412.638606 -L 394.578108 407.003039 -L 394.501092 430.260827 -L 394.584032 412.324447 -L 394.631426 420.234102 -L 394.666972 441.980573 -L 394.726215 411.972944 -L 394.738063 425.377955 -L 394.880246 374.111307 -L 394.886171 380.590759 -L 395.004656 414.807074 -L 395.022429 406.671952 -L 395.028353 405.691866 -L 395.069824 415.948483 -L 395.081672 409.967099 -L 395.129066 424.595392 -L 395.182385 402.662257 -L 395.194234 415.139003 -L 395.217931 401.581727 -L 395.277174 423.616676 -L 395.312719 405.626431 -L 395.318644 403.838305 -L 395.360114 421.347175 -L 395.366038 421.097929 -L 395.478599 435.198905 -L 395.454902 415.339337 -L 395.490448 432.845888 -L 395.514145 436.993416 -L 395.567464 425.247866 -L 395.674101 407.847367 -L 395.68595 413.244548 -L 395.762965 411.163554 -L 395.828132 435.237311 -L 395.834057 429.989359 -L 395.905148 442.21292 -L 395.93477 432.794062 -L 395.952543 447.316835 -L 396.023634 420.799751 -L 396.041407 414.651601 -L 396.065104 435.01247 -L 396.106574 427.977776 -L 396.171741 402.355236 -L 396.22506 439.204363 -L 396.343546 452.220505 -L 396.296151 435.794303 -L 396.373167 444.15144 -L 396.39094 429.023814 -L 396.396864 430.714497 -L 396.503501 421.329617 -L 396.456107 442.427795 -L 396.509426 425.621939 -L 396.580517 448.022883 -L 396.621987 434.923547 -L 396.693079 402.993496 -L 396.740473 419.358769 -L 396.793792 400.543969 -L 396.811564 428.550504 -L 396.84711 413.159336 -L 396.935975 440.806667 -L 396.870807 408.178883 -L 396.97152 432.99967 -L 397.036687 421.763749 -L 396.995217 437.549068 -L 397.05446 422.326276 -L 397.143325 392.517112 -L 397.17887 408.615107 -L 397.184795 412.136282 -L 397.202568 400.354823 -L 397.321053 495.974943 -L 409.051145 495.974943 -L 409.068918 412.255164 -L 409.169631 417.352807 -L 409.175555 417.261095 -L 409.18148 417.859151 -L 409.30589 430.093887 -L 409.211101 414.399987 -L 409.317738 424.494958 -L 409.323663 421.075287 -L 409.353284 438.265699 -L 409.406603 435.527539 -L 409.47177 444.1222 -L 409.501391 428.324887 -L 409.507316 423.001346 -L 409.531013 442.381988 -L 409.613953 425.043689 -L 409.80353 387.116581 -L 409.643574 431.182011 -L 409.821303 391.105444 -L 409.939789 415.383123 -L 410.05235 408.879964 -L 409.999032 431.049414 -L 410.058275 409.352075 -L 410.064199 409.26039 -L 410.087896 416.935269 -L 410.147139 396.966006 -L 410.158987 401.903053 -L 410.194533 390.359806 -L 410.230079 412.50743 -L 410.253776 406.807774 -L 410.2597 411.495697 -L 410.324868 384.708474 -L 410.336716 388.721264 -L 410.34264 385.309509 -L 410.366338 407.979463 -L 410.419656 398.713045 -L 410.514445 417.400067 -L 410.443353 392.914054 -L 410.538142 407.597118 -L 410.544066 397.766701 -L 410.632931 425.92314 -L 410.638855 432.158728 -L 410.727719 409.733788 -L 410.852129 382.936358 -L 410.757341 422.057143 -L 410.881751 386.543695 -L 410.988388 401.563176 -L 410.905448 383.90276 -L 411.000236 391.181865 -L 411.012085 390.372629 -L 411.023934 379.838765 -L 411.059479 408.376971 -L 411.118722 397.27815 -L 411.290527 453.683065 -L 411.296451 450.267318 -L 411.320148 435.917456 -L 411.373467 455.402475 -L 411.414937 435.978433 -L 411.533422 420.959436 -L 411.450482 446.088491 -L 411.539347 421.692315 -L 411.64006 438.562017 -L 411.651908 431.513656 -L 411.770394 415.601233 -L 411.717075 456.624188 -L 411.776318 416.163088 -L 411.800015 436.792205 -L 411.88888 425.652549 -L 411.995517 411.692176 -L 411.912577 434.29673 -L 412.01329 414.079275 -L 412.131776 495.974943 -L 527.536924 495.974943 -L 527.548773 414.505556 -L 527.649486 443.254542 -L 527.679107 435.953673 -L 527.773896 463.753405 -L 527.933852 397.67209 -L 527.963473 411.353803 -L 528.093807 439.054007 -L 527.999019 407.578582 -L 528.129353 424.346359 -L 528.158975 407.40197 -L 528.230066 426.593678 -L 528.3604 456.875209 -L 528.241915 426.535478 -L 528.372249 454.169548 -L 528.390022 432.97457 -L 528.48481 437.250737 -L 528.514432 453.584244 -L 528.573675 437.216221 -L 528.585523 437.238511 -L 528.751403 399.484742 -L 528.846192 417.986102 -L 528.775101 398.499915 -L 528.887662 411.927429 -L 529.012072 386.59315 -L 529.136482 422.178725 -L 529.142407 420.255346 -L 529.237195 393.115669 -L 529.172028 424.194315 -L 529.260892 410.057431 -L 529.361605 423.411997 -L 529.343832 409.112593 -L 529.379378 415.508632 -L 529.420848 408.258508 -L 529.462318 429.143948 -L 529.468242 426.08922 -L 529.53341 440.945192 -L 529.497864 414.931272 -L 529.592652 437.720689 -L 529.669668 460.422954 -L 529.746684 453.853353 -L 529.918488 417.191995 -L 529.930337 421.260569 -L 529.94811 438.5272 -L 530.013277 415.463131 -L 530.03105 416.276153 -L 530.143611 383.212287 -L 530.167309 402.355978 -L 530.19693 413.467497 -L 530.262097 395.612503 -L 530.268021 385.147958 -L 530.356886 423.477045 -L 530.36281 420.605245 -L 530.410204 446.719324 -L 530.493144 429.505815 -L 530.552387 495.974943 -L 675.644148 495.974943 -L 675.644148 495.974943 -" clip-path="url(#p764d52f6eb)" style="fill: none; stroke: #2ca02c; stroke-width: 1.5; stroke-linecap: square"/> + <path d="M 83.217386 495.443125 +L 379.325789 495.443125 +L 379.408701 415.297544 +L 379.438312 424.960596 +L 379.456079 419.693304 +L 379.50938 434.319149 +L 379.515302 432.882857 +L 379.586369 440.744533 +L 379.550836 429.296053 +L 379.610059 431.224209 +L 379.615981 423.584649 +L 379.698893 441.819465 +L 379.710737 431.283799 +L 379.71666 441.02559 +L 379.811416 420.736839 +L 379.900251 403.310212 +L 379.935784 406.806943 +L 380.05423 429.576162 +L 380.066075 428.833196 +L 380.077919 414.517498 +L 380.160831 443.576104 +L 380.202287 446.250138 +L 380.225976 428.858697 +L 380.231899 433.103583 +L 380.362189 407.656801 +L 380.462868 440.941734 +L 380.397723 402.236128 +L 380.498402 434.466986 +L 380.528013 418.679167 +L 380.539858 407.774502 +L 380.59908 435.950521 +L 380.616847 430.309756 +L 380.634614 441.89645 +L 380.658303 418.678221 +L 380.729371 433.78783 +L 380.747138 435.745602 +L 380.764904 431.317656 +L 380.841894 406.387893 +L 380.877428 426.195213 +L 380.966262 445.183504 +L 380.901117 415.589719 +L 380.995874 432.740754 +L 381.025485 441.585111 +L 381.066941 424.568534 +L 381.072863 423.208069 +L 381.108397 437.888788 +L 381.114319 437.836077 +L 381.161698 442.714126 +L 381.126164 435.825412 +L 381.179465 436.706979 +L 381.321599 398.287144 +L 381.475579 456.907709 +L 381.481501 449.335736 +L 381.517035 456.114158 +L 381.546646 443.576222 +L 381.676937 415.030991 +L 381.599947 446.235614 +L 381.682859 417.364387 +L 381.688781 421.945829 +L 381.753926 390.116939 +L 381.759849 395.855335 +L 381.777615 393.381433 +L 381.795382 406.017766 +L 381.807227 403.334289 +L 381.824994 415.249115 +L 381.86645 398.124964 +L 381.91975 404.567401 +L 381.937517 395.247555 +L 381.99674 423.468211 +L 382.020429 414.18295 +L 382.085574 442.382609 +L 382.180331 435.233154 +L 382.269165 417.248383 +L 382.209942 435.248625 +L 382.286932 420.73948 +L 382.399456 495.443125 +L 394.131505 495.443125 +L 394.161117 414.006303 +L 394.244029 426.460701 +L 394.297329 411.946254 +L 394.362474 419.420965 +L 394.474998 432.939248 +L 394.415775 412.410074 +L 394.486842 427.676565 +L 394.492765 429.527819 +L 394.498687 420.353143 +L 394.563832 421.938574 +L 394.628977 409.50688 +L 394.670433 424.670644 +L 394.729656 429.720368 +L 394.830335 392.941862 +L 394.960625 419.178096 +L 394.865869 377.119051 +L 394.966547 418.889407 +L 394.978392 421.56464 +L 394.990237 416.450189 +L 395.008003 421.454578 +L 395.067226 404.786668 +L 395.114605 419.397493 +L 395.238973 442.824415 +L 395.144216 413.606942 +L 395.250817 431.021666 +L 395.268584 412.786895 +L 395.357418 434.350597 +L 395.452175 419.325465 +L 395.481786 428.290233 +L 395.493631 440.543373 +L 395.564698 422.289073 +L 395.576543 424.51128 +L 395.694989 408.280123 +L 395.706833 399.152711 +L 395.760134 411.816283 +L 395.795668 409.830188 +L 395.925958 434.695812 +L 395.831201 406.860784 +L 395.93188 428.568998 +L 395.937802 427.172469 +L 395.961492 439.686241 +L 395.967414 438.126289 +L 395.973336 445.640919 +L 396.038481 425.621648 +L 396.079937 444.450428 +L 396.168772 418.12188 +L 396.097704 449.55769 +L 396.204305 429.189208 +L 396.233917 437.20792 +L 396.251684 421.721052 +L 396.287217 423.52979 +L 396.376052 408.141017 +L 396.322751 441.882997 +L 396.405663 419.566366 +L 396.494497 419.488935 +L 396.547798 437.543246 +L 396.571487 442.974027 +L 396.624788 421.00239 +L 396.636632 426.385818 +L 396.648477 414.65477 +L 396.701777 429.715891 +L 396.749156 423.315363 +L 396.790612 426.281087 +L 396.885368 396.772 +L 396.926824 415.532865 +L 397.015659 412.588156 +L 397.021581 412.600001 +L 397.033425 398.807578 +L 397.086726 414.566144 +L 397.092648 410.980259 +L 397.205172 495.443125 +L 408.937221 495.443125 +L 408.978677 409.044361 +L 409.049745 413.72804 +L 409.103045 400.648667 +L 409.185957 425.941778 +L 409.19188 426.454527 +L 409.197802 422.605454 +L 409.274792 412.881069 +L 409.227413 427.493524 +L 409.298481 423.526184 +L 409.411004 429.565808 +L 409.381393 410.3894 +L 409.416927 428.385382 +L 409.434693 432.885944 +L 409.464305 419.618402 +L 409.470227 420.66313 +L 409.553139 397.005506 +L 409.588673 407.043409 +L 409.636051 427.383851 +L 409.683429 404.142195 +L 409.707119 422.456089 +L 409.831487 391.227585 +L 409.843331 388.040171 +L 409.884787 401.242363 +L 409.938088 420.646096 +L 409.902554 400.242856 +L 410.021 417.71612 +L 410.032844 415.354506 +L 410.056533 425.970737 +L 410.127601 441.487819 +L 410.157212 423.372562 +L 410.180901 437.120937 +L 410.186824 437.199937 +L 410.269736 433.661457 +L 410.22828 449.498889 +L 410.275658 435.891215 +L 410.28158 442.58294 +L 410.364492 419.665906 +L 410.370415 416.439686 +L 410.441482 426.392296 +L 410.471094 421.645005 +L 410.548083 463.554049 +L 410.583617 431.47728 +L 410.678374 408.322973 +L 410.707985 412.385645 +L 410.725752 402.655195 +L 410.731674 397.330418 +L 410.779052 417.06264 +L 410.820508 413.557334 +L 410.92711 423.098891 +L 410.885654 397.373806 +L 410.938954 422.651844 +L 410.944876 419.513099 +L 411.004099 443.255233 +L 411.021866 437.212918 +L 411.152156 400.505028 +L 411.18769 417.253929 +L 411.276525 419.789804 +L 411.223224 410.81895 +L 411.282447 413.346101 +L 411.418659 378.36706 +L 411.430504 383.082382 +L 411.454193 382.790103 +L 411.620017 427.75443 +L 411.625939 423.002789 +L 411.673318 440.976329 +L 411.720696 429.734426 +L 411.732541 437.785736 +L 411.815453 423.782417 +L 411.88652 387.6913 +L 411.898365 401.624336 +L 412.010888 495.443125 +L 527.382951 495.443125 +L 527.495475 391.962499 +L 527.501397 399.724452 +L 527.507319 396.458615 +L 527.566542 421.375694 +L 527.584309 411.839863 +L 527.643532 430.871788 +L 527.702755 423.213906 +L 527.850812 373.743125 +L 527.862656 373.757969 +L 527.992947 437.134564 +L 528.016636 429.63174 +L 528.111392 441.120513 +L 528.123237 430.937462 +L 528.265372 413.34934 +L 528.206149 432.204649 +L 528.271294 416.47795 +L 528.318673 418.269565 +L 528.342362 405.897715 +L 528.348284 401.799705 +L 528.425274 423.155808 +L 528.431196 419.874346 +L 528.437118 420.733634 +L 528.443041 411.47311 +L 528.478574 393.647976 +L 528.537797 412.361022 +L 528.555564 408.494421 +L 528.561486 407.601229 +L 528.573331 415.673403 +L 528.579253 422.314263 +L 528.650321 404.207701 +L 528.67401 408.775697 +L 528.780611 404.324913 +L 528.709543 417.772493 +L 528.786533 406.380187 +L 528.893134 414.415675 +L 528.851678 386.075106 +L 528.899057 409.193491 +L 528.93459 419.67622 +L 529.023425 412.384228 +L 529.029347 409.226705 +L 529.08857 433.290476 +L 529.112259 442.843895 +L 529.165559 418.445967 +L 529.171482 420.602059 +L 529.183326 430.212357 +L 529.242549 414.424167 +L 529.248471 415.499779 +L 529.254394 415.773081 +L 529.266238 402.902664 +L 529.337306 452.696964 +L 529.343228 448.490608 +L 529.432062 453.0832 +L 529.414296 439.19922 +L 529.449829 448.799796 +L 529.455752 448.995773 +L 529.461674 447.496114 +L 529.586042 407.442069 +L 529.603809 413.49105 +L 529.775555 453.889418 +L 529.888078 438.66643 +L 529.805166 458.826418 +L 529.899923 448.470273 +L 529.91769 452.676771 +L 529.959146 433.143748 +L 529.976913 439.190268 +L 530.042058 415.162129 +L 530.095358 429.323314 +L 530.130892 446.589978 +L 530.219726 439.403257 +L 530.278949 451.627805 +L 530.33225 433.526449 +L 530.338172 434.673893 +L 530.344094 427.720364 +L 530.456618 495.443125 +L 675.440114 495.443125 +L 675.440114 495.443125 +" clip-path="url(#p2de9b4f161)" style="fill: none; stroke: #2ca02c; stroke-width: 1.5; stroke-linecap: square"/> </g> <g id="patch_13"> - <path d="M 53.60625 502.068125 -L 53.60625 368.018125 + <path d="M 53.60625 501.528125 +L 53.60625 367.658125 " style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> </g> <g id="patch_14"> - <path d="M 705.265 502.068125 -L 705.265 368.018125 + <path d="M 705.05125 501.528125 +L 705.05125 367.658125 " style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> </g> <g id="patch_15"> - <path d="M 53.60625 502.068125 -L 705.265 502.068125 + <path d="M 53.60625 501.528125 +L 705.05125 501.528125 " style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> </g> <g id="patch_16"> - <path d="M 53.60625 368.018125 -L 705.265 368.018125 + <path d="M 53.60625 367.658125 +L 705.05125 367.658125 " style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> </g> </g> <g id="axes_4"> <g id="patch_17"> - <path d="M 53.60625 674.918125 -L 705.265 674.918125 -L 705.265 540.868125 -L 53.60625 540.868125 + <path d="M 53.60625 674.198125 +L 705.05125 674.198125 +L 705.05125 540.328125 +L 53.60625 540.328125 z " style="fill: #ffffff"/> </g> @@ -8205,12 +7945,12 @@ z <g id="xtick_28"> <g id="line2d_43"> <g> - <use xlink:href="#m1e6abe93e8" x="83.227102" y="674.918125" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m3a57de642d" x="83.217386" y="674.198125" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_44"> <!-- 0 --> - <g transform="translate(80.045852 689.516562) scale(0.1 -0.1)"> + <g transform="translate(80.036136 688.796562) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-30"/> </g> </g> @@ -8218,12 +7958,12 @@ z <g id="xtick_29"> <g id="line2d_44"> <g> - <use xlink:href="#m1e6abe93e8" x="157.280714" y="674.918125" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m3a57de642d" x="157.245968" y="674.198125" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_45"> <!-- 2500 --> - <g transform="translate(144.555714 689.516562) scale(0.1 -0.1)"> + <g transform="translate(144.520968 688.796562) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-32"/> <use xlink:href="#DejaVuSans-35" x="63.623047"/> <use xlink:href="#DejaVuSans-30" x="127.246094"/> @@ -8234,12 +7974,12 @@ z <g id="xtick_30"> <g id="line2d_45"> <g> - <use xlink:href="#m1e6abe93e8" x="231.334326" y="674.918125" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m3a57de642d" x="231.274549" y="674.198125" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_46"> <!-- 5000 --> - <g transform="translate(218.609326 689.516562) scale(0.1 -0.1)"> + <g transform="translate(218.549549 688.796562) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-35"/> <use xlink:href="#DejaVuSans-30" x="63.623047"/> <use xlink:href="#DejaVuSans-30" x="127.246094"/> @@ -8250,12 +7990,12 @@ z <g id="xtick_31"> <g id="line2d_46"> <g> - <use xlink:href="#m1e6abe93e8" x="305.387938" y="674.918125" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m3a57de642d" x="305.30313" y="674.198125" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_47"> <!-- 7500 --> - <g transform="translate(292.662938 689.516562) scale(0.1 -0.1)"> + <g transform="translate(292.57813 688.796562) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-37"/> <use xlink:href="#DejaVuSans-35" x="63.623047"/> <use xlink:href="#DejaVuSans-30" x="127.246094"/> @@ -8266,12 +8006,12 @@ z <g id="xtick_32"> <g id="line2d_47"> <g> - <use xlink:href="#m1e6abe93e8" x="379.441549" y="674.918125" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m3a57de642d" x="379.331711" y="674.198125" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_48"> <!-- 10000 --> - <g transform="translate(363.535299 689.516562) scale(0.1 -0.1)"> + <g transform="translate(363.425461 688.796562) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-31"/> <use xlink:href="#DejaVuSans-30" x="63.623047"/> <use xlink:href="#DejaVuSans-30" x="127.246094"/> @@ -8283,12 +8023,12 @@ z <g id="xtick_33"> <g id="line2d_48"> <g> - <use xlink:href="#m1e6abe93e8" x="453.495161" y="674.918125" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m3a57de642d" x="453.360292" y="674.198125" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_49"> <!-- 12500 --> - <g transform="translate(437.588911 689.516562) scale(0.1 -0.1)"> + <g transform="translate(437.454042 688.796562) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-31"/> <use xlink:href="#DejaVuSans-32" x="63.623047"/> <use xlink:href="#DejaVuSans-35" x="127.246094"/> @@ -8300,12 +8040,12 @@ z <g id="xtick_34"> <g id="line2d_49"> <g> - <use xlink:href="#m1e6abe93e8" x="527.548773" y="674.918125" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m3a57de642d" x="527.388874" y="674.198125" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_50"> <!-- 15000 --> - <g transform="translate(511.642523 689.516562) scale(0.1 -0.1)"> + <g transform="translate(511.482624 688.796562) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-31"/> <use xlink:href="#DejaVuSans-35" x="63.623047"/> <use xlink:href="#DejaVuSans-30" x="127.246094"/> @@ -8317,12 +8057,12 @@ z <g id="xtick_35"> <g id="line2d_50"> <g> - <use xlink:href="#m1e6abe93e8" x="601.602385" y="674.918125" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m3a57de642d" x="601.417455" y="674.198125" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_51"> <!-- 17500 --> - <g transform="translate(585.696135 689.516562) scale(0.1 -0.1)"> + <g transform="translate(585.511205 688.796562) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-31"/> <use xlink:href="#DejaVuSans-37" x="63.623047"/> <use xlink:href="#DejaVuSans-35" x="127.246094"/> @@ -8334,12 +8074,12 @@ z <g id="xtick_36"> <g id="line2d_51"> <g> - <use xlink:href="#m1e6abe93e8" x="675.655996" y="674.918125" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m3a57de642d" x="675.446036" y="674.198125" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_52"> <!-- 20000 --> - <g transform="translate(659.749746 689.516562) scale(0.1 -0.1)"> + <g transform="translate(659.539786 688.796562) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-32"/> <use xlink:href="#DejaVuSans-30" x="63.623047"/> <use xlink:href="#DejaVuSans-30" x="127.246094"/> @@ -8350,7 +8090,7 @@ z </g> <g id="text_53"> <!-- Time (ms) --> - <g transform="translate(354.236406 703.194687) scale(0.1 -0.1)"> + <g transform="translate(354.129531 702.474687) scale(0.1 -0.1)"> <defs> <path id="DejaVuSans-54" d="M -19 4666 L 3928 4666 @@ -8380,12 +8120,12 @@ z <g id="ytick_12"> <g id="line2d_52"> <g> - <use xlink:href="#md51da362c2" x="53.60625" y="674.501053" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m1f66c02d2f" x="53.60625" y="659.036084" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_54"> <!-- −2 --> - <g transform="translate(31.864063 678.300272) scale(0.1 -0.1)"> + <g transform="translate(31.864063 662.835303) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-2212"/> <use xlink:href="#DejaVuSans-32" x="83.789062"/> </g> @@ -8394,12 +8134,12 @@ z <g id="ytick_13"> <g id="line2d_53"> <g> - <use xlink:href="#md51da362c2" x="53.60625" y="643.947576" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m1f66c02d2f" x="53.60625" y="632.03761" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_55"> <!-- −1 --> - <g transform="translate(31.864063 647.746795) scale(0.1 -0.1)"> + <g transform="translate(31.864063 635.836828) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-2212"/> <use xlink:href="#DejaVuSans-31" x="83.789062"/> </g> @@ -8408,12 +8148,12 @@ z <g id="ytick_14"> <g id="line2d_54"> <g> - <use xlink:href="#md51da362c2" x="53.60625" y="613.394099" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m1f66c02d2f" x="53.60625" y="605.039135" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_56"> <!-- 0 --> - <g transform="translate(40.24375 617.193318) scale(0.1 -0.1)"> + <g transform="translate(40.24375 608.838354) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-30"/> </g> </g> @@ -8421,12 +8161,12 @@ z <g id="ytick_15"> <g id="line2d_55"> <g> - <use xlink:href="#md51da362c2" x="53.60625" y="582.840622" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m1f66c02d2f" x="53.60625" y="578.040661" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_57"> <!-- 1 --> - <g transform="translate(40.24375 586.639841) scale(0.1 -0.1)"> + <g transform="translate(40.24375 581.839879) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-31"/> </g> </g> @@ -8434,19 +8174,19 @@ z <g id="ytick_16"> <g id="line2d_56"> <g> - <use xlink:href="#md51da362c2" x="53.60625" y="552.287145" style="stroke: #000000; stroke-width: 0.8"/> + <use xlink:href="#m1f66c02d2f" x="53.60625" y="551.042186" style="stroke: #000000; stroke-width: 0.8"/> </g> </g> <g id="text_58"> <!-- 2 --> - <g transform="translate(40.24375 556.086364) scale(0.1 -0.1)"> + <g transform="translate(40.24375 554.841405) scale(0.1 -0.1)"> <use xlink:href="#DejaVuSans-32"/> </g> </g> </g> <g id="text_59"> <!-- I_bg (nA) --> - <g transform="translate(25.50625 630.29625) rotate(-90) scale(0.1 -0.1)"> + <g transform="translate(25.50625 629.66625) rotate(-90) scale(0.1 -0.1)"> <defs> <path id="DejaVuSans-62" d="M 3116 1747 Q 3116 2381 2855 2742 @@ -8522,13843 +8262,13803 @@ z </g> </g> <g id="line2d_57"> - <path d="M 83.227102 608.811078 -L 83.233027 609.415486 -L 83.256724 602.168905 -L 83.262648 602.210335 -L 83.327815 593.243755 -L 83.280421 607.413318 -L 83.369285 602.782599 -L 83.41668 636.90423 -L 83.487771 626.810675 -L 83.535165 608.691605 -L 83.517392 630.982257 -L 83.606257 618.651601 -L 83.718818 602.692228 -L 83.659575 641.067155 -L 83.742515 604.005713 -L 83.74844 608.783632 -L 83.819531 584.101396 -L 83.83138 589.292872 -L 83.866925 582.961715 -L 83.884698 596.053146 -L 83.991336 623.361291 -L 83.91432 595.223478 -L 84.003184 614.331861 -L 84.015033 611.564417 -L 84.020957 621.188919 -L 84.032806 620.138742 -L 84.0802 633.491195 -L 84.12167 604.445728 -L 84.133518 606.507389 -L 84.145367 597.637339 -L 84.157216 591.070382 -L 84.240156 607.576106 -L 84.24608 604.463854 -L 84.334944 623.795462 -L 84.299399 604.404399 -L 84.364566 613.355314 -L 84.400111 628.306344 -L 84.406036 636.10266 -L 84.471203 613.352179 -L 84.4949 620.514459 -L 84.61931 587.832887 -L 84.70225 584.507087 -L 84.666704 597.852328 -L 84.708175 585.484529 -L 84.802963 618.2255 -L 84.82666 605.903712 -L 84.832585 605.235617 -L 84.856282 615.052404 -L 84.903676 625.267405 -L 84.933297 605.517587 -L 84.95107 610.094552 -L 85.028086 584.725667 -L 84.980692 610.805554 -L 85.099178 589.276804 -L 85.235436 610.899691 -L 85.176193 588.193528 -L 85.241361 609.260283 -L 85.247285 606.717386 -L 85.288755 622.043942 -L 85.330225 613.741889 -L 85.430938 641.773909 -L 85.460559 632.733704 -L 85.608666 599.321086 -L 85.626439 608.307892 -L 85.644212 618.794156 -L 85.667909 600.698296 -L 85.733076 610.452557 -L 85.816017 592.186994 -L 85.845638 607.096445 -L 85.999669 639.85063 -L 85.910805 600.516629 -L 86.005594 635.694107 -L 86.094458 618.384253 -L 86.017442 640.23746 -L 86.106307 624.112664 -L 86.183322 599.696736 -L 86.218868 620.292024 -L 86.242565 634.132274 -L 86.295884 604.296753 -L 86.426218 568.658118 -L 86.325505 614.115404 -L 86.443991 580.412701 -L 86.515083 612.401772 -L 86.574326 602.540462 -L 86.598023 599.677182 -L 86.603947 603.115513 -L 86.633568 594.330773 -L 86.675038 612.528888 -L 86.70466 611.167334 -L 86.710584 615.077225 -L 86.781676 592.957516 -L 86.793524 598.571281 -L 86.876464 584.23917 -L 86.817221 598.932623 -L 86.91201 590.790699 -L 86.959404 604.146125 -L 87.000874 581.727241 -L 87.006799 584.045484 -L 87.030496 575.188089 -L 87.095663 596.589305 -L 87.107512 591.590785 -L 87.220073 578.770269 -L 87.154906 604.603233 -L 87.231922 582.89334 -L 87.249694 601.1887 -L 87.320786 578.944151 -L 87.344483 587.727607 -L 87.45112 611.2137 -L 87.480742 604.519349 -L 87.545909 588.441181 -L 87.569606 606.628053 -L 87.593303 601.290192 -L 87.664395 585.931804 -L 87.717713 596.774603 -L 87.883593 619.48572 -L 87.812502 593.283123 -L 87.907291 618.322864 -L 88.031701 568.836345 -L 88.037625 571.601711 -L 88.079095 560.675969 -L 88.126489 574.632873 -L 88.144262 574.028216 -L 88.239051 591.204539 -L 88.250899 577.700287 -L 88.262748 564.376102 -L 88.310142 603.66982 -L 88.345688 590.89924 -L 88.452325 629.633667 -L 88.476022 619.364124 -L 88.511568 634.131031 -L 88.564887 615.992052 -L 88.582659 617.126273 -L 88.695221 597.317863 -L 88.70707 603.83447 -L 88.74854 610.862889 -L 88.760388 603.230146 -L 88.778161 594.509428 -L 88.855177 620.775727 -L 88.920344 630.533878 -L 88.902571 611.861709 -L 88.944041 615.733618 -L 89.044754 597.257972 -L 89.068451 610.846066 -L 89.0803 618.099987 -L 89.16324 600.970671 -L 89.175088 607.755561 -L 89.186937 607.670305 -L 89.281726 644.838466 -L 89.299498 653.086852 -L 89.346893 626.246104 -L 89.37059 635.761127 -L 89.417984 619.233327 -L 89.500924 621.165329 -L 89.566091 638.010233 -L 89.512773 621.062497 -L 89.654956 635.028531 -L 89.726047 603.58109 -L 89.666804 635.143505 -L 89.797139 613.571916 -L 89.838609 640.362708 -L 89.891927 597.953782 -L 89.933397 592.237395 -L 89.963019 611.405081 -L 89.99264 600.422273 -L 90.051883 618.285418 -L 90.010413 598.59097 -L 90.122975 611.248345 -L 90.140747 614.349786 -L 90.146672 606.522471 -L 90.170369 598.83997 -L 90.211839 626.982764 -L 90.235536 616.049617 -L 90.24146 618.757492 -L 90.265158 597.137527 -L 90.318476 603.400122 -L 90.3244 603.552808 -L 90.436962 592.412827 -L 90.348098 608.660167 -L 90.442886 592.862395 -L 90.519902 634.054944 -L 90.579145 622.730774 -L 90.608766 628.861276 -L 90.638388 610.887142 -L 90.715403 582.835347 -L 90.756874 592.670548 -L 90.839814 610.936957 -L 90.798344 586.189615 -L 90.869435 596.135227 -L 90.893132 587.491119 -L 90.922754 600.190127 -L 90.987921 619.653516 -L 91.035315 604.551958 -L 91.165649 561.410142 -L 91.177498 574.716064 -L 91.284135 604.364842 -L 91.307832 597.935574 -L 91.313757 588.038741 -L 91.378924 625.09659 -L 91.402621 616.267692 -L 91.509258 632.787692 -L 91.432242 609.409466 -L 91.544804 625.919025 -L 91.657365 606.893161 -L 91.556653 629.243371 -L 91.66329 613.424039 -L 91.769927 635.721516 -L 91.698835 612.471315 -L 91.781776 631.389015 -L 91.91211 599.975317 -L 92.006898 620.435802 -L 92.024671 617.792392 -L 92.101687 585.805625 -L 92.149081 590.083769 -L 92.16093 582.825427 -L 92.208324 614.881142 -L 92.214249 623.985425 -L 92.309037 608.186559 -L 92.374204 605.9679 -L 92.332734 620.908399 -L 92.397902 612.289803 -L 92.480842 625.424189 -L 92.498614 610.221032 -L 92.504539 615.235606 -L 92.587479 603.142779 -L 92.528236 623.579607 -L 92.6171 612.093107 -L 92.623025 614.201248 -L 92.688192 599.3403 -L 92.759283 586.977249 -L 92.723737 610.907272 -L 92.788905 602.058006 -L 92.966633 637.272576 -L 92.972558 626.108311 -L 93.019952 615.876204 -L 93.067346 635.753325 -L 93.138438 646.672585 -L 93.114741 631.354719 -L 93.197681 642.218972 -L 93.262848 616.277049 -L 93.316166 625.378622 -L 93.333939 628.233303 -L 93.328015 622.183927 -L 93.339863 625.461086 -L 93.375409 637.099469 -L 93.422804 618.534641 -L 93.440576 619.555186 -L 93.487971 599.389011 -L 93.511668 620.717723 -L 93.582759 603.804278 -L 93.594608 609.776093 -L 93.600532 614.553122 -L 93.665699 582.257081 -L 93.683472 593.596155 -L 93.689397 592.550581 -L 93.707169 607.955852 -L 93.724942 621.062888 -L 93.784185 604.656542 -L 93.813807 615.179481 -L 93.855277 601.940363 -L 93.908595 617.960963 -L 93.920444 617.802113 -L 93.961914 607.851068 -L 94.009308 619.890863 -L 94.027081 617.682569 -L 94.098172 623.748098 -L 94.050778 608.042642 -L 94.139643 619.491585 -L 94.24628 607.321972 -L 94.20481 631.21004 -L 94.258128 612.937608 -L 94.317371 644.757965 -L 94.382538 629.482839 -L 94.400311 627.61845 -L 94.406236 632.194 -L 94.424008 651.589101 -L 94.4951 624.590735 -L 94.512873 637.262774 -L 94.637283 606.970619 -L 94.655056 612.082568 -L 94.755769 628.703553 -L 94.672829 611.005718 -L 94.767617 621.434006 -L 94.809087 600.099542 -L 94.892027 613.039352 -L 95.010513 630.053645 -L 95.03421 636.586796 -L 95.146772 598.966878 -L 95.182317 613.601257 -L 95.229712 576.240019 -L 95.235636 570.084423 -L 95.288955 592.14679 -L 95.3245 591.02426 -L 95.36597 606.506586 -L 95.431137 589.643183 -L 95.437062 588.780049 -L 95.454835 600.95951 -L 95.567396 620.242452 -L 95.57332 617.060998 -L 95.685882 597.507921 -L 95.703655 606.254566 -L 95.721428 610.506113 -L 95.745125 602.453516 -L 95.756973 609.206569 -L 95.804368 636.082534 -L 95.863611 609.90329 -L 95.946551 575.380883 -L 96.005794 596.487061 -L 96.035415 615.619899 -L 96.100582 591.951405 -L 96.112431 595.494412 -L 96.118355 589.773689 -L 96.159825 604.341037 -L 96.213144 601.96131 -L 96.224992 607.574171 -L 96.266462 591.182088 -L 96.302008 594.745824 -L 96.313857 584.572845 -L 96.396797 601.539029 -L 96.402721 605.172377 -L 96.450115 579.987523 -L 96.467888 580.933486 -L 96.473812 576.885586 -L 96.533055 609.276795 -L 96.550828 595.412443 -L 96.681162 621.320687 -L 96.615995 580.912131 -L 96.687087 620.781769 -L 96.716708 633.239344 -L 96.758178 617.662338 -L 96.775951 620.274537 -L 96.882588 595.917279 -L 96.811497 642.138207 -L 96.900361 606.656896 -L 97.030696 632.383026 -L 97.125484 608.383523 -L 97.048468 642.624548 -L 97.178803 619.864506 -L 97.208424 632.019151 -L 97.249894 610.667368 -L 97.28544 616.181748 -L 97.433547 585.646626 -L 97.540184 626.771104 -L 97.45132 582.251701 -L 97.563882 614.765926 -L 97.634973 595.383978 -L 97.682367 597.800696 -L 97.74161 611.53807 -L 97.78308 587.456675 -L 97.794929 579.645136 -L 97.86602 606.006741 -L 97.877869 613.442566 -L 97.954885 597.224906 -L 97.972657 604.557654 -L 97.996355 616.005093 -L 98.020052 591.564606 -L 98.07337 602.373802 -L 98.138538 576.713835 -L 98.19778 593.81557 -L 98.286645 613.953812 -L 98.316266 606.386677 -L 98.32219 604.239652 -L 98.363661 627.588336 -L 98.369585 630.397918 -L 98.434752 612.01045 -L 98.440676 617.007551 -L 98.511768 601.154537 -L 98.541389 621.947947 -L 98.559162 630.936592 -L 98.594708 610.915631 -L 98.659875 580.348289 -L 98.701345 602.782635 -L 98.713194 617.865642 -L 98.807982 609.149026 -L 98.837604 590.911989 -L 98.902771 613.591042 -L 98.920544 605.614925 -L 98.932392 598.003426 -L 98.991635 630.045974 -L 98.997559 628.800672 -L 99.009408 631.255027 -L 99.027181 620.606004 -L 99.039029 611.097755 -L 99.121969 637.14809 -L 99.127894 641.738776 -L 99.175288 614.184927 -L 99.210834 627.098006 -L 99.252304 604.354909 -L 99.341168 613.614064 -L 99.358941 626.638769 -L 99.37079 611.477262 -L 99.45373 619.923854 -L 99.459654 622.525876 -L 99.489275 596.467215 -L 99.524821 604.791616 -L 99.530745 604.616219 -L 99.53667 606.454998 -L 99.542594 606.026058 -L 99.548518 609.049335 -L 99.595913 594.883605 -L 99.631458 599.460466 -L 99.643307 593.897275 -L 99.726247 608.390295 -L 99.761793 627.285167 -L 99.821036 598.090613 -L 99.832884 607.650143 -L 99.892127 594.020282 -L 99.915824 616.950541 -L 99.945446 605.067083 -L 99.969143 607.937693 -L 99.975067 604.468764 -L 100.105401 632.383381 -L 100.111326 631.443271 -L 100.170569 627.186879 -L 100.129099 641.28881 -L 100.212039 632.816338 -L 100.217963 638.21682 -L 100.294979 608.680789 -L 100.300903 612.209107 -L 100.342373 596.423176 -L 100.395692 606.64737 -L 100.419389 598.010358 -L 100.460859 615.747176 -L 100.49048 611.406987 -L 100.543799 632.11845 -L 100.591193 610.455264 -L 100.61489 625.091823 -L 100.626739 610.787204 -L 100.691906 632.376065 -L 100.721528 628.323881 -L 100.82224 594.806785 -L 100.768922 628.583785 -L 100.887408 605.705809 -L 100.934802 625.82576 -L 100.999969 614.076762 -L 101.100682 587.303869 -L 101.124379 595.421266 -L 101.183622 607.184285 -L 101.207319 586.34826 -L 101.236941 576.806314 -L 101.284335 603.720155 -L 101.302108 595.696701 -L 101.325805 605.477205 -L 101.361351 593.400761 -L 101.467988 577.08967 -L 101.473912 581.095613 -L 101.503534 591.500144 -L 101.491685 575.108864 -L 101.580549 581.793786 -L 101.586474 572.723609 -L 101.675338 603.355071 -L 101.7879 627.269456 -L 101.716808 597.730611 -L 101.835294 621.769622 -L 101.947855 591.704246 -L 101.971552 599.727424 -L 102.107811 634.202221 -L 101.99525 594.620097 -L 102.11966 625.33018 -L 102.190751 592.248203 -L 102.255918 595.015492 -L 102.261843 591.297567 -L 102.297388 612.686647 -L 102.362556 595.548335 -L 102.374404 604.872093 -L 102.427723 578.166551 -L 102.457344 582.967853 -L 102.463268 582.604977 -L 102.593603 634.551484 -L 102.599527 634.464421 -L 102.706164 608.3392 -L 102.718013 616.054152 -L 102.723937 622.71302 -L 102.753559 595.990597 -L 102.818726 608.70972 -L 102.842423 595.234112 -L 102.86612 608.853531 -L 102.937212 605.58047 -L 103.221577 668.824943 -L 103.002379 598.724883 -L 103.263047 657.686784 -L 103.387458 617.452892 -L 103.393382 619.415996 -L 103.52964 589.877861 -L 103.535565 595.222836 -L 103.677748 641.04919 -L 103.713293 631.115419 -L 103.772536 640.087291 -L 103.742915 622.571002 -L 103.790309 624.317018 -L 103.796233 623.198366 -L 103.814006 636.607441 -L 103.819931 634.310266 -L 103.849552 643.351078 -L 103.902871 613.166511 -L 103.973962 588.897653 -L 104.033205 593.819181 -L 104.092448 612.743344 -L 104.122069 588.869632 -L 104.139842 582.585882 -L 104.169464 615.82337 -L 104.181312 622.548852 -L 104.246479 599.117731 -L 104.323495 585.53767 -L 104.293874 602.088012 -L 104.353117 598.078218 -L 104.376814 611.125247 -L 104.41236 596.421187 -L 104.465678 602.022043 -L 104.489375 592.731294 -L 104.548618 605.811839 -L 104.554542 605.79679 -L 104.566391 612.915671 -L 104.57824 601.881001 -L 104.601937 603.598731 -L 104.649331 586.806123 -L 104.70265 609.528323 -L 104.803363 626.274148 -L 104.815211 613.490734 -L 104.874454 605.638637 -L 104.844833 618.746746 -L 104.921848 613.767533 -L 105.022561 629.070386 -L 104.939621 611.546002 -L 105.046258 625.089623 -L 105.058107 631.577205 -L 105.099577 614.485656 -L 105.105501 613.194879 -L 105.135123 628.423077 -L 105.141047 623.378434 -L 105.194366 648.095103 -L 105.253609 632.052944 -L 105.372094 606.752133 -L 105.312851 634.704952 -L 105.425413 618.149915 -L 105.431337 624.017805 -L 105.484656 598.033271 -L 105.514277 602.073419 -L 105.520202 601.490503 -L 105.549823 608.887926 -L 105.650536 622.52078 -L 105.674233 620.564851 -L 105.792719 583.242962 -L 105.709779 621.97248 -L 105.798643 586.761694 -L 105.90528 616.543402 -L 105.917129 612.905291 -L 105.964523 635.505648 -L 106.000069 603.928692 -L 106.017842 611.216801 -L 106.077085 623.503808 -L 106.142252 598.901337 -L 106.160025 616.21134 -L 106.225192 583.604279 -L 106.254813 604.279295 -L 106.266662 600.299504 -L 106.272586 597.646057 -L 106.314056 617.729287 -L 106.355526 609.101141 -L 106.361451 607.889487 -L 106.385148 622.188822 -L 106.420693 612.04155 -L 106.468088 600.774934 -L 106.551028 637.184163 -L 106.663589 604.895356 -L 106.681362 609.802907 -L 106.799848 632.841193 -L 106.805772 628.771805 -L 106.829469 643.86398 -L 106.894637 620.991513 -L 106.918334 634.043919 -L 107.030895 596.741234 -L 107.042744 607.530816 -L 107.090138 617.55848 -L 107.16123 591.854809 -L 107.208624 604.520472 -L 107.261943 586.551299 -L 107.297488 574.983104 -L 107.41005 602.873267 -L 107.415974 602.472901 -L 107.433747 606.233975 -L 107.445595 620.971471 -L 107.540384 603.369669 -L 107.641097 627.290969 -L 107.664794 615.248442 -L 107.724037 603.386831 -L 107.759583 624.469125 -L 107.765507 626.267325 -L 107.789204 604.133305 -L 107.806977 592.246843 -L 107.842523 608.345415 -L 107.90769 593.019039 -L 108.0321 637.030779 -L 108.150586 624.313643 -L 108.292769 597.324321 -L 108.227602 634.618596 -L 108.316466 602.607282 -L 108.429027 621.372669 -L 108.346087 598.44875 -L 108.434952 611.429421 -L 108.452725 597.477603 -L 108.523816 628.839084 -L 108.577135 634.238854 -L 108.553437 624.086814 -L 108.624529 629.134939 -L 108.707469 597.003712 -L 108.743015 616.022919 -L 108.855576 624.740248 -L 108.784485 606.376282 -L 108.861501 619.957314 -L 108.873349 617.518126 -L 108.926668 593.972354 -L 108.974062 618.258715 -L 108.979986 613.347922 -L 109.080699 627.653974 -L 109.092548 615.281143 -L 109.116245 624.836734 -L 109.128094 611.871793 -L 109.211034 622.900434 -L 109.299898 608.645189 -L 109.264352 631.193583 -L 109.335444 609.212106 -L 109.424308 620.549274 -L 109.376914 599.864957 -L 109.448005 612.224641 -L 109.536869 587.433314 -L 109.596112 601.8621 -L 109.602037 601.655234 -L 109.607961 605.158255 -L 109.655355 628.455258 -L 109.61981 604.260437 -L 109.714598 612.017682 -L 109.761992 595.573937 -L 109.797538 626.055209 -L 109.809387 625.471563 -L 109.892327 632.718244 -L 109.86863 619.033027 -L 109.916024 629.046495 -L 109.945645 610.802706 -L 110.004888 629.647679 -L 110.028585 623.380403 -L 110.070055 625.940796 -L 110.087828 620.049802 -L 110.224087 578.781583 -L 110.247784 587.272569 -L 110.336648 599.712771 -L 110.295178 585.006165 -L 110.36627 598.061785 -L 110.395891 611.144919 -L 110.478831 591.58866 -L 110.555847 607.274372 -L 110.585469 592.984984 -L 110.591393 589.217549 -L 110.662484 609.529015 -L 110.680257 622.380632 -L 110.721727 595.000266 -L 110.775046 613.849383 -L 110.911304 593.186922 -L 110.798743 614.255251 -L 110.917229 603.453894 -L 111.006093 617.674836 -L 111.023866 611.790236 -L 111.035715 596.957396 -L 111.106806 622.253946 -L 111.130503 618.569925 -L 111.148276 632.42211 -L 111.207519 612.961566 -L 111.23714 616.589615 -L 111.260838 629.93178 -L 111.290459 604.178743 -L 111.302308 604.761866 -L 111.32008 603.296716 -L 111.337853 610.328478 -L 111.343778 608.724835 -L 111.349702 612.471487 -L 111.40302 593.032311 -L 111.450415 612.251147 -L 111.515582 601.059582 -L 111.527431 613.801672 -L 111.562976 609.139272 -L 111.586673 621.087257 -L 111.651841 603.67059 -L 111.663689 606.487581 -L 111.675538 609.055619 -L 111.681462 605.347553 -L 111.794024 593.86144 -L 111.764402 611.687916 -L 111.805872 597.90931 -L 111.841418 580.393254 -L 111.859191 602.318114 -L 111.882888 600.199211 -L 111.989525 626.834758 -L 112.007298 621.234511 -L 112.013222 621.258434 -L 112.102087 656.959345 -L 112.125784 636.671888 -L 112.208724 610.324213 -L 112.24427 619.75751 -L 112.315361 635.159668 -L 112.262042 612.909808 -L 112.344982 625.555362 -L 112.386452 610.735703 -L 112.457544 619.809651 -L 112.469392 625.849849 -L 112.510863 600.996124 -L 112.540484 610.883853 -L 112.546408 609.585468 -L 112.57603 626.676704 -L 112.599727 615.024087 -L 112.65897 628.25382 -L 112.629348 611.868327 -L 112.712288 620.302344 -L 112.74191 599.122024 -L 112.795228 624.922632 -L 112.82485 616.471374 -L 112.872244 624.428137 -L 112.913714 605.267919 -L 113.008503 586.434287 -L 113.0322 599.339245 -L 113.162534 617.185881 -L 113.044049 598.011356 -L 113.168459 613.212033 -L 113.23955 589.155353 -L 113.286944 603.127887 -L 113.375809 592.897132 -L 113.304717 604.18258 -L 113.399506 598.948821 -L 113.464673 616.96012 -L 113.482446 589.603896 -L 113.500219 596.04455 -L 113.523916 592.811534 -L 113.565386 605.526206 -L 113.606856 610.186699 -L 113.642402 598.275565 -L 113.666099 603.456738 -L 113.677947 601.397156 -L 113.713493 613.552091 -L 113.749039 606.573989 -L 113.8616 617.716425 -L 113.837903 593.920384 -L 113.867525 615.469823 -L 113.879373 619.439206 -L 113.926768 602.671413 -L 113.94454 607.543066 -L 113.950465 604.48919 -L 114.015632 621.404023 -L 114.074875 628.284508 -L 114.098572 619.763237 -L 114.116345 624.217128 -L 114.151891 601.491587 -L 114.228906 616.941181 -L 114.246679 628.723854 -L 114.288149 606.687397 -L 114.347392 626.010411 -L 114.388862 629.586617 -L 114.400711 622.202565 -L 114.454029 592.563657 -L 114.525121 603.21999 -L 114.531045 600.636678 -L 114.584364 624.326789 -L 114.608061 637.416525 -L 114.637682 618.781316 -L 114.685077 628.127559 -L 114.809487 591.009577 -L 114.821335 592.916899 -L 114.898351 613.59058 -L 114.945745 606.651217 -L 114.95167 605.163135 -L 114.999064 617.516326 -L 115.022761 611.73614 -L 115.11755 630.150035 -L 115.123474 632.025348 -L 115.176793 621.580542 -L 115.20049 622.181395 -L 115.212338 623.62474 -L 115.218263 616.524856 -L 115.224187 618.062092 -L 115.253808 623.538809 -L 115.354521 591.954204 -L 115.413764 599.035427 -L 115.49078 575.579479 -L 115.609266 601.104139 -L 115.61519 596.645958 -L 115.69813 568.428706 -L 115.627038 600.638132 -L 115.7396 590.034053 -L 115.834389 620.583408 -L 115.751449 585.861489 -L 115.881783 609.467655 -L 115.941026 606.808065 -L 115.90548 612.341916 -L 115.952874 612.267447 -L 116.035814 624.303001 -L 115.982496 604.689777 -L 116.065436 616.728144 -L 116.207619 560.018421 -L 116.255013 585.174794 -L 116.385347 633.253325 -L 116.432742 612.326416 -L 116.491985 598.738514 -L 116.468288 616.726984 -L 116.539379 608.566246 -L 116.640092 618.177381 -L 116.628243 604.045083 -L 116.657865 616.581614 -L 116.717108 591.535757 -L 116.770426 611.621176 -L 116.853366 601.407057 -L 116.829669 615.535378 -L 116.888912 608.515506 -L 116.906685 600.540251 -L 116.960003 618.998342 -L 116.971852 613.918948 -L 116.977776 618.891853 -L 117.001474 599.655165 -L 117.066641 606.566958 -L 117.155505 580.382696 -L 117.185126 581.896534 -L 117.309537 615.228009 -L 117.351007 617.322684 -L 117.380628 603.879106 -L 117.463568 584.871154 -L 117.499114 597.067768 -L 117.611675 604.84367 -L 117.53466 583.634768 -L 117.6176 603.31434 -L 117.70054 577.783815 -L 117.747934 581.292366 -L 117.801253 599.792319 -L 117.759783 576.219433 -L 117.896041 587.076801 -L 117.901965 581.50597 -L 117.973057 611.150016 -L 117.978981 608.943515 -L 118.067846 625.527615 -L 118.097467 618.310091 -L 118.121164 599.446847 -L 118.19818 622.410818 -L 118.204104 620.653635 -L 118.346287 585.231998 -L 118.257423 626.191983 -L 118.36406 590.532675 -L 118.452924 630.466708 -L 118.506243 619.360928 -L 118.636577 598.958681 -L 118.642502 599.316595 -L 118.725442 623.940555 -L 118.755063 608.603205 -L 118.849852 596.425494 -L 118.802457 612.799009 -L 118.867625 603.264124 -L 118.915019 587.705646 -L 118.974262 609.913339 -L 119.098672 582.8615 -L 119.015732 610.658177 -L 119.104596 586.623041 -L 119.23493 619.398969 -L 119.270476 614.137694 -L 119.282325 610.937631 -L 119.288249 623.995182 -L 119.371189 597.096805 -L 119.383038 601.708419 -L 119.394886 594.805168 -L 119.442281 627.123382 -L 119.448205 623.022544 -L 119.454129 630.115686 -L 119.477826 611.377973 -L 119.548918 613.996676 -L 119.608161 628.211858 -L 119.560766 610.791213 -L 119.667404 615.922896 -L 119.738495 602.794314 -L 119.762192 620.328013 -L 119.774041 628.767665 -L 119.856981 612.925436 -L 119.868829 607.062119 -L 119.922148 634.916944 -L 119.963618 613.166596 -L 120.076179 640.882215 -L 120.082104 635.195324 -L 120.093952 639.294939 -L 120.123574 617.419456 -L 120.129498 617.480835 -L 120.212438 624.870042 -L 120.247984 609.669119 -L 120.336848 593.124862 -L 120.271681 610.588966 -L 120.342772 603.473389 -L 120.443485 628.100521 -L 120.461258 614.615436 -L 120.479031 628.510315 -L 120.556047 607.723347 -L 120.609365 611.348158 -L 120.680457 589.712323 -L 120.710078 609.749023 -L 120.733776 588.82185 -L 120.798943 605.597126 -L 120.804867 603.945722 -L 120.834488 620.811875 -L 120.86411 618.170718 -L 120.98852 635.354407 -L 121.101081 578.500717 -L 121.124779 591.389092 -L 121.172173 607.458733 -L 121.219567 579.878803 -L 121.225492 579.691337 -L 121.231416 574.375234 -L 121.302507 599.596225 -L 121.332129 582.826268 -L 121.391372 595.40385 -L 121.409144 609.126096 -L 121.426917 588.488653 -L 121.438766 579.395976 -L 121.515782 601.274757 -L 121.533555 592.205166 -L 121.575025 589.861677 -L 121.657965 605.347697 -L 121.705359 598.865689 -L 121.699435 611.217806 -L 121.752753 604.735258 -L 121.788299 631.827201 -L 121.865315 608.686651 -L 121.906785 616.101568 -L 121.977876 597.2036 -L 122.019346 622.824532 -L 122.108211 613.489667 -L 122.202999 605.871388 -L 122.137832 616.861283 -L 122.220772 609.285393 -L 122.226696 617.304853 -L 122.268166 598.574592 -L 122.327409 610.617258 -L 122.398501 591.94603 -L 122.445895 605.854314 -L 122.481441 612.629413 -L 122.534759 596.511764 -L 122.558457 610.978532 -L 122.694715 578.818695 -L 122.706564 587.824002 -L 122.748034 605.997396 -L 122.813201 590.950039 -L 122.82505 587.066029 -L 122.878368 597.355353 -L 122.913914 617.876047 -L 123.008703 607.048367 -L 123.11534 583.749922 -L 123.038324 609.387159 -L 123.133113 583.963173 -L 123.180507 581.394802 -L 123.192355 587.68805 -L 123.216053 587.571441 -L 123.245674 599.588395 -L 123.293068 583.572578 -L 123.334538 596.817069 -L 123.346387 599.046476 -L 123.352311 589.18873 -L 123.376008 603.242162 -L 123.453024 593.924421 -L 123.470797 616.51184 -L 123.553737 589.968526 -L 123.559661 585.381433 -L 123.583359 605.872054 -L 123.65445 595.027542 -L 123.790709 624.110525 -L 123.826254 639.081468 -L 123.885497 621.141949 -L 123.891422 621.835109 -L 124.098772 579.074999 -L 124.15209 587.50197 -L 124.246879 592.581785 -L 124.187636 571.237763 -L 124.252803 589.098548 -L 124.258727 583.248694 -L 124.329819 609.412123 -L 124.341668 603.557504 -L 124.495699 633.007736 -L 124.365365 599.526935 -L 124.507548 629.228319 -L 124.637882 610.27032 -L 124.572715 637.526646 -L 124.643806 611.870291 -L 124.649731 615.854104 -L 124.685276 571.376236 -L 124.697125 578.139495 -L 124.708973 573.094194 -L 124.726746 590.699646 -L 124.756368 585.330095 -L 124.880778 613.875729 -L 124.768216 584.340976 -L 124.892626 603.484122 -L 124.928172 586.059782 -L 125.022961 592.555244 -L 125.082204 605.501776 -L 125.099977 584.589726 -L 125.105901 585.329764 -L 125.111825 581.4013 -L 125.176992 610.445823 -L 125.188841 603.575776 -L 125.319175 578.300166 -L 125.331024 582.073632 -L 125.336948 588.26825 -L 125.396191 569.897484 -L 125.437661 579.278911 -L 125.538374 604.054771 -L 125.585768 593.534781 -L 125.603541 585.502898 -L 125.621314 598.060785 -L 125.686481 592.345802 -L 125.704254 617.53202 -L 125.769421 578.992258 -L 125.804967 598.406797 -L 125.810891 595.002756 -L 125.86421 618.691143 -L 125.870134 626.427577 -L 125.929377 608.208006 -L 125.970847 615.801334 -L 125.994544 630.106643 -L 126.024166 596.982746 -L 126.03009 597.701139 -L 126.059711 579.620691 -L 126.148576 585.150362 -L 126.160424 581.50389 -L 126.166349 573.531813 -L 126.184121 592.138194 -L 126.261137 590.501655 -L 126.415169 628.837737 -L 126.427017 627.103805 -L 126.432942 627.645086 -L 126.450714 620.633973 -L 126.462563 617.407672 -L 126.498109 644.600022 -L 126.504033 644.479058 -L 126.658064 595.754382 -L 126.663989 596.062548 -L 126.675837 597.094493 -L 126.681762 594.161661 -L 126.782475 579.971723 -L 126.723232 599.406966 -L 126.794323 584.150416 -L 126.930582 600.355216 -L 126.85949 579.38706 -L 126.966128 593.344477 -L 126.977976 583.097082 -L 127.06684 593.814288 -L 127.078689 588.71174 -L 127.090538 593.659303 -L 127.132008 572.313467 -L 127.167553 580.537428 -L 127.179402 572.062 -L 127.244569 614.940842 -L 127.250493 609.318518 -L 127.345282 612.978886 -L 127.291963 598.0864 -L 127.357131 607.263773 -L 127.398601 603.000589 -L 127.380828 611.326358 -L 127.440071 607.489174 -L 127.457844 625.32177 -L 127.546708 607.47914 -L 127.623724 630.321107 -L 127.588178 603.237335 -L 127.694815 623.672272 -L 127.700739 622.623711 -L 127.730361 633.646839 -L 127.765907 624.925404 -L 127.819225 639.154503 -L 127.872544 625.181892 -L 127.931787 605.9715 -L 128.002878 610.272505 -L 128.0325 623.772848 -L 128.091742 604.903433 -L 128.097667 605.388745 -L 128.186531 605.613465 -L 128.228001 583.762739 -L 128.287244 595.442657 -L 128.263547 576.675687 -L 128.334638 582.296451 -L 128.435351 614.753787 -L 128.536064 609.280797 -L 128.559761 610.941261 -L 128.57161 599.020936 -L 128.630853 567.573441 -L 128.684171 591.488929 -L 128.690096 600.097155 -L 128.755263 587.576128 -L 128.790809 596.03128 -L 128.897446 575.778902 -L 128.826354 599.803846 -L 128.909294 581.790044 -L 128.921143 581.675887 -L 128.927067 587.334654 -L 129.045553 612.362848 -L 128.938916 583.883488 -L 129.06925 610.786235 -L 129.081099 608.489551 -L 129.104796 601.725572 -L 129.158114 626.605709 -L 129.169963 636.166392 -L 129.252903 609.648192 -L 129.329919 584.546081 -L 129.371389 595.296551 -L 129.489875 615.513252 -L 129.406935 594.26989 -L 129.501723 611.528242 -L 129.56689 605.862767 -L 129.590588 619.752125 -L 129.60836 613.816516 -L 129.614285 619.54479 -L 129.6913 604.137095 -L 129.709073 605.113209 -L 129.744619 613.315413 -L 129.77424 594.603086 -L 129.797938 598.889808 -L 129.809786 592.762632 -L 129.874953 621.88617 -L 129.880878 619.81275 -L 129.981591 635.024413 -L 129.951969 614.390897 -L 129.999363 627.784357 -L 130.094152 599.018243 -L 130.129698 605.664449 -L 130.224486 624.569769 -L 130.141546 602.463571 -L 130.242259 614.008176 -L 130.301502 593.466286 -L 130.366669 605.410334 -L 130.437761 620.580163 -L 130.479231 611.855084 -L 130.639187 570.806852 -L 130.645111 575.674606 -L 130.686581 591.730255 -L 130.733975 562.156084 -L 130.7399 565.39831 -L 130.745824 558.486091 -L 130.775445 585.467874 -L 130.852461 562.495839 -L 130.888007 557.288877 -L 130.976871 591.93879 -L 131.077584 580.593252 -L 131.018341 597.521409 -L 131.107205 581.893986 -L 131.148676 569.392035 -L 131.267161 621.425444 -L 131.36195 602.169964 -L 131.290858 622.143113 -L 131.379723 608.179141 -L 131.450814 626.582786 -L 131.492284 618.027966 -L 131.504133 616.757909 -L 131.563376 597.965834 -L 131.640391 608.328592 -L 131.782574 629.41523 -L 131.65224 606.824433 -L 131.806272 627.544226 -L 131.895136 609.918566 -L 131.847742 639.880684 -L 131.918833 626.225053 -L 131.924757 625.193789 -L 131.936606 636.698924 -L 131.972152 636.264715 -L 132.06694 648.976162 -L 132.007697 634.344493 -L 132.102486 639.94405 -L 132.143956 628.466801 -L 132.120259 644.722817 -L 132.173577 642.554379 -L 132.179502 647.363781 -L 132.23282 612.105223 -L 132.268366 629.436742 -L 132.27429 623.115125 -L 132.31576 652.035459 -L 132.369079 640.321134 -L 132.386852 647.404885 -L 132.611975 612.311473 -L 132.617899 620.641755 -L 132.694915 593.771647 -L 132.712688 607.351749 -L 132.742309 604.27637 -L 132.760082 619.535674 -L 132.771931 616.040545 -L 132.878568 625.864912 -L 132.854871 610.780478 -L 132.884492 616.808045 -L 132.902265 621.742031 -L 132.920038 612.72772 -L 132.931886 613.589307 -L 133.020751 614.108425 -L 133.056297 593.32529 -L 133.062221 593.202563 -L 133.068145 593.647791 -L 133.079994 587.467943 -L 133.133312 618.009798 -L 133.157009 607.270071 -L 133.311041 641.139323 -L 133.222177 605.936312 -L 133.316965 636.434275 -L 133.441375 619.125346 -L 133.453224 631.30073 -L 133.500618 606.804922 -L 133.553937 624.557281 -L 133.559861 625.717393 -L 133.601331 614.161737 -L 133.719817 584.413633 -L 133.749438 594.08133 -L 133.891621 613.502619 -L 133.796833 586.242504 -L 133.90347 608.133359 -L 133.968637 604.427164 -L 133.992334 618.559543 -L 134.004183 612.184332 -L 134.045653 644.589288 -L 134.170063 626.845157 -L 134.241154 600.132405 -L 134.306322 617.489868 -L 134.35964 639.327797 -L 134.418883 626.087545 -L 134.48405 608.014326 -L 134.430732 627.528228 -L 134.537369 617.79605 -L 134.596612 611.518895 -L 134.632157 626.095687 -L 134.721022 627.930657 -L 134.655855 616.02612 -L 134.726946 623.482868 -L 134.833583 594.314634 -L 134.869129 601.81773 -L 134.875053 603.604004 -L 134.916523 586.551287 -L 134.94022 590.917763 -L 134.946145 590.890834 -L 134.993539 592.667307 -L 134.975766 576.277554 -L 135.02316 585.278394 -L 135.029085 582.024321 -L 135.100176 596.193781 -L 135.141646 615.784179 -L 135.218662 609.185106 -L 135.283829 597.869187 -L 135.319375 610.910982 -L 135.420088 635.977167 -L 135.449709 630.79373 -L 135.503028 607.768703 -L 135.568195 615.669117 -L 135.692605 636.403093 -L 135.704454 632.858756 -L 135.840712 602.1739 -L 135.876258 625.680111 -L 135.959198 607.930847 -L 136.048062 616.271982 -L 136.077684 594.016881 -L 136.083608 603.89633 -L 136.1547 578.58252 -L 136.184321 591.641501 -L 136.255413 597.762768 -L 136.23764 589.14377 -L 136.261337 593.957461 -L 136.391671 572.091187 -L 136.468687 625.689398 -L 136.539778 622.970853 -L 136.563476 611.204845 -L 136.587173 631.178176 -L 136.646416 621.477451 -L 136.65234 624.335971 -L 136.723431 610.648094 -L 136.770826 583.981754 -L 136.835993 594.802008 -L 136.85969 600.451898 -L 136.913009 584.465363 -L 136.924857 588.01917 -L 136.930782 583.376928 -L 136.972252 609.74601 -L 137.019646 597.895438 -L 137.197375 624.980255 -L 137.06704 596.144917 -L 137.209223 618.842478 -L 137.256617 610.375673 -L 137.27439 620.906213 -L 137.333633 611.990365 -L 137.339557 613.873578 -L 137.386952 596.979686 -L 137.487665 570.301558 -L 137.404725 598.857065 -L 137.529135 582.577607 -L 137.695015 632.033276 -L 137.576529 576.774793 -L 137.700939 629.911279 -L 137.706863 630.448885 -L 137.718712 622.973215 -L 137.801652 606.627593 -L 137.843122 607.348221 -L 137.884592 626.133547 -L 137.908289 598.646603 -L 137.949759 606.53968 -L 137.973456 597.750742 -L 138.032699 614.373471 -L 138.062321 604.361794 -L 138.163034 618.529025 -L 138.086018 597.685467 -L 138.180806 606.608724 -L 138.287444 596.471228 -L 138.210428 611.718758 -L 138.293368 599.485356 -L 138.453324 633.591741 -L 138.459248 626.068817 -L 138.583658 601.543448 -L 138.589582 611.21003 -L 138.672522 590.085945 -L 138.625128 617.555255 -L 138.719917 599.617257 -L 138.77916 633.343583 -L 138.832478 604.791978 -L 138.838403 603.600101 -L 138.868024 613.436218 -L 138.885797 623.543785 -L 138.962813 603.148265 -L 138.974661 608.580395 -L 138.98651 606.414803 -L 139.016131 624.814921 -L 139.022056 620.754476 -L 139.075374 627.64215 -L 139.087223 611.284297 -L 139.134617 621.941473 -L 139.241254 606.284202 -L 139.164238 625.282191 -L 139.2768 608.03711 -L 139.395286 599.756525 -L 139.312346 619.207121 -L 139.40121 601.407858 -L 139.52562 628.289313 -L 139.418983 592.38396 -L 139.537469 618.359935 -L 139.56709 609.276092 -L 139.60856 633.919447 -L 139.655954 613.269075 -L 139.661879 613.597775 -L 139.667803 607.813798 -L 139.679652 606.781923 -L 139.786289 594.774373 -L 139.715197 611.548726 -L 139.792213 599.820257 -L 139.845532 629.723265 -L 139.910699 615.159351 -L 140.118049 562.21126 -L 140.123973 571.403647 -L 140.18914 582.529041 -L 140.153595 568.78948 -L 140.23061 574.791307 -L 140.27208 556.699793 -L 140.319475 584.523137 -L 140.325399 580.294038 -L 140.467582 634.396975 -L 140.337248 579.815333 -L 140.503128 618.375621 -L 140.603841 603.332307 -L 140.526825 632.108447 -L 140.615689 606.194092 -L 140.674932 634.437301 -L 140.734175 615.712103 -L 140.746024 603.27452 -L 140.787494 618.561657 -L 140.852661 608.632524 -L 140.929677 631.092975 -L 140.965222 624.008851 -L 141.024465 615.490162 -L 140.982995 628.405344 -L 141.048162 617.781568 -L 141.184421 577.669356 -L 141.190345 578.090974 -L 141.296982 624.175042 -L 141.332528 605.049711 -L 141.338452 601.486854 -L 141.373998 621.541756 -L 141.439165 604.03088 -L 141.451014 605.241507 -L 141.456938 603.992784 -L 141.516181 585.914633 -L 141.480635 608.203483 -L 141.575424 591.236857 -L 141.581348 589.807745 -L 141.622818 601.243466 -L 141.753153 634.982613 -L 141.919033 581.842745 -L 141.948654 589.276484 -L 142.007897 593.766646 -L 141.9842 576.795841 -L 142.031594 581.254096 -L 142.06714 569.127603 -L 142.102686 603.555884 -L 142.238944 651.077233 -L 142.27449 640.763517 -L 142.392976 614.017151 -L 142.410749 617.551786 -L 142.464067 600.948545 -L 142.541083 609.591222 -L 142.547007 614.138749 -L 142.600326 590.272176 -L 142.618099 594.460004 -L 142.64772 579.076289 -L 142.73066 586.593129 -L 142.766206 577.446502 -L 142.8136 597.884125 -L 142.825449 597.197605 -L 142.955783 622.12529 -L 142.866919 588.488005 -L 142.961708 620.531724 -L 142.967632 622.974487 -L 143.020951 602.105543 -L 143.050572 599.581136 -L 143.062421 613.497387 -L 143.097966 607.785081 -L 143.210528 635.963142 -L 143.133512 607.728561 -L 143.228301 624.537845 -L 143.293468 617.540501 -L 143.334938 638.910495 -L 143.435651 618.479315 -L 143.447499 624.56817 -L 143.459348 623.04071 -L 143.512667 593.734863 -L 143.589682 596.684119 -L 143.613379 614.296558 -L 143.666698 579.454886 -L 143.690395 595.684886 -L 143.696319 584.201573 -L 143.77926 613.323025 -L 143.791108 609.59288 -L 143.8622 597.090152 -L 143.885897 612.959678 -L 143.891821 606.180502 -L 143.921442 622.420601 -L 143.992534 598.392392 -L 143.998458 589.279155 -L 144.075474 612.178369 -L 144.099171 596.296944 -L 144.223581 620.827235 -L 144.140641 594.706885 -L 144.253203 619.977599 -L 144.312446 603.514122 -L 144.342067 624.25393 -L 144.371688 613.391581 -L 144.430931 637.350553 -L 144.478326 608.84281 -L 144.60866 585.692379 -L 144.73307 616.051096 -L 144.738994 612.854906 -L 144.81601 585.92816 -L 144.875253 599.767738 -L 144.910799 590.733598 -L 144.934496 605.731381 -L 144.94042 605.519642 -L 145.011512 613.664116 -L 144.975966 595.92628 -L 145.041133 609.664367 -L 145.124073 600.692512 -L 145.076679 613.514494 -L 145.14777 608.032164 -L 145.177392 619.532862 -L 145.242559 595.241667 -L 145.325499 561.195733 -L 145.378818 574.182119 -L 145.384742 573.5589 -L 145.408439 580.93651 -L 145.532849 618.743878 -L 145.550622 600.364183 -L 145.598016 605.439007 -L 145.574319 595.332215 -L 145.603941 596.939791 -L 145.621713 598.209135 -L 145.734275 582.046284 -L 145.929776 623.191472 -L 145.935701 621.207386 -L 146.066035 598.372805 -L 146.071959 597.8736 -L 146.095657 604.113467 -L 146.166748 628.339934 -L 146.261537 625.714509 -L 146.350401 608.299708 -L 146.380022 611.266451 -L 146.409644 632.431896 -L 146.468887 609.59717 -L 146.474811 604.80651 -L 146.551827 621.454308 -L 146.599221 646.908529 -L 146.670313 631.399552 -L 146.771025 595.453863 -L 146.800647 602.09804 -L 146.895436 644.567154 -L 146.930981 641.304092 -L 146.972451 623.209685 -L 146.948754 641.83016 -L 147.049467 629.802031 -L 147.061316 637.387927 -L 147.120558 601.779487 -L 147.15018 576.233411 -L 147.23312 597.491872 -L 147.239044 593.697383 -L 147.292363 609.700497 -L 147.345681 594.368303 -L 147.399 603.133731 -L 147.422697 589.730994 -L 147.452319 593.434792 -L 147.511562 588.246683 -L 147.48194 598.988571 -L 147.547107 594.857369 -L 147.60635 608.789334 -L 147.570804 588.590552 -L 147.665593 600.162225 -L 147.671517 599.777163 -L 147.68929 605.001528 -L 147.790003 627.223976 -L 147.8137 622.843799 -L 147.825549 617.732201 -L 147.872943 643.858951 -L 147.914413 620.92391 -L 147.973656 634.628853 -L 148.003278 605.89589 -L 148.009202 608.407119 -L 148.038823 600.821803 -L 148.032899 613.339209 -L 148.10399 605.699575 -L 148.240249 648.700744 -L 148.252098 652.188533 -L 148.281719 642.022247 -L 148.400205 626.903313 -L 148.412053 628.502838 -L 148.417978 629.742412 -L 148.447599 617.721901 -L 148.506842 587.213505 -L 148.566085 595.106236 -L 148.631252 585.632601 -L 148.678646 612.94805 -L 148.737889 574.183688 -L 148.797132 590.875272 -L 148.885997 629.135725 -L 148.927467 612.856721 -L 149.063725 586.144522 -L 148.963012 620.518153 -L 149.081498 588.744928 -L 149.199984 613.472807 -L 149.205908 613.145198 -L 149.241454 624.957777 -L 149.288848 597.275343 -L 149.31847 618.272581 -L 149.330318 622.076425 -L 149.395485 607.12152 -L 149.513971 585.685419 -L 149.466577 610.114237 -L 149.531744 591.361251 -L 149.555441 572.151969 -L 149.632457 589.703659 -L 149.685776 611.032325 -L 149.750943 608.751407 -L 149.768716 611.846042 -L 149.798337 593.663949 -L 149.804261 596.114268 -L 149.827959 581.138723 -L 149.928671 583.489731 -L 149.964217 620.417917 -L 150.06493 614.707038 -L 150.070854 611.945527 -L 150.124173 631.099397 -L 150.136022 630.112706 -L 150.207113 637.436024 -L 150.224886 624.284465 -L 150.242659 631.410514 -L 150.39669 596.637886 -L 150.278204 632.472814 -L 150.402615 596.642731 -L 150.408539 597.038493 -L 150.414463 592.231896 -L 150.420387 590.199949 -L 150.455933 615.445375 -L 150.461857 613.875382 -L 150.515176 649.816738 -L 150.568495 611.189598 -L 150.657359 628.09551 -L 150.598116 605.995869 -L 150.669208 618.191259 -L 150.675132 608.92758 -L 150.763996 632.305341 -L 150.76992 631.290596 -L 150.977271 575.142484 -L 151.072059 585.820911 -L 151.107605 603.035867 -L 151.184621 590.205732 -L 151.208318 587.746766 -L 151.220166 593.960239 -L 151.243864 589.619905 -L 151.344577 627.132869 -L 151.261636 589.151456 -L 151.380122 614.807286 -L 151.451214 600.540209 -L 151.463062 615.920775 -L 151.480835 610.092125 -L 151.575624 628.569339 -L 151.510457 609.6262 -L 151.599321 618.434998 -L 151.711882 641.836741 -L 151.61117 615.93494 -L 151.73558 636.683583 -L 151.812595 639.183457 -L 151.854065 622.695105 -L 151.948854 603.567474 -L 151.883687 627.471143 -L 151.978475 615.003805 -L 152.079188 626.777718 -L 152.049567 602.444314 -L 152.096961 619.300314 -L 152.132507 629.99408 -L 152.221371 600.403637 -L 152.227296 599.518422 -L 152.239144 613.332591 -L 152.268766 623.654199 -L 152.328008 607.847633 -L 152.333933 601.981318 -L 152.375403 624.385806 -L 152.422797 623.565069 -L 152.446494 635.076534 -L 152.487964 625.613125 -L 152.505737 603.320892 -L 152.600526 617.911245 -L 152.665693 645.141251 -L 152.713087 627.247372 -L 152.784179 606.745081 -L 152.819724 631.06875 -L 153.003377 595.187118 -L 153.032999 607.938322 -L 153.068545 622.713706 -L 153.127787 599.677591 -L 153.139636 598.082824 -L 153.157409 609.705324 -L 153.163333 619.600615 -L 153.210728 592.852086 -L 153.264046 608.717219 -L 153.305516 634.545908 -L 153.412153 628.413471 -L 153.530639 602.965648 -L 153.495093 629.642642 -L 153.536563 606.934479 -L 153.560261 612.677691 -L 153.589882 601.466341 -L 153.631352 608.480061 -L 153.773535 576.685351 -L 153.874248 628.158556 -L 153.963112 607.375276 -L 154.057901 592.754761 -L 154.022355 611.40136 -L 154.087522 598.099852 -L 154.170462 592.54931 -L 154.23563 640.825525 -L 154.288948 615.587919 -L 154.377812 619.50462 -L 154.383737 619.509839 -L 154.40151 629.972593 -L 154.460752 606.681411 -L 154.48445 611.405477 -L 154.632557 625.619555 -L 154.537768 602.537832 -L 154.638481 624.83276 -L 154.674027 606.999248 -L 154.739194 628.79469 -L 154.77474 635.762919 -L 154.804361 613.952422 -L 154.810286 617.620258 -L 154.910998 605.501868 -L 154.916923 614.081681 -L 154.934696 623.221633 -L 154.993938 602.094828 -L 155.017636 604.621947 -L 155.041333 608.49009 -L 155.070954 586.764907 -L 155.124273 603.500916 -L 155.159819 613.547435 -L 155.183516 594.103102 -L 155.224986 604.347221 -L 155.201289 593.841742 -L 155.248683 594.218776 -L 155.331623 564.181132 -L 155.367169 578.616074 -L 155.461957 630.850112 -L 155.503427 613.926082 -L 155.5212 611.815772 -L 155.527125 620.209862 -L 155.621913 627.510111 -L 155.56267 612.379435 -L 155.64561 623.457298 -L 155.68708 609.129643 -L 155.722626 636.729724 -L 155.740399 630.023046 -L 155.764096 628.967892 -L 155.775945 639.307144 -L 155.799642 648.830427 -L 155.85296 625.448965 -L 155.858885 623.705094 -L 155.918128 636.107585 -L 155.924052 633.955988 -L 156.024765 638.254002 -L 155.995143 625.936514 -L 156.030689 637.240897 -L 156.084008 637.307956 -L 156.149175 622.569197 -L 156.243963 647.551913 -L 156.267661 632.113522 -L 156.273585 630.045644 -L 156.320979 645.361324 -L 156.326904 644.774891 -L 156.338752 649.608247 -L 156.392071 618.302297 -L 156.433541 626.887614 -L 156.522405 605.729397 -L 156.540178 614.01684 -L 156.581648 602.109579 -L 156.587572 604.522427 -L 156.682361 596.776359 -L 156.611269 611.018503 -L 156.694209 602.702401 -L 156.700134 603.99925 -L 156.729755 587.657644 -L 156.735679 582.226004 -L 156.824544 597.75446 -L 156.830468 595.604638 -L 156.972651 637.111699 -L 157.02597 633.272534 -L 157.180001 659.04742 -L 157.055591 628.744008 -L 157.185925 656.433014 -L 157.197774 664.756314 -L 157.27479 640.277577 -L 157.280714 642.195534 -L 157.387351 601.989116 -L 157.428821 621.049084 -L 157.44067 634.619607 -L 157.529534 618.820108 -L 157.571004 605.684952 -L 157.600626 620.333394 -L 157.642096 613.729229 -L 157.64802 613.113833 -L 157.68949 617.198613 -L 157.784279 654.578959 -L 157.8139 636.724285 -L 157.825749 640.045131 -L 157.884991 625.606325 -L 157.908689 630.622706 -L 157.914613 630.549447 -L 157.920537 630.793807 -L 157.962007 633.756838 -L 157.985704 617.632065 -L 158.009402 624.768034 -L 158.02125 619.788771 -L 158.098266 629.463271 -L 158.127887 620.635105 -L 158.14566 620.926486 -L 158.163433 611.086739 -L 158.193055 587.294921 -L 158.275995 604.921285 -L 158.293767 619.642889 -L 158.329313 595.330959 -L 158.412253 618.462113 -L 158.453723 596.645477 -L 158.524815 611.68172 -L 158.625528 624.444949 -L 158.584058 604.361291 -L 158.637376 614.346442 -L 158.702543 600.516366 -L 158.661073 615.188701 -L 158.744013 610.780926 -L 158.838802 628.716985 -L 158.767711 597.915023 -L 158.862499 627.69492 -L 158.957288 595.542021 -L 158.886196 629.584876 -L 159.040228 608.252655 -L 159.105395 613.842741 -L 159.081698 598.71845 -L 159.129092 601.784586 -L 159.194259 585.362654 -L 159.223881 607.691546 -L 159.247578 594.452426 -L 159.259427 589.418836 -L 159.318669 620.710229 -L 159.371988 644.427814 -L 159.425307 616.969981 -L 159.531944 579.822867 -L 159.555641 601.516286 -L 159.644505 620.999473 -L 159.60896 595.083175 -L 159.680051 617.846731 -L 159.745218 591.649089 -L 159.804461 606.326308 -L 159.828158 620.102315 -L 159.917023 612.109676 -L 159.922947 605.18951 -L 159.970341 625.59162 -L 160.02366 613.790432 -L 160.029584 617.411064 -L 160.053281 597.149923 -L 160.124373 611.969921 -L 160.165843 585.232322 -L 160.242858 591.452536 -L 160.308026 619.767766 -L 160.367269 608.807417 -L 160.426511 600.131822 -L 160.462057 618.745339 -L 160.467981 614.269899 -L 160.503527 589.175984 -L 160.485754 614.275233 -L 160.574619 613.017105 -L 160.598316 632.397878 -L 160.675332 607.866679 -L 160.693104 622.31217 -L 160.699029 623.334361 -L 160.722726 611.718301 -L 160.89453 574.452552 -L 160.900455 578.975489 -L 161.06041 626.42899 -L 161.14335 609.321397 -L 161.078183 631.151175 -L 161.172972 622.243017 -L 161.238139 637.834779 -L 161.261836 618.755643 -L 161.279609 622.222498 -L 161.297382 626.92846 -L 161.332928 610.797057 -L 161.344776 616.403104 -L 161.386246 626.440652 -L 161.486959 591.898224 -L 161.516581 603.891916 -L 161.587672 590.358387 -L 161.629142 575.429732 -L 161.700234 584.45749 -L 161.783174 630.752612 -L 161.712082 581.406125 -L 161.883887 613.507258 -L 161.913508 604.667921 -L 161.966827 631.440181 -L 161.972751 629.510443 -L 161.996448 644.96468 -L 162.020145 644.853671 -L 162.031994 652.491847 -L 162.085312 623.471029 -L 162.120858 602.062112 -L 162.197874 614.422313 -L 162.209722 619.681214 -L 162.245268 600.20294 -L 162.322284 591.266533 -L 162.292662 610.720711 -L 162.334132 606.91059 -L 162.517785 645.732087 -L 162.541483 644.155898 -L 162.60665 623.768662 -L 162.654044 638.819136 -L 162.808076 607.852897 -L 162.920637 639.661689 -L 162.944334 636.718441 -L 163.080593 592.655596 -L 162.985804 639.998826 -L 163.139836 603.530539 -L 163.169457 615.459862 -L 163.222776 596.757414 -L 163.282019 582.260314 -L 163.31164 602.255059 -L 163.329413 597.473839 -L 163.335337 597.427814 -L 163.341262 597.822939 -L 163.412353 583.378598 -L 163.376807 604.711003 -L 163.447899 597.377082 -L 163.459747 594.956988 -L 163.465672 597.712558 -L 163.625627 628.835918 -L 163.667098 632.941705 -L 163.761886 609.565458 -L 163.868523 639.684473 -L 163.880372 630.705254 -L 163.933691 608.743192 -L 163.963312 637.208291 -L 163.987009 626.598296 -L 164.052176 655.349518 -L 164.111419 652.868927 -L 164.158813 637.886178 -L 164.129192 655.975575 -L 164.170662 642.944236 -L 164.295072 610.758882 -L 164.300996 612.017407 -L 164.324694 616.469689 -L 164.348391 605.496704 -L 164.466877 569.636637 -L 164.484649 572.98536 -L 164.502422 563.967921 -L 164.561665 593.283762 -L 164.703848 620.647531 -L 164.579438 587.847325 -L 164.715697 620.320672 -L 164.763091 606.701592 -L 164.81641 626.00099 -L 164.881577 641.256033 -L 164.94082 638.623031 -L 164.970441 643.258593 -L 165.011911 629.712175 -L 165.041533 637.928667 -L 165.154094 618.595765 -L 165.094851 653.193517 -L 165.165943 623.04954 -L 165.237034 645.176907 -L 165.284428 626.848343 -L 165.391066 594.127236 -L 165.343671 628.641869 -L 165.408838 599.436108 -L 165.414763 602.702004 -L 165.47993 579.540126 -L 165.533249 563.561767 -L 165.586567 583.791766 -L 165.616189 595.82041 -L 165.633961 580.147793 -L 165.657659 567.456283 -L 165.722826 607.462809 -L 165.817614 624.83811 -L 165.799842 606.100405 -L 165.847236 615.488898 -L 165.85316 614.087531 -L 165.89463 629.355281 -L 165.924252 622.86557 -L 165.930176 623.603276 -L 165.953873 612.908789 -L 166.001267 604.85526 -L 166.024965 618.224211 -L 166.036813 613.323374 -L 166.090132 629.300919 -L 166.14345 615.690315 -L 166.173072 609.239436 -L 166.202693 622.806758 -L 166.291558 640.20789 -L 166.238239 621.511856 -L 166.297482 630.104015 -L 166.421892 596.198291 -L 166.492983 637.305993 -L 166.43374 593.008781 -L 166.569999 628.513037 -L 166.670712 614.29964 -L 166.623318 640.285069 -L 166.688485 614.598825 -L 166.694409 620.521585 -L 166.771425 597.273192 -L 166.777349 600.318436 -L 166.830668 580.741337 -L 166.883986 602.213 -L 167.002472 585.458077 -L 167.008396 596.495858 -L 167.055791 618.574077 -L 167.138731 604.394434 -L 167.156504 610.966258 -L 167.263141 587.44885 -L 167.274989 596.646039 -L 167.352005 566.100104 -L 167.369778 584.85505 -L 167.3994 572.368071 -L 167.429021 593.642489 -L 167.458642 591.308823 -L 167.577128 615.461592 -L 167.618598 598.024898 -L 167.654144 622.283883 -L 167.68969 607.241244 -L 167.737084 625.395769 -L 167.701538 605.660586 -L 167.796327 611.15504 -L 167.808175 593.572572 -L 167.873343 618.785033 -L 167.902964 613.967033 -L 167.962207 605.348289 -L 167.926661 625.645018 -L 168.009601 611.550538 -L 168.068844 639.702343 -L 168.110314 610.703972 -L 168.122163 613.748538 -L 168.211027 567.039709 -L 168.264346 580.281937 -L 168.27027 580.13019 -L 168.288043 560.632233 -L 168.341361 590.818079 -L 168.359134 588.25459 -L 168.489469 617.411359 -L 168.501317 611.011954 -L 168.51909 599.227458 -L 168.60203 614.996178 -L 168.613879 605.248358 -L 168.696819 620.70612 -L 168.661273 603.301172 -L 168.708667 604.609532 -L 168.76791 580.650801 -L 168.815305 603.221746 -L 168.904169 623.427975 -L 168.939715 617.388291 -L 168.945639 614.390832 -L 169.010806 633.143454 -L 169.022655 627.168742 -L 169.064125 620.562267 -L 169.158913 646.513385 -L 169.235929 621.96375 -L 169.271475 633.531651 -L 169.384036 611.953324 -L 169.307021 639.290577 -L 169.419582 623.102886 -L 169.443279 631.172243 -L 169.520295 618.669652 -L 169.549916 606.948522 -L 169.579538 622.342354 -L 169.632856 616.838793 -L 169.638781 617.742309 -L 169.656554 606.056715 -L 169.715797 563.622255 -L 169.775039 596.171247 -L 169.804661 577.049026 -L 169.893525 586.308009 -L 169.964617 613.993642 -L 170.017935 609.971788 -L 170.02386 606.547491 -L 170.077178 621.919985 -L 170.112724 612.061798 -L 170.171967 608.787998 -L 170.254907 638.036591 -L 170.361544 610.583166 -L 170.385241 611.486963 -L 170.432635 625.589105 -L 170.497803 618.999558 -L 170.592591 604.943438 -L 170.557046 625.745266 -L 170.610364 614.447818 -L 170.717001 634.620196 -L 170.64591 613.445696 -L 170.734774 625.20117 -L 170.829563 602.064709 -L 170.888806 603.152498 -L 170.942124 617.580452 -L 170.971746 597.933833 -L 171.001367 613.121297 -L 171.125777 589.029828 -L 171.137626 595.772202 -L 171.14355 595.881265 -L 171.26796 620.430681 -L 171.303506 614.998023 -L 171.427916 600.343538 -L 171.339052 629.144825 -L 171.43384 605.317394 -L 171.504932 609.077795 -L 171.445689 597.425521 -L 171.510856 603.615333 -L 171.51678 598.461671 -L 171.587872 624.606193 -L 171.611569 607.277745 -L 171.635266 615.212473 -L 171.670812 595.316769 -L 171.694509 600.522995 -L 171.718206 588.059906 -L 171.783373 630.70221 -L 171.824843 640.958475 -L 171.878162 623.878416 -L 171.884086 625.920373 -L 171.943329 632.626443 -L 172.038118 600.172785 -L 172.174376 635.244651 -L 172.292862 600.423132 -L 172.203998 640.305431 -L 172.352105 609.727441 -L 172.470591 592.016145 -L 172.411348 618.077976 -L 172.500212 594.300775 -L 172.618698 607.285675 -L 172.541682 583.86442 -L 172.630547 606.455608 -L 172.64832 607.955417 -L 172.784578 584.407498 -L 172.790502 584.087297 -L 172.796427 586.693739 -L 172.932685 612.659411 -L 172.93861 612.029801 -L 172.950458 595.844941 -L 173.051171 604.429925 -L 173.122263 617.90698 -L 173.06302 598.620232 -L 173.157808 602.759186 -L 173.246673 608.641935 -L 173.294067 573.394215 -L 173.335537 597.59615 -L 173.412553 593.333917 -L 173.448099 604.552203 -L 173.495493 588.628872 -L 173.513266 594.120685 -L 173.536963 580.426975 -L 173.613979 599.091066 -L 173.6436 613.56311 -L 173.714692 601.441676 -L 173.732464 587.69339 -L 173.797632 616.333286 -L 173.80948 628.086533 -L 173.880572 596.515415 -L 173.886496 596.719655 -L 173.910193 586.399658 -L 173.951663 601.384377 -L 173.969436 597.813447 -L 173.981285 604.45895 -L 174.028679 587.298627 -L 174.076073 598.691314 -L 174.081997 596.127261 -L 174.164938 606.620829 -L 174.218256 624.162605 -L 174.259726 591.718408 -L 174.271575 601.491838 -L 174.360439 584.445528 -L 174.615183 638.006072 -L 174.413758 580.048148 -L 174.656653 632.897278 -L 174.781064 613.798008 -L 174.715896 633.010593 -L 174.786988 615.169508 -L 174.822534 634.176767 -L 174.905474 624.149876 -L 174.917322 618.101248 -L 174.941019 627.586865 -L 174.958792 623.35026 -L 175.018035 639.277917 -L 175.035808 619.9287 -L 175.071354 631.69891 -L 175.148369 607.355366 -L 175.083202 633.46539 -L 175.195764 626.635785 -L 175.207612 631.50418 -L 175.266855 609.884552 -L 175.27278 612.565951 -L 175.31425 589.09882 -L 175.385341 602.791795 -L 175.497903 617.785121 -L 175.610464 593.68847 -L 175.616388 596.322678 -L 175.622313 596.293206 -L 175.699328 588.087342 -L 175.669707 603.739434 -L 175.72895 595.38006 -L 175.782268 600.442405 -L 175.805966 586.954527 -L 175.823738 592.422728 -L 175.871133 569.151854 -L 175.942224 582.538754 -L 175.97777 603.14101 -L 176.054786 586.660993 -L 176.078483 580.698033 -L 176.066634 589.764317 -L 176.149574 588.578736 -L 176.26806 615.258122 -L 176.333227 592.205927 -L 176.380622 606.417194 -L 176.410243 596.039373 -L 176.39247 609.090927 -L 176.457637 608.829944 -L 176.534653 633.416847 -L 176.55835 604.393491 -L 176.564275 610.388812 -L 176.64129 585.414625 -L 176.72423 597.433913 -L 176.759776 607.196575 -L 176.789398 620.891011 -L 176.860489 595.919711 -L 176.866413 597.37572 -L 176.907883 580.802948 -L 176.943429 576.823344 -L 176.919732 585.252224 -L 176.955278 582.42417 -L 177.026369 576.43698 -L 177.061915 591.348523 -L 177.097461 574.113515 -L 177.150779 599.671514 -L 177.174476 587.284521 -L 177.198173 609.078878 -L 177.263341 582.920148 -L 177.275189 584.819633 -L 177.334432 548.87118 -L 177.405524 554.392872 -L 177.577328 606.767774 -L 177.583252 602.766362 -L 177.654344 615.465125 -L 177.683965 607.410919 -L 177.778754 632.373075 -L 177.802451 625.292525 -L 177.89724 611.797188 -L 177.843921 639.63388 -L 177.915012 620.528951 -L 177.98018 625.623996 -L 177.997952 605.267153 -L 178.003877 600.393591 -L 178.074968 623.043202 -L 178.092741 615.839677 -L 178.134211 617.715725 -L 178.122363 608.594839 -L 178.157908 611.676639 -L 178.175681 597.686998 -L 178.229 624.992221 -L 178.264545 606.894006 -L 178.294167 604.570231 -L 178.39488 635.891329 -L 178.501517 603.787276 -L 178.525214 617.7616 -L 178.614079 621.452892 -L 178.554836 608.889298 -L 178.625927 612.888403 -L 178.649624 609.77516 -L 178.655549 615.590423 -L 178.732564 641.64099 -L 178.774034 627.405586 -L 178.874747 614.920332 -L 178.845126 635.595534 -L 178.886596 618.855872 -L 178.93399 625.142818 -L 178.993233 594.207371 -L 179.040627 577.951833 -L 179.005082 601.518044 -L 179.088022 598.449856 -L 179.111719 606.014278 -L 179.188735 590.473486 -L 179.194659 589.744617 -L 179.212432 597.583085 -L 179.218356 594.31874 -L 179.30722 582.043494 -L 179.330917 608.151081 -L 179.443479 586.307799 -L 179.384236 612.69464 -L 179.461252 587.129144 -L 179.51457 593.332739 -L 179.544192 572.460921 -L 179.55604 583.416305 -L 179.615283 575.219667 -L 179.573813 587.349415 -L 179.662678 585.224589 -L 179.787088 616.309222 -L 179.793012 602.981609 -L 179.917422 578.513113 -L 179.958892 580.892365 -L 180.065529 625.152184 -L 179.994438 578.694587 -L 180.124772 605.131825 -L 180.166242 596.742687 -L 180.189939 609.679835 -L 180.225485 606.935639 -L 180.278804 623.26478 -L 180.308425 599.137911 -L 180.326198 612.469675 -L 180.367668 590.636208 -L 180.403214 616.703352 -L 180.438759 605.313684 -L 180.444684 605.30282 -L 180.616488 570.643667 -L 180.545397 606.375689 -L 180.64611 584.107648 -L 180.776444 603.913773 -L 180.723125 578.150085 -L 180.782368 601.470704 -L 180.835687 587.949407 -L 180.806065 605.2381 -L 180.889005 600.518859 -L 180.906778 601.24027 -L 180.918627 595.641326 -L 180.942324 595.812421 -L 180.954173 589.700424 -L 180.966021 600.136969 -L 181.001567 595.653825 -L 181.137826 637.370138 -L 181.149674 642.243766 -L 181.327403 610.942413 -L 181.404419 618.718581 -L 181.416267 604.793917 -L 181.43404 607.932371 -L 181.540677 589.417926 -L 181.552526 590.837531 -L 181.653239 624.403404 -L 181.712482 619.186914 -L 181.718406 613.904742 -L 181.789497 630.704015 -L 181.80727 629.368613 -L 181.830967 638.195452 -L 181.896135 608.108781 -L 181.902059 610.357365 -L 181.97315 600.25041 -L 181.937605 613.528646 -L 181.990923 607.604837 -L 182.079788 635.948227 -L 182.109409 622.961381 -L 182.204198 602.863533 -L 182.156803 625.6098 -L 182.227895 614.394659 -L 182.298986 627.304168 -L 182.257516 613.121726 -L 182.346381 620.981031 -L 182.352305 622.606364 -L 182.370078 608.125976 -L 182.387851 609.345873 -L 182.423396 593.593116 -L 182.494488 613.495015 -L 182.500412 606.176455 -L 182.553731 625.070704 -L 182.636671 621.106267 -L 182.701838 595.292382 -L 182.660368 623.54913 -L 182.755156 602.246089 -L 182.761081 605.619639 -L 182.790702 580.628365 -L 182.838097 586.896644 -L 182.844021 584.335962 -L 182.885491 603.640889 -L 182.897339 601.380922 -L 182.903264 609.865516 -L 182.992128 587.295921 -L 182.998052 586.481146 -L 183.003977 593.030393 -L 183.092841 610.137993 -L 183.021749 593.002314 -L 183.122462 606.449974 -L 183.175781 582.04697 -L 183.240948 590.508913 -L 183.306115 596.941393 -L 183.282418 574.351796 -L 183.335737 581.435725 -L 183.35351 577.540648 -L 183.412753 598.700313 -L 183.466071 605.886029 -L 183.471995 598.427727 -L 183.483844 599.137916 -L 183.590481 567.121344 -L 183.608254 579.642037 -L 183.898544 625.197037 -L 183.620103 576.186717 -L 183.916317 616.108201 -L 183.93409 596.276019 -L 184.034803 610.672526 -L 184.064424 601.828309 -L 184.111819 614.698644 -L 184.153289 605.261564 -L 184.236229 628.469664 -L 184.277699 616.471761 -L 184.366563 602.104686 -L 184.325093 617.962051 -L 184.384336 613.888939 -L 184.449503 637.801726 -L 184.490973 613.095566 -L 184.59761 590.646758 -L 184.621307 595.957504 -L 184.686475 593.823282 -L 184.787188 622.652863 -L 184.881976 601.773648 -L 184.816809 625.870415 -L 184.911598 610.551092 -L 184.923446 612.000801 -L 185.030083 601.271018 -L 185.036008 609.34322 -L 185.065629 593.747014 -L 185.142645 605.210761 -L 185.154493 602.039416 -L 185.195964 621.396946 -L 185.231509 613.05201 -L 185.349995 621.315166 -L 185.296676 604.822566 -L 185.367768 619.944414 -L 185.468481 592.117033 -L 185.515875 610.916444 -L 185.527724 620.71822 -L 185.616588 605.718682 -L 185.622512 607.695515 -L 185.628437 607.662121 -L 185.77062 566.549918 -L 185.865408 591.891697 -L 185.81209 556.674392 -L 185.906878 574.171593 -L 185.972045 587.549203 -L 186.01944 565.097253 -L 186.149774 619.070999 -L 186.167547 612.441445 -L 186.197168 615.368342 -L 186.214941 607.335852 -L 186.232714 590.03914 -L 186.315654 608.924025 -L 186.327503 604.160881 -L 186.357124 599.206523 -L 186.368973 610.923907 -L 186.39267 606.258763 -L 186.398594 616.116341 -L 186.445988 590.666648 -L 186.499307 603.242146 -L 186.564474 620.189668 -L 186.523004 600.367782 -L 186.611869 606.536218 -L 186.623717 600.264584 -L 186.694809 618.179179 -L 186.712581 619.541149 -L 186.718506 611.555676 -L 186.730354 602.047279 -L 186.789597 622.379356 -L 186.801446 616.601793 -L 186.836992 643.190987 -L 186.919932 628.680108 -L 186.949553 630.075964 -L 187.103585 606.415202 -L 187.162827 637.379705 -L 187.227995 617.99086 -L 187.251692 625.15197 -L 187.30501 609.614669 -L 187.310935 613.838045 -L 187.322783 603.07334 -L 187.382026 623.221174 -L 187.411648 620.178247 -L 187.417572 620.757785 -L 187.435345 613.343293 -L 187.447193 616.355681 -L 187.453118 612.575276 -L 187.51236 634.162667 -L 187.547906 621.895242 -L 187.601225 627.625708 -L 187.642695 614.213801 -L 187.648619 619.8599 -L 187.654543 617.641558 -L 187.690089 636.632068 -L 187.737483 622.131075 -L 187.773029 630.574682 -L 187.826348 609.043749 -L 187.844121 595.486913 -L 187.909288 609.675686 -L 187.921136 606.658906 -L 187.986304 623.209366 -L 188.027774 607.913495 -L 188.051471 589.788345 -L 188.075168 613.114394 -L 188.140335 604.034218 -L 188.152184 604.911679 -L 188.193654 579.419075 -L 188.276594 595.271497 -L 188.300291 604.661115 -L 188.323988 591.264775 -L 188.39508 597.831984 -L 188.472095 576.944015 -L 188.418777 607.533666 -L 188.513565 584.320562 -L 188.667597 617.00712 -L 188.709067 612.576472 -L 188.839401 587.108243 -L 188.946038 609.091321 -L 188.880871 584.452577 -L 188.97566 602.209964 -L 189.082297 583.946863 -L 189.10007 585.904889 -L 189.212631 605.411972 -L 189.218556 596.778992 -L 189.331117 613.93425 -L 189.277799 594.98398 -L 189.337041 609.487147 -L 189.366663 590.144863 -L 189.437754 619.991647 -L 189.449603 617.657553 -L 189.4733 634.017293 -L 189.520694 633.0735 -L 189.585862 645.870225 -L 189.698423 609.721908 -L 189.716196 616.100013 -L 189.810985 624.899066 -L 189.757666 604.911669 -L 189.834682 618.201302 -L 189.959092 603.636712 -L 189.923546 619.746358 -L 189.965016 605.622383 -L 190.09535 635.613765 -L 190.231609 609.982364 -L 190.119048 641.715162 -L 190.243458 620.399743 -L 190.249382 622.893838 -L 190.273079 606.065402 -L 190.326398 611.267793 -L 190.344171 592.242515 -L 190.415262 621.298339 -L 190.421186 616.944887 -L 190.480429 633.973326 -L 190.521899 610.756512 -L 190.533748 604.061333 -L 190.587066 624.485803 -L 190.592991 619.6736 -L 190.693704 656.651389 -L 190.640385 618.550361 -L 190.723325 635.221536 -L 190.824038 619.659091 -L 190.776644 644.341956 -L 190.829962 623.003006 -L 190.924751 644.720404 -L 190.948448 641.888169 -L 191.084707 609.762839 -L 191.132101 634.753485 -L 191.203192 625.62849 -L 191.220965 625.865106 -L 191.345375 599.270273 -L 191.452013 571.777567 -L 191.481634 583.768243 -L 191.60012 617.727575 -L 191.635666 602.210328 -L 191.64159 593.156429 -L 191.706757 626.501847 -L 191.736379 616.953383 -L 191.748227 621.689347 -L 191.819319 605.448177 -L 191.825243 605.889475 -L 191.843016 593.038339 -L 191.902259 609.075527 -L 191.93188 597.611701 -L 192.050366 622.039975 -L 192.05629 616.94459 -L 192.174776 598.801975 -L 192.085912 623.318876 -L 192.198473 601.381892 -L 192.228094 627.155679 -L 192.311035 608.849637 -L 192.38805 570.932829 -L 192.441369 589.767193 -L 192.506536 615.48484 -L 192.465066 583.993628 -L 192.55393 600.63165 -L 192.559855 592.398101 -L 192.648719 614.040479 -L 192.660568 621.437005 -L 192.71981 600.972887 -L 192.737583 602.784151 -L 192.844221 585.211713 -L 192.767205 607.35772 -L 192.867918 586.52059 -L 192.968631 613.772102 -L 192.992328 603.29611 -L 193.021949 582.534969 -L 193.075268 614.415713 -L 193.093041 606.875719 -L 193.098965 614.072723 -L 193.187829 587.605392 -L 193.193754 577.996315 -L 193.282618 610.067824 -L 193.294466 619.308394 -L 193.371482 595.243633 -L 193.383331 603.191859 -L 193.442574 582.193637 -L 193.407028 607.399813 -L 193.495892 598.755345 -L 193.578832 636.734246 -L 193.626227 629.942213 -L 193.709167 610.98888 -L 193.744712 618.890366 -L 193.756561 624.437558 -L 193.827652 612.474162 -L 193.89282 596.803237 -L 193.922441 621.375008 -L 193.93429 611.313487 -L 194.10017 639.286928 -L 194.040927 611.285822 -L 194.112018 634.331438 -L 194.218656 582.586775 -L 194.26605 588.838117 -L 194.295671 604.844128 -L 194.378611 596.072781 -L 194.467476 574.131998 -L 194.43193 601.645381 -L 194.503021 584.991559 -L 194.769614 653.756205 -L 194.787387 640.622749 -L 194.905873 589.845848 -L 194.92957 604.356907 -L 194.959192 616.760536 -L 194.941419 602.884167 -L 194.982889 604.691237 -L 194.994737 591.24833 -L 195.077677 627.98417 -L 195.089526 624.097843 -L 195.101375 633.935066 -L 195.107299 631.964519 -L 195.113223 637.54982 -L 195.154693 612.533862 -L 195.213936 628.568072 -L 195.249482 619.103154 -L 195.3028 638.529152 -L 195.308725 637.10583 -L 195.314649 639.549648 -L 195.362043 616.003582 -L 195.367968 621.367538 -L 195.433135 595.851517 -L 195.486453 603.147689 -L 195.539772 608.536027 -L 195.557545 598.138547 -L 195.569393 600.548954 -L 195.575318 597.566445 -L 195.628636 618.413265 -L 195.640485 613.393341 -L 195.747122 625.538034 -L 195.658258 612.346524 -L 195.753046 621.555527 -L 195.758971 623.066838 -L 195.770819 605.658897 -L 195.794516 607.573979 -L 195.835986 596.008489 -L 195.818214 612.894868 -L 195.907078 604.748044 -L 195.942624 625.810447 -L 195.995942 601.023261 -L 196.019639 609.019387 -L 196.031488 599.184519 -L 196.067034 613.636746 -L 196.132201 602.470117 -L 196.22699 622.015776 -L 196.250687 611.966849 -L 196.315854 619.506134 -L 196.327702 610.628024 -L 196.357324 591.835402 -L 196.422491 613.113462 -L 196.43434 605.332754 -L 196.458037 616.648777 -L 196.511355 596.287061 -L 196.546901 608.376147 -L 196.623917 633.892444 -L 196.671311 627.668382 -L 196.783873 608.753337 -L 196.789797 615.281933 -L 196.825343 604.11337 -L 196.866813 620.696827 -L 196.872737 630.793198 -L 196.920131 606.669275 -L 196.97345 622.564391 -L 197.008996 613.714675 -L 197.050466 629.154746 -L 197.05639 631.898219 -L 197.115633 610.284511 -L 197.127481 616.103648 -L 197.287437 580.302161 -L 197.299286 588.845747 -L 197.453317 622.803698 -L 197.34668 586.07884 -L 197.465166 617.485006 -L 197.477014 611.901203 -L 197.530333 642.200075 -L 197.542182 649.999049 -L 197.619197 624.531052 -L 197.731759 609.979163 -L 197.690289 635.489276 -L 197.743607 611.025065 -L 197.814699 634.649206 -L 197.76138 610.25796 -L 197.856169 625.852106 -L 197.891715 609.661634 -L 197.950958 629.962287 -L 197.96873 621.71081 -L 197.986503 604.781153 -L 198.051671 630.631584 -L 198.057595 633.88112 -L 198.110913 620.679654 -L 198.140535 622.580908 -L 198.152383 615.607253 -L 198.193853 628.728998 -L 198.235323 622.291874 -L 198.241248 630.832265 -L 198.288642 605.596831 -L 198.336036 608.965331 -L 198.371582 594.905479 -L 198.418976 619.615738 -L 198.436749 616.813559 -L 198.460446 627.8488 -L 198.484144 614.272541 -L 198.543386 620.632036 -L 198.590781 614.192952 -L 198.620402 634.199727 -L 198.632251 631.427136 -L 198.638175 635.675016 -L 198.715191 617.6594 -L 198.721115 620.46268 -L 198.732964 617.840109 -L 198.750737 627.294659 -L 198.768509 624.45721 -L 198.886995 655.76343 -L 199.052875 596.49078 -L 198.93439 663.158144 -L 199.076573 606.810105 -L 199.112118 593.917069 -L 199.147664 607.840928 -L 199.236528 623.708202 -L 199.218755 602.300423 -L 199.260225 612.713685 -L 199.301695 588.981724 -L 199.372787 600.103556 -L 199.497197 632.450935 -L 199.520894 622.753109 -L 199.633456 604.091737 -L 199.55644 625.737428 -L 199.657153 617.512341 -L 199.746017 635.694301 -L 199.674926 613.762812 -L 199.76379 617.589215 -L 199.811184 603.683559 -L 199.858579 627.093112 -L 199.870427 620.195874 -L 199.917822 605.525877 -L 199.959292 630.258133 -L 199.977064 621.226442 -L 199.982989 623.982609 -L 200.065929 611.0667 -L 200.166642 591.027922 -L 200.09555 626.158986 -L 200.184415 596.655803 -L 200.237733 617.524333 -L 200.3029 604.382541 -L 200.332522 615.460594 -L 200.379916 599.384756 -L 200.397689 604.631527 -L 200.403613 598.074886 -L 200.445083 613.64377 -L 200.504326 603.382135 -L 200.59319 608.668504 -L 200.569493 595.389447 -L 200.605039 603.91571 -L 200.670206 594.614172 -L 200.628736 606.174946 -L 200.699828 603.050043 -L 200.717601 617.184259 -L 200.800541 602.670271 -L 200.812389 610.022127 -L 200.865708 611.90894 -L 200.824238 601.759178 -L 200.883481 606.320277 -L 200.913102 593.739385 -L 200.954572 611.2159 -L 200.996042 599.090939 -L 201.161922 625.311759 -L 201.007891 592.590796 -L 201.167846 620.877565 -L 201.244862 580.414748 -L 201.286332 598.395383 -L 201.381121 625.006523 -L 201.327802 594.627899 -L 201.404818 620.743913 -L 201.458137 601.018842 -L 201.422591 620.855496 -L 201.51738 613.719628 -L 201.523304 614.919164 -L 201.541077 605.146775 -L 201.582547 606.944589 -L 201.653638 583.918309 -L 201.730654 588.520508 -L 201.872837 630.65158 -L 201.884685 628.065989 -L 202.009096 601.802812 -L 202.01502 602.208482 -L 202.050566 609.59809 -L 202.074263 600.249159 -L 202.086111 601.850783 -L 202.210521 580.654491 -L 202.216446 575.868929 -L 202.299386 594.544746 -L 202.30531 588.014924 -L 202.317159 585.869262 -L 202.453417 633.020138 -L 202.488963 639.446656 -L 202.530433 627.04674 -L 202.583752 619.498609 -L 202.613373 640.204877 -L 202.619297 639.669782 -L 202.642994 650.128563 -L 202.672616 634.796111 -L 202.773329 606.540754 -L 202.797026 610.600088 -L 202.80295 610.799727 -L 202.808875 610.520738 -L 202.868117 582.712617 -L 202.945133 590.305208 -L 202.986603 595.3438 -L 203.05177 581.235989 -L 203.128786 603.865494 -L 203.170256 597.641125 -L 203.223575 589.388187 -L 203.270969 599.026583 -L 203.318363 611.635367 -L 203.419076 626.807736 -L 203.395379 601.793829 -L 203.425001 621.189605 -L 203.460546 609.755031 -L 203.525713 625.178602 -L 203.531638 623.214365 -L 203.644199 600.085088 -L 203.656048 616.765299 -L 203.661972 616.631333 -L 203.738988 631.894053 -L 203.762685 611.660184 -L 203.780458 598.513798 -L 203.833777 627.683069 -L 203.863398 613.553067 -L 203.875247 617.538375 -L 203.934489 603.473131 -L 204.029278 588.043076 -L 203.970035 611.42074 -L 204.076672 590.298858 -L 204.189234 611.195981 -L 204.124067 585.518248 -L 204.195158 606.791358 -L 204.230704 592.884898 -L 204.30772 595.083891 -L 204.449903 629.095298 -L 204.455827 624.563734 -L 204.55654 611.174019 -L 204.503221 631.597629 -L 204.562464 614.284421 -L 204.592086 637.340607 -L 204.675026 627.231614 -L 204.757966 589.197187 -L 204.799436 603.877524 -L 204.80536 599.313663 -L 204.870527 622.570615 -L 204.894224 613.989194 -L 204.900149 622.413757 -L 204.965316 595.508324 -L 205.000861 610.196828 -L 205.01271 603.067262 -L 205.060104 629.154888 -L 205.071953 621.991278 -L 205.083801 627.270378 -L 205.148969 598.620228 -L 205.190439 578.886438 -L 205.231909 603.477629 -L 205.255606 596.183149 -L 205.34447 630.44079 -L 205.397789 620.744696 -L 205.409637 612.204577 -L 205.421486 604.236706 -L 205.480729 622.199093 -L 205.504426 620.754677 -L 205.51035 625.822626 -L 205.59329 607.590732 -L 205.599215 611.416637 -L 205.729549 587.248454 -L 205.735473 588.795598 -L 205.853959 603.1171 -L 205.859883 602.743081 -L 205.865808 597.8995 -L 205.948748 615.615628 -L 205.978369 630.760662 -L 206.037612 601.658727 -L 206.073158 583.952345 -L 206.120552 603.639521 -L 206.162022 600.390475 -L 206.244962 621.196219 -L 206.250886 622.379341 -L 206.280508 608.09161 -L 206.286432 605.728886 -L 206.333826 628.034865 -L 206.339751 626.150459 -L 206.345675 630.061159 -L 206.410842 600.055203 -L 206.428615 588.87679 -L 206.505631 617.818947 -L 206.511555 610.214052 -L 206.558949 597.301898 -L 206.594495 614.061297 -L 206.606344 613.732291 -L 206.641889 630.117906 -L 206.72483 625.42426 -L 206.742602 617.364155 -L 206.784072 637.782867 -L 206.837391 622.337439 -L 206.896634 638.084182 -L 206.93218 613.028493 -L 206.938104 617.777342 -L 206.979574 626.005451 -L 207.003271 614.840047 -L 207.068438 602.900481 -L 207.109908 618.747086 -L 207.163227 630.578473 -L 207.13953 614.524237 -L 207.192848 623.396165 -L 207.234318 611.594747 -L 207.287637 637.371028 -L 207.299486 627.144115 -L 207.329107 615.888186 -L 207.311334 628.69107 -L 207.394274 624.158816 -L 207.489063 650.330031 -L 207.518684 638.049422 -L 207.607549 616.752852 -L 207.631246 632.881965 -L 207.63717 632.967644 -L 207.643094 630.401282 -L 207.696413 651.901565 -L 207.708261 660.386754 -L 207.749732 639.329154 -L 207.76158 640.117762 -L 207.826747 616.344303 -L 207.874142 635.209327 -L 207.915612 658.15793 -L 208.028173 649.432151 -L 208.265145 590.368241 -L 208.063719 660.14661 -L 208.330312 602.992897 -L 208.4251 619.434606 -L 208.359933 595.097746 -L 208.460646 612.027427 -L 208.561359 607.173066 -L 208.537662 622.486798 -L 208.567283 610.194892 -L 208.590981 612.391423 -L 208.602829 595.711149 -L 208.614678 596.288065 -L 208.626526 584.777514 -L 208.685769 610.433572 -L 208.709466 606.894481 -L 208.715391 612.384056 -L 208.750936 588.598274 -L 208.792406 590.724485 -L 208.827952 580.910249 -L 208.881271 603.6836 -L 208.893119 598.733085 -L 209.005681 587.641099 -L 208.940514 604.265458 -L 209.011605 592.217792 -L 209.106394 613.664222 -L 209.029378 588.177344 -L 209.136015 608.285877 -L 209.159712 595.891737 -L 209.213031 613.656019 -L 209.236728 613.457131 -L 209.248577 611.642201 -L 209.355214 579.354626 -L 209.367062 589.915479 -L 209.43223 611.154156 -L 209.479624 601.550872 -L 209.59811 578.469483 -L 209.491472 604.033735 -L 209.609958 592.841029 -L 209.615883 600.544558 -L 209.704747 578.098068 -L 209.710671 584.677806 -L 209.728444 587.447794 -L 209.746217 581.115288 -L 209.752141 574.520101 -L 209.823233 599.248288 -L 209.841006 599.212971 -L 209.84693 602.121987 -L 209.870627 591.961766 -L 209.947643 598.05967 -L 210.048356 577.59394 -L 209.989113 598.220676 -L 210.077977 585.600401 -L 210.17869 612.827131 -L 210.196463 602.737556 -L 210.237933 595.373607 -L 210.255706 613.998218 -L 210.279403 606.015318 -L 210.362343 645.771662 -L 210.415662 633.871126 -L 210.575617 599.915897 -L 210.433434 634.484577 -L 210.63486 606.059544 -L 210.741497 618.118555 -L 210.658557 593.548002 -L 210.747422 610.88977 -L 210.871832 590.795174 -L 210.782967 611.657836 -L 210.877756 595.976378 -L 210.936999 577.44344 -L 210.907378 598.225589 -L 210.978469 596.355498 -L 211.268759 638.491941 -L 211.019939 590.699551 -L 211.286532 621.084478 -L 211.357623 621.858943 -L 211.405018 598.943469 -L 211.523504 625.83349 -L 211.535352 617.763371 -L 211.618292 595.141782 -L 211.653838 604.414952 -L 211.713081 628.515589 -L 211.766399 608.09047 -L 211.801945 591.788649 -L 211.867112 612.252879 -L 211.873037 611.12245 -L 211.884885 608.626316 -L 211.890809 611.330916 -L 211.914507 600.693192 -L 211.979674 623.979863 -L 211.991522 633.459682 -L 212.044841 608.22511 -L 212.074462 615.827397 -L 212.121857 625.221639 -L 212.204797 593.87984 -L 212.246267 602.852543 -L 212.269964 586.022104 -L 212.293661 587.248627 -L 212.42992 555.409192 -L 212.323283 595.802256 -L 212.435844 561.837656 -L 212.489163 589.166423 -L 212.578027 581.262815 -L 212.625421 562.856064 -L 212.690588 578.912207 -L 212.785377 617.750629 -L 212.826847 603.995936 -L 212.909787 591.771421 -L 212.92756 604.359695 -L 213.016424 618.639992 -L 212.939409 601.388715 -L 213.05197 614.929211 -L 213.075667 609.193254 -L 213.128986 629.420265 -L 213.13491 630.552984 -L 213.140834 615.3341 -L 213.241547 581.710381 -L 213.277093 590.489944 -L 213.283017 588.496315 -L 213.324487 608.67859 -L 213.330412 607.607515 -L 213.348185 617.444361 -L 213.4252 600.523138 -L 213.431125 603.204219 -L 213.454822 586.18791 -L 213.525913 606.203786 -L 213.543686 601.312669 -L 213.59108 589.273712 -L 213.626626 603.399455 -L 213.638475 602.625755 -L 213.668096 611.039756 -L 213.71549 592.59261 -L 213.727339 597.360589 -L 213.768809 590.570597 -L 213.786582 616.087509 -L 213.822128 605.728365 -L 213.916916 619.254432 -L 213.940613 614.882503 -L 213.970235 605.846048 -L 213.993932 618.422908 -L 214.011705 616.681177 -L 214.118342 643.207441 -L 214.136115 637.858346 -L 214.189434 646.235193 -L 214.159812 632.455805 -L 214.213131 634.5417 -L 214.248676 623.916307 -L 214.272374 639.692637 -L 214.325692 623.932467 -L 214.402708 628.434401 -L 214.361238 612.000151 -L 214.420481 623.249053 -L 214.527118 602.286905 -L 214.450102 632.389811 -L 214.550815 602.918945 -L 214.568588 614.117798 -L 214.63968 593.782122 -L 214.651528 595.900425 -L 214.657452 586.868844 -L 214.746317 614.862759 -L 214.80556 600.053902 -L 214.841105 621.993955 -L 214.84703 617.10953 -L 214.852954 621.660973 -L 214.906273 598.776071 -L 214.935894 600.216909 -L 215.001061 616.288904 -L 215.048455 606.984677 -L 215.161017 590.051479 -L 215.166941 593.341032 -L 215.172866 602.002001 -L 215.243957 579.942301 -L 215.273578 589.549239 -L 215.309124 574.738793 -L 215.362443 591.261479 -L 215.38614 579.948593 -L 215.409837 579.444107 -L 215.51055 599.932704 -L 215.516474 601.779626 -L 215.540171 586.370264 -L 215.569793 586.699965 -L 215.587566 578.726139 -L 215.646809 595.955172 -L 215.652733 595.187109 -L 215.765294 617.368876 -L 215.783067 606.931869 -L 215.80084 590.610322 -L 215.88378 613.317515 -L 215.889705 614.200814 -L 215.907477 606.034642 -L 215.937099 608.023762 -L 215.990417 585.377757 -L 216.055585 594.425262 -L 216.085206 614.950903 -L 216.168146 601.661056 -L 216.17407 600.473372 -L 216.21554 612.607267 -L 216.221465 612.30011 -L 216.322178 627.503042 -L 216.292556 606.309801 -L 216.334026 623.243199 -L 216.434739 586.358354 -L 216.458436 597.68075 -L 216.488058 612.75655 -L 216.523603 594.487073 -L 216.553225 578.726707 -L 216.618392 601.925218 -L 216.630241 597.247251 -L 216.653938 593.46922 -L 216.648013 599.797201 -L 216.659862 597.218357 -L 216.677635 586.347128 -L 216.742802 603.524481 -L 216.766499 597.566819 -L 216.778348 598.699762 -L 216.790196 602.510268 -L 216.831666 577.892638 -L 216.843515 581.892424 -L 216.956077 612.369509 -L 216.979774 610.71131 -L 217.050865 585.360948 -L 217.092335 601.368766 -L 217.104184 604.723165 -L 217.116032 599.879647 -L 217.121957 603.226788 -L 217.204897 634.251958 -L 217.240442 617.607197 -L 217.246367 617.690242 -L 217.258215 610.155517 -L 217.281912 630.072267 -L 217.30561 623.97084 -L 217.311534 630.403966 -L 217.382625 597.022809 -L 217.38855 599.328495 -L 217.483338 587.265508 -L 217.412247 605.403808 -L 217.495187 596.479383 -L 217.5959 607.81369 -L 217.548505 588.754348 -L 217.601824 603.734436 -L 217.702537 590.30844 -L 217.63737 610.448673 -L 217.714386 595.69277 -L 217.921736 653.019539 -L 217.933584 640.315572 -L 217.998751 657.129854 -L 218.028373 650.331779 -L 218.034297 652.903277 -L 218.09354 637.508268 -L 218.13501 646.372266 -L 218.241647 595.912262 -L 218.34236 605.706539 -L 218.271269 587.784575 -L 218.348284 602.606341 -L 218.38383 613.124869 -L 218.46677 589.510713 -L 218.520089 611.073389 -L 218.573407 591.896246 -L 218.59118 585.046167 -L 218.626726 606.850995 -L 218.685969 613.674152 -L 218.71559 602.831799 -L 218.727439 603.469036 -L 218.733363 602.979775 -L 218.739287 607.860335 -L 218.851849 629.013439 -L 218.816303 607.490299 -L 218.863698 626.110127 -L 218.887395 630.430065 -L 218.88147 621.583497 -L 218.893319 625.55631 -L 218.988108 593.590425 -L 219.023653 601.33112 -L 219.029578 606.588415 -L 219.094745 581.698919 -L 219.130291 601.139111 -L 219.148063 595.330933 -L 219.177685 614.218252 -L 219.207306 607.487608 -L 219.248776 636.000743 -L 219.325792 618.512014 -L 219.432429 603.441392 -L 219.373186 625.906282 -L 219.456126 611.04764 -L 219.462051 611.012656 -L 219.485748 595.072751 -L 219.527218 619.914228 -L 219.574612 605.393246 -L 219.687174 630.085339 -L 219.586461 604.202819 -L 219.710871 619.503351 -L 219.781962 593.129948 -L 219.752341 620.397499 -L 219.829357 610.946207 -L 219.947842 632.898144 -L 219.858978 604.889076 -L 219.989312 630.063598 -L 220.078177 605.833927 -L 220.107798 616.697325 -L 220.113723 616.692452 -L 220.22036 635.650577 -L 220.238133 629.293436 -L 220.338846 640.79154 -L 220.297375 623.676182 -L 220.356618 633.291961 -L 220.362543 633.124815 -L 220.475104 646.959225 -L 220.398088 620.114235 -L 220.481028 646.608923 -L 220.623211 600.631099 -L 220.67653 604.364515 -L 220.718 595.287985 -L 220.729849 601.999041 -L 220.848334 571.206802 -L 220.877956 572.787519 -L 221.026063 616.705471 -L 221.031987 612.870033 -L 221.055684 595.756108 -L 221.1327 622.648487 -L 221.138625 619.543768 -L 221.227489 629.650166 -L 221.162322 616.403331 -L 221.245262 624.675278 -L 221.25711 604.339265 -L 221.304505 627.249985 -L 221.357823 618.395608 -L 221.375596 598.517546 -L 221.482233 569.662959 -L 221.511855 578.781565 -L 221.659962 601.119454 -L 221.677735 602.958144 -L 221.683659 594.365763 -L 221.695508 590.870864 -L 221.731053 604.738996 -L 221.766599 599.046509 -L 221.843615 596.384472 -L 221.885085 611.804296 -L 222.027268 578.273021 -L 222.045041 583.654847 -L 222.050965 583.707461 -L 222.056889 576.538806 -L 222.127981 610.82838 -L 222.133905 608.417497 -L 222.139829 611.021329 -L 222.216845 601.077571 -L 222.293861 584.717327 -L 222.311634 603.554272 -L 222.329407 599.276086 -L 222.353104 615.01477 -L 222.394574 588.215525 -L 222.412347 592.03769 -L 222.495287 567.694878 -L 222.530832 576.970208 -L 222.596 618.972727 -L 222.542681 576.930151 -L 222.661167 591.454846 -L 222.714485 579.055792 -L 222.696713 595.601353 -L 222.773728 587.798198 -L 222.88629 595.778612 -L 222.80335 577.549888 -L 222.892214 593.646914 -L 222.898138 591.257481 -L 222.951457 606.38317 -L 222.96923 602.193505 -L 223.075867 620.402785 -L 222.992927 597.013552 -L 223.099564 619.153276 -L 223.170656 616.509794 -L 223.146958 635.820646 -L 223.188428 622.05755 -L 223.21805 629.071323 -L 223.253596 610.699292 -L 223.283217 612.184479 -L 223.336536 602.856966 -L 223.360233 618.546388 -L 223.401703 607.72625 -L 223.526113 629.269539 -L 223.4254 596.395462 -L 223.555734 626.790904 -L 223.650523 594.182797 -L 223.579432 632.676005 -L 223.686069 611.051629 -L 223.75716 628.811937 -L 223.721614 603.152274 -L 223.792706 609.657809 -L 223.79863 610.507196 -L 223.828252 599.010977 -L 223.857873 584.580736 -L 223.911192 602.60068 -L 223.928965 601.641485 -L 224.00598 619.421908 -L 224.04745 611.17382 -L 224.082996 589.78476 -L 224.17186 601.679564 -L 224.337741 662.206846 -L 224.385135 662.202995 -L 224.462151 627.515584 -L 224.509545 627.566943 -L 224.527318 644.090228 -L 224.610258 616.024744 -L 224.710971 568.998338 -L 224.746516 584.586973 -L 224.888699 608.252443 -L 224.776138 580.286341 -L 224.894624 600.082264 -L 224.965715 574.728733 -L 225.019034 587.196692 -L 225.078277 596.070624 -L 225.05458 574.359143 -L 225.107898 581.753453 -L 225.184914 576.184368 -L 225.149368 597.719782 -L 225.202687 585.659426 -L 225.250081 617.920199 -L 225.333021 614.100309 -L 225.362643 591.051284 -L 225.42781 619.953387 -L 225.433734 614.38705 -L 225.528523 603.149522 -L 225.558144 631.403697 -L 225.59369 640.117045 -L 225.712176 601.15999 -L 225.75957 619.874626 -L 225.824737 605.807116 -L 225.860283 601.173828 -L 225.907677 613.884079 -L 225.913601 609.576192 -L 226.00839 627.001683 -L 226.026163 614.38237 -L 226.097254 620.431443 -L 226.138724 607.775741 -L 226.156497 617.168601 -L 226.21574 594.216871 -L 226.227589 594.676173 -L 226.269059 583.084638 -L 226.316453 600.567918 -L 226.346074 586.671631 -L 226.446787 603.379243 -L 226.405317 580.911359 -L 226.458636 589.171438 -L 226.5475 553.490063 -L 226.618592 567.870354 -L 226.695608 601.714156 -L 226.748926 591.049344 -L 226.861488 576.438688 -L 226.766699 599.445475 -L 226.87926 586.873725 -L 227.039216 618.960072 -L 227.045141 615.609435 -L 227.051065 615.503566 -L 227.056989 617.025161 -L 227.134005 585.469634 -L 227.175475 602.237406 -L 227.193248 600.407072 -L 227.211021 612.104949 -L 227.270264 603.337684 -L 227.329506 627.154418 -L 227.353204 603.164321 -L 227.388749 617.398299 -L 227.442068 591.85278 -L 227.495387 617.054639 -L 227.560554 626.636997 -L 227.513159 608.818641 -L 227.602024 619.876205 -L 227.690888 592.358405 -L 227.732358 595.597025 -L 227.815298 606.504867 -L 227.76198 589.840888 -L 227.833071 596.400911 -L 227.916011 578.673276 -L 227.862692 598.18067 -L 227.945633 588.554276 -L 227.998951 608.588225 -L 228.070043 598.83434 -L 228.081891 600.79027 -L 228.147058 630.545806 -L 228.200377 612.532574 -L 228.21815 597.479801 -L 228.247771 625.235559 -L 228.312938 605.729895 -L 228.360333 628.013083 -L 228.443273 613.798014 -L 228.543986 589.976561 -L 228.567683 602.392803 -L 228.662471 608.929335 -L 228.626926 596.179204 -L 228.67432 600.94948 -L 228.745412 582.806792 -L 228.75726 602.225748 -L 228.792806 596.390739 -L 229.029777 631.151928 -L 228.834276 595.83433 -L 229.035702 627.426786 -L 229.183809 594.106823 -L 229.077172 637.183801 -L 229.189733 595.509899 -L 229.278598 619.340459 -L 229.237127 591.094428 -L 229.308219 611.428686 -L 229.367462 587.764911 -L 229.42078 599.054981 -L 229.450402 602.432931 -L 229.432629 595.598788 -L 229.468175 600.519247 -L 229.539266 593.234986 -L 229.592585 625.710611 -L 229.740692 577.95217 -L 229.616282 629.810777 -L 229.752541 586.885359 -L 229.847329 601.764963 -L 229.764389 584.544721 -L 229.888799 597.310109 -L 229.900648 586.009099 -L 229.989512 610.426096 -L 230.113922 630.833285 -L 230.072452 599.3074 -L 230.119847 627.941675 -L 230.125771 627.165232 -L 230.155392 634.947331 -L 230.202787 639.648426 -L 230.226484 627.232763 -L 230.232408 627.288858 -L 230.267954 607.34855 -L 230.339045 620.039233 -L 230.350894 638.929086 -L 230.410137 614.053535 -L 230.445682 623.108138 -L 230.564168 592.797184 -L 230.599714 604.456467 -L 230.611563 615.676057 -L 230.653033 594.085437 -L 230.712275 612.484912 -L 230.7182 604.027694 -L 230.783367 623.470776 -L 230.818913 608.815265 -L 230.901853 642.325633 -L 230.972944 639.873351 -L 231.026263 605.852681 -L 231.097354 609.269469 -L 231.209916 623.931243 -L 231.227689 613.692461 -L 231.281007 601.063792 -L 231.328401 614.606941 -L 231.34025 608.589832 -L 231.363947 619.651539 -L 231.429114 597.201542 -L 231.440963 600.125504 -L 231.476509 588.342562 -L 231.523903 604.36546 -L 231.5476 598.350997 -L 231.559449 603.263496 -L 231.600919 593.156103 -L 231.719405 563.404611 -L 231.731253 564.009398 -L 231.737177 563.972474 -L 231.873436 604.614772 -L 231.92083 580.118688 -L 231.950452 578.482628 -L 231.991922 589.143611 -L 232.074862 624.450759 -L 232.116332 609.409384 -L 232.276288 638.577176 -L 232.282212 634.82048 -L 232.294061 631.115997 -L 232.305909 640.809849 -L 232.371076 644.620953 -L 232.382925 631.374541 -L 232.507335 597.8799 -L 232.513259 600.530564 -L 232.548805 593.10023 -L 232.572502 606.388585 -L 232.596199 601.526423 -L 232.732458 651.544692 -L 232.744307 637.187961 -L 232.791701 597.39106 -L 232.862792 618.32884 -L 233.028672 595.069965 -L 232.910187 623.288796 -L 233.058294 605.938737 -L 233.147158 623.716831 -L 233.17678 618.934448 -L 233.182704 616.401494 -L 233.230098 625.46343 -L 233.271568 617.195165 -L 233.289341 626.805932 -L 233.336735 595.814349 -L 233.366357 598.635207 -L 233.378205 593.834169 -L 233.413751 604.524039 -L 233.443373 624.808209 -L 233.50854 600.960337 -L 233.526313 605.886587 -L 233.597404 615.124538 -L 233.644798 598.263503 -L 233.751436 621.301108 -L 233.775133 618.38235 -L 233.786981 604.480781 -L 233.88177 620.635477 -L 233.887694 615.825141 -L 233.899543 617.69426 -L 233.905467 612.445174 -L 233.929164 601.424469 -L 233.982483 631.614965 -L 234.355713 567.930115 -L 233.994332 636.135996 -L 234.367562 573.254229 -L 234.42088 583.059125 -L 234.385335 566.467349 -L 234.480123 582.308668 -L 234.557139 567.28491 -L 234.592685 580.834004 -L 234.657852 607.302893 -L 234.705246 587.11187 -L 234.728943 569.164024 -L 234.800035 590.53511 -L 234.811883 588.801842 -L 234.817808 593.642558 -L 234.865202 576.963244 -L 234.924445 591.521604 -L 234.930369 590.517498 -L 234.942218 606.21138 -L 234.948142 606.052393 -L 235.072552 622.612417 -L 235.202886 589.47937 -L 235.279902 605.271311 -L 235.321372 581.550239 -L 235.374691 607.740185 -L 235.439858 602.423636 -L 235.516874 580.307315 -L 235.457631 602.821655 -L 235.570192 585.737762 -L 235.576117 592.838938 -L 235.659057 573.964666 -L 235.670905 575.90684 -L 235.67683 572.978144 -L 235.741997 589.532044 -L 235.765694 605.099381 -L 235.836785 577.626917 -L 235.866407 574.22355 -L 235.901953 593.725198 -L 235.92565 583.550196 -L 236.038211 608.983655 -L 235.996741 581.514587 -L 236.055984 601.356712 -L 236.073757 597.460969 -L 236.127076 619.514739 -L 236.162621 613.565678 -L 236.198167 630.036808 -L 236.29888 653.929702 -L 236.233713 628.815134 -L 236.316653 646.055514 -L 236.358123 623.631473 -L 236.429214 636.79121 -L 236.435139 636.808297 -L 236.458836 616.342787 -L 236.524003 643.448708 -L 236.5477 632.718779 -L 236.642489 618.726627 -L 236.601019 633.86994 -L 236.67211 629.602021 -L 236.689883 630.483867 -L 236.683959 627.867546 -L 236.701732 628.077631 -L 236.707656 627.150155 -L 236.725429 640.806126 -L 236.731353 639.858825 -L 236.772823 645.422539 -L 236.749126 635.68928 -L 236.808369 635.986706 -L 236.938703 594.86789 -L 236.950552 595.992613 -L 237.074962 621.191018 -L 237.181599 601.791189 -L 237.187523 606.170537 -L 237.199372 617.526526 -L 237.288236 595.909857 -L 237.329706 590.615198 -L 237.400798 603.745092 -L 237.406722 599.242954 -L 237.436343 622.767635 -L 237.489662 616.992519 -L 237.531132 623.342541 -L 237.554829 609.127744 -L 237.572602 610.215065 -L 237.584451 594.511887 -L 237.661466 625.038541 -L 237.685164 618.818594 -L 237.673315 626.995457 -L 237.697012 626.990746 -L 237.702936 633.068117 -L 237.785876 614.735312 -L 237.809574 629.545401 -L 237.916211 604.051954 -L 237.933984 618.15447 -L 237.969529 610.095642 -L 238.058394 576.615632 -L 238.028772 613.79386 -L 238.099864 600.930483 -L 238.147258 612.804945 -L 238.111712 599.133941 -L 238.200577 601.618179 -L 238.206501 600.08683 -L 238.236122 616.694989 -L 238.253895 612.519519 -L 238.25982 615.286994 -L 238.336835 600.022221 -L 238.34276 607.005483 -L 238.348684 602.092115 -L 238.413851 625.707227 -L 238.437548 618.111969 -L 238.502715 630.613761 -L 238.473094 610.625592 -L 238.538261 622.52088 -L 238.63305 590.371491 -L 238.662671 598.476269 -L 238.739687 609.896239 -L 238.721914 593.438651 -L 238.775233 601.654723 -L 238.810778 588.475064 -L 238.870021 610.316268 -L 238.875946 609.690882 -L 238.88187 612.493835 -L 238.899643 601.454541 -L 238.976659 606.918765 -L 238.982583 603.961582 -L 239.053674 621.437839 -L 239.065523 628.009359 -L 239.124766 600.687947 -L 239.13069 601.704262 -L 239.148463 583.687652 -L 239.225479 607.96726 -L 239.237327 607.061176 -L 239.343964 625.135208 -L 239.249176 604.203208 -L 239.361737 618.291667 -L 239.37951 606.352506 -L 239.46245 622.791734 -L 239.474299 626.781099 -L 239.509845 606.74589 -L 239.54539 615.828801 -L 239.58686 599.443964 -L 239.616482 622.735793 -L 239.663876 606.854423 -L 239.687573 617.70402 -L 239.740892 574.114313 -L 239.746816 577.992771 -L 239.764589 566.737091 -L 239.806059 579.430027 -L 239.859378 574.369607 -L 239.87715 563.301527 -L 239.900848 586.273672 -L 239.924545 583.92984 -L 240.013409 600.588427 -L 239.96009 582.433077 -L 240.043031 592.820896 -L 240.048955 588.894911 -L 240.114122 613.113564 -L 240.167441 616.724445 -L 240.185213 602.199156 -L 240.191138 597.878739 -L 240.262229 614.935304 -L 240.274078 610.798455 -L 240.327396 633.806649 -L 240.392564 626.725614 -L 240.434034 612.255364 -L 240.463655 634.84549 -L 240.475504 633.149024 -L 240.487352 649.280269 -L 240.576217 626.851927 -L 240.605838 611.067068 -L 240.676929 629.669413 -L 240.694702 617.429367 -L 240.730248 643.112691 -L 240.825037 627.735893 -L 240.890204 605.619166 -L 240.937598 615.21347 -L 241.026462 626.716142 -L 240.96722 603.001592 -L 241.05016 620.83927 -L 241.144948 586.023609 -L 241.198267 594.595637 -L 241.227888 608.379543 -L 241.310828 603.36024 -L 241.334526 601.537323 -L 241.364147 609.114106 -L 241.441163 620.027937 -L 241.411541 603.791312 -L 241.482633 616.855315 -L 241.488557 609.32225 -L 241.559648 639.699048 -L 241.583346 627.702223 -L 241.648513 605.786209 -L 241.707756 615.458484 -L 241.820317 627.542533 -L 241.903257 612.673871 -L 241.855863 631.823608 -L 241.938803 620.697158 -L 242.122456 577.696012 -L 241.950652 625.109918 -L 242.158002 591.808241 -L 242.163926 591.968576 -L 242.16985 598.095293 -L 242.25279 571.319965 -L 242.365352 633.637785 -L 242.46014 628.503931 -L 242.471989 621.98713 -L 242.489762 643.402314 -L 242.578626 622.341076 -L 242.590475 627.07606 -L 242.614172 618.843415 -L 242.620096 615.783613 -L 242.691188 628.654775 -L 242.720809 620.740299 -L 242.738582 629.00656 -L 242.785976 604.822029 -L 242.791901 608.154352 -L 242.851143 578.963158 -L 242.803749 610.694526 -L 242.916311 599.065422 -L 243.034796 620.678039 -L 243.046645 614.59419 -L 243.052569 614.692528 -L 243.058494 620.955133 -L 243.105888 591.950019 -L 243.153282 603.736535 -L 243.230298 574.876923 -L 243.271768 593.510027 -L 243.277692 591.884225 -L 243.313238 606.521003 -L 243.348784 602.46676 -L 243.437648 613.013766 -L 243.378405 600.912094 -L 243.449497 608.295724 -L 243.556134 582.181951 -L 243.573907 583.896884 -L 243.698317 613.621537 -L 243.733863 604.877902 -L 243.75756 599.985027 -L 243.781257 619.491044 -L 243.816803 619.323228 -L 243.870121 630.914189 -L 243.852348 615.386579 -L 243.911591 618.409672 -L 243.970834 609.316222 -L 244.012304 622.915936 -L 244.024153 616.433926 -L 244.053774 627.861408 -L 244.107093 604.912776 -L 244.136714 590.876722 -L 244.184108 606.579879 -L 244.249276 623.742754 -L 244.201881 600.8164 -L 244.29667 614.703355 -L 244.349989 628.97862 -L 244.415156 609.546541 -L 244.527717 619.875289 -L 244.50402 605.475354 -L 244.533642 617.432067 -L 244.539566 617.737721 -L 244.616582 649.603015 -L 244.658052 629.424589 -L 244.6699 613.790447 -L 244.764689 636.175349 -L 244.847629 596.757629 -L 244.906872 604.89777 -L 244.995736 620.446885 -L 244.972039 599.306057 -L 245.025358 615.388796 -L 245.031282 616.10723 -L 245.04313 608.145657 -L 245.054979 612.688173 -L 245.137919 592.206838 -L 245.16754 606.87197 -L 245.173465 610.213779 -L 245.226783 592.00638 -L 245.256405 597.848904 -L 245.262329 595.586852 -L 245.286026 623.305398 -L 245.291951 627.158846 -L 245.363042 603.800111 -L 245.380815 594.187163 -L 245.463755 612.378598 -L 245.475603 620.219805 -L 245.546695 604.356122 -L 245.605938 595.986526 -L 245.641484 615.618576 -L 245.718499 625.321541 -L 245.700726 614.556946 -L 245.736272 619.353018 -L 245.742196 610.130942 -L 245.777742 631.879892 -L 245.842909 622.820938 -L 245.848834 623.211871 -L 245.860682 616.953576 -L 245.902152 605.939438 -L 245.949547 624.463165 -L 245.967319 621.727312 -L 245.979168 618.819329 -L 245.985092 619.728749 -L 246.05026 605.070279 -L 246.103578 610.662586 -L 246.121351 604.965688 -L 246.186518 620.133664 -L 246.192442 619.934343 -L 246.29908 636.578393 -L 246.204291 618.663837 -L 246.322777 629.703394 -L 246.435338 606.093492 -L 246.346474 634.332707 -L 246.46496 620.588729 -L 246.494581 632.40367 -L 246.536051 615.230089 -L 246.577521 622.131918 -L 246.648613 608.91078 -L 246.63084 624.903208 -L 246.690083 616.9695 -L 246.696007 621.104883 -L 246.731553 602.456359 -L 246.784871 607.204245 -L 246.974449 641.883122 -L 246.79672 605.565507 -L 246.998146 632.291572 -L 247.134404 604.68352 -L 247.158102 613.097473 -L 247.199572 595.856395 -L 247.229193 598.25151 -L 247.282512 591.701185 -L 247.318057 605.846572 -L 247.430619 626.451463 -L 247.442467 618.238828 -L 247.54318 599.140389 -L 247.560953 604.91963 -L 247.679439 630.057791 -L 247.632045 601.41307 -L 247.697212 626.186986 -L 247.756455 620.068018 -L 247.774228 637.480579 -L 247.792 629.937346 -L 247.797925 634.579499 -L 247.857168 605.503597 -L 247.886789 627.73113 -L 247.993426 590.812197 -L 248.017123 602.434814 -L 248.094139 615.032708 -L 248.046745 597.318387 -L 248.123761 600.015344 -L 248.289641 647.186798 -L 248.194852 599.624067 -L 248.301489 632.17158 -L 248.307414 625.017327 -L 248.384429 640.47088 -L 248.408127 628.958103 -L 248.455521 651.398028 -L 248.491067 618.826077 -L 248.508839 630.045819 -L 248.639174 599.561353 -L 248.656947 599.816311 -L 248.810978 617.122064 -L 248.92354 600.726498 -L 248.870221 621.991979 -L 248.935388 610.422329 -L 249.053874 638.027506 -L 248.947237 609.055929 -L 249.077571 628.027838 -L 249.095344 624.605194 -L 249.101268 628.421424 -L 249.148663 608.173319 -L 249.196057 633.862414 -L 249.201981 632.543264 -L 249.207906 635.487097 -L 249.2553 618.649821 -L 249.278997 622.704483 -L 249.326391 592.504818 -L 249.37971 629.679045 -L 249.486347 608.127824 -L 249.391558 630.323411 -L 249.521893 612.635576 -L 249.62853 627.151548 -L 249.569287 604.334604 -L 249.640379 624.683587 -L 249.646303 618.440468 -L 249.735167 641.629674 -L 249.853653 622.791446 -L 249.79441 642.993388 -L 249.87735 629.832038 -L 249.948442 646.093443 -L 249.978063 618.095251 -L 249.989912 608.946801 -L 250.00176 621.334721 -L 250.078776 620.877318 -L 250.108397 630.653943 -L 250.143943 614.521566 -L 250.191337 628.703228 -L 250.321672 610.202444 -L 250.274278 633.206062 -L 250.33352 611.949526 -L 250.422385 624.315524 -L 250.363142 606.190596 -L 250.440158 610.29772 -L 250.570492 589.523308 -L 250.617886 599.775173 -L 250.671205 584.753178 -L 250.683053 596.242909 -L 250.730448 596.122521 -L 250.837085 630.73054 -L 250.896328 638.648643 -L 250.931874 627.210062 -L 250.943722 626.301797 -L 250.949646 629.075381 -L 250.997041 608.267037 -L 251.020738 612.058791 -L 251.026662 610.63042 -L 251.056284 628.048286 -L 251.115527 645.353765 -L 251.156997 627.978737 -L 251.174769 632.495649 -L 251.198467 610.645228 -L 251.251785 635.678007 -L 251.29918 614.230893 -L 251.364347 636.722497 -L 251.399892 624.058666 -L 251.518378 594.767318 -L 251.67241 620.68616 -L 251.58947 586.896449 -L 251.678334 619.878783 -L 251.743501 605.448764 -L 251.773123 624.005653 -L 251.784971 620.155842 -L 251.850138 608.995928 -L 251.861987 617.958967 -L 251.873836 635.958127 -L 251.939003 606.902134 -L 251.968624 618.018238 -L 252.00417 608.606315 -L 252.063413 627.646746 -L 252.075261 621.95603 -L 252.116731 602.91669 -L 252.17005 627.35751 -L 252.175974 629.346787 -L 252.199671 618.05848 -L 252.25299 619.97373 -L 252.371476 596.418632 -L 252.395173 604.540377 -L 252.46034 621.026052 -L 252.412946 590.922861 -L 252.525507 618.395283 -L 252.537356 621.248547 -L 252.691387 589.692153 -L 252.821722 608.788402 -L 252.780252 582.827544 -L 252.827646 605.358189 -L 252.880965 588.43496 -L 252.940208 600.95225 -L 252.99945 618.402078 -L 252.969829 589.610382 -L 253.046845 598.517026 -L 253.052769 598.481706 -L 253.183103 624.890289 -L 253.112012 595.85278 -L 253.212725 609.159158 -L 253.337135 589.111592 -L 253.271968 618.841149 -L 253.360832 598.584708 -L 253.366756 599.801462 -L 253.384529 580.804654 -L 253.437848 598.380601 -L 253.538561 580.226558 -L 253.556334 587.054101 -L 253.562258 587.02227 -L 253.704441 618.258149 -L 253.734062 603.956517 -L 253.751835 590.571652 -L 253.805154 623.475524 -L 253.834775 614.539033 -L 253.846624 621.105178 -L 253.92364 603.182561 -L 253.947337 585.588571 -L 254.00658 617.912127 -L 254.018428 611.800347 -L 254.095444 636.484065 -L 254.142838 630.919334 -L 254.148762 631.406557 -L 254.166535 624.793397 -L 254.308718 595.408211 -L 254.320567 602.057768 -L 254.362037 577.911565 -L 254.33834 602.188737 -L 254.468674 590.67383 -L 254.593084 618.585056 -L 254.480523 590.336886 -L 254.604933 616.781709 -L 254.622706 608.09885 -L 254.646403 625.676633 -L 254.71157 618.409694 -L 254.723419 621.937527 -L 254.79451 604.531784 -L 254.800434 603.789406 -L 254.812283 615.048342 -L 254.824131 607.916789 -L 254.901147 619.658964 -L 254.930769 612.776431 -L 254.978163 589.958178 -L 255.04333 606.422654 -L 255.221059 580.683509 -L 255.244756 586.411422 -L 255.351393 612.493341 -L 255.286226 576.845753 -L 255.363242 606.272827 -L 255.369166 601.69407 -L 255.428409 638.783195 -L 255.475803 639.752444 -L 255.446182 637.788272 -L 255.493576 637.954159 -L 255.564668 608.947303 -L 255.517273 638.402265 -L 255.617986 629.554655 -L 255.62391 629.472062 -L 255.730548 579.895935 -L 255.766093 599.390593 -L 255.854958 617.048684 -L 255.878655 606.735266 -L 255.914201 614.039176 -L 255.961595 595.676516 -L 255.979368 584.901667 -L 256.003065 601.00779 -L 256.103778 619.208144 -L 256.080081 597.241528 -L 256.115626 609.56404 -L 256.186718 582.882639 -L 256.228188 595.277003 -L 256.234112 606.389738 -L 256.334825 592.116569 -L 256.376295 584.456003 -L 256.429614 599.776871 -L 256.435538 600.686952 -L 256.453311 590.977209 -L 256.471084 574.412441 -L 256.554024 598.73908 -L 256.559948 594.306099 -L 256.565872 589.836168 -L 256.601418 613.92805 -L 256.642888 608.50788 -L 256.654737 619.307627 -L 256.71398 603.602248 -L 256.743601 604.400709 -L 256.785071 595.242142 -L 256.83839 610.738804 -L 256.844314 608.291861 -L 256.862087 617.473998 -L 256.891708 604.662365 -L 256.92133 605.488379 -L 257.010194 589.70534 -L 257.033891 597.770112 -L 257.039815 602.578388 -L 257.104983 586.956394 -L 257.140528 594.562135 -L 257.247166 604.499874 -L 257.187923 589.357211 -L 257.264938 596.374868 -L 257.276787 581.104033 -L 257.365651 602.590872 -L 257.41897 621.935856 -L 257.50191 609.607842 -L 257.62632 587.252965 -L 257.525607 612.976925 -L 257.638169 591.534206 -L 257.644093 595.227561 -L 257.721109 581.119302 -L 257.75073 594.666854 -L 257.857367 613.187843 -L 257.774427 593.145162 -L 257.91661 608.627435 -L 257.934383 596.601918 -L 257.993626 616.574701 -L 258.023247 610.263244 -L 258.035096 603.336073 -L 258.088415 621.895102 -L 258.118036 632.135043 -L 258.100263 616.975535 -L 258.200976 623.775201 -L 258.24837 618.236799 -L 258.272068 634.35982 -L 258.301689 628.495884 -L 258.378705 632.15865 -L 258.355008 610.229956 -L 258.390553 625.621351 -L 258.449796 612.936737 -L 258.467569 633.458316 -L 258.509039 618.340771 -L 258.639374 644.428215 -L 258.645298 639.529084 -L 258.680844 624.040827 -L 258.728238 644.481579 -L 258.805254 654.206519 -L 258.746011 635.811415 -L 258.828951 635.932612 -L 258.935588 621.193153 -L 258.840799 641.739252 -L 258.953361 629.147655 -L 258.971134 636.716976 -L 259.018528 628.628137 -L 259.054074 629.125909 -L 259.148862 612.248592 -L 259.089619 632.70399 -L 259.17256 614.796207 -L 259.285121 640.415558 -L 259.308818 629.110608 -L 259.326591 629.927371 -L 259.344364 620.568731 -L 259.439153 608.40841 -L 259.391758 628.385564 -L 259.468774 609.477892 -L 259.575411 650.561182 -L 259.599108 634.992408 -L 259.605033 635.234645 -L 259.699821 607.831209 -L 259.729443 619.006747 -L 259.735367 619.039379 -L 259.788686 624.962813 -L 259.824231 612.516441 -L 259.83608 616.359925 -L 259.859777 606.255613 -L 259.883474 624.026815 -L 259.895323 635.478934 -L 259.936793 608.579428 -L 259.996036 626.576184 -L 260.155991 576.932251 -L 260.007884 629.688282 -L 260.227083 593.906164 -L 260.25078 615.659905 -L 260.345569 614.697655 -L 260.351493 617.798023 -L 260.381114 603.09109 -L 260.434433 610.258182 -L 260.523297 601.896399 -L 260.4996 615.071983 -L 260.546995 605.896373 -L 260.641783 625.005612 -L 260.66548 619.585992 -L 260.695102 613.004216 -L 260.730648 625.790625 -L 260.772118 620.622949 -L 260.813588 626.992829 -L 260.849133 602.759047 -L 260.866906 592.553029 -L 260.926149 574.214684 -L 260.991316 584.000361 -L 260.997241 584.096123 -L 261.092029 619.368204 -L 261.139423 612.763093 -L 261.186818 600.560967 -L 261.228288 625.826264 -L 261.234212 621.37057 -L 261.240136 626.651743 -L 261.317152 601.750359 -L 261.323076 602.932393 -L 261.346774 591.473999 -L 261.411941 616.014932 -L 261.453411 593.727028 -L 261.423789 618.376708 -L 261.459335 595.588207 -L 261.512654 581.797777 -L 261.565972 599.328938 -L 261.571897 600.704398 -L 261.619291 592.839136 -L 261.625215 593.857525 -L 261.631139 587.269609 -L 261.725928 602.983133 -L 261.791095 612.752816 -L 261.737777 602.296115 -L 261.826641 604.626905 -L 261.862187 585.688675 -L 261.939202 601.428224 -L 261.974748 596.727633 -L 261.992521 609.675577 -L 262.00437 605.355906 -L 262.028067 616.417019 -L 262.057688 597.471023 -L 262.111007 607.290381 -L 262.12878 603.189493 -L 262.152477 622.559193 -L 262.158401 625.492801 -L 262.193947 612.454643 -L 262.25319 618.504448 -L 262.282811 598.039806 -L 262.3776 606.684676 -L 262.395373 603.760362 -L 262.413146 616.995593 -L 262.478313 608.750649 -L 262.579026 631.341272 -L 262.531631 602.485676 -L 262.602723 628.364351 -L 262.703436 590.508951 -L 262.632344 633.97806 -L 262.733057 606.511733 -L 262.7923 615.002883 -L 262.756754 598.256605 -L 262.827846 602.563963 -L 262.83377 597.8225 -L 262.845619 612.575459 -L 262.922634 609.833427 -L 262.987802 624.405357 -L 263.011499 607.671384 -L 263.023347 609.387783 -L 263.064817 601.306732 -L 263.100363 619.579281 -L 263.118136 615.289121 -L 263.135909 617.826955 -L 263.147757 604.113546 -L 263.183303 606.361518 -L 263.224773 592.896714 -L 263.242546 614.787601 -L 263.254395 612.025491 -L 263.378805 629.528807 -L 263.355108 611.299474 -L 263.384729 626.74127 -L 263.520988 587.306107 -L 263.550609 594.945611 -L 263.58023 581.843562 -L 263.633549 588.272723 -L 263.823126 620.312634 -L 263.906066 629.117338 -L 263.882369 612.778448 -L 263.911991 622.010219 -L 263.923839 609.334996 -L 264.000855 628.884549 -L 264.018628 624.400254 -L 264.042325 632.437135 -L 264.077871 610.19031 -L 264.107492 620.750732 -L 264.143038 611.914231 -L 264.172659 628.870735 -L 264.214129 620.534404 -L 264.220054 621.075003 -L 264.225978 612.867755 -L 264.302994 577.843003 -L 264.356312 579.539264 -L 264.451101 586.666001 -L 264.397782 572.388877 -L 264.46295 581.500468 -L 264.510344 563.897386 -L 264.563662 585.277537 -L 264.569587 582.405089 -L 264.652527 607.165965 -L 264.699921 602.053608 -L 264.824331 611.720683 -L 264.747315 593.921792 -L 264.830255 608.515668 -L 264.91912 594.061727 -L 264.883574 624.457985 -L 264.942817 605.968943 -L 265.079076 633.16675 -L 264.96059 599.411464 -L 265.096848 629.108275 -L 265.16794 633.904322 -L 265.227183 613.663546 -L 265.233107 619.799588 -L 265.262729 600.232618 -L 265.321971 600.738457 -L 265.434533 590.84072 -L 265.398987 606.184597 -L 265.452306 595.705697 -L 265.517473 609.35177 -L 265.487852 589.9616 -L 265.576716 604.745827 -L 265.594489 596.063092 -L 265.66558 628.972402 -L 265.671504 628.90951 -L 265.843309 573.341872 -L 265.849233 571.461718 -L 265.884779 591.550995 -L 265.967719 606.507639 -L 266.003265 599.281291 -L 266.139523 625.77586 -L 266.032886 594.585006 -L 266.175069 623.352363 -L 266.252085 606.264077 -L 266.287631 619.264862 -L 266.335025 620.331067 -L 266.465359 581.645275 -L 266.524602 627.40107 -L 266.595694 612.914967 -L 266.601618 608.342324 -L 266.672709 631.525276 -L 266.708255 645.043428 -L 266.761574 623.731653 -L 266.779347 629.344282 -L 266.885984 610.214938 -L 266.820817 635.098788 -L 266.897832 617.931133 -L 266.903757 618.193611 -L 266.951151 644.187749 -L 267.034091 643.442719 -L 267.140728 636.82902 -L 267.099258 656.283736 -L 267.146652 637.802035 -L 267.188122 643.777907 -L 267.235517 628.143807 -L 267.318457 612.901165 -L 267.33623 632.011464 -L 267.436943 642.639813 -L 267.407321 626.359708 -L 267.448791 641.006983 -L 267.58505 594.934395 -L 267.466564 642.44946 -L 267.602823 598.022208 -L 267.632444 580.404308 -L 267.673914 606.896253 -L 267.739081 638.08239 -L 267.786476 617.252204 -L 267.804248 602.302708 -L 267.851643 619.363094 -L 267.899037 612.41815 -L 267.904961 612.404458 -L 267.934583 618.216206 -L 268.035296 593.289547 -L 268.047144 601.842946 -L 268.100463 571.742233 -L 268.112312 572.819144 -L 268.130084 567.006598 -L 268.159706 586.029127 -L 268.2071 582.073878 -L 268.213024 591.744785 -L 268.307813 565.401414 -L 268.313737 560.910722 -L 268.396677 576.501661 -L 268.609952 633.077722 -L 268.479617 569.492077 -L 268.639573 626.814894 -L 268.698816 594.151664 -L 268.758059 603.459148 -L 268.793605 623.548504 -L 268.858772 601.515424 -L 268.870621 592.758622 -L 268.894318 610.782054 -L 268.953561 607.091641 -L 269.113516 647.502816 -L 268.971333 605.767999 -L 269.154986 625.304858 -L 269.261624 614.8503 -L 269.178684 636.459992 -L 269.273472 615.213007 -L 269.320866 630.599564 -L 269.374185 613.944005 -L 269.427504 627.103872 -L 269.522292 590.578713 -L 269.628929 613.437458 -L 269.658551 608.67224 -L 269.664475 608.697115 -L 269.694097 620.771777 -L 269.747415 600.438829 -L 269.830355 591.623004 -L 269.812582 605.249374 -L 269.848128 601.658821 -L 269.954765 613.219097 -L 269.901447 590.217486 -L 269.96069 607.767757 -L 270.04363 592.430293 -L 270.008084 613.551676 -L 270.079175 594.79977 -L 270.091024 602.507877 -L 270.162115 585.225606 -L 270.16804 590.201385 -L 270.173964 581.090609 -L 270.262828 612.976008 -L 270.316147 627.936545 -L 270.351693 610.565773 -L 270.381314 619.354468 -L 270.428708 635.935197 -L 270.511649 608.788821 -L 270.523497 623.781616 -L 270.606437 594.893744 -L 270.653831 595.71769 -L 270.730847 578.634219 -L 270.878954 602.237822 -L 270.884879 597.91773 -L 270.95597 617.483222 -L 270.967819 613.789865 -L 270.991516 622.843479 -L 271.062607 607.528557 -L 271.068532 608.492896 -L 271.104077 598.826263 -L 271.139623 587.095642 -L 271.175169 609.372635 -L 271.210715 601.031163 -L 271.234412 586.399429 -L 271.293655 605.000732 -L 271.305503 601.925407 -L 271.37067 639.06762 -L 271.447686 631.762186 -L 271.477308 613.847286 -L 271.560248 625.460775 -L 271.607642 631.913994 -L 271.643188 610.83279 -L 271.649112 613.429009 -L 271.726128 592.986896 -L 271.678733 613.696766 -L 271.761674 601.744062 -L 271.814992 625.180417 -L 271.874235 616.559966 -L 271.969024 601.719966 -L 271.915705 623.781884 -L 271.992721 608.535582 -L 272.022342 603.404192 -L 272.075661 623.596779 -L 272.087509 618.671353 -L 272.093434 623.555836 -L 272.128979 609.336926 -L 272.200071 620.439979 -L 272.205995 620.258313 -L 272.324481 599.248208 -L 272.265238 626.619386 -L 272.330405 600.681296 -L 272.365951 584.47625 -L 272.407421 612.643834 -L 272.41927 606.231299 -L 272.496285 620.440835 -L 272.454815 604.349945 -L 272.525907 606.823546 -L 272.531831 606.84363 -L 272.602923 596.516966 -L 272.561453 609.140309 -L 272.644393 603.196305 -L 272.679938 591.143219 -L 272.703635 605.293805 -L 272.798424 624.883622 -L 272.816197 613.521127 -L 272.845818 605.49339 -L 272.887288 617.238148 -L 272.893213 615.709625 -L 272.899137 619.437456 -L 272.970228 598.395259 -L 272.993926 610.153403 -L 272.99985 610.064118 -L 273.023547 618.555723 -L 273.088714 596.373203 -L 273.106487 604.307336 -L 273.118336 593.062308 -L 273.183503 588.828919 -L 273.159806 609.25688 -L 273.219049 592.949256 -L 273.33161 626.150167 -L 273.242746 591.888875 -L 273.349383 623.189205 -L 273.367156 613.755239 -L 273.420474 628.824136 -L 273.45602 620.935163 -L 273.485642 628.544979 -L 273.533036 610.113004 -L 273.544884 613.71487 -L 273.598203 605.966765 -L 273.586355 616.718603 -L 273.657446 612.09251 -L 273.66337 612.116399 -L 273.728537 623.055516 -L 273.770007 615.380343 -L 273.823326 603.351483 -L 273.858872 618.969195 -L 273.882569 613.749992 -L 273.947736 606.077763 -L 273.965509 615.154066 -L 273.989206 609.116346 -L 274.054373 607.874246 -L 274.125465 632.155981 -L 274.255799 603.771761 -L 274.261723 605.834342 -L 274.273572 610.563075 -L 274.315042 593.916688 -L 274.326891 582.097543 -L 274.403906 596.131789 -L 274.433528 582.220276 -L 274.457225 610.754394 -L 274.557938 599.452738 -L 274.569786 589.114704 -L 274.629029 612.86414 -L 274.658651 604.240816 -L 274.670499 607.640475 -L 274.723818 600.001136 -L 274.729742 595.237691 -L 274.794909 615.945554 -L 274.818607 612.367207 -L 274.830455 621.643639 -L 274.866001 610.609762 -L 274.889698 610.813182 -L 274.943017 588.579603 -L 275.00226 594.477935 -L 275.04373 590.03142 -L 275.12667 619.435591 -L 275.268853 589.490053 -L 275.363641 635.379385 -L 275.411035 619.18823 -L 275.58284 661.669427 -L 275.588764 656.48165 -L 275.701326 604.900944 -L 275.736871 610.899423 -L 275.742796 609.255907 -L 275.772417 625.089064 -L 275.802039 622.695037 -L 275.825736 621.143633 -L 275.849433 627.813805 -L 275.855357 627.169008 -L 275.879054 636.842303 -L 275.9146 620.64286 -L 275.961994 625.878868 -L 276.044934 633.273027 -L 276.009389 614.493237 -L 276.068632 624.689792 -L 276.116026 606.340863 -L 276.169344 627.444528 -L 276.175269 627.889763 -L 276.193042 605.380362 -L 276.264133 633.554289 -L 276.281906 631.318046 -L 276.28783 631.988028 -L 276.293755 622.590264 -L 276.305603 625.141139 -L 276.323376 620.531132 -L 276.376695 638.010477 -L 276.394467 637.85372 -L 276.400392 640.910879 -L 276.441862 624.938443 -L 276.465559 632.831379 -L 276.49518 602.363209 -L 276.57812 621.003587 -L 276.584045 624.311335 -L 276.625515 595.299152 -L 276.655136 606.940886 -L 276.66106 601.956148 -L 276.744001 625.416286 -L 276.779546 598.792596 -L 276.868411 615.560228 -L 276.892108 628.748922 -L 276.933578 615.780711 -L 276.951351 607.910914 -L 276.986896 617.859016 -L 277.046139 611.866424 -L 277.081685 637.179184 -L 277.158701 601.525016 -L 277.206095 632.40747 -L 277.289035 630.459634 -L 277.306808 626.651814 -L 277.300884 630.593181 -L 277.312732 628.541102 -L 277.360127 613.904419 -L 277.419369 630.584108 -L 277.454915 650.111495 -L 277.549704 635.890173 -L 277.674114 614.222739 -L 277.603022 638.369888 -L 277.697811 617.124214 -L 277.804448 632.830343 -L 277.733357 601.575095 -L 277.828145 630.640474 -L 277.91701 609.978389 -L 277.857767 639.850726 -L 277.964404 623.192254 -L 277.994025 613.028736 -L 278.011798 632.287736 -L 278.029571 624.009203 -L 278.04142 634.476192 -L 278.12436 611.301677 -L 278.148057 585.92292 -L 278.2073 620.578201 -L 278.225073 612.463967 -L 278.284316 605.725003 -L 278.349483 633.844789 -L 278.355407 634.063285 -L 278.491666 592.610987 -L 278.515363 593.903157 -L 278.53906 593.688805 -L 278.645697 621.567421 -L 278.752334 605.895747 -L 278.681243 627.416352 -L 278.770107 614.851822 -L 278.835275 629.700921 -L 278.793804 603.042555 -L 278.876745 616.169765 -L 278.924139 606.784725 -L 278.935987 614.514835 -L 279.042625 629.07594 -L 278.99523 612.606482 -L 279.048549 626.66207 -L 279.072246 628.321868 -L 279.178883 605.564288 -L 279.20258 616.186237 -L 279.267748 604.630304 -L 279.291445 608.35799 -L 279.398082 624.115139 -L 279.374385 606.9636 -L 279.427703 622.225558 -L 279.451401 609.619082 -L 279.522492 623.369486 -L 279.534341 616.444116 -L 279.629129 627.600276 -L 279.605432 611.876289 -L 279.652826 623.144178 -L 279.670599 610.489916 -L 279.735766 629.522807 -L 279.741691 624.095089 -L 279.830555 651.306652 -L 279.759464 617.471271 -L 279.854252 627.655536 -L 279.872025 631.187707 -L 279.895722 624.986799 -L 279.996435 601.098418 -L 280.020132 602.053562 -L 280.114921 622.10633 -L 280.132694 604.854047 -L 280.138618 605.045463 -L 280.186012 595.126009 -L 280.239331 608.12364 -L 280.286725 619.504215 -L 280.304498 601.737507 -L 280.357817 614.639941 -L 280.381514 589.227207 -L 280.470378 603.383458 -L 280.559243 634.891408 -L 280.488151 597.102803 -L 280.594788 623.274458 -L 280.659955 626.628713 -L 280.719198 597.849772 -L 280.825836 613.652635 -L 280.754744 592.086062 -L 280.837684 605.824178 -L 280.926548 622.301681 -L 280.95617 611.398034 -L 280.962094 610.802598 -L 280.973943 617.771024 -L 281.027261 604.782962 -L 281.092429 625.243498 -L 281.116126 628.877866 -L 281.12205 617.338584 -L 281.127974 616.189025 -L 281.169444 627.933682 -L 281.210914 637.081205 -L 281.240536 622.229701 -L 281.282006 630.850773 -L 281.28793 631.683619 -L 281.305703 619.207976 -L 281.335324 623.379092 -L 281.359022 629.600371 -L 281.489356 605.167975 -L 281.518977 618.01185 -L 281.584145 604.65455 -L 281.66116 594.759707 -L 281.637463 609.792989 -L 281.696706 598.9846 -L 281.7441 593.78822 -L 281.720403 603.187474 -L 281.791495 599.567246 -L 281.838889 610.27689 -L 281.874435 593.761072 -L 281.898132 599.077553 -L 281.927753 583.48344 -L 281.975148 602.373389 -L 281.998845 599.598229 -L 282.087709 611.411084 -L 282.022542 594.714918 -L 282.117331 604.705059 -L 282.141028 583.008065 -L 282.229892 599.066246 -L 282.336529 629.800063 -L 282.360226 623.383354 -L 282.496485 596.238925 -L 282.437242 624.323428 -L 282.526107 596.841969 -L 282.644592 589.374757 -L 282.561652 610.011619 -L 282.650517 592.152155 -L 282.703835 619.846127 -L 282.7927 610.711852 -L 282.810472 600.215937 -L 282.857867 623.141399 -L 282.887488 618.622789 -L 282.976352 628.066874 -L 282.923034 610.783351 -L 283.005974 627.99347 -L 283.059293 601.403541 -L 283.12446 618.673959 -L 283.2074 629.812471 -L 283.219248 617.159541 -L 283.260718 612.862608 -L 283.231097 621.792191 -L 283.325886 617.935922 -L 283.41475 629.259434 -L 283.432523 611.247801 -L 283.45622 617.226376 -L 283.503614 598.489004 -L 283.521387 601.107167 -L 283.6221 579.597565 -L 283.645797 589.382859 -L 283.770207 632.208351 -L 283.78798 628.360656 -L 283.900542 603.834325 -L 283.918314 611.729817 -L 283.965709 629.490717 -L 284.0368 622.102043 -L 284.090119 608.002873 -L 284.137513 622.150249 -L 284.143437 621.068652 -L 284.196756 629.998887 -L 284.214529 616.787744 -L 284.238226 617.476949 -L 284.24415 613.171617 -L 284.267847 629.705867 -L 284.32709 629.044568 -L 284.374485 640.466518 -L 284.41003 623.594001 -L 284.421879 613.706002 -L 284.487046 628.866986 -L 284.516668 622.302478 -L 284.53444 635.572576 -L 284.605532 603.004986 -L 284.617381 612.724256 -L 284.629229 610.149893 -L 284.676623 625.760995 -L 284.706245 610.957705 -L 284.795109 599.593554 -L 284.753639 619.147222 -L 284.806958 612.552367 -L 284.824731 626.748036 -L 284.878049 603.842016 -L 284.913595 612.388852 -L 284.919519 612.485554 -L 284.937292 602.97165 -L 284.996535 623.178882 -L 285.020232 618.762466 -L 285.049854 626.827816 -L 285.073551 611.582017 -L 285.097248 581.100107 -L 285.180188 609.570376 -L 285.286825 618.722495 -L 285.257204 601.22104 -L 285.292749 613.618502 -L 285.411235 603.661231 -L 285.346068 618.161487 -L 285.423084 608.23383 -L 285.429008 613.075589 -L 285.452705 589.554286 -L 285.517872 600.352087 -L 285.642282 565.135407 -L 285.565267 603.023066 -L 285.660055 580.202267 -L 285.725223 593.928719 -L 285.79039 591.510481 -L 285.843708 559.668338 -L 285.908875 570.428738 -L 286.045134 609.53433 -L 286.104377 591.939986 -L 286.062907 611.922818 -L 286.157696 603.017966 -L 286.222863 617.953114 -L 286.240636 600.220614 -L 286.264333 609.762653 -L 286.341349 594.678264 -L 286.365046 606.715001 -L 286.37097 617.043517 -L 286.465759 589.346995 -L 286.483532 595.662833 -L 286.530926 575.143771 -L 286.57832 594.306972 -L 286.596093 580.299646 -L 286.66126 608.465613 -L 286.667184 608.535275 -L 286.714579 626.20072 -L 286.767897 607.020717 -L 286.779746 612.691226 -L 286.78567 612.262038 -L 286.862686 595.051334 -L 286.82714 615.021173 -L 286.898232 602.400325 -L 287.010793 628.466123 -L 286.933777 599.911527 -L 287.052263 617.823287 -L 287.141128 601.568381 -L 287.170749 607.789285 -L 287.265538 632.411977 -L 287.283311 617.811318 -L 287.301083 602.434225 -L 287.384023 620.907982 -L 287.395872 614.456827 -L 287.413645 624.804037 -L 287.472888 600.812346 -L 287.490661 603.424066 -L 287.496585 601.30738 -L 287.561752 611.633725 -L 287.585449 608.413008 -L 287.591374 609.864176 -L 287.620995 593.356589 -L 287.638768 597.449764 -L 287.662465 579.836474 -L 287.727632 599.50212 -L 287.751329 595.068566 -L 287.816497 611.412805 -L 287.763178 591.391029 -L 287.846118 593.095402 -L 287.857967 596.203979 -L 287.875739 593.894825 -L 287.970528 621.043386 -L 287.994225 613.719742 -L 288.065317 596.266427 -L 288.100862 610.059191 -L 288.12456 616.703213 -L 288.171954 597.645068 -L 288.195651 600.587645 -L 288.302288 584.818979 -L 288.237121 605.823442 -L 288.320061 589.094838 -L 288.41485 611.542732 -L 288.438547 600.436112 -L 288.444471 600.251972 -L 288.468168 610.111986 -L 288.545184 592.355122 -L 288.568881 588.172694 -L 288.574806 594.083822 -L 288.592578 604.706683 -L 288.687367 596.909627 -L 288.693291 597.066717 -L 288.699216 591.938343 -L 288.78808 609.796855 -L 288.882869 619.931913 -L 288.847323 598.854522 -L 288.906566 619.85893 -L 288.918414 622.47386 -L 288.99543 611.957709 -L 289.084294 588.385574 -L 289.102067 609.439319 -L 289.131689 603.032064 -L 289.24425 629.791785 -L 289.321266 605.828545 -L 289.273872 633.462732 -L 289.350887 626.61318 -L 289.356812 629.6359 -L 289.427903 611.018155 -L 289.433827 610.909673 -L 289.439752 612.765436 -L 289.510843 619.964506 -L 289.49307 601.307894 -L 289.552313 615.981917 -L 289.635253 580.90876 -L 289.670799 593.152441 -L 289.730042 609.557461 -L 289.78336 599.087551 -L 289.872225 584.843269 -L 289.812982 603.557319 -L 289.901846 591.653379 -L 290.008483 613.710109 -L 290.020332 612.71556 -L 290.038105 606.979273 -L 290.097348 621.631617 -L 290.233606 649.553778 -L 290.346168 623.972486 -L 290.352092 631.596542 -L 290.363941 636.342206 -L 290.417259 627.330165 -L 290.440957 628.52038 -L 290.529821 600.618433 -L 290.571291 609.241994 -L 290.600912 597.178569 -L 290.660155 624.285 -L 290.766792 634.772897 -L 290.719398 623.413039 -L 290.772717 631.967706 -L 290.814187 616.62771 -L 290.885278 622.152161 -L 290.897127 636.029428 -L 290.968218 608.25254 -L 290.99784 626.607719 -L 291.140023 607.164559 -L 291.033385 638.432647 -L 291.145947 609.595609 -L 291.252584 628.284695 -L 291.270357 615.899275 -L 291.305903 595.394373 -L 291.359221 620.620765 -L 291.382918 626.61833 -L 291.418464 600.884081 -L 291.436237 608.014788 -L 291.53695 582.246634 -L 291.572496 587.149356 -L 291.690982 611.318893 -L 291.70283 598.765295 -L 291.756149 603.031125 -L 291.779846 590.759647 -L 291.78577 591.820409 -L 291.839089 572.582104 -L 291.886483 596.90536 -L 292.123455 637.149519 -L 291.904256 595.126437 -L 292.135303 636.063579 -L 292.218243 604.285973 -L 292.307108 610.208712 -L 292.318956 613.988794 -L 292.360426 593.888334 -L 292.443366 581.152026 -L 292.395972 597.611423 -L 292.472988 588.216644 -L 292.573701 607.570092 -L 292.514458 578.070893 -L 292.591473 601.323935 -L 292.698111 595.350845 -L 292.656641 614.301475 -L 292.704035 599.914435 -L 292.715883 599.218668 -L 292.733656 604.78481 -L 292.739581 605.656969 -L 292.763278 595.770366 -L 292.792899 597.707382 -L 292.804748 596.354415 -L 292.834369 606.351054 -L 292.840294 604.103477 -L 292.905461 630.116622 -L 292.958779 621.790171 -L 293.071341 583.207297 -L 293.089114 589.074954 -L 293.154281 575.174208 -L 293.130584 590.416489 -L 293.195751 585.310822 -L 293.33201 611.815857 -L 293.343858 599.748875 -L 293.397177 619.250098 -L 293.432722 617.510313 -L 293.438647 621.625316 -L 293.491965 591.44971 -L 293.515662 599.380855 -L 293.527511 609.464073 -L 293.645997 624.72284 -L 293.574905 598.983184 -L 293.651921 620.714344 -L 293.657845 620.207934 -L 293.66377 624.440482 -L 293.675618 631.706932 -L 293.734861 611.595252 -L 293.758558 619.989945 -L 293.87112 609.448574 -L 293.800028 626.075654 -L 293.877044 613.07377 -L 293.882968 612.717038 -L 293.900741 615.187944 -L 293.95406 629.000744 -L 293.977757 607.155861 -L 293.983681 600.365379 -L 294.025151 626.787005 -L 294.072546 625.638053 -L 294.185107 593.490455 -L 294.125864 634.462392 -L 294.232501 607.480953 -L 294.309517 620.069707 -L 294.273971 605.06772 -L 294.333214 609.360557 -L 294.339139 600.848768 -L 294.433927 618.128029 -L 294.552413 653.817789 -L 294.623505 646.570817 -L 294.736066 626.194636 -L 294.74199 627.37491 -L 294.901946 577.933573 -L 294.937492 592.030493 -L 294.978962 606.820127 -L 295.002659 588.861739 -L 295.050053 594.160136 -L 295.097448 575.680536 -L 295.127069 607.577282 -L 295.168539 594.284129 -L 295.233706 620.783332 -L 295.245555 607.907405 -L 295.287025 627.160995 -L 295.340343 623.448172 -L 295.512148 582.863506 -L 295.518072 588.263382 -L 295.624709 602.580912 -L 295.559542 583.753418 -L 295.648407 596.151016 -L 295.654331 584.521131 -L 295.719498 616.022665 -L 295.743195 614.610185 -L 295.849832 635.02375 -L 295.861681 633.487007 -L 295.867605 629.81804 -L 295.885378 647.512972 -L 295.962394 635.019211 -L 295.968318 636.290814 -L 295.99794 621.848431 -L 296.009788 626.139071 -L 296.086804 595.16959 -L 296.03941 627.385517 -L 296.134198 602.377695 -L 296.181593 615.945864 -L 296.223063 593.389312 -L 296.252684 582.961383 -L 296.317851 604.97294 -L 296.424488 635.422824 -L 296.341548 597.669527 -L 296.45411 617.614038 -L 296.596293 589.030323 -L 296.483731 626.022136 -L 296.608141 601.7078 -L 296.655536 621.589155 -L 296.726627 607.39612 -L 296.839189 594.962155 -L 296.78587 609.782729 -L 296.856961 596.345692 -L 296.922129 625.900096 -L 296.886583 592.70574 -L 296.975447 604.847374 -L 297.040614 586.700599 -L 297.088009 593.056077 -L 297.111706 606.824307 -L 297.176873 582.06206 -L 297.182797 582.873938 -L 297.218343 574.336368 -L 297.265737 588.048135 -L 297.295359 579.949448 -L 297.396072 608.37855 -L 297.330905 578.725272 -L 297.431617 600.333999 -L 297.437542 594.487716 -L 297.520482 620.951069 -L 297.597498 609.189587 -L 297.61527 624.703855 -L 297.638968 612.947343 -L 297.715983 598.515461 -L 297.674513 620.560683 -L 297.757453 606.973258 -L 297.834469 619.237865 -L 297.781151 596.59534 -L 297.864091 604.381221 -L 297.952955 595.461149 -L 297.911485 612.600518 -L 297.970728 600.934246 -L 298.000349 610.473428 -L 298.029971 598.158879 -L 298.077365 599.13171 -L 298.089214 590.484046 -L 298.136608 614.929644 -L 298.142532 616.747833 -L 298.154381 602.193492 -L 298.231396 614.573805 -L 298.373579 579.647084 -L 298.379504 580.394591 -L 298.420974 597.690171 -L 298.53946 613.480595 -L 298.551308 622.697071 -L 298.557232 619.949795 -L 298.563157 626.077148 -L 298.640172 597.730215 -L 298.646097 600.885977 -L 298.78828 628.385347 -L 298.817901 614.923156 -L 298.900841 605.258185 -L 298.87122 622.654409 -L 298.930463 608.821829 -L 299.013403 643.711562 -L 299.054873 627.86644 -L 299.173358 593.651482 -L 299.191131 600.284287 -L 299.32739 638.728745 -L 299.339239 623.29993 -L 299.439951 590.492072 -L 299.475497 599.693608 -L 299.481421 607.869141 -L 299.53474 579.436187 -L 299.57621 594.267181 -L 299.588059 590.311565 -L 299.605832 601.407503 -L 299.65915 599.360098 -L 299.74209 620.613055 -L 299.694696 593.083352 -L 299.78356 614.660024 -L 299.801333 627.81391 -L 299.860576 602.78439 -L 299.872425 604.078673 -L 300.050153 633.597708 -L 299.90797 602.935074 -L 300.067926 627.637744 -L 300.162715 598.664968 -L 300.186412 615.824583 -L 300.304898 636.634428 -L 300.316746 629.853279 -L 300.441156 598.172099 -L 300.447081 604.914574 -L 300.482626 621.589708 -L 300.547793 602.35795 -L 300.666279 579.745508 -L 300.678128 583.929474 -L 300.784765 631.155833 -L 300.832159 615.036097 -L 300.849932 611.081082 -L 300.861781 631.459671 -L 300.909175 617.275338 -L 300.915099 627.483055 -L 301.009888 605.892441 -L 301.069131 609.784969 -L 301.033585 594.781991 -L 301.098752 601.18698 -L 301.104677 601.180766 -L 301.122449 607.072654 -L 301.140222 597.856704 -L 301.157995 598.115686 -L 301.223162 587.335078 -L 301.258708 605.991885 -L 301.270557 608.34624 -L 301.294254 596.61645 -L 301.306102 598.162549 -L 301.317951 594.078197 -L 301.341648 607.460049 -L 301.377194 603.67016 -L 301.489755 625.824066 -L 301.501604 618.84205 -L 301.513453 623.320312 -L 301.57862 611.186552 -L 301.643787 637.735352 -L 301.649711 637.387718 -L 301.756348 596.057895 -L 301.685257 642.558859 -L 301.774121 610.584844 -L 301.780046 611.029745 -L 301.845213 590.938977 -L 301.898531 592.725671 -L 301.957774 611.466665 -L 302.005169 588.235802 -L 302.017017 582.91882 -L 302.088109 598.337133 -L 302.182897 618.745155 -L 302.105881 593.079553 -L 302.212519 608.6136 -L 302.307307 582.443162 -L 302.348777 599.196138 -L 302.354702 598.461663 -L 302.372474 606.229811 -L 302.467263 641.589107 -L 302.514657 634.383484 -L 302.662765 593.757148 -L 302.538355 638.773704 -L 302.686462 602.453902 -L 302.816796 620.876105 -L 302.958979 593.922702 -L 302.964903 591.453525 -L 303.000449 619.05902 -L 303.030071 604.881642 -L 303.041919 624.143791 -L 303.130783 599.702026 -L 303.136708 607.046809 -L 303.249269 581.523405 -L 303.272966 594.300498 -L 303.409225 614.136487 -L 303.284815 589.689774 -L 303.415149 613.08303 -L 303.492165 639.831344 -L 303.539559 632.622175 -L 303.563257 630.052355 -L 303.592878 647.995203 -L 303.598802 653.91251 -L 303.669894 634.102241 -L 303.687667 641.509095 -L 303.794304 609.651252 -L 303.705439 643.617263 -L 303.823925 613.696837 -L 303.900941 605.141236 -L 303.942411 622.73487 -L 304.007578 614.474796 -L 303.960184 626.177732 -L 304.049048 619.924115 -L 304.060897 629.515557 -L 304.143837 608.072494 -L 304.149761 613.412855 -L 304.250474 573.928438 -L 304.28602 585.648447 -L 304.303793 588.250267 -L 304.363036 572.081966 -L 304.36896 572.064097 -L 304.41043 586.787723 -L 304.4519 567.625699 -L 304.49337 583.535677 -L 304.499294 584.728665 -L 304.53484 573.336956 -L 304.570386 579.454169 -L 304.65925 557.116112 -L 304.582234 583.267271 -L 304.694796 566.009514 -L 304.759963 556.07506 -L 304.819206 588.344402 -L 304.884373 583.466591 -L 304.872524 596.00308 -L 304.919919 586.367349 -L 305.056177 619.607231 -L 305.068026 616.418867 -L 305.168739 606.228304 -L 305.121345 621.132428 -L 305.174663 609.98648 -L 305.251679 624.055355 -L 305.2813 614.316682 -L 305.352392 583.383384 -L 305.399786 600.41819 -L 305.48865 629.610528 -L 305.547893 618.309201 -L 305.565666 614.85918 -L 305.577515 616.937526 -L 305.589363 631.711197 -L 305.672303 608.077755 -L 305.690076 621.503074 -L 305.696001 621.600966 -L 305.737471 634.888032 -L 305.790789 611.494078 -L 305.796713 613.651341 -L 305.802638 614.15644 -L 305.808562 609.393213 -L 305.932972 568.023658 -L 305.944821 574.502903 -L 305.998139 573.025212 -L 306.069231 601.421771 -L 306.152171 620.81695 -L 306.092928 601.318528 -L 306.175868 605.614508 -L 306.246959 590.979025 -L 306.193641 614.781645 -L 306.282505 606.414963 -L 306.430612 633.952733 -L 306.436537 632.896701 -L 306.49578 611.56092 -L 306.460234 633.082371 -L 306.560947 620.28368 -L 306.566871 619.672099 -L 306.584644 628.019673 -L 306.614265 623.600824 -L 306.70313 632.433093 -L 306.714978 618.535267 -L 306.7446 608.554823 -L 306.762373 619.701559 -L 306.809767 616.698533 -L 306.815691 624.915523 -L 306.892707 587.899962 -L 306.898631 591.00358 -L 306.999344 612.877695 -L 307.028966 601.474225 -L 307.100057 582.576913 -L 307.123754 606.186978 -L 307.135603 604.134908 -L 307.24224 597.628639 -L 307.218543 620.072954 -L 307.248164 600.982746 -L 307.307407 616.399595 -L 307.337029 595.513714 -L 307.342953 596.394122 -L 307.360726 580.131966 -L 307.414044 613.337462 -L 307.425893 610.373607 -L 307.455514 623.968934 -L 307.502909 607.83846 -L 307.538454 616.005133 -L 307.591773 597.429857 -L 307.651016 612.188407 -L 307.65694 616.981493 -L 307.692486 601.796124 -L 307.757653 613.046371 -L 307.775426 604.835411 -L 307.816896 616.743807 -L 307.858366 615.558151 -L 307.923533 626.739378 -L 307.887987 606.445648 -L 307.94723 611.598582 -L 307.9887 606.268657 -L 308.000549 617.144776 -L 308.065716 580.235706 -L 308.11311 597.057901 -L 308.178278 604.642167 -L 308.207899 592.909012 -L 308.237521 582.188442 -L 308.296763 604.977964 -L 308.308612 613.430316 -L 308.385628 601.937873 -L 308.391552 602.17006 -L 308.397476 597.121551 -L 308.456719 625.108883 -L 308.486341 612.490276 -L 308.604826 594.167584 -L 308.504114 619.351386 -L 308.622599 605.74003 -L 308.628524 605.76091 -L 308.693691 587.644808 -L 308.646296 613.175653 -L 308.717388 606.757571 -L 308.764782 627.805421 -L 308.812177 603.526228 -L 308.824025 607.819915 -L 308.847722 616.045641 -L 308.871419 602.568366 -L 308.983981 587.979073 -L 308.889192 607.02631 -L 308.989905 595.423442 -L 309.031375 607.659455 -L 309.090618 600.514406 -L 309.143937 584.810606 -L 309.185407 604.681152 -L 309.197255 603.755688 -L 309.20318 604.357953 -L 309.226877 598.194587 -L 309.262423 579.153707 -L 309.292044 599.220539 -L 309.333514 595.550299 -L 309.463848 623.140724 -L 309.422378 594.673698 -L 309.487545 618.424734 -L 309.540864 607.43723 -L 309.511243 631.121279 -L 309.588258 626.229427 -L 309.61788 609.894922 -L 309.688971 627.309288 -L 309.706744 621.698996 -L 309.718593 629.666837 -L 309.771911 607.811738 -L 309.795609 612.060931 -L 309.848927 592.352475 -L 309.896321 612.998297 -L 309.902246 611.048559 -L 309.99111 629.676826 -L 309.914094 602.170247 -L 310.062202 618.180618 -L 310.127369 611.124371 -L 310.15699 631.611342 -L 310.180687 652.033991 -L 310.245854 614.011068 -L 310.269552 625.617811 -L 310.305097 602.466663 -L 310.340643 601.04814 -L 310.36434 611.635307 -L 310.376189 613.256703 -L 310.40581 600.347763 -L 310.482826 607.814607 -L 310.518372 593.599044 -L 310.536145 594.648125 -L 310.542069 591.373688 -L 310.630933 626.909195 -L 310.672403 624.767228 -L 310.690176 611.107101 -L 310.755343 634.117965 -L 310.77904 626.246966 -L 310.796813 632.303454 -L 310.850132 615.119536 -L 310.879753 623.677641 -L 310.927148 632.521512 -L 311.004163 605.438278 -L 311.045633 597.172063 -L 311.098952 609.936239 -L 311.104876 616.615221 -L 311.140422 601.987618 -L 311.205589 609.651113 -L 311.235211 601.22918 -L 311.223362 613.926623 -L 311.241135 601.248898 -L 311.247059 595.917679 -L 311.276681 610.618045 -L 311.341848 603.714521 -L 311.389242 602.895695 -L 311.472182 631.014443 -L 311.578819 641.998289 -L 311.495879 622.410984 -L 311.602517 634.487211 -L 311.614365 623.782836 -L 311.673608 642.058137 -L 311.721002 624.264452 -L 311.774321 637.44178 -L 311.803942 618.934815 -L 311.82764 625.948877 -L 311.880958 609.393818 -L 311.940201 609.622163 -L 312.046838 625.607359 -L 312.011293 609.301891 -L 312.058687 622.031936 -L 312.064611 626.051836 -L 312.141627 611.496656 -L 312.153476 612.317934 -L 312.1594 606.156916 -L 312.177173 628.792098 -L 312.254188 619.220039 -L 312.28381 621.486131 -L 312.295658 610.365438 -L 312.301583 614.033347 -L 312.313431 607.459853 -L 312.348977 630.495788 -L 312.396371 619.822312 -L 312.49116 628.733582 -L 312.425993 612.94221 -L 312.508933 625.856779 -L 312.568176 605.035105 -L 312.53263 629.806693 -L 312.627419 615.402617 -L 312.65704 632.858278 -L 312.69851 610.715653 -L 312.745904 632.291232 -L 312.816996 617.147605 -L 312.834769 635.916992 -L 312.852542 629.411011 -L 312.86439 633.466042 -L 312.911784 607.754762 -L 312.923633 612.543449 -L 312.976952 601.183478 -L 313.018422 618.615965 -L 313.03027 616.017814 -L 313.048043 631.238797 -L 313.119135 605.992373 -L 313.125059 608.687498 -L 313.148756 591.096646 -L 313.202075 611.560555 -L 313.231696 609.528787 -L 313.326485 618.275785 -L 313.273166 607.134349 -L 313.332409 613.799529 -L 313.397576 601.838975 -L 313.350182 622.337697 -L 313.439046 614.98798 -L 313.44497 617.111434 -L 313.486441 592.37569 -L 313.599002 565.85331 -L 313.510138 599.475675 -L 313.652321 578.491888 -L 313.658245 582.313641 -L 313.705639 565.196472 -L 313.747109 568.68848 -L 313.753034 561.484427 -L 313.841898 585.7133 -L 313.907065 600.16119 -L 313.859671 580.240624 -L 313.954459 589.912424 -L 313.960384 587.141376 -L 314.019627 607.526953 -L 314.025551 607.000631 -L 314.061097 619.074789 -L 314.078869 602.385381 -L 314.144037 615.331502 -L 314.262522 589.856778 -L 314.209204 620.323103 -L 314.298068 591.121037 -L 314.333614 601.88648 -L 314.363235 586.070309 -L 314.404705 588.783489 -L 314.511343 608.481419 -L 314.422478 587.883694 -L 314.529115 606.320745 -L 314.552813 587.564674 -L 314.635753 602.168519 -L 314.671298 613.284413 -L 314.647601 599.133382 -L 314.736465 599.971537 -L 314.90827 578.526178 -L 314.813481 605.720447 -L 314.914194 586.861817 -L 315.044529 601.668188 -L 315.11562 592.80519 -L 315.151166 600.853459 -L 315.328894 657.76151 -L 315.340743 651.237367 -L 315.399986 610.884124 -L 315.477002 612.698297 -L 315.48885 603.240473 -L 315.589563 620.634803 -L 315.642882 600.54377 -L 315.690276 620.934871 -L 315.6962 629.004641 -L 315.743595 598.116092 -L 315.790989 615.139081 -L 315.838383 595.599533 -L 315.90355 610.663569 -L 315.94502 617.735993 -L 315.974642 604.326629 -L 315.998339 612.78213 -L 316.134598 586.298306 -L 316.146446 582.704854 -L 316.211613 597.305238 -L 316.318251 610.285904 -L 316.288629 592.811565 -L 316.324175 608.168749 -L 316.424888 589.577844 -L 316.436736 594.284332 -L 316.454509 614.718887 -L 316.543374 595.569422 -L 316.549298 587.493748 -L 316.644087 607.389073 -L 316.650011 614.21255 -L 316.703329 592.495509 -L 316.750724 606.488412 -L 316.804042 609.163783 -L 316.851437 595.271963 -L 316.857361 588.199211 -L 316.881058 603.944635 -L 316.958074 596.267159 -L 316.963998 595.253555 -L 316.987695 607.708577 -L 317.094332 620.715981 -L 317.005468 599.278178 -L 317.100257 612.152834 -L 317.129878 594.420748 -L 317.189121 623.041942 -L 317.28391 643.771496 -L 317.24244 615.430985 -L 317.32538 639.05483 -L 317.426093 609.045995 -L 317.36685 640.617158 -L 317.53273 622.803453 -L 317.538654 624.615248 -L 317.5742 604.721016 -L 317.580124 602.939914 -L 317.627518 621.656155 -L 317.645291 625.335125 -L 317.668989 608.924383 -L 317.710459 599.297312 -L 317.763777 612.25388 -L 317.840793 597.385162 -L 317.876339 630.618643 -L 317.994824 595.34314 -L 317.90596 634.113484 -L 318.000749 595.448549 -L 318.107386 612.25433 -L 318.065916 585.664346 -L 318.125159 608.267888 -L 318.172553 578.038906 -L 318.225872 599.902239 -L 318.302887 625.778971 -L 318.344357 617.220798 -L 318.350282 620.373635 -L 318.4036 595.618937 -L 318.415449 599.84162 -L 318.456919 587.252785 -L 318.516162 603.367013 -L 318.533935 592.430818 -L 318.65242 607.873309 -L 318.545783 589.334961 -L 318.658345 604.662265 -L 318.664269 603.667588 -L 318.676118 617.325838 -L 318.818301 663.216679 -L 318.830149 653.64082 -L 318.836073 655.26082 -L 318.853846 642.567956 -L 318.960483 613.717511 -L 318.972332 614.664961 -L 319.073045 635.712015 -L 319.007878 612.618668 -L 319.096742 621.734989 -L 319.102666 622.619269 -L 319.132288 612.703341 -L 319.167834 602.863168 -L 319.203379 630.46139 -L 319.221152 627.514896 -L 319.327789 641.339487 -L 319.238925 623.817366 -L 319.339638 638.818179 -L 319.434427 602.597889 -L 319.363335 639.946881 -L 319.511442 621.387663 -L 319.517367 627.938543 -L 319.600307 606.345251 -L 319.61808 618.840588 -L 319.624004 620.500944 -L 319.647701 603.260555 -L 319.683247 607.338953 -L 319.689171 603.134135 -L 319.74249 622.344024 -L 319.789884 609.793835 -L 319.843203 597.660852 -L 319.902445 618.193234 -L 320.015007 595.150039 -L 319.961688 619.26796 -L 320.026856 596.373814 -L 320.044628 590.866318 -L 320.07425 602.503697 -L 320.080174 611.121207 -L 320.163114 583.376707 -L 320.169038 587.615382 -L 320.180887 581.727666 -L 320.251978 598.171591 -L 320.263827 592.630374 -L 320.382313 629.625651 -L 320.293449 579.764716 -L 320.423783 624.6907 -L 320.512647 606.602392 -L 320.53042 616.066896 -L 320.536344 625.75585 -L 320.619284 610.676395 -L 320.631133 611.770384 -L 320.731846 598.436035 -L 320.743694 602.297411 -L 320.749619 604.205845 -L 320.797013 585.157743 -L 320.82071 591.539534 -L 320.832559 582.268171 -L 320.879953 604.957937 -L 320.897726 598.459182 -L 320.998439 625.923153 -L 321.045833 620.399827 -L 321.146546 576.545879 -L 321.19394 577.954583 -L 321.229486 566.958869 -L 321.27688 590.58797 -L 321.407215 623.014921 -L 321.419063 617.280771 -L 321.513852 603.34978 -L 321.454609 623.1057 -L 321.531625 611.48841 -L 321.590868 621.59875 -L 321.620489 603.296023 -L 321.626414 596.079867 -L 321.638262 615.49601 -L 321.721202 614.693997 -L 321.733051 605.16884 -L 321.792294 629.157189 -L 321.804142 628.590196 -L 321.827839 621.360805 -L 321.857461 631.924203 -L 321.910779 653.732342 -L 321.964098 633.875814 -L 322.029265 610.712196 -L 322.11813 626.547636 -L 322.129978 633.065105 -L 322.177372 614.323385 -L 322.218842 622.623319 -L 322.32548 598.338634 -L 322.396571 607.550443 -L 322.44989 627.435757 -L 322.509133 617.109452 -L 322.520981 621.786779 -L 322.526905 612.197929 -L 322.550603 614.407194 -L 322.592073 607.286266 -L 322.627618 629.466265 -L 322.645391 642.830832 -L 322.716483 609.17569 -L 322.757953 587.813597 -L 322.811271 610.149569 -L 322.817196 608.72443 -L 322.876438 622.231166 -L 322.840893 597.101103 -L 322.929757 612.637672 -L 322.94753 615.116433 -L 322.971227 621.445436 -L 322.989 604.33565 -L 323.048243 613.68364 -L 323.083789 592.029311 -L 323.15488 610.254193 -L 323.160804 612.864741 -L 323.225972 596.978744 -L 323.267442 587.98777 -L 323.302987 607.569426 -L 323.308912 611.293234 -L 323.350382 584.811504 -L 323.368154 585.038091 -L 323.380003 577.465442 -L 323.462943 593.136565 -L 323.498489 621.787735 -L 323.587353 603.362793 -L 323.599202 594.15395 -L 323.628823 604.947689 -L 323.69399 603.797749 -L 323.705839 610.502922 -L 323.77693 591.440907 -L 323.782855 594.510321 -L 323.865795 579.772476 -L 323.853946 595.857401 -L 323.889492 590.07301 -L 323.930962 621.268078 -L 324.031675 618.836284 -L 324.132388 595.100208 -L 324.079069 619.09747 -L 324.144236 609.594683 -L 324.162009 620.005289 -L 324.209403 600.77893 -L 324.256798 615.581955 -L 324.428602 585.556756 -L 324.286419 622.888429 -L 324.446375 594.399867 -L 324.505618 606.242044 -L 324.529315 589.661633 -L 324.576709 602.614862 -L 324.677422 590.035389 -L 324.594482 614.96958 -L 324.689271 596.586615 -L 324.801832 608.680307 -L 324.707044 595.429119 -L 324.807757 603.732597 -L 324.813681 602.993948 -L 324.82553 614.839779 -L 324.926242 617.201303 -L 324.861075 610.017634 -L 324.932167 616.481757 -L 325.026955 599.45358 -L 325.050653 605.935919 -L 325.062501 615.334725 -L 325.109895 593.637204 -L 325.151365 597.774607 -L 325.19876 586.86742 -L 325.222457 603.829491 -L 325.305397 622.056262 -L 325.24023 603.414257 -L 325.335018 609.698696 -L 325.370564 601.722604 -L 325.40611 583.283033 -L 325.477201 604.020824 -L 325.589763 656.129175 -L 325.643081 647.707502 -L 325.761567 626.104236 -L 325.832659 633.037615 -L 325.826734 619.486796 -L 325.850432 621.28779 -L 325.962993 607.011842 -L 325.897826 630.569888 -L 325.968917 608.270485 -L 326.06963 614.769293 -L 326.034084 603.62286 -L 326.075555 611.356479 -L 326.164419 593.498131 -L 326.19404 606.395689 -L 326.199965 612.562726 -L 326.253283 577.840997 -L 326.282905 591.078471 -L 326.330299 581.367311 -L 326.371769 597.123077 -L 326.383618 590.689805 -L 326.472482 614.86885 -L 326.436936 587.373092 -L 326.508028 605.096168 -L 326.513952 600.382982 -L 326.596892 620.708962 -L 326.608741 612.847499 -L 326.656135 632.208193 -L 326.709453 610.908647 -L 326.827939 592.80672 -L 326.845712 599.091891 -L 326.958274 628.658241 -L 326.857561 595.188191 -L 326.970122 621.475211 -L 327.124154 584.144562 -L 327.136002 587.980258 -L 327.165624 597.425698 -L 327.189321 577.065992 -L 327.218942 579.216494 -L 327.272261 557.737488 -L 327.319655 570.440437 -L 327.40852 594.549703 -L 327.438141 589.583623 -L 327.515157 585.029588 -L 327.556627 600.837922 -L 327.562551 602.185085 -L 327.598097 585.142968 -L 327.787674 618.711289 -L 327.805447 606.491699 -L 327.912084 584.635404 -L 327.846917 608.66835 -L 327.923933 591.674963 -L 328.077964 652.784077 -L 328.101661 646.845917 -L 328.190526 648.34212 -L 328.23792 619.189191 -L 328.368254 648.129765 -L 328.374179 648.10046 -L 328.52821 609.345533 -L 328.391951 650.657671 -L 328.540059 613.465607 -L 328.593377 635.816236 -L 328.658544 617.360948 -L 328.670393 616.543334 -L 328.688166 633.539684 -L 328.753333 600.001798 -L 328.771106 602.468475 -L 328.77703 595.781396 -L 328.865895 618.93896 -L 328.919213 632.398863 -L 328.954759 617.80353 -L 328.966608 620.484757 -L 329.06732 598.61586 -L 329.085093 602.159094 -L 329.185806 641.402127 -L 329.215428 636.349921 -L 329.322065 613.388738 -L 329.333913 622.541595 -L 329.493869 578.822573 -L 329.505718 584.385433 -L 329.582734 619.354531 -L 329.647901 602.913503 -L 329.683446 589.954873 -L 329.689371 590.156863 -L 329.695295 586.987763 -L 329.742689 610.827402 -L 329.748614 610.299735 -L 329.843402 629.085968 -L 329.861175 622.035521 -L 329.950039 603.814527 -L 329.979661 604.149669 -L 330.07445 631.503243 -L 330.092222 623.455879 -L 330.163314 591.898446 -L 330.216632 598.14668 -L 330.222557 600.022799 -L 330.258103 585.354121 -L 330.299573 591.442599 -L 330.311421 585.928925 -L 330.388437 601.5455 -L 330.394361 600.992449 -L 330.418058 609.052566 -L 330.554317 643.408037 -L 330.465453 606.843311 -L 330.560241 641.382273 -L 330.625408 658.743551 -L 330.65503 637.11844 -L 330.666878 637.16148 -L 330.814986 576.633304 -L 330.933471 594.935003 -L 330.844607 566.7597 -L 330.94532 592.649983 -L 330.951244 589.143584 -L 331.004563 610.351882 -L 331.046033 596.345868 -L 331.229686 647.688568 -L 331.27708 644.585598 -L 331.448885 595.315921 -L 331.60884 629.226393 -L 331.626613 627.467654 -L 331.632538 628.554991 -L 331.656235 619.32976 -L 331.679932 620.556275 -L 331.786569 591.040389 -L 331.851736 619.18305 -L 331.810266 589.111969 -L 331.916903 605.929029 -L 331.922828 606.054125 -L 331.928752 603.874905 -L 331.999843 587.899671 -L 331.946525 606.478312 -L 332.047238 595.992505 -L 332.053162 595.509365 -L 332.059086 598.508478 -L 332.171648 622.249684 -L 332.106481 594.673256 -L 332.183496 619.735921 -L 332.319755 587.924904 -L 332.331604 598.229257 -L 332.343452 606.150034 -L 332.390847 566.992526 -L 332.408619 567.162819 -L 332.610045 638.760933 -L 332.444165 563.911029 -L 332.692985 632.170597 -L 332.793698 620.832121 -L 332.704834 632.699148 -L 332.835168 625.642237 -L 332.858865 631.575765 -L 332.924033 619.751756 -L 332.9892 634.181179 -L 333.042518 607.72645 -L 333.048443 607.410464 -L 333.149156 592.859593 -L 333.07214 616.231952 -L 333.161004 599.931795 -L 333.178777 595.1652 -L 333.214323 614.391665 -L 333.220247 612.822307 -L 333.226171 615.458664 -L 333.27949 596.242682 -L 333.285414 597.036076 -L 333.303187 588.31658 -L 333.36243 620.286203 -L 333.469067 633.823728 -L 333.427597 612.182197 -L 333.480916 630.485829 -L 333.534234 633.600678 -L 333.605326 617.687386 -L 333.623099 607.429028 -L 333.676417 626.595377 -L 333.711963 612.619589 -L 333.717887 624.965767 -L 333.8186 607.05825 -L 333.836373 593.789315 -L 333.883767 629.691659 -L 333.913389 627.640772 -L 333.919313 628.867884 -L 333.937086 609.994432 -L 333.954859 617.588445 -L 334.002253 605.417792 -L 334.073345 609.520279 -L 334.079269 611.21612 -L 334.102966 589.853123 -L 334.120739 582.53678 -L 334.185906 600.894583 -L 334.251073 607.769216 -L 334.27477 591.911667 -L 334.286619 592.969956 -L 334.411029 615.064131 -L 334.339938 589.268768 -L 334.422878 606.83225 -L 334.428802 599.255967 -L 334.505818 613.148448 -L 334.535439 602.829297 -L 334.553212 601.348281 -L 334.570985 613.831695 -L 334.576909 613.754533 -L 334.624303 622.799746 -L 334.665773 601.249532 -L 334.671698 604.25644 -L 334.790184 579.056296 -L 334.689471 614.638519 -L 334.813881 587.044261 -L 334.932366 620.335413 -L 334.956064 610.190007 -L 334.961988 608.23429 -L 335.003458 629.847228 -L 335.009382 624.462404 -L 335.104171 646.30923 -L 335.074549 619.64013 -L 335.121944 633.955955 -L 335.157489 617.666263 -L 335.204884 635.45492 -L 335.228581 633.477444 -L 335.32337 650.322456 -L 335.252278 632.748799 -L 335.335218 637.19823 -L 335.400385 618.496684 -L 335.441855 638.10695 -L 335.44778 639.394176 -L 335.465552 619.85865 -L 335.471477 621.887384 -L 335.495174 614.942728 -L 335.536644 638.982903 -L 335.560341 636.790603 -L 335.566265 634.456672 -L 335.625508 650.546397 -L 335.649205 662.479538 -L 335.726221 645.395412 -L 335.755843 623.76973 -L 335.856556 635.057585 -L 335.933571 654.354128 -L 335.975041 647.977257 -L 336.081679 622.991359 -L 336.093527 632.016404 -L 336.23571 605.514647 -L 336.1113 635.524261 -L 336.247559 607.224752 -L 336.271256 608.125664 -L 336.27718 600.342293 -L 336.283104 604.072163 -L 336.336423 591.306915 -L 336.366044 608.023032 -L 336.40159 592.359682 -L 336.413439 590.062508 -L 336.425287 601.388045 -L 336.431212 597.510733 -L 336.508227 614.139585 -L 336.448984 593.616101 -L 336.537849 601.007282 -L 336.543773 596.420374 -L 336.597092 620.567247 -L 336.632637 605.313188 -L 336.73335 618.843145 -L 336.644486 601.837196 -L 336.739275 615.274655 -L 336.839988 598.152689 -L 336.786669 625.453256 -L 336.845912 608.633832 -L 336.964398 631.576318 -L 336.875533 607.344267 -L 336.976246 631.450226 -L 336.994019 623.34792 -L 337.100656 583.165978 -L 337.02364 631.596569 -L 337.130278 603.440864 -L 337.195445 621.166472 -L 337.219142 598.327115 -L 337.225066 595.806757 -L 337.278385 616.528008 -L 337.379098 626.67379 -L 337.331704 610.417839 -L 337.390946 620.546252 -L 337.396871 617.164184 -L 337.467962 638.844598 -L 337.485735 643.315148 -L 337.509432 617.602142 -L 337.562751 605.084792 -L 337.604221 624.364744 -L 337.610145 624.328497 -L 337.627918 634.539752 -L 337.693085 618.05836 -L 337.716782 622.550135 -L 337.823419 607.259441 -L 337.728631 624.599184 -L 337.841192 612.997633 -L 337.941905 591.243529 -L 337.858965 619.674794 -L 337.965602 606.582682 -L 337.983375 621.368849 -L 338.03077 590.257445 -L 338.036694 588.114603 -L 338.066315 613.722676 -L 338.078164 609.369905 -L 338.131483 602.92383 -L 338.208498 628.802673 -L 338.214423 625.567388 -L 338.273665 648.873924 -L 338.309211 632.545647 -L 338.374378 640.358512 -L 338.392151 629.320844 -L 338.48694 586.994402 -L 338.516561 609.863388 -L 338.522486 610.204132 -L 338.52841 608.989674 -L 338.540258 595.665237 -L 338.593577 622.293612 -L 338.640971 603.164373 -L 338.676517 590.03465 -L 338.712063 606.875637 -L 338.812776 634.187385 -L 338.836473 627.476415 -L 338.949034 584.075083 -L 338.978656 601.205796 -L 339.103066 634.595876 -L 339.126763 618.84385 -L 339.245249 606.931075 -L 339.15046 630.93664 -L 339.257097 607.212223 -L 339.263022 610.256719 -L 339.298567 593.506414 -L 339.340037 599.257115 -L 339.387432 578.200779 -L 339.470372 579.682519 -L 339.476296 578.950656 -L 339.48222 588.689473 -L 339.494069 584.074265 -L 339.529615 577.548058 -L 339.612555 600.393403 -L 339.719192 578.715607 -L 339.636252 614.031557 -L 339.736965 584.08569 -L 339.802132 605.237138 -L 339.855451 599.72829 -L 339.896921 585.86009 -L 339.920618 604.087069 -L 339.968012 597.76731 -L 340.080574 613.952837 -L 340.086498 601.400529 -L 340.187211 620.848281 -L 340.228681 639.097441 -L 340.276075 615.306323 -L 340.287924 612.768325 -L 340.299772 617.81696 -L 340.329394 636.546176 -L 340.406409 622.726901 -L 340.48935 614.048863 -L 340.436031 628.585538 -L 340.513047 622.549754 -L 340.518971 625.654748 -L 340.560441 595.893312 -L 340.584138 603.850406 -L 340.637457 616.881075 -L 340.667078 603.141174 -L 340.6967 604.711704 -L 340.726321 592.761288 -L 340.773715 609.944018 -L 340.791488 608.164843 -L 340.803337 614.56917 -L 340.874428 592.965387 -L 340.898125 607.258915 -L 340.909974 604.1494 -L 340.957368 621.010115 -L 341.004763 631.326332 -L 341.040308 616.401783 -L 341.064006 600.934444 -L 341.105476 616.409217 -L 341.146946 615.05028 -L 341.15287 615.143339 -L 341.158794 617.010755 -L 341.188416 602.169817 -L 341.241734 608.360722 -L 341.324674 627.345027 -L 341.259507 606.987151 -L 341.354296 609.653099 -L 341.36022 609.651889 -L 341.425387 586.272072 -L 341.502403 589.998016 -L 341.662359 612.228971 -L 341.668283 607.357272 -L 341.804542 585.040628 -L 341.680132 607.660914 -L 341.81639 593.000521 -L 341.928952 612.181916 -L 341.934876 605.714483 -L 341.964497 593.38713 -L 342.041513 606.988975 -L 342.154075 622.615612 -L 342.165923 614.436972 -L 342.177772 609.965604 -L 342.248863 623.946921 -L 342.254788 627.527754 -L 342.302182 592.682273 -L 342.331803 574.178956 -L 342.361425 595.389577 -L 342.420668 583.720825 -L 342.438441 581.254807 -L 342.622094 621.49152 -L 342.639866 607.893208 -L 342.699109 622.748993 -L 342.734655 616.514522 -L 342.746504 610.3062 -L 342.752428 611.728996 -L 342.758352 607.303424 -L 342.805746 627.637007 -L 342.853141 614.058307 -L 342.859065 618.213748 -L 342.912384 597.72219 -L 342.953854 610.134127 -L 342.959778 604.768898 -L 343.030869 635.585486 -L 343.042718 639.494401 -L 343.101961 618.025521 -L 343.107885 618.50845 -L 343.125658 603.49986 -L 343.15528 621.236673 -L 343.226371 606.268007 -L 343.27969 631.349378 -L 343.350781 617.470347 -L 343.386327 620.575875 -L 343.481115 594.523927 -L 343.564055 602.972066 -L 343.522585 583.201235 -L 343.599601 602.432767 -L 343.69439 632.283641 -L 343.73586 614.054989 -L 343.866194 600.31796 -L 343.77733 627.113348 -L 343.872118 601.854708 -L 343.883967 598.543023 -L 343.94321 610.733448 -L 343.972831 607.412491 -L 344.061696 633.942243 -L 344.180182 601.946883 -L 344.144636 640.898071 -L 344.186106 602.303932 -L 344.19203 602.196142 -L 344.251273 593.637675 -L 344.227576 607.897796 -L 344.304592 594.060629 -L 344.340137 613.437931 -L 344.423077 604.108236 -L 344.429002 601.630892 -L 344.44085 612.284303 -L 344.506017 610.229687 -L 344.529715 621.372033 -L 344.588957 591.204967 -L 344.600806 591.732373 -L 344.636352 577.93478 -L 344.68967 594.789785 -L 344.707443 588.576105 -L 344.802232 613.90432 -L 344.861475 610.745756 -L 344.997733 583.696778 -L 344.89702 613.161081 -L 345.015506 595.651108 -L 345.021431 596.605863 -L 345.051052 586.206255 -L 345.104371 576.495343 -L 345.145841 600.928064 -L 345.234705 593.77311 -L 345.199159 618.143571 -L 345.246554 597.403904 -L 345.258402 607.303538 -L 345.299872 582.203421 -L 345.353191 599.062096 -L 345.418358 578.96244 -L 345.370964 609.769307 -L 345.465752 592.553226 -L 345.507222 612.619245 -L 345.584238 611.238897 -L 345.602011 612.279358 -L 345.732345 578.841575 -L 345.939695 624.764864 -L 345.756042 574.752161 -L 345.969317 623.010446 -L 346.016711 609.407133 -L 346.087803 616.103957 -L 346.1115 620.6491 -L 346.135197 610.164067 -L 346.176667 614.413658 -L 346.259607 607.545356 -L 346.23591 623.935709 -L 346.283304 613.793966 -L 346.395866 631.010234 -L 346.407714 621.379603 -L 346.632837 574.287899 -L 346.703929 611.378341 -L 346.786869 604.345908 -L 346.89943 590.744002 -L 346.863884 609.569725 -L 346.905354 593.898022 -L 347.035689 623.622728 -L 346.946824 590.799761 -L 347.053462 607.015534 -L 347.059386 606.266435 -L 347.06531 613.037671 -L 347.118629 621.931088 -L 347.136402 609.138527 -L 347.171947 612.46028 -L 347.248963 603.754658 -L 347.207493 623.709882 -L 347.284509 610.576504 -L 347.373373 627.38374 -L 347.320055 603.366185 -L 347.39707 619.092333 -L 347.503708 602.399918 -L 347.515556 603.922037 -L 347.622193 633.235726 -L 347.663663 625.296971 -L 347.687361 606.309907 -L 347.776225 622.511742 -L 347.788073 631.777361 -L 347.817695 605.631963 -L 347.871014 606.957781 -L 347.882862 604.883204 -L 347.918408 619.90243 -L 347.924332 625.773882 -L 347.959878 604.180543 -L 348.025045 617.345588 -L 348.042818 609.591453 -L 348.113909 619.497111 -L 348.143531 641.05053 -L 348.196849 614.816237 -L 348.220547 624.461822 -L 348.256092 606.093283 -L 348.344957 608.859912 -L 348.350881 612.427842 -L 348.410124 589.076975 -L 348.475291 575.956176 -L 348.516761 592.731637 -L 348.587852 616.320226 -L 348.647095 611.033255 -L 348.658944 595.685731 -L 348.706338 625.144478 -L 348.753733 616.906777 -L 348.801127 638.210119 -L 348.866294 620.140393 -L 348.889991 602.43674 -L 348.990704 611.433239 -L 349.008477 620.748034 -L 349.079568 602.876827 -L 349.091417 606.843859 -L 349.10919 613.65377 -L 349.15066 597.994738 -L 349.162509 599.802029 -L 349.168433 597.701423 -L 349.239524 611.41667 -L 349.245449 611.849451 -L 349.251373 606.244713 -L 349.286919 606.807815 -L 349.369859 584.487986 -L 349.39948 598.705729 -L 349.435026 628.260568 -L 349.52389 617.415465 -L 349.666073 585.703272 -L 349.56536 620.592258 -L 349.671997 591.542442 -L 349.683846 586.902293 -L 349.713467 602.483523 -L 349.749013 608.073662 -L 349.802332 592.588588 -L 349.81418 597.209527 -L 349.962288 561.259813 -L 349.968212 563.85629 -L 349.974136 563.794268 -L 350.080773 593.071005 -L 350.015606 561.559274 -L 350.10447 589.875224 -L 350.163713 591.591122 -L 350.228881 573.369313 -L 350.240729 581.739062 -L 350.270351 569.641477 -L 350.335518 574.693351 -L 350.341442 571.834272 -L 350.412533 588.444051 -L 350.424382 582.126882 -L 350.554716 622.060511 -L 350.471776 570.781839 -L 350.602111 604.440874 -L 350.613959 594.108233 -L 350.679126 614.739645 -L 350.690975 617.501716 -L 350.726521 598.776657 -L 350.750218 605.398694 -L 350.845007 594.981984 -L 350.791688 612.853568 -L 350.862779 599.430188 -L 350.957568 626.047206 -L 350.999038 609.381316 -L 351.093827 597.879769 -L 351.046432 619.066479 -L 351.105675 607.21546 -L 351.1116 610.074887 -L 351.158994 586.066437 -L 351.170842 588.778585 -L 351.188615 581.748767 -L 351.265631 599.730203 -L 351.301177 587.326964 -L 351.336723 604.899251 -L 351.378193 630.014589 -L 351.44336 603.900584 -L 351.461133 596.583334 -L 351.502603 619.565958 -L 351.5263 614.767829 -L 351.632937 627.993873 -L 351.591467 608.472217 -L 351.638861 625.368006 -L 351.644786 618.127515 -L 351.698104 634.471601 -L 351.739574 625.386864 -L 351.763271 638.925604 -L 351.834363 616.43354 -L 351.917303 625.965479 -L 351.964697 601.358333 -L 352.006167 620.275137 -L 352.012091 625.357525 -L 352.071334 606.340479 -L 352.095032 612.428692 -L 352.154274 597.372865 -L 352.18982 621.321309 -L 352.201669 609.009333 -L 352.237214 619.704777 -L 352.302382 601.731817 -L 352.31423 605.898383 -L 352.349776 591.231366 -L 352.391246 602.559142 -L 352.432716 594.019366 -L 352.468262 613.138961 -L 352.491959 600.254532 -L 352.527505 613.235393 -L 352.586748 598.463927 -L 352.598596 603.983557 -L 352.634142 592.720226 -L 352.681536 612.34539 -L 352.699309 607.656768 -L 352.705233 607.577405 -L 352.711158 603.440374 -L 352.794098 617.625796 -L 352.823719 630.279243 -L 352.877038 614.859997 -L 352.989599 588.003473 -L 353.001448 591.568209 -L 353.066615 598.829859 -L 353.036993 582.542791 -L 353.108085 593.226647 -L 353.114009 586.403919 -L 353.196949 608.667933 -L 353.273965 635.845457 -L 353.303586 606.671007 -L 353.368754 593.962454 -L 353.410224 608.215201 -L 353.416148 603.119432 -L 353.457618 614.229205 -L 353.499088 600.81207 -L 353.528709 594.932832 -L 353.570179 607.469969 -L 353.61165 623.265427 -L 353.664968 585.776954 -L 353.73606 605.613058 -L 353.682741 584.783329 -L 353.795302 593.944915 -L 353.801227 586.618571 -L 353.866394 616.920128 -L 353.90194 597.607982 -L 354.002653 624.593893 -L 353.925637 595.477997 -L 354.038198 614.368385 -L 354.156684 595.433769 -L 354.162608 599.627492 -L 354.304791 573.973299 -L 354.387731 613.245348 -L 354.429201 603.969192 -L 354.44105 611.300874 -L 354.506217 582.502809 -L 354.512141 582.103449 -L 354.529914 587.407225 -L 354.547687 584.433687 -L 354.642476 627.704416 -L 354.695794 624.840683 -L 354.755037 612.419645 -L 354.796507 628.28215 -L 354.808356 638.703227 -L 354.873523 606.504939 -L 354.903144 593.34395 -L 354.944615 610.40247 -L 354.986085 602.9265 -L 354.997933 601.636892 -L 355.057176 587.726506 -L 355.069025 607.975749 -L 355.098646 605.31917 -L 355.199359 628.237193 -L 355.217132 623.085614 -L 355.300072 611.04641 -L 355.276375 625.085685 -L 355.335618 616.170499 -L 355.35339 611.99649 -L 355.471876 589.686852 -L 355.377088 629.501951 -L 355.489649 593.622114 -L 355.637756 624.75808 -L 355.519271 587.472316 -L 355.661453 619.600773 -L 355.667378 609.321266 -L 355.732545 635.36732 -L 355.774015 616.680074 -L 355.886576 585.361638 -L 355.803636 620.466128 -L 355.910274 593.814475 -L 356.010987 630.848418 -L 356.034684 619.143543 -L 356.064305 607.139518 -L 356.099851 618.178956 -L 356.105775 627.302299 -L 356.135397 607.713397 -L 356.206488 624.496402 -L 356.224261 613.75734 -L 356.283504 637.937894 -L 356.307201 629.828171 -L 356.31905 634.377376 -L 356.366444 613.457464 -L 356.372368 613.974629 -L 356.378292 612.439854 -L 356.437535 623.682388 -L 356.455308 618.730271 -L 356.502703 639.867409 -L 356.556021 608.592838 -L 356.603415 611.944933 -L 356.621188 592.2625 -L 356.638961 594.739697 -L 356.65081 590.719383 -L 356.680431 613.630154 -L 356.69228 611.733078 -L 356.739674 630.467397 -L 356.792993 614.624956 -L 356.840387 592.495837 -L 356.911478 604.186573 -L 356.970721 592.955375 -L 356.935176 607.828239 -L 357.041813 595.966515 -L 357.053661 600.579049 -L 357.095131 593.590078 -L 357.118829 594.880847 -L 357.154374 566.730788 -L 357.225466 586.259413 -L 357.349876 607.825653 -L 357.48021 639.016326 -L 357.497983 618.236915 -L 357.574999 601.663885 -L 357.533529 628.791978 -L 357.616469 610.361806 -L 357.622393 615.102794 -L 357.64609 597.484789 -L 357.711257 599.648907 -L 357.859365 616.087973 -L 357.734955 592.013675 -L 357.871213 613.395983 -L 357.924532 602.990912 -L 357.966002 623.590466 -L 358.066715 646.232393 -L 358.078563 631.966531 -L 358.102261 622.041957 -L 358.167428 633.618281 -L 358.185201 632.249508 -L 358.191125 632.16456 -L 358.214822 625.30376 -L 358.268141 642.317145 -L 358.291838 637.886675 -L 358.315535 645.184812 -L 358.351081 629.117947 -L 358.439945 607.751767 -L 358.469566 618.494647 -L 358.582128 607.364541 -L 358.505112 632.83931 -L 358.588052 613.806409 -L 358.611749 626.419091 -L 358.676917 603.341428 -L 358.742084 584.751483 -L 358.694689 604.192082 -L 358.789478 599.6336 -L 358.884267 633.837614 -L 358.830948 598.823384 -L 358.919812 613.944922 -L 359.050147 584.432743 -L 359.156784 608.826005 -L 359.079768 582.088233 -L 359.168633 602.28974 -L 359.210103 597.960739 -L 359.227875 615.794838 -L 359.257497 609.790136 -L 359.411528 632.357968 -L 359.27527 599.812388 -L 359.429301 625.868287 -L 359.470771 623.863551 -L 359.506317 631.021361 -L 359.512241 630.018955 -L 359.535938 641.513427 -L 359.595181 623.590024 -L 359.60703 625.271789 -L 359.707743 605.907747 -L 359.636651 627.500778 -L 359.725516 610.034744 -L 359.743289 621.965836 -L 359.796607 597.129822 -L 359.820304 606.517384 -L 359.891396 611.394843 -L 359.944714 591.112839 -L 359.950639 588.974054 -L 360.003957 603.389917 -L 360.009882 602.349649 -L 360.086897 606.47319 -L 360.057276 591.831633 -L 360.10467 598.752301 -L 360.18761 564.548939 -L 360.235005 586.609553 -L 360.347566 602.748952 -L 360.27055 581.888832 -L 360.365339 591.789398 -L 360.4779 577.464678 -L 360.483825 582.964342 -L 360.608235 610.655603 -L 360.614159 604.732432 -L 360.738569 590.935316 -L 360.756342 601.076453 -L 360.833358 619.688383 -L 360.862979 599.062434 -L 360.868903 607.62405 -L 360.993314 590.871915 -L 360.951844 617.178891 -L 361.005162 593.305825 -L 361.076254 611.976693 -L 361.117724 595.553121 -L 361.135496 602.382162 -L 361.165118 586.159853 -L 361.171042 579.202167 -L 361.212512 602.199299 -L 361.265831 592.116796 -L 361.396165 633.879625 -L 361.419862 626.801649 -L 361.455408 604.959251 -L 361.538348 622.946754 -L 361.627212 642.177733 -L 361.585742 621.990895 -L 361.656834 635.76711 -L 361.793093 595.212858 -L 361.917503 606.783547 -L 362.006367 620.820886 -L 361.98267 600.952368 -L 362.02414 608.412431 -L 362.124853 613.403379 -L 362.142626 601.31506 -L 362.255187 622.640646 -L 362.290733 615.894529 -L 362.31443 603.684043 -L 362.308506 616.055169 -L 362.391446 608.460615 -L 362.39737 620.376917 -L 362.486234 578.090546 -L 362.504007 589.686407 -L 362.56325 568.213624 -L 362.581023 575.7136 -L 362.592872 569.472059 -L 362.663963 594.500494 -L 362.669887 593.201594 -L 362.68766 606.123794 -L 362.693584 600.234606 -L 362.758752 631.735405 -L 362.81207 628.863585 -L 362.900935 596.928083 -L 362.93648 611.527906 -L 363.001647 626.695477 -L 363.031269 612.003958 -L 363.049042 597.524125 -L 363.078663 631.67864 -L 363.137906 613.413706 -L 363.232695 591.224427 -L 363.149755 622.176487 -L 363.26824 605.14356 -L 363.357105 625.744286 -L 363.303786 604.542617 -L 363.380802 613.599306 -L 363.404499 620.178893 -L 363.440045 601.254551 -L 363.445969 601.802979 -L 363.552606 594.818182 -L 363.528909 603.97714 -L 363.558531 596.17551 -L 363.647395 621.169263 -L 363.570379 596.011198 -L 363.677016 602.900126 -L 363.742184 586.990945 -L 363.771805 606.814047 -L 363.789578 596.341484 -L 363.913988 574.01696 -L 363.955458 586.253878 -L 364.068019 612.803448 -L 364.014701 579.69968 -L 364.091717 596.283006 -L 364.097641 594.766603 -L 364.133187 608.298445 -L 364.174657 599.280109 -L 364.27537 621.456339 -L 364.198354 595.253824 -L 364.293142 609.093626 -L 364.340537 602.939439 -L 364.310915 613.861194 -L 364.405704 603.761243 -L 364.464947 600.98738 -L 364.52419 615.955938 -L 364.577508 594.088648 -L 364.630827 604.986616 -L 364.743388 632.151803 -L 364.749313 626.879045 -L 364.909269 590.513515 -L 364.761161 628.228802 -L 364.915193 593.810968 -L 365.027754 605.745277 -L 364.956663 593.785318 -L 365.033679 603.776833 -L 365.039603 601.824817 -L 365.0633 620.49931 -L 365.081073 619.64809 -L 365.092921 630.01133 -L 365.14624 601.613423 -L 365.164013 602.378887 -L 365.276574 581.253073 -L 365.282499 583.632068 -L 365.341742 606.32164 -L 365.400985 597.909081 -L 365.406909 596.858188 -L 365.430606 609.05594 -L 365.43653 607.374987 -L 365.495773 634.580257 -L 365.56094 622.979825 -L 365.584637 629.679278 -L 365.626107 613.937545 -L 365.661653 619.849179 -L 365.673502 608.483322 -L 365.720896 635.198683 -L 365.76829 621.542054 -L 365.85123 630.535682 -L 365.803836 618.595355 -L 365.857155 625.291669 -L 365.951943 596.240707 -L 365.975641 604.934556 -L 365.981565 604.434243 -L 365.987489 607.56856 -L 366.034883 628.695859 -L 366.088202 596.872899 -L 366.129672 582.481536 -L 366.159293 600.039553 -L 366.194839 593.227237 -L 366.319249 636.081633 -L 366.325174 626.190548 -L 366.396265 582.800091 -L 366.461432 599.510734 -L 366.479205 611.499613 -L 366.544372 598.100093 -L 366.585842 609.760738 -L 366.615464 598.844656 -L 366.674707 631.172652 -L 366.680631 627.157279 -L 366.757647 605.1485 -L 366.805041 618.738611 -L 366.893905 644.114801 -L 366.834662 616.90841 -L 366.953148 638.681394 -L 366.970921 641.012901 -L 366.976845 638.26671 -L 367.119028 591.857911 -L 367.184195 612.27709 -L 367.23159 602.014729 -L 367.284908 585.880372 -L 367.320454 603.811868 -L 367.338227 601.091639 -L 367.421167 629.509718 -L 367.456713 615.312868 -L 367.462637 618.038255 -L 367.52188 602.162514 -L 367.539653 606.713021 -L 367.551501 601.074964 -L 367.616669 620.10417 -L 367.634441 613.629356 -L 367.64629 622.752038 -L 367.681836 589.378229 -L 367.717381 600.376357 -L 367.764776 592.621972 -L 367.752927 604.601689 -L 367.824019 599.072647 -L 367.871413 615.206404 -L 367.93658 605.79145 -L 367.972126 590.117238 -L 368.031369 609.830382 -L 368.049142 602.523898 -L 368.191325 628.989096 -L 368.22687 626.328129 -L 368.315735 618.466564 -L 368.327583 630.843481 -L 368.339432 634.378226 -L 368.345356 632.853944 -L 368.39275 632.900495 -L 368.463842 617.90427 -L 368.540858 649.888697 -L 368.588252 643.355861 -L 368.611949 652.680789 -L 368.683041 628.861367 -L 368.688965 631.911795 -L 368.813375 594.867426 -L 368.831148 606.552974 -L 368.837072 607.001481 -L 368.854845 600.227728 -L 368.860769 597.506032 -L 368.872618 610.83933 -L 368.949634 605.74858 -L 368.955558 609.940104 -L 369.032574 588.912186 -L 369.038498 590.743206 -L 369.275469 644.689346 -L 369.340637 622.016738 -L 369.346561 621.639468 -L 369.352485 623.394828 -L 369.35841 622.575243 -L 369.370258 635.234942 -L 369.453198 607.112578 -L 369.459122 614.011366 -L 369.536138 606.749891 -L 369.494668 620.533202 -L 369.542062 610.550612 -L 369.577608 623.851754 -L 369.6487 614.529387 -L 369.666473 602.518089 -L 369.702018 621.776417 -L 369.749413 621.283598 -L 369.755337 625.161184 -L 369.796807 587.291288 -L 369.826428 602.863287 -L 369.891596 588.250046 -L 369.927141 609.061363 -L 369.933066 608.962761 -L 369.968611 626.022794 -L 369.998233 595.123922 -L 370.004157 588.463864 -L 370.069324 612.568336 -L 370.087097 608.931866 -L 370.134491 634.952891 -L 370.193734 604.962502 -L 370.282599 594.334568 -L 370.223356 614.032514 -L 370.306296 600.285108 -L 370.371463 611.02787 -L 370.401084 593.883645 -L 370.430706 584.220757 -L 370.454403 601.680816 -L 370.578813 625.674222 -L 370.4781 599.716457 -L 370.584737 615.342864 -L 370.608434 610.40648 -L 370.649905 623.817392 -L 370.679526 620.194635 -L 370.756542 596.455451 -L 370.691375 622.547957 -L 370.815785 610.411878 -L 370.85133 629.532836 -L 370.910573 608.703541 -L 371.01721 584.880965 -L 370.952043 610.308378 -L 371.034983 586.659587 -L 371.171242 623.943318 -L 371.183091 621.07099 -L 371.218636 608.567997 -L 371.236409 624.69508 -L 371.289728 621.86307 -L 371.295652 621.768586 -L 371.366743 636.10817 -L 371.420062 633.603349 -L 371.526699 605.273202 -L 371.467456 638.282961 -L 371.562245 618.724289 -L 371.668882 641.254097 -L 371.686655 627.922906 -L 371.728125 619.775272 -L 371.763671 645.333201 -L 371.793292 628.004736 -L 371.816989 627.112655 -L 371.822914 635.426058 -L 371.840687 632.15598 -L 371.846611 636.875293 -L 371.911778 610.987918 -L 371.971021 594.119096 -L 372.02434 597.64853 -L 372.178371 637.625881 -L 372.249463 601.456791 -L 372.31463 628.176146 -L 372.344251 642.275053 -L 372.39757 623.91661 -L 372.444964 577.51547 -L 372.516056 603.209412 -L 372.610844 622.639861 -L 372.664163 619.407378 -L 372.717481 634.551438 -L 372.776724 614.155093 -L 372.81227 621.866371 -L 372.859664 602.696617 -L 372.97815 584.775277 -L 373.043317 600.347003 -L 373.084787 592.22767 -L 373.090712 584.401553 -L 373.173652 615.228436 -L 373.179576 612.249226 -L 373.286213 591.716568 -L 373.238819 614.522033 -L 373.333607 592.066584 -L 373.375077 612.367578 -L 373.452093 600.612888 -L 373.499487 575.608109 -L 373.55873 601.582289 -L 373.570579 597.107316 -L 373.588352 594.364766 -L 373.594276 600.419066 -L 373.677216 625.210841 -L 373.718686 621.603926 -L 373.748308 624.359962 -L 373.783853 611.780472 -L 373.789778 613.368753 -L 373.801626 607.714754 -L 373.854945 625.648775 -L 373.896415 611.39362 -L 374.003052 630.362723 -L 373.914188 603.256456 -L 374.044522 629.214865 -L 374.056371 623.866373 -L 374.121538 643.202974 -L 374.139311 639.683902 -L 374.145235 640.630185 -L 374.163008 627.995455 -L 374.269645 622.739339 -L 374.234099 643.853278 -L 374.275569 624.225327 -L 374.317039 629.635495 -L 374.423677 612.486607 -L 374.530314 625.569185 -L 374.476995 602.431747 -L 374.548087 620.534433 -L 374.631027 580.262413 -L 374.672497 606.88761 -L 374.702118 620.078112 -L 374.725815 601.419184 -L 374.743588 608.560395 -L 374.785058 593.785895 -L 374.850225 613.096585 -L 374.950938 626.049371 -L 374.915393 609.233087 -L 374.962787 616.972739 -L 375.045727 619.29014 -L 375.110894 593.640088 -L 375.181986 610.576086 -L 375.152364 592.749251 -L 375.217531 596.252135 -L 375.235304 589.409639 -L 375.294547 620.156804 -L 375.300471 617.390093 -L 375.31232 618.323031 -L 375.324168 605.890214 -L 375.371563 593.580746 -L 375.359714 609.462448 -L 375.424881 605.848322 -L 375.460427 620.070482 -L 375.531519 604.101605 -L 375.537443 607.871745 -L 375.608534 626.801665 -L 375.584837 605.986875 -L 375.655929 610.669809 -L 375.673702 605.655187 -L 375.697399 619.920828 -L 375.756642 612.007699 -L 375.863279 628.360812 -L 375.875127 622.457586 -L 375.999537 591.516176 -L 376.005462 594.771894 -L 376.041007 588.813302 -L 376.01731 597.868955 -L 376.046932 594.527927 -L 376.064705 601.352789 -L 376.135796 580.37244 -L 376.147645 585.248778 -L 376.242433 580.559268 -L 376.177266 587.95557 -L 376.260206 581.516671 -L 376.283903 578.466628 -L 376.289828 584.692869 -L 376.384616 614.827321 -L 376.408313 612.335563 -L 376.532723 594.714207 -L 376.621588 609.20645 -L 376.633436 606.990296 -L 376.663058 615.789597 -L 376.704528 599.755737 -L 376.734149 599.860827 -L 376.888181 572.360008 -L 376.923726 592.307721 -L 376.971121 570.964759 -L 377.000742 577.448362 -L 377.006667 571.819178 -L 377.054061 601.423179 -L 377.077758 600.718685 -L 377.089607 609.33183 -L 377.166622 584.559406 -L 377.23179 616.06738 -L 377.350275 606.280958 -L 377.468761 586.291941 -L 377.368048 610.851729 -L 377.486534 598.348065 -L 377.533928 620.246995 -L 377.610944 614.947514 -L 377.705733 584.979265 -L 377.628717 622.293646 -L 377.7709 591.187653 -L 377.788673 597.805418 -L 377.847916 577.741677 -L 377.877537 590.744223 -L 377.960477 623.719915 -L 378.073039 612.900105 -L 378.138206 602.142751 -L 378.167827 619.297187 -L 378.203373 627.999581 -L 378.250767 610.584417 -L 378.256692 613.214343 -L 378.298162 599.277137 -L 378.345556 614.933835 -L 378.357404 613.191595 -L 378.422572 624.828014 -L 378.458117 605.319737 -L 378.582527 633.710418 -L 378.535133 605.267183 -L 378.6003 628.141494 -L 378.665467 636.753051 -L 378.623997 623.649237 -L 378.695089 628.466112 -L 378.754332 621.732003 -L 378.742483 636.16878 -L 378.80765 623.416223 -L 378.819499 625.548529 -L 378.837272 616.855074 -L 378.872818 618.924351 -L 378.902439 603.568408 -L 378.961682 622.185652 -L 378.985379 606.414372 -L 379.097941 627.39868 -L 379.115713 622.317332 -L 379.180881 604.1433 -L 379.228275 616.469096 -L 379.263821 598.788433 -L 379.305291 625.261548 -L 379.334912 637.931045 -L 379.382306 616.936945 -L 379.406004 617.79764 -L 379.417852 610.188298 -L 379.494868 633.95583 -L 379.536338 648.167082 -L 379.512641 630.169714 -L 379.583732 637.01566 -L 379.666672 612.672393 -L 379.702218 616.638322 -L 379.725915 613.873141 -L 379.737764 627.105001 -L 379.749612 634.95577 -L 379.773309 618.423489 -L 379.808855 611.786008 -L 379.868098 629.225789 -L 379.874022 633.258885 -L 379.945114 615.949608 -L 380.051751 595.676737 -L 379.98066 620.94744 -L 380.069524 600.072463 -L 380.099145 607.512909 -L 380.128767 586.067026 -L 380.158388 579.527309 -L 380.18801 593.789592 -L 380.193934 600.038702 -L 380.253177 578.151022 -L 380.294647 599.918352 -L 380.306495 589.603905 -L 380.383511 607.544359 -L 380.401284 598.080232 -L 380.407208 598.241346 -L 380.448678 615.854239 -L 380.531618 613.447501 -L 380.543467 608.242402 -L 380.590861 589.388195 -L 380.638256 617.164824 -L 380.64418 614.005106 -L 380.650104 619.1921 -L 380.72712 598.041441 -L 380.738969 600.111348 -L 380.780439 610.785073 -L 380.833757 592.50882 -L 380.863379 604.051994 -L 380.946319 587.116522 -L 381.023334 611.521799 -L 380.970016 584.337855 -L 381.094426 604.051906 -L 381.147745 615.912997 -L 381.201063 599.621388 -L 381.26623 633.857033 -L 381.319549 616.20121 -L 381.331397 604.141269 -L 381.378792 645.337222 -L 381.414338 632.663136 -L 381.420262 632.868642 -L 381.520975 601.299229 -L 381.538748 614.103421 -L 381.734249 586.105677 -L 381.55652 621.582196 -L 381.740173 587.424413 -L 381.799416 600.061906 -L 381.752022 585.105496 -L 381.846811 590.580845 -L 381.870508 576.399672 -L 381.917902 598.342071 -L 381.935675 598.223129 -L 381.988994 604.387749 -L 381.947524 593.920892 -L 382.006766 604.243691 -L 382.089706 592.825993 -L 382.060085 611.49468 -L 382.107479 602.067549 -L 382.137101 625.478641 -L 382.225965 621.335163 -L 382.231889 617.918481 -L 382.291132 646.034438 -L 382.314829 632.79284 -L 382.326678 643.333115 -L 382.368148 623.663523 -L 382.415542 625.939416 -L 382.504407 635.626403 -L 382.445164 620.367076 -L 382.516255 627.607527 -L 382.658438 582.622827 -L 382.776924 599.337651 -L 382.699908 573.46918 -L 382.782848 594.170926 -L 382.800621 593.598469 -L 382.794697 601.636859 -L 382.81247 596.290846 -L 382.889485 589.195062 -L 382.942804 618.943119 -L 383.002047 588.196781 -L 383.073138 588.217924 -L 383.150154 576.09636 -L 383.114608 590.964882 -L 383.173851 583.004211 -L 383.256791 627.486162 -L 383.298261 611.514315 -L 383.363429 611.525098 -L 383.43452 598.403652 -L 383.541157 612.517428 -L 383.499687 580.964211 -L 383.55893 612.013262 -L 383.647794 586.231314 -L 383.689264 593.063613 -L 383.866993 631.470659 -L 383.979555 607.005834 -L 383.991403 611.234205 -L 384.092116 618.588926 -L 384.074343 605.431615 -L 384.103965 616.176183 -L 384.13951 605.178976 -L 384.157283 621.51729 -L 384.175056 616.908499 -L 384.216526 635.355167 -L 384.281693 621.206653 -L 384.335012 597.577383 -L 384.394255 617.877429 -L 384.400179 619.461437 -L 384.423876 607.366559 -L 384.459422 614.281796 -L 384.512741 601.638553 -L 384.560135 622.789431 -L 384.566059 614.820563 -L 384.666772 557.496728 -L 384.589756 619.719778 -L 384.761561 577.986387 -L 384.974835 627.203052 -L 384.779334 575.259884 -L 384.986684 618.954929 -L 385.045927 615.401865 -L 385.016305 625.486535 -L 385.081472 619.459335 -L 385.099245 625.605362 -L 385.14664 598.00104 -L 385.164412 598.486723 -L 385.194034 586.138267 -L 385.253277 604.006978 -L 385.27105 596.655515 -L 385.359914 603.06703 -L 385.330292 579.1423 -L 385.389535 601.401144 -L 385.454703 581.870906 -L 385.496173 599.307839 -L 385.573188 609.05739 -L 385.590961 591.427803 -L 385.656128 573.260532 -L 385.608734 594.012302 -L 385.709447 584.817039 -L 385.780538 608.46695 -L 385.822008 594.218307 -L 385.85163 579.043405 -L 385.922721 598.241668 -L 386.05898 630.471136 -L 386.064904 630.181365 -L 386.112299 611.918601 -L 386.18339 621.581429 -L 386.195239 627.053873 -L 386.236709 614.798442 -L 386.278179 623.868776 -L 386.295952 616.418241 -L 386.313724 629.273492 -L 386.39074 619.981303 -L 386.396665 620.656161 -L 386.408513 614.422201 -L 386.485529 602.359043 -L 386.51515 619.992744 -L 386.532923 612.972484 -L 386.544772 606.874945 -L 386.59809 618.097819 -L 386.609939 616.810064 -L 386.627712 631.405653 -L 386.716576 619.333145 -L 386.829138 596.4775 -L 386.852835 603.181045 -L 386.959472 629.673588 -L 386.983169 629.632731 -L 387.072033 618.345043 -L 387.018715 635.714257 -L 387.083882 628.143347 -L 387.089806 633.77116 -L 387.178671 618.529331 -L 387.184595 619.564567 -L 387.196444 611.648712 -L 387.249762 632.789182 -L 387.291232 619.108438 -L 387.362324 642.377899 -L 387.326778 614.826421 -L 387.421566 632.243063 -L 387.510431 606.459146 -L 387.540052 618.945682 -L 387.581522 638.231919 -L 387.640765 611.416682 -L 387.735554 626.06283 -L 387.753327 614.651662 -L 387.830342 584.613537 -L 387.889585 601.035818 -L 387.89551 601.895228 -L 387.907358 593.429254 -L 387.913282 587.918687 -L 387.966601 613.214697 -L 387.996223 606.519627 -L 388.114708 623.105143 -L 388.079163 605.486237 -L 388.120633 621.347057 -L 388.239118 610.476822 -L 388.138405 627.810014 -L 388.245043 611.323 -L 388.31021 624.460235 -L 388.280588 608.223836 -L 388.345756 609.504622 -L 388.39315 601.497911 -L 388.369453 615.170329 -L 388.446468 612.416957 -L 388.464241 619.376791 -L 388.482014 606.246291 -L 388.487939 608.277963 -L 388.499787 600.745394 -L 388.576803 618.069167 -L 388.588651 614.197718 -L 388.612349 626.267212 -L 388.68344 609.134218 -L 388.689364 610.797631 -L 388.701213 608.10903 -L 388.707137 612.663638 -L 388.718986 619.219981 -L 388.778229 598.346672 -L 388.784153 602.750784 -L 388.796002 586.420525 -L 388.813774 605.888784 -L 388.89079 600.214814 -L 388.955957 620.85423 -L 389.021125 614.502992 -L 389.09814 611.472933 -L 389.05667 627.506754 -L 389.109989 615.518177 -L 389.115913 619.262599 -L 389.13961 591.604183 -L 389.187005 599.287315 -L 389.198853 595.364954 -L 389.252172 609.578642 -L 389.275869 607.909844 -L 389.329188 622.027716 -L 389.370658 605.767269 -L 389.38843 618.53735 -L 389.51284 591.137144 -L 389.418052 619.329006 -L 389.518765 594.045332 -L 389.649099 630.065772 -L 389.660948 622.904612 -L 389.720191 599.107791 -L 389.779433 609.99556 -L 389.903844 585.277705 -L 389.809055 625.601306 -L 389.945314 597.101769 -L 389.951238 597.264668 -L 389.957162 593.497624 -L 390.010481 612.449895 -L 390.046026 607.459184 -L 390.223755 579.85769 -L 390.063799 612.871217 -L 390.241528 593.320925 -L 390.247452 593.401363 -L 390.35409 627.388277 -L 390.39556 619.967326 -L 390.425181 609.049596 -L 390.466651 636.136222 -L 390.496272 631.135878 -L 390.514045 638.823433 -L 390.56144 611.619712 -L 390.573288 617.218215 -L 390.668077 617.672349 -L 390.691774 601.308981 -L 390.709547 610.108695 -L 390.792487 588.987717 -L 390.863578 586.705024 -L 390.928746 606.730775 -L 390.958367 592.499018 -L 391.023534 612.897126 -L 391.171641 637.480971 -L 391.047231 604.325969 -L 391.177566 631.497405 -L 391.18349 626.747411 -L 391.22496 651.564921 -L 391.272354 638.858535 -L 391.296051 644.727876 -L 391.319749 629.580743 -L 391.337521 637.557552 -L 391.39084 612.297714 -L 391.450083 632.354797 -L 391.456007 632.52278 -L 391.461932 629.856576 -L 391.592266 599.753221 -L 391.497477 631.388137 -L 391.604114 604.823463 -L 391.610039 604.363876 -L 391.615963 608.410565 -L 391.621887 613.620974 -L 391.687055 582.564797 -L 391.716676 611.069287 -L 391.841086 566.352282 -L 391.84701 570.535471 -L 391.965496 619.330883 -L 391.983269 611.457555 -L 392.030663 593.403948 -L 392.072133 619.915577 -L 392.101755 595.141508 -L 392.178771 625.609106 -L 392.255786 607.160874 -L 392.409818 622.323408 -L 392.285408 602.959892 -L 392.433515 614.870751 -L 392.492758 600.072931 -L 392.445364 620.876028 -L 392.540152 616.208063 -L 392.575698 623.333344 -L 392.634941 603.968708 -L 392.646789 612.419683 -L 392.741578 601.030571 -L 392.717881 616.22781 -L 392.753427 609.82715 -L 392.788972 623.894398 -L 392.860064 615.507839 -L 392.877837 619.639575 -L 392.984474 601.060847 -L 393.037792 628.024532 -L 393.10296 611.418524 -L 393.1859 582.673388 -L 393.251067 591.44991 -L 393.369553 575.775517 -L 393.39325 577.241215 -L 393.43472 570.598936 -L 393.51766 589.53226 -L 393.594676 582.645201 -L 393.612448 598.16656 -L 393.707237 632.493002 -L 393.742783 616.43902 -L 393.760556 631.014073 -L 393.796101 613.050564 -L 393.861269 623.021215 -L 393.873117 628.387955 -L 393.920511 608.078888 -L 393.938284 614.279207 -L 394.068619 590.643108 -L 394.18118 599.454948 -L 394.086392 585.086414 -L 394.187104 596.148325 -L 394.270045 573.821058 -L 394.299666 586.546479 -L 394.376682 568.271379 -L 394.317439 593.374035 -L 394.424076 581.468814 -L 394.589956 621.315133 -L 394.59588 618.97598 -L 394.643275 597.423064 -L 394.714366 609.392123 -L 394.838776 632.520025 -L 394.850625 621.111118 -L 394.909868 608.868526 -L 394.862473 626.482796 -L 394.939489 625.184041 -L 395.010581 665.107756 -L 395.063899 646.384114 -L 395.111294 633.089027 -L 395.146839 651.907185 -L 395.164612 646.841832 -L 395.170536 655.968453 -L 395.247552 631.208169 -L 395.271249 643.169361 -L 395.277174 631.282691 -L 395.330492 652.839965 -L 395.383811 638.471637 -L 395.401584 641.14592 -L 395.413432 632.607312 -L 395.472675 594.212551 -L 395.567464 609.585943 -L 395.638555 639.638318 -L 395.697798 625.239845 -L 395.709647 630.348389 -L 395.751117 617.665265 -L 395.857754 593.887686 -L 395.786662 626.34664 -L 395.875527 597.363704 -L 396.023634 625.188887 -L 395.93477 589.358975 -L 396.076953 615.987234 -L 396.18359 607.972237 -L 396.153968 626.20005 -L 396.189514 613.636201 -L 396.195438 613.504629 -L 396.302076 600.712191 -L 396.219136 617.814588 -L 396.319848 602.446507 -L 396.396864 577.416891 -L 396.456107 597.581847 -L 396.509426 621.07885 -L 396.568669 607.913438 -L 396.574593 602.737267 -L 396.645684 633.959704 -L 396.651609 628.869322 -L 396.776019 597.22701 -L 396.669382 633.056171 -L 396.894505 610.061552 -L 396.941899 619.842967 -L 396.924126 605.083007 -L 397.001142 615.492097 -L 397.01299 606.940571 -L 397.101855 620.583074 -L 397.202568 633.10139 -L 397.119627 620.064043 -L 397.214416 626.789087 -L 397.238113 619.828594 -L 397.226265 628.354235 -L 397.244038 626.034635 -L 397.249962 638.212942 -L 397.30328 595.095673 -L 397.338826 603.880265 -L 397.34475 603.600091 -L 397.356599 606.05816 -L 397.392145 620.558748 -L 397.445463 586.748579 -L 397.552101 567.506518 -L 397.492858 587.287972 -L 397.558025 572.557705 -L 397.587646 599.459795 -L 397.646889 569.069451 -L 397.676511 593.708439 -L 397.842391 632.406784 -L 397.753526 587.822879 -L 397.895709 620.014173 -L 397.925331 606.943643 -L 397.978649 593.130765 -L 398.026044 610.123346 -L 398.150454 633.231567 -L 398.156378 633.021659 -L 398.180075 612.336011 -L 398.245242 643.092303 -L 398.257091 639.328447 -L 398.263015 644.400396 -L 398.328182 609.673762 -L 398.340031 614.842465 -L 398.345955 611.575145 -L 398.35188 603.029595 -L 398.440744 632.919449 -L 398.594775 586.190902 -L 398.452592 635.790559 -L 398.612548 589.126158 -L 398.618473 588.246548 -L 398.624397 594.471409 -L 398.659943 620.129116 -L 398.713261 588.649307 -L 398.731034 591.103173 -L 398.802126 607.798185 -L 398.855444 606.809971 -L 398.861368 601.510567 -L 398.93246 635.733852 -L 398.985779 636.199065 -L 399.086491 619.886956 -L 399.163507 588.145015 -L 399.199053 608.924581 -L 399.216826 620.718165 -L 399.246447 599.851251 -L 399.258296 600.396525 -L 399.287917 593.637311 -L 399.323463 622.425985 -L 399.359009 607.377895 -L 399.412327 597.549019 -L 399.376782 618.452846 -L 399.459722 608.470385 -L 399.465646 608.763272 -L 399.51304 608.117364 -L 399.584132 622.24119 -L 399.755936 594.069551 -L 399.856649 639.861126 -L 399.88627 623.550184 -L 399.975135 593.264716 -L 400.004756 605.192205 -L 400.099545 616.898205 -L 400.046226 595.604842 -L 400.111393 610.543435 -L 400.247652 582.268579 -L 400.253576 587.432662 -L 400.336516 567.930973 -L 400.372062 579.138044 -L 400.407608 598.110409 -L 400.478699 582.91536 -L 400.484624 579.989309 -L 400.537942 596.62201 -L 400.585337 580.260944 -L 400.644579 602.548077 -L 400.703822 589.188134 -L 400.733444 574.291699 -L 400.786762 596.939287 -L 400.810459 583.053098 -L 400.869702 599.152741 -L 400.911172 569.210361 -L 400.964491 589.931455 -L 400.982264 603.736129 -L 401.000037 585.198304 -L 401.077052 593.939923 -L 401.082977 593.776384 -L 401.088901 585.967654 -L 401.177765 605.4489 -L 401.18369 604.723766 -L 401.325873 629.8264 -L 401.343646 625.446433 -L 401.47398 598.375878 -L 401.521374 622.973282 -L 401.55692 590.301568 -L 401.580617 598.416807 -L 401.586541 592.703347 -L 401.622087 618.885251 -L 401.669481 614.812073 -L 401.675406 614.329504 -L 401.710951 615.081299 -L 401.799816 581.477246 -L 401.965696 635.798109 -L 401.97162 635.793923 -L 402.05456 603.364538 -L 402.084182 622.437469 -L 402.09603 631.39829 -L 402.143425 594.890967 -L 402.190819 586.862754 -L 402.167122 601.771518 -L 402.244137 594.307957 -L 402.285607 603.957516 -L 402.34485 586.452596 -L 402.362623 579.974312 -L 402.421866 593.86987 -L 402.433715 587.60741 -L 402.569973 615.371805 -L 402.664762 591.015316 -L 402.694383 603.048332 -L 402.706232 615.1792 -L 402.765475 587.965625 -L 402.801021 597.639695 -L 402.842491 590.195666 -L 402.872112 605.110277 -L 402.883961 601.04983 -L 402.895809 612.554624 -L 402.978749 587.01467 -L 402.990598 595.696145 -L 403.097235 618.147834 -L 403.026144 592.949927 -L 403.120932 609.525653 -L 403.126856 608.49161 -L 403.168326 618.728914 -L 403.174251 626.449306 -L 403.197948 603.476419 -L 403.274964 614.601428 -L 403.375677 597.040505 -L 403.387525 608.708245 -L 403.423071 600.807699 -L 403.428995 600.90958 -L 403.500087 579.170493 -L 403.446768 604.393458 -L 403.583027 584.597561 -L 403.748907 617.258945 -L 403.760755 602.700412 -L 403.867393 593.151889 -L 403.802225 616.286624 -L 403.873317 594.094933 -L 403.968106 610.307595 -L 403.991803 600.547319 -L 403.997727 596.762111 -L 404.068818 618.772856 -L 404.074743 624.177027 -L 404.13991 590.139708 -L 404.157683 579.135383 -L 404.216926 594.314814 -L 404.252471 586.481371 -L 404.258396 586.540445 -L 404.26432 585.896038 -L 404.335411 555.94952 -L 404.376881 578.419327 -L 404.519064 628.068415 -L 404.55461 617.376095 -L 404.72049 587.679032 -L 404.744187 601.845334 -L 404.815279 591.990032 -L 404.862673 610.582336 -L 404.939689 591.626435 -L 404.993007 594.642624 -L 405.111493 627.266941 -L 405.13519 622.094277 -L 405.271449 587.05205 -L 405.407708 609.00884 -L 405.413632 608.453577 -L 405.425481 611.096172 -L 405.455102 632.909453 -L 405.526193 597.419057 -L 405.532118 596.007212 -L 405.549891 614.544381 -L 405.597285 626.033507 -L 405.638755 601.277494 -L 405.792786 566.150784 -L 405.863878 623.673315 -L 405.934969 615.198214 -L 406.006061 618.227748 -L 405.958667 608.776326 -L 406.011985 612.356684 -L 406.029758 605.923558 -L 406.035682 612.12894 -L 406.112698 588.307197 -L 406.154168 595.232888 -L 406.189714 612.860604 -L 406.248957 591.069313 -L 406.325972 563.384843 -L 406.34967 595.766096 -L 406.361518 584.170921 -L 406.480004 616.799239 -L 406.491853 606.893232 -L 406.503701 590.537513 -L 406.562944 613.543911 -L 406.59849 605.071478 -L 406.63996 589.495524 -L 406.711051 612.780232 -L 406.841386 593.482609 -L 406.76437 628.718262 -L 406.84731 600.346917 -L 406.853234 600.647287 -L 406.882856 576.721754 -L 406.953947 606.967959 -L 407.048736 635.790929 -L 407.078357 626.930007 -L 407.17907 610.077356 -L 407.119827 629.334381 -L 407.208692 621.229936 -L 407.22054 624.810166 -L 407.238313 634.422423 -L 407.30348 602.892453 -L 407.309404 604.364469 -L 407.368647 583.960911 -L 407.42789 597.057503 -L 407.516755 624.915287 -L 407.546376 617.706119 -L 407.587846 603.599984 -L 407.664862 613.153258 -L 407.694483 611.821159 -L 407.700408 622.2043 -L 407.724105 627.84553 -L 407.771499 615.883175 -L 407.80112 620.51873 -L 407.943303 577.130516 -L 407.955152 588.88769 -L 407.972925 575.95367 -L 408.049941 577.68236 -L 408.156578 570.860916 -L 408.138805 594.517647 -L 408.162502 572.098787 -L 408.221745 605.330474 -L 408.280988 588.645297 -L 408.369852 578.753784 -L 408.316534 592.904752 -L 408.381701 585.061346 -L 408.423171 609.596623 -L 408.476489 581.273546 -L 408.494262 587.177098 -L 408.512035 593.265015 -L 408.523884 581.480163 -L 408.529808 585.576828 -L 408.571278 575.485292 -L 408.630521 590.817116 -L 408.76678 610.387696 -L 408.72531 589.824849 -L 408.778628 607.262957 -L 408.831947 610.261593 -L 408.80825 601.636026 -L 408.837871 604.085225 -L 408.84972 594.739144 -L 408.944508 609.821966 -L 409.003751 628.815339 -L 409.051145 616.620224 -L 409.116313 612.893981 -L 409.080767 624.071067 -L 409.145934 615.79924 -L 409.175555 625.305801 -L 409.22295 605.418704 -L 409.228874 605.673653 -L 409.26442 588.207687 -L 409.335511 595.971282 -L 409.424376 613.282979 -L 409.453997 609.412035 -L 409.459921 615.010794 -L 409.536937 585.651756 -L 409.572483 599.543651 -L 409.661347 597.006167 -L 409.696893 577.164085 -L 409.779833 591.451575 -L 409.809454 604.458863 -L 409.898319 596.364088 -L 409.951637 603.939275 -L 410.016805 589.491095 -L 410.117517 608.423073 -L 410.040502 588.13994 -L 410.147139 599.862159 -L 410.17676 587.778789 -L 410.236003 608.430149 -L 410.253776 621.118497 -L 410.283398 606.565416 -L 410.348565 620.340836 -L 410.354489 617.185997 -L 410.378186 635.010934 -L 410.449278 623.039016 -L 410.50852 636.883916 -L 410.484823 610.460827 -L 410.549991 624.09193 -L 410.555915 619.300671 -L 410.585536 640.594005 -L 410.644779 631.736413 -L 410.650703 637.798552 -L 410.739568 621.170926 -L 410.745492 624.910443 -L 410.781038 611.683199 -L 410.834356 635.151519 -L 410.846205 627.991101 -L 410.863978 632.070289 -L 410.935069 621.299816 -L 410.952842 627.335179 -L 411.077252 607.37568 -L 411.118722 615.862463 -L 411.148344 596.546998 -L 411.160192 597.319795 -L 411.201662 585.464744 -L 411.177965 598.672068 -L 411.272754 594.931155 -L 411.284602 586.263003 -L 411.331997 616.136839 -L 411.337921 617.316373 -L 411.355694 607.572818 -L 411.373467 610.053452 -L 411.414937 576.146437 -L 411.503801 587.970197 -L 411.527498 604.01437 -L 411.616363 593.521182 -L 411.622287 591.354639 -L 411.634135 605.052783 -L 411.711151 595.34561 -L 411.752621 618.568133 -L 411.794091 594.93262 -L 411.835561 607.801535 -L 411.877031 605.537255 -L 411.871107 611.298588 -L 411.882956 605.849136 -L 411.906653 617.274981 -L 411.948123 601.420403 -L 411.989593 605.316958 -L 411.995517 604.839301 -L 412.042911 609.942285 -L 412.072533 616.234401 -L 412.102154 595.907123 -L 412.119927 602.014337 -L 412.250261 572.018056 -L 412.202867 604.505989 -L 412.268034 584.37881 -L 412.38652 601.620905 -L 412.279883 584.139139 -L 412.416142 600.88853 -L 412.457612 594.803142 -L 412.499082 614.718858 -L 412.505006 614.75095 -L 412.629416 595.216664 -L 412.641265 596.800024 -L 412.71828 619.998446 -L 412.653113 593.770539 -L 412.783447 610.773925 -L 412.878236 593.598081 -L 412.84269 613.028006 -L 412.901933 594.77511 -L 412.919706 604.000259 -L 412.984873 589.431862 -L 413.00857 595.144708 -L 413.014495 590.729383 -L 413.103359 607.126817 -L 413.144829 597.921505 -L 413.186299 614.373016 -L 413.209996 606.542121 -L 413.257391 624.979945 -L 413.227769 601.730668 -L 413.316633 614.010166 -L 413.417346 598.567557 -L 413.364028 614.850846 -L 413.429195 611.546376 -L 413.506211 613.498073 -L 413.553605 589.510021 -L 413.707637 638.531342 -L 413.571378 586.455254 -L 413.796501 626.801829 -L 413.938684 591.434815 -L 414.063094 629.34604 -L 414.086791 623.686395 -L 414.116412 605.085113 -L 414.199353 618.26631 -L 414.246747 605.079828 -L 414.22305 624.008456 -L 414.311914 612.989267 -L 414.317838 613.630176 -L 414.341535 604.856985 -L 414.34746 598.209215 -L 414.377081 625.704847 -L 414.454097 598.418742 -L 414.460021 607.297006 -L 414.542961 578.670156 -L 414.55481 587.839715 -L 414.566658 582.781327 -L 414.608128 604.992119 -L 414.631826 601.796519 -L 414.685144 624.098264 -L 414.750311 614.873648 -L 414.76216 614.193521 -L 414.779933 610.819079 -L 414.880646 630.628913 -L 414.963586 612.268307 -L 414.993207 619.882473 -L 415.236103 582.555846 -L 415.005056 623.82061 -L 415.242027 587.479104 -L 415.253876 597.531064 -L 415.330892 578.952172 -L 415.336816 578.130866 -L 415.366437 587.213378 -L 415.478999 609.36353 -L 415.396059 586.385156 -L 415.490847 601.297614 -L 415.50862 595.278203 -L 415.526393 575.805338 -L 415.585636 604.707404 -L 415.621182 590.528305 -L 415.686349 629.821894 -L 415.644879 587.946328 -L 415.775213 622.709822 -L 415.840381 607.417239 -L 415.870002 626.080167 -L 415.899623 641.184933 -L 415.982563 630.495315 -L 416.053655 605.272022 -L 416.160292 608.500771 -L 416.172141 618.307256 -L 416.231384 600.957012 -L 416.272854 612.369308 -L 416.385415 588.075981 -L 416.397264 597.502441 -L 416.492052 623.163272 -L 416.420961 596.335405 -L 416.527598 616.110311 -L 416.574992 604.333499 -L 416.64016 613.298122 -L 416.652008 625.348726 -L 416.711251 600.642687 -L 416.717175 601.170181 -L 416.729024 595.770902 -L 416.76457 597.341977 -L 416.770494 592.519501 -L 416.835661 621.807987 -L 416.841585 619.215472 -L 416.853434 628.018501 -L 416.883055 605.881041 -L 416.894904 608.406768 -L 416.906753 594.868854 -L 416.960071 622.018755 -L 416.995617 621.658648 -L 417.131876 632.320833 -L 417.019314 620.645763 -L 417.1378 626.012341 -L 417.197043 605.095724 -L 417.149648 632.887163 -L 417.250361 621.483853 -L 417.279983 639.953204 -L 417.327377 609.873508 -L 417.34515 613.192297 -L 417.445863 582.90055 -L 417.356999 613.874444 -L 417.46956 601.078604 -L 417.51103 580.486711 -L 417.564349 604.866019 -L 417.570273 608.995688 -L 417.617667 592.629102 -L 417.659137 604.268802 -L 417.71838 572.75285 -L 417.777623 587.927472 -L 417.84279 599.507604 -L 417.866487 582.086864 -L 417.872412 583.625706 -L 417.878336 579.205786 -L 417.949427 598.540308 -L 417.973125 591.241095 -L 417.979049 591.405754 -L 417.990897 588.8592 -L 418.032367 565.031095 -L 418.109383 567.488006 -L 418.328582 615.022473 -L 418.358203 608.046708 -L 418.370052 601.278814 -L 418.423371 622.350934 -L 418.435219 638.790192 -L 418.530008 627.270155 -L 418.612948 603.01716 -L 418.559629 634.041429 -L 418.660342 610.754224 -L 418.695888 608.778044 -L 418.701812 615.821438 -L 418.743282 642.090124 -L 418.814374 626.578561 -L 418.867692 620.408738 -L 418.909162 637.440592 -L 418.915086 629.093526 -L 418.926935 632.480041 -L 418.950632 622.492933 -L 418.980254 592.159876 -L 419.063194 612.83902 -L 419.104664 610.068495 -L 419.217225 637.331101 -L 419.258695 610.979038 -L 419.329787 630.626033 -L 419.365332 634.146351 -L 419.394954 623.661433 -L 419.406802 625.653581 -L 419.590455 568.755277 -L 419.643774 574.988183 -L 419.655623 589.991845 -L 419.76226 588.188705 -L 419.797806 575.74107 -L 419.857048 605.334536 -L 419.874821 585.52326 -L 420.017004 611.560973 -L 419.916291 581.143117 -L 420.034777 607.351046 -L 420.17696 583.434856 -L 420.188809 583.666621 -L 420.295446 619.970259 -L 420.325067 607.268505 -L 420.402083 600.656906 -L 420.419856 611.940456 -L 420.42578 611.165448 -L 420.50872 633.325584 -L 420.55019 626.181311 -L 420.662752 606.40909 -L 420.668676 616.041768 -L 420.733843 623.315875 -L 420.692373 613.838751 -L 420.75754 616.07276 -L 420.846405 595.187784 -L 420.787162 619.738694 -L 420.876026 597.234732 -L 420.935269 582.365008 -L 420.893799 599.832763 -L 420.994512 593.734163 -L 421.024133 604.726016 -L 421.071528 588.432481 -L 421.089301 590.025016 -L 421.107073 582.011421 -L 421.178165 605.100302 -L 421.320348 636.657719 -L 421.213711 584.304615 -L 421.332196 634.884734 -L 421.349969 641.013998 -L 421.403288 619.01557 -L 421.527698 597.032796 -L 421.533622 599.826586 -L 421.581017 578.971666 -L 421.622487 607.933314 -L 421.634335 612.084696 -L 421.652108 600.435404 -L 421.717275 583.622996 -L 421.788367 587.557615 -L 421.871307 610.178107 -L 421.924625 609.987039 -L 421.948322 594.483323 -L 421.995717 610.700679 -L 422.01349 625.76109 -L 422.078657 606.455303 -L 422.108278 613.900039 -L 422.155673 623.710564 -L 422.185294 595.747016 -L 422.250461 583.882304 -L 422.268234 601.408007 -L 422.274158 600.14132 -L 422.327477 617.993542 -L 422.291931 599.479344 -L 422.363023 610.90937 -L 422.451887 575.110831 -L 422.481508 586.155714 -L 422.546676 608.081407 -L 422.599994 594.794815 -L 422.611843 588.725723 -L 422.671086 606.86275 -L 422.730329 622.152874 -L 422.795496 618.280238 -L 422.813269 622.064891 -L 422.848814 606.829843 -L 422.860663 612.824548 -L 422.908057 600.318387 -L 422.955452 626.256258 -L 422.961376 624.252721 -L 422.996922 647.332957 -L 423.020619 635.300991 -L 423.073937 643.847317 -L 423.115407 628.260888 -L 423.127256 633.280825 -L 423.145029 642.600496 -L 423.210196 621.0483 -L 423.21612 623.634103 -L 423.334606 584.641063 -L 423.352379 598.066898 -L 423.364227 587.253205 -L 423.399773 605.401412 -L 423.476789 601.099014 -L 423.518259 617.166914 -L 423.530108 604.317998 -L 423.571578 621.23462 -L 423.63082 614.104512 -L 423.701912 600.689847 -L 423.725609 614.84297 -L 423.737458 614.344784 -L 423.820398 631.350332 -L 423.755231 612.383513 -L 423.855943 619.735945 -L 423.873716 621.83822 -L 423.897413 607.779342 -L 423.903338 608.346037 -L 423.932959 600.836534 -L 423.998126 620.100919 -L 424.027748 641.510863 -L 424.110688 622.379507 -L 424.116612 621.410326 -L 424.128461 634.462681 -L 424.134385 634.090503 -L 424.246947 646.07759 -L 424.193628 628.773415 -L 424.252871 644.946757 -L 424.365432 632.373378 -L 424.329887 651.104556 -L 424.371357 634.755753 -L 424.395054 655.682245 -L 424.460221 633.140498 -L 424.477994 639.331012 -L 424.620177 602.456234 -L 424.632025 623.858214 -L 424.714965 587.639949 -L 424.72089 592.84151 -L 424.750511 590.123591 -L 424.768284 598.033981 -L 424.839375 595.284078 -L 424.892694 613.86708 -L 424.951937 619.761446 -L 424.904543 605.968065 -L 424.987483 610.847432 -L 425.028953 587.168461 -L 425.105968 601.262243 -L 425.248151 581.333167 -L 425.141514 606.778538 -L 425.277773 593.265037 -L 425.331091 588.570576 -L 425.402183 606.085459 -L 425.414031 603.23547 -L 425.449577 615.921823 -L 425.532517 639.283446 -L 425.568063 632.338394 -L 425.698397 589.888144 -L 425.71617 600.263348 -L 425.822807 626.872702 -L 425.834656 619.580981 -L 425.846505 623.068011 -L 425.858353 603.102524 -L 425.864277 603.385628 -L 426.012385 579.159758 -L 426.04793 589.098176 -L 426.136795 616.861545 -L 426.166416 601.704333 -L 426.17234 597.044775 -L 426.237508 625.799209 -L 426.25528 618.237633 -L 426.326372 632.448474 -L 426.361918 626.088302 -L 426.367842 611.287526 -L 426.456706 631.287543 -L 426.468555 626.416403 -L 426.486328 628.100422 -L 426.498176 624.341344 -L 426.563344 625.116672 -L 426.634435 594.244613 -L 426.723299 583.706315 -L 426.652208 596.134644 -L 426.741072 594.657488 -L 426.847709 607.4559 -L 426.835861 591.194607 -L 426.859558 601.494065 -L 426.924725 595.572463 -L 426.883255 607.933318 -L 426.948422 605.007324 -L 426.995817 610.433644 -L 427.031362 597.490941 -L 427.05506 607.152992 -L 427.078757 581.456328 -L 427.173545 590.956569 -L 427.185394 604.817278 -L 427.209091 589.402297 -L 427.274258 592.257448 -L 427.333501 574.929933 -L 427.38682 587.041682 -L 427.440138 597.051454 -L 427.487533 575.49328 -L 427.505305 585.52264 -L 427.546775 564.007653 -L 427.617867 554.242888 -L 427.570473 566.554657 -L 427.653413 563.724974 -L 427.659337 562.51722 -L 427.671186 581.534652 -L 427.67711 581.567261 -L 427.724504 572.436046 -L 427.754126 600.321371 -L 427.777823 587.41782 -L 427.831141 584.000104 -L 427.848914 592.515322 -L 427.896309 606.203335 -L 427.949627 592.824182 -L 427.9674 587.777253 -L 428.020719 605.14586 -L 428.044416 603.18999 -L 428.127356 632.198168 -L 428.162902 615.919377 -L 428.25769 616.612053 -L 428.281387 597.272903 -L 428.305084 587.255471 -L 428.370252 607.401832 -L 428.399873 591.281967 -L 428.494662 619.559347 -L 428.536132 617.699773 -L 428.553905 631.793992 -L 428.607223 615.368194 -L 428.642769 625.516935 -L 428.767179 601.254842 -L 428.921211 649.188724 -L 429.140409 602.962352 -L 429.175955 614.993462 -L 429.187804 623.748017 -L 429.264819 597.813587 -L 429.347759 579.133586 -L 429.377381 593.578669 -L 429.401078 588.094214 -L 429.436624 597.451446 -L 429.460321 620.898711 -L 429.525488 592.448166 -L 429.531412 594.328849 -L 429.584731 584.580853 -L 429.620277 598.864514 -L 429.626201 596.537971 -L 429.632125 600.852188 -L 429.697292 575.254779 -L 429.709141 577.293158 -L 429.910567 626.577855 -L 429.934264 616.101515 -L 430.034977 605.948837 -L 429.975734 622.761976 -L 430.046825 609.658305 -L 430.05275 614.143056 -L 430.106068 579.34257 -L 430.117917 568.663199 -L 430.189008 599.288103 -L 430.200857 593.785526 -L 430.283797 614.308633 -L 430.230478 593.080374 -L 430.325267 607.121999 -L 430.337116 603.449421 -L 430.378586 621.116526 -L 430.38451 617.363659 -L 430.455601 628.895427 -L 430.485223 611.306733 -L 430.532617 620.636889 -L 430.603709 603.679462 -L 430.680724 617.545371 -L 430.704421 601.000823 -L 430.71627 605.683064 -L 430.728119 613.791596 -L 430.787362 598.031368 -L 430.805134 599.360066 -L 430.846604 586.368866 -L 430.88215 613.610092 -L 430.888074 616.153756 -L 430.935469 605.436435 -L 430.971014 612.300227 -L 431.036182 592.660147 -L 430.982863 613.653113 -L 431.077652 602.807365 -L 431.166516 641.923311 -L 431.207986 631.328485 -L 431.225759 639.392009 -L 431.332396 619.398699 -L 431.415336 635.150211 -L 431.444958 624.255136 -L 431.468655 634.350156 -L 431.521973 618.220945 -L 431.545671 598.443818 -L 431.598989 619.568516 -L 431.634535 612.021743 -L 431.776718 648.129408 -L 431.788566 642.130903 -L 431.794491 642.84182 -L 431.800415 639.821752 -L 431.853734 656.209188 -L 431.918901 620.142334 -L 431.989992 638.518987 -L 431.936674 619.692873 -L 432.031462 621.973061 -L 432.043311 615.38954 -L 432.084781 643.034232 -L 432.114402 639.680539 -L 432.221039 657.350452 -L 432.161797 633.394087 -L 432.232888 657.057693 -L 432.375071 613.69588 -L 432.38692 615.52156 -L 432.499481 642.047311 -L 432.434314 614.976058 -L 432.51133 637.244801 -L 432.517254 636.183308 -L 432.5528 645.900639 -L 432.582421 639.920696 -L 432.588345 643.94808 -L 432.629815 627.639927 -L 432.694983 640.944884 -L 432.706831 642.170023 -L 432.730528 628.281658 -L 432.742377 630.001917 -L 432.849014 594.987526 -L 432.878636 607.13925 -L 432.920106 622.143349 -L 432.973424 605.888597 -L 432.985273 596.09368 -L 433.056364 631.699223 -L 433.09191 630.44356 -L 433.080061 637.415089 -L 433.097834 634.085301 -L 433.115607 646.318062 -L 433.151153 623.073828 -L 433.210396 644.595064 -L 433.346654 613.494436 -L 433.352579 617.371695 -L 433.370352 620.715508 -L 433.429594 605.209207 -L 433.459216 591.230424 -L 433.471064 610.268441 -L 433.524383 602.544784 -L 433.530307 617.739647 -L 433.613247 593.175932 -L 433.63102 603.168738 -L 433.690263 615.619073 -L 433.648793 599.25836 -L 433.737657 607.68115 -L 433.850219 596.41964 -L 433.767279 619.854113 -L 433.856143 596.424899 -L 434.051645 643.894722 -L 433.867992 596.339931 -L 434.140509 633.627617 -L 434.181979 608.694955 -L 434.264919 622.564313 -L 434.460421 595.702693 -L 434.300465 631.000787 -L 434.490042 602.449717 -L 434.549285 608.773871 -L 434.578906 592.091126 -L 434.584831 595.117329 -L 434.638149 588.668597 -L 434.673695 602.810522 -L 434.679619 600.247982 -L 434.732938 631.112806 -L 434.792181 601.141008 -L 434.851424 576.511917 -L 434.916591 585.354346 -L 434.999531 617.740868 -L 435.041001 609.503209 -L 435.070622 597.750965 -L 435.141714 622.240367 -L 435.147638 625.64678 -L 435.21873 603.878314 -L 435.295745 616.887572 -L 435.242427 591.324796 -L 435.331291 606.032445 -L 435.443853 597.958386 -L 435.360913 619.844174 -L 435.455701 602.712538 -L 435.46755 605.13515 -L 435.503096 589.622968 -L 435.532717 594.257367 -L 435.544566 585.646377 -L 435.597884 625.399609 -L 435.603808 625.060782 -L 435.692673 637.186253 -L 435.651203 622.247849 -L 435.71637 629.139728 -L 435.728219 630.044076 -L 435.834856 583.35797 -L 435.846704 595.308168 -L 435.888174 628.944345 -L 435.96519 612.354424 -L 436.036282 631.42554 -L 436.083676 620.840307 -L 436.160692 611.898176 -L 436.107373 626.22004 -L 436.178464 620.754478 -L 436.184389 627.742522 -L 436.231783 591.843981 -L 436.267329 598.942075 -L 436.320647 612.602424 -L 436.373966 601.510139 -L 436.385815 593.202945 -L 436.456906 613.556779 -L 436.46283 612.705187 -L 436.486527 621.942675 -L 436.510225 596.624141 -L 436.516149 598.732453 -L 436.640559 575.132177 -L 436.699802 600.655397 -L 436.764969 589.794406 -L 436.800515 608.015726 -L 436.776818 589.185827 -L 436.877531 593.442845 -L 436.948622 576.497965 -L 436.996016 587.44126 -L 437.155972 632.739983 -L 437.167821 618.913396 -L 437.292231 583.699733 -L 437.310004 586.917625 -L 437.434414 611.68076 -L 437.452187 617.537697 -L 437.511429 596.78331 -L 437.523278 590.717567 -L 437.546975 604.098448 -L 437.641764 638.968462 -L 437.564748 601.653779 -L 437.67731 628.658854 -L 437.736552 601.283024 -L 437.789871 625.232569 -L 437.819493 639.224717 -L 437.872811 618.723337 -L 437.896508 624.580107 -L 438.032767 598.111891 -L 437.908357 629.21856 -L 438.044615 601.597352 -L 438.103858 619.017973 -L 438.163101 610.345981 -L 438.186798 617.036177 -L 438.222344 601.06149 -L 438.25789 605.923439 -L 438.352679 578.649557 -L 438.275663 613.54102 -L 438.42377 586.206218 -L 438.518559 610.030592 -L 438.453391 577.663262 -L 438.542256 594.576209 -L 438.560029 593.78891 -L 438.565953 592.073312 -L 438.613347 606.981975 -L 438.625196 606.951339 -L 438.648893 613.19385 -L 438.690363 585.144587 -L 438.725909 601.524149 -L 438.749606 584.564823 -L 438.83847 594.495606 -L 438.844394 593.649364 -L 438.850319 603.044184 -L 438.862167 609.850502 -L 438.909562 598.94614 -L 438.96288 609.799968 -L 439.010275 621.583077 -L 439.081366 601.659596 -L 439.110987 628.277803 -L 439.193928 610.140552 -L 439.235398 598.446965 -L 439.276868 613.915826 -L 439.300565 606.780802 -L 439.306489 611.279935 -L 439.37758 581.12279 -L 439.525688 614.087973 -L 439.537536 607.661998 -L 439.543461 607.541965 -L 439.608628 588.847679 -L 439.638249 617.065132 -L 439.650098 607.193967 -L 439.685644 614.20348 -L 439.733038 596.226573 -L 439.804129 583.142111 -L 439.851524 592.879455 -L 439.946312 603.015911 -L 439.898918 587.742182 -L 439.964085 597.513548 -L 440.064798 581.965463 -L 440.076647 592.466944 -L 440.183284 638.332805 -L 440.242527 621.764172 -L 440.34324 599.809863 -L 440.366937 613.108417 -L 440.38471 626.2976 -L 440.443953 592.462836 -L 440.449877 592.234761 -L 440.455801 585.979453 -L 440.503195 625.661922 -L 440.520968 624.791895 -L 440.526893 628.968436 -L 440.603908 606.278744 -L 440.710546 626.910699 -L 440.627605 604.410387 -L 440.769788 623.594847 -L 440.829031 615.406977 -L 440.805334 628.416601 -L 440.84088 623.899256 -L 440.953441 643.169969 -L 440.96529 640.196784 -L 440.988987 613.994968 -L 441.0897 623.737761 -L 441.154867 613.24479 -L 441.208186 638.065866 -L 441.33852 611.59276 -L 441.397763 628.428999 -L 441.356293 609.12564 -L 441.445157 611.27188 -L 441.498476 592.11277 -L 441.563643 603.772497 -L 441.634735 626.972307 -L 441.693977 618.67942 -L 441.699902 616.900247 -L 441.723599 627.731571 -L 441.759145 626.513671 -L 441.848009 645.780215 -L 441.865782 633.620484 -L 441.966495 600.502692 -L 441.9191 636.027038 -L 441.990192 601.574773 -L 442.007965 598.019625 -L 442.013889 604.885706 -L 442.102753 628.460084 -L 442.025738 604.095713 -L 442.144223 622.422933 -L 442.244936 635.12135 -L 442.209391 619.163185 -L 442.262709 632.634469 -L 442.351574 595.597973 -L 442.381195 607.21679 -L 442.475984 626.966346 -L 442.398968 606.991452 -L 442.499681 619.457833 -L 442.505605 618.954721 -L 442.511529 621.211461 -L 442.564848 638.328011 -L 442.612242 618.487719 -L 442.624091 631.849501 -L 442.647788 621.698838 -L 442.653712 616.257552 -L 442.724804 644.59732 -L 442.730728 641.066337 -L 442.748501 645.176878 -L 442.813668 628.790988 -L 442.819592 630.696106 -L 442.825517 631.000631 -L 442.831441 629.051802 -L 442.837365 629.903427 -L 442.849214 630.991902 -L 442.979548 599.39058 -L 443.074337 607.496022 -L 443.021018 590.709365 -L 443.086185 603.328247 -L 443.121731 585.939163 -L 443.204671 593.0579 -L 443.305384 610.33442 -L 443.335006 608.639499 -L 443.370551 597.660009 -L 443.42387 620.492128 -L 443.429794 619.002742 -L 443.435718 618.938393 -L 443.512734 635.484825 -L 443.453491 612.294981 -L 443.554204 621.416218 -L 443.571977 625.026483 -L 443.583826 619.905059 -L 443.720084 584.290216 -L 443.607523 624.460517 -L 443.749706 589.978826 -L 443.767479 587.780978 -L 443.808949 596.977242 -L 443.897813 645.935021 -L 443.933359 628.663145 -L 444.010374 607.703408 -L 444.057769 614.47319 -L 444.063693 614.919416 -L 444.081466 608.743423 -L 444.205876 595.715543 -L 444.093314 611.976128 -L 444.217725 596.029232 -L 444.318437 612.394762 -L 444.25327 592.024961 -L 444.342135 606.847852 -L 444.430999 573.153305 -L 444.365832 607.238727 -L 444.466545 586.988869 -L 444.567258 612.294695 -L 444.596879 608.023145 -L 444.756835 588.328539 -L 444.673895 612.086268 -L 444.768683 594.80119 -L 444.833851 603.146935 -L 444.810153 590.861465 -L 444.881245 600.950266 -L 444.893094 588.245687 -L 444.940488 603.220296 -L 444.993806 592.631786 -L 445.047125 613.807669 -L 445.112292 600.980742 -L 445.147838 593.965672 -L 445.177459 609.066158 -L 445.207081 603.605455 -L 445.301869 615.891323 -L 445.266324 599.200191 -L 445.313718 604.311889 -L 445.319642 602.326602 -L 445.355188 620.383464 -L 445.361112 619.471318 -L 445.473674 652.005327 -L 445.479598 649.258585 -L 445.639554 599.917937 -L 445.503295 653.738891 -L 445.645478 600.019829 -L 445.686948 585.726329 -L 445.763964 611.104496 -L 445.79951 595.137331 -L 445.829131 615.469123 -L 445.876525 601.091711 -L 445.96539 632.563161 -L 446.000936 615.629496 -L 446.125346 567.306855 -L 446.178664 583.539332 -L 446.237907 579.042817 -L 446.303074 604.745314 -L 446.344544 620.347034 -L 446.314923 603.849264 -L 446.42156 608.790183 -L 446.427484 608.813704 -L 446.439333 618.06565 -L 446.486727 596.965337 -L 446.528197 604.450573 -L 446.534122 604.452386 -L 446.540046 604.232997 -L 446.557819 591.633503 -L 446.611137 607.468996 -L 446.640759 605.737272 -L 446.717774 610.214686 -L 446.71185 600.975068 -L 446.747396 606.697465 -L 446.812563 586.334469 -L 446.854033 601.875839 -L 446.925125 622.329373 -L 446.966595 606.653283 -L 446.996216 616.565364 -L 447.04361 592.526383 -L 447.067308 607.416262 -L 447.12655 596.498692 -L 447.16802 614.176408 -L 447.173945 612.76933 -L 447.185793 623.183145 -L 447.256885 617.5444 -L 447.316128 627.357139 -L 447.292431 610.443546 -L 447.363522 614.798986 -L 447.493856 589.898318 -L 447.393143 617.40809 -L 447.523478 609.328424 -L 447.535326 621.487417 -L 447.612342 597.683517 -L 447.636039 615.438617 -L 447.754525 635.603839 -L 447.677509 595.341277 -L 447.766374 630.37546 -L 447.902632 588.217157 -L 447.926329 597.586375 -L 447.955951 632.469348 -L 448.038891 604.294362 -L 448.139604 622.204814 -L 448.151452 611.266837 -L 448.222544 605.802266 -L 448.234392 615.058418 -L 448.246241 612.456627 -L 448.269938 620.041587 -L 448.323257 596.434107 -L 448.346954 605.738785 -L 448.352878 605.875965 -L 448.358803 604.645903 -L 448.453591 584.628734 -L 448.483213 591.259081 -L 448.560228 611.523509 -L 448.500985 585.997475 -L 448.601698 605.282843 -L 448.743881 653.430646 -L 448.63132 597.997234 -L 448.773503 635.407718 -L 448.803124 628.708643 -L 448.933459 585.869777 -L 449.028247 618.696544 -L 449.063793 616.192217 -L 449.146733 568.485687 -L 449.188203 594.003161 -L 449.25337 611.465741 -L 449.223749 593.661566 -L 449.306689 608.189631 -L 449.365932 591.157355 -L 449.348159 610.927356 -L 449.413326 609.42123 -L 449.549585 649.551984 -L 449.620676 634.623693 -L 449.66807 638.092421 -L 449.673995 640.823245 -L 449.733238 618.65589 -L 449.75101 628.092844 -L 449.762859 629.076319 -L 449.79248 616.677522 -L 449.798405 612.418207 -L 449.863572 629.287417 -L 449.893193 619.934543 -L 450.005755 648.145602 -L 450.023528 646.851826 -L 450.059073 633.658735 -L 450.112392 655.849078 -L 450.118316 658.759635 -L 450.177559 635.915008 -L 450.213105 658.593514 -L 450.384909 606.996176 -L 450.402682 603.785804 -L 450.438228 617.349055 -L 450.521168 625.150996 -L 450.533017 615.731753 -L 450.544865 621.060134 -L 450.568562 622.2545 -L 450.663351 604.623794 -L 450.764064 620.889373 -L 450.704821 602.997327 -L 450.775912 607.114419 -L 450.935868 645.114263 -L 450.947717 640.591035 -L 450.989187 657.31741 -L 451.00696 656.920357 -L 451.030657 660.871953 -L 451.04843 648.528343 -L 451.054354 650.924952 -L 451.137294 623.993739 -L 451.17284 624.591292 -L 451.178764 624.513136 -L 451.21431 618.129417 -L 451.243931 631.594809 -L 451.285401 621.208281 -L 451.291326 627.105923 -L 451.368341 604.438419 -L 451.38019 609.942803 -L 451.415736 595.894633 -L 451.451281 619.787686 -L 451.480903 618.940194 -L 451.498676 623.720552 -L 451.516449 613.183246 -L 451.569767 620.118334 -L 451.646783 616.023222 -L 451.664556 627.875533 -L 451.676404 621.387864 -L 451.71195 630.595237 -L 451.747496 614.422619 -L 451.806739 606.628039 -L 451.79489 621.824264 -L 451.854133 613.022469 -L 451.937073 621.41832 -L 451.87783 605.075841 -L 451.96077 613.153404 -L 452.08518 578.38206 -L 451.972619 617.494275 -L 452.120726 589.378629 -L 452.203666 604.366957 -L 452.138499 588.152744 -L 452.239212 598.560229 -L 452.363622 560.236103 -L 452.369546 563.649659 -L 452.37547 562.363475 -L 452.405092 578.511559 -L 452.428789 574.27288 -L 452.535426 600.544669 -L 452.553199 591.73665 -L 452.594669 572.513996 -L 452.659836 595.615409 -L 452.742776 574.243563 -L 452.772398 590.101628 -L 452.849414 627.126096 -L 452.896808 604.539284 -L 452.991596 578.992711 -L 452.926429 604.928511 -L 453.033067 589.154286 -L 453.157477 625.256439 -L 453.169325 615.79345 -L 453.240417 588.05581 -L 453.187098 620.537364 -L 453.311508 605.40347 -L 453.352978 613.513595 -L 453.394448 596.543281 -L 453.412221 598.839588 -L 453.459615 577.239608 -L 453.512934 603.701385 -L 453.518858 602.462574 -L 453.578101 614.294137 -L 453.63142 607.132586 -L 453.637344 611.113645 -L 453.708435 586.363655 -L 453.71436 586.104951 -L 453.720284 589.980759 -L 453.726208 587.228963 -L 453.803224 606.257764 -L 453.743981 583.316814 -L 453.850618 600.246203 -L 453.986877 621.557062 -L 453.874316 597.855655 -L 453.992801 618.137704 -L 454.099439 611.594314 -L 454.022423 623.080647 -L 454.105363 612.111616 -L 454.111287 614.943115 -L 454.182379 597.388466 -L 454.318637 615.798309 -L 454.277167 596.517497 -L 454.330486 605.446402 -L 454.371956 588.781792 -L 454.431199 609.628602 -L 454.443047 598.790631 -L 454.448972 598.733956 -L 454.597079 635.997485 -L 454.6267 622.217174 -L 454.685943 643.722092 -L 454.70964 633.478761 -L 454.721489 632.69915 -L 454.75111 644.017427 -L 454.816277 620.856058 -L 454.95846 592.843951 -L 454.869596 624.52082 -L 454.976233 606.096329 -L 455.094719 621.947764 -L 455.017703 596.726391 -L 455.100643 621.81948 -L 455.142113 595.62642 -L 455.219129 604.382772 -L 455.325766 629.834764 -L 455.242826 599.035246 -L 455.361312 621.788532 -L 455.390934 606.847958 -L 455.462025 624.956828 -L 455.562738 647.379629 -L 455.503495 618.526834 -L 455.580511 632.885248 -L 455.598284 626.338664 -L 455.645678 650.434469 -L 455.651602 654.396965 -L 455.687148 622.937121 -L 455.722694 635.526005 -L 455.799709 615.374264 -L 455.847104 621.335178 -L 455.853028 629.627525 -L 455.92412 599.290281 -L 455.947817 609.475358 -L 455.983362 619.711153 -L 456.012984 601.155313 -L 456.042605 607.261629 -L 456.054454 601.585114 -L 456.137394 620.757479 -L 456.149242 608.989397 -L 456.190713 601.631287 -L 456.167015 618.144665 -L 456.208485 611.698615 -L 456.21441 618.459054 -L 456.291425 600.491367 -L 456.309198 604.166079 -L 456.374365 590.510065 -L 456.344744 607.403058 -L 456.409911 605.003158 -L 456.481003 625.198844 -L 456.528397 614.45506 -L 456.534321 616.004734 -L 456.575791 597.810794 -L 456.593564 604.504983 -L 456.611337 598.758372 -L 456.623186 615.977118 -L 456.646883 609.924462 -L 456.723899 629.745259 -L 456.759444 615.828011 -L 456.83646 608.767603 -L 456.806839 624.464262 -L 456.866081 615.962931 -L 456.883854 622.241776 -L 456.925324 603.572548 -L 456.96087 606.573288 -L 457.020113 598.19254 -L 457.049734 615.683353 -L 457.073432 627.181458 -L 457.12675 604.961716 -L 457.156372 618.170263 -L 457.174144 604.141578 -L 457.227463 625.555653 -L 457.263009 620.047733 -L 457.41704 589.379629 -L 457.422965 594.317626 -L 457.452586 611.188558 -L 457.511829 586.97557 -L 457.517753 592.626009 -L 457.54145 597.546212 -L 457.66586 553.26676 -L 457.784346 599.257875 -L 457.813968 593.51683 -L 457.837665 572.331113 -L 457.908756 600.529939 -L 457.920605 596.854675 -L 457.926529 597.002685 -L 458.003545 577.811032 -L 458.039091 591.792998 -L 458.056864 612.3287 -L 458.092409 585.27581 -L 458.181274 608.335433 -L 458.222744 598.684227 -L 458.270138 609.842961 -L 458.287911 605.432078 -L 458.412321 635.505859 -L 458.453791 621.680775 -L 458.501185 639.434585 -L 458.530807 627.551049 -L 458.578201 638.045309 -L 458.601898 623.916181 -L 458.696687 600.843721 -L 458.720384 607.58614 -L 458.827021 620.917412 -L 458.785551 595.679213 -L 458.832945 617.828271 -L 458.915885 601.784718 -L 458.939583 607.091335 -L 458.951431 619.90033 -L 459.016598 589.916386 -L 459.040295 603.014686 -L 459.099538 595.095481 -L 459.123236 607.939512 -L 459.146933 603.770758 -L 459.241721 621.888212 -L 459.194327 600.313424 -L 459.271343 617.534768 -L 459.348359 606.828032 -L 459.389829 611.171656 -L 459.41945 629.869638 -L 459.484617 602.713574 -L 459.50239 588.317622 -L 459.579406 614.203682 -L 459.591254 606.320291 -L 459.656422 595.324961 -L 459.620876 607.667063 -L 459.680119 607.434928 -L 459.733437 626.793024 -L 459.774907 600.040943 -L 459.798604 617.868146 -L 459.804529 617.739968 -L 459.810453 624.339808 -L 459.869696 600.824828 -L 459.911166 618.343989 -L 460.065197 591.299194 -L 459.934863 622.652168 -L 460.088895 604.377229 -L 460.094819 604.896588 -L 460.112592 599.035899 -L 460.118516 601.545174 -L 460.136289 589.094145 -L 460.177759 604.186405 -L 460.237002 589.583217 -L 460.29032 599.23772 -L 460.266623 585.379445 -L 460.349563 595.194044 -L 460.385109 616.004552 -L 460.456201 596.001485 -L 460.468049 600.320243 -L 460.503595 586.710902 -L 460.509519 580.713897 -L 460.604308 593.080144 -L 460.610232 592.914837 -L 460.710945 583.755202 -L 460.639854 595.607739 -L 460.722794 584.978117 -L 460.876825 623.375594 -L 460.770188 580.25545 -L 460.900522 621.45604 -L 460.941992 629.636106 -L 461.024932 606.309114 -L 461.113797 589.757842 -L 461.155267 590.245652 -L 461.220434 627.697781 -L 461.309298 613.772911 -L 461.368541 595.497574 -L 461.427784 597.558954 -L 461.593664 632.222991 -L 461.688453 605.882331 -L 461.729923 610.463302 -L 461.735847 615.271685 -L 461.79509 592.94849 -L 461.824711 606.349174 -L 461.883954 598.414375 -L 461.907651 622.119715 -L 461.9195 618.907361 -L 461.937273 630.520892 -L 461.978743 608.094537 -L 462.020213 618.867098 -L 462.049834 607.090145 -L 462.120926 628.177756 -L 462.132774 637.223365 -L 462.186093 619.499705 -L 462.215714 622.477652 -L 462.227563 619.464844 -L 462.263109 632.158102 -L 462.269033 635.728034 -L 462.328276 616.83142 -L 462.351973 623.009986 -L 462.399367 600.660639 -L 462.363822 624.763151 -L 462.470459 613.171051 -L 462.529702 637.179998 -L 462.594869 626.075512 -L 462.719279 584.808281 -L 462.618566 630.710105 -L 462.772598 605.09573 -L 462.796295 599.676813 -L 462.802219 605.89048 -L 462.867386 586.891596 -L 462.902932 609.253623 -L 462.908856 607.428882 -L 462.95625 582.805712 -L 463.015493 610.454952 -L 463.074736 611.905662 -L 463.145828 591.403913 -L 463.228768 614.518888 -L 463.264314 602.48791 -L 463.293935 620.798299 -L 463.335405 601.799741 -L 463.347254 602.177067 -L 463.418345 587.897528 -L 463.382799 603.123671 -L 463.447966 595.696725 -L 463.453891 609.426722 -L 463.548679 578.17469 -L 463.578301 569.670529 -L 463.631619 598.880965 -L 463.684938 602.996239 -L 463.667165 595.181842 -L 463.702711 597.546967 -L 463.821197 586.049951 -L 463.732332 608.242428 -L 463.827121 586.660967 -L 463.892288 594.004212 -L 463.92191 575.463417 -L 463.927834 571.407162 -L 463.957455 600.300526 -L 464.016698 585.451968 -L 464.064093 580.83887 -L 464.08779 589.657624 -L 464.158881 627.205712 -L 464.224048 617.169065 -L 464.229973 616.862584 -L 464.235897 621.931679 -L 464.241821 622.481643 -L 464.25367 616.423555 -L 464.330686 598.093193 -L 464.312913 619.487706 -L 464.366231 608.867808 -L 464.478793 591.151202 -L 464.496566 599.160237 -L 464.644673 634.4772 -L 464.656521 630.825646 -L 464.721689 584.986537 -L 464.780931 600.900248 -L 464.798704 597.929738 -L 464.828326 614.035815 -L 464.863872 603.436475 -L 464.869796 607.880352 -L 464.940887 596.71376 -L 464.970509 600.440341 -L 465.023827 607.969883 -L 465.0416 593.093456 -L 465.059373 597.433555 -L 465.065297 592.420487 -L 465.136389 619.081235 -L 465.142313 621.8599 -L 465.201556 608.64693 -L 465.231177 614.027847 -L 465.278572 606.70749 -L 465.254875 615.893602 -L 465.29042 613.872704 -L 465.426679 636.441233 -L 465.58071 584.482737 -L 465.598483 589.195584 -L 465.687348 599.23678 -L 465.675499 581.930457 -L 465.711045 591.269672 -L 465.716969 591.271781 -L 465.788061 614.654463 -L 465.728818 583.994077 -L 465.876925 601.628701 -L 465.906546 612.144798 -L 465.888774 600.629087 -L 465.936168 601.629621 -L 465.953941 592.752457 -L 465.983562 610.504558 -L 466.048729 596.697905 -L 466.078351 588.870494 -L 466.131669 603.920789 -L 466.202761 598.444389 -L 466.285701 626.664061 -L 466.380489 637.945685 -L 466.416035 595.826209 -L 466.439732 582.735494 -L 466.46343 605.458301 -L 466.469354 609.644437 -L 466.534521 582.858055 -L 466.564142 605.859895 -L 466.682628 588.201562 -L 466.801114 607.006766 -L 466.694477 588.113428 -L 466.807038 597.396355 -L 466.812963 594.576392 -L 466.872205 613.487728 -L 466.884054 611.981917 -L 466.955146 633.092014 -L 466.907751 611.116178 -L 466.990691 611.81053 -L 467.049934 599.11252 -L 467.020313 619.111058 -L 467.12695 606.347038 -L 467.144723 615.715763 -L 467.174344 600.425043 -L 467.227663 603.634791 -L 467.263209 590.271061 -L 467.304679 608.394913 -L 467.346149 592.595349 -L 467.45871 620.692389 -L 467.470559 615.548645 -L 467.476483 612.29561 -L 467.54165 635.937759 -L 467.547574 636.318011 -L 467.553499 628.33393 -L 467.642363 652.79772 -L 467.660136 633.879277 -L 467.671984 627.822803 -L 467.784546 593.600104 -L 467.802319 605.846716 -L 467.814167 613.031083 -L 467.867486 596.799394 -L 467.891183 601.210948 -L 467.95635 589.005966 -L 467.991896 609.665312 -L 468.092609 634.834014 -L 468.110382 628.673263 -L 468.20517 599.638304 -L 468.252565 608.164043 -L 468.359202 620.38904 -L 468.335505 606.335789 -L 468.365126 616.283825 -L 468.430293 586.953171 -L 468.501385 604.317506 -L 468.507309 608.990891 -L 468.584325 593.474947 -L 468.608022 604.441331 -L 468.649492 623.977536 -L 468.726508 597.713386 -L 468.762054 608.234322 -L 468.815372 592.796541 -L 468.821297 596.617936 -L 468.850918 580.204637 -L 468.910161 609.964383 -L 469.016798 628.047506 -L 468.969404 604.019631 -L 469.034571 618.651611 -L 469.164905 599.684787 -L 469.200451 609.729634 -L 469.25377 577.746132 -L 469.330785 566.4764 -L 469.354483 580.702378 -L 469.384104 571.600785 -L 469.484817 606.781055 -L 469.520363 599.209618 -L 469.644773 580.340751 -L 469.704016 592.785878 -L 469.680318 577.983896 -L 469.769183 588.099647 -L 469.816577 571.582239 -L 469.869896 594.375528 -L 469.893593 599.983435 -L 469.970609 574.571023 -L 469.994306 567.965158 -L 470.023927 587.202858 -L 470.035776 583.315263 -L 470.071321 607.027856 -L 470.12464 582.245097 -L 470.148337 592.548933 -L 470.16611 587.046669 -L 470.20758 606.469774 -L 470.225353 603.84468 -L 470.367536 636.289015 -L 470.254974 599.988323 -L 470.397157 623.332697 -L 470.438627 606.405909 -L 470.486022 627.48864 -L 470.509719 619.927872 -L 470.62228 633.10306 -L 470.53934 606.982767 -L 470.640053 631.436718 -L 470.800009 585.478122 -L 470.711145 634.149182 -L 470.823706 585.598254 -L 470.871101 575.584488 -L 470.942192 593.93587 -L 470.954041 589.59965 -L 470.989586 605.592588 -L 471.019208 604.98657 -L 471.149542 626.337479 -L 471.167315 623.045869 -L 471.173239 619.339827 -L 471.226558 641.896255 -L 471.256179 631.842456 -L 471.268028 636.254152 -L 471.333195 619.267542 -L 471.368741 634.784551 -L 471.422059 599.088716 -L 471.540545 610.78675 -L 471.582015 631.61936 -L 471.641258 608.381444 -L 471.659031 586.471458 -L 471.741971 616.753171 -L 471.747895 612.059502 -L 471.813062 600.311111 -L 471.783441 613.850054 -L 471.854532 608.644243 -L 471.860457 612.329147 -L 471.943397 595.57898 -L 472.026337 577.494299 -L 471.978943 597.914406 -L 472.055958 591.018669 -L 472.067807 589.606649 -L 472.08558 599.420489 -L 472.144823 609.506126 -L 472.12705 589.56079 -L 472.198141 603.189145 -L 472.257384 567.014436 -L 472.310703 595.973199 -L 472.316627 594.933379 -L 472.352173 604.395701 -L 472.37587 622.090017 -L 472.45881 599.526317 -L 472.464734 606.180224 -L 472.470659 607.163334 -L 472.512129 598.050995 -L 472.571371 571.627408 -L 472.636539 587.467965 -L 472.70763 609.109249 -L 472.648387 583.176394 -L 472.766873 606.981434 -L 472.879434 584.046096 -L 472.784646 610.343387 -L 472.891283 586.802796 -L 472.950526 627.432858 -L 473.015693 598.289637 -L 473.051239 584.881441 -L 473.110482 605.171546 -L 473.12233 611.125362 -L 473.181573 578.347091 -L 473.193422 579.793108 -L 473.199346 575.815121 -L 473.24674 609.491568 -L 473.264513 600.600361 -L 473.353378 612.293379 -L 473.32968 587.798069 -L 473.365226 602.949537 -L 473.465939 583.497801 -L 473.430393 603.119369 -L 473.477788 587.811405 -L 473.596273 614.567475 -L 473.602198 612.787612 -L 473.631819 630.908981 -L 473.655516 627.69752 -L 473.726608 635.817409 -L 473.673289 621.235864 -L 473.744381 622.176173 -L 473.851018 612.023979 -L 473.768078 634.82693 -L 473.856942 616.798985 -L 473.904336 637.417549 -L 473.981352 632.588805 -L 474.064292 613.276763 -L 474.010974 644.50816 -L 474.105762 625.244054 -L 474.117611 638.349108 -L 474.200551 617.702101 -L 474.212399 627.67025 -L 474.289415 593.95999 -L 474.348658 608.551238 -L 474.431598 596.478684 -L 474.46122 617.326753 -L 474.484917 610.337589 -L 474.478992 626.830808 -L 474.573781 616.356147 -L 474.674494 624.745488 -L 474.6271 605.495154 -L 474.680418 615.981341 -L 474.781131 595.558589 -L 474.804828 604.701627 -L 474.858147 625.460175 -L 474.929238 596.49663 -L 474.935163 602.541358 -L 474.994406 580.492152 -L 475.035876 593.498111 -L 475.101043 608.166073 -L 475.172134 603.720529 -L 475.219529 589.837678 -L 475.231377 604.019898 -L 475.278771 600.977314 -L 475.367636 623.402865 -L 475.302469 597.172519 -L 475.397257 615.754491 -L 475.432803 625.813418 -L 475.486122 606.945089 -L 475.569062 602.53563 -L 475.545364 612.957187 -L 475.586835 606.567933 -L 475.66385 632.269337 -L 475.717169 626.717225 -L 475.723093 625.525314 -L 475.740866 640.72046 -L 475.74679 646.249952 -L 475.811957 610.847407 -L 475.853428 604.249112 -L 475.883049 622.964279 -L 475.91267 607.4335 -L 475.971913 641.092775 -L 476.03708 626.723747 -L 476.161491 596.573154 -L 476.197036 598.120562 -L 476.303673 624.018871 -L 476.327371 622.099228 -L 476.345143 613.234988 -L 476.410311 633.443281 -L 476.487326 645.921094 -L 476.434008 631.351088 -L 476.516948 635.002385 -L 476.611736 604.87834 -L 476.641358 617.355453 -L 476.665055 623.195981 -L 476.712449 614.107304 -L 476.724298 618.569635 -L 476.789465 586.968418 -L 476.830935 613.904604 -L 476.872405 639.582853 -L 476.949421 622.154668 -L 476.955345 623.711933 -L 476.984967 607.352751 -L 477.014588 612.401007 -L 477.073831 619.043675 -L 477.150847 590.768074 -L 477.192317 599.700436 -L 477.180468 589.252456 -L 477.239711 589.726867 -L 477.340424 573.493819 -L 477.358197 579.930474 -L 477.524077 613.386461 -L 477.37597 575.714567 -L 477.54185 606.525206 -L 477.547774 603.084657 -L 477.577396 618.154798 -L 477.642563 608.639394 -L 477.660336 625.582129 -L 477.719579 599.802909 -L 477.743276 601.532783 -L 477.79067 596.679719 -L 477.814367 618.583813 -L 477.826216 611.801935 -L 477.849913 615.874579 -L 477.867686 605.642313 -L 477.879534 607.877456 -L 477.909156 609.694596 -L 478.009869 583.653901 -L 478.075036 608.02662 -L 478.128354 599.644037 -L 478.217219 609.804227 -L 478.199446 593.937489 -L 478.240916 605.726284 -L 478.264613 618.385072 -L 478.306083 600.050117 -L 478.341629 610.669764 -L 478.353477 600.410744 -L 478.37125 617.195149 -L 478.45419 608.257701 -L 478.466039 603.695716 -L 478.519358 620.251901 -L 478.554903 589.453215 -L 478.566752 594.838912 -L 478.637843 583.765214 -L 478.590449 606.495431 -L 478.679313 588.384171 -L 478.697086 602.637584 -L 478.774102 588.047644 -L 478.791875 601.659325 -L 478.809648 587.627375 -L 478.874815 615.628794 -L 478.886663 608.281932 -L 478.904436 623.327931 -L 478.975528 602.152927 -L 479.034771 577.811436 -L 479.082165 599.728633 -L 479.111786 625.301849 -L 479.194726 606.883172 -L 479.242121 596.762161 -L 479.259894 609.237338 -L 479.301364 603.854302 -L 479.396152 633.953817 -L 479.431698 625.78839 -L 479.437622 625.456321 -L 479.443547 628.148739 -L 479.449471 631.173169 -L 479.485017 607.665141 -L 479.508714 609.659472 -L 479.54426 597.412745 -L 479.579805 629.186224 -L 479.769382 585.428368 -L 479.804928 591.825862 -L 479.929338 640.756958 -L 479.935263 634.181474 -L 480.024127 624.847709 -L 479.982657 644.311968 -L 480.0419 633.416658 -L 480.047824 634.271403 -L 480.053748 626.076014 -L 480.101143 611.817615 -L 480.172234 612.51446 -L 480.184083 602.305159 -L 480.201856 618.433428 -L 480.278871 612.156147 -L 480.29072 617.925156 -L 480.37366 601.841182 -L 480.450676 590.953058 -L 480.391433 606.86414 -L 480.486221 599.877202 -L 480.509919 595.470082 -L 480.533616 605.580312 -L 480.604707 619.410981 -L 480.628404 599.094119 -L 480.646177 610.995749 -L 480.658026 610.613515 -L 480.669874 618.511872 -L 480.740966 586.003352 -L 480.776512 571.9197 -L 480.82983 586.353399 -L 480.853527 580.972388 -L 480.972013 639.134963 -L 480.989786 623.092532 -L 481.066802 610.052412 -L 481.108272 616.126699 -L 481.114196 615.907248 -L 481.143818 627.840882 -L 481.179363 610.198407 -L 481.220833 615.052829 -L 481.226758 615.280134 -L 481.232682 613.470418 -L 481.238606 614.756956 -L 481.268228 635.917093 -L 481.357092 629.244724 -L 481.404486 634.546365 -L 481.493351 611.456793 -L 481.517048 620.497491 -L 481.582215 600.394841 -L 481.588139 603.535317 -L 481.742171 571.693581 -L 481.611836 606.190748 -L 481.765868 576.26739 -L 481.831035 605.425661 -L 481.890278 593.376531 -L 481.913975 580.689665 -L 481.979142 599.910523 -L 481.990991 592.824655 -L 482.056158 613.975915 -L 482.109477 609.657985 -L 482.115401 609.414079 -L 482.133174 623.049235 -L 482.192417 603.522418 -L 482.227962 613.942094 -L 482.405691 643.359319 -L 482.269432 613.569318 -L 482.429388 629.382293 -L 482.589344 598.241983 -L 482.453085 641.281791 -L 482.613041 604.843371 -L 482.684133 615.681395 -L 482.719678 602.296483 -L 482.761148 604.822504 -L 482.772997 598.42683 -L 482.778921 600.381737 -L 482.808543 593.002755 -L 482.838164 614.34184 -L 482.861861 607.025916 -L 483.092909 567.878398 -L 483.098833 573.609363 -L 483.199546 589.859994 -L 483.140303 570.790098 -L 483.223243 589.657388 -L 483.241016 586.575566 -L 483.252864 596.00824 -L 483.347653 624.091938 -L 483.264713 592.718617 -L 483.377274 612.447976 -L 483.477987 589.258084 -L 483.501685 600.092177 -L 483.643867 621.732386 -L 483.768278 592.394162 -L 483.691262 623.077266 -L 483.774202 600.179477 -L 483.809748 595.924991 -L 483.851218 610.112561 -L 483.95193 654.018717 -L 483.987476 640.964248 -L 484.064492 613.762851 -L 484.117811 616.68519 -L 484.206675 622.12688 -L 484.141508 604.154862 -L 484.242221 621.74986 -L 484.265918 597.779753 -L 484.348858 616.299657 -L 484.414025 630.869443 -L 484.455495 616.313789 -L 484.520662 605.490308 -L 484.573981 607.446014 -L 484.579905 607.532444 -L 484.591754 615.284028 -L 484.668769 601.387322 -L 484.680618 604.847489 -L 484.686542 604.6905 -L 484.692467 599.734483 -L 484.769482 627.849927 -L 484.935362 597.541286 -L 484.982757 626.005626 -L 485.08347 611.58331 -L 485.113091 617.001736 -L 485.225653 593.752564 -L 485.243425 590.324584 -L 485.255274 602.4163 -L 485.261198 598.835197 -L 485.267123 602.728775 -L 485.350063 588.196672 -L 485.361911 592.810346 -L 485.367836 592.113077 -L 485.409306 597.073126 -L 485.421154 594.24077 -L 485.492246 578.681047 -L 485.53964 608.151764 -L 485.587034 592.154736 -L 485.551488 616.032071 -L 485.652201 605.074145 -L 485.74699 622.332655 -L 485.70552 602.893111 -L 485.764763 608.953996 -L 485.776611 607.987486 -L 485.782536 613.412714 -L 485.78846 623.668145 -L 485.853627 597.592047 -L 485.883249 606.918322 -L 485.948416 585.621156 -L 486.001734 589.263033 -L 486.07875 609.011687 -L 486.025432 580.818118 -L 486.12022 597.333632 -L 486.24463 569.398296 -L 486.36904 604.462091 -L 486.386813 600.756954 -L 486.392738 595.233748 -L 486.434208 616.719858 -L 486.49345 603.974604 -L 486.53492 591.507643 -L 486.57639 612.19956 -L 486.582315 606.835606 -L 486.677103 632.445852 -L 486.694876 622.829719 -L 486.706725 605.323031 -L 486.777816 625.227131 -L 486.801513 622.898092 -L 486.819286 634.123616 -L 486.884454 607.765474 -L 486.931848 620.599991 -L 487.008864 595.061725 -L 487.026636 577.411476 -L 487.074031 603.019938 -L 487.085879 596.245589 -L 487.156971 630.601395 -L 487.204365 607.941628 -L 487.210289 600.412943 -L 487.275457 640.260938 -L 487.293229 634.561633 -L 487.435412 599.238673 -L 487.476882 612.986783 -L 487.547974 624.615587 -L 487.524277 610.987823 -L 487.577595 616.616985 -L 487.642762 594.213154 -L 487.690157 609.512468 -L 487.83234 636.439969 -L 487.95675 611.158389 -L 487.87381 639.832414 -L 487.962674 611.667614 -L 488.033766 625.523235 -L 488.075236 613.810021 -L 488.08116 613.604106 -L 488.104857 626.230683 -L 488.158176 603.983364 -L 488.193721 618.093055 -L 488.229267 610.015503 -L 488.28851 622.185376 -L 488.294434 616.515334 -L 488.324056 622.046861 -L 488.383299 608.240605 -L 488.395147 612.877722 -L 488.401071 604.460407 -L 488.489936 634.026887 -L 488.549179 646.554196 -L 488.572876 627.532096 -L 488.614346 643.395635 -L 488.78615 590.167386 -L 488.792075 590.428504 -L 488.928333 619.352241 -L 488.975728 599.921795 -L 489.046819 604.929184 -L 489.100138 593.764192 -L 489.058668 605.363234 -L 489.111986 604.055524 -L 489.11791 612.307751 -L 489.183078 592.535985 -L 489.218623 602.920055 -L 489.224548 598.770692 -L 489.248245 613.071416 -L 489.313412 606.480009 -L 489.319336 619.616363 -L 489.378579 595.057372 -L 489.420049 609.999283 -L 489.485216 595.660813 -L 489.514838 613.067177 -L 489.532611 606.410308 -L 489.538535 611.051566 -L 489.597778 596.421575 -L 489.627399 600.942114 -L 489.668869 604.497489 -L 489.775507 567.83179 -L 489.852522 555.083158 -L 489.811052 572.700023 -L 489.870295 568.825739 -L 490.012478 598.610477 -L 490.053948 586.498556 -L 490.101342 604.913126 -L 490.12504 594.164889 -L 490.20798 622.987372 -L 490.24945 603.934042 -L 490.344238 579.998137 -L 490.397557 587.924662 -L 490.492345 605.171636 -L 490.41533 579.159526 -L 490.516043 594.954526 -L 490.634528 623.000117 -L 490.533815 587.780896 -L 490.670074 604.305902 -L 490.711544 583.343783 -L 490.770787 608.456841 -L 490.782636 613.993578 -L 490.835954 583.884394 -L 490.865576 600.639194 -L 490.889273 586.419861 -L 490.936667 605.919186 -L 490.960364 600.605858 -L 491.007759 626.934369 -L 491.072926 611.591672 -L 491.102547 598.225679 -L 491.155866 617.130182 -L 491.173639 613.667456 -L 491.185487 602.74794 -L 491.321746 646.84401 -L 491.487626 607.687281 -L 491.552793 627.942826 -L 491.523172 604.227034 -L 491.600188 612.530656 -L 491.635733 585.867225 -L 491.694976 621.92189 -L 491.724598 636.557034 -L 491.78384 619.970232 -L 491.801613 621.083126 -L 491.949721 598.746853 -L 491.961569 604.213407 -L 492.026736 584.343093 -L 492.044509 589.66474 -L 492.062282 586.394382 -L 492.103752 601.302062 -L 492.145222 594.41291 -L 492.157071 591.66025 -L 492.162995 583.237241 -L 492.251859 599.58927 -L 492.263708 595.850776 -L 492.269632 593.988217 -L 492.305178 609.455011 -L 492.311102 609.429668 -L 492.317026 615.677557 -L 492.364421 593.842898 -L 492.417739 613.506382 -L 492.447361 603.48156 -L 492.506604 620.161875 -L 492.530301 609.105444 -L 492.571771 624.148314 -L 492.625089 607.704034 -L 492.631014 608.023546 -L 492.648787 598.800264 -L 492.690257 612.652206 -L 492.696181 610.349042 -L 492.713954 628.875229 -L 492.79097 590.432308 -L 492.796894 595.469575 -L 492.814667 589.297476 -L 492.927228 546.961307 -L 492.950925 558.504657 -L 493.03979 610.012353 -L 493.099033 595.874674 -L 493.128654 591.124522 -L 493.116805 601.951214 -L 493.187897 599.414422 -L 493.312307 618.284876 -L 493.365626 604.849251 -L 493.341928 630.341713 -L 493.424869 612.286236 -L 493.53743 636.589922 -L 493.555203 619.935377 -L 493.638143 611.581 -L 493.655916 623.040561 -L 493.66184 624.83702 -L 493.685537 614.488733 -L 493.721083 615.534342 -L 493.839569 585.231898 -L 493.851417 588.16614 -L 493.857342 588.11574 -L 493.958055 626.421205 -L 493.9936 609.789756 -L 493.999525 607.072687 -L 494.058767 625.449117 -L 494.064692 628.23617 -L 494.123935 604.048028 -L 494.165405 587.769354 -L 494.212799 605.854458 -L 494.236496 596.145411 -L 494.313512 620.346095 -L 494.354982 606.43311 -L 494.414225 604.744612 -L 494.479392 619.551656 -L 494.485316 617.66963 -L 494.509013 633.868388 -L 494.556408 626.571963 -L 494.574181 640.023661 -L 494.663045 626.629526 -L 494.674893 622.997878 -L 494.704515 638.950891 -L 494.710439 643.681987 -L 494.740061 619.516262 -L 494.799304 626.438788 -L 494.894092 605.242381 -L 494.817076 633.583812 -L 494.917789 610.523461 -L 495.018502 625.318283 -L 495.036275 621.283088 -L 495.042199 621.087237 -L 495.125139 629.597105 -L 495.083669 611.717818 -L 495.142912 616.791865 -L 495.148837 612.344822 -L 495.237701 627.913843 -L 495.273247 613.428564 -L 495.409505 591.056264 -L 495.486521 613.49673 -L 495.522067 601.490064 -L 495.527991 595.913645 -L 495.599083 615.407967 -L 495.62278 610.140348 -L 495.628704 610.688181 -L 495.646477 604.603884 -L 495.66425 597.928142 -L 495.741265 614.566152 -L 495.841978 586.773941 -L 495.78866 614.57233 -L 495.883448 601.056798 -L 496.061177 629.682925 -L 495.930843 598.644887 -L 496.067101 617.018127 -L 496.191511 594.22697 -L 496.07895 617.932309 -L 496.227057 603.291008 -L 496.274451 611.169345 -L 496.304073 596.710073 -L 496.333694 599.764931 -L 496.49365 625.027421 -L 496.623985 588.81669 -L 496.671379 605.509118 -L 496.74247 630.090013 -L 496.712849 604.327826 -L 496.789865 617.606787 -L 496.902426 584.336867 -L 496.843183 620.377089 -L 496.926123 585.472682 -L 497.080155 640.677649 -L 497.086079 636.855056 -L 497.210489 603.647954 -L 497.127549 642.817056 -L 497.222338 604.973444 -L 497.323051 594.709425 -L 497.246035 610.509424 -L 497.334899 601.173766 -L 497.429688 628.323491 -L 497.346748 595.366974 -L 497.453385 618.200942 -L 497.589644 573.863701 -L 497.601492 578.095393 -L 497.648887 630.451823 -L 497.719978 662.878789 -L 497.767372 647.29715 -L 497.773297 647.912314 -L 497.785145 639.903797 -L 497.826615 623.343385 -L 497.897707 635.333611 -L 497.91548 629.057081 -L 497.939177 637.44313 -L 497.951025 641.893353 -L 498.004344 615.133514 -L 498.010268 615.767824 -L 498.016192 615.35339 -L 498.069511 635.554276 -L 498.116905 602.168881 -L 498.182073 603.838883 -L 498.241315 588.354976 -L 498.359801 609.950384 -L 498.312407 588.054614 -L 498.395347 605.655267 -L 498.49606 586.402189 -L 498.436817 607.028713 -L 498.507908 592.913624 -L 498.614546 608.906176 -L 498.632318 605.540346 -L 498.638243 605.433875 -L 498.756729 629.559657 -L 498.762653 627.595642 -L 498.863366 602.896106 -L 498.887063 606.521946 -L 498.928533 624.599482 -L 498.958154 599.302772 -L 498.9937 607.322479 -L 499.017397 594.684158 -L 499.07664 613.987599 -L 499.094413 631.504887 -L 499.153656 606.955297 -L 499.189202 618.608344 -L 499.195126 621.195423 -L 499.266217 605.046518 -L 499.390627 586.34058 -L 499.301763 617.7176 -L 499.426173 590.27352 -L 499.497265 615.320704 -L 499.544659 597.341388 -L 499.556508 602.710449 -L 499.603902 590.972029 -L 499.609826 592.856572 -L 499.61575 579.417439 -L 499.674993 615.103038 -L 499.710539 613.158513 -L 499.829025 586.618016 -L 499.763858 615.855383 -L 499.870495 597.295689 -L 499.906041 625.980031 -L 499.983056 601.238894 -L 500.048224 574.047029 -L 500.119315 590.144063 -L 500.160785 581.790302 -L 500.196331 596.449425 -L 500.202255 594.303981 -L 500.302968 623.702828 -L 500.338514 606.499206 -L 500.350362 601.129809 -L 500.362211 613.260577 -L 500.368135 626.367281 -L 500.421454 600.988888 -L 500.468848 608.347839 -L 500.474772 608.657639 -L 500.480697 603.281228 -L 500.492545 596.850793 -L 500.528091 617.039228 -L 500.557712 610.910225 -L 500.563637 615.856585 -L 500.646577 598.614505 -L 500.66435 607.795929 -L 500.70582 597.545374 -L 500.676198 614.352371 -L 500.741365 609.343387 -L 500.800608 624.433373 -L 500.853927 614.239767 -L 500.877624 602.043881 -L 500.95464 623.500818 -L 500.984261 608.390891 -L 501.061277 623.635169 -L 501.067201 628.978097 -L 501.108671 611.024638 -L 501.173838 627.889392 -L 501.185687 623.868982 -L 501.20346 628.456921 -L 501.262703 634.398124 -L 501.32787 599.383793 -L 501.381189 613.23247 -L 501.440431 602.279141 -L 501.517447 580.459608 -L 501.45228 605.162692 -L 501.552993 596.829855 -L 501.65963 622.924308 -L 501.606312 590.010171 -L 501.689252 613.596032 -L 501.730722 597.931081 -L 501.7011 614.652666 -L 501.78404 610.703955 -L 501.813662 622.645558 -L 501.884753 603.030898 -L 501.943996 586.918626 -L 501.973617 611.029983 -L 501.997315 621.402078 -L 502.062482 593.729964 -L 502.07433 597.257309 -L 502.127649 605.866644 -L 502.103952 591.230471 -L 502.180968 598.229676 -L 502.257983 593.083743 -L 502.216513 607.750609 -L 502.275756 595.579791 -L 502.370545 634.251435 -L 502.406091 629.650732 -L 502.417939 621.265872 -L 502.423863 621.56176 -L 502.453485 612.169766 -L 502.512728 631.827012 -L 502.530501 624.894254 -L 502.536425 628.67219 -L 502.583819 607.296254 -L 502.613441 609.5671 -L 502.631214 599.538838 -L 502.708229 627.688688 -L 502.832639 592.830829 -L 502.868185 597.589485 -L 502.980747 631.920844 -L 502.986671 627.009028 -L 503.075535 602.244773 -L 503.016292 628.486507 -L 503.111081 603.109467 -L 503.1644 613.217952 -L 503.235491 628.608984 -L 503.176248 610.764369 -L 503.276961 619.030212 -L 503.282885 614.81779 -L 503.353977 632.02627 -L 503.365825 630.403359 -L 503.37175 631.022106 -L 503.377674 620.419827 -L 503.383598 623.917714 -L 503.478387 601.05978 -L 503.425068 626.846505 -L 503.502084 605.054224 -L 503.519857 614.319638 -L 503.555403 601.117396 -L 503.608721 604.50613 -L 503.697586 623.278955 -L 503.733131 607.348875 -L 503.750904 606.409742 -L 503.756828 608.894597 -L 503.810147 626.137475 -L 503.863466 608.639013 -L 503.86939 614.043072 -L 503.940481 597.606915 -L 503.976027 615.138004 -L 504.070816 634.566957 -L 504.100437 627.232409 -L 504.147831 611.38358 -L 504.195226 628.457713 -L 504.212999 623.010397 -L 504.218923 620.536643 -L 504.266317 634.453614 -L 504.290014 632.954185 -L 504.319636 638.589028 -L 504.355182 617.001409 -L 504.361106 617.56228 -L 504.509213 589.399763 -L 504.414424 628.723344 -L 504.526986 593.791049 -L 504.598077 623.161583 -L 504.544759 590.753399 -L 504.65732 611.197641 -L 504.675093 600.806927 -L 504.728412 628.665575 -L 504.763958 615.719801 -L 504.829125 632.766194 -L 504.858746 615.629696 -L 504.870595 615.900309 -L 504.983156 587.114805 -L 504.989081 578.847361 -L 505.066096 600.926251 -L 505.083869 600.844157 -L 505.089793 600.077979 -L 505.107566 610.69508 -L 505.160885 604.675482 -L 505.231976 623.840676 -L 505.267522 604.467907 -L 505.279371 615.254677 -L 505.320841 600.9735 -L 505.338614 627.850227 -L 505.344538 626.662287 -L 505.350462 634.134138 -L 505.433402 611.036453 -L 505.439326 616.983953 -L 505.445251 611.851989 -L 505.492645 629.558427 -L 505.551888 612.934388 -L 505.557812 618.523354 -L 505.628904 597.969463 -L 505.640752 598.531576 -L 505.723692 583.60102 -L 505.765162 589.305206 -L 505.800708 612.489473 -L 505.865875 585.578341 -L 505.8718 585.871204 -L 505.966588 573.78413 -L 505.925118 598.465325 -L 505.990285 579.888128 -L 506.126544 610.734886 -L 506.156165 593.429012 -L 506.209484 583.489994 -L 506.24503 601.451573 -L 506.262803 597.095599 -L 506.316121 611.315697 -L 506.375364 598.151203 -L 506.41091 586.51312 -L 506.470153 600.597516 -L 506.49385 604.920425 -L 506.53532 584.404111 -L 506.564941 592.22787 -L 506.588639 584.567809 -L 506.630109 612.168931 -L 506.641957 607.772107 -L 506.65973 610.942007 -L 506.671579 603.586627 -L 506.748594 582.459762 -L 506.78414 596.848581 -L 506.938172 629.70116 -L 507.062582 596.998513 -L 507.068506 596.846272 -L 507.080355 598.143693 -L 507.127749 617.652997 -L 507.204765 605.733647 -L 507.216613 596.967612 -L 507.252159 625.896446 -L 507.269932 620.481887 -L 507.275856 622.545384 -L 507.305477 610.670529 -L 507.346948 614.247977 -L 507.441736 603.998349 -L 507.370645 625.283954 -L 507.459509 610.782597 -L 507.477282 616.083704 -L 507.495055 619.738949 -L 507.554298 597.729907 -L 507.589843 612.584906 -L 507.655011 595.499714 -L 507.737951 619.46489 -L 507.761648 595.349542 -L 507.773496 607.67338 -L 507.826815 596.337882 -L 507.880134 600.699004 -L 507.939376 614.6492 -L 507.980846 582.971231 -L 508.081559 566.519765 -L 507.992695 587.155513 -L 508.117105 574.470431 -L 508.259288 594.953796 -L 508.306682 577.259107 -L 508.348152 601.954318 -L 508.365925 593.475824 -L 508.460714 612.626214 -L 508.407395 593.321707 -L 508.502184 600.187351 -L 508.508108 600.349556 -L 508.53773 592.957049 -L 508.591048 614.250645 -L 508.596972 610.181133 -L 508.602897 610.216358 -L 508.614745 622.72981 -L 508.70361 604.376154 -L 508.709534 598.022142 -L 508.78655 622.486272 -L 508.875414 647.143997 -L 508.822095 620.425809 -L 508.905036 638.257054 -L 509.011673 642.677902 -L 508.964278 632.054787 -L 509.017597 639.194248 -L 509.029446 644.205785 -L 509.059067 625.908324 -L 509.142007 616.496998 -L 509.106461 639.941463 -L 509.15978 624.58498 -L 509.20125 635.96686 -L 509.183477 623.167134 -L 509.260493 624.236854 -L 509.301963 615.562661 -L 509.343433 629.959618 -L 509.373054 623.186396 -L 509.49154 647.467363 -L 509.503389 629.71693 -L 509.639647 613.092197 -L 509.538934 636.161934 -L 509.651496 618.649072 -L 509.681117 631.693927 -L 509.746285 612.724572 -L 509.775906 589.742549 -L 509.841073 618.652146 -L 509.846997 617.161481 -L 509.852922 619.39541 -L 509.870695 607.649294 -L 509.941786 614.257573 -L 510.078045 578.888866 -L 509.959559 619.791954 -L 510.089893 588.958296 -L 510.249849 637.089666 -L 510.273546 632.567165 -L 510.380183 617.712757 -L 510.332789 637.441946 -L 510.397956 619.367059 -L 510.403881 619.632899 -L 510.480896 633.35639 -L 510.457199 615.811124 -L 510.516442 623.189274 -L 510.569761 638.149042 -L 510.599382 626.51111 -L 510.658625 589.139129 -L 510.723792 604.342224 -L 510.753414 598.108375 -L 510.783035 613.290964 -L 510.794884 611.698328 -L 510.848202 644.855145 -L 510.895597 611.650787 -L 510.907445 616.821496 -L 511.002234 637.84671 -L 510.931142 608.347653 -L 511.12072 633.976318 -L 511.150341 638.769471 -L 511.251054 609.669614 -L 511.256978 609.463654 -L 511.262903 611.199127 -L 511.32807 618.396322 -L 511.339918 600.151513 -L 511.363615 609.841209 -L 511.446555 599.965234 -L 511.405085 613.4179 -L 511.476177 602.10525 -L 511.505798 611.660848 -L 511.523571 594.413558 -L 511.57689 597.701323 -L 511.707224 582.989139 -L 511.600587 605.961567 -L 511.713148 586.640932 -L 511.748694 596.849574 -L 511.807937 589.186799 -L 511.896801 581.57972 -L 511.861256 599.465487 -L 511.920499 584.118407 -L 511.956044 595.45337 -L 512.021211 583.637041 -L 512.038984 595.420934 -L 512.116 586.703786 -L 512.056757 598.240093 -L 512.121924 597.621633 -L 512.145622 619.330972 -L 512.222637 589.718653 -L 512.228562 586.114787 -L 512.305577 605.170855 -L 512.311502 602.798444 -L 512.317426 603.357988 -L 512.329275 594.338199 -L 512.382593 576.635786 -L 512.424063 598.450942 -L 512.435912 596.977084 -L 512.495155 579.580612 -L 512.5307 603.487414 -L 512.542549 596.204491 -L 512.548473 596.535724 -L 512.61364 629.543463 -L 512.672883 624.391025 -L 512.714353 596.26143 -L 512.797293 618.186947 -L 512.815066 620.291694 -L 512.826915 613.633816 -L 512.856536 592.216174 -L 512.927628 619.960586 -L 512.933552 614.477319 -L 512.957249 615.550533 -L 512.951325 607.962319 -L 512.963173 613.05795 -L 513.010568 590.822899 -L 513.081659 598.797869 -L 513.087583 598.825043 -L 513.182372 583.041172 -L 513.200145 592.204802 -L 513.223842 587.537904 -L 513.277161 599.514965 -L 513.289009 596.965109 -L 513.360101 616.419898 -L 513.413419 616.02302 -L 513.478587 633.16196 -L 513.531905 604.974748 -L 513.543754 601.452294 -L 513.561527 608.307696 -L 513.591148 614.803753 -L 513.656315 595.465078 -L 513.66224 591.130261 -L 513.74518 611.195128 -L 513.751104 609.848698 -L 513.780725 627.44033 -L 513.810347 619.451449 -L 513.839968 634.428486 -L 513.922908 632.630086 -L 514.017697 609.619713 -L 513.946605 639.506836 -L 514.03547 623.033726 -L 514.11841 600.269461 -L 514.053243 631.972698 -L 514.15988 613.491235 -L 514.213198 632.547735 -L 514.183577 610.386767 -L 514.266517 613.064874 -L 514.290214 599.565266 -L 514.331684 626.201947 -L 514.337608 627.285343 -L 514.349457 616.489152 -L 514.355381 617.201236 -L 514.414624 580.98962 -L 514.473867 603.622471 -L 514.550883 592.930255 -L 514.515337 611.153598 -L 514.57458 604.203502 -L 514.586429 614.344941 -L 514.663444 585.535712 -L 514.675293 593.311179 -L 514.681217 593.051165 -L 514.687142 595.556613 -L 514.69899 618.454252 -L 514.805627 614.699049 -L 514.965583 574.366513 -L 514.829324 616.891844 -L 514.983356 585.5077 -L 515.101842 609.122998 -L 515.007053 577.521553 -L 515.107766 606.776636 -L 515.125539 620.679987 -L 515.149236 601.243014 -L 515.2381 616.085005 -L 515.380283 577.785866 -L 515.415829 584.333312 -L 515.546163 615.940847 -L 515.552088 615.576434 -L 515.777211 583.740561 -L 515.800908 585.194707 -L 515.978636 619.126139 -L 515.842378 579.611608 -L 515.990485 617.205889 -L 516.020107 607.85741 -L 516.002334 617.728133 -L 516.031955 609.841755 -L 516.067501 597.838949 -L 516.108971 617.46043 -L 516.138592 611.429943 -L 516.150441 621.852686 -L 516.233381 603.997956 -L 516.239305 612.122556 -L 516.351867 578.382867 -L 516.375564 585.678543 -L 516.381488 585.780376 -L 516.505898 622.333844 -L 516.511823 616.838517 -L 516.600687 626.791209 -L 516.57699 613.346586 -L 516.606611 620.950715 -L 516.677703 607.361068 -L 516.636233 627.661211 -L 516.713248 610.446353 -L 516.725097 620.238635 -L 516.813961 600.837015 -L 516.885053 606.535559 -L 516.855431 591.083413 -L 516.902826 593.263806 -L 516.944296 583.083944 -L 516.997614 602.270794 -L 517.145721 583.438767 -L 517.151646 591.443669 -L 517.169419 607.194237 -L 517.252359 584.473514 -L 517.276056 588.183908 -L 517.287904 570.683001 -L 517.311602 574.115531 -L 517.335299 567.786205 -L 517.394542 584.918034 -L 517.400466 581.369135 -L 517.518952 616.496251 -L 517.524876 610.133151 -L 517.607816 628.189762 -L 517.643362 619.958737 -L 517.755923 596.294493 -L 517.773696 605.67097 -L 517.785545 607.810915 -L 517.791469 605.295392 -L 517.803317 606.002309 -L 517.809242 597.682137 -L 517.886258 641.232516 -L 517.90403 639.627875 -L 517.898106 643.568449 -L 517.909955 641.860294 -L 518.046213 593.010099 -L 518.052138 596.771316 -L 518.06991 611.718552 -L 518.117305 587.05871 -L 518.146926 590.718727 -L 518.152851 582.730165 -L 518.223942 595.959643 -L 518.253563 590.119801 -L 518.259488 589.953126 -L 518.265412 582.960139 -L 518.318731 611.673145 -L 518.366125 593.87076 -L 518.537929 639.000889 -L 518.383898 592.034131 -L 518.549778 629.760983 -L 518.644567 590.769092 -L 518.680112 604.081347 -L 518.686037 597.426922 -L 518.768977 619.42117 -L 518.834144 648.706351 -L 518.887462 630.142045 -L 519.03557 600.084351 -L 518.91116 635.51783 -L 519.053342 612.548003 -L 519.130358 636.466051 -L 519.171828 627.29501 -L 519.355481 581.597733 -L 519.361405 584.087501 -L 519.509513 616.165796 -L 519.515437 606.395754 -L 519.521361 603.991236 -L 519.568756 621.40362 -L 519.592453 611.480388 -L 519.598377 618.053256 -L 519.65762 598.084723 -L 519.693166 606.469471 -L 519.835349 575.366147 -L 519.74056 613.645216 -L 519.847197 579.900434 -L 519.941986 621.718379 -L 520.024926 618.601921 -L 520.125639 601.202219 -L 520.084169 621.691653 -L 520.137487 606.158062 -L 520.143412 613.82793 -L 520.232276 586.236718 -L 520.2382 592.890714 -L 520.250049 592.349692 -L 520.255973 592.70599 -L 520.285595 581.16203 -L 520.327065 603.358416 -L 520.332989 602.961916 -L 520.380383 596.006884 -L 520.457399 621.528212 -L 520.546263 631.235377 -L 520.48702 618.013051 -L 520.552188 629.864593 -L 520.575885 613.397407 -L 520.646976 642.278811 -L 520.6529 641.396433 -L 520.664749 642.587164 -L 520.789159 623.227547 -L 520.812856 630.676138 -L 520.860251 601.505619 -L 520.872099 598.524893 -L 520.907645 609.627524 -L 520.925418 606.33275 -L 521.026131 617.716098 -L 520.943191 605.850097 -L 521.037979 608.040887 -L 521.049828 599.206053 -L 521.120919 634.801083 -L 521.126844 631.338543 -L 521.174238 650.423103 -L 521.239405 635.569129 -L 521.310497 610.698006 -L 521.357891 620.796649 -L 521.434907 631.479746 -L 521.458604 613.896967 -L 521.464528 618.339019 -L 521.547468 586.986851 -L 521.61856 591.42487 -L 521.772591 631.356122 -L 521.778515 626.804648 -L 521.891077 581.83429 -L 521.920698 598.79457 -L 521.956244 611.080281 -L 522.03326 602.272879 -L 522.133973 639.623927 -L 522.293929 631.24874 -L 522.317626 607.303971 -L 522.40649 625.853617 -L 522.507203 633.570188 -L 522.44796 619.925257 -L 522.513127 626.062808 -L 522.607916 600.345764 -L 522.649386 605.346286 -L 522.661234 611.583249 -L 522.720477 588.935352 -L 522.744174 599.732023 -L 522.756023 599.515625 -L 522.797493 611.777664 -L 522.838963 634.989111 -L 522.90413 618.828212 -L 522.98707 592.229437 -L 522.915979 619.306718 -L 523.016692 599.274613 -L 523.075935 633.7847 -L 523.141102 624.508796 -L 523.170723 630.94636 -L 523.206269 610.092493 -L 523.27736 593.534432 -L 523.31883 604.350482 -L 523.336603 593.630122 -L 523.401771 616.130657 -L 523.419543 614.672866 -L 523.538029 594.329628 -L 523.496559 614.763039 -L 523.549878 597.626552 -L 523.674288 617.497217 -L 523.573575 594.086929 -L 523.680212 616.751425 -L 523.786849 601.105532 -L 523.715758 617.163369 -L 523.798698 607.364681 -L 523.911259 629.515986 -L 523.840168 606.592345 -L 523.917184 626.430526 -L 523.976427 604.165642 -L 524.029745 612.867569 -L 524.083064 642.832276 -L 524.154155 637.657923 -L 524.16008 637.484519 -L 524.166004 639.80201 -L 524.207474 648.256995 -L 524.237095 627.996907 -L 524.24302 628.294741 -L 524.260792 641.151218 -L 524.290414 626.385391 -L 524.355581 634.718363 -L 524.468143 613.67094 -L 524.503688 616.223651 -L 524.515537 620.595099 -L 524.557007 606.121602 -L 524.57478 607.34053 -L 524.592553 596.684025 -L 524.634023 623.670647 -L 524.663644 622.34363 -L 524.675493 630.672961 -L 524.716963 608.48982 -L 524.764357 614.196114 -L 524.847297 619.211558 -L 524.811751 600.229606 -L 524.86507 611.86732 -L 524.983556 561.803495 -L 525.013177 572.170526 -L 525.167209 636.58178 -L 525.184982 646.024814 -L 525.244224 632.318505 -L 525.256073 633.613643 -L 525.27977 627.333032 -L 525.315316 640.598439 -L 525.40418 652.652201 -L 525.339013 639.57367 -L 525.416029 642.983397 -L 525.558212 601.5175 -L 525.653 589.495297 -L 525.641152 605.113093 -L 525.670773 597.616126 -L 525.812956 633.961063 -L 525.878123 599.036399 -L 525.931442 608.634047 -L 525.937366 615.606612 -L 526.014382 577.071846 -L 526.020306 586.728852 -L 526.026231 586.580185 -L 526.032155 580.184333 -L 526.097322 592.382195 -L 526.126943 591.070948 -L 526.257278 630.540128 -L 526.209883 586.326344 -L 526.292824 610.44791 -L 526.298748 610.712892 -L 526.310596 607.937473 -L 526.316521 597.307304 -L 526.381688 624.664773 -L 526.417234 615.389494 -L 526.476476 606.585834 -L 526.494249 620.358925 -L 526.523871 610.949055 -L 526.529795 617.350999 -L 526.606811 590.135616 -L 526.624584 603.150372 -L 526.630508 597.824299 -L 526.707524 613.954348 -L 526.731221 606.469741 -L 526.737145 603.100264 -L 526.778615 613.746326 -L 526.831934 611.718434 -L 526.855631 629.891666 -L 526.891177 605.321321 -L 526.944495 616.241143 -L 527.015587 604.810438 -L 526.962268 620.477847 -L 527.045208 616.135359 -L 527.092603 632.828056 -L 527.151845 612.974299 -L 527.264407 592.01132 -L 527.181467 613.490601 -L 527.270331 600.594664 -L 527.36512 616.085515 -L 527.32365 598.308086 -L 527.394741 613.474071 -L 527.453984 599.787332 -L 527.501378 611.192927 -L 527.619864 630.313939 -L 527.65541 592.0017 -L 527.750199 603.507708 -L 527.874609 639.856345 -L 527.892382 634.517226 -L 527.922003 635.978084 -L 528.016792 603.695423 -L 528.02864 596.342825 -L 528.164899 627.599994 -L 528.283385 600.434671 -L 528.289309 604.936656 -L 528.3604 629.572713 -L 528.40187 607.286078 -L 528.467038 636.744305 -L 528.573675 629.53539 -L 528.632918 593.34459 -L 528.698085 605.087799 -L 528.781025 624.359749 -L 528.727706 598.257921 -L 528.816571 611.681628 -L 528.905435 595.033794 -L 528.869889 612.350868 -L 528.935056 602.052513 -L 528.964678 620.053434 -L 529.006148 598.521378 -L 529.041694 599.049395 -L 529.231271 632.753808 -L 529.089088 597.128215 -L 529.249044 629.447941 -L 529.254968 629.61862 -L 529.343832 638.767261 -L 529.308287 621.838628 -L 529.36753 631.462679 -L 529.509712 591.939994 -L 529.397151 632.37131 -L 529.527485 600.963691 -L 529.539334 603.170935 -L 529.586728 586.843949 -L 529.651895 570.695227 -L 529.604501 587.28982 -L 529.705214 572.482897 -L 529.8237 609.33702 -L 529.746684 565.626741 -L 529.835548 602.674259 -L 529.912564 590.562957 -L 529.86517 615.776952 -L 529.942186 603.064813 -L 530.001428 619.80981 -L 530.054747 607.820458 -L 530.149536 582.374698 -L 530.108066 609.162207 -L 530.167309 595.181792 -L 530.179157 609.038122 -L 530.27987 603.683058 -L 530.291719 600.191758 -L 530.339113 621.72962 -L 530.350961 627.526777 -L 530.410204 605.023949 -L 530.433902 614.875677 -L 530.451674 615.94702 -L 530.48722 609.625435 -L 530.499069 626.415637 -L 530.587933 599.420971 -L 530.617554 585.291353 -L 530.664949 610.049799 -L 530.688646 603.446605 -L 530.73604 617.64705 -L 530.813056 614.549132 -L 530.98486 586.266878 -L 531.127043 642.799943 -L 531.138892 641.421114 -L 531.286999 611.919681 -L 531.304772 628.384582 -L 531.369939 611.517927 -L 531.375863 612.868052 -L 531.429182 596.18742 -L 531.482501 614.386751 -L 531.565441 619.349782 -L 531.512122 601.575336 -L 531.583214 611.028976 -L 531.600986 615.895232 -L 531.636532 602.792313 -L 531.654305 599.976121 -L 531.672078 611.399725 -L 531.749094 625.538459 -L 531.778715 609.912462 -L 531.849807 598.40659 -L 531.837958 618.037461 -L 531.879428 610.60762 -L 531.920898 624.40526 -L 531.986065 612.030568 -L 532.1164 581.451047 -L 532.009762 614.976076 -L 532.151945 593.153153 -L 532.181567 583.737708 -L 532.288204 617.950922 -L 532.311901 626.939281 -L 532.36522 608.940936 -L 532.382993 609.141513 -L 532.513327 623.773053 -L 532.454084 603.253209 -L 532.525176 623.591827 -L 532.57257 633.033647 -L 532.602191 622.727939 -L 532.619964 625.372988 -L 532.726601 589.737969 -L 532.643661 631.175236 -L 532.762147 601.519809 -L 532.803617 618.433627 -L 532.839163 600.335116 -L 532.868784 601.780226 -L 532.874709 600.241727 -L 532.90433 611.518143 -L 532.993194 642.189593 -L 533.022816 627.983684 -L 533.034664 633.202893 -L 533.046513 621.99612 -L 533.052437 621.980246 -L 533.076134 639.941324 -L 533.15315 618.063265 -L 533.19462 606.385421 -L 533.27756 610.707507 -L 533.425667 644.99335 -L 533.52638 608.939022 -L 533.437516 645.170728 -L 533.585623 614.248685 -L 533.662639 631.038402 -L 533.686336 609.736214 -L 533.698185 603.831365 -L 533.715958 618.455007 -L 533.739655 604.154497 -L 533.745579 615.805006 -L 533.787049 591.567402 -L 533.852216 607.264723 -L 533.958853 593.810779 -L 533.893686 611.186114 -L 533.964778 600.201408 -L 534.089188 625.543197 -L 534.000323 594.986051 -L 534.106961 615.633542 -L 534.255068 598.190581 -L 534.148431 622.452569 -L 534.278765 603.564631 -L 534.302462 615.638446 -L 534.379478 603.056286 -L 534.385402 610.160576 -L 534.474267 584.077631 -L 534.403175 611.897947 -L 534.515737 586.944614 -L 534.65792 633.449631 -L 534.551282 585.232832 -L 534.675692 627.303657 -L 534.687541 632.122432 -L 534.69939 623.958226 -L 534.717162 627.193352 -L 534.752708 616.053881 -L 534.788254 630.130666 -L 534.8238 620.224201 -L 534.853421 632.539692 -L 534.924513 617.290235 -L 534.936361 622.927935 -L 534.942285 618.796403 -L 535.013377 632.639289 -L 535.037074 629.591826 -L 535.060771 638.364403 -L 535.131863 625.87609 -L 535.143711 633.067332 -L 535.303667 588.06232 -L 535.32144 591.390958 -L 535.410304 622.415299 -L 535.457699 619.582203 -L 535.522866 636.617315 -L 535.582109 607.193243 -L 535.61173 604.846575 -L 535.6532 618.389614 -L 535.665049 613.367001 -L 535.765762 628.70465 -L 535.676897 611.163339 -L 535.783534 621.626362 -L 535.795383 608.545564 -L 535.878323 631.576615 -L 535.884247 627.599637 -L 535.907944 624.140868 -L 535.913869 630.780906 -L 535.979036 645.963981 -L 535.949415 629.429857 -L 536.020506 633.290517 -L 536.091597 596.789038 -L 536.156765 615.182127 -L 536.162689 620.346151 -L 536.210083 602.417747 -L 536.257478 609.77065 -L 536.263402 609.261687 -L 536.293023 614.588961 -L 536.310796 611.531532 -L 536.411509 630.440048 -L 536.35819 597.832419 -L 536.429282 615.468717 -L 536.435206 615.118637 -L 536.44113 619.010056 -L 536.447055 617.533062 -L 536.553692 624.229474 -L 536.476676 603.401919 -L 536.559616 622.627256 -L 536.571465 618.135433 -L 536.607011 636.020884 -L 536.642556 629.938094 -L 536.725496 650.008502 -L 536.654405 621.26984 -L 536.766966 636.826701 -L 536.962468 593.171629 -L 536.974317 603.022006 -L 537.003938 617.45715 -L 537.033559 633.617502 -L 537.110575 609.570859 -L 537.122424 603.183878 -L 537.175742 628.906253 -L 537.199439 617.412274 -L 537.252758 624.855764 -L 537.270531 606.908379 -L 537.306077 585.020073 -L 537.389017 594.569743 -L 537.430487 604.429283 -L 537.477881 588.167473 -L 537.507503 575.406637 -L 537.537124 592.417437 -L 537.548973 591.275915 -L 537.596367 598.478673 -L 537.625988 582.813589 -L 537.649685 584.203398 -L 537.65561 584.369158 -L 537.661534 580.918436 -L 537.732625 598.807775 -L 537.833338 622.251371 -L 537.774096 597.148111 -L 537.868884 622.139307 -L 537.981446 589.146896 -L 537.886657 622.672985 -L 538.011067 602.993541 -L 538.034764 614.121003 -L 538.052537 601.213012 -L 538.117704 606.633121 -L 538.206569 591.183951 -L 538.141401 609.286413 -L 538.224341 606.543348 -L 538.230266 608.323515 -L 538.27766 597.201924 -L 538.307282 598.460046 -L 538.313206 596.729114 -L 538.366524 612.833279 -L 538.390222 623.277783 -L 538.437616 641.791106 -L 538.496859 621.903325 -L 538.502783 625.629319 -L 538.544253 637.893773 -L 538.520556 624.686253 -L 538.627193 629.043434 -L 538.633117 629.096041 -L 538.751603 582.361807 -L 538.810846 598.741341 -L 538.881938 615.401905 -L 538.834543 596.294007 -L 538.94118 612.487284 -L 538.947105 607.293475 -L 539.035969 621.701497 -L 539.047818 612.348431 -L 539.190001 631.468265 -L 539.272941 594.994971 -L 539.207773 635.442558 -L 539.320335 604.552416 -L 539.367729 619.744478 -L 539.432896 627.717156 -L 539.456594 607.444629 -L 539.474366 617.034362 -L 539.515836 602.385331 -L 539.575079 619.604853 -L 539.735035 647.765266 -L 539.752808 639.259701 -L 539.788354 620.418895 -L 539.859445 644.49968 -L 539.94831 627.951924 -L 539.894991 648.89758 -L 539.972007 641.636154 -L 539.983855 647.959931 -L 540.049022 622.193834 -L 540.108265 610.61588 -L 540.078644 625.811933 -L 540.149735 621.331369 -L 540.19713 653.0126 -L 540.262297 634.607098 -L 540.274145 630.905941 -L 540.291918 635.962587 -L 540.416328 591.729944 -L 540.428177 592.805597 -L 540.434101 589.152505 -L 540.493344 611.980024 -L 540.511117 609.540869 -L 540.659224 630.940311 -L 540.534814 597.935137 -L 540.671073 627.636781 -L 540.77771 606.999314 -L 540.682921 629.564919 -L 540.831029 610.980883 -L 540.848801 630.846159 -L 540.925817 609.591947 -L 540.94359 621.70615 -L 540.979136 628.385395 -L 540.996909 614.191597 -L 541.002833 608.959432 -L 541.068 631.4423 -L 541.079849 627.555157 -L 541.091697 635.843774 -L 541.156864 601.334883 -L 541.180562 615.300004 -L 541.210183 579.623013 -L 541.269426 620.438297 -L 541.310896 590.369574 -L 541.364215 597.315705 -L 541.328669 585.584692 -L 541.393836 588.724763 -L 541.39976 588.107419 -L 541.411609 596.949913 -L 541.429382 594.799344 -L 541.488625 606.251165 -L 541.530095 588.358951 -L 541.583413 576.675687 -L 541.613035 596.505822 -L 541.630808 591.369772 -L 541.731521 626.246904 -L 541.767066 617.024846 -L 541.778915 609.998771 -L 541.832233 623.37844 -L 541.855931 620.953237 -L 541.879628 632.962178 -L 541.932946 611.506649 -L 541.968492 625.744815 -L 541.980341 626.804551 -L 541.992189 618.230827 -L 541.998114 623.118844 -L 542.021811 602.345851 -L 542.098826 627.315306 -L 542.104751 624.804209 -L 542.246934 609.51129 -L 542.270631 623.511397 -L 542.318025 604.984245 -L 542.353571 606.792889 -L 542.371344 601.212079 -L 542.389117 589.255161 -L 542.418738 601.743828 -L 542.477981 594.784561 -L 542.525375 592.158474 -L 542.596467 604.830871 -L 542.667558 585.004398 -L 542.608315 605.220968 -L 542.726801 600.283947 -L 542.82159 621.11777 -L 542.86306 608.505108 -L 542.868984 598.272643 -L 542.963773 626.37985 -L 543.064486 591.623114 -L 542.993394 632.636772 -L 543.11188 605.936939 -L 543.159274 623.557744 -L 543.218517 602.368481 -L 543.242214 611.612121 -L 543.301457 589.802206 -L 543.307381 589.696603 -L 543.313306 586.844747 -L 543.384397 603.24552 -L 543.396246 599.725283 -L 543.514731 625.864158 -L 543.419943 596.658049 -L 543.550277 616.176741 -L 543.56805 600.302434 -L 543.662839 611.832973 -L 543.763552 626.001652 -L 543.710233 608.059503 -L 543.781324 617.742007 -L 543.893886 574.814267 -L 543.935356 583.450035 -L 544.089388 633.314132 -L 544.101236 639.868105 -L 544.166403 615.741987 -L 544.184176 625.031786 -L 544.267116 611.762007 -L 544.237495 631.396074 -L 544.284889 628.390764 -L 544.350056 650.388715 -L 544.326359 627.316116 -L 544.397451 636.537668 -L 544.403375 636.639253 -L 544.427072 626.422804 -L 544.486315 643.575499 -L 544.492239 654.298637 -L 544.551482 627.115934 -L 544.587028 627.206488 -L 544.592952 629.863719 -L 544.646271 608.684184 -L 544.705514 603.423492 -L 544.693665 621.016596 -L 544.746984 613.530704 -L 544.823999 644.381772 -L 544.770681 609.047913 -L 544.859545 622.666815 -L 544.960258 586.87218 -L 544.989879 599.0142 -L 545.049122 606.211278 -L 545.007652 592.885669 -L 545.084668 598.173223 -L 545.096517 585.719844 -L 545.173532 604.673875 -L 545.179457 601.606081 -L 545.203154 620.487934 -L 545.286094 598.904019 -L 545.315715 617.923287 -L 545.386807 597.379307 -L 545.398655 600.408232 -L 545.457898 608.684184 -L 545.434201 592.032476 -L 545.475671 600.307041 -L 545.534914 576.856082 -L 545.594157 588.785361 -L 545.635627 573.061987 -L 545.677097 593.708358 -L 545.706718 587.049499 -L 545.748188 618.22209 -L 545.825204 595.213834 -L 545.890371 582.223818 -L 545.854826 602.790809 -L 545.914069 602.255615 -L 545.967387 617.455312 -L 546.008857 602.210984 -L 546.020706 592.319781 -L 546.097721 612.869098 -L 546.10957 610.776565 -L 546.145116 625.903066 -L 546.162889 603.413028 -L 546.216207 616.119548 -L 546.222132 612.382746 -L 546.269526 633.840882 -L 546.305072 627.736744 -L 546.44133 603.984608 -L 546.376163 628.949378 -L 546.470952 616.089342 -L 546.476876 625.506936 -L 546.56574 602.089196 -L 546.571665 605.604514 -L 546.672377 582.605275 -L 546.696075 593.111336 -L 546.73162 593.045042 -L 546.873803 628.072528 -L 547.004138 561.416736 -L 547.010062 567.640297 -L 547.033759 564.632293 -L 547.063381 579.144026 -L 547.075229 578.725071 -L 547.217412 612.677205 -L 547.098926 571.282021 -L 547.235185 608.035421 -L 547.288504 584.917975 -L 547.353671 598.478822 -L 547.359595 597.459452 -L 547.383292 610.890915 -L 547.395141 604.415231 -L 547.513627 633.017975 -L 547.519551 627.043232 -L 547.531399 624.817867 -L 547.638037 653.934829 -L 547.661734 649.111177 -L 547.720977 630.18768 -L 547.732825 630.725363 -L 547.809841 597.264632 -L 547.86316 613.413677 -L 547.880932 623.231571 -L 547.9461 590.755245 -L 547.952024 591.114221 -L 548.123828 623.635501 -L 547.963872 590.057814 -L 548.129753 613.954835 -L 548.159374 619.238208 -L 548.31933 589.004465 -L 548.325254 596.674981 -L 548.384497 579.96255 -L 548.431891 593.581039 -L 548.538529 608.738947 -L 548.544453 600.244172 -L 548.562226 593.981311 -L 548.621469 612.620064 -L 548.645166 603.320259 -L 548.787349 644.341277 -L 548.657014 595.148521 -L 548.840667 623.281198 -L 548.846592 622.205631 -L 548.852516 632.478787 -L 548.888062 654.842544 -L 548.953229 624.441825 -L 549.059866 588.222961 -L 548.98285 633.743591 -L 549.089487 591.400721 -L 549.095412 589.41594 -L 549.166503 598.319462 -L 549.237595 624.722142 -L 549.1902 596.42559 -L 549.284989 607.108787 -L 549.302762 596.8066 -L 549.362005 621.646929 -L 549.373853 623.581334 -L 549.444945 596.707751 -L 549.468642 623.587337 -L 549.48049 619.524561 -L 549.486415 620.601171 -L 549.52196 611.803128 -L 549.551582 612.772999 -L 549.575279 608.56756 -L 549.56343 615.838097 -L 549.593052 615.208677 -L 549.604901 630.642395 -L 549.664143 597.324185 -L 549.693765 607.127999 -L 549.800402 585.810814 -L 549.824099 589.008711 -L 549.960358 635.744876 -L 549.972206 634.306356 -L 550.025525 595.185043 -L 550.090692 619.742844 -L 550.132162 624.536467 -L 550.179557 608.47659 -L 550.226951 617.321684 -L 550.250648 604.744145 -L 550.280269 609.445669 -L 550.298042 599.868972 -L 550.375058 619.314825 -L 550.410604 632.500894 -L 550.469847 607.734237 -L 550.481695 605.739803 -L 550.52909 621.917286 -L 550.558711 615.77414 -L 550.57056 629.58237 -L 550.576484 629.558097 -L 550.629803 611.005574 -L 550.659424 630.827692 -L 550.689045 628.397956 -L 550.712743 644.279766 -L 550.807531 636.519145 -L 550.94379 612.05758 -L 550.961563 618.223295 -L 550.973411 624.007081 -L 551.050427 602.926858 -L 551.056351 603.275933 -L 551.062276 598.093521 -L 551.15114 578.770536 -L 551.097821 600.777645 -L 551.174837 592.038472 -L 551.23408 615.242373 -L 551.204459 590.076583 -L 551.293323 598.743368 -L 551.44143 550.641304 -L 551.471052 569.093385 -L 551.52437 590.905096 -L 551.589537 584.17477 -L 551.595462 583.146298 -L 551.613234 597.334073 -L 551.660629 605.391058 -L 551.636932 586.804488 -L 551.719872 596.92462 -L 551.737645 595.35656 -L 551.790963 619.613651 -L 551.796887 624.102227 -L 551.844282 597.655324 -L 551.8976 617.889011 -L 551.950919 612.134319 -L 551.915373 629.170205 -L 551.968692 618.043255 -L 551.992389 628.851476 -L 552.051632 600.949074 -L 552.06348 604.527846 -L 552.069405 602.569116 -L 552.087178 621.429145 -L 552.093102 620.732702 -L 552.099026 631.709386 -L 552.140496 606.758185 -L 552.199739 617.6481 -L 552.205663 617.590645 -L 552.436711 585.37519 -L 552.442635 588.702574 -L 552.501878 598.30074 -L 552.537424 584.975829 -L 552.543348 585.21106 -L 552.632212 554.620077 -L 552.673682 569.774373 -L 552.744774 554.874497 -L 552.809941 559.130076 -L 552.898805 613.098116 -L 552.958048 594.418144 -L 552.98767 598.671864 -L 553.064685 586.347496 -L 553.189095 617.575461 -L 553.254263 587.986786 -L 553.313505 591.912701 -L 553.31943 591.177176 -L 553.337203 600.514874 -L 553.349051 600.255691 -L 553.366824 607.449997 -L 553.396445 592.501524 -L 553.461613 601.869276 -L 553.586023 590.173511 -L 553.509007 624.532803 -L 553.591947 590.281887 -L 553.60972 590.181254 -L 553.704508 605.108834 -L 553.710433 604.432875 -L 553.716357 611.920702 -L 553.728206 609.957292 -L 553.757827 621.982315 -L 553.81707 585.963806 -L 553.822994 591.546401 -L 553.846691 579.608927 -L 553.876313 595.078536 -L 553.935556 590.934157 -L 553.947404 598.223147 -L 554.006647 569.799468 -L 554.012571 567.39514 -L 554.071814 585.302287 -L 554.160679 601.636196 -L 554.184376 590.779446 -L 554.208073 580.120341 -L 554.27324 599.340237 -L 554.31471 619.582795 -L 554.403575 617.929056 -L 554.409499 617.974489 -L 554.421347 625.910123 -L 554.498363 607.102088 -L 554.510212 622.985723 -L 554.516136 608.411559 -L 554.593152 648.692534 -L 554.616849 633.908097 -L 554.77088 604.357016 -L 554.818275 614.960321 -L 554.871593 621.347192 -L 554.913063 608.215147 -L 554.918988 610.441483 -L 554.990079 604.243612 -L 554.942685 613.478187 -L 555.007852 611.276256 -L 555.037473 627.986694 -L 555.126338 616.724884 -L 555.150035 609.225558 -L 555.215202 623.342914 -L 555.227051 614.980443 -L 555.369234 638.244657 -L 555.499568 620.325367 -L 555.452174 640.126328 -L 555.505492 624.504767 -L 555.511417 628.510648 -L 555.558811 602.87534 -L 555.588432 607.832978 -L 555.61213 613.148989 -L 555.623978 601.560448 -L 555.671372 611.593384 -L 555.677297 625.509096 -L 555.772085 594.975747 -L 555.77801 602.652422 -L 555.795782 596.820101 -L 555.855025 616.690794 -L 555.896495 596.827807 -L 555.937965 593.40026 -L 556.014981 612.778941 -L 556.133467 597.310407 -L 556.056451 616.190533 -L 556.139391 598.915551 -L 556.251953 583.950427 -L 556.198634 612.884142 -L 556.257877 590.306601 -L 556.35859 615.331481 -L 556.376363 607.045534 -L 556.483 590.771773 -L 556.500773 598.175752 -L 556.577789 626.327992 -L 556.619259 611.605137 -L 556.678502 585.137484 -L 556.737744 598.306782 -L 556.802912 615.052996 -L 556.838457 594.912624 -L 556.933246 580.477446 -L 556.85623 599.368906 -L 556.945095 590.268602 -L 557.010262 606.681797 -L 557.057656 597.464436 -L 557.081353 587.17113 -L 557.152445 602.531763 -L 557.170217 591.102657 -L 557.211688 600.31689 -L 557.235385 585.664529 -L 557.253158 588.407615 -L 557.259082 581.277167 -L 557.347946 602.865839 -L 557.377568 634.494611 -L 557.507902 629.396537 -L 557.661933 600.02084 -L 557.738949 622.126753 -L 557.768571 604.385247 -L 557.798192 589.955261 -L 557.881132 601.818371 -L 557.892981 598.485091 -L 557.928526 612.951515 -L 558.011467 640.230949 -L 557.940375 609.322438 -L 558.052937 620.254746 -L 558.064785 624.256478 -L 558.100331 600.36711 -L 558.147725 616.838392 -L 558.27806 584.724605 -L 558.343227 578.473306 -L 558.295832 591.138731 -L 558.355075 585.900996 -L 558.378772 583.63547 -L 558.497258 622.682126 -L 558.515031 629.000571 -L 558.550577 611.280894 -L 558.580198 615.172132 -L 558.65129 591.487712 -L 558.603895 615.777522 -L 558.698684 604.688514 -L 558.811246 631.967882 -L 558.81717 628.610937 -L 559.012671 567.584448 -L 559.030444 588.115173 -L 559.160779 636.582805 -L 559.172627 619.065305 -L 559.249643 603.770967 -L 559.1904 620.162441 -L 559.291113 609.288944 -L 559.332583 641.644571 -L 559.409599 615.435776 -L 559.421447 617.084418 -L 559.427372 616.163634 -L 559.43922 623.459274 -L 559.492539 597.521753 -L 559.516236 604.713716 -L 559.593252 614.73097 -L 559.628797 598.297848 -L 559.634722 597.8449 -L 559.64657 606.679624 -L 559.705813 587.05795 -L 559.741359 601.090738 -L 559.871693 566.499803 -L 559.883542 564.115091 -L 559.889466 571.33805 -L 559.966482 605.613952 -L 560.061271 586.04118 -L 560.067195 582.306052 -L 560.120513 606.907239 -L 560.144211 594.424983 -L 560.238999 607.767493 -L 560.256772 595.996004 -L 560.292318 583.24788 -L 560.339712 601.676861 -L 560.357485 600.502623 -L 560.493744 619.379171 -L 560.404879 597.369008 -L 560.499668 615.392987 -L 560.517441 604.261771 -L 560.582608 623.565089 -L 560.606305 616.005051 -L 560.683321 603.734659 -L 560.718867 625.181367 -L 560.772185 639.796499 -L 560.855125 589.776999 -L 560.866974 591.065673 -L 560.878822 587.916794 -L 560.914368 575.108422 -L 560.955838 599.822562 -L 560.973611 594.349142 -L 560.991384 602.603614 -L 561.086172 626.4641 -L 561.10987 616.464341 -L 561.19281 604.95598 -L 561.180961 620.708058 -L 561.216507 613.571788 -L 561.281674 633.664241 -L 561.334993 625.222533 -L 561.394236 616.959418 -L 561.423857 639.865497 -L 561.429781 646.842859 -L 561.506797 611.358076 -L 561.512721 611.469685 -L 561.571964 607.301545 -L 561.595661 622.88254 -L 561.613434 634.721791 -L 561.637131 622.085763 -L 561.714147 633.760567 -L 561.77339 621.064893 -L 561.743769 634.111932 -L 561.826709 626.153248 -L 561.951119 652.588073 -L 561.962967 644.249504 -L 562.087377 603.531817 -L 562.10515 608.135265 -L 562.111074 610.99509 -L 562.170317 588.329817 -L 562.18809 590.486922 -L 562.194015 589.836773 -L 562.199939 583.805472 -L 562.223636 604.248183 -L 562.294727 587.814828 -L 562.35397 605.310225 -L 562.407289 595.306311 -L 562.413213 599.501559 -L 562.496153 584.436289 -L 562.513926 596.670549 -L 562.549472 583.277457 -L 562.579093 609.182432 -L 562.626488 592.841668 -L 562.715352 612.974785 -L 562.739049 605.705236 -L 562.827913 626.791104 -L 562.780519 603.929864 -L 562.857535 610.593341 -L 562.904929 618.553338 -L 562.976021 603.475262 -L 562.981945 605.143375 -L 563.023415 588.840323 -L 563.082658 576.43616 -L 563.058961 593.547288 -L 563.124128 589.643117 -L 563.242614 606.286909 -L 563.201144 585.082984 -L 563.248538 604.050633 -L 563.266311 587.660616 -L 563.337402 574.966072 -L 563.284084 589.436947 -L 563.378872 581.338144 -L 563.455888 598.642636 -L 563.426267 578.223597 -L 563.515131 595.978611 -L 563.521055 590.181151 -L 563.562525 609.436481 -L 563.615844 601.605133 -L 563.728405 583.22395 -L 563.746178 594.544446 -L 563.85874 611.429435 -L 563.787648 588.753408 -L 563.864664 605.074197 -L 563.870588 598.656946 -L 563.947604 625.729164 -L 563.953528 624.548009 -L 563.959453 625.842275 -L 563.98315 613.764756 -L 564.018696 617.332493 -L 564.083863 599.538587 -L 564.143106 600.391316 -L 564.14903 600.639242 -L 564.154954 595.784356 -L 564.243818 611.009089 -L 564.297137 627.357715 -L 564.344531 606.566158 -L 564.350456 608.134304 -L 564.35638 610.669891 -L 564.421547 593.09642 -L 564.534109 579.877724 -L 564.43932 604.338434 -L 564.569654 588.365144 -L 564.593352 583.8054 -L 564.830323 635.11344 -L 564.859945 631.955023 -L 564.913263 644.383675 -L 564.919187 643.698561 -L 564.925112 647.416153 -L 564.97843 612.369223 -L 564.984355 603.865439 -L 565.073219 631.833143 -L 565.090992 633.290117 -L 565.096916 627.809484 -L 565.126538 627.97774 -L 565.250948 588.607587 -L 565.280569 583.326782 -L 565.357585 610.100517 -L 565.422752 603.374235 -L 565.476071 627.967926 -L 565.624178 599.116004 -L 565.647875 609.319051 -L 565.689345 628.342681 -L 565.665648 608.128751 -L 565.772285 625.736812 -L 565.932241 596.179727 -L 565.938165 603.092466 -L 565.967787 618.413272 -L 566.015181 601.308146 -L 566.044802 603.251025 -L 566.050727 600.257533 -L 566.104045 620.37846 -L 566.127742 610.642709 -L 566.133667 615.514438 -L 566.198834 588.460212 -L 566.216607 593.10753 -L 566.305471 585.816364 -L 566.27585 603.157321 -L 566.311395 600.262456 -L 566.31732 603.505305 -L 566.346941 588.469388 -L 566.394335 589.84375 -L 566.423957 573.929161 -L 566.477275 596.311144 -L 566.4832 595.530476 -L 566.506897 598.376878 -L 566.530594 585.336329 -L 566.560215 588.136337 -L 566.583913 576.265562 -L 566.64908 596.718463 -L 566.666853 589.161658 -L 566.678701 585.224965 -L 566.726096 574.126602 -L 566.755717 601.450714 -L 566.779414 589.365174 -L 566.81496 604.160192 -L 566.874203 583.273147 -L 566.880127 579.323455 -L 566.921597 609.768112 -L 566.945294 608.055036 -L 566.951219 608.11527 -L 566.963067 600.40482 -L 567.046007 622.293716 -L 567.06378 618.803714 -L 567.099326 633.400832 -L 567.111174 632.324133 -L 567.164493 645.667722 -L 567.200039 625.61455 -L 567.217812 628.678025 -L 567.306676 605.945314 -L 567.336297 612.031198 -L 567.383692 625.023025 -L 567.407389 604.04251 -L 567.413313 604.51794 -L 567.43701 596.393715 -L 567.466632 606.911822 -L 567.525875 601.479124 -L 567.531799 606.315499 -L 567.555496 586.748112 -L 567.638436 603.799532 -L 567.64436 603.757808 -L 567.733225 583.004617 -L 567.76877 588.382356 -L 567.81024 611.089394 -L 567.89318 596.524395 -L 567.899105 596.774889 -L 567.910953 594.334609 -L 567.916878 586.643724 -L 567.982045 609.977521 -L 568.011666 604.923039 -L 568.017591 604.961299 -L 568.124228 615.148592 -L 568.064985 603.534588 -L 568.136076 614.248243 -L 568.147925 607.851593 -L 568.165698 621.725098 -L 568.242714 615.740903 -L 568.260486 625.316344 -L 568.337502 610.926163 -L 568.355275 620.575275 -L 568.373048 613.506436 -L 568.479685 589.37111 -L 568.396745 615.648757 -L 568.491534 604.201157 -L 568.521155 591.775046 -L 568.580398 618.897334 -L 568.657414 628.651717 -L 568.604095 616.745802 -L 568.704808 628.523282 -L 568.829218 665.186222 -L 568.752202 616.822587 -L 568.870688 649.54697 -L 568.965477 618.733516 -L 569.018795 628.821744 -L 569.042493 630.626409 -L 569.048417 623.03557 -L 569.1906 597.666195 -L 569.214297 611.499359 -L 569.326858 638.561444 -L 569.249843 604.557238 -L 569.344631 636.270807 -L 569.403874 613.217988 -L 569.469041 624.5428 -L 569.474966 631.094125 -L 569.546057 610.805664 -L 569.56383 614.790925 -L 569.569754 611.484867 -L 569.634921 632.415162 -L 569.711937 654.103165 -L 569.759331 640.43511 -L 569.824499 655.19005 -L 569.925212 600.341007 -L 569.948909 610.388117 -L 570.014076 594.071178 -L 570.073319 595.709305 -L 570.126637 578.230186 -L 570.22735 598.313035 -L 570.245123 594.119602 -L 570.251047 585.552582 -L 570.322139 609.439497 -L 570.357685 589.193724 -L 570.505792 557.107156 -L 570.547262 569.377798 -L 570.636126 614.514965 -L 570.695369 610.317902 -L 570.802006 581.033733 -L 570.813855 591.785704 -L 570.855325 581.737794 -L 570.938265 605.339395 -L 570.961962 597.529062 -L 571.021205 612.4527 -L 571.044902 601.807275 -L 571.163388 623.430464 -L 571.169312 618.342312 -L 571.246328 628.764524 -L 571.198934 614.256107 -L 571.281874 621.849542 -L 571.341117 614.413438 -L 571.370738 629.190913 -L 571.382587 628.156654 -L 571.394435 629.485149 -L 571.429981 616.168404 -L 571.465527 595.626306 -L 571.512921 619.267322 -L 571.554391 603.715514 -L 571.560315 603.800281 -L 571.56624 602.303822 -L 571.684725 629.778082 -L 571.702498 621.64486 -L 571.738044 604.044874 -L 571.761741 624.7793 -L 571.803211 619.66594 -L 571.898 626.907847 -L 571.880227 611.007289 -L 571.903924 615.750119 -L 571.998713 591.718738 -L 571.921697 618.094982 -L 572.034258 605.661917 -L 572.040183 605.624096 -L 572.164593 643.66185 -L 572.18829 637.348868 -L 572.277154 611.105447 -L 572.306776 622.824282 -L 572.419337 638.325651 -L 572.324549 621.210655 -L 572.43711 634.720434 -L 572.502277 628.428689 -L 572.484504 637.703567 -L 572.549672 633.027705 -L 572.555596 634.245351 -L 572.573369 616.04672 -L 572.591142 621.118129 -L 572.668157 600.28696 -L 572.715552 603.748105 -L 572.804416 616.591985 -L 572.733325 601.24314 -L 572.816265 608.956767 -L 572.857735 589.053193 -L 572.928826 602.756654 -L 572.958448 619.616779 -L 572.988069 599.4366 -L 573.023615 601.414415 -L 573.082858 595.967409 -L 573.035463 607.468119 -L 573.118403 604.163712 -L 573.225041 629.507918 -L 573.248738 619.199264 -L 573.254662 616.783331 -L 573.296132 636.431669 -L 573.325753 629.749607 -L 573.414618 647.449186 -L 573.367223 615.360255 -L 573.438315 630.950836 -L 573.485709 652.601174 -L 573.550876 633.246003 -L 573.616044 641.041729 -L 573.758227 609.242667 -L 573.841167 638.756397 -L 573.876712 627.186638 -L 574.012971 598.30771 -L 573.941879 630.983424 -L 574.042592 603.382195 -L 574.072214 615.770358 -L 574.113684 594.759721 -L 574.155154 605.238057 -L 574.208472 575.642894 -L 574.184775 605.661599 -L 574.279564 598.700827 -L 574.380277 616.132237 -L 574.31511 589.395646 -L 574.39805 604.208593 -L 574.409898 597.383763 -L 574.457293 620.216447 -L 574.486914 607.670147 -L 574.492838 612.783656 -L 574.546157 585.554423 -L 574.581703 598.279338 -L 574.723886 562.688856 -L 574.593551 602.766441 -L 574.753507 578.796169 -L 574.800901 596.028169 -L 574.85422 576.498114 -L 574.860144 576.909728 -L 574.913463 601.899046 -L 574.97863 585.561698 -L 575.073419 574.686965 -L 575.043797 594.403541 -L 575.085267 586.312706 -L 575.091192 586.509503 -L 575.120813 568.844057 -L 575.180056 592.996489 -L 575.18598 599.217101 -L 575.215602 582.629393 -L 575.280769 586.994904 -L 575.428876 617.940974 -L 575.298542 578.537425 -L 575.488119 608.501968 -L 575.494043 602.665965 -L 575.576983 628.260735 -L 575.588832 633.256348 -L 575.60068 628.43085 -L 575.68362 604.867579 -L 575.713242 623.506633 -L 575.719166 626.444418 -L 575.760636 617.375366 -L 575.813955 619.041599 -L 575.855425 611.099505 -L 575.867273 624.202173 -L 575.896895 631.132426 -L 575.932441 605.114269 -L 575.979835 628.238926 -L 576.021305 596.002897 -L 576.110169 603.721277 -L 576.228655 624.378953 -L 576.145715 603.582429 -L 576.240504 611.938487 -L 576.341217 632.594306 -L 576.376762 618.801719 -L 576.424157 596.269952 -L 576.501172 610.268662 -L 576.536718 604.406054 -L 576.613734 621.929254 -L 576.726295 589.444724 -L 576.625582 622.642469 -L 576.744068 595.518847 -L 576.761841 604.892396 -L 576.809235 575.521687 -L 576.81516 568.267488 -L 576.880327 603.881838 -L 576.904024 588.998346 -L 576.963267 622.36136 -L 577.016585 600.065609 -L 577.058055 604.539845 -L 577.135071 586.925354 -L 577.152844 578.526155 -L 577.170617 593.647392 -L 577.235784 590.812927 -L 577.431286 650.632131 -L 577.567544 610.511549 -L 577.579393 614.001783 -L 577.638636 598.361511 -L 577.668257 613.039346 -L 577.697879 598.727408 -L 577.763046 626.138866 -L 577.85191 629.883276 -L 577.834137 616.6345 -L 577.875607 626.889054 -L 577.899305 639.296194 -L 577.952623 622.926485 -L 578.088882 583.368032 -L 578.136276 607.308783 -L 578.207368 602.14203 -L 578.254762 608.122038 -L 578.231065 595.021892 -L 578.272535 600.941815 -L 578.278459 596.118629 -L 578.319929 607.135689 -L 578.373248 599.369672 -L 578.462112 611.188944 -L 578.420642 592.772286 -L 578.485809 602.128519 -L 578.539128 612.975328 -L 578.556901 597.670468 -L 578.604295 610.634416 -L 578.616143 608.683073 -L 578.663538 619.783823 -L 578.669462 617.734884 -L 578.740554 632.178337 -L 578.758326 610.743965 -L 578.787948 593.05413 -L 578.894585 595.022118 -L 579.024919 619.82619 -L 579.030844 619.411602 -L 579.048617 620.80379 -L 579.066389 612.448379 -L 579.137481 594.002062 -L 579.184875 604.80214 -L 579.291512 633.839225 -L 579.31521 625.847266 -L 579.338907 604.450347 -L 579.380377 630.412134 -L 579.445544 608.016062 -L 579.504787 622.319376 -L 579.463317 601.92738 -L 579.56403 612.768988 -L 579.569954 613.025583 -L 579.575878 608.603104 -L 579.581803 605.116841 -L 579.664743 616.244249 -L 579.676591 613.401286 -L 579.741758 594.367769 -L 579.712137 614.503039 -L 579.789153 612.131066 -L 580.043897 654.974737 -L 579.801001 602.029277 -L 580.091291 638.58033 -L 580.263096 599.064031 -L 580.274944 599.279159 -L 580.280869 597.817368 -L 580.298642 615.230929 -L 580.346036 628.485584 -L 580.375657 613.271089 -L 580.411203 622.948171 -L 580.440824 616.766383 -L 580.505992 638.884692 -L 580.511916 633.440251 -L 580.55931 611.675934 -L 580.565235 614.187577 -L 580.630402 593.298032 -L 580.660023 618.309042 -L 580.671872 617.78605 -L 580.802206 641.821483 -L 580.825903 630.044874 -L 580.962162 603.856289 -L 580.968086 599.885512 -L 581.021405 622.678152 -L 581.056951 614.790618 -L 581.151739 618.318943 -L 581.157663 609.791749 -L 581.228755 622.369393 -L 581.181361 601.108439 -L 581.252452 607.648855 -L 581.365014 588.789352 -L 581.287998 617.211019 -L 581.376862 596.028837 -L 581.394635 608.36893 -L 581.406484 604.985782 -L 581.418332 619.076658 -L 581.471651 602.609786 -L 581.513121 606.95436 -L 581.548666 595.649514 -L 581.590137 610.413252 -L 581.631607 600.584503 -L 581.643455 609.920205 -L 581.702698 593.329575 -L 581.738244 602.117354 -L 581.815259 580.897272 -L 581.756017 602.527153 -L 581.874502 591.868395 -L 581.93967 584.618888 -L 581.987064 597.704381 -L 582.034458 588.769436 -L 582.070004 613.498053 -L 582.129247 633.216779 -L 582.212187 630.014642 -L 582.22996 622.448489 -L 582.247733 633.538742 -L 582.265505 632.352494 -L 582.283278 641.281933 -L 582.366218 626.877152 -L 582.407688 593.059157 -L 582.484704 595.259092 -L 582.508401 615.584084 -L 582.532098 591.218414 -L 582.591341 604.660042 -L 582.638736 590.302353 -L 582.703903 590.976513 -L 582.822389 619.562195 -L 582.757221 575.382511 -L 582.85201 613.811192 -L 582.857934 613.674076 -L 582.863859 605.177678 -L 582.958647 627.421398 -L 582.964572 637.269514 -L 583.029739 597.833288 -L 583.047512 602.483089 -L 583.05936 593.342764 -L 583.106754 611.525673 -L 583.165997 595.406535 -L 583.207467 605.838177 -L 583.243013 593.973155 -L 583.272635 598.517614 -L 583.278559 593.457441 -L 583.373347 601.874234 -L 583.379272 600.314207 -L 583.462212 616.394095 -L 583.397045 593.141146 -L 583.485909 607.569984 -L 583.509606 581.245232 -L 583.59847 595.425136 -L 583.651789 624.638888 -L 583.728805 616.081998 -L 583.734729 617.404056 -L 583.776199 603.665875 -L 583.788048 605.898973 -L 583.793972 603.984521 -L 583.853215 617.746886 -L 583.870988 611.519171 -L 583.876912 616.037824 -L 583.930231 605.07123 -L 583.971701 612.440365 -L 584.030944 600.858539 -L 584.078338 614.179014 -L 584.143505 595.466223 -L 584.184975 609.225128 -L 584.190899 618.871343 -L 584.250142 592.481878 -L 584.285688 595.604915 -L 584.327158 578.123738 -L 584.380477 608.211619 -L 584.516735 629.65946 -L 584.52266 630.2267 -L 584.528584 626.336483 -L 584.64707 597.615732 -L 584.611524 632.153981 -L 584.658918 601.628553 -L 584.789253 633.913774 -L 584.795177 632.536028 -L 584.872193 605.595752 -L 584.931435 623.570187 -L 584.93736 624.309558 -L 584.966981 615.351597 -L 585.032148 608.532739 -L 585.0203 624.987202 -L 585.073618 617.553606 -L 585.10324 628.232511 -L 585.126937 613.578179 -L 585.150634 614.07943 -L 585.156558 609.752053 -L 585.215801 621.973078 -L 585.263196 612.819318 -L 585.26912 610.996605 -L 585.31059 627.154643 -L 585.328363 643.893622 -L 585.411303 613.538736 -L 585.423151 604.029007 -L 585.500167 622.013274 -L 585.51794 633.779989 -L 585.594956 603.881983 -L 585.606804 598.52865 -L 585.612729 600.692057 -L 585.654199 592.679288 -L 585.695669 606.494099 -L 585.713442 604.17688 -L 585.778609 619.832224 -L 585.826003 615.273978 -L 585.920792 589.035156 -L 585.944489 594.447434 -L 586.003732 600.231599 -L 585.968186 585.737502 -L 586.027429 592.547094 -L 586.128142 574.50036 -L 586.157763 575.834432 -L 586.169612 569.590491 -L 586.175536 570.387391 -L 586.187385 564.450773 -L 586.252552 586.811207 -L 586.270325 582.792158 -L 586.489523 648.448111 -L 586.501372 637.255151 -L 586.625782 597.717055 -L 586.631706 594.826435 -L 586.690949 614.097113 -L 586.762041 645.728592 -L 586.815359 632.176064 -L 586.951618 598.172393 -L 586.844981 640.972836 -L 586.975315 602.94204 -L 587.004937 617.21289 -L 587.064179 591.863652 -L 587.070104 592.411338 -L 587.135271 575.698079 -L 587.170817 585.25535 -L 587.241908 615.720872 -L 587.289302 608.516545 -L 587.295227 608.600238 -L 587.330772 593.256986 -L 587.407788 602.760305 -L 587.413713 607.473634 -L 587.490728 587.271688 -L 587.579593 574.236948 -L 587.597365 585.489777 -L 587.656608 613.628413 -L 587.709927 592.998207 -L 587.715851 591.840277 -L 587.7277 607.238089 -L 587.739548 607.108471 -L 587.775094 633.661171 -L 587.858034 615.249965 -L 587.89358 628.190722 -L 587.917277 605.4203 -L 587.923201 606.352967 -L 587.97652 619.329038 -L 587.940974 602.134638 -L 588.012066 605.864512 -L 588.077233 589.237183 -L 588.05946 607.39941 -L 588.124627 601.834651 -L 588.148324 609.755488 -L 588.201643 594.455077 -L 588.207567 592.774418 -L 588.237189 612.88214 -L 588.30828 634.176099 -L 588.361599 620.74991 -L 588.497857 591.695881 -L 588.51563 594.336521 -L 588.5571 573.251459 -L 588.563025 567.708053 -L 588.64004 596.937505 -L 588.651889 585.416288 -L 588.675586 574.647384 -L 588.740753 588.525564 -L 588.853315 628.846238 -L 588.894785 623.59874 -L 588.948103 624.860418 -L 589.031043 603.349084 -L 589.042892 609.464885 -L 589.102135 589.387187 -L 589.119908 594.994319 -L 589.226545 587.179362 -L 589.167302 604.576997 -L 589.238394 592.728973 -L 589.350955 627.797756 -L 589.368728 610.422995 -L 589.374652 609.458371 -L 589.386501 620.173425 -L 589.398349 630.519346 -L 589.487214 614.617265 -L 589.493138 615.744581 -L 589.599775 621.262329 -L 589.546457 593.716262 -L 589.605699 616.517334 -L 589.706412 595.161149 -L 589.653094 621.423282 -L 589.736034 601.112743 -L 589.81305 608.148335 -L 589.759731 592.354834 -L 589.842671 600.125962 -L 589.872292 612.149596 -L 589.890065 592.615675 -L 589.97893 607.547138 -L 589.984854 604.56373 -L 590.050021 611.359655 -L 590.079643 607.659995 -L 590.091491 612.528892 -L 590.132961 594.991016 -L 590.174431 601.70636 -L 590.18628 603.967521 -L 590.239598 576.980708 -L 590.304766 588.303416 -L 590.405478 602.907781 -L 590.340311 586.902659 -L 590.417327 598.296906 -L 590.423251 594.083423 -L 590.482494 623.970783 -L 590.512116 609.783082 -L 590.55951 618.467845 -L 590.535813 604.955265 -L 590.612829 610.668588 -L 590.636526 597.902354 -L 590.660223 615.078801 -L 590.719466 613.166787 -L 590.796482 636.179709 -L 590.843876 621.653252 -L 590.861649 612.569687 -L 590.903119 627.823166 -L 590.909043 626.876546 -L 590.914967 634.433961 -L 590.962362 606.491044 -L 591.009756 615.624103 -L 591.074923 592.120662 -L 591.128242 601.811751 -L 591.151939 599.156645 -L 591.199333 610.112847 -L 591.211182 621.719606 -L 591.246727 597.320486 -L 591.276349 597.408815 -L 591.282273 592.157452 -L 591.34744 615.517711 -L 591.371138 610.810431 -L 591.382986 621.536946 -L 591.47185 604.424333 -L 591.477775 611.343201 -L 591.655503 585.356543 -L 591.554791 615.036616 -L 591.661428 588.720798 -L 591.696973 585.081869 -L 591.797686 615.267612 -L 591.839156 593.942427 -L 591.886551 617.03601 -L 591.910248 612.291763 -L 591.999112 600.091473 -L 591.922096 615.828493 -L 592.034658 602.999666 -L 592.076128 602.438895 -L 592.164992 623.526803 -L 592.271629 640.069363 -L 592.176841 619.183682 -L 592.295327 628.791374 -L 592.301251 624.054691 -L 592.372342 641.227454 -L 592.390115 633.868449 -L 592.43751 648.314505 -L 592.502677 640.903067 -L 592.633011 593.864616 -L 592.7278 614.947987 -L 592.698178 591.15339 -L 592.757421 608.941345 -L 592.763345 608.810826 -L 592.76927 616.009174 -L 592.85221 591.18034 -L 592.858134 593.636762 -L 592.905528 578.850617 -L 592.946998 593.83969 -L 592.952923 592.455579 -L 593.05956 617.982715 -L 593.071408 611.95066 -L 593.130651 595.290894 -L 593.172121 618.509598 -L 593.18397 608.506272 -L 593.22544 618.460569 -L 593.278759 600.892986 -L 593.385396 590.903873 -L 593.338001 605.711216 -L 593.39132 595.574451 -L 593.503882 612.230935 -L 593.509806 611.960003 -L 593.622367 600.357744 -L 593.539427 618.358606 -L 593.628292 605.010548 -L 593.717156 628.430906 -L 593.746777 621.86674 -L 593.782323 617.078149 -L 593.835642 634.621291 -L 593.84749 627.564306 -L 593.859339 630.793514 -L 593.883036 614.46021 -L 593.912658 619.127408 -L 594.025219 563.845397 -L 594.066689 582.294172 -L 594.149629 601.485999 -L 594.185175 585.257464 -L 594.226645 580.909821 -L 594.256266 591.093478 -L 594.279963 587.869106 -L 594.416222 626.023635 -L 594.445844 607.032897 -L 594.487314 586.806065 -L 594.576178 596.130735 -L 594.635421 589.921489 -L 594.599875 603.884626 -L 594.647269 602.034924 -L 594.700588 633.075102 -L 594.771679 624.500494 -L 594.878317 608.328716 -L 594.890165 613.969406 -L 594.961257 621.598107 -L 594.990878 603.899046 -L 595.06197 633.15207 -L 595.002727 602.328623 -L 595.138985 619.948062 -L 595.180455 597.847037 -L 595.156758 625.432094 -L 595.263395 611.133803 -L 595.381881 573.8492 -L 595.31079 611.483857 -L 595.423351 581.728961 -L 595.529988 593.654931 -L 595.47667 564.930671 -L 595.535913 589.59164 -L 595.553686 586.869634 -L 595.595156 602.39396 -L 595.678096 625.995692 -L 595.719566 615.75319 -L 595.743263 626.840692 -L 595.820279 609.112777 -L 595.8499 604.227279 -L 595.861749 619.945707 -L 595.93284 639.156214 -L 595.980234 627.321626 -L 596.045402 617.758603 -L 596.069099 630.94116 -L 596.086872 627.427159 -L 596.09872 630.350761 -L 596.146114 613.866411 -L 596.187584 617.888792 -L 596.211282 606.08416 -L 596.229054 595.403952 -L 596.288297 609.856754 -L 596.359389 616.144879 -L 596.383086 598.903481 -L 596.38901 604.319302 -L 596.400859 597.10376 -L 596.466026 622.343349 -L 596.560815 612.248325 -L 596.590436 636.962471 -L 596.72077 610.197282 -L 596.608209 643.105905 -L 596.750392 615.798027 -L 596.862953 636.219494 -L 596.821483 614.427395 -L 596.868878 632.917099 -L 596.874802 637.834221 -L 596.934045 602.385429 -L 596.945893 609.103489 -L 596.963666 597.368835 -L 597.046606 617.566278 -L 597.159168 638.895219 -L 597.064379 616.140352 -L 597.188789 638.494594 -L 597.206562 634.383018 -L 597.242108 652.419746 -L 597.248032 649.425603 -L 597.253956 654.077346 -L 597.289502 631.363462 -L 597.336897 635.553597 -L 597.348745 637.340382 -L 597.354669 633.923157 -L 597.407988 655.002854 -L 597.390215 633.534361 -L 597.461307 634.979215 -L 597.473155 628.749183 -L 597.508701 646.521713 -L 597.538322 654.182369 -L 597.585717 621.983638 -L 597.721975 585.456975 -L 597.7279 589.210683 -L 597.953023 650.370455 -L 597.958947 647.931447 -L 598.095205 606.938596 -L 598.10113 607.960063 -L 598.201843 627.227535 -L 598.118903 598.237144 -L 598.213691 618.991767 -L 598.344026 598.940904 -L 598.355874 597.249462 -L 598.361799 603.148749 -L 598.397344 614.845725 -L 598.450663 601.0292 -L 598.456587 601.629284 -L 598.498057 587.468802 -L 598.545451 602.363735 -L 598.575073 595.768701 -L 598.59877 582.979834 -L 598.628392 596.738069 -L 598.699483 619.098735 -L 598.740953 599.818977 -L 598.794272 622.695185 -L 598.853514 601.047582 -L 598.877212 594.365933 -L 598.918682 605.850858 -L 598.960152 597.524905 -L 598.972 607.278481 -L 599.01347 590.951355 -L 599.072713 601.260092 -L 599.197123 632.179249 -L 599.084562 600.807456 -L 599.226745 616.618236 -L 599.268215 604.928145 -L 599.309685 621.44174 -L 599.339306 614.104363 -L 599.357079 608.693038 -L 599.440019 587.822536 -L 599.392625 609.007858 -L 599.475565 598.283497 -L 599.558505 609.849527 -L 599.588126 605.349811 -L 599.594051 605.391496 -L 599.748082 641.118271 -L 599.623672 591.624751 -L 599.759931 631.781378 -L 599.807325 638.843321 -L 599.878416 611.848117 -L 600.008751 567.642383 -L 600.067994 580.763321 -L 600.115388 602.955369 -L 600.198328 596.651084 -L 600.222025 594.337653 -L 600.263495 607.612179 -L 600.287192 597.837363 -L 600.441224 630.543983 -L 600.47677 640.846451 -L 600.553785 622.621317 -L 600.589331 644.310946 -L 600.618953 621.374401 -L 600.666347 626.533497 -L 600.772984 613.015915 -L 600.790757 617.214142 -L 600.796681 616.844004 -L 600.867773 623.484625 -L 600.921091 592.655669 -L 601.110669 620.206004 -L 600.944788 582.509609 -L 601.128441 618.489425 -L 601.294322 599.897547 -L 601.163987 626.654471 -L 601.318019 604.156137 -L 601.406883 617.543289 -L 601.38911 603.221371 -L 601.454277 616.970112 -L 601.519445 598.081263 -L 601.566839 603.48966 -L 601.63793 627.825475 -L 601.673476 601.013005 -L 601.6794 599.61576 -L 601.738643 611.74149 -L 601.809735 635.652325 -L 601.750492 607.455726 -L 601.839356 615.565061 -L 601.957842 588.462277 -L 601.963766 590.649766 -L 602.046706 606.339423 -L 602.082252 597.168172 -L 602.123722 573.917918 -L 602.194813 590.296128 -L 602.218511 602.855727 -L 602.348845 646.153103 -L 602.360694 646.042544 -L 602.378466 653.947489 -L 602.449558 627.099565 -L 602.455482 640.032157 -L 602.520649 621.505822 -L 602.573968 628.476194 -L 602.615438 637.104979 -L 602.603589 624.539109 -L 602.680605 626.543863 -L 602.864258 583.117656 -L 602.716151 637.193666 -L 602.899804 587.400717 -L 603.036062 626.430718 -L 603.213791 579.416607 -L 603.231564 590.818549 -L 603.255261 602.36813 -L 603.30858 615.81838 -L 603.278958 597.302813 -L 603.367823 607.080015 -L 603.587021 573.032599 -L 603.616643 585.794016 -L 603.675886 611.330057 -L 603.693659 585.322796 -L 603.72328 591.041435 -L 603.76475 603.495137 -L 603.841766 583.258876 -L 603.865463 593.92069 -L 603.924706 581.488867 -L 603.948403 584.187674 -L 603.954327 584.889473 -L 603.9721 576.431364 -L 603.978024 573.871439 -L 604.05504 588.48096 -L 604.060964 586.903786 -L 604.084662 600.003266 -L 604.090586 608.729089 -L 604.149829 591.472177 -L 604.197223 607.581133 -L 604.297936 621.507115 -L 604.256466 598.977668 -L 604.309785 616.991221 -L 604.321633 607.602784 -L 604.392725 624.650407 -L 604.416422 617.912185 -L 604.46974 634.554534 -L 604.42827 615.992085 -L 604.517135 619.996944 -L 604.55268 604.428669 -L 604.623772 621.557909 -L 604.629696 616.328908 -L 604.665242 620.862913 -L 604.641545 616.003318 -L 604.671166 620.214288 -L 604.795576 594.114883 -L 604.813349 608.369908 -L 604.896289 579.381531 -L 604.997002 566.612219 -L 604.943684 592.376695 -L 605.014775 575.538616 -L 605.115488 599.98444 -L 605.032548 573.702248 -L 605.145109 595.922754 -L 605.156958 596.156576 -L 605.186579 581.363526 -L 605.192504 578.486753 -L 605.251747 598.415842 -L 605.263595 595.860504 -L 605.382081 636.520858 -L 605.287292 594.04455 -L 605.417627 628.908821 -L 605.512415 608.910224 -L 605.55981 620.259662 -L 605.571658 623.653181 -L 605.595355 613.575962 -L 605.678295 593.875733 -L 605.707917 603.593705 -L 605.719765 618.292615 -L 605.802705 592.15884 -L 605.80863 593.191029 -L 605.885645 581.451532 -L 605.897494 588.960439 -L 606.004131 614.534871 -L 606.027828 612.894689 -L 606.033753 613.15888 -L 606.039677 609.165409 -L 606.05745 598.347532 -L 606.092996 624.122456 -L 606.164087 635.84438 -L 606.14039 619.978687 -L 606.199633 625.543284 -L 606.341816 609.192902 -L 606.252951 632.956068 -L 606.353664 615.345823 -L 606.418831 626.661417 -L 606.442529 605.105629 -L 606.489923 600.250325 -L 606.460301 611.57031 -L 606.549166 606.216827 -L 606.602484 616.544171 -L 606.620257 594.11635 -L 606.655803 605.749482 -L 606.673576 590.361935 -L 606.732819 615.904937 -L 606.786137 638.400198 -L 606.851305 626.43333 -L 607.100125 571.461933 -L 607.111973 585.745523 -L 607.242308 606.329482 -L 607.153443 580.828364 -L 607.248232 602.405006 -L 607.26008 596.807538 -L 607.277853 614.360641 -L 607.283778 610.786635 -L 607.348945 620.67202 -L 607.372642 599.776449 -L 607.390415 595.480778 -L 607.431885 624.146562 -L 607.437809 632.711444 -L 607.502976 610.114199 -L 607.532598 610.925615 -L 607.651084 589.19511 -L 607.657008 595.634043 -L 607.734024 574.884907 -L 607.751796 586.011367 -L 607.822888 574.880145 -L 607.781418 601.272964 -L 607.852509 587.787193 -L 607.947298 595.755652 -L 607.893979 572.963245 -L 607.965071 591.521582 -L 608.059859 575.048801 -L 608.000617 594.317651 -L 608.071708 592.163425 -L 608.077632 597.021429 -L 608.160572 582.913981 -L 608.178345 592.807023 -L 608.190194 590.71464 -L 608.213891 604.372893 -L 608.219815 602.073184 -L 608.35015 632.867036 -L 608.468635 606.450629 -L 608.480484 612.54727 -L 608.551575 636.619679 -L 608.498257 606.119783 -L 608.59897 619.467186 -L 608.729304 586.965917 -L 608.616743 620.512004 -L 608.747077 593.720443 -L 608.877411 614.051839 -L 608.812244 591.321906 -L 608.883336 612.025621 -L 608.912957 622.953938 -L 608.895184 611.705374 -L 608.960351 612.109907 -L 608.966276 606.684483 -L 609.019594 621.268803 -L 609.05514 617.796352 -L 609.061064 624.145782 -L 609.144004 601.526262 -L 609.155853 609.641961 -L 609.161777 605.694743 -L 609.232869 629.021077 -L 609.256566 607.580609 -L 609.26249 616.096288 -L 609.34543 578.179712 -L 609.42837 608.50481 -L 609.493537 598.510896 -L 609.582402 582.629686 -L 609.59425 603.199147 -L 609.600175 596.358171 -L 609.659418 585.261193 -L 609.712736 602.427028 -L 609.860843 562.174105 -L 609.724585 603.479165 -L 609.866768 566.372038 -L 609.88454 586.717369 -L 609.961556 563.12157 -L 609.979329 583.612164 -L 609.985253 575.921825 -L 610.074118 600.555228 -L 610.139285 607.878729 -L 610.097815 592.038973 -L 610.151133 596.402438 -L 610.234074 581.205489 -L 610.198528 597.713495 -L 610.275544 585.251347 -L 610.287392 587.327751 -L 610.311089 575.889325 -L 610.352559 577.146011 -L 610.358484 574.408959 -L 610.376256 587.243565 -L 610.465121 576.137924 -L 610.476969 576.930597 -L 610.595455 603.598859 -L 610.672471 593.491161 -L 610.696168 612.021582 -L 610.702092 607.017749 -L 610.708017 607.460275 -L 610.719865 601.72695 -L 610.72579 606.279846 -L 610.761335 594.127461 -L 610.814654 628.341296 -L 610.820578 626.778743 -L 610.992383 568.143145 -L 611.004231 582.616902 -L 611.010155 582.877014 -L 611.01608 581.24698 -L 611.116793 631.610775 -L 611.146414 624.119441 -L 611.312294 578.196324 -L 611.158263 625.221602 -L 611.318218 583.287254 -L 611.330067 602.759464 -L 611.436704 598.395996 -L 611.460401 582.695075 -L 611.525569 606.496954 -L 611.584811 613.114905 -L 611.626281 597.31607 -L 611.632206 595.928709 -L 611.655903 611.187435 -L 611.6796 620.662288 -L 611.750692 593.867032 -L 611.84548 602.180407 -L 611.792162 580.231334 -L 611.857329 597.675959 -L 611.922496 582.778576 -L 611.963966 596.395225 -L 612.017285 587.329206 -L 612.112073 620.319969 -L 612.195013 600.25001 -L 612.224635 619.176094 -L 612.230559 616.964172 -L 612.266105 631.666834 -L 612.295726 628.712125 -L 612.30165 635.766261 -L 612.366818 616.273585 -L 612.390515 619.818715 -L 612.461606 627.959788 -L 612.520849 601.945308 -L 612.550471 613.58471 -L 612.633411 609.329011 -L 612.663032 615.25212 -L 612.722275 601.568101 -L 612.728199 603.388067 -L 612.834836 645.319902 -L 612.894079 621.022404 -L 612.941474 606.021692 -L 613.012565 615.230248 -L 613.030338 625.304665 -L 613.077732 607.754062 -L 613.142899 624.222686 -L 613.219915 613.240044 -L 613.190294 629.264996 -L 613.255461 621.248609 -L 613.261385 621.319866 -L 613.320628 617.625037 -L 613.302855 624.937963 -L 613.356174 622.955369 -L 613.362098 625.489337 -L 613.385795 595.156114 -L 613.403568 599.662192 -L 613.480584 580.906488 -L 613.522054 591.502698 -L 613.622767 617.583296 -L 613.646464 608.929123 -L 613.652388 608.720147 -L 613.759025 622.119422 -L 613.687934 599.276075 -L 613.76495 619.887705 -L 613.818268 593.948274 -L 613.877511 606.400546 -L 613.88936 619.57621 -L 613.978224 606.131862 -L 613.990073 608.686 -L 614.031543 591.793595 -L 614.114483 596.426045 -L 614.132256 588.758109 -L 614.238893 614.768251 -L 614.298136 590.352286 -L 614.357379 596.689398 -L 614.452167 617.232607 -L 614.481789 608.438728 -L 614.59435 594.091408 -L 614.606199 595.476441 -L 614.683215 612.80344 -L 614.730609 608.216103 -L 614.736533 601.741361 -L 614.825397 618.749105 -L 614.855019 627.150233 -L 614.84317 615.222341 -L 614.872792 618.487391 -L 614.997202 594.403185 -L 615.026823 624.545184 -L 615.109763 607.708202 -L 615.157158 603.369191 -L 615.169006 620.949906 -L 615.192703 616.60755 -L 615.198628 622.555658 -L 615.269719 590.163361 -L 615.311189 586.291131 -L 615.334886 599.403763 -L 615.435599 608.354105 -L 615.447448 604.114682 -L 615.471145 613.828678 -L 615.524464 591.056472 -L 615.542236 600.51006 -L 615.583706 591.685914 -L 615.619252 622.180773 -L 615.654798 597.249155 -L 615.773284 641.343648 -L 615.672571 595.611528 -L 615.808829 613.783128 -L 615.838451 589.047918 -L 615.915467 601.574407 -L 616.004331 623.24063 -L 615.939164 600.37531 -L 616.033952 618.933856 -L 616.039877 615.701745 -L 616.075422 635.948317 -L 616.134665 623.664389 -L 616.170211 627.325577 -L 616.158362 621.381999 -L 616.176135 621.979703 -L 616.30647 585.724589 -L 616.413107 615.582773 -L 616.424955 611.408029 -L 616.436804 598.720373 -L 616.537517 605.793122 -L 616.549366 612.415588 -L 616.602684 592.470365 -L 616.608608 594.414611 -L 616.626381 582.160365 -L 616.703397 601.212855 -L 616.709321 600.876024 -L 616.84558 623.138238 -L 616.904823 638.753181 -L 616.958141 626.64622 -L 617.01146 635.146448 -L 616.999612 623.530405 -L 617.023309 632.164304 -L 617.070703 589.888575 -L 617.141794 619.156032 -L 617.266205 582.79689 -L 617.283977 596.636384 -L 617.396539 608.962711 -L 617.313599 593.935804 -L 617.408387 606.659965 -L 617.491327 590.815929 -L 617.438009 613.84755 -L 617.532798 599.758262 -L 617.568343 595.365261 -L 617.544646 602.281476 -L 617.574268 601.242916 -L 617.657208 613.799888 -L 617.621662 587.693561 -L 617.686829 603.858705 -L 617.710526 608.259987 -L 617.775693 599.066857 -L 617.846785 593.21834 -L 617.793466 605.971949 -L 617.864558 601.243711 -L 617.988968 618.492853 -L 618.077832 594.675167 -L 618.000816 619.388108 -L 618.131151 609.23127 -L 618.273334 634.961436 -L 618.279258 634.725212 -L 618.368122 589.497903 -L 618.421441 605.485816 -L 618.534002 614.26571 -L 618.516229 594.16411 -L 618.539927 614.113585 -L 618.593245 630.080765 -L 618.616942 612.505548 -L 618.652488 618.875298 -L 618.759125 589.751306 -L 618.770974 598.1352 -L 618.782822 613.345884 -L 618.859838 587.64666 -L 618.984248 554.098014 -L 618.93093 591.602048 -L 618.990173 558.773084 -L 619.037567 591.556698 -L 619.108658 586.105172 -L 619.227144 602.2686 -L 619.197523 585.337033 -L 619.238993 598.827992 -L 619.250841 588.241288 -L 619.339706 609.898701 -L 619.3871 624.611864 -L 619.410797 601.973806 -L 619.541131 583.547425 -L 619.55298 586.113415 -L 619.582601 577.394776 -L 619.600374 587.293754 -L 619.612223 585.845037 -L 619.624072 595.105828 -L 619.647769 573.360095 -L 619.712936 578.306995 -L 619.71886 576.828241 -L 619.748482 597.154106 -L 619.772179 589.25433 -L 619.789952 607.365306 -L 619.819573 601.959893 -L 619.896589 614.875341 -L 619.878816 587.425471 -L 619.932135 605.45826 -L 620.020999 593.72586 -L 619.949907 613.20759 -L 620.038772 606.283294 -L 620.115787 611.979965 -L 620.068393 594.651926 -L 620.13356 606.088092 -L 620.246122 587.862592 -L 620.252046 594.745329 -L 620.281668 615.844137 -L 620.317213 582.11387 -L 620.346835 582.208091 -L 620.358683 570.508646 -L 620.441623 594.819544 -L 620.453472 585.643166 -L 620.560109 594.834975 -L 620.500866 575.587391 -L 620.566033 592.176507 -L 620.589731 582.953039 -L 620.637125 612.342805 -L 620.648973 604.67461 -L 620.666746 604.370525 -L 620.720065 631.438255 -L 620.785232 622.836506 -L 620.844475 641.863817 -L 620.880021 646.058081 -L 620.891869 638.158051 -L 620.921491 616.540968 -L 621.010355 625.56626 -L 621.022204 629.972066 -L 621.087371 614.812824 -L 621.152538 603.646676 -L 621.134765 623.27404 -L 621.199932 606.191135 -L 621.318418 638.201713 -L 621.359888 637.097799 -L 621.502071 612.841277 -L 621.383585 639.683199 -L 621.51392 619.456215 -L 621.573163 633.955127 -L 621.525768 617.428426 -L 621.590935 621.267528 -L 621.6798 602.330724 -L 621.703497 612.606808 -L 621.780513 603.130855 -L 621.76274 620.76521 -L 621.816058 608.744984 -L 621.910847 624.961012 -L 621.839756 605.60013 -L 621.934544 616.735723 -L 622.017484 597.846454 -L 621.987863 626.286782 -L 622.047106 608.502987 -L 622.05303 615.527357 -L 622.130046 583.736667 -L 622.141894 593.172785 -L 622.147819 590.083209 -L 622.165591 609.281889 -L 622.224834 599.615068 -L 622.230759 605.715552 -L 622.325547 596.322992 -L 622.34332 584.079502 -L 622.420336 600.974674 -L 622.432184 597.208533 -L 622.438109 597.181771 -L 622.461806 588.550612 -L 622.55067 604.373532 -L 622.562519 592.564164 -L 622.645459 615.441784 -L 622.651383 609.597661 -L 622.710626 605.763528 -L 622.775793 622.02804 -L 622.811339 603.332127 -L 622.88243 620.066722 -L 623.000916 633.9148 -L 622.906128 616.950081 -L 623.012765 626.607373 -L 623.024613 613.173699 -L 623.113478 633.675739 -L 623.137175 640.447027 -L 623.202342 627.38547 -L 623.208266 629.224936 -L 623.255661 615.658274 -L 623.231963 633.157143 -L 623.261585 617.425223 -L 623.308979 604.609135 -L 623.332676 618.564245 -L 623.374146 614.838841 -L 623.380071 614.28664 -L 623.385995 621.827581 -L 623.391919 619.757963 -L 623.397844 623.702925 -L 623.474859 604.579936 -L 623.492632 602.277107 -L 623.504481 613.418414 -L 623.540026 609.2232 -L 623.599269 621.817779 -L 623.646664 605.840933 -L 623.711831 577.513172 -L 623.771074 583.38545 -L 623.776998 582.18336 -L 623.806619 595.192541 -L 623.901408 625.912337 -L 623.936954 614.21233 -L 624.037667 588.27116 -L 623.960651 614.577452 -L 624.073213 603.124274 -L 624.209471 623.512248 -L 624.233168 593.830214 -L 624.327957 610.636176 -L 624.399048 591.345519 -L 624.375351 613.371245 -L 624.464216 598.351796 -L 624.487913 612.611164 -L 624.55308 596.332627 -L 624.564928 587.62094 -L 624.600474 613.987383 -L 624.641944 603.610746 -L 624.695263 626.395126 -L 624.754506 609.895727 -L 624.76043 609.808197 -L 624.766354 609.952589 -L 624.837446 635.878326 -L 624.878916 624.530942 -L 624.96778 610.138097 -L 624.991477 619.385907 -L 624.997402 624.413841 -L 625.086266 606.971646 -L 625.109963 615.823494 -L 625.145509 608.342396 -L 625.222525 635.044238 -L 625.25807 616.418159 -L 625.293616 598.484392 -L 625.346935 623.535837 -L 625.364707 613.645258 -L 625.38248 622.351767 -L 625.441723 599.617858 -L 625.447648 603.334958 -L 625.453572 602.39849 -L 625.477269 613.085763 -L 625.512815 632.772461 -L 625.572058 604.801195 -L 625.654998 587.982018 -L 625.696468 597.558218 -L 625.720165 607.054478 -L 625.767559 595.165443 -L 625.785332 597.490937 -L 625.791256 594.303857 -L 625.862348 615.569659 -L 625.868272 620.887181 -L 625.957136 603.297257 -L 625.963061 608.288414 -L 625.974909 603.29238 -L 626.016379 613.34139 -L 626.075622 638.797754 -L 626.123016 609.361791 -L 626.241502 593.947645 -L 626.217805 611.513912 -L 626.288897 596.592841 -L 626.336291 620.548111 -L 626.407382 613.131819 -L 626.478474 588.630789 -L 626.51402 612.08765 -L 626.614732 638.601167 -L 626.63843 627.331141 -L 626.709521 599.638339 -L 626.656202 627.416836 -L 626.828007 606.545215 -L 626.916871 629.167753 -L 626.946493 624.818002 -L 626.976114 624.872762 -L 627.082751 590.573237 -L 627.112373 572.113516 -L 627.165691 607.782981 -L 627.183464 600.516811 -L 627.207161 595.333805 -L 627.21901 606.455381 -L 627.242707 603.444318 -L 627.266404 597.488666 -L 627.361193 610.403019 -L 627.367117 601.518338 -L 627.455981 628.543531 -L 627.461906 624.780444 -L 627.55077 598.106292 -L 627.63371 614.49578 -L 627.692953 634.973459 -L 627.769969 621.884061 -L 627.787742 622.013187 -L 627.977319 577.577699 -L 628.04841 587.517498 -L 628.001016 574.186878 -L 628.083956 579.245653 -L 628.095805 569.06741 -L 628.166896 588.362918 -L 628.17282 587.196006 -L 628.178745 586.934732 -L 628.208366 570.760793 -L 628.267609 603.01472 -L 628.273533 601.057937 -L 628.285382 599.965113 -L 628.303155 605.387837 -L 628.386095 619.56918 -L 628.409792 609.487717 -L 628.474959 588.28008 -L 628.433489 612.70504 -L 628.522353 594.860669 -L 628.528278 602.33544 -L 628.599369 584.045037 -L 628.628991 597.151179 -L 628.688234 561.094624 -L 628.759325 569.97106 -L 628.865962 596.858576 -L 628.877811 587.77015 -L 628.883735 587.614362 -L 628.925205 584.418454 -L 629.008145 604.978042 -L 629.037767 586.604261 -L 629.13848 592.609404 -L 629.144404 592.571279 -L 629.150328 590.913058 -L 629.17995 608.246764 -L 629.227344 599.014516 -L 629.30436 629.829307 -L 629.375451 623.424696 -L 629.47024 632.44719 -L 629.399148 614.679413 -L 629.488013 628.26012 -L 629.570953 602.590002 -L 629.51171 629.336773 -L 629.606498 614.300649 -L 629.647968 620.560218 -L 629.754606 584.995939 -L 629.796076 613.784343 -L 629.84347 583.776241 -L 629.873091 592.422542 -L 629.879016 590.194853 -L 629.938259 607.346865 -L 630.05082 639.456207 -L 629.961956 602.641522 -L 630.115987 638.835475 -L 630.210776 601.493132 -L 630.246322 610.081217 -L 630.305564 632.107575 -L 630.34111 605.355284 -L 630.347034 612.325285 -L 630.406277 575.727235 -L 630.471445 589.787132 -L 630.560309 600.509184 -L 630.524763 583.565875 -L 630.578082 589.632876 -L 630.625476 604.960782 -L 630.684719 583.79675 -L 630.75581 568.79658 -L 630.815053 605.684471 -L 630.921691 589.254936 -L 630.826902 612.119605 -L 630.927615 597.370618 -L 631.010555 633.132389 -L 631.052025 621.740588 -L 631.057949 622.645406 -L 631.075722 611.158653 -L 631.093495 611.449041 -L 631.223829 581.895115 -L 631.229754 586.200015 -L 631.241602 581.110908 -L 631.306769 590.918831 -L 631.318618 587.066729 -L 631.425255 612.323627 -L 631.336391 585.934886 -L 631.437104 606.954986 -L 631.502271 592.137239 -L 631.478574 609.99926 -L 631.555589 600.99399 -L 631.715545 641.820061 -L 631.573362 593.464886 -L 631.727394 634.214538 -L 631.857728 609.193244 -L 631.875501 602.083081 -L 631.934744 618.766094 -L 631.940668 622.090864 -L 631.988063 601.03901 -L 632.041381 618.732416 -L 632.153943 587.712024 -L 632.17764 602.291275 -L 632.207261 626.742995 -L 632.284277 599.716491 -L 632.361293 590.51857 -L 632.38499 602.795771 -L 632.432384 619.433154 -L 632.503476 612.675786 -L 632.539021 587.509697 -L 632.616037 603.197453 -L 632.71675 618.93769 -L 632.63381 602.478314 -L 632.752296 607.042951 -L 632.858933 579.78175 -L 632.88263 591.55019 -L 632.930024 610.278368 -L 632.989267 594.691694 -L 632.995192 587.042171 -L 633.042586 614.926676 -L 633.095905 595.126432 -L 633.21439 614.703058 -L 633.149223 582.717133 -L 633.232163 608.854913 -L 633.350649 586.582332 -L 633.249936 613.471263 -L 633.356573 592.361744 -L 633.38027 597.161616 -L 633.398043 585.683194 -L 633.439513 594.471509 -L 633.510605 578.416593 -L 633.552075 592.330451 -L 633.557999 588.632544 -L 633.629091 611.799805 -L 633.664636 633.880714 -L 633.747576 616.877721 -L 633.901608 582.590097 -L 633.771273 619.933279 -L 633.907532 587.70011 -L 633.913456 591.607666 -L 633.954926 575.363965 -L 633.990472 576.725854 -L 633.996396 572.24579 -L 634.061564 597.104848 -L 634.079337 590.861524 -L 634.085261 590.849502 -L 634.203747 613.97408 -L 634.221519 609.374096 -L 634.245217 589.214899 -L 634.328157 608.129487 -L 634.375551 622.469187 -L 634.340005 607.935761 -L 634.440718 610.588279 -L 634.51181 614.716049 -L 634.476264 601.01944 -L 634.535507 607.519602 -L 634.63622 594.087147 -L 634.571053 617.225698 -L 634.648068 602.718704 -L 634.653993 600.987171 -L 634.695463 619.976311 -L 634.701387 617.50174 -L 634.837646 641.580918 -L 634.890964 618.133686 -L 634.956131 629.033094 -L 634.962056 629.51814 -L 634.991677 623.601531 -L 635.039071 604.953217 -L 635.080541 624.426735 -L 635.116087 639.5085 -L 635.139784 623.618854 -L 635.187179 624.716926 -L 635.199027 613.098391 -L 635.234573 642.345712 -L 635.281967 637.311897 -L 635.287891 637.586313 -L 635.311589 652.803523 -L 635.38268 629.297175 -L 635.388604 629.525741 -L 635.46562 593.699177 -L 635.513014 614.993746 -L 635.518939 618.000884 -L 635.542636 599.965881 -L 635.613727 615.081495 -L 635.619652 609.214447 -L 635.649273 628.26311 -L 635.726289 611.623083 -L 635.821077 606.335994 -L 635.803305 620.625124 -L 635.832926 611.886291 -L 635.83885 611.896997 -L 635.868472 619.613015 -L 635.92179 603.685995 -L 635.927715 603.738252 -L 636.00473 595.27613 -L 636.034352 606.771847 -L 636.040276 618.122174 -L 636.111368 595.088741 -L 636.135065 598.407384 -L 636.164686 582.194484 -L 636.253551 593.200888 -L 636.336491 638.572656 -L 636.401658 630.25894 -L 636.478674 633.15679 -L 636.419431 618.615891 -L 636.484598 630.731414 -L 636.614932 582.122872 -L 636.626781 593.344791 -L 636.638629 596.690808 -L 636.650478 581.215959 -L 636.703797 586.974463 -L 636.709721 584.320066 -L 636.774888 602.523423 -L 636.922995 619.186565 -L 636.786737 598.070469 -L 636.946692 618.22055 -L 636.994087 610.642182 -L 637.047405 625.61752 -L 637.05333 625.638603 -L 637.082951 631.865712 -L 637.112572 607.147876 -L 637.130345 611.854152 -L 637.195513 595.868909 -L 637.159967 613.331588 -L 637.242907 603.252454 -L 637.325847 628.76556 -L 637.355468 624.199657 -L 637.361393 618.098509 -L 637.402863 646.523237 -L 637.462106 624.288899 -L 637.46803 627.997977 -L 637.533197 609.494375 -L 637.556894 614.686481 -L 637.604288 618.411038 -L 637.627986 606.800492 -L 637.651683 590.680314 -L 637.710926 618.620266 -L 637.728699 615.485268 -L 637.823487 642.796037 -L 637.870881 631.293017 -L 637.96567 610.673504 -L 638.001216 611.23135 -L 638.054534 620.320363 -L 638.018989 598.66445 -L 638.119702 617.437829 -L 638.161172 607.687827 -L 638.196717 625.923737 -L 638.220414 621.823095 -L 638.273733 629.234584 -L 638.303355 613.855179 -L 638.309279 610.509812 -L 638.362597 634.51629 -L 638.374446 633.821885 -L 638.427765 640.332632 -L 638.398143 628.194876 -L 638.433689 637.606563 -L 638.516629 613.991771 -L 638.552175 621.902866 -L 638.611418 620.182139 -L 638.67066 644.638445 -L 638.818768 595.398345 -L 638.919481 612.75935 -L 638.872086 590.595046 -L 638.955026 607.595689 -L 638.960951 597.965632 -L 639.055739 615.336768 -L 639.061664 606.649133 -L 639.114982 615.892518 -L 639.156452 598.26595 -L 639.197922 590.841652 -L 639.239392 607.888694 -L 639.245316 604.195347 -L 639.334181 639.408839 -L 639.375651 623.612742 -L 639.505985 598.449369 -L 639.583001 588.965483 -L 639.624471 610.528147 -L 639.654092 615.7536 -L 639.689638 594.393231 -L 639.742957 565.855789 -L 639.796275 594.325981 -L 639.825897 609.541757 -L 639.914761 604.48151 -L 639.932534 597.160174 -L 639.974004 623.38659 -L 639.991777 622.138023 -L 639.997701 624.156715 -L 640.033247 601.385208 -L 640.039171 601.423574 -L 640.110263 589.74902 -L 640.05102 604.449758 -L 640.157657 598.917192 -L 640.169506 602.820263 -L 640.181354 591.676898 -L 640.199127 597.474912 -L 640.205051 593.234255 -L 640.264294 621.626936 -L 640.282067 612.107114 -L 640.412401 648.145131 -L 640.436099 635.909327 -L 640.637524 582.756769 -L 640.643449 585.062194 -L 640.708616 607.807169 -L 640.761934 598.916781 -L 640.785632 589.856461 -L 640.827102 607.260366 -L 640.862647 606.453618 -L 640.998906 629.314078 -L 641.075922 611.163075 -L 641.117392 621.863039 -L 641.123316 624.076697 -L 641.158862 604.877157 -L 641.17071 609.458338 -L 641.259575 578.617893 -L 641.289196 591.754217 -L 641.312893 598.944296 -L 641.372136 582.950057 -L 641.389909 587.019769 -L 641.437303 568.673454 -L 641.455076 588.487626 -L 641.478773 586.994201 -L 641.490622 599.661754 -L 641.561713 581.525572 -L 641.597259 597.666928 -L 641.615032 595.712556 -L 641.662426 607.077793 -L 641.686124 615.157218 -L 641.751291 594.424656 -L 641.769064 590.705141 -L 641.774988 583.922256 -L 641.834231 610.343816 -L 641.881625 586.494139 -L 642.006035 611.264548 -L 642.083051 636.242895 -L 642.124521 629.402259 -L 642.243007 601.916052 -L 642.248931 607.253995 -L 642.26078 615.38063 -L 642.284477 596.732134 -L 642.325947 599.514857 -L 642.331871 595.442035 -L 642.373341 630.031216 -L 642.391114 623.261851 -L 642.408887 635.170326 -L 642.450357 623.156965 -L 642.503675 625.297439 -L 642.556994 589.275072 -L 642.628085 604.823665 -L 642.71695 622.575119 -L 642.746571 611.879706 -L 642.752496 610.95553 -L 642.782117 622.312811 -L 642.793966 620.321633 -L 642.805814 629.985279 -L 642.876906 618.273988 -L 642.906527 621.745344 -L 642.936148 625.087581 -L 642.995391 613.626092 -L 643.001316 614.044319 -L 643.107953 595.086218 -L 643.036861 620.642084 -L 643.113877 601.548406 -L 643.226439 634.035655 -L 643.250136 626.294469 -L 643.362697 597.342117 -L 643.374546 602.824156 -L 643.416016 585.800975 -L 643.451562 611.289153 -L 643.46341 608.525153 -L 643.493032 627.311617 -L 643.58782 620.538013 -L 643.664836 609.81833 -L 643.605593 626.944841 -L 643.700382 619.729557 -L 643.706306 628.690915 -L 643.801095 612.154487 -L 643.807019 614.917467 -L 643.895883 595.095968 -L 643.96105 596.113912 -L 644.067688 635.856697 -L 643.978823 595.570112 -L 644.126931 611.268044 -L 644.257265 596.704329 -L 644.209871 622.437529 -L 644.263189 597.517847 -L 644.280962 594.262121 -L 644.310584 602.404921 -L 644.423145 609.545171 -L 644.322432 599.707504 -L 644.429069 606.578226 -L 644.500161 581.41209 -L 644.541631 593.037749 -L 644.624571 595.669736 -L 644.589025 569.470274 -L 644.648268 591.523088 -L 644.725284 562.774611 -L 644.772678 571.726473 -L 644.891164 582.499399 -L 644.808224 571.642312 -L 644.897088 580.95783 -L 645.027422 554.570155 -L 645.09259 559.461315 -L 645.430274 621.871299 -L 645.459896 610.491996 -L 645.560608 582.605892 -L 645.584306 588.749995 -L 645.643549 574.619633 -L 645.602079 591.642821 -L 645.679094 588.409056 -L 645.785731 595.541909 -L 645.762034 583.944547 -L 645.791656 595.040113 -L 645.821277 609.078069 -L 645.904217 590.284261 -L 645.910142 593.564071 -L 645.927914 579.466045 -L 646.00493 585.518737 -L 646.010854 585.416404 -L 646.08787 591.987308 -L 646.111567 576.433446 -L 646.117492 580.754849 -L 646.123416 578.856415 -L 646.17081 593.716979 -L 646.206356 586.350177 -L 646.218205 585.289461 -L 646.277447 608.465219 -L 646.372236 635.325212 -L 646.413706 627.550025 -L 646.431479 618.847324 -L 646.478873 633.73903 -L 646.514419 631.499366 -L 646.555889 646.676591 -L 646.603283 624.668804 -L 646.739542 586.733845 -L 646.816558 631.015453 -L 646.887649 615.590143 -L 646.982438 607.060245 -L 646.899498 616.567705 -L 646.994286 616.497705 -L 647.000211 615.45008 -L 647.017984 626.529847 -L 647.023908 632.963428 -L 647.106848 608.810412 -L 647.112772 609.266336 -L 647.177939 585.923962 -L 647.237182 588.337006 -L 647.284577 596.73252 -L 647.308274 587.928708 -L 647.337895 592.375065 -L 647.343819 587.651777 -L 647.379365 599.561303 -L 647.432684 596.766825 -L 647.480078 619.915331 -L 647.563018 614.403342 -L 647.63411 596.192458 -L 647.681504 610.301113 -L 647.687428 610.151128 -L 647.740747 613.849746 -L 647.722974 596.599528 -L 647.79999 610.963076 -L 647.888854 582.687837 -L 647.811838 611.475284 -L 647.930324 593.85474 -L 648.036961 622.604573 -L 647.948097 590.822106 -L 648.060658 613.218572 -L 648.084356 601.69668 -L 648.13175 625.439392 -L 648.155447 618.172327 -L 648.268009 629.912585 -L 648.196917 617.247876 -L 648.279857 621.733852 -L 648.356873 611.497583 -L 648.321327 626.079838 -L 648.392419 620.132237 -L 648.416116 599.334434 -L 648.522753 601.399259 -L 648.552374 618.729336 -L 648.611617 592.380571 -L 648.623466 596.646603 -L 648.700482 572.942936 -L 648.747876 590.652451 -L 648.848589 612.504975 -L 648.765649 589.99424 -L 648.895983 607.638544 -L 648.949302 579.27454 -L 649.008545 598.182457 -L 649.014469 597.383968 -L 649.032242 603.896585 -L 649.073712 593.772922 -L 649.144803 616.733883 -L 649.150728 616.808652 -L 649.198122 600.171874 -L 649.263289 611.711934 -L 649.358078 608.360254 -L 649.310683 627.547981 -L 649.369926 608.63856 -L 649.441018 589.159178 -L 649.494336 620.534728 -L 649.677989 579.551797 -L 649.749081 590.055081 -L 649.879415 627.139304 -L 649.772778 587.386834 -L 649.956431 621.063241 -L 650.027522 590.226076 -L 650.074917 607.504605 -L 650.110462 595.367892 -L 650.13416 612.858855 -L 650.140084 623.173471 -L 650.2171 586.835334 -L 650.234872 599.700682 -L 650.246721 590.513616 -L 650.30004 614.130958 -L 650.335585 608.017946 -L 650.347434 606.358751 -L 650.371131 616.225896 -L 650.418525 613.446747 -L 650.442223 624.110055 -L 650.495541 605.482001 -L 650.501465 603.426094 -L 650.537011 617.183325 -L 650.59033 605.717957 -L 650.6318 630.766991 -L 650.696967 603.340714 -L 650.732513 616.546263 -L 650.762134 594.939719 -L 650.791756 596.225287 -L 650.809528 609.29901 -L 650.892469 603.201585 -L 650.945787 587.98156 -L 650.975409 603.235335 -L 650.999106 592.532636 -L 651.093894 609.576197 -L 651.117592 604.947554 -L 651.259774 645.6494 -L 651.194607 604.094399 -L 651.29532 627.545279 -L 651.360487 608.995739 -L 651.396033 632.18073 -L 651.401957 632.196072 -L 651.407882 636.543249 -L 651.478973 611.543308 -L 651.621156 582.368353 -L 651.496746 615.365495 -L 651.638929 586.334372 -L 651.715945 613.769884 -L 651.656702 585.245657 -L 651.769263 599.576493 -L 651.852203 587.619211 -L 651.804809 605.358167 -L 651.8759 603.184816 -L 651.887749 614.682256 -L 651.946992 593.227111 -L 651.958841 575.010163 -L 652.047705 595.102298 -L 652.148418 600.667267 -L 652.083251 575.494563 -L 652.154342 598.064925 -L 652.189888 570.430523 -L 652.266904 593.77329 -L 652.278752 596.121445 -L 652.326146 588.162631 -L 652.332071 586.326744 -L 652.373541 607.594611 -L 652.379465 604.367074 -L 652.385389 607.241142 -L 652.438708 582.50915 -L 652.456481 588.338887 -L 652.462405 587.45436 -L 652.474254 597.990215 -L 652.480178 597.36127 -L 652.563118 624.53413 -L 652.610512 619.357487 -L 652.657907 623.84064 -L 652.628285 614.89246 -L 652.681604 615.947925 -L 652.817862 587.800263 -L 653.00744 619.276026 -L 652.84156 584.013237 -L 653.025213 605.092005 -L 653.031137 603.45153 -L 653.054834 621.993476 -L 653.108153 610.124301 -L 653.155547 632.02807 -L 653.21479 610.966186 -L 653.274033 595.302529 -L 653.309578 613.339264 -L 653.315503 609.239053 -L 653.327351 620.193134 -L 653.386594 601.459036 -L 653.42214 613.670767 -L 653.534701 602.337688 -L 653.457686 619.978101 -L 653.540626 604.117798 -L 653.570247 601.377529 -L 653.582096 615.712745 -L 653.599869 613.970988 -L 653.611717 609.46506 -L 653.623566 597.360813 -L 653.700581 618.290066 -L 653.71243 617.23688 -L 653.730203 627.967614 -L 653.801294 598.881992 -L 653.813143 604.71955 -L 653.819067 602.990794 -L 653.87831 615.404139 -L 653.955326 636.20336 -L 653.990872 626.193551 -L 654.079736 594.807935 -L 654.12713 600.818697 -L 654.174525 613.042317 -L 654.221919 598.116037 -L 654.233767 600.60112 -L 654.269313 618.97896 -L 654.322632 597.57674 -L 654.33448 598.243353 -L 654.352253 583.21692 -L 654.381875 602.147878 -L 654.447042 591.847757 -L 654.559603 606.320365 -L 654.512209 586.233419 -L 654.612922 600.544932 -L 654.684013 575.97559 -L 654.725483 598.626621 -L 654.843969 643.484662 -L 654.861742 635.438886 -L 654.867666 636.662879 -L 654.915061 623.816055 -L 655.080941 590.725591 -L 655.092789 587.583878 -L 655.098714 592.43057 -L 655.140184 600.655098 -L 655.152032 582.497458 -L 655.157957 579.691444 -L 655.175729 600.208236 -L 655.229048 591.358638 -L 655.234972 598.017465 -L 655.323837 583.437862 -L 655.34161 593.80996 -L 655.353458 595.197037 -L 655.359382 588.108343 -L 655.38308 573.798912 -L 655.471944 582.375021 -L 655.602278 606.284335 -L 655.501565 581.764333 -L 655.625975 595.00411 -L 655.655597 584.375038 -L 655.637824 598.187176 -L 655.685218 595.663091 -L 655.809628 618.63032 -L 655.815553 616.369891 -L 655.886644 592.152938 -L 655.934038 609.188889 -L 655.951811 615.519472 -L 655.96366 620.78437 -L 656.011054 611.54374 -L 656.064373 620.291872 -L 656.076221 618.155743 -L 656.082146 618.163794 -L 656.123616 612.889807 -L 656.194707 631.235844 -L 656.307269 604.067505 -L 656.236177 633.65377 -L 656.313193 611.568512 -L 656.319117 619.772545 -L 656.366512 598.324076 -L 656.413906 598.78931 -L 656.674575 627.554362 -L 656.739742 645.569022 -L 656.775287 622.073827 -L 656.953016 584.982481 -L 656.95894 584.983881 -L 656.970789 595.970594 -L 657.035956 581.986097 -L 657.077426 593.969055 -L 657.178139 586.492922 -L 657.118896 610.341678 -L 657.189988 592.101952 -L 657.255155 574.179138 -L 657.284776 596.296267 -L 657.296625 592.371024 -L 657.492126 645.180058 -L 657.669855 587.202783 -L 657.509899 651.820967 -L 657.735022 603.594422 -L 657.770568 627.028068 -L 657.835735 602.574269 -L 657.847584 605.762217 -L 657.918675 608.859233 -L 657.900902 598.292203 -L 657.942372 605.385469 -L 658.066782 573.289293 -L 657.971994 612.976022 -L 658.084555 574.236263 -L 658.208965 609.576284 -L 658.108252 571.527053 -L 658.21489 606.097721 -L 658.232663 602.65953 -L 658.268208 627.567504 -L 658.303754 632.276699 -L 658.280057 625.009587 -L 658.315603 625.907887 -L 658.38077 629.79977 -L 658.451861 598.448019 -L 658.617741 649.994262 -L 658.653287 634.546308 -L 658.765849 622.80682 -L 658.706606 642.386815 -L 658.771773 623.515088 -L 658.807319 639.448542 -L 658.83694 605.486873 -L 658.872486 615.300628 -L 658.884334 617.464557 -L 658.896183 612.548046 -L 658.902107 611.095306 -L 658.925804 631.67503 -L 658.931729 622.932351 -L 658.967274 646.517235 -L 659.038366 622.419185 -L 659.04429 625.98209 -L 659.162776 609.335001 -L 659.109457 635.098226 -L 659.1687 611.790317 -L 659.257565 634.426255 -L 659.275337 613.202821 -L 659.299035 596.138275 -L 659.364202 615.00613 -L 659.387899 611.202136 -L 659.429369 629.744579 -L 659.518233 627.053194 -L 659.618946 610.508093 -L 659.547855 644.802474 -L 659.648568 613.484319 -L 659.743356 632.918233 -L 659.672265 611.253446 -L 659.784826 628.787555 -L 659.897388 600.106029 -L 659.826296 636.223552 -L 659.915161 602.781504 -L 660.004025 621.59623 -L 660.027722 616.988631 -L 660.104738 591.987732 -L 660.146208 607.073636 -L 660.199526 624.872697 -L 660.270618 619.489004 -L 660.329861 606.800184 -L 660.359482 620.43756 -L 660.377255 615.068093 -L 660.389104 623.242328 -L 660.472044 607.231125 -L 660.489817 597.919702 -L 660.513514 609.653875 -L 660.54906 622.79631 -L 660.602378 601.735408 -L 660.608302 601.778071 -L 660.614227 596.961361 -L 660.697167 616.011731 -L 660.703091 620.814331 -L 660.774182 591.205274 -L 660.940063 613.850934 -L 660.79788 588.692932 -L 660.957835 611.392295 -L 660.975608 600.312932 -L 661.0467 617.986646 -L 661.064473 611.628695 -L 661.100018 624.015849 -L 661.153337 601.778857 -L 661.17111 605.80991 -L 661.265898 624.2156 -L 661.283671 619.520328 -L 661.366611 599.900434 -L 661.384384 619.982472 -L 661.396233 617.085033 -L 661.414006 607.385 -L 661.496946 621.903084 -L 661.62728 582.433095 -L 661.66875 610.256216 -L 661.739842 595.62886 -L 661.79316 583.563059 -L 661.83463 612.542219 -L 661.840554 609.248836 -L 661.846479 610.718388 -L 661.882025 594.546573 -L 661.887949 590.183667 -L 661.947192 614.565425 -L 661.964965 608.770891 -L 661.988662 626.411475 -L 662.036056 603.110085 -L 662.065677 610.564661 -L 662.071602 604.65551 -L 662.142693 628.118386 -L 662.172315 614.118584 -L 662.255255 599.156695 -L 662.213785 620.438165 -L 662.2908 610.290569 -L 662.320422 602.110128 -L 662.421135 624.525122 -L 662.533696 613.348187 -L 662.474453 629.059312 -L 662.551469 616.102272 -L 662.634409 606.072227 -L 662.592939 620.065622 -L 662.658106 615.459828 -L 662.675879 619.457157 -L 662.711425 612.994821 -L 662.823986 587.735986 -L 662.764744 620.28439 -L 662.829911 594.033984 -L 662.835835 598.864369 -L 662.877305 565.008546 -L 662.924699 586.111235 -L 662.942472 573.555633 -L 662.983942 592.679092 -L 663.090579 607.20668 -L 663.102428 600.195191 -L 663.161671 578.51107 -L 663.197217 603.801899 -L 663.21499 596.928476 -L 663.250535 580.017411 -L 663.292005 609.012306 -L 663.321627 595.821033 -L 663.374945 613.072656 -L 663.428264 596.214477 -L 663.446037 591.409362 -L 663.487507 612.111056 -L 663.58822 627.248666 -L 663.552674 607.426391 -L 663.605993 624.927177 -L 663.611917 622.073824 -L 663.647463 642.474526 -L 663.688933 636.321647 -L 663.783721 621.286675 -L 663.789646 623.262658 -L 663.819267 609.923186 -L 663.866661 638.941896 -L 663.87851 632.707322 -L 663.967374 641.317927 -L 663.914056 619.285479 -L 663.991071 636.064603 -L 664.12733 596.417554 -L 664.216194 621.611987 -L 664.239892 604.458013 -L 664.33468 594.960067 -L 664.316907 607.596531 -L 664.352453 601.851333 -L 664.393923 628.786585 -L 664.470939 616.912671 -L 664.595349 599.254984 -L 664.512409 620.670145 -L 664.613122 599.959535 -L 664.62497 603.881163 -L 664.642743 616.031714 -L 664.690137 590.160711 -L 664.731607 609.01489 -L 664.743456 602.33866 -L 664.779002 624.011461 -L 664.838245 606.424272 -L 664.87379 616.075946 -L 664.885639 604.260004 -L 664.91526 605.433853 -L 664.938958 594.475921 -L 664.998201 637.243997 -L 665.004125 625.091607 -L 665.128535 650.789932 -L 665.389204 573.932233 -L 665.436598 582.255561 -L 665.442522 588.317974 -L 665.478068 565.87501 -L 665.543235 581.605642 -L 665.667645 551.827931 -L 665.691342 565.13793 -L 665.792055 587.548833 -L 665.827601 579.354082 -L 665.904617 593.312897 -L 665.83945 570.498232 -L 665.928314 581.112324 -L 665.934238 577.362683 -L 666.00533 598.889585 -L 666.0468 620.002684 -L 666.094194 598.330707 -L 666.12974 608.520691 -L 666.135664 605.397168 -L 666.188983 628.118957 -L 666.194907 627.20938 -L 666.200831 630.998932 -L 666.271923 610.100811 -L 666.372636 605.226643 -L 666.348938 614.646135 -L 666.37856 610.725306 -L 666.408181 631.725854 -L 666.485197 611.988525 -L 666.491121 608.198964 -L 666.550364 634.617564 -L 666.579986 618.108268 -L 666.680699 633.058007 -L 666.639229 608.818306 -L 666.698471 620.83482 -L 666.704396 619.598968 -L 666.722169 632.589048 -L 666.728093 638.297545 -L 666.787336 607.505367 -L 666.811033 614.525416 -L 666.840654 599.674353 -L 666.905822 633.711103 -L 666.988762 635.536444 -L 666.929519 621.478153 -L 667.00061 629.843211 -L 667.148717 597.119478 -L 667.04208 635.081927 -L 667.160566 604.764091 -L 667.231657 622.198659 -L 667.261279 606.104968 -L 667.267203 597.628819 -L 667.33237 622.791172 -L 667.361992 612.683243 -L 667.486402 627.340142 -L 667.439008 604.882546 -L 667.49825 624.224693 -L 667.551569 607.269257 -L 667.516023 628.63756 -L 667.604888 620.51738 -L 667.634509 626.669914 -L 667.699676 616.437342 -L 667.835935 581.633944 -L 667.912951 626.274578 -L 667.972194 611.38055 -L 668.019588 597.839195 -L 668.043285 615.9567 -L 668.084755 607.516076 -L 668.102528 595.251938 -L 668.132149 608.893252 -L 668.203241 603.562917 -L 668.256559 601.164768 -L 668.221014 608.404529 -L 668.268408 604.409519 -L 668.392818 638.820952 -L 668.398742 638.786177 -L 668.540925 612.014617 -L 668.440212 639.935093 -L 668.54685 614.444383 -L 668.558698 625.900407 -L 668.612017 602.636806 -L 668.641638 604.310662 -L 668.677184 588.636165 -L 668.730503 608.550939 -L 668.7542 599.776753 -L 668.825291 608.955089 -L 668.866761 592.713102 -L 669.00302 624.276005 -L 669.038566 611.221927 -L 669.12743 617.026436 -L 669.133354 618.958536 -L 669.157051 596.788646 -L 669.174824 599.879657 -L 669.180748 595.788255 -L 669.222219 626.103158 -L 669.245916 623.328895 -L 669.340704 635.76813 -L 669.370326 633.777825 -L 669.447341 602.623649 -L 669.494736 617.61559 -L 669.589524 597.64249 -L 669.607297 613.832461 -L 669.660616 625.635915 -L 669.62507 609.285181 -L 669.713934 613.191717 -L 669.731707 614.915192 -L 669.743556 606.107723 -L 669.773177 599.258691 -L 669.838345 612.212553 -L 669.850193 605.625789 -L 669.885739 627.721844 -L 669.95683 611.315944 -L 669.986452 598.64747 -L 670.051619 621.601954 -L 670.057543 618.700374 -L 670.140483 634.10796 -L 670.104938 611.760316 -L 670.170105 624.241781 -L 670.176029 626.545963 -L 670.223423 605.931538 -L 670.229348 608.176475 -L 670.276742 599.255334 -L 670.330061 613.24127 -L 670.484092 578.91843 -L 670.359682 615.822898 -L 670.495941 595.043986 -L 670.572956 604.773763 -L 670.537411 589.577654 -L 670.596654 595.050842 -L 670.620351 583.38917 -L 670.655896 609.482045 -L 670.691442 604.984594 -L 670.744761 609.914663 -L 670.703291 595.429724 -L 670.792155 606.124947 -L 670.839549 595.244808 -L 670.875095 611.847549 -L 670.881019 609.125914 -L 670.987657 629.390499 -L 670.934338 600.415073 -L 670.999505 623.93577 -L 671.100218 600.633763 -L 671.141688 607.66956 -L 671.224628 637.938217 -L 671.277947 635.767085 -L 671.343114 615.658949 -L 671.396433 620.170009 -L 671.402357 622.951878 -L 671.426054 602.408692 -L 671.473448 607.171379 -L 671.621556 576.734473 -L 671.633404 579.471387 -L 671.663026 586.935499 -L 671.686723 576.637655 -L 671.704496 580.307356 -L 671.716344 574.002116 -L 671.781511 587.552064 -L 671.822981 575.738285 -L 671.95924 628.207504 -L 671.846679 572.155933 -L 671.971089 617.382126 -L 672.059953 574.786242 -L 672.089574 592.112899 -L 672.136969 599.295494 -L 672.202136 593.714113 -L 672.20806 592.257495 -L 672.243606 606.302613 -L 672.255454 605.475601 -L 672.267303 610.412457 -L 672.279152 598.245444 -L 672.291 602.055049 -L 672.296924 591.903361 -L 672.379865 615.305319 -L 672.397637 605.572081 -L 672.41541 601.366156 -L 672.439107 613.900538 -L 672.450956 608.43153 -L 672.545745 623.694741 -L 672.49835 601.848001 -L 672.569442 622.781701 -L 672.682003 592.996348 -L 672.593139 630.406401 -L 672.687928 599.524219 -L 672.711625 616.188303 -L 672.759019 593.922898 -L 672.812338 610.763895 -L 672.83011 594.582655 -L 672.907126 620.934946 -L 672.913051 617.329152 -L 673.055233 600.413826 -L 672.960445 623.908704 -L 673.067082 605.766325 -L 673.102628 619.395544 -L 673.138174 605.455741 -L 673.179644 610.000039 -L 673.221114 599.13443 -L 673.256659 616.748614 -L 673.280356 614.127732 -L 673.286281 612.577121 -L 673.333675 626.411152 -L 673.351448 622.271084 -L 673.363296 629.29099 -L 673.428464 605.59632 -L 673.434388 609.212314 -L 673.517328 616.984792 -L 673.570647 584.435377 -L 673.748375 623.914029 -L 673.67136 584.000752 -L 673.79577 617.255653 -L 673.92018 604.298329 -L 673.83724 619.833707 -L 673.926104 610.816485 -L 673.937953 614.1503 -L 673.955725 599.740107 -L 673.991271 608.418186 -L 673.997195 598.710769 -L 674.032741 612.247277 -L 674.097908 611.128332 -L 674.21047 588.097977 -L 674.121605 618.306805 -L 674.25194 599.10405 -L 674.257864 608.919615 -L 674.323031 592.895211 -L 674.358577 596.236724 -L 674.364501 595.957119 -L 674.370426 596.930834 -L 674.394123 583.04943 -L 674.453366 605.731041 -L 674.477063 593.371059 -L 674.494836 590.961227 -L 674.607397 617.089885 -L 674.714034 642.951734 -L 674.725883 624.19115 -L 674.743656 616.297667 -L 674.796974 651.487245 -L 674.826596 630.279779 -L 674.909536 597.739175 -L 674.992476 612.614971 -L 675.028022 628.016395 -L 675.105037 624.240763 -L 675.152432 610.139833 -L 675.211675 623.773823 -L 675.259069 638.548912 -L 675.318312 619.849474 -L 675.324236 613.876493 -L 675.407176 637.982487 -L 675.496041 612.646705 -L 675.555283 624.551481 -L 675.614526 632.41476 -L 675.584905 611.961596 -L 675.644148 627.573517 -" clip-path="url(#p6a334ba20c)" style="fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square"/> + <path d="M 83.217386 600.989364 +L 83.235153 593.08913 +L 83.294376 603.226689 +L 83.32991 618.21273 +L 83.412822 610.782311 +L 83.466122 594.846741 +L 83.507578 614.448607 +L 83.525345 609.292034 +L 83.531268 609.21437 +L 83.631946 627.142946 +L 83.578646 609.026032 +L 83.655636 620.889671 +L 83.708936 623.549815 +L 83.679325 611.558183 +L 83.714858 620.757975 +L 83.827382 596.390678 +L 83.833304 604.686087 +L 83.892527 587.865419 +L 83.922138 613.38257 +L 83.939905 606.239429 +L 84.034662 582.108934 +L 83.969517 606.48985 +L 84.040584 583.350427 +L 84.058351 575.726857 +L 84.135341 594.135588 +L 84.141263 592.263651 +L 84.164952 592.062325 +L 84.170874 593.033988 +L 84.182719 602.395931 +L 84.23602 582.429569 +L 84.283398 598.137146 +L 84.360388 576.102005 +L 84.425533 589.653126 +L 84.591357 620.623613 +L 84.437377 587.485155 +L 84.603201 616.56173 +L 84.638735 594.243545 +L 84.715725 613.534529 +L 84.810481 632.567847 +L 84.851937 624.410298 +L 84.91116 605.351238 +L 84.982228 609.553863 +L 84.98815 612.080082 +L 85.041451 591.229347 +L 85.112518 581.837268 +L 85.136207 597.363897 +L 85.148052 590.888488 +L 85.225041 604.545445 +L 85.207275 588.178594 +L 85.266497 599.490495 +L 85.296109 605.835607 +L 85.384943 590.745456 +L 85.40271 599.952401 +L 85.444166 583.982927 +L 85.4797 581.730735 +L 85.515234 594.635174 +L 85.580379 594.220536 +L 85.639602 609.509571 +L 85.657368 602.960671 +L 85.692902 621.276071 +L 85.722514 612.680471 +L 85.734358 616.785302 +L 85.746203 601.721332 +L 85.81727 610.050984 +L 85.94756 565.042662 +L 85.97125 567.058333 +L 86.15484 603.536477 +L 86.196296 599.743518 +L 86.166685 607.322504 +L 86.208141 600.266627 +L 86.267364 597.054623 +L 86.326587 613.422963 +L 86.332509 613.405844 +L 86.391732 630.266641 +L 86.415421 612.533174 +L 86.421343 615.428713 +L 86.445033 602.16515 +L 86.527945 618.996217 +L 86.676002 580.366374 +L 86.681924 580.649959 +L 86.741147 576.42432 +L 86.72338 583.437874 +L 86.752991 583.313892 +L 86.924738 609.917712 +L 86.93066 604.392604 +L 86.989883 598.919889 +L 87.019494 608.053468 +L 87.072795 590.039533 +L 87.161629 623.861232 +L 87.297842 596.648715 +L 87.303764 596.592387 +L 87.309686 597.052097 +L 87.333375 613.429058 +L 87.428132 604.322239 +L 87.516966 583.806085 +L 87.558422 594.052042 +L 87.570267 611.036952 +L 87.635412 589.130554 +L 87.676868 607.560362 +L 87.801236 592.634144 +L 87.807158 595.200898 +L 87.860459 601.584476 +L 87.895993 591.437389 +L 87.907837 595.421958 +L 88.008516 590.703565 +L 87.955216 605.745312 +L 88.014438 595.176539 +L 88.04405 618.267902 +L 88.126962 600.656245 +L 88.132884 599.944408 +L 88.144729 604.23417 +L 88.150651 612.970974 +L 88.245408 594.853219 +L 88.25133 599.542741 +L 88.286864 617.457231 +L 88.352009 598.472455 +L 88.38162 587.888272 +L 88.440843 597.162485 +L 88.452688 615.84042 +L 88.517833 593.36499 +L 88.553366 605.442729 +L 88.654045 594.346284 +L 88.582978 612.776205 +L 88.66589 598.962377 +L 88.778413 633.365646 +L 88.79618 631.583553 +L 88.967927 605.815652 +L 88.979771 614.64642 +L 89.08045 635.067274 +L 89.033072 608.090079 +L 89.098217 623.735281 +L 89.175207 597.414896 +L 89.264041 602.729294 +L 89.36472 618.653341 +L 89.388409 612.89158 +L 89.41802 599.648222 +L 89.441709 613.001899 +L 89.49501 608.128634 +L 89.548311 625.389393 +L 89.512777 606.761415 +L 89.595689 615.671339 +L 89.720057 583.963792 +L 89.83258 607.356969 +L 89.844425 599.430308 +L 89.903648 588.605101 +L 89.927337 604.023771 +L 89.933259 603.832413 +L 89.956948 608.859235 +L 90.016171 593.802918 +L 90.03986 601.179689 +L 90.093161 585.597321 +L 90.122772 605.609048 +L 90.158306 621.527001 +L 90.199762 589.512858 +L 90.217529 594.496043 +L 90.330052 568.534214 +L 90.341897 575.244008 +L 90.389275 604.101347 +L 90.353742 575.01398 +L 90.466265 591.867288 +L 90.513643 571.059047 +L 90.572866 595.276562 +L 90.590633 602.540205 +L 90.667623 589.914008 +L 90.679467 594.785087 +L 90.833447 570.675952 +L 90.957815 598.131782 +L 90.969659 589.302461 +L 90.999271 579.167726 +L 91.017038 592.83062 +L 91.070338 589.662679 +L 91.141406 594.367882 +L 91.105872 586.740086 +L 91.165095 587.296874 +L 91.23024 573.10275 +L 91.271696 596.182282 +L 91.283541 594.633549 +L 91.354608 594.208575 +L 91.407909 622.698477 +L 91.490821 627.121549 +L 91.502665 617.615819 +L 91.591499 595.524121 +L 91.550043 617.956005 +L 91.627033 605.390101 +L 91.668489 616.45042 +L 91.733634 601.917348 +L 91.840236 597.697485 +L 91.804702 615.168594 +L 91.846158 598.446757 +L 91.887614 613.598189 +L 91.934992 587.539968 +L 91.952759 592.372393 +L 92.05936 621.293067 +L 92.071205 609.498556 +L 92.195573 587.37985 +L 92.207417 594.103158 +L 92.21334 598.260486 +L 92.225184 581.048098 +L 92.296252 582.526549 +L 92.302174 582.488072 +L 92.379164 612.884823 +L 92.432464 604.592455 +L 92.515376 590.071127 +L 92.456153 605.041557 +L 92.55091 596.430358 +L 92.722656 620.689668 +L 92.562754 594.02407 +L 92.734501 614.271658 +L 92.764112 605.285627 +L 92.781879 616.101998 +L 92.847024 609.526591 +L 92.852946 609.715555 +L 92.912169 588.846702 +L 92.959548 608.30296 +L 92.971392 609.424159 +L 92.983237 603.961784 +L 92.989159 605.569001 +L 93.036537 588.672886 +L 93.072071 611.749987 +L 93.089838 607.739468 +L 93.113527 614.064697 +L 93.143139 603.55479 +L 93.196439 605.656899 +L 93.297118 624.140976 +L 93.220128 600.369185 +L 93.326729 615.356032 +L 93.45702 581.113316 +L 93.474787 583.162895 +L 93.551776 600.15241 +L 93.593232 591.306634 +L 93.616921 590.114691 +L 93.622844 595.547961 +L 93.628766 599.631146 +L 93.6643 583.366715 +L 93.711678 587.654565 +L 93.723523 574.800855 +L 93.79459 602.60348 +L 93.812357 595.987699 +L 93.918958 617.261705 +L 93.954492 613.68009 +L 94.173616 570.381001 +L 94.297984 588.465322 +L 94.303907 585.279432 +L 94.309829 582.17717 +L 94.380896 601.428402 +L 94.392741 592.327506 +L 94.481575 603.224075 +L 94.505264 597.025642 +L 94.552643 603.027126 +L 94.694778 570.010754 +L 94.813223 600.834723 +L 94.825068 594.699395 +L 94.955358 577.8028 +L 94.90798 595.09444 +L 94.96128 581.875023 +L 95.109338 622.227152 +L 95.156716 615.824653 +L 95.358074 583.361961 +L 95.387685 591.086698 +L 95.405452 596.013693 +L 95.440986 576.052883 +L 95.470597 580.438718 +L 95.494286 572.351344 +L 95.517975 584.454935 +L 95.547587 583.530295 +L 95.60681 610.884721 +L 95.677877 602.609685 +L 95.707489 613.047691 +L 95.748945 596.770798 +L 95.760789 599.487026 +L 95.772634 587.222276 +L 95.825934 608.22231 +L 95.843701 620.923704 +L 95.914769 583.128472 +L 95.932535 590.190367 +L 95.973991 577.438915 +L 96.027292 583.797574 +L 96.045059 579.913145 +L 96.092437 603.200178 +L 96.110204 609.205087 +L 96.139815 598.172521 +L 96.15166 598.833726 +L 96.264184 582.159092 +L 96.270106 584.212187 +L 96.293795 588.593552 +L 96.406318 559.591186 +L 96.495153 606.506015 +L 96.542531 588.939398 +L 96.548453 583.563307 +L 96.613598 602.645739 +L 96.64321 592.654293 +L 96.655054 597.110279 +L 96.690588 582.683016 +L 96.69651 579.940379 +L 96.726122 600.808989 +L 96.779422 590.151439 +L 96.915635 617.699707 +L 96.92748 612.576143 +L 97.05777 590.69864 +L 96.951169 623.399025 +L 97.063692 591.186047 +L 97.13476 621.142955 +L 97.170293 598.144917 +L 97.199905 582.234717 +L 97.229516 599.4436 +L 97.282817 594.544052 +L 97.288739 594.229307 +L 97.318351 614.554983 +L 97.407185 608.031201 +L 97.543397 627.059387 +L 97.561164 614.782975 +L 97.596698 599.134019 +L 97.626309 620.172309 +L 97.67961 605.881039 +L 97.685532 610.205057 +L 97.750677 598.423019 +L 97.786211 606.058283 +L 97.839512 583.262894 +L 97.880968 611.076394 +L 97.892812 610.656505 +L 98.034947 575.809353 +L 98.046792 580.42042 +L 98.183004 605.037501 +L 98.111937 576.565476 +L 98.194849 600.299901 +L 98.200771 599.598553 +L 98.218538 610.566685 +L 98.230383 612.866813 +L 98.248149 605.282864 +L 98.307372 585.643098 +L 98.37844 596.170679 +L 98.419896 605.894959 +L 98.473196 591.569181 +L 98.485041 594.668729 +L 98.502808 590.635183 +L 98.544264 610.00718 +L 98.591642 627.3482 +L 98.650865 612.660935 +L 98.727855 589.525119 +L 98.757466 607.20581 +L 98.881834 625.978571 +L 98.917368 603.246222 +L 99.00028 615.328088 +L 99.047658 631.711033 +L 99.089114 613.558938 +L 99.112803 616.884796 +L 99.124648 615.548563 +L 99.13057 611.676258 +L 99.20756 633.035827 +L 99.213482 628.538008 +L 99.243094 638.514738 +L 99.296394 614.862048 +L 99.308239 618.483254 +L 99.326006 618.607008 +L 99.343772 609.210683 +L 99.379306 609.498525 +L 99.468141 592.299591 +L 99.580664 605.728384 +L 99.503674 576.541751 +L 99.586586 599.919447 +L 99.598431 593.057682 +L 99.657654 607.886111 +L 99.693187 601.01277 +L 99.734643 588.426791 +L 99.764255 589.370067 +L 99.847167 581.117313 +L 99.805711 601.906031 +L 99.876778 585.074632 +L 99.930079 580.993012 +L 99.995224 597.566331 +L 100.060369 586.915217 +L 100.095903 598.79173 +L 100.101825 597.538305 +L 100.143281 605.038142 +L 100.220271 602.157821 +L 100.226193 602.088568 +L 100.356483 562.31851 +L 100.380173 578.004608 +L 100.421629 584.044636 +L 100.469007 563.526564 +L 100.474929 562.475694 +L 100.486774 571.161581 +L 100.492696 570.810479 +L 100.540074 607.165646 +L 100.611142 590.239434 +L 100.617064 589.377789 +L 100.640753 598.563752 +L 100.676287 594.525851 +L 100.78881 630.081888 +L 100.694054 591.192841 +L 100.824344 628.238965 +L 100.948712 604.805402 +L 100.8658 635.976395 +L 100.960557 606.840708 +L 101.013857 620.120144 +L 101.061236 602.129826 +L 101.067158 601.980526 +L 101.179681 591.329856 +L 101.114536 614.281547 +L 101.191526 593.331601 +L 101.197448 593.117892 +L 101.20337 593.13849 +L 101.244826 611.293797 +L 101.304049 594.526052 +L 101.333661 585.543118 +L 101.404728 600.574944 +L 101.41065 596.468475 +L 101.428417 593.384964 +L 101.481718 605.343713 +L 101.499485 599.001592 +L 101.505407 602.380394 +L 101.582397 588.615062 +L 101.600164 596.284587 +L 101.647542 584.550669 +L 101.671231 598.907091 +L 101.706765 595.831654 +L 101.712687 595.837415 +L 101.742299 585.387597 +L 101.760065 577.487413 +L 101.789677 590.945319 +L 101.8489 583.45332 +L 101.866667 593.537435 +L 101.943656 568.275077 +L 101.949579 566.59882 +L 101.996957 582.986992 +L 102.008801 580.906824 +L 102.020646 581.640492 +L 102.032491 576.675396 +L 102.05618 591.646162 +L 102.127247 584.61573 +L 102.18647 605.938343 +L 102.233848 587.126486 +L 102.245693 579.590752 +L 102.328605 600.614682 +L 102.447051 632.786271 +L 102.476662 621.833505 +L 102.512196 599.255066 +L 102.577341 622.507928 +L 102.606952 612.940811 +L 102.654331 618.216665 +L 102.67802 601.970703 +L 102.707631 611.197224 +L 102.725398 602.413 +L 102.772776 623.6573 +L 102.796466 615.060362 +L 102.908989 629.640482 +L 102.820155 604.452574 +L 102.920834 624.807779 +L 102.96229 603.764747 +L 103.027435 619.85492 +L 103.122191 631.950436 +L 103.051124 616.391012 +L 103.139958 627.640402 +L 103.288015 584.081525 +L 103.29986 584.46957 +L 103.424228 606.311091 +L 103.536751 579.815544 +L 103.542674 589.258361 +L 103.548596 593.49013 +L 103.613741 573.887319 +L 103.631508 579.338874 +L 103.649275 574.390236 +L 103.696653 599.517514 +L 103.702575 598.222114 +L 103.797332 627.468285 +L 103.838788 612.194829 +L 103.868399 596.64983 +L 103.963156 601.112836 +L 104.004612 579.643367 +L 104.081602 592.864327 +L 104.164514 641.258835 +L 104.211892 618.611739 +L 104.265193 606.128946 +L 104.241503 621.490382 +L 104.306649 620.040903 +L 104.330338 628.551723 +L 104.401405 608.741214 +L 104.454706 596.407168 +L 104.508006 608.649125 +L 104.525773 615.493557 +L 104.596841 588.824328 +L 104.602763 582.483998 +L 104.679753 604.975558 +L 104.691597 602.813264 +L 104.804121 629.602107 +L 104.733053 600.858874 +L 104.857421 618.706193 +L 104.964022 591.180824 +L 104.981789 608.06822 +L 104.987712 609.626026 +L 105.011401 599.820724 +L 105.064701 606.167563 +L 105.082468 594.699254 +L 105.171302 609.195453 +L 105.177225 609.348284 +L 105.29567 587.027274 +L 105.301593 587.10106 +L 105.325282 581.107731 +L 105.354893 604.894906 +L 105.360816 607.644444 +L 105.414116 595.04264 +L 105.455572 604.158528 +L 105.52664 600.307216 +L 105.50295 609.488216 +L 105.562173 605.10071 +L 105.574018 609.094647 +L 105.609552 591.061579 +L 105.639163 596.544622 +L 105.73392 583.093848 +L 105.668774 596.614001 +L 105.751686 594.220907 +L 105.775376 582.834495 +L 105.810909 597.964404 +L 105.86421 590.677762 +L 105.929355 588.180729 +L 105.9945 617.987718 +L 106.095179 631.30276 +L 106.059645 617.565174 +L 106.112946 626.761923 +L 106.225469 607.491116 +L 106.178091 636.817377 +L 106.231392 609.840075 +L 106.337993 594.86131 +L 106.290615 620.557931 +L 106.343915 603.610682 +L 106.349837 603.515055 +L 106.480128 578.211732 +L 106.385371 604.958572 +L 106.48605 585.46983 +L 106.491972 585.383288 +L 106.61634 600.508442 +L 106.557117 577.83588 +L 106.640029 599.717799 +L 106.645952 598.789104 +L 106.669641 609.965337 +L 106.681485 609.232982 +L 106.717019 617.371362 +L 106.740708 606.662993 +L 106.788087 608.307965 +L 106.90061 601.13959 +L 106.847309 618.010416 +L 106.906532 604.03284 +L 106.965755 586.540489 +L 107.036823 593.356825 +L 107.042745 594.065266 +L 107.060512 587.282007 +L 107.125657 565.598659 +L 107.167113 588.351986 +L 107.327015 567.911289 +L 107.338859 575.40048 +L 107.356626 586.427892 +L 107.427694 583.525443 +L 107.480994 603.701244 +L 107.605362 591.571414 +L 107.516528 607.977812 +L 107.611284 593.826101 +L 107.629051 605.500977 +L 107.706041 579.830587 +L 107.711963 586.383269 +L 107.723808 581.802036 +L 107.783031 597.998052 +L 107.800798 605.626729 +L 107.877787 593.51358 +L 107.88371 594.723318 +L 107.984388 576.828856 +L 107.948855 596.686145 +L 108.002155 589.740716 +L 108.061378 606.107401 +L 108.114679 593.534308 +L 108.120601 593.218975 +L 108.126523 597.845969 +L 108.156135 608.680729 +L 108.203513 582.664247 +L 108.239047 601.676163 +L 108.310114 573.826672 +L 108.363415 583.009455 +L 108.42856 606.620759 +L 108.481861 587.213765 +L 108.594384 611.265775 +L 108.629918 603.256737 +L 108.677296 586.701568 +L 108.730597 600.911842 +L 108.84312 620.059104 +L 108.854965 615.882043 +L 108.92011 597.580966 +L 108.866809 617.856194 +L 108.967488 609.001266 +L 109.020789 615.967413 +L 109.044478 595.765596 +L 109.056322 600.197516 +L 109.145157 592.024828 +L 109.103701 607.647945 +L 109.174768 594.810246 +L 109.18069 594.306989 +L 109.186613 601.953919 +L 109.192535 604.254925 +L 109.222146 581.184419 +L 109.233991 572.164641 +L 109.281369 594.055025 +L 109.328748 586.018935 +L 109.38797 601.873259 +L 109.417582 579.886893 +L 109.423504 581.041851 +L 109.429426 578.552164 +L 109.476805 594.856118 +L 109.494572 591.84014 +L 109.500494 597.172858 +L 109.589328 579.35565 +L 109.59525 583.408098 +L 109.601173 580.935222 +L 109.67224 592.471527 +L 109.690007 588.545572 +L 109.737385 602.219267 +L 109.719618 587.620896 +L 109.808453 595.939505 +L 109.820297 592.776989 +L 109.838064 609.082799 +L 109.861753 616.799169 +L 109.897287 600.632233 +L 109.938743 604.020789 +L 110.057189 585.749509 +L 110.169712 604.838576 +L 110.175634 595.74439 +L 110.193401 593.428699 +L 110.205246 606.80772 +L 110.252624 595.678746 +L 110.29408 610.737265 +L 110.365148 606.631141 +L 110.430293 615.645228 +L 110.394759 601.075456 +L 110.483593 615.1818 +L 110.554661 584.762711 +L 110.619806 597.444655 +L 110.631651 605.126896 +L 110.726407 592.79782 +L 110.821164 625.001162 +L 110.86262 618.747395 +L 110.939609 581.769398 +L 111.004755 592.087989 +L 111.087667 601.524066 +L 111.040288 589.571398 +L 111.117278 594.15332 +L 111.217957 602.548508 +L 111.223879 592.284236 +L 111.271257 588.420096 +L 111.306791 595.513385 +L 111.324558 592.677458 +L 111.377859 604.967689 +L 111.35417 584.923874 +L 111.443004 599.162584 +L 111.490382 605.030951 +L 111.579216 581.92301 +L 111.61475 594.586496 +L 111.679895 577.313153 +L 111.685818 579.737619 +L 111.733196 567.472949 +L 111.762807 584.460068 +L 111.780574 582.229605 +L 111.863486 598.578842 +L 111.804263 578.438998 +L 111.910864 588.47902 +L 111.940476 577.683225 +L 111.970087 593.737042 +L 112.011543 585.847951 +L 112.064844 610.852061 +L 112.129989 603.351542 +L 112.260279 587.469858 +L 112.177367 604.914932 +L 112.266202 592.224542 +L 112.31358 603.985246 +L 112.355036 586.923032 +L 112.39057 596.581374 +L 112.467559 580.403349 +L 112.503093 585.582092 +L 112.485326 576.864955 +L 112.580083 583.027987 +L 112.59785 574.792253 +L 112.633383 590.389862 +L 112.65115 578.328858 +L 112.674839 596.852254 +L 112.769596 595.940236 +L 112.787363 585.163121 +L 112.864353 605.497585 +L 112.876197 597.10519 +L 112.911731 611.52792 +L 112.988721 606.396438 +L 113.077555 593.200818 +L 113.113089 597.114416 +L 113.237457 622.578906 +L 113.261146 606.592535 +L 113.391436 570.754398 +L 113.320369 613.605204 +L 113.403281 578.22694 +L 113.474348 600.683853 +L 113.521726 591.517722 +L 113.575027 580.06274 +L 113.598716 593.210307 +L 113.628328 585.668404 +L 113.729006 603.173066 +L 113.740851 597.874091 +L 113.805996 585.031168 +L 113.823763 599.476287 +L 113.859297 590.42301 +L 113.936286 618.42149 +L 113.977742 603.944176 +L 113.989587 590.392161 +L 114.072499 611.931649 +L 114.119877 628.222939 +L 114.161333 608.488186 +L 114.25609 598.287677 +L 114.196867 618.585104 +L 114.279779 603.153965 +L 114.291624 602.711668 +L 114.303468 611.927573 +L 114.356769 631.590662 +L 114.415992 615.715443 +L 114.528515 600.103293 +L 114.439681 621.022905 +L 114.534437 606.549889 +L 114.59366 592.362985 +L 114.629194 598.538585 +L 114.67065 622.237747 +L 114.741717 605.454406 +L 114.74764 606.332992 +L 114.783173 600.01539 +L 114.789096 594.421551 +L 114.842396 616.987836 +L 114.87793 614.573225 +L 114.883852 614.545547 +L 114.996376 591.878975 +L 114.913464 615.328214 +L 115.031909 598.727883 +L 115.108899 607.052419 +L 115.08521 589.51 +L 115.132588 599.395934 +L 115.144433 596.168599 +L 115.174044 616.376583 +L 115.2155 609.916437 +L 115.221423 612.471082 +L 115.268801 595.704154 +L 115.286568 596.273042 +L 115.339868 576.198537 +L 115.410936 576.251814 +L 115.416858 575.688663 +L 115.428703 581.063261 +L 115.476081 603.598048 +L 115.529381 575.823287 +L 115.582682 574.959821 +L 115.606371 584.175119 +L 115.695206 600.38435 +L 115.63006 583.394282 +L 115.724817 590.509581 +L 115.760351 596.942049 +L 115.795884 582.785408 +L 115.807729 586.119821 +L 115.884719 572.179877 +L 115.920252 585.839507 +L 116.062387 616.251015 +L 116.06831 615.753291 +L 116.157144 610.570628 +L 116.086076 621.915913 +L 116.180833 613.635955 +L 116.186755 616.308975 +L 116.263745 601.599565 +L 116.287434 606.663243 +L 116.334812 596.00378 +L 116.370346 603.342015 +L 116.500636 580.09215 +L 116.429569 605.391556 +L 116.506559 580.240034 +L 116.524326 588.703567 +L 116.565782 575.979785 +L 116.571704 569.039877 +L 116.648694 593.71738 +L 116.660538 591.594881 +L 116.684227 611.044049 +L 116.737528 590.516737 +L 116.767139 592.930278 +L 116.796751 577.111941 +L 116.885585 581.231878 +L 116.968497 594.452745 +L 116.986264 581.170327 +L 117.015875 588.47258 +L 117.110632 574.716269 +L 117.02772 588.916492 +L 117.134321 581.898958 +L 117.15801 598.17978 +L 117.252767 597.070617 +L 117.317912 583.952768 +L 117.288301 598.039805 +L 117.359368 594.513846 +L 117.436358 592.900962 +L 117.483736 609.910944 +L 117.489658 611.543431 +L 117.542959 602.263087 +L 117.578493 605.839064 +L 117.661405 592.219459 +L 117.685094 607.581574 +L 117.696938 612.084575 +L 117.744317 586.268756 +L 117.762083 594.404363 +L 117.791695 587.101219 +L 117.821306 610.27354 +L 117.833151 609.246955 +L 117.951597 643.346089 +L 117.998975 623.421156 +L 118.075965 604.931906 +L 118.01082 624.182154 +L 118.123343 612.496454 +L 118.129265 617.744634 +L 118.206255 591.506732 +L 118.224022 588.760994 +L 118.283245 572.04323 +L 118.253633 589.247926 +L 118.342468 584.851361 +L 118.407613 595.305166 +L 118.389846 582.810484 +L 118.437224 584.739734 +L 118.443146 575.723686 +L 118.490525 595.046605 +L 118.549748 582.46907 +L 118.603048 605.786558 +L 118.674116 593.183231 +L 118.68596 573.963026 +L 118.780717 595.956433 +L 118.916929 579.365863 +L 118.798484 602.300235 +L 118.922852 579.660051 +L 118.964308 594.02239 +L 119.04722 593.924382 +L 119.059064 586.16984 +L 119.10052 601.501389 +L 119.153821 590.632342 +L 119.230811 610.754514 +L 119.260422 591.035669 +L 119.266344 589.727155 +L 119.301878 604.056757 +L 119.331489 596.512821 +L 119.355179 615.95248 +L 119.402557 593.601823 +L 119.449935 606.613915 +L 119.455857 604.935088 +L 119.51508 619.013635 +L 119.521003 616.759856 +L 119.526925 617.795462 +L 119.550614 604.475349 +L 119.692749 582.080653 +L 119.633526 610.770552 +L 119.698671 584.140243 +L 119.811195 602.188339 +L 119.751972 581.015705 +L 119.817117 600.461379 +L 119.823039 600.77366 +L 119.834884 597.046182 +L 119.870417 578.892597 +L 119.923718 603.652054 +L 119.935563 595.958006 +L 120.030319 606.619697 +L 120.000708 592.472426 +L 120.048086 606.304043 +L 120.08362 616.691816 +L 120.184299 579.153579 +L 120.314589 597.20103 +L 120.243522 569.190132 +L 120.326434 592.791599 +L 120.433035 579.247271 +L 120.385656 595.974462 +L 120.444879 579.824066 +L 120.545558 620.824305 +L 120.569247 599.608101 +L 120.634392 579.642449 +L 120.687693 591.065137 +L 120.746916 603.646738 +L 120.78245 584.478883 +L 120.794294 585.064393 +L 120.823906 575.787486 +L 120.871284 597.168 +L 120.900895 588.058794 +L 121.066719 603.010951 +L 120.96604 586.094386 +L 121.072642 595.052162 +L 121.102253 590.814115 +L 121.137787 603.293962 +L 121.25031 616.842482 +L 121.202932 596.307517 +L 121.256233 611.195989 +L 121.262155 605.582346 +L 121.297689 623.319666 +L 121.362834 615.029168 +L 121.368756 617.005767 +L 121.427979 603.733704 +L 121.445746 612.427934 +L 121.493124 587.195652 +L 121.540502 615.586458 +L 121.552347 614.016956 +L 121.641181 634.897632 +L 121.676715 632.738995 +L 121.759627 603.128596 +L 121.807005 614.081499 +L 121.812927 615.631041 +L 121.830694 599.615327 +L 121.866228 602.403301 +L 121.878073 597.397229 +L 121.925451 611.192979 +L 121.955062 610.181332 +L 122.032052 622.52241 +L 122.014285 609.75718 +L 122.067586 616.804037 +L 122.215643 582.847485 +L 122.085353 618.711376 +L 122.23341 589.491845 +L 122.369622 610.819213 +L 122.44069 618.895348 +L 122.51768 598.531488 +L 122.588747 607.993114 +L 122.553213 587.990302 +L 122.642048 603.487733 +L 122.719037 580.553976 +L 122.754571 593.720229 +L 122.819716 621.794733 +L 122.920395 614.718751 +L 123.056608 594.235815 +L 123.151364 615.048488 +L 123.180976 606.139686 +L 123.234276 612.514933 +L 123.210587 601.261391 +L 123.281655 604.917592 +L 123.293499 591.08389 +L 123.340877 611.815905 +L 123.388256 609.798044 +L 123.483012 624.041367 +L 123.406023 609.45645 +L 123.506701 615.456907 +L 123.601458 584.616309 +L 123.642914 592.02623 +L 123.660681 588.800754 +L 123.755437 602.494095 +L 123.790971 589.31824 +L 123.838349 612.47827 +L 123.856116 611.297908 +L 123.986407 627.658531 +L 123.915339 610.749377 +L 123.992329 623.948928 +L 124.081163 631.080811 +L 124.010096 619.532002 +L 124.110775 627.744025 +L 124.193687 591.154616 +L 124.246987 611.735155 +L 124.353588 617.35872 +L 124.318055 604.166235 +L 124.359511 613.121345 +L 124.371355 614.533278 +L 124.395044 605.783431 +L 124.454267 598.110128 +L 124.412811 614.772825 +L 124.495723 608.433453 +L 124.566791 600.156461 +L 124.608247 617.317172 +L 124.66747 586.584931 +L 124.779993 600.31572 +L 124.85106 617.118299 +L 124.791838 599.896921 +L 124.892516 601.605616 +L 124.957662 584.545858 +L 124.916206 602.187241 +L 124.999118 596.650318 +L 125.00504 600.673183 +L 125.076107 577.039762 +L 125.087952 573.4332 +L 125.117563 594.521822 +L 125.230087 605.207597 +L 125.159019 592.579895 +L 125.236009 598.624761 +L 125.253776 596.869921 +L 125.259698 602.441008 +L 125.360377 616.780627 +L 125.307076 598.858405 +L 125.384066 614.542527 +L 125.413678 600.913911 +L 125.472901 618.110091 +L 125.490667 614.870398 +L 125.532123 621.458702 +L 125.561735 611.115824 +L 125.668336 583.591249 +L 125.680181 594.836805 +L 125.733481 602.272088 +L 125.763093 584.108318 +L 125.774937 580.626789 +L 125.780859 584.743914 +L 125.893383 625.167586 +L 125.91115 623.852525 +L 126.082896 590.584405 +L 126.11843 605.383403 +L 126.225031 628.326705 +L 126.242798 617.228088 +L 126.272409 604.418225 +L 126.319787 629.950976 +L 126.37901 638.537229 +L 126.408622 625.40948 +L 126.527068 598.307821 +L 126.444155 626.185279 +L 126.556679 606.450561 +L 126.598135 626.153973 +L 126.681047 619.965142 +L 126.686969 620.35458 +L 126.692892 617.445779 +L 126.698814 618.262108 +L 126.710658 601.66861 +L 126.752114 627.485826 +L 126.811337 607.918378 +L 126.835026 614.980248 +L 126.900172 602.143423 +L 126.906094 601.800947 +L 126.923861 612.424217 +L 127.006773 594.535225 +L 127.018617 604.305268 +L 127.036384 608.766812 +L 127.089685 583.886182 +L 127.101529 593.269168 +L 127.148908 569.672739 +L 127.190364 594.340938 +L 127.214053 591.312885 +L 127.28512 603.249589 +L 127.243664 583.680471 +L 127.326576 595.210731 +L 127.385799 576.329547 +L 127.338421 601.401788 +L 127.450944 583.847701 +L 127.498322 575.449691 +L 127.575312 599.057664 +L 127.604924 587.477067 +L 127.640457 608.027136 +L 127.687836 623.920841 +L 127.711525 605.621862 +L 127.758903 614.991367 +L 127.818126 579.580563 +L 127.877349 605.3896 +L 127.901038 622.526351 +L 127.978028 600.771118 +L 128.013561 594.733911 +L 128.066862 603.309196 +L 128.078707 598.585731 +L 128.132007 622.799367 +L 128.19123 608.709057 +L 128.297831 597.873582 +L 128.250453 620.631695 +L 128.309676 601.338553 +L 128.333365 621.882138 +L 128.380743 600.057645 +L 128.422199 608.661043 +L 128.534723 588.897661 +L 128.546567 592.888501 +L 128.552489 595.086056 +L 128.588023 577.047996 +L 128.599868 577.250293 +L 128.647246 569.062525 +L 128.68278 585.095037 +L 128.700547 578.739969 +L 128.718314 582.443294 +L 128.730158 567.012123 +L 128.789381 570.181989 +L 128.795303 569.293727 +L 128.818992 580.560751 +L 128.830837 579.779938 +L 128.919671 577.953472 +L 128.996661 610.395835 +L 129.002583 608.249505 +L 129.049962 624.942669 +L 129.067728 620.211832 +L 129.073651 623.760315 +L 129.09734 612.485031 +L 129.168407 616.099747 +L 129.215786 596.953974 +L 129.286853 608.14897 +L 129.375687 615.704398 +L 129.316464 603.528141 +L 129.387532 607.184479 +L 129.500055 592.461644 +L 129.535589 603.477166 +L 129.571123 583.226625 +L 129.606656 589.010275 +L 129.612579 576.328897 +L 129.671802 592.03773 +L 129.713258 583.752397 +L 129.802092 618.611903 +L 129.84947 605.913097 +L 129.873159 597.23448 +L 129.896849 608.077812 +L 129.961994 604.178275 +L 129.985683 600.18006 +L 130.015294 609.668885 +L 130.062673 622.966154 +L 130.139662 616.884655 +L 130.157429 608.216815 +L 130.204807 624.506913 +L 130.246263 617.419164 +L 130.258108 621.152825 +L 130.329175 613.566152 +L 130.352865 618.349584 +L 130.441699 598.011379 +L 130.506844 604.657591 +L 130.518689 611.693885 +L 130.566067 583.408419 +L 130.607523 598.675854 +L 130.791114 633.862021 +L 130.62529 590.545122 +L 130.820725 630.067912 +L 130.868104 632.381572 +L 130.879948 625.393025 +L 130.998394 598.605771 +L 131.087228 602.438711 +L 131.09315 602.534616 +L 131.164218 611.985423 +L 131.122762 598.411319 +L 131.205674 606.900287 +L 131.241208 612.920823 +L 131.270819 604.129304 +L 131.294508 606.176856 +L 131.341886 596.766684 +L 131.389265 609.738893 +L 131.442565 621.395963 +L 131.495866 614.740767 +L 131.632078 590.209393 +L 131.679457 585.582902 +L 131.815669 646.352854 +L 131.821592 647.810272 +L 131.863048 630.901398 +L 131.993338 611.190587 +L 131.928193 634.222011 +L 131.99926 612.914967 +L 132.070328 624.542202 +L 132.046639 604.961999 +L 132.123628 623.220611 +L 132.224307 608.196282 +L 132.182851 624.434276 +L 132.236152 613.856965 +L 132.242074 617.296414 +L 132.324986 607.460367 +L 132.336831 613.598205 +L 132.342753 608.747105 +L 132.36052 624.365911 +L 132.443432 615.558733 +L 132.467121 612.781668 +L 132.502655 625.535216 +L 132.532266 622.809125 +L 132.538188 622.91001 +L 132.544111 621.924003 +L 132.680323 590.066924 +L 132.686245 595.908265 +L 132.739546 579.208709 +L 132.763235 601.762035 +L 132.804691 587.52559 +L 132.82838 593.61497 +L 132.852069 579.196593 +L 132.923137 570.5536 +L 132.946826 585.287354 +L 132.952748 581.552907 +L 133.041583 602.594393 +L 133.065272 594.391259 +L 133.071194 590.811265 +L 133.11265 602.36001 +L 133.165951 594.669383 +L 133.201484 613.556312 +L 133.260707 585.229941 +L 133.26663 588.434447 +L 133.302163 573.05149 +L 133.367308 593.528063 +L 133.385075 599.578455 +L 133.45022 580.710582 +L 133.456143 575.666318 +L 133.533132 601.30381 +L 133.544977 588.495557 +L 133.562744 593.945416 +L 133.627889 578.80417 +L 133.645656 583.532409 +L 133.651578 583.131237 +L 133.6575 586.264356 +L 133.663423 583.784678 +L 133.669345 591.460074 +L 133.73449 571.733591 +L 133.770024 584.011151 +L 133.793713 577.109113 +L 133.805558 568.705186 +L 133.86478 595.353579 +L 133.894392 587.29231 +L 133.924003 575.953893 +L 133.983226 593.077423 +L 133.989148 591.914485 +L 134.030604 604.259754 +L 134.077983 591.556257 +L 134.107594 600.77434 +L 134.14905 593.604576 +L 134.196429 606.386938 +L 134.220118 596.148236 +L 134.237885 602.58568 +L 134.261574 588.159481 +L 134.320797 592.382676 +L 134.374097 575.931162 +L 134.415553 594.790268 +L 134.421475 594.523923 +L 134.480698 616.913296 +L 134.522154 593.624327 +L 134.528077 596.365407 +L 134.533999 592.150141 +L 134.575455 612.571742 +L 134.628755 598.454911 +L 134.634678 602.95363 +L 134.705745 581.797756 +L 134.711667 583.490379 +L 134.776813 574.330644 +L 134.800502 589.844497 +L 134.812346 589.416876 +L 134.818269 590.980234 +L 134.859725 572.621538 +L 134.895258 583.294803 +L 134.901181 583.116294 +L 134.913025 575.84732 +L 134.984093 607.048496 +L 134.990015 602.036099 +L 135.001859 603.106946 +L 135.108461 589.04404 +L 135.191373 608.892437 +L 135.226906 602.61636 +L 135.268362 610.147035 +L 135.351274 589.036367 +L 135.481565 620.305158 +L 135.487487 618.29049 +L 135.540788 599.923951 +L 135.588166 612.252007 +L 135.60001 622.217686 +L 135.677 594.507912 +L 135.688845 598.847197 +L 135.783601 609.899084 +L 135.75399 598.049498 +L 135.80729 603.229588 +L 135.825057 589.63135 +L 135.919814 602.291578 +L 135.979037 585.017198 +L 135.937581 605.520574 +L 136.03826 595.370142 +L 136.09156 620.427047 +L 136.150783 606.921691 +L 136.251462 600.53981 +L 136.198161 615.941373 +L 136.257384 602.029098 +L 136.363985 626.169515 +L 136.381752 614.829713 +L 136.435053 606.200132 +L 136.50612 610.450225 +L 136.529809 616.690502 +L 136.594955 601.600268 +L 136.600877 602.225987 +L 136.689711 597.509494 +L 136.648255 608.880568 +L 136.707478 598.273906 +L 136.719323 602.743649 +L 136.796312 590.03695 +L 136.808157 581.650633 +L 136.885147 599.811854 +L 136.908836 584.123775 +L 136.932525 602.171893 +L 137.033204 600.248013 +L 137.068737 602.137379 +L 137.187183 584.456754 +L 137.293784 611.147047 +L 137.222717 579.614774 +L 137.329318 609.280085 +L 137.353007 616.437462 +L 137.459608 593.149766 +L 137.465531 597.875714 +L 137.548443 581.821872 +L 137.572132 571.753304 +L 137.631355 603.82935 +L 137.637277 600.939559 +L 137.672811 593.067481 +L 137.714267 610.045404 +L 137.755723 601.38535 +L 137.862324 626.679568 +L 138.03407 597.365894 +L 138.057759 605.80496 +L 138.093293 613.663736 +L 138.140671 597.574211 +L 138.146594 600.688156 +L 138.170283 592.259912 +L 138.199894 607.84271 +L 138.235428 603.571566 +L 138.24135 606.415171 +L 138.306495 591.731491 +L 138.312418 592.888171 +L 138.31834 586.574264 +L 138.359796 606.598563 +L 138.413097 599.428589 +L 138.513775 582.580513 +L 138.442708 604.949459 +L 138.52562 585.393827 +L 138.531542 578.180576 +L 138.620377 600.681343 +L 138.709211 616.496233 +L 138.7329 602.610417 +L 138.762511 593.690917 +L 138.851346 607.776383 +L 138.857268 598.751903 +L 138.946102 621.407873 +L 138.952025 620.680315 +L 138.963869 624.027194 +L 139.011247 612.548178 +L 139.023092 606.737593 +L 139.106004 618.30415 +L 139.117849 611.927094 +L 139.141538 617.319766 +L 139.159305 598.132207 +L 139.206683 585.686964 +L 139.236294 603.694587 +L 139.259983 603.259916 +L 139.27775 606.867107 +L 139.325129 596.091033 +L 139.35474 600.412325 +L 139.449497 592.784046 +L 139.396196 614.025232 +L 139.467263 596.609683 +L 139.615321 611.052002 +L 139.514642 588.593612 +L 139.621243 608.866747 +L 139.627165 605.590637 +L 139.698233 627.179281 +L 139.704155 628.584163 +L 139.757456 615.484061 +L 139.92328 562.445105 +L 139.781145 618.79466 +L 139.935124 567.847537 +L 140.023958 582.078138 +L 139.946969 567.387989 +L 140.041725 569.536127 +L 140.083181 562.71982 +L 140.124637 579.961951 +L 140.225316 594.841026 +L 140.18386 577.056446 +L 140.237161 584.33593 +L 140.249005 577.086736 +L 140.308228 597.786463 +L 140.325995 593.842599 +L 140.331917 593.369313 +L 140.33784 593.985148 +L 140.450363 615.322364 +L 140.456285 614.14155 +L 140.497741 604.366463 +L 140.474052 618.399991 +L 140.54512 617.137635 +L 140.639876 638.891101 +L 140.657643 624.906354 +L 140.728711 603.385522 +L 140.776089 613.609311 +L 140.894535 634.51449 +L 140.799778 608.487071 +L 140.906379 634.088113 +L 140.965602 645.733558 +L 141.024825 625.237494 +L 141.066281 629.805085 +L 141.078125 622.293241 +L 141.084048 623.548989 +L 141.143271 606.524888 +L 141.202493 612.41117 +L 141.22026 618.932233 +L 141.243949 605.369393 +L 141.315017 577.240938 +L 141.362395 598.734454 +L 141.421618 588.65125 +L 141.50453 612.103818 +L 141.510452 613.137399 +L 141.528219 606.106331 +L 141.605209 586.570289 +L 141.646665 587.551985 +L 141.652587 587.376269 +L 141.664432 592.539159 +L 141.71181 565.083992 +L 141.747344 577.490845 +L 141.771033 593.824698 +L 141.806567 575.872443 +L 141.877634 584.444587 +L 141.954624 565.230418 +L 141.901323 584.732153 +L 141.99608 575.185763 +L 142.019769 571.699267 +L 142.132292 592.38197 +L 142.20336 578.861513 +L 142.238894 591.979955 +L 142.33365 633.505347 +L 142.404718 627.149852 +L 142.434329 614.879139 +L 142.452096 606.852716 +L 142.517241 636.38335 +L 142.529086 630.735839 +L 142.546852 640.925374 +L 142.600153 623.298381 +L 142.629764 627.659002 +L 142.760055 604.079887 +L 142.777822 605.216006 +L 142.807433 612.203266 +L 142.860734 590.708629 +L 142.890345 577.87843 +L 142.943646 596.481628 +L 142.961413 595.98308 +L 143.133159 619.304744 +L 142.985102 587.615507 +L 143.156848 611.713256 +L 143.180537 605.710893 +L 143.210149 617.432698 +L 143.257527 613.594154 +L 143.281216 619.403821 +L 143.334517 594.296239 +L 143.340439 600.889635 +L 143.423351 587.697719 +L 143.399662 602.361772 +L 143.452962 597.261351 +L 143.518107 613.160352 +L 143.565486 610.237813 +L 143.678009 585.683504 +L 143.624709 615.646109 +L 143.689854 591.194207 +L 143.695776 595.752656 +L 143.772766 576.856364 +L 143.778688 579.166308 +L 143.879367 573.486958 +L 143.8083 588.663059 +L 143.885289 575.235972 +L 143.944512 601.311605 +L 143.908978 573.505575 +L 144.009657 599.480393 +L 144.057036 576.457273 +L 144.122181 592.054874 +L 144.134025 604.190607 +L 144.228782 595.549061 +L 144.293927 575.757454 +L 144.35315 579.512135 +L 144.418295 591.673003 +L 144.40645 578.705347 +L 144.465673 589.489461 +L 144.501207 582.081291 +L 144.536741 596.81677 +L 144.548585 589.281379 +L 144.661109 608.121368 +L 144.667031 607.25505 +L 144.773632 577.421414 +L 144.791399 578.998911 +L 144.868389 602.277379 +L 144.809166 574.811425 +L 144.945379 592.391806 +L 144.986835 582.418801 +L 145.05198 594.127567 +L 145.063824 601.220931 +L 145.134892 581.942788 +L 145.140814 585.961563 +L 145.146736 579.103448 +L 145.235571 598.010914 +L 145.294793 611.570679 +L 145.265182 596.368015 +L 145.348094 607.138717 +L 145.419161 591.79511 +L 145.454695 610.680091 +L 145.460617 619.013721 +L 145.531685 585.923748 +L 145.555374 603.020378 +L 145.561296 601.031599 +L 145.584985 624.887167 +L 145.608675 621.596784 +L 145.774499 645.735808 +L 145.656053 621.262519 +L 145.780421 645.712114 +L 146.035079 574.087861 +L 146.064691 580.984757 +L 146.189059 604.873334 +L 146.194981 604.766549 +L 146.283815 608.956332 +L 146.319349 587.562156 +L 146.455562 600.125472 +L 146.390416 578.123832 +L 146.461484 599.361991 +L 146.491095 591.556357 +L 146.520707 601.36432 +L 146.568085 599.197523 +L 146.621386 612.939167 +L 146.674686 603.588939 +L 146.775365 574.765034 +L 146.722064 605.275152 +L 146.816821 581.85186 +L 146.84051 576.270548 +L 146.881966 590.274946 +L 146.887888 589.160524 +L 146.911578 600.743005 +L 146.988567 582.217881 +L 147.118858 564.232844 +L 147.160314 567.824251 +L 147.302449 614.802184 +L 147.379438 612.109447 +L 147.456428 587.426064 +L 147.403127 621.320207 +L 147.533418 590.663966 +L 147.568951 604.630411 +L 147.598563 588.3551 +L 147.645941 599.864712 +L 147.764387 617.397834 +L 147.693319 592.997573 +L 147.805843 607.068596 +L 147.859143 583.351831 +L 147.912444 606.30383 +L 147.924289 611.564671 +L 147.959822 596.381879 +L 147.977589 599.37388 +L 147.989434 595.050191 +L 148.060501 613.130231 +L 148.066423 609.648615 +L 148.090113 632.834114 +L 148.167102 606.919051 +L 148.173025 610.02616 +L 148.214481 610.280207 +L 148.31516 597.169468 +L 148.427683 612.078263 +L 148.356616 593.200253 +L 148.439528 609.883477 +L 148.49875 602.881833 +L 148.469139 614.228182 +L 148.534284 612.133248 +L 148.540206 619.775166 +L 148.629041 602.70099 +L 148.640885 610.719378 +L 148.646808 610.898273 +L 148.65273 609.584508 +L 148.694186 599.535047 +L 148.723797 611.738372 +L 148.753409 607.56066 +L 148.865932 630.863323 +L 148.871854 627.049141 +L 149.008067 604.271348 +L 149.108746 624.477672 +L 149.132435 614.905759 +L 149.286415 568.716327 +L 149.422627 598.357417 +L 149.428549 596.997263 +L 149.434472 596.088076 +L 149.48185 603.848905 +L 149.499617 613.409243 +L 149.552917 591.552775 +L 149.55884 594.090204 +L 149.653596 565.017576 +L 149.576607 600.205575 +L 149.718741 575.107086 +L 149.9734 617.312158 +L 150.020778 607.819919 +L 150.0267 601.483987 +L 150.062234 615.02919 +L 150.127379 612.283109 +L 150.139224 606.381027 +L 150.156991 616.628494 +L 150.162913 621.542783 +L 150.23398 597.067533 +L 150.239903 599.799794 +L 150.340582 590.388515 +L 150.299125 611.947175 +L 150.352426 593.897832 +L 150.358348 594.00686 +L 150.423494 606.514761 +L 150.382038 590.3664 +L 150.470872 597.67733 +L 150.494561 588.113334 +L 150.536017 614.990753 +L 150.565628 604.402644 +L 150.636696 624.823576 +L 150.695919 615.691112 +L 150.701841 609.98623 +L 150.755142 630.284629 +L 150.80252 616.113766 +L 150.814364 623.315562 +L 150.867665 592.409156 +L 150.873587 592.606569 +L 150.909121 567.441889 +L 150.986111 587.816213 +L 151.0631 604.001943 +L 151.027567 586.372838 +L 151.098634 590.30008 +L 151.116401 577.915586 +L 151.211158 588.594181 +L 151.34737 612.93861 +L 151.430282 579.050479 +L 151.489505 582.997513 +L 151.584262 606.867552 +L 151.607951 597.470726 +L 151.613873 593.882299 +L 151.637562 610.06566 +L 151.70863 603.054898 +L 151.767853 591.64 +L 151.827075 615.105994 +L 151.939599 593.556959 +L 151.951443 598.524236 +L 152.010666 614.57808 +L 152.063967 602.045617 +L 152.069889 597.607225 +L 152.105423 611.31196 +L 152.158723 609.175445 +L 152.164646 613.478286 +L 152.235713 587.113317 +L 152.247558 586.550594 +L 152.25348 585.035902 +L 152.271247 600.085283 +L 152.312703 593.774295 +L 152.437071 615.876434 +L 152.448915 610.245033 +L 152.573284 581.311483 +L 152.525905 617.269932 +L 152.596973 593.728691 +L 152.626584 608.89434 +L 152.691729 584.243828 +L 152.709496 597.874623 +L 152.721341 597.073985 +L 152.839786 608.531562 +L 152.904932 588.942342 +L 152.863476 608.85907 +L 152.958232 592.510456 +L 153.0293 603.562172 +L 153.064833 588.018304 +L 153.183279 578.043065 +L 153.106289 596.52759 +L 153.189201 578.662692 +L 153.325414 605.627483 +L 153.485316 568.782297 +L 153.491238 580.349884 +L 153.526772 558.612916 +L 153.597839 576.799358 +L 153.799197 621.467714 +L 153.822886 611.568779 +L 153.888031 598.521384 +L 153.905798 612.481979 +L 153.941332 604.575336 +L 154.0657 620.446056 +L 154.006477 594.038013 +L 154.083467 619.254298 +L 154.166379 593.146258 +L 154.124923 623.297485 +L 154.207835 603.041221 +L 154.231524 591.605026 +L 154.284824 603.638417 +L 154.302591 596.70556 +L 154.373659 632.875593 +L 154.426959 618.648994 +L 154.432881 621.611957 +L 154.503949 601.893106 +L 154.509871 601.645228 +L 154.515793 603.501669 +L 154.53356 622.389312 +L 154.604628 602.349486 +L 154.61055 603.315774 +L 154.699384 590.06343 +L 154.657928 614.516117 +L 154.717151 599.874253 +L 154.723074 605.106246 +L 154.805986 585.328007 +L 154.81783 591.954271 +L 154.900742 607.689478 +L 154.847442 590.595595 +L 154.942198 603.774485 +L 155.048799 590.993284 +L 154.97181 607.221164 +L 155.060644 599.018588 +L 155.066566 598.370055 +L 155.096178 606.407089 +L 155.125789 624.556844 +L 155.208701 611.449364 +L 155.327147 591.776818 +L 155.338991 596.095472 +L 155.344914 600.457013 +L 155.404136 585.391034 +L 155.445592 599.569041 +L 155.498893 570.037762 +L 155.564038 589.357261 +L 155.629183 580.535027 +L 155.575883 594.814928 +L 155.670639 590.581006 +L 155.676562 590.338675 +L 155.729862 610.909221 +L 155.783163 594.945415 +L 155.789085 591.469805 +L 155.842386 622.31237 +L 155.848308 619.083081 +L 155.85423 618.847989 +L 155.877919 599.737306 +L 155.907531 619.074009 +L 155.972676 609.756853 +L 155.978598 614.64712 +L 156.014132 601.904445 +L 156.073355 605.413338 +L 156.150345 570.847896 +L 156.197723 587.119718 +L 156.251023 570.517389 +L 156.322091 578.836194 +L 156.452381 611.648613 +L 156.458303 614.175872 +L 156.511604 598.488254 +L 156.55306 612.106099 +L 156.63005 596.000851 +L 156.68335 597.997519 +L 156.718884 623.33701 +L 156.801796 613.558205 +L 156.807718 615.601875 +L 156.855097 597.391678 +L 156.872864 600.477875 +L 156.896553 601.888159 +L 156.926164 589.861317 +L 157.003154 580.029278 +L 157.020921 593.021178 +L 157.032765 591.7315 +L 157.109755 614.674999 +L 157.056454 590.475259 +L 157.145289 598.687402 +L 157.269657 571.213224 +L 157.163056 600.009202 +L 157.275579 575.380379 +L 157.322957 587.454728 +L 157.399947 583.888929 +L 157.411792 589.784564 +L 157.494704 577.825832 +L 157.500626 587.070421 +L 157.530237 579.30561 +L 157.58946 607.307896 +L 157.595382 607.702729 +L 157.601305 602.387437 +L 157.613149 607.645038 +L 157.660528 584.441744 +L 157.725673 600.429677 +L 157.808585 611.630558 +L 157.784896 591.575616 +L 157.832274 597.641015 +L 157.844118 591.288455 +L 157.867808 601.561821 +L 157.897419 599.216609 +L 157.915186 610.349776 +L 157.986253 590.913076 +L 157.992176 585.226505 +L 158.069165 608.907921 +L 158.08101 603.140551 +L 158.086932 603.10682 +L 158.116544 595.821968 +L 158.146155 607.606617 +L 158.163922 613.53919 +L 158.229067 591.048557 +L 158.252756 589.143011 +L 158.258679 593.458318 +L 158.282368 607.321628 +L 158.359357 581.339951 +L 158.36528 576.347867 +L 158.436347 594.470317 +L 158.465959 584.353094 +L 158.471881 584.561397 +L 158.542948 576.990541 +L 158.560715 595.26595 +L 158.57256 591.012809 +L 158.578482 591.181115 +L 158.691005 605.275577 +L 158.637705 581.653651 +L 158.696928 604.730586 +L 158.762073 610.259727 +L 158.844985 576.348454 +L 158.951586 623.934254 +L 158.993042 613.285634 +L 159.046343 588.092917 +L 159.004887 613.853536 +L 159.099643 612.633157 +L 159.123332 612.105484 +L 159.218089 628.295955 +L 159.312846 618.264834 +L 159.277312 632.633577 +L 159.330612 626.163771 +L 159.336535 630.082725 +L 159.389835 608.363857 +L 159.431291 620.945653 +L 159.585271 587.161566 +L 159.603038 590.569543 +L 159.656338 595.573224 +L 159.620804 586.684247 +L 159.709639 589.747138 +L 159.715561 584.493293 +L 159.798473 603.060257 +L 159.804395 601.781765 +L 159.822162 599.776885 +L 159.94653 622.381519 +L 160.076821 599.065993 +L 160.189344 582.006478 +L 160.088665 599.16958 +L 160.218955 590.325616 +L 160.2308 597.824444 +L 160.295945 586.24363 +L 160.331479 592.06704 +L 160.367013 601.117173 +L 160.420313 584.999928 +L 160.432158 589.398376 +L 160.461769 582.563804 +L 160.503225 595.441024 +L 160.509147 594.289675 +L 160.550603 599.118043 +L 160.556526 590.821378 +L 160.663127 573.662638 +L 160.586137 596.898243 +L 160.674971 576.488378 +L 160.728272 592.799747 +L 160.787495 583.915263 +L 160.793417 581.048439 +L 160.846718 608.26248 +L 160.870407 615.779047 +L 160.935552 595.585297 +L 160.941474 597.533149 +L 161.030309 604.247001 +L 160.971086 589.59887 +L 161.036231 602.004171 +L 161.042153 593.788104 +L 161.113221 619.186555 +L 161.13691 604.652773 +L 161.148754 614.374536 +L 161.225744 583.987033 +L 161.261278 590.448034 +L 161.308656 575.052643 +L 161.373801 554.935307 +L 161.409335 577.489507 +L 161.462636 589.579999 +L 161.504092 569.261595 +L 161.533703 559.559093 +L 161.581081 585.777447 +L 161.598848 581.000954 +L 161.83574 629.583187 +L 161.640304 573.268378 +L 161.841662 626.240061 +L 161.971952 594.276299 +L 161.88904 633.70233 +L 161.995641 604.000459 +L 162.001564 604.964634 +L 162.04302 594.74029 +L 162.048942 597.233133 +L 162.084476 585.700356 +L 162.120009 599.546844 +L 162.167388 590.330497 +L 162.202921 581.572975 +L 162.244377 591.063354 +L 162.262144 587.490211 +L 162.315445 607.09493 +L 162.38059 598.155504 +L 162.516803 577.26083 +L 162.540492 584.822388 +L 162.546414 588.213614 +L 162.599715 561.666211 +L 162.623404 569.806582 +L 162.688549 550.899136 +L 162.653015 570.222964 +L 162.735927 563.478227 +L 162.801072 594.81624 +L 162.860295 581.832246 +L 162.87214 575.531069 +L 162.937285 603.332952 +L 162.949129 595.070278 +L 162.972819 611.334912 +L 163.073497 599.37598 +L 163.126798 587.935166 +L 163.174176 606.235283 +L 163.251166 585.302229 +L 163.280777 606.057858 +L 163.440679 630.358242 +L 163.464368 629.516271 +L 163.517669 620.792747 +L 163.559125 638.32067 +L 163.736794 607.442434 +L 163.742716 607.856846 +L 163.790094 583.215975 +L 163.849317 599.944005 +L 163.902618 606.652035 +L 163.938151 590.66414 +L 163.955918 604.636068 +L 164.050675 575.445208 +L 164.009219 604.848698 +L 164.074364 588.452413 +L 164.222421 618.152805 +L 164.240188 610.147001 +L 164.370478 572.254218 +L 164.3764 578.011226 +L 164.506691 606.250171 +L 164.512613 606.353964 +L 164.518535 605.563196 +L 164.53038 597.131338 +L 164.554069 608.343013 +L 164.625137 606.031358 +L 164.631059 608.46127 +L 164.654748 599.712856 +L 164.719893 602.830718 +L 164.731738 591.484891 +L 164.808727 616.596302 +L 164.856106 627.817174 +L 164.891639 613.048989 +L 164.933095 622.555175 +L 164.962707 626.806506 +L 164.992318 620.994119 +L 165.033774 598.65087 +L 165.122609 601.170768 +L 165.128531 611.032896 +L 165.217365 579.138151 +L 165.223287 588.878222 +L 165.235132 580.646262 +L 165.258821 599.321661 +L 165.306199 621.272771 +L 165.365422 596.872904 +L 165.418723 616.676381 +L 165.48979 604.377369 +L 165.537169 619.456675 +L 165.602314 611.023975 +L 165.691148 595.3336 +L 165.637848 619.614928 +L 165.714837 606.346893 +L 165.762216 589.842361 +L 165.809594 614.178182 +L 165.821438 612.065818 +L 165.827361 617.549192 +L 165.833283 616.928416 +L 165.92804 633.0349 +L 165.862894 614.201804 +L 165.945806 619.379852 +L 165.969496 608.99552 +L 166.016874 623.172551 +L 166.022796 630.318237 +L 166.099786 607.838611 +L 166.129397 626.606333 +L 166.147164 614.677938 +L 166.206387 635.094927 +L 166.235998 626.50965 +L 166.241921 627.789376 +L 166.277454 612.875274 +L 166.324833 603.540596 +L 166.360366 619.17148 +L 166.366289 617.120123 +L 166.384056 627.883272 +L 166.419589 605.917371 +L 166.478812 620.151768 +L 166.484734 622.28783 +L 166.538035 602.473787 +L 166.561724 613.803776 +L 166.75716 579.719975 +L 166.822305 597.841128 +L 166.769004 578.780455 +L 166.881528 594.777821 +L 166.928906 581.724517 +L 166.988129 596.038457 +L 167.011818 605.742711 +L 167.065119 586.310912 +L 167.159875 550.651335 +L 167.189487 566.938301 +L 167.319777 601.057436 +L 167.331621 597.753562 +L 167.355311 584.822069 +L 167.438223 596.061485 +L 167.497445 589.242435 +L 167.556668 614.701982 +L 167.669192 592.800284 +L 167.615891 623.802552 +L 167.681036 595.075845 +L 167.698803 604.726764 +L 167.71657 587.888713 +L 167.769871 594.734371 +L 167.811327 582.720216 +L 167.87055 601.852335 +L 167.882394 591.815578 +L 167.935695 618.37266 +L 168.00084 608.627396 +L 168.113363 581.776097 +L 168.125208 592.26958 +L 168.148897 586.226081 +L 168.33841 625.836063 +L 168.344332 618.606978 +L 168.427244 638.187315 +L 168.445011 629.131791 +L 168.474623 632.156599 +L 168.462778 627.702068 +L 168.504234 631.123887 +L 168.557535 614.332354 +L 168.628602 616.856487 +L 168.806271 590.258948 +L 168.824038 597.287968 +L 168.912872 625.114944 +L 168.948406 613.127982 +L 168.972095 616.033365 +L 169.013551 598.343159 +L 169.238598 565.544448 +L 169.049085 600.679374 +L 169.256365 572.257749 +L 169.333354 588.727904 +L 169.380733 576.056986 +L 169.386655 573.243443 +L 169.428111 604.205576 +L 169.445878 596.970743 +L 169.516945 606.479549 +L 169.469567 591.910466 +L 169.546557 596.332875 +L 169.570246 584.97739 +L 169.629469 608.86538 +L 169.635391 613.081484 +L 169.712381 594.948601 +L 169.818982 576.648955 +L 169.836749 583.075586 +L 169.890049 607.677111 +L 169.949272 585.002724 +L 169.961117 578.154249 +L 170.049951 590.282364 +L 170.138785 616.484253 +L 170.168397 614.241501 +L 170.286842 584.336349 +L 170.310532 592.237622 +L 170.4349 610.882118 +L 170.393444 586.631671 +L 170.440822 608.354862 +L 170.577034 591.542457 +L 170.494122 620.163446 +L 170.594801 597.787409 +L 170.636257 589.658889 +L 170.713247 614.933729 +L 170.784314 628.521964 +L 170.736936 609.5795 +L 170.813926 619.171558 +L 170.932372 593.874843 +L 170.938294 594.410772 +L 170.944216 585.446903 +L 171.021206 612.439955 +L 171.033051 609.642403 +L 171.038973 610.844539 +L 171.062662 593.804533 +L 171.098196 577.065817 +L 171.139652 595.639771 +L 171.175185 592.321241 +L 171.234408 590.875825 +L 171.293631 615.647801 +L 171.512756 580.909033 +L 171.536445 589.423458 +L 171.607512 579.554209 +L 171.554212 590.712459 +L 171.654891 588.799099 +L 171.660813 590.866936 +L 171.684502 575.536019 +L 171.737803 583.281996 +L 171.767414 577.618801 +L 171.838481 587.661765 +L 171.968772 611.573578 +L 171.879937 583.136962 +L 171.986539 602.740588 +L 172.004306 603.988526 +L 172.010228 596.393117 +L 172.063528 589.633952 +L 172.081295 601.644 +L 172.087218 601.014712 +L 172.104984 603.052321 +L 172.14644 619.980562 +L 172.22343 615.510571 +L 172.264886 597.95248 +L 172.312264 620.290843 +L 172.330031 617.226171 +L 172.35372 624.00716 +L 172.407021 600.334398 +L 172.531389 586.414559 +L 172.537311 588.681964 +L 172.632068 615.044017 +L 172.685368 601.433593 +L 172.697213 597.920621 +L 172.750514 613.339469 +L 172.756436 610.397076 +L 172.762358 617.717077 +L 172.851192 590.784778 +L 172.951871 606.715158 +L 172.904493 581.236518 +L 172.969638 597.700445 +L 172.987405 606.301955 +L 173.011094 594.468663 +L 173.058473 600.823565 +L 173.141385 583.52723 +L 173.105851 602.94979 +L 173.182841 587.739724 +L 173.20653 591.069234 +L 173.230219 578.666151 +L 173.236141 569.812063 +L 173.330898 587.698668 +L 173.33682 583.977097 +L 173.484877 626.206516 +L 173.366431 580.792216 +L 173.496722 624.35473 +L 173.715846 604.020956 +L 173.526333 629.941049 +L 173.727691 605.944123 +L 173.733613 613.788292 +L 173.82837 593.017418 +L 173.840214 597.505878 +L 173.893515 584.926019 +L 173.929049 588.143712 +L 173.988271 572.455506 +L 174.023805 592.484666 +L 174.029727 592.172462 +L 174.03565 591.672264 +L 174.041572 596.039921 +L 174.130406 617.699832 +L 174.160018 607.012775 +L 174.260697 586.013215 +L 174.207396 620.946387 +L 174.272541 603.549394 +L 174.290308 607.980944 +L 174.313997 601.078987 +L 174.331764 607.512394 +L 174.396909 595.858536 +L 174.426521 622.571687 +L 174.456132 625.4659 +L 174.485744 615.637297 +L 174.509433 615.843178 +L 174.627878 596.700699 +L 174.539044 617.922309 +L 174.651568 604.65641 +L 174.681179 626.361598 +L 174.775936 626.199076 +L 174.91807 590.938779 +L 174.805547 630.196235 +L 174.935837 602.284827 +L 174.959526 614.048992 +L 175.048361 608.809212 +L 175.131273 602.650248 +L 175.107584 610.866715 +L 175.143117 608.128926 +L 175.166806 617.981948 +L 175.226029 604.277901 +L 175.249719 596.993106 +L 175.303019 619.360472 +L 175.35632 634.78529 +L 175.320786 615.769369 +L 175.421465 629.338381 +L 175.433309 624.539253 +L 175.474765 647.030243 +L 175.48661 642.73885 +L 175.492532 644.906687 +L 175.510299 626.158049 +L 175.5636 632.78969 +L 175.670201 603.254574 +L 175.705735 612.754477 +L 175.741268 620.126205 +L 175.723501 605.450541 +L 175.77088 614.46682 +L 175.776802 607.217347 +L 175.800491 619.3824 +L 175.877481 618.40402 +L 176.013693 597.366555 +L 176.019616 598.508898 +L 176.043305 607.03904 +L 176.084761 591.078476 +L 176.090683 584.689438 +L 176.143984 606.436897 +L 176.191362 595.783865 +L 176.23874 603.104896 +L 176.220973 593.060967 +L 176.280196 594.215759 +L 176.286119 588.523263 +L 176.321652 612.248638 +L 176.369031 610.855857 +L 176.380875 609.995776 +L 176.386798 613.300689 +L 176.398642 602.888717 +L 176.46971 620.139275 +L 176.487476 619.664548 +L 176.641456 590.074012 +L 176.67699 599.985556 +L 176.736212 608.778411 +L 176.724368 594.259612 +L 176.783591 599.220737 +L 176.866503 583.809107 +L 176.80728 600.545925 +L 176.88427 592.373878 +L 176.890192 603.322094 +L 176.943492 580.252851 +L 176.990871 585.519548 +L 177.162617 611.612292 +L 177.180384 611.025761 +L 177.209995 600.55814 +L 177.251451 618.560568 +L 177.27514 612.23297 +L 177.281063 618.902378 +L 177.35213 602.347703 +L 177.387664 618.452761 +L 177.393586 618.122331 +L 177.399509 618.9373 +L 177.440965 619.783954 +L 177.523877 594.38377 +L 177.535721 589.860581 +L 177.55941 602.899513 +L 177.571255 600.946627 +L 177.583099 606.413406 +L 177.642322 582.364274 +L 177.660089 593.406485 +L 177.666011 588.548095 +L 177.731157 611.320728 +L 177.754846 600.156124 +L 177.778535 607.389872 +L 177.837758 578.542552 +L 177.84368 575.097001 +L 177.896981 601.235547 +L 177.92067 594.301284 +L 178.039115 612.572352 +L 178.12795 598.681418 +L 178.068727 618.876623 +L 178.157561 602.919266 +L 178.216784 621.04539 +L 178.287851 619.022419 +L 178.311541 614.94101 +L 178.352997 636.236555 +L 178.394453 620.197995 +L 178.400375 619.590959 +L 178.424064 628.160752 +L 178.429986 627.627433 +L 178.441831 634.24864 +L 178.512898 609.018772 +L 178.524743 605.203929 +L 178.536588 610.390527 +L 178.554354 616.971382 +L 178.59581 592.301845 +L 178.637266 602.486426 +L 178.773479 580.749597 +L 178.785324 586.151594 +L 178.897847 604.428682 +L 178.832702 567.153251 +L 178.909692 600.812743 +L 178.951148 586.929974 +L 179.03406 587.293095 +L 179.111049 604.045 +L 179.146583 592.163709 +L 179.193961 589.959975 +L 179.170272 606.946494 +L 179.229495 598.15819 +L 179.235417 599.7627 +L 179.306485 589.580623 +L 179.312407 587.027775 +L 179.347941 603.223034 +L 179.377552 600.087904 +L 179.42493 617.724911 +L 179.478231 596.7187 +L 179.531532 579.65374 +L 179.590755 595.187187 +L 179.679589 579.739777 +L 179.697356 590.297029 +L 179.774345 587.840215 +L 179.821724 602.840819 +L 179.827646 603.521296 +L 179.845413 599.820517 +L 179.857257 589.521512 +L 179.946092 602.494996 +L 179.957936 591.710501 +L 180.040848 605.063953 +L 179.999392 585.236864 +L 180.07046 601.285145 +L 180.088227 593.746074 +L 180.165216 617.4294 +L 180.171139 610.53122 +L 180.177061 616.524068 +L 180.242206 591.912952 +L 180.27774 608.489447 +L 180.378419 588.098131 +L 180.289584 613.38292 +L 180.402108 598.841297 +L 180.449486 601.834869 +L 180.431719 590.442656 +L 180.490942 597.458624 +L 180.550165 574.36645 +L 180.609388 583.71546 +L 180.715989 607.148238 +L 180.733756 598.256858 +L 180.840357 578.071027 +L 180.798901 609.644318 +L 180.852202 584.967874 +L 180.911424 606.137036 +L 180.970647 598.890646 +L 181.065404 593.317481 +L 181.012103 606.211039 +L 181.077248 599.601419 +L 181.136471 609.069724 +L 181.148316 593.635108 +L 181.154238 593.822926 +L 181.219383 586.820066 +L 181.177927 605.795733 +L 181.248995 600.843486 +L 181.296373 622.414898 +L 181.260839 593.837169 +L 181.39113 616.421817 +L 181.468119 594.193794 +L 181.515498 598.238904 +L 181.539187 606.442952 +L 181.580643 589.998688 +L 181.628021 600.189152 +L 181.693166 589.092178 +L 181.7287 604.350826 +L 181.740545 596.931839 +L 181.811612 611.207723 +L 181.85899 606.52298 +L 181.900446 603.890203 +L 181.912291 612.024854 +L 181.924135 606.818409 +L 181.977436 625.789742 +L 182.024814 602.057895 +L 182.030737 607.299568 +L 182.101804 593.175006 +L 182.054426 610.670552 +L 182.131415 608.044991 +L 182.22025 614.73324 +L 182.161027 600.916477 +L 182.238017 609.088861 +L 182.267628 594.188475 +L 182.315006 615.352641 +L 182.356462 598.619131 +L 182.403841 613.31992 +L 182.374229 596.053561 +L 182.486753 606.068675 +L 182.622965 581.912945 +L 182.652577 584.937188 +L 182.694033 601.437678 +L 182.7651 593.887433 +L 182.853934 573.890873 +L 182.883546 585.234913 +L 182.936846 607.948163 +L 182.978302 584.960854 +L 182.984225 585.314062 +L 183.013836 575.853283 +L 183.055292 591.532848 +L 183.084904 578.65451 +L 183.132282 569.134581 +L 183.209272 602.36423 +L 183.215194 597.499979 +L 183.304028 615.519298 +L 183.30995 607.768845 +L 183.375096 610.190558 +L 183.351406 601.077307 +L 183.404707 603.008322 +L 183.481697 619.512808 +L 183.51723 594.24907 +L 183.529075 605.162008 +L 183.564609 587.752891 +L 183.623832 591.649683 +L 183.629754 590.40693 +L 183.641598 604.985232 +L 183.647521 603.924611 +L 183.665288 613.934578 +L 183.72451 591.504874 +L 183.7482 595.013381 +L 183.902179 624.870863 +L 183.908101 618.104206 +L 183.996936 625.448067 +L 184.032469 605.663439 +L 184.115381 615.542902 +L 184.08577 597.292405 +L 184.150915 611.053231 +L 184.239749 616.586505 +L 184.281205 593.944715 +L 184.298972 606.56642 +L 184.37004 584.9344 +L 184.375962 590.172308 +L 184.506252 563.540127 +L 184.541786 579.240625 +L 184.63062 567.827819 +L 184.642465 557.455921 +L 184.713532 580.623193 +L 184.743144 586.748201 +L 184.772755 571.665562 +L 184.778677 569.594978 +L 184.808289 580.763161 +L 184.867512 573.559135 +L 184.944501 610.85273 +L 184.99188 599.943322 +L 185.021491 583.101615 +L 185.086636 605.186559 +L 185.098481 603.260205 +L 185.240616 634.854432 +L 185.134015 598.125195 +L 185.27615 616.584439 +L 185.282072 616.805945 +L 185.335372 629.476596 +L 185.311683 616.329751 +L 185.388673 619.845215 +L 185.48343 590.723229 +L 185.524886 602.431739 +L 185.530808 614.201442 +L 185.61372 582.246051 +L 185.625564 587.994236 +L 185.720321 569.000865 +L 185.643331 590.528437 +L 185.773622 580.326336 +L 185.915756 614.382704 +L 185.927601 612.117466 +L 186.099347 585.169058 +L 186.140803 589.964 +L 186.194104 618.082946 +L 186.259249 605.649095 +L 186.265171 596.456346 +L 186.306627 616.350574 +L 186.371773 600.572451 +L 186.377695 600.683708 +L 186.383617 599.52462 +L 186.389539 600.51196 +L 186.430995 590.599932 +L 186.460607 606.616176 +L 186.496141 599.891342 +L 186.502063 599.739637 +L 186.51983 608.335965 +L 186.590897 582.010382 +L 186.602742 570.338762 +L 186.644198 587.041636 +L 186.691576 584.373637 +L 186.756721 598.155729 +L 186.792255 578.853785 +L 186.798177 576.00141 +L 186.845555 589.744255 +L 186.881089 587.421527 +L 186.916623 604.478385 +L 186.981768 582.506724 +L 186.993613 589.266171 +L 187.040991 576.75931 +L 187.094291 593.257848 +L 187.230504 608.057454 +L 187.159437 579.230569 +L 187.236426 607.672277 +L 187.248271 592.671518 +L 187.343028 600.99682 +L 187.455551 617.123334 +L 187.408173 600.624173 +L 187.461473 611.359149 +L 187.491085 612.258299 +L 187.585841 587.5149 +L 187.63322 608.47675 +L 187.698365 593.059328 +L 187.704287 592.659956 +L 187.739821 597.189999 +L 187.858266 627.243014 +L 187.757588 596.727458 +L 187.887878 619.554474 +L 188.006324 600.18759 +L 188.10108 613.684487 +L 188.142536 604.779672 +L 188.183992 597.648685 +L 188.160303 609.754991 +L 188.237293 602.865975 +L 188.243215 613.171574 +L 188.30836 584.712085 +L 188.337972 586.274465 +L 188.426806 573.777869 +L 188.361661 593.679257 +L 188.474184 579.06549 +L 188.586708 590.231808 +L 188.521563 571.933318 +L 188.59263 589.073173 +L 188.705153 603.51933 +L 188.628164 583.569396 +L 188.711076 598.90516 +L 188.811755 589.684754 +L 188.72292 601.791064 +L 188.823599 595.930425 +L 188.859133 587.016109 +L 188.8769 596.307709 +L 188.906511 588.190991 +L 188.983501 603.892028 +L 189.013112 581.271493 +L 189.024957 581.778355 +L 189.030879 578.94641 +L 189.042724 579.672561 +L 189.119713 563.320986 +L 189.060491 584.679186 +L 189.155247 576.12254 +L 189.190781 589.066879 +L 189.21447 572.138159 +L 189.273693 588.162389 +L 189.297382 580.295747 +L 189.338838 595.195264 +L 189.374372 618.303682 +L 189.457284 608.653612 +L 189.486895 578.753897 +L 189.599419 598.677842 +L 189.605341 598.453679 +L 189.700098 625.103791 +L 189.729709 615.787395 +L 189.735631 619.64888 +L 189.806699 595.143593 +L 189.812621 600.728538 +L 189.818543 597.789222 +L 189.889611 605.464415 +L 189.9133 626.147368 +L 189.996212 603.968058 +L 190.049512 601.567156 +L 190.073202 611.873724 +L 190.079124 612.950481 +L 190.12058 603.718551 +L 190.132424 608.38889 +L 190.19757 595.062998 +L 190.227181 613.709725 +L 190.239026 608.348535 +L 190.369316 583.29565 +L 190.25087 612.629247 +L 190.398927 598.153597 +L 190.464073 610.448575 +L 190.499606 592.647884 +L 190.505529 595.513967 +L 190.523295 605.503659 +L 190.546985 591.394829 +L 190.564751 595.817037 +L 190.582518 587.06925 +L 190.66543 607.953035 +L 190.671353 603.017783 +L 190.724653 625.990454 +L 190.772031 610.959303 +L 190.783876 616.749438 +L 190.837177 600.173173 +L 190.884555 613.563681 +L 191.103679 572.512773 +L 191.139213 590.011837 +L 191.151058 592.352003 +L 191.15698 590.676176 +L 191.186591 603.639045 +L 191.269503 593.037544 +L 191.281348 592.630697 +L 191.28727 588.655423 +L 191.310959 604.986374 +L 191.376105 603.141307 +L 191.382027 601.715492 +L 191.411638 618.564515 +L 191.44125 636.4667 +L 191.512317 621.200476 +L 191.607074 592.147553 +L 191.636685 609.485722 +L 191.642608 614.38162 +L 191.713675 587.279246 +L 191.772898 571.342344 +L 191.832121 581.22225 +L 191.903188 598.373656 +L 191.873577 576.863619 +L 191.950566 589.562215 +L 191.962411 598.405327 +L 192.033478 576.82248 +L 192.039401 574.262731 +L 192.086779 592.484437 +L 192.128235 582.462125 +L 192.181536 603.564943 +L 192.264448 593.859596 +L 192.27037 590.238801 +L 192.317748 619.361223 +L 192.34736 607.365896 +L 192.471728 638.839937 +L 192.483572 639.033516 +L 192.501339 627.389483 +L 192.643474 590.85884 +L 192.649396 589.485093 +L 192.673085 604.560542 +L 192.679008 609.882529 +L 192.755997 597.780514 +L 192.779687 602.944364 +L 192.838909 598.351863 +L 192.821143 614.116874 +L 192.880365 602.996722 +L 193.028423 642.614513 +L 193.034345 636.7685 +L 193.212013 613.20303 +L 193.22978 626.599131 +L 193.235703 626.685532 +L 193.241625 625.481946 +L 193.247547 632.065125 +L 193.330459 609.831522 +L 193.336381 611.206353 +L 193.460749 591.678958 +L 193.38376 612.047972 +L 193.466672 592.751743 +L 193.555506 611.934301 +L 193.585117 606.39551 +L 193.679874 583.085784 +L 193.72133 586.642973 +L 193.804242 608.865579 +L 193.839776 594.580727 +L 194.0056 568.671031 +L 193.893076 594.649817 +L 194.017444 575.767319 +L 194.201035 607.462437 +L 194.224724 597.907971 +L 194.301714 587.452728 +L 194.254336 607.06764 +L 194.331326 593.663282 +L 194.408315 622.918109 +L 194.461616 603.93269 +L 194.479383 598.262233 +L 194.538606 613.903308 +L 194.562295 611.633981 +L 194.597828 627.398914 +L 194.633362 606.591185 +L 194.734041 596.461689 +L 194.686663 618.191887 +L 194.745886 602.712795 +L 194.75773 610.397034 +L 194.828798 590.560527 +L 194.899865 564.289496 +L 194.941321 587.347958 +L 194.947243 588.437619 +L 194.982777 576.847302 +L 195.000544 579.19507 +L 195.030155 569.069818 +L 195.042 584.772244 +L 195.095301 580.617434 +L 195.160446 596.686441 +L 195.11899 572.446553 +L 195.201902 580.392568 +L 195.207824 576.82777 +L 195.278891 597.266225 +L 195.367726 602.686531 +L 195.320347 589.399541 +L 195.397337 600.987525 +L 195.521705 583.419951 +L 195.545394 579.639611 +L 195.58685 591.793305 +L 195.604617 587.279653 +L 195.622384 602.378897 +L 195.651995 581.077222 +L 195.717141 593.933687 +L 195.723063 588.874137 +L 195.770441 610.373141 +L 195.823742 596.760566 +L 195.865198 581.039928 +L 195.835586 599.68607 +L 195.930343 595.107706 +L 195.959954 602.865723 +L 195.995488 590.544122 +L 196.054711 601.714448 +L 196.072478 592.391435 +L 196.131701 615.986262 +L 196.161312 606.392846 +L 196.202768 608.573954 +L 196.214613 594.385852 +L 196.23238 598.169925 +L 196.238302 586.544862 +L 196.327136 608.065791 +L 196.338981 602.806973 +L 196.368592 614.5987 +L 196.421893 592.283307 +L 196.433737 596.180953 +L 196.581794 612.138561 +L 196.516649 591.225974 +L 196.593639 611.201834 +L 196.617328 604.98355 +L 196.664706 630.618362 +L 196.723929 596.842295 +L 196.818686 615.483785 +L 196.836453 622.437765 +L 196.883831 600.745224 +L 196.972665 580.326295 +L 196.913443 609.452247 +L 197.002277 593.111861 +L 197.014121 599.569701 +L 197.091111 584.053158 +L 197.108878 593.348701 +L 197.1148 591.008344 +L 197.156256 614.376406 +L 197.227324 626.057175 +L 197.256935 607.315211 +L 197.274702 603.772163 +L 197.32208 618.54414 +L 197.345769 613.774462 +L 197.487904 630.171192 +L 197.381303 612.511269 +L 197.493827 629.759743 +L 197.60635 608.82847 +L 197.612272 611.106014 +L 197.647806 632.856812 +L 197.718873 618.623843 +L 197.825475 600.771031 +L 197.73664 619.166146 +L 197.837319 603.663926 +L 197.855086 590.282977 +L 197.896542 616.121456 +L 197.926153 612.847946 +L 197.96761 620.063234 +L 198.044599 615.517806 +L 198.080133 619.62428 +L 198.109744 609.673974 +L 198.115667 607.915812 +L 198.163045 621.776684 +L 198.186734 618.750996 +L 198.192656 621.965566 +L 198.251879 599.315955 +L 198.411781 565.443002 +L 198.58945 601.533779 +L 198.595372 593.583997 +L 198.601294 592.295437 +L 198.613139 599.025494 +L 198.630906 598.131033 +L 198.666439 614.814587 +L 198.725662 591.872232 +L 198.737507 592.848341 +L 198.79673 590.091809 +L 198.767118 600.383432 +L 198.820419 597.561608 +L 198.92702 610.979773 +L 198.879642 590.088512 +L 198.950709 603.942872 +L 199.039543 589.945797 +L 198.986243 611.305833 +L 199.063233 594.504439 +L 199.086922 599.404814 +L 199.122455 589.219052 +L 199.169834 594.189058 +L 199.199445 582.998702 +L 199.181678 597.091327 +L 199.246823 595.556862 +L 199.306046 614.208811 +L 199.365269 604.340048 +L 199.41857 593.393399 +L 199.442259 607.536859 +L 199.465948 606.068276 +L 199.542938 611.443827 +L 199.507404 597.939794 +L 199.554782 603.705788 +L 199.637694 575.359597 +L 199.690995 586.124022 +L 199.702839 589.776609 +L 199.75614 576.140293 +L 199.785751 580.625991 +L 199.856819 565.788989 +L 199.898275 577.182246 +L 199.939731 585.667186 +L 199.987109 570.396241 +L 200.004876 577.012352 +L 200.010798 576.77206 +L 200.099633 611.906371 +L 200.147011 604.989882 +L 200.182545 609.784803 +L 200.218078 587.987768 +L 200.229923 589.535053 +L 200.259534 580.363675 +L 200.289146 594.757083 +L 200.30099 592.365761 +L 200.306913 594.506817 +L 200.348369 575.741196 +L 200.389825 585.739657 +L 200.413514 585.288464 +L 200.437203 595.194222 +L 200.573416 626.769205 +L 200.597105 624.298699 +L 200.709628 603.543643 +L 200.632638 627.649248 +L 200.727395 605.78717 +L 200.804385 598.761935 +L 200.845841 618.488882 +L 200.893219 620.419229 +L 200.970209 600.784767 +L 201.011665 595.365119 +L 201.059043 603.83869 +L 201.094577 608.972775 +L 201.124188 586.584619 +L 201.147877 589.14423 +L 201.28409 612.737447 +L 201.2071 586.942187 +L 201.301857 601.107447 +L 201.313701 593.296655 +L 201.396613 608.69342 +L 201.402536 606.932149 +L 201.526904 624.946597 +L 201.49137 605.898244 +L 201.532826 619.94268 +L 201.639427 606.837262 +L 201.651272 615.280502 +L 201.704572 621.943981 +L 201.734184 606.743918 +L 201.746028 611.256012 +L 201.864474 580.303952 +L 201.77564 611.65586 +L 201.870396 581.048861 +L 202.006609 607.762862 +L 202.042143 611.6431 +L 202.142821 589.408191 +L 202.213889 614.754303 +L 202.284956 608.867236 +L 202.308646 596.779121 +L 202.338257 617.130231 +L 202.391558 611.676258 +L 202.39748 611.697824 +L 202.427091 603.950485 +L 202.462625 612.957867 +L 202.47447 611.767675 +L 202.569226 620.946937 +L 202.533692 606.580392 +L 202.586993 619.691489 +L 202.616604 602.88626 +L 202.652138 588.316007 +L 202.717283 612.409499 +L 202.752817 622.70058 +L 202.817962 602.48595 +L 203.013398 633.160856 +L 202.877185 593.423896 +L 203.048931 627.01884 +L 203.137766 605.923846 +L 203.167377 615.329826 +L 203.202911 632.35843 +L 203.262134 608.860827 +L 203.392424 591.071803 +L 203.309512 618.803088 +L 203.404269 595.564764 +L 203.457569 617.211092 +L 203.51087 602.886705 +L 203.516792 594.526773 +L 203.587859 617.798124 +L 203.617471 605.462988 +L 203.676694 612.602192 +L 203.653005 602.954283 +L 203.729994 608.188295 +L 203.795139 616.445028 +L 203.741839 606.13372 +L 203.812906 608.644098 +L 203.960963 579.239418 +L 204.008342 600.40703 +L 204.114943 588.818575 +L 204.126787 585.989289 +L 204.162321 607.279579 +L 204.191933 597.921792 +L 204.215622 604.452826 +L 204.239311 590.70592 +L 204.245233 591.736071 +L 204.286689 587.501237 +L 204.322223 599.161454 +L 204.351834 613.987092 +L 204.411057 587.893299 +L 204.476202 578.498148 +L 204.428824 594.258602 +L 204.529503 581.92748 +L 204.541348 581.822973 +L 204.707172 607.895184 +L 204.724938 613.558717 +L 204.790084 603.530476 +L 204.80785 605.329873 +L 204.914452 594.901747 +L 204.890762 608.331769 +L 204.926296 599.293624 +L 204.949985 610.277326 +L 204.991441 589.330487 +L 205.01513 592.403852 +L 205.021053 586.63561 +L 205.062509 600.715192 +L 205.121732 594.522843 +L 205.240177 626.698559 +L 205.275711 620.486057 +L 205.346778 604.475992 +L 205.388234 607.776616 +L 205.411924 615.630362 +L 205.488913 601.611301 +L 205.518525 612.760009 +L 205.619204 587.648107 +L 205.708038 608.757562 +L 205.731727 597.938794 +L 205.79095 590.809454 +L 205.761339 601.11285 +L 205.838328 597.849135 +L 205.844251 597.471769 +L 205.856095 602.060838 +L 205.862017 601.035203 +L 205.927163 615.900826 +L 205.897551 594.473724 +L 205.974541 601.794447 +L 206.063375 585.133003 +L 206.092987 597.684986 +L 206.12852 602.864934 +L 206.104831 593.35684 +L 206.181821 602.050395 +L 206.270655 574.751478 +L 206.300267 582.23691 +L 206.359489 596.609303 +L 206.41279 590.949004 +L 206.430557 581.373925 +L 206.507547 596.730595 +L 206.54308 598.703397 +L 206.679293 582.070923 +L 206.768127 607.005016 +L 206.821428 603.318191 +L 206.82735 603.769366 +L 206.933951 577.265384 +L 206.951718 580.904642 +L 207.087931 605.231013 +L 206.969485 579.717286 +L 207.099775 602.466302 +L 207.176765 596.01577 +L 207.153076 606.796808 +L 207.212299 600.951117 +L 207.289288 588.169582 +L 207.265599 601.488888 +L 207.3189 598.808934 +L 207.419579 604.320051 +L 207.348511 580.338078 +L 207.437346 603.012011 +L 207.443268 597.74607 +L 207.52618 620.197548 +L 207.57948 626.947054 +L 207.597247 613.825901 +L 207.60317 615.432189 +L 207.632781 597.286524 +L 207.686082 618.227063 +L 207.709771 614.461995 +L 207.763071 634.400311 +L 207.81045 612.872959 +L 207.816372 612.89724 +L 207.822294 613.491873 +L 207.828217 608.581535 +L 207.834139 610.907974 +L 207.952585 592.234274 +L 208.088797 635.549628 +L 208.112486 624.605414 +L 208.153942 612.126037 +L 208.201321 628.005331 +L 208.207243 629.833746 +L 208.242777 613.64969 +L 208.248699 607.741835 +L 208.301999 622.193313 +L 208.343455 620.29978 +L 208.455979 645.685083 +L 208.491513 634.637338 +L 208.598114 602.43326 +L 208.621803 615.463471 +L 208.787627 593.298995 +L 208.817238 601.107981 +L 208.870539 577.674383 +L 208.92384 594.46335 +L 208.97714 584.215017 +L 209.024518 561.17514 +L 209.089664 580.419415 +L 209.154809 595.197932 +L 209.10743 575.9516 +L 209.219954 587.692502 +L 209.350244 565.290093 +L 209.249565 590.426032 +L 209.373933 565.543432 +L 209.486457 587.439714 +L 209.415389 562.96364 +L 209.516068 577.015932 +L 209.54568 569.232421 +L 209.59898 587.510604 +L 209.711504 597.388423 +L 209.67597 575.62509 +L 209.717426 596.010914 +L 209.735193 591.984575 +L 209.770726 608.269592 +L 209.782571 612.316077 +L 209.859561 596.314744 +L 209.96024 618.167939 +L 209.918784 591.336866 +L 210.007618 603.886044 +L 210.019463 598.582883 +L 210.078685 619.302092 +L 210.120141 600.680428 +L 210.126064 601.799066 +L 210.161597 588.908363 +L 210.208976 597.786795 +L 210.274121 574.675685 +L 210.226743 600.33049 +L 210.357033 584.072435 +L 210.481401 601.785109 +L 210.380722 572.659425 +L 210.487323 596.250682 +L 210.546546 586.186512 +L 210.534701 598.070794 +L 210.599847 595.229782 +L 210.617613 603.913898 +L 210.688681 583.047495 +L 210.71237 577.952683 +L 210.753826 593.734196 +L 210.759748 592.07197 +L 210.890039 637.121493 +L 210.907805 629.550713 +L 211.038096 596.823498 +L 211.061785 603.559305 +L 211.079552 597.81234 +L 211.097319 607.062969 +L 211.144697 614.125106 +L 211.174308 602.497241 +L 211.186153 604.140301 +L 211.274987 589.648947 +L 211.357899 597.269087 +L 211.399355 610.84575 +L 211.369744 592.379248 +L 211.476345 603.282773 +L 211.577024 589.141091 +L 211.511879 604.679573 +L 211.588868 598.003138 +L 211.731003 615.812869 +L 211.908672 588.486776 +L 211.950128 594.31904 +L 212.050807 612.276644 +L 211.985662 592.784082 +L 212.068574 603.677555 +L 212.092263 593.162861 +L 212.133719 613.546266 +L 212.175175 601.745128 +L 212.246242 611.340184 +L 212.275854 598.512907 +L 212.305465 589.118634 +L 212.376533 603.466909 +L 212.400222 604.288481 +L 212.453522 591.605814 +L 212.512745 575.021651 +L 212.554201 595.112593 +L 212.560123 594.1984 +L 212.583813 600.18906 +L 212.643035 583.920959 +L 212.666725 591.886303 +L 212.720025 616.566564 +L 212.826626 608.4248 +L 212.874005 599.356137 +L 212.915461 612.714312 +L 212.921383 619.574394 +L 212.998373 590.350067 +L 213.004295 595.277213 +L 213.010217 593.521367 +L 213.06944 608.725205 +L 213.134585 600.966875 +L 213.164197 612.059593 +L 213.181964 618.920218 +L 213.22342 611.558508 +L 213.27672 614.261453 +L 213.312254 600.518442 +L 213.365554 623.90935 +L 213.371477 617.94884 +L 213.495845 644.992873 +L 213.555068 629.932458 +L 213.572834 636.334556 +L 213.685358 599.954372 +L 213.797881 617.376378 +L 213.697202 598.545985 +L 213.815648 615.272321 +L 213.863026 609.370302 +L 213.886716 630.360161 +L 213.910405 617.611559 +L 213.957783 603.363674 +L 214.02885 626.427405 +L 214.093996 621.466356 +L 214.05254 635.493645 +L 214.111762 634.727462 +L 214.117685 635.245624 +L 214.129529 626.66185 +L 214.135452 631.707999 +L 214.147296 625.010075 +L 214.194675 635.223755 +L 214.242053 632.153553 +L 214.25982 642.582402 +L 214.324965 617.993916 +L 214.407877 601.786602 +L 214.366421 620.976053 +L 214.461177 608.590204 +L 214.567779 628.504307 +L 214.59739 618.766829 +L 214.692147 602.946756 +L 214.615157 619.378588 +L 214.709913 610.935398 +L 214.798748 622.555268 +L 214.769136 605.54897 +L 214.822437 612.571792 +L 214.958649 593.41483 +L 214.976416 597.537077 +L 215.077095 604.511532 +L 215.08894 603.117844 +L 215.094862 597.709036 +L 215.183696 612.221035 +L 215.201463 601.705887 +L 215.331754 576.577677 +L 215.343598 580.687359 +L 215.361365 584.024414 +L 215.420588 572.735398 +L 215.42651 576.452672 +L 215.432432 567.890582 +L 215.509422 599.749041 +L 215.521267 591.332718 +L 215.657479 635.439514 +L 215.704858 628.089342 +L 215.722624 618.233783 +L 215.752236 641.477981 +L 215.829226 618.346067 +L 215.835148 624.603355 +L 215.864759 606.325411 +L 215.929904 612.104787 +L 215.965438 621.346936 +L 216.042428 606.814115 +L 216.12534 616.347589 +L 216.060195 598.45658 +L 216.143107 604.436934 +L 216.17864 590.763312 +L 216.226019 615.103011 +L 216.231941 612.965046 +L 216.320775 626.718989 +L 216.273397 609.884424 +L 216.344464 620.985067 +L 216.486599 580.874144 +L 216.646501 601.154354 +L 216.658346 595.364635 +L 216.682035 587.455814 +L 216.753102 608.880824 +L 216.853781 619.433075 +L 216.806403 603.774553 +L 216.865626 617.641245 +L 216.942615 576.459791 +L 216.995916 597.108103 +L 217.043294 600.378836 +L 217.061061 588.845851 +L 217.08475 595.611838 +L 217.090673 590.725031 +L 217.167662 613.209275 +L 217.197274 621.99326 +L 217.220963 603.299088 +L 217.232807 596.533837 +L 217.274263 622.341479 +L 217.327564 605.669182 +L 217.440087 613.6447 +L 217.36902 596.665289 +L 217.451932 612.350431 +L 217.49931 599.147853 +L 217.546689 616.207795 +L 217.552611 615.058302 +L 217.570378 608.108394 +L 217.599989 619.338892 +L 217.629601 614.709939 +L 217.635523 620.822196 +L 217.712513 601.092338 +L 217.73028 606.582868 +L 217.819114 596.353699 +L 217.795425 609.077007 +L 217.836881 599.398461 +L 217.842803 606.331397 +L 217.878337 590.340817 +L 217.93756 601.456616 +L 218.050083 575.872232 +L 218.056005 578.503014 +L 218.150762 599.450597 +L 218.06785 577.117397 +L 218.180373 590.508626 +L 218.192218 581.37006 +L 218.27513 600.83686 +L 218.281052 597.07945 +L 218.292897 591.068907 +L 218.304741 594.896169 +L 218.310664 589.047709 +L 218.375809 616.749751 +L 218.393576 616.344687 +L 218.452798 631.898761 +L 218.500177 613.907534 +L 218.529788 621.422343 +L 218.571244 607.704531 +L 218.577167 609.797632 +L 218.589011 600.18733 +L 218.677845 620.498014 +L 218.695612 619.653534 +L 218.825903 588.287316 +L 218.831825 588.771062 +L 219.045027 546.413125 +L 218.891048 592.113848 +L 219.116095 553.719948 +L 219.246385 577.571238 +L 219.252307 576.425812 +L 219.264152 579.228575 +L 219.270074 575.230198 +L 219.275996 572.207748 +L 219.329297 601.444881 +L 219.335219 597.55268 +L 219.424053 617.529231 +L 219.453665 601.637345 +L 219.465509 595.546871 +L 219.524732 603.945671 +L 219.607644 593.221902 +L 219.655023 613.415355 +L 219.67279 608.136536 +L 219.708323 618.967245 +L 219.72609 618.67794 +L 219.737935 623.908526 +L 219.767546 600.430443 +L 219.809002 610.383454 +L 219.957059 588.458319 +L 219.850458 615.56871 +L 219.986671 595.547773 +L 220.028127 620.266285 +L 220.134728 615.596152 +L 220.158417 613.040568 +L 220.164339 619.798473 +L 220.170262 623.55049 +L 220.229484 595.821071 +L 220.265018 586.48157 +L 220.324241 607.80462 +L 220.413075 617.312692 +L 220.383464 603.96031 +L 220.430842 606.50622 +L 220.442687 608.635367 +L 220.519676 585.102159 +L 220.525599 582.362095 +L 220.549288 605.456782 +L 220.602588 589.458839 +L 220.726957 622.841901 +L 220.738801 621.706248 +L 220.809869 601.335654 +L 220.774335 628.53763 +L 220.875014 608.010933 +L 220.898703 599.797522 +L 220.922392 612.296563 +L 220.934237 617.436624 +L 220.981615 604.705647 +L 221.023071 611.65634 +L 221.076371 613.721762 +L 221.147439 599.827254 +L 221.200739 608.770824 +L 221.218506 596.101555 +L 221.271807 606.353587 +L 221.372486 581.517965 +L 221.402097 588.337172 +L 221.490931 598.006022 +L 221.419864 585.32406 +L 221.508698 596.116121 +L 221.526465 583.999237 +L 221.561999 600.226321 +L 221.621222 592.997899 +L 221.787046 572.350083 +L 221.704134 596.747138 +L 221.816657 575.578125 +L 221.988404 605.171027 +L 222.041704 596.971576 +L 222.095005 574.658844 +L 222.065393 599.010627 +L 222.195684 588.34584 +L 222.201606 590.865327 +L 222.272673 576.456425 +L 222.284518 580.019951 +L 222.29044 580.418327 +L 222.296362 579.728933 +L 222.325974 570.831026 +L 222.397041 580.218647 +L 222.402964 578.981455 +L 222.432575 587.105101 +L 222.485876 568.183877 +L 222.503642 575.301764 +L 222.509565 574.148029 +L 222.551021 586.482258 +L 222.6517 596.274097 +L 222.57471 585.724531 +L 222.675389 592.131596 +L 222.716845 587.84814 +L 222.740534 598.865209 +L 222.764223 594.405752 +L 222.918203 638.993201 +L 222.98927 611.949351 +L 222.995192 605.987448 +L 223.054415 630.179711 +L 223.095871 609.992532 +L 223.220239 625.232312 +L 223.155094 608.893447 +L 223.226161 622.903034 +L 223.303151 597.425966 +L 223.356452 615.152302 +L 223.380141 625.689209 +L 223.397908 611.518466 +L 223.463053 612.014941 +L 223.474897 618.514729 +L 223.522276 600.961151 +L 223.563732 608.32318 +L 223.664411 587.908657 +L 223.682177 598.821088 +L 223.776934 614.882343 +L 223.705867 598.007636 +L 223.806545 603.544087 +L 223.812468 602.047574 +L 223.81839 614.078569 +L 223.877613 612.79364 +L 223.883535 621.0249 +L 223.901302 601.460823 +L 223.984214 608.705449 +L 224.055282 593.451889 +L 224.001981 608.98748 +L 224.090815 605.822233 +L 224.197416 624.790652 +L 224.221106 618.560739 +L 224.292173 600.324033 +L 224.250717 623.044839 +L 224.339551 613.266772 +L 224.345474 620.020194 +L 224.398774 598.508037 +L 224.452075 617.800799 +L 224.540909 594.810532 +L 224.487608 618.864249 +L 224.59421 601.801955 +L 224.611976 606.610712 +L 224.671199 593.444492 +L 224.688966 594.703371 +L 224.813334 575.428689 +L 224.7245 597.639453 +L 224.825179 583.912891 +L 224.878479 598.331573 +L 224.890324 582.612032 +L 224.949547 591.349169 +L 224.973236 603.839615 +L 225.026537 589.454739 +L 225.044303 595.104637 +L 225.097604 569.126773 +L 225.144982 600.082593 +L 225.293039 620.000106 +L 225.204205 600.005835 +L 225.304884 617.377182 +L 225.417407 584.742587 +L 225.316729 617.556828 +L 225.470708 598.695318 +L 225.648377 623.487144 +L 225.654299 622.233493 +L 225.677988 633.254781 +L 225.737211 613.567924 +L 225.7609 619.184096 +L 225.778667 625.986049 +L 225.814201 618.761906 +L 225.843812 621.643786 +L 225.861579 608.989956 +L 225.908957 627.607326 +L 225.944491 622.402437 +L 225.950413 628.706732 +L 225.980025 615.007464 +L 226.051092 626.920738 +L 226.062937 619.584017 +L 226.145849 633.340175 +L 226.157693 629.143403 +L 226.287984 601.610377 +L 226.299828 610.937849 +L 226.430118 627.114296 +L 226.376818 604.946941 +L 226.436041 623.292977 +L 226.548564 594.349422 +L 226.560409 597.238213 +L 226.595942 622.170803 +L 226.672932 608.713987 +L 226.684777 596.452365 +L 226.72031 621.040067 +L 226.767689 614.312159 +L 226.773611 619.294203 +L 226.850601 594.256739 +L 226.957202 586.302338 +L 226.868368 599.339368 +L 226.974969 589.338612 +L 227.040114 605.292362 +L 227.063803 585.191601 +L 227.075648 592.851334 +L 227.099337 584.263778 +L 227.164482 606.43611 +L 227.28885 624.720254 +L 227.353995 606.70082 +L 227.312539 625.175676 +L 227.401373 617.56265 +L 227.41914 619.824626 +L 227.436907 613.251251 +L 227.472441 625.255867 +L 227.567197 600.540706 +L 227.614576 607.587773 +L 227.650109 597.287063 +L 227.661954 599.379979 +L 227.709332 566.047144 +L 227.7804 585.746723 +L 227.845545 613.911844 +L 227.928457 609.434317 +L 228.005447 584.549803 +L 228.046903 587.535494 +L 228.129815 606.805363 +L 228.177193 593.501779 +L 228.200882 583.592034 +L 228.24826 596.401964 +L 228.295639 583.835685 +L 228.491074 623.078927 +L 228.313406 577.494129 +L 228.556219 613.284263 +L 228.656898 583.658563 +L 228.674665 597.633263 +L 228.810878 629.243617 +L 228.716121 587.051722 +L 228.822722 624.21887 +L 228.935246 608.824455 +L 228.858256 632.767634 +L 228.953012 611.091332 +L 228.970779 618.176655 +L 229.006313 603.895286 +L 229.047769 605.16445 +L 229.095147 612.991194 +L 229.178059 591.175535 +L 229.30835 571.350225 +L 229.272816 592.437487 +L 229.314272 571.671114 +L 229.43864 613.683713 +L 229.332039 570.217256 +L 229.462329 606.079837 +L 229.491941 601.658787 +L 229.545241 617.931121 +L 229.616309 649.15825 +L 229.657765 623.874474 +L 229.740677 586.265136 +L 229.788055 604.577115 +L 229.847278 613.579647 +L 229.805822 602.06799 +L 229.859122 608.576962 +L 229.936112 598.505565 +L 229.918345 612.177059 +L 229.965723 607.802419 +L 229.977568 607.174082 +L 229.989413 602.942493 +L 230.042713 619.385491 +L 230.048635 625.632203 +L 230.101936 600.669199 +L 230.13747 608.366787 +L 230.232226 580.577598 +L 230.261838 596.326416 +L 230.309216 578.956183 +L 230.273682 597.622936 +L 230.374361 595.107172 +L 230.486885 611.643325 +L 230.498729 610.706623 +L 230.617175 587.639192 +L 230.623097 590.561352 +L 230.676398 609.026641 +L 230.735621 597.612009 +L 230.747465 598.025533 +L 230.854066 587.712949 +L 230.806688 608.45543 +L 230.871833 589.874257 +L 230.895522 601.231302 +L 230.978434 584.45767 +L 231.108725 609.001914 +L 231.120569 598.227806 +L 231.162025 612.719309 +L 231.22717 601.10844 +L 231.233093 604.287376 +L 231.274549 596.341374 +L 231.339694 603.969258 +L 231.404839 591.371446 +L 231.375228 609.114466 +L 231.446295 602.918061 +L 231.570663 631.11071 +L 231.612119 615.18201 +L 231.700953 602.113124 +L 231.641731 616.514418 +L 231.730565 606.046126 +L 231.849011 640.899954 +L 231.884544 625.337614 +L 231.985223 607.602758 +L 231.926 627.004048 +L 232.014835 616.515071 +L 232.020757 618.667449 +L 232.068135 603.160181 +L 232.085902 604.118361 +L 232.127358 584.791026 +L 232.198425 595.524229 +L 232.275415 612.867236 +L 232.299104 593.154125 +L 232.305027 588.573201 +L 232.376094 612.465411 +L 232.382016 611.618591 +L 232.423472 619.422403 +L 232.464928 599.012727 +L 232.512307 578.548824 +L 232.565607 601.240321 +L 232.601141 591.869462 +L 232.618908 598.249589 +L 232.660364 577.24928 +L 232.70182 589.496621 +L 232.707742 589.644959 +L 232.826188 602.830277 +L 232.784732 585.749949 +L 232.83211 599.106562 +L 232.838032 598.708672 +L 232.843955 602.332866 +L 232.903178 631.58097 +L 232.956478 615.964699 +L 233.092691 580.632772 +L 233.240748 608.851206 +L 233.264437 604.841036 +L 233.37696 589.821863 +L 233.276282 606.800257 +L 233.388805 594.248347 +L 233.412494 590.573572 +L 233.442106 604.199294 +L 233.448028 602.962732 +L 233.45395 605.399848 +L 233.489484 582.322183 +L 233.519095 588.624079 +L 233.536862 581.913966 +L 233.58424 607.513686 +L 233.696764 632.082703 +L 233.708609 631.497651 +L 233.827054 600.797301 +L 233.832977 603.827486 +L 233.915889 620.788165 +L 233.9455 611.051709 +L 233.992878 604.16779 +L 234.016567 617.926651 +L 234.040257 615.744165 +L 234.129091 623.376827 +L 234.07579 606.13 +L 234.146858 614.585343 +L 234.15278 614.473626 +L 234.164625 605.618217 +L 234.235692 628.355809 +L 234.241614 622.888553 +L 234.259381 629.727984 +L 234.324526 606.077639 +L 234.425205 632.312281 +L 234.336371 603.3674 +L 234.454817 620.356882 +L 234.472583 607.270964 +L 234.555495 625.400987 +L 234.561418 625.079952 +L 234.573262 627.259529 +L 234.620641 643.933897 +L 234.668019 615.629837 +L 234.780542 626.345902 +L 234.715397 610.393643 +L 234.792387 620.830181 +L 234.804232 628.524771 +L 234.833843 612.108738 +L 234.863454 615.933358 +L 234.869377 613.469156 +L 234.940444 627.045291 +L 234.946366 628.276485 +L 234.970056 613.287061 +L 235.041123 622.168404 +L 235.082579 605.904174 +L 235.11219 615.203777 +L 235.159569 589.526494 +L 235.295781 607.978858 +L 235.331315 599.511432 +L 235.355004 595.570716 +L 235.402382 609.955652 +L 235.408305 608.168187 +L 235.449761 620.395417 +L 235.503061 605.765568 +L 235.514906 608.426747 +L 235.52675 599.125012 +L 235.609662 613.795886 +L 235.615585 613.100903 +L 235.627429 614.328915 +L 235.668885 607.445599 +L 235.73403 594.392337 +L 235.763642 607.990221 +L 235.775486 606.443917 +L 235.929466 632.828438 +L 235.805098 603.736277 +L 235.953155 629.038888 +L 236.047912 613.785685 +L 235.965 632.080018 +L 236.059756 615.125812 +L 236.184124 586.31335 +L 236.201891 594.268757 +L 236.261114 580.336495 +L 236.296648 568.584186 +L 236.326259 591.331341 +L 236.367715 583.275228 +L 236.503928 628.52652 +L 236.515772 614.268815 +L 236.545384 623.502493 +L 236.557228 612.405635 +L 236.669752 592.470603 +L 236.598684 616.243655 +L 236.675674 597.043973 +L 236.693441 594.005022 +L 236.699363 595.332609 +L 236.782275 615.83707 +L 236.811887 603.563963 +L 237.0014 564.964939 +L 236.877032 611.996435 +L 237.019167 571.43628 +L 237.161302 593.649424 +L 237.173146 589.772698 +L 237.184991 595.806132 +L 237.190913 602.869841 +L 237.279747 582.204744 +L 237.315281 601.720706 +L 237.427804 625.078268 +L 237.433727 617.378912 +L 237.439649 617.422739 +L 237.487027 630.674191 +L 237.534406 612.595615 +L 237.652851 589.410986 +L 237.723919 597.605494 +L 237.706152 586.287363 +L 237.771297 591.040635 +L 237.871976 584.657293 +L 237.836442 603.699772 +L 237.877898 590.977022 +L 237.901587 611.15506 +L 237.996344 599.215206 +L 238.002266 599.975482 +L 238.014111 588.365625 +L 238.097023 578.917622 +L 238.079256 593.374301 +L 238.132557 583.6348 +L 238.262847 606.569278 +L 238.37537 587.10733 +L 238.310225 607.574924 +L 238.387215 589.007836 +L 238.511583 607.359837 +L 238.517505 607.969406 +L 238.52935 603.190509 +L 238.665562 572.568948 +L 238.695174 567.081643 +L 238.748474 582.357532 +L 238.819542 606.703698 +L 238.86692 590.607982 +L 238.896531 583.947021 +L 238.926143 592.851801 +L 238.961677 602.266785 +L 239.032744 588.377859 +L 239.038666 586.18156 +L 239.068278 602.748998 +L 239.080122 600.612749 +L 239.115656 597.862521 +L 239.20449 625.073814 +L 239.299247 595.61093 +L 239.346625 607.047329 +L 239.453226 619.203179 +L 239.370314 601.006631 +L 239.459149 616.332361 +L 239.500605 596.66481 +L 239.577594 604.054189 +L 239.666429 616.029217 +L 239.69604 610.965272 +L 239.85002 573.091402 +L 239.731574 626.948561 +L 239.855942 575.855011 +L 239.861864 575.768137 +L 239.867786 567.386984 +L 239.956621 587.638236 +L 239.962543 587.331033 +L 240.009921 602.693127 +L 240.063222 584.79945 +L 240.075066 589.483925 +L 240.116522 594.488434 +L 240.199435 573.028207 +L 240.229046 576.262962 +L 240.223124 572.451919 +L 240.246813 574.892801 +L 240.26458 565.073325 +L 240.347492 587.973834 +L 240.353414 586.406173 +L 240.400792 603.260954 +L 240.406715 598.982881 +L 240.418559 607.101886 +L 240.477782 576.372791 +L 240.495549 584.903082 +L 240.578461 589.809519 +L 240.548849 577.483077 +L 240.590305 584.829351 +L 240.596228 581.26146 +L 240.643606 605.053226 +L 240.667295 604.861471 +L 240.767974 588.189078 +L 240.773896 596.6285 +L 240.88642 611.517137 +L 240.892342 608.58695 +L 241.022632 598.044138 +L 240.910109 612.879024 +L 241.040399 601.276332 +L 241.147 637.21363 +L 241.182534 629.801167 +L 241.295058 622.649227 +L 241.271368 633.758113 +L 241.306902 624.071846 +L 241.318747 635.188328 +L 241.389814 613.258883 +L 241.395736 616.704656 +L 241.591172 582.076121 +L 241.407581 617.660462 +L 241.626706 590.16324 +L 241.71554 620.864903 +L 241.745151 603.627243 +L 241.881364 633.92611 +L 241.916898 620.324655 +L 241.99981 608.07559 +L 242.029421 617.061286 +L 242.041266 629.195715 +L 242.088644 609.357195 +L 242.1301 612.719581 +L 242.254468 587.612693 +L 242.147867 612.741785 +L 242.272235 595.782274 +L 242.284079 594.704231 +L 242.290002 598.425175 +L 242.325535 613.986421 +L 242.402525 601.877759 +L 242.509126 588.348432 +L 242.438059 614.415146 +L 242.515049 592.689255 +L 242.669028 632.456056 +L 242.538738 592.076562 +L 242.686795 628.120311 +L 242.799318 616.979711 +L 242.710484 635.677679 +L 242.811163 620.248836 +L 242.817085 621.753924 +L 242.834852 602.679136 +L 242.923686 571.473884 +L 242.953298 589.054009 +L 243.101355 618.741186 +L 243.125044 614.889217 +L 243.130966 614.854793 +L 243.261257 593.922064 +L 243.308635 612.944813 +L 243.367858 593.318697 +L 243.456692 585.831782 +L 243.397469 596.758808 +L 243.480381 588.461789 +L 243.545526 598.972141 +L 243.569216 586.805084 +L 243.58106 589.944248 +L 243.65805 580.206261 +L 243.616594 593.241119 +L 243.693584 587.442665 +L 243.717273 593.764008 +L 243.73504 581.458994 +L 243.794262 574.060301 +L 243.758729 586.566672 +L 243.817952 585.654821 +L 243.912708 609.669996 +L 243.853485 584.572653 +L 243.94232 598.376252 +L 243.948242 599.696376 +L 243.989698 584.825155 +L 243.99562 583.757929 +L 244.013387 595.321663 +L 244.054843 603.394002 +L 244.114066 586.753987 +L 244.119988 587.151332 +L 244.137755 582.710469 +L 244.173289 559.338449 +L 244.214745 588.064535 +L 244.226589 586.928583 +L 244.374646 621.8315 +L 244.41018 621.647306 +L 244.504937 600.338558 +L 244.534548 605.759998 +L 244.652994 583.669808 +L 244.56416 607.874144 +L 244.688528 589.187275 +L 244.82474 615.428588 +L 244.753673 587.920115 +L 244.872119 611.379013 +L 244.883963 604.634384 +L 244.955031 625.267689 +L 244.972797 614.224451 +L 245.014253 618.142713 +L 245.043865 611.462015 +L 245.061632 615.537058 +L 245.073476 607.732322 +L 245.10901 618.72865 +L 245.174155 612.907265 +L 245.203767 617.903028 +L 245.191922 612.246666 +L 245.209689 616.001797 +L 245.286679 597.041309 +L 245.322212 601.227012 +L 245.328135 605.194944 +L 245.399202 579.067505 +L 245.411047 587.763666 +L 245.470269 572.719286 +L 245.511725 596.259999 +L 245.517648 597.373439 +L 245.541337 582.779911 +L 245.553181 583.326697 +L 245.576871 599.455759 +L 245.612404 579.719118 +L 245.659783 587.41808 +L 245.665705 578.057617 +L 245.754539 608.571286 +L 245.760462 601.668019 +L 245.855218 582.285146 +L 245.878907 584.884232 +L 245.979586 625.420184 +L 246.01512 621.375367 +L 246.115799 607.151646 +L 246.121721 610.234107 +L 246.139488 624.93918 +L 246.204633 600.957069 +L 246.228322 606.576069 +L 246.2757 611.024445 +L 246.246089 601.068079 +L 246.334923 605.595069 +L 246.405991 591.021379 +L 246.435602 606.861235 +L 246.447447 604.424666 +L 246.595504 582.258518 +L 246.779095 631.331185 +L 246.790939 623.34186 +L 246.826473 609.267804 +L 246.838318 609.315975 +L 246.856085 597.077815 +L 246.950841 600.298393 +L 247.063365 623.96389 +L 247.098898 621.654641 +L 247.152199 602.574505 +L 247.187733 623.934749 +L 247.217344 612.297785 +L 247.241033 609.982357 +L 247.276567 626.145959 +L 247.306178 632.531358 +L 247.365401 611.458286 +L 247.377246 620.82119 +L 247.448313 607.969752 +L 247.501614 614.46573 +L 247.513458 622.046755 +L 247.531225 612.368047 +L 247.608215 618.953711 +L 247.756272 576.855981 +L 247.851029 592.133659 +L 247.774039 570.249378 +L 247.88064 583.812757 +L 247.886562 575.980781 +L 247.95763 601.516116 +L 247.981319 593.482567 +L 248.03462 575.806886 +L 248.093842 600.033118 +L 248.135298 584.814521 +L 248.182677 608.593604 +L 248.188599 607.886682 +L 248.212288 615.151609 +L 248.277433 601.024908 +L 248.289278 600.446291 +L 248.336656 578.407563 +L 248.407724 590.545086 +L 248.520247 604.798577 +L 248.44918 585.621444 +L 248.532092 601.930298 +L 248.603159 573.057504 +L 248.674226 577.602007 +L 248.697916 574.51479 +L 248.715682 587.445234 +L 248.768983 581.168102 +L 248.780828 589.88723 +L 248.804517 574.961119 +L 248.822284 576.381076 +L 248.834128 573.078951 +L 248.86374 588.604602 +L 248.881507 588.032775 +L 248.970341 607.816545 +L 248.99403 598.57465 +L 249.011797 592.871511 +L 249.059175 616.172967 +L 249.076942 619.324239 +L 249.106553 612.24571 +L 249.130243 613.734104 +L 249.148009 602.569969 +L 249.248688 608.746009 +L 249.40859 587.423491 +L 249.266455 615.053317 +L 249.426357 602.956411 +L 249.450046 610.494791 +L 249.491502 597.778089 +L 249.521113 600.245848 +L 249.544803 591.981933 +L 249.609948 615.596383 +L 249.621792 608.522256 +L 249.681015 615.013951 +L 249.710627 602.567718 +L 249.722471 609.647764 +L 249.829072 582.986867 +L 249.858684 593.744789 +L 249.864606 592.230659 +L 249.90014 611.089112 +L 249.906062 611.121845 +L 249.95344 599.779921 +L 249.994896 615.802961 +L 250.006741 630.454192 +L 250.042275 611.341536 +L 250.10742 619.771627 +L 250.137031 622.02676 +L 250.154798 618.123771 +L 250.338389 580.134401 +L 250.415379 592.355701 +L 250.39169 571.178874 +L 250.450912 584.424186 +L 250.456835 582.45653 +L 250.52198 596.806947 +L 250.533824 607.348081 +L 250.604892 590.913453 +L 250.622659 594.590314 +L 250.640426 581.930401 +L 250.723338 600.457492 +L 250.764794 619.482406 +L 250.812172 595.007383 +L 250.824016 600.286693 +L 250.847706 585.736866 +L 250.895084 605.450117 +L 250.93654 596.105592 +L 250.942462 594.307065 +L 250.983918 609.871482 +L 251.007607 606.839779 +L 251.037219 613.597515 +L 251.108286 601.241579 +L 251.131975 590.313552 +L 251.214887 606.133542 +L 251.22081 609.075464 +L 251.27411 588.264084 +L 251.291877 593.781566 +L 251.297799 586.985208 +L 251.380711 612.20657 +L 251.386634 610.325277 +L 251.392556 610.26616 +L 251.48139 576.895548 +L 251.522846 588.266865 +L 251.599836 623.419939 +L 251.694593 601.185524 +L 251.718282 586.854324 +L 251.76566 611.523935 +L 251.783427 603.792866 +L 251.813038 614.862773 +L 251.884106 610.760223 +L 251.978862 589.250889 +L 251.996629 604.610543 +L 252.008474 600.583258 +L 252.014396 610.354503 +L 252.026241 608.455673 +L 252.115075 619.917791 +L 252.138764 616.419219 +L 252.245365 600.553833 +L 252.263132 600.729182 +L 252.3342 611.571757 +L 252.357889 597.228004 +L 252.363811 598.898789 +L 252.434878 583.566341 +L 252.393422 599.835363 +L 252.458568 597.16334 +L 252.470412 604.548748 +L 252.535557 588.278194 +L 252.559246 591.159173 +L 252.571091 586.103058 +L 252.624392 602.300624 +L 252.630314 601.164201 +L 252.695459 618.567238 +L 252.742837 605.597621 +L 252.754682 598.761717 +L 252.813905 621.009281 +L 252.837594 613.851498 +L 252.855361 617.842203 +L 252.87905 603.891197 +L 252.896817 608.460223 +L 252.991573 594.97348 +L 252.950117 622.466934 +L 253.015262 601.507889 +L 253.08633 632.156179 +L 253.151475 618.615997 +L 253.234387 607.83867 +L 253.263999 615.492518 +L 253.299532 610.340545 +L 253.281765 623.320373 +L 253.329144 618.865178 +L 253.429823 627.550343 +L 253.388367 616.990019 +L 253.435745 625.322189 +L 253.50089 593.821226 +L 253.554191 613.176641 +L 253.57788 632.486958 +L 253.654869 611.818096 +L 253.660792 612.398394 +L 253.684481 608.811521 +L 253.690403 612.995887 +L 253.70817 626.357092 +L 253.797004 609.56131 +L 253.820693 603.139347 +L 253.826616 613.388088 +L 253.856227 609.941399 +L 253.862149 613.07069 +L 253.939139 597.441895 +L 253.962828 611.548519 +L 254.093119 584.303659 +L 253.986517 611.975278 +L 254.128652 595.908113 +L 254.146419 606.183282 +L 254.187875 589.996572 +L 254.235253 597.717687 +L 254.258943 585.974262 +L 254.312243 601.172402 +L 254.347777 593.688709 +L 254.418844 614.825677 +L 254.478067 610.440675 +L 254.48399 611.166498 +L 254.495834 599.698722 +L 254.513601 587.145977 +L 254.608358 590.197686 +L 254.61428 590.289077 +L 254.632047 578.555233 +L 254.69127 599.325663 +L 254.714959 598.246595 +L 254.839327 612.186708 +L 254.756415 591.628008 +L 254.851171 605.998549 +L 254.863016 603.469236 +L 254.999228 567.312143 +L 255.005151 572.357694 +L 255.070296 560.179586 +L 255.099907 567.476421 +L 255.10583 562.373855 +L 255.165052 583.139642 +L 255.206508 566.876085 +L 255.230198 577.520752 +L 255.307187 562.758088 +L 255.31311 561.585813 +L 255.336799 572.128516 +L 255.378255 566.77186 +L 255.514467 598.232201 +L 255.52039 593.222459 +L 255.57369 607.969075 +L 255.615146 603.730118 +L 255.674369 618.539962 +L 255.626991 603.239366 +L 255.721747 606.504651 +L 255.792815 584.797073 +L 255.840193 590.858129 +L 255.946794 605.245498 +L 255.929027 590.451205 +L 255.958639 597.948119 +L 256.088929 584.356776 +L 255.976406 602.433806 +L 256.094851 585.531066 +L 256.19553 611.525554 +L 256.219219 600.42521 +L 256.296209 583.878734 +L 256.278442 603.009605 +L 256.331743 596.836097 +L 256.420577 603.40619 +L 256.385043 583.795666 +L 256.4265 597.915294 +L 256.432422 591.936976 +L 256.497567 611.804233 +L 256.533101 599.697729 +L 256.592324 631.42451 +L 256.550868 597.32742 +L 256.651546 610.379368 +L 256.752225 574.365447 +L 256.781837 589.998225 +L 256.835137 592.305043 +L 256.811448 585.982473 +L 256.852904 589.669469 +L 256.918049 584.460721 +L 256.900282 593.163053 +L 256.959505 589.638896 +L 256.97135 587.586018 +L 257.036495 607.491206 +L 257.083873 597.895333 +L 257.089796 590.103667 +L 257.172708 611.823833 +L 257.17863 619.860978 +L 257.267464 602.592892 +L 257.285231 590.163634 +L 257.314842 603.69242 +L 257.368143 598.974885 +L 257.374065 608.250106 +L 257.456977 596.214656 +L 257.474744 602.300748 +L 257.492511 595.03095 +L 257.545812 622.207792 +L 257.764936 583.102104 +L 257.806392 599.429344 +L 257.836004 607.889211 +L 257.87746 583.612007 +L 257.901149 588.385389 +L 258.019595 607.147784 +L 258.043284 598.725629 +L 258.066973 593.888336 +L 258.108429 612.834486 +L 258.179496 627.598379 +L 258.220952 613.586246 +L 258.274253 601.667067 +L 258.327553 612.601008 +L 258.34532 625.292519 +L 258.404543 611.280972 +L 258.457844 621.434194 +L 258.534833 602.99617 +L 258.576289 610.949153 +L 258.582212 611.053343 +L 258.700658 597.165224 +L 258.623668 619.396272 +L 258.712502 598.280711 +L 258.730269 589.298516 +L 258.771725 596.728933 +L 258.878326 625.510916 +L 258.896093 616.962778 +L 258.96716 625.996866 +L 259.014539 605.143435 +L 259.026383 602.255843 +L 259.073762 610.348301 +L 259.150751 631.643452 +L 259.204052 628.410526 +L 259.209974 628.790076 +L 259.221819 623.97311 +L 259.346187 606.883333 +L 259.352109 608.047033 +L 259.358031 613.404787 +L 259.429099 579.923383 +L 259.440943 588.337344 +L 259.512011 600.757333 +L 259.529778 586.6498 +L 259.547544 590.189387 +L 259.606767 578.138605 +L 259.648223 590.62128 +L 259.654146 588.043343 +L 259.683757 598.422482 +L 259.731135 580.457893 +L 259.766669 597.579234 +L 259.855503 580.62703 +L 259.790358 602.941662 +L 259.896959 585.108109 +L 260.021327 618.063958 +L 259.956182 574.471536 +L 260.02725 617.517977 +L 260.145695 605.478039 +L 260.098317 625.186147 +L 260.15754 608.104673 +L 260.181229 621.698359 +L 260.23453 604.888573 +L 260.270063 612.245979 +L 260.293753 606.415544 +L 260.317442 622.541242 +L 260.335209 635.367213 +L 260.370742 613.280362 +L 260.418121 619.562827 +L 260.554333 588.983987 +L 260.566178 593.1345 +L 260.690546 618.748274 +L 260.595789 592.338128 +L 260.732002 609.572528 +L 260.838603 584.305426 +L 260.850448 596.337587 +L 260.939282 614.38469 +L 260.974816 611.012662 +L 261.010349 595.67143 +L 261.069572 612.72691 +L 261.075494 612.550936 +L 261.081417 612.477431 +L 261.111028 598.887301 +L 261.152484 620.518512 +L 261.170251 618.961302 +L 261.247241 635.610543 +L 261.294619 633.388363 +L 261.312386 644.095992 +L 261.34792 619.196433 +L 261.454521 601.402636 +L 261.377531 632.394609 +L 261.47821 606.944335 +L 261.513744 601.622596 +L 261.543355 609.642434 +L 261.572966 602.403734 +L 261.649956 597.441998 +L 261.691412 615.993924 +L 261.697334 615.899582 +L 261.851314 562.429968 +L 261.863159 567.927256 +L 262.141506 620.239087 +L 262.159273 613.831875 +L 262.277719 576.094392 +L 262.289563 589.094696 +L 262.295485 588.475466 +L 262.30733 596.733274 +L 262.336941 602.216191 +L 262.396164 588.238609 +L 262.413931 595.273664 +L 262.449465 601.895794 +L 262.490921 591.89321 +L 262.496843 588.586661 +L 262.544221 607.437076 +L 262.573833 606.096492 +L 262.615289 616.873393 +L 262.650823 599.158751 +L 262.680434 606.134471 +L 262.751501 591.282081 +L 262.787035 605.318005 +L 262.834413 630.538098 +L 262.881792 587.151813 +L 262.887714 586.344758 +L 262.911403 592.764406 +L 262.92917 591.983427 +L 263.035771 620.693124 +L 262.970626 590.056976 +L 263.065383 620.400503 +L 263.207518 580.126869 +L 263.08315 621.420796 +L 263.243051 604.749161 +L 263.331886 631.785618 +L 263.385186 622.54229 +L 263.438487 615.108235 +L 263.479943 630.626473 +L 263.491787 625.375195 +L 263.687223 590.436378 +L 263.509554 626.745045 +L 263.722756 596.450815 +L 263.770135 617.052891 +L 263.829358 603.467991 +L 263.83528 597.556632 +L 263.858969 617.00254 +L 263.924114 615.229568 +L 263.930036 615.047115 +L 264.012949 586.091127 +L 264.066249 589.299514 +L 264.072171 589.136413 +L 264.161006 619.224047 +L 264.202462 617.619968 +L 264.291296 603.471891 +L 264.279451 622.082786 +L 264.314985 611.905673 +L 264.344597 612.633347 +L 264.445275 595.429143 +L 264.575566 626.259754 +L 264.670322 598.691705 +L 264.688089 609.922132 +L 264.735467 631.621745 +L 264.79469 614.124902 +L 264.895369 592.343395 +L 264.836146 614.769977 +L 264.924981 603.962892 +L 264.984203 623.478104 +L 264.942747 602.798773 +L 265.049349 613.955983 +L 265.120416 602.851402 +L 265.15595 616.692405 +L 265.167794 619.541386 +L 265.197406 609.432543 +L 265.250706 612.089441 +L 265.28624 604.668634 +L 265.268473 616.653488 +L 265.321774 616.536973 +L 265.345463 631.979433 +L 265.392841 604.040829 +L 265.410608 608.398381 +L 265.41653 608.408508 +L 265.428375 609.429789 +L 265.434297 617.110011 +L 265.469831 596.191237 +L 265.529054 600.12539 +L 265.552743 598.719094 +L 265.576432 603.402603 +L 265.677111 586.315849 +L 265.62381 607.483449 +L 265.694878 587.199913 +L 265.706722 586.564101 +L 265.718567 589.298035 +L 265.813324 581.767783 +L 265.783712 589.605928 +L 265.825168 587.890817 +L 265.85478 604.179984 +L 265.937692 589.760548 +L 266.026526 576.719588 +L 266.044293 590.76878 +L 266.091671 612.260191 +L 266.174583 604.132513 +L 266.216039 620.652291 +L 266.293029 596.611854 +L 266.411475 606.191972 +L 266.340407 582.456512 +L 266.417397 603.334085 +L 266.523998 594.469168 +L 266.494387 606.749434 +L 266.535843 594.943885 +L 266.713511 626.886889 +L 266.719433 622.87021 +L 266.843801 588.006113 +L 266.849724 589.546609 +L 266.968169 564.611059 +L 266.903024 599.591547 +L 266.991859 569.791789 +L 267.116227 601.137245 +L 267.139916 593.198716 +L 267.287973 564.260203 +L 267.30574 568.819542 +L 267.477486 600.049821 +L 267.483408 595.308798 +L 267.536709 615.658407 +L 267.578165 605.446071 +L 267.613699 600.902243 +L 267.649232 610.670862 +L 267.655155 620.578187 +L 267.738067 601.942177 +L 267.755834 606.117524 +L 267.779523 600.509367 +L 267.826901 613.503622 +L 267.856512 611.777765 +L 267.862435 611.868161 +L 267.868357 614.057782 +L 267.921658 596.415849 +L 267.939424 601.247366 +L 268.046026 573.649372 +L 268.075637 590.44157 +L 268.081559 590.425373 +L 268.117093 601.17222 +L 268.128938 599.848614 +L 268.146704 612.480689 +L 268.241461 611.338446 +L 268.253306 601.688089 +L 268.318451 621.349449 +L 268.348062 612.161049 +L 268.466508 601.639533 +L 268.371751 618.274167 +L 268.47243 603.094745 +L 268.502042 612.295562 +L 268.519809 594.298516 +L 268.590876 608.692716 +L 268.709322 587.833632 +L 268.644177 612.268649 +L 268.733011 593.933439 +L 268.786311 604.937455 +L 268.815923 590.080611 +L 268.851457 598.449655 +L 268.928446 603.205542 +L 268.875146 591.24568 +L 268.96398 599.638324 +L 269.052814 615.404503 +L 268.987669 594.022014 +L 269.058737 614.989211 +L 269.064659 622.603668 +L 269.147571 587.047155 +L 269.153493 585.187335 +L 269.183105 598.780602 +L 269.242327 586.289877 +L 269.295628 595.694371 +L 269.313395 577.675174 +L 269.348929 582.771204 +L 269.366695 567.514842 +L 269.461452 575.265157 +L 269.538442 597.949002 +L 269.579898 588.127179 +L 269.692421 621.992642 +L 269.722033 617.911588 +L 269.781256 624.826071 +L 269.733877 616.245955 +L 269.7931 618.753827 +L 269.828634 605.458123 +L 269.864168 627.653535 +L 269.893779 626.482709 +L 269.911546 633.669066 +L 269.917468 640.775686 +L 269.982613 594.207445 +L 269.994458 600.932302 +L 270.00038 604.785297 +L 270.065525 585.435464 +L 270.095137 598.022794 +L 270.106981 593.439971 +L 270.172126 614.239631 +L 270.278728 634.583038 +L 270.314261 622.6311 +L 270.373484 604.147834 +L 270.426785 609.362854 +L 270.432707 609.23105 +L 270.509697 636.305059 +L 270.462318 606.480486 +L 270.562997 624.233245 +L 270.580764 627.327123 +L 270.592609 621.52172 +L 270.716977 590.13328 +L 270.728821 597.432062 +L 270.734744 597.598858 +L 270.841345 616.81592 +L 270.859112 613.720083 +L 270.918335 583.54737 +L 271.001247 585.34265 +L 271.107848 618.297589 +L 271.137459 609.091768 +L 271.232216 616.855532 +L 271.172993 605.93133 +L 271.24406 610.49512 +L 271.303283 590.746756 +L 271.362506 601.384114 +L 271.457263 606.791966 +L 271.403962 594.059514 +L 271.469107 604.584047 +L 271.552019 598.411582 +L 271.504641 615.77628 +L 271.575708 603.39555 +L 271.670465 626.071984 +L 271.705999 608.960774 +L 271.771144 580.446036 +L 271.818522 604.446163 +L 271.836289 610.297579 +L 271.859978 601.777775 +L 271.883667 604.389444 +L 272.025802 565.572279 +L 272.031724 569.360579 +L 272.126481 580.712653 +L 272.07318 566.38673 +L 272.15017 579.880403 +L 272.310072 607.110449 +L 272.197548 566.576744 +L 272.321916 601.06231 +L 272.327839 595.417318 +L 272.369295 612.021071 +L 272.428518 597.458988 +L 272.440362 610.109436 +L 272.464051 593.307842 +L 272.535119 597.926276 +L 272.700943 565.937741 +L 272.71871 573.969596 +L 272.795699 592.387953 +L 272.831233 575.755603 +L 272.872689 590.726431 +L 272.931912 574.404468 +L 272.937834 573.30117 +L 272.967446 584.906848 +L 273.127347 618.78645 +L 272.985213 584.620996 +L 273.13327 618.002778 +L 273.18657 598.620001 +L 273.245793 612.059694 +L 273.287249 617.604678 +L 273.310938 607.422301 +L 273.34055 600.844954 +L 273.39385 620.24307 +L 273.411617 609.623252 +L 273.417539 615.613583 +L 273.506374 593.879985 +L 273.559674 613.867758 +L 273.595208 590.710666 +L 273.618897 601.938466 +L 273.660353 577.478832 +L 273.737343 592.102781 +L 273.784721 585.266623 +L 273.749187 594.960615 +L 273.838022 594.431487 +L 273.903167 603.419503 +L 273.950545 601.239011 +L 274.021613 577.89317 +L 274.068991 590.964094 +L 274.104525 586.569313 +L 274.140058 600.022639 +L 274.16967 619.803443 +L 274.294038 612.614102 +L 274.353261 592.816779 +L 274.400639 607.96808 +L 274.459862 627.6703 +L 274.519085 618.901258 +L 274.619764 596.88293 +L 274.63753 600.785808 +L 274.655297 610.351417 +L 274.667142 594.675705 +L 274.673064 595.526401 +L 274.732287 582.558621 +L 274.773743 597.57914 +L 274.785588 591.496215 +L 274.915878 617.564229 +L 275.028401 564.129889 +L 275.093547 583.749625 +L 275.117236 598.109107 +L 275.20607 585.733032 +L 275.318593 607.678321 +L 275.354127 606.622051 +L 275.448884 593.832831 +L 275.425195 614.409658 +L 275.472573 602.224864 +L 275.478495 603.947282 +L 275.519951 585.459145 +L 275.549563 579.756675 +L 275.567329 594.59937 +L 275.579174 593.394173 +L 275.591019 592.382255 +L 275.608785 578.766877 +L 275.662086 615.678185 +L 275.691697 604.440602 +L 275.739076 597.226784 +L 275.721309 609.799781 +L 275.762765 603.600111 +L 275.768687 612.223945 +L 275.863444 593.257414 +L 275.869366 599.605139 +L 275.910822 610.52761 +L 275.893055 595.787778 +L 275.9582 596.828427 +L 275.987812 594.256453 +L 275.98189 601.922503 +L 276.029268 597.313354 +L 276.11218 612.814696 +L 276.147714 608.407485 +L 276.212859 623.126934 +L 276.272082 619.899187 +L 276.343149 596.397565 +L 276.390527 615.36073 +L 276.556351 573.718734 +L 276.402372 616.816393 +L 276.597807 578.004845 +L 276.65703 583.91676 +L 276.621496 573.602921 +L 276.692564 578.011536 +L 276.698486 573.438145 +L 276.769554 591.726382 +L 276.78732 589.229516 +L 276.870232 568.176081 +L 276.799165 591.691 +L 276.887999 584.35331 +L 277.012367 622.983052 +L 277.178191 573.681786 +L 277.249259 596.72722 +L 277.290715 575.1305 +L 277.361782 565.81617 +L 277.415083 585.82186 +L 277.421005 583.889549 +L 277.474306 597.736815 +L 277.48615 594.280342 +L 277.598674 616.152855 +L 277.539451 585.668839 +L 277.610518 612.475885 +L 277.616441 610.167044 +L 277.681586 622.249913 +L 277.711197 614.449498 +L 277.723042 623.212207 +L 277.746731 615.051245 +L 277.782265 616.518825 +L 277.882943 580.091869 +L 277.9777 603.42076 +L 277.918477 578.302201 +L 278.001389 587.491993 +L 278.048767 578.530749 +L 278.078379 591.784411 +L 278.096146 586.535138 +L 278.102068 591.885474 +L 278.137602 579.695923 +L 278.190902 580.035171 +L 278.208669 573.510217 +L 278.267892 599.783643 +L 278.273814 599.543662 +L 278.410027 584.892964 +L 278.33896 602.588774 +L 278.415949 586.16511 +L 278.54624 614.13624 +L 278.682452 576.083833 +L 278.694297 579.08635 +L 278.72983 580.98996 +L 278.759442 567.675448 +L 278.765364 564.641425 +L 278.842354 577.34969 +L 278.866043 589.900877 +L 278.895654 573.69079 +L 278.954877 580.748311 +L 278.978566 587.392939 +L 279.031867 572.894065 +L 279.037789 574.551946 +L 279.049634 561.348225 +L 279.114779 584.858322 +L 279.138468 578.091976 +L 279.203613 601.732497 +L 279.256914 593.347198 +L 279.416816 646.05452 +L 279.476039 634.999927 +L 279.576717 614.103878 +L 279.594484 619.582615 +L 279.689241 616.189364 +L 279.71293 634.456198 +L 279.801764 591.3962 +L 279.724775 636.056319 +L 279.860987 596.599253 +L 279.961666 573.780192 +L 279.878754 598.785715 +L 279.991277 578.60158 +L 280.032733 571.037168 +L 280.109723 592.871351 +L 280.115645 590.568506 +L 280.133412 606.139317 +L 280.198557 595.344246 +L 280.210402 603.156881 +L 280.222247 590.432432 +L 280.305159 600.727343 +L 280.393993 591.327093 +L 280.328848 605.762327 +L 280.417682 591.82144 +L 280.423604 596.481985 +L 280.476905 568.143673 +L 280.506516 577.345456 +L 280.518361 572.024065 +L 280.589428 579.470166 +L 280.607195 576.85624 +L 280.660496 596.44317 +L 280.725641 587.621174 +L 280.855931 571.928513 +L 280.773019 590.525468 +L 280.87962 572.11219 +L 280.915154 594.040909 +L 280.998066 593.004163 +L 281.027678 584.329339 +L 281.080978 599.536558 +L 281.187579 615.195392 +L 281.128356 597.648306 +L 281.193502 608.128408 +L 281.211268 595.054206 +L 281.29418 613.697191 +L 281.400782 626.295604 +L 281.359326 599.378614 +L 281.418549 621.973567 +L 281.513305 579.802053 +L 281.548839 595.843244 +L 281.679129 622.371003 +L 281.619906 594.106302 +L 281.690974 617.018856 +L 281.720585 624.562814 +L 281.750197 614.463316 +L 281.767963 620.518566 +L 281.868642 593.042146 +L 281.880487 596.763272 +L 281.892331 603.432582 +L 281.963399 578.460262 +L 281.987088 564.965395 +L 282.052233 580.142165 +L 282.087767 565.967165 +L 282.141067 577.169706 +L 282.182523 564.391757 +L 282.206213 547.325345 +L 282.271358 575.235585 +L 282.27728 574.134201 +L 282.336503 578.521211 +L 282.300969 564.121162 +L 282.377959 567.626948 +L 282.437182 581.910478 +L 282.508249 574.552508 +L 282.526016 570.820323 +L 282.567472 581.489155 +L 282.626695 604.574851 +L 282.674073 579.416492 +L 282.679996 579.558397 +L 282.685918 579.294087 +L 282.709607 569.729419 +L 282.76883 593.234828 +L 282.774752 591.150097 +L 282.780674 596.253981 +L 282.804364 577.870713 +L 282.875431 582.835587 +L 282.887276 585.402442 +L 282.905042 577.180656 +L 282.993877 549.261342 +L 283.02941 560.275738 +L 283.059022 550.651116 +L 283.218924 600.043254 +L 283.355136 624.878114 +L 283.230768 599.835337 +L 283.384748 618.799225 +L 283.449893 602.094022 +L 283.485426 626.744989 +L 283.491349 622.060782 +L 283.586105 634.69165 +L 283.538727 617.495168 +L 283.609795 627.384017 +L 283.763774 589.266306 +L 283.775619 588.096983 +L 283.811152 606.221242 +L 283.822997 621.505296 +L 283.923676 611.395201 +L 283.929598 612.292455 +L 283.941443 606.980612 +L 283.965132 608.333302 +L 284.048044 584.726235 +L 284.0895 592.248452 +L 284.166489 601.661297 +L 284.1428 586.902027 +L 284.202023 596.042385 +L 284.290857 621.471037 +L 284.326391 611.053175 +L 284.391536 595.050785 +L 284.444837 600.083448 +L 284.55736 611.232401 +L 284.468526 593.543234 +L 284.563283 606.886547 +L 284.586972 594.558617 +L 284.628428 613.328305 +L 284.669884 605.616814 +L 284.705418 612.019119 +L 284.746874 601.83144 +L 284.853475 584.134616 +L 284.865319 589.676673 +L 284.924542 597.246828 +L 284.883086 580.629172 +L 284.977843 591.84334 +L 285.078522 604.212725 +L 285.019299 584.658605 +L 285.102211 598.48197 +L 285.1259 581.213228 +L 285.196967 599.325553 +L 285.220656 590.935307 +L 285.303568 608.329386 +L 285.232501 589.775616 +L 285.350947 594.212099 +L 285.362791 590.258045 +L 285.41017 615.414494 +L 285.439781 603.356991 +L 285.481237 593.384595 +L 285.499004 606.849041 +L 285.504926 603.240223 +L 285.54046 617.273289 +L 285.605605 601.494746 +L 285.688517 583.057704 +L 285.718129 600.411914 +L 285.812885 580.296222 +L 285.907642 583.668106 +L 286.073466 620.140362 +L 286.08531 619.569776 +L 286.108999 607.152635 +L 286.209678 613.706542 +L 286.351813 600.023878 +L 286.268901 619.199888 +L 286.357735 600.15189 +L 286.363658 604.464038 +L 286.416958 592.843095 +L 286.452492 593.18482 +L 286.470259 581.834185 +L 286.541326 601.729127 +L 286.547249 600.389175 +L 286.695306 614.622918 +L 286.588705 599.375848 +L 286.701228 611.719138 +L 286.70715 609.187902 +L 286.760451 625.500332 +L 286.795985 615.155206 +L 286.86113 620.168176 +L 286.825596 602.822123 +L 286.890741 611.023235 +L 286.896664 609.615466 +L 286.926275 627.683132 +L 286.932197 634.976059 +L 286.99142 619.617037 +L 287.032876 627.772116 +L 287.103944 608.840716 +L 287.074332 629.197516 +L 287.157244 615.265724 +L 287.228312 613.962271 +L 287.281612 629.404829 +L 287.334913 618.736786 +L 287.376369 641.93079 +L 287.382291 639.921511 +L 287.394136 641.98321 +L 287.441514 631.005091 +L 287.453358 621.389577 +L 287.518504 632.288489 +L 287.554037 623.670489 +L 287.55996 624.49533 +L 287.583649 614.456882 +L 287.654716 607.83632 +L 287.672483 618.581173 +L 287.684328 614.977574 +L 287.713939 628.348149 +L 287.76724 605.32347 +L 287.808696 596.173547 +L 287.856074 612.550257 +L 287.903452 624.234557 +L 287.938986 609.45526 +L 287.950831 610.021212 +L 288.021898 597.290729 +L 288.063354 604.393946 +L 288.069276 605.634746 +L 288.10481 594.221146 +L 288.140344 587.907504 +L 288.187722 601.133162 +L 288.199567 596.832829 +L 288.217333 610.492078 +L 288.306168 599.588662 +L 288.329857 587.228191 +L 288.383157 602.425073 +L 288.418691 595.510368 +L 288.602282 631.413153 +L 288.430536 593.292295 +L 288.620049 628.047705 +L 288.631893 630.983363 +L 288.679272 603.350224 +L 288.762184 595.788963 +L 288.708883 609.398314 +L 288.791795 600.736434 +L 288.797717 602.998472 +L 288.862863 588.15319 +L 288.868785 589.922831 +L 288.928008 571.730445 +L 288.993153 572.168474 +L 289.153055 601.150761 +L 289.158977 596.793058 +L 289.366257 640.778137 +L 289.2182 585.82137 +L 289.384024 631.284973 +L 289.514314 614.510988 +L 289.532081 622.530018 +L 289.573537 599.903534 +L 289.626838 618.231065 +L 289.757128 606.327655 +L 289.662371 625.722298 +L 289.76305 607.773343 +L 289.798584 617.014977 +L 289.845962 597.216197 +L 289.869651 608.230282 +L 289.982175 590.541268 +L 289.905185 610.472148 +L 289.994019 590.564983 +L 290.076931 621.538904 +L 290.136154 611.180415 +L 290.159843 599.841032 +L 290.213144 616.286623 +L 290.242755 607.977709 +L 290.307901 625.027191 +L 290.349357 605.985787 +L 290.438191 586.909479 +L 290.467802 599.982796 +L 290.550714 616.524364 +L 290.580326 608.588844 +L 290.681005 597.51275 +L 290.615859 614.289035 +L 290.692849 599.871081 +L 290.704694 606.610569 +L 290.769839 595.352145 +L 290.79945 600.168502 +L 290.935663 567.007216 +L 290.971197 580.834312 +L 290.977119 580.536038 +L 290.983041 583.607527 +L 291.08372 606.238967 +L 291.101487 601.092112 +L 291.184399 580.570628 +L 291.119254 604.160467 +L 291.219933 587.337983 +L 291.267311 579.459858 +L 291.302845 595.784721 +L 291.314689 593.470462 +L 291.516047 624.016004 +L 291.539736 616.571296 +L 291.62857 599.079556 +L 291.658182 608.413173 +L 291.699638 610.709523 +L 291.70556 600.200812 +L 291.723327 601.810511 +L 291.747016 597.802881 +L 291.752938 601.117753 +L 291.824006 592.13684 +L 291.853617 612.060785 +L 291.865462 596.651679 +L 291.91284 584.722948 +L 292.001674 590.521561 +L 292.078664 606.635848 +L 292.126042 601.724057 +L 292.256333 574.185967 +L 292.167499 605.324352 +L 292.268177 576.403599 +L 292.339245 562.074195 +L 292.309633 581.194917 +L 292.362934 579.484002 +L 292.398468 602.582709 +L 292.475457 580.817028 +L 292.499147 602.049725 +L 292.528758 579.953052 +L 292.605748 591.604117 +L 292.635359 575.953401 +L 292.718271 584.039576 +L 292.824872 595.66769 +L 292.765649 576.498451 +L 292.836717 592.40183 +L 292.866328 580.708658 +L 292.901862 600.905814 +L 292.931473 591.056931 +L 292.996619 608.648747 +L 293.043997 597.971103 +L 293.055841 594.137391 +L 293.085453 609.711722 +L 293.138753 600.817625 +L 293.23351 616.68291 +L 293.251277 604.743937 +L 293.351956 593.947145 +L 293.322344 607.842764 +L 293.375645 595.407721 +L 293.458557 590.460024 +L 293.488168 604.27483 +L 293.500013 593.873411 +L 293.565158 626.680358 +L 293.577003 625.847787 +L 293.582925 627.291295 +L 293.630303 614.735726 +L 293.671759 601.101969 +L 293.742827 609.770873 +L 293.754671 617.101846 +L 293.837583 597.355043 +L 293.867195 593.94722 +L 293.926418 607.614982 +L 293.950107 609.942755 +L 293.997485 597.894936 +L 294.003407 589.575309 +L 294.068552 610.772186 +L 294.098164 607.200203 +L 294.21661 575.72265 +L 294.275832 583.042901 +L 294.299522 591.603194 +L 294.335055 569.395023 +L 294.364667 571.811848 +L 294.394278 564.944558 +L 294.417967 583.767279 +L 294.42389 582.159957 +L 294.47719 585.361938 +L 294.435734 578.026914 +L 294.483113 582.68103 +L 294.489035 578.699432 +L 294.566025 600.185431 +L 294.63117 580.584889 +L 294.648937 602.046002 +L 294.672626 599.013645 +L 294.68447 612.797278 +L 294.796994 611.351603 +L 294.802916 611.400055 +L 294.814761 607.862733 +L 294.83845 622.176109 +L 294.862139 619.212298 +L 294.974662 628.733571 +L 294.921362 614.079347 +L 294.980585 627.537994 +L 294.986507 627.1395 +L 294.992429 632.724294 +L 294.998351 630.628412 +L 295.057574 636.529758 +L 295.075341 621.454624 +L 295.087186 624.017478 +L 295.181942 598.260566 +L 295.211554 599.359153 +L 295.264854 612.365278 +L 295.223398 599.167885 +L 295.329999 602.309904 +L 295.335922 596.211563 +L 295.401067 610.02155 +L 295.436601 604.673523 +L 295.478057 572.046634 +L 295.578736 591.96349 +L 295.608347 606.751939 +L 295.66757 586.86069 +L 295.691259 594.655124 +L 295.697181 593.75029 +L 295.732715 601.160731 +L 295.738637 599.061122 +L 295.857083 625.983705 +L 295.892617 603.443299 +L 295.898539 605.087615 +L 295.922228 585.774092 +L 295.969606 608.296708 +L 296.011062 601.532514 +L 296.034752 595.173192 +L 296.088052 614.479787 +L 296.111741 610.861446 +L 296.265721 584.496395 +L 296.271643 588.188951 +L 296.360477 628.058854 +L 296.407856 616.22447 +L 296.478923 596.309044 +L 296.57368 600.400981 +L 296.597369 610.612205 +L 296.662514 590.039601 +L 296.763193 601.315626 +L 296.78096 591.409633 +L 296.828338 589.461812 +L 296.804649 599.160658 +L 296.852027 592.177603 +L 296.934939 612.273426 +L 296.964551 604.559778 +L 297.04154 592.225094 +L 297.071152 601.622359 +L 297.112608 609.558588 +L 297.094841 594.645852 +L 297.177753 598.882418 +L 297.183675 599.214187 +L 297.19552 597.149349 +L 297.201442 589.51112 +L 297.278432 620.267004 +L 297.290276 614.216343 +L 297.349499 626.618396 +L 297.385033 609.995269 +L 297.390955 613.598684 +L 297.497556 601.891153 +L 297.4561 613.988092 +L 297.509401 606.50838 +L 297.550857 631.295246 +L 297.616002 608.960354 +L 297.74037 596.806092 +L 297.764059 615.715 +L 297.858816 608.08532 +L 297.864738 608.180956 +L 297.87066 608.14246 +L 297.929883 586.476266 +L 297.89435 609.342328 +L 298.000951 589.095158 +L 298.089785 613.992592 +L 298.125319 597.053771 +L 298.190464 564.497028 +L 298.160852 603.216021 +L 298.249687 578.442652 +L 298.391822 612.73357 +L 298.522112 586.45926 +L 298.563568 589.319221 +L 298.628713 605.167626 +L 298.682014 597.930049 +L 298.759003 588.835671 +L 298.693858 598.806228 +L 298.800459 591.662308 +L 298.806382 591.804494 +L 298.812304 590.685531 +L 298.895216 600.156636 +L 298.924827 584.289406 +L 299.019584 604.705573 +L 298.960361 583.829447 +L 299.055118 596.786423 +L 299.155797 588.109895 +L 299.126185 602.151504 +L 299.167641 592.555372 +L 299.280165 626.70934 +L 299.185408 591.298762 +L 299.303854 609.751302 +L 299.315698 598.262419 +L 299.34531 614.333962 +L 299.440066 600.463973 +L 299.540745 630.21255 +L 299.499289 599.143807 +L 299.576279 611.255451 +L 299.60589 580.733517 +L 299.694725 594.777473 +L 299.718414 599.864553 +L 299.765792 580.404917 +L 299.789481 583.326442 +L 299.819093 576.43264 +L 299.854626 591.833849 +L 299.878316 587.822311 +L 299.931616 607.786495 +L 299.996761 598.825233 +L 300.055984 608.420384 +L 300.079673 595.104395 +L 300.127052 570.318564 +L 300.198119 585.996912 +L 300.334332 606.137937 +L 300.221808 583.555806 +L 300.340254 605.441405 +L 300.411321 583.699496 +L 300.4587 597.833981 +L 300.512 606.879761 +L 300.529767 590.550304 +L 300.559378 600.155794 +L 300.606757 591.533872 +L 300.64229 602.324355 +L 300.66598 602.188682 +L 300.725202 606.869217 +L 300.701513 592.087507 +L 300.760736 599.19453 +L 300.766658 599.087993 +L 300.861415 572.290095 +L 300.885104 593.22136 +L 300.979861 600.409704 +L 300.914716 585.693501 +L 300.985783 596.234833 +L 301.021317 567.762446 +L 301.104229 584.747514 +L 301.175296 599.269383 +L 301.151607 580.595832 +L 301.222675 593.461025 +L 301.275975 598.813586 +L 301.317431 589.037123 +L 301.329276 590.076912 +L 301.335198 587.703591 +L 301.465488 610.78778 +L 301.471411 607.206269 +L 301.542478 594.982901 +L 301.506944 615.8027 +L 301.578012 605.270988 +L 301.62539 621.70651 +L 301.696457 611.729574 +L 301.720147 603.066326 +L 301.797136 615.381282 +L 301.844515 620.156836 +L 301.862281 605.861618 +L 301.891893 606.862432 +L 302.022183 581.465136 +L 302.134707 605.126807 +L 302.146551 602.554232 +L 302.152474 595.761412 +L 302.229463 627.273025 +L 302.235386 626.981408 +L 302.253152 632.069953 +L 302.276842 629.902062 +L 302.341987 605.746268 +L 302.395287 613.741354 +L 302.40121 613.777489 +L 302.495966 628.331113 +L 302.513733 620.839307 +L 302.620334 609.826572 +L 302.555189 624.21894 +L 302.632179 612.551134 +L 302.638101 612.533194 +L 302.803925 574.443258 +L 302.66179 618.03353 +L 302.851303 578.771653 +L 302.874992 592.641731 +L 302.957904 583.181616 +L 302.963827 577.425082 +L 302.993438 590.254768 +L 303.064506 585.435225 +L 303.147418 604.181482 +L 303.15334 603.223069 +L 303.236252 618.296325 +L 303.182951 596.997546 +L 303.265863 610.821289 +L 303.354698 601.102817 +L 303.295475 618.18629 +L 303.378387 603.933876 +L 303.390231 611.69885 +L 303.467221 590.353516 +L 303.473143 590.995639 +L 303.479066 591.328855 +L 303.484988 588.377157 +L 303.532366 581.867133 +L 303.550133 597.12944 +L 303.585667 593.893632 +L 303.64489 582.304212 +L 303.680423 595.464364 +L 303.686346 590.078891 +L 303.69819 601.170522 +L 303.721879 580.659185 +L 303.798869 594.095144 +L 303.828481 584.98795 +L 303.887703 605.050411 +L 303.935082 617.401231 +L 303.988382 604.443967 +L 304.000227 610.077027 +L 304.077217 602.559005 +L 304.065372 616.583395 +L 304.11275 606.17258 +L 304.118673 609.76381 +L 304.177896 587.366426 +L 304.207507 598.039268 +L 304.219352 591.853971 +L 304.248963 605.761884 +L 304.284497 601.600085 +L 304.34372 611.286562 +L 304.385176 593.134614 +L 304.456243 582.507099 +L 304.479932 594.524954 +L 304.491777 584.322659 +L 304.539155 620.302117 +L 304.616145 610.781195 +L 304.633912 616.068765 +L 304.657601 596.619269 +L 304.710901 602.393872 +L 304.73459 599.199662 +L 304.799736 571.852903 +L 304.841192 600.438172 +L 305.012938 580.591888 +L 304.853036 604.524624 +L 305.01886 581.744128 +L 305.101772 603.333793 +L 305.137306 596.129436 +L 305.143228 595.165015 +L 305.166917 606.973089 +L 305.196529 604.543161 +L 305.232063 595.328268 +L 305.291285 586.527654 +L 305.332741 598.367468 +L 305.427498 607.157268 +L 305.391964 597.142412 +L 305.445265 604.04822 +L 305.468954 596.164339 +L 305.563711 578.77722 +L 305.581477 589.569 +L 305.593322 590.940522 +L 305.617011 607.008653 +L 305.652545 588.497362 +L 305.699923 594.872596 +L 305.824291 568.610081 +L 305.842058 573.488764 +L 305.954581 602.407356 +L 305.859825 569.638668 +L 306.013804 600.205592 +L 306.090794 589.871173 +L 306.108561 605.085532 +L 306.120405 598.357946 +L 306.13225 601.435404 +L 306.138172 594.39058 +L 306.167784 578.668243 +L 306.256618 586.228653 +L 306.351375 595.921821 +L 306.327686 574.496847 +L 306.375064 594.854814 +L 306.392831 583.309283 +L 306.457976 597.620707 +L 306.481665 594.990673 +L 306.564577 600.273567 +L 306.529043 587.327507 +L 306.588266 594.426721 +L 306.665256 580.297754 +L 306.688945 594.839674 +L 306.694867 591.690309 +L 306.765935 608.276946 +L 306.801468 590.436347 +L 306.825158 585.350631 +L 306.860691 606.456854 +L 306.866614 609.583631 +L 306.943603 593.292933 +L 307.109427 573.549872 +L 306.96137 594.495006 +L 307.127194 574.838084 +L 307.144961 584.200321 +L 307.227873 571.675846 +L 307.233795 572.248362 +L 307.316707 565.042385 +L 307.269329 581.385381 +L 307.328552 573.323305 +L 307.340397 579.813471 +L 307.37593 566.739617 +L 307.435153 569.414707 +L 307.446998 574.998088 +L 307.458842 567.565207 +L 307.476609 569.903148 +L 307.482531 564.731633 +L 307.559521 588.927977 +L 307.565443 586.854138 +L 307.571366 585.832109 +L 307.595055 599.251715 +L 307.606899 597.758343 +L 307.725345 621.140612 +L 307.754957 610.196796 +L 307.814179 584.276317 +L 307.885247 591.698606 +L 307.99777 608.166284 +L 307.926703 584.631753 +L 308.027382 599.759991 +L 308.122138 604.330897 +L 308.145827 586.445529 +L 308.169517 575.145254 +L 308.175439 569.331497 +L 308.252429 594.135578 +L 308.258351 597.791126 +L 308.335341 579.027469 +L 308.388641 570.408867 +L 308.43602 584.722372 +L 308.453786 583.766629 +L 308.459709 589.993756 +L 308.483398 608.273519 +L 308.56631 596.205513 +L 308.595921 587.681692 +L 308.666989 604.651071 +L 308.743978 615.100156 +L 308.678833 601.313989 +L 308.77359 607.476111 +L 308.815046 595.825065 +L 308.892036 599.167205 +L 308.951258 610.277171 +L 308.986792 590.251356 +L 308.992714 590.765116 +L 309.004559 582.587751 +L 309.028248 584.667488 +L 309.11116 591.363961 +L 309.152616 577.392172 +L 309.158538 577.549729 +L 309.164461 576.447215 +L 309.253295 566.805959 +L 309.276984 571.28027 +L 309.377663 581.772746 +L 309.312518 567.340134 +L 309.389508 572.394767 +L 309.549409 627.045215 +L 309.596788 619.411788 +L 309.6797 593.648221 +L 309.738923 593.985112 +L 309.786301 619.752477 +L 309.863291 616.364059 +L 309.946203 609.192867 +L 309.934358 620.464419 +L 309.958047 618.128279 +L 309.963969 620.449909 +L 310.029115 608.638372 +L 310.052804 615.378071 +L 310.135716 598.566473 +L 310.189016 604.74877 +L 310.194939 610.441649 +L 310.254161 593.129482 +L 310.283773 598.582313 +L 310.372607 593.052305 +L 310.319307 602.359513 +L 310.396296 595.712875 +L 310.479208 616.222378 +L 310.514742 603.283139 +L 310.532509 599.225424 +L 310.568043 611.607956 +L 310.615421 606.500333 +L 310.621343 608.251858 +L 310.650955 592.883287 +L 310.680566 573.11546 +L 310.757556 597.824284 +L 310.810856 609.130212 +L 310.79309 595.747098 +L 310.864157 597.16526 +L 310.881924 591.636799 +L 310.911535 618.613298 +L 310.941147 609.795119 +L 311.012214 587.517985 +L 310.952991 610.570653 +L 311.106971 597.166604 +L 311.112893 600.495865 +L 311.154349 567.691514 +L 311.166194 573.9997 +L 311.18396 563.798407 +L 311.266872 580.739741 +L 311.278717 570.580947 +L 311.403085 586.1833 +L 311.320173 568.939361 +L 311.41493 583.76618 +L 311.450463 565.381121 +L 311.533375 572.999339 +L 311.634054 608.719343 +L 311.663666 600.151455 +L 311.669588 596.187935 +L 311.740655 611.454104 +L 311.7525 609.107942 +L 311.764345 612.864192 +L 311.82949 593.568384 +L 311.835412 594.193664 +L 311.918324 581.180969 +L 311.947935 588.297235 +L 311.953858 588.194241 +L 312.054537 610.829411 +L 312.084148 601.798667 +L 312.149293 581.230309 +L 312.202594 595.960901 +L 312.220361 604.340627 +L 312.285506 579.943232 +L 312.291428 578.773963 +L 312.326962 591.704815 +L 312.50463 626.430196 +L 312.516475 619.591179 +L 312.599387 590.205514 +L 312.688221 599.290669 +L 312.71191 611.595512 +L 312.741522 592.070753 +L 312.7889 597.44001 +L 312.830356 582.338941 +L 312.883657 607.641397 +L 312.889579 606.13166 +L 312.960646 588.984334 +L 313.002102 602.728884 +L 313.025792 610.79042 +L 313.102781 602.362798 +L 313.12647 589.085966 +L 313.162004 613.628029 +L 313.221227 593.943454 +L 313.227149 593.237933 +L 313.250838 600.192857 +L 313.304139 616.333737 +L 313.369284 609.127059 +L 313.464041 595.768242 +L 313.387051 609.637897 +L 313.481808 602.572985 +L 313.517341 613.655143 +L 313.570642 597.532061 +L 313.588409 603.891022 +L 313.600253 598.894903 +L 313.635787 616.023563 +L 313.69501 607.482571 +L 313.742388 615.456357 +L 313.783844 598.271438 +L 313.801611 576.285426 +L 313.890445 601.067432 +L 313.914135 599.822447 +L 313.925979 608.454271 +L 313.991124 622.657998 +L 314.044425 614.21001 +L 314.097725 581.631898 +L 314.180637 596.80737 +L 314.23986 610.185414 +L 314.275394 583.738823 +L 314.281316 583.018636 +L 314.293161 592.07403 +L 314.334617 607.841962 +L 314.381995 587.781486 +L 314.417529 601.841206 +L 314.44714 591.074667 +L 314.482674 612.936114 +L 314.530052 600.434728 +L 314.684032 574.250019 +L 314.577431 609.305935 +L 314.713643 582.35352 +L 314.778788 607.603159 +L 314.832089 595.404173 +L 314.885389 607.627724 +L 314.944612 590.881071 +L 314.974224 610.452195 +L 315.045291 585.150433 +L 315.051214 588.051453 +L 315.057136 587.834678 +L 315.074903 579.281766 +L 315.14597 596.093167 +L 315.169659 583.547633 +L 315.317716 624.136778 +L 315.323639 621.424896 +L 315.459851 595.628312 +L 315.371017 626.848952 +L 315.477618 596.596029 +L 315.596064 609.935155 +L 315.542763 586.74051 +L 315.607908 605.331543 +L 315.625675 596.515726 +L 315.696743 612.3534 +L 315.708587 610.289715 +L 315.815188 623.60528 +L 315.755966 600.106717 +L 315.832955 614.397447 +L 315.850722 605.570355 +L 315.945479 584.796938 +L 315.8981 613.165398 +L 315.969168 589.965072 +L 316.099458 619.458794 +L 316.016546 583.300995 +L 316.105381 615.407676 +L 316.111303 615.744817 +L 316.123147 625.066625 +L 316.188293 606.130218 +L 316.211982 609.109782 +L 316.241593 596.603178 +L 316.288971 626.001717 +L 316.312661 609.316327 +L 316.318583 616.414311 +L 316.413339 604.260955 +L 316.419262 606.745457 +L 316.437029 611.605628 +L 316.484407 596.306163 +L 316.514018 600.399931 +L 316.519941 600.555371 +L 316.525863 598.681796 +L 316.537707 613.607684 +L 316.573241 593.62413 +L 316.638386 607.126215 +L 316.768677 623.232546 +L 316.67392 595.555417 +L 316.774599 622.037924 +L 316.833822 614.032954 +L 316.845666 614.271148 +L 316.875278 602.841106 +L 316.928578 615.828958 +L 316.95819 609.826238 +L 316.975957 616.824945 +L 317.052946 602.013541 +L 317.058869 601.991709 +L 317.082558 605.146617 +L 317.106247 591.418459 +L 317.118092 593.33646 +L 317.135858 584.517614 +L 317.153625 594.680869 +L 317.224693 588.268162 +L 317.248382 601.497738 +L 317.29576 584.966438 +L 317.337216 597.104873 +L 317.343138 590.933732 +L 317.431973 609.533425 +L 317.508962 601.505569 +L 317.520807 611.768815 +L 317.615564 633.608859 +L 317.639253 621.574487 +L 317.645175 624.17715 +L 317.698476 601.396547 +L 317.704398 603.939181 +L 317.728087 601.403887 +L 317.716242 604.054384 +L 317.734009 601.879126 +L 317.828766 605.783473 +L 317.852455 590.293262 +L 317.905756 595.314352 +L 317.876144 580.299159 +L 317.964978 594.835739 +L 318.059735 584.992858 +L 318.012357 604.23332 +L 318.07158 589.397042 +L 318.083424 599.672751 +L 318.113036 584.514119 +L 318.184103 599.319399 +L 318.190025 599.332097 +L 318.213715 607.451693 +L 318.225559 599.48531 +L 318.267015 587.524778 +L 318.326238 600.044818 +L 318.33216 597.119058 +L 318.355849 608.906147 +L 318.420995 590.908241 +L 318.450606 600.645909 +L 318.456528 595.726902 +L 318.492062 615.091572 +L 318.557207 598.761783 +L 318.669731 613.942623 +L 318.610508 593.660086 +L 318.681575 604.558518 +L 318.829632 571.715951 +L 318.711187 607.833253 +L 318.835555 573.575693 +L 318.894777 589.516759 +L 318.924389 563.289117 +L 319.025068 588.402044 +L 318.936233 560.407184 +L 319.084291 582.611663 +L 319.119824 566.620627 +L 319.190892 582.26059 +L 319.208659 590.6594 +L 319.279726 574.319439 +L 319.297493 580.442328 +L 319.303415 579.853255 +L 319.309338 585.973397 +L 319.327104 585.436867 +L 319.427783 608.769343 +L 319.451472 597.577364 +L 319.457395 597.956608 +L 319.463317 592.705867 +L 319.475162 597.148458 +L 319.504773 580.145511 +L 319.581763 598.111997 +L 319.605452 606.807991 +L 319.658752 588.158041 +L 319.682442 590.371994 +L 319.694286 580.813642 +L 319.759431 613.572215 +L 319.765354 613.137777 +L 319.789043 603.594213 +L 319.836421 615.023419 +L 319.889722 605.563768 +L 319.919333 616.832259 +L 319.978556 601.843567 +L 320.002245 610.861527 +L 320.01409 602.687799 +L 320.079235 618.778331 +L 320.091079 615.530719 +L 320.097002 623.73516 +L 320.185836 609.841484 +L 320.203603 618.148419 +L 320.22137 624.919294 +L 320.357582 583.69349 +L 320.48195 601.326642 +L 320.434572 581.203077 +L 320.493795 594.527511 +L 320.564862 580.177108 +L 320.517484 596.062347 +L 320.624085 581.833983 +L 320.63593 585.473179 +L 320.665541 569.548211 +L 320.724764 578.875541 +L 320.730686 575.835596 +L 320.783987 597.544115 +L 320.801754 591.043105 +L 320.860977 584.231211 +L 320.920199 606.882654 +L 320.932044 603.401226 +L 320.967578 620.095268 +L 321.032723 605.742941 +L 321.038645 604.568231 +L 321.068257 617.319625 +L 321.080101 616.473362 +L 321.086023 621.284305 +L 321.145246 606.315525 +L 321.18078 612.307883 +L 321.222236 603.857513 +L 321.245925 616.087828 +L 321.316993 629.751529 +L 321.263692 609.493181 +L 321.370293 623.065329 +L 321.46505 586.482952 +L 321.494661 590.696209 +L 321.630874 616.42671 +L 321.67233 608.58341 +L 321.701941 623.666969 +L 321.731553 617.978746 +L 321.737475 624.32336 +L 321.767086 604.090503 +L 321.838154 620.106292 +L 321.926988 608.07997 +L 321.885532 627.75558 +L 321.962522 612.28609 +L 321.974366 627.428486 +L 322.045434 596.871533 +L 322.122424 591.698957 +L 322.075045 605.914366 +L 322.157957 596.12426 +L 322.187569 610.54073 +L 322.252714 591.155091 +L 322.264558 594.835279 +L 322.288248 605.791829 +L 322.329704 587.551079 +L 322.353393 573.623647 +L 322.442227 581.28885 +L 322.531061 600.752734 +L 322.471838 576.145169 +L 322.554751 585.660208 +L 322.57844 582.973243 +L 322.63174 595.613373 +L 322.70873 608.971816 +L 322.655429 592.244037 +L 322.744264 600.002792 +L 322.762031 588.108733 +L 322.844943 604.406336 +L 322.856787 611.465512 +L 322.874554 597.954062 +L 322.951544 606.160948 +L 322.957466 601.536885 +L 323.022611 624.927448 +L 323.028533 623.844869 +L 323.064067 630.618962 +L 323.117368 610.78134 +L 323.12329 614.78125 +L 323.129212 614.923538 +L 323.223969 636.871318 +L 323.182513 604.560548 +L 323.259503 632.400233 +L 323.377948 614.706965 +L 323.306881 633.706541 +L 323.383871 616.478801 +L 323.466783 591.988874 +L 323.531928 607.104355 +L 323.567462 614.595388 +L 323.591151 599.551082 +L 323.620762 601.658283 +L 323.632607 598.373865 +L 323.674063 587.497941 +L 323.709596 610.021801 +L 323.74513 597.29646 +L 323.768819 611.952216 +L 323.804353 586.450114 +L 323.833964 594.596517 +L 323.922799 578.060974 +L 323.946488 591.143391 +L 324.059011 604.728546 +L 323.993866 585.012039 +L 324.064934 596.898073 +L 324.076778 591.786115 +L 324.136001 612.112803 +L 324.153768 607.594884 +L 324.207068 611.727772 +L 324.177457 601.524685 +L 324.242602 602.439371 +L 324.28998 594.792282 +L 324.266291 609.699408 +L 324.337359 605.303836 +L 324.343281 607.03682 +L 324.414348 596.168072 +L 324.432115 600.662242 +L 324.449882 592.473971 +L 324.455804 594.010571 +L 324.467649 584.973691 +L 324.526872 611.789839 +L 324.532794 610.059674 +L 324.615706 624.12033 +L 324.556483 608.90153 +L 324.645318 613.297305 +L 324.669007 611.864359 +L 324.680851 618.143183 +L 324.799297 638.064773 +L 324.917743 602.208369 +L 324.929587 610.017353 +L 324.947354 619.50846 +L 325.006577 606.045247 +L 325.012499 607.699569 +L 325.148712 560.063807 +L 325.154634 561.043039 +L 325.302691 602.238636 +L 325.344147 597.888346 +L 325.35007 587.171066 +L 325.444826 612.011364 +L 325.658029 577.416547 +L 325.468515 616.687173 +L 325.681718 586.574813 +L 325.758708 577.329467 +L 325.800164 592.218676 +L 325.823853 574.076279 +L 325.829775 574.756149 +L 325.835697 571.303166 +L 325.877153 596.259991 +L 325.906765 592.030431 +L 326.042977 616.11766 +L 326.137734 624.678197 +L 326.078511 610.883686 +L 326.155501 616.266327 +L 326.279869 598.400913 +L 326.202879 620.303672 +L 326.291713 608.319312 +L 326.315402 616.854951 +L 326.368703 597.816614 +L 326.404237 612.0295 +L 326.433848 601.103879 +L 326.546372 586.361245 +L 326.498993 604.823135 +L 326.558216 591.562345 +L 326.59375 597.095342 +L 326.623361 582.488911 +L 326.652973 590.205771 +L 326.682584 574.517726 +L 326.759574 585.692656 +L 326.818797 604.714654 +L 326.883942 598.127321 +L 326.949087 593.080759 +L 326.93132 605.874328 +L 326.960932 596.789168 +L 327.079377 618.358125 +L 327.0853 617.526937 +L 327.209668 575.581125 +L 327.103067 620.829321 +L 327.239279 584.187312 +L 327.251124 577.567723 +L 327.334036 588.190627 +L 327.357725 591.708316 +L 327.399181 570.841292 +L 327.411025 572.596775 +L 327.42287 568.826166 +L 327.452481 579.685941 +L 327.464326 572.915871 +L 327.588694 601.088401 +L 327.594616 598.844936 +L 327.606461 595.590117 +L 327.677528 604.689291 +L 327.766363 614.422403 +L 327.730829 596.087539 +L 327.790052 609.755565 +L 327.884808 586.418802 +L 327.843352 610.893486 +L 327.91442 601.667945 +L 328.026943 617.558473 +L 327.979565 601.326313 +L 328.038788 612.799617 +L 328.139467 587.121403 +L 328.157234 595.670313 +L 328.175 605.781168 +L 328.240146 587.423051 +L 328.263835 597.696812 +L 328.275679 591.378068 +L 328.293446 602.387738 +L 328.364514 595.477265 +L 328.441503 633.845765 +L 328.482959 613.875908 +L 328.488882 611.283717 +L 328.559949 627.867802 +L 328.565871 628.235222 +L 328.577716 622.13536 +L 328.648783 608.552763 +L 328.684317 620.665918 +L 328.696162 627.780504 +L 328.767229 614.432579 +L 328.779074 616.7216 +L 328.790918 614.196072 +L 328.844219 626.149881 +L 328.850141 625.1409 +L 328.861986 624.091695 +L 328.879752 627.091526 +L 328.974509 595.591693 +L 329.004121 601.742884 +L 329.021887 598.24461 +L 329.051499 612.384435 +L 329.075188 609.068846 +L 329.169945 623.306211 +L 329.187711 613.652426 +L 329.276546 603.517191 +L 329.241012 617.619625 +L 329.300235 609.544816 +L 329.306157 617.466397 +L 329.359458 597.158983 +L 329.406836 609.721481 +L 329.412758 601.657516 +L 329.501593 615.051151 +L 329.519359 607.39584 +L 329.596349 581.071092 +L 329.531204 609.544309 +L 329.620038 603.315541 +L 329.691106 598.538434 +L 329.726639 610.411283 +L 329.732562 602.417365 +L 329.785862 614.595845 +L 329.839163 605.010917 +L 329.951686 618.03352 +L 329.886541 592.736534 +L 329.957609 613.442273 +L 330.046443 600.135237 +L 329.993142 618.84316 +L 330.070132 604.831536 +L 330.1945 616.365142 +L 330.105666 590.208421 +L 330.200422 616.276289 +L 330.235956 624.229587 +L 330.218189 607.795577 +L 330.259645 612.198243 +L 330.283334 597.480612 +L 330.372169 604.924707 +L 330.407702 598.376578 +L 330.395858 605.206536 +L 330.449158 604.176914 +L 330.472848 619.817034 +L 330.55576 604.698559 +L 330.614982 581.954236 +L 330.668283 597.920628 +L 330.81634 644.214348 +L 330.845952 630.012363 +L 330.851874 631.447494 +L 330.89333 617.673774 +L 330.982164 621.831646 +L 331.011776 604.988935 +L 331.094688 627.348391 +L 331.112454 603.033525 +L 331.147988 585.27293 +L 331.236823 588.166839 +L 331.290123 606.382241 +L 331.361191 604.0153 +L 331.479636 587.093838 +L 331.378957 608.37451 +L 331.497403 594.310813 +L 331.574393 625.09358 +L 331.621771 614.00449 +L 331.663227 589.918081 +L 331.752061 599.968244 +L 331.876429 618.831293 +L 331.781673 599.363976 +L 331.882352 617.71789 +L 331.888274 618.365427 +L 331.900119 610.588053 +L 331.92973 611.334097 +L 332.071865 595.431936 +L 332.012642 612.60403 +L 332.101476 602.141434 +L 332.107399 605.513694 +L 332.13701 587.690294 +L 332.214 603.902758 +L 332.243611 599.265253 +L 332.296912 616.512324 +L 332.308756 609.788262 +L 332.367979 623.997759 +L 332.427202 616.255137 +L 332.444969 605.283687 +L 332.49827 625.860027 +L 332.521959 625.152943 +L 332.593026 634.344682 +L 332.563415 623.173372 +L 332.62856 624.334793 +L 332.741083 591.062672 +L 332.752928 594.679592 +L 332.764772 602.685856 +L 332.853607 582.621374 +L 332.960208 609.165286 +L 332.877296 580.787698 +L 332.977975 596.764301 +L 332.989819 594.419343 +L 333.025353 571.058806 +L 333.102343 586.035224 +L 333.114187 593.342583 +L 333.179332 575.903709 +L 333.214866 588.508163 +L 333.226711 585.329357 +L 333.256322 602.361404 +L 333.268167 598.808568 +L 333.404379 619.727448 +L 333.3037 596.851491 +L 333.410302 614.682846 +L 333.58797 589.988566 +L 333.605737 590.814103 +L 333.688649 624.194435 +L 333.736027 618.85399 +L 333.771561 620.989091 +L 333.801173 607.325661 +L 333.824862 590.892704 +L 333.87224 616.552009 +L 333.913696 600.262672 +L 334.109131 668.113125 +L 334.227577 629.446998 +L 334.263111 630.532192 +L 334.310489 637.541877 +L 334.334178 619.561532 +L 334.346023 620.424989 +L 334.434857 606.640432 +L 334.381557 622.320552 +L 334.470391 611.406527 +L 334.582914 631.563356 +L 334.594759 623.985494 +L 334.695438 591.441632 +L 334.754661 594.806393 +L 334.802039 607.494237 +L 334.790194 589.475961 +L 334.867184 596.291971 +L 334.926407 578.515062 +L 334.879029 596.926864 +L 334.98563 587.520174 +L 335.068542 593.668288 +L 335.021164 581.123024 +L 335.080386 585.278671 +L 335.086309 584.254952 +L 335.127765 596.232042 +L 335.133687 599.446098 +L 335.204754 577.837656 +L 335.258055 569.202357 +L 335.287666 582.561495 +L 335.376501 599.034738 +L 335.299511 580.804253 +L 335.406112 592.328881 +L 335.447568 585.235208 +L 335.483102 595.637686 +L 335.500869 593.130139 +L 335.554169 616.994744 +L 335.601548 590.214951 +L 335.708149 578.381196 +L 335.648926 590.642561 +L 335.714071 584.679847 +L 335.755527 594.8823 +L 335.785139 578.370433 +L 335.81475 581.61694 +L 335.962807 610.188097 +L 335.832517 576.518349 +L 335.992419 599.067944 +L 336.02203 605.888148 +L 336.116787 581.03773 +L 336.211543 621.006114 +L 336.264844 614.06716 +L 336.341833 585.915503 +L 336.389212 588.445997 +L 336.448435 615.244682 +L 336.51358 605.28698 +L 336.555036 585.839669 +L 336.632026 600.119402 +L 336.661637 602.977392 +L 336.673482 595.109968 +L 336.756394 586.749454 +L 336.768238 599.739174 +L 336.780083 595.764518 +L 336.786005 595.723231 +L 336.945907 619.786723 +L 336.963674 617.808629 +L 337.076197 589.832191 +L 337.082119 590.304082 +L 337.123575 599.693318 +L 337.170954 588.484486 +L 337.194643 592.541105 +L 337.200565 592.498975 +L 337.259788 582.310042 +L 337.301244 594.882095 +L 337.307166 593.82027 +L 337.372311 602.166888 +L 337.401923 591.185695 +L 337.41969 596.654124 +L 337.455223 603.227629 +L 337.478912 587.654908 +L 337.496679 590.094749 +L 337.609203 578.927531 +L 337.526291 605.72869 +L 337.615125 580.96175 +L 337.727649 608.233224 +L 337.763182 607.038462 +L 337.769105 598.795991 +L 337.846094 621.220694 +L 337.863861 618.255027 +L 337.917162 612.583457 +L 337.946773 624.114268 +L 337.96454 619.647285 +L 338.000074 630.091407 +L 338.053374 617.385197 +L 338.059297 621.320301 +L 338.100753 597.665075 +L 338.17182 617.446027 +L 338.266577 597.123646 +L 338.231043 631.000517 +L 338.290266 598.629705 +L 338.337644 626.496378 +L 338.402789 606.983283 +L 338.426478 605.328073 +L 338.444245 609.986217 +L 338.450167 609.603317 +L 338.550846 623.119658 +L 338.568613 613.354168 +L 338.615991 622.332421 +L 338.704826 599.607457 +L 338.74036 597.232526 +L 338.852883 621.771473 +L 338.864728 623.20477 +L 338.87065 622.831393 +L 338.965406 611.742964 +L 338.912106 633.203051 +L 338.983173 613.956218 +L 338.989096 620.607359 +L 339.083852 610.213092 +L 339.15492 584.656842 +L 339.214142 592.406405 +L 339.279288 607.995469 +L 339.261521 589.265032 +L 339.332588 598.378832 +L 339.374044 591.946428 +L 339.421422 604.111247 +L 339.439189 600.106453 +L 339.468801 606.957731 +L 339.486568 594.48803 +L 339.539868 599.459521 +L 339.54579 598.360558 +L 339.563557 607.240331 +L 339.605013 603.777645 +L 339.705692 642.991391 +L 339.75307 630.698893 +L 339.847827 618.630057 +L 339.782682 636.82321 +L 339.865594 624.274525 +L 340.025496 572.380162 +L 340.066952 596.409772 +L 340.108408 611.777747 +L 340.167631 581.313968 +L 340.173553 577.614334 +L 340.226853 596.657547 +L 340.268309 584.859439 +L 340.386755 615.41034 +L 340.404522 611.781491 +L 340.410444 615.823385 +L 340.487434 598.118189 +L 340.493356 599.478949 +L 340.499279 598.809905 +L 340.546657 605.739589 +L 340.552579 605.842856 +L 340.558501 604.568402 +L 340.647336 590.351001 +L 340.570346 606.070862 +L 340.676947 597.519414 +L 340.753937 586.022468 +L 340.783548 601.594151 +L 340.789471 595.035522 +L 340.878305 614.874465 +L 340.884227 612.0472 +L 340.89015 612.465615 +L 340.896072 610.213639 +L 340.901994 611.816262 +L 340.94345 596.829137 +L 341.002673 617.678486 +L 341.044129 628.911114 +L 341.067818 615.303576 +L 341.085585 616.329812 +L 341.180342 596.092886 +L 341.204031 602.625029 +L 341.381699 576.478459 +L 341.257331 609.547923 +L 341.393544 582.128183 +L 341.440922 601.553565 +L 341.541601 591.978883 +L 341.606746 585.600677 +L 341.583057 593.687679 +L 341.64228 589.971906 +L 341.689658 585.999224 +L 341.778492 604.749663 +L 341.802182 594.201901 +L 341.855482 612.648126 +L 341.891016 602.018398 +L 341.956161 597.826898 +L 341.920627 612.112554 +L 341.991695 606.891507 +L 342.044995 596.229712 +L 342.098296 606.395258 +L 342.169363 596.928745 +L 342.216742 618.016755 +L 342.287809 597.230514 +L 342.323343 613.686839 +L 342.335187 622.876522 +L 342.412177 605.465252 +L 342.418099 606.339075 +L 342.518778 589.757006 +L 342.542467 601.555991 +L 342.654991 639.216852 +L 342.560234 601.028451 +L 342.690525 622.722387 +L 342.785281 598.094427 +L 342.708291 626.308152 +L 342.850426 611.385781 +L 342.856349 616.00066 +L 342.921494 593.782197 +L 342.945183 602.918382 +L 342.980717 597.227646 +L 342.986639 609.461296 +L 343.045862 603.727867 +L 343.116929 614.909384 +L 343.134696 601.965305 +L 343.146541 605.808201 +L 343.182074 588.788792 +L 343.259064 593.045805 +L 343.383432 623.858549 +L 343.395277 616.380771 +L 343.4545 587.986019 +L 343.513722 607.164802 +L 343.531489 626.18072 +L 343.590712 601.059635 +L 343.608479 601.799043 +L 343.632168 595.857253 +L 343.697313 609.508774 +L 343.71508 603.75171 +L 343.797992 624.101435 +L 343.738769 599.6506 +L 343.84537 610.996205 +L 343.880904 586.171646 +L 343.975661 594.980048 +L 344.034884 601.258819 +L 344.058573 591.423955 +L 344.153329 580.910699 +L 344.171096 581.085186 +L 344.194785 598.311451 +L 344.277697 581.081326 +L 344.289542 593.43815 +L 344.372454 565.53464 +L 344.461288 573.212493 +L 344.4909 572.943699 +L 344.591579 600.074372 +L 344.721869 615.824509 +L 344.727791 608.640305 +L 344.775169 593.286875 +L 344.816625 612.704872 +L 344.822548 612.472279 +L 344.95876 633.381308 +L 344.994294 631.412301 +L 345.094973 592.641326 +L 345.148273 602.597053 +L 345.213419 621.568783 +L 345.248952 602.190557 +L 345.266719 611.611941 +L 345.278564 601.96639 +L 345.349631 625.584187 +L 345.432543 637.813962 +L 345.361476 621.052885 +L 345.45031 622.548655 +L 345.456232 622.312563 +L 345.533222 632.969577 +L 345.550989 619.166046 +L 345.627979 588.475582 +L 345.681279 602.185984 +L 345.86487 639.647831 +L 345.728658 600.654736 +L 345.888559 633.205302 +L 345.983316 603.865629 +L 346.012927 608.806446 +L 346.036616 614.284156 +L 346.060306 601.15098 +L 346.089917 605.243686 +L 346.190596 587.875002 +L 346.119528 608.172624 +L 346.220207 598.311346 +L 346.267586 582.71176 +L 346.237974 598.992662 +L 346.297197 597.245081 +L 346.303119 605.331461 +L 346.391954 576.881159 +L 346.397876 576.896563 +L 346.522244 597.163488 +L 346.551855 593.069913 +L 346.658457 621.597137 +L 346.741369 625.331528 +L 346.776902 611.036201 +L 346.818358 613.812265 +L 346.836125 604.238632 +L 346.859814 607.491091 +L 346.877581 596.768266 +L 346.966415 608.683135 +L 346.984182 616.344721 +L 347.025638 600.239959 +L 347.049327 602.733765 +L 347.073017 596.5794 +L 347.102628 611.449279 +L 347.144084 604.564232 +L 347.197385 607.709911 +L 347.173695 596.087509 +L 347.232918 597.805406 +L 347.280297 566.576823 +L 347.380975 584.346856 +L 347.457965 589.206924 +L 347.428354 578.383675 +L 347.463888 586.360098 +L 347.46981 578.269395 +L 347.558644 599.786443 +L 347.611945 605.375639 +L 347.582333 595.374224 +L 347.653401 600.261882 +L 347.765924 577.026517 +L 347.777769 577.882475 +L 347.795536 578.886867 +L 347.801458 576.715949 +L 347.93767 617.795376 +L 347.813302 574.326288 +L 347.96136 608.852717 +L 347.985049 593.368636 +L 348.062038 612.976527 +L 348.121261 621.889556 +L 348.14495 606.108023 +L 348.180484 616.925442 +L 348.293008 627.393009 +L 348.251552 608.197557 +L 348.29893 623.255229 +L 348.346308 607.781696 +L 348.417376 618.168344 +L 348.446987 626.064565 +L 348.50621 608.474278 +L 348.518055 614.49594 +L 348.541744 605.03418 +L 348.589122 631.739352 +L 348.600967 625.949252 +L 348.618733 629.809791 +L 348.6365 622.047314 +L 348.672034 622.30144 +L 348.701645 614.686766 +L 348.743101 628.943078 +L 348.778635 626.297837 +L 348.837858 622.292791 +L 348.903003 641.170873 +L 349.033293 597.365219 +L 349.110283 605.082346 +L 349.116205 618.334387 +L 349.20504 591.102005 +L 349.210962 591.873175 +L 349.216884 588.304341 +L 349.25834 615.939413 +L 349.305719 593.412569 +L 349.353097 601.523498 +L 349.406397 589.45908 +L 349.41232 590.90774 +L 349.530765 602.321068 +L 349.501154 588.959192 +L 349.536688 601.010562 +L 349.54261 591.360831 +L 349.589988 623.137109 +L 349.631444 619.429358 +L 349.643289 622.423966 +L 349.649211 619.430833 +L 349.74989 590.961457 +L 349.684745 625.411248 +L 349.767657 604.57587 +L 349.820958 597.310936 +L 349.862414 605.80198 +L 349.951248 629.732649 +L 349.986782 622.415141 +L 350.081538 587.163013 +L 350.117072 597.988738 +L 350.122994 602.423906 +L 350.182217 587.263798 +L 350.223673 595.884107 +L 350.259207 578.12381 +L 350.29474 602.947971 +L 350.330274 598.298614 +L 350.454642 581.889785 +L 350.353963 608.226385 +L 350.460564 584.457766 +L 350.484254 610.666373 +L 350.590855 609.403953 +L 350.721145 629.454424 +L 350.602699 605.202066 +L 350.727067 625.13897 +L 350.809979 596.654607 +L 350.845513 611.17344 +L 350.886969 593.259554 +L 350.969881 608.496013 +L 351.088327 624.163961 +L 351.194928 605.942359 +L 351.20085 609.837829 +L 351.289685 629.172258 +L 351.242306 605.529281 +L 351.319296 615.30113 +L 351.461431 568.154247 +L 351.479198 576.052989 +L 351.48512 577.886553 +L 351.538421 564.772036 +L 351.544343 559.831805 +L 351.603566 582.192379 +L 351.621333 579.50914 +L 351.716089 607.680629 +L 351.745701 602.207405 +L 351.864146 580.802811 +L 351.881913 583.868636 +L 351.905602 595.110202 +L 351.970748 572.655131 +L 352.000359 590.951465 +L 352.018126 583.069272 +L 352.077349 614.002952 +L 352.095116 611.837947 +L 352.124727 599.595349 +L 352.166183 613.337694 +L 352.201717 605.447079 +L 352.225406 621.76519 +L 352.308318 604.921956 +L 352.326085 610.087016 +L 352.420841 593.541226 +L 352.456375 622.068631 +L 352.551132 614.493374 +L 352.580743 603.049189 +L 352.628121 615.606229 +L 352.645888 613.98858 +L 352.669577 630.366323 +L 352.746567 606.986452 +L 352.829479 596.649303 +L 352.782101 611.382222 +L 352.859091 601.71772 +L 352.88278 616.342757 +L 352.947925 582.372109 +L 352.953847 582.094171 +L 352.965692 585.691123 +L 353.072293 604.029956 +L 352.995303 584.696091 +L 353.084137 599.618319 +L 353.095982 583.644091 +L 353.172972 604.928291 +L 353.190739 602.990234 +L 353.196661 608.676283 +L 353.255884 592.705384 +L 353.29734 604.412303 +L 353.380252 591.404042 +L 353.356563 605.93783 +L 353.421708 596.716236 +L 353.546076 606.76667 +L 353.469086 586.367114 +L 353.551998 606.002363 +L 353.611221 588.531807 +L 353.563843 608.142024 +L 353.682288 601.924898 +L 353.694133 609.780954 +L 353.771123 587.046842 +L 353.782967 591.050741 +L 353.830345 601.695645 +L 353.854035 590.810132 +L 353.859957 591.314121 +L 353.883646 572.363706 +L 353.97248 578.134181 +L 354.096848 594.332788 +L 354.138304 589.500354 +L 354.156071 596.6767 +L 354.167916 615.59355 +L 354.238983 595.954788 +L 354.268595 600.423228 +L 354.274517 604.696256 +L 354.369274 593.145153 +L 354.428496 585.558701 +L 354.440341 595.986625 +L 354.452186 605.44551 +L 354.529175 581.962284 +L 354.535098 580.618805 +L 354.564709 597.865433 +L 354.606165 585.991546 +L 354.67131 577.195165 +L 354.7483 608.153975 +L 354.760144 602.806883 +L 354.82529 615.823346 +L 354.837134 611.497805 +L 354.925968 627.04705 +L 354.949658 616.899244 +L 354.967425 618.379448 +L 354.973347 608.967979 +L 355.038492 584.654286 +L 355.115482 595.416259 +L 355.127326 592.592237 +L 355.139171 580.980963 +L 355.204316 603.641278 +L 355.233927 594.267646 +L 355.251694 610.652767 +L 355.328684 587.036075 +L 355.364218 575.824758 +L 355.399751 599.956419 +L 355.429363 599.359154 +L 355.435285 596.982426 +L 355.482663 618.478245 +L 355.494508 614.230226 +L 355.50043 617.49783 +L 355.571498 601.091761 +L 355.57742 602.241653 +L 355.648487 589.029158 +L 355.595187 609.569687 +L 355.695866 596.946783 +L 355.766933 610.561776 +L 355.70771 593.433 +L 355.814311 605.858861 +L 355.91499 596.46364 +L 355.873534 611.189345 +L 355.926835 600.912867 +L 355.932757 606.648939 +L 356.003825 596.673148 +L 356.033436 604.774612 +L 356.045281 597.389736 +L 356.12227 616.124951 +L 356.128193 612.447282 +L 356.175571 618.098947 +L 356.151882 606.751836 +L 356.217027 609.090925 +L 356.264405 601.525637 +L 356.288094 612.923626 +L 356.311784 612.302524 +L 356.365084 620.376345 +L 356.335473 607.593247 +L 356.388773 611.502687 +L 356.477608 601.648441 +L 356.447996 615.69756 +L 356.501297 608.316382 +L 356.507219 610.816967 +L 356.554597 595.046923 +L 356.578286 596.090649 +L 356.584209 591.790033 +L 356.619742 614.774195 +L 356.661198 610.171976 +L 356.696732 622.474139 +L 356.74411 597.712657 +L 356.7678 610.78854 +L 356.880323 593.051825 +L 356.886245 600.59333 +L 356.904012 617.430196 +L 357.004691 613.160852 +L 357.170515 639.758653 +L 357.022458 608.682799 +L 357.194204 628.766321 +L 357.288961 594.620976 +L 357.324495 604.887529 +L 357.365951 618.019901 +L 357.419251 601.04191 +L 357.425173 603.666856 +L 357.508085 572.967459 +L 357.561386 582.273005 +L 357.679832 615.147801 +L 357.602842 580.624368 +L 357.709443 610.34366 +L 357.715365 608.811903 +L 357.744977 626.561459 +L 357.780511 617.318747 +L 357.910801 640.553469 +L 357.916723 635.875841 +L 358.047013 591.720401 +L 357.975946 643.1422 +L 358.106236 603.395871 +L 358.21876 610.106893 +L 358.195071 597.350539 +L 358.224682 608.460854 +L 358.236527 602.651521 +L 358.248371 616.572765 +L 358.325361 608.769819 +L 358.360895 615.608673 +L 358.420118 598.121483 +L 358.42604 603.2262 +L 358.449729 596.70382 +L 358.461574 608.884602 +L 358.526719 605.301143 +L 358.645164 626.593182 +L 358.55633 600.872357 +L 358.651087 624.82213 +L 358.728076 613.832546 +L 358.745843 626.740236 +L 358.76361 619.733383 +L 358.799144 626.441759 +L 358.775455 610.464003 +L 358.834678 618.233345 +L 358.887978 600.900239 +L 358.941279 613.639451 +L 358.959046 627.437958 +L 359.041958 612.212351 +L 359.065647 604.880981 +L 359.130792 629.675554 +L 359.243315 600.438772 +L 359.296616 604.859735 +L 359.349917 616.442319 +L 359.397295 610.733857 +L 359.403217 602.762395 +L 359.486129 622.268625 +L 359.503896 613.023913 +L 359.509818 613.260983 +L 359.569041 622.531478 +L 359.604575 609.278658 +L 359.616419 612.902294 +L 359.634186 604.216956 +L 359.723021 618.874808 +L 359.782243 623.783004 +L 359.811855 611.096995 +L 359.906611 587.511957 +L 359.936223 596.277373 +L 359.995446 589.297478 +L 360.013213 603.062867 +L 360.060591 608.308856 +L 360.030979 599.079751 +L 360.119814 601.897874 +L 360.208648 584.007195 +L 360.232337 594.05495 +L 360.344861 615.370077 +L 360.244182 592.163494 +L 360.356705 608.736967 +L 360.362627 609.247295 +L 360.380394 602.133946 +L 360.392239 587.280002 +L 360.42185 613.035695 +L 360.486996 601.507731 +L 360.640975 585.077438 +L 360.516607 605.292592 +L 360.646897 589.677215 +L 360.65282 589.99157 +L 360.664664 579.117279 +L 360.717965 601.101463 +L 360.753498 593.903851 +L 360.759421 596.141127 +L 360.771265 580.139042 +L 360.83641 593.831753 +L 360.931167 576.27807 +L 360.954856 581.296747 +L 361.04369 589.920293 +L 361.014079 579.618113 +L 361.079224 586.231927 +L 361.085146 582.382972 +L 361.150292 595.227839 +L 361.185825 588.468984 +L 361.268737 578.865274 +L 361.286504 590.203673 +L 361.399028 598.73127 +L 361.369416 586.16912 +L 361.40495 597.784847 +L 361.434561 612.401931 +L 361.470095 596.626664 +L 361.511551 599.743807 +L 361.53524 584.063282 +L 361.606308 612.13572 +L 361.61223 606.677695 +L 361.665531 625.156919 +L 361.730676 613.709648 +L 361.760287 606.16352 +L 361.813588 615.273246 +L 361.843199 610.372216 +L 361.961645 632.041412 +L 361.872811 604.792703 +L 361.991256 618.14005 +L 362.062324 591.171616 +L 362.003101 618.717653 +L 362.097857 613.028245 +L 362.133391 619.645693 +L 362.163003 599.49483 +L 362.198536 603.978373 +L 362.204459 604.184548 +L 362.216303 601.372794 +L 362.275526 591.917847 +L 362.299215 610.225698 +L 362.31106 625.762277 +L 362.388049 602.253708 +L 362.405816 608.553958 +L 362.506495 590.280268 +L 362.536107 596.120293 +L 362.654552 623.786851 +L 362.660475 619.435394 +L 362.666397 614.114482 +L 362.737464 629.426052 +L 362.767076 619.061406 +L 362.772998 625.950539 +L 362.861832 605.940243 +L 362.873677 602.71343 +L 362.885522 608.891194 +L 362.891444 606.382607 +L 363.033579 642.165033 +L 363.039501 638.739148 +L 363.187558 614.881745 +L 363.27047 632.127449 +L 363.300082 624.623618 +L 363.388916 602.037217 +L 363.412605 618.381971 +L 363.47775 624.972258 +L 363.448139 612.607498 +L 363.531051 624.310697 +L 363.619885 596.56352 +L 363.661341 599.264531 +L 363.667263 605.442533 +L 363.744253 589.321425 +L 363.76202 594.131534 +L 363.773865 598.259955 +L 363.779787 601.027314 +L 363.856777 587.51749 +L 363.874543 574.409511 +L 363.957455 589.889645 +L 363.9693 589.414904 +L 363.981145 601.297221 +L 363.987067 606.553624 +L 364.064057 585.4927 +L 364.069979 585.84188 +L 364.170658 571.326038 +L 364.093668 593.652786 +L 364.17658 579.705954 +L 364.300948 601.529055 +L 364.348326 594.651443 +L 364.377938 611.150183 +L 364.401627 604.017342 +L 364.413471 611.443447 +L 364.502306 597.747068 +L 364.51415 588.631747 +L 364.555606 606.629665 +L 364.602985 602.426225 +L 364.638518 619.153743 +L 364.709586 607.038793 +L 364.762886 589.468978 +L 364.828032 592.864867 +L 364.869488 618.806968 +L 364.946477 604.386168 +L 364.999778 600.340867 +L 364.976089 616.677357 +L 365.035312 609.789565 +L 365.059001 613.597553 +L 365.064923 612.787194 +L 365.100457 622.494968 +L 365.165602 607.70231 +L 365.171524 605.553378 +L 365.207058 625.414564 +L 365.236669 620.67966 +L 365.319581 628.545082 +L 365.278125 617.383077 +L 365.34327 623.189703 +L 365.509094 591.125844 +L 365.515017 592.957434 +L 365.586084 609.849567 +L 365.633462 604.705813 +L 365.722297 595.922351 +L 365.680841 611.628551 +L 365.740064 600.423037 +L 365.769675 609.041519 +L 365.822976 585.082118 +L 365.828898 585.809002 +L 365.923655 576.430187 +L 365.905888 590.934305 +L 365.947344 579.707644 +L 366.059867 614.024584 +L 366.071712 607.276531 +L 366.077634 602.476009 +L 366.148701 622.080423 +L 366.166468 620.433205 +L 366.19608 630.678024 +L 366.219769 614.969027 +L 366.302681 621.699058 +L 366.338215 604.895943 +L 366.355981 610.671945 +L 366.40336 599.655257 +L 366.432971 605.714335 +L 366.557339 577.953761 +L 366.569184 574.428677 +L 366.575106 584.409926 +L 366.640251 605.827264 +L 366.693552 599.984808 +L 366.811997 578.044893 +L 366.711319 602.441515 +L 366.829764 587.241795 +L 366.847531 603.568676 +L 366.94821 591.729245 +L 367.0252 582.065846 +L 367.048889 592.975505 +L 367.054811 595.808173 +L 367.125879 580.927632 +L 367.143646 585.986023 +L 367.173257 577.196892 +L 367.185102 589.197377 +L 367.196946 586.231633 +L 367.315392 608.719358 +L 367.333159 615.743687 +L 367.404226 594.90798 +L 367.410148 598.042757 +L 367.510827 584.426913 +L 367.433838 599.812446 +L 367.540439 592.593388 +L 367.564128 607.126525 +L 367.629273 592.662949 +L 367.729952 578.093175 +L 367.688496 598.278608 +L 367.741796 583.360647 +L 367.795097 575.010262 +L 367.860242 592.209191 +L 367.925387 583.874711 +L 367.895776 595.006648 +L 367.966843 590.431463 +L 368.067522 607.38266 +L 368.002377 571.056285 +L 368.097134 597.372358 +L 368.103056 597.580392 +L 368.180046 587.587188 +L 368.156357 602.155111 +L 368.221502 591.242593 +L 368.286647 600.14363 +L 368.245191 584.27352 +L 368.304414 586.519909 +L 368.369559 597.748607 +L 368.452471 560.732165 +L 368.458393 560.789415 +L 368.511694 578.72522 +L 368.576839 567.199879 +L 368.630139 591.549163 +L 368.701207 620.484251 +L 368.748585 612.167845 +L 368.76043 604.582077 +L 368.819653 619.667977 +L 368.849264 617.402424 +L 368.979554 594.543807 +L 368.861109 624.023973 +L 368.985477 602.986486 +L 369.015088 617.620078 +L 369.098 606.439092 +L 369.151301 578.849275 +L 369.216446 597.792359 +L 369.299358 608.676845 +L 369.263824 593.9489 +L 369.323047 601.875966 +L 369.423726 574.620262 +L 369.334892 601.978697 +L 369.465182 578.866147 +L 369.542172 608.391129 +L 369.595472 600.647096 +L 369.660617 587.063342 +L 369.713918 594.74641 +L 369.773141 585.931516 +L 369.731685 597.556605 +L 369.802752 595.748224 +L 369.820519 611.65802 +L 369.87382 584.930039 +L 369.915276 603.108622 +L 369.921198 598.504877 +L 369.986343 621.523333 +L 370.00411 611.551357 +L 370.033721 622.111655 +L 370.063333 597.737959 +L 370.104789 611.031809 +L 370.140323 601.608854 +L 370.181779 623.232881 +L 370.199545 622.772139 +L 370.205468 622.595605 +L 370.264691 639.204422 +L 370.323913 630.172608 +L 370.448281 612.946523 +L 370.454204 614.33146 +L 370.460126 618.770238 +L 370.537116 602.391935 +L 370.54896 609.7894 +L 370.554883 605.972118 +L 370.631872 622.403515 +L 370.637795 620.673108 +L 370.726629 639.341716 +L 370.803619 629.148863 +L 370.927987 594.552055 +L 370.83323 636.688089 +L 370.957598 599.807678 +L 370.975365 611.604561 +L 371.016821 590.180031 +L 371.064199 597.113165 +L 371.076044 601.760116 +L 371.135267 587.1522 +L 371.147111 595.084319 +L 371.188567 572.228839 +L 371.259635 579.0812 +L 371.372158 603.863446 +L 371.271479 578.761571 +L 371.37808 602.408974 +L 371.431381 595.457022 +L 371.472837 609.79781 +L 371.484682 614.34261 +L 371.537982 602.212278 +L 371.58536 611.104904 +L 371.620894 594.17871 +L 371.686039 618.422561 +L 371.709728 629.64856 +L 371.786718 612.206287 +L 371.798563 607.025036 +L 371.840019 616.032202 +L 371.893319 612.904448 +L 371.922931 626.81398 +L 371.952542 606.887865 +L 371.964387 611.229433 +L 371.988076 603.263937 +L 372.011765 619.157874 +L 372.070988 613.265241 +L 372.236812 583.873277 +L 372.242734 587.286399 +L 372.248656 587.360709 +L 372.260501 588.590922 +L 372.432247 559.800736 +L 372.544771 583.431411 +L 372.49147 555.375542 +L 372.550693 579.383186 +L 372.580305 570.149352 +L 372.651372 585.844696 +L 372.704673 582.192108 +L 372.77574 602.871108 +L 372.870497 570.05223 +L 372.787585 603.586272 +L 372.941564 580.968187 +L 372.953409 583.628386 +L 373.000787 568.823538 +L 373.012631 573.418256 +L 373.042243 569.323047 +L 373.089621 585.615028 +L 373.095543 593.734816 +L 373.172533 572.765476 +L 373.196222 580.79922 +L 373.225834 567.83915 +L 373.273212 586.335617 +L 373.302823 584.943927 +L 373.308746 582.947333 +L 373.338357 606.30234 +L 373.350202 605.437042 +L 373.456803 628.624899 +L 373.468648 618.149904 +L 373.516026 610.432859 +L 373.504181 624.779291 +L 373.55156 616.452409 +L 373.587093 635.792183 +L 373.628549 601.752449 +L 373.652238 612.745158 +L 373.741073 582.53936 +L 373.782529 586.211486 +L 373.788451 586.12595 +L 373.800296 582.098503 +L 373.859518 602.029717 +L 373.883208 593.548799 +L 373.88913 597.236168 +L 373.96612 579.497555 +L 373.983886 589.714293 +L 373.995731 588.537602 +L 374.013498 599.4757 +L 374.01942 598.510528 +L 374.025342 602.427368 +L 374.108254 588.423552 +L 374.126021 601.529997 +L 374.197089 579.007856 +L 374.244467 590.178894 +L 374.256312 597.079581 +L 374.315534 572.454728 +L 374.321457 571.673016 +L 374.351068 580.028893 +L 374.362913 579.724662 +L 374.410291 585.164228 +L 374.463592 575.098109 +L 374.469514 571.326354 +L 374.528737 594.654143 +L 374.540581 592.566915 +L 374.635338 610.277185 +L 374.647183 592.458652 +L 374.653105 592.343231 +L 374.736017 599.122196 +L 374.676794 581.232776 +L 374.753784 590.117884 +L 374.759706 587.565068 +L 374.807084 608.471559 +L 374.813007 608.169538 +L 374.824851 619.710502 +L 374.884074 599.629397 +L 374.913685 603.942389 +L 374.984753 585.562768 +L 374.92553 605.27848 +L 375.032131 592.314126 +L 375.05582 599.169112 +L 375.097276 585.363498 +L 375.138732 593.144544 +L 375.203877 590.035406 +L 375.150577 596.831449 +L 375.2098 591.139796 +L 375.280867 615.632411 +L 375.328245 606.613873 +L 375.334168 607.001996 +L 375.351935 602.4595 +L 375.387468 590.413557 +L 375.440769 610.941626 +L 375.482225 620.611957 +L 375.511836 598.95956 +L 375.517759 602.208652 +L 375.606593 588.545221 +L 375.541448 606.688979 +L 375.636204 598.540006 +L 375.725039 616.114417 +L 375.653971 590.514735 +L 375.742806 608.14258 +L 375.825718 587.376442 +L 375.861251 591.123996 +L 375.914552 611.052167 +L 375.973775 593.568467 +L 375.979697 593.467532 +L 376.09222 583.612589 +L 376.03892 594.662172 +L 376.104065 583.964155 +L 376.109987 585.862636 +L 376.145521 571.281094 +L 376.157366 575.312485 +L 376.163288 566.096188 +L 376.252122 590.042297 +L 376.388335 625.584421 +L 376.400179 618.632635 +L 376.524547 598.619028 +L 376.471247 619.546256 +L 376.560081 603.223597 +L 376.577848 617.677095 +L 376.631149 593.422071 +L 376.666682 602.776107 +L 376.696294 614.999618 +L 376.761439 601.241905 +L 376.773283 603.853998 +L 376.779206 600.123181 +L 376.844351 628.08682 +L 376.856195 616.94293 +L 376.921341 629.060301 +L 376.956874 611.808389 +L 376.962797 612.505727 +L 376.974641 616.311288 +L 377.004253 599.208636 +L 377.010175 601.639437 +L 377.134543 584.969966 +L 377.093087 604.316343 +L 377.140465 587.846544 +L 377.146387 591.65083 +L 377.217455 580.526922 +L 377.241144 591.046335 +L 377.2826 575.934377 +L 377.353667 581.242163 +L 377.383279 602.485166 +L 377.454346 583.010877 +L 377.513569 573.689021 +L 377.560947 585.781507 +L 377.56687 583.450089 +L 377.637937 596.125723 +L 377.643859 595.697995 +L 377.750461 623.076983 +L 377.685315 591.55212 +L 377.780072 617.338603 +L 377.880751 626.00737 +L 377.85114 612.419238 +L 377.892596 623.482555 +L 378.011041 596.745508 +L 377.916285 625.532369 +L 378.03473 603.256057 +L 378.070264 621.916668 +L 378.135409 599.198272 +L 378.141332 606.614856 +L 378.194632 587.592313 +L 378.165021 609.872746 +L 378.271622 594.483897 +L 378.336767 614.282574 +L 378.390068 599.252837 +L 378.407834 585.734228 +L 378.44929 601.680211 +L 378.496669 599.75379 +L 378.549969 592.29665 +L 378.538125 602.331765 +L 378.561814 599.832891 +L 378.567736 605.661313 +L 378.621037 589.128324 +L 378.662493 595.622957 +L 378.674337 584.040456 +L 378.739482 596.026826 +L 378.786861 590.920755 +L 378.792783 591.15837 +L 378.798705 589.668744 +L 378.893462 569.369965 +L 378.923073 581.246657 +L 378.988219 569.354089 +L 379.041519 585.566533 +L 379.100742 569.46806 +L 379.154043 580.005672 +L 379.242877 606.06272 +L 379.189576 574.757678 +L 379.284333 596.654543 +L 379.319867 592.171018 +L 379.3554 604.451023 +L 379.385012 598.197821 +L 379.390934 604.002796 +L 379.467924 580.481776 +L 379.473846 582.3576 +L 379.479768 580.66748 +L 379.538991 594.272594 +L 379.544913 590.130457 +L 379.621903 605.164158 +L 379.651515 594.548985 +L 379.669281 580.608766 +L 379.764038 589.78769 +L 379.775883 592.213705 +L 379.781805 586.923154 +L 379.793649 586.934669 +L 379.823261 578.191227 +L 379.852872 606.373236 +L 379.882484 594.39589 +L 379.900251 603.421629 +L 379.929862 582.109817 +L 379.995007 597.438086 +L 380.00093 597.576363 +L 380.012774 590.184273 +L 380.089764 613.753574 +L 380.107531 618.956978 +L 380.119375 603.739881 +L 380.13122 604.229845 +L 380.137142 600.54212 +L 380.202287 610.119736 +L 380.237821 600.678888 +L 380.332578 623.80217 +L 380.255588 596.879381 +L 380.356267 619.442708 +L 380.492479 573.339398 +L 380.563547 585.958662 +L 380.587236 572.203661 +L 380.610925 567.533893 +L 380.658303 583.174519 +L 380.681992 600.331398 +L 380.729371 577.737875 +L 380.764904 579.037005 +L 380.770827 583.507879 +L 380.800438 569.782507 +L 380.877428 582.603447 +L 380.895195 574.043707 +L 380.901117 572.276073 +L 380.924806 583.399497 +L 380.966262 578.399465 +L 381.007718 599.711105 +L 381.078786 591.087551 +L 381.120242 575.81895 +L 381.191309 586.92826 +L 381.262377 601.224229 +L 381.209076 581.874135 +L 381.291988 588.086006 +L 381.303833 577.421821 +L 381.3749 601.241126 +L 381.392667 595.396159 +L 381.428201 609.210052 +L 381.434123 609.114324 +L 381.45189 612.119968 +L 381.499268 594.272089 +L 381.564413 577.810899 +L 381.623636 582.026067 +L 381.65917 597.739618 +L 381.736159 587.133592 +L 381.742082 582.333516 +L 381.830916 598.284177 +L 381.872372 616.379029 +L 381.931595 595.469095 +L 381.943439 597.391483 +L 381.949362 594.608486 +L 382.020429 617.876108 +L 382.067808 616.233972 +L 382.186253 600.189347 +L 382.103341 617.953956 +L 382.198098 600.349797 +L 382.227709 606.628706 +L 382.215865 598.717926 +L 382.233632 604.927756 +L 382.340233 614.050226 +L 382.251398 600.703356 +L 382.352077 611.586988 +L 382.375766 585.246022 +L 382.476445 600.790159 +L 382.494212 614.848981 +L 382.529746 585.198639 +L 382.553435 589.838639 +L 382.571202 578.892848 +L 382.636347 598.130362 +L 382.654114 595.312266 +L 382.660036 595.718208 +L 382.665958 591.133184 +L 382.719259 585.031147 +L 382.754793 606.5353 +L 382.760715 605.584925 +L 382.867316 582.838888 +L 382.885083 586.115932 +L 383.021296 621.19032 +L 383.092363 589.359381 +L 383.181197 599.573725 +L 383.264109 587.47213 +L 383.204887 605.54122 +L 383.293721 596.437132 +L 383.347021 614.820546 +L 383.305565 595.861286 +L 383.406244 598.031512 +L 383.4477 581.182108 +L 383.518768 587.39745 +L 383.530612 592.145719 +L 383.536535 584.866886 +L 383.542457 587.756047 +L 383.660903 560.997663 +L 383.672747 567.481058 +L 383.678669 565.429896 +L 383.73197 584.725229 +L 383.737892 583.138168 +L 383.980706 629.823468 +L 383.749737 582.807365 +L 384.045851 619.721104 +L 384.176141 584.415204 +L 384.093229 623.232701 +L 384.187986 587.334171 +L 384.264976 615.523109 +L 384.312354 604.531148 +L 384.347888 588.340259 +L 384.413033 606.128576 +L 384.418955 611.960789 +L 384.460411 594.941458 +L 384.519634 602.305274 +L 384.661769 629.728249 +L 384.572935 600.840257 +L 384.709147 619.653811 +L 384.744681 591.874781 +L 384.827593 614.224835 +L 384.833515 612.323291 +L 384.869049 626.302948 +L 384.904583 623.680143 +L 384.910505 626.100234 +L 384.993417 614.593395 +L 385.094096 620.470446 +L 385.028951 603.622112 +L 385.10594 617.873764 +L 385.212542 593.340381 +L 385.265842 595.489358 +L 385.396133 576.985812 +L 385.313221 601.406697 +L 385.413899 588.084971 +L 385.4672 613.119811 +L 385.532345 597.50383 +L 385.650791 582.932236 +L 385.609335 605.741255 +L 385.656713 584.408914 +L 385.792926 616.760747 +L 385.810693 611.907838 +L 385.982439 572.563723 +L 385.828459 622.313028 +L 385.988361 577.461704 +L 386.041662 602.17503 +L 386.118651 590.258314 +L 386.148263 575.462567 +L 386.213408 593.078245 +L 386.231175 583.714731 +L 386.290398 598.417255 +L 386.337776 582.180963 +L 386.402921 571.243063 +L 386.420688 558.799494 +L 386.491756 580.673242 +L 386.515445 575.563042 +L 386.556901 589.008055 +L 386.675346 612.835241 +L 386.622046 579.487792 +L 386.699036 609.978739 +L 386.781948 621.04188 +L 386.817481 602.458971 +L 386.84117 588.532026 +L 386.912238 603.344521 +L 386.930005 600.484108 +L 387.018839 629.297809 +L 387.07214 611.68124 +L 387.160974 579.051042 +L 387.214274 579.892994 +L 387.297186 593.581548 +L 387.249808 575.477868 +L 387.350487 592.173399 +L 387.391943 585.149225 +L 387.433399 601.874384 +L 387.451166 597.844032 +L 387.504467 600.154657 +L 387.4867 591.851226 +L 387.522233 594.919499 +L 387.545923 585.526873 +L 387.605145 607.999676 +L 387.622912 602.627889 +L 387.664368 586.427977 +L 387.74728 597.784433 +L 387.812425 609.897085 +L 387.776892 591.163589 +L 387.871648 608.636685 +L 387.942716 591.062998 +L 387.913104 609.21119 +L 387.978249 599.764021 +L 387.984172 608.612812 +L 388.007861 592.76623 +L 388.090773 607.608801 +L 388.203296 585.900861 +L 388.132229 608.193051 +L 388.226985 590.719755 +L 388.386887 633.51133 +L 388.452032 599.25321 +L 388.505333 621.250139 +L 388.511255 621.477095 +L 388.5231 618.713922 +L 388.588245 598.626794 +L 388.635623 612.778728 +L 388.712613 627.624653 +L 388.671157 610.597728 +L 388.754069 619.013824 +L 388.759991 619.408806 +L 388.765914 614.566055 +L 388.771836 615.839906 +L 388.813292 593.965631 +L 388.890282 605.89429 +L 388.961349 618.963008 +L 388.908048 602.147438 +L 388.973194 614.505357 +L 389.06795 632.63672 +L 389.085717 624.67974 +L 389.133095 629.482969 +L 389.251541 598.136445 +L 389.358142 619.923594 +L 389.387754 615.370862 +L 389.42921 588.678722 +L 389.506199 592.356536 +L 389.553578 610.486628 +L 389.624645 602.849206 +L 389.660179 596.606714 +L 389.672023 604.9264 +L 389.701635 618.580645 +L 389.76678 594.633233 +L 389.772702 597.315856 +L 389.778625 595.170335 +L 389.826003 612.107803 +L 389.831925 616.447472 +L 389.914837 599.654928 +L 389.926682 579.967468 +L 390.003671 614.758716 +L 390.015516 610.626397 +L 390.021438 615.064178 +L 390.062894 597.082965 +L 390.116195 603.210343 +L 390.122117 603.298526 +L 390.246485 583.513853 +L 390.287941 584.930246 +L 390.299786 578.133014 +L 390.347164 567.710878 +L 390.382698 590.024029 +L 390.394542 586.110128 +L 390.406387 582.042037 +L 390.447843 598.823939 +L 390.459687 596.262205 +L 390.566289 624.769762 +L 390.584055 619.306018 +L 390.643278 601.669048 +L 390.5959 620.029137 +L 390.708424 614.279396 +L 390.844636 629.305963 +L 390.886092 639.509437 +L 391.01046 589.980775 +L 391.117061 629.720716 +L 391.152595 616.218047 +L 391.276963 577.280208 +L 391.176284 618.79191 +L 391.306574 590.441997 +L 391.318419 592.704745 +L 391.389486 613.040365 +L 391.430942 597.253447 +L 391.472398 576.780982 +L 391.537544 596.258667 +L 391.55531 609.096253 +L 391.6323 586.595626 +L 391.638222 590.314841 +L 391.655989 581.990011 +L 391.727057 599.338026 +L 391.732979 599.240532 +L 391.738901 600.39711 +L 391.780357 604.125978 +L 391.76259 599.057692 +L 391.792202 602.820327 +L 391.851425 586.284389 +L 391.898803 600.544367 +L 391.928415 599.644033 +L 391.934337 608.891666 +L 391.946181 607.166904 +L 392.005404 620.925614 +L 392.040938 602.776117 +L 392.064627 581.451867 +L 392.153461 589.32988 +L 392.212684 612.53404 +L 392.271907 596.81829 +L 392.301519 583.440544 +L 392.372586 598.892856 +L 392.496954 614.115698 +L 392.414042 593.327971 +L 392.514721 611.058386 +L 392.568021 593.333453 +L 392.621322 610.60188 +L 392.6687 601.362281 +L 392.692389 615.818274 +L 392.722001 610.145666 +L 392.840447 628.463763 +L 392.970737 590.226093 +L 392.988504 598.480194 +L 393.095105 611.079048 +L 393.02996 588.738713 +L 393.124716 604.768236 +L 393.183939 597.717377 +L 393.154328 607.841688 +L 393.225395 604.64458 +L 393.243162 614.171691 +L 393.31423 592.091734 +L 393.373452 601.583957 +L 393.408986 591.811107 +L 393.485976 603.093711 +L 393.527432 581.736396 +L 393.734712 609.710438 +L 393.622188 580.168031 +L 393.740634 608.388173 +L 393.85908 591.079307 +L 393.865002 592.41493 +L 393.983448 617.610446 +L 394.036749 612.246661 +L 394.090049 598.921842 +L 394.125583 615.321313 +L 394.14335 610.004266 +L 394.149272 614.044718 +L 394.202573 596.916642 +L 394.226262 599.06324 +L 394.238106 587.797851 +L 394.309174 618.934314 +L 394.326941 611.523294 +L 394.35063 613.393155 +L 394.469075 593.856149 +L 394.510531 577.305185 +L 394.605288 608.525749 +L 394.735578 588.499147 +L 394.652666 610.820415 +L 394.741501 591.928912 +L 394.759267 607.411197 +L 394.830335 590.456187 +L 394.854024 597.561084 +L 394.907325 586.843634 +L 394.936936 605.421974 +L 394.942858 605.600243 +L 394.966547 603.66146 +L 395.055382 616.249621 +L 395.221206 564.320696 +L 395.084993 616.622944 +L 395.250817 568.679622 +L 395.31004 604.04576 +L 395.38703 594.250171 +L 395.487709 599.374118 +L 395.434408 583.420129 +L 395.493631 594.335967 +L 395.606154 570.463557 +L 395.541009 605.992293 +L 395.641688 580.844249 +L 395.742367 595.630688 +L 395.754212 586.994602 +L 395.87858 563.368694 +L 395.902269 578.095493 +L 396.044404 618.486982 +L 396.109549 607.620049 +L 396.133238 592.30789 +L 396.186539 622.507896 +L 396.21615 614.153687 +L 396.257606 616.860633 +L 396.239839 608.192893 +L 396.29314 608.761723 +L 396.299062 599.984 +L 396.328673 618.797668 +L 396.405663 602.447633 +L 396.535953 631.381344 +L 396.417508 601.775356 +L 396.577409 613.7583 +L 396.743233 580.149707 +L 396.861679 605.046482 +L 396.778767 574.474991 +L 396.891291 602.088277 +L 397.110415 565.905339 +L 396.903135 606.390588 +L 397.116337 568.765068 +L 397.217016 591.022709 +L 397.234783 584.536936 +L 397.246628 581.108729 +L 397.264395 594.330293 +L 397.317695 607.473077 +L 397.299928 592.926886 +L 397.359151 595.549387 +L 397.365074 592.787089 +L 397.430219 603.259174 +L 397.465752 596.636852 +L 397.519053 583.751332 +L 397.554587 598.98903 +L 397.572354 591.363136 +L 397.619732 602.420996 +L 397.601965 590.460427 +L 397.684877 595.887664 +L 397.880312 631.548817 +L 397.886235 628.051191 +L 398.046136 569.345763 +L 398.069826 571.363941 +L 398.08167 569.378139 +L 398.15866 585.948407 +L 398.247494 610.590272 +L 398.265261 593.882652 +L 398.389629 559.529457 +L 398.318562 594.34435 +L 398.395551 564.151296 +L 398.419241 581.857702 +L 398.519919 577.430152 +L 398.525842 577.549292 +L 398.531764 574.647037 +L 398.57322 601.518223 +L 398.590987 591.543543 +L 398.620598 603.229702 +L 398.685743 574.620503 +L 398.709433 571.36868 +L 398.739044 579.024645 +L 398.798267 590.73127 +L 398.827878 572.587251 +L 398.833801 574.766476 +L 398.928557 566.371066 +L 398.893023 580.367328 +L 398.940402 571.344297 +L 399.058847 607.467174 +L 399.082537 602.004315 +L 399.094381 594.345248 +L 399.153604 620.914237 +L 399.206905 629.366643 +L 399.248361 610.301964 +L 399.254283 615.844885 +L 399.277972 605.622921 +L 399.331273 626.269723 +L 399.366806 612.474321 +L 399.396418 621.599205 +L 399.420107 609.92145 +L 399.449718 598.1455 +L 399.508941 614.30161 +L 399.53263 604.641328 +L 399.550397 610.351709 +L 399.621465 588.603712 +L 399.627387 592.801281 +L 399.633309 590.888473 +L 399.692532 603.344186 +L 399.704377 602.598398 +L 399.751755 608.990949 +L 399.775444 595.722583 +L 399.805056 596.525921 +L 399.858356 570.607273 +L 399.911657 594.668911 +L 399.917579 597.934508 +L 399.982724 576.86143 +L 399.988646 578.125564 +L 399.994569 575.581634 +L 400.012336 587.595459 +L 400.089325 579.59556 +L 400.207771 606.363409 +L 400.219616 603.994398 +L 400.338061 590.12769 +L 400.266994 607.497602 +L 400.343984 595.3984 +L 400.486119 565.261333 +L 400.51573 575.401193 +L 400.580875 606.067844 +L 400.657865 595.498498 +L 400.669709 590.131356 +L 400.699321 603.033663 +L 400.758544 597.086786 +L 400.805922 585.083179 +L 400.888834 615.65325 +L 400.971746 606.344389 +L 400.942135 618.171476 +L 400.995435 616.812867 +L 401.00728 614.455442 +L 401.143492 592.982265 +L 401.149415 593.099209 +L 401.250093 614.581014 +L 401.179026 591.624985 +L 401.285627 606.176196 +L 401.350772 601.225156 +L 401.333005 613.052005 +L 401.386306 610.549178 +L 401.398151 618.969606 +L 401.469218 602.341135 +L 401.498829 618.505856 +L 401.587664 613.405255 +L 401.55213 629.165504 +L 401.599508 625.23776 +L 401.717954 602.247733 +L 401.747566 611.103295 +L 401.753488 616.356358 +L 401.800866 599.264799 +L 401.860089 612.491513 +L 401.990379 582.699214 +L 402.085136 597.378803 +L 402.04368 582.097135 +L 402.102903 587.264977 +L 402.108825 587.02353 +L 402.114747 588.219322 +L 402.203582 620.854756 +L 402.239115 606.031158 +L 402.363483 633.277397 +L 402.38125 628.521007 +L 402.422706 613.62439 +L 402.481929 631.921502 +L 402.683287 596.983412 +L 402.724743 613.765752 +L 402.819499 625.136164 +L 402.766199 607.982957 +L 402.837266 619.214424 +L 402.997168 580.608823 +L 402.855033 623.260039 +L 403.014935 587.146073 +L 403.026779 589.970742 +L 403.038624 588.798202 +L 403.091925 612.920066 +L 403.168914 623.148183 +L 403.103769 610.303726 +L 403.204448 616.53975 +L 403.234059 617.813722 +L 403.245904 608.113851 +L 403.382117 576.526564 +L 403.423573 594.782578 +L 403.512407 594.440009 +L 403.607163 602.168389 +L 403.542018 580.935405 +L 403.619008 597.905327 +L 403.630853 593.886992 +L 403.70192 607.460917 +L 403.713765 605.935537 +L 403.719687 606.802994 +L 403.743376 597.822182 +L 403.749298 601.382977 +L 403.796677 570.94698 +L 403.867744 587.910006 +L 403.980268 605.744578 +L 403.903278 579.067999 +L 403.998034 600.278398 +L 404.086869 565.400665 +L 404.134247 569.783387 +L 404.163858 577.99219 +L 404.146092 565.144915 +L 404.229004 567.081201 +L 404.234926 564.466939 +L 404.300071 583.399306 +L 404.305993 581.004322 +L 404.388905 609.110759 +L 404.45405 605.031283 +L 404.513273 591.640224 +L 404.548807 608.339191 +L 404.554729 612.580247 +L 404.619874 597.240397 +L 404.625797 599.015369 +L 404.649486 584.888879 +L 404.702786 619.316927 +L 404.726476 609.482655 +L 404.73832 608.523727 +L 404.750165 611.247966 +L 404.779776 624.370542 +L 404.833077 608.174856 +L 404.868611 618.132374 +L 404.969289 608.108592 +L 404.927833 626.005012 +L 404.987056 613.499613 +L 405.016668 613.611182 +L 405.034435 606.361856 +L 405.052201 590.448294 +L 405.146958 597.983869 +L 405.22987 596.172195 +L 405.277248 608.97038 +L 405.383849 586.332261 +L 405.395694 591.527197 +L 405.443072 605.975259 +L 405.508217 600.678202 +L 405.602974 579.36378 +L 405.561518 602.734205 +L 405.632585 587.787465 +L 405.715497 585.033186 +L 405.780643 608.581252 +L 405.839865 594.888319 +L 405.869477 609.231249 +L 405.893166 603.517759 +L 406.053068 581.633106 +L 406.064912 587.480864 +L 406.171514 621.812959 +L 406.242581 602.04906 +L 406.260348 590.588992 +L 406.307726 612.981089 +L 406.355104 626.857751 +L 406.414327 616.614188 +L 406.491317 588.586178 +L 406.556462 597.389597 +L 406.633452 607.892277 +L 406.574229 594.161584 +L 406.645296 597.252688 +L 406.734131 602.338133 +L 406.763742 580.747564 +L 406.864421 597.557501 +L 406.781509 579.263127 +L 406.899955 591.412308 +L 406.905877 590.699754 +L 406.953255 596.863912 +L 406.971022 594.451659 +L 407.030245 611.506483 +L 406.994711 594.383117 +L 407.059857 594.667548 +L 407.077623 587.801278 +L 407.154613 609.36295 +L 407.160535 612.874079 +L 407.219758 588.634673 +L 407.255292 603.618108 +L 407.261214 603.59473 +L 407.409271 588.825053 +L 407.415194 590.973572 +L 407.504028 612.898799 +L 407.539562 611.364081 +L 407.616551 596.480187 +L 407.569173 614.035084 +L 407.652085 604.341624 +L 407.658007 601.880479 +L 407.705386 620.482856 +L 407.729075 616.966803 +L 407.841598 633.63442 +L 407.859365 626.314402 +L 407.894899 611.604253 +L 407.954122 630.704572 +L 407.989655 632.27643 +L 408.0015 621.791472 +L 408.025189 611.381302 +L 408.102179 631.43089 +L 408.256158 603.428236 +L 408.167324 642.505308 +L 408.273925 609.63908 +L 408.315381 625.180495 +L 408.356837 606.441011 +L 408.386449 613.951287 +L 408.49305 597.346052 +L 408.404216 617.36289 +L 408.504894 606.95827 +L 408.647029 574.72646 +L 408.522661 618.131178 +L 408.70033 579.539214 +L 408.801009 623.733311 +L 408.860232 620.176964 +L 408.877998 615.182361 +L 408.889843 628.949229 +L 408.895765 626.056653 +L 408.913532 631.655 +L 408.96091 605.983151 +L 408.990522 616.351427 +L 409.043822 577.370279 +L 409.055667 579.342357 +L 409.061589 571.143588 +L 409.120812 582.012148 +L 409.168191 574.253267 +L 409.174113 572.690254 +L 409.215569 587.639561 +L 409.227413 584.898098 +L 409.298481 595.201454 +L 409.334015 583.568441 +L 409.345859 573.496497 +L 409.381393 596.402977 +L 409.434693 592.511942 +L 409.547217 617.160552 +L 409.564984 617.084263 +L 409.624207 628.330303 +L 409.665663 614.524231 +L 409.683429 621.039166 +L 409.754497 603.625951 +L 409.724885 622.741821 +L 409.807797 612.069557 +L 409.86702 621.997351 +L 409.920321 613.046524 +L 410.003233 582.588538 +L 410.044689 592.946621 +L 410.109834 577.09504 +L 410.092067 593.56712 +L 410.157212 588.658353 +L 410.28158 621.734104 +L 410.174979 586.696835 +L 410.317114 611.034019 +L 410.429638 593.544542 +L 410.477016 599.94897 +L 410.530316 587.465724 +L 410.536239 589.177843 +L 410.542161 592.890673 +L 410.571772 580.958764 +L 410.630995 583.358153 +L 410.636918 580.330745 +L 410.69614 606.851735 +L 410.790897 619.678376 +L 410.731674 602.636135 +L 410.808664 608.380763 +L 410.838275 595.117979 +L 410.933032 596.358978 +L 411.045555 614.241637 +L 410.986332 586.337813 +L 411.0574 609.011568 +L 411.104778 590.132951 +L 411.152156 608.725455 +L 411.18769 628.102883 +L 411.240991 602.489841 +L 411.258758 606.601038 +L 411.34167 594.365512 +L 411.288369 609.861739 +L 411.371281 603.081334 +L 411.448271 613.3371 +L 411.412737 594.948467 +L 411.47196 602.53655 +L 411.566717 570.565365 +L 411.590406 578.952516 +L 411.697007 595.316169 +L 411.631862 576.324176 +L 411.714774 594.333325 +L 411.768074 601.592664 +L 411.80953 589.804705 +L 411.892442 575.611633 +L 411.850986 597.230784 +L 411.916131 584.718345 +L 411.96351 609.955697 +L 412.046422 607.883348 +L 412.117489 590.235127 +L 412.188557 591.84511 +L 412.194479 591.987775 +L 412.289235 575.534907 +L 412.218168 592.499666 +L 412.318847 579.336286 +L 412.389914 597.806978 +L 412.336614 577.27165 +L 412.449137 590.904173 +L 412.537972 584.810828 +L 412.484671 597.911028 +L 412.549816 588.325495 +L 412.668262 627.736704 +L 412.697873 620.269578 +L 412.863697 565.106298 +L 412.875542 568.657867 +L 413.047288 620.709103 +L 413.0769 596.035181 +L 413.171656 604.291913 +L 413.177578 600.168488 +L 413.230879 628.613432 +L 413.272335 610.474225 +L 413.301946 622.80106 +L 413.367092 588.999036 +L 413.373014 594.666137 +L 413.390781 585.291216 +L 413.455926 608.158302 +L 413.467771 604.960278 +L 413.479615 603.630549 +L 413.497382 608.092341 +L 413.550683 623.941598 +L 413.615828 620.001142 +L 413.710584 597.086028 +L 413.740196 603.209145 +L 413.799419 600.671248 +L 413.888253 622.60942 +L 413.953398 598.207659 +L 413.923787 627.976439 +L 414.024465 606.768665 +L 414.054077 611.465937 +L 414.172523 592.136043 +L 414.178445 602.355899 +L 414.225823 574.485063 +L 414.273201 584.528172 +L 414.362036 569.333795 +L 414.32058 585.048478 +L 414.379803 581.271977 +L 414.439025 611.646754 +L 414.516015 603.468151 +L 414.60485 589.597459 +L 414.551549 616.229947 +L 414.622616 602.04899 +L 414.717373 619.978445 +L 414.640383 596.761741 +L 414.746984 611.773347 +L 414.806207 602.40795 +L 414.853586 613.335223 +L 414.900964 628.10927 +L 414.972031 619.197135 +L 415.013487 608.495213 +L 415.060866 623.890509 +L 415.07271 621.300182 +L 415.155622 635.823496 +L 415.185234 623.054343 +L 415.27999 576.234404 +L 415.309602 596.504434 +L 415.428047 618.371965 +L 415.321446 595.924489 +L 415.457659 613.525626 +L 415.582027 591.140237 +L 415.534648 617.260988 +L 415.587949 592.495222 +L 415.653094 605.381905 +L 415.670861 588.781013 +L 415.69455 593.714703 +L 415.712317 594.895843 +L 415.824841 578.531079 +L 415.889986 601.76372 +L 415.937364 587.562187 +L 416.002509 589.736921 +L 416.085421 562.98737 +L 416.197945 590.408433 +L 416.310468 620.056353 +L 416.233478 583.887471 +L 416.351924 614.241443 +L 416.458525 585.689657 +L 416.476292 589.134133 +L 416.482214 588.332413 +L 416.505903 595.788528 +L 416.553282 605.372765 +L 416.606582 589.351297 +L 416.612505 589.634914 +L 416.659883 607.400174 +L 416.73095 602.938817 +L 416.748717 590.126496 +L 416.813862 607.319152 +L 416.849396 592.686044 +L 416.855318 593.183841 +L 416.861241 587.079263 +L 416.902697 579.294218 +L 416.944153 594.378564 +L 416.955997 592.812933 +L 417.003376 600.575372 +L 417.038909 589.923882 +L 417.14551 569.402282 +L 417.098132 591.820757 +L 417.157355 570.766642 +L 417.181044 563.504229 +L 417.311334 599.073026 +L 417.42978 583.963953 +L 417.388324 603.276831 +L 417.435702 585.70896 +L 417.489003 582.30856 +L 417.477158 591.818215 +L 417.548226 583.74981 +L 417.607449 600.999674 +L 417.666672 594.886347 +L 417.737739 587.594208 +L 417.702205 595.19146 +L 417.755506 590.980884 +L 417.76735 600.576221 +L 417.850263 580.443684 +L 417.862107 587.115807 +L 417.879874 586.009384 +L 417.897641 587.451735 +L 417.956864 571.939418 +L 417.92133 590.658801 +L 417.992397 584.409363 +L 418.057543 601.757964 +L 418.110843 597.732716 +L 418.164144 611.873345 +L 418.264823 606.297003 +L 418.353657 592.950901 +L 418.306279 611.886625 +L 418.371424 600.689104 +L 418.418802 622.85561 +L 418.489869 613.606381 +L 418.655693 581.400219 +L 418.785984 599.960808 +L 418.726761 572.061535 +L 418.791906 595.366666 +L 418.892585 585.125917 +L 418.803751 596.722125 +L 418.910352 593.375573 +L 419.011031 625.271632 +L 419.03472 609.860635 +L 419.123554 594.280618 +L 419.147243 603.952764 +L 419.16501 609.074015 +L 419.194622 594.028264 +L 419.242 600.818041 +L 419.354523 591.599125 +L 419.401902 610.903127 +L 419.478891 595.808496 +L 419.585492 572.069095 +L 419.597337 575.730739 +L 419.662482 598.639607 +L 419.609182 575.335351 +L 419.73355 585.245889 +L 419.751316 580.294488 +L 419.769083 587.304254 +L 419.775006 594.100096 +L 419.840151 562.39704 +L 419.86384 569.94858 +L 419.899374 564.457293 +L 419.94083 591.670739 +L 419.946752 589.639238 +L 419.99413 603.207901 +L 420.077042 620.664972 +L 420.112576 614.551542 +L 420.118498 614.647708 +L 420.130343 619.153156 +L 420.189566 598.635015 +L 420.195488 598.680538 +L 420.331701 614.798271 +L 420.337623 611.852053 +L 420.473835 596.959761 +L 420.367234 613.854847 +L 420.48568 601.156069 +L 420.497525 605.394413 +L 420.509369 597.467904 +L 420.515291 598.132507 +L 420.604126 576.802857 +L 420.533058 600.110155 +L 420.627815 593.331987 +L 420.651504 608.443862 +L 420.740338 599.142861 +L 420.758105 607.725937 +L 420.817328 592.744712 +L 420.852862 601.627398 +L 420.941696 584.32494 +L 420.959463 598.522747 +L 420.994997 607.791466 +L 421.066064 599.20031 +L 421.196354 571.682925 +L 421.083831 599.373592 +L 421.231888 580.633095 +L 421.285189 602.195114 +L 421.368101 593.717902 +L 421.374023 593.788264 +L 421.379945 589.57495 +L 421.427324 622.427743 +L 421.462857 606.869419 +L 421.587225 629.406437 +L 421.480624 604.281298 +L 421.59907 617.405182 +L 421.782661 572.962284 +L 421.670137 619.008438 +L 421.794505 588.67289 +L 421.865573 603.552206 +L 421.824117 588.544243 +L 421.912951 599.539211 +L 421.978096 586.090427 +L 422.019552 603.096585 +L 422.031397 613.198203 +L 422.078775 593.123659 +L 422.161687 571.698658 +L 422.102464 596.389784 +L 422.191299 586.948074 +L 422.286055 609.490431 +L 422.209065 586.781362 +L 422.315667 595.807893 +L 422.440035 576.419405 +L 422.345278 595.831855 +L 422.457801 584.182569 +L 422.463724 589.700238 +L 422.534791 569.779143 +L 422.564403 586.530937 +L 422.623625 560.589297 +L 422.688771 575.133439 +L 422.706537 590.497837 +L 422.783527 573.719608 +L 422.807216 584.501745 +L 422.84275 593.993417 +L 422.872361 581.834631 +L 422.931584 574.584127 +L 422.97304 588.162678 +L 422.978963 588.387075 +L 423.055952 580.374297 +L 423.038185 592.020348 +L 423.079641 590.538799 +L 423.174398 585.626384 +L 423.209932 605.653416 +L 423.304688 592.750336 +L 423.25731 617.92215 +L 423.316533 599.779252 +L 423.363911 584.066039 +L 423.446823 620.641702 +L 423.559347 597.441879 +L 423.571191 601.792007 +L 423.606725 611.271791 +L 423.648181 588.927729 +L 423.654103 592.48551 +L 423.665948 576.861512 +L 423.760704 596.252533 +L 423.790316 616.925818 +L 423.82585 593.972141 +L 423.896917 612.596 +L 423.908762 604.681281 +L 423.973907 613.696726 +L 424.00944 609.72377 +L 424.015363 612.322952 +L 424.08643 598.039934 +L 424.116042 610.588971 +L 424.121964 605.9884 +L 424.210798 620.123706 +L 424.234487 626.120689 +L 424.29371 614.65205 +L 424.317399 594.903899 +L 424.412156 600.678881 +L 424.424001 599.475751 +L 424.465457 588.652884 +L 424.524679 606.98627 +L 424.566135 619.319971 +L 424.601669 598.149842 +L 424.631281 607.154462 +L 424.720115 595.149295 +L 424.672737 610.698891 +L 424.737882 606.107748 +L 424.743804 606.112138 +L 424.761571 606.425335 +L 424.755649 603.147951 +L 424.767493 605.441085 +L 424.844483 581.350187 +L 424.885939 598.907205 +L 424.921473 586.553909 +L 424.897783 599.806643 +L 424.939239 595.523573 +L 424.962929 612.401524 +L 425.028074 595.318479 +L 425.051763 602.640683 +L 425.081374 610.287272 +L 425.12283 599.185843 +L 425.128753 601.086303 +L 425.211665 588.895395 +L 425.241276 593.816348 +L 425.253121 599.578534 +L 425.270887 583.403525 +L 425.341955 587.1016 +L 425.3538 579.718297 +L 425.401178 600.750302 +L 425.448556 586.161506 +L 425.454478 586.285981 +L 425.460401 585.63634 +L 425.543313 569.858176 +L 425.490012 594.803716 +L 425.567002 584.283762 +L 425.590691 606.421456 +L 425.673603 587.460777 +L 425.82166 566.429056 +L 425.697292 593.26273 +L 425.827582 569.115559 +L 425.839427 567.549597 +L 425.845349 562.542807 +L 425.922339 590.207992 +L 425.928261 595.514201 +L 425.999329 575.15657 +L 426.017096 582.803276 +L 426.02894 577.779027 +L 426.111852 591.273388 +L 426.123697 584.724505 +L 426.265832 614.26783 +L 426.283598 609.63311 +L 426.36651 595.457568 +L 426.402044 599.913152 +L 426.425733 604.682592 +L 426.484956 590.330901 +L 426.496801 596.632574 +L 426.561946 615.588996 +L 426.615247 588.5403 +L 426.621169 590.46885 +L 426.65078 571.268479 +L 426.686314 555.67526 +L 426.751459 573.46919 +L 426.757381 577.225744 +L 426.840293 562.650466 +L 426.85806 570.634312 +L 426.887672 563.86481 +L 426.940972 587.505396 +L 426.958739 578.135108 +L 426.982428 583.824101 +L 427.177864 640.745649 +L 427.183786 639.085928 +L 427.189708 639.299293 +L 427.195631 635.86702 +L 427.290387 602.021822 +L 427.355532 610.832175 +L 427.361455 618.180554 +L 427.4266 591.035315 +L 427.444367 594.282041 +L 427.468056 574.34616 +L 427.515434 602.297343 +L 427.550968 597.647061 +L 427.699025 626.382686 +L 427.76417 616.272553 +L 427.776015 602.663316 +L 427.876694 610.605603 +L 427.983295 628.595569 +L 427.91815 604.144262 +L 428.012906 620.463175 +L 428.089896 594.110353 +L 428.131352 604.24993 +L 428.143196 612.592963 +L 428.214264 599.638726 +L 428.226108 602.995471 +L 428.237953 595.674097 +L 428.303098 616.45132 +L 428.338632 596.351252 +L 428.356399 603.24418 +L 428.397855 590.815603 +L 428.403777 590.866656 +L 428.5163 571.261722 +L 428.439311 597.915439 +L 428.522223 574.603681 +L 428.628824 588.110512 +L 428.551834 565.731497 +L 428.652513 578.762461 +L 428.658435 574.403686 +L 428.705814 601.008672 +L 428.735425 597.792144 +L 428.74727 594.044515 +L 428.806493 611.506487 +L 428.95455 629.142505 +L 428.960472 627.005332 +L 429.078918 606.217362 +L 428.996006 627.154727 +L 429.08484 606.955259 +L 429.191441 618.265148 +L 429.149985 600.132999 +L 429.203286 613.838969 +L 429.315809 580.551928 +L 429.333576 582.800744 +L 429.42241 598.238175 +L 429.398721 577.708143 +L 429.452022 590.371316 +L 429.463866 585.557625 +L 429.505322 600.987148 +L 429.546778 595.334871 +L 429.617846 611.140609 +L 429.588234 592.264205 +L 429.659302 596.695038 +L 429.795514 577.907117 +L 429.724447 597.286414 +L 429.807359 586.3051 +L 429.878426 608.036663 +L 429.937649 601.5545 +L 429.949494 594.310108 +L 430.026484 612.260035 +L 430.056095 596.137307 +L 430.186385 628.471359 +L 430.073862 593.882452 +L 430.19823 626.340924 +L 430.316676 589.313368 +L 430.322598 593.52445 +L 430.399588 620.759626 +L 430.334442 589.69159 +L 430.435121 597.077819 +L 430.441044 588.008646 +L 430.518033 605.018578 +L 430.541722 596.023544 +L 430.677935 621.065016 +L 430.583178 591.253766 +L 430.695702 615.753976 +L 430.713469 605.538172 +L 430.778614 627.742341 +L 430.784536 623.47922 +L 430.790459 625.305841 +L 430.849681 609.950783 +L 430.95036 585.929923 +L 431.02735 592.636273 +L 431.145796 615.164121 +L 431.15764 610.321518 +L 431.210941 591.088379 +L 431.270164 608.319373 +L 431.287931 615.314992 +L 431.353076 604.171249 +L 431.376765 611.662427 +L 431.435988 589.479905 +L 431.489288 601.196095 +L 431.495211 607.069808 +L 431.566278 585.412954 +L 431.584045 586.113197 +L 431.589967 585.354077 +L 431.601812 594.652592 +L 431.607734 593.719013 +L 431.666957 589.614543 +L 431.732102 609.065326 +L 431.803169 619.606458 +L 431.850548 602.779995 +L 431.980838 631.157076 +L 431.951227 601.1991 +L 431.98676 627.325181 +L 432.01045 635.286675 +L 432.105206 607.696447 +L 432.111128 619.074178 +L 432.19404 589.495916 +L 432.205885 591.946317 +L 432.276952 602.968096 +L 432.324331 598.215945 +L 432.42501 592.449247 +L 432.336175 601.994676 +L 432.436854 594.944541 +L 432.454621 602.563446 +L 432.513844 578.664172 +L 432.537533 589.221221 +L 432.584911 575.337811 +L 432.614523 601.178277 +L 432.620445 598.772525 +L 432.750735 612.127044 +L 432.650056 592.234407 +L 432.76258 604.135262 +L 432.821803 582.947676 +L 432.881026 597.241911 +L 432.993549 622.76936 +L 433.035005 618.558512 +L 433.135684 601.932743 +L 433.058694 626.461746 +L 433.159373 605.220105 +L 433.165295 607.628388 +L 433.218596 589.989438 +L 433.230441 590.469883 +L 433.236363 589.305628 +L 433.289663 597.859753 +L 433.313353 614.124872 +L 433.348886 586.040501 +L 433.390342 595.253964 +L 433.479177 573.811888 +L 433.508788 584.321737 +L 433.562089 595.026168 +L 433.538399 578.510034 +L 433.615389 585.981646 +L 433.674612 599.259352 +L 433.739757 576.666803 +L 433.887814 598.883297 +L 433.935193 583.902064 +L 433.964804 602.46289 +L 434.000338 597.647721 +L 434.13655 617.375067 +L 434.142473 615.431506 +L 434.172084 598.728858 +L 434.254996 614.851496 +L 434.272763 620.350705 +L 434.314219 596.254849 +L 434.320141 588.376496 +L 434.355675 609.569227 +L 434.42082 597.655945 +L 434.456354 619.141832 +L 434.515577 581.986729 +L 434.521499 590.783857 +L 434.539266 587.982462 +L 434.5748 603.320652 +L 434.610333 598.971159 +L 434.622178 603.486806 +L 434.651789 580.041854 +L 434.711012 595.894375 +L 434.716934 593.072822 +L 434.728779 607.058789 +L 434.811691 600.156501 +L 434.823536 609.797647 +L 434.91237 592.361923 +L 434.918292 597.34963 +L 434.924214 596.070129 +L 434.947904 609.301511 +L 434.983437 604.267025 +L 435.007126 607.170234 +L 435.04266 585.065407 +L 435.066349 592.513617 +L 435.090038 582.556321 +L 435.167028 593.531075 +L 435.172951 590.836751 +L 435.279552 617.127806 +L 435.32693 608.912486 +L 435.445376 590.533493 +L 435.344697 617.443089 +L 435.504599 595.782294 +L 435.605277 602.602094 +L 435.557899 579.976654 +L 435.617122 597.311785 +L 435.723723 632.824128 +L 435.777024 617.636456 +L 435.836247 615.458213 +L 435.806635 624.879532 +L 435.865858 621.966169 +L 435.942848 650.695739 +L 435.984304 637.461612 +L 436.02576 646.775549 +L 436.055371 633.864042 +L 436.161972 602.006595 +L 436.185662 607.880613 +L 436.191584 610.380042 +L 436.256729 594.668004 +L 436.304107 575.931495 +L 436.369252 584.690455 +L 436.404786 594.843789 +L 436.452164 582.924603 +L 436.481776 586.994517 +L 436.612066 635.22648 +L 436.635755 626.408956 +L 436.694978 598.893316 +L 436.77789 603.21637 +L 436.807502 617.899774 +L 436.890414 610.612639 +L 437.014782 583.254784 +L 437.020704 584.401742 +L 437.121383 581.30423 +L 437.097694 593.108988 +L 437.133227 583.649786 +L 437.174683 590.644985 +L 437.222062 583.028517 +L 437.316818 572.812015 +L 437.263518 586.497973 +L 437.328663 581.104468 +L 437.411575 590.07102 +L 437.387886 571.705908 +L 437.441186 583.613105 +L 437.512254 569.865896 +L 437.547787 576.829485 +L 437.666233 597.431136 +L 437.672155 596.841438 +L 437.790601 581.334691 +L 437.749145 603.884742 +L 437.796523 581.85327 +L 437.861669 606.470502 +L 437.909047 585.740759 +L 437.956425 580.313523 +L 437.974192 589.848177 +L 437.986037 595.821481 +L 438.045259 580.234677 +L 438.063026 589.816014 +L 438.074871 573.591817 +L 438.145938 608.593189 +L 438.205161 621.189381 +L 438.240695 605.320354 +L 438.353218 591.333415 +L 438.288073 613.293498 +L 438.359141 592.978013 +L 438.376908 610.033995 +L 438.430208 585.735723 +L 438.465742 594.599466 +L 438.471664 592.309147 +L 438.542732 607.791638 +L 438.560498 618.867279 +L 438.601954 590.43414 +L 438.64341 604.573931 +L 438.791468 577.439201 +L 438.809234 575.209599 +L 438.945447 606.933154 +L 438.957292 604.491404 +L 438.963214 608.07506 +L 439.08166 625.079865 +L 439.087582 620.180459 +L 439.247484 589.421483 +L 439.140882 624.339926 +L 439.26525 595.928906 +L 439.271173 601.542563 +L 439.306706 585.91885 +L 439.365929 587.484366 +L 439.460686 591.7056 +L 439.413308 581.431153 +L 439.478453 588.289294 +L 439.484375 583.971918 +L 439.561365 607.345163 +L 439.567287 600.608398 +L 439.620588 625.523472 +L 439.679811 609.994473 +L 439.810101 583.995825 +L 439.816023 587.54888 +L 439.821945 595.207536 +L 439.893013 577.333883 +L 439.922624 586.413367 +L 440.023303 571.254724 +L 439.981847 588.914211 +L 440.04107 579.980962 +L 440.189127 629.579748 +L 440.218739 628.120447 +L 440.337184 610.10555 +L 440.349029 623.978228 +L 440.437863 597.67305 +L 440.443785 598.010705 +L 440.449708 605.980504 +L 440.508931 585.346445 +L 440.556309 603.638862 +L 440.579998 611.249103 +L 440.627376 595.757371 +L 440.66291 605.134597 +L 440.716211 577.365719 +L 440.781356 580.949132 +L 440.810967 578.715844 +L 440.964947 605.418059 +L 441.02417 590.340953 +L 441.065626 609.799158 +L 441.148538 629.605108 +L 441.189994 619.349671 +L 441.243294 628.275547 +L 441.278828 614.718285 +L 441.290672 617.772441 +L 441.420963 576.149862 +L 441.308439 621.230172 +L 441.450574 576.432781 +L 441.49203 588.905904 +L 441.557175 576.901694 +L 441.592709 561.970938 +L 441.634165 584.281302 +L 441.711155 601.705327 +L 441.651932 576.26946 +L 441.770378 592.049529 +L 441.7763 587.28853 +L 441.829601 608.907001 +L 441.865134 604.182768 +L 441.882901 604.590489 +L 441.888823 602.500161 +L 441.942124 617.933933 +L 442.001347 597.028006 +L 442.11387 625.925134 +L 442.137559 623.055518 +L 442.19086 652.264845 +L 442.261927 636.920421 +L 442.362606 590.423948 +L 442.404062 600.738163 +L 442.427751 611.886517 +L 442.481052 597.510839 +L 442.486974 597.292971 +L 442.510663 581.620089 +L 442.587653 606.616192 +L 442.593575 598.037433 +L 442.658721 608.072457 +L 442.611342 590.565238 +L 442.706099 603.286611 +L 442.765322 596.440364 +L 442.800856 607.961253 +L 442.8127 606.26749 +L 442.854156 612.807842 +L 442.895612 602.797393 +L 442.919301 606.348514 +L 442.972602 599.430926 +L 442.937068 614.456017 +L 443.014058 602.873754 +L 443.043669 610.973732 +L 443.091048 598.26506 +L 443.120659 601.18207 +L 443.185804 595.90098 +L 443.138426 604.708092 +L 443.209493 602.263064 +L 443.351628 634.343618 +L 443.487841 594.718591 +L 443.576675 606.239301 +L 443.529297 586.841501 +L 443.594442 598.409112 +L 443.653665 578.130302 +L 443.71881 592.477078 +L 443.724732 591.795063 +L 443.748421 599.977174 +L 443.760266 599.505514 +L 443.783955 606.881501 +L 443.860945 595.556517 +L 443.890556 584.646103 +L 443.973468 593.094156 +L 444.080069 602.333954 +L 444.044536 588.502146 +L 444.091914 596.185592 +L 444.139292 571.008691 +L 444.21036 581.007811 +L 444.216282 581.221589 +L 444.376184 623.914 +L 444.382106 614.06219 +L 444.411717 626.475517 +L 444.488707 619.642151 +L 444.542008 603.461076 +L 444.54793 603.485807 +L 444.648609 581.386046 +L 444.613075 604.357278 +L 444.666376 592.542475 +L 444.672298 592.436713 +L 444.67822 600.435345 +L 444.713754 584.736372 +L 444.772977 587.771792 +L 444.784821 572.327817 +L 444.855889 588.204798 +L 444.8855 579.575699 +L 444.932879 600.430619 +L 445.009868 594.940745 +L 445.015791 591.773382 +L 445.075014 608.468442 +L 445.104625 599.911038 +L 445.134236 617.387193 +L 445.199382 594.572274 +L 445.228993 612.670116 +L 445.371128 585.158303 +L 445.382972 590.832045 +L 445.436273 607.241243 +L 445.477729 584.639775 +L 445.50734 602.639084 +L 445.625786 620.665763 +L 445.554719 597.196923 +L 445.631708 612.840332 +L 445.667242 620.777053 +L 445.679087 609.665109 +L 445.732387 613.241846 +L 445.756076 615.893956 +L 445.874522 594.593346 +L 445.99889 606.476588 +L 446.069958 589.44633 +L 446.040346 607.948159 +L 446.117336 597.312759 +L 446.194326 624.025553 +L 446.129181 596.228306 +L 446.247626 613.756804 +L 446.253549 613.309223 +L 446.265393 618.880188 +L 446.271315 618.400264 +L 446.277238 625.380923 +L 446.354227 591.124567 +L 446.401606 582.527659 +L 446.443062 606.371429 +L 446.597041 573.564755 +L 446.478595 608.943868 +L 446.62073 586.688225 +L 446.674031 597.420642 +L 446.721409 590.441496 +L 446.851699 559.266413 +L 446.863544 561.202885 +L 446.958301 593.182207 +L 446.993834 583.376445 +L 447.011601 563.916634 +L 447.094513 586.261957 +L 447.100436 582.36068 +L 447.224804 601.840913 +L 447.26626 597.362378 +L 447.284026 602.999659 +L 447.307716 616.233466 +L 447.372861 593.813813 +L 447.378783 584.218137 +L 447.467617 608.537443 +L 447.574218 616.53155 +L 447.52684 601.683152 +L 447.580141 611.915568 +L 447.645286 596.742176 +L 447.698586 598.9933 +L 447.840721 578.602282 +L 447.846644 579.766165 +L 447.911789 597.548771 +L 447.947322 581.185294 +L 447.953245 576.500709 +L 448.012468 605.668904 +L 448.036157 597.431962 +L 448.042079 603.284687 +L 448.107224 578.9635 +L 448.130913 588.494073 +L 448.160525 586.332833 +L 448.178292 600.572048 +L 448.249359 620.80503 +L 448.190136 599.521044 +L 448.296737 610.372304 +L 448.361883 597.761222 +L 448.326349 610.716271 +L 448.415183 599.807038 +L 448.498095 614.020218 +L 448.444795 598.913953 +L 448.521784 600.612907 +L 448.527707 600.554269 +L 448.64023 583.394233 +L 448.604696 604.239551 +L 448.646152 584.190874 +L 448.681686 593.729092 +L 448.740909 569.281833 +L 448.746831 575.891133 +L 448.853432 610.599747 +L 448.782365 571.813632 +L 448.894888 600.399925 +L 448.948189 584.036693 +L 448.995567 607.307423 +L 449.013334 592.94349 +L 449.155469 623.267382 +L 449.232459 601.237086 +L 449.285759 619.332248 +L 449.291682 621.276998 +L 449.344982 603.569651 +L 449.368671 611.548385 +L 449.41605 594.780225 +L 449.481195 609.195831 +L 449.493039 616.933665 +L 449.54634 599.864007 +L 449.593718 611.827533 +L 449.670708 591.329629 +L 449.62333 617.274103 +L 449.712164 603.963977 +L 449.718086 608.432118 +L 449.777309 575.958407 +L 449.789154 570.97318 +L 449.854299 590.942919 +L 449.966822 605.673537 +L 449.943133 583.142797 +L 449.972744 599.495319 +L 449.978667 599.321103 +L 450.026045 590.662106 +L 450.073423 606.531918 +L 450.079346 604.442849 +L 450.162258 619.602171 +L 450.191869 607.297509 +L 450.280703 587.592538 +L 450.209636 609.048682 +L 450.304393 598.716324 +L 450.310315 605.808221 +L 450.387305 589.720846 +L 450.410994 599.470535 +L 450.464294 593.512711 +L 450.434683 608.726244 +L 450.487983 605.947306 +L 450.499828 612.876095 +L 450.541284 596.23687 +L 450.600507 608.381766 +L 450.653807 597.062929 +L 450.677497 611.745061 +L 450.71303 598.874918 +L 450.813709 612.606525 +L 450.766331 588.222645 +L 450.819631 606.373351 +L 450.849243 591.727278 +L 450.932155 604.353462 +L 451.020989 597.597061 +L 450.991378 614.237121 +L 451.038756 603.692314 +L 451.050601 609.735433 +L 451.097979 589.868976 +L 451.12759 594.708134 +L 451.222347 581.732978 +L 451.139435 596.038773 +L 451.240114 587.494589 +L 451.346715 620.214498 +L 451.275647 585.29284 +L 451.370404 611.561169 +L 451.423705 607.059661 +L 451.394093 615.909052 +L 451.48885 610.260124 +L 451.512539 622.099966 +L 451.536228 593.799584 +L 451.61914 620.622718 +L 451.666518 593.58747 +L 451.755353 596.237574 +L 451.867876 585.808951 +L 451.844187 597.113054 +L 451.879721 591.968814 +L 451.909332 595.239901 +L 451.95671 581.482381 +L 451.968555 582.282865 +L 452.004089 592.008733 +L 452.0337 577.432941 +L 452.087001 586.571307 +L 452.092923 586.367515 +L 452.098845 586.850893 +L 452.223213 615.685531 +L 452.235058 607.177467 +L 452.246902 612.978637 +L 452.258747 605.036519 +L 452.276514 608.12316 +L 452.389037 574.511357 +L 452.39496 574.591761 +L 452.543017 618.677207 +L 452.548939 614.318177 +L 452.649618 589.59792 +L 452.673307 597.265132 +L 452.714763 586.349492 +L 452.73253 600.276648 +L 452.750297 598.624176 +L 452.773986 602.977348 +L 452.833209 586.242163 +L 452.839131 584.692973 +L 452.898354 596.664583 +L 452.927965 589.078061 +L 452.933888 589.086565 +L 453.010877 604.31815 +L 452.951655 588.432542 +L 453.0701 598.000971 +L 453.093789 600.306464 +L 453.135245 590.352823 +L 453.153012 593.742583 +L 453.182624 571.552754 +L 453.235924 594.491216 +L 453.271458 603.740079 +L 453.318836 579.006722 +L 453.395826 564.940953 +L 453.360292 581.902675 +L 453.425437 576.251072 +L 453.537961 596.266347 +L 453.549806 591.637872 +L 453.555728 589.611507 +L 453.591262 607.202364 +L 453.63864 595.784135 +L 453.810386 648.378405 +L 453.662329 591.15766 +L 453.816308 645.548014 +L 453.822231 647.087862 +L 453.84592 624.856688 +L 453.851842 624.92331 +L 453.881454 640.28947 +L 453.952521 620.978951 +L 453.970288 627.03686 +L 454.047278 612.320622 +L 454.0532 612.349956 +L 454.059122 608.167086 +L 454.112423 623.935102 +L 454.153879 617.323118 +L 454.159801 617.219686 +L 454.236791 607.302323 +L 454.207179 625.404949 +L 454.278247 611.820539 +L 454.373003 576.541329 +L 454.426304 584.955481 +L 454.67504 630.673892 +L 454.449993 579.69121 +L 454.710574 614.632136 +L 454.728341 605.694121 +L 454.793486 625.328792 +L 454.799408 625.930602 +L 454.811253 617.956465 +L 454.965232 584.350901 +L 455.036299 583.696818 +L 455.16659 617.858749 +L 455.261346 601.51449 +L 455.190279 625.731957 +L 455.285035 614.466046 +L 455.290958 615.290003 +L 455.302802 605.960954 +L 455.314647 601.717491 +L 455.37387 628.203261 +L 455.385714 621.453198 +L 455.456782 638.262852 +L 455.403481 619.474121 +L 455.50416 628.262516 +L 455.539694 607.835853 +L 455.628528 619.395248 +L 455.652217 628.90627 +L 455.71144 608.452936 +L 455.723285 613.272059 +L 455.741052 600.727083 +L 455.770663 615.96096 +L 455.84173 606.351684 +L 455.871342 614.448792 +L 455.936487 600.682938 +L 455.942409 606.336576 +L 455.960176 594.284909 +L 456.001632 607.553587 +L 456.04901 604.262234 +L 456.173378 620.644283 +L 456.191145 618.190756 +L 456.238524 627.120976 +L 456.262213 625.164651 +L 456.268135 625.311189 +L 456.291824 605.887995 +L 456.398425 610.980657 +L 456.428037 616.445278 +L 456.433959 610.903554 +L 456.445804 611.035716 +L 456.48726 598.991721 +L 456.534638 620.915409 +L 456.61755 633.218464 +L 456.647161 631.1074 +L 456.759685 620.793925 +L 456.69454 636.755326 +L 456.765607 623.079382 +L 456.771529 625.172663 +L 456.818908 606.414654 +L 456.82483 607.385491 +L 456.937353 595.274935 +L 456.949198 595.531901 +L 457.055799 602.346753 +L 456.990654 585.277055 +L 457.067644 600.38183 +L 457.097255 596.649841 +L 457.132789 611.937477 +L 457.156478 607.028142 +L 457.221623 599.577987 +L 457.280846 622.105303 +L 457.286768 619.91993 +L 457.310457 633.929885 +L 457.345991 632.04053 +L 457.351913 638.807341 +L 457.440748 618.795078 +L 457.44667 623.184346 +L 457.701328 580.800768 +L 457.476281 631.186554 +L 457.831619 585.545037 +L 457.914531 602.758032 +L 457.843463 582.290347 +L 457.955987 592.155663 +L 457.961909 591.908597 +L 457.973754 595.510671 +L 458.080355 606.25914 +L 458.032976 585.594748 +L 458.092199 602.15414 +L 458.175111 612.048835 +L 458.121811 600.808055 +L 458.210645 604.802816 +L 458.216567 605.937261 +L 458.246179 593.266451 +L 458.287635 583.023999 +L 458.335013 598.393135 +L 458.340935 603.598509 +L 458.423847 584.874202 +L 458.435692 573.818208 +L 458.488992 597.781673 +L 458.524526 590.28303 +L 458.530448 590.095893 +L 458.583749 600.001752 +L 458.642972 598.986752 +L 458.666661 592.011868 +L 458.708117 607.247787 +L 458.714039 603.700711 +L 458.814718 616.510509 +L 458.785107 599.626664 +L 458.832485 616.145342 +L 458.921319 623.265213 +L 458.956853 601.074605 +L 458.962775 608.906069 +L 458.986465 589.729472 +L 459.069377 607.459973 +L 459.075299 607.636147 +L 459.199667 580.73455 +L 459.25889 601.791116 +L 459.31219 592.463304 +L 459.324035 582.893715 +L 459.395102 614.216892 +L 459.401025 609.280756 +L 459.412869 614.8216 +L 459.460247 595.905968 +L 459.507626 607.045841 +L 459.513548 608.260974 +L 459.572771 597.764906 +L 459.590538 608.083289 +L 459.602382 600.51252 +L 459.67345 622.748564 +L 459.697139 608.829214 +L 459.703061 611.027499 +L 459.744517 585.911843 +L 459.756362 595.444153 +L 459.762284 591.736841 +L 459.827429 607.765493 +L 459.839274 604.403608 +L 459.886652 634.234067 +L 459.957719 621.341879 +L 460.093932 583.235889 +L 460.099854 584.638832 +L 460.129466 591.711705 +L 460.117621 581.40485 +L 460.14131 590.023996 +L 460.176844 598.992666 +L 460.241989 584.033945 +L 460.360435 568.505806 +L 460.330824 589.609302 +L 460.384124 574.861086 +L 460.390046 574.543043 +L 460.401891 578.394186 +L 460.42558 576.589636 +L 460.478881 592.673085 +L 460.538104 583.720864 +L 460.544026 578.264375 +L 460.626938 595.484172 +L 460.63286 591.60964 +L 460.680238 600.050047 +L 460.733539 583.296237 +L 460.816451 595.536953 +L 460.798684 582.727076 +L 460.84014 590.71386 +L 460.923052 576.024573 +L 460.958586 578.75514 +L 461.011886 608.830412 +L 461.077032 592.110147 +L 461.136255 623.662873 +L 461.2014 611.396323 +L 461.302079 597.916494 +L 461.308001 606.897344 +L 461.313923 612.546337 +L 461.390913 580.330463 +L 461.444213 602.659597 +L 461.521203 595.934674 +L 461.527125 589.269183 +L 461.580426 606.856186 +L 461.621882 602.292651 +L 461.692949 631.40098 +L 461.74625 610.171244 +L 461.852851 590.36367 +L 461.805473 614.952694 +L 461.87654 596.939588 +L 461.959452 608.342708 +L 461.923919 594.099633 +L 461.994986 601.285472 +L 462.000908 601.150081 +L 462.006831 603.083217 +L 462.012753 602.571163 +L 462.101587 609.815122 +L 462.08382 596.922516 +L 462.119354 607.37886 +L 462.166732 585.308828 +L 462.225955 608.797542 +L 462.231878 612.145598 +L 462.308867 595.535366 +L 462.31479 600.157544 +L 462.344401 589.86383 +L 462.415468 601.487847 +L 462.427313 595.230077 +L 462.510225 602.884355 +L 462.52207 593.76437 +L 462.527992 594.251928 +L 462.557603 586.565015 +L 462.610904 610.370386 +L 462.616826 610.838513 +L 462.622748 604.581912 +L 462.634593 599.168992 +L 462.699738 623.211433 +L 462.70566 624.346382 +L 462.741194 610.818401 +L 462.747116 612.337767 +L 462.877407 591.62772 +L 462.835951 624.359705 +L 462.883329 592.224888 +L 462.918863 599.001463 +L 462.942552 585.639887 +L 462.995852 593.898337 +L 463.013619 598.640255 +L 463.025464 586.111087 +L 463.031386 582.62148 +L 463.060998 597.233983 +L 463.12022 593.686702 +L 463.155754 601.244059 +L 463.19721 585.09871 +L 463.226822 595.111875 +L 463.238666 588.465012 +L 463.315656 598.497217 +L 463.321578 595.968028 +L 463.35119 616.250967 +L 463.434102 602.778027 +L 463.499247 606.955115 +L 463.463713 598.734675 +L 463.534781 602.328964 +L 463.588081 612.308348 +L 463.653226 595.384511 +L 463.712449 610.974256 +L 463.789439 603.595382 +L 463.824973 583.637872 +L 463.860506 613.122045 +L 463.890118 608.974538 +L 463.907885 625.720481 +L 463.990797 604.916883 +L 464.091475 588.481047 +L 464.109242 591.983102 +L 464.18031 609.026098 +L 464.23361 604.26299 +L 464.334289 594.927481 +L 464.304678 611.269071 +L 464.340212 597.504152 +L 464.405357 619.588894 +L 464.452735 606.417943 +L 464.565258 594.868712 +L 464.500113 623.095655 +L 464.577103 597.180781 +L 464.677782 610.110618 +L 464.642248 589.684636 +L 464.701471 605.224474 +L 464.790305 621.763492 +L 464.737005 601.890529 +L 464.831761 614.201901 +L 464.950207 582.935913 +L 464.967974 589.795748 +L 464.979818 589.080634 +L 464.991663 592.477842 +L 465.06273 610.293095 +L 465.003508 591.806387 +L 465.121953 607.749883 +L 465.169332 585.397223 +L 465.228554 611.063016 +L 465.234477 610.633721 +L 465.258166 616.016266 +L 465.2937 624.715367 +L 465.323311 603.119473 +L 465.347 612.494329 +L 465.412145 593.713995 +L 465.459524 607.50486 +L 465.495057 616.721515 +L 465.524669 602.295003 +L 465.530591 594.916042 +L 465.589814 631.062942 +L 465.619425 618.532152 +L 465.649037 617.110099 +L 465.672726 629.174275 +L 465.690493 624.965506 +L 465.791172 636.685358 +L 465.743793 613.972344 +L 465.797094 630.381595 +L 465.897773 599.317728 +L 465.921462 603.895281 +L 465.956996 597.794555 +L 466.004374 612.803812 +L 466.010296 612.850265 +L 466.105053 630.48254 +L 466.033985 609.655711 +L 466.140587 629.239984 +L 466.152431 635.177313 +L 466.187965 618.820715 +L 466.247188 630.305926 +L 466.418934 592.645945 +L 466.259032 634.069446 +L 466.484079 612.536295 +L 466.490001 616.120369 +L 466.543302 600.166105 +L 466.584758 613.225823 +L 466.638059 616.155779 +L 466.703204 601.375377 +L 466.756504 611.737592 +L 466.720971 589.995277 +L 466.815727 603.661077 +L 466.880872 586.306819 +L 466.898639 604.9776 +L 466.928251 597.574567 +L 466.95194 588.08209 +L 467.017085 608.266586 +L 467.129608 617.09803 +L 467.052619 592.272348 +L 467.135531 614.687378 +L 467.141453 615.955802 +L 467.15922 606.245189 +L 467.182909 607.116492 +L 467.277666 581.349158 +L 467.301355 591.921704 +L 467.354655 587.722811 +L 467.431645 602.337869 +L 467.514557 583.653811 +L 467.467179 603.88871 +L 467.556013 594.481538 +L 467.615236 583.868838 +L 467.591547 599.862202 +L 467.686303 587.249409 +L 467.769215 608.755541 +L 467.804749 596.365067 +L 467.822516 592.365116 +L 467.875817 608.33484 +L 467.917273 593.565116 +L 467.923195 593.882129 +L 467.929117 593.017584 +L 468.029796 564.564875 +L 468.053485 576.424227 +L 468.071252 572.968988 +L 468.189698 599.652134 +L 468.284454 591.951009 +L 468.213387 609.234761 +L 468.290377 600.273416 +L 468.331833 619.531943 +L 468.385133 595.24083 +L 468.391055 591.65689 +L 468.47989 604.67667 +L 468.545035 617.284268 +L 468.515423 601.867353 +L 468.586491 606.989904 +L 468.710859 587.551924 +L 468.627947 613.2039 +L 468.716781 591.520884 +L 468.722704 596.750465 +L 468.793771 570.929969 +L 468.823382 589.421045 +L 468.847072 569.804267 +L 468.924061 593.960494 +L 469.066196 619.931416 +L 468.989206 591.207523 +L 469.078041 614.442653 +L 469.089885 610.778727 +L 469.160953 622.263393 +L 469.172797 612.131897 +L 469.226098 621.235117 +L 469.273476 602.399152 +L 469.279398 607.997251 +L 469.386 585.83284 +L 469.409689 591.643995 +L 469.551824 610.752176 +L 469.563668 603.313486 +L 469.72357 568.119175 +L 469.587357 605.567653 +L 469.741337 578.008209 +L 469.883472 600.790931 +L 469.901239 597.540709 +L 469.919005 588.503094 +L 470.001917 601.842035 +L 470.00784 599.979615 +L 470.114441 605.73803 +L 470.025607 588.708918 +L 470.120363 604.277242 +L 470.132208 592.224959 +L 470.185508 620.474189 +L 470.226964 606.742829 +L 470.274343 592.567857 +L 470.380944 619.524445 +L 470.517156 592.866586 +L 470.440167 620.118563 +L 470.534923 604.626131 +L 470.546768 617.634621 +L 470.647447 608.518664 +L 470.653369 609.027173 +L 470.665213 601.970616 +L 470.688903 581.327126 +L 470.75997 611.351423 +L 470.765892 609.825992 +L 470.902105 576.510343 +L 470.777737 613.957934 +L 470.937639 597.456245 +L 471.026473 606.586354 +L 470.955406 594.898913 +L 471.056084 602.427216 +L 471.067929 597.186052 +L 471.115307 618.225107 +L 471.210064 610.231822 +L 471.233753 624.211737 +L 471.298898 609.487309 +L 471.352199 610.423705 +L 471.358121 615.829476 +L 471.441033 600.945084 +L 471.452878 606.665798 +L 471.4588 603.82436 +L 471.523945 621.850647 +L 471.541712 614.180826 +L 471.624624 623.882896 +L 471.553556 612.519477 +L 471.642391 615.730255 +L 471.672002 588.191079 +L 471.74307 612.264985 +L 471.825982 639.091317 +L 471.855593 618.785017 +L 471.991806 577.886255 +L 471.997728 579.194707 +L 472.033262 570.233075 +L 472.068795 581.711264 +L 472.098407 573.42759 +L 472.151707 603.756561 +L 472.216853 590.654208 +L 472.240542 608.068441 +L 472.311609 583.071606 +L 472.323454 590.919279 +L 472.406366 583.608529 +L 472.388599 594.416687 +L 472.441899 588.141908 +L 472.560345 613.258408 +L 472.483355 586.127998 +L 472.601801 608.402853 +L 472.607723 607.761403 +L 472.619568 618.080369 +L 472.62549 612.405576 +L 472.738014 624.983383 +L 472.743936 621.928636 +L 472.826848 625.399117 +L 472.785392 612.914707 +L 472.83277 625.352713 +L 472.880149 601.671355 +L 472.945294 613.148507 +L 472.957138 619.489378 +L 472.974905 603.392083 +L 473.051895 612.737939 +L 473.152574 592.327161 +L 473.105196 615.43534 +L 473.199952 598.632532 +L 473.27102 583.995291 +L 473.330242 612.570777 +L 473.342087 606.651245 +L 473.407232 617.199956 +L 473.424999 614.632186 +L 473.501989 638.408489 +L 473.543445 634.224984 +L 473.573056 617.022093 +L 473.650046 628.336998 +L 473.673735 645.80269 +L 473.73888 610.161065 +L 473.845481 604.013039 +L 473.81587 617.512072 +L 473.851404 604.911447 +L 473.89286 620.475183 +L 473.863248 601.390485 +L 473.987616 612.289151 +L 474.005383 609.06373 +L 474.02315 610.608294 +L 474.034994 621.877579 +L 474.106062 595.932012 +L 474.123829 596.997047 +L 474.254119 622.230236 +L 474.260041 619.313847 +L 474.36072 598.864486 +L 474.390332 605.755272 +L 474.402176 604.249024 +L 474.443632 611.845456 +L 474.449555 607.336545 +L 474.455477 611.750848 +L 474.532467 595.582397 +L 474.568 584.741636 +L 474.621301 602.815463 +L 474.633145 597.924065 +L 474.64499 603.645505 +L 474.72198 585.449037 +L 474.727902 589.098823 +L 474.77528 578.743348 +L 474.804892 595.418779 +L 474.840425 582.784123 +L 474.923337 597.756412 +L 474.864115 576.196044 +L 474.952949 590.565 +L 474.964793 587.470948 +L 475.018094 608.798708 +L 475.071395 633.698036 +L 475.142462 627.012959 +L 475.26683 601.13195 +L 475.272752 604.248324 +L 475.284597 612.156315 +L 475.349742 587.891918 +L 475.379354 602.697489 +L 475.385276 602.670181 +L 475.497799 594.421145 +L 475.426732 605.181084 +L 475.509644 596.773311 +L 475.5511 612.16119 +L 475.598478 594.990572 +L 475.6044 589.608312 +L 475.687312 610.104044 +L 475.699157 603.983475 +L 475.705079 604.347144 +L 475.722846 598.704246 +L 475.728768 602.463528 +L 475.740613 597.119514 +L 475.787991 621.054272 +L 475.83537 603.495747 +L 475.841292 606.398168 +L 475.882748 588.203811 +L 475.918282 593.966124 +L 476.04265 580.715764 +L 475.971582 600.49923 +L 476.048572 583.897058 +L 476.060416 578.872731 +L 476.113717 600.15063 +L 476.119639 602.761941 +L 476.149251 591.215467 +L 476.22624 600.969299 +L 476.232163 599.555243 +L 476.285463 612.461789 +L 476.297308 615.270489 +L 476.350609 603.574222 +L 476.392065 612.135284 +L 476.403909 606.826683 +L 476.433521 617.656499 +L 476.540122 625.760446 +L 476.498666 607.287036 +L 476.546044 623.669067 +L 476.676334 596.676735 +L 476.711868 602.430972 +L 476.753324 592.600302 +L 476.765169 592.888301 +L 476.788858 581.38215 +L 476.824391 607.795765 +L 476.865847 595.175481 +L 476.889537 600.515256 +L 476.877692 588.569644 +L 476.978371 597.791276 +L 477.096817 586.020461 +L 477.031671 601.45954 +L 477.102739 588.783265 +L 477.144195 572.990609 +L 477.221185 581.163961 +L 477.292252 601.855593 +L 477.327786 580.362734 +L 477.33963 588.442881 +L 477.345553 582.40415 +L 477.36332 593.547854 +L 477.446232 591.360896 +L 477.452154 588.65651 +L 477.499532 615.522457 +L 477.505454 618.575209 +L 477.552833 601.558116 +L 477.576522 604.058733 +L 477.683123 576.903692 +L 477.70089 586.657373 +L 477.718657 585.384192 +L 477.724579 590.104741 +L 477.736424 589.262744 +L 477.854869 609.326857 +L 477.96147 603.377704 +L 477.902248 621.390669 +L 477.967393 604.255285 +L 478.097683 630.782676 +L 477.991082 596.371017 +L 478.127294 621.755867 +L 478.139139 608.96836 +L 478.227973 624.682197 +L 478.233896 624.681507 +L 478.239818 630.810744 +L 478.287196 610.481485 +L 478.334574 618.991168 +L 478.423409 582.563066 +L 478.488554 583.118766 +L 478.648456 614.405864 +L 478.518165 580.051746 +L 478.654378 609.886173 +L 478.766901 591.068121 +L 478.683989 611.626507 +L 478.802435 603.895624 +L 478.820202 609.086247 +L 478.873503 591.811801 +L 478.932725 601.653384 +L 478.991948 584.593663 +L 479.07486 604.63477 +L 479.015637 578.543523 +L 479.116316 593.054041 +L 479.234762 579.300145 +L 479.193306 599.924759 +L 479.240684 584.345203 +L 479.394664 621.628852 +L 479.252529 580.375933 +L 479.418353 611.660742 +L 479.501265 589.3465 +L 479.430197 616.439587 +L 479.530876 605.716121 +L 479.637478 628.769124 +L 479.542721 603.772838 +L 479.655244 616.929683 +L 479.77369 587.172594 +L 479.791457 594.240579 +L 479.797379 597.41377 +L 479.838835 574.140565 +L 479.880291 583.971949 +L 480.087571 617.5481 +L 479.892136 580.311636 +L 480.099416 607.469164 +L 480.140872 594.934132 +L 480.200095 612.176901 +L 480.206017 615.917017 +L 480.271162 597.240453 +L 480.277084 598.830373 +L 480.283007 591.20156 +L 480.348152 607.414918 +L 480.377763 596.877027 +L 480.39553 616.814175 +L 480.466598 595.897596 +L 480.484364 598.12018 +L 480.596888 587.273092 +L 480.531743 601.633545 +L 480.614655 588.045012 +L 480.691645 613.808362 +L 480.632422 587.803995 +L 480.733101 596.48443 +L 480.804168 590.921574 +L 480.821935 603.280022 +L 480.863391 591.308021 +L 480.96407 627.350212 +L 481.100282 602.000512 +L 481.01737 632.270685 +L 481.106205 607.889266 +L 481.112127 612.647561 +L 481.177272 591.640854 +L 481.195039 598.679543 +L 481.289795 590.212981 +L 481.236495 601.901515 +L 481.307562 594.192306 +L 481.426008 617.307032 +L 481.437853 607.027877 +L 481.574065 588.004723 +L 481.579987 592.627529 +L 481.651055 617.010797 +L 481.692511 603.146649 +L 481.769501 582.087894 +L 481.810957 588.411196 +L 481.834646 601.540843 +L 481.882024 574.005298 +L 481.893869 576.740685 +L 481.905713 570.020387 +L 481.953092 584.519461 +L 482.00047 577.121707 +L 482.07746 591.577587 +L 482.024159 571.386172 +L 482.107071 579.195514 +L 482.118916 573.117143 +L 482.189983 592.059365 +L 482.201828 586.40038 +L 482.343962 611.573518 +L 482.367652 610.437945 +L 482.46833 579.954822 +L 482.385418 610.834928 +L 482.521631 587.290577 +L 482.533476 584.972658 +L 482.598621 597.038732 +L 482.580854 584.409091 +L 482.645999 586.261562 +L 482.764445 605.054008 +L 482.705222 586.166779 +L 482.770367 600.72253 +L 482.817745 587.249999 +L 482.835512 598.71888 +L 482.90658 616.353331 +L 482.942113 598.688594 +L 483.060559 574.432149 +L 482.965803 603.591224 +L 483.072404 581.391818 +L 483.119782 594.653293 +L 483.149393 579.842758 +L 483.184927 586.208047 +L 483.190849 586.05208 +L 483.338907 630.164094 +L 483.439585 613.072567 +L 483.356673 631.631715 +L 483.463275 624.079493 +L 483.575798 640.163434 +L 483.475119 623.735708 +L 483.617254 629.033549 +L 483.635021 630.558289 +L 483.670555 605.822963 +L 483.789 592.208471 +L 483.794923 592.011034 +L 483.818612 601.980561 +L 483.871912 579.520093 +L 483.913368 598.923415 +L 483.966669 590.68435 +L 483.990358 598.942685 +L 484.008125 592.45181 +L 484.031814 614.701722 +L 484.126571 610.804518 +L 484.15026 603.782981 +L 484.197638 629.622626 +L 484.20356 627.917984 +L 484.209483 634.80359 +L 484.250939 625.144865 +L 484.316084 634.021515 +L 484.416763 606.968894 +L 484.440452 615.258503 +L 484.464141 632.220764 +L 484.529286 602.861817 +L 484.535208 603.362437 +L 484.56482 609.347401 +L 484.588509 600.007445 +L 484.61812 602.539076 +L 484.659576 593.137746 +L 484.718799 609.962055 +L 484.843167 576.939134 +L 484.896468 590.304408 +L 484.973458 604.339583 +L 484.991225 586.926004 +L 485.020836 597.890548 +L 485.038603 588.986019 +L 485.115593 600.220406 +L 485.127437 599.327716 +L 485.18666 604.003769 +L 485.305106 628.506664 +L 485.269572 603.83472 +L 485.322873 623.45416 +L 485.435396 596.42551 +L 485.459085 599.021125 +L 485.476852 607.577373 +L 485.488697 600.643935 +L 485.547919 591.44657 +L 485.518308 605.158337 +L 485.60122 595.878038 +L 485.630831 610.824453 +L 485.684132 592.639499 +L 485.713743 606.560758 +L 485.761122 589.860292 +L 485.832189 597.374153 +L 485.88549 628.008387 +L 485.897334 625.370994 +L 485.915101 646.977636 +L 485.992091 615.324191 +L 486.069081 597.634788 +L 486.104614 608.753033 +L 486.258594 571.868943 +L 486.276361 578.33904 +L 486.424418 617.835664 +L 486.436262 615.783668 +L 486.578397 574.781068 +L 486.720532 606.321401 +L 486.613931 571.825616 +L 486.756066 592.352768 +L 486.761988 582.436808 +L 486.821211 598.388695 +L 486.862667 589.912562 +L 486.915968 608.870715 +L 486.981113 598.293345 +L 487.040336 581.083189 +L 487.069947 607.689002 +L 487.075869 616.853518 +L 487.123248 593.895159 +L 487.170626 595.662393 +L 487.176548 596.246888 +L 487.194315 587.315592 +L 487.212082 580.956496 +L 487.265383 607.158449 +L 487.306839 582.905745 +L 487.360139 597.405074 +L 487.401595 579.409092 +L 487.425284 592.079088 +L 487.531885 581.690153 +L 487.537808 589.97936 +L 487.602953 599.784457 +L 487.62072 589.447342 +L 487.626642 591.43886 +L 487.632564 583.959033 +L 487.709554 595.76373 +L 487.739165 587.467717 +L 487.792466 607.17032 +L 487.845767 583.260381 +L 487.857611 588.729307 +L 487.887223 570.75544 +L 487.934601 575.138374 +L 487.940523 568.392537 +L 488.017513 597.251478 +L 488.023435 596.524692 +L 488.070813 586.919676 +L 488.100425 606.342302 +L 488.118192 597.308486 +L 488.124114 600.061245 +L 488.159648 581.758333 +L 488.218871 595.309995 +L 488.278094 573.969743 +L 488.325472 593.61964 +L 488.414306 605.316747 +L 488.355083 591.61387 +L 488.437995 596.368886 +L 488.461684 587.610244 +L 488.509063 594.127974 +L 488.52683 608.547352 +L 488.574208 592.359343 +L 488.627508 608.381265 +L 488.692654 580.339719 +L 488.775566 591.776388 +L 488.8644 598.730947 +L 488.846633 590.050069 +L 488.876244 592.545172 +L 488.882167 587.447518 +L 488.953234 613.85041 +L 488.965079 610.205206 +L 488.971001 615.704966 +L 489.047991 594.662786 +L 489.053913 599.401715 +L 489.059835 591.791702 +L 489.142747 617.60805 +L 489.154592 609.333975 +L 489.160514 609.082437 +L 489.172359 612.819178 +L 489.225659 597.505883 +L 489.296727 621.246736 +L 489.468473 580.689161 +L 489.314494 628.222532 +L 489.492162 588.554603 +L 489.575074 615.212215 +L 489.610608 605.450799 +L 489.711287 591.238064 +L 489.669831 612.293003 +L 489.723131 600.375489 +L 489.847499 620.08262 +L 489.794199 596.330303 +L 489.865266 608.40963 +L 489.883033 602.278768 +L 489.960023 613.464338 +L 489.965945 625.983903 +L 489.983712 612.727527 +L 490.072546 624.844125 +L 490.078469 625.317891 +L 490.090313 619.451687 +L 490.10808 623.54817 +L 490.143614 603.163916 +L 490.202837 627.093167 +L 490.214681 625.839869 +L 490.380505 593.324191 +L 490.516718 611.583536 +L 490.587785 603.840232 +L 490.552252 618.303956 +L 490.617397 611.107297 +L 490.623319 615.101567 +L 490.65293 594.053054 +L 490.718076 604.484889 +L 490.80691 625.725712 +L 490.753609 600.262901 +L 490.836521 608.116981 +L 490.907589 597.37554 +L 490.86021 614.005409 +L 490.954967 599.769905 +L 490.984578 606.404014 +L 491.031957 588.841631 +L 491.06749 601.503525 +L 491.085257 612.381527 +L 491.138558 596.190667 +L 491.14448 597.993844 +L 491.150402 590.924451 +L 491.22147 619.446806 +L 491.245159 602.69478 +L 491.251081 604.420266 +L 491.280693 587.924427 +L 491.316226 591.687074 +L 491.381372 579.54004 +L 491.339916 594.06873 +L 491.416905 589.59897 +L 491.50574 584.208919 +L 491.535351 599.663084 +L 491.541273 597.969742 +L 491.553118 608.463777 +L 491.612341 608.36592 +L 491.618263 608.916865 +L 491.624185 606.815159 +L 491.647875 581.830187 +L 491.736709 596.989004 +L 491.760398 601.680169 +L 491.795932 587.338482 +L 491.807776 594.462339 +L 491.861077 585.089577 +L 491.884766 600.835389 +L 491.9203 585.9945 +L 492.056512 613.526979 +L 491.949911 584.006354 +L 492.074279 607.579846 +L 492.092046 596.295765 +L 492.115735 612.233946 +L 492.186803 600.1364 +L 492.222336 605.785022 +L 492.281559 591.150461 +L 492.382238 559.220763 +L 492.411849 572.006985 +L 492.417772 572.034293 +L 492.506606 605.042268 +L 492.447383 568.526875 +L 492.565829 593.510753 +L 492.61913 612.52206 +L 492.707964 602.077975 +L 492.713886 599.590631 +L 492.773109 617.15272 +L 492.779031 617.144453 +L 492.867866 637.481397 +L 492.891555 630.273434 +L 492.938933 618.934142 +L 492.927088 630.542498 +L 493.01 619.414766 +L 493.098835 624.341542 +L 493.057379 609.541126 +L 493.110679 622.387802 +L 493.181747 602.523143 +L 493.229125 608.730072 +L 493.252814 615.381774 +L 493.300192 600.053939 +L 493.306115 601.990096 +L 493.359415 585.475282 +L 493.412716 605.94616 +L 493.614074 563.098146 +L 493.442327 606.160636 +L 493.619996 567.09762 +L 493.625918 567.04497 +L 493.714753 583.376943 +L 493.744364 572.596603 +L 493.779898 568.018059 +L 493.827276 592.616214 +L 493.91611 610.195162 +L 493.880577 589.643449 +L 493.957566 599.055332 +L 494.010867 608.219628 +L 494.064167 593.154165 +L 494.188535 610.084335 +L 494.312903 590.015638 +L 494.20038 611.632815 +L 494.336593 596.582525 +L 494.348437 607.896157 +L 494.431349 586.896152 +L 494.437271 577.156736 +L 494.472805 604.469054 +L 494.532028 598.621737 +L 494.585329 587.420968 +L 494.549795 603.02583 +L 494.644551 596.648457 +L 494.668241 613.230851 +L 494.733386 596.410388 +L 494.762997 606.565643 +L 494.816298 629.751785 +L 494.887365 616.442286 +L 494.911054 621.935864 +L 494.946588 609.07089 +L 495.023578 590.389965 +L 495.065034 599.977113 +L 495.171635 619.272957 +L 495.076878 596.397389 +L 495.213091 609.757804 +L 495.307848 588.768597 +L 495.248625 610.846699 +L 495.337459 592.179438 +L 495.509205 636.571631 +L 495.580273 604.815974 +L 495.639496 618.522809 +L 495.657262 613.901532 +L 495.675029 621.968866 +L 495.680952 631.782989 +L 495.716485 617.640826 +L 495.775708 619.498336 +L 495.823087 625.435645 +L 495.905999 593.840667 +L 495.923765 590.677502 +L 495.929688 596.585817 +L 495.959299 610.8459 +L 496.030367 596.401654 +L 496.036289 601.286225 +L 496.166579 583.98625 +L 496.243569 604.178335 +L 496.279103 593.08716 +L 496.290947 588.507811 +L 496.332403 605.385123 +L 496.356092 600.828911 +L 496.42716 619.612407 +L 496.48046 618.056453 +L 496.563372 599.032486 +L 496.610751 612.169009 +L 496.646284 626.778091 +L 496.705507 609.180483 +L 496.717352 596.869721 +L 496.776575 615.183599 +L 496.823953 599.405981 +L 496.883176 619.120615 +L 496.936476 601.222533 +L 497.007544 599.322178 +L 496.954243 611.661885 +L 497.013466 605.491496 +L 497.037155 621.363888 +L 497.066767 599.710297 +L 497.120067 605.261407 +L 497.173368 579.300737 +L 497.226668 607.02259 +L 497.297736 612.419679 +L 497.315503 595.959476 +L 497.321425 598.785445 +L 497.33327 592.273119 +L 497.374726 624.405126 +L 497.398415 619.623409 +L 497.451715 612.136574 +L 497.422104 624.203927 +L 497.46356 616.527679 +L 497.487249 635.517082 +L 497.54055 611.412902 +L 497.564239 612.251552 +L 497.700451 582.133167 +L 497.712296 586.150305 +L 497.718218 593.585686 +L 497.777441 575.957904 +L 497.812975 577.688425 +L 497.818897 575.245238 +L 497.884042 591.419752 +L 497.907731 584.392253 +L 497.990643 598.663171 +L 498.014333 586.284371 +L 498.032099 574.115946 +L 498.109089 593.2821 +L 498.120934 584.512461 +L 498.245302 614.478762 +L 498.263069 603.135458 +L 498.29268 600.940395 +L 498.310447 608.204643 +L 498.316369 614.785418 +L 498.387437 580.406641 +L 498.393359 576.808566 +L 498.452582 599.073253 +L 498.470349 611.1944 +L 498.547338 587.033424 +L 498.618406 581.809575 +L 498.565105 594.775248 +L 498.642095 593.741766 +L 498.725007 623.531083 +L 498.772385 615.187292 +L 498.778307 610.424201 +L 498.819763 622.391436 +L 498.873064 616.333591 +L 498.884909 620.728916 +L 498.961898 610.779614 +L 498.967821 612.280388 +L 498.985588 600.230126 +L 499.062577 620.633631 +L 499.074422 611.672247 +L 499.092189 625.905081 +L 499.151412 596.002033 +L 499.157334 593.768365 +L 499.210634 611.564886 +L 499.263935 619.994263 +L 499.299469 601.080173 +L 499.311313 607.313196 +L 499.317236 613.787551 +L 499.370536 604.343842 +L 499.411992 605.463216 +L 499.53636 568.35196 +L 499.560049 579.063224 +L 499.708106 613.157736 +L 499.731796 610.84153 +L 499.814708 604.176514 +L 499.74364 617.6354 +L 499.844319 606.387323 +L 499.891697 619.862261 +L 499.927231 604.04733 +L 500.004221 595.088955 +L 499.980532 608.583162 +L 500.039754 600.248291 +L 500.193734 638.830963 +L 500.199656 631.595405 +L 500.258879 604.0258 +L 500.324024 607.562409 +L 500.329947 612.262248 +L 500.383247 600.453999 +L 500.430625 605.264071 +L 500.489848 617.71844 +L 500.531304 601.934575 +L 500.584605 591.481881 +L 500.626061 606.465484 +L 500.637905 601.11457 +L 500.708973 614.070365 +L 500.655672 597.030552 +L 500.750429 606.239357 +L 500.862952 596.292507 +L 500.797807 615.619536 +L 500.874797 602.175619 +L 500.981398 612.820587 +L 500.963631 599.422729 +L 500.98732 604.206107 +L 501.082077 611.27365 +L 501.052465 591.776212 +L 501.087999 604.859676 +L 501.135377 593.166399 +L 501.105766 611.620686 +L 501.188678 597.749878 +L 501.301202 615.307285 +L 501.366347 600.818906 +L 501.419647 603.412486 +L 501.508482 614.465417 +L 501.449259 601.29556 +L 501.526248 607.044304 +L 501.621005 596.477095 +L 501.567704 618.779592 +L 501.638772 601.594653 +L 501.644694 601.59888 +L 501.769062 581.511921 +L 501.697995 617.125477 +L 501.804596 586.601858 +L 501.887508 618.759556 +L 501.958575 612.424222 +L 502.02372 585.752519 +L 502.082943 602.115307 +L 502.207311 622.864574 +L 502.213234 616.167027 +L 502.248767 618.441833 +L 502.349446 593.121266 +L 502.355369 592.678102 +L 502.367213 596.073469 +L 502.390902 606.773916 +L 502.444203 587.737118 +L 502.467892 592.972529 +L 502.485659 583.047486 +L 502.556726 610.210835 +L 502.562649 605.303456 +L 502.657405 623.958642 +L 502.598182 604.555519 +L 502.675172 607.524353 +L 502.698861 598.564419 +L 502.740317 611.646462 +L 502.775851 609.893003 +L 502.787695 617.912499 +L 502.840996 600.435352 +L 502.87653 602.611173 +L 502.92983 589.961761 +L 502.935753 585.27288 +L 502.989053 598.937251 +L 503.030509 598.074909 +L 503.054198 608.614565 +L 503.08381 592.412456 +L 503.107499 593.834065 +L 503.154877 583.585992 +L 503.172644 595.519833 +L 503.2141 592.636085 +L 503.285167 604.442199 +L 503.255556 587.623522 +L 503.302934 598.089954 +L 503.350313 581.162444 +L 503.403613 602.026228 +L 503.409536 601.924825 +L 503.480603 623.189568 +L 503.527981 604.740551 +L 503.587204 591.169296 +L 503.62866 606.478594 +L 503.640505 603.135668 +L 503.699728 597.046006 +L 503.664194 607.718917 +L 503.741184 601.569622 +L 503.800406 607.248329 +L 503.794484 598.668343 +L 503.847785 601.205287 +L 503.877396 610.990608 +L 503.978075 583.985584 +L 504.084676 598.572154 +L 504.090598 594.304203 +L 504.102443 589.315493 +L 504.155744 600.727738 +L 504.161666 600.432948 +L 504.220889 624.134559 +L 504.274189 603.651624 +L 504.32749 599.5891 +L 504.297878 610.049455 +L 504.357101 608.412526 +L 504.428169 616.915588 +L 504.374868 607.512114 +L 504.475547 615.0481 +L 504.487392 617.486845 +L 504.528848 602.120661 +L 504.623604 583.994006 +L 504.564381 602.315234 +L 504.647293 587.139218 +L 504.653216 587.474491 +L 504.66506 585.474384 +L 504.676905 579.461824 +L 504.736128 594.852239 +L 504.753895 592.643654 +L 504.848651 603.912543 +L 504.830884 583.427153 +L 504.860496 599.044933 +L 504.87234 589.52645 +L 504.907874 611.110943 +L 504.967097 604.692414 +L 505.032242 595.53433 +L 504.984864 609.413924 +L 505.050009 602.899066 +L 505.055931 610.814384 +L 505.126999 591.086012 +L 505.144765 594.201477 +L 505.15661 585.769036 +L 505.203988 620.202426 +L 505.251367 591.598055 +L 505.405346 617.373644 +L 505.269133 586.137927 +L 505.411268 610.174241 +L 505.464569 595.799269 +L 505.506025 617.205931 +L 505.51787 609.988978 +L 505.624471 619.79573 +L 505.594859 600.139476 +L 505.636315 618.552677 +L 505.766606 584.61912 +L 505.77845 599.063494 +L 505.784372 602.307877 +L 505.825828 589.041914 +L 505.873207 592.604196 +L 505.885051 591.985554 +L 505.938352 601.23108 +L 505.944274 612.416458 +L 506.033108 588.76496 +L 506.044953 595.912733 +L 506.13971 589.926971 +L 506.068642 599.766447 +L 506.151554 593.107598 +L 506.19301 611.602871 +L 506.252233 593.775302 +L 506.281844 577.569922 +L 506.305534 596.297876 +L 506.364756 591.148539 +L 506.441746 577.303444 +L 506.483202 599.76615 +L 506.512814 590.605498 +L 506.572037 609.48 +L 506.583881 604.536796 +L 506.672715 625.279095 +L 506.708249 620.04364 +L 506.820773 591.526345 +L 506.838539 603.073926 +L 506.856306 614.002335 +L 506.921451 587.393205 +L 506.945141 599.421098 +L 507.087275 580.572154 +L 506.980674 607.072575 +L 507.09912 586.132078 +L 507.223488 607.679544 +L 507.347856 589.98961 +L 507.300478 609.113227 +L 507.371545 593.235323 +L 507.418923 605.548505 +L 507.460379 587.124783 +L 507.478146 593.926115 +L 507.549214 588.709269 +L 507.525525 598.054105 +L 507.578825 595.444218 +L 507.602514 600.582139 +L 507.655815 580.791781 +L 507.673582 589.069872 +L 507.715038 583.329825 +L 507.697271 592.545322 +L 507.738727 590.023208 +L 507.827561 612.975008 +L 507.762416 587.536764 +L 507.863095 604.170417 +L 507.869017 606.888979 +L 507.904551 589.401516 +L 507.963774 600.230214 +L 508.182898 646.035158 +L 507.981541 591.617522 +L 508.218432 625.363997 +L 508.354645 605.533923 +L 508.295422 629.512558 +L 508.360567 611.807602 +L 508.437557 636.50453 +L 508.479013 622.517695 +L 508.490857 631.096498 +L 508.538236 620.823754 +L 508.591536 623.857894 +L 508.644837 617.598178 +L 508.603381 624.251569 +L 508.70406 623.503704 +L 508.715904 624.842087 +L 508.75736 613.222674 +L 508.769205 617.957356 +L 508.863961 589.32667 +L 508.899495 597.853884 +L 508.946873 591.877699 +L 509.053475 576.38681 +L 508.958718 593.631042 +L 509.083086 583.514223 +L 509.231143 620.123682 +L 509.094931 581.675024 +L 509.254832 606.083867 +L 509.331822 584.595036 +L 509.266677 610.228358 +L 509.396967 596.856811 +L 509.438423 585.043452 +L 509.515413 604.391234 +L 509.521335 604.43731 +L 509.580558 583.176211 +L 509.550947 605.141768 +L 509.627936 600.00791 +L 509.651625 617.860316 +L 509.722693 586.464792 +L 509.728615 588.109297 +L 509.882595 613.7953 +L 509.900362 623.349103 +L 509.912206 631.254544 +L 509.995118 619.36057 +L 510.006963 622.787012 +L 510.030652 624.946896 +L 510.048419 612.070672 +L 510.172787 599.135752 +L 510.137253 617.815823 +L 510.178709 605.163291 +L 510.273466 608.824588 +L 510.249776 592.096305 +L 510.279388 602.675575 +L 510.451134 564.928784 +L 510.516279 589.096544 +L 510.56958 568.48672 +L 510.747248 598.848037 +L 510.782782 595.287201 +L 510.800549 598.627393 +L 510.918995 578.220104 +L 510.978218 597.577164 +L 511.043363 597.424776 +L 511.138119 635.629632 +L 511.209187 614.877858 +L 511.244721 610.673545 +L 511.250643 618.015359 +L 511.339477 633.671955 +L 511.292099 606.300199 +L 511.357244 618.790597 +L 511.446078 587.102159 +L 511.499379 590.007929 +L 511.505301 594.814539 +L 511.576369 575.771957 +L 511.588213 578.214926 +L 511.611902 572.354828 +L 511.653358 593.131769 +L 511.718503 607.538187 +L 511.771804 599.031998 +L 511.81326 605.595486 +L 511.854716 592.069721 +L 511.866561 597.676653 +L 511.931706 578.876722 +L 511.967239 599.272229 +L 511.985006 590.454312 +L 512.067918 609.612346 +L 511.996851 589.762786 +L 512.109374 602.420532 +L 512.233742 585.968568 +L 512.239665 581.918531 +L 512.334421 592.548826 +L 512.346266 584.910247 +L 512.441022 597.488657 +L 512.35811 581.934294 +L 512.452867 587.357936 +L 512.56539 571.809322 +L 512.476556 594.765162 +L 512.577235 577.22459 +L 512.725292 603.187508 +L 512.754904 600.818081 +L 512.784515 608.686182 +L 512.843738 584.212283 +L 512.855582 581.096165 +L 512.885194 568.950225 +L 512.944417 594.971483 +L 512.950339 593.867129 +L 512.956261 596.829943 +L 513.009562 571.352534 +L 513.015484 573.703878 +L 513.033251 568.510468 +L 513.086552 585.584536 +L 513.122085 575.201089 +L 513.228687 607.392605 +L 513.139852 573.523473 +L 513.270143 601.375884 +L 513.311599 591.462052 +L 513.364899 612.588394 +L 513.376744 602.926838 +L 513.459656 623.960023 +L 513.495189 610.394989 +L 513.512956 596.238446 +L 513.584024 619.103734 +L 513.643247 631.327553 +L 513.67878 609.187611 +L 513.684703 611.177202 +L 513.767615 601.424676 +L 513.720236 629.592124 +L 513.785381 609.470501 +L 513.891983 623.882027 +L 513.909749 619.229532 +L 513.915672 617.182736 +L 513.980817 628.663989 +L 513.998584 623.126336 +L 514.04004 636.849204 +L 514.087418 613.564454 +L 514.128874 592.933936 +L 514.199942 578.605946 +L 514.223631 599.345833 +L 514.235475 596.214364 +L 514.265087 608.214199 +L 514.24732 594.176232 +L 514.336154 596.885023 +L 514.359843 587.821547 +L 514.401299 602.128561 +L 514.448678 591.083335 +L 514.567123 617.620655 +L 514.590812 607.828908 +L 514.626346 598.515354 +L 514.66188 617.726455 +L 514.768481 623.831892 +L 514.73887 611.095601 +L 514.774403 623.215747 +L 514.780326 623.674509 +L 514.798092 621.762846 +L 514.910616 610.117677 +L 514.821782 624.68496 +L 514.916538 613.068207 +L 514.94615 638.670717 +L 515.034984 620.529101 +L 515.064595 620.69945 +L 515.159352 603.910718 +L 515.188963 613.324214 +L 515.212652 597.145701 +L 515.236342 600.144097 +L 515.260031 584.251385 +L 515.319254 605.574553 +L 515.337021 601.004457 +L 515.348865 611.053462 +L 515.402166 589.713676 +L 515.437699 594.206467 +L 515.508767 584.802558 +L 515.449544 595.649336 +L 515.556145 591.676158 +L 515.627213 608.816557 +L 515.662746 597.184314 +L 515.692358 581.112293 +L 515.751581 606.992062 +L 515.769347 599.102888 +L 515.781192 605.303977 +L 515.858182 589.902815 +L 515.870026 594.911971 +L 515.887793 586.798083 +L 515.970705 603.258193 +L 516.124685 572.445717 +L 515.988472 606.962509 +L 516.172063 573.422818 +L 516.308275 604.840928 +L 516.314198 601.159341 +L 516.462255 576.760934 +L 516.379343 603.213767 +L 516.491866 580.58796 +L 516.545167 602.097067 +L 516.60439 589.387862 +L 516.651768 567.423489 +L 516.616234 593.188203 +L 516.728758 586.306767 +L 516.740602 595.359363 +L 516.799825 624.320466 +L 516.859048 610.421105 +L 516.88866 605.854411 +L 516.936038 619.971529 +L 516.94196 626.349005 +L 516.983416 610.622808 +L 517.030794 616.410351 +L 517.054484 597.06202 +L 517.107784 616.749336 +L 517.143318 610.520377 +L 517.27953 586.181934 +L 517.172929 612.878447 +L 517.326909 602.83125 +L 517.338753 605.385755 +L 517.386132 589.872299 +L 517.392054 587.211307 +L 517.457199 602.587563 +L 517.463121 602.281419 +L 517.469044 604.569339 +L 517.498655 582.592094 +L 517.540111 590.227839 +L 517.652635 584.487964 +L 517.569723 603.807392 +L 517.658557 585.939047 +L 517.670401 584.34685 +L 517.694091 590.27459 +L 517.836225 633.165096 +L 517.84807 622.281728 +L 517.907293 611.821471 +L 517.954671 619.481526 +L 518.049428 628.856019 +L 518.031661 616.606261 +L 518.067195 626.021235 +L 518.209329 589.198594 +L 518.090884 629.531745 +L 518.221174 595.130646 +L 518.256708 612.057747 +L 518.333697 603.117689 +L 518.463988 584.425275 +L 518.410687 607.855533 +L 518.46991 592.345336 +L 518.529133 620.162346 +L 518.612045 604.956923 +L 518.724568 583.666661 +L 518.766024 595.248436 +L 518.866703 610.212763 +L 518.825247 590.067738 +L 518.896315 601.284997 +L 518.902237 597.777437 +L 518.973304 615.338227 +L 518.996994 605.346844 +L 519.032527 606.9792 +L 519.056216 592.364851 +L 519.062139 593.341938 +L 519.109517 581.570744 +L 519.09175 600.085065 +L 519.156895 592.405437 +L 519.227963 607.42226 +L 519.269419 596.918594 +L 519.293108 592.762043 +L 519.346408 603.72271 +L 519.358253 610.199807 +L 519.435243 594.170753 +L 519.447087 601.075574 +L 519.553688 568.637554 +L 519.464854 601.572469 +L 519.606989 576.341114 +L 519.731357 589.97938 +L 519.778735 576.748677 +L 519.849803 583.73269 +L 519.861647 588.977006 +L 519.897181 571.728976 +L 519.950482 579.198686 +L 519.956404 577.771999 +L 519.991938 589.820796 +L 520.033394 582.357358 +L 520.110383 611.378909 +L 520.057083 576.701684 +L 520.151839 593.643863 +L 520.234751 572.376286 +L 520.299897 587.01587 +L 520.305819 587.320075 +L 520.41242 611.908203 +L 520.430187 611.096494 +L 520.625622 579.130941 +L 520.48941 611.355079 +L 520.637467 582.145975 +L 520.643389 582.150574 +L 520.649312 580.169698 +L 520.684845 597.125175 +L 520.690768 595.700328 +L 520.761835 614.809444 +L 520.809213 608.307367 +L 520.815136 603.675579 +L 520.856592 625.360555 +L 520.90397 620.367575 +L 521.03426 594.020136 +L 520.927659 628.376447 +L 521.063872 601.633105 +L 521.087561 607.420506 +L 521.134939 597.255306 +L 521.146784 599.951807 +L 521.24154 578.536057 +L 521.271152 583.582456 +L 521.407364 613.578328 +L 521.419209 613.350807 +L 521.549499 585.573389 +L 521.555421 588.115303 +L 521.620566 615.497183 +L 521.691634 609.535764 +L 521.821924 591.172973 +L 521.833769 584.163486 +L 521.887069 602.242108 +L 521.928525 590.776201 +L 522.01736 590.614144 +L 522.058816 609.617477 +L 522.183184 586.710306 +L 522.195028 591.584383 +L 522.283863 574.623614 +L 522.343085 580.74836 +L 522.414153 600.827902 +L 522.461531 591.060974 +L 522.497065 596.850994 +L 522.550365 587.440404 +L 522.556288 587.515692 +L 522.574055 577.771342 +L 522.633277 591.085876 +L 522.662889 588.331506 +L 522.793179 606.425256 +L 522.882014 584.493883 +L 522.84648 613.353123 +L 522.911625 595.280046 +L 522.917547 595.296309 +L 522.92347 598.667135 +L 523.006382 583.680761 +L 523.012304 582.467681 +L 523.024148 599.444133 +L 523.071527 591.992515 +L 523.148516 604.074183 +L 523.095216 586.387653 +L 523.189972 594.16447 +L 523.201817 591.917786 +L 523.213662 596.992704 +L 523.415019 663.910718 +L 523.420942 662.805979 +L 523.563076 617.877007 +L 523.640066 627.538816 +L 523.604532 612.771916 +L 523.6756 622.799684 +L 523.717056 605.127902 +L 523.75259 623.109183 +L 523.80589 608.651832 +L 523.811812 608.733505 +L 523.817735 608.648937 +L 523.900647 626.233292 +L 523.942103 619.15466 +L 524.036859 591.74759 +L 524.078315 597.314404 +L 524.09016 601.026843 +L 524.107927 592.446477 +L 524.184917 573.7468 +L 524.232295 585.046582 +L 524.238217 589.084927 +L 524.279673 569.617891 +L 524.321129 573.94232 +L 524.327051 569.413271 +L 524.350741 591.38706 +L 524.409963 590.214412 +L 524.492875 592.838848 +L 524.457342 582.579155 +L 524.498798 588.20321 +L 524.575787 567.231554 +L 524.611321 575.354561 +L 524.735689 597.148332 +L 524.747534 596.066893 +L 524.800834 581.884161 +L 524.848213 598.161458 +L 524.860057 592.560089 +L 524.877824 595.84172 +L 524.901513 588.146266 +L 524.913358 582.682861 +L 524.931125 588.41723 +L 524.984425 598.562608 +L 524.966658 585.051562 +L 525.043648 590.241185 +L 525.04957 590.34309 +L 525.162094 614.602286 +L 525.07326 587.772547 +L 525.179861 608.347678 +L 525.209472 602.050866 +L 525.239084 614.515674 +L 525.28054 610.323568 +L 525.298306 619.869392 +L 525.363452 599.018697 +L 525.375296 602.586104 +L 525.381218 600.590384 +L 525.440441 615.164869 +L 525.470053 607.45642 +L 525.475975 607.812104 +L 525.499664 603.174822 +L 525.570732 584.299534 +L 525.517431 610.73561 +L 525.641799 595.638941 +L 525.7484 614.408951 +L 525.677333 587.098006 +L 525.760245 608.229155 +L 525.843157 588.735929 +L 525.87869 601.050944 +L 526.020825 621.912654 +L 525.95568 598.543797 +L 526.026748 617.734382 +L 526.151116 595.341347 +L 526.157038 594.86291 +L 526.186649 571.641437 +L 526.216261 597.0192 +L 526.269561 582.037888 +L 526.311017 578.298805 +L 526.322862 584.014063 +L 526.340629 583.973528 +L 526.411696 612.267636 +L 526.464997 609.509573 +L 526.494608 586.218298 +L 526.595287 587.057093 +L 526.636743 603.591788 +L 526.695966 583.457244 +L 526.719655 576.182212 +L 526.7848 589.635625 +L 526.968391 617.027017 +L 526.849945 587.059803 +L 527.009847 610.857066 +L 527.06907 589.732178 +L 527.116448 613.355683 +L 527.128293 599.54544 +L 527.252661 616.273456 +L 527.163827 597.251463 +L 527.288195 607.687463 +L 527.317806 594.541467 +L 527.371107 611.863562 +L 527.394796 609.222527 +L 527.40664 604.466352 +L 527.418485 604.754699 +L 527.519164 594.240328 +L 527.448096 608.926301 +L 527.531008 602.257779 +L 527.536931 605.416502 +L 527.590231 595.204863 +L 527.625765 597.261875 +L 527.679066 609.144691 +L 527.744211 590.556182 +L 527.779744 582.926156 +L 527.815278 594.778325 +L 527.8212 590.794449 +L 527.833045 599.782119 +L 527.886346 581.431087 +L 527.933724 592.373913 +L 527.945568 585.623232 +L 527.981102 608.205131 +L 528.02848 602.64063 +L 528.034403 604.473816 +L 528.064014 592.206193 +L 528.10547 593.848975 +L 528.123237 584.933697 +L 528.152848 601.440181 +L 528.212071 595.920084 +L 528.306828 614.383953 +L 528.324595 602.205847 +L 528.342362 592.80299 +L 528.413429 608.845629 +L 528.431196 605.068928 +L 528.460807 613.613738 +L 528.525953 597.620138 +L 528.537797 602.633961 +L 528.567409 595.668273 +L 528.668087 611.14405 +L 528.691777 600.416243 +L 528.745077 616.258653 +L 528.780611 608.467388 +L 528.798378 595.379413 +L 528.904979 597.88408 +L 528.946435 614.349432 +L 528.993813 593.616319 +L 529.01158 598.40019 +L 529.201093 619.723527 +L 529.035269 595.10357 +L 529.212938 614.783807 +L 529.272161 605.789066 +L 529.307694 621.565148 +L 529.313617 614.957481 +L 529.325461 624.571778 +L 529.408373 597.549188 +L 529.420218 592.673712 +L 529.42614 596.375623 +L 529.532741 615.720798 +L 529.473518 595.393235 +L 529.544586 609.755783 +L 529.574197 613.63319 +L 529.668954 597.065449 +L 529.674876 598.698568 +L 529.716332 581.777365 +L 529.728177 576.262075 +L 529.769633 599.364728 +L 529.781477 598.299555 +L 529.8407 608.823552 +L 529.876234 596.56611 +L 529.882156 590.809035 +L 529.947301 617.094821 +L 529.965068 616.05511 +L 529.97099 618.866769 +L 530.04798 602.926022 +L 530.053902 604.036307 +L 530.077592 591.004644 +L 530.107203 594.295823 +L 530.119048 584.916621 +L 530.190115 597.635301 +L 530.213804 594.665305 +L 530.249338 583.942165 +L 530.338172 610.194486 +L 530.450696 592.180217 +L 530.46254 594.406945 +L 530.468463 596.647235 +L 530.503996 581.509685 +L 530.545452 585.581911 +L 530.551375 583.42849 +L 530.61652 600.105998 +L 530.622442 600.21259 +L 530.723121 627.916712 +L 530.652053 588.667288 +L 530.752732 614.141443 +L 530.788266 598.733205 +L 530.806033 616.817549 +L 530.8771 599.048278 +L 530.965935 610.508123 +L 530.906712 593.221348 +L 530.989624 605.09177 +L 530.995546 605.146937 +L 531.025157 593.577947 +L 531.066613 615.521366 +L 531.072536 614.526076 +L 531.078458 614.163183 +L 531.08438 619.242001 +L 531.090303 617.48949 +L 531.096225 620.079521 +L 531.149525 596.571927 +L 531.16137 603.671532 +L 531.262049 588.619895 +L 531.232437 610.355087 +L 531.273893 597.297121 +L 531.279816 598.457023 +L 531.303505 587.340673 +L 531.309427 580.861046 +L 531.374572 609.46676 +L 531.398261 598.349221 +L 531.52263 613.874931 +L 531.469329 591.419366 +L 531.552241 612.48331 +L 531.558163 612.278089 +L 531.564086 614.332123 +L 531.570008 612.830979 +L 531.629231 618.505906 +L 531.664764 604.206057 +L 531.670687 613.588085 +L 531.694376 600.201163 +L 531.777288 616.24772 +L 531.806899 622.153664 +L 531.8602 606.814717 +L 531.883889 615.871904 +L 531.901656 610.601291 +L 531.925345 629.291004 +L 531.972723 623.372338 +L 531.99049 629.762135 +L 532.020102 614.345316 +L 532.055635 618.952044 +L 532.162236 587.120174 +L 532.185926 596.580892 +L 532.304371 612.842355 +L 532.19777 595.705729 +L 532.322138 609.451145 +L 532.40505 585.260877 +L 532.458351 595.789713 +L 532.55903 614.702882 +L 532.470195 588.736611 +L 532.570874 604.962862 +L 532.600486 589.756863 +L 532.630097 605.979104 +L 532.68932 595.111023 +L 532.760387 583.023503 +L 532.76631 578.839737 +L 532.843299 599.010289 +L 532.908445 606.514743 +L 532.932134 589.022141 +L 532.943978 591.102531 +L 532.967667 579.716028 +L 532.991357 597.227117 +L 533.050579 591.916321 +L 533.086113 577.002167 +L 533.133491 602.931461 +L 533.151258 604.407062 +L 533.157181 601.312628 +L 533.216403 628.479242 +L 533.281549 624.433346 +L 533.328927 633.833575 +L 533.376305 621.588641 +L 533.38815 623.743011 +L 533.411839 614.836915 +L 533.476984 637.371686 +L 533.488829 629.034612 +L 533.494751 629.999977 +L 533.548051 622.061598 +L 533.636886 592.631566 +L 533.666497 605.028912 +L 533.749409 614.146134 +L 533.707953 602.009334 +L 533.767176 604.122467 +L 533.838244 592.023404 +L 533.80271 606.991572 +L 533.873777 602.661878 +L 533.885622 604.05455 +L 533.891544 600.32775 +L 533.980378 580.665577 +L 533.927078 601.861457 +L 534.027757 581.990406 +L 534.163969 601.425158 +L 534.116591 581.958434 +L 534.187658 599.611623 +L 534.199503 601.487976 +L 534.329793 578.236008 +L 534.448239 602.314991 +L 534.460084 602.227141 +L 534.50154 596.475236 +L 534.495617 604.444707 +L 534.537073 600.004724 +L 534.649597 619.71373 +L 534.602218 592.871149 +L 534.655519 612.991654 +L 534.785809 596.792502 +L 534.667364 614.398359 +L 534.821343 598.34877 +L 534.886488 618.775111 +L 534.939789 607.153938 +L 534.957556 608.420991 +L 535.058235 593.066233 +L 535.117457 615.091823 +L 535.170758 601.860207 +L 535.182603 593.676622 +L 535.235903 614.975801 +L 535.259592 610.98074 +L 535.306971 625.08956 +L 535.372116 618.482348 +L 535.38396 620.607074 +L 535.496484 587.831378 +L 535.597163 579.020369 +L 535.573473 591.093626 +L 535.603085 588.041642 +L 535.609007 587.35412 +L 535.650463 595.055416 +L 535.662308 592.054202 +L 535.804443 627.475266 +L 535.715608 590.783656 +L 535.828132 617.242633 +L 536.076868 566.750145 +L 536.08279 575.1677 +L 536.224925 609.262092 +L 536.23677 602.655091 +L 536.242692 596.042213 +L 536.325604 627.040971 +L 536.57434 590.181415 +L 536.621718 594.457841 +L 536.62764 597.183804 +L 536.669096 588.46316 +L 536.728319 593.146068 +L 536.734242 593.300066 +L 536.828998 585.637081 +L 536.793464 600.33858 +L 536.83492 590.701924 +L 536.941522 601.865776 +L 536.876376 587.198549 +L 536.947444 594.122568 +L 536.959289 589.683248 +L 536.977055 601.926234 +L 537.042201 597.335187 +L 537.089579 602.249778 +L 537.101423 593.697533 +L 537.11919 599.70421 +L 537.142879 581.48465 +L 537.208025 605.620289 +L 537.231714 591.490343 +L 537.243558 589.392499 +L 537.279092 604.04465 +L 537.32647 599.180634 +L 537.356082 607.636244 +L 537.373849 616.393725 +L 537.450838 598.70131 +L 537.456761 599.963357 +L 537.551517 577.758735 +L 537.575206 582.793947 +L 537.634429 579.281542 +L 537.699574 600.190546 +L 537.705497 594.011601 +L 537.794331 610.403743 +L 537.800253 608.227342 +L 537.960155 653.89194 +L 538.084523 629.353756 +L 538.090445 629.817578 +L 538.197046 598.354202 +L 538.220736 614.367388 +L 538.315492 624.887113 +L 538.297725 613.315742 +L 538.327337 618.960745 +L 538.333259 612.050783 +L 538.38656 633.436731 +L 538.422093 631.692258 +L 538.43986 642.020181 +L 538.51685 629.907454 +L 538.528694 632.25112 +L 538.741897 593.455932 +L 538.753741 594.01605 +L 538.842576 616.548 +L 538.889954 610.897494 +L 539.038011 591.268179 +L 538.943254 620.7806 +L 539.049856 599.438732 +L 539.150535 612.7206 +L 539.162379 611.771619 +L 539.257136 601.015614 +L 539.191991 618.022195 +L 539.274903 607.361158 +L 539.280825 606.462327 +L 539.292669 612.24696 +L 539.304514 623.103882 +L 539.322281 608.397058 +L 539.405193 614.994518 +L 539.517716 653.844681 +L 539.42296 609.367001 +L 539.559172 633.947557 +L 539.624317 607.102461 +L 539.677618 622.090481 +L 539.719074 627.956869 +L 539.736841 615.305515 +L 539.754608 621.173095 +L 539.825675 593.923085 +L 539.867131 612.159931 +L 539.873053 613.062076 +L 539.896743 604.689304 +L 539.932276 610.861934 +L 539.944121 603.106836 +L 540.003344 625.353242 +L 540.038877 610.02884 +L 540.050722 613.544694 +L 540.092178 596.908721 +L 540.169168 585.691117 +L 540.204702 589.014437 +L 540.228391 597.50349 +L 540.299458 582.539603 +L 540.32907 565.411358 +L 540.406059 581.346883 +L 540.465282 588.314042 +L 540.471204 580.089413 +L 540.494894 581.153833 +L 540.571883 559.044148 +L 540.607417 574.201364 +L 540.702174 594.386736 +L 540.625184 568.609921 +L 540.725863 576.219393 +L 540.755474 570.797759 +L 540.79693 592.873127 +L 540.87392 612.236244 +L 540.933143 606.885569 +L 541.00421 591.851673 +L 541.057511 597.807025 +L 541.063433 605.503337 +L 541.104889 589.575705 +L 541.164112 597.094459 +L 541.258869 621.399579 +L 541.181879 595.34887 +L 541.294402 612.382404 +L 541.36547 592.498618 +L 541.406926 604.893495 +L 541.412848 605.648211 +L 541.424693 599.182873 +L 541.531294 574.435143 +L 541.442459 602.588018 +L 541.543138 583.620433 +L 541.578672 597.705634 +L 541.631973 573.475065 +L 541.643817 575.616579 +L 541.679351 563.58347 +L 541.726729 583.326644 +L 541.732651 580.241007 +L 541.815563 597.53944 +L 541.774107 579.837759 +L 541.857019 588.436056 +L 541.91032 578.782225 +L 541.934009 591.722048 +L 541.939931 588.118906 +L 541.945854 597.425122 +L 542.034688 576.99362 +L 542.046533 582.289161 +L 542.082066 592.154483 +L 542.123522 572.389883 +L 542.164978 588.194967 +L 542.230123 600.015112 +L 542.176823 585.246772 +L 542.271579 590.757523 +L 542.289346 576.94398 +L 542.372258 596.762128 +L 542.508471 627.151498 +L 542.549927 615.595705 +L 542.573616 596.874437 +L 542.626917 631.523503 +L 542.638761 629.830283 +L 542.786818 599.334693 +L 542.81643 610.897801 +L 542.917109 591.245738 +L 542.840119 611.747683 +L 542.934876 608.224342 +L 543.011865 593.636666 +L 542.976332 609.554372 +L 543.017788 594.247061 +L 543.053321 596.645591 +L 543.142156 573.810578 +L 543.225068 588.861686 +L 543.260601 580.971676 +L 543.272446 581.349214 +L 543.30798 565.114905 +L 543.384969 573.452821 +L 543.503415 620.583528 +L 543.538949 607.870324 +L 543.604094 593.478665 +L 543.651472 603.165299 +L 543.752151 609.032937 +L 543.687006 596.854714 +L 543.758073 606.67913 +L 543.870597 594.572667 +L 543.805452 620.228914 +L 543.876519 600.868566 +L 543.882441 607.714541 +L 543.935742 593.902856 +L 543.989043 602.824347 +L 544.089721 629.830491 +L 544.006809 597.304047 +L 544.113411 616.282894 +L 544.1371 604.339247 +L 544.202245 623.645328 +L 544.225934 610.174688 +L 544.237779 618.080746 +L 544.320691 605.453425 +L 544.332535 609.06783 +L 544.39768 593.87417 +L 544.34438 610.342669 +L 544.439136 608.716165 +L 544.450981 615.724661 +L 544.510204 599.619253 +L 544.516126 600.244942 +L 544.539815 587.723723 +L 544.610883 609.848123 +L 544.622727 600.325183 +L 544.640494 613.875847 +L 544.717484 586.239558 +L 544.729328 594.536466 +L 544.741173 588.656127 +L 544.806318 612.560272 +L 544.81224 612.118082 +L 544.818163 614.812923 +L 544.877386 591.520463 +L 544.883308 591.01231 +L 544.895152 595.040521 +L 544.901075 594.277182 +L 544.948453 609.163581 +L 545.001754 588.994781 +L 545.007676 587.731531 +L 545.060976 596.026755 +L 545.072821 590.650558 +L 545.084666 602.770015 +L 545.161655 561.599293 +L 545.167578 568.820532 +L 545.25049 581.254193 +L 545.291946 573.927041 +L 545.315635 566.920748 +L 545.357091 575.768075 +L 545.51107 632.209437 +L 545.528837 630.391912 +L 545.611749 625.227379 +L 545.564371 633.739224 +L 545.623594 629.504441 +L 545.629516 635.322741 +L 545.724273 619.678077 +L 545.759806 615.372153 +L 545.79534 625.173086 +L 545.813107 621.776036 +L 545.860485 630.26276 +L 545.848641 615.363155 +L 545.919708 624.070274 +L 546.067765 580.462013 +L 546.07961 577.840626 +L 546.091454 582.767155 +L 546.150677 587.081777 +L 546.13291 580.908625 +L 546.174366 585.330127 +L 546.180289 576.419663 +L 546.263201 609.007867 +L 546.269123 605.639279 +L 546.316501 594.551186 +L 546.34019 609.837714 +L 546.381646 602.67321 +L 546.482325 610.13373 +L 546.399413 600.934737 +L 546.500092 606.130249 +L 546.612615 589.385894 +L 546.654072 596.394535 +L 546.665916 598.293449 +L 546.689605 602.071411 +L 546.70145 594.51053 +L 546.766595 596.650313 +L 546.772517 596.418168 +L 546.873196 614.136085 +L 546.796206 594.11997 +L 546.885041 600.067671 +L 546.967953 572.006642 +L 547.009409 584.452571 +L 547.015331 584.255837 +L 547.062709 603.558332 +L 547.133777 593.162696 +L 547.198922 585.350345 +L 547.234456 601.639682 +L 547.293678 617.849438 +L 547.335134 596.0169 +L 547.341057 595.032304 +L 547.388435 604.067768 +L 547.40028 602.176318 +L 547.423969 618.26041 +L 547.500958 593.669462 +L 547.506881 597.906937 +L 547.554259 608.349427 +L 547.536492 593.761758 +L 547.595715 596.375725 +L 547.696394 573.699305 +L 547.714161 581.690021 +L 547.743772 592.118998 +L 547.785228 579.967377 +L 547.791151 578.087685 +L 547.81484 591.446873 +L 547.856296 589.548967 +L 547.951052 622.079916 +L 548.051731 611.359057 +L 548.07542 600.437516 +L 548.105032 620.738819 +L 548.146488 614.24917 +L 548.15241 617.67884 +L 548.193866 589.929831 +L 548.2294 599.073605 +L 548.241244 601.135441 +L 548.253089 596.465383 +L 548.2827 580.309038 +L 548.35969 592.439153 +L 548.43668 601.586864 +L 548.401146 585.912863 +L 548.472213 597.597769 +L 548.478136 594.303656 +L 548.495903 604.727678 +L 548.584737 596.469009 +L 548.667649 609.175109 +L 548.620271 590.437162 +L 548.69726 602.050858 +L 548.709105 595.517391 +L 548.762405 615.84867 +L 548.821628 639.497192 +L 548.786095 615.749901 +L 548.880851 624.313198 +L 549.330945 567.059766 +L 548.910463 626.826323 +L 549.366479 571.571905 +L 549.579681 601.74035 +L 549.378323 571.280121 +L 549.591526 599.756987 +L 549.656671 578.245193 +L 549.698127 599.900526 +L 549.745505 613.357352 +L 549.786961 587.650768 +L 549.798806 592.626366 +L 549.905407 604.164487 +L 549.834339 586.468969 +L 549.929096 601.282021 +L 549.994241 594.688932 +L 549.940941 606.502847 +L 550.01793 602.505511 +L 550.053464 605.37256 +L 550.083075 594.188217 +L 550.09492 595.73041 +L 550.195599 582.805698 +L 550.154143 602.805471 +L 550.213366 591.400368 +L 550.237055 598.459623 +L 550.296278 584.384046 +L 550.308122 585.75737 +L 550.408801 570.484542 +L 550.420646 584.100537 +L 550.43249 585.632445 +L 550.462102 577.872467 +L 550.485791 569.221782 +L 550.545014 584.290102 +L 550.562781 577.234016 +L 550.693071 599.640294 +L 550.775983 576.485886 +L 550.71676 604.444001 +L 550.835206 576.880538 +L 550.841128 576.784603 +L 550.888506 585.679155 +L 550.959574 563.342711 +L 550.965496 573.380354 +L 551.024719 551.930513 +L 551.072097 565.981587 +L 551.07802 564.747386 +L 551.101709 580.949507 +L 551.279377 616.365726 +L 551.2853 612.957288 +L 551.291222 603.772006 +L 551.385978 619.752145 +L 551.391901 615.834181 +L 551.480735 571.421149 +L 551.403745 616.738681 +L 551.557725 585.926598 +L 551.664326 613.976591 +L 551.711704 605.597489 +L 551.759082 593.179812 +L 551.794616 609.630612 +L 551.818305 606.774877 +L 551.824228 613.368235 +L 551.865684 598.441439 +L 551.924906 610.61604 +L 551.966362 616.104496 +L 552.055197 587.636016 +L 552.096653 597.901016 +L 552.16772 594.394697 +L 552.215099 575.862744 +L 552.309855 587.916697 +L 552.315777 593.465181 +L 552.380923 571.158168 +L 552.410534 588.119771 +L 552.416456 583.077367 +L 552.475679 599.596866 +L 552.511213 595.068395 +L 552.534902 605.556405 +L 552.576358 588.979673 +L 552.617814 596.060715 +L 552.742182 585.090681 +L 552.688881 600.675076 +L 552.765871 589.092997 +L 552.848783 600.687021 +L 552.878395 594.424162 +L 552.884317 592.229402 +L 552.94354 609.84753 +L 552.949462 610.106578 +L 552.955384 606.380255 +L 552.973151 593.005978 +L 553.026452 620.719188 +L 553.050141 613.222251 +L 553.061985 614.766539 +L 553.127131 602.337985 +L 553.174509 610.871554 +L 553.221887 596.465669 +L 553.245576 616.780568 +L 553.287032 609.636449 +L 553.292955 609.639607 +L 553.310722 611.485444 +L 553.340333 602.874127 +L 553.381789 608.33928 +L 553.423245 586.767781 +L 553.500235 600.449277 +L 553.600914 613.270697 +L 553.547613 597.790324 +L 553.636447 611.729327 +L 553.64237 607.648511 +L 553.707515 619.344902 +L 553.731204 617.303046 +L 553.790427 632.176679 +L 553.820038 610.959575 +L 553.867416 608.893366 +L 553.843727 615.764951 +L 553.885183 611.558168 +L 553.891106 616.378651 +L 553.968095 590.637356 +L 553.97994 598.317175 +L 554.03324 592.48815 +L 554.068774 604.044616 +L 554.086541 593.208267 +L 554.199064 616.339668 +L 554.098386 592.906704 +L 554.210909 610.588594 +L 554.287899 587.423222 +L 554.364889 593.820516 +L 554.3945 614.624744 +L 554.459645 590.529614 +L 554.477412 597.744465 +L 554.483334 599.144501 +L 554.507023 587.043865 +L 554.518868 575.883715 +L 554.589935 600.838748 +L 554.607702 598.136135 +L 554.619547 602.831657 +L 554.73207 621.258876 +L 554.743915 621.090514 +L 554.844594 597.172238 +L 554.779449 633.450813 +L 554.874205 604.63021 +L 554.909739 609.700985 +L 554.957117 593.80207 +L 554.980806 586.479491 +L 554.986729 592.646895 +L 555.01634 602.09208 +L 555.081485 589.20204 +L 555.09333 595.431826 +L 555.176242 580.179486 +L 555.105174 595.615398 +L 555.211775 591.481951 +L 555.35391 616.707718 +L 555.229542 589.036398 +L 555.359833 614.96492 +L 555.365755 616.844979 +L 555.395366 602.314541 +L 555.436822 607.814126 +L 555.543424 582.662105 +L 555.466434 608.091648 +L 555.573035 592.595811 +L 555.58488 606.388018 +L 555.685558 601.251609 +L 555.756626 585.737162 +L 555.703325 604.347433 +L 555.786237 597.522292 +L 555.804004 610.052825 +L 555.892838 595.662021 +L 555.898761 600.052794 +L 556.005362 581.188152 +L 555.952061 601.754114 +L 556.017206 593.239128 +L 556.064585 606.305514 +L 556.111963 585.151798 +L 556.123808 580.012267 +L 556.171186 605.744011 +L 556.188953 600.339261 +L 556.236331 613.059434 +L 556.283709 594.352941 +L 556.301476 603.175242 +L 556.307398 605.332743 +L 556.366621 590.582347 +L 556.378466 590.970017 +L 556.384388 590.267164 +L 556.396233 600.240427 +L 556.520601 630.028276 +L 556.526523 626.830325 +L 556.550212 626.980986 +L 556.644969 605.248498 +L 556.745648 611.473711 +L 556.67458 597.407279 +L 556.763415 611.159223 +L 556.810793 597.308903 +L 556.846327 612.382161 +L 556.870016 609.12327 +L 556.88186 603.771803 +L 556.952928 594.675439 +L 556.982539 611.849306 +L 556.994384 616.992088 +L 557.03584 604.837686 +L 557.142441 590.211158 +L 557.148363 598.826852 +L 557.249042 616.845228 +L 557.172052 597.353651 +L 557.278653 616.126665 +L 557.456322 577.466584 +L 557.290498 618.646206 +L 557.5037 590.613634 +L 557.663602 619.349821 +L 557.551079 584.244225 +L 557.693214 612.97269 +L 557.758359 609.621045 +L 557.71098 620.497973 +L 557.799815 612.649871 +L 557.811659 618.090814 +L 557.86496 591.063456 +L 557.870882 593.708552 +L 558.013017 614.053252 +L 557.888649 591.480065 +L 558.042628 602.894107 +L 558.166996 591.045175 +L 558.060395 604.189827 +L 558.172919 592.260529 +L 558.190686 598.28822 +L 558.249908 583.828754 +L 558.291364 598.06466 +L 558.421655 583.435957 +L 558.350587 606.131663 +L 558.427577 585.304824 +L 558.575634 628.462185 +L 558.593401 619.95193 +L 558.634857 601.513041 +L 558.717769 603.015441 +L 558.871749 623.461622 +L 558.735536 599.123255 +L 558.895438 619.643868 +L 559.007961 599.068019 +L 558.913205 620.916999 +L 559.037573 603.178491 +L 559.061262 610.975092 +L 559.096795 594.882647 +L 559.138251 601.964598 +L 559.161941 587.511128 +L 559.23893 605.778873 +L 559.250775 598.185789 +L 559.280386 587.986335 +L 559.304075 598.361111 +L 559.351454 594.871813 +L 559.416599 612.622742 +L 559.463977 600.493821 +L 559.552811 610.592428 +L 559.505433 596.052761 +L 559.582423 603.98556 +L 559.671257 582.219902 +L 559.712713 589.767688 +L 559.825237 604.660155 +L 559.80747 585.597015 +L 559.831159 596.341357 +L 559.848926 602.274811 +L 559.973294 565.684789 +L 560.073973 598.940397 +L 560.002905 565.60692 +L 560.103584 590.007519 +L 560.109506 590.063275 +L 560.115429 589.904674 +L 560.210185 576.812243 +L 560.168729 593.021885 +L 560.233874 583.864403 +L 560.269408 599.942627 +L 560.358242 595.500848 +L 560.387854 578.599049 +L 560.458921 607.605096 +L 560.612901 627.222182 +L 560.470766 602.737536 +L 560.648434 615.528057 +L 560.654357 607.50158 +L 560.707657 617.415168 +L 560.760958 612.090038 +L 560.879404 598.699599 +L 560.790569 616.467433 +L 560.885326 599.822001 +L 560.891248 599.575401 +L 560.932704 618.360194 +L 561.009694 608.253711 +L 561.211052 572.501469 +L 561.228819 580.949507 +L 561.311731 609.816604 +L 561.353187 602.328764 +L 561.382798 598.389732 +L 561.376876 604.191033 +L 561.400565 600.472223 +L 561.477555 612.189751 +L 561.430176 592.509017 +L 561.513088 603.978173 +L 561.524933 595.139882 +L 561.578233 616.520014 +L 561.613767 606.77402 +L 561.631534 613.576832 +L 561.702601 600.794539 +L 561.714446 603.258796 +L 561.732213 615.756981 +L 561.767747 597.915658 +L 561.779591 602.185066 +L 561.856581 586.867743 +L 561.809203 604.303652 +L 561.892115 591.186247 +L 562.028327 621.268937 +L 562.057939 604.853626 +L 562.140851 616.150359 +L 562.152695 622.817068 +L 562.170462 610.558493 +L 562.194151 611.647011 +L 562.324442 586.670933 +L 562.330364 583.687988 +L 562.37182 611.14399 +L 562.383664 608.724823 +L 562.44881 626.34551 +L 562.472499 602.579342 +L 562.478421 606.448887 +L 562.573178 576.288621 +L 562.596867 592.142375 +L 562.602789 591.907894 +L 562.673856 562.648565 +L 562.733079 566.912108 +L 562.875214 615.837829 +L 562.881137 612.941445 +L 562.952204 605.296313 +L 562.904826 623.081292 +L 562.981815 619.899909 +L 563.005505 632.744737 +L 563.029194 641.097444 +L 563.058805 621.365674 +L 563.064727 621.549003 +L 563.088417 607.51867 +L 563.141717 629.350347 +L 563.171329 619.581129 +L 563.189095 624.207998 +L 563.218707 612.566308 +L 563.272007 620.441414 +L 563.425987 597.923624 +L 563.443754 605.233504 +L 563.479287 593.135112 +L 563.53851 599.775632 +L 563.579966 587.110349 +L 563.639189 600.455218 +L 563.645111 597.352876 +L 563.716179 605.119204 +L 563.733946 590.432034 +L 563.739868 583.709368 +L 563.805013 599.501658 +L 563.834625 597.584628 +L 563.840547 597.539581 +L 563.947148 612.070772 +L 563.911614 591.934802 +L 563.982682 604.227603 +L 564.083361 599.47117 +L 564.047827 613.758215 +L 564.089283 604.774137 +L 564.172195 613.799098 +L 564.189962 598.708986 +L 564.249185 590.732942 +L 564.278796 607.305064 +L 564.284718 605.609392 +L 564.409086 627.180588 +L 564.355786 603.140189 +L 564.438698 612.712191 +L 564.491998 603.71781 +L 564.52161 617.990995 +L 564.527532 617.804221 +L 564.533454 621.023854 +L 564.610444 605.186597 +L 564.764424 568.963405 +L 564.78219 576.47743 +L 564.829569 613.32369 +L 564.912481 600.591275 +L 564.965781 587.215488 +L 565.025004 596.33639 +L 565.036849 595.630551 +L 565.048693 598.586655 +L 565.196751 624.580599 +L 565.125683 598.137249 +L 565.208595 615.714622 +L 565.332963 580.366304 +L 565.356652 594.275724 +L 565.439564 601.490995 +L 565.398108 583.633302 +L 565.469176 595.188592 +L 565.504709 590.312672 +L 565.546165 598.539574 +L 565.581699 593.673667 +L 565.593544 606.07482 +L 565.676456 583.574142 +L 565.700145 580.449566 +L 565.747523 602.938617 +L 565.753445 598.049352 +L 565.84228 618.283182 +L 565.777135 591.80422 +L 565.889658 608.778976 +L 566.037715 582.374579 +L 566.055482 582.960945 +L 566.061404 582.576021 +L 566.156161 594.937673 +L 566.114705 573.54332 +L 566.185772 593.354722 +L 566.280529 572.203298 +L 566.298296 591.220621 +L 566.357519 581.966107 +L 566.398975 592.365878 +L 566.428586 583.204485 +L 566.499654 605.686639 +L 566.446353 582.021942 +L 566.570721 594.387967 +L 566.629944 582.195549 +L 566.665478 597.806485 +L 566.712856 616.103648 +L 566.778001 602.650461 +L 566.860913 590.101143 +L 566.813535 612.548465 +L 566.896447 596.886875 +L 566.961592 588.656824 +L 566.926058 598.607875 +L 567.014892 592.147332 +L 567.13926 613.11576 +L 567.080038 583.284219 +L 567.151105 612.349441 +L 567.174794 610.069433 +L 567.180716 615.270014 +L 567.198483 623.907647 +L 567.263629 604.274942 +L 567.269551 602.483837 +L 567.334696 615.810403 +L 567.352463 610.745894 +L 567.364307 612.699816 +L 567.376152 606.941107 +L 567.387997 610.291082 +L 567.459064 590.715614 +L 567.50052 603.001146 +L 567.601199 586.697527 +L 567.613043 596.607128 +L 567.684111 614.020932 +L 567.648577 594.955368 +L 567.731489 607.261271 +L 567.78479 617.042785 +L 567.749256 603.154683 +L 567.820323 603.924369 +L 567.826246 602.280477 +L 567.844013 609.75483 +L 567.885469 607.168385 +L 567.968381 619.903967 +L 567.921002 601.479166 +L 567.997992 612.432633 +L 568.092749 623.503547 +L 568.027603 609.931813 +L 568.110515 618.043199 +L 568.205272 609.881143 +L 568.146049 628.934493 +L 568.217117 619.735177 +L 568.317796 639.05688 +L 568.25265 610.857229 +L 568.335562 626.573621 +L 568.347407 626.889586 +L 568.353329 625.771165 +L 568.477697 600.370435 +L 568.489542 605.939096 +L 568.525076 599.456337 +L 568.554687 609.565279 +L 568.560609 615.669766 +L 568.643521 592.722157 +L 568.6909 578.21851 +L 568.756045 546.478292 +L 568.809345 564.094533 +L 568.939636 604.874436 +L 568.833034 561.528333 +L 568.95148 601.781688 +L 569.046237 597.329493 +L 569.016625 606.162163 +L 569.052159 600.666231 +L 569.10546 593.815959 +L 569.176527 612.739527 +L 569.283128 573.197799 +L 569.318662 596.838886 +L 569.371963 593.786935 +L 569.354196 604.533936 +L 569.383807 598.389837 +L 569.407496 611.377824 +L 569.454875 587.848415 +L 569.484486 591.403436 +L 569.490408 588.790048 +L 569.555553 606.967979 +L 569.561476 604.959995 +L 569.597009 616.889295 +L 569.65031 598.628953 +L 569.679921 615.792134 +L 569.685844 612.404895 +L 569.750989 628.922452 +L 569.756911 628.290748 +L 569.762833 636.678547 +L 569.822056 616.662676 +L 569.85759 624.029601 +L 569.893124 589.478823 +L 569.981958 609.795007 +L 570.029336 618.763003 +L 570.070792 603.361513 +L 570.088559 608.970475 +L 570.14186 590.033097 +L 570.201083 602.911783 +L 570.230694 609.645624 +L 570.266228 589.276458 +L 570.301761 594.447644 +L 570.372829 587.08821 +L 570.313606 595.647411 +L 570.426129 590.442884 +L 570.485352 600.50749 +L 570.538653 592.15635 +L 570.698555 626.075352 +L 570.574187 584.847117 +L 570.728166 607.180471 +L 570.834767 579.273976 +L 570.740011 607.683281 +L 570.846612 591.322146 +L 570.97098 628.198804 +L 570.876223 581.389588 +L 570.988747 617.856084 +L 571.04797 598.643182 +L 571.107192 607.045542 +L 571.113115 617.999547 +L 571.184182 590.12661 +L 571.207871 593.432696 +L 571.25525 603.007264 +L 571.290783 585.036237 +L 571.302628 586.174586 +L 571.30855 585.678394 +L 571.338162 591.691724 +L 571.474374 606.857558 +L 571.38554 591.340311 +L 571.486219 597.317426 +L 571.569131 574.751869 +L 571.604665 577.371945 +L 571.734955 607.979854 +L 571.776411 613.964234 +L 571.794178 594.526046 +L 571.87709 600.245676 +L 571.906701 581.484014 +L 572.019225 605.708979 +L 572.025147 593.925156 +L 572.031069 590.902318 +L 572.08437 604.979292 +L 572.113981 600.386249 +L 572.244271 622.128169 +L 572.256116 620.749786 +L 572.398251 583.153696 +L 572.297572 624.163408 +L 572.416018 595.989081 +L 572.534463 615.805954 +L 572.433785 591.183157 +L 572.564075 605.144126 +L 572.682521 587.720574 +L 572.688443 589.785078 +L 572.729899 588.094536 +L 572.741744 597.042387 +L 572.75951 596.508022 +L 572.777277 601.808566 +L 572.830578 581.385215 +L 572.842422 593.75673 +L 572.895723 567.216138 +L 572.954946 586.968267 +L 572.972713 585.086477 +L 572.984557 593.108859 +L 573.014169 587.163618 +L 573.126692 600.65041 +L 573.079314 570.566559 +L 573.132614 598.68589 +L 573.239216 583.219599 +L 573.162226 603.560793 +L 573.286594 590.294112 +L 573.310283 596.836463 +L 573.339894 584.853847 +L 573.393195 592.209108 +L 573.40504 586.999651 +L 573.440573 601.403113 +L 573.493874 595.184126 +L 573.636009 641.520207 +L 573.529408 591.961372 +L 573.695232 615.743499 +L 573.807755 594.759077 +L 573.736688 619.431202 +L 573.8196 604.754353 +L 573.884745 620.277635 +L 573.849211 595.836166 +L 573.938045 614.415165 +L 574.003191 603.346241 +L 573.985424 616.76283 +L 574.044647 614.815338 +L 574.062413 623.587312 +L 574.15717 619.99193 +L 574.169015 613.346239 +L 574.174937 613.644075 +L 574.192704 616.293867 +L 574.299305 596.589375 +L 574.346683 612.228271 +L 574.405906 595.792692 +L 574.411828 595.606632 +L 574.447362 604.05983 +L 574.506585 589.223679 +L 574.536196 576.458717 +L 574.613186 584.888404 +L 574.642797 599.764307 +L 574.719787 584.722639 +L 574.737554 570.830577 +L 574.802699 607.282467 +L 574.814544 607.1256 +L 574.9093 595.650071 +L 574.826388 607.493956 +L 574.927067 597.926226 +L 575.009979 608.814165 +L 575.039591 602.541884 +L 575.092891 610.075681 +L 575.051435 596.937964 +L 575.11658 598.893355 +L 575.240948 574.910949 +L 575.341627 561.624616 +L 575.27056 584.272875 +L 575.359394 569.057841 +L 575.471918 607.963024 +L 575.507451 598.705721 +L 575.525218 586.964632 +L 575.584441 604.051181 +L 575.619975 595.595338 +L 575.625897 592.817413 +L 575.673275 610.966998 +L 575.68512 607.661523 +L 575.756187 628.79814 +L 575.803566 624.836869 +L 575.933856 569.564454 +L 575.821332 628.345529 +L 575.96939 577.70951 +L 575.981234 575.478887 +L 576.058224 596.072019 +L 576.158903 613.40738 +L 576.129291 589.390764 +L 576.17667 604.836517 +L 576.188514 595.056417 +L 576.241815 624.893337 +L 576.277349 612.101166 +L 576.413561 625.959734 +L 576.324727 605.964937 +L 576.425406 623.343795 +L 576.484629 617.663148 +L 576.508318 629.930491 +L 576.537929 622.216782 +L 576.543851 618.947965 +L 576.620841 635.950716 +L 576.626763 630.855273 +L 576.685986 635.988365 +L 576.656375 624.611974 +L 576.72152 628.772182 +L 576.881422 593.366626 +L 576.739287 631.222884 +L 576.899189 606.279391 +L 576.911033 607.281001 +L 576.916955 599.688409 +L 576.999868 575.169066 +L 577.047246 579.326864 +L 577.100546 598.343858 +L 577.05909 577.098651 +L 577.165692 590.194845 +L 577.171614 585.250365 +L 577.201225 601.647882 +L 577.26637 594.970313 +L 577.272293 596.422407 +L 577.325593 583.123814 +L 577.349282 591.204595 +L 577.432194 563.858651 +L 577.467728 577.166418 +L 577.592096 607.25891 +L 577.603941 598.675997 +L 577.62763 588.239482 +L 577.663164 603.308393 +L 577.728309 590.542308 +L 577.83491 624.298264 +L 577.876366 619.654192 +L 577.894133 626.830541 +L 577.917822 617.122692 +L 577.953356 603.745773 +L 578.000734 620.581732 +L 578.024423 615.597392 +L 578.095491 634.926989 +L 578.148791 620.395143 +L 578.261315 605.486032 +L 578.184325 630.177918 +L 578.279081 610.73552 +L 578.356071 632.070797 +L 578.391605 623.596559 +L 578.527817 595.187316 +L 578.539662 595.90442 +L 578.628496 604.085667 +L 578.592963 591.397283 +L 578.658108 601.246019 +L 578.735097 585.361703 +L 578.770631 595.820833 +L 578.847621 604.133577 +L 578.788398 591.74287 +L 578.883155 597.07048 +L 578.889077 597.016256 +L 578.971989 618.8742 +L 579.054901 614.290151 +L 579.125968 617.705925 +L 579.084512 603.823694 +L 579.131891 611.621085 +L 579.226647 600.372509 +L 579.161502 616.536817 +L 579.244414 605.80717 +L 579.262181 616.573702 +L 579.345093 601.916175 +L 579.351015 605.241294 +L 579.36286 596.229664 +L 579.433927 617.460532 +L 579.451694 612.042893 +L 579.641207 571.296196 +L 579.653052 577.357036 +L 579.682663 589.888323 +L 579.747808 570.369504 +L 579.759653 576.135158 +L 579.77742 568.424245 +L 579.85441 595.806516 +L 579.889943 579.774051 +L 579.931399 596.513129 +L 579.966933 590.72219 +L 579.996544 582.671307 +L 580.085379 603.283861 +L 580.162368 590.308602 +L 580.120912 604.027209 +L 580.203825 594.044271 +L 580.351882 623.814791 +L 580.47625 596.452197 +L 580.588773 568.987424 +L 580.494017 600.31414 +L 580.60654 576.760286 +L 580.659841 588.130301 +L 580.677607 575.047684 +L 580.724986 584.62687 +L 580.754597 574.727799 +L 580.81382 605.650228 +L 580.819742 604.48192 +L 580.831587 607.038672 +L 580.861198 594.005831 +L 580.873043 595.299671 +L 580.884887 588.357715 +L 580.920421 606.102538 +L 580.955955 605.510993 +L 581.027022 622.371721 +L 581.068478 610.659145 +L 581.092167 614.27401 +L 581.104012 607.168926 +L 581.115857 611.925232 +L 581.216535 589.908258 +L 581.22838 594.583914 +L 581.234302 604.556003 +L 581.287603 591.024169 +L 581.340904 601.643977 +L 581.394204 593.590039 +L 581.429738 612.524082 +L 581.459349 604.754244 +L 581.471194 613.341845 +L 581.483038 611.909303 +L 581.488961 618.077601 +L 581.583717 605.458329 +L 581.684396 589.258626 +L 581.696241 595.005247 +L 581.725852 600.536202 +L 581.790997 585.371789 +L 581.838376 583.21558 +L 581.891676 598.274935 +L 581.956821 591.745285 +L 582.016044 617.555744 +L 582.051578 603.570323 +L 582.13449 607.387105 +L 582.170024 610.652719 +L 582.193713 596.200567 +L 582.199635 597.703028 +L 582.241091 595.01447 +L 582.270702 602.623896 +L 582.282547 600.659059 +L 582.294392 609.850567 +L 582.335848 590.617996 +L 582.395071 604.333063 +L 582.525361 576.514335 +L 582.54905 583.777787 +L 582.667496 603.55895 +L 582.62604 580.755262 +L 582.67934 602.880246 +L 582.862931 577.494773 +L 582.88662 586.645085 +L 582.910309 597.038139 +L 582.945843 575.141592 +L 582.993221 587.90954 +L 583.016911 580.331654 +L 583.087978 598.742577 +L 583.0939 598.914263 +L 583.111667 590.161115 +L 583.129434 601.417308 +L 583.200501 593.408785 +L 583.253802 606.51942 +L 583.307103 591.382748 +L 583.336714 598.877563 +L 583.395937 585.918458 +L 583.413704 589.591414 +L 583.425548 578.487754 +L 583.526227 582.840427 +L 583.53215 581.168994 +L 583.561761 600.073006 +L 583.597295 591.956064 +L 583.615062 599.668531 +L 583.638751 587.871092 +L 583.727585 597.52004 +L 583.780886 589.899955 +L 583.804575 607.965879 +L 583.810497 611.462994 +L 583.881564 595.050653 +L 583.887487 597.419995 +L 583.905254 591.664568 +L 583.94671 607.415265 +L 584.00001 596.033357 +L 584.005932 595.741409 +L 584.011855 600.017816 +L 584.023699 606.983785 +L 584.053311 593.609921 +L 584.112534 596.64473 +L 584.1303 595.301818 +L 584.15399 604.081593 +L 584.159912 602.662876 +L 584.165834 607.520139 +L 584.195446 588.741729 +L 584.254668 592.538582 +L 584.266513 583.288989 +L 584.296124 609.771178 +L 584.355347 605.196847 +L 584.426415 595.602564 +L 584.390881 606.219485 +L 584.467871 600.953153 +L 584.598161 629.389465 +L 584.485638 600.197214 +L 584.639617 618.57083 +L 584.692918 600.907698 +L 584.758063 607.346648 +L 584.763985 610.082903 +L 584.781752 593.651417 +L 584.846897 599.765076 +L 584.864664 595.003974 +L 584.900198 606.103761 +L 584.923887 599.224895 +L 584.935731 608.687272 +L 585.012721 589.531414 +L 585.066022 578.844255 +L 585.101555 594.338781 +L 585.1134 592.211937 +L 585.214079 607.748964 +L 585.24369 601.587963 +L 585.350291 583.180878 +L 585.267379 604.077821 +L 585.415437 593.42139 +L 585.421359 595.176338 +L 585.486504 584.447636 +L 585.504271 588.930063 +L 585.545727 565.364759 +L 585.60495 547.393122 +L 585.640484 568.971792 +L 585.65825 563.347327 +L 585.758929 596.220523 +L 585.800385 588.558981 +L 585.883297 580.527727 +L 585.871453 593.180079 +L 585.901064 592.757826 +L 585.94252 583.693864 +L 585.960287 601.889162 +L 586.001743 613.142966 +L 586.01951 587.434111 +L 586.055044 580.616665 +L 586.043199 593.421409 +L 586.108344 589.238504 +L 586.143878 607.082156 +L 586.220868 597.737342 +L 586.238634 590.737194 +L 586.321546 606.158194 +L 586.327469 601.588479 +L 586.428148 610.658028 +L 586.392614 592.512274 +L 586.445914 603.811818 +L 586.481448 607.186614 +L 586.499215 602.268575 +L 586.64135 569.788422 +L 586.599894 603.244188 +L 586.647272 574.7683 +L 586.653194 573.282374 +L 586.682806 590.204044 +L 586.71834 584.65897 +L 586.742029 578.247992 +L 586.753873 583.734371 +L 586.872319 609.243373 +L 586.901931 591.257817 +L 586.972998 613.897001 +L 586.97892 612.614167 +L 587.079599 585.235142 +L 587.109211 598.407574 +L 587.174356 582.130781 +L 587.150667 599.019037 +L 587.209889 598.133656 +L 587.215812 600.933973 +L 587.286879 583.454903 +L 587.298724 579.476512 +L 587.363869 594.818543 +L 587.369791 595.477843 +L 587.375713 590.146411 +L 587.506004 554.512418 +L 587.665905 587.201985 +L 587.689595 583.721465 +L 587.766584 569.202498 +L 587.731051 591.865103 +L 587.802118 581.621129 +L 587.849496 570.810025 +L 587.867263 582.504407 +L 587.902797 579.407875 +L 587.938331 594.940192 +L 588.01532 584.098596 +L 588.068621 574.935457 +L 588.098232 598.281632 +L 588.198911 608.467456 +L 588.163378 590.162178 +L 588.210756 602.157609 +L 588.216678 602.121248 +L 588.228523 598.125363 +L 588.293668 608.834932 +L 588.323279 601.322979 +L 588.352891 610.751946 +L 588.423958 590.475159 +L 588.42988 590.601497 +L 588.536482 602.241631 +L 588.45357 583.520493 +L 588.548326 599.311232 +L 588.690461 575.315869 +L 588.702306 583.557847 +L 588.767451 567.938485 +L 588.797062 575.538948 +L 588.909586 563.79127 +L 588.84444 583.996004 +L 588.915508 564.809931 +L 588.951042 562.856059 +L 589.07541 613.088218 +L 589.164244 623.875495 +L 589.140555 609.097702 +L 589.187933 619.950603 +L 589.193855 612.407173 +L 589.264923 633.464609 +L 589.300457 615.728361 +L 589.353757 597.819347 +L 589.41298 612.178768 +L 589.430747 621.460464 +L 589.513659 606.590779 +L 589.519581 612.891448 +L 589.531426 608.553355 +L 589.555115 619.406566 +L 589.62026 615.513168 +L 589.632105 624.632088 +L 589.679483 596.039112 +L 589.738706 580.490025 +L 589.786084 598.289517 +L 589.797929 589.761335 +L 589.845307 618.450421 +L 589.851229 613.779667 +L 589.880841 624.234948 +L 589.916374 610.65821 +L 589.963753 618.407328 +L 590.129577 569.599776 +L 590.1888 571.578386 +L 590.283556 593.564513 +L 590.212489 566.776825 +L 590.313168 592.527852 +L 590.31909 593.230892 +L 590.330934 584.555633 +L 590.336857 584.93886 +L 590.360546 577.320203 +L 590.431613 592.442505 +L 590.443458 588.131672 +L 590.573748 638.495652 +L 590.591515 636.19638 +L 590.73365 594.946126 +L 590.739572 599.083152 +L 590.751417 603.91059 +L 590.792873 618.862729 +L 590.840251 600.621948 +L 590.852096 601.461651 +L 590.958697 588.075106 +L 590.923163 606.216427 +L 590.964619 591.090236 +L 591.035687 606.700383 +L 591.077143 596.365774 +L 591.112676 623.838244 +L 591.201511 619.237244 +L 591.207433 619.272438 +L 591.2252 621.497022 +L 591.2785 614.618056 +L 591.408791 570.308332 +L 591.468013 585.005127 +L 591.574615 606.250434 +L 591.503547 582.505424 +L 591.616071 598.577532 +L 591.621993 597.448038 +L 591.63976 611.766634 +L 591.657527 609.55882 +L 591.663449 615.983542 +L 591.734516 592.282826 +L 591.764128 611.904385 +L 591.870729 594.37736 +L 591.882573 603.676663 +L 591.983252 622.159389 +L 591.924029 603.496498 +L 592.006941 614.514595 +L 592.113543 620.434749 +L 592.060242 607.990571 +L 592.119465 618.838537 +L 592.243833 595.62654 +L 592.160921 625.597267 +L 592.249755 603.118351 +L 592.273444 609.082882 +L 592.2616 600.406273 +L 592.285289 604.652059 +L 592.291211 597.406527 +L 592.350434 616.449206 +L 592.39189 605.278298 +L 592.421502 620.596123 +L 592.498491 608.809995 +L 592.664315 579.146665 +L 592.723538 596.98975 +L 592.67616 573.900656 +L 592.782761 582.879323 +L 592.889362 573.579649 +L 592.847906 594.430912 +L 592.895284 576.305892 +L 592.901207 576.148617 +L 592.907129 578.850922 +L 592.930818 578.347796 +L 593.067031 623.806486 +L 593.203243 592.188277 +L 593.09072 630.60355 +L 593.22101 592.638283 +L 593.262466 614.573848 +L 593.357223 609.100231 +L 593.363145 600.659439 +L 593.422368 618.698186 +L 593.463824 614.318032 +L 593.540814 631.071708 +L 593.493435 610.939968 +L 593.576347 622.111977 +L 593.71256 598.160689 +L 593.629648 627.697225 +L 593.742171 601.911885 +L 593.748094 602.464244 +L 593.783627 597.619869 +L 593.795472 597.74821 +L 593.819161 575.606815 +L 593.91984 582.385437 +L 593.967218 596.057567 +L 594.032363 586.417868 +L 594.044208 577.162905 +L 594.115275 604.297954 +L 594.12712 599.065676 +L 594.233721 621.175057 +L 594.251488 619.471567 +L 594.263333 612.144943 +L 594.3344 623.138224 +L 594.352167 615.864322 +L 594.381778 629.653686 +L 594.417312 610.73028 +L 594.458768 611.492423 +L 594.547602 590.533723 +L 594.589058 598.361832 +L 594.61867 620.322602 +L 594.701582 602.759122 +L 594.743038 585.591744 +L 594.772649 603.066274 +L 594.837794 592.407135 +L 594.908862 578.038249 +L 594.95624 601.594909 +L 595.056919 586.530793 +L 595.015463 602.000776 +L 595.074686 587.509126 +L 595.080608 588.986411 +L 595.116142 573.673795 +L 595.139831 577.237525 +L 595.145753 574.09566 +L 595.204976 593.704563 +L 595.210898 590.564609 +L 595.329344 616.302168 +L 595.453712 585.477416 +L 595.459635 587.826199 +L 595.512935 590.291296 +L 595.572158 576.630829 +L 595.601769 594.948042 +L 595.672837 572.229809 +L 595.684681 585.32531 +L 595.696526 580.601447 +L 595.73206 604.192916 +L 595.761671 601.27709 +L 595.773516 603.934843 +L 595.809049 596.096193 +L 595.826816 589.926383 +L 595.903806 601.088709 +L 595.921573 593.803091 +L 595.945262 605.955791 +L 595.968951 590.008899 +L 595.986718 578.354487 +L 596.022252 593.502448 +L 596.081475 586.705884 +L 596.128853 593.10699 +L 596.193998 581.561544 +L 596.312444 608.481806 +L 596.205843 578.949586 +L 596.318366 606.21452 +L 596.424967 587.546451 +L 596.365744 613.075007 +L 596.442734 599.973224 +L 596.537491 609.110971 +L 596.513802 592.049168 +L 596.567102 604.056419 +L 596.573024 600.880646 +L 596.61448 628.891275 +L 596.63817 624.661994 +L 596.650014 628.985796 +L 596.721082 613.911186 +L 596.732926 615.158816 +L 596.815838 577.522592 +L 596.97574 582.365408 +L 597.046807 606.207656 +L 597.082341 586.339208 +L 597.147486 570.949139 +L 597.111952 586.92468 +L 597.194864 573.529131 +L 597.218554 575.904507 +L 597.242243 566.217441 +L 597.271854 570.877214 +L 597.277776 563.631106 +L 597.366611 584.773967 +L 597.46729 596.176626 +L 597.378455 577.739544 +L 597.473212 589.802452 +L 597.479134 585.14715 +L 597.508746 602.986161 +L 597.567969 599.148114 +L 597.591658 604.668188 +L 597.668647 594.737963 +L 597.67457 589.909854 +L 597.698259 603.496238 +L 597.769326 603.005444 +L 597.775249 600.961159 +L 597.840394 614.655517 +L 597.852238 611.885907 +L 597.923306 618.246425 +L 597.864083 609.773849 +L 597.93515 612.37632 +L 597.946995 598.586293 +L 598.023985 624.036748 +L 598.041751 630.894422 +L 598.065441 622.093416 +L 598.118741 611.656325 +L 598.172042 616.931464 +L 598.177964 622.323565 +L 598.260876 603.28129 +L 598.266798 608.164953 +L 598.337866 589.099784 +L 598.302332 609.514401 +L 598.385244 602.531923 +L 598.397089 615.277617 +L 598.444467 599.268082 +L 598.497767 611.617476 +L 598.687281 569.17007 +L 598.539223 615.09902 +L 598.752426 582.117686 +L 598.894561 617.821752 +L 598.900483 614.10297 +L 598.99524 624.528868 +L 599.013006 604.413061 +L 599.018929 604.92235 +L 599.030773 596.42538 +L 599.036696 597.6518 +L 599.137374 586.233057 +L 599.149219 588.799565 +L 599.214364 602.227014 +L 599.267665 599.902523 +L 599.291354 585.179397 +L 599.374266 604.951084 +L 599.38611 603.616757 +L 599.392033 599.035192 +L 599.4631 623.918583 +L 599.469022 620.895168 +L 599.534168 641.323192 +L 599.569701 616.999714 +L 599.753292 594.898242 +L 599.611157 620.590305 +L 599.776981 600.896048 +L 599.788826 615.18618 +L 599.836204 594.099475 +L 599.883583 598.002166 +L 599.895427 600.579787 +L 599.913194 589.78621 +L 599.930961 578.035477 +L 599.984261 591.924482 +L 600.019795 586.578212 +L 600.120474 599.4597 +L 600.049407 582.584498 +L 600.132319 592.350231 +L 600.138241 579.304503 +L 600.215231 602.180566 +L 600.244842 586.654032 +L 600.363288 604.056036 +L 600.315909 579.77124 +L 600.375132 599.935488 +L 600.4995 618.01566 +L 600.410666 594.022359 +L 600.517267 617.100773 +L 600.57649 598.083337 +L 600.617946 619.526426 +L 600.689013 628.212692 +L 600.647557 618.924862 +L 600.724547 621.997184 +L 600.837071 602.421697 +L 600.760081 625.89843 +L 600.842993 605.562296 +L 600.896294 585.227654 +L 600.961439 603.098918 +L 601.097651 587.117606 +L 601.06804 603.507095 +L 601.109496 593.740183 +L 601.186486 617.984009 +L 601.263475 614.859133 +L 601.334543 620.191229 +L 601.40561 600.060389 +L 601.470755 611.846717 +L 601.435222 587.053084 +L 601.488522 604.92702 +L 601.571434 572.301437 +L 601.601046 595.487279 +L 601.666191 606.463226 +L 601.61289 592.486757 +L 601.683958 598.937931 +L 601.707647 576.808769 +L 601.796481 595.987002 +L 601.903082 609.682857 +L 601.914927 605.521935 +L 601.956383 610.308167 +L 602.062984 585.766452 +L 602.10444 599.180007 +L 602.080751 582.101899 +L 602.151818 585.790506 +L 602.193274 576.664214 +L 602.222886 598.258307 +L 602.246575 593.34085 +L 602.276186 583.002103 +L 602.305798 599.398887 +L 602.31172 599.38365 +L 602.530845 642.41282 +L 602.584145 635.957914 +L 602.714435 603.199181 +L 602.720358 604.575537 +L 602.744047 621.971425 +L 602.791425 601.161102 +L 602.826959 604.855244 +L 602.957249 572.18016 +L 602.975016 581.71104 +L 603.069773 606.169403 +L 603.099384 600.998869 +L 603.14084 586.155631 +L 603.21783 610.297032 +L 603.223752 609.527627 +L 603.235597 616.940059 +L 603.247441 611.671285 +L 603.29482 631.40693 +L 603.365887 625.809215 +L 603.371809 630.446254 +L 603.442877 605.204985 +L 603.484333 609.822271 +L 603.579089 593.621543 +L 603.590934 589.45053 +L 603.626468 604.530603 +L 603.638312 602.836225 +L 603.644234 602.825223 +L 603.697535 612.069624 +L 603.721224 597.657435 +L 603.821903 586.793049 +L 603.744913 597.972917 +L 603.83967 591.960918 +L 603.946271 612.566344 +L 603.964038 599.467933 +L 603.975882 596.575128 +L 604.035105 618.345788 +L 604.041028 616.06992 +L 604.076561 599.224662 +L 604.106173 622.494374 +L 604.141707 612.097238 +L 604.153551 618.952147 +L 604.242385 603.337775 +L 604.289764 585.537008 +L 604.354909 600.700263 +L 604.396365 618.024702 +L 604.366753 599.893134 +L 604.467432 606.171632 +L 604.479277 603.086827 +L 604.491121 608.629667 +L 604.526655 607.036437 +L 604.615489 627.047915 +L 604.751702 571.903392 +L 604.627334 627.467678 +L 604.828692 586.925494 +L 604.846459 596.996957 +L 604.870148 580.619884 +L 604.935293 583.266568 +L 605.024127 603.433188 +L 605.047816 591.034592 +L 605.142573 576.265587 +L 605.077428 592.82356 +L 605.16034 585.46168 +L 605.166262 585.074221 +L 605.172184 587.674559 +L 605.266941 619.019505 +L 605.302475 611.092156 +L 605.438687 590.74345 +L 605.332086 612.607384 +L 605.44461 591.61967 +L 605.533444 601.662731 +L 605.462376 584.457786 +L 605.557133 597.316423 +L 605.563055 595.58781 +L 605.586744 616.289044 +L 605.6282 608.838904 +L 605.681501 622.564339 +L 605.717035 599.30293 +L 605.776258 589.801199 +L 605.734802 603.677325 +L 605.841403 593.606699 +L 605.876936 615.879918 +L 605.977615 606.271301 +L 606.001304 598.632734 +L 606.04276 619.468558 +L 606.072372 616.779291 +L 606.084216 622.293151 +L 606.131595 597.408573 +L 606.161206 586.625203 +L 606.232274 605.746243 +L 606.303341 625.258559 +L 606.374409 617.643617 +L 606.380331 610.558486 +L 606.439554 623.179889 +L 606.486932 614.828211 +L 606.510621 620.004573 +L 606.522466 608.873494 +L 606.563922 610.656406 +L 606.623145 590.045179 +L 606.581689 610.828572 +L 606.670523 610.586241 +L 606.682367 615.251777 +L 606.706057 602.541872 +L 606.759357 605.073322 +L 606.889647 573.758288 +L 606.913337 575.984329 +L 607.049549 597.727224 +L 607.067316 597.515468 +L 607.073238 597.688366 +L 607.091005 602.817962 +L 607.132461 591.931209 +L 607.179839 597.943878 +L 607.227218 590.079853 +L 607.268674 601.694787 +L 607.274596 597.982641 +L 607.304208 613.165976 +L 607.369353 595.727742 +L 607.381197 597.840289 +L 607.398964 583.958779 +L 607.475954 600.141609 +L 607.493721 594.732525 +L 607.499643 594.926981 +L 607.612166 579.226454 +L 607.624011 580.578738 +L 607.629933 580.344871 +L 607.706923 601.851891 +L 607.742457 593.374585 +L 607.843136 577.357239 +L 607.789835 600.86363 +L 607.860902 587.05572 +L 608.168861 624.391043 +L 608.174784 623.960001 +L 608.239929 607.92823 +L 608.293229 616.165697 +L 608.340608 609.016249 +L 608.358375 617.742917 +L 608.482743 598.372696 +L 608.488665 599.20461 +L 608.506432 589.56237 +L 608.541965 591.409957 +L 608.666333 568.635195 +L 608.725556 579.587861 +L 608.826235 604.565924 +L 608.772935 579.40683 +L 608.855847 601.107545 +L 608.920992 587.241083 +L 608.909147 603.326409 +L 608.938759 599.747326 +L 608.992059 608.10842 +L 609.039437 592.221753 +L 609.205261 630.918679 +L 609.217106 629.01766 +L 609.223028 629.241103 +L 609.294096 614.387224 +L 609.341474 618.118865 +L 609.377008 624.910681 +L 609.430308 612.372117 +L 609.448075 617.593614 +L 609.525065 610.817594 +L 609.51322 626.804457 +L 609.542832 617.756883 +L 609.560599 624.451691 +L 609.607977 589.437569 +L 609.613899 592.191735 +L 609.625744 591.951477 +L 609.750112 600.511129 +L 609.655355 587.016865 +L 609.756034 597.937148 +L 609.761956 598.301496 +L 609.773801 593.153444 +L 609.779723 593.533519 +L 609.850791 564.428084 +L 609.921858 579.566926 +L 609.92778 579.167249 +L 609.945547 583.766527 +L 609.95147 579.273623 +L 610.034382 616.464253 +L 610.08176 606.048822 +L 610.146905 595.017658 +L 610.188361 608.076064 +L 610.194283 608.088859 +L 610.265351 600.303674 +L 610.247584 612.32462 +L 610.300884 611.737367 +L 610.312729 630.172653 +L 610.389719 596.017691 +L 610.401563 604.43991 +L 610.567387 561.114556 +L 610.437097 605.338761 +L 610.57331 563.391034 +L 610.662144 604.044129 +L 610.697678 595.984274 +L 610.745056 588.881014 +L 610.768745 609.329896 +L 610.798357 602.821294 +L 610.934569 559.290893 +L 610.98787 567.980902 +L 611.11816 602.398149 +L 611.153694 590.013297 +L 611.301751 576.482317 +L 611.307673 576.848524 +L 611.479419 627.05306 +L 611.331362 573.765662 +L 611.544565 606.307948 +L 611.645244 591.749306 +L 611.597865 607.782186 +L 611.657088 598.937424 +L 611.674855 613.951769 +L 611.751845 593.012796 +L 611.757767 586.023127 +L 611.787378 600.438529 +L 611.858446 596.998088 +L 611.87029 604.3944 +L 611.935436 582.748114 +L 611.941358 585.514587 +L 611.94728 584.415764 +L 611.976892 595.922279 +L 611.988736 601.892595 +L 612.07757 593.470793 +L 612.136793 591.073096 +L 612.107182 599.129283 +L 612.15456 594.140436 +L 612.160482 598.716437 +L 612.196016 581.768892 +L 612.261161 593.653569 +L 612.320384 584.50104 +L 612.278928 600.495996 +L 612.338151 598.100114 +L 612.385529 605.313375 +L 612.432908 590.630761 +L 612.43883 595.685729 +L 612.545431 579.322456 +L 612.56912 579.980942 +L 612.669799 604.337038 +L 612.699411 599.673122 +L 612.734944 581.541804 +L 612.823779 592.826429 +L 612.948147 611.410726 +L 613.013292 580.215756 +L 613.072515 596.844415 +L 613.096204 603.068733 +L 613.131737 575.883194 +L 613.13766 579.29281 +L 613.143582 579.255659 +L 613.297561 608.038604 +L 613.202805 578.491108 +L 613.327173 605.733068 +L 613.34494 587.70057 +L 613.410085 608.120839 +L 613.439696 600.085791 +L 613.451541 602.916823 +L 613.469308 587.844696 +L 613.534453 595.011247 +L 613.558142 581.814122 +L 613.629209 608.091087 +L 613.664743 611.161434 +L 613.700277 602.638289 +L 613.706199 605.677312 +L 613.771344 576.865712 +L 613.830567 589.567128 +L 613.842412 596.774169 +L 613.907557 578.5375 +L 613.925324 581.341538 +L 614.02008 572.503203 +L 614.002314 584.888731 +L 614.037847 576.400123 +L 614.049692 590.205578 +L 614.120759 575.413581 +L 614.150371 582.249713 +L 614.197749 573.40207 +L 614.233283 597.322173 +L 614.239205 597.265725 +L 614.245127 598.012142 +L 614.256972 593.371872 +L 614.30435 613.237073 +L 614.316195 620.256399 +L 614.345806 597.352816 +L 614.399107 604.802982 +L 614.410951 602.016415 +L 614.446485 618.954489 +L 614.476096 629.421994 +L 614.51163 598.407373 +L 614.535319 608.465098 +L 614.582698 601.681682 +L 614.58862 609.187673 +L 614.606387 604.72993 +L 614.707066 617.858202 +L 614.653765 596.409407 +L 614.71891 610.095065 +L 614.724832 605.982655 +L 614.801822 626.757919 +L 614.807744 626.814919 +L 614.908423 606.518609 +L 614.943957 614.320209 +L 614.985413 620.65897 +L 615.015025 605.966966 +L 615.038714 612.094759 +L 615.139393 589.684263 +L 615.08017 617.856904 +L 615.169004 595.773051 +L 615.305217 621.513159 +L 615.317061 618.161481 +L 615.423662 591.379475 +L 615.447351 604.261979 +L 615.536186 600.485044 +L 615.565797 609.478343 +L 615.62502 597.8244 +L 615.654631 578.699121 +L 615.731621 592.635854 +L 615.778999 579.63758 +L 615.861911 603.612683 +L 615.867834 605.939408 +L 615.90929 588.03302 +L 615.956668 599.759874 +L 615.96259 596.779221 +L 616.027736 609.606529 +L 616.03958 608.70998 +L 616.134337 620.724413 +L 616.110648 605.585886 +L 616.152104 610.055409 +L 616.258705 601.532097 +L 616.240938 622.254256 +L 616.264627 604.709613 +L 616.288316 609.375876 +L 616.317928 594.682589 +L 616.37715 605.381133 +L 616.513363 588.319671 +L 616.388995 608.443803 +L 616.525208 593.798558 +L 616.578508 602.747184 +L 616.596275 588.047805 +L 616.625886 597.665345 +L 616.667342 582.435283 +L 616.732488 599.321555 +L 616.827244 608.423288 +L 616.779866 595.153712 +L 616.839089 607.565998 +L 616.845011 595.270557 +L 616.916078 613.280331 +L 616.951612 600.922873 +L 616.969379 595.997664 +L 617.016757 610.574057 +L 617.034524 608.475127 +L 617.040447 608.610744 +L 617.07598 589.800191 +L 617.158892 599.026585 +L 617.241804 601.307637 +L 617.176659 593.147015 +L 617.247727 597.186988 +L 617.265493 592.237039 +L 617.301027 604.90182 +L 617.354328 597.678171 +L 617.449084 616.086481 +L 617.466851 601.639171 +L 617.478696 592.863745 +L 617.549763 610.649607 +L 617.555685 608.209115 +L 617.691898 627.974338 +L 617.703743 627.107514 +L 617.828111 601.370023 +L 617.964323 632.224099 +L 617.881411 599.791605 +L 617.988012 629.813499 +L 618.029468 600.230745 +L 618.106458 621.262978 +L 618.171603 595.79298 +L 618.248593 607.830607 +L 618.260438 620.595803 +L 618.349272 596.272171 +L 618.367039 600.15308 +L 618.420339 589.250437 +L 618.455873 573.039363 +L 618.503251 603.957976 +L 618.509174 601.41864 +L 618.515096 603.063236 +L 618.568396 595.182398 +L 618.60393 601.242728 +L 618.710531 586.436282 +L 618.722376 591.670768 +L 618.763832 614.029085 +L 618.828977 596.026859 +L 618.834899 590.267658 +L 618.858588 606.183272 +L 618.929656 603.689421 +L 619.065868 624.846001 +L 619.237615 585.28687 +L 619.249459 593.677018 +L 619.273149 604.26498 +L 619.296838 589.68456 +L 619.320527 592.004283 +L 619.391594 571.906253 +L 619.43305 580.418887 +L 619.468584 596.286938 +L 619.545574 582.891334 +L 619.770621 625.952962 +L 619.800232 620.622979 +L 619.889066 600.590581 +L 619.918678 610.076399 +L 619.966056 626.725942 +L 620.031201 619.984275 +L 620.149647 602.906138 +L 620.26217 627.00026 +L 620.220714 594.222611 +L 620.333238 624.181505 +L 620.439839 597.722561 +L 620.457606 612.57663 +L 620.516829 625.399253 +L 620.540518 610.115765 +L 620.570129 618.130671 +L 620.670808 598.609192 +L 620.682653 610.725199 +L 620.759642 614.314155 +L 620.724109 600.915295 +L 620.795176 611.380496 +L 620.801098 611.608814 +L 620.807021 611.590316 +L 620.901777 616.444161 +L 620.931389 595.685302 +L 620.937311 595.794199 +L 620.961 576.128404 +L 621.061679 586.667093 +L 621.109057 572.169858 +L 621.16828 586.437795 +L 621.357793 620.036263 +L 621.387405 606.949152 +L 621.52954 569.42289 +L 621.665752 618.369827 +L 621.570996 569.057638 +L 621.724975 601.602318 +L 621.73682 591.85811 +L 621.801965 611.178798 +L 621.878955 634.46417 +L 621.813809 611.03346 +L 621.914488 613.54679 +L 621.985556 588.378711 +L 622.032934 607.188853 +L 622.109924 601.56376 +L 622.068468 614.834477 +L 622.139535 602.461384 +L 622.145457 610.940966 +L 622.228369 572.824112 +L 622.234292 582.469119 +L 622.293515 602.459574 +L 622.334971 578.450533 +L 622.340893 577.741121 +L 622.364582 585.364703 +L 622.41196 595.271697 +L 622.459339 580.828603 +L 622.477106 588.86387 +L 622.483028 586.9535 +L 622.524484 607.824556 +L 622.542251 622.766429 +L 622.637007 614.039426 +L 622.672541 599.887916 +L 622.743608 617.663364 +L 622.755453 608.68737 +L 622.808754 636.334891 +L 622.838365 628.186426 +L 622.844287 628.540707 +L 622.85021 624.264346 +L 622.867976 627.701746 +L 622.974578 610.984359 +L 623.004189 618.401593 +L 623.045645 601.486364 +L 623.075256 605.502522 +L 623.116712 592.618181 +L 623.18778 601.641292 +L 623.276614 625.870873 +L 623.31807 620.193037 +L 623.418749 595.692937 +L 623.347682 626.453225 +L 623.466127 596.225385 +L 623.47205 596.356738 +L 623.489816 589.543119 +L 623.566806 598.817303 +L 623.661563 615.63863 +L 623.685252 607.379949 +L 623.691174 605.11413 +L 623.738553 628.37765 +L 623.744475 623.805565 +L 623.750397 625.608583 +L 623.803698 609.291281 +L 623.862921 588.52371 +L 623.922143 598.713876 +L 623.928066 598.953397 +L 623.933988 596.51026 +L 623.951755 599.573396 +L 624.058356 585.262416 +L 624.14719 579.893662 +L 624.105734 597.23924 +L 624.159035 582.679584 +L 624.212335 606.774671 +L 624.259714 580.509295 +L 624.265636 582.889048 +L 624.283403 568.566903 +L 624.366315 583.587303 +L 624.372237 581.25531 +L 624.419615 591.211919 +L 624.478838 580.521471 +L 624.520294 558.895839 +L 624.585439 581.262171 +L 624.609129 570.85981 +L 624.615051 567.999414 +L 624.680196 586.985289 +L 624.71573 607.919619 +L 624.816409 598.599033 +L 624.84602 585.141448 +L 624.911165 603.688779 +L 624.928932 594.807023 +L 625.059222 608.808298 +L 625 593.283967 +L 625.065145 604.922905 +L 625.100678 608.293925 +L 625.18359 596.945398 +L 625.266502 618.298063 +L 625.296114 605.44676 +L 625.33757 590.59566 +L 625.384948 613.763854 +L 625.396793 626.030696 +L 625.46786 603.015463 +L 625.479705 606.741349 +L 625.527083 597.621048 +L 625.562617 609.14412 +L 625.592228 602.550886 +L 625.669218 623.450158 +L 625.604073 601.080623 +L 625.716596 616.087519 +L 625.781741 603.191551 +L 625.734363 618.628 +L 625.835042 612.484138 +L 625.840964 618.031403 +L 625.917954 595.662736 +L 625.935721 603.650737 +L 625.941643 604.902445 +L 625.977177 593.271503 +L 626.000866 595.79914 +L 626.077856 577.828412 +L 626.113389 586.585755 +L 626.137079 605.454802 +L 626.184457 582.697713 +L 626.225913 593.578173 +L 626.320669 561.230672 +L 626.356203 580.154884 +L 626.468727 593.086531 +L 626.397659 569.563293 +L 626.486493 588.953013 +L 626.545716 593.82122 +L 626.622706 574.205108 +L 626.699696 589.190018 +L 626.747074 584.02856 +L 626.829986 576.303505 +L 626.800375 597.095593 +L 626.853675 584.657401 +L 626.983966 619.651729 +L 626.989888 615.558854 +L 627.031344 616.169078 +L 627.1261 574.254815 +L 627.256391 598.498556 +L 627.274158 597.55237 +L 627.309691 577.573894 +L 627.286002 601.016904 +L 627.434059 584.252203 +L 627.493282 607.249192 +L 627.56435 604.682068 +L 627.588039 587.047013 +L 627.623572 609.31813 +L 627.688718 589.196198 +L 627.795319 595.939693 +L 627.724251 582.464696 +L 627.807163 593.575882 +L 627.842697 588.43039 +L 627.931531 604.271642 +L 627.984832 573.445354 +L 628.061822 581.72085 +L 628.150656 608.088587 +L 628.18619 597.182951 +L 628.298713 583.296548 +L 628.251335 600.177341 +L 628.304635 586.404685 +L 628.429003 604.854561 +L 628.328325 581.955791 +L 628.440848 595.67505 +L 628.52376 578.706298 +L 628.464537 595.791181 +L 628.559294 589.063359 +L 628.65405 596.391903 +L 628.571138 583.134996 +L 628.659973 592.795544 +L 628.754729 562.793264 +L 628.778418 580.625511 +L 628.991621 633.853063 +L 628.790263 577.108263 +L 629.062688 615.026072 +L 629.1456 602.792995 +L 629.175212 608.771142 +L 629.181134 613.608373 +L 629.246279 593.558156 +L 629.264046 599.777017 +L 629.400258 564.228741 +L 629.406181 567.752878 +L 629.489093 601.587889 +L 629.530549 587.490665 +L 629.536471 584.432127 +L 629.595694 605.035002 +L 629.731906 625.463525 +L 629.749673 628.832612 +L 629.797052 621.541474 +L 629.814818 623.559968 +L 629.927342 605.144643 +L 629.838508 629.288509 +L 629.933264 610.512406 +L 629.980642 608.115223 +L 629.962876 616.250225 +L 629.986565 612.83101 +L 630.087244 624.135547 +L 629.998409 612.829066 +L 630.099088 615.603119 +L 630.116855 605.783248 +L 630.182 625.41756 +L 630.211612 614.310786 +L 630.223456 609.011636 +L 630.25899 623.529902 +L 630.270835 628.676784 +L 630.288601 615.089682 +L 630.353747 615.92381 +L 630.472192 582.933471 +L 630.484037 585.606394 +L 630.507726 602.576736 +L 630.620249 601.305324 +L 630.738695 589.627568 +L 630.886752 615.624924 +L 630.898597 609.524521 +L 630.910441 597.335324 +L 631.01112 605.611302 +L 631.028887 612.714555 +L 631.064421 598.628632 +L 631.08811 600.999895 +L 631.123644 579.627949 +L 631.188789 603.986574 +L 631.212478 624.82707 +L 631.307235 618.544357 +L 631.384224 596.713817 +L 631.419758 608.388694 +L 631.42568 614.274915 +L 631.443447 597.030567 +L 631.520437 598.900852 +L 631.591504 609.127708 +L 631.603349 596.918143 +L 631.63296 584.426619 +L 631.692183 613.276002 +L 631.698106 613.210363 +L 631.70995 618.524322 +L 631.781018 595.360767 +L 631.816551 584.625772 +L 631.875774 595.037147 +L 631.881696 603.229998 +L 631.958686 577.562289 +L 631.976453 582.686501 +L 632.04752 570.38361 +L 632.106743 597.600453 +L 632.171888 592.205909 +L 632.189655 605.930028 +L 632.207422 598.701235 +L 632.237034 610.18692 +L 632.260723 592.600895 +L 632.319946 609.448215 +L 632.367324 603.370177 +L 632.414702 617.770686 +L 632.420625 616.655464 +L 632.444314 620.478849 +L 632.503537 611.780619 +L 632.515381 612.723861 +L 632.521303 609.129932 +L 632.562759 629.097908 +L 632.610138 616.067681 +L 632.61606 621.719793 +L 632.69305 593.109924 +L 632.704894 601.229568 +L 632.728583 583.938688 +L 632.82334 590.057388 +L 632.829262 587.825082 +L 632.864796 607.334962 +L 632.894407 599.920139 +L 633.012853 625.595375 +L 633.018775 619.497721 +L 633.03062 626.208401 +L 633.172755 596.206454 +L 633.332657 634.222952 +L 633.397802 620.536628 +L 633.451102 609.635293 +L 633.492558 627.977603 +L 633.658382 592.674814 +L 633.581393 629.516525 +L 633.723528 596.383275 +L 633.776828 620.634112 +L 633.847896 614.566292 +L 633.85974 608.960823 +L 633.865662 610.107977 +L 633.924885 616.453464 +L 633.995953 597.629622 +L 634.049253 613.601711 +L 634.102554 601.402782 +L 634.14401 605.791706 +L 634.250611 580.89735 +L 634.2743 583.687751 +L 634.363135 599.232555 +L 634.398668 598.729047 +L 634.404591 600.473631 +L 634.457891 583.742337 +L 634.469736 587.256504 +L 634.540803 574.167736 +L 634.570415 592.608327 +L 634.576337 588.714359 +L 634.671093 616.488731 +L 634.718472 613.86788 +L 634.742161 616.881745 +L 634.789539 607.474494 +L 634.795461 602.793648 +L 634.866529 627.637459 +L 634.878373 623.893693 +L 635.014586 599.160165 +L 634.89614 627.929389 +L 635.032353 606.340064 +L 635.067887 617.965056 +L 635.109343 602.348071 +L 635.144876 610.664009 +L 635.269244 587.622081 +L 635.192255 622.118651 +L 635.275167 587.739334 +L 635.281089 598.39045 +L 635.364001 566.06343 +L 635.375845 569.970161 +L 635.381768 570.140139 +L 635.38769 567.44708 +L 635.393612 562.600453 +L 635.470602 581.508406 +L 635.476524 581.306587 +L 635.618659 624.641638 +L 635.689727 601.343194 +L 635.796328 575.799986 +L 635.849628 589.569091 +L 635.962152 596.849934 +L 635.897007 585.481236 +L 635.973996 596.412729 +L 636.027297 585.343747 +L 636.080598 595.705422 +L 636.181276 603.315714 +L 636.122054 592.25726 +L 636.187199 596.499656 +L 636.193121 593.999108 +L 636.240499 612.491072 +L 636.264188 609.498294 +L 636.270111 613.249287 +L 636.335256 593.087616 +L 636.353023 596.852438 +L 636.50108 568.09104 +L 636.376712 600.13372 +L 636.507002 568.865571 +L 636.595837 585.136273 +L 636.619526 573.361028 +L 636.63137 567.642625 +L 636.690593 589.333826 +L 636.696515 588.933664 +L 636.70836 594.263424 +L 636.78535 577.417708 +L 636.797194 578.714471 +L 636.83865 592.146333 +L 636.897873 574.872954 +L 636.903795 575.413763 +L 636.963018 587.643943 +L 637.016319 576.11751 +L 637.022241 570.477695 +L 637.099231 584.800297 +L 637.111075 582.688613 +L 637.12292 590.677823 +L 637.193987 567.076908 +L 637.205832 575.766431 +L 637.288744 568.385356 +L 637.247288 579.612761 +L 637.306511 576.458652 +L 637.448646 625.766573 +L 637.567091 620.490918 +L 637.66777 614.519082 +L 637.608548 627.259372 +L 637.679615 619.027044 +L 637.798061 601.733472 +L 637.738838 626.626516 +L 637.803983 605.76643 +L 637.999418 574.384808 +L 638.005341 577.316114 +L 638.147476 637.83775 +L 638.165242 631.367361 +L 638.177087 627.73521 +L 638.301455 587.165939 +L 638.3133 589.827331 +L 638.425823 608.85575 +L 638.3666 585.599032 +L 638.44359 607.43987 +L 638.449512 609.621477 +L 638.485046 590.914525 +L 638.538346 608.403958 +L 638.597569 593.324405 +L 638.57388 611.3256 +L 638.65087 606.137544 +L 638.674559 623.159735 +L 638.745627 601.861662 +L 638.751549 607.107158 +L 638.769316 601.9702 +L 638.816694 625.925366 +L 638.852228 611.683042 +L 638.941062 621.799259 +L 638.887761 608.191551 +L 638.958829 611.205267 +L 639.018052 586.109517 +L 638.976596 615.133188 +L 639.071352 606.757301 +L 639.100964 601.87126 +L 639.118731 611.967368 +L 639.166109 609.844243 +L 639.189798 622.384535 +L 639.278632 613.714535 +L 639.284555 613.385406 +L 639.308244 616.178012 +L 639.314166 619.414594 +L 639.403 608.109487 +L 639.539213 589.207647 +L 639.432612 608.977236 +L 639.55698 591.615099 +L 639.616203 601.878171 +L 639.592513 590.264358 +L 639.663581 592.541541 +L 639.829405 567.061169 +L 639.681348 594.511319 +L 639.84125 572.470096 +L 639.906395 590.098908 +L 639.941928 572.563315 +L 639.959695 561.93321 +L 640.030763 577.643114 +L 640.042607 577.300364 +L 640.04853 577.269644 +L 640.196587 621.169189 +L 640.23212 604.379511 +L 640.315032 575.624966 +L 640.279499 611.16377 +L 640.362411 593.562313 +L 640.368333 595.862912 +L 640.403867 580.116702 +L 640.445323 582.835457 +L 640.451245 583.238964 +L 640.457167 578.27583 +L 640.569691 559.703115 +L 640.480856 580.522716 +L 640.581535 563.431205 +L 640.688136 593.274142 +L 640.705903 584.889672 +L 640.711826 576.323791 +L 640.794738 600.646236 +L 640.80066 598.266988 +L 640.848038 608.367918 +L 640.895417 594.447093 +L 640.901339 595.051691 +L 640.966484 578.690728 +L 641.002018 600.167465 +L 641.013862 589.867688 +L 641.019785 592.023637 +L 641.061241 569.815262 +L 641.067163 566.168671 +L 641.132308 577.800457 +L 641.167842 568.146958 +L 641.262598 590.735553 +L 641.197453 567.559997 +L 641.286287 577.105948 +L 641.34551 573.837765 +L 641.357355 585.973765 +L 641.446189 607.655652 +L 641.469878 598.507746 +L 641.475801 594.603635 +L 641.570557 602.82968 +L 641.582402 603.806669 +L 641.588324 602.706601 +L 641.659391 592.058239 +L 641.689003 612.183108 +L 641.771915 592.56637 +L 641.807449 606.069797 +L 641.831138 598.864533 +L 641.91405 586.064592 +L 641.842982 599.375083 +L 641.949584 595.911507 +L 642.026573 606.237626 +L 642.068029 605.449422 +L 642.073952 604.48351 +L 642.091718 618.591724 +L 642.103563 617.165498 +L 642.133174 619.343699 +L 642.145019 613.860917 +L 642.245698 589.018476 +L 642.180553 614.812034 +L 642.269387 593.721642 +L 642.293076 599.081801 +L 642.322688 588.734662 +L 642.32861 591.735562 +L 642.340454 585.12391 +L 642.387833 611.076665 +L 642.411522 601.823189 +L 642.506278 630.549362 +L 642.541812 627.729375 +L 642.713558 602.150723 +L 642.618802 629.597526 +L 642.737248 609.596516 +L 642.772781 612.069728 +L 642.755014 606.539614 +L 642.778704 606.720977 +L 642.826082 608.981339 +L 642.903072 594.173357 +L 642.908994 597.499076 +L 642.956372 587.166563 +L 643.003751 590.520112 +L 643.098507 584.359911 +L 643.074818 593.800592 +L 643.104429 588.064135 +L 643.181419 614.853748 +L 643.222875 606.735305 +L 643.240642 596.702905 +L 643.311709 610.275202 +L 643.323554 607.574487 +L 643.436077 640.916776 +L 643.347243 607.158333 +L 643.453844 627.554499 +L 643.4953 616.658237 +L 643.566368 625.476097 +L 643.661124 590.310654 +L 643.590057 629.791798 +L 643.767725 597.609129 +L 643.77957 604.776561 +L 643.850637 582.607753 +L 643.85656 584.01796 +L 643.862482 582.746185 +L 643.886171 600.926082 +L 643.915783 594.909398 +L 643.98685 626.464714 +L 644.057917 612.547641 +L 644.27112 582.665519 +L 644.075684 612.995813 +L 644.318498 585.46317 +L 644.407332 606.331238 +L 644.454711 600.723169 +L 644.496167 584.75591 +L 644.55539 595.67543 +L 644.561312 606.882401 +L 644.620535 577.607158 +L 644.656068 582.565889 +L 644.661991 582.618396 +L 644.73898 575.151129 +L 644.768592 591.481374 +L 644.804126 576.465317 +L 644.875193 588.578351 +L 645.064706 627.906168 +L 644.898882 584.295166 +L 645.076551 621.262816 +L 645.218686 592.622715 +L 645.23053 594.841216 +L 645.236453 594.698011 +L 645.248297 588.844611 +L 645.30752 615.84448 +L 645.402277 630.600985 +L 645.354898 604.970208 +L 645.425966 627.456904 +L 645.473344 604.132075 +L 645.532567 628.617109 +L 645.574023 634.971773 +L 645.615479 616.614055 +L 645.627323 620.970123 +L 645.728002 601.717434 +L 645.745769 604.193133 +L 645.822759 612.350622 +L 645.787225 591.652291 +L 645.846448 600.074002 +L 645.85237 596.314298 +L 645.893826 607.740218 +L 645.953049 601.560186 +L 645.958971 601.431289 +L 645.964894 598.802524 +L 646.00635 613.845497 +L 646.05965 605.439518 +L 646.178096 586.511626 +L 646.225474 573.01737 +L 646.296542 579.142079 +L 646.397221 569.734881 +L 646.349842 581.192302 +L 646.409065 577.383046 +L 646.586734 617.901884 +L 646.604501 607.054455 +L 646.610423 607.089909 +L 646.62819 617.100928 +L 646.699257 604.490295 +L 646.717024 611.387248 +L 646.752558 596.002361 +L 646.83547 605.45086 +L 646.882848 589.589056 +L 646.930226 612.422019 +L 646.947993 625.646377 +L 647.013138 599.618456 +L 647.019061 602.479873 +L 647.04275 592.35539 +L 647.084206 607.402077 +L 647.125662 603.319383 +L 647.167118 616.923648 +L 647.220418 594.668174 +L 647.25003 584.844987 +L 647.232263 597.793057 +L 647.338864 586.423029 +L 647.480999 617.695319 +L 647.492844 615.413548 +L 647.552067 601.087419 +L 647.611289 607.328285 +L 647.623134 603.706339 +L 647.676435 618.507146 +L 647.682357 615.596935 +L 647.759347 622.163519 +L 647.711968 611.568201 +L 647.788958 619.315129 +L 647.800803 606.647261 +L 647.889637 623.425728 +L 647.895559 617.399081 +L 647.966627 627.698016 +L 647.990316 609.973469 +L 647.996238 612.911247 +L 648.049539 603.376526 +L 648.025849 615.557882 +L 648.102839 610.648318 +L 648.215363 631.884368 +L 648.138373 599.276331 +L 648.233129 625.76537 +L 648.244974 620.730454 +L 648.274585 633.091424 +L 648.304197 631.284034 +L 648.351575 645.739765 +L 648.404876 626.897395 +L 648.505555 619.562802 +L 648.464099 627.587525 +L 648.523322 625.215219 +L 648.5707 632.479484 +L 648.606234 615.6192 +L 648.624 619.498882 +L 648.754291 589.514255 +L 648.760213 589.587349 +L 648.77798 601.666145 +L 648.860892 587.111647 +L 648.866814 588.825149 +L 648.872736 586.496889 +L 648.90827 607.544055 +L 648.973415 588.883042 +L 649.091861 600.07623 +L 649.014871 586.937921 +L 649.097783 598.75087 +L 649.121472 614.035137 +L 649.162928 594.983999 +L 649.210307 603.52958 +L 649.228074 597.76848 +L 649.26953 617.543114 +L 649.281374 624.940947 +L 649.334675 601.446347 +L 649.376131 618.345012 +L 649.518266 587.701798 +L 649.47681 622.438138 +L 649.536033 592.551382 +L 649.666323 627.90157 +L 649.826225 591.256533 +L 649.68409 629.027914 +L 649.832147 591.406745 +L 649.849914 603.826769 +L 649.920981 585.623153 +L 649.926903 585.875981 +L 649.932826 582.215423 +L 649.938748 580.356058 +L 649.962437 605.820353 +L 649.968359 610.55032 +L 650.057194 600.055842 +L 650.074961 607.447252 +L 650.092727 614.500155 +L 650.22894 585.189368 +L 650.264474 602.700731 +L 650.317774 580.139622 +L 650.335541 585.688052 +L 650.406609 568.276705 +L 650.376997 588.047871 +L 650.453987 574.591131 +L 650.56651 585.610464 +L 650.519132 572.964205 +L 650.572433 583.011314 +L 650.596122 595.026531 +L 650.714568 589.008274 +L 650.756024 579.744488 +L 650.79748 606.10367 +L 650.827091 615.375888 +L 650.910003 599.860009 +L 650.921848 607.887086 +L 650.986993 595.397274 +L 651.016604 596.034975 +L 651.170584 622.214202 +L 651.182428 620.497823 +L 651.289029 597.829328 +L 651.306796 606.563023 +L 651.348252 609.415971 +L 651.383786 597.567603 +L 651.389708 599.964638 +L 651.407475 594.679539 +L 651.478542 611.130797 +L 651.484465 611.268033 +L 651.585144 595.151578 +L 651.60291 600.617081 +L 651.691745 582.291479 +L 651.620677 602.278591 +L 651.733201 589.586974 +L 651.750968 604.032304 +L 651.845724 603.925768 +L 651.910869 590.412137 +L 651.958248 595.001744 +L 652.058927 629.561849 +L 652.100383 610.729483 +L 652.165528 580.024047 +L 652.224751 596.338282 +L 652.325429 605.046537 +L 652.313585 593.060741 +L 652.337274 601.576092 +L 652.355041 595.361263 +L 652.426108 611.155973 +L 652.491253 613.003557 +L 652.443875 603.081714 +L 652.503098 604.930486 +L 652.520865 595.079685 +L 652.544554 607.688995 +L 652.615621 603.142113 +L 652.7163 599.542137 +L 652.751834 613.824344 +L 652.757756 607.845198 +L 652.846591 622.68875 +L 652.852513 630.358628 +L 652.911736 607.054509 +L 652.94727 609.616353 +L 652.959114 618.448844 +L 653.030182 590.622096 +L 653.036104 592.600942 +L 653.047948 593.631863 +L 653.178239 578.360899 +L 653.237462 593.940323 +L 653.296684 618.583463 +L 653.36183 608.084497 +L 653.409208 619.283663 +L 653.456586 600.21763 +L 653.462508 593.768843 +L 653.551343 610.320963 +L 653.563187 604.21184 +L 653.56911 604.421632 +L 653.575032 603.914906 +L 653.580954 604.152344 +L 653.675711 597.475355 +L 653.610566 605.802698 +L 653.693478 599.411307 +L 653.806001 620.681042 +L 653.711244 594.461671 +L 653.853379 608.191186 +L 653.882991 597.990357 +L 653.924447 616.170184 +L 653.965903 604.513525 +L 654.001437 596.715622 +L 654.025126 608.607499 +L 654.054737 604.893605 +L 654.066582 622.977956 +L 654.143571 581.051293 +L 654.149494 582.764451 +L 654.19095 593.401244 +L 654.24425 577.666749 +L 654.267939 588.905145 +L 654.344929 580.993688 +L 654.368618 591.809454 +L 654.481142 623.217364 +L 654.498909 616.921654 +L 654.635121 587.389508 +L 654.646966 594.764147 +L 654.729878 578.25798 +L 654.7358 576.295813 +L 654.777256 598.122574 +L 654.795023 610.755696 +L 654.854246 587.336118 +L 654.877935 591.64538 +L 654.925313 604.769926 +L 654.966769 588.323317 +L 654.984536 590.593944 +L 654.990458 586.386587 +L 655.079293 597.849102 +L 655.085215 597.69287 +L 655.102982 615.830052 +L 655.156282 593.98991 +L 655.197738 605.436196 +L 655.215505 603.910941 +L 655.233272 595.858101 +L 655.286573 612.632628 +L 655.322106 604.444823 +L 655.458319 620.439059 +L 655.470164 615.852308 +L 655.529386 583.958103 +L 655.618221 593.214058 +L 655.659677 605.860354 +L 655.69521 587.065012 +L 655.736666 601.404069 +L 655.831423 584.138397 +L 655.855112 591.540574 +L 655.861034 591.4074 +L 655.997247 615.370753 +L 656.127537 592.334385 +L 656.13346 591.583807 +L 656.139382 601.10586 +L 656.251905 615.350121 +L 656.198605 596.222367 +L 656.257828 610.998233 +L 656.364429 597.601796 +L 656.382196 601.803333 +L 656.447341 613.598514 +L 656.405885 594.334163 +L 656.506564 608.894801 +L 656.512486 608.992228 +L 656.518408 608.938656 +L 656.577631 626.648555 +L 656.648699 620.718632 +L 656.67831 621.15212 +L 656.761222 608.667761 +L 656.773067 619.215818 +L 656.838212 600.033748 +L 656.867823 606.659995 +L 656.950735 577.217694 +L 657.051414 588.536987 +L 657.181704 617.220971 +L 657.211316 611.280974 +L 657.264616 632.371733 +L 657.276461 623.669951 +L 657.353451 634.040191 +L 657.371218 621.784768 +L 657.383062 622.794896 +L 657.45413 607.887689 +L 657.495586 621.541428 +L 657.768011 570.475907 +L 657.779855 572.647934 +L 657.785778 574.844347 +L 657.845 557.830505 +L 657.874612 552.122831 +L 657.910146 562.745378 +L 657.916068 562.310264 +L 658.064125 594.553123 +L 657.927912 559.184082 +L 658.081892 588.525224 +L 658.164804 580.548886 +L 658.123348 591.930811 +L 658.170726 586.450475 +L 658.271405 608.300395 +L 658.289172 603.866624 +L 658.318783 596.38086 +L 658.360239 618.856154 +L 658.372084 612.355727 +L 658.378006 612.451131 +L 658.472763 600.197987 +L 658.49053 606.276377 +L 658.508297 618.486567 +L 658.54383 596.893143 +L 658.549753 598.346671 +L 658.567519 590.023685 +L 658.650431 604.876171 +L 658.739266 563.542037 +L 658.834022 574.940723 +L 658.95839 603.832169 +L 658.881401 564.409127 +L 658.964313 602.579893 +L 658.999846 612.522933 +L 659.053147 600.708321 +L 659.059069 602.794966 +L 659.106447 604.583054 +L 659.183437 583.70648 +L 659.201204 582.282241 +L 659.207126 584.029949 +L 659.213049 580.427674 +L 659.260427 593.90064 +L 659.313728 584.275209 +L 659.337417 593.567359 +L 659.361106 579.038354 +L 659.420329 582.955941 +L 659.426251 577.421961 +L 659.497318 611.56975 +L 659.592075 592.92831 +L 659.615764 604.630339 +L 659.651298 622.222775 +L 659.716443 602.916232 +L 659.722365 598.948126 +L 659.793433 617.144891 +L 659.8112 607.281647 +L 659.94149 625.892655 +L 659.894112 606.999395 +L 659.947412 622.585143 +L 659.959257 615.461677 +L 660.012557 631.134477 +L 660.042169 624.083482 +L 660.125081 651.798212 +L 660.166537 651.187523 +L 660.308672 591.355721 +L 660.320516 595.213178 +L 660.403428 605.365474 +L 660.338283 592.612799 +L 660.421195 593.314093 +L 660.450807 576.853567 +L 660.515952 597.404348 +L 660.64032 614.601198 +L 660.735076 592.475644 +L 660.681776 619.639329 +L 660.77061 600.805544 +L 660.776532 604.433171 +L 660.829833 584.017592 +L 660.853522 585.900943 +L 660.859444 585.776648 +L 660.930512 584.679678 +L 660.989735 599.412886 +L 661.019346 589.422075 +L 661.072647 607.696909 +L 661.078569 602.1154 +L 661.084491 609.49236 +L 661.167403 580.142134 +L 661.173325 585.962809 +L 661.333227 615.759883 +L 661.356916 611.293289 +L 661.445751 587.476026 +L 661.540507 598.596547 +L 661.593808 613.81784 +L 661.635264 593.2949 +L 661.653031 601.211838 +L 661.73002 603.136765 +L 661.789243 578.084696 +L 661.830699 607.192221 +L 661.901767 589.9114 +L 661.949145 584.643463 +L 661.996523 599.691136 +L 662.037979 615.585619 +L 662.103124 603.77476 +L 662.186036 590.373514 +L 662.14458 607.75575 +L 662.22157 599.006444 +L 662.322249 631.945181 +L 662.387394 622.564473 +L 662.399239 619.402322 +L 662.405161 613.083765 +L 662.446617 623.633626 +L 662.50584 619.241016 +L 662.511762 621.014373 +L 662.565063 604.708664 +L 662.576907 592.049523 +L 662.665742 612.328478 +L 662.719042 617.176048 +L 662.695353 605.89012 +L 662.766421 608.892205 +L 662.878944 601.422511 +L 662.801954 619.852571 +L 662.884866 603.490126 +L 662.99739 634.725558 +L 662.9204 596.64902 +L 663.038846 622.584611 +L 663.139525 599.921198 +L 663.062535 624.501993 +L 663.192825 603.877015 +L 663.305349 632.350011 +L 663.228359 602.437335 +L 663.358649 620.695183 +L 663.423794 604.225033 +L 663.483017 606.692041 +L 663.488939 607.503671 +L 663.536318 600.85266 +L 663.54224 604.14389 +L 663.554085 595.263485 +L 663.61923 610.674355 +L 663.648841 608.549011 +L 663.796898 586.331098 +L 663.820588 594.861655 +L 663.885733 579.313623 +L 663.909422 591.685833 +L 663.915344 585.718207 +L 663.939033 598.295496 +L 664.021945 590.179505 +L 664.027868 588.317483 +L 664.039712 606.942732 +L 664.08709 600.50713 +L 664.205536 611.844074 +L 664.170002 595.469838 +L 664.217381 610.823028 +L 664.223303 610.777651 +L 664.276604 617.542198 +L 664.246992 608.072535 +L 664.323982 613.834415 +L 664.472039 575.697372 +L 664.495728 583.37488 +L 664.554951 569.787879 +L 664.560873 572.019134 +L 664.590485 561.582071 +L 664.649708 581.757962 +L 664.661552 579.77159 +L 664.667475 579.796243 +L 664.685241 572.14659 +L 664.756309 588.040096 +L 664.774076 581.996153 +L 664.779998 581.570379 +L 664.791843 587.827332 +L 664.845143 615.82632 +L 664.886599 583.503083 +L 664.898444 586.154569 +L 664.910288 584.159427 +L 664.975433 600.846063 +L 665.046501 611.68328 +L 665.052423 599.68699 +L 665.087957 601.852835 +L 665.093879 597.503652 +L 665.176791 615.429211 +L 665.224169 597.595983 +L 665.283392 612.166628 +L 665.295237 623.640084 +L 665.372227 590.741985 +L 665.384071 583.910002 +L 665.449216 599.318937 +L 665.466983 596.30695 +L 665.603196 617.947002 +L 665.609118 616.597693 +L 665.620963 626.567337 +L 665.668341 598.441275 +L 665.69203 601.180728 +L 665.697952 604.298955 +L 665.763098 585.108677 +L 665.810476 575.599505 +L 665.851932 588.78072 +L 665.982222 607.800708 +L 665.905232 575.027901 +L 665.994067 602.255905 +L 666.094746 594.373819 +L 666.035523 614.112572 +L 666.100668 602.381706 +L 666.10659 603.30282 +L 666.118435 594.729318 +L 666.148046 595.907226 +L 666.159891 583.626495 +L 666.242803 601.441903 +L 666.254647 601.076886 +L 666.373093 588.360091 +L 666.414549 614.105056 +L 666.491539 605.618284 +L 666.497461 603.135757 +L 666.550762 623.018006 +L 666.574451 616.729858 +L 666.621829 620.650377 +L 666.615907 612.332583 +L 666.633674 616.299365 +L 666.669207 596.378115 +L 666.763964 600.421011 +L 666.793575 608.540545 +L 666.852798 594.207723 +L 666.858721 594.035026 +L 666.912021 613.586808 +L 666.994933 612.614274 +L 667.000855 615.176301 +L 667.018622 602.362639 +L 667.060078 602.758906 +L 667.08969 587.457124 +L 667.166679 600.871526 +L 667.273281 627.40549 +L 667.302892 618.777831 +L 667.362115 593.212835 +L 667.42726 599.711369 +L 667.462794 615.457177 +L 667.510172 592.32963 +L 667.539783 613.103323 +L 667.699685 573.591832 +L 667.835898 614.032282 +L 667.84182 613.531023 +L 667.906965 598.754742 +L 667.865509 613.698027 +L 667.954344 611.035173 +L 668.055022 592.94795 +L 668.078712 605.564298 +L 668.096478 616.946913 +L 668.161624 596.942628 +L 668.17939 602.650666 +L 668.232691 581.065274 +L 668.291914 587.792586 +L 668.416282 614.471435 +L 668.428126 612.21428 +L 668.445893 602.007665 +L 668.475505 619.738177 +L 668.493272 617.119122 +L 668.505116 630.822432 +L 668.59395 613.050908 +L 668.599873 614.95245 +L 668.736085 581.004066 +L 668.61764 618.107964 +L 668.753852 593.718944 +L 668.759774 593.795858 +L 668.777541 597.543064 +L 668.82492 583.767418 +L 668.848609 587.064568 +L 668.895987 576.87253 +L 668.919676 595.787892 +L 668.996666 617.248757 +L 669.038122 611.475354 +L 669.109189 600.184493 +L 669.067733 613.250897 +L 669.150645 609.647257 +L 669.180257 621.566624 +L 669.203946 598.38806 +L 669.257247 610.05429 +L 669.275013 599.13361 +L 669.340159 613.69558 +L 669.352003 611.047965 +L 669.440837 624.245971 +L 669.387537 610.210762 +L 669.476371 618.620979 +L 669.482293 619.139174 +L 669.488216 614.163598 +L 669.565205 585.193658 +L 669.600739 609.258099 +L 669.796175 573.85451 +L 669.642195 616.599724 +L 669.808019 575.289474 +L 669.843553 586.50023 +L 669.867242 572.471432 +L 669.920543 579.58634 +L 669.944232 577.017287 +L 669.956076 586.931925 +L 669.961999 586.731096 +L 669.973843 594.800753 +L 670.038988 578.250163 +L 670.074522 588.07097 +L 670.32918 636.084574 +L 670.092289 585.795614 +L 670.35287 623.995415 +L 670.364714 625.369118 +L 670.489082 604.038547 +L 670.566072 619.702522 +L 670.595683 606.792358 +L 670.601606 605.551469 +L 670.625295 618.096954 +L 670.666751 612.798992 +L 670.731896 628.238798 +L 670.702284 609.837685 +L 670.773352 617.909118 +L 670.891798 595.665558 +L 670.785196 618.538457 +L 670.89772 598.639509 +L 671.016166 572.858573 +L 671.02801 579.126702 +L 671.039855 577.739176 +L 671.057622 585.793381 +L 671.075388 582.087598 +L 671.199757 607.325215 +L 671.205679 605.91519 +L 671.211601 605.918853 +L 671.359658 637.307035 +L 671.241213 600.436136 +L 671.371503 634.024221 +L 671.531405 590.696862 +L 671.561016 597.595228 +L 671.679462 609.110004 +L 671.691306 599.082161 +L 671.756451 624.797194 +L 671.780141 623.498078 +L 671.791985 621.678643 +L 671.892664 638.084508 +L 671.85713 619.395639 +L 671.904509 630.413573 +L 672.06441 598.429634 +L 672.182856 618.173085 +L 672.194701 612.775938 +L 672.242079 627.98085 +L 672.301302 616.215277 +L 672.307224 612.731349 +L 672.372369 627.363813 +L 672.401981 622.021801 +L 672.413825 623.773288 +L 672.419748 615.263213 +L 672.47897 600.642101 +L 672.532271 602.463318 +L 672.591494 611.338966 +L 672.55596 599.379669 +L 672.644794 606.029415 +L 672.650717 608.352013 +L 672.721784 597.938033 +L 672.727706 594.480528 +L 672.769162 602.029969 +L 672.810618 600.840789 +L 672.834308 598.263577 +L 672.934986 624.432748 +L 673.071199 601.860476 +L 673.219256 585.092464 +L 673.1245 607.56385 +L 673.237023 587.197176 +L 673.266634 611.177904 +L 673.355469 593.105117 +L 673.373236 578.91078 +L 673.46207 590.935186 +L 673.562749 605.096749 +L 673.533137 588.320501 +L 673.574593 594.700985 +L 673.604205 591.681295 +L 673.645661 602.394174 +L 673.66935 598.413389 +L 673.693039 607.590798 +L 673.752262 585.823523 +L 673.758184 585.419123 +L 673.764107 591.406417 +L 673.858863 606.187839 +L 673.87663 601.471687 +L 673.882552 594.397201 +L 673.95362 618.103416 +L 673.971387 618.058316 +L 673.995076 624.729956 +L 674.042454 600.103429 +L 674.077988 618.191852 +L 674.08391 618.227115 +L 674.089832 620.281216 +L 674.143133 600.623774 +L 674.149055 597.452188 +L 674.178667 611.695273 +L 674.231967 611.203816 +L 674.255656 600.536586 +L 674.338568 611.354052 +L 674.344491 611.925566 +L 674.356335 605.059705 +L 674.439247 584.829043 +L 674.397791 616.864962 +L 674.492548 588.611113 +L 674.593227 611.419645 +L 674.610994 607.365655 +L 674.616916 607.330615 +L 674.711672 613.632314 +L 674.640605 606.102868 +L 674.735362 611.029129 +L 674.85973 581.554916 +L 674.78274 612.736538 +L 674.895263 585.126981 +L 674.960408 605.582015 +L 675.013709 595.30481 +L 675.049243 581.688147 +L 675.126232 591.645239 +L 675.185455 598.300002 +L 675.143999 587.283533 +L 675.191378 593.504065 +L 675.1973 587.082405 +L 675.220989 601.565962 +L 675.297979 598.068098 +L 675.339435 590.667413 +L 675.32759 606.332083 +L 675.416424 592.806754 +L 675.440114 598.848116 +L 675.440114 598.848116 +" clip-path="url(#p36093098be)" style="fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square"/> </g> <g id="patch_18"> - <path d="M 53.60625 674.918125 -L 53.60625 540.868125 + <path d="M 53.60625 674.198125 +L 53.60625 540.328125 " style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> </g> <g id="patch_19"> - <path d="M 705.265 674.918125 -L 705.265 540.868125 + <path d="M 705.05125 674.198125 +L 705.05125 540.328125 " style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> </g> <g id="patch_20"> - <path d="M 53.60625 674.918125 -L 705.265 674.918125 + <path d="M 53.60625 674.198125 +L 705.05125 674.198125 " style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> </g> <g id="patch_21"> - <path d="M 53.60625 540.868125 -L 705.265 540.868125 + <path d="M 53.60625 540.328125 +L 705.05125 540.328125 " style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> </g> </g> </g> <defs> - <clipPath id="p751bab7541"> - <rect x="53.60625" y="22.318125" width="651.65875" height="134.05"/> + <clipPath id="p50b9393a22"> + <rect x="53.60625" y="22.318125" width="651.445" height="133.87"/> </clipPath> - <clipPath id="pf10296019e"> - <rect x="53.60625" y="195.168125" width="651.65875" height="134.05"/> + <clipPath id="p306958ab09"> + <rect x="53.60625" y="194.988125" width="651.445" height="133.87"/> </clipPath> - <clipPath id="p764d52f6eb"> - <rect x="53.60625" y="368.018125" width="651.65875" height="134.05"/> + <clipPath id="p2de9b4f161"> + <rect x="53.60625" y="367.658125" width="651.445" height="133.87"/> </clipPath> - <clipPath id="p6a334ba20c"> - <rect x="53.60625" y="540.868125" width="651.65875" height="134.05"/> + <clipPath id="p36093098be"> + <rect x="53.60625" y="540.328125" width="651.445" height="133.87"/> </clipPath> </defs> </svg> diff --git a/python/example/plasticity.py b/python/example/plasticity.py index ab57d099a935b349d86a05a741b4502e27da8126..f88ed93128cb299269229729bf738dae9d413dc9 100644 --- a/python/example/plasticity.py +++ b/python/example/plasticity.py @@ -1,4 +1,5 @@ import arbor as A +from arbor import units as U class recipe(A.recipe): @@ -10,7 +11,7 @@ class recipe(A.recipe): self.cells = n # Uniform weights and delays for the connectivity. self.weight = 0.75 - self.delay = 0.1 + self.delay = 0.1 * U.ms # Track the connections from the source cell to a given gid. self.connected = set() @@ -34,7 +35,7 @@ class recipe(A.recipe): def cell_description(self, gid): # Cell 0 is reserved for the spike source, spiking every 0.0125ms. if gid == 0: - return A.spike_source_cell("source", A.regular_schedule(0.0125)) + return A.spike_source_cell("source", A.regular_schedule(12.5 * U.us)) # All cells >= 1 are cable cells w/ a simple, soma-only morphology # comprising two segments of radius r=3um and length l=3um *each*. # @@ -54,7 +55,7 @@ class recipe(A.recipe): # - synapse to receive incoming spikes from the source cell. decor.place("(location 0 0.5)", A.synapse("expsyn"), "synapse") # - detector for reporting spikes on the cable cells. - decor.place("(location 0 0.5)", A.threshold_detector(-10.0), "detector") + decor.place("(location 0 0.5)", A.threshold_detector(-10.0 * U.mV), "detector") # return the cable cell description return A.cable_cell(tree, decor) @@ -92,7 +93,7 @@ rec.add_connection_to_spike_source(1) sim = A.simulation(rec, ctx) sim.record(A.spike_recording.all) # then run the simulation for a bit -sim.run(0.25, 0.025) +sim.run(0.25 * U.ms, 0.025 * U.ms) # update the simulation to # # spike_source <gid=0> ----> cable_cell <gid=1> @@ -101,7 +102,7 @@ sim.run(0.25, 0.025) rec.add_connection_to_spike_source(2) sim.update(rec) # and run the simulation for another bit. -sim.run(0.5, 0.025) +sim.run(0.5 * U.ms, 0.025 * U.ms) # when finished, print spike times and locations. source_spikes = 0 print("Spikes:") diff --git a/python/example/probe_lfpykit.py b/python/example/probe_lfpykit.py index a382b9ef74d11234581e87fcc077c803b5413133..d83b2732d2e2d48161ef7c6bf8e664328ea43f68 100644 --- a/python/example/probe_lfpykit.py +++ b/python/example/probe_lfpykit.py @@ -13,13 +13,15 @@ # import modules import sys import numpy as np -import arbor +import arbor as A +from arbor import units as U import lfpykit import matplotlib.pyplot as plt from matplotlib.collections import PolyCollection +from pathlib import Path -class Recipe(arbor.recipe): +class Recipe(A.recipe): def __init__(self, cell): super().__init__() @@ -29,108 +31,88 @@ class Recipe(arbor.recipe): self.iprobeset_id = (0, 1) self.cprobeset_id = (0, 2) - self.the_props = arbor.neuron_cable_properties() - def num_cells(self): return 1 - def num_sources(self, gid): - return 0 - - def cell_kind(self, gid): - return arbor.cell_kind.cable + def cell_kind(self, _): + return A.cell_kind.cable - def cell_description(self, gid): + def cell_description(self, _): return self.the_cell - def global_properties(self, kind): - return self.the_props + def global_properties(self, _): + return A.neuron_cable_properties() - def probes(self, gid): + def probes(self, _): return [ - arbor.cable_probe_membrane_voltage_cell("Um-all"), - arbor.cable_probe_total_current_cell("Itotal-all"), - arbor.cable_probe_stimulus_current_cell("Istim-all"), + A.cable_probe_membrane_voltage_cell("Um-all"), + A.cable_probe_total_current_cell("Itotal-all"), + A.cable_probe_stimulus_current_cell("Istim-all"), ] # Read the SWC filename from input -# Example from docs: single_cell_detailed.swc -if len(sys.argv) < 2: - print("No SWC file passed to the program") - sys.exit(0) - -filename = sys.argv[1] - -# define morphology (needed for ``arbor.place_pwlin`` and ``arbor.cable_cell`` below) -morphology = arbor.load_swc_arbor(filename) +if len(sys.argv) == 1: + print("No SWC file passed to the program, using default.") + filename = Path(__file__).parent / "single_cell_detailed.swc" +elif len(sys.argv) == 2: + filename = Path(sys.argv[1]) +else: + print("Usage: single_cell_detailed.py [SWC file name]") + sys.exit(1) + +# define morphology (needed for ``A.place_pwlin`` and ``A.cable_cell`` below) +morphology = A.load_swc_arbor(filename) # define a location on morphology for current clamp -clamp_location = arbor.location(4, 1 / 6) - - -def make_cable_cell(morphology, clamp_location): - # number of CVs per branch - cvs_per_branch = 3 - - # Label dictionary - labels = arbor.label_dict() +clamp_location = A.location(4, 1 / 6) + +# define a sinusoid input current +iclamp = A.iclamp( + 5 * U.ms, # stimulation onset + 1e8 * U.ms, # stimulation duration + -0.001 * U.nA, # stimulation amplitude + frequency=100 * U.Hz, # stimulation frequency + phase=0 * U.rad, # stimulation phase +) - # decor - decor = ( - arbor.decor() - # set initial voltage, temperature, axial resistivity, membrane capacitance - .set_property( - Vm=-65, # Initial membrane voltage (mV) - tempK=300, # Temperature (Kelvin) - rL=10000, # Axial resistivity (Ω cm) - cm=0.01, # Membrane capacitance (F/m**2) - ) - # set passive mechanism all over - # passive mech w. leak reversal potential (mV) - .paint("(all)", arbor.density("pas/e=-65", g=0.0001)) +decor = ( + A.decor() + # set initial voltage, temperature, axial resistivity, membrane capacitance + .set_property( + Vm=-65 * U.mV, # Initial membrane voltage (mV) + tempK=300 * U.Kelvin, # Temperature (Kelvin) + rL=10 * U.kOhm * U.cm, # Axial resistivity (Ω cm) + cm=0.01 * U.F / U.m2, # Membrane capacitance (F/m**2) ) + # set passive mech w. leak reversal potential (mV) + .paint("(all)", A.density("pas/e=-65", g=0.0001)) + # attach the stimulus + .place(str(clamp_location), iclamp, "iclamp") + # use a fixed 3 CVs per branch + .discretization(A.cv_policy_fixed_per_branch(3)) +) - # set number of CVs per branch - policy = arbor.cv_policy_fixed_per_branch(cvs_per_branch) - decor.discretization(policy) - - # place sinusoid input current - iclamp = arbor.iclamp( - 5, # stimulation onset (ms) - 1e8, # stimulation duration (ms) - -0.001, # stimulation amplitude (nA) - frequency=0.1, # stimulation frequency (kHz) - phase=0, - ) # stimulation phase) - decor.place(str(clamp_location), iclamp, '"iclamp"') - - # create ``arbor.place_pwlin`` object - p = arbor.place_pwlin(morphology) - - # create cell and set properties - cell = arbor.cable_cell(morphology, decor, labels) - - return p, cell - - -# get place_pwlin and cable_cell objects -p, cell = make_cable_cell(morphology, clamp_location) +# place_pwlin can be queried with region/locset expressions to obtain +# geometrical objects, like points and segments, essentially recovering +# geometry from morphology. +ppwl = A.place_pwlin(morphology) +cell = A.cable_cell(morphology, decor) # instantiate recipe with cell -recipe = Recipe(cell) +rec = Recipe(cell) # instantiate simulation -sim = arbor.simulation(recipe) +sim = A.simulation(rec) # set up sampling on probes with sampling every 1 ms -schedule = arbor.regular_schedule(1.0) +schedule = A.regular_schedule(1.0 * U.ms) v_handle = sim.sample(0, "Um-all", schedule) i_handle = sim.sample(0, "Itotal-all", schedule) c_handle = sim.sample(0, "Istim-all", schedule) # run simulation for 500 ms of simulated activity and collect results. -sim.run(tfinal=500) +sim.run(tfinal=500 * U.ms) # extract time, V_m, I_m and I_c for each CV V_m_samples, V_m_meta = sim.samples(v_handle)[0] @@ -144,8 +126,8 @@ inds = np.array([m.dist != m.prox for m in V_m_meta]) V_m_samples = V_m_samples[:, np.r_[True, inds]] V_m_meta = np.array(V_m_meta)[inds].tolist() -# assert that the remaining cables comprising the metadata for each probe -# are identical, as well as the reported sample times. +# assert that the remaining cables comprising the metadata for each probe are +# identical, as well as the reported sample times. assert V_m_meta == I_m_meta assert (V_m_samples[:, 0] == I_m_samples[:, 0]).all() @@ -169,16 +151,16 @@ I_m = I_c_samples[:, 1:] + I_m_samples[:, 1:] # (nA) class ArborCellGeometry(lfpykit.CellGeometry): """ Class inherited from ``lfpykit.CellGeometry`` for easier forward-model - predictions in Arbor that keeps track of arbor.segment information + predictions in Arbor that keeps track of A.segment information for each CV. Parameters ---------- - p: ``arbor.place_pwlin`` object - 3-d locations and cables in a morphology (cf. ``arbor.place_pwlin``) + p: ``A.place_pwlin`` object + 3-d locations and cables in a morphology (cf. ``A.place_pwlin``) cables: ``list`` - ``list`` of corresponding ``arbor.cable`` objects where transmembrane - currents are recorded (cf. ``arbor.cable_probe_total_current_cell``) + ``list`` of corresponding ``A.cable`` objects where transmembrane + currents are recorded (cf. ``A.cable_probe_total_current_cell``) See also -------- @@ -190,7 +172,7 @@ class ArborCellGeometry(lfpykit.CellGeometry): CV_ind = np.array([], dtype=int) # tracks which CV owns segment for i, m in enumerate(cables): segs = p.segments([m]) - for j, seg in enumerate(segs): + for seg in segs: x = np.row_stack([x, [seg.prox.x, seg.dist.x]]) y = np.row_stack([y, [seg.prox.y, seg.dist.y]]) z = np.row_stack([z, [seg.prox.z, seg.dist.z]]) @@ -253,7 +235,7 @@ class ArborLineSourcePotential(lfpykit.LineSourcePotential): # create ``ArborCellGeometry`` instance -cell_geometry = ArborCellGeometry(p, I_m_meta) +cell_geometry = ArborCellGeometry(ppwl, I_m_meta) # define locations where extracellular potential is predicted in vicinity # of cell. @@ -421,7 +403,7 @@ cb2.set_label(r"$V_m$ (mV)") ax.add_collection(get_segment_outlines(cell_geometry)) # add marker denoting clamp location -point = p.at(clamp_location) +point = ppwl.at(clamp_location) ax.plot(point.x, point.y, "ko", ms=10, label="stimulus") ax.legend() diff --git a/python/example/single_cell_allen.py b/python/example/single_cell_allen.py index df96149279b2c71271364b361d4d81579e663ab0..6daaf09f9131a20df9d098431b72914172fabd04 100644 --- a/python/example/single_cell_allen.py +++ b/python/example/single_cell_allen.py @@ -2,14 +2,19 @@ from collections import defaultdict from dataclasses import dataclass +from typing import Optional import json -import arbor -import seaborn -import pandas +import arbor as A +from arbor import units as U +import seaborn as sns +import pandas as pd import matplotlib.pyplot as plt +from pathlib import Path +here = Path(__file__).parent -# (3) A function that parses the Allen parameter fit file into components for an arbor.decor + +# (3) A function that parses the Allen parameter fit file into components for an A.decor # NB. Needs to be adjusted when using a different model def load_allen_fit(fit): with open(fit) as fd: @@ -18,10 +23,10 @@ def load_allen_fit(fit): # cable parameters convenience class @dataclass class parameters: - cm: float = None - tempK: float = None - Vm: float = None - rL: float = None + cm: Optional[float] = None + tempK: Optional[float] = None + Vm: Optional[float] = None + rL: Optional[float] = None param = defaultdict(parameters) mechs = defaultdict(dict) @@ -71,30 +76,44 @@ def load_allen_fit(fit): return default, regs, ions, mechs, fit["fitting"][0]["junction_potential"] -def make_cell(swc, fit): +def make_cell(base, swc, fit): # (1) Load the swc file passed into this function - morphology = arbor.load_swc_neuron(swc) + morphology = A.load_swc_neuron(base / swc) + # (2) Label the region tags found in the swc with the names used in the parameter fit file. - # In addition, label the midpoint of the somarbor. - labels = arbor.label_dict().add_swc_tags() + # In addition, label the midpoint of the soma. + labels = A.label_dict().add_swc_tags() labels["midpoint"] = "(location 0 0.5)" - # (3) A function that parses the Allen parameter fit file into components for an arbor.decor - dflt, regions, ions, mechanisms, offset = load_allen_fit(fit) + # (3) A function that parses the Allen parameter fit file into components + dflt, regions, ions, mechanisms, offset = load_allen_fit(base / fit) # (4) Instantiate an empty decor. - decor = arbor.decor() + decor = A.decor() + # (5) assign global electro-physiology parameters - decor.set_property(tempK=dflt.tempK, Vm=dflt.Vm, cm=dflt.cm, rL=dflt.rL) + decor.set_property( + tempK=dflt.tempK * U.Kelvin, + Vm=dflt.Vm * U.mV, + cm=dflt.cm * U.F / U.m2, + rL=dflt.rL * U.Ohm * U.cm, + ) + # (6) override regional electro-physiology parameters for region, vs in regions: - decor.paint(f'"{region}"', tempK=vs.tempK, Vm=vs.Vm, cm=vs.cm, rL=vs.rL) + decor.paint( + f'"{region}"', + tempK=vs.tempK * U.Kelvin, + Vm=vs.Vm * U.Vm, + cm=vs.cm * U.F / U.m2, + rL=vs.rL * U.Ohm * U.cm, + ) + # (7) set reversal potentials for region, ion, e in ions: - decor.paint(f'"{region}"', ion_name=ion, rev_pot=e) - decor.set_ion( - "ca", int_con=5e-5, ext_con=2.0, method=arbor.mechanism("nernst/x=ca") - ) + decor.paint(f'"{region}"', ion=ion, rev_pot=e) + decor.set_ion("ca", int_con=5e-5 * U.mM, ext_con=2.0 * U.mM, method="nernst/x=ca") + # (8) assign ion dynamics for region, mech, values in mechanisms: nm = mech @@ -106,58 +125,61 @@ def make_cell(swc, fit): sp = "," else: vs[k] = v - decor.paint(f'"{region}"', arbor.density(arbor.mechanism(nm, vs))) + decor.paint(f'"{region}"', A.density(A.mechanism(nm, vs))) + # (9) attach stimulus and detector - decor.place('"midpoint"', arbor.iclamp(200, 1000, 0.15), "ic") - decor.place('"midpoint"', arbor.threshold_detector(-40), "sd") + decor.place('"midpoint"', A.iclamp(0.2 * U.s, 1 * U.s, 150 * U.pA), "ic") + decor.place('"midpoint"', A.threshold_detector(-40 * U.mV), "sd") + # (10) discretisation strategy: max compartment length - decor.discretization(arbor.cv_policy_max_extent(20)) + decor.discretization(A.cv_policy_max_extent(20)) # (11) Create cell - return arbor.cable_cell(morphology, decor, labels), offset + return A.cable_cell(morphology, decor, labels), offset # (12) Create cell, model -cell, offset = make_cell("single_cell_allen.swc", "single_cell_allen_fit.json") -model = arbor.single_cell_model(cell) +cell, offset = make_cell(here, "single_cell_allen.swc", "single_cell_allen_fit.json") +model = A.single_cell_model(cell) # (13) Set the probe -model.probe("voltage", '"midpoint"', frequency=200) +model.probe("voltage", '"midpoint"', "Um", frequency=1 / (5 * U.us)) # (14) Install the Allen mechanism catalogue. -model.properties.catalogue.extend(arbor.allen_catalogue(), "") +model.properties.catalogue.extend(A.allen_catalogue(), "") # (15) Run simulation -model.run(tfinal=1400, dt=0.005) +model.run(tfinal=1.4 * U.s, dt=5 * U.us) # (16) Load and scale reference reference = ( - 1000.0 * pandas.read_csv("single_cell_allen_neuron_ref.csv")["U/mV"].values[:-1] - + offset + 1e3 * pd.read_csv(here / "single_cell_allen_neuron_ref.csv")["U/mV"] + offset ) # (17) Plot -df_list = [] -df_list.append( - pandas.DataFrame( - { - "t/ms": model.traces[0].time, - "U/mV": model.traces[0].value, - "Simulator": "Arbor", - } - ) -) -df_list.append( - pandas.DataFrame( - {"t/ms": model.traces[0].time, "U/mV": reference, "Simulator": "Neuron"} - ) -) -df = pandas.concat(df_list, ignore_index=True) -seaborn.relplot( - data=df, kind="line", x="t/ms", y="U/mV", hue="Simulator", errorbar=None +df = pd.concat( + [ + pd.DataFrame( + { + "Simulator": "Arbor", + "t/ms": model.traces[0].time, + "U/mV": model.traces[0].value, + } + ), + pd.DataFrame( + { + "Simulator": "Neuron", + "t/ms": model.traces[0].time, + "U/mV": reference.values, + } + ), + ], + ignore_index=True, ) + +sns.relplot(data=df, kind="line", x="t/ms", y="U/mV", hue="Simulator", errorbar=None) plt.scatter( - model.spikes, [-40] * len(model.spikes), color=seaborn.color_palette()[2], zorder=20 + model.spikes, [-40] * len(model.spikes), color=sns.color_palette()[2], zorder=20 ) plt.bar( 200, @@ -168,4 +190,4 @@ plt.bar( label="Stimulus", color="0.9", ) -plt.savefig("single_cell_allen_result.svg") +plt.savefig("single_cell_allen_result.pdf") diff --git a/python/example/single_cell_bluepyopt/l5pc/C060114A7_axon_replacement.acc b/python/example/single_cell_bluepyopt/l5pc/C060114A7_axon_replacement.acc index 9318d73175ed3d4efe0c821b0971a892c4d1afda..ad5cfa7de8fd373c2cb8c88fb961a99203ac2330 100644 --- a/python/example/single_cell_bluepyopt/l5pc/C060114A7_axon_replacement.acc +++ b/python/example/single_cell_bluepyopt/l5pc/C060114A7_axon_replacement.acc @@ -1,6 +1,6 @@ (arbor-component (meta-data - (version "0.1-dev")) + (version "0.9-dev")) (morphology (branch 0 -1 (segment 0 @@ -18,4 +18,4 @@ (segment 3 (point 262.494171 -39.637466 -3.380000 0.460000) (point 262.242889 -54.635361 -3.380000 0.460000) - 2)))) \ No newline at end of file + 2)))) diff --git a/python/example/single_cell_bluepyopt/l5pc/C060114A7_modified.acc b/python/example/single_cell_bluepyopt/l5pc/C060114A7_modified.acc index 0f0910d58e54870073c75ee48e2ce3310a5e3a5b..317282f7d5f4237269bbb3dc3278b931ed2c760c 100644 --- a/python/example/single_cell_bluepyopt/l5pc/C060114A7_modified.acc +++ b/python/example/single_cell_bluepyopt/l5pc/C060114A7_modified.acc @@ -1,6 +1,6 @@ (arbor-component (meta-data - (version "0.1-dev")) + (version "0.9-dev")) (morphology (branch 0 -1 (segment 0 @@ -21699,4 +21699,4 @@ (segment 5374 (point 262.494171 -39.637466 -3.380000 0.460000) (point 262.242889 -54.635361 -3.380000 0.460000) - 2)))) \ No newline at end of file + 2)))) diff --git a/python/example/single_cell_bluepyopt/l5pc/l5pc_decor.acc b/python/example/single_cell_bluepyopt/l5pc/l5pc_decor.acc index 89c7735b8f22ab5ea080d6f51f34752967a65b92..29831b6715db70518dbc6b62f03089141234b781 100644 --- a/python/example/single_cell_bluepyopt/l5pc/l5pc_decor.acc +++ b/python/example/single_cell_bluepyopt/l5pc/l5pc_decor.acc @@ -1,20 +1,20 @@ (arbor-component - (meta-data (version "0.1-dev")) + (meta-data (version "0.9-dev")) (decor - (default (membrane-potential -65)) - (default (temperature-kelvin 307.14999999999998)) - (default (membrane-capacitance 0.01)) - (default (axial-resistivity 100)) + (default (membrane-potential -65 (scalar 1.0))) + (default (temperature-kelvin 307.14999999999998 (scalar 1.0))) + (default (membrane-capacitance 0.01 (scalar 1.0))) + (default (axial-resistivity 100 (scalar 1.0))) (paint (region "all") (density (mechanism "default::pas/e=-75" ("g" 3.0000000000000001e-05)))) - (paint (region "apic") (ion-reversal-potential "na" 50)) - (paint (region "apic") (ion-reversal-potential "k" -85)) - (paint (region "apic") (membrane-capacitance 0.02)) + (paint (region "apic") (ion-reversal-potential "na" 50 (scalar 1.0))) + (paint (region "apic") (ion-reversal-potential "k" -85 (scalar 1.0))) + (paint (region "apic") (membrane-capacitance 0.02 (scalar 1.0))) (paint (region "apic") (density (mechanism "BBP::NaTs2_t" ("gNaTs2_tbar" 0.026145000000000002)))) (paint (region "apic") (density (mechanism "BBP::SKv3_1" ("gSKv3_1bar" 0.0042259999999999997)))) (paint (region "apic") (density (mechanism "BBP::Im" ("gImbar" 0.00014300000000000001)))) (paint (region "apic") (scaled-mechanism (density (mechanism "BBP::Ih" ("gIhbar" 8.0000000000000007e-05))) ("gIhbar" (add (scalar -0.86960000000000004) (mul (scalar 2.0870000000000002) (exp (mul (distance (region "soma")) (scalar 0.0030999999999999999) ) ) ) )))) - (paint (region "axon") (ion-reversal-potential "na" 50)) - (paint (region "axon") (ion-reversal-potential "k" -85)) + (paint (region "axon") (ion-reversal-potential "na" 50 (scalar 1.0))) + (paint (region "axon") (ion-reversal-potential "k" -85 (scalar 1.0))) (paint (region "axon") (density (mechanism "BBP::NaTa_t" ("gNaTa_tbar" 3.1379679999999999)))) (paint (region "axon") (density (mechanism "BBP::Nap_Et2" ("gNap_Et2bar" 0.0068269999999999997)))) (paint (region "axon") (density (mechanism "BBP::K_Pst" ("gK_Pstbar" 0.97353800000000001)))) @@ -24,14 +24,14 @@ (paint (region "axon") (density (mechanism "BBP::Ca_HVA" ("gCa_HVAbar" 0.00098999999999999999)))) (paint (region "axon") (density (mechanism "BBP::Ca_LVAst" ("gCa_LVAstbar" 0.0087519999999999994)))) (paint (region "axon") (density (mechanism "BBP::CaDynamics_E2" ("gamma" 0.0029099999999999998) ("decay" 287.19873100000001)))) - (paint (region "dend") (membrane-capacitance 0.02)) + (paint (region "dend") (membrane-capacitance 0.02 (scalar 1.0))) (paint (region "dend") (density (mechanism "BBP::Ih" ("gIhbar" 8.0000000000000007e-05)))) - (paint (region "soma") (ion-reversal-potential "na" 50)) - (paint (region "soma") (ion-reversal-potential "k" -85)) + (paint (region "soma") (ion-reversal-potential "na" 50 (scalar 1.0))) + (paint (region "soma") (ion-reversal-potential "k" -85 (scalar 1.0))) (paint (region "soma") (density (mechanism "BBP::NaTs2_t" ("gNaTs2_tbar" 0.98395500000000002)))) (paint (region "soma") (density (mechanism "BBP::SKv3_1" ("gSKv3_1bar" 0.30347200000000002)))) (paint (region "soma") (density (mechanism "BBP::SK_E2" ("gSK_E2bar" 0.0084069999999999995)))) (paint (region "soma") (density (mechanism "BBP::Ca_HVA" ("gCa_HVAbar" 0.00099400000000000009)))) (paint (region "soma") (density (mechanism "BBP::Ca_LVAst" ("gCa_LVAstbar" 0.00033300000000000002)))) (paint (region "soma") (density (mechanism "BBP::CaDynamics_E2" ("gamma" 0.00060899999999999995) ("decay" 210.48528400000001)))) - (paint (region "soma") (density (mechanism "BBP::Ih" ("gIhbar" 8.0000000000000007e-05)))))) \ No newline at end of file + (paint (region "soma") (density (mechanism "BBP::Ih" ("gIhbar" 8.0000000000000007e-05)))))) diff --git a/python/example/single_cell_bluepyopt/l5pc/l5pc_label_dict.acc b/python/example/single_cell_bluepyopt/l5pc/l5pc_label_dict.acc index 08c4efd5da155296ad37754a23f78492469ceb3a..c15ec60578c47a1e7291b70cf936dc9163d22c02 100644 --- a/python/example/single_cell_bluepyopt/l5pc/l5pc_label_dict.acc +++ b/python/example/single_cell_bluepyopt/l5pc/l5pc_label_dict.acc @@ -1,9 +1,9 @@ (arbor-component - (meta-data (version "0.1-dev")) + (meta-data (version "0.9-dev")) (label-dict (region-def "all" (all)) (region-def "apic" (tag 4)) (region-def "axon" (tag 2)) (region-def "dend" (tag 3)) (region-def "soma" (tag 1)) - (region-def "myelin" (tag 5)))) \ No newline at end of file + (region-def "myelin" (tag 5)))) diff --git a/python/example/single_cell_bluepyopt/simplecell/simple_cell_decor.acc b/python/example/single_cell_bluepyopt/simplecell/simple_cell_decor.acc index e5af159ce8a8ea84d4ef33ec0196b7ea9b476b04..c46b2578efde4be85407816ac6b307ceee78fa11 100644 --- a/python/example/single_cell_bluepyopt/simplecell/simple_cell_decor.acc +++ b/python/example/single_cell_bluepyopt/simplecell/simple_cell_decor.acc @@ -1,5 +1,5 @@ (arbor-component - (meta-data (version "0.1-dev")) + (meta-data (version "0.9-dev")) (decor - (paint (region "soma") (membrane-capacitance 0.01)) - (paint (region "soma") (density (mechanism "default::hh" ("gnabar" 0.10299326453483033) ("gkbar" 0.027124836082684685)))))) \ No newline at end of file + (paint (region "soma") (membrane-capacitance 0.01 (scalar 1))) + (paint (region "soma") (density (mechanism "default::hh" ("gnabar" 0.10299326453483033) ("gkbar" 0.027124836082684685)))))) diff --git a/python/example/single_cell_bluepyopt/simplecell/simple_cell_label_dict.acc b/python/example/single_cell_bluepyopt/simplecell/simple_cell_label_dict.acc index 08c4efd5da155296ad37754a23f78492469ceb3a..c15ec60578c47a1e7291b70cf936dc9163d22c02 100644 --- a/python/example/single_cell_bluepyopt/simplecell/simple_cell_label_dict.acc +++ b/python/example/single_cell_bluepyopt/simplecell/simple_cell_label_dict.acc @@ -1,9 +1,9 @@ (arbor-component - (meta-data (version "0.1-dev")) + (meta-data (version "0.9-dev")) (label-dict (region-def "all" (all)) (region-def "apic" (tag 4)) (region-def "axon" (tag 2)) (region-def "dend" (tag 3)) (region-def "soma" (tag 1)) - (region-def "myelin" (tag 5)))) \ No newline at end of file + (region-def "myelin" (tag 5)))) diff --git a/python/example/single_cell_cable.py b/python/example/single_cell_cable.py index dc3f525e1d5ba69904c3fbde7103e443dc45fc37..fc6cceb156f58282735b6b89ca344b990b2ebc2f 100755 --- a/python/example/single_cell_cable.py +++ b/python/example/single_cell_cable.py @@ -1,14 +1,15 @@ #!/usr/bin/env python3 -import arbor +import arbor as A +from arbor import units as U import argparse import numpy as np -import pandas -import seaborn # You may have to pip install these. +import pandas as pd +import seaborn as sns # You may have to pip install these. -class Cable(arbor.recipe): +class Cable(A.recipe): def __init__( self, probes, @@ -40,7 +41,7 @@ class Cable(arbor.recipe): cv_policy_max_extent -- maximum extent of control volume in μm """ - arbor.recipe.__init__(self) + A.recipe.__init__(self) self.the_probes = probes @@ -51,25 +52,19 @@ class Cable(arbor.recipe): self.rL = rL self.g = g - self.stimulus_start = stimulus_start - self.stimulus_duration = stimulus_duration - self.stimulus_amplitude = stimulus_amplitude + self.stimulus_start = stimulus_start * U.ms + self.stimulus_duration = stimulus_duration * U.ms + self.stimulus_amplitude = stimulus_amplitude * U.nA self.cv_policy_max_extent = cv_policy_max_extent - self.the_props = arbor.neuron_cable_properties() + self.the_props = A.neuron_cable_properties() def num_cells(self): return 1 - def num_sources(self, _): - return 0 - def cell_kind(self, _): - return arbor.cell_kind.cable - - def probes(self, _): - return self.the_probes + return A.cell_kind.cable def global_properties(self, _): return self.the_props @@ -81,34 +76,39 @@ class Cable(arbor.recipe): to build a multi-compartment neuron. """ - tree = arbor.segment_tree() + tree = A.segment_tree() tree.append( - arbor.mnpos, - arbor.mpoint(0, 0, 0, self.radius), - arbor.mpoint(self.length, 0, 0, self.radius), + A.mnpos, + (0, 0, 0, self.radius), + (self.length, 0, 0, self.radius), tag=1, ) - labels = arbor.label_dict({"cable": "(tag 1)", "start": "(location 0 0)"}) + labels = A.label_dict({"cable": "(tag 1)", "start": "(location 0 0)"}) decor = ( - arbor.decor() - .set_property(Vm=self.Vm, cm=self.cm, rL=self.rL) - .paint('"cable"', arbor.density(f"pas/e={self.Vm}", g=self.g)) + A.decor() + .set_property( + Vm=self.Vm * U.mV, cm=self.cm * U.F / U.m2, rL=self.rL * U.Ohm * U.cm + ) + .paint('"cable"', A.density(f"pas/e={self.Vm}", g=self.g)) .place( '"start"', - arbor.iclamp( + A.iclamp( self.stimulus_start, self.stimulus_duration, self.stimulus_amplitude ), "iclamp", ) ) - policy = arbor.cv_policy_max_extent(self.cv_policy_max_extent) + policy = A.cv_policy_max_extent(self.cv_policy_max_extent) decor.discretization(policy) - return arbor.cable_cell(tree, decor, labels) + return A.cable_cell(tree, decor, labels) + + def probes(self, _): + return self.the_probes def get_rm(g): @@ -196,34 +196,32 @@ if __name__ == "__main__": probe_locations = [ (f"(location 0 {r})", f"Um-(0, {r})") for r in np.linspace(0, 1, 11) ] - probes = [ - arbor.cable_probe_membrane_voltage(loc, tag) for loc, tag in probe_locations - ] + probes = [A.cable_probe_membrane_voltage(loc, tag) for loc, tag in probe_locations] recipe = Cable(probes, **vars(args)) # configure the simulation and handles for the probes - sim = arbor.simulation(recipe) - dt = 0.001 + sim = A.simulation(recipe) + dt = 1 * U.us handles = [ - sim.sample((0, tag), arbor.regular_schedule(dt)) for _, tag in probe_locations + sim.sample((0, tag), A.regular_schedule(dt)) for _, tag in probe_locations ] # run the simulation for 30 ms - sim.run(tfinal=30, dt=dt) + sim.run(tfinal=30 * U.ms, dt=dt) - # retrieve the sampled membrane voltages and convert to a pandas DataFrame + # retrieve the sampled membrane voltages and convert to a pd DataFrame print("Plotting results ...") df_list = [] for probe in range(len(handles)): samples, meta = sim.samples(handles[probe])[0] df_list.append( - pandas.DataFrame( + pd.DataFrame( {"t/ms": samples[:, 0], "U/mV": samples[:, 1], "Probe": f"{probe}"} ) ) - df = pandas.concat(df_list, ignore_index=True) - seaborn.relplot( + df = pd.concat(df_list, ignore_index=True) + sns.relplot( data=df, kind="line", x="t/ms", y="U/mV", hue="Probe", errorbar=None ).set(xlim=(9, 14)).savefig("single_cell_cable_result.svg") diff --git a/python/example/single_cell_detailed.py b/python/example/single_cell_detailed.py index 1c3d7312bca825c01747f8f192a4f3d83738cdc9..b58e2f924ac8e2f7fda811af511267e8b4fd3e6f 100755 --- a/python/example/single_cell_detailed.py +++ b/python/example/single_cell_detailed.py @@ -1,28 +1,28 @@ #!/usr/bin/env python3 # This script is included in documentation. Adapt line numbers if touched. -import arbor -import pandas -import seaborn +import arbor as A +from arbor import units as U +import pandas as pd +import seaborn as sns import sys -from arbor import density +from pathlib import Path # (1) Read the morphology from an SWC file. +if len(sys.argv) == 1: + print("No SWC file passed to the program, using default.") + filename = Path(__file__).parent / "single_cell_detailed.swc" +elif len(sys.argv) == 2: + filename = Path(sys.argv[1]) +else: + print("Usage: single_cell_detailed.py [SWC file name]") + sys.exit(1) -# Read the SWC filename from input -# Example from docs: single_cell_detailed.swc -if len(sys.argv) < 2: - print("No SWC file passed to the program") - sys.exit(0) - -filename = sys.argv[1] -morph = arbor.load_swc_arbor(filename) +morph = A.load_swc_arbor(filename) # (2) Create and populate the label dictionary. - - -labels = arbor.label_dict( +labels = A.label_dict( { # Regions: # Add a label for a region that includes the whole morphology @@ -43,70 +43,78 @@ labels = arbor.label_dict( ).add_swc_tags() # (3) Create and populate the decor. -# NB. This can be written more compactly using method chaining - -decor = arbor.decor() -# Set the default properties of the cell (this overrides the model defaults). -decor.set_property(Vm=-55) -decor.set_ion("na", int_con=10, ext_con=140, rev_pot=50, method="nernst/na") -decor.set_ion("k", int_con=54.4, ext_con=2.5, rev_pot=-77) -# Override the cell defaults. -decor.paint('"custom"', tempK=270) -decor.paint('"soma"', Vm=-50) -# Paint density mechanisms. -decor.paint('"all"', density("pas")) -decor.paint('"custom"', density("hh")) -decor.paint('"dend"', density("Ih", gbar=0.001)) -# Place stimuli and detectors. -decor.place('"root"', arbor.iclamp(10, 1, current=2), "iclamp0") -decor.place('"root"', arbor.iclamp(30, 1, current=2), "iclamp1") -decor.place('"root"', arbor.iclamp(50, 1, current=2), "iclamp2") -decor.place('"axon_terminal"', arbor.threshold_detector(-10), "detector") -# Set discretisation: Soma as one CV, 1um everywhere else -decor.discretization('(replace (single (region "soma")) (max-extent 1.0))') +decor = ( + A.decor() + # Set the default properties of the cell (this overrides the model defaults). + .set_property( + Vm=-55 * U.mV, + tempK=300 * U.Kelvin, + rL=35.4 * U.Ohm * U.cm, + cm=0.01 * U.F / U.m2, + ) + .set_ion( + "na", + int_con=10 * U.mM, + ext_con=140 * U.mM, + rev_pot=50 * U.mV, + method="nernst/na", + ) + .set_ion("k", int_con=54.4 * U.mM, ext_con=2.5 * U.mM, rev_pot=-77 * U.mV) + # Override the cell defaults. + .paint('"custom"', tempK=270 * U.Kelvin) + .paint('"soma"', Vm=-50 * U.mV) + # Paint density mechanisms. + .paint('"all"', A.density("pas")) + .paint('"custom"', A.density("hh")) + .paint('"dend"', A.density("Ih", gbar=0.001)) + # Place stimuli and detectors. + .place('"root"', A.iclamp(10 * U.ms, 1 * U.ms, current=2 * U.nA), "iclamp0") + .place('"root"', A.iclamp(30 * U.ms, 1 * U.ms, current=2 * U.nA), "iclamp1") + .place('"root"', A.iclamp(50 * U.ms, 1 * U.ms, current=2 * U.nA), "iclamp2") + .place('"axon_terminal"', A.threshold_detector(-10 * U.mV), "detector") + # Set discretisation: Soma as one CV, 1um everywhere else + .discretization('(replace (single (region "soma")) (max-extent 1.0))') +) # (4) Create the cell. - -cell = arbor.cable_cell(morph, decor, labels) +cell = A.cable_cell(morph, decor, labels) # (5) Construct the model - -model = arbor.single_cell_model(cell) +model = A.single_cell_model(cell) # (6) Set the model default properties - -model.properties.set_property(Vm=-65, tempK=300, rL=35.4, cm=0.01) -model.properties.set_ion("na", int_con=10, ext_con=140, rev_pot=50, method="nernst/na") -model.properties.set_ion("k", int_con=54.4, ext_con=2.5, rev_pot=-77) - -# Extend the default catalogue with the Allen catalogue. -# The function takes a second string parameter that can prefix -# the name of the mechanisms to avoid collisions between catalogues -# in this case we have no collisions so we use an empty prefix string. -model.properties.catalogue.extend(arbor.allen_catalogue(), "") +model.properties.set_property( + Vm=-65 * U.mV, tempK=300 * U.Kelvin, rL=35.4 * U.Ohm * U.cm, cm=0.01 * U.F / U.m2 +) +model.properties.set_ion( + "na", int_con=10 * U.mM, ext_con=140 * U.mM, rev_pot=50 * U.mV, method="nernst/na" +) +model.properties.set_ion( + "k", int_con=54.4 * U.mM, ext_con=2.5 * U.mM, rev_pot=-77 * U.mV +) + +# Extend the default catalogue with the Allen catalogue. The function takes a +# second string parameter that can prefix the name of the mechanisms to avoid +# collisions between catalogues in this case we have no collisions so we use an +# empty prefix string. +model.properties.catalogue.extend(A.allen_catalogue(), "") # (7) Add probes. - -# Add voltage probes on the "custom_terminal" locset -# which sample the voltage at 50 kHz -model.probe("voltage", where='"custom_terminal"', tag="Um", frequency=50) +# Add a voltage probe on "custom_terminal" +model.probe("voltage", where='"custom_terminal"', tag="Um", frequency=50 * U.kHz) # (8) Run the simulation for 100 ms, with a dt of 0.025 ms - -model.run(tfinal=100, dt=0.025) +model.run(tfinal=100 * U.ms, dt=25 * U.us) # (9) Print the spikes. - print(len(model.spikes), "spikes recorded:") for s in model.spikes: - print(s) + print(f" * t={s:.3f} ms") # (10) Plot the voltages - -df_list = [] -for t in model.traces: - df_list.append( - pandas.DataFrame( +df = pd.concat( + [ + pd.DataFrame( { "t/ms": t.time, "U/mV": t.value, @@ -114,9 +122,12 @@ for t in model.traces: "Variable": t.variable, } ) - ) -df = pandas.concat(df_list, ignore_index=True) -seaborn.relplot( + for t in model.traces + ], + ignore_index=True, +) + +sns.relplot( data=df, kind="line", x="t/ms", diff --git a/python/example/single_cell_detailed_recipe.py b/python/example/single_cell_detailed_recipe.py index c68d192dbfe1f479886b50f593cc4c555aa9c819..5d28457e98283c5530521e6a634662a29ac0aee3 100644 --- a/python/example/single_cell_detailed_recipe.py +++ b/python/example/single_cell_detailed_recipe.py @@ -1,27 +1,27 @@ #!/usr/bin/env python3 # This script is included in documentation. Adapt line numbers if touched. -import arbor -import pandas -import seaborn +import arbor as A +from arbor import units as U +import pandas as pd +import seaborn as sns import sys -from arbor import density +from pathlib import Path # (1) Read the morphology from an SWC file. +if len(sys.argv) == 1: + print("No SWC file passed to the program, using default.") + filename = Path(__file__).parent / "single_cell_detailed.swc" +elif len(sys.argv) == 2: + filename = Path(sys.argv[1]) +else: + print("Usage: single_cell_detailed.py [SWC file name]") + sys.exit(1) -# Read the SWC filename from input -# Example from docs: single_cell_detailed.swc - -if len(sys.argv) < 2: - print("No SWC file passed to the program") - sys.exit(0) - -filename = sys.argv[1] -morph = arbor.load_swc_arbor(filename) +morph = A.load_swc_arbor(filename) # (2) Create and populate the label dictionary. - -labels = arbor.label_dict( +labels = A.label_dict( { # Regions: # Add a label for a region that includes the whole morphology @@ -42,51 +42,68 @@ labels = arbor.label_dict( ).add_swc_tags() # Add SWC pre-defined regions # (3) Create and populate the decor. - decor = ( - arbor.decor() + A.decor() # Set the default properties of the cell (this overrides the model defaults). - .set_property(Vm=-55) - .set_ion("na", int_con=10, ext_con=140, rev_pot=50, method="nernst/na") - .set_ion("k", int_con=54.4, ext_con=2.5, rev_pot=-77) + .set_property(Vm=-55 * U.mV) + .set_ion( + "na", + int_con=10 * U.mM, + ext_con=140 * U.mM, + rev_pot=50 * U.mV, + method="nernst/na", + ) + .set_ion("k", int_con=54.4 * U.mM, ext_con=2.5 * U.mM, rev_pot=-77 * U.mV) # Override the cell defaults. - .paint('"custom"', tempK=270) - .paint('"soma"', Vm=-50) + .paint('"custom"', tempK=270 * U.Kelvin) + .paint('"soma"', Vm=-50 * U.mV) # Paint density mechanisms. - .paint('"all"', density("pas")) - .paint('"custom"', density("hh")) - .paint('"dend"', density("Ih", gbar=0.001)) + .paint('"all"', A.density("pas")) + .paint('"custom"', A.density("hh")) + .paint('"dend"', A.density("Ih", gbar=0.001)) # Place stimuli and detectors. - .place('"root"', arbor.iclamp(10, 1, current=2), "iclamp0") - .place('"root"', arbor.iclamp(30, 1, current=2), "iclamp1") - .place('"root"', arbor.iclamp(50, 1, current=2), "iclamp2") - .place('"axon_terminal"', arbor.threshold_detector(-10), "detector") + .place('"root"', A.iclamp(10 * U.ms, 1 * U.ms, current=2 * U.nA), "iclamp0") + .place('"root"', A.iclamp(30 * U.ms, 1 * U.ms, current=2 * U.nA), "iclamp1") + .place('"root"', A.iclamp(50 * U.ms, 1 * U.ms, current=2 * U.nA), "iclamp2") + .place('"axon_terminal"', A.threshold_detector(-10 * U.mV), "detector") # Set discretisation: Soma as one CV, 1um everywhere else .discretization('(replace (single (region "soma")) (max-extent 1.0))') ) # (4) Create the cell. - -cell = arbor.cable_cell(morph, decor, labels) +cell = A.cable_cell(morph, decor, labels) -# (5) Create a class that inherits from arbor.recipe -class single_recipe(arbor.recipe): +# (5) Create a class that inherits from A.recipe +class single_recipe(A.recipe): # (5.1) Define the class constructor def __init__(self): # The base C++ class constructor must be called first, to ensure that # all memory in the C++ class is initialized correctly. - arbor.recipe.__init__(self) - - self.the_props = arbor.cable_global_properties() - self.the_props.set_property(Vm=-65, tempK=300, rL=35.4, cm=0.01) + A.recipe.__init__(self) + + self.the_props = A.cable_global_properties() + self.the_props.set_property( + Vm=-65 * U.mV, + tempK=300 * U.Kelvin, + rL=35.4 * U.Ohm * U.cm, + cm=0.01 * U.F / U.m2, + ) self.the_props.set_ion( - ion="na", int_con=10, ext_con=140, rev_pot=50, method="nernst/na" + ion="na", + int_con=10 * U.mM, + ext_con=140 * U.mM, + rev_pot=50 * U.mV, + method="nernst/na", ) - self.the_props.set_ion(ion="k", int_con=54.4, ext_con=2.5, rev_pot=-77) - self.the_props.set_ion(ion="ca", int_con=5e-5, ext_con=2, rev_pot=132.5) - self.the_props.catalogue.extend(arbor.allen_catalogue(), "") + self.the_props.set_ion( + ion="k", int_con=54.4 * U.mM, ext_con=2.5 * U.mM, rev_pot=-77 * U.mV + ) + self.the_props.set_ion( + ion="ca", int_con=5e-5 * U.mM, ext_con=2 * U.mM, rev_pot=132.5 * U.mV + ) + self.the_props.catalogue.extend(A.allen_catalogue(), "") # (5.2) Override the num_cells method def num_cells(self): @@ -94,7 +111,7 @@ class single_recipe(arbor.recipe): # (5.3) Override the cell_kind method def cell_kind(self, _): - return arbor.cell_kind.cable + return A.cell_kind.cable # (5.4) Override the cell_description method def cell_description(self, _): @@ -102,10 +119,10 @@ class single_recipe(arbor.recipe): # (5.5) Override the probes method def probes(self, _): - return [arbor.cable_probe_membrane_voltage('"custom_terminal"', "Um")] + return [A.cable_probe_membrane_voltage('"custom_terminal"', "Um")] # (5.6) Override the global_properties method - def global_properties(self, gid): + def global_properties(self, _): return self.the_props @@ -113,42 +130,39 @@ class single_recipe(arbor.recipe): recipe = single_recipe() # (6) Create a simulation -sim = arbor.simulation(recipe) +sim = A.simulation(recipe) # Instruct the simulation to record the spikes and sample the probe -sim.record(arbor.spike_recording.all) +sim.record(A.spike_recording.all) -handle = sim.sample((0, "Um"), arbor.regular_schedule(0.02)) +handle = sim.sample((0, "Um"), A.regular_schedule(0.02 * U.ms)) # (7) Run the simulation -sim.run(tfinal=100, dt=0.025) +sim.run(tfinal=100 * U.ms, dt=0.025 * U.ms) -# (8) Print or display the results +# (8) Print spikes spikes = sim.spikes() print(len(spikes), "spikes recorded:") -for s in spikes: - print(s) - -data = [] -meta = [] -for d, m in sim.samples(handle): - data.append(d) - meta.append(m) - -df_list = [] -for i in range(len(data)): - df_list.append( - pandas.DataFrame( +for (gid, lid), t in spikes: + print(f" * t={t:.3f}ms gid={gid} lid={lid}") + +# (8) Plot the membrane potential +df = pd.concat( + [ + pd.DataFrame( { - "t/ms": data[i][:, 0], - "U/mV": data[i][:, 1], - "Location": str(meta[i]), + "t/ms": data[:, 0], + "U/mV": data[:, 1], + "Location": str(meta), "Variable": "voltage", } ) - ) -df = pandas.concat(df_list, ignore_index=True) -seaborn.relplot( + for data, meta in sim.samples(handle) + ], + ignore_index=True, +) + +sns.relplot( data=df, kind="line", x="t/ms", diff --git a/python/example/single_cell_model.py b/python/example/single_cell_model.py index c744738d73923a5c53af1bbb44af7509af23fca8..9903494cee6749255b24289bfe98d364b6ec1919 100755 --- a/python/example/single_cell_model.py +++ b/python/example/single_cell_model.py @@ -1,52 +1,49 @@ #!/usr/bin/env python3 # This script is included in documentation. Adapt line numbers if touched. -import arbor -import pandas # You may have to pip install these. -import seaborn # You may have to pip install these. +import arbor as A +from arbor import units as U +import pandas as pd # You may have to pip install these. +import seaborn as sns # You may have to pip install these. # (1) Create a morphology with a single (cylindrical) segment of length=diameter=6 μm -tree = arbor.segment_tree() -tree.append(arbor.mnpos, arbor.mpoint(-3, 0, 0, 3), arbor.mpoint(3, 0, 0, 3), tag=1) +tree = A.segment_tree() +tree.append(A.mnpos, A.mpoint(-3, 0, 0, 3), A.mpoint(3, 0, 0, 3), tag=1) # (2) Define the soma and its midpoint -labels = arbor.label_dict({"soma": "(tag 1)", "midpoint": "(location 0 0.5)"}) +labels = A.label_dict({"soma": "(tag 1)", "midpoint": "(location 0 0.5)"}) # (3) Create and set up a decor object - decor = ( - arbor.decor() - .set_property(Vm=-40) - .paint('"soma"', arbor.density("hh")) - .place('"midpoint"', arbor.iclamp(10, 2, 0.8), "iclamp") - .place('"midpoint"', arbor.threshold_detector(-10), "detector") + A.decor() + .set_property(Vm=-40 * U.mV) + .paint('"soma"', A.density("hh")) + .place('"midpoint"', A.iclamp(10 * U.ms, 2 * U.ms, 0.8 * U.nA), "iclamp") + .place('"midpoint"', A.threshold_detector(-10 * U.mV), "detector") ) # (4) Create cell and the single cell model based on it -cell = arbor.cable_cell(tree, decor, labels) +cell = A.cable_cell(tree, decor, labels) # (5) Make single cell model. -m = arbor.single_cell_model(cell) +m = A.single_cell_model(cell) # (6) Attach voltage probe sampling at 10 kHz (every 0.1 ms). -m.probe("voltage", '"midpoint"', tag="Um", frequency=10) +m.probe("voltage", '"midpoint"', tag="Um", frequency=10 * U.kHz) # (7) Run simulation for 30 ms of simulated activity. -m.run(tfinal=30) +m.run(tfinal=30 * U.ms) # (8) Print spike times. -if len(m.spikes) > 0: - print("{} spikes:".format(len(m.spikes))) - for s in m.spikes: - print("{:3.3f}".format(s)) -else: - print("no spikes") +print("{} spikes:".format(len(m.spikes))) +for s in m.spikes: + print(f" * {s:3.3f} ms") # (9) Plot the recorded voltages over time. print("Plotting results ...") -seaborn.set_theme() # Apply some styling to the plot -df = pandas.DataFrame({"t/ms": m.traces[0].time, "U/mV": m.traces[0].value}) -seaborn.relplot(data=df, kind="line", x="t/ms", y="U/mV", errorbar=None).savefig( +sns.set_theme() # Apply some styling to the plot +df = pd.DataFrame({"t/ms": m.traces[0].time, "U/mV": m.traces[0].value}) +sns.relplot(data=df, kind="line", x="t/ms", y="U/mV", errorbar=None).savefig( "single_cell_model_result.svg" ) diff --git a/python/example/single_cell_nml.py b/python/example/single_cell_nml.py index adbdb268a61ae1d9b7ba1f9922428a23338181e5..c6ea8169390b54ef6e61b1d495bc50cbd8ce7ce1 100755 --- a/python/example/single_cell_nml.py +++ b/python/example/single_cell_nml.py @@ -1,8 +1,8 @@ #!/usr/bin/env python3 -import arbor -from arbor import mechanism as mech -import pandas -import seaborn +import arbor as A +from arbor import units as U +import pandas as pd +import seaborn as sns import sys # Load a cell morphology from an nml file. @@ -14,7 +14,7 @@ if len(sys.argv) < 2: filename = sys.argv[1] # Read the NeuroML morphology from the file. -morpho_nml = arbor.neuroml(filename) +morpho_nml = A.neuroml(filename) # Read the morphology data associated with morphology "m1". morpho_data = morpho_nml.morphology("m1") @@ -28,7 +28,7 @@ morpho_named = morpho_data.named_segments() morpho_groups = morpho_data.groups() # Create new label dict with some locsets. -labels = arbor.label_dict( +labels = A.label_dict( { "stim_site": "(location 1 0.5)", # site for the stimulus, in the middle of branch 1. "axon_end": '(restrict-to (terminal) (region "axon"))', # end of the axon. @@ -45,52 +45,51 @@ print("Label dictionary regions: ", labels.regions, "\n") print("Label dictionary locsets: ", labels.locsets, "\n") decor = ( - arbor.decor() + A.decor() # Set initial membrane potential to -55 mV - .set_property(Vm=-55) + .set_property(Vm=-55 * U.mV) # Use Nernst to calculate reversal potential for calcium. - .set_ion("ca", method=mech("nernst/x=ca")) + .set_ion("ca", method="nernst/x=ca") # hh mechanism on the soma and axon. - .paint('"soma"', arbor.density("hh")) - .paint('"axon"', arbor.density("hh")) + .paint('"soma"', A.density("hh")) + .paint('"axon"', A.density("hh")) # pas mechanism the dendrites. - .paint('"dend"', arbor.density("pas")) + .paint('"dend"', A.density("pas")) # Increase resistivity on dendrites. - .paint('"dend"', rL=500) + .paint('"dend"', rL=500 * U.Ohm * U.cm) # Attach stimuli that inject 4 nA current for 1 ms, starting at 3 and 8 ms. - .place('"root"', arbor.iclamp(10, 1, current=5), "iclamp0") - .place('"stim_site"', arbor.iclamp(3, 1, current=0.5), "iclamp1") - .place('"stim_site"', arbor.iclamp(10, 1, current=0.5), "iclamp2") - .place('"stim_site"', arbor.iclamp(8, 1, current=4), "iclamp3") + .place('"root"', A.iclamp(10 * U.ms, 1 * U.ms, current=5 * U.nA), "iclamp0") + .place('"stim_site"', A.iclamp(3 * U.ms, 1 * U.ms, current=0.5 * U.nA), "iclamp1") + .place('"stim_site"', A.iclamp(10 * U.ms, 1 * U.ms, current=0.5 * U.nA), "iclamp2") + .place('"stim_site"', A.iclamp(8 * U.ms, 1 * U.ms, current=4 * U.nA), "iclamp3") # Detect spikes at the soma with a voltage threshold of -10 mV. - .place('"axon_end"', arbor.threshold_detector(-10), "detector") + .place('"axon_end"', A.threshold_detector(-10 * U.mV), "detector") # Set discretisation: Soma as one CV, 1um everywhere else .discretization('(replace (single (region "soma")) (max-extent 1.0))') ) # Combine morphology with region and locset definitions to make a cable cell. -cell = arbor.cable_cell(morpho, decor, labels) +cell = A.cable_cell(morpho, decor, labels) print(cell.locations('"axon_end"')) # Make single cell model. -m = arbor.single_cell_model(cell) +m = A.single_cell_model(cell) # Attach voltage probes that sample at 50 kHz. -m.probe("voltage", where='"root"', tag="Um-root", frequency=50) -m.probe("voltage", where='"stim_site"', tag="Um-stim", frequency=50) -m.probe("voltage", where='"axon_end"', tag="Um-axon", frequency=50) +m.probe("voltage", where='"root"', tag="Um-root", frequency=50 * U.kHz) +m.probe("voltage", where='"stim_site"', tag="Um-stim", frequency=50 * U.kHz) +m.probe("voltage", where='"axon_end"', tag="Um-axon", frequency=50 * U.kHz) # Simulate the cell for 15 ms. -tfinal = 15 -m.run(tfinal) +m.run(15 * U.ms) print("Simulation done.") # Print spike times. if len(m.spikes) > 0: print("{} spikes:".format(len(m.spikes))) for s in m.spikes: - print(" {:7.4f}".format(s)) + print(f" {s:7.4f} ms") else: print("no spikes") @@ -99,7 +98,7 @@ print("Plotting results ...") df_list = [] for t in m.traces: df_list.append( - pandas.DataFrame( + pd.DataFrame( { "t/ms": t.time, "U/mV": t.value, @@ -109,9 +108,9 @@ for t in m.traces: ) ) -df = pandas.concat(df_list, ignore_index=True) +df = pd.concat(df_list, ignore_index=True) -seaborn.relplot( +sns.relplot( data=df, kind="line", x="t/ms", diff --git a/python/example/single_cell_recipe.py b/python/example/single_cell_recipe.py index 9ebc1c01e5db9ddbd8bfca4bd9c11fd3c31137c2..dba7f3a29b7106c4e11ac78b42ea6b145019d89e 100644 --- a/python/example/single_cell_recipe.py +++ b/python/example/single_cell_recipe.py @@ -1,44 +1,40 @@ #!/usr/bin/env python3 # This script is included in documentation. Adapt line numbers if touched. -import arbor -import pandas # You may have to pip install these. -import seaborn # You may have to pip install these. +import arbor as A +from arbor import units as U +import pandas as pd # You may have to pip install these. +import seaborn as sns # You may have to pip install these. # The corresponding generic recipe version of `single_cell_model.py`. # (1) Create a morphology with a single (cylindrical) segment of length=diameter=6 μm - -tree = arbor.segment_tree() -tree.append(arbor.mnpos, arbor.mpoint(-3, 0, 0, 3), arbor.mpoint(3, 0, 0, 3), tag=1) +tree = A.segment_tree() +tree.append(A.mnpos, A.mpoint(-3, 0, 0, 3), A.mpoint(3, 0, 0, 3), tag=1) # (2) Define the soma and its midpoint - -labels = arbor.label_dict({"soma": "(tag 1)", "midpoint": "(location 0 0.5)"}) +labels = A.label_dict({"soma": "(tag 1)", "midpoint": "(location 0 0.5)"}) # (3) Create cell and set properties - decor = ( - arbor.decor() - .set_property(Vm=-40) - .paint('"soma"', arbor.density("hh")) - .place('"midpoint"', arbor.iclamp(10, 2, 0.8), "iclamp") - .place('"midpoint"', arbor.threshold_detector(-10), "detector") + A.decor() + .set_property(Vm=-40 * U.mV) + .paint('"soma"', A.density("hh")) + .place('"midpoint"', A.iclamp(10 * U.ms, 2 * U.ms, 0.8 * U.nA), "iclamp") + .place('"midpoint"', A.threshold_detector(-10 * U.mV), "detector") ) -cell = arbor.cable_cell(tree, decor, labels) +cell = A.cable_cell(tree, decor, labels) + # (4) Define a recipe for a single cell and set of probes upon it. # This constitutes the corresponding generic recipe version of # `single_cell_model.py`. - - -class single_recipe(arbor.recipe): - # (4.1) The base class constructor must be called first, to ensure that - # all memory in the wrapped C++ class is initialized correctly. +class single_recipe(A.recipe): + # (4.1) Base constructor must be called, to ensure correct initialization. def __init__(self): - arbor.recipe.__init__(self) - self.the_props = arbor.neuron_cable_properties() + A.recipe.__init__(self) + self.the_props = A.neuron_cable_properties() # (4.2) Override the num_cells method def num_cells(self): @@ -46,7 +42,7 @@ class single_recipe(arbor.recipe): # (4.3) Override the cell_kind method def cell_kind(self, _): - return arbor.cell_kind.cable + return A.cell_kind.cable # (4.4) Override the cell_description method def cell_description(self, gid): @@ -54,7 +50,7 @@ class single_recipe(arbor.recipe): # (4.5) Override the probes method with a voltage probe located on "midpoint" def probes(self, _): - return [arbor.cable_probe_membrane_voltage('"midpoint"', "Um")] + return [A.cable_probe_membrane_voltage('"midpoint"', "Um")] # (4.6) Override the global_properties method def global_properties(self, kind): @@ -62,37 +58,31 @@ class single_recipe(arbor.recipe): # (5) Instantiate recipe. - recipe = single_recipe() -# (6) Create simulation. When their defaults are sufficient, context and domain decomposition don't -# have to be manually specified and the simulation can be created with just the recipe as argument. - -sim = arbor.simulation(recipe) - -# (7) Create and run simulation and set up 10 kHz (every 0.1 ms) sampling on the probe. -# The probe is located on cell 0, and is the 0th probe on that cell, thus has probeset_id (0, 0). +# (6) Create simulation. When their defaults are sufficient, context and domain +# decomposition don't have to be manually specified and the simulation can be +# created with just the recipe as argument. +sim = A.simulation(recipe) -sim.record(arbor.spike_recording.all) -handle = sim.sample((0, "Um"), arbor.regular_schedule(0.1)) -sim.run(tfinal=30) +# (7) Create and run simulation and set up 10 kHz (every 0.1 ms) sampling on the +# probe. The probe is located on cell 0, and is the 0th probe on that cell, thus +# has probeset_id (0, 0). +sim.record(A.spike_recording.all) +handle = sim.sample((0, "Um"), A.regular_schedule(0.1 * U.ms)) +sim.run(tfinal=30 * U.ms) # (8) Collect results. - spikes = sim.spikes() data, meta = sim.samples(handle)[0] -if len(spikes) > 0: - print("{} spikes:".format(len(spikes))) - for t in spikes["time"]: - print("{:3.3f}".format(t)) -else: - print("no spikes") +print("{} spikes:".format(len(spikes))) +for t in spikes["time"]: + print(f" * {t:3.3f} ms") print("Plotting results ...") - -df = pandas.DataFrame({"t/ms": data[:, 0], "U/mV": data[:, 1]}) -seaborn.relplot(data=df, kind="line", x="t/ms", y="U/mV", errorbar=None).savefig( +df = pd.DataFrame({"t/ms": data[:, 0], "U/mV": data[:, 1]}) +sns.relplot(data=df, kind="line", x="t/ms", y="U/mV", errorbar=None).savefig( "single_cell_recipe_result.svg" ) diff --git a/python/example/single_cell_stdp.py b/python/example/single_cell_stdp.py index 9e840127174a78019ab89bffab7beba4e874480f..d460fbd7d6bab8a02b6dbf9dddb395c520e6064c 100755 --- a/python/example/single_cell_stdp.py +++ b/python/example/single_cell_stdp.py @@ -1,71 +1,68 @@ #!/usr/bin/env python3 -import arbor +import arbor as A +from arbor import units as U import numpy as np import pandas as pd import seaborn as sns # You may have to pip install these. -class single_recipe(arbor.recipe): +class single_recipe(A.recipe): def __init__(self, dT, n_pairs): - arbor.recipe.__init__(self) + A.recipe.__init__(self) self.dT = dT self.n_pairs = n_pairs - self.the_props = arbor.neuron_cable_properties() + self.the_props = A.neuron_cable_properties() def num_cells(self): return 1 def cell_kind(self, gid): - return arbor.cell_kind.cable + return A.cell_kind.cable def cell_description(self, gid): - tree = arbor.segment_tree() - tree.append( - arbor.mnpos, arbor.mpoint(-3, 0, 0, 3), arbor.mpoint(3, 0, 0, 3), tag=1 - ) + tree = A.segment_tree() + tree.append(A.mnpos, (-3, 0, 0, 3), (3, 0, 0, 3), tag=1) - labels = arbor.label_dict({"soma": "(tag 1)", "center": "(location 0 0.5)"}) + labels = A.label_dict({"soma": "(tag 1)", "center": "(location 0 0.5)"}) decor = ( - arbor.decor() - .set_property(Vm=-40) - .paint("(all)", arbor.density("hh")) - .place('"center"', arbor.threshold_detector(-10), "detector") - .place('"center"', arbor.synapse("expsyn"), "synapse") + A.decor() + .set_property(Vm=-40 * U.mV) + .paint("(all)", A.density("hh")) + .place('"center"', A.threshold_detector(-10 * U.mV), "detector") + .place('"center"', A.synapse("expsyn"), "synapse") .place( '"center"', - arbor.synapse("expsyn_stdp", max_weight=1.0), + A.synapse("expsyn_stdp", max_weight=1.0), "stpd_synapse", ) ) - return arbor.cable_cell(tree, decor, labels) + return A.cable_cell(tree, decor, labels) def event_generators(self, gid): """two stimuli: one that makes the cell spike, the other to monitor STDP""" - stimulus_times = np.linspace(50, 500, self.n_pairs) + stimulus_times = np.linspace(50, 500, self.n_pairs) * U.ms # strong enough stimulus - spike = arbor.event_generator( - "synapse", 1.0, arbor.explicit_schedule(stimulus_times) - ) + spike = A.event_generator("synapse", 1.0, A.explicit_schedule(stimulus_times)) # zero weight -> just modify synaptic weight via stdp - stdp = arbor.event_generator( - "stpd_synapse", 0.0, arbor.explicit_schedule(stimulus_times - self.dT) + stdp = A.event_generator( + "stpd_synapse", 0.0, A.explicit_schedule(stimulus_times - self.dT) ) return [spike, stdp] def probes(self, gid): def mk(s, t): - return arbor.cable_probe_point_state(1, "expsyn_stdp", state=s, tag=t) + return A.cable_probe_point_state(1, "expsyn_stdp", state=s, tag=t) return [ - arbor.cable_probe_membrane_voltage('"center"', "Um"), + A.cable_probe_membrane_voltage('"center"', "Um"), mk("g", "state-g"), mk("apost", "state-apost"), mk("apre", "state-apre"), @@ -79,11 +76,11 @@ class single_recipe(arbor.recipe): def run(dT, n_pairs=1, do_plots=False): recipe = single_recipe(dT, n_pairs) - sim = arbor.simulation(recipe) + sim = A.simulation(recipe) - sim.record(arbor.spike_recording.all) + sim.record(A.spike_recording.all) - reg_sched = arbor.regular_schedule(0.1) + reg_sched = A.regular_schedule(0.1 * U.ms) handles = { "U": sim.sample((0, "Um"), reg_sched), "g": sim.sample((0, "state-g"), reg_sched), @@ -92,7 +89,7 @@ def run(dT, n_pairs=1, do_plots=False): "weight_plastic": sim.sample((0, "state-weight"), reg_sched), } - sim.run(tfinal=600) + sim.run(tfinal=0.6 * U.s) if do_plots: print("Plotting detailed results ...") @@ -107,7 +104,7 @@ def run(dT, n_pairs=1, do_plots=False): return weight_plastic[:, 1][-1] -data = np.array([(dT, run(dT)) for dT in np.arange(-20, 20, 0.5)]) +data = np.array([(dT, run(dT * U.ms)) for dT in np.arange(-20, 20, 0.5)]) df = pd.DataFrame({"t/ms": data[:, 0], "dw": data[:, 1]}) print("Plotting results ...") sns.relplot(data=df, x="t/ms", y="dw", kind="line", errorbar=None).savefig( diff --git a/python/example/single_cell_swc.py b/python/example/single_cell_swc.py index d5cbf46d69fc58e3842cccf5fee114ba22efa1e4..097c11b60be5f61fc95913571c0f013e4e5c2f66 100755 --- a/python/example/single_cell_swc.py +++ b/python/example/single_cell_swc.py @@ -10,9 +10,10 @@ # preserve surface area and correct starting locations of cables # attached to the soma. -import arbor -import pandas -import seaborn +import arbor as A +from arbor import units as U +import pandas as pd +import seaborn as sns import sys # Load a cell morphology from an swc file. @@ -22,10 +23,10 @@ if len(sys.argv) < 2: sys.exit(0) filename = sys.argv[1] -morpho = arbor.load_swc_arbor(filename) +morpho = A.load_swc_arbor(filename) # Define the regions and locsets in the model. -labels = arbor.label_dict( +labels = A.label_dict( { "root": "(root)", # the start of the soma in this morphology is at the root of the cell. "stim_site": "(location 0 0.5)", # site for the stimulus, in the middle of branch 0. @@ -34,46 +35,43 @@ labels = arbor.label_dict( ).add_swc_tags() # Finally, add the SWC default labels. decor = ( - arbor.decor() + A.decor() # Set initial membrane potential to -55 mV - .set_property(Vm=-55) + .set_property(Vm=-55 * U.mV) # Use Nernst to calculate reversal potential for calcium. - .set_ion("ca", method=arbor.mechanism("nernst/x=ca")) + .set_ion("ca", method=A.mechanism("nernst/x=ca")) # hh mechanism on the soma and axon. - .paint('"soma"', arbor.density("hh")) - .paint('"axon"', arbor.density("hh")) + .paint('"soma"', A.density("hh")) + .paint('"axon"', A.density("hh")) # pas mechanism the dendrites. - .paint('"dend"', arbor.density("pas")) + .paint('"dend"', A.density("pas")) # Increase resistivity on dendrites. - .paint('"dend"', rL=500) + .paint('"dend"', rL=500 * U.Ohm * U.cm) # Attach stimuli that inject 4 nA current for 1 ms, starting at 3 and 8 ms. - .place('"root"', arbor.iclamp(10, 1, current=5), "iclamp0") - .place('"stim_site"', arbor.iclamp(3, 1, current=0.5), "iclamp1") - .place('"stim_site"', arbor.iclamp(10, 1, current=0.5), "iclamp2") - .place('"stim_site"', arbor.iclamp(8, 1, current=4), "iclamp3") + .place('"root"', A.iclamp(10 * U.ms, 1 * U.ms, current=5 * U.nA), "iclamp0") + .place('"stim_site"', A.iclamp(3 * U.ms, 1 * U.ms, current=0.5 * U.nA), "iclamp1") + .place('"stim_site"', A.iclamp(10 * U.ms, 1 * U.ms, current=0.5 * U.nA), "iclamp2") + .place('"stim_site"', A.iclamp(8 * U.ms, 1 * U.ms, current=4 * U.nA), "iclamp3") # Detect spikes at the soma with a voltage threshold of -10 mV. - .place('"axon_end"', arbor.threshold_detector(-10), "detector") + .place('"axon_end"', A.threshold_detector(-10 * U.mV), "detector") # Create the policy used to discretise the cell into CVs. # Use a single CV for the soma, and CVs of maximum length 1 μm elsewhere. .discretization('(replace (single (region "soma")) (max-extent 1.0))') ) # Combine morphology with region and locset definitions to make a cable cell. -cell = arbor.cable_cell(morpho, decor, labels) - -print(cell.locations('"axon_end"')) +cell = A.cable_cell(morpho, decor, labels) # Make single cell model. -m = arbor.single_cell_model(cell) +m = A.single_cell_model(cell) # Attach voltage probes that sample at 50 kHz. -m.probe("voltage", tag="Um-root", where='"root"', frequency=50) -m.probe("voltage", tag="Um-stim", where='"stim_site"', frequency=50) -m.probe("voltage", tag="Um-axon", where='"axon_end"', frequency=50) +m.probe("voltage", tag="Um-root", where='"root"', frequency=50 * U.kHz) +m.probe("voltage", tag="Um-stim", where='"stim_site"', frequency=50 * U.kHz) +m.probe("voltage", tag="Um-axon", where='"axon_end"', frequency=50 * U.kHz) # Simulate the cell for 15 ms. -tfinal = 15 -m.run(tfinal) +m.run(15 * U.ms) print("Simulation done.") # Print spike times. @@ -89,7 +87,7 @@ print("Plotting results ...") df_list = [] for t in m.traces: df_list.append( - pandas.DataFrame( + pd.DataFrame( { "t/ms": t.time, "U/mV": t.value, @@ -99,9 +97,9 @@ for t in m.traces: ) ) -df = pandas.concat(df_list, ignore_index=True) +df = pd.concat(df_list, ignore_index=True) -seaborn.relplot( +sns.relplot( data=df, kind="line", x="t/ms", diff --git a/python/example/v-clamp.py b/python/example/v-clamp.py index 819c0925c736b22260f6df5d90fa284775e8621d..3b17c05df929544fb94707489395d11abdd00332 100755 --- a/python/example/v-clamp.py +++ b/python/example/v-clamp.py @@ -1,38 +1,38 @@ #!/usr/bin/env python3 -import arbor -import pandas # You may have to pip install these. -import seaborn # You may have to pip install these. +import arbor as A +from arbor import units as U +import pandas as pd # You may have to pip install these. +import seaborn as sns # You may have to pip install these. # (1) Create a morphology with a single (cylindrical) segment of length=diameter=6 μm -tree = arbor.segment_tree() -tree.append(arbor.mnpos, arbor.mpoint(-3, 0, 0, 3), arbor.mpoint(3, 0, 0, 3), tag=1) +tree = A.segment_tree() +tree.append(A.mnpos, A.mpoint(-3, 0, 0, 3), A.mpoint(3, 0, 0, 3), tag=1) # (2) Define the soma and its midpoint -labels = arbor.label_dict({"soma": "(tag 1)", "midpoint": "(location 0 0.5)"}) +labels = A.label_dict({"soma": "(tag 1)", "midpoint": "(location 0 0.5)"}) # (3) Create and set up a decor object - decor = ( - arbor.decor() - .set_property(Vm=-40) - .paint('"soma"', arbor.density("hh")) - .paint('"soma"', arbor.voltage_process("v_clamp/v0=-42")) - .place('"midpoint"', arbor.iclamp(10, 2, 0.8), "iclamp") - .place('"midpoint"', arbor.threshold_detector(-10), "detector") + A.decor() + .set_property(Vm=-40 * U.mV) + .paint('"soma"', A.density("hh")) + .paint('"soma"', A.voltage_process("v_clamp/v0=-42")) + .place('"midpoint"', A.iclamp(10 * U.ms, 2 * U.ms, 0.8 * U.nA), "iclamp") + .place('"midpoint"', A.threshold_detector(-10 * U.mV), "detector") ) # (4) Create cell and the single cell model based on it -cell = arbor.cable_cell(tree, decor, labels) +cell = A.cable_cell(tree, decor, labels) # (5) Make single cell model. -m = arbor.single_cell_model(cell) +m = A.single_cell_model(cell) # (6) Attach voltage probe sampling at 10 kHz (every 0.1 ms). -m.probe("voltage", '"midpoint"', "Um", frequency=10) +m.probe("voltage", '"midpoint"', "Um", frequency=10 * U.kHz) # (7) Run simulation for 30 ms of simulated activity. -m.run(tfinal=30) +m.run(tfinal=30 * U.ms) # (8) Print spike times. if len(m.spikes) > 0: @@ -44,8 +44,8 @@ else: # (9) Plot the recorded voltages over time. print("Plotting results ...") -df = pandas.DataFrame({"t/ms": m.traces[0].time, "U/mV": m.traces[0].value}) -seaborn.relplot(data=df, kind="line", x="t/ms", y="U/mV", errorbar=None).savefig( +df = pd.DataFrame({"t/ms": m.traces[0].time, "U/mV": m.traces[0].value}) +sns.relplot(data=df, kind="line", x="t/ms", y="U/mV", errorbar=None).savefig( "v-clamp.svg" ) diff --git a/python/identifiers.cpp b/python/identifiers.cpp index 5a9ff9a1ebb20c6cd2beac6d69b17095a6347d50..e58a8a035de0ce86c80c12eb34431326d83cc787 100644 --- a/python/identifiers.cpp +++ b/python/identifiers.cpp @@ -1,6 +1,8 @@ #include <pybind11/pybind11.h> #include <arbor/common_types.hpp> +#include <arbor/recipe.hpp> +#include <arbor/spike.hpp> #include "strprintf.hpp" @@ -21,6 +23,11 @@ void register_identifiers(py::module& m) { .value("univalent", arb::lid_selection_policy::assert_univalent, "Assert that there is only one possible location associated with a labeled item on the cell. The model throws an exception if the assertion fails."); + py::class_<arb::cell_address_type> cell_address(m, "cell_address"); + cell_address + .def_readwrite("gid", &arb::cell_address_type::gid) + .def_readwrite("tag", &arb::cell_address_type::tag); + py::class_<arb::cell_local_label_type> cell_local_label_type(m, "cell_local_label", "For local identification of an item.\n\n" "cell_local_label identifies:\n" @@ -146,6 +153,21 @@ void register_identifiers(py::module& m) { "Use GPU backend.") .value("multicore", arb::backend_kind::multicore, "Use multicore backend."); + + // Probes + py::class_<arb::probe_info> probe(m, "probe"); + probe + .def("__repr__", [](const arb::probe_info& p){return util::pprintf("<arbor.probe: tag {}>", p.tag);}) + .def("__str__", [](const arb::probe_info& p){return util::pprintf("<arbor.probe: tag {}>", p.tag);}); + + py::class_<arb::spike> spike(m, "spike"); + spike + .def(py::init([](const arb::cell_member_type& m, arb::time_type t) -> arb::spike { return {m, t}; })) + .def_readwrite("source", &arb::spike::source, "The global identifier of the cell.") + .def_readwrite("time", &arb::spike::time, "The time of spike.") + .def("__repr__", [](const arb::spike& s){return util::pprintf("<arbor.spike: {}>", s);}) + .def("__str__", [](const arb::spike& s){return util::pprintf("<arbor.spike: {}>", s);}); + } } // namespace pyarb diff --git a/python/label_dict.cpp b/python/label_dict.cpp new file mode 100644 index 0000000000000000000000000000000000000000..ff71d1481d84382750a00c64ac65b6ae4b75b731 --- /dev/null +++ b/python/label_dict.cpp @@ -0,0 +1,88 @@ +#include "label_dict.hpp" + +#include <pybind11/pybind11.h> +#include <pybind11/stl.h> + +namespace pyarb { + +namespace py = pybind11; +using namespace py::literals; +void register_label_dict(py::module& m) { + + py::class_<label_dict_proxy> label_dict(m, "label_dict", + "A dictionary of labelled region and locset definitions, with a\n" + "unique label assigned to each definition."); + label_dict + .def(py::init<>(), + "Create an empty label dictionary.") + .def(py::init<const std::unordered_map<std::string, std::string>&>(), + "Initialize a label dictionary from a dictionary with string labels as keys," + " and corresponding definitions as strings.") + .def(py::init<const label_dict_proxy&>(), + "Initialize a label dictionary from another one") + .def(py::init([](py::iterator& it) { + label_dict_proxy ld; + for (; it != py::iterator::sentinel(); ++it) { + const auto tuple = it->cast<py::sequence>(); + const auto key = tuple[0].cast<std::string>(); + const auto value = tuple[1].cast<std::string>(); + ld.set(key, value); + } + return ld; + }), + "Initialize a label dictionary from an iterable of key, definition pairs") + .def("add_swc_tags", + [](label_dict_proxy& l) { return l.add_swc_tags(); }, + "Add standard SWC tagged regions.\n" + " - soma: (tag 1)\n" + " - axon: (tag 2)\n" + " - dend: (tag 3)\n" + " - apic: (tag 4)") + .def("__setitem__", + [](label_dict_proxy& l, const char* name, const char* desc) { + l.set(name, desc);}) + .def("__getitem__", + [](label_dict_proxy& l, const char* name) { + if (auto v = l.getitem(name)) return v.value(); + throw py::key_error(name); + }) + .def("__len__", &label_dict_proxy::size) + .def("__iter__", + [](const label_dict_proxy &ld) { + return py::make_key_iterator(ld.cache.begin(), ld.cache.end());}, + py::keep_alive<0, 1>()) + .def("__contains__", + [](const label_dict_proxy &ld, const char* name) { + return ld.contains(name);}) + .def("keys", + [](const label_dict_proxy &ld) { + return py::make_key_iterator(ld.cache.begin(), ld.cache.end());}, + py::keep_alive<0, 1>()) + .def("items", + [](const label_dict_proxy &ld) { + return py::make_iterator(ld.cache.begin(), ld.cache.end());}, + py::keep_alive<0, 1>()) + .def("values", + [](const label_dict_proxy &ld) { + return py::make_value_iterator(ld.cache.begin(), ld.cache.end()); + }, + py::keep_alive<0, 1>()) + .def("append", [](label_dict_proxy& l, const label_dict_proxy& other, const char* prefix) { + l.import(other, prefix); + }, + "other"_a, "The label_dict to be imported" + "prefix"_a="", "optional prefix appended to the region and locset labels", + "Import the entries of a another label dictionary with an optional prefix.") + .def("update", [](label_dict_proxy& l, const label_dict_proxy& other) { + l.import(other); + }, + "other"_a, "The label_dict to be imported" + "Import the entries of a another label dictionary.") + .def_readonly("regions", &label_dict_proxy::regions, + "The region definitions.") + .def_readonly("locsets", &label_dict_proxy::locsets, + "The locset definitions.") + .def("__repr__", [](const label_dict_proxy& d){return d.to_string();}) + .def("__str__", [](const label_dict_proxy& d){return d.to_string();}); +} +} diff --git a/python/proxy.hpp b/python/label_dict.hpp similarity index 98% rename from python/proxy.hpp rename to python/label_dict.hpp index 31333e132e6451985113ad2422efee285a97b159..9d62fd1455bee646b3d0dc75327ba56c23cbac26 100644 --- a/python/proxy.hpp +++ b/python/label_dict.hpp @@ -1,7 +1,7 @@ #pragma once -#include <any> #include <string> +#include <unordered_map> #include <arborio/label_parse.hpp> @@ -27,9 +27,7 @@ struct label_dict_proxy { label_dict_proxy() = default; label_dict_proxy(const str_map& in) { - for (auto& i: in) { - set(i.first, i.second); - } + for (auto& [k, v]: in) set(k, v); } label_dict_proxy& add_swc_tags() { diff --git a/python/mechanism.cpp b/python/mechanism.cpp index 5092b17e83f7f48cdc4368bd8e1da9e0b0f87fba..31600b5bdb9cc7b6657098be36693542c3cb0939 100644 --- a/python/mechanism.cpp +++ b/python/mechanism.cpp @@ -1,5 +1,4 @@ #include <optional> -#include <stdexcept> #include <pybind11/pybind11.h> #include "pybind11/pytypes.h" @@ -12,7 +11,6 @@ #include "arbor/mechinfo.hpp" #include "util.hpp" -#include "conversion.hpp" #include "strprintf.hpp" namespace pyarb { diff --git a/python/morphology.cpp b/python/morphology.cpp index 3c0e3579a934e6017909a3e40f2898473f66c739..dacf19ede0fe8f121d404c3c5fc342825e0eb6d1 100644 --- a/python/morphology.cpp +++ b/python/morphology.cpp @@ -1,4 +1,3 @@ -#include <fstream> #include <tuple> #include <variant> @@ -22,7 +21,7 @@ #include "util.hpp" #include "error.hpp" -#include "proxy.hpp" +#include "label_dict.hpp" #include "strprintf.hpp" namespace py = pybind11; @@ -42,15 +41,23 @@ void check_trailing(std::istream& in, std::string fname) { void register_morphology(py::module& m) { using namespace py::literals; - // - // primitives: points, segments, locations, cables... etc. - // - m.attr("mnpos") = arb::mnpos; + py::class_<arb::morphology> morph(m, "morphology", "A cell morphology."); + py::class_<arb::mlocation> location(m, "location", "A location on a cable cell."); + py::class_<arb::mextent> extent(m, "extent", "A potentially empty region on a morphology."); + py::class_<arb::mpoint> mpoint(m, "mpoint"); + py::class_<arb::mcable> cable(m, "cable"); + py::class_<arb::isometry> isometry(m, "isometry"); + py::class_<arb::place_pwlin> place(m, "place_pwlin"); + py::class_<arb::segment_tree> segment_tree(m, "segment_tree"); + py::class_<arborio::asc_morphology> asc_morphology(m, "asc_morphology", "The morphology and label dictionary meta-data loaded from a Neurolucida ASCII (.asc) file."); + py::class_<arborio::nml_morphology_data> nml_morph_data(m, "neuroml_morph_data"); + py::class_<arborio::neuroml> neuroml(m, "neuroml"); + py::class_<arb::mprovider> prov(m, "morphology_provider"); + py::class_<arb::msegment> msegment(m, "msegment"); + // arb::mlocation - py::class_<arb::mlocation> location(m, "location", - "A location on a cable cell."); location .def(py::init( [](arb::msize_t branch, double pos) { @@ -73,7 +80,6 @@ void register_morphology(py::module& m) { [](arb::mlocation l) { return util::pprintf("(location {} {})", l.branch, l.pos); }); // arb::mpoint - py::class_<arb::mpoint> mpoint(m, "mpoint"); mpoint .def(py::init<double, double, double, double>(), "x"_a, "y"_a, "z"_a, "radius"_a, @@ -98,14 +104,12 @@ void register_morphology(py::module& m) { py::implicitly_convertible<py::tuple, arb::mpoint>(); // arb::msegment - py::class_<arb::msegment> msegment(m, "msegment"); msegment .def_readonly("prox", &arb::msegment::prox, "the location and radius of the proximal end.") .def_readonly("dist", &arb::msegment::dist, "the location and radius of the distal end.") .def_readonly("tag", &arb::msegment::tag, "tag meta-data."); // arb::mcable - py::class_<arb::mcable> cable(m, "cable"); cable .def(py::init( [](arb::msize_t bid, double prox, double dist) { @@ -127,7 +131,6 @@ void register_morphology(py::module& m) { .def("__repr__", [](const arb::mcable& c) { return util::pprintf("{}", c); }); // arb::isometry - py::class_<arb::isometry> isometry(m, "isometry"); isometry .def(py::init<>(), "Construct a trivial isometry.") .def("__call__", [](arb::isometry& iso, arb::mpoint& p) { @@ -178,10 +181,9 @@ void register_morphology(py::module& m) { "Construct a rotation isometry of angle theta about the given axis in the direction described by a tuple."); // arb::place_pwlin - py::class_<arb::place_pwlin> place(m, "place_pwlin"); place .def(py::init<const arb::morphology&, const arb::isometry&>(), - "morphology"_a, "isometry"_a=arb::isometry{}, + "morphology"_a, py::arg_v("isometry", arb::isometry(), "id"), "Construct a piecewise-linear placement object from the given morphology and optional isometry.") .def("at", &arb::place_pwlin::at, "location"_a, "Return an interpolated mpoint corresponding to the location argument.") @@ -210,7 +212,6 @@ void register_morphology(py::module& m) { "Returns the location and its distance from the point."); // arb::place_pwlin - py::class_<arb::mprovider> prov(m, "morphology_provider"); prov .def(py::init<const arb::morphology&>(), "morphology"_a, @@ -228,14 +229,7 @@ void register_morphology(py::module& m) { }, "Turn a region into an extent."); - - - // - // Higher-level data structures (segment_tree, morphology) - // - // arb::segment_tree - py::class_<arb::segment_tree> segment_tree(m, "segment_tree"); segment_tree // constructors .def(py::init<>()) @@ -290,6 +284,37 @@ void register_morphology(py::module& m) { .def("__str__", [](const arb::segment_tree& s) { return util::pprintf("<arbor.segment_tree:\n{}>", s);}); + // arb::morphology + morph + // constructors + .def(py::init( + [](arb::segment_tree t){ + return arb::morphology(std::move(t)); + })) + // morphology's interface is read-only by design, so most of it can + // be implemented as read-only properties. + .def_property_readonly("empty", + [](const arb::morphology& m){return m.empty();}, + "Whether the morphology is empty.") + .def_property_readonly("num_branches", + [](const arb::morphology& m){return m.num_branches();}, + "The number of branches in the morphology.") + .def("branch_parent", &arb::morphology::branch_parent, + "i"_a, "The parent branch of branch i.") + .def("branch_children", &arb::morphology::branch_children, + "i"_a, "The child branches of branch i.") + .def("branch_segments", + [](const arb::morphology& m, arb::msize_t i) { + return m.branch_segments(i); + }, + "i"_a, "A list of the segments in branch i, ordered from proximal to distal ends of the branch.") + .def("to_segment_tree", &arb::morphology::to_segment_tree, + "Convert this morphology to a segment_tree.") + .def("__str__", + [](const arb::morphology& m) { + return util::pprintf("<arbor.morphology:\n{}>", m); + }); + using morph_or_tree = std::variant<arb::segment_tree, arb::morphology>; // Function that creates a morphology/segment_tree from an swc file. @@ -309,9 +334,8 @@ void register_morphology(py::module& m) { throw pyarb_error(util::pprintf("Arbor SWC: parse error: {}", e.what())); } }, - "filename_or_stream"_a, - pybind11::arg_v("raw", false, "Return a segment tree instead of a fully formed morphology"), - "Generate a morphology/segment_tree from an SWC file following the rules prescribed by Arbor.\n" + "filename_or_stream"_a, "raw"_a=false, + "Generate a morphology/segment_tree (raw=False/True) from an SWC file following the rules prescribed by Arbor.\n" "Specifically:\n" " * Single-segment somas are disallowed.\n" " * There are no special rules related to somata. They can be one or multiple branches\n" @@ -333,50 +357,13 @@ void register_morphology(py::module& m) { throw pyarb_error(util::pprintf("NEURON SWC: parse error: {}", e.what())); } }, - "filename_or_stream"_a, - pybind11::arg_v("raw", false, "Return a segment tree instead of a fully formed morphology"), - "Generate a morphology from an SWC file following the rules prescribed by NEURON.\n" + "filename_or_stream"_a, "raw"_a=false, + "Generate a morphology/segment_tree (raw=False/True) from an SWC file following the rules prescribed by NEURON.\n" "See the documentation https://docs.arbor-sim.org/en/latest/fileformat/swc.html\n" "for a detailed description of the interpretation."); - - // arb::morphology - - py::class_<arb::morphology> morph(m, "morphology"); - morph - // constructors - .def(py::init( - [](arb::segment_tree t){ - return arb::morphology(std::move(t)); - })) - // morphology's interface is read-only by design, so most of it can - // be implemented as read-only properties. - .def_property_readonly("empty", - [](const arb::morphology& m){return m.empty();}, - "Whether the morphology is empty.") - .def_property_readonly("num_branches", - [](const arb::morphology& m){return m.num_branches();}, - "The number of branches in the morphology.") - .def("branch_parent", &arb::morphology::branch_parent, - "i"_a, "The parent branch of branch i.") - .def("branch_children", &arb::morphology::branch_children, - "i"_a, "The child branches of branch i.") - .def("branch_segments", - [](const arb::morphology& m, arb::msize_t i) { - return m.branch_segments(i); - }, - "i"_a, "A list of the segments in branch i, ordered from proximal to distal ends of the branch.") - .def("to_segment_tree", &arb::morphology::to_segment_tree, - "Convert this morphology to a segment_tree.") - .def("__str__", - [](const arb::morphology& m) { - return util::pprintf("<arbor.morphology:\n{}>", m); - }); - // Neurolucida ASCII, or .asc, file format support. - py::class_<arborio::asc_morphology> asc_morphology(m, "asc_morphology", - "The morphology and label dictionary meta-data loaded from a Neurolucida ASCII (.asc) file."); asc_morphology .def_readonly("morphology", &arborio::asc_morphology::morphology, @@ -404,12 +391,10 @@ void register_morphology(py::module& m) { throw pyarb_error(util::pprintf("error loading neurolucida asc file: {}", e.what())); } }, - "filename_or_stream"_a, - pybind11::arg_v("raw", false, "Return a segment tree instead of a fully formed morphology"), - "Load a morphology or segment_tree and meta data from a Neurolucida ASCII .asc file."); + "filename_or_stream"_a, "raw"_a=false, + "Load a morphology or segment_tree (raw=True) and meta data from a Neurolucida ASCII .asc file."); // arborio::morphology_data - py::class_<arborio::nml_morphology_data> nml_morph_data(m, "neuroml_morph_data"); nml_morph_data .def_readonly("cell_id", &arborio::nml_morphology_data::cell_id, @@ -434,7 +419,6 @@ void register_morphology(py::module& m) { "Map from segmentGroup ids to their corresponding segment ids."); // arborio::neuroml - py::class_<arborio::neuroml> neuroml(m, "neuroml"); neuroml // constructors .def(py::init( diff --git a/python/probes.cpp b/python/probes.cpp index 161c438be3bc924423a59336e7dc2e652ebfc5de..ad734fff894f3cf1a0bde76325fb09f448f36b85 100644 --- a/python/probes.cpp +++ b/python/probes.cpp @@ -153,11 +153,8 @@ void register_probe_meta_maps(pyarb_global_ptr g) { }); } - - // Wrapper functions around cable_cell probe types that return arb::probe_info values: // (Probe tag value is implicitly left at zero.) - arb::probe_info cable_probe_membrane_voltage(const char* where, const std::string& tag) { return {arb::cable_probe_membrane_voltage{arborio::parse_locset_expression(where).unwrap()}, tag}; } @@ -242,7 +239,6 @@ arb::probe_info lif_probe_voltage(const std::string& tag) { return {arb::lif_probe_voltage{}, tag}; } - // Add wrappers to module, recorder factories to global data. void register_cable_probes(pybind11::module& m, pyarb_global_ptr global_ptr) { @@ -251,11 +247,13 @@ void register_cable_probes(pybind11::module& m, pyarb_global_ptr global_ptr) { // Probe metadata wrappers: - py::class_<arb::lif_probe_metadata> lif_probe_metadata(m, "lif_probe_metadata", - "Probe metadata associated with a LIF cell probe."); + py::class_<arb::lif_probe_metadata> lif_probe_metadata(m, + "lif_probe_metadata", + "Probe metadata associated with a LIF cell probe."); - py::class_<arb::cable_probe_point_info> cable_probe_point_info(m, "cable_probe_point_info", - "Probe metadata associated with a cable cell probe for point process state."); + py::class_<arb::cable_probe_point_info> cable_probe_point_info(m, + "cable_probe_point_info", + "Probe metadata associated with a cable cell probe for point process state."); cable_probe_point_info .def_readwrite("target", &arb::cable_probe_point_info::target, @@ -281,11 +279,11 @@ void register_cable_probes(pybind11::module& m, pyarb_global_ptr global_ptr) { "Probe specification for cable cell membrane voltage associated with each cable in each CV.", "tag"_a); m.def("cable_probe_axial_current", &cable_probe_axial_current, - "Probe specification for cable cell axial current at points in a location set.", - "where"_a, "tag"_a); + "Probe specification for cable cell axial current at points in a location set.", + "where"_a, "tag"_a); m.def("cable_probe_total_ion_current_density", &cable_probe_total_ion_current_density, - "Probe specification for cable cell total transmembrane current density excluding capacitive currents at points in a location set.", - "where"_a, "tag"_a); + "Probe specification for cable cell total transmembrane current density excluding capacitive currents at points in a location set.", + "where"_a, "tag"_a); m.def("cable_probe_total_ion_current_cell", &cable_probe_total_ion_current_cell, "Probe specification for cable cell total transmembrane current excluding capacitive currents for each cable in each CV.", diff --git a/python/profiler.cpp b/python/profiler.cpp index b3fe1011bee6becfa014d1bc5fb0a2de898b6752..c23f7a80c3b520dc312ae0b305c1883301d42aad 100644 --- a/python/profiler.cpp +++ b/python/profiler.cpp @@ -1,5 +1,3 @@ -#include <sstream> - #include <pybind11/pybind11.h> #include <pybind11/stl.h> @@ -32,9 +30,9 @@ void register_profiler(pybind11::module& m) { manager.checkpoint(name, ctx.context); }, "name"_a, "context"_a, - "Create a new checkpoint. Records the time since the last checkpoint\ - (or the call to start if no previous checkpoints exist),\ - and restarts the timer for the next checkpoint.") + "Create a new checkpoint. Records the time since the last checkpoint" + "(or the call to start if no previous checkpoints exist)," + "and restarts the timer for the next checkpoint.") .def_property_readonly("checkpoint_names", &arb::profile::meter_manager::checkpoint_names, "A list of all metering checkpoint names.") .def_property_readonly("times", &arb::profile::meter_manager::times, @@ -65,8 +63,8 @@ void register_profiler(pybind11::module& m) { arb::profile::print_profiler_summary(stream, limit); return stream.str(); }, - pybind11::arg_v("limit", 0.0, "Print contributions above <limit> percent. Defaults to showing all.") - ); + "limit"_a=0.0, + "Show summary of the profile; printing contributions above `limit` percent. Defaults to showing all."); #endif } diff --git a/python/pyarb.cpp b/python/pyarb.cpp index e15194f29a732d553562d77512cffd15f352f7b9..a835da796369123fc1cac842a5c0dbd36c5c5497 100644 --- a/python/pyarb.cpp +++ b/python/pyarb.cpp @@ -30,6 +30,8 @@ void register_schedules(pybind11::module& m); void register_simulation(pybind11::module& m, pyarb_global_ptr); void register_arborenv(pybind11::module& m); void register_single_cell(pybind11::module& m); +void register_units(pybind11::module& m); +void register_label_dict(pybind11::module& m); #ifdef ARB_MPI_ENABLED void register_mpi(pybind11::module& m); @@ -47,22 +49,26 @@ PYBIND11_MODULE(_arbor, m) { m.doc() = "arbor: multicompartment neural network models."; m.attr("__version__") = ARB_VERSION; - pyarb::register_cable_loader(m); + // NOTE: This is precisely ordered so that we do not leak C++ types! + pyarb::register_units(m); + pyarb::register_identifiers(m); + pyarb::register_label_dict(m); + pyarb::register_schedules(m); + pyarb::register_event_generators(m); + pyarb::register_morphology(m); pyarb::register_cable_probes(m, global_ptr); + pyarb::register_mechanisms(m); pyarb::register_cells(m); + + pyarb::register_cable_loader(m); pyarb::register_config(m); pyarb::register_contexts(m); + pyarb::register_recipe(m); pyarb::register_domain_decomposition(m); - pyarb::register_event_generators(m); - pyarb::register_identifiers(m); - pyarb::register_mechanisms(m); - pyarb::register_morphology(m); pyarb::register_profiler(m); - pyarb::register_recipe(m); - pyarb::register_schedules(m); pyarb::register_simulation(m, global_ptr); - pyarb::register_single_cell(m); pyarb::register_arborenv(m); + pyarb::register_single_cell(m); // This is the fallback. All specific translators take precedence by being // registered *later*. @@ -87,8 +93,8 @@ PYBIND11_MODULE(_arbor, m) { }); // Translate Arbor errors -> Python exceptions. - pybind11::register_exception<arb::file_not_found_error>(m, "FileNotFoundError", PyExc_FileNotFoundError); - pybind11::register_exception<arb::zero_thread_requested_error>(m, "ValueError", PyExc_ValueError); + pybind11::register_exception<arb::file_not_found_error>(m, "ArbFileNotFoundError", PyExc_FileNotFoundError); + pybind11::register_exception<arb::zero_thread_requested_error>(m, "ArbValueError", PyExc_ValueError); #ifdef ARB_MPI_ENABLED diff --git a/python/recipe.cpp b/python/recipe.cpp index bd1e01cff2d5367c7106207355c5f736b512cb46..667be8dec32a5635bb8d17ccf55560c1443845e5 100644 --- a/python/recipe.cpp +++ b/python/recipe.cpp @@ -21,6 +21,8 @@ namespace pyarb { +namespace U = arb::units; + // Convert a cell description inside a Python object to a cell description in a // unique_any, as required by the recipe interface. // This helper is only to be called while holding the GIL. We require this guard @@ -137,7 +139,7 @@ void register_recipe(pybind11::module& m) { "Describes a connection between two cells:\n" " Defined by source and destination end points (that is pre-synaptic and post-synaptic respectively), a connection weight and a delay time."); cell_connection - .def(pybind11::init<arb::cell_global_label_type, arb::cell_local_label_type, float, float>(), + .def(pybind11::init<arb::cell_global_label_type, arb::cell_local_label_type, float, const U::quantity&>(), "source"_a, "dest"_a, "weight"_a, "delay"_a, "Construct a connection with arguments:\n" " source: The source end point of the connection.\n" @@ -213,10 +215,5 @@ void register_recipe(pybind11::module& m) { .def("__str__", [](const ::pyarb::recipe&){return "<arbor.recipe>";}) .def("__repr__", [](const ::pyarb::recipe&){return "<arbor.recipe>";}); - // Probes - pybind11::class_<arb::probe_info> probe(m, "probe"); - probe - .def("__repr__", [](const arb::probe_info& p){return util::pprintf("<arbor.probe: tag {}>", p.tag);}) - .def("__str__", [](const arb::probe_info& p){return util::pprintf("<arbor.probe: tag {}>", p.tag);}); } } // namespace pyarb diff --git a/python/schedule.cpp b/python/schedule.cpp index 70950a4a60ae5a50102fbcacfb4aee10aa2519af..e1061d3631184ca109512da8dcb1269c4a09372c 100644 --- a/python/schedule.cpp +++ b/python/schedule.cpp @@ -13,57 +13,63 @@ namespace py = pybind11; namespace pyarb { std::ostream& operator<<(std::ostream& o, const regular_schedule_shim& x) { - return o << "<arbor.regular_schedule: tstart " - << util::to_string(x.tstart) << " ms, dt " - << x.dt << " ms, tstop " - << util::to_string(x.tstop) << " ms>"; + if (x.tstop.has_value()) { + return o << "<arbor.regular_schedule: tstart=" << arb::units::to_string(x.tstart) + << ", dt=" << arb::units::to_string(x.dt) + << ", tstop " << arb::units::to_string(x.tstop.value()) << ">"; + } + else { + return o << "<arbor.regular_schedule: tstart=" << arb::units::to_string(x.tstart) + << ", dt=" << arb::units::to_string(x.dt) << ">"; + } } std::ostream& operator<<(std::ostream& o, const explicit_schedule_shim& e) { - o << "<arbor.explicit_schedule: times ["; - return o << util::csv(e.times) << "] ms>"; -}; + return o << "<arbor.explicit_schedule: times [" << util::csv(e.times) << "] ms>"; +} std::ostream& operator<<(std::ostream& o, const poisson_schedule_shim& p) { - return o << "<arbor.poisson_schedule: tstart " << p.tstart << " ms" - << ", tstop " << util::to_string(p.tstop) << " ms" - << ", freq " << p.freq << " kHz" + return o << "<arbor.poisson_schedule: tstart " << arb::units::to_string(p.tstart) + << ", tstop " << arb::units::to_string(p.tstop) + << ", freq " << arb::units::to_string(p.freq) << ", seed " << p.seed << ">"; -}; +} static std::vector<arb::time_type> as_vector(std::pair<const arb::time_type*, const arb::time_type*> ts) { return std::vector<arb::time_type>(ts.first, ts.second); } -// -// regular_schedule shim -// - -regular_schedule_shim::regular_schedule_shim(arb::time_type t0, arb::time_type delta_t, py::object t1) { +regular_schedule_shim::regular_schedule_shim(const arb::units::quantity& t0, + const arb::units::quantity& delta_t, + std::optional<arb::units::quantity> t1) { set_tstart(t0); set_dt(delta_t); set_tstop(t1); } -regular_schedule_shim::regular_schedule_shim(arb::time_type delta_t) { - set_tstart(0.); +regular_schedule_shim::regular_schedule_shim(const arb::units::quantity& delta_t) { + set_tstart(0.*arb::units::ms); set_dt(delta_t); } -void regular_schedule_shim::set_tstart(arb::time_type t) { - pyarb::assert_throw(is_nonneg()(t), "tstart must be a non-negative number"); +void regular_schedule_shim::set_tstart(const arb::units::quantity& t) { + pyarb::assert_throw(is_nonneg()(t.value()), "tstart must be a non-negative number"); + pyarb::assert_throw(arb::units::is_valid(t.convert_to(arb::units::ms)), "must be convertible to time"); tstart = t; -}; +} -void regular_schedule_shim::set_tstop(py::object t) { - tstop = py2optional<time_type>( - t, "tstop must be a non-negative number, or None", is_nonneg()); -}; +void regular_schedule_shim::set_tstop(std::optional<arb::units::quantity> t) { + if (t.has_value()) { + pyarb::assert_throw(arb::units::is_valid(t.value().convert_to(arb::units::ms)), "must be convertible to time"); + } + tstop = t; +} -void regular_schedule_shim::set_dt(arb::time_type delta_t) { - pyarb::assert_throw(is_positive()(delta_t), "dt must be a positive number"); - dt = delta_t; -}; +void regular_schedule_shim::set_dt(const arb::units::quantity& t) { + pyarb::assert_throw(is_positive()(t.value()), "dt must be a positive number"); + pyarb::assert_throw(arb::units::is_valid(t.convert_to(arb::units::ms)), "must be convertible to time"); + dt = t; +} regular_schedule_shim::time_type regular_schedule_shim::get_tstart() const { return tstart; @@ -78,10 +84,9 @@ regular_schedule_shim::opt_time_type regular_schedule_shim::get_tstop() const { } arb::schedule regular_schedule_shim::schedule() const { - return arb::regular_schedule( - tstart, - dt, - tstop.value_or(arb::terminal_time)); + return arb::regular_schedule(tstart, + dt, + tstop.value_or(arb::terminal_time*arb::units::ms)); } std::vector<arb::time_type> regular_schedule_shim::events(arb::time_type t0, arb::time_type t1) { @@ -93,17 +98,15 @@ std::vector<arb::time_type> regular_schedule_shim::events(arb::time_type t0, arb return as_vector(sched.events(t0, t1)); } -// -// explicit_schedule shim -// - -//struct explicit_schedule_shim { -explicit_schedule_shim::explicit_schedule_shim(std::vector<arb::time_type> t) { - set_times(t); +explicit_schedule_shim::explicit_schedule_shim(const std::vector<arb::units::quantity>& seq) { + std::vector<arb::time_type> ts; + ts.reserve(seq.size()); + for (const auto t: seq) ts.push_back(t.value_as(arb::units::ms)); + set_times_ms(std::move(ts)); } // getter and setter (in order to assert when being set) -void explicit_schedule_shim::set_times(std::vector<arb::time_type> t) { +void explicit_schedule_shim::set_times_ms(std::vector<arb::time_type> t) { times = std::move(t); // Sort the times in ascending order if necessary @@ -118,12 +121,12 @@ void explicit_schedule_shim::set_times(std::vector<arb::time_type> t) { } }; -std::vector<arb::time_type> explicit_schedule_shim::get_times() const { +std::vector<arb::time_type> explicit_schedule_shim::get_times_ms() const { return times; } arb::schedule explicit_schedule_shim::schedule() const { - return arb::explicit_schedule(times); + return arb::explicit_schedule_from_milliseconds(times); } std::vector<arb::time_type> explicit_schedule_shim::events(arb::time_type t0, arb::time_type t1) { @@ -135,71 +138,50 @@ std::vector<arb::time_type> explicit_schedule_shim::events(arb::time_type t0, ar return as_vector(sched.events(t0, t1)); } -// -// poisson_schedule shim -// - -poisson_schedule_shim::poisson_schedule_shim( - arb::time_type ts, - arb::time_type f, - rng_type::result_type s, - py::object tstop) -{ +poisson_schedule_shim::poisson_schedule_shim(const arb::units::quantity& ts, + const arb::units::quantity& f, + arb::seed_type s, + const arb::units::quantity& tstop) { set_tstart(ts); set_freq(f); seed = s; set_tstop(tstop); } -poisson_schedule_shim::poisson_schedule_shim(arb::time_type f) { - set_tstart(0.); - set_freq(f); - seed = 0; -} - -void poisson_schedule_shim::set_tstart(arb::time_type t) { - pyarb::assert_throw(is_nonneg()(t), "tstart must be a non-negative number"); +void poisson_schedule_shim::set_tstart(const arb::units::quantity& t) { + pyarb::assert_throw(is_nonneg()(t.value()), "tstart must be a non-negative number"); tstart = t; }; -void poisson_schedule_shim::set_freq(arb::time_type f) { - pyarb::assert_throw(is_nonneg()(f), "frequency must be a non-negative number"); +void poisson_schedule_shim::set_freq(const arb::units::quantity& f) { + pyarb::assert_throw(is_nonneg()(f.value()), "frequency must be a non-negative number"); freq = f; }; -void poisson_schedule_shim::set_tstop(py::object t) { - tstop = py2optional<arb::time_type>( - t, "tstop must be a non-negative number, or None", is_nonneg()); +void poisson_schedule_shim::set_tstop(const arb::units::quantity& t) { + pyarb::assert_throw(is_nonneg()(t.value()), "frequency must be a non-negative number"); + tstop = t; }; -arb::time_type poisson_schedule_shim::get_tstart() const { - return tstart; -} - -arb::time_type poisson_schedule_shim::get_freq() const { - return freq; -} - -poisson_schedule_shim::opt_time_type poisson_schedule_shim::get_tstop() const { - return tstop; -} - arb::schedule poisson_schedule_shim::schedule() const { - return arb::poisson_schedule(tstart, freq, rng_type(seed), tstop.value_or(arb::terminal_time)); + return arb::poisson_schedule(tstart, freq, seed, tstop); } -std::vector<arb::time_type> poisson_schedule_shim::events(arb::time_type t0, arb::time_type t1) { - pyarb::assert_throw(is_nonneg()(t0), "t0 must be a non-negative number"); - pyarb::assert_throw(is_nonneg()(t1), "t1 must be a non-negative number"); +std::vector<arb::time_type> poisson_schedule_shim::events(const arb::units::quantity& t0, + const arb::units::quantity& t1) { + auto beg = t0.value_as(arb::units::ms); + auto end = t1.value_as(arb::units::ms); + pyarb::assert_throw(is_nonneg()(beg), "t0 must be a non-negative number"); + pyarb::assert_throw(is_nonneg()(end), "t1 must be a non-negative number"); arb::schedule sched = poisson_schedule_shim::schedule(); - return as_vector(sched.events(t0, t1)); + return as_vector(sched.events(beg, end)); } void register_schedules(py::module& m) { using namespace py::literals; - using time_type = arb::time_type; + using time_type = arb::units::quantity; py::class_<schedule_shim_base> schedule_base(m, "schedule_base", "Schedule abstract base class."); @@ -208,13 +190,13 @@ void register_schedules(py::module& m) { "Describes a regular schedule with multiples of dt within the interval [tstart, tstop)."); regular_schedule - .def(py::init<time_type, time_type, py::object>(), + .def(py::init<const time_type&, const time_type&, std::optional<time_type>>(), "tstart"_a, "dt"_a, "tstop"_a = py::none(), "Construct a regular schedule with arguments:\n" " tstart: The delivery time of the first event in the sequence [ms].\n" " dt: The interval between time points [ms].\n" " tstop: No events delivered after this time [ms], None by default.") - .def(py::init<time_type>(), + .def(py::init<const time_type&>(), "dt"_a, "Construct a regular schedule, starting from t = 0 and never terminating, with arguments:\n" " dt: The interval between time points [ms].\n") @@ -240,10 +222,10 @@ void register_schedules(py::module& m) { "times"_a, "Construct an explicit schedule with argument:\n" " times: A list of times [ms], [] by default.") - .def_property("times", &explicit_schedule_shim::get_times, &explicit_schedule_shim::set_times, + .def_property("times_ms", &explicit_schedule_shim::get_times_ms, &explicit_schedule_shim::set_times_ms, "A list of times [ms].") .def("events", &explicit_schedule_shim::events, - "A view of monotonically increasing time values in the half-open interval [t0, t1).") + "A view of monotonically increasing time values in the half-open interval [t0, t1) in [ms].") .def("__str__", util::to_string<explicit_schedule_shim>) .def("__repr__", util::to_string<explicit_schedule_shim>); @@ -252,17 +234,19 @@ void register_schedules(py::module& m) { "Describes a schedule according to a Poisson process within the interval [tstart, tstop)."); poisson_schedule - .def(py::init<time_type, time_type, std::mt19937_64::result_type, py::object>(), - "tstart"_a = 0., "freq"_a, "seed"_a = 0, "tstop"_a = py::none(), - "Construct a Poisson schedule with arguments:\n" - " tstart: The delivery time of the first event in the sequence [ms], 0 by default.\n" - " freq: The expected frequency [kHz].\n" - " seed: The seed for the random number generator, 0 by default.\n" - " tstop: No events delivered after this time [ms], None by default.") - .def(py::init<time_type>(), - "freq"_a, - "Construct a Poisson schedule, starting from t = 0, default seed, with:\n" - " freq: The expected frequency [kHz], 10 by default.\n") + .def(py::init<>( + [](const time_type& f, + const time_type& t0, + arb::seed_type s, + std::optional<time_type> t1) -> poisson_schedule_shim { + return poisson_schedule_shim{t0, f, s, t1.value_or(arb::terminal_time*arb::units::ms)}; + }), + "freq"_a, py::kw_only(), py::arg_v("tstart", 0.*arb::units::ms, "0.0*arbor.units.ms"), "seed"_a = 0, "tstop"_a=py::none(), + "Construct a Poisson schedule with arguments:\n" + " tstart: The delivery time of the first event in the sequence [ms], 0 by default.\n" + " freq: The expected frequency [kHz].\n" + " seed: The seed for the random number generator, 0 by default.\n" + " tstop: No events delivered after this time [ms], None by default.") .def_property("tstart", &poisson_schedule_shim::get_tstart, &poisson_schedule_shim::set_tstart, "The delivery time of the first event in the sequence [ms].") .def_property("freq", &poisson_schedule_shim::get_freq, &poisson_schedule_shim::set_freq, diff --git a/python/schedule.hpp b/python/schedule.hpp index 619f77236adbecb3090dad8da873b9aa9dcb60d0..e321cb4d234f59952dd89e51fa1fe68226d505ab 100644 --- a/python/schedule.hpp +++ b/python/schedule.hpp @@ -1,7 +1,6 @@ #pragma once #include <optional> -#include <random> #include <vector> #include <pybind11/pybind11.h> @@ -16,8 +15,6 @@ namespace pyarb { // to an arb::schedule object. struct schedule_shim_base { schedule_shim_base() = default; - schedule_shim_base(const schedule_shim_base&) = delete; - schedule_shim_base& operator=(schedule_shim_base&) = delete; virtual ~schedule_shim_base() {} virtual arb::schedule schedule() const = 0; @@ -28,20 +25,23 @@ struct schedule_shim_base { // a regular_schedule in python are manipulating this type. This is converted to // an arb::regular_schedule when a C++ recipe is created from a Python recipe. struct regular_schedule_shim: schedule_shim_base { - using time_type = arb::time_type; + using time_type = arb::units::quantity; using opt_time_type = std::optional<time_type>; - time_type tstart = {}; - time_type dt = 0; - opt_time_type tstop = {}; + time_type tstart; + time_type dt = 0*arb::units::ms; + opt_time_type tstop; - regular_schedule_shim(time_type t0, time_type delta_t, pybind11::object t1); - explicit regular_schedule_shim(time_type delta_t); + regular_schedule_shim(const time_type& t0, + const time_type& delta_t, + opt_time_type t1); + + explicit regular_schedule_shim(const time_type& delta_t); // getter and setter (in order to assert when being set) - void set_tstart(time_type t); - void set_dt(time_type delta_t); - void set_tstop(pybind11::object t); + void set_tstart(const time_type& t); + void set_dt(const time_type& delta_t); + void set_tstop(opt_time_type t); time_type get_tstart() const; time_type get_dt() const; @@ -60,11 +60,11 @@ struct explicit_schedule_shim: schedule_shim_base { std::vector<arb::time_type> times; explicit_schedule_shim() = default; - explicit_schedule_shim(std::vector<arb::time_type> t); + explicit_schedule_shim(const std::vector<arb::units::quantity>& t); // getter and setter (in order to assert when being set) - void set_times(std::vector<arb::time_type> t); - std::vector<arb::time_type> get_times() const; + void set_times_ms(std::vector<arb::time_type> t); + std::vector<arb::time_type> get_times_ms() const; arb::schedule schedule() const override; @@ -76,28 +76,35 @@ struct explicit_schedule_shim: schedule_shim_base { // Python are manipulating this type. This is converted to an // arb::poisson_schedule when a C++ recipe is created from a Python recipe. struct poisson_schedule_shim: schedule_shim_base { - using rng_type = std::mt19937_64; - using opt_time_type = std::optional<arb::time_type>; + arb::units::quantity tstart; // ms + arb::units::quantity freq; // kHz + arb::units::quantity tstop; // ms + arb::seed_type seed = arb::default_seed; - arb::time_type tstart; // ms - arb::time_type freq; // kHz - opt_time_type tstop; // ms - rng_type::result_type seed; + poisson_schedule_shim(const poisson_schedule_shim&) = default; + poisson_schedule_shim(poisson_schedule_shim&&) = default; - poisson_schedule_shim(arb::time_type ts, arb::time_type f, rng_type::result_type s, pybind11::object tstop); - poisson_schedule_shim(arb::time_type f); + poisson_schedule_shim() = default; + ~poisson_schedule_shim() = default; - void set_tstart(arb::time_type t); - void set_freq(arb::time_type f); - void set_tstop(pybind11::object t); + poisson_schedule_shim(const arb::units::quantity& ts, + const arb::units::quantity& f, + arb::seed_type s, + const arb::units::quantity& tstop); - arb::time_type get_tstart() const; - arb::time_type get_freq() const; - opt_time_type get_tstop() const; + void set_tstart(const arb::units::quantity& t); + void set_freq(const arb::units::quantity& f); + void set_tstop(const arb::units::quantity& f); - arb::schedule schedule() const override; + const auto& get_tstop() const { return tstop; } + const auto& get_tstart() const { return tstart; } + const auto& get_freq() const { return freq; } + + // TODO(TH) this should be symmetrical... + std::vector<arb::time_type> events(const arb::units::quantity& t0, const arb::units::quantity& t1); + + arb::schedule schedule() const; - std::vector<arb::time_type> events(arb::time_type t0, arb::time_type t1); }; } diff --git a/python/simulation.cpp b/python/simulation.cpp index 71abd3b0be47abe6a983f9dd2d924f88d48452a0..d7ea8a9ad2d3588d7ddaf45a08c312d9c7a1deb2 100644 --- a/python/simulation.cpp +++ b/python/simulation.cpp @@ -1,6 +1,8 @@ #include <memory> #include <pybind11/numpy.h> #include <pybind11/pybind11.h> +#include <pybind11/stl.h> +#include <pybind11/functional.h> #include <arbor/common_types.hpp> #include <arbor/sampling.hpp> @@ -116,7 +118,7 @@ public: } } - arb::time_type run(arb::time_type tfinal, arb::time_type dt) { + arb::time_type run(const arb::units::quantity& tfinal, const arb::units::quantity& dt) { return sim_->run(tfinal, dt); } @@ -201,8 +203,8 @@ public: } }; -void register_simulation(pybind11::module& m, pyarb_global_ptr global_ptr) { - using namespace pybind11::literals; +void register_simulation(py::module& m, pyarb_global_ptr global_ptr) { + using namespace py::literals; py::enum_<spike_recording>(m, "spike_recording") .value("off", spike_recording::off) @@ -216,57 +218,58 @@ void register_simulation(pybind11::module& m, pyarb_global_ptr global_ptr) { simulation // A custom constructor that wraps a python recipe with arb::recipe_shim // before forwarding it to the arb::recipe constructor. - .def(pybind11::init( + .def(py::init( [global_ptr](std::shared_ptr<recipe>& rec, - const std::shared_ptr<context_shim>& ctx_, - const std::optional<arb::domain_decomposition>& decomp, + std::optional<std::shared_ptr<context_shim>> ctx_, + std::optional<arb::domain_decomposition> decomp, std::uint64_t seed) { - try { - auto ctx = ctx_ ? ctx_ : std::make_shared<context_shim>(make_context_shim()); - auto dec = decomp.value_or(arb::partition_load_balance(recipe_shim(rec), ctx->context)); - return new simulation_shim(rec, *ctx, dec, seed, global_ptr); - } - catch (...) { - py_reset_and_throw(); - throw; - } - }), - // Release the python gil, so that callbacks into the python recipe don't deadlock. - pybind11::call_guard<pybind11::gil_scoped_release>(), - "Initialize the model described by a recipe, with cells and network distributed\n" - "according to the domain decomposition and computational resources described by a context.", + try { + auto ctx = ctx_.value_or(std::make_shared<context_shim>(make_context_shim())); + auto dec = decomp.value_or(arb::partition_load_balance(recipe_shim(rec), ctx->context)); + return new simulation_shim(rec, *ctx, dec, seed, global_ptr); + } + catch (...) { + py_reset_and_throw(); + throw; + } + }), + // Release the python gil, so that callbacks into the python recipe don't deadlock. + py::call_guard<py::gil_scoped_release>(), "recipe"_a, - pybind11::arg_v("context", pybind11::none(), "Execution context"), - pybind11::arg_v("domains", pybind11::none(), "Domain decomposition"), - pybind11::arg_v("seed", 0u, "Random number generator seed")) + "context"_a=py::none(), + "domains"_a=py::none(), + "seed"_a=0u, + "Initialize the model described by a recipe, with cells and network distributed\n" + "according to the domain decomposition and computational resources described by a\n" + "context. Initialize PRNG using seed") .def("set_remote_spike_filter", - &simulation_shim::set_remote_spike_filter, - "pred"_a, - "Add a callback to filter spikes going out over external connections. `pred` is" - "a callable on the `spike` type. **Caution**: This will be extremely slow; use C++ " - "if you want to make use of this.") + &simulation_shim::set_remote_spike_filter, + "pred"_a, + "Add a callback to filter spikes going out over external connections. `pred` is" + "a callable on the `spike` type. **Caution**: This will be extremely slow; use C++ " + "if you want to make use of this.") .def("update", &simulation_shim::update, - pybind11::call_guard<pybind11::gil_scoped_release>(), + py::call_guard<py::gil_scoped_release>(), "Rebuild the connection table from recipe::connections_on and the event" "generators based on recipe::event_generators.", "recipe"_a) .def("deserialize", &simulation_shim::deserialize, - pybind11::call_guard<pybind11::gil_scoped_release>(), + py::call_guard<py::gil_scoped_release>(), "Deserialize the simulation object from a JSON string." "json"_a) .def("serialize", &simulation_shim::serialize, - pybind11::call_guard<pybind11::gil_scoped_release>(), + py::call_guard<py::gil_scoped_release>(), "Serialize the simulation object to a JSON string.") .def("reset", &simulation_shim::reset, - pybind11::call_guard<pybind11::gil_scoped_release>(), + py::call_guard<py::gil_scoped_release>(), "Reset the state of the simulation to its initial state.") .def("clear_samplers", &simulation_shim::clear_samplers, - pybind11::call_guard<pybind11::gil_scoped_release>(), + py::call_guard<py::gil_scoped_release>(), "Clearing spike and sample information. restoring memory") .def("run", &simulation_shim::run, - pybind11::call_guard<pybind11::gil_scoped_release>(), + py::call_guard<py::gil_scoped_release>(), "Run the simulation from current simulation time to tfinal [ms], with maximum time step size dt [ms].", - "tfinal"_a, "dt"_a=0.025) + "tfinal"_a, py::arg_v("dt", 0.025*arb::units::ms, "0.025*arbor.units.ms")) .def("record", &simulation_shim::record, "Disable or enable local or global spike recording.") .def("spikes", &simulation_shim::spikes, diff --git a/python/single_cell_model.cpp b/python/single_cell_model.cpp index 020a637373dcd98305a14cf37e374d6148b8b6c0..6bd0f7b0011048ded935dad0d6101fd6f97b68e3 100644 --- a/python/single_cell_model.cpp +++ b/python/single_cell_model.cpp @@ -18,7 +18,7 @@ #include "event_generator.hpp" #include "error.hpp" #include "strprintf.hpp" -#include "proxy.hpp" +#include "label_dict.hpp" using arb::util::any_cast; @@ -34,7 +34,7 @@ namespace pyarb { // Stores the location and sampling frequency for a probe in a single cell model. struct probe_site { arb::locset locset; // Location of sample on morphology. - double frequency; // Sampling frequency [kHz]. + arb::units::quantity frequency; // Sampling frequency [kHz]. arb::cell_tag_type tag; // Tag = unique name }; @@ -161,12 +161,15 @@ public: // m.probe('voltage', '(location 2 0.5)') // m.probe('voltage', 'term') - void probe(const std::string& what, const arb::locset& where, const arb::cell_tag_type& tag, double frequency) { + void probe(const std::string& what, + const arb::locset& where, + const arb::cell_tag_type& tag, + const arb::units::quantity& frequency) { if (what != "voltage") { throw pyarb_error( util::pprintf("{} does not name a valid variable to trace (currently only 'voltage' is supported)", what)); } - if (frequency<=0) { + if (frequency.value() <= 0) { throw pyarb_error( util::pprintf("sampling frequency is not greater than zero", what)); } @@ -177,7 +180,7 @@ public: event_generators_.push_back(event_generator); } - void run(double tfinal, double dt) { + void run(const arb::units::quantity& tfinal, const arb::units::quantity& dt) { single_cell_recipe rec(cell_, probes_, gprop, event_generators_); auto domdec = arb::partition_load_balance(rec, ctx_); @@ -238,24 +241,24 @@ void register_single_cell(pybind11::module& m) { const label_dict_proxy& l) -> single_cell_model { return single_cell_model(arb::cable_cell({m}, d, l.dict)); }), - "tree"_a, "decor"_a, "labels"_a=arb::decor{}, + "tree"_a, "decor"_a, "labels"_a=label_dict_proxy{}, "Build single cell model from cable cell components") .def(pybind11::init([](const arb::morphology& m, const arb::decor& d, const label_dict_proxy& l) -> single_cell_model { return single_cell_model(arb::cable_cell(m, d, l.dict)); }), - "morph"_a, "decor"_a, "labels"_a=arb::decor{}, + "morph"_a, "decor"_a, "labels"_a=label_dict_proxy{}, "Build single cell model from cable cell components") .def(pybind11::init<arb::cable_cell>(), "cell"_a, "Initialise a single cell model for a cable cell.") .def("run", &single_cell_model::run, "tfinal"_a, - "dt"_a = 0.025, + pybind11::arg_v("dt", 0.025*arb::units::ms, "0.025*arbor.units.ms"), "Run model from t=0 to t=tfinal ms.") .def("probe", - [](single_cell_model& m, const char* what, const char* where, const char* tag, double frequency) { + [](single_cell_model& m, const char* what, const char* where, const char* tag, const arb::units::quantity& frequency) { m.probe(what, arborio::parse_locset_expression(where).unwrap(), tag, frequency);}, "what"_a, "where"_a, "tag"_a, "frequency"_a, "Sample a variable on the cell.\n" @@ -264,7 +267,7 @@ void register_single_cell(pybind11::module& m) { " tag: Unique name for this probe.\n" " frequency: The target frequency at which to sample [kHz].") .def("probe", - [](single_cell_model& m, const char* what, const arb::mlocation& where, const char* tag, double frequency) { + [](single_cell_model& m, const char* what, const arb::mlocation& where, const char* tag, const arb::units::quantity& frequency) { m.probe(what, where, tag, frequency);}, "what"_a, "where"_a, "tag"_a, "frequency"_a, "Sample a variable on the cell.\n" diff --git a/python/stubs/arbor/__init__.pyi b/python/stubs/arbor/__init__.pyi new file mode 100644 index 0000000000000000000000000000000000000000..12a28c97542f832931e69a9e5ca229d25441ef21 --- /dev/null +++ b/python/stubs/arbor/__init__.pyi @@ -0,0 +1,287 @@ +from __future__ import annotations +from arbor._arbor import ArbFileNotFoundError +from arbor._arbor import ArbValueError +from arbor._arbor import MechCatItemIterator +from arbor._arbor import MechCatKeyIterator +from arbor._arbor import MechCatValueIterator +from arbor._arbor import allen_catalogue +from arbor._arbor import asc_morphology +from arbor._arbor import axial_resistivity +from arbor._arbor import backend +from arbor._arbor import bbp_catalogue +from arbor._arbor import benchmark_cell +from arbor._arbor import cable +from arbor._arbor import cable_cell +from arbor._arbor import cable_component +from arbor._arbor import cable_global_properties +from arbor._arbor import cable_probe_axial_current +from arbor._arbor import cable_probe_density_state +from arbor._arbor import cable_probe_density_state_cell +from arbor._arbor import cable_probe_ion_current_cell +from arbor._arbor import cable_probe_ion_current_density +from arbor._arbor import cable_probe_ion_diff_concentration +from arbor._arbor import cable_probe_ion_diff_concentration_cell +from arbor._arbor import cable_probe_ion_ext_concentration +from arbor._arbor import cable_probe_ion_ext_concentration_cell +from arbor._arbor import cable_probe_ion_int_concentration +from arbor._arbor import cable_probe_ion_int_concentration_cell +from arbor._arbor import cable_probe_membrane_voltage +from arbor._arbor import cable_probe_membrane_voltage_cell +from arbor._arbor import cable_probe_point_info +from arbor._arbor import cable_probe_point_state +from arbor._arbor import cable_probe_point_state_cell +from arbor._arbor import cable_probe_stimulus_current_cell +from arbor._arbor import cable_probe_total_current_cell +from arbor._arbor import cable_probe_total_ion_current_cell +from arbor._arbor import cable_probe_total_ion_current_density +from arbor._arbor import catalogue +from arbor._arbor import cell_address +from arbor._arbor import cell_cv_data +from arbor._arbor import cell_global_label +from arbor._arbor import cell_kind +from arbor._arbor import cell_local_label +from arbor._arbor import cell_member +from arbor._arbor import component_meta_data +from arbor._arbor import config +from arbor._arbor import connection +from arbor._arbor import context +from arbor._arbor import cv_data +from arbor._arbor import cv_policy +from arbor._arbor import cv_policy_every_segment +from arbor._arbor import cv_policy_explicit +from arbor._arbor import cv_policy_fixed_per_branch +from arbor._arbor import cv_policy_max_extent +from arbor._arbor import cv_policy_single +from arbor._arbor import decor +from arbor._arbor import default_catalogue +from arbor._arbor import density +from arbor._arbor import domain_decomposition +from arbor._arbor import env +from arbor._arbor import event_generator +from arbor._arbor import explicit_schedule +from arbor._arbor import ext_concentration +from arbor._arbor import extent +from arbor._arbor import gap_junction_connection +from arbor._arbor import group_description +from arbor._arbor import iclamp +from arbor._arbor import int_concentration +from arbor._arbor import intersect_region +from arbor._arbor import ion_data +from arbor._arbor import ion_dependency +from arbor._arbor import ion_diffusivity +from arbor._arbor import ion_settings +from arbor._arbor import isometry +from arbor._arbor import junction +from arbor._arbor import label_dict +from arbor._arbor import lif_cell +from arbor._arbor import lif_probe_metadata +from arbor._arbor import lif_probe_voltage +from arbor._arbor import load_asc +from arbor._arbor import load_catalogue +from arbor._arbor import load_component +from arbor._arbor import load_swc_arbor +from arbor._arbor import load_swc_neuron +from arbor._arbor import location +from arbor._arbor import mechanism +from arbor._arbor import mechanism_field +from arbor._arbor import mechanism_info +from arbor._arbor import membrane_capacitance +from arbor._arbor import membrane_potential +from arbor._arbor import meter_manager +from arbor._arbor import meter_report +from arbor._arbor import morphology +from arbor._arbor import morphology_provider +from arbor._arbor import mpoint +from arbor._arbor import msegment +from arbor._arbor import neuroml +from arbor._arbor import neuroml_morph_data +from arbor._arbor import neuron_cable_properties +from arbor._arbor import partition_by_group +from arbor._arbor import partition_hint +from arbor._arbor import partition_load_balance +from arbor._arbor import place_pwlin +from arbor._arbor import poisson_schedule +from arbor._arbor import print_config +from arbor._arbor import probe +from arbor._arbor import proc_allocation +from arbor._arbor import recipe +from arbor._arbor import regular_schedule +from arbor._arbor import reversal_potential +from arbor._arbor import reversal_potential_method +from arbor._arbor import scaled_mechanism +from arbor._arbor import schedule_base +from arbor._arbor import segment_tree +from arbor._arbor import selection_policy +from arbor._arbor import simulation +from arbor._arbor import single_cell_model +from arbor._arbor import spike +from arbor._arbor import spike_recording +from arbor._arbor import spike_source_cell +from arbor._arbor import stochastic_catalogue +from arbor._arbor import synapse +from arbor._arbor import temperature +from arbor._arbor import threshold_detector +from arbor._arbor import trace +from arbor._arbor import units +from arbor._arbor import voltage_process +from arbor._arbor import write_component +from . import _arbor + +__all__ = [ + "ArbFileNotFoundError", + "ArbValueError", + "MechCatItemIterator", + "MechCatKeyIterator", + "MechCatValueIterator", + "allen_catalogue", + "asc_morphology", + "axial_resistivity", + "backend", + "bbp_catalogue", + "benchmark_cell", + "build_catalogue", + "cable", + "cable_cell", + "cable_component", + "cable_global_properties", + "cable_probe_axial_current", + "cable_probe_density_state", + "cable_probe_density_state_cell", + "cable_probe_ion_current_cell", + "cable_probe_ion_current_density", + "cable_probe_ion_diff_concentration", + "cable_probe_ion_diff_concentration_cell", + "cable_probe_ion_ext_concentration", + "cable_probe_ion_ext_concentration_cell", + "cable_probe_ion_int_concentration", + "cable_probe_ion_int_concentration_cell", + "cable_probe_membrane_voltage", + "cable_probe_membrane_voltage_cell", + "cable_probe_point_info", + "cable_probe_point_state", + "cable_probe_point_state_cell", + "cable_probe_stimulus_current_cell", + "cable_probe_total_current_cell", + "cable_probe_total_ion_current_cell", + "cable_probe_total_ion_current_density", + "catalogue", + "cell_address", + "cell_cv_data", + "cell_global_label", + "cell_kind", + "cell_local_label", + "cell_member", + "component_meta_data", + "config", + "connection", + "context", + "cv_data", + "cv_policy", + "cv_policy_every_segment", + "cv_policy_explicit", + "cv_policy_fixed_per_branch", + "cv_policy_max_extent", + "cv_policy_single", + "decor", + "default_catalogue", + "density", + "domain_decomposition", + "env", + "event_generator", + "explicit_schedule", + "ext_concentration", + "extent", + "gap_junction_connection", + "group_description", + "iclamp", + "int_concentration", + "intersect_region", + "ion_data", + "ion_dependency", + "ion_diffusivity", + "ion_settings", + "isometry", + "junction", + "label_dict", + "lif_cell", + "lif_probe_metadata", + "lif_probe_voltage", + "load_asc", + "load_catalogue", + "load_component", + "load_swc_arbor", + "load_swc_neuron", + "location", + "mechanism", + "mechanism_field", + "mechanism_info", + "membrane_capacitance", + "membrane_potential", + "meter_manager", + "meter_report", + "mnpos", + "modcc", + "morphology", + "morphology_provider", + "mpoint", + "msegment", + "neuroml", + "neuroml_morph_data", + "neuron_cable_properties", + "partition_by_group", + "partition_hint", + "partition_load_balance", + "place_pwlin", + "poisson_schedule", + "print_config", + "probe", + "proc_allocation", + "recipe", + "regular_schedule", + "reversal_potential", + "reversal_potential_method", + "scaled_mechanism", + "schedule_base", + "segment_tree", + "selection_policy", + "simulation", + "single_cell_model", + "spike", + "spike_recording", + "spike_source_cell", + "stochastic_catalogue", + "synapse", + "temperature", + "threshold_detector", + "trace", + "units", + "voltage_process", + "write_component", +] + +def build_catalogue(): ... +def modcc(): ... + +__config__: dict = { + "mpi": False, + "mpi4py": False, + "gpu": None, + "vectorize": True, + "profiling": False, + "neuroml": True, + "bundled": True, + "version": "0.9.1-dev", + "source": "2023-12-08T14:40:50+01:00 327c56d229571dac097e7400a9b5e04fc8d7a514 modified", + "build_config": "DEBUG", + "arch": "native", + "prefix": "/usr/local", + "python_lib_path": "/opt/homebrew/lib/python3.11/site-packages", + "binary_path": "bin", + "lib_path": "lib", + "data_path": "share", + "CXX": "/opt/homebrew/bin/clang++", + "pybind-version": "2.11.1", + "timestamp": "Jan 2 2024 09:57:33", +} +__version__: str = "0.9.1-dev" +mnpos: int = 4294967295 diff --git a/python/stubs/arbor/_arbor/__init__.pyi b/python/stubs/arbor/_arbor/__init__.pyi new file mode 100644 index 0000000000000000000000000000000000000000..aabd4f3de210a0e84da571d95e2cccc55ffb9198 --- /dev/null +++ b/python/stubs/arbor/_arbor/__init__.pyi @@ -0,0 +1,2991 @@ +""" +arbor: multicompartment neural network models. +""" +from __future__ import annotations +import typing +from . import env +from . import units + +__all__ = [ + "ArbFileNotFoundError", + "ArbValueError", + "MechCatItemIterator", + "MechCatKeyIterator", + "MechCatValueIterator", + "allen_catalogue", + "asc_morphology", + "axial_resistivity", + "backend", + "bbp_catalogue", + "benchmark_cell", + "cable", + "cable_cell", + "cable_component", + "cable_global_properties", + "cable_probe_axial_current", + "cable_probe_density_state", + "cable_probe_density_state_cell", + "cable_probe_ion_current_cell", + "cable_probe_ion_current_density", + "cable_probe_ion_diff_concentration", + "cable_probe_ion_diff_concentration_cell", + "cable_probe_ion_ext_concentration", + "cable_probe_ion_ext_concentration_cell", + "cable_probe_ion_int_concentration", + "cable_probe_ion_int_concentration_cell", + "cable_probe_membrane_voltage", + "cable_probe_membrane_voltage_cell", + "cable_probe_point_info", + "cable_probe_point_state", + "cable_probe_point_state_cell", + "cable_probe_stimulus_current_cell", + "cable_probe_total_current_cell", + "cable_probe_total_ion_current_cell", + "cable_probe_total_ion_current_density", + "catalogue", + "cell_address", + "cell_cv_data", + "cell_global_label", + "cell_kind", + "cell_local_label", + "cell_member", + "component_meta_data", + "config", + "connection", + "context", + "cv_data", + "cv_policy", + "cv_policy_every_segment", + "cv_policy_explicit", + "cv_policy_fixed_per_branch", + "cv_policy_max_extent", + "cv_policy_single", + "decor", + "default_catalogue", + "density", + "domain_decomposition", + "env", + "event_generator", + "explicit_schedule", + "ext_concentration", + "extent", + "gap_junction_connection", + "group_description", + "iclamp", + "int_concentration", + "intersect_region", + "ion_data", + "ion_dependency", + "ion_diffusivity", + "ion_settings", + "isometry", + "junction", + "label_dict", + "lif_cell", + "lif_probe_metadata", + "lif_probe_voltage", + "load_asc", + "load_catalogue", + "load_component", + "load_swc_arbor", + "load_swc_neuron", + "location", + "mechanism", + "mechanism_field", + "mechanism_info", + "membrane_capacitance", + "membrane_potential", + "meter_manager", + "meter_report", + "mnpos", + "morphology", + "morphology_provider", + "mpoint", + "msegment", + "neuroml", + "neuroml_morph_data", + "neuron_cable_properties", + "partition_by_group", + "partition_hint", + "partition_load_balance", + "place_pwlin", + "poisson_schedule", + "print_config", + "probe", + "proc_allocation", + "recipe", + "regular_schedule", + "reversal_potential", + "reversal_potential_method", + "scaled_mechanism", + "schedule_base", + "segment_tree", + "selection_policy", + "simulation", + "single_cell_model", + "spike", + "spike_recording", + "spike_source_cell", + "stochastic_catalogue", + "synapse", + "temperature", + "threshold_detector", + "trace", + "units", + "voltage_process", + "write_component", +] + +class ArbFileNotFoundError(FileNotFoundError): + pass + +class ArbValueError(ValueError): + pass + +class MechCatItemIterator: + def __iter__(self) -> MechCatItemIterator: ... + def __next__(self) -> tuple[str, mechanism_info]: ... + +class MechCatKeyIterator: + def __iter__(self) -> MechCatKeyIterator: ... + def __next__(self) -> str: ... + +class MechCatValueIterator: + def __iter__(self) -> MechCatValueIterator: ... + def __next__(self) -> mechanism_info: ... + +class asc_morphology: + """ + The morphology and label dictionary meta-data loaded from a Neurolucida ASCII (.asc) file. + """ + + @property + def labels(self) -> label_dict: + """ + The four canonical regions are labeled 'soma', 'axon', 'dend' and 'apic'. + """ + @property + def morphology(self) -> morphology: + """ + The cable cell morphology. + """ + @property + def segment_tree(self) -> segment_tree: + """ + The raw segment tree. + """ + +class axial_resistivity: + """ + Setting the axial resistivity. + """ + + def __init__(self, arg0: units.quantity) -> None: ... + def __repr__(self) -> str: ... + +class backend: + """ + Enumeration used to indicate which hardware backend to execute a cell group on. + + Members: + + gpu : Use GPU backend. + + multicore : Use multicore backend. + """ + + __members__: typing.ClassVar[ + dict[str, backend] + ] # value = {'gpu': <backend.gpu: 1>, 'multicore': <backend.multicore: 0>} + gpu: typing.ClassVar[backend] # value = <backend.gpu: 1> + multicore: typing.ClassVar[backend] # value = <backend.multicore: 0> + def __eq__(self, other: typing.Any) -> bool: ... + def __getstate__(self) -> int: ... + def __hash__(self) -> int: ... + def __index__(self) -> int: ... + def __init__(self, value: int) -> None: ... + def __int__(self) -> int: ... + def __ne__(self, other: typing.Any) -> bool: ... + def __repr__(self) -> str: ... + def __setstate__(self, state: int) -> None: ... + def __str__(self) -> str: ... + @property + def name(self) -> str: ... + @property + def value(self) -> int: ... + +class benchmark_cell: + """ + A benchmarking cell, used by Arbor developers to test communication performance. + A benchmark cell generates spikes at a user-defined sequence of time points, and + the time taken to integrate a cell can be tuned by setting the realtime_ratio, + for example if realtime_ratio=2, a cell will take 2 seconds of CPU time to + simulate 1 second. + """ + + @typing.overload + def __init__( + self, + source_label: str, + target_label: str, + schedule: regular_schedule, + realtime_ratio: float = 1.0, + ) -> None: + """ + Construct a benchmark cell that generates spikes on 'source_label' at regular intervals. + The cell has one source labeled 'source_label', and one target labeled 'target_label'. + """ + @typing.overload + def __init__( + self, + source_label: str, + target_label: str, + schedule: explicit_schedule, + realtime_ratio: float = 1.0, + ) -> None: + """ + Construct a benchmark cell that generates spikes on 'source_label' at a sequence of user-defined times. + The cell has one source labeled 'source_label', and one target labeled 'target_label'. + """ + @typing.overload + def __init__( + self, + source_label: str, + target_label: str, + schedule: poisson_schedule, + realtime_ratio: float = 1.0, + ) -> None: + """ + Construct a benchmark cell that generates spikeson 'source_label' at times defined by a Poisson sequence. + The cell has one source labeled 'source_label', and one target labeled 'target_label'. + """ + def __repr__(self) -> str: ... + def __str__(self) -> str: ... + +class cable: + __hash__: typing.ClassVar[None] = None + def __eq__(self, arg0: cable) -> bool: ... + def __init__(self, branch: int, prox: float, dist: float) -> None: ... + def __repr__(self) -> str: ... + def __str__(self) -> str: ... + @property + def branch(self) -> int: + """ + The id of the branch on which the cable lies. + """ + @property + def dist(self) -> float: + """ + The relative position of the distal end of the cable on its branch ∈ [0,1]. + """ + @property + def prox(self) -> float: + """ + The relative position of the proximal end of the cable on its branch ∈ [0,1]. + """ + +class cable_cell: + """ + Represents morphologically-detailed cell models, with morphology represented as a + tree of one-dimensional cable segments. + """ + + @typing.overload + def __init__( + self, morphology: morphology, decor: decor, labels: label_dict | None = None + ) -> None: + """ + Construct with a morphology, decor, and label dictionary. + """ + @typing.overload + def __init__( + self, segment_tree: segment_tree, decor: decor, labels: label_dict | None = None + ) -> None: + """ + Construct with a morphology derived from a segment tree, decor, and label dictionary. + """ + def __repr__(self) -> str: ... + def __str__(self) -> str: ... + def cables(self, label: str) -> list[cable]: + """ + The cable segments of the cell morphology for a region label. + """ + def locations(self, label: str) -> list[location]: + """ + The locations of the cell morphology for a locset label. + """ + @property + def num_branches(self) -> int: + """ + The number of unbranched cable sections in the morphology. + """ + +class cable_component: + def __repr__(self) -> str: ... + def __str__(self) -> str: ... + @property + def component(self) -> morphology | label_dict | decor | cable_cell: + """ + cable-cell component. + """ + @property + def meta_data(self) -> component_meta_data: + """ + cable-cell component meta-data. + """ + @meta_data.setter + def meta_data(self, arg0: component_meta_data) -> None: ... + +class cable_global_properties: + membrane_voltage_limit: float | None + @typing.overload + def __init__(self) -> None: ... + @typing.overload + def __init__(self, arg0: cable_global_properties) -> None: ... + def __str__(self) -> str: ... + def check(self) -> None: + """ + Test whether all default parameters and ion species properties have been set. + """ + def set_ion( + self, + ion: str, + valence: int | None = None, + int_con: units.quantity | None = None, + ext_con: units.quantity | None = None, + rev_pot: units.quantity | None = None, + method: typing.Any = None, + diff: units.quantity | None = None, + ) -> None: + """ + Set the global default properties of ion species named 'ion'. + * valence: valence of the ion species [e]. + * int_con: initial internal concentration [mM]. + * ext_con: initial external concentration [mM]. + * rev_pot: reversal potential [mV]. + * method: mechanism for calculating reversal potential. + * diff: diffusivity [m^2/s]. + There are 3 ion species predefined in arbor: 'ca', 'na' and 'k'. + If 'ion' in not one of these ions it will be added to the list, making it + available to mechanisms. The user has to provide the valence of a previously + undefined ion the first time this function is called with it as an argument. + Species concentrations and reversal potential can be overridden on + specific regions using the paint interface, while the method for calculating + reversal potential is global for all compartments in the cell, and can't be + overriden locally. + """ + def set_property( + self, + Vm: units.quantity | None = None, + cm: units.quantity | None = None, + rL: units.quantity | None = None, + tempK: units.quantity | None = None, + ) -> None: + """ + Set global default values for cable and cell properties. + * Vm: initial membrane voltage [mV]. + * cm: membrane capacitance [F/m²]. + * rL: axial resistivity [Ω·cm]. + * tempK: temperature [Kelvin]. + These values can be overridden on specific regions using the paint interface. + """ + def unset_ion(self, arg0: str) -> None: + """ + Remove ion species from properties. + """ + @property + def axial_resistivity(self) -> float | None: ... + @axial_resistivity.setter + def axial_resistivity(self, arg1: float) -> None: ... + @property + def catalogue(self) -> catalogue: + """ + The mechanism catalogue. + """ + @catalogue.setter + def catalogue(self, arg0: catalogue) -> None: ... + @property + def coalesce_synapses(self) -> bool: + """ + Flag for enabling/disabling linear syanpse coalescing. + """ + @coalesce_synapses.setter + def coalesce_synapses(self, arg0: bool) -> None: ... + @property + def ion_data(self) -> dict[str, ion_data]: ... + @property + def ion_reversal_potential(self) -> dict[str, mechanism]: ... + @property + def ion_valence(self) -> dict[str, int]: ... + @property + def ions(self) -> dict[str, ion_settings]: + """ + Return a view of all ion settings. + """ + @property + def membrane_capacitance(self) -> float | None: ... + @membrane_capacitance.setter + def membrane_capacitance(self, arg1: float) -> None: ... + @property + def membrane_potential(self) -> float | None: ... + @membrane_potential.setter + def membrane_potential(self, arg1: float) -> None: ... + @property + def temperature(self) -> float | None: ... + @temperature.setter + def temperature(self, arg1: float) -> None: ... + +class cable_probe_point_info: + """ + Probe metadata associated with a cable cell probe for point process state. + """ + + def __repr__(self) -> str: ... + def __str__(self) -> str: ... + @property + def location(self) -> location: + """ + Location of point process instance on cell. + """ + @location.setter + def location(self, arg0: location) -> None: ... + @property + def multiplicity(self) -> int: + """ + Number of coalesced point processes (linear synapses) associated with this instance. + """ + @multiplicity.setter + def multiplicity(self, arg0: int) -> None: ... + @property + def target(self) -> int: + """ + The target index of the point process instance on the cell. + """ + @target.setter + def target(self, arg0: int) -> None: ... + +class catalogue: + def __contains__(self, name: str) -> bool: + """ + Is 'name' in the catalogue? + """ + def __getitem__(self, arg0: str) -> mechanism_info: ... + @typing.overload + def __init__(self) -> None: ... + @typing.overload + def __init__(self, arg0: catalogue) -> None: ... + def __iter__(self) -> MechCatKeyIterator: + """ + Return an iterator over all mechanism names in this catalogues. + """ + def __repr__(self) -> str: ... + def __str__(self) -> str: ... + def derive( + self, + name: str, + parent: str, + globals: dict[str, float] = {}, + ions: dict[str, str] = {}, + ) -> None: ... + def extend(self, other: catalogue, prefix: str) -> None: + """ + Import another catalogue, possibly with a prefix. Will overwrite in case of name collisions. + """ + def is_derived(self, name: str) -> bool: + """ + Is 'name' a derived mechanism or can it be implicitly derived? + """ + def items(self) -> MechCatItemIterator: + """ + Return an iterator over all (name, mechanism) tuples in this catalogues. + """ + def keys(self) -> MechCatKeyIterator: + """ + Return an iterator over all mechanism names in this catalogues. + """ + def values(self) -> MechCatValueIterator: + """ + Return an iterator over all mechanism info values in this catalogues. + """ + +class cell_address: + gid: int + tag: str + +class cell_cv_data: + """ + Provides information on the CVs representing the discretization of a cable-cell. + """ + + def __repr__(self) -> str: ... + def __str__(self) -> str: ... + def cables(self, index: int) -> list[cable]: + """ + Return a list of cables representing the CV at the given index. + """ + def children(self, index: int) -> list[int]: + """ + Return a list of indices of the CVs representing the children of the CV at the given index. + """ + def parent(self, index: int) -> int: + """ + Return the index of the CV representing the parent of the CV at the given index. + """ + @property + def num_cv(self) -> int: + """ + Return the number of CVs in the cell. + """ + +class cell_global_label: + """ + For global identification of an item. + + cell_global_label members: + (1) a unique cell identified by its gid. + (2) a cell_local_label, referring to a labeled group of items on the cell and a policy for selecting a single item out of the group. + """ + + @typing.overload + def __init__(self, gid: int, label: str) -> None: + """ + Construct a cell_global_label identifier from a gid and a label argument identifying an item on the cell. + The default round_robin policy is used for selecting one of possibly multiple items on the cell associated with the label. + """ + @typing.overload + def __init__(self, gid: int, label: cell_local_label) -> None: + """ + Construct a cell_global_label identifier with arguments: + gid: The global identifier of the cell. + label: The cell_local_label representing the label and selection policy of an item on the cell. + """ + @typing.overload + def __init__(self, arg0: tuple) -> None: + """ + Construct a cell_global_label identifier with tuple argument (gid, label): + gid: The global identifier of the cell. + label: The cell_local_label representing the label and selection policy of an item on the cell. + """ + def __repr__(self) -> str: ... + def __str__(self) -> str: ... + @property + def gid(self) -> int: + """ + The global identifier of the cell. + """ + @gid.setter + def gid(self, arg0: int) -> None: ... + @property + def label(self) -> cell_local_label: + """ + The cell_local_label representing the label and selection policy of an item on the cell. + """ + @label.setter + def label(self, arg0: cell_local_label) -> None: ... + +class cell_kind: + """ + Enumeration used to identify the cell kind, used by the model to group equal kinds in the same cell group. + + Members: + + benchmark : Proxy cell used for benchmarking. + + cable : A cell with morphology described by branching 1D cable segments. + + lif : Leaky-integrate and fire neuron. + + spike_source : Proxy cell that generates spikes from a spike sequence provided by the user. + """ + + __members__: typing.ClassVar[ + dict[str, cell_kind] + ] # value = {'benchmark': <cell_kind.benchmark: 3>, 'cable': <cell_kind.cable: 0>, 'lif': <cell_kind.lif: 1>, 'spike_source': <cell_kind.spike_source: 2>} + benchmark: typing.ClassVar[cell_kind] # value = <cell_kind.benchmark: 3> + cable: typing.ClassVar[cell_kind] # value = <cell_kind.cable: 0> + lif: typing.ClassVar[cell_kind] # value = <cell_kind.lif: 1> + spike_source: typing.ClassVar[cell_kind] # value = <cell_kind.spike_source: 2> + def __eq__(self, other: typing.Any) -> bool: ... + def __getstate__(self) -> int: ... + def __hash__(self) -> int: ... + def __index__(self) -> int: ... + def __init__(self, value: int) -> None: ... + def __int__(self) -> int: ... + def __ne__(self, other: typing.Any) -> bool: ... + def __repr__(self) -> str: ... + def __setstate__(self, state: int) -> None: ... + def __str__(self) -> str: ... + @property + def name(self) -> str: ... + @property + def value(self) -> int: ... + +class cell_local_label: + """ + For local identification of an item. + + cell_local_label identifies: + (1) a labeled group of one or more items on one or more locations on the cell. + (2) a policy for selecting one of the items. + """ + + @typing.overload + def __init__(self, label: str) -> None: + """ + Construct a cell_local_label identifier from a label argument identifying a group of one or more items on a cell. + The default round_robin policy is used for selecting one of possibly multiple items associated with the label. + """ + @typing.overload + def __init__(self, label: str, policy: selection_policy) -> None: + """ + Construct a cell_local_label identifier with arguments: + label: The identifier of a group of one or more items on a cell. + policy: The policy for selecting one of possibly multiple items associated with the label. + """ + @typing.overload + def __init__(self, arg0: tuple) -> None: + """ + Construct a cell_local_label identifier with tuple argument (label, policy): + label: The identifier of a group of one or more items on a cell. + policy: The policy for selecting one of possibly multiple items associated with the label. + """ + def __repr__(self) -> str: ... + def __str__(self) -> str: ... + @property + def label(self) -> str: + """ + The identifier of a a group of one or more items on a cell. + """ + @label.setter + def label(self, arg0: str) -> None: ... + @property + def policy(self) -> selection_policy: + """ + The policy for selecting one of possibly multiple items associated with the label. + """ + @policy.setter + def policy(self, arg0: selection_policy) -> None: ... + +class cell_member: + """ + For global identification of a cell-local item. + + Items of cell_member must: + (1) be associated with a unique cell, identified by the member gid; + (2) identify an item within a cell-local collection by the member index. + """ + + @typing.overload + def __init__(self, gid: int, index: int) -> None: + """ + Construct a cell member identifier with arguments: + gid: The global identifier of the cell. + index: The cell-local index of the item. + """ + @typing.overload + def __init__(self, arg0: tuple) -> None: + """ + Construct a cell member identifier with tuple argument (gid, index): + gid: The global identifier of the cell. + index: The cell-local index of the item. + """ + def __repr__(self) -> str: ... + def __str__(self) -> str: ... + @property + def gid(self) -> int: + """ + The global identifier of the cell. + """ + @gid.setter + def gid(self, arg0: int) -> None: ... + @property + def index(self) -> int: + """ + Cell-local index of the item. + """ + @index.setter + def index(self, arg0: int) -> None: ... + +class component_meta_data: + @property + def version(self) -> str: + """ + cable-cell component version. + """ + @version.setter + def version(self, arg0: str) -> None: ... + +class connection: + """ + Describes a connection between two cells: + Defined by source and destination end points (that is pre-synaptic and post-synaptic respectively), a connection weight and a delay time. + """ + + def __init__( + self, + source: cell_global_label, + dest: cell_local_label, + weight: float, + delay: units.quantity, + ) -> None: + """ + Construct a connection with arguments: + source: The source end point of the connection. + dest: The destination end point of the connection. + weight: The weight delivered to the target synapse (unit defined by the type of synapse target). + delay: The delay of the connection [ms]. + """ + def __repr__(self) -> str: ... + def __str__(self) -> str: ... + @property + def delay(self) -> float: + """ + The delay time of the connection [ms]. + """ + @delay.setter + def delay(self, arg0: float) -> None: ... + @property + def dest(self) -> cell_local_label: + """ + The destination label of the connection. + """ + @dest.setter + def dest(self, arg0: cell_local_label) -> None: ... + @property + def source(self) -> cell_global_label: + """ + The source gid and label of the connection. + """ + @source.setter + def source(self, arg0: cell_global_label) -> None: ... + @property + def weight(self) -> float: + """ + The weight of the connection. + """ + @weight.setter + def weight(self, arg0: float) -> None: ... + +class context: + """ + An opaque handle for the hardware resources used in a simulation. + """ + + @typing.overload + def __init__(self) -> None: + """ + Construct a local context with proc_allocation = env.default_allocation(). + """ + @typing.overload + def __init__( + self, + *, + threads: int = 1, + gpu_id: typing.Any = None, + mpi: typing.Any = None, + inter: typing.Any = None, + bind_procs: bool = False, + bind_threads: bool = False, + ) -> None: + """ + Construct a context with arguments: + threads: The number of threads available locally for execution. Must be set to 1 at minimum. 1 by default. + gpu_id: The identifier of the GPU to use, None by default. Only available if arbor.__config__['gpu']!="none". + mpi: The MPI communicator, None by default. Only available if arbor.__config__['mpi']==True. + inter: An MPI intercommunicator used to connect to external simulations, None by default. Only available if arbor.__config__['mpi']==True. + bind_procs: Create process binding mask. + bind_threads: Create thread binding mask. + """ + @typing.overload + def __init__( + self, + alloc: proc_allocation, + *, + mpi: typing.Any = None, + inter: typing.Any = None, + ) -> None: + """ + Construct a context with arguments: + alloc: The computational resources to be used for the simulation. + mpi: The MPI communicator, None by default. Only available if arbor.__config__['mpi']==True. + inter: An MPI intercommunicator used to connect to external simulations, None by default. Only available if arbor.__config__['mpi']==True. + """ + def __repr__(self) -> str: ... + def __str__(self) -> str: ... + @property + def has_gpu(self) -> bool: + """ + Whether the context has a GPU. + """ + @property + def has_mpi(self) -> bool: + """ + Whether the context uses MPI for distributed communication. + """ + @property + def rank(self) -> int: + """ + The numeric id of the local domain (equivalent to MPI rank). + """ + @property + def ranks(self) -> int: + """ + The number of distributed domains (equivalent to the number of MPI ranks). + """ + @property + def threads(self) -> int: + """ + The number of threads in the context's thread pool. + """ + +class cv_policy: + """ + Describes the rules used to discretize (compartmentalise) a cable cell morphology. + """ + + def __add__(self, arg0: cv_policy) -> cv_policy: ... + def __init__(self, expression: str) -> None: + """ + A valid CV policy expression + """ + def __or__(self, arg0: cv_policy) -> cv_policy: ... + def __repr__(self) -> str: ... + def __str__(self) -> str: ... + @property + def domain(self) -> str: + """ + The domain on which the policy is applied. + """ + +class decor: + """ + Description of the decorations to be applied to a cable cell, that is the painted, + placed and defaulted properties, mecahanisms, ion species etc. + """ + + @typing.overload + def __init__(self) -> None: ... + @typing.overload + def __init__(self, arg0: decor) -> None: ... + def defaults( + self, + ) -> list[ + membrane_potential + | axial_resistivity + | temperature + | membrane_capacitance + | ion_diffusivity + | int_concentration + | ext_concentration + | reversal_potential + | reversal_potential_method + | cv_policy + ]: + """ + Return a view of all defaults. + """ + @typing.overload + def discretization(self, policy: cv_policy) -> decor: + """ + A cv_policy used to discretise the cell into compartments for simulation + """ + @typing.overload + def discretization(self, policy: str) -> decor: + """ + An s-expression string representing a cv_policy used to discretise the cell into compartments for simulation + """ + @typing.overload + def paint(self, region: str, mechanism: density) -> decor: + """ + Associate a density mechanism with a region. + """ + @typing.overload + def paint(self, region: str, mechanism: voltage_process) -> decor: + """ + Associate a voltage process mechanism with a region. + """ + @typing.overload + def paint(self, region: str, mechanism: scaled_mechanism) -> None: + """ + Associate a scaled density mechanism with a region. + """ + @typing.overload + def paint( + self, + region: str, + Vm: units.quantity | str | None = None, + cm: units.quantity | str | None = None, + rL: units.quantity | str | None = None, + tempK: units.quantity | str | None = None, + ) -> decor: + """ + Set cable properties on a region. + Set global default values for cable and cell properties. + * Vm: initial membrane voltage [mV]. + * cm: membrane capacitance [F/m²]. + * rL: axial resistivity [Ω·cm]. + * tempK: temperature [Kelvin]. + """ + @typing.overload + def paint( + self, + region: str, + *, + ion: str, + int_con: units.quantity | None = None, + ext_con: units.quantity | None = None, + rev_pot: units.quantity | None = None, + diff: units.quantity | None = None, + ) -> decor: + """ + Set ion species properties conditions on a region. + * int_con: initial internal concentration [mM]. + * ext_con: initial external concentration [mM]. + * rev_pot: reversal potential [mV]. + * method: mechanism for calculating reversal potential. + * diff: diffusivity [m^2/s]. + """ + def paintings( + self, + ) -> list[ + tuple[ + str, + membrane_potential + | axial_resistivity + | temperature + | membrane_capacitance + | ion_diffusivity + | int_concentration + | ext_concentration + | reversal_potential + | density + | voltage_process + | scaled_mechanism, + ] + ]: + """ + Return a view of all painted items. + """ + @typing.overload + def place(self, locations: str, synapse: synapse, label: str) -> decor: + """ + Place one instance of 'synapse' on each location in 'locations'.The group of synapses has the label 'label', used for forming connections between cells. + """ + @typing.overload + def place(self, locations: str, junction: junction, label: str) -> decor: + """ + Place one instance of 'junction' on each location in 'locations'.The group of junctions has the label 'label', used for forming gap-junction connections between cells. + """ + @typing.overload + def place(self, locations: str, iclamp: iclamp, label: str) -> decor: + """ + Add a current stimulus at each location in locations.The group of current stimuli has the label 'label'. + """ + @typing.overload + def place(self, locations: str, detector: threshold_detector, label: str) -> decor: + """ + Add a voltage spike detector at each location in locations.The group of spike detectors has the label 'label', used for forming connections between cells. + """ + def placements( + self, + ) -> list[tuple[str, iclamp | threshold_detector | synapse | junction, str]]: + """ + Return a view of all placed items. + """ + def set_ion( + self, + ion: str, + int_con: units.quantity | None = None, + ext_con: units.quantity | None = None, + rev_pot: units.quantity | None = None, + method: typing.Any = None, + diff: units.quantity | None = None, + ) -> decor: + """ + Set the cell-level properties of ion species named 'ion'. + * int_con: initial internal concentration [mM]. + * ext_con: initial external concentration [mM]. + * rev_pot: reversal potential [mV]. + * method: mechanism for calculating reversal potential. + * diff: diffusivity [m^2/s]. + There are 3 ion species predefined in arbor: 'ca', 'na' and 'k'. + If 'ion' in not one of these ions it will be added to the list, making it + available to mechanisms. The user has to provide the valence of a previously + undefined ion the first time this function is called with it as an argument. + Species concentrations and reversal potential can be overridden on + specific regions using the paint interface, while the method for calculating + reversal potential is global for all compartments in the cell, and can't be + overriden locally. + """ + def set_property( + self, + Vm: units.quantity | None = None, + cm: units.quantity | None = None, + rL: units.quantity | None = None, + tempK: units.quantity | None = None, + ) -> decor: + """ + Set default values for cable and cell properties: + * Vm: initial membrane voltage [mV]. + * cm: membrane capacitance [F/m²]. + * rL: axial resistivity [Ω·cm]. + * tempK: temperature [Kelvin]. + These values can be overridden on specific regions using the paint interface. + """ + +class density: + """ + For painting a density mechanism on a region. + """ + + @typing.overload + def __init__(self, arg0: str) -> None: ... + @typing.overload + def __init__(self, arg0: mechanism) -> None: ... + @typing.overload + def __init__(self, arg0: str, arg1: dict[str, float]) -> None: ... + @typing.overload + def __init__(self, arg0: mechanism, arg1: dict[str, float]) -> None: ... + @typing.overload + def __init__(self, arg0: str, **kwargs) -> None: ... + @typing.overload + def __init__(self, arg0: mechanism, **kwargs) -> None: ... + def __repr__(self) -> str: ... + def __str__(self) -> str: ... + @property + def mech(self) -> mechanism: + """ + The underlying mechanism. + """ + +class domain_decomposition: + """ + The domain decomposition is responsible for describing the distribution of cells across cell groups and domains. + """ + + def __repr__(self) -> str: ... + def __str__(self) -> str: ... + def gid_domain(self, gid: int) -> int: + """ + Query the domain id that a cell assigned to (using global identifier gid). + """ + @property + def domain_id(self) -> int: + """ + The index of the local domain. + Always 0 for non-distributed models, and corresponds to the MPI rank for distributed runs. + """ + @property + def groups(self) -> list[group_description]: + """ + Descriptions of the cell groups on the local domain. + """ + @property + def num_domains(self) -> int: + """ + Number of domains that the model is distributed over. + """ + @property + def num_global_cells(self) -> int: + """ + Total number of cells in the global model (sum of num_local_cells over all domains). + """ + @property + def num_groups(self) -> int: + """ + Total number of cell groups in the local domain. + """ + @property + def num_local_cells(self) -> int: + """ + Total number of cells in the local domain. + """ + +class event_generator: + def __init__( + self, target: cell_local_label, weight: float, sched: schedule_base + ) -> None: + """ + Construct an event generator with arguments: + target: The target synapse label and selection policy. + weight: The weight of events to deliver. + sched: A schedule of the events. + """ + def __repr__(self) -> str: ... + def __str__(self) -> str: ... + @property + def target(self) -> cell_local_label: + """ + The target synapse (gid, local_id). + """ + @target.setter + def target(self, arg0: cell_local_label) -> None: ... + @property + def weight(self) -> float: + """ + The weight of events to deliver. + """ + @weight.setter + def weight(self, arg0: float) -> None: ... + +class explicit_schedule(schedule_base): + """ + Describes an explicit schedule at a predetermined (sorted) sequence of times. + """ + + @typing.overload + def __init__(self) -> None: + """ + Construct an empty explicit schedule. + """ + @typing.overload + def __init__(self, times: list[units.quantity]) -> None: + """ + Construct an explicit schedule with argument: + times: A list of times [ms], [] by default. + """ + def __repr__(self) -> str: ... + def __str__(self) -> str: ... + def events(self, arg0: float, arg1: float) -> list[float]: + """ + A view of monotonically increasing time values in the half-open interval [t0, t1) in [ms]. + """ + @property + def times_ms(self) -> list[float]: + """ + A list of times [ms]. + """ + @times_ms.setter + def times_ms(self, arg1: list[float]) -> None: ... + +class ext_concentration: + """ + Setting the initial external ion concentration. + """ + + def __init__(self, arg0: str, arg1: units.quantity) -> None: ... + def __repr__(self) -> str: ... + +class extent: + """ + A potentially empty region on a morphology. + """ + +class gap_junction_connection: + """ + Describes a gap junction between two gap junction sites. + """ + + def __init__( + self, peer: cell_global_label, local: cell_local_label, weight: float + ) -> None: + """ + Construct a gap junction connection with arguments: + peer: remote half of the gap junction connection. + local: local half of the gap junction connection. + weight: Gap junction connection weight [unit-less]. + """ + def __repr__(self) -> str: ... + def __str__(self) -> str: ... + @property + def local(self) -> cell_local_label: + """ + Local label of the gap junction connection. + """ + @local.setter + def local(self, arg0: cell_local_label) -> None: ... + @property + def peer(self) -> cell_global_label: + """ + Remote gid and label of the gap junction connection. + """ + @peer.setter + def peer(self, arg0: cell_global_label) -> None: ... + @property + def weight(self) -> float: + """ + Gap junction connection weight [unit-less]. + """ + @weight.setter + def weight(self, arg0: float) -> None: ... + +class group_description: + """ + The indexes of a set of cells of the same kind that are grouped together in a cell group. + """ + + def __init__(self, kind: cell_kind, gids: list[int], backend: backend) -> None: + """ + Construct a group description with cell kind, list of gids, and backend kind. + """ + def __repr__(self) -> str: ... + def __str__(self) -> str: ... + @property + def backend(self) -> backend: + """ + The hardware backend on which the cell group will run. + """ + @property + def gids(self) -> list[int]: + """ + The list of gids of the cells in the group. + """ + @property + def kind(self) -> cell_kind: + """ + The type of cell in the cell group. + """ + +class iclamp: + """ + A current clamp for injecting a DC or fixed frequency current governed by a piecewise linear envelope. + """ + + @typing.overload + def __init__( + self, + tstart: units.quantity, + duration: units.quantity, + current: units.quantity, + *, + frequency: units.quantity = ..., + phase: units.quantity = ..., + ) -> None: + """ + Construct finite duration current clamp, constant amplitude + """ + @typing.overload + def __init__( + self, + current: units.quantity, + *, + frequency: units.quantity = ..., + phase: units.quantity = ..., + ) -> None: + """ + Construct constant amplitude current clamp + """ + @typing.overload + def __init__( + self, + envelope: list[tuple[units.quantity, units.quantity]], + *, + frequency: units.quantity = ..., + phase: units.quantity = ..., + ) -> None: + """ + Construct current clamp according to (time, amplitude) linear envelope + """ + def __repr__(self) -> str: ... + def __str__(self) -> str: ... + @property + def envelope(self) -> list[tuple[float, float]]: + """ + List of (time [ms], amplitude [nA]) points comprising the piecewise linear envelope + """ + @property + def frequency(self) -> float: + """ + Oscillation frequency (kHz), zero implies DC stimulus. + """ + @property + def phase(self) -> float: + """ + Oscillation initial phase (rad) + """ + +class int_concentration: + """ + Setting the initial internal ion concentration. + """ + + def __init__(self, arg0: str, arg1: units.quantity) -> None: ... + def __repr__(self) -> str: ... + +class ion_data: + @property + def charge(self) -> int: + """ + Valence. + """ + @property + def diffusivity(self) -> float | None: + """ + Diffusivity. + """ + @property + def external_concentration(self) -> float | None: + """ + External concentration. + """ + @property + def internal_concentration(self) -> float | None: + """ + Internal concentration. + """ + @property + def reversal_concentration(self) -> float | None: + """ + Reversal potential. + """ + @property + def reversal_potential(self) -> float | None: + """ + Reversal potential. + """ + @property + def reversal_potential_method(self) -> str: + """ + Reversal potential method. + """ + +class ion_dependency: + """ + Information about a mechanism's dependence on an ion species. + """ + + def __init__(self, arg0: ion_dependency) -> None: ... + def __repr__(self) -> str: ... + def __str__(self) -> str: ... + @property + def read_rev_pot(self) -> bool: ... + @property + def write_ext_con(self) -> bool: ... + @property + def write_int_con(self) -> bool: ... + @property + def write_rev_pot(self) -> bool: ... + +class ion_diffusivity: + """ + Setting the ion diffusivity. + """ + + def __init__(self, arg0: str, arg1: units.quantity) -> None: ... + def __repr__(self) -> str: ... + +class ion_settings: + pass + +class isometry: + @staticmethod + @typing.overload + def rotate(theta: float, x: float, y: float, z: float) -> isometry: + """ + Construct a rotation isometry of angle theta about the axis in direction (x, y, z). + """ + @staticmethod + @typing.overload + def rotate(theta: float, axis: tuple) -> isometry: + """ + Construct a rotation isometry of angle theta about the given axis in the direction described by a tuple. + """ + @staticmethod + @typing.overload + def translate(x: float, y: float, z: float) -> isometry: + """ + Construct a translation isometry from displacements x, y, and z. + """ + @staticmethod + @typing.overload + def translate(arg0: tuple) -> isometry: + """ + Construct a translation isometry from the first three components of a tuple. + """ + @staticmethod + @typing.overload + def translate(arg0: mpoint) -> isometry: + """ + Construct a translation isometry from the x, y, and z components of an mpoint. + """ + @typing.overload + def __call__(self, arg0: mpoint) -> mpoint: + """ + Apply isometry to mpoint argument. + """ + @typing.overload + def __call__(self, arg0: tuple) -> tuple: + """ + Apply isometry to first three components of tuple argument. + """ + def __init__(self) -> None: + """ + Construct a trivial isometry. + """ + def __mul__(self, arg0: isometry) -> isometry: ... + +class junction: + """ + For placing a gap-junction mechanism on a locset. + """ + + @typing.overload + def __init__(self, arg0: str) -> None: ... + @typing.overload + def __init__(self, arg0: mechanism) -> None: ... + @typing.overload + def __init__(self, arg0: str, arg1: dict[str, float]) -> None: ... + @typing.overload + def __init__(self, arg0: str, **kwargs) -> None: ... + @typing.overload + def __init__(self, arg0: mechanism, arg1: dict[str, float]) -> None: ... + @typing.overload + def __init__(self, arg0: mechanism, **kwargs) -> None: ... + def __repr__(self) -> str: ... + def __str__(self) -> str: ... + @property + def mech(self) -> mechanism: + """ + The underlying mechanism. + """ + +class label_dict: + """ + A dictionary of labelled region and locset definitions, with a + unique label assigned to each definition. + """ + + @staticmethod + def append(*args, **kwargs) -> None: + """ + Import the entries of a another label dictionary with an optional prefix. + """ + def __contains__(self, arg0: str) -> bool: ... + def __getitem__(self, arg0: str) -> str: ... + @typing.overload + def __init__(self) -> None: + """ + Create an empty label dictionary. + """ + @typing.overload + def __init__(self, arg0: dict[str, str]) -> None: + """ + Initialize a label dictionary from a dictionary with string labels as keys, and corresponding definitions as strings. + """ + @typing.overload + def __init__(self, arg0: label_dict) -> None: + """ + Initialize a label dictionary from another one + """ + @typing.overload + def __init__(self, arg0: typing.Iterator) -> None: + """ + Initialize a label dictionary from an iterable of key, definition pairs + """ + def __iter__(self) -> typing.Iterator: ... + def __len__(self) -> int: ... + def __repr__(self) -> str: ... + def __setitem__(self, arg0: str, arg1: str) -> None: ... + def __str__(self) -> str: ... + def add_swc_tags(self) -> label_dict: + """ + Add standard SWC tagged regions. + - soma: (tag 1) + - axon: (tag 2) + - dend: (tag 3) + - apic: (tag 4) + """ + def items(self) -> typing.Iterator: ... + def keys(self) -> typing.Iterator: ... + def update(self, other: label_dict) -> None: + """ + The label_dict to be importedImport the entries of a another label dictionary. + """ + def values(self) -> typing.Iterator: ... + @property + def locsets(self) -> list[str]: + """ + The locset definitions. + """ + @property + def regions(self) -> list[str]: + """ + The region definitions. + """ + +class lif_cell: + """ + A leaky integrate-and-fire cell. + """ + + def __init__( + self, + source_label: str, + target_label: str, + *, + tau_m: units.quantity | None = None, + V_th: units.quantity | None = None, + C_m: units.quantity | None = None, + E_L: units.quantity | None = None, + V_m: units.quantity | None = None, + t_ref: units.quantity | None = None, + ) -> None: + """ + Construct a lif cell with one source labeled 'source_label', and one target labeled 'target_label'.Can optionally take physical parameters: + * tau_m: Membrane potential decaying constant [ms]. + * V_th: Firing threshold [mV]. + * C_m: Membrane capacitance [pF]. + * E_L: Resting potential [mV]. + * V_m: Initial value of the Membrane potential [mV]. + * t_ref: Refractory period [ms]. + """ + def __repr__(self) -> str: ... + def __str__(self) -> str: ... + @property + def C_m(self) -> units.quantity: + """ + Membrane capacitance [pF]. + """ + @C_m.setter + def C_m(self, arg0: units.quantity) -> None: ... + @property + def E_L(self) -> units.quantity: + """ + Resting potential [mV]. + """ + @E_L.setter + def E_L(self, arg0: units.quantity) -> None: ... + @property + def E_R(self) -> units.quantity: + """ + Reset potential [mV]. + """ + @E_R.setter + def E_R(self, arg0: units.quantity) -> None: ... + @property + def V_m(self) -> units.quantity: + """ + Initial value of the Membrane potential [mV]. + """ + @V_m.setter + def V_m(self, arg0: units.quantity) -> None: ... + @property + def V_th(self) -> units.quantity: + """ + Firing threshold [mV]. + """ + @V_th.setter + def V_th(self, arg0: units.quantity) -> None: ... + @property + def source(self) -> str: + """ + Label of the single build-in source on the cell. + """ + @source.setter + def source(self, arg0: str) -> None: ... + @property + def t_ref(self) -> units.quantity: + """ + Refractory period [ms]. + """ + @t_ref.setter + def t_ref(self, arg0: units.quantity) -> None: ... + @property + def target(self) -> str: + """ + Label of the single build-in target on the cell. + """ + @target.setter + def target(self, arg0: str) -> None: ... + @property + def tau_m(self) -> units.quantity: + """ + Membrane potential decaying constant [ms]. + """ + @tau_m.setter + def tau_m(self, arg0: units.quantity) -> None: ... + +class lif_probe_metadata: + """ + Probe metadata associated with a LIF cell probe. + """ + +class location: + """ + A location on a cable cell. + """ + + __hash__: typing.ClassVar[None] = None + def __eq__(self, arg0: location) -> bool: ... + def __init__(self, branch: int, pos: float) -> None: + """ + Construct a location specification holding: + branch: The id of the branch. + pos: The relative position (from 0., proximal, to 1., distal) on the branch. + """ + def __repr__(self) -> str: ... + def __str__(self) -> str: ... + @property + def branch(self) -> int: + """ + The id of the branch. + """ + @property + def pos(self) -> float: + """ + The relative position on the branch (∈ [0.,1.], where 0. means proximal and 1. distal). + """ + +class mechanism: + @typing.overload + def __init__(self, name: str) -> None: + """ + The name of the mechanism + """ + @typing.overload + def __init__(self, name: str, params: dict[str, float]) -> None: + """ + Example usage setting parameters: + m = arbor.mechanism('expsyn', {'tau': 1.4}) + will create parameters for the 'expsyn' mechanism, with the provided value + for 'tau' overrides the default. If a parameter is not set, the default + (as defined in NMODL) is used. + + Example overriding a global parameter: + m = arbor.mechanism('nernst/R=8.3145,F=96485') + """ + @typing.overload + def __init__(self, name: str, **kwargs) -> None: + """ + Example usage setting parameters: + m = arbor.mechanism('expsyn', tau=1.4}) + will create parameters for the 'expsyn' mechanism, with the provided value + for 'tau' overrides the default. If a parameter is not set, the default + (as defined in NMODL) is used. + + Example overriding a global parameter: + m = arbor.mechanism('nernst/R=8.3145,F=96485') + """ + def __repr__(self) -> str: ... + def __str__(self) -> str: ... + def set(self, name: str, value: float) -> None: + """ + Set parameter value. + """ + @property + def name(self) -> str: + """ + The name of the mechanism. + """ + @property + def values(self) -> dict[str, float]: + """ + A dictionary of parameter values with parameter name as key. + """ + +class mechanism_field: + """ + Basic information about a mechanism field. + """ + + def __init__(self, arg0: mechanism_field) -> None: ... + def __repr__(self) -> str: ... + def __str__(self) -> str: ... + @property + def default(self) -> float: ... + @property + def max(self) -> float: ... + @property + def min(self) -> float: ... + @property + def units(self) -> str: ... + +class mechanism_info: + """ + Meta data about a mechanism's fields and ion dependendencies. + """ + + def __init__(self, arg0: mechanism_info) -> None: ... + def __repr__(self) -> str: ... + def __str__(self) -> str: ... + @property + def globals(self) -> dict[str, mechanism_field]: + """ + Global fields have one value common to an instance of a mechanism, are constant in time and set at instantiation. + """ + @property + def ions(self) -> dict[str, ion_dependency]: + """ + Ion dependencies. + """ + @property + def kind(self) -> str: + """ + String representation of the kind of the mechanism. + """ + @property + def linear(self) -> bool: + """ + True if a synapse mechanism has linear current contributions so that multiple instances on the same compartment can be coalesced. + """ + @property + def parameters(self) -> dict[str, mechanism_field]: + """ + Parameter fields may vary across the extent of a mechanism, but are constant in time and set at instantiation. + """ + @property + def post_events(self) -> bool: + """ + True if a synapse mechanism has a `POST_EVENT` procedure defined. + """ + @property + def state(self) -> dict[str, mechanism_field]: + """ + State fields vary in time and across the extent of a mechanism, and potentially can be sampled at run-time. + """ + +class membrane_capacitance: + """ + Setting the membrane capacitance. + """ + + def __init__(self, arg0: units.quantity) -> None: ... + def __repr__(self) -> str: ... + +class membrane_potential: + """ + Setting the initial membrane voltage. + """ + + def __init__(self, arg0: units.quantity, arg1: str | None) -> None: ... + def __repr__(self) -> str: ... + +class meter_manager: + """ + Manage metering by setting checkpoints and starting the timing region. + """ + + def __init__(self) -> None: ... + def __repr__(self) -> str: ... + def __str__(self) -> str: ... + def checkpoint(self, name: str, context: context) -> None: + """ + Create a new checkpoint. Records the time since the last checkpoint(or the call to start if no previous checkpoints exist),and restarts the timer for the next checkpoint. + """ + def start(self, context: context) -> None: + """ + Start the metering. Records a time stamp, that marks the start of the first checkpoint timing region. + """ + @property + def checkpoint_names(self) -> list[str]: + """ + A list of all metering checkpoint names. + """ + @property + def times(self) -> list[float]: + """ + A list of all metering times. + """ + +class meter_report: + """ + Summarises the performance meter results, used to print a report to screen or file. + If a distributed context is used, the report will contain a summary of results from all MPI ranks. + """ + + def __init__(self, manager: meter_manager, context: context) -> None: ... + def __repr__(self) -> str: ... + def __str__(self) -> str: ... + +class morphology: + """ + A cell morphology. + """ + + def __init__(self, arg0: segment_tree) -> None: ... + def __str__(self) -> str: ... + def branch_children(self, i: int) -> list[int]: + """ + The child branches of branch i. + """ + def branch_parent(self, i: int) -> int: + """ + The parent branch of branch i. + """ + def branch_segments(self, i: int) -> list[msegment]: + """ + A list of the segments in branch i, ordered from proximal to distal ends of the branch. + """ + def to_segment_tree(self) -> segment_tree: + """ + Convert this morphology to a segment_tree. + """ + @property + def empty(self) -> bool: + """ + Whether the morphology is empty. + """ + @property + def num_branches(self) -> int: + """ + The number of branches in the morphology. + """ + +class morphology_provider: + def __init__(self, morphology: morphology) -> None: + """ + Construct a morphology provider. + """ + def reify_locset(self, arg0: str) -> list[location]: + """ + Turn a locset into a list of locations. + """ + def reify_region(self, arg0: str) -> extent: + """ + Turn a region into an extent. + """ + +class mpoint: + __hash__: typing.ClassVar[None] = None + def __eq__(self, arg0: mpoint) -> bool: ... + @typing.overload + def __init__(self, x: float, y: float, z: float, radius: float) -> None: + """ + Create an mpoint object from parameters x, y, z, and radius, specified in µm. + """ + @typing.overload + def __init__(self, arg0: tuple) -> None: + """ + Create an mpoint object from a tuple (x, y, z, radius), specified in µm. + """ + def __repr__(self) -> str: ... + def __str__(self) -> str: ... + @property + def radius(self) -> float: + """ + Radius of cable at sample location centred at coordinates [μm]. + """ + @property + def x(self) -> float: + """ + X coordinate [μm]. + """ + @property + def y(self) -> float: + """ + Y coordinate [μm]. + """ + @property + def z(self) -> float: + """ + Z coordinate [μm]. + """ + +class msegment: + @property + def dist(self) -> mpoint: + """ + the location and radius of the distal end. + """ + @property + def prox(self) -> mpoint: + """ + the location and radius of the proximal end. + """ + @property + def tag(self) -> int: + """ + tag meta-data. + """ + +class neuroml: + def __init__(self, arg0: typing.Any) -> None: + """ + Construct NML morphology from filename or stream. + """ + def cell_ids(self) -> list[str]: + """ + Query top-level cells. + """ + def cell_morphology( + self, cell_id: str, allow_spherical_root: bool = False + ) -> neuroml_morph_data | None: + """ + Retrieve nml_morph_data associated with cell_id. + """ + def morphology( + self, morph_id: str, allow_spherical_root: bool = False + ) -> neuroml_morph_data | None: + """ + Retrieve top-level nml_morph_data associated with morph_id. + """ + def morphology_ids(self) -> list[str]: + """ + Query top-level standalone morphologies. + """ + +class neuroml_morph_data: + def groups(self) -> label_dict: + """ + Label dictionary containing one region expression for each segmentGroup id. + """ + def named_segments(self) -> label_dict: + """ + Label dictionary containing one region expression for each name applied to one or more segments. + """ + def segments(self) -> label_dict: + """ + Label dictionary containing one region expression for each segment id. + """ + @property + def cell_id(self) -> str | None: + """ + Cell id, or empty if morphology was taken from a top-level <morphology> element. + """ + @property + def group_segments(self) -> dict[str, list[int]]: + """ + Map from segmentGroup ids to their corresponding segment ids. + """ + @property + def id(self) -> str: + """ + Morphology id. + """ + @property + def morphology(self) -> morphology: + """ + Morphology constructed from a signle NeuroML <morphology> element. + """ + +class partition_hint: + """ + Provide a hint on how the cell groups should be partitioned. + """ + + max_size: typing.ClassVar[int] = 18446744073709551615 + def __init__( + self, + cpu_group_size: int = 1, + gpu_group_size: int = 18446744073709551615, + prefer_gpu: bool = True, + ) -> None: + """ + Construct a partition hint with arguments: + cpu_group_size: The size of cell group assigned to CPU, each cell in its own group by default. + Must be positive, else set to default value. + gpu_group_size: The size of cell group assigned to GPU, all cells in one group by default. + Must be positive, else set to default value. + prefer_gpu: Whether GPU is preferred, True by default. + """ + def __repr__(self) -> str: ... + def __str__(self) -> str: ... + @property + def cpu_group_size(self) -> int: + """ + The size of cell group assigned to CPU. + """ + @cpu_group_size.setter + def cpu_group_size(self, arg0: int) -> None: ... + @property + def gpu_group_size(self) -> int: + """ + The size of cell group assigned to GPU. + """ + @gpu_group_size.setter + def gpu_group_size(self, arg0: int) -> None: ... + @property + def prefer_gpu(self) -> bool: + """ + Whether GPU usage is preferred. + """ + @prefer_gpu.setter + def prefer_gpu(self, arg0: bool) -> None: ... + +class place_pwlin: + def __init__(self, morphology: morphology, isometry: isometry = ...) -> None: + """ + Construct a piecewise-linear placement object from the given morphology and optional isometry. + """ + def all_at(self, location: location) -> list[mpoint]: + """ + Return list of all possible interpolated mpoints corresponding to the location argument. + """ + def all_segments(self, arg0: list[cable]) -> list[msegment]: + """ + Return maximal list of non-overlapping full or partial msegments whose union is coterminous with the extent of the given list of cables. + """ + def at(self, location: location) -> mpoint: + """ + Return an interpolated mpoint corresponding to the location argument. + """ + def closest(self, arg0: float, arg1: float, arg2: float) -> tuple: + """ + Find the location on the morphology that is closest to a 3d point. Returns the location and its distance from the point. + """ + def segments(self, arg0: list[cable]) -> list[msegment]: + """ + Return minimal list of full or partial msegments whose union is coterminous with the extent of the given list of cables. + """ + +class poisson_schedule(schedule_base): + """ + Describes a schedule according to a Poisson process within the interval [tstart, tstop). + """ + + def __init__( + self, + freq: units.quantity, + *, + tstart: units.quantity = ..., + seed: int = 0, + tstop: units.quantity | None = None, + ) -> None: + """ + Construct a Poisson schedule with arguments: + tstart: The delivery time of the first event in the sequence [ms], 0 by default. + freq: The expected frequency [kHz]. + seed: The seed for the random number generator, 0 by default. + tstop: No events delivered after this time [ms], None by default. + """ + def __repr__(self) -> str: ... + def __str__(self) -> str: ... + def events(self, arg0: units.quantity, arg1: units.quantity) -> list[float]: + """ + A view of monotonically increasing time values in the half-open interval [t0, t1). + """ + @property + def freq(self) -> units.quantity: + """ + The expected frequency [kHz]. + """ + @freq.setter + def freq(self, arg1: units.quantity) -> None: ... + @property + def seed(self) -> int: + """ + The seed for the random number generator. + """ + @seed.setter + def seed(self, arg0: int) -> None: ... + @property + def tstart(self) -> units.quantity: + """ + The delivery time of the first event in the sequence [ms]. + """ + @tstart.setter + def tstart(self, arg1: units.quantity) -> None: ... + @property + def tstop(self) -> units.quantity: + """ + No events delivered after this time [ms]. + """ + @tstop.setter + def tstop(self, arg1: units.quantity) -> None: ... + +class probe: + def __repr__(self) -> str: ... + def __str__(self) -> str: ... + +class proc_allocation: + """ + Enumerates the computational resources on a node to be used for simulation. + """ + + def __init__( + self, + *, + threads: int = 1, + gpu_id: typing.Any = None, + bind_procs: bool = False, + bind_threads: bool = False, + ) -> None: + """ + Construct an allocation with arguments: + threads: The number of threads available locally for execution. Must be set to 1 at minimum. 1 by default. + gpu_id: The identifier of the GPU to use, None by default. + bind_procs: Create process binding mask. + bind_threads: Create thread binding mask. + """ + def __repr__(self) -> str: ... + def __str__(self) -> str: ... + @property + def bind_procs(self) -> bool: + """ + Try to bind MPI procs? + """ + @bind_procs.setter + def bind_procs(self, arg1: bool) -> None: ... + @property + def bind_threads(self) -> bool: + """ + Try to bind threads? + """ + @bind_threads.setter + def bind_threads(self, arg1: bool) -> None: ... + @property + def gpu_id(self) -> int | None: + """ + The identifier of the GPU to use. + Corresponds to the integer parameter used to identify GPUs in CUDA API calls. + """ + @gpu_id.setter + def gpu_id(self, arg1: typing.Any) -> None: ... + @property + def has_gpu(self) -> bool: + """ + Whether a GPU is being used (True/False). + """ + @property + def threads(self) -> int: + """ + The number of threads available locally for execution. + """ + @threads.setter + def threads(self, arg1: int) -> None: ... + +class recipe: + """ + A description of a model, describing the cells and the network via a cell-centric interface. + """ + + def __init__(self) -> None: ... + def __repr__(self) -> str: ... + def __str__(self) -> str: ... + def cell_description(self, gid: int) -> typing.Any: + """ + High level description of the cell with global identifier gid. + """ + def cell_kind(self, gid: int) -> cell_kind: + """ + The kind of cell with global identifier gid. + """ + def connections_on(self, gid: int) -> list[connection]: + """ + A list of all the incoming connections to gid, [] by default. + """ + def event_generators(self, gid: int) -> list[typing.Any]: + """ + A list of all the event generators that are attached to gid, [] by default. + """ + def external_connections_on(self, gid: int) -> list[connection]: + """ + A list of all the incoming connections from _remote_ locations to gid, [] by default. + """ + def gap_junctions_on(self, gid: int) -> list[gap_junction_connection]: + """ + A list of the gap junctions connected to gid, [] by default. + """ + def global_properties(self, kind: cell_kind) -> typing.Any: + """ + The default properties applied to all cells of type 'kind' in the model. + """ + def num_cells(self) -> int: + """ + The number of cells in the model. + """ + def probes(self, gid: int) -> list[probe]: + """ + The probes to allow monitoring. + """ + +class regular_schedule(schedule_base): + """ + Describes a regular schedule with multiples of dt within the interval [tstart, tstop). + """ + + @typing.overload + def __init__( + self, + tstart: units.quantity, + dt: units.quantity, + tstop: units.quantity | None = None, + ) -> None: + """ + Construct a regular schedule with arguments: + tstart: The delivery time of the first event in the sequence [ms]. + dt: The interval between time points [ms]. + tstop: No events delivered after this time [ms], None by default. + """ + @typing.overload + def __init__(self, dt: units.quantity) -> None: + """ + Construct a regular schedule, starting from t = 0 and never terminating, with arguments: + dt: The interval between time points [ms]. + """ + def __repr__(self) -> str: ... + def __str__(self) -> str: ... + def events(self, arg0: float, arg1: float) -> list[float]: + """ + A view of monotonically increasing time values in the half-open interval [t0, t1). + """ + @property + def dt(self) -> units.quantity: + """ + The interval between time points [ms]. + """ + @dt.setter + def dt(self, arg1: units.quantity) -> None: ... + @property + def tstart(self) -> units.quantity: + """ + The delivery time of the first event in the sequence [ms]. + """ + @tstart.setter + def tstart(self, arg1: units.quantity) -> None: ... + @property + def tstop(self) -> units.quantity | None: + """ + No events delivered after this time [ms]. + """ + @tstop.setter + def tstop(self, arg1: units.quantity | None) -> None: ... + +class reversal_potential: + """ + Setting the initial reversal potential. + """ + + def __init__(self, arg0: str, arg1: units.quantity) -> None: ... + def __repr__(self) -> str: ... + +class reversal_potential_method: + """ + Describes the mechanism used to compute eX for ion X. + """ + + def __init__(self, arg0: str, arg1: mechanism) -> None: ... + def __repr__(self) -> str: ... + +class scaled_mechanism: + """ + For painting a scaled density mechanism on a region. + """ + + @typing.overload + def __init__(self, arg0: density) -> None: ... + @typing.overload + def __init__(self, arg0: density, arg1: dict[str, str]) -> None: ... + @typing.overload + def __init__(self, arg0: density, **kwargs) -> None: ... + def __repr__(self) -> str: ... + def __str__(self) -> str: ... + def scale(self, name: str, ex: str) -> scaled_mechanism: + """ + Add a scaling expression to a parameter. + """ + +class schedule_base: + """ + Schedule abstract base class. + """ + +class segment_tree: + def __init__(self) -> None: ... + def __str__(self) -> str: ... + @typing.overload + def append(self, parent: int, prox: mpoint, dist: mpoint, tag: int) -> int: + """ + Append a segment to the tree. + """ + @typing.overload + def append(self, parent: int, dist: mpoint, tag: int) -> int: + """ + Append a segment to the tree. + """ + @typing.overload + def append( + self, parent: int, x: float, y: float, z: float, radius: float, tag: int + ) -> int: + """ + Append a segment to the tree, using the distal location of the parent segment as the proximal end. + """ + def apply_isometry(self, arg0: isometry) -> segment_tree: + """ + Apply an isometry to all segments in the tree. + """ + def equivalent(self, arg0: segment_tree) -> bool: + """ + Two trees are equivalent, but not neccessarily identical, ie they have the same segments and structure. + """ + def is_fork(self, i: int) -> bool: + """ + True if segment has more than one child. + """ + def is_root(self, i: int) -> bool: + """ + True if segment has no parent. + """ + def is_terminal(self, i: int) -> bool: + """ + True if segment has no children. + """ + def join_at(self, arg0: int, arg1: segment_tree) -> segment_tree: + """ + Join two subtrees at a given id, such that said id becomes the parent of the inserted sub-tree. + """ + def reserve(self, arg0: int) -> None: ... + def split_at(self, arg0: int) -> tuple[segment_tree, segment_tree]: + """ + Split into a pair of trees at the given id, such that one tree is the subtree rooted at id and the other is the original tree without said subtree. + """ + def tag_roots(self, arg0: int) -> list[int]: + """ + Get roots of tag region of this segment tree. + """ + @property + def empty(self) -> bool: + """ + Indicates whether the tree is empty (i.e. whether it has size 0) + """ + @property + def parents(self) -> list[int]: + """ + A list with the parent index of each segment. + """ + @property + def segments(self) -> list[msegment]: + """ + A list of the segments. + """ + @property + def size(self) -> int: + """ + The number of segments in the tree. + """ + +class selection_policy: + """ + Enumeration used to identify a selection policy, used by the model for selecting one of possibly multiple locations on the cell associated with a labeled item. + + Members: + + round_robin : Iterate round-robin over all possible locations. + + round_robin_halt : Halts at the current location until the round_robin policy is called (again). + + univalent : Assert that there is only one possible location associated with a labeled item on the cell. The model throws an exception if the assertion fails. + """ + + __members__: typing.ClassVar[ + dict[str, selection_policy] + ] # value = {'round_robin': <selection_policy.round_robin: 0>, 'round_robin_halt': <selection_policy.round_robin_halt: 1>, 'univalent': <selection_policy.univalent: 2>} + round_robin: typing.ClassVar[ + selection_policy + ] # value = <selection_policy.round_robin: 0> + round_robin_halt: typing.ClassVar[ + selection_policy + ] # value = <selection_policy.round_robin_halt: 1> + univalent: typing.ClassVar[ + selection_policy + ] # value = <selection_policy.univalent: 2> + def __eq__(self, other: typing.Any) -> bool: ... + def __getstate__(self) -> int: ... + def __hash__(self) -> int: ... + def __index__(self) -> int: ... + def __init__(self, value: int) -> None: ... + def __int__(self) -> int: ... + def __ne__(self, other: typing.Any) -> bool: ... + def __repr__(self) -> str: ... + def __setstate__(self, state: int) -> None: ... + def __str__(self) -> str: ... + @property + def name(self) -> str: ... + @property + def value(self) -> int: ... + +class simulation: + """ + The executable form of a model. + A simulation is constructed from a recipe, and then used to update and monitor model state. + """ + + @staticmethod + def deserialize(*args, **kwargs) -> None: ... + def __init__( + self, + recipe: recipe, + context: context | None = None, + domains: domain_decomposition | None = None, + seed: int = 0, + ) -> None: + """ + Initialize the model described by a recipe, with cells and network distributed + according to the domain decomposition and computational resources described by a + context. Initialize PRNG using seed + """ + def clear_samplers(self) -> None: + """ + Clearing spike and sample information. restoring memory + """ + @typing.overload + def probe_metadata(self, probeset_id: cell_address) -> list: + """ + Retrieve metadata associated with given probe id. + """ + @typing.overload + def probe_metadata(self, addr: tuple[int, str]) -> list: + """ + Retrieve metadata associated with given probe id. + """ + @typing.overload + def probe_metadata(self, gid: int, tag: str) -> list: + """ + Retrieve metadata associated with given probe id. + """ + def progress_banner(self) -> None: + """ + Show a text progress bar during simulation. + """ + def record(self, arg0: spike_recording) -> None: + """ + Disable or enable local or global spike recording. + """ + def remove_all_samplers(self, arg0: int) -> None: + """ + Remove all sampling on the simulatr. + """ + def remove_sampler(self, handle: int) -> None: + """ + Remove sampling associated with the given handle. + """ + def reset(self) -> None: + """ + Reset the state of the simulation to its initial state. + """ + def run(self, tfinal: units.quantity, dt: units.quantity = ...) -> float: + """ + Run the simulation from current simulation time to tfinal [ms], with maximum time step size dt [ms]. + """ + @typing.overload + def sample(self, probeset_id: cell_address, schedule: schedule_base) -> int: + """ + Record data from probes with given probeset_id according to supplied schedule. + Returns handle for retrieving data or removing the sampling. + """ + @typing.overload + def sample(self, gid: int, tag: str, schedule: schedule_base) -> int: + """ + Record data from probes with given probeset_id=(gid, tag) according to supplied schedule. + Returns handle for retrieving data or removing the sampling. + """ + @typing.overload + def sample(self, probeset_id: tuple[int, str], schedule: schedule_base) -> int: + """ + Record data from probes with given probeset_id=(gid, tag) according to supplied schedule. + Returns handle for retrieving data or removing the sampling. + """ + def samples(self, handle: int) -> list: + """ + Retrieve sample data as a list, one element per probe associated with the query. + """ + def serialize(self) -> str: + """ + Serialize the simulation object to a JSON string. + """ + def set_remote_spike_filter(self, pred: typing.Callable[[spike], bool]) -> None: + """ + Add a callback to filter spikes going out over external connections. `pred` isa callable on the `spike` type. **Caution**: This will be extremely slow; use C++ if you want to make use of this. + """ + def spikes(self) -> typing.Any: + """ + Retrieve recorded spikes as numpy array. + """ + def update(self, recipe: recipe) -> None: + """ + Rebuild the connection table from recipe::connections_on and the eventgenerators based on recipe::event_generators. + """ + +class single_cell_model: + """ + Wrapper for simplified description, and execution, of single cell models. + """ + + @typing.overload + def __init__( + self, tree: segment_tree, decor: decor, labels: label_dict = ... + ) -> None: + """ + Build single cell model from cable cell components + """ + @typing.overload + def __init__( + self, morph: morphology, decor: decor, labels: label_dict = ... + ) -> None: + """ + Build single cell model from cable cell components + """ + @typing.overload + def __init__(self, cell: cable_cell) -> None: + """ + Initialise a single cell model for a cable cell. + """ + def __repr__(self) -> str: ... + def __str__(self) -> str: ... + def event_generator(self, event_generator: event_generator) -> None: + """ + Register an event generator. + event_generator: An Arbor event generator. + """ + @typing.overload + def probe(self, what: str, where: str, tag: str, frequency: units.quantity) -> None: + """ + Sample a variable on the cell. + what: Name of the variable to record (currently only 'voltage'). + where: Location on cell morphology at which to sample the variable. + tag: Unique name for this probe. + frequency: The target frequency at which to sample [kHz]. + """ + @typing.overload + def probe( + self, what: str, where: location, tag: str, frequency: units.quantity + ) -> None: + """ + Sample a variable on the cell. + what: Name of the variable to record (currently only 'voltage'). + where: Location on cell morphology at which to sample the variable. + tag: Unique name for this probe. + frequency: The target frequency at which to sample [kHz]. + """ + def run(self, tfinal: units.quantity, dt: units.quantity = ...) -> None: + """ + Run model from t=0 to t=tfinal ms. + """ + @property + def cable_cell(self) -> cable_cell: + """ + The cable cell held by this model. + """ + @property + def properties(self) -> cable_global_properties: + """ + Global properties. + """ + @properties.setter + def properties(self, arg0: cable_global_properties) -> None: ... + @property + def spikes(self) -> list[float]: + """ + Holds spike times [ms] after a call to run(). + """ + @property + def traces(self) -> list[trace]: + """ + Holds sample traces after a call to run(). + """ + +class spike: + def __init__(self, arg0: cell_member, arg1: float) -> None: ... + def __repr__(self) -> str: ... + def __str__(self) -> str: ... + @property + def source(self) -> cell_member: + """ + The global identifier of the cell. + """ + @source.setter + def source(self, arg0: cell_member) -> None: ... + @property + def time(self) -> float: + """ + The time of spike. + """ + @time.setter + def time(self, arg0: float) -> None: ... + +class spike_recording: + """ + Members: + + off + + local + + all + """ + + __members__: typing.ClassVar[ + dict[str, spike_recording] + ] # value = {'off': <spike_recording.off: 0>, 'local': <spike_recording.local: 1>, 'all': <spike_recording.all: 2>} + all: typing.ClassVar[spike_recording] # value = <spike_recording.all: 2> + local: typing.ClassVar[spike_recording] # value = <spike_recording.local: 1> + off: typing.ClassVar[spike_recording] # value = <spike_recording.off: 0> + def __eq__(self, other: typing.Any) -> bool: ... + def __getstate__(self) -> int: ... + def __hash__(self) -> int: ... + def __index__(self) -> int: ... + def __init__(self, value: int) -> None: ... + def __int__(self) -> int: ... + def __ne__(self, other: typing.Any) -> bool: ... + def __repr__(self) -> str: ... + def __setstate__(self, state: int) -> None: ... + def __str__(self) -> str: ... + @property + def name(self) -> str: ... + @property + def value(self) -> int: ... + +class spike_source_cell: + """ + A spike source cell, that generates a user-defined sequence of spikes that act as inputs for other cells in the network. + """ + + @typing.overload + def __init__(self, source_label: str, schedule: regular_schedule) -> None: + """ + Construct a spike source cell with a single source labeled 'source_label'. + The cell generates spikes on 'source_label' at regular intervals. + """ + @typing.overload + def __init__(self, source_label: str, schedule: explicit_schedule) -> None: + """ + Construct a spike source cell with a single source labeled 'source_label'. + The cell generates spikes on 'source_label' at a sequence of user-defined times. + """ + @typing.overload + def __init__(self, source_label: str, schedule: poisson_schedule) -> None: + """ + Construct a spike source cell with a single source labeled 'source_label'. + The cell generates spikes on 'source_label' at times defined by a Poisson sequence. + """ + def __repr__(self) -> str: ... + def __str__(self) -> str: ... + +class synapse: + """ + For placing a synaptic mechanism on a locset. + """ + + @typing.overload + def __init__(self, arg0: str) -> None: ... + @typing.overload + def __init__(self, arg0: mechanism) -> None: ... + @typing.overload + def __init__(self, arg0: str, arg1: dict[str, float]) -> None: ... + @typing.overload + def __init__(self, arg0: mechanism, arg1: dict[str, float]) -> None: ... + @typing.overload + def __init__(self, arg0: str, **kwargs) -> None: ... + @typing.overload + def __init__(self, arg0: mechanism, **kwargs) -> None: ... + def __repr__(self) -> str: ... + def __str__(self) -> str: ... + @property + def mech(self) -> mechanism: + """ + The underlying mechanism. + """ + +class temperature: + """ + Setting the temperature. + """ + + def __init__(self, arg0: units.quantity) -> None: ... + def __repr__(self) -> str: ... + +class threshold_detector: + """ + A spike detector, generates a spike when voltage crosses a threshold. Can be used as source endpoint for an arbor.connection. + """ + + def __init__(self, threshold: units.quantity) -> None: + """ + Voltage threshold of spike detector [mV] + """ + def __repr__(self) -> str: ... + def __str__(self) -> str: ... + @property + def threshold(self) -> float: + """ + Voltage threshold of spike detector [mV] + """ + +class trace: + """ + Values and meta-data for a sample-trace on a single cell model. + """ + + def __repr__(self) -> str: ... + def __str__(self) -> str: ... + @property + def location(self) -> location: + """ + Location on cell morphology. + """ + @property + def time(self) -> list[float]: + """ + Time stamps of samples [ms]. + """ + @property + def value(self) -> list[float]: + """ + Sample values. + """ + @property + def variable(self) -> str: + """ + Name of the variable being recorded. + """ + +class voltage_process: + """ + For painting a voltage_process mechanism on a region. + """ + + @typing.overload + def __init__(self, arg0: str) -> None: ... + @typing.overload + def __init__(self, arg0: mechanism) -> None: ... + @typing.overload + def __init__(self, arg0: str, arg1: dict[str, float]) -> None: ... + @typing.overload + def __init__(self, arg0: mechanism, arg1: dict[str, float]) -> None: ... + @typing.overload + def __init__(self, arg0: mechanism, **kwargs) -> None: ... + @typing.overload + def __init__(self, arg0: str, **kwargs) -> None: ... + def __repr__(self) -> str: ... + def __str__(self) -> str: ... + @property + def mech(self) -> mechanism: + """ + The underlying mechanism. + """ + +def allen_catalogue() -> catalogue: ... +def bbp_catalogue() -> catalogue: ... +def cable_probe_axial_current(where: str, tag: str) -> probe: + """ + Probe specification for cable cell axial current at points in a location set. + """ + +def cable_probe_density_state( + where: str, mechanism: str, state: str, tag: str +) -> probe: + """ + Probe specification for a cable cell density mechanism state variable at points in a location set. + """ + +def cable_probe_density_state_cell(mechanism: str, state: str, tag: str) -> probe: + """ + Probe specification for a cable cell density mechanism state variable on each cable in each CV where defined. + """ + +def cable_probe_ion_current_cell(ion: str, tag: str) -> probe: + """ + Probe specification for cable cell ionic current across each cable in each CV. + """ + +def cable_probe_ion_current_density(where: str, ion: str, tag: str) -> probe: + """ + Probe specification for cable cell ionic current density at points in a location set. + """ + +def cable_probe_ion_diff_concentration(where: str, ion: str, tag: str) -> probe: + """ + Probe specification for cable cell diffusive ionic concentration at points in a location set. + """ + +def cable_probe_ion_diff_concentration_cell(ion: str, tag: str) -> probe: + """ + Probe specification for cable cell diffusive ionic concentration for each cable in each CV. + """ + +def cable_probe_ion_ext_concentration(where: str, ion: str, tag: str) -> probe: + """ + Probe specification for cable cell external ionic concentration at points in a location set. + """ + +def cable_probe_ion_ext_concentration_cell(ion: str, tag: str) -> probe: + """ + Probe specification for cable cell external ionic concentration for each cable in each CV. + """ + +def cable_probe_ion_int_concentration(where: str, ion: str, tag: str) -> probe: + """ + Probe specification for cable cell internal ionic concentration at points in a location set. + """ + +def cable_probe_ion_int_concentration_cell(ion: str, tag: str) -> probe: + """ + Probe specification for cable cell internal ionic concentration for each cable in each CV. + """ + +def cable_probe_membrane_voltage(where: str, tag: str) -> probe: + """ + Probe specification for cable cell membrane voltage interpolated at points in a location set. + """ + +def cable_probe_membrane_voltage_cell(tag: str) -> probe: + """ + Probe specification for cable cell membrane voltage associated with each cable in each CV. + """ + +def cable_probe_point_state(target: int, mechanism: str, state: str, tag: str) -> probe: + """ + Probe specification for a cable cell point mechanism state variable value at a given target index. + """ + +def cable_probe_point_state_cell(mechanism: str, state: str, tag: str) -> probe: + """ + Probe specification for a cable cell point mechanism state variable value at every corresponding target. + """ + +def cable_probe_stimulus_current_cell(tag: str) -> probe: + """ + Probe specification for cable cell stimulus current across each cable in each CV. + """ + +def cable_probe_total_current_cell(tag: str) -> probe: + """ + Probe specification for cable cell total transmembrane current for each cable in each CV. + """ + +def cable_probe_total_ion_current_cell(tag: str) -> probe: + """ + Probe specification for cable cell total transmembrane current excluding capacitive currents for each cable in each CV. + """ + +def cable_probe_total_ion_current_density(where: str, tag: str) -> probe: + """ + Probe specification for cable cell total transmembrane current density excluding capacitive currents at points in a location set. + """ + +def config() -> dict: + """ + Get Arbor's configuration. + """ + +def cv_data(cell: cable_cell) -> cell_cv_data | None: + """ + Returns a cell_cv_data object representing the CVs comprising the cable-cell according to the discretization policy provided in the decor of the cell. Returns None if no CV-policy was provided in the decor. + """ + +def cv_policy_every_segment(domain: str = "(all)") -> cv_policy: + """ + Policy to create one compartment per component of a region. + """ + +def cv_policy_explicit(locset: str, domain: str = "(all)") -> cv_policy: + """ + Policy to create compartments at explicit locations. + """ + +def cv_policy_fixed_per_branch(n: int, domain: str = "(all)") -> cv_policy: + """ + Policy to use the same number of CVs for each branch. + """ + +def cv_policy_max_extent(length: float, domain: str = "(all)") -> cv_policy: + """ + Policy to use as many CVs as required to ensure that no CV has a length longer than a given value. + """ + +def cv_policy_single(domain: str = "(all)") -> cv_policy: + """ + Policy to create one compartment per component of a region. + """ + +def default_catalogue() -> catalogue: ... +def intersect_region(reg: str, data: cell_cv_data, integrate_along: str) -> list[tuple]: + """ + Returns a list of [index, proportion] tuples identifying the CVs present in the region. + `index` is the index of the CV in the cell_cv_data object provided as an argument. + `proportion` is the proportion of the CV (itegrated by area or length) included in the region. + """ + +def lif_probe_voltage(tag: str) -> probe: + """ + Probe specification for LIF cell membrane voltage. + """ + +def load_asc( + filename_or_stream: typing.Any, raw: bool = False +) -> segment_tree | asc_morphology: + """ + Load a morphology or segment_tree (raw=True) and meta data from a Neurolucida ASCII .asc file. + """ + +def load_catalogue(arg0: typing.Any) -> catalogue: ... +def load_component(filename_or_descriptor: typing.Any) -> cable_component: + """ + Load arbor-component (decor, morphology, label_dict, cable_cell) from file. + """ + +def load_swc_arbor( + filename_or_stream: typing.Any, raw: bool = False +) -> segment_tree | morphology: + """ + Generate a morphology/segment_tree (raw=False/True) from an SWC file following the rules prescribed by Arbor. + Specifically: + * Single-segment somas are disallowed. + * There are no special rules related to somata. They can be one or multiple branches + and other segments can connect anywhere along them. + * A segment is always created between a sample and its parent, meaning there + are no gaps in the resulting morphology. + """ + +def load_swc_neuron( + filename_or_stream: typing.Any, raw: bool = False +) -> segment_tree | morphology: + """ + Generate a morphology/segment_tree (raw=False/True) from an SWC file following the rules prescribed by NEURON. + See the documentation https://docs.arbor-sim.org/en/latest/fileformat/swc.html + for a detailed description of the interpretation. + """ + +def neuron_cable_properties() -> cable_global_properties: + """ + default NEURON cable_global_properties + """ + +def partition_by_group( + recipe: recipe, context: context, groups: list[group_description] +) -> domain_decomposition: + """ + Construct a domain_decomposition that assigned the groups of cell provided as argument + to the local hardware resources described by context on the calling rank. + The cell_groups are guaranteed to be present on the calling rank. + """ + +def partition_load_balance( + recipe: recipe, context: context, hints: dict[cell_kind, partition_hint] = {} +) -> domain_decomposition: + """ + Construct a domain_decomposition that distributes the cells in the model described by recipe + over the distributed and local hardware resources described by context. + Optionally, provide a dictionary of partition hints for certain cell kinds, by default empty. + """ + +def print_config() -> None: + """ + Print Arbor's configuration. + """ + +def stochastic_catalogue() -> catalogue: ... +@typing.overload +def write_component( + object: cable_component, filename_or_descriptor: typing.Any +) -> None: + """ + Write cable_component to file. + """ + +@typing.overload +def write_component(object: decor, filename_or_descriptor: typing.Any) -> None: + """ + Write decor to file. + """ + +@typing.overload +def write_component(object: label_dict, filename_or_descriptor: typing.Any) -> None: + """ + Write label_dict to file. + """ + +@typing.overload +def write_component(object: morphology, filename_or_descriptor: typing.Any) -> None: + """ + Write morphology to file. + """ + +@typing.overload +def write_component(object: cable_cell, filename_or_descriptor: typing.Any) -> None: + """ + Write cable_cell to file. + """ + +__version__: str = "0.9.1-dev" +mnpos: int = 4294967295 diff --git a/python/stubs/arbor/_arbor/env.pyi b/python/stubs/arbor/_arbor/env.pyi new file mode 100644 index 0000000000000000000000000000000000000000..103e23303334f797a3b6c05e67c61aa2e7938cac --- /dev/null +++ b/python/stubs/arbor/_arbor/env.pyi @@ -0,0 +1,46 @@ +""" +Wrappers for arborenv. +""" +from __future__ import annotations +import arbor._arbor +import typing + +__all__ = [ + "default_allocation", + "default_concurrency", + "default_gpu", + "find_private_gpu", + "get_env_num_threads", + "thread_concurrency", +] + +def default_allocation() -> arbor._arbor.proc_allocation: + """ + Attempts to detect the number of locally available CPU cores. Returns 1 if unable to detect the number of cores. Use with caution in combination with MPI. + """ + +def default_concurrency() -> arbor._arbor.proc_allocation: + """ + Returns number of threads to use from get_env_num_threads(), or else from thread_concurrency() if get_env_num_threads() returns zero. + """ + +def default_gpu() -> int | None: + """ + Determine GPU id to use from the ARBENV_GPU_ID environment variable, or from the first available GPU id of those detected. + """ + +def find_private_gpu(arg0: typing.Any) -> None: + """ + Identify a private GPU id per node, only available if built with GPU and MPI. + mpi: The MPI communicator. + """ + +def get_env_num_threads() -> int: + """ + Retrieve user-specified number of threads to use from the environment variable ARBENV_NUM_THREADS. + """ + +def thread_concurrency() -> int: + """ + Attempts to detect the number of locally available CPU cores. Returns 1 if unable to detect the number of cores. Use with caution in combination with MPI. + """ diff --git a/python/stubs/arbor/_arbor/py.typed b/python/stubs/arbor/_arbor/py.typed new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/python/stubs/arbor/_arbor/units.pyi b/python/stubs/arbor/_arbor/units.pyi new file mode 100644 index 0000000000000000000000000000000000000000..f5a79e4944891e1c6c1ee5fa9c591f76b36481c1 --- /dev/null +++ b/python/stubs/arbor/_arbor/units.pyi @@ -0,0 +1,185 @@ +""" +Units and quantities for driving the user interface. +""" +from __future__ import annotations +import typing + +__all__ = [ + "A", + "C", + "Celsius", + "F", + "Hz", + "Kelvin", + "M", + "MOhm", + "Ohm", + "S", + "V", + "cm", + "cm2", + "deg", + "giga", + "kHz", + "kOhm", + "kilo", + "m", + "m2", + "mA", + "mM", + "mS", + "mV", + "mega", + "micro", + "milli", + "mm", + "mm2", + "mol", + "ms", + "nA", + "nF", + "nano", + "nil", + "nm", + "nm2", + "ns", + "pA", + "pF", + "pico", + "quantity", + "rad", + "s", + "uA", + "uF", + "uS", + "um", + "um2", + "unit", + "us", +] + +class quantity: + """ + A quantity, comprising a magnitude and a unit. + """ + + __hash__: typing.ClassVar[None] = None + def __add__(self, arg0: quantity) -> quantity: ... + def __eq__(self, arg0: quantity) -> bool: ... + @typing.overload + def __mul__(self, arg0: quantity) -> quantity: ... + @typing.overload + def __mul__(self, arg0: float) -> quantity: ... + @typing.overload + def __mul__(self, arg0: unit) -> quantity: ... + def __ne__(self, arg0: quantity) -> bool: ... + def __pow__(self: unit, arg0: int) -> unit: ... + def __repr__(self) -> str: + """ + Convert quantity to string. + """ + def __rmul__(self, arg0: float) -> quantity: ... + def __rtruediv__(self, arg0: float) -> quantity: ... + def __str__(self) -> str: + """ + Convert quantity to string. + """ + def __sub__(self, arg0: quantity) -> quantity: ... + @typing.overload + def __truediv__(self, arg0: quantity) -> quantity: ... + @typing.overload + def __truediv__(self, arg0: float) -> quantity: ... + @typing.overload + def __truediv__(self, arg0: unit) -> quantity: ... + def value_as(self, unit: unit) -> float: + """ + Convert quantity to given unit and return magnitude. + """ + @property + def units(self) -> unit: + """ + Return units. + """ + @property + def value(self) -> float: + """ + Return magnitude. + """ + +class unit: + """ + A unit. + """ + + __hash__: typing.ClassVar[None] = None + def __eq__(self, arg0: unit) -> bool: ... + @typing.overload + def __mul__(self, arg0: unit) -> unit: ... + @typing.overload + def __mul__(self, arg0: float) -> quantity: ... + def __ne__(self, arg0: unit) -> bool: ... + def __pow__(self, arg0: int) -> unit: ... + def __repr__(self) -> str: + """ + Convert unit to string. + """ + def __rmul__(self, arg0: float) -> quantity: ... + def __rtruediv__(self, arg0: float) -> quantity: ... + def __str__(self) -> str: + """ + Convert unit to string. + """ + @typing.overload + def __truediv__(self, arg0: unit) -> unit: ... + @typing.overload + def __truediv__(self, arg0: float) -> quantity: ... + +A: unit # value = A +C: unit # value = C +Celsius: unit # value = °C +F: unit # value = F +Hz: unit # value = Hz +Kelvin: unit # value = K +M: unit # value = mol/m^3 +MOhm: unit # value = 1/uS +Ohm: unit # value = 1/S +S: unit # value = S +V: unit # value = V +cm: unit # value = cm +cm2: unit # value = cm^2 +deg: unit # value = deg +giga: unit # value = 1000000000 +kHz: unit # value = kHz +kOhm: unit # value = 1/mS +kilo: unit # value = 1000 +m: unit # value = m +m2: unit # value = m^2 +mA: unit # value = mA +mM: unit # value = umol/L +mS: unit # value = mS +mV: unit # value = mV +mega: unit # value = 1000000 +micro: unit # value = 9.99999997475242708e-07 +milli: unit # value = 0.00100000004749745131 +mm: unit # value = mm +mm2: unit # value = mm^2 +mol: unit # value = mol +ms: unit # value = ms +nA: unit # value = nA +nF: unit # value = nF +nano: unit # value = 9.99999971718068537e-10 +nil: unit # value = +nm: unit # value = nm +nm2: unit # value = nm^2 +ns: unit # value = ns +pA: unit # value = pA +pF: unit # value = pF +pico: unit # value = 9.999999960041972e-13 +rad: unit # value = rad +s: unit # value = s +uA: unit # value = uA +uF: unit # value = uF +uS: unit # value = uS +um: unit # value = um +um2: unit # value = um^2 +us: unit # value = us diff --git a/python/stubs/arbor/py.typed b/python/stubs/arbor/py.typed new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/python/stubs/py.typed b/python/stubs/py.typed new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/python/test/fixtures.py b/python/test/fixtures.py index 11b901175076864c5d2e8233c2779e1328d9c20d..1071653855f5b86939495b94a7120388d3984525 100644 --- a/python/test/fixtures.py +++ b/python/test/fixtures.py @@ -1,4 +1,5 @@ -import arbor +import arbor as A +from arbor import units as U import functools from functools import lru_cache as cache from pathlib import Path @@ -6,8 +7,8 @@ import subprocess import atexit import inspect -_mpi_enabled = arbor.__config__["mpi"] -_mpi4py_enabled = arbor.__config__["mpi4py"] +_mpi_enabled = A.__config__["mpi"] +_mpi4py_enabled = A.__config__["mpi4py"] # The API of `functools`'s caches went through a bunch of breaking changes from # 3.6 to 3.9. Patch them up in a local `cache` function. @@ -78,13 +79,13 @@ def _finalize_mpi(): MPI.Finalize() else: - arbor.mpi_finalize() + A.mpi_finalize() @_fixture def context(): """ - Fixture that produces an MPI sensitive `arbor.context` + Fixture that produces an MPI sensitive `A.context` """ if _mpi_enabled: if _mpi4py_enabled: @@ -94,13 +95,13 @@ def context(): print("Context fixture initializing mpi4py", flush=True) MPI.Initialize() atexit.register(_finalize_mpi) - return arbor.context(arbor.proc_allocation(), mpi=MPI.COMM_WORLD) - elif not arbor.mpi_is_initialized(): + return A.context(A.proc_allocation(), mpi=MPI.COMM_WORLD) + elif not A.mpi_is_initialized(): print("Context fixture initializing mpi", flush=True) - arbor.mpi_init() + A.mpi_init() atexit.register(_finalize_mpi) - return arbor.context(arbor.proc_allocation(), mpi=arbor.mpi_comm()) - return arbor.context(arbor.proc_allocation()) + return A.context(A.proc_allocation(), mpi=A.mpi_comm()) + return A.context(A.proc_allocation()) class _BuildCatError(Exception): @@ -165,16 +166,16 @@ def _build_cat(name, path, context): @repo_path() def dummy_catalogue(repo_path): """ - Fixture that returns a dummy `arbor.catalogue` + Fixture that returns a dummy `A.catalogue` which contains the `dummy` mech. """ path = repo_path / "test" / "unit" / "dummy" cat_path = _build_cat("dummy", path) - return arbor.load_catalogue(str(cat_path)) + return A.load_catalogue(str(cat_path)) @_fixture -class empty_recipe(arbor.recipe): +class empty_recipe(A.recipe): """ Blank recipe fixture. """ @@ -183,14 +184,14 @@ class empty_recipe(arbor.recipe): @_fixture -class art_spiker_recipe(arbor.recipe): +class art_spiker_recipe(A.recipe): """ Recipe fixture with 3 artificial spiking cells and one cable cell. """ def __init__(self): super().__init__() - self.the_props = arbor.neuron_cable_properties() + self.the_props = A.neuron_cable_properties() self.trains = [[0.8, 2, 2.1, 3], [0.4, 2, 2.2, 3.1, 4.5], [0.2, 2, 2.8, 3]] def num_cells(self): @@ -198,9 +199,9 @@ class art_spiker_recipe(arbor.recipe): def cell_kind(self, gid): if gid < 3: - return arbor.cell_kind.spike_source + return A.cell_kind.spike_source else: - return arbor.cell_kind.cable + return A.cell_kind.cable def connections_on(self, gid): return [] @@ -215,41 +216,44 @@ class art_spiker_recipe(arbor.recipe): if gid < 3: return [] else: - return [arbor.cable_probe_membrane_voltage('"midpoint"', "Um")] + return [A.cable_probe_membrane_voltage('"midpoint"', "Um")] def _cable_cell_elements(self): # (1) Create a morphology with a single (cylindrical) segment of length=diameter # = # 6 μm - tree = arbor.segment_tree() + tree = A.segment_tree() tree.append( - arbor.mnpos, - arbor.mpoint(-3, 0, 0, 3), - arbor.mpoint(3, 0, 0, 3), + A.mnpos, + (-3, 0, 0, 3), + (3, 0, 0, 3), tag=1, ) # (2) Define the soma and its midpoint - labels = arbor.label_dict({"soma": "(tag 1)", "midpoint": "(location 0 0.5)"}) + labels = A.label_dict({"soma": "(tag 1)", "midpoint": "(location 0 0.5)"}) # (3) Create cell and set properties - decor = arbor.decor() - decor.set_property(Vm=-40) - decor.paint('"soma"', arbor.density("hh")) - decor.place('"midpoint"', arbor.iclamp(10, 2, 0.8), "iclamp") - decor.place('"midpoint"', arbor.threshold_detector(-10), "detector") + decor = ( + A.decor() + .set_property(Vm=-40 * U.mV) + .paint('"soma"', A.density("hh")) + .place('"midpoint"', A.iclamp(10 * U.ms, 2 * U.ms, 0.8 * U.nA), "iclamp") + .place('"midpoint"', A.threshold_detector(-10 * U.mV), "detector") + ) # return tuple of tree, labels, and decor for creating a cable cell (can still - # be modified before calling arbor.cable_cell()) + # be modified before calling A.cable_cell()) return tree, labels, decor def cell_description(self, gid): if gid < 3: - return arbor.spike_source_cell( - "src", arbor.explicit_schedule(self.trains[gid]) - ) + return A.spike_source_cell("src", self.schedule(gid)) else: tree, labels, decor = self._cable_cell_elements() - return arbor.cable_cell(tree, decor, labels) + return A.cable_cell(tree, decor, labels) + + def schedule(self, gid): + return A.explicit_schedule([t * U.ms for t in self.trains[gid]]) @_fixture @@ -274,5 +278,5 @@ def sum_weight_hh_spike_2(): @context() @art_spiker_recipe() def art_spiking_sim(context, art_spiker_recipe): - dd = arbor.partition_load_balance(art_spiker_recipe, context) - return arbor.simulation(art_spiker_recipe, context, dd) + dd = A.partition_load_balance(art_spiker_recipe, context) + return A.simulation(art_spiker_recipe, context, dd) diff --git a/python/test/unit/test_catalogues.py b/python/test/unit/test_catalogues.py index fef3965e9c3d9d97333d8aeda820997b70cd29bb..a8437cab4dc4af343969e7deae6c51734f3f1df4 100644 --- a/python/test/unit/test_catalogues.py +++ b/python/test/unit/test_catalogues.py @@ -1,29 +1,30 @@ from .. import fixtures import unittest -import arbor as arb +import arbor as A +from arbor import units as U """ tests for (dynamically loaded) catalogues """ -class recipe(arb.recipe): +class recipe(A.recipe): def __init__(self): - arb.recipe.__init__(self) - self.tree = arb.segment_tree() - self.tree.append(arb.mnpos, (0, 0, 0, 10), (1, 0, 0, 10), 1) - self.props = arb.neuron_cable_properties() + A.recipe.__init__(self) + self.tree = A.segment_tree() + self.tree.append(A.mnpos, (0, 0, 0, 10), (1, 0, 0, 10), 1) + self.props = A.neuron_cable_properties() try: - self.props.catalogue = arb.load_catalogue("dummy-catalogue.so") + self.props.catalogue = A.load_catalogue("dummy-catalogue.so") except Exception: print("Catalogue not found. Are you running from build directory?") raise - self.props.catalogue = arb.default_catalogue() + self.props.catalogue = A.default_catalogue() - d = arb.decor() - d.paint("(all)", arb.density("pas")) - d.set_property(Vm=0.0) - self.cell = arb.cable_cell(self.tree, d) + d = A.decor() + d.paint("(all)", A.density("pas")) + d.set_property(Vm=0.0 * U.mV) + self.cell = A.cable_cell(self.tree, d) def global_properties(self, _): return self.props @@ -32,7 +33,7 @@ class recipe(arb.recipe): return 1 def cell_kind(self, gid): - return arb.cell_kind.cable + return A.cell_kind.cable def cell_description(self, gid): return self.cell @@ -41,7 +42,7 @@ class recipe(arb.recipe): class TestCatalogues(unittest.TestCase): def test_nonexistent(self): with self.assertRaises(FileNotFoundError): - arb.load_catalogue("_NO_EXIST_.so") + A.load_catalogue("_NO_EXIST_.so") @fixtures.dummy_catalogue() def test_shared_catalogue(self, dummy_catalogue): @@ -58,10 +59,10 @@ class TestCatalogues(unittest.TestCase): def test_simulation(self): rcp = recipe() - ctx = arb.context() - dom = arb.partition_load_balance(rcp, ctx) - sim = arb.simulation(rcp, ctx, dom) - sim.run(tfinal=30) + ctx = A.context() + dom = A.partition_load_balance(rcp, ctx) + sim = A.simulation(rcp, ctx, dom) + sim.run(tfinal=30 * U.ms) def test_empty(self): def len(cat): @@ -70,9 +71,9 @@ class TestCatalogues(unittest.TestCase): def hash_(cat): return hash(" ".join(sorted(cat))) - cat = arb.catalogue() - ref = arb.default_catalogue() - other = arb.default_catalogue() + cat = A.catalogue() + ref = A.default_catalogue() + other = A.default_catalogue() # Test empty constructor self.assertEqual(0, len(cat), "Expected no mechanisms in `arbor.catalogue()`.") # Test empty extend @@ -98,7 +99,7 @@ class TestCatalogues(unittest.TestCase): hash_(cat), "Extending empty with cat should turn empty into cat.", ) - cat = arb.catalogue() + cat = A.catalogue() cat.extend(other, "prefix/") self.assertNotEqual( hash_(other), diff --git a/python/test/unit/test_clear_samplers.py b/python/test/unit/test_clear_samplers.py index fcfb6d7d95668b55c3b40f0600628103884e46e3..bc7b3e2540e8287af7d44444cdb1af2730ea18f4 100644 --- a/python/test/unit/test_clear_samplers.py +++ b/python/test/unit/test_clear_samplers.py @@ -5,6 +5,7 @@ import unittest import arbor as A import numpy as np +from arbor import units as U from .. import fixtures from .. import cases @@ -21,11 +22,11 @@ class TestClearSamplers(unittest.TestCase): def test_spike_clearing(self, art_spiking_sim): sim = art_spiking_sim sim.record(A.spike_recording.all) - handle = sim.sample((3, "Um"), A.regular_schedule(0.1)) + handle = sim.sample((3, "Um"), A.regular_schedule(0.1 * U.ms)) # baseline to test against Run in exactly the same stepping to make sure there are no rounding differences - sim.run(3, 0.01) - sim.run(5, 0.01) + sim.run(3 * U.ms, 0.01 * U.ms) + sim.run(5 * U.ms, 0.01 * U.ms) spikes = sim.spikes() times = spikes["time"].tolist() gids = spikes["source"]["gid"].tolist() @@ -34,7 +35,7 @@ class TestClearSamplers(unittest.TestCase): sim.reset() # simulated with clearing the memory inbetween the steppings - sim.run(3, 0.01) + sim.run(3 * U.ms, 0.01 * U.ms) spikes = sim.spikes() times_t = spikes["time"].tolist() gids_t = spikes["source"]["gid"].tolist() @@ -51,7 +52,7 @@ class TestClearSamplers(unittest.TestCase): self.assertEqual(0, data_test.size) # run the next part of the simulation - sim.run(5, 0.01) + sim.run(5 * U.ms, 0.01 * U.ms) spikes = sim.spikes() times_t.extend(spikes["time"].tolist()) gids_t.extend(spikes["source"]["gid"].tolist()) diff --git a/python/test/unit/test_decor.py b/python/test/unit/test_decor.py index 59dcf0d90081f590903f69fb12fc9e5757ecd223..18f71f57cc029904a8c60470e9fc8ba99e875010 100644 --- a/python/test/unit/test_decor.py +++ b/python/test/unit/test_decor.py @@ -2,6 +2,7 @@ import unittest import arbor as A +from arbor import units as U """ Tests for decor and decoration wrappers. @@ -12,29 +13,31 @@ TODO: Coverage for more than just iclamp. class TestDecorClasses(unittest.TestCase): def test_iclamp(self): # Constant amplitude iclamp: - clamp = A.iclamp(10) + clamp = A.iclamp(10 * U.nA) self.assertEqual(0, clamp.frequency) self.assertEqual([(0, 10)], clamp.envelope) - clamp = A.iclamp(10, frequency=20) + clamp = A.iclamp(current=10 * U.nA, frequency=20 * U.kHz) self.assertEqual(20, clamp.frequency) self.assertEqual([(0, 10)], clamp.envelope) # Square pulse: - clamp = A.iclamp(100, 20, 3) + clamp = A.iclamp(100 * U.ms, 20 * U.ms, 3 * U.nA) self.assertEqual(0, clamp.frequency) self.assertEqual([(100, 3), (120, 3), (120, 0)], clamp.envelope) - clamp = A.iclamp(100, 20, 3, frequency=7) + clamp = A.iclamp(100 * U.ms, 20 * U.ms, 3 * U.nA, frequency=7 * U.kHz) self.assertEqual(7, clamp.frequency) self.assertEqual([(100, 3), (120, 3), (120, 0)], clamp.envelope) # Explicit envelope: envelope = [(1, 10), (3, 30), (5, 50), (7, 0)] - clamp = A.iclamp(envelope) + clamp = A.iclamp([(t * U.ms, i * U.nA) for t, i in envelope]) self.assertEqual(0, clamp.frequency) self.assertEqual(envelope, clamp.envelope) - clamp = A.iclamp(envelope, frequency=7) + clamp = A.iclamp( + [(t * U.ms, i * U.nA) for t, i in envelope], frequency=7 * U.kHz + ) self.assertEqual(7, clamp.frequency) self.assertEqual(envelope, clamp.envelope) diff --git a/python/test/unit/test_event_generators.py b/python/test/unit/test_event_generators.py index b43387029ceed3777b9e9ebd5c5b060751984f5b..d3e352c52490d665f644d90b6ca9f4e361489c32 100644 --- a/python/test/unit/test_event_generators.py +++ b/python/test/unit/test_event_generators.py @@ -5,6 +5,7 @@ import unittest import arbor as arb +from arbor import units as U """ all tests for event generators (regular, explicit, poisson) @@ -14,7 +15,7 @@ all tests for event generators (regular, explicit, poisson) class TestEventGenerator(unittest.TestCase): def test_event_generator_regular_schedule(self): cm = arb.cell_local_label("tgt0") - rs = arb.regular_schedule(2.0, 1.0, 100.0) + rs = arb.regular_schedule(2.0 * U.ms, 1.0 * U.ms, 100.0 * U.ms) rg = arb.event_generator(cm, 3.14, rs) self.assertEqual(rg.target.label, "tgt0") self.assertEqual(rg.target.policy, arb.selection_policy.univalent) @@ -22,14 +23,14 @@ class TestEventGenerator(unittest.TestCase): def test_event_generator_explicit_schedule(self): cm = arb.cell_local_label("tgt1", arb.selection_policy.round_robin) - es = arb.explicit_schedule([0, 1, 2, 3, 4.4]) + es = arb.explicit_schedule([0 * U.ms, 1 * U.ms, 2 * U.ms, 3 * U.ms, 4.4 * U.ms]) eg = arb.event_generator(cm, -0.01, es) self.assertEqual(eg.target.label, "tgt1") self.assertEqual(eg.target.policy, arb.selection_policy.round_robin) self.assertAlmostEqual(eg.weight, -0.01) def test_event_generator_poisson_schedule(self): - ps = arb.poisson_schedule(0.0, 10.0, 0) + ps = arb.poisson_schedule(freq=10.0 * U.kHz, seed=0) pg = arb.event_generator("tgt2", 42.0, ps) self.assertEqual(pg.target.label, "tgt2") self.assertEqual(pg.target.policy, arb.selection_policy.univalent) diff --git a/python/test/unit/test_io.py b/python/test/unit/test_io.py index 7c2cdee510ac7360585fb1ab8043b66d1e985b86..dec6be09b5edc8398168b0ccceaf5217221d246b 100644 --- a/python/test/unit/test_io.py +++ b/python/test/unit/test_io.py @@ -10,7 +10,7 @@ from functools import partial acc = """(arbor-component (meta-data - (version "0.1-dev")) + (version "0.9-dev")) (cable-cell (morphology (branch 0 -1 @@ -25,25 +25,25 @@ acc = """(arbor-component (location 0 0.5))) (decor (default - (membrane-potential -40.000000)) + (membrane-potential -40.000000 (scalar 1))) (default - (ion-internal-concentration "ca" 0.000050)) + (ion-internal-concentration "ca" 0.000050 (scalar 1))) (default - (ion-external-concentration "ca" 2.000000)) + (ion-external-concentration "ca" 2.000000 (scalar 1))) (default - (ion-reversal-potential "ca" 132.457934)) + (ion-reversal-potential "ca" 132.457934 (scalar 1))) (default - (ion-internal-concentration "k" 54.400000)) + (ion-internal-concentration "k" 54.400000 (scalar 1))) (default - (ion-external-concentration "k" 2.500000)) + (ion-external-concentration "k" 2.500000 (scalar 1))) (default - (ion-reversal-potential "k" -77.000000)) + (ion-reversal-potential "k" -77.000000 (scalar 1))) (default - (ion-internal-concentration "na" 10.000000)) + (ion-internal-concentration "na" 10.000000 (scalar 1))) (default - (ion-external-concentration "na" 140.000000)) + (ion-external-concentration "na" 140.000000 (scalar 1))) (default - (ion-reversal-potential "na" 50.000000)) + (ion-reversal-potential "na" 50.000000 (scalar 1))) (paint (tag 1) (density diff --git a/python/test/unit/test_multiple_connections.py b/python/test/unit/test_multiple_connections.py index 7f8af4fcc4fb14307eaa6b110b4edb7496d78e52..b15a5d92368e9b5ff43c012e66da937885affa25 100644 --- a/python/test/unit/test_multiple_connections.py +++ b/python/test/unit/test_multiple_connections.py @@ -6,7 +6,8 @@ import unittest import types import numpy as np -import arbor as arb +import arbor as A +from arbor import units as U from .. import fixtures """ @@ -38,7 +39,7 @@ class TestMultipleConnections(unittest.TestCase): # Method creating a new mechanism for a synapse with STDP def create_syn_mechanism(self, scale_contrib=1): # create new synapse mechanism - syn_mechanism = arb.mechanism("expsyn_stdp") + syn_mechanism = A.mechanism("expsyn_stdp") # set pre- and postsynaptic contributions for STDP syn_mechanism.set("Apre", 0.01 * scale_contrib) @@ -89,9 +90,7 @@ class TestMultipleConnections(unittest.TestCase): def cell_description(self, gid): # spike source neuron if gid < 3: - return arb.spike_source_cell( - "spike_source", arb.explicit_schedule(self.trains[gid]) - ) + return A.spike_source_cell("spike_source", self.schedule(gid)) # spike-receiving cable neuron elif gid == 3: @@ -101,16 +100,16 @@ class TestMultipleConnections(unittest.TestCase): decor.place( '"midpoint"', - arb.synapse(create_syn_mechanism(scale_stdp)), + A.synapse(create_syn_mechanism(scale_stdp)), "postsyn_target", ) # place synapse for input from one presynaptic neuron at the center of the soma decor.place( '"midpoint"', - arb.synapse(create_syn_mechanism(scale_stdp)), + A.synapse(create_syn_mechanism(scale_stdp)), "postsyn_target", ) # place synapse for input from another presynaptic neuron at the center of the soma # (using the same label as above!) - return arb.cable_cell(tree, decor, labels) + return A.cable_cell(tree, decor, labels) art_spiker_recipe.cell_description = types.MethodType( cell_description, art_spiker_recipe @@ -140,15 +139,15 @@ class TestMultipleConnections(unittest.TestCase): self.assertAlmostEqual(connections_from_recipe[3].delay, 1.4) # construct domain_decomposition and simulation object - sim = arb.simulation(art_spiker_recipe, context) - sim.record(arb.spike_recording.all) + sim = A.simulation(art_spiker_recipe, context) + sim.record(A.spike_recording.all) # create schedule and handle to record the membrane potential of neuron 3 - reg_sched = arb.regular_schedule(0, self.dt, self.runtime) + reg_sched = A.regular_schedule(0 * U.ms, self.dt * U.ms, self.runtime * U.ms) handle_mem = sim.sample((3, "Um"), reg_sched) # run the simulation - sim.run(self.runtime, self.dt) + sim.run(self.runtime * U.ms, self.dt * U.ms) return sim, handle_mem @@ -175,29 +174,29 @@ class TestMultipleConnections(unittest.TestCase): # incoming to neuron 3 elif gid == 3: - source_label_0 = arb.cell_global_label( + source_label_0 = A.cell_global_label( 0, "spike_source" ) # referring to the "spike_source" label of neuron 0 - source_label_1 = arb.cell_global_label( + source_label_1 = A.cell_global_label( 1, "spike_source" ) # referring to the "spike_source" label of neuron 1 - target_label_rr = arb.cell_local_label( - "postsyn_target", arb.selection_policy.round_robin + target_label_rr = A.cell_local_label( + "postsyn_target", A.selection_policy.round_robin ) # referring to the current item in the "postsyn_target" label group of neuron 3, moving to the next item afterwards - conn_0_3_n1 = arb.connection( - source_label_0, target_label_rr, weight, 0.2 + conn_0_3_n1 = A.connection( + source_label_0, target_label_rr, weight, 0.2 * U.ms ) # first connection from neuron 0 to 3 - conn_0_3_n2 = arb.connection( - source_label_0, target_label_rr, weight, 0.2 + conn_0_3_n2 = A.connection( + source_label_0, target_label_rr, weight, 0.2 * U.ms ) # second connection from neuron 0 to 3 # NOTE: this is not connecting to the same target label item as 'conn_0_3_n1' because 'round_robin' has been used before! - conn_1_3_n1 = arb.connection( - source_label_1, target_label_rr, weight2, 1.4 + conn_1_3_n1 = A.connection( + source_label_1, target_label_rr, weight2, 1.4 * U.ms ) # first connection from neuron 1 to 3 - conn_1_3_n2 = arb.connection( - source_label_1, target_label_rr, weight2, 1.4 + conn_1_3_n2 = A.connection( + source_label_1, target_label_rr, weight2, 1.4 * U.ms ) # second connection from neuron 1 to 3 # NOTE: this is not connecting to the same target label item as 'conn_1_3_n1' because 'round_robin' has been used before! @@ -237,31 +236,31 @@ class TestMultipleConnections(unittest.TestCase): # incoming to neuron 3 elif gid == 3: - source_label_0 = arb.cell_global_label( + source_label_0 = A.cell_global_label( 0, "spike_source" ) # referring to the "spike_source" label of neuron 0 - source_label_1 = arb.cell_global_label( + source_label_1 = A.cell_global_label( 1, "spike_source" ) # referring to the "spike_source" label of neuron 1 - target_label_rr_halt = arb.cell_local_label( - "postsyn_target", arb.selection_policy.round_robin_halt + target_label_rr_halt = A.cell_local_label( + "postsyn_target", A.selection_policy.round_robin_halt ) # referring to the current item in the "postsyn_target" label group of neuron 3 - target_label_rr = arb.cell_local_label( - "postsyn_target", arb.selection_policy.round_robin + target_label_rr = A.cell_local_label( + "postsyn_target", A.selection_policy.round_robin ) # referring to the current item in the "postsyn_target" label group of neuron 3, moving to the next item afterwards - conn_0_3_n1 = arb.connection( - source_label_0, target_label_rr_halt, weight, 0.2 + conn_0_3_n1 = A.connection( + source_label_0, target_label_rr_halt, weight, 0.2 * U.ms ) # first connection from neuron 0 to 3 - conn_0_3_n2 = arb.connection( - source_label_0, target_label_rr, weight, 0.2 + conn_0_3_n2 = A.connection( + source_label_0, target_label_rr, weight, 0.2 * U.ms ) # second connection from neuron 0 to 3 - conn_1_3_n1 = arb.connection( - source_label_1, target_label_rr_halt, weight2, 1.4 + conn_1_3_n1 = A.connection( + source_label_1, target_label_rr_halt, weight2, 1.4 * U.ms ) # first connection from neuron 1 to 3 - conn_1_3_n2 = arb.connection( - source_label_1, target_label_rr, weight2, 1.4 + conn_1_3_n2 = A.connection( + source_label_1, target_label_rr, weight2, 1.4 * U.ms ) # second connection from neuron 1 to 3 return [conn_0_3_n1, conn_0_3_n2, conn_1_3_n1, conn_1_3_n2] @@ -298,25 +297,25 @@ class TestMultipleConnections(unittest.TestCase): # incoming to neuron 3 elif gid == 3: - source_label_0 = arb.cell_global_label( + source_label_0 = A.cell_global_label( 0, "spike_source" ) # referring to the "spike_source" label of neuron 0 - source_label_1 = arb.cell_global_label( + source_label_1 = A.cell_global_label( 1, "spike_source" ) # referring to the "spike_source" label of neuron 1 - target_label_uni_n1 = arb.cell_local_label( - "postsyn_target_1", arb.selection_policy.univalent + target_label_uni_n1 = A.cell_local_label( + "postsyn_target_1", A.selection_policy.univalent ) # referring to an only item in the "postsyn_target_1" label group of neuron 3 - target_label_uni_n2 = arb.cell_local_label( - "postsyn_target_2", arb.selection_policy.univalent + target_label_uni_n2 = A.cell_local_label( + "postsyn_target_2", A.selection_policy.univalent ) # referring to an only item in the "postsyn_target_2" label group of neuron 3 - conn_0_3 = arb.connection( - source_label_0, target_label_uni_n1, weight, 0.2 + conn_0_3 = A.connection( + source_label_0, target_label_uni_n1, weight, 0.2 * U.ms ) # connection from neuron 0 to 3 - conn_1_3 = arb.connection( - source_label_1, target_label_uni_n2, weight2, 1.4 + conn_1_3 = A.connection( + source_label_1, target_label_uni_n2, weight2, 1.4 * U.ms ) # connection from neuron 1 to 3 return [conn_0_3, conn_1_3] @@ -331,9 +330,7 @@ class TestMultipleConnections(unittest.TestCase): def cell_description(self, gid): # spike source neuron if gid < 3: - return arb.spike_source_cell( - "spike_source", arb.explicit_schedule(self.trains[gid]) - ) + return A.spike_source_cell("spike_source", self.schedule(gid)) # spike-receiving cable neuron elif gid == 3: @@ -341,17 +338,17 @@ class TestMultipleConnections(unittest.TestCase): decor.place( '"midpoint"', - arb.synapse(create_syn_mechanism()), + A.synapse(create_syn_mechanism()), "postsyn_target_1", ) # place synapse for input from one presynaptic neuron at the center of the soma decor.place( '"midpoint"', - arb.synapse(create_syn_mechanism()), + A.synapse(create_syn_mechanism()), "postsyn_target_2", ) # place synapse for input from another presynaptic neuron at the center of the soma # (using another label as above!) - return arb.cable_cell(tree, decor, labels) + return A.cable_cell(tree, decor, labels) art_spiker_recipe.cell_description = types.MethodType( cell_description, art_spiker_recipe @@ -371,15 +368,15 @@ class TestMultipleConnections(unittest.TestCase): self.assertAlmostEqual(connections_from_recipe[1].delay, 1.4) # construct simulation object - sim = arb.simulation(art_spiker_recipe, context) - sim.record(arb.spike_recording.all) + sim = A.simulation(art_spiker_recipe, context) + sim.record(A.spike_recording.all) # create schedule and handle to record the membrane potential of neuron 3 - reg_sched = arb.regular_schedule(0, self.dt, self.runtime) + reg_sched = A.regular_schedule(0 * U.ms, self.dt * U.ms, self.runtime * U.ms) handle_mem = sim.sample((3, "Um"), reg_sched) # run the simulation - sim.run(self.runtime, self.dt) + sim.run(self.runtime * U.ms, self.dt * U.ms) # evaluate the outcome self.evaluate_outcome(sim, handle_mem) diff --git a/python/test/unit/test_probes.py b/python/test/unit/test_probes.py index 417ea1d51d01953e295e6f1d506836f22faf5b0b..f72bfb4e3ee801f55bae2bfb613b54e112e0fbeb 100644 --- a/python/test/unit/test_probes.py +++ b/python/test/unit/test_probes.py @@ -2,6 +2,7 @@ import unittest import arbor as A +from arbor import units as U import numpy as np """ @@ -22,7 +23,7 @@ class cc_recipe(A.recipe): dec.place("(location 0 0.08)", A.synapse("expsyn"), "syn0") dec.place("(location 0 0.09)", A.synapse("exp2syn"), "syn1") - dec.place("(location 0 0.1)", A.iclamp(20.0), "iclamp") + dec.place("(location 0 0.1)", A.iclamp(20.0 * U.nA), "iclamp") dec.paint("(all)", A.density("hh")) self.cell = A.cable_cell(st, dec) @@ -184,9 +185,9 @@ class lif_recipe(A.recipe): def cell_description(self, gid): cell = A.lif_cell("src", "tgt") - cell.E_L = -42 - cell.V_m = -23 - cell.t_ref = 0.2 + cell.E_L = -42 * U.mV + cell.V_m = -23 * U.mV + cell.t_ref = 0.2 * U.ms return cell @@ -202,8 +203,8 @@ class TestLifProbes(unittest.TestCase): def test_probe_result(self): rec = lif_recipe() sim = A.simulation(rec) - hdl = sim.sample(0, "Um", A.regular_schedule(0.1)) - sim.run(1.0, 0.05) + hdl = sim.sample(0, "Um", A.regular_schedule(0.1 * U.ms)) + sim.run(1.0 * U.ms, 0.05 * U.ms) smp = sim.samples(hdl) exp = np.array( [ diff --git a/python/test/unit/test_profiling.py b/python/test/unit/test_profiling.py index 9249573c87c3b947f6d2f690a9aa4ef98bb69fff..80a0f8d688de2e0298b740af086724a14007b556 100644 --- a/python/test/unit/test_profiling.py +++ b/python/test/unit/test_profiling.py @@ -4,7 +4,8 @@ import unittest -import arbor as arb +import arbor as A +from arbor import units as U import functools """ @@ -30,17 +31,17 @@ def lazy_skipIf(condition, reason): return inner_decorator -class a_recipe(arb.recipe): +class a_recipe(A.recipe): def __init__(self): - arb.recipe.__init__(self) - self.props = arb.neuron_cable_properties() + A.recipe.__init__(self) + self.props = A.neuron_cable_properties() self.trains = [[0.8, 2, 2.1, 3], [0.4, 2, 2.2, 3.1, 4.5], [0.2, 2, 2.8, 3]] def num_cells(self): return 3 def cell_kind(self, gid): - return arb.cell_kind.spike_source + return A.cell_kind.spike_source def connections_on(self, gid): return [] @@ -55,44 +56,45 @@ class a_recipe(arb.recipe): return [] def cell_description(self, gid): - return arb.spike_source_cell("src", arb.explicit_schedule(self.trains[gid])) + sched = A.explicit_schedule([t * U.ms for t in self.trains[gid]]) + return A.spike_source_cell("src", sched) def skipWithoutSupport(): - return not bool(arb.config().get("profiling", False)) + return not bool(A.config().get("profiling", False)) class TestProfiling(unittest.TestCase): def test_support(self): - self.assertTrue("profiling" in arb.config(), "profiling key not in config") - profiling_support = arb.config()["profiling"] + self.assertTrue("profiling" in A.config(), "profiling key not in config") + profiling_support = A.config()["profiling"] self.assertEqual(bool, type(profiling_support), "profiling flag should be bool") if profiling_support: self.assertTrue( - hasattr(arb, "profiler_initialize"), + hasattr(A, "profiler_initialize"), "missing profiling interface with profiling support", ) self.assertTrue( - hasattr(arb, "profiler_summary"), + hasattr(A, "profiler_summary"), "missing profiling interface with profiling support", ) else: self.assertFalse( - hasattr(arb, "profiler_initialize"), + hasattr(A, "profiler_initialize"), "profiling interface without profiling support", ) self.assertFalse( - hasattr(arb, "profiler_summary"), + hasattr(A, "profiler_summary"), "profiling interface without profiling support", ) @lazy_skipIf(skipWithoutSupport, "run test only with profiling support") def test_summary(self): - context = arb.context() - arb.profiler_initialize(context) + context = A.context() + A.profiler_initialize(context) recipe = a_recipe() - dd = arb.partition_load_balance(recipe, context) - arb.simulation(recipe, context, dd).run(1) - summary = arb.profiler_summary() + dd = A.partition_load_balance(recipe, context) + A.simulation(recipe, context, dd).run(1 * U.ms) + summary = A.profiler_summary() self.assertEqual(str, type(summary), "profiler summary must be str") self.assertTrue(summary, "empty summary") diff --git a/python/test/unit/test_schedules.py b/python/test/unit/test_schedules.py index 0a7c747ec111c21b86d8d46c4f1dfdfc60941959..d23d81e2a080233dff3febaf88a042d35dc941d4 100644 --- a/python/test/unit/test_schedules.py +++ b/python/test/unit/test_schedules.py @@ -4,7 +4,8 @@ import unittest -import arbor as arb +import arbor as A +from arbor import units as U """ all tests for schedules (regular, explicit, poisson) @@ -13,28 +14,28 @@ all tests for schedules (regular, explicit, poisson) class TestRegularSchedule(unittest.TestCase): def test_none_ctor_regular_schedule(self): - rs = arb.regular_schedule(tstart=0, dt=0.1, tstop=None) - self.assertEqual(rs.dt, 0.1) + rs = A.regular_schedule(tstart=0 * U.ms, dt=0.1 * U.ms, tstop=None) + self.assertEqual(rs.dt, 0.1 * U.ms) def test_tstart_dt_tstop_ctor_regular_schedule(self): - rs = arb.regular_schedule(10.0, 1.0, 20.0) - self.assertEqual(rs.tstart, 10.0) - self.assertEqual(rs.dt, 1.0) - self.assertEqual(rs.tstop, 20.0) + rs = A.regular_schedule(10.0 * U.ms, 1.0 * U.ms, 20.0 * U.ms) + self.assertEqual(rs.tstart, 10.0 * U.ms) + self.assertEqual(rs.dt, 1.0 * U.ms) + self.assertEqual(rs.tstop, 20.0 * U.ms) def test_set_tstart_dt_tstop_regular_schedule(self): - rs = arb.regular_schedule(0.1) - self.assertAlmostEqual(rs.dt, 0.1, places=1) - rs.tstart = 17.0 - rs.dt = 0.5 - rs.tstop = 42.0 - self.assertEqual(rs.tstart, 17.0) - self.assertAlmostEqual(rs.dt, 0.5, places=1) - self.assertEqual(rs.tstop, 42.0) + rs = A.regular_schedule(0.1 * U.ms) + self.assertAlmostEqual(rs.dt.value_as(U.ms), 0.1, places=1) + rs.tstart = 17.0 * U.ms + rs.dt = 0.5 * U.ms + rs.tstop = 42.0 * U.ms + self.assertEqual(rs.tstart, 17.0 * U.ms) + self.assertAlmostEqual(rs.dt.value_as(U.ms), 0.5, places=1) + self.assertEqual(rs.tstop, 42.0 * U.ms) def test_events_regular_schedule(self): expected = [0, 0.25, 0.5, 0.75, 1.0] - rs = arb.regular_schedule(tstart=0.0, dt=0.25, tstop=1.25) + rs = A.regular_schedule(tstart=0.0 * U.ms, dt=0.25 * U.ms, tstop=1.25 * U.ms) self.assertEqual(expected, rs.events(0.0, 1.25)) self.assertEqual(expected, rs.events(0.0, 5.0)) self.assertEqual([], rs.events(5.0, 10.0)) @@ -43,41 +44,34 @@ class TestRegularSchedule(unittest.TestCase): with self.assertRaisesRegex( RuntimeError, "tstart must be a non-negative number" ): - arb.regular_schedule(tstart=-1.0, dt=0.1) + A.regular_schedule(tstart=-1.0 * U.ms, dt=0.1 * U.ms) with self.assertRaisesRegex(RuntimeError, "dt must be a positive number"): - arb.regular_schedule(dt=-0.1) + A.regular_schedule(dt=-0.1 * U.ms) with self.assertRaisesRegex(RuntimeError, "dt must be a positive number"): - arb.regular_schedule(dt=0) + A.regular_schedule(dt=0 * U.ms) with self.assertRaises(TypeError): - arb.regular_schedule(dt=None) + A.regular_schedule(dt=None) with self.assertRaises(TypeError): - arb.regular_schedule(dt="dt") - with self.assertRaisesRegex( - RuntimeError, "tstop must be a non-negative number, or None" - ): - arb.regular_schedule(tstart=0, dt=0.1, tstop="tstop") + A.regular_schedule(dt="dt") + with self.assertRaises(TypeError): + A.regular_schedule(tstart=0 * U.ms, dt=0.1 * U.ms, tstop="tstop") with self.assertRaisesRegex(RuntimeError, "t0 must be a non-negative number"): - rs = arb.regular_schedule(0.0, 1.0, 10.0) + rs = A.regular_schedule(0.0 * U.ms, 1.0 * U.ms, 10.0 * U.ms) rs.events(-1, 0) with self.assertRaisesRegex(RuntimeError, "t1 must be a non-negative number"): - rs = arb.regular_schedule(0.0, 1.0, 10.0) + rs = A.regular_schedule(0.0 * U.ms, 1.0 * U.ms, 10.0 * U.ms) rs.events(0, -10) class TestExplicitSchedule(unittest.TestCase): def test_times_contor_explicit_schedule(self): - es = arb.explicit_schedule([1, 2, 3, 4.5]) - self.assertEqual(es.times, [1, 2, 3, 4.5]) - - def test_set_times_explicit_schedule(self): - es = arb.explicit_schedule() - es.times = [42, 43, 44, 55.5, 100] - self.assertEqual(es.times, [42, 43, 44, 55.5, 100]) + es = A.explicit_schedule([t * U.ms for t in range(1, 6)]) + self.assertEqual(es.events(0, 1000000), [1, 2, 3, 4, 5]) def test_events_explicit_schedule(self): times = [0.1, 0.3, 1.0, 2.2, 1.25, 1.7] expected = [0.1, 0.3, 1.0] - es = arb.explicit_schedule(times) + es = A.explicit_schedule([t * U.ms for t in times]) for i in range(len(expected)): self.assertAlmostEqual(expected[i], es.events(0.0, 1.25)[i], places=2) expected = [0.3, 1.0, 1.25, 1.7] @@ -85,47 +79,47 @@ class TestExplicitSchedule(unittest.TestCase): self.assertAlmostEqual(expected[i], es.events(0.3, 1.71)[i], places=2) def test_exceptions_explicit_schedule(self): - with self.assertRaisesRegex( - RuntimeError, "explicit time schedule cannot contain negative values" - ): - arb.explicit_schedule([-1]) + with self.assertRaises(RuntimeError): + A.explicit_schedule([-1 * U.ms]) with self.assertRaises(TypeError): - arb.explicit_schedule(["times"]) + A.explicit_schedule(["times"]) with self.assertRaises(TypeError): - arb.explicit_schedule([None]) + A.explicit_schedule([None]) with self.assertRaises(TypeError): - arb.explicit_schedule([[1, 2, 3]]) + A.explicit_schedule([[1, 2, 3]]) with self.assertRaisesRegex(RuntimeError, "t1 must be a non-negative number"): - rs = arb.regular_schedule(0.1) + rs = A.regular_schedule(0.1 * U.ms) rs.events(1.0, -1.0) class TestPoissonSchedule(unittest.TestCase): def test_freq_poisson_schedule(self): - ps = arb.poisson_schedule(42.0) - self.assertEqual(ps.freq, 42.0) + ps = A.poisson_schedule(42.0 * U.kHz) + self.assertEqual(ps.freq, 42.0 * U.kHz) def test_freq_tstart_contor_poisson_schedule(self): - ps = arb.poisson_schedule(freq=5.0, tstart=4.3) - self.assertEqual(ps.freq, 5.0) - self.assertEqual(ps.tstart, 4.3) + ps = A.poisson_schedule(freq=5.0 * U.kHz, tstart=4.3 * U.ms) + self.assertEqual(ps.freq, 5.0 * U.kHz) + self.assertEqual(ps.tstart, 4.3 * U.ms) def test_freq_seed_contor_poisson_schedule(self): - ps = arb.poisson_schedule(freq=5.0, seed=42) - self.assertEqual(ps.freq, 5.0) + ps = A.poisson_schedule(freq=5.0 * U.kHz, seed=42) + self.assertEqual(ps.freq, 5.0 * U.kHz) self.assertEqual(ps.seed, 42) def test_tstart_freq_seed_contor_poisson_schedule(self): - ps = arb.poisson_schedule(10.0, 100.0, 1000) - self.assertEqual(ps.tstart, 10.0) - self.assertEqual(ps.freq, 100.0) + ps = A.poisson_schedule(tstart=10.0 * U.ms, freq=100.0 * U.kHz, seed=1000) + self.assertEqual(ps.tstart, 10.0 * U.ms) + self.assertEqual(ps.freq, 100.0 * U.kHz) self.assertEqual(ps.seed, 1000) def test_events_poisson_schedule(self): expected = [17.4107, 502.074, 506.111, 597.116] - ps = arb.poisson_schedule(0.0, 0.01, 0) + ps = A.poisson_schedule(tstart=0.0 * U.ms, freq=0.01 * U.kHz, seed=0) for i in range(len(expected)): - self.assertAlmostEqual(expected[i], ps.events(0.0, 600.0)[i], places=3) + self.assertAlmostEqual( + expected[i], ps.events(0.0 * U.ms, 600.0 * U.ms)[i], places=3 + ) expected = [ 5030.22, 5045.75, @@ -140,50 +134,52 @@ class TestPoissonSchedule(unittest.TestCase): 5808.33, ] for i in range(len(expected)): - self.assertAlmostEqual(expected[i], ps.events(5000.0, 6000.0)[i], places=2) + self.assertAlmostEqual( + expected[i], ps.events(5000.0 * U.ms, 6000.0 * U.ms)[i], places=2 + ) def test_exceptions_poisson_schedule(self): with self.assertRaises(TypeError): - arb.poisson_schedule() + A.poisson_schedule() with self.assertRaises(TypeError): - arb.poisson_schedule(tstart=10.0) + A.poisson_schedule(tstart=10.0 * U.ms) with self.assertRaises(TypeError): - arb.poisson_schedule(seed=1432) + A.poisson_schedule(seed=1432) with self.assertRaisesRegex( RuntimeError, "tstart must be a non-negative number" ): - arb.poisson_schedule(freq=34.0, tstart=-10.0) + A.poisson_schedule(freq=34.0 * U.kHz, tstart=-10.0 * U.ms) with self.assertRaises(TypeError): - arb.poisson_schedule(freq=34.0, tstart=None) + A.poisson_schedule(freq=34.0 * U.kHz, tstart=None) with self.assertRaises(TypeError): - arb.poisson_schedule(freq=34.0, tstart="tstart") + A.poisson_schedule(freq=34.0, tstart="tstart") with self.assertRaisesRegex( RuntimeError, "frequency must be a non-negative number" ): - arb.poisson_schedule(freq=-100.0) + A.poisson_schedule(freq=-100.0 * U.kHz) with self.assertRaises(TypeError): - arb.poisson_schedule(freq="freq") + A.poisson_schedule(freq="freq") with self.assertRaises(TypeError): - arb.poisson_schedule(freq=34.0, seed=-1) + A.poisson_schedule(freq=34.0 * U.kHz, seed=-1) with self.assertRaises(TypeError): - arb.poisson_schedule(freq=34.0, seed=10.0) + A.poisson_schedule(freq=34.0 * U.kHz, seed=10.0) with self.assertRaises(TypeError): - arb.poisson_schedule(freq=34.0, seed="seed") + A.poisson_schedule(freq=34.0 * U.kHz, seed="seed") with self.assertRaises(TypeError): - arb.poisson_schedule(freq=34.0, seed=None) + A.poisson_schedule(freq=34.0 * U.kHz, seed=None) with self.assertRaisesRegex(RuntimeError, "t0 must be a non-negative number"): - ps = arb.poisson_schedule(0, 0.01) - ps.events(-1.0, 1.0) + ps = A.poisson_schedule(tstart=0 * U.ms, freq=0.01 * U.kHz) + ps.events(-1.0 * U.ms, 1.0 * U.ms) with self.assertRaisesRegex(RuntimeError, "t1 must be a non-negative number"): - ps = arb.poisson_schedule(0, 0.01) - ps.events(1.0, -1.0) - with self.assertRaisesRegex( - RuntimeError, "tstop must be a non-negative number, or None" - ): - arb.poisson_schedule(0, 0.1, tstop="tstop") - ps.events(1.0, -1.0) + ps = A.poisson_schedule(tstart=0 * U.ms, freq=0.01 * U.kHz) + ps.events(1.0 * U.ms, -1.0 * U.ms) + with self.assertRaises(TypeError): + ps = A.poisson_schedule(tstart=0 * U.ms, freq=0.1 * U.kHz, tstop="tstop") + ps.events(1.0 * U.ms, -1.0 * U.ms) def test_tstop_poisson_schedule(self): tstop = 50 - events = arb.poisson_schedule(0.0, 1, 0, tstop).events(0, 100) + events = A.poisson_schedule( + tstart=0.0 * U.ms, freq=1 * U.kHz, seed=0, tstop=tstop * U.ms + ).events(0 * U.ms, 100 * U.ms) self.assertTrue(max(events) < tstop) diff --git a/python/test/unit/test_spikes.py b/python/test/unit/test_spikes.py index cd1e6b81e5e00066e38117b6bd0deed4249836db..146a3a0acdd56045e0d4b1318ffae9a7c142a1ef 100644 --- a/python/test/unit/test_spikes.py +++ b/python/test/unit/test_spikes.py @@ -4,6 +4,7 @@ import unittest import arbor as A +from arbor import units as U from .. import fixtures """ @@ -18,11 +19,11 @@ class TestSpikes(unittest.TestCase): sim = art_spiking_sim sim.record(A.spike_recording.all) # run simulation in 5 steps, forcing 5 epochs - sim.run(1, 0.01) - sim.run(2, 0.01) - sim.run(3, 0.01) - sim.run(4, 0.01) - sim.run(5, 0.01) + sim.run(1 * U.ms, 0.01 * U.ms) + sim.run(2 * U.ms, 0.01 * U.ms) + sim.run(3 * U.ms, 0.01 * U.ms) + sim.run(4 * U.ms, 0.01 * U.ms) + sim.run(5 * U.ms, 0.01 * U.ms) spikes = sim.spikes() times = spikes["time"].tolist() diff --git a/python/units.cpp b/python/units.cpp new file mode 100644 index 0000000000000000000000000000000000000000..53df38aa418449f3723f49c65e674cd554d1a977 --- /dev/null +++ b/python/units.cpp @@ -0,0 +1,129 @@ +#include <pybind11/pybind11.h> +#include <pybind11/operators.h> + +#include <arbor/units.hpp> + +namespace pyarb { + +namespace py = pybind11; + +void register_units(py::module& m) { + using namespace py::literals; + + auto u = m.def_submodule("units", "Units and quantities for driving the user interface."); + + py::class_<arb::units::unit> unit(u, "unit", "A unit."); + py::class_<arb::units::quantity> quantity(u, "quantity", "A quantity, comprising a magnitude and a unit."); + + unit + .def(py::self * py::self) + .def(py::self == py::self) + .def(py::self != py::self) + .def(py::self / py::self) + .def(py::self * double()) + .def(py::self / double()) + .def(double() * py::self) + .def(double() / py::self) + .def("__pow__", [](const arb::units::unit &b, int e) { return b.pow(e); }, py::is_operator()) + .def("__str__", + [](const arb::units::unit& u) { return arb::units::to_string(u); }, + "Convert unit to string.") + .def("__repr__", + [](const arb::units::unit& u) { return arb::units::to_string(u); }, + "Convert unit to string."); + + quantity + .def(py::self * py::self) + .def(py::self / py::self) + .def(py::self == py::self) + .def(py::self != py::self) + .def(py::self + py::self) + .def(py::self - py::self) + .def(py::self * double()) + .def(py::self / double()) + .def(double() * py::self) + .def(double() / py::self) + .def(py::self * arb::units::unit()) + .def(py::self / arb::units::unit()) + .def("__pow__", [](const arb::units::unit &b, int e) { return b.pow(e); }, py::is_operator()) + .def("value_as", + [](const arb::units::quantity& q, const arb::units::unit& u) { return q.value_as(u); }, + "unit"_a, + "Convert quantity to given unit and return magnitude.") + .def_property_readonly("value", + [](const arb::units::quantity& q) { return q.value(); }, + "Return magnitude.") + .def_property_readonly("units", + [](const arb::units::quantity& q) { return q.units(); }, + "Return units.") + .def("__str__", + [](const arb::units::quantity& q) { return arb::units::to_string(q); }, + "Convert quantity to string.") + .def("__repr__", + [](const arb::units::quantity& q) { return arb::units::to_string(q); }, + "Convert quantity to string."); + + u.attr("m") = py::cast(arb::units::m); + u.attr("cm") = py::cast(arb::units::cm); + u.attr("mm") = py::cast(arb::units::mm); + u.attr("um") = py::cast(arb::units::um); + u.attr("nm") = py::cast(arb::units::nm); + + u.attr("m2") = py::cast(arb::units::m2); + u.attr("cm2") = py::cast(arb::units::cm2); + u.attr("mm2") = py::cast(arb::units::mm2); + u.attr("um2") = py::cast(arb::units::um2); + u.attr("nm2") = py::cast(arb::units::nm2); + + u.attr("s") = py::cast(arb::units::s); + u.attr("ms") = py::cast(arb::units::ms); + u.attr("us") = py::cast(arb::units::us); + u.attr("ns") = py::cast(arb::units::ns); + u.attr("Hz") = py::cast(arb::units::Hz); + u.attr("kHz") = py::cast(arb::units::kHz); + + u.attr("Ohm") = py::cast(arb::units::Ohm); + u.attr("kOhm") = py::cast(arb::units::kOhm); + u.attr("MOhm") = py::cast(arb::units::MOhm); + + u.attr("S") = py::cast(arb::units::S); + u.attr("mS") = py::cast(arb::units::mS); + u.attr("uS") = py::cast(arb::units::uS); + + u.attr("F") = py::cast(arb::units::F); + u.attr("uF") = py::cast(arb::units::uF); + u.attr("nF") = py::cast(arb::units::nF); + u.attr("pF") = py::cast(arb::units::pF); + + u.attr("A") = py::cast(arb::units::A); + u.attr("mA") = py::cast(arb::units::mA); + u.attr("uA") = py::cast(arb::units::uA); + u.attr("nA") = py::cast(arb::units::nA); + u.attr("pA") = py::cast(arb::units::pA); + + u.attr("V") = py::cast(arb::units::V); + u.attr("mV") = py::cast(arb::units::mV); + + u.attr("C") = py::cast(arb::units::C); + + u.attr("rad") = py::cast(arb::units::rad); + u.attr("deg") = py::cast(arb::units::deg); + + u.attr("Kelvin") = py::cast(arb::units::Kelvin); + u.attr("Celsius") = py::cast(arb::units::Celsius); + + u.attr("mol") = py::cast(arb::units::mol); + u.attr("M") = py::cast(arb::units::M); + u.attr("mM") = py::cast(arb::units::mM); + + u.attr("pico") = py::cast(arb::units::pico); + u.attr("nano") = py::cast(arb::units::nano); + u.attr("micro") = py::cast(arb::units::micro); + u.attr("milli") = py::cast(arb::units::milli); + u.attr("kilo") = py::cast(arb::units::kilo); + u.attr("mega") = py::cast(arb::units::mega); + u.attr("giga") = py::cast(arb::units::giga); + + u.attr("nil") = py::cast(arb::units::nil); +} +} // pyarb diff --git a/python/util.hpp b/python/util.hpp index 846b62cc18246a6b0c0ad8aa81ab7b43fcba8113..b111d4eafc888ec7ab676e0168fc4e1fc5d093c1 100644 --- a/python/util.hpp +++ b/python/util.hpp @@ -3,10 +3,11 @@ #include <fstream> #include <string> +#include <arbor/arbexcept.hpp> + #include <pybind11/pybind11.h> #include "strprintf.hpp" -#include "error.hpp" namespace pyarb { namespace util { diff --git a/spack/package.py b/spack/package.py index 50c1c5ea2b5043b9a72a359a119fa62bfe786acf..460dc48f75ce25168f9c1a80e5bda9d208fd8216 100644 --- a/spack/package.py +++ b/spack/package.py @@ -14,13 +14,15 @@ class Arbor(CMakePackage, CudaPackage): git = "https://github.com/arbor-sim/arbor.git" url = "https://github.com/arbor-sim/arbor/releases/download/v0.8.1/arbor-v0.9.0-full.tar.gz" maintainers = ("thorstenhater", "brenthuisman", "haampie") + submodules = True - version("master", branch="master") - version("develop") + version("master", branch="master", submodules=True) + version("develop", branch="master", submodules=True) version( "0.9.0", sha256="5f9740955c821aca81e23298c17ad64f33f635756ad9b4a0c1444710f564306a", url="https://github.com/arbor-sim/arbor/releases/download/v0.9.0/arbor-v0.9.0-full.tar.gz", + submodules=True, ) version( "0.8.1", @@ -132,6 +134,8 @@ class Arbor(CMakePackage, CudaPackage): self.spec.compiler.name, self.spec.compiler.version ) args.append("-DARB_CXX_FLAGS_TARGET=" + opt_flags) + # Needed, spack has no units package + args.append("-DARB_USE_BUNDLED_UNITS=ON") return args diff --git a/test/common_cells.cpp b/test/common_cells.cpp index 5d1f3aa2bc7dddbc2d4b1e20d98f9bdc159988a6..903e4e0a4315aab94c852d58a99e071518545ab3 100644 --- a/test/common_cells.cpp +++ b/test/common_cells.cpp @@ -1,5 +1,4 @@ #include <arborio/label_parse.hpp> -#include "arbor/morph/morphology.hpp" #include "common_cells.hpp" namespace arb { @@ -181,7 +180,9 @@ cable_cell_description make_cell_soma_only(bool with_stim) { auto c = builder.make_cell(); c.decorations.paint("soma"_lab, density("hh")); if (with_stim) { - c.decorations.place(builder.location({0,0.5}), i_clamp{10., 100., 0.1}, "cc"); + c.decorations.place(builder.location({0,0.5}), + i_clamp::box(10.*arb::units::ms, 100.*arb::units::ms, 0.1*arb::units::nA), + "cc"); } return {c.morph, c.labels, c.decorations}; @@ -216,7 +217,9 @@ cable_cell_description make_cell_ball_and_stick(bool with_stim) { c.decorations.paint("soma"_lab, density("hh")); c.decorations.paint("dend"_lab, density("pas")); if (with_stim) { - c.decorations.place(builder.location({1,1}), i_clamp{5, 80, 0.3}, "cc"); + c.decorations.place(builder.location({1,1}), + i_clamp::box(5*arb::units::ms, 80*arb::units::ms, 0.3*arb::units::nA), + "cc"); } return {c.morph, c.labels, c.decorations}; @@ -254,8 +257,12 @@ cable_cell_description make_cell_ball_and_3stick(bool with_stim) { c.decorations.paint("soma"_lab, density("hh")); c.decorations.paint("dend"_lab, density("pas")); if (with_stim) { - c.decorations.place(builder.location({2,1}), i_clamp{5., 80., 0.45}, "cc0"); - c.decorations.place(builder.location({3,1}), i_clamp{40., 10.,-0.2}, "cc1"); + c.decorations.place(builder.location({2,1}), + i_clamp::box(5.*arb::units::ms, 80.*arb::units::ms, 0.45*arb::units::nA), + "cc0"); + c.decorations.place(builder.location({3,1}), + i_clamp::box(40.*arb::units::ms, 10.*arb::units::ms,-0.2*arb::units::nA), + "cc1"); } return {c.morph, c.labels, c.decorations}; diff --git a/test/common_cells.hpp b/test/common_cells.hpp index 9b22af70e7c5cb75409d81993aa9dea6dd3d8181..6e9cda85a7b0ba03208f387ca220148ca730abd7 100644 --- a/test/common_cells.hpp +++ b/test/common_cells.hpp @@ -1,5 +1,3 @@ -#include <cmath> - #include <arbor/cable_cell.hpp> #include <arbor/mechinfo.hpp> #include <arbor/morph/label_dict.hpp> diff --git a/test/simple_recipes.hpp b/test/simple_recipes.hpp index 504d54d9dc03bda4b5106fa25d1fe425f7d131f4..52b6638f4179320a9525a5fb78e962e53e854f2e 100644 --- a/test/simple_recipes.hpp +++ b/test/simple_recipes.hpp @@ -10,13 +10,14 @@ #include <arbor/cable_cell.hpp> #include <arbor/cable_cell_param.hpp> #include <arbor/recipe.hpp> +#include <arbor/units.hpp> #include <arbor/util/unique_any.hpp> -#include "util/rangeutil.hpp" - namespace arb { +namespace U = units; + // Common functionality: maintain an unordered map of probe data // per gid, built with `add_probe()`. @@ -48,7 +49,7 @@ public: } void add_ion(const std::string& ion_name, int charge, double init_iconc, double init_econc, double init_revpot) { - cell_gprop_.add_ion(ion_name, charge, init_iconc, init_econc, init_revpot); + cell_gprop_.add_ion(ion_name, charge, init_iconc*U::mM, init_econc*U::mM, init_revpot*U::mV); } void nernst_ion(const std::string& ion_name) { diff --git a/test/ubench/merge.cpp b/test/ubench/merge.cpp index 1097fa734189192c749c1e610eed129ea95be9af..c179ff2f89951cbed0becef4d43dc201dd4aa70e 100644 --- a/test/ubench/merge.cpp +++ b/test/ubench/merge.cpp @@ -1,5 +1,3 @@ -#include <random> -#include <unordered_map> #include <vector> #include <benchmark/benchmark.h> @@ -10,20 +8,18 @@ #include <arbor/event_generator.hpp> #include <arbor/schedule.hpp> -constexpr auto T = 1000.0; // ms - -using rndgen = std::mt19937_64; +constexpr auto T = 1000.0*arb::units::ms; // ms struct payload { payload(std::size_t ncells, std::size_t ev_per_cell) { auto dt = T/ev_per_cell; for(auto cell = 0ull; cell < ncells; ++cell) { - auto gen = arb::poisson_schedule(1/dt, rndgen{cell}); - auto times = gen.events(0, T); + auto gen = arb::poisson_schedule(1/dt, cell); + auto times = gen.events(0, T.value_as(arb::units::ms)); evts.emplace_back(); auto& evt = evts.back(); for (auto t: arb::util::make_range(times)) { - evt.emplace_back(arb::spike_event{42, t, 0.23}); + evt.emplace_back(42, t, 0.23); ++size; } span.emplace_back(arb::util::make_range(evt.data(), evt.data() + evt.size())); diff --git a/test/unit-distributed/test_communicator.cpp b/test/unit-distributed/test_communicator.cpp index 9f06a3dda997fe885b5eceefa59a3c8a1d933074..0100a30e0bb06ec5049a99d11154085cfe5b1938 100644 --- a/test/unit-distributed/test_communicator.cpp +++ b/test/unit-distributed/test_communicator.cpp @@ -1,7 +1,6 @@ #include <gtest/gtest.h> #include "test.hpp" -#include <tuple> #include <vector> #include <arbor/domain_decomposition.hpp> @@ -11,7 +10,6 @@ #include <arbor/spike_event.hpp> #include "communication/communicator.hpp" -#include "execution_context.hpp" #include "fvm_lowered_cell.hpp" #include "lif_cell_group.hpp" #include "cable_cell_group.hpp" @@ -24,6 +22,7 @@ #endif using namespace arb; +namespace U = arb::units; TEST(communicator, policy_basics) { @@ -204,7 +203,7 @@ namespace { tree.append(arb::mnpos, {0, 0, 0.0, 1.0}, {0, 0, 200, 1.0}, 1); arb::decor decor; decor.set_default(arb::cv_policy_fixed_per_branch(10)); - decor.place(arb::mlocation{0, 0.5}, arb::threshold_detector{10}, "src"); + decor.place(arb::mlocation{0, 0.5}, arb::threshold_detector{10*arb::units::mV}, "src"); decor.place(arb::mlocation{0, 0.5}, arb::synapse("expsyn"), "tgt"); return arb::cable_cell(arb::morphology(tree), decor); } @@ -221,10 +220,9 @@ namespace { // delay is 1 cell_global_label_type src = {gid==0? size_-1: gid-1, "src"}; cell_local_label_type dst = {"tgt"}; - return {cell_connection( - src, dst, // end points - float(gid), // weight - 1.0f)}; // delay + return {cell_connection(src, dst, // end points + float(gid), // weight + 1.0*U::ms)}; // delay } std::any get_global_properties(arb::cell_kind kind) const override { @@ -277,7 +275,7 @@ namespace { tree.append(arb::mnpos, {0, 0, 0.0, 1.0}, {0, 0, 200, 1.0}, 1); arb::decor decor; decor.set_default(arb::cv_policy_fixed_per_branch(10)); - decor.place(arb::mlocation{0, 0.5}, arb::threshold_detector{10}, "src"); + decor.place(arb::mlocation{0, 0.5}, arb::threshold_detector{10*arb::units::mV}, "src"); decor.place(arb::ls::uniform(arb::reg::all(), 0, size_, gid), arb::synapse("expsyn"), "tgt"); return arb::cable_cell(arb::morphology(tree), decor); } @@ -289,12 +287,10 @@ namespace { std::vector<cell_connection> cons; cons.reserve(size_); for (auto sid: util::make_span(0, size_)) { - cell_connection con( - {sid, {"src", arb::lid_selection_policy::round_robin}}, // source - {"tgt", arb::lid_selection_policy::round_robin}, // destination - float(gid+sid), // weight - 1.0f); // delay - cons.push_back(con); + cons.emplace_back(cell_connection{{sid, {"src", arb::lid_selection_policy::round_robin}}, // source + {"tgt", arb::lid_selection_policy::round_robin}, // destination + float(gid+sid), // weight + 1.0f*U::ms}); // delay } return cons; } @@ -354,8 +350,8 @@ namespace { decor.place(arb::ls::uniform(arb::reg::all(), 2, 2, gid), arb::synapse("expsyn"), "synapses_1"); } else { - decor.place(arb::ls::uniform(arb::reg::all(), 0, 2, gid), arb::threshold_detector{10}, "detectors_0"); - decor.place(arb::ls::uniform(arb::reg::all(), 3, 3, gid), arb::threshold_detector{10}, "detectors_1"); + decor.place(arb::ls::uniform(arb::reg::all(), 0, 2, gid), arb::threshold_detector{10*arb::units::mV}, "detectors_0"); + decor.place(arb::ls::uniform(arb::reg::all(), 3, 3, gid), arb::threshold_detector{10*arb::units::mV}, "detectors_1"); } return arb::cable_cell(arb::morphology(tree), decor); } @@ -402,20 +398,17 @@ namespace { if (gid%3 != 1) { for (auto sid: util::make_span(0, ncells_)) { if (sid%3 == 1) { - cons.push_back({{sid, "detectors_0", pol::round_robin}, {"synapses_0", pol::round_robin}, 1.0, 1.0}); - cons.push_back({{sid, "detectors_0", pol::round_robin}, {"synapses_0", pol::round_robin}, 1.0, 1.0}); - cons.push_back({{sid, "detectors_0", pol::round_robin}, {"synapses_0", pol::round_robin}, 1.0, 1.0}); - cons.push_back({{sid, "detectors_0", pol::round_robin}, {"synapses_0", pol::round_robin}, 1.0, 1.0}); - cons.push_back({{sid, "detectors_0", pol::round_robin}, {"synapses_0", pol::round_robin}, 1.0, 1.0}); - cons.push_back({{sid, "detectors_0", pol::round_robin}, {"synapses_0", pol::round_robin}, 1.0, 1.0}); - cons.push_back({{sid, "detectors_0", pol::round_robin}, {"synapses_0", pol::round_robin}, 1.0, 1.0}); - - cons.push_back({{sid, "detectors_0", pol::round_robin}, {"synapses_1", pol::assert_univalent}, 1.0, 1.0}); - - cons.push_back({{sid, "detectors_1", pol::round_robin}, {"synapses_0", pol::round_robin}, 1.0, 1.0}); - cons.push_back({{sid, "detectors_1", pol::round_robin}, {"synapses_0", pol::round_robin}, 1.0, 1.0}); - - cons.push_back({{sid, "detectors_1", pol::assert_univalent}, {"synapses_1", pol::round_robin}, 1.0, 1.0}); + cons.push_back({{sid, "detectors_0", pol::round_robin}, {"synapses_0", pol::round_robin}, 1.0, 1.0*U::ms}); + cons.push_back({{sid, "detectors_0", pol::round_robin}, {"synapses_0", pol::round_robin}, 1.0, 1.0*U::ms}); + cons.push_back({{sid, "detectors_0", pol::round_robin}, {"synapses_0", pol::round_robin}, 1.0, 1.0*U::ms}); + cons.push_back({{sid, "detectors_0", pol::round_robin}, {"synapses_0", pol::round_robin}, 1.0, 1.0*U::ms}); + cons.push_back({{sid, "detectors_0", pol::round_robin}, {"synapses_0", pol::round_robin}, 1.0, 1.0*U::ms}); + cons.push_back({{sid, "detectors_0", pol::round_robin}, {"synapses_0", pol::round_robin}, 1.0, 1.0*U::ms}); + cons.push_back({{sid, "detectors_0", pol::round_robin}, {"synapses_0", pol::round_robin}, 1.0, 1.0*U::ms}); + cons.push_back({{sid, "detectors_0", pol::round_robin}, {"synapses_1", pol::assert_univalent}, 1.0, 1.0*U::ms}); + cons.push_back({{sid, "detectors_1", pol::round_robin}, {"synapses_0", pol::round_robin}, 1.0, 1.0*U::ms}); + cons.push_back({{sid, "detectors_1", pol::round_robin}, {"synapses_0", pol::round_robin}, 1.0, 1.0*U::ms}); + cons.push_back({{sid, "detectors_1", pol::assert_univalent}, {"synapses_1", pol::round_robin}, 1.0, 1.0*U::ms}); } } } diff --git a/test/unit-distributed/test_domain_decomposition.cpp b/test/unit-distributed/test_domain_decomposition.cpp index 40e76c6dc803fca2cc38642b01bf40f8c833051f..4c4ccea430a8aa4b2fb1a0a44138d6a0f2cd0c6c 100644 --- a/test/unit-distributed/test_domain_decomposition.cpp +++ b/test/unit-distributed/test_domain_decomposition.cpp @@ -1,10 +1,5 @@ #include <gtest/gtest.h> -#include <cstdio> -#include <fstream> -#include <iostream> -#include <stdexcept> -#include <string> #include <vector> #include <arbor/context.hpp> @@ -16,9 +11,7 @@ #include <arborenv/default_env.hpp> #include "util/span.hpp" - #include "../simple_recipes.hpp" -#include "test.hpp" #ifdef TEST_MPI #include <mpi.h> diff --git a/test/unit/test_cable_cell.cpp b/test/unit/test_cable_cell.cpp index 8b0a4d460dff135dd2d46dc03b801c78150b2cf0..7e8930fee0a8addbd04c6a91021d2cae520fc308 100644 --- a/test/unit/test_cable_cell.cpp +++ b/test/unit/test_cable_cell.cpp @@ -4,6 +4,7 @@ #include <arbor/util/hash_def.hpp> #include <arbor/cable_cell.hpp> +#include <arbor/units.hpp> #include <arbor/cable_cell_param.hpp> #include <arborio/label_parse.hpp> @@ -35,9 +36,9 @@ TEST(cable_cell, lid_ranges) { // Note: there are 2 terminal points. decorations.place("term"_lab, synapse("expsyn"), "t0"); decorations.place("term"_lab, synapse("expsyn"), "t1"); - decorations.place("term"_lab, threshold_detector{-10}, "s0"); + decorations.place("term"_lab, threshold_detector{-10*arb::units::mV}, "s0"); decorations.place(empty_sites, synapse("expsyn"), "t2"); - decorations.place("term"_lab, threshold_detector{-20}, "s1"); + decorations.place("term"_lab, threshold_detector{-20*arb::units::mV}, "s1"); decorations.place(three_sites, synapse("expsyn"), "t3"); decorations.place("term"_lab, synapse("exp2syn"), "t3"); diff --git a/test/unit/test_cable_cell_group.cpp b/test/unit/test_cable_cell_group.cpp index f143df0a25942155bce49e92789598706a8cf788..cbb38714549640d2e33ebc52fd798e59fb85b9ab 100644 --- a/test/unit/test_cable_cell_group.cpp +++ b/test/unit/test_cable_cell_group.cpp @@ -7,7 +7,6 @@ #include "epoch.hpp" #include "fvm_lowered_cell.hpp" #include "cable_cell_group.hpp" -#include "util/rangeutil.hpp" #include "common.hpp" #include "../common_cells.hpp" @@ -29,8 +28,8 @@ namespace { auto d = builder.make_cell(); d.decorations.paint("soma"_lab, density("hh")); d.decorations.paint("dend"_lab, density("pas")); - d.decorations.place(builder.location({1,1}), i_clamp::box(5, 80, 0.3), "clamp0"); - d.decorations.place(builder.location({0, 0}), threshold_detector{0}, "detector0"); + d.decorations.place(builder.location({1,1}), i_clamp::box(5*arb::units::ms, 80*arb::units::ms, 0.3*arb::units::nA), "clamp0"); + d.decorations.place(builder.location({0, 0}), threshold_detector{0*arb::units::mV}, "detector0"); return d; } } @@ -72,7 +71,7 @@ TEST(cable_cell_group, sources) { for (int i=0; i<20; ++i) { auto desc = make_cell(); if (i==0 || i==3 || i==17) { - desc.decorations.place(mlocation{0, 0.3}, threshold_detector{2.3}, "detector1"); + desc.decorations.place(mlocation{0, 0.3}, threshold_detector{2.3*arb::units::mV}, "detector1"); } cells.emplace_back(desc); diff --git a/test/unit/test_cable_cell_group_gpu.cpp b/test/unit/test_cable_cell_group_gpu.cpp index 3f5fbfdaad2890100e4aeb171962e11c7a9fdcd6..d2dcff02fc25d7ee9a52703d76ec51941fa5f85e 100644 --- a/test/unit/test_cable_cell_group_gpu.cpp +++ b/test/unit/test_cable_cell_group_gpu.cpp @@ -15,6 +15,8 @@ using namespace arb; using namespace arborio::literals; +namespace U = arb::units; + namespace { cable_cell_description make_cell() { soma_cell_builder builder(12.6157/2.0); @@ -22,8 +24,8 @@ namespace { auto d = builder.make_cell(); d.decorations.paint("soma"_lab, density("hh")); d.decorations.paint("dend"_lab, density("pas")); - d.decorations.place(builder.location({1,1}), i_clamp::box(5, 80, 0.3), "clamp0"); - d.decorations.place(builder.location({0, 0}), threshold_detector{0}, "detector0"); + d.decorations.place(builder.location({1,1}), i_clamp::box(5*U::ms, 80*U::ms, 0.3*U::nA), "clamp0"); + d.decorations.place(builder.location({0, 0}), threshold_detector{0*U::mV}, "detector0"); return d; } } diff --git a/test/unit/test_cv_layout.cpp b/test/unit/test_cv_layout.cpp index 8852f61abaefb6ad824806980d848437a200f292..67512a8868391e5afd6f4ad40e1e86ab6e1c6f1e 100644 --- a/test/unit/test_cv_layout.cpp +++ b/test/unit/test_cv_layout.cpp @@ -6,15 +6,16 @@ #include <arbor/morph/morphology.hpp> #include <arbor/morph/locset.hpp> +#include <gtest/gtest.h> + #include "fvm_layout.hpp" #include "util/span.hpp" -#include "common.hpp" #include "common_morphologies.hpp" #include "../common_cells.hpp" using namespace arb; -using util::make_span; +namespace U = arb::units; TEST(cv_layout, empty) { using namespace common_morphology; @@ -92,9 +93,9 @@ TEST(cv_layout, cable) { params.init_membrane_potential = 0; decor decs; - decs.paint(reg::cable(0, 0.0, 0.2), init_membrane_potential{10}); - decs.paint(reg::cable(0, 0.2, 0.7), init_membrane_potential{20}); - decs.paint(reg::cable(0, 0.7, 1.0), init_membrane_potential{30}); + decs.paint(reg::cable(0, 0.0, 0.2), init_membrane_potential{10*U::mV}); + decs.paint(reg::cable(0, 0.2, 0.7), init_membrane_potential{20*U::mV}); + decs.paint(reg::cable(0, 0.7, 1.0), init_membrane_potential{30*U::mV}); cable_cell c(morph, decs); params.discretization = cv_policy_explicit(ls::nil()); diff --git a/test/unit/test_diffusion.cpp b/test/unit/test_diffusion.cpp index 348b135ca890fa4971ebc6688d17958f2f9fd927..54529cd5a7edcf0b68181fcb980b0b76e2282f04 100644 --- a/test/unit/test_diffusion.cpp +++ b/test/unit/test_diffusion.cpp @@ -1,5 +1,4 @@ #include <cmath> -#include <numeric> #include <string> #include <vector> @@ -26,6 +25,7 @@ using namespace std::string_literals; using namespace arborio::literals; using namespace arb; +namespace U = arb::units; constexpr double epsilon = 1e-6; #ifdef ARB_GPU_ENABLED @@ -55,7 +55,7 @@ struct linear: public recipe { std::vector<arb::event_generator> event_generators(arb::cell_gid_type gid) const override { std::vector<arb::event_generator> result; for (const auto& [t, w]: inject_at) { - result.push_back(arb::explicit_generator({"Zap"}, w, std::vector<float>{t})); + result.push_back(arb::explicit_generator_from_milliseconds({"Zap"}, w, std::vector<arb::time_type>{t})); } return result; } @@ -72,13 +72,13 @@ struct linear: public recipe { linear& add_inject() { decor.place("(location 0 0.5)"_ls, arb::synapse("inject/x=na", {{"alpha", 200.0*cv_length}}), "Zap"); return *this; } linear& add_event(double t, float w) { inject_at.push_back({t, w}); return *this; } linear& set_diffusivity(double d, std::optional<region> rg = {}) { - if (rg) decor.paint(*rg, ion_diffusivity{"na", d}); - else decor.set_default(ion_diffusivity{"na", d}); + if (rg) decor.paint(*rg, ion_diffusivity{"na", d*U::m2/U::s}); + else decor.set_default(ion_diffusivity{"na", d*U::m2/U::s}); return *this; } linear& set_concentration(double d, std::optional<region> rg = {}) { - if (rg) decor.paint(*rg, init_int_concentration{"na", d}); - else decor.set_default(init_int_concentration{"na", d}); + if (rg) decor.paint(*rg, init_int_concentration{"na", d*U::mM}); + else decor.set_default(init_int_concentration{"na", d*U::mM}); return *this; } }; @@ -117,8 +117,8 @@ testing::AssertionResult run(const linear& rec, const result_t exp) { }; auto ctx = make_context({arbenv::default_concurrency(), with_gpu}); auto sim = simulation{rec, ctx, partition_load_balance(rec, ctx)}; - sim.add_sampler(arb::all_probes, arb::regular_schedule(0.1), sampler); - sim.run(0.11, 0.01); + sim.add_sampler(arb::all_probes, arb::regular_schedule(0.1*arb::units::ms), sampler); + sim.run(0.11*arb::units::ms, 0.01*arb::units::ms); return all_near(sample_values, exp, epsilon); } @@ -315,37 +315,37 @@ TEST(diffusion, setting_diffusivity) { // BAD: Trying to use a diffusive ion, but b=0. { R r; - r.gprop.add_ion("bla", 1, 23, 42, 0, 0); - EXPECT_THROW(simulation(r).run(1, 1), illegal_diffusive_mechanism); + r.gprop.add_ion("bla", 1, 23*U::mM, 42*U::mM, 0*U::mV, 0*U::m2/U::s); + EXPECT_THROW(simulation(r).run(1*arb::units::ms, 1*arb::units::ms), illegal_diffusive_mechanism); } // BAD: Trying to use a partially diffusive ion { R r; - r.gprop.add_ion("bla", 1, 23, 42, 0, 0); - r.dec.paint("(tag 1)"_reg, ion_diffusivity{"bla", 13}); - EXPECT_THROW(simulation(r).run(1, 1), cable_cell_error); + r.gprop.add_ion("bla", 1, 23*U::mM, 42*U::mM, 0*U::mV, 0*U::m2/U::s); + r.dec.paint("(tag 1)"_reg, ion_diffusivity{"bla", 13*U::m2/U::s}); + EXPECT_THROW(simulation(r).run(1*arb::units::ms, 1*arb::units::ms), cable_cell_error); } // OK: Using the global default { R r; - r.gprop.add_ion("bla", 1, 23, 42, 0, 8); - r.dec.paint("(tag 1)"_reg, ion_diffusivity{"bla", 13}); - EXPECT_NO_THROW(simulation(r).run(1, 1)); + r.gprop.add_ion("bla", 1, 23*U::mM, 42*U::mM, 0*U::mV, 8*U::m2/U::s); + r.dec.paint("(tag 1)"_reg, ion_diffusivity{"bla", 13*U::m2/U::s}); + EXPECT_NO_THROW(simulation(r).run(1*arb::units::ms, 1*arb::units::ms)); } // OK: Using the cell default { R r; - r.gprop.add_ion("bla", 1, 23, 42, 0, 0); - r.dec.set_default(ion_diffusivity{"bla", 8}); - r.dec.paint("(tag 1)"_reg, ion_diffusivity{"bla", 13}); - EXPECT_NO_THROW(simulation(r).run(1, 1)); + r.gprop.add_ion("bla", 1, 23*U::mM, 42*U::mM, 0*U::mV, 0*U::m2/U::s); + r.dec.set_default(ion_diffusivity{"bla", 8*U::m2/U::s}); + r.dec.paint("(tag 1)"_reg, ion_diffusivity{"bla", 13*U::m2/U::s}); + EXPECT_NO_THROW(simulation(r).run(1*arb::units::ms, 1*arb::units::ms)); } // BAD: Using an unknown species { R r; - r.dec.set_default(ion_diffusivity{"bla", 8}); - r.dec.paint("(tag 1)"_reg, ion_diffusivity{"bla", 13}); - EXPECT_THROW(simulation(r).run(1, 1), cable_cell_error); + r.dec.set_default(ion_diffusivity{"bla", 8*U::m2/U::s}); + r.dec.paint("(tag 1)"_reg, ion_diffusivity{"bla", 13*U::m2/U::s}); + EXPECT_THROW(simulation(r).run(1*arb::units::ms, 1*arb::units::ms), cable_cell_error); } } diff --git a/test/unit/test_domain_decomposition.cpp b/test/unit/test_domain_decomposition.cpp index ab8a7c3e4aa5a187379f1d41ad44464c77f09c2e..10e0b754c6b0d4b9ec199d2008826b7d56383c10 100644 --- a/test/unit/test_domain_decomposition.cpp +++ b/test/unit/test_domain_decomposition.cpp @@ -1,7 +1,5 @@ #include <gtest/gtest.h> -#include <stdexcept> - #include <arbor/context.hpp> #include <arbor/domdecexcept.hpp> #include <arbor/domain_decomposition.hpp> diff --git a/test/unit/test_event_delivery.cpp b/test/unit/test_event_delivery.cpp index 89718a1958154271158b2d26224ecb2645f30710..8800224e249e6669f65d0ca9c28b01e65547ec6e 100644 --- a/test/unit/test_event_delivery.cpp +++ b/test/unit/test_event_delivery.cpp @@ -37,7 +37,7 @@ struct test_recipe: public n_cable_cell_recipe { decor decorations; decorations.place(mlocation{0, 0.5}, synapse("expsyn"), "synapse"); - decorations.place(mlocation{0, 0.5}, threshold_detector{-64}, "detector"); + decorations.place(mlocation{0, 0.5}, threshold_detector{-64*arb::units::mV}, "detector"); decorations.place(mlocation{0, 0.5}, junction("gj"), "gapjunction"); cable_cell c(st, decorations, labels); @@ -74,7 +74,7 @@ std::vector<cell_gid_type> run_test_sim(const recipe& R, const group_gids_type& } sim.inject_events(cell_events); - sim.run((n+1)*ev_delta_t, 0.01); + sim.run((n+1)*ev_delta_t*arb::units::ms, 0.01*arb::units::ms); std::vector<cell_gid_type> spike_gids; util::sort_by(spikes, [](auto s) { return s.time; }); diff --git a/test/unit/test_event_generators.cpp b/test/unit/test_event_generators.cpp index 024fbc1a0818603a5a042f311b52e56207ab0c5c..54a8dbae6f05222ea1114aac7bcfacad742c76f6 100644 --- a/test/unit/test_event_generators.cpp +++ b/test/unit/test_event_generators.cpp @@ -5,10 +5,6 @@ #include <arbor/event_generator.hpp> #include <arbor/spike_event.hpp> -#include "util/rangeutil.hpp" - -#include "common.hpp" - using namespace arb; namespace{ @@ -18,7 +14,7 @@ namespace{ } TEST(event_generators, assign_and_copy) { - event_generator gen = regular_generator({"l2"}, 5., 0.5, 0.75); + event_generator gen = regular_generator({"l2"}, 5., 0.5*arb::units::ms, 0.75*arb::units::ms); gen.resolve_label([](const cell_local_label_type&) {return 2;}); spike_event expected{2, 0.75, 5.}; @@ -57,7 +53,7 @@ TEST(event_generators, regular) { cell_lid_type lid = 3; float weight = 3.14; - event_generator gen = regular_generator(label, weight, t0, dt); + event_generator gen = regular_generator(label, weight, t0*arb::units::ms, dt*arb::units::ms); gen.resolve_label([lid](const cell_local_label_type&) {return lid;}); // Helper for building a set of expected events. @@ -93,7 +89,7 @@ TEST(event_generators, seq) { expected.push_back({0, time, weight}); } - event_generator gen = explicit_generator(l0, weight, times); + event_generator gen = explicit_generator_from_milliseconds(l0, weight, times); gen.resolve_label([](const cell_local_label_type&) {return 0;}); EXPECT_EQ(expected, as_vector(gen.events(0, 100.))); gen.reset(); @@ -126,8 +122,6 @@ TEST(event_generators, seq) { } TEST(event_generators, poisson) { - std::mt19937_64 G; - time_type t0 = 0; time_type t1 = 10; time_type lambda = 10; // expect 10 events per ms @@ -135,7 +129,7 @@ TEST(event_generators, poisson) { cell_lid_type lid = 2; float weight = 42; - event_generator gen = poisson_generator(label, weight, t0, lambda, G); + event_generator gen = poisson_generator(label, weight, t0*arb::units::ms, lambda*arb::units::kHz); gen.resolve_label([lid](const cell_local_label_type&) {return lid;}); pse_vector int1 = as_vector(gen.events(0, t1)); diff --git a/test/unit/test_fvm_layout.cpp b/test/unit/test_fvm_layout.cpp index 5569171d7d4c434cbd3dbc37b81a0e335bad7437..956bc965d6299709ad51cf65abbb42eeabe9542d 100644 --- a/test/unit/test_fvm_layout.cpp +++ b/test/unit/test_fvm_layout.cpp @@ -21,7 +21,6 @@ #include "util/maputil.hpp" #include "util/rangeutil.hpp" #include "util/span.hpp" -#include "io/sepval.hpp" #include "common.hpp" #include "common_morphologies.hpp" @@ -43,6 +42,8 @@ using fvm_cell = arb::fvm_lowered_cell_impl<backend>; // instantiate template class template class arb::fvm_lowered_cell_impl<arb::multicore::backend>; +namespace U = arb::units; + namespace { struct system { std::vector<soma_cell_builder> builders; @@ -71,10 +72,12 @@ namespace { auto description = builder.make_cell(); description.decorations.paint("soma"_lab, density("hh")); description.decorations.paint("dend"_lab, density("pas")); - description.decorations.place(builder.location({1,1}), i_clamp{5, 80, 0.3}, "clamp"); - + description.decorations.place(builder.location({1,1}), + i_clamp{5*arb::units::nA, 80*arb::units::kHz, 0.3*arb::units::rad}, + "clamp"); s.builders.push_back(std::move(builder)); descriptions.push_back(description); + } // Cell 1: ball and 3-stick, but with uneven dendrite @@ -119,14 +122,18 @@ namespace { auto c1 = reg::cable(b1-1, b.location({b1, 0}).pos, 1); auto c2 = reg::cable(b2-1, b.location({b2, 0}).pos, 1); auto c3 = reg::cable(b3-1, b.location({b3, 0}).pos, 1); - desc.decorations.paint(c1, membrane_capacitance{0.017}); - desc.decorations.paint(c2, membrane_capacitance{0.013}); - desc.decorations.paint(c3, membrane_capacitance{0.018}); + desc.decorations.paint(c1, membrane_capacitance{0.017*U::F*U::m.pow(-2)}); + desc.decorations.paint(c2, membrane_capacitance{0.013*U::F*U::m.pow(-2)}); + desc.decorations.paint(c3, membrane_capacitance{0.018*U::F*U::m.pow(-2)}); - desc.decorations.place(b.location({2,1}), i_clamp{5., 80., 0.45}, "clamo0"); - desc.decorations.place(b.location({3,1}), i_clamp{40., 10.,-0.2}, "clamp1"); + desc.decorations.place(b.location({2,1}), + i_clamp::box( 5.*arb::units::ms, 80.*arb::units::ms, 0.45*arb::units::nA), + "clamp0"); + desc.decorations.place(b.location({3,1}), + i_clamp::box(40.*arb::units::ms, 10.*arb::units::ms, -0.2*arb::units::nA), + "clamp1"); - desc.decorations.set_default(axial_resistivity{90}); + desc.decorations.set_default(axial_resistivity{90*U::Ohm*U::cm}); s.builders.push_back(std::move(b)); descriptions.push_back(desc); @@ -1619,9 +1626,9 @@ TEST(fvm_layout, revpot) { gprop.catalogue = make_unit_test_catalogue(); gprop.ion_species = {{"a", 1}, {"b", 2}, {"c", 3}}; - gprop.add_ion("a", 1, 10., 0, 0); - gprop.add_ion("b", 2, 30., 0, 0); - gprop.add_ion("c", 3, 50., 0, 0); + gprop.add_ion("a", 1, 10.*U::mM, 0*U::mM, 0*U::mV); + gprop.add_ion("b", 2, 30.*U::mM, 0*U::mM, 0*U::mV); + gprop.add_ion("c", 3, 50.*U::mM, 0*U::mM, 0*U::mV); gprop.default_parameters.reversal_potential_method["a"] = "write_eX/a"; mechanism_desc write_eb_ec = "write_multiple_eX/x=b,y=c"; @@ -1955,7 +1962,7 @@ TEST(fvm_layout, inhomogeneous_parameters) { // capacitance scales with CV area { auto decor = arb::decor{} - .set_default(membrane_capacitance{23.0}); + .set_default(membrane_capacitance{23.0*U::F*U::m.pow(-2)}); auto D = fvm_cv_discretize({morph, decor}, param); for (unsigned ix = 0; ix < D.size(); ++ix) { EXPECT_NEAR(D.cv_area[ix]*23.0, D.cv_capacitance[ix], 1e-6); @@ -1966,8 +1973,8 @@ TEST(fvm_layout, inhomogeneous_parameters) { // NOTE the diameter is evaluated at a _different_ spot (CV center!) { auto decor = arb::decor{} - .set_default(membrane_capacitance{23.0}) - .paint(reg::tagged(1), membrane_capacitance{23.0*iexpr::diameter()}); + .set_default(membrane_capacitance{23.0*U::F*U::m.pow(-2)}) + .paint(reg::tagged(1), membrane_capacitance{23.0*U::F*U::m.pow(-2), iexpr::diameter()}); auto D = fvm_cv_discretize({morph, decor}, param); EXPECT_EQ(D.size(), 30ul); for (unsigned ix = 0; ix < D.size(); ++ix) { @@ -1981,7 +1988,7 @@ TEST(fvm_layout, inhomogeneous_parameters) { // Defaults do not have a scale { auto decor = arb::decor{}; - EXPECT_THROW(decor.set_default(membrane_capacitance{23.0*iexpr::diameter()}), arb::cable_cell_error); + EXPECT_THROW(decor.set_default(membrane_capacitance{23.0*U::F*U::m.pow(-2), iexpr::diameter()}), arb::cable_cell_error); } } diff --git a/test/unit/test_fvm_lowered.cpp b/test/unit/test_fvm_lowered.cpp index 28cc19562ef0dda0e3156f90ebf6731689aaee24..ef83d361fa949252aa0528f1e53256ca6cbe7e07 100644 --- a/test/unit/test_fvm_lowered.cpp +++ b/test/unit/test_fvm_lowered.cpp @@ -33,6 +33,7 @@ #include "../common_cells.hpp" #include "../simple_recipes.hpp" + using namespace std::string_literals; using namespace arborio::literals; @@ -229,7 +230,7 @@ TEST(fvm_lowered, target_handles) { descriptions[1].decorations.place(mlocation{2, 0.2}, synapse("exp2syn"), "syn2"); descriptions[1].decorations.place(mlocation{2, 0.8}, synapse("expsyn"), "syn3"); - descriptions[1].decorations.place(mlocation{0, 0}, threshold_detector{3.3}, "detector"); + descriptions[1].decorations.place(mlocation{0, 0}, threshold_detector{3.3*arb::units::mV}, "detector"); cable_cell cells[] = {descriptions[0], descriptions[1]}; @@ -285,9 +286,9 @@ TEST(fvm_lowered, stimulus) { auto desc = make_cell_ball_and_stick(false); // At end of stick - desc.decorations.place(mlocation{0,1}, i_clamp::box(5., 80., 0.3), "clamp0"); + desc.decorations.place(mlocation{0,1}, i_clamp::box(5.*arb::units::ms, 80.*arb::units::ms, 0.3*arb::units::nA), "clamp0"); // On the soma CV, which is over the approximate interval: (cable 0 0 0.1) - desc.decorations.place(mlocation{0,0.05}, i_clamp::box(1., 2., 0.1), "clamp1"); + desc.decorations.place(mlocation{0,0.05}, i_clamp::box(1.*arb::units::ms, 2.*arb::units::ms, 0.1*arb::units::nA), "clamp1"); std::vector<cable_cell> cells{desc}; @@ -356,7 +357,8 @@ TEST(fvm_lowered, ac_stimulus) { const double max_time = 8; // (ms) // Envelope is linear ramp from 0 to max_time. - dec.place(mlocation{0, 0}, i_clamp({{0, 0}, {max_time, max_amplitude}, {max_time, 0}}, freq, phase), "clamp"); + dec.place(mlocation{0, 0}, + i_clamp({{0*arb::units::ms, 0*arb::units::nA}, {max_time*arb::units::ms, max_amplitude*arb::units::nA}, {max_time*arb::units::ms, 0*arb::units::nA}}, freq*arb::units::kHz, phase*arb::units::rad), "clamp"); std::vector<cable_cell> cells = {cable_cell(tree, dec)}; cable_cell_global_properties gprop; @@ -470,12 +472,12 @@ TEST(fvm_lowered, derived_mechs) { } }; - float times[] = {10.f, 20.f}; + std::vector<double> times{10.f, 20.f}; auto decomp = partition_load_balance(rec, context); simulation sim(rec, context, decomp); - sim.add_sampler(all_probes, explicit_schedule(times), sampler); - sim.run(30.0, 1.f/1024); + sim.add_sampler(all_probes, explicit_schedule_from_milliseconds(times), sampler); + sim.run(30.0*arb::units::ms, 1.f/1024*arb::units::ms); ASSERT_EQ(2u, samples[0].size()); ASSERT_EQ(2u, samples[1].size()); @@ -505,7 +507,7 @@ TEST(fvm_lowered, null_region) { auto decomp = partition_load_balance(rec, context); simulation sim(rec, context, decomp); - EXPECT_NO_THROW(sim.run(30.0, 1.f/1024)); + EXPECT_NO_THROW(sim.run(30.0*arb::units::ms, 1.f/1024*arb::units::ms)); } @@ -826,7 +828,7 @@ TEST(fvm_lowered, post_events_shared_state) { auto ndetectors = detectors_per_cell_[gid]; auto offset = 1.0 / ndetectors; for (unsigned i = 0; i < ndetectors; ++i) { - decor.place(arb::mlocation{0, offset * i}, arb::threshold_detector{10}, "detector"+std::to_string(i)); + decor.place(arb::mlocation{0, offset * i}, arb::threshold_detector{10*arb::units::mV}, "detector"+std::to_string(i)); } decor.place(arb::mlocation{0, 0.5}, synapse_, "syanpse"); @@ -920,15 +922,15 @@ TEST(fvm_lowered, label_data) { decor.set_default(arb::cv_policy_fixed_per_branch(10)); decor.place(uniform(all(), 0, 3, 42), arb::synapse("expsyn"), "4_synapses"); decor.place(uniform(all(), 4, 4, 42), arb::synapse("expsyn"), "1_synapse"); - decor.place(uniform(all(), 5, 5, 42), arb::threshold_detector{10}, "1_detector"); + decor.place(uniform(all(), 5, 5, 42), arb::threshold_detector{10*arb::units::mV}, "1_detector"); cells_.push_back(arb::cable_cell(arb::morphology(tree), decor)); } { arb::decor decor; decor.set_default(arb::cv_policy_fixed_per_branch(10)); - decor.place(uniform(all(), 0, 2, 24), arb::threshold_detector{10}, "3_detectors"); - decor.place(uniform(all(), 3, 4, 24), arb::threshold_detector{10}, "2_detectors"); + decor.place(uniform(all(), 0, 2, 24), arb::threshold_detector{10*arb::units::mV}, "3_detectors"); + decor.place(uniform(all(), 3, 4, 24), arb::threshold_detector{10*arb::units::mV}, "2_detectors"); decor.place(uniform(all(), 5, 6, 24), arb::junction("gj"), "2_gap_junctions"); decor.place(uniform(all(), 7, 7, 24), arb::junction("gj"), "1_gap_junction"); diff --git a/test/unit/test_lif_cell_group.cpp b/test/unit/test_lif_cell_group.cpp index 7a03cd8022084fa12f354c3d0c3cc4a7cec3f736..8e13b222faa0b5b1e9bd153cd00c943110b9b124 100644 --- a/test/unit/test_lif_cell_group.cpp +++ b/test/unit/test_lif_cell_group.cpp @@ -12,9 +12,11 @@ #include <arbor/simulation.hpp> #include <arbor/spike_source_cell.hpp> -#include "lif_cell_group.hpp" - using namespace arb; + +namespace U = arb::units; +using namespace U::literals; + // Simple ring network of LIF neurons. // with one regularly spiking cell (fake cell) connected to the first cell in the ring. class ring_recipe: public arb::recipe { @@ -44,14 +46,14 @@ public: std::vector<cell_connection> connections; // gid-1 >= 0 since gid != 0 auto src_gid = (gid - 1) % n_lif_cells_; - cell_connection conn({src_gid, "src"}, {"tgt"}, weight_, delay_); + cell_connection conn({src_gid, "src"}, {"tgt"}, weight_, delay_*U::ms); connections.push_back(conn); // If first LIF cell, then add // the connection from the last LIF cell as well if (gid == 1) { auto src_gid = n_lif_cells_; - cell_connection conn({src_gid, "src"}, {"tgt"}, weight_, delay_); + cell_connection conn({src_gid, "src"}, {"tgt"}, weight_, delay_*U::ms); connections.push_back(conn); } @@ -62,7 +64,7 @@ public: // regularly spiking cell. if (gid == 0) { // Produces just a single spike at time 0ms. - return spike_source_cell("src", explicit_schedule({0.f})); + return spike_source_cell("src", explicit_schedule_from_milliseconds({0.})); } // LIF cell. auto cell = lif_cell("src", "tgt"); @@ -90,14 +92,8 @@ public: } std::vector<cell_connection> connections_on(cell_gid_type gid) const override { - if (gid == 0) { - return {}; - } - std::vector<cell_connection> connections; - cell_connection conn({gid-1, "src"}, {"tgt"}, weight_, delay_); - connections.push_back(conn); - - return connections; + if (gid == 0) return {}; + return {{{gid-1, "src"}, {"tgt"}, weight_, delay_*U::ms}}; } util::unique_any get_cell_description(cell_gid_type gid) const override { @@ -127,17 +123,17 @@ public: for (size_t ix = 0; ix < n_conn_; ++ix) res.emplace_back(cell_global_label_type{0, "src"}, cell_local_label_type{"tgt"}, 0.0, - 0.005); + 5*U::us); return res; } util::unique_any get_cell_description(cell_gid_type gid) const override { auto cell = lif_cell("src", "tgt"); if (gid == 0) { - cell.E_R = -23; - cell.V_m = -18; - cell.E_L = -13; - cell.t_ref = 0.8; - cell.tau_m = 5; + cell.E_R = -23.0*U::mV; + cell.V_m = -18.0*U::mV; + cell.E_L = -13.0*U::mV; + cell.t_ref = 0.8*U::ms; + cell.tau_m = 5*U::ms; } return cell; } @@ -149,7 +145,7 @@ public: } } std::vector<event_generator> event_generators(cell_gid_type) const override { - return {regular_generator({"tgt"}, 200.0, 2.0, 1.0, 6.0)}; + return {regular_generator({"tgt"}, 200.0, 2.0*U::ms, 1.0*U::ms, 6.0*U::ms)}; } size_t n_conn_ = 0; @@ -195,10 +191,7 @@ TEST(lif_cell_group, spikes) { events.push_back({0, {{0, 50, 1000}}}); sim.inject_events(events); - - time_type tfinal = 100; - time_type dt = 0.01; - sim.run(tfinal, dt); + sim.run(100*U::ms, 0.01*U::ms); // we expect 4 spikes: 2 by both neurons EXPECT_EQ(4u, sim.num_spikes()); @@ -211,9 +204,6 @@ TEST(lif_cell_group, ring) double weight = 1000; double delay = 1; - // Total simulation time. - time_type simulation_time = 100; - auto recipe = ring_recipe(num_lif_cells, weight, delay); // Creates a simulation with a ring recipe of lif neurons simulation sim(recipe); @@ -227,7 +217,7 @@ TEST(lif_cell_group, ring) ); // Runs the simulation for simulation_time with given timestep - sim.run(simulation_time, 0.01); + sim.run(100*U::ms, 0.01*U::ms); // The total number of cells in all the cell groups. // There is one additional fake cell (regularly spiking cell). EXPECT_EQ(num_lif_cells + 1u, recipe.num_cells()); @@ -274,7 +264,7 @@ TEST(lif_cell_group, probe) { auto rec = probe_recipe{}; auto sim = simulation(rec); - sim.add_sampler(all_probes, regular_schedule(0.025), fun); + sim.add_sampler(all_probes, regular_schedule(0.025*U::ms), fun); std::vector<double> spikes; @@ -282,7 +272,7 @@ TEST(lif_cell_group, probe) { [&spikes](const std::vector<spike>& spk) { for (const auto& s: spk) spikes.push_back(s.time); } ); - sim.run(10, 0.005); + sim.run(10*U::ms, 0.005*U::ms); std::vector<Um_type> exp = {{ 0, -18 }, { 0.025, -17.9750624 }, { 0.05, -17.9502492 }, @@ -710,7 +700,7 @@ TEST(lif_cell_group, probe_with_connections) { auto rec = probe_recipe{5}; auto sim = simulation(rec); - sim.add_sampler(all_probes, regular_schedule(0.025), fun); + sim.add_sampler(all_probes, regular_schedule(0.025*U::ms), fun); std::vector<double> spikes; @@ -718,7 +708,7 @@ TEST(lif_cell_group, probe_with_connections) { [&spikes](const std::vector<spike>& spk) { for (const auto& s: spk) spikes.push_back(s.time); } ); - sim.run(10, 0.005); + sim.run(10*U::ms, 0.005*U::ms); std::vector<Um_type> exp = {{ 0, -18 }, { 0.025, -17.9750624 }, { 0.05, -17.9502492 }, diff --git a/test/unit/test_merge_events.cpp b/test/unit/test_merge_events.cpp index 7b17c4094bfbab4de6f65356bbc52f36722b9ab8..98060b610e761bba9eff9c94e14fa92cb2eabc06 100644 --- a/test/unit/test_merge_events.cpp +++ b/test/unit/test_merge_events.cpp @@ -28,13 +28,15 @@ static void merge_events( const pse_vector& old_events, pse_vector& pending, std::vector<event_generator>& generators, - pse_vector& new_events) -{ + pse_vector& new_events) { util::sort(pending); - merge_cell_events(t_from, t_to, util::range_pointer_view(old_events), util::range_pointer_view(pending), generators, new_events); + merge_cell_events(t_from, t_to, + util::range_pointer_view(old_events), + util::range_pointer_view(pending), + generators, + new_events); } - std::vector<event_generator> empty_gens; // Test the trivial case of merging empty sets @@ -157,7 +159,7 @@ TEST(merge_events, X) {0, 26, 4}, }; - auto gen = regular_generator({"l0"}, 42.f, t0, 5); + auto gen = regular_generator({"l0"}, 42.f, t0*arb::units::ms, 5*arb::units::ms); gen.resolve_label([](const cell_local_label_type&) {return 2;}); std::vector<event_generator> generators = {gen}; @@ -203,8 +205,8 @@ TEST(merge_events, tourney_seq) util::sort(expected); auto - g1 = explicit_generator(l0, w1, times), - g2 = explicit_generator(l0, w2, times); + g1 = explicit_generator_from_milliseconds(l0, w1, times), + g2 = explicit_generator_from_milliseconds(l0, w2, times); g1.resolve_label([](const cell_local_label_type&) {return 0;}); g2.resolve_label([](const cell_local_label_type&) {return 0;}); @@ -223,9 +225,7 @@ TEST(merge_events, tourney_seq) } // Test the tournament tree on a large set of Poisson generators. -TEST(merge_events, tourney_poisson) -{ - using rndgen = std::mt19937_64; +TEST(merge_events, tourney_poisson) { // Number of poisson generators. // Not a power of 2, so that there will be "null" leaf nodes in the // tournament tree. @@ -241,8 +241,8 @@ TEST(merge_events, tourney_poisson) float weight = i; // the first and last generators have the same seed to test that sorting // of events with the same time but different weights works properly. - rndgen G(i%(ngen-1)); - auto gen = poisson_generator(label, weight, t0, lambda, G); + auto G = i%(ngen-1); + auto gen = poisson_generator(label, weight, t0*arb::units::ms, lambda*arb::units::kHz, G); gen.resolve_label([lid](const cell_local_label_type&) {return lid;}); generators.push_back(std::move(gen)); } diff --git a/test/unit/test_probe.cpp b/test/unit/test_probe.cpp index fc87b1cd4300bed134297ee32e7306043a514343..6b82baecc7ce8732aaad6c7611b4cd2163e43388 100644 --- a/test/unit/test_probe.cpp +++ b/test/unit/test_probe.cpp @@ -1,7 +1,6 @@ #include <gtest/gtest.h> #include <cmath> -#include <map> #include <vector> #include <arbor/cable_cell.hpp> @@ -40,6 +39,7 @@ using namespace arb; using util::any_cast; +namespace U = arb::units; using multicore_fvm_cell = fvm_lowered_cell_impl<multicore::backend>; using multicore_shared_state = multicore::backend::shared_state; @@ -110,7 +110,7 @@ void run_v_i_probe_test(context ctx) { bs.decorations.set_default(cv_policy_fixed_per_branch(1)); - auto stim = i_clamp::box(0, 100, 0.3); + auto stim = i_clamp::box(0.*U::ms, 100*U::ms, 0.3*U::nA); bs.decorations.place(mlocation{1, 1}, stim, "clamp"); cable1d_recipe rec((cable_cell(bs))); @@ -778,15 +778,15 @@ void run_axial_and_ion_current_sampled_probe_test(context ctx) { cv_policy policy = cv_policy_fixed_per_branch(n_cv); d.set_default(policy); - d.place(mlocation{0, 0}, i_clamp(0.3), "clamp"); + d.place(mlocation{0, 0}, i_clamp(0.3*U::nA), "clamp"); // The time constant will be membrane capacitance / membrane conductance. // For τ = 0.1 ms, set conductance to 0.01 S/cm² and membrance capacitance // to 0.01 F/m². d.paint(reg::all(), density("ca_linear", {{"g", 0.01}})); // [S/cm²] - d.set_default(membrane_capacitance{0.01}); // [F/m²] - const double tau = 0.1; // [ms] + d.set_default(membrane_capacitance{0.01*U::F/U::m2}); // [F/m²] + auto tau = 0.1*U::ms; cable1d_recipe rec(cable_cell(m, d)); rec.catalogue() = cat; @@ -826,7 +826,7 @@ void run_axial_and_ion_current_sampled_probe_test(context ctx) { std::vector<double> i_axial(n_axial_probe); std::vector<double> i_memb(n_cv), i_stim(n_cv); - sim.add_sampler(all_probes, explicit_schedule({20*tau}), + sim.add_sampler(all_probes, explicit_schedule(std::vector{20*tau}), [&](probe_metadata pm, std::size_t n_sample, const sample_record* samples) { @@ -869,13 +869,13 @@ void run_axial_and_ion_current_sampled_probe_test(context ctx) { } }); - const double dt = 0.025; // [ms] - sim.run(20*tau+dt, dt); + auto dt = 0.025*U::ms; // [ms] + sim.run(20*tau + dt, dt); ASSERT_EQ(n_cv, i_memb.size()); ASSERT_EQ(n_cv, i_stim.size()); - for (unsigned i = 0; i<n_cv; ++i) { + for (unsigned i = 0; i < n_cv; ++i) { // Axial currents are in the distal (increasing CV index) direction, // while membrane currents are from intra- to extra-cellular medium. // @@ -897,11 +897,11 @@ void run_axial_and_ion_current_sampled_probe_test(context ctx) { template <typename SampleData, typename SampleMeta = void> auto run_simple_samplers(const arb::context& ctx, - double t_end, + U::quantity t_end, const std::vector<cable_cell>& cells, const cell_address_type& probe, const std::vector<std::any>& probe_addrs, - const std::vector<double>& when) { + const std::vector<U::quantity>& when) { cable1d_recipe rec(cells, false); rec.catalogue() = make_unit_test_catalogue(global_default_catalogue()); unsigned n_probe = probe_addrs.size(); @@ -917,17 +917,17 @@ auto run_simple_samplers(const arb::context& ctx, make_simple_sampler(traces[i])); } - sim.run(t_end, 0.025); + sim.run(t_end, 0.025*U::ms); return traces; } template <typename SampleData, typename SampleMeta = void> auto run_simple_sampler(const arb::context& ctx, - double t_end, + U::quantity t_end, const std::vector<cable_cell>& cells, const cell_address_type& probe, const std::any& probe_addr, - const std::vector<double>& when) { + const std::vector<U::quantity>& when) { return run_simple_samplers<SampleData, SampleMeta>(ctx, t_end, cells, probe, {probe_addr}, when).at(0); } @@ -945,10 +945,11 @@ void run_multi_probe_test(context ctx) { d.paint(reg::branch(2), density("param_as_state", {{"p", 20.}})); d.paint(reg::branch(5), density("param_as_state", {{"p", 50.}})); - auto tracev = run_simple_sampler<double, mlocation>(ctx, 0.1, + auto tracev = run_simple_sampler<double, mlocation>(ctx, 0.1*U::ms, {cable_cell{m, d}}, {0, "probe"}, - cable_probe_density_state{ls::terminal(), "param_as_state", "s"}, {0.}); + cable_probe_density_state{ls::terminal(), "param_as_state", "s"}, + {0.0*U::ms}); // Expect to have received a sample on each of the terminals of branches 1, 2, and 5. ASSERT_EQ(3u, tracev.size()); @@ -984,14 +985,14 @@ void run_v_sampled_probe_test(context ctx) { // samples at the same point on each cell will give the same value at // 0.3 ms, but different at 0.6 ms. - d0.place(mlocation{1, 1}, i_clamp::box(0, 0.5, 1.), "clamp0"); - d1.place(mlocation{1, 1}, i_clamp::box(0, 1.0, 1.), "clamp1"); + d0.place(mlocation{1, 1}, i_clamp::box(0*U::ms, 0.5*U::ms, 1.*U::nA), "clamp0"); + d1.place(mlocation{1, 1}, i_clamp::box(0*U::ms, 1.0*U::ms, 1.*U::nA), "clamp1"); mlocation probe_loc{1, 0.2}; std::vector<cable_cell> cells = {{bs.morph, d0, bs.labels}, {bs.morph, d1, bs.labels}}; - const double t_end = 1.; // [ms] - std::vector<double> when = {0.3, 0.6}; // Sample at 0.3 and 0.6 ms. + const auto t_end = 1.*U::ms; // [ms] + std::vector when = {0.3*U::ms, 0.6*U::ms}; // Sample at 0.3 and 0.6 ms. auto trace0 = run_simple_sampler<double, mlocation>(ctx, t_end, cells, {0, "Um-loc"}, cable_probe_membrane_voltage{probe_loc}, @@ -1038,14 +1039,14 @@ void run_total_current_probe_test(context ctx) { // For τ = 0.1 ms, set conductance to 0.01 S/cm² and membrance capacitance // to 0.01 F/m². - const double tau = 0.1; // [ms] - d0.place(mlocation{0, 0}, i_clamp(0.3), "clamp0"); + auto tau = 0.1*U::ms; // [ms] + d0.place(mlocation{0, 0}, i_clamp(0.3*U::nA), "clamp0"); d0.paint(reg::all(), density("ca_linear", {{"g", 0.01}})); // [S/cm²] - d0.set_default(membrane_capacitance{0.01}); // [F/m²] + d0.set_default(membrane_capacitance{0.01*U::F/U::m2}); // [F/m²] // Tweak membrane capacitance on cells[1] so as to change dynamics a bit. auto d1 = d0; - d1.set_default(membrane_capacitance{0.009}); // [F/m²] + d1.set_default(membrane_capacitance{0.009*U::F/U::m2}); // [F/m²] // We'll run each set of tests twice: once with a trivial (zero-volume) CV // at the fork points, and once with a non-trivial CV centred on the fork @@ -1069,19 +1070,22 @@ void run_total_current_probe_test(context ctx) { for (unsigned i = 0; i<2; ++i) { SCOPED_TRACE(i); - const double t_end = 21*tau; // [ms] + auto t_end = 21*tau; // [ms] traces[i] = run_simple_sampler<std::vector<double>, mcable_list>(ctx, t_end, cells, {i, "Itotal"}, - cable_probe_total_current_cell{}, {tau, 20*tau}).at(0); + cable_probe_total_current_cell{}, + {tau, 20*tau}).at(0); ion_traces[i] = run_simple_sampler<std::vector<double>, mcable_list>(ctx, t_end, cells, {i, "Iion"}, - cable_probe_total_ion_current_cell{}, {tau, 20*tau}).at(0); + cable_probe_total_ion_current_cell{}, + {tau, 20*tau}).at(0); stim_traces[i] = run_simple_sampler<std::vector<double>, mcable_list>(ctx, t_end, cells, {i, "Istim"}, - cable_probe_stimulus_current_cell{}, {tau, 20*tau}).at(0); + cable_probe_stimulus_current_cell{}, + {tau, 20*tau}).at(0); ASSERT_EQ(2u, traces[i].size()); ASSERT_EQ(2u, ion_traces[i].size()); @@ -1157,19 +1161,21 @@ void run_stimulus_probe_test(context ctx) { // Model two simple stick cable cells, 3 CVs each, and stimuli on cell 0, cv 1 // and cell 1, cv 2. Run both cells in the same cell group. - const double stim_until = 1.; // [ms] + auto stim_from = 0.*U::ms; + auto stim_until = 1.*U::ms; + auto m = make_stick_morphology(); cv_policy policy = cv_policy_fixed_per_branch(3); decor d0, d1; d0.set_default(policy); - d0.place(mlocation{0, 0.5}, i_clamp::box(0., stim_until, 10.), "clamp0"); - d0.place(mlocation{0, 0.5}, i_clamp::box(0., stim_until, 20.), "clamp1"); + d0.place(mlocation{0, 0.5}, i_clamp::box(stim_from, stim_until, 10.*U::nA), "clamp0"); + d0.place(mlocation{0, 0.5}, i_clamp::box(stim_from, stim_until, 20.*U::nA), "clamp1"); double expected_stim0 = 30; d1.set_default(policy); - d1.place(mlocation{0, 1}, i_clamp::box(0., stim_until, 30.), "clamp0"); - d1.place(mlocation{0, 1}, i_clamp::box(0., stim_until, -10.), "clamp1"); + d1.place(mlocation{0, 1}, i_clamp::box(stim_from, stim_until, 30.*U::nA), "clamp0"); + d1.place(mlocation{0, 1}, i_clamp::box(stim_from, stim_until, -10.*U::nA), "clamp1"); double expected_stim1 = 20; std::vector<cable_cell> cells = {{m, d0}, {m, d1}}; @@ -1181,7 +1187,7 @@ void run_stimulus_probe_test(context ctx) { for (unsigned i: {0u, 1u}) { traces[i] = run_simple_sampler<std::vector<double>, mcable_list>(ctx, 2.5*stim_until, cells, {i, "Istim"}, cable_probe_stimulus_current_cell{}, - {stim_until/2, 2*stim_until}).at(0); + {0.5*stim_until, 2*stim_until}).at(0); ASSERT_EQ(3u, traces[i].meta.size()); for ([[maybe_unused]] unsigned cv: {0u, 1u, 2u}) { diff --git a/test/unit/test_recipe.cpp b/test/unit/test_recipe.cpp index 27b04cb7498d6d8fc712ac6e0308a3c8b386bb84..c388f357b7740fd31817c14692d1266723bbad83 100644 --- a/test/unit/test_recipe.cpp +++ b/test/unit/test_recipe.cpp @@ -17,83 +17,73 @@ #include "../common_cells.hpp" using namespace arb; -using arb::util::make_span; +namespace U = arb::units; namespace { - class custom_recipe: public recipe { - public: - custom_recipe(std::vector<cable_cell> cells, - std::vector<std::vector<cell_connection>> conns, - std::vector<std::vector<gap_junction_connection>> gjs, - std::vector<std::vector<arb::event_generator>> gens): - num_cells_(cells.size()), - connections_(conns), - gap_junctions_(gjs), - event_generators_(gens), - cells_(cells) {} - - cell_size_type num_cells() const override { - return num_cells_; - } - arb::util::unique_any get_cell_description(cell_gid_type gid) const override { - return cells_.at(gid); - } - cell_kind get_cell_kind(cell_gid_type gid) const override { - return cell_kind::cable; - } - std::vector<gap_junction_connection> gap_junctions_on(cell_gid_type gid) const override { - return gap_junctions_.at(gid); - } - std::vector<cell_connection> connections_on(cell_gid_type gid) const override { - return connections_.at(gid); - } - std::vector<arb::event_generator> event_generators(cell_gid_type gid) const override { - return event_generators_.at(gid); - } - std::any get_global_properties(cell_kind) const override { - arb::cable_cell_global_properties a; - a.default_parameters = arb::neuron_parameter_defaults; - return a; - } - - private: - cell_size_type num_cells_; - std::vector<std::vector<cell_connection>> connections_; - std::vector<std::vector<gap_junction_connection>> gap_junctions_; - std::vector<std::vector<arb::event_generator>> event_generators_; - std::vector<cable_cell> cells_; - }; - - cable_cell custom_cell(cell_size_type num_detectors, cell_size_type num_synapses, cell_size_type num_gj) { - arb::segment_tree tree; - tree.append(arb::mnpos, {0,0,0,10}, {0,0,20,10}, 1); // soma - tree.append(0, {0,0, 20, 2}, {0,0, 320, 2}, 3); // dendrite - - arb::cable_cell cell(tree, {}); - - arb::decor decorations; - - // Add a num_detectors detectors to the cell. - for (auto i: util::make_span(num_detectors)) { - decorations.place(arb::mlocation{0,(double)i/num_detectors}, arb::threshold_detector{10}, "detector"+std::to_string(i)); - } - - // Add a num_synapses synapses to the cell. - for (auto i: util::make_span(num_synapses)) { - decorations.place(arb::mlocation{0,(double)i/num_synapses}, arb::synapse("expsyn"), "synapse"+std::to_string(i)); - } - - // Add a num_gj gap_junctions to the cell. - for (auto i: util::make_span(num_gj)) { - decorations.place(arb::mlocation{0,(double)i/num_gj}, arb::junction("gj"), "gapjunction"+std::to_string(i)); - } - - return arb::cable_cell(tree, decorations); +struct custom_recipe: public recipe { + custom_recipe(std::vector<cable_cell> cells, + std::vector<std::vector<cell_connection>> conns, + std::vector<std::vector<gap_junction_connection>> gjs, + std::vector<std::vector<arb::event_generator>> gens): + num_cells_(cells.size()), + connections_(std::move(conns)), + gap_junctions_(std::move(gjs)), + event_generators_(std::move(gens)), + cells_(std::move(cells)) { + gprop.default_parameters = arb::neuron_parameter_defaults; } + + cell_size_type num_cells() const override { return num_cells_; } + arb::util::unique_any get_cell_description(cell_gid_type gid) const override { return cells_.at(gid); } + cell_kind get_cell_kind(cell_gid_type gid) const override { return cell_kind::cable; } + std::vector<gap_junction_connection> gap_junctions_on(cell_gid_type gid) const override { return gap_junctions_.at(gid); } + std::vector<cell_connection> connections_on(cell_gid_type gid) const override { return connections_.at(gid); } + std::vector<arb::event_generator> event_generators(cell_gid_type gid) const override { return event_generators_.at(gid); } + std::any get_global_properties(cell_kind) const override { return gprop; } + +private: + cell_size_type num_cells_; + std::vector<std::vector<cell_connection>> connections_; + std::vector<std::vector<gap_junction_connection>> gap_junctions_; + std::vector<std::vector<arb::event_generator>> event_generators_; + std::vector<cable_cell> cells_; + arb::cable_cell_global_properties gprop; +}; + +cable_cell custom_cell(cell_size_type num_detectors, cell_size_type num_synapses, cell_size_type num_gj) { + arb::segment_tree tree; + tree.append(arb::mnpos, {0,0,0,10}, {0,0,20,10}, 1); // soma + tree.append(0, {0,0, 20, 2}, {0,0, 320, 2}, 3); // dendrite + + arb::cable_cell cell(tree, {}); + + arb::decor decorations; + + // Add a num_detectors detectors to the cell. + for (auto i: util::make_span(num_detectors)) { + decorations.place(arb::mlocation{0,(double)i/num_detectors}, + arb::threshold_detector{10*arb::units::mV}, "detector"+std::to_string(i)); + } + + // Add a num_synapses synapses to the cell. + for (auto i: util::make_span(num_synapses)) { + decorations.place(arb::mlocation{0,(double)i/num_synapses}, + arb::synapse("expsyn"), + "synapse"+std::to_string(i)); + } + + // Add a num_gj gap_junctions to the cell. + for (auto i: util::make_span(num_gj)) { + decorations.place(arb::mlocation{0,(double)i/num_gj}, + arb::junction("gj"), + "gapjunction"+std::to_string(i)); + } + + return arb::cable_cell(tree, decorations); } +} // namespace -TEST(recipe, gap_junctions) -{ +TEST(recipe, gap_junctions) { auto context = make_context({arbenv::default_concurrency(), -1}); auto cell_0 = custom_cell(0, 0, 3); @@ -139,13 +129,13 @@ TEST(recipe, connections) auto cell_1 = custom_cell(2, 1, 0); std::vector<arb::cell_connection> conns_0, conns_1; { - conns_0 = {{{1, "detector0"}, {"synapse0"}, 0.1, 0.1}, - {{1, "detector1"}, {"synapse0"}, 0.1, 0.1}, - {{1, "detector0"}, {"synapse1"}, 0.2, 0.4}}; + conns_0 = {{{1, "detector0"}, {"synapse0"}, 0.1, 0.1*U::ms}, + {{1, "detector1"}, {"synapse0"}, 0.1, 0.1*U::ms}, + {{1, "detector0"}, {"synapse1"}, 0.2, 0.4*U::ms}}; - conns_1 = {{{0, "detector0"}, {"synapse0"}, 0.1, 0.2}, - {{0, "detector0"}, {"synapse0"}, 0.3, 0.1}, - {{0, "detector0"}, {"synapse0"}, 0.1, 0.8}}; + conns_1 = {{{0, "detector0"}, {"synapse0"}, 0.1, 0.2*U::ms}, + {{0, "detector0"}, {"synapse0"}, 0.3, 0.1*U::ms}, + {{0, "detector0"}, {"synapse0"}, 0.1, 0.8*U::ms}}; auto recipe_0 = custom_recipe({cell_0, cell_1}, {conns_0, conns_1}, {{}, {}}, {{}, {}}); auto decomp_0 = partition_load_balance(recipe_0, context); @@ -153,13 +143,13 @@ TEST(recipe, connections) EXPECT_NO_THROW(simulation(recipe_0, context, decomp_0)); } { - conns_0 = {{{1, "detector0"}, {"synapse0"}, 0.1, 0.1}, - {{2, "detector1"}, {"synapse0"}, 0.1, 0.1}, - {{1, "detector0"}, {"synapse1"}, 0.2, 0.4}}; + conns_0 = {{{1, "detector0"}, {"synapse0"}, 0.1, 0.1*U::ms}, + {{2, "detector1"}, {"synapse0"}, 0.1, 0.1*U::ms}, + {{1, "detector0"}, {"synapse1"}, 0.2, 0.4*U::ms}}; - conns_1 = {{{0, "detector0"}, {"synapse0"}, 0.1, 0.2}, - {{0, "detector0"}, {"synapse0"}, 0.3, 0.1}, - {{0, "detector0"}, {"synapse0"}, 0.1, 0.8}}; + conns_1 = {{{0, "detector0"}, {"synapse0"}, 0.1, 0.2*U::ms}, + {{0, "detector0"}, {"synapse0"}, 0.3, 0.1*U::ms}, + {{0, "detector0"}, {"synapse0"}, 0.1, 0.8*U::ms}}; auto recipe_1 = custom_recipe({cell_0, cell_1}, {conns_0, conns_1}, {{}, {}}, {{}, {}}); auto decomp_1 = partition_load_balance(recipe_1, context); @@ -167,13 +157,13 @@ TEST(recipe, connections) EXPECT_THROW(simulation(recipe_1, context, decomp_1), arb::bad_connection_source_gid); } { - conns_0 = {{{1, "detector0"}, {"synapse0"}, 0.1, 0.1}, - {{1, "detector1"}, {"synapse0"}, 0.1, 0.1}, - {{1, "detector3"}, {"synapse1"}, 0.2, 0.4}}; + conns_0 = {{{1, "detector0"}, {"synapse0"}, 0.1, 0.1*U::ms}, + {{1, "detector1"}, {"synapse0"}, 0.1, 0.1*U::ms}, + {{1, "detector3"}, {"synapse1"}, 0.2, 0.4*U::ms}}; - conns_1 = {{{0, "detector0"}, {"synapse0"}, 0.1, 0.2}, - {{0, "detector0"}, {"synapse0"}, 0.3, 0.1}, - {{0, "detector0"}, {"synapse0"}, 0.1, 0.8}}; + conns_1 = {{{0, "detector0"}, {"synapse0"}, 0.1, 0.2*U::ms}, + {{0, "detector0"}, {"synapse0"}, 0.3, 0.1*U::ms}, + {{0, "detector0"}, {"synapse0"}, 0.1, 0.8*U::ms}}; auto recipe_2 = custom_recipe({cell_0, cell_1}, {conns_0, conns_1}, {{}, {}}, {{}, {}}); auto decomp_2 = partition_load_balance(recipe_2, context); @@ -181,13 +171,13 @@ TEST(recipe, connections) EXPECT_THROW(simulation(recipe_2, context, decomp_2), arb::bad_connection_label); } { - conns_0 = {{{1, "detector0"}, {"synapse0"}, 0.1, 0.1}, - {{1, "detector1"}, {"synapse0"}, 0.1, 0.1}, - {{1, "detector0"}, {"synapse1"}, 0.2, 0.4}}; + conns_0 = {{{1, "detector0"}, {"synapse0"}, 0.1, 0.1*U::ms}, + {{1, "detector1"}, {"synapse0"}, 0.1, 0.1*U::ms}, + {{1, "detector0"}, {"synapse1"}, 0.2, 0.4*U::ms}}; - conns_1 = {{{0, "detector0"}, {"synapse0"}, 0.1, 0.2}, - {{0, "detector0"}, {"synapse9"}, 0.3, 0.1}, - {{0, "detector0"}, {"synapse0"}, 0.1, 0.8}}; + conns_1 = {{{0, "detector0"}, {"synapse0"}, 0.1, 0.2*U::ms}, + {{0, "detector0"}, {"synapse9"}, 0.3, 0.1*U::ms}, + {{0, "detector0"}, {"synapse0"}, 0.1, 0.8*U::ms}}; auto recipe_4 = custom_recipe({cell_0, cell_1}, {conns_0, conns_1}, {{}, {}}, {{}, {}}); auto decomp_4 = partition_load_balance(recipe_4, context); @@ -203,18 +193,18 @@ TEST(recipe, event_generators) { auto cell_1 = custom_cell(2, 1, 0); { std::vector<arb::event_generator> - gens_0 = {arb::explicit_generator({"synapse0"}, 0.1, std::vector<arb::time_type>{1.0}), - arb::explicit_generator({"synapse1"}, 0.1, std::vector<arb::time_type>{2.0})}, - gens_1 = {arb::explicit_generator({"synapse0"}, 0.1, std::vector<arb::time_type>{1.0})}; + gens_0 = {arb::explicit_generator_from_milliseconds({"synapse0"}, 0.1, std::vector{1.0}), + arb::explicit_generator_from_milliseconds({"synapse1"}, 0.1, std::vector{2.0})}, + gens_1 = {arb::explicit_generator_from_milliseconds({"synapse0"}, 0.1, std::vector{1.0})}; auto recipe_0 = custom_recipe({cell_0, cell_1}, {{}, {}}, {{}, {}}, {gens_0, gens_1}); auto decomp_0 = partition_load_balance(recipe_0, context); - EXPECT_NO_THROW(simulation(recipe_0, context, decomp_0).run(1, 0.1)); + EXPECT_NO_THROW(simulation(recipe_0, context, decomp_0).run(1*arb::units::ms, 0.1*arb::units::ms)); } { std::vector<arb::event_generator> - gens_0 = {arb::regular_generator({"totally-not-a-synapse-42"}, 0.1, 0, 0.001)}, + gens_0 = {arb::regular_generator({"totally-not-a-synapse-42"}, 0.1, 0*arb::units::ms, 0.001*arb::units::ms)}, gens_1 = {}; auto recipe_0 = custom_recipe({cell_0, cell_1}, {{}, {}}, {{}, {}}, {gens_0, gens_1}); diff --git a/test/unit/test_s_expr.cpp b/test/unit/test_s_expr.cpp index 5a7b8c876c38932bb66d52bfd147f597950b9360..17e9dc3df20be1bc072c2699c1cfe9bb57a42379 100644 --- a/test/unit/test_s_expr.cpp +++ b/test/unit/test_s_expr.cpp @@ -558,28 +558,28 @@ std::ostream& operator<<(std::ostream& o, const threshold_detector& p) { return o << "(threshold-detector " << p.threshold << ')'; } std::ostream& operator<<(std::ostream& o, const init_membrane_potential& p) { - return o << "(membrane-potential " << p.value << ')'; + return o << "(membrane-potential " << p.value << " " << p.scale << ')'; } -std::ostream& operator<<(std::ostream& o, const temperature_K& p) { - return o << "(temperature-kelvin " << p.value << ')'; +std::ostream& operator<<(std::ostream& o, const temperature& p) { + return o << "(temperature-kelvin " << p.value << " " << p.scale << ')'; } std::ostream& operator<<(std::ostream& o, const axial_resistivity& p) { - return o << "(axial-resistivity " << p.value << ')'; + return o << "(axial-resistivity " << p.value << " " << p.scale << ')'; } std::ostream& operator<<(std::ostream& o, const membrane_capacitance& p) { - return o << "(membrane-capacitance " << p.value << ')'; + return o << "(membrane-capacitance " << p.value << " " << p.scale << ')'; } std::ostream& operator<<(std::ostream& o, const init_int_concentration& p) { - return o << "(ion-internal-concentration \"" << p.ion << "\" " << p.value << ')'; + return o << "(ion-internal-concentration \"" << p.ion << "\" " << p.value << " " << p.scale << ')'; } std::ostream& operator<<(std::ostream& o, const ion_diffusivity& p) { - return o << "(ion-diffusivity \"" << p.ion << "\" " << p.value << ')'; + return o << "(ion-diffusivity \"" << p.ion << "\" " << p.value << " " << p.scale << ')'; } std::ostream& operator<<(std::ostream& o, const init_ext_concentration& p) { - return o << "(ion-external-concentration \"" << p.ion << "\" " << p.value << ')'; + return o << "(ion-external-concentration \"" << p.ion << "\" " << p.value << " " << p.scale << ')'; } std::ostream& operator<<(std::ostream& o, const init_reversal_potential& p) { - return o << "(ion-reversal-potential \"" << p.ion << "\" " << p.value << ')'; + return o << "(ion-reversal-potential \"" << p.ion << "\" " << p.value << " " << p.scale << ')'; } std::ostream& operator<<(std::ostream& o, const mechanism_desc& m) { o << "(mechanism \"" << m.name() << "\""; @@ -710,35 +710,15 @@ std::string round_trip_component(std::istream& stream) { } } -TEST(decor_literals, double_to_iexpr_promotion) { - using namespace cable_s_expr; - std::vector<std::pair<std::string, std::string>> literals = { - {"(membrane-potential -65.1)", "(membrane-potential (scalar -65.1))"}, - {"(temperature-kelvin 301)", "(temperature-kelvin (scalar 301))"}, - {"(axial-resistivity 102)", "(axial-resistivity (scalar 102))"}, - }; - - for (const auto& [in, out]: literals) { - std::string res; - if (auto x = arborio::parse_expression(in)) { - std::visit([&](auto&& p){res = to_string(p);}, *(eval_cast_variant<defaultable>(*x))); - } - else { - res = x.error().what(); - } - EXPECT_EQ(res, out); - } -} - TEST(decor_literals, round_tripping) { auto paint_default_literals = { - "(membrane-potential (scalar -65.1))", - "(temperature-kelvin (scalar 301))", - "(axial-resistivity (scalar 102))", - "(membrane-capacitance (scalar 0.01))", - "(ion-internal-concentration \"ca\" (scalar 75.1))", - "(ion-external-concentration \"h\" (scalar -50.1))", - "(ion-reversal-potential \"na\" (scalar 30))"}; + "(membrane-potential 2 (scalar -65.1))", + "(temperature-kelvin 3 (scalar 301))", + "(axial-resistivity 4 (scalar 102))", + "(membrane-capacitance 5 (scalar 0.01))", + "(ion-internal-concentration \"ca\" 6 (scalar 75.1))", + "(ion-external-concentration \"h\" 7 (scalar -50.1))", + "(ion-reversal-potential \"na\" 8 (scalar 30))"}; auto paint_literals = { "(voltage-process (mechanism \"hh\"))", "(density (mechanism \"hh\"))", @@ -791,25 +771,25 @@ TEST(decor_literals, round_tripping) { TEST(decor_expressions, round_tripping) { using namespace cable_s_expr; auto decorate_paint_literals = { - "(paint (region \"all\") (membrane-potential (scalar -65.1)))", - "(paint (tag 1) (temperature-kelvin (scalar 301)))", - "(paint (distal-interval (location 3 0)) (axial-resistivity (scalar 102)))", - "(paint (join (region \"dend\") (all)) (membrane-capacitance (scalar 0.01)))", - "(paint (radius-gt (tag 3) 1) (ion-internal-concentration \"ca\" (scalar 75.1)))", - "(paint (intersect (cable 2 0 0.5) (region \"axon\")) (ion-external-concentration \"h\" (scalar -50.1)))", - "(paint (region \"my_region\") (ion-reversal-potential \"na\" (scalar 30)))", + "(paint (region \"all\") (membrane-potential 1 (scalar -65.1)))", + "(paint (tag 1) (temperature-kelvin 2 (scalar 301)))", + "(paint (distal-interval (location 3 0)) (axial-resistivity 2 (scalar 102)))", + "(paint (join (region \"dend\") (all)) (membrane-capacitance 3 (scalar 0.01)))", + "(paint (radius-gt (tag 3) 1) (ion-internal-concentration \"ca\" 4 (scalar 75.1)))", + "(paint (intersect (cable 2 0 0.5) (region \"axon\")) (ion-external-concentration \"h\" 5 (scalar -50.1)))", + "(paint (region \"my_region\") (ion-reversal-potential \"na\" 6 (scalar 30)))", "(paint (cable 2 0.1 0.4) (density (mechanism \"hh\")))", "(paint (cable 2 0.1 0.4) (scaled-mechanism (density (mechanism \"pas\" (\"g\" 0.02))) (\"g\" (exp (add (distance 2.1 (region \"my_region\")) (scalar 3.2))))))", "(paint (all) (density (mechanism \"pas\" (\"g\" 0.02))))" }; auto decorate_default_literals = { - "(default (membrane-potential (scalar -65.1)))", - "(default (temperature-kelvin (scalar 301)))", - "(default (axial-resistivity (scalar 102)))", - "(default (membrane-capacitance (scalar 0.01)))", - "(default (ion-internal-concentration \"ca\" (scalar 75.1)))", - "(default (ion-external-concentration \"h\" (scalar -50.1)))", - "(default (ion-reversal-potential \"na\" (scalar 30)))", + "(default (membrane-potential 1 (scalar -65.1)))", + "(default (temperature-kelvin 2 (scalar 301)))", + "(default (axial-resistivity 3 (scalar 102)))", + "(default (membrane-capacitance 4 (scalar 0.01)))", + "(default (ion-internal-concentration \"ca\" 5 (scalar 75.1)))", + "(default (ion-external-concentration \"h\" 6 (scalar -50.1)))", + "(default (ion-reversal-potential \"na\" 7 (scalar 30)))", "(default (ion-reversal-potential-method \"ca\" (mechanism \"nernst/ca\")))", "(default (cv-policy (max-extent 2 (region \"soma\") 2)))" }; @@ -875,14 +855,19 @@ TEST(morphology_literals, round_tripping) { } } +TEST(decor, quantity) { + std::string q = "(quantity 10.0 \"Ohm\")"; + parse_expression(q).value(); +} + TEST(decor, round_tripping) { std::string component_str = "(arbor-component \n" " (meta-data \n" " (version \"" + arborio::acc_version() +"\"))\n" " (decor \n" " (default \n" - " (axial-resistivity \n" - " (scalar 100)))\n" + " (axial-resistivity 100.000000 \n" + " (scalar 1)))\n" " (default \n" " (ion-reversal-potential-method \"na\" \n" " (mechanism \"nernst\")))\n" @@ -915,7 +900,7 @@ TEST(decor, round_tripping) { " (join \n" " (tag 1)\n" " (tag 2))\n" - " (ion-internal-concentration \"ca\" \n" + " (ion-internal-concentration \"ca\" 1.000000 \n" " (scalar 0.5)))\n" " (place \n" " (location 0 0)\n" @@ -1225,11 +1210,10 @@ TEST(doc_expressions, parse) { "(mechanism \"hh\" (\"gl\" 0.5) (\"el\" 2))", "(ion-reversal-potential-method \"ca\" (mechanism \"nernst/ca\"))", "(current-clamp (envelope (0 10) (50 10) (50 0)) 40 0.25)", - "(paint (tag 1) (membrane-capacitance 0.02))", + "(paint (tag 1) (membrane-capacitance 0.02 (scalar 1)))", "(place (locset \"mylocset\") (threshold-detector 10) \"mydetectors\")", - "(default (membrane-potential -65))", - "(segment 3 (point 0 0 0 5) (point 0 0 10 2) 1)"}) - { + "(default (membrane-potential -65.000000 (scalar 1)))", + "(segment 3 (point 0 0 0 5) (point 0 0 10 2) 1)"}) { EXPECT_TRUE(arborio::parse_expression(expr)); } @@ -1241,9 +1225,9 @@ TEST(doc_expressions, parse) { " (region-def \"my_region\" (radius-ge (region \"my_soma\") 1.5))\n" " (locset-def \"terminal\" (terminal)))", "(decor\n" - " (default (membrane-potential -55.000000))\n" - " (paint (region \"custom\") (temperature-kelvin 270))\n" - " (paint (region \"soma\") (membrane-potential -50.000000))\n" + " (default (membrane-potential -55.000000 (scalar 1)))\n" + " (paint (region \"custom\") (temperature-kelvin 270 (scalar 1)))\n" + " (paint (region \"soma\") (membrane-potential -50.000000 (scalar 1)))\n" " (paint (all) (density (mechanism \"pas\")))\n" " (paint (tag 4) (density (mechanism \"Ih\" (\"gbar\" 0.001))))\n" " (place (locset \"root\") (synapse (mechanism \"expsyn\")) \"root_synapse\")\n" @@ -1274,9 +1258,9 @@ TEST(doc_expressions, parse) { " (region-def \"my_region\" (radius-ge (region \"my_soma\") 1.5))\n" " (locset-def \"terminal\" (terminal)))\n" " (decor\n" - " (default (membrane-potential -55.000000))\n" - " (paint (region \"my_soma\") (temperature-kelvin 270))\n" - " (paint (region \"my_region\") (membrane-potential -50.000000))\n" + " (default (membrane-potential -55.000000 (scalar 1)))\n" + " (paint (region \"my_soma\") (temperature-kelvin 270 (scalar 1)))\n" + " (paint (region \"my_region\") (membrane-potential -50.000000 (scalar 1)))\n" " (paint (tag 4) (density (mechanism \"Ih\" (\"gbar\" 0.001))))\n" " (place (locset \"root\") (synapse (mechanism \"expsyn\")) \"root_synapse\")\n" " (place (location 1 0.2) (junction (mechanism \"gj\")) \"terminal_gj\"))\n" @@ -1315,9 +1299,9 @@ TEST(doc_expressions, parse) { "(arbor-component\n" " (meta-data (version \"" + arborio::acc_version() +"\"))\n" " (decor\n" - " (default (membrane-potential -55.000000))\n" + " (default (membrane-potential -55.000000 (scalar 1)))\n" " (place (locset \"root\") (synapse (mechanism \"expsyn\")) \"root_synapse\")\n" - " (paint (region \"my_soma\") (temperature-kelvin 270))))", + " (paint (region \"my_soma\") (temperature-kelvin 270 (scalar 1)))))", "(arbor-component\n" " (meta-data (version \"" + arborio::acc_version() +"\"))\n" " (morphology\n" @@ -1332,9 +1316,9 @@ TEST(doc_expressions, parse) { " (region-def \"my_soma\" (tag 1))\n" " (locset-def \"root\" (root)))\n" " (decor\n" - " (default (membrane-potential -55.000000))\n" + " (default (membrane-potential -55.000000 (scalar 1)))\n" " (place (locset \"root\") (synapse (mechanism \"expsyn\")) \"root_synapse\")\n" - " (paint (region \"my_soma\") (temperature-kelvin 270)))\n" + " (paint (region \"my_soma\") (temperature-kelvin 270 (scalar 1))))\n" " (morphology\n" " (branch 0 -1\n" " (segment 0 (point 0 0 0 2) (point 4 0 0 2) 1)\n" diff --git a/test/unit/test_schedule.cpp b/test/unit/test_schedule.cpp index 8452385160443138b72cb01abf232613c7b42dce..6f6e98f30761da4267511e02fc892881ccf1f2e7 100644 --- a/test/unit/test_schedule.cpp +++ b/test/unit/test_schedule.cpp @@ -17,9 +17,8 @@ using namespace testing; using time_range = util::range<const time_type*>; -// Pull events from n non-contiguous subintervals of [t0, t1) -// and check for monotonicity and boundedness. - +// Pull events from n non-contiguous subintervals of [t0, t1) and check for +// monotonicity and boundedness. void run_invariant_checks(schedule S, time_type t0, time_type t1, unsigned n, int seed=0) { if (!n) return; @@ -45,14 +44,13 @@ void run_invariant_checks(schedule S, time_type t0, time_type t1, unsigned n, in } } -// Take events from n contiguous intervals comprising [t0, t1), reset, and -// then compare with events taken from a different set of contiguous -// intervals comprising [t0, t1). - +// Take events from n contiguous intervals comprising [t0, t1), reset, and then +// compare with events taken from a different set of contiguous intervals +// comprising [t0, t1). void run_reset_check(schedule S, time_type t0, time_type t1, unsigned n, int seed=0) { if (!n) return; - std::minstd_rand R(seed); + engine_type R(seed); std::uniform_real_distribution<time_type> U(t0, t1); std::vector<time_type> first_div = {t0, t1}; @@ -87,7 +85,7 @@ TEST(schedule, regular) { // Use exact fp representations for strict equality testing. std::vector<time_type> expected = {0, 0.25, 0.5, 0.75, 1.0}; - schedule S = regular_schedule(0.25); + schedule S = regular_schedule(0.25*arb::units::ms); EXPECT_EQ(expected, as_vector(S.events(0, 1.25))); S.reset(); @@ -100,12 +98,12 @@ TEST(schedule, regular) { TEST(schedule, regular_invariants) { SCOPED_TRACE("regular_invariants"); - run_invariant_checks(regular_schedule(0.3), 3, 12, 7); + run_invariant_checks(regular_schedule(0.3*arb::units::ms), 3, 12, 7); } TEST(schedule, regular_reset) { SCOPED_TRACE("regular_reset"); - run_reset_check(regular_schedule(0.3), 3, 12, 7); + run_reset_check(regular_schedule(0.3*arb::units::ms), 3, 12, 7); } TEST(schedule, regular_rounding) { @@ -120,7 +118,7 @@ TEST(schedule, regular_rounding) { time_type t0 = t1-10*dt; time_type t2 = t1+10*dt; - schedule S = regular_schedule(t0, dt); + schedule S = regular_schedule(t0*arb::units::ms, dt*arb::units::ms); auto int_l = as_vector(S.events(t0, t1)); auto int_r = as_vector(S.events(t1, t2)); @@ -144,10 +142,10 @@ TEST(schedule, regular_rounding) { } TEST(schedule, explicit_schedule) { - time_type times[] = {0.1, 0.3, 1.0, 1.25, 1.7, 2.2}; - std::vector<time_type> expected = {0.1, 0.3, 1.0}; + std::vector times{0.1, 0.3, 1.0, 1.25, 1.7, 2.2}; + std::vector expected{0.1, 0.3, 1.0}; - schedule S = explicit_schedule(times); + schedule S = explicit_schedule_from_milliseconds(times); EXPECT_EQ(expected, as_vector(S.events(0, 1.25))); S.reset(); @@ -161,47 +159,19 @@ TEST(schedule, explicit_schedule) { TEST(schedule, explicit_invariants) { SCOPED_TRACE("explicit_invariants"); - time_type times[] = {0.1, 0.3, 0.4, 0.42, 2.1, 2.3, 6.01, 9, 9.1, 9.8, 10, 11.2, 13}; - run_invariant_checks(explicit_schedule(times), 0.4, 10.2, 5); + std::vector<arb::time_type> times{0.1, 0.3, 0.4, 0.42, 2.1, 2.3, 6.01, 9, 9.1, 9.8, 10, 11.2, 13}; + run_invariant_checks(explicit_schedule_from_milliseconds(times), 0.4, 10.2, 5); } TEST(schedule, explicit_reset) { SCOPED_TRACE("explicit_reset"); - time_type times[] = {0.1, 0.3, 0.4, 0.42, 2.1, 2.3, 6.01, 9, 9.1, 9.8, 10, 11.2, 13}; - run_reset_check(explicit_schedule(times), 0.4, 10.2, 5); + std::vector<arb::time_type> times{0.1, 0.3, 0.4, 0.42, 2.1, 2.3, 6.01, 9, 9.1, 9.8, 10, 11.2, 13}; + run_reset_check(explicit_schedule_from_milliseconds(times), 0.4, 10.2, 5); } -// A Uniform Random Bit Generator[*] adaptor that deliberately -// skews the generated numbers by raising their quantile to -// the given power. -// -// [*] Not actually uniform. - -template <typename RNG> -struct skew_adaptor { - using result_type = typename RNG::result_type; - static constexpr result_type min() { return RNG::min(); } - static constexpr result_type max() { return RNG::max(); } - - explicit skew_adaptor(double power): power_(power) {} - result_type operator()() { - constexpr double scale = (double)(max()-min()); - constexpr double ooscale = 1./scale; - - double x = ooscale*(G_()-min()); - x = std::pow(x, power_); - return min()+scale*x; - } - -private: - RNG G_; - double power_; -}; - -template <typename RNG> -double poisson_schedule_dispersion(int nbin, double rate_kHz, RNG& G) { - schedule S = poisson_schedule(rate_kHz, G); +double poisson_schedule_dispersion(int nbin, double rate_kHz) { + schedule S = poisson_schedule(rate_kHz*arb::units::kHz); std::vector<int> bin(nbin); for (auto t: time_range(S.events(0, nbin))) { @@ -238,8 +208,7 @@ TEST(schedule, poisson_uniformity) { constexpr double chi2_lb = 888.56352318146696; constexpr double chi2_ub = 1118.9480663231843; - std::mt19937_64 G; - double dispersion = poisson_schedule_dispersion(N, .813, G); + double dispersion = poisson_schedule_dispersion(N, .813); double test_value = N*dispersion; EXPECT_GT(test_value, chi2_lb); EXPECT_LT(test_value, chi2_ub); @@ -247,34 +216,12 @@ TEST(schedule, poisson_uniformity) { // Run one sample K-S test for uniformity, with critical // value for the finite K-S statistic Dn of α=0.01. - schedule S = poisson_schedule(100., G); + schedule S = poisson_schedule(100.*arb::units::kHz); auto events = as_vector(S.events(0,1)); int n = (int)events.size(); double dn = ks::dn_statistic(events); EXPECT_LT(ks::dn_cdf(dn, n), 0.99); - - // Check that these tests fail for a non-Poisson - // source. - - skew_adaptor<std::mt19937_64> W(1.5); - dispersion = poisson_schedule_dispersion(N, .813, W); - test_value = N*dispersion; - - EXPECT_FALSE(test_value>=chi2_lb && test_value<=chi2_ub); - - S = poisson_schedule(100., W); - events = as_vector(S.events(0,1)); - n = (int)events.size(); - dn = ks::dn_statistic(events); - - // This test is currently failing, because we can't - // use a sufficiently high `n` in the `dn_cdf` function - // to get enough discrimination from the K-S test at - // 1%. TODO: Fix this by implementing n>140 case in - // `dn_cdf`. - - // EXPECT_GT(ks::dn_cdf(dn, n), 0.99); } TEST(schedule, poisson_rate) { @@ -284,37 +231,26 @@ TEST(schedule, poisson_rate) { constexpr double alpha = 0.01; constexpr double lambda = 123.4; - std::mt19937_64 G; - schedule S = poisson_schedule(lambda, G); + schedule S = poisson_schedule(lambda*arb::units::kHz); int n = (int)time_range(S.events(0, 1)).size(); double cdf = poisson::poisson_cdf_approx(n, lambda); EXPECT_GT(cdf, alpha/2); - EXPECT_LT(cdf, 1-alpha/2); - - // Check that the test fails for a non-Poisson - // source. - - skew_adaptor<std::mt19937_64> W(1.5); - S = poisson_schedule(lambda, W); - n = (int)time_range(S.events(0, 1)).size(); - cdf = poisson::poisson_cdf_approx(n, lambda); - - EXPECT_FALSE(cdf>=alpha/2 && cdf<=1-alpha/2); + EXPECT_LT(cdf, 1 - alpha/2); } TEST(schedule, poisson_invariants) { SCOPED_TRACE("poisson_invariants"); - std::mt19937_64 G; - G.discard(100); - run_invariant_checks(poisson_schedule(0.81, G), 5.1, 15.3, 7); + auto sched = poisson_schedule(0.81*arb::units::kHz); + sched.discard(100); + run_invariant_checks(sched, 5.1, 15.3, 7); } TEST(schedule, poisson_reset) { SCOPED_TRACE("poisson_reset"); - std::mt19937_64 G; - G.discard(200); - run_reset_check(poisson_schedule(.11, G), 1, 10, 7); + auto sched = poisson_schedule(0.11*arb::units::kHz); + sched.discard(200); + run_reset_check(sched, 1, 10, 7); } TEST(schedule, poisson_offset) { @@ -322,43 +258,38 @@ TEST(schedule, poisson_offset) { // same sequence, after the offset, as a regular zero-based Poisson. const double offset = 3.3; - - std::mt19937_64 G1; - G1.discard(300); - + auto T = 100.0; + auto sched1 = poisson_schedule(.234*arb::units::kHz); + sched1.discard(300); std::vector<time_type> expected; - for (auto t: as_vector(poisson_schedule(.234, G1).events(0., 100.))) { + for (auto t: as_vector(sched1.events(0., T))) { t += offset; - if (t<100.) { - expected.push_back(t); - } + if (t < T) expected.push_back(t); } - std::mt19937_64 G2; - G2.discard(300); - + auto sched2 = poisson_schedule(offset*arb::units::ms, .234*arb::units::kHz); + sched2.discard(300); EXPECT_TRUE(seq_almost_eq<time_type>(expected, - as_vector(poisson_schedule(offset, .234, G2).events(0., 100.)))); + as_vector(sched2.events(0., 100.)))); } TEST(schedule, poisson_offset_reset) { SCOPED_TRACE("poisson_reset"); - std::mt19937_64 G; - G.discard(400); - run_reset_check(poisson_schedule(3.3, 9.1, G), 1, 10, 7); + auto sched = poisson_schedule(3.3*arb::units::ms, 0.81*arb::units::kHz); + sched.discard(400); + run_reset_check(sched, 1, 10, 7); } TEST(schedule, poisson_tstop) { SCOPED_TRACE("poisson_tstop"); - std::mt19937_64 G; - G.discard(500); - - const double tstop = 50; - auto const times = as_vector(poisson_schedule(0, .234, G, tstop).events(0., 100.)); + auto T = 50.0; + auto sched = poisson_schedule(0*arb::units::ms, 0.234*arb::units::kHz, default_seed, T*arb::units::ms); + sched.discard(500); + auto const times = as_vector(sched.events(0., 100.)); auto const max = std::max_element(begin(times), end(times)); EXPECT_TRUE(max != end(times)); - EXPECT_TRUE(*max <= tstop); + EXPECT_TRUE(*max <= T); } diff --git a/test/unit/test_sde.cpp b/test/unit/test_sde.cpp index 7383b7ef02b9b193b5a1c47d3b56aaf15f46b881..87f19824f35b9a4fe3a19093d442c46c7aef870a 100644 --- a/test/unit/test_sde.cpp +++ b/test/unit/test_sde.cpp @@ -1,9 +1,9 @@ - #include <gtest/gtest.h> #include <atomic> #include <algorithm> #include <cmath> +#include <iostream> #include <arborio/label_parse.hpp> @@ -14,6 +14,8 @@ #include <arbor/schedule.hpp> #include <arbor/mechanism.hpp> #include <arbor/util/any_ptr.hpp> +#include <arbor/units.hpp> + #ifdef ARB_GPU_ENABLED #include "memory/gpu_wrappers.hpp" #endif @@ -23,6 +25,8 @@ #include "unit_test_catalogue.hpp" #include "../simple_recipes.hpp" +namespace U = arb::units; + // ============================ // helper classes and functions // ============================ @@ -409,7 +413,7 @@ TEST(sde, reproducibility) { // simulation parameters unsigned ncells = 4; unsigned ncvs = 2; - double const dt = 0.5; + auto const dt = 0.5*arb::units::ms; unsigned nsteps = 6; // Decorations with a bunch of stochastic processes @@ -490,7 +494,7 @@ TEST(sde, normality) { unsigned ncells = 4; unsigned nsynapses = 100; unsigned ncvs = 100; - double const dt = 0.5; + auto dt = 0.5*arb::units::ms;; unsigned nsteps = 50; // make labels (and locations for synapses) @@ -647,7 +651,7 @@ TEST(sde, solver) { unsigned ncells = 4; unsigned nsynapses = 2000; unsigned ncvs = 1; - double const dt = 1.0/512; // need relatively small time steps due to low accuracy + auto dt = 1.0/512*arb::units::ms; // need relatively small time steps due to low accuracy unsigned nsteps = 100; unsigned nsims = 4; @@ -773,7 +777,7 @@ TEST(sde, solver) { auto test = [&] (auto func, const auto& stats) { for (unsigned int i=1; i<nsteps; ++i) { - auto [mu, sigma_squared] = func(i*dt); + auto [mu, sigma_squared] = func(i*dt.value()); double const mean = stats[i].mean(); double const var = stats[i].variance(); @@ -802,7 +806,7 @@ TEST(sde, coupled) { unsigned ncells = 4; unsigned nsynapses = 2000; unsigned ncvs = 1; - double const dt = 1.0/512; // need relatively small time steps due to low accuracy + auto dt = 1.0/512*arb::units::ms; // need relatively small time steps due to low accuracy unsigned nsteps = 100; unsigned nsims = 4; @@ -908,7 +912,7 @@ TEST(sde, coupled) { }; for (unsigned int i=1; i<nsteps; ++i) { - auto ex = expected(i*dt, 0.1, 0.1, 0.1, 0.1, 1, 0.2); + auto ex = expected(i*dt.value(), 0.1, 0.1, 0.1, 0.1, 1, 0.2); const double E_P = ex[0]; const double E_sigma = ex[1]; @@ -1030,7 +1034,7 @@ TEST(sde, gpu) { unsigned ncells = 4; unsigned nsynapses = 100; unsigned ncvs = 100; - double const dt = 0.5; + auto dt = 0.5*U::ms; unsigned nsteps = 50; // make labels (and locations for synapses) diff --git a/test/unit/test_serdes.cpp b/test/unit/test_serdes.cpp index cd0e53b15a4f7e3551d4bee12bc29e388a34e242..546362daac9d870d93215adad50487214f8b7074 100644 --- a/test/unit/test_serdes.cpp +++ b/test/unit/test_serdes.cpp @@ -19,6 +19,8 @@ using arb::serialize; +namespace U = arb::units; + using json = nlohmann::json; using io = arborio::json_serdes; using serdes = arb::serializer; @@ -143,7 +145,7 @@ struct serdes_recipe: public arb::recipe { .paint(arb::join(arb::reg::tagged(2), arb::reg::tagged(3)), arb::density("pas")) .place(arb::mlocation{0, 0.0}, - arb::threshold_detector{10}, + arb::threshold_detector{10*arb::units::mV}, "detector") .place(arb::mlocation{0, 1.0}, arb::synapse("exp2syn"), @@ -162,12 +164,12 @@ struct serdes_recipe: public arb::recipe { return {{{src, "detector"}, {"synapse"}, 0.5, - 0.125}}; + 0.125*U::ms}}; } std::vector<arb::event_generator> event_generators(arb::cell_gid_type gid) const override { std::vector<arb::event_generator> res; - if (!gid) res.push_back(arb::regular_generator({"synapse"}, 1, 0.5, 0.73)); + if (!gid) res.push_back(arb::regular_generator({"synapse"}, 1, 0.5*arb::units::ms, 0.73*arb::units::ms)); return {}; } @@ -190,8 +192,8 @@ void sampler(arb::probe_metadata pm, } TEST(serdes, single_cell) { - double dt = 0.5; - double T = 5; + auto dt = 0.5*arb::units::ms; + auto T = 5*arb::units::ms; // Result std::vector<double> result_pre; @@ -231,8 +233,8 @@ TEST(serdes, single_cell) { } TEST(serdes, network) { - double dt = 0.5; - double T = 5; + auto dt = 0.5*arb::units::ms; + auto T = 5*arb::units::ms; // Result std::vector<double> result_pre; @@ -300,8 +302,8 @@ TEST(serdes, host_device_arrays) { } TEST(serdes, single_cell_gpu) { - double dt = 0.5; - double T = 5; + auto dt = 0.5*arb::units::ms; + auto T = 5*arb::units::ms; // Result std::vector<double> result_pre; @@ -340,8 +342,8 @@ TEST(serdes, single_cell_gpu) { } TEST(serdes, network_gpu) { - double dt = 0.5; - double T = 5; + auto dt = 0.5*arb::units::ms; + auto T = 5*arb::units::ms; // Result std::vector<double> result_pre; diff --git a/test/unit/test_simulation.cpp b/test/unit/test_simulation.cpp index 88bdec4072d35f0d3ba23420a8345a154b9b1944..8fa4c08d572f41c224baca7ba02eecdfc558a969 100644 --- a/test/unit/test_simulation.cpp +++ b/test/unit/test_simulation.cpp @@ -1,6 +1,5 @@ #include <gtest/gtest.h> -#include <random> #include <vector> #include <any> @@ -17,18 +16,15 @@ #include "util/rangeutil.hpp" #include "util/transform.hpp" -#include "common.hpp" using namespace arb; +namespace U = arb::units; struct play_spikes: public recipe { play_spikes(std::vector<schedule> spike_times): spike_times_(std::move(spike_times)) {} cell_size_type num_cells() const override { return spike_times_.size(); } cell_kind get_cell_kind(cell_gid_type) const override { return cell_kind::spike_source; } - util::unique_any get_cell_description(cell_gid_type gid) const override { - return spike_source_cell("src", spike_times_.at(gid)); - } - + util::unique_any get_cell_description(cell_gid_type gid) const override { return spike_source_cell("src", spike_times_.at(gid)); } std::vector<schedule> spike_times_; }; @@ -52,7 +48,7 @@ TEST(simulation, null) { auto c = arb::make_context(); auto d = arb::partition_load_balance(r, c); auto s = arb::simulation(r, c, d); - s.run(0.05, 0.01); + s.run(0.05*arb::units::ms, 0.01*arb::units::ms); } // Test with simulation builder @@ -60,22 +56,23 @@ TEST(simulation, null_builder) { auto r = null_recipe{}; { arb::simulation s = arb::simulation::create(r); - s.run(0.05, 0.01); + s.run(0.05*arb::units::ms, + 0.01*arb::units::ms); } { arb::simulation s = arb::simulation::create(r).set_seed(42); - s.run(0.05, 0.01); + s.run(0.05*arb::units::ms, 0.01*arb::units::ms); } { auto c = arb::make_context(); arb::simulation s = arb::simulation::create(r).set_context(c); - s.run(0.05, 0.01); + s.run(0.05*arb::units::ms, 0.01*arb::units::ms); } { auto c = arb::make_context(); auto d = arb::partition_load_balance(r, c); arb::simulation s = arb::simulation::create(r).set_context(c).set_decomposition(d); - s.run(0.05, 0.01); + s.run(0.05*arb::units::ms, 0.01*arb::units::ms); } } @@ -85,7 +82,7 @@ TEST(simulation, spike_global_callback) { std::vector<schedule> spike_times; for (unsigned i = 0; i<n; ++i) { - spike_times.push_back(poisson_schedule(0., 20./t_max, std::minstd_rand(1000+i))); + spike_times.push_back(poisson_schedule(0.*arb::units::ms, 20./t_max*arb::units::kHz, 1000 + i)); } std::vector<spike> expected_spikes; @@ -107,7 +104,7 @@ TEST(simulation, spike_global_callback) { double tfinal = 0.7*t_max; constexpr double dt = 0.01; - sim.run(tfinal, dt); + sim.run(tfinal*arb::units::ms, dt*arb::units::ms); auto spike_lt = [](spike a, spike b) { return a.time<b.time || (a.time==b.time && a.source<b.source); }; std::sort(expected_spikes.begin(), expected_spikes.end(), spike_lt); @@ -128,28 +125,20 @@ struct lif_chain: public recipe { util::unique_any get_cell_description(cell_gid_type) const override { // A hair-trigger LIF cell with tiny time constant and no refractory period. lif_cell lif("src", "tgt"); - lif.tau_m = 0.01; // time constant (ms) - lif.t_ref = 0; // refactory period (ms) - lif.V_th = lif.E_L + 0.001; // threshold voltage 1 µV higher than resting + lif.tau_m = 0.01*U::ms; // time constant (ms) + lif.t_ref = 0*U::ms; // refactory period (ms) + lif.V_th = lif.E_L + 0.001*U::mV; // threshold voltage 1 µV higher than resting return lif; } std::vector<cell_connection> connections_on(cell_gid_type target) const override { - if (target) { - return {cell_connection({target-1, "src"}, {"tgt"}, weight_, delay_)}; - } - else { - return {}; - } + if (target) return {cell_connection({target-1, "src"}, {"tgt"}, weight_, delay_*U::ms)}; + return {}; } std::vector<event_generator> event_generators(cell_gid_type target) const override { - if (target) { - return {}; - } - else { - return {event_generator({"tgt"}, weight_, triggers_)}; - } + if (target) return {}; + return {event_generator({"tgt"}, weight_, triggers_)}; } static constexpr double weight_ = 2.0; @@ -162,7 +151,7 @@ TEST(simulation, restart) { std::vector<double> trigger_times = {1., 2., 3.}; double delay = 10; unsigned n = 5; - lif_chain rec(n, delay, explicit_schedule(trigger_times)); + lif_chain rec(n, delay, explicit_schedule_from_milliseconds(trigger_times)); // Expect spike times to be almost exactly according to trigger times, // plus delays along the chain of cells. @@ -203,7 +192,7 @@ TEST(simulation, restart) { double t = 0; do { double run_to = std::min(tfinal, t + run_time); - t = sim.run(run_to, dt); + t = sim.run(run_to*arb::units::ms, dt*arb::units::ms); ASSERT_EQ(t, run_to); } while (t<tfinal); ASSERT_EQ(expected_spikes.size(), collected.size()); diff --git a/test/unit/test_spike_source.cpp b/test/unit/test_spike_source.cpp index 7dc592ac8b9fa761f79d0d002e4d642c0ebf595f..8e77af7c93fdb5d6352e7d3e957aaa699a607b7e 100644 --- a/test/unit/test_spike_source.cpp +++ b/test/unit/test_spike_source.cpp @@ -14,8 +14,7 @@ using ss_recipe = homogeneous_recipe<cell_kind::spike_source, spike_source_cell> // Test that a spike_source_cell_group identifies itself with the correct // cell_kind enum value. -TEST(spike_source, cell_kind) -{ +TEST(spike_source, cell_kind) { ss_recipe rec(1u, spike_source_cell("src", explicit_schedule({}))); cell_label_range srcs, tgts; spike_source_cell_group group({0}, rec, srcs, tgts); @@ -37,8 +36,7 @@ static std::vector<time_type> spike_times(const std::vector<spike>& evs) { // Test that a spike_source_cell_group produces a sequence of spikes with spike // times corresponding to the underlying time_seq. -TEST(spike_source, matches_time_seq) -{ +TEST(spike_source, matches_time_seq) { auto test_seq = [](schedule seq) { ss_recipe rec(1u, spike_source_cell("src", seq)); cell_label_range srcs, tgts; @@ -57,16 +55,14 @@ TEST(spike_source, matches_time_seq) EXPECT_EQ(spike_times(group.spikes()), as_vector(seq.events(10, 20))); }; - std::mt19937_64 G; - test_seq(regular_schedule(0, 1)); - test_seq(poisson_schedule(10, G)); // produce many spikes in each interval - test_seq(poisson_schedule(1e-6, G)); // very unlikely to produce any spikes in either interval + test_seq(regular_schedule(1*arb::units::ms)); + test_seq(poisson_schedule(10*arb::units::kHz)); // produce many spikes in each interval + test_seq(poisson_schedule(1e-6*arb::units::kHz)); // very unlikely to produce any spikes in either interval } // Test that a spike_source_cell_group will produce the same sequence of spikes // after being reset. -TEST(spike_source, reset) -{ +TEST(spike_source, reset) { auto test_seq = [](schedule seq) { ss_recipe rec(1u, spike_source_cell("src", seq)); cell_label_range srcs, tgts; @@ -87,16 +83,14 @@ TEST(spike_source, reset) EXPECT_EQ(spikes1, spikes2); }; - std::mt19937_64 G; - test_seq(regular_schedule(0, 1)); - test_seq(poisson_schedule(10, G)); // produce many spikes in each interval - test_seq(poisson_schedule(1e-6, G)); // very unlikely to produce any spikes in either interval + test_seq(regular_schedule(10*arb::units::ms)); + test_seq(poisson_schedule(100*arb::units::kHz)); // produce many spikes in each interval + test_seq(poisson_schedule(1e-6*arb::units::kHz)); // very unlikely to produce any spikes in either interval } // Test that a spike_source_cell_group will produce the expected // output when the underlying time_seq is finite. -TEST(spike_source, exhaust) -{ +TEST(spike_source, exhaust) { // This test assumes that seq will exhaust itself before t=10 ms. auto test_seq = [](schedule seq) { ss_recipe rec(1u, spike_source_cell("src", seq)); @@ -112,12 +106,11 @@ TEST(spike_source, exhaust) EXPECT_LT(group.spikes().back().time, time_type(10)); }; - test_seq(regular_schedule(0, 1, 5)); - test_seq(explicit_schedule({0.3, 2.3, 4.7})); + test_seq(regular_schedule(0*arb::units::ms, 1*arb::units::ms, 5*arb::units::ms)); + test_seq(explicit_schedule_from_milliseconds(std::vector{0.3, 2.3, 4.7})); } -TEST(spike_source, multiple) -{ +TEST(spike_source, multiple) { // This test assumes that seq will exhaust itself before t=10 ms. auto test_seq = [](auto&&... seqs) { std::vector<schedule> schedules{seqs...}; @@ -145,13 +138,7 @@ TEST(spike_source, multiple) EXPECT_LT(group.spikes().back().time, time_type(10)); }; - auto seqs = std::vector<schedule>{regular_schedule(0, 1, 5), - explicit_schedule({0.3, 2.3, 4.7})}; + std::vector seqs{regular_schedule(0*arb::units::ms, 1*arb::units::ms, 5*arb::units::ms), + explicit_schedule_from_milliseconds(std::vector{0.3, 2.3, 4.7})}; test_seq(seqs); - test_seq(std::vector<schedule>{regular_schedule(0, 1, 5), - explicit_schedule({0.3, 2.3, 4.7})}); - test_seq(regular_schedule(0, 1, 5), - explicit_schedule({0.3, 2.3, 4.7})); - auto reg_sched = regular_schedule(0, 1, 5); - test_seq(reg_sched, explicit_schedule({0.3, 2.3, 4.7})); } diff --git a/test/unit/test_spikes.cpp b/test/unit/test_spikes.cpp index c27b6d1990a9c68a49cd094b7d1247eac96206b2..031b9bce8910a892bf3fb5e348884ed4b803521e 100644 --- a/test/unit/test_spikes.cpp +++ b/test/unit/test_spikes.cpp @@ -203,8 +203,8 @@ TEST(SPIKES_TEST_CLASS, threshold_watcher) { } TEST(SPIKES_TEST_CLASS, threshold_watcher_interpolation) { - double dt = 0.025; - double duration = 1; + auto dt = 0.025*arb::units::ms; + auto duration = 1*arb::units::ms; arb::segment_tree tree; tree.append(arb::mnpos, { -6.3, 0.0, 0.0, 6.3}, { 6.3, 0.0, 0.0, 6.3}, 1); @@ -223,8 +223,8 @@ TEST(SPIKES_TEST_CLASS, threshold_watcher_interpolation) { for (unsigned i = 0; i < 8; i++) { arb::decor decor; decor.set_default(arb::cv_policy_every_segment()); - decor.place("mid"_lab, arb::threshold_detector{10}, "detector"); - decor.place("mid"_lab, arb::i_clamp::box(0.01+i*dt, duration, 0.5), "clamp"); + decor.place("mid"_lab, arb::threshold_detector{10*arb::units::mV}, "detector"); + decor.place("mid"_lab, arb::i_clamp::box(0.01*arb::units::ms + i*dt, duration, 0.5*arb::units::nA), "clamp"); decor.place("mid"_lab, arb::synapse("expsyn"), "synapse"); arb::cable_cell cell(morpho, decor, dict); @@ -243,7 +243,7 @@ TEST(SPIKES_TEST_CLASS, threshold_watcher_interpolation) { } for (unsigned i = 1; i < spikes.size(); ++i) { - EXPECT_NEAR(dt, spikes[i].time - spikes[i-1].time, 1e-4); + EXPECT_NEAR(dt.value(), spikes[i].time - spikes[i-1].time, 1e-4); } } diff --git a/test/unit/test_synapses.cpp b/test/unit/test_synapses.cpp index 2c00ce0382933a3ffa8174d4e0e1830ed7969da7..8e56151faa8800fc6e3ebe5d367d532c6dc7593b 100644 --- a/test/unit/test_synapses.cpp +++ b/test/unit/test_synapses.cpp @@ -1,7 +1,6 @@ #include <gtest/gtest.h> #include <cmath> -#include <tuple> #include <vector> #include <arbor/constants.hpp> @@ -10,7 +9,6 @@ #include <arbor/cable_cell.hpp> #include "backends/multicore/fvm.hpp" -#include "util/maputil.hpp" #include "util/range.hpp" #include "../common_cells.hpp" diff --git a/test/unit/test_v_clamp.cpp b/test/unit/test_v_clamp.cpp index 2142d45ce6109270ca20707d90e17a6455770036..cb5dd6d460e543c77ea5d84cda930bbaa5342427 100644 --- a/test/unit/test_v_clamp.cpp +++ b/test/unit/test_v_clamp.cpp @@ -41,7 +41,7 @@ struct v_proc_recipe: public arb::recipe { {arb::cable_probe_membrane_voltage{"(location 0 0.625)"_ls}, "Um-(0, 0.625)"}}; // dend center: 0.75/2 + 0.25 } std::vector<arb::event_generator> event_generators(arb::cell_gid_type) const override { - return {arb::regular_generator({"tgt"}, 5.0, 0.2, 0.05)}; + return {arb::regular_generator({"tgt"}, 5.0, 0.2*arb::units::ms, 0.05*arb::units::ms)}; } std::any get_global_properties(arb::cell_kind) const override { return gprop; } @@ -90,8 +90,8 @@ TEST(v_process, clamp) { } }; auto sim = arb::simulation(v_proc_recipe{true, false}); - sim.add_sampler(arb::all_probes, arb::regular_schedule(0.05), fun); - sim.run(1.0, 0.005); + sim.add_sampler(arb::all_probes, arb::regular_schedule(0.05*arb::units::ms), fun); + sim.run(1.0*arb::units::ms, 0.005*arb::units::ms); um_s_type exp_soma{{ 0, -65 }, { 0.05, -42 }, @@ -158,8 +158,8 @@ TEST(v_process, limit) { } }; auto sim = arb::simulation(v_proc_recipe{false, true}); - sim.add_sampler(arb::all_probes, arb::regular_schedule(0.05), fun); - sim.run(1.0, 0.005); + sim.add_sampler(arb::all_probes, arb::regular_schedule(0.05*arb::units::ms), fun); + sim.run(1.0*arb::units::ms, 0.005*arb::units::ms); um_s_type exp_soma{{ 0, -65 }, { 0.05, -60 }, @@ -228,8 +228,8 @@ TEST(v_process, clamp_fine) { auto rec = v_proc_recipe{true, false}; rec.gprop.default_parameters.discretization = arb::cv_policy_max_extent(0.5); auto sim = arb::simulation(rec); - sim.add_sampler(arb::all_probes, arb::regular_schedule(0.05), fun); - sim.run(1.0, 0.005); + sim.add_sampler(arb::all_probes, arb::regular_schedule(0.05*arb::units::ms), fun); + sim.run(1.0*arb::units::ms, 0.005*arb::units::ms); um_s_type exp_soma{{ 0, -65 }, { 0.05, -42 },