From 561a4c340ccceb3d1fb37aa58aaf4e96766e7fdd Mon Sep 17 00:00:00 2001 From: Nicolas Martin Date: Mon, 17 Oct 2022 10:44:36 +0200 Subject: [PATCH] [3.1.0] Import 4c19f90e13c --- .github/ISSUE_TEMPLATE/bug_report.md | 2 +- CMakeLists.txt | 3 +- README.md | 19 +- .../add_library_version_header.cmake | 4 +- cmake/custom_functions/python3.cmake | 2 +- .../custom_targets/README_metavision_open.md | 19 +- .../hal/facilities/future/i_decoder.h | 23 + .../hal/facilities/i_antiflicker_module.h | 2 +- .../metavision/hal/facilities/i_decoder.h | 18 + .../hal/facilities/i_device_control.h | 3 + .../hal/facilities/i_events_stream.h | 5 +- .../metavision/hal/facilities/i_trigger_in.h | 10 +- .../metavision/hal/utils/data_transfer.h | 57 +- .../hal/utils/decoder_protocol_violation.h | 49 + .../hal/utils/future/data_transfer.h | 52 +- .../hal/utils/future/file_data_transfer.h | 5 +- .../metavision/hal/utils/hal_error_code.h | 3 + .../include/sample_decoder.h | 2 + .../include/sample_device_control.h | 3 + .../src/future/sample_decoder.cpp | 7 +- .../test/hal_sample_plugin_gtest.cpp | 3 +- hal/cpp/src/facilities/future/i_decoder.cpp | 8 + hal/cpp/src/facilities/i_decoder.cpp | 8 + hal/cpp/src/facilities/i_events_stream.cpp | 4 +- hal/cpp/src/utils/data_transfer.cpp | 25 +- hal/cpp/src/utils/future/data_transfer.cpp | 24 +- .../metavision_cx3_updater/CMakeLists.txt | 8 +- .../metavision_cx3_updater.cpp | 113 +- .../boards/treuzell/tz_board_data_transfer.h | 8 +- .../boards/utils/psee_libusb_data_transfer.h | 8 +- .../include/decoders/evt2/evt2_decoder.h | 3 - .../decoders/evt2/future/evt2_decoder.h | 7 +- .../include/decoders/evt3/evt3_decoder.h | 152 +- .../include/decoders/evt3/evt3_validator.h | 311 ++ .../decoders/evt3/future/evt3_decoder.h | 183 +- .../devices/gen41/gen41_tz_trigger_event.h | 7 +- .../include/devices/imx636/imx636_evk2_issd.h | 12 +- .../include/devices/imx636/imx636_evk3_issd.h | 12 +- .../devices/imx636/imx636_tz_trigger_event.h | 44 + .../include/devices/treuzell/tz_device.h | 17 +- hal_psee_plugins/lib/CMakeLists.txt | 30 +- .../boards/fx3/fx3_libusb_board_command.cpp | 2 +- .../boards/rawfile/psee_file_discovery.cpp | 10 +- .../treuzell/tz_board_data_transfer.cpp | 81 +- .../boards/treuzell/tz_camera_discovery.cpp | 10 +- .../treuzell/tz_libusb_board_command.cpp | 14 + .../utils/psee_libusb_data_transfer.cpp | 94 +- .../src/devices/gen3/gen3_trigger_event.cpp | 6 +- .../gen31/gen31_ccam5_trigger_event.cpp | 6 +- .../devices/gen31/gen31_ccam5_tz_device.cpp | 1 + .../src/devices/gen31/gen31_ll_biases.cpp | 2 +- .../src/devices/gen31/gen31_trigger_event.cpp | 6 +- .../src/devices/gen41/gen41_tz_device.cpp | 1 + .../src/devices/imx636/CMakeLists.txt | 1 + .../src/devices/imx636/imx636_tz_device.cpp | 7 +- .../imx636/imx636_tz_trigger_event.cpp | 44 + .../src/devices/treuzell/CMakeLists.txt | 4 +- .../src/devices/treuzell/ti_tmp103.cpp | 1 + .../src/devices/treuzell/tz_device.cpp | 9 +- .../devices/treuzell/tz_psee_video_build.cpp | 1 + .../src/devices/treuzell/tz_streamer.cpp | 1 + .../src/facilities/psee_hw_register.cpp | 4 +- hal_psee_plugins/src/plugin/CMakeLists.txt | 46 +- .../src/plugin/psee_gen31_evk2.cpp | 3 - .../src/plugin/psee_gen31_evk3.cpp | 7 - .../src/plugin/psee_gen41_evk2.cpp | 3 - .../src/plugin/psee_gen41_evk3.cpp | 7 - .../src/plugin/psee_gen4_evk2.cpp | 3 - .../src/plugin/psee_imx636_evk2.cpp | 3 - .../src/plugin/psee_imx636_evk3.cpp | 7 - .../src/plugin/psee_imx636_evk4.cpp | 7 - .../src/plugin/psee_universal.cpp | 12 - sdk/cmake/MetavisionSDKConfig.cmake.in | 2 +- .../include/metavision/sdk/base/utils/log.h | 7 + .../metavision/sdk/base/utils/object_pool.h | 33 + .../sdk/base/utils/python_bindings_doc.h | 1 + .../base/cpp/tests/object_pool_gtest.cpp | 34 + .../sdk/core/algorithms/async_algorithm.h | 3 + .../base_frame_generation_algorithm.h | 86 +- .../base_frame_generation_algorithm_impl.h | 139 + ...ed_events_buffer_producer_algorithm_impl.h | 5 + .../algorithms/generic_producer_algorithm.h | 2 + .../on_demand_frame_generation_algorithm.h | 1 + .../periodic_frame_generation_algorithm.h | 2 + .../shared_events_buffer_producer_algorithm.h | 3 + .../time_surface_producer_algorithm.h | 1 + .../sdk/core/pipeline/algorithm_stage.h | 3 + .../metavision/sdk/core/pipeline/base_stage.h | 6 + .../metavision/sdk/core/pipeline/pipeline.h | 1 + .../sdk/core/utils/callback_manager.h | 24 +- .../sdk/core/utils/cd_frame_generator.h | 1 + .../metavision/sdk/core/utils/counter_map.h | 2 + .../utils/data_synchronizer_from_triggers.h | 2 + .../sdk/core/utils/frame_composer.h | 1 + .../core/utils/mostrecent_timestamp_buffer.h | 1 + .../sdk/core/utils/rate_estimator.h | 59 +- .../metavision_sdk_get_started.cpp | 12 +- .../metavision_sdk_get_started_v5.cpp | 139 + .../src/base_frame_generation_algorithm.cpp | 42 +- .../on_demand_frame_generation_algorithm.cpp | 13 +- .../periodic_frame_generation_algorithm.cpp | 67 +- sdk/modules/core/cpp/src/rate_estimator.cpp | 51 +- sdk/modules/core/cpp/tests/CMakeLists.txt | 2 +- .../core/cpp/tests/rate_estimator_gtest.cpp | 3644 +++++++++++++++++ .../event_io/box_npy_reader.py | 1 + .../event_io/event_bufferizer.py | 1 + .../event_io/events_iterator.py | 9 +- .../pypkg/metavision_core/event_io/h5_io.py | 1 + .../metavision_core/event_io/live_replay.py | 8 +- .../event_io/meta_event_producer.py | 8 +- .../metavision_core/event_io/npy_tools.py | 13 +- .../metavision_core/event_io/raw_info.py | 1 + .../metavision_core/event_io/raw_reader.py | 15 +- ...etavision_adaptive_rate_events_splitter.py | 2 +- .../extended_events_iterator.py | 2 +- .../metavision_simple_viewer.py | 12 +- .../python/tests/events_iterator_pytest.py | 6 +- .../video_to_event/simu_events_iterator.py | 14 +- .../demo_event_to_video.py | 7 +- .../train_event_to_video.py | 6 +- .../viz_data_event_to_video.py | 2 + .../viz_video_to_event_gpu_simulator.py | 2 + .../viz_video_to_event_simulator.py | 3 +- .../tests/simu_events_iterator_pytest.py | 63 + .../metavision_viewer/metavision_viewer.cpp | 114 +- .../include/metavision/sdk/driver/camera.h | 15 + .../cpp/include/metavision/sdk/driver/cd.h | 1 + .../metavision/sdk/driver/ext_trigger.h | 1 + .../include/metavision/sdk/driver/raw_data.h | 1 + sdk/modules/driver/cpp/src/camera.cpp | 6 + .../cpp/src/offline_streaming_control.cpp | 10 + .../metavision/sdk/ui/utils/base_window.h | 1 + .../metavision/sdk/ui/utils/mt_window.h | 2 + .../include/metavision/sdk/ui/utils/window.h | 1 + .../metavision_evt2_raw_file_encoder.cpp | 30 +- 135 files changed, 5860 insertions(+), 565 deletions(-) create mode 100644 hal/cpp/include/metavision/hal/utils/decoder_protocol_violation.h create mode 100644 hal_psee_plugins/include/decoders/evt3/evt3_validator.h create mode 100644 hal_psee_plugins/include/devices/imx636/imx636_tz_trigger_event.h create mode 100644 hal_psee_plugins/src/devices/imx636/imx636_tz_trigger_event.cpp create mode 100644 sdk/modules/core/cpp/include/metavision/sdk/core/algorithms/detail/base_frame_generation_algorithm_impl.h create mode 100644 sdk/modules/core/cpp/samples/metavision_sdk_get_started/metavision_sdk_get_started_v5.cpp diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 128dcb73d..92a58d10d 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -12,7 +12,7 @@ If you encounter an issue, please attempt the following steps : * make sure you are using the last version of OpenEB If the earlier steps didn't solve the problem, raise an issue providing: -* information about your system with [Metavision Platform Info Application](https://docs.prophesee.ai/stable/metavision_sdk/modules/metavision_hal/samples/platform_info.html) +* information about your system with [Metavision Platform Info Application](https://docs.prophesee.ai/stable/metavision_sdk/modules/hal/samples/platform_info.html) * your operating system and its version * your camera type and its serial number that can be found on your camera's base (bottom) plate * software that has an issue, expected and actual behavior, and reproduction steps as detailed as possible diff --git a/CMakeLists.txt b/CMakeLists.txt index 93f13586d..4b35c35fd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,7 +9,7 @@ cmake_minimum_required(VERSION 3.5) -project(metavision VERSION 3.0.2) +project(metavision VERSION 3.1.0) set(PROJECT_VERSION_SUFFIX "") if(PROJECT_VERSION_SUFFIX STREQUAL "") @@ -244,6 +244,7 @@ if (BUILD_TESTING) endif(CMAKE_CROSSCOMPILING) lfs_download(datasets/openeb/gen31_timer.raw) + lfs_download(datasets/openeb/gen31_timer_holes.raw) lfs_download(datasets/openeb/gen4_evt2_hand.raw) lfs_download(datasets/openeb/gen4_evt3_hand.raw) if(COMPILE_PYTHON3_BINDINGS) diff --git a/README.md b/README.md index 13df4158d..a48d0798c 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ OpenEB is composed of the Open modules of Metavision Intelligence: OpenEB also contains the source code of Prophesee camera plugins, enabling to stream data from our event-based cameras and to read recordings of event-based data. The supported cameras are: -* EVK1 - Gen3.1 VGA +* EVK1 - Gen3/Gen3.1 VGA * EVK2 - Gen4.1 HD * EVK3 - Gen 3.1 VGA / Gen4.1 HD * EVK4 - HD @@ -131,7 +131,8 @@ with the following command: `sudo cmake --build . --target install`. In that cas permanently, you should add the previous command in your ~/.bashrc) *Note* that since OpenEB 3.0.0, Prophesee camera plugins are included in the OpenEB repository, so you don't need to perform -any extra step to install them. +any extra step to install them. If you are using a third-party camera, you need to install the plugin provided +by the camera vendor and specify the location of the plugin using the `MV_HAL_PLUGIN_PATH` environment variable. To get started with OpenEB, you can download some [sample recordings](https://docs.prophesee.ai/stable/datasets.html) and visualize them with [metavision_viewer](https://docs.prophesee.ai/stable/metavision_sdk/modules/driver/guides/viewer.html#chapter-sdk-driver-samples-viewer) @@ -187,6 +188,17 @@ To compile OpenEB, you will need to install some extra tools: you can run `setx VCPKG_DEFAULT_TRIPLET x64-windows` (you need to close the command line and re-open it to ensure that this variable is set) * Finally, download and install [ffmpeg](https://www.gyan.dev/ffmpeg/builds/ffmpeg-release-full.7z) and add the `bin` directory to your PATH. +Note that if you are using vcpkg for various projects or multiple versions of OpenEB, you might want to optimize the +number of vcpkg install you manage. To do so, you will need the versions of the libraries we require. +Those can be found in the [vcpkg repository](https://github.com/microsoft/vcpkg/tree/2022.03.10/versions) but we list them here for convenience: + * libusb: 1.0.24 + * eigen3: 3.4.0 + * boost: 1.78.0 + * opencv: 4.5.5 + * glfw3: 3.3.6 + * glew: 2.2.0 + * gtest: 1.11.0 + * dirent: 1.23.2 #### Install pybind @@ -299,7 +311,8 @@ and visualize them with [metavision_viewer](https://docs.prophesee.ai/stable/met or you can stream data from your Prophesee-compatible event-based camera. *Note* that since OpenEB 3.0.0, Prophesee camera plugins are included in the OpenEB repository, so you don't need to perform -any extra step to install them. +any extra step to install them. If you are using a third-party camera, you need to install the plugin provided +by the camera vendor and specify the location of the plugin using the `MV_HAL_PLUGIN_PATH` environment variable. ### Running the test suite (Optional) diff --git a/cmake/custom_functions/add_library_version_header.cmake b/cmake/custom_functions/add_library_version_header.cmake index 40da39462..64354b140 100644 --- a/cmake/custom_functions/add_library_version_header.cmake +++ b/cmake/custom_functions/add_library_version_header.cmake @@ -8,8 +8,8 @@ # See the License for the specific language governing permissions and limitations under the License. set(GIT_BRANCH "main") -set(GIT_COMMIT_ID "f3107c5b0cfacb2ab97aa78ebefcdc3b4992c7c0") -set(GIT_COMMIT_DATE "2022-06-29 13:53:08 +0200") +set(GIT_COMMIT_ID "4c19f90e13c20548513c88b89c4e58bc8de8a1bf") +set(GIT_COMMIT_DATE "2022-10-13 16:56:39 +0200") # If git information are not provided in command line when running cmake, try to automatically determine them if(NOT GIT_BRANCH OR NOT GIT_COMMIT_ID OR NOT GIT_COMMIT_DATE) diff --git a/cmake/custom_functions/python3.cmake b/cmake/custom_functions/python3.cmake index 72eef54a7..d739846bc 100644 --- a/cmake/custom_functions/python3.cmake +++ b/cmake/custom_functions/python3.cmake @@ -61,7 +61,7 @@ if (COMPILE_PYTHON3_BINDINGS) endforeach() else() find_package(Python3 COMPONENTS Interpreter Development REQUIRED) - string(SUBSTRING "${Python3_VERSION}" 0 3 _short_python3_version) + string(CONCAT _short_python3_version "${Python3_VERSION_MAJOR}" "." "${Python3_VERSION_MINOR}") set(PYBIND11_PYTHON_VERSIONS "${_short_python3_version}") set(PYTHON_${_short_python3_version}_EXECUTABLE ${Python3_EXECUTABLE} CACHE PATH "") _add_global_alias_library(Python3::Python Python3::Python_${_short_python3_version}) diff --git a/cmake/custom_targets/README_metavision_open.md b/cmake/custom_targets/README_metavision_open.md index 13df4158d..a48d0798c 100644 --- a/cmake/custom_targets/README_metavision_open.md +++ b/cmake/custom_targets/README_metavision_open.md @@ -17,7 +17,7 @@ OpenEB is composed of the Open modules of Metavision Intelligence: OpenEB also contains the source code of Prophesee camera plugins, enabling to stream data from our event-based cameras and to read recordings of event-based data. The supported cameras are: -* EVK1 - Gen3.1 VGA +* EVK1 - Gen3/Gen3.1 VGA * EVK2 - Gen4.1 HD * EVK3 - Gen 3.1 VGA / Gen4.1 HD * EVK4 - HD @@ -131,7 +131,8 @@ with the following command: `sudo cmake --build . --target install`. In that cas permanently, you should add the previous command in your ~/.bashrc) *Note* that since OpenEB 3.0.0, Prophesee camera plugins are included in the OpenEB repository, so you don't need to perform -any extra step to install them. +any extra step to install them. If you are using a third-party camera, you need to install the plugin provided +by the camera vendor and specify the location of the plugin using the `MV_HAL_PLUGIN_PATH` environment variable. To get started with OpenEB, you can download some [sample recordings](https://docs.prophesee.ai/stable/datasets.html) and visualize them with [metavision_viewer](https://docs.prophesee.ai/stable/metavision_sdk/modules/driver/guides/viewer.html#chapter-sdk-driver-samples-viewer) @@ -187,6 +188,17 @@ To compile OpenEB, you will need to install some extra tools: you can run `setx VCPKG_DEFAULT_TRIPLET x64-windows` (you need to close the command line and re-open it to ensure that this variable is set) * Finally, download and install [ffmpeg](https://www.gyan.dev/ffmpeg/builds/ffmpeg-release-full.7z) and add the `bin` directory to your PATH. +Note that if you are using vcpkg for various projects or multiple versions of OpenEB, you might want to optimize the +number of vcpkg install you manage. To do so, you will need the versions of the libraries we require. +Those can be found in the [vcpkg repository](https://github.com/microsoft/vcpkg/tree/2022.03.10/versions) but we list them here for convenience: + * libusb: 1.0.24 + * eigen3: 3.4.0 + * boost: 1.78.0 + * opencv: 4.5.5 + * glfw3: 3.3.6 + * glew: 2.2.0 + * gtest: 1.11.0 + * dirent: 1.23.2 #### Install pybind @@ -299,7 +311,8 @@ and visualize them with [metavision_viewer](https://docs.prophesee.ai/stable/met or you can stream data from your Prophesee-compatible event-based camera. *Note* that since OpenEB 3.0.0, Prophesee camera plugins are included in the OpenEB repository, so you don't need to perform -any extra step to install them. +any extra step to install them. If you are using a third-party camera, you need to install the plugin provided +by the camera vendor and specify the location of the plugin using the `MV_HAL_PLUGIN_PATH` environment variable. ### Running the test suite (Optional) diff --git a/hal/cpp/include/metavision/hal/facilities/future/i_decoder.h b/hal/cpp/include/metavision/hal/facilities/future/i_decoder.h index ea01cc721..3e345c35a 100644 --- a/hal/cpp/include/metavision/hal/facilities/future/i_decoder.h +++ b/hal/cpp/include/metavision/hal/facilities/future/i_decoder.h @@ -21,6 +21,7 @@ #include "metavision/sdk/base/utils/timestamp.h" #include "metavision/hal/facilities/i_event_decoder.h" #include "metavision/hal/facilities/i_registrable_facility.h" +#include "metavision/hal/utils/decoder_protocol_violation.h" #include "metavision/sdk/base/events/event_cd.h" #include "metavision/sdk/base/events/event_ext_trigger.h" @@ -70,6 +71,22 @@ class I_Decoder : public I_RegistrableFacility { /// @note This method is not thread safe. You should add/remove the various callback before starting the streaming bool remove_time_callback(size_t callback_id); + /// @brief Alias for callback on protocol violation + using ProtocolViolationCallback_t = std::function; + + /// @brief Adds a function to be called when decoder protocol is breached + /// @param cb Callback to add + /// @return ID of the added callback + /// @note This method is not thread safe. You should add/remove the various callback before starting the streaming + /// @note It's not allowed to add/remove a callback from the callback itself + virtual size_t add_protocol_violation_callback(const ProtocolViolationCallback_t &cb); + + /// @brief Removes a previously registered protocol violation callback + /// @param callback_id Callback ID + /// @return true if the callback has been unregistered correctly, false otherwise. + /// @note This method is not thread safe. You should add/remove the various callback before starting the streaming + virtual bool remove_protocol_violation_callback(size_t callback_id); + /// @brief Gets the timestamp of the last event /// @return Timestamp of the last event virtual timestamp get_last_timestamp() const = 0; @@ -90,6 +107,9 @@ class I_Decoder : public I_RegistrableFacility { /// @brief Resets the decoder last timestamp /// @param timestamp Timestamp to reset the decoder to + /// If >= 0, reset the decoder last timestamp to the actual value @p timestamp + /// If < 0, reset the decoder internal state so that the last timestamp will be found from the + /// next buffer of events to decoder (the timestamp shift and overflow loop counter is not reset) /// @return True if the reset operation could complete, false otherwise. /// @note It is expected after this call has succeeded, that @ref get_last_timestamp returns @p timestamp /// @warning If time shifting is enabled, the @p timestamp must be in the shifted time reference @@ -166,6 +186,9 @@ class I_Decoder : public I_RegistrableFacility { /// @brief Implementation of "reset the decoder last timestamp" operation /// @param timestamp Timestamp to reset the decoder to + /// If >= 0, reset the decoder last timestamp to the actual value @p timestamp + /// If < 0, reset the decoder internal state so that the last timestamp will be found from the + /// next buffer of events to decoder (the timestamp shift and overflow loop counter is not reset) /// @return True if the reset operation could complete, false otherwise. /// @note It is expected after this call has succeeded, that @ref get_last_timestamp returns @p timestamp /// @warning If time shifting is enabled, the @p timestamp must be in the shifted time reference diff --git a/hal/cpp/include/metavision/hal/facilities/i_antiflicker_module.h b/hal/cpp/include/metavision/hal/facilities/i_antiflicker_module.h index 19d7b014b..dd8be2c46 100644 --- a/hal/cpp/include/metavision/hal/facilities/i_antiflicker_module.h +++ b/hal/cpp/include/metavision/hal/facilities/i_antiflicker_module.h @@ -19,7 +19,7 @@ namespace Metavision { /// @brief Anti-flicker module -/// @note This feature is available only on Gen4.1 sensors +/// @note This feature is available only on Gen4.1 sensors and newer class I_AntiFlickerModule : public I_RegistrableFacility { public: /// @brief Enables the anti-flicker filter diff --git a/hal/cpp/include/metavision/hal/facilities/i_decoder.h b/hal/cpp/include/metavision/hal/facilities/i_decoder.h index a298d2ddf..c43fa59b9 100644 --- a/hal/cpp/include/metavision/hal/facilities/i_decoder.h +++ b/hal/cpp/include/metavision/hal/facilities/i_decoder.h @@ -20,6 +20,7 @@ #include "metavision/sdk/base/utils/timestamp.h" #include "metavision/hal/facilities/i_event_decoder.h" #include "metavision/hal/facilities/i_registrable_facility.h" +#include "metavision/hal/utils/decoder_protocol_violation.h" #include "metavision/sdk/base/events/event_cd.h" #include "metavision/sdk/base/events/event_ext_trigger.h" @@ -68,6 +69,22 @@ class I_Decoder : public I_RegistrableFacility { /// @note This method is not thread safe. You should add/remove the various callback before starting the streaming bool remove_time_callback(size_t callback_id); + /// @brief Alias for callback on protocol violation + using ProtocolViolationCallback_t = std::function; + + /// @brief Adds a function to be called when decoder protocol is breached + /// @param cb Callback to add + /// @return ID of the added callback + /// @note This method is not thread safe. You should add/remove the various callback before starting the streaming + /// @note It's not allowed to add/remove a callback from the callback itself + virtual size_t add_protocol_violation_callback(const ProtocolViolationCallback_t &cb); + + /// @brief Removes a previously registered protocol violation callback + /// @param callback_id Callback ID + /// @return true if the callback has been unregistered correctly, false otherwise. + /// @note This method is not thread safe. You should add/remove the various callback before starting the streaming + virtual bool remove_protocol_violation_callback(size_t callback_id); + /// @brief Gets the timestamp of the last event /// @return Timestamp of the last event virtual timestamp get_last_timestamp() const = 0; @@ -77,6 +94,7 @@ class I_Decoder : public I_RegistrableFacility { /// If the timestamp shift (timestamp of the first event in the stream) is already known, /// the function returns true and the parameter @p timestamp_shift will be set to its value. /// Otherwise, the function returns false and does nothing. + /// /// @return true if the timestamp shift is already known, false otherwise virtual bool get_timestamp_shift(Metavision::timestamp ×tamp_shift) const = 0; diff --git a/hal/cpp/include/metavision/hal/facilities/i_device_control.h b/hal/cpp/include/metavision/hal/facilities/i_device_control.h index 09fa3661e..424ef8005 100644 --- a/hal/cpp/include/metavision/hal/facilities/i_device_control.h +++ b/hal/cpp/include/metavision/hal/facilities/i_device_control.h @@ -38,6 +38,7 @@ class I_DeviceControl : public I_RegistrableFacility { /// @brief Sets the camera in standalone mode. /// /// The camera does not interact with other devices. + /// /// @warning This function must be called before starting the camera /// @return true on success virtual bool set_mode_standalone() = 0; @@ -45,6 +46,7 @@ class I_DeviceControl : public I_RegistrableFacility { /// @brief Sets the camera as master /// /// The camera sends clock signal to another device + /// /// @warning This function must be called before starting the camera /// @return true on success virtual bool set_mode_master() = 0; @@ -52,6 +54,7 @@ class I_DeviceControl : public I_RegistrableFacility { /// @brief Sets the camera as slave /// /// The camera receives the clock from another device + /// /// @warning This function must be called before starting the camera /// @return true on success virtual bool set_mode_slave() = 0; diff --git a/hal/cpp/include/metavision/hal/facilities/i_events_stream.h b/hal/cpp/include/metavision/hal/facilities/i_events_stream.h index 58a0e112f..8e604800a 100644 --- a/hal/cpp/include/metavision/hal/facilities/i_events_stream.h +++ b/hal/cpp/include/metavision/hal/facilities/i_events_stream.h @@ -18,6 +18,7 @@ #include #include #include +#include #include "metavision/hal/facilities/i_registrable_facility.h" #include "metavision/hal/utils/data_transfer.h" @@ -63,6 +64,7 @@ class I_EventsStream : public I_RegistrableFacility { /// @brief Gets latest raw data from the event buffer /// /// Gets raw data from the event buffer received since the last time this function was called. + /// /// @param n_rawbytes Address of a variable in which to put the number of bytes contained in the buffer /// @return Pointer to an array of Event structures /// @note This function must be called to write the buffer of events in the log file defined in @ref log_raw_data @@ -73,6 +75,7 @@ class I_EventsStream : public I_RegistrableFacility { /// This methods first writes the header retrieved through @ref I_HW_Identification. /// Buffers of data are then written each time @ref get_latest_raw_data is called (i.e. in the same thread it is /// called). + /// /// @param f The file to log into /// @return true if the file could be opened for writing, false otherwise or if the file name @a f is the same as /// the one read from @@ -109,7 +112,7 @@ class I_EventsStream : public I_RegistrableFacility { // buffer pool full when resuming streaming const bool stop_should_release_buffers_; DataTransfer::BufferPool tmp_buffer_pool_; - std::vector + std::unordered_set data_transfer_buffer_ptrs_; // for quick check if copying is necessary std::mutex start_stop_safety_; diff --git a/hal/cpp/include/metavision/hal/facilities/i_trigger_in.h b/hal/cpp/include/metavision/hal/facilities/i_trigger_in.h index ad57aac4a..0dcfc6c19 100644 --- a/hal/cpp/include/metavision/hal/facilities/i_trigger_in.h +++ b/hal/cpp/include/metavision/hal/facilities/i_trigger_in.h @@ -22,20 +22,20 @@ namespace Metavision { class I_TriggerIn : public I_RegistrableFacility { public: /// @brief Enables external trigger monitoring - /// @param channel External trigger's address (0 for Gen3/Gen3.1 sensors, 1 for Gen4/Gen4.1 sensors) + /// @param channel External trigger's address (depends on the camera and sensor; see camera's documentation) /// @return true if trigger was successfully enabled, false otherwise /// @warning Trigger monitoring is disabled by default on camera start. /// So you need to call ``enable()`` to start detecting signal. virtual bool enable(uint32_t channel) = 0; /// @brief Disables external trigger monitoring - /// @param channel External trigger's address (0 for Gen3/Gen3.1 sensors, 1 for Gen4/Gen4.1 sensors) + /// @param channel External trigger's address (depends on the camera and sensor; see camera's documentation) /// @return true if trigger was successfully disabled, false otherwise virtual bool disable(uint32_t channel) = 0; - /// @brief Checks if the trigger in index is enabled - /// @return true if the trigger in index is enabled, False otherwise - virtual bool is_enabled(uint32_t index) = 0; + /// @brief Checks if the trigger in channel is enabled + /// @return true if the trigger in channel is enabled, False otherwise + virtual bool is_enabled(uint32_t channel) = 0; }; } // namespace Metavision diff --git a/hal/cpp/include/metavision/hal/utils/data_transfer.h b/hal/cpp/include/metavision/hal/utils/data_transfer.h index 5d9ca75bb..3ebdb5b9c 100644 --- a/hal/cpp/include/metavision/hal/utils/data_transfer.h +++ b/hal/cpp/include/metavision/hal/utils/data_transfer.h @@ -26,6 +26,7 @@ namespace Metavision { /// /// This object behaves as master: the client of this class is notified when new buffers are transferred or the data /// transfer is stopped. +/// /// @warning This class is not thread safe and is used in conjunction with the @ref I_EventsStream or at the user's /// risk class DataTransfer { @@ -56,7 +57,9 @@ class DataTransfer { /// @brief Builds a DataTransfer object /// @param raw_event_size_bytes The size of a RAW event in bytes /// @param buffer_pool A user defined buffer pool to use instead of the default one (unbounded, @ref ObjectPool) - DataTransfer(uint32_t raw_event_size_bytes, const BufferPool &buffer_pool); + /// @param allow_buffer_drop When transferring data buffers using an empty bounded buffer pool, buffers are dropped + /// (@ref transfer_data) + DataTransfer(uint32_t raw_event_size_bytes, const BufferPool &buffer_pool, bool allow_buffer_drop = false); /// @brief Destructor /// @@ -81,7 +84,7 @@ class DataTransfer { /// @warning This method is not thread safe. You should add/remove the various callback before starting the /// transfers /// @warning It's not allowed to add/remove a callback from the callback itself - /// @param cb The cb to call when a new buffer is transfered + /// @param cb The cb to call when a new buffer is transferred /// @return The id of the callback. This id is unique. size_t add_new_buffer_callback(NewBufferCallback_t cb); @@ -90,6 +93,16 @@ class DataTransfer { /// @note This method is not thread safe. You should add/remove the various callback before starting the transfers void remove_callback(size_t cb_id); + /// @brief Returns whether a buffer can be used from the pool. + /// @note Always return true for a unbounded pool, as it could allocate a new object on the spot if the pool is + /// empty + bool has_available_buffer() const { + if (buffer_pool_.is_bounded()) { + return buffer_pool_.size() > 0; + } + return true; + } + protected: /// @brief Returns the size of a RAW event in bytes /// @@ -102,20 +115,46 @@ class DataTransfer { /// @warning The buffer size may not be a multiple of a RAW event byte size if the last event is split, in which /// case, the next buffer must contain the remaining bytes of the split event. /// @warning The implementation must resize the buffer to the actual size of the transferred data + /// @note When bounded pool is used and no buffer is available from the pool, the current buffer is dropped to be + /// reused. /// @param buffer The buffer filled with RAW data to transfer. - /// @return A buffer taken from the buffer pool - BufferPtr transfer_data(const BufferPtr &buffer); + /// @param args Optional arguments to be used when allocating a buffer + /// @return A std::pair with first the next buffer from the pool and second a boolean defining if the input + /// buffer as been dropped + template + DataTransfer::BufferPtr transfer_data(BufferPtr &buffer, Args &&...args) { + if (allow_buffer_drop_ && !has_available_buffer()) { + // No storage left and we don't want to wait on a buffer to be freed. + // We drop the buffer, back to the pool ! + buffer.reset(); + } else { + fire_callbacks(buffer); + } + + return get_buffer(std::forward(args)...); + } /// @brief Requests a new buffer from the pool + /// @param args Optional arguments to be used when allocating a buffer /// @return A buffer taken from the object pool - BufferPtr get_buffer(); + template + DataTransfer::BufferPtr get_buffer(Args &&...args) { + return buffer_pool_.acquire(std::forward(args)...); + } - /// @brief Returns if the transfer must stop as request by the base class implementation + /// @brief Returns whether the transfer must stop as requested by the base class implementation /// /// This method can be called safely by the child implementation to know whether the implementation of the run /// should return bool should_stop(); +protected: + /// @brief Returns a reference on the underlying buffer pool + /// @return the underlying buffer pool + BufferPool &get_buffer_pool() { + return buffer_pool_; + } + private: /// @brief Start transfer implementation. /// @@ -133,6 +172,7 @@ class DataTransfer { /// /// This method must hold the data polling and transfer logic from a source. /// It is run in a thread within the base class. + /// /// @warning The implementation must ensure that whenever should_stop returns true, this method returns and cleans /// up resources virtual void run_impl() = 0; @@ -145,6 +185,10 @@ class DataTransfer { /// to do so in the scope of the run_impl method to avoid concurrent calls virtual void stop_impl(); + /// @brief Trigger all registered callbacks + /// @param buffer The data to be carried forward + void fire_callbacks(const BufferPtr buffer) const; + std::thread run_transfers_thread_; BufferPool buffer_pool_; std::unordered_map status_change_cbs_; @@ -152,6 +196,7 @@ class DataTransfer { const uint32_t raw_event_size_bytes_; std::atomic stop_{false}; uint32_t cb_index_{0}; + const bool allow_buffer_drop_{false}; }; } // namespace Metavision diff --git a/hal/cpp/include/metavision/hal/utils/decoder_protocol_violation.h b/hal/cpp/include/metavision/hal/utils/decoder_protocol_violation.h new file mode 100644 index 000000000..92c06efc0 --- /dev/null +++ b/hal/cpp/include/metavision/hal/utils/decoder_protocol_violation.h @@ -0,0 +1,49 @@ +/********************************************************************************************************************** + * Copyright (c) Prophesee S.A. * + * * + * Licensed under the Apache License, Version 2.0 (the "License"); * + * you may not use this file except in compliance with the License. * + * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed * + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * + * See the License for the specific language governing permissions and limitations under the License. * + **********************************************************************************************************************/ + +#ifndef METAVISION_HAL_DECODER_PROTOCOL_VIOLATION_H +#define METAVISION_HAL_DECODER_PROTOCOL_VIOLATION_H + +#include + +#include "metavision/hal/utils/hal_error_code.h" + +namespace Metavision { + +enum DecoderProtocolViolation : HalErrorCodeType { + NullProtocolViolation = 0, + NonMonotonicTimeHigh, + PartialVect_12_12_8, + PartialContinued_12_12_4, + NonContinuousTimeHigh, + MissingYAddr, + InvalidVectBase, +}; + +inline std::ostream &operator<<(std::ostream &o, const DecoderProtocolViolation protocol_violation) { + static const std::unordered_map protocol_violation_to_str = { + {DecoderProtocolViolation::NullProtocolViolation, "NullProtocolViolation"}, + {DecoderProtocolViolation::NonMonotonicTimeHigh, "NonMonotonicTimeHigh"}, + {DecoderProtocolViolation::PartialVect_12_12_8, "PartialVect_12_12_8"}, + {DecoderProtocolViolation::PartialContinued_12_12_4, "PartialContinued_12_12_4"}, + {DecoderProtocolViolation::NonContinuousTimeHigh, "NonContinuousTimeHigh"}, + {DecoderProtocolViolation::MissingYAddr, "MissingYAddr"}, + {DecoderProtocolViolation::InvalidVectBase, "InvalidVectBase"}, + + }; + + o << protocol_violation_to_str.at(protocol_violation); + return o; +} + +} // namespace Metavision + +#endif // METAVISION_HAL_DECODER_PROTOCOL_VIOLATION_H diff --git a/hal/cpp/include/metavision/hal/utils/future/data_transfer.h b/hal/cpp/include/metavision/hal/utils/future/data_transfer.h index 3789920f5..400dba306 100644 --- a/hal/cpp/include/metavision/hal/utils/future/data_transfer.h +++ b/hal/cpp/include/metavision/hal/utils/future/data_transfer.h @@ -27,6 +27,7 @@ namespace Future { /// /// This object behaves as master: the client of this class is notified when new buffers are transferred or the data /// transfer is stopped. +/// /// @warning This class is not thread safe and is used in conjunction with the @ref I_EventsStream or at the user's /// risk class DataTransfer { @@ -57,7 +58,9 @@ class DataTransfer { /// @brief Builds a DataTransfer object /// @param raw_event_size_bytes The size of a RAW event in bytes /// @param buffer_pool A user defined buffer pool to use instead of the default one (unbounded, @ref ObjectPool) - DataTransfer(uint32_t raw_event_size_bytes, const BufferPool &buffer_pool); + /// @param allow_buffer_drop When transferring data buffers using an empty bounded buffer pool, buffers are dropped + /// (@ref transfer_data) + DataTransfer(uint32_t raw_event_size_bytes, const BufferPool &buffer_pool, bool allow_buffer_drop = false); /// @brief Destructor /// @@ -103,6 +106,16 @@ class DataTransfer { /// @note This method is not thread safe. You should add/remove the various callback before starting the transfers void remove_callback(size_t cb_id); + /// @brief Returns whether a buffer can be used from the pool. + /// @note Always return true for a unbounded pool, as it could allocate a new object on the spot if the pool is + /// empty + bool has_available_buffer() const { + if (buffer_pool_.is_bounded()) { + return buffer_pool_.size() > 0; + } + return true; + } + protected: /// @brief Returns the size of a RAW event in bytes /// @@ -115,20 +128,45 @@ class DataTransfer { /// @warning The buffer size may not be a multiple of a RAW event byte size if the last event is split, in which /// case, the next buffer must contain the remaining bytes of the split event. /// @warning The implementation must resize the buffer to the actual size of the transferred data + /// @note When bounded pool is used and no buffer is available from the pool, the current buffer is dropped to be + /// reused. /// @param buffer The buffer filled with RAW data to transfer. + /// @param args Optional arguments to be used when allocating a buffer /// @return A buffer taken from the buffer pool - BufferPtr transfer_data(const BufferPtr &buffer); + template + DataTransfer::BufferPtr transfer_data(BufferPtr &buffer, Args &&...args) { + if (allow_buffer_drop_ && !has_available_buffer()) { + // No storage left and we don't want to wait on a buffer to be freed. + // We drop the buffer, back to the pool ! + buffer.reset(); + } else { + fire_callbacks(buffer); + } + + return get_buffer(std::forward(args)...); + } /// @brief Requests a new buffer from the pool + /// @param args Optional arguments to be used when allocating a buffer /// @return A buffer taken from the object pool - BufferPtr get_buffer(); + template + DataTransfer::BufferPtr get_buffer(Args &&...args) { + return buffer_pool_.acquire(std::forward(args)...); + } - /// @brief Returns if the transfer must stop as request by the base class implementation + /// @brief Returns whether the transfer must stop as requested by the base class implementation /// /// This method can be called safely by the child implementation to know whether the implementation of the run /// should return bool should_stop(); +protected: + /// @brief Returns a reference on the underlying buffer pool + /// @return the underlying buffer pool + BufferPool &get_buffer_pool() { + return buffer_pool_; + } + private: /// @brief Start transfer implementation. /// @@ -146,6 +184,7 @@ class DataTransfer { /// /// This method must hold the data polling and transfer logic from a source. /// It is run in a thread within the base class. + /// /// @warning The implementation must ensure that whenever should_stop returns true, this method returns and cleans /// up resources virtual void run_impl() = 0; @@ -158,6 +197,10 @@ class DataTransfer { /// to do so in the scope of the run_impl method to avoid concurrent calls virtual void stop_impl(); + /// @brief Trigger all registered callbacks + /// @param buffer The data to be carried forward + void fire_callbacks(const BufferPtr buffer) const; + std::thread run_transfers_thread_; BufferPool buffer_pool_; std::unordered_map status_change_cbs_; @@ -165,6 +208,7 @@ class DataTransfer { const uint32_t raw_event_size_bytes_; std::atomic stop_{false}; uint32_t cb_index_{0}; + const bool allow_buffer_drop_{false}; std::mutex suspend_mutex_, running_mutex_; std::condition_variable suspend_cond_, running_cond_; diff --git a/hal/cpp/include/metavision/hal/utils/future/file_data_transfer.h b/hal/cpp/include/metavision/hal/utils/future/file_data_transfer.h index c9f17ab84..ad65965aa 100644 --- a/hal/cpp/include/metavision/hal/utils/future/file_data_transfer.h +++ b/hal/cpp/include/metavision/hal/utils/future/file_data_transfer.h @@ -31,7 +31,8 @@ class FileDataTransfer : public DataTransfer { /// @param stream The stream to read from /// @param raw_event_size_bytes The size of a RAW event in bytes /// @param config The configuration to use to read the stream - FileDataTransfer(std::unique_ptr stream, uint32_t raw_event_size_bytes, const RawFileConfig &config); + FileDataTransfer(std::unique_ptr stream, uint32_t raw_event_size_bytes, + const Metavision::RawFileConfig &config); /// @brief Reads the input standard @a stream batch by batch according to the input configuration /// @param stream The stream to read from @@ -39,7 +40,7 @@ class FileDataTransfer : public DataTransfer { /// @param config The configuration to use to read the stream /// @note This constructor is provided as a temporary workaround for shared stream, it will be removed in future /// releases - FileDataTransfer(std::istream *stream, uint32_t raw_event_size_bytes, const RawFileConfig &config); + FileDataTransfer(std::istream *stream, uint32_t raw_event_size_bytes, const Metavision::RawFileConfig &config); /// @brief Stops ongoing transfers ~FileDataTransfer(); diff --git a/hal/cpp/include/metavision/hal/utils/hal_error_code.h b/hal/cpp/include/metavision/hal/utils/hal_error_code.h index 624fdea03..f40252d26 100644 --- a/hal/cpp/include/metavision/hal/utils/hal_error_code.h +++ b/hal/cpp/include/metavision/hal/utils/hal_error_code.h @@ -39,6 +39,9 @@ enum Enum : HalErrorCodeType { /// Errors related to calling deprecated function that have no equivalent in current API DeprecatedFunctionCalled = CameraError | 0x03000, + + /// Operation is not implemented + OperationNotImplemented = CameraError | 0x04000, }; } diff --git a/hal/cpp/samples/metavision_hal_sample_plugin/include/sample_decoder.h b/hal/cpp/samples/metavision_hal_sample_plugin/include/sample_decoder.h index 8090a2147..87951a990 100644 --- a/hal/cpp/samples/metavision_hal_sample_plugin/include/sample_decoder.h +++ b/hal/cpp/samples/metavision_hal_sample_plugin/include/sample_decoder.h @@ -40,6 +40,7 @@ class SampleDecoder : public Metavision::I_Decoder { /// If the timestamp shift (timestamp of the first timer high event in the stream) is already known, /// the function returns true and the parameter @p timestamp_shift will be set to its value. /// Otherwise, the function returns false and does nothing. + /// /// @return true if the timestamp shift is already known, false otherwise bool get_timestamp_shift(Metavision::timestamp ×tamp_shift) const override final; @@ -51,6 +52,7 @@ class SampleDecoder : public Metavision::I_Decoder { /// /// Identifies the events in the buffer and dispatches it to the instance of @ref Metavision::I_EventDecoder /// corresponding to each event type. + /// /// @warning It is mandatory to pass strictly consecutive buffers from the same source to this method /// /// @param ev Pointer on first event diff --git a/hal/cpp/samples/metavision_hal_sample_plugin/include/sample_device_control.h b/hal/cpp/samples/metavision_hal_sample_plugin/include/sample_device_control.h index 197fa5d61..98591c69d 100644 --- a/hal/cpp/samples/metavision_hal_sample_plugin/include/sample_device_control.h +++ b/hal/cpp/samples/metavision_hal_sample_plugin/include/sample_device_control.h @@ -33,18 +33,21 @@ class SampleDeviceControl : public Metavision::I_DeviceControl { /// @brief Sets the camera in standalone mode. /// /// The camera does not interact with other devices. + /// /// @return true on success bool set_mode_standalone() override final; /// @brief Sets the camera as master /// /// The camera sends clock signal to another device + /// /// @return true on success bool set_mode_master() override final; /// @brief Sets the camera as slave /// /// The camera receives the clock from another device + /// /// @return true on success bool set_mode_slave() override final; diff --git a/hal/cpp/samples/metavision_hal_sample_plugin/src/future/sample_decoder.cpp b/hal/cpp/samples/metavision_hal_sample_plugin/src/future/sample_decoder.cpp index 944f34711..9a707075f 100644 --- a/hal/cpp/samples/metavision_hal_sample_plugin/src/future/sample_decoder.cpp +++ b/hal/cpp/samples/metavision_hal_sample_plugin/src/future/sample_decoder.cpp @@ -66,11 +66,8 @@ bool SampleDecoder::reset_timestamp_impl(const Metavision::timestamp &t) { if (is_time_shifting_enabled() && !time_shift_set_) { return false; } - if (t >= 0) { - last_timestamp_ = t; - return true; - } - return false; + last_timestamp_ = t; + return true; } bool SampleDecoder::reset_timestamp_shift_impl(const Metavision::timestamp &shift) { diff --git a/hal/cpp/samples/metavision_hal_sample_plugin/test/hal_sample_plugin_gtest.cpp b/hal/cpp/samples/metavision_hal_sample_plugin/test/hal_sample_plugin_gtest.cpp index 01b2f79ea..18527f246 100644 --- a/hal/cpp/samples/metavision_hal_sample_plugin/test/hal_sample_plugin_gtest.cpp +++ b/hal/cpp/samples/metavision_hal_sample_plugin/test/hal_sample_plugin_gtest.cpp @@ -13,6 +13,7 @@ #include #include "metavision/utils/gtest/gtest_with_tmp_dir.h" +#include "metavision/utils/gtest/gtest_custom.h" #include "metavision/hal/device/device.h" #include "metavision/hal/device/device_discovery.h" #include "metavision/hal/facilities/i_hw_identification.h" @@ -76,7 +77,7 @@ class HalSamplePlugin_GTest : public GTestWithTmpDir { } }; -TEST_F(HalSamplePlugin_GTest, list_sources_and_open_it) { +TEST_F_WITHOUT_CAMERA(HalSamplePlugin_GTest, list_sources_and_open_it) { // GIVEN the sample plugin library // WHEN we get the list of available sources auto v = Metavision::DeviceDiscovery::list(); diff --git a/hal/cpp/src/facilities/future/i_decoder.cpp b/hal/cpp/src/facilities/future/i_decoder.cpp index af7840502..7eba96809 100644 --- a/hal/cpp/src/facilities/future/i_decoder.cpp +++ b/hal/cpp/src/facilities/future/i_decoder.cpp @@ -104,5 +104,13 @@ bool I_Decoder::reset_timestamp_shift(const timestamp &t) { return reset_timestamp_shift_impl(t); } +size_t I_Decoder::add_protocol_violation_callback(const ProtocolViolationCallback_t &cb) { + throw HalException(HalErrorCode::OperationNotImplemented, "Decoder protocol violation detection not implemented"); +} + +bool I_Decoder::remove_protocol_violation_callback(size_t callback_id) { + return false; +} + } // namespace Future } // namespace Metavision diff --git a/hal/cpp/src/facilities/i_decoder.cpp b/hal/cpp/src/facilities/i_decoder.cpp index fed039b8d..a52b6ed40 100644 --- a/hal/cpp/src/facilities/i_decoder.cpp +++ b/hal/cpp/src/facilities/i_decoder.cpp @@ -95,4 +95,12 @@ bool I_Decoder::remove_time_callback(size_t callback_id) { return false; } +size_t I_Decoder::add_protocol_violation_callback(const ProtocolViolationCallback_t &cb) { + throw HalException(HalErrorCode::OperationNotImplemented, "Decoder protocol violation detection not implemented"); +} + +bool I_Decoder::remove_protocol_violation_callback(size_t callback_id) { + return false; +} + } // namespace Metavision diff --git a/hal/cpp/src/facilities/i_events_stream.cpp b/hal/cpp/src/facilities/i_events_stream.cpp index 0a7b4c491..ad817bee8 100644 --- a/hal/cpp/src/facilities/i_events_stream.cpp +++ b/hal/cpp/src/facilities/i_events_stream.cpp @@ -44,8 +44,8 @@ I_EventsStream::I_EventsStream(std::unique_ptr data_transfer, data_transfer_->add_new_buffer_callback([this](const DataTransfer::BufferPtr &buffer) { std::lock_guard lock(new_buffer_safety_); if (!stop_) { - if (!contains(data_transfer_buffer_ptrs_, buffer.get())) { - data_transfer_buffer_ptrs_.push_back(buffer.get()); + if (data_transfer_buffer_ptrs_.count(buffer.get()) == 0) { + data_transfer_buffer_ptrs_.insert(buffer.get()); } available_buffers_.push(buffer); new_buffer_cond_.notify_all(); diff --git a/hal/cpp/src/utils/data_transfer.cpp b/hal/cpp/src/utils/data_transfer.cpp index fcff9d12b..570082e4a 100644 --- a/hal/cpp/src/utils/data_transfer.cpp +++ b/hal/cpp/src/utils/data_transfer.cpp @@ -16,8 +16,8 @@ namespace Metavision { DataTransfer::DataTransfer(uint32_t raw_event_size_bytes) : raw_event_size_bytes_(raw_event_size_bytes) {} -DataTransfer::DataTransfer(uint32_t raw_event_size_bytes, const BufferPool &buffer_pool) : - raw_event_size_bytes_(raw_event_size_bytes), buffer_pool_(buffer_pool) { +DataTransfer::DataTransfer(uint32_t raw_event_size_bytes, const BufferPool &buffer_pool, bool allow_buffer_drop) : + raw_event_size_bytes_(raw_event_size_bytes), buffer_pool_(buffer_pool), allow_buffer_drop_(allow_buffer_drop) { if (buffer_pool_.is_bounded() && buffer_pool_.size() < 3) { throw HalException(HalErrorCode::InvalidArgument, "A DataTransfer can not be initialized with a bounded object pool of size < 3 (got size " + @@ -61,8 +61,9 @@ void DataTransfer::stop() { return; } - stop_ = true; stop_impl(); + stop_ = true; + run_transfers_thread_.join(); } @@ -89,18 +90,6 @@ uint32_t DataTransfer::get_raw_event_size_bytes() const { return raw_event_size_bytes_; } -DataTransfer::BufferPtr DataTransfer::transfer_data(const BufferPtr &buffer) { - for (auto cb : new_buffer_cbs_) { - cb.second(buffer); - } - - return get_buffer(); -} - -DataTransfer::BufferPtr DataTransfer::get_buffer() { - return buffer_pool_.acquire(); -} - bool DataTransfer::should_stop() { return stop_; } @@ -109,4 +98,10 @@ void DataTransfer::start_impl(BufferPtr buffer) {} void DataTransfer::stop_impl() {} +void DataTransfer::fire_callbacks(const BufferPtr buffer) const { + for (auto &cb : new_buffer_cbs_) { + cb.second(buffer); + } +} + } // namespace Metavision diff --git a/hal/cpp/src/utils/future/data_transfer.cpp b/hal/cpp/src/utils/future/data_transfer.cpp index abb38783b..697e0aa9e 100644 --- a/hal/cpp/src/utils/future/data_transfer.cpp +++ b/hal/cpp/src/utils/future/data_transfer.cpp @@ -17,8 +17,8 @@ namespace Future { DataTransfer::DataTransfer(uint32_t raw_event_size_bytes) : raw_event_size_bytes_(raw_event_size_bytes) {} -DataTransfer::DataTransfer(uint32_t raw_event_size_bytes, const BufferPool &buffer_pool) : - raw_event_size_bytes_(raw_event_size_bytes), buffer_pool_(buffer_pool) { +DataTransfer::DataTransfer(uint32_t raw_event_size_bytes, const BufferPool &buffer_pool, bool allow_buffer_drop) : + raw_event_size_bytes_(raw_event_size_bytes), buffer_pool_(buffer_pool), allow_buffer_drop_(allow_buffer_drop) { if (buffer_pool_.is_bounded() && buffer_pool_.size() < 3) { throw HalException(HalErrorCode::InvalidArgument, "A DataTransfer can not be initialized with a bounded object pool of size < 3 (got size " + @@ -105,6 +105,7 @@ void DataTransfer::stop() { return; } + stop_impl(); { std::lock(suspend_mutex_, running_mutex_); std::unique_lock lock1(suspend_mutex_, std::adopt_lock); @@ -114,7 +115,6 @@ void DataTransfer::stop() { suspend_cond_.notify_all(); running_cond_.notify_all(); - stop_impl(); run_transfers_thread_.join(); } @@ -159,18 +159,6 @@ uint32_t DataTransfer::get_raw_event_size_bytes() const { return raw_event_size_bytes_; } -DataTransfer::BufferPtr DataTransfer::transfer_data(const BufferPtr &buffer) { - for (auto cb : new_buffer_cbs_) { - cb.second(buffer); - } - - return get_buffer(); -} - -DataTransfer::BufferPtr DataTransfer::get_buffer() { - return buffer_pool_.acquire(); -} - bool DataTransfer::should_stop() { return stop_ || suspend_; } @@ -183,5 +171,11 @@ void DataTransfer::start_impl(BufferPtr buffer) {} void DataTransfer::stop_impl() {} +void DataTransfer::fire_callbacks(const BufferPtr buffer) const { + for (auto &cb : new_buffer_cbs_) { + cb.second(buffer); + } +} + } // namespace Future } // namespace Metavision diff --git a/hal_psee_plugins/apps/metavision_cx3_updater/CMakeLists.txt b/hal_psee_plugins/apps/metavision_cx3_updater/CMakeLists.txt index fe891c1a2..9e70e2ba8 100644 --- a/hal_psee_plugins/apps/metavision_cx3_updater/CMakeLists.txt +++ b/hal_psee_plugins/apps/metavision_cx3_updater/CMakeLists.txt @@ -16,4 +16,10 @@ target_link_libraries(metavision_cx3_updater PRIVATE MetavisionSDK::base Boost:: target_include_directories(metavision_cx3_updater PRIVATE $ -) \ No newline at end of file +) + +install(TARGETS metavision_cx3_updater + RUNTIME DESTINATION bin + COMPONENT metavision-hal-prophesee-plugins +) + diff --git a/hal_psee_plugins/apps/metavision_cx3_updater/metavision_cx3_updater.cpp b/hal_psee_plugins/apps/metavision_cx3_updater/metavision_cx3_updater.cpp index b2011eefa..854258c50 100644 --- a/hal_psee_plugins/apps/metavision_cx3_updater/metavision_cx3_updater.cpp +++ b/hal_psee_plugins/apps/metavision_cx3_updater/metavision_cx3_updater.cpp @@ -46,12 +46,34 @@ int fx3_flash(libusb_device_handle *dev_handle, const char *filename, int *err_b return cmd.flash(dev_handle, filename, 0, -1, 0, err_bad_flash); } +long convert_usb_speed(long dev_speed) { + switch (dev_speed) { + case LIBUSB_SPEED_LOW: + return 1; // Actual speed would be 1.5Mbit/s but we use integral type. + case LIBUSB_SPEED_FULL: + return 12; + case LIBUSB_SPEED_HIGH: + return 480; + case LIBUSB_SPEED_SUPER: + return 5000; +#if LIBUSB_API_VERSION >= 0x01000106 + // Compiling on 1.0.22 or newer, which starts support for SSP. + case LIBUSB_SPEED_SUPER_PLUS: + return 10000; +#endif + case LIBUSB_SPEED_UNKNOWN: + default: + return 0; // Unknown speed is indicated as 0. + } +} + } // namespace namespace po = boost::program_options; int main(int argc, char *argv[]) { bool fw = false; bool fpga = false; + bool recov = false; bool serial_read = false; vector serial; std::string serial_string = ""; @@ -71,11 +93,12 @@ int main(int argc, char *argv[]) { ("help,h", "Produce help message.") ("usb-fpga", po::bool_switch(&fpga)->default_value(false),"Flash fpga.") ("usb-fw", po::bool_switch(&fw)->default_value(false), "Flash firmware.") - ("usb-write-serial", po::value(&serial_string)->default_value(""), "Serial to write. in hexadecimal, up to 64bits.") - ("usb-read-serial", po::bool_switch(&serial_read)->default_value(false), "Read serial number from firmware.") - ("ccam5-revision", po::value(&ccam5_board)->default_value("revB"), "CCam5 board revision."); + ("usb-recov", po::bool_switch(&recov)->default_value(false), "Load firmware to RAM.") + ("usb-read-serial", po::bool_switch(&serial_read)->default_value(false), "Read serial number from firmware."); hidden_desc.add_options() + ("usb-write-serial", po::value(&serial_string)->default_value(""), "Serial to write. in hexadecimal, up to 64bits.") + ("ccam5-revision", po::value(&ccam5_board)->default_value("revB"), "CCam5 board revision.") ("firmware,f", po::value(), "Firmware file."); // clang-format on @@ -135,12 +158,17 @@ int main(int argc, char *argv[]) { return 1; } - libusb_device **devs; // pointer to pointer of device, used to retrieve a list of devices - libusb_device_handle *dev_handle; // a device handle - std::vector handles; // vector of device handles - // listing of usb devices for cx3, (name, vid, pid) + libusb_device **devs; // pointer to pointer of device, used to retrieve a list of devices + libusb_device_handle *dev_handle; // a device handle + std::string dev_name; + std::vector> valid_devs; + + // listing of usb devices for cx3, (name, vid, pid) const std::unordered_map> USB_DEVICES = { - {"EVK3", std::make_pair(0x04b4, 0x00f4)}, {"EVK4", std::make_pair(0x04b4, 0x00f5)}}; + {"CYBOOT", std::make_pair(0x04b4, 0x00f3)}, + {"CYFLASH", std::make_pair(0x04b4, 0x4720)}, + {"EVK3", std::make_pair(0x04b4, 0x00f4)}, + {"EVK4", std::make_pair(0x04b4, 0x00f5)}}; libusb_context *ctx = NULL; // a libusb session int r; // for return values ssize_t cnt; // holding number of devices in list @@ -159,45 +187,62 @@ int main(int argc, char *argv[]) { // Look for valid Psee usb cx3 devices for (auto &it : USB_DEVICES) { - auto vid = it.second.first; - auto pid = it.second.second; - auto res = libusb_open_device_with_vid_pid(ctx, vid, pid); + auto name = it.first; + auto vid = it.second.first; + auto pid = it.second.second; + auto res = libusb_open_device_with_vid_pid(ctx, vid, pid); if (res != NULL) { - handles.push_back(res); + valid_devs.push_back(std::make_pair(name, res)); } } - if (handles.empty()) { + if (valid_devs.empty()) { MV_LOG_ERROR() << "No device to flash"; return 1; - } else if (handles.size() != 1) { + } else if (valid_devs.size() != 1) { MV_LOG_ERROR() << "Found more than one candidate. Ensure only one is connected"; // Exiting, close what we just opened - for (auto it = handles.begin(); it != handles.end(); ++it) { - libusb_close(*it); + for (auto it = valid_devs.begin(); it != valid_devs.end(); ++it) { + libusb_close(it->second); } return 1; + } else { + dev_name = valid_devs[0].first; + dev_handle = valid_devs[0].second; + MV_LOG_INFO() << "Found" << dev_name << "device"; } - dev_handle = handles[0]; - - std::vector vread; - vread.resize(2); - uint16_t sys_id = 0; + libusb_device *dev_; + dev_ = libusb_get_device(dev_handle); + long dev_speed_ = (libusb_speed)libusb_get_device_speed(dev_); + long dev_data_rate_ = convert_usb_speed(dev_speed_); - r = libusb_control_transfer(dev_handle, 0xC0, CMD_READ_SYSTEM_ID, 0x00, 0, &vread[0], 2, 0); - if (r <= 0) { - MV_LOG_ERROR() << "Cannot fetch system ID" << libusb_error_name(r); + if (dev_speed_ < LIBUSB_SPEED_SUPER && dev_name != "CYBOOT") { + MV_LOG_ERROR() << dev_name + << "device is not enumerated as a USB 3 SuperSpeed device. Found device speed:" << dev_data_rate_ + << "Mbit/s"; return 1; } else { - sys_id = ((vread[1] & 0xFF) << 8) | (vread[0] & 0xFF); - MV_LOG_INFO() << Metavision::Log::no_space << "Found System ID 0x" << std::hex << (sys_id & 0xFFFF); + MV_LOG_INFO() << dev_name << "device speed is" << dev_data_rate_ << "Mbit/s"; } + uint16_t sys_id = 0; int err_bad_flash = 0; int ret_flash = 0; + std::vector vread; + vread.resize(2); + + if (serial_string != "" || serial_read) { + r = libusb_control_transfer(dev_handle, 0xC0, CMD_READ_SYSTEM_ID, 0x00, 0, &vread[0], 2, 0); + if (r <= 0) { + MV_LOG_WARNING() << "Cannot fetch system ID" << libusb_error_name(r); + } else { + sys_id = ((vread[1] & 0xFF) << 8) | (vread[0] & 0xFF); + MV_LOG_INFO() << Metavision::Log::no_space << "Found System ID 0x" << std::hex << (sys_id & 0xFFFF); + } + } if (fpga && (firmware != "")) { ret_flash = fx3_fpga_flash(dev_handle, firmware.c_str(), 0, -1, 0, &err_bad_flash); @@ -225,6 +270,13 @@ int main(int argc, char *argv[]) { MV_LOG_ERROR() << "Flashed" << err_bad_flash << "error(s)"; } MV_LOG_INFO() << "Please, unplug the camera to reset it"; + } else if (recov && firmware != "") { + ret_flash = LoadApplicativeFirmwareToFx3RAM::fx3_usbboot_download(dev_handle, firmware.c_str()); + if (ret_flash) { + MV_LOG_ERROR() << "Could not load firmware to RAM. Error:" << ret_flash; + } else { + MV_LOG_INFO() << "Firmware loaded to ram"; + } } else if (serial_string != "") { serial.clear(); @@ -268,9 +320,12 @@ int main(int argc, char *argv[]) { MV_LOG_ERROR() << "Error while accesing EEPROM to write serial number."; MV_LOG_ERROR() << "Serial number write operation failed."; } - } else { + } else if (sys_id == Metavision::SystemId::SYSTEM_CCAM5_GEN31) { FlashCmd cmd = FlashCmd::FlashCmdFpga(); ret_flash = cmd.flash_serial(dev_handle, &err_bad_flash, 600, serial); + } else { + MV_LOG_ERROR() << "Error while flashing Serial : Unknown system"; + return 1; } } else if (serial_read) { if (sys_id == Metavision::SystemId::SYSTEM_EVK3_GEN41 || sys_id == Metavision::SystemId::SYSTEM_EVK3_IMX636) { @@ -300,8 +355,8 @@ int main(int argc, char *argv[]) { // We shouldn't get here with more than one handle, but just in case, // close the device we opened - for (auto it = handles.begin(); it != handles.end(); ++it) { - libusb_close(*it); + for (auto it = valid_devs.begin(); it != valid_devs.end(); ++it) { + libusb_close(it->second); } libusb_exit(ctx); // needs to be called to end the diff --git a/hal_psee_plugins/include/boards/treuzell/tz_board_data_transfer.h b/hal_psee_plugins/include/boards/treuzell/tz_board_data_transfer.h index fd9fb02ce..76ba12bcd 100644 --- a/hal_psee_plugins/include/boards/treuzell/tz_board_data_transfer.h +++ b/hal_psee_plugins/include/boards/treuzell/tz_board_data_transfer.h @@ -28,7 +28,10 @@ namespace Metavision { class TzBoardDataTransfer : public DataTransfer { public: - TzBoardDataTransfer(const std::shared_ptr &cmd, uint32_t raw_event_size_bytes); + static DataTransfer::BufferPool make_buffer_pool(size_t max_pool_byte_size = 0); + + TzBoardDataTransfer(const std::shared_ptr &cmd, uint32_t raw_event_size_bytes, + const DataTransfer::BufferPool &buffer_pool = make_buffer_pool()); ~TzBoardDataTransfer() override; private: @@ -62,6 +65,9 @@ class TzBoardDataTransfer : public DataTransfer { static int submit_transfer(libusb_transfer *transfer); void prepare_async_bulk_transfer(libusb_transfer *transfer, unsigned char *buf, int packet_size, libusb_transfer_cb_fn async_bulk_cb, void *user_data, unsigned int timeout); + + static const size_t packet_size_; + static const size_t async_transfer_num_; }; } // namespace Metavision diff --git a/hal_psee_plugins/include/boards/utils/psee_libusb_data_transfer.h b/hal_psee_plugins/include/boards/utils/psee_libusb_data_transfer.h index 2dd71afca..84ae2d1b9 100644 --- a/hal_psee_plugins/include/boards/utils/psee_libusb_data_transfer.h +++ b/hal_psee_plugins/include/boards/utils/psee_libusb_data_transfer.h @@ -25,7 +25,10 @@ class PseeLibUSBBoardCommand; class PseeLibUSBDataTransfer : public DataTransfer { public: - PseeLibUSBDataTransfer(const std::shared_ptr &cmd, uint32_t raw_event_size_bytes); + static DataTransfer::BufferPool make_buffer_pool(size_t max_pool_byte_size = 0); + + PseeLibUSBDataTransfer(const std::shared_ptr &cmd, uint32_t raw_event_size_bytes, + const DataTransfer::BufferPool &buffer_pool = make_buffer_pool()); ~PseeLibUSBDataTransfer() override; private: @@ -45,6 +48,9 @@ class PseeLibUSBDataTransfer : public DataTransfer { std::vector> vtransfer_; std::atomic active_bulks_transfers_{0}; + + static const size_t packet_size_; + static const size_t async_transfer_num_; }; } // namespace Metavision diff --git a/hal_psee_plugins/include/decoders/evt2/evt2_decoder.h b/hal_psee_plugins/include/decoders/evt2/evt2_decoder.h index 0d3624046..256d78c6e 100644 --- a/hal_psee_plugins/include/decoders/evt2/evt2_decoder.h +++ b/hal_psee_plugins/include/decoders/evt2/evt2_decoder.h @@ -142,9 +142,6 @@ class EVT2Decoder : public I_Decoder { timestamp last_timestamp_{-1}; // ts of the last event timestamp full_shift_{ 0}; // includes loop and shift_th in one single variable. Must be signed typed as shift can be negative. - - std::vector incomplete_raw_data_; - std::iterator_traits::difference_type incomplete_raw_data_missing_count_{0}; }; } // namespace Metavision diff --git a/hal_psee_plugins/include/decoders/evt2/future/evt2_decoder.h b/hal_psee_plugins/include/decoders/evt2/future/evt2_decoder.h index e8edaf73b..00aae0624 100644 --- a/hal_psee_plugins/include/decoders/evt2/future/evt2_decoder.h +++ b/hal_psee_plugins/include/decoders/evt2/future/evt2_decoder.h @@ -162,6 +162,10 @@ class EVT2Decoder : public I_Decoder { base_time_set_ = true; last_timestamp_set_ = true; return true; + } else { + base_time_set_ = false; + last_timestamp_set_ = false; + return true; } return false; } @@ -185,9 +189,6 @@ class EVT2Decoder : public I_Decoder { timestamp full_shift_{ 0}; // includes loop and shift_th in one single variable. Must be signed typed as shift can be negative. bool shift_set_{false}; - - std::vector incomplete_raw_data_; - std::iterator_traits::difference_type incomplete_raw_data_missing_count_{0}; }; } // namespace Future diff --git a/hal_psee_plugins/include/decoders/evt3/evt3_decoder.h b/hal_psee_plugins/include/decoders/evt3/evt3_decoder.h index 3fe9e4cde..d9044a2bc 100644 --- a/hal_psee_plugins/include/decoders/evt3/evt3_decoder.h +++ b/hal_psee_plugins/include/decoders/evt3/evt3_decoder.h @@ -22,9 +22,12 @@ #include "metavision/hal/facilities/i_geometry.h" #include "metavision/hal/facilities/i_decoder.h" #include "decoders/evt3/evt3_event_types.h" +#include "decoders/evt3/evt3_validator.h" namespace Metavision { +namespace detail { +template class EVT3Decoder : public I_Decoder { public: using RawEvent = Evt3Raw::RawEvent; @@ -35,14 +38,17 @@ class EVT3Decoder : public I_Decoder { std::atomic timestamp_loop_enabled_{true}; std::mutex is_decoding_mut_; + Validator validator; public: EVT3Decoder( - bool time_shifting_enabled, int height, + bool time_shifting_enabled, int height, int width, const std::shared_ptr> &event_cd_decoder = std::shared_ptr>(), const std::shared_ptr> &event_ext_trigger_decoder = std::shared_ptr>()) : - I_Decoder(time_shifting_enabled, event_cd_decoder, event_ext_trigger_decoder), height_(height) {} + I_Decoder(time_shifting_enabled, event_cd_decoder, event_ext_trigger_decoder), + height_(height), + validator(height, width) {} virtual bool get_timestamp_shift(timestamp &ts_shift) const override { return false; @@ -59,6 +65,14 @@ class EVT3Decoder : public I_Decoder { return sizeof(RawEvent); } + virtual size_t add_protocol_violation_callback(const ProtocolViolationCallback_t &cb) override { + return validator.add_protocol_violation_callback(cb); + } + + virtual bool remove_protocol_violation_callback(size_t callback_id) override { + return validator.remove_protocol_violation_callback(callback_id); + } + private: template timestamp last_timestamp() const { @@ -127,9 +141,11 @@ class EVT3Decoder : public I_Decoder { if (type == static_cast(EventTypesEnum::EVT_ADDR_X)) { if (is_valid) { Evt3Raw::Event_PosX *ev_posx = reinterpret_cast(cur_raw_ev); - cd_forwarder.forward(static_cast(ev_posx->x), - state[(int)EventTypesEnum::EVT_ADDR_Y], static_cast(ev_posx->pol), - last_timestamp()); + if (validator.validate_event_cd(cur_raw_ev)) { + cd_forwarder.forward(static_cast(ev_posx->x), + state[(int)EventTypesEnum::EVT_ADDR_Y], static_cast(ev_posx->pol), + last_timestamp()); + } } ++cur_raw_ev; @@ -145,45 +161,54 @@ class EVT3Decoder : public I_Decoder { continue; } - cd_forwarder.reserve(32); + const uint16_t nb_bits = 32; + int next_offset; + if (validator.validate_vect_12_12_8_pattern( + cur_raw_ev, state[(int)EventTypesEnum::VECT_BASE_X] & NOT_POLARITY_MASK, next_offset)) { + cd_forwarder.reserve(32); - Evt3Raw::Event_Vect12_12_8 *ev_vect12_12_8 = reinterpret_cast(cur_raw_ev); + const Evt3Raw::Event_Vect12_12_8 *ev_vect12_12_8 = + reinterpret_cast(cur_raw_ev); - Evt3Raw::Mask m; - m.m.valid1 = ev_vect12_12_8->valid1; - m.m.valid2 = ev_vect12_12_8->valid2; - m.m.valid3 = ev_vect12_12_8->valid3; + Evt3Raw::Mask m; + m.m.valid1 = ev_vect12_12_8->valid1; + m.m.valid2 = ev_vect12_12_8->valid2; + m.m.valid3 = ev_vect12_12_8->valid3; - uint32_t valid = m.valid; + uint32_t valid = m.valid; - uint16_t last_x = state[(int)EventTypesEnum::VECT_BASE_X] & NOT_POLARITY_MASK; - uint16_t nb_bits = 32; + uint16_t last_x = state[(int)EventTypesEnum::VECT_BASE_X] & NOT_POLARITY_MASK; #if defined(__x86_64__) || defined(__aarch64__) - uint16_t off = 0; - while (valid) { - off = __builtin_ctz(valid); - valid &= ~(1 << off); - cd_forwarder.forward_unsafe(last_x + off, state[(int)EventTypesEnum::EVT_ADDR_Y], - (bool)(state[(int)EventTypesEnum::VECT_BASE_X] & POLARITY_MASK), - last_timestamp()); - } -#else - uint16_t end = last_x + nb_bits; - for (uint16_t i = last_x; i != end; ++i) { - if (valid & 0x1) { - cd_forwarder.forward_unsafe(i, state[(int)EventTypesEnum::EVT_ADDR_Y], + uint16_t off = 0; + while (valid) { + off = __builtin_ctz(valid); + valid &= ~(1 << off); + cd_forwarder.forward_unsafe(last_x + off, state[(int)EventTypesEnum::EVT_ADDR_Y], (bool)(state[(int)EventTypesEnum::VECT_BASE_X] & POLARITY_MASK), last_timestamp()); } - valid >>= 1; - } +#else + uint16_t end = last_x + nb_bits; + for (uint16_t i = last_x; i != end; ++i) { + if (valid & 0x1) { + cd_forwarder.forward_unsafe(i, state[(int)EventTypesEnum::EVT_ADDR_Y], + (bool)(state[(int)EventTypesEnum::VECT_BASE_X] & POLARITY_MASK), + last_timestamp()); + } + valid >>= 1; + } #endif - state[(int)EventTypesEnum::VECT_BASE_X] += nb_bits; - cur_raw_ev += vect12_size; - + } + if (validator.has_valid_vect_base()) { + state[(int)EventTypesEnum::VECT_BASE_X] += nb_bits; + } + cur_raw_ev += next_offset; } else if (type == static_cast(EventTypesEnum::EVT_TIME_HIGH)) { Evt3Raw::Event_Time *ev_timehigh = reinterpret_cast(cur_raw_ev); static constexpr timestamp max_timestamp_ = 1ULL << 11; + + validator.validate_time_high(last_timestamp_.bitfield_time.high, ev_timehigh->time); + last_timestamp_.bitfield_time.loop += (bool)(last_timestamp_.bitfield_time.high >= max_timestamp_ + ev_timehigh->time); last_timestamp_.bitfield_time.low = @@ -193,11 +218,15 @@ class EVT3Decoder : public I_Decoder { // right after to correct the value (note that the timestamp here is not good if we don't // do that either) last_timestamp_.bitfield_time.high = ev_timehigh->time; + ++cur_raw_ev; } else if (type == static_cast(EventTypesEnum::EXT_TRIGGER)) { - Evt3Raw::Event_ExtTrigger *ev_exttrigger = reinterpret_cast(cur_raw_ev); - trigger_forwarder.forward(static_cast(ev_exttrigger->pol), last_timestamp(), - static_cast(ev_exttrigger->id)); + if (validator.validate_ext_trigger(cur_raw_ev)) { + const Evt3Raw::Event_ExtTrigger *ev_exttrigger = + reinterpret_cast(cur_raw_ev); + trigger_forwarder.forward(static_cast(ev_exttrigger->pol), last_timestamp(), + static_cast(ev_exttrigger->id)); + } ++cur_raw_ev; } else { // The objective is to reduce the number of possible cases @@ -216,6 +245,8 @@ class EVT3Decoder : public I_Decoder { state[static_cast(EventTypesEnum::EVT_TIME_LOW)]; last_timestamp_set_ = true; + validator.state_update(cur_raw_ev); + ++cur_raw_ev; } } @@ -232,9 +263,9 @@ class EVT3Decoder : public I_Decoder { constexpr static uint16_t NumBitsInHighTimestampLSB = 12; constexpr static uint16_t POLARITY_MASK = 1 << (NumBitsInTimestampLSB - 1); constexpr static uint16_t NOT_POLARITY_MASK = ~(1 << (NumBitsInTimestampLSB - 1)); - uint32_t state[SIZE_EVTYPE]; - bool is_valid = false; - bool is_cd = false; + uint32_t state[SIZE_EVTYPE] = {0}; + bool is_valid = false; + bool is_cd = false; struct bitfield_timestamp { uint64_t low : NumBitsInTimestampLSB; uint64_t high : NumBitsInHighTimestampLSB; @@ -253,6 +284,51 @@ class EVT3Decoder : public I_Decoder { std::ptrdiff_t raw_events_missing_count_{0}; }; +} // namespace detail + +using EVT3Decoder = detail::EVT3Decoder; +using UnsafeEVT3Decoder = detail::EVT3Decoder; +using RobustEVT3Decoder = detail::EVT3Decoder; + +namespace { +void throw_on_non_monotonic_time_high(const DecoderProtocolViolation &protocol_violation_type) { + std::ostringstream oss; + oss << "Evt3 protocol violation detected : " << protocol_violation_type; + + switch (protocol_violation_type) { + case DecoderProtocolViolation::NonMonotonicTimeHigh: + throw(HalException(protocol_violation_type, oss.str())); + default: + break; + } +}; +} // namespace + +inline std::unique_ptr make_evt3_decoder( + bool time_shifting_enabled, int height, int width, + const std::shared_ptr> &event_cd_decoder = std::shared_ptr>(), + const std::shared_ptr> &event_ext_trigger_decoder = + std::shared_ptr>()) { + std::unique_ptr decoder = std::make_unique(time_shifting_enabled, height, width, + event_cd_decoder, event_ext_trigger_decoder); + + if (std::getenv("MV_FLAGS_EVT3_THROW_ON_NON_MONOTONIC_TIME_HIGH") || std::getenv("MV_FLAGS_EVT3_ROBUST_DECODER")) { + MV_HAL_LOG_INFO() << "Using EVT3 Robust decoder."; + decoder = std::make_unique(time_shifting_enabled, height, width, event_cd_decoder, + event_ext_trigger_decoder); + } else if (std::getenv("MV_FLAGS_EVT3_UNSAFE_DECODER")) { + MV_HAL_LOG_INFO() << "Using EVT3 Unsafe decoder."; + decoder = std::make_unique(time_shifting_enabled, height, width, event_cd_decoder, + event_ext_trigger_decoder); + } + + if (std::getenv("MV_FLAGS_EVT3_THROW_ON_NON_MONOTONIC_TIME_HIGH")) { + MV_HAL_LOG_INFO() << "Decoder will raise exception upon EVT3 Non Monotonic Time High violation."; + decoder->add_protocol_violation_callback(throw_on_non_monotonic_time_high); + } + return decoder; +} + } // namespace Metavision #endif // METAVISION_HAL_EVT3_DECODER_H diff --git a/hal_psee_plugins/include/decoders/evt3/evt3_validator.h b/hal_psee_plugins/include/decoders/evt3/evt3_validator.h new file mode 100644 index 000000000..b9acabf49 --- /dev/null +++ b/hal_psee_plugins/include/decoders/evt3/evt3_validator.h @@ -0,0 +1,311 @@ +/********************************************************************************************************************** + * Copyright (c) Prophesee S.A. * + * * + * Licensed under the Apache License, Version 2.0 (the "License"); * + * you may not use this file except in compliance with the License. * + * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed * + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * + * See the License for the specific language governing permissions and limitations under the License. * + **********************************************************************************************************************/ + +#ifndef METAVISION_HAL_EVT3_VALIDATOR_H +#define METAVISION_HAL_EVT3_VALIDATOR_H + +#include +#include +#include +#include + +#include "metavision/sdk/base/utils/timestamp.h" +#include "metavision/hal/facilities/i_decoder.h" +#include "metavision/hal/utils/decoder_protocol_violation.h" +#include "metavision/hal/utils/hal_error_code.h" +#include "decoders/evt3/evt3_event_types.h" + +namespace Metavision { +namespace decoder { +namespace evt3 { + +template +class ValidatorInterface { +protected: + std::map notifiers_map_; + size_t next_cb_idx_{0}; + +public: + constexpr static int TIME_HIGH_MAX_VALUE = 0xFFF; + constexpr static int LOOSE_TIME_HIGH_OVERFLOW_EPSILON = + 0xFF; // Arbitrary value to distinguish data swap from data drop + + ValidatorInterface(int height, int width) {} + + size_t add_protocol_violation_callback(const I_Decoder::ProtocolViolationCallback_t &cb) { + notifiers_map_[next_cb_idx_] = cb; + return next_cb_idx_++; + } + + bool remove_protocol_violation_callback(size_t callback_id) { + auto it = notifiers_map_.find(callback_id); + if (it != notifiers_map_.end()) { + notifiers_map_.erase(it); + return true; + } + return false; + } + + void notify(DecoderProtocolViolation violation) { + if (notifiers_map_.empty()) { + std::ostringstream oss; + oss << "Evt3 protocol violation detected : " << violation; + if (violation == DecoderProtocolViolation::NonMonotonicTimeHigh) { + MV_HAL_LOG_ERROR() << oss.str(); + } else { + MV_HAL_LOG_WARNING() << oss.str(); + } + } else { + for (auto &it : notifiers_map_) { + it.second(violation); + } + } + } + + bool validate_event_cd(const Evt3Raw::RawEvent *raw_events) { + return static_cast(this)->validate_event_cd_impl(raw_events); + } + + bool validate_ext_trigger(const Evt3Raw::RawEvent *raw_events) { + return static_cast(this)->validate_ext_trigger_impl(raw_events); + } + + bool has_valid_vect_base() { + return static_cast(this)->has_valid_vect_base_impl(); + } + + bool validate_vect_12_12_8_pattern(const Evt3Raw::RawEvent *raw_events, unsigned vect_base, + int &next_valid_offset) { + return static_cast(this)->validate_vect_12_12_8_pattern_impl(raw_events, vect_base, + next_valid_offset); + } + + bool validate_continue_12_12_4_pattern(const Evt3Raw::RawEvent *raw_events, int &next_valid_offset) { + return static_cast(this)->validate_continue_12_12_4_pattern_impl(raw_events, next_valid_offset); + } + + void validate_time_high(timestamp prev_time_high, timestamp time_high) { + static_cast(this)->validate_time_high_impl(prev_time_high, time_high); + } + + void state_update(const Evt3Raw::RawEvent *raw_event) { + static_cast(this)->state_update_impl(raw_event); + } + +protected: + static bool is_strict_time_high_overflow(timestamp prev_time_high, timestamp time_high) { + return prev_time_high == TIME_HIGH_MAX_VALUE && time_high == 0; + } + static bool is_loose_time_high_overflow(timestamp prev_time_high, timestamp time_high) { + return (time_high - prev_time_high + TIME_HIGH_MAX_VALUE) < LOOSE_TIME_HIGH_OVERFLOW_EPSILON; + } +}; + +class NullCheckValidator : public ValidatorInterface { +public: + NullCheckValidator(int height, int width) : ValidatorInterface(height, width) {} + + bool validate_event_cd_impl(const Evt3Raw::RawEvent *raw_events) { + return true; + } + + bool validate_ext_trigger_impl(const Evt3Raw::RawEvent *raw_events) { + return true; + } + + bool has_valid_vect_base_impl() { + return true; + } + + bool validate_vect_12_12_8_pattern_impl(const Evt3Raw::RawEvent *raw_events, unsigned vect_base, + int &next_valid_offset) { + next_valid_offset = sizeof(Evt3Raw::Event_Vect12_12_8) / sizeof(Evt3Raw::RawEvent); + return true; + } + + bool validate_continue_12_12_4_pattern_impl(const Evt3Raw::RawEvent *raw_events, int &next_valid_offset) { + next_valid_offset = sizeof(Evt3Raw::Event_Continue12_12_4) / sizeof(Evt3Raw::RawEvent); + return true; + } + + void validate_time_high_impl(timestamp prev_time_high, timestamp time_high) {} + + void state_update_impl(const Evt3Raw::RawEvent *raw_event) {} +}; + +class BasicCheckValidator : public ValidatorInterface { + uint32_t width_; + bool has_vect_base_ = false; + +public: + BasicCheckValidator(int height, int width) : + ValidatorInterface(height, width), width_(width) {} + + bool validate_event_cd_impl(const Evt3Raw::RawEvent *raw_events) { + return true; + } + + bool validate_ext_trigger_impl(const Evt3Raw::RawEvent *raw_events) { + return true; + } + + bool has_valid_vect_base_impl() { + return true; + } + + bool validate_vect_12_12_8_pattern_impl(const Evt3Raw::RawEvent *raw_events, unsigned vect_base, + int &next_valid_offset) { + next_valid_offset = sizeof(Evt3Raw::Event_Vect12_12_8) / sizeof(Evt3Raw::RawEvent); + + if (!has_vect_base_ || vect_base + 32 > width_) { + has_vect_base_ = false; + notify(DecoderProtocolViolation::InvalidVectBase); + return false; + } + + return true; + } + + bool validate_continue_12_12_4_pattern_impl(const Evt3Raw::RawEvent *raw_events, int &next_valid_offset) { + next_valid_offset = sizeof(Evt3Raw::Event_Continue12_12_4) / sizeof(Evt3Raw::RawEvent); + return true; + } + + void validate_time_high_impl(timestamp prev_time_high, timestamp time_high) { + if (is_strict_time_high_overflow(prev_time_high, time_high)) { + return; + } + + int timehigh_delta = time_high - prev_time_high; + bool is_monotonic = 0 <= timehigh_delta; + if (!is_monotonic && !is_loose_time_high_overflow(prev_time_high, time_high)) { + notify(DecoderProtocolViolation::NonMonotonicTimeHigh); + } + } + + void state_update_impl(const Evt3Raw::RawEvent *raw_event) { + if (raw_event->type == uint8_t(Evt3EventTypes_4bits::VECT_BASE_X)) { + has_vect_base_ = true; + } + } +}; + +class GrammarValidator : public ValidatorInterface { + uint32_t height_; + uint32_t width_; + bool is_valid_time_high_ = false; + bool has_addr_y_ = false; + bool has_vect_base_ = false; + +public: + GrammarValidator(int height, int width) : + ValidatorInterface(height, width), height_(height), width_(width) {} + + bool validate_event_cd_impl(const Evt3Raw::RawEvent *raw_events) { + if (!has_addr_y_) { + notify(DecoderProtocolViolation::MissingYAddr); + return false; + } + return is_valid_time_high_; + } + + bool validate_ext_trigger_impl(const Evt3Raw::RawEvent *raw_events) { + return is_valid_time_high_; + } + + bool has_valid_vect_base_impl() { + return has_vect_base_; + } + + bool validate_vect_12_12_8_pattern_impl(const Evt3Raw::RawEvent *raw_events, unsigned vect_base, + int &next_valid_offset) { + next_valid_offset = 0; + if ((raw_events + 1)->type != uint8_t(Evt3EventTypes_4bits::VECT_12)) { + next_valid_offset = 1; + } else if ((raw_events + 2)->type != uint8_t(Evt3EventTypes_4bits::VECT_8)) { + next_valid_offset = 2; + } + + if (next_valid_offset > 0) { + notify(DecoderProtocolViolation::PartialVect_12_12_8); + has_vect_base_ = false; + return false; + } + + next_valid_offset = sizeof(Evt3Raw::Event_Vect12_12_8) / sizeof(Evt3Raw::RawEvent); + + if (!has_vect_base_ || vect_base + 32 > width_) { + has_vect_base_ = false; + notify(DecoderProtocolViolation::InvalidVectBase); + return false; + } + + if (!has_addr_y_) { + notify(DecoderProtocolViolation::MissingYAddr); + return false; + } + + return is_valid_time_high_; + } + + bool validate_continue_12_12_4_pattern_impl(const Evt3Raw::RawEvent *raw_events, int &next_valid_offset) { + next_valid_offset = 0; + if ((raw_events)->type != uint8_t(Evt3EventTypes_4bits::CONTINUED_12)) { + notify(DecoderProtocolViolation::PartialContinued_12_12_4); + return false; + } else if ((raw_events + 1)->type != uint8_t(Evt3EventTypes_4bits::CONTINUED_12)) { + next_valid_offset = 1; + } else if ((raw_events + 2)->type != uint8_t(Evt3EventTypes_4bits::CONTINUED_4)) { + next_valid_offset = 2; + } + + if (next_valid_offset > 0) { + notify(DecoderProtocolViolation::PartialContinued_12_12_4); + return false; + } + + next_valid_offset = sizeof(Evt3Raw::Event_Continue12_12_4) / sizeof(Evt3Raw::RawEvent); + + return is_valid_time_high_; + } + + void validate_time_high_impl(timestamp prev_time_high, timestamp time_high) { + int timehigh_delta = time_high - prev_time_high; + bool is_monotonic = 0 <= timehigh_delta; + + is_valid_time_high_ = is_monotonic || is_loose_time_high_overflow(prev_time_high, time_high); + + if (is_strict_time_high_overflow(prev_time_high, time_high)) { + return; + } + + if (!is_valid_time_high_) { + notify(DecoderProtocolViolation::NonMonotonicTimeHigh); + } else if (timehigh_delta != 0 && timehigh_delta != 1) { + notify(DecoderProtocolViolation::NonContinuousTimeHigh); + } + } + + void state_update_impl(const Evt3Raw::RawEvent *raw_event) { + if (raw_event->type == uint8_t(Evt3EventTypes_4bits::EVT_ADDR_Y)) { + has_addr_y_ = true; + } + if (raw_event->type == uint8_t(Evt3EventTypes_4bits::VECT_BASE_X)) { + has_vect_base_ = true; + } + } +}; + +} // namespace evt3 +} // namespace decoder +} // namespace Metavision + +#endif // METAVISION_HAL_EVT3_VALIDATOR_H diff --git a/hal_psee_plugins/include/decoders/evt3/future/evt3_decoder.h b/hal_psee_plugins/include/decoders/evt3/future/evt3_decoder.h index 672e251a3..1fb35ccf9 100644 --- a/hal_psee_plugins/include/decoders/evt3/future/evt3_decoder.h +++ b/hal_psee_plugins/include/decoders/evt3/future/evt3_decoder.h @@ -22,10 +22,13 @@ #include "metavision/hal/facilities/i_geometry.h" #include "metavision/hal/facilities/i_decoder.h" #include "decoders/evt3/evt3_event_types.h" +#include "decoders/evt3/evt3_validator.h" namespace Metavision { namespace Future { +namespace detail { +template class EVT3Decoder : public I_Decoder { public: using RawEvent = Evt3Raw::RawEvent; @@ -36,14 +39,17 @@ class EVT3Decoder : public I_Decoder { std::atomic timestamp_loop_enabled_{true}; std::mutex is_decoding_mut_; + Validator validator; public: EVT3Decoder( - bool time_shifting_enabled, int height, + bool time_shifting_enabled, int height, int width, const std::shared_ptr> &event_cd_decoder = std::shared_ptr>(), const std::shared_ptr> &event_ext_trigger_decoder = std::shared_ptr>()) : - I_Decoder(time_shifting_enabled, event_cd_decoder, event_ext_trigger_decoder), height_(height) {} + I_Decoder(time_shifting_enabled, event_cd_decoder, event_ext_trigger_decoder), + height_(height), + validator(height, width) {} virtual bool get_timestamp_shift(timestamp &ts_shift) const override { ts_shift = timestamp_shift_; @@ -61,6 +67,14 @@ class EVT3Decoder : public I_Decoder { return sizeof(RawEvent); } + virtual size_t add_protocol_violation_callback(const ProtocolViolationCallback_t &cb) override { + return validator.add_protocol_violation_callback(cb); + } + + virtual bool remove_protocol_violation_callback(size_t callback_id) override { + return validator.remove_protocol_violation_callback(callback_id); + } + private: template timestamp last_timestamp() const { @@ -132,9 +146,11 @@ class EVT3Decoder : public I_Decoder { if (type == static_cast(EventTypesEnum::EVT_ADDR_X)) { if (is_valid) { const Evt3Raw::Event_PosX *ev_posx = reinterpret_cast(cur_raw_ev); - cd_forwarder.forward(static_cast(ev_posx->x), - state[(int)EventTypesEnum::EVT_ADDR_Y], static_cast(ev_posx->pol), - last_timestamp()); + if (validator.validate_event_cd(cur_raw_ev)) { + cd_forwarder.forward(static_cast(ev_posx->x), + state[(int)EventTypesEnum::EVT_ADDR_Y], static_cast(ev_posx->pol), + last_timestamp()); + } } ++cur_raw_ev; @@ -150,46 +166,54 @@ class EVT3Decoder : public I_Decoder { continue; } - cd_forwarder.reserve(32); + const uint16_t nb_bits = 32; + int next_offset; + if (validator.validate_vect_12_12_8_pattern( + cur_raw_ev, state[(int)EventTypesEnum::VECT_BASE_X] & NOT_POLARITY_MASK, next_offset)) { + cd_forwarder.reserve(32); - const Evt3Raw::Event_Vect12_12_8 *ev_vect12_12_8 = - reinterpret_cast(cur_raw_ev); + const Evt3Raw::Event_Vect12_12_8 *ev_vect12_12_8 = + reinterpret_cast(cur_raw_ev); - Evt3Raw::Mask m; - m.m.valid1 = ev_vect12_12_8->valid1; - m.m.valid2 = ev_vect12_12_8->valid2; - m.m.valid3 = ev_vect12_12_8->valid3; + Evt3Raw::Mask m; + m.m.valid1 = ev_vect12_12_8->valid1; + m.m.valid2 = ev_vect12_12_8->valid2; + m.m.valid3 = ev_vect12_12_8->valid3; - uint32_t valid = m.valid; + uint32_t valid = m.valid; - uint16_t last_x = state[(int)EventTypesEnum::VECT_BASE_X] & NOT_POLARITY_MASK; - uint16_t nb_bits = 32; + uint16_t last_x = state[(int)EventTypesEnum::VECT_BASE_X] & NOT_POLARITY_MASK; #if defined(__x86_64__) || defined(__aarch64__) - uint16_t off = 0; - while (valid) { - off = __builtin_ctz(valid); - valid &= ~(1 << off); - cd_forwarder.forward_unsafe(last_x + off, state[(int)EventTypesEnum::EVT_ADDR_Y], - (bool)(state[(int)EventTypesEnum::VECT_BASE_X] & POLARITY_MASK), - last_timestamp()); - } -#else - uint16_t end = last_x + nb_bits; - for (uint16_t i = last_x; i != end; ++i) { - if (valid & 0x1) { - cd_forwarder.forward_unsafe(i, state[(int)EventTypesEnum::EVT_ADDR_Y], + uint16_t off = 0; + while (valid) { + off = __builtin_ctz(valid); + valid &= ~(1 << off); + cd_forwarder.forward_unsafe(last_x + off, state[(int)EventTypesEnum::EVT_ADDR_Y], (bool)(state[(int)EventTypesEnum::VECT_BASE_X] & POLARITY_MASK), last_timestamp()); } - valid >>= 1; - } +#else + uint16_t end = last_x + nb_bits; + for (uint16_t i = last_x; i != end; ++i) { + if (valid & 0x1) { + cd_forwarder.forward_unsafe(i, state[(int)EventTypesEnum::EVT_ADDR_Y], + (bool)(state[(int)EventTypesEnum::VECT_BASE_X] & POLARITY_MASK), + last_timestamp()); + } + valid >>= 1; + } #endif - state[(int)EventTypesEnum::VECT_BASE_X] += nb_bits; - cur_raw_ev += vect12_size; - + } + if (validator.has_valid_vect_base()) { + state[(int)EventTypesEnum::VECT_BASE_X] += nb_bits; + } + cur_raw_ev += next_offset; } else if (type == static_cast(EventTypesEnum::EVT_TIME_HIGH)) { const Evt3Raw::Event_Time *ev_timehigh = reinterpret_cast(cur_raw_ev); static constexpr timestamp max_timestamp_ = 1ULL << 11; + + validator.validate_time_high(last_timestamp_.bitfield_time.high, ev_timehigh->time); + last_timestamp_.bitfield_time.loop += (bool)(last_timestamp_.bitfield_time.high >= max_timestamp_ + ev_timehigh->time); last_timestamp_.bitfield_time.low = @@ -199,12 +223,15 @@ class EVT3Decoder : public I_Decoder { // right after to correct the value (note that the timestamp here is not good if we don't // do that either) last_timestamp_.bitfield_time.high = ev_timehigh->time; + ++cur_raw_ev; } else if (type == static_cast(EventTypesEnum::EXT_TRIGGER)) { - const Evt3Raw::Event_ExtTrigger *ev_exttrigger = - reinterpret_cast(cur_raw_ev); - trigger_forwarder.forward(static_cast(ev_exttrigger->pol), last_timestamp(), - static_cast(ev_exttrigger->id)); + if (validator.validate_ext_trigger(cur_raw_ev)) { + const Evt3Raw::Event_ExtTrigger *ev_exttrigger = + reinterpret_cast(cur_raw_ev); + trigger_forwarder.forward(static_cast(ev_exttrigger->pol), last_timestamp(), + static_cast(ev_exttrigger->id)); + } ++cur_raw_ev; } else { // The objective is to reduce the number of possible cases @@ -223,6 +250,8 @@ class EVT3Decoder : public I_Decoder { state[static_cast(EventTypesEnum::EVT_TIME_LOW)]; last_timestamp_set_ = true; + validator.state_update(cur_raw_ev); + ++cur_raw_ev; } } @@ -235,6 +264,16 @@ class EVT3Decoder : public I_Decoder { if (is_time_shifting_enabled() && !timestamp_shift_set_) { return false; } + + // !TODO : fix this + // reset internal state, this is not enough right now, as the state will be used as is + // when decoding next events -> we should reset the state from the next events instead + std::fill(state, state + SIZE_EVTYPE, 0); + is_valid = false; + is_cd = false; + incomplete_multiword_raw_event_.clear(); + raw_events_missing_count_ = 0; + if (t >= 0) { static constexpr timestamp max_timestamp = 0xFFFFFF; const auto shifted_time = t + (is_time_shifting_enabled() ? timestamp_shift_ : 0); @@ -244,6 +283,10 @@ class EVT3Decoder : public I_Decoder { base_time_set_ = true; last_timestamp_set_ = true; return true; + } else { + base_time_set_ = false; + last_timestamp_set_ = false; + return true; } return false; } @@ -262,9 +305,9 @@ class EVT3Decoder : public I_Decoder { constexpr static uint16_t NumBitsInHighTimestampLSB = 12; constexpr static uint16_t POLARITY_MASK = 1 << (NumBitsInTimestampLSB - 1); constexpr static uint16_t NOT_POLARITY_MASK = ~(1 << (NumBitsInTimestampLSB - 1)); - uint32_t state[SIZE_EVTYPE]; - bool is_valid = false; - bool is_cd = false; + uint32_t state[SIZE_EVTYPE] = {0}; + bool is_valid = false; + bool is_cd = false; struct bitfield_timestamp { uint64_t low : NumBitsInTimestampLSB; uint64_t high : NumBitsInHighTimestampLSB; @@ -287,6 +330,66 @@ class EVT3Decoder : public I_Decoder { std::ptrdiff_t raw_events_missing_count_{0}; }; +} // namespace detail + +using EVT3Decoder = detail::EVT3Decoder; +using UnsafeEVT3Decoder = detail::EVT3Decoder; +using RobustEVT3Decoder = detail::EVT3Decoder; + +namespace { +void log_protocol_violation(const DecoderProtocolViolation &protocol_violation_type) { + std::ostringstream oss; + oss << "Evt3 protocol violation detected : " << protocol_violation_type; + + switch (protocol_violation_type) { + case DecoderProtocolViolation::NonMonotonicTimeHigh: + MV_HAL_LOG_ERROR() << oss.str(); + break; + default: + MV_HAL_LOG_WARNING() << oss.str(); + } +}; + +void throw_on_non_monotonic_time_high(const DecoderProtocolViolation &protocol_violation_type) { + std::ostringstream oss; + oss << "Evt3 protocol violation detected : " << protocol_violation_type; + + switch (protocol_violation_type) { + case DecoderProtocolViolation::NonMonotonicTimeHigh: + throw(HalException(protocol_violation_type, oss.str())); + default: + break; + } +}; +} // namespace + +inline std::unique_ptr make_evt3_decoder( + bool time_shifting_enabled, int height, int width, + const std::shared_ptr> &event_cd_decoder = std::shared_ptr>(), + const std::shared_ptr> &event_ext_trigger_decoder = + std::shared_ptr>()) { + std::unique_ptr decoder = std::make_unique(time_shifting_enabled, height, width, + event_cd_decoder, event_ext_trigger_decoder); + + if (std::getenv("MV_FLAGS_EVT3_THROW_ON_NON_MONOTONIC_TIME_HIGH") || std::getenv("MV_FLAGS_EVT3_ROBUST_DECODER")) { + MV_HAL_LOG_INFO() << "Use EVT3 Robust decoder."; + decoder = std::make_unique(time_shifting_enabled, height, width, event_cd_decoder, + event_ext_trigger_decoder); + } else if (std::getenv("MV_FLAGS_EVT3_UNSAFE_DECODER")) { + MV_HAL_LOG_INFO() << "Use EVT3 Unsafe decoder."; + decoder = std::make_unique(time_shifting_enabled, height, width, event_cd_decoder, + event_ext_trigger_decoder); + } + + decoder->add_protocol_violation_callback(log_protocol_violation); + + if (std::getenv("MV_FLAGS_EVT3_THROW_ON_NON_MONOTONIC_TIME_HIGH")) { + MV_HAL_LOG_INFO() << "Decoder will raise exception upon EVT3 Non Monotonic Time High violation."; + decoder->add_protocol_violation_callback(throw_on_non_monotonic_time_high); + } + return decoder; +} + } // namespace Future } // namespace Metavision diff --git a/hal_psee_plugins/include/devices/gen41/gen41_tz_trigger_event.h b/hal_psee_plugins/include/devices/gen41/gen41_tz_trigger_event.h index 77b61bdeb..c3326813e 100644 --- a/hal_psee_plugins/include/devices/gen41/gen41_tz_trigger_event.h +++ b/hal_psee_plugins/include/devices/gen41/gen41_tz_trigger_event.h @@ -44,12 +44,13 @@ class Gen41TzTriggerEvent : public I_TriggerIn { /// @return true if trigger in index is enabled, False otherwise bool is_enabled(uint32_t channel); -private: +protected: bool is_valid_id(uint32_t channel); - std::shared_ptr register_map_; - std::shared_ptr tzDev_; std::string prefix_; + +private: + std::shared_ptr tzDev_; const std::vector chan_ids_{Channels::TRIG_IN}; }; diff --git a/hal_psee_plugins/include/devices/imx636/imx636_evk2_issd.h b/hal_psee_plugins/include/devices/imx636/imx636_evk2_issd.h index cba4abb70..0219fcdf0 100644 --- a/hal_psee_plugins/include/devices/imx636/imx636_evk2_issd.h +++ b/hal_psee_plugins/include/devices/imx636/imx636_evk2_issd.h @@ -20,9 +20,9 @@ // sensor_version=None // args=-s evk2_imx636_cd // sensor=PseeEvk2IMX636 -// date=2022-03-15T16:17:43 -// psee_issd_version=1.2.0.182+gb2ca43260.d20210009 -// psee_sensor_lib_version=3.4.0.128+g04f3348d3.d20220024 +// date=2022-10-10T09:54:14 +// psee_issd_version=1.2.0.1685+g1b82812af +// psee_sensor_lib_version=3.4.0.1480+g29c35578c // issd_data_format_version=1.0 // clang-format off @@ -125,13 +125,17 @@ const std::vector issd_evk2_imx636_init = { RegisterOperation::Delay(200), RegisterOperation::Write(0x0010B044, 0x00000001), RegisterOperation::Write(0x0010B000, 0x00000159), + RegisterOperation::Write(0x00107008, 0x00000001), + RegisterOperation::Write(0x00107000, 0x00070001), + RegisterOperation::Write(0x00108000, 0x0001E085), RegisterOperation::Write(0x00109008, 0x0000064A), RegisterOperation::Write(0x00100044, 0xCCFFCCCF), RegisterOperation::Write(0x00100004, 0xF0005042), RegisterOperation::Write(0x00100018, 0x00000200), RegisterOperation::Write(0x00101014, 0x11A1504D), RegisterOperation::Write(0x00109004, 0x00000000), - RegisterOperation::Delay(1000) + RegisterOperation::Delay(1000), + RegisterOperation::Write(0x00109000, 0x00000200) }; const std::vector issd_evk2_imx636_start = { diff --git a/hal_psee_plugins/include/devices/imx636/imx636_evk3_issd.h b/hal_psee_plugins/include/devices/imx636/imx636_evk3_issd.h index a69452c8a..bbf221d9e 100644 --- a/hal_psee_plugins/include/devices/imx636/imx636_evk3_issd.h +++ b/hal_psee_plugins/include/devices/imx636/imx636_evk3_issd.h @@ -20,9 +20,9 @@ // sensor_version=None // args=-s evk3_imx636_cd // sensor=PseeEvk3IMX636 -// date=2022-03-15T12:30:57 -// psee_issd_version=1.2.0.126+gc69d7e811 -// psee_sensor_lib_version=3.4.0.122+g035d29760 +// date=2022-10-10T09:54:14 +// psee_issd_version=1.2.0.1685+g1b82812af +// psee_sensor_lib_version=3.4.0.1480+g29c35578c // issd_data_format_version=1.0 // clang-format off @@ -103,12 +103,16 @@ const std::vector issd_evk3_imx636_init = { RegisterOperation::Delay(200), RegisterOperation::Write(0x0000B044, 0x00000001), RegisterOperation::Write(0x0000B000, 0x000002F9), + RegisterOperation::Write(0x00007008, 0x00000001), + RegisterOperation::Write(0x00007000, 0x00070001), + RegisterOperation::Write(0x00008000, 0x0001E085), RegisterOperation::Write(0x00009008, 0x00000644), RegisterOperation::Write(0x00000004, 0xF0005042), RegisterOperation::Write(0x00000018, 0x00000200), RegisterOperation::Write(0x00001014, 0x11A1504D), RegisterOperation::Write(0x00009004, 0x00000000), - RegisterOperation::Delay(1000) + RegisterOperation::Delay(1000), + RegisterOperation::Write(0x00009000, 0x00000200) }; const std::vector issd_evk3_imx636_start = { diff --git a/hal_psee_plugins/include/devices/imx636/imx636_tz_trigger_event.h b/hal_psee_plugins/include/devices/imx636/imx636_tz_trigger_event.h new file mode 100644 index 000000000..c6ca983a8 --- /dev/null +++ b/hal_psee_plugins/include/devices/imx636/imx636_tz_trigger_event.h @@ -0,0 +1,44 @@ +/********************************************************************************************************************** + * Copyright (c) Prophesee S.A. * + * * + * Licensed under the Apache License, Version 2.0 (the "License"); * + * you may not use this file except in compliance with the License. * + * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed * + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * + * See the License for the specific language governing permissions and limitations under the License. * + **********************************************************************************************************************/ + +#ifndef METAVISION_HAL_IMX636_TRIGGER_EVENT_H +#define METAVISION_HAL_IMX636_TRIGGER_EVENT_H + +#include +#include +#include + +#include "devices/gen41/gen41_tz_trigger_event.h" + +namespace Metavision { + +class RegisterMap; +class TzDevice; + +class Imx636TzTriggerEvent : public Gen41TzTriggerEvent { +public: + /// @brief Constructor + Imx636TzTriggerEvent(const std::shared_ptr ®ister_map, const std::string &prefix, + const std::shared_ptr tzDev); + + /// @brief Enables external trigger monitoring + /// @param channel External trigger's channel + bool enable(uint32_t channel) override; + + /// @brief Checks if trigger in index is enabled + /// @param channel External trigger's channel + /// @return true if trigger in index is enabled, False otherwise + bool is_enabled(uint32_t channel) override; +}; + +} // namespace Metavision + +#endif // METAVISION_HAL_IMX636_TRIGGER_EVENT_H diff --git a/hal_psee_plugins/include/devices/treuzell/tz_device.h b/hal_psee_plugins/include/devices/treuzell/tz_device.h index fb7eb04f9..b8042b633 100644 --- a/hal_psee_plugins/include/devices/treuzell/tz_device.h +++ b/hal_psee_plugins/include/devices/treuzell/tz_device.h @@ -57,11 +57,16 @@ class TzDevice : public std::enable_shared_from_this { friend TzDeviceBuilder; }; +class TzRegisterBuildMethod; class TzDeviceBuilder { public: using Build_Fun = std::function(std::shared_ptr, uint32_t id, std::shared_ptr parent)>; using Check_Fun = std::function, uint32_t id)>; + using Build_Map = std::unordered_map>; + + TzDeviceBuilder() : map(generic_map()) {} + void insert(std::string key, Build_Fun method, Check_Fun buildable = nullptr) { map.insert({key, {method, buildable}}); } @@ -86,8 +91,18 @@ class TzDeviceBuilder { const DeviceConfig &config); private: - std::unordered_map> map; + Build_Map map; + static Build_Map &generic_map(); friend TzDevice; + friend TzRegisterBuildMethod; +}; + +class TzRegisterBuildMethod { +public: + TzRegisterBuildMethod(std::string key, TzDeviceBuilder::Build_Fun method, + TzDeviceBuilder::Check_Fun buildable = nullptr) { + TzDeviceBuilder::generic_map().insert({key, {method, buildable}}); + } }; } // namespace Metavision diff --git a/hal_psee_plugins/lib/CMakeLists.txt b/hal_psee_plugins/lib/CMakeLists.txt index 976dbdbef..9b58cc784 100644 --- a/hal_psee_plugins/lib/CMakeLists.txt +++ b/hal_psee_plugins/lib/CMakeLists.txt @@ -25,6 +25,7 @@ if (NOT ANDROID) metavision_hal_treuzell_protocol_obj metavision_hal_ccam3_obj metavision_hal_psee_video_obj + metavision_hal_psee_video_build_obj metavision_hal_ti_tmp103_obj metavision_hal_gen31_fx3_system_obj metavision_hal_gen31_evk2_system_obj @@ -141,29 +142,24 @@ foreach(plugin ${plugin_list}) list(APPEND hal_psee_plugins_target_file_list $) - if(NOT plugin STREQUAL "hal_plugin_prophesee") - # instead of setting the RUNTIME/LIBRARY_OUTPUT_DIRECTORY property on the target, we manually copy - # the library : this will work for linux and windows and avoid the automatic copy of the DLLs the - # plugin depends on by MSVC - add_custom_command(TARGET ${plugin} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E make_directory "${HAL_BUILD_PLUGIN_PATH}" - COMMAND ${CMAKE_COMMAND} -E copy "$" "${HAL_BUILD_PLUGIN_PATH}") - - list(APPEND hal_psee_plugins_target_file_list "${HAL_BUILD_PLUGIN_PATH}/$") - + if(plugin STREQUAL "hal_plugin_prophesee") + set(HAL_COPY_PLUGIN_PATH "${HAL_BUILD_PLUGIN_PATH}/universal") + else() + set(HAL_COPY_PLUGIN_PATH "${HAL_BUILD_PLUGIN_PATH}") install(TARGETS ${plugin} LIBRARY DESTINATION "${HAL_INSTALL_PLUGIN_RELATIVE_PATH}" COMPONENT metavision-hal-prophesee-plugins RUNTIME DESTINATION "${HAL_INSTALL_PLUGIN_RELATIVE_PATH}" COMPONENT metavision-hal-prophesee-plugins #ARCHIVE : we don't want to install .lib files for the plugins, it's useless ) - else() - # We put the Universal plugin in a separate folder, and don't install it with Metavision - add_custom_command(TARGET ${plugin} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E make_directory "${HAL_BUILD_PLUGIN_PATH}_universal" - COMMAND ${CMAKE_COMMAND} -E copy "$" "${HAL_BUILD_PLUGIN_PATH}_universal") - - list(APPEND hal_psee_plugins_target_file_list "${HAL_BUILD_PLUGIN_PATH}_universal/$") endif() + # instead of setting the RUNTIME/LIBRARY_OUTPUT_DIRECTORY property on the target, we manually copy + # the library : this will work for linux and windows and avoid the automatic copy of the DLLs the + # plugin depends on by MSVC + add_custom_command(TARGET ${plugin} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E make_directory "${HAL_COPY_PLUGIN_PATH}" + COMMAND ${CMAKE_COMMAND} -E copy "$" "${HAL_COPY_PLUGIN_PATH}") + + list(APPEND hal_psee_plugins_target_file_list "${HAL_COPY_PLUGIN_PATH}/$") endforeach() diff --git a/hal_psee_plugins/src/boards/fx3/fx3_libusb_board_command.cpp b/hal_psee_plugins/src/boards/fx3/fx3_libusb_board_command.cpp index 467c41ab1..aed8ff6d5 100644 --- a/hal_psee_plugins/src/boards/fx3/fx3_libusb_board_command.cpp +++ b/hal_psee_plugins/src/boards/fx3/fx3_libusb_board_command.cpp @@ -176,4 +176,4 @@ void Fx3LibUSBBoardCommand::get_all_serial(libusb_context *ctx, ListSerial &lser } libusb_free_device_list(devs, 1); // free the list, unref the devices in it } -} // namespace Metavision \ No newline at end of file +} // namespace Metavision diff --git a/hal_psee_plugins/src/boards/rawfile/psee_file_discovery.cpp b/hal_psee_plugins/src/boards/rawfile/psee_file_discovery.cpp index 46f35fe04..a8c81e48e 100644 --- a/hal_psee_plugins/src/boards/rawfile/psee_file_discovery.cpp +++ b/hal_psee_plugins/src/boards/rawfile/psee_file_discovery.cpp @@ -55,8 +55,9 @@ bool PseeFileDiscovery::discover(DeviceBuilder &device_builder, std::unique_ptr< { std::shared_ptr decoder; if (format == "EVT3" && i_geometry) { - decoder = device_builder.add_facility(std::make_unique( - file_config.do_time_shifting_, i_geometry->get_height(), cd_decoder, ext_trig_decoder)); + decoder = device_builder.add_facility( + Future::make_evt3_decoder(file_config.do_time_shifting_, i_geometry->get_height(), + i_geometry->get_width(), cd_decoder, ext_trig_decoder)); } else if (format == "EVT2") { decoder = device_builder.add_facility( std::make_unique(file_config.do_time_shifting_, cd_decoder, ext_trig_decoder)); @@ -71,8 +72,9 @@ bool PseeFileDiscovery::discover(DeviceBuilder &device_builder, std::unique_ptr< { std::shared_ptr decoder; if (format == "EVT3" && i_geometry) { - decoder = device_builder.add_facility(std::make_unique( - file_config.do_time_shifting_, i_geometry->get_height(), cd_decoder, ext_trig_decoder)); + decoder = device_builder.add_facility( + make_evt3_decoder(file_config.do_time_shifting_, i_geometry->get_height(), i_geometry->get_width(), + cd_decoder, ext_trig_decoder)); } else if (format == "EVT2") { decoder = device_builder.add_facility( std::make_unique(file_config.do_time_shifting_, cd_decoder, ext_trig_decoder)); diff --git a/hal_psee_plugins/src/boards/treuzell/tz_board_data_transfer.cpp b/hal_psee_plugins/src/boards/treuzell/tz_board_data_transfer.cpp index cd1659d9c..dcf6d4666 100644 --- a/hal_psee_plugins/src/boards/treuzell/tz_board_data_transfer.cpp +++ b/hal_psee_plugins/src/boards/treuzell/tz_board_data_transfer.cpp @@ -10,6 +10,7 @@ **********************************************************************************************************************/ #include +#include #ifdef _WIN32 #ifndef _MSC_VER @@ -28,18 +29,39 @@ #include "metavision/hal/utils/hal_log.h" const static int USB_TIME_OUT = 100; -static const int N_ASYNC_TRANFERS_PER_DEVICE = 20; +const static int N_ASYNC_TRANFERS_PER_DEVICE = 20; const static int PACKET_SIZE = 128 * 1024; namespace Metavision { -uint32_t TzBoardDataTransfer::timeout_cnt_; -TzBoardDataTransfer::TzBoardDataTransfer(const std::shared_ptr &cmd, - uint32_t raw_event_size_bytes) : - DataTransfer(raw_event_size_bytes), cmd_(cmd) { - flush(); +namespace { +size_t get_envar_or_default(const std::string &envvar, size_t default_val) { + size_t val = default_val; + try { + auto *envar_value = getenv(envvar.c_str()); + if (envar_value) { + std::stringstream ss(envar_value); + ss >> val; + } + } catch (...) {} + return val; +} + +size_t get_async_transfer_number() { + return get_envar_or_default("MV_PSEE_DEBUG_PLUGIN_USB_ASYNC_TRANSFER", N_ASYNC_TRANFERS_PER_DEVICE); } +size_t get_packet_size() { + return get_envar_or_default("MV_PSEE_DEBUG_PLUGIN_USB_PACKET_SIZE", PACKET_SIZE); +} + +size_t get_time_out() { + return get_envar_or_default("MV_PSEE_DEBUG_PLUGIN_USB_TIME_OUT", USB_TIME_OUT); +} + +} // namespace + +uint32_t TzBoardDataTransfer::timeout_cnt_; void TzBoardDataTransfer::preprocess_transfer(libusb_transfer *transfer) { if (transfer->status == LIBUSB_TRANSFER_TIMED_OUT) { if (transfer->actual_length != 0) { @@ -70,7 +92,8 @@ class TzBoardDataTransfer::UserParamForAsyncBulkCallback { private: bool proceed_async_bulk(struct libusb_transfer *transfer); - const static int timeout_ = USB_TIME_OUT; + const static size_t timeout_; + DataTransfer::BufferPtr buf_; std::mutex transfer_mutex_; libusb_transfer *transfer_{nullptr}; @@ -80,17 +103,44 @@ class TzBoardDataTransfer::UserParamForAsyncBulkCallback { TzBoardDataTransfer &libusb_data_transfer_; }; +const size_t TzBoardDataTransfer::packet_size_ = get_packet_size(); +const size_t TzBoardDataTransfer::async_transfer_num_ = get_async_transfer_number(); +const size_t TzBoardDataTransfer::UserParamForAsyncBulkCallback::timeout_ = get_time_out(); + +DataTransfer::BufferPool TzBoardDataTransfer::make_buffer_pool(size_t default_pool_byte_size) { + DataTransfer::BufferPool pool = DataTransfer::BufferPool::make_unbounded(async_transfer_num_, get_packet_size()); + auto buffer_pool_byte_size = + get_envar_or_default("MV_PSEE_PLUGIN_DATA_TRANSFER_BUFFER_POOL_BYTE_SIZE", default_pool_byte_size); + if (buffer_pool_byte_size) { + auto num_obj_pool = buffer_pool_byte_size / packet_size_; + MV_HAL_LOG_INFO() << "Creating Fixed size data pool of : " << num_obj_pool << "x" << packet_size_ << "B"; + pool = DataTransfer::BufferPool::make_bounded(num_obj_pool, packet_size_); + } + + return pool; +} + +TzBoardDataTransfer::TzBoardDataTransfer(const std::shared_ptr &cmd, + uint32_t raw_event_size_bytes, const DataTransfer::BufferPool &buffer_pool) : + DataTransfer(raw_event_size_bytes, buffer_pool, true), cmd_(cmd) { + flush(); +} + TzBoardDataTransfer::~TzBoardDataTransfer() { stop_impl(); } void TzBoardDataTransfer::start_impl(BufferPtr buffer) { + buffer.reset(); // we don't use the buffer here... let's put it back in the pool initiate_async_transfers(); } void TzBoardDataTransfer::run_impl() { MV_HAL_LOG_TRACE() << "poll thread running"; while (!should_stop() && active_bulks_transfers_ > 0) { + // Ensure we'll have sufficient space to handle all transfers on the next iteration + get_buffer_pool().arrange(async_transfer_num_, packet_size_); + struct timeval tv = {0, 1}; libusb_handle_events_timeout(cmd_->libusb_ctx->ctx(), &tv); } @@ -106,7 +156,7 @@ void TzBoardDataTransfer::stop_impl() { } void TzBoardDataTransfer::initiate_async_transfers() { - for (int i = 0; i < N_ASYNC_TRANFERS_PER_DEVICE; ++i) { + for (size_t i = 0; i < async_transfer_num_; ++i) { vtransfer_.push_back(std::make_unique(i, cmd_, *this)); vtransfer_.back()->start(); } @@ -119,10 +169,9 @@ void TzBoardDataTransfer::release_async_transfers() { TzBoardDataTransfer::UserParamForAsyncBulkCallback::UserParamForAsyncBulkCallback( int id, const std::shared_ptr &cmd, TzBoardDataTransfer &libusb_data_transfer) : cmd_(cmd), libusb_data_transfer_(libusb_data_transfer) { - buf_ = libusb_data_transfer.get_buffer(); - buf_->resize(PACKET_SIZE); - transfer_ = - libusb_data_transfer.contruct_async_bulk_transfer(buf_->data(), PACKET_SIZE, async_bulk_cb, this, timeout_); + buf_ = libusb_data_transfer.get_buffer(); + transfer_ = libusb_data_transfer.contruct_async_bulk_transfer(buf_->data(), libusb_data_transfer.packet_size_, + async_bulk_cb, this, timeout_); } TzBoardDataTransfer::UserParamForAsyncBulkCallback::~UserParamForAsyncBulkCallback() { @@ -190,11 +239,13 @@ bool TzBoardDataTransfer::UserParamForAsyncBulkCallback::proceed_async_bulk(stru } buf_->resize(transfer->actual_length - remainder); + auto next_buf = libusb_data_transfer_.transfer_data(buf_); - next_buf->resize(PACKET_SIZE); - transfer->buffer = next_buf->data(); - buf_ = next_buf; + buf_ = next_buf; + buf_->resize(libusb_data_transfer_.packet_size_); + + transfer->buffer = buf_->data(); int r = submit_transfer(transfer); if (r != 0) { MV_HAL_LOG_ERROR() << "Resubmit error after transfer OK"; diff --git a/hal_psee_plugins/src/boards/treuzell/tz_camera_discovery.cpp b/hal_psee_plugins/src/boards/treuzell/tz_camera_discovery.cpp index e83810d86..78994bf35 100644 --- a/hal_psee_plugins/src/boards/treuzell/tz_camera_discovery.cpp +++ b/hal_psee_plugins/src/boards/treuzell/tz_camera_discovery.cpp @@ -17,8 +17,6 @@ #include "boards/treuzell/tz_camera_discovery.h" #include "boards/treuzell/tz_libusb_board_command.h" -#include "utils/device_builder_factory.h" -#include "devices/utils/device_system_id.h" #include "metavision/hal/utils/hal_exception.h" #include "utils/psee_hal_plugin_error_code.h" #include "metavision/hal/utils/hal_log.h" @@ -89,10 +87,10 @@ bool TzCameraDiscovery::discover(DeviceBuilder &device_builder, const std::strin for (auto board : boards) { if (serial != "" && (board->get_serial() != serial)) continue; - if (board->get_board_speed() < LIBUSB_SPEED_SUPER) { - MV_HAL_LOG_ERROR() << "Your EVK camera" << serial - << "isn't connected in USB3. Please check your connection."; - continue; + const long kLibUSBSpeedSuper = 5000; + if (board->get_board_speed() < kLibUSBSpeedSuper) { + MV_HAL_LOG_WARNING() << "Your EVK camera" << serial + << "isn't connected in USB3. Please check your connection."; } return builder->build_devices(board, device_builder, config); } diff --git a/hal_psee_plugins/src/boards/treuzell/tz_libusb_board_command.cpp b/hal_psee_plugins/src/boards/treuzell/tz_libusb_board_command.cpp index a846dbff7..ab8056540 100644 --- a/hal_psee_plugins/src/boards/treuzell/tz_libusb_board_command.cpp +++ b/hal_psee_plugins/src/boards/treuzell/tz_libusb_board_command.cpp @@ -18,6 +18,7 @@ #endif #include #include +#include #include "metavision/hal/utils/hal_log.h" #include "boards/utils/config_registers_map.h" @@ -136,6 +137,19 @@ TzLibUSBBoardCommand::TzLibUSBBoardCommand(std::shared_ptr ctx, l transfer_tz_frame(req); build_date = req.get64(0); } catch (const std::system_error &e) { MV_HAL_LOG_TRACE() << "Got no build date:" << e.what(); } + + // Add a warning if using an Evk3/4 with a too old firmware + static std::unordered_set outdated_fw_warning_map; + if ((desc.idVendor == 0x04b4) && ((desc.idProduct == 0x00f4) || (desc.idProduct == 0x00f5))) { + if (version < 0x30800) { + const std::string &serial = get_serial(); + if (outdated_fw_warning_map.count(serial) == 0) { + MV_HAL_LOG_WARNING() << "The EVK camera with serial" << serial + << "is using an old firmware version. Please upgrade to latest version."; + outdated_fw_warning_map.insert(serial); + } + } + } } TzLibUSBBoardCommand::~TzLibUSBBoardCommand() { diff --git a/hal_psee_plugins/src/boards/utils/psee_libusb_data_transfer.cpp b/hal_psee_plugins/src/boards/utils/psee_libusb_data_transfer.cpp index 95e2a4e56..2954a15d2 100644 --- a/hal_psee_plugins/src/boards/utils/psee_libusb_data_transfer.cpp +++ b/hal_psee_plugins/src/boards/utils/psee_libusb_data_transfer.cpp @@ -10,6 +10,8 @@ **********************************************************************************************************************/ #include +#include +#include #ifdef _WIN32 #ifndef _MSC_VER @@ -28,14 +30,41 @@ #include "metavision/hal/utils/hal_log.h" const static int USB_TIME_OUT = 100; -static const int N_ASYNC_TRANFERS_PER_DEVICE = 20; +const static int N_ASYNC_TRANFERS_PER_DEVICE = 20; const static int PACKET_SIZE = 128 * 1024; namespace Metavision { +namespace { +size_t get_envar_or_default(const std::string &envvar, size_t default_val) { + size_t val = default_val; + try { + auto *envar_value = getenv(envvar.c_str()); + if (envar_value) { + std::stringstream ss(envar_value); + ss >> val; + } + } catch (...) {} + return val; +} + +size_t get_async_transfer_number() { + return get_envar_or_default("MV_PSEE_DEBUG_PLUGIN_USB_ASYNC_TRANSFER", N_ASYNC_TRANFERS_PER_DEVICE); +} + +size_t get_packet_size() { + return get_envar_or_default("MV_PSEE_DEBUG_PLUGIN_USB_PACKET_SIZE", PACKET_SIZE); +} + +size_t get_time_out() { + return get_envar_or_default("MV_PSEE_DEBUG_PLUGIN_USB_TIME_OUT", USB_TIME_OUT); +} + +} // namespace + class PseeLibUSBDataTransfer::UserParamForAsyncBulkCallback { public: - UserParamForAsyncBulkCallback(int id, const std::shared_ptr &cmd, + UserParamForAsyncBulkCallback(const std::shared_ptr &cmd, PseeLibUSBDataTransfer &libusb_data_transfer); ~UserParamForAsyncBulkCallback(); static void WIN_CALLBACK_DECL async_bulk_cb(struct libusb_transfer *transfer); @@ -46,7 +75,8 @@ class PseeLibUSBDataTransfer::UserParamForAsyncBulkCallback { private: bool proceed_async_bulk(struct libusb_transfer *transfer); - const static int timeout_ = USB_TIME_OUT; + const static size_t timeout_; + DataTransfer::BufferPtr buf_; std::mutex transfer_mutex_; libusb_transfer *transfer_{nullptr}; @@ -56,9 +86,28 @@ class PseeLibUSBDataTransfer::UserParamForAsyncBulkCallback { PseeLibUSBDataTransfer &libusb_data_transfer_; }; +const size_t PseeLibUSBDataTransfer::packet_size_ = get_packet_size(); +const size_t PseeLibUSBDataTransfer::async_transfer_num_ = get_async_transfer_number(); +const size_t PseeLibUSBDataTransfer::UserParamForAsyncBulkCallback::timeout_ = get_time_out(); + +DataTransfer::BufferPool PseeLibUSBDataTransfer::make_buffer_pool(size_t default_pool_byte_size) { + DataTransfer::BufferPool pool = + DataTransfer::BufferPool::make_unbounded(PseeLibUSBDataTransfer::async_transfer_num_, get_packet_size()); + auto buffer_pool_byte_size = + get_envar_or_default("MV_PSEE_PLUGIN_DATA_TRANSFER_BUFFER_POOL_BYTE_SIZE", default_pool_byte_size); + if (buffer_pool_byte_size) { + auto num_obj_pool = buffer_pool_byte_size / packet_size_; + MV_HAL_LOG_INFO() << "Creating Fixed size data pool of : " << num_obj_pool << "x" << packet_size_ << "B"; + pool = DataTransfer::BufferPool::make_bounded(num_obj_pool, packet_size_); + } + + return pool; +} + PseeLibUSBDataTransfer::PseeLibUSBDataTransfer(const std::shared_ptr &cmd, - uint32_t raw_event_size_bytes) : - DataTransfer(raw_event_size_bytes), cmd_(cmd) {} + uint32_t raw_event_size_bytes, + const DataTransfer::BufferPool &buffer_pool) : + DataTransfer(raw_event_size_bytes, buffer_pool, true), cmd_(cmd) {} PseeLibUSBDataTransfer::~PseeLibUSBDataTransfer() { stop_impl(); @@ -66,14 +115,18 @@ PseeLibUSBDataTransfer::~PseeLibUSBDataTransfer() { } void PseeLibUSBDataTransfer::start_impl(BufferPtr buffer) { + buffer.reset(); // we don't use the buffer here... let's put it back in the pool initiate_async_transfers(); } void PseeLibUSBDataTransfer::run_impl() { MV_HAL_LOG_TRACE() << "poll thread running"; while (!should_stop() && active_bulks_transfers_ > 0) { + // Ensure we'll have sufficient space to handle all transfers on the next iteration + get_buffer_pool().arrange(async_transfer_num_, packet_size_); + struct timeval tv = {0, 1}; - libusb_handle_events_timeout(nullptr, &tv); + libusb_handle_events_timeout_completed(nullptr, &tv, nullptr); } MV_HAL_LOG_TRACE() << "poll thread shutting down"; @@ -87,10 +140,11 @@ void PseeLibUSBDataTransfer::stop_impl() { } void PseeLibUSBDataTransfer::initiate_async_transfers() { - for (int i = 0; i < N_ASYNC_TRANFERS_PER_DEVICE; ++i) { - vtransfer_.push_back(std::make_unique(i, cmd_, *this)); - vtransfer_.back()->start(); - } + std::generate_n(std::back_inserter(vtransfer_), async_transfer_num_, [this]() { + auto user_param = std::make_unique(cmd_, *this); + user_param->start(); + return user_param; + }); } void PseeLibUSBDataTransfer::release_async_transfers() { @@ -98,11 +152,11 @@ void PseeLibUSBDataTransfer::release_async_transfers() { } PseeLibUSBDataTransfer::UserParamForAsyncBulkCallback::UserParamForAsyncBulkCallback( - int id, const std::shared_ptr &cmd, PseeLibUSBDataTransfer &libusb_data_transfer) : + const std::shared_ptr &cmd, PseeLibUSBDataTransfer &libusb_data_transfer) : cmd_(cmd), libusb_data_transfer_(libusb_data_transfer) { - buf_ = libusb_data_transfer.get_buffer(); - buf_->resize(PACKET_SIZE); - transfer_ = cmd->contruct_async_bulk_transfer(buf_->data(), PACKET_SIZE, async_bulk_cb, this, timeout_); + buf_ = libusb_data_transfer.get_buffer(); + transfer_ = cmd->contruct_async_bulk_transfer(buf_->data(), libusb_data_transfer.packet_size_, async_bulk_cb, this, + timeout_); } PseeLibUSBDataTransfer::UserParamForAsyncBulkCallback::~UserParamForAsyncBulkCallback() { @@ -135,7 +189,7 @@ void WIN_CALLBACK_DECL void PseeLibUSBDataTransfer::preprocess_transfer(libusb_transfer *) {} -bool PseeLibUSBDataTransfer::UserParamForAsyncBulkCallback::proceed_async_bulk(struct libusb_transfer *transfer) { +bool PseeLibUSBDataTransfer::UserParamForAsyncBulkCallback::proceed_async_bulk(libusb_transfer *transfer) { std::lock_guard lock(transfer_mutex_); assert(transfer == transfer_); @@ -172,11 +226,13 @@ bool PseeLibUSBDataTransfer::UserParamForAsyncBulkCallback::proceed_async_bulk(s } buf_->resize(transfer->actual_length - remainder); - auto next_buf = libusb_data_transfer_.transfer_data(buf_); - next_buf->resize(PACKET_SIZE); - transfer->buffer = next_buf->data(); - buf_ = next_buf; + auto transfered_data = libusb_data_transfer_.transfer_data(buf_); + + buf_ = transfered_data; + buf_->resize(libusb_data_transfer_.packet_size_); + + transfer->buffer = buf_->data(); int r = cmd_->submit_transfer(transfer); if (r != 0) { MV_HAL_LOG_ERROR() << "Resubmit error after transfer OK"; diff --git a/hal_psee_plugins/src/devices/gen3/gen3_trigger_event.cpp b/hal_psee_plugins/src/devices/gen3/gen3_trigger_event.cpp index f77afabc4..fc7cc4c2b 100644 --- a/hal_psee_plugins/src/devices/gen3/gen3_trigger_event.cpp +++ b/hal_psee_plugins/src/devices/gen3/gen3_trigger_event.cpp @@ -53,10 +53,10 @@ bool Gen3TriggerEvent::disable(uint32_t channel) { return true; } -bool Gen3TriggerEvent::is_enabled(uint32_t index) { - if (index != 0 && index != 6 && index != 7) { +bool Gen3TriggerEvent::is_enabled(uint32_t channel) { + if (channel != 0 && channel != 6 && channel != 7) { return false; } - return icmd_->read_register_bit(base_address_ + CCAM3_SYSTEM_MONITOR_EXT_TRIGGERS_ENABLE_ADDR, index); + return icmd_->read_register_bit(base_address_ + CCAM3_SYSTEM_MONITOR_EXT_TRIGGERS_ENABLE_ADDR, channel); } } // namespace Metavision diff --git a/hal_psee_plugins/src/devices/gen31/gen31_ccam5_trigger_event.cpp b/hal_psee_plugins/src/devices/gen31/gen31_ccam5_trigger_event.cpp index cdd5efa10..423685c7c 100644 --- a/hal_psee_plugins/src/devices/gen31/gen31_ccam5_trigger_event.cpp +++ b/hal_psee_plugins/src/devices/gen31/gen31_ccam5_trigger_event.cpp @@ -40,12 +40,12 @@ bool Gen31Ccam5TriggerEvent::disable(uint32_t channel) { return true; } -bool Gen31Ccam5TriggerEvent::is_enabled(uint32_t index) { - if (index != 0 && index != 6) { +bool Gen31Ccam5TriggerEvent::is_enabled(uint32_t channel) { + if (channel != 0 && channel != 6) { return false; } - return (*register_map_)["SYSTEM_MONITOR/EXT_TRIGGERS/ENABLE"]["TRIGGER_" + std::to_string(index)].read_value(); + return (*register_map_)["SYSTEM_MONITOR/EXT_TRIGGERS/ENABLE"]["TRIGGER_" + std::to_string(channel)].read_value(); } } // namespace Metavision diff --git a/hal_psee_plugins/src/devices/gen31/gen31_ccam5_tz_device.cpp b/hal_psee_plugins/src/devices/gen31/gen31_ccam5_tz_device.cpp index b8375835e..6d33be49a 100644 --- a/hal_psee_plugins/src/devices/gen31/gen31_ccam5_tz_device.cpp +++ b/hal_psee_plugins/src/devices/gen31/gen31_ccam5_tz_device.cpp @@ -58,6 +58,7 @@ std::shared_ptr TzCcam5Gen31::build(std::shared_ptr(cmd, dev_id, parent); } +static TzRegisterBuildMethod method("psee,ccam5_fpga", TzCcam5Gen31::build); void TzCcam5Gen31::spawn_facilities(DeviceBuilder &device_builder) { device_builder.add_facility(std::make_unique(register_map, shared_from_this())); diff --git a/hal_psee_plugins/src/devices/gen31/gen31_ll_biases.cpp b/hal_psee_plugins/src/devices/gen31/gen31_ll_biases.cpp index 9c6fa3de9..3269e79cb 100644 --- a/hal_psee_plugins/src/devices/gen31/gen31_ll_biases.cpp +++ b/hal_psee_plugins/src/devices/gen31/gen31_ll_biases.cpp @@ -368,7 +368,7 @@ int get_inv_idac_values(CCam3BiasEncoding value, } long get_ccam3_gen31_bias_encoding(const Gen31LLBias &bias, int bias_value) { - // if idacsisley an,d current mode we read the encode from a specikic file + // if idacsisley an,d current mode we read the encode from a specific file init_map_idac(); std::map *mvtocode = NULL; switch (bias.get_bias_type()) { diff --git a/hal_psee_plugins/src/devices/gen31/gen31_trigger_event.cpp b/hal_psee_plugins/src/devices/gen31/gen31_trigger_event.cpp index f969f8d15..9f56cbfd6 100644 --- a/hal_psee_plugins/src/devices/gen31/gen31_trigger_event.cpp +++ b/hal_psee_plugins/src/devices/gen31/gen31_trigger_event.cpp @@ -45,12 +45,12 @@ bool Gen31TriggerEvent::disable(uint32_t channel) { return true; } -bool Gen31TriggerEvent::is_enabled(uint32_t index) { - if (index != 0 && index != 6 && index != 7) { +bool Gen31TriggerEvent::is_enabled(uint32_t channel) { + if (channel != 0 && channel != 6 && channel != 7) { return false; } - return (*register_map_)["SYSTEM_MONITOR/EXT_TRIGGERS/ENABLE"]["TRIGGER_" + std::to_string(index)].read_value(); + return (*register_map_)["SYSTEM_MONITOR/EXT_TRIGGERS/ENABLE"]["TRIGGER_" + std::to_string(channel)].read_value(); } } // namespace Metavision diff --git a/hal_psee_plugins/src/devices/gen41/gen41_tz_device.cpp b/hal_psee_plugins/src/devices/gen41/gen41_tz_device.cpp index 0fb8525d9..bb872e8c9 100644 --- a/hal_psee_plugins/src/devices/gen41/gen41_tz_device.cpp +++ b/hal_psee_plugins/src/devices/gen41/gen41_tz_device.cpp @@ -59,6 +59,7 @@ std::shared_ptr TzGen41::build(std::shared_ptr c return nullptr; } } +static TzRegisterBuildMethod method("psee,ccam5_gen41", TzGen41::build, TzGen41::can_build); bool TzGen41::can_build(std::shared_ptr cmd, uint32_t dev_id) { auto ret = cmd->read_device_register(dev_id, 0x14)[0]; diff --git a/hal_psee_plugins/src/devices/imx636/CMakeLists.txt b/hal_psee_plugins/src/devices/imx636/CMakeLists.txt index 03fb67020..c638d8142 100644 --- a/hal_psee_plugins/src/devices/imx636/CMakeLists.txt +++ b/hal_psee_plugins/src/devices/imx636/CMakeLists.txt @@ -9,6 +9,7 @@ target_sources(metavision_hal_imx636_camera_obj PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/imx636_ll_biases.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/imx636_tz_trigger_event.cpp ) target_sources(metavision_hal_imx636_evk2_system_obj PRIVATE diff --git a/hal_psee_plugins/src/devices/imx636/imx636_tz_device.cpp b/hal_psee_plugins/src/devices/imx636/imx636_tz_device.cpp index ba3e98025..651664871 100644 --- a/hal_psee_plugins/src/devices/imx636/imx636_tz_device.cpp +++ b/hal_psee_plugins/src/devices/imx636/imx636_tz_device.cpp @@ -25,7 +25,7 @@ #include "devices/gen41/gen41_noise_filter_module.h" #include "devices/gen41/gen41_roi_command.h" #include "devices/imx636/imx636_evk3_regmap_builder.h" -#include "devices/gen41/gen41_tz_trigger_event.h" +#include "devices/imx636/imx636_tz_trigger_event.h" #include "facilities/psee_hw_register.h" #include "geometries/hd_geometry.h" #include "metavision/hal/facilities/i_events_stream.h" @@ -62,6 +62,8 @@ std::shared_ptr TzImx636::build(std::shared_ptr return nullptr; } } +static TzRegisterBuildMethod method0("psee,ccam5_gen42", TzImx636::build, TzImx636::can_build); +static TzRegisterBuildMethod method1("psee,ccam5_imx636", TzImx636::build, TzImx636::can_build); bool TzImx636::can_build(std::shared_ptr cmd, uint32_t dev_id) { return (cmd->read_device_register(dev_id, 0x14)[0] == 0xA0401806); @@ -85,7 +87,8 @@ void TzImx636::spawn_facilities(DeviceBuilder &device_builder) { device_builder.add_facility( std::make_unique(geometry.get_width(), geometry.get_height(), register_map, SENSOR_PREFIX)); - device_builder.add_facility(std::make_unique(register_map, SENSOR_PREFIX, shared_from_this())); + device_builder.add_facility( + std::make_unique(register_map, SENSOR_PREFIX, shared_from_this())); } TzImx636::~TzImx636() {} diff --git a/hal_psee_plugins/src/devices/imx636/imx636_tz_trigger_event.cpp b/hal_psee_plugins/src/devices/imx636/imx636_tz_trigger_event.cpp new file mode 100644 index 000000000..f4fa601b0 --- /dev/null +++ b/hal_psee_plugins/src/devices/imx636/imx636_tz_trigger_event.cpp @@ -0,0 +1,44 @@ +/********************************************************************************************************************** + * Copyright (c) Prophesee S.A. * + * * + * Licensed under the Apache License, Version 2.0 (the "License"); * + * you may not use this file except in compliance with the License. * + * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed * + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * + * See the License for the specific language governing permissions and limitations under the License. * + **********************************************************************************************************************/ + +#include "devices/imx636/imx636_tz_trigger_event.h" +#include "utils/register_map.h" + +using vfield = std::map; + +namespace Metavision { + +Imx636TzTriggerEvent::Imx636TzTriggerEvent(const std::shared_ptr ®ister_map, const std::string &prefix, + const std::shared_ptr tzDev) : + Gen41TzTriggerEvent(register_map, prefix, tzDev) {} + +bool Imx636TzTriggerEvent::enable(uint32_t channel) { + bool valid = is_valid_id(channel); + long read_val = 0; + long value = 0; + + if (valid) { + (*register_map_)[prefix_ + "edf/Reserved_7004"]["Reserved_10"].write_value(1); + } + return valid; +} + +bool Imx636TzTriggerEvent::is_enabled(uint32_t channel) { + bool valid = is_valid_id(channel); + long value = 0; + + if (valid) { + value = (*register_map_)[prefix_ + "edf/Reserved_7004"]["Reserved_10"].read_value(); + } + return valid && (value == 1); +} + +} // namespace Metavision diff --git a/hal_psee_plugins/src/devices/treuzell/CMakeLists.txt b/hal_psee_plugins/src/devices/treuzell/CMakeLists.txt index fb06dd6db..88c3c9815 100644 --- a/hal_psee_plugins/src/devices/treuzell/CMakeLists.txt +++ b/hal_psee_plugins/src/devices/treuzell/CMakeLists.txt @@ -19,11 +19,9 @@ target_sources(metavision_hal_treuzell_protocol_obj PRIVATE target_sources(metavision_hal_psee_video_obj PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/tz_psee_video.cpp ) -if(TARGET hal_plugin_prophesee) -target_sources(hal_plugin_prophesee PRIVATE +target_sources(metavision_hal_psee_video_build_obj PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/tz_psee_video_build.cpp ) -endif() target_sources(metavision_hal_ti_tmp103_obj PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/ti_tmp103.cpp diff --git a/hal_psee_plugins/src/devices/treuzell/ti_tmp103.cpp b/hal_psee_plugins/src/devices/treuzell/ti_tmp103.cpp index ddba9d312..d41316517 100644 --- a/hal_psee_plugins/src/devices/treuzell/ti_tmp103.cpp +++ b/hal_psee_plugins/src/devices/treuzell/ti_tmp103.cpp @@ -21,6 +21,7 @@ std::shared_ptr TiTmp103::build(std::shared_ptr std::shared_ptr parent) { return std::make_shared(cmd, dev_id, parent); } +static TzRegisterBuildMethod method("ti,tmp103", TiTmp103::build); void TiTmp103::spawn_facilities(DeviceBuilder &device_builder) {} diff --git a/hal_psee_plugins/src/devices/treuzell/tz_device.cpp b/hal_psee_plugins/src/devices/treuzell/tz_device.cpp index 6c971fdf1..b67e68cc5 100644 --- a/hal_psee_plugins/src/devices/treuzell/tz_device.cpp +++ b/hal_psee_plugins/src/devices/treuzell/tz_device.cpp @@ -166,8 +166,8 @@ bool TzDeviceBuilder::build_devices(std::shared_ptr cmd, D std::shared_ptr decoder; if (format.name == "EVT3" && geometry) { MV_HAL_LOG_TRACE() << "Adding EVT3 decoder"; - decoder = device_builder.add_facility( - std::make_unique(false, geometry->get_height(), cd_event_decoder, ext_trigger_event_decoder)); + decoder = device_builder.add_facility(make_evt3_decoder(false, geometry->get_height(), geometry->get_width(), + cd_event_decoder, ext_trigger_event_decoder)); } else if (format.name == "EVT2") { MV_HAL_LOG_TRACE() << "Adding EVT2 decoder"; decoder = device_builder.add_facility( @@ -198,4 +198,9 @@ bool TzDeviceBuilder::build_devices(std::shared_ptr cmd, D return true; } +TzDeviceBuilder::Build_Map &TzDeviceBuilder::generic_map() { + static Build_Map static_map; + return static_map; +} + } // namespace Metavision diff --git a/hal_psee_plugins/src/devices/treuzell/tz_psee_video_build.cpp b/hal_psee_plugins/src/devices/treuzell/tz_psee_video_build.cpp index dc2345747..42c5d5c88 100644 --- a/hal_psee_plugins/src/devices/treuzell/tz_psee_video_build.cpp +++ b/hal_psee_plugins/src/devices/treuzell/tz_psee_video_build.cpp @@ -45,5 +45,6 @@ std::shared_ptr TzPseeVideo::build(std::shared_ptr(cmd, dev_id, parent); } } +static TzRegisterBuildMethod method("psee,video", TzPseeVideo::build); } // namespace Metavision diff --git a/hal_psee_plugins/src/devices/treuzell/tz_streamer.cpp b/hal_psee_plugins/src/devices/treuzell/tz_streamer.cpp index 9c00752a9..99a948089 100644 --- a/hal_psee_plugins/src/devices/treuzell/tz_streamer.cpp +++ b/hal_psee_plugins/src/devices/treuzell/tz_streamer.cpp @@ -28,6 +28,7 @@ std::shared_ptr TzStreamer::build(std::shared_ptr parent) { return std::make_shared(cmd, dev_id, parent); } +static TzRegisterBuildMethod method("treuzell,streamer", TzStreamer::build); void TzStreamer::spawn_facilities(DeviceBuilder &device_builder) {} diff --git a/hal_psee_plugins/src/facilities/psee_hw_register.cpp b/hal_psee_plugins/src/facilities/psee_hw_register.cpp index 4f9583473..b33dafd22 100644 --- a/hal_psee_plugins/src/facilities/psee_hw_register.cpp +++ b/hal_psee_plugins/src/facilities/psee_hw_register.cpp @@ -17,11 +17,11 @@ namespace Metavision { PseeHWRegister::PseeHWRegister(const std::shared_ptr &map) : regmap_(map) {} void PseeHWRegister::write_register(uint32_t address, uint32_t v) { - (*regmap_)[address].write_value(v); + regmap_->write(address, v); } uint32_t PseeHWRegister::read_register(uint32_t address) { - return (*regmap_)[address].read_value(); + return regmap_->read(address); } void PseeHWRegister::write_register(const std::string &address, uint32_t v) { diff --git a/hal_psee_plugins/src/plugin/CMakeLists.txt b/hal_psee_plugins/src/plugin/CMakeLists.txt index 2441d2725..6ddc6c6bf 100644 --- a/hal_psee_plugins/src/plugin/CMakeLists.txt +++ b/hal_psee_plugins/src/plugin/CMakeLists.txt @@ -9,57 +9,21 @@ target_sources(metavision_hal_psee_plugin_obj PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/psee_plugin.cpp) -if(TARGET hal_plugin_gen3_fx3) target_sources(hal_plugin_gen3_fx3 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/psee_gen3_evk1.cpp) -endif() - -if(TARGET hal_plugin_gen31_fx3) target_sources(hal_plugin_gen31_fx3 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/psee_gen31_evk1.cpp) -endif() - -if(TARGET hal_plugin_gen31_evk2) target_sources(hal_plugin_gen31_evk2 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/psee_gen31_evk2.cpp) -endif() - -if(TARGET hal_plugin_gen31_evk3) target_sources(hal_plugin_gen31_evk3 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/psee_gen31_evk3.cpp) -endif() - -if(TARGET hal_plugin_gen4_fx3) -target_sources(hal_plugin_gen4_fx3 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/psee_gen4_evk1.cpp) -endif() - -if(TARGET hal_plugin_gen4_evk2) -target_sources(hal_plugin_gen4_evk2 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/psee_gen4_evk2.cpp) -endif() - -if(TARGET hal_plugin_gen41_evk2) +if(HAL_GEN4_SUPPORT) + target_sources(hal_plugin_gen4_fx3 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/psee_gen4_evk1.cpp) + target_sources(hal_plugin_gen4_evk2 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/psee_gen4_evk2.cpp) +endif(HAL_GEN4_SUPPORT) target_sources(hal_plugin_gen41_evk2 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/psee_gen41_evk2.cpp) -endif() - -if(TARGET hal_plugin_gen41_evk3) target_sources(hal_plugin_gen41_evk3 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/psee_gen41_evk3.cpp) -endif() - -if(TARGET hal_plugin_imx636_evk2) target_sources(hal_plugin_imx636_evk2 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/psee_imx636_evk2.cpp) -endif() - -if(TARGET hal_plugin_imx636_evk3) target_sources(hal_plugin_imx636_evk3 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/psee_imx636_evk3.cpp) -endif() - -if(TARGET hal_plugin_imx636_evk4) target_sources(hal_plugin_imx636_evk4 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/psee_imx636_evk4.cpp) -endif() - -if(TARGET hal_plugin_golden_fallbacks) - target_sources(hal_plugin_golden_fallbacks PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/psee_golden_fallbacks.cpp) -endif() - -if(TARGET hal_plugin_prophesee) +target_sources(hal_plugin_golden_fallbacks PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/psee_golden_fallbacks.cpp) target_sources(hal_plugin_prophesee PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/psee_universal.cpp) if(HAL_GEN4_SUPPORT) target_compile_definitions(hal_plugin_prophesee PRIVATE "HAL_GEN4_SUPPORT") endif(HAL_GEN4_SUPPORT) -endif() diff --git a/hal_psee_plugins/src/plugin/psee_gen31_evk2.cpp b/hal_psee_plugins/src/plugin/psee_gen31_evk2.cpp index d9751b11b..6cf8ed77f 100644 --- a/hal_psee_plugins/src/plugin/psee_gen31_evk2.cpp +++ b/hal_psee_plugins/src/plugin/psee_gen31_evk2.cpp @@ -12,11 +12,9 @@ #if !defined(__ANDROID__) || defined(ANDROID_USES_LIBUSB) #include "boards/treuzell/tz_camera_discovery.h" #include "boards/treuzell/tz_libusb_board_command.h" -#include "devices/treuzell/tz_streamer.h" #include "devices/gen31/gen31_evk2_tz_device.h" #endif #include "boards/rawfile/psee_file_discovery.h" -#include "devices/utils/device_system_id.h" #include "metavision/hal/plugin/plugin.h" #include "metavision/hal/plugin/plugin_entrypoint.h" #include "metavision/hal/utils/hal_software_info.h" @@ -34,7 +32,6 @@ void initialize_plugin(void *plugin_ptr) { TzLibUSBBoardCommand::add_usb_id(0x03fd, 0x5832, 0x0); // Register live camera discoveries auto &evk2_disc = plugin.add_camera_discovery(std::make_unique()); - evk2_disc.factory().insert("treuzell,streamer", TzStreamer::build); evk2_disc.factory().insert("psee,video", TzEvk2Gen31::build, TzEvk2Gen31::can_build); #endif diff --git a/hal_psee_plugins/src/plugin/psee_gen31_evk3.cpp b/hal_psee_plugins/src/plugin/psee_gen31_evk3.cpp index b922c7a81..fb4fce8de 100644 --- a/hal_psee_plugins/src/plugin/psee_gen31_evk3.cpp +++ b/hal_psee_plugins/src/plugin/psee_gen31_evk3.cpp @@ -12,12 +12,8 @@ #if !defined(__ANDROID__) || defined(ANDROID_USES_LIBUSB) #include "boards/treuzell/tz_camera_discovery.h" #include "boards/treuzell/tz_libusb_board_command.h" -#include "devices/treuzell/tz_streamer.h" -#include "devices/gen31/gen31_ccam5_tz_device.h" -#include "devices/treuzell/ti_tmp103.h" #endif #include "boards/rawfile/psee_file_discovery.h" -#include "devices/utils/device_system_id.h" #include "metavision/hal/plugin/plugin.h" #include "metavision/hal/plugin/plugin_entrypoint.h" #include "metavision/hal/utils/hal_software_info.h" @@ -34,9 +30,6 @@ void initialize_plugin(void *plugin_ptr) { TzLibUSBBoardCommand::add_usb_id(0x04b4, 0x00f4, 0x19); // Register live camera discoveries auto &evk3_disc = plugin.add_camera_discovery(std::make_unique()); - evk3_disc.factory().insert("treuzell,streamer", TzStreamer::build); - evk3_disc.factory().insert("psee,ccam5_fpga", TzCcam5Gen31::build); - evk3_disc.factory().insert("ti,tmp103", TiTmp103::build); #endif // Register raw file discoveries diff --git a/hal_psee_plugins/src/plugin/psee_gen41_evk2.cpp b/hal_psee_plugins/src/plugin/psee_gen41_evk2.cpp index 030dc49fd..02cb80dfe 100644 --- a/hal_psee_plugins/src/plugin/psee_gen41_evk2.cpp +++ b/hal_psee_plugins/src/plugin/psee_gen41_evk2.cpp @@ -12,11 +12,9 @@ #if !defined(__ANDROID__) || defined(ANDROID_USES_LIBUSB) #include "boards/treuzell/tz_camera_discovery.h" #include "boards/treuzell/tz_libusb_board_command.h" -#include "devices/treuzell/tz_streamer.h" #include "devices/gen41/gen41_evk2_tz_device.h" #endif #include "boards/rawfile/psee_file_discovery.h" -#include "devices/utils/device_system_id.h" #include "metavision/hal/plugin/plugin.h" #include "metavision/hal/plugin/plugin_entrypoint.h" #include "metavision/hal/utils/hal_software_info.h" @@ -34,7 +32,6 @@ void initialize_plugin(void *plugin_ptr) { TzLibUSBBoardCommand::add_usb_id(0x03fd, 0x5832, 0x0); // Register live camera discoveries auto &evk2_disc = plugin.add_camera_discovery(std::make_unique()); - evk2_disc.factory().insert("treuzell,streamer", TzStreamer::build); evk2_disc.factory().insert("psee,video", TzEvk2Gen41::build, TzEvk2Gen41::can_build); #endif diff --git a/hal_psee_plugins/src/plugin/psee_gen41_evk3.cpp b/hal_psee_plugins/src/plugin/psee_gen41_evk3.cpp index b127c6e0b..fb4fce8de 100644 --- a/hal_psee_plugins/src/plugin/psee_gen41_evk3.cpp +++ b/hal_psee_plugins/src/plugin/psee_gen41_evk3.cpp @@ -12,12 +12,8 @@ #if !defined(__ANDROID__) || defined(ANDROID_USES_LIBUSB) #include "boards/treuzell/tz_camera_discovery.h" #include "boards/treuzell/tz_libusb_board_command.h" -#include "devices/treuzell/tz_streamer.h" -#include "devices/gen41/gen41_tz_device.h" -#include "devices/treuzell/ti_tmp103.h" #endif #include "boards/rawfile/psee_file_discovery.h" -#include "devices/utils/device_system_id.h" #include "metavision/hal/plugin/plugin.h" #include "metavision/hal/plugin/plugin_entrypoint.h" #include "metavision/hal/utils/hal_software_info.h" @@ -34,9 +30,6 @@ void initialize_plugin(void *plugin_ptr) { TzLibUSBBoardCommand::add_usb_id(0x04b4, 0x00f4, 0x19); // Register live camera discoveries auto &evk3_disc = plugin.add_camera_discovery(std::make_unique()); - evk3_disc.factory().insert("treuzell,streamer", TzStreamer::build); - evk3_disc.factory().insert("psee,ccam5_gen41", TzGen41::build, TzGen41::can_build); - evk3_disc.factory().insert("ti,tmp103", TiTmp103::build); #endif // Register raw file discoveries diff --git a/hal_psee_plugins/src/plugin/psee_gen4_evk2.cpp b/hal_psee_plugins/src/plugin/psee_gen4_evk2.cpp index e6783a259..8615a475e 100644 --- a/hal_psee_plugins/src/plugin/psee_gen4_evk2.cpp +++ b/hal_psee_plugins/src/plugin/psee_gen4_evk2.cpp @@ -12,11 +12,9 @@ #if !defined(__ANDROID__) || defined(ANDROID_USES_LIBUSB) #include "boards/treuzell/tz_camera_discovery.h" #include "boards/treuzell/tz_libusb_board_command.h" -#include "devices/treuzell/tz_streamer.h" #include "devices/gen4/gen4_evk2_tz_device.h" #endif #include "boards/rawfile/psee_file_discovery.h" -#include "devices/utils/device_system_id.h" #include "metavision/hal/plugin/plugin.h" #include "metavision/hal/plugin/plugin_entrypoint.h" #include "metavision/hal/utils/hal_software_info.h" @@ -34,7 +32,6 @@ void initialize_plugin(void *plugin_ptr) { TzLibUSBBoardCommand::add_usb_id(0x03fd, 0x5832, 0x0); // Register live camera discoveries auto &evk2_disc = plugin.add_camera_discovery(std::make_unique()); - evk2_disc.factory().insert("treuzell,streamer", TzStreamer::build); evk2_disc.factory().insert("psee,video", TzEvk2Gen4::build, TzEvk2Gen4::can_build); #endif diff --git a/hal_psee_plugins/src/plugin/psee_imx636_evk2.cpp b/hal_psee_plugins/src/plugin/psee_imx636_evk2.cpp index 69e608707..0c28d400b 100644 --- a/hal_psee_plugins/src/plugin/psee_imx636_evk2.cpp +++ b/hal_psee_plugins/src/plugin/psee_imx636_evk2.cpp @@ -12,11 +12,9 @@ #if !defined(__ANDROID__) || defined(ANDROID_USES_LIBUSB) #include "boards/treuzell/tz_camera_discovery.h" #include "boards/treuzell/tz_libusb_board_command.h" -#include "devices/treuzell/tz_streamer.h" #include "devices/imx636/imx636_evk2_tz_device.h" #endif #include "boards/rawfile/psee_file_discovery.h" -#include "devices/utils/device_system_id.h" #include "metavision/hal/plugin/plugin.h" #include "metavision/hal/plugin/plugin_entrypoint.h" #include "metavision/hal/utils/hal_software_info.h" @@ -34,7 +32,6 @@ void initialize_plugin(void *plugin_ptr) { TzLibUSBBoardCommand::add_usb_id(0x03fd, 0x5832, 0x0); // Register live camera discoveries auto &evk2_disc = plugin.add_camera_discovery(std::make_unique()); - evk2_disc.factory().insert("treuzell,streamer", TzStreamer::build); evk2_disc.factory().insert("psee,video", TzEvk2Imx636::build, TzEvk2Imx636::can_build); #endif diff --git a/hal_psee_plugins/src/plugin/psee_imx636_evk3.cpp b/hal_psee_plugins/src/plugin/psee_imx636_evk3.cpp index bc9de7378..fb4fce8de 100644 --- a/hal_psee_plugins/src/plugin/psee_imx636_evk3.cpp +++ b/hal_psee_plugins/src/plugin/psee_imx636_evk3.cpp @@ -12,12 +12,8 @@ #if !defined(__ANDROID__) || defined(ANDROID_USES_LIBUSB) #include "boards/treuzell/tz_camera_discovery.h" #include "boards/treuzell/tz_libusb_board_command.h" -#include "devices/treuzell/tz_streamer.h" -#include "devices/imx636/imx636_tz_device.h" -#include "devices/treuzell/ti_tmp103.h" #endif #include "boards/rawfile/psee_file_discovery.h" -#include "devices/utils/device_system_id.h" #include "metavision/hal/plugin/plugin.h" #include "metavision/hal/plugin/plugin_entrypoint.h" #include "metavision/hal/utils/hal_software_info.h" @@ -34,9 +30,6 @@ void initialize_plugin(void *plugin_ptr) { TzLibUSBBoardCommand::add_usb_id(0x04b4, 0x00f4, 0x19); // Register live camera discoveries auto &evk3_disc = plugin.add_camera_discovery(std::make_unique()); - evk3_disc.factory().insert("treuzell,streamer", TzStreamer::build); - evk3_disc.factory().insert("psee,ccam5_gen42", TzImx636::build, TzImx636::can_build); - evk3_disc.factory().insert("ti,tmp103", TiTmp103::build); #endif // Register raw file discoveries diff --git a/hal_psee_plugins/src/plugin/psee_imx636_evk4.cpp b/hal_psee_plugins/src/plugin/psee_imx636_evk4.cpp index de280179f..e95a3b8bc 100644 --- a/hal_psee_plugins/src/plugin/psee_imx636_evk4.cpp +++ b/hal_psee_plugins/src/plugin/psee_imx636_evk4.cpp @@ -12,12 +12,8 @@ #if !defined(__ANDROID__) || defined(ANDROID_USES_LIBUSB) #include "boards/treuzell/tz_camera_discovery.h" #include "boards/treuzell/tz_libusb_board_command.h" -#include "devices/treuzell/tz_streamer.h" -#include "devices/imx636/imx636_tz_device.h" -#include "devices/treuzell/ti_tmp103.h" #endif #include "boards/rawfile/psee_file_discovery.h" -#include "devices/utils/device_system_id.h" #include "metavision/hal/plugin/plugin.h" #include "metavision/hal/plugin/plugin_entrypoint.h" #include "metavision/hal/utils/hal_software_info.h" @@ -34,9 +30,6 @@ void initialize_plugin(void *plugin_ptr) { TzLibUSBBoardCommand::add_usb_id(0x04b4, 0x00f5, 0x19); // Register live camera discoveries auto &evk4_disc = plugin.add_camera_discovery(std::make_unique()); - evk4_disc.factory().insert("treuzell,streamer", TzStreamer::build); - evk4_disc.factory().insert("psee,ccam5_gen42", TzImx636::build, TzImx636::can_build); - evk4_disc.factory().insert("ti,tmp103", TiTmp103::build); #endif // Register raw file discoveries diff --git a/hal_psee_plugins/src/plugin/psee_universal.cpp b/hal_psee_plugins/src/plugin/psee_universal.cpp index fb4fd87ac..39f8630fd 100644 --- a/hal_psee_plugins/src/plugin/psee_universal.cpp +++ b/hal_psee_plugins/src/plugin/psee_universal.cpp @@ -17,12 +17,6 @@ #endif #include "devices/golden_fallbacks/golden_fallback_treuzell_facilities_builder.h" #include "devices/golden_fallbacks/golden_fallback_fx3_facilities_builder.h" -#include "devices/treuzell/tz_streamer.h" -#include "devices/gen31/gen31_ccam5_tz_device.h" -#include "devices/gen41/gen41_tz_device.h" -#include "devices/imx636/imx636_tz_device.h" -#include "devices/treuzell/tz_psee_video.h" -#include "devices/treuzell/ti_tmp103.h" #include "boards/fx3/fx3_camera_discovery.h" #include "boards/treuzell/tz_camera_discovery.h" #include "boards/treuzell/tz_libusb_board_command.h" @@ -55,12 +49,6 @@ void initialize_plugin(void *plugin_ptr) { #endif fx3_disc.register_device_builder(SYSTEM_CCAM3_GOLDEN_FALLBACK, build_golden_fallback_fx3_device); auto &tz_disc = plugin.add_camera_discovery(std::make_unique()); - tz_disc.factory().insert("treuzell,streamer", TzStreamer::build); - tz_disc.factory().insert("psee,video", TzPseeVideo::build); - tz_disc.factory().insert("psee,ccam5_fpga", TzCcam5Gen31::build); - tz_disc.factory().insert("psee,ccam5_gen41", TzGen41::build); - tz_disc.factory().insert("psee,ccam5_gen42", TzImx636::build); - tz_disc.factory().insert("ti,tmp103", TiTmp103::build); #endif auto &file_disc = plugin.add_file_discovery(std::make_unique()); diff --git a/sdk/cmake/MetavisionSDKConfig.cmake.in b/sdk/cmake/MetavisionSDKConfig.cmake.in index 8b58dfebb..0e8753c2a 100644 --- a/sdk/cmake/MetavisionSDKConfig.cmake.in +++ b/sdk/cmake/MetavisionSDKConfig.cmake.in @@ -394,7 +394,7 @@ foreach(_comp ${_MetavisionSDK_components_to_look_for_ordered}) else() set(_MetavisionSDK_${_comp}_REASON_NOT_FOUND "${MetavisionSDK_${_comp}_NOT_FOUND_MESSAGE}") - # TODO : get better log on why the component was not found (for examples of imported target refers to an unknwon target it's because a file *Depends is missing) + # TODO : get better log on why the component was not found (for examples of imported target refers to an unknown target it's because a file *Depends is missing) set(MetavisionSDK_${_comp}_FOUND False) endif (MetavisionSDK_${_comp}_FOUND) diff --git a/sdk/modules/base/cpp/include/metavision/sdk/base/utils/log.h b/sdk/modules/base/cpp/include/metavision/sdk/base/utils/log.h index bc8ab8b00..9d78d2f96 100644 --- a/sdk/modules/base/cpp/include/metavision/sdk/base/utils/log.h +++ b/sdk/modules/base/cpp/include/metavision/sdk/base/utils/log.h @@ -22,6 +22,7 @@ /// Convenience function to return a logging operation of DEBUG level using the current logging stream, /// an optional prefix format @p prefixFmt and automatically adding an end of line token at the end of the logging /// operation +/// /// @param prefixFmt (Optional) a format string that will be be output as the first message token /// @return A logging operation of DEBUG level #define MV_LOG_DEBUG(prefixFmt...) @@ -31,6 +32,7 @@ /// Convenience macro to return a logging operation of TRACE level using the current logging stream, /// an optional prefix format @p prefixFmt and automatically adding an end of line token at the end of the logging /// operation +/// /// @param prefixFmt (Optional) a format string that will be be output as the first message token /// @return A logging operation of TRACE level #define MV_LOG_TRACE(prefixFmt...) @@ -40,6 +42,7 @@ /// Convenience function to return a logging operation of INFO level using the current logging stream, /// an optional prefix format @p prefixFmt and automatically adding an end of line token at the end of the logging /// operation +/// /// @param prefixFmt (Optional) a format string that will be be output as the first message token /// @return A logging operation of INFO level #define MV_LOG_INFO(prefixFmt...) @@ -49,6 +52,7 @@ /// Convenience function to return a logging operation of WARNING level using the current logging stream, /// an optional prefix format @p prefixFmt and automatically adding an end of line token at the end of the logging /// operation +/// /// @param prefixFmt (Optional) a format string that will be be output as the first message token /// @return A logging operation of WARNING level #define MV_LOG_WARNING(prefixFmt...) @@ -58,6 +62,7 @@ /// Convenience function to return a logging operation of ERROR level using the current logging stream, /// an optional prefix format @p prefixFmt and automatically adding an end of line token at the end of the logging /// operation +/// /// @param prefixFmt (Optional) a format string that will be be output as the first message token /// @return A logging operation of ERROR level #define MV_LOG_ERROR(prefixFmt...) @@ -91,6 +96,7 @@ LogLevel getLogLevel(); /// /// Any message that has a higher or equal level will be enabled to pass through, and /// any message that has a lower level will be ignored +/// /// @param level The minimum level of messages allowed to pass through /// @note By default, the level is LogLevel::Info /// @note It is also possible to set the current level of logging by setting the environment variable @@ -139,6 +145,7 @@ class concurrent_ostreambuf; /// It is much more convenient to use one of the @ref MV_LOG_DEBUG, @ref MV_LOG_TRACE, @ref /// MV_LOG_INFO, @ref MV_LOG_WARNING or @ref MV_LOG_ERROR functions to return an instance of /// this class +/// /// @tparam level The level of this logging operation /// @sa @ref MV_LOG_DEBUG, @ref MV_LOG_TRACE, @ref MV_LOG_INFO, @ref MV_LOG_WARNING, @ref MV_LOG_ERROR template diff --git a/sdk/modules/base/cpp/include/metavision/sdk/base/utils/object_pool.h b/sdk/modules/base/cpp/include/metavision/sdk/base/utils/object_pool.h index 9cfae0d6d..765989e98 100644 --- a/sdk/modules/base/cpp/include/metavision/sdk/base/utils/object_pool.h +++ b/sdk/modules/base/cpp/include/metavision/sdk/base/utils/object_pool.h @@ -63,6 +63,7 @@ class ObjectPool { /// /// There won't be memory allocation upon call to @ref acquire if all objects in the memory pool are already /// used. + /// /// @param num_initial_objects Number of objects initially allocated in the pool /// @return An object pool with bounded memory static ObjectPool make_bounded(size_t num_initial_objects = 64) { @@ -73,6 +74,7 @@ class ObjectPool { /// /// There won't be memory allocation upon call to @ref acquire if all objects in the memory pool are already /// used. + /// /// @param num_initial_objects Number of objects initially allocated in the pool /// @param args The arguments forwarded to the object constructor during allocation /// @return An object pool with bounded memory @@ -85,6 +87,7 @@ class ObjectPool { /// /// A pool with unbounded memory will allocate a new object when all objects in the pool are already used /// and @ref acquire is called. + /// /// @param num_initial_objects Number of objects initially allocated in the pool /// @return An object pool with unbounded memory template @@ -96,6 +99,7 @@ class ObjectPool { /// /// A pool with unbounded memory will allocate a new object when all objects in the pool are already used /// and @ref acquire is called. + /// /// @param num_initial_objects Number of objects initially allocated in the pool /// @param args The arguments forwarded to the object constructor during allocation /// @return An object pool with unbounded memory @@ -145,6 +149,16 @@ class ObjectPool { return impl_->is_bounded(); } + /// @brief Ensure that the pool contains 'size' available objects, ready to be acquired. + /// @note Only works for unbounded pool + /// @param size The maximum number of objects to be available + /// @param args Optional arguments to be used when allocating the object + /// @return the number of newly allocated object in the pool + template + size_t arrange(size_t size, Args &&...args) { + return impl_->arrange(size, std::forward(args)...); + } + private: /// @brief Constructor template @@ -177,6 +191,25 @@ class ObjectPool { } } + /// @brief Increase pool capacity to the new size if larger than the actual pool size. + /// @param size The new pool capacity size + /// @param args Optional arguments to be used when allocating the object + /// @return the number of newly allocated object in the pool + template + size_t arrange(size_t size, Args &&...args) { + if (bounded_memory_ || size <= pool_.size()) { + return 0; + } + + std::unique_lock lock(mutex_); + size_t nb_allocated_obj = size - pool_.size(); + while (pool_.size() < size) { + pool_.push(std::unique_ptr(new T(std::forward(args)...))); + } + + return nb_allocated_obj; + } + /// @brief Allocates or re-use a previously allocated object /// @param args Optional arguments to be passed when allocating the object /// @return A unique or shared pointer to the allocated object diff --git a/sdk/modules/base/cpp/include/metavision/sdk/base/utils/python_bindings_doc.h b/sdk/modules/base/cpp/include/metavision/sdk/base/utils/python_bindings_doc.h index 6c95ffc59..631192eac 100644 --- a/sdk/modules/base/cpp/include/metavision/sdk/base/utils/python_bindings_doc.h +++ b/sdk/modules/base/cpp/include/metavision/sdk/base/utils/python_bindings_doc.h @@ -30,6 +30,7 @@ class PythonBindingsDoc { /// @brief Constructs the map from a sequence of strings /// /// The sequence must contain an even number of elements + /// /// @param sequence_of_strings should be in the order: key1, val1, key2, val2, ... keyn, valn PythonBindingsDoc(const std::vector &sequence_of_strings) { if (sequence_of_strings.size() % 2 != 0) { diff --git a/sdk/modules/base/cpp/tests/object_pool_gtest.cpp b/sdk/modules/base/cpp/tests/object_pool_gtest.cpp index 449d1ec13..66aef8dfe 100644 --- a/sdk/modules/base/cpp/tests/object_pool_gtest.cpp +++ b/sdk/modules/base/cpp/tests/object_pool_gtest.cpp @@ -279,3 +279,37 @@ TEST(ObjectPool_GTest, deleted_object_pool_with_object_in_the_wild) { // THEN no crash occur: object is deleted instead of being brought back to the pool object.reset(); } + +TEST(ObjectPool_GTest, should_arrange_object_pool_with_requested_size) { + Metavision::ObjectPool obj_pool = Metavision::ObjectPool::make_unbounded(1, 42); + + EXPECT_EQ(obj_pool.size(), 1); + + // We ask to arrange 2 elements, and because the pool contains 1 object already, + // Only 1 new element will be allocated. + EXPECT_EQ(obj_pool.arrange(2, 43), 1); + EXPECT_EQ(obj_pool.size(), 2); + + auto first_obj = obj_pool.acquire(); + auto second_obj = obj_pool.acquire(); + + EXPECT_EQ(*first_obj, 43); + EXPECT_EQ(*second_obj, 42); +} + +TEST(ObjectPool_GTest, should_do_nothing_when_arranging_object_pool_with_smaller_capacity) { + Metavision::ObjectPool obj_pool = Metavision::ObjectPool::make_unbounded(10); + + EXPECT_EQ(obj_pool.size(), 10); + EXPECT_EQ(obj_pool.arrange(2), 0); + EXPECT_EQ(obj_pool.size(), 10); +} + +TEST(ObjectPool_GTest, should_not_arrange_on_bounded_pool) { + Metavision::ObjectPool obj_pool = Metavision::ObjectPool::make_bounded(10); + + EXPECT_EQ(obj_pool.size(), 10); + EXPECT_EQ(obj_pool.arrange(2), 0); + EXPECT_EQ(obj_pool.arrange(100), 0); + EXPECT_EQ(obj_pool.size(), 10); +} diff --git a/sdk/modules/core/cpp/include/metavision/sdk/core/algorithms/async_algorithm.h b/sdk/modules/core/cpp/include/metavision/sdk/core/algorithms/async_algorithm.h index 35a56646d..1623f70fc 100644 --- a/sdk/modules/core/cpp/include/metavision/sdk/core/algorithms/async_algorithm.h +++ b/sdk/modules/core/cpp/include/metavision/sdk/core/algorithms/async_algorithm.h @@ -114,6 +114,7 @@ class AsyncAlgorithm { /// This is especially useful if the condition to trigger the creation of a buffer is independent from the content /// of the processed events (for instance, an external trigger events, an other algorithm condition, etc.). The /// user must then call @ref flush when the condition is fulfilled. + /// /// @note This call can trigger a flush if some events have already been processed void set_processing_external(); @@ -121,6 +122,7 @@ class AsyncAlgorithm { /// /// This is to be called when one wants to process events older than those already processed (e.g. in the case one /// wants to switch the source producing the events). + /// /// @note This method doesn't change the algorithm's processing mode (see @ref Processing) nor flushes the ongoing /// time slice. It is the user's responsibility to call @ref flush before this method to retrieve the incomplete /// time slice if needed. @@ -130,6 +132,7 @@ class AsyncAlgorithm { /// /// The resulting processed time slice corresponds to all the events processed since the last call to process_async /// (i.e. the time slice's timestamp is the last processed event's timestamp + 1) + /// /// @note The internal state is updated so that the next time slice will start just after this one (i.e. /// [last event's timestamp + 1, next_processing_ts_[). inline void flush(); diff --git a/sdk/modules/core/cpp/include/metavision/sdk/core/algorithms/base_frame_generation_algorithm.h b/sdk/modules/core/cpp/include/metavision/sdk/core/algorithms/base_frame_generation_algorithm.h index b0a3bb9a0..79e91f7d9 100644 --- a/sdk/modules/core/cpp/include/metavision/sdk/core/algorithms/base_frame_generation_algorithm.h +++ b/sdk/modules/core/cpp/include/metavision/sdk/core/algorithms/base_frame_generation_algorithm.h @@ -97,6 +97,27 @@ class BaseFrameGenerationAlgorithm { /// @param palette The Prophesee's color palette to use void set_color_palette(const Metavision::ColorPalette &palette); + enum Parameters { + GRAY = (1 << 0), + RGB = (1 << 1), + BGR = (1 << 2), + RGBA = (1 << 3), + BGRA = (1 << 4), + FLIP_Y = (1 << 10) + }; + + /// @brief Sets the parameters used to generate the frame + /// @param bg_color Color used as background, when no events were received for a pixel + /// @param on_color Color used for on events + /// @param off_color Color used for off events + /// @param flags A combination of Parameters + void set_parameters(const cv::Vec4b &bg_color, const cv::Vec4b &on_color, const cv::Vec4b &off_color, int flags); + + /// @brief Sets the parameters used to generate the frame + /// @param palette The Prophesee's color palette to use + /// @param flags A combination of Parameters + void set_parameters(const Metavision::ColorPalette &palette, int flags); + /// @brief Gets the frame's dimension /// @param height Frame's height /// @param width Frame's width @@ -110,6 +131,23 @@ class BaseFrameGenerationAlgorithm { /// @param palette The Prophesee's color palette to use BaseFrameGenerationAlgorithm(int sensor_width, int sensor_height, const Metavision::ColorPalette &palette); + /// @brief Stand-alone (static) helper method to generate a frame from an input event buffer + /// @warning The input @p frame must be allocated beforehand + /// @note This method is used internally both by its public counterpart and the child classes + /// @tparam EventIt Input iterator event type. Works for @ref EventCD or equivalent + /// @param it_begin Iterator to first input event + /// @param it_end Iterator to the past-the-end event + /// @param frame Pre-allocated frame that will be filled with CD events. It must have the same geometry as the input + /// event source, and the color corresponding to @p colored (3 channels by default) + /// @param bg_color Background color + /// @param off_on_colors Colors of negative and positive events + /// @param flags A combination of Parameters + /// @throw invalid_argument if @p frame does not have the expected type (CV_8U or CV_8UC3) + template + static void generate_frame_from_events(EventIt it_begin, EventIt it_end, cv::Mat &frame, const cv::Vec4b &bg_color, + const std::array &off_on_colors, int flags); + + /// @overload /// @brief Stand-alone (static) helper method to generate a frame from an input event buffer /// @warning The input @p frame must be allocated beforehand /// @note This method is used internally both by its public counterpart and the child classes @@ -128,51 +166,13 @@ class BaseFrameGenerationAlgorithm { // Frame properties const int width_, height_; ///< Sensor's geometry - bool colored_; ///< Whether the frame is colored - cv::Vec3b bg_color_; ///< The background color - std::array off_on_colors_; ///< The off and on color + int flags_; ///< Frame's generation parameters + cv::Vec4b bg_color_; ///< The background color + std::array off_on_colors_; ///< The off and on color }; -template -void BaseFrameGenerationAlgorithm::generate_frame_from_events(EventIt it_begin, EventIt it_end, cv::Mat &frame, - const uint32_t accumulation_time_us, - const Metavision::ColorPalette &palette) { - const cv::Vec3b bg_color = get_cv_color(palette, Metavision::ColorType::Background); - const std::array off_on_colors{get_cv_color(palette, Metavision::ColorType::Negative), - get_cv_color(palette, Metavision::ColorType::Positive)}; - const bool colored = palette != Metavision::ColorPalette::Gray; - - // Process the entire range of events if the accumulation time is set to zero, or if there's no events. - // Otherwise, find the first event to process in the desired time interval [t-dt, t[ - if (std::distance(it_begin, it_end) != 0 && accumulation_time_us != 0) - it_begin = std::lower_bound(it_begin, it_end, std::prev(it_end)->t - accumulation_time_us, - [](const auto &lhs, auto rhs) { return lhs.t < rhs; }); - - generate_frame_from_events(it_begin, it_end, frame, bg_color, off_on_colors, colored); -} - -template -void BaseFrameGenerationAlgorithm::generate_frame_from_events(EventIt it_begin, EventIt it_end, cv::Mat &frame, - const cv::Vec3b &bg_color, - const std::array &off_on_colors, - bool colored) { - if (frame.type() != (colored ? CV_8UC3 : CV_8UC1)) { - std::ostringstream ss; - ss << "Incompatible matrix type. Must be " << (colored ? "CV_8UC3" : "CV_8UC1") << "."; - throw std::invalid_argument(ss.str()); - } - - if (colored) { - frame.setTo(bg_color); - for (auto it = it_begin; it != it_end; ++it) - frame.at(it->y, it->x) = off_on_colors[it->p]; - } else { - frame.setTo(bg_color[0]); - for (auto it = it_begin; it != it_end; ++it) - frame.at(it->y, it->x) = off_on_colors[it->p][0]; - } -} - } // namespace Metavision +#include "metavision/sdk/core/algorithms/detail/base_frame_generation_algorithm_impl.h" + #endif // METAVISION_SDK_CORE_BASE_FRAME_GENERATION_ALGORITHM_H \ No newline at end of file diff --git a/sdk/modules/core/cpp/include/metavision/sdk/core/algorithms/detail/base_frame_generation_algorithm_impl.h b/sdk/modules/core/cpp/include/metavision/sdk/core/algorithms/detail/base_frame_generation_algorithm_impl.h new file mode 100644 index 000000000..00c264fc1 --- /dev/null +++ b/sdk/modules/core/cpp/include/metavision/sdk/core/algorithms/detail/base_frame_generation_algorithm_impl.h @@ -0,0 +1,139 @@ +/********************************************************************************************************************** + * Copyright (c) Prophesee S.A. * + * * + * Licensed under the Apache License, Version 2.0 (the "License"); * + * you may not use this file except in compliance with the License. * + * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed * + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * + * See the License for the specific language governing permissions and limitations under the License. * + **********************************************************************************************************************/ + +#ifndef METAVISION_SDK_CORE_BASE_FRAME_GENERATION_ALGORITHM_IMPL_H +#define METAVISION_SDK_CORE_BASE_FRAME_GENERATION_ALGORITHM_IMPL_H + +#include + +#include "metavision/sdk/core/utils/colors.h" + +namespace Metavision { + +namespace detail { +inline cv::Vec4b bgra(const cv::Vec3b &v) { + return {v[0], v[1], v[2], 255}; +} +inline cv::Vec4b rgba(const cv::Vec3b &v) { + return {v[2], v[1], v[0], 255}; +} +inline cv::Vec4b rgba(const cv::Vec4b &v) { + return {v[2], v[1], v[0], v[3]}; +} +inline cv::Vec3b bgr(const cv::Vec4b &v) { + return {v[0], v[1], v[2]}; +} +inline cv::Vec3b rgb(const cv::Vec4b &v) { + return {v[2], v[1], v[0]}; +} +inline cv::Vec3b rgb(const cv::Vec3b &v) { + return {v[2], v[1], v[0]}; +} +} // namespace detail + +template +void BaseFrameGenerationAlgorithm::generate_frame_from_events(EventIt it_begin, EventIt it_end, cv::Mat &frame, + const uint32_t accumulation_time_us, + const Metavision::ColorPalette &palette) { + const cv::Vec4b bg_color = detail::bgra(get_cv_color(palette, Metavision::ColorType::Background)); + const std::array off_on_colors{detail::bgra(get_cv_color(palette, Metavision::ColorType::Negative)), + detail::bgra(get_cv_color(palette, Metavision::ColorType::Positive))}; + int flags = (palette != Metavision::ColorPalette::Gray ? Parameters::BGR : Parameters::GRAY); + + // Process the entire range of events if the accumulation time is set to zero, or if there's no events. + // Otherwise, find the first event to process in the desired time interval [t-dt, t[ + if (std::distance(it_begin, it_end) != 0 && accumulation_time_us != 0) + it_begin = std::lower_bound(it_begin, it_end, std::prev(it_end)->t - accumulation_time_us, + [](const auto &lhs, auto rhs) { return lhs.t < rhs; }); + + generate_frame_from_events(it_begin, it_end, frame, bg_color, off_on_colors, flags); +} + +template +void BaseFrameGenerationAlgorithm::generate_frame_from_events(EventIt it_begin, EventIt it_end, cv::Mat &frame, + const cv::Vec3b &bg_color, + const std::array &off_on_colors, + bool colored) { + if (frame.type() != (colored ? CV_8UC3 : CV_8UC1)) { + std::ostringstream ss; + ss << "Incompatible matrix type. Must be " << (colored ? "CV_8UC3" : "CV_8UC1") << "."; + throw std::invalid_argument(ss.str()); + } + + if (colored) { + frame.setTo(bg_color); + for (auto it = it_begin; it != it_end; ++it) + frame.at(it->y, it->x) = off_on_colors[it->p]; + } else { + frame.setTo(bg_color[0]); + for (auto it = it_begin; it != it_end; ++it) + frame.at(it->y, it->x) = off_on_colors[it->p][0]; + } +} + +template +void BaseFrameGenerationAlgorithm::generate_frame_from_events(EventIt it_begin, EventIt it_end, cv::Mat &frame, + const cv::Vec4b &bg_color, + const std::array &off_on_colors, + int flags) { + std::ostringstream ss; + ss << "Incompatible matrix type. Must be "; + int cv_type; + std::string cv_type_str; + if (flags & Parameters::GRAY) { + cv_type = CV_8UC1; + cv_type_str = "CV_8UC1"; + } else if (flags & Parameters::RGB || flags & Parameters::BGR) { + cv_type = CV_8UC3; + cv_type_str = "CV_8UC3"; + } else { + cv_type = CV_8UC4; + cv_type_str = "CV_8UC4"; + } + ss << cv_type_str << "."; + if (frame.type() != cv_type) { + throw std::invalid_argument(ss.str()); + } + + cv::Vec3b _bg_color3; + cv::Vec4b _bg_color4; + std::array _off_on_colors3; + std::array _off_on_colors4; + if (flags & Parameters::BGR || flags & Parameters::BGRA) { + _bg_color3 = detail::bgr(bg_color); + _off_on_colors3 = {detail::bgr(off_on_colors[0]), detail::bgr(off_on_colors[1])}; + _bg_color4 = bg_color; + _off_on_colors4 = off_on_colors; + } else { + _bg_color3 = detail::rgb(bg_color); + _off_on_colors3 = {detail::rgb(off_on_colors[0]), detail::rgb(off_on_colors[1])}; + _bg_color4 = detail::rgba(bg_color); + _off_on_colors4 = {detail::rgba(off_on_colors[0]), detail::rgba(off_on_colors[1])}; + } + + if (flags & Parameters::GRAY) { + frame.setTo(bg_color[0]); + for (auto it = it_begin; it != it_end; ++it) + frame.at(it->y, it->x) = off_on_colors[it->p][0]; + } else if (flags & Parameters::RGB || flags & Parameters::BGR) { + frame.setTo(_bg_color3); + for (auto it = it_begin; it != it_end; ++it) + frame.at(it->y, it->x) = _off_on_colors3[it->p]; + } else { + frame.setTo(_bg_color4); + for (auto it = it_begin; it != it_end; ++it) + frame.at(it->y, it->x) = _off_on_colors4[it->p]; + } +} + +} // namespace Metavision + +#endif // METAVISION_SDK_CORE_BASE_FRAME_GENERATION_ALGORITHM_IMPL_H \ No newline at end of file diff --git a/sdk/modules/core/cpp/include/metavision/sdk/core/algorithms/detail/shared_events_buffer_producer_algorithm_impl.h b/sdk/modules/core/cpp/include/metavision/sdk/core/algorithms/detail/shared_events_buffer_producer_algorithm_impl.h index fcaee5fae..3d4db8754 100644 --- a/sdk/modules/core/cpp/include/metavision/sdk/core/algorithms/detail/shared_events_buffer_producer_algorithm_impl.h +++ b/sdk/modules/core/cpp/include/metavision/sdk/core/algorithms/detail/shared_events_buffer_producer_algorithm_impl.h @@ -44,6 +44,11 @@ SharedEventsBufferProducerAlgorithm::SharedEventsBufferProducerAlgorithm } } +template +SharedEventsBufferProducerParameters SharedEventsBufferProducerAlgorithm::params() const { + return params_; +} + template void SharedEventsBufferProducerAlgorithm::clear() { current_shared_buffer_->clear(); diff --git a/sdk/modules/core/cpp/include/metavision/sdk/core/algorithms/generic_producer_algorithm.h b/sdk/modules/core/cpp/include/metavision/sdk/core/algorithms/generic_producer_algorithm.h index 4f719b420..83a03f723 100644 --- a/sdk/modules/core/cpp/include/metavision/sdk/core/algorithms/generic_producer_algorithm.h +++ b/sdk/modules/core/cpp/include/metavision/sdk/core/algorithms/generic_producer_algorithm.h @@ -39,6 +39,7 @@ namespace Metavision { /// Conversely, a timeout can be set, to avoid the producer waiting indefinitely for /// events to be inserted. According to the timeout value, the producer will either not wait, /// wait indefinitely or wait for a predefined amount of time before returning the events, +/// /// @sa @ref set_timeout. template class GenericProducerAlgorithm { @@ -145,6 +146,7 @@ class GenericProducerAlgorithm { /// If the timeout is zero, it will wait until at least one event with a timestamp /// greater than ts is registered, before returning the events with a timestamp /// less or equal to ts. + /// /// @param ts Timestamp before which to include events. /// @param inserter Output iterator or back inserter /// @param timing_profiler Profiler to debug diff --git a/sdk/modules/core/cpp/include/metavision/sdk/core/algorithms/on_demand_frame_generation_algorithm.h b/sdk/modules/core/cpp/include/metavision/sdk/core/algorithms/on_demand_frame_generation_algorithm.h index 7fe07b1d5..eaa6ce814 100644 --- a/sdk/modules/core/cpp/include/metavision/sdk/core/algorithms/on_demand_frame_generation_algorithm.h +++ b/sdk/modules/core/cpp/include/metavision/sdk/core/algorithms/on_demand_frame_generation_algorithm.h @@ -71,6 +71,7 @@ class OnDemandFrameGenerationAlgorithm : public BaseFrameGenerationAlgorithm { /// Frame generated will only hold events in the interval [t - dt, t[ where t is the timestamp at /// which the frame is generated, and dt the accumulation time. /// However, if @p accumulation_time_us is set to 0, all events since the last generated frame are used + /// /// @param accumulation_time_us Time range of events to update the frame with (in us) void set_accumulation_time_us(uint32_t accumulation_time_us); diff --git a/sdk/modules/core/cpp/include/metavision/sdk/core/algorithms/periodic_frame_generation_algorithm.h b/sdk/modules/core/cpp/include/metavision/sdk/core/algorithms/periodic_frame_generation_algorithm.h index e5109e86d..306d24d11 100644 --- a/sdk/modules/core/cpp/include/metavision/sdk/core/algorithms/periodic_frame_generation_algorithm.h +++ b/sdk/modules/core/cpp/include/metavision/sdk/core/algorithms/periodic_frame_generation_algorithm.h @@ -77,6 +77,7 @@ class PeriodicFrameGenerationAlgorithm : public BaseFrameGenerationAlgorithm, /// @brief Sets the fps at which to generate frames and thus the frequency of the asynchronous calls /// /// The time reference used is the one from the input events + /// /// @param fps The fps to use. If the fps is 0, the current accumulation time is used to compute it /// @throw std::invalid_argument If the input fps is negative void set_fps(double fps); @@ -88,6 +89,7 @@ class PeriodicFrameGenerationAlgorithm : public BaseFrameGenerationAlgorithm, /// /// Frame generated will only hold events in the interval [t - dt, t[ where t is the timestamp at /// which the frame is generated, and dt the accumulation time + /// /// @param accumulation_time_us Time range of events to update the frame with (in us) void set_accumulation_time_us(uint32_t accumulation_time_us); diff --git a/sdk/modules/core/cpp/include/metavision/sdk/core/algorithms/shared_events_buffer_producer_algorithm.h b/sdk/modules/core/cpp/include/metavision/sdk/core/algorithms/shared_events_buffer_producer_algorithm.h index 3ce08913a..09dcb8096 100644 --- a/sdk/modules/core/cpp/include/metavision/sdk/core/algorithms/shared_events_buffer_producer_algorithm.h +++ b/sdk/modules/core/cpp/include/metavision/sdk/core/algorithms/shared_events_buffer_producer_algorithm.h @@ -76,6 +76,9 @@ class SharedEventsBufferProducerAlgorithm : public AsyncAlgorithm::value>> @@ -57,6 +58,7 @@ class AlgorithmStage : public BaseStage { /// @brief Constructor /// /// Overload constructor that simplifies setting the previous stage. + /// /// @param algo The wrapped algorithm for which process will be called /// @param prev_stage The previous stage of this stage AlgorithmStage(std::unique_ptr &&algo, BaseStage &prev_stage) : @@ -71,6 +73,7 @@ class AlgorithmStage : public BaseStage { /// /// Overload constructor that simplifies setting the previous stage and is only available when the type of event /// consumed is the same as the type of events produced. + /// /// @param algo The wrapped algorithm for which process will be called /// @param prev_stage The previous stage of this stage /// @param enabled true if the algorithm is enabled by default, false otherwise diff --git a/sdk/modules/core/cpp/include/metavision/sdk/core/pipeline/base_stage.h b/sdk/modules/core/cpp/include/metavision/sdk/core/pipeline/base_stage.h index a538b74ce..4086d835f 100644 --- a/sdk/modules/core/cpp/include/metavision/sdk/core/pipeline/base_stage.h +++ b/sdk/modules/core/cpp/include/metavision/sdk/core/pipeline/base_stage.h @@ -73,6 +73,7 @@ class BaseStage { /// This behavior is automatically handled by this constructor. /// If you need to customize the consuming callback of one (or all) of the previous stages, /// you should use @ref set_consuming_callback instead. + /// /// @param prev_stage the stage that is executed before the created one /// @param detachable If this stage can be detached (i.e. can run on its own thread) inline BaseStage(BaseStage &prev_stage, bool detachable = true); @@ -87,6 +88,7 @@ class BaseStage { /// call the default consuming callback of this stage when data is produced. /// If you need to customize the consuming callback that should be called for /// a previous stage, you should use @ref set_consuming_callback instead. + /// /// @param prev_stage the previous stage of this stage inline void set_previous_stage(BaseStage &prev_stage); @@ -201,6 +203,7 @@ class BaseStage { /// The setup callback is called just after a valid reference to the pipeline has been set to the stage. The setup /// callback allows the stage to setup everything needing a valid reference to the pipeline (e.g. setting pre and /// post step callbacks). + /// /// @param cb The callback that will be called when this stage has been set a valid reference to the pipeline inline void set_setup_callback(const std::function &cb); @@ -285,6 +288,7 @@ class BaseStage { /// @brief Notifies next stages of a change /// /// This schedules the execution of all the receiving callbacks + /// /// @param type The notification type /// @param data The associated notification data inline void notify(const NotificationType &type, const boost::any &data); @@ -292,6 +296,7 @@ class BaseStage { /// @brief Produces data /// /// This schedules the execution of all the producing callbacks + /// /// @param data The produced data inline void produce(const boost::any &data); @@ -299,6 +304,7 @@ class BaseStage { /// /// This function should be called whenever the stage will never produce any more data /// A stage is done when it has the status @ref Status::Completed or + /// /// @ref Status::Cancelled and it has finished scheduling tasks to be /// processed by following stages. inline void complete(); diff --git a/sdk/modules/core/cpp/include/metavision/sdk/core/pipeline/pipeline.h b/sdk/modules/core/cpp/include/metavision/sdk/core/pipeline/pipeline.h index f26bfa2d6..1b059c339 100644 --- a/sdk/modules/core/cpp/include/metavision/sdk/core/pipeline/pipeline.h +++ b/sdk/modules/core/cpp/include/metavision/sdk/core/pipeline/pipeline.h @@ -204,6 +204,7 @@ class Pipeline { /// This actually runs one of the scheduled callback on the main thread. /// The processing threads runs on their own, but can be blocked by the main /// thread if one stage needs to run on the main thread. + /// /// @return true if the step was successful, false if the pipeline has no remaining steps to run inline bool step(); diff --git a/sdk/modules/core/cpp/include/metavision/sdk/core/utils/callback_manager.h b/sdk/modules/core/cpp/include/metavision/sdk/core/utils/callback_manager.h index d0324a4a9..8cde5e3ec 100644 --- a/sdk/modules/core/cpp/include/metavision/sdk/core/utils/callback_manager.h +++ b/sdk/modules/core/cpp/include/metavision/sdk/core/utils/callback_manager.h @@ -12,9 +12,10 @@ #ifndef METAVISION_SDK_CORE_CALLBACK_MANAGER_H #define METAVISION_SDK_CORE_CALLBACK_MANAGER_H -#include +#include #include #include +#include #include "metavision/sdk/core/utils/index_manager.h" @@ -33,7 +34,8 @@ class CallbackManager { std::unique_lock lock(cbs_mutex_); auto idx = index_manager_.index_generator_.get_next_index(); index_manager_.counter_map_.tag(tag_id_); - cbs_map_[idx] = cb; + cbs_map_[idx] = cb; + cbs_vec_dirty_ = true; return idx; } @@ -43,18 +45,22 @@ class CallbackManager { if (it != cbs_map_.end()) { cbs_map_.erase(it); index_manager_.counter_map_.untag(tag_id_); + cbs_vec_dirty_ = true; return true; } return false; } - std::list get_cbs() const { - std::list cbs; - std::unique_lock lock(cbs_mutex_); - for (auto &&p : cbs_map_) { - cbs.push_back(p.second); + const std::vector &get_cbs() const { + if (cbs_vec_dirty_) { + std::unique_lock lock(cbs_mutex_); + cbs_vec_.clear(); + for (auto &&p : cbs_map_) { + cbs_vec_.push_back(p.second); + } + cbs_vec_dirty_ = false; } - return cbs; + return cbs_vec_; } template @@ -69,7 +75,9 @@ class CallbackManager { IndexManager &index_manager_; TagType tag_id_ = std::numeric_limits::max(); mutable std::mutex cbs_mutex_; + mutable std::atomic cbs_vec_dirty_{false}; std::map cbs_map_; + mutable std::vector cbs_vec_; }; } // namespace Metavision diff --git a/sdk/modules/core/cpp/include/metavision/sdk/core/utils/cd_frame_generator.h b/sdk/modules/core/cpp/include/metavision/sdk/core/utils/cd_frame_generator.h index caaa71012..b80677684 100644 --- a/sdk/modules/core/cpp/include/metavision/sdk/core/utils/cd_frame_generator.h +++ b/sdk/modules/core/cpp/include/metavision/sdk/core/utils/cd_frame_generator.h @@ -61,6 +61,7 @@ class CDFrameGenerator { /// /// The events shown at each refresh are such that their timestamps are in the last 'display_accumulation_time_us' /// microseconds from the last received event timestamp. + /// /// @param display_accumulation_time_us The time interval to display events from up to now (in us). void set_display_accumulation_time_us(timestamp display_accumulation_time_us); diff --git a/sdk/modules/core/cpp/include/metavision/sdk/core/utils/counter_map.h b/sdk/modules/core/cpp/include/metavision/sdk/core/utils/counter_map.h index 8e6d1c9ec..d916c8c42 100644 --- a/sdk/modules/core/cpp/include/metavision/sdk/core/utils/counter_map.h +++ b/sdk/modules/core/cpp/include/metavision/sdk/core/utils/counter_map.h @@ -31,6 +31,7 @@ class CounterMap { /// @brief Increment the reference counter associated to the input key /// /// If the key was not existing, then it is added and its associated reference count is initialized to 1 + /// /// @return The current count for the key size_t tag(KeyT key) { std::unique_lock lock(tag_mutex_); @@ -40,6 +41,7 @@ class CounterMap { /// @brief Decrement the reference counter associated to the input key /// /// If the counter goes to 0, the reference counter for the key is erased from the map until it is tagged again + /// /// @return The current count for the key size_t untag(KeyT key) { std::unique_lock lock(tag_mutex_); diff --git a/sdk/modules/core/cpp/include/metavision/sdk/core/utils/data_synchronizer_from_triggers.h b/sdk/modules/core/cpp/include/metavision/sdk/core/utils/data_synchronizer_from_triggers.h index 2efbe51b9..d2859ff72 100644 --- a/sdk/modules/core/cpp/include/metavision/sdk/core/utils/data_synchronizer_from_triggers.h +++ b/sdk/modules/core/cpp/include/metavision/sdk/core/utils/data_synchronizer_from_triggers.h @@ -102,6 +102,7 @@ class DataSynchronizerFromTriggers { /// /// This information is to be used for the synchronization (@ref synchronize_data_from_triggers). /// This method is not blocking: this is not a synchronization point. + /// /// @tparam ExtTriggerIterator The type of the external trigger input events iterator /// @param trigger_it The first iterator to an external trigger to process /// @param trigger_it_end The last iterator to an external trigger to process @@ -114,6 +115,7 @@ class DataSynchronizerFromTriggers { /// /// This information is to be used for the synchronization (@ref synchronize_data_from_triggers). /// This method is not blocking: this is not a synchronization point. + /// /// @tparam ExtTriggerIterator The type of the external trigger input events iterator /// @param trigger_it The first iterator to an external trigger to process /// @param trigger_it_end The last iterator to an external trigger to process diff --git a/sdk/modules/core/cpp/include/metavision/sdk/core/utils/frame_composer.h b/sdk/modules/core/cpp/include/metavision/sdk/core/utils/frame_composer.h index d0ffa96c3..61305693c 100644 --- a/sdk/modules/core/cpp/include/metavision/sdk/core/utils/frame_composer.h +++ b/sdk/modules/core/cpp/include/metavision/sdk/core/utils/frame_composer.h @@ -133,6 +133,7 @@ class FrameComposer { /// @brief Processes the source image @p src according to the setting from @p params and saves it inside @p params /// /// If needed, the grey image is rescaled between the two extreme intensity values defined in @p params + /// /// @param src CV_8U or CV_8UC3 original input image /// @param params Struct containing the subimage alongside with its preprocessing options and relative position /// inside the final composed image diff --git a/sdk/modules/core/cpp/include/metavision/sdk/core/utils/mostrecent_timestamp_buffer.h b/sdk/modules/core/cpp/include/metavision/sdk/core/utils/mostrecent_timestamp_buffer.h index 4ea96fcfb..104fc7a07 100644 --- a/sdk/modules/core/cpp/include/metavision/sdk/core/utils/mostrecent_timestamp_buffer.h +++ b/sdk/modules/core/cpp/include/metavision/sdk/core/utils/mostrecent_timestamp_buffer.h @@ -24,6 +24,7 @@ namespace Metavision { /// @brief Class representing a buffer of the most recent timestamps observed at each pixel of the camera /// /// A most recent timestamp buffer is also called time surface. +/// /// @note The interface follows the one of cv::Mat template class MostRecentTimestampBufferT { diff --git a/sdk/modules/core/cpp/include/metavision/sdk/core/utils/rate_estimator.h b/sdk/modules/core/cpp/include/metavision/sdk/core/utils/rate_estimator.h index a1bd01069..49059bd46 100644 --- a/sdk/modules/core/cpp/include/metavision/sdk/core/utils/rate_estimator.h +++ b/sdk/modules/core/cpp/include/metavision/sdk/core/utils/rate_estimator.h @@ -21,33 +21,63 @@ namespace Metavision { /// @brief Simple estimator class that can estimate average and peak rate online from sample counts +/// +/// This class estimates @e average and peak rate according to the added samples using the @e peak, @e step and +/// window time durations as follows : +/// - the average rate is the mean event rate computed over the samples added during last window +/// duration +/// - the peak rate is the maximum event rate of the estimated rates computed over subwindows of peak +/// duration during last window duration (thus, peak duration must always be less or equal to window +/// duration) +/// +/// The average and peak rate are then output via a callback which is called : +/// - every step duration of system time, if @c system_time_flag is true +/// - everytime a sample with a timestamp > (last callback time + step duration) is added, +/// if @c system_time_flag is false +/// +/// @note Every duration must be expressed in microseconds. +/// +/// @warning This class is not protected against concurrent accesses and does not provide thread safe functions class RateEstimator { public: /// @brief Callback type to be used in the constructor using Callback = std::function; /// @brief Constructor + /// + /// This constructor sets peak_time = step_time + /// /// @param cb Callback that will be called with the current timestamp, estimated average and - /// peak rates over the counts added in the @p window time span + /// peak rates over the counts added in the @p window_time span /// @param step_time Minimum period between two successive callbacks /// @param window_time Time window used to compute the average and peak rates - /// @param system_time_flag Flag indicating when the callback will be called; - /// if false, the callback is called with a multiple of @p step_time as current - /// timestamp, when data with a timestamp higher than the previous callback - /// timestamp plus @p step_time is added; - /// if true, the callback is called with the timestamp of the last added data as - /// current timestamp, when data is added while system time delay greater than - /// @p step_time since the last time the callback was called has elapsed. + /// @param system_time_flag If true, the callback will be called when the sytem time becomes higher than current + /// multiple of @p step_time, otherwise the sample time is used RateEstimator(const Callback &cb = Callback(), timestamp step_time = 100000, timestamp window_time = 1000000, bool system_time_flag = false); + /// @brief Constructor + /// @param step_time Minimum period between two successive callbacks + /// @param window_time Time window used to compute the average and peak rates + /// @param peak_time Time window used to estimate peak rates + /// @param cb Callback that will be called with the current timestamp, estimated average and + /// peak rates over the counts added in the @p window_time span + /// @param system_time_flag If true, the callback will be called when the sytem time becomes higher than current + /// multiple of @p step_time, otherwise the sample time is used + RateEstimator(timestamp step_time, timestamp window_time, timestamp peak_time, const Callback &cb, + bool system_time_flag = false); + /// @brief Adds a sample @p count at t = @p time /// @param time Time of the sample /// @param count Count of the sample /// - /// If the sample count added has a time @p time > next_time (next_time = last_callback_time + step_time), - /// then the callback will be called with estimated rates from the available sample counts - /// in the window timespan. + /// The callback will be called with estimated rates from the available sample counts + /// in the window timespan, if : + /// - system_time_flag = true and the sample count added has a time @p time > next_time (next_time = + /// last_callback_sample_time + step_time) + /// - system_time_flag = false and the function is called with a system time > next_time (next_time = + /// last_callback_sytem_time + step_time) + /// /// @note this function must be called with the same time used at last call (the count will then be added to the /// previous one) or with a @p time greater than the previous one void add_data(timestamp time, size_t count); @@ -63,10 +93,13 @@ class RateEstimator { /// @return The window time timestamp window_time() const; + /// @brief Get the peak duration on which peak rates are computed + /// @return The peak time + timestamp peak_time() const; + private: - std::mutex mutex_; Callback cb_; - timestamp window_time_, step_time_, next_time_; + timestamp window_time_, step_time_, peak_time_, next_time_; std::deque> counts_; bool system_time_flag_; }; diff --git a/sdk/modules/core/cpp/samples/metavision_sdk_get_started/metavision_sdk_get_started.cpp b/sdk/modules/core/cpp/samples/metavision_sdk_get_started/metavision_sdk_get_started.cpp index 0fcda357d..a3492938f 100644 --- a/sdk/modules/core/cpp/samples/metavision_sdk_get_started/metavision_sdk_get_started.cpp +++ b/sdk/modules/core/cpp/samples/metavision_sdk_get_started/metavision_sdk_get_started.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -85,9 +86,16 @@ int main(int argc, char *argv[]) { // now we can create our frame generator using previous variables auto frame_gen = Metavision::PeriodicFrameGenerationAlgorithm(camera_width, camera_height, acc, fps); - // we add the callback that will pass the events to the frame generator + // we create an algorithm that mirrors the X axis of the event stream + auto algo = Metavision::FlipXAlgorithm(camera_width - 1); + + // we add the callback that will pass the events to the algo and then the frame generator cam.cd().add_callback([&](const Metavision::EventCD *begin, const Metavision::EventCD *end) { - frame_gen.process_events(begin, end); + // we use a vector of CD events to store the output of the algo + std::vector output; + algo.process_events(begin, end, std::back_inserter(output)); + // we call the frame generator on the processed events + frame_gen.process_events(output.begin(), output.end()); }); // to render the frames, we create a window using the Window class of the UI module diff --git a/sdk/modules/core/cpp/samples/metavision_sdk_get_started/metavision_sdk_get_started_v5.cpp b/sdk/modules/core/cpp/samples/metavision_sdk_get_started/metavision_sdk_get_started_v5.cpp new file mode 100644 index 000000000..a3492938f --- /dev/null +++ b/sdk/modules/core/cpp/samples/metavision_sdk_get_started/metavision_sdk_get_started_v5.cpp @@ -0,0 +1,139 @@ +/********************************************************************************************************************** + * Copyright (c) Prophesee S.A. * + * * + * Licensed under the Apache License, Version 2.0 (the "License"); * + * you may not use this file except in compliance with the License. * + * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed * + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * + * See the License for the specific language governing permissions and limitations under the License. * + **********************************************************************************************************************/ + +// This code sample demonstrate how to use the Metavision C++ SDK. The goal of this sample is to create a simple event +// counter and displayer by introducing some basic concepts of the Metavision SDK. + +#include +#include +#include +#include +#include +#include + +// this class will be used to analyze the events +class EventAnalyzer { +public: + // class variables to store global information + int global_counter = 0; // this will track how many events we processed + Metavision::timestamp global_max_t = 0; // this will track the highest timestamp we processed + + // this function will be associated to the camera callback + // it is used to compute statistics on the received events + void analyze_events(const Metavision::EventCD *begin, const Metavision::EventCD *end) { + std::cout << "----- New callback! -----" << std::endl; + + // time analysis + // Note: events are ordered by timestamp in the callback, so the first event will have the lowest timestamp and + // the last event will have the highest timestamp + Metavision::timestamp min_t = begin->t; // get the timestamp of the first event of this callback + Metavision::timestamp max_t = (end - 1)->t; // get the timestamp of the last event of this callback + global_max_t = max_t; // events are ordered by timestamp, so the current last event has the highest timestamp + + // counting analysis + int counter = 0; + for (const Metavision::EventCD *ev = begin; ev != end; ++ev) { + ++counter; // increasing local counter + } + global_counter += counter; // increase global counter + + // report + std::cout << "There were " << counter << " events in this callback" << std::endl; + std::cout << "There were " << global_counter << " total events up to now." << std::endl; + std::cout << "The current callback included events from " << min_t << " up to " << max_t << " microseconds." + << std::endl; + + std::cout << "----- End of the callback! -----" << std::endl; + } +}; + +// main loop +int main(int argc, char *argv[]) { + Metavision::Camera cam; // create the camera + EventAnalyzer event_analyzer; // create the event analyzer + + if (argc >= 2) { + // if we passed a file path, open it + cam = Metavision::Camera::from_file(argv[1]); + } else { + // open the first available camera + cam = Metavision::Camera::from_first_available(); + } + + // to analyze the events, we add a callback that will be called periodically to give access to the latest events + cam.cd().add_callback([&event_analyzer](const Metavision::EventCD *ev_begin, const Metavision::EventCD *ev_end) { + event_analyzer.analyze_events(ev_begin, ev_end); + }); + + // to visualize the events, we will need to build frames and render them. + // building frame will be done with a frame generator that will accumulate the events over time. + // we need to provide it the camera resolution that we can retrieve from the camera instance + int camera_width = cam.geometry().width(); + int camera_height = cam.geometry().height(); + + // we also need to choose an accumulation time and a frame rate (here of 20ms and 50 fps) + const std::uint32_t acc = 20000; + double fps = 50; + + // now we can create our frame generator using previous variables + auto frame_gen = Metavision::PeriodicFrameGenerationAlgorithm(camera_width, camera_height, acc, fps); + + // we create an algorithm that mirrors the X axis of the event stream + auto algo = Metavision::FlipXAlgorithm(camera_width - 1); + + // we add the callback that will pass the events to the algo and then the frame generator + cam.cd().add_callback([&](const Metavision::EventCD *begin, const Metavision::EventCD *end) { + // we use a vector of CD events to store the output of the algo + std::vector output; + algo.process_events(begin, end, std::back_inserter(output)); + // we call the frame generator on the processed events + frame_gen.process_events(output.begin(), output.end()); + }); + + // to render the frames, we create a window using the Window class of the UI module + Metavision::Window window("Metavision SDK Get Started", camera_width, camera_height, + Metavision::BaseWindow::RenderMode::BGR); + + // we set a callback on the windows to close it when the Escape or Q key is pressed + window.set_keyboard_callback( + [&window](Metavision::UIKeyEvent key, int scancode, Metavision::UIAction action, int mods) { + if (action == Metavision::UIAction::RELEASE && + (key == Metavision::UIKeyEvent::KEY_ESCAPE || key == Metavision::UIKeyEvent::KEY_Q)) { + window.set_close_flag(); + } + }); + + // we set a callback on the frame generator so that it calls the window object to display the generated frames + frame_gen.set_output_callback([&](Metavision::timestamp, cv::Mat &frame) { window.show(frame); }); + + // start the camera + cam.start(); + + // keep running until the camera is off, the recording is finished or the escape key was pressed + while (cam.is_running() && !window.should_close()) { + // we poll events (keyboard, mouse etc.) from the system with a 20ms sleep to avoid using 100% of a CPU's core + // and we push them into the window where the callback on the escape key will ask the windows to close + static constexpr std::int64_t kSleepPeriodMs = 20; + Metavision::EventLoop::poll_and_dispatch(kSleepPeriodMs); + } + + // the recording is finished or the user wants to quit, stop the camera. + cam.stop(); + + // print the global statistics + const double length_in_seconds = event_analyzer.global_max_t / 1000000.0; + std::cout << "There were " << event_analyzer.global_counter << " events in total." << std::endl; + std::cout << "The total duration was " << length_in_seconds << " seconds." << std::endl; + if (length_in_seconds >= 1) { // no need to print this statistics if the video was too short + std::cout << "There were " << event_analyzer.global_counter / length_in_seconds + << " events per second on average." << std::endl; + } +} \ No newline at end of file diff --git a/sdk/modules/core/cpp/src/base_frame_generation_algorithm.cpp b/sdk/modules/core/cpp/src/base_frame_generation_algorithm.cpp index 3670745a3..6ffc2764f 100644 --- a/sdk/modules/core/cpp/src/base_frame_generation_algorithm.cpp +++ b/sdk/modules/core/cpp/src/base_frame_generation_algorithm.cpp @@ -43,14 +43,34 @@ void BaseFrameGenerationAlgorithm::set_colors(const cv::Scalar &bg_color, const off_on_colors_[1][i] = static_cast(on_color[i]); off_on_colors_[0][i] = static_cast(off_color[i]); } - colored_ = colored; + bg_color_[3] = 255; + off_on_colors_[0][3] = 255; + off_on_colors_[1][3] = 255; + flags_ = (colored ? Parameters::BGR : Parameters::GRAY); } void BaseFrameGenerationAlgorithm::set_color_palette(const Metavision::ColorPalette &palette) { - bg_color_ = get_cv_color(palette, Metavision::ColorType::Background); - off_on_colors_[0] = get_cv_color(palette, Metavision::ColorType::Negative); - off_on_colors_[1] = get_cv_color(palette, Metavision::ColorType::Positive); - colored_ = palette != Metavision::ColorPalette::Gray; + bg_color_ = detail::bgra(get_cv_color(palette, Metavision::ColorType::Background)); + off_on_colors_[0] = detail::bgra(get_cv_color(palette, Metavision::ColorType::Negative)); + off_on_colors_[1] = detail::bgra(get_cv_color(palette, Metavision::ColorType::Positive)); + flags_ = (palette != Metavision::ColorPalette::Gray ? Parameters::BGR : Parameters::GRAY); +} + +void BaseFrameGenerationAlgorithm::set_parameters(const cv::Vec4b &bg_color, const cv::Vec4b &on_color, + const cv::Vec4b &off_color, int flags) { + for (int i = 0; i < 4; ++i) { + bg_color_[i] = bg_color[i]; + off_on_colors_[1][i] = on_color[i]; + off_on_colors_[0][i] = off_color[i]; + } + flags_ = flags; +} + +void BaseFrameGenerationAlgorithm::set_parameters(const Metavision::ColorPalette &palette, int flags) { + bg_color_ = detail::bgra(get_cv_color(palette, Metavision::ColorType::Background)); + off_on_colors_[0] = detail::bgra(get_cv_color(palette, Metavision::ColorType::Negative)); + off_on_colors_[1] = detail::bgra(get_cv_color(palette, Metavision::ColorType::Positive)); + flags_ = flags; } cv::Vec3b BaseFrameGenerationAlgorithm::get_cv_color(const Metavision::ColorPalette &palette, @@ -61,9 +81,15 @@ cv::Vec3b BaseFrameGenerationAlgorithm::get_cv_color(const Metavision::ColorPale } void BaseFrameGenerationAlgorithm::get_dimension(uint32_t &height, uint32_t &width, uint32_t &channels) const { - height = height_; - width = width_; - channels = (colored_ ? 3 : 1); + height = height_; + width = width_; + if (flags_ & Parameters::GRAY) { + channels = 1; + } else if (flags_ & Parameters::RGB || flags_ & Parameters::BGR) { + channels = 3; + } else { + channels = 4; + } } } // namespace Metavision \ No newline at end of file diff --git a/sdk/modules/core/cpp/src/on_demand_frame_generation_algorithm.cpp b/sdk/modules/core/cpp/src/on_demand_frame_generation_algorithm.cpp index dc94b4e2b..bf4c4716a 100644 --- a/sdk/modules/core/cpp/src/on_demand_frame_generation_algorithm.cpp +++ b/sdk/modules/core/cpp/src/on_demand_frame_generation_algorithm.cpp @@ -22,8 +22,15 @@ OnDemandFrameGenerationAlgorithm::OnDemandFrameGenerationAlgorithm(int width, in } void OnDemandFrameGenerationAlgorithm::generate(timestamp ts, cv::Mat &frame, bool allocate) { - if (allocate) - frame.create(height_, width_, colored_ ? CV_8UC3 : CV_8U); + if (allocate) { + if (flags_ & Parameters::GRAY) { + frame.create(height_, width_, CV_8U); + } else if (flags_ & Parameters::RGB || flags_ & Parameters::BGR) { + frame.create(height_, width_, CV_8UC3); + } else { + frame.create(height_, width_, CV_8UC4); + } + } if (ts < last_frame_ts_us_) { std::ostringstream ss; @@ -44,7 +51,7 @@ void OnDemandFrameGenerationAlgorithm::generate(timestamp ts, cv::Mat &frame, bo std::upper_bound(begin, events_queue_.end(), ts, [](timestamp t, const auto &ev) { return t < ev.t; }); // Generate frame using events from the queue - generate_frame_from_events(begin, end, frame, bg_color_, off_on_colors_, colored_); + generate_frame_from_events(begin, end, frame, bg_color_, off_on_colors_, flags_); // Remove events older than ts - accumulation_time, // Or remove all the processed events if the accumulation time is null events_queue_.erase(events_queue_.begin(), (accumulation_time_us_ == 0 ? end : begin)); diff --git a/sdk/modules/core/cpp/src/periodic_frame_generation_algorithm.cpp b/sdk/modules/core/cpp/src/periodic_frame_generation_algorithm.cpp index d20899d0e..f9223fd7d 100644 --- a/sdk/modules/core/cpp/src/periodic_frame_generation_algorithm.cpp +++ b/sdk/modules/core/cpp/src/periodic_frame_generation_algorithm.cpp @@ -81,29 +81,68 @@ void PeriodicFrameGenerationAlgorithm::process_async(const timestamp processing_ return; // Generate Frame using the time surface - frame_.create(height_, width_, colored_ ? CV_8UC3 : CV_8U); + if (flags_ & Parameters::GRAY) { + frame_.create(height_, width_, CV_8U); + } else if (flags_ & Parameters::RGB || flags_ & Parameters::BGR) { + frame_.create(height_, width_, CV_8UC3); + } else { + frame_.create(height_, width_, CV_8UC4); + } // Compute the time threshold below which events are not to be displayed // N.B. min_event_ts_us_to_use_ might be wrong at the initialization. // Let's subtract the accumulation time to the current processing timestamp const int32_t min_display_event_ts = static_cast((processing_ts - accumulation_time_us_) - ts_offset_); + cv::Vec3b _bg_color3; + cv::Vec4b _bg_color4; + std::array _off_on_colors3; + std::array _off_on_colors4; + if (flags_ & Parameters::BGR || flags_ & Parameters::BGRA) { + _bg_color3 = detail::bgr(bg_color_); + _off_on_colors3 = {detail::bgr(off_on_colors_[0]), detail::bgr(off_on_colors_[1])}; + _bg_color4 = bg_color_; + _off_on_colors4 = off_on_colors_; + } else { + _bg_color3 = detail::rgb(bg_color_); + _off_on_colors3 = {detail::rgb(off_on_colors_[0]), detail::rgb(off_on_colors_[1])}; + _bg_color4 = detail::rgba(bg_color_); + _off_on_colors4 = {detail::rgba(off_on_colors_[0]), detail::rgba(off_on_colors_[1])}; + } + // Fill the frame from the time surface - const size_t num_pixels = time_surface_.size(); - if (colored_) { - // Matrices allocated with the create() method are always continuous in memory - auto img_ptr = frame_.ptr(0); - for (size_t i = 0; i < num_pixels; ++i) { - const auto &last_pix_data = time_surface_[i]; - img_ptr[i] = last_pix_data.first < min_display_event_ts ? bg_color_ : off_on_colors_[last_pix_data.second]; + const size_t height = static_cast(frame_.rows); + const size_t width = static_cast(frame_.cols); + // Matrices allocated with the create() method are always continuous in memory + if (flags_ & Parameters::GRAY) { + for (size_t y = 0; y < height; ++y) { + const auto last_pix_data_ptr = &time_surface_[y * width]; + auto img_ptr = frame_.ptr(flags_ & Parameters::FLIP_Y ? height - 1 - y : y); + for (size_t x = 0; x < width; ++x) { + img_ptr[x] = last_pix_data_ptr[x].first < min_display_event_ts ? + bg_color_[0] : + off_on_colors_[last_pix_data_ptr[x].second][0]; + } + } + } else if (flags_ & Parameters::RGB || flags_ & Parameters::BGR) { + for (size_t y = 0; y < height; ++y) { + const auto last_pix_data_ptr = &time_surface_[y * width]; + auto img_ptr = frame_.ptr(flags_ & Parameters::FLIP_Y ? height - 1 - y : y); + for (size_t x = 0; x < width; ++x) { + img_ptr[x] = last_pix_data_ptr[x].first < min_display_event_ts ? + _bg_color3 : + _off_on_colors3[last_pix_data_ptr[x].second]; + } } } else { - // Matrices allocated with the create() method are always continuous in memory - auto img_ptr = frame_.ptr(0); - for (size_t i = 0; i < num_pixels; ++i) { - const auto &last_pix_data = time_surface_[i]; - img_ptr[i] = - last_pix_data.first < min_display_event_ts ? bg_color_[0] : off_on_colors_[last_pix_data.second][0]; + for (size_t y = 0; y < height; ++y) { + const auto last_pix_data_ptr = &time_surface_[y * width]; + auto img_ptr = frame_.ptr(flags_ & Parameters::FLIP_Y ? height - 1 - y : y); + for (size_t x = 0; x < width; ++x) { + img_ptr[x] = last_pix_data_ptr[x].first < min_display_event_ts ? + _bg_color4 : + _off_on_colors4[last_pix_data_ptr[x].second]; + } } } diff --git a/sdk/modules/core/cpp/src/rate_estimator.cpp b/sdk/modules/core/cpp/src/rate_estimator.cpp index d30dc55eb..64b768fe1 100644 --- a/sdk/modules/core/cpp/src/rate_estimator.cpp +++ b/sdk/modules/core/cpp/src/rate_estimator.cpp @@ -11,6 +11,7 @@ #include #include +#include #include "metavision/sdk/core/utils/rate_estimator.h" namespace Metavision { @@ -19,12 +20,26 @@ RateEstimator::RateEstimator(const Callback &cb, timestamp step_time, timestamp cb_ = cb; step_time_ = step_time; window_time_ = window_time; + peak_time_ = step_time; + next_time_ = step_time; + system_time_flag_ = system_time_flag; +} + +RateEstimator::RateEstimator(timestamp step_time, timestamp window_time, timestamp peak_time, const Callback &cb, + bool system_time_flag) { + cb_ = cb; + step_time_ = step_time; + window_time_ = window_time; + if (peak_time < window_time) { + peak_time_ = peak_time; + } else { + throw std::runtime_error("Peak time must be <= window time"); + } next_time_ = step_time; system_time_flag_ = system_time_flag; } void RateEstimator::add_data(timestamp time, size_t count) { - std::unique_lock guard(mutex_); long long current_time = time; if (!counts_.empty() && counts_.back().first == time) { counts_.back().second += count; @@ -45,31 +60,28 @@ void RateEstimator::add_data(timestamp time, size_t count) { next_time_ += step_time_; } if (cb_) { - timestamp last_time = 0; - timestamp callback_time = (system_time_flag_ ? time : next_time_); - int count = 0; - double peak_rate = 0., avg_rate = 0.; + timestamp next_peak_time = peak_time_; + timestamp callback_time = (system_time_flag_ ? time : next_time_); + double cur_peak_rate = 0., peak_rate = 0., avg_rate = 0.; // find the first count corresponding to the next callback timestamp minus the time window auto begin_it = std::lower_bound(counts_.begin(), counts_.end(), callback_time - window_time_ + 1, [](const auto &p, const timestamp &t) { return p.first < t; }), end_it = std::lower_bound(counts_.begin(), counts_.end(), callback_time + 1, [](const auto &p, const timestamp &t) { return p.first < t; }); - if (begin_it != counts_.begin()) { - last_time = std::prev(begin_it)->first; - } - // update the average and peak rate from countime in the window timespan + // update the average and peak rate from counts in the window timespan for (auto it = begin_it; it != end_it; ++it) { - double rate = it->second / static_cast(it->first - last_time); - avg_rate += rate; - peak_rate = std::max(peak_rate, rate); - last_time = it->first; - ++count; - } - if (count != 0) { - avg_rate /= count; + avg_rate += it->second; + cur_peak_rate += it->second; + if (it->first >= next_peak_time) { + cur_peak_rate /= peak_time_; + peak_rate = std::max(peak_rate, cur_peak_rate); + cur_peak_rate = 0; + next_peak_time = static_cast(1 + it->first / peak_time_) * peak_time_; + } } + avg_rate /= std::min(callback_time, window_time_); cb_(callback_time, avg_rate * 1.e6, peak_rate * 1.e6); // remove older countime from the map, they won't be needed anymore @@ -80,7 +92,6 @@ void RateEstimator::add_data(timestamp time, size_t count) { } void RateEstimator::reset_data() { - std::unique_lock guard(mutex_); counts_.clear(); next_time_ = step_time_; } @@ -93,4 +104,8 @@ timestamp RateEstimator::window_time() const { return window_time_; } +timestamp RateEstimator::peak_time() const { + return peak_time_; +} + } // namespace Metavision diff --git a/sdk/modules/core/cpp/tests/CMakeLists.txt b/sdk/modules/core/cpp/tests/CMakeLists.txt index 6842fe019..79d2d5c28 100644 --- a/sdk/modules/core/cpp/tests/CMakeLists.txt +++ b/sdk/modules/core/cpp/tests/CMakeLists.txt @@ -46,10 +46,10 @@ target_link_libraries(gtest_metavision_sdk_core register_gtest(TEST sdk-core-unit-tests TARGET gtest_metavision_sdk_core) - add_executable(deprecation_warning_sample EXCLUDE_FROM_ALL ${CMAKE_CURRENT_SOURCE_DIR}/deprecation_warning_sample.cpp ) + if(NOT WIN32) target_compile_options(deprecation_warning_sample PUBLIC "-Werror") else() diff --git a/sdk/modules/core/cpp/tests/rate_estimator_gtest.cpp b/sdk/modules/core/cpp/tests/rate_estimator_gtest.cpp index d7ef5df81..e64aea3b0 100644 --- a/sdk/modules/core/cpp/tests/rate_estimator_gtest.cpp +++ b/sdk/modules/core/cpp/tests/rate_estimator_gtest.cpp @@ -351,3 +351,3647 @@ TEST(RateEstimator_GTest, custom_ctor_values_outside_window_system_time) { EXPECT_DOUBLE_EQ(k / 0.1, std::get<2>(values[i - 1])); } } + +TEST(RateEstimator_GTest, real_values) { + int samples[][2] = { + {5003, 313}, {5015, 294}, {5018, 289}, {5022, 293}, {5026, 295}, {5030, 289}, {5033, 290}, {5037, 295}, + {5041, 299}, {5044, 288}, {5048, 294}, {5051, 290}, {5055, 292}, {5058, 293}, {5062, 294}, {5065, 291}, + {5068, 295}, {5072, 295}, {5075, 288}, {5079, 295}, {5082, 290}, {5086, 290}, {5088, 290}, {5093, 293}, + {5095, 288}, {5097, 288}, {5099, 288}, {5101, 293}, {5102, 290}, {5102, 54}, {5104, 292}, {5105, 289}, + {5107, 292}, {5108, 288}, {5109, 291}, {5111, 288}, {5112, 288}, {5114, 289}, {5115, 291}, {5117, 289}, + {5119, 296}, {5121, 291}, {5124, 297}, {5127, 294}, {5130, 290}, {5132, 297}, {5135, 289}, {5138, 288}, + {5140, 295}, {5143, 288}, {5146, 289}, {5148, 290}, {5151, 293}, {5154, 296}, {5156, 293}, {5159, 294}, + {5161, 293}, {5164, 291}, {5167, 290}, {5170, 292}, {5173, 289}, {5175, 289}, {5179, 290}, {5181, 291}, + {5184, 291}, {5188, 289}, {5191, 299}, {5195, 294}, {5197, 290}, {5200, 293}, {5204, 290}, {5207, 294}, + {5210, 288}, {5213, 294}, {5215, 288}, {5218, 293}, {5222, 291}, {5225, 293}, {5228, 293}, {5238, 304}, + {5244, 290}, {5247, 291}, {5251, 289}, {5267, 320}, {5275, 290}, {5276, 292}, {5277, 297}, {5279, 296}, + {5280, 289}, {5282, 290}, {5285, 289}, {5287, 295}, {5289, 290}, {5292, 288}, {5294, 288}, {5296, 291}, + {5298, 291}, {5301, 291}, {5303, 294}, {5305, 289}, {5308, 288}, {5311, 292}, {5313, 291}, {5317, 288}, + {5320, 292}, {5323, 289}, {5327, 291}, {5329, 292}, {5334, 289}, {5336, 291}, {5339, 291}, {5343, 289}, + {5346, 290}, {5349, 289}, {5352, 288}, {5355, 290}, {5357, 288}, {5359, 293}, {5361, 293}, {5364, 298}, + {5366, 291}, {5368, 291}, {5369, 289}, {5370, 289}, {5372, 290}, {5373, 294}, {5374, 292}, {5375, 290}, + {5377, 289}, {5378, 292}, {5380, 296}, {5381, 291}, {5383, 289}, {5386, 291}, {5389, 288}, {5392, 296}, + {5395, 291}, {5398, 292}, {5400, 291}, {5404, 293}, {5406, 293}, {5409, 291}, {5412, 288}, {5415, 294}, + {5418, 291}, {5420, 289}, {5423, 288}, {5427, 293}, {5429, 290}, {5432, 289}, {5435, 292}, {5438, 294}, + {5441, 290}, {5443, 293}, {5446, 290}, {5449, 288}, {5452, 288}, {5455, 291}, {5460, 289}, {5463, 289}, + {5466, 290}, {5469, 293}, {5472, 292}, {5476, 289}, {5479, 290}, {5481, 293}, {5485, 297}, {5488, 290}, + {5491, 288}, {5495, 298}, {5498, 289}, {5502, 288}, {5505, 292}, {5508, 288}, {5511, 289}, {5513, 288}, + {5516, 294}, {5521, 294}, {5526, 292}, {5529, 297}, {5532, 294}, {5535, 289}, {5546, 311}, {5559, 291}, + {5560, 293}, {5561, 298}, {5562, 289}, {5563, 297}, {5564, 291}, {5565, 289}, {5568, 289}, {5570, 291}, + {5573, 295}, {5574, 294}, {5576, 288}, {5578, 288}, {5580, 288}, {5582, 297}, {5584, 289}, {5586, 288}, + {5587, 289}, {5589, 297}, {5591, 296}, {5593, 289}, {5594, 288}, {5596, 288}, {5599, 290}, {5600, 289}, + {5602, 293}, {5603, 293}, {5606, 288}, {5607, 288}, {5609, 289}, {5611, 290}, {5612, 293}, {5614, 289}, + {5615, 296}, {5617, 289}, {5619, 291}, {5620, 289}, {5622, 291}, {5624, 291}, {5626, 296}, {5629, 288}, + {5631, 293}, {5634, 293}, {5635, 294}, {5638, 293}, {5640, 291}, {5643, 293}, {5645, 292}, {5648, 295}, + {5650, 291}, {5652, 290}, {5655, 288}, {5657, 290}, {5659, 293}, {5662, 293}, {5664, 293}, {5667, 291}, + {5669, 293}, {5672, 289}, {5675, 288}, {5679, 288}, {5682, 296}, {5684, 290}, {5687, 294}, {5690, 291}, + {5692, 289}, {5695, 291}, {5699, 290}, {5701, 293}, {5704, 290}, {5706, 290}, {5709, 288}, {5712, 289}, + {5715, 288}, {5718, 289}, {5721, 290}, {5724, 289}, {5727, 289}, {5730, 293}, {5733, 291}, {5736, 289}, + {5739, 292}, {5742, 288}, {5746, 288}, {5749, 291}, {5753, 290}, {5757, 292}, {5761, 291}, {5769, 292}, + {5772, 291}, {5775, 289}, {5780, 288}, {5792, 301}, {5804, 288}, {5806, 288}, {5807, 295}, {5809, 289}, + {5811, 293}, {5814, 291}, {5817, 295}, {5820, 288}, {5822, 289}, {5826, 290}, {5828, 295}, {5831, 288}, + {5834, 291}, {5838, 297}, {5840, 292}, {5843, 288}, {5846, 293}, {5849, 293}, {5852, 291}, {5854, 289}, + {5857, 289}, {5859, 293}, {5862, 292}, {5864, 293}, {5867, 289}, {5870, 294}, {5872, 293}, {5875, 297}, + {5876, 288}, {5878, 295}, {5880, 297}, {5881, 296}, {5883, 294}, {5884, 292}, {5886, 293}, {5888, 290}, + {5890, 298}, {5893, 293}, {5896, 290}, {5901, 291}, {5905, 292}, {5908, 289}, {5911, 288}, {5915, 290}, + {5918, 289}, {5921, 291}, {5925, 293}, {5929, 299}, {5931, 290}, {5935, 293}, {5939, 288}, {5943, 293}, + {5946, 291}, {5949, 292}, {5953, 291}, {5956, 297}, {5959, 293}, {5962, 288}, {5966, 289}, {5970, 288}, + {5973, 292}, {5976, 293}, {5979, 293}, {5982, 296}, {5986, 288}, {5989, 288}, {5992, 290}, {5996, 294}, + {5999, 289}, {6002, 292}, {6007, 289}, {6012, 289}, {6016, 291}, {6021, 296}, {6025, 293}, {6030, 289}, + {6038, 291}, {6041, 288}, {6043, 200}, {6047, 288}, {6051, 289}, {6066, 320}, {6076, 289}, {6077, 295}, + {6079, 290}, {6080, 290}, {6082, 289}, {6083, 291}, {6085, 292}, {6087, 292}, {6090, 290}, {6092, 288}, + {6093, 296}, {6095, 292}, {6097, 288}, {6100, 294}, {6102, 292}, {6105, 291}, {6106, 288}, {6108, 292}, + {6109, 288}, {6111, 289}, {6113, 290}, {6115, 289}, {6116, 295}, {6118, 293}, {6120, 290}, {6124, 292}, + {6127, 293}, {6129, 289}, {6132, 292}, {6134, 289}, {6137, 294}, {6140, 294}, {6142, 300}, {6144, 291}, + {6147, 290}, {6149, 295}, {6152, 290}, {6154, 294}, {6157, 297}, {6159, 291}, {6162, 289}, {6164, 290}, + {6167, 293}, {6169, 297}, {6172, 294}, {6174, 292}, {6177, 293}, {6179, 294}, {6182, 293}, {6184, 295}, + {6187, 288}, {6189, 291}, {6192, 288}, {6194, 288}, {6197, 291}, {6200, 296}, {6203, 295}, {6205, 294}, + {6208, 288}, {6211, 295}, {6213, 295}, {6216, 289}, {6219, 290}, {6222, 292}, {6225, 289}, {6227, 289}, + {6232, 291}, {6234, 293}, {6236, 294}, {6239, 290}, {6242, 291}, {6245, 288}, {6248, 290}, {6251, 290}, + {6254, 293}, {6257, 295}, {6261, 292}, {6264, 294}, {6267, 289}, {6270, 289}, {6275, 290}, {6281, 295}, + {6284, 289}, {6288, 290}, {6293, 290}, {6296, 292}, {6314, 291}, {6319, 292}, {6321, 290}, {6323, 289}, + {6325, 293}, {6326, 291}, {6328, 289}, {6330, 290}, {6333, 290}, {6335, 289}, {6338, 289}, {6342, 291}, + {6345, 288}, {6348, 294}, {6351, 288}, {6353, 290}, {6356, 293}, {6358, 291}, {6360, 292}, {6363, 288}, + {6366, 289}, {6368, 289}, {6371, 291}, {6373, 293}, {6375, 290}, {6377, 288}, {6379, 290}, {6381, 290}, + {6382, 291}, {6384, 292}, {6386, 292}, {6387, 289}, {6389, 288}, {6391, 290}, {6392, 298}, {6394, 294}, + {6396, 289}, {6399, 288}, {6402, 293}, {6404, 293}, {6407, 290}, {6409, 292}, {6412, 290}, {6413, 291}, + {6416, 290}, {6418, 288}, {6421, 288}, {6424, 289}, {6426, 292}, {6429, 288}, {6431, 292}, {6434, 290}, + {6436, 291}, {6438, 290}, {6441, 291}, {6443, 289}, {6446, 288}, {6449, 295}, {6451, 291}, {6455, 292}, + {6458, 291}, {6460, 288}, {6463, 290}, {6466, 289}, {6468, 290}, {6470, 299}, {6473, 290}, {6475, 289}, + {6478, 291}, {6480, 291}, {6483, 290}, {6486, 290}, {6489, 290}, {6492, 295}, {6494, 297}, {6498, 290}, + {6501, 295}, {6504, 290}, {6507, 288}, {6511, 288}, {6515, 291}, {6519, 291}, {6523, 296}, {6526, 288}, + {6530, 288}, {6533, 291}, {6536, 289}, {6549, 320}, {6562, 295}, {6563, 294}, {6565, 289}, {6566, 289}, + {6568, 288}, {6570, 291}, {6571, 288}, {6574, 292}, {6576, 290}, {6579, 291}, {6581, 290}, {6584, 296}, + {6586, 289}, {6588, 288}, {6591, 291}, {6594, 293}, {6596, 289}, {6599, 296}, {6601, 290}, {6603, 295}, + {6605, 294}, {6609, 291}, {6611, 290}, {6614, 289}, {6617, 293}, {6619, 293}, {6621, 292}, {6623, 291}, + {6625, 294}, {6627, 297}, {6628, 293}, {6630, 291}, {6633, 288}, {6636, 295}, {6639, 295}, {6642, 288}, + {6645, 291}, {6647, 294}, {6649, 296}, {6652, 298}, {6655, 291}, {6658, 292}, {6661, 300}, {6663, 291}, + {6666, 288}, {6668, 290}, {6671, 290}, {6675, 289}, {6678, 289}, {6680, 290}, {6682, 290}, {6685, 289}, + {6687, 292}, {6690, 296}, {6693, 289}, {6695, 295}, {6698, 290}, {6700, 297}, {6703, 292}, {6706, 291}, + {6709, 291}, {6712, 289}, {6714, 291}, {6717, 292}, {6720, 296}, {6723, 294}, {6726, 290}, {6728, 288}, + {6731, 290}, {6734, 289}, {6737, 291}, {6739, 293}, {6743, 290}, {6745, 291}, {6749, 289}, {6751, 290}, + {6755, 291}, {6758, 289}, {6762, 290}, {6766, 292}, {6771, 288}, {6775, 288}, {6778, 290}, {6782, 288}, + {6787, 291}, {6791, 288}, {6797, 308}, {6818, 289}, {6821, 296}, {6823, 299}, {6824, 288}, {6827, 290}, + {6829, 288}, {6831, 288}, {6834, 290}, {6837, 291}, {6840, 289}, {6843, 290}, {6845, 295}, {6848, 288}, + {6850, 289}, {6852, 298}, {6854, 289}, {6856, 293}, {6858, 290}, {6860, 293}, {6863, 291}, {6866, 292}, + {6870, 288}, {6874, 291}, {6877, 291}, {6880, 296}, {6883, 294}, {6886, 289}, {6890, 294}, {6892, 292}, + {6896, 289}, {6899, 289}, {6901, 289}, {6905, 291}, {6907, 293}, {6910, 291}, {6913, 289}, {6915, 294}, + {6918, 288}, {6921, 288}, {6924, 288}, {6926, 290}, {6929, 289}, {6932, 289}, {6935, 294}, {6937, 292}, + {6940, 291}, {6944, 299}, {6946, 298}, {6949, 289}, {6951, 296}, {6954, 294}, {6957, 288}, {6960, 299}, + {6963, 293}, {6965, 295}, {6968, 295}, {6971, 293}, {6973, 288}, {6975, 141}, {6978, 296}, {6981, 299}, + {6984, 296}, {6986, 288}, {6988, 291}, {6990, 292}, {6993, 297}, {6995, 290}, {6997, 292}, {6999, 292}, + {7002, 294}, {7004, 290}, {7008, 296}, {7010, 288}, {7013, 288}, {7015, 290}, {7018, 292}, {7020, 291}, + {7023, 292}, {7025, 294}, {7027, 288}, {7030, 292}, {7033, 290}, {7037, 295}, {7041, 288}, {7045, 291}, + {7050, 289}, {7052, 291}, {7054, 291}, {7058, 289}, {7060, 288}, {7063, 288}, {7066, 288}, {7069, 292}, + {7087, 288}, {7096, 296}, {7098, 291}, {7100, 291}, {7102, 295}, {7104, 294}, {7105, 291}, {7107, 292}, + {7109, 289}, {7111, 295}, {7113, 293}, {7115, 300}, {7117, 291}, {7119, 295}, {7120, 289}, {7123, 296}, + {7125, 291}, {7127, 292}, {7129, 288}, {7132, 294}, {7135, 293}, {7138, 290}, {7141, 292}, {7148, 294}, + {7151, 289}, {7154, 294}, {7157, 288}, {7159, 295}, {7161, 293}, {7164, 291}, {7167, 292}, {7169, 291}, + {7172, 292}, {7174, 289}, {7176, 294}, {7178, 288}, {7181, 289}, {7183, 295}, {7185, 294}, {7188, 292}, + {7190, 292}, {7193, 292}, {7195, 294}, {7198, 293}, {7200, 290}, {7203, 300}, {7205, 289}, {7207, 298}, + {7210, 290}, {7212, 290}, {7215, 293}, {7217, 290}, {7219, 292}, {7222, 294}, {7224, 289}, {7226, 291}, + {7229, 293}, {7231, 289}, {7234, 289}, {7236, 292}, {7239, 289}, {7241, 291}, {7243, 290}, {7246, 291}, + {7249, 295}, {7251, 290}, {7253, 292}, {7257, 289}, {7260, 288}, {7262, 288}, {7265, 288}, {7267, 292}, + {7269, 293}, {7272, 296}, {7275, 296}, {7278, 291}, {7281, 294}, {7284, 292}, {7288, 290}, {7292, 293}, + {7295, 288}, {7300, 293}, {7302, 290}, {7305, 289}, {7308, 289}, {7311, 288}, {7315, 290}, {7318, 288}, + {7323, 298}, {7340, 290}, {7347, 292}, {7350, 292}, {7353, 294}, {7355, 294}, {7357, 288}, {7359, 289}, + {7361, 294}, {7363, 292}, {7365, 290}, {7367, 289}, {7369, 289}, {7372, 290}, {7374, 289}, {7377, 293}, + {7379, 294}, {7381, 293}, {7384, 291}, {7386, 288}, {7388, 291}, {7391, 290}, {7394, 293}, {7396, 290}, + {7398, 296}, {7400, 293}, {7402, 288}, {7404, 296}, {7406, 288}, {7408, 292}, {7410, 289}, {7413, 288}, + {7415, 290}, {7417, 291}, {7420, 289}, {7422, 295}, {7424, 289}, {7427, 294}, {7429, 290}, {7432, 293}, + {7434, 297}, {7437, 295}, {7439, 290}, {7441, 288}, {7444, 290}, {7447, 289}, {7449, 290}, {7452, 290}, + {7454, 289}, {7456, 294}, {7459, 289}, {7461, 288}, {7464, 291}, {7466, 296}, {7469, 289}, {7471, 289}, + {7474, 299}, {7475, 290}, {7479, 290}, {7482, 288}, {7484, 289}, {7486, 288}, {7489, 291}, {7491, 291}, + {7493, 288}, {7496, 291}, {7499, 300}, {7501, 291}, {7503, 289}, {7506, 288}, {7508, 288}, {7511, 288}, + {7513, 290}, {7516, 294}, {7520, 292}, {7523, 299}, {7527, 288}, {7530, 289}, {7535, 288}, {7537, 292}, + {7540, 293}, {7543, 290}, {7546, 290}, {7548, 293}, {7552, 289}, {7555, 288}, {7558, 290}, {7569, 289}, + {7581, 292}, {7588, 288}, {7592, 299}, {7595, 294}, {7597, 288}, {7599, 288}, {7602, 290}, {7604, 289}, + {7606, 292}, {7609, 288}, {7611, 290}, {7614, 290}, {7617, 288}, {7620, 288}, {7622, 293}, {7625, 288}, + {7628, 289}, {7631, 290}, {7633, 291}, {7636, 290}, {7639, 291}, {7642, 299}, {7645, 297}, {7648, 296}, + {7650, 288}, {7653, 292}, {7656, 290}, {7659, 288}, {7662, 296}, {7665, 292}, {7668, 289}, {7670, 292}, + {7673, 292}, {7676, 290}, {7679, 289}, {7682, 289}, {7685, 296}, {7688, 292}, {7691, 292}, {7693, 293}, + {7696, 291}, {7700, 293}, {7703, 288}, {7706, 296}, {7708, 292}, {7711, 290}, {7714, 297}, {7717, 290}, + {7719, 290}, {7722, 292}, {7724, 296}, {7727, 289}, {7730, 293}, {7733, 293}, {7736, 288}, {7739, 296}, + {7742, 301}, {7744, 288}, {7747, 290}, {7750, 288}, {7753, 292}, {7756, 289}, {7759, 290}, {7762, 288}, + {7765, 292}, {7768, 289}, {7771, 290}, {7776, 297}, {7780, 289}, {7784, 296}, {7788, 289}, {7791, 295}, + {7793, 288}, {7796, 295}, {7799, 290}, {7803, 289}, {7806, 293}, {7811, 290}, {7824, 289}, {7836, 288}, + {7842, 293}, {7847, 291}, {7849, 289}, {7852, 294}, {7854, 291}, {7857, 288}, {7860, 302}, {7862, 291}, + {7865, 288}, {7868, 290}, {7870, 289}, {7873, 289}, {7876, 289}, {7878, 289}, {7881, 290}, {7884, 288}, + {7887, 292}, {7890, 288}, {7893, 288}, {7896, 297}, {7899, 289}, {7901, 288}, {7903, 291}, {7906, 288}, + {7908, 288}, {7911, 296}, {7913, 294}, {7916, 290}, {7918, 294}, {7922, 289}, {7924, 288}, {7927, 294}, + {7929, 294}, {7931, 288}, {7934, 289}, {7936, 288}, {7938, 288}, {7940, 288}, {7942, 293}, {7945, 296}, + {7948, 292}, {7950, 303}, {7950, 23}, {7952, 294}, {7954, 289}, {7957, 299}, {7959, 289}, {7961, 292}, + {7964, 289}, {7966, 289}, {7968, 288}, {7971, 289}, {7973, 289}, {7976, 291}, {7978, 288}, {7980, 290}, + {7982, 289}, {7984, 293}, {7987, 289}, {7989, 294}, {7991, 294}, {7994, 294}, {7996, 288}, {7998, 290}, + {8001, 289}, {8004, 290}, {8007, 293}, {8010, 292}, {8013, 291}, {8017, 295}, {8021, 289}, {8024, 291}, + {8026, 294}, {8028, 289}, {8031, 295}, {8033, 296}, {8036, 292}, {8039, 292}, {8041, 291}, {8043, 289}, + {8059, 292}, {8069, 289}, {8075, 288}, {8080, 288}, {8083, 292}, {8086, 288}, {8088, 290}, {8091, 289}, + {8093, 294}, {8096, 290}, {8099, 288}, {8101, 294}, {8104, 288}, {8107, 289}, {8110, 288}, {8112, 290}, + {8115, 292}, {8118, 290}, {8121, 290}, {8124, 290}, {8127, 293}, {8130, 294}, {8132, 288}, {8135, 293}, + {8137, 289}, {8139, 296}, {8142, 295}, {8144, 292}, {8147, 290}, {8149, 291}, {8151, 305}, {8153, 293}, + {8156, 293}, {8157, 290}, {8159, 288}, {8162, 289}, {8164, 288}, {8166, 293}, {8168, 292}, {8170, 298}, + {8172, 289}, {8175, 288}, {8177, 291}, {8179, 288}, {8181, 292}, {8183, 292}, {8185, 289}, {8187, 289}, + {8189, 290}, {8191, 291}, {8194, 296}, {8196, 290}, {8198, 291}, {8200, 293}, {8202, 295}, {8204, 288}, + {8206, 290}, {8208, 293}, {8210, 290}, {8212, 293}, {8214, 289}, {8216, 292}, {8218, 295}, {8220, 290}, + {8222, 291}, {8224, 292}, {8227, 289}, {8230, 290}, {8233, 288}, {8236, 288}, {8240, 288}, {8244, 292}, + {8248, 292}, {8250, 292}, {8252, 290}, {8255, 299}, {8257, 290}, {8260, 289}, {8263, 289}, {8266, 288}, + {8269, 288}, {8280, 314}, {8292, 290}, {8299, 289}, {8305, 290}, {8310, 289}, {8312, 291}, {8315, 289}, + {8317, 289}, {8320, 295}, {8322, 289}, {8325, 293}, {8327, 288}, {8330, 291}, {8333, 294}, {8336, 293}, + {8339, 292}, {8341, 289}, {8344, 289}, {8347, 291}, {8350, 290}, {8353, 294}, {8356, 290}, {8359, 288}, + {8361, 296}, {8363, 290}, {8366, 290}, {8368, 291}, {8371, 289}, {8373, 291}, {8375, 289}, {8378, 290}, + {8380, 290}, {8382, 294}, {8385, 292}, {8387, 288}, {8389, 288}, {8391, 294}, {8393, 289}, {8395, 292}, + {8398, 296}, {8400, 288}, {8402, 289}, {8404, 290}, {8406, 290}, {8408, 290}, {8410, 292}, {8412, 289}, + {8414, 292}, {8416, 290}, {8418, 290}, {8420, 291}, {8422, 293}, {8424, 288}, {8426, 294}, {8428, 289}, + {8430, 289}, {8433, 290}, {8434, 292}, {8436, 293}, {8438, 297}, {8440, 292}, {8442, 295}, {8444, 293}, + {8446, 294}, {8449, 290}, {8451, 289}, {8453, 297}, {8455, 294}, {8457, 290}, {8460, 289}, {8463, 293}, + {8467, 290}, {8471, 291}, {8475, 295}, {8478, 292}, {8480, 289}, {8482, 289}, {8485, 289}, {8487, 292}, + {8490, 291}, {8493, 293}, {8496, 290}, {8498, 293}, {8510, 291}, {8521, 289}, {8530, 289}, {8536, 291}, + {8541, 291}, {8545, 296}, {8548, 290}, {8550, 291}, {8553, 295}, {8555, 288}, {8558, 294}, {8560, 290}, + {8563, 290}, {8565, 288}, {8568, 288}, {8571, 290}, {8574, 289}, {8577, 288}, {8579, 290}, {8582, 296}, + {8585, 291}, {8588, 289}, {8591, 288}, {8594, 288}, {8596, 291}, {8598, 292}, {8601, 288}, {8603, 290}, + {8606, 292}, {8608, 289}, {8610, 292}, {8612, 293}, {8615, 291}, {8617, 288}, {8619, 290}, {8621, 292}, + {8623, 289}, {8626, 295}, {8628, 288}, {8631, 293}, {8633, 294}, {8636, 288}, {8638, 290}, {8641, 293}, + {8643, 291}, {8646, 291}, {8649, 294}, {8651, 300}, {8653, 290}, {8656, 291}, {8657, 291}, {8660, 296}, + {8662, 290}, {8664, 288}, {8666, 290}, {8669, 289}, {8671, 290}, {8673, 299}, {8675, 296}, {8677, 300}, + {8679, 293}, {8681, 289}, {8683, 292}, {8685, 300}, {8687, 291}, {8689, 290}, {8692, 289}, {8696, 290}, + {8698, 290}, {8700, 292}, {8702, 290}, {8705, 294}, {8707, 291}, {8711, 290}, {8714, 290}, {8717, 290}, + {8721, 288}, {8724, 288}, {8727, 291}, {8729, 288}, {8731, 291}, {8733, 289}, {8735, 289}, {8738, 290}, + {8740, 296}, {8743, 292}, {8745, 288}, {8753, 290}, {8766, 291}, {8775, 290}, {8782, 289}, {8789, 290}, + {8795, 289}, {8798, 293}, {8800, 293}, {8803, 289}, {8807, 295}, {8809, 291}, {8813, 289}, {8816, 292}, + {8819, 293}, {8822, 290}, {8823, 117}, {8827, 288}, {8831, 290}, {8836, 288}, {8840, 289}, {8844, 288}, + {8848, 292}, {8852, 290}, {8855, 290}, {8858, 288}, {8862, 292}, {8865, 291}, {8868, 290}, {8872, 294}, + {8875, 291}, {8878, 290}, {8881, 295}, {8884, 294}, {8887, 291}, {8890, 291}, {8892, 297}, {8895, 290}, + {8898, 294}, {8900, 288}, {8903, 292}, {8905, 294}, {8908, 290}, {8910, 296}, {8912, 290}, {8914, 290}, + {8918, 294}, {8920, 290}, {8923, 290}, {8926, 294}, {8928, 298}, {8930, 290}, {8933, 294}, {8936, 290}, + {8938, 291}, {8941, 291}, {8944, 290}, {8946, 288}, {8948, 292}, {8950, 292}, {8953, 297}, {8955, 292}, + {8957, 292}, {8959, 289}, {8962, 295}, {8965, 297}, {8969, 289}, {8972, 289}, {8977, 292}, {8981, 292}, + {8983, 289}, {8986, 289}, {8988, 290}, {8990, 291}, {8993, 291}, {8996, 290}, {8999, 296}, {9001, 290}, + {9008, 290}, {9021, 290}, {9031, 290}, {9039, 290}, {9046, 289}, {9052, 290}, {9055, 292}, {9058, 294}, + {9060, 293}, {9063, 288}, {9066, 299}, {9069, 296}, {9072, 295}, {9075, 289}, {9078, 292}, {9081, 296}, + {9084, 289}, {9087, 289}, {9090, 293}, {9093, 292}, {9096, 292}, {9099, 289}, {9102, 288}, {9105, 292}, + {9107, 289}, {9109, 293}, {9112, 288}, {9115, 290}, {9117, 294}, {9119, 292}, {9122, 294}, {9124, 290}, + {9126, 291}, {9128, 289}, {9131, 289}, {9133, 293}, {9135, 296}, {9137, 294}, {9139, 294}, {9142, 293}, + {9144, 294}, {9146, 289}, {9148, 292}, {9150, 290}, {9152, 292}, {9154, 289}, {9156, 292}, {9158, 293}, + {9160, 289}, {9162, 290}, {9164, 302}, {9166, 288}, {9169, 295}, {9171, 289}, {9173, 293}, {9175, 298}, + {9177, 301}, {9179, 292}, {9181, 297}, {9183, 295}, {9185, 291}, {9188, 289}, {9190, 292}, {9192, 296}, + {9194, 294}, {9196, 288}, {9198, 295}, {9200, 292}, {9202, 293}, {9205, 292}, {9208, 288}, {9210, 294}, + {9213, 290}, {9216, 288}, {9219, 293}, {9223, 291}, {9225, 290}, {9227, 288}, {9228, 292}, {9231, 293}, + {9232, 291}, {9235, 296}, {9237, 294}, {9240, 289}, {9242, 289}, {9244, 289}, {9251, 292}, {9262, 288}, + {9269, 288}, {9278, 289}, {9285, 291}, {9291, 289}, {9295, 290}, {9299, 288}, {9301, 293}, {9303, 289}, + {9306, 292}, {9308, 288}, {9311, 291}, {9313, 295}, {9316, 296}, {9318, 290}, {9321, 296}, {9324, 291}, + {9326, 290}, {9329, 291}, {9332, 289}, {9335, 288}, {9338, 288}, {9341, 290}, {9344, 289}, {9346, 288}, + {9349, 296}, {9351, 289}, {9353, 293}, {9356, 300}, {9358, 289}, {9360, 289}, {9363, 294}, {9364, 290}, + {9367, 288}, {9369, 291}, {9371, 292}, {9373, 290}, {9375, 290}, {9378, 289}, {9380, 292}, {9382, 288}, + {9384, 290}, {9386, 288}, {9388, 290}, {9390, 294}, {9392, 289}, {9394, 291}, {9396, 291}, {9398, 290}, + {9400, 295}, {9402, 291}, {9404, 288}, {9406, 296}, {9408, 294}, {9410, 297}, {9411, 291}, {9413, 292}, + {9415, 290}, {9417, 293}, {9419, 294}, {9421, 291}, {9422, 296}, {9424, 290}, {9426, 288}, {9428, 292}, + {9430, 288}, {9432, 296}, {9433, 294}, {9435, 290}, {9437, 292}, {9439, 288}, {9441, 295}, {9443, 289}, + {9446, 289}, {9448, 288}, {9451, 289}, {9454, 290}, {9457, 291}, {9460, 289}, {9463, 288}, {9466, 290}, + {9468, 292}, {9470, 291}, {9472, 294}, {9474, 292}, {9476, 289}, {9479, 291}, {9482, 291}, {9484, 292}, + {9487, 295}, {9493, 292}, {9504, 292}, {9513, 289}, {9522, 294}, {9529, 290}, {9534, 290}, {9539, 288}, + {9542, 291}, {9544, 290}, {9547, 295}, {9550, 289}, {9553, 289}, {9556, 296}, {9559, 292}, {9562, 290}, + {9564, 289}, {9567, 294}, {9571, 288}, {9573, 289}, {9576, 288}, {9580, 293}, {9583, 288}, {9586, 294}, + {9589, 290}, {9591, 289}, {9594, 291}, {9596, 289}, {9599, 290}, {9602, 290}, {9604, 295}, {9607, 292}, + {9609, 296}, {9612, 288}, {9614, 288}, {9617, 294}, {9619, 293}, {9621, 291}, {9623, 293}, {9625, 288}, + {9628, 292}, {9630, 288}, {9632, 289}, {9634, 289}, {9636, 299}, {9638, 297}, {9640, 289}, {9642, 293}, + {9644, 291}, {9646, 292}, {9648, 291}, {9650, 293}, {9652, 290}, {9655, 293}, {9657, 294}, {9659, 290}, + {9661, 290}, {9663, 290}, {9665, 295}, {9667, 295}, {9669, 292}, {9671, 296}, {9673, 291}, {9675, 288}, + {9677, 298}, {9679, 292}, {9681, 290}, {9683, 293}, {9685, 295}, {9687, 290}, {9689, 293}, {9692, 293}, + {9695, 288}, {9697, 149}, {9701, 295}, {9704, 289}, {9708, 288}, {9710, 293}, {9712, 289}, {9714, 292}, + {9716, 291}, {9718, 288}, {9720, 291}, {9723, 291}, {9725, 292}, {9728, 292}, {9730, 294}, {9740, 291}, + {9751, 291}, {9758, 288}, {9767, 288}, {9774, 289}, {9782, 288}, {9787, 288}, {9792, 289}, {9795, 294}, + {9798, 297}, {9802, 296}, {9806, 292}, {9810, 290}, {9814, 292}, {9819, 296}, {9823, 297}, {9827, 289}, + {9831, 290}, {9836, 292}, {9840, 295}, {9844, 288}, {9849, 290}, {9853, 288}, {9857, 289}, {9860, 291}, + {9863, 289}, {9867, 289}, {9870, 293}, {9872, 294}, {9875, 288}, {9879, 292}, {9882, 291}, {9885, 295}, + {9889, 297}, {9892, 295}, {9894, 291}, {9898, 294}, {9900, 288}, {9903, 288}, {9905, 292}, {9907, 289}, + {9910, 292}, {9912, 289}, {9914, 296}, {9916, 291}, {9918, 288}, {9920, 289}, {9923, 288}, {9925, 304}, + {9927, 292}, {9929, 290}, {9931, 291}, {9934, 288}, {9936, 291}, {9938, 291}, {9940, 296}, {9942, 288}, + {9944, 297}, {9946, 298}, {9948, 290}, {9950, 288}, {9952, 296}, {9955, 289}, {9957, 296}, {9959, 289}, + {9962, 290}, {9965, 289}, {9968, 290}, {9972, 290}, {9976, 290}, {9980, 294}, {9983, 299}, {9985, 297}, + {9988, 293}, {9990, 292}, {9993, 292}, {9995, 297}, {9998, 288}, {10000, 290}, {10004, 289}, {10014, 288}, + {10023, 291}, {10031, 288}, {10038, 289}, {10043, 289}, {10050, 289}, {10053, 291}, {10058, 291}, {10060, 289}, + {10063, 291}, {10066, 291}, {10068, 288}, {10072, 291}, {10075, 291}, {10078, 291}, {10081, 288}, {10084, 290}, + {10087, 290}, {10090, 291}, {10093, 290}, {10096, 293}, {10100, 290}, {10103, 289}, {10107, 295}, {10111, 289}, + {10114, 289}, {10116, 294}, {10119, 293}, {10122, 291}, {10124, 292}, {10127, 288}, {10129, 288}, {10131, 288}, + {10134, 291}, {10136, 289}, {10138, 294}, {10140, 290}, {10142, 291}, {10145, 292}, {10147, 295}, {10149, 291}, + {10151, 291}, {10153, 288}, {10156, 293}, {10158, 297}, {10160, 290}, {10162, 294}, {10164, 295}, {10166, 292}, + {10168, 291}, {10170, 290}, {10172, 293}, {10173, 298}, {10175, 295}, {10177, 289}, {10179, 290}, {10181, 294}, + {10183, 292}, {10185, 292}, {10187, 295}, {10189, 288}, {10191, 290}, {10193, 292}, {10194, 295}, {10196, 291}, + {10198, 290}, {10200, 292}, {10202, 294}, {10203, 290}, {10205, 291}, {10207, 289}, {10209, 294}, {10212, 290}, + {10214, 289}, {10217, 294}, {10219, 291}, {10222, 290}, {10226, 291}, {10228, 293}, {10231, 291}, {10232, 293}, + {10234, 291}, {10237, 291}, {10239, 291}, {10241, 294}, {10243, 291}, {10245, 290}, {10247, 288}, {10249, 288}, + {10257, 292}, {10266, 288}, {10274, 288}, {10280, 288}, {10288, 290}, {10293, 289}, {10298, 290}, {10302, 289}, + {10305, 289}, {10309, 289}, {10311, 289}, {10314, 288}, {10316, 288}, {10318, 289}, {10321, 288}, {10324, 292}, + {10327, 293}, {10329, 292}, {10332, 293}, {10335, 292}, {10338, 291}, {10340, 289}, {10343, 290}, {10347, 292}, + {10350, 292}, {10353, 293}, {10355, 288}, {10358, 288}, {10360, 288}, {10363, 295}, {10365, 289}, {10368, 295}, + {10370, 295}, {10372, 289}, {10375, 292}, {10377, 290}, {10379, 289}, {10381, 292}, {10383, 289}, {10385, 291}, + {10387, 291}, {10389, 288}, {10392, 291}, {10394, 295}, {10396, 293}, {10398, 296}, {10400, 291}, {10401, 290}, + {10404, 295}, {10405, 289}, {10407, 293}, {10409, 291}, {10411, 288}, {10413, 294}, {10414, 293}, {10416, 293}, + {10418, 298}, {10420, 295}, {10422, 288}, {10423, 294}, {10425, 290}, {10427, 289}, {10429, 289}, {10430, 292}, + {10432, 297}, {10434, 294}, {10436, 299}, {10438, 291}, {10439, 294}, {10441, 294}, {10443, 289}, {10445, 288}, + {10447, 291}, {10448, 298}, {10450, 291}, {10452, 289}, {10454, 294}, {10457, 288}, {10459, 288}, {10462, 292}, + {10464, 289}, {10467, 295}, {10470, 290}, {10473, 293}, {10475, 289}, {10477, 288}, {10479, 295}, {10481, 289}, + {10483, 291}, {10485, 293}, {10487, 290}, {10490, 295}, {10492, 291}, {10494, 288}, {10498, 289}, {10506, 288}, + {10515, 288}, {10521, 288}, {10528, 292}, {10536, 290}, {10542, 288}, {10548, 290}, {10555, 289}, {10559, 290}, + {10563, 294}, {10566, 289}, {10569, 292}, {10571, 173}, {10575, 289}, {10578, 293}, {10582, 289}, {10586, 292}, + {10588, 292}, {10593, 290}, {10596, 294}, {10600, 289}, {10605, 294}, {10609, 288}, {10614, 290}, {10619, 288}, + {10622, 294}, {10625, 293}, {10629, 291}, {10632, 294}, {10636, 292}, {10639, 290}, {10642, 289}, {10645, 289}, + {10648, 292}, {10651, 290}, {10654, 293}, {10657, 292}, {10659, 289}, {10661, 288}, {10664, 288}, {10666, 294}, + {10668, 290}, {10670, 291}, {10673, 294}, {10675, 294}, {10677, 299}, {10679, 294}, {10681, 293}, {10683, 294}, + {10685, 291}, {10687, 288}, {10689, 289}, {10691, 290}, {10693, 288}, {10695, 290}, {10697, 291}, {10699, 294}, + {10701, 290}, {10703, 297}, {10705, 288}, {10707, 298}, {10709, 294}, {10711, 296}, {10714, 292}, {10716, 289}, + {10718, 291}, {10721, 293}, {10723, 291}, {10726, 291}, {10729, 293}, {10731, 294}, {10735, 291}, {10738, 288}, + {10742, 288}, {10745, 288}, {10748, 291}, {10752, 296}, {10756, 292}, {10759, 294}, {10761, 292}, {10764, 289}, + {10766, 290}, {10769, 288}, {10773, 291}, {10776, 290}, {10779, 288}, {10782, 293}, {10784, 289}, {10794, 289}, + {10805, 288}, {10814, 294}, {10823, 289}, {10832, 289}, {10838, 290}, {10844, 288}, {10850, 292}, {10855, 292}, + {10859, 293}, {10862, 296}, {10865, 293}, {10869, 291}, {10872, 289}, {10875, 293}, {10878, 288}, {10883, 288}, + {10886, 296}, {10889, 290}, {10893, 297}, {10896, 295}, {10900, 295}, {10904, 289}, {10907, 292}, {10911, 288}, + {10914, 288}, {10917, 289}, {10921, 290}, {10923, 288}, {10925, 292}, {10928, 294}, {10930, 292}, {10933, 291}, + {10935, 290}, {10937, 291}, {10939, 294}, {10941, 293}, {10943, 288}, {10945, 288}, {10947, 290}, {10949, 290}, + {10951, 293}, {10953, 294}, {10955, 294}, {10957, 290}, {10959, 289}, {10961, 299}, {10962, 291}, {10964, 291}, + {10966, 293}, {10968, 290}, {10970, 288}, {10971, 295}, {10973, 295}, {10975, 293}, {10977, 297}, {10978, 294}, + {10980, 294}, {10981, 291}, {10983, 291}, {10985, 296}, {10987, 293}, {10989, 297}, {10990, 289}, {10992, 292}, + {10994, 289}, {10995, 291}, {10997, 293}, {10998, 291}, {11000, 289}, {11002, 292}, {11003, 288}, {11004, 300}, + {11005, 291}, {11007, 294}, {11008, 288}, {11010, 292}, {11011, 290}, {11013, 291}, {11014, 288}, {11016, 297}, + {11018, 295}, {11019, 295}, {11021, 291}, {11023, 290}, {11026, 288}, {11028, 293}, {11030, 291}, {11032, 290}, + {11035, 288}, {11037, 289}, {11040, 293}, {11041, 291}, {11043, 296}, {11045, 289}, {11046, 292}, {11048, 299}, + {11050, 293}, {11052, 295}, {11054, 292}, {11056, 289}, {11058, 296}, {11060, 289}, {11062, 288}, {11069, 288}, + {11077, 289}, {11084, 288}, {11090, 288}, {11096, 290}, {11104, 288}, {11109, 288}, {11115, 292}, {11119, 294}, + {11123, 297}, {11126, 290}, {11130, 289}, {11133, 291}, {11136, 291}, {11138, 289}, {11142, 289}, {11145, 291}, + {11148, 293}, {11152, 290}, {11156, 288}, {11160, 288}, {11163, 290}, {11166, 292}, {11169, 288}, {11172, 288}, + {11175, 289}, {11179, 288}, {11182, 288}, {11185, 290}, {11188, 288}, {11190, 289}, {11193, 288}, {11196, 296}, + {11199, 293}, {11202, 288}, {11205, 289}, {11208, 300}, {11213, 293}, {11215, 290}, {11217, 295}, {11219, 288}, + {11221, 290}, {11224, 290}, {11226, 296}, {11228, 288}, {11231, 291}, {11233, 291}, {11235, 294}, {11237, 291}, + {11239, 288}, {11241, 290}, {11243, 289}, {11245, 290}, {11246, 293}, {11248, 296}, {11250, 291}, {11252, 292}, + {11253, 290}, {11255, 292}, {11257, 294}, {11259, 294}, {11261, 290}, {11263, 296}, {11265, 292}, {11267, 295}, + {11269, 290}, {11271, 288}, {11272, 292}, {11274, 293}, {11276, 290}, {11278, 291}, {11280, 291}, {11281, 292}, + {11283, 294}, {11285, 297}, {11287, 291}, {11289, 297}, {11292, 291}, {11295, 292}, {11298, 291}, {11301, 291}, + {11304, 292}, {11308, 291}, {11312, 292}, {11315, 292}, {11318, 289}, {11320, 299}, {11324, 297}, {11327, 291}, + {11329, 290}, {11332, 288}, {11334, 290}, {11337, 289}, {11340, 288}, {11342, 288}, {11345, 290}, {11353, 290}, + {11363, 289}, {11373, 288}, {11383, 289}, {11390, 290}, {11400, 291}, {11408, 290}, {11415, 288}, {11421, 289}, + {11425, 291}, {11430, 292}, {11435, 292}, {11439, 292}, {11442, 288}, {11446, 289}, {11449, 292}, {11453, 291}, + {11457, 293}, {11461, 290}, {11466, 288}, {11470, 292}, {11474, 288}, {11474, 22}, {11478, 288}, {11481, 290}, + {11484, 290}, {11487, 288}, {11490, 289}, {11492, 289}, {11495, 292}, {11498, 293}, {11500, 289}, {11503, 294}, + {11505, 294}, {11508, 290}, {11510, 288}, {11512, 293}, {11515, 293}, {11517, 291}, {11519, 289}, {11521, 288}, + {11523, 288}, {11526, 291}, {11528, 289}, {11530, 289}, {11532, 288}, {11534, 294}, {11537, 289}, {11540, 293}, + {11542, 292}, {11546, 289}, {11548, 295}, {11550, 290}, {11552, 292}, {11555, 298}, {11557, 288}, {11560, 296}, + {11562, 289}, {11564, 297}, {11567, 293}, {11569, 291}, {11571, 292}, {11573, 291}, {11576, 293}, {11577, 291}, + {11580, 291}, {11581, 289}, {11584, 290}, {11585, 293}, {11588, 290}, {11590, 291}, {11592, 292}, {11594, 298}, + {11596, 295}, {11599, 288}, {11601, 296}, {11602, 292}, {11604, 290}, {11606, 292}, {11609, 292}, {11611, 291}, + {11613, 290}, {11616, 294}, {11618, 293}, {11621, 296}, {11623, 288}, {11626, 290}, {11629, 290}, {11631, 290}, + {11633, 292}, {11635, 288}, {11636, 292}, {11638, 288}, {11640, 289}, {11642, 293}, {11645, 293}, {11647, 290}, + {11649, 292}, {11651, 292}, {11653, 288}, {11657, 292}, {11658, 288}, {11667, 290}, {11674, 291}, {11682, 288}, + {11689, 291}, {11696, 289}, {11702, 288}, {11709, 288}, {11715, 290}, {11718, 289}, {11723, 288}, {11726, 293}, + {11729, 290}, {11732, 288}, {11734, 290}, {11736, 288}, {11739, 290}, {11741, 293}, {11744, 289}, {11746, 289}, + {11749, 294}, {11752, 292}, {11754, 292}, {11757, 289}, {11759, 289}, {11761, 299}, {11764, 299}, {11768, 299}, + {11770, 290}, {11773, 290}, {11776, 291}, {11777, 289}, {11780, 292}, {11782, 289}, {11784, 288}, {11787, 289}, + {11789, 288}, {11791, 288}, {11792, 289}, {11795, 293}, {11796, 289}, {11799, 291}, {11801, 291}, {11803, 292}, + {11805, 288}, {11807, 292}, {11809, 289}, {11812, 296}, {11814, 292}, {11816, 288}, {11818, 289}, {11820, 290}, + {11822, 291}, {11824, 289}, {11826, 292}, {11828, 292}, {11830, 291}, {11832, 293}, {11834, 291}, {11836, 294}, + {11838, 296}, {11840, 294}, {11841, 294}, {11843, 290}, {11845, 294}, {11847, 289}, {11849, 288}, {11851, 290}, + {11852, 289}, {11854, 289}, {11856, 290}, {11858, 296}, {11860, 292}, {11861, 290}, {11863, 291}, {11865, 288}, + {11867, 296}, {11868, 293}, {11870, 294}, {11872, 289}, {11874, 296}, {11876, 298}, {11878, 299}, {11879, 291}, + {11881, 290}, {11883, 293}, {11885, 291}, {11887, 289}, {11890, 289}, {11892, 293}, {11895, 289}, {11899, 290}, + {11903, 288}, {11907, 296}, {11911, 291}, {11915, 294}, {11918, 290}, {11920, 291}, {11923, 296}, {11926, 290}, + {11929, 294}, {11932, 298}, {11935, 288}, {11938, 291}, {11941, 289}, {11945, 288}, {11953, 288}, {11964, 292}, + {11975, 291}, {11987, 295}, {11997, 291}, {12007, 289}, {12014, 289}, {12020, 289}, {12026, 290}, {12031, 290}, + {12035, 289}, {12038, 288}, {12042, 290}, {12045, 290}, {12049, 292}, {12053, 295}, {12057, 289}, {12061, 293}, + {12065, 289}, {12069, 294}, {12072, 290}, {12074, 288}, {12077, 291}, {12080, 288}, {12082, 290}, {12084, 297}, + {12087, 295}, {12090, 288}, {12092, 291}, {12094, 289}, {12099, 290}, {12102, 288}, {12104, 289}, {12107, 292}, + {12110, 289}, {12113, 290}, {12115, 289}, {12118, 289}, {12121, 290}, {12123, 291}, {12126, 294}, {12129, 292}, + {12131, 288}, {12133, 291}, {12136, 289}, {12138, 293}, {12141, 291}, {12144, 291}, {12146, 296}, {12148, 294}, + {12150, 288}, {12153, 291}, {12155, 292}, {12157, 289}, {12160, 291}, {12162, 291}, {12164, 288}, {12166, 289}, + {12168, 289}, {12170, 291}, {12173, 290}, {12174, 295}, {12177, 293}, {12179, 297}, {12182, 290}, {12184, 291}, + {12186, 295}, {12188, 295}, {12190, 291}, {12192, 292}, {12194, 296}, {12196, 291}, {12198, 288}, {12200, 293}, + {12202, 290}, {12204, 297}, {12205, 292}, {12209, 296}, {12211, 297}, {12213, 295}, {12215, 288}, {12216, 291}, + {12219, 288}, {12221, 292}, {12223, 288}, {12225, 292}, {12227, 289}, {12229, 292}, {12232, 291}, {12234, 292}, + {12237, 288}, {12240, 298}, {12242, 292}, {12244, 297}, {12246, 291}, {12248, 298}, {12249, 292}, {12251, 289}, + {12253, 290}, {12255, 289}, {12257, 292}, {12259, 292}, {12261, 291}, {12263, 289}, {12266, 297}, {12268, 288}, + {12269, 288}, {12276, 290}, {12283, 289}, {12290, 288}, {12297, 290}, {12304, 290}, {12311, 290}, {12319, 288}, + {12325, 292}, {12329, 289}, {12330, 58}, {12335, 290}, {12339, 294}, {12342, 290}, {12346, 288}, {12349, 289}, + {12352, 291}, {12355, 289}, {12358, 290}, {12361, 290}, {12364, 288}, {12366, 290}, {12368, 290}, {12371, 288}, + {12373, 290}, {12375, 289}, {12377, 290}, {12379, 290}, {12381, 290}, {12383, 288}, {12386, 290}, {12388, 288}, + {12390, 292}, {12392, 292}, {12394, 294}, {12397, 289}, {12398, 288}, {12401, 289}, {12403, 290}, {12406, 294}, + {12408, 290}, {12410, 290}, {12413, 294}, {12416, 288}, {12418, 293}, {12420, 292}, {12422, 288}, {12424, 290}, + {12427, 294}, {12429, 288}, {12431, 288}, {12433, 295}, {12436, 294}, {12438, 293}, {12441, 290}, {12443, 293}, + {12446, 290}, {12449, 289}, {12451, 294}, {12453, 296}, {12456, 293}, {12458, 290}, {12460, 290}, {12463, 289}, + {12465, 294}, {12467, 289}, {12470, 289}, {12472, 289}, {12474, 293}, {12477, 289}, {12479, 295}, {12482, 291}, + {12483, 290}, {12485, 294}, {12488, 291}, {12490, 288}, {12492, 290}, {12495, 296}, {12497, 291}, {12499, 293}, + {12502, 291}, {12504, 290}, {12507, 289}, {12509, 291}, {12513, 291}, {12516, 290}, {12519, 289}, {12523, 294}, + {12527, 296}, {12530, 296}, {12534, 290}, {12538, 289}, {12543, 290}, {12545, 288}, {12549, 298}, {12552, 290}, + {12554, 289}, {12558, 296}, {12561, 288}, {12564, 295}, {12567, 293}, {12570, 290}, {12573, 292}, {12581, 290}, + {12590, 289}, {12600, 290}, {12608, 288}, {12616, 291}, {12623, 289}, {12630, 294}, {12638, 288}, {12643, 294}, + {12649, 293}, {12655, 293}, {12659, 290}, {12663, 290}, {12666, 289}, {12669, 288}, {12673, 291}, {12676, 288}, + {12679, 292}, {12682, 293}, {12684, 289}, {12686, 291}, {12688, 291}, {12690, 290}, {12692, 292}, {12694, 291}, + {12696, 289}, {12698, 297}, {12700, 293}, {12702, 289}, {12704, 293}, {12706, 289}, {12708, 293}, {12710, 304}, + {12712, 291}, {12714, 305}, {12716, 299}, {12719, 291}, {12721, 293}, {12723, 292}, {12726, 297}, {12728, 291}, + {12731, 292}, {12734, 288}, {12737, 289}, {12740, 292}, {12743, 290}, {12745, 288}, {12748, 291}, {12750, 288}, + {12753, 289}, {12755, 290}, {12757, 289}, {12760, 291}, {12764, 291}, {12766, 292}, {12769, 290}, {12771, 292}, + {12773, 289}, {12775, 290}, {12777, 289}, {12779, 290}, {12782, 294}, {12784, 292}, {12787, 292}, {12788, 297}, + {12790, 292}, {12792, 288}, {12794, 297}, {12795, 291}, {12797, 294}, {12799, 289}, {12801, 298}, {12803, 289}, + {12805, 295}, {12807, 293}, {12809, 294}, {12811, 292}, {12813, 293}, {12815, 288}, {12817, 292}, {12819, 293}, + {12821, 288}, {12823, 293}, {12825, 294}, {12827, 288}, {12828, 291}, {12830, 297}, {12833, 289}, {12834, 291}, + {12836, 293}, {12839, 293}, {12840, 288}, {12842, 289}, {12844, 289}, {12846, 291}, {12848, 290}, {12849, 288}, + {12851, 293}, {12853, 289}, {12855, 294}, {12858, 290}, {12859, 292}, {12861, 292}, {12864, 288}, {12866, 292}, + {12869, 294}, {12873, 294}, {12875, 296}, {12878, 292}, {12881, 289}, {12884, 300}, {12886, 292}, {12888, 298}, + {12890, 289}, {12892, 292}, {12894, 296}, {12896, 291}, {12897, 288}, {12900, 290}, {12902, 294}, {12904, 288}, + {12906, 291}, {12908, 290}, {12910, 293}, {12913, 296}, {12914, 292}, {12920, 289}, {12927, 289}, {12935, 289}, + {12942, 288}, {12949, 291}, {12957, 294}, {12965, 288}, {12973, 288}, {12978, 293}, {12985, 289}, {12990, 296}, + {12995, 288}, {12998, 295}, {13000, 290}, {13002, 293}, {13005, 299}, {13009, 289}, {13011, 292}, {13013, 296}, + {13016, 291}, {13018, 290}, {13021, 301}, {13023, 289}, {13026, 288}, {13028, 291}, {13031, 290}, {13033, 289}, + {13035, 293}, {13037, 289}, {13040, 292}, {13042, 299}, {13050, 291}, {13053, 290}, {13055, 292}, {13058, 291}, + {13061, 288}, {13065, 288}, {13068, 288}, {13073, 292}, {13076, 294}, {13080, 293}, {13083, 297}, {13087, 292}, + {13090, 288}, {13093, 288}, {13097, 291}, {13100, 292}, {13103, 290}, {13107, 290}, {13110, 289}, {13113, 290}, + {13116, 289}, {13119, 288}, {13122, 291}, {13124, 288}, {13127, 290}, {13130, 288}, {13133, 289}, {13136, 293}, + {13138, 288}, {13141, 294}, {13144, 296}, {13146, 292}, {13149, 293}, {13151, 290}, {13154, 288}, {13158, 289}, + {13161, 292}, {13164, 288}, {13166, 250}, {13170, 291}, {13172, 294}, {13175, 291}, {13177, 292}, {13180, 290}, + {13182, 292}, {13185, 292}, {13188, 292}, {13190, 292}, {13193, 289}, {13195, 290}, {13198, 296}, {13200, 290}, + {13202, 300}, {13204, 294}, {13206, 289}, {13209, 292}, {13211, 292}, {13213, 292}, {13215, 296}, {13217, 298}, + {13219, 295}, {13222, 288}, {13224, 293}, {13227, 293}, {13229, 290}, {13232, 292}, {13234, 293}, {13238, 290}, + {13240, 288}, {13244, 292}, {13247, 293}, {13249, 288}, {13252, 288}, {13254, 292}, {13256, 288}, {13258, 294}, + {13260, 294}, {13262, 292}, {13264, 290}, {13267, 293}, {13270, 296}, {13272, 293}, {13275, 294}, {13277, 293}, + {13279, 290}, {13281, 293}, {13283, 293}, {13285, 289}, {13287, 297}, {13293, 288}, {13301, 296}, {13309, 295}, + {13315, 288}, {13323, 292}, {13329, 292}, {13334, 289}, {13339, 290}, {13344, 289}, {13349, 292}, {13352, 292}, + {13356, 288}, {13359, 289}, {13362, 291}, {13364, 289}, {13366, 288}, {13369, 289}, {13371, 289}, {13373, 293}, + {13375, 290}, {13378, 288}, {13381, 290}, {13383, 293}, {13385, 288}, {13387, 303}, {13389, 293}, {13391, 294}, + {13393, 293}, {13395, 290}, {13397, 302}, {13400, 292}, {13402, 292}, {13405, 290}, {13408, 298}, {13411, 291}, + {13413, 291}, {13416, 306}, {13419, 288}, {13422, 290}, {13425, 291}, {13427, 302}, {13430, 294}, {13433, 288}, + {13436, 290}, {13439, 288}, {13443, 290}, {13446, 294}, {13450, 294}, {13453, 289}, {13456, 291}, {13459, 289}, + {13462, 293}, {13465, 288}, {13469, 295}, {13471, 289}, {13474, 292}, {13477, 291}, {13480, 288}, {13483, 291}, + {13487, 288}, {13490, 290}, {13494, 288}, {13496, 291}, {13500, 294}, {13503, 289}, {13505, 290}, {13508, 291}, + {13510, 291}, {13513, 293}, {13516, 293}, {13518, 296}, {13521, 289}, {13523, 289}, {13526, 290}, {13528, 292}, + {13531, 290}, {13533, 288}, {13536, 288}, {13539, 292}, {13542, 290}, {13544, 288}, {13547, 289}, {13549, 290}, + {13552, 289}, {13554, 294}, {13557, 294}, {13559, 293}, {13561, 288}, {13564, 289}, {13566, 299}, {13569, 294}, + {13572, 292}, {13576, 288}, {13579, 290}, {13582, 296}, {13585, 297}, {13589, 291}, {13594, 289}, {13597, 289}, + {13602, 295}, {13605, 293}, {13607, 292}, {13610, 290}, {13613, 292}, {13616, 291}, {13618, 291}, {13619, 289}, + {13621, 290}, {13624, 291}, {13625, 290}, {13628, 294}, {13630, 293}, {13632, 297}, {13634, 295}, {13636, 289}, + {13639, 293}, {13641, 288}, {13643, 293}, {13645, 289}, {13648, 291}, {13650, 288}, {13652, 288}, {13655, 288}, + {13662, 289}, {13669, 289}, {13677, 288}, {13684, 288}, {13692, 289}, {13700, 296}, {13705, 291}, {13711, 289}, + {13717, 290}, {13721, 290}, {13724, 290}, {13727, 293}, {13731, 291}, {13733, 290}, {13736, 289}, {13738, 291}, + {13740, 298}, {13742, 292}, {13744, 289}, {13746, 291}, {13748, 290}, {13750, 294}, {13752, 293}, {13754, 290}, + {13756, 292}, {13758, 290}, {13761, 290}, {13763, 291}, {13765, 288}, {13768, 290}, {13771, 291}, {13773, 293}, + {13775, 290}, {13778, 294}, {13780, 300}, {13782, 297}, {13785, 289}, {13787, 291}, {13789, 295}, {13791, 289}, + {13793, 290}, {13795, 289}, {13796, 289}, {13798, 289}, {13800, 290}, {13802, 294}, {13805, 288}, {13807, 292}, + {13810, 290}, {13813, 290}, {13816, 288}, {13818, 296}, {13824, 293}, {13826, 290}, {13829, 296}, {13832, 288}, + {13835, 292}, {13838, 290}, {13841, 291}, {13845, 295}, {13847, 292}, {13850, 289}, {13852, 291}, {13855, 293}, + {13858, 292}, {13861, 292}, {13863, 293}, {13866, 288}, {13868, 289}, {13871, 294}, {13874, 289}, {13877, 288}, + {13879, 288}, {13882, 293}, {13884, 292}, {13886, 292}, {13889, 294}, {13891, 289}, {13894, 295}, {13897, 294}, + {13899, 288}, {13902, 289}, {13905, 288}, {13907, 293}, {13910, 291}, {13912, 289}, {13915, 289}, {13917, 288}, + {13920, 290}, {13923, 288}, {13925, 290}, {13927, 289}, {13930, 293}, {13934, 291}, {13936, 288}, {13939, 293}, + {13941, 289}, {13944, 291}, {13947, 292}, {13950, 293}, {13953, 291}, {13956, 294}, {13959, 290}, {13962, 290}, + {13965, 289}, {13969, 293}, {13972, 289}, {13976, 289}, {13980, 294}, {13983, 292}, {13988, 291}, {13992, 288}, + {13995, 291}, {13999, 293}, {14002, 289}, {14003, 289}, {14006, 291}, {14008, 289}, {14010, 291}, {14012, 292}, + {14015, 295}, {14021, 290}, {14029, 289}, {14035, 289}, {14044, 290}, {14046, 85}, {14053, 291}, {14060, 288}, + {14066, 288}, {14070, 288}, {14074, 288}, {14080, 291}, {14085, 291}, {14088, 292}, {14091, 290}, {14095, 291}, + {14098, 288}, {14101, 295}, {14102, 288}, {14105, 295}, {14107, 290}, {14109, 288}, {14110, 290}, {14112, 289}, + {14114, 292}, {14116, 290}, {14118, 291}, {14120, 299}, {14122, 291}, {14123, 288}, {14125, 290}, {14127, 290}, + {14129, 293}, {14131, 288}, {14133, 292}, {14135, 308}, {14138, 291}, {14140, 289}, {14142, 294}, {14145, 291}, + {14147, 305}, {14150, 290}, {14152, 306}, {14156, 292}, {14158, 288}, {14161, 290}, {14163, 288}, {14165, 295}, + {14167, 296}, {14169, 290}, {14172, 288}, {14174, 289}, {14176, 289}, {14178, 288}, {14180, 290}, {14182, 288}, + {14184, 290}, {14186, 288}, {14188, 291}, {14191, 293}, {14193, 291}, {14196, 289}, {14199, 288}, {14202, 292}, + {14205, 292}, {14208, 288}, {14211, 289}, {14214, 289}, {14218, 293}, {14221, 293}, {14225, 288}, {14228, 289}, + {14231, 295}, {14233, 288}, {14237, 291}, {14240, 288}, {14243, 289}, {14245, 289}, {14249, 291}, {14251, 289}, + {14254, 289}, {14257, 291}, {14260, 295}, {14262, 297}, {14266, 288}, {14268, 293}, {14271, 289}, {14274, 291}, + {14276, 293}, {14279, 294}, {14281, 288}, {14284, 292}, {14287, 290}, {14290, 289}, {14293, 290}, {14295, 288}, + {14298, 295}, {14300, 299}, {14303, 288}, {14305, 288}, {14308, 291}, {14310, 294}, {14312, 293}, {14315, 288}, + {14318, 289}, {14320, 289}, {14323, 289}, {14325, 289}, {14327, 289}, {14330, 291}, {14333, 296}, {14336, 289}, + {14339, 296}, {14341, 289}, {14344, 294}, {14347, 291}, {14350, 290}, {14353, 288}, {14357, 297}, {14359, 293}, + {14361, 288}, {14364, 289}, {14366, 290}, {14369, 289}, {14371, 292}, {14375, 290}, {14377, 288}, {14380, 290}, + {14382, 291}, {14384, 294}, {14389, 292}, {14400, 295}, {14408, 288}, {14418, 289}, {14425, 290}, {14431, 288}, + {14437, 291}, {14442, 289}, {14448, 289}, {14453, 290}, {14458, 290}, {14461, 293}, {14464, 294}, {14468, 290}, + {14470, 288}, {14473, 290}, {14475, 288}, {14478, 298}, {14480, 288}, {14482, 288}, {14486, 288}, {14488, 289}, + {14490, 289}, {14492, 291}, {14494, 288}, {14497, 290}, {14499, 293}, {14501, 293}, {14502, 294}, {14505, 303}, + {14507, 292}, {14509, 304}, {14512, 303}, {14514, 306}, {14517, 294}, {14519, 290}, {14522, 289}, {14525, 289}, + {14526, 301}, {14529, 292}, {14531, 291}, {14533, 288}, {14536, 291}, {14537, 290}, {14540, 293}, {14541, 290}, + {14544, 303}, {14546, 305}, {14549, 288}, {14550, 288}, {14553, 296}, {14555, 289}, {14558, 288}, {14560, 288}, + {14562, 310}, {14564, 294}, {14567, 294}, {14569, 314}, {14571, 293}, {14574, 288}, {14575, 288}, {14578, 297}, + {14580, 314}, {14583, 291}, {14585, 292}, {14586, 292}, {14589, 300}, {14592, 292}, {14597, 292}, {14600, 288}, + {14605, 289}, {14609, 290}, {14614, 291}, {14619, 289}, {14624, 288}, {14629, 290}, {14634, 289}, {14637, 290}, + {14640, 289}, {14644, 291}, {14647, 292}, {14650, 290}, {14653, 288}, {14656, 289}, {14660, 290}, {14663, 291}, + {14665, 291}, {14668, 290}, {14672, 289}, {14675, 293}, {14678, 295}, {14680, 294}, {14683, 291}, {14685, 289}, + {14688, 289}, {14691, 293}, {14694, 292}, {14696, 292}, {14699, 290}, {14702, 288}, {14705, 290}, {14709, 288}, + {14712, 296}, {14715, 289}, {14718, 289}, {14720, 293}, {14722, 292}, {14725, 293}, {14727, 291}, {14730, 289}, + {14733, 294}, {14735, 289}, {14737, 292}, {14739, 288}, {14742, 290}, {14744, 288}, {14746, 290}, {14748, 290}, + {14751, 292}, {14753, 288}, {14755, 289}, {14757, 290}, {14760, 297}, {14763, 288}, {14765, 289}, {14768, 294}, + {14771, 288}, {14774, 295}, {14777, 292}, {14780, 289}, {14783, 295}, {14785, 294}, {14788, 296}, {14790, 295}, + {14792, 293}, {14794, 295}, {14796, 289}, {14798, 293}, {14799, 288}, {14801, 293}, {14802, 291}, {14803, 288}, + {14804, 298}, {14805, 290}, {14807, 288}, {14811, 293}, {14815, 290}, {14820, 288}, {14824, 289}, {14828, 288}, + {14832, 288}, {14837, 292}, {14844, 289}, {14851, 289}, {14855, 290}, {14859, 288}, {14864, 292}, {14868, 290}, + {14871, 293}, {14874, 288}, {14877, 291}, {14879, 160}, {14882, 288}, {14885, 292}, {14887, 289}, {14890, 295}, + {14893, 304}, {14896, 292}, {14899, 288}, {14902, 292}, {14904, 290}, {14907, 292}, {14910, 291}, {14913, 289}, + {14915, 291}, {14918, 291}, {14921, 290}, {14923, 297}, {14925, 291}, {14930, 288}, {14932, 289}, {14934, 295}, + {14937, 288}, {14939, 315}, {14942, 309}, {14945, 289}, {14947, 290}, {14950, 291}, {14953, 288}, {14955, 289}, + {14958, 289}, {14961, 292}, {14962, 290}, {14966, 291}, {14967, 289}, {14970, 288}, {14972, 300}, {14974, 308}, + {14977, 294}, {14979, 304}, {14982, 316}, {14984, 289}, {14987, 302}, {14989, 296}, {14991, 306}, {14994, 288}, + {14997, 302}, {15000, 289}, {15004, 295}, {15008, 291}, {15013, 289}, {15017, 289}, {15020, 294}, {15024, 293}, + {15028, 289}, {15034, 291}, {15039, 295}, {15044, 291}, {15050, 288}, {15054, 290}, {15057, 292}, {15061, 293}, + {15064, 293}, {15066, 288}, {15069, 289}, {15073, 298}, {15076, 291}, {15079, 289}, {15082, 288}, {15084, 288}, + {15087, 293}, {15090, 290}, {15093, 289}, {15095, 290}, {15098, 288}, {15100, 291}, {15103, 288}, {15105, 289}, + {15108, 289}, {15110, 288}, {15117, 292}, {15120, 289}, {15122, 288}, {15125, 291}, {15127, 291}, {15130, 289}, + {15133, 294}, {15136, 290}, {15138, 288}, {15140, 292}, {15143, 296}, {15145, 288}, {15147, 291}, {15150, 294}, + {15152, 293}, {15154, 291}, {15156, 291}, {15159, 292}, {15161, 296}, {15163, 294}, {15165, 290}, {15167, 290}, + {15169, 289}, {15171, 292}, {15173, 291}, {15175, 295}, {15177, 290}, {15179, 292}, {15182, 291}, {15184, 289}, + {15187, 291}, {15189, 288}, {15191, 296}, {15194, 292}, {15196, 289}, {15199, 290}, {15202, 293}, {15204, 292}, + {15206, 289}, {15207, 290}, {15208, 290}, {15210, 292}, {15211, 295}, {15212, 290}, {15214, 293}, {15215, 290}, + {15217, 288}, {15218, 298}, {15220, 292}, {15221, 290}, {15223, 292}, {15224, 294}, {15225, 290}, {15228, 288}, + {15233, 294}, {15238, 289}, {15243, 289}, {15250, 289}, {15257, 288}, {15263, 289}, {15271, 288}, {15278, 289}, + {15282, 289}, {15288, 289}, {15293, 290}, {15297, 288}, {15301, 292}, {15305, 289}, {15308, 290}, {15310, 299}, + {15313, 308}, {15317, 291}, {15319, 304}, {15322, 288}, {15324, 300}, {15327, 289}, {15330, 289}, {15332, 291}, + {15335, 314}, {15339, 289}, {15342, 298}, {15345, 292}, {15347, 303}, {15349, 292}, {15352, 314}, {15355, 307}, + {15358, 300}, {15361, 292}, {15363, 303}, {15365, 295}, {15368, 291}, {15370, 295}, {15374, 305}, {15376, 306}, + {15379, 288}, {15381, 302}, {15384, 290}, {15386, 317}, {15389, 288}, {15391, 294}, {15393, 295}, {15395, 296}, + {15398, 317}, {15400, 291}, {15403, 293}, {15406, 291}, {15408, 293}, {15411, 292}, {15413, 297}, {15417, 288}, + {15419, 312}, {15423, 289}, {15425, 295}, {15428, 295}, {15431, 293}, {15435, 290}, {15437, 288}, {15442, 295}, + {15445, 291}, {15450, 292}, {15454, 296}, {15457, 290}, {15460, 292}, {15463, 288}, {15467, 291}, {15470, 296}, + {15473, 292}, {15476, 290}, {15479, 290}, {15482, 291}, {15485, 290}, {15489, 289}, {15492, 288}, {15495, 290}, + {15498, 292}, {15501, 289}, {15504, 291}, {15507, 291}, {15509, 293}, {15512, 292}, {15515, 291}, {15518, 291}, + {15520, 292}, {15523, 288}, {15526, 295}, {15528, 291}, {15532, 290}, {15535, 297}, {15538, 289}, {15542, 290}, + {15545, 290}, {15547, 294}, {15551, 290}, {15554, 289}, {15557, 288}, {15561, 290}, {15564, 291}, {15566, 295}, + {15568, 291}, {15571, 289}, {15573, 290}, {15576, 290}, {15578, 298}, {15580, 288}, {15583, 288}, {15585, 291}, + {15588, 289}, {15590, 288}, {15592, 291}, {15594, 288}, {15597, 291}, {15600, 292}, {15603, 289}, {15606, 289}, + {15610, 288}, {15612, 288}, {15615, 289}, {15618, 288}, {15621, 290}, {15624, 288}, {15627, 289}, {15630, 296}, + {15631, 294}, {15633, 292}, {15635, 289}, {15637, 290}, {15638, 292}, {15640, 288}, {15642, 288}, {15644, 290}, + {15645, 293}, {15647, 289}, {15649, 291}, {15650, 296}, {15652, 288}, {15657, 288}, {15662, 288}, {15671, 288}, + {15676, 289}, {15682, 289}, {15688, 289}, {15695, 289}, {15702, 293}, {15706, 293}, {15712, 290}, {15716, 288}, + {15721, 292}, {15724, 289}, {15728, 291}, {15730, 307}, {15733, 292}, {15735, 293}, {15738, 288}, {15740, 291}, + {15743, 288}, {15745, 290}, {15747, 309}, {15749, 288}, {15752, 288}, {15754, 298}, {15756, 290}, {15758, 295}, + {15761, 288}, {15763, 315}, {15766, 289}, {15768, 294}, {15770, 290}, {15773, 291}, {15775, 308}, {15777, 289}, + {15779, 292}, {15782, 310}, {15785, 289}, {15787, 318}, {15789, 288}, {15791, 299}, {15794, 290}, {15795, 288}, + {15797, 298}, {15800, 288}, {15801, 294}, {15803, 292}, {15805, 291}, {15806, 295}, {15808, 309}, {15810, 315}, + {15812, 293}, {15814, 289}, {15815, 289}, {15817, 291}, {15819, 290}, {15822, 291}, {15824, 304}, {15826, 305}, + {15828, 290}, {15830, 290}, {15832, 289}, {15835, 289}, {15837, 290}, {15840, 290}, {15841, 288}, {15844, 293}, + {15846, 288}, {15849, 302}, {15852, 310}, {15855, 288}, {15859, 291}, {15862, 291}, {15866, 290}, {15870, 289}, + {15874, 288}, {15877, 291}, {15880, 289}, {15883, 288}, {15887, 289}, {15892, 290}, {15896, 292}, {15899, 288}, + {15902, 290}, {15905, 288}, {15909, 288}, {15913, 289}, {15917, 293}, {15919, 293}, {15922, 291}, {15926, 290}, + {15928, 288}, {15932, 291}, {15935, 289}, {15939, 288}, {15942, 288}, {15945, 288}, {15948, 290}, {15952, 291}, + {15955, 291}, {15959, 291}, {15962, 288}, {15965, 289}, {15969, 289}, {15972, 291}, {15976, 291}, {15979, 293}, + {15982, 289}, {15985, 293}, {15989, 294}, {15991, 288}, {15995, 293}, {15997, 291}, {16002, 297}, {16005, 291}, + {16008, 294}, {16011, 290}, {16014, 289}, {16016, 292}, {16019, 289}, {16022, 288}, {16025, 289}, {16028, 290}, + {16031, 291}, {16033, 288}, {16037, 293}, {16039, 288}, {16043, 293}, {16047, 292}, {16050, 290}, {16054, 290}, + {16058, 293}, {16061, 291}, {16064, 294}, {16067, 293}, {16070, 288}, {16073, 291}, {16076, 290}, {16077, 288}, + {16079, 296}, {16081, 290}, {16082, 292}, {16084, 290}, {16086, 291}, {16087, 293}, {16089, 289}, {16090, 290}, + {16092, 291}, {16093, 288}, {16096, 291}, {16100, 288}, {16106, 288}, {16111, 289}, {16117, 293}, {16122, 289}, + {16127, 289}, {16133, 288}, {16139, 288}, {16144, 288}, {16148, 289}, {16154, 289}, {16158, 293}, {16162, 289}, + {16165, 290}, {16168, 290}, {16170, 308}, {16173, 291}, {16174, 297}, {16176, 311}, {16178, 292}, {16180, 289}, + {16181, 303}, {16183, 309}, {16185, 301}, {16188, 290}, {16189, 290}, {16191, 289}, {16193, 299}, {16195, 293}, + {16196, 292}, {16198, 297}, {16200, 291}, {16202, 314}, {16204, 313}, {16206, 290}, {16208, 296}, {16211, 288}, + {16212, 288}, {16214, 288}, {16216, 298}, {16218, 306}, {16220, 289}, {16223, 291}, {16225, 288}, {16228, 292}, + {16230, 289}, {16232, 288}, {16233, 290}, {16236, 290}, {16238, 289}, {16239, 292}, {16241, 297}, {16242, 290}, + {16245, 289}, {16247, 314}, {16249, 300}, {16250, 310}, {16252, 291}, {16254, 291}, {16257, 289}, {16259, 312}, + {16261, 289}, {16264, 311}, {16266, 294}, {16268, 290}, {16270, 302}, {16273, 290}, {16274, 299}, {16277, 289}, + {16279, 305}, {16282, 289}, {16284, 289}, {16287, 289}, {16291, 293}, {16294, 288}, {16296, 295}, {16300, 293}, + {16304, 288}, {16307, 291}, {16311, 291}, {16315, 290}, {16318, 290}, {16323, 292}, {16326, 291}, {16330, 288}, + {16336, 289}, {16341, 291}, {16346, 291}, {16351, 289}, {16356, 291}, {16360, 290}, {16364, 291}, {16368, 291}, + {16373, 290}, {16377, 289}, {16382, 289}, {16386, 289}, {16390, 290}, {16395, 291}, {16399, 289}, {16402, 289}, + {16405, 288}, {16408, 291}, {16411, 291}, {16414, 292}, {16416, 293}, {16419, 296}, {16422, 290}, {16424, 289}, + {16427, 292}, {16430, 291}, {16433, 291}, {16435, 288}, {16438, 292}, {16440, 290}, {16442, 291}, {16446, 288}, + {16449, 291}, {16452, 288}, {16454, 290}, {16456, 289}, {16459, 292}, {16461, 289}, {16464, 291}, {16466, 292}, + {16469, 288}, {16471, 290}, {16473, 289}, {16476, 288}, {16478, 288}, {16481, 290}, {16484, 293}, {16487, 288}, + {16489, 288}, {16492, 288}, {16495, 293}, {16499, 293}, {16501, 288}, {16503, 291}, {16506, 291}, {16508, 291}, + {16510, 289}, {16513, 296}, {16515, 290}, {16517, 292}, {16518, 293}, {16520, 296}, {16521, 290}, {16523, 291}, + {16524, 288}, {16526, 289}, {16527, 293}, {16529, 295}, {16530, 289}, {16532, 291}, {16533, 288}, {16535, 293}, + {16539, 290}, {16544, 289}, {16549, 289}, {16553, 288}, {16561, 288}, {16566, 288}, {16571, 289}, {16577, 288}, + {16584, 288}, {16592, 291}, {16594, 150}, {16598, 289}, {16606, 288}, {16613, 288}, {16619, 291}, {16624, 290}, + {16628, 289}, {16630, 292}, {16633, 298}, {16636, 295}, {16639, 288}, {16641, 291}, {16644, 300}, {16647, 292}, + {16650, 298}, {16653, 291}, {16656, 289}, {16658, 291}, {16661, 305}, {16663, 291}, {16667, 288}, {16669, 313}, + {16673, 289}, {16675, 313}, {16677, 288}, {16680, 314}, {16683, 290}, {16685, 305}, {16687, 291}, {16690, 313}, + {16693, 290}, {16696, 289}, {16698, 307}, {16700, 293}, {16702, 288}, {16705, 289}, {16707, 293}, {16709, 310}, + {16711, 290}, {16714, 288}, {16716, 304}, {16719, 296}, {16721, 295}, {16723, 290}, {16726, 302}, {16728, 296}, + {16731, 289}, {16734, 301}, {16736, 289}, {16738, 301}, {16740, 294}, {16743, 295}, {16746, 317}, {16748, 303}, + {16751, 305}, {16754, 300}, {16757, 303}, {16759, 288}, {16762, 291}, {16765, 306}, {16768, 292}, {16771, 288}, + {16776, 290}, {16779, 291}, {16782, 288}, {16786, 292}, {16788, 311}, {16793, 291}, {16797, 290}, {16801, 288}, + {16804, 290}, {16806, 290}, {16808, 308}, {16810, 288}, {16813, 288}, {16815, 288}, {16818, 288}, {16820, 289}, + {16823, 290}, {16826, 292}, {16828, 289}, {16831, 288}, {16833, 291}, {16836, 294}, {16839, 288}, {16842, 289}, + {16845, 288}, {16848, 290}, {16850, 292}, {16853, 288}, {16856, 291}, {16858, 291}, {16861, 293}, {16863, 288}, + {16866, 293}, {16869, 288}, {16871, 289}, {16874, 288}, {16876, 290}, {16879, 288}, {16881, 288}, {16884, 288}, + {16888, 289}, {16890, 290}, {16893, 292}, {16895, 290}, {16897, 290}, {16899, 288}, {16903, 291}, {16906, 291}, + {16909, 289}, {16912, 289}, {16915, 293}, {16919, 288}, {16923, 291}, {16927, 289}, {16931, 296}, {16935, 289}, + {16940, 289}, {16944, 290}, {16948, 289}, {16952, 289}, {16956, 288}, {16959, 295}, {16963, 288}, {16965, 292}, + {16967, 289}, {16970, 294}, {16972, 289}, {16974, 289}, {16977, 292}, {16979, 292}, {16981, 290}, {16983, 292}, + {16985, 289}, {16987, 288}, {16992, 288}, {17001, 288}, {17009, 288}, {17017, 289}, {17026, 292}, {17035, 288}, + {17046, 290}, {17057, 294}, {17067, 290}, {17073, 290}, {17081, 292}, {17087, 293}, {17093, 288}, {17098, 289}, + {17102, 294}, {17106, 288}, {17110, 308}, {17112, 290}, {17115, 289}, {17117, 319}, {17119, 296}, {17122, 319}, + {17125, 290}, {17127, 289}, {17130, 290}, {17132, 295}, {17134, 289}, {17137, 288}, {17139, 305}, {17141, 309}, + {17144, 289}, {17147, 290}, {17149, 293}, {17151, 316}, {17153, 288}, {17155, 289}, {17156, 288}, {17157, 299}, + {17159, 305}, {17160, 291}, {17162, 289}, {17163, 300}, {17164, 316}, {17165, 297}, {17166, 288}, {17168, 288}, + {17169, 312}, {17170, 308}, {17172, 299}, {17173, 317}, {17174, 293}, {17176, 291}, {17177, 288}, {17178, 290}, + {17179, 291}, {17180, 302}, {17181, 309}, {17183, 291}, {17184, 309}, {17185, 289}, {17186, 299}, {17187, 293}, + {17188, 300}, {17194, 288}, {17195, 288}, {17196, 288}, {17197, 292}, {17198, 290}, {17199, 318}, {17201, 290}, + {17202, 292}, {17204, 289}, {17206, 292}, {17208, 308}, {17209, 292}, {17212, 289}, {17213, 293}, {17215, 301}, + {17217, 288}, {17219, 291}, {17221, 292}, {17223, 290}, {17225, 288}, {17227, 288}, {17229, 291}, {17231, 304}, + {17233, 291}, {17235, 288}, {17237, 312}, {17239, 290}, {17241, 290}, {17243, 315}, {17245, 288}, {17247, 299}, + {17250, 288}, {17252, 289}, {17254, 288}, {17256, 295}, {17259, 295}, {17261, 290}, {17262, 316}, {17265, 290}, + {17268, 289}, {17270, 290}, {17273, 291}, {17275, 299}, {17277, 288}, {17279, 292}, {17283, 290}, {17286, 288}, + {17289, 289}, {17292, 289}, {17295, 289}, {17299, 292}, {17302, 289}, {17306, 294}, {17309, 288}, {17313, 291}, + {17318, 288}, {17323, 293}, {17327, 288}, {17332, 292}, {17337, 290}, {17341, 288}, {17345, 292}, {17350, 289}, + {17354, 290}, {17359, 296}, {17363, 291}, {17367, 288}, {17370, 291}, {17375, 289}, {17378, 292}, {17383, 288}, + {17388, 291}, {17393, 288}, {17398, 289}, {17401, 291}, {17405, 291}, {17408, 288}, {17411, 291}, {17416, 290}, + {17419, 290}, {17422, 288}, {17425, 297}, {17428, 288}, {17429, 291}, {17432, 289}, {17434, 292}, {17436, 290}, + {17438, 291}, {17440, 288}, {17442, 291}, {17447, 288}, {17453, 288}, {17460, 295}, {17466, 291}, {17473, 290}, + {17478, 288}, {17485, 289}, {17493, 288}, {17500, 293}, {17506, 289}, {17512, 289}, {17517, 290}, {17521, 292}, + {17527, 296}, {17530, 296}, {17531, 290}, {17534, 302}, {17535, 300}, {17538, 299}, {17540, 299}, {17542, 289}, + {17544, 312}, {17545, 288}, {17548, 308}, {17549, 290}, {17552, 302}, {17553, 300}, {17556, 295}, {17556, 129}, + {17558, 319}, {17560, 291}, {17562, 293}, {17564, 300}, {17566, 289}, {17568, 306}, {17570, 289}, {17571, 291}, + {17574, 289}, {17575, 290}, {17577, 296}, {17578, 289}, {17580, 289}, {17583, 288}, {17584, 299}, {17586, 315}, + {17587, 294}, {17589, 295}, {17591, 289}, {17592, 291}, {17595, 291}, {17596, 290}, {17598, 312}, {17600, 290}, + {17602, 289}, {17604, 298}, {17607, 307}, {17609, 313}, {17612, 290}, {17614, 290}, {17616, 306}, {17618, 308}, + {17620, 299}, {17623, 304}, {17625, 291}, {17628, 288}, {17629, 293}, {17632, 294}, {17636, 295}, {17638, 288}, + {17641, 288}, {17644, 310}, {17647, 290}, {17650, 315}, {17652, 291}, {17654, 293}, {17657, 290}, {17660, 290}, + {17662, 311}, {17664, 295}, {17668, 289}, {17670, 295}, {17672, 291}, {17675, 289}, {17678, 288}, {17680, 300}, + {17683, 299}, {17686, 289}, {17689, 310}, {17692, 299}, {17694, 299}, {17696, 296}, {17698, 294}, {17701, 292}, + {17702, 288}, {17704, 290}, {17707, 289}, {17710, 315}, {17713, 290}, {17715, 288}, {17718, 289}, {17720, 295}, + {17722, 289}, {17725, 293}, {17729, 288}, {17734, 290}, {17738, 291}, {17742, 290}, {17747, 288}, {17750, 289}, + {17752, 294}, {17757, 291}, {17761, 289}, {17765, 292}, {17769, 291}, {17774, 289}, {17777, 289}, {17781, 293}, + {17785, 292}, {17789, 291}, {17793, 289}, {17797, 291}, {17800, 289}, {17804, 290}, {17807, 288}, {17811, 288}, + {17815, 288}, {17820, 291}, {17824, 291}, {17829, 289}, {17832, 288}, {17836, 289}, {17840, 293}, {17844, 295}, + {17852, 296}, {17862, 289}, {17870, 293}, {17879, 291}, {17884, 291}, {17889, 292}, {17893, 303}, {17894, 290}, + {17896, 309}, {17898, 295}, {17899, 297}, {17901, 292}, {17902, 289}, {17904, 300}, {17906, 288}, {17908, 309}, + {17910, 306}, {17911, 315}, {17914, 291}, {17915, 289}, {17917, 306}, {17919, 305}, {17922, 288}, {17924, 289}, + {17925, 318}, {17927, 289}, {17930, 298}, {17932, 289}, {17934, 289}, {17936, 304}, {17938, 302}, {17940, 307}, + {17942, 289}, {17945, 290}, {17947, 289}, {17950, 305}, {17951, 296}, {17953, 297}, {17955, 313}, {17957, 312}, + {17960, 288}, {17961, 290}, {17963, 291}, {17966, 292}, {17969, 301}, {17971, 306}, {17974, 288}, {17976, 291}, + {17979, 298}, {17982, 301}, {17985, 303}, {17988, 306}, {17991, 312}, {17994, 302}, {17997, 292}, {18000, 290}, + {18002, 308}, {18004, 311}, {18006, 289}, {18007, 289}, {18009, 299}, {18012, 302}, {18014, 301}, {18016, 291}, + {18018, 290}, {18021, 291}, {18023, 296}, {18025, 298}, {18028, 290}, {18030, 300}, {18032, 293}, {18035, 309}, + {18037, 306}, {18039, 307}, {18042, 288}, {18045, 288}, {18048, 288}, {18050, 292}, {18053, 288}, {18057, 290}, + {18059, 306}, {18062, 289}, {18063, 290}, {18065, 293}, {18069, 288}, {18074, 288}, {18079, 289}, {18082, 289}, + {18086, 289}, {18088, 302}, {18091, 290}, {18093, 305}, {18096, 302}, {18099, 290}, {18102, 288}, {18105, 290}, + {18107, 288}, {18111, 289}, {18114, 290}, {18118, 293}, {18122, 293}, {18125, 288}, {18128, 295}, {18132, 290}, + {18136, 291}, {18139, 289}, {18143, 288}, {18146, 291}, {18149, 288}, {18153, 289}, {18156, 289}, {18159, 288}, + {18163, 289}, {18166, 289}, {18170, 291}, {18172, 292}, {18176, 290}, {18179, 288}, {18183, 289}, {18186, 288}, + {18191, 289}, {18194, 288}, {18198, 290}, {18202, 289}, {18217, 291}, {18230, 289}, {18241, 297}, {18250, 295}, + {18253, 292}, {18255, 309}, {18257, 291}, {18260, 288}, {18262, 292}, {18264, 313}, {18266, 296}, {18268, 293}, + {18270, 300}, {18272, 296}, {18273, 293}, {18274, 312}, {18276, 289}, {18277, 295}, {18279, 295}, {18280, 288}, + {18281, 312}, {18282, 312}, {18284, 295}, {18285, 313}, {18286, 293}, {18287, 288}, {18288, 318}, {18290, 314}, + {18291, 304}, {18292, 315}, {18293, 290}, {18294, 293}, {18295, 288}, {18297, 292}, {18298, 289}, {18299, 308}, + {18300, 316}, {18302, 301}, {18304, 299}, {18305, 290}, {18307, 290}, {18308, 293}, {18310, 290}, {18311, 292}, + {18313, 298}, {18314, 300}, {18316, 288}, {18318, 307}, {18319, 294}, {18321, 298}, {18323, 291}, {18325, 312}, + {18327, 308}, {18329, 289}, {18331, 291}, {18334, 288}, {18337, 294}, {18340, 303}, {18343, 304}, {18347, 289}, + {18355, 301}, {18361, 289}, {18366, 289}, {18371, 288}, {18377, 289}, {18387, 288}, {18396, 288}, {18401, 289}, + {18405, 288}, {18412, 288}, {18417, 288}, {18421, 291}, {18425, 289}, {18430, 290}, {18435, 290}, {18440, 294}, + {18444, 294}, {18449, 290}, {18454, 288}, {18459, 294}, {18463, 288}, {18467, 291}, {18471, 288}, {18475, 288}, + {18481, 309}, {18490, 305}, {18498, 288}, {18506, 288}, {18513, 230}, {18522, 289}, {18528, 288}, {18534, 292}, + {18540, 288}, {18544, 289}, {18549, 289}, {18550, 318}, {18552, 295}, {18553, 291}, {18554, 315}, {18556, 295}, + {18558, 297}, {18559, 288}, {18560, 301}, {18562, 289}, {18563, 306}, {18564, 295}, {18565, 295}, {18567, 300}, + {18568, 299}, {18569, 299}, {18571, 293}, {18572, 290}, {18573, 314}, {18575, 292}, {18576, 289}, {18577, 292}, + {18578, 291}, {18580, 291}, {18581, 302}, {18582, 317}, {18583, 295}, {18585, 307}, {18585, 307}, {18587, 291}, + {18588, 302}, {18589, 288}, {18590, 315}, {18591, 290}, {18593, 296}, {18593, 291}, {18595, 298}, {18596, 300}, + {18598, 292}, {18598, 317}, {18600, 294}, {18603, 307}, {18605, 299}, {18608, 302}, {18611, 289}, {18613, 288}, + {18616, 301}, {18619, 312}, {18622, 309}, {18625, 294}, {18628, 307}, {18632, 307}, {18635, 303}, {18637, 299}, + {18639, 294}, {18642, 292}, {18643, 307}, {18645, 305}, {18646, 311}, {18648, 302}, {18649, 296}, {18651, 305}, + {18653, 298}, {18655, 298}, {18657, 290}, {18658, 292}, {18660, 290}, {18661, 288}, {18662, 288}, {18664, 315}, + {18665, 302}, {18667, 317}, {18669, 299}, {18670, 291}, {18672, 288}, {18673, 301}, {18675, 316}, {18677, 315}, + {18678, 290}, {18680, 296}, {18681, 318}, {18683, 309}, {18685, 308}, {18687, 303}, {18689, 288}, {18691, 291}, + {18692, 295}, {18696, 289}, {18700, 288}, {18703, 289}, {18705, 289}, {18708, 294}, {18710, 299}, {18713, 289}, + {18715, 294}, {18719, 290}, {18724, 288}, {18730, 288}, {18736, 288}, {18743, 289}, {18748, 289}, {18753, 292}, + {18759, 290}, {18764, 288}, {18769, 289}, {18775, 289}, {18786, 306}, {18799, 288}, {18805, 288}, {18809, 293}, + {18810, 297}, {18811, 288}, {18812, 307}, {18813, 306}, {18814, 313}, {18815, 289}, {18816, 305}, {18817, 299}, + {18818, 304}, {18819, 310}, {18820, 312}, {18821, 290}, {18822, 299}, {18823, 290}, {18824, 290}, {18825, 314}, + {18826, 301}, {18827, 293}, {18828, 299}, {18829, 288}, {18830, 291}, {18831, 305}, {18834, 297}, {18837, 304}, + {18841, 290}, {18843, 302}, {18847, 301}, {18850, 296}, {18854, 304}, {18857, 288}, {18860, 296}, {18862, 298}, + {18865, 292}, {18869, 294}, {18871, 290}, {18875, 290}, {18879, 295}, {18883, 300}, {18887, 311}, {18890, 292}, + {18895, 292}, {18898, 306}, {18902, 288}, {18906, 295}, {18911, 289}, {18914, 300}, {18918, 295}, {18923, 302}, + {18927, 290}, {18930, 300}, {18934, 290}, {18939, 291}, {18942, 300}, {18946, 293}, {18951, 298}, {18954, 308}, + {18958, 296}, {18965, 293}, {18970, 293}, {18973, 290}, {18978, 305}, {18982, 288}, {18987, 290}, {18991, 288}, + {18998, 290}, {19003, 306}, {19008, 288}, {19013, 291}, {19020, 290}, {19026, 309}, {19032, 292}, {19040, 291}, + {19053, 291}, {19060, 289}, {19065, 289}, {19071, 289}, {19078, 288}, {19083, 290}, {19088, 290}, {19093, 290}, + {19103, 290}, {19109, 293}, {19114, 290}, {19121, 293}, {19132, 298}, {19144, 292}, {19151, 292}, {19154, 314}, + {19155, 290}, {19156, 295}, {19157, 304}, {19159, 293}, {19160, 316}, {19161, 310}, {19162, 299}, {19163, 291}, + {19164, 295}, {19165, 314}, {19166, 288}, {19167, 290}, {19168, 294}, {19169, 299}, {19170, 302}, {19172, 290}, + {19172, 289}, {19173, 294}, {19174, 305}, {19175, 311}, {19176, 298}, {19177, 295}, {19178, 290}, {19179, 289}, + {19180, 292}, {19181, 304}, {19182, 318}, {19183, 297}, {19184, 291}, {19185, 310}, {19186, 302}, {19187, 301}, + {19188, 293}, {19188, 300}, {19189, 295}, {19190, 299}, {19191, 309}, {19192, 289}, {19193, 298}, {19194, 306}, + {19195, 296}, {19197, 300}, {19198, 317}, {19199, 291}, {19200, 303}, {19201, 288}, {19202, 303}, {19203, 311}, + {19205, 295}, {19205, 295}, {19207, 289}, {19208, 297}, {19209, 292}, {19210, 296}, {19211, 310}, {19213, 293}, + {19214, 293}, {19215, 295}, {19217, 299}, {19218, 291}, {19219, 299}, {19221, 306}, {19222, 305}, {19223, 298}, + {19225, 298}, {19227, 292}, {19229, 306}, {19230, 291}, {19232, 288}, {19234, 303}, {19237, 292}, {19240, 294}, + {19243, 292}, {19245, 290}, {19247, 296}, {19250, 289}, {19253, 289}, {19257, 289}, {19265, 289}, {19272, 291}, + {19280, 291}, {19287, 288}, {19297, 303}, {19312, 289}, {19319, 288}, {19322, 289}, {19325, 295}, {19328, 290}, + {19331, 295}, {19333, 288}, {19336, 296}, {19338, 288}, {19341, 292}, {19344, 293}, {19346, 289}, {19348, 293}, + {19351, 295}, {19354, 294}, {19358, 290}, {19361, 291}, {19364, 288}, {19368, 293}, {19371, 292}, {19374, 291}, + {19377, 289}, {19380, 293}, {19383, 290}, {19386, 288}, {19389, 303}, {19392, 306}, {19395, 294}, {19397, 299}, + {19399, 292}, {19402, 291}, {19405, 289}, {19410, 288}, {19417, 289}, {19425, 291}, {19434, 290}, {19441, 290}, + {19454, 290}, {19467, 291}, {19470, 293}, {19471, 318}, {19472, 292}, {19474, 304}, {19475, 288}, {19476, 300}, + {19478, 288}, {19479, 289}, {19480, 311}, {19482, 315}, {19483, 289}, {19484, 296}, {19486, 304}, {19487, 309}, + {19488, 291}, {19490, 295}, {19491, 295}, {19492, 309}, {19494, 304}, {19495, 292}, {19496, 292}, {19497, 299}, + {19498, 300}, {19500, 315}, {19501, 290}, {19502, 298}, {19503, 289}, {19505, 318}, {19506, 301}, {19507, 311}, + {19509, 307}, {19510, 291}, {19511, 308}, {19513, 316}, {19514, 294}, {19516, 306}, {19518, 289}, {19519, 301}, + {19520, 295}, {19522, 298}, {19524, 303}, {19525, 303}, {19527, 317}, {19529, 294}, {19531, 307}, {19533, 295}, + {19535, 298}, {19538, 290}, {19541, 290}, {19544, 293}, {19546, 293}, {19549, 291}, {19552, 292}, {19555, 196}, + {19561, 289}, {19571, 301}, {19580, 290}, {19595, 318}, {19609, 293}, {19612, 296}, {19615, 289}, {19617, 293}, + {19620, 289}, {19622, 295}, {19624, 291}, {19626, 293}, {19629, 296}, {19631, 294}, {19634, 303}, {19636, 294}, + {19638, 289}, {19641, 293}, {19643, 288}, {19646, 298}, {19649, 296}, {19652, 288}, {19654, 299}, {19657, 291}, + {19660, 296}, {19663, 295}, {19666, 290}, {19669, 300}, {19671, 294}, {19674, 292}, {19677, 300}, {19680, 288}, + {19684, 301}, {19686, 296}, {19689, 288}, {19693, 288}, {19697, 289}, {19704, 297}, {19713, 290}, {19722, 294}, + {19734, 292}, {19752, 295}, {19757, 294}, {19758, 314}, {19760, 300}, {19761, 295}, {19763, 302}, {19765, 307}, + {19766, 291}, {19768, 294}, {19769, 305}, {19770, 290}, {19772, 297}, {19774, 291}, {19775, 296}, {19776, 305}, + {19778, 292}, {19779, 290}, {19780, 288}, {19782, 293}, {19783, 290}, {19785, 296}, {19786, 300}, {19787, 294}, + {19789, 301}, {19790, 297}, {19791, 292}, {19793, 310}, {19794, 301}, {19796, 290}, {19798, 290}, {19799, 294}, + {19801, 294}, {19802, 290}, {19804, 295}, {19806, 291}, {19808, 290}, {19809, 300}, {19811, 297}, {19813, 291}, + {19814, 292}, {19816, 291}, {19818, 298}, {19820, 293}, {19822, 291}, {19824, 298}, {19827, 294}, {19830, 297}, + {19832, 288}, {19834, 294}, {19836, 302}, {19839, 304}, {19843, 291}, {19847, 291}, {19856, 290}, {19867, 292}, + {19887, 289}, {19894, 296}, {19896, 288}, {19898, 289}, {19900, 288}, {19902, 291}, {19903, 297}, {19906, 289}, + {19908, 291}, {19909, 289}, {19911, 299}, {19913, 294}, {19915, 293}, {19917, 289}, {19919, 295}, {19921, 291}, + {19923, 292}, {19925, 299}, {19926, 291}, {19928, 304}, {19931, 291}, {19933, 293}, {19935, 288}, {19937, 300}, + {19939, 292}, {19942, 291}, {19944, 288}, {19946, 288}, {19948, 289}, {19950, 293}, {19952, 291}, {19954, 288}, + {19956, 294}, {19959, 291}, {19962, 291}, {19964, 293}, {19967, 298}, {19969, 293}, {19971, 298}, {19974, 291}, + {19977, 301}, {19982, 289}, {19990, 292}, {20001, 290}, {20022, 288}, {20029, 291}, {20031, 290}, {20032, 300}, + {20034, 306}, {20036, 291}, {20038, 294}, {20039, 303}, {20041, 308}, {20043, 288}, {20045, 304}, {20047, 295}, + {20048, 303}, {20050, 292}, {20052, 290}, {20054, 293}, {20055, 290}, {20057, 288}, {20058, 302}, {20060, 297}, + {20062, 292}, {20064, 290}, {20065, 298}, {20067, 308}, {20069, 288}, {20071, 291}, {20073, 295}, {20075, 294}, + {20076, 302}, {20078, 290}, {20080, 299}, {20083, 307}, {20085, 304}, {20087, 299}, {20089, 289}, {20091, 298}, + {20094, 294}, {20097, 292}, {20100, 307}, {20102, 288}, {20105, 302}, {20107, 296}, {20110, 289}, {20114, 290}, + {20118, 294}, {20129, 296}, {20145, 320}, {20162, 293}, {20164, 292}, {20166, 292}, {20168, 290}, {20170, 294}, + {20172, 289}, {20174, 301}, {20176, 293}, {20178, 291}, {20180, 291}, {20182, 294}, {20184, 296}, {20186, 297}, + {20188, 293}, {20190, 297}, {20191, 292}, {20193, 288}, {20195, 299}, {20197, 290}, {20199, 289}, {20201, 289}, + {20204, 303}, {20206, 290}, {20208, 289}, {20210, 298}, {20212, 292}, {20215, 292}, {20217, 288}, {20219, 289}, + {20221, 289}, {20224, 296}, {20226, 290}, {20228, 295}, {20231, 297}, {20234, 288}, {20236, 293}, {20239, 291}, + {20242, 294}, {20244, 288}, {20248, 294}, {20252, 291}, {20257, 293}, {20269, 288}, {20290, 320}, {20299, 296}, + {20301, 289}, {20303, 292}, {20305, 302}, {20307, 300}, {20309, 292}, {20311, 292}, {20313, 289}, {20315, 290}, + {20317, 294}, {20318, 291}, {20320, 288}, {20322, 289}, {20324, 294}, {20325, 290}, {20327, 295}, {20329, 301}, + {20331, 297}, {20333, 292}, {20335, 293}, {20337, 298}, {20339, 290}, {20341, 295}, {20343, 298}, {20345, 298}, + {20347, 293}, {20349, 290}, {20351, 299}, {20353, 291}, {20356, 291}, {20358, 288}, {20360, 291}, {20362, 291}, + {20364, 294}, {20367, 292}, {20370, 291}, {20373, 291}, {20375, 306}, {20377, 289}, {20380, 290}, {20382, 299}, + {20386, 301}, {20389, 298}, {20394, 292}, {20405, 288}, {20415, 288}, {20437, 288}, {20439, 291}, {20441, 298}, + {20443, 299}, {20445, 289}, {20446, 293}, {20448, 304}, {20450, 290}, {20451, 300}, {20453, 292}, {20455, 304}, + {20457, 289}, {20458, 291}, {20460, 291}, {20461, 290}, {20463, 299}, {20465, 289}, {20466, 291}, {20468, 291}, + {20470, 296}, {20472, 307}, {20473, 296}, {20475, 293}, {20477, 288}, {20479, 290}, {20480, 302}, {20482, 292}, + {20484, 289}, {20486, 297}, {20487, 293}, {20489, 288}, {20492, 289}, {20493, 297}, {20495, 290}, {20497, 288}, + {20499, 291}, {20501, 295}, {20503, 294}, {20505, 291}, {20507, 289}, {20509, 292}, {20512, 289}, {20514, 288}, + {20516, 293}, {20519, 297}, {20521, 298}, {20523, 294}, {20526, 298}, {20529, 302}, {20533, 289}, {20542, 290}, + {20552, 290}, {20574, 288}, {20577, 292}, {20579, 296}, {20581, 290}, {20583, 295}, {20585, 305}, {20586, 290}, + {20588, 297}, {20590, 297}, {20591, 288}, {20593, 290}, {20595, 288}, {20597, 288}, {20598, 308}, {20600, 292}, + {20602, 289}, {20604, 305}, {20606, 294}, {20608, 298}, {20611, 296}, {20613, 295}, {20615, 296}, {20618, 299}, + {20620, 300}, {20622, 289}, {20625, 301}, {20627, 298}, {20630, 291}, {20632, 289}, {20635, 289}, {20637, 293}, + {20640, 288}, {20642, 294}, {20645, 296}, {20646, 177}, {20649, 294}, {20652, 294}, {20655, 294}, {20658, 289}, + {20660, 291}, {20663, 288}, {20667, 288}, {20672, 294}, {20681, 290}, {20694, 299}, {20718, 288}, {20720, 297}, + {20722, 298}, {20724, 298}, {20726, 288}, {20728, 290}, {20730, 288}, {20732, 288}, {20734, 293}, {20736, 289}, + {20738, 288}, {20740, 289}, {20742, 290}, {20744, 288}, {20746, 298}, {20748, 294}, {20750, 291}, {20752, 298}, + {20754, 294}, {20756, 288}, {20759, 292}, {20761, 293}, {20763, 292}, {20765, 288}, {20767, 289}, {20770, 304}, + {20772, 290}, {20774, 288}, {20776, 288}, {20779, 302}, {20781, 293}, {20784, 302}, {20786, 291}, {20789, 288}, + {20792, 293}, {20794, 288}, {20797, 299}, {20799, 292}, {20801, 292}, {20803, 296}, {20806, 295}, {20808, 296}, + {20810, 295}, {20813, 288}, {20815, 296}, {20821, 292}, {20830, 298}, {20845, 314}, {20860, 289}, {20862, 293}, + {20863, 294}, {20865, 292}, {20867, 293}, {20869, 302}, {20870, 289}, {20872, 299}, {20873, 288}, {20875, 293}, + {20877, 305}, {20878, 297}, {20880, 291}, {20882, 291}, {20883, 299}, {20885, 288}, {20886, 293}, {20888, 292}, + {20890, 297}, {20891, 289}, {20893, 299}, {20895, 295}, {20896, 294}, {20898, 299}, {20900, 298}, {20901, 307}, + {20903, 299}, {20905, 301}, {20907, 293}, {20908, 301}, {20910, 289}, {20912, 289}, {20914, 288}, {20915, 302}, + {20917, 289}, {20919, 289}, {20921, 289}, {20923, 289}, {20925, 290}, {20927, 297}, {20929, 298}, {20930, 289}, + {20933, 292}, {20935, 295}, {20937, 297}, {20939, 302}, {20941, 293}, {20943, 290}, {20945, 295}, {20947, 294}, + {20950, 289}, {20952, 289}, {20955, 290}, {20958, 299}, {20966, 291}, {20971, 288}, {20987, 320}, {21001, 291}, + {21004, 293}, {21006, 293}, {21008, 300}, {21011, 300}, {21013, 291}, {21016, 297}, {21018, 292}, {21021, 296}, + {21023, 293}, {21025, 299}, {21028, 294}, {21030, 301}, {21032, 288}, {21034, 292}, {21036, 298}, {21039, 298}, + {21041, 290}, {21043, 292}, {21046, 295}, {21048, 299}, {21050, 288}, {21053, 298}, {21056, 296}, {21058, 289}, + {21060, 291}, {21063, 290}, {21065, 288}, {21068, 288}, {21070, 310}, {21073, 295}, {21076, 299}, {21079, 291}, + {21082, 292}, {21085, 291}, {21087, 297}, {21090, 289}, {21093, 292}, {21097, 294}, {21100, 289}, {21111, 290}, + {21132, 320}, {21142, 290}, {21144, 292}, {21146, 297}, {21149, 289}, {21151, 297}, {21153, 291}, {21155, 308}, + {21158, 297}, {21161, 296}, {21163, 292}, {21165, 294}, {21167, 288}, {21170, 290}, {21172, 290}, {21175, 292}, + {21177, 288}, {21180, 289}, {21182, 311}, {21184, 293}, {21186, 288}, {21189, 297}, {21191, 288}, {21194, 288}, + {21196, 295}, {21198, 299}, {21201, 303}, {21203, 289}, {21205, 291}, {21207, 290}, {21209, 297}, {21211, 292}, + {21213, 288}, {21216, 292}, {21218, 294}, {21220, 292}, {21222, 289}, {21225, 292}, {21227, 299}, {21229, 288}, + {21231, 290}, {21234, 290}, {21237, 296}, {21239, 301}, {21243, 290}, {21252, 289}, {21259, 289}, {21281, 288}, + {21283, 298}, {21285, 292}, {21288, 303}, {21290, 290}, {21292, 292}, {21294, 289}, {21295, 293}, {21298, 295}, + {21300, 297}, {21301, 292}, {21303, 301}, {21306, 292}, {21308, 303}, {21310, 304}, {21312, 304}, {21315, 297}, + {21317, 289}, {21319, 295}, {21321, 299}, {21323, 294}, {21325, 290}, {21327, 288}, {21329, 301}, {21331, 289}, + {21334, 296}, {21336, 291}, {21338, 295}, {21341, 299}, {21343, 297}, {21345, 288}, {21347, 290}, {21349, 288}, + {21351, 299}, {21354, 299}, {21356, 301}, {21359, 291}, {21361, 289}, {21363, 303}, {21366, 288}, {21368, 288}, + {21370, 289}, {21373, 290}, {21376, 288}, {21379, 290}, {21382, 289}, {21393, 297}, {21397, 295}, {21415, 296}, + {21426, 289}, {21428, 288}, {21430, 297}, {21432, 294}, {21434, 293}, {21436, 289}, {21438, 292}, {21439, 290}, + {21442, 288}, {21443, 294}, {21445, 289}, {21447, 290}, {21449, 297}, {21451, 299}, {21453, 292}, {21456, 288}, + {21458, 295}, {21461, 294}, {21463, 294}, {21464, 296}, {21467, 303}, {21469, 291}, {21471, 288}, {21473, 291}, + {21475, 290}, {21477, 305}, {21479, 301}, {21482, 305}, {21484, 300}, {21486, 290}, {21488, 290}, {21491, 289}, + {21493, 288}, {21495, 304}, {21497, 304}, {21499, 294}, {21502, 293}, {21504, 306}, {21506, 288}, {21508, 292}, + {21511, 301}, {21513, 289}, {21515, 288}, {21517, 296}, {21520, 299}, {21523, 290}, {21525, 294}, {21530, 301}, + {21538, 290}, {21541, 298}, {21550, 320}, {21570, 294}, {21572, 290}, {21573, 292}, {21575, 288}, {21577, 296}, + {21579, 289}, {21581, 301}, {21583, 298}, {21585, 291}, {21587, 299}, {21589, 293}, {21591, 290}, {21593, 290}, + {21594, 288}, {21597, 292}, {21598, 297}, {21601, 291}, {21604, 295}, {21607, 297}, {21609, 289}, {21612, 290}, + {21614, 303}, {21616, 291}, {21619, 290}, {21621, 297}, {21623, 294}, {21626, 292}, {21628, 301}, {21631, 303}, + {21633, 290}, {21636, 296}, {21638, 293}, {21640, 300}, {21643, 289}, {21645, 290}, {21648, 309}, {21650, 302}, + {21653, 294}, {21655, 303}, {21658, 290}, {21660, 290}, {21663, 293}, {21666, 289}, {21669, 291}, {21671, 300}, + {21677, 294}, {21684, 292}, {21690, 291}, {21712, 294}, {21715, 292}, {21717, 292}, {21720, 295}, {21722, 306}, + {21724, 288}, {21727, 289}, {21729, 310}, {21731, 290}, {21734, 297}, {21737, 300}, {21740, 288}, {21743, 288}, + {21747, 290}, {21749, 288}, {21752, 293}, {21754, 299}, {21757, 309}, {21759, 288}, {21761, 292}, {21764, 293}, + {21766, 300}, {21769, 288}, {21772, 301}, {21774, 296}, {21777, 296}, {21780, 291}, {21782, 295}, {21784, 294}, + {21787, 294}, {21789, 292}, {21792, 296}, {21794, 291}, {21797, 298}, {21800, 289}, {21802, 299}, {21804, 294}, + {21806, 289}, {21808, 295}, {21811, 306}, {21813, 297}, {21815, 304}, {21823, 306}, {21827, 301}, {21830, 298}, + {21834, 297}, {21856, 293}, {21858, 301}, {21860, 288}, {21862, 296}, {21864, 291}, {21865, 296}, {21867, 292}, + {21869, 294}, {21871, 301}, {21873, 289}, {21875, 303}, {21878, 301}, {21880, 288}, {21881, 209}, {21884, 289}, + {21887, 289}, {21890, 305}, {21893, 290}, {21895, 291}, {21897, 291}, {21899, 299}, {21901, 305}, {21903, 295}, + {21905, 294}, {21907, 288}, {21909, 293}, {21911, 299}, {21913, 290}, {21915, 290}, {21917, 292}, {21919, 296}, + {21921, 296}, {21923, 293}, {21925, 288}, {21927, 292}, {21929, 296}, {21931, 293}, {21933, 289}, {21935, 293}, + {21937, 293}, {21939, 297}, {21941, 297}, {21943, 300}, {21946, 290}, {21948, 300}, {21950, 289}, {21952, 297}, + {21954, 293}, {21957, 289}, {21959, 292}, {21961, 299}, {21970, 290}, {21973, 299}, {21975, 297}, {21978, 289}, + {21986, 320}, {22003, 291}, {22005, 301}, {22007, 295}, {22010, 289}, {22012, 303}, {22015, 289}, {22017, 288}, + {22019, 295}, {22022, 290}, {22025, 294}, {22028, 299}, {22030, 290}, {22035, 288}, {22038, 295}, {22041, 293}, + {22043, 294}, {22045, 305}, {22048, 302}, {22050, 289}, {22052, 291}, {22054, 296}, {22057, 293}, {22059, 289}, + {22061, 300}, {22064, 293}, {22067, 306}, {22069, 288}, {22071, 291}, {22074, 297}, {22076, 291}, {22079, 296}, + {22081, 289}, {22084, 300}, {22086, 289}, {22089, 297}, {22091, 290}, {22093, 297}, {22095, 294}, {22098, 290}, + {22100, 299}, {22103, 293}, {22106, 288}, {22109, 298}, {22118, 293}, {22121, 298}, {22124, 296}, {22127, 303}, + {22150, 289}, {22152, 292}, {22154, 291}, {22156, 291}, {22158, 291}, {22160, 295}, {22162, 303}, {22164, 294}, + {22167, 297}, {22169, 292}, {22172, 288}, {22175, 296}, {22177, 298}, {22181, 292}, {22185, 289}, {22188, 297}, + {22190, 291}, {22193, 295}, {22195, 301}, {22197, 288}, {22198, 289}, {22201, 289}, {22203, 297}, {22205, 290}, + {22207, 290}, {22210, 292}, {22212, 300}, {22215, 298}, {22217, 306}, {22219, 299}, {22222, 296}, {22224, 290}, + {22227, 302}, {22229, 290}, {22231, 293}, {22234, 300}, {22236, 291}, {22238, 300}, {22241, 288}, {22243, 288}, + {22246, 297}, {22248, 304}, {22251, 294}, {22253, 291}, {22255, 288}, {22258, 291}, {22267, 299}, {22270, 288}, + {22273, 291}, {22276, 300}, {22296, 288}, {22300, 288}, {22303, 289}, {22305, 294}, {22307, 312}, {22310, 290}, + {22312, 289}, {22315, 288}, {22318, 293}, {22322, 296}, {22327, 288}, {22332, 299}, {22336, 302}, {22339, 300}, + {22341, 288}, {22343, 293}, {22346, 295}, {22348, 304}, {22351, 302}, {22354, 290}, {22357, 291}, {22359, 292}, + {22362, 296}, {22364, 290}, {22367, 294}, {22370, 290}, {22372, 290}, {22374, 301}, {22377, 288}, {22379, 295}, + {22382, 288}, {22384, 295}, {22387, 288}, {22389, 290}, {22392, 290}, {22394, 289}, {22396, 295}, {22399, 296}, + {22401, 300}, {22403, 289}, {22405, 306}, {22408, 299}, {22416, 299}, {22418, 295}, {22420, 302}, {22423, 294}, + {22425, 295}, {22439, 320}, {22450, 295}, {22452, 310}, {22454, 296}, {22455, 288}, {22457, 291}, {22459, 293}, + {22462, 293}, {22464, 289}, {22467, 297}, {22471, 289}, {22474, 289}, {22480, 288}, {22484, 298}, {22486, 291}, + {22487, 298}, {22489, 299}, {22491, 301}, {22493, 293}, {22495, 289}, {22497, 290}, {22499, 304}, {22501, 293}, + {22502, 300}, {22504, 295}, {22507, 293}, {22508, 292}, {22510, 290}, {22512, 296}, {22514, 288}, {22516, 302}, + {22518, 290}, {22520, 309}, {22522, 306}, {22524, 289}, {22526, 295}, {22528, 288}, {22530, 291}, {22532, 289}, + {22534, 288}, {22536, 289}, {22538, 290}, {22540, 295}, {22542, 306}, {22544, 295}, {22546, 305}, {22548, 289}, + {22550, 288}, {22552, 303}, {22554, 288}, {22556, 295}, {22559, 291}, {22566, 304}, {22568, 290}, {22571, 289}, + {22573, 289}, {22575, 293}, {22577, 292}, {22599, 295}, {22601, 298}, {22603, 288}, {22606, 302}, {22608, 309}, + {22611, 289}, {22614, 292}, {22618, 289}, {22622, 291}, {22627, 294}, {22633, 291}, {22636, 296}, {22638, 305}, + {22640, 291}, {22642, 292}, {22645, 293}, {22647, 288}, {22649, 307}, {22651, 294}, {22653, 296}, {22655, 304}, + {22658, 296}, {22660, 288}, {22662, 290}, {22664, 290}, {22666, 296}, {22669, 298}, {22671, 290}, {22673, 290}, + {22676, 301}, {22678, 291}, {22680, 291}, {22682, 289}, {22684, 291}, {22686, 291}, {22689, 289}, {22691, 294}, + {22693, 293}, {22696, 301}, {22698, 290}, {22700, 304}, {22702, 291}, {22704, 289}, {22706, 291}, {22708, 289}, + {22710, 297}, {22713, 288}, {22717, 289}, {22722, 298}, {22723, 291}, {22725, 288}, {22728, 304}, {22730, 296}, + {22732, 295}, {22755, 300}, {22758, 302}, {22760, 303}, {22762, 290}, {22765, 296}, {22768, 288}, {22771, 288}, + {22775, 293}, {22780, 292}, {22785, 289}, {22791, 292}, {22793, 312}, {22795, 289}, {22797, 289}, {22800, 298}, + {22802, 312}, {22804, 290}, {22806, 294}, {22809, 304}, {22810, 294}, {22813, 296}, {22815, 292}, {22818, 300}, + {22820, 302}, {22822, 292}, {22825, 298}, {22827, 298}, {22830, 296}, {22832, 298}, {22835, 291}, {22837, 289}, + {22840, 299}, {22842, 289}, {22844, 291}, {22847, 301}, {22849, 295}, {22852, 292}, {22854, 301}, {22857, 290}, + {22859, 297}, {22862, 298}, {22864, 301}, {22866, 289}, {22869, 299}, {22872, 298}, {22878, 290}, {22880, 295}, + {22883, 288}, {22885, 296}, {22888, 299}, {22898, 300}, {22913, 297}, {22916, 296}, {22919, 297}, {22923, 294}, + {22928, 291}, {22934, 290}, {22941, 293}, {22946, 301}, {22948, 290}, {22951, 289}, {22953, 291}, {22956, 296}, + {22958, 289}, {22960, 289}, {22962, 291}, {22964, 306}, {22966, 304}, {22969, 302}, {22971, 295}, {22973, 311}, + {22976, 310}, {22978, 298}, {22980, 303}, {22983, 296}, {22985, 296}, {22987, 298}, {22989, 290}, {22992, 303}, + {22994, 305}, {22997, 289}, {22999, 293}, {23001, 290}, {23003, 301}, {23006, 290}, {23008, 295}, {23010, 291}, + {23013, 298}, {23015, 300}, {23017, 291}, {23020, 290}, {23022, 291}, {23024, 288}, {23028, 297}, {23033, 291}, + {23035, 300}, {23038, 291}, {23040, 292}, {23042, 288}, {23045, 289}, {23047, 307}, {23069, 289}, {23072, 292}, + {23075, 299}, {23079, 288}, {23083, 294}, {23088, 291}, {23094, 294}, {23102, 290}, {23105, 303}, {23108, 302}, + {23110, 295}, {23113, 295}, {23115, 302}, {23118, 302}, {23120, 294}, {23122, 297}, {23125, 303}, {23127, 297}, + {23129, 305}, {23131, 289}, {23134, 294}, {23136, 300}, {23138, 303}, {23140, 290}, {23143, 292}, {23145, 301}, + {23147, 289}, {23149, 289}, {23152, 305}, {23154, 296}, {23156, 291}, {23159, 291}, {23162, 288}, {23164, 288}, + {23166, 303}, {23168, 278}, {23171, 304}, {23173, 297}, {23175, 305}, {23178, 292}, {23180, 305}, {23182, 289}, + {23184, 292}, {23187, 296}, {23189, 289}, {23194, 288}, {23197, 307}, {23199, 298}, {23201, 290}, {23203, 294}, + {23205, 288}, {23207, 297}, {23214, 299}, {23231, 293}, {23235, 293}, {23238, 289}, {23242, 292}, {23247, 288}, + {23252, 291}, {23257, 292}, {23264, 301}, {23266, 297}, {23269, 290}, {23271, 288}, {23274, 290}, {23276, 296}, + {23279, 307}, {23280, 290}, {23282, 292}, {23284, 304}, {23286, 294}, {23288, 288}, {23290, 295}, {23292, 302}, + {23293, 289}, {23295, 290}, {23297, 294}, {23299, 293}, {23301, 294}, {23303, 297}, {23305, 291}, {23306, 289}, + {23309, 305}, {23311, 288}, {23313, 290}, {23315, 296}, {23316, 291}, {23318, 293}, {23320, 300}, {23322, 292}, + {23324, 290}, {23326, 302}, {23328, 291}, {23331, 302}, {23332, 294}, {23335, 296}, {23337, 292}, {23339, 290}, + {23341, 288}, {23343, 288}, {23345, 302}, {23347, 299}, {23349, 291}, {23351, 293}, {23354, 299}, {23357, 307}, + {23358, 300}, {23360, 299}, {23362, 303}, {23364, 302}, {23366, 296}, {23368, 299}, {23370, 289}, {23389, 310}, + {23394, 291}, {23398, 288}, {23402, 303}, {23406, 290}, {23410, 293}, {23415, 289}, {23423, 294}, {23427, 290}, + {23430, 290}, {23433, 303}, {23436, 297}, {23438, 307}, {23440, 290}, {23442, 293}, {23445, 312}, {23447, 291}, + {23448, 305}, {23450, 313}, {23452, 310}, {23454, 302}, {23456, 308}, {23458, 291}, {23459, 294}, {23461, 289}, + {23463, 291}, {23465, 290}, {23467, 295}, {23468, 314}, {23470, 308}, {23472, 291}, {23474, 296}, {23477, 290}, + {23478, 290}, {23480, 288}, {23482, 306}, {23484, 288}, {23486, 289}, {23488, 288}, {23490, 296}, {23492, 290}, + {23494, 288}, {23496, 288}, {23498, 292}, {23500, 296}, {23502, 291}, {23504, 293}, {23506, 303}, {23508, 298}, + {23510, 299}, {23512, 292}, {23514, 295}, {23517, 289}, {23520, 291}, {23522, 301}, {23524, 297}, {23526, 297}, + {23528, 291}, {23530, 293}, {23532, 298}, {23534, 299}, {23536, 293}, {23557, 300}, {23562, 292}, {23566, 288}, + {23571, 288}, {23575, 289}, {23582, 291}, {23589, 288}, {23594, 296}, {23597, 290}, {23600, 292}, {23603, 291}, + {23606, 290}, {23609, 308}, {23611, 297}, {23613, 304}, {23615, 293}, {23618, 312}, {23620, 300}, {23622, 299}, + {23624, 288}, {23626, 293}, {23629, 306}, {23631, 290}, {23633, 289}, {23635, 292}, {23637, 300}, {23639, 290}, + {23642, 308}, {23644, 294}, {23646, 292}, {23648, 291}, {23650, 292}, {23652, 289}, {23655, 300}, {23657, 312}, + {23659, 290}, {23661, 300}, {23663, 295}, {23666, 292}, {23668, 301}, {23670, 288}, {23673, 290}, {23675, 292}, + {23677, 304}, {23680, 294}, {23682, 289}, {23684, 291}, {23687, 292}, {23689, 293}, {23691, 298}, {23694, 302}, + {23696, 291}, {23698, 295}, {23700, 302}, {23702, 288}, {23716, 288}, {23726, 292}, {23731, 290}, {23737, 292}, + {23744, 290}, {23752, 289}, {23758, 289}, {23762, 288}, {23767, 293}, {23770, 290}, {23773, 296}, {23776, 288}, + {23778, 296}, {23780, 289}, {23782, 290}, {23785, 299}, {23788, 294}, {23790, 298}, {23792, 291}, {23794, 303}, + {23796, 307}, {23798, 292}, {23801, 292}, {23803, 290}, {23805, 288}, {23807, 293}, {23810, 293}, {23811, 291}, + {23814, 296}, {23816, 299}, {23818, 290}, {23821, 301}, {23823, 294}, {23825, 290}, {23827, 299}, {23830, 292}, + {23832, 297}, {23835, 295}, {23837, 295}, {23839, 303}, {23842, 293}, {23844, 288}, {23846, 299}, {23849, 296}, + {23851, 293}, {23854, 292}, {23856, 296}, {23859, 303}, {23861, 297}, {23863, 301}, {23865, 297}, {23868, 299}, + {23870, 305}, {23891, 294}, {23895, 294}, {23900, 289}, {23906, 289}, {23913, 289}, {23922, 288}, {23929, 289}, + {23932, 291}, {23937, 288}, {23941, 289}, {23944, 288}, {23947, 292}, {23949, 295}, {23951, 306}, {23953, 311}, + {23956, 298}, {23958, 296}, {23960, 294}, {23962, 311}, {23964, 297}, {23966, 290}, {23968, 290}, {23970, 290}, + {23973, 300}, {23975, 295}, {23976, 290}, {23979, 297}, {23981, 291}, {23983, 289}, {23985, 291}, {23987, 300}, + {23989, 296}, {23991, 304}, {23993, 297}, {23995, 298}, {23998, 298}, {24000, 307}, {24002, 288}, {24005, 290}, + {24007, 295}, {24009, 303}, {24011, 290}, {24014, 294}, {24016, 300}, {24018, 290}, {24020, 293}, {24022, 288}, + {24024, 296}, {24027, 290}, {24029, 289}, {24031, 290}, {24033, 301}, {24035, 291}, {24038, 300}, {24040, 289}, + {24042, 290}, {24044, 293}, {24065, 288}, {24069, 292}, {24075, 293}, {24081, 293}, {24088, 289}, {24097, 290}, + {24104, 291}, {24108, 300}, {24113, 289}, {24117, 288}, {24121, 291}, {24123, 291}, {24125, 303}, {24128, 300}, + {24130, 288}, {24133, 292}, {24135, 297}, {24137, 288}, {24139, 296}, {24141, 291}, {24144, 301}, {24146, 290}, + {24148, 296}, {24150, 308}, {24152, 289}, {24154, 306}, {24156, 294}, {24159, 298}, {24161, 305}, {24162, 290}, + {24164, 318}, {24167, 291}, {24169, 294}, {24171, 289}, {24173, 291}, {24175, 290}, {24177, 296}, {24179, 291}, + {24181, 292}, {24183, 293}, {24185, 288}, {24188, 299}, {24190, 299}, {24192, 305}, {24194, 288}, {24196, 291}, + {24198, 292}, {24200, 294}, {24203, 306}, {24205, 290}, {24207, 288}, {24209, 297}, {24211, 296}, {24213, 288}, + {24216, 292}, {24218, 289}, {24220, 288}, {24222, 297}, {24244, 293}, {24248, 306}, {24252, 293}, {24258, 294}, + {24265, 289}, {24274, 288}, {24283, 289}, {24288, 296}, {24293, 290}, {24297, 296}, {24301, 291}, {24304, 308}, + {24307, 297}, {24310, 291}, {24313, 304}, {24315, 290}, {24317, 307}, {24319, 311}, {24321, 290}, {24323, 289}, + {24326, 302}, {24327, 290}, {24330, 312}, {24332, 316}, {24334, 288}, {24336, 303}, {24338, 294}, {24340, 290}, + {24342, 295}, {24344, 305}, {24346, 290}, {24347, 302}, {24349, 290}, {24351, 303}, {24354, 300}, {24355, 291}, + {24358, 313}, {24360, 294}, {24362, 308}, {24364, 289}, {24366, 290}, {24368, 301}, {24371, 297}, {24373, 291}, + {24375, 290}, {24377, 313}, {24379, 304}, {24381, 306}, {24384, 304}, {24386, 305}, {24388, 307}, {24390, 303}, + {24392, 296}, {24394, 288}, {24396, 298}, {24399, 303}, {24401, 290}, {24402, 290}, {24418, 289}, {24427, 302}, + {24431, 295}, {24433, 303}, {24437, 291}, {24443, 297}, {24450, 288}, {24457, 289}, {24467, 294}, {24471, 288}, + {24476, 297}, {24481, 294}, {24484, 288}, {24487, 289}, {24490, 295}, {24493, 289}, {24496, 288}, {24499, 294}, + {24500, 147}, {24501, 290}, {24504, 305}, {24506, 305}, {24508, 297}, {24510, 290}, {24512, 300}, {24513, 294}, + {24515, 310}, {24517, 302}, {24519, 294}, {24521, 304}, {24522, 290}, {24525, 297}, {24527, 305}, {24528, 294}, + {24530, 292}, {24532, 288}, {24534, 294}, {24535, 290}, {24537, 290}, {24539, 306}, {24541, 288}, {24543, 295}, + {24545, 303}, {24546, 294}, {24548, 296}, {24550, 299}, {24552, 290}, {24554, 291}, {24556, 298}, {24558, 292}, + {24559, 295}, {24561, 297}, {24563, 289}, {24565, 298}, {24567, 293}, {24569, 295}, {24571, 289}, {24573, 291}, + {24575, 292}, {24576, 301}, {24579, 288}, {24580, 289}, {24582, 299}, {24584, 290}, {24586, 304}, {24588, 289}, + {24598, 288}, {24610, 288}, {24615, 292}, {24618, 290}, {24620, 293}, {24623, 293}, {24629, 290}, {24637, 293}, + {24646, 292}, {24655, 290}, {24660, 290}, {24665, 298}, {24670, 296}, {24673, 290}, {24677, 301}, {24681, 292}, + {24683, 297}, {24685, 288}, {24687, 297}, {24690, 288}, {24692, 291}, {24694, 301}, {24696, 290}, {24697, 288}, + {24699, 296}, {24701, 297}, {24703, 291}, {24704, 288}, {24706, 298}, {24708, 300}, {24710, 288}, {24712, 295}, + {24714, 295}, {24716, 289}, {24717, 305}, {24719, 301}, {24720, 290}, {24722, 295}, {24724, 295}, {24726, 297}, + {24728, 296}, {24729, 297}, {24731, 289}, {24733, 292}, {24734, 292}, {24736, 298}, {24738, 288}, {24740, 292}, + {24742, 296}, {24743, 309}, {24745, 295}, {24747, 293}, {24748, 295}, {24750, 297}, {24752, 290}, {24754, 299}, + {24756, 288}, {24758, 295}, {24759, 290}, {24761, 290}, {24763, 314}, {24765, 288}, {24766, 291}, {24768, 292}, + {24770, 289}, {24772, 306}, {24773, 289}, {24787, 294}, {24797, 298}, {24801, 290}, {24804, 297}, {24806, 290}, + {24808, 301}, {24813, 291}, {24822, 288}, {24832, 290}, {24842, 289}, {24848, 293}, {24854, 291}, {24858, 291}, + {24862, 293}, {24866, 292}, {24870, 303}, {24872, 289}, {24875, 298}, {24879, 296}, {24881, 288}, {24883, 299}, + {24885, 291}, {24886, 300}, {24888, 315}, {24891, 306}, {24892, 288}, {24895, 291}, {24898, 290}, {24900, 303}, + {24902, 297}, {24903, 298}, {24905, 304}, {24907, 301}, {24908, 291}, {24910, 294}, {24912, 289}, {24914, 289}, + {24915, 293}, {24917, 297}, {24919, 299}, {24921, 289}, {24923, 296}, {24925, 305}, {24926, 290}, {24929, 300}, + {24931, 295}, {24933, 295}, {24935, 291}, {24937, 291}, {24939, 292}, {24941, 291}, {24943, 292}, {24945, 293}, + {24947, 308}, {24948, 295}, {24950, 295}, {24952, 292}, {24954, 300}, {24955, 290}, {24957, 303}, {24959, 296}, + {24961, 307}, {24964, 300}, {24985, 293}, {24988, 298}, {24993, 291}, {24995, 288}, {24998, 297}, {25000, 289}, + {25005, 288}, {25013, 290}, {25023, 291}, {25032, 288}, {25038, 288}, {25043, 297}, {25048, 293}, {25052, 289}, + {25055, 289}, {25059, 295}, {25062, 299}, {25065, 296}, {25068, 297}, {25070, 292}, {25071, 292}, {25073, 296}, + {25075, 290}, {25076, 299}, {25078, 289}, {25079, 291}, {25082, 298}, {25085, 304}, {25087, 292}, {25089, 291}, + {25091, 290}, {25093, 301}, {25094, 291}, {25096, 292}, {25097, 295}, {25099, 293}, {25100, 304}, {25102, 289}, + {25104, 297}, {25105, 313}, {25107, 311}, {25109, 311}, {25110, 304}, {25112, 292}, {25113, 290}, {25116, 302}, + {25118, 293}, {25119, 303}, {25121, 288}, {25123, 299}, {25125, 295}, {25127, 300}, {25129, 295}, {25131, 314}, + {25133, 291}, {25134, 289}, {25136, 297}, {25138, 298}, {25139, 293}, {25141, 305}, {25143, 291}, {25145, 300}, + {25147, 294}, {25148, 289}, {25150, 292}, {25169, 298}, {25173, 300}, {25177, 291}, {25179, 288}, {25181, 291}, + {25183, 288}, {25188, 289}, {25196, 289}, {25206, 291}, {25215, 288}, {25221, 289}, {25226, 290}, {25231, 290}, + {25235, 291}, {25239, 295}, {25242, 288}, {25246, 295}, {25249, 292}, {25251, 289}, {25253, 296}, {25254, 294}, + {25256, 288}, {25258, 301}, {25259, 298}, {25261, 290}, {25264, 289}, {25267, 297}, {25269, 291}, {25271, 304}, + {25273, 288}, {25275, 317}, {25276, 292}, {25277, 290}, {25279, 312}, {25281, 289}, {25282, 298}, {25284, 288}, + {25285, 291}, {25287, 298}, {25288, 294}, {25290, 291}, {25291, 292}, {25293, 308}, {25295, 293}, {25296, 300}, + {25298, 288}, {25300, 312}, {25302, 295}, {25304, 298}, {25306, 298}, {25308, 290}, {25310, 300}, {25312, 302}, + {25314, 313}, {25316, 303}, {25317, 308}, {25319, 301}, {25320, 291}, {25322, 292}, {25323, 288}, {25325, 300}, + {25327, 297}, {25329, 293}, {25330, 288}, {25332, 288}, {25345, 288}, {25356, 304}, {25359, 294}, {25363, 290}, + {25365, 292}, {25368, 297}, {25370, 296}, {25376, 289}, {25383, 289}, {25394, 290}, {25402, 292}, {25408, 291}, + {25413, 288}, {25417, 289}, {25421, 292}, {25425, 288}, {25428, 294}, {25431, 288}, {25434, 302}, {25436, 308}, + {25438, 306}, {25439, 295}, {25441, 300}, {25443, 290}, {25445, 291}, {25448, 288}, {25451, 289}, {25454, 293}, + {25456, 288}, {25457, 290}, {25459, 300}, {25460, 307}, {25462, 290}, {25463, 293}, {25465, 291}, {25466, 290}, + {25467, 289}, {25469, 304}, {25471, 291}, {25472, 293}, {25474, 295}, {25475, 300}, {25477, 314}, {25478, 291}, + {25480, 296}, {25482, 290}, {25484, 312}, {25486, 289}, {25488, 293}, {25490, 288}, {25492, 290}, {25495, 295}, + {25497, 300}, {25498, 288}, {25500, 289}, {25501, 292}, {25503, 289}, {25505, 289}, {25506, 288}, {25508, 302}, + {25509, 294}, {25511, 299}, {25513, 289}, {25515, 295}, {25517, 291}, {25529, 292}, {25539, 288}, {25543, 300}, + {25547, 296}, {25550, 294}, {25553, 295}, {25555, 291}, {25559, 290}, {25567, 288}, {25577, 290}, {25586, 289}, + {25593, 290}, {25598, 290}, {25602, 293}, {25605, 288}, {25609, 291}, {25612, 289}, {25615, 293}, {25619, 290}, + {25621, 294}, {25622, 295}, {25624, 291}, {25626, 291}, {25628, 290}, {25630, 292}, {25633, 292}, {25635, 297}, + {25637, 289}, {25640, 300}, {25642, 292}, {25643, 288}, {25644, 293}, {25646, 291}, {25648, 290}, {25649, 290}, + {25651, 298}, {25652, 301}, {25654, 299}, {25655, 292}, {25657, 296}, {25659, 316}, {25659, 113}, {25661, 292}, + {25663, 289}, {25665, 292}, {25666, 288}, {25669, 298}, {25671, 298}, {25673, 292}, {25675, 288}, {25677, 301}, + {25679, 296}, {25682, 300}, {25683, 289}, {25685, 299}, {25686, 293}, {25688, 297}, {25690, 293}, {25691, 304}, + {25693, 289}, {25695, 292}, {25697, 296}, {25699, 298}, {25700, 293}, {25704, 288}, {25716, 290}, {25726, 289}, + {25729, 294}, {25733, 288}, {25736, 290}, {25738, 290}, {25741, 292}, {25745, 292}, {25752, 288}, {25762, 288}, + {25771, 292}, {25777, 293}, {25782, 290}, {25786, 292}, {25790, 292}, {25794, 293}, {25797, 292}, {25800, 290}, + {25803, 294}, {25805, 299}, {25807, 295}, {25809, 290}, {25811, 302}, {25814, 289}, {25816, 298}, {25819, 295}, + {25821, 298}, {25823, 296}, {25825, 291}, {25827, 289}, {25829, 292}, {25830, 296}, {25832, 299}, {25834, 299}, + {25835, 290}, {25837, 292}, {25839, 293}, {25840, 290}, {25841, 289}, {25843, 295}, {25845, 289}, {25846, 292}, + {25848, 289}, {25850, 293}, {25852, 291}, {25854, 292}, {25856, 290}, {25858, 288}, {25861, 292}, {25863, 288}, + {25865, 297}, {25867, 289}, {25868, 295}, {25870, 288}, {25872, 293}, {25873, 289}, {25875, 288}, {25877, 298}, + {25879, 292}, {25881, 295}, {25883, 289}, {25884, 288}, {25889, 291}, {25901, 289}, {25908, 291}, {25915, 293}, + {25918, 290}, {25922, 288}, {25924, 293}, {25927, 289}, {25930, 290}, {25935, 289}, {25943, 290}, {25953, 288}, + {25960, 288}, {25965, 290}, {25970, 294}, {25974, 289}, {25979, 288}, {25983, 292}, {25986, 291}, {25989, 291}, + {25992, 299}, {25994, 290}, {25996, 290}, {25998, 291}, {26001, 292}, {26003, 289}, {26005, 289}, {26008, 298}, + {26010, 290}, {26012, 301}, {26014, 291}, {26016, 289}, {26018, 300}, {26019, 288}, {26021, 299}, {26022, 289}, + {26024, 289}, {26026, 298}, {26027, 288}, {26028, 290}, {26030, 289}, {26032, 291}, {26034, 290}, {26035, 288}, + {26037, 296}, {26039, 299}, {26041, 291}, {26043, 291}, {26045, 288}, {26047, 297}, {26049, 291}, {26052, 289}, + {26054, 288}, {26055, 291}, {26057, 288}, {26058, 288}, {26060, 288}, {26062, 291}, {26063, 288}, {26065, 297}, + {26067, 300}, {26069, 295}, {26071, 288}, {26073, 288}, {26075, 291}, {26084, 294}, {26093, 289}, {26098, 289}, + {26105, 291}, {26109, 297}, {26112, 295}, {26116, 295}, {26119, 296}, {26121, 290}, {26124, 290}, {26128, 288}, + {26135, 289}, {26144, 290}, {26152, 289}, {26158, 288}, {26163, 288}, {26167, 290}, {26171, 289}, {26175, 293}, + {26178, 292}, {26181, 290}, {26184, 297}, {26186, 289}, {26189, 296}, {26191, 289}, {26193, 294}, {26196, 288}, + {26199, 290}, {26202, 294}, {26204, 292}, {26206, 291}, {26207, 293}, {26209, 289}, {26211, 292}, {26212, 292}, + {26214, 289}, {26216, 294}, {26217, 290}, {26219, 290}, {26221, 290}, {26223, 289}, {26225, 292}, {26226, 289}, + {26228, 291}, {26230, 288}, {26232, 293}, {26235, 291}, {26236, 289}, {26239, 293}, {26241, 290}, {26243, 293}, + {26245, 288}, {26247, 294}, {26249, 289}, {26250, 291}, {26252, 297}, {26254, 291}, {26255, 294}, {26257, 292}, + {26259, 292}, {26261, 288}, {26263, 291}, {26264, 290}, {26266, 293}, {26275, 290}, {26283, 288}, {26289, 288}, + {26296, 290}, {26299, 292}, {26303, 288}, {26306, 292}, {26309, 293}, {26312, 298}, {26316, 294}, {26323, 288}, + {26331, 291}, {26339, 292}, {26345, 295}, {26350, 292}, {26355, 291}, {26359, 288}, {26363, 288}, {26366, 288}, + {26370, 291}, {26372, 292}, {26374, 288}, {26377, 295}, {26380, 289}, {26383, 290}, {26385, 293}, {26388, 289}, + {26390, 292}, {26392, 294}, {26394, 300}, {26396, 293}, {26398, 295}, {26400, 294}, {26402, 295}, {26404, 291}, + {26405, 293}, {26407, 292}, {26409, 291}, {26411, 288}, {26413, 291}, {26415, 291}, {26417, 288}, {26419, 290}, + {26421, 293}, {26423, 294}, {26425, 288}, {26427, 290}, {26430, 293}, {26431, 295}, {26433, 297}, {26435, 295}, + {26437, 291}, {26438, 289}, {26440, 289}, {26442, 296}, {26444, 289}, {26446, 289}, {26448, 295}, {26450, 291}, + {26455, 290}, {26464, 289}, {26467, 150}, {26473, 290}, {26479, 291}, {26483, 288}, {26486, 292}, {26490, 295}, + {26493, 296}, {26495, 289}, {26498, 289}, {26502, 291}, {26509, 291}, {26516, 288}, {26524, 288}, {26530, 288}, + {26535, 289}, {26540, 290}, {26544, 291}, {26548, 290}, {26551, 293}, {26555, 288}, {26556, 291}, {26558, 290}, + {26561, 289}, {26564, 290}, {26567, 288}, {26570, 295}, {26572, 289}, {26574, 291}, {26576, 288}, {26578, 292}, + {26580, 290}, {26582, 288}, {26584, 290}, {26586, 295}, {26588, 289}, {26590, 289}, {26591, 289}, {26594, 292}, + {26596, 288}, {26598, 293}, {26600, 292}, {26602, 290}, {26604, 289}, {26606, 289}, {26608, 288}, {26610, 288}, + {26612, 291}, {26614, 291}, {26616, 290}, {26618, 295}, {26620, 293}, {26622, 292}, {26623, 292}, {26625, 298}, + {26627, 292}, {26629, 288}, {26631, 289}, {26633, 292}, {26637, 288}, {26643, 294}, {26651, 288}, {26655, 289}, + {26660, 289}, {26664, 289}, {26669, 288}, {26672, 290}, {26675, 289}, {26678, 293}, {26681, 289}, {26683, 288}, + {26686, 288}, {26692, 290}, {26699, 292}, {26707, 291}, {26713, 293}, {26718, 289}, {26722, 288}, {26726, 292}, + {26730, 289}, {26734, 293}, {26737, 291}, {26739, 290}, {26742, 289}, {26744, 289}, {26747, 291}, {26750, 296}, + {26752, 291}, {26755, 291}, {26757, 288}, {26759, 290}, {26762, 291}, {26764, 290}, {26766, 292}, {26768, 289}, + {26770, 291}, {26772, 292}, {26774, 290}, {26776, 290}, {26778, 290}, {26779, 291}, {26781, 289}, {26784, 291}, + {26786, 291}, {26787, 288}, {26790, 294}, {26792, 291}, {26795, 291}, {26797, 289}, {26799, 295}, {26801, 290}, + {26803, 295}, {26805, 295}, {26807, 295}, {26808, 288}, {26810, 298}, {26812, 289}, {26814, 294}, {26816, 289}, + {26817, 290}, {26823, 291}, {26828, 290}, {26834, 293}, {26838, 292}, {26842, 291}, {26846, 288}, {26851, 295}, + {26854, 290}, {26857, 291}, {26860, 290}, {26862, 290}, {26865, 289}, {26867, 288}, {26869, 290}, {26876, 291}, + {26883, 289}, {26891, 290}, {26896, 289}, {26901, 288}, {26905, 289}, {26910, 289}, {26913, 288}, {26917, 288}, + {26920, 288}, {26922, 291}, {26925, 290}, {26927, 288}, {26931, 288}, {26934, 289}, {26936, 289}, {26938, 288}, + {26941, 289}, {26943, 292}, {26945, 288}, {26947, 290}, {26949, 288}, {26951, 290}, {26953, 292}, {26955, 296}, + {26957, 288}, {26959, 290}, {26961, 290}, {26963, 290}, {26965, 292}, {26968, 289}, {26969, 288}, {26972, 289}, + {26974, 289}, {26976, 288}, {26979, 291}, {26981, 289}, {26983, 290}, {26985, 292}, {26987, 289}, {26988, 288}, + {26991, 291}, {26993, 290}, {26995, 291}, {27000, 290}, {27005, 292}, {27011, 292}, {27014, 289}, {27018, 289}, + {27022, 289}, {27026, 288}, {27029, 288}, {27032, 290}, {27034, 288}, {27037, 290}, {27040, 289}, {27042, 291}, + {27044, 288}, {27046, 288}, {27052, 293}, {27058, 288}, {27065, 295}, {27070, 288}, {27075, 291}, {27079, 290}, + {27083, 288}, {27086, 288}, {27090, 292}, {27093, 291}, {27095, 288}, {27097, 288}, {27100, 290}, {27102, 290}, + {27103, 34}, {27105, 292}, {27108, 289}, {27110, 289}, {27112, 294}, {27114, 291}, {27116, 292}, {27118, 291}, + {27120, 290}, {27122, 289}, {27124, 292}, {27126, 294}, {27127, 288}, {27129, 291}, {27131, 290}, {27133, 288}, + {27135, 292}, {27137, 292}, {27139, 291}, {27141, 292}, {27143, 288}, {27145, 295}, {27147, 292}, {27149, 292}, + {27151, 296}, {27153, 288}, {27155, 290}, {27157, 291}, {27158, 290}, {27160, 288}, {27162, 292}, {27164, 289}, + {27166, 291}, {27169, 293}, {27173, 291}, {27178, 294}, {27183, 291}, {27188, 289}, {27190, 288}, {27194, 290}, + {27198, 290}, {27201, 289}, {27204, 288}, {27207, 291}, {27210, 289}, {27212, 292}, {27214, 289}, {27216, 289}, + {27219, 288}, {27222, 290}, {27228, 289}, {27235, 290}, {27242, 292}, {27247, 288}, {27252, 291}, {27256, 291}, + {27259, 291}, {27263, 291}, {27267, 288}, {27269, 290}, {27272, 288}, {27274, 288}, {27278, 289}, {27281, 289}, + {27283, 288}, {27286, 289}, {27288, 289}, {27290, 289}, {27292, 289}, {27294, 288}, {27296, 289}, {27298, 288}, + {27301, 289}, {27302, 292}, {27304, 289}, {27307, 288}, {27309, 290}, {27311, 293}, {27313, 289}, {27315, 289}, + {27317, 289}, {27319, 289}, {27321, 288}, {27323, 288}, {27325, 289}, {27327, 290}, {27329, 291}, {27332, 288}, + {27333, 288}, {27336, 289}, {27338, 290}, {27340, 288}, {27343, 291}, {27347, 288}, {27352, 290}, {27356, 288}, + {27361, 289}, {27364, 288}, {27367, 290}, {27370, 288}, {27374, 290}, {27377, 288}, {27380, 288}, {27382, 289}, + {27385, 290}, {27388, 290}, {27390, 288}, {27393, 288}, {27395, 288}, {27397, 289}, {27402, 288}, {27408, 288}, + {27414, 296}, {27420, 292}, {27424, 291}, {27429, 290}, {27432, 290}, {27436, 288}, {27439, 289}, {27443, 288}, + {27445, 290}, {27447, 288}, {27450, 290}, {27452, 290}, {27455, 290}, {27458, 288}, {27461, 288}, {27462, 289}, + {27465, 288}, {27467, 290}, {27469, 288}, {27471, 291}, {27473, 289}, {27475, 288}, {27477, 291}, {27478, 289}, + {27480, 291}, {27482, 289}, {27484, 291}, {27486, 291}, {27488, 289}, {27490, 290}, {27492, 288}, {27494, 290}, + {27496, 290}, {27498, 289}, {27500, 288}, {27502, 290}, {27504, 292}, {27506, 288}, {27508, 290}, {27510, 291}, + {27512, 288}, {27514, 288}, {27516, 292}, {27518, 289}, {27521, 288}, {27525, 293}, {27529, 290}, {27533, 291}, + {27537, 288}, {27541, 289}, {27543, 293}, {27546, 289}, {27549, 289}, {27552, 289}, {27555, 290}, {27558, 292}, + {27561, 289}, {27563, 288}, {27566, 290}, {27568, 290}, {27570, 289}, {27572, 289}, {27574, 290}, {27578, 288}, + {27584, 296}, {27591, 289}, {27597, 297}, {27602, 294}, {27606, 288}, {27609, 288}, {27613, 291}, {27616, 289}, + {27619, 289}, {27622, 289}, {27624, 289}, {27627, 289}, {27629, 289}, {27633, 290}, {27635, 292}, {27638, 291}, + {27640, 245}, {27642, 288}, {27644, 290}, {27646, 288}, {27648, 290}, {27650, 290}, {27653, 289}, {27655, 292}, + {27656, 290}, {27658, 288}, {27660, 289}, {27662, 288}, {27664, 289}, {27666, 291}, {27668, 288}, {27669, 289}, + {27671, 293}, {27673, 289}, {27675, 290}, {27677, 291}, {27679, 290}, {27681, 293}, {27683, 290}, {27685, 293}, + {27687, 289}, {27689, 289}, {27691, 290}, {27693, 289}, {27694, 290}, {27699, 288}, {27702, 293}, {27705, 288}, + {27709, 293}, {27713, 288}, {27716, 289}, {27719, 291}, {27721, 294}, {27724, 288}, {27727, 293}, {27730, 288}, + {27732, 289}, {27735, 290}, {27737, 292}, {27740, 289}, {27742, 289}, {27744, 288}, {27746, 290}, {27748, 291}, + {27750, 292}, {27753, 291}, {27758, 291}, {27765, 305}, {27774, 298}, {27782, 292}, {27791, 290}, {27798, 292}, + {27803, 288}, {27808, 288}, {27813, 289}, {27818, 292}, {27822, 288}, {27826, 290}, {27829, 292}, {27831, 288}, + {27835, 288}, {27837, 292}, {27840, 288}, {27843, 289}, {27846, 289}, {27848, 290}, {27850, 288}, {27853, 289}, + {27856, 289}, {27859, 289}, {27862, 291}, {27865, 288}, {27868, 288}, {27871, 289}, {27873, 291}, {27876, 289}, + {27878, 289}, {27881, 289}, {27883, 291}, {27886, 288}, {27889, 289}, {27891, 288}, {27894, 289}, {27896, 292}, + {27899, 290}, {27901, 292}, {27904, 291}, {27907, 294}, {27910, 289}, {27913, 288}, {27916, 288}, {27918, 290}, + {27920, 291}, {27922, 289}, {27923, 291}, {27925, 290}, {27927, 288}, {27928, 289}, {27930, 288}, {27932, 289}, + {27934, 296}, {27935, 289}, {27937, 291}, {27939, 289}, {27940, 288}, {27942, 290}, {27945, 290}, {27949, 290}, + {27952, 295}, {27956, 289}, {27960, 290}, {27963, 290}, {27967, 288}, {27972, 288}, {27976, 288}, {27982, 288}, + {27986, 288}, {27989, 292}, {27992, 290}, {27995, 289}, {27998, 289}, {28002, 289}, {28005, 288}, {28008, 293}, + {28011, 289}, {28015, 290}, {28018, 288}, {28022, 288}, {28026, 290}, {28029, 288}, {28032, 289}, {28035, 291}, + {28037, 289}, {28041, 288}, {28043, 288}, {28046, 293}, {28049, 288}, {28052, 289}, {28056, 288}, {28058, 288}, + {28061, 288}, {28064, 291}, {28067, 289}, {28069, 290}, {28072, 289}, {28079, 298}, {28086, 290}, {28095, 290}, + {28101, 294}, {28108, 288}, {28115, 291}, {28121, 297}, {28127, 289}, {28130, 289}, {28134, 288}, {28138, 289}, + {28142, 290}, {28145, 292}, {28148, 289}, {28151, 295}, {28154, 289}, {28157, 289}, {28160, 289}, {28164, 288}, + {28167, 290}, {28171, 290}, {28174, 288}, {28177, 288}, {28181, 291}, {28184, 289}, {28187, 288}, {28190, 289}, + {28193, 289}, {28196, 291}, {28200, 289}, {28203, 288}, {28206, 289}, {28209, 288}, {28212, 290}, {28215, 289}, + {28219, 289}, {28221, 290}, {28224, 294}, {28226, 290}, {28227, 288}, {28229, 288}, {28230, 289}, {28232, 290}, + {28233, 295}, {28234, 288}, {28236, 292}, {28238, 290}, {28239, 293}, {28240, 288}, {28242, 289}, {28243, 292}, + {28245, 292}, {28246, 288}, {28248, 289}, {28249, 291}, {28251, 290}, {28252, 289}, {28254, 291}, {28256, 289}, + {28256, 200}, {28259, 290}, {28261, 291}, {28263, 294}, {28265, 291}, {28268, 289}, {28270, 290}, {28272, 291}, + {28275, 288}, {28276, 290}, {28279, 293}, {28281, 290}, {28283, 290}, {28285, 290}, {28288, 289}, {28290, 292}, + {28292, 289}, {28297, 288}, {28302, 292}, {28307, 289}, {28313, 288}, {28317, 290}, {28321, 291}, {28326, 289}, + {28331, 290}, {28337, 290}, {28341, 289}, {28348, 291}, {28354, 289}, {28360, 288}, {28365, 288}, {28371, 293}, + {28374, 293}, {28377, 292}, {28382, 289}, {28385, 291}, {28389, 290}, {28393, 294}, {28396, 293}, {28399, 292}, + {28402, 289}, {28406, 290}, {28409, 295}, {28414, 293}, {28417, 294}, {28422, 291}, {28426, 289}, {28431, 289}, + {28433, 292}, {28436, 288}, {28439, 288}, {28442, 290}, {28444, 291}, {28446, 292}, {28449, 292}, {28452, 292}, + {28453, 288}, {28455, 289}, {28458, 289}, {28460, 290}, {28462, 290}, {28463, 288}, {28466, 293}, {28469, 296}, + {28472, 291}, {28475, 291}, {28478, 293}, {28480, 288}, {28482, 288}, {28485, 291}, {28487, 289}, {28489, 288}, + {28495, 290}, {28503, 288}, {28512, 290}, {28519, 291}, {28528, 289}, {28537, 288}, {28542, 289}, {28547, 291}, + {28551, 294}, {28556, 290}, {28560, 288}, {28564, 288}, {28568, 290}, {28573, 290}, {28577, 292}, {28581, 290}, + {28586, 288}, {28591, 290}, {28594, 290}, {28597, 290}, {28601, 289}, {28605, 288}, {28609, 288}, {28613, 288}, + {28617, 291}, {28621, 288}, {28625, 291}, {28629, 290}, {28633, 288}, {28636, 288}, {28640, 288}, {28644, 292}, + {28648, 289}, {28652, 293}, {28655, 291}, {28658, 289}, {28661, 288}, {28665, 291}, {28668, 288}, {28671, 291}, + {28674, 288}, {28678, 290}, {28681, 290}, {28685, 293}, {28688, 289}, {28692, 292}, {28694, 288}, {28696, 296}, + {28699, 289}, {28702, 291}, {28705, 294}, {28707, 292}, {28709, 290}, {28712, 290}, {28715, 288}, {28717, 290}, + {28720, 290}, {28722, 293}, {28725, 297}, {28727, 289}, {28729, 289}, {28732, 288}, {28734, 290}, {28738, 288}, + {28740, 290}, {28742, 290}, {28744, 290}, {28747, 288}, {28749, 292}, {28751, 289}, {28756, 292}, {28759, 292}, + {28763, 293}, {28766, 288}, {28770, 289}, {28772, 292}, {28775, 292}, {28778, 288}, {28782, 292}, {28785, 292}, + {28787, 291}, {28790, 290}, {28793, 290}, {28795, 295}, {28796, 289}, {28799, 289}, {28801, 293}, {28804, 290}, + {28807, 293}, {28811, 289}, {28815, 290}, {28819, 288}, {28824, 289}, {28827, 294}, {28829, 290}, {28832, 289}, + {28835, 288}, {28838, 288}, {28841, 289}, {28844, 290}, {28847, 288}, {28851, 288}, {28854, 290}, {28857, 289}, + {28861, 288}, {28867, 294}, {28872, 288}, {28875, 292}, {28879, 289}, {28882, 288}, {28886, 288}, {28890, 290}, + {28894, 292}, {28896, 294}, {28898, 288}, {28901, 292}, {28904, 295}, {28907, 291}, {28910, 288}, {28913, 293}, + {28915, 288}, {28918, 291}, {28920, 290}, {28923, 294}, {28926, 290}, {28930, 293}, {28933, 294}, {28936, 293}, + {28940, 288}, {28943, 291}, {28946, 293}, {28950, 292}, {28953, 292}, {28957, 290}, {28960, 291}, {28963, 290}, + {28965, 291}, {28966, 289}, {28968, 289}, {28970, 290}, {28972, 288}, {28974, 290}, {28976, 288}, {28978, 292}, + {28980, 293}, {28982, 292}, {28983, 288}, {28986, 290}, {28987, 289}, {28989, 292}, {28991, 294}, {28993, 293}, + {28995, 289}, {28997, 289}, {29000, 288}, {29005, 294}, {29010, 291}, {29015, 291}, {29020, 291}, {29024, 296}, + {29029, 290}, {29033, 290}, {29037, 290}, {29044, 291}, {29051, 292}, {29057, 288}, {29063, 288}, {29069, 289}, + {29075, 294}, {29081, 290}, {29087, 291}, {29092, 295}, {29099, 289}, {29103, 301}, {29108, 290}, {29112, 243}, + {29116, 288}, {29120, 288}, {29125, 291}, {29130, 289}, {29137, 289}, {29142, 291}, {29147, 288}, {29151, 291}, + {29156, 291}, {29161, 290}, {29166, 290}, {29170, 289}, {29174, 292}, {29179, 288}, {29185, 289}, {29189, 289}, + {29194, 290}, {29199, 292}, {29208, 288}, {29211, 289}, {29214, 288}, {29216, 288}, {29220, 290}, {29223, 288}, + {29226, 290}, {29229, 289}, {29232, 288}, {29235, 293}, {29238, 294}, {29241, 288}, {29244, 290}, {29247, 291}, + {29251, 290}, {29254, 294}, {29257, 291}, {29259, 290}, {29261, 295}, {29264, 288}, {29266, 289}, {29269, 289}, + {29274, 289}, {29278, 288}, {29283, 289}, {29286, 291}, {29290, 291}, {29294, 295}, {29297, 290}, {29300, 291}, + {29302, 288}, {29306, 290}, {29309, 289}, {29312, 290}, {29318, 292}, {29321, 293}, {29325, 289}, {29329, 288}, + {29335, 289}, {29339, 291}, {29342, 291}, {29346, 288}, {29351, 290}, {29354, 290}, {29359, 288}, {29362, 291}, + {29366, 290}, {29369, 290}, {29374, 290}, {29379, 292}, {29383, 292}, {29387, 289}, {29391, 290}, {29396, 292}, + {29401, 290}, {29406, 288}, {29410, 289}, {29413, 288}, {29417, 288}, {29420, 289}, {29423, 291}, {29429, 290}, + {29431, 292}, {29436, 290}, {29439, 293}, {29442, 292}, {29447, 288}, {29450, 290}, {29455, 290}, {29458, 291}, + {29460, 292}, {29463, 292}, {29466, 299}, {29468, 294}, {29470, 290}, {29473, 290}, {29474, 290}, {29477, 288}, + {29479, 290}, {29482, 291}, {29484, 289}, {29487, 290}, {29488, 290}, {29490, 288}, {29492, 292}, {29494, 288}, + {29496, 294}, {29498, 289}, {29500, 292}, {29502, 290}, {29504, 291}, {29506, 289}, {29510, 292}, {29515, 290}, + {29520, 296}, {29524, 294}, {29526, 293}, {29529, 297}, {29532, 289}, {29535, 289}, {29538, 288}, {29541, 291}, + {29546, 289}, {29552, 292}, {29558, 289}, {29563, 289}, {29569, 288}, {29574, 289}, {29579, 288}, {29583, 288}, + {29588, 290}, {29593, 289}, {29597, 290}, {29601, 291}, {29606, 291}, {29611, 288}, {29616, 289}, {29620, 288}, + {29625, 289}, {29629, 294}, {29633, 288}, {29637, 288}, {29642, 290}, {29646, 289}, {29652, 290}, {29656, 289}, + {29661, 293}, {29666, 288}, {29671, 290}, {29674, 288}, {29678, 288}, {29682, 289}, {29686, 289}, {29690, 288}, + {29694, 289}, {29697, 289}, {29701, 290}, {29706, 288}, {29710, 289}, {29714, 289}, {29718, 290}, {29721, 289}, + {29725, 290}, {29730, 289}, {29735, 288}, {29739, 288}, {29745, 289}, {29750, 288}, {29754, 291}, {29759, 288}, + {29764, 289}, {29769, 295}, {29774, 294}, {29779, 288}, {29785, 289}, {29790, 289}, {29795, 288}, {29800, 294}, + {29804, 290}, {29808, 291}, {29813, 291}, {29817, 288}, {29822, 290}, {29827, 290}, {29831, 290}, {29837, 292}, + {29841, 288}, {29847, 288}, {29851, 290}, {29856, 289}, {29860, 290}, {29865, 289}, {29872, 288}, {29876, 290}, + {29880, 290}, {29884, 292}, {29888, 288}, {29892, 288}, {29897, 289}, {29900, 294}, {29905, 295}, {29909, 289}, + {29914, 290}, {29917, 289}, {29922, 291}, {29927, 288}, {29931, 288}, {29936, 288}, {29942, 297}, {29947, 288}, + {29951, 293}, {29956, 293}, {29960, 292}, {29965, 289}, {29969, 288}, {29974, 288}, {29977, 289}, {29983, 288}, + {29987, 290}, {29989, 289}, {29992, 289}, {29994, 292}, {29999, 301}, {30002, 201}, {30006, 292}, {30010, 296}, + {30012, 297}, {30016, 295}, {30019, 288}, {30022, 288}, {30024, 288}, {30026, 289}, {30029, 301}, {30032, 295}, + {30038, 290}, {30044, 289}, {30051, 291}, {30057, 288}, {30063, 299}, {30069, 288}, {30075, 291}, {30081, 288}, + {30087, 298}, {30095, 289}, {30100, 288}, {30107, 289}, {30113, 288}, {30117, 290}, {30123, 289}, {30127, 289}, + {30133, 290}, {30139, 288}, {30144, 288}, {30150, 291}, {30156, 288}, {30159, 289}, {30163, 292}, {30168, 289}, + {30173, 290}, {30177, 293}, {30181, 290}, {30186, 289}, {30190, 294}, {30195, 289}, {30199, 290}, {30205, 293}, + {30211, 291}, {30215, 289}, {30222, 296}, {30228, 289}, {30234, 289}, {30239, 292}, {30244, 293}, {30249, 289}, + {30254, 291}, {30260, 288}, {30263, 289}, {30269, 289}, {30273, 289}, {30278, 290}, {30282, 289}, {30286, 288}, + {30289, 288}, {30293, 295}, {30298, 290}, {30302, 288}, {30306, 288}, {30310, 288}, {30317, 289}, {30321, 289}, + {30326, 291}, {30331, 292}, {30335, 289}, {30340, 289}, {30344, 289}, {30347, 288}, {30351, 290}, {30355, 289}, + {30359, 292}, {30363, 289}, {30367, 288}, {30371, 288}, {30376, 290}, {30381, 289}, {30385, 289}, {30390, 291}, + {30394, 288}, {30399, 289}, {30404, 293}, {30408, 289}, {30412, 289}, {30417, 291}, {30423, 288}, {30427, 290}, + {30432, 288}, {30436, 291}, {30441, 290}, {30445, 289}, {30450, 289}, {30455, 296}, {30462, 292}, {30467, 290}, + {30472, 294}, {30477, 292}, {30481, 292}, {30484, 294}, {30488, 293}, {30493, 298}, {30496, 290}, {30499, 295}, + {30501, 291}, {30503, 294}, {30505, 293}, {30511, 295}, {30517, 290}, {30523, 289}, {30529, 293}, {30536, 288}, + {30541, 290}, {30547, 289}, {30552, 292}, {30556, 289}, {30562, 296}, {30568, 290}, {30574, 289}, {30579, 289}, + {30584, 290}, {30590, 289}, {30596, 289}, {30601, 288}, {30607, 289}, {30611, 293}, {30616, 290}, {30620, 290}, + {30625, 288}, {30629, 292}, {30634, 288}, {30638, 288}, {30642, 289}, {30648, 289}, {30652, 290}, {30658, 288}, + {30664, 288}, {30670, 288}, {30676, 290}, {30681, 289}, {30686, 288}, {30692, 289}, {30697, 290}, {30702, 289}, + {30707, 289}, {30711, 290}, {30717, 288}, {30721, 288}, {30726, 288}, {30730, 288}, {30735, 289}, {30739, 289}, + {30744, 290}, {30749, 290}, {30755, 289}, {30761, 290}, {30766, 291}, {30771, 288}, {30776, 295}, {30781, 290}, + {30786, 291}, {30792, 293}, {30796, 289}, {30801, 288}, {30806, 290}, {30811, 289}, {30816, 295}, {30821, 289}, + {30827, 288}, {30832, 288}, {30837, 289}, {30842, 290}, {30847, 288}, {30853, 289}, {30858, 290}, {30863, 288}, + {30871, 288}, {30876, 290}, {30880, 295}, {30884, 288}, {30888, 291}, {30891, 292}, {30894, 295}, {30898, 294}, + {30901, 288}, {30904, 295}, {30907, 289}, {30911, 295}, {30914, 288}, {30916, 292}, {30923, 289}, {30931, 292}, + {30940, 292}, {30949, 288}, {30957, 289}, {30965, 290}, {30965, 8}, {30970, 298}, {30977, 298}, {30983, 306}, + {30989, 290}, {30994, 291}, {31000, 296}, {31005, 289}, {31010, 294}, {31014, 289}, {31018, 288}, {31022, 289}, + {31026, 290}, {31029, 288}, {31033, 291}, {31037, 289}, {31042, 297}, {31047, 289}, {31052, 289}, {31058, 289}, + {31062, 288}, {31067, 290}, {31072, 291}, {31076, 290}, {31081, 288}, {31087, 291}, {31092, 288}, {31096, 289}, + {31101, 289}, {31105, 293}, {31109, 289}, {31114, 288}, {31119, 288}, {31124, 289}, {31130, 288}, {31135, 288}, + {31140, 288}, {31145, 290}, {31150, 288}, {31156, 290}, {31161, 288}, {31166, 288}, {31171, 289}, {31175, 290}, + {31180, 288}, {31186, 290}, {31191, 291}, {31198, 289}, {31203, 290}, {31208, 289}, {31214, 288}, {31219, 290}, + {31225, 289}, {31230, 289}, {31236, 289}, {31240, 288}, {31244, 291}, {31248, 288}, {31252, 288}, {31256, 291}, + {31259, 288}, {31262, 291}, {31265, 291}, {31268, 296}, {31271, 290}, {31274, 293}, {31277, 291}, {31284, 290}, + {31290, 288}, {31298, 294}, {31312, 292}, {31320, 293}, {31329, 300}, {31337, 291}, {31344, 288}, {31352, 295}, + {31360, 293}, {31368, 290}, {31375, 291}, {31383, 288}, {31389, 290}, {31396, 290}, {31401, 293}, {31405, 294}, + {31410, 288}, {31415, 289}, {31422, 291}, {31428, 291}, {31434, 288}, {31440, 290}, {31445, 290}, {31449, 288}, + {31453, 291}, {31457, 289}, {31460, 289}, {31464, 292}, {31469, 291}, {31473, 290}, {31477, 288}, {31481, 290}, + {31485, 294}, {31491, 290}, {31495, 288}, {31499, 291}, {31504, 293}, {31508, 288}, {31513, 293}, {31517, 290}, + {31523, 291}, {31529, 288}, {31534, 289}, {31539, 290}, {31545, 290}, {31551, 296}, {31557, 290}, {31561, 288}, + {31565, 300}, {31568, 290}, {31572, 289}, {31575, 292}, {31579, 289}, {31582, 293}, {31585, 290}, {31588, 292}, + {31590, 294}, {31593, 290}, {31595, 294}, {31598, 291}, {31601, 288}, {31606, 288}, {31612, 289}, {31620, 289}, + {31628, 295}, {31637, 300}, {31646, 288}, {31655, 288}, {31662, 289}, {31670, 291}, {31678, 291}, {31685, 289}, + {31692, 288}, {31698, 293}, {31704, 290}, {31711, 295}, {31718, 292}, {31725, 296}, {31733, 295}, {31740, 290}, + {31746, 290}, {31753, 288}, {31759, 290}, {31765, 293}, {31771, 288}, {31776, 288}, {31781, 292}, {31787, 290}, + {31791, 288}, {31796, 289}, {31801, 290}, {31806, 291}, {31812, 288}, {31817, 290}, {31823, 291}, {31828, 288}, + {31833, 289}, {31837, 292}, {31842, 290}, {31846, 289}, {31851, 289}, {31856, 289}, {31861, 291}, {31864, 290}, + {31867, 290}, {31869, 290}, {31872, 290}, {31875, 292}, {31877, 288}, {31879, 291}, {31881, 289}, {31884, 295}, + {31885, 290}, {31888, 292}, {31890, 290}, {31892, 291}, {31894, 294}, {31897, 289}, {31899, 139}, {31902, 289}, + {31909, 289}, {31917, 292}, {31926, 291}, {31933, 294}, {31942, 298}, {31950, 291}, {31956, 288}, {31963, 288}, + {31971, 296}, {31979, 301}, {31987, 295}, {31995, 290}, {32002, 288}, {32010, 293}, {32017, 289}, {32023, 291}, + {32031, 289}, {32038, 293}, {32045, 291}, {32053, 296}, {32061, 289}, {32068, 289}, {32076, 290}, {32082, 289}, + {32086, 289}, {32089, 291}, {32094, 288}, {32097, 290}, {32100, 292}, {32103, 288}, {32107, 293}, {32110, 289}, + {32113, 289}, {32116, 288}, {32119, 289}, {32122, 292}, {32126, 290}, {32131, 289}, {32136, 289}, {32142, 293}, + {32150, 289}, {32158, 293}, {32166, 295}, {32174, 291}, {32181, 297}, {32186, 291}, {32192, 288}, {32198, 289}, + {32203, 289}, {32209, 300}, {32215, 297}, {32220, 288}, {32225, 294}, {32230, 289}, {32235, 289}, {32241, 289}, + {32247, 289}, {32253, 288}, {32259, 290}, {32266, 290}, {32273, 294}, {32280, 291}, {32286, 290}, {32290, 289}, + {32294, 292}, {32297, 290}, {32301, 289}, {32306, 289}, {32309, 290}, {32312, 290}, {32316, 289}, {32319, 291}, + {32322, 290}, {32326, 289}, {32329, 289}, {32332, 289}, {32337, 288}, {32343, 291}, {32349, 292}, {32357, 295}, + {32365, 288}, {32374, 303}, {32382, 302}, {32389, 294}, {32396, 288}, {32403, 298}, {32411, 288}, {32419, 290}, + {32426, 295}, {32434, 308}, {32441, 304}, {32449, 291}, {32456, 293}, {32465, 289}, {32472, 288}, {32478, 288}, + {32481, 289}, {32484, 288}, {32486, 289}, {32489, 288}, {32491, 289}, {32494, 295}, {32497, 296}, {32499, 288}, + {32502, 288}, {32504, 289}, {32507, 291}, {32509, 289}, {32513, 291}, {32517, 291}, {32521, 289}, {32527, 290}, + {32533, 292}, {32540, 298}, {32547, 296}, {32554, 294}, {32562, 292}, {32568, 300}, {32574, 289}, {32580, 289}, + {32587, 289}, {32594, 288}, {32601, 292}, {32608, 290}, {32615, 297}, {32623, 293}, {32631, 304}, {32639, 290}, + {32643, 289}, {32647, 291}, {32651, 290}, {32655, 290}, {32659, 288}, {32663, 288}, {32666, 289}, {32670, 297}, + {32673, 288}, {32676, 290}, {32680, 290}, {32685, 295}, {32690, 289}, {32697, 308}, {32705, 289}, {32715, 316}, + {32724, 312}, {32732, 291}, {32741, 294}, {32750, 291}, {32756, 288}, {32761, 291}, {32766, 292}, {32772, 290}, + {32777, 290}, {32782, 289}, {32788, 293}, {32794, 290}, {32799, 292}, {32804, 289}, {32808, 294}, {32811, 288}, + {32814, 290}, {32817, 293}, {32820, 293}, {32823, 288}, {32826, 289}, {32829, 290}, {32832, 292}, {32835, 291}, + {32838, 289}, {32843, 289}, {32847, 291}, {32852, 293}, {32858, 293}, {32865, 304}, {32870, 294}, {32877, 299}, + {32884, 294}, {32891, 288}, {32899, 294}, {32907, 289}, {32914, 226}, {32921, 297}, {32928, 292}, {32934, 291}, + {32940, 298}, {32945, 288}, {32951, 288}, {32955, 288}, {32959, 289}, {32962, 290}, {32965, 288}, {32968, 288}, + {32970, 291}, {32973, 289}, {32976, 292}, {32979, 289}, {32982, 294}, {32985, 289}, {32988, 291}, {32992, 291}, + {32996, 288}, {33001, 288}, {33006, 290}, {33013, 289}, {33020, 294}, {33026, 293}, {33032, 296}, {33039, 302}, + {33045, 288}, {33051, 300}, {33057, 300}, {33064, 300}, {33070, 289}, {33075, 288}, {33080, 291}, {33085, 288}, + {33090, 290}, {33094, 288}, {33099, 290}, {33104, 289}, {33108, 290}, {33112, 288}, {33115, 288}, {33120, 289}, + {33124, 289}, {33128, 290}, {33134, 288}, {33142, 289}, {33150, 316}, {33157, 289}, {33164, 302}, {33169, 307}, + {33175, 289}, {33182, 303}, {33187, 289}, {33189, 290}, {33191, 290}, {33194, 289}, {33197, 288}, {33201, 288}, + {33204, 299}, {33208, 289}, {33211, 288}, {33214, 290}, {33218, 289}, {33223, 291}, {33229, 305}, {33237, 288}, + {33246, 296}, {33253, 290}, {33262, 302}, {33272, 288}, {33279, 300}, {33286, 320}, {33293, 294}, {33296, 289}, + {33300, 288}, {33303, 291}, {33306, 289}, {33310, 288}, {33313, 289}, {33317, 293}, {33319, 290}, {33323, 288}, + {33327, 290}, {33331, 294}, {33336, 292}, {33344, 309}, {33354, 303}, {33362, 289}, {33369, 293}, {33375, 291}, + {33383, 320}, {33390, 288}, {33392, 289}, {33395, 291}, {33397, 290}, {33400, 288}, {33402, 289}, {33407, 293}, + {33412, 289}, {33417, 288}, {33422, 289}, {33427, 293}, {33431, 288}, {33438, 292}, {33448, 320}, {33456, 300}, + {33464, 292}, {33470, 290}, {33476, 302}, {33483, 291}, {33487, 288}, {33490, 289}, {33492, 290}, {33495, 289}, + {33497, 290}, {33499, 290}, {33501, 291}, {33504, 288}, {33507, 288}, {33511, 291}, {33516, 293}, {33521, 297}, + {33528, 289}, {33539, 313}, {33550, 305}, {33556, 304}, {33562, 301}, {33571, 312}, {33575, 288}, {33578, 289}, + {33583, 288}, {33587, 291}, {33590, 290}, {33594, 289}, {33597, 288}, {33601, 288}, {33605, 292}, {33609, 290}, + {33613, 290}, {33619, 292}, {33631, 320}, {33640, 289}, {33647, 298}, {33654, 308}, {33662, 296}, {33668, 288}, + {33670, 290}, {33672, 294}, {33675, 289}, {33677, 290}, {33680, 288}, {33682, 290}, {33684, 289}, {33687, 290}, + {33691, 288}, {33697, 294}, {33704, 294}, {33715, 291}, {33725, 303}, {33734, 291}, {33739, 292}, {33743, 291}, + {33749, 301}, {33756, 290}, {33760, 291}, {33763, 288}, {33767, 288}, {33771, 289}, {33775, 291}, {33778, 258}, + {33781, 288}, {33784, 288}, {33788, 290}, {33791, 290}, {33795, 289}, {33799, 290}, {33804, 291}, {33812, 289}, + {33822, 297}, {33832, 320}, {33838, 291}, {33844, 291}, {33853, 297}, {33859, 289}, {33862, 288}, {33865, 289}, + {33869, 290}, {33872, 290}, {33875, 288}, {33878, 288}, {33881, 288}, {33884, 288}, {33887, 288}, {33891, 290}, + {33894, 293}, {33898, 291}, {33902, 288}, {33906, 297}, {33915, 320}, {33924, 320}, {33932, 295}, {33938, 292}, + {33947, 294}, {33954, 289}, {33961, 291}, {33967, 302}, {33971, 289}, {33974, 288}, {33978, 289}, {33981, 289}, + {33984, 288}, {33988, 296}, {33991, 289}, {33994, 292}, {33998, 290}, {34000, 290}, {34003, 289}, {34007, 290}, + {34011, 293}, {34016, 290}, {34021, 289}, {34028, 292}, {34036, 290}, {34044, 306}, {34052, 289}, {34060, 295}, + {34067, 288}, {34073, 297}, {34081, 289}, {34083, 288}, {34085, 288}, {34088, 288}, {34091, 290}, {34094, 291}, + {34097, 288}, {34100, 290}, {34102, 289}, {34105, 292}, {34107, 288}, {34110, 290}, {34113, 289}, {34116, 291}, + {34119, 289}, {34123, 288}, {34127, 288}, {34131, 289}, {34135, 290}, {34141, 289}, {34149, 300}, {34161, 320}, + {34171, 304}, {34177, 288}, {34184, 300}, {34191, 288}, {34193, 292}, {34196, 288}, {34198, 289}, {34199, 288}, + {34202, 288}, {34203, 291}, {34206, 291}, {34209, 289}, {34212, 289}, {34216, 289}, {34219, 291}, {34223, 288}, + {34226, 288}, {34230, 291}, {34236, 289}, {34241, 289}, {34246, 289}, {34253, 320}, {34263, 320}, {34272, 313}, + {34279, 298}, {34285, 291}, {34291, 292}, {34297, 294}, {34302, 288}, {34305, 290}, {34307, 289}, {34309, 288}, + {34313, 289}, {34316, 289}, {34319, 291}, {34323, 289}, {34327, 288}, {34331, 288}, {34335, 289}, {34338, 290}, + {34342, 288}, {34346, 289}, {34351, 288}, {34354, 289}, {34359, 291}, {34362, 289}, {34366, 292}, {34375, 315}, + {34384, 303}, {34393, 293}, {34399, 296}, {34406, 297}, {34415, 307}, {34417, 290}, {34419, 291}, {34421, 291}, + {34424, 289}, {34427, 288}, {34431, 288}, {34434, 289}, {34437, 289}, {34441, 290}, {34444, 289}, {34447, 292}, + {34449, 290}, {34452, 288}, {34455, 288}, {34458, 290}, {34460, 288}, {34464, 290}, {34467, 289}, {34471, 289}, + {34475, 291}, {34479, 288}, {34487, 320}, {34500, 320}, {34508, 288}, {34515, 302}, {34523, 304}, {34528, 289}, + {34530, 290}, {34532, 290}, {34533, 290}, {34537, 292}, {34541, 288}, {34545, 291}, {34548, 292}, {34552, 290}, + {34555, 290}, {34558, 288}, {34561, 289}, {34564, 290}, {34566, 288}, {34569, 288}, {34573, 288}, {34576, 290}, + {34580, 291}, {34583, 266}, {34587, 292}, {34593, 289}, {34602, 288}, {34612, 307}, {34618, 296}, {34625, 311}, + {34632, 310}, {34640, 289}, {34643, 291}, {34648, 290}, {34652, 288}, {34655, 289}, {34659, 289}, {34663, 288}, + {34666, 294}, {34669, 291}, {34672, 288}, {34675, 289}, {34677, 290}, {34680, 288}, {34683, 288}, {34686, 289}, + {34689, 290}, {34692, 290}, {34695, 291}, {34699, 288}, {34703, 290}, {34706, 291}, {34713, 295}, {34723, 320}, + {34734, 299}, {34740, 293}, {34746, 297}, {34754, 291}, {34758, 288}, {34762, 289}, {34765, 288}, {34769, 288}, + {34772, 290}, {34776, 288}, {34779, 294}, {34782, 288}, {34785, 289}, {34788, 290}, {34791, 293}, {34793, 291}, + {34796, 289}, {34799, 289}, {34801, 288}, {34804, 290}, {34807, 288}, {34810, 291}, {34813, 290}, {34816, 288}, + {34819, 292}, {34823, 291}, {34826, 292}, {34831, 298}, {34838, 312}, {34849, 301}, {34857, 288}, {34864, 294}, + {34873, 290}, {34883, 298}, {34889, 292}, {34893, 292}, {34897, 288}, {34901, 290}, {34905, 293}, {34908, 290}, + {34911, 292}, {34915, 288}, {34917, 289}, {34920, 289}, {34923, 290}, {34925, 292}, {34928, 292}, {34931, 289}, + {34933, 292}, {34935, 289}, {34938, 289}, {34940, 291}, {34943, 289}, {34945, 288}, {34948, 290}, {34951, 289}, + {34954, 288}, {34957, 290}, {34961, 288}, {34965, 289}, {34971, 295}, {34977, 289}, {34982, 289}, {34993, 320}, + {35003, 301}, {35012, 293}, {35020, 292}, {35028, 291}, {35034, 289}, {35036, 289}, {35040, 289}, {35042, 290}, + {35045, 289}, {35047, 288}, {35049, 293}, {35052, 290}, {35054, 290}, {35056, 294}, {35059, 290}, {35061, 289}, + {35063, 288}, {35065, 291}, {35068, 290}, {35070, 291}, {35072, 289}, {35074, 288}, {35077, 290}, {35079, 288}, + {35082, 290}, {35085, 288}, {35088, 288}, {35094, 289}, {35098, 290}, {35102, 290}, {35106, 289}, {35110, 289}, + {35115, 288}, {35119, 290}, {35124, 293}, {35130, 292}, {35135, 290}, {35143, 291}, {35156, 309}, {35163, 290}, + {35170, 315}, {35179, 301}, {35180, 290}, {35182, 290}, {35183, 288}, {35185, 289}, {35186, 291}, {35187, 288}, + {35189, 289}, {35191, 289}, {35193, 290}, {35196, 290}, {35198, 292}, {35200, 288}, {35203, 290}, {35206, 291}, + {35209, 294}, {35212, 289}, {35216, 292}, {35219, 290}, {35222, 288}, {35225, 290}, {35228, 288}, {35232, 290}, + {35236, 290}, {35240, 289}, {35244, 293}, {35247, 289}, {35251, 288}, {35255, 288}, {35259, 293}, {35263, 289}, + {35268, 289}, {35270, 289}, {35274, 291}, {35278, 288}, {35283, 291}, {35288, 288}, {35294, 295}, {35305, 320}, + {35312, 293}, {35318, 288}, {35324, 302}, {35330, 304}, {35334, 288}, {35336, 288}, {35337, 289}, {35340, 289}, + {35343, 289}, {35346, 288}, {35350, 289}, {35353, 290}, {35357, 292}, {35361, 289}, {35364, 290}, {35367, 289}, + {35371, 291}, {35374, 290}, {35378, 290}, {35381, 298}, {35384, 288}, {35388, 289}, {35390, 291}, {35393, 289}, + {35396, 289}, {35399, 289}, {35401, 288}, {35404, 280}, {35406, 289}, {35409, 292}, {35412, 289}, {35415, 295}, + {35418, 289}, {35421, 292}, {35423, 289}, {35427, 289}, {35429, 290}, {35432, 290}, {35435, 289}, {35437, 290}, + {35440, 288}, {35444, 289}, {35447, 288}, {35450, 303}, {35459, 291}, {35469, 290}, {35475, 308}, {35484, 294}, + {35493, 291}, {35500, 290}, {35504, 291}, {35507, 291}, {35510, 289}, {35513, 288}, {35516, 290}, {35519, 288}, + {35522, 288}, {35525, 289}, {35528, 288}, {35530, 288}, {35533, 289}, {35535, 288}, {35539, 289}, {35542, 293}, + {35545, 291}, {35547, 289}, {35549, 288}, {35551, 289}, {35554, 288}, {35556, 291}, {35557, 288}, {35559, 289}, + {35561, 290}, {35563, 289}, {35565, 288}, {35567, 288}, {35569, 288}, {35571, 289}, {35574, 292}, {35576, 289}, + {35578, 292}, {35580, 288}, {35583, 292}, {35585, 289}, {35588, 289}, {35592, 291}, {35595, 290}, {35598, 288}, + {35602, 288}, {35607, 292}, {35611, 290}, {35617, 288}, {35622, 291}, {35627, 289}, {35637, 303}, {35649, 320}, + {35657, 288}, {35665, 288}, {35675, 320}, {35684, 311}, {35691, 292}, {35693, 290}, {35695, 289}, {35697, 291}, + {35699, 290}, {35700, 290}, {35702, 291}, {35704, 288}, {35706, 288}, {35708, 288}, {35710, 289}, {35711, 290}, + {35713, 292}, {35715, 291}, {35717, 291}, {35719, 297}, {35720, 292}, {35722, 289}, {35724, 290}, {35726, 288}, + {35729, 289}, {35731, 295}, {35733, 295}, {35736, 290}, {35738, 292}, {35740, 293}, {35743, 295}, {35745, 293}, + {35748, 294}, {35751, 290}, {35753, 293}, {35757, 294}, {35760, 289}, {35764, 289}, {35766, 288}, {35769, 290}, + {35772, 289}, {35775, 290}, {35778, 289}, {35780, 289}, {35783, 288}, {35786, 289}, {35789, 291}, {35793, 289}, + {35796, 288}, {35799, 291}, {35802, 290}, {35805, 288}, {35808, 293}, {35812, 293}, {35815, 291}, {35818, 290}, + {35823, 291}, {35827, 290}, {35830, 288}, {35833, 291}, {35838, 293}, {35849, 290}, {35857, 313}, {35863, 291}, + {35870, 298}, {35877, 289}, {35878, 289}, {35879, 290}, {35880, 289}, {35882, 289}, {35882, 288}, {35883, 291}, + {35884, 290}, {35885, 294}, {35888, 289}, {35891, 288}, {35894, 294}, {35897, 288}, {35900, 289}, {35902, 292}, + {35905, 292}, {35908, 290}, {35910, 288}, {35913, 293}, {35916, 293}, {35918, 291}, {35921, 293}, {35924, 288}, + {35926, 293}, {35929, 290}, {35931, 289}, {35935, 291}, {35937, 288}, {35939, 292}, {35942, 288}, {35945, 288}, + {35947, 293}, {35950, 292}, {35954, 288}, {35956, 295}, {35958, 290}, {35961, 289}, {35964, 294}, {35966, 290}, + {35969, 290}, {35972, 293}, {35975, 289}, {35977, 289}, {35982, 291}, {35984, 291}, {35987, 290}, {35990, 288}, + {35993, 292}, {35996, 290}, {35998, 289}, {36001, 295}, {36004, 292}, {36007, 292}, {36010, 288}, {36012, 289}, + {36015, 291}, {36017, 290}, {36020, 291}, {36023, 288}, {36025, 294}, {36028, 289}, {36031, 288}, {36038, 290}, + {36048, 298}, {36054, 315}, {36063, 295}, {36073, 295}, {36084, 320}, {36092, 290}, {36095, 291}, {36098, 289}, + {36100, 288}, {36103, 290}, {36106, 294}, {36109, 295}, {36111, 288}, {36114, 289}, {36117, 290}, {36119, 290}, + {36121, 291}, {36124, 292}, {36126, 292}, {36129, 292}, {36131, 288}, {36134, 290}, {36136, 289}, {36139, 293}, + {36141, 288}, {36143, 288}, {36146, 290}, {36148, 289}, {36150, 291}, {36153, 289}, {36155, 293}, {36158, 290}, + {36160, 288}, {36162, 293}, {36165, 292}, {36166, 288}, {36168, 288}, {36170, 295}, {36172, 294}, {36175, 290}, + {36176, 291}, {36178, 288}, {36180, 289}, {36181, 289}, {36182, 289}, {36184, 292}, {36185, 290}, {36187, 292}, + {36189, 290}, {36190, 290}, {36192, 288}, {36194, 292}, {36195, 296}, {36197, 294}, {36199, 290}, {36201, 289}, + {36202, 290}, {36204, 293}, {36206, 290}, {36208, 290}, {36210, 288}, {36213, 291}, {36214, 129}, {36216, 290}, + {36218, 290}, {36222, 291}, {36225, 290}, {36229, 289}, {36233, 290}, {36238, 294}, {36242, 288}, {36246, 290}, + {36250, 290}, {36253, 289}, {36258, 288}, {36268, 320}, {36279, 296}, {36290, 301}, {36301, 304}, {36313, 296}, + {36323, 293}, {36326, 296}, {36328, 293}, {36330, 288}, {36332, 290}, {36335, 292}, {36337, 290}, {36340, 289}, + {36342, 288}, {36344, 291}, {36346, 293}, {36348, 290}, {36350, 289}, {36352, 289}, {36354, 296}, {36357, 289}, + {36359, 292}, {36360, 290}, {36362, 295}, {36363, 293}, {36365, 290}, {36366, 288}, {36367, 293}, {36369, 291}, + {36370, 293}, {36372, 289}, {36373, 294}, {36374, 288}, {36376, 290}, {36378, 288}, {36379, 292}, {36381, 290}, + {36382, 289}, {36383, 289}, {36385, 292}, {36386, 291}, {36388, 291}, {36389, 288}, {36390, 288}, {36392, 290}, + {36393, 292}, {36395, 289}, {36397, 288}, {36399, 288}, {36401, 290}, {36402, 289}, {36405, 290}, {36408, 292}, + {36410, 291}, {36414, 288}, {36417, 290}, {36419, 289}, {36423, 288}, {36425, 288}, {36428, 291}, {36431, 288}, + {36434, 293}, {36436, 294}, {36439, 289}, {36441, 288}, {36445, 289}, {36447, 288}, {36450, 294}, {36452, 293}, + {36456, 289}, {36458, 289}, {36461, 291}, {36464, 288}, {36466, 288}, {36469, 291}, {36472, 288}, {36476, 288}, + {36478, 291}, {36482, 290}, {36485, 288}, {36488, 291}, {36491, 289}, {36494, 289}, {36497, 291}, {36501, 290}, + {36504, 290}, {36508, 289}, {36515, 320}, {36527, 309}, {36538, 291}, {36547, 297}, {36556, 300}, {36560, 290}, + {36561, 288}, {36562, 289}, {36564, 288}, {36566, 289}, {36567, 293}, {36569, 289}, {36570, 297}, {36572, 293}, + {36574, 288}, {36575, 294}, {36577, 294}, {36578, 289}, {36580, 288}, {36581, 296}, {36583, 291}, {36584, 295}, + {36585, 290}, {36587, 292}, {36589, 295}, {36590, 297}, {36592, 289}, {36593, 292}, {36595, 292}, {36598, 295}, + {36599, 293}, {36601, 293}, {36603, 290}, {36605, 291}, {36607, 288}, {36609, 289}, {36611, 294}, {36613, 288}, + {36616, 293}, {36618, 291}, {36620, 291}, {36622, 290}, {36624, 290}, {36626, 291}, {36630, 291}, {36632, 288}, + {36634, 291}, {36636, 288}, {36639, 290}, {36641, 291}, {36644, 292}, {36646, 289}, {36648, 289}, {36651, 291}, + {36653, 292}, {36656, 289}, {36658, 294}, {36661, 288}, {36663, 292}, {36666, 290}, {36668, 293}, {36670, 294}, + {36673, 291}, {36676, 291}, {36678, 294}, {36681, 292}, {36684, 292}, {36686, 289}, {36689, 288}, {36692, 292}, + {36694, 289}, {36697, 289}, {36700, 294}, {36702, 290}, {36705, 289}, {36708, 295}, {36710, 295}, {36713, 291}, + {36716, 290}, {36719, 294}, {36722, 288}, {36725, 291}, {36727, 288}, {36730, 288}, {36734, 293}, {36737, 289}, + {36741, 290}, {36744, 288}, {36747, 289}, {36750, 289}, {36752, 289}, {36757, 289}, {36761, 288}, {36765, 289}, + {36771, 314}, {36780, 320}, {36785, 299}, {36790, 294}, {36796, 290}, {36805, 310}, {36807, 289}, {36810, 293}, + {36813, 291}, {36816, 294}, {36819, 292}, {36823, 292}, {36827, 289}, {36829, 292}, {36833, 292}, {36836, 292}, + {36840, 290}, {36843, 290}, {36847, 289}, {36850, 293}, {36853, 290}, {36857, 299}, {36860, 292}, {36863, 289}, + {36867, 290}, {36870, 292}, {36873, 295}, {36876, 293}, {36879, 290}, {36881, 293}, {36884, 288}, {36887, 288}, + {36890, 289}, {36893, 289}, {36896, 293}, {36899, 291}, {36901, 289}, {36904, 292}, {36907, 288}, {36909, 288}, + {36912, 295}, {36914, 292}, {36917, 293}, {36920, 291}, {36923, 292}, {36926, 288}, {36928, 288}, {36931, 289}, + {36934, 296}, {36937, 291}, {36939, 291}, {36942, 289}, {36945, 289}, {36948, 290}, {36951, 294}, {36953, 289}, + {36956, 288}, {36959, 289}, {36961, 289}, {36964, 292}, {36967, 297}, {36969, 289}, {36972, 290}, {36977, 288}, + {36979, 291}, {36982, 289}, {36985, 294}, {36987, 288}, {36989, 288}, {36991, 288}, {36993, 294}, {36995, 292}, + {36997, 293}, {36999, 290}, {37001, 290}, {37004, 289}, {37006, 290}, {37008, 290}, {37009, 293}, {37012, 292}, + {37014, 290}, {37017, 289}, {37019, 290}, {37022, 295}, {37033, 288}, {37041, 290}, {37053, 289}, {37066, 293}, + {37069, 290}, {37071, 291}, {37074, 289}, {37076, 290}, {37079, 295}, {37080, 291}, {37083, 290}, {37087, 293}, + {37089, 290}, {37091, 290}, {37094, 289}, {37096, 289}, {37099, 295}, {37101, 290}, {37104, 290}, {37106, 288}, + {37108, 288}, {37111, 295}, {37113, 288}, {37116, 294}, {37118, 288}, {37121, 289}, {37123, 289}, {37125, 288}, + {37128, 288}, {37131, 294}, {37133, 294}, {37135, 288}, {37137, 290}, {37140, 288}, {37142, 290}, {37143, 153}, + {37146, 290}, {37148, 288}, {37150, 296}, {37152, 293}, {37155, 290}, {37157, 290}, {37159, 288}, {37162, 288}, + {37165, 288}, {37167, 295}, {37169, 291}, {37171, 293}, {37174, 290}, {37176, 288}, {37178, 288}, {37181, 294}, + {37183, 289}, {37185, 297}, {37187, 292}, {37189, 288}, {37192, 294}, {37194, 288}, {37198, 293}, {37201, 296}, + {37203, 290}, {37205, 288}, {37207, 294}, {37208, 292}, {37210, 288}, {37213, 290}, {37215, 288}, {37217, 293}, + {37219, 295}, {37221, 288}, {37223, 289}, {37225, 290}, {37226, 288}, {37228, 294}, {37229, 291}, {37230, 292}, + {37232, 292}, {37233, 290}, {37235, 291}, {37236, 289}, {37238, 291}, {37239, 292}, {37240, 288}, {37242, 291}, + {37243, 292}, {37245, 291}, {37247, 292}, {37248, 290}, {37250, 291}, {37251, 294}, {37253, 290}, {37255, 292}, + {37257, 289}, {37258, 289}, {37261, 288}, {37263, 290}, {37265, 291}, {37268, 290}, {37271, 292}, {37279, 288}, + {37282, 291}, {37285, 290}, {37290, 289}, {37294, 290}, {37303, 299}, {37310, 294}, {37323, 298}, {37337, 298}, + {37351, 320}, {37356, 294}, {37358, 288}, {37361, 293}, {37363, 293}, {37366, 293}, {37368, 297}, {37370, 288}, + {37373, 288}, {37375, 296}, {37377, 288}, {37380, 294}, {37382, 291}, {37384, 289}, {37386, 291}, {37390, 290}, + {37393, 291}, {37395, 291}, {37397, 288}, {37399, 293}, {37402, 295}, {37406, 292}, {37409, 290}, {37414, 300}, + {37417, 298}, {37421, 296}, {37423, 289}, {37427, 291}, {37430, 292}, {37434, 292}, {37437, 295}, {37441, 295}, + {37445, 290}, {37448, 290}, {37450, 295}, {37454, 290}, {37457, 294}, {37461, 291}, {37464, 288}, {37467, 288}, + {37470, 295}, {37473, 296}, {37475, 291}, {37477, 292}, {37479, 288}, {37481, 290}, {37482, 290}, {37483, 296}, + {37485, 291}, {37486, 290}, {37487, 294}, {37489, 288}, {37490, 291}, {37492, 290}, {37493, 291}, {37494, 295}, + {37495, 292}, {37497, 291}, {37498, 291}, {37500, 292}, {37502, 294}, {37503, 289}, {37505, 290}, {37508, 291}, + {37511, 294}, {37514, 289}, {37516, 291}, {37519, 292}, {37522, 290}, {37525, 294}, {37528, 292}, {37530, 289}, + {37533, 292}, {37535, 295}, {37539, 291}, {37541, 291}, {37545, 288}, {37548, 297}, {37552, 293}, {37555, 288}, + {37558, 293}, {37561, 289}, {37564, 289}, {37568, 288}, {37571, 289}, {37576, 289}, {37580, 291}, {37589, 292}, + {37600, 297}, {37615, 305}, {37623, 289}, {37625, 294}, {37628, 288}, {37631, 293}, {37634, 294}, {37637, 295}, + {37640, 294}, {37642, 290}, {37645, 288}, {37648, 289}, {37651, 292}, {37653, 294}, {37656, 288}, {37659, 291}, + {37662, 292}, {37666, 290}, {37668, 297}, {37671, 289}, {37674, 295}, {37677, 289}, {37680, 289}, {37682, 288}, + {37685, 297}, {37687, 289}, {37690, 290}, {37693, 289}, {37696, 291}, {37698, 288}, {37702, 298}, {37704, 288}, + {37707, 289}, {37710, 292}, {37712, 289}, {37715, 292}, {37718, 291}, {37722, 292}, {37724, 289}, {37727, 290}, + {37730, 290}, {37732, 291}, {37735, 292}, {37737, 293}, {37739, 291}, {37740, 297}, {37742, 291}, {37744, 293}, + {37745, 288}, {37748, 288}, {37749, 289}, {37751, 288}, {37753, 288}, {37755, 288}, {37756, 288}, {37758, 289}, + {37760, 291}, {37762, 290}, {37763, 289}, {37765, 291}, {37767, 291}, {37769, 288}, {37772, 288}, {37775, 289}, + {37778, 289}, {37781, 290}, {37785, 289}, {37790, 289}, {37796, 291}, {37800, 288}, {37804, 289}, {37808, 293}, + {37811, 290}, {37815, 293}, {37818, 288}, {37821, 288}, {37825, 294}, {37829, 289}, {37835, 290}, {37839, 288}, + {37844, 293}, {37848, 296}, {37858, 288}, {37864, 293}, {37876, 305}, {37892, 290}, {37905, 291}, {37909, 288}, + {37911, 291}, {37914, 288}, {37916, 288}, {37919, 295}, {37921, 291}, {37924, 290}, {37926, 293}, {37930, 289}, + {37932, 296}, {37934, 293}, {37937, 288}, {37939, 289}, {37943, 288}, {37945, 290}, {37947, 291}, {37950, 290}, + {37952, 299}, {37954, 291}, {37957, 290}, {37960, 294}, {37962, 289}, {37964, 293}, {37966, 288}, {37967, 289}, + {37971, 293}, {37972, 291}, {37973, 289}, {37974, 290}, {37976, 290}, {37977, 290}, {37978, 291}, {37980, 291}, + {37981, 291}, {37983, 289}, {37984, 292}, {37985, 290}, {37986, 288}, {37987, 292}, {37988, 291}, {37989, 291}, + {37990, 289}, {37991, 299}, {37992, 292}, {37993, 293}, {37994, 293}, {37995, 294}, {37996, 292}, {37996, 289}, + {37998, 291}, {37999, 289}, {38000, 289}, {38002, 294}, {38004, 292}, {38007, 295}, {38009, 295}, {38012, 291}, + {38014, 291}, {38016, 289}, {38019, 288}, {38021, 290}, {38023, 293}, {38026, 290}, {38028, 291}, {38030, 292}, + {38032, 290}, {38034, 295}, {38037, 288}, {38039, 297}, {38041, 289}, {38043, 295}, {38045, 294}, {38048, 294}, + {38050, 288}, {38054, 289}, {38057, 295}, {38059, 295}, {38061, 289}, {38064, 289}, {38067, 292}, {38069, 293}, + {38072, 289}, {38074, 288}, {38077, 289}, {38080, 288}, {38082, 291}, {38085, 289}, {38087, 120}, {38089, 289}, + {38091, 288}, {38094, 292}, {38097, 295}, {38100, 289}, {38103, 294}, {38106, 293}, {38110, 288}, {38113, 290}, + {38122, 288}, {38125, 293}, {38133, 289}, {38151, 320}, {38153, 296}, {38154, 292}, {38156, 292}, {38157, 289}, + {38159, 289}, {38162, 296}, {38166, 291}, {38169, 288}, {38172, 293}, {38174, 294}, {38177, 293}, {38179, 291}, + {38182, 288}, {38185, 295}, {38187, 289}, {38190, 293}, {38192, 288}, {38195, 290}, {38198, 294}, {38201, 290}, + {38202, 288}, {38205, 289}, {38207, 294}, {38209, 289}, {38212, 288}, {38214, 292}, {38217, 291}, {38219, 290}, + {38221, 291}, {38224, 291}, {38226, 294}, {38228, 289}, {38230, 290}, {38232, 291}, {38234, 291}, {38237, 288}, + {38239, 291}, {38240, 291}, {38242, 290}, {38243, 292}, {38245, 288}, {38247, 291}, {38248, 291}, {38249, 289}, + {38251, 289}, {38252, 290}, {38253, 288}, {38254, 292}, {38256, 290}, {38257, 293}, {38259, 289}, {38260, 292}, + {38261, 290}, {38263, 290}, {38264, 289}, {38266, 295}, {38267, 288}, {38269, 292}, {38271, 293}, {38272, 289}, + {38274, 288}, {38277, 288}, {38280, 293}, {38283, 290}, {38286, 290}, {38289, 288}, {38292, 288}, {38295, 291}, + {38297, 288}, {38301, 289}, {38304, 295}, {38308, 290}, {38313, 290}, {38317, 289}, {38322, 294}, {38327, 291}, + {38333, 289}, {38341, 292}, {38346, 288}, {38357, 313}, {38375, 305}, {38377, 290}, {38381, 291}, {38386, 293}, + {38389, 292}, {38393, 294}, {38395, 289}, {38398, 292}, {38402, 289}, {38406, 294}, {38409, 288}, {38413, 288}, + {38417, 289}, {38420, 289}, {38424, 294}, {38427, 291}, {38431, 292}, {38435, 297}, {38438, 288}, {38442, 290}, + {38447, 289}, {38451, 293}, {38455, 294}, {38458, 301}, {38462, 291}, {38465, 290}, {38469, 294}, {38472, 292}, + {38476, 289}, {38479, 293}, {38482, 292}, {38484, 291}, {38486, 291}, {38489, 292}, {38490, 291}, {38492, 294}, + {38494, 293}, {38496, 292}, {38497, 290}, {38499, 290}, {38501, 294}, {38502, 290}, {38503, 292}, {38505, 294}, + {38508, 289}, {38510, 294}, {38513, 290}, {38516, 289}, {38519, 292}, {38521, 293}, {38524, 288}, {38527, 299}, + {38530, 290}, {38532, 293}, {38535, 290}, {38537, 295}, {38540, 293}, {38543, 288}, {38545, 289}, {38548, 288}, + {38551, 290}, {38553, 291}, {38556, 294}, {38559, 288}, {38561, 289}, {38565, 292}, {38568, 292}, {38571, 290}, + {38574, 294}, {38577, 292}, {38580, 290}, {38583, 291}, {38586, 289}, {38588, 288}, {38592, 293}, {38595, 295}, + {38599, 290}, {38602, 288}, {38607, 288}, {38611, 292}, {38619, 296}, {38622, 289}, {38626, 293}, {38636, 320}, + {38652, 295}, {38654, 295}, {38655, 293}, {38657, 291}, {38660, 288}, {38662, 290}, {38664, 294}, {38667, 288}, + {38669, 290}, {38671, 288}, {38673, 289}, {38675, 292}, {38678, 291}, {38681, 291}, {38684, 299}, {38686, 289}, + {38688, 288}, {38691, 291}, {38693, 292}, {38697, 293}, {38699, 288}, {38702, 288}, {38705, 294}, {38708, 297}, + {38711, 288}, {38713, 288}, {38718, 288}, {38720, 288}, {38723, 292}, {38726, 288}, {38728, 295}, {38730, 289}, + {38732, 293}, {38735, 290}, {38736, 288}, {38738, 288}, {38739, 294}, {38740, 291}, {38742, 289}, {38743, 293}, + {38745, 289}, {38746, 290}, {38747, 291}, {38749, 292}, {38750, 291}, {38752, 288}, {38755, 292}, {38758, 289}, + {38761, 291}, {38764, 288}, {38766, 293}, {38769, 290}, {38773, 288}, {38776, 291}, {38778, 293}, {38782, 291}, + {38784, 294}, {38787, 288}, {38790, 288}, {38793, 292}, {38796, 296}, {38799, 295}, {38802, 289}, {38805, 289}, + {38808, 289}, {38811, 289}, {38814, 297}, {38817, 291}, {38820, 294}, {38824, 290}, {38828, 291}, {38831, 288}, + {38834, 288}, {38838, 291}, {38841, 296}, {38843, 291}, {38846, 289}, {38849, 288}, {38853, 288}, {38856, 291}, + {38859, 300}, {38863, 291}, {38868, 295}, {38872, 289}, {38876, 292}, {38885, 292}, {38890, 291}, {38893, 288}, + {38897, 288}, {38904, 291}, {38922, 300}, {38924, 298}, {38925, 295}, {38926, 294}, {38927, 292}, {38929, 288}, + {38931, 298}, {38933, 293}, {38935, 290}, {38939, 289}, {38942, 290}, {38943, 292}, {38946, 292}, {38948, 289}, + {38950, 289}, {38952, 291}, {38954, 295}, {38957, 291}, {38959, 293}, {38962, 289}, {38964, 293}, {38966, 288}, + {38969, 290}, {38971, 288}, {38973, 289}, {38976, 295}, {38978, 288}, {38980, 289}, {38982, 288}, {38983, 288}, + {38985, 289}, {38987, 297}, {38989, 290}, {38991, 296}, {38992, 213}, {38993, 294}, {38995, 290}, {38996, 288}, + {38998, 290}, {38999, 292}, {39000, 291}, {39001, 290}, {39003, 289}, {39004, 288}, {39005, 289}, {39006, 288}, + {39008, 293}, {39011, 288}, {39013, 290}, {39016, 294}, {39018, 294}, {39021, 293}, {39023, 292}, {39025, 290}, + {39028, 288}, {39030, 289}, {39033, 288}, {39035, 292}, {39037, 293}, {39040, 289}, {39042, 296}, {39045, 289}, + {39049, 291}, {39051, 289}, {39054, 295}, {39057, 290}, {39059, 300}, {39062, 288}, {39064, 296}, {39067, 290}, + {39069, 290}, {39072, 288}, {39074, 292}, {39078, 290}, {39081, 292}, {39083, 294}, {39086, 291}, {39089, 292}, + {39092, 293}, {39094, 291}, {39097, 298}, {39100, 288}, {39103, 290}, {39106, 288}, {39108, 289}, {39111, 289}, + {39114, 295}, {39117, 292}, {39121, 292}, {39125, 292}, {39128, 293}, {39131, 289}, {39136, 288}, {39141, 291}, + {39145, 290}, {39148, 289}, {39152, 288}, {39161, 293}, {39177, 292}, {39178, 289}, {39179, 288}, {39181, 289}, + {39182, 288}, {39184, 289}, {39186, 292}, {39189, 289}, {39191, 290}, {39194, 293}, {39200, 290}, {39203, 290}, + {39206, 289}, {39208, 288}, {39212, 290}, {39215, 290}, {39218, 288}, {39221, 288}, {39225, 288}, {39227, 288}, + {39230, 290}, {39233, 293}, {39236, 291}, {39239, 290}, {39241, 292}, {39243, 288}, {39246, 288}, {39249, 290}, + {39252, 295}, {39254, 288}, {39255, 289}, {39257, 296}, {39258, 292}, {39260, 288}, {39261, 293}, {39263, 288}, + {39264, 288}, {39267, 290}, {39270, 290}, {39273, 293}, {39275, 288}, {39278, 288}, {39280, 304}, {39283, 288}, + {39286, 299}, {39289, 291}, {39293, 289}, {39295, 288}, {39299, 290}, {39302, 290}, {39305, 292}, {39309, 288}, + {39312, 296}, {39315, 293}, {39318, 289}, {39322, 293}, {39325, 288}, {39328, 288}, {39331, 291}, {39334, 294}, + {39338, 290}, {39341, 293}, {39345, 293}, {39348, 292}, {39351, 289}, {39354, 289}, {39358, 293}, {39361, 293}, + {39364, 289}, {39368, 289}, {39371, 292}, {39374, 290}, {39378, 288}, {39381, 290}, {39385, 294}, {39388, 296}, + {39392, 290}, {39396, 291}, {39400, 291}, {39405, 289}, {39410, 294}, {39416, 295}, {39422, 289}, {39426, 295}, + {39430, 288}, {39437, 313}, {39456, 291}, {39457, 291}, {39459, 288}, {39461, 295}, {39464, 288}, {39466, 291}, + {39469, 289}, {39472, 300}, {39474, 288}, {39476, 289}, {39479, 289}, {39480, 291}, {39482, 290}, {39485, 289}, + {39488, 292}, {39490, 293}, {39492, 290}, {39493, 291}, {39495, 289}, {39497, 296}, {39498, 291}, {39500, 294}, + {39501, 294}, {39503, 292}, {39505, 289}, {39508, 288}, {39511, 290}, {39514, 290}, {39518, 292}, {39520, 291}, + {39524, 289}, {39527, 295}, {39531, 288}, {39533, 288}, {39535, 290}, {39538, 288}, {39540, 288}, {39543, 297}, + {39546, 288}, {39548, 290}, {39551, 297}, {39554, 296}, {39556, 292}, {39559, 290}, {39561, 294}, {39563, 296}, + {39566, 298}, {39568, 294}, {39570, 297}, {39573, 292}, {39575, 288}, {39578, 299}, {39581, 293}, {39583, 292}, + {39585, 288}, {39587, 298}, {39590, 296}, {39592, 288}, {39594, 291}, {39596, 289}, {39599, 293}, {39602, 289}, + {39605, 290}, {39609, 289}, {39611, 289}, {39615, 291}, {39618, 302}, {39621, 293}, {39624, 291}, {39627, 289}, + {39630, 292}, {39633, 299}, {39636, 294}, {39639, 295}, {39642, 288}, {39645, 288}, {39647, 297}, {39650, 291}, + {39652, 299}, {39655, 293}, {39658, 294}, {39660, 289}, {39663, 289}, {39666, 296}, {39669, 289}, {39672, 291}, + {39675, 288}, {39678, 288}, {39683, 289}, {39688, 289}, {39691, 289}, {39694, 293}, {39698, 289}, {39702, 288}, + {39714, 290}, {39728, 291}, {39729, 289}, {39731, 290}, {39732, 290}, {39734, 289}, {39736, 297}, {39738, 298}, + {39739, 289}, {39741, 295}, {39742, 293}, {39744, 291}, {39746, 288}, {39749, 292}, {39750, 291}, {39753, 297}, + {39754, 291}, {39756, 291}, {39758, 292}, {39760, 288}, {39762, 296}, {39764, 290}, {39766, 297}, {39768, 288}, + {39770, 295}, {39773, 291}, {39776, 288}, {39779, 290}, {39782, 288}, {39785, 290}, {39787, 288}, {39789, 291}, + {39792, 288}, {39795, 290}, {39798, 294}, {39800, 288}, {39803, 292}, {39805, 288}, {39808, 292}, {39810, 289}, + {39812, 288}, {39815, 289}, {39817, 304}, {39820, 288}, {39822, 291}, {39825, 293}, {39827, 289}, {39830, 289}, + {39831, 289}, {39834, 288}, {39837, 292}, {39839, 292}, {39842, 291}, {39845, 289}, {39847, 292}, {39849, 289}, + {39852, 297}, {39854, 294}, {39857, 290}, {39859, 293}, {39864, 294}, {39866, 289}, {39869, 295}, {39872, 291}, + {39875, 295}, {39877, 290}, {39880, 290}, {39883, 291}, {39886, 296}, {39888, 290}, {39891, 290}, {39893, 294}, + {39895, 290}, {39898, 291}, {39901, 292}, {39904, 295}, {39907, 292}, {39910, 293}, {39913, 290}, {39916, 288}, + {39919, 293}, {39921, 290}, {39925, 288}, {39929, 288}, {39932, 288}, {39936, 291}, {39940, 292}, {39943, 292}, + {39947, 289}, {39950, 273}, {39953, 292}, {39957, 292}, {39972, 314}, {39982, 291}, {39984, 290}, {39985, 295}, + {39987, 298}, {39988, 291}, {39990, 290}, {39992, 293}, {39994, 289}, {39996, 291}, {39997, 291}, {39999, 291}, + {40001, 292}, {40004, 289}, {40007, 290}, {40010, 291}, {40012, 289}, {40015, 289}, {40017, 289}, {40019, 289}, + {40021, 288}, {40023, 301}, {40025, 290}, {40027, 289}, {40030, 288}, {40032, 293}, {40034, 291}, {40036, 289}, + {40039, 292}, {40041, 289}, {40044, 292}, {40047, 291}, {40049, 289}, {40052, 290}, {40055, 292}, {40057, 290}, + {40060, 288}, {40063, 292}, {40066, 290}, {40069, 297}, {40071, 288}, {40074, 293}, {40076, 295}, {40079, 291}, + {40082, 291}, {40086, 290}, {40089, 290}, {40092, 296}, {40094, 288}, {40097, 290}, {40099, 290}, {40102, 291}, + {40105, 293}, {40108, 291}, {40111, 291}, {40114, 290}, {40117, 291}, {40120, 293}, {40123, 290}, {40125, 295}, + {40128, 288}, {40131, 289}, {40134, 295}, {40137, 291}, {40140, 289}, {40143, 288}, {40146, 288}, {40149, 292}, + {40152, 294}, {40155, 289}, {40158, 293}, {40161, 288}, {40166, 295}, {40171, 291}, {40176, 292}, {40180, 292}, + {40184, 289}, {40188, 290}, {40192, 290}, {40198, 292}, {40213, 304}, {40225, 290}, {40227, 293}, {40229, 290}, + {40231, 288}, {40233, 295}, {40235, 288}, {40238, 292}, {40242, 293}, {40245, 291}, {40247, 289}, {40249, 295}, + {40251, 290}, {40253, 297}, {40256, 289}, {40258, 292}, {40261, 289}, {40264, 288}, {40267, 289}, {40270, 292}, + {40274, 289}, {40277, 293}, {40281, 290}, {40285, 293}, {40288, 290}, {40291, 295}, {40294, 297}, {40297, 293}, + {40299, 289}, {40302, 293}, {40307, 291}, {40309, 293}, {40312, 297}, {40315, 292}, {40318, 290}, {40320, 289}, + {40323, 288}, {40326, 291}, {40329, 291}, {40332, 290}, {40335, 290}, {40337, 292}, {40340, 295}, {40343, 289}, + {40346, 291}, {40349, 288}, {40351, 294}, {40354, 298}, {40356, 290}, {40358, 289}, {40360, 289}, {40363, 293}, + {40365, 295}, {40367, 294}, {40369, 292}, {40372, 294}, {40373, 288}, {40376, 291}, {40378, 294}, {40380, 294}, + {40382, 294}, {40385, 297}, {40387, 294}, {40389, 299}, {40391, 289}, {40393, 292}, {40395, 288}, {40398, 289}, + {40400, 299}, {40402, 291}, {40405, 300}, {40408, 289}, {40410, 294}, {40413, 289}, {40417, 295}, {40419, 288}, + {40422, 291}, {40424, 291}, {40428, 289}, {40433, 292}, {40437, 291}, {40440, 288}, {40443, 290}, {40446, 294}, + {40449, 289}, {40453, 291}, {40456, 294}, {40465, 306}, {40481, 289}, {40486, 292}, {40488, 292}, {40490, 295}, + {40492, 295}, {40494, 293}, {40496, 291}, {40498, 288}, {40501, 292}, {40503, 293}, {40505, 293}, {40507, 292}, + {40509, 295}, {40511, 291}, {40514, 291}, {40516, 295}, {40518, 294}, {40520, 291}, {40523, 291}, {40525, 288}, + {40528, 288}, {40530, 291}, {40533, 294}, {40535, 288}, {40537, 290}, {40539, 292}, {40540, 292}, {40543, 291}, + {40545, 295}, {40548, 293}, {40550, 290}, {40553, 288}, {40555, 291}, {40558, 290}, {40560, 290}, {40564, 289}, + {40566, 293}, {40569, 289}, {40572, 292}, {40574, 292}, {40577, 293}, {40579, 288}, {40582, 288}, {40585, 288}, + {40587, 293}, {40591, 289}, {40593, 290}, {40596, 294}, {40599, 292}, {40601, 290}, {40604, 293}, {40607, 293}, + {40609, 291}, {40612, 291}, {40615, 297}, {40617, 288}, {40619, 288}, {40622, 290}, {40624, 289}, {40627, 289}, + {40630, 290}, {40633, 293}, {40637, 297}, {40640, 291}, {40642, 290}, {40645, 293}, {40648, 291}, {40650, 288}, + {40653, 292}, {40656, 291}, {40659, 297}, {40663, 290}, {40667, 291}, {40671, 288}, {40676, 295}, {40679, 288}, + {40681, 288}, {40684, 288}, {40687, 295}, {40691, 295}, {40694, 290}, {40700, 304}, {40716, 292}, {40724, 288}, + {40727, 296}, {40729, 290}, {40731, 288}, {40733, 291}, {40735, 289}, {40738, 293}, {40740, 290}, {40742, 288}, + {40744, 294}, {40746, 296}, {40749, 296}, {40751, 288}, {40753, 295}, {40756, 290}, {40758, 290}, {40760, 288}, + {40763, 290}, {40765, 292}, {40768, 295}, {40770, 294}, {40773, 291}, {40775, 290}, {40777, 293}, {40779, 291}, + {40781, 288}, {40783, 295}, {40785, 288}, {40787, 292}, {40789, 290}, {40791, 292}, {40793, 294}, {40795, 290}, + {40797, 291}, {40799, 292}, {40802, 294}, {40804, 293}, {40806, 289}, {40808, 290}, {40811, 293}, {40814, 289}, + {40816, 289}, {40819, 298}, {40821, 293}, {40824, 291}, {40826, 289}, {40828, 290}, {40831, 291}, {40834, 297}, + {40836, 289}, {40839, 294}, {40841, 289}, {40844, 292}, {40846, 292}, {40848, 288}, {40851, 291}, {40853, 292}, + {40856, 297}, {40859, 292}, {40861, 289}, {40864, 290}, {40866, 288}, {40869, 290}, {40871, 290}, {40874, 288}, + {40877, 295}, {40879, 290}, {40882, 285}, {40884, 288}, {40887, 291}, {40889, 289}, {40893, 294}, {40896, 288}, + {40900, 288}, {40904, 288}, {40908, 294}, {40911, 292}, {40914, 294}, {40917, 289}, {40920, 292}, {40923, 293}, + {40927, 289}, {40930, 288}, {40932, 291}, {40949, 295}, {40958, 295}, {40963, 295}, {40966, 290}, {40968, 291}, + {40970, 297}, {40972, 291}, {40974, 293}, {40976, 289}, {40978, 291}, {40980, 291}, {40983, 296}, {40985, 289}, + {40987, 290}, {40990, 289}, {40992, 288}, {40994, 293}, {40996, 296}, {40999, 289}, {41001, 289}, {41004, 292}, + {41006, 290}, {41009, 293}, {41012, 288}, {41016, 293}, {41018, 292}, {41021, 289}, {41024, 296}, {41027, 294}, + {41030, 296}, {41033, 288}, {41035, 290}, {41038, 288}, {41041, 292}, {41044, 297}, {41046, 291}, {41049, 289}, + {41051, 291}, {41054, 288}, {41057, 295}, {41060, 288}, {41062, 292}, {41065, 291}, {41067, 292}, {41070, 292}, + {41073, 289}, {41076, 288}, {41080, 296}, {41082, 300}, {41085, 290}, {41088, 296}, {41090, 290}, {41092, 293}, + {41095, 291}, {41097, 288}, {41100, 288}, {41102, 288}, {41110, 294}, {41112, 289}, {41114, 290}, {41117, 294}, + {41120, 291}, {41122, 289}, {41125, 296}, {41127, 293}, {41130, 292}, {41133, 289}, {41135, 300}, {41138, 290}, + {41140, 292}, {41142, 295}, {41145, 291}, {41147, 294}, {41151, 293}, {41154, 296}, {41158, 294}, {41163, 292}, + {41166, 292}, {41170, 289}, {41172, 291}, {41174, 292}, {41176, 291}, {41179, 291}, {41182, 288}, {41185, 292}, + {41188, 293}, {41190, 290}, {41193, 290}, {41211, 295}, {41220, 291}, {41227, 289}, {41231, 297}, {41233, 294}, + {41235, 290}, {41238, 296}, {41240, 297}, {41243, 290}, {41246, 292}, {41248, 289}, {41251, 292}, {41253, 290}, + {41256, 293}, {41259, 291}, {41262, 289}, {41265, 289}, {41269, 288}, {41273, 288}, {41276, 291}, {41280, 288}, + {41284, 292}, {41287, 297}, {41290, 288}, {41293, 289}, {41296, 291}, {41299, 290}, {41302, 296}, {41305, 291}, + {41308, 290}, {41311, 292}, {41314, 293}, {41317, 298}, {41319, 291}, {41321, 289}, {41323, 289}, {41326, 289}, + {41329, 297}, {41332, 295}, {41334, 290}, {41337, 293}, {41339, 288}, {41341, 288}, {41344, 298}, {41346, 288}, + {41349, 298}, {41351, 292}, {41353, 292}, {41355, 293}, {41357, 294}, {41360, 300}, {41362, 291}, {41364, 288}, + {41367, 294}, {41369, 288}, {41372, 291}, {41374, 292}, {41377, 299}, {41379, 300}, {41381, 294}, {41384, 294}, + {41386, 288}, {41389, 292}, {41391, 295}, {41393, 291}, {41395, 292}, {41397, 295}, {41399, 291}, {41402, 288}, + {41405, 294}, {41409, 296}, {41412, 294}, {41416, 291}, {41420, 298}, {41422, 291}, {41424, 288}, {41426, 291}, + {41428, 290}, {41430, 288}, {41433, 293}, {41436, 290}, {41438, 288}, {41444, 290}, {41458, 288}, {41467, 291}, + {41473, 288}, {41478, 289}, {41481, 290}, {41484, 291}, {41486, 294}, {41488, 289}, {41491, 292}, {41494, 297}, + {41496, 288}, {41499, 289}, {41501, 293}, {41504, 297}, {41507, 290}, {41510, 291}, {41512, 289}, {41515, 288}, + {41518, 288}, {41521, 293}, {41524, 291}, {41527, 292}, {41530, 294}, {41532, 288}, {41534, 291}, {41536, 293}, + {41539, 294}, {41541, 289}, {41544, 288}, {41546, 293}, {41549, 289}, {41551, 288}, {41553, 288}, {41555, 294}, + {41558, 289}, {41560, 289}, {41562, 292}, {41564, 293}, {41566, 290}, {41568, 289}, {41571, 289}, {41573, 293}, + {41575, 288}, {41578, 296}, {41580, 292}, {41582, 292}, {41585, 293}, {41587, 289}, {41589, 289}, {41592, 289}, + {41594, 288}, {41596, 295}, {41599, 289}, {41601, 299}, {41603, 288}, {41604, 295}, {41606, 294}, {41609, 293}, + {41611, 291}, {41613, 288}, {41615, 293}, {41617, 288}, {41619, 292}, {41621, 298}, {41623, 288}, {41626, 289}, + {41628, 289}, {41631, 290}, {41634, 290}, {41638, 290}, {41642, 289}, {41646, 289}, {41649, 298}, {41651, 295}, + {41654, 293}, {41656, 288}, {41659, 288}, {41662, 288}, {41664, 293}, {41667, 290}, {41673, 290}, {41687, 289}, + {41695, 288}, {41702, 291}, {41707, 293}, {41710, 291}, {41713, 288}, {41715, 293}, {41718, 288}, {41721, 289}, + {41724, 290}, {41726, 289}, {41729, 293}, {41731, 291}, {41734, 288}, {41737, 289}, {41740, 292}, {41743, 289}, + {41746, 289}, {41749, 294}, {41752, 289}, {41755, 290}, {41758, 289}, {41760, 289}, {41762, 290}, {41764, 290}, + {41767, 294}, {41769, 290}, {41771, 290}, {41774, 288}, {41776, 290}, {41778, 289}, {41780, 288}, {41783, 296}, + {41785, 288}, {41787, 288}, {41789, 295}, {41792, 290}, {41793, 289}, {41796, 289}, {41798, 290}, {41800, 298}, + {41802, 292}, {41804, 289}, {41806, 292}, {41808, 296}, {41810, 296}, {41813, 300}, {41815, 290}, {41816, 294}, + {41818, 292}, {41820, 291}, {41822, 291}, {41824, 167}, {41825, 290}, {41827, 289}, {41829, 290}, {41832, 295}, + {41834, 291}, {41836, 288}, {41838, 295}, {41840, 290}, {41842, 296}, {41844, 295}, {41846, 293}, {41848, 288}, + {41850, 292}, {41852, 289}, {41854, 290}, {41857, 288}, {41860, 294}, {41863, 288}, {41867, 288}, {41870, 288}, + {41875, 289}, {41877, 290}, {41879, 291}, {41882, 293}, {41884, 294}, {41887, 288}, {41889, 288}, {41892, 288}, + {41894, 291}, {41897, 292}, {41909, 288}, {41920, 292}, {41928, 290}, {41935, 289}, {41940, 291}, {41943, 289}, + {41946, 290}, {41949, 292}, {41951, 292}, {41953, 289}, {41956, 289}, {41958, 289}, {41961, 294}, {41964, 295}, + {41966, 291}, {41969, 290}, {41972, 288}, {41975, 291}, {41978, 288}, {41981, 288}, {41984, 292}, {41987, 290}, + {41990, 294}, {41992, 290}, {41995, 290}, {41997, 288}, {42000, 294}, {42002, 291}, {42004, 291}, {42007, 297}, + {42009, 292}, {42012, 288}, {42014, 291}, {42016, 293}, {42018, 290}, {42020, 296}, {42023, 300}, {42025, 293}, + {42027, 288}, {42029, 289}, {42031, 292}, {42033, 291}, {42035, 289}, {42038, 288}, {42040, 297}, {42042, 292}, + {42045, 290}, {42047, 288}, {42049, 291}, {42052, 288}, {42054, 293}, {42057, 288}, {42059, 290}, {42062, 288}, + {42064, 288}, {42067, 299}, {42069, 291}, {42071, 289}, {42073, 289}, {42075, 294}, {42077, 289}, {42079, 293}, + {42081, 288}, {42083, 291}, {42085, 291}, {42088, 290}, {42090, 288}, {42092, 291}, {42095, 288}, {42097, 293}, + {42100, 293}, {42105, 289}, {42108, 295}, {42111, 290}, {42114, 288}, {42119, 289}, {42121, 289}, {42123, 294}, + {42125, 289}, {42128, 292}, {42130, 296}, {42133, 293}, {42136, 290}, {42138, 290}, {42140, 288}, {42149, 297}, + {42160, 290}, {42169, 290}, {42176, 291}, {42182, 290}, {42187, 290}, {42190, 290}, {42193, 289}, {42195, 289}, + {42198, 290}, {42200, 295}, {42203, 291}, {42206, 291}, {42209, 290}, {42212, 293}, {42216, 290}, {42220, 290}, + {42223, 294}, {42227, 290}, {42232, 291}, {42236, 291}, {42240, 291}, {42243, 288}, {42247, 294}, {42250, 295}, + {42254, 288}, {42257, 296}, {42260, 293}, {42263, 291}, {42266, 290}, {42269, 289}, {42272, 290}, {42275, 292}, + {42277, 290}, {42280, 290}, {42284, 298}, {42286, 293}, {42289, 292}, {42292, 288}, {42294, 288}, {42297, 295}, + {42299, 291}, {42302, 291}, {42304, 292}, {42306, 290}, {42309, 292}, {42311, 290}, {42313, 295}, {42315, 298}, + {42318, 292}, {42320, 298}, {42323, 289}, {42327, 290}, {42329, 296}, {42332, 292}, {42334, 289}, {42337, 293}, + {42339, 290}, {42342, 293}, {42344, 297}, {42346, 297}, {42348, 296}, {42351, 290}, {42353, 289}, {42356, 288}, + {42359, 292}, {42362, 292}, {42366, 293}, {42369, 296}, {42374, 290}, {42377, 290}, {42379, 292}, {42382, 291}, + {42384, 288}, {42387, 290}, {42390, 296}, {42393, 294}, {42396, 290}, {42405, 289}, {42417, 293}, {42426, 292}, + {42434, 289}, {42441, 289}, {42446, 291}, {42450, 289}, {42453, 291}, {42455, 289}, {42458, 288}, {42461, 288}, + {42464, 297}, {42467, 288}, {42470, 291}, {42473, 291}, {42477, 289}, {42480, 293}, {42483, 290}, {42486, 291}, + {42489, 288}, {42492, 292}, {42495, 292}, {42498, 289}, {42501, 295}, {42503, 291}, {42505, 289}, {42508, 290}, + {42510, 294}, {42512, 290}, {42515, 289}, {42518, 292}, {42520, 288}, {42522, 288}, {42524, 289}, {42526, 289}, + {42529, 289}, {42531, 295}, {42533, 288}, {42535, 291}, {42538, 291}, {42540, 289}, {42542, 294}, {42544, 294}, + {42546, 289}, {42549, 291}, {42551, 291}, {42553, 293}, {42555, 291}, {42557, 293}, {42559, 294}, {42561, 289}, + {42563, 298}, {42565, 289}, {42567, 290}, {42570, 296}, {42572, 296}, {42574, 297}, {42576, 290}, {42578, 288}, + {42580, 288}, {42582, 290}, {42584, 292}, {42586, 296}, {42588, 290}, {42591, 293}, {42593, 296}, {42595, 292}, + {42598, 292}, {42600, 290}, {42603, 300}, {42606, 293}, {42608, 290}, {42611, 293}, {42615, 292}, {42618, 289}, + {42620, 291}, {42622, 291}, {42624, 291}, {42627, 293}, {42628, 289}, {42630, 288}, {42633, 294}, {42636, 291}, + {42638, 291}, {42640, 291}, {42652, 291}, {42661, 288}, {42670, 289}, {42678, 290}, {42683, 288}, {42688, 291}, + {42691, 288}, {42694, 289}, {42696, 289}, {42699, 290}, {42701, 292}, {42704, 290}, {42707, 295}, {42710, 289}, + {42712, 292}, {42715, 290}, {42719, 290}, {42722, 291}, {42725, 289}, {42728, 290}, {42731, 294}, {42732, 73}, + {42735, 288}, {42738, 290}, {42741, 289}, {42743, 288}, {42746, 292}, {42748, 290}, {42751, 290}, {42753, 290}, + {42755, 290}, {42758, 293}, {42760, 293}, {42762, 291}, {42764, 289}, {42766, 289}, {42769, 293}, {42771, 288}, + {42773, 289}, {42775, 296}, {42777, 297}, {42779, 294}, {42781, 292}, {42784, 292}, {42786, 289}, {42788, 288}, + {42790, 294}, {42792, 292}, {42793, 288}, {42795, 291}, {42797, 295}, {42799, 289}, {42801, 296}, {42803, 289}, + {42806, 294}, {42807, 289}, {42809, 292}, {42811, 290}, {42813, 293}, {42815, 292}, {42817, 290}, {42819, 293}, + {42821, 289}, {42823, 290}, {42825, 291}, {42827, 289}, {42829, 297}, {42831, 293}, {42833, 288}, {42835, 291}, + {42838, 289}, {42841, 291}, {42844, 291}, {42847, 290}, {42850, 290}, {42853, 290}, {42856, 292}, {42858, 290}, + {42860, 288}, {42862, 289}, {42864, 289}, {42866, 292}, {42869, 295}, {42871, 297}, {42874, 295}, {42876, 288}, + {42878, 289}, {42889, 297}, {42899, 289}, {42906, 288}, {42914, 288}, {42919, 290}, {42924, 292}, {42929, 288}, + {42932, 288}, {42934, 294}, {42937, 289}, {42940, 288}, {42942, 288}, {42945, 292}, {42947, 289}, {42950, 293}, + {42953, 289}, {42955, 289}, {42958, 292}, {42961, 291}, {42964, 288}, {42967, 289}, {42969, 289}, {42972, 289}, + {42975, 289}, {42978, 288}, {42981, 291}, {42983, 297}, {42986, 295}, {42988, 288}, {42991, 293}, {42993, 289}, + {42995, 292}, {42998, 291}, {43000, 290}, {43003, 289}, {43006, 292}, {43008, 289}, {43011, 291}, {43014, 292}, + {43021, 293}, {43024, 295}, {43027, 290}, {43029, 293}, {43031, 289}, {43034, 296}, {43036, 295}, {43038, 293}, + {43041, 290}, {43043, 288}, {43045, 288}, {43047, 289}, {43049, 296}, {43052, 297}, {43054, 301}, {43056, 296}, + {43058, 289}, {43060, 288}, {43062, 297}, {43064, 299}, {43066, 288}, {43068, 296}, {43069, 291}, {43071, 293}, + {43073, 289}, {43075, 290}, {43076, 288}, {43078, 291}, {43080, 291}, {43081, 290}, {43083, 298}, {43085, 288}, + {43087, 288}, {43088, 289}, {43090, 299}, {43092, 288}, {43094, 292}, {43096, 289}, {43099, 293}, {43102, 294}, + {43104, 295}, {43107, 292}, {43111, 288}, {43114, 290}, {43117, 288}, {43119, 299}, {43120, 294}, {43123, 296}, + {43125, 289}, {43127, 298}, {43129, 294}, {43131, 288}, {43133, 292}, {43135, 292}, {43137, 295}, {43145, 289}, + {43155, 288}, {43165, 288}, {43173, 289}, {43181, 290}, {43187, 288}, {43193, 292}, {43197, 289}, {43202, 293}, + {43206, 291}, {43209, 290}, {43213, 290}, {43216, 289}, {43220, 291}, {43224, 292}, {43228, 291}, {43232, 291}, + {43236, 290}, {43242, 290}, {43246, 288}, {43250, 290}, {43255, 288}, {43258, 288}, {43262, 289}, {43266, 292}, + {43269, 297}, {43272, 288}, {43274, 290}, {43277, 293}, {43280, 291}, {43283, 290}, {43286, 291}, {43290, 296}, + {43293, 290}, {43295, 290}, {43298, 291}, {43301, 295}, {43304, 295}, {43306, 290}, {43308, 291}, {43311, 290}, + {43313, 290}, {43315, 296}, {43318, 296}, {43320, 291}, {43322, 298}, {43324, 288}, {43326, 289}, {43329, 296}, + {43331, 289}, {43333, 289}, {43336, 292}, {43338, 295}, {43340, 288}, {43343, 295}, {43345, 298}, {43347, 293}, + {43349, 296}, {43351, 291}, {43353, 294}, {43356, 293}, {43358, 297}, {43360, 291}, {43362, 295}, {43364, 294}, + {43367, 298}, {43369, 290}, {43372, 288}, {43376, 290}, {43380, 292}, {43384, 292}, {43388, 289}, {43390, 290}, + {43393, 289}, {43395, 292}, {43397, 293}, {43400, 290}, {43402, 290}, {43404, 288}, {43406, 288}, {43409, 296}, + {43412, 290}, {43422, 288}, {43432, 288}, {43439, 288}, {43447, 291}, {43453, 289}, {43459, 291}, {43463, 289}, + {43467, 288}, {43470, 288}, {43473, 290}, {43475, 290}, {43478, 291}, {43481, 288}, {43483, 292}, {43486, 293}, + {43489, 289}, {43492, 289}, {43495, 295}, {43498, 291}, {43501, 288}, {43503, 288}, {43506, 290}, {43509, 288}, + {43513, 288}, {43515, 288}, {43519, 291}, {43521, 294}, {43523, 290}, {43526, 292}, {43528, 291}, {43531, 289}, + {43533, 290}, {43535, 289}, {43537, 293}, {43540, 288}, {43542, 294}, {43545, 296}, {43547, 293}, {43549, 291}, + {43551, 289}, {43554, 297}, {43556, 293}, {43558, 292}, {43561, 291}, {43562, 293}, {43565, 293}, {43567, 296}, + {43569, 302}, {43571, 293}, {43573, 288}, {43575, 296}, {43577, 295}, {43579, 290}, {43581, 298}, {43583, 293}, + {43585, 291}, {43587, 298}, {43589, 297}, {43591, 292}, {43593, 290}, {43595, 293}, {43597, 292}, {43599, 292}, + {43600, 294}, {43602, 290}, {43604, 301}, {43606, 293}, {43608, 293}, {43610, 291}, {43611, 238}, {43613, 291}, + {43615, 293}, {43617, 290}, {43619, 297}, {43621, 288}, {43624, 288}, {43626, 291}, {43629, 290}, {43632, 291}, + {43635, 289}, {43638, 293}, {43640, 289}, {43642, 290}, {43644, 290}, {43646, 291}, {43648, 291}, {43651, 292}, + {43653, 295}, {43656, 292}, {43658, 289}, {43660, 292}, {43668, 289}, {43675, 291}, {43684, 289}, {43690, 291}, + {43697, 292}, {43703, 290}, {43708, 288}, {43713, 290}, {43717, 290}, {43720, 289}, {43723, 291}, {43725, 290}, + {43728, 290}, {43730, 290}, {43733, 293}, {43736, 291}, {43738, 289}, {43741, 297}, {43744, 288}, {43746, 292}, + {43750, 290}, {43752, 288}, {43755, 292}, {43758, 292}, {43762, 291}, {43765, 288}, {43768, 293}, {43770, 288}, + {43773, 290}, {43775, 291}, {43777, 295}, {43779, 290}, {43782, 293}, {43784, 288}, {43786, 296}, {43788, 297}, + {43791, 291}, {43793, 288}, {43795, 293}, {43797, 288}, {43799, 288}, {43801, 292}, {43804, 290}, {43806, 288}, + {43808, 289}, {43810, 290}, {43812, 292}, {43814, 292}, {43816, 288}, {43818, 292}, {43820, 289}, {43822, 291}, + {43823, 293}, {43825, 292}, {43827, 292}, {43829, 291}, {43831, 290}, {43833, 294}, {43835, 288}, {43837, 289}, + {43839, 290}, {43841, 292}, {43843, 289}, {43844, 290}, {43846, 290}, {43848, 288}, {43850, 297}, {43852, 291}, + {43854, 289}, {43856, 292}, {43858, 292}, {43860, 289}, {43862, 290}, {43863, 291}, {43865, 289}, {43868, 289}, + {43870, 289}, {43873, 288}, {43875, 288}, {43878, 293}, {43881, 294}, {43884, 288}, {43887, 293}, {43889, 290}, + {43891, 290}, {43893, 295}, {43895, 291}, {43897, 289}, {43899, 295}, {43901, 292}, {43904, 295}, {43906, 292}, + {43908, 289}, {43915, 289}, {43924, 288}, {43933, 288}, {43941, 289}, {43950, 297}, {43957, 289}, {43963, 291}, + {43969, 293}, {43974, 288}, {43977, 289}, {43981, 289}, {43984, 290}, {43988, 289}, {43992, 292}, {43996, 291}, + {43999, 290}, {44004, 292}, {44009, 288}, {44013, 290}, {44019, 288}, {44024, 288}, {44029, 288}, {44033, 295}, + {44037, 296}, {44041, 291}, {44045, 293}, {44048, 288}, {44052, 300}, {44056, 292}, {44059, 289}, {44062, 292}, + {44065, 297}, {44068, 291}, {44070, 293}, {44072, 294}, {44075, 292}, {44077, 292}, {44080, 290}, {44082, 291}, + {44084, 289}, {44087, 291}, {44089, 292}, {44091, 288}, {44093, 296}, {44095, 291}, {44097, 293}, {44099, 293}, + {44101, 294}, {44103, 291}, {44105, 295}, {44108, 296}, {44110, 298}, {44112, 291}, {44114, 288}, {44116, 293}, + {44118, 290}, {44119, 297}, {44121, 292}, {44124, 288}, {44126, 299}, {44128, 294}, {44130, 291}, {44132, 295}, + {44135, 289}, {44137, 294}, {44140, 295}, {44142, 289}, {44145, 293}, {44149, 290}, {44152, 290}, {44155, 289}, + {44159, 291}, {44163, 293}, {44167, 293}, {44170, 291}, {44172, 294}, {44175, 291}, {44178, 288}, {44180, 289}, + {44183, 290}, {44186, 290}, {44189, 299}, {44192, 299}, {44197, 290}, {44206, 288}, {44216, 293}, {44224, 292}, + {44231, 289}, {44240, 288}, {44247, 288}, {44252, 290}, {44258, 290}, {44263, 289}, {44266, 288}, {44270, 293}, + {44273, 297}, {44276, 289}, {44279, 289}, {44283, 293}, {44286, 289}, {44289, 294}, {44293, 290}, {44296, 288}, + {44299, 288}, {44302, 295}, {44306, 290}, {44308, 289}, {44311, 292}, {44315, 294}, {44318, 288}, {44321, 289}, + {44324, 290}, {44326, 292}, {44329, 292}, {44331, 292}, {44333, 292}, {44336, 291}, {44338, 294}, {44340, 291}, + {44342, 289}, {44344, 292}, {44346, 290}, {44348, 290}, {44350, 290}, {44352, 291}, {44354, 289}, {44356, 291}, + {44358, 293}, {44360, 288}, {44361, 289}, {44364, 288}, {44365, 296}, {44367, 292}, {44369, 295}, {44371, 292}, + {44373, 288}, {44375, 292}, {44376, 293}, {44378, 295}, {44379, 291}, {44381, 289}, {44382, 293}, {44384, 288}, + {44386, 293}, {44387, 291}, {44389, 294}, {44391, 289}, {44392, 297}, {44394, 301}, {44396, 288}, {44397, 289}, + {44399, 288}, {44400, 290}, {44402, 290}, {44403, 294}, {44405, 295}, {44406, 290}, {44408, 289}, {44410, 290}, + {44411, 293}, {44413, 292}, {44414, 291}, {44416, 290}, {44417, 288}, {44418, 292}, {44420, 291}, {44422, 292}, + {44424, 293}, {44426, 294}, {44428, 288}, {44431, 294}, {44433, 289}, {44435, 289}, {44437, 290}, {44440, 289}, + {44443, 293}, {44444, 295}, {44446, 291}, {44447, 172}, {44449, 288}, {44450, 289}, {44452, 297}, {44454, 293}, + {44456, 289}, {44458, 289}, {44460, 290}, {44462, 295}, {44463, 296}, {44465, 296}, {44472, 288}, {44479, 290}, + {44487, 289}, {44493, 292}, {44499, 290}, {44505, 290}, {44511, 289}, {44517, 292}, {44522, 289}, {44526, 290}, + {44530, 294}, {44532, 288}, {44536, 290}, {44539, 288}, {44542, 288}, {44546, 293}, {44549, 290}, {44553, 288}, + {44556, 295}, {44559, 292}, {44563, 290}, {44566, 298}, {44571, 289}, {44574, 289}, {44578, 289}, {44582, 289}, + {44585, 292}, {44588, 290}, {44591, 290}, {44594, 291}, {44597, 290}, {44599, 289}, {44603, 294}, {44606, 288}, + {44609, 290}, {44613, 291}, {44616, 295}, {44619, 289}, {44622, 296}, {44624, 289}, {44627, 288}, {44629, 291}, + {44631, 290}, {44634, 295}, {44635, 289}, {44638, 291}, {44640, 293}, {44642, 288}, {44644, 301}, {44646, 298}, + {44649, 295}, {44650, 290}, {44652, 294}, {44654, 290}, {44656, 290}, {44658, 295}, {44660, 293}, {44661, 292}, + {44664, 291}, {44666, 294}, {44668, 288}, {44670, 288}, {44672, 289}, {44673, 289}, {44675, 290}, {44677, 291}, + {44679, 290}, {44682, 288}, {44685, 293}, {44687, 295}, {44689, 290}, {44692, 293}, {44694, 295}, {44697, 291}, + {44699, 292}, {44702, 289}, {44704, 290}, {44706, 289}, {44709, 290}, {44713, 296}, {44716, 288}, {44719, 290}, + {44722, 289}, {44726, 295}, {44731, 291}, {44734, 294}, {44737, 292}, {44739, 291}, {44742, 297}, {44745, 290}, + {44747, 293}, {44750, 291}, {44752, 290}, {44755, 288}, {44758, 292}, {44761, 296}, {44764, 290}, {44772, 289}, + {44782, 290}, {44795, 289}, {44805, 289}, {44815, 289}, {44823, 294}, {44830, 292}, {44836, 293}, {44841, 288}, + {44845, 294}, {44848, 293}, {44852, 292}, {44855, 288}, {44860, 299}, {44864, 288}, {44868, 291}, {44872, 288}, + {44876, 293}, {44879, 291}, {44881, 288}, {44884, 294}, {44886, 292}, {44889, 291}, {44892, 290}, {44894, 288}, + {44897, 290}, {44900, 292}, {44902, 290}, {44905, 289}, {44907, 288}, {44910, 297}, {44912, 289}, {44915, 292}, + {44917, 288}, {44920, 291}, {44922, 289}, {44924, 290}, {44926, 292}, {44929, 294}, {44931, 290}, {44933, 288}, + {44936, 292}, {44939, 289}, {44941, 294}, {44943, 290}, {44945, 289}, {44948, 292}, {44950, 293}, {44953, 295}, + {44954, 289}, {44957, 296}, {44959, 291}, {44961, 299}, {44964, 295}, {44965, 290}, {44967, 295}, {44969, 292}, + {44971, 294}, {44973, 290}, {44975, 288}, {44978, 289}, {44980, 290}, {44982, 299}, {44984, 288}, {44985, 288}, + {44987, 297}, {44989, 290}, {44991, 289}, {44993, 291}, {44995, 288}, {44997, 290}, {44999, 294}, {45001, 298}, + {45002, 295}, {45004, 296}, {45006, 291}, {45007, 288}, {45009, 291}, {45012, 300}, {45014, 300}, {45015, 295}, + {45017, 290}, {45019, 294}, {45021, 290}, {45024, 291}, {45030, 297}, {45032, 295}, {45034, 297}, {45037, 293}, + {45040, 292}, {45042, 292}, {45045, 289}, {45047, 289}, {45049, 300}, {45050, 290}, {45052, 290}, {45054, 294}, + {45056, 290}, {45057, 291}, {45059, 291}, {45061, 289}, {45063, 290}, {45066, 291}, {45067, 293}, {45069, 289}, + {45071, 296}, {45076, 288}, {45083, 290}, {45090, 289}, {45097, 288}, {45104, 288}, {45110, 288}, {45117, 288}, + {45123, 289}, {45127, 289}, {45132, 295}, {45136, 289}, {45141, 291}, {45143, 292}, {45146, 289}, {45149, 293}, + {45151, 288}, {45154, 288}, {45157, 288}, {45159, 289}, {45162, 291}, {45165, 294}, {45168, 292}, {45171, 288}, + {45174, 289}, {45176, 290}, {45179, 292}, {45182, 290}, {45185, 289}, {45188, 288}, {45190, 289}, {45192, 289}, + {45194, 292}, {45196, 296}, {45198, 296}, {45201, 289}, {45203, 292}, {45206, 293}, {45208, 291}, {45211, 294}, + {45213, 288}, {45216, 294}, {45218, 288}, {45221, 292}, {45223, 291}, {45225, 293}, {45227, 291}, {45229, 288}, + {45232, 289}, {45234, 289}, {45235, 291}, {45238, 288}, {45240, 294}, {45242, 293}, {45244, 290}, {45246, 301}, + {45248, 288}, {45250, 292}, {45252, 297}, {45254, 290}, {45256, 288}, {45258, 290}, {45260, 294}, {45261, 291}, + {45263, 289}, {45265, 288}, {45267, 294}, {45269, 289}, {45271, 304}, {45273, 288}, {45275, 292}, {45277, 288}, + {45279, 288}, {45281, 291}, {45283, 292}, {45285, 288}, {45287, 298}, {45290, 290}, {45292, 289}, {45294, 292}, + {45296, 288}, {45300, 293}, {45302, 297}, {45305, 288}, {45308, 200}, {45311, 291}, {45315, 292}, {45319, 289}, + {45323, 288}, {45326, 294}, {45331, 294}, {45336, 295}, {45339, 290}, {45342, 292}, {45345, 295}, {45348, 291}, + {45352, 294}, {45355, 288}, {45359, 296}, {45363, 291}, {45367, 293}, {45370, 288}, {45381, 289}, {45391, 290}, + {45402, 290}, {45411, 289}, {45419, 288}, {45427, 291}, {45436, 294}, {45441, 290}, {45447, 291}, {45451, 290}, + {45455, 293}, {45459, 288}, {45463, 292}, {45466, 288}, {45470, 293}, {45475, 290}, {45479, 289}, {45482, 292}, + {45486, 288}, {45489, 288}, {45491, 290}, {45494, 289}, {45496, 303}, {45498, 288}, {45500, 289}, {45503, 293}, + {45505, 288}, {45507, 292}, {45510, 292}, {45512, 288}, {45514, 288}, {45517, 292}, {45519, 290}, {45522, 288}, + {45525, 292}, {45528, 290}, {45530, 288}, {45532, 291}, {45534, 291}, {45536, 290}, {45539, 296}, {45541, 289}, + {45544, 291}, {45547, 294}, {45549, 290}, {45551, 293}, {45553, 292}, {45555, 290}, {45557, 292}, {45560, 291}, + {45562, 292}, {45564, 291}, {45566, 296}, {45568, 289}, {45570, 297}, {45572, 289}, {45574, 294}, {45576, 292}, + {45578, 296}, {45580, 292}, {45583, 288}, {45585, 292}, {45587, 300}, {45588, 288}, {45590, 290}, {45591, 290}, + {45593, 288}, {45595, 296}, {45596, 298}, {45598, 298}, {45600, 291}, {45602, 292}, {45604, 296}, {45606, 292}, + {45607, 294}, {45609, 289}, {45611, 294}, {45613, 294}, {45615, 288}, {45616, 296}, {45618, 295}, {45620, 293}, + {45621, 288}, {45623, 292}, {45625, 293}, {45627, 291}, {45629, 290}, {45631, 293}, {45632, 289}, {45634, 296}, + {45636, 298}, {45637, 294}, {45640, 293}, {45642, 291}, {45644, 291}, {45646, 293}, {45648, 289}, {45651, 290}, + {45653, 292}, {45655, 291}, {45658, 289}, {45661, 291}, {45663, 293}, {45665, 290}, {45667, 288}, {45669, 288}, + {45671, 291}, {45672, 294}, {45674, 297}, {45676, 295}, {45678, 288}, {45680, 289}, {45682, 295}, {45684, 292}, + {45686, 291}, {45688, 289}, {45695, 290}, {45702, 290}, {45710, 291}, {45717, 288}, {45725, 290}, {45733, 288}, + {45740, 288}, {45746, 288}, {45751, 293}, {45755, 288}, {45760, 289}, {45764, 289}, {45767, 297}, {45771, 289}, + {45775, 290}, {45779, 293}, {45783, 292}, {45787, 290}, {45790, 289}, {45792, 299}, {45794, 293}, {45797, 289}, + {45799, 288}, {45802, 289}, {45804, 294}, {45807, 288}, {45810, 289}, {45813, 289}, {45816, 290}, {45818, 300}, + {45820, 289}, {45823, 292}, {45826, 289}, {45829, 288}, {45832, 290}, {45835, 292}, {45838, 292}, {45841, 288}, + {45845, 292}, {45848, 293}, {45851, 289}, {45854, 290}, {45858, 289}, {45862, 291}, {45865, 291}, {45867, 291}, + {45870, 290}, {45874, 288}, {45877, 295}, {45880, 292}, {45882, 291}, {45885, 292}, {45887, 290}, {45890, 289}, + {45892, 291}, {45895, 289}, {45898, 289}, {45900, 295}, {45903, 294}, {45907, 290}, {45909, 297}, {45912, 294}, + {45916, 288}, {45918, 291}, {45921, 291}, {45923, 288}, {45926, 293}, {45929, 292}, {45932, 292}, {45934, 288}, + {45937, 292}, {45940, 297}, {45943, 291}, {45945, 296}, {45948, 289}, {45950, 291}, {45954, 292}, {45957, 290}, + {45960, 292}, {45963, 289}, {45967, 288}, {45970, 295}, {45973, 294}, {45977, 293}, {45981, 293}, {45984, 296}, + {45987, 293}, {45989, 290}, {45992, 290}, {45995, 292}, {45998, 296}, {46001, 290}, {46003, 293}, {46006, 292}, + {46008, 290}, {46010, 290}, {46012, 291}, {46018, 293}, {46027, 288}, {46034, 288}, {46042, 288}, {46050, 289}, + {46057, 289}, {46063, 292}, {46070, 288}, {46077, 289}, {46081, 288}, {46086, 288}, {46091, 292}, {46094, 295}, + {46097, 289}, {46099, 298}, {46102, 293}, {46104, 290}, {46106, 289}, {46108, 289}, {46110, 291}, {46112, 289}, + {46114, 290}, {46116, 288}, {46118, 297}, {46120, 296}, {46122, 292}, {46124, 304}, {46126, 289}, {46128, 298}, + {46130, 289}, {46132, 290}, {46134, 290}, {46138, 292}, {46139, 290}, {46141, 299}, {46143, 288}, {46145, 290}, + {46147, 301}, {46148, 291}, {46150, 308}, {46152, 289}, {46155, 290}, {46157, 288}, {46159, 292}, {46161, 288}, + {46164, 294}, {46166, 288}, {46168, 291}, {46171, 289}, {46173, 298}, {46175, 290}, {46177, 290}, {46179, 288}, + {46181, 291}, {46184, 292}, {46184, 55}, {46186, 290}, {46188, 292}, {46190, 293}, {46193, 288}, {46195, 289}, + {46197, 289}, {46199, 292}, {46201, 288}, {46203, 292}, {46206, 288}, {46207, 291}, {46210, 292}, {46211, 289}, + {46213, 294}, {46215, 293}, {46217, 291}, {46219, 290}, {46221, 290}, {46223, 288}, {46225, 295}, {46227, 290}, + {46228, 290}, {46231, 289}, {46233, 292}, {46235, 292}, {46236, 289}, {46238, 289}, {46241, 295}, {46243, 291}, + {46245, 293}, {46248, 295}, {46250, 289}, {46251, 293}, {46253, 295}, {46255, 293}, {46257, 291}, {46259, 289}, + {46261, 294}, {46263, 292}, {46264, 293}, {46266, 291}, {46268, 290}, {46270, 288}, {46272, 289}, {46274, 293}, + {46276, 288}, {46278, 288}, {46281, 291}, {46283, 290}, {46286, 295}, {46288, 292}, {46291, 297}, {46294, 291}, + {46297, 293}, {46299, 292}, {46301, 289}, {46303, 289}, {46305, 293}, {46307, 289}, {46309, 290}, {46311, 294}, + {46313, 292}, {46316, 293}, {46318, 297}, {46320, 296}, {46322, 291}, {46325, 292}, {46328, 289}, {46338, 288}, + {46346, 289}, {46357, 290}, {46368, 294}, {46377, 288}, {46385, 290}, {46394, 288}, {46402, 289}, {46407, 289}, + {46414, 292}, {46418, 293}, {46422, 288}, {46426, 288}, {46430, 290}, {46434, 292}, {46436, 289}, {46439, 291}, + {46441, 300}, {46444, 288}, {46446, 294}, {46449, 290}, {46450, 288}, {46453, 289}, {46455, 288}, {46457, 301}, + {46459, 290}, {46461, 290}, {46464, 292}, {46467, 288}, {46470, 300}, {46473, 289}, {46475, 294}, {46478, 289}, + {46481, 288}, {46484, 288}, {46486, 290}, {46490, 290}, {46493, 289}, {46496, 295}, {46500, 290}, {46503, 294}, + {46506, 292}, {46509, 291}, {46513, 292}, {46517, 292}, {46521, 295}, {46524, 294}, {46527, 294}, {46530, 295}, + {46532, 288}, {46535, 292}, {46538, 293}, {46541, 288}, {46543, 289}, {46547, 290}, {46550, 289}, {46552, 290}, + {46555, 288}, {46558, 296}, {46561, 290}, {46563, 291}, {46565, 289}, {46568, 294}, {46570, 296}, {46573, 290}, + {46575, 295}, {46579, 295}, {46581, 289}, {46583, 288}, {46586, 291}, {46588, 289}, {46590, 291}, {46593, 292}, + {46595, 289}, {46598, 289}, {46600, 288}, {46603, 288}, {46605, 291}, {46607, 293}, {46609, 288}, {46612, 293}, + {46614, 290}, {46616, 291}, {46618, 291}, {46620, 294}, {46623, 291}, {46625, 293}, {46627, 291}, {46629, 288}, + {46632, 295}, {46634, 289}, {46636, 288}, {46638, 289}, {46641, 297}, {46643, 294}, {46645, 289}, {46648, 289}, + {46651, 290}, {46653, 293}, {46656, 288}, {46659, 295}, {46662, 292}, {46664, 297}, {46668, 294}, {46671, 293}, + {46674, 288}, {46676, 291}, {46678, 296}, {46680, 294}, {46682, 291}, {46684, 289}, {46686, 293}, {46690, 295}, + {46692, 293}, {46695, 294}, {46697, 291}, {46699, 294}, {46702, 294}, {46704, 292}, {46706, 292}, {46708, 290}, + {46714, 289}, {46722, 288}, {46729, 288}, {46737, 288}, {46743, 290}, {46749, 288}, {46754, 290}, {46760, 291}, + {46764, 292}, {46767, 288}, {46771, 288}, {46774, 289}, {46776, 290}, {46779, 291}, {46781, 289}, {46783, 289}, + {46785, 289}, {46787, 291}, {46790, 298}, {46793, 290}, {46795, 290}, {46796, 296}, {46800, 290}, {46803, 290}, + {46806, 290}, {46809, 292}, {46811, 290}, {46814, 289}, {46817, 292}, {46820, 290}, {46823, 290}, {46826, 289}, + {46828, 294}, {46832, 301}, {46835, 293}, {46837, 292}, {46841, 288}, {46843, 293}, {46846, 302}, {46849, 290}, + {46853, 290}, {46856, 294}, {46860, 288}, {46864, 289}, {46867, 289}, {46871, 295}, {46873, 290}, {46877, 291}, + {46880, 291}, {46884, 289}, {46887, 296}, {46890, 294}, {46893, 294}, {46896, 292}, {46899, 288}, {46902, 290}, + {46905, 291}, {46908, 291}, {46912, 289}, {46915, 289}, {46918, 292}, {46921, 289}, {46924, 291}, {46927, 290}, + {46929, 289}, {46932, 290}, {46934, 288}, {46937, 289}, {46940, 294}, {46942, 288}, {46945, 292}, {46948, 289}, + {46951, 292}, {46953, 289}, {46956, 293}, {46958, 291}, {46962, 289}, {46964, 293}, {46967, 289}, {46969, 288}, + {46972, 290}, {46974, 288}, {46977, 289}, {46980, 290}, {46983, 293}, {46985, 288}, {46989, 288}, {46991, 295}, + {46994, 292}, {46996, 288}, {46999, 292}, {47002, 294}, {47004, 294}, {47006, 291}, {47008, 290}, {47010, 293}, + {47013, 292}, {47015, 292}, {47018, 293}, {47022, 289}, {47024, 291}, {47027, 288}, {47029, 296}, {47032, 298}, + {47035, 296}, {47038, 292}, {47040, 293}, {47042, 292}, {47045, 292}, {47046, 293}, {47048, 194}, {47050, 294}, + {47052, 290}, {47054, 297}, {47057, 290}, {47063, 289}, {47065, 294}, {47067, 297}, {47069, 288}, {47072, 295}, + {47074, 291}, {47076, 290}, {47078, 288}, {47083, 288}, {47091, 289}, {47098, 288}, {47105, 289}, {47113, 293}, + {47120, 288}, {47124, 291}, {47130, 289}, {47135, 289}, {47139, 288}, {47142, 292}, {47145, 297}, {47148, 293}, + {47150, 291}, {47152, 292}, {47155, 291}, {47157, 290}, {47159, 296}, {47161, 289}, {47162, 290}, {47164, 289}, + {47166, 288}, {47168, 293}, {47170, 288}, {47174, 288}, {47176, 291}, {47178, 293}, {47180, 291}, {47183, 289}, + {47185, 291}, {47187, 295}, {47190, 289}, {47191, 289}, {47193, 300}, {47195, 297}, {47197, 307}, {47199, 306}, + {47202, 291}, {47204, 303}, {47207, 291}, {47209, 289}, {47212, 296}, {47214, 288}, {47217, 293}, {47220, 294}, + {47222, 288}, {47226, 292}, {47229, 289}, {47232, 288}, {47235, 296}, {47238, 289}, {47241, 289}, {47245, 293}, + {47248, 288}, {47251, 288}, {47254, 292}, {47257, 289}, {47260, 295}, {47263, 288}, {47266, 290}, {47269, 293}, + {47272, 288}, {47275, 291}, {47278, 289}, {47280, 288}, {47285, 292}, {47288, 291}, {47290, 289}, {47293, 293}, + {47295, 288}, {47297, 297}, {47300, 292}, {47302, 289}, {47305, 293}, {47308, 295}, {47311, 290}, {47314, 290}, + {47317, 288}, {47320, 294}, {47322, 292}, {47325, 293}, {47328, 289}, {47331, 294}, {47333, 295}, {47336, 294}, + {47338, 293}, {47341, 290}, {47343, 292}, {47346, 289}, {47349, 293}, {47351, 291}, {47354, 292}, {47356, 292}, + {47359, 289}, {47361, 288}, {47364, 295}, {47366, 291}, {47369, 296}, {47372, 294}, {47375, 288}, {47378, 291}, + {47382, 288}, {47386, 294}, {47391, 293}, {47398, 289}, {47401, 291}, {47404, 291}, {47406, 291}, {47408, 288}, + {47410, 288}, {47413, 289}, {47415, 291}, {47417, 290}, {47419, 288}, {47422, 291}, {47424, 298}, {47427, 291}, + {47429, 289}, {47431, 289}, {47434, 293}, {47436, 293}, {47438, 291}, {47440, 296}, {47445, 289}, {47452, 290}, + {47461, 289}, {47468, 289}, {47476, 288}, {47484, 292}, {47489, 292}, {47494, 288}, {47500, 289}, {47506, 296}, + {47510, 288}, {47513, 288}, {47517, 291}, {47519, 289}, {47522, 290}, {47524, 288}, {47526, 293}, {47528, 288}, + {47530, 292}, {47532, 292}, {47533, 307}, {47536, 292}, {47538, 290}, {47540, 288}, {47542, 288}, {47543, 291}, + {47546, 292}, {47547, 288}, {47550, 289}, {47551, 289}, {47553, 290}, {47555, 288}, {47558, 290}, {47560, 289}, + {47562, 291}, {47564, 299}, {47567, 290}, {47569, 293}, {47571, 310}, {47573, 290}, {47576, 294}, {47578, 290}, + {47580, 291}, {47583, 291}, {47584, 289}, {47587, 305}, {47589, 290}, {47592, 288}, {47594, 307}, {47596, 289}, + {47598, 296}, {47601, 292}, {47604, 290}, {47606, 295}, {47610, 294}, {47613, 289}, {47617, 294}, {47621, 288}, + {47624, 292}, {47627, 289}, {47630, 290}, {47633, 288}, {47637, 291}, {47640, 288}, {47643, 288}, {47646, 288}, + {47649, 292}, {47652, 289}, {47655, 291}, {47659, 289}, {47662, 291}, {47665, 291}, {47668, 289}, {47671, 290}, + {47674, 289}, {47678, 288}, {47681, 288}, {47683, 293}, {47686, 297}, {47689, 292}, {47692, 300}, {47694, 292}, + {47697, 294}, {47700, 290}, {47703, 289}, {47706, 294}, {47709, 290}, {47711, 291}, {47714, 290}, {47717, 293}, + {47720, 289}, {47722, 289}, {47725, 291}, {47729, 291}, {47731, 289}, {47734, 289}, {47737, 291}, {47740, 289}, + {47743, 288}, {47745, 290}, {47747, 291}, {47750, 292}, {47752, 292}, {47755, 288}, {47758, 290}, {47760, 292}, + {47763, 295}, {47766, 294}, {47769, 289}, {47772, 289}, {47776, 293}, {47779, 292}, {47782, 292}, {47785, 288}, + {47787, 295}, {47790, 295}, {47792, 289}, {47794, 289}, {47797, 291}, {47799, 293}, {47801, 292}, {47803, 291}, + {47804, 293}, {47807, 290}, {47809, 293}, {47811, 288}, {47813, 288}, {47815, 289}, {47818, 290}, {47824, 289}, + {47832, 289}, {47841, 288}, {47849, 291}, {47856, 296}, {47862, 293}, {47867, 296}, {47872, 288}, {47877, 289}, + {47882, 291}, {47888, 288}, {47892, 289}, {47895, 289}, {47898, 290}, {47901, 288}, {47902, 89}, {47904, 288}, + {47906, 288}, {47909, 288}, {47911, 288}, {47914, 291}, {47916, 289}, {47918, 291}, {47920, 288}, {47922, 291}, + {47923, 288}, {47925, 297}, {47928, 289}, {47930, 291}, {47933, 293}, {47935, 289}, {47937, 289}, {47939, 295}, + {47942, 299}, {47944, 289}, {47946, 292}, {47950, 289}, {47952, 292}, {47954, 289}, {47957, 291}, {47958, 311}, + {47960, 289}, {47963, 308}, {47965, 294}, {47967, 315}, {47970, 295}, {47972, 301}, {47974, 308}, {47977, 305}, + {47979, 304}, {47981, 290}, {47984, 291}, {47986, 289}, {47988, 300}, {47991, 289}, {47992, 288}, {47994, 295}, + {47996, 306}, {47999, 316}, {48001, 291}, {48004, 296}, {48007, 298}, {48011, 293}, {48015, 295}, {48019, 289}, + {48022, 302}, {48027, 297}, {48031, 289}, {48034, 293}, {48036, 289}, {48040, 290}, {48043, 291}, {48046, 288}, + {48050, 291}, {48053, 288}, {48056, 290}, {48061, 291}, {48064, 288}, {48067, 289}, {48070, 292}, {48074, 295}, + {48076, 291}, {48079, 293}, {48082, 289}, {48085, 288}, {48088, 288}, {48091, 290}, {48094, 293}, {48097, 291}, + {48099, 289}, {48102, 291}, {48104, 288}, {48107, 291}, {48109, 290}, {48112, 295}, {48115, 289}, {48117, 289}, + {48121, 294}, {48123, 294}, {48126, 291}, {48129, 292}, {48132, 290}, {48135, 289}, {48137, 293}, {48140, 296}, + {48142, 289}, {48145, 290}, {48148, 290}, {48150, 288}, {48153, 294}, {48155, 296}, {48158, 295}, {48160, 288}, + {48163, 294}, {48165, 291}, {48168, 292}, {48172, 290}, {48174, 294}, {48177, 288}, {48179, 295}, {48181, 293}, + {48184, 292}, {48186, 290}, {48189, 290}, {48191, 289}, {48195, 298}, {48198, 291}, {48200, 290}, {48202, 290}, + {48204, 291}, {48206, 289}, {48207, 295}, {48209, 291}, {48210, 290}, {48212, 294}, {48214, 297}, {48215, 288}, + {48217, 291}, {48218, 289}, {48220, 295}, {48222, 288}, {48223, 293}, {48225, 291}, {48227, 292}, {48228, 291}, + {48230, 288}, {48231, 291}, {48235, 289}, {48240, 290}, {48246, 293}, {48252, 291}, {48257, 294}, {48263, 289}, + {48268, 292}, {48274, 289}, {48281, 289}, {48287, 291}, {48293, 289}, {48297, 297}, {48301, 293}, {48305, 290}, + {48309, 294}, {48313, 298}, {48317, 289}, {48321, 289}, {48324, 290}, {48327, 289}, {48329, 290}, {48332, 288}, + {48335, 290}, {48337, 290}, {48339, 297}, {48342, 296}, {48345, 314}, {48347, 289}, {48350, 296}, {48351, 290}, + {48354, 294}, {48356, 292}, {48358, 292}, {48361, 297}, {48363, 311}, {48366, 290}, {48368, 288}, {48370, 318}, + {48373, 297}, {48376, 288}, {48378, 288}, {48380, 301}, {48382, 303}, {48385, 294}, {48387, 288}, {48390, 293}, + {48393, 309}, {48396, 297}, {48398, 288}, {48401, 314}, {48404, 289}, {48406, 297}, {48410, 292}, {48412, 288}, + {48415, 289}, {48419, 304}, {48422, 303}, {48425, 290}, {48428, 292}, {48432, 293}, {48435, 293}, {48439, 292}, + {48442, 290}, {48446, 301}, {48451, 292}, {48454, 289}, {48458, 292}, {48461, 290}, {48463, 295}, {48467, 293}, + {48470, 289}, {48473, 290}, {48476, 293}, {48479, 291}, {48483, 290}, {48486, 288}, {48489, 290}, {48492, 289}, + {48496, 294}, {48499, 291}, {48504, 294}, {48507, 288}, {48510, 295}, {48513, 292}, {48516, 292}, {48519, 293}, + {48522, 289}, {48525, 288}, {48528, 288}, {48530, 294}, {48532, 292}, {48535, 296}, {48538, 289}, {48540, 291}, + {48543, 291}, {48546, 291}, {48548, 297}, {48551, 293}, {48554, 289}, {48557, 294}, {48559, 288}, {48562, 290}, + {48565, 290}, {48568, 291}, {48570, 294}, {48572, 289}, {48575, 292}, {48577, 289}, {48579, 288}, {48581, 290}, + {48583, 289}, {48585, 294}, {48588, 292}, {48590, 291}, {48592, 289}, {48594, 289}, {48597, 290}, {48599, 289}, + {48602, 292}, {48603, 294}, {48605, 295}, {48607, 291}, {48610, 289}, {48613, 292}, {48615, 291}, {48617, 291}, + {48618, 289}, {48621, 292}, {48622, 290}, {48625, 296}, {48627, 289}, {48629, 292}, {48631, 290}, {48633, 291}, + {48635, 288}, {48636, 295}, {48637, 288}, {48639, 291}, {48640, 288}, {48641, 294}, {48643, 290}, {48644, 295}, + {48645, 288}, {48646, 290}, {48647, 291}, {48649, 291}, {48650, 293}, {48651, 290}, {48653, 289}, {48655, 290}, + {48657, 291}, {48659, 290}, {48664, 291}, {48670, 295}, {48677, 290}, {48683, 290}, {48689, 291}, {48695, 289}, + {48702, 293}, {48709, 288}, {48717, 293}, {48725, 289}, {48730, 288}, {48735, 293}, {48741, 288}, {48744, 289}, + {48749, 288}, {48752, 294}, {48755, 207}, {48757, 293}, {48760, 289}, {48762, 306}, {48765, 290}, {48768, 290}, + {48770, 288}, {48773, 290}, {48775, 293}, {48777, 302}, {48781, 288}, {48783, 289}, {48785, 288}, {48788, 312}, + {48790, 291}, {48793, 291}, {48795, 293}, {48798, 293}, {48800, 316}, {48803, 296}, {48805, 288}, {48807, 305}, + {48811, 288}, {48813, 304}, {48816, 300}, {48819, 290}, {48821, 312}, {48825, 294}, {48827, 294}, {48830, 299}, + {48835, 292}, {48837, 289}, {48840, 288}, {48842, 303}, {48845, 293}, {48848, 297}, {48850, 291}, {48852, 293}, + {48855, 295}, {48858, 298}, {48861, 289}, {48863, 308}, {48865, 288}, {48868, 290}, {48870, 289}, {48872, 288}, + {48874, 291}, {48876, 294}, {48879, 312}, {48881, 315}, {48884, 307}, {48887, 292}, {48889, 300}, {48893, 293}, + {48896, 293}, {48898, 289}, {48902, 288}, {48905, 292}, {48909, 289}, {48912, 293}, {48915, 292}, {48919, 292}, + {48922, 289}, {48926, 290}, {48930, 289}, {48933, 289}, {48936, 291}, {48939, 288}, {48942, 290}, {48947, 290}, + {48951, 294}, {48953, 294}, {48956, 295}, {48959, 289}, {48962, 289}, {48966, 294}, {48968, 294}, {48971, 292}, + {48975, 291}, {48977, 288}, {48980, 290}, {48984, 290}, {48987, 291}, {48989, 290}, {48993, 288}, {48995, 289}, + {48999, 288}, {49001, 289}, {49004, 290}, {49006, 288}, {49008, 289}, {49011, 294}, {49013, 289}, {49015, 289}, + {49017, 288}, {49020, 290}, {49022, 288}, {49025, 296}, {49027, 292}, {49030, 288}, {49031, 288}, {49034, 290}, + {49036, 292}, {49039, 292}, {49041, 290}, {49044, 290}, {49046, 292}, {49049, 296}, {49051, 290}, {49055, 290}, + {49058, 292}, {49061, 289}, {49064, 291}, {49067, 289}, {49070, 292}, {49072, 289}, {49074, 290}, {49075, 290}, + {49077, 298}, {49079, 288}, {49081, 292}, {49082, 288}, {49084, 291}, {49086, 288}, {49088, 291}, {49090, 291}, + {49092, 291}, {49094, 293}, {49095, 288}, {49099, 290}, {49105, 292}, {49111, 292}, {49117, 290}, {49123, 291}, + {49128, 290}, {49135, 289}, {49142, 288}, {49146, 291}, {49151, 290}, {49160, 290}, {49164, 291}, {49168, 289}, + {49172, 294}, {49174, 292}, {49176, 292}, {49179, 294}, {49181, 289}, {49183, 292}, {49185, 294}, {49187, 291}, + {49189, 288}, {49192, 288}, {49194, 289}, {49196, 290}, {49198, 292}, {49200, 290}, {49202, 289}, {49205, 289}, + {49207, 291}, {49209, 295}, {49212, 308}, {49214, 293}, {49217, 289}, {49219, 288}, {49221, 308}, {49223, 298}, + {49226, 292}, {49228, 288}, {49230, 289}, {49232, 288}, {49234, 307}, {49237, 288}, {49239, 291}, {49241, 288}, + {49244, 289}, {49246, 289}, {49248, 307}, {49250, 291}, {49252, 295}, {49255, 291}, {49257, 312}, {49259, 298}, + {49261, 289}, {49264, 301}, {49268, 288}, {49270, 305}, {49273, 289}, {49275, 300}, {49278, 311}, {49281, 292}, + {49283, 289}, {49285, 288}, {49288, 288}, {49290, 299}, {49293, 289}, {49296, 289}, {49299, 291}, {49302, 290}, + {49305, 292}, {49308, 288}, {49312, 292}, {49315, 288}, {49319, 292}, {49323, 288}, {49327, 289}, {49331, 290}, + {49334, 291}, {49337, 299}, {49341, 291}, {49345, 292}, {49348, 291}, {49353, 288}, {49356, 288}, {49361, 294}, + {49364, 291}, {49368, 288}, {49371, 290}, {49375, 293}, {49380, 288}, {49383, 288}, {49387, 289}, {49391, 288}, + {49395, 290}, {49398, 290}, {49402, 288}, {49405, 288}, {49407, 288}, {49410, 289}, {49413, 292}, {49415, 289}, + {49418, 288}, {49420, 290}, {49422, 290}, {49425, 290}, {49428, 290}, {49430, 292}, {49433, 291}, {49436, 288}, + {49438, 290}, {49440, 293}, {49443, 294}, {49445, 293}, {49447, 288}, {49449, 290}, {49452, 289}, {49454, 290}, + {49456, 290}, {49458, 293}, {49461, 294}, {49463, 291}, {49465, 290}, {49467, 290}, {49469, 288}, {49471, 288}, + {49473, 289}, {49477, 288}, {49479, 291}, {49482, 290}, {49485, 288}, {49489, 293}, {49493, 290}, {49495, 289}, + {49499, 288}, {49502, 288}, {49504, 290}, {49506, 293}, {49509, 292}, {49511, 289}, {49514, 293}, {49516, 289}, + {49518, 293}, {49520, 288}, {49522, 290}, {49524, 290}, {49525, 292}, {49527, 290}, {49529, 292}, {49530, 292}, + {49532, 290}, {49533, 289}, {49538, 291}, {49543, 289}, {49549, 288}, {49554, 291}, {49559, 289}, {49564, 290}, + {49569, 293}, {49574, 291}, {49579, 289}, {49586, 295}, {49590, 289}, {49593, 262}, {49599, 289}, {49606, 289}, + {49611, 288}, {49616, 292}, {49620, 311}, {49623, 317}, {49626, 288}, {49628, 289}, {49632, 290}, {49634, 288}, + {49636, 313}, {49639, 291}, {49642, 288}, {49644, 303}, {49647, 306}, {49651, 316}, {49653, 288}, {49656, 298}, + {49659, 290}, {49661, 304}, {49663, 288}, {49666, 288}, {49669, 304}, {49671, 293}, {49674, 289}, {49676, 303}, + {49679, 289}, {49681, 316}, {49684, 289}, {49686, 290}, {49689, 289}, {49692, 318}, {49694, 294}, {49697, 290}, + {49700, 303}, {49702, 289}, {49704, 300}, {49707, 289}, {49710, 289}, {49712, 290}, {49714, 304}, {49717, 293}, + {49719, 291}, {49722, 298}, {49725, 293}, {49727, 312}, {49730, 288}, {49733, 297}, {49735, 289}, {49738, 307}, + {49741, 288}, {49743, 292}, {49746, 288}, {49748, 299}, {49751, 308}, {49754, 292}, {49758, 289}, {49761, 291}, + {49764, 288}, {49766, 294}, {49770, 288}, {49773, 296}, {49777, 302}, {49781, 291}, {49784, 300}, {49788, 291}, + {49791, 290}, {49796, 288}, {49800, 290}, {49803, 290}, {49807, 289}, {49809, 288}, {49813, 290}, {49816, 289}, + {49820, 288}, {49823, 289}, {49826, 292}, {49829, 291}, {49832, 288}, {49834, 293}, {49837, 288}, {49840, 288}, + {49843, 289}, {49846, 289}, {49849, 288}, {49852, 289}, {49855, 288}, {49858, 290}, {49861, 293}, {49864, 295}, + {49866, 291}, {49869, 293}, {49872, 295}, {49875, 288}, {49878, 289}, {49881, 291}, {49883, 295}, {49886, 291}, + {49889, 290}, {49892, 292}, {49894, 293}, {49896, 291}, {49899, 293}, {49902, 288}, {49906, 290}, {49908, 289}, + {49911, 291}, {49915, 291}, {49918, 290}, {49921, 292}, {49923, 291}, {49927, 290}, {49932, 291}, {49935, 288}, + {49939, 289}, {49943, 289}, {49945, 288}, {49949, 303}, {49953, 290}, {49956, 291}, {49960, 290}, {49963, 288}, + {49965, 290}, {49969, 289}, {49971, 288}, {49973, 288}, {49974, 289}, {49977, 288}, {49978, 291}, {49980, 294}, + {49982, 293}, {49985, 292}, {49987, 294}, {49988, 289}, {49991, 290}, {49993, 292}, {49997, 288}, {50004, 288}, + {50011, 291}, {50020, 289}, {50029, 288}, {50042, 288}, {50052, 294}, {50062, 290}, {50069, 288}, {50076, 290}, + {50081, 291}, {50086, 291}, {50091, 290}, {50094, 314}, {50097, 289}, {50099, 299}, {50102, 297}, {50104, 292}, + {50107, 290}, {50109, 297}, {50112, 316}, {50115, 288}, {50117, 301}, {50119, 303}, {50122, 294}, {50124, 310}, + {50127, 308}, {50130, 312}, {50133, 290}, {50135, 316}, {50137, 295}, {50140, 289}, {50142, 304}, {50144, 308}, + {50146, 289}, {50147, 298}, {50149, 309}, {50152, 298}, {50153, 291}, {50155, 298}, {50156, 292}, {50158, 314}, + {50160, 290}, {50161, 292}, {50163, 291}, {50164, 310}, {50166, 289}, {50168, 291}, {50169, 311}, {50171, 288}, + {50172, 295}, {50173, 290}, {50175, 288}, {50176, 297}, {50178, 291}, {50179, 316}, {50181, 302}, {50183, 292}, + {50184, 311}, {50185, 318}, {50187, 313}, {50188, 288}, {50190, 292}, {50191, 297}, {50193, 308}, {50195, 303}, + {50197, 290}, {50199, 291}, {50200, 288}, {50202, 305}, {50204, 293}, {50205, 291}, {50207, 298}, {50209, 290}, + {50211, 309}, {50213, 315}, {50215, 290}, {50217, 290}, {50219, 298}, {50221, 290}, {50223, 291}, {50225, 294}, + {50227, 293}, {50230, 289}, {50232, 302}, {50235, 288}, {50236, 292}, {50239, 294}, {50242, 312}, {50245, 288}, + {50246, 288}, {50248, 288}, {50250, 288}, {50253, 291}, {50256, 299}, {50259, 288}, {50263, 289}, {50265, 289}, + {50268, 288}, {50270, 295}, {50274, 291}, {50276, 289}, {50279, 292}, {50282, 290}, {50285, 291}, {50288, 288}, + {50291, 288}, {50293, 294}, {50297, 288}, {50300, 289}, {50303, 289}, {50305, 289}, {50309, 289}, {50315, 291}, + {50318, 292}, {50322, 290}, {50326, 291}, {50330, 289}, {50334, 291}, {50338, 289}, {50341, 290}, {50345, 292}, + {50348, 293}, {50352, 290}, {50355, 290}, {50359, 289}, {50362, 289}, {50365, 288}, {50369, 291}, {50372, 293}, + {50378, 288}, {50381, 289}, {50384, 288}, {50388, 288}, {50393, 292}, {50396, 290}, {50400, 288}, {50404, 288}, + {50408, 289}, {50411, 290}, {50414, 288}, {50418, 291}, {50421, 289}, {50424, 289}, {50426, 288}, {50428, 289}, + {50430, 289}, {50432, 289}, {50434, 289}, {50436, 293}, {50438, 291}, {50442, 295}, {50449, 288}, {50456, 292}, + {50463, 289}, {50470, 293}, {50476, 288}, {50485, 291}, {50493, 290}, {50500, 291}, {50505, 289}, {50511, 288}, + {50515, 288}, {50520, 290}, {50523, 288}, {50527, 290}, {50528, 300}, {50529, 41}, {50530, 292}, {50532, 288}, + {50534, 295}, {50536, 305}, {50539, 293}, {50540, 288}, {50542, 290}, {50544, 312}, {50547, 289}, {50548, 306}, + {50550, 314}, {50552, 289}, {50554, 316}, {50556, 291}, {50558, 314}, {50560, 314}, {50562, 295}, {50563, 293}, + {50565, 290}, {50567, 288}, {50569, 293}, {50570, 288}, {50572, 288}, {50575, 288}, {50576, 289}, {50577, 291}, + {50579, 288}, {50581, 312}, {50583, 307}, {50585, 295}, {50587, 296}, {50589, 288}, {50591, 298}, {50592, 297}, + {50596, 293}, {50597, 291}, {50599, 291}, {50601, 319}, {50603, 310}, {50606, 295}, {50607, 310}, {50609, 307}, + {50612, 299}, {50613, 317}, {50615, 289}, {50616, 290}, {50619, 308}, {50621, 289}, {50623, 290}, {50625, 288}, + {50628, 290}, {50629, 288}, {50632, 294}, {50635, 289}, {50636, 288}, {50640, 288}, {50641, 305}, {50643, 288}, + {50646, 291}, {50648, 294}, {50651, 288}, {50653, 294}, {50655, 308}, {50657, 293}, {50659, 288}, {50661, 299}, + {50664, 288}, {50666, 288}, {50668, 290}, {50671, 298}, {50674, 291}, {50676, 300}, {50679, 295}, {50682, 291}, + {50684, 313}, {50687, 289}, {50689, 291}, {50691, 294}, {50694, 296}, {50698, 305}, {50701, 290}, {50706, 299}, + {50709, 297}, {50712, 297}, {50714, 315}, {50718, 289}, {50722, 295}, {50725, 290}, {50730, 291}, {50733, 292}, + {50738, 289}, {50743, 288}, {50747, 288}, {50750, 288}, {50755, 291}, {50760, 289}, {50764, 289}, {50768, 290}, + {50772, 292}, {50776, 288}, {50780, 291}, {50784, 289}, {50788, 288}, {50792, 293}, {50796, 292}, {50800, 291}, + {50803, 289}, {50807, 290}, {50810, 291}, {50813, 288}, {50818, 288}, {50821, 296}, {50825, 290}, {50829, 292}, + {50833, 294}, {50838, 293}, {50841, 290}, {50846, 290}, {50849, 290}, {50853, 290}, {50857, 288}, {50860, 288}, + {50863, 288}, {50867, 289}, {50869, 290}, {50871, 290}, {50877, 288}, {50884, 288}, {50890, 290}, {50897, 294}, + {50905, 288}, {50910, 295}, {50915, 291}, {50920, 290}, {50924, 289}, {50929, 289}, {50930, 291}, {50932, 290}, + {50934, 294}, {50936, 303}, {50938, 288}, {50941, 310}, {50943, 289}, {50944, 288}, {50947, 300}, {50949, 315}, + {50951, 316}, {50953, 300}, {50955, 304}, {50957, 290}, {50959, 292}, {50961, 299}, {50963, 305}, {50965, 297}, + {50967, 290}, {50968, 295}, {50970, 302}, {50972, 288}, {50974, 304}, {50976, 295}, {50977, 295}, {50979, 309}, + {50981, 296}, {50983, 302}, {50984, 289}, {50986, 300}, {50988, 291}, {50990, 316}, {50992, 292}, {50993, 290}, + {50995, 301}, {50997, 301}, {50998, 306}, {51000, 288}, {51001, 297}, {51003, 288}, {51004, 310}, {51006, 294}, + {51008, 294}, {51009, 310}, {51011, 288}, {51013, 296}, {51015, 319}, {51017, 305}, {51018, 289}, {51020, 294}, + {51023, 291}, {51025, 293}, {51027, 288}, {51029, 291}, {51032, 291}, {51033, 293}, {51035, 291}, {51039, 293}, + {51042, 288}, {51044, 291}, {51047, 289}, {51049, 294}, {51051, 292}, {51053, 289}, {51055, 291}, {51057, 289}, + {51059, 288}, {51062, 302}, {51064, 293}, {51067, 289}, {51069, 301}, {51072, 302}, {51075, 303}, {51077, 314}, + {51080, 291}, {51083, 303}, {51085, 313}, {51087, 288}, {51091, 290}, {51094, 296}, {51096, 300}, {51099, 288}, + {51102, 288}, {51104, 289}, {51107, 289}, {51110, 289}, {51115, 288}, {51119, 289}, {51124, 291}, {51129, 291}, + {51132, 289}, {51135, 304}, {51139, 291}, {51143, 288}, {51149, 289}, {51153, 288}, {51158, 288}, {51163, 292}, + {51167, 288}, {51172, 289}, {51177, 291}, {51182, 289}, {51186, 293}, {51191, 288}, {51195, 291}, {51200, 292}, + {51204, 288}, {51214, 288}, {51219, 289}, {51225, 290}, {51230, 288}, {51235, 291}, {51240, 289}, {51245, 289}, + {51249, 290}, {51254, 288}, {51258, 289}, {51266, 289}, {51279, 288}, {51292, 291}, {51303, 288}, {51309, 289}, + {51314, 289}, {51318, 288}, {51319, 294}, {51322, 289}, {51323, 310}, {51324, 295}, {51326, 307}, {51327, 297}, + {51329, 289}, {51330, 315}, {51331, 296}, {51333, 288}, {51334, 300}, {51335, 305}, {51336, 314}, {51338, 295}, + {51339, 290}, {51340, 288}, {51342, 292}, {51343, 288}, {51344, 289}, {51346, 288}, {51347, 299}, {51349, 290}, + {51349, 291}, {51351, 293}, {51352, 293}, {51354, 301}, {51355, 288}, {51357, 291}, {51359, 292}, {51360, 308}, + {51362, 290}, {51363, 310}, {51365, 301}, {51366, 297}, {51368, 319}, {51370, 312}, {51372, 305}, {51374, 292}, + {51375, 311}, {51377, 290}, {51379, 291}, {51382, 288}, {51383, 312}, {51386, 289}, {51388, 317}, {51390, 288}, + {51393, 288}, {51395, 297}, {51398, 288}, {51400, 291}, {51401, 288}, {51403, 298}, {51404, 298}, {51406, 310}, + {51408, 288}, {51409, 308}, {51410, 296}, {51412, 305}, {51414, 299}, {51415, 293}, {51417, 298}, {51419, 293}, + {51420, 293}, {51422, 288}, {51424, 289}, {51425, 291}, {51427, 310}, {51429, 314}, {51432, 305}, {51434, 314}, + {51436, 298}, {51438, 292}, {51439, 291}, {51441, 294}, {51442, 293}, {51445, 288}, {51447, 291}, {51449, 292}, + {51452, 289}, {51453, 289}, {51456, 302}, {51457, 295}, {51459, 308}, {51461, 293}, {51464, 289}, {51469, 288}, + {51472, 193}, {51476, 290}, {51481, 291}, {51485, 309}, {51488, 292}, {51490, 293}, {51493, 301}, {51496, 288}, + {51499, 290}, {51502, 288}, {51505, 294}, {51511, 288}, {51515, 288}, {51520, 288}, {51525, 288}, {51530, 291}, + {51535, 292}, {51539, 288}, {51545, 290}, {51549, 288}, {51554, 290}, {51558, 289}, {51562, 288}, {51566, 293}, + {51570, 292}, {51574, 290}, {51579, 288}, {51583, 291}, {51587, 291}, {51591, 288}, {51595, 288}, {51599, 290}, + {51608, 289}, {51623, 291}, {51641, 289}, {51658, 288}, {51667, 289}, {51673, 307}, {51675, 291}, {51677, 292}, + {51680, 305}, {51682, 291}, {51684, 315}, {51687, 297}, {51689, 304}, {51691, 308}, {51694, 298}, {51696, 304}, + {51698, 307}, {51700, 292}, {51702, 289}, {51704, 311}, {51707, 314}, {51708, 304}, {51710, 299}, {51711, 291}, + {51712, 288}, {51713, 291}, {51714, 310}, {51716, 316}, {51717, 297}, {51718, 295}, {51719, 288}, {51720, 304}, + {51722, 315}, {51723, 309}, {51724, 314}, {51725, 312}, {51727, 302}, {51728, 312}, {51730, 303}, {51731, 296}, + {51733, 289}, {51734, 292}, {51735, 298}, {51737, 290}, {51738, 290}, {51740, 312}, {51742, 293}, {51743, 311}, + {51745, 290}, {51747, 301}, {51749, 296}, {51750, 296}, {51752, 296}, {51754, 291}, {51756, 301}, {51758, 288}, + {51759, 302}, {51762, 288}, {51766, 305}, {51769, 290}, {51772, 294}, {51775, 292}, {51781, 288}, {51787, 289}, + {51792, 289}, {51797, 290}, {51800, 290}, {51801, 288}, {51803, 289}, {51804, 290}, {51806, 289}, {51807, 288}, + {51809, 288}, {51811, 291}, {51814, 291}, {51817, 288}, {51820, 289}, {51822, 292}, {51825, 289}, {51829, 291}, + {51832, 288}, {51835, 290}, {51840, 290}, {51843, 291}, {51847, 291}, {51850, 288}, {51853, 290}, {51857, 292}, + {51861, 289}, {51864, 292}, {51868, 288}, {51872, 294}, {51877, 292}, {51880, 288}, {51885, 289}, {51888, 289}, + {51891, 288}, {51894, 290}, {51898, 289}, {51902, 290}, {51905, 288}, {51908, 291}, {51912, 288}, {51915, 289}, + {51918, 290}, {51924, 297}, {51931, 293}, {51937, 292}, {51945, 297}, {51952, 301}, {51959, 294}, {51966, 288}, + {51970, 291}, {51976, 288}, {51980, 292}, {51985, 288}, {51989, 290}, {51992, 301}, {51993, 290}, {51994, 288}, + {51995, 310}, {51997, 289}, {51997, 319}, {51998, 289}, {51999, 292}, {52002, 315}, {52006, 302}, {52009, 288}, + {52013, 316}, {52016, 297}, {52020, 319}, {52023, 292}, {52026, 315}, {52029, 304}, {52033, 299}, {52036, 290}, + {52039, 291}, {52042, 302}, {52045, 306}, {52048, 292}, {52051, 291}, {52054, 306}, {52058, 301}, {52061, 310}, + {52063, 317}, {52065, 302}, {52066, 314}, {52067, 317}, {52068, 302}, {52070, 291}, {52071, 314}, {52072, 307}, + {52073, 300}, {52075, 307}, {52077, 289}, {52079, 291}, {52080, 317}, {52082, 313}, {52083, 293}, {52085, 293}, + {52086, 311}, {52088, 308}, {52090, 297}, {52091, 291}, {52093, 313}, {52095, 289}, {52097, 319}, {52099, 301}, + {52101, 303}, {52103, 288}, {52105, 299}, {52107, 304}, {52109, 288}, {52111, 311}, {52113, 307}, {52115, 309}, + {52119, 288}, {52123, 288}, {52126, 301}, {52128, 298}, {52131, 301}, {52134, 294}, {52137, 314}, {52141, 291}, + {52147, 288}, {52153, 288}, {52160, 290}, {52166, 290}, {52173, 289}, {52180, 288}, {52186, 289}, {52198, 294}, + {52208, 307}, {52215, 292}, {52220, 290}, {52225, 308}, {52228, 291}, {52232, 303}, {52235, 309}, {52239, 301}, + {52242, 295}, {52245, 289}, {52248, 297}, {52251, 310}, {52254, 293}, {52257, 308}, {52260, 291}, {52262, 292}, + {52265, 293}, {52268, 292}, {52271, 310}, {52273, 290}, {52276, 310}, {52279, 295}, {52281, 307}, {52284, 292}, + {52287, 300}, {52289, 311}, {52292, 294}, {52294, 303}, {52297, 300}, {52299, 296}, {52301, 288}, {52304, 295}, + {52307, 292}, {52309, 296}, {52311, 291}, {52313, 295}, {52315, 294}, {52319, 307}, {52322, 304}, {52324, 290}, + {52327, 292}, {52330, 298}, {52332, 296}, {52334, 292}, {52337, 288}, {52339, 312}, {52342, 292}, {52345, 292}, + {52348, 296}, {52351, 290}, {52353, 290}, {52356, 289}, {52359, 288}, {52361, 296}, {52364, 304}, {52368, 297}, + {52371, 297}, {52374, 298}, {52377, 288}, {52380, 289}, {52383, 310}, {52386, 290}, {52391, 289}, {52393, 294}, + {52395, 291}, {52397, 311}, {52399, 290}, {52401, 304}, {52403, 288}, {52405, 290}, {52407, 292}, {52410, 293}, + {52411, 288}, {52414, 307}, {52417, 299}, {52420, 289}, {52425, 296}, {52430, 290}, {52434, 291}, {52437, 310}, + {52441, 294}, {52445, 288}, {52449, 288}, {52451, 290}, {52454, 293}, {52458, 315}, {52463, 288}, {52469, 288}, + {52474, 288}, {52479, 289}, {52484, 305}, {52489, 291}, {52493, 304}, {52495, 290}, {52496, 291}, {52497, 302}, + {52498, 309}, {52499, 288}, {52500, 290}, {52501, 296}, {52502, 301}, {52504, 290}, {52505, 288}, {52506, 309}, + {52508, 290}, {52510, 300}, {52512, 291}, {52515, 288}, {52518, 291}, {52520, 227}, {52523, 289}, {52525, 289}, + {52528, 288}, {52531, 289}, {52534, 288}, {52537, 288}, {52540, 291}, {52543, 293}, {52546, 288}, {52549, 288}, + {52552, 291}, {52555, 288}, {52557, 288}, {52561, 301}, {52569, 304}, {52576, 288}, {52583, 308}, {52589, 291}, + {52592, 292}, {52596, 292}, {52597, 299}, {52597, 293}, {52598, 310}, {52599, 289}, {52599, 300}, {52601, 293}, + {52602, 290}, {52604, 314}, {52605, 292}, {52607, 289}, {52608, 293}, {52609, 299}, {52610, 294}, {52612, 305}, + {52613, 290}, {52614, 292}, {52616, 295}, {52617, 311}, {52618, 288}, {52620, 295}, {52621, 318}, {52622, 288}, + {52623, 291}, {52624, 288}, {52626, 291}, {52627, 295}, {52628, 311}, {52629, 312}, {52631, 308}, {52632, 296}, + {52633, 290}, {52634, 298}, {52636, 291}, {52637, 294}, {52638, 313}, {52640, 317}, {52642, 290}, {52643, 299}, + {52645, 306}, {52646, 293}, {52648, 295}, {52650, 301}, {52652, 302}, {52653, 298}, {52655, 289}, {52657, 299}, + {52659, 290}, {52661, 307}, {52663, 290}, {52665, 303}, {52668, 295}, {52671, 292}, {52673, 289}, {52677, 296}, + {52682, 295}, {52686, 293}, {52691, 297}, {52698, 292}, {52709, 290}, {52720, 288}, {52734, 290}, {52753, 289}, + {52758, 292}, {52763, 290}, {52768, 294}, {52773, 290}, {52777, 293}, {52780, 289}, {52784, 297}, {52788, 289}, + {52793, 288}, {52797, 291}, {52801, 288}, {52803, 291}, {52806, 293}, {52809, 298}, {52812, 291}, {52815, 289}, + {52820, 291}, {52824, 292}, {52827, 302}, {52832, 300}, {52838, 307}, {52842, 291}, {52847, 292}, {52850, 296}, + {52853, 291}, {52857, 299}, {52860, 302}, {52867, 289}, {52875, 290}, {52885, 295}, {52896, 289}, {52907, 288}, + {52916, 293}, {52923, 291}, {52931, 294}, {52944, 300}, {52955, 292}, {52958, 290}, {52959, 312}, {52960, 290}, + {52961, 290}, {52962, 303}, {52963, 288}, {52965, 311}, {52966, 314}, {52967, 305}, {52968, 292}, {52969, 300}, + {52970, 289}, {52971, 314}, {52972, 291}, {52973, 298}, {52974, 308}, {52975, 288}, {52976, 315}, {52978, 292}, + {52978, 291}, {52979, 312}, {52980, 296}, {52981, 292}, {52982, 296}, {52983, 292}, {52985, 291}, {52986, 316}, + {52986, 304}, {52988, 304}, {52988, 288}, {52989, 307}, {52990, 295}, {52991, 290}, {52992, 288}, {52993, 307}, + {52994, 308}, {52995, 301}, {52997, 290}, {52998, 288}, {52999, 303}, {53000, 293}, {53001, 289}, {53002, 291}, + {53003, 291}, {53005, 302}, {53006, 290}, {53007, 309}, {53009, 291}, {53010, 294}, {53011, 291}, {53013, 299}, + {53014, 290}, {53016, 305}, {53017, 290}, {53019, 290}, {53020, 290}, {53021, 298}, {53023, 292}, {53025, 291}, + {53026, 297}, {53028, 307}, {53030, 298}, {53033, 289}, {53035, 301}, {53037, 291}, {53040, 288}, {53042, 296}, + {53045, 293}, {53048, 307}, {53051, 296}, {53057, 291}, {53066, 292}, {53075, 288}, {53087, 302}, {53105, 293}, + {53108, 292}, {53111, 292}, {53114, 290}, {53117, 291}, {53120, 295}, {53122, 289}, {53124, 288}, {53127, 291}, + {53130, 291}, {53132, 289}, {53135, 291}, {53137, 296}, {53139, 288}, {53142, 288}, {53146, 294}, {53149, 289}, + {53152, 288}, {53154, 294}, {53158, 290}, {53160, 291}, {53163, 290}, {53166, 288}, {53168, 293}, {53171, 294}, + {53173, 292}, {53177, 300}, {53179, 288}, {53182, 302}, {53184, 293}, {53186, 288}, {53189, 289}, {53192, 294}, + {53197, 292}, {53204, 289}, {53213, 288}, {53223, 291}, {53238, 305}, {53252, 288}, {53253, 297}, {53255, 303}, + {53256, 296}, {53257, 308}, {53259, 291}, {53260, 289}, {53262, 298}, {53263, 294}, {53265, 297}, {53266, 289}, + {53267, 289}, {53269, 308}, {53270, 290}, {53272, 296}, {53273, 290}, {53274, 299}, {53275, 302}, {53277, 294}, + {53278, 293}, {53279, 305}, {53281, 311}, {53282, 314}, {53283, 292}, {53285, 292}, {53286, 302}, {53287, 314}, + {53289, 294}, {53290, 288}, {53292, 289}, {53293, 294}, {53295, 302}, {53296, 302}, {53298, 288}, {53299, 296}, + {53301, 293}, {53302, 289}, {53304, 291}, {53306, 304}, {53307, 301}, {53309, 288}, {53311, 306}, {53313, 296}, + {53315, 294}, {53317, 288}, {53318, 301}, {53321, 300}, {53324, 289}, {53326, 288}, {53328, 289}, {53330, 289}, + {53333, 297}, {53335, 289}, {53339, 296}, {53344, 292}, {53356, 293}, {53371, 290}, {53387, 292}, {53389, 294}, + {53392, 292}, {53394, 288}, {53396, 291}, {53398, 290}, {53400, 289}, {53403, 291}, {53405, 289}, {53408, 293}, + {53410, 288}, {53413, 292}, {53415, 290}, {53418, 293}, {53420, 294}, {53423, 289}, {53426, 297}, {53429, 295}, + {53432, 293}, {53434, 288}, {53437, 291}, {53440, 288}, {53443, 289}, {53446, 293}, {53449, 296}, {53452, 300}, + {53455, 291}, {53459, 291}, {53462, 292}, {53464, 296}, {53468, 288}, {53471, 294}, {53475, 293}, {53482, 288}, + {53494, 293}, {53511, 303}, {53526, 297}, {53528, 288}, {53530, 291}, {53532, 290}, {53534, 300}, {53536, 290}, + {53537, 298}, {53539, 314}, {53541, 303}, {53543, 293}, {53544, 289}, {53546, 304}, {53548, 297}, {53550, 299}, + {53551, 296}, {53553, 289}, {53555, 305}, {53557, 303}, {53558, 292}, {53560, 291}, {53562, 307}, {53564, 304}, + {53566, 289}, {53567, 289}, {53569, 295}, {53571, 294}, {53574, 306}, {53576, 295}, {53578, 292}, {53578, 115}, + {53581, 294}, {53583, 292}, {53585, 294}, {53587, 288}, {53590, 304}, {53592, 303}, {53595, 291}, {53598, 293}, + {53600, 296}, {53602, 291}, {53604, 301}, {53606, 291}, {53608, 291}, {53611, 295}, {53614, 290}, {53617, 292}, + {53622, 300}, {53632, 292}, {53641, 288}, {53661, 290}, {53665, 291}, {53666, 297}, {53668, 296}, {53670, 293}, + {53671, 291}, {53673, 289}, {53674, 292}, {53676, 290}, {53678, 299}, {53679, 291}, {53681, 291}, {53682, 293}, + {53684, 290}, {53685, 295}, {53687, 291}, {53688, 288}, {53690, 290}, {53692, 293}, {53693, 289}, {53694, 297}, + {53696, 302}, {53697, 289}, {53699, 301}, {53701, 288}, {53703, 296}, {53704, 290}, {53706, 291}, {53708, 288}, + {53709, 290}, {53711, 299}, {53713, 301}, {53715, 288}, {53717, 289}, {53718, 288}, {53720, 297}, {53722, 294}, + {53724, 298}, {53726, 293}, {53728, 289}, {53730, 296}, {53731, 290}, {53733, 296}, {53735, 292}, {53738, 292}, + {53740, 290}, {53741, 301}, {53743, 288}, {53745, 289}, {53748, 306}, {53750, 295}, {53752, 296}, {53755, 288}, + {53759, 289}, {53768, 297}, {53777, 291}, {53798, 303}, {53802, 290}, {53805, 301}, {53807, 288}, {53809, 297}, + {53812, 309}, {53814, 289}, {53816, 290}, {53818, 290}, {53820, 294}, {53822, 291}, {53824, 289}, {53826, 298}, + {53828, 291}, {53830, 292}, {53832, 292}, {53834, 289}, {53836, 289}, {53838, 290}, {53840, 296}, {53843, 303}, + {53845, 289}, {53847, 296}, {53850, 300}, {53852, 290}, {53854, 289}, {53857, 291}, {53860, 292}, {53862, 305}, + {53865, 291}, {53867, 292}, {53870, 289}, {53872, 295}, {53875, 288}, {53878, 291}, {53881, 288}, {53884, 291}, + {53887, 295}, {53891, 290}, {53895, 297}, {53905, 297}, {53921, 320}, {53939, 302}, {53942, 299}, {53944, 298}, + {53946, 306}, {53949, 294}, {53951, 292}, {53953, 290}, {53955, 297}, {53957, 294}, {53959, 291}, {53962, 303}, + {53964, 288}, {53966, 288}, {53968, 292}, {53970, 289}, {53973, 288}, {53975, 290}, {53977, 298}, {53979, 298}, + {53982, 293}, {53984, 296}, {53987, 291}, {53989, 301}, {53992, 293}, {53994, 294}, {53997, 291}, {53999, 290}, + {54002, 305}, {54004, 288}, {54006, 290}, {54008, 300}, {54011, 290}, {54013, 289}, {54016, 305}, {54018, 289}, + {54020, 294}, {54023, 295}, {54025, 293}, {54028, 290}, {54031, 303}, {54034, 289}, {54041, 290}, {54050, 288}, + {54067, 289}, {54080, 293}, {54082, 293}, {54084, 297}, {54086, 290}, {54087, 289}, {54089, 291}, {54091, 291}, + {54093, 289}, {54095, 293}, {54097, 288}, {54098, 302}, {54100, 291}, {54102, 299}, {54104, 294}, {54106, 300}, + {54107, 300}, {54109, 302}, {54111, 290}, {54113, 300}, {54114, 296}, {54116, 291}, {54118, 288}, {54120, 292}, + {54122, 293}, {54124, 300}, {54125, 289}, {54128, 290}, {54129, 296}, {54131, 291}, {54133, 288}, {54136, 306}, + {54138, 288}, {54139, 291}, {54142, 294}, {54144, 290}, {54146, 290}, {54148, 297}, {54150, 289}, {54153, 301}, + {54155, 290}, {54157, 305}, {54159, 294}, {54161, 298}, {54164, 297}, {54166, 292}, {54169, 300}, {54172, 297}, + {54175, 298}, {54183, 301}, {54190, 293}, {54214, 293}, {54220, 290}, {54222, 299}, {54224, 291}, {54226, 293}, + {54228, 300}, {54230, 293}, {54232, 293}, {54234, 308}, {54236, 296}, {54238, 296}, {54240, 289}, {54242, 297}, + {54244, 299}, {54246, 288}, {54248, 291}, {54250, 288}, {54252, 298}, {54254, 291}, {54256, 301}, {54258, 300}, + {54260, 293}, {54262, 296}, {54265, 298}, {54267, 288}, {54269, 290}, {54271, 288}, {54273, 293}, {54276, 289}, + {54278, 288}, {54280, 297}, {54282, 298}, {54284, 288}, {54286, 288}, {54288, 296}, {54291, 295}, {54294, 297}, + {54296, 289}, {54299, 292}, {54301, 288}, {54304, 291}, {54306, 291}, {54309, 297}, {54312, 295}, {54314, 296}, + {54318, 299}, {54329, 292}, {54341, 290}, {54358, 291}, {54360, 291}, {54362, 290}, {54365, 296}, {54367, 291}, + {54369, 300}, {54371, 293}, {54373, 296}, {54375, 290}, {54377, 289}, {54379, 296}, {54381, 302}, {54383, 290}, + {54385, 292}, {54388, 291}, {54389, 289}, {54392, 308}, {54394, 299}, {54396, 290}, {54398, 292}, {54401, 297}, + {54403, 292}, {54405, 299}, {54407, 294}, {54409, 291}, {54412, 308}, {54414, 288}, {54417, 298}, {54419, 303}, + {54421, 292}, {54424, 288}, {54426, 299}, {54428, 289}, {54431, 288}, {54434, 298}, {54437, 290}, {54439, 292}, + {54442, 292}, {54444, 298}, {54447, 291}, {54451, 293}, {54454, 290}, {54458, 292}, {54468, 298}, {54475, 299}, + {54498, 300}, {54500, 292}, {54502, 291}, {54504, 299}, {54507, 294}, {54509, 289}, {54511, 289}, {54513, 294}, + {54515, 289}, {54517, 293}, {54519, 292}, {54521, 294}, {54523, 289}, {54525, 288}, {54527, 293}, {54530, 296}, + {54532, 288}, {54535, 303}, {54537, 288}, {54539, 289}, {54541, 307}, {54544, 304}, {54546, 289}, {54548, 291}, + {54550, 292}, {54553, 289}, {54555, 291}, {54557, 292}, {54559, 296}, {54562, 291}, {54564, 288}, {54567, 305}, + {54570, 307}, {54573, 291}, {54575, 292}, {54578, 292}, {54581, 289}, {54583, 300}, {54585, 289}, {54588, 288}, + {54591, 292}, {54594, 290}, {54597, 290}, {54607, 292}, {54611, 290}, {54628, 304}, {54640, 292}, {54641, 294}, + {54643, 295}, {54645, 298}, {54647, 296}, {54649, 298}, {54651, 289}, {54652, 292}, {54654, 290}, {54656, 292}, + {54658, 296}, {54660, 290}, {54662, 297}, {54663, 291}, {54665, 309}, {54667, 294}, {54669, 290}, {54671, 299}, + {54673, 292}, {54675, 295}, {54677, 295}, {54679, 291}, {54681, 294}, {54683, 292}, {54685, 300}, {54687, 289}, + {54689, 302}, {54691, 289}, {54692, 292}, {54694, 288}, {54696, 295}, {54698, 289}, {54700, 290}, {54703, 289}, + {54704, 288}, {54707, 288}, {54708, 301}, {54710, 303}, {54712, 290}, {54715, 296}, {54717, 289}, {54719, 300}, + {54721, 301}, {54723, 292}, {54725, 297}, {54727, 289}, {54729, 290}, {54730, 92}, {54733, 290}, {54735, 302}, + {54737, 299}, {54740, 292}, {54750, 299}, {54753, 288}, {54758, 288}, {54781, 289}, {54783, 297}, {54785, 301}, + {54787, 299}, {54789, 288}, {54791, 290}, {54792, 290}, {54794, 301}, {54796, 295}, {54798, 296}, {54800, 300}, + {54803, 301}, {54806, 291}, {54808, 288}, {54810, 297}, {54814, 289}, {54817, 307}, {54819, 290}, {54821, 288}, + {54824, 294}, {54826, 298}, {54828, 295}, {54831, 290}, {54833, 290}, {54835, 295}, {54838, 295}, {54840, 300}, + {54843, 289}, {54846, 294}, {54848, 302}, {54851, 294}, {54853, 290}, {54856, 289}, {54858, 288}, {54861, 293}, + {54863, 289}, {54865, 291}, {54868, 299}, {54870, 291}, {54873, 290}, {54876, 289}, {54879, 300}, {54882, 297}, + {54885, 292}, {54895, 298}, {54899, 294}, {54915, 292}, {54926, 305}, {54929, 294}, {54931, 294}, {54933, 302}, + {54935, 294}, {54938, 293}, {54940, 291}, {54942, 295}, {54944, 292}, {54946, 288}, {54949, 296}, {54951, 288}, + {54954, 295}, {54957, 294}, {54960, 288}, {54963, 291}, {54965, 292}, {54967, 294}, {54969, 295}, {54972, 295}, + {54974, 302}, {54976, 288}, {54979, 289}, {54981, 297}, {54984, 310}, {54986, 304}, {54989, 290}, {54991, 303}, + {54994, 292}, {54996, 289}, {54999, 289}, {55001, 293}, {55004, 290}, {55006, 296}, {55008, 295}, {55010, 299}, + {55012, 288}, {55015, 290}, {55017, 289}, {55019, 299}, {55022, 288}, {55025, 294}, {55027, 293}, {55031, 295}, + {55039, 297}, {55042, 292}, {55048, 297}, {55069, 296}, {55071, 298}, {55074, 290}, {55075, 293}, {55077, 291}, + {55080, 293}, {55081, 292}, {55083, 293}, {55085, 301}, {55087, 302}, {55089, 289}, {55092, 302}, {55094, 301}, + {55097, 291}, {55100, 290}, {55102, 292}, {55105, 300}, {55107, 289}, {55109, 298}, {55112, 292}, {55113, 289}, + {55116, 292}, {55118, 289}, {55120, 294}, {55122, 291}, {55124, 300}, {55126, 288}, {55129, 292}, {55131, 293}, + {55133, 293}, {55135, 303}, {55137, 289}, {55139, 295}, {55142, 300}, {55144, 296}, {55146, 291}, {55148, 296}, + {55150, 290}, {55152, 290}, {55155, 290}, {55157, 288}, {55159, 292}, {55161, 292}, {55164, 304}, {55166, 294}, + {55169, 288}, {55171, 292}, {55174, 295}, {55183, 291}, {55186, 290}, {55190, 302}, {55207, 294}, {55214, 291}, + {55217, 291}, {55219, 288}, {55220, 289}, {55222, 291}, {55224, 298}, {55226, 302}, {55229, 301}, {55231, 310}, + {55233, 288}, {55235, 289}, {55238, 289}, {55240, 293}, {55243, 294}, {55247, 293}, {55250, 293}, {55252, 289}, + {55255, 301}, {55257, 291}, {55259, 290}, {55261, 304}, {55263, 289}, {55266, 304}, {55268, 291}, {55270, 292}, + {55273, 308}, {55275, 292}, {55277, 292}, {55279, 293}, {55281, 293}, {55283, 289}, {55286, 297}, {55288, 297}, + {55290, 290}, {55292, 294}, {55295, 303}, {55297, 295}, {55299, 292}, {55301, 291}, {55303, 293}, {55305, 304}, + {55308, 297}, {55310, 294}, {55313, 289}, {55315, 302}, {55318, 301}, {55320, 305}, {55330, 301}, {55332, 293}, + {55335, 289}, {55339, 290}, {55361, 292}, {55363, 294}, {55365, 294}, {55367, 300}, {55368, 290}, {55371, 299}, + {55373, 304}, {55375, 295}, {55377, 290}, {55380, 304}, {55382, 290}, {55385, 292}, {55388, 296}, {55391, 291}, + {55395, 291}, {55398, 296}, {55401, 300}, {55403, 292}, {55405, 288}, {55408, 288}, {55410, 289}, {55412, 295}, + {55415, 296}, {55417, 302}, {55419, 307}, {55422, 299}, {55424, 294}, {55427, 288}, {55429, 293}, {55432, 291}, + {55435, 300}, {55437, 298}, {55439, 293}, {55442, 289}, {55444, 303}, {55447, 297}, {55450, 289}, {55452, 292}, + {55455, 296}, {55457, 292}, {55460, 295}, {55463, 304}, {55466, 302}, {55469, 288}, {55478, 290}, {55480, 294}, + {55484, 288}, {55492, 295}, {55510, 291}, {55512, 290}, {55514, 288}, {55517, 296}, {55519, 288}, {55522, 302}, + {55524, 288}, {55527, 290}, {55530, 293}, {55534, 288}, {55537, 289}, {55542, 291}, {55546, 291}, {55548, 299}, + {55551, 289}, {55553, 291}, {55555, 293}, {55558, 290}, {55560, 289}, {55563, 298}, {55565, 291}, {55567, 296}, + {55570, 294}, {55572, 297}, {55575, 309}, {55577, 300}, {55580, 296}, {55582, 293}, {55584, 289}, {55587, 305}, + {55590, 294}, {55592, 299}, {55594, 288}, {55597, 290}, {55599, 303}, {55601, 291}, {55604, 303}, {55606, 301}, + {55608, 291}, {55610, 301}, {55612, 288}, {55614, 299}, {55617, 290}, {55624, 295}, {55628, 292}, {55631, 297}, + {55634, 299}, {55637, 299}, {55658, 292}, {55661, 294}, {55662, 301}, {55664, 289}, {55666, 289}, {55669, 298}, + {55671, 289}, {55674, 288}, {55676, 290}, {55680, 288}, {55683, 301}, {55687, 292}, {55691, 295}, {55695, 293}, + {55697, 288}, {55699, 294}, {55701, 290}, {55703, 308}, {55705, 289}, {55707, 290}, {55710, 304}, {55711, 289}, + {55713, 296}, {55716, 295}, {55717, 289}, {55719, 293}, {55722, 293}, {55724, 303}, {55726, 288}, {55728, 296}, + {55731, 314}, {55733, 298}, {55735, 294}, {55738, 308}, {55740, 291}, {55742, 296}, {55744, 290}, {55746, 299}, + {55748, 292}, {55751, 301}, {55753, 291}, {55755, 289}, {55757, 301}, {55759, 293}, {55761, 302}, {55763, 299}, + {55765, 299}, {55767, 290}, {55771, 301}, {55778, 296}, {55780, 294}, {55782, 303}, {55785, 289}, {55788, 295}, + {55808, 311}, {55812, 295}, {55814, 288}, {55816, 290}, {55818, 289}, {55821, 290}, {55823, 299}, {55825, 290}, + {55828, 292}, {55832, 293}, {55835, 293}, {55838, 298}, {55843, 289}, {55847, 301}, {55849, 289}, {55851, 307}, + {55853, 312}, {55855, 289}, {55857, 288}, {55859, 290}, {55861, 289}, {55863, 288}, {55865, 297}, {55867, 299}, + {55869, 305}, {55871, 292}, {55873, 297}, {55875, 289}, {55877, 295}, {55880, 297}, {55881, 292}, {55884, 297}, + {55886, 288}, {55888, 298}, {55890, 300}, {55892, 290}, {55894, 301}, {55896, 288}, {55898, 296}, {55901, 296}, + {55903, 288}, {55905, 305}, {55907, 299}, {55909, 298}, {55911, 294}, {55913, 301}, {55915, 294}, {55917, 304}, + {55920, 300}, {55922, 289}, {55925, 291}, {55931, 304}, {55934, 299}, {55936, 309}, {55938, 295}, {55941, 294}, + {55943, 288}, {55965, 297}, {55967, 294}, {55969, 292}, {55971, 290}, {55974, 289}, {55976, 290}, {55979, 288}, + {55982, 294}, {55986, 290}, {55990, 290}, {55994, 289}, {55999, 296}, {56002, 302}, {56004, 288}, {56006, 293}, + {56006, 56}, {56009, 294}, {56011, 295}, {56014, 303}, {56016, 298}, {56018, 289}, {56020, 297}, {56022, 290}, + {56025, 293}, {56027, 289}, {56029, 289}, {56031, 295}, {56034, 293}, {56036, 301}, {56038, 293}, {56041, 307}, + {56043, 294}, {56045, 292}, {56048, 288}, {56050, 289}, {56053, 302}, {56055, 299}, {56058, 297}, {56060, 310}, + {56063, 296}, {56065, 296}, {56068, 306}, {56070, 288}, {56072, 289}, {56075, 301}, {56077, 291}, {56080, 294}, + {56087, 292}, {56089, 289}, {56091, 289}, {56094, 290}, {56096, 291}, {56099, 295}, {56121, 290}, {56123, 298}, + {56126, 288}, {56129, 297}, {56132, 298}, {56135, 293}, {56140, 289}, {56145, 291}, {56152, 293}, {56156, 306}, + {56159, 291}, {56161, 298}, {56163, 288}, {56166, 289}, {56168, 309}, {56171, 295}, {56173, 289}, {56175, 292}, + {56177, 288}, {56179, 291}, {56182, 289}, {56185, 289}, {56187, 293}, {56189, 289}, {56192, 303}, {56194, 301}, + {56197, 307}, {56199, 295}, {56202, 296}, {56204, 288}, {56207, 288}, {56209, 299}, {56212, 293}, {56214, 293}, + {56217, 297}, {56219, 292}, {56222, 297}, {56224, 302}, {56226, 290}, {56228, 295}, {56231, 291}, {56233, 297}, + {56236, 289}, {56240, 288}, {56244, 294}, {56246, 303}, {56249, 296}, {56251, 296}, {56253, 299}, {56268, 319}, + {56279, 296}, {56281, 294}, {56284, 296}, {56288, 288}, {56292, 290}, {56297, 289}, {56302, 289}, {56308, 288}, + {56313, 290}, {56316, 288}, {56318, 293}, {56320, 289}, {56323, 290}, {56325, 290}, {56327, 299}, {56329, 292}, + {56331, 288}, {56333, 288}, {56335, 289}, {56338, 290}, {56340, 306}, {56342, 290}, {56344, 297}, {56347, 296}, + {56349, 290}, {56351, 299}, {56353, 294}, {56356, 292}, {56358, 308}, {56361, 303}, {56363, 290}, {56365, 292}, + {56368, 289}, {56370, 299}, {56372, 294}, {56375, 301}, {56377, 295}, {56379, 307}, {56382, 288}, {56384, 292}, + {56386, 292}, {56388, 290}, {56391, 299}, {56393, 295}, {56396, 305}, {56401, 291}, {56403, 291}, {56405, 290}, + {56407, 294}, {56409, 297}, {56411, 295}, {56413, 302}, {56422, 315}, {56438, 303}, {56440, 291}, {56444, 288}, + {56448, 292}, {56453, 289}, {56458, 294}, {56463, 288}, {56469, 292}, {56472, 288}, {56474, 297}, {56476, 299}, + {56478, 295}, {56480, 297}, {56482, 288}, {56485, 288}, {56486, 289}, {56488, 300}, {56490, 296}, {56492, 293}, + {56494, 303}, {56496, 296}, {56498, 288}, {56500, 295}, {56502, 293}, {56504, 290}, {56506, 291}, {56508, 292}, + {56510, 296}, {56512, 308}, {56514, 290}, {56516, 296}, {56518, 301}, {56521, 291}, {56522, 290}, {56524, 289}, + {56526, 289}, {56528, 296}, {56530, 288}, {56533, 308}, {56534, 292}, {56536, 298}, {56539, 290}, {56541, 289}, + {56543, 303}, {56545, 291}, {56547, 298}, {56548, 295}, {56551, 301}, {56553, 290}, {56556, 292}, {56559, 290}, + {56562, 295}, {56563, 306}, {56565, 301}, {56567, 289}, {56569, 299}, {56571, 288}, {56573, 297}, {56596, 291}, + {56599, 292}, {56603, 296}, {56606, 292}, {56610, 288}, {56615, 292}, {56621, 289}, {56627, 289}, {56632, 299}, + {56634, 304}, {56637, 293}, {56640, 290}, {56642, 290}, {56644, 301}, {56646, 290}, {56648, 297}, {56650, 301}, + {56652, 295}, {56655, 301}, {56656, 288}, {56658, 294}, {56660, 293}, {56662, 304}, {56664, 288}, {56666, 299}, + {56668, 290}, {56670, 302}, {56672, 288}, {56674, 294}, {56676, 293}, {56678, 290}, {56680, 288}, {56682, 293}, + {56684, 301}, {56686, 308}, {56688, 297}, {56690, 290}, {56692, 301}, {56694, 295}, {56697, 293}, {56699, 299}, + {56701, 300}, {56703, 288}, {56705, 288}, {56707, 290}, {56709, 295}, {56711, 297}, {56713, 307}, {56715, 292}, + {56718, 297}, {56719, 289}, {56722, 289}, {56725, 302}, {56727, 293}, {56729, 302}, {56731, 288}, {56733, 303}, + {56735, 293}, {56737, 305}, {56739, 300}, {56762, 294}, {56766, 291}, {56770, 295}, {56775, 289}, {56781, 292}, + {56788, 289}, {56795, 292}, {56798, 289}, {56801, 288}, {56805, 288}, {56808, 298}, {56810, 291}, {56812, 299}, + {56815, 289}, {56817, 309}, {56819, 297}, {56821, 293}, {56823, 298}, {56825, 299}, {56827, 305}, {56830, 302}, + {56832, 303}, {56834, 296}, {56836, 308}, {56839, 288}, {56841, 303}, {56843, 296}, {56845, 296}, {56848, 303}, + {56850, 300}, {56853, 290}, {56854, 290}, {56857, 295}, {56859, 296}, {56861, 292}, {56863, 301}, {56865, 294}, + {56868, 293}, {56870, 288}, {56872, 290}, {56874, 290}, {56877, 297}, {56879, 290}, {56882, 291}, {56884, 295}, + {56886, 302}, {56889, 289}, {56892, 294}, {56894, 297}, {56896, 298}, {56899, 290}, {56901, 301}, {56903, 301}, + {56905, 289}, {56927, 292}, {56932, 294}, {56936, 288}, {56942, 290}, {56949, 292}, {56957, 292}, {56964, 291}, + {56967, 296}, {56970, 290}, {56973, 288}, {56976, 301}, {56979, 293}, {56981, 297}, {56983, 294}, {56985, 296}, + {56987, 302}, {56989, 293}, {56991, 291}, {56994, 292}, {56996, 295}, {56998, 294}, {57000, 296}, {57002, 291}, + {57004, 288}, {57006, 309}, {57009, 289}, {57011, 292}, {57013, 293}, {57015, 288}, {57017, 296}, {57020, 314}, + {57022, 313}, {57024, 300}, {57026, 292}, {57028, 289}, {57030, 292}, {57033, 293}, {57035, 302}, {57037, 291}, + {57039, 296}, {57042, 294}, {57044, 290}, {57046, 304}, {57048, 294}, {57050, 300}, {57053, 293}, {57055, 291}, + {57058, 301}, {57060, 288}, {57062, 310}, {57065, 301}, {57067, 294}, {57069, 289}, {57071, 288}, {57074, 301}, + {57076, 305}, {57099, 298}, {57104, 297}, {57109, 289}, {57115, 292}, {57123, 290}, {57132, 288}, {57137, 293}, + {57141, 294}, {57144, 293}, {57148, 291}, {57151, 297}, {57154, 312}, {57156, 292}, {57158, 307}, {57161, 288}, + {57163, 309}, {57165, 291}, {57167, 297}, {57169, 288}, {57171, 310}, {57174, 309}, {57175, 297}, {57178, 292}, + {57180, 294}, {57182, 288}, {57184, 314}, {57186, 303}, {57189, 288}, {57191, 296}, {57194, 292}, {57196, 297}, + {57198, 301}, {57200, 295}, {57202, 289}, {57204, 290}, {57207, 296}, {57209, 293}, {57212, 298}, {57214, 288}, + {57216, 293}, {57219, 292}, {57221, 290}, {57223, 300}, {57225, 295}, {57227, 290}, {57230, 292}, {57232, 300}, + {57234, 301}, {57237, 297}, {57239, 294}, {57241, 288}, {57243, 293}, {57246, 301}, {57255, 319}, {57270, 304}, + {57275, 296}, {57280, 289}, {57287, 289}, {57295, 288}, {57305, 288}, {57309, 293}, {57313, 290}, {57317, 295}, + {57320, 311}, {57323, 293}, {57325, 288}, {57328, 289}, {57330, 299}, {57333, 292}, {57335, 296}, {57337, 292}, + {57339, 296}, {57340, 215}, {57343, 303}, {57345, 300}, {57347, 290}, {57350, 314}, {57352, 293}, {57354, 291}, + {57356, 290}, {57358, 289}, {57360, 291}, {57362, 296}, {57364, 291}, {57367, 291}, {57369, 296}, {57371, 307}, + {57373, 288}, {57375, 296}, {57377, 291}, {57380, 293}, {57382, 301}, {57384, 289}, {57387, 297}, {57389, 288}, + {57391, 304}, {57393, 289}, {57395, 295}, {57397, 300}, {57400, 298}, {57402, 294}, {57404, 293}, {57406, 289}, + {57409, 296}, {57411, 290}, {57413, 299}, {57416, 291}, {57418, 296}, {57428, 296}, {57442, 288}, {57444, 289}, + {57451, 288}, {57458, 293}, {57466, 288}, {57476, 289}, {57480, 291}, {57486, 291}, {57490, 292}, {57494, 294}, + {57497, 295}, {57499, 296}, {57502, 312}, {57506, 304}, {57507, 297}, {57509, 292}, {57511, 289}, {57513, 292}, + {57516, 293}, {57518, 291}, {57520, 294}, {57522, 293}, {57524, 289}, {57526, 291}, {57528, 295}, {57530, 288}, + {57532, 302}, {57533, 299}, {57536, 294}, {57538, 288}, {57539, 299}, {57542, 292}, {57544, 301}, {57545, 291}, + {57548, 291}, {57550, 300}, {57552, 290}, {57554, 297}, {57556, 304}, {57558, 296}, {57560, 288}, {57562, 308}, + {57564, 291}, {57567, 305}, {57569, 291}, {57571, 304}, {57573, 290}, {57576, 288}, {57578, 294}, {57580, 304}, + {57582, 294}, {57584, 289}, {57586, 298}, {57588, 307}, {57590, 299}, {57592, 294}, {57595, 290}, {57597, 290}, + {57616, 299}, {57622, 297}, {57625, 301}, {57628, 292}, {57634, 292}, {57641, 292}, {57648, 288}, {57658, 289}, + {57662, 291}, {57667, 293}, {57671, 288}, {57675, 290}, {57678, 291}, {57681, 299}, {57683, 316}, {57686, 293}, + {57689, 291}, {57692, 307}, {57694, 306}, {57696, 289}, {57698, 289}, {57700, 305}, {57702, 297}, {57704, 300}, + {57706, 294}, {57707, 303}, {57709, 295}, {57711, 303}, {57713, 299}, {57714, 307}, {57716, 289}, {57718, 293}, + {57720, 299}, {57721, 288}, {57723, 300}, {57725, 296}, {57727, 317}, {57729, 312}, {57730, 295}, {57732, 292}, + {57734, 296}, {57736, 296}, {57738, 289}, {57740, 309}, {57741, 295}, {57743, 293}, {57745, 297}, {57747, 309}, + {57749, 301}, {57751, 306}, {57753, 289}, {57754, 304}, {57756, 296}, {57758, 289}, {57760, 305}, {57762, 291}, + {57764, 292}, {57765, 292}, {57767, 303}, {57769, 288}, {57771, 300}, {57773, 293}, {57775, 289}, {57777, 292}, + {57779, 297}, {57781, 288}, {57788, 291}, {57803, 289}, {57807, 298}, {57810, 301}, {57812, 292}, {57818, 290}, + {57825, 289}, {57835, 288}, {57845, 290}, {57850, 294}, {57854, 290}, {57859, 288}, {57863, 290}, {57867, 291}, + {57870, 294}, {57873, 295}, {57875, 290}, {57878, 288}, {57880, 292}, {57883, 304}, {57885, 297}, {57886, 296}, + {57888, 298}, {57890, 307}, {57892, 301}, {57894, 290}, {57896, 297}, {57898, 288}, {57899, 292}, {57901, 312}, + {57903, 302}, {57905, 303}, {57907, 300}, {57909, 292}, {57910, 293}, {57912, 290}, {57914, 301}, {57916, 296}, + {57918, 314}, {57920, 291}, {57922, 296}, {57923, 290}, {57925, 292}, {57928, 311}, {57929, 301}, {57931, 296}, + {57933, 298}, {57935, 303}, {57937, 296}, {57939, 289}, {57941, 288}, {57942, 292}, {57944, 305}, {57946, 290}, + {57948, 288}, {57950, 310}, {57952, 294}, {57953, 289}, {57955, 290}, {57957, 290}, {57959, 292}, {57961, 294}, + {57975, 301}, {57982, 295}, {57987, 307}, {57989, 294}, {57990, 301}, {57995, 291}, {58004, 293}, {58015, 300}, + {58023, 289}, {58029, 292}, {58034, 294}, {58038, 297}, {58042, 288}, {58046, 289}, {58049, 305}, {58052, 295}, + {58054, 289}, {58057, 294}, {58060, 295}, {58062, 291}, {58063, 288}, {58065, 292}, {58067, 306}, {58069, 290}, + {58071, 304}, {58073, 292}, {58075, 299}, {58077, 289}, {58079, 288}, {58081, 297}, {58083, 303}, {58084, 288}, + {58086, 307}, {58088, 296}, {58090, 306}, {58091, 303}, {58093, 294}, {58095, 293}, {58097, 295}, {58098, 290}, + {58100, 290}, {58102, 291}, {58103, 295}, {58105, 291}, {58107, 291}, {58108, 288}, {58110, 296}, {58112, 303}, + {58114, 289}, {58115, 291}, {58118, 292}, {58119, 296}, {58121, 298}, {58123, 294}, {58125, 299}, {58126, 292}, + {58128, 290}, {58130, 299}, {58132, 298}, {58133, 288}, {58135, 294}, {58137, 289}, {58139, 307}, {58141, 298}, + {58161, 291}, {58164, 294}, {58168, 288}, {58170, 295}, {58172, 296}, {58174, 302}, {58179, 288}, {58187, 288}, + {58196, 288}, {58205, 288}, {58211, 288}, {58217, 295}, {58221, 290}, {58225, 288}, {58229, 290}, {58232, 296}, + {58235, 296}, {58238, 303}, {58241, 304}, {58244, 292}, {58246, 294}, {58247, 308}, {58249, 316}, {58251, 302}, + {58253, 291}, {58254, 288}, {58257, 305}, {58259, 304}, {58261, 296}, {58263, 290}, {58265, 297}, {58267, 296}, + {58268, 291}, {58270, 294}, {58271, 288}, {58273, 294}, {58274, 294}, {58276, 315}, {58278, 290}, {58279, 297}, + {58281, 288}, {58283, 300}, {58285, 288}, {58286, 309}, {58288, 308}, {58290, 288}, {58292, 303}, {58293, 296}, + {58295, 295}, {58297, 293}, {58299, 305}, {58301, 290}, {58303, 308}, {58305, 289}, {58307, 309}, {58309, 305}, + {58310, 293}, {58312, 300}, {58314, 289}, {58315, 289}, {58317, 307}, {58319, 307}, {58321, 299}, {58323, 302}, + {58324, 298}, {58326, 293}, {58344, 291}, {58350, 297}, {58354, 293}, {58356, 290}, {58359, 299}, {58361, 290}, + {58366, 289}, {58375, 289}, {58387, 290}, {58395, 290}, {58401, 288}, {58406, 289}, {58411, 293}, {58414, 290}, + {58419, 289}, {58422, 295}, {58425, 290}, {58428, 292}, {58430, 293}, {58432, 296}, {58434, 290}, {58435, 289}, + {58437, 290}, {58439, 293}, {58441, 288}, {58443, 289}, {58446, 296}, {58448, 296}, {58450, 297}, {58452, 297}, + {58453, 295}, {58455, 296}, {58456, 289}, {58458, 292}, {58459, 290}, {58461, 288}, {58463, 307}, {58464, 301}, + {58466, 291}, {58468, 316}, {58469, 297}, {58471, 302}, {58473, 299}, {58474, 299}, {58476, 292}, {58478, 289}, + {58480, 292}, {58482, 293}, {58484, 293}, {58486, 289}, {58488, 293}, {58490, 290}, {58492, 290}, {58493, 290}, + {58495, 299}, {58496, 295}, {58498, 305}, {58500, 293}, {58501, 299}, {58503, 290}, {58505, 289}, {58507, 296}, + {58509, 302}, {58511, 300}, {58526, 292}, {58534, 294}, {58537, 290}, {58540, 291}, {58543, 288}, {58545, 298}, + {58550, 288}, {58558, 289}, {58570, 297}, {58579, 290}, {58585, 289}, {58591, 294}, {58595, 294}, {58600, 295}, + {58603, 290}, {58606, 297}, {58609, 293}, {58612, 289}, {58613, 297}, {58615, 292}, {58617, 292}, {58618, 238}, + {58620, 290}, {58622, 290}, {58625, 289}, {58628, 292}, {58630, 293}, {58632, 308}, {58634, 289}, {58635, 292}, + {58637, 297}, {58638, 292}, {58640, 288}, {58642, 293}, {58643, 292}, {58645, 309}, {58646, 289}, {58648, 310}, + {58649, 308}, {58651, 288}, {58653, 305}, {58654, 288}, {58656, 290}, {58658, 297}, {58660, 297}, {58662, 296}, + {58663, 291}, {58665, 292}, {58668, 290}, {58670, 293}, {58672, 293}, {58673, 290}, {58675, 288}, {58676, 291}, + {58678, 289}, {58680, 294}, {58681, 288}, {58683, 297}, {58685, 288}, {58687, 301}, {58689, 310}, {58690, 288}, + {58692, 294}, {58694, 304}, {58709, 296}, {58719, 289}, {58721, 291}, {58725, 297}, {58728, 295}, {58731, 295}, + {58733, 293}, {58738, 291}, {58745, 292}, {58754, 291}, {58764, 289}, {58771, 291}, {58777, 290}, {58781, 291}, + {58785, 292}, {58790, 290}, {58793, 291}, {58797, 300}, {58801, 288}, {58803, 302}, {58804, 288}, {58806, 288}, + {58808, 296}, {58810, 301}, {58812, 303}, {58815, 297}, {58818, 292}, {58820, 303}, {58823, 292}, {58824, 296}, + {58825, 290}, {58827, 290}, {58829, 316}, {58831, 314}, {58832, 292}, {58834, 302}, {58836, 301}, {58837, 298}, + {58838, 292}, {58840, 303}, {58842, 295}, {58843, 298}, {58845, 291}, {58846, 288}, {58849, 301}, {58851, 297}, + {58852, 294}, {58855, 289}, {58857, 290}, {58859, 293}, {58862, 305}, {58864, 311}, {58866, 297}, {58868, 288}, + {58869, 288}, {58871, 293}, {58873, 304}, {58874, 295}, {58876, 298}, {58878, 288}, {58880, 295}, {58882, 304}, + {58884, 298}, {58889, 289}, {58902, 293}, {58911, 288}, {58914, 289}, {58918, 292}, {58921, 291}, {58924, 297}, + {58926, 295}, {58934, 293}, {58945, 295}, {58955, 291}, {58962, 293}, {58968, 290}, {58972, 288}, {58977, 291}, + {58981, 289}, {58986, 290}, {58988, 300}, {58990, 293}, {58993, 290}, {58995, 293}, {58998, 289}, {59002, 296}, + {59004, 293}, {59006, 298}, {59008, 306}, {59010, 292}, {59012, 288}, {59014, 295}, {59015, 299}, {59017, 292}, + {59019, 289}, {59020, 292}, {59022, 309}, {59024, 289}, {59026, 303}, {59028, 291}, {59030, 288}, {59032, 289}, + {59035, 289}, {59037, 297}, {59039, 297}, {59042, 292}, {59044, 293}, {59046, 290}, {59048, 292}, {59050, 295}, + {59052, 299}, {59054, 295}, {59056, 289}, {59058, 290}, {59060, 289}, {59062, 299}, {59064, 296}, {59070, 298}, + {59082, 289}, {59090, 292}, {59093, 292}, {59096, 293}, {59099, 296}, {59102, 295}, {59107, 290}, {59116, 292}, + {59126, 288}, {59133, 290}, {59138, 288}, {59143, 288}, {59147, 292}, {59151, 289}, {59154, 289}, {59158, 290}, + {59161, 290}, {59164, 297}, {59166, 300}, {59168, 292}, {59171, 288}, {59173, 289}, {59176, 292}, {59179, 293}, + {59182, 289}, {59184, 288}, {59186, 291}, {59187, 291}, {59189, 295}, {59191, 302}, {59193, 288}, {59194, 289}, + {59196, 288}, {59198, 299}, {59199, 294}, {59201, 298}, {59203, 299}, {59204, 307}, {59206, 288}, {59208, 288}, + {59210, 298}, {59212, 296}, {59213, 290}, {59215, 292}, {59218, 293}, {59220, 289}, {59222, 290}, {59224, 292}, + {59226, 291}, {59228, 290}, {59229, 301}, {59231, 292}, {59233, 302}, {59234, 294}, {59236, 292}, {59238, 288}, + {59240, 291}, {59241, 288}, {59243, 301}, {59245, 292}, {59251, 290}, {59261, 290}, {59268, 293}, {59276, 288}, + {59279, 288}, {59282, 294}, {59286, 290}, {59288, 289}, {59291, 290}, {59294, 288}, {59300, 292}, {59309, 291}, + {59318, 295}, {59325, 289}, {59330, 290}, {59335, 290}, {59339, 291}, {59343, 288}, {59346, 288}, {59350, 291}, + {59354, 295}, {59356, 294}, {59358, 288}, {59360, 293}, {59362, 291}, {59364, 289}, {59367, 293}, {59369, 296}, + {59372, 289}, {59374, 297}, {59376, 295}, {59378, 301}, {59380, 291}, {59382, 293}, {59384, 292}, {59386, 301}, + {59387, 298}, {59389, 294}, {59391, 295}, {59393, 292}, {59395, 293}, {59396, 292}, {59399, 293}, {59401, 290}, + {59403, 290}, {59404, 290}, {59406, 292}, {59408, 295}, {59411, 291}, {59413, 289}, {59415, 296}, {59417, 288}, + {59418, 288}, {59420, 294}, {59422, 290}, {59424, 296}, {59425, 294}, {59427, 292}, {59429, 294}, {59431, 291}, + {59433, 297}, {59434, 289}, {59436, 296}, {59440, 290}, {59449, 292}, {59456, 289}, {59462, 289}, {59468, 290}, + {59471, 288}, {59475, 297}, {59477, 289}, {59480, 290}, {59482, 288}, {59485, 293}, {59492, 288}, {59500, 288}, + {59509, 289}, {59514, 288}, {59519, 288}, {59525, 289}, {59529, 294}, {59533, 297}, {59536, 289}, {59539, 288}, + {59543, 291}, {59545, 292}, {59547, 294}, {59549, 291}, {59551, 296}, {59554, 292}, {59557, 294}, {59560, 274}, + {59563, 290}, {59565, 294}, {59567, 296}, {59569, 304}, {59570, 290}, {59572, 289}, {59574, 298}, {59576, 292}, + {59578, 290}, {59580, 290}, {59582, 289}, {59583, 292}, {59585, 290}, {59587, 291}, {59589, 291}, {59591, 288}, + {59594, 290}, {59596, 291}, {59598, 294}, {59600, 300}, {59602, 288}, {59605, 289}, {59606, 293}, {59608, 291}, + {59609, 289}, {59611, 293}, {59613, 292}, {59614, 292}, {59616, 295}, {59618, 295}, {59619, 289}, {59621, 288}, + {59623, 288}, {59624, 290}, {59626, 288}, {59633, 290}, {59641, 291}, {59647, 289}, {59652, 295}, {59658, 288}, + {59661, 293}, {59665, 295}, {59668, 292}, {59671, 289}, {59674, 294}, {59676, 289}, {59679, 289}, {59685, 296}, + {59692, 292}, {59700, 288}, {59706, 290}, {59711, 290}, {59716, 288}, {59720, 289}, {59724, 294}, {59728, 289}, + {59731, 290}, {59734, 290}, {59736, 291}, {59738, 291}, {59740, 292}, {59742, 290}, {59745, 291}, {59748, 289}, + {59751, 288}, {59753, 288}, {59756, 294}, {59758, 294}, {59760, 291}, {59762, 294}, {59763, 288}, {59765, 290}, + {59767, 289}, {59769, 296}, {59771, 290}, {59773, 289}, {59775, 295}, {59777, 288}, {59779, 291}, {59781, 293}, + {59783, 295}, {59785, 292}, {59788, 289}, {59790, 294}, {59792, 290}, {59794, 292}, {59797, 297}, {59799, 290}, + {59801, 288}, {59803, 291}, {59804, 291}, {59806, 288}, {59808, 294}, {59810, 292}, {59812, 289}, {59814, 288}, + {59816, 288}, {59822, 299}, {59830, 292}, {59836, 295}, {59841, 289}, {59847, 293}, {59850, 290}, {59854, 288}, + {59857, 292}, {59859, 289}, {59862, 288}, {59864, 288}, {59871, 292}, {59878, 302}, {59886, 289}, {59892, 288}, + {59897, 292}, {59901, 288}, {59905, 290}, {59909, 291}, {59913, 288}, {59917, 289}, {59919, 290}, {59921, 288}, + {59924, 289}, {59926, 289}, {59928, 292}, {59932, 296}, {59934, 289}, {59937, 291}, {59939, 291}, {59940, 292}, + {59942, 292}, {59944, 288}, {59946, 293}, {59948, 290}, {59950, 292}, {59952, 290}, {59954, 288}, {59956, 290}, + {59958, 289}, {59960, 293}, {59962, 292}, {59964, 294}, {59967, 292}, {59969, 292}, {59971, 290}, {59973, 290}, + {59975, 288}, {59978, 289}, {59979, 293}, {59981, 291}, {59984, 292}, {59985, 296}, {59987, 293}, {59989, 289}, + {59991, 290}, {59993, 292}, {59995, 290}, {59997, 290}, {60002, 289}, {60008, 290}, {60015, 288}, {60018, 288}, + {60022, 293}, {60026, 290}, {60031, 291}, {60034, 288}, {60036, 291}, {60039, 288}, {60042, 295}, {60044, 293}, + {60047, 288}, {60049, 289}, {60054, 288}, {60060, 290}, {60066, 289}, {60073, 290}, {60078, 289}, {60082, 289}, + {60086, 289}, {60090, 291}, {60094, 299}, {60097, 291}, {60100, 289}, {60104, 289}, {60106, 289}, {60108, 293}, + {60110, 291}, {60113, 292}, {60115, 291}, {60118, 289}, {60120, 288}, {60123, 288}, {60125, 290}, {60127, 290}, + {60129, 291}, {60131, 293}, {60132, 290}, {60134, 291}, {60136, 290}, {60138, 288}, {60140, 294}, {60142, 288}, + {60143, 289}, {60145, 288}, {60147, 295}, {60149, 290}, {60151, 293}, {60153, 290}, {60155, 290}, {60157, 293}, + {60159, 289}, {60161, 293}, {60163, 290}, {60166, 291}, {60167, 288}, {60169, 295}, {60171, 288}, {60173, 291}, + {60175, 288}, {60177, 293}, {60178, 289}, {60180, 289}, {60182, 289}, {60184, 288}, {60186, 291}, {60192, 288}, + {60199, 291}, {60203, 288}, {60207, 290}, {60210, 288}, {60211, 33}, {60215, 289}, {60219, 290}, {60222, 288}, + {60225, 291}, {60228, 289}, {60230, 291}, {60232, 290}, {60234, 288}, {60236, 292}, {60241, 289}, {60246, 295}, + {60253, 299}, {60260, 290}, {60265, 291}, {60269, 289}, {60273, 290}, {60277, 289}, {60280, 292}, {60284, 291}, + {60287, 289}, {60289, 288}, {60291, 292}, {60294, 290}, {60296, 289}, {60299, 290}, {60302, 291}, {60304, 289}, + {60307, 291}, {60309, 296}, {60311, 290}, {60313, 294}, {60314, 293}, {60317, 290}, {60318, 290}, {60320, 290}, + {60322, 288}, {60324, 291}, {60326, 288}, {60327, 289}, {60330, 290}, {60331, 292}, {60333, 289}, {60335, 295}, + {60337, 288}, {60339, 290}, {60342, 289}, {60344, 290}, {60346, 291}, {60348, 289}, {60349, 291}, {60351, 289}, + {60353, 288}, {60355, 290}, {60357, 292}, {60359, 293}, {60361, 294}, {60363, 293}, {60365, 293}, {60371, 291}, + {60376, 289}, {60382, 288}, {60385, 290}, {60389, 288}, {60393, 294}, {60398, 293}, {60400, 289}, {60403, 289}, + {60406, 290}, {60408, 290}, {60410, 291}, {60413, 290}, {60415, 288}, {60420, 288}, {60426, 292}, {60433, 294}, + {60439, 288}, {60444, 289}, {60449, 290}, {60453, 290}, {60457, 289}, {60460, 289}, {60464, 291}, {60466, 290}, + {60468, 292}, {60471, 290}, {60474, 288}, {60477, 289}, {60480, 288}, {60482, 289}, {60485, 290}, {60487, 292}, + {60489, 291}, {60491, 289}, {60493, 290}, {60495, 291}, {60497, 293}, {60499, 290}, {60501, 290}, {60503, 290}, + {60505, 288}, {60507, 290}, {60509, 291}, {60511, 289}, {60513, 289}, {60515, 288}, {60516, 288}, {60519, 289}, + {60521, 292}, {60523, 288}, {60525, 288}, {60527, 289}, {60529, 290}, {60530, 290}, {60532, 290}, {60534, 293}, + {60536, 291}, {60538, 292}, {60540, 294}, {60544, 289}, {60548, 288}, {60554, 292}, {60559, 289}, {60563, 289}, + {60566, 290}, {60569, 290}, {60573, 288}, {60577, 289}, {60580, 291}, {60583, 290}, {60586, 292}, {60588, 290}, + {60591, 291}, {60593, 289}, {60595, 291}, {60601, 293}, {60607, 291}, {60614, 289}, {60619, 288}, {60624, 288}, + {60628, 292}, {60632, 289}, {60636, 289}, {60639, 291}, {60642, 290}, {60645, 288}, {60647, 290}, {60650, 289}, + {60652, 291}, {60655, 290}, {60658, 288}, {60661, 290}, {60663, 290}, {60665, 293}, {60667, 289}, {60669, 289}, + {60671, 288}, {60673, 288}, {60675, 290}, {60677, 292}, {60680, 290}, {60681, 289}, {60683, 289}, {60686, 288}, + {60687, 292}, {60689, 295}, {60691, 288}, {60694, 288}, {60695, 289}, {60698, 289}, {60700, 290}, {60702, 288}, + {60704, 288}, {60706, 288}, {60708, 288}, {60710, 288}, {60712, 288}, {60714, 288}, {60716, 293}, {60718, 291}, + {60721, 294}, {60725, 289}, {60729, 293}, {60733, 293}, {60737, 291}, {60741, 291}, {60743, 288}, {60746, 288}, + {60749, 290}, {60752, 291}, {60754, 290}, {60758, 292}, {60760, 290}, {60762, 290}, {60765, 289}, {60767, 288}, + {60769, 207}, {60771, 293}, {60773, 288}, {60775, 289}, {60777, 290}, {60781, 288}, {60787, 289}, {60793, 288}, + {60800, 292}, {60805, 288}, {60808, 288}, {60812, 289}, {60816, 288}, {60819, 288}, {60822, 288}, {60826, 294}, + {60828, 289}, {60831, 290}, {60833, 291}, {60836, 288}, {60839, 289}, {60841, 289}, {60844, 289}, {60846, 289}, + {60848, 289}, {60850, 293}, {60853, 291}, {60855, 292}, {60857, 288}, {60859, 290}, {60861, 289}, {60863, 290}, + {60864, 289}, {60866, 289}, {60868, 288}, {60870, 288}, {60872, 289}, {60873, 289}, {60875, 289}, {60878, 289}, + {60879, 289}, {60882, 288}, {60883, 291}, {60886, 292}, {60888, 289}, {60890, 290}, {60892, 289}, {60894, 288}, + {60896, 289}, {60897, 290}, {60900, 291}, {60902, 290}, {60906, 289}, {60910, 290}, {60914, 289}, {60918, 289}, + {60922, 291}, {60925, 289}, {60928, 289}, {60931, 290}, {60934, 295}, {60938, 288}, {60940, 290}, {60942, 288}, + {60945, 288}, {60948, 289}, {60950, 291}, {60952, 289}, {60954, 290}, {60959, 290}, {60964, 288}, {60971, 308}, + {60978, 298}, {60982, 293}, {60987, 290}, {60991, 291}, {60995, 292}, {60999, 290}, {61001, 293}, {61003, 288}, + {61005, 293}, {61007, 288}, {61010, 289}, {61012, 293}, {61014, 290}, {61016, 289}, {61018, 293}, {61020, 291}, + {61021, 289}, {61023, 290}, {61025, 293}, {61027, 288}, {61028, 293}, {61030, 289}, {61032, 294}, {61034, 288}, + {61035, 292}, {61037, 290}, {61038, 289}, {61040, 288}, {61042, 288}, {61043, 290}, {61045, 292}, {61046, 291}, + {61048, 289}, {61050, 289}, {61051, 289}, {61053, 289}, {61055, 288}, {61057, 289}, {61058, 290}, {61060, 290}, + {61062, 290}, {61064, 293}, {61066, 291}, {61067, 291}, {61071, 290}, {61074, 288}, {61077, 292}, {61080, 288}, + {61084, 292}, {61086, 288}, {61089, 290}, {61091, 292}, {61094, 288}, {61098, 288}, {61102, 289}, {61107, 292}, + {61110, 288}, {61114, 289}, {61117, 288}, {61121, 291}, {61124, 288}, {61127, 288}, {61130, 294}, {61133, 288}, + {61138, 288}, {61144, 300}, {61152, 295}, {61158, 300}, {61165, 296}, {61171, 290}, {61177, 288}, {61184, 289}, + {61189, 293}, {61195, 289}, {61199, 288}, {61205, 294}, {61210, 290}, {61214, 288}, {61219, 288}, {61223, 288}, + {61228, 291}, {61233, 289}, {61238, 290}, {61242, 291}, {61247, 289}, {61250, 288}, {61252, 293}, {61255, 292}, + {61258, 291}, {61260, 290}, {61263, 288}, {61265, 291}, {61267, 290}, {61269, 288}, {61272, 289}, {61274, 290}, + {61276, 288}, {61279, 289}, {61281, 289}, {61284, 291}, {61287, 293}, {61290, 288}, {61292, 290}, {61295, 289}, + {61296, 290}, {61299, 291}, {61301, 289}, {61304, 294}, {61306, 291}, {61307, 289}, {61311, 293}, {61314, 288}, + {61317, 288}, {61319, 292}, {61323, 292}, {61325, 297}, {61328, 288}, {61331, 290}, {61334, 291}, {61336, 288}, + {61339, 289}, {61342, 290}, {61344, 224}, {61347, 289}, {61349, 289}, {61352, 288}, {61356, 288}, {61358, 290}, + {61360, 290}, {61363, 288}, {61365, 290}, {61368, 288}, {61370, 290}, {61373, 290}, {61376, 289}, {61379, 291}, + {61382, 288}, {61385, 288}, {61387, 291}, {61389, 291}, {61392, 291}, {61394, 290}, {61396, 292}, {61398, 294}, + {61401, 288}, {61403, 289}, {61405, 292}, {61407, 290}, {61410, 289}, {61412, 289}, {61415, 291}, {61417, 288}, + {61421, 289}, {61424, 289}, {61427, 288}, {61430, 291}, {61433, 289}, {61435, 290}, {61438, 288}, {61441, 291}, + {61444, 293}, {61447, 290}, {61450, 289}, {61452, 288}, {61455, 288}, {61458, 288}, {61461, 294}, {61464, 289}, + {61468, 289}, {61470, 288}, {61473, 289}, {61476, 289}, {61479, 291}, {61481, 290}, {61485, 288}, {61487, 289}, + {61492, 289}, {61500, 291}, {61509, 289}, {61518, 293}, {61526, 293}, {61535, 289}, {61544, 292}, {61552, 290}, + {61559, 292}, {61564, 288}, {61570, 300}, {61575, 290}, {61581, 290}, {61586, 288}, {61592, 290}, {61597, 292}, + {61601, 289}, {61606, 290}, {61611, 288}, {61615, 289}, {61619, 291}, {61623, 290}, {61628, 289}, {61632, 289}, + {61636, 291}, {61642, 289}, {61646, 290}, {61650, 288}, {61654, 288}, {61657, 290}, {61659, 288}, {61661, 291}, + {61664, 292}, {61667, 289}, {61669, 291}, {61671, 290}, {61674, 289}, {61676, 289}, {61678, 289}, {61681, 288}, + {61683, 291}, {61686, 291}, {61690, 292}, {61693, 292}, {61696, 288}, {61699, 289}, {61703, 289}, {61704, 291}, + {61706, 288}, {61708, 289}, {61710, 291}, {61713, 289}, {61715, 290}, {61718, 292}, {61719, 290}, {61722, 288}, + {61724, 290}, {61726, 288}, {61728, 290}, {61731, 292}, {61733, 289}, {61735, 290}, {61738, 292}, {61739, 294}, + {61742, 290}, {61744, 291}, {61747, 291}, {61749, 290}, {61752, 289}, {61754, 288}, {61757, 289}, {61759, 288}, + {61762, 290}, {61766, 288}, {61769, 288}, {61772, 291}, {61774, 289}, {61778, 289}, {61781, 294}, {61784, 289}, + {61786, 292}, {61789, 290}, {61791, 292}, {61794, 294}, {61796, 295}, {61800, 291}, {61803, 291}, {61806, 289}, + {61808, 288}, {61813, 292}, {61818, 289}, {61822, 288}, {61826, 288}, {61829, 290}, {61832, 294}, {61834, 293}, + {61837, 291}, {61841, 291}, {61845, 288}, {61848, 288}, {61852, 291}, {61854, 289}, {61858, 289}, {61862, 288}, + {61866, 289}, {61870, 289}, {61873, 295}, {61875, 288}, {61878, 288}, {61879, 288}, {61882, 289}, {61884, 288}, + {61885, 288}, {61887, 288}, {61889, 290}, {61891, 289}, {61893, 290}, {61894, 288}, {61896, 289}, {61899, 289}, + {61901, 291}, {61903, 289}, {61906, 292}, {61909, 291}, {61913, 290}, {61915, 289}, {61917, 289}, {61921, 289}, + {61923, 293}, {61925, 290}, {61928, 289}, {61930, 292}, {61933, 291}, {61935, 288}, {61938, 294}, {61940, 292}, + {61942, 289}, {61946, 292}, {61948, 288}, {61950, 291}, {61952, 288}, {61955, 293}, {61958, 289}, {61960, 291}, + {61962, 289}, {61964, 291}, {61967, 290}, {61969, 290}, {61973, 292}, {61978, 290}, {61983, 293}, {61987, 289}, + {61992, 295}, {61996, 289}, {62000, 291}, {62005, 293}, {62009, 293}, {62013, 288}, {62018, 290}, {62022, 288}, + {62027, 291}, {62032, 289}, {62036, 290}, {62042, 290}, {62047, 288}, {62051, 291}, {62055, 290}, {62058, 288}, + {62062, 291}, {62066, 291}, {62070, 293}, {62074, 292}, {62080, 289}, {62085, 288}, {62089, 289}, {62094, 288}, + {62098, 288}, {62103, 288}, {62107, 294}, {62111, 289}, {62116, 289}, {62119, 288}, {62124, 290}, {62128, 292}, + {62133, 291}, {62134, 61}, {62138, 294}, {62142, 291}, {62146, 288}, {62150, 293}, {62154, 289}, {62158, 293}, + {62160, 289}, {62163, 290}, {62166, 288}, {62169, 288}, {62172, 291}, {62175, 291}, {62178, 291}, {62180, 289}, + {62183, 291}, {62186, 294}, {62189, 290}, {62192, 288}, {62195, 292}, {62198, 288}, {62200, 289}, {62203, 290}, + {62206, 290}, {62209, 291}, {62212, 289}, {62214, 288}, {62217, 291}, {62220, 288}, {62223, 289}, {62226, 289}, + {62229, 288}, {62233, 288}, {62236, 288}, {62241, 289}, {62244, 291}, {62247, 289}, {62249, 292}, {62252, 290}, + {62255, 290}, {62257, 290}, {62260, 291}, {62263, 289}, {62266, 299}, {62268, 288}, {62270, 289}, {62274, 290}, + {62277, 291}, {62282, 290}, {62286, 291}, {62291, 291}, {62294, 289}, {62297, 290}, {62299, 288}, {62303, 289}, + {62306, 291}, {62310, 289}, {62313, 288}, {62316, 292}, {62320, 290}, {62324, 291}, {62327, 292}, {62331, 290}, + {62335, 288}, {62338, 291}, {62342, 289}, {62345, 289}, {62349, 290}, {62354, 288}, {62358, 290}, {62360, 289}, + {62363, 289}, {62367, 289}, {62369, 291}, {62372, 294}, {62375, 293}, {62378, 290}, {62380, 293}, {62383, 293}, + {62386, 289}, {62389, 289}, {62392, 292}, {62395, 288}, {62398, 293}, {62401, 291}, {62405, 289}, {62408, 293}, + {62411, 288}, {62413, 289}, {62416, 288}, {62418, 292}, {62420, 295}, {62422, 293}, {62424, 291}, {62425, 288}, + {62427, 288}, {62429, 289}, {62431, 289}, {62432, 288}, {62434, 288}, {62435, 291}, {62437, 291}, {62438, 290}, + {62440, 290}, {62442, 288}, {62443, 294}, {62445, 288}, {62446, 290}, {62448, 291}, {62450, 288}, {62452, 294}, + {62454, 288}, {62456, 297}, {62463, 289}, {62468, 291}, {62473, 292}, {62478, 291}, {62482, 291}, {62487, 293}, + {62491, 294}, {62496, 288}, {62501, 290}, {62508, 290}, {62514, 288}, {62520, 291}, {62526, 294}, {62532, 291}, + {62537, 288}, {62542, 296}, {62548, 290}, {62553, 292}, {62557, 290}, {62561, 289}, {62566, 288}, {62570, 290}, + {62576, 290}, {62581, 291}, {62586, 288}, {62591, 288}, {62595, 288}, {62599, 292}, {62604, 288}, {62608, 288}, + {62611, 289}, {62616, 295}, {62620, 290}, {62625, 292}, {62629, 289}, {62634, 289}, {62638, 292}, {62642, 289}, + {62645, 289}, {62649, 292}, {62652, 290}, {62656, 292}, {62658, 288}, {62662, 291}, {62665, 291}, {62668, 288}, + {62672, 292}, {62675, 293}, {62677, 289}, {62680, 291}, {62685, 290}, {62688, 288}, {62691, 290}, {62695, 290}, + {62697, 290}, {62701, 290}, {62705, 288}, {62708, 289}, {62711, 291}, {62715, 288}, {62721, 289}, {62726, 288}, + {62730, 289}, {62734, 291}, {62738, 291}, {62742, 288}, {62746, 289}, {62750, 294}, {62753, 289}, {62757, 289}, + {62761, 297}, {62766, 288}, {62771, 291}, {62774, 289}, {62779, 288}, {62783, 290}, {62787, 292}, {62791, 289}, + {62796, 289}, {62799, 290}, {62803, 296}, {62807, 290}, {62812, 290}, {62816, 289}, {62819, 289}, {62823, 294}, + {62829, 293}, {62833, 289}, {62838, 288}, {62842, 290}, {62847, 289}, {62850, 292}, {62855, 293}, {62860, 290}, + {62863, 292}, {62866, 288}, {62870, 290}, {62872, 288}, {62877, 288}, {62881, 291}, {62884, 290}, {62888, 290}, + {62891, 288}, {62896, 288}, {62899, 292}, {62905, 290}, {62909, 289}, {62913, 289}, {62917, 289}, {62921, 290}, + {62925, 288}, {62929, 289}, {62933, 288}, {62936, 288}, {62938, 289}, {62940, 291}, {62943, 289}, {62945, 288}, + {62948, 290}, {62950, 292}, {62953, 290}, {62955, 288}, {62957, 290}, {62960, 290}, {62963, 289}, {62965, 289}, + {62967, 290}, {62970, 290}, {62972, 289}, {62978, 293}, {62979, 25}, {62985, 299}, {62990, 292}, {62994, 288}, + {62997, 295}, {63000, 298}, {63004, 292}, {63007, 295}, {63010, 298}, {63012, 292}, {63019, 292}, {63027, 290}, + {63034, 288}, {63041, 290}, {63047, 292}, {63053, 293}, {63060, 289}, {63067, 288}, {63072, 290}, {63078, 290}, + {63084, 292}, {63090, 288}, {63096, 292}, {63102, 291}, {63108, 289}, {63113, 289}, {63118, 289}, {63124, 293}, + {63131, 290}, {63137, 289}, {63143, 289}, {63148, 291}, {63154, 289}, {63160, 291}, {63165, 288}, {63169, 289}, + {63173, 289}, {63177, 291}, {63181, 292}, {63185, 290}, {63189, 289}, {63192, 288}, {63196, 290}, {63199, 289}, + {63204, 291}, {63208, 290}, {63212, 293}, {63215, 288}, {63220, 289}, {63226, 291}, {63231, 289}, {63238, 291}, + {63242, 292}, {63247, 288}, {63251, 289}, {63255, 290}, {63259, 288}, {63264, 289}, {63268, 294}, {63273, 288}, + {63278, 288}, {63282, 288}, {63287, 288}, {63291, 288}, {63294, 290}, {63303, 291}, {63307, 290}, {63312, 294}, + {63316, 288}, {63319, 291}, {63324, 288}, {63328, 290}, {63332, 289}, {63336, 289}, {63340, 288}, {63345, 292}, + {63349, 289}, {63353, 288}, {63358, 290}, {63361, 288}, {63365, 289}, {63369, 288}, {63373, 291}, {63376, 290}, + {63380, 288}, {63383, 289}, {63387, 291}, {63391, 290}, {63396, 291}, {63400, 288}, {63404, 290}, {63407, 288}, + {63413, 290}, {63418, 290}, {63422, 290}, {63428, 288}, {63431, 288}, {63435, 292}, {63440, 290}, {63445, 289}, + {63449, 289}, {63453, 288}, {63458, 290}, {63462, 294}, {63465, 289}, {63469, 295}, {63473, 288}, {63476, 293}, + {63479, 291}, {63481, 288}, {63486, 297}, {63490, 288}, {63494, 289}, {63497, 290}, {63500, 291}, {63503, 289}, + {63505, 290}, {63508, 289}, {63510, 294}, {63512, 288}, {63515, 292}, {63517, 294}, {63519, 290}, {63527, 294}, + {63533, 289}, {63539, 293}, {63545, 290}, {63551, 288}, {63556, 292}, {63562, 288}, {63568, 292}, {63573, 291}, + {63579, 288}, {63584, 288}, {63590, 290}, {63596, 290}, {63602, 289}, {63607, 290}, {63613, 291}, {63619, 292}, + {63624, 288}, {63629, 291}, {63636, 289}, {63641, 292}, {63647, 293}, {63651, 288}, {63656, 291}, {63661, 289}, + {63665, 291}, {63670, 294}, {63674, 290}, {63679, 288}, {63683, 289}, {63688, 288}, {63692, 288}, {63697, 291}, + {63702, 290}, {63708, 289}, {63713, 290}, {63719, 291}, {63725, 289}, {63729, 291}, {63735, 288}, {63740, 290}, + {63747, 289}, {63752, 288}, {63756, 292}, {63762, 288}, {63766, 293}, {63770, 290}, {63774, 292}, {63778, 288}, + {63783, 288}, {63787, 291}, {63792, 289}, {63796, 290}, {63801, 288}, {63805, 288}, {63810, 288}, {63815, 290}, + {63819, 289}, {63824, 290}, {63829, 290}, {63833, 293}, {63837, 290}, {63842, 291}, {63846, 293}, {63850, 289}, + {63855, 288}, {63860, 290}, {63865, 291}, {63869, 290}, {63873, 290}, {63878, 289}, {63883, 291}, {63887, 289}, + {63893, 292}, {63897, 289}, {63902, 290}, {63906, 289}, {63911, 289}, {63916, 288}, {63920, 289}, {63925, 288}, + {63930, 288}, {63932, 165}, {63937, 289}, {63943, 290}, {63950, 303}, {63955, 294}, {63959, 289}, {63964, 295}, + {63969, 295}, {63972, 295}, {63975, 296}, {63979, 291}, {63982, 294}, {63985, 290}, {63987, 288}, {63988, 291}, + {63991, 288}, {63996, 293}, {64001, 290}, {64008, 289}, {64014, 299}, {64020, 292}, {64025, 288}, {64030, 290}, + {64035, 289}, {64040, 288}, {64045, 288}, {64050, 288}, {64055, 288}, {64060, 292}, {64066, 288}, {64071, 289}, + {64078, 289}, {64084, 288}, {64089, 288}, {64093, 291}, {64098, 290}, {64101, 289}, {64106, 289}, {64110, 289}, + {64115, 289}, {64120, 292}, {64124, 289}, {64128, 289}, {64133, 289}, {64138, 289}, {64145, 288}, {64150, 289}, + {64157, 289}, {64163, 288}, {64169, 290}, {64175, 292}, {64180, 289}, {64185, 289}, {64191, 289}, {64196, 289}, + {64200, 288}, {64206, 293}, {64210, 288}, {64215, 288}, {64220, 289}, {64225, 294}, {64230, 288}, {64235, 289}, + {64240, 290}, {64245, 288}, {64250, 290}, {64255, 288}, {64260, 288}, {64265, 289}, {64269, 288}, {64275, 288}, + {64280, 291}, {64285, 291}, {64290, 293}, {64296, 289}, {64303, 290}, {64309, 290}, {64314, 289}, {64319, 289}, + {64324, 289}, {64330, 288}, {64336, 288}, {64342, 288}, {64348, 288}, {64352, 293}, {64356, 293}, {64360, 292}, + {64364, 293}, {64368, 293}, {64371, 291}, {64374, 292}, {64378, 297}, {64382, 292}, {64385, 290}, {64388, 296}, + {64390, 289}, {64395, 289}, {64402, 291}, {64411, 299}, {64420, 292}, {64429, 288}, {64437, 292}, {64445, 292}, + {64451, 292}, {64457, 291}, {64463, 289}, {64469, 289}, {64475, 289}, {64480, 289}, {64485, 289}, {64491, 296}, + {64496, 291}, {64500, 293}, {64504, 291}, {64508, 289}, {64513, 288}, {64517, 290}, {64523, 289}, {64529, 288}, + {64535, 290}, {64540, 290}, {64546, 289}, {64551, 288}, {64555, 288}, {64560, 290}, {64565, 294}, {64570, 290}, + {64576, 289}, {64580, 290}, {64584, 291}, {64590, 289}, {64595, 289}, {64600, 289}, {64606, 289}, {64611, 292}, + {64617, 290}, {64623, 288}, {64628, 291}, {64635, 290}, {64642, 288}, {64648, 293}, {64654, 289}, {64659, 289}, + {64665, 289}, {64671, 296}, {64677, 300}, {64683, 291}, {64688, 288}, {64691, 297}, {64695, 297}, {64698, 289}, + {64702, 289}, {64705, 290}, {64708, 293}, {64712, 288}, {64715, 292}, {64718, 291}, {64721, 289}, {64724, 290}, + {64727, 293}, {64729, 295}, {64734, 291}, {64741, 289}, {64749, 289}, {64758, 295}, {64767, 289}, {64774, 288}, + {64782, 294}, {64790, 290}, {64798, 289}, {64806, 288}, {64813, 292}, {64822, 292}, {64828, 295}, {64835, 288}, + {64841, 289}, {64848, 289}, {64855, 289}, {64863, 297}, {64871, 288}, {64877, 291}, {64884, 289}, {64889, 293}, + {64894, 288}, {64898, 289}, {64902, 288}, {64907, 289}, {64912, 290}, {64917, 290}, {64920, 191}, {64924, 291}, + {64928, 289}, {64932, 289}, {64936, 288}, {64940, 296}, {64944, 290}, {64948, 292}, {64952, 293}, {64957, 289}, + {64962, 288}, {64967, 289}, {64971, 288}, {64977, 291}, {64982, 289}, {64986, 290}, {64991, 291}, {64997, 289}, + {65002, 292}, {65005, 288}, {65009, 291}, {65013, 291}, {65016, 288}, {65018, 290}, {65022, 290}, {65025, 296}, + {65028, 288}, {65031, 288}, {65034, 290}, {65037, 289}, {65040, 290}, {65043, 291}, {65046, 288}, {65051, 291}, + {65056, 290}, {65064, 293}, {65073, 290}, {65080, 288}, {65088, 294}, {65095, 292}, {65103, 290}, {65111, 289}, + {65119, 293}, {65126, 289}, {65132, 288}, {65139, 293}, {65146, 291}, {65153, 289}, {65160, 288}, {65167, 288}, + {65175, 295}, {65181, 289}, {65189, 289}, {65195, 293}, {65202, 292}, {65207, 290}, {65213, 291}, {65220, 292}, + {65226, 289}, {65232, 300}, {65238, 289}, {65244, 291}, {65250, 291}, {65256, 288}, {65261, 289}, {65272, 292}, + {65278, 288}, {65284, 289}, {65289, 288}, {65293, 294}, {65297, 288}, {65300, 292}, {65303, 295}, {65305, 289}, + {65308, 288}, {65310, 288}, {65312, 293}, {65315, 290}, {65317, 292}, {65319, 289}, {65320, 290}, {65322, 291}, + {65324, 292}, {65328, 295}, {65331, 289}, {65335, 293}, {65341, 295}, {65348, 289}, {65354, 291}, {65362, 312}, + {65369, 297}, {65376, 289}, {65382, 290}, {65389, 289}, {65396, 289}, {65404, 289}, {65411, 291}, {65417, 293}, + {65423, 291}, {65429, 291}, {65435, 302}, {65442, 292}, {65449, 290}, {65456, 293}, {65463, 293}, {65469, 289}, + {65476, 288}, {65483, 289}, {65491, 288}, {65497, 290}, {65501, 291}, {65505, 291}, {65509, 288}, {65512, 288}, + {65515, 289}, {65519, 294}, {65522, 289}, {65525, 292}, {65527, 288}, {65530, 290}, {65533, 297}, {65537, 288}, + {65541, 294}, {65546, 288}, {65553, 296}, {65560, 297}, {65568, 292}, {65576, 294}, {65584, 300}, {65591, 289}, + {65599, 290}, {65608, 291}, {65615, 294}, {65622, 291}, {65627, 288}, {65632, 297}, {65637, 289}, {65643, 291}, + {65648, 291}, {65654, 288}, {65659, 290}, {65666, 305}, {65672, 291}, {65676, 289}, {65679, 290}, {65683, 290}, + {65686, 290}, {65689, 293}, {65692, 291}, {65695, 290}, {65699, 291}, {65702, 289}, {65704, 289}, {65707, 293}, + {65710, 291}, {65716, 293}, {65721, 288}, {65729, 320}, {65738, 320}, {65747, 299}, {65755, 289}, {65763, 301}, + {65771, 293}, {65779, 294}, {65787, 295}, {65795, 303}, {65802, 291}, {65809, 293}, {65816, 291}, {65825, 291}, + {65831, 291}, {65839, 299}, {65844, 291}, {65848, 289}, {65852, 288}, {65855, 292}, {65858, 288}, {65861, 288}, + {65864, 290}, {65868, 288}, {65871, 288}, {65874, 291}, {65878, 297}, {65883, 289}, {65888, 292}, {65895, 294}, + {65902, 294}, {65908, 233}, {65915, 308}, {65921, 289}, {65927, 304}, {65934, 311}, {65940, 290}, {65945, 288}, + {65951, 291}, {65957, 292}, {65963, 292}, {65969, 290}, {65975, 290}, {65982, 293}, {65987, 292}, {65991, 288}, + {65994, 291}, {65997, 288}, {66001, 289}, {66005, 290}, {66009, 290}, {66012, 290}, {66016, 288}, {66020, 294}, + {66025, 295}, {66031, 309}, {66039, 300}, {66048, 317}, {66056, 300}, {66063, 289}, {66070, 306}, {66077, 315}, + {66083, 288}, {66090, 302}, {66097, 289}, {66104, 292}, {66112, 289}, {66121, 303}, {66129, 289}, {66136, 289}, + {66141, 297}, {66144, 288}, {66148, 293}, {66151, 293}, {66154, 288}, {66157, 293}, {66160, 289}, {66163, 290}, + {66166, 288}, {66169, 288}, {66172, 290}, {66176, 290}, {66180, 288}, {66187, 311}, {66194, 300}, {66201, 313}, + {66207, 288}, {66213, 290}, {66218, 297}, {66225, 299}, {66231, 288}, {66237, 291}, {66244, 291}, {66247, 288}, + {66251, 288}, {66255, 289}, {66258, 291}, {66262, 292}, {66265, 295}, {66268, 290}, {66271, 288}, {66275, 289}, + {66279, 289}, {66283, 290}, {66290, 298}, {66300, 303}, {66310, 295}, {66320, 301}, {66328, 290}, {66336, 304}, + {66342, 301}, {66348, 299}, {66353, 291}, {66357, 292}, {66360, 290}, {66363, 293}, {66367, 289}, {66370, 290}, + {66374, 288}, {66377, 290}, {66380, 288}, {66384, 289}, {66388, 289}, {66395, 314}, {66405, 320}, {66414, 301}, + {66422, 295}, {66427, 291}, {66433, 293}, {66440, 302}, {66447, 295}, {66450, 291}, {66453, 291}, {66455, 288}, + {66458, 289}, {66460, 294}, {66464, 289}, {66469, 297}, {66475, 290}, {66481, 292}, {66489, 291}, {66499, 309}, + {66508, 313}, {66515, 302}, {66522, 299}, {66526, 294}, {66532, 289}, {66537, 300}, {66544, 288}, {66547, 288}, + {66549, 289}, {66552, 290}, {66555, 291}, {66559, 291}, {66562, 291}, {66566, 289}, {66569, 289}, {66574, 296}, + {66578, 289}, {66587, 320}, {66596, 289}, {66605, 294}, {66612, 290}, {66618, 306}, {66625, 292}, {66633, 293}, + {66637, 288}, {66641, 289}, {66645, 290}, {66648, 288}, {66651, 290}, {66655, 290}, {66658, 292}, {66661, 290}, + {66665, 290}, {66669, 289}, {66675, 305}, {66685, 320}, {66694, 292}, {66703, 296}, {66708, 290}, {66713, 288}, + {66719, 289}, {66727, 296}, {66730, 291}, {66733, 290}, {66735, 289}, {66738, 291}, {66740, 290}, {66745, 291}, + {66750, 291}, {66756, 288}, {66762, 290}, {66768, 294}, {66776, 294}, {66784, 304}, {66792, 306}, {66799, 295}, + {66804, 299}, {66809, 319}, {66814, 301}, {66816, 80}, {66822, 288}, {66826, 289}, {66829, 289}, {66832, 289}, + {66835, 289}, {66838, 291}, {66842, 289}, {66846, 288}, {66849, 289}, {66854, 294}, {66859, 296}, {66865, 293}, + {66872, 320}, {66882, 316}, {66890, 298}, {66898, 298}, {66905, 304}, {66911, 290}, {66917, 306}, {66924, 289}, + {66926, 289}, {66929, 288}, {66933, 288}, {66936, 291}, {66940, 292}, {66943, 289}, {66946, 291}, {66950, 293}, + {66953, 289}, {66956, 289}, {66960, 289}, {66965, 292}, {66970, 289}, {66978, 292}, {66987, 299}, {66997, 307}, + {67003, 289}, {67010, 288}, {67018, 299}, {67023, 290}, {67025, 288}, {67027, 289}, {67030, 289}, {67033, 293}, + {67037, 292}, {67041, 293}, {67044, 291}, {67047, 289}, {67050, 292}, {67053, 288}, {67057, 294}, {67061, 288}, + {67066, 288}, {67075, 301}, {67085, 288}, {67094, 298}, {67101, 295}, {67109, 289}, {67118, 306}, {67122, 293}, + {67125, 288}, {67128, 293}, {67131, 289}, {67134, 290}, {67137, 288}, {67141, 291}, {67144, 288}, {67147, 289}, + {67150, 288}, {67153, 290}, {67157, 290}, {67161, 289}, {67166, 293}, {67173, 295}, {67184, 320}, {67194, 320}, + {67200, 290}, {67205, 296}, {67213, 297}, {67219, 290}, {67222, 288}, {67224, 293}, {67228, 294}, {67231, 292}, + {67234, 288}, {67238, 289}, {67241, 289}, {67245, 289}, {67248, 288}, {67252, 288}, {67256, 289}, {67260, 288}, + {67266, 292}, {67275, 315}, {67287, 298}, {67296, 311}, {67303, 308}, {67311, 310}, {67315, 288}, {67318, 290}, + {67320, 288}, {67322, 290}, {67325, 289}, {67328, 289}, {67331, 289}, {67334, 290}, {67338, 290}, {67341, 288}, + {67344, 289}, {67348, 289}, {67352, 289}, {67357, 288}, {67363, 304}, {67376, 320}, {67386, 291}, {67393, 303}, + {67402, 320}, {67409, 290}, {67412, 289}, {67414, 290}, {67416, 288}, {67418, 293}, {67420, 290}, {67422, 292}, + {67425, 289}, {67428, 290}, {67431, 290}, {67435, 290}, {67438, 289}, {67442, 289}, {67446, 289}, {67450, 293}, + {67455, 289}, {67466, 320}, {67476, 288}, {67484, 300}, {67491, 299}, {67499, 293}, {67504, 291}, {67507, 292}, + {67509, 290}, {67511, 291}, {67513, 291}, {67516, 288}, {67519, 291}, {67523, 288}, {67526, 291}, {67529, 289}, + {67532, 289}, {67536, 290}, {67539, 288}, {67543, 291}, {67547, 289}, {67554, 290}, {67564, 320}, {67576, 318}, + {67582, 291}, {67589, 302}, {67597, 317}, {67602, 291}, {67604, 292}, {67607, 293}, {67610, 289}, {67613, 290}, + {67616, 288}, {67619, 289}, {67623, 289}, {67626, 291}, {67629, 288}, {67629, 64}, {67633, 291}, {67637, 291}, + {67640, 288}, {67645, 290}, {67649, 291}, {67659, 299}, {67670, 308}, {67678, 288}, {67684, 291}, {67691, 291}, + {67698, 290}, {67702, 289}, {67706, 290}, {67709, 290}, {67713, 292}, {67716, 291}, {67719, 291}, {67722, 288}, + {67725, 290}, {67728, 288}, {67731, 289}, {67734, 289}, {67737, 290}, {67740, 291}, {67744, 290}, {67747, 292}, + {67752, 297}, {67757, 289}, {67764, 290}, {67775, 288}, {67785, 303}, {67792, 289}, {67800, 288}, {67809, 299}, + {67814, 289}, {67817, 291}, {67820, 290}, {67823, 288}, {67826, 291}, {67829, 290}, {67832, 290}, {67834, 289}, + {67837, 289}, {67840, 288}, {67843, 297}, {67845, 290}, {67848, 294}, {67851, 290}, {67854, 290}, {67857, 289}, + {67861, 288}, {67866, 291}, {67871, 290}, {67877, 290}, {67883, 288}, {67890, 290}, {67900, 304}, {67910, 320}, + {67915, 288}, {67921, 291}, {67927, 290}, {67934, 291}, {67940, 290}, {67942, 288}, {67945, 288}, {67948, 289}, + {67951, 289}, {67954, 289}, {67956, 288}, {67960, 289}, {67963, 290}, {67967, 289}, {67970, 290}, {67973, 291}, + {67977, 289}, {67980, 291}, {67984, 288}, {67988, 289}, {67992, 292}, {67997, 294}, {68001, 288}, {68005, 288}, + {68010, 288}, {68014, 289}, {68019, 289}, {68024, 292}, {68030, 299}, {68040, 320}, {68049, 307}, {68054, 291}, + {68061, 317}, {68068, 297}, {68072, 290}, {68074, 288}, {68076, 288}, {68078, 293}, {68082, 289}, {68086, 289}, + {68090, 288}, {68093, 289}, {68097, 289}, {68101, 292}, {68104, 291}, {68107, 288}, {68110, 289}, {68113, 290}, + {68116, 292}, {68119, 289}, {68122, 290}, {68125, 289}, {68128, 291}, {68131, 288}, {68133, 289}, {68136, 288}, + {68139, 288}, {68142, 291}, {68145, 290}, {68148, 290}, {68152, 289}, {68157, 288}, {68166, 316}, {68177, 314}, + {68184, 316}, {68192, 298}, {68201, 288}, {68206, 290}, {68209, 288}, {68213, 289}, {68216, 289}, {68219, 292}, + {68222, 289}, {68225, 288}, {68227, 288}, {68230, 289}, {68233, 288}, {68235, 288}, {68238, 289}, {68240, 290}, + {68242, 290}, {68245, 288}, {68247, 288}, {68249, 289}, {68252, 291}, {68254, 291}, {68257, 291}, {68260, 288}, + {68263, 289}, {68265, 292}, {68269, 291}, {68272, 289}, {68276, 291}, {68279, 292}, {68284, 293}, {68292, 291}, + {68298, 308}, {68309, 303}, {68318, 289}, {68325, 288}, {68333, 288}, {68341, 317}, {68346, 288}, {68348, 290}, + {68350, 290}, {68353, 289}, {68355, 290}, {68358, 289}, {68360, 292}, {68362, 288}, {68365, 288}, {68367, 291}, + {68370, 290}, {68372, 289}, {68374, 288}, {68377, 292}, {68380, 292}, {68383, 290}, {68386, 288}, {68388, 290}, + {68391, 290}, {68395, 289}, {68398, 289}, {68403, 290}, {68406, 288}, {68410, 291}, {68414, 288}, {68417, 288}, + {68421, 289}, {68425, 288}, {68428, 290}, {68432, 290}, {68436, 290}, {68441, 289}, {68444, 225}, {68453, 310}, + {68463, 297}, {68469, 288}, {68475, 294}, {68482, 315}, {68488, 288}, {68490, 291}, {68492, 293}, {68493, 292}, + {68494, 289}, {68496, 289}, {68497, 289}, {68498, 291}, {68501, 288}, {68504, 288}, {68508, 291}, {68513, 292}, + {68516, 288}, {68519, 288}, {68523, 295}, {68526, 288}, {68529, 290}, {68532, 290}, {68536, 289}, {68539, 290}, + {68542, 290}, {68544, 289}, {68548, 289}, {68551, 288}, {68555, 289}, {68558, 290}, {68561, 290}, {68564, 289}, + {68567, 290}, {68570, 288}, {68573, 288}, {68576, 290}, {68579, 288}, {68582, 289}, {68587, 288}, {68590, 290}, + {68601, 312}, {68610, 290}, {68615, 293}, {68621, 290}, {68629, 320}, {68634, 289}, {68638, 292}, {68642, 289}, + {68645, 289}, {68649, 290}, {68652, 289}, {68656, 292}, {68659, 289}, {68662, 291}, {68665, 290}, {68669, 288}, + {68672, 288}, {68675, 288}, {68678, 289}, {68682, 290}, {68684, 290}, {68687, 292}, {68690, 288}, {68692, 288}, + {68695, 290}, {68697, 290}, {68699, 290}, {68702, 290}, {68704, 293}, {68706, 288}, {68708, 293}, {68710, 291}, + {68713, 292}, {68716, 289}, {68718, 288}, {68721, 289}, {68724, 293}, {68727, 291}, {68729, 292}, {68732, 288}, + {68735, 294}, {68739, 291}, {68743, 289}, {68752, 304}, {68761, 296}, {68769, 315}, {68778, 298}, {68788, 295}, + {68798, 311}, {68804, 292}, {68807, 289}, {68811, 289}, {68813, 289}, {68817, 288}, {68820, 288}, {68823, 289}, + {68826, 288}, {68829, 290}, {68832, 288}, {68835, 291}, {68837, 290}, {68839, 288}, {68843, 288}, {68845, 289}, + {68847, 290}, {68849, 290}, {68851, 293}, {68853, 290}, {68855, 288}, {68857, 289}, {68859, 288}, {68861, 289}, + {68863, 289}, {68865, 288}, {68867, 288}, {68869, 289}, {68871, 292}, {68873, 288}, {68875, 288}, {68877, 292}, + {68879, 289}, {68881, 288}, {68884, 288}, {68887, 289}, {68890, 289}, {68893, 290}, {68896, 288}, {68899, 293}, + {68903, 292}, {68908, 289}, {68912, 290}, {68917, 291}, {68922, 290}, {68927, 290}, {68937, 288}, {68947, 297}, + {68959, 302}, {68968, 290}, {68977, 302}, {68984, 291}, {68986, 291}, {68989, 290}, {68990, 288}, {68993, 290}, + {68995, 289}, {68997, 289}, {68999, 289}, {69001, 292}, {69002, 291}, {69004, 291}, {69006, 289}, {69008, 288}, + {69010, 289}, {69012, 289}, {69014, 290}, {69015, 288}, {69017, 289}, {69019, 290}, {69021, 288}, {69023, 290}, + {69025, 289}, {69027, 289}, {69030, 289}, {69032, 288}, {69034, 293}, {69036, 288}, {69039, 288}, {69042, 290}, + {69046, 289}, {69048, 291}, {69052, 288}, {69055, 291}, {69058, 290}, {69061, 289}, {69066, 291}, {69068, 288}, + {69072, 288}, {69075, 290}, {69078, 292}, {69082, 294}, {69086, 293}, {69090, 289}, {69093, 289}, {69096, 288}, + {69099, 289}, {69102, 292}, {69106, 290}, {69110, 293}, {69115, 288}, {69119, 289}, {69123, 290}, {69129, 301}, + {69140, 306}, {69147, 291}, {69156, 296}, {69162, 295}, {69170, 320}, {69172, 293}, {69173, 290}, {69175, 289}, + {69177, 290}, {69178, 289}, {69180, 295}, {69182, 293}, {69184, 289}, {69186, 293}, {69189, 291}, {69191, 290}, + {69193, 290}, {69195, 290}, {69198, 290}, {69200, 293}, {69203, 293}, {69206, 289}, {69209, 293}, {69211, 288}, + {69214, 289}, {69218, 289}, {69220, 288}, {69222, 289}, {69226, 290}, {69227, 290}, {69230, 289}, {69234, 289}, + {69236, 288}, {69239, 289}, {69241, 291}, {69244, 291}, {69246, 294}, {69249, 291}, {69252, 291}, {69254, 289}, + {69258, 289}, {69259, 211}, {69263, 292}, {69266, 295}, {69270, 292}, {69273, 290}, {69276, 288}, {69278, 289}, + {69281, 289}, {69284, 288}, {69287, 288}, {69290, 288}, {69293, 292}, {69297, 288}, {69299, 297}, {69302, 289}, + {69305, 288}, {69308, 289}, {69311, 289}, {69314, 290}, {69316, 291}, {69319, 289}, {69322, 290}, {69325, 289}, + {69333, 320}, {69343, 296}, {69348, 292}, {69353, 289}, {69360, 304}, {69367, 289}, {69369, 288}, {69372, 292}, + {69376, 292}, {69379, 291}, {69382, 291}, {69385, 296}, {69387, 290}, {69390, 289}, {69392, 291}, {69394, 288}, + {69397, 293}, {69400, 289}, {69402, 289}, {69405, 290}, {69408, 293}, {69410, 289}, {69413, 291}, {69415, 290}, + {69418, 294}, {69420, 289}, {69422, 288}, {69425, 289}, {69428, 290}, {69430, 288}, {69433, 289}, {69435, 295}, + {69437, 291}, {69440, 294}, {69442, 288}, {69444, 290}, {69447, 289}, {69449, 297}, {69451, 289}, {69454, 289}, + {69455, 289}, {69458, 290}, {69460, 288}, {69462, 288}, {69464, 289}, {69466, 291}, {69468, 289}, {69471, 292}, + {69473, 288}, {69475, 291}, {69477, 290}, {69479, 289}, {69480, 295}, {69482, 292}, {69485, 288}, {69486, 291}, + {69488, 289}, {69490, 289}, {69491, 288}, {69493, 288}, {69495, 288}, {69497, 289}, {69499, 288}, {69501, 293}, + {69503, 289}, {69505, 289}, {69507, 288}, {69509, 288}, {69511, 288}, {69513, 293}, {69516, 291}, {69519, 289}, + {69521, 291}, {69524, 292}, {69528, 288}, {69532, 291}, {69538, 290}, {69551, 320}, {69560, 298}, {69571, 296}, + {69582, 301}, {69588, 289}, {69590, 289}, {69592, 292}, {69596, 297}, {69598, 292}, {69601, 292}, {69604, 290}, + {69606, 288}, {69609, 294}, {69611, 291}, {69614, 289}, {69617, 290}, {69620, 293}, {69622, 291}, {69624, 288}, + {69627, 288}, {69629, 293}, {69633, 291}, {69635, 289}, {69637, 288}, {69639, 291}, {69642, 293}, {69644, 289}, + {69646, 290}, {69649, 289}, {69651, 294}, {69653, 289}, {69655, 290}, {69657, 290}, {69658, 292}, {69660, 289}, + {69661, 288}, {69663, 293}, {69665, 293}, {69666, 289}, {69668, 288}, {69669, 290}, {69671, 292}, {69672, 291}, + {69674, 290}, {69676, 289}, {69678, 292}, {69680, 288}, {69682, 291}, {69684, 290}, {69685, 292}, {69687, 292}, + {69689, 297}, {69691, 288}, {69692, 290}, {69694, 290}, {69697, 289}, {69699, 289}, {69701, 292}, {69704, 290}, + {69707, 293}, {69711, 290}, {69714, 288}, {69718, 295}, {69721, 290}, {69725, 288}, {69728, 292}, {69731, 289}, + {69735, 289}, {69739, 288}, {69743, 288}, {69747, 290}, {69750, 290}, {69754, 290}, {69758, 296}, {69764, 293}, + {69775, 320}, {69786, 288}, {69796, 291}, {69808, 307}, {69822, 302}, {69826, 288}, {69829, 288}, {69832, 292}, + {69835, 288}, {69838, 293}, {69840, 292}, {69842, 290}, {69844, 288}, {69847, 291}, {69850, 292}, {69852, 289}, + {69854, 290}, {69855, 292}, {69857, 290}, {69859, 291}, {69860, 290}, {69862, 288}, {69864, 289}, {69865, 291}, + {69867, 293}, {69869, 292}, {69871, 294}, {69872, 289}, {69874, 291}, {69876, 289}, {69878, 294}, {69879, 289}, + {69881, 290}, {69883, 288}, {69885, 288}, {69887, 289}, {69889, 291}, {69892, 292}, {69894, 293}, {69897, 291}, + {69898, 290}, {69901, 288}, {69904, 290}, {69907, 299}, {69909, 292}, {69912, 289}, {69915, 291}, {69919, 293}, + {69922, 291}, {69924, 289}, {69929, 288}, {69932, 291}, {69935, 291}, {69938, 290}, {69941, 289}, {69944, 292}, + {69947, 289}, {69950, 289}, {69953, 289}, {69956, 293}, {69959, 290}, {69962, 289}, {69966, 291}, {69970, 294}, + {69973, 289}, {69976, 288}, {69980, 288}, {69983, 293}, {69987, 290}, {69990, 288}, {69995, 288}, {69999, 288}, + {70004, 290}, {70007, 288}, {70010, 291}, {70013, 291}, {70017, 288}, {70022, 291}, {70026, 288}, {70036, 290}, + {70047, 302}, {70056, 292}, {70064, 292}, {70071, 297}, {70076, 291}, {70077, 291}, {70078, 293}, {70079, 292}, + {70081, 293}, {70082, 290}, {70084, 296}, {70086, 289}, {70087, 288}, {70089, 289}, {70091, 293}, {70092, 292}, + {70095, 291}, {70097, 292}, {70099, 288}, {70101, 291}, {70103, 298}, {70106, 292}, {70108, 288}, {70111, 288}, + {70114, 289}, {70115, 291}, {70118, 291}, {70120, 293}, {70123, 288}, {70125, 293}, {70127, 289}, {70130, 290}, + {70133, 288}, {70135, 291}, {70137, 288}, {70138, 114}, {70141, 293}, {70143, 290}, {70146, 291}, {70149, 291}, + {70152, 291}, {70154, 291}, {70156, 290}, {70159, 294}, {70161, 290}, {70163, 293}, {70166, 289}, {70168, 289}, + {70171, 289}, {70173, 295}, {70175, 289}, {70177, 293}, {70179, 289}, {70183, 293}, {70185, 288}, {70187, 291}, + {70190, 293}, {70192, 291}, {70195, 294}, {70197, 290}, {70199, 288}, {70202, 292}, {70204, 292}, {70207, 291}, + {70209, 293}, {70212, 294}, {70215, 289}, {70217, 292}, {70220, 292}, {70223, 292}, {70225, 289}, {70228, 290}, + {70231, 291}, {70234, 292}, {70237, 289}, {70239, 291}, {70242, 290}, {70244, 289}, {70247, 291}, {70250, 289}, + {70253, 288}, {70256, 292}, {70260, 291}, {70262, 291}, {70265, 290}, {70268, 289}, {70272, 288}, {70274, 289}, + {70276, 295}, {70278, 288}, {70280, 289}, {70281, 289}, {70284, 291}, {70286, 290}, {70290, 290}, {70299, 304}, + {70307, 295}, {70312, 288}, {70319, 299}, {70330, 302}, {70332, 290}, {70335, 288}, {70337, 290}, {70339, 291}, + {70342, 291}, {70344, 296}, {70347, 289}, {70349, 296}, {70351, 289}, {70354, 295}, {70356, 296}, {70358, 292}, + {70361, 292}, {70364, 290}, {70366, 290}, {70367, 291}, {70372, 296}, {70374, 290}, {70375, 288}, {70378, 292}, + {70380, 292}, {70382, 289}, {70384, 288}, {70387, 297}, {70389, 290}, {70391, 291}, {70394, 288}, {70396, 294}, + {70398, 288}, {70400, 295}, {70404, 295}, {70406, 289}, {70409, 291}, {70412, 291}, {70415, 288}, {70417, 291}, + {70420, 288}, {70422, 294}, {70424, 290}, {70427, 292}, {70429, 291}, {70432, 290}, {70434, 290}, {70436, 290}, + {70440, 291}, {70442, 291}, {70444, 290}, {70447, 289}, {70449, 288}, {70452, 289}, {70454, 288}, {70457, 289}, + {70459, 289}, {70462, 291}, {70465, 292}, {70468, 290}, {70471, 297}, {70473, 291}, {70475, 291}, {70478, 290}, + {70481, 295}, {70484, 292}, {70486, 292}, {70488, 291}, {70491, 293}, {70493, 288}, {70495, 289}, {70498, 292}, + {70500, 296}, {70502, 292}, {70505, 291}, {70507, 290}, {70508, 292}, {70510, 293}, {70512, 290}, {70513, 291}, + {70515, 294}, {70517, 293}, {70518, 288}, {70520, 288}, {70522, 289}, {70524, 293}, {70525, 293}, {70527, 289}, + {70529, 292}, {70531, 290}, {70533, 291}, {70535, 292}, {70538, 289}, {70542, 291}, {70550, 308}, {70559, 295}, + {70573, 301}, {70587, 311}, {70589, 288}, {70594, 292}, {70596, 288}, {70599, 291}, {70601, 290}, {70605, 296}, + {70607, 288}, {70611, 297}, {70613, 291}, {70617, 293}, {70619, 291}, {70622, 295}, {70626, 298}, {70628, 288}, + {70631, 297}, {70635, 292}, {70638, 289}, {70641, 289}, {70645, 292}, {70648, 288}, {70651, 289}, {70653, 289}, + {70657, 293}, {70660, 293}, {70663, 295}, {70666, 289}, {70669, 294}, {70672, 292}, {70675, 295}, {70678, 289}, + {70681, 290}, {70684, 288}, {70687, 289}, {70689, 289}, {70693, 289}, {70696, 294}, {70699, 288}, {70703, 288}, + {70707, 290}, {70709, 289}, {70712, 293}, {70715, 291}, {70718, 294}, {70721, 289}, {70724, 289}, {70727, 291}, + {70730, 291}, {70733, 293}, {70735, 290}, {70738, 292}, {70740, 291}, {70741, 288}, {70743, 292}, {70745, 294}, + {70747, 291}, {70749, 292}, {70751, 297}, {70754, 291}, {70756, 293}, {70758, 293}, {70760, 296}, {70762, 290}, + {70764, 288}, {70767, 288}, {70769, 295}, {70772, 290}, {70775, 288}, {70780, 290}, {70785, 293}, {70789, 291}, + {70793, 295}, {70796, 288}, {70801, 289}, {70805, 291}, {70809, 289}, {70814, 291}, {70819, 292}, {70824, 288}, + {70833, 292}, {70846, 320}, {70861, 306}, {70877, 305}, {70879, 292}, {70881, 290}, {70884, 293}, {70887, 289}, + {70888, 288}, {70891, 292}, {70894, 293}, {70896, 292}, {70899, 292}, {70901, 292}, {70904, 293}, {70907, 289}, + {70909, 289}, {70911, 296}, {70914, 294}, {70917, 298}, {70919, 294}, {70922, 299}, {70925, 294}, {70927, 288}, + {70930, 299}, {70932, 288}, {70935, 297}, {70937, 289}, {70940, 290}, {70942, 296}, {70944, 288}, {70947, 293}, + {70949, 292}, {70951, 290}, {70953, 291}, {70956, 292}, {70958, 297}, {70960, 294}, {70962, 295}, {70964, 291}, + {70966, 291}, {70968, 290}, {70971, 293}, {70972, 292}, {70974, 289}, {70976, 291}, {70977, 288}, {70979, 291}, + {70980, 293}, {70981, 290}, {70983, 291}, {70984, 295}, {70986, 294}, {70987, 290}, {70988, 293}, {70990, 293}, + {70991, 291}, {70992, 290}, {70994, 292}, {70995, 294}, {70996, 291}, {70998, 288}, {70999, 289}, {71000, 291}, + {71002, 290}, {71004, 293}, {71005, 289}, {71008, 294}, {71009, 294}, {71012, 288}, {71014, 291}, {71016, 291}, + {71018, 290}, {71021, 291}, {71023, 288}, {71026, 290}, {71029, 297}, {71031, 292}, {71034, 289}, {71037, 289}, + {71039, 293}, {71042, 291}, {71044, 290}, {71047, 289}, {71050, 295}, {71052, 291}, {71055, 290}, {71057, 289}, + {71059, 291}, {71063, 296}, {71065, 292}, {71068, 288}, {71071, 293}, {71074, 290}, {71076, 289}, {71079, 295}, + {71082, 289}, {71085, 292}, {71087, 160}, {71090, 292}, {71094, 293}, {71097, 291}, {71100, 293}, {71108, 307}, + {71112, 294}, {71121, 288}, {71134, 313}, {71145, 291}, {71147, 290}, {71149, 288}, {71151, 294}, {71154, 289}, + {71156, 290}, {71159, 295}, {71161, 288}, {71163, 289}, {71166, 291}, {71168, 291}, {71170, 289}, {71172, 295}, + {71175, 294}, {71177, 288}, {71179, 289}, {71182, 290}, {71184, 290}, {71187, 292}, {71188, 288}, {71190, 290}, + {71193, 289}, {71195, 289}, {71197, 293}, {71199, 289}, {71202, 291}, {71204, 294}, {71207, 288}, {71209, 288}, + {71211, 289}, {71214, 289}, {71216, 290}, {71218, 289}, {71220, 290}, {71223, 288}, {71225, 291}, {71227, 292}, + {71230, 290}, {71231, 292}, {71234, 292}, {71235, 294}, {71236, 290}, {71238, 289}, {71239, 289}, {71241, 294}, + {71242, 288}, {71243, 292}, {71245, 288}, {71246, 294}, {71247, 290}, {71249, 295}, {71250, 290}, {71252, 289}, + {71253, 288}, {71254, 290}, {71256, 291}, {71257, 292}, {71259, 290}, {71260, 290}, {71262, 288}, {71264, 293}, + {71265, 289}, {71268, 294}, {71271, 293}, {71274, 288}, {71277, 288}, {71279, 288}, {71282, 292}, {71290, 288}, + {71293, 290}, {71297, 293}, {71301, 292}, {71304, 291}, {71306, 291}, {71310, 288}, {71313, 290}, {71317, 289}, + {71321, 290}, {71325, 290}, {71329, 288}, {71338, 291}, {71347, 308}, {71367, 291}, {71368, 290}, {71370, 289}, + {71374, 293}, {71377, 293}, {71380, 288}, {71383, 288}, {71387, 291}, {71390, 291}, {71393, 290}, {71396, 289}, + {71401, 290}, {71404, 289}, {71407, 289}, {71410, 296}, {71413, 292}, {71417, 296}, {71420, 290}, {71423, 292}, + {71426, 290}, {71429, 295}, {71433, 292}, {71436, 294}, {71439, 289}, {71442, 288}, {71446, 290}, {71449, 288}, + {71452, 294}, {71455, 288}, {71459, 288}, {71462, 288}, {71465, 289}, {71467, 288}, {71471, 298}, {71473, 290}, + {71477, 292}, {71479, 289}, {71482, 293}, {71485, 289}, {71488, 294}, {71490, 291}, {71492, 302}, {71493, 289}, + {71496, 288}, {71497, 290}, {71499, 293}, {71500, 294}, {71502, 290}, {71503, 289}, {71505, 290}, {71506, 294}, + {71507, 294}, {71509, 289}, {71510, 290}, {71512, 288}, {71515, 291}, {71518, 292}, {71521, 290}, {71524, 292}, + {71527, 288}, {71530, 290}, {71533, 291}, {71536, 290}, {71540, 300}, {71544, 294}, {71547, 293}, {71550, 288}, + {71554, 288}, {71558, 295}, {71561, 293}, {71565, 290}, {71568, 290}, {71572, 289}, {71575, 291}, {71578, 291}, + {71582, 291}, {71586, 290}, {71590, 291}, {71594, 289}, {71599, 291}, {71604, 290}, {71612, 289}, {71619, 293}, + {71630, 320}, {71651, 312}, {71657, 294}, {71660, 292}, {71663, 296}, {71666, 288}, {71668, 293}, {71671, 290}, + {71675, 291}, {71677, 290}, {71680, 293}, {71683, 292}, {71686, 289}, {71688, 288}, {71691, 293}, {71694, 289}, + {71697, 292}, {71699, 299}, {71702, 294}, {71705, 293}, {71707, 295}, {71710, 296}, {71712, 291}, {71715, 290}, + {71717, 290}, {71721, 293}, {71722, 289}, {71723, 290}, {71724, 291}, {71726, 289}, {71727, 288}, {71731, 294}, + {71732, 290}, {71733, 290}, {71734, 291}, {71735, 290}, {71737, 292}, {71738, 290}, {71739, 290}, {71741, 296}, + {71742, 288}, {71743, 290}, {71745, 288}, {71746, 289}, {71748, 291}, {71749, 289}, {71751, 288}, {71753, 290}, + {71756, 290}, {71759, 289}, {71761, 292}, {71764, 295}, {71767, 293}, {71769, 295}, {71772, 290}, {71774, 288}, + {71776, 296}, {71779, 290}, {71782, 293}, {71784, 288}, {71787, 297}, {71789, 290}, {71792, 288}, {71794, 288}, + {71797, 290}, {71800, 292}, {71802, 289}, {71805, 288}, {71808, 295}, {71810, 293}, {71812, 290}, {71815, 290}, + {71818, 289}, {71821, 290}, {71824, 294}, {71827, 291}, {71830, 289}, {71833, 290}, {71835, 291}, {71838, 298}, + {71842, 289}, {71845, 291}, {71849, 289}, {71852, 291}, {71856, 291}, {71859, 294}, {71863, 288}, {71871, 288}, + {71873, 289}, {71877, 296}, {71884, 299}, {71902, 300}, {71903, 290}, {71905, 294}, {71906, 296}, {71909, 289}, + {71911, 291}, {71913, 291}, {71916, 293}, {71918, 294}, {71920, 288}, {71923, 290}, {71925, 291}, {71928, 293}, + {71930, 288}, {71933, 291}, {71936, 288}, {71938, 288}, {71940, 288}, {71943, 290}, {71946, 291}, {71948, 290}, + {71952, 290}, {71955, 288}, {71958, 295}, {71960, 289}, {71963, 288}, {71966, 296}, {71969, 289}, {71971, 292}, + {71974, 290}, {71976, 295}, {71979, 293}, {71982, 291}, {71984, 290}, {71986, 288}, {71987, 291}, {71989, 292}, + {71992, 289}, {71993, 160}, {71994, 289}, {71996, 296}, {71997, 291}, {71999, 292}, {72000, 290}, {72001, 292}, + {72002, 289}, {72004, 293}, {72005, 293}, {72007, 301}, {72008, 294}, {72010, 292}, {72011, 293}, {72014, 288}, + {72016, 292}, {72019, 294}, {72021, 288}, {72024, 290}, {72027, 288}, {72030, 291}, {72032, 290}, {72035, 291}, + {72038, 290}, {72040, 293}, {72043, 290}, {72046, 292}, {72049, 290}, {72052, 292}, {72054, 291}, {72057, 288}, + {72060, 289}, {72064, 289}, {72068, 289}, {72071, 295}, {72074, 289}, {72077, 293}, {72080, 291}, {72082, 293}, + {72085, 292}, {72088, 289}, {72091, 288}, {72095, 298}, {72098, 292}, {72102, 290}, {72105, 289}, {72109, 292}, + {72115, 288}, {72119, 293}, {72123, 289}, {72128, 295}, {72147, 320}, {72150, 290}, {72151, 291}, {72152, 299}, + {72154, 289}, {72156, 288}, {72158, 288}, {72161, 290}, {72164, 289}, {72166, 292}, {72168, 290}, {72170, 288}, + {72174, 288}, {72177, 289}, {72179, 288}, {72182, 296}, {72184, 293}, {72187, 297}, {72190, 290}, {72192, 291}, + {72195, 290}, {72197, 291}, {72200, 290}, {72202, 291}, {72204, 296}, {72207, 290}, {72210, 289}, {72213, 297}, + {72215, 288}, {72219, 288}, {72221, 289}, {72223, 290}, {72226, 293}, {72228, 292}, {72231, 290}, {72233, 293}, + {72234, 289}, {72236, 289}, {72239, 295}, {72241, 292}, {72242, 288}, {72244, 289}, {72245, 293}, {72246, 292}, + {72247, 294}, {72249, 290}, {72250, 288}, {72252, 289}, {72254, 294}, {72257, 288}, {72259, 288}, {72262, 292}, + {72265, 288}, {72268, 289}, {72270, 289}, {72274, 294}, {72276, 289}, {72279, 292}, {72282, 288}, {72286, 290}, + {72289, 292}, {72291, 289}, {72294, 296}, {72297, 296}, {72300, 290}, {72303, 288}, {72305, 290}, {72309, 292}, + {72312, 290}, {72315, 289}, {72318, 292}, {72321, 299}, {72325, 288}, {72328, 288}, {72331, 294}, {72334, 296}, + {72337, 294}, {72340, 296}, {72343, 290}, {72346, 288}, {72349, 288}, {72353, 290}, {72357, 289}, {72360, 289}, + {72364, 290}, {72368, 293}, {72376, 303}, {72380, 289}, {72384, 290}, {72388, 289}, {72395, 288}, {72415, 292}, + {72416, 288}, {72417, 291}, {72419, 290}, {72422, 290}, {72425, 290}, {72428, 290}, {72431, 290}, {72434, 298}, + {72437, 295}, {72440, 292}, {72443, 290}, {72446, 294}, {72449, 292}, {72452, 294}, {72456, 293}, {72459, 294}, + {72463, 290}, {72466, 288}, {72469, 293}, {72472, 297}, {72475, 296}, {72478, 294}, {72480, 292}, {72482, 290}, + {72485, 297}, {72487, 288}, {72490, 291}, {72493, 294}, {72494, 290}, {72496, 292}, {72498, 293}, {72499, 296}, + {72501, 291}, {72502, 295}, {72503, 290}, {72506, 294}, {72510, 289}, {72512, 293}, {72514, 293}, {72518, 296}, + {72520, 289}, {72524, 293}, {72526, 290}, {72529, 295}, {72532, 288}, {72535, 293}, {72538, 293}, {72542, 297}, + {72545, 301}, {72548, 288}, {72550, 288}, {72553, 290}, {72556, 289}, {72559, 298}, {72563, 300}, {72565, 292}, + {72568, 294}, {72572, 289}, {72574, 289}, {72577, 293}, {72580, 288}, {72583, 290}, {72586, 291}, {72589, 294}, + {72592, 292}, {72595, 288}, {72599, 294}, {72601, 288}, {72604, 292}, {72607, 291}, {72611, 289}, {72613, 294}, + {72618, 293}, {72620, 289}, {72623, 289}, {72626, 288}, {72629, 289}, {72632, 290}, {72636, 294}, {72639, 292}, + {72642, 290}, {72645, 293}, {72649, 289}, {72652, 290}, {72656, 291}, {72660, 291}, {72665, 292}, {72671, 290}, + {72675, 293}, {72679, 291}, {72682, 292}, {72686, 294}, {72694, 304}, {72712, 292}, {72713, 288}, {72714, 288}, + {72716, 291}, {72718, 290}, {72720, 290}, {72722, 290}, {72724, 291}, {72727, 292}, {72729, 290}, {72731, 295}, + {72733, 288}, {72735, 288}, {72737, 289}, {72740, 288}, {72741, 290}, {72743, 290}, {72745, 292}, {72746, 296}, + {72748, 293}, {72749, 290}, {72750, 290}, {72751, 291}, {72753, 298}, {72754, 297}, {72756, 291}, {72757, 288}, + {72760, 291}, {72763, 293}, {72766, 291}, {72769, 294}, {72772, 295}, {72775, 291}, {72777, 288}, {72780, 294}, + {72783, 291}, {72785, 292}, {72788, 294}, {72790, 289}, {72793, 297}, {72794, 288}, {72797, 289}, {72799, 290}, + {72801, 292}, {72804, 290}, {72806, 290}, {72809, 295}, {72811, 292}, {72814, 293}, {72816, 291}, {72819, 295}, + {72821, 290}, {72824, 295}, {72826, 291}, {72829, 292}, {72831, 295}, {72834, 289}, {72838, 290}, {72840, 297}, + {72843, 288}, {72845, 289}, {72848, 292}, {72851, 293}, {72853, 295}, {72855, 288}, {72859, 288}, {72861, 289}, + {72863, 288}, {72866, 288}, {72868, 292}, {72871, 289}, {72873, 290}, {72876, 289}, {72878, 291}, {72881, 299}, + {72884, 291}, {72887, 292}, {72889, 289}, {72892, 291}, {72894, 289}, {72896, 290}, {72899, 293}, {72901, 290}, + {72903, 290}, {72906, 291}, {72909, 290}, {72912, 289}, {72915, 294}, {72917, 290}, {72920, 288}, {72924, 289}, + {72926, 289}, {72930, 295}, {72933, 288}, {72939, 291}, {72939, 20}, {72943, 291}, {72948, 296}, {72951, 288}, + {72955, 289}, {72959, 292}, {72978, 291}, {72983, 293}, {72985, 292}, {72986, 290}, {72988, 290}, {72989, 295}, + {72991, 288}, {72992, 293}, {72994, 289}, {72995, 291}, {72997, 293}, {73000, 288}, {73003, 294}, {73005, 292}, + {73008, 290}, {73009, 292}, {73011, 291}, {73013, 289}, {73015, 289}, {73016, 289}, {73018, 290}, {73020, 290}, + {73022, 288}, {73024, 288}, {73026, 294}, {73029, 288}, {73032, 290}, {73035, 288}, {73039, 289}, {73041, 289}, + {73044, 291}, {73047, 292}, {73050, 298}, {73053, 288}, {73056, 292}, {73060, 289}, {73063, 289}, {73066, 294}, + {73069, 288}, {73072, 292}, {73074, 293}, {73077, 295}, {73080, 301}, {73082, 289}, {73085, 295}, {73088, 294}, + {73090, 292}, {73094, 297}, {73096, 290}, {73099, 288}, {73102, 298}, {73105, 288}, {73107, 291}, {73111, 291}, + {73113, 291}, {73116, 288}, {73118, 292}, {73121, 295}, {73124, 291}, {73127, 293}, {73130, 289}, {73133, 294}, + {73137, 294}, {73140, 288}, {73142, 291}, {73146, 289}, {73148, 291}, {73151, 294}, {73155, 295}, {73157, 295}, + {73161, 293}, {73164, 288}, {73167, 289}, {73171, 288}, {73174, 292}, {73178, 293}, {73182, 294}, {73185, 288}, + {73189, 292}, {73194, 289}, {73200, 296}, {73208, 290}, {73212, 288}, {73216, 290}, {73220, 290}, {73227, 297}, + {73246, 291}, {73248, 290}, {73250, 294}, {73252, 291}, {73253, 291}, {73255, 293}, {73257, 289}, {73259, 291}, + {73261, 290}, {73263, 290}, {73265, 288}, {73268, 291}, {73271, 294}, {73272, 292}, {73274, 289}, {73276, 291}, + {73278, 288}, {73281, 291}, {73282, 290}, {73284, 294}, {73286, 288}, {73289, 291}, {73292, 289}, {73295, 290}, + {73298, 296}, {73301, 296}, {73304, 290}, {73306, 288}, {73309, 290}, {73312, 296}, {73315, 298}, {73318, 295}, + {73321, 292}, {73324, 291}, {73326, 288}, {73328, 288}, {73331, 297}, {73334, 296}, {73337, 293}, {73339, 293}, + {73342, 290}, {73344, 292}, {73346, 289}, {73350, 288}, {73352, 293}, {73355, 292}, {73357, 289}, {73360, 299}, + {73362, 292}, {73365, 289}, {73367, 292}, {73370, 289}, {73373, 289}, {73376, 290}, {73378, 289}, {73381, 290}, + {73384, 292}, {73387, 290}, {73389, 292}, {73392, 294}, {73394, 292}, {73396, 291}, {73399, 290}, {73402, 290}, + {73405, 290}, {73407, 292}, {73410, 292}, {73412, 290}, {73415, 291}, {73418, 291}, {73421, 296}, {73423, 290}, + {73428, 289}, {73430, 294}, {73433, 289}, {73437, 288}, {73441, 293}, {73445, 292}, {73449, 296}, {73453, 290}, + {73456, 291}, {73460, 293}, {73463, 289}, {73467, 289}, {73487, 304}, {73493, 298}, {73494, 288}, {73496, 294}, + {73498, 293}, {73500, 289}, {73502, 288}, {73504, 291}, {73506, 290}, {73508, 292}, {73511, 293}, {73513, 290}, + {73515, 291}, {73517, 295}, {73519, 293}, {73522, 291}, {73524, 292}, {73526, 301}, {73528, 292}, {73530, 292}, + {73533, 290}, {73535, 294}, {73537, 288}, {73540, 293}, {73543, 294}, {73545, 295}, {73548, 290}, {73551, 292}, + {73554, 289}, {73556, 289}, {73559, 290}, {73562, 290}, {73564, 298}, {73567, 297}, {73569, 292}, {73572, 292}, + {73574, 290}, {73577, 289}, {73580, 288}, {73582, 297}, {73585, 290}, {73587, 290}, {73590, 295}, {73592, 294}, + {73594, 288}, {73597, 289}, {73599, 288}, {73602, 291}, {73604, 289}, {73607, 289}, {73609, 288}, {73612, 291}, + {73614, 288}, {73617, 296}, {73619, 290}, {73622, 293}, {73625, 292}, {73628, 298}, {73630, 294}, {73633, 292}, + {73635, 289}, {73638, 288}, {73640, 289}, {73643, 292}, {73646, 290}, {73650, 290}, {73653, 288}, {73655, 294}, + {73658, 288}, {73661, 289}, {73664, 294}, {73667, 292}, {73670, 290}, {73673, 289}, {73677, 292}, {73681, 288}, + {73686, 292}, {73688, 291}, {73692, 289}, {73695, 288}, {73699, 296}, {73702, 290}, {73713, 319}, {73727, 290}, + {73731, 296}, {73733, 296}, {73735, 298}, {73736, 289}, {73738, 290}, {73740, 296}, {73742, 294}, {73744, 293}, + {73746, 294}, {73748, 290}, {73750, 289}, {73752, 289}, {73755, 289}, {73757, 289}, {73762, 296}, {73764, 289}, + {73766, 292}, {73768, 291}, {73770, 290}, {73772, 293}, {73775, 293}, {73777, 289}, {73779, 294}, {73781, 300}, + {73783, 291}, {73786, 294}, {73788, 294}, {73791, 294}, {73793, 290}, {73795, 288}, {73797, 289}, {73800, 294}, + {73802, 290}, {73805, 289}, {73808, 294}, {73811, 291}, {73813, 289}, {73815, 292}, {73817, 293}, {73820, 298}, + {73823, 294}, {73825, 292}, {73827, 294}, {73830, 293}, {73832, 292}, {73834, 288}, {73837, 291}, {73839, 290}, + {73842, 291}, {73844, 289}, {73846, 290}, {73849, 294}, {73851, 291}, {73854, 294}, {73856, 291}, {73859, 289}, + {73861, 292}, {73864, 294}, {73866, 289}, {73868, 288}, {73872, 290}, {73874, 291}, {73877, 295}, {73878, 168}, + {73881, 293}, {73883, 289}, {73885, 295}, {73888, 290}, {73891, 295}, {73893, 295}, {73896, 288}, {73899, 289}, + {73902, 288}, {73904, 295}, {73907, 296}, {73910, 292}, {73912, 288}, {73916, 290}, {73920, 294}, {73923, 289}, + {73928, 289}, {73932, 292}, {73935, 297}, {73937, 291}, {73940, 293}, {73943, 294}, {73947, 291}, {73950, 294}, + {73953, 294}, {73970, 307}, {73980, 292}, {73983, 289}, {73985, 292}, {73987, 293}, {73989, 289}, {73991, 288}, + {73993, 297}, {73995, 289}, {73997, 292}, {73999, 290}, {74001, 293}, {74003, 293}, {74006, 289}, {74008, 288}, + {74011, 294}, {74014, 294}, {74016, 290}, {74018, 292}, {74022, 289}, {74026, 290}, {74029, 290}, {74033, 290}, + {74037, 294}, {74040, 289}, {74043, 301}, {74046, 288}, {74049, 288}, {74051, 290}, {74055, 291}, {74057, 290}, + {74060, 295}, {74063, 291}, {74066, 292}, {74069, 289}, {74071, 292}, {74074, 289}, {74077, 291}, {74080, 290}, + {74082, 288}, {74085, 294}, {74088, 291}, {74092, 289}, {74096, 288}, {74098, 294}, {74101, 293}, {74104, 300}, + {74107, 293}, {74110, 300}, {74112, 292}, {74115, 292}, {74118, 288}, {74121, 291}, {74123, 289}, {74126, 292}, + {74129, 299}, {74131, 291}, {74134, 297}, {74137, 297}, {74139, 290}, {74142, 293}, {74145, 292}, {74148, 292}, + {74150, 290}, {74153, 292}, {74156, 288}, {74159, 292}, {74162, 289}, {74165, 290}, {74168, 290}, {74171, 296}, + {74175, 289}, {74179, 292}, {74183, 288}, {74187, 289}, {74191, 294}, {74194, 288}, {74196, 291}, {74199, 288}, + {74203, 288}, {74206, 294}, {74209, 292}, {74212, 300}, {74218, 308}, {74235, 291}, {74243, 289}, {74248, 288}, + {74251, 293}, {74253, 292}, {74255, 291}, {74257, 292}, {74259, 289}, {74262, 294}, {74264, 291}, {74266, 288}, + {74269, 291}, {74271, 292}, {74274, 289}, {74276, 290}, {74279, 294}, {74281, 289}, {74284, 292}, {74287, 292}, + {74291, 289}, {74294, 291}, {74297, 288}, {74300, 290}, {74304, 292}, {74306, 288}, {74309, 293}, {74313, 290}, + {74317, 292}, {74320, 292}, {74322, 288}, {74325, 294}, {74328, 288}, {74330, 295}, {74333, 291}, {74335, 289}, + {74337, 292}, {74339, 291}, {74341, 292}, {74343, 296}, {74346, 299}, {74348, 290}, {74350, 293}, {74352, 292}, + {74354, 288}, {74356, 290}, {74359, 288}, {74361, 294}, {74363, 290}, {74365, 293}, {74367, 290}, {74369, 297}, + {74371, 290}, {74374, 292}, {74376, 301}, {74378, 289}, {74380, 288}, {74382, 292}, {74385, 289}, {74387, 293}, + {74390, 291}, {74392, 290}, {74394, 288}, {74396, 289}, {74398, 294}, {74401, 294}, {74403, 294}, {74406, 290}, + {74408, 289}, {74410, 300}, {74412, 289}, {74415, 294}, {74417, 288}, {74420, 290}, {74425, 289}, {74428, 294}, + {74432, 296}, {74435, 293}, {74439, 290}, {74442, 289}, {74444, 290}, {74446, 288}, {74449, 288}, {74451, 289}, + {74454, 292}, {74457, 289}, {74459, 288}, {74474, 288}, {74485, 294}, {74491, 290}, {74496, 290}, {74499, 288}, + {74501, 288}, {74503, 293}, {74506, 290}, {74508, 289}, {74511, 293}, {74513, 298}, {74516, 289}, {74518, 293}, + {74521, 293}, {74523, 289}, {74526, 294}, {74529, 296}, {74531, 292}, {74534, 289}, {74537, 289}, {74540, 293}, + {74543, 288}, {74546, 293}, {74548, 293}, {74550, 291}, {74553, 289}, {74555, 293}, {74557, 289}, {74560, 292}, + {74562, 290}, {74564, 290}, {74566, 291}, {74569, 290}, {74571, 291}, {74573, 289}, {74576, 293}, {74578, 291}, + {74580, 294}, {74582, 289}, {74585, 293}, {74587, 288}, {74589, 294}, {74591, 293}, {74593, 291}, {74596, 296}, + {74598, 291}, {74600, 293}, {74602, 291}, {74604, 289}, {74606, 289}, {74608, 289}, {74611, 292}, {74613, 289}, + {74614, 292}, {74617, 294}, {74619, 291}, {74621, 290}, {74623, 294}, {74625, 290}, {74627, 294}, {74629, 293}, + {74632, 291}, {74634, 289}, {74636, 297}, {74639, 291}, {74641, 290}, {74645, 294}, {74647, 288}, {74650, 290}, + {74653, 291}, {74657, 290}, {74660, 293}, {74664, 290}, {74668, 294}, {74671, 298}, {74673, 292}, {74675, 288}, + {74677, 291}, {74679, 291}, {74682, 291}, {74684, 288}, {74687, 294}, {74693, 292}, {74707, 292}, {74716, 288}, + {74721, 291}, {74726, 291}, {74729, 291}, {74731, 288}, {74734, 289}, {74736, 291}, {74739, 289}, {74742, 290}, + {74744, 292}, {74747, 291}, {74750, 290}, {74752, 296}, {74755, 289}, {74758, 289}, {74761, 293}, {74764, 293}, + {74766, 290}, {74769, 292}, {74772, 288}, {74775, 289}, {74777, 290}, {74780, 290}, {74782, 288}, {74784, 288}, + {74787, 290}, {74789, 289}, {74791, 296}, {74794, 295}, {74796, 291}, {74798, 289}, {74801, 291}, {74803, 296}, + {74805, 291}, {74807, 297}, {74809, 292}, {74812, 292}, {74813, 293}, {74816, 294}, {74818, 288}, {74820, 291}, + {74822, 290}, {74824, 292}, {74826, 288}, {74829, 291}, {74831, 291}, {74831, 13}, {74833, 289}, {74835, 293}, + {74837, 294}, {74839, 290}, {74841, 289}, {74843, 292}, {74845, 292}, {74847, 288}, {74850, 298}, {74852, 291}, + {74854, 293}, {74856, 299}, {74858, 290}, {74860, 291}, {74863, 294}, {74865, 300}, {74867, 291}, {74869, 291}, + {74871, 288}, {74874, 289}, {74878, 289}, {74881, 292}, {74884, 289}, {74888, 288}, {74892, 297}, {74895, 290}, + {74898, 294}, {74900, 288}, {74903, 288}, {74906, 289}, {74908, 288}, {74911, 293}, {74914, 288}, {74920, 291}, + {74934, 289}, {74943, 293}, {74949, 296}, {74954, 293}, {74957, 288}, {74960, 292}, {74962, 288}, {74965, 288}, + {74968, 289}, {74970, 288}, {74973, 292}, {74976, 292}, {74979, 291}, {74982, 296}, {74984, 292}, {74987, 296}, + {74990, 291}, {74993, 292}, {74996, 288}, {74999, 290}, {75002, 292}, {75004, 290}, {75007, 293}, {75009, 291}, + {75011, 290}, {75013, 289}, {75016, 288}, {75019, 292}, {75021, 292}, {75023, 289}, {75026, 291}, {75027, 288}, + {75030, 293}, {75032, 295}, {75035, 291}, {75038, 288}, {75040, 288}, {75043, 288}, {75045, 290}, {75047, 292}, + {75050, 295}, {75052, 292}, {75055, 291}, {75057, 296}, {75060, 296}, {75062, 290}, {75064, 289}, {75066, 289}, + {75069, 293}, {75075, 293}, {75078, 289}, {75079, 288}, {75082, 289}, {75085, 295}, {75087, 293}, {75089, 298}, + {75091, 297}, {75094, 292}, {75096, 293}, {75098, 293}, {75101, 288}, {75103, 295}, {75105, 294}, {75107, 295}, + {75109, 291}, {75111, 290}, {75113, 288}, {75115, 292}, {75118, 290}, {75120, 293}, {75122, 289}, {75125, 290}, + {75128, 292}, {75132, 291}, {75135, 292}, {75140, 289}, {75143, 290}, {75145, 290}, {75147, 293}, {75149, 289}, + {75152, 292}, {75154, 289}, {75157, 295}, {75159, 291}, {75162, 292}, {75174, 302}, {75184, 290}, {75193, 288}, + {75199, 290}, {75205, 290}, {75209, 293}, {75212, 290}, {75214, 288}, {75217, 290}, {75220, 291}, {75223, 291}, + {75226, 288}, {75229, 291}, {75233, 289}, {75236, 292}, {75239, 289}, {75242, 289}, {75246, 293}, {75249, 289}, + {75252, 288}, {75256, 295}, {75258, 290}, {75261, 292}, {75264, 293}, {75267, 294}, {75269, 290}, {75272, 297}, + {75275, 288}, {75278, 290}, {75281, 289}, {75284, 289}, {75287, 293}, {75290, 295}, {75293, 293}, {75297, 295}, + {75300, 290}, {75303, 293}, {75306, 294}, {75308, 292}, {75311, 289}, {75314, 292}, {75316, 296}, {75319, 297}, + {75321, 289}, {75324, 294}, {75326, 297}, {75329, 291}, {75331, 289}, {75334, 290}, {75337, 289}, {75339, 291}, + {75341, 290}, {75343, 297}, {75345, 296}, {75348, 290}, {75350, 291}, {75352, 291}, {75355, 293}, {75358, 301}, + {75361, 291}, {75364, 297}, {75366, 288}, {75369, 289}, {75373, 289}, {75376, 288}, {75380, 292}, {75383, 289}, + {75388, 292}, {75391, 291}, {75394, 290}, {75397, 288}, {75399, 290}, {75402, 290}, {75405, 294}, {75407, 288}, + {75410, 288}, {75417, 293}, {75430, 289}, {75440, 294}, {75448, 288}, {75455, 288}, {75460, 293}, {75463, 291}, + {75465, 293}, {75468, 289}, {75471, 294}, {75473, 291}, {75476, 292}, {75479, 288}, {75481, 288}, {75484, 289}, + {75487, 290}, {75490, 289}, {75493, 289}, {75496, 293}, {75500, 289}, {75503, 288}, {75506, 296}, {75509, 296}, + {75511, 292}, {75513, 292}, {75516, 288}, {75519, 292}, {75521, 293}, {75524, 292}, {75526, 297}, {75528, 288}, + {75531, 294}, {75533, 290}, {75535, 290}, {75538, 299}, {75540, 292}, {75542, 295}, {75544, 288}, {75547, 290}, + {75549, 293}, {75551, 290}, {75553, 288}, {75555, 291}, {75557, 292}, {75559, 296}, {75561, 299}, {75563, 289}, + {75566, 295}, {75568, 292}, {75570, 296}, {75572, 295}, {75574, 288}, {75576, 288}, {75578, 288}, {75581, 292}, + {75582, 288}, {75585, 291}, {75587, 292}, {75589, 289}, {75591, 295}, {75593, 292}, {75595, 292}, {75597, 290}, + {75599, 288}, {75601, 290}, {75603, 294}, {75605, 290}, {75608, 292}, {75610, 293}, {75613, 289}, {75616, 292}, + {75619, 292}, {75623, 292}, {75627, 290}, {75629, 296}, {75631, 298}, {75633, 290}, {75635, 288}, {75637, 290}, + {75640, 293}, {75642, 290}, {75645, 291}, {75647, 289}, {75650, 293}, {75663, 295}, {75673, 293}, {75681, 288}, + {75688, 288}, {75693, 292}, {75698, 288}, {75700, 289}, {75703, 291}, {75705, 294}, {75708, 288}, {75711, 289}, + {75713, 289}, {75716, 289}, {75719, 295}, {75721, 289}, {75724, 290}, {75727, 289}, {75730, 289}, {75732, 293}, + {75735, 293}, {75738, 290}, {75742, 294}, {75743, 183}, {75746, 288}, {75749, 290}, {75751, 295}, {75753, 288}, + {75755, 289}, {75758, 288}, {75760, 291}, {75763, 291}, {75764, 288}, {75767, 293}, {75769, 289}, {75771, 290}, + {75773, 290}, {75775, 292}, {75777, 291}, {75779, 289}, {75781, 291}, {75783, 291}, {75785, 289}, {75788, 289}, + {75790, 288}, {75792, 294}, {75794, 288}, {75796, 291}, {75797, 288}, {75799, 296}, {75801, 295}, {75803, 291}, + {75805, 293}, {75807, 296}, {75809, 292}, {75811, 290}, {75813, 293}, {75815, 293}, {75817, 292}, {75819, 293}, + {75821, 288}, {75823, 299}, {75825, 290}, {75827, 293}, {75829, 291}, {75831, 292}, {75833, 294}, {75835, 295}, + {75837, 289}, {75840, 292}, {75841, 291}, {75844, 292}, {75847, 298}, {75850, 291}, {75853, 288}, {75855, 290}, + {75858, 294}, {75862, 288}, {75865, 291}, {75867, 292}, {75869, 288}, {75871, 289}, {75874, 288}, {75876, 292}, + {75879, 291}, {75881, 291}, {75883, 292}, {75886, 291}, {75900, 302}, {75908, 290}, {75917, 292}, {75924, 290}, + {75929, 291}, {75933, 288}, {75936, 291}, {75939, 291}, {75941, 289}, {75944, 292}, {75947, 291}, {75949, 291}, + {75952, 289}, {75955, 290}, {75958, 293}, {75960, 290}, {75963, 294}, {75967, 288}, {75969, 293}, {75972, 288}, + {75975, 288}, {75978, 290}, {75981, 290}, {75984, 291}, {75986, 290}, {75988, 288}, {75991, 289}, {75993, 292}, + {75995, 288}, {75998, 288}, {76000, 291}, {76003, 288}, {76005, 291}, {76007, 289}, {76009, 293}, {76012, 290}, + {76015, 290}, {76018, 289}, {76021, 288}, {76023, 292}, {76026, 288}, {76028, 291}, {76031, 290}, {76033, 292}, + {76036, 288}, {76038, 291}, {76040, 292}, {76043, 294}, {76045, 298}, {76047, 296}, {76049, 291}, {76052, 290}, + {76054, 288}, {76056, 295}, {76058, 295}, {76061, 292}, {76063, 293}, {76065, 290}, {76068, 293}, {76071, 289}, + {76073, 296}, {76075, 289}, {76077, 295}, {76080, 292}, {76081, 293}, {76083, 298}, {76085, 290}, {76087, 289}, + {76089, 291}, {76091, 293}, {76093, 294}, {76095, 296}, {76097, 288}, {76100, 289}, {76103, 289}, {76106, 290}, + {76108, 292}, {76111, 288}, {76114, 292}, {76116, 292}, {76118, 295}, {76120, 294}, {76122, 291}, {76124, 291}, + {76126, 289}, {76128, 289}, {76131, 289}, {76133, 297}, {76136, 297}, {76139, 290}, {76149, 292}, {76159, 293}, + {76166, 290}, {76174, 290}, {76181, 291}, {76187, 288}, {76192, 291}, {76196, 291}, {76200, 294}, {76203, 294}, + {76207, 293}, {76211, 297}, {76214, 292}, {76218, 290}, {76222, 293}, {76225, 296}, {76230, 291}, {76233, 290}, + {76238, 294}, {76242, 291}, {76247, 289}, {76251, 289}, {76255, 289}, {76259, 295}, {76262, 293}, {76265, 288}, + {76269, 292}, {76272, 293}, {76275, 298}, {76278, 291}, {76281, 293}, {76284, 293}, {76286, 292}, {76288, 290}, + {76292, 291}, {76295, 291}, {76298, 289}, {76301, 289}, {76303, 289}, {76306, 290}, {76308, 292}, {76311, 294}, + {76314, 294}, {76316, 293}, {76318, 294}, {76320, 289}, {76322, 294}, {76324, 290}, {76326, 290}, {76329, 288}, + {76331, 288}, {76333, 295}, {76336, 288}, {76338, 293}, {76340, 289}, {76342, 288}, {76344, 291}, {76346, 299}, + {76348, 295}, {76350, 291}, {76353, 300}, {76355, 289}, {76357, 295}, {76360, 291}, {76362, 289}, {76364, 290}, + {76368, 291}, {76371, 290}, {76375, 291}, {76378, 291}, {76381, 289}, {76386, 288}, {76388, 288}, {76390, 289}, + {76393, 292}, {76396, 299}, {76398, 288}, {76401, 294}, {76403, 295}, {76406, 295}, {76408, 290}, {76419, 294}, + {76429, 289}, {76437, 289}, {76445, 294}, {76450, 291}, {76455, 291}, {76459, 293}, {76463, 290}, {76465, 291}, + {76468, 293}, {76471, 294}, {76473, 292}, {76476, 288}, {76479, 288}, {76482, 292}, {76484, 291}, {76487, 291}, + {76490, 291}, {76494, 290}, {76497, 291}, {76500, 289}, {76503, 289}, {76507, 292}, {76510, 292}, {76512, 288}, + {76515, 288}, {76517, 296}, {76520, 295}, {76522, 290}, {76525, 289}, {76527, 291}, {76530, 292}, {76532, 292}, + {76534, 290}, {76537, 298}, {76540, 296}, {76542, 298}, {76544, 290}, {76546, 293}, {76548, 290}, {76551, 289}, + {76553, 293}, {76555, 289}, {76557, 292}, {76559, 290}, {76561, 293}, {76563, 289}, {76565, 289}, {76567, 289}, + {76569, 289}, {76571, 296}, {76573, 294}, {76575, 293}, {76577, 292}, {76579, 295}, {76581, 288}, {76583, 292}, + {76585, 288}, {76587, 295}, {76589, 293}, {76591, 290}, {76593, 294}, {76595, 295}, {76597, 289}, {76599, 291}, + {76600, 294}, {76602, 292}, {76604, 299}, {76606, 293}, {76608, 292}, {76610, 289}, {76613, 291}, {76616, 289}, + {76618, 290}, {76621, 288}, {76624, 292}, {76627, 288}, {76630, 291}, {76631, 131}, {76633, 294}, {76635, 290}, + {76637, 288}, {76639, 291}, {76641, 292}, {76643, 291}, {76645, 293}, {76647, 288}, {76649, 288}, {76651, 292}, + {76657, 289}, {76666, 289}, {76675, 290}, {76682, 288}, {76689, 288}, {76695, 289}, {76700, 288}, {76704, 290}, + {76708, 291}, {76711, 290}, {76714, 294}, {76717, 294}, {76719, 292}, {76722, 291}, {76724, 293}, {76727, 295}, + {76730, 289}, {76733, 290}, {76735, 289}, {76738, 292}, {76741, 294}, {76744, 288}, {76747, 289}, {76750, 297}, + {76753, 289}, {76756, 288}, {76759, 288}, {76761, 288}, {76763, 289}, {76766, 288}, {76769, 289}, {76772, 288}, + {76773, 288}, {76776, 291}, {76778, 290}, {76780, 288}, {76783, 292}, {76785, 288}, {76787, 289}, {76789, 290}, + {76791, 289}, {76793, 292}, {76796, 291}, {76798, 290}, {76799, 289}, {76802, 292}, {76804, 291}, {76806, 289}, + {76808, 288}, {76810, 295}, {76812, 302}, {76813, 288}, {76816, 294}, {76818, 292}, {76820, 289}, {76821, 291}, + {76823, 288}, {76826, 290}, {76828, 288}, {76830, 303}, {76832, 290}, {76834, 292}, {76836, 299}, {76838, 291}, + {76840, 290}, {76842, 292}, {76844, 292}, {76846, 294}, {76848, 293}, {76850, 291}, {76851, 296}, {76854, 288}, + {76855, 291}, {76858, 291}, {76860, 289}, {76863, 292}, {76866, 288}, {76868, 290}, {76872, 289}, {76876, 290}, + {76878, 291}, {76880, 293}, {76882, 288}, {76884, 291}, {76887, 289}, {76889, 290}, {76891, 289}, {76894, 288}, + {76896, 290}, {76898, 290}, {76904, 289}, {76913, 291}, {76922, 292}, {76929, 290}, {76936, 290}, {76941, 290}, + {76946, 288}, {76950, 290}, {76954, 289}, {76957, 289}, {76960, 288}, {76963, 290}, {76965, 290}, {76968, 289}, + {76971, 290}, {76974, 289}, {76977, 292}, {76980, 289}, {76983, 292}, {76986, 291}, {76989, 292}, {76992, 290}, + {76996, 288}, {77001, 294}, {77004, 289}, {77009, 295}, {77012, 296}, {77016, 292}, {77019, 289}, {77026, 295}, + {77030, 288}, {77033, 293}, {77036, 296}, {77038, 299}, {77041, 291}, {77044, 292}, {77048, 290}, {77051, 293}, + {77054, 295}, {77056, 290}, {77059, 294}, {77062, 292}, {77064, 290}, {77066, 292}, {77068, 288}, {77070, 289}, + {77072, 296}, {77074, 294}, {77075, 292}, {77078, 301}, {77079, 290}, {77081, 291}, {77083, 294}, {77085, 292}, + {77087, 290}, {77089, 288}, {77091, 293}, {77093, 289}, {77095, 296}, {77096, 294}, {77098, 291}, {77100, 294}, + {77102, 289}, {77103, 300}, {77105, 291}, {77107, 290}, {77109, 291}, {77111, 294}, {77113, 293}, {77115, 290}, + {77117, 296}, {77119, 289}, {77122, 290}, {77124, 296}, {77127, 293}, {77130, 288}, {77133, 288}, {77138, 292}, + {77141, 297}, {77143, 290}, {77146, 295}, {77148, 294}, {77150, 293}, {77153, 293}, {77156, 293}, {77159, 293}, + {77162, 289}, {77165, 291}, {77171, 290}, {77181, 288}, {77191, 288}, {77198, 291}, {77208, 289}, {77215, 288}, + {77222, 289}, {77228, 288}, {77233, 295}, {77237, 291}, {77240, 291}, {77244, 293}, {77249, 291}, {77252, 289}, + {77256, 290}, {77260, 288}, {77264, 297}, {77268, 292}, {77271, 290}, {77275, 289}, {77279, 288}, {77283, 290}, + {77287, 297}, {77291, 290}, {77294, 289}, {77298, 293}, {77300, 288}, {77304, 292}, {77307, 297}, {77310, 293}, + {77313, 291}, {77315, 288}, {77318, 288}, {77320, 288}, {77322, 289}, {77325, 289}, {77327, 290}, {77329, 296}, + {77332, 288}, {77334, 301}, {77336, 294}, {77338, 289}, {77340, 295}, {77343, 288}, {77345, 291}, {77347, 297}, + {77349, 299}, {77351, 300}, {77353, 288}, {77355, 295}, {77357, 292}, {77359, 288}, {77361, 289}, {77363, 293}, + {77365, 296}, {77367, 288}, {77369, 288}, {77371, 297}, {77373, 288}, {77375, 293}, {77377, 295}, {77378, 289}, + {77380, 292}, {77382, 293}, {77384, 288}, {77386, 294}, {77388, 294}, {77390, 297}, {77392, 296}, {77394, 299}, + {77397, 295}, {77400, 289}, {77401, 293}, {77403, 288}, {77406, 288}, {77408, 290}, {77411, 289}, {77413, 289}, + {77416, 290}, {77417, 296}, {77419, 289}, {77421, 296}, {77422, 288}, {77424, 292}, {77426, 293}, {77427, 294}, + {77429, 291}, {77431, 289}, {77433, 294}, {77435, 289}, {77436, 289}, {77441, 290}, {77447, 288}, {77455, 288}, + {77463, 288}, {77470, 290}, {77477, 288}, {77485, 291}, {77489, 289}, {77494, 291}, {77497, 288}, {77499, 130}, + {77503, 291}, {77505, 290}, {77508, 289}, {77511, 293}, {77514, 289}, {77517, 290}, {77519, 289}, {77522, 289}, + {77526, 290}, {77529, 289}, {77532, 291}, {77535, 288}, {77538, 289}, {77541, 288}, {77543, 289}, {77547, 291}, + {77550, 289}, {77553, 292}, {77556, 291}, {77558, 294}, {77560, 290}, {77563, 289}, {77565, 288}, {77567, 293}, + {77569, 295}, {77571, 289}, {77574, 292}, {77578, 290}, {77580, 289}, {77582, 290}, {77584, 288}, {77587, 290}, + {77589, 293}, {77591, 288}, {77593, 290}, {77595, 291}, {77597, 290}, {77598, 292}, {77600, 292}, {77602, 290}, + {77604, 292}, {77606, 288}, {77608, 292}, {77609, 294}, {77611, 289}, {77612, 295}, {77614, 294}, {77616, 293}, + {77618, 295}, {77620, 291}, {77621, 289}, {77623, 293}, {77625, 290}, {77627, 293}, {77629, 290}, {77631, 292}, + {77633, 294}, {77634, 294}, {77636, 294}, {77637, 289}, {77639, 293}, {77641, 291}, {77642, 293}, {77644, 290}, + {77646, 292}, {77648, 288}, {77650, 295}, {77651, 292}, {77654, 293}, {77655, 289}, {77657, 292}, {77660, 289}, + {77662, 295}, {77665, 294}, {77667, 293}, {77670, 289}, {77673, 290}, {77676, 290}, {77678, 296}, {77680, 290}, + {77682, 289}, {77684, 290}, {77686, 296}, {77688, 295}, {77690, 294}, {77692, 295}, {77694, 288}, {77696, 293}, + {77698, 293}, {77699, 291}, {77707, 290}, {77716, 288}, {77726, 289}, {77734, 291}, {77742, 289}, {77751, 289}, + {77757, 288}, {77764, 290}, {77769, 294}, {77774, 289}, {77778, 289}, {77781, 296}, {77785, 289}, {77789, 291}, + {77793, 292}, {77796, 296}, {77802, 292}, {77806, 293}, {77811, 291}, {77815, 289}, {77820, 288}, {77825, 293}, + {77829, 293}, {77833, 288}, {77836, 294}, {77841, 289}, {77845, 297}, {77848, 290}, {77852, 288}, {77856, 289}, + {77859, 290}, {77863, 293}, {77865, 289}, {77868, 290}, {77870, 290}, {77873, 295}, {77875, 289}, {77877, 292}, + {77880, 292}, {77882, 291}, {77885, 289}, {77887, 294}, {77889, 290}, {77891, 295}, {77893, 289}, {77896, 292}, + {77897, 291}, {77899, 297}, {77901, 290}, {77904, 294}, {77906, 288}, {77908, 288}, {77911, 291}, {77914, 289}, + {77917, 290}, {77919, 289}, {77922, 289}, {77925, 296}, {77927, 296}, {77930, 297}, {77932, 294}, {77934, 292}, + {77937, 289}, {77939, 290}, {77942, 295}, {77944, 288}, {77947, 290}, {77949, 291}, {77951, 291}, {77954, 292}, + {77956, 288}, {77959, 291}, {77963, 295}, {77966, 290}, {77970, 293}, {77974, 296}, {77978, 294}, {77982, 288}, + {77985, 297}, {77987, 289}, {77990, 290}, {77992, 296}, {77994, 288}, {77997, 290}, {78000, 291}, {78002, 296}, + {78004, 291}, {78006, 294}, {78009, 290}, {78013, 291}, {78022, 292}, {78031, 288}, {78039, 290}, {78046, 288}, + {78052, 290}, {78059, 290}, {78067, 288}, {78072, 292}, {78077, 290}, {78081, 294}, {78085, 289}, {78088, 288}, + {78091, 289}, {78093, 290}, {78096, 293}, {78099, 296}, {78102, 292}, {78105, 289}, {78107, 290}, {78110, 293}, + {78113, 294}, {78116, 293}, {78119, 290}, {78122, 292}, {78124, 290}, {78126, 294}, {78129, 290}, {78131, 289}, + {78133, 292}, {78135, 288}, {78137, 292}, {78140, 290}, {78142, 289}, {78145, 289}, {78147, 289}, {78149, 289}, + {78151, 294}, {78153, 292}, {78155, 289}, {78158, 295}, {78159, 291}, {78161, 297}, {78163, 288}, {78165, 294}, + {78167, 294}, {78169, 288}, {78171, 291}, {78173, 293}, {78175, 296}, {78177, 290}, {78179, 289}, {78181, 293}, + {78182, 293}, {78184, 297}, {78186, 296}, {78188, 290}, {78189, 289}, {78191, 290}, {78193, 288}, {78195, 288}, + {78196, 297}, {78198, 290}, {78199, 295}, {78200, 289}, {78202, 289}, {78203, 293}, {78205, 291}, {78207, 288}, + {78208, 294}, {78210, 292}, {78212, 293}, {78213, 288}, {78215, 293}, {78217, 289}, {78218, 295}, {78220, 291}, + {78221, 291}, {78223, 288}, {78224, 291}, {78226, 292}, {78228, 292}, {78229, 293}, {78231, 290}, {78233, 295}, + {78234, 288}, {78236, 289}, {78237, 288}, {78239, 294}, {78241, 294}, {78242, 296}, {78244, 295}, {78246, 293}, + {78248, 293}, {78251, 289}, {78253, 297}, {78255, 288}, {78258, 295}, {78261, 291}, {78263, 289}, {78265, 296}, + {78267, 290}, {78268, 288}, {78270, 293}, {78272, 289}, {78274, 294}, {78276, 299}, {78278, 294}, {78280, 292}, + {78282, 292}, {78283, 291}, {78286, 292}, {78292, 290}, {78298, 289}, {78307, 294}, {78317, 288}, {78324, 289}, + {78332, 288}, {78336, 133}, {78343, 288}, {78350, 289}, {78358, 289}, {78363, 294}, {78366, 292}, {78370, 289}, + {78374, 288}, {78377, 288}, {78381, 294}, {78384, 290}, {78388, 291}, {78391, 292}, {78395, 294}, {78399, 289}, + {78403, 289}, {78408, 288}, {78411, 294}, {78416, 290}, {78420, 291}, {78424, 289}, {78429, 290}, {78431, 289}, + {78434, 292}, {78437, 293}, {78440, 289}, {78442, 289}, {78445, 294}, {78448, 293}, {78451, 292}, {78453, 289}, + {78456, 291}, {78458, 289}, {78461, 292}, {78462, 290}, {78465, 289}, {78468, 292}, {78471, 295}, {78473, 289}, + {78475, 291}, {78478, 288}, {78481, 288}, {78484, 291}, {78486, 293}, {78489, 289}, {78491, 300}, {78494, 288}, + {78497, 292}, {78500, 292}, {78502, 294}, {78505, 288}, {78508, 291}, {78511, 293}, {78514, 288}, {78516, 291}, + {78519, 293}, {78521, 292}, {78524, 295}, {78526, 291}, {78528, 288}, {78531, 292}, {78533, 292}, {78536, 296}, + {78538, 293}, {78541, 294}, {78544, 289}, {78546, 292}, {78548, 290}, {78552, 294}, {78554, 289}, {78557, 293}, + {78561, 289}, {78564, 289}, {78567, 290}, {78571, 293}, {78576, 289}, {78580, 289}, {78582, 294}, {78585, 300}, + {78587, 289}, {78590, 295}, {78593, 295}, {78596, 296}, {78599, 297}, {78601, 288}, {78604, 292}, {78606, 293}, + {78608, 288}, {78615, 290}, {78622, 288}, {78631, 288}, {78639, 288}, {78647, 291}, {78654, 289}, {78661, 290}, + {78667, 290}, {78672, 290}, {78678, 292}, {78684, 288}, {78687, 292}, {78691, 288}, {78694, 290}, {78697, 291}, + {78700, 288}, {78702, 288}, {78705, 293}, {78707, 289}, {78710, 288}, {78712, 289}, {78714, 291}, {78717, 294}, + {78719, 295}, {78721, 291}, {78723, 292}, {78726, 290}, {78728, 290}, {78730, 291}, {78732, 294}, {78735, 288}, + {78737, 289}, {78740, 288}, {78741, 289}, {78744, 288}, {78746, 288}, {78748, 289}, {78750, 292}, {78752, 289}, + {78755, 290}, {78756, 292}, {78759, 290}, {78761, 293}, {78763, 290}, {78765, 291}, {78766, 292}, {78768, 292}, + {78770, 292}, {78772, 290}, {78774, 291}, {78776, 290}, {78778, 298}, {78780, 288}, {78782, 296}, {78783, 289}, + {78785, 288}, {78787, 293}, {78789, 291}, {78790, 292}, {78792, 293}, {78793, 292}, {78795, 294}, {78797, 289}, + {78798, 293}, {78800, 295}, {78802, 298}, {78803, 297}, {78805, 292}, {78807, 288}, {78809, 294}, {78811, 288}, + {78813, 290}, {78815, 288}, {78816, 293}, {78818, 289}, {78820, 290}, {78822, 290}, {78823, 290}, {78825, 290}, + {78826, 290}, {78827, 288}, {78829, 293}, {78831, 294}, {78833, 288}, {78834, 292}, {78836, 296}, {78838, 300}, + {78840, 297}, {78841, 290}, {78843, 289}, {78844, 293}, {78846, 289}, {78849, 288}, {78850, 290}, {78853, 291}, + {78854, 289}, {78856, 292}, {78858, 291}, {78861, 289}, {78864, 290}, {78866, 289}, {78869, 296}, {78871, 292}, + {78872, 296}, {78874, 296}, {78876, 291}, {78878, 289}, {78880, 288}, {78882, 289}, {78884, 288}, {78886, 290}, + {78888, 288}, {78890, 292}, {78892, 289}, {78896, 288}, {78904, 288}, {78913, 290}, {78920, 290}, {78929, 288}, + {78937, 289}, {78944, 291}, {78951, 290}, {78959, 289}, {78964, 292}, {78970, 290}, {78974, 292}, {78978, 289}, + {78982, 290}, {78985, 288}, {78988, 288}, {78991, 289}, {78994, 291}, {78998, 290}, {79002, 291}, {79006, 290}, + {79010, 292}, {79014, 292}, {79019, 289}, {79027, 298}, {79031, 290}, {79033, 293}, {79036, 288}, {79038, 289}, + {79041, 289}, {79043, 288}, {79046, 288}, {79048, 294}, {79050, 288}, {79053, 294}, {79056, 290}, {79058, 292}, + {79061, 293}, {79063, 296}, {79065, 288}, {79068, 290}, {79070, 288}, {79073, 290}, {79075, 290}, {79077, 288}, + {79080, 292}, {79083, 288}, {79087, 292}, {79089, 290}, {79092, 291}, {79095, 290}, {79098, 298}, {79101, 291}, + {79104, 295}, {79106, 289}, {79109, 299}, {79111, 292}, {79113, 290}, {79115, 294}, {79118, 288}, {79121, 292}, + {79123, 289}, {79126, 289}, {79129, 289}, {79131, 290}, {79134, 291}, {79138, 289}, {79141, 296}, {79143, 291}, + {79145, 288}, {79148, 294}, {79151, 291}, {79153, 291}, {79156, 288}, {79159, 289}, {79161, 291}, {79164, 294}, + {79166, 297}, {79169, 288}, {79172, 295}, {79174, 293}, {79177, 289}, {79180, 292}, {79183, 288}, {79187, 291}, + {79190, 289}, {79193, 288}, {79197, 294}, {79201, 290}, {79204, 289}, {79207, 291}, {79210, 294}, {79211, 108}, + {79213, 291}, {79215, 295}, {79217, 292}, {79219, 293}, {79221, 288}, {79223, 289}, {79225, 291}, {79227, 291}, + {79229, 288}, {79231, 290}, {79233, 289}, {79236, 288}, {79238, 292}, {79240, 290}, {79242, 291}, {79244, 288}, + {79251, 289}, {79259, 290}, {79267, 292}, {79274, 288}, {79281, 289}, {79288, 293}, {79295, 288}, {79302, 292}, + {79310, 289}, {79314, 292}, {79317, 290}, {79321, 289}, {79324, 288}, {79326, 291}, {79328, 289}, {79330, 288}, + {79332, 288}, {79335, 291}, {79336, 292}, {79338, 289}, {79340, 291}, {79342, 289}, {79345, 288}, {79347, 291}, + {79349, 290}, {79351, 291}, {79353, 293}, {79355, 292}, {79358, 289}, {79359, 290}, {79361, 291}, {79363, 296}, + {79365, 304}, {79366, 289}, {79368, 290}, {79370, 288}, {79372, 291}, {79374, 290}, {79376, 293}, {79378, 292}, + {79381, 289}, {79383, 289}, {79385, 289}, {79388, 290}, {79390, 291}, {79393, 289}, {79395, 289}, {79397, 291}, + {79400, 293}, {79403, 288}, {79406, 294}, {79409, 293}, {79412, 298}, {79415, 290}, {79417, 289}, {79420, 290}, + {79423, 289}, {79425, 289}, {79428, 294}, {79431, 297}, {79433, 290}, {79435, 290}, {79438, 288}, {79440, 294}, + {79443, 295}, {79446, 293}, {79448, 290}, {79450, 289}, {79452, 295}, {79454, 289}, {79456, 288}, {79459, 291}, + {79461, 296}, {79464, 297}, {79467, 290}, {79470, 295}, {79472, 289}, {79475, 295}, {79478, 289}, {79480, 299}, + {79482, 294}, {79484, 290}, {79487, 294}, {79489, 290}, {79491, 295}, {79493, 298}, {79495, 294}, {79498, 293}, + {79500, 288}, {79502, 292}, {79504, 291}, {79506, 292}, {79508, 295}, {79511, 291}, {79513, 294}, {79516, 290}, + {79519, 288}, {79522, 289}, {79524, 289}, {79527, 293}, {79530, 292}, {79533, 291}, {79537, 293}, {79540, 292}, + {79543, 294}, {79546, 291}, {79549, 292}, {79552, 289}, {79555, 288}, {79558, 297}, {79562, 288}, {79565, 289}, + {79569, 293}, {79572, 293}, {79575, 294}, {79583, 289}, {79595, 289}, {79603, 290}, {79611, 288}, {79619, 289}, + {79626, 292}, {79633, 288}, {79641, 288}, {79649, 289}, {79654, 290}, {79659, 289}, {79663, 289}, {79665, 290}, + {79668, 292}, {79670, 292}, {79673, 295}, {79675, 290}, {79678, 288}, {79680, 290}, {79682, 289}, {79684, 289}, + {79686, 291}, {79690, 292}, {79692, 290}, {79694, 290}, {79696, 288}, {79698, 288}, {79700, 293}, {79702, 289}, + {79704, 304}, {79706, 291}, {79708, 311}, {79711, 289}, {79713, 288}, {79715, 299}, {79717, 290}, {79719, 291}, + {79722, 302}, {79724, 290}, {79726, 303}, {79729, 296}, {79731, 292}, {79735, 288}, {79737, 289}, {79739, 288}, + {79742, 290}, {79744, 288}, {79747, 293}, {79750, 290}, {79752, 288}, {79755, 290}, {79758, 291}, {79761, 290}, + {79764, 290}, {79767, 292}, {79769, 288}, {79772, 288}, {79775, 290}, {79776, 288}, {79778, 289}, {79780, 288}, + {79782, 291}, {79784, 291}, {79786, 288}, {79788, 294}, {79789, 292}, {79791, 292}, {79793, 291}, {79795, 294}, + {79797, 289}, {79800, 288}, {79802, 288}, {79804, 289}, {79807, 294}, {79809, 288}, {79811, 296}, {79814, 288}, + {79816, 292}, {79818, 292}, {79820, 293}, {79822, 288}, {79824, 291}, {79825, 292}, {79827, 290}, {79830, 292}, + {79832, 292}, {79834, 293}, {79836, 288}, {79838, 292}, {79840, 292}, {79843, 288}, {79845, 289}, {79847, 294}, + {79849, 291}, {79851, 289}, {79853, 292}, {79855, 288}, {79857, 289}, {79859, 294}, {79861, 296}, {79863, 289}, + {79866, 288}, {79868, 291}, {79870, 297}, {79871, 298}, {79873, 290}, {79876, 290}, {79878, 293}, {79880, 290}, + {79882, 293}, {79885, 297}, {79888, 293}, {79890, 288}, {79892, 288}, {79895, 292}, {79898, 295}, {79901, 288}, + {79904, 294}, {79906, 293}, {79908, 290}, {79912, 293}, {79914, 288}, {79916, 288}, {79918, 293}, {79920, 289}, + {79922, 290}, {79924, 291}, {79927, 289}, {79929, 290}, {79931, 293}, {79933, 289}, {79935, 295}, {79943, 291}, + {79950, 292}, {79958, 293}, {79968, 292}, {79979, 289}, {79990, 290}, {79996, 290}, {80000, 298}, {80004, 289}, + {80008, 291}, {80011, 288}, {80013, 293}, {80015, 290}, {80018, 289}, {80023, 289}, {80026, 295}, {80028, 292}, + {80031, 288}, {80034, 299}, {80036, 288}, {80039, 293}, {80041, 291}, {80044, 289}, {80046, 293}, {80049, 297}, + {80050, 129}, {80052, 288}, {80055, 303}, {80057, 288}, {80060, 290}, {80063, 300}, {80066, 303}, {80069, 289}, + {80072, 290}, {80075, 291}, {80078, 291}, {80081, 293}, {80084, 289}, {80087, 299}, {80090, 292}, {80094, 294}, + {80098, 288}, {80101, 292}, {80105, 288}, {80109, 290}, {80112, 292}, {80115, 289}, {80119, 288}, {80122, 291}, + {80125, 288}, {80128, 288}, {80132, 289}, {80135, 289}, {80138, 293}, {80141, 290}, {80145, 289}, {80147, 288}, + {80151, 299}, {80154, 291}, {80157, 288}, {80160, 291}, {80162, 288}, {80165, 295}, {80168, 291}, {80171, 296}, + {80174, 290}, {80177, 296}, {80179, 291}, {80182, 296}, {80184, 290}, {80187, 290}, {80189, 288}, {80192, 293}, + {80194, 291}, {80196, 288}, {80198, 290}, {80199, 290}, {80202, 290}, {80205, 296}, {80207, 292}, {80210, 289}, + {80212, 288}, {80215, 289}, {80217, 298}, {80219, 295}, {80222, 294}, {80224, 290}, {80226, 296}, {80228, 293}, + {80230, 294}, {80233, 292}, {80235, 290}, {80238, 293}, {80240, 296}, {80243, 291}, {80246, 293}, {80248, 297}, + {80250, 292}, {80253, 288}, {80255, 289}, {80257, 291}, {80259, 289}, {80263, 296}, {80265, 290}, {80267, 288}, + {80270, 293}, {80272, 290}, {80275, 299}, {80278, 295}, {80281, 293}, {80285, 292}, {80287, 294}, {80289, 288}, + {80292, 299}, {80294, 290}, {80296, 289}, {80298, 291}, {80300, 294}, {80303, 294}, {80305, 292}, {80307, 297}, + {80309, 291}, {80311, 292}, {80314, 290}, {80316, 291}, {80318, 291}, {80325, 288}, {80333, 292}, {80341, 293}, + {80346, 290}, {80353, 288}, {80359, 291}, {80365, 288}, {80370, 289}, {80374, 291}, {80378, 288}, {80381, 288}, + {80384, 292}, {80386, 291}, {80388, 297}, {80390, 290}, {80393, 298}, {80395, 295}, {80397, 290}, {80400, 292}, + {80403, 290}, {80405, 301}, {80408, 288}, {80410, 290}, {80413, 290}, {80415, 293}, {80418, 290}, {80420, 289}, + {80423, 298}, {80426, 310}, {80429, 293}, {80432, 302}, {80434, 296}, {80438, 292}, {80440, 288}, {80443, 294}, + {80446, 295}, {80448, 291}, {80451, 291}, {80454, 290}, {80456, 289}, {80459, 290}, {80462, 295}, {80466, 289}, + {80470, 288}, {80473, 296}, {80476, 292}, {80479, 289}, {80483, 293}, {80486, 292}, {80490, 289}, {80493, 289}, + {80496, 297}, {80499, 292}, {80502, 291}, {80505, 288}, {80508, 288}, {80512, 290}, {80515, 289}, {80518, 290}, + {80522, 293}, {80525, 292}, {80528, 290}, {80530, 291}, {80533, 290}, {80536, 295}, {80539, 289}, {80542, 290}, + {80545, 290}, {80548, 288}, {80551, 289}, {80554, 297}, {80557, 290}, {80559, 293}, {80562, 289}, {80565, 290}, + {80567, 291}, {80569, 288}, {80572, 293}, {80576, 291}, {80580, 291}, {80583, 291}, {80586, 292}, {80589, 289}, + {80591, 288}, {80594, 289}, {80597, 289}, {80599, 290}, {80601, 290}, {80604, 293}, {80606, 288}, {80608, 295}, + {80611, 292}, {80614, 291}, {80616, 293}, {80618, 288}, {80621, 288}, {80623, 293}, {80626, 291}, {80628, 293}, + {80630, 290}, {80632, 293}, {80634, 288}, {80637, 289}, {80640, 290}, {80642, 288}, {80644, 293}, {80647, 297}, + {80650, 291}, {80653, 289}, {80656, 288}, {80659, 298}, {80662, 289}, {80665, 296}, {80668, 292}, {80670, 290}, + {80672, 293}, {80674, 288}, {80676, 291}, {80679, 292}, {80681, 291}, {80683, 292}, {80687, 292}, {80689, 290}, + {80691, 288}, {80693, 291}, {80695, 292}, {80698, 295}, {80700, 293}, {80702, 289}, {80710, 292}, {80718, 288}, + {80726, 289}, {80734, 291}, {80739, 288}, {80744, 288}, {80749, 291}, {80754, 288}, {80758, 289}, {80762, 290}, + {80765, 288}, {80768, 289}, {80770, 288}, {80772, 289}, {80774, 291}, {80776, 288}, {80778, 309}, {80780, 291}, + {80782, 290}, {80784, 295}, {80786, 290}, {80788, 294}, {80790, 290}, {80792, 303}, {80794, 289}, {80798, 289}, + {80800, 292}, {80803, 300}, {80806, 288}, {80808, 292}, {80811, 290}, {80813, 292}, {80816, 288}, {80818, 291}, + {80821, 288}, {80823, 293}, {80826, 289}, {80828, 292}, {80830, 294}, {80833, 288}, {80835, 295}, {80838, 291}, + {80840, 288}, {80843, 291}, {80845, 290}, {80848, 293}, {80851, 289}, {80854, 290}, {80858, 293}, {80862, 290}, + {80865, 295}, {80868, 289}, {80872, 294}, {80875, 288}, {80879, 291}, {80882, 289}, {80885, 294}, {80889, 290}, + {80892, 288}, {80896, 295}, {80899, 295}, {80902, 294}, {80907, 288}, {80910, 294}, {80913, 289}, {80916, 293}, + {80919, 291}, {80922, 210}, {80925, 293}, {80928, 289}, {80931, 289}, {80933, 297}, {80936, 295}, {80939, 293}, + {80942, 289}, {80945, 292}, {80948, 296}, {80950, 290}, {80953, 291}, {80957, 291}, {80959, 291}, {80963, 292}, + {80966, 291}, {80969, 295}, {80972, 289}, {80975, 295}, {80978, 289}, {80981, 290}, {80983, 289}, {80985, 289}, + {80988, 288}, {80991, 293}, {80994, 292}, {80997, 291}, {80999, 294}, {81002, 290}, {81004, 288}, {81006, 288}, + {81008, 291}, {81011, 291}, {81013, 289}, {81015, 289}, {81019, 293}, {81022, 288}, {81025, 298}, {81027, 289}, + {81030, 293}, {81032, 289}, {81035, 292}, {81038, 289}, {81041, 290}, {81044, 288}, {81047, 288}, {81049, 292}, + {81052, 288}, {81054, 289}, {81057, 298}, {81059, 295}, {81061, 288}, {81064, 293}, {81066, 288}, {81068, 292}, + {81070, 294}, {81072, 290}, {81074, 292}, {81077, 288}, {81079, 290}, {81082, 289}, {81084, 288}, {81086, 297}, + {81094, 289}, {81102, 288}, {81110, 294}, {81120, 290}, {81125, 293}, {81130, 288}, {81136, 291}, {81141, 292}, + {81144, 288}, {81148, 295}, {81151, 292}, {81154, 289}, {81156, 291}, {81158, 293}, {81160, 289}, {81162, 289}, + {81164, 290}, {81166, 294}, {81168, 288}, {81170, 302}, {81172, 305}, {81174, 303}, {81176, 302}, {81179, 302}, + {81181, 288}, {81183, 290}, {81185, 303}, {81188, 288}, {81190, 289}, {81192, 309}, {81195, 289}, {81197, 292}, + {81198, 292}, {81201, 290}, {81204, 292}, {81206, 289}, {81209, 307}, {81211, 306}, {81213, 299}, {81216, 303}, + {81218, 288}, {81221, 289}, {81224, 302}, {81227, 292}, {81229, 296}, {81232, 295}, {81234, 313}, {81237, 288}, + {81240, 290}, {81243, 288}, {81246, 292}, {81249, 296}, {81252, 288}, {81255, 292}, {81258, 292}, {81261, 293}, + {81265, 296}, {81269, 296}, {81272, 289}, {81275, 290}, {81278, 288}, {81282, 288}, {81285, 291}, {81288, 295}, + {81291, 289}, {81294, 290}, {81297, 289}, {81301, 290}, {81304, 291}, {81307, 288}, {81310, 292}, {81314, 291}, + {81317, 294}, {81319, 288}, {81322, 288}, {81325, 291}, {81328, 289}, {81331, 288}, {81333, 291}, {81338, 293}, + {81341, 291}, {81344, 290}, {81347, 289}, {81350, 291}, {81353, 288}, {81356, 292}, {81359, 289}, {81361, 289}, + {81364, 290}, {81367, 292}, {81370, 289}, {81373, 290}, {81376, 293}, {81378, 288}, {81381, 295}, {81383, 288}, + {81386, 289}, {81389, 289}, {81392, 292}, {81395, 297}, {81398, 289}, {81401, 288}, {81402, 292}, {81405, 288}, + {81407, 289}, {81409, 288}, {81412, 295}, {81414, 292}, {81416, 293}, {81419, 294}, {81422, 291}, {81425, 295}, + {81428, 293}, {81431, 289}, {81434, 291}, {81437, 288}, {81439, 294}, {81441, 292}, {81443, 288}, {81445, 292}, + {81449, 296}, {81451, 294}, {81453, 292}, {81456, 289}, {81457, 293}, {81460, 291}, {81462, 292}, {81465, 293}, + {81467, 290}, {81470, 289}, {81472, 296}, {81474, 290}, {81477, 292}, {81485, 294}, {81494, 288}, {81501, 289}, + {81506, 290}, {81512, 291}, {81517, 289}, {81522, 288}, {81527, 289}, {81533, 291}, {81536, 289}, {81540, 293}, + {81543, 291}, {81546, 290}, {81548, 289}, {81551, 288}, {81553, 289}, {81555, 290}, {81556, 289}, {81560, 288}, + {81562, 288}, {81564, 290}, {81565, 311}, {81568, 292}, {81570, 289}, {81572, 296}, {81574, 288}, {81577, 289}, + {81579, 313}, {81581, 293}, {81583, 289}, {81586, 294}, {81588, 290}, {81591, 290}, {81593, 306}, {81595, 289}, + {81598, 295}, {81600, 292}, {81602, 303}, {81605, 291}, {81608, 288}, {81609, 297}, {81612, 289}, {81615, 289}, + {81618, 296}, {81620, 297}, {81622, 293}, {81625, 292}, {81628, 291}, {81630, 290}, {81633, 289}, {81635, 292}, + {81637, 302}, {81640, 289}, {81643, 291}, {81646, 289}, {81649, 294}, {81652, 288}, {81654, 303}, {81657, 288}, + {81660, 290}, {81663, 289}, {81666, 293}, {81671, 289}, {81674, 293}, {81677, 288}, {81680, 292}, {81684, 292}, + {81687, 290}, {81691, 298}, {81693, 288}, {81696, 288}, {81700, 288}, {81703, 289}, {81706, 288}, {81709, 290}, + {81712, 289}, {81716, 291}, {81718, 289}, {81722, 291}, {81725, 295}, {81728, 289}, {81731, 289}, {81734, 293}, + {81736, 289}, {81739, 292}, {81742, 289}, {81745, 292}, {81748, 289}, {81751, 291}, {81754, 288}, {81757, 292}, + {81760, 290}, {81763, 294}, {81766, 292}, {81769, 290}, {81770, 135}, {81773, 290}, {81776, 289}, {81780, 291}, + {81783, 290}, {81785, 295}, {81788, 294}, {81791, 290}, {81794, 292}, {81797, 290}, {81799, 289}, {81802, 291}, + {81803, 288}, {81806, 291}, {81808, 288}, {81810, 289}, {81811, 288}, {81814, 297}, {81816, 288}, {81818, 290}, + {81821, 289}, {81822, 290}, {81824, 293}, {81826, 291}, {81828, 289}, {81830, 291}, {81832, 288}, {81835, 288}, + {81837, 290}, {81839, 289}, {81842, 292}, {81844, 289}, {81847, 293}, {81850, 295}, {81852, 293}, {81854, 290}, + {81857, 290}, {81859, 289}, {81862, 290}, {81864, 292}, {81867, 290}, {81869, 295}, {81872, 289}, {81874, 289}, + {81877, 288}, {81880, 294}, {81882, 294}, {81885, 293}, {81887, 295}, {81891, 290}, {81894, 288}, {81901, 288}, + {81906, 288}, {81911, 290}, {81916, 289}, {81921, 292}, {81927, 290}, {81932, 288}, {81936, 289}, {81941, 291}, + {81947, 289}, {81951, 293}, {81954, 288}, {81959, 291}, {81962, 290}, {81965, 290}, {81969, 293}, {81973, 296}, + {81976, 289}, {81978, 290}, {81981, 289}, {81983, 288}, {81985, 303}, {81987, 308}, {81989, 298}, {81992, 292}, + {81994, 288}, {81996, 291}, {81999, 288}, {82003, 289}, {82005, 292}, {82008, 292}, {82011, 291}, {82014, 297}, + {82017, 289}, {82019, 308}, {82022, 291}, {82025, 299}, {82028, 308}, {82031, 314}, {82034, 291}, {82036, 299}, + {82039, 290}, {82041, 292}, {82044, 292}, {82047, 310}, {82049, 291}, {82052, 292}, {82054, 312}, {82057, 291}, + {82059, 300}, {82062, 288}, {82065, 291}, {82067, 312}, {82070, 316}, {82072, 288}, {82074, 288}, {82076, 290}, + {82078, 296}, {82081, 289}, {82084, 291}, {82086, 288}, {82089, 288}, {82091, 288}, {82093, 290}, {82096, 291}, + {82099, 311}, {82102, 294}, {82105, 293}, {82108, 288}, {82113, 289}, {82116, 288}, {82120, 288}, {82123, 290}, + {82127, 290}, {82130, 289}, {82134, 292}, {82137, 291}, {82141, 293}, {82144, 290}, {82147, 290}, {82151, 289}, + {82154, 291}, {82158, 288}, {82161, 291}, {82164, 290}, {82167, 294}, {82170, 291}, {82173, 290}, {82176, 288}, + {82178, 289}, {82182, 290}, {82185, 289}, {82188, 289}, {82191, 290}, {82194, 288}, {82198, 292}, {82200, 288}, + {82203, 291}, {82205, 289}, {82207, 289}, {82209, 289}, {82211, 292}, {82213, 293}, {82215, 289}, {82218, 288}, + {82220, 291}, {82223, 289}, {82226, 291}, {82228, 290}, {82230, 292}, {82232, 291}, {82234, 290}, {82236, 292}, + {82238, 292}, {82240, 292}, {82242, 290}, {82244, 290}, {82246, 294}, {82247, 289}, {82249, 291}, {82251, 289}, + {82253, 295}, {82255, 301}, {82257, 289}, {82259, 288}, {82261, 291}, {82262, 288}, {82265, 289}, {82268, 290}, + {82271, 290}, {82274, 291}, {82278, 289}, {82281, 298}, {82284, 290}, {82288, 291}, {82290, 288}, {82293, 292}, + {82295, 290}, {82297, 288}, {82300, 292}, {82303, 290}, {82306, 292}, {82308, 288}, {82310, 294}, {82312, 288}, + {82314, 295}, {82316, 297}, {82317, 294}, {82319, 288}, {82321, 290}, {82322, 291}, {82324, 288}, {82328, 292}, + {82334, 293}, {82340, 288}, {82347, 292}, {82352, 288}, {82357, 291}, {82364, 291}, {82369, 289}, {82377, 290}, + {82385, 299}, {82391, 289}, {82396, 293}, {82402, 289}, {82408, 288}, {82414, 291}, {82418, 291}, {82422, 289}, + {82425, 301}, {82429, 291}, {82431, 311}, {82434, 290}, {82437, 291}, {82440, 294}, {82444, 289}, {82448, 304}, + {82451, 292}, {82453, 291}, {82457, 289}, {82460, 297}, {82463, 290}, {82466, 290}, {82468, 294}, {82472, 290}, + {82474, 313}, {82477, 290}, {82480, 292}, {82483, 310}, {82485, 305}, {82489, 288}, {82491, 289}, {82493, 312}, + {82496, 292}, {82498, 295}, {82500, 297}, {82502, 314}, {82505, 291}, {82507, 288}, {82509, 292}, {82511, 296}, + {82513, 293}, {82515, 310}, {82517, 295}, {82520, 290}, {82522, 294}, {82524, 289}, {82527, 288}, {82530, 288}, + {82532, 302}, {82534, 304}, {82537, 292}, {82539, 314}, {82542, 288}, {82544, 290}, {82547, 319}, {82549, 290}, + {82552, 290}, {82556, 288}, {82559, 291}, {82562, 296}, {82565, 288}, {82568, 290}, {82571, 288}, {82574, 290}, + {82578, 289}, {82581, 289}, {82586, 291}, {82588, 288}, {82591, 293}, {82595, 288}, {82598, 290}, {82601, 292}, + {82604, 294}, {82607, 290}, {82611, 291}, {82615, 289}, {82617, 291}, {82621, 289}, {82623, 293}, {82626, 288}, + {82628, 289}, {82631, 290}, {82634, 289}, {82637, 296}, {82639, 290}, {82642, 295}, {82645, 290}, {82647, 290}, + {82650, 289}, {82653, 292}, {82656, 293}, {82657, 77}, {82659, 292}, {82662, 290}, {82666, 293}, {82668, 291}, + {82671, 290}, {82673, 292}, {82676, 292}, {82678, 291}, {82680, 293}, {82682, 289}, {82685, 293}, {82688, 295}, + {82691, 291}, {82694, 290}, {82697, 288}, {82700, 292}, {82703, 291}, {82706, 291}, {82709, 298}, {82713, 290}, + {82716, 291}, {82719, 293}, {82723, 290}, {82726, 290}, {82729, 292}, {82733, 290}, {82736, 290}, {82740, 296}, + {82743, 290}, {82746, 295}, {82748, 292}, {82751, 293}, {82753, 292}, {82755, 291}, {82757, 291}, {82759, 288}, + {82761, 288}, {82763, 295}, {82765, 288}, {82767, 294}, {82769, 288}, {82771, 291}, {82773, 290}, {82777, 289}, + {82779, 288}, {82781, 288}, {82788, 290}, {82795, 290}, {82801, 293}, {82808, 293}, {82817, 290}, {82826, 293}, + {82836, 288}, {82844, 294}, {82849, 288}, {82857, 291}, {82862, 293}, {82867, 292}, {82871, 289}, {82875, 288}, + {82878, 288}, {82880, 293}, {82882, 291}, {82887, 288}, {82890, 305}, {82892, 317}, {82895, 288}, {82898, 290}, + {82900, 289}, {82902, 288}, {82904, 288}, {82906, 289}, {82908, 310}, {82909, 297}, {82911, 303}, {82913, 289}, + {82915, 298}, {82918, 291}, {82920, 308}, {82922, 314}, {82923, 305}, {82925, 299}, {82928, 289}, {82929, 292}, + {82931, 289}, {82933, 292}, {82935, 290}, {82937, 310}, {82939, 297}, {82941, 303}, {82944, 288}, {82945, 289}, + {82947, 318}, {82949, 297}, {82951, 299}, {82952, 307}, {82954, 305}, {82956, 304}, {82958, 300}, {82960, 303}, + {82962, 292}, {82964, 288}, {82966, 294}, {82969, 290}, {82971, 288}, {82974, 291}, {82976, 299}, {82978, 290}, + {82980, 295}, {82983, 293}, {82985, 307}, {82987, 291}, {82990, 292}, {82993, 292}, {82995, 305}, {82999, 292}, + {83001, 288}, {83003, 288}, {83005, 309}, {83009, 289}, {83012, 288}, {83015, 288}, {83018, 289}, {83020, 307}, + {83022, 291}, {83025, 289}, {83028, 289}, {83031, 289}, {83035, 290}, {83038, 289}, {83041, 289}, {83044, 296}, + {83047, 291}, {83050, 291}, {83053, 292}, {83055, 290}, {83058, 289}, {83061, 290}, {83063, 292}, {83066, 294}, + {83069, 292}, {83072, 290}, {83075, 290}, {83079, 296}, {83082, 288}, {83085, 289}, {83088, 290}, {83092, 292}, + {83095, 288}, {83098, 289}, {83101, 293}, {83104, 290}, {83108, 290}, {83111, 288}, {83114, 289}, {83117, 292}, + {83119, 288}, {83122, 288}, {83125, 289}, {83128, 291}, {83130, 296}, {83133, 289}, {83136, 288}, {83138, 291}, + {83140, 290}, {83143, 290}, {83145, 294}, {83148, 293}, {83152, 292}, {83155, 292}, {83157, 292}, {83161, 288}, + {83165, 292}, {83167, 291}, {83170, 288}, {83173, 288}, {83176, 290}, {83179, 290}, {83181, 293}, {83184, 288}, + {83187, 291}, {83193, 293}, {83196, 294}, {83199, 297}, {83201, 293}, {83203, 288}, {83205, 291}, {83207, 291}, + {83212, 288}, {83218, 288}, {83225, 289}, {83231, 288}, {83238, 289}, {83244, 288}, {83251, 290}, {83256, 289}, + {83261, 290}, {83266, 291}, {83270, 292}, {83274, 292}, {83277, 307}, {83280, 291}, {83283, 292}, {83285, 303}, + {83287, 291}, {83290, 308}, {83292, 291}, {83295, 295}, {83297, 298}, {83302, 288}, {83304, 292}, {83307, 291}, + {83309, 301}, {83311, 297}, {83314, 291}, {83316, 312}, {83319, 301}, {83321, 298}, {83323, 300}, {83325, 298}, + {83328, 288}, {83330, 307}, {83332, 292}, {83334, 301}, {83337, 289}, {83339, 289}, {83341, 310}, {83343, 303}, + {83345, 288}, {83347, 294}, {83350, 288}, {83351, 288}, {83353, 288}, {83355, 293}, {83356, 291}, {83359, 290}, + {83361, 288}, {83363, 290}, {83365, 314}, {83368, 288}, {83370, 290}, {83373, 290}, {83375, 307}, {83378, 292}, + {83380, 299}, {83383, 316}, {83386, 306}, {83389, 314}, {83391, 295}, {83395, 288}, {83396, 302}, {83399, 300}, + {83401, 289}, {83403, 295}, {83405, 289}, {83407, 290}, {83409, 290}, {83410, 291}, {83414, 292}, {83416, 290}, + {83418, 306}, {83420, 293}, {83423, 298}, {83426, 289}, {83428, 291}, {83430, 288}, {83432, 307}, {83434, 288}, + {83436, 288}, {83439, 291}, {83442, 291}, {83445, 289}, {83448, 288}, {83451, 289}, {83453, 288}, {83457, 293}, + {83459, 291}, {83463, 289}, {83466, 288}, {83470, 290}, {83473, 289}, {83476, 290}, {83480, 294}, {83483, 289}, + {83487, 288}, {83490, 290}, {83493, 288}, {83496, 288}, {83500, 288}, {83504, 290}, {83507, 290}, {83510, 290}, + {83514, 288}, {83517, 288}, {83521, 290}, {83526, 294}, {83529, 292}, {83529, 6}, {83532, 290}, {83535, 290}, + {83539, 292}, {83542, 289}, {83545, 291}, {83548, 289}, {83551, 289}, {83554, 291}, {83557, 293}, {83560, 289}, + {83564, 289}, {83566, 288}, {83569, 289}, {83572, 290}, {83575, 293}, {83577, 292}, {83580, 292}, {83583, 290}, + {83585, 292}, {83587, 289}, {83591, 292}, {83593, 288}, {83597, 290}, {83601, 289}, {83606, 288}, {83611, 288}, + {83614, 288}, {83619, 290}, {83624, 288}, {83629, 288}, {83635, 290}, {83637, 288}, {83640, 290}, {83643, 291}, + {83648, 290}, {83657, 290}, {83666, 303}, {83674, 292}, {83681, 290}, {83686, 289}, {83692, 293}, {83697, 295}, + {83702, 290}, {83706, 313}, {83708, 289}, {83710, 292}, {83712, 292}, {83715, 288}, {83717, 288}, {83719, 302}, + {83721, 289}, {83723, 314}, {83725, 297}, {83727, 298}, {83729, 293}, {83731, 291}, {83733, 291}, {83734, 306}, + {83736, 301}, {83738, 300}, {83740, 292}, {83742, 291}, {83745, 300}, {83747, 288}, {83749, 292}, {83751, 290}, + {83752, 290}, {83754, 296}, {83756, 288}, {83758, 290}, {83760, 291}, {83762, 298}, {83763, 294}, {83765, 305}, + {83767, 309}, {83769, 301}, {83770, 300}, {83772, 298}, {83774, 288}, {83775, 297}, {83777, 313}, {83779, 295}, + {83781, 289}, {83783, 289}, {83785, 290}, {83787, 309}, {83789, 291}, {83792, 304}, {83794, 290}, {83796, 296}, + {83799, 289}, {83800, 292}, {83802, 289}, {83803, 291}, {83804, 304}, {83806, 288}, {83808, 317}, {83809, 288}, + {83811, 299}, {83812, 302}, {83814, 293}, {83816, 290}, {83817, 303}, {83819, 290}, {83820, 288}, {83822, 314}, + {83824, 288}, {83825, 288}, {83827, 295}, {83829, 288}, {83831, 299}, {83833, 292}, {83835, 290}, {83837, 289}, + {83838, 305}, {83840, 305}, {83841, 303}, {83843, 289}, {83845, 289}, {83848, 289}, {83850, 288}, {83853, 289}, + {83856, 298}, {83859, 295}, {83861, 290}, {83863, 294}, {83865, 288}, {83868, 288}, {83871, 289}, {83873, 291}, + {83877, 288}, {83881, 288}, {83886, 289}, {83891, 289}, {83896, 289}, {83900, 288}, {83904, 293}, {83909, 291}, + {83914, 291}, {83918, 289}, {83923, 288}, {83927, 291}, {83931, 291}, {83934, 290}, {83939, 289}, {83943, 288}, + {83947, 288}, {83951, 290}, {83954, 289}, {83959, 291}, {83963, 289}, {83969, 288}, {83972, 293}, {83976, 295}, + {83979, 288}, {83984, 292}, {83987, 291}, {83991, 289}, {83995, 290}, {83999, 292}, {84004, 293}, {84008, 292}, + {84012, 293}, {84016, 294}, {84020, 288}, {84025, 288}, {84030, 288}, {84034, 288}, {84038, 289}, {84043, 294}, + {84047, 290}, {84052, 291}, {84056, 289}, {84061, 296}, {84064, 289}, {84068, 288}, {84070, 288}, {84080, 290}, + {84088, 288}, {84096, 290}, {84103, 291}, {84108, 292}, {84114, 288}, {84120, 289}, {84124, 292}, {84129, 289}, + {84133, 291}, {84137, 290}, {84140, 289}, {84141, 294}, {84143, 295}, {84145, 299}, {84146, 311}, {84147, 296}, + {84149, 289}, {84151, 290}, {84152, 307}, {84154, 289}, {84155, 290}, {84157, 298}, {84158, 314}, {84160, 290}, + {84162, 298}, {84164, 289}, {84165, 303}, {84166, 294}, {84168, 303}, {84169, 298}, {84171, 289}, {84172, 304}, + {84174, 291}, {84175, 296}, {84177, 289}, {84178, 309}, {84180, 313}, {84181, 309}, {84183, 288}, {84184, 307}, + {84186, 300}, {84188, 293}, {84190, 316}, {84191, 306}, {84193, 290}, {84194, 312}, {84195, 309}, {84197, 290}, + {84198, 288}, {84200, 288}, {84201, 291}, {84202, 302}, {84204, 292}, {84205, 313}, {84207, 292}, {84209, 290}, + {84210, 291}, {84211, 314}, {84213, 293}, {84214, 288}, {84216, 309}, {84218, 288}, {84219, 299}, {84222, 289}, + {84223, 293}, {84225, 305}, {84227, 292}, {84229, 290}, {84231, 291}, {84232, 292}, {84235, 288}, {84237, 290}, + {84239, 290}, {84241, 318}, {84242, 296}, {84244, 298}, {84246, 304}, {84247, 297}, {84250, 292}, {84251, 288}, + {84253, 295}, {84255, 290}, {84257, 300}, {84259, 288}, {84261, 312}, {84263, 299}, {84266, 306}, {84268, 304}, + {84269, 302}, {84271, 297}, {84273, 305}, {84277, 290}, {84279, 303}, {84282, 288}, {84283, 290}, {84285, 303}, + {84288, 289}, {84290, 297}, {84294, 290}, {84301, 290}, {84307, 291}, {84313, 290}, {84319, 289}, {84324, 309}, + {84328, 290}, {84334, 288}, {84340, 293}, {84346, 289}, {84352, 288}, {84358, 288}, {84365, 294}, {84369, 290}, + {84376, 289}, {84381, 291}, {84387, 290}, {84392, 289}, {84398, 290}, {84402, 288}, {84406, 290}, {84412, 288}, + {84415, 292}, {84420, 290}, {84424, 291}, {84428, 291}, {84432, 290}, {84436, 290}, {84440, 291}, {84444, 290}, + {84448, 288}, {84452, 262}, {84456, 289}, {84459, 288}, {84463, 289}, {84467, 288}, {84472, 292}, {84478, 292}, + {84487, 288}, {84499, 289}, {84505, 289}, {84511, 288}, {84516, 290}, {84523, 288}, {84527, 290}, {84531, 289}, + {84534, 290}, {84537, 288}, {84540, 317}, {84541, 294}, {84543, 292}, {84545, 315}, {84547, 289}, {84548, 293}, + {84550, 298}, {84552, 289}, {84553, 316}, {84555, 295}, {84557, 307}, {84558, 291}, {84560, 288}, {84562, 288}, + {84563, 302}, {84565, 290}, {84566, 311}, {84568, 293}, {84570, 309}, {84571, 296}, {84573, 307}, {84574, 292}, + {84577, 289}, {84578, 293}, {84579, 304}, {84581, 318}, {84582, 292}, {84584, 288}, {84585, 299}, {84587, 292}, + {84588, 291}, {84589, 299}, {84591, 291}, {84592, 288}, {84594, 289}, {84594, 291}, {84596, 289}, {84598, 307}, + {84599, 288}, {84600, 301}, {84602, 310}, {84604, 316}, {84607, 304}, {84609, 304}, {84610, 291}, {84612, 293}, + {84614, 313}, {84616, 294}, {84618, 306}, {84620, 293}, {84621, 318}, {84623, 301}, {84626, 318}, {84628, 295}, + {84631, 292}, {84633, 306}, {84636, 304}, {84639, 288}, {84641, 312}, {84643, 291}, {84646, 291}, {84648, 310}, + {84650, 298}, {84652, 299}, {84654, 289}, {84657, 289}, {84659, 292}, {84661, 311}, {84663, 288}, {84666, 302}, + {84668, 290}, {84671, 294}, {84673, 317}, {84676, 288}, {84678, 294}, {84681, 288}, {84683, 290}, {84686, 303}, + {84689, 288}, {84692, 290}, {84694, 318}, {84697, 289}, {84700, 302}, {84703, 295}, {84706, 291}, {84708, 289}, + {84711, 289}, {84712, 306}, {84715, 295}, {84720, 289}, {84725, 301}, {84730, 292}, {84734, 289}, {84737, 290}, + {84742, 289}, {84745, 308}, {84749, 292}, {84752, 312}, {84757, 293}, {84763, 292}, {84768, 294}, {84773, 289}, + {84778, 288}, {84783, 289}, {84788, 290}, {84793, 288}, {84798, 290}, {84802, 293}, {84807, 293}, {84813, 296}, + {84818, 288}, {84823, 288}, {84829, 293}, {84834, 288}, {84839, 293}, {84844, 289}, {84857, 300}, {84868, 291}, + {84882, 291}, {84892, 289}, {84901, 288}, {84907, 292}, {84910, 318}, {84911, 295}, {84912, 308}, {84914, 288}, + {84915, 308}, {84917, 305}, {84918, 288}, {84919, 290}, {84921, 296}, {84923, 312}, {84924, 298}, {84926, 291}, + {84927, 294}, {84928, 292}, {84930, 289}, {84931, 289}, {84932, 292}, {84933, 292}, {84935, 292}, {84936, 300}, + {84938, 295}, {84939, 306}, {84940, 291}, {84942, 298}, {84943, 295}, {84944, 289}, {84945, 289}, {84947, 288}, + {84948, 289}, {84950, 295}, {84951, 289}, {84953, 304}, {84954, 292}, {84956, 315}, {84957, 313}, {84959, 295}, + {84960, 292}, {84963, 290}, {84965, 291}, {84966, 309}, {84968, 288}, {84971, 289}, {84973, 292}, {84976, 289}, + {84979, 299}, {84981, 300}, {84984, 317}, {84987, 288}, {84989, 290}, {84992, 290}, {84994, 290}, {84997, 291}, + {85000, 291}, {85002, 315}, {85004, 310}, {85006, 289}, {85007, 300}, {85009, 306}, {85012, 290}, {85013, 301}, + {85015, 316}, {85017, 291}, {85019, 289}, {85021, 289}, {85024, 289}, {85025, 289}, {85027, 296}, {85030, 291}, + {85032, 296}, {85034, 307}, {85036, 306}, {85038, 289}, {85041, 300}, {85043, 289}, {85045, 308}, {85048, 289}, + {85051, 289}, {85053, 288}, {85055, 289}, {85058, 295}, {85060, 305}, {85062, 303}, {85066, 290}, {85073, 290}, + {85076, 289}, {85079, 291}, {85081, 290}, {85084, 296}, {85086, 292}, {85089, 288}, {85090, 308}, {85092, 288}, + {85094, 290}, {85097, 300}, {85099, 290}, {85101, 307}, {85105, 288}, {85109, 289}, {85113, 290}, {85116, 289}, + {85121, 289}, {85124, 291}, {85128, 290}, {85131, 289}, {85135, 288}, {85138, 289}, {85142, 290}, {85145, 290}, + {85149, 289}, {85152, 288}, {85155, 290}, {85159, 289}, {85162, 290}, {85166, 291}, {85170, 289}, {85173, 288}, + {85176, 288}, {85179, 289}, {85189, 291}, {85191, 289}, {85198, 288}, {85212, 290}, {85227, 288}, {85236, 289}, + {85243, 302}, {85245, 289}, {85247, 312}, {85250, 288}, {85251, 288}, {85253, 302}, {85255, 288}, {85257, 288}, + {85259, 302}, {85262, 290}, {85264, 313}, {85266, 293}, {85268, 307}, {85270, 303}, {85271, 310}, {85274, 296}, + {85275, 293}, {85277, 290}, {85279, 293}, {85281, 298}, {85283, 298}, {85285, 314}, {85287, 309}, {85289, 295}, + {85291, 313}, {85293, 308}, {85294, 308}, {85296, 294}, {85299, 299}, {85300, 301}, {85301, 318}, {85302, 300}, + {85304, 313}, {85306, 293}, {85307, 299}, {85308, 290}, {85310, 316}, {85312, 291}, {85313, 313}, {85315, 316}, + {85317, 290}, {85318, 291}, {85320, 307}, {85322, 298}, {85324, 292}, {85326, 288}, {85328, 296}, {85330, 307}, + {85332, 306}, {85334, 303}, {85336, 289}, {85338, 289}, {85340, 289}, {85342, 290}, {85345, 294}, {85350, 291}, + {85353, 291}, {85357, 292}, {85359, 290}, {85364, 293}, {85372, 296}, {85382, 288}, {85390, 289}, {85401, 289}, + {85409, 289}, {85416, 291}, {85423, 289}, {85431, 290}, {85437, 293}, {85443, 290}, {85450, 293}, {85457, 292}, + {85460, 73}, {85472, 289}, {85484, 290}, {85495, 291}, {85504, 289}, {85512, 290}, {85518, 306}, {85521, 313}, + {85523, 288}, {85525, 294}, {85527, 307}, {85529, 289}, {85531, 314}, {85532, 293}, {85534, 292}, {85536, 301}, + {85537, 299}, {85539, 296}, {85540, 316}, {85542, 289}, {85544, 312}, {85545, 289}, {85546, 292}, {85549, 291}, + {85550, 291}, {85551, 299}, {85553, 295}, {85555, 319}, {85556, 288}, {85558, 291}, {85560, 313}, {85561, 289}, + {85563, 310}, {85564, 294}, {85566, 298}, {85567, 289}, {85569, 288}, {85570, 299}, {85571, 293}, {85573, 312}, + {85574, 291}, {85576, 288}, {85577, 288}, {85579, 296}, {85580, 290}, {85582, 293}, {85582, 290}, {85584, 292}, + {85586, 292}, {85587, 288}, {85588, 290}, {85589, 308}, {85591, 302}, {85592, 292}, {85593, 309}, {85594, 298}, + {85596, 311}, {85597, 306}, {85599, 304}, {85600, 290}, {85603, 298}, {85605, 305}, {85608, 312}, {85612, 294}, + {85615, 307}, {85619, 292}, {85623, 288}, {85625, 299}, {85628, 292}, {85631, 304}, {85633, 312}, {85635, 296}, + {85636, 289}, {85639, 307}, {85640, 319}, {85642, 301}, {85644, 297}, {85646, 302}, {85647, 288}, {85649, 292}, + {85651, 308}, {85653, 288}, {85655, 299}, {85656, 288}, {85658, 295}, {85660, 292}, {85662, 290}, {85665, 294}, + {85668, 292}, {85671, 289}, {85673, 301}, {85675, 307}, {85677, 302}, {85679, 299}, {85682, 295}, {85686, 288}, + {85691, 289}, {85698, 291}, {85705, 291}, {85711, 290}, {85718, 289}, {85725, 289}, {85732, 289}, {85749, 295}, + {85761, 290}, {85762, 294}, {85764, 291}, {85766, 303}, {85768, 311}, {85769, 301}, {85771, 291}, {85773, 306}, + {85774, 297}, {85776, 293}, {85778, 289}, {85779, 305}, {85781, 294}, {85783, 294}, {85784, 293}, {85786, 292}, + {85788, 291}, {85790, 290}, {85791, 301}, {85793, 299}, {85795, 288}, {85797, 293}, {85799, 290}, {85801, 295}, + {85802, 300}, {85803, 289}, {85804, 291}, {85806, 292}, {85807, 288}, {85809, 300}, {85810, 295}, {85812, 301}, + {85814, 292}, {85815, 288}, {85816, 290}, {85818, 290}, {85820, 296}, {85821, 290}, {85823, 292}, {85826, 289}, + {85830, 296}, {85833, 299}, {85836, 290}, {85839, 290}, {85842, 290}, {85846, 289}, {85849, 292}, {85854, 289}, + {85857, 289}, {85860, 292}, {85863, 288}, {85866, 294}, {85869, 297}, {85872, 294}, {85875, 293}, {85879, 289}, + {85883, 290}, {85887, 289}, {85892, 289}, {85897, 290}, {85903, 288}, {85908, 289}, {85912, 290}, {85917, 288}, + {85922, 290}, {85926, 289}, {85931, 289}, {85936, 290}, {85941, 289}, {85945, 289}, {85950, 289}, {85955, 288}, + {85959, 289}, {85964, 302}, {85970, 295}, {85976, 302}, {85982, 293}, {85987, 288}, {85990, 288}, {85993, 288}, + {85993, 299}, {85994, 306}, {85995, 289}, {85995, 302}, {85996, 298}, {85996, 301}, {85997, 299}, {85998, 314}, + {85998, 300}, {85999, 302}, {85999, 300}, {86001, 291}, {86002, 288}, {86004, 308}, {86006, 291}, {86008, 312}, + {86009, 288}, {86010, 296}, {86012, 290}, {86013, 301}, {86015, 294}, {86016, 293}, {86018, 310}, {86019, 290}, + {86021, 290}, {86022, 296}, {86024, 317}, {86025, 296}, {86026, 290}, {86028, 304}, {86029, 306}, {86031, 301}, + {86032, 312}, {86034, 314}, {86036, 301}, {86037, 289}, {86039, 292}, {86041, 313}, {86042, 288}, {86044, 306}, + {86045, 297}, {86047, 289}, {86049, 290}, {86051, 291}, {86053, 297}, {86055, 299}, {86057, 309}, {86059, 299}, + {86061, 296}, {86063, 314}, {86065, 292}, {86068, 305}, {86071, 300}, {86074, 292}, {86078, 305}, {86080, 314}, + {86083, 298}, {86086, 289}, {86091, 300}, {86099, 288}, {86110, 288}, {86121, 291}, {86141, 304}, {86151, 291}, + {86154, 289}, {86157, 293}, {86160, 288}, {86163, 290}, {86167, 288}, {86170, 290}, {86172, 293}, {86176, 289}, + {86179, 292}, {86182, 291}, {86185, 291}, {86190, 289}, {86194, 292}, {86198, 291}, {86200, 298}, {86203, 293}, + {86205, 288}, {86208, 289}, {86211, 288}, {86213, 293}, {86216, 289}, {86219, 294}, {86221, 292}, {86223, 296}, + {86226, 290}, {86229, 299}, {86231, 295}, {86233, 294}, {86235, 291}, {86238, 292}, {86241, 290}, {86243, 303}, + {86246, 292}, {86249, 294}, {86251, 289}, {86253, 291}, {86256, 297}, {86258, 300}, {86261, 292}, {86263, 291}, + {86266, 288}, {86269, 292}, {86271, 297}, {86273, 288}, {86275, 288}, {86277, 288}, {86280, 294}, {86282, 297}, + {86286, 292}, {86288, 291}, {86291, 289}, {86296, 290}, {86299, 290}, {86303, 288}, {86307, 289}, {86311, 291}, + {86315, 290}, {86321, 290}, {86326, 288}, {86330, 288}, {86335, 288}, {86339, 289}, {86344, 289}, {86349, 289}, + {86354, 295}, {86359, 290}, {86364, 288}, {86369, 289}, {86371, 295}, {86374, 288}, {86377, 293}, {86384, 293}, + {86391, 298}, {86395, 293}, {86402, 296}, {86415, 293}, {86417, 298}, {86419, 296}, {86420, 290}, {86422, 310}, + {86424, 301}, {86425, 294}, {86427, 294}, {86428, 302}, {86430, 290}, {86432, 315}, {86433, 288}, {86433, 73}, + {86435, 303}, {86436, 313}, {86438, 288}, {86439, 297}, {86441, 294}, {86442, 288}, {86444, 290}, {86445, 296}, + {86447, 300}, {86448, 292}, {86449, 296}, {86451, 314}, {86452, 304}, {86453, 303}, {86455, 290}, {86457, 309}, + {86458, 288}, {86460, 310}, {86462, 317}, {86463, 309}, {86465, 297}, {86467, 294}, {86469, 297}, {86470, 295}, + {86472, 294}, {86474, 288}, {86475, 292}, {86478, 305}, {86479, 305}, {86481, 294}, {86483, 289}, {86485, 302}, + {86487, 300}, {86489, 288}, {86491, 297}, {86493, 294}, {86496, 305}, {86499, 299}, {86502, 292}, {86504, 306}, + {86507, 295}, {86510, 290}, {86514, 289}, {86521, 289}, {86535, 290}, {86553, 300}, {86570, 291}, {86575, 293}, + {86579, 291}, {86583, 288}, {86586, 288}, {86590, 290}, {86594, 293}, {86597, 290}, {86600, 291}, {86601, 290}, + {86603, 291}, {86605, 290}, {86607, 289}, {86609, 290}, {86611, 290}, {86612, 291}, {86615, 290}, {86617, 294}, + {86619, 292}, {86621, 288}, {86623, 295}, {86625, 289}, {86627, 289}, {86629, 292}, {86631, 298}, {86633, 291}, + {86635, 289}, {86637, 288}, {86639, 288}, {86641, 288}, {86642, 288}, {86644, 296}, {86646, 289}, {86648, 296}, + {86649, 292}, {86651, 290}, {86653, 290}, {86655, 290}, {86658, 288}, {86666, 297}, {86675, 291}, {86686, 301}, + {86700, 289}, {86712, 289}, {86725, 289}, {86737, 288}, {86747, 290}, {86758, 290}, {86767, 300}, {86776, 305}, + {86783, 289}, {86785, 289}, {86786, 318}, {86786, 289}, {86787, 312}, {86787, 296}, {86788, 294}, {86789, 290}, + {86789, 289}, {86790, 294}, {86790, 288}, {86791, 293}, {86792, 295}, {86792, 298}, {86793, 291}, {86793, 308}, + {86794, 303}, {86795, 296}, {86795, 304}, {86796, 295}, {86796, 300}, {86797, 296}, {86797, 319}, {86798, 295}, + {86799, 296}, {86799, 294}, {86800, 296}, {86802, 296}, {86803, 302}, {86805, 303}, {86806, 295}, {86808, 306}, + {86809, 302}, {86811, 305}, {86812, 298}, {86814, 291}, {86815, 307}, {86816, 309}, {86818, 294}, {86819, 301}, + {86821, 293}, {86822, 303}, {86824, 307}, {86825, 291}, {86826, 291}, {86828, 309}, {86830, 292}, {86831, 291}, + {86833, 290}, {86835, 290}, {86836, 296}, {86838, 295}, {86840, 293}, {86841, 298}, {86843, 288}, {86845, 288}, + {86847, 316}, {86848, 292}, {86850, 308}, {86852, 301}, {86854, 293}, {86855, 304}, {86857, 310}, {86859, 304}, + {86862, 290}, {86864, 288}, {86867, 296}, {86868, 295}, {86871, 306}, {86873, 297}, {86875, 290}, {86878, 307}, + {86882, 293}, {86886, 292}, {86895, 288}, {86913, 291}, {86932, 293}, {86936, 293}, {86940, 291}, {86943, 294}, + {86947, 289}, {86950, 289}, {86954, 292}, {86958, 296}, {86961, 292}, {86964, 289}, {86968, 291}, {86973, 295}, + {86977, 288}, {86982, 288}, {86987, 289}, {86992, 288}, {86997, 289}, {87001, 288}, {87005, 296}, {87008, 292}, + {87012, 292}, {87015, 294}, {87019, 292}, {87023, 289}, {87031, 291}, {87043, 294}, {87064, 292}, {87071, 303}, + {87072, 297}, {87074, 301}, {87076, 297}, {87077, 295}, {87079, 298}, {87080, 298}, {87081, 304}, {87083, 289}, + {87084, 289}, {87086, 289}, {87087, 288}, {87089, 291}, {87090, 299}, {87092, 292}, {87093, 301}, {87095, 292}, + {87096, 307}, {87098, 294}, {87099, 289}, {87101, 291}, {87102, 288}, {87103, 288}, {87105, 299}, {87106, 304}, + {87108, 288}, {87109, 305}, {87111, 292}, {87112, 288}, {87114, 291}, {87115, 291}, {87117, 294}, {87119, 289}, + {87120, 311}, {87122, 293}, {87123, 292}, {87125, 291}, {87126, 292}, {87128, 309}, {87130, 296}, {87131, 289}, + {87133, 288}, {87135, 299}, {87137, 289}, {87138, 293}, {87140, 288}, {87142, 299}, {87145, 292}, {87147, 290}, + {87149, 300}, {87151, 291}, {87153, 303}, {87156, 298}, {87158, 288}, {87161, 290}, {87166, 296}, {87177, 288}, + {87199, 292}, {87207, 288}, {87210, 292}, {87213, 288}, {87215, 289}, {87218, 298}, {87221, 292}, {87223, 297}, + {87226, 291}, {87228, 294}, {87230, 289}, {87233, 297}, {87235, 292}, {87237, 288}, {87240, 288}, {87243, 292}, + {87245, 291}, {87248, 298}, {87251, 298}, {87254, 297}, {87257, 296}, {87260, 296}, {87263, 294}, {87266, 290}, + {87269, 296}, {87272, 296}, {87275, 292}, {87278, 290}, {87281, 298}, {87285, 291}, {87287, 290}, {87290, 298}, + {87294, 295}, {87297, 292}, {87301, 289}, {87310, 293}, {87320, 288}, {87342, 289}, {87347, 289}, {87349, 301}, + {87351, 295}, {87353, 304}, {87354, 297}, {87356, 301}, {87358, 291}, {87360, 296}, {87362, 289}, {87363, 294}, + {87365, 294}, {87367, 296}, {87368, 291}, {87370, 292}, {87371, 288}, {87373, 298}, {87374, 291}, {87376, 291}, + {87378, 288}, {87379, 291}, {87381, 298}, {87383, 302}, {87385, 296}, {87386, 292}, {87388, 292}, {87390, 289}, + {87391, 289}, {87393, 298}, {87395, 288}, {87397, 293}, {87398, 289}, {87401, 309}, {87402, 288}, {87404, 289}, + {87406, 289}, {87408, 290}, {87410, 299}, {87412, 291}, {87414, 295}, {87415, 300}, {87418, 294}, {87420, 289}, + {87423, 293}, {87425, 304}, {87427, 288}, {87429, 293}, {87431, 291}, {87434, 302}, {87437, 291}, {87440, 290}, + {87443, 291}, {87451, 289}, {87460, 300}, {87484, 300}, {87487, 290}, {87489, 292}, {87491, 298}, {87493, 293}, + {87496, 297}, {87498, 292}, {87500, 292}, {87502, 303}, {87504, 292}, {87506, 298}, {87508, 291}, {87510, 297}, + {87512, 296}, {87514, 289}, {87516, 299}, {87518, 288}, {87520, 289}, {87522, 293}, {87524, 293}, {87526, 297}, + {87528, 289}, {87531, 301}, {87533, 293}, {87535, 289}, {87537, 290}, {87539, 297}, {87541, 288}, {87544, 290}, + {87546, 291}, {87548, 291}, {87550, 292}, {87553, 291}, {87555, 291}, {87557, 291}, {87560, 298}, {87562, 297}, + {87565, 292}, {87567, 289}, {87569, 294}, {87572, 296}, {87575, 291}, {87577, 292}, {87580, 289}, {87584, 292}, + {87593, 232}, {87598, 288}, {87622, 290}, {87624, 291}, {87626, 295}, {87628, 292}, {87630, 288}, {87632, 298}, + {87634, 301}, {87636, 296}, {87638, 288}, {87640, 310}, {87642, 291}, {87644, 291}, {87646, 301}, {87648, 295}, + {87650, 298}, {87652, 290}, {87654, 303}, {87655, 291}, {87657, 294}, {87659, 290}, {87661, 289}, {87664, 300}, + {87666, 291}, {87668, 299}, {87670, 290}, {87672, 288}, {87674, 293}, {87676, 293}, {87678, 300}, {87680, 290}, + {87683, 302}, {87685, 294}, {87687, 293}, {87689, 298}, {87691, 289}, {87693, 293}, {87696, 288}, {87698, 301}, + {87701, 296}, {87703, 295}, {87706, 297}, {87708, 300}, {87710, 291}, {87713, 298}, {87716, 293}, {87719, 298}, + {87724, 288}, {87732, 295}, {87754, 294}, {87760, 289}, {87762, 288}, {87765, 298}, {87767, 288}, {87769, 288}, + {87771, 288}, {87773, 297}, {87775, 289}, {87777, 289}, {87780, 299}, {87782, 291}, {87784, 298}, {87786, 299}, + {87788, 295}, {87790, 296}, {87793, 298}, {87795, 297}, {87797, 290}, {87799, 290}, {87801, 296}, {87804, 296}, + {87806, 301}, {87809, 298}, {87811, 307}, {87814, 292}, {87816, 288}, {87819, 294}, {87821, 295}, {87823, 289}, + {87826, 290}, {87828, 292}, {87831, 288}, {87834, 299}, {87837, 292}, {87839, 296}, {87842, 292}, {87845, 300}, + {87848, 302}, {87851, 298}, {87855, 290}, {87858, 289}, {87869, 292}, {87877, 288}, {87899, 293}, {87901, 290}, + {87903, 301}, {87905, 289}, {87908, 298}, {87910, 306}, {87912, 288}, {87914, 288}, {87916, 290}, {87918, 291}, + {87920, 303}, {87923, 290}, {87925, 306}, {87927, 298}, {87929, 293}, {87932, 290}, {87934, 303}, {87937, 293}, + {87939, 305}, {87941, 296}, {87944, 301}, {87946, 293}, {87948, 298}, {87951, 304}, {87953, 295}, {87955, 288}, + {87957, 292}, {87960, 295}, {87962, 298}, {87964, 289}, {87966, 297}, {87969, 288}, {87971, 305}, {87973, 289}, + {87976, 301}, {87979, 295}, {87981, 296}, {87983, 295}, {87986, 290}, {87988, 296}, {87991, 289}, {87994, 291}, + {87997, 297}, {88000, 288}, {88010, 292}, {88014, 296}, {88031, 301}, {88041, 290}, {88043, 290}, {88044, 290}, + {88046, 288}, {88048, 290}, {88050, 297}, {88052, 295}, {88053, 296}, {88055, 297}, {88057, 295}, {88059, 290}, + {88060, 288}, {88063, 297}, {88065, 289}, {88066, 288}, {88068, 301}, {88071, 296}, {88073, 289}, {88075, 294}, + {88077, 300}, {88079, 292}, {88081, 295}, {88083, 305}, {88085, 305}, {88086, 289}, {88088, 289}, {88090, 288}, + {88092, 293}, {88094, 302}, {88096, 293}, {88098, 292}, {88100, 300}, {88102, 291}, {88104, 295}, {88106, 289}, + {88108, 290}, {88110, 293}, {88112, 302}, {88114, 295}, {88117, 292}, {88119, 290}, {88121, 296}, {88123, 302}, + {88125, 297}, {88127, 289}, {88129, 289}, {88132, 298}, {88134, 301}, {88136, 288}, {88139, 289}, {88142, 298}, + {88151, 295}, {88154, 290}, {88159, 288}, {88176, 291}, {88184, 292}, {88185, 293}, {88188, 307}, {88189, 291}, + {88191, 292}, {88193, 298}, {88195, 290}, {88197, 304}, {88199, 291}, {88201, 295}, {88203, 289}, {88206, 301}, + {88208, 292}, {88210, 299}, {88213, 289}, {88216, 292}, {88219, 298}, {88221, 288}, {88224, 298}, {88226, 300}, + {88229, 294}, {88231, 289}, {88233, 299}, {88235, 304}, {88238, 300}, {88240, 299}, {88243, 298}, {88245, 295}, + {88248, 289}, {88250, 294}, {88253, 297}, {88255, 291}, {88258, 290}, {88260, 292}, {88263, 288}, {88266, 288}, + {88268, 288}, {88271, 299}, {88273, 299}, {88275, 288}, {88278, 288}, {88281, 294}, {88284, 305}, {88291, 291}, + {88297, 290}, {88301, 293}, {88324, 300}, {88329, 289}, {88331, 289}, {88333, 301}, {88335, 290}, {88338, 293}, + {88340, 288}, {88342, 296}, {88344, 290}, {88346, 293}, {88349, 297}, {88351, 302}, {88354, 292}, {88356, 288}, + {88360, 288}, {88363, 289}, {88366, 293}, {88368, 300}, {88370, 290}, {88372, 291}, {88374, 299}, {88377, 291}, + {88379, 311}, {88381, 296}, {88384, 288}, {88386, 290}, {88389, 292}, {88391, 299}, {88394, 289}, {88397, 298}, + {88399, 292}, {88401, 295}, {88404, 297}, {88406, 289}, {88409, 289}, {88411, 294}, {88413, 289}, {88416, 304}, + {88418, 290}, {88421, 300}, {88423, 289}, {88425, 297}, {88428, 304}, {88431, 295}, {88441, 288}, {88444, 293}, + {88448, 291}, {88465, 288}, {88473, 301}, {88475, 306}, {88477, 304}, {88479, 300}, {88481, 290}, {88483, 305}, + {88485, 289}, {88487, 291}, {88489, 293}, {88491, 288}, {88494, 296}, {88496, 299}, {88499, 297}, {88502, 288}, + {88505, 295}, {88508, 294}, {88510, 288}, {88512, 294}, {88515, 302}, {88517, 300}, {88519, 289}, {88521, 293}, + {88524, 295}, {88526, 293}, {88528, 290}, {88530, 302}, {88532, 290}, {88534, 292}, {88537, 302}, {88539, 291}, + {88541, 288}, {88543, 289}, {88546, 290}, {88548, 290}, {88550, 292}, {88552, 293}, {88554, 302}, {88557, 300}, + {88559, 297}, {88561, 295}, {88564, 299}, {88566, 289}, {88568, 292}, {88571, 291}, {88573, 288}, {88576, 289}, + {88581, 290}, {88588, 289}, {88591, 292}, {88596, 290}, {88618, 288}, {88620, 294}, {88622, 290}, {88624, 293}, + {88626, 291}, {88628, 306}, {88630, 300}, {88632, 290}, {88634, 300}, {88636, 298}, {88639, 292}, {88642, 288}, + {88645, 301}, {88648, 289}, {88653, 297}, {88655, 292}, {88657, 290}, {88659, 300}, {88661, 293}, {88664, 305}, + {88666, 306}, {88668, 289}, {88670, 296}, {88672, 298}, {88674, 302}, {88676, 297}, {88678, 289}, {88680, 293}, + {88682, 289}, {88684, 294}, {88686, 290}, {88688, 292}, {88690, 305}, {88693, 294}, {88695, 290}, {88697, 292}, + {88699, 291}, {88701, 289}, {88703, 291}, {88706, 300}, {88708, 303}, {88710, 298}, {88713, 301}, {88715, 295}, + {88717, 291}, {88719, 288}, {88722, 297}, {88724, 289}, {88733, 296}, {88735, 301}, {88738, 300}, {88741, 291}, + {88745, 299}, {88766, 303}, {88768, 294}, {88770, 295}, {88772, 289}, {88774, 301}, {88776, 307}, {88778, 289}, + {88780, 289}, {88782, 288}, {88785, 288}, {88788, 289}, {88790, 294}, {88793, 292}, {88796, 296}, {88800, 288}, + {88803, 296}, {88805, 289}, {88808, 295}, {88810, 307}, {88812, 295}, {88814, 295}, {88817, 301}, {88819, 297}, + {88821, 301}, {88824, 297}, {88826, 305}, {88828, 247}, {88830, 294}, {88833, 290}, {88835, 297}, {88837, 293}, + {88840, 292}, {88843, 294}, {88845, 304}, {88847, 291}, {88850, 300}, {88852, 291}, {88854, 289}, {88857, 289}, + {88859, 291}, {88862, 289}, {88864, 290}, {88867, 288}, {88869, 290}, {88872, 291}, {88876, 296}, {88884, 293}, + {88886, 292}, {88889, 299}, {88893, 303}, {88915, 292}, {88917, 290}, {88920, 293}, {88922, 289}, {88925, 291}, + {88928, 290}, {88930, 290}, {88933, 291}, {88936, 289}, {88940, 290}, {88945, 291}, {88949, 289}, {88952, 296}, + {88955, 293}, {88957, 297}, {88959, 291}, {88961, 295}, {88964, 292}, {88966, 289}, {88968, 288}, {88971, 288}, + {88973, 293}, {88976, 292}, {88978, 289}, {88981, 301}, {88983, 294}, {88986, 299}, {88988, 295}, {88990, 291}, + {88993, 304}, {88996, 289}, {88998, 288}, {89000, 303}, {89003, 291}, {89005, 296}, {89007, 297}, {89010, 297}, + {89012, 289}, {89014, 292}, {89017, 291}, {89019, 289}, {89021, 300}, {89024, 295}, {89032, 292}, {89035, 291}, + {89037, 293}, {89040, 295}, {89043, 288}, {89064, 289}, {89067, 289}, {89069, 290}, {89071, 291}, {89073, 293}, + {89076, 290}, {89078, 289}, {89081, 294}, {89083, 292}, {89087, 288}, {89090, 294}, {89095, 291}, {89100, 292}, + {89103, 301}, {89105, 292}, {89107, 288}, {89109, 291}, {89111, 288}, {89113, 291}, {89116, 288}, {89117, 288}, + {89119, 309}, {89121, 288}, {89124, 288}, {89126, 297}, {89128, 293}, {89130, 305}, {89133, 289}, {89135, 299}, + {89137, 301}, {89140, 290}, {89142, 302}, {89144, 303}, {89146, 288}, {89148, 292}, {89151, 293}, {89153, 296}, + {89156, 289}, {89158, 294}, {89160, 295}, {89162, 288}, {89164, 291}, {89167, 294}, {89169, 291}, {89171, 288}, + {89173, 295}, {89176, 300}, {89179, 291}, {89186, 289}, {89188, 294}, {89191, 288}, {89193, 291}, {89196, 288}, + {89218, 290}, {89220, 292}, {89222, 290}, {89224, 295}, {89226, 303}, {89228, 291}, {89231, 294}, {89234, 291}, + {89237, 294}, {89242, 294}, {89245, 289}, {89251, 294}, {89255, 300}, {89256, 300}, {89258, 294}, {89260, 294}, + {89262, 290}, {89264, 290}, {89266, 290}, {89268, 298}, {89270, 300}, {89272, 306}, {89274, 304}, {89276, 291}, + {89278, 289}, {89280, 288}, {89282, 296}, {89284, 289}, {89286, 293}, {89288, 293}, {89290, 300}, {89291, 292}, + {89294, 300}, {89296, 288}, {89298, 288}, {89300, 292}, {89302, 294}, {89304, 296}, {89306, 289}, {89308, 303}, + {89311, 298}, {89312, 288}, {89315, 299}, {89317, 291}, {89318, 288}, {89321, 292}, {89323, 293}, {89325, 291}, + {89327, 298}, {89328, 288}, {89331, 288}, {89336, 292}, {89340, 292}, {89342, 300}, {89344, 299}, {89347, 291}, + {89349, 297}, {89359, 320}, {89373, 288}, {89375, 289}, {89377, 292}, {89379, 290}, {89382, 288}, {89385, 291}, + {89388, 288}, {89391, 289}, {89395, 290}, {89400, 288}, {89406, 293}, {89409, 297}, {89411, 298}, {89414, 290}, + {89416, 290}, {89418, 293}, {89421, 295}, {89423, 288}, {89425, 292}, {89427, 291}, {89429, 298}, {89431, 288}, + {89433, 288}, {89436, 294}, {89438, 308}, {89441, 291}, {89443, 300}, {89445, 288}, {89448, 303}, {89450, 300}, + {89453, 289}, {89455, 296}, {89458, 294}, {89460, 304}, {89462, 292}, {89465, 288}, {89467, 296}, {89469, 295}, + {89472, 289}, {89474, 292}, {89476, 291}, {89479, 302}, {89481, 303}, {89484, 300}, {89487, 297}, {89493, 293}, + {89495, 293}, {89498, 306}, {89500, 296}, {89503, 292}, {89520, 311}, {89527, 295}, {89530, 288}, {89533, 290}, + {89537, 288}, {89540, 297}, {89545, 296}, {89550, 293}, {89556, 289}, {89561, 303}, {89563, 296}, {89565, 291}, + {89568, 290}, {89570, 295}, {89572, 299}, {89574, 300}, {89576, 293}, {89579, 288}, {89581, 289}, {89583, 309}, + {89585, 303}, {89588, 289}, {89590, 296}, {89592, 296}, {89595, 296}, {89597, 290}, {89599, 304}, {89602, 288}, + {89604, 294}, {89606, 289}, {89609, 288}, {89611, 289}, {89613, 296}, {89616, 290}, {89618, 289}, {89621, 293}, + {89623, 289}, {89626, 297}, {89628, 293}, {89630, 290}, {89633, 288}, {89635, 289}, {89637, 291}, {89640, 300}, + {89643, 294}, {89649, 289}, {89651, 290}, {89654, 299}, {89656, 306}, {89658, 295}, {89661, 295}, {89683, 320}, + {89686, 301}, {89689, 288}, {89693, 296}, {89697, 290}, {89701, 289}, {89707, 290}, {89714, 288}, {89720, 299}, + {89722, 306}, {89725, 303}, {89728, 296}, {89730, 288}, {89732, 294}, {89735, 305}, {89736, 288}, {89739, 299}, + {89741, 289}, {89743, 290}, {89746, 288}, {89748, 303}, {89750, 293}, {89752, 290}, {89754, 291}, {89757, 303}, + {89759, 295}, {89761, 288}, {89764, 288}, {89766, 291}, {89769, 300}, {89771, 290}, {89773, 301}, {89776, 299}, + {89778, 291}, {89780, 288}, {89782, 291}, {89785, 296}, {89787, 289}, {89790, 302}, {89792, 295}, {89794, 294}, + {89796, 295}, {89799, 288}, {89801, 295}, {89804, 291}, {89809, 289}, {89811, 306}, {89813, 289}, {89815, 299}, + {89817, 298}, {89819, 295}, {89822, 297}, {89841, 289}, {89847, 290}, {89850, 288}, {89853, 289}, {89857, 297}, + {89861, 290}, {89866, 293}, {89871, 288}, {89879, 289}, {89881, 297}, {89883, 290}, {89886, 288}, {89888, 288}, + {89890, 294}, {89892, 296}, {89894, 288}, {89896, 288}, {89898, 289}, {89900, 292}, {89902, 298}, {89904, 295}, + {89906, 291}, {89908, 304}, {89910, 288}, {89912, 293}, {89914, 288}, {89916, 290}, {89918, 308}, {89920, 291}, + {89923, 299}, {89925, 309}, {89927, 299}, {89929, 291}, {89932, 289}, {89933, 289}, {89936, 314}, {89938, 288}, + {89940, 291}, {89942, 296}, {89944, 290}, {89947, 292}, {89949, 293}, {89951, 298}, {89953, 296}, {89955, 298}, + {89957, 306}, {89959, 298}, {89962, 289}, {89964, 294}, {89966, 291}, {89971, 304}, {89973, 292}, {89975, 302}, + {89977, 292}, {89978, 295}, {89981, 294}, {89982, 289}, {89984, 291}, {90006, 298}, {90011, 299}, {90014, 289}, + {90018, 297}, {90022, 291}, {90026, 291}, {90032, 290}, {90039, 290}, {90044, 295}, {90046, 291}, {90049, 289}, + {90051, 292}, {90054, 293}, {90056, 288}, {90058, 288}, {90060, 312}, {90062, 298}, {90064, 294}, {90066, 288}, + {90068, 296}, {90070, 297}, {90072, 304}, {90074, 304}, {90076, 289}, {90078, 302}, {90080, 292}, {90082, 298}, + {90084, 288}, {90086, 309}, {90088, 299}, {90090, 305}, {90092, 294}, {90094, 294}, {90096, 299}, {90098, 295}, + {90099, 293}, {90101, 298}, {90103, 289}, {90105, 312}, {90107, 300}, {90109, 298}, {90112, 291}, {90114, 289}, + {90115, 295}, {90117, 302}, {90119, 292}, {90122, 296}, {90123, 289}, {90125, 292}, {90127, 226}, {90129, 292}, + {90131, 288}, {90133, 295}, {90135, 289}, {90138, 291}, {90140, 293}, {90142, 292}, {90144, 297}, {90146, 300}, + {90148, 288}, {90150, 301}, {90152, 293}, {90154, 308}, {90177, 296}, {90180, 298}, {90184, 289}, {90189, 291}, + {90194, 290}, {90201, 290}, {90207, 290}, {90213, 294}, {90215, 288}, {90219, 294}, {90222, 290}, {90225, 308}, + {90227, 291}, {90229, 293}, {90231, 291}, {90233, 289}, {90235, 304}, {90237, 311}, {90239, 299}, {90241, 297}, + {90243, 289}, {90245, 306}, {90247, 295}, {90249, 304}, {90251, 292}, {90253, 303}, {90255, 298}, {90257, 289}, + {90258, 288}, {90261, 288}, {90263, 303}, {90265, 298}, {90267, 296}, {90269, 302}, {90271, 300}, {90273, 289}, + {90275, 295}, {90277, 288}, {90279, 292}, {90281, 293}, {90283, 295}, {90285, 295}, {90287, 293}, {90290, 299}, + {90292, 294}, {90294, 290}, {90296, 289}, {90298, 294}, {90300, 293}, {90303, 294}, {90306, 304}, {90308, 290}, + {90310, 289}, {90312, 302}, {90314, 288}, {90316, 289}, {90318, 299}, {90320, 296}, {90322, 294}, {90342, 300}, + {90347, 293}, {90352, 290}, {90356, 294}, {90362, 289}, {90370, 289}, {90378, 288}, {90381, 291}, {90384, 288}, + {90388, 288}, {90391, 288}, {90394, 289}, {90397, 290}, {90399, 291}, {90401, 288}, {90403, 296}, {90406, 289}, + {90408, 291}, {90410, 294}, {90412, 292}, {90414, 299}, {90416, 294}, {90418, 290}, {90421, 290}, {90423, 301}, + {90425, 298}, {90427, 290}, {90430, 296}, {90432, 299}, {90434, 310}, {90436, 292}, {90438, 296}, {90440, 289}, + {90443, 306}, {90445, 290}, {90448, 305}, {90450, 288}, {90453, 306}, {90455, 296}, {90458, 289}, {90460, 294}, + {90462, 289}, {90464, 295}, {90466, 289}, {90469, 302}, {90471, 294}, {90474, 292}, {90476, 298}, {90478, 311}, + {90480, 290}, {90483, 288}, {90485, 295}, {90487, 297}, {90489, 291}, {90509, 312}, {90514, 288}, {90519, 291}, + {90526, 289}, {90534, 290}, {90544, 289}, {90548, 290}, {90552, 288}, {90556, 302}, {90559, 290}, {90562, 308}, + {90565, 292}, {90567, 295}, {90570, 302}, {90572, 288}, {90574, 294}, {90576, 293}, {90578, 297}, {90580, 296}, + {90583, 296}, {90585, 288}, {90587, 301}, {90590, 294}, {90592, 289}, {90594, 295}, {90596, 299}, {90598, 312}, + {90600, 303}, {90602, 291}, {90604, 315}, {90607, 293}, {90609, 301}, {90611, 295}, {90613, 290}, {90615, 294}, + {90617, 296}, {90620, 300}, {90622, 288}, {90624, 313}, {90626, 290}, {90628, 289}, {90631, 292}, {90633, 291}, + {90635, 296}, {90637, 292}, {90640, 299}, {90642, 293}, {90644, 289}, {90647, 306}, {90649, 303}, {90651, 308}, + {90653, 301}, {90655, 291}, {90657, 292}, {90659, 290}, {90680, 294}, {90684, 294}, {90688, 291}, {90693, 289}, + {90699, 293}, {90708, 290}, {90718, 290}, {90724, 295}, {90729, 291}, {90732, 294}, {90735, 298}, {90739, 288}, + {90741, 305}, {90744, 293}, {90746, 288}, {90750, 316}, {90752, 297}, {90753, 294}, {90755, 293}, {90757, 289}, + {90760, 293}, {90762, 293}, {90764, 299}, {90766, 301}, {90768, 310}, {90770, 288}, {90772, 310}, {90774, 316}, + {90776, 290}, {90778, 288}, {90780, 302}, {90781, 289}, {90783, 312}, {90786, 291}, {90787, 295}, {90790, 291}, + {90792, 296}, {90794, 295}, {90796, 289}, {90798, 295}, {90800, 293}, {90802, 297}, {90804, 289}, {90806, 289}, + {90808, 307}, {90810, 290}, {90813, 301}, {90814, 289}, {90816, 305}, {90819, 298}, {90821, 291}, {90823, 298}, + {90826, 310}, {90828, 298}, {90830, 299}, {90832, 288}, {90834, 296}, {90836, 311}, {90838, 293}, {90859, 302}, + {90864, 295}, {90867, 292}, {90872, 288}, {90879, 296}, {90886, 288}, {90896, 288}, {90903, 291}, {90908, 289}, + {90913, 300}, {90917, 290}, {90921, 300}, {90924, 291}, {90926, 289}, {90930, 293}, {90932, 292}, {90934, 305}, + {90937, 297}, {90940, 315}, {90942, 289}, {90944, 295}, {90946, 300}, {90948, 291}, {90950, 294}, {90952, 299}, + {90954, 296}, {90956, 294}, {90958, 304}, {90960, 294}, {90963, 297}, {90965, 299}, {90967, 288}, {90969, 314}, + {90971, 297}, {90973, 300}, {90975, 290}, {90977, 309}, {90979, 289}, {90981, 291}, {90983, 293}, {90985, 307}, + {90987, 288}, {90989, 304}, {90991, 288}, {90994, 304}, {90996, 290}, {90998, 294}, {91000, 295}, {91002, 293}, + {91004, 298}, {91006, 305}, {91008, 294}, {91010, 296}, {91012, 289}, {91014, 288}, {91016, 288}, {91018, 308}, + {91020, 291}, {91040, 288}, {91045, 292}, {91048, 297}, {91052, 290}, {91060, 288}, {91070, 289}, {91080, 289}, + {91086, 291}, {91091, 294}, {91097, 303}, {91100, 295}, {91103, 295}, {91107, 299}, {91110, 292}, {91113, 307}, + {91115, 297}, {91118, 317}, {91121, 290}, {91122, 288}, {91125, 302}, {91126, 298}, {91128, 292}, {91130, 296}, + {91132, 316}, {91134, 296}, {91137, 290}, {91139, 292}, {91141, 289}, {91143, 288}, {91145, 299}, {91147, 310}, + {91149, 300}, {91151, 297}, {91153, 302}, {91156, 292}, {91157, 288}, {91159, 297}, {91161, 302}, {91163, 293}, + {91166, 300}, {91168, 299}, {91169, 298}, {91172, 301}, {91173, 288}, {91176, 302}, {91178, 288}, {91180, 298}, + {91182, 288}, {91184, 315}, {91185, 294}, {91187, 313}, {91189, 294}, {91192, 305}, {91194, 295}, {91195, 290}, + {91197, 298}, {91200, 291}, {91206, 288}, {91221, 302}, {91226, 288}, {91229, 302}, {91231, 289}, {91235, 292}, + {91241, 293}, {91250, 289}, {91259, 291}, {91266, 288}, {91272, 292}, {91276, 293}, {91280, 288}, {91284, 288}, + {91287, 301}, {91290, 289}, {91293, 288}, {91295, 288}, {91298, 297}, {91300, 311}, {91303, 292}, {91304, 288}, + {91306, 297}, {91308, 306}, {91310, 296}, {91312, 296}, {91313, 304}, {91316, 296}, {91318, 294}, {91320, 295}, + {91321, 289}, {91323, 305}, {91325, 292}, {91326, 306}, {91328, 291}, {91330, 291}, {91332, 293}, {91333, 298}, + {91335, 293}, {91337, 291}, {91338, 290}, {91340, 302}, {91342, 305}, {91343, 288}, {91345, 289}, {91347, 295}, + {91349, 301}, {91350, 297}, {91352, 300}, {91354, 304}, {91356, 306}, {91358, 294}, {91360, 301}, {91362, 294}, + {91364, 300}, {91365, 288}, {91367, 297}, {91369, 290}, {91371, 299}, {91372, 290}, {91374, 290}, {91376, 291}, + {91378, 294}, {91380, 296}, {91382, 295}, {91383, 300}, {91392, 294}, {91406, 292}, {91410, 291}, {91413, 297}, + {91415, 292}, {91417, 289}, {91421, 288}, {91428, 289}, {91437, 289}, {91448, 290}, {91454, 289}, {91459, 292}, + {91464, 288}, {91468, 296}, {91472, 298}, {91476, 295}, {91479, 293}, {91481, 305}, {91482, 166}, {91485, 289}, + {91488, 299}, {91489, 289}, {91491, 296}, {91493, 296}, {91494, 288}, {91496, 292}, {91498, 292}, {91500, 299}, + {91502, 294}, {91505, 291}, {91506, 290}, {91508, 289}, {91510, 295}, {91512, 290}, {91514, 297}, {91515, 296}, + {91517, 288}, {91519, 296}, {91520, 313}, {91522, 302}, {91524, 300}, {91526, 309}, {91527, 300}, {91529, 309}, + {91531, 296}, {91533, 298}, {91534, 294}, {91536, 290}, {91538, 292}, {91540, 291}, {91542, 306}, {91544, 302}, + {91546, 291}, {91548, 293}, {91550, 292}, {91552, 296}, {91554, 298}, {91555, 288}, {91557, 293}, {91559, 292}, + {91560, 291}, {91562, 307}, {91564, 299}, {91566, 294}, {91568, 289}, {91570, 310}, {91571, 289}, {91592, 290}, + {91597, 289}, {91601, 297}, {91604, 306}, {91606, 297}, {91608, 290}, {91613, 289}, {91621, 293}, {91631, 292}, + {91641, 288}, {91647, 289}, {91652, 292}, {91657, 289}, {91661, 292}, {91664, 291}, {91668, 291}, {91672, 288}, + {91675, 294}, {91678, 300}, {91680, 303}, {91682, 294}, {91684, 290}, {91686, 289}, {91688, 289}, {91690, 312}, + {91692, 292}, {91694, 288}, {91697, 290}, {91699, 291}, {91701, 299}, {91703, 316}, {91704, 294}, {91706, 310}, + {91708, 299}, {91710, 294}, {91711, 300}, {91713, 292}, {91715, 296}, {91716, 295}, {91718, 297}, {91720, 295}, + {91722, 291}, {91724, 302}, {91725, 290}, {91727, 305}, {91730, 302}, {91731, 290}, {91733, 288}, {91735, 289}, + {91737, 297}, {91740, 290}, {91742, 291}, {91744, 293}, {91746, 292}, {91747, 310}, {91749, 296}, {91751, 292}, + {91753, 289}, {91755, 300}, {91757, 290}, {91758, 307}, {91760, 304}, {91762, 302}, {91770, 292}, {91786, 300}, + {91789, 291}, {91794, 297}, {91796, 294}, {91799, 288}, {91800, 291}, {91806, 289}, {91814, 289}, {91825, 292}, + {91833, 294}, {91839, 293}, {91844, 289}, {91848, 290}, {91852, 289}, {91856, 296}, {91860, 295}, {91862, 291}, + {91865, 294}, {91868, 290}, {91870, 300}, {91871, 289}, {91873, 304}, {91875, 289}, {91877, 304}, {91879, 313}, + {91881, 290}, {91883, 291}, {91886, 290}, {91888, 302}, {91890, 288}, {91892, 309}, {91893, 289}, {91895, 297}, + {91896, 300}, {91898, 305}, {91900, 292}, {91901, 307}, {91903, 295}, {91904, 294}, {91906, 308}, {91908, 315}, + {91909, 292}, {91911, 291}, {91913, 291}, {91915, 290}, {91917, 298}, {91919, 296}, {91921, 299}, {91923, 303}, + {91925, 292}, {91928, 295}, {91930, 296}, {91931, 290}, {91933, 296}, {91934, 289}, {91936, 292}, {91938, 292}, + {91939, 290}, {91941, 307}, {91943, 290}, {91945, 291}, {91947, 288}, {91948, 293}, {91950, 289}, {91954, 289}, + {91970, 288}, {91978, 297}, {91981, 290}, {91984, 288}, {91987, 300}, {91989, 299}, {91991, 303}, {91998, 292}, + {92006, 291}, {92014, 290}, {92023, 289}, {92028, 291}, {92034, 288}, {92038, 289}, {92042, 291}, {92045, 288}, + {92050, 294}, {92052, 288}, {92056, 293}, {92059, 288}, {92061, 295}, {92063, 296}, {92064, 291}, {92066, 290}, + {92068, 290}, {92070, 298}, {92072, 289}, {92075, 290}, {92078, 298}, {92080, 289}, {92082, 303}, {92083, 294}, + {92085, 301}, {92086, 316}, {92088, 293}, {92089, 291}, {92091, 299}, {92092, 290}, {92094, 294}, {92095, 311}, + {92097, 297}, {92098, 290}, {92100, 298}, {92101, 302}, {92103, 295}, {92105, 296}, {92106, 290}, {92108, 294}, + {92110, 289}, {92112, 292}, {92115, 289}, {92116, 288}, {92118, 295}, {92121, 288}, {92123, 298}, {92124, 293}, + {92126, 290}, {92127, 298}, {92129, 301}, {92131, 290}, {92132, 290}, {92134, 294}, {92136, 289}, {92138, 291}, + {92140, 305}, {92142, 288}, {92154, 290}, {92164, 288}, {92167, 298}, {92170, 288}, {92173, 290}, {92176, 291}, + {92178, 288}, {92186, 290}, {92194, 289}, {92204, 288}, {92210, 291}, {92216, 291}, {92220, 289}, {92223, 288}, + {92227, 290}, {92231, 294}, {92234, 290}, {92237, 288}, {92240, 290}, {92242, 292}, {92243, 288}, {92245, 289}, + {92247, 289}, {92249, 293}, {92251, 289}, {92253, 292}, {92256, 297}, {92259, 294}, {92260, 301}, {92262, 292}, + {92264, 296}, {92265, 301}, {92267, 304}, {92268, 288}, {92269, 292}, {92271, 296}, {92272, 298}, {92274, 289}, + {92275, 314}, {92277, 309}, {92278, 293}, {92280, 295}, {92282, 291}, {92283, 298}, {92285, 289}, {92287, 292}, + {92290, 288}, {92291, 288}, {92293, 288}, {92296, 288}, {92298, 295}, {92300, 295}, {92302, 293}, {92303, 290}, + {92305, 301}, {92306, 289}, {92308, 293}, {92309, 292}, {92311, 297}, {92313, 293}, {92315, 290}, {92317, 297}, + {92318, 297}, {92320, 289}, {92331, 290}, {92341, 294}, {92346, 295}, {92349, 290}, {92352, 308}, {92355, 297}, + {92357, 290}, {92360, 291}, {92364, 288}, {92372, 292}, {92382, 292}, {92390, 288}, {92395, 291}, {92401, 291}, + {92405, 292}, {92408, 290}, {92412, 291}, {92415, 299}, {92417, 290}, {92421, 300}, {92422, 288}, {92424, 292}, + {92426, 291}, {92428, 304}, {92430, 288}, {92433, 288}, {92436, 293}, {92438, 291}, {92440, 288}, {92442, 293}, + {92444, 313}, {92445, 296}, {92447, 294}, {92449, 300}, {92450, 297}, {92452, 299}, {92453, 292}, {92455, 292}, + {92457, 303}, {92458, 297}, {92460, 289}, {92462, 293}, {92464, 292}, {92465, 290}, {92467, 289}, {92469, 296}, + {92471, 288}, {92473, 299}, {92475, 291}, {92477, 293}, {92480, 290}, {92482, 294}, {92484, 294}, {92485, 289}, + {92487, 289}, {92489, 293}, {92490, 297}, {92492, 289}, {92494, 289}, {92495, 288}, {92497, 298}, {92499, 295}, + {92501, 292}, {92503, 292}, {92511, 290}, {92520, 296}, {92529, 288}, {92534, 293}, {92537, 304}, {92538, 99}, + {92541, 288}, {92544, 291}, {92547, 288}, {92549, 288}, {92555, 290}, {92563, 289}, {92572, 290}, {92579, 289}, + {92585, 289}, {92589, 289}, {92594, 288}, {92598, 289}, {92602, 293}, {92604, 296}, {92607, 291}, {92610, 296}, + {92612, 295}, {92614, 295}, {92616, 293}, {92618, 296}, {92620, 292}, {92622, 288}, {92625, 291}, {92628, 294}, + {92630, 292}, {92632, 288}, {92634, 291}, {92635, 289}, {92637, 289}, {92639, 288}, {92641, 302}, {92642, 305}, + {92644, 299}, {92646, 292}, {92647, 288}, {92649, 289}, {92651, 288}, {92652, 304}, {92654, 296}, {92655, 292}, + {92658, 288}, {92659, 291}, {92661, 293}, {92663, 291}, {92665, 289}, {92667, 288}, {92670, 292}, {92672, 296}, + {92674, 291}, {92676, 288}, {92677, 291}, {92679, 297}, {92681, 290}, {92683, 291}, {92684, 289}, {92686, 294}, + {92688, 290}, {92690, 297}, {92692, 295}, {92694, 288}, {92696, 291}, {92707, 297}, {92715, 289}, {92722, 290}, + {92727, 289}, {92730, 288}, {92733, 294}, {92736, 291}, {92739, 293}, {92742, 297}, {92745, 290}, {92752, 295}, + {92760, 289}, {92769, 288}, {92775, 288}, {92780, 289}, {92785, 292}, {92789, 289}, {92793, 291}, {92796, 290}, + {92800, 290}, {92802, 288}, {92805, 295}, {92806, 290}, {92809, 292}, {92811, 288}, {92813, 288}, {92816, 290}, + {92819, 291}, {92821, 295}, {92823, 292}, {92825, 290}, {92827, 300}, {92829, 294}, {92830, 290}, {92832, 288}, + {92834, 288}, {92835, 289}, {92837, 290}, {92839, 289}, {92841, 292}, {92842, 290}, {92844, 294}, {92846, 291}, + {92848, 296}, {92850, 290}, {92852, 290}, {92854, 288}, {92856, 292}, {92858, 297}, {92861, 291}, {92863, 289}, + {92865, 288}, {92867, 288}, {92869, 293}, {92870, 288}, {92872, 296}, {92874, 291}, {92876, 293}, {92878, 289}, + {92880, 288}, {92882, 289}, {92884, 302}, {92888, 289}, {92898, 290}, {92903, 291}, {92910, 288}, {92915, 289}, + {92918, 291}, {92922, 289}, {92924, 292}, {92927, 297}, {92930, 289}, {92935, 290}, {92942, 290}, {92950, 289}, + {92957, 289}, {92963, 289}, {92968, 290}, {92972, 289}, {92976, 293}, {92979, 288}, {92982, 292}, {92986, 292}, + {92988, 288}, {92990, 289}, {92993, 291}, {92995, 288}, {92998, 290}, {93001, 289}, {93003, 288}, {93006, 290}, + {93008, 292}, {93009, 290}, {93012, 299}, {93013, 291}, {93015, 293}, {93016, 297}, {93018, 288}, {93020, 289}, + {93021, 290}, {93023, 290}, {93025, 290}, {93027, 292}, {93029, 298}, {93031, 288}, {93033, 296}, {93035, 290}, + {93037, 293}, {93039, 290}, {93041, 288}, {93043, 288}, {93045, 298}, {93047, 293}, {93049, 294}, {93051, 290}, + {93053, 297}, {93054, 294}, {93056, 293}, {93058, 291}, {93060, 289}, {93062, 291}, {93064, 291}, {93065, 288}, + {93067, 291}, {93072, 291}, {93080, 290}, {93087, 288}, {93092, 289}, {93097, 290}, {93102, 292}, {93105, 290}, + {93109, 295}, {93112, 290}, {93114, 288}, {93117, 288}, {93119, 295}, {93126, 291}, {93133, 288}, {93142, 296}, + {93148, 289}, {93153, 290}, {93158, 290}, {93161, 293}, {93166, 290}, {93169, 291}, {93173, 289}, {93176, 289}, + {93178, 288}, {93180, 289}, {93182, 290}, {93185, 292}, {93188, 288}, {93191, 292}, {93194, 300}, {93195, 293}, + {93198, 292}, {93200, 296}, {93201, 289}, {93203, 291}, {93205, 290}, {93207, 292}, {93209, 293}, {93211, 289}, + {93212, 288}, {93214, 292}, {93216, 288}, {93218, 291}, {93220, 289}, {93221, 291}, {93223, 289}, {93225, 289}, + {93227, 295}, {93229, 293}, {93231, 291}, {93234, 290}, {93236, 292}, {93238, 288}, {93240, 289}, {93242, 296}, + {93244, 296}, {93246, 289}, {93248, 292}, {93250, 288}, {93252, 289}, {93253, 290}, {93255, 288}, {93259, 289}, + {93266, 291}, {93273, 282}, {93278, 290}, {93283, 289}, {93288, 291}, {93291, 288}, {93295, 292}, {93298, 293}, + {93301, 289}, {93304, 290}, {93306, 289}, {93309, 289}, {93315, 288}, {93323, 288}, {93331, 290}, {93336, 289}, + {93341, 288}, {93345, 289}, {93350, 290}, {93353, 292}, {93357, 288}, {93360, 289}, {93363, 289}, {93365, 289}, + {93368, 289}, {93371, 289}, {93374, 288}, {93377, 295}, {93379, 293}, {93381, 288}, {93383, 289}, {93385, 290}, + {93387, 289}, {93390, 288}, {93392, 289}, {93394, 289}, {93396, 290}, {93398, 288}, {93400, 292}, {93402, 290}, + {93404, 295}, {93406, 290}, {93408, 290}, {93410, 296}, {93412, 290}, {93414, 289}, {93416, 288}, {93418, 293}, + {93420, 292}, {93422, 288}, {93424, 288}, {93426, 288}, {93428, 290}, {93429, 291}, {93431, 288}, {93433, 288}, + {93435, 291}, {93437, 288}, {93439, 294}, {93445, 295}, {93450, 294}, {93456, 290}, {93461, 288}, {93465, 290}, + {93469, 289}, {93473, 291}, {93477, 288}, {93479, 288}, {93482, 289}, {93485, 289}, {93487, 293}, {93490, 293}, + {93492, 289}, {93495, 288}, {93500, 289}, {93506, 289}, {93514, 293}, {93520, 289}, {93525, 289}, {93530, 289}, + {93534, 290}, {93538, 290}, {93542, 288}, {93545, 289}, {93548, 289}, {93550, 291}, {93553, 288}, {93555, 289}, + {93558, 290}, {93561, 293}, {93564, 292}, {93566, 290}, {93569, 289}, {93571, 289}, {93573, 288}, {93575, 291}, + {93577, 290}, {93579, 288}, {93581, 288}, {93583, 290}, {93585, 288}, {93587, 288}, {93589, 291}, {93591, 293}, + {93593, 289}, {93596, 289}, {93598, 290}, {93600, 289}, {93602, 290}, {93604, 288}, {93606, 293}, {93608, 289}, + {93610, 288}, {93612, 292}, {93614, 289}, {93616, 289}, {93617, 288}, {93619, 294}, {93621, 288}, {93623, 290}, + {93625, 290}, {93631, 290}, {93637, 295}, {93642, 291}, {93647, 295}, {93651, 289}, {93656, 290}, {93659, 289}, + {93662, 288}, {93665, 289}, {93668, 290}, {93671, 289}, {93673, 288}, {93676, 305}, {93683, 290}, {93690, 298}, + {93696, 288}, {93702, 292}, {93706, 289}, {93710, 288}, {93715, 290}, {93718, 288}, {93721, 288}, {93723, 290}, + {93726, 291}, {93729, 290}, {93732, 293}, {93735, 290}, {93738, 288}, {93740, 291}, {93742, 290}, {93744, 290}, + {93746, 290}, {93749, 295}, {93751, 288}, {93753, 292}, {93755, 288}, {93757, 289}, {93759, 289}, {93761, 292}, + {93764, 288}, {93766, 288}, {93768, 291}, {93770, 291}, {93772, 292}, {93774, 292}, {93777, 292}, {93779, 290}, + {93781, 288}, {93783, 288}, {93785, 289}, {93788, 289}, {93790, 288}, {93792, 289}, {93794, 288}, {93799, 294}, + {93804, 289}, {93809, 291}, {93813, 290}, {93817, 293}, {93820, 290}, {93824, 288}, {93828, 290}, {93831, 292}, + {93834, 290}, {93837, 292}, {93839, 290}, {93841, 291}, {93844, 290}, {93846, 289}, {93850, 296}, {93856, 292}, + {93863, 288}, {93869, 301}, {93873, 288}, {93878, 295}, {93881, 292}, {93885, 288}, {93889, 288}, {93892, 290}, + {93892, 27}, {93895, 291}, {93896, 290}, {93899, 290}, {93902, 288}, {93905, 290}, {93907, 293}, {93910, 289}, + {93912, 292}, {93914, 293}, {93916, 292}, {93918, 288}, {93920, 289}, {93922, 288}, {93924, 288}, {93926, 289}, + {93928, 290}, {93930, 292}, {93932, 288}, {93934, 288}, {93936, 289}, {93938, 288}, {93940, 291}, {93942, 289}, + {93944, 293}, {93946, 288}, {93948, 289}, {93950, 289}, {93952, 288}, {93954, 294}, {93956, 288}, {93958, 288}, + {93960, 289}, {93962, 288}, {93964, 288}, {93966, 292}, {93968, 288}, {93972, 295}, {93976, 290}, {93980, 292}, + {93985, 297}, {93988, 291}, {93991, 288}, {93994, 297}, {93997, 290}, {94000, 288}, {94004, 291}, {94006, 291}, + {94009, 289}, {94011, 291}, {94014, 288}, {94016, 290}, {94018, 288}, {94020, 289}, {94022, 290}, {94025, 294}, + {94031, 292}, {94037, 288}, {94044, 288}, {94049, 289}, {94054, 289}, {94058, 292}, {94062, 292}, {94066, 290}, + {94069, 288}, {94072, 288}, {94075, 291}, {94077, 289}, {94080, 289}, {94084, 288}, {94087, 288}, {94089, 290}, + {94091, 295}, {94094, 290}, {94096, 292}, {94098, 288}, {94100, 288}, {94102, 290}, {94104, 291}, {94107, 290}, + {94109, 289}, {94111, 288}, {94113, 294}, {94115, 290}, {94117, 288}, {94119, 290}, {94121, 288}, {94123, 290}, + {94125, 288}, {94128, 288}, {94130, 291}, {94132, 291}, {94134, 290}, {94136, 295}, {94138, 288}, {94141, 290}, + {94142, 289}, {94145, 291}, {94148, 295}, {94152, 291}, {94156, 288}, {94161, 290}, {94166, 291}, {94169, 288}, + {94172, 294}, {94175, 289}, {94178, 290}, {94182, 292}, {94185, 292}, {94188, 291}, {94190, 288}, {94193, 290}, + {94195, 294}, {94198, 291}, {94200, 288}, {94202, 288}, {94206, 289}, {94212, 292}, {94218, 289}, {94224, 289}, + {94228, 288}, {94232, 288}, {94237, 293}, {94240, 291}, {94244, 289}, {94247, 288}, {94249, 288}, {94251, 288}, + {94254, 291}, {94257, 290}, {94260, 288}, {94263, 291}, {94265, 290}, {94267, 288}, {94270, 290}, {94272, 292}, + {94274, 293}, {94276, 288}, {94278, 289}, {94281, 289}, {94283, 288}, {94285, 292}, {94287, 289}, {94289, 291}, + {94291, 289}, {94292, 290}, {94295, 288}, {94297, 290}, {94298, 289}, {94300, 290}, {94302, 289}, {94304, 288}, + {94306, 293}, {94309, 289}, {94311, 291}, {94313, 289}, {94315, 289}, {94317, 296}, {94319, 288}, {94321, 289}, + {94325, 292}, {94328, 296}, {94331, 291}, {94335, 294}, {94339, 289}, {94342, 291}, {94345, 290}, {94348, 289}, + {94351, 295}, {94354, 291}, {94357, 291}, {94359, 289}, {94362, 290}, {94364, 288}, {94367, 293}, {94370, 289}, + {94372, 290}, {94374, 290}, {94376, 293}, {94378, 289}, {94383, 289}, {94390, 297}, {94397, 294}, {94401, 289}, + {94405, 289}, {94408, 291}, {94411, 289}, {94414, 293}, {94417, 269}, {94420, 295}, {94422, 290}, {94424, 289}, + {94426, 288}, {94429, 294}, {94431, 288}, {94433, 289}, {94436, 289}, {94439, 296}, {94443, 289}, {94445, 290}, + {94448, 288}, {94451, 288}, {94453, 289}, {94455, 288}, {94458, 289}, {94460, 292}, {94462, 290}, {94465, 291}, + {94467, 290}, {94470, 290}, {94473, 289}, {94475, 290}, {94478, 291}, {94480, 292}, {94483, 288}, {94485, 289}, + {94488, 288}, {94490, 291}, {94493, 288}, {94495, 290}, {94497, 288}, {94500, 294}, {94503, 291}, {94507, 289}, + {94509, 290}, {94512, 288}, {94515, 288}, {94518, 290}, {94522, 290}, {94525, 290}, {94528, 290}, {94531, 289}, + {94533, 290}, {94535, 288}, {94538, 299}, {94541, 288}, {94545, 292}, {94547, 288}, {94550, 288}, {94556, 288}, + {94559, 288}, {94563, 291}, {94567, 289}, {94570, 288}, {94573, 288}, {94576, 290}, {94579, 289}, {94582, 291}, + {94585, 288}, {94589, 292}, {94593, 288}, {94597, 288}, {94601, 290}, {94604, 288}, {94607, 288}, {94609, 288}, + {94612, 289}, {94615, 289}, {94618, 289}, {94621, 288}, {94624, 290}, {94627, 288}, {94630, 289}, {94632, 292}, + {94635, 290}, {94638, 289}, {94640, 289}, {94643, 290}, {94645, 290}, {94651, 301}, {94658, 290}, {94667, 289}, + {94674, 292}, {94682, 290}, {94688, 289}, {94695, 294}, {94700, 290}, {94706, 288}, {94712, 288}, {94716, 293}, + {94722, 290}, {94727, 288}, {94730, 290}, {94733, 290}, {94737, 288}, {94741, 290}, {94743, 288}, {94745, 290}, + {94747, 288}, {94749, 289}, {94752, 288}, {94755, 288}, {94758, 291}, {94762, 289}, {94765, 288}, {94768, 289}, + {94772, 289}, {94776, 292}, {94778, 292}, {94780, 288}, {94783, 288}, {94786, 292}, {94788, 293}, {94791, 289}, + {94794, 297}, {94797, 290}, {94800, 288}, {94803, 292}, {94806, 290}, {94809, 288}, {94812, 293}, {94815, 288}, + {94818, 288}, {94819, 290}, {94820, 290}, {94826, 288}, {94827, 289}, {94829, 289}, {94830, 289}, {94831, 291}, + {94832, 293}, {94834, 288}, {94835, 289}, {94836, 288}, {94838, 290}, {94839, 288}, {94840, 293}, {94842, 288}, + {94843, 288}, {94844, 289}, {94846, 293}, {94847, 289}, {94848, 289}, {94850, 289}, {94852, 289}, {94853, 288}, + {94855, 288}, {94857, 289}, {94859, 295}, {94861, 290}, {94863, 293}, {94865, 289}, {94867, 291}, {94869, 293}, + {94872, 289}, {94874, 290}, {94878, 293}, {94881, 289}, {94884, 292}, {94887, 289}, {94891, 290}, {94897, 290}, + {94902, 290}, {94906, 291}, {94911, 290}, {94914, 290}, {94918, 288}, {94923, 288}, {94927, 290}, {94932, 289}, + {94937, 289}, {94942, 289}, {94947, 288}, {94953, 290}, {94959, 288}, {94965, 289}, {94970, 289}, {94975, 289}, + {94978, 292}, {94982, 292}, {94985, 292}, {94989, 291}, {94992, 289}, {94994, 290}, {94997, 294}, {95000, 290}, + {100001, 295}}; + + std::vector> values; + // GIVEN an estimator (step=10ms, window=20ms, peak=1ms) + RateEstimator estim(10000, 20000, 1000, + [&](timestamp t, double avg, double peak) { values.emplace_back(t, avg, peak); }); + + // WHEN we add samples + for (auto &sample : samples) { + estim.add_data(sample[0], sample[1]); + } + + // THEN we get expected rates (around 100Me/s, except for first two windows and last one) + const std::vector> expected_values = { + {49955300., 100318000.}, {74844850., 100318000.}, {97750200., 100170000.}, {86791600., 100031000.}, + {88737950., 100193000.}, {99423850., 100193000.}, {86462250., 100040000.}, {86755100., 100040000.}, + {99574450., 99982000.}, {74393850., 99879000.}}; + + EXPECT_EQ(values.size(), expected_values.size()); + for (size_t i = 0; i < values.size(); ++i) { + EXPECT_EQ((i + 1) * 10000, std::get<0>(values[i])); + EXPECT_DOUBLE_EQ(std::get<0>(expected_values[i]), std::get<1>(values[i])); + EXPECT_DOUBLE_EQ(std::get<1>(expected_values[i]), std::get<2>(values[i])); + } +} diff --git a/sdk/modules/core/python/pypkg/metavision_core/event_io/box_npy_reader.py b/sdk/modules/core/python/pypkg/metavision_core/event_io/box_npy_reader.py index d1600a957..f1c21350e 100644 --- a/sdk/modules/core/python/pypkg/metavision_core/event_io/box_npy_reader.py +++ b/sdk/modules/core/python/pypkg/metavision_core/event_io/box_npy_reader.py @@ -6,6 +6,7 @@ # Unless required by applicable law or agreed to in writing, software distributed under the License is distributed # on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and limitations under the License. + import numpy as np from . import EventNpyReader diff --git a/sdk/modules/core/python/pypkg/metavision_core/event_io/event_bufferizer.py b/sdk/modules/core/python/pypkg/metavision_core/event_io/event_bufferizer.py index fe55e8504..970ed4c4a 100644 --- a/sdk/modules/core/python/pypkg/metavision_core/event_io/event_bufferizer.py +++ b/sdk/modules/core/python/pypkg/metavision_core/event_io/event_bufferizer.py @@ -16,6 +16,7 @@ - maximum flow etc. """ + import numpy as np from metavision_sdk_base import EventCD diff --git a/sdk/modules/core/python/pypkg/metavision_core/event_io/events_iterator.py b/sdk/modules/core/python/pypkg/metavision_core/event_io/events_iterator.py index c008d19ce..a2573aca1 100644 --- a/sdk/modules/core/python/pypkg/metavision_core/event_io/events_iterator.py +++ b/sdk/modules/core/python/pypkg/metavision_core/event_io/events_iterator.py @@ -24,6 +24,8 @@ class EventsIterator(object): EventsIterator is a small convenience class to iterate through either a camera, a DAT file, a RAW file or a H5 file containing events. + Note that, as every Python iterator, you can consume an EventsIterator only once. + Attributes: reader : class handling the file or camera. delta_t (int): Duration of served event slice in us. @@ -37,7 +39,7 @@ class EventsIterator(object): try to open that camera instead. start_ts (int): First timestamp to consider (in us). If mode is "delta_t" or "mixed", start_ts must be a multiple of delta_t, otherwise a ValueError is thrown. - mode (string): Load by timeslice of number of events. Either "delta_t", "n_events" or "mixed", + mode (string): Load by timeslice or number of events. Either "delta_t", "n_events" or "mixed", where mixed uses both delta_t and n_events and chooses the first met criterion. delta_t (int): Duration of served event slice in us. n_events (int): Number of events in the timeslice. @@ -101,7 +103,7 @@ def from_device(cls, device, start_ts=0, n_events=10000, delta_t=50000, mode="de Args: device (device): Hal device object initialized independently. start_ts (int): First timestamp to consider. - mode (string): Load by timeslice of number of events. Either "delta_t" or "n_events" + mode (string): Load by timeslice or number of events. Either "delta_t" or "n_events" delta_t (int): Duration of served event slice in us. n_events (int): Number of events in the timeslice. max_duration (int): If not None, maximal duration of the iteration in us. @@ -137,8 +139,7 @@ def __repr__(self): def __iter__(self): if self._ran: - self.reader.reset() - self.current_time = 0 + raise Exception('Can not iterate twice over the same EventIterator!') self._ran = True with self.reader as _: diff --git a/sdk/modules/core/python/pypkg/metavision_core/event_io/h5_io.py b/sdk/modules/core/python/pypkg/metavision_core/event_io/h5_io.py index 349e73175..8709c9ce7 100644 --- a/sdk/modules/core/python/pypkg/metavision_core/event_io/h5_io.py +++ b/sdk/modules/core/python/pypkg/metavision_core/event_io/h5_io.py @@ -13,6 +13,7 @@ - zlib (fast read, slow write) - zstandard (fast read, fast write, but you have to install it) """ + import h5py import zlib try: diff --git a/sdk/modules/core/python/pypkg/metavision_core/event_io/live_replay.py b/sdk/modules/core/python/pypkg/metavision_core/event_io/live_replay.py index aabf57272..0cec41164 100644 --- a/sdk/modules/core/python/pypkg/metavision_core/event_io/live_replay.py +++ b/sdk/modules/core/python/pypkg/metavision_core/event_io/live_replay.py @@ -10,15 +10,19 @@ """ Live Replay Events Iterator, this is for user friendliness """ + import os import time from metavision_core.event_io.events_iterator import EventsIterator def is_live_camera(input_path): - """Checks if input_path is a live camera + """ + Checks if input_path is a live camera + Args: - input_path (str): path to the file to read. if `path` is an empty string or a camera serial number, this function will return true. + input_path (str): path to the file to read. if `path` is an empty string or a camera serial number, + this function will return true. """ return isinstance(input_path, str) and not os.path.exists(input_path) diff --git a/sdk/modules/core/python/pypkg/metavision_core/event_io/meta_event_producer.py b/sdk/modules/core/python/pypkg/metavision_core/event_io/meta_event_producer.py index 88e128624..de3a34b52 100644 --- a/sdk/modules/core/python/pypkg/metavision_core/event_io/meta_event_producer.py +++ b/sdk/modules/core/python/pypkg/metavision_core/event_io/meta_event_producer.py @@ -8,13 +8,7 @@ # See the License for the specific language governing permissions and limitations under the License. """ -This class receives events, buffers them, -and yields them according to a common criterion like -- event_count -- fixed_time -- array coverage -- maximum flow -etc. +This class Resamples an event producer to stream by N events or DT duration """ import numpy as np diff --git a/sdk/modules/core/python/pypkg/metavision_core/event_io/npy_tools.py b/sdk/modules/core/python/pypkg/metavision_core/event_io/npy_tools.py index 293cfdefb..422266392 100644 --- a/sdk/modules/core/python/pypkg/metavision_core/event_io/npy_tools.py +++ b/sdk/modules/core/python/pypkg/metavision_core/event_io/npy_tools.py @@ -30,6 +30,11 @@ def stream_events(file_handle, buffer, dtype, ev_count=-1): count = len(dat) for name in dat.dtype.names: buffer[name][:count] = dat[name] + # make sure timestamp is monotonic + if 't' in buffer.dtype.names: + if all(buffer['t'][i] > buffer['t'][i+1] for i in range(count-1)): + print(f"{file_handle.name} Timestamps are not monotonic") + buffer.sort(order='t') def parse_header(fhandle): @@ -46,14 +51,8 @@ def parse_header(fhandle): size (height, width) tuple of int or None """ version = np.lib.format.read_magic(fhandle) - shape, fortran, dtype = np.lib.format._read_array_header(fhandle, version) + _, fortran, dtype = np.lib.format._read_array_header(fhandle, version) assert not fortran, "Fortran order arrays not supported" - # Get the number of elements in one 'row' by taking - # a product over all other dimensions. - if len(shape) == 0: - count = 1 - else: - count = np.multiply.reduce(shape, dtype=np.int64) ev_size = dtype.itemsize assert ev_size != 0 start = fhandle.tell() diff --git a/sdk/modules/core/python/pypkg/metavision_core/event_io/raw_info.py b/sdk/modules/core/python/pypkg/metavision_core/event_io/raw_info.py index 272b3c6e6..d204bdaba 100644 --- a/sdk/modules/core/python/pypkg/metavision_core/event_io/raw_info.py +++ b/sdk/modules/core/python/pypkg/metavision_core/event_io/raw_info.py @@ -10,6 +10,7 @@ """ Get Raw Duration: Either search for a json filename called "path_name_info.json" or compute duration itself. """ + import json from os.path import exists, splitext from metavision_core.event_io.raw_reader import RawReader diff --git a/sdk/modules/core/python/pypkg/metavision_core/event_io/raw_reader.py b/sdk/modules/core/python/pypkg/metavision_core/event_io/raw_reader.py index 2f2b7caa9..f7a93fcf4 100644 --- a/sdk/modules/core/python/pypkg/metavision_core/event_io/raw_reader.py +++ b/sdk/modules/core/python/pypkg/metavision_core/event_io/raw_reader.py @@ -104,14 +104,24 @@ def __del__(self): if hasattr(self, "i_events_stream") and self.i_events_stream is not None: self.i_events_stream.stop() self.i_events_stream.stop_log_raw_data() - if hasattr(self, "device"): - del self.device if hasattr(self, "i_events_stream"): del self.i_events_stream if hasattr(self, "i_device_control"): del self.i_device_control if hasattr(self, "i_decoder"): del self.i_decoder + if hasattr(self, "i_event_cd_decoder"): + del self.i_event_cd_decoder + if hasattr(self, "i_eventdecoder_ext_trigger"): + del self.i_eventdecoder_ext_trigger + if hasattr(self, "device"): + del self.device + if hasattr(self, "buffer_producer"): + del self.buffer_producer + if hasattr(self, "_event_buffer"): + del self._event_buffer + if hasattr(self, "_event_ext_trigger_buffer"): + del self._event_ext_trigger_buffer def __enter__(self): return self @@ -378,7 +388,6 @@ class RawReader(RawReaderBase): path (string): Path to the file being read. If `path` is an empty string or a camera serial number it will try to open that camera instead. current_time (int): Indicating the position of the cursor in the file in us. - duration_s (int): Indicating the total duration of the file in seconds. do_time_shifting (bool): If True the origin of time is a few us from the first events. Otherwise it is when the camera was started. diff --git a/sdk/modules/core/python/samples/metavision_adaptive_rate/metavision_adaptive_rate_events_splitter.py b/sdk/modules/core/python/samples/metavision_adaptive_rate/metavision_adaptive_rate_events_splitter.py index 03d9d33a2..1ef59ce8e 100644 --- a/sdk/modules/core/python/samples/metavision_adaptive_rate/metavision_adaptive_rate_events_splitter.py +++ b/sdk/modules/core/python/samples/metavision_adaptive_rate/metavision_adaptive_rate_events_splitter.py @@ -70,7 +70,7 @@ def split_into_frames(filename_raw, thr_var_per_event=5e-4, downsampling_factor= height, width = mv_adaptive_rate_iterator.get_size() - if filename_output_video == None: + if filename_output_video is None: video_process = None else: assert not os.path.exists(filename_output_video) diff --git a/sdk/modules/core/python/samples/metavision_interop/extended_events_iterator.py b/sdk/modules/core/python/samples/metavision_interop/extended_events_iterator.py index 8298d40b6..6ef49978c 100644 --- a/sdk/modules/core/python/samples/metavision_interop/extended_events_iterator.py +++ b/sdk/modules/core/python/samples/metavision_interop/extended_events_iterator.py @@ -53,7 +53,7 @@ class ExtendedEventsIterator(EventsIterator): input_path (str): Path to the file to read. If `path` is an empty string or a camera serial number it will try to open that camera instead. start_ts (int): First timestamp to consider. - mode (string): Load by timeslice of number of events. Either "delta_t", "n_events" or "mixed", + mode (string): Load by timeslice or number of events. Either "delta_t", "n_events" or "mixed", where mixed uses both delta_t and n_events and chooses the first met criterion. delta_t (int): Duration of served event slice in us. n_events (int): Number of events in the timeslice. diff --git a/sdk/modules/core/python/samples/metavision_simple_viewer/metavision_simple_viewer.py b/sdk/modules/core/python/samples/metavision_simple_viewer/metavision_simple_viewer.py index 4278de322..b4d519bd7 100644 --- a/sdk/modules/core/python/samples/metavision_simple_viewer/metavision_simple_viewer.py +++ b/sdk/modules/core/python/samples/metavision_simple_viewer/metavision_simple_viewer.py @@ -11,8 +11,7 @@ Sample code that demonstrates how to use Metavision SDK to visualize events from a live camera or a RAW file """ - -from metavision_core.event_io import EventsIterator, LiveReplayEventsIterator +from metavision_core.event_io import EventsIterator, LiveReplayEventsIterator, is_live_camera from metavision_sdk_core import PeriodicFrameGenerationAlgorithm, ColorPalette from metavision_sdk_ui import EventLoop, BaseWindow, MTWindow, UIAction, UIKeyEvent import argparse @@ -31,15 +30,6 @@ def parse_args(): return args -def is_live_camera(input_path): - """Checks if input_path is a live camera - Args: - input_path (str): path to the file to read. if `path` is an empty string or a camera serial number, - this function will return true. - """ - return isinstance(input_path, str) and not os.path.exists(input_path) - - def main(): """ Main """ args = parse_args() diff --git a/sdk/modules/core/python/tests/events_iterator_pytest.py b/sdk/modules/core/python/tests/events_iterator_pytest.py index 97da9cc3a..fcd7508ba 100644 --- a/sdk/modules/core/python/tests/events_iterator_pytest.py +++ b/sdk/modules/core/python/tests/events_iterator_pytest.py @@ -214,12 +214,10 @@ def pytestcase_iterator_run_twice(tmpdir, dataset_dir): # GIVEN filename = os.path.join(dataset_dir, "openeb", "core", "event_io", "recording.raw") - mv_iterator = EventsIterator(filename, start_ts=1e5, delta_t=20000, - max_duration=1e6) # WHEN - evs = [ev for ev in mv_iterator] - evs2 = [ev for ev in mv_iterator] + evs = [ev for ev in EventsIterator(filename, start_ts=1e5, delta_t=20000, max_duration=1e6)] + evs2 = [ev for ev in EventsIterator(filename, start_ts=1e5, delta_t=20000, max_duration=1e6)] # THEN assert len(evs) == len(evs2) diff --git a/sdk/modules/core_ml/python/pypkg/metavision_core_ml/video_to_event/simu_events_iterator.py b/sdk/modules/core_ml/python/pypkg/metavision_core_ml/video_to_event/simu_events_iterator.py index 9842f1a9d..eb6c7faa7 100644 --- a/sdk/modules/core_ml/python/pypkg/metavision_core_ml/video_to_event/simu_events_iterator.py +++ b/sdk/modules/core_ml/python/pypkg/metavision_core_ml/video_to_event/simu_events_iterator.py @@ -11,6 +11,7 @@ Simple Iterator built around the Metavision Reader classes. """ +import os import numpy as np from metavision_sdk_base import EventCD from metavision_core_ml.video_to_event.simulator import EventSimulator @@ -81,6 +82,7 @@ def __init__(self, input_path, start_ts=0, mode="delta_t", delta_t=10000, n_even self.original_height, self.original_width = int(metadata["video"]["@height"]), int(metadata["video"]["@width"]) self.freq = eval(metadata["video"]["@avg_frame_rate"]) * 1e-6 self.length = float(metadata["video"]['@duration']) * 1e6 + self.nb_frames = int(metadata["video"]["@nb_frames"]) if max_duration is None: self.max_frames = 0 @@ -114,8 +116,18 @@ def _initialize(self): self._process_batch, event_count=self.n_events, time_slice_us=0) self._event_buffer = deque() + ts_path = os.path.splitext(self.path)[0] + '_ts.npy' + if os.path.exists(ts_path): + assert self.override_fps == 0, "Parameter override_fps should not be given if _ts.npy file is provided" + ts_npy = np.load(ts_path) + assert ts_npy.size == self.nb_frames, f"Error: Number of frames ({self.nb_frames}) and number of timestamps ({ts_npy.size}) are inconsistent" + start_frame = np.searchsorted(1e6*ts_npy, self.start_ts, side="left") + elif self.override_fps: + start_frame = int(self.start_ts * self.override_fps) + else: + start_frame = int(self.start_ts * self.freq) + # Initializes Video iterator - start_frame = int(self.start_ts * self.freq) self.reader = TimedVideoStream( self.path, self.height, self.width, start_frame=start_frame, max_frames=self.max_frames, rgb=False, override_fps=self.override_fps) diff --git a/sdk/modules/core_ml/python/samples/demo_event_to_video/demo_event_to_video.py b/sdk/modules/core_ml/python/samples/demo_event_to_video/demo_event_to_video.py index 9dd69bd68..504e204b5 100644 --- a/sdk/modules/core_ml/python/samples/demo_event_to_video/demo_event_to_video.py +++ b/sdk/modules/core_ml/python/samples/demo_event_to_video/demo_event_to_video.py @@ -6,15 +6,16 @@ # Unless required by applicable law or agreed to in writing, software distributed under the License is distributed # on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and limitations under the License. -""" -E2V DEMO Script -Copyright: (c) 2021 Prophesee """ +E2V Demo Script +""" + import numpy as np import argparse import torch import torch.nn.functional as F + from metavision_sdk_base import EventCD from metavision_core_ml.event_to_video.lightning_model import EventToVideoLightningModel from metavision_core_ml.preprocessing.event_to_tensor_torch import event_cd_to_torch, event_volume diff --git a/sdk/modules/core_ml/python/samples/train_event_to_video/train_event_to_video.py b/sdk/modules/core_ml/python/samples/train_event_to_video/train_event_to_video.py index e35a59a58..a0fa353a4 100644 --- a/sdk/modules/core_ml/python/samples/train_event_to_video/train_event_to_video.py +++ b/sdk/modules/core_ml/python/samples/train_event_to_video/train_event_to_video.py @@ -6,11 +6,11 @@ # Unless required by applicable law or agreed to in writing, software distributed under the License is distributed # on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and limitations under the License. + """ E2V Training Script - -Copyright: (c) 2020 Prophesee """ + import torch import pytorch_lightning as pl from pytorch_lightning.callbacks import ModelCheckpoint @@ -126,7 +126,7 @@ def train(params: argparse.Namespace): default_root_dir=params.root_dir, callbacks=[checkpoint_callback, demo_callback], logger=logger, - gpus=1, + gpus=0 if params.cpu else 1, precision=params.precision, accumulate_grad_batches=params.accumulate_grad_batches, progress_bar_refresh_rate=1, diff --git a/sdk/modules/core_ml/python/samples/viz_data_event_to_video/viz_data_event_to_video.py b/sdk/modules/core_ml/python/samples/viz_data_event_to_video/viz_data_event_to_video.py index 27b07424f..ca404abfd 100644 --- a/sdk/modules/core_ml/python/samples/viz_data_event_to_video/viz_data_event_to_video.py +++ b/sdk/modules/core_ml/python/samples/viz_data_event_to_video/viz_data_event_to_video.py @@ -6,9 +6,11 @@ # Unless required by applicable law or agreed to in writing, software distributed under the License is distributed # on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and limitations under the License. + """ Visualize the event-to-video dataloader """ + import sys import time import numpy as np diff --git a/sdk/modules/core_ml/python/samples/viz_video_to_event_gpu_simulator/viz_video_to_event_gpu_simulator.py b/sdk/modules/core_ml/python/samples/viz_video_to_event_gpu_simulator/viz_video_to_event_gpu_simulator.py index dc961ccfe..0839a189a 100644 --- a/sdk/modules/core_ml/python/samples/viz_video_to_event_gpu_simulator/viz_video_to_event_gpu_simulator.py +++ b/sdk/modules/core_ml/python/samples/viz_video_to_event_gpu_simulator/viz_video_to_event_gpu_simulator.py @@ -6,9 +6,11 @@ # Unless required by applicable law or agreed to in writing, software distributed under the License is distributed # on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and limitations under the License. + """ Numba cuda based implementation of event simulator """ + import argparse import numpy as np import torch diff --git a/sdk/modules/core_ml/python/samples/viz_video_to_event_simulator/viz_video_to_event_simulator.py b/sdk/modules/core_ml/python/samples/viz_video_to_event_simulator/viz_video_to_event_simulator.py index 040c7390c..300cc6deb 100644 --- a/sdk/modules/core_ml/python/samples/viz_video_to_event_simulator/viz_video_to_event_simulator.py +++ b/sdk/modules/core_ml/python/samples/viz_video_to_event_simulator/viz_video_to_event_simulator.py @@ -17,6 +17,7 @@ and finally applies some event tensorization. """ + from __future__ import absolute_import import os @@ -28,9 +29,7 @@ from metavision_core_ml.video_to_event.simulator import EventSimulator from metavision_core.event_io.event_bufferizer import FixedCountBuffer from metavision_core.event_io import DatWriter - from metavision_core_ml.preprocessing import viz_events - from metavision_core_ml.data.video_stream import TimedVideoStream from metavision_core_ml.data.image_planar_motion_stream import PlanarMotionStream diff --git a/sdk/modules/core_ml/python/tests/simu_events_iterator_pytest.py b/sdk/modules/core_ml/python/tests/simu_events_iterator_pytest.py index b324f3a14..1206547ea 100644 --- a/sdk/modules/core_ml/python/tests/simu_events_iterator_pytest.py +++ b/sdk/modules/core_ml/python/tests/simu_events_iterator_pytest.py @@ -16,6 +16,7 @@ import numpy as np from metavision_core_ml.video_to_event.simu_events_iterator import SimulatedEventsIterator from metavision_core_ml.data.video_stream import TimedVideoStream +from metavision_core_ml.video_to_event.simulator import EventSimulator def pytestcase_all_events_in_frame(tmpdir): @@ -196,3 +197,65 @@ def pytestcase_can_be_run_twice(tmpdir): last_event2 = events assert (last_event == last_event2).all() simulation.__del__() + + +def pytestcase_check_consistency_simulated_events_iterator(tmpdir, dataset_dir): + """ + Checks that calling SimulatedEventsIterator produces the same events as calling the simulator manually + """ + filename = os.path.join(dataset_dir, "openeb", "core_ml", "GOPR9633", "GOPR9633.mp4") + assert os.path.isfile(filename) + + start_ts = 100000 + width, height = (320, 240) + delta_t = 10000 + assert os.path.isfile(filename) + simu = EventSimulator(height=height, width=width, Cp=0.11, Cn=0.1, + refractory_period=0.001, sigma_threshold=0, + cutoff_hz=0, leak_rate_hz=0, + shot_noise_rate_hz=0) + simu.last_event_timestamp[...] = start_ts + + start_idx = int(start_ts / (1e6 / 240)) # video is 240fps + + video_stream = TimedVideoStream(video_filename=filename, height=height, width=width, + start_frame=start_idx, max_frames=0, rgb=False, override_fps=0) + nb_total_frames = 0 + nb_total_events = 0 + list_all_events = [] + idx_frame = -1 + for img, ts in video_stream: + idx_frame += 1 + if ts > 200000: + break + nb_total_frames += 1 + total = simu.image_callback(img, ts) + events = simu.get_events() + simu.flush_events() + nb_total_events += events.size + print(f"img.shape: {img.shape} idx_frame: {idx_frame} timestamp frame: {ts} nb_events: {events.size} nb_total_events: {nb_total_events}") + if events.size: + print(f"\tevents ts: {events['t'][0]} --> {events['t'][-1]}") + print("") + list_all_events.append(events) + all_events = np.concatenate(list_all_events) + + simu_iterator = SimulatedEventsIterator(filename, delta_t=delta_t, mode="delta_t", + n_events=0, start_ts=start_ts, height=height, width=width) + nb_total_events = 0 + for idx, events in enumerate(simu_iterator): + current_chunk_start_ts = start_ts + idx * delta_t + current_chunk_end_ts = start_ts + (idx + 1) * delta_t + if current_chunk_start_ts >= 200000: + break + nb_total_events += events.size + print(f"current chunk idx: {idx} nb events: {events.size} nb_total_events: {nb_total_events}") + if events.size: + print(f"\tevents ts: {events['t'][0]} --> {events['t'][-1]}") + print("") + assert (events["t"] >= current_chunk_start_ts).all() + assert (events["t"] < current_chunk_end_ts).all() + events_current_chunk = all_events[(all_events["t"] >= current_chunk_start_ts) + * (all_events["t"] < current_chunk_end_ts)] + assert events_current_chunk.size == events.size + assert (events_current_chunk["t"] == events["t"]).all() diff --git a/sdk/modules/driver/cpp/apps/metavision_viewer/metavision_viewer.cpp b/sdk/modules/driver/cpp/apps/metavision_viewer/metavision_viewer.cpp index a61f730e4..c25d7b60b 100644 --- a/sdk/modules/driver/cpp/apps/metavision_viewer/metavision_viewer.cpp +++ b/sdk/modules/driver/cpp/apps/metavision_viewer/metavision_viewer.cpp @@ -12,10 +12,10 @@ // Example of using Metavision SDK Driver API for visualizing events stream. #include -#include #include #include #include +#include #include #if CV_MAJOR_VERSION >= 4 #include @@ -23,24 +23,53 @@ #include #include #include +#include +#include static const int ESCAPE = 27; static const int SPACE = 32; namespace po = boost::program_options; +std::string human_readable_rate(double rate) { + std::ostringstream oss; + if (rate < 1000) { + oss << std::setprecision(0) << std::fixed << rate << " ev/s"; + } else if (rate < 1000 * 1000) { + oss << std::setprecision(1) << std::fixed << (rate / 1000) << " Kev/s"; + } else if (rate < 1000 * 1000 * 1000) { + oss << std::setprecision(1) << std::fixed << (rate / (1000 * 1000)) << " Mev/s"; + } else { + oss << std::setprecision(1) << std::fixed << (rate / (1000 * 1000 * 1000)) << " Gev/s"; + } + return oss.str(); +} + std::string human_readable_time(Metavision::timestamp t) { std::ostringstream oss; - std::array ls{":", ".", ""}; - std::array vs; - vs[2] = cv::format("%03d", int(t % 1000)); - t /= 1000; // ms - vs[1] = cv::format("%03d", int(t % 1000)); - t /= 1000; // s - vs[0] = cv::format("%02d", int(t % 60)); + std::array ls{":", ":", ".", ""}; + std::array vs; + std::array ts; + ts[3] = t % 1000000; + vs[3] = cv::format("%06d", int(ts[3])); + t /= 1000000; // s + ts[2] = t % 60; + vs[2] = cv::format("%02d", int(ts[2])); + t /= 60; // m + ts[1] = t % 60; + vs[1] = cv::format("%02d", int(ts[1])); + t /= 60; // h + ts[0] = t; + vs[0] = cv::format("%02d", int(ts[0])); size_t i = 0; - for (; i < 3; ++i) { + // skip hour and minutes if t is not high enough, but keep s and us + for (; i < 2; ++i) { + if (ts[i] != 0) { + break; + } + } + for (; i < 4; ++i) { oss << vs[i] << ls[i]; } return oss.str(); @@ -70,12 +99,14 @@ bool window_was_closed(const std::string &window_name) { } int setup_cd_callback_and_window(Metavision::Camera &camera, cv::Mat &cd_frame, Metavision::timestamp &cd_frame_ts, - Metavision::CDFrameGenerator &cd_frame_generator, const std::string &window_name) { + Metavision::CDFrameGenerator &cd_frame_generator, + Metavision::RateEstimator &cd_rate_estimator, const std::string &window_name) { auto &geometry = camera.geometry(); - auto id = camera.cd().add_callback( - [&cd_frame_generator](const Metavision::EventCD *ev_begin, const Metavision::EventCD *ev_end) { - cd_frame_generator.add_events(ev_begin, ev_end); - }); + auto id = camera.cd().add_callback([&cd_frame_generator, &cd_rate_estimator](const Metavision::EventCD *ev_begin, + const Metavision::EventCD *ev_end) { + cd_frame_generator.add_events(ev_begin, ev_end); + cd_rate_estimator.add_data(std::prev(ev_end)->t, std::distance(ev_begin, ev_end)); + }); cd_frame_generator.start(30, [&cd_frame, &cd_frame_ts](const Metavision::timestamp &ts, const cv::Mat &frame) { cd_frame_ts = ts; frame.copyTo(cd_frame); @@ -114,6 +145,9 @@ int main(int argc, char *argv[]) { "Press SPACE key while running to record or stop recording raw data\n" "Press 'q' or Escape key to leave the program.\n" "Press 'r' to toggle the hardware ROI given as input.\n" + "Press 'e' to toggle the ERC module (if available).\n" + "Press '+' to increase the ERC threshold (if available).\n" + "Press '-' to decrease the ERC threshold (if available).\n" "Press 'h' to print this help.\n"); po::options_description options_desc("Options"); @@ -227,8 +261,16 @@ int main(int argc, char *argv[]) { Metavision::timestamp cd_frame_ts{0}; Metavision::CDFrameGenerator cd_frame_generator(geometry.width(), geometry.height()); cd_frame_generator.set_display_accumulation_time_us(10000); - int cd_events_cb_id = - setup_cd_callback_and_window(camera, cd_frame, cd_frame_ts, cd_frame_generator, cd_window_name); + + double avg_rate, peak_rate; + Metavision::RateEstimator cd_rate_estimator( + [&avg_rate, &peak_rate](Metavision::timestamp ts, double arate, double prate) { + avg_rate = arate; + peak_rate = prate; + }, + 100000, 1000000, true); + int cd_events_cb_id = setup_cd_callback_and_window(camera, cd_frame, cd_frame_ts, cd_frame_generator, + cd_rate_estimator, cd_window_name); // Start the camera streaming camera.start(); @@ -258,12 +300,17 @@ int main(int argc, char *argv[]) { } if (!cd_frame.empty()) { + std::string text; if (osd) { - const std::string text = human_readable_time(cd_frame_ts) + " / " + - human_readable_time(camera.offline_streaming_control().get_duration()); - cv::putText(cd_frame, text, cv::Point(10, 20), cv::FONT_HERSHEY_PLAIN, 1, cv::Scalar(108, 143, 255), - 1, cv::LINE_AA); + text = human_readable_time(cd_frame_ts) + " / " + + human_readable_time(camera.offline_streaming_control().get_duration()); + } else { + text = human_readable_time(cd_frame_ts); } + text += " "; + text += human_readable_rate(avg_rate); + cv::putText(cd_frame, text, cv::Point(10, 20), cv::FONT_HERSHEY_PLAIN, 1, cv::Scalar(108, 143, 255), 1, + cv::LINE_AA); cv::imshow(cd_window_name, cd_frame); } @@ -277,8 +324,10 @@ int main(int argc, char *argv[]) { break; case SPACE: if (!recording) { + MV_LOG_INFO() << "Started recording RAW in" << out_raw_file_path; camera.start_recording(out_raw_file_path); } else { + MV_LOG_INFO() << "Stopped recording RAW in" << out_raw_file_path; camera.stop_recording(); } recording = !recording; @@ -288,6 +337,7 @@ int main(int argc, char *argv[]) { Metavision::timestamp pos = cd_frame_ts - 1000 * 1000; if (camera.offline_streaming_control().seek(pos)) { cd_frame_generator.reset(); + MV_LOG_INFO() << "Seeking backward to" << (pos / 1.e6) << "s"; } } break; @@ -296,6 +346,7 @@ int main(int argc, char *argv[]) { Metavision::timestamp pos = cd_frame_ts + 1000 * 1000; if (camera.offline_streaming_control().seek(pos)) { cd_frame_generator.reset(); + MV_LOG_INFO() << "Seeking forward to" << (pos / 1.e6) << "s"; } } break; @@ -311,12 +362,35 @@ int main(int argc, char *argv[]) { } if (!is_roi_set) { camera.roi().set({roi[0], roi[1], roi[2], roi[3]}); + MV_LOG_INFO() << "ROI: enabled"; } else { camera.roi().unset(); + MV_LOG_INFO() << "ROI: disabled"; } is_roi_set = !is_roi_set; break; } + case 'e': { + try { + camera.erc_module().enable(!camera.erc_module().is_enabled()); + MV_LOG_INFO() << "ERC:" << (camera.erc_module().is_enabled() ? "enabled" : "disabled"); + } catch (Metavision::CameraException &e) {} + break; + } + case '+': { + try { + camera.erc_module().set_cd_event_rate(camera.erc_module().get_cd_event_rate() + 10000000); + MV_LOG_INFO() << "ERC:" << (camera.erc_module().get_cd_event_rate() / 1000000) << "Mev/s"; + } catch (Metavision::CameraException &e) {} + break; + } + case '-': { + try { + camera.erc_module().set_cd_event_rate(camera.erc_module().get_cd_event_rate() - 10000000); + MV_LOG_INFO() << "ERC:" << (camera.erc_module().get_cd_event_rate() / 1000000) << "Mev/s"; + } catch (Metavision::CameraException &e) {} + break; + } case 'h': MV_LOG_INFO() << long_program_desc; break; diff --git a/sdk/modules/driver/cpp/include/metavision/sdk/driver/camera.h b/sdk/modules/driver/cpp/include/metavision/sdk/driver/camera.h index 0ca92865b..c9d336816 100644 --- a/sdk/modules/driver/cpp/include/metavision/sdk/driver/camera.h +++ b/sdk/modules/driver/cpp/include/metavision/sdk/driver/camera.h @@ -128,6 +128,7 @@ class Camera { /// @brief Copy constructor /// /// A Camera object can not be copy-constructed, but it can be move-constructed. + /// /// @sa @ref Camera(Camera &&camera); Camera(Camera &camera) = delete; @@ -139,6 +140,7 @@ class Camera { /// @brief Copy assignment /// /// A Camera object can not be copy-assigned, but it can be move-assigned. + /// /// @sa @ref Camera & operator=(Camera &&camera); Camera &operator=(Camera &camera) = delete; @@ -157,6 +159,7 @@ class Camera { /// please specify the @ref OnlineSourceType and use the @ref Camera::from_source function, /// or else specify the serial number and use the @ref Camera::from_serial function.\n /// Serial numbers and types of available sources can be found with @ref Camera::list_online_sources function. + /// /// @throw CameraException in case of initialization failure. static Camera from_first_available(); @@ -167,6 +170,7 @@ class Camera { /// Serial numbers and types of available sources can be found with @ref Camera::list_online_sources function. /// @throw CameraException if the camera corresponding to the input source type and the source index has not been /// found. + /// /// @param input_source_type @ref OnlineSourceType /// @param source_index Index of the source in the list of available online sources /// @return @ref Camera instance initialized from the source @@ -176,6 +180,7 @@ class Camera { /// /// Serial numbers of available sources can be found by with @ref Camera::list_online_sources function.\n /// If 'serial' is an empty string, the function works as the main constructor. + /// /// @throw CameraException if the camera with the input serial number has not been found. /// @param serial Serial number of the camera /// @return @ref Camera instance initialized from the serial number @@ -255,6 +260,7 @@ class Camera { /// /// When a camera runtime error occurs, the camera thread is left and events are no longer sent. /// You are notified by this callback whenever this happens. + /// /// @throw CameraException if the camera has not been initialized. /// @param error_callback The error callback to call /// @return ID of the added callback @@ -307,6 +313,7 @@ class Camera { /// /// It will start polling events from the source and calling specified events callbacks.\n /// It has no effect if the start function has been already called and not the @ref stop function. + /// /// @throw CameraException if the camera has not been initialized. /// @sa @ref CD::add_callback /// @sa @ref ExtTrigger::add_callback @@ -318,12 +325,14 @@ class Camera { /// /// If the source is online, it always returns true unless the @ref stop function has been called.\n /// If the input is offline (from a file), it returns false whenever no data are remaining in the input file. + /// /// @return true if the camera is running or there are data remaining from an offline source, false otherwise. bool is_running(); /// @brief Stops polling events from the camera or from the file /// /// Stops ongoing streaming. + /// /// @throw CameraException if the camera has not been initialized. /// @return true if the camera instance has been stopped successfully, false otherwise. If the camera was not /// running, this function returns false. @@ -347,6 +356,7 @@ class Camera { /// biases, ...) /// /// Read-only structure. + /// /// @sa @ref CameraConfiguration const CameraConfiguration &get_camera_configuration(); @@ -356,6 +366,11 @@ class Camera { timestamp get_last_timestamp() const; /// @brief Gets corresponding @ref Device in HAL library + /// + /// This Device retrieved can then be used to call the different facilities of the camera. + /// for example: camera.get_device()->get_facility()->enable(channel_id) + /// or: camera.get_device()->get_facility()->get_temperature()) + /// /// @return The @ref Device used internally by the class Camera Device &get_device(); diff --git a/sdk/modules/driver/cpp/include/metavision/sdk/driver/cd.h b/sdk/modules/driver/cpp/include/metavision/sdk/driver/cd.h index 737e929f0..1d0eeb5d9 100644 --- a/sdk/modules/driver/cpp/include/metavision/sdk/driver/cd.h +++ b/sdk/modules/driver/cpp/include/metavision/sdk/driver/cd.h @@ -39,6 +39,7 @@ class CD { /// @brief Subscribes to CD events /// /// Registers a callback that will be called each time a buffer of eventCD has been decoded. + /// /// @param cb Callback to call each time a buffer of eventCD has been decoded /// @sa @ref EventsCDCallback /// @return ID of the added callback diff --git a/sdk/modules/driver/cpp/include/metavision/sdk/driver/ext_trigger.h b/sdk/modules/driver/cpp/include/metavision/sdk/driver/ext_trigger.h index e8a645d70..0e06a66da 100644 --- a/sdk/modules/driver/cpp/include/metavision/sdk/driver/ext_trigger.h +++ b/sdk/modules/driver/cpp/include/metavision/sdk/driver/ext_trigger.h @@ -39,6 +39,7 @@ class ExtTrigger { /// @brief Subscribes to external trigger events /// /// Registers a callback that will be called each time a buffer of external trigger event has been decoded. + /// /// @param cb Callback to call each time a buffer of ext trigger event has been decoded /// @sa @ref EventsExtTriggerCallback /// @return ID of the added callback diff --git a/sdk/modules/driver/cpp/include/metavision/sdk/driver/raw_data.h b/sdk/modules/driver/cpp/include/metavision/sdk/driver/raw_data.h index 83227edb6..de0b21779 100644 --- a/sdk/modules/driver/cpp/include/metavision/sdk/driver/raw_data.h +++ b/sdk/modules/driver/cpp/include/metavision/sdk/driver/raw_data.h @@ -38,6 +38,7 @@ class RawData { /// @brief Subscribes to RAW data callback /// /// Registers a callback that will be called each time a buffer of RAW data has been received. + /// /// @param cb Callback to call each time a buffer of RAW data has been received /// @sa @ref RawDataCallback /// @return ID of the added callback diff --git a/sdk/modules/driver/cpp/src/camera.cpp b/sdk/modules/driver/cpp/src/camera.cpp index f561e76e0..983c8b688 100644 --- a/sdk/modules/driver/cpp/src/camera.cpp +++ b/sdk/modules/driver/cpp/src/camera.cpp @@ -747,6 +747,12 @@ template int Camera::Private::run_from_camera(TimingProfilerType *profiler) { check_ccam_instance(); + if (i_future_decoder_) { + // it could be the first time we start streaming and feeding events to the decoder, but + // if it's not the case, we need to reset the decoder state so that new events are not + // decoded using the current state (which is probably wrong : i.e wrong time base, etc.) + i_future_decoder_->reset_timestamp(-1); + } if (i_future_events_stream_) { // should never happen for the moment ... } else { diff --git a/sdk/modules/driver/cpp/src/offline_streaming_control.cpp b/sdk/modules/driver/cpp/src/offline_streaming_control.cpp index 61ec80d22..c5637b993 100644 --- a/sdk/modules/driver/cpp/src/offline_streaming_control.cpp +++ b/sdk/modules/driver/cpp/src/offline_streaming_control.cpp @@ -104,6 +104,16 @@ timestamp OfflineStreamingControl::Private::get_duration() const { return duration_; } Camera cam = Camera::from_file(i_events_stream_->get_underlying_filename(), false, Future::RawFileConfig()); + try { + auto *i_future_decoder = cam.get_device().get_facility(); + auto *i_decoder = cam.get_device().get_facility(); + if (i_future_decoder) { + i_future_decoder->add_protocol_violation_callback([](auto) {}); + } + if (i_decoder) { + i_decoder->add_protocol_violation_callback([](auto) {}); + } + } catch (HalException &e) {} cam.cd().add_callback( [this](const EventCD *begin, const EventCD *end) { duration_ = std::max(duration_, std::prev(end)->t); }); cam.offline_streaming_control().seek(get_seek_end_time()); diff --git a/sdk/modules/ui/cpp/include/metavision/sdk/ui/utils/base_window.h b/sdk/modules/ui/cpp/include/metavision/sdk/ui/utils/base_window.h index 9b05f73ed..04d8b2a30 100644 --- a/sdk/modules/ui/cpp/include/metavision/sdk/ui/utils/base_window.h +++ b/sdk/modules/ui/cpp/include/metavision/sdk/ui/utils/base_window.h @@ -26,6 +26,7 @@ namespace Metavision { /// /// This class cannot directly be used as is, instead, one needs to instantiate one of its derived class (i.e. @ref /// Window or @ref MTWindow). +/// /// @note Each window has its own events queue that needs to be regularly processed, either explicitly by calling /// @ref BaseWindow::poll_events or implicitly by calling @ref Window::show or @ref MTWindow::show_async with /// @p auto_poll = true (default behavior). Events are polled from the system and push to the windows' internal queue by diff --git a/sdk/modules/ui/cpp/include/metavision/sdk/ui/utils/mt_window.h b/sdk/modules/ui/cpp/include/metavision/sdk/ui/utils/mt_window.h index 24fa0177e..94dc05ec4 100644 --- a/sdk/modules/ui/cpp/include/metavision/sdk/ui/utils/mt_window.h +++ b/sdk/modules/ui/cpp/include/metavision/sdk/ui/utils/mt_window.h @@ -22,6 +22,7 @@ namespace Metavision { /// @brief Window using its own rendering thread to render images /// /// Images are displayed at a fixed frequency (i.e. the screen's refresh one) by the internal rendering thread. +/// /// @warning The constructor and destructor of this class must only be called from the main thread class MTWindow : public BaseWindow { public: @@ -44,6 +45,7 @@ class MTWindow : public BaseWindow { /// Here asynchronously means that the image is not immediately displayed, but will be done later on by the internal /// rendering thread. /// This window uses a front/back buffers mechanism to avoid copying images. + /// /// @param image The image to display. The image is passed as a non constant reference in order to be swapped with /// the front buffer and thus avoid useless copies. /// @param auto_poll If True, events in this window's queue are dequeued and processed. If false, diff --git a/sdk/modules/ui/cpp/include/metavision/sdk/ui/utils/window.h b/sdk/modules/ui/cpp/include/metavision/sdk/ui/utils/window.h index 06a579915..d8e0d7261 100644 --- a/sdk/modules/ui/cpp/include/metavision/sdk/ui/utils/window.h +++ b/sdk/modules/ui/cpp/include/metavision/sdk/ui/utils/window.h @@ -22,6 +22,7 @@ namespace Metavision { /// /// This window has no internal rendering thread, meaning that the images are displayed at the same frequency as the one /// of the @ref Window::show method. +/// /// @warning The constructor and destructor of this class must only be called from the main thread class Window : public BaseWindow { public: diff --git a/standalone_samples/metavision_evt2_raw_file_encoder/metavision_evt2_raw_file_encoder.cpp b/standalone_samples/metavision_evt2_raw_file_encoder/metavision_evt2_raw_file_encoder.cpp index a0b76f235..1132d9edf 100644 --- a/standalone_samples/metavision_evt2_raw_file_encoder/metavision_evt2_raw_file_encoder.cpp +++ b/standalone_samples/metavision_evt2_raw_file_encoder/metavision_evt2_raw_file_encoder.cpp @@ -37,14 +37,14 @@ struct RawEvent { struct RawEventTime { unsigned int timestamp : 28; // Most significant bits of the event timestamp (bits 33..6) - unsigned int type : 4; // Event type : EventTypes::EVT_TIME_HIGH + unsigned int type : 4; // Event type: EventTypes::EVT_TIME_HIGH }; struct RawEventCD { unsigned int y : 11; // Pixel Y coordinate unsigned int x : 11; // Pixel X coordinate unsigned int timestamp : 6; // Least significant bits of the event timestamp (bits 5..0) - unsigned int type : 4; // Event type : EventTypes::CD_LOW or EventTypes::CD_HIGH + unsigned int type : 4; // Event type: EventTypes::CD_LOW or EventTypes::CD_HIGH }; struct RawEventExtTrigger { @@ -55,7 +55,7 @@ struct RawEventExtTrigger { unsigned int id : 5; // Trigger channel ID. unsigned int unused1 : 9; unsigned int timestamp : 6; // Least significant bits of the event timestamp (bits 5..0) - unsigned int type : 4; // Event type : EventTypes::EXT_TRIGGER + unsigned int type : 4; // Event type: EventTypes::EXT_TRIGGER }; using Timestamp = uint64_t; // Type for timestamp, in microseconds @@ -189,29 +189,29 @@ struct EventTimeEncoder { int main(int argc, char *argv[]) { // Check input arguments validity if (argc < 3) { - std::cerr << "Error : need output filename and input filename for CD events" << std::endl; + std::cerr << "Error: need output filename and input filename for CD events" << std::endl; std::cerr << std::endl - << "Usage : " << std::string(argv[0]) << " OUTPUT_FILENAME CD_INPUTFILE (TRIGGER_INPUTFILE)" + << "Usage: " << std::string(argv[0]) << " OUTPUT_FILENAME CD_INPUTFILE (TRIGGER_INPUTFILE)" << std::endl; std::cerr << "Triggers will be encoded only if given trigger file has been given as input" << std::endl; - std::cerr << std::endl << "Example : " << std::string(argv[0]) << " output_file.raw cd_input.csv" << std::endl; + std::cerr << std::endl << "Example: " << std::string(argv[0]) << " output_file.raw cd_input.csv" << std::endl; std::cerr << std::endl; - std::cerr << "The CD CSV file needs to have the format : x,y,polarity,timestamp" << std::endl; - std::cerr << "The Trigger input CSV file needs to have the format : value,id,timestamp" << std::endl; + std::cerr << "The CD CSV file needs to have the format: x,y,polarity,timestamp" << std::endl; + std::cerr << "The Trigger input CSV file needs to have the format: value,id,timestamp" << std::endl; return 1; } // Open input files std::ifstream input_cd_file(argv[2]); if (!input_cd_file.is_open()) { - std::cerr << "Error : could not open file '" << argv[2] << "' for reading" << std::endl; + std::cerr << "Error: could not open file '" << argv[2] << "' for reading" << std::endl; return 1; } std::ifstream input_trigger_file; if (argc > 3) { input_trigger_file.open(argv[3]); if (!input_trigger_file.is_open()) { - std::cerr << "Error : could not open file '" << argv[3] << "' for reading" << std::endl; + std::cerr << "Error: could not open file '" << argv[3] << "' for reading" << std::endl; return 1; } } @@ -219,17 +219,17 @@ int main(int argc, char *argv[]) { // Open raw output file std::ofstream output_raw_file(argv[1], std::ios::binary); if (!output_raw_file.is_open()) { - std::cerr << "Error : could not open file '" << argv[1] << "' for writing" << std::endl; + std::cerr << "Error: could not open file '" << argv[1] << "' for writing" << std::endl; return 1; } - // Write header : we write the header corresponding to Prophesee Gen4 device (largest geometry) + // Write header: we write the header corresponding to Prophesee EVK3 Gen41 device (largest geometry) output_raw_file << "% Date 2020-09-04 13:14:05" << std::endl; output_raw_file << "% evt 2.0" << std::endl; output_raw_file << "% firmware_version 3.3.0" << std::endl; output_raw_file << "% integrator_name Prophesee" << std::endl; - output_raw_file << "% plugin_name hal_plugin_gen4_fx3" << std::endl; - output_raw_file << "% system_ID 26" << std::endl; + output_raw_file << "% plugin_name hal_plugin_gen41_evk3" << std::endl; + output_raw_file << "% system_ID 48" << std::endl; // Initialize encoders Metavision::Evt2::EventCDEncoder CD_events_encoder; @@ -237,7 +237,7 @@ int main(int argc, char *argv[]) { bool cd_done = !CD_events_encoder.read_next_line(input_cd_file); bool trigger_done = input_trigger_file ? !trigger_events_encoder.read_next_line(input_trigger_file) : true; if (cd_done && trigger_done) { - std::cerr << "Error : no events in input file(s)" << std::endl; + std::cerr << "Error: no events in input file(s)" << std::endl; return 1; }