From b6c7e924d619a0852152fb92a00c00a8234f6c38 Mon Sep 17 00:00:00 2001 From: Timothee Chabat Date: Tue, 13 Dec 2022 11:23:17 +0100 Subject: [PATCH 1/5] New plugin : Digital Signal Processing plugin Provides basic signal processing filters as well as an audio player dock --- CMakeLists.txt | 1 + Plugins/DSP/CMakeLists.txt | 57 ++ Plugins/DSP/Filters/CMakeLists.txt | 20 + Plugins/DSP/Filters/DSPFilters.xml | 635 +++++++++++++++++ Plugins/DSP/Filters/vtk.module | 12 + Plugins/DSP/Filters/vtkAccousticUtilities.h | 30 + .../Filters/vtkMeanPowerSpectralDensity.cxx | 177 +++++ .../DSP/Filters/vtkMeanPowerSpectralDensity.h | 70 ++ .../DSP/Filters/vtkMergeReduceTableBlocks.cxx | 249 +++++++ .../DSP/Filters/vtkMergeReduceTableBlocks.h | 73 ++ .../Filters/vtkProjectSpectrumMagnitude.cxx | 254 +++++++ .../DSP/Filters/vtkProjectSpectrumMagnitude.h | 108 +++ .../Filters/vtkSoundQuantitiesCalculator.cxx | 289 ++++++++ .../Filters/vtkSoundQuantitiesCalculator.h | 153 ++++ Plugins/DSP/Filters/vtkSpectrogramFilter.cxx | 196 ++++++ Plugins/DSP/Filters/vtkSpectrogramFilter.h | 101 +++ Plugins/DSP/README.md | 80 +++ Plugins/DSP/Testing/AudioPlayer.xml | 52 ++ Plugins/DSP/Testing/CMakeLists.txt | 43 ++ .../MeanPowerSpectralDensity.png.sha512 | 1 + .../MergeReduceTableBlocks.png.sha512 | 1 + .../ProjectSpectrumMagnitude.png.sha512 | 1 + .../Data/Baseline/SoundQuantities.png.sha512 | 1 + .../Data/Baseline/Spectrogram.png.sha512 | 1 + .../DSP/Testing/MeanPowerSpectralDensity.xml | 41 ++ .../DSP/Testing/MergeReduceTableBlocks.xml | 50 ++ .../DSP/Testing/ProjectSpectrumMagnitude.xml | 59 ++ Plugins/DSP/Testing/SoundQuantities.xml | 44 ++ Plugins/DSP/Testing/Spectrogram.xml | 18 + Plugins/DSP/paraview.plugin | 11 + Plugins/DSP/pqAudioPlayer.cxx | 659 ++++++++++++++++++ Plugins/DSP/pqAudioPlayer.h | 81 +++ Plugins/DSP/pqAudioPlayer.ui | 195 ++++++ 33 files changed, 3763 insertions(+) create mode 100644 Plugins/DSP/CMakeLists.txt create mode 100644 Plugins/DSP/Filters/CMakeLists.txt create mode 100644 Plugins/DSP/Filters/DSPFilters.xml create mode 100644 Plugins/DSP/Filters/vtk.module create mode 100644 Plugins/DSP/Filters/vtkAccousticUtilities.h create mode 100644 Plugins/DSP/Filters/vtkMeanPowerSpectralDensity.cxx create mode 100644 Plugins/DSP/Filters/vtkMeanPowerSpectralDensity.h create mode 100644 Plugins/DSP/Filters/vtkMergeReduceTableBlocks.cxx create mode 100644 Plugins/DSP/Filters/vtkMergeReduceTableBlocks.h create mode 100644 Plugins/DSP/Filters/vtkProjectSpectrumMagnitude.cxx create mode 100644 Plugins/DSP/Filters/vtkProjectSpectrumMagnitude.h create mode 100644 Plugins/DSP/Filters/vtkSoundQuantitiesCalculator.cxx create mode 100644 Plugins/DSP/Filters/vtkSoundQuantitiesCalculator.h create mode 100644 Plugins/DSP/Filters/vtkSpectrogramFilter.cxx create mode 100644 Plugins/DSP/Filters/vtkSpectrogramFilter.h create mode 100644 Plugins/DSP/README.md create mode 100644 Plugins/DSP/Testing/AudioPlayer.xml create mode 100644 Plugins/DSP/Testing/CMakeLists.txt create mode 100644 Plugins/DSP/Testing/Data/Baseline/MeanPowerSpectralDensity.png.sha512 create mode 100644 Plugins/DSP/Testing/Data/Baseline/MergeReduceTableBlocks.png.sha512 create mode 100644 Plugins/DSP/Testing/Data/Baseline/ProjectSpectrumMagnitude.png.sha512 create mode 100644 Plugins/DSP/Testing/Data/Baseline/SoundQuantities.png.sha512 create mode 100644 Plugins/DSP/Testing/Data/Baseline/Spectrogram.png.sha512 create mode 100644 Plugins/DSP/Testing/MeanPowerSpectralDensity.xml create mode 100644 Plugins/DSP/Testing/MergeReduceTableBlocks.xml create mode 100644 Plugins/DSP/Testing/ProjectSpectrumMagnitude.xml create mode 100644 Plugins/DSP/Testing/SoundQuantities.xml create mode 100644 Plugins/DSP/Testing/Spectrogram.xml create mode 100644 Plugins/DSP/paraview.plugin create mode 100644 Plugins/DSP/pqAudioPlayer.cxx create mode 100644 Plugins/DSP/pqAudioPlayer.h create mode 100644 Plugins/DSP/pqAudioPlayer.ui diff --git a/CMakeLists.txt b/CMakeLists.txt index f3a31d1bc90..3b3c506649e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -292,6 +292,7 @@ set(paraview_default_plugins CFSReader Datamine DigitalRockPhysics + DigitalSignalProcessing EULATestPlugin EmbossingRepresentations EyeDomeLighting diff --git a/Plugins/DSP/CMakeLists.txt b/Plugins/DSP/CMakeLists.txt new file mode 100644 index 00000000000..3c69e3b97e9 --- /dev/null +++ b/Plugins/DSP/CMakeLists.txt @@ -0,0 +1,57 @@ +set(sources) +set(interfaces) +set(uifiles) + +option(PARAVIEW_PLUGIN_dsp_enable_audio_player "Enable building the Audio Player Dock. Requires Qt Multimedia." OFF) +mark_as_advanced(PARAVIEW_PLUGIN_dsp_enable_audio_player) + +if (PARAVIEW_USE_QT AND PARAVIEW_PLUGIN_dsp_enable_audio_player) + find_package(Qt5 REQUIRED Widgets OPTIONAL_COMPONENTS Multimedia) + + if (NOT TARGET Qt5::Multimedia) + message(FATAL_ERROR + "Component 'Qt5::Multimedia' required for the DSP plugin not found. Use " + "PARAVIEW_PLUGIN_dsp_enable_audio_player to disable the audio player if necessary, or install 'Qt5::Multimedia'") + endif() + + list(APPEND sources + pqAudioPlayer.cxx + pqAudioPlayer.h) + + paraview_plugin_add_dock_window( + CLASS_NAME pqAudioPlayer + DOCK_AREA Right + INTERFACES dock_interfaces + SOURCES dock_sources) + + list(APPEND interfaces + ${dock_interfaces}) + list(APPEND sources + ${dock_sources}) + list(APPEND uifiles pqAudioPlayer.ui) +endif() + +paraview_add_plugin(DigitalSignalProcessing + VERSION "1.0" + UI_FILES ${uifiles} + UI_INTERFACES ${interfaces} + SOURCES ${sources} + REQUIRED_ON_CLIENT + REQUIRED_ON_SERVER + MODULES + DigitalSignalProcessing::DSPFiltersPlugin + MODULE_FILES + "${CMAKE_CURRENT_SOURCE_DIR}/Filters/vtk.module") + +if (PARAVIEW_USE_QT AND PARAVIEW_PLUGIN_dsp_enable_audio_player) + target_link_libraries(DigitalSignalProcessing + PRIVATE + Qt5::Widgets + Qt5::Multimedia) + + target_compile_definitions(DigitalSignalProcessing PRIVATE QT_NO_KEYWORDS) +endif() + +if (BUILD_TESTING AND BUILD_SHARED_LIBS) + add_subdirectory(Testing) +endif() diff --git a/Plugins/DSP/Filters/CMakeLists.txt b/Plugins/DSP/Filters/CMakeLists.txt new file mode 100644 index 00000000000..3b6cbee1e60 --- /dev/null +++ b/Plugins/DSP/Filters/CMakeLists.txt @@ -0,0 +1,20 @@ +set(MODULE_CLASSES + vtkMeanPowerSpectralDensity + vtkMergeReduceTableBlocks + vtkProjectSpectrumMagnitude + vtkSoundQuantitiesCalculator + vtkSpectrogramFilter +) + +set(MODULE_HEADERS + vtkAccousticUtilities.h +) + +vtk_module_add_module(DigitalSignalProcessing::DSPFiltersPlugin + FORCE_STATIC # build static library, to avoid confusion when loading + CLASSES ${MODULE_CLASSES} + HEADERS ${MODULE_HEADERS} +) + +paraview_add_server_manager_xmls( + XMLS DSPFilters.xml) diff --git a/Plugins/DSP/Filters/DSPFilters.xml b/Plugins/DSP/Filters/DSPFilters.xml new file mode 100644 index 00000000000..6e8731e40ca --- /dev/null +++ b/Plugins/DSP/Filters/DSPFilters.xml @@ -0,0 +1,635 @@ + + + + + + This filter computes the mean power spectral density (PSD) of temporal signals. + The input should be a multiblock dataset of vtkTables where each block + represents a point. Each row of the tables corresponds to a timestep. + + + + + + + + + + + + + + + + + + + + + Name of the FFT array from which to compute the mean PSD. + + + + + + + + + + + Name of the frequency array to copy. + + + + + + + + + + + + This filter performs reduction operations such as the mean or the sum over columns + across all blocks of a multiblock of vtkTables. + + + + + + + + + + + + + This property specifies the input of the filter. + + + + + + + + + + + Select the row data arrays to reduce. + + + + + + + + + + + + + + Select the row data arrays to copy from input to output. + Arrays are copied from the first block. + + + + + + + + + + + + + + + + Select the operations to apply for reduction. + + + + + + + Compute the pressure RMS value (Pa and dB) as well as the acoustic power from a sound pressure (Pa) array. + Could be improved by adding more conversions. + + This filter has 2 inputs: + - port 0 is the input geometry for cell connectivity. + - port 1 is a multi-block dataset representing the data through time. Block flat index + corresponds to the index of the point in the input mesh. This kind of dataset + can be obtained e.g. by first applying the filter Plot Data Over Time with the + option "Only Report Selection Statistics" turned off. + + The output is the input geometry with the computed sound quantities attached to + it i.e. the mean pressure, the RMS pressure and the acoustic power. + + + + + + + + + + + + + + + + + + + + + + + Multiblock dataset containing the temporal data. Each block corresponds to one point. + + + + + + + + + + + Specify the input array containing the pressure level (in Pa). + + + + + + Density of the medium the sound is traveling through. + + + + + + Velocity of the sound in the medium it is traveling through. + + + + + + + If enabled, compute the mean pressure through time over the surface. + + + + + + + + + + If enabled, compute the root mean squared pressure value through time over the surface. + + + + + + + + + + + If enabled, compute the sound power over time and over the whole surface. + This is a single value that will be stored in the field data. + + + + + + + + This filter computes the spectrogram of the input vtkTable column. + The output is a vtkImageData where the X and Y axes correspond to time and + frequency, respectively. + The spectrogram is computed by applying a FFT on temporal windows each containing + a subset of the input samples. The window size and type can be controlled with the + time resolution and window type properties, respectively. + + + + + + + + + + + + + + + + + + + + + + Name of the column array from which to compute a spectrogram. + + + + + + + + + + + + + Type of windowing function. + + + + + + + Number of samples per temporal window. + + + + + + + Percentage of samples overlap between consecutive windows. + + + + + + + Sampling rate of the signal in Hz. Only used if no column called + "Time" (case insensitive) is available in the input. + + + + + + + + This filter computes the magnitudes of complex data values from a multi block + of tables (input) and places them on the points of a given mesh (source) for + a specified frequency range. + + + + + + + + + + + + + + Multiblock dataset containing the temporal data. Each block corresponds to one point. + + + + + + + + + + + + + Mesh on which to display point values. + + + + + + + + + + + Select the column data arrays to project on the mesh. + + + + + + + + + + + + + + Name of the frequency array. + + + + + + + + + + + + Lower bound of the frequency range. + + + + + + + + + + + + Upper bound of the frequency range. + + + + + + + + This filter computes the magnitudes of complex data values from a multi block + of tables (input) per frequency band. The user can specify their band manually. Bands + are created using either temporal informations or the frequency related ones. + By default it processes temporal signals but deactivating the "Apply FFT" option + allows to process directly the result of a given FFT. + + + + + + + + + + + + + + + + + + + + Specify if the filter should use octave, third or custom octave band. + + + + + + + + + + Set the number of octave subdivision when + BandFilteringMode is "Custom" . Only odd numbers are valid. + When using even numbers, the number just below will be used. + 1 is equivalent to using the "Octave" mode, and 3 the "Third-octave" + mode. + + + + + + Specify the frequency sample rate in Hz. + If ApplyFFT is true: this will be used if the filter cannot find a time column + If ApplyFFT is false: this will be used if the filter cannot find a frequency column. + + + + + + + + + + + + + + + + + Type of windowing function when applying the fft when the input is temporal. + + + + + + Used only when ApplyFFT is true, meaning that input is temporal. + Set the windowing function to use before applying the FFT. + + + + + + + + + + + + + + + + + + + diff --git a/Plugins/DSP/Filters/vtk.module b/Plugins/DSP/Filters/vtk.module new file mode 100644 index 00000000000..028093edf4c --- /dev/null +++ b/Plugins/DSP/Filters/vtk.module @@ -0,0 +1,12 @@ +NAME + DigitalSignalProcessing::DSPFiltersPlugin +LIBRARY_NAME + vtkDSPFiltersPlugin +DEPENDS + VTK::CommonCore + VTK::CommonDataModel + VTK::CommonExecutionModel + VTK::FiltersGeneral +PRIVATE_DEPENDS + VTK::FiltersCore + VTK::FiltersExtraction diff --git a/Plugins/DSP/Filters/vtkAccousticUtilities.h b/Plugins/DSP/Filters/vtkAccousticUtilities.h new file mode 100644 index 00000000000..992e1923f9e --- /dev/null +++ b/Plugins/DSP/Filters/vtkAccousticUtilities.h @@ -0,0 +1,30 @@ +/*========================================================================= + + Plugin: DigitalSignalProcessing + Module: vtkAccousticUtilities.h + + Copyright (c) Kitware, Inc. + All rights reserved. + See Copyright.txt or http://www.paraview.org/HTML/Copyright.html for details. + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notice for more information. + +=========================================================================*/ +/** + * @class vtkAccousticUtilities + * @brief Defines acoustics constants + */ + +#ifndef vtkAccousticUtilities_h +#define vtkAccousticUtilities_h + +namespace vtkAccousticUtilities +{ +// Reference sound pressure (in Pa) and power (in W) (lowest audible sound for human ears) +static constexpr double REF_PRESSURE = 2.0e-5; +static constexpr double REF_POWER = 1.0e-12; +} + +#endif diff --git a/Plugins/DSP/Filters/vtkMeanPowerSpectralDensity.cxx b/Plugins/DSP/Filters/vtkMeanPowerSpectralDensity.cxx new file mode 100644 index 00000000000..6e86fc9c581 --- /dev/null +++ b/Plugins/DSP/Filters/vtkMeanPowerSpectralDensity.cxx @@ -0,0 +1,177 @@ +/*========================================================================= + + Plugin: DigitalSignalProcessing + Module: vtkMeanPowerSpectralDensity.cxx + + Copyright (c) Kitware, Inc. + All rights reserved. + See Copyright.txt or http://www.paraview.org/HTML/Copyright.html for details. + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notice for more information. + +=========================================================================*/ + +#include "vtkMeanPowerSpectralDensity.h" + +#include "vtkAccousticUtilities.h" +#include "vtkCompositeDataIterator.h" +#include "vtkDataArrayRange.h" +#include "vtkDoubleArray.h" +#include "vtkInformation.h" +#include "vtkInformationVector.h" +#include "vtkMultiBlockDataSet.h" +#include "vtkObjectFactory.h" +#include "vtkSMPTools.h" +#include "vtkSmartPointer.h" +#include "vtkStreamingDemandDrivenPipeline.h" +#include "vtkTable.h" + +//----------------------------------------------------------------------------- +vtkStandardNewMacro(vtkMeanPowerSpectralDensity); + +//------------------------------------------------------------------------------ +int vtkMeanPowerSpectralDensity::FillInputPortInformation( + int vtkNotUsed(port), vtkInformation* info) +{ + info->Set(vtkDataObject::DATA_TYPE_NAME(), "vtkMultiBlockDataSet"); + return 1; +} + +//------------------------------------------------------------------------------ +int vtkMeanPowerSpectralDensity::RequestData(vtkInformation* vtkNotUsed(request), + vtkInformationVector** inputVector, vtkInformationVector* outputVector) +{ + vtkMultiBlockDataSet* input = vtkMultiBlockDataSet::GetData(inputVector[0]); + if (!input) + { + vtkErrorMacro("Missing valid input"); + return 0; + } + if (this->FFTArrayName.empty()) + { + vtkErrorMacro("Please specify an FFT array name."); + return 0; + } + + // Search for the FFT array + vtkSmartPointer iter; + iter.TakeReference(input->NewIterator()); + iter->SkipEmptyNodesOn(); + iter->GoToFirstItem(); + vtkTable* node = vtkTable::SafeDownCast(iter->GetCurrentDataObject()); + vtkDataArray* fftArray = + vtkDataArray::SafeDownCast(node->GetColumnByName(this->FFTArrayName.c_str())); + + if (!fftArray) + { + vtkErrorMacro("Could not find FFT array named " << this->FFTArrayName << "."); + return 0; + } + + // Set number of values to (size - 1) because the first value is ignored + // (DC frequency, not relevant for computing the PSD) + vtkNew res; + res->SetNumberOfValues(fftArray->GetNumberOfTuples() - 1); + auto resValueRange = vtk::DataArrayValueRange(res); + vtkSMPTools::Fill(resValueRange.begin(), resValueRange.end(), 0.0); + + int N = 0; + bool isComplex = false; + + if (fftArray->GetNumberOfComponents() == 2) + { + isComplex = true; + } + else if (fftArray->GetNumberOfComponents() != 1) + { + vtkErrorMacro("The selected FFT array should only have 1 or 2 components."); + return 0; + } + + // Compute sum of all FFTs over all microphones + for (; !iter->IsDoneWithTraversal(); iter->GoToNextItem()) + { + node = vtkTable::SafeDownCast(iter->GetCurrentDataObject()); + fftArray = vtkDataArray::SafeDownCast(node->GetColumnByName(this->FFTArrayName.c_str())); + + if (!fftArray) + { + vtkErrorMacro("Could not find FFT array named " << this->FFTArrayName << " in block " + << iter->GetCurrentFlatIndex()); + return 0; + } + + assert((fftArray->GetNumberOfTuples() - 1) == resValueRange.size() && + "fftArray size is not coherent"); + + if (isComplex) + { + auto fftTupleRange = vtk::DataArrayTupleRange<2>(fftArray).GetSubRange(1); + using TupleType = decltype(fftTupleRange)::ConstTupleReferenceType; + vtkSMPTools::Transform(fftTupleRange.cbegin(), fftTupleRange.cend(), resValueRange.cbegin(), + resValueRange.begin(), [](TupleType tuple, double value) { + const double magnitude = std::hypot(*tuple.begin(), *(tuple.begin() + 1)); + return value + magnitude; + }); + } + else + { + auto fftValueRange = vtk::DataArrayValueRange(fftArray).GetSubRange(1); + using FFTType = decltype(fftValueRange)::ValueType; + vtkSMPTools::Transform(fftValueRange.cbegin(), fftValueRange.cend(), resValueRange.cbegin(), + resValueRange.begin(), + [](FFTType fft, double value) { return value + static_cast(std::abs(fft)); }); + } + + ++N; + } + + // Compute mean PSD + res->SetName("Mean PSD (dB)"); + + vtkSMPTools::Transform( + resValueRange.cbegin(), resValueRange.cend(), resValueRange.begin(), [N](double value) { + return 10.0 * + std::log10((value / N) / + (vtkAccousticUtilities::REF_PRESSURE * vtkAccousticUtilities::REF_PRESSURE)); + }); + + // Construct output + vtkTable* output = vtkTable::GetData(outputVector); + output->AddColumn(res); + + // Add frequency column if available + vtkDataArray* freqArray = this->FrequencyArrayName.empty() + ? nullptr + : vtkDataArray::SafeDownCast(node->GetColumnByName(this->FrequencyArrayName.c_str())); + if (freqArray) + { + vtkNew freq; + freq->SetName(this->FrequencyArrayName.c_str()); + freq->SetNumberOfValues(res->GetNumberOfValues()); + + auto freqValueRange = vtk::DataArrayValueRange(freqArray).GetSubRange(1); + auto outFreqRange = vtk::DataArrayValueRange(freq); + + assert(freqValueRange.size() == outFreqRange.size() && "FrequencyArray size is not coherent"); + + using FreqType = decltype(freqValueRange)::ValueType; + vtkSMPTools::Transform(freqValueRange.cbegin(), freqValueRange.cend(), outFreqRange.begin(), + [](FreqType value) { return static_cast(value); }); + + output->AddColumn(freq); + } + + return 1; +} + +//--------------------------------------- -------------------------------------- +void vtkMeanPowerSpectralDensity::PrintSelf(std::ostream& os, vtkIndent indent) +{ + this->Superclass::PrintSelf(os, indent); + + os << indent << "FFT Array Name:" << this->FFTArrayName << std::endl; + os << indent << "Frequency Array Name:" << this->FrequencyArrayName << std::endl; +} diff --git a/Plugins/DSP/Filters/vtkMeanPowerSpectralDensity.h b/Plugins/DSP/Filters/vtkMeanPowerSpectralDensity.h new file mode 100644 index 00000000000..ec65510e98b --- /dev/null +++ b/Plugins/DSP/Filters/vtkMeanPowerSpectralDensity.h @@ -0,0 +1,70 @@ +/*========================================================================= + + Plugin: DigitalSignalProcessing + Module: vtkMeanPowerSpectralDensity.h + + Copyright (c) Kitware, Inc. + All rights reserved. + See Copyright.txt or http://www.paraview.org/HTML/Copyright.html for details. + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notice for more information. + +=========================================================================*/ + +/** + * @class vtkMeanPowerSpectralDensity + * + * This filter computes the mean power spectral density (PSD) of temporal signals. + * The input should be a multiblock dataset of vtkTables where each block + * represents a point. Each row of the tables corresponds to a timestep. + */ + +#ifndef vtkMeanPowerSpectralDensity_h +#define vtkMeanPowerSpectralDensity_h + +#include "vtkDSPFiltersPluginModule.h" +#include "vtkTableAlgorithm.h" + +class VTKDSPFILTERSPLUGIN_EXPORT vtkMeanPowerSpectralDensity : public vtkTableAlgorithm +{ +public: + static vtkMeanPowerSpectralDensity* New(); + vtkTypeMacro(vtkMeanPowerSpectralDensity, vtkTableAlgorithm); + void PrintSelf(ostream& os, vtkIndent indent) override; + + ///@{ + /** + * Get/set the name of the FFT array from which to compute the mean PSD. + * Default is empty. + */ + vtkGetMacro(FFTArrayName, std::string); + vtkSetMacro(FFTArrayName, std::string); + ///@} + + ///@{ + /** + * Get/set the name of the frequency array to copy to the output. + * Default is empty. + */ + vtkGetMacro(FrequencyArrayName, std::string); + vtkSetMacro(FrequencyArrayName, std::string); + ///@} + +protected: + vtkMeanPowerSpectralDensity() = default; + ~vtkMeanPowerSpectralDensity() override = default; + + int FillInputPortInformation(int, vtkInformation*) override; + int RequestData(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override; + +private: + vtkMeanPowerSpectralDensity(const vtkMeanPowerSpectralDensity&) = delete; + void operator=(const vtkMeanPowerSpectralDensity&) = delete; + + std::string FFTArrayName; + std::string FrequencyArrayName; +}; + +#endif // vtkMeanPowerSpectralDensity_h diff --git a/Plugins/DSP/Filters/vtkMergeReduceTableBlocks.cxx b/Plugins/DSP/Filters/vtkMergeReduceTableBlocks.cxx new file mode 100644 index 00000000000..a2963f00123 --- /dev/null +++ b/Plugins/DSP/Filters/vtkMergeReduceTableBlocks.cxx @@ -0,0 +1,249 @@ +/*========================================================================= + + Plugin: DigitalSignalProcessing + Module: vtkMergeReduceTableBlocks.cxx + + Copyright (c) Kitware, Inc. + All rights reserved. + See Copyright.txt or http://www.paraview.org/HTML/Copyright.html for details. + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notice for more information. + +=========================================================================*/ + +#include "vtkMergeReduceTableBlocks.h" + +#include "vtkCommand.h" +#include "vtkCompositeDataIterator.h" +#include "vtkDataArray.h" +#include "vtkDataArrayRange.h" +#include "vtkDataArraySelection.h" +#include "vtkDoubleArray.h" +#include "vtkInformation.h" +#include "vtkInformationVector.h" +#include "vtkMultiBlockDataSet.h" +#include "vtkObjectFactory.h" +#include "vtkSMPTools.h" +#include "vtkSmartPointer.h" +#include "vtkStreamingDemandDrivenPipeline.h" +#include "vtkTable.h" + +#include +#include + +//----------------------------------------------------------------------------- +vtkStandardNewMacro(vtkMergeReduceTableBlocks); + +// ---------------------------------------------------------------------------- +vtkMergeReduceTableBlocks::vtkMergeReduceTableBlocks() +{ + // Add operation types + for (auto type : { "Mean", "Sum", "Min", "Max" }) + { + this->OperationSelection->AddArray(type, false); + } + + // Add observers for selections update + this->ColumnToReduceSelection->AddObserver( + vtkCommand::ModifiedEvent, this, &vtkMergeReduceTableBlocks::Modified); + this->ColumnToCopySelection->AddObserver( + vtkCommand::ModifiedEvent, this, &vtkMergeReduceTableBlocks::Modified); + this->OperationSelection->AddObserver( + vtkCommand::ModifiedEvent, this, &vtkMergeReduceTableBlocks::Modified); +} + +//------------------------------------------------------------------------------ +int vtkMergeReduceTableBlocks::FillInputPortInformation(int vtkNotUsed(port), vtkInformation* info) +{ + info->Set(vtkDataObject::DATA_TYPE_NAME(), "vtkMultiBlockDataSet"); + return 1; +} + +//------------------------------------------------------------------------------ +int vtkMergeReduceTableBlocks::RequestData(vtkInformation* vtkNotUsed(request), + vtkInformationVector** inputVector, vtkInformationVector* outputVector) +{ + vtkMultiBlockDataSet* input = vtkMultiBlockDataSet::GetData(inputVector[0]); + if (!input) + { + vtkErrorMacro("No valid multiblock input!"); + return 0; + } + if (input->GetNumberOfBlocks() == 0) + { + return 1; + } + + vtkTable* firstTable = vtkTable::SafeDownCast(input->GetBlock(0)); + if (!firstTable) + { + vtkErrorMacro("Expected a vtkTable at block index 0, aborting"); + return 0; + } + + vtkTable* output = vtkTable::GetData(outputVector); + vtkIdType nbRows = firstTable->GetNumberOfRows(); + const bool wantMean = this->OperationSelection->ArrayIsEnabled("Mean"); + const bool wantMin = this->OperationSelection->ArrayIsEnabled("Min"); + const bool wantMax = this->OperationSelection->ArrayIsEnabled("Max"); + const bool wantSum = this->OperationSelection->ArrayIsEnabled("Sum"); + + // Loop over columns, blocks, rows, and operations + for (vtkIdType arrIdx = 0; arrIdx < firstTable->GetNumberOfColumns(); arrIdx++) + { + std::string colName = firstTable->GetColumnName(arrIdx); + + if (!this->ColumnToReduceSelection->ArrayIsEnabled(colName.c_str()) && + !this->ColumnToCopySelection->ArrayIsEnabled(colName.c_str())) + { + continue; + } + + vtkDataArray* array = vtkDataArray::SafeDownCast(firstTable->GetColumnByName(colName.c_str())); + if (!array) + { + vtkErrorMacro("Could not find array named " << colName << "."); + return 0; + } + + // Shallow copy array to output if needed + if (this->ColumnToCopySelection->ArrayIsEnabled(colName.c_str())) + { + vtkSmartPointer outArray; + outArray.TakeReference(array->NewInstance()); + outArray->ShallowCopy(array); + output->AddColumn(outArray); + } + + if (this->ColumnToReduceSelection->ArrayIsEnabled(colName.c_str())) + { + // Prepare arrays based on input array type + auto sum = vtk::TakeSmartPointer(array->NewInstance()); + auto min = vtk::TakeSmartPointer(array->NewInstance()); + auto max = vtk::TakeSmartPointer(array->NewInstance()); + vtkIdType nbComp = array->GetNumberOfComponents(); + + if (wantSum || wantMean) + { + sum->SetNumberOfComponents(nbComp); + sum->SetNumberOfTuples(nbRows); + sum->SetName((colName + "_Sum").c_str()); + auto sumRange = vtk::DataArrayValueRange(sum); + vtkSMPTools::Fill(sumRange.begin(), sumRange.end(), 0.0); + } + + if (wantMin) + { + min->SetNumberOfComponents(nbComp); + min->SetNumberOfTuples(nbRows); + min->SetName((colName + "_Min").c_str()); + auto minRange = vtk::DataArrayValueRange(min); + vtkSMPTools::Fill(minRange.begin(), minRange.end(), VTK_DOUBLE_MAX); + } + + if (wantMax) + { + max->SetNumberOfComponents(nbComp); + max->SetNumberOfTuples(nbRows); + max->SetName((colName + "_Max").c_str()); + auto maxRange = vtk::DataArrayValueRange(max); + vtkSMPTools::Fill(maxRange.begin(), maxRange.end(), VTK_DOUBLE_MIN); + } + + auto iter = vtk::TakeSmartPointer(input->NewIterator()); + iter->SkipEmptyNodesOn(); + + for (iter->InitTraversal(); !iter->IsDoneWithTraversal(); iter->GoToNextItem()) + { + vtkTable* table = vtkTable::SafeDownCast(iter->GetCurrentDataObject()); + if (!table) + { + vtkErrorMacro( + "Expected a vtkTable at block index " << iter->GetCurrentFlatIndex() << ", aborting"); + return 0; + } + + array = vtkDataArray::SafeDownCast(table->GetColumnByName(colName.c_str())); + if (!array) + { + vtkErrorMacro("Could not find array named " << colName << "."); + return 0; + } + + auto arrayRange = vtk::DataArrayValueRange(array); + auto sumRange = vtk::DataArrayValueRange(sum); + auto minRange = vtk::DataArrayValueRange(min); + auto maxRange = vtk::DataArrayValueRange(max); + + // Type of output arrays elements should be the same as array due to the use of NewInstance + using ArrayType = decltype(arrayRange)::value_type; + + if (wantSum || wantMean) + { + vtkSMPTools::Transform(arrayRange.cbegin(), arrayRange.cend(), sumRange.cbegin(), + sumRange.begin(), [](ArrayType x, ArrayType y) { return x + y; }); + } + + if (wantMin) + { + vtkSMPTools::Transform(arrayRange.cbegin(), arrayRange.cend(), minRange.cbegin(), + minRange.begin(), [](ArrayType x, ArrayType y) { return std::min(x, y); }); + } + + if (wantMax) + { + vtkSMPTools::Transform(arrayRange.cbegin(), arrayRange.cend(), maxRange.cbegin(), + maxRange.begin(), [](ArrayType x, ArrayType y) { return std::max(x, y); }); + } + } + + // Assign columns for the current array being reduced + if (wantSum) + { + output->AddColumn(sum); + } + + if (wantMin) + { + output->AddColumn(min); + } + + if (wantMax) + { + output->AddColumn(max); + } + + if (wantMean) + { + vtkNew mean; + mean->SetNumberOfComponents(nbComp); + mean->SetNumberOfTuples(nbRows); + mean->SetName((colName + "_Mean").c_str()); + auto meanRange = vtk::DataArrayValueRange(mean); + auto sumRange = vtk::DataArrayValueRange(sum); + + using ArrayType = decltype(sumRange)::value_type; + vtkSMPTools::Transform(sumRange.cbegin(), sumRange.cend(), meanRange.begin(), + [input](ArrayType x) { return x / static_cast(input->GetNumberOfBlocks()); }); + + output->AddColumn(mean); + } + } + } + + return 1; +} + +//--------------------------------------- -------------------------------------- +void vtkMergeReduceTableBlocks::PrintSelf(std::ostream& os, vtkIndent indent) +{ + this->Superclass::PrintSelf(os, indent); + os << indent << "ColumnToReduceSelection:\n"; + this->ColumnToReduceSelection->PrintSelf(os, indent.GetNextIndent()); + os << indent << "ColumnToCopySelection:\n"; + this->ColumnToCopySelection->PrintSelf(os, indent.GetNextIndent()); + os << indent << "OperationSelection:\n"; + this->OperationSelection->PrintSelf(os, indent.GetNextIndent()); +} diff --git a/Plugins/DSP/Filters/vtkMergeReduceTableBlocks.h b/Plugins/DSP/Filters/vtkMergeReduceTableBlocks.h new file mode 100644 index 00000000000..204cf08014c --- /dev/null +++ b/Plugins/DSP/Filters/vtkMergeReduceTableBlocks.h @@ -0,0 +1,73 @@ +/*========================================================================= + + Plugin: DigitalSignalProcessing + Module: vtkMergeReduceTableBlocks.h + + Copyright (c) Kitware, Inc. + All rights reserved. + See Copyright.txt or http://www.paraview.org/HTML/Copyright.html for details. + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notice for more information. + +=========================================================================*/ + +/** + * @class vtkMergeReduceTableBlocks + * + * This filter performs reduction operations such as the mean or the sum over + * columns across all blocks of a multiblock of vtkTables. + * Input arrays can also be copied to the output. + */ + +#ifndef vtkMergeReduceTableBlocks_h +#define vtkMergeReduceTableBlocks_h + +#include "vtkDSPFiltersPluginModule.h" +#include "vtkNew.h" // for vtkNew +#include "vtkTableAlgorithm.h" + +class vtkDataArraySelection; + +class VTKDSPFILTERSPLUGIN_EXPORT vtkMergeReduceTableBlocks : public vtkTableAlgorithm +{ +public: + static vtkMergeReduceTableBlocks* New(); + vtkTypeMacro(vtkMergeReduceTableBlocks, vtkTableAlgorithm); + void PrintSelf(ostream& os, vtkIndent indent) override; + + /** + * Get the current selection of columns to reduce. + */ + vtkGetNewMacro(ColumnToReduceSelection, vtkDataArraySelection); + + /** + * Get the current selection of columns to copy from input to the output. + * Columns are copied from the first block. + */ + vtkGetNewMacro(ColumnToCopySelection, vtkDataArraySelection); + + /** + * Get the current selection of operations for reduction. + * Available operations include mean, sum, min and max. + */ + vtkGetNewMacro(OperationSelection, vtkDataArraySelection); + +protected: + vtkMergeReduceTableBlocks(); + ~vtkMergeReduceTableBlocks() override = default; + + int FillInputPortInformation(int, vtkInformation*) override; + int RequestData(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override; + +private: + vtkMergeReduceTableBlocks(const vtkMergeReduceTableBlocks&) = delete; + void operator=(const vtkMergeReduceTableBlocks&) = delete; + + vtkNew ColumnToReduceSelection; + vtkNew ColumnToCopySelection; + vtkNew OperationSelection; +}; + +#endif // vtkMergeReduceTableBlocks_h diff --git a/Plugins/DSP/Filters/vtkProjectSpectrumMagnitude.cxx b/Plugins/DSP/Filters/vtkProjectSpectrumMagnitude.cxx new file mode 100644 index 00000000000..1d0b1758c83 --- /dev/null +++ b/Plugins/DSP/Filters/vtkProjectSpectrumMagnitude.cxx @@ -0,0 +1,254 @@ +/*========================================================================= + + Plugin: DigitalSignalProcessing + Module: vtkProjectSpectrumMagnitude.cxx + + Copyright (c) Kitware, Inc. + All rights reserved. + See Copyright.txt or http://www.paraview.org/HTML/Copyright.html for details. + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notice for more information. + +=========================================================================*/ + +#include "vtkProjectSpectrumMagnitude.h" + +#include "vtkCommand.h" +#include "vtkCompositeDataIterator.h" +#include "vtkDataArray.h" +#include "vtkDataArraySelection.h" +#include "vtkDataSet.h" +#include "vtkInformation.h" +#include "vtkInformationVector.h" +#include "vtkMath.h" +#include "vtkMultiBlockDataSet.h" +#include "vtkObjectFactory.h" +#include "vtkPointData.h" +#include "vtkStreamingDemandDrivenPipeline.h" +#include "vtkTable.h" + +#include +#include +#include +#include + +//----------------------------------------------------------------------------- +vtkStandardNewMacro(vtkProjectSpectrumMagnitude); + +// ---------------------------------------------------------------------------- +vtkProjectSpectrumMagnitude::vtkProjectSpectrumMagnitude() +{ + this->SetNumberOfInputPorts(2); + + // Add observer for selection update + this->ColumnSelection->AddObserver( + vtkCommand::ModifiedEvent, this, &vtkProjectSpectrumMagnitude::Modified); +} + +//------------------------------------------------------------------------------ +void vtkProjectSpectrumMagnitude::SetSourceData(vtkDataSet* source) +{ + this->SetInputData(1, source); +} + +//------------------------------------------------------------------------------ +void vtkProjectSpectrumMagnitude::SetSourceConnection(vtkAlgorithmOutput* algOutput) +{ + this->SetInputConnection(1, algOutput); +} + +//------------------------------------------------------------------------------ +int vtkProjectSpectrumMagnitude::FillInputPortInformation(int port, vtkInformation* info) +{ + if (port == 0) + { + info->Set(vtkAlgorithm::INPUT_REQUIRED_DATA_TYPE(), "vtkMultiBlockDataSet"); + return 1; + } + else if (port == 1) + { + info->Set(vtkAlgorithm::INPUT_REQUIRED_DATA_TYPE(), "vtkDataSet"); + return 1; + } + + return 0; +} + +//------------------------------------------------------------------------------ +int vtkProjectSpectrumMagnitude::RequestDataObject(vtkInformation* vtkNotUsed(request), + vtkInformationVector** inputVector, vtkInformationVector* outputVector) +{ + vtkDataSet* input = vtkDataSet::GetData(inputVector[1]); + + if (!input) + { + vtkErrorMacro("Missing input!"); + return 0; + } + + vtkInformation* info = outputVector->GetInformationObject(0); + vtkDataSet* output = vtkDataSet::SafeDownCast(info->Get(vtkDataObject::DATA_OBJECT())); + + if (!output || !output->IsA(input->GetClassName())) + { + vtkDataSet* newOutput = input->NewInstance(); + info->Set(vtkDataObject::DATA_OBJECT(), newOutput); + newOutput->Delete(); + } + + return 1; +} + +//---------------------------------------------------------------------------- +int vtkProjectSpectrumMagnitude::RequestInformation(vtkInformation* vtkNotUsed(request), + vtkInformationVector** vtkNotUsed(inputVector), vtkInformationVector* outputVector) +{ + // Output is not temporal + auto outInfo = outputVector->GetInformationObject(0); + outInfo->Remove(vtkStreamingDemandDrivenPipeline::TIME_STEPS()); + outInfo->Remove(vtkStreamingDemandDrivenPipeline::TIME_RANGE()); + + return 1; +} + +//------------------------------------------------------------------------------ +int vtkProjectSpectrumMagnitude::RequestData(vtkInformation* vtkNotUsed(request), + vtkInformationVector** inputVector, vtkInformationVector* outputVector) +{ + vtkMultiBlockDataSet* tables = vtkMultiBlockDataSet::GetData(inputVector[0]); + if (!tables) + { + vtkErrorMacro("Missing valid input"); + return 0; + } + + vtkDataSet* input = vtkDataSet::GetData(inputVector[1]); + vtkDataSet* output = vtkDataSet::GetData(outputVector); + + const vtkIdType nbBlocks = tables->GetNumberOfBlocks(); + if (nbBlocks == 0) + { + return 1; + } + + if (input->GetNumberOfPoints() != nbBlocks) + { + vtkErrorMacro("Number of mesh points does not match number of table blocks!"); + return 0; + } + + // Retrieve table information in order to + // find row indices for the requested frequency range + vtkTable* firstTable = vtkTable::SafeDownCast(tables->GetBlock(0)); + if (firstTable == nullptr) + { + vtkErrorMacro("Invalid block type"); + return 0; + } + vtkDataArray* freqArray = this->GetInputArrayToProcess(0, firstTable); + if (!freqArray || freqArray->GetNumberOfComponents() != 1) + { + vtkErrorMacro("Could not find a valid frequency array."); + return 0; + } + + // Retrieve the frequency range we should process. + // We assume frequency bins are the same for all blocks and frequency is sorted + const std::array freqRange = [&] { + const vtkIdType nvalues = freqArray->GetNumberOfValues(); + vtkIdType idx = 0; + while (idx < nvalues && freqArray->GetTuple1(idx) < this->LowerFrequency) + { + idx++; + } + const vtkIdType begin = idx; + + idx = nvalues - 1; + while (idx >= 0 && freqArray->GetTuple1(idx) > this->UpperFrequency) + { + idx--; + } + const vtkIdType end = idx + 1; + return std::array{ begin, end }; + }(); + + // Configure the output + output->CopyStructure(input); + output->CopyAttributes(input); + + // Loop over selected arrays + for (vtkIdType arrIdx = 0; arrIdx < firstTable->GetNumberOfColumns(); arrIdx++) + { + // Check that array was selected + const std::string colName = firstTable->GetColumnName(arrIdx); + if (!this->ColumnSelection->ArrayIsEnabled(colName.c_str())) + { + continue; + } + + // Prepare output array + vtkDataArray* modelArray = + vtkDataArray::SafeDownCast(firstTable->GetColumnByName(colName.c_str())); + if (!modelArray) + { + vtkWarningMacro("Could not find array named " << colName << "."); + continue; + } + auto outArray = vtk::TakeSmartPointer(modelArray->NewInstance()); + outArray->SetNumberOfComponents(modelArray->GetNumberOfComponents()); + outArray->SetNumberOfTuples(nbBlocks); + outArray->SetName((colName).c_str()); + outArray->Fill(0.0); + auto outRange = vtk::DataArrayTupleRange(outArray); + auto outIterator = outRange.begin(); + const double componentFactor = 1.0 / firstTable->GetNumberOfRows(); + + // Fill output array + auto iter = vtk::TakeSmartPointer(tables->NewIterator()); + iter->SkipEmptyNodesOn(); + for (iter->InitTraversal(); !iter->IsDoneWithTraversal(); iter->GoToNextItem(), outIterator++) + { + vtkTable* table = vtkTable::SafeDownCast(iter->GetCurrentDataObject()); + if (table == nullptr) + { + vtkErrorMacro("Invalid block type"); + return 0; + } + vtkDataArray* inArray = vtkDataArray::SafeDownCast(table->GetColumnByName(colName.c_str())); + if (!inArray) + { + vtkErrorMacro("Could not find array named " << colName << "."); + return 0; + } + + // Mean all values inside frequency range + const auto inRange = vtk::DataArrayTupleRange(inArray, freqRange[0], freqRange[1]); + for (const auto inTuple : inRange) + { + auto outComponent = outIterator->begin(); + for (const auto inComponent : inTuple) + { + *outComponent += inComponent * componentFactor; + outComponent++; + } + } + } + + output->GetPointData()->AddArray(outArray); + } + + return 1; +} + +//--------------------------------------- -------------------------------------- +void vtkProjectSpectrumMagnitude::PrintSelf(std::ostream& os, vtkIndent indent) +{ + this->Superclass::PrintSelf(os, indent); + + os << indent << "LowerFrequency: " << this->LowerFrequency << std::endl; + os << indent << "UpperFrequency: " << this->UpperFrequency << std::endl; + os << indent << "ColumnSelection:\n"; + this->ColumnSelection->PrintSelf(os, indent.GetNextIndent()); +} diff --git a/Plugins/DSP/Filters/vtkProjectSpectrumMagnitude.h b/Plugins/DSP/Filters/vtkProjectSpectrumMagnitude.h new file mode 100644 index 00000000000..d6cba8f4b39 --- /dev/null +++ b/Plugins/DSP/Filters/vtkProjectSpectrumMagnitude.h @@ -0,0 +1,108 @@ +/*========================================================================= + + Plugin: DigitalSignalProcessing + Module: vtkProjectSpectrumMagnitude.h + + Copyright (c) Kitware, Inc. + All rights reserved. + See Copyright.txt or http://www.paraview.org/HTML/Copyright.html for details. + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notice for more information. + +=========================================================================*/ + +/** + * @class vtkProjectSpectrumMagnitude + * + * This filter computes the mean of some data arrays within a specified range of + * frequency, and project it on the targeted mesh. The mesh to project into is + * connected to input 1. Input 0 is a multiblock of tables containing the FFT + * of some data for each point of the mesh. This filter expects that the number + * of point in the mesh is equal to the number of blocks in the multiblock of table. + * First block will be projected onto the first mesh point, and so on. + * + * Output is a non-temporal dataset with the means as new point datas. + * + * Frequency array is selected using the `SetInputArrayToProcess` interface. + */ + +#ifndef vtkProjectSpectrumMagnitude_h +#define vtkProjectSpectrumMagnitude_h + +#include "vtkDSPFiltersPluginModule.h" +#include "vtkDataSetAlgorithm.h" +#include "vtkNew.h" // for vtkNew + +class vtkDataArraySelection; + +class VTKDSPFILTERSPLUGIN_EXPORT vtkProjectSpectrumMagnitude : public vtkDataSetAlgorithm +{ +public: + static vtkProjectSpectrumMagnitude* New(); + vtkTypeMacro(vtkProjectSpectrumMagnitude, vtkDataSetAlgorithm); + void PrintSelf(ostream& os, vtkIndent indent) override; + + /** + * Set the source object corresponding to the destination mesh. + * The source is a vtkDataSet where the number of points matches the number + * of input table blocks. + * Note that this method does not connect the pipeline. The algorithm will + * work on the input data as it is without updating the producer of the data. + * See SetSourceConnection for connecting the pipeline. + */ + void SetSourceData(vtkDataSet* source); + + /** + * Set the source object corresponding to the destination mesh. + * The source is a vtkDataSet where the number of points matches the number + * of input table blocks. + * This method connects to the pipeline. + */ + void SetSourceConnection(vtkAlgorithmOutput* algOutput); + + /** + * Get the current selection of columns to project. + */ + vtkGetNewMacro(ColumnSelection, vtkDataArraySelection); + + ///@{ + /** + * Get/set the lower bound of the frequency range to project. + * Default is 0.0 Hz. + */ + vtkGetMacro(LowerFrequency, double); + vtkSetMacro(LowerFrequency, double); + ///@} + + ///@{ + /** + * Get/set the upper bound of the frequency range to project. + * Default is 0.0 Hz. + */ + vtkGetMacro(UpperFrequency, double); + vtkSetMacro(UpperFrequency, double); + ///@} + +protected: + vtkProjectSpectrumMagnitude(); + ~vtkProjectSpectrumMagnitude() override = default; + + int FillInputPortInformation(int, vtkInformation*) override; + int RequestDataObject(vtkInformation* request, vtkInformationVector** inputVector, + vtkInformationVector* outputVector) override; + int RequestInformation(vtkInformation* request, vtkInformationVector** inputVector, + vtkInformationVector* outputVector) override; + int RequestData(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override; + +private: + vtkProjectSpectrumMagnitude(const vtkProjectSpectrumMagnitude&) = delete; + void operator=(const vtkProjectSpectrumMagnitude&) = delete; + + vtkNew ColumnSelection; + double LowerFrequency = 0.0; + double UpperFrequency = 0.0; +}; + +#endif // vtkProjectSpectrumMagnitude_h diff --git a/Plugins/DSP/Filters/vtkSoundQuantitiesCalculator.cxx b/Plugins/DSP/Filters/vtkSoundQuantitiesCalculator.cxx new file mode 100644 index 00000000000..89443a05ce2 --- /dev/null +++ b/Plugins/DSP/Filters/vtkSoundQuantitiesCalculator.cxx @@ -0,0 +1,289 @@ +/*========================================================================= + + Plugin: DigitalSignalProcessing + Module: vtkSoundQuantitiesCalculator.cxx + + Copyright (c) Kitware, Inc. + All rights reserved. + See Copyright.txt or http://www.paraview.org/HTML/Copyright.html for details. + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notice for more information. + +=========================================================================*/ + +#include "vtkSoundQuantitiesCalculator.h" + +#include "vtkAccousticUtilities.h" +#include "vtkCell.h" +#include "vtkCellArray.h" +#include "vtkDataSet.h" +#include "vtkDoubleArray.h" +#include "vtkInformation.h" +#include "vtkInformationVector.h" +#include "vtkMultiBlockDataSet.h" +#include "vtkObjectFactory.h" +#include "vtkPointData.h" +#include "vtkPoints.h" +#include "vtkPolyData.h" +#include "vtkSmartPointer.h" +#include "vtkStreamingDemandDrivenPipeline.h" +#include "vtkTable.h" +#include "vtkTriangle.h" +#include "vtkTriangleFilter.h" + +#include +#include + +//----------------------------------------------------------------------------- +namespace details +{ +/** + * Compute the surfacic integral of points data over a mesh. + * Cells are expected to be triangles. + * + * @warning This is not a perfectly right surfacic integral as we're squaring up the values + * fetched from @c data when integrating over the surface. + * + * @todo this should be moved in a more appropriate place in VTK, when the squared up value + * thing can be factorized out (we could imagine a fonctor acting as a modifier in the input) + */ +double SurfacicIntegral(vtkPoints* points, vtkCellArray* cells, vtkDoubleArray* data) +{ + constexpr double third = 1.0 / 3.0; + double integral = 0.0; + vtkNew cellPts; + vtkNew triangle; + + for (vtkIdType tri = 0; tri < cells->GetNumberOfCells(); ++tri) + { + cells->GetCellAtId(tri, cellPts); + double sumOverTriangle = 0; + for (vtkIdType i = 0; i < 3; ++i) + { + const double& val = data->GetValue(cellPts->GetId(i)); + sumOverTriangle += val * val; + } + triangle->Initialize(3, cellPts->begin(), points); + + integral += third * triangle->ComputeArea() * sumOverTriangle; + } + + return integral; +} +} // namespace details + +//----------------------------------------------------------------------------- +vtkStandardNewMacro(vtkSoundQuantitiesCalculator); + +//----------------------------------------------------------------------------- +vtkSoundQuantitiesCalculator::vtkSoundQuantitiesCalculator() +{ + this->SetNumberOfInputPorts(2); +} + +//------------------------------------------------------------------------------ +void vtkSoundQuantitiesCalculator::SetSourceData(vtkMultiBlockDataSet* input) +{ + this->SetInputData(1, input); +} + +//------------------------------------------------------------------------------ +void vtkSoundQuantitiesCalculator::SetSourceConnection(vtkAlgorithmOutput* algOutput) +{ + this->SetInputConnection(1, algOutput); +} + +//------------------------------------------------------------------------------ +vtkMultiBlockDataSet* vtkSoundQuantitiesCalculator::GetSource() +{ + if (this->GetNumberOfInputConnections(1) < 1) + { + return nullptr; + } + return vtkMultiBlockDataSet::SafeDownCast(this->GetExecutive()->GetInputData(1, 0)); +} + +//------------------------------------------------------------------------------ +int vtkSoundQuantitiesCalculator::FillInputPortInformation(int port, vtkInformation* info) +{ + switch (port) + { + case 0: + info->Set(vtkAlgorithm::INPUT_REQUIRED_DATA_TYPE(), "vtkDataSet"); + return 1; + case 1: + info->Set(vtkAlgorithm::INPUT_REQUIRED_DATA_TYPE(), "vtkMultiBlockDataSet"); + return 1; + default: + return 0; + } +} + +//------------------------------------------------------------------------------ +int vtkSoundQuantitiesCalculator::RequestData(vtkInformation* /*request*/, + vtkInformationVector** inputVector, vtkInformationVector* outputVector) +{ + // Retrieve inputs + vtkDataSet* inputMesh = vtkDataSet::GetData(inputVector[0]); + vtkMultiBlockDataSet* mbInput = vtkMultiBlockDataSet::GetData(inputVector[1]); + + if (!inputMesh || !mbInput) + { + vtkErrorMacro("At least one of the two inputs was not found."); + return 0; + } + + // Check pressure array name + if (this->PressureArrayName.empty() || this->PressureArrayName == "None") + { + vtkErrorMacro("Pressure array must be specified."); + return 0; + } + + // Copy input geometry to output (do not copy data because the output is not temporal anymore) + vtkDataSet* output = vtkDataSet::GetData(outputVector, 0); + output->CopyStructure(inputMesh); + + // Compute every quantity we want and add them to the output + if (this->ComputeMeanPressure) + { + if (!this->ProcessData(inputMesh, mbInput, output)) + { + vtkErrorMacro("Data processing failed."); + return 0; + } + } + + return 1; +} + +//----------------------------------------------------------------------------- +int vtkSoundQuantitiesCalculator::ProcessData( + vtkDataSet* inputMesh, vtkMultiBlockDataSet* inputTables, vtkDataSet* output) +{ + // Retrieve number of timesteps from first block + vtkTable* table = vtkTable::SafeDownCast(inputTables->GetBlock(0)); + + if (!table) + { + vtkErrorMacro("Source blocks should be of type vtkTable."); + return 0; + } + + // Retrieve number of blocks (equal to the number of points) + const vtkIdType numOfBlocks = inputTables->GetNumberOfBlocks(); + + // Define output arrays + constexpr const char* pMeanName = "Mean Pressure (Pa)"; + constexpr const char* pRmsNamePa = "RMS Pressure (Pa)"; + constexpr const char* pRmsNameDb = "RMS Pressure (dB)"; + constexpr const char* powerName = "Acoustic Power (dB)"; + + vtkNew pMeanArray; + pMeanArray->SetNumberOfValues(numOfBlocks); + pMeanArray->SetName(pMeanName); + + vtkNew pRmsPaArray; + pRmsPaArray->SetNumberOfValues(numOfBlocks); + pRmsPaArray->SetName(pRmsNamePa); + + vtkNew pRmsDbArray; + pRmsDbArray->SetNumberOfValues(numOfBlocks); + pRmsDbArray->SetName(pRmsNameDb); + + for (vtkIdType i = 0; i < numOfBlocks; ++i) + { + table = vtkTable::SafeDownCast(inputTables->GetBlock(i)); + if (!table) + { + vtkErrorMacro("Source blocks should be of type vtkTable."); + return 0; + } + + vtkDataArray* pressureArray = + vtkDataArray::SafeDownCast(table->GetColumnByName(this->PressureArrayName.c_str())); + if (!pressureArray) + { + vtkErrorMacro("Could not find array named " << this->PressureArrayName << "."); + return 0; + } + + // Compute mean pressure + const auto pressureRange = vtk::DataArrayValueRange(pressureArray); + const double mean = + std::accumulate(pressureRange.cbegin(), pressureRange.cend(), 0.0) / pressureRange.size(); + pMeanArray->SetValue(i, mean); + + // Compute additional derived quantities + if (this->ComputeRMSPressure) + { + double rms = 0.0; + for (double pressure : pressureRange) + { + const double delta = mean - pressure; + rms += delta * delta; + } + rms = std::sqrt(rms / pressureRange.size()); + + pRmsPaArray->SetValue(i, rms); + pRmsDbArray->SetValue(i, 20.0 * std::log10(rms / vtkAccousticUtilities::REF_PRESSURE)); + } + } + + // Add mean pressure to output + output->GetPointData()->AddArray(pMeanArray); + + if (this->ComputeRMSPressure) + { + output->GetPointData()->AddArray(pRmsPaArray); + output->GetPointData()->AddArray(pRmsDbArray); + + // Compute acoustic power. This needs a surfacic integral + if (this->ComputePower) + { + vtkPolyData* poly = vtkPolyData::SafeDownCast(inputMesh); + if (!poly) + { + vtkWarningMacro("Cannot compute acoustic power without a polyData"); + } + else + { + vtkNew acousticPower; + acousticPower->SetNumberOfValues(1); + acousticPower->SetName(powerName); + vtkNew triangleFilter; + triangleFilter->SetInputData(poly); + triangleFilter->Update(); + vtkPolyData* processed = triangleFilter->GetOutput(); + + const double mediumFactor = 1.0 / (this->MediumDensity * this->MediumSoundVelocity); + const double power = + details::SurfacicIntegral(processed->GetPoints(), processed->GetPolys(), pRmsPaArray) * + mediumFactor; + acousticPower->SetValue(0, 10.0 * std::log10(power / vtkAccousticUtilities::REF_POWER)); + + output->GetFieldData()->AddArray(acousticPower); + } + } + } + else if (this->ComputePower) + { + vtkWarningMacro("Cannot compute acoustic power without computing the RMS"); + } + + return 1; +} + +//----------------------------------------------------------------------------- +void vtkSoundQuantitiesCalculator::PrintSelf(std::ostream& os, vtkIndent indent) +{ + this->Superclass::PrintSelf(os, indent); + os << indent << "Pressure Array Name:" << this->PressureArrayName << std::endl; + os << indent << "Medium Density:" << this->MediumDensity << std::endl; + os << indent << "Medium Sound Velocity:" << this->MediumSoundVelocity << std::endl; + os << indent << "Compute Mean Pressure:" << this->ComputeMeanPressure << std::endl; + os << indent << "Compute RMS Pressure:" << this->ComputeRMSPressure << std::endl; + os << indent << "Compute Acoustic Power:" << this->ComputePower << std::endl; +} diff --git a/Plugins/DSP/Filters/vtkSoundQuantitiesCalculator.h b/Plugins/DSP/Filters/vtkSoundQuantitiesCalculator.h new file mode 100644 index 00000000000..9d2da07ec41 --- /dev/null +++ b/Plugins/DSP/Filters/vtkSoundQuantitiesCalculator.h @@ -0,0 +1,153 @@ +/*========================================================================= + + Plugin: DigitalSignalProcessing + Module: vtkSoundQuantitiesCalculator.h + + Copyright (c) Kitware, Inc. + All rights reserved. + See Copyright.txt or http://www.paraview.org/HTML/Copyright.html for details. + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notice for more information. + +=========================================================================*/ + +/** + * @class vtkSoundQuantitiesCalculator + * + * Compute the pressure RMS value (Pa and dB) as well as the acoustic power + * from a sound pressure (Pa) array. Could be improved by adding more conversions. + * + * This filter has 2 inputs: + * - port 0 is the input geometry for cell connectivity. + * - port 1 is a multi-block dataset representing the data through time. Block flat index + * corresponds to the index of the point in the input mesh. This kind of dataset + * can be obtained e.g. by applying the filter Plot Data Over Time (vtkExtractDataArraysOverTime) + * with the option "Only Report Selection Statistics" turned off. + * + * The output is the input geometry with the computed sound quantities attached to + * it i.e. the mean pressure, the RMS pressure and the acoustic power. + */ + +#ifndef vtkSoundQuantitiesCalculator_h +#define vtkSoundQuantitiesCalculator_h + +#include "vtkDSPFiltersPluginModule.h" +#include "vtkDataSetAlgorithm.h" + +class vtkMultiBlockDataSet; + +class VTKDSPFILTERSPLUGIN_EXPORT vtkSoundQuantitiesCalculator : public vtkDataSetAlgorithm +{ +public: + static vtkSoundQuantitiesCalculator* New(); + vtkTypeMacro(vtkSoundQuantitiesCalculator, vtkDataSetAlgorithm); + void PrintSelf(ostream& os, vtkIndent indent) override; + + ///@{ + /** + * Specify the source object containing the temporal data for each point. + * The source is a vtkMultiBlockDataSet where each block is a vtkTable + * holding temporal data for one point. + * Note that this method does not connect the pipeline. The algorithm will + * work on the input data as it is without updating the producer of the data. + * See SetSourceConnection for connecting the pipeline. + */ + void SetSourceData(vtkMultiBlockDataSet* source); + vtkMultiBlockDataSet* GetSource(); + ///@} + + /** + * Specify the source object containing the temporal data for each point. + * The source is a vtkMultiBlockDataSet where each block is a vtkTable + * holding temporal data for one point. + * This method connects to the pipeline. + */ + void SetSourceConnection(vtkAlgorithmOutput* algOutput); + + //@{ + /** + * Get/set the name of the sound pressure array from which to compute derived quantities. + * Default is empty. + */ + vtkGetMacro(PressureArrayName, std::string); + vtkSetMacro(PressureArrayName, std::string); + //@} + + //@{ + /** + * Density of the medium, in kg/m3. + * Default is the density of the air = 1.2 + */ + vtkGetMacro(MediumDensity, double); + vtkSetMacro(MediumDensity, double); + //@} + + //@{ + /** + * Velocity of the sound in the medium, in m/s. + * Default is the velocity in the air = 340 + */ + vtkGetMacro(MediumSoundVelocity, double); + vtkSetMacro(MediumSoundVelocity, double); + //@} + + /** + * Specify if mean pressure value through time needs to be computed. + * Produce a point data array. + * + * Default is true. + */ + vtkGetMacro(ComputeMeanPressure, bool); + vtkSetMacro(ComputeMeanPressure, bool); + + /** + * Specify if root mean squared pressure value through time needs to be computed. + * RMS pressure needs ComputeMeanPressure to be true. + * Produce a point data array. + * + * Default is true. + */ + vtkGetMacro(ComputeRMSPressure, bool); + vtkSetMacro(ComputeRMSPressure, bool); + + /** + * Specify if the sound power over time and over the surface needs to be computed. + * Acoustic power needs ComputeRMSPressure to be true. + * Produce a field data array. + * + * Default is true. + */ + vtkGetMacro(ComputePower, bool); + vtkSetMacro(ComputePower, bool); + +protected: + vtkSoundQuantitiesCalculator(); + ~vtkSoundQuantitiesCalculator() override = default; + + int FillInputPortInformation(int port, vtkInformation* info) override; + int RequestData(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override; + +private: + std::string PressureArrayName; + double MediumDensity = 1.2; + double MediumSoundVelocity = 340.0; + bool ComputeMeanPressure = true; + bool ComputeRMSPressure = true; + bool ComputePower = true; + + /** + * Fill @c output with the required array. + * This method only use internals variables for computing the result. + * + * The input is internally triangulated to be able to compute the + * acoustic power (if needed). + */ + int ProcessData(vtkDataSet* inputMesh, vtkMultiBlockDataSet* inputTables, vtkDataSet* output); + + vtkSoundQuantitiesCalculator(const vtkSoundQuantitiesCalculator&) = delete; + void operator=(const vtkSoundQuantitiesCalculator&) = delete; +}; + +#endif // vtkSoundQuantitiesCalculator_h diff --git a/Plugins/DSP/Filters/vtkSpectrogramFilter.cxx b/Plugins/DSP/Filters/vtkSpectrogramFilter.cxx new file mode 100644 index 00000000000..4d0ac7004bb --- /dev/null +++ b/Plugins/DSP/Filters/vtkSpectrogramFilter.cxx @@ -0,0 +1,196 @@ +#include "vtkSpectrogramFilter.h" + +#include "vtkDataArray.h" +#include "vtkDoubleArray.h" +#include "vtkFFT.h" +#include "vtkImageData.h" +#include "vtkInformation.h" +#include "vtkInformationVector.h" +#include "vtkMath.h" +#include "vtkMultiBlockDataSet.h" +#include "vtkObjectFactory.h" +#include "vtkPointData.h" +#include "vtkStreamingDemandDrivenPipeline.h" +#include "vtkTable.h" +#include "vtkTableFFT.h" + +#include + +//----------------------------------------------------------------------------- +vtkStandardNewMacro(vtkSpectrogramFilter); + +//------------------------------------------------------------------------------ +int vtkSpectrogramFilter::FillInputPortInformation(int vtkNotUsed(port), vtkInformation* info) +{ + info->Remove(vtkAlgorithm::INPUT_REQUIRED_DATA_TYPE()); + info->Set(vtkAlgorithm::INPUT_REQUIRED_DATA_TYPE(), "vtkTable"); + + return 1; +} + +//------------------------------------------------------------------------------ +int vtkSpectrogramFilter::RequestInformation(vtkInformation* vtkNotUsed(request), + vtkInformationVector** vtkNotUsed(inputVector), vtkInformationVector* outputVector) +{ + // Time resolution should be at least 3 samples to produce an image + constexpr static int MIN_RESOLUTION = 3; + if (this->TimeResolution < MIN_RESOLUTION) + { + vtkWarningMacro(<< "Time resolution should not be smaller than 3 samples. " + << "Setting time resolution to 3 samples."); + this->TimeResolution = MIN_RESOLUTION; + } + + // Arbitrary extent because at this point we cannot rely on the input because it may be empty. + const int outExt[6] = { 0, VTK_INT_MAX, 0, VTK_INT_MAX, 0, 0 }; + vtkInformation* outInfo = outputVector->GetInformationObject(0); + outInfo->Set(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), outExt, 6); + + return 1; +} + +//------------------------------------------------------------------------------ +int vtkSpectrogramFilter::RequestData(vtkInformation* vtkNotUsed(request), + vtkInformationVector** inputVector, vtkInformationVector* outputVector) +{ + // Retrieve input and output + vtkTable* input = vtkTable::GetData(inputVector[0]); + vtkImageData* output = vtkImageData::GetData(outputVector); + + if (!input || !output) + { + vtkErrorMacro("Missing input or output!"); + return 0; + } + + if (input->GetNumberOfColumns() == 0) + { + return 1; + } + + // Get array from which to produce a spectrogram + vtkIdType nbInRows = input->GetNumberOfRows(); + vtkDataArray* inputArray = this->GetInputArrayToProcess(0, inputVector); + + if (!inputArray) + { + vtkWarningMacro(<< "No input array specified. Using first column."); + inputArray = vtkDataArray::SafeDownCast(input->GetColumn(0)); + } + + std::vector window(this->TimeResolution); + switch (this->WindowType) + { + case vtkTableFFT::HANNING: + vtkFFT::GenerateKernel1D(window.data(), window.size(), vtkFFT::HanningGenerator); + break; + case vtkTableFFT::BARTLETT: + vtkFFT::GenerateKernel1D(window.data(), window.size(), vtkFFT::BartlettGenerator); + break; + case vtkTableFFT::SINE: + vtkFFT::GenerateKernel1D(window.data(), window.size(), vtkFFT::SineGenerator); + break; + case vtkTableFFT::BLACKMAN: + vtkFFT::GenerateKernel1D(window.data(), window.size(), vtkFFT::BlackmanGenerator); + break; + case vtkTableFFT::RECTANGULAR: + default: + vtkFFT::GenerateKernel1D(window.data(), window.size(), vtkFFT::RectangularGenerator); + } + vtkSmartPointer signal = + vtkFFT::vtkScalarNumberArray::SafeDownCast(inputArray); + if (!signal) + { + signal = vtkSmartPointer::New(); + signal->DeepCopy(inputArray); + } + const double sampleRate = this->ComputeSampleRate(input); + const int noverlap = this->TimeResolution * (this->OverlapPercentage / 100.0); + + unsigned int shape[2]; + auto spectrogram = vtkFFT::Spectrogram(signal, window, sampleRate, noverlap, false, true, + vtkFFT::Scaling::Density, vtkFFT::SpectralMode::PSD, shape, true); + + // Reshape output image (X is time, Y is frequency) + const int dims[3] = { static_cast(shape[1]), static_cast(shape[0]), 1 }; + output->SetDimensions(dims); + + spectrogram->SetName(signal->GetName()); + output->GetPointData()->AddArray(spectrogram); + + // Create field data for time range + vtkNew timeRange; + timeRange->SetName("Time Range"); + timeRange->SetNumberOfValues(2); + const int nfft = static_cast(this->TimeResolution * 0.5) + 1; + timeRange->SetValue(0, (nfft - 1) / sampleRate); + timeRange->SetValue(1, (nbInRows - nfft) / sampleRate); + output->GetFieldData()->AddArray(timeRange); + + // Create field data for frequency range + vtkNew frequencyRange; + frequencyRange->SetName("Frequency Range"); + frequencyRange->SetNumberOfValues(2); + frequencyRange->SetValue(0, 0.0); + frequencyRange->SetValue(1, ((nfft - 1) * sampleRate) / this->TimeResolution); + output->GetFieldData()->AddArray(frequencyRange); + + return 1; +} + +//----------------------------------------------------------------------------- +double vtkSpectrogramFilter::ComputeSampleRate(vtkTable* input) +{ + vtkDataArray* timeArray = nullptr; + for (vtkIdType col = 0; col < input->GetNumberOfColumns(); col++) + { + vtkAbstractArray* column = input->GetColumn(col); + const char* name = column->GetName(); + if (vtksys::SystemTools::Strucmp(name, "time") == 0) + { + timeArray = vtkDataArray::SafeDownCast(column); + break; + } + } + + if (timeArray) + { + return 1.0 / (timeArray->GetTuple1(1) - timeArray->GetTuple1(0)); + } + else + { + return this->DefaultSampleRate; + } +} + +//----------------------------------------------------------------------------- +void vtkSpectrogramFilter::PrintSelf(std::ostream& os, vtkIndent indent) +{ + this->Superclass::PrintSelf(os, indent); + + switch (this->WindowType) + { + case vtkTableFFT::HANNING: + os << indent << "WindowType: Hanning" << std::endl; + break; + case vtkTableFFT::BARTLETT: + os << indent << "WindowType: Bartlett" << std::endl; + break; + case vtkTableFFT::SINE: + os << indent << "WindowType: Sine" << std::endl; + break; + case vtkTableFFT::BLACKMAN: + os << indent << "WindowType: Blackman" << std::endl; + break; + case vtkTableFFT::RECTANGULAR: + os << indent << "WindowType: Rectangular" << std::endl; + break; + default: + os << indent << "WindowType: Unknown" << std::endl; + break; + } + + os << indent << "Time Resolution:" << this->TimeResolution << std::endl; + os << indent << "Overlap Percentage:" << this->OverlapPercentage << std::endl; + os << indent << "Default Sample Rate:" << this->DefaultSampleRate << std::endl; +} diff --git a/Plugins/DSP/Filters/vtkSpectrogramFilter.h b/Plugins/DSP/Filters/vtkSpectrogramFilter.h new file mode 100644 index 00000000000..a11708d0b11 --- /dev/null +++ b/Plugins/DSP/Filters/vtkSpectrogramFilter.h @@ -0,0 +1,101 @@ +/*========================================================================= + + Plugin: DigitalSignalProcessing + Module: vtkSpectrogramFilter.h + + Copyright (c) Kitware, Inc. + All rights reserved. + See Copyright.txt or http://www.paraview.org/HTML/Copyright.html for details. + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notice for more information. + +=========================================================================*/ + +/** + * @class vtkSpectrogramFilter + * + * This filter computes the spectrogram of the input vtkTable column. + * The output is a vtkImageData where the X and Y axes correspond to time and + * frequency, respectively. + * The spectrogram is computed by applying a FFT on temporal windows each containing + * a subset of the input samples. The window size and type can be controlled with the + * time resolution and window type properties, respectively. Sample overlap between + * consecutive windows can also be specified to better capture the frequency detail + * of the input signal. + */ + +#ifndef vtkSpectrogramFilter_h +#define vtkSpectrogramFilter_h + +#include "vtkDSPFiltersPluginModule.h" // For export +#include "vtkImageAlgorithm.h" +#include "vtkTableFFT.h" // For enum + +class VTKDSPFILTERSPLUGIN_EXPORT vtkSpectrogramFilter : public vtkImageAlgorithm +{ +public: + static vtkSpectrogramFilter* New(); + vtkTypeMacro(vtkSpectrogramFilter, vtkImageAlgorithm); + void PrintSelf(ostream& os, vtkIndent indent) override; + + ///@{ + /** + * Get/set the windowing function for the FFT. + * Default is Hanning. + */ + vtkGetMacro(WindowType, int); + vtkSetClampMacro(WindowType, int, vtkTableFFT::HANNING, vtkTableFFT::RECTANGULAR); + ///@} + + ///@{ + /** + * Get/set the length of the temporal window from which to compute the spectrum. + * Default is 100 time samples. + */ + vtkGetMacro(TimeResolution, int); + vtkSetMacro(TimeResolution, int); + ///@} + + ///@{ + /** + * Get/set the percentage of overlap between consecutive temporal windows. + * Default is 50%. + */ + vtkGetMacro(OverlapPercentage, int); + vtkSetClampMacro(OverlapPercentage, int, 0, 99); + ///@} + + ///@{ + /** + * Get/set the default sampling rate in Hz. + * This value is used for the FFT if no array called "Time" (case insensitive) is present. + * Default is 10000 Hz. + */ + vtkGetMacro(DefaultSampleRate, double); + vtkSetMacro(DefaultSampleRate, double); + ///@} + +protected: + vtkSpectrogramFilter() = default; + ~vtkSpectrogramFilter() override = default; + + int FillInputPortInformation(int port, vtkInformation* info) override; + int RequestInformation(vtkInformation* request, vtkInformationVector** inputVector, + vtkInformationVector* outputVector) override; + int RequestData(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override; + + double ComputeSampleRate(vtkTable* input); + +private: + vtkSpectrogramFilter(const vtkSpectrogramFilter&) = delete; + void operator=(const vtkSpectrogramFilter&) = delete; + + int WindowType = vtkTableFFT::HANNING; + int TimeResolution = 100; + int OverlapPercentage = 50; + double DefaultSampleRate = 1e4; +}; + +#endif // vtkSpectrogramFilter_h diff --git a/Plugins/DSP/README.md b/Plugins/DSP/README.md new file mode 100644 index 00000000000..6ac891fdb34 --- /dev/null +++ b/Plugins/DSP/README.md @@ -0,0 +1,80 @@ +# Digital Signal Processing for Paraview + +This plugin aims to bring basic digital signal processing and audio preview to ParaView. +It offers a few new filters and a new dock panel. + +## General ideas and usage + +VTK pipeline and data model do not offer a very efficient way of accessing and processing temporal data on a mesh. +This is why most of the filters works on a multi-block dataset of several tables. The idea is that for a given mesh +with `n` points and `t` timesteps we create a multi-block with `n` tables inside, and each of these tables contains +`t` rows. A column of a table represents a point attribute of the input mesh. It is possible to create such a +structure in ParaView using the `Plot Data Over Time` filter on a temporal dataset, with the option +`Only Report Selection Statistics` turned off. + +**DISCLAIMER** : The current implementation of the filters in this plugin, as described above, does not +work in with multiple processes. That also means that these filters do not scale well for very large datasets. +Please use the `Extract Selection` and `Extract Timesteps` filters in order to reduce the range of your +study when needed, and only use a single `pvserver` MPI process. A rework of the architecture is needed in order +to improve the scalability of these filters. + +## New filters + +### Mean Power Spectral Density + +This filter computes the mean power spectral density (PSD) of temporal signals. +The input should be a multiblock dataset of vtkTables where each block +represents a point. Each row of the tables corresponds to a timestep. + +### Sound Quantities Calculator + +Compute the pressure RMS value (Pa and dB) as well as the acoustic power from a sound pressure (Pa) array. +Could be improved by adding more conversions. + +This filter has 2 inputs: +- port 0 is the input geometry for cell connectivity. +- port 1 is a multi-block dataset representing the data through time. Block flat index +corresponds to the index of the point in the input mesh. This kind of dataset +can be obtained e.g. by first applying the filter Plot Data Over Time with the +option "Only Report Selection Statistics" turned off. + +The output is the input geometry with the computed sound quantities attached to +it i.e. the mean pressure, the RMS pressure and the acoustic power. + +### Spectrogram + +This filter computes the spectrogram of the input vtkTable column. +The output is a vtkImageData where the X and Y axes correspond to time and +frequency, respectively. +The spectrogram is computed by applying a FFT on temporal windows each containing +a subset of the input samples. The window size and type can be controlled with the +time resolution and window type properties, respectively. + +### Project Spectrum Magnitude + +This filter computes the magnitudes of a column from a multi block +of tables (input) and places them on the points of a given mesh (source) for +a specified frequency range. + +### Merge Reduce Table Blocks + +This filter performs reduction operations such as the mean or the sum over columns +across all blocks of a multiblock of vtkTables. + +## Audio Player Panel + +The pqAudioPlayer dock widget allows to read audio retrieved from the current active source. +It will output audio to the default system audio sink. Please be carefull with your hears and +lower the volume and raise it gradually, especially if you are using earphones. + +The active source has to produce a vtkTable, containing the audio signal. Each column of the vtkTable +is interpreted as a different audio signal and can be selected in the widget. Each row represent +a sample. The sample rate is selected manually in the widget. The default value can be +automatically configured by adding a field data array in the vtkTable named "sample_rate". + +## Acknowledgement + +This work is funded by the CALM-AA European project (cofunded by the European fund for +regional development) + +![Acknowledgement](Documentation/acknowledgement.png "Acknowledgement") diff --git a/Plugins/DSP/Testing/AudioPlayer.xml b/Plugins/DSP/Testing/AudioPlayer.xml new file mode 100644 index 00000000000..2bd5a0de4ca --- /dev/null +++ b/Plugins/DSP/Testing/AudioPlayer.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Plugins/DSP/Testing/CMakeLists.txt b/Plugins/DSP/Testing/CMakeLists.txt new file mode 100644 index 00000000000..b34f4f3bc70 --- /dev/null +++ b/Plugins/DSP/Testing/CMakeLists.txt @@ -0,0 +1,43 @@ +include(FindPythonModules) +find_python_module(numpy numpy_found) +if (NOT PARAVIEW_USE_PYTHON OR NOT numpy_found) + message(STATUS "Cannot test plugin DigitalSignalProcessing, missing Python + numpy support") + return() +endif() + +set (tests_with_baselines + "${CMAKE_CURRENT_SOURCE_DIR}/MeanPowerSpectralDensity.xml" + "${CMAKE_CURRENT_SOURCE_DIR}/MergeReduceTableBlocks.xml" + "${CMAKE_CURRENT_SOURCE_DIR}/ProjectSpectrumMagnitude.xml" + "${CMAKE_CURRENT_SOURCE_DIR}/SoundQuantities.xml" + "${CMAKE_CURRENT_SOURCE_DIR}/Spectrogram.xml") +set (SoundQuantities_FORCE_SERIAL TRUE) + +paraview_add_client_tests( + LOAD_PLUGIN "DigitalSignalProcessing" + BASELINE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/Data/Baseline" + TEST_DATA_TARGET ParaViewData + TEST_SCRIPTS "${tests_with_baselines}") + +# server tests are disabled for now until the MPI version are +# implemented for the following filters : +# - SoundQuantities +# - MergeReduceTableBlocks +# - ProjectSpectrumMagnitude +# - MeanPowerSpectralDensity + +# add test dependant to Qt +if (PARAVIEW_USE_QT AND PARAVIEW_PLUGIN_dsp_enable_audio_player AND numpy_found) + paraview_add_client_tests( + LOAD_PLUGIN "DigitalSignalProcessing" + TEST_DATA_TARGET ParaViewData + TEST_SCRIPTS "${CMAKE_CURRENT_SOURCE_DIR}/AudioPlayer.xml") + paraview_add_client_server_tests( + LOAD_PLUGIN "DigitalSignalProcessing" + TEST_DATA_TARGET ParaViewData + TEST_SCRIPTS "${CMAKE_CURRENT_SOURCE_DIR}/AudioPlayer.xml") + paraview_add_client_server_render_tests( + LOAD_PLUGIN "DigitalSignalProcessing" + TEST_DATA_TARGET ParaViewData + TEST_SCRIPTS "${CMAKE_CURRENT_SOURCE_DIR}/AudioPlayer.xml") +endif() diff --git a/Plugins/DSP/Testing/Data/Baseline/MeanPowerSpectralDensity.png.sha512 b/Plugins/DSP/Testing/Data/Baseline/MeanPowerSpectralDensity.png.sha512 new file mode 100644 index 00000000000..a9617a0581d --- /dev/null +++ b/Plugins/DSP/Testing/Data/Baseline/MeanPowerSpectralDensity.png.sha512 @@ -0,0 +1 @@ +0a8603e5c882e7563ee7a4cda846eb7df0f50dbb57af064c6a2969ae700faeeaa560a54904fe57306b6175304139785f59c2f1feaa9ddd1ec1e02c61659e717e diff --git a/Plugins/DSP/Testing/Data/Baseline/MergeReduceTableBlocks.png.sha512 b/Plugins/DSP/Testing/Data/Baseline/MergeReduceTableBlocks.png.sha512 new file mode 100644 index 00000000000..8486384bfe1 --- /dev/null +++ b/Plugins/DSP/Testing/Data/Baseline/MergeReduceTableBlocks.png.sha512 @@ -0,0 +1 @@ +3cdb7895e57a95cb438d14044976d514f3216759b16eb6c13f93d11860b0b439ed88fda93a2f751b95db9951f72fb1a48b737005174e8a8ab6d4df0e07c06baa diff --git a/Plugins/DSP/Testing/Data/Baseline/ProjectSpectrumMagnitude.png.sha512 b/Plugins/DSP/Testing/Data/Baseline/ProjectSpectrumMagnitude.png.sha512 new file mode 100644 index 00000000000..30fa27603da --- /dev/null +++ b/Plugins/DSP/Testing/Data/Baseline/ProjectSpectrumMagnitude.png.sha512 @@ -0,0 +1 @@ +d0ea387f96f331b9de4e2504aba3523ad30d89aa706612ccef742244f1187efc5e44020b5717e7b0438f7846f286bf6deaeaf7c170ce1dc696059f2e8549dd75 diff --git a/Plugins/DSP/Testing/Data/Baseline/SoundQuantities.png.sha512 b/Plugins/DSP/Testing/Data/Baseline/SoundQuantities.png.sha512 new file mode 100644 index 00000000000..353c6f3b249 --- /dev/null +++ b/Plugins/DSP/Testing/Data/Baseline/SoundQuantities.png.sha512 @@ -0,0 +1 @@ +656eb31038f70c596854c99e13a08e0418030d638ce14450abc2adc936b2e783d95bd435c90d1437fa4bad7f41e699fc9ecea420370b5ac67a9a76768b158f7f diff --git a/Plugins/DSP/Testing/Data/Baseline/Spectrogram.png.sha512 b/Plugins/DSP/Testing/Data/Baseline/Spectrogram.png.sha512 new file mode 100644 index 00000000000..08f8b8dedd8 --- /dev/null +++ b/Plugins/DSP/Testing/Data/Baseline/Spectrogram.png.sha512 @@ -0,0 +1 @@ +40580856998a8d5f3f71ba50a5403d6c3f0391329526143be339d917ea977e364f04ed18fd6e46a561f5cb1286e712b732cea3c119628dcb3d80e6e212e4b9c0 diff --git a/Plugins/DSP/Testing/MeanPowerSpectralDensity.xml b/Plugins/DSP/Testing/MeanPowerSpectralDensity.xml new file mode 100644 index 00000000000..fd51fc57393 --- /dev/null +++ b/Plugins/DSP/Testing/MeanPowerSpectralDensity.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Plugins/DSP/Testing/MergeReduceTableBlocks.xml b/Plugins/DSP/Testing/MergeReduceTableBlocks.xml new file mode 100644 index 00000000000..86192278e89 --- /dev/null +++ b/Plugins/DSP/Testing/MergeReduceTableBlocks.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Plugins/DSP/Testing/ProjectSpectrumMagnitude.xml b/Plugins/DSP/Testing/ProjectSpectrumMagnitude.xml new file mode 100644 index 00000000000..211a26c7d21 --- /dev/null +++ b/Plugins/DSP/Testing/ProjectSpectrumMagnitude.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Plugins/DSP/Testing/SoundQuantities.xml b/Plugins/DSP/Testing/SoundQuantities.xml new file mode 100644 index 00000000000..dcc4441a8d3 --- /dev/null +++ b/Plugins/DSP/Testing/SoundQuantities.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Plugins/DSP/Testing/Spectrogram.xml b/Plugins/DSP/Testing/Spectrogram.xml new file mode 100644 index 00000000000..a9e04fa4ff2 --- /dev/null +++ b/Plugins/DSP/Testing/Spectrogram.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/Plugins/DSP/paraview.plugin b/Plugins/DSP/paraview.plugin new file mode 100644 index 00000000000..db2f16614eb --- /dev/null +++ b/Plugins/DSP/paraview.plugin @@ -0,0 +1,11 @@ +NAME + DigitalSignalProcessing +DESCRIPTION + Digital Signal Processing Plugin : provides basic signal processing filters as well as an audio player dock. +REQUIRES_MODULES + VTK::CommonCore + VTK::CommonDataModel + VTK::CommonExecutionModel + VTK::FiltersGeneral + VTK::FiltersCore + VTK::FiltersExtraction diff --git a/Plugins/DSP/pqAudioPlayer.cxx b/Plugins/DSP/pqAudioPlayer.cxx new file mode 100644 index 00000000000..57cff7b5fdf --- /dev/null +++ b/Plugins/DSP/pqAudioPlayer.cxx @@ -0,0 +1,659 @@ +/*========================================================================= + + Plugin: DigitalSignalProcessing + Module: pqAudioPlayer.cxx + + Copyright (c) Kitware, Inc. + All rights reserved. + See Copyright.txt or http://www.paraview.org/HTML/Copyright.html for details. + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notice for more information. + +=========================================================================*/ + +#include "pqAudioPlayer.h" +#include "ui_pqAudioPlayer.h" + +#include +#include +#include +#include +#include + +#include "vtkSMPTools.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace +{ +template +void fillByteArray(ArrayType* signal, unsigned int sampleSize, QByteArray* byteArray) +{ + // Fill byte array + vtkIdType numberOfSamples = signal->GetNumberOfValues(); + byteArray->resize(sampleSize * numberOfSamples); + + vtkSMPTools::For(0, numberOfSamples, [&](unsigned int begin, unsigned int end) { + const auto range = vtk::DataArrayValueRange<1>(signal, begin, end); + unsigned int byteIdx = begin * sampleSize; + for (const auto sample : range) + { + ValueType s = static_cast(sample); + char* bytePtr = reinterpret_cast(&s); + for (unsigned int i = 0; i < sampleSize; i++) + { + (*byteArray)[byteIdx++] = *(bytePtr + i); + } + } + }); +} + +struct SetupAndFill +{ + using SIntegers = vtkTypeList::Create; + using UIntegers = vtkTypeList::Create; + + // Signed integers + template , + typename std::enable_if::Result != -1>::type* = + nullptr> + void operator()(ArrayType* signal, unsigned int& sampleSize, QAudioFormat::SampleType& sampleType, + QByteArray* byteArray) + { + sampleSize = sizeof(ValueType); + sampleType = QAudioFormat::SignedInt; + fillByteArray(signal, sampleSize, byteArray); + } + + // Unsigned integers + template , + typename std::enable_if::Result != -1>::type* = + nullptr> + void operator()(ArrayType* signal, unsigned int& sampleSize, QAudioFormat::SampleType& sampleType, + QByteArray* byteArray) + { + sampleSize = sizeof(ValueType); + sampleType = QAudioFormat::UnSignedInt; + fillByteArray(signal, sampleSize, byteArray); + } + + // Floating types : cast double to float + template , + typename std::enable_if::Result != + -1>::type* = nullptr> + void operator()(ArrayType* signal, unsigned int& sampleSize, QAudioFormat::SampleType& sampleType, + QByteArray* byteArray) + { + sampleSize = sizeof(float); + sampleType = QAudioFormat::Float; + fillByteArray(signal, sampleSize, byteArray); + } +}; +} + +//============================================================================= +class pqAudioPlayer::pqInternals : public Ui::pqAudioPlayer +{ +public: + pqInternals(); + ~pqInternals(); + + /** + * @brief Play the current audio buffer. + */ + void play(); + + /** + * @brief Suspend the current audio stream. + */ + void pause(); + + /** + * @brief Go to the beginning of the audio buffer. + */ + void rewind(); + + /** + * @brief Set the volume to the desired value, + * expressed as a percentage of the original signal volume. + * The value will be clamped between 0 and 100. + */ + void setVolume(int value); + + /** + * @brief Fetch data and prepare the internal structures. + * @return True if the setup was succesfully done. + * + * If the output of the active source is a vtkTable, + * fetch the data from it (selected column containing audio samples) + * and prepare internal buffers and audio objects with it. + */ + bool fetchAndPrepareData(); + + /** + * @brief Update the UI with the currently available meta-data. + * @return True if data is available. + * + * Update the name of the active source displayed in the dock widget and + * fill the combo-box with the available data arrays. + */ + bool fetchMetaData(); + + /** + * @brief Enable/Disable the play/pause button. + */ + void enablePlayerPanel(bool enable = true); + + /** + * @brief Convenience method to swap from pause to play button. + */ + void swapToPlayButton(bool play = true); + + vtkWeakPointer ActiveSourceProxy; + std::string ArrayName; + QSharedPointer AudioBuffer; + QSharedPointer AudioOutput; + QScopedPointer ByteArray; + int DefaultSampleRate = 44100; + bool NeedUpdate = false; +}; + +//----------------------------------------------------------------------------- +pqAudioPlayer::pqInternals::pqInternals() + : ByteArray(new QByteArray()) +{ + pqCoreUtilities::promptUser("pqAudioPlayer", QMessageBox::Information, + "Audio Player Volume Information", + "You are currently using the Audio Player Dock Widget.\n\n" + "To prevent any damage to your audition, please leave the original volume " + "value of the audio player unchanged (5%) when trying to read some data " + "for the first time, and adjust it afterwards if needed.", + QMessageBox::Ok | QMessageBox::Save); +} + +//----------------------------------------------------------------------------- +pqAudioPlayer::pqInternals::~pqInternals() +{ + if (this->AudioOutput) + { + this->AudioOutput->stop(); + } + this->AudioOutput.clear(); + + if (this->AudioBuffer) + { + this->AudioBuffer->close(); + } + this->AudioBuffer.clear(); +} + +//----------------------------------------------------------------------------- +void pqAudioPlayer::pqInternals::play() +{ + if (!this->AudioOutput) + { + return; + } + this->AudioOutput->start(this->AudioBuffer.get()); +} + +//----------------------------------------------------------------------------- +void pqAudioPlayer::pqInternals::pause() +{ + if (!this->AudioOutput) + { + return; + } + this->AudioOutput->suspend(); +} + +//----------------------------------------------------------------------------- +void pqAudioPlayer::pqInternals::rewind() +{ + if (!this->AudioOutput) + { + return; + } + + // Pause and go to the beginning of the audio buffer + this->AudioOutput->suspend(); + this->AudioBuffer->seek(0); +} + +//----------------------------------------------------------------------------- +void pqAudioPlayer::pqInternals::setVolume(int value) +{ + this->VolumeValueLabel->setText(QString::number(value) + " %"); + + if (!this->AudioOutput) + { + return; + } + + // Convert from logarithmic to linear scale + qreal linearVolume = QAudio::convertVolume( + value / qreal(100.0), QAudio::LogarithmicVolumeScale, QAudio::LinearVolumeScale); + + this->AudioOutput->setVolume(linearVolume); +} + +//----------------------------------------------------------------------------- +bool pqAudioPlayer::pqInternals::fetchAndPrepareData() +{ + // Stop player, clean current audio output and audio buffer (if any) + if (this->AudioOutput) + { + this->AudioOutput->stop(); + this->AudioOutput.clear(); + this->AudioBuffer->close(); + this->AudioBuffer.clear(); + } + + // If there is no current active source, no need to continue + if (!this->ActiveSourceProxy) + { + return false; + } + + // Fetch the data from the output of the active source + pqServer* server = pqActiveObjects::instance().activeServer(); + vtkSMSessionProxyManager* pxm = server->proxyManager(); + + vtkSmartPointer dataMoverProxy = + vtk::TakeSmartPointer(pxm->NewProxy("misc", "DataMover")); + vtkSMPropertyHelper(dataMoverProxy, "Producer").Set(this->ActiveSourceProxy); + dataMoverProxy->UpdateVTKObjects(); + dataMoverProxy->InvokeCommand("Execute"); + vtkPVDataMover* dataMover = vtkPVDataMover::SafeDownCast(dataMoverProxy->GetClientSideObject()); + + if (dataMover->GetNumberOfDataSets() == 0) + { + qWarning("No data to read sound from."); + return false; + } + + vtkDataObject* activeObject = dataMover->GetDataSetAtIndex(0); + vtkTable* activeTable = vtkTable::SafeDownCast(activeObject); + if (!activeTable) + { + qWarning("No table to read sound from."); + return false; + } + + // Retrieve the audio signal from the vtkTable + std::string arrayName = this->DataSelectionComboBox->currentText().toStdString(); + vtkAbstractArray* column = activeTable->GetColumnByName(arrayName.c_str()); + + vtkDataArray* signal = vtkDataArray::SafeDownCast(column); + if (!signal) + { + qWarning("Unable to retrieve the signal from the table."); + return false; + } + if (signal->GetNumberOfValues() <= 0) + { + qWarning("The signal is empty (no samples to read)."); + return false; + } + + // Find the right audio format parameters and fill the byte buffer. + // This step depends on the signal value type so we fall back on an array dispatcher. + using SupportedTypes = vtkTypeList::Create; + using Dispatcher = vtkArrayDispatch::DispatchByValueType; + + SetupAndFill worker; + unsigned int sampleSize = 0; // In bytes + QAudioFormat::SampleType sampleType = QAudioFormat::Unknown; + + if (!Dispatcher::Execute(signal, worker, sampleSize, sampleType, this->ByteArray.get())) + { + qWarning("Unable to process input signal."); + return false; + } + + // Setup audio format + QAudioFormat audioFormat; + audioFormat.setSampleRate(this->SampleRateSpinBox->value()); + audioFormat.setChannelCount(1); + audioFormat.setSampleSize(sampleSize * 8); // In bits + audioFormat.setCodec("audio/pcm"); + audioFormat.setByteOrder(QAudioFormat::LittleEndian); + audioFormat.setSampleType(sampleType); + + // Look for a device that supports the format + bool found = false; + QAudioDeviceInfo foundDeviceInfo; + const auto deviceInfos = QAudioDeviceInfo::availableDevices(QAudio::AudioOutput); + for (const QAudioDeviceInfo& deviceInfo : deviceInfos) + { + if (deviceInfo.isFormatSupported(audioFormat)) + { + foundDeviceInfo = deviceInfo; + found = true; + break; + } + } + if (!found) + { + qWarning() << "This audio format not supported by any of your audio devices " + "(sample rate = " + << audioFormat.sampleRate() + << " Hz, " + "sample size = " + << audioFormat.sampleSize() + << " bits, " + "sample type = " + << audioFormat.sampleType() << ")."; + return false; + } + + // Setup final audio buffer + this->AudioBuffer = QSharedPointer(new QBuffer(this->ByteArray.get())); + this->AudioBuffer->open(QIODevice::ReadOnly); + + // Setup audio output + this->AudioOutput = QSharedPointer(new QAudioOutput(foundDeviceInfo, audioFormat)); + this->setVolume(this->VolumeSlider->value()); + + return true; +} + +//----------------------------------------------------------------------------- +bool pqAudioPlayer::pqInternals::fetchMetaData() +{ + // Retrieve the active source proxy + if (!this->ActiveSourceProxy) + { + // Add bold style + this->SourcePanel->setText("None\n"); + this->DataSelectionComboBox->clear(); + return false; + } + + // Retrieve and update in the UI the name of the active source + QString sourceName(this->ActiveSourceProxy->GetLogName()); + // Add bold style + this->SourcePanel->setText("" + sourceName + "\n"); + + // Retrieve meta-data from the active source + vtkPVDataInformation* sourceInfo = this->ActiveSourceProxy->GetDataInformation(); + if (!sourceInfo) + { + qWarning("Failed to retrieve information from the source proxy."); + return false; + } + + // Retrieve the sample rate (if it exists) + vtkPVDataSetAttributesInformation* fieldInfo = + sourceInfo->GetAttributeInformation(vtkDataObject::FIELD); + if (!fieldInfo) + { + qWarning("Failed to retrieve field information from the source proxy."); + return false; + } + + // Default sample rate if no meta-data about it is found + this->DefaultSampleRate = 41000; + + // Update the sample rate shown in + vtkPVArrayInformation* sampleRateArrayInfo = fieldInfo->GetArrayInformation("sample_rate"); + + if (sampleRateArrayInfo) + { + if (sampleRateArrayInfo->GetNumberOfComponents() != 1 || + sampleRateArrayInfo->GetNumberOfTuples() != 1) + { + qInfo() << "Sample rate data is ill-formed - skipping"; + } + else + { + double value = sampleRateArrayInfo->GetComponentRange(0)[0]; + if (value <= 0) + { + qInfo() << "Sample rate must be a stricly positive value - skipping"; + } + this->DefaultSampleRate = static_cast(value); + } + } + + // Set default value to the sample rate + this->SampleRateSpinBox->setValue(this->DefaultSampleRate); + + // Retrieve the columns (audio signals) from the table + vtkPVDataSetAttributesInformation* rowInfo = + sourceInfo->GetAttributeInformation(vtkDataObject::ROW); + if (!rowInfo) + { + qWarning("Failed to retrieve row information from the source proxy."); + return false; + } + + // Update the data shown in the combo-box + this->DataSelectionComboBox->clear(); + for (int i = 0; i < rowInfo->GetNumberOfArrays(); i++) + { + const char* arrayName = rowInfo->GetArrayInformation(i)->GetName(); + this->DataSelectionComboBox->addItem(arrayName); + } + + return true; +} + +//----------------------------------------------------------------------------- +void pqAudioPlayer::pqInternals::enablePlayerPanel(bool enable) +{ + this->PlayButton->setEnabled(enable); + this->PauseButton->setEnabled(enable); +} + +//----------------------------------------------------------------------------- +void pqAudioPlayer::pqInternals::swapToPlayButton(bool play) +{ + this->PauseButton->setVisible(!play); + this->PlayButton->setVisible(play); +} + +//----------------------------------------------------------------------------- +pqAudioPlayer::pqAudioPlayer(const QString& title, QWidget* parent) + : Superclass(title, parent) + , Internals(new pqAudioPlayer::pqInternals()) +{ + this->constructor(); +} + +//----------------------------------------------------------------------------- +pqAudioPlayer::pqAudioPlayer(QWidget* parent) + : Superclass(parent) + , Internals(new pqAudioPlayer::pqInternals()) +{ + this->constructor(); +} + +//----------------------------------------------------------------------------- +pqAudioPlayer::~pqAudioPlayer() = default; + +//----------------------------------------------------------------------------- +void pqAudioPlayer::constructor() +{ + this->setWindowTitle("Audio Player"); + QWidget* widget = new QWidget(this); + this->Internals->setupUi(widget); + this->setWidget(widget); + + QObject::connect(&pqActiveObjects::instance(), &pqActiveObjects::sourceChanged, this, + &pqAudioPlayer::onActiveSourceChanged); + QObject::connect(&pqActiveObjects::instance(), &pqActiveObjects::dataUpdated, this, + &pqAudioPlayer::onPipelineUpdated); + + QObject::connect( + this->Internals->PlayButton, &QPushButton::clicked, this, &pqAudioPlayer::onPlayButtonClicked); + QObject::connect(this->Internals->PauseButton, &QPushButton::clicked, this, + &pqAudioPlayer::onPauseButtonClicked); + QObject::connect( + this->Internals->StopButton, &QPushButton::clicked, this, &pqAudioPlayer::onStopButtonClicked); + QObject::connect(this->Internals->ResetButton, &QPushButton::clicked, this, + &pqAudioPlayer::onResetButtonClicked); + QObject::connect(this->Internals->DataSelectionComboBox, &QComboBox::currentTextChanged, this, + &pqAudioPlayer::onParametersChanged); + QObject::connect(this->Internals->SampleRateSpinBox, QOverload::of(&QSpinBox::valueChanged), + this, &pqAudioPlayer::onParametersChanged); + QObject::connect( + this->Internals->VolumeSlider, &QSlider::valueChanged, this, &pqAudioPlayer::onVolumeChanged); + + this->Internals->enablePlayerPanel(false); + this->Internals->swapToPlayButton(); + this->Internals->StopButton->setEnabled(false); +} + +//----------------------------------------------------------------------------- +void pqAudioPlayer::onPlayButtonClicked() +{ + // First, check if the data need to be updated + if (this->Internals->NeedUpdate) + { + // Fetch data and setup internal structures + if (!this->Internals->fetchAndPrepareData()) + { + qWarning() << "Unable to retrieve the audio signal."; + return; + } + } + + // For monitoring the AudioOutput internal state + QObject::connect(this->Internals->AudioOutput.get(), &QAudioOutput::stateChanged, this, + &pqAudioPlayer::onPlayerStateChanged); + + // Update UI + this->Internals->swapToPlayButton(false); + if (!this->Internals->StopButton->isEnabled()) + { + this->Internals->StopButton->setEnabled(true); + } + + // Play + this->Internals->play(); + this->Internals->NeedUpdate = false; +} + +//----------------------------------------------------------------------------- +void pqAudioPlayer::onPauseButtonClicked() +{ + // Update UI + this->Internals->swapToPlayButton(); + this->Internals->PlayButton->show(); + + // Pause + this->Internals->pause(); +} + +//----------------------------------------------------------------------------- +void pqAudioPlayer::onStopButtonClicked() +{ + // Update UI + this->Internals->swapToPlayButton(); + this->Internals->StopButton->setEnabled(false); + + // Rewind + this->Internals->rewind(); +} + +//----------------------------------------------------------------------------- +void pqAudioPlayer::onPlayerStateChanged(QAudio::State newState) +{ + switch (newState) + { + case QAudio::IdleState: + // Finished playing (no more data) + this->onStopButtonClicked(); + break; + default: + break; + } +} + +//----------------------------------------------------------------------------- +void pqAudioPlayer::onActiveSourceChanged(pqPipelineSource* activeSource) +{ + // Check if we have an active source + if (!activeSource) + { + this->Internals->ActiveSourceProxy = nullptr; + } + else + { + // Store the active source proxy + this->Internals->ActiveSourceProxy = vtkSMSourceProxy::SafeDownCast(activeSource->getProxy()); + if (!this->Internals->ActiveSourceProxy) + { + qCritical("Unable to retrieve the active source proxy from the active source."); + } + } + + // Update meta-data + this->onPipelineUpdated(); +} + +//----------------------------------------------------------------------------- +void pqAudioPlayer::onPipelineUpdated() +{ + // Update available data + if (!this->Internals->fetchMetaData()) + { + this->Internals->enablePlayerPanel(false); + return; + } + this->Internals->enablePlayerPanel(); + this->Internals->VolumeSlider->setValue(5); + this->Internals->NeedUpdate = true; +} + +//----------------------------------------------------------------------------- +void pqAudioPlayer::onResetButtonClicked() +{ + this->Internals->SampleRateSpinBox->setValue(this->Internals->DefaultSampleRate); +} + +//----------------------------------------------------------------------------- +void pqAudioPlayer::onParametersChanged() +{ + this->Internals->NeedUpdate = true; +} + +//----------------------------------------------------------------------------- +void pqAudioPlayer::onVolumeChanged(int value) +{ + this->Internals->setVolume(value); +} diff --git a/Plugins/DSP/pqAudioPlayer.h b/Plugins/DSP/pqAudioPlayer.h new file mode 100644 index 00000000000..07dbe33e357 --- /dev/null +++ b/Plugins/DSP/pqAudioPlayer.h @@ -0,0 +1,81 @@ +/*========================================================================= + + Plugin: DigitalSignalProcessing + Module: pqAudioPlayer.h + + Copyright (c) Kitware, Inc. + All rights reserved. + See Copyright.txt or http://www.paraview.org/HTML/Copyright.html for details. + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notice for more information. + +=========================================================================*/ + +#ifndef pqAudioPlayer_h +#define pqAudioPlayer_h + +#include +#include + +class pqPipelineSource; + +/** + * @brief The pqAudioPlayer dock widget allows to read audio data from the current active source. + * + * The pqAudioPlayer dock widget allows to read audio retrieved from the current active source. + * The source has to produce a vtkTable, containing the audio signal. Each column of the vtkTable + * is interpreted as a different audio signal and can be selected in the widget. Each row represent + * a sample. The sample rate is selected manually in the widget. The default value can be + * automatically configured by adding a field data array in the vtkTable named "sample_rate", + * containing the value. + * + * Limitation : for now, the player only handles audio signals composed of shorts (vtkShortArray + * attributes). + */ + +class pqAudioPlayer : public QDockWidget +{ + Q_OBJECT + typedef QDockWidget Superclass; + +public: + pqAudioPlayer(QWidget* parent = nullptr); + pqAudioPlayer(const QString& title, QWidget* parent = nullptr); + + ~pqAudioPlayer() override; + +protected Q_SLOTS: + ///@{ + /** + * Slots handling UI signals + */ + void onPlayButtonClicked(); + void onPauseButtonClicked(); + void onStopButtonClicked(); + void onApplyButtonClicked(); + void onResetButtonClicked(); + void onParametersChanged(); + void onVolumeChanged(int value); + ///@} + + ///@{ + /** + * Slots handling application state changes + */ + void onPlayerStateChanged(QAudio::State newState); + void onActiveSourceChanged(pqPipelineSource* activeSource); + void onPipelineUpdated(); + ///@} + +private: + Q_DISABLE_COPY(pqAudioPlayer) + + class pqInternals; + QScopedPointer Internals; + + void constructor(); +}; + +#endif // pqAudioPlayer_h diff --git a/Plugins/DSP/pqAudioPlayer.ui b/Plugins/DSP/pqAudioPlayer.ui new file mode 100644 index 00000000000..bed7782cf39 --- /dev/null +++ b/Plugins/DSP/pqAudioPlayer.ui @@ -0,0 +1,195 @@ + + + pqAudioPlayer + + + + 0 + 0 + 278 + 351 + + + + Form + + + + + + + + Play + + + + + + + Pause + + + + + + + Stop + + + + + + + + + Volume + + + + + + + QFrame::NoFrame + + + QFrame::Plain + + + 5 % + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + 100 + + + 5 + + + Qt::Horizontal + + + + + + + 2 + + + Qt::Horizontal + + + + + + + Source + + + + + + + QFrame::WinPanel + + + QFrame::Sunken + + + 1 + + + + <span style=" font-weight:600;">None</span> + + + + Qt::RichText + + + Qt::AlignCenter + + + + + + + + + + + 0 + 0 + + + + Sample Rate (Hz) + + + + + + + + + + 0 + 0 + + + + 1 + + + 1000000 + + + 1000 + + + 41000 + + + + + + + + 0 + 0 + + + + Reset + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + From 49db2f9dc2d35765e7a178df1a4126ab23858723 Mon Sep 17 00:00:00 2001 From: Timothee Chabat Date: Tue, 13 Dec 2022 11:41:05 +0100 Subject: [PATCH 2/5] AudioPlayer: prefer default output device for audio --- Plugins/DSP/pqAudioPlayer.cxx | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/Plugins/DSP/pqAudioPlayer.cxx b/Plugins/DSP/pqAudioPlayer.cxx index 57cff7b5fdf..f0be8845a30 100644 --- a/Plugins/DSP/pqAudioPlayer.cxx +++ b/Plugins/DSP/pqAudioPlayer.cxx @@ -354,19 +354,25 @@ bool pqAudioPlayer::pqInternals::fetchAndPrepareData() audioFormat.setSampleType(sampleType); // Look for a device that supports the format - bool found = false; - QAudioDeviceInfo foundDeviceInfo; - const auto deviceInfos = QAudioDeviceInfo::availableDevices(QAudio::AudioOutput); - for (const QAudioDeviceInfo& deviceInfo : deviceInfos) + QAudioDeviceInfo foundDeviceInfo = QAudioDeviceInfo::defaultOutputDevice(); + if (!foundDeviceInfo.isFormatSupported(audioFormat)) { - if (deviceInfo.isFormatSupported(audioFormat)) + const auto deviceInfos = QAudioDeviceInfo::availableDevices(QAudio::AudioOutput); + for (const QAudioDeviceInfo& deviceInfo : deviceInfos) { - foundDeviceInfo = deviceInfo; - found = true; - break; + if (!deviceInfo.isNull() && deviceInfo != foundDeviceInfo && + deviceInfo.isFormatSupported(audioFormat)) + { + qInfo() << "Switched audio device from default '" << foundDeviceInfo.deviceName() + << "' to '" << deviceInfo.deviceName() << "'"; + foundDeviceInfo = deviceInfo; + break; + } } } - if (!found) + + // If we still couldn't find a device that supports the output format then abort + if (!foundDeviceInfo.isFormatSupported(audioFormat)) { qWarning() << "This audio format not supported by any of your audio devices " "(sample rate = " @@ -536,6 +542,12 @@ void pqAudioPlayer::constructor() this->Internals->enablePlayerPanel(false); this->Internals->swapToPlayButton(); this->Internals->StopButton->setEnabled(false); + + // Make sure it is working properly when launching the plugin after we created a source + if (auto* source = pqActiveObjects::instance().activeSource()) + { + this->onActiveSourceChanged(source); + } } //----------------------------------------------------------------------------- From 871c0724fa959393addf3a23920ebf4357e17d41 Mon Sep 17 00:00:00 2001 From: Timothee Chabat Date: Tue, 13 Dec 2022 12:06:44 +0100 Subject: [PATCH 3/5] WarnOnCreate: update usage of deprecated syntax Deprecation introduced in https://gitlab.kitware.com/paraview/paraview/-/merge_requests/5994 --- .../Resources/filters_filtersextraction.xml | 10 ++++++---- .../Resources/filters_filtersgeneral.xml | 10 ++++++---- .../Resources/filters_filtersparallel.xml | 20 +++++++++++-------- 3 files changed, 24 insertions(+), 16 deletions(-) diff --git a/Remoting/Application/Resources/filters_filtersextraction.xml b/Remoting/Application/Resources/filters_filtersextraction.xml index f9e1e2868d4..c243987de08 100644 --- a/Remoting/Application/Resources/filters_filtersextraction.xml +++ b/Remoting/Application/Resources/filters_filtersextraction.xml @@ -564,10 +564,12 @@ - - **Extract Particles Over Time** filter needs to process all timesteps - available in your dataset and can potentially take a long time to complete. - Do you want to continue? + + + **Extract Particles Over Time** filter needs to process all timesteps + available in your dataset and can potentially take a long time to complete. + Do you want to continue? + diff --git a/Remoting/Application/Resources/filters_filtersgeneral.xml b/Remoting/Application/Resources/filters_filtersgeneral.xml index 2c6612ef24f..70c331a0c49 100644 --- a/Remoting/Application/Resources/filters_filtersgeneral.xml +++ b/Remoting/Application/Resources/filters_filtersgeneral.xml @@ -1917,10 +1917,12 @@ variable over time. - - **Temporal Statistics** filter needs to process all timesteps - available in your dataset and can potentially take a long time to complete. - Do you want to continue? + + + **Temporal Statistics** filter needs to process all timesteps + available in your dataset and can potentially take a long time to complete. + Do you want to continue? + diff --git a/Remoting/Application/Resources/filters_filtersparallel.xml b/Remoting/Application/Resources/filters_filtersparallel.xml index 42778521e83..6cabdeedeff 100644 --- a/Remoting/Application/Resources/filters_filtersparallel.xml +++ b/Remoting/Application/Resources/filters_filtersparallel.xml @@ -1724,10 +1724,12 @@ - - **Plot Selection Over Time** filter needs to process all timesteps - available in your dataset and can potentially take a long time to complete. - Do you want to continue? + + + **Plot Selection Over Time** filter needs to process all timesteps + available in your dataset and can potentially take a long time to complete. + Do you want to continue? + @@ -1782,10 +1784,12 @@ - - **Plot Data Over Time** filter needs to process all timesteps - available in your dataset and can potentially take a long time to complete. - Do you want to continue? + + + **Plot Data Over Time** filter needs to process all timesteps + available in your dataset and can potentially take a long time to complete. + Do you want to continue? + From 5502d42c601b4421128350f9f510ee641e7d9cdb Mon Sep 17 00:00:00 2001 From: Timothee Chabat Date: Tue, 13 Dec 2022 15:20:05 +0100 Subject: [PATCH 4/5] Improve default data to not plot - Make Frequency less strict so it works for multiblocks - Do not plot point coordinates by default because you usually don't want that --- Remoting/Views/vtkSMChartSeriesSelectionDomain.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Remoting/Views/vtkSMChartSeriesSelectionDomain.cxx b/Remoting/Views/vtkSMChartSeriesSelectionDomain.cxx index 5b8b4df9689..b32f15254e5 100644 --- a/Remoting/Views/vtkSMChartSeriesSelectionDomain.cxx +++ b/Remoting/Views/vtkSMChartSeriesSelectionDomain.cxx @@ -58,7 +58,7 @@ static void InitSeriesVisibilityDefaults() const char* defaults[] = { "^arc_length", "^bin_extents", "^FileId", "^GlobalElementId", "^GlobalNodeId", "^ObjectId", "^object_id", "^Pedigree.*", "^Points_.*", "^Time", "^vtkOriginal.*", "^ids$", "^ids .*", "^vtkValidPointMask", "^N .*", "^X$", "^X .*", "^Y$", - "^Y .*", "^Z$", "^Z .*", "^vtkGhostType$", "^Frequency$", nullptr }; + "^Y .*", "^Z$", "^Z .*", "^vtkGhostType$", "^Frequency", "^Point Coordinates", nullptr }; for (int cc = 0; defaults[cc] != nullptr; cc++) { SeriesVisibilityDefaults.push_back( From b871a51db813b8bc355457ec3517c5e71e8f7291 Mon Sep 17 00:00:00 2001 From: Timothee Chabat Date: Tue, 13 Dec 2022 15:27:30 +0100 Subject: [PATCH 5/5] DSPPlugin: improve README with images --- Plugins/DSP/Documentation/acknowledgement.png | Bin 0 -> 74228 bytes Plugins/DSP/Documentation/example_pipeline.png | Bin 0 -> 109907 bytes Plugins/DSP/Documentation/pipeline_results.png | Bin 0 -> 112409 bytes Plugins/DSP/README.md | 11 +++++++++++ 4 files changed, 11 insertions(+) create mode 100644 Plugins/DSP/Documentation/acknowledgement.png create mode 100644 Plugins/DSP/Documentation/example_pipeline.png create mode 100644 Plugins/DSP/Documentation/pipeline_results.png diff --git a/Plugins/DSP/Documentation/acknowledgement.png b/Plugins/DSP/Documentation/acknowledgement.png new file mode 100644 index 0000000000000000000000000000000000000000..28f1de0eb33bd17ba1ff55980c1f6b9555e4e792 GIT binary patch literal 74228 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 literal 0 HcmV?d00001 diff --git a/Plugins/DSP/Documentation/example_pipeline.png b/Plugins/DSP/Documentation/example_pipeline.png new file mode 100644 index 0000000000000000000000000000000000000000..c009d65bc8b53685baff0316d9a4887e55767f0d GIT binary patch literal 109907 zcmce;byQU0_da?6MMR}hN>DnaTT1Ch7zU)JySouY8l=0W1_9{?gNC7oPN_kb2Q85Wha3Q20CJLV)jcw{Gu?fNp_jMW+|Jfs;>-^} z(#q~BeI-moM?Y}NChKichX)d&6};zgDS0TXAiH;RDulYe zA&Jwq`y~>j&-3HxCP*{oDwW%OhI=T(8R-+Cw&@_Sxw*;sD7haBf&5NroZsEtv??4} zIZ%f}IZZ{gE2^sEn2xScYinzYsV}fhO-&V38N&+-3KUac^>=o5DyHT!GAL(!=;Kjh zVP-b!V=M>`4#qT1E95kll9GbKxJ<#F!t*#x!9(I`Il<#i^BB2I!PEJ*XET)+7w=#A zC~85WiIZEVeX!C}5lUQ$1_ZL=)R7im7-o3Zr^A~2J#=nnV7-B$J{(bc2`^OUEyS-k>PW>3ezS|3r*5-p%@V{dT_&93C z{~h~~JVpEEe@^!#zI)~13Kd7|DV#N|mOaFPCEj4-*S;94NF=37^qVf8wl`EU$&`i* z3XP)RS3*SgFcwIg01nbz;-UDY-JEeYa&ayC>=63!yvZ%zR7Gi%I9k$Jrtn`07e1m; zs6_w0x8MNXjV673m|9-~zIaNACf+?IL`t_3-aRSRly3Om*^#h4UwSGRz~O{zm1ZVc z$QXWi^KUpJU6_A!5YXQJ2#Ng)?cH&^@)4C%owIZQOMG|3FLk+8iK2RF!Sk|L5SRD?olxc=vAU&zHdk{%U~R}j;1)z8|}(t8P0X01!~A8)0QqThSVLGb!y zG_pq^I^HyuiRKdrMx|Zm&&cmyZw#g1XAgA?lX+QEbaSdC4XtAU$lg&~krW1n7~FwP z*8>iMuJZuHuQVjmulvBM>SZhDFp^hLaDJVc$4Jk>5TgHc$IZKSVQg${m@B4x#jP1J zIx61ZqF;g7FzLJYYwtBN>H{x=iBJk3Na2!;<54p1Ba(^*F9RXL04emwgs4Fvsb?{?a!gE217|O_k|1houbwJcfJQ7QC&!o0TB8UZx0`R8-Z>rS zlDE{=)s>W#v>*jKIyxk!r9V&LiBr?ijARHL?esdYDFk%mHf)zZLInKV@} zLofkzT5hA1O{d1l_Z7{$Y-U*dS17jRepxJsMqOz(!TQ;<#id;SzN41i?WgG3Lo!%~ zGZmYTh)~e73sEr2%T&Yp^`isfp~%TgM1Sb3nj9r*CSD`lBA8XfwkBufy#s|{e3}BZ z&#^ckNH!S3CDbG5joh7Yz76~wI^XP$%L-!R9U7(XN)IM%)IWjH%MlbLfY%Bx`$9$k zc@q!`17C1}_IGp<*`K1>Vu!Tqh!ACEjq)_^sme%8>+`WyBckKwP24Dj!C?3X(0Pi4 zjZ$nt+6VgZCHNv3&AnV|#gz&UJ|7Pc$pO^X#zxX${7qyCethpILt4Cw$q4ZEG0oc# zBoCJ(e_=)cU!c?f7L)m3z|KywIDO?)(q~P2tiZQ-h{0ziNiP?Nf46A@gOMd{*cs)T zCaBSHS)9;wGaA2E|I3AJxxUOIb1WWa6_4skNqP^OjcY-_xHa%5jutdM68NU_eZ^F8 zDSPS3#YtjuI+@;qSeIi)>?|7aAG`!7^xu7MV115_<^ngXj%XrNz(t1gYX|>x2CtN= z$pUd6BX(fUEN*bp#!W!3Y12bKgrdB=qj^%HkUe=U2&aXL?V(XUkqO{LQwM1nNCk1x zl&7+?vPuj8($>~ai4|v$@{ILp)u%y|s>e6Y@|~AXu%s)T4dt?b3@#cW)&D~` z@I5aCAL8ZZ^^9NA#?DSzMFp3Y@ZQID&qB~!h+{zt4Ss_5RN9xYVGp`jJFTGvw1CAu zel~8WD7U?Z`JP$m+3tL5a#bFqrKRNnW8puu0a5xKrY0YC4kHi;x11=hR$U$UUP1pR@JDAhl&aOV<3xv^;kCjOtfxc?7Eq}aqAyGuu^4NJ$#LU7G% zCNd#>q2Q{{4g9YS&GAsNzofl)2vdmhQso4&x8Rs_QZzjgy~HF7rK zd&^qzN}A~BG`-A=eKfXpLe}_3gi=L9LgEhjF-`R=l9>=Za9PW=LQKs0-( zA<~n&Mc>}om#Zjyztp;%~T7A_2|OqGCqX~0!_RCww4V$Rt`8S z_#e|0#T$}XV*HlH1Hm!*n`BBiw8i^fb}J) z%A0DL^#N~)q*l0)P&zp^&`ZTm!XqOen|(*{lzE@+4(v-Z@h<-_z~Y(3|KGqeF)=}Q z04=MikO6_k@2$ajWMt%U)g$IetiXW(-?4=;yvd##;qf;)jw$?*yB~B!)c-M-JFBrx ziJS_}iX8~8fZ^Ax>UFsk51T6HGfJttFsRaS(KP3zhkr`yt@?HqM;1%U86HR5+f&=& zn1N3Uki=T1ogO7mB(7lmv;GX_&xW+`J{zuf_eORy7pJsRHKXI6{B`Y9!Xg-&K2pQX3WizY^Vh6V==pJ@7=k35a z;`G8N*Yt9{zs6u3Tpkl!m&la*To4Fc1W&F|m(H0?cV?1_U+|{7DWR-|iYgFE3@7dT-005SKSg6wOi2Ky}!+bAk=RC%V@o`f#v(Icw z{_ci-E46fm`=GD;A%D(RWPKzXNXIa$7n?I z@ZLYW4iw1e_+?Qp{46*8uWLV3{CbS?8qf54v54yTlX!o-Tfd1Ncje7NEIgp^z?9ua zzRg{^f_vsG!!1IpAE!IA$z};^sWGBu0QC{)mEq$5d>5DZcy@WFXrlpm&T5Mz#+RFW z(h##jfhwyJZ}O)V@}3rNKjbMxRlj(q!^g5PN{D5mn=Q>rtLZQ3jA~PbyjkNT4spGk zquN(ydPO{e06z(7mCc5>p$cv4?Lw+p2i564$N<`wRoqa87PU>$(?U7XkJ>cfioEI6 zg>l;H_+|o`sO~a`4Aw!!*rs|z%1yF?XYUffyB&NeGyVRX&chv+2^&GRg+H;3<|>pN zsHUwVGpRR-wgP+hS;W^LGs%mzKZ;gG_x~1<*0>G9#uq7Hl{trzRnqG69KguU&SIYQ zDJ%0OyJuB1J_***@IB6knZ*Xy>SQaJ83=lNRFMKTX%#mYmlHMV*{yZ~Sx;0alj{BI zUm}~t7I-@D$^VR7Z;x!;DbJ8lNJ1uhtk8>{A78&3)H~kkGBrr%IVXC7Olfo8YqeHm zejxw*qig@99lK3ZK+F!W*(vW)_dWiPYI|*+{-}M~nQI2BjEvCUe;HE7bGFbiY+#@j z^E7Ivss5{YuROXD-w}Q*y&k_13-4zQ`wNrarh>&|KPx*k7vv{Nw;D)0QVj(et-{;zNVy}YggJA8kUu)TgkY+`H+r{X|heeO^a@z7) zZkrE6O@EE!M#5{ZSlSGlje6UCk=+$kL~;SJDq7}`5(ny9M5a;bz&oX<E*yJMZvX+=#R5zIM&c9#Tx$^H=>r;QdC6+;(3OE*jlu-R^33o`i2rf`aS&sK$F z^TQ*fl;k4n@pBxRk}8d|7Y%sV-3GtP2+J?e7GqAw2w3&x_h!-8JvuoU@)u25bjw(LI@`)XF$7fQv;w#DUk4j$Ly ziG(@TdoqnvA0JU(?(|^H9v-^cXt&t+CzbFoiWb=usg}yKjDJESbu3FI3EM)jC)&MY zOD?466tzJE*ew74-JZbJsp&ez#!a4PM~$)TjfKZKb!P1_%{9xYr14ZdT>b1-|MYtN zA*a?<_T0bx`jD{UgBlBbWIG3$@m>gRlV!T)c;$(Vu&U)oZ)L1TcKR<%F^NPgH?~^` z_zk^+yqA?vjgk{%5vl6^A5teIoLhzX5Od1+Ckx$+Y+CbM8{`kv+6`X1rPumCC%`vk zNc;1Q@jHZt0H1WEj+xlU&q_W_m{%k(Zioev>$HeWI*m__n_vw*Y2^9G04%MG%awhN zljv?Kq|_4e*iW##wy;(GH77%rJu{CD9DY3WXB2{W*lF7?j1HY1#qassDQnzAdl$og zdlZ&8oL)uyB;9}GCk9o*(@D#qQCmJjTfBnPC3W@v3#Mn*^{z=5J$W9Ng2SPmRxe?H zG=GvcjG5FP(ApitV}>>y`~Jf6sHLUw@3QoVLeD;hkkd$|7OVPR8U2yta!6nz$<}3YM%#6Ia|-tPT&P^vh@=aDsk6ZS=l)r#=YtbQIZY* z{M*2{t~8jTjC((AnZU?$3HQnxQXQW`>8$P}PI2wv;y=?7c0vV%yZOmS+~sZ zEX}rjY(Ye=sZ+|SZ8ONA4E51$kTh)oEsR{yv;%o|>f7x2=JH%WR=jhNcq`&tkUd%E z0NNW}vltRv&4n%r5%X0^tnvGcJ1p3|?d`Qg4H5BY>$a$gQSMxwyj}wXwTI85cH=p$ zHbeIouB;9Yi&+YfRqB|sF01m#@o5l&gJljb)3@Gx@49$n=DCWwyA-t0(Kqi{KLkKRC4Ax#frxj4q2aLhM4 zTLtl=JDQVW3ZjcQ$i+iOI$e|O3*5&Wru=8A?z7|9FeR47sf&jNZxly1jLS*l2y!vg z;?(>je$!lOYq#W?;97hebN?AC5sVK}1L=UOSKLwM$D=L=U~o?3ih#dsE_@8;Z#+ue zPC_J1N@q|JZ~mM6YzRH=s0;`SiOmXuj)yAZ)+v(KER0}+(OkL#Z6t|c3rGlYgF$>X zD-B2)2EJenCm<#!_PVc1L?>s|^nBxUXwz)$(0YG=KMN~sB5jFIy`6D)G`zQW#I)(9 zk&Vr(>Lk(Zm^;z{jH_GYK`P_?+yj6*cuN{Zgm0ScIzf-sCu?04`a_2qn1>}}baEzo zEM}Rea|ih&Q+d+`N zG4m1d24k?U-=QG4NI*5n5&20R3Qg|sOt>E$o6VS?z{kr=`j7@ploTcSIVh<7kQ`3Z zcj@(ARB7`GA2O6BG8FeR@As0&)lNN~9GQSa&b%EvE300$8GNqMxkxD;(;Sf{c(2PB z>S?V6?hSH+n)mM5LwU=J?d>}X&9SoU)f2!(3#3l!@wLERRGzrCzV373)&vujyKwR` zAbt*;7#s6B9+9Dsx9s`y(yY3%p~2(gaE*V#W2IO%|Mj@@eg7S9y)le<7_2{uRj1A8Lh6}bhmY}_JLm5l zSe>XHmglkB6Z?>mzQ%O;)0YxR(e8A$`OZwO@8z*zKF(XDFuE6^uA?I-1nJhSATKZ8 zf1GqZIyySc)f(2;(lQtNEiaF{M$x{v;@h{!tQY}ZU0pC3Gfh=rpF9og1!&*W+J_1X z3Q;wy*#eGvh`W=ExC8{th)gRrWm5!oN}y_Lah*nB7J^M7 z4KXmNV3fDB+a1o8xc_$Ft91ZJTP|+SjvqqbUj@=|I134;(@PE<&EBS3c9xcgZf7vq z%+yp$TpWRRp{2I3uSm6Kikh~Lj`i2lnx>|-X_jyO;0>q1Re5=N@7PsjaZ^*%*RQmN z-`d(lU%t#m;OG0b-!9(XxI>}PY*F8tr<-v5fl8Nu_fmd$FVQRXN@>R@lLqFdrcWq^ zQ}C8uUW?scAN~D%mjKI1N}i+qver{Eb|qEs0fmZjw08uxI>=cb$1tRV1UpCqfmH~Q zms2Dy80(pQ0Q_-lj_OY-NxYFG;x<3L@R2sT%yLW91`85T$oXupPIpASj)y~*`1$z! zF4mGkg4p-!^oic9fAKs^MyKI+vc8w4t?f=mlkD4v+yoR8rKtv2r*1CN=>J;Mvj?L8f-12g}!_{8n zu1Lc{&5s$~@5?51>|0%LZ%~UqM^UpoSt8!2pB@sXP)X5%gVH0|F@1tZ`{^;2sP5iw zFC5<4g1sbQ2U;OGx^B&&;ccX7-c=#iNuPZZaZV1ojA+wq^RbRPJhB^iwD?^G4M`uK zApPgRz*2`EdSl~u&j|M3Q2Oe-+@+3K=Q{HP#N5gBJptzL|%04a|RV`WDzXE($Pqvyx4D|5-`j3pJJN6Y{MJl zi9&w|+qfcc;!#2nNg2LY=ir~A57LOhMN0ps6Plg8P)Ts4Fqg!{j81n<_4}JrRqitf za?fHj&e~@CCaUsLJvk@koQ%c`BOvE95(QE-`AQ!A;b6XwNg_R{>n819Q<9e_&M!%H z@8vNzNaonpB5a=DaWSs0t{=Iyl0X6}j{9L?jwRVUXdG{R=iG+vSH>GcDJXTa zo~Gur1Z`DloO=BDuZ@BW)XfhnV%0H4jYldow-txS%V4i zC^-vINFQPpAuKz_euh2_VguRN?iItq1*UML9o$7Qyz$GMSW0Gkmin5}{pVV~no47N zZPN}_*|aJ%Y!2DEw}zI@xv~&!yc~*TzO>u9%nXh~U!#URP)-x_mSkR>o6As)Za;c^ z@x}VVr0twT&P=Ietfhpx9xqLa2Wowh5_V$Qk;SvWTw;9Xx`*>--aDzKmVKp~+%ec@6klmrh&EUv7SxI!7p4rTChG}S`|GZMWCx1?q=XM&f)%I%Ml-&2!RY?J zK5SO7Hp;PFs;#9J)&~2SQ(=XtH1*n^bF(Efu&yq>D1mTO`D^UcKB*q3*kfUy6I`Y zR}G&6yi+<(QiZF_O{a5H=5)-~QbOtI(*o2`^D+wVPBiNap2oPPTT_!P{5~xcZr#`F zU{3KW!LM4Jf)91+-K>)#X7j$$6TTcbmEsp~-@re=DcWM#IXUY_AHAE6FBM=F{=V6_ zli!yC-tKJoO~c^3PO3Y5fRw}FdczKreHv|cin0sls`r;YZhx|CY#%<> za+qwOX=r1coF9AFN;D3;H{Sm_6?rTS3`)caDS3is$!Bs&;){FJ^4l)B>1_e1H z=M(sjtC)U!o6~kOe8o)_5Kf$cj%UqK%Y5VP4U07cbZq3UtgPh4@8KFPo$hTl>v8!{ z{5k&A(4lY4mOcy-Xxb~@GNBQL(ma5t3DR;4a-QTpjDH|i%7zH&H+$TxxLfj3`tyHl z0g~dl?UsKC)K<3T*6IXUAw?ULV|Fr=QW8X8xc}^+l;2ng#C%eG^v*Ar-}G0YmV`Gw z1HCy;s^>`pWm}NWDSx(Z{N>j8+sSzjTMsj^29fbFK!KFgdZxHdByME|a-~EzAMdQL z=}kJ1{k(K@#k&^jdiX`4pb+*J1E@8ctmB&97j%|3bBj>uArW;mQBiB-Z`aQkEmElb zx~e-S@{;W(UG?JMUYb$3ZLm&t*C1sgcyUv$i>q@l!IF+As~=bBT_7Ts}b8$lUAUdAg%$0;Z%M}E{-`t@M` z8vy8@y_8V%z*5XA-nJ_)vv<6b%$<>88lse)$%Xky)p z>66V0;7^p8CoA@Hc6HkIQKFU^Ja&?cV?6;A9={k0>Ff0G(Q>^epj9=Z^ZsWM8PROn z+NvrS&Z4rH! z@|U1oG3$FfY! zsh4yfep5v_9$CQ_HJ;Z7D?Fi5*<@z14eS^*A>6kVAqXq2sVT61msIq%0WFSe^!1fd z@a5*FE^X~%jtNS$tRy!~L@?2@;XLvftG23GUBK3#va;ih(tj-@H#Vy;{3*q|e-(N2 zk8D}mu{~2H`ei~+-v=4O2E$vo_?~aHNPLm(kW8=bqdK&14V>J8$V#?5<`ZNtR%q8A zNwy+Z9C;F`78-Xfj$+8AX(>@|zdte;4bAFSxhm-kE;@Jop~aEi&dGfyHDRN7G=G2@ zvpDNw)V~QYnDATqOy}mN9>&TxD7_W)9Cj!hSA_iY+4U+Tb1>+{nDdNGh)?fzjh*L0 zC0R)KiVI)DUT=TJNWkmpohi?TmY*BRrUs}Hs=n)_jt-J*OuV}|a1dRu1rjQGoGrY& zfA~DR-PMA3e?+94y}|4kzXI&FY8tnU?p%@IRa3pbc6X6d>)CE^Zz{sB<@2}M^PLcT zzY^6KK9Zw9EL;85=>~l1^%ULM{9F?aFd&LUj+45a%pU<@io4r@kKJp1GP|WxEB8~3 zBDwGtaylqaXh?fNFrMwXM(t^7y}<&OuH;N{A^SLL{&1xCkAABX{nwk<}cU#-bg*2_>&6#tctpq7Kfe-tRU z-Zqx(SUWL6cD?Q7f7~`lHKTS#qb$q1KU?v5{aHK1$=r1b^D$9W|C8ecx&Geh{y1~Z z-CI(Wi@plQK){WhSnmRW8u-pYCvKL%!EGvA@*8R+BOBo#Kg^}K#5yAzPo_s|V9WxR z+chvjV&XFB3IW3$YVK2Aww(IJ*R9>`7guwXANd3_TC2GP(eZ?iVIdC;b{#z>t->S2 z>N0I!As&JG;-^6c32^f8RwFkKONar0Q>KfK!>krW$w30*XTpPF^^%>Oh4H51AJO+u zr_Ki%HtEc~2Q2+IU+_*F6GqDU^JEB8^NFGh>$|@>A~g>SR|tLGOfG$Q%8swzET2c1 z8uJzTXR)1-qdZFP1g1%5?+W*%EK(=1ArnoiFjZ_IQ{(3!=_h^1tX!tH@?g~*hZs}} z**&*)FwYG#KHK2)`q&dmVTk%f7W=XCx3xpQVFKzeM<5ps7YdWdsT8c*$&#o>HMWp1 z7ULUqmix#UlL&f)p+D{>7eq@76qUhXoBEM2ho9i5wuON~J!9RFTu!qT$O+s7qlTPY@4WB0m(~vZDnos+UK;$GOc^%;Y>yJU$()!>`&J6 zPGV)IcCJtfUl$?`;;*`O8t)&CSh%6s+2PY=gbcpgJ7@$p}nPc~k$mpr)ZA zg$eP9hZ@1dDkL;3OVZodXVet}G5}zR2@ase5Cy2mc+uoXBFNCCjmpFOwIqE1KYk@Y zV(7o5Oipb7?=^M*BRJ?{7px#IsA+5zJpKf`)7ViWuZyZ)HP722dHTS2T{iGNJnwHc zW=K*AtS>|A8JOBw+t~1Mt?Pqjd*?wBi_Cp^Xyl3j(v6&)94(-6{_|(dJDEnsWPb(` z&OcBz_NyF&<>nf$^(9KH5w6Zrb8{c1S(h6sQ$*ecEbDaiWN$1sR1)s9#hQ9fSAoUc zej7e+)Ppb1SlL6G`uc4)(^a!}&2U+X=hbg$l65^y#fEkq>P$cU*>^k8!`jQr+jd#z z=xahgM@)69gH^rxC%HI8&peMqH^W z<^DJ!L7?$%W$Q4SL>8hsvU9D!XqMFB_xsfpfIVP;V~=X2|h+ljvWRlxg4+iT2(c==0rzJJLkUW ztJp5MO7Uy&>=w1>&(6*+=5=fl`k6&8P94h1#)hMphS)g1@EKs~SaSmB0bDd*d_xI> znaYKnscllF<7C>P>}9jHJl7PIJCHlNg5oiSQol1!jLN$@w&nOr(A%r=>Sxk^;h-F{ zeQ^l<2xKh}w39i@)=q-DC&PY1I7E-eiWUv@hV2t5}J`9j;fby9B7ep6DE6&@2K z<85}w{agqR^Vse!v;q!8B4-?nq@bzDZ;Tcw#88R(?f>~H7f+uVrSxa@(cNMph-3`+ z+H){6T4vXKMw@{remvoYY^b4n@;~y_m0!wb7AuAAa~A`BPF+}|cow`Y*)7PQoxzb0 zYyE6C23HneT{&!AO2EaMe6-t7&+1Xm?8Y6ecLCIkr6us_A4w_mdwDgor+9G0+t#(K zdOw40zGK%zQtGvKVgF4%|J%Rt5c9!{qjH2_%b$hgu}B7f*VBLg2|UU zQ8DAeprJW2(-Nd&mgqR*mh{YzM%eS7cb@`FY}^mcptz?6!8 zKGz?A7ll0IrWdQL3l99gc99xSse8N_;(ztCEru$KW9fi>el5a2yJf$`yqr|XWuV1; z0?HI#;kWmI%AQsGXkl~t>D!-oLgCeK67y2&Vmd7z)0ZN|ZP`R_Yx5Ng9`FcHbRb~P z;cuzwt+)L_IK2D$(qH<69j}w!5K#dF0l`p>(`kr%>%J>t_28IJoiV(dicPP&Y%*o?rc`9SYYYzrEga9}mu6L)p8HFJ_&qyuAtcuW(g7?=Mo&Z}7JoI#uDT zoq=hOiqOD`(nn}!p!!QW01%tsy*5^UzPj~vv2INvrcmE!qhQ53^kUhd{p^O2&_>O< zb42Muo&Yj*f>M^UNprRG`KELkuR`ZI|d1N%(D+RpCP=k zfx`1F)RkF>L(MMY3fcNy2NNJj^-^u$rq%iDM^R>Wf)U@Pe>T^g-Ey`*yXUthyFXy7 zjTo`j!5yz=_VChrLnlF<@&4evpz)C%YCin1nwxf=!68@J_9B9Qh>~}E`6m-{0fLNt zF6t)BjDNk{3n@x^&Z>4f(BO3aCpKQjECm40-}2w?=2{ogYf@E&k%)K?_9!4#wpge{ z-xs3;i~fh-mW<6*`U;8Zpv*wBsNwF{pDXOU*2E}LxaalzZm6P!8JwKc^Gd4V9)`}f@6 zveLx8HLEtE(2#k_D%`nNQ(pz=o*VCEahfbkTuPb!}uc#mOIk(ew6a2B^Qm zrPWjAK_JZZs01}(yHVAyiXI(oDtTikv27~{UU9a0+x2x6wI{t{y&j4pwD)aSe|5r$jg_HO2Uoa$L5`Dp##cW`?5ii;E3+l((WhlG7kJ}v!b zSUg1PYwjesdmqDXv&FnO&V|HahtG$uY{sLPF(P(vSImW;&GY$n8MtBbdbjB|ZhVo* zhYRVqvbvuKyd*5Y>esAI(>?F~og76e@L{UM+F*WV=4P`x`@r3&$rh3JWbyX-bxe!O%d^zv{71}H*hqvt z{)Cdcw;i+wS*=CvrCfA~88o{tr*!itmV4ZcZ$=cYx%A4+f}#`r_-RQ{$u;B%ILK=Z z($TsG9iqIqr2L_VjUX&?rYhc(buk;dw^)hMJs)*(zhGE|Ch7rDb{s-eUML}^{?^Ef zU{Rw^v_yZs6tB8-j``(0SJP}B{k7rmn?Q-H!wF$tv}N<_cKChIp;e#TO>%PWnR0&T z_LmqvOV68ONA-JW$0WlHc_n|gTEuZ{^_+eu%FW)K9P+P@lACoA{_)K65~0*mWdw#V zX~f1FW2jywoHbm?982zl$|7>j)_ zLQ1NZg`g9s_k}Z4RMFpITGNZ8joWKOafEq=PYSzW`}r1kwqy##6#NC4 zzZ!78oP7+O8m`F9JeP?X>nq>Pi}Mn@zgf!826JM1L-1Mm=-9ul=W3O{>d=1Ahg}Z7 zcHg=#eeddQasBrljNx+{UFTpO{m{|B{S#9iUtGE=DVLcdc(Y8YJ9lg@`rhU2oxTOL zi0U+Tzqh{czCCgELcfmZ1K+b)%{n6AgHwi1-|Y8?8>Q{3^UaMpIihygHTd`dKwtgv zM~2AB&9fxGt8s(R6xWm1)|=YdhFMSiz5c*AAF{LQ9rndnUwy%;wOtzaQg0dlc(yMs)O9WlRe$6BkPDnEd|@t7ZBgRZ0@)QmVZUI$88LLQ3By=?!>^$kqIX?Wu%+O9B4_AS2`K{LhWMt$gEJ zn6hfmgP%-%ToOr zZF!U5@V8r8P1I?0?vv7N)VS^K6n&uSd97waGSN};A_o(}4`CNCyI<}x$Nf!?mKea7 z(7s#cJ&`r4C-MHyi?lB0k|02PE~&Bk`yM5^?LJmIX z_E;{q8QeQ6buCykLatswKC3it$Eo84OwnxrIr2I&kKaD({ZNUiC|ieZEp2xiNb0aK(Cn_NpV7XiV+!1_Bo&RI-X>6p453P6 z0+Kz~;#C%Wra^)SYpH4OMQOY)R&`~%%&n#U6972A{C##wwcq@lw;cocTU~-Q1mS-c zx#Dl(Xc>E;`V_s)3lKHF0Uhsk=f+ANNGSwh0VY2r$QM#=k@?gEz`ld^!(>+G$w_SO z`(~}syj#4Zo=M&q0Qgb1x7{?o?!Z*nKtlciQAg=t+}SPFEfZUqca5@p0)*0)oCV1F zPq}RKv-MIux1uI`+*L#}SUe8SfP z!kS8%DQ@h%abH_d1T?J8Yql#~v|ksjBoCyXOY8jH$z%qEhalPArHt~kM;})_nY~5g zUe&Wvt8S1wCjG=Me}D49epGioysAX0{c8CKs(&{dHD%3W=f4&w+E%~lefy&)-Aitb zSf0LqIm)yaAv%k4>91gKtFGA*aBvKJsH=CA#bxNAC`FuYfdku-8(VpF6lLX~P!{H9?^l929VW}oCKBUJDdFMalB()N!Gf$Mv~pmd+m5EIRt|2R9ifh@ z>PX!uONlFm58LOc_a=JIohVL*l^C<06<$;9>#-X!x(&& z+NHT9zO$raY3$QVDH&J&r{)pSm;n>~FCda*>{(oslanDFL|}tVM0mLPvt>|o?rnV6 zv&UiDw8w==0k;GwaA>%|{2mmCYz?_Mf&ybuj;xpAde=N>k-E#>*8+ByaV#TQumX3V zP-wf={gy52sd|Nlj@Z^xCA#Zl3&bZy_(9!s&6)(ZxC$ex3oY4_S#nT$&Wr_MQo6DH z7yy%1#b@SvT`g!o9llMV7*jQZa6%;R+F#D{O!WWKL(Cu_ zT7akQZo>KEwcquWVf@wcwu`%xZxOPv{i>)^WKyL0!g#(Zq{BeiHu7}4!ppV+`8&w{ zFW1&r8G{zPCBk@iFSxQ|{LNzh5YGbdN=0`W{l`de=KA$N`nMjt!@lf_dsj7P@@ZGv z3+-L&r#F*%>7Q-WIrxMMQ5mrvo-rcF2W9>w2$VZMjbHmxL}`$fH$j{EK8P0Ab{C+4 z&|%9L#Z}O=po!WE+rW3Y?#_rqNPr<>gz8Y4T&w*nSlC$QjN0B z`Q|ev{&}LN8n%#O_3`4)A_gg!&KfPp$w{wQy_SxV>nN=?P&;97XV->0os}R#-0b<^ zmX?-Y9cABAG%?ngjO2db)?@hBcYo)SAuX4`Ga9VuVUD*Zg zZal`R7`g}nrQ>kjuk#cy9I*>iit*?mBP)fcbua)3*mS?R_?uI!{&R!qRi&dFWq^Fv z(|R&|s#y&xs6!*If=y%;26(gwk9TD2N*MHh5u~Q8Gb`c#_$lpkP26u^>6`Sbc=^Ue zGX=@{?dB?tyK5{F$id8r(*Zp|r{1OOBkDe<6oYw=m=Fk2?AV+#8JAf^V=-?BzG(^r z&XOh$I7Z>JWG7qhqLH5V{jsR=6(@w}pKr0JFXXl@U-Qq@*+y;d7k1AYzb@~bH6qkL zQZ)*b|NHdVTG22A(6R5K;m7PZs?7TrZ&fEk9frO>RyaThY7Rz>-tdv=G&H$vJAw&*}W7E5-TtZ(+}E zrOBAhLiclGA|eVAFCI3w-7N3j5gA5>xZ{nYZ1B?DJHv_V7rag*m59-MoG-i>1hgyj7YEhql@!DclXK$P2a8=+D5I`A(gr_H`rD>1+ozWQmg-^ig zFj|~N!vmdG-K|Mgx~GiPy!Rq+^2->}ZFwBM$P)FvncEj$3e0o>C2pDKyzrhi3Z+h$ z@oI3T0G>8!^YnxcjV#YzEqkJKt%wqDK$I9jXF=%m0B8UV)Z%S4$yRf?V zBvsskzvZ}b^38X(9fa7{R-zF7X|%!?cS{H{@aEM~*RfJ$jPmK8P40>sRspEiA_Kfm zHVa^z*=@}85MrL^s@>CJ0|2tV|F@7#?}fyNiTjy!2}BmN1UOhPf8hVZAHID7P@qKv zf{kAs?g@wosAWCE%T_#PcHxx4k~ucWJ;4A02)W&_`lHb#68$746t72^i*MHsC@C*HPNO_39q9oOe;JPUgRT$ zhJH%K8+8n4Qgmn*$o9YS1ofA0Zl|{O^G}J1?*qz3NAvEBtnBQ!r?d9v11X?hKGFYZ zx9PLtr2g!TlRufb>-`tGv8DCCm(ypg^IiJBaJmvSDg{ipT$eZdk2IQh*~`ZFbPo>} ziZ|+Ck&s9M00mC><;fP>pTcxIGC`-We%`watye2CVmF(m71B{;#9gsJQ?&IQQj8SE ztFb;zr0LW&SU6w+j4-oGZCgHtZ%U!Pq*KkBUiNlM@i*_@5d~Mz*qo-26#PN>+tk7T zN)UZi(+|K(zxl&}kB@(O?CUJ)c>dp708m0I0ij9v372L9-eG%@+76Lm=ZIM=-#iFF zx7BevWE#5^urgSH*(kl5NvWB=S9Tke+pP2As?2US>SmDs3Xn^yHBXllj8%vMdQ6A8rM~oM3)c9d1?RvcfaWo zG<-!U^;cPyv#u!HF}r{>w2}i;uVh7SEpO`MSTjP75-N0PBz=F zlX_=|{p{=O>nhoznRw{BXLivupEG)@XuQef`^dPR%?tS`n9E+PJ{R#jm9<`a>Av@q ziTA;yd6{ReZYC2FxNu6MkcTI!FR46G1@qiDdrSH<1{WwD&LQ})PwRuCF^X4p@9VEO z_I67to0%Xm3r6N58Z(0dV#*kjv204wRh4i4s55ezg`@NF{5Zj-*;}7fpIg1!iZ=ga zT-?)jv_CzuG*z!av8K;hvFfEX)=N+oDCl$U;OBSqGw1<>QW{bDrm>alPs8W_wu@pn z7X@)V2Eneo_E!fH3w~#;71em|Z&zE#NNTIOWkow%8+NrBMHLkR@6jG1K2KxkOh_szP}|4`K0Ya`c^sA&x7<F(g;uV3a>nGl$C>1Gf^na^73ac5s?x?nG(&Sg7O_SACSz?u_D8BlJ8BZ zD;sU1U@WluaTsp|{;|OJYE+*H7;#tUPKq9#K%Zs1CsF!xoe#|W*Ag%N<7ku&=0vzy zS>aZ-Uak7c{lw(t-fFUXp0_^Trya&^QW0(jyE-+_H%G=3s2$XKaC9QWE+vocWZx4J z8EJ+m&*KTBJjYY>#&@g-nq1z{cH?Fyo%Uu0)|$f49;ek=uRZhKQ;Gl~UAXnaKjs_R z^;IcO+hLPs)$Oc4ihWe0;#-@&hRN~|N7RZSP?oC*PkEY5U~b8rlq-e{fP!0K*wJg@ z+qZ9^6MFMIB^#$u;~8b$+xph?yjOiK+(&JLeHf(NW?#Fe)QpwQn6sbqv^AF6DKDldd^JXO4PEC>I2TVeSIp?_#6|O+i!oWO zVl_6%jLqFVZ1j!eRay~<7Id%P{cZ^Mfm1jaf6^y|An(DgmT7DwYg7)KY@V{whjT)N z89d=;qHNKeQ6FfCJ+fkA%m*HN=nr-+lz2uAt%Jf!P$~PiKd2**@pa}PSP}cN#`6Lf z!2?spqwC#p>g;5=M`x0t#`~fufw*($KvJsvo>}Vi>i1IPEusdJk|sF;=;MsVu!*Ej z7}?3Az;P>U1vyIxu=)5MQzC6Df2ua&M4g_1X);qlUa|1d1AZWT6!Tjnb0|DfqBprY!+t_MUMLO?+2l8};aq#NmOq@=qWX^`&jPU$X@E-8@~hVJh8 z&-;DfKa0g>Ezmo2@3~LxXYYMr&3@M*SMN6c5RLePsEQfT)f$_ST}x0Qf`S2Th1k#? zZZ5I{SP|L3=$yuFIl6hRHsvIQ8MYmahK?3UAybtpn*=aSh@*HT?5{&|6G2AqaY-MY z#5c2K`LBEQO=08lUcDqFC%nRM-lA^ah&Q!>&_M9L5t~FEd^g=k8;1Vzo*@yBT9m$i z``t%GQ?$SmlZF{YNDhf@8z1eTru%?r?1JrnjIL}YflV#bn7KArUi^if&lmc=FTon2 z`n7bFKHhLIW%sVU;rbU+tlIZobv>Z|bUA1WQ1ypWvhYX#|4DvCf1Rn^p?rf$WaN=k9ovoDI+`zrEZU4!XjDWurh zg(tEibn0ezf(_36#5swW&7A(D6QraJT0K-%Rmn+8{+PF_Za z>R?`k#(FhF&AsH`?=_LJ$Hf7ddB|M*ZT0a8%;9;a_jI$Znvs^KoFV|kR{@Py&);MD z@%DN7tp2~oGO|yK1v+XOb6aY+8z!!*macPsBtue^KYmd2@-h3Sb$8ijn>3d?@I+O7 zQ69ab^NZ+0?n9GB9W*}U*WSUIBrqS+Q zjfxwC@pA{xgbVI2HW2ggZj=xdv1Agy9(G#Yywc0fruxsb<0`h5uP)Z05x@iD#=s(D z)I}Cn3up_?&0K&tP*YPQevk?*R3iVfN{ER8o+<|>$$~MU6Ijkwv8Rs#Wy#)ZmjHy2 z$H{EENVcquL8tkLdbM6=6~nRHsmX+hyiASuC;~)9ljcD`BgTraN z(q3CzyS25|;<$}?H#b~%H9^#18O8CUn;fQ8-sC%R?p1vJM-yUn*F&zHVBPnz9DUaI z_P>sjTGq+5+g zZw(vk^*O05|Mm6QFD0t$-JTARBqt=$Yt@%n-#(ijxA&HpObPfDEv+~>D%*H`K#+tA zc}VP%=J{9M)g3I@xqh@Mxm?1VJiTo>^R6YH_{0ePot` zk{L6k#2{>)AJn0*cok>6Z)dV@x9gYB^7uY^4aqIl)tQPfOkTowDgSxGIsJnO6+dA5%1Y4iylD!I4# zw!%N1d0QXp-Sfee`!|0z>0dpt{d=N(p_{d`vdpRZM+h;mO=EI!;d`6nyU1DslMbJb zBH8q$8Dl_cX1R)S}EmlHtpf%pXn2ZN~SeEgR=b)|3r5)%PDf?Ty4ekTK1 z-#A_7k)zLt&Kd2N9n$iyvv{x<@yDH_SQv)a7xjeKFq-M*_Tj3wh*PI5vv zVFx)bHa3=<6L2RPKqt=JkOt&J#;z4IzHkGlfL1Wc*5SB4{)Sv!29&)N^40A(ZB0{$ zmJx{G`&cYyN=UD4c7DF*>rCe#H?7@yk^^B#&2$i^SBuHhtey z(qU_H6iKeMvZ&d07U~)j`B&BVqO7OJHFAQ<++-gK4=?qI0vDA*yYb*}jnTSq=lM7< zkhx^=x>jv)!QtV>>JjL0x}O<;@0(g$qDO1t!}>JgNce#pSpx$h$s|9P8I}BYl1~~h zFs5kN%otltDheT72@w)1`d)E(#-hRa*d&1^JWqvoH`N2`AA!sKo|11L_BcL)-eQhc zX15XbCJY5p`}Zo}(1hXd2k$$-Ad!I2jdO=T-smTL_*5Z18A*FI{@S4d5jNEK}^FP=;WUS91CCrv%QBZrowW*FMgn=dRZIXM3rfYsL3Nkrn$HdIuS%FeL_8+h@r z?rvJkCA)X%4UyH;kF+k^fa9kLUP3f*^e1KG# zu&79yN(3-YhK7dXVDjl{X%%Ya1*2E#y+8T2p`z^SLcd9cuis^H z5=A@rS$lu~#VDU;*;jO?W!4pJu|^tl@akz=_1QnaMMTB5J0Iix&R9bs#h}{?+ISBT zAVIwR&q}W2zU#@Uj?ZSw*%ud&Fty*9 zV~~YnPFs+Ar$=p{4DZikEFVw1vk=d+lTBm>;|D|r2X$uZ69j^O9FkB6$72&1l8&Kd zKwiQ*z+-13Awb=Q=zk*z1b+FBKqlOL+B{lQSBHr9P{={u-JK)qohH_0xAqf9->asg z!fII5a`pPrMdB_YHJ~)VGK!8SP2q(BN=h-RfzP}b6pzQ2 zt<|&_>gh6t6b-U!Pxw){xT+6PGjCizB|*WDq}m2^;DteHAmsHNJa>VnrI_W;Ry~ zy@P22ODmtPtXWk~^bbdAF=3x&50heJcSlH}@MPEsaKeKqF$FCcV=rli#mbEe8bCQ{?Bhsr3 zwTF(B#DalN4)U{2#j|pyiI6UCboTg(@$rVVjWu-^7Vp@`j4(qk+my>dJoF)t-jB~H z3gGilkO$(*hptJ9lj3!@MG)9y3%&6pgNDPS3W<(bqY5ct_h9(tLgD3Z>4M=A{3dr1 zQN_ga39!YqQDEkuZ9LuWmTN{F3t zp6LjP|CV9O-<44(9#opT!rG6{YfVj!BZp$C?ZFbC7J>SApZbRsqzBaVNxJuDd>HlU ztzi6l>ymK$zMb)B(0tvFjMA4-y|CTH61o4rfuB@U5GCrRbt3a=302oa#lO)oi&l2e zaM3=M{8WsDCr9$lm^Yp&n`E6q6j?~^DWBb&)AwCovm4D8@C6z=Yv1JtOPs(HV>0DV zheHBOON3&MZ9s(`c)nldY;5_M%$IS#I6SfHf%B14;$!G52%JX$uL9Sk_PedYq4*D* zg!MHQLWQw>Z4AgB91TEQNT*))$>V|=@~>e|Fa49dgQB8hg7cp79X+@z(O10JY%vfB zw$N8Jrey`fWJ47=NSahw#?YoirFK(QW8*vFo2k!?W9gjo^>H_uq)-+|J0&0gr#0uq z51(e1%gc$=MD_XT#cZrtSojbEV{ih$1e&8wCG!6mnf`*#Ea%@4f{QcMDj9`Ekp~y` zp4kF4+UY796>0{5{xRb(<@DQsi)6Ks#San+BA7)EKvt$v+a|UcbZklL>Pl-HbH0pU{Nf z@F{K-9Me%(fQFtuCmKXU0RaLL!Rca2DSDHLOz?zBWMCgD9VLnLk}pLIG=$F&+X5h% z6LKr%PpYV^SL?J)?O)2JvJ`G}&`#$QItL3pRGt^m;scnJ|K{I|N;O`W1C1bI`-hv; z>lIJi$viQDlI$iekAwrakPxy7n+h%UHBXz*-W}Pko=R7{{ahd~n!XH-*=*h-wLTZ$ z^NQsWn8o;#=3oE)pzIt;OfchJ^c)SnR*+_Zrjs-gm4;D$jaH#pas3W9VgtO$-Tp68)T;G5Ksf+z&3A!yE`CrgDu1;zqIF&@kwdk;HRT;hR69w^ z6D*M?pZnKlCP+(1M-#s8u2+kTFFOsa$zbKu)Ac=HZjRcHKM_x?_kHgZBMlUIx`F-g z93UJN#YrZbNr`Mupye$xAM%E|^J9id9%&~4La}6ALVXApf>1@m>PHqRnGi-C3q+6! zH$v$v6D~!YbzW>PwH5*Vs#;AOf$;yVt_^&~3B@#p#@=F}o^ayPEoR3j4FuxS*TDu& z%P#2}-()ZXRm;^9lauv*A1^br4h2bp(lGB-b=Hi{`Wvp$Us!5z7wU9= z%qzu3RxE^ErBVw0Ad%b{Q0LGWzANNom5Rd+7BiZNAPqHEt)o6nC69#$Dx48Vu<&0f z;O@S|8>x+zq`=n)Y81-XiTMeqpX4zD3m6MXq2B}rr*K$6+W)5Dh2- zLN$;V2L_$ozc}CMunx`Ln|p@xPP^IVjQ%X8|tL(vWkx1Hz0@f`gHjoEwxy?BZlXJnHxPFUA}p1Ny*NI7&sxoO(?LU zKqCU`iL2CKnY&EnYWElNmx~riwt>FZPky+WWi2i9#w=2elz;&ZmVh!sNN?_}1!Z+7 za33pGiAx5yQZO!tTih$RPq@KS!@%$jB6!ApaDD$$D8>sFxLQTQz)4WsJl;o0CgqSz zvEZUgC*^z>eXm!oUfW10rfAco4UPa1D^>=_UM80|-KoBo#luuMNF0lOkfx^Qx&+?` zp=`U@#3Q?gS}p;c`&)h zKnUy4Y5^!A4UN><#}c3kXJ%GB`?$08Q&LUsPYjs|vF8CZq`TeyoC008NC2>(L3;(> z=RfN3JZf4Wqa%-Rb#Xz$WKe?;3h_!c7?<9EF0jhem(s=_nFTX!^rjbAJc(l@h>$PT zER-VYLWB*6H`e3>ndcU~8}AKKkPzTA8|i8~#IUO6lgB!_=4K^gTlpSBWT zc9~jxOS~K7qox{OZfML3MXx=uGO;HA=2IN8eJdEqy@pI;PpYq$S#qVs&YzZZ8|4{9 zDupN(t{7{m^0nV$dTcL3L$+42vb%=$QtEoMZEMNcxc#)1{cP_jBi5d4PCwh*ZAQ&UspNDwS7 zEqU8*5Z@m(Nqkx*JiRG%gWy)eceHnVY0_pTV}=-T|J!rdt*GqmT(M|yxoeeDoMD~# zq^z#a`K8V~5S}ucQtU_@eH#`r_GP$|UakiZ>3YAhbGL~j$ z>Mdr=>g&H>Q0T<`X8Sl^^?mD`r_F_mMNr-jFwx|&`Wus$#sjVjw%D@GH6W*(a->T{ z6MwuKtEH#Aoqs8&7@kLAf*WkkhA)K|1)ChiMiygZiGs~oIJ3dJ^J0ad`LS@2acL?% zG*P^8piJOlyq)hXYS`2Z4}ka~5Ow~b_A#)JlPWJOEuGwTisQRoci(4gnA&v$ULv3} zNS?JI`sBvsPYM|N`+q7w%gS13TRAhfg!Ny)dq=OQsJCBCvNZFsN9bHN^GXOW)dxh_ zsxKR%nOu9M(cFW`uD_hM7!q^Tjnh@R-^to!aB#}S6BR4d+1;kk?do`6&K|d)%Yh*; zc-bC*m*E7~A92~)t0HvAJ$U}fx-O~HyAMzI#{gxhP%8Zer_r?J@O^{RHuW4e@Z?L! z^|bexwx$2N({6^w|U&h6{g81{k5q8%Z6NG}o+5^&MTH}1dk z9Q?8K++_EA{q4Zse@%wvihhZ7c#<(+0QnPUm?#LG8#y;SCR|aU zqiFM~k$ah>@MNb!|BuH1U8$c56+()S2XaJ!c>+t4N#8hB3i!pwu{v`_8EIZQr7D$< z0z(%tkZ#EuB$laE!0uQJCJ06+@j3X*>`w~PIvA-@x-%G$e;{NeJSBhDQgaz3e&>sq zTGr*GvEIDIRq;yCAW?er5cEm_etf*YHo{Gck7orSQ+PhW+%twGPa?XczJg)SZK zQI{IQ9%Rdm zt#y|+X4H6ayz~GubXv!YKbsVqInH4ny?Sh_spgROnG_?(oQF*4=j$X=D9D$uutAjb zC#86WeTl%Q7uk`MlcQ}RJnY115U#1bb+evR$IuOdFk!dQ4_x^6#v@XudpJqL`I7=y z3xKUn&fM*bS5O@~CR6eMm;}r8x&7>~C(5hT`m<)0)F*^+gMq_u0kXf=ihdjLYLa|e zcxG1%z|m|7z-rj_U}E7MDv5QZ!AsQ>xx#2~_QT+~`KeE0rRO+GkmCmNQ~Nefg6*j* ztx#J>7WtWGRq-bm*-myhj zzGD%JZ?zhFl~DU=`s+15Mj2rI1jggInM*Wup8QFg~AR=QPOZ2GCWY73wm6&jZhxtN>3jg38^LKqf&xgRf=j+P5U(t53Z z`k@ea`@J~h#}d@(A1e8Z`IrbjU+c_Ow{6|>A|gh)$&1x+NZUydDqMV>na(VAQ*p~H zJ^B(w=uyHe>=E6Aset^M=XdL0k&cG)+xd@|yI;qCIGInd1N_F{pyl!M>2S7F-y*>I zP&~glEg`vJN1`ZQydaex@v`sX3G`;wLco>(*-L&#O13 zf(nfhUvFn@nitbS>{Sxv4N3IZ^Z9pU|wV zEMind^Ry&-t~ba*paQ=DuBvgQ&>?@UH9Ia0sHjos&iO3>+S`&Yld5U`Nhfiaf!Uu4 zhA{AoH(7V#9V88OUOAZyA>1FDX#>M_zv)ggv8NvYi z!5IsWzZ&8Hp9|2i(Q)X~_7+56*+sgm(Qkr&CYnP7b|mQJ9VQbQacNqI$kx@T$0e^5 zc;2t0VnX~BBO~QlBPQ4)r8#5xuW!-GL7PHiP2pJdojbxQoKT#{t_C=fgEBWup|<5Z zTxO}GlLjkOAs-2Aa&X+*8Z5OECtv5mnmPuG{sZHHvthENmttXho7kofv659m#)tG>9dj(&2R5os^ziy@ED50)Z@3?~h0MRVVvG6~c!nPGRDJ%l%3-yMt(h$-$t|IYvg!Lwqcmw#JBbOzY@g-d@ZF%9eh_Zb*&m6 zDd7>LG&fQfmW8e``-v6t+A%vSwSZ{3Y1!d0qD*rRvxKt_8gj=|(qgqo#3&q}QU_n} z!IttUi~!egMfXdLkq6;&O-3C3CtV%A1f9(=FOTla>M`eIoh&N$3`KE7u!)3$#XizR z5mqPPYl_~c3q_N3)%aT3cn8DtbvA}#a&i&Fj1UkYfYK+_fnUgtNG2cA2cK z4yrsh^o7A3>5+9j>H{Mvp#DpIG;PBok6IG#H{Z_>={A<6w<2QLnij_&O^;(UFGaOU zR9mIoHM873Iw=`@NPW(XaEnG}!S&JkF<7d)`chb9mm-PC?CGglpRg%cHK*=uY?@Vt z{H$>MU@+q?S1>;_`TfGga1;+Y$zk0pA7xY1wPca)n{cMZvZZvn8=p#YvntAbX;zxz ztzR+|O{n$wn?foe?Z0=hn8jIhGw>|*oEI9%3XZw?>=Ch7MrNOkE)_aiN=HYx*YaY*s3 zv;Y}aj#V!23}O`ZR^QT4+_Hf(K_LGDW5Hr#r!YsD3HjQ2_XZr2I<{LE-`4YXbc4Q5 zHK#eH#l?_LNuc>xi3VG6YtaZMIp!wH)Mdt)Wyiv#6n>j4ZB~QQoIwjL9C--YCmVDx z&GCokD}_MI+bd4foZB=*OP6-hG5J&*;4Y>eoOaC_v=2WzA~5@4DFJ6Tc z%-2bKIU3$LkeHm_;*I~V3U*8ejBLPBihUa4EV`{?p zV5(6fLffg~^Cu6um&hd9X^l5+d(Lk=Yf{JRLL|B126Z4%f4iSj6@2SU8hCbr8m9vq zuld;r*!WhJGVsYKaKMBijF`J&kG(y2aJV;0)g+55Z*y@q#p#h<1Z!Zke<+{RBiUbc zxsn`nb>7<7z*5BCLdGE?P&-IQ;H9t`df*(9v-PJn-lL*lBn`+;N=f#A1V?r%G=dUN zGl0SL=#!JF=AoORVH}`d#M?+izC2^ zx{^cB)PMW-3)9~Q#CrUq1*^uoI5MbVG^r(>h=3a6FL!YdN)AgubMYj6l>5;#NfB@F zIXYAX_&5UVcqyL=(BlJVs5q9cRdg-B*R9?E+5R({zXaq)uBh+*J|LG#>8p0F$}6g{ zb(T>`N%KU#4CqmyW@FX8ESL5COYGw%vMDf-3U~0g9_kN84A83nCWEU@ghG!Te+bM5 zUUA041E>sDOuT4^s-RSY(vqqB1%|nW)q#_>H(5jm5_C*6~4h{}XxW>5RQ=H78=2LlSiiD#W%UA?`PRnc(Y;Rr=tRkKuO zjB0f{(!hp>`i+HO`JsALcn4-_a?;Xqs4ny)RFsrb;>=mwm1^b2ZkPyQlM5l1BSGkY zz{2AS9OS>WepOB#o+d*jb+3xri;5VaR_<+)wi{eMe9ak4KoG$hxnnl8>%`NbRasD7 zws@#ks)7?%ZK01wu2;>;&7Hb-liARDOy{*|86aaRRp#$D76Hf1irBx)v~%jF6bC$) z+YAaU!QjXs#cchBn4$yjuAqEiY!$d#yMkR%a@~<%RtW0U*j!QPpBU$(>K}smD)D$fX|69gednhVGIEsjx&Q8v zzmA-rEY&Y+pC8Apm>>p|DOI4RaAouW9cKsShzt`S6WL|ynDg@@EG5l!D2mgGc0Va{ zor}1TemETkf)NSOHZx<4pJvA191%?PmgJN29O|}J$Ot7#$>Z4h4*ihx1OMj6)c4q8 zmzzvekpwRta9c3``xuJznkM9DlK#X9!fqAZKMwpJ2c)}h4kvPcZlSU1v(nS>seO>= z+rJ+rNo#Ldcy^RM3Cgxu)nr3RWYp|}7uGm@|A)l!*=}hL*Xow~i;@u-lYYhdg;U%& z7=UjAicEO$bict(TGUz7^7-qW)3Uj!->B*AY_QZ$rq&^zcdu1+>_<8%qRev5k#J}Y zt>jyBy8RuM{nF%)6hj#2&28>dNA8m6=q!tw$Tu=9mdLtSTK(G^D#+YNLm(=VI)v_i zUFsPe{x9J))m<*G-k|no=qwio;hoVr_)^SQw0Rde4@DJG^5TEk&>H1wc`v>iRFE<@ zuq>eB=E@o91_uwpfJiGjO`ne@Q+$~>cOZHVqV@T=3@vALjGyGPPbRO31hP)PM^%cy z<)|igQLJH~FQ_Unk3TPa8o4A_np1a+ZYzDZse5$Xg4}+#(GS>c)@5ILy_uD5>2IAl z?f7vo^~ESF%6hy}J+>G?rdO7wzzM#;;%>O>V4`m-{dqe}HfP{DQa=Sc?4LiITSPFO zEhr&^4pl`mB(Da3bjgq1z~@` z4Hv2@kMhWV9=hs#P1VBT$_P(pbrLj3;{0T{qz<#BvC3D@Q?8YDL|zXrPTwpC6T;~> z&_8LuAfvaw@OA!OQ_9kP0uSjf>1SXJ)m6zzu=q2q|D8b+1EIy!aO+Q+AQ&n;$v=_| ze7(9N)^!qudQ&viEImHjALnlU(1@4*MwUN)!Fv8N-tnVW!zUrI@lBCDC{s+~#vBBQ z|Esg;o$FS=zSqUbhe?yI>4E`I^M2qhF%=BB7K(Zo^n@VQu14eH4>Xcq2MNaom*!Pl%;7^I z6X&AT^(`}vwV!S*bw8i6k;-}Z2~MX_P$DB_oy=enPci`ukE;C!B!5zmWS5Uv-l~)) zIkQOY(wZPWU0z;J-juzEVn$Y%nZ0;V^L^@n@|O`D$Y0a-1@suuz}_`8FV(gm`l|4D z*15Ow0a>osE$6S>3k*PNLJkskDm;XrR9Bs1N~DlN5TaQ8vGa}AJOv*ugbd`U|2^Gn zWnWX=H8_`UDciar*FPZ(OOHyj!$YaT_U38WMDQ=+e)I$fE6XWf{Fm0G?yqdn$pNf? zHojNMgo%m>BALPJxHhgiBRLc_Rfi_t+yr6#5&zW68=?u`-+A#%rJAMC4wD7~vl)C6 z%_I}tBFk%OJ&eX#OnsuQ;bqx%Mx*J=xp#d4Eg<@dIB^bAvWG!<)xS6vr~wmhLIND* z!N>Qa*32+(l6o0S5F-!_0TN;<02D|myVVP7BbElO<%WhbGc?-&_R|UNSAQ!MQ{}Dt zj6LG5k7osC;>{Rz?xobC0=VG~@NOg~9H3+@pW7ExRGCs&MeUgc9UMquppk-c0ro<} z!O~A?pB=BoV>;aP078VwF`pqB(%$A3YLt)Jz zk(-S!9YDo$KcPFfni;1sP?*1p`axgxfzlW? zV2aIxOEt+tDN>HJ>?Gd0;lod8l?p9rBLN6?+hDdqPXp=(d@#tF90bftaj@Ty*=I04 z87J|%5n{0xAVLsQVyV3yjnyVHW9@;5VB@lI>&D}i)*dc)oT-1^oUc+Wy8oe7sjlm+ zYGY$l?E99n!H7i;$E|tP+~RYpgGX21y-f7@sm4+P9>!oy>j!starVZ)jwYUtxDZlaXnIwYEr;8 zi6zXYU5!Vtxs4Q0w&VHjZzCx2$wW?>CkiA7Rb9Ro+eq0m zuSf%J{1-faHsy0PH%fG=J7V%)e+-DI4_f=LAfv<> zj@K#tr#v5~b!TpO)74a-wf1pH1wH9aJ9Cuis^?H3gF{2H2U5Y1goR%HM2`jWQuK&9 z9c5fzvR=Q-rJ*G54|aqTqobc3HYBraztKr6L`qH`T2rh(6dv8Wzt~i&A%ZH80=!MT z;dqWmxSkdV52KhkvnV^x6fc7Ury+T_Ef9|wLfUCOq9d6y!v*o%LV%L()HHhw6{<}_ z;JAK^`gnCOf4$}8(Djwg-MmoTWAP5*PiYo};zTzdX)9jBke)9ipMI)@_58zm0rh9Q z9n7ZV>zYCIv3$S#$6!|)wS_{AlYg3xdCu_H%Q%WkwfPW5aq%tx&G*ukJQS*2;iH4B zy2@r!tV2OFCgVY%R;chgze8S)JG^{u<0#s1vBF`ZA0RPDv#Pu}svwVQlOIo$`@Lo~ z^%~1@G@oU(Rjtk6Z1^2$qX#c68Nz3f;q88;KA1fZ6o4JxUDs#1GGh;a?7E|cyk>c{X1&!(CbBsP15-?lpU^R4E7YS>lmkoB z;brXAy`AEo$v35Uljf~}Ru?8NOY-0c0MykmmE*rEd*7(58jRn*W|WL6k(nZPIgU%$ z%R73whz--29WKs#xPip7Z4ZA7xk@?mG1)pDI9k!US+aai#!)>%KGt(M-rl;`Ybhly zGo_}W^POLaVKPwaJY5e*!f^<;|H1t*=`)vmB{loI8KL7B^m@k}=$xifw74wH!Vx*D zJw$6G9U?uuR_Exy&>AWENZA*i5)${RoZD(QCUW1Tz!@kYlAI+)&GWhA-%sXP}g=g11z@P=$3?V(me zLQwG7+hFb0{Bc(Yb#A#SvduX4ASZr4ZJe-b<-@?(wU18LRd-VMGyjIL9EaRC{3k7J zG4%Ofl0#P_D;ue@udkVwe^*Mqh2&J`Zli{s64s>J=r!J^Cj8-8cw-3bRkvxkI{ZAX z;4Rxk$I;=- zA;mxN{;}k%9hd#Yrn5cx6qXt;KTBTqucpT73-)Em()o$*N?fm;MXO$t>+zf%R!-X7 z!S@%aKH7_}(=8ILE*fR?Qq)*0C_cXw9{i!xLhh8q+}y05erM@^F#FAXyV48k-B$fbdU~$E@&nd(f4={xN??hj zC!+2s7o>U-x6o7VVEgy*V+6z<$CX6oB-z|Ye;D!IuZuoZ<7y{l>wC?w%MY99+RvZc zszrO*pC_r(`TV^*g5O)j5%}A2T4Nsn)cEHWT*G7OF4lAF@a}xeMp9`n;@ilstyEc; zZ*<;=doQEAP7i)EPp?M!dOY?wJg4L+$ar}z_g_wo|6XwMxgVQIq*uQKzAjG>(QT&D z^z^Ad6LFN+V|bbxERVLU98iddyzXKcI>|F`CKt`=`rh(knpkg~a)h*P;QgJTvhDE* zH#`|?V5#*$X7#g<_o8~C^2&W3A?d@~3t?Yxyep5S-*J^&W_hdIBLA1}~l?CiFnt|As6u;bp(BQAV z_Uy_fBYzE|?#ZyPtpd@4;-n1JY|5GB`C+#*pfJOMLFVM{&SNqKuwSbRvBdxzcGpRA znoUeGPA(*m%#f{fL=pe}9l1_{-P0>}1Gr$%isC(hZEGiYz%;ZYx0h0)zIlVie5lXo zaO`mLBrhEDpYe&%?+OPo?rN_L(jzjgTxa@G0Jh(Rtk=0$qs|uXeY>Tvr+x9O&GIPKdFYj| zc~|2juQDeE6sZMlQQIzQ4AFFhy-TsJ zWFLEgkaKgt9Ego4N(QYKDd}1S*zeo?quDd@sbdl58^EoDzazw@t0 zsCby=W}X+ReM6J`jZIbZYGBP=t3-_k4&q0imd>*})JY;v;hij|KU>8PfkeUldvZ41 zSQM#Jy~8_4GC2+$WB%*#{+E-b_b&3SIoMDzfn~_?eXF*(`2_tg&HDMRMp7i;y?En> z6;WpR#-!N0cAgAu=<9bJkEwUHI)3S&^5t(?$z@e?5yE>na=I?Y%D_l-hW1&k?B^R# zYobhklcx;>5htUHpiz_tWrhic)O$)5ZPpQ~akH9TN56J*7rhJ3)k zo4}zr-<5IrkVVPBJ^rh{5+S{eira??JU;r`zHqB3g>T_T#TAk8lGU#zR7zDc8xf*l zqhIR^`07ZZ;`xeGS$M)FbNg*SOl?H+CwDGAPFEer9=1cgBZan#J+AK7q^$7~gz{=k z#T8X@6>uZ_s{j|p;6I#|o}XB*$ut-Pk>;p`Ph~ACq3!)tUBVZMu~ogii^OJo;pmS z{Od2M$goPs+m33n;P86xS^N2%*g<@~^y?*oHbSUysi2<*GFDh*Q%)3l$f1hYEfQk_ zGzK@g$1ZfEx%p#Wb-kkvxUy=G&S&8cs#_XxxLMnfSx(@K~uxaSM? zF9*X4zc;ohHgIlWIEGD?p;e0TFEU?>0Eq6K%O@vJlYjGT% zb7QR_2r6=!7>-WauIPDRvL=_Ix8L{i_wC?_m(1AvHnaFl5-?iErdG>DvmZ!BD!zL% z*=+J15^ImjSyAX9AqA`!N>OMP27Bm@=-X#&Np5Fr%!w!BmtvE0+Wx}13V?lQT`FN> z0eRy3c?afnK!T#L9G5p&UoTjwgg3Sz%DP}?3^C23sWoToxZjGL2i( zEs$9b6RG_-v{ZuBmVZ-tOQq2a6>vZ9QX^syMPBVQO^LIyfaMk&w(GzqfgdSzkQKHi z`F{kbRIMj z&Yest!lto!c+W#kR+e48oM4ZAFA(L3-i5e$!=F6RC@UxN^YIuh!?cqHE`M(cJeD%4 zNA?!*CfRnfhVzNgJL0T99LZi|pMc5>UsY0&yuq{jC~{O**=C46n=arSB# z4u?^&4)GcGL*u@BRgKstMXkPB{TfB;u{R$5+3tM(+inEIbr}vxvrM_29tZms<2Bl- zR-N&)5<4XJ_?X}}p4t5*ftUYju0v#|Q%X5r;C>=wjerVgyR=0)?Iy{!NRC6`=5O<4 zUp%7mKM3Tp{=-Vgc2w7siIW@xEmp98(?+2HMLq;o+evj;oAK52&7LTcf^7S7kfn{+ z7o`7mdYN>I3=-`s4Xuj{f~B^gIL)die`kU;K3UCszoN4+z%@ zI243cTusgL-`l$u@OL}K6s9HI+Nb%8>Sk%iVwKB8H4Qdk8XMnzGP}#%Co2BReO*!A zocJYC+}aZJ&PA3L1VmUzdipW&Z9e(6g@qp1u2pO^)Y0FiLM7e(b0QrFAhz|9W7pvC zQm%&i7pDh!|=*7P~`KQIKQR9il}4p=Mpgm7lv@N$>O0*VJI zL`qahf%;IS;jbn;ALAAPYIV3y1WMn0 zTt-gw+4k_f502VgnO+b-zTNtrDH@}idLfMfiK*SmuN^_c+(EU#_WIg&H}e*FetX-F z)fwb));B&~$v%9aDu>6m!B$6rgl1nvCx#GHcn9WuXD-ot*NrI9zI0`iPT@|&Y^y`*>B$CcFVes9ks{N+(lDw?VZ&t>z4?bk9vU>kBZEkj1PEf z#$il*w^e74Ze=d&?#@iqbZAv#$j+lI*A zgsV7;4oWs~&fwp8`<}zLU`2lR)lM*E8Vn6PY00=0BgdNG6H4X!Ay zu4J50>{li5?6kbIwrS`1AZMvS$Ll10S&62Dm--|Qw%KiVu>ID=t&n;k^HEN+IrKn? z(dvE1j|M90r~44(YZLc(lq=+XR*y6d$YLqmjWaJGRfL51*XHilMxvyFKuY@rh?6wo z@R0WBr+Z3DN}!R7&-n6w`Wgu_0GR6lY#kAzqN4KYddczoyN|iWb^ z`r2`T(hkYZE+9l$CM-AwIH5%)pz!DAj6YY3ETL7pE(?&D9UuDHB z#L>-OMx~BzoqH*;u;3ukk5p;aeFeKqLHtA^4+B=m3CH*XJ`V*_@poGpLa946&Z1e* zEj6iT?qa@9-kYzI`b|x@3wK+6wZUgvP=r|{vy@V8J}TEPMt3{{GZB~LmDiBp`16vBozKY(Z!OaS{qJRfQ1Zy-R=O>NR=wG13Uf!Bts%;W zdlu}aZOUm(1m~!GZv{}+NPV?vWEMqf^7bB;uT?Po; z!J3&Ce@foEg&a{gY3Gp^gQ@+o!EBi-uj>&gm&nBC~05*$sb%(p9%BRjP?V!6s|BW1OoMS`D-xJ`}fk?Dp-oT0ckUm<6u+ z(@QB33OOQ-y&|XYIU!5?V3w7`9rp&BhQcfyy7kCLQb1vG6TXvRmM8b7TA2bLTPp9R@z$5tQ5W7>-$CnQv2?fY4DRmqhK%dgu63w#ZWd@MZg72b$f zn&WvA@poRuUsefyf3h`n_#Ah>SM8D(pd6N6b?*C35DH1b(K#17$ae9c{On`y@kNDm zVC5-6D{`b}V}M*T_W5664vtBr69G8`jkuG5BmnwIFlz2m*Vask&dY1cE zDgeTPjf!rr0)%aTy{XN?snO_Ohn>UqZYDLL1a`k~&0%|%U|t%PFKT08=xE-c)bO~g z9$J2+?`57P+Gmp*6{D^1k$>91eZ+C#w%0OYNJ5SDJ^*pQY?x5|D&5xy*RfX@YpkHU z7A2ZzJ_c`pV)Qa2`&pb201-Xf)*C!y~{4V!yDE6cF@>_rrjP`jJB5;Gq!4 z6G8++#uIpB&2QC?XBZCf8*YOl-N^8a5Iw&P2shjr#+uup@HZTYnKP^4;&Pt?eSSD3 zAD^{UeuWnbp(Rv=l^{#Za^)$0p+yb*0gwKr0#Sa7?$UxXD)-}5V}p>O0=-ZThM#1h zn4;d>GiQrDh|oxNEHsj|Bpl3T7f|GNk%7%&qL6$WyVLt3JVfCVWDh~hukH&jaAqI* ztB_meSF^8BYUqJEAMFl21PX7}6|BaL0I~aTqQtXvVC-0F0nMT2edkoaittI6W;hCg z@Q~B~?)2=_M6Hfy_saY*B=92&vcDkf0hzCIhzRfH0iY*pB=P>Uw7RBqXidR!3tqdr zC*ZBf>s1tlnrq#Rt^QrZ;2{oz;2|EJvuF57Yd>{eN`$|2ao^|B6l((mB}f`#o42#6 zjaa2+ejw3NtK4<_V>Bu`HKDV0I>eLN%&{r7pf*8Pm7qtegzgdwvT zhCiowRbgCcl~&AayX$W5S*Ex>Tx%W;T8~3yBoO`pe0?^0Zc0j%o0B!qs{^nKSS?3Z+{pA?^ZuUG=DNY!2EpuJG;O5 zvUtEsAJVGUaf0M?J?*>I^*Hc-pQMv~xs*T&5}hQro>47u1v^=^rBMn_D^Ej(eMMK# zq{bpy{SbQQs?W;-J8CmU4-*R9o8Yf%yXg73Y5Tx*P{WM~p+-BhMa~y&{(m%m1yoec z|MwyYs30gHUDDm%-5}lFEg_vsNp}m<-O}CN-O}CN@A&-RA7>A{%h_|e_s;ChH$E}Y z`pUfd6dtwonr^iKyBVPMM4c{9AD$hDYcRxS3elw5;|#?u;UFw_M0It zP!JQumi_I|Rr6NW8h{N91ag>|m^9-9+pS-o_@CNVJAgUmB8tCm(~9FF${Bw1AB)nh z{EKkHgkzm*-j|W=#B8X}3EK1TI6JRYs}t~?6mzkJNToaQ`M%CMVPJoWtahEgR-fIa zsW%Kb<>S7zUNcmUd*1nWd!UlmC@N;tb8$F^M9Scosu&AXc(Jj@d;HA z2qEN>LilZLXan@AysDbZOOj9)dIdj1ROxU_z^eZm;T?a7e6G$`)Gp!dTB;JdG4G$-TIxjb)FVrhFoXrGsx5tYOgEa9=3?e_D_AnR4^db)7 zHt?$`QT4XXwpRmh9&5;oz^81KC)Y6>>e>zA>Q)+^XCL!KOWn_iF2bIbm1~je9d8Qp z83VA_1H*?H2q2KskqoRveXQ7F?}fG>uMnp0%%M8ecz*{dJp}NJoec zA7p>CW0>5+lM(NuQQ|#zd0#UK<4G1ikhU<$`If zEP2{~yX)VgC_86w37|+kQx|~KOt+;^!IZ@>i86jg*iX4gu=iU|0?bJpE&@3d7MBcI z58KYI1#+{5fGzhSs3y(pY~d$j|L-0{mc+8Fd{Yi_R!SB`@D{gA=V=iH_nA zJgiNteqMjCS;6g>N!4%sb=;8@zi)(=M?HP#wAgyqIRf*`_SK#h%5SDKOu8?ovn2O9 z3(g#=-4r}mk#ftINh))9)m+B&Ojbot+p^{u)+fXAR^sQ`zKTea=b1mqM|99zofoJH z{m9({JlS)kkeu8EIhn~SqK}e*_9-8MpPBn`(j{`*<3W<9{~RJfv?*jD=kf2w?f!WL zlz`q1C`jsdL_t3lh2$`2b|FI68)#Tl6R~1xS2ZoFUVEAhIlLoxaGQ8k@%{J_oAKIX ze+Gbk*pTD*7jx!&44TqD9B%gJY?Y@fp)ue1-de#N6-()XLKdkRkskC7pLKn9fCU9u zIRzO>R488N0Fl_YE{xNJ^w43ztts>OPav>R>P#j1;1q8RB2Su6?*xzmqi>-sni%ta zU{=%`J1xb#z|MbcxGo9ryus*=b~P}FAZ98lD+5&EXQ0?X;0OQxH~GTU)TVv?R~$J> zNkFL2$T<8uKh9_?(D((J`*e7*tjJQ~(};xT-O|Cy%p6waXMbh&YI{)i|K6cfMR1(= zdrwtMvh{K(8sS@&!(2Mv;7a{*HQP!U&tF+>J<0VO&uhbmLZ^#~+I^hh@d)B%Bs{fy zR!nxN(qO62yiZ>rg7{YL@F|%~mo8Ql(oB^%UgjC6XjoX#AYXKJWG62#+bLq~H_QTZ zfYR2y$QOi620u0AY}fCfAg|V$*}H}060gKuz%LQ@To!ZN7gPW}0zj2e3}q0=na}Jh z{R;g7EM9>W;RN}>&PBoWe(7*pE6q0=x{K_j*wNvE{RROLJ>v9!B|ohk(a32 z(W8flL^8Vrww zz*A3dG)q(@l16u8Ks{^2sWIjsSiXY#z>yQsoEqZoaAtwiV|@HfHDJ~Oy5r^LWvMZ8 z2XKoGMKE_R0_5Lf>b=4m;M)TbLeV4-)~vwBHrdE{;r{-9bJM85zzLAD{y`_MhXCab zlr5u~+EY?efZ!j=Q4)CJ*>Va5Oal%aZ@4eNEFNt*a^4&*1`>$N%7RD|g2Aq#;nZcB z;&N`+!R7Vzh)cVUTgT2jIDI>>d6Jp4X{PwG^`r`)l!u;5?)kmF(_f)7%(G>w(HAyc zR%DbDiXpADC>P1z-)9nC6G*kX1NcwRC2ZGI-O`?%!>#%Sx3_rFW=>vBRxd(qOYZn@ z^P3y-z1MQm3qmz*1)(7PMf`!p7D$VoMKTGxm}YmR@E8U6_~8K< zHiZ&&LttJp%SZ)~0jI0z*if#FFF^!B@u}NGk;ItrFvOjT#2?SxnzjA%043|61xm&j zKx}W#&W7nd1Ao~XOmOE;qfpG1PGzsS=-x#fZMLXCu_XZ!3Z$)yI`hkKpcKu7@P%?K zDsTrzZt}ZA4nG7EY3M3_=^lV1^ULKVZo(2@O;4WU3&f|blAn7u(wJRq-k@M)9HCI5 z2G$gQ4G28Q1GS};lt#VwSHS+|t-sej&=B>0R?nN{c|7fe{o%V+M|aIaJ3k(4pj7%i zNzYLE?mGcL20YWSKp{t8>eoO}`|?k*50Iq@@&EjrK!=I66O02ldH}M7e|l0eF+@okKtT;C6iMW&0D9%#-d=P;+^~t1tZe*H65uca zb&pME(9XFBM&tbnIly5kq`T67YXGROAg%~i&fdCnxT*u|^fw!_LtR)vD85b8j zD&b8pa`P6iVIe-$gCW;Vky-OjgfiR3f6cJuf7-T^$x--Fqs%`Hd^|sfBem=z>+SEY zZ5#WpFdZHF4uoEDWK|ap5Ql>S3l$&#s0qPBCCILTj9tCkZykTHCVJiBz(%&v%ZC%t z7vTUpAsVe-Pv>B2(CLO}=HEs!u(3HW)!CV9A&mZ_*U3{@H)v~?J@u74@851)!D@nw#+YS2y{+0BXooOfMdpj<;$q(oWP zc+AO=C;#`Bg`{7~2_Qz2_!AiprU5%$L>@v78`k|BGx}B6S8{kk<*ZK8HWWOKp+7i; z*FjA7U6`)kWki4?Aw3x}OdmG9KN2lp;WoVF%P=_Dlz!|ijTK4Ic-7x`X;<2EZvi84 z4N_sdjh-6(f1)kQTd#$6na@6kNREGeL>93;6p}?W2T}lDmFZ`j6t6*@TNasG?5M1ir@p2G1v&LJYA|1JqSENdh}2Zp@-g4ii6Rv!$(c_^ zzoa)`AQZ2&&%QKnT^6ozMe_?fj=Q7b{$QBHa3*s~)#`QnxU)ihlkOg~L>z9|yJuI1 zfoG=B+qDJA^4>T%gUT`5eyt4Whc~n-ciw>haweB~^9UX$nxo^Jj&X%n{ z-d%8wplBE0K>MV%HKs0G!u8s{^A*kG%-c?c;*ZY8V*B>H_)0wI#L>Du?o-VtSMc~+ zY{6e#KoF9iB()&ptdH~J+Y-)_u#|W3-Jj)HKqC1fG(a?>M~|NSypO0e0P(?Wv7)dc zAT+xUt`|uGE1!NR4Evg9S`Hc_hr@Lo-jbMZ_N1qO-&2(4EXxYjCYP5z-2bz3_op7c zi?b#Cji|+I2w2FG_#RJzcGei*9o2PYy1 zu0@JG6{Pn;gr~NY1gk^^aiNb(6WlN-JexN#wmSWG`G4-dDnok9jeiK07`+Ya|Bby! zW?_|1E)i|9JavC@wJ7zZjHiOv8(g(#ViGty947m-d`aElk0bx)jKRtCTV3@kJ|Yc$ z^ZI}QQMtBaGDusIjgVfLj$Z^CR9k*$>o|VHjgkc#I{MDVT{tcmt6m$#+U0MW0BZNe z&L}j0o^gQj@N>F#3B(7^q4Oh-v;O(}-m`4@gAS_$!_M_!t;2?Q!;O;7S6k1UnZ<0xO4om#mF>~RA2M*s^9Qc{h5*!%0j0n9lks3Z;%m5%O$X#F{c_o z`GDNEMG6b)$>waW_(0|3PF)R%!zvOI{lMKGh=eXKe;cnG1Ojt*8>OS=jX#E@4njPO z!GL=*&$>A?nd5W@>vhFSzLNLX4<&_ym8b% zb<{RjF*=%f){kMDCY87=SgRk;4UxIr$=laSUfRJfEC~qc(cW}7jLtO{L!G%-U%UT| zQZ{SJn1pJWJG#S!6&4KWC1tY*Xg5oMZbB?Ud5r%79tO}wn&;K7uFs_eZ1G<>-7x}qc&U%cQU+UE=I)2cM@%Mk z`e(*=UmJ-gGZESL(d_R>0yeWW`~HEz^0iCi`nAhH;~C1K{eV;ljzPFXF` zj+EcNxI;D0BrlATh~B(;Kr@CXWMPEV(Il-G0INNK!VYEx-haBfW$dN8evgE^6AN?%I}NppS=VW1LUoetOeFFzA|nnoeMyhnV)j7YC29QRyo>o z(kaG7b`@IOTA`w|f%jcK>9x~3>xpu1i+N%b8blVP9t?<=MA$hPpJ5F#r7>&l|_w08Mp3~rJAzvc*Zu|YRouuA? z;W>0_T*s1gozDWl|Kk{8CCyufSF3q_IMPZLd%F9&To1dS#YCeS(p(lUhmmHLFxo^O z4EsYsCvFdhyzjiMd8%Q%()4i&TV+rpS~xm;UE{4Ea`;AYz`%LNbl=pH7JGP6eZ89t z29OYaM}&Lk!hNHRAwOi_zz|AK+rN(?D)`$!O4iX3gK*e{Y4pNk1sxfDZAC3?9=eq1)x;2lR zDaB$U1USu)F%Ldad|0GodA|Cp{VUzw)uB7JMV~J@cAFmil`ntqMEv`3ZTEsJ7n$;& zUej)!2=#WoFT=)hME;r5&lv^eG2Yh&^|(_@<6stiLCx`x3SUyy?=oVf*p^<#6BQhz z2wi$h6Y7|W-5FFfBbgQWnb0vm+}mFHEY4)XhTxf*?dhj{0o#r;56r7x)9Z)_1J@NH z*AEzNJygKJj<A={1CxFN?-xc5G~{j%^%#gVTbz`W{`Dw^s43vRx?X zdM^7rIW`#Ged)5NvtRc940+QGNZRkFeD4^<9(;BjLi=0lZmfqiE@UIzDuY_F{t1Y{Vsb~?MwCFN`OpLJ+UiL-gLTs9DPzoW&ZZ`%;_oR^_$U9 zae_D%lS}>~*yW;0##NozxXrQJFC90tanFX{NliQ7!->(aBVc^WXzSQ@)EzFHt2^JmkE*);5@iKYpK|*QbiVl2e?^s>@?yCRsnJiZL8LyG z)w)|^Kp}=#6}u2SJLxp753V$abPIjtbIC8`=D2OHCb7jYRO4iag^aL#*|BWZhZFwq zd~DJG-6vLLLHCekyywfu6?=SN!_kOPcXtUJgSw7m*XGz%mz})9d%1&+NaXw8@q0O0 zR_OynIG?x$S_B|ugmv@j?c%b9nTOCH*m|~`1RJ_D2!FKDOA+QCbPQ_hoI96O%$oDX zJtDjO({_8q5lPxJLvF@d{I8sq1ke8+;yoDlGixG3$71=%#Q-TC(JltHRP?*23JR5& zj`)EaSTGMbxjE*|AIq$_(6RPhQoIZrJdf@I?$n!2oZtL+C1a6brA8G2OqyT=vjWLH zA@KFmi#MhSR?t!)T4X9>5C)E>!D)(>#XyeekMy;&a_rAc@|5U+`2Lo{V8;1JDS223 zptdwi15gwwD@rB-y8d?pK@9aejLRF8Qle=nh&U2c6E`Pkr^G!Et+y&wc#}?<)zXLi z-#}3bRfHv=fP1tk3e-OSZ6{#Sz{(wHDXbhf=SpI|y%_4!Jv7h1u+vcqVm#p1!4LP% z6v;mV z$S(z8&8i&3s+^n+{T~+KHlQPD*`}8s5Ku(q#J&@NO$vPQr+#8)Xs)?mWM-&7hCC{o zG4)`f`FHS7$pI;}W*>nj22pXk@6oFjYfw6UG>;q_649HblRKvku4~u?EbLaSDF$UA z#$in<8Pp?_G&|~!_r|r&c99U%8-x?#gWP84Yuf zDzJV%kMASNu>j#$;))&7E}B8P!lIJBW49}KX}9Gpp^YIoj}5d@F0zy#+-|P+uo;&g z6Jujv0xU~xx(pU{!v&P4D{vo1rtc$3TsKqq`la7}`t?_-Z-trp7=b3p(&GoJN@Iej z+w;)|Vk$YJ+#jzqvzK16+(^HfgHk4farKQY^ld-rw&0Fzl z63+2`@lk1ecIwB9(G>vJev*k6q`<;*4!Dk-ycLCKe6-{WN!R$6^CzwXJ4jbr_Wogg zNoTY2u|(kS?NVxxjL0#G>j!pN?6NxVrsKDr<}2TMpodWLE#D}i#=(`*B*yKR>X_%g zx()pnhiMYck`%k&d+Bvo*SGGgpKYt)@B1gpT#&==^0Z5EL|&!c9UKeE8@YeB5A% zg;g5};(`sEb+jNhR@9@iQ)qs_q(=~~nLnY%n^-1>-E+*3jK0<8lH@KMmGu55HGh`e z7Gg=;dd1IIC7}6kVi@@+Wxa zMguztq~F2#VZZu;mW2VHO~m*Uccq6`@Leu8An;xnYqy?gg~>renaM_dalt=jm=yzqF$|bv72sHo&Oe zET-E)xZNh+(G8d5y6;@Yc&6#DbKjorXH`p29Huw1cdI+x9w5Tes-Slyl;mfGA{s2{;mSmqG%+Hl%G+r)lDw;(8+f^wo3odna zanK!6oE|glgcY-IH?ibwb*iq^?A{Rp=?lE4T_p5t6giJmZ_5feuWR8yJNx(5VxvkD zpNnt1i>Uf9UHQD6%;w2jHHJrAujb{Q5Fq2zVl&?LM@l8>a0J5=ifMNO0)^LBQ@3nm z4G}%dzH5FF;i}$W3!~7G!}UWR0{Qq@w^qv4o$-(MeK{RPwThBUUo5W# z3Gh21GwAZb>tA6y(c}~v| zIS!AzUs|9YAtD)=;_JZmAr2!Rnv z+n|2~sp^VI<TaxwPY%3gO?JgUi*qy~3)0^|VbpK^)6aB~wBk&v**c;nL@mde+7M6fp5lZ~&TtbHWb|6bl^@Dh_K@KU0~ zj++A-0$De}af2wjcnEgLc%oO}v4x3T@15R}1YQ*vJvo}@o zZUbJmYkdVh@{@*-dCvGZxx?=IqNOO%L5ZB+OZ9xmys9Gzax<>7CmdTLDc6S+c6RI# z;+&d<=^_vEWQe&l>F<(wxH7)mdER{c@wSf2>A2u;+FUodEfXAL4_Zj8IqB#7har70PlQaaJj8z@AT9g*i(T`io22-cZWUvG?3Ca`M zF-07nmG6b+FaN;OH%~2%efGV$XAhcEP{wVGc`!+CNG3<8Q1$eTS(IZMrv313t{ID| zyGK-aFiX5>8D>j*XIk38)0IRFW9u!5a&NBQCO!jgjHYB;&+ct3;2l()UCt|`^#i;epj!8GsSMzx|v1do+ORHi{0OK!T3x| zB9COFjuD@PiRiw+?;2E0TlP_U&v#vsY)eB*;G;{#B8_iBZl=mx{9m}9rj{J?<%N}) z>jB2<3`ei!!WsiW3b#bqL{Q4EesO&U8=OGzVW5yppTC%cXXwke z37fWso1@ElerP`1cH1DfRD{ZduDbJ8#6|UC;Ud9DMg>GTDyn2Gkalx(@!$lSaMMyv zHq_SDu|yOgBu_G~e}(X)iV#KdwAzlwSuUdOr`pNaVCN+u3ylYbR_t=El4l+qHpsQ| zD!@g(Is2dzv)Qnw9vYsiSzw~M~1OI`qvfhF&zp^UH6;Pa6v4nWYpGGTO1$}5C0F#n*h z>JIh&cfVLbReGaF0RC60#nWIrx8bB8s8CKLoSipf}g#E-+cx7Mp!|7tPzY?>@U z4GMxhSbp?|D3jvtsae*0GDOi=4%>Y91BclMKNLa3k%1l74LV%wPo<*Pte)EsJmgOL zg%n>b=MR+`8NQk1fFUBGf5V)di}ni(%10jqywH6cgZKe0?1Rl9az#eQT4|q=uChqd z;eHNzjHfcFVP*iiXL4wt#b^qhARt;aH<#a|T3u1`q4$gc=_K8HS!?q(q$thB#BB4@ zkqK7I(2z*$0#13OD0rhTQ!LTSrm#m9C_0O@zAKv@ylBddOYGfPV;?!Wp&BqtR$-RD za%*;LPRq;(h1CcrY2c^>qcSsqM^SjNK@3H({Hir6`Bax{|2p>0tE$9Bz2?25ej?>V zAthEWDBnp$yXfdA1nSWPx!?awcfDG5b5874+0ZMyg~k1Q<$_#1;w!2P`gbl^c4;c? zCNi>mqfp~)uUJ`uEuORJL4Hx*=nOkbzh>ZvcAQ*vs*&_kN$FW#Bq9Z6I~v;&aXSSW zL{td9DwPHa#lrH~7=KVnEX+qSP-NKGyJ772MsFcyw zAb4)Jrxq%wTdjB&613}gLit=&Ktl5>GJMV5H%5D*d}=E)+6e-q&Z*FBs4c#}+O{!+ zKne=7Wnq4_=4AMSO~2kfXmW`#l)%;p?zhGPHWuef{E`0V0^Ihc-6U*+hyB|6*8Oev z?+ECEyZt+hyh*WWVqdsX9UD=7&%PPh1P1Q6T+U}xTkQ=&*K~vWeq$URYmaeNs)74l zE&lMa5kl}6tSlPedHFNb#q5bBAds2CSEntx0kBvA`sE1VLOp%#j&gn!Dv`wA7F^dPWv(^CRS?`lFGwCCD;qANri1e;NU1L z-1{&X&1JFcOC<(e$tz_K54ye&$8C{+W}zV+_=z?XJHxn#X;Qd76rMHhqn|x)P=TB& z9|$G7OC4V$Ey=w9we6c|RkwZTD8@zG+0%PZ7n6gUzIhY}gW({X5~`B#L*pE4Et8hl z$_t{r3^{Ujyx&&l)}7zuwbEOR<%_=x9gkvl%>6URVo{usMt0#@E~mitD=4 zV@zX+e+)~%`r`_poD{5>2Q8l@!Jw}~{Y75kh$wS?z4+6+2^5G{|JoBn)`NdwRhX$0 zP645U>3f+94SK2PTPQMByyZV+R@=M0QLqei3W^HS-Lj!<2S=Tv#%XHKR*O-INu3{u zGRs<)@Og>Jun=GZ^kJ*iM;~NJvwIopWjG;_4t|KZTUEC~JEK^*IQ5e2U%k!Sy-sP? z6-~wAZp4w`IuYT+JAL6{XxT8i^iQIkcA8)s&RYRzGnfps1ez@J80;+aPCG4R7!gc~ zXzD@A0Y^?;naO{>G2^PsF-8s!<=8jh_2@CC=0b}=7j3E!^0&q)xFC*NQMyDcde3_{ zLDwc1ihyV6bmM0~(ZpvP+9fk)fO+ap?LPu=OqFi@AiM~%u>PjhdP-3S4kVRJWki@) zpF-^KKa;Hnqkqpe&l=AsH^dOFDb{5sFaeWNwcw^VW+FAdCSVlT?80v1;K7oQ^B}l< zHz7iaT;}<8K`wMry|Re>rmK$pOlK#2C;f{GM*m@g4Yvlye3^Ig^1z^em(AWPottJH zUzTn_r_)id@XPB}*P(K^&NR7~8WBNA9f{3YlK^YVQO^UF^K;c;IUVca?P*yGa>rN2 z^Gtb%qcfE4(fnJZhk;sI0%`O#Cd>KC{880P(v)G*AQO&i3p#P;1G~0M6L187t-fR~ zljG2Q6tV?MpAYeKz8A3ScT&2?^h)VF>jT) z6dy5z^K^R>2+maMIuk#ek|HtX*q=K4uYH?!+h~A91hvA)w5UK*YEIOz?MRkkmrEmS2X>Pmwq(HBA> z10)9FApBSokbX13B*2(6;l8W8+){mDYj#H^L|`KwcG36Pp_-8`gD1-PR|KtBuBM;( zx%if7L4ykMHMhWZ864HDmZJo`H1V^e*UZ|a;o>skBQ!zWNdB3y(mHcM%&(_bQI_ay%GH=}PQ%|H*`tLoxK83Od zPWym-r>YfiULaczvwpL2kcnx_$q&)%cKZ2(n^)Gy+b>M}_o^y!oG`%*_imXl6b6#-1oby6#{2eu^T0UiJpE4S`D&ZP!Nhx~pox*k z9Qm6{YuW2*m5{Tu;CI-}%r^elK2vohnZzZ0sxJwh)ixS1KK+>Cs-)RnfdyEF({)Vn zIJ%M8ciZg?Ea)2X?`6!K;X3FK{om}-2J1S{Kk+pd9*Wv)nK<64RI83nOq|b~rYkEc zLE84Giyp2HZcaOqiXLSiPxvvc^gqA`YzT(I8fN!@$UuRi{A>P#z&7{!xQDmVulv)1pPr%;oF+;J9F?55FT?w8ia z!lgfnhs=*ol1nE$M&_>5wQYx~!TECkFg>VWV)6f`WgdZiKYSpn`f zKR>g0{MQi*P2bj8Rjxd|7&JYg;PK^2!LPChJp*WS6`$4jA6O?h9pNAz zo-GBFt@J)GIQU%bBZ6lWNV5sCtalAr-^ymB}(4pPO?z-|Pnvxe)+n1dt#=Jn=rP=$)9DP$|*KxvfbK=ovOc`HnRkg}mTY zu_gy+nf(0~Bvhi}$wk3ppp~Jg)Xo%i*j7{y=hfF;N&5cKnIw#(+@`#%Ousu<_!)8+ zQQdvQJH<9qfJovb1JvBz+}wJvlmUixe0&@bk@Aa*8rA87Klj=Np9qOZchQHg3!20+ z`hga(#Y(CI(GN?iEHq*te0`=1aiBn@f8I*v@hXS7YID2IKMr33w0f}6 zR!ih5vdlHgW&?HDx9sbY1p&v$`~{}7oKPsBSf{xGw48u;<|QFBGiOGQ3YK*&%bm`m zrfV_SNh?&A2RBgiuEWMf3mg11DD)|0J#zvV9Sh9Wz3lT|IEMmSsr$U{2M51-9m81$ zuXvL8nvYwRH~MVUrQqkgHLq;h1B;i{VlnuBI&y#78cibzLGbz$5!hTAZkI%onj{qR zoa47-jHV9LvoprufYF5{Z>@5vT+GjZl8tqQx$bMrHx(mM4^2kWt0kl}@jm#n+z?Wl zBZTrZ#VetgbJ*LH;9yT#RZ=qvzqI*00?vW?-A;;xj0_DGm7#i#=P1*E=m+7hjJm?}oHI#u@XDv=nB6y)MQ9N6yReXwquyc0i)ng#8i0O-_kb6JjE6_lIz$0*1+A=#GygU3C@CfF+?xOv zJSYghyF>>tEII*5&h|<{S@~+k{Y1Oo-Wa$79O3KK+xr9SP%=fKER+R}q6aL$F*N+= zu{?BM_UW#l3SODtx;r`eQe!i=l$S?Rm&|y4(Hj#ls?%s+o6Fbm4IdcJtob8Od0SI{ z6t)%-HwB(Z5|fv~XjI^QDS`|0^VKR0{B_Fkf#=M50?RR3baeE@C|ttm;@6Frrnoltun*UU{Jl+t!2Ze?{CBgb10V5h(>L-m=M zni_cW8n1S2zr$*NhtNqXm(~QnP%`$1O^&WTUyJpr0>|tDf zRu&e~AXUxzhq_^|w+hOyQ;GVgDUWJ8X*`PAJ@1&d1GGLA6?YP*Pox0=odEd@XwBw} zl1eDhV<^S`FZg3aGSsqKTj88g+gpR^@fY9iaZ9bLabcgbz7~x81P_y(l7d#|MSyH( zZZ6++U)i6tKAm7KJgtVb+OGm?#1@ESO-4o5rQ=qo=~Jy z3FzJvqH4^sRH!7P&!wWY z1Lk$mLHl@Cmc=u54=-IArno^lJmd&iJO&3)%SAYGI{+G3F4R3w<88*ryXZzrho)SH!o$a zlDueiHb9shW&u1i$kn%{0mQ{L+Bo=ns8afDYFQf-ER;q-*wIye=jz?d!FYg-$jTkZ zhx2BijoaZ$(+k6cr^htL)t5!(n;X{xeK(%`x-5=xA^86fQsD^g!&PW8A~a$TAH=Ow z)ZUl1;_Tm)#!S$!S0}ATJ!W5uX11}HRm<}bK!*8F5ZjQW2R~M@rVUe(fhcsKQotrvHN{0J>lSZMSz7QG$fiB)F=!Xg^~S$!4V4nlrZ+IahqCR zN?vM5pGYaiP*!j`3z5VHlY5(HlUv%Plh~c&WHxA`oP>F18W`p~HI*MGY-$IQzBMkF zs?kEo0R~76o?-z0JJ=xPMJJiTzVTn0Qb8>xADaneQ~niPP+;0O&d3LZ<*lr(mBG~2 z(9l3NhWyK81~-d(&N_DTELM3}_|HDVmJ^UYK5RsHmXJcs7%%`7s*!K<7{gPp4(2~D2sp9V7fE~_YC7ZcRO+_7hq?TTdS~)A2zt)Tu1=YoM z6TB-{6^;%5E@`S2C}^W>2}%t_j) zpwp(uIv&Xi!tY(Vg>=92Y08`RsBUJpKRuOxX9*utzEUR?2!^Zb>Ays8^9N(bw^?i^L@f~=5yBuh_MwFYocWt7uA^TD+#flT4Z1b)bd4y28Z$w{aP)H+@3W?Bu+B+<$H|!Y+Iob~__}ftKurV@;hWE*rm%8F4 z^7X~~=S9-uFTdBvW~{~NW*=U+InIO@M9^Vle(S7_dKn0am{sW-a(}SM@HnUWOG}AQfuji(>QAK+QW7OQwZ*I2YE(bV zuaR2S<%s3HpT|Am%CGWjtry%&dq$y6>`AYFRg)7A3P3;}^3oh(5x~RsbM{T1+NN`fyA3EvA|@JS$}P8=QQe@ zul#c;a58CZhF|~SK_IUOk&YMaGe@?vUboRyJdx2Qa#6=Srfb$3C}wE-SbIOW;$q-2 z-2Xh0HVUq3evZ=L4v~UOZu35`@=le|V3y}@x-&~k5vk+IeVGz*2oyb7kX7#=3BwML zb9I%*PvbDT{$g{$IqHXwesj{F<%o5|3!;HCU*v`_2X{xu1B1iNknBKgFGfOF7Y)Db zpragQcHUau+tu)?vc{>xL=C96x}n_!F-327wU_a|T;e?aaXk<%H2SDHxI}mjh4$u( zBCia(vmUOr@O-B6)Vd7oN6QRh^FF^4k$OHP3m{E=HBDA)J^yr;ySuY(n!;NjVuPTg8wama8dWSpNs7f@&Cg@Y2`}Khw zo2viTs1`4QXm8#AkG1hG#8oV=&cxVc^H;f6i+Pr`oV~oaOTRIia=soUBT{|sy{MW* zge0boB}K#X(X+7)bf_M`xIM*(RqV-y)#QXFarHc{>3B^|)IXJAnE!0c&;WgjNU@Aa z;_|D&)`c|I+`nhv#XFq8-7Mgyuyy6~aB$*)zHBM5?4>fFAd+(E=-Li(XY`0UsPQr5Uiu2T+nZWREhQW4AAUyuLTiv8%}&@m={GL zu-N?bctP?|WN|mXMo^u~qwLSPO^cCW+zI(i#@#m4TwQZHLR$`41Hzh?-y#SkCz7kG zLwGrFuDVs;v~MExuD&x!!->n>Qoe!6J5AmyaY3wT&kG+1Vtx>jX3xKV^W-SyYL|7A zQoQU5^(ifJj917+Iy9oo0}-(u+W}J1(xBs*n5>+T>S^Dh6&3K+zIt#SvZxxc;O6FH)1h8&Jv)F-!213xo_^2Ti3sMg zJ+i14SzB}Cd*UVYLG{Ll{+T&zOKxF{br2kpBHY%uC{-we!qQx{%!lkno6?7{)sF{7 z79v^Ulzggc|9)Ir;y?S^TA%4)iwb)Dt|+`503?>+6b|Ayl&dvuSurSx)^NSlD(?c= z!^I$04$ash5>m}G**j0}Blu3yP&BVsQ*iJrW3@U?K~{h(=q* zpfF_Ndt%jCb9mntc^_BhzE9zFKljPEq&r8LHu%6xbhT?TAN@6?2=t^uiP-eWQB;OBaFu>%Zegmw1! z)y<^vZT2`mE5Ca=Wp(tk+xdU1Bp=<<#0%6d=l9Y#>qPvdCUV4d=&v)6kb7ry`}Jg@ zd2du&Y6cqEO(B5M8jDxdyU)MWpX?c7PDq=pa2-vSa~ZtZG3o0^8@;IHg-LAJYXiMW z$ZY%pVYo?DyO9#kR=cAcET>y@qt!po3Ydqcf8mVP$)V=|V;AKub&=rM&N9SK0Kxuc_dw9+(o_!3mTuagpY zogh+A@nPn;G@*yB@39HvV{a+*B>MhTY27OyFT0T!D)CMREBBu}Cl7;YJWb3EqQ&fW zTSjpynVwfWPKPvG9k7U!`oLo-&IfYioe|)xsc=nXH zf0(MLIfzJLbN4(BsO(@eW+Rmqo(ghRR49l!sQL8z10EW7m}_Z{L!ZOdZp9$tF=Y5c zX)-P(?hh|xrS*8joZ6~iYDI;%?5s9i1SThE4E1u=nz*ZFnhz3=H2)PZx2Ro zR~_zHw=r3mTNwJbx3@w13jZCToCEZa<0mtyEp2Sx1Mu^Q={}>EzyFF;;Dx)1ND_H4 z$am#Q7n!IA!22yy@$yow+w*nfe`T^7W;z3N@4WYc@$vDpl6RMsIy3)|rfYzU`~Ux! zR?BPI+On73mR$==mu=g&Teh`q8_TwByZ>ju@8f@ud-S-j>#n;#c)gzlN{XhYauf=t zGJahi!9qeLjpU020`&R!0KlaKD7K~AF|!STir2e!rTC#h3P6EONb(PM0OAUklF*^B zlXO=V&)!S^kc^=Yvnbt_TCz+1{n(?0kMX*<*?%v~+V^YdBb7xBMRjG#maz{$k&xMv z0WVAVph%5p2Y>DKA9HEDI1#uj)rV*tvVb_6x7L_M5WC1d4zHp2(7q#7u%|L)%q7qs zj8ANOvqIHf(F1;Qs00c8CRGR;PmQK@Ua_lYB#mpBG46+&u90o!aqmtRB zm+bVfVJTdoLH=I~-gnTW)V=**m~im!&)<*gJOotHf@Em0UG+8fCbk`qA z0o5(oNJ7+k>rgA2dZf@CMnuJ%o)|JenZh{o5Q9Z^hmtiyk&P7Inl0&7z+DsiOcB1K z%qDbX&jk>jLZQ4-`!0)qEVWW>U)t1}7vq1*2cpJCWD1RJq(mHO0&x`;ds(sM#W8>Z zA=_ZU6w-@tMRk84M9e?={wujN_&@*R%pKZ? zGAHEU>I3YlsXhyHncMJdi-gB`R4`LaLo4Q~W$$U`=rNYoK2|%&x$CL6M>yRVhJNx9 za&ZO42ATX-i8)}AkMFx{_DSe#P)zDK{jnD;I}oV4rvJkWV)R!sybBzCoMg7w$0ROe zy$@1eN(pshy6dfc#NLfv~(q!^v$>)-n5epK%gR*{Sr}g&;~h zqgaKM%)9?KY(-*KlM5!?G5`LdC(^9aS9K1PdNrg|S@i6ZqTchtAxXB_AL^egSXoSW zav7ppt4Kn6_ITLh3t!@kYM?zT7K+ReI=B0IFQ*#m$3xtO7)O&i-?~PtG$sHNs<`|E zLHidX^d3fHy{iJczp0}iplZGGXq6S072KH}2VV-eOKA}6DZ^Gv1|XhV7d+!HR({DE z$X>y?OqsJBGpgL(ykl?1SEkq<#3ltgmc>|X_%R?s1Kp>-#5Z>@%q1lgFR6EKLKvA71krGmuK?-{o8>~Si~OHL<$4`AY>M> zi2?2dfY=ri0|2Aie{Q-!otbYw2EPFP4v>{9kDmVzFxtPS0sx~MXP!`Ie>pR=<8uAk zicX?CW&9#Qft{D^Ze!j(x}r*|pEEr*MG9V-7;tFP05B3JBU`{(7xev7#drSL0r1+T zkMCb|;v=(eO94R&lNrD6rj%=q64RT2NF0MqD`BwGVwTFJO2Re=YkLXLIFQiMCj+2k zpHC{(h#ERb8}(JE%Jr`p24(VJjYHeU#tDip-rbFEpTnLFe=P5=r-Z^LlonDR59$0k z!!xYmyt&=th}?ga!%h7Q(P^VWGag7gY={B{0R6r6`fSfgbqTN?EtG%RY_BG2GSiz5 z@c6#?Km%0&STN9h5{b6M>+n<^&1&XeP-9VyAvCyu9bj4Tmk=4G6b`Ps?`EaAy<^n1 zvwwvTILTWh312YR)coAR!pz3DhdJ4A*m8GPYVK3^8*vD8kSiUza}NX(`01cX!!fmm z&$fK~T@Kx#P7Na$NqQPHEPplQQ91pH5RT0DYc}OEbNI^W>u11wp*#)Ei3iv$ZtbyU z9_G8Q`ZBdR|G%E-t_G{rsq zVd`mX&byv6KPXo=y;fU-S#x?}b_yul7}DIWj`+=QCUEfODj!IZ6%21Yg9_A`|1VY}c zt&*(%3IWnscaZv?`#ecF%Zn@@tDIT<>uM+fcw$6tL74}Ys9W$i4*8MNZ~BA>L@*#= zxc7WgRus-2jBt8$6`_vQ0bHIm<1KZk*x$}zYFj08DYALX-7u9ZI`5S=UvAG#iD(Lf z@YdARUe{rMePa8Y^JAMUcZzKL)HO7T4Q$$4gZ9;6p!FLYA!vt>KrvJ8&hwm|JfWn{(V+m39jdHGz@R2&MahEt=Q8PlFxkn^nbIamAg&s{{pia z#YnSoQ$c@7e-mV1(O>v-F>9&&J5OSc$#Ix*L3-z<1ZT8x|4& zE2x8+e)Ba5R=Th(29Jdxrb{ zzhBE9h|I!DHGNuC1OeMz#54LS)fz9f@tG5MXy)UQX>zIqb_iHT`fVf!pF7*UDleOa zs?lSc=EZYDsp#2L!m`-LHWSqke7JG_rE> z^-MjJ&_el7&h$iM5-~vi0fYwN<5#8tIG~(Ikn}WQk5fx$L?q*W1N?U~K~9qY8@iwc z`|oBLL8R zSK)-bS}Nk)*37IF7e^2^6d9vBtR_dNWc?ff>~RZ#vSN936E%{ai|1E>8v*Wc=L^)~ zkkQcw^o4+(&KL|(K=pV9V`Gl3cGWJY!t?Pz?FMd7{*7IZr+_6emi#fSBQ^11Yp;YF z<#}tVwDPYQqvL|)&wL$IS!6QXb$|~dlr0jMUCiLD{Q%Nm))Y=&2}3uCB_CqGJL*S~ ztj@?tpWQ9~=g7nEn?e;b)dyLtSF3|PW?W5s-u8Yo_56jXY%oh^m!t%h$B|<79%&aA>#(dnpRL0>vAO_XJZyAw{q!G4z(87Q$?_>th zQ|iJdtOjEkR5y*U#%^*%>MX2MOFK#^lPTKCHM#!N|1C-8!W?D}q_S(+Knc_axVuQL zT=cTVQTay?`>iEPRnY)dP~gQ0=B9k$^p)jQ$}p7DqN*m#cR(-*&zydqY1y1fh-Pw9@)K|?Fz7g|z(RvSG5Id7Z5RL!&Y8z@&}?4YYm*lI>C_CJJkn6m zYN{dAs{QIDSw#JPC`3dmau!5<`K?FKHSSW4zffB-=CT5YcSyL)VmTpS?hD5nqYu>+}wfi3#K z(>i4+zysx~07YOUjNt$e#PRRs?o0ge`WDG7j}DYdtt>eAKu3^^6GjzQRmHH0zF$MC zZ|^dCH!a>#eG+UxJUTQhjW%%GlUYASOB$J-$!m39+_hz8V=JjLvNSf9i*H&z1LQ@0 z7v!l;)Q)@!%s?1Ll`6VdigTORKaJ++CBWl74A?lkw2g_V0na0l07OSuK24?jOF5#F z8qjsRE5QiLZI@ERrr*(HVSdny#k*H|V8d|nl#gDekMk0wcGLy|OqiaD)#z;7pZbFz z(i?StNFAxmDq43zI@rLTn}55*NSb=6Mw>W+B~)+JE>7lBaiY<2tKSrq0Gj@_{Unpd z|8>$hf4u!(e%Cwb1FO}#Z8JTkPC-%H$Lsw_sc-c-U))BJ36|`$M*GBmGclXplr?Qn zms`BU|HNNvK0VlV?Eqn$NE693HX3XP5(w9NTf7c{>!D&ePMZb-t6zHQ0Q{DUZ^nL&+1ob)|l8=lrR27gT*OxdRh1teU3vcOF_`?33v-vDkv#?w$$K~s@;FhtHelrG;aQO`Q*UoC ztWzFsdFS>eItE65VWFs~sMGP>sUXqV=}pAUgCzCwNrvBJAO#of>+J{FzJs;zm%;QCQ=rb^BbJgNpsl~H#oUDq4v&pHw9$R>h0RQf_Pc?_&6NT5L%C|`j% z3=N8;D-i0S!`s^pIpRkUF&$FtOmbWcjgCO9zVv3(v`Ses#5mxD>I8v0bYwZqlnFUq zn!rDaSbt??WMh%b5KJphsg@%l6SA#oHC_F=+;fSJFx=fq-roAcZf@Xd{T?%K#$VcU z8^W&=t!P24*gJ0&Tf8wK!jDN6NPSt<#Y8dCJ^l&`9~gi>ZQYpBuUhy-E; z@~(jSu>b{#YwzIEJnobufqhdUdLJO$MZHiM&dBGreY!c!6^+{4-*5On9qQMq$6egf zA=kh%z)1DwkM!PbKLspqdPahgS%>UALgR%$N8oLMD4r@t9IErt!dYfk;9FZu??YH> zx$bxTcjDEEjyzU1y8qV#eA09l9V%|+g8JB75GsL(sxTMpORL8V@~%d6A2v27_ny;G zI`#G=?S|&lpbDO5`Xax$b1;)t`2~Hodxo9QTmRFilpYg|SyiI^^5(gZuz>*=5Ee3m zSI7iA)-2QTXrhI^VwS5^J}F1HNQT@;Y`7moi7lJ?zn5eQY&ulQ(fVr}c)#D01v=|~ zg8imV7}{-)9GV-W`3{MEf?nC~Y&kOS-0>Eb|Ks6f3f;3HS}`=~iA+45>d;k`H*5J4 zBG>SD%2uuO@k5fN^kQxeeF#vmiT^teHa6vR=`kxU3iMM7v&bb6Wj}?fm(=|JTy9fc z;zK7JqaP4D@K`06n)>jl@Os5k=ba-WD*onLgF+KrF>Y5$DU&J2U31#P|An9hiC~W5 zE^xAQlg;iu5E_!Na|Ig)D8Hc^{*@LN@XZDCW33ua6lDC!ZVm_Tr+Esz-!y2foM`eK zft%3+l#P$96{2_z@R|HK^c0t2K0T)Q_o)T>j-ZCsC;gN8ZEW!e}_k z>GCck)TDuyUAS|5_Z$$A(qPRYJ(&lr=)oy_NsccwmtdAinp{^TB35D%m(?qOPJC=s zj_WW@@Wgw#SowUNbWbjM$Ll1rNNLTS1-g_L&%o&;A`6GZa5t=0_#du&xlZ=rKM&dLC6>>r(Ps1&la7iH*;CRMhf3R-n&M(c+)iJ zP3Skd5WR{bcgep~XdQp5s2_rTNsmg7EX#6Y0;}OEawZ?UK*}FrLk3f}j<_kfbn-hQ zWq&3qt$Ah>!$EqJx4rZRXVQb%5)zUvrC#OkrqG}!pkXgSWf$|8A=oFbfC43El)c?<@lQ7AjLwf`jFdB~%0&(Q%Jizk-z|Qrc%~KXjCFW$&RE;4 z#j7A#b{iuOKU@-rhv+)#jS)EeVv}U3!O$3g-q|FY>+?DtXcG)x9 zRVhaj)iosq=-xjhIHSs%Q*%|cv#O2c&Mfw}Sf3!}}q%*eHDXQ8zIjgO9Yx<*6-hqp4 zdSvVtSvJm>;8|YMwRfd`mvYjIt59~?a`q=+b{5;`E6_U_6&0{6@134$!6MXhv;4Ev zcp{gS{zW;{JNpwNrx+pQS*V>T{jn7-4sr8Xk88ln4Gfu?Q~Py)Rj+I!AT&h@%m^FN zdRn<0W2Hg zzJh2ipp$xVmVpMFfaY}0zz`}6oHgX{6E|mSv5=`XcpXxu{U47WGf3Xc5(Ed8>^#>u z{VZc4QG4TpZgE+@B}S!!K%m&KNMe5oHEU`okwCJaSe+$I0f+zu`mwwpLiLaVwa->5 zLqQ4ZayRJBq5>Y?NaB~7;(g9(yR&a~Cyx#tM*0*!4bd5P!cN}2wb8C5c}D`_XZQy0 zXu*f)cb#F;i&>Adc-uos^F_50*!rj86$5smjR52f=HaT>!Fr2*@!-qTBjXnKnp@Ak)MVgHe7+t88=bU=r~At8Il*F64R9^?yi zbl~$D)*&yGQB~Lm=4_r<1F~vNnf4t{b-Dy8i_%m@`R@^PaZu-XjMk_iN4UfWrzi*b zw&v&M1gxVl7Rl^CW1CAE*H7&1<&>g*yNX!7^#v-ws+rzzs76##Kn*F%KMv<$rrSli z`(WW3KeDvI&eLVQ>6qx-7Wsc>W;NF6DsMT!vRZtoOu{@VJ89p!s!)Mkq?%^aclULa zZhkZ6O;Itsv{Ed^fYesQ!hjY`t@!5d(cFL34JJT+8y|9l8H%H5OXldetZSi)RQ-xU zoRK<&Wj$E={JGMBz@W;_8EuiS{V+ODFHhrZ>n zxOIST_D~iq$hvkl)0Jh>(gBqxL<;)5_Qc6O?5gKC4U6Felc65@)YXV!16{3ax8VJC zi>Z^H7#LxUt{5iWyff#s2>eB{g#(xKbysCb&Ea6L2)SP;9J16{b|j!R_vd~-v;ul5 za!V5L~V=8{k5aB>g6=T&d(#{FLtLazKJNkox z-8*pO`QY0*MP1Si|q?DcCJ`YB9|04+7XCL`OZDug?wb^G8iW+)6POAN(|!y8G7 zne6hwq4`J0O;5WYtk=73D<&l9Dznl4yvy&o-K$vgh^|GI=SPR-=D77cM6=hh;^R5F z0Lc*nDFoNbBgoee z!+(}5Le~m(2A-`1U3c9VL)}4OI;?OIkHThiqNb$&CHyYK)yIbhi& z0$@urSZrQSYat4FAZ>+O)RxA$=|_`u^*TlWs$#p23~Xv%F1L-Kb;8WM?>wNNel)JT zB~{CX<0>U1oHeWgl*1^Bdmey4 z3~T&~zDBJa&bRg_ql10;*3YI>IiJU3Y!XN~kq*k{iV`OzIx;xOz|BH5bY1$|moiUv zncTk-IFHG>H2EJNq@PN!efUdwrPjxCC5 zzRDV1V=9X-aIM+`ox7`M7Rr0sB_3O&OE-tDvy1*{OxhXrMX*5ER3~B7{aLL3dH1S< zvZsehbkPt4V{U*X1=3zj<4=7{Vqk0hR9dUXUll&)?+2HlR-Q~<2b;xNw*xx4fg+iK7n(5xhWw+KdE<<>x4Ln3 zsU#uu=>A*^fvWnD`?`tUFUcpij@)Hnov!vP^}LoBg{=KNK3Aa_6&m=+sS}2uKL8(B z&nDyWi6b{+PdM`vZ>)SE(8U)U&YU!|d+CgAVA-&o#F9V4;+FI)?Fe)a<;T|0LgNd_`LOrWh=FJIc72{d@94VXs61_Co+tK4`Gae>LC1!G&yV}A zY;Xqr#mup$XKVF05G?Xb$K!jb5QvxtraWtv9gd_4< zK?R821RnvE=3yJMN;fC17i}6$9v#HbD#wuj3fSpt=~h2 zx@fH@XDaQ-e~h-G5V?(*;X5FE3bWSzfQU@1nzD48%pV}nj(O=Uc(6B+8%WE3lg?7} ze%m`1ZF|!~ghcDwpsxSZ`DEe?j(Nc0U7tTW0hUi_L3TQM4M1if6DK+2$)mZasUUMe(TaW=#AgDhV z8mHZOr(Gm0_w!@sI#}OU_%e;=*Vb#EU~>~fJ_HP*U?n^4Cd2mD3D)f;I@1c(7&4!i z^9IZ+n=j41$cp-ZF(&jqK*GetOzePgoGY1qv8`}lXZ;Kt$VadyKjP(#1z`pIX)w=s z`58)uylERK%M;C$8#=p#8G$mgt;PgJD;t)wah@GV>b~sq^Da`!Q`9zvuzNA^$!WJ& zw&>~T=(wnAXGWIiW{p*EnG=At-@G>n35d2HsS`yL#z=<6>b&!c%9HPTgQAtcs_}mD zRL%1xE*_sY^&Dn??}=sp16)>M90mV4yu`{&D*RlRJN%sPhpngaOZCkY6`PQ#@a5{~ zX$H@BI3J17+A9(z>Q!TAc*sXiC7{>gt$`+@Pvm}pjEuE9sJ%T-s}jf%FW4Tp@*@{- zSf)c~P9r058$URgl1C5Cv7of$N)KO~27!WlHgl!O(U_X6p8wq^ls$o!EI@qmMHK4P z;Vd_Nd>?>eL`6hg=NsUYMjTF;SZf~dsMJemsZrsuJ@zfw@S+B`uOHV8fRj?sCLAP#T+?(^64EfDUe-e0_a^UncrKM?~z`V^B(eAWiAXSm`Nr<#E%PBdG1{ z*zt#$YX7=61wrYqkbTdcho{V_as74e{FRJ>!RmOf{G??%ci{1QAMjnW14be?lX9Tv z?D@Q-W4c1uWkC>iCxjy7V77Fgx1lpdxtzFT?Tn2Yyr3iPKLt`P4t0+3#T*fUoNwqj0xd3^=CGF*7H0B545-=t>DJgVzu0bYeFq(z zTyTy*uJJ)^vJ3LMVgHEP>?BM?r1%TUFM_lFev!gyfa#);`aSVxMEOfi*u%pEcu^&# zSulIKIh(qJ11n+=(442I@u26@_;5Q9MnFKQ)NFAaFPQDQmw5z-`%}z zKROr&(QtDw>sIyl_m2Tiu-@QLey}JRd>&7~ne@bB0b}d@EgFP=-zAZXMf<{_90Lf1 zFTBVje-Ec-Yrk6kUcQuJ(mES~`(2Z+;;2z>KEh0BE>peZBsE>-l%4O-qPb`!pp!(* zroSt&-731GpQ)?bp<=S$-QCq}wm*DJ6G{CIC>v@m4IH66&YyfX8au{ zU_^Z~Za&JXsjpp@FjCW!9fJqlhHjM-Dtr`RD z3p|WB)a)MDcmGD7^PKG3RucV-V3`VE$%NhA{!YOt*ke13n2_eB6Ewp2ot#SZxV@}vyDxp*52aX8&_XV%`*)_K@NP$ND*Jk z(TVAMueJJ^lHzJ$Wu$#N(|w4g+JeK@Gt|=J^l|$e)w|#P7Ai=<#f39++vn$Z&@5at zj|=UA_{?`39pWGoer)}wXxui@u^JP7!nz+>=+~&&hW3T8sV=1AZdJ`UKSG49Y>sxk z*5SWG3o14{2Hz*OyJa;_`L@-!7;9*3t3&ndkbVGb{yUnBLPZYg1EJ2?fsYDpQ@ggw zQeV%R(S_4xD1dqJznQsxkP-3Ppb#kaV;Js5Rn5S)ZSHRG=uA`Er)6snjriL>W^#g6 zaTWJ**0gTb(#qJl@t2)^J*BldD5NY)D5%QSzJ5Uf~yR(Neo(BXUH}4m+>W zQIN2J{XX)^b>Zwr-{IL9gFQO2Tn9v2KvHEqSTJY1JMxr=)3)RX!J{gqjqzJW@4M8n zRYb*_^5QQI7vdEIViv?$#4NylRu8@5dc)HL=kdx=~a1X}xg zHfD)Ixah*EPEZZYrz2TE)XDJw%RLRPa%L5lZy$6wFXtUOpwN(HhVyPG+49UrYY1BK z+N;J9?QNDz^OZ-L6eN+8gh3ac?5na0Tl?V~*KChi9_?z5P97EmbU@1I(Y-v zzp&I(=RRbMvT{p3O;CJzoyes$Z5Mq?5yjIGL066&&jD0f15Mkjmi@HIY^f3dX6S<% z+;HZlJEQn)N(p)N+;Ew|F3Q|E9Y(-hY1gC?&Wt~xW9KlNKm$0+-|w$Rq^;gfOiTdj zRk<=avzoNjwqj>z4|`i+x+kJqYpvciAnTj4t!WTJW|^v{nik9#n^%`U?mK-^DY5t} zKEiTHWE}q9ww>+D?=W?@>4mQpFDLB=G%BU^?9j5&u&7w<_{f_{1nSQg0U6831nJDz zS4&FBk|e)(u(Z`X&h+n9j9OvhX1VEU!B@pW>-Vq6arA)P1RuKi%QshvV##+G=m#8- zH^i7{Bl~d7nCBU1z}Mab$S+^ZR!*3+{bz;IaWz?$X~(_yaDW;hg~3C7Vj&w-kNV=L z_%(3%DF*2&UcmuQ2|9x1{WgjC6fn&Lk@CPaZ>f>5Abm)?61}*v(aSK?toRwq>U~lB zH@SGfXCwd(Z|lU@eG5la@UzrOF)%UUw#B{QOC3{LGQ6LN{HWrJLTJ9M<1Z6P8Y7mX zFu#J~>KVi2HUR}$DZ}qv6$rorFVR{(TxQF6U&71Axoj&&kx<)d8SBj?isBm^fjW4C z%9m>GEOuC!oQ=ZywH7wp-L0x-!-4G*9xqba1rOs`aErSlI(&fB9W)n&g5tkjDPj3k znG&5erl>7N+5htBk__i|CCh)!BlZR6^yQcDJeV&-hCKWPa{<{cRE*qo4M`6D)}S-5 z{L|e05yRzzUK9`-q0#1gTUyyJAuhgo{U|IftWu%jLu?Eb?93BoS`Qd`E&}aSuX+%m z7z8ZHd!HKK%rw5zFz*2$fqerqUQ{PcM3C4+J>Dan)u1qIs33L&C()MLza z+I~wM(*I86^|I0BC%SnS^Ro_3Ri2pA*Eh|Z=<}zT-~VFi$zFP?bhvYZjnic^oyKiP4yaLwJM4@{e1`MxB{i1stcuF%EDil=M7@kOj_=;YMJkQ!1p<#p(*^)64XoxF zEQW|al{=SPiDkw9tvsfAfk3z~!|8$bE?azCs#zztdb#^Gu%6+@TE0K!ln-`qd`-L7 z&)k;vY~!;3J6g6g6IhNndw!1V;(GVYeTBP;?6+U`^7N=G^LJBr&l4~yXDplS?K3F1 zzMmeVZ3fc>?OSLbqJRpo%{oqY$mlUO4{#rDiPmkaOE>y%qCyKdmaY$s^eA+3w=^&^Y;y)tY19XLgUiC@XRe z%_?i~;6z3@9myHHF$)~5B@~#Ehr2s z2vSgI!82GP`csuRcU#c=(q(o}4mvsr7Jl@z*O1nwXca*p;Y~I#eq-cIi&Ye18(0gx z%Wrt6IyUw`>V659to$PD)#N6XnL(i4Hvz+6`PT7cN;T$j`bbfph0m2qIQ84(>iK=4 zh3AK*$Hx=|!sl$^N>BCa`xYJM}L`) z@-@grgqFL?PAf`TI`K~}hST&=J_QR3w?m^$=a?j zpc4GtYWvV!n?7As_pau;w4mTMAvbrlLRWe>nBih&IJ)WdR)^tfJIg>szWd_TAA5Z_ zJ%VY@h@^V+7jLOM4o1l^+;#@z?A^8kY?5pf zmMlG(2cN&*JzZyNJ~Q8Un`SPv2b!0U!~S79JIc6P3BW;+1W@zT8!Um+TcC#oNH+<; zjZ!5f{e~+I6tQb*X$c4j6w0K#FGBlf(UX*n5yU6aNK4AZXVTVC1*GlA&i-<}kw~|b zbj*#0;*TkMyU#)nsz^r0{EeIbFo(ZAhp$(O9Jt?drM62JHV zwEz~2n?lze=0$2x8!T=`FcU_4x|t=+9=Arq^@N(K@*Ujc4?n97ZTCUR(MZv^AJ`us zW%uv4hDd7}8T6l4CfE7es4ACp>Uw73ei;8iB}IvZn*^y+k(UPh{=z%~oGkF0-$lolr7~j3t^Q8$s z0^~vw9c4Altt7z$XJ4h)1$$8S2!aHH;4n>`+gB=L5YHh9m2}z~5#I=1k3u|Z#5?;m>Uc?VJ$-qL#Ls{W&ymWea(81V3 zis%Q&qrAUaZD0cA0Y5&}M7BWWRjYC*77J}UJe(KDbx>^1oDnPT$-?q0(q3N zAQ_Gh1aM5Bb=stjA(P%9M8Kg;hxp7+92At3seYak%o-mmv7OO3Jm&Q2Qj3_2qHg`I z(`}v~z-kEs<)uF??vsslI6Da6wH2!Bn;;AhvpkPszXY}MIcXHNH5O$+gQ5*ouFE1g zRZ4v_y~KjFVHhrN39u^ljnX-rIan9ey}VJ8u^>Soj}{;*8g28twA{apQ-6empD_6` zma}5pP@Y$G*3SrI(})iTlI`!`h3%X^jJ0o2=88#MYCLVeN6?epe$pJOxwBj9h}*{(zU%r~E*zgwH-tAjHQuNL`!pJ7W`ejn~Dhk_2 z9oBUNoQ?ugy&VN?FEmN$H;*S#=RF-nTyLksxw5o}oO!TK7fq2tU*D@MhX{O9zd2`J zoxa~3CNL9o#Y2I1*d534I@%rtqdM<@XujDUbcXqTfGyXYp|M}@=D#P0*x-Dg?97XL z^t34^YE7q}&jeO{Voa`GIUeJ*2TPk4T0uJJ?>tP5g74=xL3`368n9+xE4f*aK&qc- z_xp;$21p(*{R6znZw*l=U9SS~_F~ro7!01aUBP6bGO~0YT*yOEpu4=k(i)m@Ty0m| z@dpqU;{|;DRsu83B)y0421`+Nw?X`#W@<%#ewj}f>p@y+7$vTK>b)J3Hek1@Xw+yi|QCL#tJ3EgMp+I`jS-+Hv5&y}kXz zMpq4MV4$I$lK>Y?SRWd;vzx#JfC!p?!}as^Z5;uqkuL3vJx*XY?>u!pzI}?0Mm+}< z(LkOPpr>yevBs|~D?>y;Ff)A#BJ!l9r@w2*80irM&fyd?X$vcEZ9rETEv96?!a3gD z{5+6%nk*#}y;BgTL^C$mXhW^h_rBhE!1ASFx6n*34c%sQk+&{aH(nwjXKZW5y2@~W zR-`Zp8f1@*I*v0zLUQ0*9{{w6f@2x5BSb*n5)LfVMMGy2nsEVJJ6Oe=-}Ne0WLc7> z+I!Jb{~7|lER)8qBX3)bzMpp{-Cr4ST)7-zAio3X>u0n&UapeXJd+C>Y)-GYmjdb3 z0@=*7wla!z%GjJDrBY>a@>n3-&DE-YRWM5#Jx0P3iMc-=6H9dN<$Je5RpTRk6X*j- z&ax!}Z5Vp+G-4GpV3E$ULSr~6<&BLKSfQ_kTKC>{&Xud%+1dT;-vrtMm)lD!D*;By zozLrVDjz`P8QLGVG}ViWi?ibxfFdU#)b97lF1_lXjdmg@vn6=mhQgUQ?=M4YJ`lF%HWBse_Z$HXkJt+j&>^5XFYs5HdF z!UF!sdvAl};oM8o)^N6^1zQjDS2P zTTb57W0<%h^0*=Q7;$p6el7?g*p?QPWtbK-Opa2Y_5tt~!9WVeAqqwVRVyOf8K0m7 zGY>z-;!~zKR5tb=c%C(^Fo+1h+?l_K21(G*bG7p*B`F)ad114QQDv}`U+rcHcI3^! zq!=`696Ng|dYYD9)wPp&<*P<0kYeNHF4)XAvX**^h1U}l@N5uY1U~@H+xAA1xSm53 zg({0t=)WS-e?jKA#xM<6eOyAOw&CVExq~5%Up?F(`ZQ$qjQVL%NxF0y6};6$`?)uc z(z)TSTsJp)nF3Wdr*(Hp4umEKR8lwCgNUA?Mw6&3xP@ZtQo-0S;@KK|CIY!&O%?^0 zWs49veMGCYcMzcUp!3n;p#FC$c?^OUj894m3JP*tPs}L-BF}&fw*EFiN%{}*CJhS? z)^^7QN-l!}0+^Ph^7He7)VuJ0ITsffZEfP*1VwrI&GYkdQFCJcCoJg!eH0H+ ze0&Kq)XQ^IKHtHM$?SF6lgLA?o}_bujWj5i@dOAXJ;DE2CQeW1`0fBjt5dpmxw!|S z$_b)=hm$-EE=Jq8wwZ*Vpgl^W07#?6hL%f>>EwCD%5r?szN&g@N4t!p ztNTh;Gz%GiE_lhk9&1aS6#}A6bCwyuX3@N1nU^qX(fp1cFeFljG7ld#msotsMIZ%k z`38qG1BB8D)dNtG)QtsrNa>Tp z##vK`ChYD=fN26KDuCf<#tvi(@A{U#4S{2J!-bCw*qV>&f!5`y0lUIaj2)T$pqXr; zk+inHOyr(!|BUeukL4Xl3n_ZQ`>r27aD8PWfCUhqPqzBIzaxP~$$G}T(J|1LC0XcX zCl#*Z5~5zedN2W|g!YFPA54V#-7)Q`WH!K+-kL5IcFY0$6t3b)?cp$i{sP6w2#cW+sS15+I}#mr5Hkvb$x?fgKn_ewa@&-4p!R zaAa^01OhlRpuCrW;BO#3FY^p=nV*LO0d1sQjwcH{5lhr&{@a(%*7yT9X_vozw>bn+ z!P`RNr`KnX4y2<&3$FXG8Qehq{_lf#?PwptmZtgF-316DjD|VfC%6ryJjBmu zT0YcXp}TXk5xEsGFt4lo={!_ab4Hnn!Q)d^x7rn5<@z+M!tk|)QHu?0dRBPKwigeF z(&29~>}m1e5A^h=J7kZH;Q*?L4$ewhnwqim{mRd)tJFDO%iK;WdD~7uFGfbsJRS=! zs{llkD%7-;Xr~>SOoH(Dk~kZymX_{ST4go3$aV*30xhnkcV`XSJJ?L@BWmBn$DCPT zF$`G}0n1~bTA0y=V|sv~dAc!KLjDT3)f@5|i$N>xn+clU4+Kf>0n<9m#p?WGZ4qhd zzjvq0+gn?KfE(n-bkd#thWXEDXn8d?*MkX?us$IgcB?gfbo6gJ-O&BPsELk|1KWTk zPR!Mn>(xk5P|(Ka(i;NG_3q@Opj>I$r$~|9%}Zxs6qsa5K|a-qpZw$-&K%U^LkyQ2 z?zyTT4-i1Wb_vKH@CIx|fHFs5oBbE$CLb>^g6hxEfd|0mFTj)vZ0IfFlk`<;<({6N z;f^7zmiNF3B5l)}EB)UcEcle6C9|d?V47wzw%p2p5MuGq@EQcdr~xc64gP?~WgRJ8 zcM_anXwCs#SBvNKkTFJW<%V_k<17D7Cf}NlnCM>wTxn7MA-5n2hFOla1@PnS?;^3) zTMJgui^?dc){&}B1-*LI*n;NU+D3HD<(re1?h`X>6sq}FG5XCke@XprO2#?H@TRqU z2;g8c=*c73J}{mp28Y-DO6Ld4s@}d zmUw%6d%iwVp@*iVq-+mF?eFdu|18nz37iCuAKyjcx*13Juhoxo>gwva9Zx!Kct}Y} zsj1-yF4NM|fU@-4VQ`ArT&liMY6NtfcZ^k8OVdda9c4efi^L zI%MU3qz?!ilj<1nu;D`Ba#wA@EohitWqA)79_zxrEoOlH$;&IdV(n}(vy=$i_M9XL z1ryHqC9k_myqn~cZP@Ibzy%9+`Qz=FyI;+eFAjcVmkzh4r^l)6pbx8VWc@P&UZ{@@ zxH8VVPPam2bW*HQh#nF`K-PwU-&2DU9f0;&IXRQp{s2**K-^}t^=9|K4)`b{6cF+8 z_-j2czy8YgEB4XP7<%;2a70zUHC~^AE^_sHFk`VBFViE_d+NEdmX`ve1Bnn97-TTE z(oXVs`Z$@QrTEY(5;zo1JIJ6@6M`5V1^Qtz#iR-}Dk+TWB zO~wwXmJ6oZ`fYaMbp_KylUjPo2Oni)ToY$CO&E#+Q994O=K4)rBJp< zp%qB;r90}p7q4}W4Y~(a>tBYZIEhjJ{alG`b5j_e90FNl~T+z&~l zB2!R`9Pu1g*$GuOlHeUR7gz1CU%mpbO7F87T3LHt27&)^_C?jGyp-ErbZAS3tcSM> z`Da^GK{`f8ILJ9{rS--O3Ot$|9Z$CgY}t2YK*Cz&CQctLgd0E`R#o z#TDck{zP(I`)c+vE-YhxKw;9|@p3kAF9;qRdPi-~)2IE7BI*TIXoMOF{pQfYdnXZ% zbct43(|ZpGyH%p3ZW5J@Q?Esr37o!@b)lsKK<{{t9_he zT%!wR9)Wqw5n0@?Aod$EL^O~(e&Y7kHt`;WzAZHE9G z;N3NvRsqhVEYe#6{lMNCGqhlsLX|NMtolev)-e*1?zYLADf>a`(`=BO5xyiTX4%bp zZ1YwR!K+WhFh1;g)dI;Q3^|g7S~#b>QHO6?M>Sq}|T_im5vUQ$5`Gs-+5URqX;=-K)b)s&MlmM*-x!>!S>>!6Px=ph3fa~ zP5FZ&VSnot&KA)q^j`1I1v<0I+#a^DWjg=AexC5T= zQ}9Kk@`t2~a%F6Ia>NVt-+|{pAl-;We;d5E=vR*^GB^0%e&iR4RDg#Q;^gFnK*Gho zSdB6q%;a0Cpo^o%|MXp86A;LjPFzKM0S`EkazFS4^vPHI{ZS%<8C{gqGo(>=YtBL`TR#TfMtQQ04jjkAb4-zpKLkI+aAeA{3RQ$RN<*FgVH zi5*IZq<}5@{G+08Hf_{%Y{~glIY>LO;?9OhD!!mpVMXEM-~hZ~qm$x@4A*@c=wHbb z8=CIRXtfC=!LK*Zzba5~e9>BwpZx5ssY#$akjZmS({jzl706i(R9f(uq!n*DjR0va zOEiwtd?5Gg)eA_U=$##P&+vR&yxm9h!@A3h-#^Ibm|i#pX;qkgzU#P$@0Bh}e^6Al zbZF)AeZ#{9Sxqc?rd>f)@i*lL^=R4E!3EltQ7n&vhvBeC7LDw?diStcP*7kn%WJ#H z&0Em9=XA8(Oawv4b8V(2v#d)>{UWN0H(%7jn0R|z%fO;S`;sL{;C}7D-mcs8X}bLx zTPbBK0BNrMzh>gnWEAx`C+OV%D7@`y7Og5&X(>tF~5|jADifw(#O;1u1O*Y zjm<4PP^O4lbWzPec=W#r3MG1tmT=Xf-Ap$z#*pq+^ZhO6&N3ojP-tkQ+sXRLMlT>x z0frN}z97C}(|L5<#QXa3xP!=URDfd$Y3U9V7x&WWZ>TGOM|UV5SaTGT4=x}IpVMHA zlJGhqLPldU=d1)ZC)>RY4w?S<4Uk;_cNXG$(7!+W&j*u$Ao1r<2VnTF*X+SruL=yl zbz8g${C+L4e|<;xM*GvT+);6Wfppp2ENl~_uV;Cl&~MrF<+rbcV0LH7Jr5_0gg)?1 znUhmj+wOjC_SjKUHGk=^_8g2aYS{rjPIdQc-LD)?wf08h{{pdNrwQyFZMDM{WKTwG zEqBc~xep{c`to5{%aRXignqSSHJw2$oNz>hgn%FBzu^Y3cN3HBg~Q>Yq3VT0-qfR5 zbv;Wu)#RN6bN$(s1TKZX4PnR+QnXb^Lx85UarJLhmX=(>1=rh0_#%K&Z)+zX&+Vj) zY&)84`Xflcf}@cz!Sx_i_v13jeED)j9-?jRo=i>rnXTN58~Z++wp6p z2Xm;(z2axijO+DYf@QHZ7;YWQic`fOH5I$i@f!uvBgNj45m^0B+5*5+ZJs`u?hR#R zfZxAyQ+Asu@A=`*_E||D**CiuWQSS><`BvM zxxa$=a^EGxEc-}c)|BEAplzQgpFaHOPqrZFvIC8zoQ#b1VL3qfWKwyZN7DEc6BA{N zK|Tun&1+25zb@SN+t5tSe=?{aUb=nt(amd){~Qa^uP2)D#t@z_|R9i0L^jLf8!&L>xSq@ z?fhEr{d?gqf6!%x5tmeOH|OL;Oa)2yUwl^aaw)b?o-TcX>!4Z-U^~03IY4(l)8Qn4fhAvqr2^7J8CMbCGBi9M5;u`Ttd`fnjV)d+t&fW3k5T~-)5V*Fq?Z5BWf26j*Xg#Cwl z02TaY&QZnSR)tnE_ZmEy7^dGu?D;T5RC`{lW9OZdxL9?okd67nvBC zn5|d(xR;l%MU*%)o+hMNRaS-`um;}6?WJF;(}>_$o_wSpGKPz7cm!bK;-|f0ZrrR} zse0~$kG*t z#f&j$XrGl>M%_5(f^s`8A81F>zdN9&k@^wX$Ts9&*u-DViFD^XYUjXfCo4WWn&aq7 zC6Wh?jg7Nc-d=f~A@mlg<+>n7Eic#gZj3p$$9I0)CMlq2t6y2vzU)3G?WczHv~2PwaaP!RAq zzV#z_z5KpC)hHQdov+MECME`2-=>3cNlApfj|791FHkx=15l$S-VQZ>g^3|YY!DZ# zEfoB=6eA$v9HPzApCB-$4G~7~q6Hio@n7!ZMU;|XJ^1m|=U<@K!B0rUjW z;nt*2;iKMqOSV8D$5c1Z;e?z{{TBotR~%D!dXU@5k>>)0cNh$nUQdE?lG6{bFiUKEw}FNuF-m-aQgC zuOu0JwTK6TN!XT0;-~(t?)Vv>YE9S^ufAjB2LOXIrF<3oDL|pU3*_bqre?S^*D^CcX-jK zc);&|Wx7c<+USUple;PUasIpkGuqQwZ0NuzQbe`A2I5B!vTSuC_)gZWvA%?)!HpBp zAz{tkra%-1iU9CcQi&Fu-RwGxHe_VyUGDNTh&?xP4+<0l0g;#ZPs)0F?*{zKm+bR0 z&%d^|aRbM2!v9bAhcvS9*|t_S|jR6xchR6D7G4 zr240v;B=U<*C|?ox!dFrNf9BHpKtrGZI2PNd#!Mah&~`oH*Q}%kbLNKkHxii*U~(r zNl90^9xDSf^Tsoo+b^HB=lTA~|Lepm|Ei=Hj+$J~)H;1oC)*~pYRP~143b=dvV6w* zq^c;p1~T>XvMMVPucM9(k~feV9ZOp4rtb4SoTDoxb&xDaW5t@HGVxjj{-#=yk3fz& z`FoHyXn>4drcdFGz}8OW)B?5kJ#8P={tl$L0ms_fG>W}v;Y9& zRG~USGoPl0mfwGg{D&oBRr$9CbdZ*21?Yl-V5MCz^H(DPu$Q&=`B&pl;b&tP6O$EV zI|5lvt;5%8!6fVKaHM&{NyY(CZ{d=z;O`q880H&*oh=`mSc=8H^iA9C^Wz5LZShcF0dmuvr zZ9)bHhOEp?(ou|ZzM`@xl%(@n{I@@UGrVsVw*C!XY+yMH4J11(IVtXd9t1sd&A~{8 zx~E&HJ!v$yg_B2%fNtfH(l@0(_am`Mj^~}FPFK(!jHJ3KshronhZsMBKVyzkPImTU zey_vgo)ddO9Twc0J@>p6n5{Bo7CqQZ0Qfl}nV_@CGPgElR>{I1-QR`p18e+a{eE!E zv8SIYw3{NjAKw%V)uZ^yDrc)%tX8h^C*fh>b9IOa1uUQV^XJcCyjO~x`PrR}(~e=2 zA0wk{$5YychD!I~xBMpR9nK{V4TAs)*1{bI)%q7a6r{xFLW^Ei<3|O_%wcVTwjIv^ z4sQO(k!ANlb;Vro>%>Im@qI~{e-xZB%eW`To`E(x4z{98aXLdoiMKO`B3^d|{WOl~ zM_vlJA9BB6Wk>&5mV=oNT=hx>(e0#u{PBbDs(MB*>W=-L`S71FY46U4J)xd856xMe zZ(2x|$9>YTOogR1YX2m43_GsTb8=n)VMT0gEb4^N*3M4h)L%fK3nS*Ka9_5qotc>d zlcehOi#peS7Z+2>A#FMF78VwQ?!jWOMjR6hi@XH+flb7Ql(aOcV3&H~gh1O~PD;v= z?1e9w2}Orz91;@p)TJC6&5@4B#Ka65QUJb+K*>~2K+nV!9v1diPD52q4VRQuE~TuX zsfq9H+pc?AFyZ*BhschY*U4hKNOL_D7;g4PlBwsbC{e44{-9oEb%Cpobu+QY|D@cC z{dXj8Kk4qXMdoKYEp$kecU{k(8mEZjB$hFz9gMUM`FOn4w3qo_peQ+GkLnu~s-j?5 zzVZX_nC3~96f5-~WsYaC;f9KyuQo)22O5{;!se{s)3F71 zjzzHLP3+lo2eFMgh=m152^h&tDqx#u}wFO)p?4Jp*mcFawTmic;>a;9y`T& zuB`~QZ6?_Hix)ZcnmgCXdw@Z)+cAbZi>aj%4rNc5`N!<8Y(`lXR!rl}*#!IzcReW? zud2YOHIlXpl60>ET`WxF_3`XUkuek&DlxuVQGf1obIf>Zsvg#`m?Vh_j&f=#Hj_|k zN@k=IY@_ufoZ7=9l~#WLfE3<^45RzD<6NA>JwwBhqx@Mn#SiS$h1$OwD|X8kNMW$7 z$}jF0H8`FF%gLBqOfMiBi~1K={5XOpR=L!-aP)M^L)5Q{99wNjYQkiaI4mcBE3Px~ zg=BUKTCxFHu37_+juH%3Lle9!>o)p1xMfs2>V@Z=#4fzp3=}JGe{Xf$L_4mpjGMyE z&xZGPbavW(uMWh=D(3G>7&0@)55UJldv5e+%^uP3V;E1WT*O8Yo8niwFb87u+J#^? zA@m|O2DXMSu7!3{l6KgQh6>vY4LUb)GXiq{TCiYNJQK@{!FjAGfXwo&~ zVl&OR-StA!G|}PcPFWy7C>}E{wLepp?kGhv{?hd7L+Tq+kz?r9_;TmGZJ zcm$ht43o3(PLqdyBo!yeh299IRSbIc)+XX~iTWeB6}M2%DT}3-mbd(qe#3%@Eqd=P z!XevU;VZ!+6~CrhI)7we*1LgL+9g(s@gsJR-y^ zWp46SI60zU-7{?lxO&z4M(Foe1m)l5u)#vBhXp;wua!#QAO=(Ij)9@aZrBh|xGa9( ze8VOnC+GHATd{unwC%_4M|sWi>GIO=Ug{WNQWr-1)B393@x`wD=ZwgyakbjRLk7ir z;5`PI_eoYH@JC)l90|@~9~x-j=$+pm1vA}1%G?a_Azls*%hr^IUI2$cZ+kk1<DLFnfh#i?w9^|sf?&=d9F#Rpt@^b772 z-~haI|E)$?Yy9bvz?-Kh%7)^Vm|X?SAfHu~-_28+V#X5?9aK7MMWtj!#3rhdF?xe= z4)OA=DVZkE=lO&Vx3_L!Gmvzp^vNfi7|nw;8iqmKfQ|L@YZ-oF)4Cz@Z8+)={%_QXaby| zo-ddXk$ojL;UUV$M~ebk=F#D2VG4Rao0j)Mbzb-?0K6$2VrK7?ZQdtO>~SQ&s+M>kF}-Wl|cJQ(E}&+1M`LN`|fOw=4?deoWWL*RbZDE zbQ?MFzM{o}SEy~yhycR)dG4qTw4aQLmF~u#BC`xM8T*l_)UFOP~y*94#uoQ$UYOY)l zothh{Nwvx2Ia@`}Gzt2@{EDYekLY*HwO{^KXo`B~hOlsX7~X@un-}!B_kqZ`J#4yt zP~yWh0wd*6JNr1F%V6x!ZRu}N4Z8QOC&{$)Ljlla8=wz92l4Mms)y4-AyP5x@qC2Okt< zZ%^^`_Q&8B5;8KShboAj>#AGaav|!f-~{zlAwSktb7-YP)MG*H)Kdkqv%8Q!eo*_Y zfSLGrAMN`i`cW1#47?&0;diBfmC}8e{CkAM?=`Be#G}RGKaQ(k zEb&~#n@`o|`S-%zas)dcvv;tf#Qp36`v46xvnP1h^pT|Hhfi#SfZ?DuG(@p;x-1HJV?JLqe{8WgLnk^!&!NoLO zQnFthymjGt3w)0>vWhHnM`jL=S?l-QdTtCG?1R41rC+{1MLdG1KbuEEH(3kK=ITXG zuH4rel#xS~M^Q>jUCd3fs?XZVj}hdhIEo;B206aTpI45bnrW$j+QnW!Etay7;^cYS zGe{Yg_{L{bb_;?}ECkrkAVka-Q`8HbMO32;#_est7mU1hQjX2U66a@6N0~vyVMeS` zLmZ#O$KAl%q$_;a_!`#|{9P&3ecS^>=aUr^HN6EbiWklCOSt)`Q8@d=FfvBxwOCW>su4lIb(v56|wiZ>cR=sT<0z!{}e$W3Xu7Ah>wykoiR^~jux^BGd zV`S?x?#XG(=^^|-MCc94D=9`wRHtM1b;tU$Fpfw=0!w0$7P6)7)qnL6hQ#SkgYAi5<$$qC^TA% z!Q9}E_^pp4Em&Rz#@z=P23=^~okw93;brNh!_y25#qWm;4a6DK`BJq%=m7a{fetFOhS_oL~gNoddj00 zs37^v)}UUB`PuW|If7}Zj zl_qy3kRv{=!3zj5vfvlvTNh0%#K!X$5rI4Dvai=!TU+ZYm1P_Z2n@t(E+FoeJShlq zRLE4vfn>X>(uG8UkO$I5byezU@DsqemOd!}94xRk82Ac}q{5OM@ZYUBcOJLKL|?+*cl_?7| z5&%l=D>lgJp3}|EO;>_iArm8GOhuKS-*dWh@S}AL*Ji!+=;%*j1Sl`{_4U^k46?>{ z4-XH06q;nH&n_;gBGSZuT>iIkRSMXgOjOr0v8G@T>M!HYjUAy6$c;ydxL%l+UO06^ zTQWnn+fo#w3p*lhxO=}3jZk|`DNIf!yq1`G;Q>npF!j2r z$ZwIJJ9W6JsR?l5^1ufGiw=f_8jzmixp~iwGTZxpC^)nIZV#?voKF*>FTX!}tM_k* zCLsihz~B5Zzp_M4%G66p(8+C0P&H;!SP<*EC2g?QYI+0HkH!*nrjb$qf`tK#7)lpR z=l+D|XjKlnpGkPx&Wf4`hbnmXr3rfF) zlOoM6Of>r6_DMUv*7F^E<%3J}xOuq_dpB6}rJw7y!@Bi)S5zNU;B^`%jhOfkm;Wxx zO_UJikmFeGl)L5U)yWBA8F;9O2)<;MU^lt&dF}tty*MfDfG#UCCTab7%sXX2HzAE1 z?XAW@22DSM7r+5#T8uj6l_*cdt;OwAo!$i?`=|;fIsjzQQEfZcXLoT&MB`)G7(HE2 z62a{_T!~%y4wFInlmcOtElP9&NQxNrRAMSd!EBlPQepKY5Z{SCfM6(zRA%P;;z#$J zh|I)J>}AtR4gBmsYl^{_olufPfLIVGkMr9v?KP0pC%x)_hU(e&R1%MJzh~}$oQMvg z&pPXU7khPyW)~#Mvze5B9sG3w8WHLK5ICmPH~H!TBvIJz-F zC=7}f)*(D0FV|pHLJIkfLDh1bDHih^6N@vm3#-$pJg7(Kimh_)z_C7vU40B$x{1J$ zJrO_PO-;60Wnw0+ku?1gdfE;c1WG;qWyz9T)v`qg-1$1;ufQt2gt%TI>3CPUc*l7t z`5`bJ+jkfK^$CZJ8WBjMW#XbKc)MubZ+{JO%@ujH65iAfv^tx*M0k%a@PVQTYEg*L z7EVj4G)$OX3Ha2DWDpIpq|v6ZDqJf);H<@On$5#iPV}ay%T@#z2WP6?KS-{!L-`QU@=1Dx>Ef+-YI6Yd|j11lmuuRWA zBq}067zno(Qu?WQ}^A4L6 z8g{dJ;^g$2ZEXMDXfecL!Z{0nwyvYTUlR^ZE6WdN+T{m zW02jQeNv3!PViPwo4&u2miNC)d#Z|u=6KEb_00E1u`fjJ(s?xooKpq%SwGMYI$C)&*3w zux2tmM@UIgZC+#xOn=4p`kd@a@ZOknE$ZX`V7(b}@3Ow*VQocTTaZ{+oM>JH7<^tS{TRzj^=~(?28T?q z{_c>Upl};C{joj&OQL&-!w9r>Yerdf9~QbVbhHQ4Hrt!gBg3_1DbIDlw zWzGd5`xz`*T8G>sqNUbt-FGs^Ct7c*xzvz{Y+HlKM)l|c8bMHRl#W%`ArB*Qe~gb$ zor8@eU(TLE8@=se57DGhSTju?>d_K(Tv<^47y^;;a@?F-A|MnRHMjmiu*?+k5@NsQ zRqnRlHc6WQX{R|&kp(eV`LW(r0|o{&`k3ua=0EbT8G)C`Wpg8#mcmvA^9_#liHF_Y zSF5WZd93wUi`TSpn_fpf>I#gSNV~N={p&;!yE^20$Um%p4)OiPf4Tf(<6lm0WZnKn zGbf*R-BEYxu3}cF{Q%o0F61dw!Gv@31hDT*U;Z1yD@j55t<+{!$nn&kR-9EjGMrD^ z0B5D=TX^@$BwdC})fxPvXr)f5#;BE&BZQ^Rb>}bafqLI5|3kP_@ApFPmbFS(E|X72 zS8zQ_%5`53JqD|G(o!fEju)|rb{hr%{mVH=E@c8**Q3ceeR|b}zwh}TH*0>FyB_$JOKOWCng$9V^pzN1Mb^m#oQ7=3?dUw;}F4Ray^nNRNM1CIv z*SPKI(vy>oC+JflKK*w`u<^&$oHC2arDo#EU`P;&d~3}oPsa;myR`k2MXr58FZYKw z0o1{IhVn5r+3*TAefk16WO8nf9MLTgJiD2gl*P2)~;U0JAGBxn7&%iVR?SSY5%g zPRtA4XY@08I%*V7-p5L_kmZZQF%;SXH$cneJN6Enoz z=iO1Goh-vGunB2m$Y^jU&1-yC8*6%1HOG4L+BU`VJv*$thcomY%Q2PB9d%E%R5s&} z>4u$3Dqq#(H=e22(mxaol#c}&OGj0jpFe>AH|8$6X%F;j)Jb>Z>aVy39>|Y{?zV5fPW? z1w6dz`0Urr@YB^W{&JZ&DwS8;D$r|f4KmJot80_ z=_^$?w~=}YQ?kVOGX0zENWQ@#kr{&(6_eZ2n)PDoK@!k%27`_)%B?r9O`gYIYL|O2 zRu~US2n#Tg?)RjbsVU+nA{VGt?CGAi{IM(e1TUf z{k<%xYplXJsr)jOuy3S>76 z(G*xOVyn$&J`tTFeMW(xAMD@ESCQ&3&%NVc9BfBQH=SO-{q$gmD2Gtyg3;Lul5bT=|$5fq(lb7>(TBi$byv9)D(*i34>ai z4}YOrV1I2Yvl`Jh_7O+njny~W2vXpdr!S}`{&L&>LhLO4;leTgHrD9`ZxVW zu4ppQ34=0*u6Q`e>DuFPiyktT-`%TKRj?fkqsXJ2tBpG2URu|u;kQ8Tv1Jv_3mD<& zU3|P)W_vd_-0Ak#^gKQ^S}V5?Bez2J*g5!%T{m-YZy8C5w_)un1gUn9YCQL6U(!kF z*ya%@=w0|Ma_oE~{V<*O@u=lJS~GV@uo?#;5ZZcIgCFvrq=o3b{GK-xd5G7?r^lx} zhe#daps!BVK#+t_KZs-TJ)U$~7FG~~M@YJLlvS#5;?k?}uPq8FpN zhW(kjk19QS|DBaZU#D!O%j8iX>0-s)DiDlomlIr|zH5%L+R1Gxt6Vh*J|Sz>DdCvK zLkrELLxS+dp2FV?+sU5~&{jgBEiJFQlpmzU;SLdstYn<(swZ zPS~A=b}=DuGN7XDZ-Z!zn94lLgXe1mosRw8ax6HZW&LJ>P# zkc0?-1e;NeQSAxPOCi|pCHyuAl@$LwHtG;t(6bnk2@Ccxqw^UB4W!+~91D@|1Z@7w z&b1%wx-Q(rB8M^9jesX`Ed?INsK)*fi%&`KErL}LL#Yfp6l?*8*!MnSQAgLFe^sa#m- z`4ytKZCAE0nbb8 z$A|l1Laa@-3;@<-XTw3Hq`>To%0|G`(!v~+IK!{f6C(uBlU*s=irhrFf~lz~F!wXn z%gS6 z9GBPH-1yjG%c1ziMH1%WD9W1n|WA}tNNQLFVW_3X?bjR<3UDX@CZ zT6O?YR8cLCSHjk7xFO-%)&e4W9xAM>gOjA7^uqu2prh? zhF|O;5j4A;oT_39)yBrgy3&GoZuP3Oj33NfSAD0V1K3*dc78ydzEm0ymz97IS zLf@pDn4hiWtjYgQ0SYvESlb_@Ge8ue>}14v_FX>Iiki3Yw$(Ma8Cte^d-fNgOy+6{ zk33_Q<|4=|+;ky-Nl0ct@Qxalt5}5LRp0#_4ETdo+25X8P?b_}=S{&ZNHw9mg+cTS zaP1xt61BVjSll!{v{N z_HM<*G;Ny?TgV*A@X>3oYc%|erUr9b*bU`Ye)D)|r7*uQosLm99xkrjoLLBUcG)2N zz~oB^`9&wS)qPEikH%Acj{h5<_qZ;FrPf66?>ud1(95JAF4HKk{t+f=1O#N%S*WD`LLDrjeya$)z~sj1w0c^0CTaQmef zmVWz-NwJAoD{g!OuvDnmX6s*D0euPCvlgd}MIW!BK=7;gRMVPz`YP1tt=@>b8mm(b zqJ8xS%2UNRy=l*+)6=+EV`^ZJPU^c^Xj4sBrpwZU%J`5vr@bh0#QWPTJ1@h|nHg8$ zzTD^v8y*?yokpt9c^boQW|}jtpTXUsV7e#Y zS`iVzYhK8Y~Rt{^c>eh)h#ucytJ-;G-0LWA}vpG&GBg^HMtCbmI0NydsW$cShOA~mQ{!=P26hgQoK4r-w9dGLrxO3G;$J3 zNF%-3=+MK8x`+2AxoP0hH-&or?%J;F$zQWfQtR9L`E~ilx}TUcT519&u62vf&4Rql z*jjgOH#1o(Hyf1<`gcIoJLMz8!@IgQ#`WsOsba5RsI!)j?ZnybEYvzj{N6W;j652{mSc#DvJXD`gu*NGkf z-lo}Ln;CX%bXahBn(-~_IsHuO{pOB!=*K{jgx6k)Se3{9;?(D)OVYKrTglq7oiFbM zm>KBkf^+u(`BX(kg`-F!Z-PX?3m_CJsrCJC-L9Ee^pf+0fvrWzJ!K`ZaLnZ?@d6_#!jF&9+Z%_-)WE^ck7|6v(DCi zOK42{u#6vyqpx6H()OiAv=9nDa8|06Zv2;M|Q$BschiVwN(p$0~)(U<5jDCDbTiG}mp zueN!@nz<}S$xmLj|M??xk`K>Ssr^Qx(YF}no{CX^F>DVZj^EBc{&Z0zJLMOum#O)s zzuStY<^^qeSpKRAO=3^X{QdQ$UBCC`QJq5NrG{$pTs6qX8kDPDFV%*msQ3tuNcHts zfON+DY={fkvxARyG>`}F{7Kw6O8laE+J~_$Dbn0=(}ppo!Sx_vHO>kJ%8VA}|2g1}kA zEu)M4U`B#xeLsc<@nIT$pKewuYL**V*knS;aC>(1m#E2E*3iO3%wu!=_Lh&Ioqkcg zq_R9cr6}=Mce%lOqMN?C>(EY4MP+hAUa;Aq{rO3{a;}VKjkTt=b6B1^yXj@w4iSl-X{vi|Cb7X6LV&R7Om`uB%@`s4GI;+nXr&wRgeLx58PRx2sTorzM)DRgJoD0O2dC8>qJ;f+h>K#*YD zcMA_;8HpTGZdKEfq6&~S0eWP&R`26*;WP4C>FG~fWBjuOM@+~kM#4=AAJLHD41x57 zxHp`b#}SkP>vXJc$E$sPeL&l7y-;(Q5l9M#)d_iS_u5@f{T5sC99czg8is}%fklXy zWu%m~P$qByT5021@#dfZEb1%EDupoS%M1$@%d9d zFml$F;5HS4kHsYqT6Sw-u*N4o9g$9sa)SRa0J<%SKqZ=#o8zWhSWp1CAb|1T7^BX~ z%F4=C)}pb~H{G%5!$hq9)TBGFfV!4EG+HlJ`FrCh1w^c=hQrqt(;)i&Vq1vBwUUoX zcKlpy`ZBO*fRyPS8PhwiyNs}0;pQy?(r^6#Uf*|%k}W!oed;+6J*~I;cn&-vU17_* zs;Z`ybA0^#Uz^Kpo3~14$WCk6stUI!k3LnG8|P)ueevNcnQau;K(?yFsYwueaK9Z< z_RdAikw4;2L(b!<#fT&VB z7M!o>w@f}$Cs5~dUFC+?eFpQeR9e#B{S)~guD&uX$}a47kW^4mK#)edOFBhCIvqL$ z1O%j;Ayg0q2?^`>u1H;}5`xnR%E!d*8X%x*Hu|4JzZG zz&)}Mi5qtnu|F#*Jdndj-8+sPA?iGk{@$beqsnqjM^!7{um1hCW|px}&G7D901}dH z?}&K(jUj9&_F@+%3io8aXoq&224Y;7pKmE9Bvl)&PDXJgsm|cupt|q_v%X~_i}#UEejQ4U)d!d#2qb|9kAJg- z{tY6Ue+d@Y6aV0xAuNO0k1GO==X&4hy^9MkWKRrfS}Rgfp-xA+k=WT@uO4>?MJ^`_qW_yX9s;hvH5uX*0$NCoX;Q9~4hkUv_(t|w^2Vjwvo4s`EQ zu1;p`b8~Wd@uK76z~%_&?hW8A2TsH4=>i6Q$LMTQf&(f ze8?Zmsm*6W{u-|NQxFMTv&HNuK~h!6m4>9l+#6R`KRdR>Y^;BKPeE z4>rRZ>z0|Bi?VL2uff6j#l>@g1rHKEHda`SfCYA8F*6us{dzIgPjo&FCvT%g=P3wlz$o%S)c_0Qv6iR-PCwAY=K8 zj-7oQP*{x1-v*x!>Q-2A7}mv{77=`+`9cml7z8gHnAWi&7a=aT=k1v2nU^t2wXF&2 zO7U&E?QPsjdU}bch@PIF4l62vXq@#2?~DclS&H(9{C$_-v--~eLCzxQ}j<_=6d9?jMsuWq9(mfU9)^N zPCi;bwXL2%`@FO#!)98@6}`O9f%--B_4(G%pZX{KH2naV1|%7XWR7>|E-dVE|3m%& ztYWQ_z|#SDn^ewBwV9mpUWDRVTvNJDgtniL3SXi9ukxw&UHwl9e3n4SJ0l|lOaV%2 ztL1-Ad08C}cpm+FXsrAxieAWk0J8REoEbM2j zFPF?t=68k#f!M7H!~@<<)+%-N!K5PF!Kx!iZJ%+0*kv|_J;*@boqQu*5>m+>0R=1+ z059^B-5(+ZI^=rAj9ri)RaIKO$F+5Jb>F_lHqM3RmzDy`Q%AgB@q>H!p6;52$r2I} zNQq_glZ7=mH(!)F@+K&8#sPkooEWq$^qE8dEe)kxY~Nl@Nz2gCwtA-1ec*~(h~fc& z>T$QyyA z?Cvj}18;f9Mn?(EfD;AaXD^H3d2`4&P`iAGYvH%T}Jex)8c(@%S>K|C94@S&yt~!jlA`g z>~!ESd`vn5^zB3T(ja=`dv? z%L#_!{ZEN3!!ieeBU5!Re?Kp^MxR)MQc_vY8vc+pT8aNtUw=vnV3M^Gb@zqO$tt$q zarhyBXhjT$BcVG_%{w++O#g#D{z$C_MJZW=WwM89gqOt~e@*WqaFTw+4B?*VLH-tw zR0471RGyarnEdv(u<#oi$b{k5yY7XXWN7|w3!x%^pzhhT$-W&}u}nUG3nV56H5`oE zkhq}5DjjObr1lT1Eky6T8b2vgNRcSi=I5g>BS33#(YiGS%lM(n4=_HUGj!QFO!RG$ zJXtFJGc&~%9*6j#46x9(n71MCH%V?@7P$d6sH~-tYf>(wcCR@+Nai2j`t!IGdesAf zP0jpgC;VCva5INr_@G1m{!simgcQN|%RV43nsA(og-&7+C_W6I{d>inP*reS|4yvM z818>w&j3G^GyW;N(7&tnY%amkI%dIYdw5sch??1mabHOxK-8SFj|MWVcIV1*A01 z9$lgRm2yn7tbP=H_ap%!N(z~mG}v$`+o^TDeIR+lIw^=Uk2q=;aymNtqaQ7KHkpCV z0QMWka|JxeG!Y#cD=-i*FyZALNuq+L*&QToJmZlO&f!b%5@P`l%sR#`xK=n;mI<>& z(+S}Zsa+lUw8s1Q>d zBCGK=dxhl@Gbnzpx&qYJk4bLn75ZKSeRjI97ubzHS-W2~D_^v|vrj|^^oBott{d=jT^*PT5%OoNB-GTZ z>~0X6&O!wMC@;0v)lC3jJw0o|R~Z>hFDUtlkYhi;{GLgA@Yl)L7m85-Z(*j&8!j(^)1pvm}j* z>?VqDNdZ4@&z>CoC8k$)pw~UftKL%cdsvb4L(l)CX4$WB#yW6Nf`dSKo7&TGyigyF z2c%*l0|hF*<-irXC4l|C%>q=QzYycJ;P|QC9=|MTmpksA4;5otC95i_|BD3(OW^)F zdjI1*RmA*bG{{YVk-9z(ohop~cCPbsbk~@djRZ2Y6t1@Bl_S}~5e~phLHYWGe0c^;L@vz}q#xn0}?NB6d;fm4lt(D&xXDPmj%Yhi1!_e$*60XI&_vybFwMpeEWR%+or#yy>ohBTu%!s z$3<6B52NPfC$ZkP-(~Z)@xrgme({Sgt$8>ehKBf!#^!x-rZEq%9mN zhTP}@rKk$DsF)cn00&cpJ`N7jl3RE^$K$Wf&5}HT92OkH5Wb|uNXWx@PcxX2QN3B= z8PDBMKL7|6V5{Ffdub9)3M2rZj=wC{A}1x43kCIAKR-XyGT@Y&nwm5M@-N`t#3%2?qsi$4C~mk7CY0m}hz7!R5?u z`4jS7bRFk^TI(Nfm}3Clp{-+}AbRI+=8%q|p>k+~QV!6CHU$)TAoKmmOslXmBjXb( zkTeGEyAD7Q;o{(6=mK3pAaEEAl4_`d!EJ^K11o15x^|Y4@f47)0s#Fx7(_V1W#Iq& zTRAWwe0fVt;52U9b`c3K8y?mGSldv*I}ctfhV{bX#em?drK@XIrt_r?+#NLJLZRB) z$^xa}tPZdgXdpqHel7duUk1(f zkDW@udu4j(j`)*ke^JLXFYJo1>||u3?Bm@%cL$MmZ(VDq%@b}t2HLG_p{0xC0X!lI zP3E3g?i&K&(7yNd(9V}XN?Ag{xb6y(po612;M%HG$rtF5e^ZDwI4 zW>l?ixEbWx#hHUJaMtBtkp9Sj3H>T2bi6B-bEJBLH;A!-ii`*gV!zA9rJgixQwDA> z`0(FL1_Vh42RSFF1~+j5ac=)^GP4BVMAaCV>|WBzkYwvX6hUwdjEUe+pnO(ha{W^=fF}r z{>Nir7{$sfSM` zrlYP-t04K(BNbHbJA_L;Q{9CqI(mvQpZ}cM*&!yZP7vZh3H##d<@LzYta|D_6&2ME zamCEez0aS7s$tQjGU^W>J_NcMi~~(!G!wV9kWarpn%sTf)TH)-#-7I&7|W)rnI z6GpLy)#kEt3|{LUM@FbR#n&t13La7P{r(MXL}X+nI`#wlkj-!Un5k=kya5W>pa=qT zLU+MyVt`oZsWCCn%Iy5n2>()4Q=>!lG_l_T<@XoRti;nV;+bC(^@mST6CU>gaUCBe zqNgG$DxlK!_01STV*$IB(aWL2=~I=DN%1kL7rD_{1VbAxot>SJ%m5Y}BtH8E1rvlYvE2FK8Uq#6 zqE+?;p+(xGPHQZ56RA2KYNedQXqEdB8g_&J{tP)$@a#K-{Na^~Pdu%^A>a>6q-_0M zoLlvmq|x6Nrv}@y(mlX7u?S)`&-ww{mRR^yv$?9&D8DbWdZ%Y+K*pYgn3$h43&7MJ zGT~p6bYAVs(#Jm3)zFA)eFG$Vz<9mgn-(Cxz#hA|=Wq+Ef6trn^eN870Wi?5Z@z?v zx=@2_{};vnKWY{c!W7}t)6*ZdxqJ6+M{0gn7QKK#>?Gdz*jQOv*+*L{y1Kd^9ztcix8nQ(0R-5U zAmqZp#wH9(2mOAam`8ve4wN@RhwkCn77+fNpPzr3>t$$|5)_2(`1+NPPon`RJ`Rop zH9#}~jR&OZmr8zS=HEU_xg+~x)L?kFM9##PA*Z&SoLsxAsjk3!o}P^v+|Veq{>Dgf zx;nJz1mD9HCLh^#eR*A{x|-cl=&ctDY&=;Qqln0~Pm%nShY_l#mJzc~Uy%7qj5Y>x zAYojPjf;G|@ptaa5$`8eoToU$0?WKp@h>GIrHGB_M)s(EN*@ zk~T;P2{t+SL~H3fqp)y{$Z363sr$E{Q2!_rsC|6nuy1N!UyFMi=THFLAI`AFGOvY! z1_ZLrQd8zk7;x?xJO@qr?6aPG>Ep>S=;FF_Pd}m72VNCw&v`{RBSqt%Fe&APm58T@E1oJ<9W$v7IElS#b^*0dA~qz1k*xrz!vQ+!e(yH$`4`W zP~LXAJrLErxsAFXmdPNN=2+oK0rTs5A-b`TOr875jOQY1Z1~fq-g$J>If)vl`6O&j zK|rkelu$9kE~FrNI={Sw~KlqRNSE1)oh$6h3V!huZEU^Cw)7L^N*li_Wh4ZKGq^=ozCd!lR<%+{70 z%FcHhzEk%pr$j&Qz}>qZ+MIABshQMoTkPv#dX+ktlKv3Gr>iP@VQ#S_Wb6L}?{nMv zIn9>4OL)C+`_U;mK4IP{A5Tb+k5;Kt; zsX{dT*@!G{eBGO$JS9f(rm2dpCCvSUtP6>`W4Jbc+r(F<2TD7UA};e=PmUK?steN6 zND-xocx*`to2F@I-SP=>0dqCIQd+*7rrMXu^RmL{ojWkUi__f?iQ8XYwUdB0cszx7 zHzC5{*Bu8a%&6W{2@x~;+|@t8;Rq2akJH8u@aWch5da0VU3IMhQmfpfvfpy zBheIzGW>n~#1Rn<2iEqkT`p&7OHxbCr~9o(J0+5Mo&b-Cn6%xPvm5J7Ewd;!OW z2SR_ zYKe8>e#sUqM}mD@Q7wt=5%)*?>rpFXU)zNCau^IOTKHBo=1%X$whpjBDTue!tQ+g- zGqpd4qNBo*vsLCc7HJzxcRbM`lki$h0mH7ZBaC8IV}C72tUMrlNvEf9{5~>L4Rr(A zY}Hi0x9dgnjiit!ky0spxVPnQ4W_ZysmReH0o{Chzp&SUb8D|<5Np9TX&x6BOHgX` zD&CePIE#$c_k_dIA+4{!8SjX@bcLe%1m0KNXR$RgBXc0WZt&`)b007|8ZgOxQ!$MJ zd7~k#x+~~1y-uIrkad8v33{(?_c7CS1i`3swMIKIk}-A&p+UkB&039DeHgyo1+HtQ zvoDr8SBRe@dz`WG6ZtA5z9spTHT?KP#BVWvDsd%yU;Y3BY5lo#OoHNxjvYWQw9@w( zHE|0Z*5>mWPwKo`Mq^II`bM81^)2a^g8s>XPQ2~%(Vg!q;Rxf?wcrz3cl;}F-@yQ> z?18T0)9m;CERFNh@ziG)Z5>L<6csnd_LMu~K2Zt{(`^B-UiH4%^+5eSE7~5xZql9B z$CBdV6~=_P$i?4Na5^Zig2%CXKv;!DhTAPW6q}R#>l{|AZT+b8ArMxlgAi96s&781 zwtCCt0>+PDxQSyd%&lxYJsB3c-4hHrM`NIqm6oa`j*u8_xi4}2Yp=tn@;TUt0|XH9 zSpP40y~KcZk;}M`e>827HRvz*7&49K1~Ko`Ew7HaLH8TneqYygTI|L(q8KOXl zt6uiTwEdA;Xk&*RQFE8^HkrN>`_Q}hE*MWk^(S9cDv{gpr*Hbg>#qxr`xqjF{Y_wOWD zz7B4r;s#aOqCDK+i{d0qP4%$Id+(g2DbQ)mwZ2fsg5b1Md#vq_dg6=M)eL;I%}muP zw{0)XRJ^(BN?ugiXW*8u`6Z2$0yytXC+qj6WBLt>8Co`lEA@;H@t3AtfeI z5sF@6zT4e25QpFqsw7w61vAUzZRj8OgRlCDiggrbRA+wLo`@#o_ZQI-_twQrYV8A^ z7y5ktcczQ}Va-+kJpqi$iTp6?T7-?4v^v zhA1M*c|5k$Vi~SaYU{hGg;xwnJ!YKU=?ClUUbULvR3i5L+{627jy}S$kUn0owZ`{E zAHTMNBy-sB*;B#R7PcAiXRr2Gr>gI7@hoRB#kI%7nO03B={D*2?mZ9q(~~sKbY`4n zEuf8c^|0TIO!Z@MMLc!#q_ctG#Gxb@0GNHzEbL-sJUF*hpIyT&!;q_f2~E>7z=UwW zRi4WP!lIMYtOscWb;vDS_rL};I*B2Zg*P4AV-r-@iUzCSso&SjP8?BIbQv~sw06$i zvpavYbZk;;T**-LUaUov+&UGozT``73o#%c9=^i%Jw)9nxoqaPjHssYeIYA;F!vEA zUBEx@w(Pz!(>&>>*}`^jH$aH6Wr!S|2G7geuzv{x;kFwuXp_V~7Sf(wFz>IIfuSAA zahp0#_Cvm1Z^v3gAnVshQQ{F;4JOfit#+$F)^ho^DX*MnFAR@C=*7LTkqx8T#|-mu zPX_dyfy}R{*|kIYag6G)AUdwjIYk8|79_s*Mpjj-f~gMQUM$Y-uwgUFZwKc8hlPRY z@neOktbzgrGJ@(m5G^pbwtpJ@Svq~4M@Ic=Bu=G~Iuxo-l;0R!P!QN|0)DySlT{@Y zOCbWv7i680itBn>sFP$hXVC9!3 z`;iwGAd#j@Bx6mN4o1>9W{v7_lV)|vnXpzOfOM5tqfu;pr)l~)P1H{AcqzDB>RSGB zA^rHI+}TMOz}ivLJPQ69^Xb*ohZ;P-vp2nt25B)hSN9iD*kpnA9V2401|hsQF|Ll; zJ_B}xZ9b{Uuin~6sx|ZoM$%W54R0lW{%WYEpc^ea+;Uhw?N}PEz>E{;K4^8_50;JQ z+Bp|2-Bo$O(3(on*t@e1v9vWbV(RFm_VM1+vK;1ut=ts|#GvecJ+Uv)y)SYU?%VfH zNuauZEG=5a0srp6qFlz&ND75+to{QH3cBLt0iNL^|5Dk>?k|4;4C8^(moLYC#bB)g z#vq!ZOJmUB_3MD+J`R&oYqn9Nu^#@;3-S(r;z&hC^C~#0r>WX_j6@jMrH)sg{J9Hk z#wvLRCl8Wve_m~OH}*r;m9u7lHnp9fpRJ>m7?e0D z_nWW;10CT66vx%*)>>V$3J0G&-*Bu$D}*ysH>7EN3T}R@Holz{D8W~&A3n4A^_{(a zUhUsBNy%~tWZk1uG+UvE>=Y0D02m5Xl^{Ru=IVfmo$ILcvU(B#lU|)JML_s3!|hxDs-R_%yu6hnC>O+yiV#S9Yy|7Wodm|_g-#X=4#~eZqeC0McePj zMs9!Vw|@w-sKk%*xyUz==;;B6uC_7t;rX$E?es4I76Wr^aJd?|B_$;v z1;3wf0C=kYH1C6+c6`a%dHtX|A_G0z0N-L4?OENaaAo3Fd$)->SECEAVw{RMBBk!r zo{b}{lT7_zkrU6+4H zP8c}fA3UV!Hn+4ytq(1Ak{BCQ+s*xsqyuWeQp+t-s#?rurS&c!=+2p3%1L=Tr}pfW zn4XIrU6FislXYS=;PZK>@pZ-iSKRA}FXbHJ2FFk1uJ$%&+qM<$ll9)9L)4(h7s%!{ zq1~z(JDaAHJnd4WPc%iw&AwnZA`o?utQ^Eik$15AOmJQ)6kh)`4yGyNuz@y6xpce^ z=w`n1ZtyIzt*|vBj~Bz!i#f<Z^HsrV+1+zZKp&m>!mLjzX`83lBa1+kA;~`x*>) zNwhSaBA1q`GihesGR~9*89f^UQP9H zONacVyoXBk;&?B(s2OJW_KKIB9RE})uXmFm3L5s$V97R?;x|^khlJvvPd;9Sii?tW zWS9CTJG8%u%k_k_eJw~fqOlM{wA^*W7_; zA>DrXa_SnMO1CRiKVK#(+l0imIzgi=jcI$H>e6by?U6Ev5w~A;f8^|8aw|)agpbeX zEp}8CiNy5vQUmdEUAfI}gTG1;pX={DDwPLPh3pHkV`tQMdmM#bH!X6mOi=lqujRf1 zCeaIzKXd`6EvAc%%k@oDNW)*b*V~txP7&Rti$a{8#Deq0f=wil4`3RZNkHfCVQQ`M z^Nw9{7*n=|TtO-U6JC$)e{h7yR(w?Yr&FhIQC@h3RZ9Rph!K@Srm^Jkaxk8fnwN%&*a_?{Ko@Q_qPH>$!Bq=BUVY1aRdPLfFbB$^S#Vzo3 zIuvI((av-{cEWuI60zYl#5$6>~H@41ECb52Hb5mehPD?^k- zY3^tA8&_*aeutgSw$yHO?_j>tDeM;(Ll7+&4Zb;6RY(!k8sxuTzbv{;#>t}Fv1BT#k@l1>NA1_AANx3fw0e&Il5 zLrI5x2OqmWKg}nWW)?Wl(s7=PbxLcvlxjDB!CWn{8xOSE2PH1H!^j1j&NmA&F)<$m zWdf2>Q&Z~N*<(TDpU3rETT>9oiy*WXV!yKrb(HQv0J(i*Ws8LXTEkIPMnc~mY{*~( zzx={fov|9O_w?v1qf~bJx=!m=$luiF8|Y9U3J2mar5{bSv$pf1j@~(u^97jRiPOSKC*=wKdQN}q=LBKooRrB^^35g*JZ7>A3cUc*nuNOw)R)1i zSgK-de`h=iRMFeQ1cREcyQ_5m-wBIOeg5_US=oN=J5B&8&%&g`;k{e4A9eh@JoqMC z=WDgjnelbV$~yTp6B84{_hJXkKPxUMc$(r)(XAZMy|DO|Yd7nHb@OKp7`hQ9{nC2o zp_Pb>5VN)xUzZ&1(@N3cQND_fwgv7=)8He{`Up-e@eR^^%bdpokzN+oCWH_m@*brb-`7HY0T?gTJ%dzbU$%<@S2l#~Ihh7=Wm$sYw~)fe|@*;4!0}x7x#YcAVpU zg6&3QTE9twj4fs4&P6`&uQHXJ_Q|E~Y|3WsO3zRrK^}GK`)RA7Bw)?c=^dB}(dv&a zc!Ly@)ob-y)tY`Li&64<-46{+noGPvmPSL8uB!}<94xl6wg$UJ^{PIvf*UV0CkG3n=YxlM=vEv4*x!we z&X6W>4R~QwD-C1}iFRz<#c~>4jIQ4OsGj>J4SV%5zG&u!MC}Q1yR$|icLyVyn2)c zWTiw!le~H@Ko`-%f{|Yf3cW3#UuFFS10on0K6_bMDl03SnwlO8|E1^#n%#f9zpcl# z&Ee7#nfaF!p67P%Z5L#&@j!A3qzCQCVhLGQ}ijF`#b~t9iGVYDERH$w`yFt-^_*S==|#}G>AU0Sd&7b zx+Q_nnFIIiw!zU|60$pQc@5F|SuHZQ^RIH{*$K;r8wN*b#%X#-T)ZbK=R;6kii^p=7ssW7hD`I%1y(z*DYz@q2A zEOnXqqf}o&j_WpFg{qtE(&=hP@$B#@`p@k#r4YGLA}QH)<`CwPNI7~hCFqzM^UKC!>R^^$ zM?EwBr=@`f1w&?aB^TZjDQ;*)!2qo)Zb6F0VwQX0Atoau6Uws*9RVLfpoy9pRm3YO zbhC5Js8lMV&B%WM(H}EWTakv?_?p_z0XRF znr3t>p-2azK1Yg;laNmoTBCFFL^8vaRN}I${s^RHa3vWXdb0E<<-7;XaJSfF*Ns0V zW&yMQqW381m_imvtpd%KCnxi%=(;yg&0hW<97LUYm$Pfa2+==E2~nu1szy-Zg0A_S zZ_`Pn_dbI^;<$@7gV{@rYSR|=G*a%x3-n`OuPAx|Yg0$&GQpjIR&`~k@al0NL@EsJ zL&?@Q&*o1)Jbz%gmV{!xR)JFi{EW?67GTO%RdWYYz$(YY5N+PK0VK*B9h-&0J`PC^nnY;#`cwZ-~t%-@QFqZ1|=saS7s#Sm(8KA^c~we-mFt8 zHa_-hEGWpy%6b`*@-Eb1So`d~{#6@#D{krLprZjS>|s|diqA6iU1FeF76ZuNT=IB^ z6}qYE?hGD^4LVc25@+RhbK*IG8x)yB{^XD<#?en;h zh>{6FG4RJRFD&Xr57MV2&4gsR-54Vx2S~nBN#mp&(+RTpN`J(KNL}AB9il;(P&4H7l!ZAx>(;IkSC2YiQ~U2EanG>1&7w9_rG5_Qn=6U;emZ# zudY?5K|nj&`R{tK@_I_*QkBQc<9g{{nQ0u_(W(Eg-(|e6elZO2Y$;(<^|N@i0V4eW z?i&Qh%Be5PF^%}u80$1B9zd`;dV9h|C@CCc;TKG3Ey?0Wn}(fW;~%zV6HBi@JDb~M zuLzzocrtC&`nn68q?CvMPLjOrr>hJjJILuopu*+fd$gm_yP(AxDHlL=Pc}j!iXP5e z+4k)jr3NmjF@(Q-I-2uB>bUpF10EUo<_ftMkJGYBrZrATY^9c2zlpHI-mt~&=BQS+WS+F4N zw@Qz$%SKRu0u3AcHwjRbB7D8<{M-x3;}#p+zI(@=)NfZU>Q!Xu1@)0g%U}j?vWq8* z2+wF%wA>*L1sDG~!HI-rT=A`%WzkLWRl`Zui7>n66oGf#_-&Tes6}U+XDN`Nl=UaF zuD)6^^u1AcXe8t7Sf18LUw1P3yLG&vJ%{GOWevrKG~*`t*e9fr4(`V@wn;oRCOv3~ z#Nn2v>6Vu5C44&yy6!ff;aXElPYIWgJj1QpbRH#OC;U>Va*R8YhkWp}&1>T;A&@rw z&!o;2XF6l1>O&V1n#z*>IAEud{M%{OvsoSotz#D+`83jb@K&&y@+iOImuNk{K#l#y z*2YQa#Jr8y+@vIGcp>w8n&H$2v;lRGZl62d4PKLj(auoULD|ITpS|zIyWMp=;5c1R zr{_cV&J*u_cf(cz`F!cQ--p~x z8*JffhAjzNu_#_;)x>rNDeuhRq+Gu1?|Hxzm3ijz}7mr4B?{MKJ>LMvIF{Ara z>kk^7(YDby-0yf3@|5$kw7=ImM;VPt(GZ9OX`7NQu*cPj_?77*o^+Nzq4Oh6bwJ#- z8SlK0kGGVsB6YaeCC5yZ@tAdqR9GFaTaNG6v?cR6&FTP?N6W?rN21{6N;}FxvlZ}v zI5;@G*op38`aid}Hx;5dxwsmg?~tQk-1o?94344)g3H!lE9m9HSu$Hrx%Km7&%($? zo+(42)_vS~y0Q5@V4Q8RxGbex6g`M8G=fqxn8A3uQ5JyGm6gSE72Bvw1;Iv&XrKw0 zfTCuzfJOsYih9jJnr>z%XS_5~i4hDH+kqAr76K>~Urh3J^pl~nwD-c=%x6S8(r>-)BW?l!_;m3)Se_}{&Km5bV`PK9K{ z!(7A0a8hl+HuTdC-WSAE#s09S9fK*;i+u_#a^$T=9;KZXW6jn7l-O0hMxr*Lo913ngF%#fZJ`2 zeUR%oSI4Bo=6#SW+W4QV;JrNwn^KGHtCpOyrsBM;cu({Lv&i$(h$?scJB?2cw6AuM0Dn zsUm{BjIE$huut<)-^ZU7gRBr-Fr3)h+yoZ{Ze!{|Z~>B6RFpNZO$GtgIUbLX119 z*~Et@&yE#K8@xOQHqL76O27m}7?5(vUF%LC30yk^RW*m+7?zzz+V#*6w+r(s1}QM- zqq4eXQ)pxao#N}1V2>EidPq1^WvgHB#xZzkWo0#rudQa8USJLQ(NPSFyu7?v_sK@* zll(u<0eh-9Epu)mI&%|>X0)g>ci%@ZzX*LgGsm9GBksmHwGmTT;%*?@)t*=Xev zZwcz-c3X{jJuNNSu*luvbspe>!dijl?IKmY#movTma=v`0tb+V6+mWIWc=McL680K zu@{4UMwhpQu@HsD2GqRB_|~ShjY`n~_`f`xEfF~OdhsBx6AI7VZC|cuwKlO9q7cBN zBg&Y49s-iQ=1CD^v$xV!Ffbc&*uUvjEK#G|^WQALBwD7rZw?CU6QxmXyOa+teAl`|4LdRne#vLB{hMO5g=PrBFFTsHGu*kO8)}hJw zrNUT3Oi8i$0W7hgU^G6*3OHd9;LAn51OXj$2ngtIqx!7eT+Ioka(1BMs!8$!gk0I# zWxv>Yx`4lt7iO*my2juq;c&AJ=!$1*_N}setkGCkm+W%_5aNO342%m5+Jj>O0^{c( zYCH2TC}3n_dKHn9!E>;lwXA_?6?a`AnGkGrmZ3fznlsoo>v+ps7W$C4D8KaXrpxbE znUJ&y@)q!Jw8`j(%z%v$8^nG5we!8eR-KBWar9G5Yo%E8*!T=)b{^%C|4y}>I}1N> z$~+qJy$3`(re$+gtKh=|GXsE4uGC=%AJ*H548U&WJJ$VHpdMNoTGnu}++h?;m$=^& zv6ES86{^D?8|OE&b$+uuuTJReYQ7Pz86lD_zG}AoER8Edg)enY^%uFz9y)cmT%iuO zaoFD;44m`_9DJ?Uiwu|+go5twBgw_zcN&FpXkY$wQ?CRw^bh=(D$xFRLWvPb@dew5 zz){itb5w-!JYs7hX!0QzV%N4k2R@YVTp6hJ>fg0y@CW@qtCbzuT>%rkuJaR}O1Ad% zz9%*7{&ZN#$c77&T&ON0spAYT4i|5H4-jW;D1p?(q|(i?L#n3pk{gQAqq-dgr@>E$ zq2U#Be1VkF!F%@JSNJIJhBzkyp7m65c(bmylJLlrbhm#-hY5_oGt=}k9A;7<3hlnu zE;seFh1ow$pWwRKLfY3^ts;DJ?tCyhSxGCc-^f8USDew0KOR08^!3|9A8g#8fN@fb zuSOhhF_Vb#ac{069Opan8!nD5OJ_l;HEE`f^sYDRcT7-o=4{_6&UahGiVd|EHFqDE zK@QY_*VS0AeFC?`XkWxhmFEr}z1!9VQ+KDo+g_th=~Z{@k^!k5hMTX;OpLrX;=FoA zxlGUJDUtI(Gy33Du-|IN{Kz>YYvTU;aCk-C9nFYT`NFsolINv5bv4YTmIZeqQk;p0 zd*+$g_l0aW4XKfjTHl>sC&0V$c1JANmqjI}m_F7Wh81$wZuMMnQHr~C#7O#7r5U`k z6G!HE7HVI*zHeWYA!o>U7-)}+pnCS^GzQV!nD2o+=v7k^V#$=xQk!sva|=K z_`xNsuAW zhj24rsIlJ>p_M$T+r%1t{JkMR+f6qU_1P~2`{UDtL|x4iufO?{N|gLAqxMv~uhZGE zn;TFWk?806l#)xwX-^~33s?J$ji-N|bk-Z`owUQX!y3;!t9M1*7c&uCT_@Xcac(@)f|rr`1%$+}-}eez2itHFriK~h0Z^ReOk z3nAHG6$es8G`Jz5b*0qJe(Ia;idqcE}`WH#6>%o?d$;H}zNF15>Az z;n&qo7IW1$tp;aviHjTv&dIpZ`ZVM^_3QLgHk9}AuJnYf>a64S;LYd@%@Be9jhRd@$}joihrBws5!Uta7bp*mmN?JcEhM&j;-R5zcW z+WRF69nJEH3ms0m`yC;Jx)S|7`}XB~UP(rp8RILW@=5UixY^FFiJtGH^3oIAs7d0I z4=-V;lewFHa_4(r;~H*O(k1YHPR6$UnrfPlP!7bmOT$bjp>y*@p`nOGu#p zOc)pK0qo66+w`X)OZ-OIZisuyHsjynd#>+11lb z^y5ui)@d#Y*KbKR?_DJFXUUlwM&(;1+RzegGpdKt(9s-5MmFwyu}zmol0b^k}WxToeOLlB7CSHDwlc~nEv^?r-E4_g}BYp*%4jrfPc!&4=LZq&@D z?LzQ0?Q2m-n>2EyDh#$ka#L7D?RDk3JM2es>`!(q1eu6|rPZEEvq5GB?XThojlB+P z^*L=WO^;tgG@B1|9*~bY*tH@gI5x5s97JGS6`_(DjVQ}xzv z-9l0jb>n)uiD2W=_0QJ_)%|y^db9?jMvGrnzoy*?{CeZG)-dJVMs5&y3Ckc9YJn1O zp6+Rau!4y${xp|!+ef$grS3@DY13wOShh%U@WLo>z(-A{gRiNcTYqcg!Xtp1ozfFw z-PKX6(&E`Bv$a_28)q02fU}x-uTo{;*N(Q&59bzyTHi}}Wxt`kIi2-PYrg1MXTHg*?=i?#h8+2Wq0h4br+H>&+QEP zL1|FtV3YT^Hwc*+GpeSuJ%M%mbuMJuz<(=XAzz#)8^- znV0#`dmYji7P4W}Zv^g7Cl=(!ZAbk6#RgYlIQ)}O*r$Ac_DV~uWz9%%YoUqFo^rH8 z`?{r2LZ}5l)x&r3oT)p!$Rdh}q{zR|7ISvz7gWd>D6JZIO88g`-jpsgh?l!vfIWDk13 zll49L)oqbtd^)Ks4kJEFxmsMiq7lYCEnCVhnFD6W3}Srb69$nu^;!n zPS(ln%|W~Qu#<0Tkubvd(yU2zv~X=+ps4%X*HnWCW}Ip9u(#P3z2t)V zsyp>0?&RV&UqL#36?#;6zRgx5@l^xftU)se$yBW@LM}K6)`chi|2_h>z&cw*81gUw_%v% zp}_{rZiqfpf#JiMmNVe9yTN<_4vWw+g_Ok znGK9ft`~0F^!V{az}z%@2+`8sy4AlIlSABbxI&(t_y6W=)(F326{VvoOZc_wrXo%Dn`Tm63FMc~EPbc9FaHP}eJN3in~AB}57e z1^ASmavC0M6z+y0Cl^VdfY9Gb`YSVBy zE`*)S-Z`|+;$BcYkSZJHk7f?}_nmMmGS7xlqeVW&G$ezbiAi%S0SZ-CQp!3h*sKF{ zpg~L@XadO3)}^eFj?PYX*#Cz9^X~=f4NBH|zz70R*ElX*{+xYMaPBPu3Ve+PzRhV3 z4~NXaYJyq6lSfAp!-T09=`M=q>)Dl+kbo+PW)o zHz#JD7fIG7Pm+0Q1*czSMbUHU{CsnDe!Lt35{lUx$0g8q1^-mxTA7-8Sy^wdFVEh} z09moC?TSH_1YUEHd5;eMeJEme+fdF^@E(e8pNpMpW8X7#m_6BM??0DJLS)I0@K!+~!hWAwX!l#{Zz(hk5CFAo&=cEUw>X_$7b69wFNXMtcQm=AI@u5Z60^x&wR zTEf6U5}tRAX`eC+l(Z3EZ@U$Wrv$Qt2U& zX;?)h>LusJ!bt7ssknKe$`&lh59VIb^1I(255PYi!Gt}*E}#Np-*`N}+Mg8kfN~nB zP-tFf{dsctw*JWpw|H1Wmg=mI$g<52V}p0Dd~RY?H-tXYfj)xdJxi)Fh+~-f9`CSw z|AG5u+tsy@^G|o{%fHD18zZ@3VH(TJhu01n=; zVg<~VYkoA>Sw{Sag*o^gD2RAqaQ2rn+G`=DeTMmH>8m|-{`69Opt2(M=GjL2f^W&q zhtmwhN>1|=V+nY4y|Ba{I1U|4fN7AF`5YgAjVOw z+tt}A!uStt!?u0Cxd25yI6(S+>F3?#j3+^2!<)l@GhPe_=_eWKYo1+(93(YQYp>kL z{q!v%;VuNsIOd>|FV(x8-v0aTl9Jln>2EG-el}H<{UD8GZ33AfXdhQF!I4&-8ln1| zf`^?1Nj`63J!D}uDKlrA6SKc|x4wE;2vpd@J4B;kseEb|Ct+ucKQH@B8)_@v#{LKU za;c#2-TQ&(>X9ep53Ay-(bcT@#U4Wtn=?R;pwTcf<&J$$1I2zwi<7%lfXV}3YtT*6 z1Yoi+c0F`;4CI07dDhun8pF(X^Tw;{%E?oYwT^xknG11jaFRp5>2p;zDSpd;v%c40 zd7?r=={rvm1t>N~VR2AZRuh5e7$oTm2N#|4%Q?JCRUgPut&tK0V6`GEF+Iy?8M zrmifEr)m)?LxEC_F-j#+#RfHMs3M?M2t*J`C<;}c5s_3Bd0A0V0l`2bCQ3j+D2NE5 zM8ZQ_D7Ayg~c-G?6c24`}>`}|KMPJ z{$Bb@r*RSK?6uEBgWG7XtwlSJWzd$&_l+Mb{YXQo2=U?Ux*5kz{wlX#^yS&=k3T%> zUvT8WmhRkXp-B07eUq$p~p8fQb;4shkbT4L8w`hrbape)01$_U=W&QRfeurd0*`C-uba@tDwYSE#x? ztl1GSzGJ|*5s3#nm*nTfixSfR~sQ39W^5tTZBl?~{H<>v8vd{YBY|`r2 zg6~K{bzZOOW|6P^A3g|I1*O|Q^6qw6Wt!GN4Fa)5-^Yz4}d0GQ6$VIBqYKz7^{GVc|%9@<}sKu2b=^ z+-B<|CtD+)u53FV@?^IE^~qqXzjIFDe*Bxsp=!@TxknYa$=1nDNVPo-ZQZWcFpG7f zwC!nj99U)q`6J4Rd&YiXnZy_pa&JX@uCAD%O(YVhJ+p8ZKO)85*E%cd*YMoF2m)3a zux}edMo+3!gZ#ZT_Bzf5VduNQmI7Ef!^w|w6wH6D;JdW ziwg=GdP2FMhgdF2s(tJoaQOQD0c77$t=J-bD(VKZ>{qN(u>%8tymsw zA+AW7E>O_7ZOf5ggi_As>WAGiW&=ag4@+n$$w*DLU%aD)4rsJ^n5`I=@zazog|fcN z_Jdb-3`ppGM;}1}7w2VfPiK*z2Ie?veWHt;DyohlE$d}(F-FdAiYLgmvNGKI&T2mL z;Aj`1PrDP2YQgZp{aw;dXzRFD8_=4!_~RH}?)%V$iiLXXODK9B9Ub<8^TWJ=e7m|z zJ#f#R4{(Sr$!Cy?-RKaoJo1$GgKL=RSnB4Rn|ZPGZ6ATS*G{@17jaQb!Y$BA=t_=f zAV4ImQuI_V@V|cV0G*kGDV#{VWx22XGai|D6utTiF@;JS&YU=!g}$J>(n-XY+#0fE z{>)Trju)K_ZM!VD;TW8;uq0S!C_4RxdX{ZkOJj9zH#YJQ9GHClYVg(QK;q&M5AYP2 z&bcR}qoYS3%nxM|hfK}I=9q4zse60*!4+(E^3%@F$F8Tkhi86>N&pjkIkR-)V>;(J zSG7A?Ih#Z^66s$IK2v|IP~oz=K^{Y&AlRs64ti;L}&mVlMwa5zy> z)?vvmd-i0cq}X{pydaf=-Qn!GM~8Y>U;kxh2|(k_w6twje(zVh*!CG=Hj zug*Up3$zrkmhU4x30@hjB~qYxm9UVIfbgnL2o2LD!6@KP;u4XKk;J$MvmusUg2Zvg zzTMhgx;0yOq{R#0ROh7(uiS;}06awK)2D;Hz6czTl!To2*5-6y`jNB(d`RVF)QPY# z=12$s#zXKEBO(Z(q|HT?;ql`T(F_o5Z>!e0-#5}&@`HXNSb&Z#S9~ zIQ>qI_v#2?e>G-<^5ke{#3QWvmKzHRPNrOadRQjOJhvQXzBIY)CmxPE^E6@*-9w|+ zBErkCHGc3w`LFBmPM_98(}{b4GT<+*_GC@}_?%W#*vXBOlvml$(+ zPn%BB6##Wa;)}qQPBwS(k`&q-EAHP3K4M*QfBWL_Z0GucaF=)wqA6Ls+Gkk;TBzro zy$W#@hn$y1V!wN^k40Y^*d7Lw$B=ruLR*M%4fF8tab;@9;DB{)#nD!GU;5ky%|rCL zyXG3wD&CBbVDr1twLF(1lKa|rhA~Tmzx-LPUQMV?Ab`s2Zw|f; zp{nqK6E@}(a*vkF`?fv;w&dx{R|O1s=hFpH)(kGOlIBHkF48oqmZ_g49(cceb@H&R zv4jd#YIgbRa*PE;zIL;JLqdXtWx-zvzuvR*>=Q_u;TBM?kr9Am41o?_ZJl-u1%{oL z$Kgqg6_#%kBW{|oMP>nbz-NU65S8Lj_Yt2+oAj;cs$;^+s~m<&r&AS#zSHY*ls0A!XyVV(892>HxPqfeOuRe_FUME7;itLwO+BHk zq<}QSJCB->yzj9I0)^bQ71kz`!Oj|W5%s)KMC3#$DB1GP{&2 zgGV0@3VY7D*`gQD66s0X^@D`e*)tw(DbFUz;!>rY2$Vd`KM{$SZ55%L1WfEh&1hq` zI`!Ux`L<%pd1JwaD_GWbrbHs<(yjJf<F3fmhV2KzokTT6U{nZWh4^#RpE-x0KEzC+p z@ZiaBncC#;TxeqiXX_X!F!Iw=D`(qsW}QOf#>3H9CPSu?h$E$`@;)ME2VfE<_5u?) zi&h|o7a3{gFvZ7nr2Sou7(~_TBUu;ra34l;X^ky<8YI{p@}CdZ@P%bJ2uCEyAzR^w z65&({2M2bEZD=;K-=tam=}Frp=MJL`JbX|6Ri9f2u zNUd4{DD+?aJ}6((7(v9-wj8(cM`tZr#%#na#2SW!i{=sgtN6{k8TpqV|^B zTfUdx_x*W}&-WjAet52MBu5h0^?sk@b-vDVK|az}B_^OF0D(ZnY7b$0AP`hy->0i<7`jLJtD5fYe}$2EOTAvjHD0mV=ltFqmVR^K?m1 z=ICeExU@uZt^(v;C^g@kUC}tAk6kCKh`Y+qE0)`$)5?bZB?mf#^Byx)(@m7RZM5}@ zm5Qhj``<%NTILr&WO!}60V3uKjeK5H1iJ0?ap>*G&zYAOX!*>bqx8?txT&qj*%*iZ z>Or@G;FWaY*O{0r*>=@}!ov5c*9Zi{@y?rw*aTTzC=_aD*VNpMX~$l5bac2>e70u~ z`Q6TS{gvA{Z(iDwz5-qvwVHZEu*cYaY@#R$@FykJ0axve8oy@d2E#&u&sU^gy1sgW z&l}7D`{(d_X+xy=?`ym#|94;BYhKL^sDC!wWit}V!O=W<27-EY==!fmF0 z`zG_r7w*ayy)F}kN6RPN+=>oNNL&o|QJqa(SqwY-@I_qo;ppK_z9 zn$s2E1P zc{5&ao-|htY+-(W{$gWQ9_u%@Ro3(BCceMF|6VB|=UO_!zgLT|;~@0ZyM?KNm%fdS zoeMtSZa*t+H(UD-Y-ml>_OBxB$m2w`_Dh{oBfqD2r%QM&jGMb({)v#k@RUFH1Th8v z={Ro3UY@o}zuaovtY|iR7KS}PSp=cco?|~40c~4G3=IugohDeFzLr0EU5&rT?sGir zgB|9-9KI8%)CB>SV^9Ftl5zyevhnreD=cQNLgM1$vM#5xE|)muPh+vW@-Yn;eS;To zQThD=%T9=BR>QjR8>{^x9+4%6UNF33eKl% z#4qv4oQ;lBhP1?PnR*|rudj<}NlQr$e9bF#l9H61nwl~#&SRGKKiGDM2b{yn9Pc5% zr$nlMcV=~D4@d2iEN=aFu{xjbdCw8cAo=1Ov3TIw zNY;Qb_}W3nOo*?IIsZ26WBBDEJ_$qPZWn!bcXxAB(@ry{%{Ozu)ar7Bx8YZ{ZFh`A zrr(N&)!A@T+d=*bFMMAd{*5mI`0G*{+v}5YX%SKGG%m(S?=;#DSj5U6(S}q8E^}L* z{xDXjy#r{xoG4QhFr4cnHGj&LN%F|)^YFV8{1bQ+$``j2RdZ_hN4ewp=|yHtfAsP3Wz z8@8yvKDYy{?D{C}K~iu8A34B}Y1H@ahPgH++kq;&Ya{>;$HXK{|Mi-z%dMpLi{;YFwlhYIZ+E}= z+{MNI;7#APoQSIq`4fERv!4-w{{)kMng13czl+pyoozZyb*VVLSe0j1LWo;>_KUg) zZJNVZeS#gX#v+*fi&}%{W3Sd?gHMy-ev&#fJJ;7}KcT_eY>t=P+S&qF;tI*h$8_@u3PS?Dge{!lOLe`T=y1WK)}&@XKSVgODy;8jBxzrk=Vj= zL+iGi)x`qM;xgdTJJ&!p(RNgqb%M;AtaqE?klVctnmZeBKws|o%)Oj(0~s6=TAh3a zY{$xXKD?K&d28-!1|D$oXCA;g<}c}`QIg9emVvvSyK&dvLuLGUKE1d7_!T}=e+hU?3@F)1_1 z1vb{y)C9Q>${zm$mOd2R+l)Ts12LaZUduAJ|MbqaIWFNx1Do*md;a{-$?jrdU;>)u zFSY^Ba$x^_9qa9Zd9x$FM`Up+JaW#F6)AscY?*nd4Aw5N8S5BLD!L04B8Z17dG zJN$eG6MWnZpkeSlP4Ily)d<{wIl(x1O_^B=*u_jG32+b-FV9`OGm5YR^)Ao8;LH6C{?(Z&2LDo^l|~ocg}una3Ma~-+)vBr z&dM{SeY#eXqM%wx!wtsPPvwr5;=FU#=U;w%Xi1z?Gp93(UZ7B-z!?f>b zU;_8k<^aiX^EYo*1Hn`x0vmnpT36e1ZA^ z@QcN3#KXtOPuj2D-f27E84O$z9vKb(O0$}O}kXKinTYr+@8L6_5ty>OCY)}AUUX;39JD~*e++@bFe&f znzGvT%q~pcI2Fdgv7~VB|PYkJT>T-M>nI-FAvpo-fNK`HMF-LC=OEo zXV{=@(2$SMp5BP4YhoUMDtuo{vSm}S!fk$&u3O}s;!PLq5_<0AO!$$D{ z5Ogl~-VoCdjE?XjT3P=I0tox!F=u-5XFLIv%ZPHQ(f@cjlneZyMgH%X<_6?{uQIeT zGB=0)JQ#G1n%n^_?k@l$B2lCBo%Y}OVw45&Eda2~4|J8l6ciL085!I`*#u0oda~b2 z@Bg>hp_0*wiH6|_FzcvuT}4Gjg4`p#SSCjK;EO&v)`0(Zq^tPf_sRaBeW~klE$P2B zq3N(7?b$Rya?=Bj0lEN?V^Np!3&734yZ@@P?e3(pY60E@erAJ?XTwR709_A=SRH|Y z=QY>e->*plrqD_%fAQSi9g`O;*A#SqG~4Vm;aqotLu2VXPoX2@v6|si51+`C4cGxP z4ge)u{_FyJA4=)|Yx!K?Z<5M9pRn*bJUY732;hylJGv#{ct<~Y0>Cu>)`Q^$W=6nF zs9p(Pvtz2K0OA3}{&WoRbz)Ld{!8A)#l`buO#A6d8nFDA0PT?l@ReIeC3i$vOv>^I z0wgnc{^6)$B3d{_0~a%SmwPq<7reTrzd&TaNaD!!T}XnTCS3>eu2t5O&~N9l7xNrD zGlvNn!M7|>Gr6O`WE;vLcyYm*ChDz z9FE1zFu&Ye>JgUvElDj613w9DspWKBSItUJmT-y9ELhjj!Qg*#pXjA&Ip+NF!y39VZNh*i1MYEVMb;q-^z0;8Gju3b1vTl2@umIz=GAS|5Ew~khp&dcLNbI zak)kF%XQ3Ioz;0=X+_fpfQV7X{hBbornOxDpmmK?+iQKRTYhhL4y%YgZJqdax|q?* zeH8`Do^pKynNI7aF8*~*!DVG3DByAIlgjnc}iLo4jzjC=bfzzpfdTu*A`&ugj&g7uL$tKrK0#8hJamN60~ zuXuyL1*pC`j`<+^mO_~WM1*0KJlS$d@DD;DsK5PlMbE#O+|B6uEO4u;d%AMx*XNqc zjU&JT-RIgC?&c9lO9~yKe2%VZ(K&p7dZVvaC+02A+RW%pYhTRw$u(a=7w8IY&^Bxr z{~px;F4`cU@tV^gumdK4)mkYdRE?DgvB-iKZO!*dNCuKC0L&#BhBC*n#mfbx$B3fb%*!i6Q2lJ6-_%W0bshvl+K7@T(fUIpR~TZ=+xlOjNi*R_hx_Qq%VZ7OpdH+h0kn!S zoZ|;tLRbfiK$OJ(g&Q)%p`N%ZVDnX*iUt{%EM2iW*`k>ykRi)P-Q-5{j{#c7NJ3=< zLi?Xo4_cBtVJRci;`6a}S5cH+uuCYqvDC4{=C%q?H-I9%|6bg?j$gb;o4?D1c*wF? zw}Oj@h!twa{;!N4RLTWGzPyPVUvBu&D7wP1c(;c7&4)TOwhG+!jZGepC*c31xKd?r zDVB5@u^0jahb3-B^~bbIFt4WnwzxfWC=}ADr6Owh6dqZ!&8h^e75Vofk{+*=A8)-g zhj*BP&Y9&O4J1#$Wn^?|r%QvSGu$y>n&%dNGsUm#T~7wAjP9TCZN^wqf55^=uIS?3 z)ngmp1>p&0$u*4pS5DexJVgUWl%57p3i|-`%-+7ol@EP=t(bpmL8U69NlXS$2xIlQ zgn)_y{(lRpZ1tt3nvAp&Jk?IIBMn119{!t(QHjF2BO`fa5tp2MJ4E?gY;=Uodmjr3 zsDK2vx8q+cbXez701uYUb(cy$Y1&@d=T;fpZJC>X zl%!7`ej#)CQy94HNpVCbX8;S#f&ag?7*0m!o~>Xk%mOK^o8CspU@rGpnNIf>0gZgx zs)A&+{&V7?65VhT@V+=jbSszb+>fuQLmIyh@ZGd!iG$%seb0`z{r%=LfjU~m8c*kc z>#QojU-Ap*NwAwzoH|m;D8r#0d!sQqyvX(KU;3mj0Ql{w^5Dgvw(ef0hY$LvB6Ani z@2sYKb9)ditFV@K7L*R)JpVH_@q-CGWcnjX7IaM+YlhyF%3T8P40;@RXb#vjPk_Xj zP&@t-!}3do^qDB(tvp2oYNNkgh|0~?OU51ovh+PrT_&;j zE>^-1la#ho5fnkv5yU(ROwifjQ4aPRyM~ zVS<*)j7A>)OHLE=0K_=>{7AHOg)l+Xp|G#I53_J*#?atmj9b@R%%rE;z@WQShnWE_ zEp+XVMp2I80)LAsTxRL700g3yKH8tVBs43-e=1r-uL2sQA%uuMt|hTEjzL+So~RAX zpguSPBC=Yebg4raQT}y;T%|hqn`AQ#U5ODN%s=5j^+rv(I=HJMZB3pFlLeD&cBynPYBm#G za@xilX4skf?GHr0jX)p#V`@|-LG*~m%ctnFnB4p{{-?_a-9NJa7;CL>a~Z|Gu+0lJ zHG0q#xzaDqEyUzM@=vwTpvVND$>r-J+P5q;^RB#c%kS3Re0qA$?J&2pZTCLQ54z8v z^pXdp4u`I^*xaLr*6|k=n`y+AL`R^@0;g_X*PEo8c_vS+UAK1BCsv7NYZ|_?5 z+%2{&?*K#!GZ)pO8mAsgqqha;);#EU@ligfn;uCRZDpe)7vy&$E>?cXBk|F>*z6IZ zO-E=xPDfv8euvU0k zxTcm z32C|0r<6(n8K&&8wr5Q?J<@5X1JSaS(lFg+!w(jcHoU1M}b_WhN3d94k$e;~y03=H-`|#LBg!kjg zxd64Ey36j;)Yw&fZ0H_!0f#urkyC1k zD48>zo?2SG*b~LR78VsE8%`b;S`Z<%F!;882TBRtF>KJsL!4Lu20J;kntU?heFY*M zcc5;mu?IVWySvD`#23H&C%cc<4(+P1UA{`UI@$!P&$m6bWsFL=(kvT73+rT~G_4kE z!^%|>i$DB`%a{H{UD;}9?@i!Lf|1{wWX8kt-{lA@+$VPeZ!-}5YNam3z&c~Xjes9K)A*_F_l&+^#~_9^UE5_ z+^tbQXvk;0Z4CSVUb{04W|!umgw1>5GjsA@G>0OFOu*i3+R&L5 zB&!c_AK{XY0LxZ@2tSB~fNl~wY2KT@ftb7rr6m&PW$mke_Q5`}fVH0@0y1G2X8-A( zy-$8eDywE;;+qyq=(CEra*ROOsFL%#*Z1~YuY(U%;fF)amt*J0mv&S9Tx7aAD_I+r zzt?}hF!a=el}?A=6WeueDJ_dLa3F*6U2P<^l{&t)Utl=@T~nDLo$MTGp)GFNg!82& z014oBIf-mgE6uaEgLqz=Ol;y+gX`K%qeqZ?p-ws?`3p>w$B>YOof=n>$VQRp0oaC} z^&uUuALv!%3AEDZlSp{D$!v&-4nwHvm%~mRtfxJ|FCfQC()_#G|@Ql2pTz>Z$FPB-3IsyO){cL#8857`88s7MWjh_{iz+C2Lav zR;0eUv2F_Al|~0IOE*}yZkN+!*1X(K-BF2W+h9Y`S`$#<*8MgRQ6ax|8|UFY+*fuM ztdIq+w?>?>?1>6#p?z0&wBk<}BAR@Sm3Shb!<&UOW;4silo2Vb}pwY&*HxaIq zDrhFCc?_8uFLSjsLd23pFzu6!SF)4tZRMkOdx4tK(3Jd7_MfKY3rbijXw~{d-6W2t zoAU5uUlPl-@8(Y2N`_NpP+j-ufFjE=&|TQs-VQn#QoYU+ff9*Xd7}L9uY~-8Kv8g~ zWq*JiU#+uuu%GY#%OQGsxuIFBgWw2{f$_S6TtQr3$AR0}B6s~kAeVc8*Y<(fTSV#E zjH+H-;=9jWl%q>kWct&mKxjJN_P^tX1G@lIU8n`W28`KITh&Jg^ZU%3Ui_uESc`B% zwvDzH+bB5)Ib{KO>ID%l$4|&;=ocGuGHync*`2V?a9TyBknmRnQlUDqYFem~@<%Pg zj^WYNsteWxNJG~{UgDgoT6?;{@m!&gPRZ*1Jf&|CY4#%exXDuoUjBj3QudIXJN7~d z2oJU8M^kE6?HfcPj(sY9dMqZ`syqyntg~fIx#@A=SyZf7Ip-lUYi`2fmz$)&fOsWs@w!*qxviEr^pGvYkno(*$i1~%9XmvK8yusp&^vWc8pH+igwsPAvhR=r)|g9M07Jcs4=e;|Ai6RzTkSNyWSmI(wU4K=+Jlcx^}i zINm3-{WP+UUR;dMyO8=On2O@IDCWW5K?g1*S-%LcO7thm-T!6*40x#sZEhvM$p+hu z&y9%w9FhDv_PLcTthw6SdfvzqUneJ0;=?yYa2%@A2QU7d^ z&q2H-vPg*)igvP+T`xUFqmJ3yW}2U^HXHJofDsQUoP@Q~awJp4I7S2*hkL9?OmC45 zLkg6n7zONtlq299;i_}Td05>&dSw{5)Bi4?B}rr^)cdbadZ`aOI%K8s>9-o(0a>0U}46I;dLUaTPd2 zS5VIAVq6@`Q>C}RMa5o!qNOSd&m4%!98l3QUR7}SfxDBkfb5mJ9v??pot84~(a*^+iAq7_qrwf5cHPzzrIyWdVAtNIn|c$BB5(7b z2!-|hWYGC$@Q`D8(*3Jm*yz^}`TE6L1tW`2wo8-c*no+M%=4%hXnLrbUrE#N<(lrl z+0$BnPBp&X?fq4!{Z4pjEOXXnjQs==4Xaa*tT0Al)kgf zaeHWZzX-`o3&7#l;T?M-L5*MRcO%WcD=PRB9)D0YsQy?}=`)MRINOSh@Il-OyKm6P z$Loq9E`id_wZOTC1XNUm=tPEDs=G{P05T!DvYk zm@`{+f>4BmI7DSlo7Zf+9D{ZhGhXO1URz@&1_2ew8LO(3U`APqmaB#3#Om(6_PFEY zwb+>cJ3V{w%ej*w8j;n`l=O650ok#1c(#ZZ;fZY;soJKHm>Bh3L0rz_=3IS!avs0T zM+n!8gQToLDg}(>?0$F6i}phY1|Vh)BQ%^ZX%5O~-}&|kBUDr^D7E{L#R@2!TdV?9 zH?zSOvl*h5B*kC)^g!$cgr?g!&5A?sR1@HX;uGXq&@7LXo!KF}VBFmo0%S!{kh1_4 zF?F>b_%#SZMQhe`3zBWAEX=}P4^bdi)TAVcc=yKj-dqdY*SjB!an@ed6in4-)PiWq z)e2v;4h{jTS%7x17nZ9Qo-*a672gGH zPU6{m)MZWy7%xvsIdF)|(heg#k9z~!FOIpjM(k@&RnT)LU3-a9gFWu1R}rVt%t4Bt zmg#LBOd#9J=t0RxeNj=T(Jst-*fTj$H)+=M0V?b{Q#hor4617N=Np5xBd`Ib*D{M_ zM1W>qH2UjwPd9jb`>^v3viw{tDph)-tvP1!NF!YxQdLo*%~3#(iz5KK75-5G^{L~h zSqhFuOAW*<1s3wqXaJ-@c>}>pg#fC)$%c@5O=|(XFtLaS@x(dumU-$L;>u1yJ*|h7*#$RNC5EZNZ0$~RotAxI zyY}WWU)Uc&A&vP9UlQ9)fv#=<&Ra%$`Q?$ejy(Q;N#-ocHg$k-uP_%)xl;dWi;a$H zXtz48r226_+L>C(#UR@zant;4B{11G>Bn7u=FQJ7N&y{wKzl`Z2u86k*Pd6{P})2q z?ZL!n4~cH-ik2KR=vR9f|FOAL|K7M_*b#@|!xV%2dwo{Yy9H@l8X4onUsMt0=lU{ugAi| z0vJBB`c?ivBRJMXRVC3|@-g9J64}3ASmttVaY|TG)zc~%TBVaOzsE{8@Xx|O3gp9G z7t-6EgH-m8xi<|xKD`JM;a*-SojU{4@aszS7KLsQ5Z(yxsU>+?{ah>SCi)uS8vz?~ z99`skJE>JYw6?WYbn3T$6Z8s&m-D94LZy^W=^9T=Q*MF~xL-`K%H4W>3={7oLU46o zAv^EUI~TB4^g2?(5cj9wgAd75BO#;QsjRfw8XRPt1rXbrINx|3PK6urA<$DZ7I={h)3a$X2C@zl`YW?_~E1}mPC(~+L4TGD93+rl=8)v`S zxIgBk?sNPxtK>USN=ebvsLacIL>9@b&ArDQw+z%G4ASkp!|MhHRBVlI>3TYPjb|it zNl8l^_BlP*Hdp-mSnRzZs+0g16%*$vc^<++h=iI2stD zBt_AHO<~cN%GobZU9c+Thz)R0&Y$W~h!R0juTS2rEhZ^k!gyU(V#4hb>L%uZ7 zVEL!%;#Ilbwl&?~Nt&IyYHyrjD8g#$G?sGF{n_T%*{ej(D^7&0=>47XsWvT@>vZ&1 z{Q+P(mPWo_O#@xBRS0##*+biXVKC;A`zU?%K#Yp9Y97TGoAsO3=eQyJXqIw&NTSs< z7gAQS{h9JNu1WokZVoQ}59$YQK&PlP35pbQ20HOkK~k)AH=`Tz9mEoSO&9nwBV7Zu zIS2q|=TU-`VirF#7;0=Tj5J;~G#HKYUvL>p!x8buXh>=4~Gf2o@J>r|6r{;pMU z%Lxw85xJqNrW&<@iDB=_cM0mO{)%>MUat4fhNioQ4?XfVAB*ZQ2xxPvhzSCtHt9~n zWu`yL4YjLeQO;8*DF60ppIH?~OJ3+zBZ-K<3X{mNI;v-TL$GT>T+5G4CM7+`-*2KJS!k&%=Ks$05^y zEd^*ne2^wGD8BWiL-MI6Yj0#UH4hcC(lBuL$1u}4>hX&Om{S^svFb%0KxMu6F=iH8 zPp(t?q0+7Nq z;|bN|7pRp!fxVRJk0lsN2?guE=Sg_iVgv1^sitBonRYfn;=Kn)`7VLMx6fWZU z<*&Zx$#c07ea3TvJnFiDBPH3EZA|pzZsi)*!0_kB#wgzi;tu^#4-oTtIlfPn3xJ(8 zo!=82dk%urEAxHR00;FiWwHr~xpdyFCkTTM}eJ~bkbE7~s^DE7&HZh9cVk9>rx275p)f9J?qfrX-O$@-92Ei7LHj5Pw|*+eleb!PD=D2_TaJ&nh*9@kHS z{impAvjrDqsh`z;#fk-5L&*TZyU|jA!@_MlGS7H$QlktK!jbzE2Fod_sQB~lX$}MQ zDp|{9gy(_7yMw2m{$4L$c;&)v4lwJnXmfa-Mrtp-9f2VD1oQCy991>5?720W^#W*m zYg7)I@N!kt-S~2y-aPujwF?Li5QT7y&r(wswuf*I&J+?9a6}{j_GMIt1^?A$$?xD+ z!o)~}?H2!wv^(ax>HUdUq^KsX*C3k@kFSHD5lYQZLsiFJHE*Z&rO1X_e<=&KVi8}< z3e^2}m99Ggmvk#Q0FVwR9qoclXdtuk_v_YJ%KKBXGguBDF?A zx%IWWCKPs02ioEzJO-&U45K()SSjy)_q4!^EzG*3=|QueNUV-_jCL3Wg?ozJ-m#SB z`cra6m|?YvheSygZ9wonr7ei=lIzQq-jh<{dH&AHAwh#?=OAm1IbfqzS=bH-D{dcw z{lSVPyDAH7bt{-YCl!$kS3W^NTZ;!EgMk)7*~(_PR%@PRSR6_t+<>veVD|XnQUe6bDkrS*^_ep|e_fX5<&iqSsOs_=S(~ zSF;Jc9~ok_esRWwSJ}8dlj&6u&Mm2x-w`zA7-vhDfqUq&%{EKV4ewxbR_zv_5>r#y zObb8EW+CtM{EDF0XMWg=Pwc^&wi+L5rfizMSGe|$9V7v~ z%Xnh@Oy77;q1;jQIslGBtB$Bp2I#+n*ghQ)>nDwbhDRo#Yhw} zU(HUmA7|LH>8<(q;q`FGyTfR5C^yiFE~HfG%Pv6>Q;i~}UW*Xt0Ht0>h&Vs;r@=>A zWQb!TZ0SjuiycK28(F-shsOwE!z0?El4OLrt*>F>hFL$4t-D6}N^?LY8~UDQ>xfx@ zX_66F&bEf|@0@)oEyyu7pIQk7(GwOX{$w3(UB#Xo5O^{@aFbYV@Hf2{?BI+?Fn}jW z@MQq}honz=Vy43f?p@cTP|t}Ms}D3NPia!(d34qFZBi~n;U5-U41eSn8VZK<^>Xfa zbMfq$Uyl4zLrJ% zxni~MjS!LrDitot!OGtfND;a1XOvOlODJWx85x-#&EvrlH`yakT4Phw2W&RV`)N^3 zNk5YYynJOz$YUXB;klt@R&`5ClRePUl@eB24qUB6ujz&BlRZ$))5k?m?CF8iCIVk{ zEYlJw8{rH!71v?x1!y#t#^34nu_+Lf^Ar$~XZMG6#)Ef}$W%uzn++DUeQrd(5n1Y( z7Edzli}bE#E5+*X^rs0VHD3|5+(i>61VZvih~eSs_LLkQIaYpLOTxp_1*zdYAlZ{- z@7w;9n;n5iM%@=`>g+5aj9X(ZtN3-d>Q&Fs@e#2gV8AbUcVoW~ADfwP8MtviIP5jm ze-w8c&Z#X)&siG2dZDAcyXn7Dq^$Jy%~9RFvRp82z7^ThUJ?zdk34s>vc^goMa@s zC`Atelv*1qf{1EBm70Z!hD`j6RgSDYf(2<&B=Pn;79t&?j@$^urVx)PuCOp+N8j0KIK|>kin|k} zBtA`_LYeWPx%aO3TCHuhO6?L{4-5tYESpMf#_Foz*6gN~?#ajH59QpElI5-GfjJ+X zmVmtnavuX+=KB*KtGFlQo(Oz=VXh4Hmx!M3x-+<(+7F z$j6TK$PNevKB#~T4AKlO0!iA0P2kp%s@ORV8zV%VR!~6S*Z%I#?@uzYYC0eF@UNA*6`t`n{G0l>hQ3qMoloN(w5L;vNAz=d}E z<=_ob;i@D*n&U8rPa!>$ONuUo3xcRsXI-HfI^srn6TgA<@wnU`Dhc{t-;-R748a{4 zMQQHSVnS1QumiMU%0GItR;a!z%sxs~lTt3lm|`9ku#1!k z_gQ#69zE=2bcc1giF>Y7f4Uc1eW2(-ZO1dorewG>3VWDaQBYCAI6E-7NfGCsg2R#= zexi4a5XYlRCCO%Q61hK;6CG@mF9+OR4~TGT zxcHA^w7aS4HkbD2J1`{Bn_rH8QF7`RQ*0GC8)zvGpkU>D#W!iI_mJ#rs-sZE8^qWVnV zvQa;TRtrFvEVyiM4XHzU*vUe9kk6;6^J?M|Z06xO-U|ltM&v^TcNc7kk!f~~GB)q( zEtIFt9{@qlUKIKL3|3T>)hzYRTOz5*-FNO!T~mDoSrrTP*`!l3E6Yp7r$(u7L<&~@ zKH6HBPbcQJ#Q@Ownz8rT=yOe7XMNB8lY{9!4V3hRSMDFFBd)=?mHT#dpMMwLe_1R8 zj2*?@?J+FB`|Sla164t&_f-^cZ;4Ve)da(XPIzY0sanNX!a4?k+gKJ-^jofWPLLZS zP`8^Ax#*#H^?Hb-M4;5Eka?H(=QL6nb->CEPfml;zB4nTAPdEN_{r!@V5CAQ*eOI~ zL_i+t=r*$s6my`PcU~DW;dl!o1$2vIZ+HG;Q<~M(3fo^`NVgC08wf0R-0Ui&gK~!= zB*Rf`UtLO_mbci+JVuBsD-PSY)xyR{?=47=b_(Qr8rg+~ziWv2WX&o{h{MW~9L7U1 z4Pkeu^Nj{5j_xz$)I&R+O7BDQM^zNxi)mjvO<+RZY(;R?;nQ?73BkW$oXf4ZXTkG)$>YKMFF!OTIi5&J1MR@80Vd8v;`Y=)2agA6GJ0H2b9` zLCDIJec8)X17wXHE(1G{jUET%_b1f!iI<)@E!o_ZPRmPqso`D3yG~JuawsnIDR<@- zp6L`3yRxTZcIB<1EF~~s;=>1G$HbzE#308;OQnxjX9Dhk6HgQ(gVXT$d(F>R%n!io+~GmfFFSIibVrLjL5I0+E6dG^dIOs^#{Qd_J@b>+MG#*Ck3f zg}y^FtPVApPgl&LgE;`)_P1($M;0rTAu>SSNp+32OT_5X+r8l5h<=W zZhV8P!N$3uo5VPR59y>~PmOEr=vX(I9aQakj6>!Bm*SSRDtMV2Fvc)0-8mlIcuXk@0Hhm;w2r_v+?` z1K{@#sJ{A)5D>MJ5doPGi<95^5;whzerIqfVr|QCx&B6!7E9jO@uMuG;h{B`>_0tj zRN7-ksCwS%|$ z79HMW&PXmPsQ?=du%VMx%oEnh&~uOaWV=n#K5J-4pW+RBD53D{$kcpASRc+tph8(7 zgbep}G6;uUe2b{K_`O7jm_om%HBK(rqj!MC<6Qe`vmY0P1zMc1osm)uR-(9ZJA{Qk z3apo0@}}TvnuGtt5Q1S>IsQiov(!jDWeDLP5-k>72}71z0x`{-H(*)|gdZ*`1*pOa zA1+>H2sucP7$~`{YDaPFQ0Cf%bUy6D113@^5>BB03Ty!(`8XR&!ZQ-z>MZ?*5%Wz~ z^X`nM;+aD4@8weY{O~lrm)Tij0ITkMBU6GRsU0mJkj3*gGqfFc8?W6e)m81q-Xy7?F9n zyfw-~SXYVThDeC(Xz4ow9%dnsrWGaai0kM|^dy)4*#HThVmgwrq(BbkeaBJs4RDVP ztnZ$w7VLr?AXa~Z?O&-}L`plJl&RsemA-{g^^1?bb9H*tG|o=vrUkX<{qblQS>g%I z7WsMCnNZBfryh$|B0WV{HwPv%D*FRJH|<+0g9See2y47f2^XnND)KsiKGKv!avev0 z++XGyAJ(q}yvRHxvZ2D!_(J3b(n(Jy!D8J0jz-aR@#03hHGjTBp45|mV5GElbDvc9 zsJr=idy3iJZ##vxR$gPPe;ULF`7_o9m_ys4&Ii11yl?!QNs8$T*# zbM{F@_{0pIHM~b}8v(|+daU9+t4It20!v<|uc2^nlNZ3nQ>kFM$+w@n zY0U-k`Si0~+mHVhc@$Y9llc?^RxbQX>PP-Ll+M-y8wpq9Ajq$NJ(^9R2x$?7xOCS42! zdc(Cm9S5-KsE^$BVHiB0_y5fT6nT3g6%2>Hq~cO|C2fttWW_!_hgQwWFa#@zuA%SU zq%FA(ISN$N!6HBib+%{6DY%i0tN1vB%o=I~@j#~7MTxT9q7aM#nFxpbK;>==(6WG7 zJ~b*Rligqd#hqM+;DT6D_)70mr4$*!)p=3~u3^eQ3KSqV%Lk7s$!N@IL#(ItV%Ax- z`+@nP$XmL7R;gt0kEfN%_4P|4f{I)vAlQS9k52FGA92_xMm7dgkR{393ZZc_b1W#= zPGDtOVlBg&OlN?%4S8Cp!^x43c!o!?GvJ1V{4S$#&m2Otre5nOC6eBc&tzUAAK+7+ zx*9vo{agk{iN%2_-0%4!RO z@qr0t-d^PT01Gg!me~*nb`lmT#9=$URSmKk@<-rtUwzZ$Kx{el_=WUnn&K`brkmoS zE>aQJr;$WzTK%<$7V-Q)!KPYasB+oYjYg(ngt;E)L=-gH1q0ddosu=(pq;Q0_EfPc zqW8s}mBrTYar6}zmWxLVG=WE`7M>=aCS8FNH!DIzSY)PCKSLjr4JBuOSN=V@Mnt)l z?`XND2{zhnf;-<*qJLfFt6h1#5Y+z}1w2xHfLy7j6e+w)UTEs_69O_(xZ5*r0bXjQ z=V+2ivWE<*n+_1w{}OH0cpv z3us*IOhyZZahm*E#X;&+*Ws1pD$%SHka08$dL%o=JI2$%o^JBk^xR}&cLMY6+;FC5 z@xy}!XoaQF@+5<^5&0D5HweLO_kU{kOLEvN-pJN}KXOAKw=SC+q>t-fKtQ}pU6@*U zx4fD-4w9|Ss`U{PjsuCSJ=~9Eu}l;gbM2ZYh>~yY(B#3GuD`N(=DLw^@)|EXz>9?> zfOUf^1aEiu$#i7Uf*ifaF6Kd}ca#m8Maz{5G6c{^4*+&hEl^lIY@tD9@=j#KR3vb>Oyf2Q97l z{B9SQ@8SAu5HQfq*G2=F8GCTp-ccz)hPzd|sfg8|r_351|oV>hCouy=1 zQxEkh!wG&;OFcBFt*UJiUM>p--?S%SsIEppP(&q6QKK-R0{L;wS}9b`nf&-rQPBbD;piJWXNHAvv=Eh_o=DbbUSD_9tnG~=vsuMjuf?|u$KPe_O!O6S zfO7c>Fw{#5jADD9_@F=EQJB^ogwK6GEo(a&-0zw9D64-Us{#C@iXpwwo;ajjmSd_| ze=1NnACBX1d#?6!MaC+w>UZ_qK=U_dt+oT(P!ClipfsHLfTcdnkvj^k*oVU&PbJ+~ zj)W)+P$d%-6c)fV7v5P5(jv`0OVl7JEg8H-_j*n+0S&4zl!llQz@gKRJWzJ&S)KJ{ydLv>4tpREnh%E^{A__K(4^6Ow>`s|_A(+~sZno56#OE;osEPc1?|71=6+d@7F1gU=LmQxmi< zeEd4Vo#_;&XUvVAJYvB?o2#WShu!n7N+rBqd2Dr6^0gxqt1T}-^yqq> zQn9cdM5+>OGj#Rg6u0^C1VY564Iv^3Yy8eK^Hu)_5p}vV9jcf&8KxPdbN2tybl%Zy zxZfX-9cm=Dpd|LJy^9dBiQQIf*Dk7d)gH08qSRi|s+Ou!o7N^~QLDDvqgL^Y&-eUr zPW<8c<2m=a&-=OeeP0i!=Cc`1*B5-xakV)1Pwbtz{V8uSmW2Qo6p6-w!0dG3P(o5j zTCyp#HUNDPnN6fTkgKIpYlt~}&z*Urg9joi!&}gLiVx6$uoa8EaK8148)IE_(9Zn2 zq&a$$gAxx!0IWe4Urm9!4LAACzULWSP5nfz3+`&W&BL`A*Qw4H#`t#n(mO)t&(1Bp zwIyr-Et&Bk4f5?vhPo_~axMi`oq)FZ=!lC%csyfBzzEX$a~m~172PNA_Fwo-k4?^U zYuV1@Pc8%Y%>`hGA5VMpn6h~=e=qp!1lUr*0vv2SQw$5LSDI_-T4)T${BZ~5Ew@|b*D!YR6l;oW%)Rse`Yq&VIm@$vaxV^GF*i@LllPddH2_nG$$IHMgcrQkfmv@7Stt*K8m+w~DSx ziG)s9fN?~mGKJR=%-FREhKViIdTsKMC?W(^c-TsZgiC0cd@Vs>w2*WdeiEedBaQVkDm!%SkU9yVoljJTME5I8$RNfvaUbg>m^EKl_3@GFSB~)KzD+y? z4`Z`1fa|fOt!C`Z9}^S`RYOw$kMBl>dMJ8-Y~lGVf1mn?yC<$YnU6=|mWX`00JWYM z&+D94q$-(|u3E2XL%y`0U+rDb&8iFR`R!`^u%zAW$9WQmG50{sRLOZPN<UE|Hc5KAZpkp#dfOsX=FhNmpJ3Dtf zh`b%~gwJ4O{i{010C{Rd1AD(ea!jUuLE-4 z7fy4ouVle5PDVy{5iu<6CZ#ALQ?_9hsOWz1KT{*#AZ?snjZNF@9N$V>Ve*y-kW+l4b79c4Gf2b!C_qpa%eA%laxy*JwaEM7Q>w#?s0;s0O41~ z7A3b~R3x>W(NU=t{H<#0nq(hgaUK+rxt#M*JK{oXuE1=XJLrf4s3VF3V*)h!+-L_! z%(PTN`5lz;F+l-CLUN5u{BWlF(fj`m!C}aztPH%5~Co@R~cpwjxAYQ-6OhXC15fEVnl=wF90@6V8aQb|W|&zt~J#7t7G zMn);<4=a;&_~fx2ep{eiwm#3;W=XZJ4gELJSYz=0P-<)!xqw~7ONqy4BR#Nx!h-!U z+>fUfq8~9b0Wvnsi(yauXPq4bqLF0!Dj0^z&ZrpRfc`3g>WV!rFdgS#MVuv2uo)0B zCD?hvim|bR9YlAuVQBshO?xh6#@qND!afhN9D)~yFTQv6!JrlH3#(KnTqcqHIM=rp zZlVZ+IB~7}l?b0#nz%XV>EAoV#Z6GnQ{}mXW~$EK{aHLJ3t5a~;G#`}H_J1KzW}!V z=8)MEuzz!PAWbD-2DQ%0|3nqwwi{aWDyyR0m~zbeSj8sFEmB35miC>^-KRsfpgIiF z#H6xsv-u?|UQd6P6RmgL`Q5M2#g;F0+U~cuK%hvQ6?m;ZO?fP5sf_&eX^9nDQY;KX z7Naqp`3V-cFGW#|?1Rn7(O}QSa$_p^N~m+P(6n@5o$#0jL6}x2g3#-bL!l~_8pLlJ zQ(oX;5@nEB?V8CRlf>BTSi@A51@Y5KN z!lfdRNd%y^0B+nowd`uFX+{ZexiCDz{wV!cTTozS>AL411TB5_(}w@|i#^r+u6bQ? zF$wG${3~bvh+^Qg2gW_`fjRoY*FWBVJK2_T{u^46T%Ws7g?Nqa7L7iB{OP-zGD+T} z1^)aFR;0RBg73&XiXRXk*1q9CVPPhZ^}u1qCR}7G>5q7;UyYcOh5kx;el!W;wvn3q zN8v_D$W99)02l#Kq2`1U0MH*fV>-eD#)^>)qg< zh`#3K3~9>%T$(;OUnww2`I56E%^`bSA<~mGuw=#F&O{MaFw`&+vA~MF*}FN{bq|$Y ztRNoX-i|Md;^lqN0qYAZFC?4jt&BzY^iJPD0QG%-H1y07J#D9u9nX{Y@%8g+;Y>Ms zTUH8mbqM;s3@%{+@Tt{C zQdR-fBu+rmV|5cfYNMQ<&dKSUY@kiL7f+a=KUDqPN`0!!26_VhS1yQfGKomGvV;zf zJN&CNdipgmAzHOt(1B3SNX7(CfqSXft6o~n|$Pw<>4EgmpQl8SkZZ&&{ zqi5<%?mpW?jn+YjVAMUcly;j12@GbK=3(fUU!xuKXYd2pwL(ND9px!K2C0ip9w6U zw`A8@s+wsi3r%op(pg1<0JGSe{+?2WhN&I2o0oSH2i-40U3R%t9TefDH_?}lzeD>R(kn|+ ziBYOIi+44iEKr=WzkQ_CA>kR#;MP-ip=zc5$vs5n!j{qrxJAAf_;n&8ILpuAx@G4- zy+|L&YcQk&EKU=rt5`hVz6$^|<>jt6^krs%o?HAQN zA#gYfXz~bZ;6JP0n786x&oS6FE+Ut|28Er=LjI=nLfo4U) z*C_D{;|$0BS%)a@=rD>s5bpnIdq7|*;Ll*{-TXWqolZRqxy$}nR`1z*CIR!}%8d-8h6gfSs5b|mx1>Z_C`A}n z=1W`p91f3*t31_+!jQp0x^M54-<>psX5N)&wZxNYI&GV@;mf9h8R~U;dXz@>8By81 zlZ+@uBLMLCFDE!S6&P)tY;D*9&;bM?j21|0k`)sz$7`(>Iew>8BP0H806fMfwB@0s zes76`UIh@32B&Rk=t{vbb|<(MfL0`y%&{aUc7#yG0REouy5j*;g$Ns^kpjY4BLaa? zrj>Av-K90EU~6Jot)V4_?t3JpA3a=s^Xe%ei~0U&cwV$$CZRDXTLuj(Xe@aB=^{lE zN(36sMxW*jPcDexhRLkeW#w`T^P!vf-OEya#oIJf<*-bZ$x?97HTYd3t_8B+7rn$K zQ?|95ftu!{*DIeaet2rK_z%UoU}et33IZn%#O{2?TD%cpWmF zCFLT|BEIAuZ9O84(1wk3OJX@!!&4mvaC#_QT`rf zr0gRswtRXDz=u;U%JTv8@{SD9JCPWa?j`RY7 zoF4^XwBSg@8C|TQhL|PjJ&uFaEnDY2O~Ro8F3duK3GDE+71V6#C61))*0R2D=yuSmEi>b#rZ%|8c5`=;c|}=|ZsFJFEKJ{0#c{ zWpN~EW}bdfbD2Ps$47gl!DU4wC;8i_9e*r`4#$%pK~+*(!+&4?{o4&U;`e3z8Cvtq zat|DNY(DDzgJtxEiPcaGtCz@^S6|3u%QkHA{7=BK5VgS3b z_NRZn6SBSAL;Kt$uSt|AAIT*+Nj;fj)`;ERdaKV@Z4PKVNoWUZ5(11t9EifvR50p7 zf{h!7CZl64e2}V!7)%Acz(y1CMi%gIykfnxtdUWWOsJL{!_G*!W>$|1`oxh8F4PBlzjuCk zu;kd2Tn?l}ddvTJ8zW64QlZNYM@2f09RpXK?#1AiC}gabq~~#n0IL|&NBG|26ULV7 zModvtOLql?HYT2(*X3Nu&Xfbh8Kyrwr@1&plGY6~HSzck*C`lJ6jaIJ4x0ht)26@* zX8CDt=2x=&~P_OgZLH-?&uaLR?pFxMS+B2nb@1UGwqV?z z3~$L(^hmt0CENT`GLa}-0!6e@T9f+{aut0l005lF9t|NpJUxeBu<7aV!AHGL=dYsE zs$N*;L`w{)v?Sa2&@TsYAaiurPn!Cj!-)-FmoG3cZ+&{u#pr}wup%oze))a}Pm)Gl zbB9^>dumT%26qZI>E7NkKTb;WkW}b8mM&z)iAR9eerbjKIuoXWxYmudRyQ*Y_^E12 zOrM2E1$=O@st_z;2J=V7$|j^f5;Z=)h_CtPH@{NhG`%tZrjvX24xPk!(M~f|kauKc zr^l*-nxru2QZc{{tXULdUFe6RKL4_-LUg@#8zr$4nwj#vVK*+N3;1GCl3C0 z%5V5UwT+joiM8?#+tE=#Ff%PcFl ze>Q(Bod6*RDk`NWKn$$<*XxqU4UK_0L*GAG_r@)SCMfQ#Z#nb58D)Gwi4t09s`Gj0 zGNJW}6+ZQuZn}Ye(a|^?FU;;U8l9>D+3f&uLW}`$l&D}Y41hy}h7+nD%V>SZc-=BNAggue<3`-~G(gbBzDI+iu@4Dj*07%2>ll`i@= zet$X>BO~+qaZ6$Sha0KK;_#gbIL_+Lgyq%5EgkljFv-KiBfW5W%cR6%(}FL=m5#*k z`RvOt*ME;L{z@JdwR4GRl*#dZ^<}BqgT*?hZkFZbGutKOe?^s>e^sxjHZmFYJ}-&l z(jBn_x#jEvhmS}lYiQYdO-?{8t~vln>Dy}IN0vJ%Mz`K9Vpp~{CsxM}R>ve6)WTMe zdyw=72}4p^ca=vq`bVQPqK0&}aP+)!IY7x5M1&fW8eXh~-Mpd`{yuhKS35AY!(3s^GPa8I+om{b+{^A!HnDRz zNJpL9VvFhVb=y`1R2wP>13G7F7@vPKMY%7KR|jbH0ee%@GzGv9Oy2QR6>baP!N(+z ztg>$~7#C_8gd2ucgmFuRB<+4!O~OgiU&O(;s9xsQ17;kwmUzGWUeG~#&{lcN$$R(v zr}MYW&RaHa9OUSl(G$G*-uO>vk_8(jrSDy_dfcDWN|!iQOLt*pM`pUMv=YyAMWe2#BVu)C$m`D2gmtSIyGklk;{0QJq`G*S#1&YCR6mRmg9aTCQ-)%? z1mi#|x>HuX!)eub*JpS#2v4?83hTSp}mnoyhA-i-|f_@pXqIgb3JW00!RyrZi7 z&JzS;fP=1cBa8YOj)aHs3dgxPF8`j!NYV?IkS$Y<-!z$o*|NsSn0aFg zw2|XSkA}knic1^rgp(n{W8-7kIn_T?ZIV@H^rJf}sjy*R7U?*ppwGmE2^;UQN`msfjlksh#cMfDr zSdh0ix4U{`{_n86yZgh{%!jL?y?;ZuI9K<;W#-mHf!0H591$BDm|UXyvOUxM= z&Vlt9NS9lUr$0V$&UJ zj(GDKT`Hu8lCQvc9WH+8?xJcHbmmVI9*zP%dbIyuWE(l{K$+S6?j{tx^OQZ{Pn3aL zkzv=R=wq8DSEMs`zj!G(9thWc7m)^z5qr+BoEIR1)-cr6z_4XFELV<1fKZP2?kmvn zJHkRMn76D6*zj;;r-OhK&+(|F2jh}CPMZ9i<4ETYU1uP%`!vwFw9VzRO!WV~0J1>m zf*d7muPYoYhpgb$wF0#q*91PJr`<;T&ikt)a^pR^7)v=wXZ`kYDA>Ow!TTgZ{kK@) z798tx4+ng>W!+NU>{HDp=$DTXP~FTt$(jySY+VY~Z}p`tXk@5oS+P+hsd+Fy`|jpf z^Fln^^^p-^V!Gb;<-hFc^@Xp2hx21ElZF7vxr6q9yhhy~2s#7e&I9|~&*s^hF92;+ zH|Lv$3k38OZLU&Btlf-*?=BN}eq(v=D)|4IrdoJa#4~)w_x#R)y*S`wqV(P?jsOKk zd*tX`rT#)N@#6KLQ=gyL&nyp4nioQLNa`O50tDA)gMMqwJGbe#+|agdc4DQH8c$Qi z0s0HCw%oU`PJ>uY=ZDQH`M&!VP|b|_=Htou2YPn?eIxxZ^t;EAsAw(o-Sdztf@=s*7EZ7sjED>onP3BUgw8bZP^r&=?9>_;Jpq$sq80Ydo7 z;Bq%IVmAsdypdTkF@MG>?P*iq+(b&MP@v9ASU^0iYqcL~Xh7p}Gnyop2_YbUk)#hL zHyb2j$w1;pu@Gv!2Z_EBf5;49pwqx!F2u~HuxaTCiH}{TA!MjgoZ0CkVh;V&)# z5gsA8-IJ*g3g7l-E!H_~BpjcX5E4;rT0qfOc7R`|VRFbi*@92#=gqv{a+b;jP%IG* zHE-XzV$O^lAHD$ro`T>0;b0%! zFK=PpA9;=b=m1xXEV45CProkKo>hO>FP5Db|)<*366bVKTo zlJB1M@;~|4fV(Z8X%z8$jNRr1w6eIFkzGJVK*2B>Ei^yruN0g^37 zF`U-FY^A(ezPY{|G8MdiPBU(=0jQTfY_k5>DH?)l{F^{)>$;osWRR+m{^5DNFZ{5P zq5G8t355Dk{``P>Hb}JE>cVTLUwh3}BMEm!Y=82@OG^H0Ff|5nV05Lc%Y$J5L_1W| zo(B)u!f)&gE~=k=okBn{Qb;%2JmoL^uWGWoN&ZtD`iW)Ahdpa8-k=l%o-sKs%=Z&9~6K=+~L^{QpiQO z6J9&=H!+ds#eb~w?|Zq$f~R_t(qG25)tAf9-j2UG4I;=H__~uc-=FXIPiemyWpbU| zZG&B|Lxc~%zzF@Q{dB6@O7hP;aI-k+3Uj0VYEEw~_x;S@udXrnE{Ys8p3925k94+L z$~1*1j+=)+&;#zaUVB74TpYUG!$VD&->+{vWfqam$MgF)v%Fp{3z<0YsPAl;2ys98 z9`tX<7Lax{O(C#%Q|A2Z{ukC!SD&%AzwN8I5M{gRopL|Z8MGG<7EeMJtCHKUiqA)8 z3(?2Du}mjmWeVm|I@`FKbqoG7JmtOdWcRk_B%k0oj>Y*GQN5W2fVm?%hf}us0pdEm zjE7`+f?vfZ)hIZx*sy;T7ytteK4h)kfpU1Lyj-qmHRsG@R-T6uK&~Gg6)#1}qqbpC zCNDNsz>^+=AIX*;%f*aqDjDQ&umdq^z<1({PA~vih)RlN0kXm`;8557@@8bm; z+mZ{bgWAWcV*aq=cEf&4NE9%RFFTDe?Hhp#XngU5CF`JU7WtFm@)F*ZL`pS01R8Ca zA+pYnM(Ch`smak)yGnV&vGIVmFfB5c*erY(AKtx}m>0 z8~PHwZ!`E$Kt=_#5dB%)J$QS}Hedu5wNs3w%#&HnUlqC|pGZR?{_}4H1Mnt3c#9!u zrJhRRQSOgu^3@++?Rnq7RX^$Dr$!)%pvL8=cNdZOzHd&4v*6)z;L5V$zMdD;zWqaS zBROKDLT{O35>Ym+^XXVh@A@S+@>GwTXuM|{gpxFjI7SkR@6#6>O?qpT<|iN|q@=_n z97#h5kHlB$LO5usA`3|4*^5xw4@n=z4smk5l!%90Kj7fdA*3hzolCUn1C)9$MQ^c z2TH%*_}7fblQ<~)olg$?qNc0<+@`L)?-PEHOgQM!_8&sM455gW1jeb1r|ds8F?N5U zqTpvV>(rOY?zIo9+=j|^T)G-6@;QQIy^Se~LSk#lWjVuo3kp$q6gcp4MO&O0^FzXc zV#q%}0uAB>DgKTK;j;bC-&%JxEz-Nx{a%$nICKQ&+@;_G#+Ep>f<7UU03G@i+Wp?B zB!J;FqTZuk@|ERF2U@yvpl4n=Dc}Kzwi{(j#q$`WB1g=yW0mpP1uc=C!iOamg!8T| zn;aw|WZFhiNq)6k6myId;AE7E<_4S=|9lGkmxuPVd*OE&dDwBFS(+!tEd;BLWZ<|)eMx`TK-g6Z0!DGS0K99jBu&fr^cex zYk}g)A{~M^36*vd3%p1~cs3)LZ|(IM8MSV_&Gl;$tr7^=JrVv&;?^e=&a~mwTKs%b zR-kZ5`0$agiq|KAb1FT?Fr6<4u2WZ*Qvv6@a1~R^AJ9ohX^BwK^J9eB=bJPs(v?ZM z=?atUP#tz)-SC(k({!>_j2xe{;Y9kuwc*DCLbOv+jlXgl0}&Q(#>3jDY}_@#99!Q%qA7sApV5z4d_A_lrdtXtU( z)emZn3z%X6S@2JSFkbc=^jeI1xK?a2;YRg+8K+_w`5osE5QT*1Sv{LZur)iGsK`QiMbH862O)Gexg<1B)rmlX&y_c zdi7+siJ&NM?ia`xud{AcVr(W9C|o~9jFQIOQjIu(@+_bOa7WMd|+s6|nsn!q>M$KrA{UFxM#;ZwV zZ37Z_a+40B6_3&BLvyBtAhaZOQ^{icVX0#H&a^5N&Zzp=T!tFGMFh~Wdr!Dj=BksY z@ysNY^PlJr{}6Y6z$g^)E~+9Gq9UNxRC&;$BVd#ODQbKS%OVU%ka7ozW~)6jW*mY$ zYHOl%HkMyo;45ob!*JWKKJ?~S>yEy8ejWMI@yV@Y2e5bDe|hERlTY5mp+n#%pvu@F z(4@XyS$g^ccKmPWRs9-zCT^D@jI|?Jc zn+kC?f?eS)M&={6#5+9)B&qs87JjB+QB=>wN{y%s{;&!nqYR{}J8q=klzj+C<;~Z; z62(8E2m`Vy$BVKn-&Zs!i06*6h|x@D=SLfd`o|(N)k;c8lsRcv0vP zaYzKdNrjT7QzsoEEf^GAVm;!;0jEK?(*ihE#yeRM8$WVILj5sZ$5I%T?>?5L z@cgMGBy(rbh2-LTT0Qak$R67b`u_Dm;_%FZc5`BdG%ciPard{g+<{MgS?K6TTGEto z<|g5I6V<5fih7@TN@=+5q@tDL8$m4n=11uv+gCGzSDL;_MRr958+42|D56jBa79*W z2#`(^d2+1goNU?!MTJQk#NcBAba>W4e(W7taVET^^mHAhW8>}#eT#Z1U_NE(23tXR zKV}p}NL*XSuFBMw1JY84LC8IbJ1C-I6)0r!n+Ids%q_U^=tSOVhXqW!+m$|QDdANG{`U|W!AXr?U z>TvC~;@F=39XDmsr?kJG3@{v}tMX|l#@EMs`dz8fNrb^U?TFMD^G(2gh$*e}^LzQ-*-W(E28k(z&<9q30HNnq@{{z0~6aEUrOS};xlbrbK%j<2A7mHVS5R_ir{xYU$R*O#r z=Wk8-D=p7b!rg96ZXkJePbe@O6Nz4K?wZ+}UMoxxPdV+#v!&DkHgr#)6SBXPt~ zQH#q%y4!6h_>gV<>locxgfnXWJc<22V-C7`(SF;M&r`jov!qV+y+Y6qd*0_S7|Bgm zU6C#~0!DUA0xh^ww`qC;_*BIfP&}wO}pxAsmJO_nXEKEhgwpK z1kvzkUsNr`Ej4MwN477HN%H+>*Rpgdit9LN0A)~0A!w_v))5=>cRjGIfA^nT;%lR$L2d?e7Q;xp&+EdY4yNP4T1!0jZzb} zxx|a|aAbE;QyHL89zs$6l$drmqdx??bbpmzy^^_eObPR0>0SyJV6n-mGiTe83t*dl z_8t^{6t%t2CtqjKt>p40U}DtuZ!g>tZ9b91Vl%X7IWB*SVM!;}wTyQU1d@KnnSXv6 zJWl+9(oBhj@zWL#OMS+|S2CJXBXP~GKSz2wgAQZd`C>1HXXwm+l1R|ye;u&l7!PC> zK|U