From 30ce1d60971d3239944332dcfdb31198cef5e767 Mon Sep 17 00:00:00 2001 From: Abishek <52214183+r-abishek@users.noreply.github.com> Date: Wed, 8 May 2024 16:41:21 -0700 Subject: [PATCH] RPP Tensor Audio Support - MelFilterBank (#332) * Initial commit - Non slient region detection Includes unittest setup * Initial commit - To Decibels Includes unittest setup * Intial commit - pre_emphasis_filter * Intial commit - down_mixing * Intial commit - slice_audio * Intial commit - mel_filter_bank * Replace vectors with arrays * Cleanup * Minor cleanup * Optimize downmixing Kernel Includes cleanup * Remove unused variables in header file * Add axes parameter * Replace Rpp64s with Rpp32s * Replace vectors with arrays Includes optimization * Cleanup * Optimize and precompute cutOff * Fix buffer used * Fix buffer used * Additional Cleanup * Fix buffer allocation Includes minor optimization * Optimize post incrmeent operation * Optimize post increment operation * Optimize post increment operation * Update testsuite for Audio * code cleanup * Add Readme file for Audio test suite * changes based on review comments * minor change * Remove unittest folders and updated README.md * Remove unit tests * minor change * code cleanup * added common header file for audio helper functions * removed unncessary audio wav files fixed bug in ROI updation for audio test suite resolved issue in summary generation for performance tests in python * removed log file * added doxygen support for audio * added doxygen changes for to_decibels * updated test suite support for to_decibels * minor change * added doxygen changes for preemphasis filter * updated changes for preemphasis filter in test suite * removed the usage of getMax function and used std::max_element * modularized code in test suite * merge with latest changes * minor change * minor change * minor change * resolved codacy warnings * Codacy fix - Remove unused cpuTime * CMakeLists - Version Update 1.5.0 - TOT Version * CHANGELOG Updates Version 1.5.0 placeholder * resolved issue with file_system dependency in test suite * Doxygen changes changed malloc to new in NSR kernel * RPP RICAP Tensor for HOST and HIP (#213) * Initial commit - Ricap HOST Tensor Includes testsuite changes * Add QA tests for RICAP Used three_images_224x224_src1 folder to create golden outputs * Add three_images_224x224_src1 into TEST_IMAGES * Support HIP Backend for RICAP * Fix HIP pkd3->pkd3 variant * regenerated golden outputs for RICAP minor changes in HOST shell script for handling RICAP in QA mode * minor bug fix in RICAP HIP kernels * Improve readability and Cleanup * Additional cleanup * Cleanup testsuite Includes new golden outputs * Additional testuite fixes * Minor cleanup * Fix codacy warnings * Address other codacy warnings * Update ricap.hpp with reference paper * Add RICAP dataset path in readme * Make changes to error codes returned * Modify roi crop region for unit and perf tests * RPP Tensor Water Augmentation on HOST and HIP (#181) * added water HOST and HIP codes * added water case in test suite * added golden outputs for water * added omp thread changes for water augmentation * experimental changes * fixed output issue with AVX2 instructions * added AVX2 support for PKD3 load function minor changes in PLN variant load functions * nwc commit - added avx2 changes for u8 layout toggle variants but need to add store functions for completion * Add Avx2 implementation for F32 and U8 toggle variants * Add AVX2 support for u8 pkd3-pln3 and i8 pkd3-pln3 for water augmentation * change F32 load and store logic * optimized the store function for F32 PLN3-PKD3 * reverted back irrelevant changes * minor change * optimized load and store functions for water U8 and F32 variants in host removed commented code * removed golden outputs for water * minor changes * renamed few functions and removed unused functions updated i8 pln1 load as per the optimized u8 pln1 load * fixed bug in i8 load function * changed cast to c++ style resolved spacing issues and added comments for AVX codes for better understanding made changes to handle cases where QA Tests are not supported * added golden outputs for water * updated golden outputs with latest changes * modified the u8, i8 pkd3-pln3 function and added comments for the vectorized code * fixed minor bug in I8 variants * made to changes to resolve codacy warnings * changed cast to c++ style in hip kernel * changed generic nn F32 loads using gather and setr instructions * added comments for latest changes * minor change * added definition for storing 32 and 64 bits from a 128bit register --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM * Fix build error * CMakeLists - Version Update 1.5.0 - TOT Version * CHANGELOG Updates Version 1.5.0 placeholder * Boost deps fix for test suite --------- Co-authored-by: Snehaa Giridharan Co-authored-by: sampath1117 Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> Co-authored-by: HazarathKumarM Co-authored-by: Kiriti Gowda * Documentation - Readme & changelog updates (#251) * readme and changelog updates for 6.0 * minor update * added ctests for audio test suite for CI made changes to add more clarity on the QA Tests results * Cmake mods for ctest * HOST-only build error bugfix * added qa mode paramter to python audio script added golden output map for QA testing of Non silent region detection * minor change * Documentation - Bump rocm-docs-core[api_reference] from 0.26.0 to 0.27.0 in /docs/sphinx (#253) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.26.0 to 0.27.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/RadeonOpenCompute/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.26.0...v0.27.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * RPP Resize Mirror Normalize Bugfix (#252) * added fix for hipMemset * remove pixel check for U8-F32 and U8-F16 for HOST codes --------- Co-authored-by: sampath1117 * added example for MMS calculation in comments for better understanding * Sphinx - updates (#257) * Sphinx - updates * Doxygen - Updates * Docs - Remove index.md * updated info used to for running audio test suite * removed bitdepth variable from audio test suite * added more information on computing NSR outputs in the example added * Fix doxygen for decibels Also removes extra QA reference files * move tensor_host_audio.cpp to host folder * Fix build errors and qa tests in Audio Test suite * Fix build errors and qa tests in Audio Test suite * Add reference output and test samples for downmix * Add down_mix in augmentation list and supported cases * move Tensor_host_audio.cpp to host folder * fix qa mismatches * move Tensor_host_audio.cpp to host folder * fix qa mismatches * Remove auto-merge repeated funcs * Improve clarity of header docs * Remove blank line * Improve clarity on header docs * Add Doxygen comments * Add Doxygen comments * Add Doxygen comments * minor change * converted golden outputs to binary file for downmixing * removed old golden output file for preemphasis and todecibels * modified info for downmixing as per new changes used handle memory for temporary buffers * formatting changes * Initial commit - Spectrogram * Add QA .bin reference file * License - updates to 2024 and consistency changes (#298) * Match all CMakeLists.txt license as per RPP's outermost LICENSE file * Match all python files' license as per RPP's outermost LICENSE file * Match all .hpp files' license as per RPP's outermost LICENSE file * Match all .cpp files' license as per RPP's outermost LICENSE file * Match all .h files' license as per RPP's outermost LICENSE file * Remove all rights reserved as per LICENSE file * Remove double space in "Copyright (c) 2019 - 2023 Advanced Micro Devices, Inc." * Match all .cmake files' license as per RPP's outermost LICENSE file * Match all .cpp.in files' license as per RPP's outermost LICENSE file * Replace 283 occurrences in 282 files - 2023 to 2024 * Add "MIT License" title to 281 instances * Add missing license * Test - Update README.md for test_suite (#299) * Address internal review comments * Modify cmakelist * Fix QA mismatch * Bump rocm-docs-core[api_reference] from 0.33.0 to 0.33.1 in /docs/sphinx (#301) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.33.0 to 0.33.1. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.33.0...v0.33.1) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump rocm-docs-core[api_reference] from 0.33.1 to 0.33.2 in /docs/sphinx (#302) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.33.1 to 0.33.2. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.33.1...v0.33.2) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Update doc codeowners (#303) * Documentation - Bump rocm-docs-core[api_reference] from 0.33.2 to 0.34.0 in /docs/sphinx (#304) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.33.2 to 0.34.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.33.2...v0.34.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Test suite - upgrade 5 qa perf (#305) * experimental changes for adding qa mode for performance tests * made changes to add display more information w.r.t QA results summary for performance tests * minor changes * Add changes to dump qa results to excel file * Add performance QA for three new tensor functions * update prerequisites in readme * added changes to handle unsupported cases * removed treshold dictionary and added performance Noise treshold add new dataset for performance QA * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * Changes to the performane summary dataframe * minor changes * Update CMakeLists.txt to add ${CMAKE_CURRENT_SOURCE_DIR} for CI * Update CMakeLists.txt fix * Update CMakeLists.txt fix * remove tabulate dependency * Update README.md to remove tabulate pip install * Fix for CI machine failure * Add note on performance --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM Co-authored-by: Abishek <52214183+r-abishek@users.noreply.github.com> Co-authored-by: Snehaa Giridharan Co-authored-by: r-abishek * RPP Color Temperature on HOST and HIP (#271) * Initial commit - Color Temperature HOST Tensor * Initial commit - Color Temperature HIP Tensor * Add color temperature golden outputs * address review comments * Use reinterpret_cast instead of static_cast * Combine templated functions to support all datatypes into one (got minor perf difference of order 3%) Also fixes indentation * Fix i8 datatype * Cleanup * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * Fix PLN3 variant outputs Also modifies reference outputs * Update color_temperature.hpp license * Delete color_temperature_u8_Tensor_PKD3.csv * Delete color_temperature_u8_Tensor_PLN3.csv --------- Co-authored-by: snehaa8 Co-authored-by: HazarathKumarM Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> * RPP Voxel 3D Tensor Add/Subtract scalar on HOST and HIP (#272) * added HOST support for voxel add kernel * added HIP support for voxel add kernel * added test suite support for add scalar * added Doxygen support and modified hip kernel function names as per new standard * added HOST support for voxel subtract kernel * added HIP support for voxel subtract kernel * added test suite support * updated the golden outputs for subtract with correct values * removed unnessary validation checks * Remove double spaces * Fix header * Fix all retval docs * Fix docs to add memory type * Fix comment * Add divider comment * Use post-increment efficiently * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * converted add and subtract scalar golden outputs to bin files * changed copyright from 2023 to 2024 * Update add_scalar.hpp license * Update subtract_scalar.hpp license --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM * RPP Magnitude on HOST and HIP (#278) * Initial commit - Magnitude HOST Tensor * Add QA reference outputs * Update runTests.py * Initial commit - Magnitude HIP Tensor * Add dual input support in testsuite * Optimize HOST kernel further * Optimize i8 datatype further * Modify comments * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * Bump rocm-docs-core[api_reference] from 0.31.0 to 0.33.0 in /docs/sphinx (#294) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.31.0 to 0.33.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.31.0...v0.33.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Update Copywright year * Combine templated functions to support all datatypes * Modify format of reference outputs * Update rppi_arithmetic_operations.h license * Update rppt_tensor_arithmetic_operations.h license * Update host_tensor_arithmetic_operations.hpp * Update magnitude.hpp license * Update hip_tensor_arithmetic_operations.hpp license * Delete magnitude_u8_Tensor_PKD3.csv * Delete magnitude_u8_Tensor_PLN1.csv * Delete magnitude_u8_Tensor_PLN3.csv * Update rpp_test_suite_common.h license * Update runTests.py license * Update Tensor_hip.cpp license * Update runTests.py license * Update Tensor_host.cpp license --------- Signed-off-by: dependabot[bot] Co-authored-by: Snehaa Giridharan Co-authored-by: HazarathKumarM Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> * Bump rocm-docs-core[api_reference] from 0.34.0 to 0.34.2 in /docs/sphinx (#309) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.34.0 to 0.34.2. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.34.0...v0.34.2) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * RPP Tensor Audio Support - Down Mixing (#296) * Initial commit - Non slient region detection Includes unittest setup * Initial commit - To Decibels Includes unittest setup * Intial commit - pre_emphasis_filter * Intial commit - down_mixing * Replace vectors with arrays * Cleanup * Minor cleanup * Optimize downmixing Kernel Includes cleanup * Replace Rpp64s with Rpp32s * Cleanup * Optimize and precompute cutOff * Fix buffer used * Fix buffer used * Additional Cleanup * Optimize post incrmeent operation * Optimize post increment operation * Update testsuite for Audio * code cleanup * Add Readme file for Audio test suite * changes based on review comments * minor change * Remove unittest folders and updated README.md * Remove unit tests * minor change * code cleanup * added common header file for audio helper functions * removed unncessary audio wav files fixed bug in ROI updation for audio test suite resolved issue in summary generation for performance tests in python * removed log file * added doxygen support for audio * added doxygen changes for to_decibels * updated test suite support for to_decibels * minor change * added doxygen changes for preemphasis filter * updated changes for preemphasis filter in test suite * removed the usage of getMax function and used std::max_element * modularized code in test suite * merge with latest changes * minor change * minor change * minor change * resolved codacy warnings * Codacy fix - Remove unused cpuTime * CMakeLists - Version Update 1.5.0 - TOT Version * CHANGELOG Updates Version 1.5.0 placeholder * resolved issue with file_system dependency in test suite * Doxygen changes changed malloc to new in NSR kernel * RPP RICAP Tensor for HOST and HIP (#213) * Initial commit - Ricap HOST Tensor Includes testsuite changes * Add QA tests for RICAP Used three_images_224x224_src1 folder to create golden outputs * Add three_images_224x224_src1 into TEST_IMAGES * Support HIP Backend for RICAP * Fix HIP pkd3->pkd3 variant * regenerated golden outputs for RICAP minor changes in HOST shell script for handling RICAP in QA mode * minor bug fix in RICAP HIP kernels * Improve readability and Cleanup * Additional cleanup * Cleanup testsuite Includes new golden outputs * Additional testuite fixes * Minor cleanup * Fix codacy warnings * Address other codacy warnings * Update ricap.hpp with reference paper * Add RICAP dataset path in readme * Make changes to error codes returned * Modify roi crop region for unit and perf tests * RPP Tensor Water Augmentation on HOST and HIP (#181) * added water HOST and HIP codes * added water case in test suite * added golden outputs for water * added omp thread changes for water augmentation * experimental changes * fixed output issue with AVX2 instructions * added AVX2 support for PKD3 load function minor changes in PLN variant load functions * nwc commit - added avx2 changes for u8 layout toggle variants but need to add store functions for completion * Add Avx2 implementation for F32 and U8 toggle variants * Add AVX2 support for u8 pkd3-pln3 and i8 pkd3-pln3 for water augmentation * change F32 load and store logic * optimized the store function for F32 PLN3-PKD3 * reverted back irrelevant changes * minor change * optimized load and store functions for water U8 and F32 variants in host removed commented code * removed golden outputs for water * minor changes * renamed few functions and removed unused functions updated i8 pln1 load as per the optimized u8 pln1 load * fixed bug in i8 load function * changed cast to c++ style resolved spacing issues and added comments for AVX codes for better understanding made changes to handle cases where QA Tests are not supported * added golden outputs for water * updated golden outputs with latest changes * modified the u8, i8 pkd3-pln3 function and added comments for the vectorized code * fixed minor bug in I8 variants * made to changes to resolve codacy warnings * changed cast to c++ style in hip kernel * changed generic nn F32 loads using gather and setr instructions * added comments for latest changes * minor change * added definition for storing 32 and 64 bits from a 128bit register --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM * Fix build error * CMakeLists - Version Update 1.5.0 - TOT Version * CHANGELOG Updates Version 1.5.0 placeholder * Boost deps fix for test suite --------- Co-authored-by: Snehaa Giridharan Co-authored-by: sampath1117 Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> Co-authored-by: HazarathKumarM Co-authored-by: Kiriti Gowda * Documentation - Readme & changelog updates (#251) * readme and changelog updates for 6.0 * minor update * added ctests for audio test suite for CI made changes to add more clarity on the QA Tests results * Cmake mods for ctest * HOST-only build error bugfix * added qa mode paramter to python audio script added golden output map for QA testing of Non silent region detection * minor change * Documentation - Bump rocm-docs-core[api_reference] from 0.26.0 to 0.27.0 in /docs/sphinx (#253) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.26.0 to 0.27.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/RadeonOpenCompute/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.26.0...v0.27.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * RPP Resize Mirror Normalize Bugfix (#252) * added fix for hipMemset * remove pixel check for U8-F32 and U8-F16 for HOST codes --------- Co-authored-by: sampath1117 * added example for MMS calculation in comments for better understanding * Sphinx - updates (#257) * Sphinx - updates * Doxygen - Updates * Docs - Remove index.md * updated info used to for running audio test suite * removed bitdepth variable from audio test suite * added more information on computing NSR outputs in the example added * Fix doxygen for decibels Also removes extra QA reference files * move tensor_host_audio.cpp to host folder * Fix build errors and qa tests in Audio Test suite * Fix build errors and qa tests in Audio Test suite * Add reference output and test samples for downmix * Add down_mix in augmentation list and supported cases * Remove auto-merge repeated funcs * Improve clarity of header docs * Remove blank line * Improve clarity on header docs * Add Doxygen comments * minor change * converted golden outputs to binary file for downmixing * removed old golden output file for preemphasis and todecibels * modified info for downmixing as per new changes used handle memory for temporary buffers * formatting changes * moved the common code for SSE and AVX to outside * Update down_mixing.hpp license * Update rppt_tensor_audio_augmentations.h * combined the srcLength and channels tensors into single tensor --------- Signed-off-by: dependabot[bot] Co-authored-by: Snehaa Giridharan Co-authored-by: HazarathKumarM Co-authored-by: sampath1117 Co-authored-by: Kiriti Gowda Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> Co-authored-by: Lisa Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Sundarrajan98 * RPP Voxel 3D Tensor Multiply scalar on HOST and HIP (#306) * added HIP support for voxel scalar multiply kernel * added HOST support for voxel multiply kernel added golden outputs for voxel multiply kernel * merge with master * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * converted multiply scalar voxel golden outputs to bin files * changed copyright from 2023 to 2024 --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM * Test Suite Bugfix (#307) * experimental changes for adding qa mode for performance tests * made changes to add display more information w.r.t QA results summary for performance tests * minor changes * Add changes to dump qa results to excel file * Add performance QA for three new tensor functions * update prerequisites in readme * added changes to handle unsupported cases * removed treshold dictionary and added performance Noise treshold add new dataset for performance QA * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * Changes to the performane summary dataframe * minor changes * Update CMakeLists.txt to add ${CMAKE_CURRENT_SOURCE_DIR} for CI * Update CMakeLists.txt fix * Update CMakeLists.txt fix * remove tabulate dependency * Update README.md to remove tabulate pip install * Fix for CI machine failure * Add note on performance * Fix segmentation fault * Revert QAmode to restrict HIP bitdepths * Use Rpp64u for HOST while comparing outputs * Fix ambiguous abs call * Fix for SLES CI HIP fail - error: incompatible pointer types assigning to 'unsigned long *' from 'unsigned long long *' - refOutput = TensorSumReferenceOutputs[numChannels].data(); --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM Co-authored-by: Snehaa Giridharan Co-authored-by: Pavel Tcherniaev * Fix build errors on OCL backend * Fix spectrogram Removes slice kernel * Cleanup Modify reference outputs * Merge remote-tracking branch 'origin' into sn/audio_spectrogram_master_merge * Fix build error in tensor testsuite * Bump rocm-docs-core[api_reference] from 0.35.0 to 0.35.1 in /docs/sphinx (#319) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.35.0 to 0.35.1. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.35.0...v0.35.1) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump rocm-docs-core[api_reference] from 0.35.1 to 0.36.0 in /docs/sphinx (#322) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.35.1 to 0.36.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.35.1...v0.36.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Docs - Bump rocm-docs-core[api_reference] from 0.36.0 to 0.37.0 in /docs/sphinx (#328) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.36.0 to 0.37.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.36.0...v0.37.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Link cleanup (#326) * link updates * update tables * pare down index * API cleanup * consistency * verbiage * Change to camelCase for variable naming Also includes cleanup * Cleanup testsuite for MFB * Update notes * Address review comments * Revert change in runTests.py * Modified codes to use handle memory Also fixes reference output file * Docs - Bump rocm-docs-core[api_reference] from 0.37.0 to 0.37.1 in /docs/sphinx (#329) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.37.0 to 0.37.1. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.37.0...v0.37.1) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * RPP Voxel Flip on HIP and HOST (#285) * added support for flip voxel * added test suite support * added golden outputs for flip voxel made changes in test suite to run QA tests for flip * updated golden outputs with correct values * minor bug fix in the hip test suite * made changes to variable names for better readability fixed comments in test suite minor cleanup * combined the flip axis factor as ternary operator in HIP kernel added new enum for error handling when source and destination layouts are not matching * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * converted flip voxel golden outputs to bin files * changed copyright from 2023 to 2024 * Update flip_voxel.hpp license * License - updates to 2024 and consistency changes (#298) * Match all CMakeLists.txt license as per RPP's outermost LICENSE file * Match all python files' license as per RPP's outermost LICENSE file * Match all .hpp files' license as per RPP's outermost LICENSE file * Match all .cpp files' license as per RPP's outermost LICENSE file * Match all .h files' license as per RPP's outermost LICENSE file * Remove all rights reserved as per LICENSE file * Remove double space in "Copyright (c) 2019 - 2023 Advanced Micro Devices, Inc." * Match all .cmake files' license as per RPP's outermost LICENSE file * Match all .cpp.in files' license as per RPP's outermost LICENSE file * Replace 283 occurrences in 282 files - 2023 to 2024 * Add "MIT License" title to 281 instances * Add missing license * Test - Update README.md for test_suite (#299) * Bump rocm-docs-core[api_reference] from 0.33.0 to 0.33.1 in /docs/sphinx (#301) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.33.0 to 0.33.1. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.33.0...v0.33.1) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump rocm-docs-core[api_reference] from 0.33.1 to 0.33.2 in /docs/sphinx (#302) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.33.1 to 0.33.2. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.33.1...v0.33.2) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Update doc codeowners (#303) * Documentation - Bump rocm-docs-core[api_reference] from 0.33.2 to 0.34.0 in /docs/sphinx (#304) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.33.2 to 0.34.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.33.2...v0.34.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Test suite - upgrade 5 qa perf (#305) * experimental changes for adding qa mode for performance tests * made changes to add display more information w.r.t QA results summary for performance tests * minor changes * Add changes to dump qa results to excel file * Add performance QA for three new tensor functions * update prerequisites in readme * added changes to handle unsupported cases * removed treshold dictionary and added performance Noise treshold add new dataset for performance QA * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * Changes to the performane summary dataframe * minor changes * Update CMakeLists.txt to add ${CMAKE_CURRENT_SOURCE_DIR} for CI * Update CMakeLists.txt fix * Update CMakeLists.txt fix * remove tabulate dependency * Update README.md to remove tabulate pip install * Fix for CI machine failure * Add note on performance --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM Co-authored-by: Abishek <52214183+r-abishek@users.noreply.github.com> Co-authored-by: Snehaa Giridharan Co-authored-by: r-abishek * RPP Color Temperature on HOST and HIP (#271) * Initial commit - Color Temperature HOST Tensor * Initial commit - Color Temperature HIP Tensor * Add color temperature golden outputs * address review comments * Use reinterpret_cast instead of static_cast * Combine templated functions to support all datatypes into one (got minor perf difference of order 3%) Also fixes indentation * Fix i8 datatype * Cleanup * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * Fix PLN3 variant outputs Also modifies reference outputs * Update color_temperature.hpp license * Delete color_temperature_u8_Tensor_PKD3.csv * Delete color_temperature_u8_Tensor_PLN3.csv --------- Co-authored-by: snehaa8 Co-authored-by: HazarathKumarM Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> * RPP Voxel 3D Tensor Add/Subtract scalar on HOST and HIP (#272) * added HOST support for voxel add kernel * added HIP support for voxel add kernel * added test suite support for add scalar * added Doxygen support and modified hip kernel function names as per new standard * added HOST support for voxel subtract kernel * added HIP support for voxel subtract kernel * added test suite support * updated the golden outputs for subtract with correct values * removed unnessary validation checks * Remove double spaces * Fix header * Fix all retval docs * Fix docs to add memory type * Fix comment * Add divider comment * Use post-increment efficiently * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * converted add and subtract scalar golden outputs to bin files * changed copyright from 2023 to 2024 * Update add_scalar.hpp license * Update subtract_scalar.hpp license --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM * RPP Magnitude on HOST and HIP (#278) * Initial commit - Magnitude HOST Tensor * Add QA reference outputs * Update runTests.py * Initial commit - Magnitude HIP Tensor * Add dual input support in testsuite * Optimize HOST kernel further * Optimize i8 datatype further * Modify comments * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * Bump rocm-docs-core[api_reference] from 0.31.0 to 0.33.0 in /docs/sphinx (#294) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.31.0 to 0.33.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.31.0...v0.33.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Update Copywright year * Combine templated functions to support all datatypes * Modify format of reference outputs * Update rppi_arithmetic_operations.h license * Update rppt_tensor_arithmetic_operations.h license * Update host_tensor_arithmetic_operations.hpp * Update magnitude.hpp license * Update hip_tensor_arithmetic_operations.hpp license * Delete magnitude_u8_Tensor_PKD3.csv * Delete magnitude_u8_Tensor_PLN1.csv * Delete magnitude_u8_Tensor_PLN3.csv * Update rpp_test_suite_common.h license * Update runTests.py license * Update Tensor_hip.cpp license * Update runTests.py license * Update Tensor_host.cpp license --------- Signed-off-by: dependabot[bot] Co-authored-by: Snehaa Giridharan Co-authored-by: HazarathKumarM Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> * Bump rocm-docs-core[api_reference] from 0.34.0 to 0.34.2 in /docs/sphinx (#309) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.34.0 to 0.34.2. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.34.0...v0.34.2) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * RPP Tensor Audio Support - Down Mixing (#296) * Initial commit - Non slient region detection Includes unittest setup * Initial commit - To Decibels Includes unittest setup * Intial commit - pre_emphasis_filter * Intial commit - down_mixing * Replace vectors with arrays * Cleanup * Minor cleanup * Optimize downmixing Kernel Includes cleanup * Replace Rpp64s with Rpp32s * Cleanup * Optimize and precompute cutOff * Fix buffer used * Fix buffer used * Additional Cleanup * Optimize post incrmeent operation * Optimize post increment operation * Update testsuite for Audio * code cleanup * Add Readme file for Audio test suite * changes based on review comments * minor change * Remove unittest folders and updated README.md * Remove unit tests * minor change * code cleanup * added common header file for audio helper functions * removed unncessary audio wav files fixed bug in ROI updation for audio test suite resolved issue in summary generation for performance tests in python * removed log file * added doxygen support for audio * added doxygen changes for to_decibels * updated test suite support for to_decibels * minor change * added doxygen changes for preemphasis filter * updated changes for preemphasis filter in test suite * removed the usage of getMax function and used std::max_element * modularized code in test suite * merge with latest changes * minor change * minor change * minor change * resolved codacy warnings * Codacy fix - Remove unused cpuTime * CMakeLists - Version Update 1.5.0 - TOT Version * CHANGELOG Updates Version 1.5.0 placeholder * resolved issue with file_system dependency in test suite * Doxygen changes changed malloc to new in NSR kernel * RPP RICAP Tensor for HOST and HIP (#213) * Initial commit - Ricap HOST Tensor Includes testsuite changes * Add QA tests for RICAP Used three_images_224x224_src1 folder to create golden outputs * Add three_images_224x224_src1 into TEST_IMAGES * Support HIP Backend for RICAP * Fix HIP pkd3->pkd3 variant * regenerated golden outputs for RICAP minor changes in HOST shell script for handling RICAP in QA mode * minor bug fix in RICAP HIP kernels * Improve readability and Cleanup * Additional cleanup * Cleanup testsuite Includes new golden outputs * Additional testuite fixes * Minor cleanup * Fix codacy warnings * Address other codacy warnings * Update ricap.hpp with reference paper * Add RICAP dataset path in readme * Make changes to error codes returned * Modify roi crop region for unit and perf tests * RPP Tensor Water Augmentation on HOST and HIP (#181) * added water HOST and HIP codes * added water case in test suite * added golden outputs for water * added omp thread changes for water augmentation * experimental changes * fixed output issue with AVX2 instructions * added AVX2 support for PKD3 load function minor changes in PLN variant load functions * nwc commit - added avx2 changes for u8 layout toggle variants but need to add store functions for completion * Add Avx2 implementation for F32 and U8 toggle variants * Add AVX2 support for u8 pkd3-pln3 and i8 pkd3-pln3 for water augmentation * change F32 load and store logic * optimized the store function for F32 PLN3-PKD3 * reverted back irrelevant changes * minor change * optimized load and store functions for water U8 and F32 variants in host removed commented code * removed golden outputs for water * minor changes * renamed few functions and removed unused functions updated i8 pln1 load as per the optimized u8 pln1 load * fixed bug in i8 load function * changed cast to c++ style resolved spacing issues and added comments for AVX codes for better understanding made changes to handle cases where QA Tests are not supported * added golden outputs for water * updated golden outputs with latest changes * modified the u8, i8 pkd3-pln3 function and added comments for the vectorized code * fixed minor bug in I8 variants * made to changes to resolve codacy warnings * changed cast to c++ style in hip kernel * changed generic nn F32 loads using gather and setr instructions * added comments for latest changes * minor change * added definition for storing 32 and 64 bits from a 128bit register --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM * Fix build error * CMakeLists - Version Update 1.5.0 - TOT Version * CHANGELOG Updates Version 1.5.0 placeholder * Boost deps fix for test suite --------- Co-authored-by: Snehaa Giridharan Co-authored-by: sampath1117 Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> Co-authored-by: HazarathKumarM Co-authored-by: Kiriti Gowda * Documentation - Readme & changelog updates (#251) * readme and changelog updates for 6.0 * minor update * added ctests for audio test suite for CI made changes to add more clarity on the QA Tests results * Cmake mods for ctest * HOST-only build error bugfix * added qa mode paramter to python audio script added golden output map for QA testing of Non silent region detection * minor change * Documentation - Bump rocm-docs-core[api_reference] from 0.26.0 to 0.27.0 in /docs/sphinx (#253) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.26.0 to 0.27.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/RadeonOpenCompute/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.26.0...v0.27.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * RPP Resize Mirror Normalize Bugfix (#252) * added fix for hipMemset * remove pixel check for U8-F32 and U8-F16 for HOST codes --------- Co-authored-by: sampath1117 * added example for MMS calculation in comments for better understanding * Sphinx - updates (#257) * Sphinx - updates * Doxygen - Updates * Docs - Remove index.md * updated info used to for running audio test suite * removed bitdepth variable from audio test suite * added more information on computing NSR outputs in the example added * Fix doxygen for decibels Also removes extra QA reference files * move tensor_host_audio.cpp to host folder * Fix build errors and qa tests in Audio Test suite * Fix build errors and qa tests in Audio Test suite * Add reference output and test samples for downmix * Add down_mix in augmentation list and supported cases * Remove auto-merge repeated funcs * Improve clarity of header docs * Remove blank line * Improve clarity on header docs * Add Doxygen comments * minor change * converted golden outputs to binary file for downmixing * removed old golden output file for preemphasis and todecibels * modified info for downmixing as per new changes used handle memory for temporary buffers * formatting changes * moved the common code for SSE and AVX to outside * Update down_mixing.hpp license * Update rppt_tensor_audio_augmentations.h * combined the srcLength and channels tensors into single tensor --------- Signed-off-by: dependabot[bot] Co-authored-by: Snehaa Giridharan Co-authored-by: HazarathKumarM Co-authored-by: sampath1117 Co-authored-by: Kiriti Gowda Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> Co-authored-by: Lisa Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Sundarrajan98 * RPP Voxel 3D Tensor Multiply scalar on HOST and HIP (#306) * added HIP support for voxel scalar multiply kernel * added HOST support for voxel multiply kernel added golden outputs for voxel multiply kernel * merge with master * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * converted multiply scalar voxel golden outputs to bin files * changed copyright from 2023 to 2024 --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM * Test Suite Bugfix (#307) * experimental changes for adding qa mode for performance tests * made changes to add display more information w.r.t QA results summary for performance tests * minor changes * Add changes to dump qa results to excel file * Add performance QA for three new tensor functions * update prerequisites in readme * added changes to handle unsupported cases * removed treshold dictionary and added performance Noise treshold add new dataset for performance QA * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * Changes to the performane summary dataframe * minor changes * Update CMakeLists.txt to add ${CMAKE_CURRENT_SOURCE_DIR} for CI * Update CMakeLists.txt fix * Update CMakeLists.txt fix * remove tabulate dependency * Update README.md to remove tabulate pip install * Fix for CI machine failure * Add note on performance * Fix segmentation fault * Revert QAmode to restrict HIP bitdepths * Use Rpp64u for HOST while comparing outputs * Fix ambiguous abs call * Fix for SLES CI HIP fail - error: incompatible pointer types assigning to 'unsigned long *' from 'unsigned long long *' - refOutput = TensorSumReferenceOutputs[numChannels].data(); --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM Co-authored-by: Snehaa Giridharan Co-authored-by: Pavel Tcherniaev * Bump rocm-docs-core[api_reference] from 0.34.2 to 0.35.0 in /docs/sphinx (#313) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.34.2 to 0.35.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.34.2...v0.35.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * RPP Reduction - Tensor min and Tensor max on HOST and HIP (#260) * Minor Change * Add Validation check for DST_FOLDER path * added water HOST and HIP codes * added water case in test suite * added golden outputs for water * Add Validation checks for all options in testAllScript.sh * Add sanity check for dual Input cases Set Max Dimension and Max Image Dump Replaced Fast DCT tag with Accurate DCT * Regenerate golden outputs using accurate dct Flag Add golden outputs for some new augmentations * Fix Flip golden outputs mismatch Fix PLN3 variants mismatch in QA mode * Add MAX_BATCH_SIZE check removed Augmentations function calls for failing Qa modes code cleanup * Add crop and gamma correction augmentations code cleanup * Add comments to functions in rpp_test_suite_common.h * minor change * code cleanup * minor code changes * Change roi and Image sizes for crop augmentation * Change numIterations option to numRuns Addressed PR comments * added omp thread changes for water augmentation * experimental changes * fixed output issue with AVX2 instructions * added AVX2 support for PKD3 load function minor changes in PLN variant load functions * Add turboJpeg header to update maxHeight and maxWidth values * nwc commit - added avx2 changes for u8 layout toggle variants but need to add store functions for completion * Change the performance Timings logic * Add Avx2 implementation for F32 and U8 toggle variants * minor change to support u8_f16 and u8_f32 cases * Regenerate LUT golden outputs with ACCURATE_DCT tag * Minor code changes * Add AVX2 support for u8 pkd3-pln3 and i8 pkd3-pln3 for water augmentation * Made changes to the runTests.py in Host to remove testAllScipts.sh * Made changes to the runTests.py in HIP to remove testAllScipts.sh * Initial commit - Image min and max Reduction kernel Includes * u8 datatype for both min and max HOST Tensor of all variants. * Testsuite changes. * NWC -initial code for min max PLN3 - PLN3 * made changes to split min and max kernels seperately * splitted kernels for min and max * made changes to print final max/min in the R,G,B channels * fixed inaccuracies in min/max computation * made changes to typecast intermediate output to output requested by user added comments for the code code cleanup and minor changes in test suite * fixed build issues removed image folders used for min, max and sum reverted unwanted file changes * minor changes in test suite * removed support for unwanted test case in Tensor_hip.cpp * Adds new option roi * remove testAllScripts.sh * Adds roi Option in HIP backend * Implement f32 variants * Implement f16 and i8 datatype variants * change F32 load and store logic * Add build flags in CMakeLists.txt to set AVX/SSE flags based on the system configuration * minor code changes * Initial commit - Image sum Reduction kernel Includes u8 PLN1 -> PLN1 conversion for HOST Tensor * Implement PKD3 and PLN3 for Image sum Tensor HOST * Support i8, f16 and f32 datatypes * Initial commit - Image sum Reduction HIP kernel Includes u8 PLN1 -> PLN1 conversion for Tensor * Implement PKD3 and PLN3 for Image sum Tensor HIP * Add support in testsuite Revert normalization for i8 HOST Tensor variants * Fix HIP testsuite Remove additional blanks for 1 channel output * Modify print statement in HIP testsuite * Improve readability for testsuite outputs * optimized the store function for F32 PLN3-PKD3 * reverted back irrelevant changes * minor change * Fix HIP to support larger inputs * optimized load and store functions for water U8 and F32 variants in host removed commented code * Cleanup * removed golden outputs for water * minor changes * Cleanup Support Reduction QA test in testsuite * renamed few functions and removed unused functions updated i8 pln1 load as per the optimized u8 pln1 load * fixed bug in i8 load function * Remove unused variables and C style casting * changed cast to c++ style resolved spacing issues and added comments for AVX codes for better understanding made changes to handle cases where QA Tests are not supported * added golden outputs for water * updated golden outputs with latest changes * modified the u8, i8 pkd3-pln3 function and added comments for the vectorized code * fixed minor bug in I8 variants * Optimize u8 datatype further * Fix static_cast * made to changes to resolve codacy warnings * changed cast to c++ style in hip kernel * Initial commit - Ricap HOST Tensor Includes testsuite changes * Add QA tests for RICAP Used three_images_224x224_src1 folder to create golden outputs * Add three_images_224x224_src1 into TEST_IMAGES * added rotate case with golden outputs changed generic bilinear HOST codes to match with HIP codes * Add golden output for remaining all tensor augmentations * fix python script issues * Optimize u8 and i8 datatype Uses uint and int internal processing instead of float * Fix testsuite build errors * minor change * Fix QA check * Modify api naming from image_sum to tensor_sum Includes changes for both HOST and HIP * Support HIP Backend for RICAP * change rcm and rmn golden outputs * Fix HIP pkd3->pkd3 variant * changes based on review comments * change test_suite folder to tests * Optimize u8 and i8 datatype of HIP Includes modification in naming of shared memory * minor fix * changed generic nn F32 loads using gather and setr instructions * Optimize and cleanup U8 HIP * regenerated golden outputs for RICAP minor changes in HOST shell script for handling RICAP in QA mode * minor bug fix in RICAP HIP kernels * Fix i8 datatype variants Includes cleanup * Fix the issues with color_to_greyscale * remove the empty folder creation * reverting back the folder name change * minor change * added comments for latest changes * minor change * Improve readability and Cleanup * Fix QA for HIP Includes cleanup * resolved review comments * minor change * Modify api naming from image_ to tensor_ for HOST * Add support for QA tests * removed range check for RMN U8-F32 and U8-F16 variants changed from hipMemset to hipMemsetAsync for RMN HIP Kernel removed multiplication by 255 for stdDev in RMN HOST U8-F16 and U8-F32 variants * Modify naming of shared memory with _smem in HIP Includes cleanup * Typecast and reuse markArr for HIP U8 and I8 * Cleanup and minor optimization * minor fix * fix codacy warnings * Additional cleanup * Cleanup and move #define * Changed the complexity of if statements in runTests.py * Cleanup testsuite Includes new golden outputs * Additional testuite fixes * Minor cleanup * Codacy fixes * Fix codacy warnings * Codacy fix * Address other codacy warnings * cleanup * Change Image functions to generic * Update ricap.hpp with reference paper * resolved minor issues happened with merge * minor changes * fixed minor issue with getting profiler times * minor formatting changes * resolved build issues in test suite renamed the min and max kernel file names * RPP RICAP Tensor for HOST and HIP (#213) * Initial commit - Ricap HOST Tensor Includes testsuite changes * Add QA tests for RICAP Used three_images_224x224_src1 folder to create golden outputs * Add three_images_224x224_src1 into TEST_IMAGES * Support HIP Backend for RICAP * Fix HIP pkd3->pkd3 variant * regenerated golden outputs for RICAP minor changes in HOST shell script for handling RICAP in QA mode * minor bug fix in RICAP HIP kernels * Improve readability and Cleanup * Additional cleanup * Cleanup testsuite Includes new golden outputs * Additional testuite fixes * Minor cleanup * Fix codacy warnings * Address other codacy warnings * Update ricap.hpp with reference paper * Add RICAP dataset path in readme * Make changes to error codes returned * Modify roi crop region for unit and perf tests * RPP Tensor Water Augmentation on HOST and HIP (#181) * added water HOST and HIP codes * added water case in test suite * added golden outputs for water * added omp thread changes for water augmentation * experimental changes * fixed output issue with AVX2 instructions * added AVX2 support for PKD3 load function minor changes in PLN variant load functions * nwc commit - added avx2 changes for u8 layout toggle variants but need to add store functions for completion * Add Avx2 implementation for F32 and U8 toggle variants * Add AVX2 support for u8 pkd3-pln3 and i8 pkd3-pln3 for water augmentation * change F32 load and store logic * optimized the store function for F32 PLN3-PKD3 * reverted back irrelevant changes * minor change * optimized load and store functions for water U8 and F32 variants in host removed commented code * removed golden outputs for water * minor changes * renamed few functions and removed unused functions updated i8 pln1 load as per the optimized u8 pln1 load * fixed bug in i8 load function * changed cast to c++ style resolved spacing issues and added comments for AVX codes for better understanding made changes to handle cases where QA Tests are not supported * added golden outputs for water * updated golden outputs with latest changes * modified the u8, i8 pkd3-pln3 function and added comments for the vectorized code * fixed minor bug in I8 variants * made to changes to resolve codacy warnings * changed cast to c++ style in hip kernel * changed generic nn F32 loads using gather and setr instructions * added comments for latest changes * minor change * added definition for storing 32 and 64 bits from a 128bit register --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM * Fix build error * CMakeLists - Version Update 1.5.0 - TOT Version * CHANGELOG Updates Version 1.5.0 placeholder * Boost deps fix for test suite --------- Co-authored-by: Snehaa Giridharan Co-authored-by: sampath1117 Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> Co-authored-by: HazarathKumarM Co-authored-by: Kiriti Gowda * Documentation - Readme & changelog updates (#251) * readme and changelog updates for 6.0 * minor update * Documentation - Bump rocm-docs-core[api_reference] from 0.26.0 to 0.27.0 in /docs/sphinx (#253) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.26.0 to 0.27.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/RadeonOpenCompute/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.26.0...v0.27.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * RPP Resize Mirror Normalize Bugfix (#252) * added fix for hipMemset * remove pixel check for U8-F32 and U8-F16 for HOST codes --------- Co-authored-by: sampath1117 * Cmake fix to prevent warning * Fix paths in new python scripts * Sphinx - updates (#257) * Sphinx - updates * Doxygen - Updates * Docs - Remove index.md * Test suite fixes after tensor_min / tensor_max HOST merge * Fix max case * QA tests fix for hip and host * naming convention changes as per new std * Substitute imagePartial with partial * Substitute imageMin/imageMax with min/max * Replace hipMemset with hipMemsetAsync, and replace hipDeviceSynchronize with hipStreamSynchronize * Use variable instead of batchCount*4 * Use post increment effectivly * Resolve codacy warnings * Additional cleanup * remove unused variable * Documentation - Bump rocm-docs-core[api_reference] from 0.28.0 to 0.29.0 in /docs/sphinx (#265) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.28.0 to 0.29.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/RadeonOpenCompute/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.28.0...v0.29.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Remove auto merge boost * Spaces formatting * Bump rocm-docs-core[api_reference] from 0.29.0 to 0.30.1 in /docs/sphinx (#268) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.29.0 to 0.30.1. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/RadeonOpenCompute/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.29.0...v0.30.1) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * add support for mi300 (#269) * Documentation - Bump rocm-docs-core[api_reference] from 0.30.1 to 0.30.2 in /docs/sphinx (#273) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.30.1 to 0.30.2. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/RadeonOpenCompute/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.30.1...v0.30.2) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Cleanup by removing oneliner functions as inline * RPP Tensor Audio Support - To Decibels (#258) * Initial commit - Non slient region detection Includes unittest setup * Initial commit - To Decibels Includes unittest setup * Replace vectors with arrays * Cleanup * Replace Rpp64s with Rpp32s * Optimize and precompute cutOff * Fix buffer used * Fix buffer used * Additional Cleanup * Update testsuite for Audio * code cleanup * Add Readme file for Audio test suite * changes based on review comments * minor change * Remove unittest folders and updated README.md * Remove unit tests * minor change * code cleanup * added common header file for audio helper functions * removed unncessary audio wav files fixed bug in ROI updation for audio test suite resolved issue in summary generation for performance tests in python * removed log file * added doxygen support for audio * added doxygen changes for to_decibels * updated test suite support for to_decibels * minor change * removed the usage of getMax function and used std::max_element * modularized code in test suite * merge with latest changes * minor change * minor change * resolved codacy warnings * Codacy fix - Remove unused cpuTime * CMakeLists - Version Update 1.5.0 - TOT Version * CHANGELOG Updates Version 1.5.0 placeholder * resolved issue with file_system dependency in test suite * Doxygen changes changed malloc to new in NSR kernel * RPP RICAP Tensor for HOST and HIP (#213) * Initial commit - Ricap HOST Tensor Includes testsuite changes * Add QA tests for RICAP Used three_images_224x224_src1 folder to create golden outputs * Add three_images_224x224_src1 into TEST_IMAGES * Support HIP Backend for RICAP * Fix HIP pkd3->pkd3 variant * regenerated golden outputs for RICAP minor changes in HOST shell script for handling RICAP in QA mode * minor bug fix in RICAP HIP kernels * Improve readability and Cleanup * Additional cleanup * Cleanup testsuite Includes new golden outputs * Additional testuite fixes * Minor cleanup * Fix codacy warnings * Address other codacy warnings * Update ricap.hpp with reference paper * Add RICAP dataset path in readme * Make changes to error codes returned * Modify roi crop region for unit and perf tests * RPP Tensor Water Augmentation on HOST and HIP (#181) * added water HOST and HIP codes * added water case in test suite * added golden outputs for water * added omp thread changes for water augmentation * experimental changes * fixed output issue with AVX2 instructions * added AVX2 support for PKD3 load function minor changes in PLN variant load functions * nwc commit - added avx2 changes for u8 layout toggle variants but need to add store functions for completion * Add Avx2 implementation for F32 and U8 toggle variants * Add AVX2 support for u8 pkd3-pln3 and i8 pkd3-pln3 for water augmentation * change F32 load and store logic * optimized the store function for F32 PLN3-PKD3 * reverted back irrelevant changes * minor change * optimized load and store functions for water U8 and F32 variants in host removed commented code * removed golden outputs for water * minor changes * renamed few functions and removed unused functions updated i8 pln1 load as per the optimized u8 pln1 load * fixed bug in i8 load function * changed cast to c++ style resolved spacing issues and added comments for AVX codes for better understanding made changes to handle cases where QA Tests are not supported * added golden outputs for water * updated golden outputs with latest changes * modified the u8, i8 pkd3-pln3 function and added comments for the vectorized code * fixed minor bug in I8 variants * made to changes to resolve codacy warnings * changed cast to c++ style in hip kernel * changed generic nn F32 loads using gather and setr instructions * added comments for latest changes * minor change * added definition for storing 32 and 64 bits from a 128bit register --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM * Fix build error * CMakeLists - Version Update 1.5.0 - TOT Version * CHANGELOG Updates Version 1.5.0 placeholder * Boost deps fix for test suite --------- Co-authored-by: Snehaa Giridharan Co-authored-by: sampath1117 Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> Co-authored-by: HazarathKumarM Co-authored-by: Kiriti Gowda * Documentation - Readme & changelog updates (#251) * readme and changelog updates for 6.0 * minor update * added ctests for audio test suite for CI made changes to add more clarity on the QA Tests results * Cmake mods for ctest * HOST-only build error bugfix * added qa mode paramter to python audio script added golden output map for QA testing of Non silent region detection * minor change * Documentation - Bump rocm-docs-core[api_reference] from 0.26.0 to 0.27.0 in /docs/sphinx (#253) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.26.0 to 0.27.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/RadeonOpenCompute/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.26.0...v0.27.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * RPP Resize Mirror Normalize Bugfix (#252) * added fix for hipMemset * remove pixel check for U8-F32 and U8-F16 for HOST codes --------- Co-authored-by: sampath1117 * added example for MMS calculation in comments for better understanding * Sphinx - updates (#257) * Sphinx - updates * Doxygen - Updates * Docs - Remove index.md * updated info used to for running audio test suite * removed bitdepth variable from audio test suite * added more information on computing NSR outputs in the example added * Fix doxygen for decibels Also removes extra QA reference files * Fix build errors and qa tests in Audio Test suite * Remove auto-merge repeated funcs * Improve clarity on header docs * made changes based on review comments * stored golden outputs of to_decibels in binary file removed golden output text files for non silent region * removed unused parameter in verify_output function * updated list of cases supported in python script * added error handling for opening golden output file * Codacy fix and tests warning fix * Codacy fix * Codacy fix trial * codacy fix for checking boundaries of fstream --------- Signed-off-by: dependabot[bot] Co-authored-by: Snehaa Giridharan Co-authored-by: HazarathKumarM Co-authored-by: sampath1117 Co-authored-by: Kiriti Gowda Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> Co-authored-by: Lisa Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Documentation - Bump rocm-docs-core[api_reference] from 0.30.2 to 0.30.3 in /docs/sphinx (#274) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.30.2 to 0.30.3. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/RadeonOpenCompute/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.30.2...v0.30.3) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Adding issue template (#270) * Add files via upload * added ROCm v6, MI300, default component * Fix cast used in testsuite Includes minor fixes * Fix displaying f16 outputs * Optimize HOST min/max reduce function further * Fix spacing in HIP kernels * Fix PLN1 outputs for u8 and i8 datatypes of HOST backend * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * Bump rocm-docs-core[api_reference] from 0.31.0 to 0.33.0 in /docs/sphinx (#294) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.31.0 to 0.33.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.31.0...v0.33.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Store reference outputs via map for min and max kernels * Update tensor_max.hpp license * Update tensor_min.hpp license * Fix output comparison check * Merge branch 'ar/opt_tensor_min_tensor_max' of https://github.com/r-abishek/rpp into sn/tensor_min_max * Modify exit condition used in outer most kernel * Modify srcIdx for HIP Tensor min * Using maximum as 255 for HIP Tensor min * Modify srcIdx for HIP Tensor max kernel Also fixes build error in testsuite * Fix corrupted outputs displayed for Tensor sum * Fix corruption issue seen with tensor sum kernel * Fix minimum for I8 Tensor max kernel * Modified HIP buffer initialization with a common function * Fix redefinition * Remove additional variables xAlignedLength * Remove unwanted xAlignedLength and xDiff * Remove redefinition of TensorSumReferenceOutputs * Fix for CI issue * Add parenthesis --------- Signed-off-by: dependabot[bot] Co-authored-by: HazarathKumarM Co-authored-by: sampath1117 Co-authored-by: Snehaa Giridharan Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> Co-authored-by: fiona-gladwin Co-authored-by: Kiriti Gowda Co-authored-by: Lisa Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Lakshmi Kumar Co-authored-by: abhimeda <138710508+abhimeda@users.noreply.github.com> * CI - Update precheckin.groovy * added separate kernels for doing flip when horizontal flip is not set * fixed build issue * Add supported case * reverted incorrect changes happened with merge --------- Signed-off-by: dependabot[bot] Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Sam Wu Co-authored-by: Kiriti Gowda Co-authored-by: Snehaa Giridharan Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> Co-authored-by: Lisa Co-authored-by: Sundarrajan98 Co-authored-by: Pavel Tcherniaev Co-authored-by: fiona-gladwin Co-authored-by: Lakshmi Kumar Co-authored-by: abhimeda <138710508+abhimeda@users.noreply.github.com> * RPP Vignette Tensor on HOST and HIP (#311) * Add Vignette Tensor HOST and HIP Implementation * License - updates to 2024 and consistency changes (#298) * Match all CMakeLists.txt license as per RPP's outermost LICENSE file * Match all python files' license as per RPP's outermost LICENSE file * Match all .hpp files' license as per RPP's outermost LICENSE file * Match all .cpp files' license as per RPP's outermost LICENSE file * Match all .h files' license as per RPP's outermost LICENSE file * Remove all rights reserved as per LICENSE file * Remove double space in "Copyright (c) 2019 - 2023 Advanced Micro Devices, Inc." * Match all .cmake files' license as per RPP's outermost LICENSE file * Match all .cpp.in files' license as per RPP's outermost LICENSE file * Replace 283 occurrences in 282 files - 2023 to 2024 * Add "MIT License" title to 281 instances * Add missing license * Test - Update README.md for test_suite (#299) * Bump rocm-docs-core[api_reference] from 0.33.0 to 0.33.1 in /docs/sphinx (#301) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.33.0 to 0.33.1. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.33.0...v0.33.1) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump rocm-docs-core[api_reference] from 0.33.1 to 0.33.2 in /docs/sphinx (#302) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.33.1 to 0.33.2. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.33.1...v0.33.2) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Update doc codeowners (#303) * Documentation - Bump rocm-docs-core[api_reference] from 0.33.2 to 0.34.0 in /docs/sphinx (#304) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.33.2 to 0.34.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.33.2...v0.34.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Test suite - upgrade 5 qa perf (#305) * experimental changes for adding qa mode for performance tests * made changes to add display more information w.r.t QA results summary for performance tests * minor changes * Add changes to dump qa results to excel file * Add performance QA for three new tensor functions * update prerequisites in readme * added changes to handle unsupported cases * removed treshold dictionary and added performance Noise treshold add new dataset for performance QA * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * Changes to the performane summary dataframe * minor changes * Update CMakeLists.txt to add ${CMAKE_CURRENT_SOURCE_DIR} for CI * Update CMakeLists.txt fix * Update CMakeLists.txt fix * remove tabulate dependency * Update README.md to remove tabulate pip install * Fix for CI machine failure * Add note on performance --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM Co-authored-by: Abishek <52214183+r-abishek@users.noreply.github.com> Co-authored-by: Snehaa Giridharan Co-authored-by: r-abishek * RPP Color Temperature on HOST and HIP (#271) * Initial commit - Color Temperature HOST Tensor * Initial commit - Color Temperature HIP Tensor * Add color temperature golden outputs * address review comments * Use reinterpret_cast instead of static_cast * Combine templated functions to support all datatypes into one (got minor perf difference of order 3%) Also fixes indentation * Fix i8 datatype * Cleanup * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * Fix PLN3 variant outputs Also modifies reference outputs * Update color_temperature.hpp license * Delete color_temperature_u8_Tensor_PKD3.csv * Delete color_temperature_u8_Tensor_PLN3.csv --------- Co-authored-by: snehaa8 Co-authored-by: HazarathKumarM Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> * RPP Voxel 3D Tensor Add/Subtract scalar on HOST and HIP (#272) * added HOST support for voxel add kernel * added HIP support for voxel add kernel * added test suite support for add scalar * added Doxygen support and modified hip kernel function names as per new standard * added HOST support for voxel subtract kernel * added HIP support for voxel subtract kernel * added test suite support * updated the golden outputs for subtract with correct values * removed unnessary validation checks * Remove double spaces * Fix header * Fix all retval docs * Fix docs to add memory type * Fix comment * Add divider comment * Use post-increment efficiently * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * converted add and subtract scalar golden outputs to bin files * changed copyright from 2023 to 2024 * Update add_scalar.hpp license * Update subtract_scalar.hpp license --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM * RPP Magnitude on HOST and HIP (#278) * Initial commit - Magnitude HOST Tensor * Add QA reference outputs * Update runTests.py * Initial commit - Magnitude HIP Tensor * Add dual input support in testsuite * Optimize HOST kernel further * Optimize i8 datatype further * Modify comments * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * Bump rocm-docs-core[api_reference] from 0.31.0 to 0.33.0 in /docs/sphinx (#294) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.31.0 to 0.33.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.31.0...v0.33.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Update Copywright year * Combine templated functions to support all datatypes * Modify format of reference outputs * Update rppi_arithmetic_operations.h license * Update rppt_tensor_arithmetic_operations.h license * Update host_tensor_arithmetic_operations.hpp * Update magnitude.hpp license * Update hip_tensor_arithmetic_operations.hpp license * Delete magnitude_u8_Tensor_PKD3.csv * Delete magnitude_u8_Tensor_PLN1.csv * Delete magnitude_u8_Tensor_PLN3.csv * Update rpp_test_suite_common.h license * Update runTests.py license * Update Tensor_hip.cpp license * Update runTests.py license * Update Tensor_host.cpp license --------- Signed-off-by: dependabot[bot] Co-authored-by: Snehaa Giridharan Co-authored-by: HazarathKumarM Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> * Bump rocm-docs-core[api_reference] from 0.34.0 to 0.34.2 in /docs/sphinx (#309) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.34.0 to 0.34.2. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.34.0...v0.34.2) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * RPP Tensor Audio Support - Down Mixing (#296) * Initial commit - Non slient region detection Includes unittest setup * Initial commit - To Decibels Includes unittest setup * Intial commit - pre_emphasis_filter * Intial commit - down_mixing * Replace vectors with arrays * Cleanup * Minor cleanup * Optimize downmixing Kernel Includes cleanup * Replace Rpp64s with Rpp32s * Cleanup * Optimize and precompute cutOff * Fix buffer used * Fix buffer used * Additional Cleanup * Optimize post incrmeent operation * Optimize post increment operation * Update testsuite for Audio * code cleanup * Add Readme file for Audio test suite * changes based on review comments * minor change * Remove unittest folders and updated README.md * Remove unit tests * minor change * code cleanup * added common header file for audio helper functions * removed unncessary audio wav files fixed bug in ROI updation for audio test suite resolved issue in summary generation for performance tests in python * removed log file * added doxygen support for audio * added doxygen changes for to_decibels * updated test suite support for to_decibels * minor change * added doxygen changes for preemphasis filter * updated changes for preemphasis filter in test suite * removed the usage of getMax function and used std::max_element * modularized code in test suite * merge with latest changes * minor change * minor change * minor change * resolved codacy warnings * Codacy fix - Remove unused cpuTime * CMakeLists - Version Update 1.5.0 - TOT Version * CHANGELOG Updates Version 1.5.0 placeholder * resolved issue with file_system dependency in test suite * Doxygen changes changed malloc to new in NSR kernel * RPP RICAP Tensor for HOST and HIP (#213) * Initial commit - Ricap HOST Tensor Includes testsuite changes * Add QA tests for RICAP Used three_images_224x224_src1 folder to create golden outputs * Add three_images_224x224_src1 into TEST_IMAGES * Support HIP Backend for RICAP * Fix HIP pkd3->pkd3 variant * regenerated golden outputs for RICAP minor changes in HOST shell script for handling RICAP in QA mode * minor bug fix in RICAP HIP kernels * Improve readability and Cleanup * Additional cleanup * Cleanup testsuite Includes new golden outputs * Additional testuite fixes * Minor cleanup * Fix codacy warnings * Address other codacy warnings * Update ricap.hpp with reference paper * Add RICAP dataset path in readme * Make changes to error codes returned * Modify roi crop region for unit and perf tests * RPP Tensor Water Augmentation on HOST and HIP (#181) * added water HOST and HIP codes * added water case in test suite * added golden outputs for water * added omp thread changes for water augmentation * experimental changes * fixed output issue with AVX2 instructions * added AVX2 support for PKD3 load function minor changes in PLN variant load functions * nwc commit - added avx2 changes for u8 layout toggle variants but need to add store functions for completion * Add Avx2 implementation for F32 and U8 toggle variants * Add AVX2 support for u8 pkd3-pln3 and i8 pkd3-pln3 for water augmentation * change F32 load and store logic * optimized the store function for F32 PLN3-PKD3 * reverted back irrelevant changes * minor change * optimized load and store functions for water U8 and F32 variants in host removed commented code * removed golden outputs for water * minor changes * renamed few functions and removed unused functions updated i8 pln1 load as per the optimized u8 pln1 load * fixed bug in i8 load function * changed cast to c++ style resolved spacing issues and added comments for AVX codes for better understanding made changes to handle cases where QA Tests are not supported * added golden outputs for water * updated golden outputs with latest changes * modified the u8, i8 pkd3-pln3 function and added comments for the vectorized code * fixed minor bug in I8 variants * made to changes to resolve codacy warnings * changed cast to c++ style in hip kernel * changed generic nn F32 loads using gather and setr instructions * added comments for latest changes * minor change * added definition for storing 32 and 64 bits from a 128bit register --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM * Fix build error * CMakeLists - Version Update 1.5.0 - TOT Version * CHANGELOG Updates Version 1.5.0 placeholder * Boost deps fix for test suite --------- Co-authored-by: Snehaa Giridharan Co-authored-by: sampath1117 Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> Co-authored-by: HazarathKumarM Co-authored-by: Kiriti Gowda * Documentation - Readme & changelog updates (#251) * readme and changelog updates for 6.0 * minor update * added ctests for audio test suite for CI made changes to add more clarity on the QA Tests results * Cmake mods for ctest * HOST-only build error bugfix * added qa mode paramter to python audio script added golden output map for QA testing of Non silent region detection * minor change * Documentation - Bump rocm-docs-core[api_reference] from 0.26.0 to 0.27.0 in /docs/sphinx (#253) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.26.0 to 0.27.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/RadeonOpenCompute/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.26.0...v0.27.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * RPP Resize Mirror Normalize Bugfix (#252) * added fix for hipMemset * remove pixel check for U8-F32 and U8-F16 for HOST codes --------- Co-authored-by: sampath1117 * added example for MMS calculation in comments for better understanding * Sphinx - updates (#257) * Sphinx - updates * Doxygen - Updates * Docs - Remove index.md * updated info used to for running audio test suite * removed bitdepth variable from audio test suite * added more information on computing NSR outputs in the example added * Fix doxygen for decibels Also removes extra QA reference files * move tensor_host_audio.cpp to host folder * Fix build errors and qa tests in Audio Test suite * Fix build errors and qa tests in Audio Test suite * Add reference output and test samples for downmix * Add down_mix in augmentation list and supported cases * Remove auto-merge repeated funcs * Improve clarity of header docs * Remove blank line * Improve clarity on header docs * Add Doxygen comments * minor change * converted golden outputs to binary file for downmixing * removed old golden output file for preemphasis and todecibels * modified info for downmixing as per new changes used handle memory for temporary buffers * formatting changes * moved the common code for SSE and AVX to outside * Update down_mixing.hpp license * Update rppt_tensor_audio_augmentations.h * combined the srcLength and channels tensors into single tensor --------- Signed-off-by: dependabot[bot] Co-authored-by: Snehaa Giridharan Co-authored-by: HazarathKumarM Co-authored-by: sampath1117 Co-authored-by: Kiriti Gowda Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> Co-authored-by: Lisa Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Sundarrajan98 * RPP Voxel 3D Tensor Multiply scalar on HOST and HIP (#306) * added HIP support for voxel scalar multiply kernel * added HOST support for voxel multiply kernel added golden outputs for voxel multiply kernel * merge with master * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * converted multiply scalar voxel golden outputs to bin files * changed copyright from 2023 to 2024 --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM * Test Suite Bugfix (#307) * experimental changes for adding qa mode for performance tests * made changes to add display more information w.r.t QA results summary for performance tests * minor changes * Add changes to dump qa results to excel file * Add performance QA for three new tensor functions * update prerequisites in readme * added changes to handle unsupported cases * removed treshold dictionary and added performance Noise treshold add new dataset for performance QA * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * Changes to the performane summary dataframe * minor changes * Update CMakeLists.txt to add ${CMAKE_CURRENT_SOURCE_DIR} for CI * Update CMakeLists.txt fix * Update CMakeLists.txt fix * remove tabulate dependency * Update README.md to remove tabulate pip install * Fix for CI machine failure * Add note on performance * Fix segmentation fault * Revert QAmode to restrict HIP bitdepths * Use Rpp64u for HOST while comparing outputs * Fix ambiguous abs call * Fix for SLES CI HIP fail - error: incompatible pointer types assigning to 'unsigned long *' from 'unsigned long long *' - refOutput = TensorSumReferenceOutputs[numChannels].data(); --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM Co-authored-by: Snehaa Giridharan Co-authored-by: Pavel Tcherniaev * Add Vignette Tensor HOST and HIP Implementation * Address review comments * Update rpp_hip_common.hpp * Update vignette.hpp to add rpp_hip_math_nearbyintf8() * Update Tensor_hip.cpp to add hipHostFree * Fix init * Repeated initialization bugfix * Add host case 46 --------- Signed-off-by: dependabot[bot] Co-authored-by: HazarathKumarM Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Sam Wu Co-authored-by: Kiriti Gowda Co-authored-by: sampath1117 Co-authored-by: Snehaa Giridharan Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> Co-authored-by: Lisa Co-authored-by: Sundarrajan98 Co-authored-by: Pavel Tcherniaev * Improve readability and cleanup * Replace memset with fill for setting non zero integers * Bump rocm-docs-core[api_reference] from 0.37.1 to 0.38.0 in /docs/sphinx (#333) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.37.1 to 0.38.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.37.1...v0.38.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Move independent computes outside loop * Use memset instead of manually filling values and move this outside loop * Replace c style cast with static cast * Revert "Use memset instead of manually filling values and move this outside loop" This reverts commit d95baee3ccc1fa90f95d0013a16fd415df745679. Leads to mismatch when testing large datasets * RPP Tensor Audio Support - Resample (#310) * Initial commit - Non slient region detection Includes unittest setup * Initial commit - To Decibels Includes unittest setup * Intial commit - pre_emphasis_filter * Intial commit - down_mixing * Intial commit - slice_audio * Intial commit - mel_filter_bank * Intial commit - spectrogram * Intial commit - resample * Replace vectors with arrays * Cleanup * Minor cleanup * Optimize downmixing Kernel Includes cleanup * Remove unused variables in header file * Add axes parameter * Replace Rpp64s with Rpp32s * Replace vectors with arrays Includes optimization * Cleanup * Cleanup * Cleanup and optimize * Move malloc outside openMP loop * Optimize and precompute cutOff * Cleanup * Fix buffer used * Fix buffer used * Additional Cleanup * Fix buffer allocation Includes minor optimization * Optimize post incrmeent operation * Optimize post increment operation * Optimize post increment operation * Update testsuite for Audio * code cleanup * Add Readme file for Audio test suite * changes based on review comments * minor change * Remove unittest folders and updated README.md * Remove unit tests * minor change * code cleanup * added common header file for audio helper functions * removed unncessary audio wav files fixed bug in ROI updation for audio test suite resolved issue in summary generation for performance tests in python * removed log file * added doxygen support for audio * added doxygen changes for to_decibels * updated test suite support for to_decibels * minor change * added doxygen changes for preemphasis filter * updated changes for preemphasis filter in test suite * removed the usage of getMax function and used std::max_element * modularized code in test suite * merge with latest changes * minor change * minor change * minor change * resolved codacy warnings * Codacy fix - Remove unused cpuTime * CMakeLists - Version Update 1.5.0 - TOT Version * CHANGELOG Updates Version 1.5.0 placeholder * resolved issue with file_system dependency in test suite * Doxygen changes changed malloc to new in NSR kernel * RPP RICAP Tensor for HOST and HIP (#213) * Initial commit - Ricap HOST Tensor Includes testsuite changes * Add QA tests for RICAP Used three_images_224x224_src1 folder to create golden outputs * Add three_images_224x224_src1 into TEST_IMAGES * Support HIP Backend for RICAP * Fix HIP pkd3->pkd3 variant * regenerated golden outputs for RICAP minor changes in HOST shell script for handling RICAP in QA mode * minor bug fix in RICAP HIP kernels * Improve readability and Cleanup * Additional cleanup * Cleanup testsuite Includes new golden outputs * Additional testuite fixes * Minor cleanup * Fix codacy warnings * Address other codacy warnings * Update ricap.hpp with reference paper * Add RICAP dataset path in readme * Make changes to error codes returned * Modify roi crop region for unit and perf tests * RPP Tensor Water Augmentation on HOST and HIP (#181) * added water HOST and HIP codes * added water case in test suite * added golden outputs for water * added omp thread changes for water augmentation * experimental changes * fixed output issue with AVX2 instructions * added AVX2 support for PKD3 load function minor changes in PLN variant load functions * nwc commit - added avx2 changes for u8 layout toggle variants but need to add store functions for completion * Add Avx2 implementation for F32 and U8 toggle variants * Add AVX2 support for u8 pkd3-pln3 and i8 pkd3-pln3 for water augmentation * change F32 load and store logic * optimized the store function for F32 PLN3-PKD3 * reverted back irrelevant changes * minor change * optimized load and store functions for water U8 and F32 variants in host removed commented code * removed golden outputs for water * minor changes * renamed few functions and removed unused functions updated i8 pln1 load as per the optimized u8 pln1 load * fixed bug in i8 load function * changed cast to c++ style resolved spacing issues and added comments for AVX codes for better understanding made changes to handle cases where QA Tests are not supported * added golden outputs for water * updated golden outputs with latest changes * modified the u8, i8 pkd3-pln3 function and added comments for the vectorized code * fixed minor bug in I8 variants * made to changes to resolve codacy warnings * changed cast to c++ style in hip kernel * changed generic nn F32 loads using gather and setr instructions * added comments for latest changes * minor change * added definition for storing 32 and 64 bits from a 128bit register --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM * Fix build error * CMakeLists - Version Update 1.5.0 - TOT Version * CHANGELOG Updates Version 1.5.0 placeholder * Boost deps fix for test suite --------- Co-authored-by: Snehaa Giridharan Co-authored-by: sampath1117 Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> Co-authored-by: HazarathKumarM Co-authored-by: Kiriti Gowda * Documentation - Readme & changelog updates (#251) * readme and changelog updates for 6.0 * minor update * added ctests for audio test suite for CI made changes to add more clarity on the QA Tests results * Cmake mods for ctest * HOST-only build error bugfix * added qa mode paramter to python audio script added golden output map for QA testing of Non silent region detection * minor change * Documentation - Bump rocm-docs-core[api_reference] from 0.26.0 to 0.27.0 in /docs/sphinx (#253) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.26.0 to 0.27.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/RadeonOpenCompute/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.26.0...v0.27.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * RPP Resize Mirror Normalize Bugfix (#252) * added fix for hipMemset * remove pixel check for U8-F32 and U8-F16 for HOST codes --------- Co-authored-by: sampath1117 * added example for MMS calculation in comments for better understanding * Sphinx - updates (#257) * Sphinx - updates * Doxygen - Updates * Docs - Remove index.md * updated info used to for running audio test suite * removed bitdepth variable from audio test suite * added more information on computing NSR outputs in the example added * Fix doxygen for decibels Also removes extra QA reference files * move tensor_host_audio.cpp to host folder * Fix build errors and qa tests in Audio Test suite * Fix build errors and qa tests in Audio Test suite * Add reference output and test samples for downmix * Add down_mix in augmentation list and supported cases * move Tensor_host_audio.cpp to host folder * fix qa mismatches * move Tensor_host_audio.cpp to host folder * fix qa mismatches * move Tensor_host_audio.cpp to host folder * Add spectrogram case in Tensor_host_audio.cpp * move Tensor_host_audio.cpp to host folder * fix qa mismatches * Remove auto-merge repeated funcs * Improve clarity of header docs * Remove blank line * Improve clarity on header docs * Add Doxygen comments * Add Doxygen comments * Add Doxygen comments * minor change * License - updates to 2024 and consistency changes (#298) * Match all CMakeLists.txt license as per RPP's outermost LICENSE file * Match all python files' license as per RPP's outermost LICENSE file * Match all .hpp files' license as per RPP's outermost LICENSE file * Match all .cpp files' license as per RPP's outermost LICENSE file * Match all .h files' license as per RPP's outermost LICENSE file * Remove all rights reserved as per LICENSE file * Remove double space in "Copyright (c) 2019 - 2023 Advanced Micro Devices, Inc." * Match all .cmake files' license as per RPP's outermost LICENSE file * Match all .cpp.in files' license as per RPP's outermost LICENSE file * Replace 283 occurrences in 282 files - 2023 to 2024 * Add "MIT License" title to 281 instances * Add missing license * Test - Update README.md for test_suite (#299) * Bump rocm-docs-core[api_reference] from 0.33.0 to 0.33.1 in /docs/sphinx (#301) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.33.0 to 0.33.1. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.33.0...v0.33.1) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump rocm-docs-core[api_reference] from 0.33.1 to 0.33.2 in /docs/sphinx (#302) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.33.1 to 0.33.2. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.33.1...v0.33.2) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Update doc codeowners (#303) * Documentation - Bump rocm-docs-core[api_reference] from 0.33.2 to 0.34.0 in /docs/sphinx (#304) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.33.2 to 0.34.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.33.2...v0.34.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Test suite - upgrade 5 qa perf (#305) * experimental changes for adding qa mode for performance tests * made changes to add display more information w.r.t QA results summary for performance tests * minor changes * Add changes to dump qa results to excel file * Add performance QA for three new tensor functions * update prerequisites in readme * added changes to handle unsupported cases * removed treshold dictionary and added performance Noise treshold add new dataset for performance QA * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * Changes to the performane summary dataframe * minor changes * Update CMakeLists.txt to add ${CMAKE_CURRENT_SOURCE_DIR} for CI * Update CMakeLists.txt fix * Update CMakeLists.txt fix * remove tabulate dependency * Update README.md to remove tabulate pip install * Fix for CI machine failure * Add note on performance --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM Co-authored-by: Abishek <52214183+r-abishek@users.noreply.github.com> Co-authored-by: Snehaa Giridharan Co-authored-by: r-abishek * RPP Color Temperature on HOST and HIP (#271) * Initial commit - Color Temperature HOST Tensor * Initial commit - Color Temperature HIP Tensor * Add color temperature golden outputs * address review comments * Use reinterpret_cast instead of static_cast * Combine templated functions to support all datatypes into one (got minor perf difference of order 3%) Also fixes indentation * Fix i8 datatype * Cleanup * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * Fix PLN3 variant outputs Also modifies reference outputs * Update color_temperature.hpp license * Delete color_temperature_u8_Tensor_PKD3.csv * Delete color_temperature_u8_Tensor_PLN3.csv --------- Co-authored-by: snehaa8 Co-authored-by: HazarathKumarM Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> * RPP Voxel 3D Tensor Add/Subtract scalar on HOST and HIP (#272) * added HOST support for voxel add kernel * added HIP support for voxel add kernel * added test suite support for add scalar * added Doxygen support and modified hip kernel function names as per new standard * added HOST support for voxel subtract kernel * added HIP support for voxel subtract kernel * added test suite support * updated the golden outputs for subtract with correct values * removed unnessary validation checks * Remove double spaces * Fix header * Fix all retval docs * Fix docs to add memory type * Fix comment * Add divider comment * Use post-increment efficiently * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * converted add and subtract scalar golden outputs to bin files * changed copyright from 2023 to 2024 * Update add_scalar.hpp license * Update subtract_scalar.hpp license --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM * removed unnecessary files * removed debugging print statement * updated copyright * updated description for resample based on latest changes * converted golden outputs for resample to binary files * Passed resampling window as a parameter to resampling function * RPP Magnitude on HOST and HIP (#278) * Initial commit - Magnitude HOST Tensor * Add QA reference outputs * Update runTests.py * Initial commit - Magnitude HIP Tensor * Add dual input support in testsuite * Optimize HOST kernel further * Optimize i8 datatype further * Modify comments * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * Bump rocm-docs-core[api_reference] from 0.31.0 to 0.33.0 in /docs/sphinx (#294) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.31.0 to 0.33.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.31.0...v0.33.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Update Copywright year * Combine templated functions to support all datatypes * Modify format of reference outputs * Update rppi_arithmetic_operations.h license * Update rppt_tensor_arithmetic_operations.h license * Update host_tensor_arithmetic_operations.hpp * Update magnitude.hpp license * Update hip_tensor_arithmetic_operations.hpp license * Delete magnitude_u8_Tensor_PKD3.csv * Delete magnitude_u8_Tensor_PLN1.csv * Delete magnitude_u8_Tensor_PLN3.csv * Update rpp_test_suite_common.h license * Update runTests.py license * Update Tensor_hip.cpp license * Update runTests.py license * Update Tensor_host.cpp license --------- Signed-off-by: dependabot[bot] Co-authored-by: Snehaa Giridharan Co-authored-by: HazarathKumarM Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> * removed unnecessary files removed unncessary validation checks in test suite * modified sinc to use ONE_OVER_6 macro * combined srcLength and channels into single tensor removed the usage of quality parameter since not used in the kernel * minor change * Bump rocm-docs-core[api_reference] from 0.34.0 to 0.34.2 in /docs/sphinx (#309) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.34.0 to 0.34.2. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.34.0...v0.34.2) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * RPP Tensor Audio Support - Down Mixing (#296) * Initial commit - Non slient region detection Includes unittest setup * Initial commit - To Decibels Includes unittest setup * Intial commit - pre_emphasis_filter * Intial commit - down_mixing * Replace vectors with arrays * Cleanup * Minor cleanup * Optimize downmixing Kernel Includes cleanup * Replace Rpp64s with Rpp32s * Cleanup * Optimize and precompute cutOff * Fix buffer used * Fix buffer used * Additional Cleanup * Optimize post incrmeent operation * Optimize post increment operation * Update testsuite for Audio * code cleanup * Add Readme file for Audio test suite * changes based on review comments * minor change * Remove unittest folders and updated README.md * Remove unit tests * minor change * code cleanup * added common header file for audio helper functions * removed unncessary audio wav files fixed bug in ROI updation for audio test suite resolved issue in summary generation for performance tests in python * removed log file * added doxygen support for audio * added doxygen changes for to_decibels * updated test suite support for to_decibels * minor change * added doxygen changes for preemphasis filter * updated changes for preemphasis filter in test suite * removed the usage of getMax function and used std::max_element * modularized code in test suite * merge with latest changes * minor change * minor change * minor change * resolved codacy warnings * Codacy fix - Remove unused cpuTime * CMakeLists - Version Update 1.5.0 - TOT Version * CHANGELOG Updates Version 1.5.0 placeholder * resolved issue with file_system dependency in test suite * Doxygen changes changed malloc to new in NSR kernel * RPP RICAP Tensor for HOST and HIP (#213) * Initial commit - Ricap HOST Tensor Includes testsuite changes * Add QA tests for RICAP Used three_images_224x224_src1 folder to create golden outputs * Add three_images_224x224_src1 into TEST_IMAGES * Support HIP Backend for RICAP * Fix HIP pkd3->pkd3 variant * regenerated golden outputs for RICAP minor changes in HOST shell script for handling RICAP in QA mode * minor bug fix in RICAP HIP kernels * Improve readability and Cleanup * Additional cleanup * Cleanup testsuite Includes new golden outputs * Additional testuite fixes * Minor cleanup * Fix codacy warnings * Address other codacy warnings * Update ricap.hpp with reference paper * Add RICAP dataset path in readme * Make changes to error codes returned * Modify roi crop region for unit and perf tests * RPP Tensor Water Augmentation on HOST and HIP (#181) * added water HOST and HIP codes * added water case in test suite * added golden outputs for water * added omp thread changes for water augmentation * experimental changes * fixed output issue with AVX2 instructions * added AVX2 support for PKD3 load function minor changes in PLN variant load functions * nwc commit - added avx2 changes for u8 layout toggle variants but need to add store functions for completion * Add Avx2 implementation for F32 and U8 toggle variants * Add AVX2 support for u8 pkd3-pln3 and i8 pkd3-pln3 for water augmentation * change F32 load and store logic * optimized the store function for F32 PLN3-PKD3 * reverted back irrelevant changes * minor change * optimized load and store functions for water U8 and F32 variants in host removed commented code * removed golden outputs for water * minor changes * renamed few functions and removed unused functions updated i8 pln1 load as per the optimized u8 pln1 load * fixed bug in i8 load function * changed cast to c++ style resolved spacing issues and added comments for AVX codes for better understanding made changes to handle cases where QA Tests are not supported * added golden outputs for water * updated golden outputs with latest changes * modified the u8, i8 pkd3-pln3 function and added comments for the vectorized code * fixed minor bug in I8 variants * made to changes to resolve codacy warnings * changed cast to c++ style in hip kernel * changed generic nn F32 loads using gather and setr instructions * added comments for latest changes * minor change * added definition for storing 32 and 64 bits from a 128bit register --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM * Fix build error * CMakeLists - Version Update 1.5.0 - TOT Version * CHANGELOG Updates Version 1.5.0 placeholder * Boost deps fix for test suite --------- Co-authored-by: Snehaa Giridharan Co-authored-by: sampath1117 Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> Co-authored-by: HazarathKumarM Co-authored-by: Kiriti Gowda * Documentation - Readme & changelog updates (#251) * readme and changelog updates for 6.0 * minor update * added ctests for audio test suite for CI made changes to add more clarity on the QA Tests results * Cmake mods for ctest * HOST-only build error bugfix * added qa mode paramter to python audio script added golden output map for QA testing of Non silent region detection * minor change * Documentation - Bump rocm-docs-core[api_reference] from 0.26.0 to 0.27.0 in /docs/sphinx (#253) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.26.0 to 0.27.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/RadeonOpenCompute/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.26.0...v0.27.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * RPP Resize Mirror Normalize Bugfix (#252) * added fix for hipMemset * remove pixel check for U8-F32 and U8-F16 for HOST codes --------- Co-authored-by: sampath1117 * added example for MMS calculation in comments for better understanding * Sphinx - updates (#257) * Sphinx - updates * Doxygen - Updates * Docs - Remove index.md * updated info used to for running audio test suite * removed bitdepth variable from audio test suite * added more information on computing NSR outputs in the example added * Fix doxygen for decibels Also removes extra QA reference files * move tensor_host_audio.cpp to host folder * Fix build errors and qa tests in Audio Test suite * Fix build errors and qa tests in Audio Test suite * Add reference output and test samples for downmix * Add down_mix in augmentation list and supported cases * Remove auto-merge repeated funcs * Improve clarity of header docs * Remove blank line * Improve clarity on header docs * Add Doxygen comments * minor change * converted golden outputs to binary file for downmixing * removed old golden output file for preemphasis and todecibels * modified info for downmixing as per new changes used handle memory for temporary buffers * formatting changes * moved the common code for SSE and AVX to outside * Update down_mixing.hpp license * Update rppt_tensor_audio_augmentations.h * combined the srcLength and channels tensors into single tensor --------- Signed-off-by: dependabot[bot] Co-authored-by: Snehaa Giridharan Co-authored-by: HazarathKumarM Co-authored-by: sampath1117 Co-authored-by: Kiriti Gowda Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> Co-authored-by: Lisa Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Sundarrajan98 * RPP Voxel 3D Tensor Multiply scalar on HOST and HIP (#306) * added HIP support for voxel scalar multiply kernel * added HOST support for voxel multiply kernel added golden outputs for voxel multiply kernel * merge with master * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * converted multiply scalar voxel golden outputs to bin files * changed copyright from 2023 to 2024 --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM * Test Suite Bugfix (#307) * experimental changes for adding qa mode for performance tests * made changes to add display more information w.r.t QA results summary for performance tests * minor changes * Add changes to dump qa results to excel file * Add performance QA for three new tensor functions * update prerequisites in readme * added changes to handle unsupported cases * removed treshold dictionary and added performance Noise treshold add new dataset for performance QA * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * Changes to the performane summary dataframe * minor changes * Update CMakeLists.txt to add ${CMAKE_CURRENT_SOURCE_DIR} for CI * Update CMakeLists.txt fix * Update CMakeLists.txt fix * remove tabulate dependency * Update README.md to remove tabulate pip install * Fix for CI machine failure * Add note on performance * Fix segmentation fault * Revert QAmode to restrict HIP bitdepths * Use Rpp64u for HOST while comparing outputs * Fix ambiguous abs call * Fix for SLES CI HIP fail - error: incompatible pointer types assigning to 'unsigned long *' from 'unsigned long long *' - refOutput = TensorSumReferenceOutputs[numChannels].data(); --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM Co-authored-by: Snehaa Giridharan Co-authored-by: Pavel Tcherniaev * used std functions for floor and ceil use static_cast instead of floor in the resample kernel * Bump rocm-docs-core[api_reference] from 0.34.2 to 0.35.0 in /docs/sphinx (#313) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.34.2 to 0.35.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.34.2...v0.35.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * RPP Reduction - Tensor min and Tensor max on HOST and HIP (#260) * Minor Change * Add Validation check for DST_FOLDER path * added water HOST and HIP codes * added water case in test suite * added golden outputs for water * Add Validation checks for all options in testAllScript.sh * Add sanity check for dual Input cases Set Max Dimension and Max Image Dump Replaced Fast DCT tag with Accurate DCT * Regenerate golden outputs using accurate dct Flag Add golden outputs for some new augmentations * Fix Flip golden outputs mismatch Fix PLN3 variants mismatch in QA mode * Add MAX_BATCH_SIZE check removed Augmentations function calls for failing Qa modes code cleanup * Add crop and gamma correction augmentations code cleanup * Add comments to functions in rpp_test_suite_common.h * minor change * code cleanup * minor code changes * Change roi and Image sizes for crop augmentation * Change numIterations option to numRuns Addressed PR comments * added omp thread changes for water augmentation * experimental changes * fixed output issue with AVX2 instructions * added AVX2 support for PKD3 load function minor changes in PLN variant load functions * Add turboJpeg header to update maxHeight and maxWidth values * nwc commit - added avx2 changes for u8 layout toggle variants but need to add store functions for completion * Change the performance Timings logic * Add Avx2 implementation for F32 and U8 toggle variants * minor change to support u8_f16 and u8_f32 cases * Regenerate LUT golden outputs with ACCURATE_DCT tag * Minor code changes * Add AVX2 support for u8 pkd3-pln3 and i8 pkd3-pln3 for water augmentation * Made changes to the runTests.py in Host to remove testAllScipts.sh * Made changes to the runTests.py in HIP to remove testAllScipts.sh * Initial commit - Image min and max Reduction kernel Includes * u8 datatype for both min and max HOST Tensor of all variants. * Testsuite changes. * NWC -initial code for min max PLN3 - PLN3 * made changes to split min and max kernels seperately * splitted kernels for min and max * made changes to print final max/min in the R,G,B channels * fixed inaccuracies in min/max computation * made changes to typecast intermediate output to output requested by user added comments for the code code cleanup and minor changes in test suite * fixed build issues removed image folders used for min, max and sum reverted unwanted file changes * minor changes in test suite * removed support for unwanted test case in Tensor_hip.cpp * Adds new option roi * remove testAllScripts.sh * Adds roi Option in HIP backend * Implement f32 variants * Implement f16 and i8 datatype variants * change F32 load and store logic * Add build flags in CMakeLists.txt to set AVX/SSE flags based on the system configuration * minor code changes * Initial commit - Image sum Reduction kernel Includes u8 PLN1 -> PLN1 conversion for HOST Tensor * Implement PKD3 and PLN3 for Image sum Tensor HOST * Support i8, f16 and f32 datatypes * Initial commit - Image sum Reduction HIP kernel Includes u8 PLN1 -> PLN1 conversion for Tensor * Implement PKD3 and PLN3 for Image sum Tensor HIP * Add support in testsuite Revert normalization for i8 HOST Tensor variants * Fix HIP testsuite Remove additional blanks for 1 channel output * Modify print statement in HIP testsuite * Improve readability for testsuite outputs * optimized the store function for F32 PLN3-PKD3 * reverted back irrelevant changes * minor change * Fix HIP to support larger inputs * optimized load and store functions for water U8 and F32 variants in host removed commented code * Cleanup * removed golden outputs for water * minor changes * Cleanup Support Reduction QA test in testsuite * renamed few functions and removed unused functions updated i8 pln1 load as per the optimized u8 pln1 load * fixed bug in i8 load function * Remove unused variables and C style casting * changed cast to c++ style resolved spacing issues and added comments for AVX codes for better understanding made changes to handle cases where QA Tests are not supported * added golden outputs for water * updated golden outputs with latest changes * modified the u8, i8 pkd3-pln3 function and added comments for the vectorized code * fixed minor bug in I8 variants * Optimize u8 datatype further * Fix static_cast * made to changes to resolve codacy warnings * changed cast to c++ style in hip kernel * Initial commit - Ricap HOST Tensor Includes testsuite changes * Add QA tests for RICAP Used three_images_224x224_src1 folder to create golden outputs * Add three_images_224x224_src1 into TEST_IMAGES * added rotate case with golden outputs changed generic bilinear HOST codes to match with HIP codes * Add golden output for remaining all tensor augmentations * fix python script issues * Optimize u8 and i8 datatype Uses uint and int internal processing instead of float * Fix testsuite build errors * minor change * Fix QA check * Modify api naming from image_sum to tensor_sum Includes changes for both HOST and HIP * Support HIP Backend for RICAP * change rcm and rmn golden outputs * Fix HIP pkd3->pkd3 variant * changes based on review comments * change test_suite folder to tests * Optimize u8 and i8 datatype of HIP Includes modification in naming of shared memory * minor fix * changed generic nn F32 loads using gather and setr instructions * Optimize and cleanup U8 HIP * regenerated golden outputs for RICAP minor changes in HOST shell script for handling RICAP in QA mode * minor bug fix in RICAP HIP kernels * Fix i8 datatype variants Includes cleanup * Fix the issues with color_to_greyscale * remove the empty folder creation * reverting back the folder name change * minor change * added comments for latest changes * minor change * Improve readability and Cleanup * Fix QA for HIP Includes cleanup * resolved review comments * minor change * Modify api naming from image_ to tensor_ for HOST * Add support for QA tests * removed range check for RMN U8-F32 and U8-F16 variants changed from hipMemset to hipMemsetAsync for RMN HIP Kernel removed multiplication by 255 for stdDev in RMN HOST U8-F16 and U8-F32 variants * Modify naming of shared memory with _smem in HIP Includes cleanup * Typecast and reuse markArr for HIP U8 and I8 * Cleanup and minor optimization * minor fix * fix codacy warnings * Additional cleanup * Cleanup and move #define * Changed the complexity of if statements in runTests.py * Cleanup testsuite Includes new golden outputs * Additional testuite fixes * Minor cleanup * Codacy fixes * Fix codacy warnings * Codacy fix * Address other codacy warnings * cleanup * Change Image functions to generic * Update ricap.hpp with reference paper * resolved minor issues happened with merge * minor changes * fixed minor issue with getting profiler times * minor formatting changes * resolved build issues in test suite renamed the min and max kernel file names * RPP RICAP Tensor for HOST and HIP (#213) * Initial commit - Ricap HOST Tensor Includes testsuite changes * Add QA tests for RICAP Used three_images_224x224_src1 folder to create golden outputs * Add three_images_224x224_src1 into TEST_IMAGES * Support HIP Backend for RICAP * Fix HIP pkd3->pkd3 variant * regenerated golden outputs for RICAP minor changes in HOST shell script for handling RICAP in QA mode * minor bug fix in RICAP HIP kernels * Improve readability and Cleanup * Additional cleanup * Cleanup testsuite Includes new golden outputs * Additional testuite fixes * Minor cleanup * Fix codacy warnings * Address other codacy warnings * Update ricap.hpp with reference paper * Add RICAP dataset path in readme * Make changes to error codes returned * Modify roi crop region for unit and perf tests * RPP Tensor Water Augmentation on HOST and HIP (#181) * added water HOST and HIP codes * added water case in test suite * added golden outputs for water * added omp thread changes for water augmentation * experimental changes * fixed output issue with AVX2 instructions * added AVX2 support for PKD3 load function minor changes in PLN variant load functions * nwc commit - added avx2 changes for u8 layout toggle variants but need to add store functions for completion * Add Avx2 implementation for F32 and U8 toggle variants * Add AVX2 support for u8 pkd3-pln3 and i8 pkd3-pln3 for water augmentation * change F32 load and store logic * optimized the store function for F32 PLN3-PKD3 * reverted back irrelevant changes * minor change * optimized load and store functions for water U8 and F32 variants in host removed commented code * removed golden outputs for water * minor changes * renamed few functions and removed unused functions updated i8 pln1 load as per the optimized u8 pln1 load * fixed bug in i8 load function * changed cast to c++ style resolved spacing issues and added comments for AVX codes for better understanding made changes to handle cases where QA Tests are not supported * added golden outputs for water * updated golden outputs with latest changes * modified the u8, i8 pkd3-pln3 function and added comments for the vectorized code * fixed minor bug in I8 variants * made to changes to resolve codacy warnings * changed cast to c++ style in hip kernel * changed generic nn F32 loads using gather and setr instructions * added comments for latest changes * minor change * added definition for storing 32 and 64 bits from a 128bit register --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM * Fix build error * CMakeLists - Version Update 1.5.0 - TOT Version * CHANGELOG Updates Version 1.5.0 placeholder * Boost deps fix for test suite --------- Co-authored-by: Snehaa Giridharan Co-authored-by: sampath1117 Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> Co-authored-by: HazarathKumarM Co-authored-by: Kiriti Gowda * Documentation - Readme & changelog updates (#251) * readme and changelog updates for 6.0 * minor update * Documentation - Bump rocm-docs-core[api_reference] from 0.26.0 to 0.27.0 in /docs/sphinx (#253) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.26.0 to 0.27.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/RadeonOpenCompute/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.26.0...v0.27.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * RPP Resize Mirror Normalize Bugfix (#252) * added fix for hipMemset * remove pixel check for U8-F32 and U8-F16 for HOST codes --------- Co-authored-by: sampath1117 * Cmake fix to prevent warning * Fix paths in new python scripts * Sphinx - updates (#257) * Sphinx - updates * Doxygen - Updates * Docs - Remove index.md * Test suite fixes after tensor_min / tensor_max HOST merge * Fix max case * QA tests fix for hip and host * naming convention changes as per new std * Substitute imagePartial with partial * Substitute imageMin/imageMax with min/max * Replace hipMemset with hipMemsetAsync, and replace hipDeviceSynchronize with hipStreamSynchronize * Use variable instead of batchCount*4 * Use post increment effectivly * Resolve codacy warnings * Additional cleanup * remove unused variable * Documentation - Bump rocm-docs-core[api_reference] from 0.28.0 to 0.29.0 in /docs/sphinx (#265) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.28.0 to 0.29.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/RadeonOpenCompute/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.28.0...v0.29.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Remove auto merge boost * Spaces formatting * Bump rocm-docs-core[api_reference] from 0.29.0 to 0.30.1 in /docs/sphinx (#268) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.29.0 to 0.30.1. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/RadeonOpenCompute/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.29.0...v0.30.1) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * add support for mi300 (#269) * Documentation - Bump rocm-docs-core[api_reference] from 0.30.1 to 0.30.2 in /docs/sphinx (#273) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.30.1 to 0.30.2. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/RadeonOpenCompute/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.30.1...v0.30.2) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Cleanup by removing oneliner functions as inline * RPP Tensor Audio Support - To Decibels (#258) * Initial commit - Non slient region detection Includes unittest setup * Initial commit - To Decibels Includes unittest setup * Replace vectors with arrays * Cleanup * Replace Rpp64s with Rpp32s * Optimize and precompute cutOff * Fix buffer used * Fix buffer used * Additional Cleanup * Update testsuite for Audio * code cleanup * Add Readme file for Audio test suite * changes based on review comments * minor change * Remove unittest folders and updated README.md * Remove unit tests * minor change * code cleanup * added common header file for audio helper functions * removed unncessary audio wav files fixed bug in ROI updation for audio test suite resolved issue in summary generation for performance tests in python * removed log file * added doxygen support for audio * added doxygen changes for to_decibels * updated test suite support for to_decibels * minor change * removed the usage of getMax function and used std::max_element * modularized code in test suite * merge with latest changes * minor change * minor change * resolved codacy warnings * Codacy fix - Remove unused cpuTime * CMakeLists - Version Update 1.5.0 - TOT Version * CHANGELOG Updates Version 1.5.0 placeholder * resolved issue with file_system dependency in test suite * Doxygen changes changed malloc to new in NSR kernel * RPP RICAP Tensor for HOST and HIP (#213) * Initial commit - Ricap HOST Tensor Includes testsuite changes * Add QA tests for RICAP Used three_images_224x224_src1 folder to create golden outputs * Add three_images_224x224_src1 into TEST_IMAGES * Support HIP Backend for RICAP * Fix HIP pkd3->pkd3 variant * regenerated golden outputs for RICAP minor changes in HOST shell script for handling RICAP in QA mode * minor bug fix in RICAP HIP kernels * Improve readability and Cleanup * Additional cleanup * Cleanup testsuite Includes new golden outputs * Additional testuite fixes * Minor cleanup * Fix codacy warnings * Address other codacy warnings * Update ricap.hpp with reference paper * Add RICAP dataset path in readme * Make changes to error codes returned * Modify roi crop region for unit and perf tests * RPP Tensor Water Augmentation on HOST and HIP (#181) * added water HOST and HIP codes * added water case in test suite * added golden outputs for water * added omp thread changes for water augmentation * experimental changes * fixed output issue with AVX2 instructions * added AVX2 support for PKD3 load function minor changes in PLN variant load functions * nwc commit - added avx2 changes for u8 layout toggle variants but need to add store functions for completion * Add Avx2 implementation for F32 and U8 toggle variants * Add AVX2 support for u8 pkd3-pln3 and i8 pkd3-pln3 for water augmentation * change F32 load and store logic * optimized the store function for F32 PLN3-PKD3 * reverted back irrelevant changes * minor change * optimized load and store functions for water U8 and F32 variants in host removed commented code * removed golden outputs for water * minor changes * renamed few functions and removed unused functions updated i8 pln1 load as per the optimized u8 pln1 load * fixed bug in i8 load function * changed cast to c++ style resolved spacing issues and added comments for AVX codes for better understanding made changes to handle cases where QA Tests are not supported * added golden outputs for water * updated golden outputs with latest changes * modified the u8, i8 pkd3-pln3 function and added comments for the vectorized code * fixed minor bug in I8 variants * made to changes to resolve codacy warnings * changed cast to c++ style in hip kernel * changed generic nn F32 loads using gather and setr instructions * added comments for latest changes * minor change * added definition for storing 32 and 64 bits from a 128bit register --------- Co-authored-by: sampath1117 Co-authored-by: HazarathKumarM * Fix build error * CMakeLists - Version Update 1.5.0 - TOT Version * CHANGELOG Updates Version 1.5.0 placeholder * Boost deps fix for test suite --------- Co-authored-by: Snehaa Giridharan Co-authored-by: sampath1117 Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> Co-authored-by: HazarathKumarM Co-authored-by: Kiriti Gowda * Documentation - Readme & changelog updates (#251) * readme and changelog updates for 6.0 * minor update * added ctests for audio test suite for CI made changes to add more clarity on the QA Tests results * Cmake mods for ctest * HOST-only build error bugfix * added qa mode paramter to python audio script added golden output map for QA testing of Non silent region detection * minor change * Documentation - Bump rocm-docs-core[api_reference] from 0.26.0 to 0.27.0 in /docs/sphinx (#253) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.26.0 to 0.27.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/RadeonOpenCompute/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.26.0...v0.27.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * RPP Resize Mirror Normalize Bugfix (#252) * added fix for hipMemset * remove pixel check for U8-F32 and U8-F16 for HOST codes --------- Co-authored-by: sampath1117 * added example for MMS calculation in comments for better understanding * Sphinx - updates (#257) * Sphinx - updates * Doxygen - Updates * Docs - Remove index.md * updated info used to for running audio test suite * removed bitdepth variable from audio test suite * added more information on computing NSR outputs in the example added * Fix doxygen for decibels Also removes extra QA reference files * Fix build errors and qa tests in Audio Test suite * Remove auto-merge repeated funcs * Improve clarity on header docs * made changes based on review comments * stored golden outputs of to_decibels in binary file removed golden output text files for non silent region * removed unused parameter in verify_output function * updated list of cases supported in python script * added error handling for opening golden output file * Codacy fix and tests warning fix * Codacy fix * Codacy fix trial * codacy fix for checking boundaries of fstream --------- Signed-off-by: dependabot[bot] Co-authored-by: Snehaa Giridharan Co-authored-by: HazarathKumarM Co-authored-by: sampath1117 Co-authored-by: Kiriti Gowda Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> Co-authored-by: Lisa Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Documentation - Bump rocm-docs-core[api_reference] from 0.30.2 to 0.30.3 in /docs/sphinx (#274) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.30.2 to 0.30.3. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/RadeonOpenCompute/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.30.2...v0.30.3) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Adding issue template (#270) * Add files via upload * added ROCm v6, MI300, default component * Fix cast used in testsuite Includes minor fixes * Fix displaying f16 outputs * Optimize HOST min/max reduce function further * Fix spacing in HIP kernels * Fix PLN1 outputs for u8 and i8 datatypes of HOST backend * RPP Test Suite Upgrade 4 - CSV to BIN conversions for file size reduction (#293) * change golden outputs from .csv files to .bin files * Changed comparision funtions to use .bin files * Address review comments * minor change * Address review comments * minor change --------- Co-authored-by: HazarathKumarM * Bump rocm-docs-core[api_reference] from 0.31.0 to 0.33.0 in /docs/sphinx (#294) Bumps [rocm-docs-core[api_reference]](https://github.com/RadeonOpenCompute/rocm-docs-core) from 0.31.0 to 0.33.0. - [Release notes](https://github.com/RadeonOpenCompute/rocm-docs-core/releases) - [Changelog](https://github.com/ROCm/rocm-docs-core/blob/develop/CHANGELOG.md) - [Commits](https://github.com/RadeonOpenCompute/rocm-docs-core/compare/v0.31.0...v0.33.0) --- updated-dependencies: - dependency-name: rocm-docs-core[api_reference] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Store reference outputs via map for min and max kernels * Update tensor_max.hpp license * Update tensor_min.hpp license * Fix output comparison check * Merge branch 'ar/opt_tensor_min_tensor_max' of https://github.com/r-abishek/rpp into sn/tensor_min_max * Modify exit condition used in outer most kernel * Modify srcIdx for HIP Tensor min * Using maximum as 255 for HIP Tensor min * Modify srcIdx for HIP Tensor max kernel Also fixes build error in testsuite * Fix corrupted outputs displayed for Tensor sum * Fix corruption issue seen with tensor sum kernel * Fix minimum for I8 Tensor max kernel * Modified HIP buffer initialization with a common function * Fix redefinition * Remove additional variables xAlignedLength * Remove unwanted xAlignedLength and xDiff * Remove redefinition of TensorSumReferenceOutputs * Fix for CI issue * Add parenthesis --------- Signed-off-by: dependabot[bot] Co-authored-by: HazarathKumarM Co-authored-by: sampath1117 Co-authored-by: Snehaa Giridharan Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> Co-authored-by: fiona-gladwin Co-authored-by: Kiriti Gowda Co-authored-by: Lisa Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Lakshmi Kumar Co-authored-by: abhimeda <138710508+abhimeda@users.noreply.github.com> * CI - Update precheckin.groovy * Png update (#316) * PNG file conversion * reference .png files * remove JPG files * edit IMAGE_PATH * RPP Test Suite Upgrade 6 - Restructure common HIP/HOST code (#315) * moved the common functions used in a python test suites to to a common python script created helper function for displaying QA test summary * reversed the order of performance runs loop and decode loop in all test suites * modified remaining python scripts to use print qa helper function for displaying QA results * added new helper function for print the performance test results as a summary * added caseMax, caseMin variables in image test suite made changes to run only necessary bitdepths needed incase of qa mode --------- Co-authored-by: sampath1117 * Fix build error * removed outBegin variable * remove duplicate line in readme --------- Signed-off-by: dependabot[bot] Co-authored-by: Snehaa Giridharan Co-authored-by: HazarathKumarM Co-authored-by: sampath1117 Co-authored-by: Kiriti Gowda Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> Co-authored-by: Lisa Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Sundarrajan98 Co-authored-by: Sam Wu Co-authored-by: Pavel Tcherniaev Co-authored-by: fiona-gladwin Co-authored-by: Lakshmi Kumar Co-authored-by: abhimeda <138710508+abhimeda@users.noreply.github.com> Co-authored-by: randyh62 <42045079+randyh62@users.noreply.github.com> * Docs - Missing input and output images for Doxygen (#331) * added missing outputs for image augmentations modified the description with correct output names * added gif for voxel input and outputs * modified the output images for water, resize_crop_mirror and resize_mirror_normalize --------- Co-authored-by: sampath1117 * Scratch buffers rename for HOST and HIP (#324) * Change all maskArr to scratchBufferHip * Change all tempFloatmem to scratchBufferHost * Update CMakeLists.txt Version updates * Minor build fix * Update CMakeLists.txt Version Upgrade * Introduce NFT and NTF layouts for audio kernels * Set layout for spectrogram and melfilterbank directly in testsuite * Remove extra blank line in testsuite * Add parentheses * Optimizations and cleanup --------- Signed-off-by: dependabot[bot] Co-authored-by: Snehaa Giridharan Co-authored-by: HazarathKumarM Co-authored-by: sampath1117 Co-authored-by: Kiriti Gowda Co-authored-by: Snehaa-Giridharan <118163708+snehaa8@users.noreply.github.com> Co-authored-by: Lisa Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Sundarrajan98 Co-authored-by: Sam Wu Co-authored-by: Pavel Tcherniaev Co-authored-by: fiona-gladwin Co-authored-by: Lakshmi Kumar Co-authored-by: abhimeda <138710508+abhimeda@users.noreply.github.com> Co-authored-by: randyh62 <42045079+randyh62@users.noreply.github.com> --- include/rppdefs.h | 20 +- include/rppt_tensor_audio_augmentations.h | 20 ++ .../cpu/host_tensor_audio_augmentations.hpp | 1 + src/modules/cpu/kernel/mel_filter_bank.hpp | 252 ++++++++++++++++++ .../rppt_tensor_audio_augmentations.cpp | 40 +++ .../test_suite/HOST/Tensor_host_audio.cpp | 54 +++- utilities/test_suite/HOST/runAudioTests.py | 8 +- utilities/test_suite/HOST/runTests.py | 1 - .../mel_filter_bank/mel_filter_bank.bin | Bin 0 -> 216000 bytes utilities/test_suite/rpp_test_suite_audio.h | 47 +++- 10 files changed, 431 insertions(+), 12 deletions(-) create mode 100644 src/modules/cpu/kernel/mel_filter_bank.hpp create mode 100644 utilities/test_suite/REFERENCE_OUTPUTS_AUDIO/mel_filter_bank/mel_filter_bank.bin diff --git a/include/rppdefs.h b/include/rppdefs.h index d35f82bfd..f7cd7a711 100644 --- a/include/rppdefs.h +++ b/include/rppdefs.h @@ -369,10 +369,13 @@ typedef enum */ typedef enum { - NCHW, - NHWC, - NCDHW, - NDHWC + NCHW, // BatchSize-Channels-Height-Width + NHWC, // BatchSize-Height-Width-Channels + NCDHW, // BatchSize-Channels-Depth-Height-Width + NDHWC, // BatchSize-Depth-Height-Width-Channels + NHW, // BatchSize-Height-Width + NFT, // BatchSize-Frequency-Time -> Frequency Major used for Spectrogram / MelfilterBank + NTF // BatchSize-Time-Frequency -> Time Major used for Spectrogram / MelfilterBank } RpptLayout; /*! \brief RPPT Tensor 2D ROI type enum @@ -434,6 +437,15 @@ typedef enum TF, //Time Major } RpptSpectrogramLayout; +/*! \brief RPPT Mel Scale Formula + * \ingroup group_rppdefs + */ +typedef enum +{ + SLANEY = 0, // Follows Slaney’s MATLAB Auditory Modelling Work behavior + HTK, // Follows O’Shaughnessy’s book formula, consistent with Hidden Markov Toolkit(HTK), m = 2595 * log10(1 + (f/700)) +} RpptMelScaleFormula; + /*! \brief RPPT Tensor 2D ROI LTRB struct * \ingroup group_rppdefs */ diff --git a/include/rppt_tensor_audio_augmentations.h b/include/rppt_tensor_audio_augmentations.h index 4e5f412db..13259cd22 100644 --- a/include/rppt_tensor_audio_augmentations.h +++ b/include/rppt_tensor_audio_augmentations.h @@ -132,6 +132,26 @@ RppStatus rppt_down_mixing_host(RppPtr_t srcPtr, RpptDescPtr srcDescPtr, RppPtr_ */ RppStatus rppt_spectrogram_host(RppPtr_t srcPtr, RpptDescPtr srcDescPtr, RppPtr_t dstPtr, RpptDescPtr dstDescPtr, Rpp32s *srcLengthTensor, bool centerWindows, bool reflectPadding, Rpp32f *windowFunction, Rpp32s nfft, Rpp32s power, Rpp32s windowLength, Rpp32s windowStep, RpptSpectrogramLayout layout, rppHandle_t rppHandle); +/*! \brief Mel filter bank augmentation HOST backend + * \details Mel filter bank augmentation for audio data + * \param[in] srcPtr source tensor in HOST memory + * \param[in] srcDescPtr source tensor descriptor (Restrictions - numDims = 3, offsetInBytes >= 0, dataType = F32, layout - NFT / NTF) + * \param[out] dstPtr destination tensor in HOST memory + * \param[in] dstDescPtr destination tensor descriptor (Restrictions - numDims = 3, offsetInBytes >= 0, dataType = F32, layout - NFT / NTF) + * \param[in] srcDimsTensor source audio buffer length and number of channels (1D tensor in HOST memory, of size batchSize * 2) + * \param[in] maxFreq maximum frequency if not provided maxFreq = sampleRate / 2 + * \param[in] minFreq minimum frequency + * \param[in] melFormula formula used to convert frequencies from hertz to mel and from mel to hertz (SLANEY / HTK) + * \param[in] numFilter number of mel filters + * \param[in] sampleRate sampling rate of the audio + * \param[in] normalize boolean variable that determine whether to normalize weights / not + * \param[in] rppHandle RPP HOST handle created with \ref rppCreateWithBatchSize() + * \return A \ref RppStatus enumeration. + * \retval RPP_SUCCESS Successful completion. + * \retval RPP_ERROR* Unsuccessful completion. + */ +RppStatus rppt_mel_filter_bank_host(RppPtr_t srcPtr, RpptDescPtr srcDescPtr, RppPtr_t dstPtr, RpptDescPtr dstDescPtr, Rpp32s *srcDims, Rpp32f maxFreq, Rpp32f minFreq, RpptMelScaleFormula melFormula, Rpp32s numFilter, Rpp32f sampleRate, bool normalize, rppHandle_t rppHandle); + /*! \brief Resample augmentation on HOST backend * \details Resample augmentation for audio data * \param[in] srcPtr source tensor in HOST memory diff --git a/src/modules/cpu/host_tensor_audio_augmentations.hpp b/src/modules/cpu/host_tensor_audio_augmentations.hpp index e38d2d843..82d43d082 100644 --- a/src/modules/cpu/host_tensor_audio_augmentations.hpp +++ b/src/modules/cpu/host_tensor_audio_augmentations.hpp @@ -30,6 +30,7 @@ SOFTWARE. #include "kernel/pre_emphasis_filter.hpp" #include "kernel/down_mixing.hpp" #include "kernel/spectrogram.hpp" +#include "kernel/mel_filter_bank.hpp" #include "kernel/resample.hpp" #endif // HOST_TENSOR_AUDIO_AUGMENTATIONS_HPP \ No newline at end of file diff --git a/src/modules/cpu/kernel/mel_filter_bank.hpp b/src/modules/cpu/kernel/mel_filter_bank.hpp new file mode 100644 index 000000000..9cc6d26d2 --- /dev/null +++ b/src/modules/cpu/kernel/mel_filter_bank.hpp @@ -0,0 +1,252 @@ +/* +MIT License + +Copyright (c) 2019 - 2024 Advanced Micro Devices, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +#include "rppdefs.h" +#include "rpp_cpu_simd.hpp" +#include "rpp_cpu_common.hpp" + +struct BaseMelScale +{ + public: + virtual Rpp32f hz_to_mel(Rpp32f hz) = 0; + virtual Rpp32f mel_to_hz(Rpp32f mel) = 0; + virtual ~BaseMelScale() = default; +}; + +struct HtkMelScale : public BaseMelScale +{ + Rpp32f hz_to_mel(Rpp32f hz) { return 1127.0f * std::log(1.0f + (hz / 700.0f)); } + Rpp32f mel_to_hz(Rpp32f mel) { return 700.0f * (std::exp(mel / 1127.0f) - 1.0f); } + public: + ~HtkMelScale() {}; +}; + +struct SlaneyMelScale : public BaseMelScale +{ + const Rpp32f freqLow = 0; + const Rpp32f fsp = 200.0 / 3.0; + const Rpp32f minLogHz = 1000.0; + const Rpp32f minLogMel = (minLogHz - freqLow) / fsp; + const Rpp32f stepLog = 0.068751777; // Equivalent to std::log(6.4) / 27.0; + + const Rpp32f invMinLogHz = 1.0f / 1000.0; + const Rpp32f invStepLog = 1.0f / stepLog; + const Rpp32f invFsp = 1.0f / fsp; + + Rpp32f hz_to_mel(Rpp32f hz) + { + Rpp32f mel = 0.0f; + if (hz >= minLogHz) + mel = minLogMel + std::log(hz * invMinLogHz) * invStepLog; + else + mel = (hz - freqLow) * invFsp; + + return mel; + } + + Rpp32f mel_to_hz(Rpp32f mel) + { + Rpp32f hz = 0.0f; + if (mel >= minLogMel) + hz = minLogHz * std::exp(stepLog * (mel - minLogMel)); + else + hz = freqLow + mel * fsp; + return hz; + } + public: + ~SlaneyMelScale() {}; +}; + +RppStatus mel_filter_bank_host_tensor(Rpp32f *srcPtr, + RpptDescPtr srcDescPtr, + Rpp32f *dstPtr, + RpptDescPtr dstDescPtr, + Rpp32s *srcDimsTensor, + Rpp32f maxFreqVal, // check unused + Rpp32f minFreqVal, + RpptMelScaleFormula melFormula, + Rpp32s numFilter, + Rpp32f sampleRate, + bool normalize, + rpp::Handle& handle) +{ + BaseMelScale *melScalePtr; + switch(melFormula) + { + case RpptMelScaleFormula::HTK: + melScalePtr = new HtkMelScale; + break; + case RpptMelScaleFormula::SLANEY: + default: + melScalePtr = new SlaneyMelScale(); + break; + } + Rpp32u numThreads = handle.GetNumThreads(); + Rpp32u batchSize = srcDescPtr->n; + Rpp32f *scratchMem = handle.GetInitHandle()->mem.mcpu.scratchBufferHost; + + Rpp32f maxFreq = sampleRate / 2; + Rpp32f minFreq = minFreqVal; + + // Convert lower, higher frequencies to mel scale and find melStep + Rpp64f melLow = melScalePtr->hz_to_mel(minFreq); + Rpp64f melHigh = melScalePtr->hz_to_mel(maxFreq); + Rpp64f melStep = (melHigh - melLow) / (numFilter + 1); + + omp_set_dynamic(0); +#pragma omp parallel for num_threads(numThreads) + for(int batchCount = 0; batchCount < batchSize; batchCount++) + { + Rpp32f *srcPtrTemp = srcPtr + batchCount * srcDescPtr->strides.nStride; + Rpp32f *dstPtrTemp = dstPtr + batchCount * dstDescPtr->strides.nStride; + + // Extract nfft, number of Frames, numBins + Rpp32s nfft = (srcDimsTensor[batchCount * 2] - 1) * 2; + Rpp32s numBins = nfft / 2 + 1; + Rpp32s numFrames = srcDimsTensor[batchCount * 2 + 1]; + + // Find hzStep + Rpp64f hzStep = static_cast(sampleRate) / nfft; + Rpp64f invHzStep = 1.0 / hzStep; + + // Find fftBinStart and fftBinEnd + Rpp32s fftBinStart = std::ceil(minFreq * invHzStep); + Rpp32s fftBinEnd = std::ceil(maxFreq * invHzStep); + fftBinEnd = std::min(fftBinEnd, numBins); + + // Set/Fill normFactors, weightsDown and intervals + Rpp32f *normFactors = scratchMem + (batchCount * numFilter); + std::fill(normFactors, normFactors + numFilter, 1.f); // normFactors contain numFilter values of type float + Rpp32f *weightsDown = scratchMem + (batchSize * numFilter) + (batchCount * numBins); + memset(weightsDown, 0, sizeof(numBins * sizeof(Rpp32f))); // weightsDown contain numBins values of type float + Rpp32s *intervals = reinterpret_cast(weightsDown + (batchSize * numBins)); + std::fill(intervals, intervals + numBins, -1); // intervals contain numBins values of type integer + + Rpp32s fftBin = fftBinStart; + Rpp64f mel0 = melLow, mel1 = melLow + melStep; + Rpp64f fIter = fftBin * hzStep; + for (int interval = 0; interval < numFilter + 1; interval++, mel0 = mel1, mel1 += melStep) + { + Rpp64f f0 = melScalePtr->mel_to_hz(mel0); + Rpp64f f1 = melScalePtr->mel_to_hz(interval == numFilter ? melHigh : mel1); + Rpp64f slope = 1. / (f1 - f0); + + if (normalize && interval < numFilter) + { + Rpp64f f2 = melScalePtr->mel_to_hz(mel1 + melStep); + normFactors[interval] = 2.0 / (f2 - f0); + } + + for (; fftBin < fftBinEnd && fIter < f1; fftBin++, fIter = fftBin * hzStep) + { + weightsDown[fftBin] = (f1 - fIter) * slope; + intervals[fftBin] = interval; + } + } + + Rpp32u maxFrames = std::min(static_cast(numFrames + 8), dstDescPtr->strides.hStride); + Rpp32u maxAlignedLength = maxFrames & ~7; + Rpp32u vectorIncrement = 8; + + // Set ROI values in dst buffer to 0.0 + for(int i = 0; i < numFilter; i++) + { + Rpp32f *dstPtrRow = dstPtrTemp + i * dstDescPtr->strides.hStride; + Rpp32u vectorLoopCount = 0; + for(; vectorLoopCount < maxAlignedLength; vectorLoopCount += 8) + { + _mm256_storeu_ps(dstPtrRow, avx_p0); + dstPtrRow += 8; + } + for(; vectorLoopCount < maxFrames; vectorLoopCount++) + *dstPtrRow++ = 0.0f; + } + + Rpp32u alignedLength = numFrames & ~7; + __m256 pSrc, pDst; + Rpp32f *srcRowPtr = srcPtrTemp + fftBinStart * srcDescPtr->strides.hStride; + for (int64_t fftBin = fftBinStart; fftBin < fftBinEnd; fftBin++) + { + auto filterUp = intervals[fftBin]; + auto weightUp = 1.0f - weightsDown[fftBin]; + auto filterDown = filterUp - 1; + auto weightDown = weightsDown[fftBin]; + + if (filterDown >= 0) + { + Rpp32f *dstRowPtrTemp = dstPtrTemp + filterDown * dstDescPtr->strides.hStride; + Rpp32f *srcRowPtrTemp = srcRowPtr; + + if (normalize) + weightDown *= normFactors[filterDown]; + __m256 pWeightDown = _mm256_set1_ps(weightDown); + + int vectorLoopCount = 0; + for(; vectorLoopCount < alignedLength; vectorLoopCount += vectorIncrement) + { + pSrc = _mm256_loadu_ps(srcRowPtrTemp); + pSrc = _mm256_mul_ps(pSrc, pWeightDown); + pDst = _mm256_loadu_ps(dstRowPtrTemp); + pDst = _mm256_add_ps(pDst, pSrc); + _mm256_storeu_ps(dstRowPtrTemp, pDst); + dstRowPtrTemp += vectorIncrement; + srcRowPtrTemp += vectorIncrement; + } + + for (; vectorLoopCount < numFrames; vectorLoopCount++) + (*dstRowPtrTemp++) += weightDown * (*srcRowPtrTemp++); + } + + if (filterUp >= 0 && filterUp < numFilter) + { + Rpp32f *dstRowPtrTemp = dstPtrTemp + filterUp * dstDescPtr->strides.hStride; + Rpp32f *srcRowPtrTemp = srcRowPtr; + + if (normalize) + weightUp *= normFactors[filterUp]; + __m256 pWeightUp = _mm256_set1_ps(weightUp); + + int vectorLoopCount = 0; + for(; vectorLoopCount < alignedLength; vectorLoopCount += vectorIncrement) + { + pSrc = _mm256_loadu_ps(srcRowPtrTemp); + pSrc = _mm256_mul_ps(pSrc, pWeightUp); + pDst = _mm256_loadu_ps(dstRowPtrTemp); + pDst = _mm256_add_ps(pDst, pSrc); + _mm256_storeu_ps(dstRowPtrTemp, pDst); + dstRowPtrTemp += vectorIncrement; + srcRowPtrTemp += vectorIncrement; + } + + for (; vectorLoopCount < numFrames; vectorLoopCount++) + (*dstRowPtrTemp++) += weightUp * (*srcRowPtrTemp++); + } + + srcRowPtr += srcDescPtr->strides.hStride; + } + } + delete melScalePtr; + + return RPP_SUCCESS; +} diff --git a/src/modules/rppt_tensor_audio_augmentations.cpp b/src/modules/rppt_tensor_audio_augmentations.cpp index e20211ec1..bafaf93fb 100644 --- a/src/modules/rppt_tensor_audio_augmentations.cpp +++ b/src/modules/rppt_tensor_audio_augmentations.cpp @@ -197,6 +197,46 @@ RppStatus rppt_spectrogram_host(RppPtr_t srcPtr, } } +/******************** mel_filter_bank ********************/ + +RppStatus rppt_mel_filter_bank_host(RppPtr_t srcPtr, + RpptDescPtr srcDescPtr, + RppPtr_t dstPtr, + RpptDescPtr dstDescPtr, + Rpp32s* srcDimsTensor, + Rpp32f maxFreq, + Rpp32f minFreq, + RpptMelScaleFormula melFormula, + Rpp32s numFilter, + Rpp32f sampleRate, + bool normalize, + rppHandle_t rppHandle) +{ + if (srcDescPtr->layout != RpptLayout::NFT) return RPP_ERROR_INVALID_SRC_LAYOUT; + if (dstDescPtr->layout != RpptLayout::NFT) return RPP_ERROR_INVALID_DST_LAYOUT; + + if ((srcDescPtr->dataType == RpptDataType::F32) && (dstDescPtr->dataType == RpptDataType::F32)) + { + mel_filter_bank_host_tensor(static_cast(srcPtr), + srcDescPtr, + static_cast(dstPtr), + dstDescPtr, + srcDimsTensor, + maxFreq, + minFreq, + melFormula, + numFilter, + sampleRate, + normalize, + rpp::deref(rppHandle)); + return RPP_SUCCESS; + } + else + { + return RPP_ERROR_NOT_IMPLEMENTED; + } +} + /******************** resample ********************/ RppStatus rppt_resample_host(RppPtr_t srcPtr, diff --git a/utilities/test_suite/HOST/Tensor_host_audio.cpp b/utilities/test_suite/HOST/Tensor_host_audio.cpp index ac05bcc90..6f2b888c4 100644 --- a/utilities/test_suite/HOST/Tensor_host_audio.cpp +++ b/utilities/test_suite/HOST/Tensor_host_audio.cpp @@ -31,7 +31,7 @@ int main(int argc, char **argv) if (argc < MIN_ARG_COUNT) { printf("\nImproper Usage! Needs all arguments!\n"); - printf("\nUsage: ./Tensor_host_audio \n"); + printf("\nUsage: ./Tensor_host_audio \n"); return -1; } @@ -144,7 +144,7 @@ int main(int argc, char **argv) int noOfIterations = (int)audioNames.size() / batchSize; double maxWallTime = 0, minWallTime = 500, avgWallTime = 0; string testCaseName; - printf("\nRunning %s %d times (each time with a batch size of %d images) and computing mean statistics...", func.c_str(), numRuns, batchSize); + printf("\nRunning %s %d times (each time with a batch size of %d audio files) and computing mean statistics...", func.c_str(), numRuns, batchSize); for (int iterCount = 0; iterCount < noOfIterations; iterCount++) { // read and decode audio and fill the audio dim values @@ -348,6 +348,56 @@ int main(int argc, char **argv) break; } + case 7: + { + testCaseName = "mel_filter_bank"; + + Rpp32f sampleRate = 16000; + Rpp32f minFreq = 0.0; + Rpp32f maxFreq = sampleRate / 2; + RpptMelScaleFormula melFormula = RpptMelScaleFormula::SLANEY; + Rpp32s numFilter = 80; + bool normalize = true; + Rpp32s srcDimsTensor[] = {257, 225, 257, 211, 257, 214}; // (height, width) for each tensor in a batch for given QA inputs. + // Accepts outputs from FT layout of Spectrogram for QA + srcDescPtr->layout = dstDescPtr->layout = RpptLayout::NFT; + + maxDstHeight = 0; + maxDstWidth = 0; + maxSrcHeight = 0; + maxSrcWidth = 0; + for(int i = 0, j = 0; i < batchSize; i++, j += 2) + { + maxSrcHeight = std::max(maxSrcHeight, (int)srcDimsTensor[j]); + maxSrcWidth = std::max(maxSrcWidth, (int)srcDimsTensor[j + 1]); + dstDims[i].height = numFilter; + dstDims[i].width = srcDimsTensor[j + 1]; + maxDstHeight = std::max(maxDstHeight, (int)dstDims[i].height); + maxDstWidth = std::max(maxDstWidth, (int)dstDims[i].width); + } + + srcDescPtr->h = maxSrcHeight; + srcDescPtr->w = maxSrcWidth; + dstDescPtr->h = maxDstHeight; + dstDescPtr->w = maxDstWidth; + + set_audio_descriptor_dims_and_strides_nostriding(srcDescPtr, batchSize, maxSrcHeight, maxSrcWidth, maxSrcChannels, offsetInBytes); + set_audio_descriptor_dims_and_strides_nostriding(dstDescPtr, batchSize, maxDstHeight, maxDstWidth, maxDstChannels, offsetInBytes); + + // Set buffer sizes for src/dst + unsigned long long spectrogramBufferSize = (unsigned long long)srcDescPtr->h * (unsigned long long)srcDescPtr->w * (unsigned long long)srcDescPtr->c * (unsigned long long)srcDescPtr->n; + unsigned long long melFilterBufferSize = (unsigned long long)dstDescPtr->h * (unsigned long long)dstDescPtr->w * (unsigned long long)dstDescPtr->c * (unsigned long long)dstDescPtr->n; + inputf32 = (Rpp32f *)realloc(inputf32, spectrogramBufferSize * sizeof(Rpp32f)); + outputf32 = (Rpp32f *)realloc(outputf32, melFilterBufferSize * sizeof(Rpp32f)); + + // Read source data + read_from_bin_file(inputf32, srcDescPtr, srcDimsTensor, "spectrogram", scriptPath); + + startWallTime = omp_get_wtime(); + rppt_mel_filter_bank_host(inputf32, srcDescPtr, outputf32, dstDescPtr, srcDimsTensor, maxFreq, minFreq, melFormula, numFilter, sampleRate, normalize, handle); + + break; + } default: { missingFuncFlag = 1; diff --git a/utilities/test_suite/HOST/runAudioTests.py b/utilities/test_suite/HOST/runAudioTests.py index dec6ffa9c..94bd15251 100644 --- a/utilities/test_suite/HOST/runAudioTests.py +++ b/utilities/test_suite/HOST/runAudioTests.py @@ -36,7 +36,7 @@ outFolderPath = os.getcwd() buildFolderPath = os.getcwd() caseMin = 0 -caseMax = 6 +caseMax = 7 # Get a list of log files based on a flag for preserving output def get_log_file_list(): @@ -49,7 +49,7 @@ def run_unit_test(srcPath, case, numRuns, testType, batchSize, outFilePath): print("--------------------------------") print("Running a New Functionality...") print("--------------------------------") - print(f"./Tensor_host_audio {srcPath} {case} {numRuns} {testType} {numRuns} {batchSize}") + print(f"./Tensor_host_audio {srcPath} {case} {testType} {numRuns} {batchSize}") result = subprocess.run([buildFolderPath + "/build/Tensor_host_audio", srcPath, str(case), str(testType), str(numRuns), str(batchSize), outFilePath, scriptPath], stdout=subprocess.PIPE) # nosec print(result.stdout.decode()) @@ -61,7 +61,7 @@ def run_performance_test(loggingFolder, srcPath, case, numRuns, testType, batchS print("Running a New Functionality...") print("--------------------------------") with open("{}/Tensor_host_audio_raw_performance_log.txt".format(loggingFolder), "a") as log_file: - print(f"./Tensor_host_audio {srcPath} {case} {numRuns} {testType} {numRuns} {batchSize} ") + print(f"./Tensor_host_audio {srcPath} {case} {testType} {numRuns} {batchSize} ") process = subprocess.Popen([buildFolderPath + "/build/Tensor_host_audio", srcPath, str(case), str(testType), str(numRuns), str(batchSize), outFilePath, scriptPath], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True) # nosec while True: output = process.stdout.readline() @@ -178,7 +178,7 @@ def rpp_test_suite_parser_and_validator(): subprocess.run(["make", "-j16"], cwd=".") # nosec # List of cases supported -supportedCaseList = ['0', '1', '2', '3', '4', '6'] +supportedCaseList = ['0', '1', '2', '3', '4', '6', '7'] if testType == 0: if batchSize != 3: diff --git a/utilities/test_suite/HOST/runTests.py b/utilities/test_suite/HOST/runTests.py index 8bedd5044..7fc946d46 100644 --- a/utilities/test_suite/HOST/runTests.py +++ b/utilities/test_suite/HOST/runTests.py @@ -21,7 +21,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ - import os import sys sys.dont_write_bytecode = True diff --git a/utilities/test_suite/REFERENCE_OUTPUTS_AUDIO/mel_filter_bank/mel_filter_bank.bin b/utilities/test_suite/REFERENCE_OUTPUTS_AUDIO/mel_filter_bank/mel_filter_bank.bin new file mode 100644 index 0000000000000000000000000000000000000000..66cefe73fd93e3b6161238232cce9c6dad7ac677 GIT binary patch literal 216000 zcmWiehhNWM8^&AG(9qH#Nh(y-_j5jHe_KYfT9S-3B~d>kD^yBKp+rNJhDaGnk|ZmH z6d{CcvO^ik5J2=1L*2#e;{Lu=&-B)9J* ze4~0BHgq5L%AS^EWuuU;O#YB;L|~JpR3Wyv6{Hk;Xd)2hiP7}8X4r=f;Rb;!qHh0 zv}X2Fywp1nMJs(52Syx2c5~K~t_@LS*`F2^U(|utPg;cR+9L7!(s4-P&_rZkya)TJ zD&iD9fLCO0feIyoD5TN>?Yq4mrMEnVW@q)$XiZ&oL(LLRi+?O8jF3amR+fwFZvKJM zQ?%eW7kBj7wiEui`2)(xWTUEWYWQum94?-xN=~>R!|PAJh5F8)$$CR2`f=4-x_q-6 zo~|j6t_~iF*ZaD{$9eTg-L?WoZ%jqi2QI+;HRZ5lw4Y4}CLcG6cIgU(rhL7&$?L5839ATO&4DE!KA z6y9opZ(ZqxU-!Nf9kVP44C&l(@P9f_m+86bs@ONT)SKAnl&TourD-DFtSEQK!S_sNo~SfbKZ zgx&NJ{FQbH`JHQmdI9&LVxb*Uhv9Ixc_$1CRzSL{F{s_r80mbv4%5{X(Vs`AXv(H4 zcqMBPY7G1aEw{aa+w1O#o3xj~FYWTM@6}iMWOXxKa@zqtXf;OOH{{Vbw+j&MdI1&C z1NeQX0Xpt&C2DWqhAiLxgoXd~S~}tYoIN!jHvZQK7py)Dcgt}2>$oavljy@v!w?jr zI1L^>VSsv9%!TLo6{DldZqU_cCH%Zu4h=td6CO(34EJAELn9N{i(luwhw5#`Vqfw+ zRIqXo5-)k6VB=WWvD^s`xu@_?haK=g=UkXm=?McbHADT~3dp#+9WFWB0B5<%qB~bE z!*vIDz)fb_Xj;8HA{URsoZ_*_O+5!a=r)GcQDNvu_HGdk+Kj)n`NI|dS;%hJS?Dxg z3%|P}hrit}f|nag;KJLdkn`z9s4aLPk~|oId|#&EXA{Tat=byYrw7m%l}e~%brkLJ zwxTO<-A4mv??eG7M<5%?RHU!;uRjmpLnDfAqKnEQ5QIdn)#%Lp2vqoMD=M(R2s>?WqpMn0$h*ghJRcK`^E)9@ z%eSOKuR4g+uM0#7E5qR+1#5oFz`ZNeux>&Q&S`;o790>0C9m@xC*%18O8CxF0?ctcz-u z52GtJ;ZXhcUo=I|hVZZD?j26bzZ=Q0h*Ja`Qr`EV}@Jm`m#^(Nwki-~C3 z)!{_VA2|JtG8x-21MitE;?C-8sFKY<+Yb%H$7`ICy`elh zWI6>;S`&=EkX#gWbqso~{|*|>MtH4iE?e3m5Mjd-HhtD=QZQ`@-O_H0R;$d#W=)H6 z&7TNTueuq+o`YzQraL@pKLly!FNE2ntkGbLbY$b94gWJYgeqo+Xl1P$iV3cT#>QUA zyF*HEe@VhH`z~^*8Hw^2Z%1)mCMfUa9+dS=4)w3BMq%yV@cpJ%^axKtolU;zp~rY+ zT(lA?SC}Jb^F*{Wx)s@J5q!@z3C9PO;!8I5SjTh=zBeEcTkWvJ-&Seh!}nzH>mMzs zU2P|-e{>cd?oz^En%|(q!>iy;=X~_-Rs%GH1u(sRB$7Rl0c)pM!e{x8FkB-Bc3tR) znj@~lAM_@C>Es00FEU2~M(<&U(=b#W5(mH69)Xs&15l0J8~9CkC0yA$0J%gJhy8qk>&xulzk&6w(4?Mih&@ZZQO9O7NGgHY&|)6<-E5 z!>*8lFtK+dgvwK)Nk^<$7zp4a|5K@;Pg&RgX(g}SNXkyGQlDNN}m=2R+nm+baO<_5u7Y&%F z;zTAZy0Rxz?b-36h&i`Av#*U)*nbP2(rF9!(vMxKbmEe5T30`b*6fndrWdO8e0Ul0 zyXQ{kTz-O+4Z3jK-_`h1L@)g1Is+|JQA3TD|L!^BH?lTP#hLsk4)L5%#_StHWy71X z<&S2(=}R;ff0d9c{qE4V&)2E^1O2wLigbM} zBqfJ*(AySST;z~0cJ#k3-nga@CrpTjMRgUT*NPkPbDt9|Kjj2(M86P|HxEY(7VN^6 zs!FKFKM{t0Rzb1yG0N~ zN+kC?&SCEnPtk@|k!byiI8DaGp7monam#YNO=Z2 ze=iHK9DWg{FSH;VP9(yk7mZL#XOk#NDu?T_5-e33j`poDfn`%u#D{VbqTZ!8kqI6! zE#4Kb8?p=$p8@n}=q*${!XM?iq#!5tY4F(XkMO$N2IQsNi}a>%!2`7{h{~l+#DZTT z%cu$6H_w#TrVG?xWfFZ};6q2b{6`zd?xvp6#WZ-v5o#V)Nc*Zb(?d~#bh4s7J@;-H zeY$uc{ayHmND~f{M@tJxlR+`jK*^;22PO7CCD=UoG>+a+OVEYyT;SM|iHTBpQHJ#}&JBYoI1wZB+n zS}UF&cNe%@IE$kX&lV?m{|7=hjt9mSGsVi!x4@7cYru;39?{ruyV#*%4)(|wi!MF7 z;_texqHBE`(Acm=l(n%CCqI8E?r*paLZa7$Rgp79Yn8p?pFMG+QnEX|n3V{9ER^BK z7sH@*tw@_=<`A3fJ7LMqx%A?I0BX9>6nl>Of}=B2D76S>IceIwa`7cLa_Uu@ekX`F zHF+`JTesPQCCYproy$!|#`7+<)qJM$Vm_V)@tmh~xbcpueA%xLZ1MYQhEmIzThu=0 zu{@n6J8ow7hOul)dpNs3-Idi%Fk?R=kJH-KDhwsI)4qganv$JKr%3iv8?|TDKuLp{ z9p`M~q6KWse#}PR(4uRtN=RIPSvH|^96RCmjH&oMW^IMvnfc#uY<%1Y_CxZ7wfUT5 z_ryI+qBD4u%`?V6vRiTQmJ%^n*B?yTdkp*-86Z9g$OKX|OECnwg2Ba! zV#$p$z-3ShEYP@tIjTj^yT_wL&hMdY9uz&kZ9{jJ_Mj?RJ#tJ-fi>xy{PCSaAq9awgO1F3eEqZipcnv{Hu-g(oX z-B=^A?DY|B{?=XW^wWdPe^os*QmA83|DI;&x13-dnU$yy>Q zAvHosGb-|BXX1&QxqqeT+!*>M=_6z4<5xvBJ2_HL%=dXRN`+;BA+s z;PgH~4EJ~lJ`9l;KZg4Xht(h$kuwUcKi?-laW|pzbJXehRY%DDgI*-X@j0FwH5>O} z7jizWi;V7v*!>CdWI(cFCpdUvS*A#*zFz`2e?ljYOs=Oi)hcZ?ciDqm8ru zsmC)-y2j@wiL@&sFg263C*LLN_UB3OS7Y?$WV6_EL{;3pBSx?~wgcKVZbq+GU!jU~ zbJ*rhJ*-T$za=Mb(vo#Bh;xa&Y_+ub@ z^{`leP#0W_ST24t)PYJBYvAC2^Nu#Sz~sOK;BfXeptwaUK61 zywim|XW4M+v{qlKvC$f-$|EifS^0$T=(goQZ)cF5X{97hFO_~BdXWtrPPpD;4<5hX zk;fuFd4_Rn9#BK{;DCX%>Oq z+GL`~BdTN-!_M}MV~)KN_Tq&rs|g8atLxUYya7IJgp30dQbw})c}?`wzyHzqkF)6| zPfud9;5+`aWsPVvAP_8AR|HWdMWESM51gCtD`Zv4EOln&c89)Ify5`P{BXyK&+{5E!$M)t@{ z&!pVqU#0on<=r~|T*ZYCaW&!GL7z9?eZyKtZe`crRWkR>$JvIqgDh5j#D4v<BOxF;BM1C z=wNda@KHB~n8-~aOd}H1?za?dOOn9cC`a+4YYSNMc&1qNq8UWloEC5W87|`ZZt!5i z13_-fAwj;W5R7#{3RYXoiX{iU!8D~bVE^AmQL5wyR|Ss+d&i7}k&A#${`ID=j+^PnsqxhL#a$ZJdytm-l#rOgnPlynt)yd7 z8qvJb`p=hHP{+J1dbIa1JrnQA`X4dm5vqtsHivMzwm`lTOZh`fEpA+YjcpI#$ugRw zSj1RoHh=aj`gM{$-r%o?UI)J-8k=8{gk|-_>U}M72>DDrA6_FGOS;LAqT56#ayMze zoj?Li!^q+IY;r;26FKnW3g*k|aO>qwz+R(3`1WCsP?UCEGJRq^Fxj60a()(pA&q6i z$dQ&p)Z+^(ztr@7sx&;Xn(y^8r0#wi_-s{; zsI*%KncjTDitjAu-|w`sg$Wt#>Ad0WNm(n!4h3}Xl~mf?l|-*crqLZERcXe%5%k{k zv2;*W8uKCuLsaS1vr|>az{F?MoRV z`uY>gix8Rbd4b%%?Zdvi>d`v&ktELLAu~UxE-ejHmwr{0mBvdx@~!SKc#zW_t`fY9 zTXj!hjsKlR;R^#nbzdnk=-mSJM&5>*AID&i^_jdPsFSxIF603NlX&up5Pmvb!d3hf z`0e1UEVMm|9WnA?0hY#WlEn!cV4X#eEl;L`%5*yPi~@~vzDHhmr4iHIZKTF8kEEI$^6UcA2^Zkc|JtKOvv3` zwfN==j!T<1A?xMxNWWq=w77u9yFM#YWU zWLy{Z^9q2@YFY8VRknC;Rg`dAQ3I&XUJY(3X}}qK6~v=eDuA}iiQ|^t1OBJWgtsvX z;IjHQFl^Eh!T4U6WUD>~PK|27KB8630msFgqq@a~#^IvvwxO`-K{{F6G@1T&okENb zhZ5P>Ply6>3Mh{}O zE%k)nT1V=v>d>W$CgkJ3<+$d7EV+_8n#>_pZQAb6-C;c8Llb zk*!*?6lO(zJtahoNMnk(Q6g?N@D-sW}X5^22u4(Xt$_oa#f3iiE;`u159 zW$Xi|#Bvw6>7?ZRWTd$_4leq05xPb#WK)}tQ-0(HsjeDIhyRVI?ei4aSf@Z1^!fl> zv~VB$uya|UTjmLiMEIzvF4152*zf@_QjI_>7 zPI~{7ywr4vlGN#}jI`-pHXr}Zh)qk&M~2JIg_vvhzgEjEROg;LbrFGSQxo z)vIJ)=Ao>?a}@h8^D+&4vw|kh9Y`jK*Y-*()8IS1!uNK;Uxq|*w-b)>PUFn1w4m8_LgU&noifkTog!J;&WYNhL z#OeDFeDG^88kKVn-5N^l0_ln%^`}=?6QoIdR!v(`s@G- zR`(^h${az9^oziNCeW<=2uxh|33F=pfrf)K#FTDTpj{R$UYPe7G~1mPm#)?m1C)lt zQtki^KJFE3GCPFs<(XnXqh;dnpts=tNprDbkA)aCa5RiG+za%s0P)@3X+VFJKYZo( z7U*2<1_9Mi!B}twgw$UZPR%J0;@E2-+b|hS-BcrdoiPR!RapvS;?~0#d5+NM?qsN* z83;G|$0CDE>uApFSIjm11UusUl=%jWy!}-nFRvOTz3^bG)MZ4TG%Q)5-sVS1p8kCD zyLznDE3AXPU1!SrTRk9p#jDBg_H-&8H-gTUJB>zMn@)VQt8hcyDB`7{NJrLJ(Z}zG z(9>%*_?vS(d81k}?@i9;GN=CI-|l{5mS59YTv9qKxU`0OT()PQkG-Snk=v-RC_}YY z#gO(Zo%pxoF}$>6J$Ab=5Kk*}!H3rl!_%#{BHzB#P`@$-zv@fJrYFx6m4CW)->pS_ zWcHv_;qu5owuG7_m9gNQFD&n?27l(Hz@5&2XAR;@7Mpj5(X32%WZoj?&c9K|=y=jG zM;;$6dx(BKEdz9_qQpKfU(j?_5%T|rf==8Bmix>DV{V_2%p5#Zn0smhG)#78;+-Gt z)1oYXY?!6AMYUY|YCxYfB1qXjF7c3b+=;!+!SxQlwdp<|`c_?4l8=8~zqw@)(cp!n(0v=zj8a`b?TS>>ah9 zWzN3YE@8SBE7@SX7?zckz$%`kuw#d_SiE;Cd-yVjH5W#(z+@k$|7awW`#OL%+<8cM zO)R0e8#d5NWp}zm#exRf$kJ~^|A_N!;Vyx zv}m{Z^OO<{)k+p3Vr>M=_fx^fjk_ehZ3H}SJ1DVMY?stk1b`RsM+uw$T8KWLrQp5s zCEOB-aEMyFpfb8vR0x;{Gyj<~si~Q0mscY8 zb5=m7L$X26iditrBNKdk><(R0I>fd)-s1cRzd^y*!@zK+A#ii~=S?dW!~?S@0fUSb zpfEuZ_%~e=-gLi#hVClpZSEE5`MDOd1$R*6HyyQ|kuJZII;WZJ@hMWC62&GK=-p9i<;HjizB%O89>I0hAtDA*@eT5kigs6Q=*zCLAk20!HH} zpdBQDbH}^|8*)O(`*cApDY;H9$MvJaRC!i+^gc^!*w6Pb(33tj)t7pH%;wQGwRGM0 zG(3BJCsbFP0PE&%73U@BlCxL7vOOU^+Tyj&`hB>(^y2Q@y!6H)KJ|4p zzmRyJ$-+_m_DYf4x>@mI?)to@no&}Dr}BTCJjycL5%f6NZ!*cIAW46Ztkqb z0~Z&OuAq8cKCFuT*b$3=ZykaD-0y)0z&%*g6O7iB4x;~eC?REo=x?J*6fN6GTNf45 zjh7Eorv+nZ_I(HPORo|>UZ@UM-+Ln=*K~xQA>~kOMkzV)q=i*C>?1ptLej2eK~04k z%A%c^Wz>FVxV48RsEy=}zo+r`c`iJw!j`W%Jecp?smIs;RN?RZKC|SUR_0-p!94l` zn5(H7`!iwyJ2$S2W{)VPZ%(JuKgVX!XI_Kp-H?Z5?Ti;h=zp2OvDbaY_nUGKoL7HXoj!AUGE8V-#wpBK?No6_Q-7*=~Ps@cdCEFp9PC&jDfwXC9 zCNIqV%s;L(m#$f`NLt>NFAbl3SsKkwN?SVDNt3KOm09y1NxQsAS?EiqWv@$(;tE)g z!7-j0c7m_THDntv=+Xu2|7Cx>_u`!s_G9&)(PZ4mDq>O9Lf?icu#$ijR%lYmu9xg# zAqSSTFE@YF2_7M2)7=`HHzSXBD-=@Qj$O1a^$2att)?prn&|ewU+L%fatycl(wc>X z*y~ljH0WJBjj+5T1$4j^CG`F64S0HVJ{n^fLTwHH z(9Kc%XxO(Fny~I0eRN5YwZA)Q3E1l%4B&|4K%cm*j z@I=j)zi*P60ey?Yd$8tB35jbqui=rkr@U&DN!A7KYN3z)9_G4|y^0ec%5 z##TNwXCdDA=!%4?G)V0?S?AZE+*+nW2E6D;&%3(g&aehF_jm$&nsN}%I?@bxAC1Kt zqfcVPn!&iBXB7IeJsoL6M|@&M6}p=2TWoU#WThNPUlc&>od+s&7+Hi_WFea|NaUWxVvhzAZ)$>@ zh7YS*rA8Uc-+7Xy->+cS({?bAGDo)Q{aqTs4YA=%K&}qerIYS`M7>JC(166-Xrq5S zOg5AvlUo~z{g!@2r|lMAK0gC{6#!iJ`#3Uqd=vHCCg2G|9JU)DDn_|>2o1r9g*D)) zq>fyH7siZcrc>_Hsf&yGt_479xyxD_kUdzsWMv=!JfNDFwkGrWF{Zp);~|@Ex{*Dz zy+kJs-$KXxM^fdIPQs=vAe$BBsB!IZN|U!zp>7{_vOhpC4Bkmc_N}G26s%}>uo*pD z@RO|5K1lpSW|FfV7qO4LKi=ZM5y^a9izb-9!*HbwQKjRd7&lH+b}1 zS+p&(5U2Ml!y95boH?ji+;(&x;&T$j#(zi<^IZVbCCA|A%u%SvFIL<&I~tBO@PH1@ zI&e%>A4HC_Fhpgm*lYL`G&Gcn4*g=pTbVf^_zH#vPg#XB#;{soJZHm-6s-Jyd%pd99$=kTYkxG)=kVndk<{`5+fn?03 zpJY;{F1|l18SmF$ia%daB-7+IN$T4GqLNogDwLm)d;R*;BNw-jN~3)2@4f>cDs{yh z`t6G1fXu{JD`o{1HJrhz(2X0QM1)YE{Rk}{* z##WHnHYpifqD+1AEYZ=Qn*;4jnPZJ6BdW6&``e22%_klq{Dj0daMd<(EN?@2)0B)Hr2Fqrx5|os( z0C_wM=pQ^K=G&XlDEyS}I&g$MZkmVZUf78(o*zXHZSmO3O`p2{jbvi!lz$wRJUr%p z1>S2a5e?mDQos5A_`uw7mNKB4X5C#*AKzZc)JAZgvGfjq;CY*CfM(wJ+>|lpK{WZq zUee*)g*)flU_O5+xv?jYym1Ji_q@JPlWSHiZp9K7U69I_N`qPVn>WPu~<_pD#@-r87R;`4`f z%}8PqanI?t))n;eF&%ni$aq>Fy_3EgvX5rJdP{BgSuv%`O>EYJeXMv}C2QYyfGz%$ z&$1RIus{A&+47MlY{4Q~cJyr(H5jpsO7tyhe9aLuO_)pCx1Yg}_2p5cW;%Qzk&2Z* z8$tEO?O=zO0x)v42Z0@R;84|W!9wApaMx*#;1WIsO!=51Sn2f&a;<;>R0j#YfU|QLeH;tm>NpEzYb$o{2rsdtfp; zc3py0H3uVK&kBTeUm*SCWAL_KRd#unEgi1tELL5kG-X z+wf8#rqxwM#<39<1ir@)M{gwcL%QKu_!vD_n2B%Cctl3UT_z{XRH@fn9a<@|rFABl zuFuFPXMIIt{8*cq8yXV7{sT$ep7;1r*4ckN#(bQn9Ei4DIsnfPA4|SjZX;3MnWSWL zCZRepWTv4xx%xB~du}ko4}5mw&PP2YW6=%ze*8eRYUywBlI9$=Z<#LhUKYZeFHPZh z%;xh2RjL1W+1q)L=2oubzlERt?!y&wNAj&N&$7vQT)K6(Lt+}a9>@v2I-EtCacW6G*v1}mvasTo} z&+}9qUrlEKBWhrpM@HvS{4vy?>eq+i(?&PY{?=54X0*VsFLxq`#?`cAzAHa7@FXw( z`I(!qU@dHHx&eFN=S-VMJRqGXl&N+4NanTmBwIFZ2v?RJ#Z&5R_{>4B{2ZIX zZ8GNZ*yA>QkBwjDN-xDWBbZtqCgc72je2ibqe(k8&`9qln&qHD$L&8VMl^3G zA9~ht-ISHmgbl-`3njYT#o{-WPxdFV5>GO9as~PlXpL2t%)*C&9?m+XiX*FP@U1K* zdQ9dhk=R`%CK`8%Y~efdc19`*xTZ)9*ZYG;%jH94ybA z#|7XQvEN9^@Gx|0nJZZAI7m2hi-5m}PYS^{m4Z`+m0)Up1bAI^5PM(m5Z}kHpf)ip zx#ERgy!Cz|XIJL(GjUe@dRYd)e!@X&+ku!%`x4L=rU0Y0Uy7RYJuufpi8koTvx66w z^4?LGdH7jt>CWyH>DjeyQvK2=(%Gf4(mR7%_?9`Tbi?b1RCP%UJ-Doa&WSQ*x-uKs zI`okFnT%u8v=DWXnM}H>-{QL8dc?4M5IM;x{xNY2sk$wT=N%8E#nFe*trI2C5d+lt#2d-PAfAj2d56afJ6c>q;{s zOr+_3O455>Z~3g+NBqR)TRdu6F5hOihQI&NkLT%TGHPtev}#AP(HVVIYke#|>9Lo_ zMN)bcTqV)6bIGv#5#+MR7!p2FLdHyfffKm}UJ;mps_(kMwf92A@aLbvpx`~g*=GsZ zqNW5^9vu&Uk1GeO7Mu{|-8TcJ5gvk3otE%TWxnJ^MGc7ib60TuwNIEn;)w8H&p=_t z`xGH-*iB)#e33BwNS-+L?PSPKpAk)LV?@uHCgPzm1Q$2OfP|bAqSHYQ5PkFk7_~S> z{IBI_#iw_C&zw8HEUl$8*r?v=_ z^d|_74w{0s1p`i#l+YXVDtOz$37I9;!K!svVSwRO_+^SWd_af6fbbCXJYWL4cgG18 zUPV~u#zm|f>&5mtD^ZQjad6d;3}U=0kfRei{CANl3%&D;w8n0yKskmeY&OMHqHR%3 zU=zw$9!T!~JcuolzN7A^_GIsbG!pphEY>#pii>*@nNx(x+oojFk)eW*Kx156cN@(- z{2Og9`G#WrcH-Rkop}H6!6d(`5VztU=vOq9eq)S9?9pc-Q8($&&NI|NTahg}6v-M+ zo@XICn*5;IRKD-qVHP_4w)iE?6m%?P=we?so$y+fzacm1w`tY%IW%V8*`{nYGqa^~b&1j(tvczb@FUXd*h}>FhdQ8I zuL+N|=D-(o&%5Kcn`$n*;{f+DnazC`JZ0T#W~^b2Aw3XhOx7|_qFp|d z{5TPd4dF@}y;Kbk{5=!rY$(F}yJJZ4J#C_(zKn!9uH-LA=5j?FEou5kBpp|1CDqK% z=Q6MRu>$X9_k4^quWcyTJal|47#- z&!k-jBk8i#c2fP|8JRXYgS>LoARoim<3EEY;TPAoqpS(1QKjW}2C24(fgklHA>^1gdke zF!MVC$2xSuWleP<#K2wnx~NQ;@1P1SN{0wCNBapCm9Ihi2o>1(*FfC$+*5o7JjAbS zbfBi&EOC{4E_ej`fs4Cb#8mhDV$_av;(4Q=VpID@P&N9qcrIeQ80u*cmjxM#hCi*r zpRgEET3sa!NzoAfV$y)u0UeOFqFwmeoh1qWaYs~1d5zEyH#EcD3q8O65e+#}1iPN( zpm{%YQT&)usN#1u($<-QkDk&X4*xb{U-AO!`TZ%}YwKz9VmN>*yHtp2auZ7`e}bDI zEhbgRrqZ77DQsE7c^q0DhCfVu2K|a_(4OU=aYn#q{9%+4dIPk{It7HCpFJd>-FDI* zIa#(m_AT`oAj4kvn}PM-Z4+xcHN@!~hKcgU=Rs6PGMwK4QSy5wy!pE#-trir>&E`n zwx2go8WYCfytm=?I{JL%RYN{Y*ND&ZFyfwC>ik^JA9hyJnaS~BxJ!K;u$!5P!Wtv# z`|l~ND|!lhf*vqa*L^HL6|e|Bc* zu4{?z86lE<{S=9V*E^v@p+d3-BuNrWOa!9PU%Y50h+f}s(AF6biO#ZAX6qNv2Oo2i zPOvyEt**{32CQ4&z)lMa%x56A#Zv(9SaTfkGX(v%K9m8E6llkH+Z}=}yP3hUK za?;V`4)JMo40uWKBBuGojAeZNfz^ke!JAI%(^pl=`1~I=wCCnF?0NYJDLCwbaa}UG zoHLTW{#EslhhEK)q={Yp@R~i-3}lAmPmsapj_Bq;{T%j`3PJI9!g}L75+#{rc!G?k zk?O11gRz~2?^k9wiW7MqUmy*u>1Xfu-x&MoI#YY__>hLM169;?j8+V7|NF87F=>NHZ@`WENN`QVhG z-^fPC0gnBZFGiklgC{%c#OLk(;HqVrqPn}B7}mc(Xf(=_OwT+e5!j9#DoQpuftlP){FYS@dN1Arw-tK@#VN*u$){~F(k}@6 zz6(OqvKSP3vm6g7D?vY4JN|TK4v7zLM{`cMBAEssl1Zy+<-tleKlAcG?s}87z{`Z# zM~#QKp3Ng>?`+x1f&1`jZ)>`3#8)iUKSTG=(G5PlNE|Tfx>X zd%y;CP@K4DE^O4?3!5dJ9=uw_!{TeXuVOZT^*)a8jhM>Kw0<#-XL+n@xe3!LuBR<+ zfSNZK!u6A&sJLVhy1C&zo!Fca)nI7zGTyFRnpe59CwjD zXioGxmUwD58~fOw4|V>-A8(dOzt=J8*hXdPkM=y?ap7Ohhc)>8#zXk+`$S^>@H;-y zG71;ZRL45XD@nZ94J4;{8n2P~k=;v7NKq=n^L;2_4Ldb_2aRYSz?K>xqnSq$Ysfjth8P&}bXRx&bM<&`KGlR@S#ghfD{N!A zFAdqz%KzwKm21TNt}QXvsKA#_$Y8JHjqsEHCvm7zDwH{OLo8ib0+(hQ0gFRUpt@}b z7<}uoGu$r|M=w-A>=7MbD+K`QsD4%4oSS`t}^XNVhTCxS0t(q>GHr^J@`I`Y8 zpeguxaE4H`{D!dOg}ku0ELK>w+)mV*djm8Wc8ad=6Ges87x4P8?_$Hxt>WQ5E~3Y( zJz)5@mvA_mD7q+*hYQNb!>^uUpm(=VR-hrwVJuo5=4oQF;=({QTGCG>gKBD_#Zg_P)T$2e;-p#wyw-wjyRtXwv{ z-I_n^8X{#sPD(p^N87jdzLlCp8xd3-hd%aIyUeF`ZXvd-1@tn%p}rj)e~W zgTqT5p!r4u1GZ(r|1oqPemQ<&7*8dYv?U}-NL%mO=Xu}C2ua9@e#r`%m6;VK4N^%9 zEvY0~6_S(^LXsqjmaOYwtqm2zlvnaxb?__p>+F5z;h(^izU*YrJd$}; z<~qJDzK^GDA1Xd@HcNaAD@&~6^(Cv;_lsN9=8KCSZD)C@m#OmAo3y$30Gs>yEVaD) zlN`|2V>_lO(&d|uuq0t1OIja57d0#;n^XtUt7|V2;psrKN}8V!(R3q*2^XQskruFi z@osR~csR@poPiBZr?S)uY5YU#Tfy=4d`a=WR!Pm1VKxhIe3HyP;3+9{@)yf5zbI(> zg!0e>rb6ErTXEn0V`8h$17eBodGQijD|So!AXeXTUR*H6RqVe1pJ4hWLwKS)M;PXC zgRjY)#3#czHvL#E%~;?_@9py@&b$;w&2z=8&s*V#X7YHC-3z?H55Vpb<-mCVLUcVQ z6h`&m0fss!V2-o3sMc2k-VVDXTK;DZoaK}(>i%;bdViS=`~M6B7XD+PgZV_5x$g@2 z`}+tu>#GcB6g!AUeRF|h)MRl?_6u-vxH)c`)s5!+&LDA`1IRn;88}hR6TWnHLS<_L z$nA$iac8qR?&&PY-pLNI=imt(eq=4)YAlPN*(u_2`|O}f{$ixjupHeV_XK&Wbix6T zTv7I~04Tl{Dl(5v#h))kliAiDbO@fwOz#@8dHt5GUT#0@JSP$h%Rh>*2u_m5#if$Z zYyPvbICs`&<*O?;XGoeQyg(p$9hhYWUi=|a~YKY_}60r1w^!O&#=Ryy_q6cW;}@xAX_d0t}+ zuOGR9|JW7Gx;9&In^j(d#ms|ZN82(XZ1QH}@#GoWGqap{9^22wF}mVD@6BR%bG29& zP80WT*AtIEd`ajT<|Rbu$_XPA{kX?N4SsB?Hd`GZgeSi}PWFAyK*c^`P)|b!{yGu{ z|F%bhQYC$8u~~r2TLMwsgjdLUw<29+8!EU5R0&Sf_fG$ZKhtSRp}Bs_+<2%acTF)6 zURIxBzPEqD;+S&yC9nY(e_KL)Y_>`NkqP{;xt1`J9ToPJ%ZaVj)WvtVYl^uZ6R*E% zA)eoKNO+#_!Jb;DFw;GcSfq6=E6cUyOAlkAt7U|^XHF1znmLcF-Uq^^us?#6r8RL!ww!pmeG1$6IiGqDil(c!TxU0YPE&DSHu+sKkU8k@r#Z{~+2pIK>{#Sj_SMgi zW;Q9%MQTe)>%s$MTkvVz18hll@oca|Hv^b%?GfEG9|cWCCipBI$=Jai-0hm5IOnXh zq*`Z%WKJfLyqFsyp6Yf+7;Q$TnCzdI%m`w^OQ>NVA4U z^0>p#7|vAu318Z)q5*+V(A^mU&?Bl77X7n@`&ti+@GevQsHY6;&I+Ubnc*z@zj18p z;Se@yU<+*+k|1uH9w#|is9-bm%2FFgw`(@X?iShPP#>G6UkoG<{)W<#Jp-^WQs*91 zukiZBRYJ(fH@xIgIm_8p%nGWi=|y5i9v(GhwN^u!d#n{(@p3(R_xe5a@|n+Poe=Y# zTk`p*AzplHkSQO(P?j?*O}2aOb{by46PBJXh3T)ipe+T1kj|c6Xs##*dAz=c29GQVqfNg2+(0q#tu&fV+tiB4)*`S1~9+x14Ws~XN4~2s5)AN%1 z=E@SE%Z0+0U_-vVc?}WBz{6N(?4s<^Tu=u z?ruursk&XlgP?TbYqqCQGY<<3b=8DV6}$QI(~9)_(=GIAWDj+lXvP+CSw2&?RhW8v zfn@A!MTtYElDK*NK*2REkT3XB$jz2p2|r{Nh3#^LU0ae!OOrp6fq~I1M^K<8wQop! z>^XXEUL6_xQA`irQ4ro$t`;_X>kBDrXL;S&k$gp!4*O%hjN;nOWa@4mxMgR%=+T}% zV1!C9xT(hQm}742PN@>lShiMN`e~2YB&S^X8w-TNzDxPdcXC2~-f;1o_dmtPPq$0F z3yw;z10TuyHi_hfwU)&Fc%#_Cbe(uDRS^F?D)kRX{bcoCR;(y|JiB%78?9<8qJ<6% z=x@23WSvJD?f^+-#MgCX%y$`-aQYA~2^xr%^40N4^#wTbkv#qxI|=T|?MBhRJ<;~D z{$Qtb4XE_;1UK#}fut=ZqK|KMp-pEIn3QY?UXKU?0RboB#Ut0jWrZD3E=33KeDYiL zd-G*@r!O4r3pfQLwrb*KL*Ah^R<`(I*bj94Z!j*1-;LLV9>XH_exQ-7g$w52ATL^+ z$;IL%m|}AThblaW+X8b?nDr?XxgruS>KTZPa+2WRU%7D7!yp*H-U3O^*+Rq5hG2|F zBT#F5Vtv8$C;GbDl<0qrq{}X;F&&>6nm3-X*ex3L;fV!O`PWzybT3ZwWY%-ZDh&mj z!WlUd%efumgj>GCsEhxR#<-{Ob*}|CFLCEJQ(E{<_W?|&(UGvsFsAQlPMVJ@(~UW& zX_d||YGN>&WeuD{pC+iVqsi;o=37zJB*~5T#s_e{UtT<(oAGO3-P!eNYe~xUqi~nZ zJ|tOm6UKivf%(pNK&!L{?HwA2CNv}<|7Du^=&2lLZ#qN(6Bh_pGJA#BXRZr>($|Y! zW_O9dwXBtt?>!+Y{NW*4pY}v(wl61-I^{{iz6JQPIz>Vebzavf&Jz+O!D@mxA#UrE)T(Hbscm-DLC2+{woN@d-)NBt`Lt_10Wp{S^E4yj&3e zV}ePB8a9z?Mb6%Kq*^}$XaA01QQp$n+Q49M^uxG#((K)?l(4RdB?yH3OWylHUu_KVVIhzX05;9m@ z^=}$^`7K+^B|=@PpLjrrv1IaoA4%7s-4eHwu@d8uz2cEu6vRmtSA{+i2w+}eW#!QK24lCy|;1@$1Y6ei%{pz$mwUR{qb;nN|j$rfR z9eBNTZr}I07@gUhar1!1+ztOKxmCAY*Ab*@|%1Q%6zax#W#;)9r1K@S5F6B zlzKmlG{)ddTO)9p?rTuEDjBEd&Lt=9Y)SkMhO&=jpqwAKQO>IksIb5RO|KpU)fQWz z@%{Fw@W>^In6(|n68VPtl_5VOQtye?$DxWsj>n8lqEqOWY_)z1u>u3r|8lKOYPhidUzHiP)+ zq;m|6y)JF&i)oEXJL^o(AdPS@jkl>H^L9<3pH6$xZ&RPq@jp+~_%Uwe_^$d@^NJq*2yk!FG>@^4p#;a@#LL+nrJuuuaXJz9*8 zPK{)5kK7b+-eIxl6d6fDtd(Tf+`W<`TKgpSFE>cq?F}T^W=UdE?pOZd@l|qfgdI*b zABz`Fv1K0SgN5kN7J>)j!Zghp!W$DSAw}8)-aYh$w=WU%pDz$!)5_RzlRZ?{)Dx=| zp2V*WjNt8dFK}R+)PJ~oHK_3zE_$qC0Nx&rfDR*6(J9yW_?x?kyvr>X3Y2!+IGxC{ zF**@o(~_}GvbXZ65HPJ-2vj>QHr%sC*yYlWlvhWiE%YYwD<0wb=d^^5F)EUG zBU&W^bM&gfZ!u01rRL$1>Hnm9f5UIV z@yZ@9d+IIwmFmq_f8WSJatTZ9+`_At9^zlPH*XdR9ON4E1x*)NeMA~-e6XDbs-)7J za)W4?wH(#2sw5!(A{NDIkhl#y@XG8#*m#MwPw$F_+o$Y7(X;EpdE*NB>7@$n8|@-m zDLpr%K8yv5q6|=9|Ib<>Q~>Y#x`1I^9;h+<3Kk7k1fQ;4fq}ld(BrKlERgL2#YG=Q zG8f07$c@i{f=4#)G#G=HNYv2ogx%=b9wRJSF#?mqVz|Hwk^O-dWP6)3vF|v54rVBl z6U`5C$(L<#U$q-tZ0G{_A8STie8;0Li!Z}bAJ3wP=MtgfUN!joq#G#y7-H?)k3>sP zDB+YR6NnHygTC^?^qQ1|H#s_+PAza|&3)7P$N#po*ERASg*;=?9Vc0|WHE(aPiQ5$ zLo<&5Lv{V}sC<1XQ&7=o`E9b)WqJxJINr*ZhgUE@CXyJos!*k>)x_k-WxUDY1X1{2 zOZ5)_BUkkb$qfB}B=A8k+jvx4P?u;4#icd;VN(*b+UJ66_F3S2k>jx6>k)YB&}h^$ z&>DqJTnqOWTSE8gLtxg^gK$b~0WCXoU&v|g5<71^D*4iJRU%)PE-}$ElYF&E7gwAt z6uLeR5!}_+vQaKq@pi*U=y1j=oV0ofn>$lUaC&PbRGUu}MrbS$W-p#El$#j}uROc? zw$4!AQlrKfNx3BLu%EDySp0C_Oq6X6pwqe0AmnX0NQq>i+7F4+E}@9>|pS3-&7J;~{SDK>X`oXwYSV{KjzA1+Dj7%7?XTSsDWaFK9p_#fmdI}Clf zYft>|l)@rJXscNSZ}0J9@jKVk?UoXDO=C4b>rRDDgO3Pv=gt-mytvF$?#r{N+WmCR zw}bTO)B|+Xb3ipNb3XY)nP4$~m_&U_i^RUs$i{K;K%3cnCrb?X_6qaeY=qxcK};pu zkCrc3OK03pVDs@+GW~Wa-Mdwl)gFkY2m6{+ZN| zQ1(Wm5ckrn53c{P=DO@7eJM&s| z*zmMq_O4%@sch|_-@iPiiLOfYoE0Qj9m9yiy}871odq@=ev~Y|V~7K46Vc^GxoBaG zCkk(_M0Pk5Y}U#r8&fz9B{`WT@5 z?j87Pkp=HB*N0Z11EBwg!NH3Ku*oOLs#_6z_f5b(e=eduzxtuL z;v)X-E|9$Kn~7mbGWHNk;1sPivbeYf$4|6?ve6S@pZikODAiC>uExNqDum8uRH4eM z(WqnE8yFSz4y1_dMA-{pTAzKNi@Kxp$zB{vCWcrO-_M@Z>9!rMJt@!B37DG=k)-tRYq1yHJezbSg>vLcM$A$YeWAqfA#2xha>}%{$BZi^5er>W~sQT>p=5 zJgSEq7o0`1Mbd!Ijc2HE-%>={r=a#9F6h0_8ECiC4!Y%ciwrs#@wJ;M=#PvO@2OiP zkr?igv`BM5WtFPpmR@DynrSC9DyyQaJJs15tc$mcGmyqPbCPV{NSz1o=NSov+qytL z=SKoJ>B{4SBulyDC>x&MrNV>nYO_D9u2A>jW2CSC5T4*v#~s6+^R8!BR$OiOq2m zu*3&@YV@Gp8#m+IyN=`T`+C^bHyMOn+5scmY(R`viYU!g1{i$l0KSJD!5W_uk%a3N8pfk>?X~B~XI~siPWX*%yZqq9&+=&Q{S~Mu z=MOxqtp$5;zeV09J?NT89{jWfBK?#nFizPN?)RBx{i@0qw->h(yCuVk-SYE9c33|( zxHgZ;j5|p-8x3QdMwXBu%`#&2az4wO{)x)DSCX>oY2?FxPkLkFUOal_E7UL|jjA7( zB@UXEbbHGS7SsNTbzP36F&h13etSN4i5pEmXt!a5vH~iXm`~kyLi$_Qiw0G{AnWZi z>95jCs;d5rq7e&e(6M7Q^Hwx^pXU!_pSQt^nFWyeEP?vMEckx&R}BR4zHPfkNcS}6hK`$Ay-E&Gvl7!gnzPx+I|?}0&JP_Z zA4!Z#>gdVAnoO@vmn~JfPB*NT-U|~=*aPoW`m*3O{h)uCR@@j!doAWs`9G=T@|0yb zVE7O$V?75hu=^~U?vV-P8t#Jq?N%b6wn|WQ!4+C`7QvgBe!ydkeaPC91VJlizYw*m ziObz_5%2M!l6~>ZBx@d-OO_`W3uS92^EWQ;O14fmqHBIVqu%qh`DGt} zuIQ-Dbl(*4J1wokVuJ#4%exLS2@epTm3nE+4wlgYZ%5D^VKiM6vzT4jnn!DgeV{=> z?qumJO}ZfV6v?waK(AifMBYtF$D#d3WT$;NiGP2H7#)tqmdj1Z>)T)9D@#Ri@$3n( zX3aZbaIy%Slm&9F&rwu8aw0EOtKj!KE^^7Imwe-~ACN+bB zw||Rv+Q))V#@|88)YYKbc{4D4`~#e$uBlC~2+CK|fx{;L1bMh#JP? z0}03RyUVIj97ep_35DGCVAYquN-ZTL7?mG8yKlE~9cy)}xJ3Xr;z5Mmqin4InL!0#jCv1x${sdyPc zjh~s5=L5n>m6R#HaY`83C3%8xS4rqaEhFY?+DRirs;R#sKvA;i(Bk$N$T1@TMQ{2B zJ&g6>Piu3S7}f+6A{)_dp9UPH+eO2^uc9kMlIWJs5$xg|D^@npkF|U#eQh?M4 z-fe|s{WcQ(a25+`Q{neql9|u;39KgcF>O4$l%CY-rw#GLSm)RbTEn}D!FWpWGALzP z`{PM-50P%8cJ{Jskgy|7>fe6h!gdBbu)~3=OzG||ZY>@m{4J|ucie60mq~-^XP7}0 zW_!`4IVDsm--mV@mOU8 zfi#s0d6x-~M0s))c5No4%r6<=zY#+sTfd?Os$s+`!;Bm<3nW)(m81Ms258)W z2f#d=Opuh&4Au^{70s~P4BA~oL6bwIsJyEcSnD%T@md3nS#=Xc-Ea}T$~_M3=X8MI zMMK~Lll$Nsa)eXyEEwdTik-`(!{k+RSoWwhu6rDfbXRAh!Oi<{p!8qK-w&~>Tr$$L z*GKI!9Vl$>P8^Mfqbu`=LP_;>sIj&WX}&FjMIkz{k=vl^O-U%QBNA;?n++wym%+Md z4i}WF!?3oiBKEKxr|k{K{L5Ejrf5#rZ%=294x^a6^+M{TC;dj3G2O21#uma*s+nCv zBJEPhO@n;8)yR&RU-*DD6?UO`l@7M3`4%a?@PpYac+;jwg_u~X(uV(Jh>3X(GU&L3 z!k^E?Rn@74)PKS^=iZghva*p#-j1$6{~ixoq|N%<_cF(=JDG1%1)bq^43D~;0(8u|c*$p_Dr>Cp(8Mi{&_L5-g zv`3xl%)Csp77rm|RvP#%b7kH+NBGk{(LCVHVLm7(mR;;srGt-$Qr-32sJ+5a_Q~-O z>0dLDj`kTy|6I-^kF}nWiAEpr3LAAi^o<=UO<#Zu`pRi!_I|p@Z7n^temj}{F%UcL zal#|dpTdh)7UDYXjo_>7AW&OVCrVX&A{wAvj>8Xc=Rr$q>7UmHO!?U%YE~n{krR{Y zyjS*|zH<~Vo+uZ#MP3zvE)vpe5A)F~kLlhGyXbzb%rP+3AgJ%GxZtYmPsSztT)DSWm#u>vxjgmUx`DNRL=r@4)9bx|2wwLpVj_ z3Lah)27f;I4+R(pz)?A`ML7y5!HON8U_|UW(TaJwqSGER)@FN5;WiyFQSdIF?p}Hrc75Y}r{b=kq5JyAD9S_6&M7a2`$yn2%O@$KkBrIOI2`1Whi= zN6YrcU~_XLl==KODm{~l#w4xA{dxBI&E^5PMDruG{vgfoUUtLlS4>CRXPV)l1;J2X z%33p@X^3jRgu^N+zh*|h2pAIvESEhN`HoA$=fhW#EtQk$&I1Ezq~~fj^m+^Rke^Mh zJHz?%s_Fb_kq%F@9nP)4#qpx(_5AX}A>6!WHhFqxEZXE$fhsE1Irz?5(!LlLG3g2} zKGjZEP4c2Scgs=eBY=^M2_CNMjqUfi;INche6i688!c(V5gX3ZyiiRlH(Hq$)yuOz zPp2}A@Am~m4>SKXn4|F;e1+u^7GgYyy$>j$1}~qH;`}q@alkP0r}i@XTw;fhof!-x zq#D#ui*E4m>u&fYuUZt+Q6O>z`{AvvQ=yLGA}N3Q1L>Z5iqAQ8OPrGQO4vC_o=?m& zV$bx{DRjI{?%c?tyCXl*Q{n*dwCx7m=9+=OGk2WPx`Uhui)D4kUK4HI-(=ucYu4ma z$TscOY?hIw8ek!nsYCbgmn;~^N5rAZphJng;wW3{K<3$~3{lTlyM|fq% z2JYk4N*$MlQWi0uL@Au7sh^i|;qFdhhwF7=`R|iL`IJ_E|7jcZ(Edq7Tm#tD@NevR zNgvC|IxMYMQn<(I^Bif~^Ut~`S;Q9uHYYku`rfal*D4oKqnFaRdht$j|3D#;pA<(- zE#9MHYSn1|>2`F-^9t6f8-UU^L?}vi9~^RC8J$j!M>!8-;2yttnBJHJHoSNwD!Dx$ z$jSPMf)CrkXA#XJo2&66)ytz{*c5Zo3D5bWc}^z4oDUae^(+KiN9_TZUM_>0$XmbO~sXm5V3)&(& z_1+uOe5!>k3D96!J2$aMpYBkd-J!zX>|Nsg6W(G2e;aXvp{Y1vb&N1)tv~;H%!gFT ztD$b?t7z7}3}#Wbk@a5iqVd1=Nx#={ws+?xV)k+t*|i?wpty7_^ZYfIyXZoC3ddq_ z&>Jl}T|^G=K1ll#ACrs5gu0ohlQmnd=*4eNr0m=rygMl#4g433Mune8c2*QG`PGVk z8ffD1G0Ipsz7)+%ZiY?gI>{StP41hlD|nbK6-MSP5T>~v5;k%};X|1wul#X`O0?gR zZqG$@i(58oo~VHA3!>5Yg#+p0mxZ)#^j+G2d^Od&o=D5zexQ8(aJpD#q_mEXArBK@ z<3w*gLNO#(au1Nhg?_2Ox(>K3{0i>)j{z3xJK*G&Js?ZL54`Pd0NVbkK*%0~)w~Xq zjp=u}oK1uH_or%cWJiKvQNNqHJPRaAk9LvG#=88>^06$lKnC`v7{Nttqex~^Eq=ql z;4Gu7beY;XinfF@twwGB;@A*gnAO2v>!vYw&zpg1Su|PZ2L4tgA)j5F$Z%76`s(%x zICYl=jn4Be6?eF=yB}AojA23lX|Ne_7m48?MyuMKsq>}lSoLfc z>U}4j!-Rz3d5UuQQ}J4C>>^=-PhT?fi19Z{wtSVg3O~3!h|S!3jE1P)Kpk(qfJv)1 zDEK!WBz`giC-PolrHTc7ic%82JXDUN>Sp>dK#Qwh)fIBKL<)m9juY;@TE<_RiP&&s zH)hj2fnOb*!h0+7dA8PdJ~QVz=ZOdS^ZBFrsC#4B;mz5!F3Fr7EU2X}2Lsu?ye>x8 zUtqsgA5g!ZaQfnxHQ7%tp<6+(VENnt#GB3{pCV5o!nJMK7v+;4U3`Dv@5^HUXtaze7`_ z2II7vMA&Ns5Ue-|Yqo4a)j0_J`9H!hhYZ0iMG-rgr_fJfPub}_H@@Jzl<_Ku__?rX zdNXkpD@k=`pIzS2?|HXr)tChIR`oGx__qhOmFUoKa?j|#l;O;B?`8VY;S$|)C4@R^ zIMSlVV?=dXAD%Wlk#w$^NxnJhlhaR}P-NpbSedp}l)3y37iR(z}M>s}*s$ZO(Uc?{XS*`ZAE0AGD%M$^w0KX*0{7M0rkGG9SP-d0xUOrlb6l zg#R(3Xz&?&6YRxFk%m}PBN=x#4Zs#Z!_k|F9<*xS6uNNYb^2w6JFA{`gC$G(T%()j zOW&*}via?6R6>>mZQ0cz?^imIX$=v{-1oviKPz$}?g`maaFS-HJYZ%A$MRIIES~>! z16QA~&wQU`(FeYQwEw%vtJ-exeTv8UfUP!Mwg>U79Rv8wh57V#t|kkbu!lYGEMwl6 zU$K!2#mp~Ni&yE}@xYfOc$Tag3x719Ua3~aQC&~b;j8Yb;@K87vc?>S|8Rwenm7zF zQiJ0{!+_JsQ21eCEXq0l80L1I7bOn41*~p72ilVt0HfZI0C{_e>iW~clCM;xqH;w< z#R51zH(qqD1cT(m79cw_Qfvv9AG$8aVN!kh#e&Chw&6Z> z@bG6e;XkQ|&DELIiOq1`vh(O|vkbI9y&rk+lQI_fx#A_UyV0qXL8$T4A5iBZi#C2< z49m3Q(ft3Wq3O3ifSKPP139?@(IUNdNZ;%pbqs%suid;&%a2*JX6r;2rXkO>CaZ{r zZ!g5ULpsEdR)&ZlB-|AafMa}t{aY$uKMuJ`vr!+74f2W-zKedOD@wd0opSr$m(1SBoL6N;<8z|XpKzly~kp6x%lCpU$GINrH_2Z9<^md!W*CsNe z{Skuba#S&BEp~##?S6^2OW3REvtAPz(+Kh^V;c_toHZ^a>lBZ z4yx~D?_0~+oI$44<*W`VzrT!ner}+KFYe;yS4y$M2zhKWCI?qF#^R_4({W$)2V8c3 zEb+A8K%!JE=r5zA)c&0vEePCzmDWCnwo0Ew+Y-V-`fn8|7>pAcSs%s`BO961hI>R` zv5XBnevMUXShCRAS?qQ9P1=8B8o!M+gpDJY2xW2l!pG)KJZ)PbTgV;sh{I!bGLAnix1g~-Pf30ZZX4ykFnV7d=Kb8VRg)btb!!yAN?GPB$sesm{_?LecG;ZAs+!SVjac{@NG2ORC9Z&CzPW}rQSR~Z1SYDLR3azrx2!a>^1WT4|8DvDlk3^>d`45d4l$gYGY_G_~u zzmT<->X#YvFHaT-O{v#}%*{bUZ14-#x-JD@%Abk#E)>F2pH=9@@FV!fYfP5hb7Prl z3em~aG|lubD^Dw6+64jZaYGzkv{QvlyMV}*nek-Wjy0q~&zT%}y^uN_ z+Q5uwx$_sF1NoJKU)UyQMtcOQCLcL~g6SdT9z2NiCaTif^ocaDItRD!vccun3=OEw z#?vytV83gfsPdHwsW#NaZIVFrI5ioy9&$iq8qXsuR0>!5FG5l4&x4w*p1m8rUg!;jZMFC%A*O)_H6M9=i11$|=3jf8n6*hIos>%Ht2w1)4D3R&6^5iG^f`Jg zV~&1I4}t|<*`hD1YH;$aF90joi$H&|s58k>^zq7kkR75A?haQ6bDkUl8ojf>@Ubii!6N@^?&MT)#Xq|K(wa^&7Su-44 z&dDPO?k~pvQR(Q^(+zBMTP*F1j$=4?lHf{>R z!CM1x#;tTzuj)=#Jn^EV6CaTgRewppw;dhw>M)hq=Fk^E4M?AdJ?^{s3TZx+$C)ZK z@X7fX@oUEd+=x!&eOtV7T2lsAo-vdazVYVkPiqT0wsVCj@7=<--ee&=Bv5ExNx0Ry z5GwmIo9NAu&~HXs$T9prD0_hL)Yad~@W=&JU&`FxWh>n^WYb6N^bM$TjTzzM0P?)^ zA1?2&z&##U@OY^PR;IfP2DSvFWg6qajH@%H^-2V=kMRem+J*srvs93F-V{ttk%(k3 z`~@f9)ndIb19*R;hG3u`$i97#pr+x2d8NZI{&voO{^6ekGjJ~>UbhdXC0Zq42rnWsk6g-^F z_O~NH?49Ujy=+=C&x&dpC9^$0uky_7K7Qi59^Vx=opl_mA+>eQq<4!ZX_=Tsj9MO% zmSHVu$XHn{86S)78f3`j6{;jMJr*am_)tA*pFA-?oJw6C#4r3SzLw^O^&Aw4Zpct< z9sUXQoKpndCTifLy*k*sM%qK>ex?U|#dp zoYWXa7G7<~+1YQ=N3$C!D^~~oG0FyuGh3jw)=zNbnm%|&E(3!E0sQl}0poMmgZ^&> z?Ad1uY1%k=&N>D9JlFukRepgtsY6AL5yjxlM|+@{yBeH-_*PVU=o0)qMjv*c=mMzp z3D9k_gbCLi!6dsX(Meeivj1ByI$Jge$-g*&oW?pzcUMe89oGW!%7HGpxm?AJ&?5V2c)ZpT>0g|O z@)q=gp0R6TlVYDJ=EYi2T0e@qo+zi5lT_%WGtP8oQ4%W(E+Taf3yI=?GF0FFD0!qK z(0(^*uX|04gx|`*o8b*Mb#*AP6J3zq6%A-be=>jU67uq z+sM{S7Ge1V`0#E^BHr{CZyIz8?NL9A3pbA;fd`M`n`6$?mkXR(-GLA`C437F;L^zsXoHbAJ+m&5ne2>Ug>w%vbC2r3MW73mEZ>X4wPT2j{ht&Au7_$hV1VbIJe?3jxXN8>Q@cr3YnX^w%H_p zxcEMsBF%_8%|1uRsogNpCv#-UoxnsqD zLV?3sL8;kQ7&vtyU#>EjojQ`wgQf-w&qqZI>ut*T7n5K<@5OvRE#8G|OMCSh!Zh~h zZ9B8Nb&f@yc4n*P4$+MKS>$5STym@75&phqEZ)6G23^=?fgWW?fv%WKu*_fyJhOQ@ zP!!IB+;4-x#pNnM$xs9SR;>ZUhbutMh)iIiS`8nMz6f@ukAOEO90q+kUEtqGUAR>C zC$RS!F7jCr39{3*K#*>&=xbUp*fLuenr<=x4|iGs4VOX0>f&IcunkIgGOoZ;6I8M4 z@v)@s^Ir1S?IF$>R7H+?Gdy-cAXaMEASc@sa6{=athgWs{nz>tO$}O$YwjLF`I7gz z0L^$b zh*oJHW%yhYTR+;L`Api$43*ZhgYBB^Xj2(oOUBdAZbuTmZx|V7w~$OeuY=Zp&qT^S z>wr)D0N@#*4XzH^0sF0Yf`LoEg1G8*Q0q|y6F+L>y+yNd;JE}o#bSWC>eYO)rb4n1 zb@nU!^KTUyq^Cr_R*vOEF3T{T-D=ox#a>|Um5O5JKcR_xFA#&^{p`KNV`>rRN<(~h zk-5)S(Kgc)4BVFC?^+%+nMn)T@IPNk`tmHIIqo4j&~=;?WM9V4av$i2u@m@r{}udT zi9b8AhO@f+^=z-)AfBr9l8sPPWILHuZ`^!}_zYN#rw0$ldzVZgn}Y@uNxBJ{SGyOx z&b^0@m_;yk#d;R7D4HL6f1Q6lmdW=pZN9I35Np172#*#QfQ<)qLBaf5Fk^6_C_VE! zo;>m%t9~+u`AnU_H~n5Jz@35+@x6xsQ!8W^PozThy+k3lR$H97u|{yRq=Mpe${JRz zW3~eyQje|)Y?#L_CU72CBjHm6KmNxA}w8I)cC~$&PZPl zn{NbygVupS5cxpzJXv&a_f*h&OAmA$Rt4L4D#F_i>R{n<9Vzd%7i2Ge3o^X)!KwlB zAk=yo^sBN1#x?FhHDVcf|BZsILINIkp98rrM5Mm`33#J85FWDq40<+{iE2*1z|Y+r zNY1Ee{C4C^V*O$psT|!*_>odFF;$QJsro~bG8^#@@pUr8Cl*g^9!XBUmnX90zhTQy z<1u&}hgrr3Tw$S1u<<=&|IMP*p!)=A0yd^^S+YrHVnS!v!Vh>U9 zHARZIIi2F0PmQJ@r9RRu%e_()I$yA*or^-r+vk~B__`G3&klsX5)D$R_!0Fed*S`B z%<=r*aC{@mfJST`N6$nR(~BQxFvUp^=$HEU*eAu5Xx5t(BP(5EP^L>hpIb>1>KTqI znvJF{KZSMI9V4e5mDq>X(UJel$zkuIpi_7M}w z#aSE4&`wv>^>P;S)O!o&pD+UIdC@>SBLQf4H;IO{mjKP96W}$OaP)pf2oBSni^F!u z@!mIA_{5-kL1f`3{&3}xu=(L_c5g)v>v*6bT#r(L_o4aI!4Zwxz{n%*60~)=31$}wMkv%^7niVz({6KgvGeS1BcJ656s__`Q?7uE* zyle?p>mXp=Sc0ESc*T_r%-F3iYaz3Gl<;s<3G=maV>NYVf_T_!@%o|3|1)&nk6687 z97cq)vO*;?ii|kVdDeMJg*H+lB_oN7qDYdAtSA(+WtNqhBBhX$%1Bd*rlcsXZ$sbr zhxb1?=RME!xj*-HnW+1!o9Mn7;qPV^Qa>#oXX#eXjRs3{7Vqsid6BhT%$Z;GNuLGX zwmlZdl4f;yL8qgW`>ClNXY%cDCUj;w(K+rS=i1HiCXZJ|L*1dEd%Q`o-lhpKLw8@e=&#u ztOb=*SAt~~T|jcdOJ>WaO6EgnC~#Tl%t~-QOl@}#_R3YkCO3{^jc1?mT-{)DePS)v z=!r(JA{=nFs2Tpte+E_ePvAboy*R&O7*+p?$E!?AaNw7AWRjzSvs0#G#V9{yeq#k{ zLf250{B+bc_b(jRb!B~?8n6xe_rQ1dKPKGA6JE3biDDuvv4@EPX-J(!ZdDAO&}zYf z=6h+2<{FddUQ293;G&u5(B8*)S^Wj^P~xODMq2UcYTHG$D|J6Q?6wojuC3?$lGXUx z`aDj(FqX@c$*0qwNTK@VA4up?2mJdh0$#0o0jt9{qWsF$XzvaF4$((D7?pY%zBN2g zmK&_`Qk-HZ<}6 z{na;F^5iDZrSUW``N})aL-Q&A5@iN^xB4?TSO|56&cQizL`Z<;VvZ?nB2!*P(u)29 z8qaqqlzp8;RaEoHs`_h0klZ8>20h59ZJvg;5yQj*N-e6mXX7I22p>e z8gAozn7&v$;J#%~@UeCo9NaRM99Y_c)m>{**~#ztS#}@1WpIb_aT@{N_bb8h3=3*h+cUCwTn_5S=G|jpjSA<7GUHHHmt9*CfVC(IhzQBex>!G*z3ih3_@i;?2JN zliT=pJ7=+6ihCYlO?TK?5QFix`0m?{cumk8+_PI9uU?mr{_6@xB7Xe6pUQvWrp`3u zjL~<%;?x*;tUQ|;8?R?16%v^NvoOZeT7zBnuz!VpirPFstXcfVWrlfYJKHjAW56(70a<+!FP{zKjM?6yd^5EUf}t{Nvb& z(nhrKvoubQZNp!RU*nMNLFBew11c(f5AS*WMz6x-@XPW^Ts|s>@3e2k=ibNRq0u}f zX|wGZ*3vYkf2vmd9p)s6-a0I@qJ5((vw?9q?bhI0)YA!5;K@%eX{FGV@+2 zLA6KskZS6A{Q3SN^31dz8}HpolsjeVvTz};$1&X`ea$Y@d567CYpb+OPX$SsFj3RE z|>IWB@WWnRIv=Sb0;i~A_|Z6+}{k)nk$m3Zq0GhD>)(Y^Ef0na;5!5^l^ zpxNPH;DUsMsBCxzKH%^Rualcb)%U!od^|e0Tn2EGi7V*Sx+;{vaSz_h-^+@bs*8OE zZlF)gAHuTt{jAbqWAyUrDpWh6iS{?WLC#vU=~TgduJnr=ujf(*ZK2XF_Z2 zMd>eb9;xJ4#do-^!4ccy(T6+}=zrOk9cXQ4{%#&+7KzOOSzHo`zjz){+sDB4nIU_x zvjsk=5JNLBOJgPe9*&;S72XH48rlIxIgd(5p6#%p$rSNSo=}7wx7AXS;zeTcy7eU> zZa4um6a;ap942YIA5x2<40?Ol9=i2&3i*9;3~T+4r;~=?>4K2iTu8(jnzm~fY3Dnq z;!K9gErmkzu&)X$J@lYXu3I?g>6vuqvRm~19ZjBekvT8uU=Iq2 z4*cn*4B4cMQNtkxl2f)9XGO$enb_s{%%SZ_@z)5QCTGDV4~lbjue0eE&1CZ7&KsO@ zMU9wDTSY=Ue4tu!7toj)%5JtS08%0{*eyoN{N^`-UVc z!%%6p75db?7xsS;fSM2D*|pP@Sh`>esDia%R=`x&FVh{o*^vZ{OEnnHy*wr>?*QN? zZ-UL{|BTfqjxh_XUBI@{h2ZIU6cD?X#nva*0kh^$#`lARK<&0F#$mZFpNqa5q)9IZ zvHcr>|9Z@-=O1QEE4tVd$7Zlx<|zBP{~6T#{0hyT{R{tges@rU2x-}d)0@5p*$E0I9L_+<&X+K=?` zgd{I>`CZTS#@4AL{l?N6oiu;D3+4vW4-D@JNmaGARzhKO|=0K`&q8 z@9RY?wp!EI1*`dU0Z+P}@4hZAoys#b)8OI)Rq40C>!C-~b2bLXpt0l?Nq4eH}<)8iV)D+5p|#PD8~%XF$x9H(>uv zNq#4>5+u&C2lCy=fMJ9s``~ImlDOH7I_HMto8bz)jOZ^Wz{bub;Bpuz6IMkg%a?FR z5`?(4EjpZT_%beIVG*mtN<+JEmytkiB5tm}NUG$$IQtaHeL9p+jz{xZ_Pzad-$5R? zyXF{u*}`h^z(#B$RlUvQ&KDVHnj|Rt(k&br$6LzDz0?P znmC$t=LDxeZ3a)bUyJwdMH}tDQ%^-3VmLL2kKDP}nOwe)HZ6UakNZXm*_xNZ?+z~~ z+WVx5-sO`x{CfckaM}hdlV_Mb^Hm|E<_WjXgwu|jxP0~fc&SP7R z_t$2DYw=~wJDWA&uW%p8ND4%Pe46u^y&<2xFs9^??u4f=HCr!cy-1 zELraxd=!#`1Rt))_q?i6@NXY<@5(zoe32o7rlI(DRxSS02yw2fELMBF2I&W-;lRqh z__($#wiY;w8ck0ivw@ZHzOMyzxDw86nrFoCJSH&*Jw7mwS(D6z@oR9p?%#3(HfF0KPrmznv&eIlV||RA z?^#Ny?NZKOzK46;d5H7jlIisAR`{v@WA;T^CMzIb1(vbD*;pq9R)NoiD=|I}WpFIq z5nKbT0S``&MB%;_Q^;Whc|Ou#j?Y!B!(uKY-N-&n7OZ7Rd-?@7 z@!l8q??*vs^XV3`pPS8HiR1C?)rL85KG!0&NtH8)`M`>wch&O~`YM%*sD}ELHS&$0Ezmx%=WWon}tz{M343W~I)p*$|1)RH<^5!LY zny5HTGnH~JG0|*Zz>69)q|PM*v{&X3Z}e+6mzNZUE_@b5c|BGr**6PcUm3*Dz%+R- zUr%$Ut&QBo)z#dAl1u=&iwh%e}ze-rdeyt)gzCH8$5o$zGU;_FN?MHZDh|w@bhRx4CSV zQZBpRkl#0n>PIfe`QCE>-6Z|!Im*@kpr3c%AUl1k$g58!G(h?&H!|$Yy}VIMHQpT| z&nk?`4U0o$OTY%QuR(&O?s1`NF!_H`=j`#zfKQsx0?hewRsopzw>nhFB6GC-=fov~`VBN&J~ z$SfA=HTJ(<1b$CB$v8zhfb79LKsCr1e2O>?hC@<8ti3ESh~wust_Q*L1X0#7`Zp{4 zcQ+eTPz&A^s-Qo&6Y=A$Z0t5?G1ePN!$y~avEH-y=;yDOxLxTu(cE2$MfZ;3gL_tz z-fB&9yyFcTo{^5;3~nU3c`WuYdyJkLUq>&*r(yGuA8@Ea3+^uc$VjSWvm;u2m>WLv z%+)?I@V>nsW}lsp^rc1dz3P0ThxagV zDPZ>feWYM$M6%d3cv;jLl2X?|9>06aE$r;#bPEhQ9o4DSTi+e`&9q~s^JYNzUk|~C za|fZ-u0_!F+X{GT{varhK+taGGvND206y%uMDC&xt1bS9wF@V3T(twyo7+lCm{4-M zA)Xkd-5}A4Pl>d~BDZQ}=( zlHB6%aNHaviH=3>1VX+qfrH~wwm8h0xwaz}nX>xaeVB=NzVf7HvrprDr6r`K<~bGB zR_DU+Ceam&cI0?_BAH11On#1@B4)0)@Ycu=C_^V4tr0(l4riGlg^zhCt0xwPv089^ zN*g=8E0;Z{JIDsQNU~1scDAB;2|K9Q%ak`CXLp#K0NI*YjqT~ ztMYko@#$cvb2ig3@sMc?nh%~O-!pcz{t7nv%K@{c%^-xxfq63|`17R-#=a>T>?Plr z0;@ux^?oiZdu|+Dz~Pd!NGAVoHz7BO%3i48a1n|hXI?_{9%@6} zd5X0+GltVvr-I8ci`hN*6{DwP3}>n(pgZ%TaktfFDpj?KuHcT5wH6*kc2tIlto0!G zeY}XaRRPJ>*P>d7JE^~BJon<8h!VN6-^%>4=v>}^kQZl992`_Y5K*@zU+;P_#^o`sr(uHElnW$)F zcVr4oo+roVM>?>7QqHl@yDqb;`C%}|-GLEh>hBarpBxeAo?mUFVhKXTK~Ig=Ttm3v^(GV|LSV3XFe|TV z!(6+U#VquF#|kgXU;}4N!91$~9C(}GN3s2n+nwfMvS@q@9r^DxkG*bg+HLmQBr)Zn zNvdlk@0gzy(d&#tv91l!KyfxS8as$~jtOBk_86Tfe4MlSx|PdA8oWhXyLj*U8FbU* z2i$A*0IEB?hNKp3#38av@%J-Zu-s!aG{xXEr23D@$zOfkK=FTEe_IFLE4+_0ZYt#+ z?DH{+oKeej*Th`0jS`j9Xu%mOv#5jrDUvqRk=V`5!7J~kkxK*ac+)vQs`x#Q-c!6s zzA|ORZch?{i_fERzIQNd+#cQY^MsGK+Opd(>44v^5#U^bDswz_1==eYMLQ>kaH1%W z?-F@WJog-;FDo+WQl&FQ#$plCee;g2PnD*1kr#;(NyL+q0FNxlz#@4~*#Q zIW5pfiMlOttCs}YQ2QEItn7hThZJG5=>m4q&~7%N;0rLl`h>ZZy^7UYGs?(Ksxs*z z`oJhm94Ol=0hed9z^=myAnKwjcy@g{m?4qJWRG=%eV#j*vue3OeIgdL7+Qgx`ave) zQvfq{?rNqt*AY}M+0E?U-NUqgTFVCgfMCANCU%C+clK4|apu!|4!u1PgqI%l#@tg| zeC+ff{-Tb_=8GTT;x(PvLM$J@H{xgD?oq^Tz!WPgMPkSKhydSgA4v znLn__3lAK_egRVv3@V2Xv4${6vX8wu+X*;b_{$XDvjrw6J=iN=npjArf^^3E(ghpm z(TkT3;>WM!aZb!i=RAauM$D_kqVDJGd%$Mv^BFY z&vmhm{i~6P)IvV<{x%w$kMWzsN;vIa3=Y~9KDdxm-YPbsN@7(j894@Eu2B$e^9cS(q#aaC4O|oAV z6Rk&0sJqJoJ&1E*ljjWrTftNidb9vEzH()+XP;p|XL=#mzA@}1_!`}I7~;Yomz%V7 z_VNm|MYyH;Z+SntT_*YA9Xz$`^SHn07@88<1KX$dv!{G-qT}K{@SadQdV8^g4DK!B z_UstqLi!SUw#M(cZ=Z{}y^W8!uK~^6!t*^;y*m{9#6tXZvj94pbOP#H*Fj~u2e|UL z1f6x>iCg7&g1Zgc!^aK#Xw{kbU|e^C2P` zFr7Ngma<&f`jgU^d>?#`+}G{!xcGr>Cg>R_$`WH0&Lpt90SpyZhZ^SM27ZI=L9NK;SGtPDYfgVg* ziDh0^;jdo{knZ;qwE3|PS|#)dX?~GMOS6B&MfOiwBbj=3!d?m*2q&?F_g?|e(IBEZpOSmWd$g>GIT-H|(olgqFe^!?8`!zEN zGnJvoE(z#z$O_KiSPmRF;Jixh4*^pa?d==@m0|z9L9|nFxMvZDdsYX0bp2EoI?0 zKX&!M4qW5D4DrPZoUQUO-$j~da_{IS-mXzm8hO-~4hi2Qg*md+NqGwTS!B-YnV7Qk za<8NPiU3{=`HR|$ACm-^elEJ$j`R7d!^Qhj&TPIeue@!TQ{8!v`{?CNOCrCa!_N~@ z>QM`{Z|4V?=GX*X%{%d>2Y$qBUKGhO7UHJzch$A`$#UN&PSMK4qMZHQL&QT+kS9&*>jWq9L)rJV2<0nSTI zjXc?M4E{Ny0D|}X0CHOrh^$rZsqeDq~7?z)tSOeOif{d98_Z46bec3!?3EfzwDTxEAq>@mv9!tFf6(P1$xZ^>i@kezXdR zrVE0iTUFrXcP)0{o-fcWdI!?H#kHPCD$(E`}!lwDw#l9kMr=Y3xb5a zttOh)gm^3n$E&*{QP+VQ^l7mz(Vt((&(|uT=&M>%ykDHy3!J2pi?&hY&iS0Qej~k5 zpf2XiHKA6Tu992 z;*hVuHXL##%-xvl7e;?Gpz>&$StHSHC03@||&16y%!;a1f6 zD-A6RXhEH0NAR@;i^wpwAsgMK@sEribYY1StD^H3rd}?E8&)V`u51`j!M(&aDw=lg zQ>HI9mFW#B6MD+^E7{y=Kpm{&=pnr+w8r=w8CAN7fAd}B;;nWtm;da&-=hW2ddYx> z=XOBl&nJ)~tOVb>io%h6RjgoZjq^TVpjL*N+_t%gcwz}jydN?nG@zi24E*1B)8NOJY>q*4{|aH`wr(6DT1yYA@VoIn)^wrcLhf1u;67bm#Qk|UN>Aqt z(_7~?$+c#4yaKtQuqTC3z|jLHO|e6Mg7fi9Nl~KkLzYHVkCFootLSN5NdrIna_@RI zxDehovinv7`poH*x%FCHys$Zb`@IJrdRRb`SBw#>wB=Yer z&F?z|(;;;|x>Ii+iu-CpSF?rso$QtaiZIRj0g!aB2jwP1DdZ)5L9P2e?vn7PX_7-{=pT=$fJ09MXtMh?wj3bUs%W4gUe zwfqU-SQN>;-@buq7fl9st!KgaU&nwo8eq3BT*MYWvWL^(Xu(Je33#(a7`sis3Y}tq zplc%p<^425jc)It_L1Gl{ZR;B>@*+U?3h49d;Xvt&JBr~=%UtT*I}{MeYonAItt~p zXd(@j*xjy!Kt^^k=vY4pT$37^Q0paNwVDv94Kzl_pC>@;EAII8EM@e!uZGxOR6@Iv zGZyz_(5~Og_-K(Wsvn3%GWQbE`S6RV?Q;bd>8&8Hb}R8Pb<>8UHx!5|B~ zyL}4jU0*|7gY(J!#RAm2CYzMz<`X(+KK<9IK#%kHxphuFCSuDi$&Z;oQD$i|%! z#D~lRLiSr2v5gI2&*@uCv&KHw(Q$B zGr2>v;#_UFJUWDz6titkH)+{a8YlV%p3G-9@{ ztTsOR>ps)jaGTM;kjlt@3uhG8yfv0+-wRqyzkme231;MD5G%O-1=~3P4|_H0GP_MA z0jgb%M<=3HP(p1N(oFP01G8?zu?xdGnlSPqXXsG)@+ zZLogK4)$ykgC-l6vIn;OV4kf{1M~0a1DEx|;KbMt@O9S`rl)b#_|4Nvw(xs7fA+tS z7_?5oClY3ou;0npb#@jK+TV`fy*P)3ek5c4@F8sUypvpYUqa=Bt?9Ywvt+}bA^c!~ z|6K_!qcaVjk$$cZhe*$$oAXI9&={Uh3jP9b2rz>!vbpo!`lHU&-)MRE8$5rhFbNqvNnqCnQs0qF>`*s_2bN92>)=PK zIBz9ygS!mR($tPNdJ1vOP$ZYGCC&wkHj)Jgolw`0Vi;+g3nOe_qNM@xX#3uCC^xy9 z)=lU0JcY%%3!a0V>z)e>}&yTI{ypL`;dp7wjGD|85`isQ_o>WwKJ4ER02C? z#jy2>AhM=z6EV1NO001=O>k7_Hkj$sxnJGMhDG@}b?F;4?dTs=lv7XIN@B21*D0LF zm=L(Tk@)fZ6_YBHWVphEYZ5%lnJfBmVbfl6g+h&->ar!=*6=XmRJ02UAG^fv571(* zl;*L?HG|BaxO7-i-a)j!YT`5@a}sDEg|qU*@Df8061;*XTc&QqVoksBvq#cIBI+eB z=XWjEpWxwN0p?ie(FFSUy%3q%d!qKY-=WtgigXrkM16cR60_3`HWXY1ol9Z?uxSU^ zbq;_>YnFk&Wq%p_J_o?gzX`66N;65*pBve6XPD}hbHLi#TqZF`3XGKIFc%;2_aGe0 znH5vdfC;J!KJmFppRcZ9TsC76{81GoX^@jBhC@g6VEZ?IABN9QQ#3b(!Iq}%9Zn0>i`jw@hv&e=yBW0l>w>I@(?EH! z0Mp16vi{=>(YSpKnRZ7D{|Vs{B>W10yex&Cx7{J>jq=p?@BlquD#3Yul;n2gRnuEG z|B>BAd?tSJByQ9D3nLG_ARF3e6NPu%Nyvy8p>_X=o3$z}tX)c$grC88qrc+D6)&)3 zwkO#qRY+zo3MQ*Xji~8?UV`mI>Em)AdLe2vC3Bv=u{cNmtJZl-V1dh#LkK`-Wkgb^|R3g378AUev=V5~#8hDG@0@zVYLGz6hj7;tlkg`1u1oG9B9v-XM^0Uj4 zs*MzSkkXA81zw>-wy){yV;$VBa&g|DtHZ=v$Q#R88yV#G;wP<`QZJ9wB6FAU7}t1QJN8L{PC4uxZcD)w0On^H@4un zLdLKn(u$pyOj*76)$E3>zsAlBYT@?ELnI^73Rmc*;EVzxGH_m$NT4=cIQkIZ(yAv4 zV*Vu7gW@pfe$ge}Vp% z6b8dyZKZD= z*Yi1^Eu?p2GUguqLh4FKX$ap{Z`R)lcU5N5N6kG%r8SD2KfIHEjqxMe7Hes7KqtO? zp%Z7$S0abZ>alHbFZSTia}{$&i2T71INvjb7O%TOLM2X-TS^l+gWnxp?GlE*h$ga^ z{wnZ2a*}W)SPjy3;Fa2P)^S!nyw&ZE*ydO~w#yFRat63i zRRG%^%7?eUp2mruv&p`|UTpYP3&lk5WN*%7*wE(?dOUcCj825(xv`J%+!vu_fnO7; zx7DF4iQ8!4;YBq1>{RaW0wd0HY8kDO8^9J>b@)8}h}=d@+2CF?p!kLXp*zll?Fmib zqV)`R(G(ltay%DZ*4u}|w@t@y(|6HvlLD@=<0EnVRm!cHZOhH^s-{n`-k_>?t!QXj zHhM6o2%oK402S}Y-~}=Vkxj~WKCf~INmwe*~S`0-I@}!d__2WcxNVI8z{uM9v7|-(44z@%zT~=jJ)|@v<$XOCXNq zSUzreGPBJ0C%&m9D@QlP9rHXCyud?xQ)~vvAIdK>YW*1(wMDgv2!3`P@)7w0CeF zj7ha*SIv`#PDiJ*UR%OI(uqpY8U6tr>uNOK&v#VENUMXU)({2@7cf>&OPHEhiGXJk z0+^>$LCrEAv!L`LGs|N>SUIv3bW8pPm-CM@uF?wNOv(h9f94mM>#6}FITmEdZU7g5 z8vqjj1w3)j0mH#POwObN$oe$Iv@N%0I@EmGAFWT|^&4-X%kyCLV#Zq(Q7{cn?O2Oj z&)VTn4Q6&IzN+dIfih^9dsxEIf|`#&Hlh)NYZUJiX<8QPUdCkSap-#>YB`s z$hWeu_B>`k%{6>WlI0YzOclZ5J!e#-LxF44!+S5-rLX#isj&h`*aC zl6PK>$7BVt#_sRPLPG>EeDo1EZ%IWUScYyf`bBponBy}JccIb4XOz7+lePjtSLPMa z=r`-=fw?yHZ(;>;R$f9f9F_4(Z%QiF6p6{to5VxPp0;oE<=-8o=##c)a>->6>FNo^ zJ>@g7!NW`NcHbiQavK7DThrODKOykyIdPV{Xs~J{V{FgH>9Bf4n_b=M#7+-RgiUvR zkeZty-dy?*9acVyzNW^bF%fw((ppa9q90-ZYwPjzp;UDE**$j7^D%aBpga;j*pGfE z%)u!eYOr&$2x(CdA&xIJscfYp^{9@ev2#Due;NVwPFz3vqS8z*i^>yz=7RUiOQYY* z=Cbz}%wli5I|CQJdLa4f4d`|n0^6e7;q%WA(AnrK&>+8*`p%ono3?#~J6^=l^lfoe zw=#rtd27qrb#{^$OH25>`TL>Mf_iq5SPY6-HwAn0IdUy^dgSPRLsG1;iS(3NlCj=v zcx{$4+27xR&pN2%Z;_7ptGp(f`DhcOBS~;THy%!oUtkLa6tLyylUVrSB#9`LrRzUN z5reMdbm@{gT&IaS^?PlH<7ezaDMoKm-76V#K24m+&h#ZdO9(mJCQ6Su?D-nL#HV>78LbT`Z@u?mK_v}rkQs~jbopS1i`v*mVhHIS zT8dKo9-_E(Bh)%&I*d@RgLgMv;=v`1{ zmae-9KCN2?uB&%~u8{&zT9Uz>2=)iF1jiWxr#cX~<{$Hu6KCh2o(ZnBbTTe;HGz$S zI-r-tz~a?wn5GOBko-9x^f-Egxi1*jULycB^_^liE&0r39k~vAEK0!|{~UO3tvt$f zy#_soC(-VweaLF;CkpVKjSr3%pr_3T@Q059xLqa;FSD$JjqUqTgS-ViJ?kn8ek+SQ zez_yrlxq0vh&$}LU_%2>qe`%@(BWQ@;k zS%}XW-^V{B5ni}P4j1gm#fz*=-A+g&QlGTsX8tz$;; zL30#qcr-3E1omjha>skEaS@WFlO^b zcBdr+ZyQ{LA9_QP*uQYx&_9znDn*l3-WqgL=m#BLDaBbH4CR6w-08kRFS5zV120cI zij6Lu#pN;Ik+t||cx=5K8@<|sP1!pKxcly8zbZMfH-}EMAv!#Ga{4s9G( zlBBq6o3C-BGPgN-t1ILJ?;PDlj=zI-%a#&XBzIy+Dy88H<4vk zckt$!3S@JQ0a*p!!PQK7TCZAhu68p%^&*Yvv=s##J@(HCcldyf@Ol_nnNy0vpPyj`+D(N{v5kuU<@mq z+=+KA48u}!nfRN97v9(BzpG&uD=6p z2$~CAYi)p&R4$laGzAPdiZONL!_11$AwXiOEqLn?1!{Gi!2S_IP^Nng>^EHq#*b_P zHEa3bN)Z(#659@^-jG0f3__c(-$3$n!>}bMj$7{cqad4SX!xZg-b~c6$+R#OEbmb)q1V!W)z*5;d=y<>oo(>X#<=6Sfb(w`=1Vn+h)Y%}tS_qW9 zpTkCMdJNUR8sQHC;aK#=bZi$kh${GeumC>``r?fiU0!U1*KbEQ%*N>zonFHjH zP(KX@JL!X-9;g|u#x+DF(qOGK^ux3x+-)x@E-gHYhQIy7@6mBod)X!0XOc%vu3K`U zcRtcbwXez4*9afh^TXeKrjumn!|3nvAy~Ek3IEwrfWs4)n7%4suzO=1;Hw+i{s%d% zecBrK`AH#u9?%J+1*PC^odh=LVhFO=%)n|yi2RBP#4d3TxZ}nyTqtT!gk~Qgo41wV zbpLpKed%)4+;Nk2akquu>qO8%z8WsQ&S&7pXpnV(TFI5xBuXyM;C`g0(@Syl>0`wb zB6sRH{!`(FH6GqTLs%KN2K(`QM=#m`W?KR6KRv9+{$(IHY8tynuaSMb>?12_!$Sv* zo+037jb0V0(IyK%$K6zf^R|uVw6|R5?wOoq;TICyxV&mM_9#SC;kqI`r>nF zR}?_OYVAmA-(qs`ej(9|sUxlOA@tXdLb_j*pKq#~aTY~(^nu84eBNCKUw=}FMiaiH z*M%H;chi`}dTk{`+AOi3Xh8KF%+z0xLWjce-j3P$ zrtm_b+Uo!;22%j5kKELYj8;V~){(^k2NaB_Y=a5NQGgOP8fllk1LG45vw&u=F zcK3n^R&O92d<~BR*0D}t&+kYeH$w<$Y4dlOE~f*rk8c?F#f8l7Qbo}HI*yTfCIpn5 z{6OpT`wTN%8FcPk3qB4gf$g^hSuMMr;NHLc%=ncNW+Y35l{ntcNaf1TZwz`^RVUCyQrza9XoZ#kVDJP5bC6bUt7wM z`PMUuimd={_TESw4n%Nyrenk-yAT?eKA|ViW>b<)dH39paZL*1yj}gVoKNF*YFQD> zO$3SZmQL2v5T_nGMJt#3ZRjE&!-w$>5pDE%mljcK%0xv9g2?wp20U3A25-O80cV~* z0jDRY0Qsv*>^~_x_UfuF?DKjtw)pNzHhS@E5O5~~d^>4@mX-Y>J#Ag|yN4Qmty4e_ z84i(n`-_CDFe5UxtH{W)6~ts%@lq*!^xQG@Nz^ElyvC_pW!rew!0< zk@Ro;)2kYvuhPVxcbehNM{|H^pbAJ44FffUyTLmndzfV6M9Po8Ku%+8=zaln?r^9c zjT_XUF$r_IqW1H2#lr_gC(?)3J~E=g_m2^+hePC8RTwEwlP6Nb9=IWSCvMhB!9jX~ zNWo+Tev^I*PmJrr!#2urdO|ttGTn&Pv=C;aK2Lza5Bx4#&3A_9KFZuyO$OS6FM*?I zDbVzM$D|vs1XE7$1f8{o;HFI$P*FBxwqzdx{|VWH1@(MCQ0smGvTK>Bf7`*irbYbs zc@_9r7{%w{GeCaHY;ayDAN;y~i#hY*B~xDWl(|`Q9#y~8#=)Wk(BiHTimv^RTBhiu zzkGI?wlc*Ia64jUH=yKyQfTu%wtIe#glQIhwBS5YB6K2zfCqU1%h~*9Wq5t@qx&t$gGA?ys2O37+M`2Qu ze+4sNg2|`GOibTYk}_v8qLTHH{A`J*E1$@4@}M8zW7fkRhr@_f%NP1aJ(L$)IFqMt zF3vNZ*~|HTwdTT~%X7kaM7Z~__#LgK>u8X7E4jJAfVdc>lZve;QR@juY+9KKpFUrU zzC}nNr-&S=`=JSpy6dw6MI&H4^BHXFQ3kX8ix`>HlZ<}uX`tMg3D#V#1;y2JDDRat zdGn%y-inW)Nh=Z7oOWa4+_!f}!i}J{ux{c7d-VQEm9e{@2oA7^! z73t(fL%MU>OX|BWh5D<5Fd5q=Qk4?^u;s2S6VZk_uzRZ@3dtPZ^xR= z+%ffVntJIV-7nwDWxD;v=Y&&P{omzm+xBa4m!dZA<@*#rdbr_8vI!fls>0pM=GgDQ zA6U`Wf=I~t61Tp4WZ}zNvREPqPnSQ8R;XM2> zkLAWT|K#M_Pg8{$L{(f73FCVT;tOn1kj!lIS6-dmt`?%dnT=#uR2pt-y9{~XZo{n( z5y)qS3|bd72fgBqQMmC2ti|_C*laUKPbZ(k!ZIKJH%ABLmTm@VN5X;W+`~}o)KU6u zUlhsQewK#bwc;wj+jC`wquiSFf2iQ87%)8Z8NdvyLP1K)rjhYenNk(a(H^@T)1*uI16jFS$`PG-t)S}6c{`J zv%pVgX^=4ZWmp21IrxHQ+vfl|-Eij6scs;?WiA*9tO1V?_b}b-1lXh6!r-%C1z0>7 z0775187tOT0Oyr^Kh@yX_=O z&#|pUW6;7T+sY8yHKV>7M7YKgo6t5u*1(m{N@AyK5rk5drwEBpF#7`mLMa% zFfR)EuUreQ=wkRH%!aj+2xGl+h1dZ8|4ESP1X%e@0(AM?GmF~Ofn#74+u0(7W91S^ z%Ue(EaPusg*Thg0e&1d0$RYCIw*~b2^>&)DdIp!Z7ja=81zhv*DU{8Vpu2NraeeI& zdpkFSHvgK#nLWJE)x1gLHb7}!`mHLi_3J{)`(sOA;vxzgw$mV;NW4vE6@GWynpnK^ zBm?{oknD%IIH7J3YIsJX%Qw#;iRoedxr8)3IV+zHzb(ps3AhT}^COwK7<16Bo5t){ zGy_ZRvcMZd0kHN!JRDFti_a9DCi{=~68pC{bko~nnou1^uQ*83`0qZnNvfV?DNG~N zLTcDQ%oq0aNk3>BcN95y%aEr>0*S7IJT<8MpP}=9sIiU1xQ6yXi=wF%p}N2Kcuqs2 zL{hR68Cel&Sjnig(^S$<5-O=^Xc$RG*-0WoNeFMEqVzt0z&Ssh=REiQ9oO}_+Bt>p zj~u0=7X0gYGSO>%N=w!ZQ48%I^tJMF_MxSijh-@P?Io9(VEi!KE^>@393TSy&>FUm z_uyXNmq{Cc=#VK=R>Zd>21o5aPh75zvMCLv+!?bX?ny(jAV0)jut#H;K#Uv^r187` zoL#D1H@ARI+;^M0d=uqvTwcQ>{R`PMaVc)bP(5?sZbCLoXOKNNzp_uI;jCN*af8c( zxJaiz>>EDE+Hcgeorl~h@_34jE;_(9SH4f5Yz|4iA!NIq46lot&7E3SBp5$bCs2AB zZYsNElIfZQ0fKSiUj>_^%mwn7XA0_XnQ+k6!gZ|w%Drth6fEQOVi)ay!p(oLz!}S} z=h#eM!yosVIgK61b=mBvZLi8{pLIX!dn7@M|J31zsAw``c^o^MNM|7G&|_dxQ$ExF+DpkcHp=U4ORjA^@}18t^cGQq5HdMF>t7&oQ&Acwkz!qFAtZq7*mri8QCI7tV#A-NU&!igQ6( z>dfW%QkMH6Ar6$Aqco&qaBMCnBRjB$;3fO;$Ad}~xpl(msvAdnq1aCh{nRc!pHeIoI zmT8=Wvgz!3KTPe?6-@(9)o`ywKlAfj1CpC}n6wL(()GuhX^V3$UAyQTd+N8Hb1>!a z;s8Ugqu7VbEwkb@R$t`$OLlWp$7ZtCQe&yvr8(riV*>F{Da22n^HB}M!&HVnUI8(DBbHFK}bW2Wpu| zsDP?HZXjhRKC?Mfx~QY$R_6ZBkb8JGfOAoZ<|b{nVAcD=XuaEQROkE(jjHIQt1_D4 zZ)!?(_NB7(#ba4ORvY)$Wv^i0!AkCU%PlTNt%sA7y3TEB8{ot)hH7P_uSe2rLt`Lo88Q*UWxh4A#CG%9rh~D zl#WZYCDe{11~#+E*mG-0^Fb+W+A@IiQv;yqMIe6M5Qdlf?Ex2=aVV`K6&7_XfY8e? z=+Z%J=+Au%EzaezwbPRC{qj-MB3W#9>K&@7`3E+Gz362|84NGl1h*RW(C*}9G*oh% zZqd`C9b&;m=42Rc-D5zTQ~g=*=O@f(LJ^ZVqQQd9pD6jbEGM;a3fGq_$xYYI zVmc?zu}onH8cek4v6ZF7E!>I(EL~0n6U51sM|beM-FA43fedWkbpa(_n28cbKEsTg zOZeq7)Ne1_-Lf_KUE^KY z$Z9Q?82=FmbgAR7_7%8%_7?KMC7Ue1^pq}qD8q976IqU95o_yhW%1&O`&Ajw4Q)BY zY!6IfUV2lh%UfQb=O)FByCmpNSxqcls|^Ll3UE+*7yLY&0*9Z7!|mukWPd=FOn)Fp z)dP>wwk_+pM=?DDi-neg9#_Ko-R?4%*Tzx@1*Oa-8+q!laxASNdd$_5E%D%QEuM2(2WgP)o z_W3&)sMwIeMR8Q2Pn2)6^Mts+<|eGf;0LkDjwG7*)0nnvFT3v<%{5vluya>RsB2ONU9iuY`aKDz zUng~&H2qhPKK^}evNL1`-`9wfiFYbk`O78j>y2p6d0{+vp5nsK%;%;ay~xgAO=r#J9jtneJBv9R&E(|*m`LI)_T#A%J26I^sSi|8$p~M1 z`$(t^0=^(9X6X?G7T+(AKPQqur#Lo*_@X)3k;FI$U{`@I|ZtLyf zS)c_QN1D*#g9&I@b1LM{;$W}VJXBnq59_3Nz@}Vtm^{p{FB2Qk8R~?r`1#8p`z&-f z$P=V8>tWmi9a!43AIU3?ArVQcbg)~TdetS7C91!O)z@|Gk;fLM@H3X(9i2yesw}zZ zAK%fMs7P9?^ntd!1yFTfpKXKtsJY^C`Z&Ryj*fkSdn=uY@kk3U1~oifpoc#=Pr?56 z`N+nw16^>7M6M=5n0GwUJw1!r*;#?CY1KID_+>UT=_{bgjbqrE-QDc{wma;7>j+D^ z;=+AA{Q~(!Z1xa)B1;P&uP1ko?a?Ce^ zd#@TP2q}3Y$jx*W#1u8r-S%TykeWLCB3ec#_+z&G(OoK=FT-SC6p_T3vv|yDL+Jmw z1e-3KjJMy@h18w?U}f(4(j6qBjchU66>2%MdD5g~C#5&Am zxR=?xIK|E?CR;j_ZPD3BzN%J`vbUGW`UoSovuF}oye1r~Cu_jX@M36grqDkx26WdO zL*MJ;Ae!Jvg5Jy0=FOGFEOe0d%1jizturv4X&KACJoB83Gb$B4%TpDsn$yE3?vJBO zPD+!njZx&il{vd7p~8%UKGWbCQrv1@XA*PBkZX&$%z$66+xc3COX&?~GyJ3JCk0QQ)pVLE&edlfJ=d7(Y)^J9_X4$wDx+7!9qFYM zeQHqWK%YNTqRpZ`q{FL@DDr#5vlmOTb+kB7xtorBR#7F{@3@n0*eXo-wO*j- z&rD)xNGknn7R(<1drR}VLk!fX(f4U$yq{8*Wldrv)$%e#x^$%c9qbDvnR07 zqKEAK%n3IB-vuy5<0y26s_5|i0&JeBb%P&vGae%>XtmW2$Ve3q~ zm)B@Ml~rS!q3fC998GRblOp$E_bFabZE}9+EHdvzCRAn2hc6Xl zKuRGVXJ+mM83j*BRuaRjXUzvEQ3G<5_iWzP;`7EI&0_yLCJJhVLye; zx6EMk0e0=A5j`<8kcQt0CDNYZM7Lrye!DaSw>L&%+eucms&0tdJTYY}Hfyoj!yj0m zRWyqcU(Upy3bA=@c_e8tix&LRVdJuDIo0TC#LhLA491Dlf0n1Qt4lwAF?AF#?=~Q_ zpIOl1y9Hz%1dudURrd-8?J)L1TZ)&V*6yjOB-9;dM`eM2a3Q1#PQm_+E9Bj)`7|<3k^b9OPgk2> zq@Q}jX(orMXTCG5`eDv4zu(Lx6lSpP;U&~|&Pp1ru$0CY$TJ7YKsu-BEg361kq+AR zlSz&%@T)vGtnn-vYxYmXX6rNIK<^nO-5CkX3csMXf{$>GyG2s}t)g@8R*-EbqIAol z2y(8VgbYWC(swa#>|JUQv)NnAJ|z8P?_Qg6LZ5aB2zyP@>~36iFB7^lEd`-}ExAlx z9j0h9nQ2yUXE#Q)*~)YSn!bBJ_jo}J3zJt6kj^EXSnDhr=qEz%h_w-mcmc7gHzFbT zuj1z|y11n}9kxAM3JdZT;7QjDSiHys{Dxh@;Pnb@cI_Laf6>Q>)HQMap;)}}Wj$W` zY#SAMrOOml*Rh*{W7sTl9fre0m}!Y6hWD|l$}rx| zYwAd@nl#(sf*Mfno|sfBOmD(1|Y2 z2t&3lZ;)gy!3F19(S+67_+hydKCd4M7nJ%yZ~g?Du3}E*v(K^x21VS=#C$>CsncAT zp}wHQFp9Ijo6bpea$M86lk~LWBP=pw5*ZU_OK0)tMZI4Nxe{ha;+s{e;t3@x6t77m zj33k2Xcl#wB|#^J_mFKF>&UVeUDCRL9l2FH2{*5{z$sOEIO=sS8IqG?|CLW;^G5j` zow16{JdR^JuP~o;eSQw5%EUry+B8|?zi^Xev$)QO@5D_;CFWmYY zZmTMjPr+qGMeYzmo#W|Ih1VocIEh4^{EDMyci=a6DPSrZ01`bVaIzo{LQ*^N9$dl| z9ui@4{_5O@g)_LuCC6FQg<_Tw6UV*YJi_+t46>*h73{i|2aD8qV?IZJQy;H2?9kpS zc6^gHJD6KW`z-S559{Ofr9>MY&jY^9h$y|iQJ)SN-66fDm1NJrQWAS5l%Hu^l54{< z*!J)&yfUvDuTXA>rQ+WBGdlw!cX)3C7Yt{QuZOe6RnWWhJlfn*k7isL5Bsg=!Peg? zu%;yeeOAx}r=mURpBO=x;Sy?%G)GB%fT6ARIGCGf2A|X8klN%EJToejZc>|0rFY5D z#E2P8AQ{YbWd?TIlkA39*!`l z%eS8*!tsQ-!*pC}5s2eo)WccxN>~&vfbH(5gW#6VmZ%a;2tOjwu0O6S0hortx3zm=g55nh zEh&u0c8$YcM#V%mjL&a&Rb|fQifo>b3hTQc$}X;)&AQDO(M?O`=$PhcOpmw0&a5uT zR1@HV7p-9GvW(*N3OYv1n!TwCW!ig6m}v5Oq8bniTZLl4UiLI9dZvwkjt0T$4K7gh z+yP}KNkKu$RM1saz*1e`P~lHs{OaiyJbjxQtg08rsqTJZUf%X*n)_GE6wepSH_d5%e)0$i@Ji8Qv|Bg!ZEo=0Cm%nqoN>t&~iyul0- zTAV~wWwVGu?sKx`u?bQ2P$eaKH?W}n6`p@G37<-RkHzLj;uA>~_@Qtk@vcmy58FHG zy0Hh@`;))vG0#}$`7EEtE_9>ju_mO!bOn90F^(=Measf6bdcl0&G_`V3Aof>2tU=R zK>M{4P?}yRTs)qLZBQnGh7S0axjQ&|+CgLRRj@y}1N6F` zaSuO3zCJdTZfUy4PL+OT$8&ty@8x;iceh2{AYRAD^-bfJ=AB`aZXagro!7JYBsngz z<_r_*DPgHT3z>q?GA1&r#eN*Hr->>CY}=Fj^v}y`Vz2B(Ccls(Hw{)0k%BE`f=@S2 z)M>(3^`r6fBr%*as~%rfmxY5nzJY9O5d4-~27#Y9!@X>E`1pMsoW2`{237_kuks*N zWbFvixk7l6lL5SI+XrJaRM5MKT9ce--Kc&^4)SP>K!*y1KzCyXT;X*qmebR~d+rbX zVDELZ;Kv%ec=J97A(V>k=k6sB{njxDp51mNNtfMZ(_mSH?eh+ z8s3$B0p3RnvnxwVX=3s@a@_tn_Rg^+E+4JQ*`=9e!+SkC*G+>vaafIO3SG!r#7*%Q z-z+$JFAFxbr^2oHR3IDXzy&|R8Pg_1@uHvne$)(>mbIYIM+Zv!*T|8&|x=uxS`MS_?#Q&W95p&&RNeAHIy!@1vDZ-V>1nRd|72Bp98M1KZiPCfec& z@J;>=dJsI#yfYt=Vkd%vGdUlTXBmH&FwBG<3p}-fOUCYYrZM5{e(G+{9P(qH*TB<@m#bL{uAk5zWn# zg2e6d$TCeByKYvZYe%if5y2el5TeS?9K6JoUtVH!lJnTVeL3uHnJt&)m%?u5`7lc* zKF99-L1s54m_76iW<#ciEX`7h4eoWNAEXtiQ92@vw|fz-!El^()}GW4&&TSG@2JMrBVNSjVjOl-ce$6gJsTnmW_wf-3d6)yYl#W52_i1#sRSvp)eUZuFJ|y}l z6xDfdhPUs-plL!Sgd9-^gDIV`#n%~$Mm|IqNwP4Y8V2_F8cV-a#r;-%Stq$x}7ERrF6rCar24 zAU;~&q~ZE_Jay9{;*=>tE+($Tza*@&erONu74F#lT0vCM};otHzur?qXyk4IIb2C5W-n|w5>uQJVhP7zHv~v)3WjTI0w-EmP z6~b@ECW7_9yU0NO8hWtD1J8#%NSAgNkrwFDL4+IGF!+#8*$PC*gCiQ0Kr=de&+JYx5pMN5{qE*$*>7>V^Z%&q{+< z!+ezNnFhIUM$jw1pHIAX0mTl)fko;RNXdvr`@QN=(~Ze^-$@a?S6T}+{odo#xr_Q5m@Ss3UEP`A$cN8gYW* zZWy2H2~P*qAoyqvI{ke=dj8=SG%H!c=LUa>YRZ7=@wQM{{1{quK0%~c1juY`N2Q;< z!4-`KSEGD1pIqb5sM93qVmglK5m4{JblP_35OqjXX7%k;__NxV=Tt0b=ujtp*OyJ5 zb{SIt;5fSFH_$8FN6Df2YBVn86$xE$Nsj*xCqD&-Jh`)C+kt<9zF10z7uWVIEW?%o<(1G|3aS@i}2a<0%VhN2#Ni1g4k`( z(Wx&+a3R76_Sidt+!c3F@rr>OLr2&h^BPU;zl&COw4iO{pTe5|rh?Me*Jwmm2P9=e zka1`&G7fu$S0wx-gO0mNr}9U#HexZcNm@YH{ku*M6k5~3=zOAb<0-M6)Y&U8>kv>j^rzaXR9b zEPxvKb7;WZfE+y%L=GRGObnxSh|h0+j^9y(W#{IRWVh+KiT9t2sn(GnU(9H~JR(Jz z2gy%aW4u>>6SS_J2x*yXSw(jCgj3dZ(zXvdryw8*9a73EmPJIHzDDSSRs}SLLVB(QA*Jb2R96hUvD#adiH!Fmg_(5*K81uuyUVggu)D z!!`*ZDg6zZxNQf)Ar0`m76}_}sDst^JN)@I27ax+hn#K=Lq_vBe1-Q&+b^obHTNvA z%{hDQpYW1wAnL48C!8(6X~9nZWqfxRa>B?LmE%|z;KI33_e)sj4QXOU?-LN___9ZNHZ$IXSzf2rsMKtc3vo1 zGUX+{DSncgxSycPg@@SK>*7q;-;8;z31IybW9dW}SGsa+Hl8{q1#3(j!{;|nrHh|E z#7r;^$NWBySI*1=GN^}oGaXE_H?9NsomB{Al%Zsg7pQz{0{h1ld%jx(YR76oRO>A& z{W29AUyXxzo`Wb#+zOiS-N%vg%H%LtK!St#-+#X}U6OZ;j_`c<**pg@;pc6dFy595 zbykwce5QS6R2jKy6GS8w-AP4_DY?@wMpEwm!m=T@7&Xe!GB>bO8OlEtE&E>bSi+qpIgzzG2ZYz^$?1L7_`K}8ywQk zpQ@bSsbur)(wFKQ|Iq`G&068%nw( z*AdUnAtW|^0{tW=OYApf;3&R+T3k98{sgu{{z(Ts?}!S_Q&<5TmJ7gb$rz~j?LoU2 zokS&U0;ujbCnsFGiO0fVEP8qj{Wj?;j&Ik%y~+INj345&2WoJTjt8k+dLN_17jgBH zRphs1GJd0y2zG0}qfN4N+5X;bbkggu6)CG7NyxO|0~WIW~{c@!H$CC|i|y8-F6Xmbw(piZWYZz& zEZK=aFaJv1Cbm-fv$v_mJp&fHW(!r%^P;Y9t9bT<4p|=(huww@u+qwnc!7Kd+4go0 zv6*`wUy}`lGad2Jy|xm{GVkH?QU!dic0L|0JOj;ay&~Rcf(IT zOSD1X8dSp%!ncpBA#z|lROA(+F@vM%s9G%A-uE7%l0;a0OAhT2Oo4^TZ_wblZD>W# zJ=k;D27ZrO3Ibmb(5q-hnjz*W_3)61s<#n*Y|BN(E8M~Bc`Dl5rVcHq1L6KD73h}s zgAJ3LkXKL~idt|QzCBrn`;Y&_bE0iX6h9a0KWsvVgsx#Tqe|?tZ7nf8<3)mw%_YbH zk$rl+-ds%l5bS2u zqeTxC;qOXeP+y~fUEk-DZ`sp{q5dDNZIutAlh^Y9j~94F$QL|OuM7{Zi^Ve2njkb? zo1}IR;~8^Rh_X-%tW%JN0EuX}YWicUFj2rPI{N6Js^ff)P#tlykSED`YpD7}Z8q|B zfSM<@5Xl9yB-QRQ5qf)(&>sW9TCK=*&0|=vAOr+2&%j8p9T;my!?*!6&`fSe;U4bb zvr!dBXIH^y&q$OJF%j~l1Cig)-c(n+AGgUqgyv0aO%R1-3&TuN0n-8+SC~){IzuO=1H)y#E{o zP1W$>;#g=WdGPA%L3rplibf6!LA;*~%)c9lM3U!%@oo`-I}-S|gg4acd@y+%whM$` z5vb4`0n>szM9OVCeX&}abW5%qa3W5B7mO{l-;l5g z3kZ`1ZriDHYBBaqd#1s_iaysEhvn>QE{U(Em_ z^!_sTmI$EwEBDjF*ojnU<1%VE{W`tgcbH0eiqny?6X>E?N}BE+#4(AZM11@T)->TL zF?xBFH1j>BS==ZNG^&I6!HY0yvk2xM7viRWukpDLuOU^*7=y(R$bH%d+IRng;RZz* zV_S#5d=Ud@=Kz$p#|Zpx$ztQv!bH>T3%NbabG3wom|Mmcx?N`)6?%7?c0N5y&G~H1 zV^5q(gwa}ZH{}pHuxJl4dBKQ{A|=|lTkvwlPAvXemE8GMgsbbs@IU_^P}h9~%e`m8 zI`LI-?r9^~8h!*1J2~E~`5me6i$#t}KhUH}Gtv9Sx)6A;#-v?W4m#(XLGs@;6nTV2I|u9_FG^O@&&Q6C-yy5W zeYL0Lp}#s=p{zzc?+M7An|AokuGcs_e+c~zxe8bLv+CCL$?!Cw38nnE7s|CWP}@rZ zx=|Sit5y1t$wm!)Yc3olPr(J+7udq4wRKc2MVU@|Hipg)okN|J8wlQ3j}N~)j6b||rBlr>)6;sI zEV$|y>H3_5m&9h`N1qPjaFrKud)Gv~c5W7EYdC<3l`IsbSDSUo zhxkd13aU)SzOy0tc_py4~%yi#iJ+NxH2y*238jSbXj5HYG z@3-zj#Hpniyzh`ND#EmPToWDY3#5zW?ob=OQtHh!7H+TqO5$8f@V2+o7zy|s)9bJ3 z`Ee3ts+|~_M6SY}{6KO|tQNM!oC5b1ida0<3wQX|;@nQYRzARyF)FXIh*CWKGl>Ls zP6RIZHlRw!2k5BB0km@tfcHdU5*TVsOiruQ>YxBxGtY^B`gw_lUK^pE66096;RkBj zbCw>Mph7Qy`a~k?RjAs|8^m+E9l0^#Iyryi2s!<&8?!4j$eL?sv3~M8%-CjZG+zzd z%dFt@i9Vx&nofKuXH_&KWwdJpVDKGPSVJN47R`txj% zi5mw!n|+~1WeLo?Ux?4$=_3ZRuSxvoRm9_tfZ#S;y!ZYiqVOt|tWwA$g<-qN#5%QLU&RJ?rm5*%eAgli71zs z23jJ2HyOAqWQva7JpmT_{iw_8GdjV0o;}qg!7QbK&nH+wzembZA6}#K%ZQ^MW0k3O z@KqAGB@=5W%i)i^E6|@?n(&gSf`jQ49LMVrfcAMLMY#aDdu_-}T%4eJ2T9Y?NT;1XDP$r4W3MPXycU2S_^F1)MhjL#g+sL0y6Z zyt4QR`j4Wa@+*+nKK7(6Xf}O+|0q3R;zJ(B@t$f$LVPx5;vGd}F)!l8oqwWnYl$%l z=igUHs~&9J{R2#tNAa6g-=V)d0Dp9e2ZQ4RygsWIZPDpRlQ*}b>vP*+c%wXof6>9Y zZ$;tyM0f0`bCk3!JVs~c_EF%WJu&v^#Lvd!SqJ_ffNc;i22LrBVOJI~o02QAbJv}?Vg%2pq@N(5rT-dAw$hcn!4 zyoZkD-ZepzHn3i38~Twd0WnUEIL=QI&#=BsRG)n&gXYI5ILu{F_iM43wTsz>;Vd?} zqKR(tdrFc99@2w(p0t=(DHa-K&<{3!#B0nTsdD{+Zw9O(fAe&S+|q1ZwK)KPABn}% zt0nRK1pozOc}D2An{X!O3_3Q0-|s!Vgnnk6Mn*sNAh2>4OyyEQ{(B-Sits|;>^jlr ztz&`Ql7&wRcTEC?=b^9%t05~h9XZ-BhMjF=U>3xJ=FmLyc4fHA=lO0MdWR;Z zEClmYL?rmgor<26;9#N)CBi4B=eM&1gDh1^|2ywmV$`U`J-w2o-{Ig-Gz zo8)qN8)5q`NP?Xau3KY{l|zH@!XkNoR#gq}q=KMGQwX#bejr&B59rmni>}$I!?0U4 zYPzBX!47g@*e62%h^3Pl6)8GS--uKwf5U?Rq=;NDzoXSqCK7k^iK25kk$)*da-=4Z z$1CIs`OpTI!yl3QMi;c_={72(E{Vf#O@Mvz|Ii^TfF&zcLD`If)4C<3COwgUuGXew zUh=(}1K>w1onWraGzeJM3QbWOuTt`Gb=>@S1yG%~(J4c<3WU0#sCn_6y7Oy*OOgyGXVV#4OV06+ME6txoVuK^e z;3G-0XUj|o`m2Z|pJzj7o(#UzaS?j-74Wack5QC;Ipp<8g2c-Jkhy*Z+BM&UKkp$~ zBCUbt)?L6id0B}~*A$v)D8!t6M49>NU|Os1N+Uda$tK~aU{L7rHRF zE7ATrSLo+g7pSmnv09Q3NkpDom|!-{9n|5FloCH#WjU%TKf zuWJ^2REh>iwICsC23&Y?7W#L&ps8CvqZM--k)G%YG_rzc0E_D*ue)c_p~yc7Z#<41 z>+T}a?Xf81rYtj&rM0;Ej+4WFToejBpj;@5P@ zA4~wFN+oz7dL1rv4lf;gVC&Ai{=*Wjp@bK{|xN+(>95UfetuyA3QyWi^VyjdfVY(bUUR#RBKM? z;^OAP;F|pqr%?`vwkVRJDGN!8T_U-u=Sd%5=5KvNYic=jHkC;oL2-t5@OS!HvRSx`nU1OODOwkXe@KAvyf^5Jh$LLwz(0d0AJI%BB{XaFugL+~26S4m2HE;wfGMik zkoi6oE%OM3Yde3Ux}sjRlGk^A)A|7+Ss}0{$pA~#X<^-lEIj+SK4~3WMl$2}67R`b z#AB-!Dc`;wmu@g1mXTA)yoWz1_SRXDdOH}-8TX^p@6}-a?6I)XQ3YoCNP~|}7*gG2 z4LOog=#FC~|6Hq){nii|(~}1mHDclZ`XJaRCyv*QIgcBR=VRw1J#Z}88yA)moVkW) zJ+fh(`Zf*!Rrw9eek4Qs9A&)xNHC7z`yS`T$3XJKT=a6b0w8Auk*9=_NvJqf_fv46 zx(hWH$v~XUJ7gAm6Dqb@67TTu_#Pk9I8$mA&+fm2%ic!e&9~=~>L+K260h@boDfOv z1|AZ@i&rFW{8}tw(2CSDf1#qCFG+0mKX{<|3_bsqjv{l9qvHuzK)7Kh)aEY3daqXF zprz|c#>1=lU1kvE?O6uLsW4nomTlY>1ai zr^3y+`8a>-7(5qx0Uy!g8Age4O(7VJE*OJyi7-C$)*kQe4J4a*&9{=nRHCh1PrB!b z(z`!_?%wV~l*ENeb>#tcBqIx2DFXJ+$T6A_u z8NTls2QC*8G(MDs^BZhX(zmy0df))kiFJXv!3<>Z#}&AbvT!wT0=)Sq0b`Tiq1`(q z;87%orMMq#0vqvO<&XG@x;1HEy^c=OJ3}u`eMipcF{1AofWxv*z{Yhy;k9Wp?EmRZ z%vb8*_0LbhNtHmDv!NNi_OV6HjVF=L>vTAL?ix&u&VW2WA&BbCL}l|Pf`RWoSZ}le zp7cAyrbpHg-Te%d8mjQ&hPSx=`w8NjFoWE^!!yrTT_rC^{*Zb0y7-lW7B-Wt!iNHu z;x`5^;BK@UiZH;Kqm5_`UvJp9hN5l!`Tj#o0{OpELk`njQF{&t)`vq-p0O^tyi0<= zf18n(*)nKSBWT{A->7+G036dZz)lS-;QQTZR2KaiW$>QZ1+{5dbT|=jYWNLj1u0l( zbv2CNmx!qBkXzwDRy2&dNtu_he0$lJaia+aTSG4p|4R{ ziX7bE7mut<^U(d}9E`iaO$%FMRff|`NEpGFyRX*9@l|Ow-C-=eHb2|lL1GK zIk;Uv1AP8A!%5-AAivcLN}U_wy6-IT3yB3W$$u!Xi}Cy&1!y`j9f`O}!3oU}xcRpf zt+>)>BHgBe@R5i1qAKP1fY^n;K6z&h;%*;vud z@EW=}b=)_u44&$0;xGAp)_7GQ_WSn(%FYzPgN8b&_!x&flZqfoZXN#9Ig_uylu43D z65e%Oh79FS!;LF8A?Yg;pj9CP-(#nOkYx-vv`NShZ20W+h2Of6ZSpu6vf*`z504?=ub0p}k%{AzGwBh>jO;g=8I!XJ+uJVW#Z{+)UjU+=n$6Q?PVn9O>-W6e1zZu7(slGfq| z*J)tMEr$bw-AH5gWcZUY6RP@G0_A($HA`*KNN*w|V(E_QdI^S@J2e@ZP7&#O>gpA5%#8A6ureY8$w z1Z}=5fV0_CVZMzC%zX78mENmB{hSw+$L<6xPyYQi|BWsg&xJ#p^++p16YVq6Mc<xzur65N&qdE(Hlg}`IK8mmpC4cO<)gPVKB64G08lVgga)$$)X=*OO!|(&(~q7|WBm>4exHL9e$S9+mjPaj z>OtpI3tYR>kL>kJkjv;Rq);vnL+?sqzTH*S)v*;l-G7Xqb=V-i>eZ0q%lD_#{E=`^ z4hnQvMn3IIpr<((2hLA~V&)3Z0wut_>oyuaT?A=LbMf$KJ=SWnCQUN$vHPMx5?8U3 z{9~6%@Zx0j{qsSzR^Up?6H8!ky4ctKe^BZ)b`Vq|427IYm370twV{i2U9Ax5$w^v5P z1pTpi+}|7M*WrE0*#1A1kv;+497#fp29zM>>m6j2(}?_TWWreYc(7a(3C~&4+jW;?pyvkC0ZelS_GD+xuHg(KUet58k< zFMhABiw_muho#@Nv524tXCOxYY-}LAtml!}ii6nq_Y<(clLj^6jxbVo4wkN(O)dyu zz(pxPptZFGnbbR=LymjVI^+fxGgDE(;Rk54@CwNO^chv(oe3Mx@*JYo(%5^Z4%E4& zq5N^J=(TJCe0+TZj3&l`s@s21e2U-cU(Nx6(jZKHVvJ?91o(Z?LYTMM4tH&h!EMtR zG)DYH{hgoD`|`06qb3ZpGD@(8UWV9%HON^v5m^OtFrev*`l5AFqJ;G_M(E3Whkaz6^(?8!_WH*q1ya3I(z64Vj<}$&*KNGSS<`VSq5TKcz?x^JamZ3 zK;3RrB!B%lj2v77U00^ViH8};?5q_?1#?h#?kF@(*TfASz3?FG6XgANNA>&;@Em`) zO`r7%9SXjI+H)0PRtC>IsolZvF6SW!r4U34t|! zocp}4*L7Xb>v=t&u&uTNc?g$kb%Ad8hQNELC|Hs9 z9-_w)@Jyi-+*Yy_cXG;Dd%FaZtJlFl2It`J4@)5BG!1M;LD=hiINW2<0DgPg!Qsx; zD1cUm-9j|bxikg6$TGyc0~JxT zN1_LCPQC>Wj;RAa_ou-V?lnNAE(DBXppQWer6vv;rSy|;MFMwpm<&t zbnje_%0i`3-AhS$Da8#<_?HINXG$Q_)&{nBR09e7LGU|6UF@y%4M=SD0>blOz}_<* zQtnZJ9t?*bDU0Dq_%?V>p$p`!kc0nLCV^QY2%1$~2WRfg0Q*ORK#Y?J9Iky1a8nm> z5Nph?Ebam0_sGMMyUjprZWy?3D2MDia#7etb!71bp+_4hAe~#;Xvljyu6(@%4;43} z`+ZJ8dO<6&j2#bi)`de}@d2`kI*-~?#-k6G;yz1a$o!CIHn=37O-|oc4t|Tz6rQsH zY{m<~dKns=Y4HI514;1Lv`-*I`XX3=djfp2UJ9BlX#xKGXn0<08JgKD{wzukJx@?Z zzg{aN&wsv9{#F7wP`VLq>Wo0jHq+pA$s}0XvJSqyya&vhBMD2h6G70(6gYy<0fkrZ z&DrC|PzS|;!*j;Nr!6V)#mgfwd%-MtdFNz!=EhO*xk?^}#oYkb^9#VcAuFJ{;s&rW zsD~(c6Lc8OfMjbVEcrVgHD(5&#f!$GNCk1-S}lppwcFvV1Nvy#SqTOo0`QMV0nE~l zg_CM|m==5pHXXhQ{JX1wOxJEW^Gz|3aF`8Z|5X6Dxz=FIolLNE=T?xq;0E|}#2ZY# zwhy%B2LO#AG43MMZ$8{N3sxQwb0=}AdHA*@Fs3pQR8;-~?gRr@UV08rkIMyDJgk7) z&@Eu1xfNJFQ-W64?t|%cJ1`&;!I(8=pflD56glevJ3beD3jPP}zAc5z|4xKoJI;ch z2VIcmAHZ9>VvcI}UYJ>U5=y z-Ts0qt8nP}em+`}Dvu^Em;mLJ0-@`F_d%9$6^?0Xg{K`hLzTTcV0u>>BF(-*wY`sE z@0QI-a1KMA+zn`7nE-c+zQb2a!APg55NWOX09{Od;f;nq@UMI+Ts`F#a6GaSPM2N) zpC0)Eq*vYsGi!&z<SYSp-0%R%jfn!o z>ds)(&jN5PNFG*whzII-DnWYm0JtF5LT%rr0(&yH!+(EngPjRobLkA?1#m@+JE4i z_e}WZk|bPy`GxuB&KeLw-2`<~@t~^k4ES8A3?ongP<4`r57&8uHZyD3CccLk^IPC# z@42YJM<40h7eTA&Ht6O30Lq0zm?*yn=?A+YUmtxi{agbuD!v06!Y=~JX)4gHZ7Fzd z@&+W7^@4BBCqR6sC7hq13yj;p1Lnp!__R(fD}g&V9hcm^{_XSh&eGRl~60Xj~ehQ5n)@5nHTUM?zv)i@UQRnA75^YoBhc{7mR zcoZHr4};%TKZ2F!IUu%U2Yj$z9IGKOfbNzy@X9I$%zZf?{*Gw`-v6|~N~{ab790aB z6JCIZy+443y*`k%>Hw#mMNsO}G2lLC128Ku0z0flAO(ehRQYf)ysQ9NQ8^%-rlHZ8 zd|G8}lV0`DCc?F5!RBf0OLd!)@~Dso8Yoer^FG3dK1q3PuQ>wU4ryqf;s!R?Tm@Sy zP6Mlfu|QgWEX=Jl2HGth;K89N@UgQMOgVP|9KSsgiW4+F4W5CnR6J&(Ug>Ei6AgwV4ghWh-NxSl3&gos^dgvs0cQqb-&UFE^kD3C1jSMi0 z>H?Jxy1;Z=G^jgi0+MZ{p|9h1a3whw*ss0}M1&eN$l599WjH|7tx8bJ{}T}HVql@a zJW_sThx`JLLxP=w`d;3H8qyQs`-$0rsgD2$XNG|j^_P*qaS2r4xCQRFngAcKtObE` zTjAo$XW&w9GH@u+fUndXfy&x8uvJbO)(t)bReLvrZxb589%nh&`Q#U<;p~B7%vkg< zxfSBmF|f3$7;e?kN0&Ygz=Kx|klNl67^9j4f`?`!>*^46c#A1qxLplia-9Kv70UsA z$O8Vi!VT0_&4rtODL}L#4>VFOpkmg2Fm&Go_Ly6O&G{#R^SSY`@N5{cbDj>{#NTUL zz{yLW@SK7tBf>DCc`mLPryqx zu~2#4AZRux;5y$f;QcBL6peO*u_ZAeRm_o7fAt$&iTDZfPG$k+t~}83AREj|ododL z5pY2}6}-874J_YEz(s$=IMsiH<_8WR0*5k0V2*YQn7-~9n5g&8yeHx;pg%L<_v#pM zeX|slzUKvBUiuBrn^C}BtnYb4W;uBMB?dGd*bma)&|tHX2XIyQ2Jr_HK;~jQ$jd50 zSF<|cky{Gtb}Is6%RR93sx&hEbOvnjd_ z2;{_?M|Cnl=3p2YlzRa>j1*w6UnRJ^E)iJY*a!x<_<~6aJHY6pRIrg71Cq@t^Dp6L z=EdRFVB4ZXctWWZ{wdakx{s$p$D?^r;+q`$7e~RtwS%yVN`sd~a^n4UMb!UqmAE&& z3}OqWz~-VjMDCe_I*n(c@T9-U?#m0LB<38}e~?5uepxVcO$vIqJQQu&qz9!}iO;X) zJou>TAnf`UB<@!^v{=lk^GewYBTpxQU;8q_aA`gejpl)=54M6CC+>rQmgRu`c@tDG zuLeG|-+*VYG@<4>D|o2h4QBM3LqD0x@PbYhnCLtY+FrrX_gn;=vG_8KIqn0MgE$Dq zI7_x&D~P<_3XB{t0tJ=#;9>nq$h>+EmhsxK>y*NcUC){*)8U%^3#MrtUyBJ@)W<{}>oi z!9(|!m%wJ^CWw5|0&;5CfT^?6;KDK0z-EB}(_Qq$Q>Hm^n&}6SIj9R29fpC)qQhWS zU^bkiG6_$8?tvcG1dC^SdGLdH?vYpW0j}Np3I3-+im}rcaOLNEbOH~dGN=bv*HTdC zK{}Wh5DgSHZh~W=5lj*Lo8FjD!KuR=z?8-$ zt2%|QZic9+VL#d&Qwzssxxg=L^I`O)zraL)6m$kHhwCH@frI9FINqibocL}HCO=#P zHTdqY8)j(GMN^445wk273bYzb_qn1Ddn(}2%O2M=eQ z0=~Kvz!N<^IKi_PxW2`3ux&AHEmwmno%Jv_buz47X$$wAc7+8!-f-vjSWsqYs6(BJ zJosY16%<_C19Y2J0c;rrTRj{gd-FCh6VH6U&WM2DE~dbYql@6a7a?$j7x&A{k3hxM zf8aAwFM4})GTig;BaD!=4|_{5(8C~85o)B<1^%)^-b z39xfcDyWU?1^$mtfuw8(zSUa@V~=G*4L1NU^v{Og|L>1gPQYQGK=`_^5I+8IG0guf z*6ZG30uMG#0dtyEL912YM;SuD69Ux(;x~?QrO- zqy@i9Fd$Li84g<1!lU#0;8CR_aOc-Lkm(x)-t9{VTW2AV%? z2&3L;!66$H_$#;_Ozy;DpW7}V47>m*{w+i+#Iw=$ed*9z+Fd+5+zB1?AAp#(vtZ53 zJm5R^J4jt#30=;;MYfQl6zV^ZtEdEc_R-yFJ zWn$e{f1vtg9*q9c0O<675c9nW+;V*dsly_ey)Xyv6!#^EPOgDd%SF(m9Kx<;DloxL z1ZH&y12?8#GXcct79b_GT!zRe-v_QsN%>Fj#x$ zEYNY;1^m5?ps7x?`1yVVJ1Q=KMw3)8Z^I+1ZSEJ zz#)xr@U>GFjO^YH+1hF_-_0Jp0d8Q!F&AJv(hBxOr+|Hi^&qu#DNsr`0XuX&!K(Rv zfFCRdKlez%TniI$bf^z(H?e{?k1OCgb4_^ai7^^6xdMGOJmBs1!SMQFaZU5}6sSJ% z1*G1-4;**>1&w*TLFro(8puTg^C?wej_MUK_52|)CR`U}n5_i66B- zUjgGUhrz9`bD*Jc2vnb{H~*CK6xa1Jq9A`{pCJ_9FCnF-Fk-iXpK92awoU&D_bd*LkAuh2m;41U>t4=h^I2M>L? zh-wwgP;J*tv}TD7Of#@TyTn{r{h}WDuEpscN4WB&hrw_a8=c>MLSV788QKSZG9Nx?1R4g%!M4ZtuxVm2l=KznkoT`(Q}J0ifnd?&gisWy z=sxo0f0n6euT zoh*h&&R8HOoeIxQ90H%tLs%JlAC^wp4Ch!R!ujDHDF08g*v}*mzWP}UGd@Pa zN^wrD5b48H@e?6Cq=eG1zJ_PnvnVdR1$lN#V&c+gH2=&POjVvl%-$~a-d_?weQ$)+ zjDnyt*#fiATEpsrxA4?XZD`zU4X3r1K=)PtFjvM4fh@5WZop+&%-x1q+($O+0H~gk z0$W2fp@KmyxaV*dxJ1jrDLxMXyR8>2yjg}k>*AoGT!(h8U5vk75_^U2KZ(~#h!q?h+aqVt5EUCH~H|97ZzrHW1Vc8+%B=#Z-^aw+Yu_EFd<00KAf-k-RSbq2h z7%>s!Zg$F0MzO1%*)T4Y8T>BG>IZLUrr(WX?46pKgZ+n@R!?=- z;e;8Jd)S0|SkTWDU;WFN-5+LZqeP6G(tIZ3^mk^dUmFu6Y+?en2N|b`(+sgLn(<7z z#5@VMWYT`fuo3~WjKYueOz603W?rf>bK3L=^Pfp9v##MSGf+^+7$&$d2ESCP%#3KN?^FH;?HoyTojpafeIDnTH_clin)oeI$ZR>s&kH-lJ?7u>AqH)H@<0c-rSKGswoTxS zPMETVw+mUR4?EZcTDI(z52rY%hFC7m;0xPnvWO*rNpj_5Ua(V76tYo^H?XzdYFx=D zN!~MeA2(NblpTEbgiZ3X=N8*#a1U#|xs;j__RY{PI@mvxn(p|3?fDSJ8ox|n&e058 z6=KN_8}xHN+cWsgVU7!atIcUf%;5s`rg5^eC)v6PNiO8sdDfuKhWokLnHx>)VH>$X zwlX@C?detFZWwy9rROx*Teg##BX}o4 zc?0JWtj(SLX2FYtRg?-7SG_A3V=|-crn%jjLkJ#@}Iggx_LKqc*UG&1M{PJB{tzH<4A` z^qx6?lw;rZKVa4``^dbS@QeB0R!6T`CO(Uj+t@or`&qy3((Jlumv@%6X2j`m1DMLQolOSydcLm#mlLw5|3bjz~ywC#&9>hIwZI>~Gal`UmPA8r3g zhi7}x){8#Ua*-2h|HY2frqNc~XH^`%>RvB(*Q&^@#uak@ z&hFg5ykp#0(>nIvND&i6y<$i0r*eBv{$UzBioZpNyYVP-gma^bn9jNz_g z`tFanbozaL=E%iOOkG0|)9H4S=^e+j1#7SIGP4@_2?ZviSQSA;7|aztx4SienNRZk z={qY#SskB+40#WM91P*(?tJESp6Br6zdYysc6?%8mY1_l;c}eavCnK`kPYh^L9@P7 zrTAp4g*ujI)ytJ62~1H zG3MBAf6o5*JpMX6m){2DcwSDKR}J~W&3`D(ABdjJx7f+^mJ{!B*T&~@nKl_5b@47+ zbVY;x93#!$tIX%`9ZKSR&ZhD6j|cKzk^a29o*D11rposem2p8Ig1P4=`fSC;A8fI; z6;tXlhD&U;W;)8788LFrEXmhpPIPZ)8cWofdH>Zj{%a1>gO>4(TbUK}zH9~KUfjo2 zRAn;T#$BKz)~=)-E_|kz-_U0x)s@-Y%lhmn`-_=5CX`uV*-4jQno3{tP-d<#Ms#0V z9{o0^o%VB?Oo!;qU~2TLn2~;-;TON4M=ioB&2KkpYNrDI&2Jf9x2S?P+BBciUt>$Z z@HoTjHdT|zD6&cDAr=EzeqpNGpC!k-KHN`X3*X3 zE!4=4t8~Kd<#geOcsl6B6}m~Xn)>xFg8ueIk+xheqBHes>4xCr)c+WQ5+#-#HPAJl zN+UjyNi(KX%`!&R%YY2lA7lx$L<{zWB{?*4^j#@+$)i^4EDRjf$Y+5DQiwWOUipShSieDx36Dc0Lt z?QBW)8b2i8{JBlGx=4|m(&Ow5r8X0RxPxxQbS zP2YZtmWr-sHoOR6rd+{%{a6v-lVKvrt+Ey>V#kYwwJ${D$Ouv4>O{dWY`f5M*;_ax z7cEE_M+sdQLWElZoA|e{UU2*T^SO(A6S#L*L%4(M7IX8*M{wA#Ck0$Wve_?*dg`vjPn6awnMj<%lm9C7#}ke zra1oM|7-ogYwYXe+sF6tOP@aCQ;yu`PiJND-2=A#%cXMsT3vT;)3o1gi$gbO`$bN8 zP%SNFfBMH~_xAA3)H9x3k;#9z+sZFAnZSpaRdK7ll(=cD>N%4mZS2A|XT>>xHIwyU z0Q+Z*F?&g6FXQv1oS8CGNB+(Tq@5~Q@{YMFJ>!Wb?ci{atd5kWUs|l9JB#uupO?kt zxh5H^pz0FsndnddT>gUoXxdJlYyC})E}l-wEX^m|-M^ASK04&X? z%1qk$+ynZ3P&_r;RD-hWDWRM~I!U92HDWKl=j8kAbE&S|U&wdEYsuhCQq=kb7pbs^ zG2~@Mf6DvTB5J_3hzvc|O%yusFTm{lbi2dBW>iQsD;Tl90+2GhjM8DidR-f-6@0sV2!p(Veq^vR_l)_SpkdZ1vIm3y_ zvipF|h6<@FgY&G%uNJ|4%mk4)^;l?kwG|dUl@Z!ryyM+1>UrW*I&XZ*TrmE5SaA7a zBk*2ILTOkvKgabb|0<2;hky}J05x8Jk|ZB*pvgzBuH*tgXmTxwbLrR#0Zhks%%+~Z z$!?1G%p53tmVJe-sCUL$`gE^o)L^<3k8khSV7@Yi12$slyG(G9O3e%ar`gcSKZAb5B2fyGjH>b&l7n^WyG6JdcvIxwc#2H+E`NIEf=wtl-^YMEaE;&=EZxF=)r+R54?D3n zHnXU0&pWBIdRe+|aV!~VQbv03NhhEnOZA#hppy5+P&wxd$YI~{z8--UGYKQ@lW6kCG8|^`1z$WEjW1P~VeOwWxar|| zBHR8pmT%O@E((wsw|q73zIX$NE>$8bbAq7Hh5+K`CYs2-HwVYG$eZV47#t&)VA`VawVIt$``AK~9mJ;AU_fp7jY zUuZGeDug9@3Ecg$Lc9GlZke_|bNr+n(^wnL7C*nmibWE+hH5qbMOPo!_v$5Qu6ma1 ztnmo_$WLIw&4{g-R3H5yf}&QS)BLO4z`wRW;b2T z<79r`;H92S5sGY=@m-&e@slE^@MeEraSqq&xL%7iZvBE(PUq+*UQ8VjxWh9A3f$%Y zp4u&>ga-(R?l%kdGr#cX+{-zq3lo^a=mF~H@f}P<(Qm5jPBgO}HL=nsD%piIkFiCO z?yT_=GZde$JB>{M-z6-aE&Eztc|gSJ#Ddy;&Q$&#ywc zvsb#>3fe4yCy3b4af;6dRq8tDXDyO?MA-m9?#1_ zMcyy;4Zlfw3*Wk82Je{R!rKJw<8Pm=U=HpkxHrnJw5;f7`$bivzel;xH!)V0xE z;>}k@@}-*u_4(CY>ZznOC9nMld)OtDd&d1Hy%ruJam^I^zPSOZu_}%r*O%eB=_A_2rgV>CIyGjK3emDY8f$GZAk}4`;z?1*ky>#qp1wc<+s%HB zzFoeIo+-x@8QXUdU7tVVDs>HfQmY70%Zgs9UjKj`Q>;(e!1AoT$4~7ABfe5 zG>8Lg*YW7}NTOre6&x{yh_`c<@ZPBc@y${Rd&TvmO{p`84^rMlzwhk-IR;}h*5SJ+ zzGB0T@32%r3104a6L~AD6JBF;P=nkOLTkbWWFEc=UFa%8Q<(|K^n4xG&3J>RJ`wAA zS^J_Nz1LtG_QwaF5!kQB0QVMUpw~6WklU+vl%4(r)$})`{PTOT=~r)bxU3%?`4Eh| zU035Zmu6rClTbX9eTSV^?nfz90`bj9l6Yg0hjSEMN&h?3u!r6^blh1N7SGs&=dQYq z?{5l+bDvzrDTh6g+RIs_vx*A4_X;Cix!ulp{&V6j73}$XvoV}?lM^@9WC|B}#f>Xj z)WPj<_v6!in)y934|&5oqkKqvFaPl4FaGn7OupD>tx)$qM!0_WoM7&)BiyQy;I&Px znUZblwCl(5?EbR7?5jt*?6Fiu?)uZG>^&xu-9G**XINe-yE?m(ts25-b$kc?SGDoIFG7%N}?7hnxOm6ORZuX*5Ub)JjU)Vd3 z6CLg19=}oIXV}a04@(JNR(n1lzjHjVrrN=^spfEvk}ue`)O=>UKUjK6#$1~+f?b~Ghe1!w@8)?PYZzd9Q-!yRhb8B>euo%xY znnYZT;jvScCC+T=!m>FMglbj|vh;Y3HYiOaTJ$XNL~+{pe|ZL<9$AK!PgcPt(yK8# z){a%oD$%_?H^rJ6JMd@gD)hhR!Ggv|SZ_fEUZ%Jb57-DqRPs#Rxp5XTZDTc@u;?4+ zOx@sJa1Djmh*0pY@iX@Dq0837sL&`5g z5bGkuuC3$mE>Y&OUKW?5MsssFiLt-TN^Yp(CwEvooqNVC=B_r{aR+7}`0ELe_(6$r!u7#Ld|a(Jr+bEHdR)&?5*v0fzxM56;^WjA!|DA@zT!UCIsGWR zc7{HesOHDZKM&@WRPJ&T@|OJG)@Xh}tB3d4&I%#-OWD-Py6gcVlg;!9W-FKIv(YTJ=LJ2j%udvZl;QC9`|F^hz3IS)<-j$!<}6{y(hZ)nw-h)!RbFX94_~*|J_~x;jd2^pg{x5fqH~4vq$JZnIJCD}$6;sCX zcU03k$;qW`!zEe9gRh89Y{N;VOVE(ZWa0@Gi6bI{@c$ZvKi>G` zd-*f*>*I&fIyEOk=2ktfy{$tWkQHmfJ_*2Q@-K+@v%aD$348E;n_bva%Y$%_)xk}V zq=>oZLomQ81)CMGMNJ{!k?P5@#P`dI@QK=SXaIHb24W#nqrITvhH|k_!5zq4C`ZzZ zzeDF|hWNRL5;n~az@yVf(JKoVJlj#0Sgch=bm+aqRavU!)}m)bJ12#|Wd|U&r5UI$ zt^}V6ldeAk=t|t^tnfMEuCS zI)2DuwP3)m6`qtD2^~w0@SYbRa(hB0xnFKc{A~5hY~L3L?(I*1u4(BaHb~K&y_mm= zMo~QN?^wf#Rj1gu&B>H^+d)>%jc)&T`1N& zBRpH5CLEWcI5BL*UfY$+UUxajT6Ac$N>WQ0hm|wffrqzw`JH*fx~@RZ{9hvHQ}%*g zK2X87B;RJ|cGs{{{uQkM+6SDsdZHk8WU8pgX{E?XYQL!2ZmDRYuaU?#dw?(5`jVA5 zbfQ~_b;!*cGPF;U*ni9fGu@H**!`n{j4bt>+DKV3^Si65)!&{l+t}w^U3L&3bMGHF zX}<;UZfwh2E?>cie_YJ}ZZY7c92>YB6h271pU+Bt%)dxq%D;T4$Sv)vV1^HgIO%+2 z&euzhQ)$)Uq}9{u-@e+?bNflwqibx%)E(pI(@Ko@*n&~&jfAiX~91{)6o9HJ81N^GQp2X z@B^Owvy3nuIY!)5_>RACR>!B;tK--2XX4)uN8rlUU(mRX9!RQaCe@$c!{n9t3hkmI zfzDVhD7F0M48L`8!SBjB<%LhU(olYoitALJ6Vd&Mr6X-wAYOEM!V6UefqgvFB*bCh!nU6+w z%vi%&%yqjvti%ghL3eG0pmi}_cs3?caGe@0)YNly(Xw)-CcV;wW+~>xe zm-eNjK7M4B?T_;=ZHmH!^6`9q#VU3-9%7c}R5Ryw^BKh*xy;<7$;^zwDO{gd6dzD; zEaXO-3-*7f3nt%mgp?FXk&UQ^n?0?QIrV26^=phFDX#3vJz8bts~R;%X@)g>-$s#{ z{qhoJyv~FP8JkAO4aU-HSxMZ4#kE}enl|?In$6tOyk*?W6-wNNWoBH_7dDdI0ID~2 zF){1HT|7bZB@lyXIM2k3noD!xInn&~S7Ue$d?8p&m0YxZetQuZscGsk%1&S1iDo{5Us8|gK2+5Zz&ehncG#4`VL9-LgOk1lBL zLXV#A!He~yvAW+VUfVCO`*KFH>d#bM_<9_kI_m_kbT`7^^1Sh;QGYb=i5^k&!WzFl zHW^P2ev3PIy+`5eMxmj48GbfZ2f6P$fV1{05)*Dq5^CB8xbM{;)N}I@($5s<^0ce? zWY|CCG&F_?*jJ-RFi zG5jRovp_+3KFf)l-n)+8xS0@~q`m%zi$-jy1Wol$|X*kNu)GkzJX5j;VBRq2HcgPc}T8OL~mxv8N4+IN5x_ zM8SMt!HAm;9M9LB|YdbnXmB7XhgF^cfGjgqaGqNT+< zh@;B>*f9Go>a58mb{2^%g9TdHQK21Pj^B%ORDUCBu?Bs}qO+)3_c;3YY=kt8dByg* zM)K*V2Za2UON7nGy!eLJv)qC&THJK+2)1;bK4-B&nd9SE@z;Jw3U(^`qVIdcMSXJd zqGRihi+bXkgl)I3h*mgn5aoZW5di7f)~AkyoQz>6Pmh|w&%s~eJVpg(XFIh=O)t+9n`rx z$wWTlY6RaawUWPWHIcs=bcgFJJI`PDFW}~%4q_5YXhLqF0UMRskTJ``iO9GLI#%fz zTm5i9Bh^ae};h1hZpioZ&>ZseJC;gZ${9N^T(6o*V9w<#r@LVT;84 zm0`2%%z>{aTyRS^+g8`J%i!A3+`%;IAcUK}wtYJV8tE*C%59*R1?v6)a&zh0K z`laM@v0hO4Zn1}{qcWj(x{^HaA4l9PFD8>S=aCJ&PmuSt{*h~j28o{oCWO~(EkZWr z75-Fp9_vubc*U7#=t{vWE z#$=rO=Hs%N3vhad2LAEjEL^ol7FwAlBcqA{bVaNIwt-Z`hZ~X+8FUE^f8GK!XG@`y z-xLn*E`z=Hv(X2Cf2_N#6ka%>h>WLJ!W|hC%u6h7(XFMu(A^*yy(TB&?k~wGXX{m1 z{IL{$xSNFR!XlCS#9zppy$-w<1Vir&wP0^#J0?>)(cG=+@Taaik?J`eIr+Q+F^7#% zj>mJfSY|csR>_AK%|@Y5k|Of)aU%21RImk?ayXNZ$|7#?w2+(A$d9`-%w@YJaj8qT za?5Qhxn0NZa)FO7a~cXD?&0IFugxI)j@eca3{=w}@Yu z87VZVeGvld?L_uFoJBGBRJk{c4POnp>?7hW4#3dtCLP8*$ziJHM?l;Pf>Sk~&0_SmJKX*<$_Y3!d zjAu>Db;Pp6bBUzzd#ESb7h~7vi@I4_S?g6?5|}j*zfOUxRS1|>^h${RLEQ@ zdQ~VvhHL&LCY-?Zxx{et%VZVu7P$|fvh^bx&iN91?ytxAUJH?T^%8Mp?ItqykR-Wc z-Z9c#@jo*Ao68z#PBnXqR>y znBgo9-Mzxm>X2ZRFn$Gyx&+ak!2?jI<{XgE*p3QQRgvq`8R%NS7!U4Lgba8CPn9S^ zx=RTkT`~@TkdA_Dbkp%Ht3Ak1dM8j&-HJ9lKSOqQ+3?`emFVyC_mGL*4Eq}pgH!lwxl%r2hX*e;Mv-q^vX;B& zv4*=7dW}035+Hm$t{`MzG!Ud-e&y=|MC|<=I!w1}1pVLPOnQ5JKf5|@9(Ul%JND|u zY3xe#W%Qg+OPSuEB}|CzJLbr{3cl&@U13kBo~U$|AnIvaDN-{~6b|D%cgEB2VHsJlY$d3u60J`h9> zPM*b-HGN^#u3lh0zb|1m%g(UPbsN~mqH(<3qwDmt@KO4W53BWR|GzXZlUflF$1%dTQfI_R5V!HfOytt@nEk{U(2u(hD7?q>_WF z8C&YfX|d6i{j!G?xvrXezWW)uI4GM8z1+Y!diiiAJN66v-scH!{rz0n`}y2w(GG6a zwOrPY{Kn+1^WcJPO4vF3m$9DS*VwZix2ZBVitZX3Ln$qiCS!fH=}QBjNzRidW2e{R z8zGhWrM)p>et0noqUVu2hc(Hkcaq4>#U`X$X+5dArG+T^cY#g^XEP2)j$;Xn52jN ze;tO|qm$A8&huzzQV25KUx-4Tx}jyK3i??T3Ow&CpysA_6dRU+?tU+WR$^Zv$1iVT z!|6nzZ&-1fW-5t-bfVEby#b;}`xrZIz7xNz-B1YY{ljrh?%W71#nK(h ztVfqW+qrHnC(yPFiwnQmi**>6s=5B;UM5Ay-n zx5b~8&zs9c2guT~&T;f`(`nYB{2V*uRuwz#Da%d@>Y=-fFVPD(?qyS-Cb75A9~W-a z>4-EpzY}y*+l81Xr-jlbgZ$&z95(#919@3bfihXWoMcWOr%Z#VlbbdcF*Y;W8FizL z?7z4s+Wq=+%1-YK*&g?k{OaLK-ETFdme#0{>igoUR91@RpEt8QP=V`Ac)?0Md%((1 z`@}h_r822U4p1Y3Yl*fKjp)e*6Rc&qn~48E&d$W0s;>*ck|{(ai42vH5YFCb?|sg> zmn0%dlB7wRq|zi*BttS!AtFhL%n_307ot)q3Q3wINuoiMzWXS^JY z!v-iLy!SA&ZaxU>-gKbI<|wo#G8V_oc0sk5-{MaLDkvwak>*Pak@KJ*h3DNsucW7< zQ2%@yPJamhYwiLiUpTnn@i>&(TL#aUwh*nZT}0C9Gnw0dgsyp{i(Eh5r{}&hruiOK zP^v5dTaVYnhNI=M>reoQ}KD7B~0O>7Voq=<1mItphBk)}t58f7w1~<*-fvq<%c(T_A1|DdHg)VL|cW(|vR28(HjDw5p zKY+3}N!rs?69ikez?GWqF!$j8~~ z_mso{h7UeT2<~Hw;GnNF(7z&2`%kmMF;BEO4vO$U&WYzun_bV-7u~`Wan#{FOP$#D zzk*nWKmOc_S1sJj-x_>T%PA&Fv71ed3|W&_ENZe<;|kyHU@L!L>S3PdlrOBvYKje& zoX^Eo_Az}nV$AM*mYFEs$z|-k%Fg$H!N#4)Vrxcsuyx*&T%qrJjxTqP=RRIx@|jLI zDQ@|}KNNqKucCuYt~$-<*RE9O9HxCFP65H>)BAbYcGe-%_&||d%MW2)DrR%09@(7! zF=s|+NjsKxRwG%*eqzH%`^m|ar+EB?CEl&0#t_~6tTOK=*JUukeHgpWxp9SD0^Y-O zl4)c2rT2Ucy|FW@eIoB*}$|bXL9bgOWBP(yjc0zEXE)vmIRCnk*Y`a zY>9XbyKP$oIbtJA3Idjrqg(57p^zVL=)H)mN(*qu^#Xk4^b<6`;s?6*HyEdHi)0_+ zes=D!M&2Q@2!59BbQAF33KKn(4!)h7CeQh{Dy#SX6z8rg&9e%c!h4nXiSzHd#U6Qg zoq6Vzi9uW})*s2i8xBa5r#({W*{Lx&B>We7YA(TfB{lRMtDE%7lM501K@#`(I-|Y1 zX?QNxg_1`WquG@oaIV1#)Ebn5H6O{MFSRvv+eZ<4&%*P7cTN`G{niCM^c>*(#=Asn zsxZ;{@sw=!nxJ($OXzJbE9gkw3RrntABH#xJfgHKaG9}!8h4F@AAe@Rri%aIH@6u0 z=k!x}*UgJITfM`fCvg8|55f zj>r{gcYYhZ_9hOf9vOo1{i87RYXO|bxxzl42t6n*N=4QuLhZBvf!k^EP{{iyRqP-N z-y z2R5+Sj90oUn-^rgm0$49kEgO+iTnOgp6d^b;_jOq;(hmT<)s1}UV}_OFD1B$&pK$C zxGXj_IjbROGA8MD7o1aKj~ZTO;&(#!{)=W0Eiy^%m*w|aE-``cKA2qHJI7S4w}W3=T*u19X|NuP zw=u#2YtUuKHQ2jJo4h)(gUuSqXGdPG;H=A)nYyPO(U>@j4;l|5NAWn^@TnfxiTzP^bm-gJqP0j z`@mv@bFfasZS=%4n0_l4ikfBrA}13qENS`|S=8;t1Ip@n=!z4Dw&O@%UP7=FtcIuU zgLH{(8I=3BgR;*Ohev)cqF8f%5SMt1cuw;o%6`fuUs)XAIrte$2p^yw%;$i8UR7Z5 zg%}*$bsQdCUqvbY3WLs{++lP^82q7>5BaJE;8|Na3|yBA%Y$~o0)I`Y>^uj`9@`Js z9MGXNe_9K?6!GAnY9!r|*ADKVe-7-vr^1(#QuOhE{oslfqP4pP92M9M|1nZfX(9T* z-v=FKSm>j84Nit(cypCHY@f`9eUIW{wBVq*Af%IW*z^~;x!!>EEjQ@P90Q^Mf+%X+ z57_2B6S&;q(+m9KVe8aB5dA9vy6g>s^s#&Jt)4a9dEv3KxP2&WYkLfZBfOybFbfYS zHNhUF1_C?sftKMaV12g$s$V+=iu4x3)Rm9dTbB*{m%fP5-vBv&Zt7C*tYkr-wLp(Ci=*im@a`*n>&m zkjLn?+Y#>bU3^4EQ2)x95XCi0WUTTr&apPfBJYQ>S;=XfGLeBq0^@MU_-EYexr3~p z8O=V+Q|G0L?dN^+I?XGc&vG8tv-n*phP;Ni4>%`fPxgySGPi5VdDh9OhfO})OHK?6 zk;=_JB-!*Dz1g!72ftK=`>)r*U*1h<$fOau&uT+DksshW-&neDp%u>gu@uKI{fypa z&&6Njjj+2%5!Q8-BDyIju)~`W?6NxtTB&Bj2Q{Zahl*hKrM3~IorKhDw{#+$FrPeq z(u1Q+`;n8r0d1l@OuwG?mzve~6G%^vLGye5@R0U*aNx%SurRY2guaLc(x3vK3U8n) z#^=Ly;b&0OKNxCftbqrL&Vr2XR?vK@G#$LE6lf?{0%h+ju-cl2yOJ5W?&MdnTz3{s z`j3HT+8H2hK_*B)cM|HwyaJy*LjLa|6m0+~nZW zce=oAYb2~beHKa|e-Cte{up0_?#4!$*08}cQ*e7ejefe;4t5u5zyn*I!BMfJP<+cL z$Y>vfY+Dlb#62GvBn#0K=`!$V_)jpVR|u__ErdR9B5-ZK0k|sgM%ZjP1N3ehLt#Om z=lIBOsyjgx#CjhF`}mDupl_zY)7lKKzETD4`(we$N(hnzE`ndbB0)dBoq&a_*t&ok zHhQ@q?|}ObZeGp-jyGo!*IQ)7=9PVA4>+vgJ+yP?2b8Zfu{C8));$a7r=6I=YuS>> z-A#MS-5QPNb?hwUtyodcyBV*{i(I40Elc0XydUdj_+>lU^9t&`oX7-Dd3qvlcT?kz zSI4ojT2h>$!gJP8Vt^}C2;zxIZ!}TfJKI$G-CWcA<#8r-(R%*V$Xa$Wcb#cTpCFI! zN)XkH*XfoZVZ?+jU=;&DGWNCOOqKah##dtziT2h&n;eyq?J)%;^2U&s_)iqOj55sO zKW6N&rR&*=C#tNcn>Op^Ey)V)0KAhmi`lXQ8SGpsf$z63qKABJ=xQSxZ3(GF}pBY8VHx7v~3QkE@<({^m@v6bBUQO9`XeIfg7ml5kH8_C&|A;bb2l8ddkac6?S z8}{ln9+8*Dhjxabrcr`RcGQs^Iay{P<{=AsIqY!hV|HWFEw*K}jeG4fz>9xm&1-Q= z;7Tq9bEb2=*d;?#I8**ScHmDTndcfuuKHDyjXSN8=V%XJ=6D9CEoEs3;)cu{h4DA% zYp5hv7hOA}isb9}VLg`_*sA;%9$kgdL7xw3?7Im$erFkpX=3o*y2Cix7($!UP$;Bu z0RE|!he>A*p;gTs;8Gt>a*Y}>cUptI7n_4*N@vnPVF}IHOod*MxgqmyHU+rA>jbz0ntBrF{i^=T1=V?_{Xwd};Vm#|G58 z$HD4=Kj7k>Byc~21u2gl;K*nv9Gp87)-)FbTRS80J?1eS!n$DIgCdYecEaPk$Ki+L z)96{(LZ}MO(-i(?3s$RFg5bG};8^Ywpy@XQx@08*k;tc@PQeQt7x0JVJIsO1H)Tp% zE?mIDaRFxn+Cks(JVJ-(vH|JV+^POB&R}FN_fW2rGZFd42{w?qxlg=Vh2Pt`tF?Q1 z`a9;En5mYVY>JLBu^X-6Yx@oGe6BZgVl%h%zitLx11RGRZ&`Al1s_Ff|Uk5#IVW85p-82M*@OiJ1~R~CAM$@m(Fd?I7f zmlS?`Ri!xCTEMw&IY4{Wt(tkO#n_hC4_7Ly5K^WL9$cm0+Ubaa9vv)*o(?lnrh6`zB-Cti}=P2B?Scsyhs4EAy1F*BKqEiZ9RbQJkJ>`6i%-NITe z(}|DXLs&D_gT7j-ja((A@tsX2C}I0Lw6jhe+kTvecRgH;{G9k?kEsLxm12ynpK!$C z%u`(PMH)w{KR{`=)1lYS>4NvWJ22^A3aA3>VN20`*yeqh_&$onu9|{(Tx$*bsfs%K z&#Dx9ygLP}-J{`KyLeDgaSEDeTm@#SFF=(l3wqawfvzzGD+Es9wef+#{6q-+QGXk1 z;R`S`X$kBVxG3*xECPappHe<@7rr`o4i+36gDr|v;3uJDaO7SrG|q^pU$mwHkHJ?fXVB_DK5wp3xhmKBBgt3ZRtFPlB+g)4|V$nSx(<5K8n|^aX0;(;x>qJ;cdZ(Zo=*l_LR8=(v<$v&cLpa`$wJy<2TaR#gNx6Xf;HddV1d$0 za7T%T^6|3N=a+u~uj3GKdJbqYr$`z+DWDdnCQ=*ZDnZg>OKSHEEim_4E(khv8lI0> z1oXDngBAOopxMDgl+njMApV~O&}_azHONEo+)xU>9{)yOhz+nJ`o}oS8?ju!cNX`q zT7^et{^b5!?8lufjpcY#%ejB&Rd|(`2tRz&9+TJZ*G;~Bh%%{=5HmsP^ZCym^ZBoi zmva~I^I0U6#Vi=y&aN^oVaBR9kpFHUW$#&v@Tw%2aZ_Cb$>;6CY(YRU+ptH8Np$RD zmIq$ujoxbI6B{3X*ziZ*ZP(Ad%7Z4nnbJ@=HmAd>NpkYck_q0IM;hX8z3YYuZfw z@c`!E%N2~id=@8~*-O4y9isCW2_t(}o;ICZMCWQ4prb^DSz&dORore$RCU^k#@J&z zb=zlr|FS0W)OTP4{rj1<)erHVdA?X>g(L13%u4XwdgRq+fFsKMu*aW7yf`Bm&oETL zmd)GfWsBFLsC;v9=wLg1@5_h2R?gt#w`XvP(O!_5kPdtf z3d1ld4KO{s2sGAR0snGrp;osEY*Pq=Q|!%Q#G9)?$4&_TnGmPm_ZEQ7=SJa`iW_i_ z@*mifE)2r^m^TH1t^1#WyaRsV_Ur9X=dcnb<^2xE{S2bl%}D~9 zJ#VQeTb~2UtCUL0xB;j63Or`}OW~U*dZ1v#D5cuD6-pNhfh70oP=4_bAo){?a=h3E z-o!+JRmO(Q%{h`>eB)-WpiYQa)fvdW&DQ0G6UbefG0Ym;G;p)0LS9~o8ej9}WnKl6 z;k&Z3Cd;D}O=$C#Ch`q$_)`;X`ID&}-}?3!c7Rf5?Jf2*(mR64bG>@z0SaYfI;FU5 z^J=!#REF_PE@0HTkIW6H21Y1qlnIi~&~;nXOq6sTyQAeYF)%uxdxM@;U$b|yAfHh_7-J0UBZ{w_~Oga8*%rd zIXIzp06B%_5g*klOjxWKd)nBQeN;-ZeM!B{p^0j)z4<6JXqGul9mypzqq{SldXN9Y4J=-VG7#A(w4jvveYta8aK< zU2v2wxci8_a#Y}~N0ivWyE)7w;Rbfc3x*lonu>ilZ@@euF z|7w+>(BoFnj|DwTV^OLbnt~mY!u0j0?&O9+E)F#~jBhTwgoa=}Z4sUW>Mr=xL4sqF zhJzgVcr+7MxAp^{2sx=d|#i#OKGqGKZg$T>|NEnVn_q7S|#!U2OsJ?sFnRP7`2Z@%D}CaQ#A^_bj!m&>Rb z?_$)ysgn2>0V5>sEUpgwi?T0_plyausC#uJdf6a}4(z)RcT5)2&i^Ukmp;Nw`}b-r zE!@hC=I66wcVDp^wk_dCzfkO`@m^+i{5j@9LI|_iH=bP)slu%Lu$&q7G-I}IolTTX zM$!8}Vd%`4aBNY1g_bYa4$ZA(>F}Z&q;;ns&1+bK%0(3MzB&tZy;~A@zIDNeD`|50 zeI$zNal%v1WZ;`>^GRQoAyTX{q^(>OVZk;@_`N9&@ZHO)-#bEqk)Az_D&9m2{yT?z zr6dWJB97ZTrQwewrO^1mTDrH(0ffv-r539R_P5kKVCivPI3jEeBY0Ej1&kXMMVHEtO!KBgP^j2C8zu$U*NAYhc_3;P{R4O)OXq&I?nZ;a{#ZV^y%bOtqteiP zG7s{%%L*8Dqm-ysJP7RGCh(?@Q#~_%jDO4$cnT{6q1~(@keuo&VCVKzZN4`^?C@`3 zyjlk?8GdR!8FdDXBuE08v=i{w#YLbq>a?-M_cYM_R2_I+Y@?p32%OJ>kAMN+ANbYw z!>-hVEPV*P`h@V6@(}cEyopx4sD#_jYBJ_N zfKlEOz(ggiW^~tc%*HjLWNm9Ickar0a>gYSi+#LISH9$ z?hrLSLEy*8m;tXpP=Q+Obb*2IUdSA1fq7!X;16Q}=5J7e!Mk&T$tFy-J0CXo61amx zhmGJ1J5|s&`~!Si5pVowEP&cDuL@jTYX$r5_fhMaOMuqVp%gdpU_8@KSx8z_C*8fk z#G5YT%dtM-EMF1!e+q&|A{D@AzyR9&IRn>@`LMV`4oH`6f|)UMK!0x}75Xw298}YS z)q~4{by*OclOG0tt@=i87Ej|8lo}biAR*pSFJb=arxm=nf}28%LT#ph<9Eiq{1)T2 z{y%odcENpW`FVbaLWGH1e+8e@9N|Tqs`5g=H*tj(ro3xozPy*8u5&YP#S(g5Ha1Q0 zXQEFJkw1gGxR_J^Y~UFsc2?tjW)W3PB(>AIt6??FmVrtxV<4Be<<)8anlL-wa6^>p#}XKHxwPZ?zFB9C-L_0Y1yI2sq{vUe~0lj3MGX7=n}5?B8id%e~` z&!$At?^g+Y?43HOHhU>9jS45DsppAWV-N8ieU0xtvnA&H)QEiKe(p5$is0{wIKI0G z`v25JX%a6{v_(3q-8PSTG;o_aArni6Q=gN%fTOseY&!Wqlt=_fEN1K7C5-)68zh|b zl|Ea{qerJqr@M4F(PMcobfrrY-G78dzWe3r>|yhBl~sR!cv_t7VhIHF6Xp|qM;B0h3O6O}1l!Xi^tanUVf zoZFs>`o}h+KmJN+Y%-nBTN4I1MoNP7h2Bu^!C9a%=Q^l9;Y!Z5hGOS^*?3y_3v{04 zP|;@>`kqQ1tk(C2?FsX!6)mCg`liM3_;3U~X}1#`Kc!B0Pt%99qkN%(2Znd_mci@c zI$&+D6XlV76+Y_}gLOVy)W_mkaOU-Pz{UlDy&tB+kUJ(Y{oEobe{~hT=2RkRmv{hU z=7_?5c_FZv-w77l%KzWBXkCXTRU2nP_2{n@cpjypQ@wx{AF2q$jYFZ;69kn)+@R<8 z2Jl9~1MudV!pk|Gl-JZ%l(ZWIrsj!5PjM|k3+ly_R2Fq>%^IpO5QD|-e0cTFRUq{% zliK}h0kAht1?In7sjilIYTq(XP!^X)RX$k^r}T5MHF^;CRVWJ_1wK$*p@rI(`hmKe zBtfMmU4)7&4uQIez0`;MF<|uhQn1QK4lsV!aD!tAcx2T|LOdGSEr%MI?o(TNyMAGw z+_8ABcx(ojcxf4#d1Vv3`sq35gG(ZN>SrpKX}FGmja)Uk!3>+UKQA{~S=-33ciqQJ zuiV4decHio-m1uXcSI2O%pykfCS-Jg8X?{vS&hIPM!tGE<6jU$%tk7(%(sP{t@KjX z?6v~8(W;RbxcmsO=loQj^iUA5;7lDaU11u}zFh-vSnPd!K+ksIdCFFNP1ib}&qSVayv}{TiU9ql1;A&`sb2sJC;opkrO+IVromZ-% z4D}E_|6{;#i-rZyV-52+QyfoDhBL2`fXkU0&fHmDOOzdX>|~WXleM~!`6v6Fnf%g2 zqWx0wF{KDxd$bjey?a8xG6}_L=V#ytXEj0fm3H|0o<2fB@9B_fCP;VfJNVdh3Yutf zNA;&4Vd>&y_6WkBFv@uul|O;t%c8FW&O;Dfbn+%p zI`afpeXf8d-#=1T$K~LBeOvHrWCe({5}|$s`2v}ckKmPkC3WJ{X1Mqi3m(LqgI{9D z;hCTI&^PKI_@-V81r#T^dUpyKXn6?RmrR8(_TL7tj@td-F<9_5pZc42n>zd{n`#i> z2lxv4u(mK2-YS^}cYb&XGDq$Uc6Y9VxlNm>RF7b&zBi3hUS>d5tk?piTG~JkcncoO z41jA|4nTCv9O`PS1n_AVfudULVOxqQ+#R_K9(&$RC8fnull8&WGVj$uBVQ8O`?An= znl}h^{Q|3>eKq!9Do%IV)>Hb0CBXIDbjn~Rf^oCjKv113l^$LQuGR{2=d}Ys`1)Zm zvFSDS^Tl-n^`lu0x5v!sX5=*$l@rXTnAdFo2E5hEpKgL|Tm(MQiPhmZP z32zTi-lS!kk?G})mrU!bg-lEIj`Op+uCfQa1?<-56!t*hWyayz3ue^X9wT#T5PBBV;edubGw4@Bm)ISDc9I`bKNvHUOwwgIpKO?QpB9T3rQd8B zpocdfK#!)4qJo#U#5eLS`6*$@^w~ZjO%HnT7h{%e8T8?neXSyC&u8IFm;C6sR&gxX zo`B6zCc5r;nHcTuWs0@-kx8RmoSq(mBYEdYR^2ip5+%%ZeE3erXJ;Xk!*%FJ-!FQ} z$S!*L?m7CW&@6OR=s245b3c93HIeoaR-oGp^fBGm&UDo!kddxvlJ7*3llxo9vxi5R z!RI$g(ECc#dQ_eL9y3m2TF)|CmsAsDg=>40(9<_A zu&}WS>L{K^3Ar0k#RFkfQuhhi+?qv8d7Z}=+ZU6~Kh?+z`#EH%fes$k_=F_>DdBA& zZ{nUfGrIR-DJ`LS8~k~k1Z;*rgC37rP}%JSOmI6zj?GEKaB3h%{sKDZnrrAxoH)I2 zSb_#`yg+sPYvZ^%8X)E@0=dh}K;!9D@N$PFl*|-xDRyoEI=%a0+K)#dS#Tq7Gps^& zlOE8QUIbI%ED&+?B0S_d8%{k{26PuTfkTOE@b^9+&^TWObj)gi!QX>G{u42JBJ3vk z+9d~U@45f~F(~i}1TQcEl3WzXa8aeM9{B|>R5`)JGo}FYF&2)5LfHG^0eCuS4;C5< zyx1869=V@@`LAII+rw`OoI?BH!$U&=3>8!7I_7|eny&nNa?w`QpQ)RSyW(xRm zG#LC!-(zgF&;-;siBjHM^x@+sfiL5)I2f3}gT$T!?1GL+R?*v)Ye@c&w@Ims>-p~r zyZa|g-Z(}PSwCU+hUG5S!<%pxS0AxuV>-N=rgbK-JC2%)yqs@(;J*WWpOrItdkj}_ ztx@)z))iUy=)EvzWm7scEV+!C-T9AcZkxjfd0l1BYyBd%pFR>dnL@_1b&%;Da^Sp| z#d94&ro6YPjJN&f5gvZFm$R9+hP5c^$3=HU@J|0^6qV!%+>Uy*bB62#$!CNLd9=Mi*pH!l~-ESlH_^ zv(s=8b)Bsx@ih}oLV`+_c9aZH1J3sfdUHeZ>*X}XM-hCg%nO9DADF2l5~Jw_t7 zX3#P==6J{~7wrm@z{x|h^vZv2a6?8r?8y3o?3-7i*LKOY`|Knr{nrp(U40B+(2ydy zb^xz#bHH2r=i*iCrzP*~I%XzgALRjj+fR7o46 zBY;%+8;D`+x&!FJ@r(3{BrW=6yI{^xb{h09(g4DpQ^4$ZyMc&C1o&3=A1HNyL^Zip z!qto9p%YIOw*HHTRux_F-IN~i_-rh64i((XhZA5^rw&W&17N~BaoADYOS#L>gw~7i zfwpcUxXHs%@j?K&c}WTCetZEGd_x4ebNl}tgO{3qgS4sAVC4Q%c=vu8I5PAa9R5-P z?oa3eQ;9lg_U!{m_`t!JpX0%84t^V1aM9|0k`l}V8hO5g50PH zJ&t_Rpxt zceUGK#-~(JrLrBoZB_yMc6x$GbKd};>{P1iPd-?nRs$5LpN1ZvE`m?}q14ETGP&-b z&v@Pc%Z_)7@yv6>d2eTyax&lrD?M)&qdiTCh^$$_iqo5!11{g#m+3NG(}{RNK1}8P z%{pjOIV;*^onj=fRdWlkBeb8Jzpaf^ys5>u26>a7{U?}fEf<+czul~ckT3JLK#CQ( z$%vivMU3k_n9CLejQRn@jcLE&j#usFbxLM(W~s7VazGAiu`r0`37EEvU1p<{>x+@I zUJUI%vj)oV>Vy$Fs;rPmHWnAlBZbAqc=7KL-1!%vYj^wTrppO*4P8%rA3TjnD}(>O zO~xaao|8X^50J!mRkHbUC|NekfZOdlj|tk7h#&m;2>nO0kjBq-q%PD7!$UKP?k6QC z`n?7jocV${9t2p$#TtLN_<;%z*brYR&X{l8fZSzoV{7FzI3y&%%@`ucRIV{1R!bL>0|n~j&)X|ZbHy^| zaQ-~T$;ygZ{wR%z-#I}Ji6kPQ_9AScu7&4TRU@&a?=(_5%9?J0T}*r_WzE-Mw7oV&f5o! zuX!b?74E}_58YtLcqR}D5rfSer_%alHXJKSg&(u3!Mz%3dcDh0sH*>3;CZ(ZxW*@` z-v_3{-tg0~X0s)DJbVN~7T$sfjQrr}>o&M*WddxFegWe>Rp_;CJK=O!f9kuH z4ottUPWPA1hRrbo-p-zt@bK13xFS*DiBWB!8q3bW**l8Ca9S2jKlx1Haaj!wRI;H` z_DQIpYY8Q!&lqb53lX*FhD>sy7QXT&yl^Je1-hpR>b61RFY}4V$p%0vWz#3V-^MGv(|Goc;m6P+!0!n3)oY|)$9o3 zLaxei{1F9G@?;FXL9-Cu+(nP!jkJA-3|${{hY9!A#?K`o36PD%gNEZM-#s4H=}4pZ z(bj04P8@xFPdU;{79w)j30XT`ggL*jk$5Q@5*;;LawtcS>+a}o}Y7h?H_jDi? zn=G=wBMckg`GIGIMKNjt8_2r8e$QZiZ(1?E zD-jp3F2xn?ok->CB<<{}fCj973Sdcd=@EB`Kb9?K27O;+hgD5PVWT*yR=7c$@HA%d z7$Q3R9SIsWV?N2g7ckVb7~G}EFe?-BR`CybC}S;FXugjh^e)FU7v4mvQBvrwzhDpc zr!sWfZ$bMs=prElKlGw-CEB~g5_xKgAg}Q#bVR5U8J)~SsyB1+8JQsTN8={8m?eva z&rH(iUdlo<*J|jx^)S$%kOTu?{!tx8(?M9=BW(0}BkIvPNKc)<4Jk)RAj!e4uubkK$t)hj`>*&1ja0pNk%t^$|QY|yi^4N5C?LP;V?_jqiA z9iNLpb5s^Qc8!KpwS<7n*h7$~uL(6=RpI%^_Hg~wE8x6)qrhhy3>%G~fXq_^ASWe7 z;JhyTzhh9o*`BUAX9d)HP3YO>O7ya~0g%5u284@MK))?h=pTyua6!s7h|h0?(}ucX zWJ?l!yv+zC{Ad6Zi+ZS)LfXJr_&%H*I|DEK$idl?^}zh+BzzWB1LaJ*VX1eQpt>H0 ztv!Xbit0>Qc~YI)+m;JQKE%?UJ%Zk^un~;sU53Y}uZCXIH>s;jUV_ezH{s6BKj5%e z2sD*)hVNX~LQRcg*tfF;-Vy8}3Hv;uQmfPPHC;E-DszFIDd)pGY_f*!)>dZU9cd$( zo7_m-@-!ki)@3i8zsG3R?Pn@i3g%iWcllp4xuOHsQU&Iye$b0URPx1acdd8*_b_Bna-{0 z&SJyfsq!S5CA?>rZd|eS1NO8{KK{6{3$=x8Kv8e~(Ar3hY7dsfxPe2=-N)lNh~-Ea zwU^Y_mLucKk!X1P6Iy!rZq#fxM2pXjMX?WA^80BZ8A@ADJY5utNtq3vWHa%&*-CDO zb|R^Ma{~VvYy=MG64+%pfz(=t;3d8S4?xT}#zx@|5s9uRpI)3Ha^3gniCvNChIRrO zKH#@$dgeQ1L56`mo@Bn_r}ae}~OvZitQH znh$>X`UVD#sh=fgMTX2e>y4!6=TE$v6=Dn@RpM`U7Z_H|gzzfMu?tuPy&qVwSth?-<09B2oP_Vj(fDDY1`UH zI(6qTEmb*AJ3apo+DqrbukXCz^CO8+_nr=Y?tU=T3bKNJ#{z+>_(#xCJ_T-?ITbt> zSq>xbSkQ9fG4w_l2;U#w4{cVx2FYjUKoc=P5R$DAwz#Onli!v@!|6P@>OmT8{*VUM zzZL??v8nX;oIRi@(+PUr`3+S2ga7Xs9C_^jIuK?GemQ zXldwv^b3%bphZjG>gk-{#!|AE1iZ#R@bsWy?|j%5 z_Iz9mJs#V@hT^M0V)}77?AZx!4>EM^rnw+%Q6e>4dp*3L^Z|D52mqhG1@8Ak6?pIC zTk5IT3J`cf3(8NGgxWu9VU=Kib=*@FetDw;!oRu#3zY=;M^g!=uPg?7Yww^;w>~V9 zC(33=Mf1c~d|{ZpUF=hz5VFQd9w+@C#dp>`W*h{)z1!;vQ@BHgi5W6tT$8fd{8&Ry zqQ;G*0xxlwzwY3!ge!9Q#wYQ!?odW2F`5j@Wej-*`Eh@U)CUlt`oLTaN|E`vpag|LFgUjqx7I= zC%wEd9<1#YW-2uP;`=L3VLO{!WPU>pO1iR&UNr8BOcORE{>mfB_)scRN>L{juZ;*} zr9!s#s*-72-SC-r5x6Kwmy_Q2g&YnWLRn`d0XL$H^~&`~QHd13a&iL>`4Goo-##*SDmmDP5mrMSe6WNrVN3zbw5UWKMc)pcCxxe`^+3+}x zQ4YIK!lx>dkUg2{Vd*&4(r5H0TX0;wYdp(_|jZL6P>=dw~ z{tf8e+%EW!W>K0~1Mq`CwrD~vkltZkLLWP{oOar64IS!Y;g^wA=xR|3tl!r_;rH?& z)9n$kc$Y|7)Ncd){7C4`lcJWtO@MTGJ^b}hf;Ovbr^;_T!CmPsKvZ@Be2^{$$EL(m zx%o}t^!--gY&adNK_0YDEP!X!v!Kayvq4>(&|9d_-&rB0q?z9E4 zDh>MUd;(uK%YmM8bBgUg3yzy>g1HWoFlCP@l!)C9_0LJbTgl_#&(~0(BzlK>AkL?B zzK?*Au2lGE+Fq!!aS8mJ5($%<$^fN)6fS=10Nhq_ux6#;Gjz0|QN1SE7_$Ius0s(e z2|J;VbOZRBQB18%`36=lG=R-(-%|OGePC+Zd?+d#32HtS7;o0v39fI_qGVS}fM1!8 z@bjD$V13{MsLDz}XD#~3%EneUuyZQ^0=t@>!9T>Zd;Q2nf*M(xrov2|C}zOla+09w zNMgUaust6&*)MWi8M~7n0-w_*&g_{XFUnt*@8L7Ro4O;PbI6Nk{nr_ho71ew51Jun zdlShWy>fE@+y^|r$CdPP1K7iO8gp#ek_EIBJF0Y(F^K1LMW?56=eo+-Z7XHDyZLju z5Zr)%PTWC7#{_QZd(WZows@EsmjjP4yhL6%l;gt+kBRi1VKO#sh2Ae+h`#BLBB!Dx zBr#Qzik6Ml@sTlNMx( zV;(tdE==&&Ub2ecNnE&O=GJ&FS@7>H&YA9tX@@m*2VIQLn*o#nw&0JZ)3CzKS#Y&n z0KEU=9qsfc2yK0{1zo%Mi7w2qqP-%f<0ADMq~Y`!zf2b+2{9e`aO5}+l?cZ()Gpza z?n!#yhCQ^1NE@&iI0L31n+H_?J_ldz{Xv~;F7|W1hj#4fr3cRG(mivHXgBM0xFupO zT=$cKL+bTlEKv+nY1$xZE(^>HpHfZ<4}jeLBarWMg7Wy~4WBx!2mAg>!TI1Pu#NPF zy>l7fwG({EUk$qDpHn7g<igV_&x=Yg;spMZ6 z2TmdDYUeOBGCAhZO_~Y*G#%fbIfvaf^)5S6K858*GZ@`@8`u_E5#F5Ag?#n+ul%0% zl6<4sBo_2EkhNYxB=bl+c{ihtwCV?wnc?F|{e>mbxNF6@j-DfO2HDJhRarKp#g|PF zX4&&9AzbFwOisSgg+oezS6uM1c6$xTHL?K~heGJ03#R1L@fhM0vyEAP zN`h2Bc!VxtJ@n_h0|KjEY1M>t^sE6_tW^?+b08RDyOVb5O@t7s-#+&{`pe=xJIjI`KJ&Dc$abwH^fFrEjL-gQxB2;T3Obr|#GI z*WJ4~s_P_fGHXS%bL~+47YZ4MEkbI4%n^S`0bRVc46c(~jwZg{hTBdK&{Y}M_(XR< zHWpq>*2uiT&2@K>AzzflEfpd>)m38Rf_jc!|9 zgA~G2XnoEUnGU_Aqh2I~8v8n^KK~u9I^`(Lv6(?PDF1`=JM(Gfq^pA2X$r3JO2rS~ zekP+I7ZRQOmvCUb95#-y#I3p6^ySVmcbA3#GvzqAW$Uo5%jgrqih29QQuJ-<+%F{(D5iX zE-4xnc*Czy=|Buf+ls>#Ap*`ysSIUXvm7SQwF66aUQwF23aLCTZTQH}9sJ%g3rx&b zgBPax!!PR5P(?u$>=x9c{p*i{w4$f~H_IYqT0fPx|1~9XS_T~VQ~{Hh4Z&{RBJem@ z3+8Q#0C-{%3_h+6eKgEKc!Lwr75fhi?s`alJ2^o`E^7dv_3Hq*_kcRSUJM%C{$c!J z)ibK4x)?lmE1~?KW`gg6yU4XyK2sLghJfMJy+Fj#64-WsrtbCBgKLSe!OXh>RNbC@oZyB1EY~(Sl?zN($LR6lE zzRt{tx#oWEbDeX3CH%(z6#iph8_nI`z<>1G$1Bgu;VW*2@#;Sl1#kOS!Kb89v_0*& zsL@ygE!$lns0U;SXCEiBpRzNti>?D!mAZfmWf~!zDd0Yf=gj%_eCDS3p81ZPD|yds z@@|C-E^(hm${ow_y|*o710>RY4M3IoXmWh#F7~QtBHO0!!7`!{YYw&+@oL@dP;3x+ zbv^~$&aWg16Zes^bp$SZWMASPQ2p0a?3b1LsitFmCKd(rNQgBU(v5?v(W93 z9jGtM9*#Y%hITm}u-%ydzh`jwU;$lI4~0bkG%(294r!I;FlfVIbax{`8nUa9@naM8 ze5VKO=w88tMp8BVf2< zAE)!@0O;f$0@;#C&g$eKSk|-;LWvT3D>)0#zo>@yH?kn)MhUb$jDlC@l3M0eFYrcA z5Uf=O?dgUvd-esmaFT)91v&U&)e8!t4>>&JHYcpMhEl&(I6g>Im^^l#NRaar0w(nG zH|+G;$;v&<#UYe_`0dE99=pg-XfdZ_|J~KC674~~PrgH!Ku!FfjIdbL&KG&5@gvaa1JD0=E(e4TDTC$&c|CD22 z=Ss2Hl08OsRJSmAmnvUfn1ZW+1VW|Ka@x9SC%rpz0=?y)PrAOD^K&+pG8(JP-^r9_ z<#&?FKPxwU+d`E+sTj;c671Lt*E~|Q>JZ`V7LeYaBw}lvL^O-8li*o##IHUSe+}M< z4W>;X8LJ4JEpN-74X|TtxYPlC~k6LQPzEp&px;51=l~22q){ zdr1B~BYO6UEYq6(o^~yMLn1V-o_KAPQG6D! z`C}$zxBClnT5E*5WWta5^O#Nd#z z_!8A70r{zjrg;q&-8Q)(?kTVqKU6#+mRj*i6s@$AZ<>+B(ri+B)fwi3)5gKP>&}7v zczb1j*31mP)6R{*QXR@S(0PK5s)tC@!!BBEkt+UNn<1uS62#To3gV(BZ3ZcNR4*lp zsLx8r(s7%~;O0^2#Im`3k9-VUbJ~Z$WqgA+fSA?qQzY7BwI!^Q1X39H4_~?#Oy>mD zGWSYjiMDiw-Y(Z>Pq!PgS$8U^^N~}+oo8d&D5sqSxiJ(uIEqS}XtA#CZ>gK75}ESe zfi)|>Wgn(S@=xweWTT~9NzTY4IN!aP{#YB%j?MI7%ig}k<4UKI((7{cgsdX^dtK9gB4!!z{J%AD>#Z>!UkPir2$| z#?$bK#ermeOA`sWol1un1W7d1F5=%SLk(UykXwdmx*zC_I?9sXyX}r*e zp71N&l#gFwy|F(SbZMdqzG5nKe;PSaRX{p)6^MFyJl?PC1p_)KBHb2MWHiJVnds+$ z_H{R8GOh*-dO8Rn@Q{AqN79Ep9uSOjLXK7~;>@L9J+2vfB&N)yjlJJVQE|ctC?Ed$C(0*y&j%UwAv+DV57URC%op?}c}ZKfm!O^Kizc1)Ko`Sf;gahyG-U8$ zPF8;asE22wvqP;>==M`^bjLVQu{A|j*H=pX3_l!cv~jm7fVve{f!nV=3@eX)8Csd8S;oNZ|Y_S(uEAi z+0f3Ts+9DcqL-HE(3?A^`q2V%SpkJMSNy|AUz{HiY26I z(>|#vdVc8Pt7Saml z*=lH3{Y7M+r+~VxGtsdF|6twY%P6R62wqli0M*Maz%fP}^*xS9+*NHfFZB8u3-uTbEH#YIB`3w<1ca_K> zGD`gD#RG>aYGQ}lbKQKO_YUTTIQ~Y^UjC|v#5X$GMX()pkd0n#E1akt$uCo0A~?I$ z2!#_Thz|R@iJ#UC6<1|#6Axd)JFrjHVy4}}FH+KGr)qLY3@O4&xAe(`s!n9QEt8+W zF`iG7d(FSEna+n@P~!IwoK9c;DIhvCVzBQVOFVziPFmtTj!%C$m!&qWWh0v()A#1n zS$4-NmXvW&FiohS!&@rJ4~gG%t=ngE+iC#oP{nLSnI^qC_X^F{O{0m&Gw8BSlAWT~ zLQ)s?3Cq_xGEap;%*}H=b)|One#>=|(3(sh9=u6H_kSb%JO$551aRSGb?=_LH%2|vk7aSv-Z*ptk|lWReXKK4{LH~pWpJl{mUJ^>XvVO zj?_WkSfVS3kF=z_&zvFajfbG2&vzn^o#|-Qv$3ep+JSVwR3PUh9!r^2IhrN;%%W6l zR@J;qx);(GXEAmyt4&2TZ+l1SrVOS-2>F19uD8E1<1Kv3`)+s5VpR6 z{B6ByY=R%rY#BrjmR=*RiXqtbfIaH0H-e2Pz9L~uHj=v`jf%#t#1kr3qtTy6pl(=; zZEn3lFT-!(H%SlBxj)xYfT@Iq=G_jNd!}=GL!YC*XkA#FS`W>0mts$uM09vr0zx`c zXkFJe#2mf>)iDH_it}8CsRf#AHw9Ts^6y!r?*8v{Fx6!(*C5`-%{Gk(zxPWZ(ew?s zrZ1aw`V+%VIsJ&+`Q$YCL^pxlogm4=6#VoxfYe;KpXRy{#L>Q}wfGsgt)Pr+ z@*9CN{>T7t8w+m-8cF&=J2R8=2?k!T<~ALoViO!v|B ziJ3zCzg*rWEQFU%e$T$&8qAn?6&1_r(sq}Dtg~?<|LF(Mi)O!J@a4TQJ!q@QD1Ei? z_mH}%zk8^VRC-*noqt2Pl@}+n37#c3yzC)9ef2H>{_Ao+U=Zs= zL;}AiSP<4P;CbJZrb7RW<)Vz%K2iQ9d-2aqH-|r?&N+xT`8zCemdxbugZzjU517o6 zM(SC;g7kL&BP``3zSfn_4=YRHqf`BPg?X_=D) zzjXdN>b9|z&E9m4)$Kgbe)+y;G3R0g)k#)Nb>?c?`qu+Z*|>`yX&S)FLjF-bi6lGA z>mRGO^`)@Hj&(%eqMq}|kvUVYkO}uDvcZGoY4Ng~M1FHFd8}(rb-HHJQaY24t~gE> z=9-Y`o0x=q3@7Z$O>A3Tji=^S)3Kci?ApmHRud(~kI&C%uA(7)oZ>KMIBp+HI&+mh zP#eXombeL3gN-B*=3*YZr}4|8F4D2aX{5=6Cl>;e@E5-V+^RJj^<6lEMu<=2f0GHh ze<>Sv6}FS!v~>Kn$A+o3$g^E@(%7;ep3Lut8eR2!D_yWUf(E;`^SS z{-i6w8&5{%CvwpU|7}R4z6*8tRwI*jhf%cC9JFAuJihuP7o~>nH9-3>17^Z~F_>*e-@OomYDv0zcQ9+LJ(!yCsvaGKQFQRbHQ2cCUiLi?j z;nDXfKG3~__w1a>*KK*lU$!;jbC$^P85uWN%R^b=@#!6cx$}Jy@(FV2c~s*t`z>>* zw;bZ|HA&gQdBt{KG_8UrC1%pnPyNJoy+3_@`UO_?zs$c~4}$6Ml|s()dfxTMOrowm z6lYv|i59kp;Jr~Pcy3oDWr5T9kq3sd&-q7L{~R;+BCdv>H4kMWmJ-6!cv+UUER~jZ z42RBQ$x41iAJMtMXinTR@^H65zb9)Nt=w~hDcGs9?A}Vk@N+V`^CYVozk#)w>C(e3 z8g$0}izIa5e$q333VjqZjJ98UMv99w@kCJuRvu)A9tYOoT|>O-bGJyURX&5s^R~Q? z-FxQPsvtajk<7mcu;cqQ-mw}l7rx4Uw7^3Ac%R`%`9@mLKT|wF9U~`^x6Q?5>B-ah zsO5I7HTOAMswC-)cs7q=qUTfolt2AFA^1?&n`~3`Frt@Lk_VIY8 zC7>yZ$B?7PF#INU-~XP${cV86bB&SgHw(C#9)=peZ$w{bJcg}k2Qt1n27CfWLy6D< zCT-pj8hDp8xbFiyR^H(>5(yVKo}ypMN+@`TDO{2ID8aPvg({yOXtO^F>$V(*H-}3> zx#|qEiOqxR`xulAwNU6j#Qn8A51Zc%LjT^q;g-BlhA`K!Fz5U&+}YfT&2OCIF4dWF z^R^QBpjiul#Xq4*57ou8T0vILeKwv#`xMUVf*yRoFH%|dy~06wNk zPV_QPR{Y9ZNo?;}FXV`t>b2QwRL?pNbNnPm|=C(SX@6 zk0Qoy92Kv;!^S1F@KM``(&WVN`0@l(Ql}F_!#$el7fE;7skvK;Q>GUw*}n_l-Jp*; zdUeQ&=@XbOE27qMHB2UH0zaqcEWb-9L#S9kO7uq7T=;#dp1)jppLh5=n%5fF%C9te z#Fvkr!M{4DN|^me)>8H7jGYmLLMff==!mEt*SbC^(P1id>>1cM+~KQ zqfU?sbNy+zYXMEDSEtI*NX#p8*x`~is$9R9$Z6P+AsNctF4q)D?$JY=B1XWw4R%m4 zBZC_|$C`e4yOXdH$BA|JEwcYiI@z<@o1CBc7<>1IgL_&LOnE*Dl?<~7_25WO&es}y zjM$6cImhAV_p9-wQYqT|p#lH#n1gpqSTKQlL-9h*3VdqLK~(Ihfk(e6Me^FpxL~9K zemdtOmUbD6{gY?nZ7Wo8VDv=1aJw8HptTb3{rnGA>s(u_ zLH(t`Eo*3n*nr32k+2B1BzuB}^lErgBtm1&KXE}V8Jy_jaIifzoC}IjMyk50FweEh zzRE%$77b2TvuveW(haE6TJw^4qcJe{$rpZ=7CLbsuWdDtzu8txKm2+_Zm*q;*DgGVbtWU+arO|B@@fb7BX3|| zZ#njK9Yx$ON8?%S8D1MSk7OH6CF|05(GOz=vABF^f-JYPl(fZ6x2KbQ`x``;E31)J z13jVowKZxyBZVe)j{(%Y6Xc(M;-<|jCDYtZ>G+C=WUB!ok0i{ce(P=&c&8EJS`oS( zG!xm+4TrcLQ;_>xFW4S64262=Wv5zIXPo%>R8 z7p`w~gzfR2kdP(Oeuo)wZ%ltctotzT^7B7%DCQ0*s++>&U3%zujU((;nhNXRiokAw zA=KSD!o6thid9eKi-qZirAKN4*t?+)8CS<;=UQ%J9UnnGR1 zs6omOczVyh7d2I8Y7`j#VAlqOYPtD~g(=!uvXn4g2p}gCRl}MX0YpIK@f3myq z`?|W|S2L6McJ~loyqzve`)MGGmA4cfUh@We*(8wGFiL9^YW%Mbq04>6C3s^TR2_>U=3NjXHwlsRO0xGry@w}ZcL5GA@j zz)L88mq_)b55XgaKe*ddA?R|6`TJuix%0vrJt3G zS;;4{@UQJJ4XRGUb5?8PdrQhuzu1Ck&Ax)0e?{PVzw>aZw>K`XdxX?m#*_Y~CVbm( z9o{_PG{2!pRY*#75(Xca7WSo_=3^~QSohC97R9UcJK6(;V;fBP+6&3-Uet2BbaNiw zJgX81WuC<;HeE9Q|pmY!Rc^l4V&~^in#wJ`ES{If?dqFG64DJ%t;x&9Gs#KZJVQpm81XB<0Xs zk~;4g(F*j&bI0DqW0wV>hOS`rbXYM|DH-A|A@dP`R~N}xH^YmVHQ*zy2K%O0a=niQ zbZO95B=h?K4D|eheitgBx&>{>{JI0$*<*@K*G8ZxgQKu!pA#-0{|t>&d4k?HMj(m7 z2SUzncFB{~Zv9&6VyVE2RFvXYg!(BloH3H|!gK4xGYFp|!CXdN&L~3zb|! z#qK7jda0MYyZSnupCsAU<%+;?!7%jovoGYlEQIw_+abVW3p|q(P|AfQ?v|YfTA-wc z*s{G)c6SDZJuTQ^FIdr&B4NGjR-?I7gFzbHA9MmKQ~bpUK5(Mz&Z;3B)6ERY^FG!%s*0sonZhr=sx8zhN6~guNl#So3chGp z0KbXdVcEN6+0L*E67}LQ+Gb#br@eiEZ=U^!f&*f(8!bi?r+r6iTUE$mxdN#FM~bNlifBb`R`6B z%YF%YLmS{=#$+T{l11ucMi7JVgGkagFT7dO(YJVjGOC=M1L{7Pxpy(A(WI{k>F$bw zrK3wANm>bxWd7hLIY_!Y<&UF8q>kv-B~Y90j$XY{!D)Vf;p&y6u);Y44XnC~Zm8}@ zf2NzEhXW3S*?3t*ca%YtMjprp&w;nP6^OS}#%&7}@U0!1#p;p1L(s!5>Hzd7aFgQ z>>CH5i4UrwYxP2KFjR-v#(`jT>$-j2`&U3MIBro~D%f6Y;Cj{sLvztl?&SX4T*JyJ z=+5~8dq)4^c8<-3FiGdf>nCYY_46#OIV24dI|S67ZH0FRi#WYqDKPl#1e7e{S1~IQ z;0Mic>Ps87o~AEsIlqUElGhPZW(^cp#jK|#6&q;xF-kjWHql>xiwOnaC0$Sn)aC9` zGPkW6&kL%;mpYyhhtQ??cK2jqq`o$ReFNx55wH`fz{=C#vZDIa{HR1CtbFi|uOHhi z7+*>fsjie2m4C;H>Zh5D@sye3Hzj$Z`v(t*j+fsP9M#q^ znF|dhFu(zKy*Y?mjFZW)_ESjba|WMt}>#(cryY5{+0v^w8=FI7mX_`sf=Dj`1lQfTq+{lsc6qI2S9 z>692tx^dhP-Z;&aFPr#~U%B0c7hOEdWUSvZnP4@3dd3l^-2aT6xnfB!HvGb}%P2|z zqfUJI3OpfqJPO*-g%=!u3}j&hs=0Ut+nn6RLZ2O{Kh4h3Oo!_ft$NMY_D^6Jb*lK{ z`ZhWyPNHk2RkATZ9x*rn2-cN%fFvAzO8BXNQJLyu{Md6pmdd$-N6A*&uX+SrOPKwH)2+Y{sVR(n!eEzvPFSH<@p1Og`S1=tz$Zm{;{ks<1+dn$I3hZ{(OIsaHm{h=1K1Kty&2F*#z%V77N%QVGb9LfUHs4(muOHlJPylF zRm0z6Z`9(o9(BY#grMcSxoP4!(9<&n%~#D}viuom)}#&#rp-YI>~5obmIu+Zv6=sS z1}pbAaoqE&$U?CpRSA!cb$P@($8UJ+)o(%F$3B! z{R4k-1}v|#;0{X8@^>@+p-7@b-H7@CJ`ImJqII0R@qGz5)s^w*&m9t=@|EtlupU%W7!J9U2&+}l>f zg%}-zrEMyxX-Nt!yja6s3YCGKZB2C5fku`suH)Z5kL0JGc*Yw|P-SjC>9~49DL&Tf zNQTTk#k@AgV8u!Esh?P$?$&q1JAyLsu0>R$RjA>GL#c4x>lr!rwu<=bHV{R#5_(9I zP1UUn;SF@}@dMJM`PAwG{NkEf;9W4JqH*Yt1oXE#aU9>!QyQu7KsBlZ`w9q^5 z9J|qVn=Z9c#XFiV(5+?#ZS0fl3QMc-x!i*|VN%Yw)AaVFpC zk9#Xw&9g!DoYfq1X7Wg!*7go(tjoe$ha$04wg`<6K7?xzm?I6pYv}B&r}*_tF?(J( zg;k9Vq0R#?FpJZTZ0eJ{tZR1*dk`Yw8a`gm_K%Zzc(ji*<-7XIu5E}{?}H4?jX0xnVW#XfZNT!M;Y<*6R^drcc%|*ne zppgD_{6L%ZzL1W16S{NhYoT`@<4%U%IL?^Xvo>J7P@p#fHIAjWG6;L+@Ci1=2r{mxfp4e zC4$B3bI|AgjjO%76ZW-E0^Of-Afqq>zJnM=I1fUp#bRjIw1A?r(;&635B{#nhEGoh zfad)q=nY$le*Zmzyp2rJn;{YZdj^Bv>;=)Xu@EE4I3~~M@jcljR2eVvyo6x1AoCcs zxND*M(5*{HXI)W-T9)@X(IiR~C72GZi*nB4&LM8d$%P*(F z!eQH?6O7`2^Onc&^S>ix zgv1k1*}xk&Y02GfMALRYmV5(JIq4P)@85tA$Hm~5(VxieB2}u_@DfjPE+x&w#^Lvq zl!W^-hlrXaJNuA#A_j(|Y1xE5%vi38xfVJK=SQ>&8|xi;LoHvi{`mlr`67LBO;5aN z{QCsa^__b}VfW-jy1&1Pyuv?WjmD4G@5g(fAM^2r zX!y%GzUx8}QB*Qwd#0w-vtG8eeuNJx>Fvj674l@j(`(q{^>Z@v^I_(-a}(e9x3W42yE2whZe8BPFu%_*v}RDR61>>P_W-!n7>q2 zq&|LzAZ>7yMH+sl`^GA=HBW4rqWCA4{vAr<)5UnaMi{<1C?0zkNU{rokI{k7op|im zp?KA_Y501qCrQ(?WA>I=EbNRWbzbJp%qC?q&&lIh!rB0~`?({7CSP{C{ykYc>kSj{ zmjrya1d)WQrGzH`L$Sr5h{KiOJM1YRB@N^&&F!WIcKHr4&mr*62YTj~?#yKsuX_g62ncL@Z8lrk+C~O(p=m zi43~qe-w>;lmc^SYoSinwaC4@3avLRfH|VuVAMPjl!~XJ2NDkL&z4LuXsHJ;@3}Dh z^-FHE-$YPLPDL^o^x&eu05jHIMxI|>kd#9r=y$23nM=C<_Y68!w4=o*bda*+A~bsT zX7svO7G>_;$yJ;taBt=rFi5gQuk!|ClZ63r;rL9Hq9b{hwCjTH3xm+BSEFIOpAD#| ze1w3GZ`?Dv1DxWXgD~@Q0t`1zh3~TyV7a&Z|~H)|PL%lV^8I za={tknaQ!CYrYG9g{^#Gb|~Mq;1IJ`!}NaoJJQX4z|MwZlC)qYOIfE(e#HF4_^vv+ z^}U5W+W3ID8gpdT)OqC5qF#RFyACoulqaG`&SakR5_-9D9vjx_PoMEjm|l8a&{#1+ z&=@vY^xfS<)G;$iY!F!?nv+&3N>o)8?XuStYyR#Q#eVrN>T1ms&6k%K={$(x8$&Y4 z=F~?-Njn%9^%>&wxtlN@^9!X&`~v&8E~QqcQ7kVI_%pHh=+G4}@tC-Ld}v(~QrNx? zWh2S8W6=_R(%yZn!gC>S_GN%by~IFtwQQ%T=G0};`EAE}bH#5g|L#@nzx@(*Za&J4 zTqD?mClhFJ_Ew=b>$)J0NfUiNX2;uw*z+5%5t?H1nKpUEv9-y4WZSDkf?t2Y%hG~T z!l${|xTg}!4$Q}oifi!ie`m0csXMOmlOb37quA&f0<$hSLd`-aFjWmj_Ozvk7Rl@K zkK&T)Q~Qs!QofPMcE+(gDOadyP&fYb%#!HMamThdTS(F6D)jcIEeYE82QLef!Q0$< za#~TBj=QZzRT{Qp-}F9md%7>pfB%y{`Rhm9lqKBy&#t6$dJ_Fm8%v9)Tqj?QzvJJ> zmlL<2#`v9)0!oj0#eqf%w*(Kl$2cW}qBB82dE9mDhg}9BLa4q2g{I)a(>l5?fO|C3Ay6PTx zH0C$=;m$gE@i!Z0uQ>@X>^?xvl^#xB(%B(b`y1{iHG-tTovS-PlXKk{2(zSb!;oYx zIIM}lwnwt}aO{P`U<9i3M*s_&3q#v&*qQMkgb{J``EM&K*ma|Ps;E~-(z^}FF1uQE z+hPQ9YLH@szS)s!FEQD#Cdt`VDB=}=Gs%FlLunSjl2p9w;58D{iPkzrdTo6yrQhsm z%7%|L^0Pp#cIyfAnlJGlEvrN`Lo9^2tPIg5&2*85TChlV>J7n@WQt_YH;A?^=oh+X zHHfT|z6wT@&j_~zB}L#4iF97jMskhcfvZxVqjTj-gjQ@sTlbG+d3n2OSz8)2^|#^; zWGjeKY7*))-h{Z%^-#TYI?_*?M5}HN7jEyFK%=5H_&a_J`OPJ_1dE3Ig42;iQOd2$ zLhP_cCe@HbTAxi}*HjO(2=jp~N%TU(G+H897cSxrJ+g$~vmder>HRF*=@Rh@ilDKQ zefytqDcail3Wu?)IAwJqcDnZnUy#=#ui_{k^YtdGnyHWd?(D$r7C!i;MG5`wE5kM{ z)@IFS^>o$O8mih@Ov8stIET@gzRrrF%0CWJvu8FeIO-+YCaDhHnz;-=*T0Vxl`HUy z;dZ!tYAm++>W%LS{)B3_k{Q;6X{nq*{@uKZCgxru^$oL0LdJc%F~X32S6xWAKHfv8 ze_cX$7`-AE6>DkV)R!dhrXwlU)xx~g5t#Hd5~f|92A;YR!0lg!Htc>xBL6ht=CpX+ z79WpCJ7}T@2}!WD@eRZ|baQp<#=|o!L+~^@VsEnK5ZEWLhQ+GaIq|WxoRdr~_-}84 zvi4hW=`)8CR_P-6s(~`=BO$Cj27+S(;i>a9s0>~NO_wKd`V*@mXZk)kk>Co4{NwOM!F}le2nizdJmjwTgCURz{-f|n)OoLx# zVX*k84OAK#gKqT=xL+B^g^jw*{pnJLL`ko2!B9K&aNTccB^M>y?^CXwxB|C29A5Pv zxBob!3PPi8xc5(jxP&D}U}6*r?Hgv$>!Sul9Y2-sv86E0%mCX7+nm<>0jz=@fgj#sbTaR!Re0rlraZX=^-!F#> zvN~bHkxXlmTamYD)$yCcq2zwS;OIPIRCg9XB4#Vyn_7YtRkq_R4kPf*xP3VAUp~6; z7ENdQgwiqv9lmj|Eg$hto($ab6y`gmq9f)T(6jbKaQgia+8un27hT@U?{YaoV-Aeu zzn$_BE{GL{NQX1Raj)fqcE~3>{gEkYzMo2kL_hYeWEcHG&y$h57X$?^ULH1l2}m70vnttTS%%*_+On(T%z_U2=C$&R|ina97IkD~e?M^X36 zM6`NSD}H!?H`#YBl+GKUL6vUoU}ZuS&7b^}D4&<%Cl7aIhFv){c7FjKGCqYmt^Yt4 z1nQB%uQ51w$W8R%++rf97l>*t58wv3cc|-4CRY78k?@lT(KR%N6e#^e0b|~gfuDy< z7{CHsS?xd{$=a|h^;Yy#VHTS&T}+mM6+J2I+dEx9{l5^|KSf}C(A$zHw@rhl2kEqb(n%ntVg`|yR&IOR>x z;7oWP*D03+wHa#Y^kaLNc(4QNss|#UL_5$oxeK*|7aaN*50kRPU`mfF+%g^rW^ZIr za{eXwH0Lz;v9yIdYUBjn)8$}O&QOSRTMS;3ym`vR4gY%vJ$%j4wbAdu=duy{(3S*m z&Yu7{sRC;b`*W{GrEsEchhg&9UtBd`%H1pY#+6^svwvQKVBO(MT)cZDR~}*k@^X1x zzxHA71t`FjAuqYxe}8ZvucmOv#43>faUQ3pIiCv@EKrK99@iS|1j|gmb9x#X+*hq) znBjhryJ9pL_G#vD1wVFkheNC&Hlc?*8WGPmTuq1X3nba!>Cuoal?fFwzMTKaS>WVS z2!9N_$-8b7{>yn~7JF(D`}9JWnpjv#G_rQwwr)C>JHHqE(@gr~z7g3*hTz$Hy2MiL zFuri{0J=D7Bl)^kogT?A<(quk@RRn-f?Pn)kcX;JARw)%+tdwoO-b+$b>92et})* zOOZSGPGXI%N05H}Cn$gAh{t9)pmEQ$@ix_R5>S^xKXh(lDHe;FsHv9L-c#T!K5pS< z75kaxn(^$~uOn=C!WkC$_aZf!bcmd6R-%=kD$)I6NhI&C4{ke~fW;^7ps3$PsNY)~ zYchQ@Q+g6k8nqBlYoACodmUKo=WOct#h2>zc<~3X*OQbA6ILBEg_6yuNXFZJWY9KG zB26Mu(z=UWba^zwDw*)j%obMI2ZB#$BYD1X1brURL^@S#=;L4sZ+@LL{#*PCWrb8h z%KTo=b;*6Md*B~VLwg-3zs3dJFQmd_`9|nU_kl`dZJ6$^19FRxb2n!UgXR0*K*#<_ zZdBSxC`(j_+t#vZ|BO}et>Z4N)RN}rAKSsT7J0&$`Q9*kUIw@HkOK@TI0^4kHgogy zhy3pu99gvj-g*r}JN7D|7ZS#rkJ(-{>0=5knIS<0jy%Wdr#pf9S7R`^zKa`UlngRk z_i$r=y@Ah@6JXt$`P>heU@%IU!Oa|I1=mOVaf`x#an}kLarRpxq2lLtu5E=n=xq7Q zO>B{LVqAL1O=&p*PV=Q9dvhfOL`FmRZ-Fa2_LfWfR>^7U^>Ey=T_Bpf8Z;NYgjb&p zk^a|k)SUE>JLho)Ha6}D@=g;S`B4GOrw(Ac8lQMy(^b^TD2oo9nuwbmT*&*bPuSLP zDA6?R!@hs)X~h!k0*vv-H=q+bn6OSdh{f%g^gy%fI>jkDoSEP55>rfWLBGO4y>H#V2pb z71H($6nV**ibl`P6|FwjD0*eC%awJGLz;fs7m}SQ;@SHODC@;3%y!DV3$=lw_xG`Sm^MTn|XB?#D`{c7q^aSvi5 zxYe>RIMQ<+#xy5D-j#X zFl*gWZpXWK+^N(lFmcdG$SPO?N9#;rN0B+aS<}SrI90|SZ(= zpd=`~Xeap&V@TNKVpJD6gUss7#pbVrNL$DuY~JvV&L0~|w$3|?hwS}>4_;3q3NJpR zx)qzrrC%+C^K0TO^)?Ze;uV7Hntico;T0C^@bOcV z*~x|RLghLsKCa)2zd2EdAGJXg|}{Y0Ov>f!M_Ch42j z`p%5}Ua;AUDZY$=r?t+AilomzbDRr@&k?ou5b_-HxRjoMzAyHb7;+eWf;5pYQ;_1o_*n zhIK~YIHQT(+>J-NlIJvA7^t002Axx&)6WheDB>IrskO!xL&kt-m@CXpy~lOzo(u!8 zIe^xgX0GX6zJ$r^44M0ixVTVNbXCnB^?PA-zu_>%82z?Cux1{}R8bK9n!>dmiv#n& zn$Y*QoU_(x=59V53i<{kAfj&{^u12xhPDiY+F^SjWT+8{BhAsEL26Jm;pG3G!67N( za5txbo5Zxy_*F9Cd{+~^p5=3WZ`!%4{$Wt#v7g&rA@TRze8Am`cjd^0iSX{g39z@+ zgOhRyOcYOZBmbQP&BjXmQw32l_u*%*TelYO-`9d6AxfZ|kinggyUyJ@RL7NjYd{A? zz~Z=ka6F&M)p;twrHCMq+7JkXR|>H3Ry62aYQp&cI6LpZn*TS9r%g$NG*BriBb@tw zt@o)Ug@~w-S%{1x5y`61plA{eNyw;-QYk`Ylgi4<$Q~ite9zx>fcB=XYA%A*+=kLzg(2V%e`3+pje1Xo2%B$sj=i^|<)8b3+Rq5Z;fvhAX zn*P0@!MA?t$6Wh8qT3P-*$=xebW_6zP9dAUUD=b}YTt|9?z@-$&32{hf|fFM&xL%t z&Sh!F^_Hy0=!%NpHIlcMs+h3qJT8BE7sfQJ61&sbF*@5M7uBDVt;rY3daS9Mrv1D`i zjMTE~ykyqLmY?)%rFJHc{A&0jHf@EBxlPlc<}T)RbiExJ89$C*=xj%qD3y@vp%d`x zl_;|3aUJO`-KT2TuW<9mNZ$3dCeP4Z!1wxIW2YXz-~*JK*+S!o{BvpsH$G#{eu9Mj`@#z`5rFH<(PfEpXuXV(+TNpW_yP2#}+_>!y1dBMj31j;!4eg0`qP<*;e_vN7&XHh zms%F1$5aixF~Edvxz3!%?x4tM0%xcOQ$coBCD zUK@pvihXggSt>@}*n)|Deqi6D`q+MYAiVFj5jW3W4j-qkmu1?gVeC?h-HR@Rw&ol> zYP=GkdIe#L)?vK9=@Nu=dyLkP=fHsXoiK4+kYYA0a8b{Z|M@O@oPWXHdDn64`tLY> zf*A?T5G2g5PS(`p73S#7fc~dOfcB~DxN?>@S$iiO+oIx;Vhll}Z@9l*9+Z_+^qS7m z)~5izjZ$==_MVEjwA4uPUuQh(V1Sp}^bmH8!e0)JID4HkSr;Bn$|5>q_o3Z!Z-5uR zcz++GHin^+@?S(T1+Tx`f^2{xj*B+L`YZ#y_Bsof+StQjn-Ay@ie15#dKj~Z5 z;WDF#+*S-^aUm^CGs%(f?{%BasJTI{>YZrgm_0Oh_F!%{=NnyY;=`(x6X|<%N1hte zj@gWy!$LBeX_wchrJ9Wu>`k*eJ6bu2f4i^6|9vZGqf#7M==LI^GEZG{>*ykaj1_%i ziv7zC^}7W5B@>m0Rtw!j%Y_jR5}i#uOR8Soq&}kuNN+B77h`|F;DJHc=*zzeWZ&d` zjPZ{mhdZ?4`?d$9E_8{=&^o|ZyqP4>D2~^)ohPoha!KCp4rKrLDAHYNDrr@C)rZsC zxUzjCz0+frn2$&F`93+0(&o1Y#Tp%=OA3lfaj={YyqQSG&A3I*WUir1(e3=U z-zU<$_%J$MTufV>E69t3)igO{tvGQsnmwQLiE8J~V@LG7*eml&HZRSFO$xrvF4&l{ z6Rw==&5Yw=?`rs5h@qK1htSVmitzEh05X1B9FDlRf?n&ON~eW?M)RW?L~UauIs7k` zYRE4!YgJF?w5A>RHQvPoc4xD%9?SW&&brL(%^W^2;*DsroyF(5P3C2lU3pKBJaV+~ zCZ?y~N1?b!tzKFP{UVwmYK93bTk(UP&00b?OnR=+Hbcpc=HJkAt~)L+$bv(y8PHR8 z5)RlPVcdY}sJGmb{0Xha$GbOTr=hW^w8$9$JK((O}PE5XukB4XC zmdzIApM@Uz=P#jY$w{0wDH&Hh48v^ici73e9GwUL!*7NC$@O;k&~Uf+f1bgYXG$@* z_Xn(0_@DWQ^~iJ!JED3u9c)hgz!{OhA*$;D?Ag}?U&aLD`(=4J%#YxszMF`Ff(6qq z#t^60CF06U$8qF?AMkFlVi)F>A6ixB;v(w}ik#sSSZm)KLpEK(8MFGKf6G|xvqzsK zE!D-uJ0r2r0|T_O--aWHgrfiLY8-2>f|B`WJiLA$q!~=XuG*WRY{G1qlll${nzK;K z*a8ELbK&!c?f7-tO>yvUofLYf8|PIDKHlQhtY~_F=H}?6&=rDcj|ao(KqDXS99~9K zOFFYRF{O0SYi)M<;afJ#?D=nE!sguKGL!4a>&>Y ztI6br)3Gq3g{f!W-u!X-`5A>CI|;@$1@t(r@Bj z>Z9n8T^Kclz|h0AW>zbo`L|UppE6%sbLcXMojcgB0m^KV^G{mBs;OhsTVnC$JYlON zvE3G3`ew-rlKSQ?8E1A3HwKyzxpsTHah)^i=Tt|#%?}nb|7EOvQ5Nm~aXx#u{3i8r ze@O!;h0?RPwy`^Z%V~W22qtAc=l7FG^IN0z=tbKrq$erI%5SMeFX}q>m{>;IYL1e; z^ke9!(Ec1=j-ZiMGg(0K12(Rpjtw>1z|DF;p?&Z55~&JbV%zNl{PyjxV#$z9(YOB$ zG1;R(kLlfoX@1y2@-95W)%oMe(ZI8KZSFu=r??L(Vik-YY-W4qds%-+pyzb9lH64? z+>pKqg_MkX#hvhGm>fR+JqJqjCZR0Oiro2-jUQ@qvFg1hne#FMCO8_C)f;|*d;C?< z(~82jQ-yfK>Hy9-twv&4Eq49229MeuhK?g^6?>u*)<;_6cGoz}Ta<_8lb4Xz&oAKR zKzCxig|p$>SJJ|+DI&$cpY+1x+-psPvGT3b6odY3%=Q;z}CrI z;rrbbI5_keO2M@dsofDPYn92d6GO1^ttsa8i~)@oZ$W)Q9t5k+f*92U&|$zzrQ8~Nek5dIW1@?x8b(0`yf(2TSe+`96T`?E8V``o^x~wXP#U&oHUt@GZBc?Z0 z&x(fSA3gBMGz-*ETLCWlo}lqs8+r{tAlwbIq*vYcbEDFTsLI+_k(21#$3c4;4; z8nv2Rw+gO|Z+ObZTqz`Bj)Z0Q@~DsFMegeNd|umeVS9G7SY&S_^x8k-FM1eD@{*0x zt0q55-V(y6e}2kbr9;%;HyW#I?XmXeQxYfZgx*^Vh{4qYY52Lv{AjR-D9rxBOeYo4 zGY5{7ljGOmH2owDxL6PS>zkQbbOS#a|B`kzY+!j6YQobsL3FuuNMO-ANjc!Au$wSP zyoMvBYSw3>^3Q`b`=3Yu)++j8-BJENR#&>aeyn&%7Y#M^Es$v)){>&3S=WK17#*VD&SIe5yWRqf{Ya_@OR!bT;EuU;i4P* zY8%7)u)9$6u@X0#-hd_3d*WopllomN7GIQKfx(+bV%1|ybc;EtU|!6@+xjIi+c6Sd zHg>|&1b65$G#p;ozZjM;5q$z)Gsp#AqmL)xQ zJS!fI{3pGxXp$1LBq`=}kjQE)6=^yq|6jwHSDq2f2E_@gWXhweMVUU=y9C;x`9W5XiZr*bD=@4trg@XfqS zkiGQg_FD0I&sP5Lwil(n?vbHxv1H`FA!zw(7iEW|#e)&!q&14Zcyc~RWSOdRqBV)` zd3c!yI=><7dj7(NB7pci;n7FlvP7?VctB-skitWNO?8a+Qi zp;tE1GdEw;h08ee-gurpnsb&W?^R)ONsZL$j{!Y3r;OIum+=Q}{rTOGM~URngM{|n zjALANaqPW+sAAfNUoFFNTd*prX2!V4<{#O(MT73yaDzQ*o6H{$w-b*{mBq7%CfsmU z2tV>i;x{{H@Vjh{H~|}kUU4JSG}yz|KT)C+yNxF?Q*v?f#9D=KV2h`lYf$OPBDSz( z1B={#ke+w^hHu2^3L7!vY(7*ixnZH|4P~EZ!T3^>dk%eMU^NX&c z<9atvb?JyVf5qVR#Aumaz7d|^mV=hV9AV+0x#+t2C7dit#@AQUWVfp>!(y)}Y}aW$ z4l&Qbr5)_>(<#93hd+R&mnZJ*n1g$?UcsKcN~oF^fv%n>@qJkus<_92wtXj@VAqkf zD_MwNhx=l;2d>1&xeQu@ZlU+}LYQ4FaIn=N9DnZ&l%{QitmwHoE32azyXC#e@=M}M zGgQQb7p1H=$(TCSbfZ@a=h2C``?EEv!}yiDAgY%;g=~tOLSLzECx+9KCgolU&NG&+whLDS^S);uIOF9QSxdqmfUX46|wxG*m|s5 zI_WkX|12kUt)8UX#D`?cY_ac2 zBXsZnTTH4q=IQU8c*zSB(K_`Q(b*}(m8gTR!?xh+f0OW3?{qf914PZ={(OM8E1UCa zBRk^k$-gc$=ZcV~wBJQvKwvLY&g*k12~Zp&|=L%RfzX3s0GvxLYhrrqT&^L}W`TkF;N ztcXN9uWS{$pY{On400fvAxDYG`v}R7{jhWXHSBnQ8wU5cqpnIFsO7FwcG~R&ce^`9 zOz#sT4fJyrk>88B)wL**{$&H!~0H>#`uCMGuu?)9^#ndh~7H4J$sSVdnckaP7f;=%UjIo^Atill%$r<6j|H z{R-4=-;5QW8*tV#IqHuohh^)O$eCCt{6v!Q=QQ}wyK0XH=EAcs1+u)F=WzMPaqwJv z62oU^Vxs*vc$`=c$^P2VoPP-CG{@kLT?b%r@GF>9KLB#w0h&tB!Lu!{5Zb&EB!}6! zsG>Js37iN;ckV;&88y&Lc?&zMG|>BgF;09v7~f4whadw-7(Cn%O(Oh3HR%j|4Q+wZ z>kdQdkaDZ&Zdmnqa)zJ*TPkIT->RG{k8Bq+1#hDj42fLoXW>Yd#H5%>es_r#(+u6&?eoB?vEYFLYk5nHLgNbE#e%lwu*nZf+0gZZyTxqb zT20Ap-mB$wV7c@b?RYjLryEiRbT4#x-D&`auT>5$VFO#4@? zaE!8(40GM32@@6640BI@cVLe2YYP$i@7qbA)f61$11a2XNjhJke3FJ8JAlnA5>ZvN z8oup(2TJR{f=s=Lrti;T&%;t^u181qm}KI+0~YA=T@?ez-iBmifG+}e!WWlkGN8A_&J3Ty>lzv@?&`aj5?mE{0nRPxT5181>5uLA(-ei7Vq`l0<$c~z~W(R zVaw9~*tjnn+&z?WNZD$brS%8AswZOb?*xoJ6oWqxtU$fbYya~Mj{7(Q%TkPB_hviH zCy@|jb`f`GalD#*1&n7}VqkR~JQ(ech2P#m=5|{g8G9D~Du0Cct|nL(>5b1S{o(5A z$=KnM6$Yzy!uh$?Fk$2|H1(YT4?V}@&yTl2bCDJ9_t}p3f4YI$Fa{?NEBEIyttgL2KKP<<^L#spSiYVc+l-vecj!`DN9Q(IUKhtX%tZoDHtK<5ovkl*et zD9;!ut*rT?@WGsUxT%cyy;Z~R?LZc`EtkGpJc8Ogr&6coyO@>RELzjNm)86%QE;<5 z@VW$3?jAjZ*A&)M3vn{n~X%~zk+zCO#|Kl;S_6y9MKcTGfhiwVLlJXf;c7$><6 zBGQ#hs?t=Y&tgSfe`)2)RZ{nTs?w=9HR7|YlDxM{NBP@snUYHQR#9}Tk-4m2#}4lv zLROXrk@>URk#}>DNYyv-$X1kM={~-2RvhnscP86(d@t#@^(CHqF$uG;ZzPr2imgdi zEJ?eK`zw&&+9AW_TV5}hD;Ip1`@fwnzq7Pf{xx=u^v^oEvhKb^&1NA#&fVixIP-J33V?InDwec1)y-h7*eqEC2Ddv0CuoK=2kVWI7N z@YNTK*n;^7S;>d7-2U!6cIC!Fdggoz87$Kz`4t;*<@pV`!d;b2vTR3QU0jGYupZ)1 zdeLPCNz{DU6?VTzd-0)un3Vc&iSX_4Sa>UM77a&zrR|=|(rCL8(iM#hB6GoYKBTLv zI1=8I?H_&^ZHHfkzMbwt(77tGR#PTM>tE6B_MOFe7+g#OpAtH3cr8L+$JzkIfXOKuc51=PvcwX z;{SXX{qkfVyq#1F?@Y^}cIibZdDj&iC!(@)ADB4C07E-H zfkP^mkW8<_hm01e(>)KK&$r>0X*XfgfvMo}{sD~W9*oJ2W8e$zj-DE^pzPs=!E+OE z;xQj^tJn`Gl#?JmSrrfU3BajNitJ)m6Euy?0@tr{jIcC74WkSga3xvhQ|bYsFUuhC z@*rILFcB}mGRG>Rj2j)5VYaieBxSqE&-Q=I%VOO4%uZd{_WW54?Z(iPmo@2@H#3R1 zh7QYbt|Fs;XtR{PHdHsSif-1~!5pqN({_C?vK>Kvq!qJ*m{n>Mv+8<~U%a!JYrHJv zi~i>G9>`l_>ZLIX z)>6Ul9QvnvGc7Hlw66Vr(!;%y*dE%>rx^wamQ(Uhj%{8O)ccaP7s3>~kK@g9KW$fD(!OPPx zv(!t^*a%fEZqmz%zmqxeb;~v}?@}dhxobR6ZW+T9-ZjumInT)ATk&MxiyNr*QUm{) zE+Jd8^3fwsp}D?1B|EibBo!IY>2S)}sF5>yK@WAQp`=oz%zG|W!taUM!F#0@J4&UM zkj7--trz zX?<{9+D%xa^%7R$M4AAjO)tRvrDoJF^ug=kEg7!Hc2a<9yKGkqCJ5AI!KgA7>v8LKl)tAmX0f6Mb#gh*ir!OZO*r zk=&b_mNq;Q82el5wKnVsvvJ}pckaj$ad94sa~H|tAdt!@e{ zYZEalwVK`Q{FWRTrtoA>DRQZEuHxtY4=`@@N;WjxhWF%oTr0nbpS}npWzazBM#neO z_H}M@quzhTee?NjbIdu?`sq5w_;+Nr{$6r$Ad6uOyl-bIO8GV)xF$us z@o*ONn;fJih2KO`gpwFNQd1iCxb=QJEJ%?6saY9#J7$%RYd=**d5@Gy{8_{UUosY%%iL0gNh(fG*{Kq5V8P{AKe8 zXT7)pc9t7(`ndsE@yY{+&KeDBi#NitQ$J;N+G89sG8=q%2I0ESz0jQAhSdEtAXEP= zcsT?>+stQh%O?jmdHUh%C8J<|zrGktkNoF789UWdD42T`{KDd)C9euptcPLdzyY}Y ztuFM@(IuDbVsTfo1}1tr=Rp5fJcPs(Jh|{1~rjE1jI79rkKH%uD zj(sO?#WMj9swhn&QH^U=4118GzpZ#^Mgc?GVhq!z8~T z%)ZkM4~Kt&#C$dEcYiw6hV($~qubFp%^II|UJZFk>+yo|4v13H$Kgv?3h#@4lJcz? z+%+a&BzE5-T=ZP|px&`GX`vOhxz|LCUiIJ)XY8i&ORRXvUd3+kN6N4D+0KS|Yw`H( zcRa%LlxXbOQ`E0$+J8gw94zG4U+MkU_Pzq5o-VEDv|qsBR*=* zbeoeKX?pfknw)q_3je!ML@&>0#t+6)59f3;I7piWPU(er5>&{k$QX9x*hyX%UdHQQ z$wY$eCv)z1Tv&%55eC9Z-oEgv_;;v*9oJh(HfPyUj}^fLXLX^kJC+i&Pg>$-jg6#g z>?x+^+~C-A1q(ag$SlpWdEdrd{-Eb2lKwf41V4F?r$ge2W9@1DwPO<|d6|>s!cu%( z)1GcsK0^X`yHf+1tJpoRhCR;O$kHZ8vW|mKGCNBnUgGM^%&ec#_p|Mob8m+m@Ho`0BT$$RZHWEg1_gPL4Qbz;{^fStXnF_7Z9a>f%Jd z9=LyQF5uAlP!_F)y%o>WYf+$rAy&((wVl}NOYd<&NqGk)T34fGn6 z2Ysi?6pzXhR2tU|MQWPxlmCXb`p@CbrmwQ;XG`F%dpvgat%d`+6o*Z2k7`=GVM*o> zI5vHkSeAN5@_g4_?0xx7OdLW*A6r8EZr1 zPyZu6>35PIKWP*(H&mtfYI(wVg|3v5Z6G<0Xm3Brr$Vl?Dn`D#cbhcy=s{s&py>6S zuEY|4Z6X@)cao7^o|E-bBzA5!l`9X*6uOtA#F|JspY>@QNp77?z7Ly;F0slO`TYs* zKCzH3-@lme`|*s6mp0vx|Uo3Ne$FI8mC08;X>F=!fBxlA! z((Jvp+L7r6{)R_`lmY)~D0qM^{fgdJC%TTOLh z4pWWErtGWDE;?*Z1=p@I6Mr&IrPtvHl@swyZXe*xmvVTTHjj?FPR}m zynDdZcPt@~);pn$Z^PqHhLc`v8u7!4hcqGpMES2&uJk&PHdfn_z8N}(JOqmbJM;>p+y^>}ecz3p^^vz=8pS{=L z6&0`nuUu*1_p$V6*)_V*^efwD*MV1_G31{9dVJ5AZc^IsTK2=~64ShA&1&u{anq}D z{MFlb{6GT=llh(G4ja!&rV){nR^)#1uUK80R`E!b?bMb|WU9-1C8x?;ak<>VK25%J z;(WPnn36OnIfE~JKY$r)U!xwW-N+XVCYtNsBwm{(dYXD>8hu;=vqF8 zZ1`SH4$V)%w!RjmD$)QyXsu;q(3>0Q=}Hz2`y}J>*Tf3@r&6%@3`ynOK9H(rDcILMcdQ0$Fn9l@OVjzsUE13sI-m%N=j9)~$kVCzbs@iQxT z^HZb8FpI))vLmb~{>(^2hg~k1lU9koS}Sq%F^U)a*~8A?#UR@^2*Y1mU~@iht9Bfn^ZrQS=e&+x3C-H4kB0 zwFT~-W)Ft$Ww2RU6R)wI|9J*GT$G`8UONcWNrCG(QlZHx8dWN+am;{T*nMgy{H$!J zIEzal3hlAa{j=!QVu`BVt6ubB29GJTm@5jJ+QyE z@PozUhv&!PP4_|2SE0{La8YDDj8s7H+z`kMSMX%~W`enQF7&(Df|qPm$O1nt3{Kq+ z3&wlkH~Y0X?RPF{b&!Kj|GBWB>v2$WX@=xDH_+5i6Z$T4dE5IgJl=RR-zaxvwU+nD zoD_AsTK1MKh}b}892U%zoh9iVmFe()H>vjc&$P(ZlpX3elqHJ&%)RNdu)DmD)fca# z{#7Sw&$VY*d_@`$`0K^*KC=@&+w|p$&M57Cs3q+ysTDX>3ht&um~{HVTj{`~ z8fjR^TKOmoN$xf4kF=|AgJ!lCz7Dc}2_SonIRsQ=+0UQch~ zN@f?>gdw}=$B!Fm#D|`WJmYHmc#}0uN*B$m zB&F*bFf{fyK2Go;O$u*z-Q1pN;IZMCH4>nROcaak%n zQ!R}hK3?i_eTw`}kfU6DdMIzTj+aJ^wh(7$-lqKvZRw8{sU$D^0Q#>@C50m&K+1tY z#=IZ%L0zBo*Ecw`lBJT}-BNI**-&g(-wpFii!grna4a7%8P-3J0j~+|6#Syi5WJt@ z?Um!9{`0{9pDB`q7hamu2hZQh1?K=IoN~nlVjmuaj3)=6!fF|Q^qUIf8q8s47JL$Wf!0M)@XGv-?9GIQ|9J*?*STYn#!~q3X(DN=uZdKKJ=%>m~Z-SJnMJ1S4>hEHWyFf+svv_tDa zeyRZWj-CxOOgo^qivhkHmWHYWa=`VvA)Xu-4W+6t!3T%q&G0H%ROAm2%SS-x3I9NU zdK@%;aKt~~(_n5{I$Rl5f_6InaNe#{P!u``){bX5oLzzuMW?}Ih9^H&zeT|xQ*b91 zwP)w;EZO#@#iY>Jl3ZFQk#5J-$nM>LX>IIw!sS=7?!Jtcw%Jk*MG$YwJu7zYi92fv zA1j79tY`Ya_2|o-AUgcR0OmC&ke&E+h53)3z+cYnB^A=HQgE5JB)b_X>ONG7q%qAx zeSd-&xYScxq?am<%~ZD!TX0_PV)RrhJ~LPpr##_WyWZ1}qqJ$wElXOR*@tw=I!4BK zT1w`9JuO`i-7C&CER|xauJB~PhvaCV!$f6~M1~dgAp;NeBu<4>n9-!kJYbrN*gaT? z)INK~&g@&Fz4HYz#k*KcU3Qi~^PSDV=S7nj@y-;3*HQCFd8DaSnI5$}Dk_%llyquY!U05;ZEJkmbfG2wf(0HR0Ou-75_6|KQ z-9Ir{en7F=SG4r5)MIdxe9)m8@<#tD_PyLAjUFa@e!`F^&?;a7|?q zM4Ib^X}vN02-iV1p9Js|ifo{%;vHw$78qeQ6Gum?D0cW#;YYVrh30bzK53SMQu|}j zdsQK_Yirb_9JJ<beZXX)>RIwq=cM#Qhw&Ga(hIsS;M4u7lh;H(@eu z4_4{!pyzsroy=91!t4|HR*hl&P(&+rja*Bk&gGB|VY7*=Ooz;zago*y{zClJ`jO%N z=dsG6U07_OjiSpvimjL!#)@sXi>a0~Sa8BQI^@wCy1Tx+qMvpg6MK;xCgiiSnRZgf zkFiommt$f=sV9HqI8dZ8KVh@pNOW?#Bn1voFsOq~?Q1V;+qcb*lfO%ikTPr6iZxeL zS&x$4RB7@IGABHjEcbj(`i#9r=6aV&C4O^-IGHV$n;c?Y6>QPiDORNUiUXn%;6&%c zn0a_DbE=HsZcz%(=t*~eu1`EapWIG-c;G5tr*0O@hn{Bde}yoEEeV)@&4)J44W-%J zHxl)GyUD=MgQQTn`8_UlIn{4T=35Azh7>0(8;slQ^UCzff>`pvw13=n&*dWaWu>&2^6 zR(#3i3@+2~;|I<-bFCmX-d|lqWTsuAW3p?At5FyYQI+Ts%N#N~HJgOTFC#Yd4q?@A zOH33G(}-;PYvV^^9q@;|ouo!%wh{iU;)2-4%X!a1uFRm@MPhqPiPXp3 zh2-PK;D0X=*Xu6Dci;cQO8Y%- zY>0^klN~CMwXH(YOFJC1UZ`MdNqg*`*b8&UEP}SuKBzPXvA@>_SYzjc9#L7CbZ9>W zY%%!HGiY}w9`cmbal6?a@JVrkz||ZkXcxe>^*Zo;t|6R1w-+9C83l*$9+yqseH#W; zSIROcu7nTQhC=1-T$!$3BJ`N@6&%urg3-}+aPGo2xE8w!GAqkvE%Vi(Wg*AssX;K+ zcNlnW`w3xXsqk~+16gvg}9?~W9Z_q_od(F`5? zszGdmGnR+{1et6rWUU?rhrHe3Lc=`vdH5&sa?M*F)w8>>06msFu7%dgy3hzk*4O01 zJ`(?T7aKHc2@O57joOa!<)P`}ydkY4U$A!@H@Mu6pRo56=f`XCog<>?@%_u_<(&`d zk)_Az;a|3FZ~t{H)#(W@x+KKGmfd{adJBH`;wql_=m&SZahuCO#!B`6K~iDvM|st& zMERhDK5|pfQPN89J)%i3lwDo?l79Z4ODbRgCCklXiND`w64R(5zq4+*=rFxVtoG*I z^2|<>9@v%CmMXeUOE%$^8G%Sbr?KfHhx4Ut?09U!0zU8HdOmrBs<^b>KrFUZbhm6s zVQa_Ur{y*ld!Hiy{^B|@wqXNHF1p4Vx*nxh z9zIpDbf(bK**4^u=Vo#!;TtxWbteHj+o@pfEDZ0LC@tf_>I_nE9(K%)b+< zxCbtU&MQXC{)sGz{?QDJ&3}M?(g3X6Odxc=61p5)0@a%%;F;HPxH3!!$L}-6H`jj3 zZ2vBS$b-wF+mjoxW^gs&%P*iAuo@U@WmgL*wX(KALR#zg9Z5oe3+M`<0EH+Kq>Qj_1)IHH7z@U+mzN zY0NNZCilH&$xphDlPpXkCC}L_<>SUj$j1!WCCwkaQR<$uN5nara(&&O^t2kKdp9m8 zA5YvN=d*Hg+^;(6;MeJ*i-J8&mNl@!?ab+cze9+nr8;@Bx*Th_ABGoON3k*1UAW%W zQQYy6E*}u&&(G&-ipIC|gdU6tz zbu?yCw<5_ohf*@^_c|IiG+fcS_KrC(%IEzCj}RvcZwY?=nONkgDGWXj5%o;bZ>8H? zOx9`T>)v1Djh!R7j-vtZlCqs9-Tpw5mEKa7@C?#au0yuYh=;vuKTy5Cfxf;Me40IiDn#*qCuV1 z__d)U_-tu2?{2`vgFly9?dl*lI@pr8uJ+{*{9>e+e=MZb%$-uwvv}$7i8Z3d(M<|! z8zXFb?qMSyekN09X_4ja%*ePMSMXxUNkzA-o3u{jDfbZ*#Xa|Se8FQyUwf)1x%I>e z-}f{@`JgwD@whJ=Jky1LXpcO2SQ~$L^CV9h^;=l~_$H2AJt?-my20+g4`sWZHX^ku zA)$M6NvuVC`Y4%@t9>u9m`yXdU%Vk-kUWK3OloD3_apeqyOV@=pOvDAy9qylR?K0+ zB4*vLk)C|4U@oOMQFmi&=5;QLe!kj7wjW6$V?X>RDV<&TwIRP*<;^dAW!hnWewd}` z5mzs|4sGIlUw-BL`>2RW%w*?l)Wz5FUAesXE^c`GJ~JsvqRoYA^!ksk%<_u}^{b|s-^DMZP z9|3Ne!C*Gxr>x(v*RtLdJmA}i74Yr58T{_m2irQ7z)ar;C@en)B^|sW;A<*Oh}{d9 zPd|Vq8V7*RUkW=TrT?tS49`0z`}eJ{f`hFC5nGbME%!1^tnr7zy*~_^@T3Rm-%W@9 zF(<(L{SFA(a}Eyf@rDhvTp+jXC}<}>f;Tofvg3vKWH(R01XH^jh1akW=G~5l3z}+J zx9BGV}~flx0Q@f-vcljr@?YE$DU}g=gBa;QGyq%w!7dqIr)+TE16&pF^}JW;9j5HJhre zJHQJ^+wq}er}Ixodhj*cU3tXwu_AnjA`YG#@~E&9z|eH)nC%#vSr$XUE!~(NfgWwH=dx zF*lQsS=-Y-UOq`4I(wGfP`y!JqJX^K3>YB4*t}NSJpx4S#q;#@lUywHx=YeBUCGJ9 z<7A7a4xjv|zoa(6R_IRlX46)!C0e^nP-)2vTsq7iJD1wxyYvk>wuc%{@p=XiR?Wc` zLyU0!fDTyN^M!2K$MF!_^Q&yF_e&X=KasU-Ns^Ua@`bG-g|d%tgW>$3P^j3u0~Q}^ zhMhBwFg42-0;lW;@wft0C0w@f=-~vu5OF-@6qyIdEbv6%W7c1t%o7wqbD_aBO zQZnJ}`SsA{x=eO&=&Ap4cBX$deq9)Eo<~U&6_paAd*6HSd)%j#sX_`Rq(TyzB1uBC zG)twFiinb-3}t9Eg`~_gWsWi=GCk*C_&w*{d2?Qz&sk@!d#&rbzTkA`LU8`263`GS zFg!O3JUr2WSoS=KT9XJ^6kM?7T1pG~d|({vDI*+wwMnNEbb+ ze?t{yo~@yLg(9#)z7A9>TmkjJM^J`0#(|riN5LZZ>G+wl$SO3xV$7EL<0zjLq_o2Y z^6BTmvZ&GY;@tUg`ozJ^D7jRa=XeIns|3P)S535O`#dt?ve5p zZ1-M3cRL`e8ditC*H~U?PKOt+B?QGX)a^DU>*+7B+TmD3HarpG-i?_!IT`jFOD2EQ1AqUq?JH}RVSDA2| zw~Vupi=(|6`0-OcZ6Lj^ZXT&Xf7a=w#&nOvCoVn1G8fyRT+JC2`Lz}^)BADP9UZ1r zIuomgPsfWdOhT!74q)Yse{e?qBy?LH6gtve2omauk7VkC8(5t7gvXrqg zT@j#VKyY2+9^K=+;518b5;;?1!`*%=8D!ujQ_nC9szcptsW&Hc8N z-?Ha6AFAabD9@h8C*3*7{gaM&+YeQ9o@17A!!NcmH+Nry4oPyb^`$&IaK!+gsdAx{ zYrOG*Q5fsvF~B?k?zl*AFubX(0Aorz=*5~#z^>I!^hG@ zpwHCU-reBai{W5X*+P&pb~2b|aFVM3^M#5X8uWkHpmB#g=+T)DR+~u~E6Fp#;A7Lk zLM#9WzkbTIU<24UWF&A8`%3LXvw?NRb;_;#2>2=ch1xx11Mu&C228mS5dX&=d=LEx zuHMT6GiK_5qGnCHDn@F0*%$|sd-sCInR9@Oy)O7I^(NXEo}qLvtp#76ou!&?o~Npu zdO+E<0MLJV6>tro2#S8%12DaidKWeVjMzCBG&DU0p#eeQVBksM+gk+Iaznv)Uw6>% z7mJ>4D`#}x{=<4bqwuTWX{bA36fBqK&(sCebkguJXgF*?UJ|ty9=z`*&65}hyX$Ac z_Z2_iq4v4FOuulW; zN_&C398bYPZ`MGKv@!T&(je?A$;5Fv<;=gAv+$+O3(yU@bdVdl9Y!gn!yhk)Lu6G4 zkI|mY#E)96`a&nxZc_*|?iOHfaW^nkrp;WqFYR|eZ_zqB3k91zgkw6jP{d4EWReqx z7KK=&!1vq{4e(d+*E{5L^<7-lm zy?V<|Jl6gn@?UWmKTj2~^XGR+c9bcc%Be!_mBZlf=@4diRl+Bz5j1YwMR({f#Ie zaGxH!c5nl1rf z=n2b?gRj#M0gIScuzQjS?wDN#ZPGxQ_4WpfF@xdO=A@C%%mYEt^!Dk#PECxMu7 z7`RGx+pkqFfm?@NL7;~SDj%+)`m$D07bbUs9ggO}Y^V${+Ghu}N7YeLUS`1F%kTfL z!N(5a;L}`Va9VLbh#2${R9JLU_QsW9_WGS*o*f0oRWsmm{Z`8Uo*&SPvI3D!>0tTJ z?I3X4EZ{urCHPw(3SJpI0Y`T)&@fsZoQ<0at|ZFP?>@GGltu3VnNkE2Yaf8v=Y|00 z9tStDHF*0Cg0`9q)J~I5O3TiKe(WX-;&)61TH6l--RY{*8%6}BC}Bb0yWi4WVL!kq zUZbu(SE0k$V(|N126((p4+vHVVABZ|CO$9&U)RpX9xCN%m+c8?b8jE5vq`F{7!wO? z*>kvdt`m&srof%@3cU7kFq*x5HjbSijLf6oGQ+V{)%#crUAv)%N?smDm(Qo5 zkH`#bDK5u(2aT8uB~{E_aUBySSB+0LO~kdsVi_feSmtGE8S}bvDtmsp5qF8@*!nFr zY)#c+DCTNFE4y1N*X_7cUm+(It7zv+ci z|IEc$3%dM0MQc|W(?jzu@I3z)xH)7d8gQSEj5T)P(&#Q68s>pZUY9a&=}j1)w@3Cp zMzrVk?eO>4ORyj>6K*ja2WQMoWp3_>VQ0Mg!k9EpWL(C*!buhVsNKi|nJvsh&y?rG z0&giJbJH*SeDqm5y+Hx?JQ`2WTTj6!r{B}x2cMwr-{(NIe7jS*$}VdF`S@RvX}_vsmWu<`S;n^f$kM^K8D-<2>iGW(jZEsKJ|F8qSxk zoXPL}*v-j(o56dGox%5aPGUV76Gr^@1*Q-E1E;M>qlM-S`dE`SeeRWjWxsW@T}63} zMbv2I{9zH)&WWL$-%X}}_LVR@a^eF@I5{gJoHQeAKJHppYsZ-*$Wz}YVBiGO5h7> z=%+6rI^-txaAOH5@VrVjw1{Ab+2sGb2CXmy#;lA1pAv_I+~qyM2Y7)p6>l(mu_eff zxJ=zz{{^U>p9!uhYJcV2gq& zaMGFub}u#nTkj=+vuU~1kiJN8^OYM={9pvuYt{hy*|WfuS5=e~Jq(PGek%1l%>$)( zVt~Tt$-u9%gxbl=fqKPaN>R|Gew%rij`0Bo;6|k%UN`fT7yTd(N`k#HD2MsftqI;lge+Zo{=BLimms_pn* zQvrTaJcFH*tH~PfkY}#1I>{7#DZ;@PS761&5?Z_48mWpGP{Nfu z0c{^5cu2PnT5f!W=ABx=)jnh}@2ZRKGCgp^5+~GSqm4pto1+?c2CZ<+#X~ioqrE-* zvCS_h?5J(cw+s zj1;a2<$SU3Ab!7=G5;m;q14MehQFJi#OEf+^9^#9T-2@{?xyudZs$~idGYr?Y}i2H zE#q9M%KF0Z_CECVay@29^*YWZ>@xFgK`5H?v4ej4K!-jxd?)=VUyha!cL&2h=z{Mt zlY#H`{h-;q6l{HR9*{3Xz-+I2D$r#T*faP!*!nXOBy=`X5kdCgwN3)SM*vt?Hvv@Y zEu?%cJOMVYqLge-QtNhEfh|%^vvQd_eaPW5^|4nAbiVyabth(nGZwr5?;7MD*@8Hw zVDNsr4ZxCnfUCMq$?=|G&Vw~T<1qu?EJy$bX7ymqtai|Cb_%G{3xW2~d(;*G5ui0Z zli~;MqmovpgK4cwKpbGfXXpaThn}UzxA}rq2kb$WdpOYECVh@I{X;!1iU!~a0a>oI zfCioi)StCdX=Y34msduBC2OUbQ6aOy%rbWXjvE2%y5m&Dlz8yexR+W}UJu?#p9yc? z-UF5_&jWV;qrl(_RhaABhqit=46AZyp|QPbko=COFMKnnJE#OjCX~= zb(Ik2kR66Or6V=CniLu$t(r1GsDO&%W)^L*M-{k?dsKgwI` z4_L~`4@qU#l*KcKJOANh4Z(QEi9B3e-;e){%w)O^!kCGBZ!&dV6PQ%pag6oQN@liI z2xBXmhFgY~(8d90f#)0-`p3ZlT5$hJpH7xz^Ho0Lb)g)d{zMT4^k>nD$$vqz#$YhJ zzYPpoy9T^Z5b+ReUnc1296VFK9=oqfWW&Atn9QAp%#+?~=I6J6__*maq%dbDoYwag zRXk6?-&QWha-S2>Ij)=SSf|VuF#Fm1U3Sde@2AnLj_sInAB{8)8Da(Q1T5yuz#-c> zP<~pLK5)%X>R(+!i~28U<@d_4yYU5m=_&^`JkKLrr+U`xTPEuANJR-ojp+0P2b8p~ z9PgJ&LrduuD7NqdzM`9iS(}ge*Nb?Z{o(@(`k;<8rpv$&oBq&AbM@%V4Rt`TAe4^1 zvjhh4TyREu9W#2;Rc>QQKcBzpK0kkkEdON41MbeB;e14T9#@{G$M5a`%ay!( z&qZlY;X)h*F6G}E#@VIQKa6deMa^ zNNrVklZ&2oK_p4(qBMOSKdI4zNiL%GHby!X|}H3gf+lK zUlCkxiU(@1Q^CBRGEkxF0s2-;btkRgDWxcXkh8Im`bEh~-v@!G@dn`et$gZBl{-jy z>;wXul|bta_W!QI*5!!GT!z8S9C@GC;{(JxwJ;HJFaxZ>+y`e2SdbhbB!jhY2er{o?T{v;WCb!~-$`+g=r*b??{ z*#wiGQ|QX=UC5&809rlT3`dL~!6e)@WZeRuFllkqn2Bc5IQv^KGNaPb&u)D@L3x@8aW~%{d2c&;{Rf5&l6S0Z;R%Rt_QqU?JcMEO4abwe|zx~qrp;ddnPi!s>Xg_`JC08Kb}=q4Pmrh6L9dO z**Mjv8B@K|d%XT*c+2W8J?r@ma8;ontUPgmemQ0vZTxl~t^ZpdUd=oV#}(K>s&*DC zYTLy|D~(}VFn`g1%Bow;$9;eX7w~re0;PlTIl1B zCiX3a_s2^0iPC&Q#||@k?~`b{Nwu0X{4@!a{T_QJ5VUfCV2f5R}Q_WCTOCgm;kdc=Xkal668S+hW%!A{WQDeVs-wczG~nV@{!HgIl> zDR^_fliHm>5tw){0k_vBgUu!Vlww*SwJ_x|f5k0)F&AT&YikQ zO_eXBo^2jR{k~I5UC%WFVSS4M9g2Y7hISWv!E6U;`gAT!bgghnTTMG1w}pBxJi;+#x5P5nk)sw$(Beuq-@(+nzla}c-} z83WAe2o#&Pkh$}w7`aWojqsf;_%6VQ{#TJq>pxJ3<{8m&MNtZl9etPn5jPAzi>Ri* zwPwJy_ogr*dki${`%FI#NMNYm-g1eTQ>mHexG__vrXG zng;28K<4&4;MQ>qm@B@gpY3|c>E8)@U$I-|2;V7-U9BG!0!u`@LKY8^4>}zR?^p@+=f4W;x-^T&;=de9$ zd7^-~8zFAixf-_Wi4t2!cj2YZe{rKl3$~4wWlEfSn3{|g=x6*JT3Oi|%H~(n>OHri zPOmxavU7vUv2FCKBYU9FZ8_+>iALvpOxZ`qj~OGA5@yoaO;W8bo6 z5X*JZonGzq*^Qa_iSsw~_TDkr{5ly1zI29Ea}<4}E1BLI9YmLG@uzj~4Fz(etU&vM zad>ysQ^w77EEg5T3dY$wcj`|FK+rf#vmA@W8IXs`At}4gd zT6HsXf9jxpN4G(DFdJ%gD?=*Bm$nW$hpp{WSXGzRjI#a!3dlW5&$ItTbq6c47I$p*PE8E|S-6~(Kmf{s0Xlxlk?B|L#Z zKe(6jjJQvkaNgjI(>Cc${gz592?DnV52y4FtAR1MWWj^Xqu{jDUrJ})Qc#eTLuqu! z{@*ot>E&)XA=8v@aFgoBUhJhCZAbRUbFhng6>=F&=&VkIV_ZD#$_LW9 zrBY4a94orhp$s%_SEXB$GT{yNM{xS;VzlX$A-nmKAHT#C3uSM9@|7n|grj0MuV&K3 zRj+u-O-ze*j_NtOPV;s+Ht8Tay>5fJ z_hYi~!Np0u4rYq*!#2_JqMqOl2aC5y^8CH4J-mVHb3s}2CtvY7NSLv2x?nna3LEaQ zlMgCx<$2vcmg@~;$`ZD5ovB&;?8VCk^`>-CJkmo6_nb=Kjr zLknLNe2Jf+af(};s?Upg>-mCkeX+224ZkmFG{1gbmZ)0VAY4cpE*_Pr3xkIB2;Ezb zawa81_-7Awxvk@z+3*I$+?#%oHP;*>OfS(87pt;l@91kp=E^EbMPUb-d~cK3^kxpP z5Y)&!%xmD{T{MI&+gib5j3-~` zUmP>}hWPOKY;o=sQDBo;`> z7-$qecn=fy*zFg7SmuxskB<=FBMxNBfn#D{o*Dl|rBqlwPf7gob-Cyh>Mpo>`H8Iu z9L0&rSls%vP}uXXiT^NPPxxoJm@gR{Bg8nlF-sa=un$XbvQM4|aUY{La6dPx@t?jg z=C3_Y=FiwCADu7H^}dW`udlttWW6|mmzfV@R=@jz zS9f`#rbX`9t^OplV9R>0bU`iarG&Uvwi~-W?Lo>`=kW*W0jbu*7h7+ijl;v68OK4T z=*Pl4I3YO&22jpac;-te6pcXIsRUA<*0}P{68NIOm7bq47>gjGuZ^x|uV&^u2H z`W4KBzhCWxWm|61ai3-2p;Iz2_P}eH{`&<;x_ya0oLEVF*EZ30#e=|Kx0e5u@AO%D z4ISNoj8W(*@8DAE z;j=N|(!vg4b7nU^=F&Kr_L`u)D}$J>p~Lvap-SQilhwlLh!(EDr~Wt)+Q=HxphVb_4HmsD#xQ4fxhvGrsEX z6jq$_o0%771*fByqc z+vX8hJ*bJV@b=_aTCL$HmR_mSeVNg}+aKzv6Q zh_Rm1e5irN{QN)O!dBBbw)JiqYje99Os+AJI-Bt?ev_|g?VwlS4Y zP5r?yDOpQ2Hs_FaYTv~-z9nMxauxo3N2$f9+e#hDz zq1x%ZU^}Ii?^e#_FUcDTqta&ZvtF*}ikGivsP8m;Y4TVcdSA*goobBDbO1i3Hx$28 zQD-hNt*lMcCU)JlwXF5r-T30695f+v1a4l_ipvjn<176mm|-mnZ050Oterms*I&Ot zFAC8H^XF`a4Qva&%UBbtUP+SPjmN@s@dj#$2j`O`Vn-z34}YJslk)0tf29a zOt`7;2e_&A1^jT7g<*bs;ml$K+WF8%s30M*`)m>Xi_$^;^Yi~nJF4F~7))f2!9=6O zv|q_}`bLWq3^cYx4)*P|%D=DlVT-3=Rm2O}+w*`nZZ(Igyb{#9_L|Oa%cd`_{Q{<# zZv>+x)>2(vJhfr33DtE%gMMtLLSMeJj0z6Ovj6f~1H5RW!K9JS;98o^_~g>>RK|EcoIfP zzn@@e9>%Dtk71@b=`fOVL#AL&i8yP_LdPMga~+OPN+p@&h}4l2Cl>sIWyNPl*I4< z6vb#-MU-_OD*mM$#TYLev8h>0TpO4qcvi>=a$!8Vc)wgY+;vVolsQ72B7WryD~|Kc z2g%=&J^)O8hLk z?X4BlG*rpQx;J80@K14kwhXbzmnTCHe-IU(b&KC0TofZ@YlMTDOT{}I62h`!9CgT__UYWsC*_Lnvt&`?AVec}SmKbgWi4RWx%jKG9D@gVQ;Slal3 zAM|Y71--ki;m9GT$k%8(O!B-7QJV}bYl`|$eeiMKed?}MW1_#%0!^6E2Fp}qpw8KA zs78JxeZ6WCoRBaH4%V20s*_D&>ikGZiNP>3%LGoSE}2 zyZa>*=N2Pot#Bo+>_^h?RYPnx?jnJid1PPsP7>i=L2|Fhk{_kgS!tgUdw2I`rm^ZJ zHovPX)i_=j#@_$wuzu=ciKAHvxwmbJ@VCE;Po0%7#2JXhDma^bEZ$3cb27=B?4?9c z4U-{p*2HV9IT@F1N2(KPVo=Nw%R@$Fb*vhh9VJ6nB*>CEdwWIOms-T7e+0Q2H-fCH z9YJ(mhm&QVwj|94lG`IjksnvINj+yw9{;f*N5%{x&Sme#Ux5|k_}8K04r7T}(ME|q zXR5^pxr?IEyF&DPQ6SnFxbc4J-fWYLKYk4Q@QtUJakKP>UJZJfg<=^`^-kmEf0~JZ z7hV+CJv~UmcdsH79~>t-s%OY0t39M=?RGM3d@xZBTS%zvNn}Ly4Dvl}BN65%5ufB8 z#P0S+@_JjHSU=Z8uu9%1eBOSH4-9=TP!@H3dV(uI;nxBF^b<=ysBsu`%5)CST=5H5 z7SChGOp`Lj@8681Wnx#E1S!;mP#nLe{8wZmz*_ z{=(d)Tx4ezx9G9HaCqcPen7W`cd3rz^KriryWuJEAg@Vd*GaN?_(kHGc#8PltR!A` zh2+Y_Xd=E^K+=<)h(_2GvHPYHvFiUNE(`Dz&o9dp?TggJ6DmsLyj|^rs&^T;{fG&7 zTi2d52%O7yMk1yBIVLdUBndkuEvk&#G`-zI&kl`VCIb5V5xpJ zjT!3o0{1W3g@0vFV3}N(E-s4uGNF6r3PQrTly)bbo9Eygl#;N&-2wfym*9o!@A` z&=}~LABe`5HT@?6xhqXfi;xTUuj5r14m#)?ZM>qoAT zO!S#8>38;)oH;#BVx2QlVnAZauQh|jjh(02xX*yC?VZ8&J^O^xM@WRsvoQ`kKK~_U zBcF(^D-mB%-@vz2EEdDY9+#+GQ*v07-XZB+Qy}S3^pos1u#>1nnn_-dGLrNuSxR20 zSV+WMW)h9p@{)t-8F{2sORlGvlSgCsld+Dq1Yf#JfL#mut58cOha4h7eaFe06F11O zLk-09bS>F>u7$K_-6lU~G?9HtiKIrwjL5Vpkb~-9#5-B?8XGwK7{Azhta<8Mo&^R{3}V;e@?uHG!fs4SIL!tZZdY4j3nPrTcQ*Cjqqay(sxZq zIP)f+FZt;vsE2Cv9qkV|>7rJ+;j*8P8)wetYkk7*H7PjCWh2^lyMnzNRLfU(8W6_k zkmT+4a*3DaCW&$F7|EZSOrqFVEDYM;#%+^%#!We3$oqm6Zol6gzQ`8+f{GRmWv;Bh%jiB>#w?tW%VY&4GK!)G^K*&~ zbHR|u19$(>B^j%Lol+ugTYCbihQFeX7R{tVhMAPx)L+;A5EX_eN^lJn@{5*;jArh@*9 zhvIuqK5eae4%r(fpudq@;h?y5^x4D+pQ~0z^*9_AMiTnQ?PqBJ=Q4U`c_i9)gNL1~ zq#1mwYB0C7o<4JHBpp|hMMrsOfD>~0;Cam{Fw!9rm@n-FQ)67|zsCE)+)@`hTHchF zo8CbO?>R@)-rMQd_$QPL$D~Ntdu1-pT85mB4tUi^tX!^{vz+gE|YiS zUQ(d5iiB-*BcB(!5S4F!#Od-9GD~F{IYT*;iL4Ph6J<9AGlr-AahKP8y!F9sF0ttmH~QH;ZteQ5V#Gva;i7hx81=wOa(@<)B*uLp7W1!? zsz*DClQhKZ-o{B}U!M)>P(!5G%9|WJzko=V#E^w2yh!W8v*HtO1n;>?}-p2PP zyIFq_x4>MwQ+klZCw)1|%*%+v*JjPcL-zV(ZrVO>g=UF>E@==?hiFNF-W18}(Ql=_ zDTi47Xcxb|)e!Ea9OctHhVhl5y8QeR=O6Kt`UCa-4|;Lb-CN8L%H9pUa%LQ^Q=!^2eR}Yh41PkeCn40 zPH#$kv_-t8HiU0z8=si7ZpPb3JposgkMe9mk{;jl;?NMYK%@ z(Nwh_OdnfEV@C*;1}W0b?_EH|&`R;h_?dWQ3sin%C3#dTjTf5LOhi%C1hLmUgA6{E!Pr!@Mzd-Xf z<#1$b{h*cnXYEoV_q>%v{@X1+?K>^b9d}+lySqx%A-UrIv&rI}T3u4G zzJ^~{?Z+Xa?Lqh zVmeh#^3i-RiT^8*>S2oH?l?uVXYw;~{$d5PwD6^9;@B;&2tFZx*_AHdtr{cNK2a8L zI}8?IO&Ki?>@yNIq#K*j_b&_J!&<@KFGg4~`@PUs(k7gmqa+6B4-+r09V;epu@ZF( zvxF%YEBNONKl0x0w2-+13TyXm6djgv#Jeh+*jacIjScOb`7KlC&CU$`uWb@mstZTq zp|*_t4J&T-lul;3bhn~;uSGz^Dg?QeUxnPB$K>=Yb;4;UiPn?jMO$TCae7~+Ah9kK z*0}5xd_J8OK5l<2SVvqJTF$%_PP{lR1eHw^-Xvu4THA}b8R@2c+n`#ud0P&44b~D8 zL#FT#Ph7``UJal&HA5Ux7lCyqsq&+8P6(tP{+&1*wS;Q-jY{CPL3(>jTI!uU~ z9NT~tnW)*jv5x5;=J8ZbCTSSOuyiCN7plTe$<|}kf~t^P(J@5NF{K@R?@9S38t_r% zWBR`CAG&OQC#dyLgjOBRFwx)$bfGg4=f4jI4Vgt}3pFs=xB#KXwGi?Hbj$cEnCI{o zuKla9Kq$+B6>iJKz=I*1-9MM;aoQOLbO^oUMC8yBcUEz4r)y?i14`9~bwlTGL!zZTLtr3SFjK9P>T z8A)s18w7uc2hl;(FVU^v{a{Sjc-kU_hBxz7VEWgS&{b{^Z2p=Bjc$c98m6b1%#)M( z=!3h6u5UM~NmwDag%1`xR9_1%G0LLDiP)mW$R2E_-P`EOP7D9Sy!KZPk5E$hw53wjns{5Gdi_K$~;5BF8p%0OX*e`o8Gkt3tH{i{&C#$Y--x3OV zKgm2{jejFQ1SE3>%;o5ncu@q15Rdc z6L&B&fqN7l&uLcz&O+ga5NoL}cwM>8)u;XxeEieNSk+=u+gCuk4`-5JWog9z?E&&y zeIH4U+DR^)N+yN}Cy*@-^Tgbko1*FOC&HLeRq@yaMS|MhL_6a*Qh)t0@soZucYos^ zcKZ@@#(3bN)W>oKzkgJW{&sF-x)0amV?%f1@E0O8c+W{@@#hG9R`DD&sb~=McXc+d zem$RQwrXaGk1RV7umhX-yhrhF%6QG(7`mY0D1CeFR_J=y0&bdPfMk9jg&xPG462td zP}@-|Z8p(Ir0fPt-r5DdmL7p>Z&H!#?#)Pkh8vs-?9u9ryHS#V7*3h#j`z+Uhlez$ zBOfXkz0$gbt{t2CpZeg7XSwKeO$j!SFhM0TKhc&czvyn$FUZU*9jzP_jeh=%z>B^a zqY;bjaaqA96u@|(Tj$eJ>Aq|@=SmhjY7!4m`(2jW!keJJV;SU^mcxM3N*L!Ug!THpDLB6}=SPS6}^RB%Vja;yp-w%e8o@?&J zaK?6i&Wasu8dPFG-cRC^_3VjB>IY%_+%B<^_9R)yR+B+{oXGJ3S7Ls49+~xJDe<|v zk=#2NNe=Xckq6!5$+GuKMAzY$SgPD0CKTn0SIzf|auproh1(CsEX8Kg-M?NuRZuRD ztE>_4BpZ_oQx8IgE+R($D@nkhNTR?$5;yc)i7P#i3x8z`g#6(x!nIKg?K347OH z6pFTgW`7Sqg=cSh#Ym=Z#esQ_46(6b6Z6*c`(M7|&Q<+KKEUf9V~>riJO;uff_5G%+#L4)B)b7vD8TQy4rf zKr(m56G>pvY>9?^Dshq;3w(?ob3RiuxC?{ZIVB5yesI%A&SmUMe%Z4We(I=8?Ci-c zoP9UopUy*EhB(Az6Cl*Nlib=#*jE@>Dk~b|vc;!j%pvP|Jq(LxC+018GbXPMe zgA1ULfheAsXpl4R_Wlp=BBi(RVdlOb<85 z6`HZ=PuE=}Gwe6IHP{c`jfg?EOJ||R)5X}cE&BWF(SNGJ zhcZccz&Z|_0Uzvo>lfOU_mwXE1u?VmH)8LdM_xCh@!oX=yEtvfPlpb{JGvFH^S+}f zGP)Bce;z=uzU+WbzZarpne%Xrn=D$v3_&ZU#2fmk3M%e83KOoHqnuR(F!ezv{Jq&9 zjgDr~&QC{B{Nd4f$HtkAZeI?2$fuQW-dIU?pD87CmZeDsC-0TaJ#s1(tddwHosc+Not9{?X_Pp8YL?WpjgmXn`H}-B zL{cVvA_KN($!%0hUTYd&Xdv44M;Jp1ZMZX}Fhv3v%bH)Ra> zc4HlruM3&Y1|{r=7Y;nFd7hW-p1`hBPvF%`3H=cd&L@;;{MeJxRl- z)1=e>lW=O?Fn+MJ8keJek((Bh$a{IL=2F(r12rOD5W7W>IQoF=_bCdtBU`~o8tp@ zs@TEC7){|9;qe2-Fv3-u;&6R7^Je2`7@4}5>GN5IYF$qvnMtAlsRmDV>0?8$P+Z;~ zjMMZ~@PogQHWg?ZejhP^ z&cY=_ED{PbM<`R-{7mTy%VTQ~VYGRgA2*AeXO15%u+rL}Te!B7aFk;u{`9 zmfvs`ZN?ajX~|k*L~ep;6#APuKE5LP_pweAN?jsDp6z3`GUjk|}MhOFQ^WfrGolh4KZDRO5%tmJ2S43)e-Unn^dah>?}29YPWW~Aq(3>n_3 zNT?1aVt;u$neVuSWMpq8Q;#PTx5{f`dUc#|b=WrUpn)^{qizBBv>=Xowc4BYSf-j>POM)cv;?i?E8w3UJLoEU1g9Gd>UQeScE#RETNTV zU7|l#U8YULHDQ6R3Jkw`0Nl?zPw$*kL_6M=f$`KS`i(S)^nF7TyfniT#ujabv2q!> z@W&afX|sj5%Z?%+)C0+eXYwR)oCCRaGMen@&mg-7JCZlk!w7wNK$xJW#EvvSkB`Ot zWPVR^Vh&$hh>9FWi$2RK;o50NR6jPEAAKQ-Q-52;o;qH_CA^VHez;mX+%3^|=zMZU z;_MVAv1oCUe6VwpY>WgF+14qNvoc5$(d#KWv*{mk*pfhkk{*aYVyG`p%Lvj!a`HCUN_lRaF@xzFUPCi$}!hd<(v-`6l6Q}y_P z*-FBI%U=w8Y-1Jwn~#`9k2tnL>DafH2dl zUQjr9LC`h7FWCIj7GEfi6ub*n2k;Sp{C5`}<~wD7$;T=wdpW+_-2< zlucF1*y_<_UF>>tX?qw+oZ~@i+w_R(J_AureL%RRJ&PC*Un&l1)+bw>MoQ-B_={gF z8B$g*Bd%0VV-&n%aH97V_I^z@@=$ZZ)My2))5tQXl``;hycKJl8;4zP7h>HLv*6X8 z(P(46BGys0!|{hE;N5s9bIujufB+>lXyO8NMj=V+;g*Njw4c$vAL?OA>IQn}jCMNV z*#R7ESB7-2m7uC)`{5=1(J0%X9iDd@i90r5M}rmpQPRmAEKyHG+}=6ZL-h>qvQ%fT zx70HO7CA_B>0z99E*{GaO+YfWEB{jsLTN@qXl4g?eRmpdNEju}Ee@9Umy0O6d@Vy7 zwlNno;?Vf!2k5Mx3Uj129tSNt0U7Cca8G6yavydJ6@@-TfkDgYZiPkkOC?2E_jwI{ zY=r>z>(l7tSFg~|w&v1t#s_Ex9~!PokcZPXj=~Uy07#$z1Gb*{jOYE^jB5rOIoFJA za#rUsnHVfJ@7#0~-JW3aVTgekV;d=kgjW%jb3puDH=kYmSeaSZeH@=ElVyYVD>9qP zG{kUbq7b;)NNA58%FoyR$Nqcj$LZ#;VQx z#O)Ss{ZEQEnVDjgju~;8S18tf=ftf_p9Sqj@j~es88O2{U9=P?3p0vN3r}7i6;$+f z#PXiSVn>&wcwk(n*f_La^sTxori}g|ZdV^ow0=r^(t$w4h&)fSI@=mdKQf5 z|0p{TcPigFjLXW7jI2Z?gmB(xz4IhVQi+Bnm9)2(O3KKHtPql{3PmE4q$N=*Noi_H zks>Lj^*jHjz*Qc~hWQ#%U639|OAN<^{&l!k@|d5JjK8YDh0_H>WMmkLSLg ztmSia|M14QdU)IR3;gka4ZL&dWnS~;LHK59OpgKy`1rhi292Lm%ICc(rF6^zx4Y53+1Pds!&F`}7OgII|BHWmls!KO~H) z2g#^myexLc!AN|}7xSxR@Yws2Nb6EHj3_ol_ul@$-2^o&1+SGbq?%hD(Zd(H&`~2B z`7}2|2d)z9SDE0{pW4vrL_An0VKGN(%|@2fnt|*}1ZVWxzys&&;Ch)t2(1=UDjmwy zV6QwddozKO&u|0YdI^-=zi6uJ!D{Nt)(C2q#Wqm0qnvWj3kNrbL16o{K(r;v4%ho0 zL8Z>;iFw?4UizA}pr}4xP;t=~WOr!@OVUOPXSUB4E;VNh`JI-W?XfQML(=Jz8-Ek7 z{CJUAUA~W}SEsVA?(wX=x-&DQ>k)mTcoMxdcs|opevol)zQOl?h~VN*Dsp#jALU+r zThE`XP2&CaX7MZ8sl4f(Vf>bDBY54#ce!mRUHIc0*78vm_xRr5r}&KW8T|Y}O@5B8 zE5EEImWLi;{O|G%J|W;1uLWQ6FPE7J7uU=eO44@G4{Tl#EyNk zhzs4|%y`iPtI~Xp?(#cH_iQocJ(eEg<0(CLM-jP2vgbYDt6?eE`3`uaA~ONMG$vk_)OsK;>OspWG%`FReX z?^(b*w@&4)b6#_wciM1mmkzM<2HQCO*OR!;xrY4PQQG|25j(iYA|E0AT?zZ#z?l0r zJeS${Y&kxjI1Tm1R3pbTA5fazY1B3GJKXZn3*DkE@T>Ql_{+*d=o5MdE^29kPpcGA zWP%1%&f5=DrLUG1Hh(cJaWG2jJPu&QIl~Gd^7(8QeXWBT78T{ zKeVUgM`|~atNJJSM>hpJ4p#lId$1;98_qfGgqrU9p!1iL;1Q-3n!Qhh(Uu4C$mCE| ze)S2k+M^5?kJZBumusMLs@s8WVHg;gV-HndpMvRX0u)mjl)SwS_r~j) zE%B`V-B0w2y}9(muZ7I6uWy*_b7R@Od5V1M`32l}zMg+vo-3?)Z6kJT7Kz6nlowxl z^bH7~MZ%oDOV$blT!l9Aj|x!A0y1nZ~!VSK6?HEbP*-3{Z( z2)hT?9j5q(cNSV*q{K>cd{=xL`@nlmT*U;uy9r2?{p7`vCfit&Cp}M6bDc#9mVdTCl zc;ArjQ+=pUdsM$HInHHht>PP!td92!wMT^81v~NaJ_pGRWA*I183EtM`ACO z_bNu+9UGvD@+kOenIlXyNP$}iB4KY)E_gn{4Op*=25#ftQq9XlfKJ&yaDRyvD8F|W zcyD(G_Wh|~(e_)wRp}(Kk4T1ABL_g(mcy{g>mT+Hd4j)=vuCFI8wk4Q3c~x>d4k$L zX>r6Z1#!wv6|r`&f_T^VgM#`=d-m0@PuQt65_`;WLC4>`BrWTvkfq(q?8E)PnM81$ zRQYDn6Nl-uYb6~CVaihM1h&g@XHZTFAW!~49ycC zYh%P^%2+J-(q8=JoUYjGw4%87gT8pX!C0~Nkw(FGv7eypxlE85K0!#Xe$U?+-o_hd zjuZC13>GwlYlX;aIk80#6qm}*6I(9WEyRA=$rVOMv-@_duDW1X*S@xlH2`~!X; zYu5FRK5Dj=Jk9(?W&nK>tQ1HJ%tNum1~szoxCSd#ti)~TU(F{q!ppvf;I)Pqaq0BQ*d(Z$uGGEG zOk~dT>yMZ4(-z6_-j!nZgt9JE@aQ4!KkG1!b;slKTgl{J&r7UzV6TKf_=(O?yG83~ z1d!~86ZH6BL9~wYU;5+JVD|dCXl}DX68B7V0XJv#N3QeibuDsEU)2uziQS-S$q68mnt-xo^5L}jJUFjI z73_(c1a~lgXl;8skOQTVxjP6@cOcR{dKa#~W(kd#$za(&XXyJT25GE33ZI|Ig)Q2V z|7!+WYe^QQdO8?w)(e)nB|^{2!!XmAh4N#h;F~`UU{uCP7^WBt9ddi%iiK-{S&THi zzM>E84;l~u`slzHxSn#YWWbsLZSW~)Ds^==3qB1mrw$CC1Ex0oqHabeQhzl3LFf|- z6cwKa8v~P|3vUhHtXT+MKsjF1xr;Pdw=#XRy@iff)x3{Z8UN_&Lta+p1y2Tg`80zk zyl#LK?^Bh{+}E#0fub(-L6T*?{k;&+Ro{)x&WPCH@8g(}t1QX44Xw2Gsgul)06k`Y zWg^2CZe&y1Y=!MRwZ(0=fnxS}usFDNnK-D96C3Mki=R!B67Tc4E9C#H7lxN735hr7 z3j-RuLh<|=!a#he;HD%m$h1x7JvK1B-_Ivp=lU>iyQ=}`^tXb`o~g^q2yrBX= z`uGIx4=pCfYkuJ~Ich}blMyyn)5et#ituSgKLS$5(_=cbnU$T|d~@e0ZcAV?Yu2`e z-c%q@>$h6ax_2MaZ*0wo((862JGThEKU0P`8%?7>Z?C1(ln)R`gQs-SD?j?VTo8Sr z^bi{toX_u_Gfdd^xrujUh6zU$KJtloUhyu|_VPOquIA<&MA#q0(4Z7UE{X2ASIp;A3YO z0+qo~lzCGT2QAmZz5_kj_PGKs6xQLZtEb`BQp=I~lkX^a7LWcev_ZF8nqbp{Q&d2S z9Gs|>0eimffcJ)C;J)-EF!u5Y=$5+_dYMgyuNn!=%4?u%WkMqNw@ z29^4ou-&aVqE{ubUS^4c#auT*jxORy8y@3M9Fq7Z26Z^QO<&oWCyUu7AI%x{M|H6A z1BZsVP~fCDld+kbY5Srz*aKM5C0e2@%ntCDI8u*Y`&IuPX z0uls&H%<_ebOrt6ih{RHBj2fTk+--V&U-A3CPgi-I8o*h%*>EM7Ln$XPQZ9LJnbwtsXxx# z(mccZ#CtJk*-P}PO;hMcx2G_vL!b(2nZ8m3o;0^a-VSH~;FcJW%76NK;^ zQbPRK1it%S9p~kGjQQPlpKfkBBeI+QI#*II8X55H&_p`=ECu@D&qI|6NSuwW8)^~`;A~4c1#F8H9-hnk;Y4t;~a}RCEtOP%)XsIqal+^J6y1%Ybzfx zu|}s@^FPbj42=T>*~H*v)5mc3wX=|l=b;k2Lb9LImuP#Kd41lFUA2~FI<&lKe%Bn@ z-9VQ~{d0tmd~||$J0J)VixY*P9S?=z+7H6|+OGn2PD)(9u|a5ZTP;LQKg+QOqz8zyvKSigJPi!pF6crG1_yQKsSW9XQQt&GmSvpH}7N2?X zf}TTPCQH`NqRUkOp`TBzXs^m&%w+1c(7D%Fn7v}SkiPIB@6djPf6?=gyL4WME1QLR z%W4On9PZ|%-HJG^FrI(fw3thtR?E7c+0SOa)TRAg;>eSQRXEBr8+|A&h2}qMQHIl1 zILQa1!_-%p)cO^6cYa29XH5r3y0g*IDU!T`<1+N+iZ#xb^dNg}UyQ!#e}KzlbAUy% z3VM2GD_p^?fd^_YfRaB?9e~|!CPmr4bVpG$SfRZwnUr%}t4 z0;$hSk5XRJ8dOpEB(OtHL*$|ADH<7l6Q-?!AY`Q&jxSLMO3`h=JW3tzT5JvdCHrsf z#5ezI1|#e}sJ0L3K)S_`ns#0lTwGEPvOM!BGlv=A;GE-NcV!H?=50e&G$&9iex(9Q zN{~7`Pok+*M~mQ=L)441)`HjZABZm$2e$oCyVMfu_6*3DB7c)O(~q)FY4cS zj{3YYgtCF-sK-t%u&(ql2+}HmQ%yqgi5;03^_^nlpZpb6r}ps`rANgUKO)5Xe}OpU zW2aD^J4?8+XfLnuOqH2&tqgx${154aFg?bOTCzTJBC z{M|id&Q?QuT**{6DDO0LZ0HwrAj+Rz|LG9h7iq-e#ebRgiSL;z<}yt<617qwMqwA+>-{w?Wb7Tt{vE&Ht+U3G;Q%w_MOl`%# z(_F+KJ*S8-)tHOdH5!ULvi=H<9`^+tuvc(Cmdn3UROI@eey0^S8ZrA%XwYu1GjX8% zcbqk-g8OgS;LT-6P*7PrcDLURU&yB;%ae+*10F~5N*$!{lOsKT&RKelat0GqdzYPB z4ruR9@#N*_9#qmLOa59d#T_yQ=-j>~_=?>Fydl$w9=|sm(=TP|d2Kvx*m0CtCuxQi8O?+Nm&+k=KL-H!qfjKlLJjDySHU&0#Gc6e2LH#|Pp2=uVf1LAy;;vHg;+gsX@@$VB{6p<; zfiSpu8)zMy3X&EYKq-rJRBkH*zTpVab8LY{$8^!(Z93p}#anQXH3!djtOx$v-Km=I z2Sq{YE|hCVn&`J;l*l*!g6Q6)sUnR((?ykJ4dv5cKqUrBQ9;WOQ!bIpAa~eIN;)PN zN(&=^&F&lUdvh&H)-fX!9v8BwFvg>2h}|#;+qc6U9oLF{tzs;@R;J@`Vn8x|$h zP6`l4&K@bu^pzL>)Nbh;xfpZ(blSH#T+OR*KeLeV$ zJLu`cFL5^JjY3cH?srb`+8a#-ctK4te0hkU6UgzV+Y`9O>%MRmKNGk~wJ+G*CECnH z<&8||b&4c9Cy_Y!C)mWR2r0i`3MOlp!H(Mwh!}Z-)oY^QR<~O)xbG&6dz%6k4%lGX z%^#rcoFts3_YA!qCyP5LWTBB69>{Rrd1$+32^edi2%MXvLDi53NO|=}`Ye4t>Y;f7<`~SKJmrQVk&;8zm&9j4`?#*;i z)UqAARHXw^$O&p?+ex4`^d7{{^P#pM84DlK0Nfrr1FHLeQ}nP!V4RsZ^(ywd$UK`7 zO{Seip{c(mEE`QpzswsJ%@`&uV0tUBvGXOn^toZ( z-2UiVPFiC+_dQvetFIo$Wv>~@&AhL}?bTA^LXvK>bo4TIjp7b=+T`9nb!7dC;%r8QiR#WDVnu%F*pdyv1gDx8jii5i_*ZOf{uH7!4;20tou1{2aM1*?`IU$R__PtY0^t2tf+@1EcqgRV4FEhU612GFV+(JGff1QI&-1q zrdYU@K3W*udW4^7aG(4Aub$o5j`>$j%3SlgNt|f-7^bRc0u%9Lkme6(;D1eOME$rH z(S4DFyl=Ze>$tq&sm}0L%Q(jh&*`1crk9@Rt$U80C~ebgq{oJ zvF^)H@T*e|G&y=1Lit5-`IjWnS~UjtzyBoi>XLMtZ?2VaY!SE;l|ex!Apvp`ZI{V*Z-H9=e>zurT!PbdT4>JeNIPnPE3JId3V zJ#u0yt8O=e)q%RKm%&j+%gUOmyLN=;i_2+_tY`f`YjVyrr*gidVmX(BQ*7EAb1vdz z8Ta>k0Xth~2Aga8l`(uhj9rZ;vVmKh8KZ=q413a*j=knUemt&3Qgg51j+-saKqX;w zACF}Q?wrJR0~87!c?~}3wS$WNW6;lCC7`F}DxRz!$rL;2Fgx=n(XH>sGs#!o>F=h} z^l%k#e%0ISd~$RNry@O?)6Y1>6)5WQ@Vh0y$Z8*d)>n>?O&HC&k6z0b@7YExHx|>p z$yMUA4&$uLwW#Br0?CzpPrgq=|<&ozi0>5?Bhv|VF5o&DCHIJ(N>fOYRNkPAagCTgRE(S^ui(qDM! zo;+H0Y6`5L<{+_j{f6SZPe8^4KMAKd3~46JAo7tjz~U#$`1xyPT>4rLdBSG6uiFCU zSH;07H65h4RSBd-Hc~a&yQyo#Oo8F#JkVj41s0V>qnL?L!M-(Ls5g>DaP{e>U{!!M znD%BK_-UL0)|_PFqO0@3yJ>sCw@OF&Jxc&Owpn28@)hvusTxo?+7FJZdIRLAgn})1 zbN<&`wCH9CdUW?QXpJ9(!n>A9&O}-CO~D$@dshV-!dl_!;7hQF=>kbVCZg@D-T~>~ zMR0L%E--sP2kJk309se926N0tg1PBQRQJg+s&SYZC>dHqxn)lTZya7y))G(5cBf2G zQd3XuTu=j4CwGC-hAg~Z?vC1EB=PLArlr0=W%Xt>3w`gs1jDa01WgXLR(!XBBIa_c{$6U#*6^);6HGJHzPbor#hz+8Ma{$1rlqHjiW+ zHK$$97tv>DjbuK;GwjZkEo|$V_l!;{VVb|D)3xz)Xs>S~S~Y4Zy>E&dJ)$d~KAv}) zY%0j0ts9(Z>z+Gw?WIq&k;6PD;e8^buM@*Q9@ff6ymRHZ-%jQqJ(T5N1_yGluGO>I zFVoohiFxcntM#lMa$=9F1T#KzX|$}i32Avyg%=jI(jwJj$$9XH{`I92Z;|l9+UHcl zs;I-@)`JH0v(O8ydieuC@QGl0)Q{6z-q*?7{=0N^Unw1~eU%=VsKVR)8^c+$mVD8w zWWK0PL0BpA3asuQC)|)V6grj^@ip8JuB+UT`<)ZSc*u`s_TSFL&w2@ZO0B@g;0^W= zRbwTrjOu!?AjhH~*em)S&JU7!BO3Bx>~V}*A{g>w)GHibREyUwO{V|aPoRU{M-Y?V zjift5iB@^9L2mookiggj=+?F-eDiZ3zD57T(u?2WwW{*u^|ETZBw;!(YdDI(@a1G? zjv@P7TT588qJj6=be#VeSjS!KQsUojb>TGme9p;f4?kj@A%9l8jWrFP%es_DvllMP zGyB(%p|9_Zr@x=?BBhtFU@F`brz?w5_1#72tR}&ZaR(sP$s&8V1~`6+Dw-oZ7tQ%L z9&S+6lki;kAlqThIOpm(WE9+tTwEe?XhAR9ZvPP~pcAN`M#x<60IKwC0-_Q*usJ^j z7=#?7ZiUN1lL;ZvYV}9doaX|w4jcsWrCQMc+Fnp*vmK;R!y*5?7=F&W0AqVLLAURZ zz^cXvu+Xv&w2XIwfsf^&zC<6LxwszEIco5u&UkqIk|QVNdJk1>85xccI{As zai1EX?b)l~ZG|fw(ESIu*9617S9-81o<)se^&sR!KKz1Gz&b+-8stJ2SiZiL5{l-4vIj>oirlDkh4h=|BUmiS+imoS z!;-TQm7Od@YMUDA1E>A*{2Wz0;iNnrqbxS;u&UF?FKrrBY{jB zTtkF`qqwwQjV$k+MtWTI2pV`!{#GN}^MD^sYeh2MYf~AUJ&Nq3`Vp+^Sv%ISFNYl~)NK;!T%`=so@=b|%pZ0~<`8`!=hI<5jV56XaK`giz4Hu@kW%2m*KW@!O zRjxaxk_ih?V4mcdqf4SSC`Wr0{+G~>?cO}bV~(Fkln&nEI(v*=9Un~baJJbwH9i`?TKv0UdLXRc+lBd0N0 ziMM*>#|JA;A}nEPIRboID9Om*mHW+1qc-bjbiGIs}wY-0vizf_NAdRigJ zgj(3}*cKOd&x4yHrz4vJ3bn2{4qr4aM9+Pu!Q<`4$YSRUxJ)AweOxvY!vRU&w=W)V z^$;+>;}E*POaV*z5|m2CBQ5!lpsv1%@|Al5W;3rS@7cFO$fN-Hx={tcv@?OfgGPW$ zi``+|j5aFeVmi>Roeq1)OCe%k2KV1@hAq(>LGJVi&~4c_5ayW=lVhfVDnlh;J2nmK z*QbK+QLa$EOZk7zVC9NKV2O+oc;@m6oC~}PWON!p^qLOp*5*sFa;_rMTJ8^X*6oMq zW?Y6>#+AVoxdqUuaRC@ePXu)tD=39K<3tg$BS4{WkSg~M6OH%~PC4!h6g@oMO1(~f zOU={xN!1Qnf||QuMGGr#f@2%5f}(qk)V=B5K=1Z@^5>i*WA)F1+jrDK;6|V3f5(*y zku#SG1&^QdpN~x9rTR~C&*W4&`-%$kJWq?%yiUgVG}huBl77hw<8;J%YcS2(OL4*P zyC^F?h5k3UpMGGdLAo?vNIV-8*aLHC(7M;3(C&ji%!cP1nOvz4^gZ?8lI)N&GiT3e zCVy`T6S_Hpc|VlQBze7H_P*6-P1M%2{`IA-me)&mouv||ubIfzFL371?M~yDmK^7Y z&kyF4Ppb2GP%ig2I-7GXXydX|?r|kW9c(!*&BUC1Mt`1kmGtjLboRBAbn53hB+Gw1 zj+uH870ioA&z5PRF$S^7t5*lVZTSMDHKp+&JByKTEFs~KX3=Y{J!sCpfIeb6j+q&R zxj)un{Ppw3f=K`tOhsD4hW0DG$S;DA_^HI-)UD>ao2;qc|M__V&3q#tq%%HMMv5(=>=l$JC53u^#bVdFsfd-=B8zwN_)phJ{IlH%YjfjpMZr5*m^Bx1 ziL1dLm5bE$_FRzaqY9A7;K z!Eg+m@b3W(w^oA3?}kC2w5x#Ka2T%BRFU{tDnRP_oq%?oPx)K@t9D-;_ zridw*HDkbD?OtG2=0&|+5(bt%l0l2=7r>6mtzi99N#B~XDzN+d0d{Qq1{$Wyf~Lnq zqIpXrMXsHJqHOVeYT+S~$RQv?^vto?VQB6}kx6HTgcDjOicCF6RgO9(n*Ga!@(uq@ zxfJfFR<}e`hU=$NcV3Mp&DZj1<6p}-t(U`uRPS@V#mV#h^PhgaqP!fxS0k4D7C($* z_Gz-a*PGA=28uX?O+;dUJrrhn5*~0eMh|0^nUQNAVmYM-IBew$I;9ISQO)5*W$-es zvid7CGGq?pmt4i9JdkCrRlhUJagofYvw=)vwL3HXeLPd_QpSYGonhQ=1~Ddk$1^wY zZe)Cp=P)|)4s7VvJ#4J^N>;Tzm0cn7;Y{9{aWAIJbF(*pW!F2DvaVax*nY)A_Ug7F zma0+U9@(B|+Eq`HVy_%BXIK{gY8pq5ZPR1i8eM7gwL4I7Up`uKCIMc)_!s0Kl0%mk z8KBAie*o#v!7Fz-Gc|=(bV+X-G1l2iQ{Ve(n}9>KPCnq~-!tXI7qh(g$-i7il?w+h zM6>O;9NDbQJB)budFIQ|80PcYLRwyZD*d#54f*t`6&)*`1i$UL0W~#F!Z)?DaGu{q zEA+Wo3t=o zq@qJN^_h~Ot{h6C?5idLl~a)*Aae%rtDg>DTrh;kMkPYm#%#smf>pW4z?fcLV0y0%jC0@hzh*E|${ZdUI#11cat1i2Re@dY zMc{MiAuz^92Kmosf%)M&O8=7^u$prQZ1ReNEpx7ex^xrj{rGN&yZvI(CaXTt#Ff1c z$7d=yC^QT?^iDo)XSno%=#I`$hYf3{IAoJy)K-@d_G1f!sTD_(L`I=m)J0`WkYRfW z1SW*x)g_5!Gug)-S!piRv>oJ=PJHIF{pYYA!Gu-U7{lJWm%{{zr_ys?*wLTwjlp=b z4{-cE1SZRkf*BgepmO{mttqEXW|$Y@)G!;y;odd6M8BB0>z2|!<>AZ=Ice7RlpcGh z?+%k}dyLVw)?04aE zY*f)?%sCfE?oK(gZ|ra8q3nM4`rYZQFmpQV?)jW?x}Cwep9x?FcVfoS;w3$$`wcy# z?+n?i6NMdQr{X2A7U!;nvQVBWb&@T%wpD3Q8IT?<%=)$V_$ z^Suk{wxvsnX73f+LEDWUx_5_8{p!K3yQ9j5pI^_$^-N`j+hy#*^@FT5C(R8!x8RP| zYH{8cv)Fm#|Imsun~Bm=6}t9zKHloL3N~%XK*KGHQQd`jv{YdoGWA`Ars$fZvwESR zNcJj~aZwFySko-hRLMa}6HlQ1qhDi>Wsts@w4c0cvL(Oc?xJ0bR*=L3dvbKvaQtzb zKlWT^MX%P~gR(o4G1^ptTcqxg`b&Sw64jL?wnd-Zy6QyI)}}L8N+P-YiEiBN$!*-Y zB~hHl)HPhekM*o*D3=NPrNipm9c6->r!ZbxskGPURA!Pw1POC`gk`3*k+2+H@*`|L zc1w>({O)aVR7Vt0k}(6fJDuPsEjg$T-hyAgeL%lw6neY#4fHxKhJhjd$j9~&miK>( zfx=E~KXV?mY^X+NlYc?)nKWXrgwd%ua^RIYb`_XZsvcHa~^4%~83nq=eP|6LFjKRj#C zE-n$BmI@Kg+8#UOWH)d<}W1HMKbjIC4er!@QZ%hYQ{7*C9!D>f3Y6; zDA(61#kZW4`f@coyas$9S;V)fV+)lkhxWzMBh$^D@!x+`p?6eruYFOclbKlU~-7QJKu-a zS(i*t-zv+M&8OIFI)R)~&tq=!&*xmB%5!ec_xs$w?WehQwFO*hs^| zT$m-1Yj+~+HyGm`X>r8**E({AZ)eKA4Y_`o{p{V5tJ&-+mh37!1J-J19jg?T&SsJ_ zMwDa4lxIGt=g+x9tL@ywT--LCCUX(7wS7UBXTHErcS=!#MkZ2Ib^>kTyWj?$3ZOdb z0+2DT1Lum402#%_aFLe-Qao&l&aXcPzj=kAr85Ma<4}s*h946;D@D}=!VTU;5q6XsyyjRZ5niz^pQ1E%N_So z33H>toPSloyi5)Zl$*hl-Y(JYHzy%AOX6>nN&%=#7M`y+0(ZyWqr_wE!19)3@TpHL z7~EX&zjhNFCw7Z0{5_}$m)n#|-9_-GZ3^@;i3VUx5=gd5165M()T6U^sP6I{YVOCA zVEg?!q60gMsV28$4%r%wBEvlQNSG)QL)T%5w#bHL>KKugUSWes+<_n z*SD%vR)Q@R5bRGao)`<%KktJ9&l6DKWieUiTaCwDcjtbMPY?{3jTQ1I?h}mnjS-Ht zRPxu#E}ZLOPgW^YnGSx-;k{>$BK@Kc^hl=+JIROPq~VY0$`&WGeAG-D?U+vY z)%sObEh`HgPY6;o9*PwL~D69 zvXYlRyOcK$WB6LvcJBD)EnHgEBL*+u!93cd$4GB0rkz$VBcuO@5QjTjL^iAytC`=y z4I>XDSBDXZUb7CJp$Qsu`4@hXro~*?wvXO^e+iB4{}FnpIejB(Gd+C~WGg@D@$E;G z_;b=>d~23AKUJ@plZiUQxo22#rmq)qmUD|)wrdsBF?gSTyb#fD8L4=l6@_P1svzIA zMm#6>0~Q|+nZl2;WzU@;7T-WY@LZo5j_7>*9C z%Am`0dh|SDrXfXaT;Z4km*-R}wqv$p2S>!H&B*cEs(6V${r9dnPJTe3PO-)AYRH9Jl>?rX2>}$~fYZJU{eVC%do>21l zL#ZbkHdOrQ6`=6aRcc)B6wuRt0`=IPraHE~rF8e3ffLyqf$9{APfR`nF8GuL-q&kG zvobSaX_W%=ObucC${V05(g;4-n@Uw|J0;pRC{0y6Plm2XC~#syUkd!sYE=}Rj`*m?+@=dwxpEX&T zwtV70;v!mB@fG^&>!Tl6WAU@g0^ZIR(HHz?kULsi$)EYZa19zDPLZd{nt6{&d!7vq zFP|nm2D*vS1jIa*8_vA-lwx}8vuNXMN9li^t7x692KtrbS6VF|GSFCu**HRuQG2b% zsFyut#{6?*-wvg-m#$h$cKh+%NaM-eU1K|L^STq9@%rQ3oD)yDp1ePtKR=vLRI28B z(iFJn#gphMTMp6Ex~n#Mi_H7qtyTF3JI@$FdM*bjV;E15LPg(mC{6 zz8I>DyTPh~4p8@^4%)GoD4Up4TzYCbVg@p>)$nBckp6Gn9iT|Byg7nYt|%s!BYxq^ zu3G#c{yH2ofyARLgH%~NlWVJfV%gsFWX+E=$X{U`2`eZj?+*1#fF4!Ms)H_^-CAAV zZcHzC=>1ME$#x#6HexPIpB0!CcLnyq&u>gi?ILFKBY(1WwmDPcwuB71h)6|SFR_#S zSM$R&hFmuB%x58qA6-_E(F(G3xHZit7z=c*Hna?0T{IO15+3g z4AQDZD|~MQw@+3;3#fyDaks$sHa*Js@*P;_<_Esq-vCyR$1uz98FjTO@7X!y>1yoVJ1=t|IPGxHSq&!vxf`SR7D5WpH z!1_`ySTX+!Se?2UtgPNo>C8R_s%jKK%}!rnkZy*$Lc%Ev%WF{aN;PSSFT>*~Nj^8g zS9rfqNl5(I!8uk$aGGowC;r>SW~v*q>%xXJTh(RBm=BpKVZ;h}@{2C?_6$Nv7no>HUS3pDJuc%D;f*wX3fNF;dV9jJ@)cH9AnRe+S;o1rCXiWs{3k`vBFVEpH z^Eb|`V8)Q zdpK6~o}KVkunelMSn`A?T|r4V}Jwz&@$7 z)REG1xYDx_sw8HCM;Vu4|4suK+H(bTbr_&dwdGK^E)ZIIYC+s$1Uq%l!>HqWFi$q@ zf6buL)x+>V%FgqV%03R`RtQljiZoCvCFj0>`#yF`10_mSqO?m(Q`vhK5;77(kfO({+7qNL$D|HAX?yu06h&+j{~>-seHX~0AkYiRMd0QCHff^z&EX!*VhzBPHk zOY3g}vO(@pu_6UpZ7btP+Z_jr_kzLq&l|y_l@6dtek{m%zX|x}O$I(vW*~RZFwi;l z0U&=&;nOHtkXn}lhTawOOk9 zDzkTIc8cd5zsNpMm`lz7-X;3h{orAD4ulCcdw)k&6po&?;L)7B+2zuxB~q1x777o>^I5<_@Yki32s9IBNpKx+F zS%hUR%8=-h1{nzajE91C(0`~C>UO^l8>?l}hk{_3JSGeN+E@-xT#kbWoVw85a5W5~ zW3kre^JKDKIa&2Ci`b}Wk>Vb2{MF(m*`6McPkL%$-AW&nWamgaiiQ#c=b6Og+$|`3 zGJxDKtsx8EhT}DLE%>I?YgU#I#M0X{gV<+@MNE@Q2uNcdl`L} zmb#S_TWLy1;@8q`4VP8RiBXLiOQdE(AV16a;pSt>$NjNWnAZonY~&?O=A;4G{VE zJD)H_8Kk>ZgFDGSy#5APuqg-eitncY`KY73G}HhSzyASy&g}-~4aY&uhT;6!f3tYi ztPrrw@dy8{$PI*KW*~%>v z-$D8?DmYKWtH$p`4s-uO;{|i!sm{f4(?3IG{M?Oc%iSiK<4j3S`V;i$;e65+YlkOn z_>MpBwI`1kgpz`1TGa7&3+b4*h&-5-N>0jL!Inh|#n3}B#7MaaI^;~?$I6&+ZcVCE=WZ-_V zZ)fk!r?YhPcG~8XL@S?NC9lhlV=tdb;?)bur(ui9E14#;X7WNDUsM76KM%mVBpY}E z6+sKB_t5oHJ2_IYhK-D#Me=vn5xG$lneUdlY=^=K`p^HecyCFl*@r79%@P$7%u+W} zvpM6s#c7R4#WKiD956FX9OS4ejt#M8Yn^V<>)$_O>v#9jADbb#2lX z;d+MjUkIeJ#X(rHJ{i|VP&{J48c96%3?2V6m>iE>hSo;kB41jXNnoKlDI&JCa8?VG z>VV>1h4;kE?nj7w7Db5N4%vxi)(Nv-vV_1JmPD; z4#7py(fC1ZxUe8NR;;meka+mBOmX(`LE^Q??FBd42W*wtg7v?=NDg_I!$oQl=%Y*u zn06x;MmZUS^WmG|B(Fp^XQwuOx@0vTRl?(nbagttbSR#_Xe2gFx`d0a-awAGAK?jR zLG;n!d(>|`Vv6OrX>MOFoh-MR9#1|>MJUA^|Iz+e9E-Dkz@&#I z3T+eA#PZh;iN`JM6mqkQBssKqh1nNFglHdLaDV)ZRk#+gZB?&mL!vpIUmiqunRMdz z6Rz0Gyp0T1G$)O(DzMz^!6bhm8~?pH3hr*(3)|oL^XI4UfH&K}fwOhGv|-O=;at)b zGV8`UqIh~AYZ;eBwPFLwMNeJvt|_wSCn__|X8*n>9--PT9DgVh+}A&4e|{ceo0H{) z=oy#Unj16d<^@tTZ{Rz=zwIi@uMI?HhYHanql?IP@)iD1{y8+!$QS;}(?*s4UqF-d z8nE=#e3&d;1ormv@Z*r#SYz-$yh~>*HH%Lp7Z>=E3`ZMmCDTY$H=58s-KW?!&60q% z7qO_=9FMa1L*r*Tkj~i6=*t;jlCR@JQio~LncGg&^&MB(^PT2q%Wm8icL$}4jiXzI z^P?(-{q{r{+jyI~O}Iv{tx08#EBtBH{Nr@$kux;f?=KqZei}!{tRcB)&R~0;Yf$In zP&B>$EU23|1F-Rd8G=Rct4(>l=%z1 z-)qT?Kq^sup+^^``ryynigcMoQ>^plGJdPSiO^F3t?$kt2cLFRaM_48%0;ntk9elt z{Eog}T1l^ZzMR)nTJOD(X|0TAX2xd12Hk_g)t==- z_bG`3c0>rxO)#f+{^RKTJEl}UU?P2-zJM$nc^1DK=7Lj8JJ3o$4WxBv7&-95MRLDf zK?RdQ+}Y-dy$%hATU+(v`~5F?%lOOS;}1O;_-h9}Sn4C3`)5u(zo^nDcMMrS`%NeR z*h23)Z58t-{$^rCW5f)3*+1u2{$uRglHx&9`{^9++3P2{MFvcJoX&Lvp<&* zi5Ca^CB8sI>mZcq;bDwM7W51hA+y;fFm*)(8gbAIW|bWS@;$cDdbu6Uex-_>Y9}J` z!uj~z$iq}=kPSY6Yb9PbNgCVhdy~Rh=gGzRRIC)}LoOVhhfnDwei&T$f)9IgxcA{Sw*v@&z5 zQ(`tdpOdQ#)FmFt{WMr18heEOzy?M;$+Y=jQS9+aXymGK@L|sAaQ{0yw9-x*1jMSjUg# zGiv<70hq<7sxRe_U9aLBY72Sd?*{FcXd>e995yJV!DFHU{^%zF7R@aI_YXt^>Cb=v zR}Dt^3c$No4%xaWgED&vlQ%`9)w^6^3t%vNa4+avdI7v!H3GH0wua-QGGKSHIt*K~ z8;&ae1Vk2R!2_v>qNst{qJdAo4j4sVFZ8mFXznjsF=PFD;EJILBPY}m0FcG)9bqNQ(EQJf3Us46z0GgZ|NnVb*MPg57 z5!KF>WIf(N9y@ko7wJ_vsd)oxT@{2rzu8Rt2d`wiZqOn?`I&+@_5 z61K;_dZ6t6fbw?P%=DoL75@<^(*49TIy8l4N4shIshi>y-7Z1f`>W8iLRPFd|A*jx zda!tK&k(Ukvx!(L(oK9pY$U$m-OhGzccaPMN{Ct3V%*xk9$mUt52HR^f?69b(B{tN zaN$Rc*4aDYNXK#L60w3!?o;6p?_Xf?z11k-b~SXleGb1mQA8Dm$qY8ZMCp-+Y36$T|{hwS?Z8txN|UkYVeejA5p2 z3SxuPGG?>g`@~OvwTPeSFBg9qSt>-qQZ^tAW^%46?AYFe)O7z=ab><*FS zbtx|)yELWnl`)55zRP*A&_N!&cDF|2zG67{WgRI0JPK}aNdj{+#qdf`3tZx?h_0{7 zLX)P>#i{)^$i6`v^Tt{z=ui&4zPB9lj-BvMWj7r1E)(wZ-wL;FNdY-;tN6KHX@HtN z1XcYOph@2aN*piPz9$3()RurEvjZSMga?XFO8gNYKR&P^ho2Iv2fin*115uaf}ZV; z@P7L>c%&-@x>!a)kw*adUg60bnJWN=DUaaky#D`n9~=>51=gIlg1dz)VE*LM@P20p zx@u4bGtx4Up1{MW%cEerB+uh^?^HC;)&`!wMnO}@Jz(~tnD5_Y1HLTQ=ihC&6)pL= zoAWhO=b}Q4IgP?I+(Mbz+>Fg#BBcUn-m@`|tLIhuv%_mSONUW>^i?f>dG0)rxU(8n zOsT~kQ%u>_%51@FSQAT{v`Y9gdkL$UUryyq8Eu%jnoRo6{olDO$C#8|XPYohmUH_7{ zW?iKlk~4|4gi-7MDjym3Kon}L1HC`(L%FSOu)nn$dVHUZ>OxzgbX^8`sj(LPe4-4; zPT!3-{z`zG2g#9bITBV*OB$V9c?mmIIHCM8nP_1{8X?ld$Sn!u@0x!emThq)_w%-r zkZx=GSfVTYxpWF~x!yxGOw&kdxCH|a%h{7>qs-bv4a`KjW6c(~E*8&zuOohMtSNLX z31mO*qgn6r6KwkqZCV<2iSQ}T^v+G5{E_5tOxC-J?XRfeWUElPX`K%gzZ?XYJvs#+ zHN`iVo)&!+auSFFKMQDXn0jhJ-z;lmp#24NSAvsH)!_3do z_?~|l%Dj|<^xvk#w~}uZ|Lp?b$#h;Tsf|DV&!KXL-@e?|g`AM5MgQPSOf3z!~U#&KrpEgUIS2N4t0~7{0tfb3p zM?~@^#^(Igk)yzfQ!)ImiE^OE-kYzKZ3dQGjj{OX5OVXw3;ONMRw1>vfO%`~U~6pm z(u-GqkcNhEvi0^&Z1|xB*ay#mKJQDws?7*oIduyh^Jc&?UV=TTxk8&k5b3I1&#Ieq z$bG9llwVdyNS`_(1;fdb{LA>2;Vg2u{~Vc}_>SIk)?o)S|Ilr+Qf$5CCLesfhBkI> zpvUjG6O{HF4;l83ELu2>CVcIoZ}j_Firfa_!h}l<54C5pD%IrH>R570{|ui0A`YKB zoQ7>KiOF8~*<{(*NhJ5MFCHsf1h>se0rFD_tZKiDQb*1wss}O^mPB)$6uwZFhlk|op@i~r(9QZdtlA$5 zPR@)6dguJnK5;zQr4b4*ojQc<7QF$H%e^6zI|-teE`xe$(r|)=Kla!%66Tmpg9@gR zaJ`HX%-m1`CLJ8f&;K?V3MUlNtdAz}mA)!WvDglF#mt2#I-{s$YZ0F{*{N$U*mGITR7x=6G zZ+U0=tKi068T@OIF1FqCiqb3-!9)H6+mIW|OhPM=$Mj|BUrr3>xO2!Nz78stUWYj! z`gyhE2f^-5-XQ*m7~CzZ19w}-GTFn%c!0}gPlD#qTi=qX)XanA+VKNKdF>Pe;+Ij~ z^%|t{1|xb0Oz8s6IO?h2Os|jMN@3^uJ$o?;8_!6x$4QznlV@t* z6@@-;O|kh=ca}NVg%!L!N|AFHd3;U=-=5qJ%SXqfoUAC)^)ZYLyPu5LxxYZwWxXK4 zZzzgz3g>;oWRT_5c9PV;oCZ$SC4--xLGF%*u)JFuI8L7l4W6fg6}q|br&E^XE-_J@ zaxaKYcW-5S$Bcvktsb)Fjw-wTagK0Jx0^1E{XlbyLumEJP>HwjFZn(8B3&M4%xoq& zvEiZw`YCN8$zI%v5-um=@v5QdNJ%nm(3Qs<>qp`@mv13Kyb?{QZbM0<2wt_u3Y;C` z4IWpj!t(orVDe}c+;)8$4qKZ+?r)Tl@OW!z@ZB|pw(lWf7dQW)lAw}%%byFO&XrDOz zpQd=+;%Z^qI|CM4oGDl@`6G<#Kg(_frBjE3AnFnEh%Brx#`hD}6CJ%2>}qC;EdO<) zEcya0asCNA%rAhiDWBmx(+TiE<}EOL-WT}V#}~G0Sfa+eW_XsfF43~BCA_&i5rU48 zXT>A1(cvBBxTTnsUX3P0_uYc36=`tpBNOOyrVZ$>u15uyRW^B6@V5M$}SLzf(0b>+UWrPYmI7|f_ zveQthA`?D~hy;D-PlLhwH-N@qX<%kz3Z&8>@-m~F`NDmh`Mr-dK#;<6z9_GU_i#?) z&n8Udbw>Z;9p8oXi%26cAFBeoFDQbC-$bBZoCx;GK=k{|1|&7-B5l`t!faFYnb$pK zw)$f`uH8Q!@AuXs{>f%|yId8@Dmx9L)urHoR2V3Iv^2*PU?e6{!_LxBzu7eATqbeJ zxD0HjTEO1(yJ6F>$KcbHgYXZR&F)Mr5z8+B#H5idD}Wc7cG-A3WS%a8o3^Uk6}?9fk1hmbK{W z$0l^UIUIGVD&q@A0F%d&ShF*mioI?@8XJsRjUTPl#i4=*i7PZDNiE$H?VTsSxW5tK2=63$$1kD}yC%^s zbFNTluV5Ct<)t9Mx=m<#v{dZ*2nav7`UwvmMcErKXVTJXPcj#j=q zN`2=cYCLQ>`8KnHT=h!BgN#*>(m+4Dtty5?XD}4*pAEMf{Dk}8TSDt8)-dtL474Me zM@)PN>dv#mW53NOdY8J%@Wtlzm{Bz`@>ovxEVm{fy#mQx+JYw;Xkw4(D)j04S=gHN z1!(+^1wSV`pr_mF;Om5=@OzO4PLbsE2DmAMzT6w|2CKX_Z?o9Y1 z+88Y2F??HXiqdcYg*zXQ=H>SM1FhPgz}@-@%=z^eq(m4i@`v>;jDnxRx z7T^o_!;wRDGn{O#4yCg%Kx}v!96Jn=fA3F_`aTt0^*IQ{PZxpvKi&cTZLPe4lQUlu ze4JnU={2WTl*?b4Q^s?*dO5ibBf-R$ICF75#sqfnfhrhqep8#&<4esY|QQj?4JE$rg_hUZO$0YuD>X!8{>YHPsX?D+2NCg zLp3AB9rHU`$-G(YPLUJcRij7VSq7qtJQb`rrwY{=#Ua0GGGw#-7V_KYJbndA_gD)iZb zEc$xMU*gwQN)DT-;L-=mWXbYswDI*}^jPBEd02c2mBk-Lfwj}o`){V$bC4;%+-eA} zJ(Pi6)*@j2W*L0qUIPC07oiTPk0j AR<(4Jv;xf)vgzAXoU4*zTMjxhT!>gNJ+Z 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 audioAugmentationMap = {3, "down_mixing"}, {4, "spectrogram"}, {5, "slice"}, - {6, "resample"} + {6, "resample"}, + {7, "mel_filter_bank"} }; // Golden outputs for Non Silent Region Detection @@ -149,6 +150,50 @@ void read_audio_batch_and_fill_dims(RpptDescPtr descPtr, Rpp32f *inputf32, vecto } } +void read_from_bin_file(Rpp32f *srcPtr, RpptDescPtr srcDescPtr, Rpp32s *srcDims, string testCase, string scriptPath) +{ + // read data from golden outputs + Rpp64u oBufferSize = srcDescPtr->n * srcDescPtr->strides.nStride; + Rpp32f *refInput = static_cast(malloc(oBufferSize * sizeof(float))); + string outFile = scriptPath + "/../REFERENCE_OUTPUTS_AUDIO/" + testCase + "/" + testCase + ".bin"; + std::fstream fin(outFile, std::ios::in | std::ios::binary); + if(fin.is_open()) + { + for(Rpp64u i = 0; i < oBufferSize; i++) + { + if(!fin.eof()) + fin.read(reinterpret_cast(&refInput[i]), sizeof(float)); + else + { + std::cout<<"\nUnable to read all data from golden outputs\n"; + return; + } + } + } + else + { + std::cout<<"\nCould not open the reference output. Please check the path specified\n"; + return; + } + for (int batchCount = 0; batchCount < srcDescPtr->n; batchCount++) + { + Rpp32f *srcPtrCurrent = srcPtr + batchCount * srcDescPtr->strides.nStride; + Rpp32f *refPtrCurrent = refInput + batchCount * srcDescPtr->strides.nStride; + Rpp32f *srcPtrRow = srcPtrCurrent; + Rpp32f *refPtrRow = refPtrCurrent; + for(int i = 0; i < srcDims[batchCount * 2]; i++) + { + Rpp32f *srcPtrTemp = srcPtrRow; + Rpp32f *refPtrTemp = refPtrRow; + for(int j = 0; j < srcDims[(batchCount * 2) + 1]; j++) + srcPtrTemp[j] = refPtrTemp[j]; + srcPtrRow += srcDescPtr->strides.hStride; + refPtrRow += srcDescPtr->strides.hStride; + } + } + free(refInput); +} + void verify_output(Rpp32f *dstPtr, RpptDescPtr dstDescPtr, RpptImagePatchPtr dstDims, string testCase, string dst, string scriptPath) { fstream refFile;