From f11eed08f404f9246087dea08f40c57dfcaf7acf Mon Sep 17 00:00:00 2001 From: yao Date: Thu, 3 Mar 2022 22:01:14 +0100 Subject: [PATCH] release-v4.12.0 --- configs/openocd.sh | 4 + .../pmsis/bsp/ble/ble_nina_b112/gaptest.yml | 17 + .../pmsis/bsp/ble/ble_read_test/gaptest.yml | 17 + examples/pmsis/bsp/blink_led/gaptest.yml | 17 + .../camera_ir_thermeye/always_on/gaptest.yml | 25 + .../lower_power_mode/gaptest.yml | 25 + .../cameras/test_camera_gc0308/gaptest.yml | 17 + .../bsp/cameras/test_camera_io/gaptest.yml | 25 + .../bsp/cameras/test_camera_lcd/gaptest.yml | 25 + .../cameras/test_camera_ov5640/gaptest.yml | 17 + .../cameras/test_camera_ov7670/gaptest.yml | 17 + .../test_camera_ov7670/ov7670_config.h | 0 .../cameras/test_camera_pixart/gaptest.yml | 25 + .../cameras/test_camera_stream/gaptest.yml | 17 + .../bsp/filesystem/fs_to_l3_copy/gaptest.yml | 18 + .../littlefs/native_lfs/gaptest.yml | 18 + .../pmsis/bsp/filesystem/readfs/gaptest.yml | 18 + .../pmsis/bsp/flash/hyper_flash/gaptest.yml | 26 + .../hyper_flash_multi_thread/gaptest.yml | 25 + .../lcd/gapuino_himax_with_lcd/gaptest.yml | 17 + .../vesper/vm3011_wakeup/gaptest.yml | 17 + examples/pmsis/bsp/ram/hyper_ram/gaptest.yml | 26 + .../pmsis/bsp/ram/hyper_ram_flash/gaptest.yml | 26 + .../ram/hyper_ram_multi_thread/gaptest.yml | 25 + .../bsp/wifi/nina_b112_example/gaptest.yml | 17 + examples/pmsis/features/aes128_sw/gaptest.yml | 17 + examples/pmsis/features/aes128_sw/main.c | 12 +- .../cluster/cluster_callback/gaptest.yml | 24 + .../features/cluster/cluster_dma/gaptest.yml | 24 + .../features/cluster/cluster_fork/gaptest.yml | 17 + .../cluster/cluster_malloc/gaptest.yml | 24 + examples/pmsis/features/efuse_burner/Makefile | 9 - .../pmsis/features/efuse_burner/example.c | 57 -- .../pmsis/features/helloworld_cxx/gaptest.yml | 16 + .../features/hyper_ram_delegate/gaptest.yml | 26 + .../pmsis/features/test_malloc/gaptest.yml | 17 + .../pmsis/features/uart_delegate/gaptest.yml | 18 + examples/pmsis/helloworld/gaptest.yml | 18 + examples/pmsis/periph/dmacpy/gaptest.yml | 26 + .../pmsis/periph/gpio/gpio_input/gaptest.yml | 18 + examples/pmsis/periph/gpio/gpio_input/gpio.c | 11 +- .../pmsis/periph/gpio/gpio_irq_cb/gaptest.yml | 18 + examples/pmsis/periph/gpio/gpio_irq_cb/gpio.c | 11 +- .../pmsis/periph/gpio/gpio_output/gaptest.yml | 18 + examples/pmsis/periph/gpio/gpio_output/gpio.c | 30 +- .../pmsis/periph/i2c/i2c_bmp280/gaptest.yml | 18 + .../pmsis/periph/i2c/i2c_detect/gaptest.yml | 17 + .../i2c/i2c_eeprom_pulp_fmc/gaptest.yml | 17 + .../pmsis/periph/i2c/i2c_scan/gaptest.yml | 17 + .../pmsis/periph/i2c/i2c_slave/gaptest.yml | 17 + examples/pmsis/periph/i2s/pcm/gaptest.yml | 18 + examples/pmsis/periph/i2s/pdm/gaptest.yml | 18 + .../pmsis/periph/i2s/pdm_4mic/gaptest.yml | 18 + .../pmsis/periph/i2s/pdm_async/gaptest.yml | 18 + examples/pmsis/periph/i2s/wav_out/gaptest.yml | 18 + .../pmsis/periph/i2s/wav_out_long/gaptest.yml | 18 + .../periph/i2s/wav_out_one_shot/gaptest.yml | 18 + examples/pmsis/periph/perf/gaptest.yml | 17 + examples/pmsis/periph/pwm/gaptest.yml | 18 + .../pmsis/periph/rtc/rtc_alarm/gaptest.yml | 18 + .../pmsis/periph/rtc/rtc_calendar/gaptest.yml | 18 + .../pmsis/periph/rtc/rtc_counter/gaptest.yml | 18 + .../pmsis/periph/spi/spi_master/gaptest.yml | 18 + .../periph/uart/uart_helloworld/gaptest.yml | 18 + .../uart/uart_helloworld_timeout/gaptest.yml | 16 + .../pmsis/periph/uart/uart_input/gaptest.yml | 18 + .../uart/uart_input_timeout/gaptest.yml | 16 + .../gvsoc/models/cpu/iss/include/pulp_v2.hpp | 14 +- gvsoc/gvsoc/models/cpu/iss/src/csr.cpp | 12 + .../freertos_kernel/include/FreeRTOS.h | 2 +- .../vendors/gwt/gap8/src/device/system_gap8.c | 2 +- .../driver => libs/include}/semihost.h | 56 +- .../backend/pmsis_backend_native_task_api.h | 4 +- .../vendors/gwt/rules/freeRTOS_rules.mk | 2 +- rtos/pmsis/pmsis_bsp/CMakeLists.txt | 2 +- rtos/pmsis/pmsis_bsp/flash/mram/mram-v2.c | 5 +- rtos/pmsis/pmsis_bsp/fs/host_fs/semihost.c | 50 -- rtos/pmsis/pmsis_bsp/fs/host_fs/semihost.h | 47 +- rtos/pmsis/pmsis_bsp/include/bsp/flash/mram.h | 1 + rtos/pmsis/pmsis_bsp/src.mk | 2 +- rtos/pmsis/pmsis_bsp/zephyr/CMakeLists.txt | 3 +- .../pmsis_implem/chips/gap9/drivers/i2c/i2c.c | 2 +- .../Autotiler/AutoTilerLibTypes.h | 1 + .../CNN_Generators/CNN_Copy_Generators.c | 8 + .../CNN_Generators_NE16/CNN_Generators_NE16.c | 208 ++++--- .../CNN_Generators_SQ8/CNN_Generators_SQ8.c | 262 +++++---- .../CNN_Generators_SQ8/RNN_Generators_SQ8.c | 120 +++- .../CNN_Generators_fp16/RNN_Generators_fp16.c | 107 +++- .../CNN_Libraries/SSD_BasicKernels.c | 7 +- .../CNN_BasicKernels_NE16.c | 4 +- .../CNN_Libraries_SQ8/CNN_AT_Misc.c | 1 + .../CNN_Libraries_SQ8/CNN_Activation_SQ8.c | 519 ++++++++++++------ .../CNN_Libraries_SQ8/CNN_BasicKernels_SQ8.h | 146 ++++- .../CNN_Libraries_SQ8/CNN_Bias_Linear_SQ8.c | 68 ++- .../CNN_Libraries_SQ8/CNN_Conv_DW_SQ8.c | 5 +- .../CNN_Libraries_SQ8/CNN_Conv_SQ8.c | 12 +- .../CNN_Libraries_SQ8/CNN_MatAlgebra_SQ8.c | 271 ++++----- .../CNN_Libraries_SQ8/CNN_MatMul_Conv_SQ8.c | 247 ++++----- .../CNN_Libraries_SQ8/CNN_Pooling_SQ8.c | 456 +++++++++++++-- .../CNN_Libraries_SQ8/CNN_SoftMax_SQ8.c | 7 +- .../autotiler_v3/CNN_Libraries_SQ8/RNN_SQ8.c | 8 +- .../CNN_Bias_Linear_Activation_fp16.c | 7 + .../CNN_Conv_BasicKernels_fp16.c | 8 + .../CNN_Conv_DW_BasicKernels_fp16.c | 8 + .../CNN_Libraries_fp16/CNN_MatAlgebra_fp16.c | 8 + .../CNN_Libraries_fp16/CNN_MatMul_Conv_fp16.c | 9 + .../CNN_Pooling_BasicKernels_fp16.c | 8 + .../CNN_Libraries_fp16/RNN_fp16.c | 10 +- .../SSD_BasicKernels_fp16.c | 10 +- .../SSD_BasicKernels_fp16.h | 4 +- .../DSP_Generators/DSP_Generators.c | 241 ++++++++ .../DSP_Generators/DSP_Generators.h | 24 + tools/autotiler_v3/DSP_Libraries/DSP_Lib.h | 24 +- .../autotiler_v3/DSP_Libraries/FFT_Library.c | 30 +- .../LUT_Tables/gen_scripts/GenMFCCLUT.py | 22 +- .../LUT_Tables/gen_scripts/SetupLUT.py | 22 +- tools/autotiler_v3/DSP_Libraries/MatMulDSP.c | 514 +++++++++++++++++ tools/autotiler_v3/Emulation/at_api_emul.h | 149 +++++ tools/autotiler_v3/Emulation/at_api_pmsis.h | 203 +++++++ tools/autotiler_v3/Makefile | 2 +- tools/autotiler_v3/version.cfg | 2 +- tools/jenkins/gap_sdk_version.txt | 2 +- tools/nntool/_version.py | 2 +- .../kernels/float/dsp_preprocessing.py | 2 - .../execution/kernels/float/fast_conv.py | 4 +- .../kernels/float/tensor_functions.py | 12 +- .../execution/kernels/quant/activations.py | 80 +-- .../execution/kernels/quant/fast_conv.py | 7 +- .../nntool/execution/kernels/quant/linear.py | 5 +- .../kernels/quant/matrix_operations.py | 3 +- .../kernels/quant/tensor_functions.py | 4 +- .../expressions/symbolic/assignments.py | 434 +++++++-------- tools/nntool/expressions/symbolic/basic.py | 137 ++++- .../expressions/symbolic/common/__init__.py | 0 .../symbolic/float_quantization/float_qrec.py | 3 + .../float_quantization/float_quantization.py | 41 +- .../symbolic/float_quantization/handlers.py | 34 +- tools/nntool/expressions/symbolic/function.py | 39 +- .../symbolic/function_collection.py | 32 +- .../expressions/symbolic/iteration_space.py | 513 +++++++++++++++-- .../expressions/symbolic/kernel_codegen.py | 313 ----------- .../symbolic/q15_quantization/handlers.py | 181 +++--- .../q15_quantization/q15_scale_q_rec.py | 17 +- .../q15_scaled_quantization.py | 142 +++-- .../q15_quantization/quantized_constant.py | 34 -- .../q15_quantization/scale_quantized.py | 15 +- .../expressions/symbolic/quantization_base.py | 18 + tools/nntool/expressions/symbolic/symbol.py | 115 +++- .../symbolic/variable_container.py | 114 +--- tools/nntool/generation/code_block.py | 30 + tools/nntool/generation/code_generator.py | 39 +- .../generation/default_appl_main_template.py | 29 +- .../new_generators/general/transpose.py | 6 +- .../new_generators/mult8/pool_mult8.py | 5 + .../generation/project_template/Makefile | 48 +- .../project_template/common/model_decl.mk | 12 +- .../eliminate_transposes.py | 2 +- tools/nntool/graph/manipulations/formatter.py | 122 ++++ .../matchers/batchnorm_to_discrete_ops.py | 70 +++ .../graph/matches/matchers/concat_slice.py | 2 +- .../graph/matches/matchers/concat_split.py | 16 +- .../matches/matchers/expand_to_reshape.py | 50 ++ .../graph/matches/matchers/fuse_batchnorm.py | 87 +++ .../graph/matches/matchers/fuse_gap_convs.py | 17 +- .../graph/matches/matchers/gather_to_split.py | 2 + .../graph/matches/matchers/move_node_up.py | 2 +- .../graph/matches/matchers/rnn_unpack.py | 2 +- .../graph/matches/matchers/slice_to_split.py | 6 +- tools/nntool/graph/nngraph.py | 155 +++++- tools/nntool/graph/types/base.py | 15 - tools/nntool/graph/types/conv2d.py | 3 +- tools/nntool/graph/types/expression_fusion.py | 32 +- tools/nntool/graph/types/others.py | 44 +- .../nntool/importer/common/constant_mixin.py | 9 + tools/nntool/importer/onnx/common/__init__.py | 15 +- .../importer/onnx/common/handler_helper.py | 1 + .../importer/onnx/handlers/backend/add.py | 4 + .../handlers/backend/batch_normalization.py | 11 +- .../onnx/handlers/backend/concat_mixin.py | 2 +- .../onnx/handlers/backend/conv_mixin.py | 10 +- .../onnx/handlers/backend/conv_transpose.py | 2 +- .../importer/onnx/handlers/backend/div.py | 4 + .../importer/onnx/handlers/backend/expand.py | 6 +- .../importer/onnx/handlers/backend/gather.py | 14 +- .../importer/onnx/handlers/backend/gru.py | 4 + .../importer/onnx/handlers/backend/lstm.py | 4 + .../importer/onnx/handlers/backend/mul.py | 4 + .../handlers/backend/nncf_fake_quantize.py | 5 +- .../importer/onnx/handlers/backend/range.py | 47 ++ .../onnx/handlers/backend/reducer_mixin.py | 24 +- .../importer/onnx/handlers/backend/relu.py | 4 + .../importer/onnx/handlers/backend/reshape.py | 4 + .../importer/onnx/handlers/backend/resize.py | 9 + .../importer/onnx/handlers/backend/rnn.py | 4 + .../onnx/handlers/backend/rnn_mixin.py | 7 + .../onnx/handlers/backend/scatternd.py | 83 +++ .../importer/onnx/handlers/backend/sub.py | 4 + .../onnx/handlers/backend/thresholded_relu.py | 40 ++ .../onnx/handlers/backend/unsqueeze.py | 2 +- .../onnx/handlers/backend/upsample.py | 117 ++++ tools/nntool/importer/onnx/onnx.py | 35 +- tools/nntool/interpreter/commands/dump.py | 4 +- .../interpreter/commands/imageformat.py | 102 +--- tools/nntool/interpreter/commands/qtune.py | 2 +- tools/nntool/interpreter/commands/remove.py | 44 +- tools/nntool/interpreter/commands/tflite.py | 13 +- .../float/float_quantization_handler.py | 7 + .../quantizers/expression_fusion_float.py | 4 +- .../float/quantizers/input_float.py | 54 ++ .../float/quantizers/output_float.py | 18 +- .../quantizers/activation_mult.py | 10 +- .../multiplicative/quantizers/add_sub_mult.py | 2 +- .../quantizers/constant_input_mult.py | 19 +- .../quantizers/expression_fusion_mult.py | 6 +- .../multiplicative/quantizers/filter_mult.py | 20 +- .../quantizers/global_pooling_mult.py | 6 +- .../multiplicative/quantizers/input_mult.py | 8 +- .../multiplicative/quantizers/matmult_mult.py | 6 +- .../multiplicative/quantizers/output_mult.py | 12 +- .../quantizers/softmax_tanh_mult.py | 4 +- tools/nntool/quantization/new_qrec.py | 2 +- tools/nntool/quantization/qtype.py | 12 +- .../quantization/quantizer/new_quantizer.py | 9 + .../nntool/quantization/quantizer_options.py | 6 + tools/nntool/reports/draw_graph_reporter.py | 2 +- tools/nntool/reports/quantization_reporter.py | 3 + tools/nntool/utils/node_id.py | 6 + tools/nntool/utils/random_iter.py | 42 ++ utils/gaptest/gaptest | 35 +- utils/gaptest/lib/gaptest/Loader.pm | 9 + .../gap_bins/gap_flasher-gap9_evk-fpga.elf | Bin 720132 -> 0 bytes .../gap_bins/gap_flasher-gap9_evk-mram.elf | Bin 583496 -> 0 bytes .../gap_bins/gap_flasher-gap9_evk.elf | Bin 735132 -> 0 bytes .../gap_bins/gap_flasher-gap9_v2.elf | Bin 731268 -> 0 bytes utils/openocd_tools/src/fuser/gap9-efuse-gen | 91 --- utils/openocd_tools/tcl/gap9reva.tcl | 81 --- utils/openocd_tools/tcl/gap9revb-bootmode.tcl | 134 ----- utils/openocd_tools/tcl/gap9revb.tcl | 167 ------ utils/openocd_tools/tcl/gap9revb_gdb.tcl | 245 --------- 239 files changed, 7049 insertions(+), 2955 deletions(-) create mode 100644 examples/pmsis/bsp/ble/ble_nina_b112/gaptest.yml create mode 100644 examples/pmsis/bsp/ble/ble_read_test/gaptest.yml create mode 100644 examples/pmsis/bsp/blink_led/gaptest.yml create mode 100644 examples/pmsis/bsp/cameras/camera_ir_thermeye/always_on/gaptest.yml create mode 100644 examples/pmsis/bsp/cameras/camera_ir_thermeye/lower_power_mode/gaptest.yml create mode 100644 examples/pmsis/bsp/cameras/test_camera_gc0308/gaptest.yml create mode 100644 examples/pmsis/bsp/cameras/test_camera_io/gaptest.yml create mode 100644 examples/pmsis/bsp/cameras/test_camera_lcd/gaptest.yml create mode 100644 examples/pmsis/bsp/cameras/test_camera_ov5640/gaptest.yml create mode 100644 examples/pmsis/bsp/cameras/test_camera_ov7670/gaptest.yml mode change 100755 => 100644 examples/pmsis/bsp/cameras/test_camera_ov7670/ov7670_config.h create mode 100644 examples/pmsis/bsp/cameras/test_camera_pixart/gaptest.yml create mode 100644 examples/pmsis/bsp/cameras/test_camera_stream/gaptest.yml create mode 100644 examples/pmsis/bsp/filesystem/fs_to_l3_copy/gaptest.yml create mode 100644 examples/pmsis/bsp/filesystem/littlefs/native_lfs/gaptest.yml create mode 100644 examples/pmsis/bsp/filesystem/readfs/gaptest.yml create mode 100644 examples/pmsis/bsp/flash/hyper_flash/gaptest.yml create mode 100644 examples/pmsis/bsp/flash/hyper_flash_multi_thread/gaptest.yml create mode 100644 examples/pmsis/bsp/lcd/gapuino_himax_with_lcd/gaptest.yml create mode 100644 examples/pmsis/bsp/microphones/vesper/vm3011_wakeup/gaptest.yml create mode 100644 examples/pmsis/bsp/ram/hyper_ram/gaptest.yml create mode 100644 examples/pmsis/bsp/ram/hyper_ram_flash/gaptest.yml create mode 100644 examples/pmsis/bsp/ram/hyper_ram_multi_thread/gaptest.yml create mode 100644 examples/pmsis/bsp/wifi/nina_b112_example/gaptest.yml create mode 100644 examples/pmsis/features/aes128_sw/gaptest.yml create mode 100644 examples/pmsis/features/cluster/cluster_callback/gaptest.yml create mode 100644 examples/pmsis/features/cluster/cluster_dma/gaptest.yml create mode 100644 examples/pmsis/features/cluster/cluster_fork/gaptest.yml create mode 100644 examples/pmsis/features/cluster/cluster_malloc/gaptest.yml delete mode 100644 examples/pmsis/features/efuse_burner/Makefile delete mode 100644 examples/pmsis/features/efuse_burner/example.c create mode 100644 examples/pmsis/features/helloworld_cxx/gaptest.yml create mode 100644 examples/pmsis/features/hyper_ram_delegate/gaptest.yml create mode 100644 examples/pmsis/features/test_malloc/gaptest.yml create mode 100644 examples/pmsis/features/uart_delegate/gaptest.yml create mode 100644 examples/pmsis/helloworld/gaptest.yml create mode 100644 examples/pmsis/periph/dmacpy/gaptest.yml create mode 100644 examples/pmsis/periph/gpio/gpio_input/gaptest.yml create mode 100644 examples/pmsis/periph/gpio/gpio_irq_cb/gaptest.yml create mode 100644 examples/pmsis/periph/gpio/gpio_output/gaptest.yml create mode 100644 examples/pmsis/periph/i2c/i2c_bmp280/gaptest.yml create mode 100644 examples/pmsis/periph/i2c/i2c_detect/gaptest.yml create mode 100644 examples/pmsis/periph/i2c/i2c_eeprom_pulp_fmc/gaptest.yml create mode 100644 examples/pmsis/periph/i2c/i2c_scan/gaptest.yml create mode 100644 examples/pmsis/periph/i2c/i2c_slave/gaptest.yml create mode 100644 examples/pmsis/periph/i2s/pcm/gaptest.yml create mode 100644 examples/pmsis/periph/i2s/pdm/gaptest.yml create mode 100644 examples/pmsis/periph/i2s/pdm_4mic/gaptest.yml create mode 100644 examples/pmsis/periph/i2s/pdm_async/gaptest.yml create mode 100644 examples/pmsis/periph/i2s/wav_out/gaptest.yml create mode 100644 examples/pmsis/periph/i2s/wav_out_long/gaptest.yml create mode 100644 examples/pmsis/periph/i2s/wav_out_one_shot/gaptest.yml create mode 100644 examples/pmsis/periph/perf/gaptest.yml create mode 100644 examples/pmsis/periph/pwm/gaptest.yml create mode 100644 examples/pmsis/periph/rtc/rtc_alarm/gaptest.yml create mode 100644 examples/pmsis/periph/rtc/rtc_calendar/gaptest.yml create mode 100644 examples/pmsis/periph/rtc/rtc_counter/gaptest.yml create mode 100644 examples/pmsis/periph/spi/spi_master/gaptest.yml create mode 100644 examples/pmsis/periph/uart/uart_helloworld/gaptest.yml create mode 100644 examples/pmsis/periph/uart/uart_helloworld_timeout/gaptest.yml create mode 100644 examples/pmsis/periph/uart/uart_input/gaptest.yml create mode 100644 examples/pmsis/periph/uart/uart_input_timeout/gaptest.yml rename rtos/freeRTOS/vendors/gwt/{gap8/include/driver => libs/include}/semihost.h (63%) delete mode 100644 rtos/pmsis/pmsis_bsp/fs/host_fs/semihost.c create mode 100644 tools/autotiler_v3/DSP_Libraries/MatMulDSP.c create mode 100644 tools/nntool/expressions/symbolic/common/__init__.py delete mode 100644 tools/nntool/expressions/symbolic/kernel_codegen.py delete mode 100644 tools/nntool/expressions/symbolic/q15_quantization/quantized_constant.py create mode 100644 tools/nntool/graph/manipulations/formatter.py create mode 100644 tools/nntool/graph/matches/matchers/batchnorm_to_discrete_ops.py create mode 100644 tools/nntool/graph/matches/matchers/expand_to_reshape.py create mode 100644 tools/nntool/graph/matches/matchers/fuse_batchnorm.py create mode 100644 tools/nntool/importer/onnx/handlers/backend/range.py create mode 100644 tools/nntool/importer/onnx/handlers/backend/scatternd.py create mode 100644 tools/nntool/importer/onnx/handlers/backend/thresholded_relu.py create mode 100644 tools/nntool/importer/onnx/handlers/backend/upsample.py create mode 100644 tools/nntool/quantization/float/quantizers/input_float.py create mode 100644 tools/nntool/utils/random_iter.py delete mode 100755 utils/openocd_tools/gap_bins/gap_flasher-gap9_evk-fpga.elf delete mode 100755 utils/openocd_tools/gap_bins/gap_flasher-gap9_evk-mram.elf delete mode 100755 utils/openocd_tools/gap_bins/gap_flasher-gap9_evk.elf delete mode 100755 utils/openocd_tools/gap_bins/gap_flasher-gap9_v2.elf delete mode 100755 utils/openocd_tools/src/fuser/gap9-efuse-gen delete mode 100644 utils/openocd_tools/tcl/gap9reva.tcl delete mode 100644 utils/openocd_tools/tcl/gap9revb-bootmode.tcl delete mode 100644 utils/openocd_tools/tcl/gap9revb.tcl delete mode 100644 utils/openocd_tools/tcl/gap9revb_gdb.tcl diff --git a/configs/openocd.sh b/configs/openocd.sh index ff88497ee..61566bc8d 100644 --- a/configs/openocd.sh +++ b/configs/openocd.sh @@ -9,3 +9,7 @@ else fi export PATH=$GAP_SDK_HOME/install/workstation/openocd/bin:$PATH + +# Path to openocd scripts +export OPENOCD_SCRIPTS=$GAP_SDK_HOME/utils/openocd_tools + diff --git a/examples/pmsis/bsp/ble/ble_nina_b112/gaptest.yml b/examples/pmsis/bsp/ble/ble_nina_b112/gaptest.yml new file mode 100644 index 000000000..d822d0849 --- /dev/null +++ b/examples/pmsis/bsp/ble/ble_nina_b112/gaptest.yml @@ -0,0 +1,17 @@ +name: ble_nina_b112 +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap8 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true diff --git a/examples/pmsis/bsp/ble/ble_read_test/gaptest.yml b/examples/pmsis/bsp/ble/ble_read_test/gaptest.yml new file mode 100644 index 000000000..42f5e834a --- /dev/null +++ b/examples/pmsis/bsp/ble/ble_read_test/gaptest.yml @@ -0,0 +1,17 @@ +name: ble_read_test +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap8 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true diff --git a/examples/pmsis/bsp/blink_led/gaptest.yml b/examples/pmsis/bsp/blink_led/gaptest.yml new file mode 100644 index 000000000..0c9b4f4fd --- /dev/null +++ b/examples/pmsis/bsp/blink_led/gaptest.yml @@ -0,0 +1,17 @@ +name: blink_led +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap8 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true diff --git a/examples/pmsis/bsp/cameras/camera_ir_thermeye/always_on/gaptest.yml b/examples/pmsis/bsp/cameras/camera_ir_thermeye/always_on/gaptest.yml new file mode 100644 index 000000000..650f15570 --- /dev/null +++ b/examples/pmsis/bsp/cameras/camera_ir_thermeye/always_on/gaptest.yml @@ -0,0 +1,25 @@ +name: camera_ir_thermeye_always_on +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap8 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true + async: + name: async + tags: + - integration + - release + duration: standard + flags: ASYNC=1 + compile_only: true diff --git a/examples/pmsis/bsp/cameras/camera_ir_thermeye/lower_power_mode/gaptest.yml b/examples/pmsis/bsp/cameras/camera_ir_thermeye/lower_power_mode/gaptest.yml new file mode 100644 index 000000000..42151ac50 --- /dev/null +++ b/examples/pmsis/bsp/cameras/camera_ir_thermeye/lower_power_mode/gaptest.yml @@ -0,0 +1,25 @@ +name: camera_ir_thermeye_low_power_mode +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap8 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true + async: + name: async + tags: + - integration + - release + duration: standard + flags: ASYNC=1 + compile_only: true diff --git a/examples/pmsis/bsp/cameras/test_camera_gc0308/gaptest.yml b/examples/pmsis/bsp/cameras/test_camera_gc0308/gaptest.yml new file mode 100644 index 000000000..4392330e0 --- /dev/null +++ b/examples/pmsis/bsp/cameras/test_camera_gc0308/gaptest.yml @@ -0,0 +1,17 @@ +name: camera_gc0308 +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap8 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true diff --git a/examples/pmsis/bsp/cameras/test_camera_io/gaptest.yml b/examples/pmsis/bsp/cameras/test_camera_io/gaptest.yml new file mode 100644 index 000000000..15922f463 --- /dev/null +++ b/examples/pmsis/bsp/cameras/test_camera_io/gaptest.yml @@ -0,0 +1,25 @@ +name: camera_io +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap8 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true + async: + name: async + tags: + - integration + - release + duration: standard + flags: ASYNC=1 + compile_only: true diff --git a/examples/pmsis/bsp/cameras/test_camera_lcd/gaptest.yml b/examples/pmsis/bsp/cameras/test_camera_lcd/gaptest.yml new file mode 100644 index 000000000..6c0f08da0 --- /dev/null +++ b/examples/pmsis/bsp/cameras/test_camera_lcd/gaptest.yml @@ -0,0 +1,25 @@ +name: camera_lcd +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap8 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true + async: + name: async + tags: + - integration + - release + duration: standard + flags: ASYNC=1 + compile_only: true diff --git a/examples/pmsis/bsp/cameras/test_camera_ov5640/gaptest.yml b/examples/pmsis/bsp/cameras/test_camera_ov5640/gaptest.yml new file mode 100644 index 000000000..93049af03 --- /dev/null +++ b/examples/pmsis/bsp/cameras/test_camera_ov5640/gaptest.yml @@ -0,0 +1,17 @@ +name: camera_ov5640 +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap8 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true diff --git a/examples/pmsis/bsp/cameras/test_camera_ov7670/gaptest.yml b/examples/pmsis/bsp/cameras/test_camera_ov7670/gaptest.yml new file mode 100644 index 000000000..35f06b52a --- /dev/null +++ b/examples/pmsis/bsp/cameras/test_camera_ov7670/gaptest.yml @@ -0,0 +1,17 @@ +name: camera_ov7670 +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap8 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true diff --git a/examples/pmsis/bsp/cameras/test_camera_ov7670/ov7670_config.h b/examples/pmsis/bsp/cameras/test_camera_ov7670/ov7670_config.h old mode 100755 new mode 100644 diff --git a/examples/pmsis/bsp/cameras/test_camera_pixart/gaptest.yml b/examples/pmsis/bsp/cameras/test_camera_pixart/gaptest.yml new file mode 100644 index 000000000..d496534f3 --- /dev/null +++ b/examples/pmsis/bsp/cameras/test_camera_pixart/gaptest.yml @@ -0,0 +1,25 @@ +name: camera_pixart +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap8 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true + async: + name: async + tags: + - integration + - release + duration: standard + flags: ASYNC=1 + compile_only: true diff --git a/examples/pmsis/bsp/cameras/test_camera_stream/gaptest.yml b/examples/pmsis/bsp/cameras/test_camera_stream/gaptest.yml new file mode 100644 index 000000000..fea31f653 --- /dev/null +++ b/examples/pmsis/bsp/cameras/test_camera_stream/gaptest.yml @@ -0,0 +1,17 @@ +name: camera_stream +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap8 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true diff --git a/examples/pmsis/bsp/filesystem/fs_to_l3_copy/gaptest.yml b/examples/pmsis/bsp/filesystem/fs_to_l3_copy/gaptest.yml new file mode 100644 index 000000000..10d486d39 --- /dev/null +++ b/examples/pmsis/bsp/filesystem/fs_to_l3_copy/gaptest.yml @@ -0,0 +1,18 @@ +name: fs_to_l3_copy +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap8 + - gap9 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true diff --git a/examples/pmsis/bsp/filesystem/littlefs/native_lfs/gaptest.yml b/examples/pmsis/bsp/filesystem/littlefs/native_lfs/gaptest.yml new file mode 100644 index 000000000..aba58f9e7 --- /dev/null +++ b/examples/pmsis/bsp/filesystem/littlefs/native_lfs/gaptest.yml @@ -0,0 +1,18 @@ +name: littlefs_native_lfs +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap8 + - gap9 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true diff --git a/examples/pmsis/bsp/filesystem/readfs/gaptest.yml b/examples/pmsis/bsp/filesystem/readfs/gaptest.yml new file mode 100644 index 000000000..64fe4a473 --- /dev/null +++ b/examples/pmsis/bsp/filesystem/readfs/gaptest.yml @@ -0,0 +1,18 @@ +name: readfs +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap8 + - gap9 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true diff --git a/examples/pmsis/bsp/flash/hyper_flash/gaptest.yml b/examples/pmsis/bsp/flash/hyper_flash/gaptest.yml new file mode 100644 index 000000000..b2eb78659 --- /dev/null +++ b/examples/pmsis/bsp/flash/hyper_flash/gaptest.yml @@ -0,0 +1,26 @@ +name: hyper_flash +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap8 + - gap9 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true + async: + name: async + tags: + - integration + - release + duration: standard + flags: ASYNC=1 + compile_only: true diff --git a/examples/pmsis/bsp/flash/hyper_flash_multi_thread/gaptest.yml b/examples/pmsis/bsp/flash/hyper_flash_multi_thread/gaptest.yml new file mode 100644 index 000000000..81e854c32 --- /dev/null +++ b/examples/pmsis/bsp/flash/hyper_flash_multi_thread/gaptest.yml @@ -0,0 +1,25 @@ +name: hyper_flash_multi_thread +platforms: + - gvsoc +os: + - freertos +chips: + - gap8 + - gap9 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true + async: + name: async + tags: + - integration + - release + duration: standard + flags: ASYNC=1 + compile_only: true diff --git a/examples/pmsis/bsp/lcd/gapuino_himax_with_lcd/gaptest.yml b/examples/pmsis/bsp/lcd/gapuino_himax_with_lcd/gaptest.yml new file mode 100644 index 000000000..98de5fade --- /dev/null +++ b/examples/pmsis/bsp/lcd/gapuino_himax_with_lcd/gaptest.yml @@ -0,0 +1,17 @@ +name: gapuino_himax_with_lcd +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap8 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true diff --git a/examples/pmsis/bsp/microphones/vesper/vm3011_wakeup/gaptest.yml b/examples/pmsis/bsp/microphones/vesper/vm3011_wakeup/gaptest.yml new file mode 100644 index 000000000..edfb6290f --- /dev/null +++ b/examples/pmsis/bsp/microphones/vesper/vm3011_wakeup/gaptest.yml @@ -0,0 +1,17 @@ +name: microphones_vesper_vm3011_wakeup +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap8 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true diff --git a/examples/pmsis/bsp/ram/hyper_ram/gaptest.yml b/examples/pmsis/bsp/ram/hyper_ram/gaptest.yml new file mode 100644 index 000000000..2539ec88b --- /dev/null +++ b/examples/pmsis/bsp/ram/hyper_ram/gaptest.yml @@ -0,0 +1,26 @@ +name: hyper_ram +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap8 + - gap9 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true + async: + name: async + tags: + - integration + - release + duration: standard + flags: ASYNC=1 + compile_only: true diff --git a/examples/pmsis/bsp/ram/hyper_ram_flash/gaptest.yml b/examples/pmsis/bsp/ram/hyper_ram_flash/gaptest.yml new file mode 100644 index 000000000..387122e40 --- /dev/null +++ b/examples/pmsis/bsp/ram/hyper_ram_flash/gaptest.yml @@ -0,0 +1,26 @@ +name: hyper_ram_flash +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap8 + - gap9 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true + async: + name: async + tags: + - integration + - release + duration: standard + flags: ASYNC=1 + compile_only: true diff --git a/examples/pmsis/bsp/ram/hyper_ram_multi_thread/gaptest.yml b/examples/pmsis/bsp/ram/hyper_ram_multi_thread/gaptest.yml new file mode 100644 index 000000000..f0c34f889 --- /dev/null +++ b/examples/pmsis/bsp/ram/hyper_ram_multi_thread/gaptest.yml @@ -0,0 +1,25 @@ +name: hyper_ram_multi_thread +platforms: + - gvsoc +os: + - freertos +chips: + - gap8 + - gap9 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true + async: + name: async + tags: + - integration + - release + duration: standard + flags: ASYNC=1 + compile_only: true diff --git a/examples/pmsis/bsp/wifi/nina_b112_example/gaptest.yml b/examples/pmsis/bsp/wifi/nina_b112_example/gaptest.yml new file mode 100644 index 000000000..67a08ccad --- /dev/null +++ b/examples/pmsis/bsp/wifi/nina_b112_example/gaptest.yml @@ -0,0 +1,17 @@ +name: wifi_nina_b112 +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap8 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true diff --git a/examples/pmsis/features/aes128_sw/gaptest.yml b/examples/pmsis/features/aes128_sw/gaptest.yml new file mode 100644 index 000000000..ec524aa63 --- /dev/null +++ b/examples/pmsis/features/aes128_sw/gaptest.yml @@ -0,0 +1,17 @@ +name: aes128_sw +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap8 + - gap9 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ diff --git a/examples/pmsis/features/aes128_sw/main.c b/examples/pmsis/features/aes128_sw/main.c index 8514d59c0..6f12a2188 100644 --- a/examples/pmsis/features/aes128_sw/main.c +++ b/examples/pmsis/features/aes128_sw/main.c @@ -1,16 +1,12 @@ #include "pmsis.h" #include "AesLib.h" -#define TEST_BUFF_SIZE (40600) +#define TEST_BUFF_SIZE (40600) #define TEST_KEY_HI (0x1122334455667788) #define TEST_KEY_LO (0x9900AABBCCDDEEFF) #define TEST_IV (0x1122334455667788) -#if defined (__PULP_OS__) -RT_FC_DATA aes_data_t aes_data; -#else -GAP_FC_DATA aes_data_t aes_data; -#endif +PI_FC_L1 aes_data_t aes_data; static void load_key(unsigned char * key, unsigned char * iv) { @@ -58,7 +54,7 @@ void aes128() pi_perf_start(); cycles[0] = pi_perf_read(PI_PERF_CYCLES); - + AesBuildLUT(&aes_data); pi_perf_stop(); @@ -77,7 +73,7 @@ void aes128() cycles[3] = pi_perf_read(PI_PERF_CYCLES); for(int i=0 ; i - - -static int entry() -{ - printf("Entering main controller\n"); - -#ifdef EFUSE_WRITE - printf("Writing efuse 50 with value 0x12\n"); - - // Before writing the efuse, we must activate the program operation - // Once activated, we can wrote as many efuses as we want - plp_efuse_startProgram(); - - plp_efuse_writeByte(80, 0x12); - - // Close the current operation once done - plp_efuse_sleep(); -#else - printf("Efuse has not been written, recompile with make clean all run EFUSE_WRITE=1, be careful that this is a permanent operation !!!\n"); -#endif - - - // Before reading the efuse, we must activate the read operation - // Once activated, we can wrote as many efuses as we want - plp_efuse_startRead(); - - int value = plp_efuse_readWord(80); - - // Close the current operation once done - plp_efuse_sleep(); - - printf("Read efuse 50: 0x%x\n", value); - - return 0; -} - - -static void pmsis_wrapper(void) -{ - int retval = entry(); - pmsis_exit(retval); -} - - -int main(void) -{ - return pmsis_kickoff((void *)pmsis_wrapper); -} - diff --git a/examples/pmsis/features/helloworld_cxx/gaptest.yml b/examples/pmsis/features/helloworld_cxx/gaptest.yml new file mode 100644 index 000000000..7d9864113 --- /dev/null +++ b/examples/pmsis/features/helloworld_cxx/gaptest.yml @@ -0,0 +1,16 @@ +name: helloworld_cxx +platforms: + - gvsoc +os: + - freertos +chips: + - gap8 + - gap9 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ diff --git a/examples/pmsis/features/hyper_ram_delegate/gaptest.yml b/examples/pmsis/features/hyper_ram_delegate/gaptest.yml new file mode 100644 index 000000000..811611f76 --- /dev/null +++ b/examples/pmsis/features/hyper_ram_delegate/gaptest.yml @@ -0,0 +1,26 @@ +name: hyper_ram_delegate +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap8 + - gap9 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true + async: + name: async + tags: + - integration + - release + duration: standard + flags: ASYNC=1 + compile_only: true diff --git a/examples/pmsis/features/test_malloc/gaptest.yml b/examples/pmsis/features/test_malloc/gaptest.yml new file mode 100644 index 000000000..85043c25c --- /dev/null +++ b/examples/pmsis/features/test_malloc/gaptest.yml @@ -0,0 +1,17 @@ +name: test_malloc +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap8 + - gap9 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ diff --git a/examples/pmsis/features/uart_delegate/gaptest.yml b/examples/pmsis/features/uart_delegate/gaptest.yml new file mode 100644 index 000000000..008a9e7a5 --- /dev/null +++ b/examples/pmsis/features/uart_delegate/gaptest.yml @@ -0,0 +1,18 @@ +name: uart_delegate +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap8 + - gap9 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true diff --git a/examples/pmsis/helloworld/gaptest.yml b/examples/pmsis/helloworld/gaptest.yml new file mode 100644 index 000000000..6bedf8220 --- /dev/null +++ b/examples/pmsis/helloworld/gaptest.yml @@ -0,0 +1,18 @@ +name: helloworld +platforms: + - gvsoc + - board +os: + - freertos + - pulpos +chips: + - gap8 + - gap9 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ diff --git a/examples/pmsis/periph/dmacpy/gaptest.yml b/examples/pmsis/periph/dmacpy/gaptest.yml new file mode 100644 index 000000000..67cd62962 --- /dev/null +++ b/examples/pmsis/periph/dmacpy/gaptest.yml @@ -0,0 +1,26 @@ +name: dmacpy +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap8 + - gap9 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true + async: + name: async + tags: + - integration + - release + duration: standard + flags: ASYNC=1 + compile_only: true diff --git a/examples/pmsis/periph/gpio/gpio_input/gaptest.yml b/examples/pmsis/periph/gpio/gpio_input/gaptest.yml new file mode 100644 index 000000000..0cb0c762c --- /dev/null +++ b/examples/pmsis/periph/gpio/gpio_input/gaptest.yml @@ -0,0 +1,18 @@ +name: gpio_input +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap8 + - gap9 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true diff --git a/examples/pmsis/periph/gpio/gpio_input/gpio.c b/examples/pmsis/periph/gpio/gpio_input/gpio.c index 0c3005e75..80f4de0ae 100644 --- a/examples/pmsis/periph/gpio/gpio_input/gpio.c +++ b/examples/pmsis/periph/gpio/gpio_input/gpio.c @@ -6,6 +6,15 @@ /* PMSIS includes */ #include "pmsis.h" +/* Defines */ +#if defined(__GAP8__) +#define GPIO_PIN (PI_GPIO_A0_PAD_12_A3) +#elif defined(__GAP9__) +#define GPIO_PIN (PI_GPIO_A68) +#else +#error "Unknown chip" +#endif + /* Variables used. */ struct pi_device gpio; @@ -34,7 +43,7 @@ void test_gpio(void) } pi_task_t cb_gpio; - pi_gpio_e gpio_in = PI_GPIO_A0_PAD_12_A3; + pi_gpio_e gpio_in = GPIO_PIN; pi_gpio_notif_e irq_type = PI_GPIO_NOTIF_RISE; pi_gpio_flags_e cfg_flags = PI_GPIO_INPUT|PI_GPIO_PULL_DISABLE|PI_GPIO_DRIVE_STRENGTH_LOW; diff --git a/examples/pmsis/periph/gpio/gpio_irq_cb/gaptest.yml b/examples/pmsis/periph/gpio/gpio_irq_cb/gaptest.yml new file mode 100644 index 000000000..ead916f96 --- /dev/null +++ b/examples/pmsis/periph/gpio/gpio_irq_cb/gaptest.yml @@ -0,0 +1,18 @@ +name: gpio_irq_cb +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap8 + - gap9 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true diff --git a/examples/pmsis/periph/gpio/gpio_irq_cb/gpio.c b/examples/pmsis/periph/gpio/gpio_irq_cb/gpio.c index 1b6a64a26..851226b49 100644 --- a/examples/pmsis/periph/gpio/gpio_irq_cb/gpio.c +++ b/examples/pmsis/periph/gpio/gpio_irq_cb/gpio.c @@ -6,6 +6,15 @@ /* PMSIS includes */ #include "pmsis.h" +/* Defines */ +#if defined(__GAP8__) +#define GPIO_PIN (PI_GPIO_A0_PAD_12_A3) +#elif defined(__GAP9__) +#define GPIO_PIN (PI_GPIO_A68) +#else +#error "Unknown chip" +#endif + /* Variables used. */ struct pi_device gpio; @@ -51,7 +60,7 @@ void test_gpio(void) pmsis_exit(errors); } - pi_gpio_e gpio_in = PI_GPIO_A0_PAD_12_A3; + pi_gpio_e gpio_in = GPIO_PIN; pi_gpio_notif_e irq_type = PI_GPIO_NOTIF_RISE; pi_gpio_flags_e cfg_flags = PI_GPIO_INPUT|PI_GPIO_PULL_DISABLE|PI_GPIO_DRIVE_STRENGTH_LOW; diff --git a/examples/pmsis/periph/gpio/gpio_output/gaptest.yml b/examples/pmsis/periph/gpio/gpio_output/gaptest.yml new file mode 100644 index 000000000..8bc059d75 --- /dev/null +++ b/examples/pmsis/periph/gpio/gpio_output/gaptest.yml @@ -0,0 +1,18 @@ +name: gpio_output +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap8 + - gap9 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true diff --git a/examples/pmsis/periph/gpio/gpio_output/gpio.c b/examples/pmsis/periph/gpio/gpio_output/gpio.c index 5aeb07ffd..850f22ef2 100644 --- a/examples/pmsis/periph/gpio/gpio_output/gpio.c +++ b/examples/pmsis/periph/gpio/gpio_output/gpio.c @@ -6,6 +6,26 @@ /* PMSIS includes */ #include "pmsis.h" +/* Defines */ +#if defined(__GAP8__) + +#define GPIO_PAD1 (PI_PAD_12_A3_RF_PACTRL0) +#define GPIO_PIN1 (PI_GPIO_A0_PAD_12_A3) + +#define GPIO_PAD2 (PI_PAD_15_B1_RF_PACTRL3) +#define GPIO_PIN2 (PI_GPIO_A3_PAD_15_B1) + +#elif defined(__GAP9__) +#define GPIO_PAD1 (PI_PAD_068) +#define GPIO_PIN1 (PI_GPIO_A68) + +#define GPIO_PAD2 (PI_PAD_086) +#define GPIO_PIN2 (PI_GPIO_A86) + +#else +#error "Unknown chip" +#endif + #define DELAY_MS 500 /* Variables used. */ @@ -19,12 +39,12 @@ void test_gpio(void) uint32_t value = 0; //Setting pad to alternate 1 //GPIO A1 - pi_pad_set_function(PI_PAD_12_A3_RF_PACTRL0, PI_PAD_12_A3_GPIO_A0_FUNC1); + pi_pad_set_function(GPIO_PAD1, PI_PAD_FUNC1); //GPIO LED (A3) - pi_pad_set_function(PI_PAD_15_B1_RF_PACTRL3, PI_PAD_FUNC1); - - pi_gpio_e gpio_out_a1 = PI_GPIO_A0_PAD_12_A3; - pi_gpio_e gpio_out_led = PI_GPIO_A3_PAD_15_B1; + pi_pad_set_function(GPIO_PAD2, PI_PAD_FUNC1); + + pi_gpio_e gpio_out_a1 = GPIO_PIN1; + pi_gpio_e gpio_out_led = GPIO_PIN2; /* Configure gpio output. */ pi_gpio_flags_e cfg_flags = PI_GPIO_OUTPUT; diff --git a/examples/pmsis/periph/i2c/i2c_bmp280/gaptest.yml b/examples/pmsis/periph/i2c/i2c_bmp280/gaptest.yml new file mode 100644 index 000000000..964cb67c7 --- /dev/null +++ b/examples/pmsis/periph/i2c/i2c_bmp280/gaptest.yml @@ -0,0 +1,18 @@ +name: i2c_bmp280 +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap8 + - gap9 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true diff --git a/examples/pmsis/periph/i2c/i2c_detect/gaptest.yml b/examples/pmsis/periph/i2c/i2c_detect/gaptest.yml new file mode 100644 index 000000000..88c99bd11 --- /dev/null +++ b/examples/pmsis/periph/i2c/i2c_detect/gaptest.yml @@ -0,0 +1,17 @@ +name: i2c_detect +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap8 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true diff --git a/examples/pmsis/periph/i2c/i2c_eeprom_pulp_fmc/gaptest.yml b/examples/pmsis/periph/i2c/i2c_eeprom_pulp_fmc/gaptest.yml new file mode 100644 index 000000000..2acc38e5e --- /dev/null +++ b/examples/pmsis/periph/i2c/i2c_eeprom_pulp_fmc/gaptest.yml @@ -0,0 +1,17 @@ +name: i2c_eeprom_pulp_fmc +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap9 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true diff --git a/examples/pmsis/periph/i2c/i2c_scan/gaptest.yml b/examples/pmsis/periph/i2c/i2c_scan/gaptest.yml new file mode 100644 index 000000000..208865a38 --- /dev/null +++ b/examples/pmsis/periph/i2c/i2c_scan/gaptest.yml @@ -0,0 +1,17 @@ +name: i2c_scan +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap9 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true diff --git a/examples/pmsis/periph/i2c/i2c_slave/gaptest.yml b/examples/pmsis/periph/i2c/i2c_slave/gaptest.yml new file mode 100644 index 000000000..251436da8 --- /dev/null +++ b/examples/pmsis/periph/i2c/i2c_slave/gaptest.yml @@ -0,0 +1,17 @@ +name: i2c_slave_loopback +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap9 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true diff --git a/examples/pmsis/periph/i2s/pcm/gaptest.yml b/examples/pmsis/periph/i2s/pcm/gaptest.yml new file mode 100644 index 000000000..bbdd53305 --- /dev/null +++ b/examples/pmsis/periph/i2s/pcm/gaptest.yml @@ -0,0 +1,18 @@ +name: i2s_pcm +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap8 + - gap9 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true diff --git a/examples/pmsis/periph/i2s/pdm/gaptest.yml b/examples/pmsis/periph/i2s/pdm/gaptest.yml new file mode 100644 index 000000000..4cb332ece --- /dev/null +++ b/examples/pmsis/periph/i2s/pdm/gaptest.yml @@ -0,0 +1,18 @@ +name: i2s_pdm +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap8 + - gap9 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true diff --git a/examples/pmsis/periph/i2s/pdm_4mic/gaptest.yml b/examples/pmsis/periph/i2s/pdm_4mic/gaptest.yml new file mode 100644 index 000000000..cd88be255 --- /dev/null +++ b/examples/pmsis/periph/i2s/pdm_4mic/gaptest.yml @@ -0,0 +1,18 @@ +name: i2s_pdm_4mic +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap8 + - gap9 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true diff --git a/examples/pmsis/periph/i2s/pdm_async/gaptest.yml b/examples/pmsis/periph/i2s/pdm_async/gaptest.yml new file mode 100644 index 000000000..3d99bb3f0 --- /dev/null +++ b/examples/pmsis/periph/i2s/pdm_async/gaptest.yml @@ -0,0 +1,18 @@ +name: i2s_pdm_async +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap8 + - gap9 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true diff --git a/examples/pmsis/periph/i2s/wav_out/gaptest.yml b/examples/pmsis/periph/i2s/wav_out/gaptest.yml new file mode 100644 index 000000000..e91dfe000 --- /dev/null +++ b/examples/pmsis/periph/i2s/wav_out/gaptest.yml @@ -0,0 +1,18 @@ +name: i2s_wav_out +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap8 + - gap9 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true diff --git a/examples/pmsis/periph/i2s/wav_out_long/gaptest.yml b/examples/pmsis/periph/i2s/wav_out_long/gaptest.yml new file mode 100644 index 000000000..d9ddabd7a --- /dev/null +++ b/examples/pmsis/periph/i2s/wav_out_long/gaptest.yml @@ -0,0 +1,18 @@ +name: i2s_wav_out_long +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap8 + - gap9 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true diff --git a/examples/pmsis/periph/i2s/wav_out_one_shot/gaptest.yml b/examples/pmsis/periph/i2s/wav_out_one_shot/gaptest.yml new file mode 100644 index 000000000..6cc8975f6 --- /dev/null +++ b/examples/pmsis/periph/i2s/wav_out_one_shot/gaptest.yml @@ -0,0 +1,18 @@ +name: i2s_wav_out_one_shot +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap8 + - gap9 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true diff --git a/examples/pmsis/periph/perf/gaptest.yml b/examples/pmsis/periph/perf/gaptest.yml new file mode 100644 index 000000000..d7a791e20 --- /dev/null +++ b/examples/pmsis/periph/perf/gaptest.yml @@ -0,0 +1,17 @@ +name: perf +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap8 + - gap9 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ diff --git a/examples/pmsis/periph/pwm/gaptest.yml b/examples/pmsis/periph/pwm/gaptest.yml new file mode 100644 index 000000000..fa57415f0 --- /dev/null +++ b/examples/pmsis/periph/pwm/gaptest.yml @@ -0,0 +1,18 @@ +name: pwm +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap8 + - gap9 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true diff --git a/examples/pmsis/periph/rtc/rtc_alarm/gaptest.yml b/examples/pmsis/periph/rtc/rtc_alarm/gaptest.yml new file mode 100644 index 000000000..44cb70c4c --- /dev/null +++ b/examples/pmsis/periph/rtc/rtc_alarm/gaptest.yml @@ -0,0 +1,18 @@ +name: rtc_alarm +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap8 + - gap9 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true diff --git a/examples/pmsis/periph/rtc/rtc_calendar/gaptest.yml b/examples/pmsis/periph/rtc/rtc_calendar/gaptest.yml new file mode 100644 index 000000000..7c35557ff --- /dev/null +++ b/examples/pmsis/periph/rtc/rtc_calendar/gaptest.yml @@ -0,0 +1,18 @@ +name: rtc_calendar +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap8 + - gap9 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true diff --git a/examples/pmsis/periph/rtc/rtc_counter/gaptest.yml b/examples/pmsis/periph/rtc/rtc_counter/gaptest.yml new file mode 100644 index 000000000..ae74bd85d --- /dev/null +++ b/examples/pmsis/periph/rtc/rtc_counter/gaptest.yml @@ -0,0 +1,18 @@ +name: rtc_counter +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap8 + - gap9 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true diff --git a/examples/pmsis/periph/spi/spi_master/gaptest.yml b/examples/pmsis/periph/spi/spi_master/gaptest.yml new file mode 100644 index 000000000..c3ef7ba4f --- /dev/null +++ b/examples/pmsis/periph/spi/spi_master/gaptest.yml @@ -0,0 +1,18 @@ +name: spi_master +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap8 + - gap9 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true diff --git a/examples/pmsis/periph/uart/uart_helloworld/gaptest.yml b/examples/pmsis/periph/uart/uart_helloworld/gaptest.yml new file mode 100644 index 000000000..67a176fa8 --- /dev/null +++ b/examples/pmsis/periph/uart/uart_helloworld/gaptest.yml @@ -0,0 +1,18 @@ +name: uart_helloworld +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap8 + - gap9 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true diff --git a/examples/pmsis/periph/uart/uart_helloworld_timeout/gaptest.yml b/examples/pmsis/periph/uart/uart_helloworld_timeout/gaptest.yml new file mode 100644 index 000000000..df9d7562b --- /dev/null +++ b/examples/pmsis/periph/uart/uart_helloworld_timeout/gaptest.yml @@ -0,0 +1,16 @@ +name: uart_helloworld_timeout +platforms: + - gvsoc +os: + - freertos +chips: + - gap9 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true diff --git a/examples/pmsis/periph/uart/uart_input/gaptest.yml b/examples/pmsis/periph/uart/uart_input/gaptest.yml new file mode 100644 index 000000000..a7e409203 --- /dev/null +++ b/examples/pmsis/periph/uart/uart_input/gaptest.yml @@ -0,0 +1,18 @@ +name: uart_input +platforms: + - gvsoc +os: + - freertos + - pulpos +chips: + - gap8 + - gap9 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true diff --git a/examples/pmsis/periph/uart/uart_input_timeout/gaptest.yml b/examples/pmsis/periph/uart/uart_input_timeout/gaptest.yml new file mode 100644 index 000000000..c49ab3ee9 --- /dev/null +++ b/examples/pmsis/periph/uart/uart_input_timeout/gaptest.yml @@ -0,0 +1,16 @@ +name: uart_input_timeout +platforms: + - gvsoc +os: + - freertos +chips: + - gap9 +variants: + std: + name: standard + tags: + - integration + - release + duration: standard + flags: ~ + compile_only: true diff --git a/gvsoc/gvsoc/models/cpu/iss/include/pulp_v2.hpp b/gvsoc/gvsoc/models/cpu/iss/include/pulp_v2.hpp index 778ab4d58..4d23e13f6 100644 --- a/gvsoc/gvsoc/models/cpu/iss/include/pulp_v2.hpp +++ b/gvsoc/gvsoc/models/cpu/iss/include/pulp_v2.hpp @@ -26,13 +26,13 @@ #define PULPV2_HWLOOP_LPEND0 1 #define PULPV2_HWLOOP_LPCOUNT0 2 -#define PULPV2_HWLOOP_LPSTART1 3 -#define PULPV2_HWLOOP_LPEND1 4 -#define PULPV2_HWLOOP_LPCOUNT1 5 +#define PULPV2_HWLOOP_LPSTART1 4 +#define PULPV2_HWLOOP_LPEND1 5 +#define PULPV2_HWLOOP_LPCOUNT1 6 -#define PULPV2_HWLOOP_LPSTART(x) (PULPV2_HWLOOP_LPSTART0 + (x)*3) -#define PULPV2_HWLOOP_LPEND(x) (PULPV2_HWLOOP_LPEND0 + (x)*3) -#define PULPV2_HWLOOP_LPCOUNT(x) (PULPV2_HWLOOP_LPCOUNT0 + (x)*3) +#define PULPV2_HWLOOP_LPSTART(x) (PULPV2_HWLOOP_LPSTART0 + (x)*4) +#define PULPV2_HWLOOP_LPEND(x) (PULPV2_HWLOOP_LPEND0 + (x)*4) +#define PULPV2_HWLOOP_LPCOUNT(x) (PULPV2_HWLOOP_LPCOUNT0 + (x)*4) static inline iss_insn_t *LB_RR_exec_fast(iss_t *iss, iss_insn_t *insn) { @@ -595,7 +595,7 @@ static inline iss_insn_t *hwloop_check_exec(iss_t *iss, iss_insn_t *insn) static inline void hwloop_set_start(iss_t *iss, iss_insn_t *insn, int index, iss_reg_t start) { iss->cpu.pulpv2.hwloop_regs[PULPV2_HWLOOP_LPSTART(index)] = start; - iss->cpu.state.hwloop_start_insn[index] = insn_cache_get(iss, start); + iss->cpu.state.hwloop_start_insn[index] = insn_cache_get(iss, start); } static inline void hwloop_set_end(iss_t *iss, iss_insn_t *insn, int index, iss_reg_t end) diff --git a/gvsoc/gvsoc/models/cpu/iss/src/csr.cpp b/gvsoc/gvsoc/models/cpu/iss/src/csr.cpp index 8258e80f0..84f4ca5d2 100644 --- a/gvsoc/gvsoc/models/cpu/iss/src/csr.cpp +++ b/gvsoc/gvsoc/models/cpu/iss/src/csr.cpp @@ -940,6 +940,18 @@ static bool hwloop_read(iss_t *iss, int reg, iss_reg_t *value) { static bool hwloop_write(iss_t *iss, int reg, unsigned int value) { iss->cpu.pulpv2.hwloop_regs[reg] = value; + + // Since the HW loop is using decode instruction for the HW loop start to jump faster + // we need to recompute it when it is modified. + if (reg == 0) + { + iss->cpu.state.hwloop_start_insn[0] = insn_cache_get(iss, value); + } + else if (reg == 4) + { + iss->cpu.state.hwloop_start_insn[1] = insn_cache_get(iss, value); + } + return false; } diff --git a/rtos/freeRTOS/freertos_kernel/include/FreeRTOS.h b/rtos/freeRTOS/freertos_kernel/include/FreeRTOS.h index 5e443a629..05f007802 100644 --- a/rtos/freeRTOS/freertos_kernel/include/FreeRTOS.h +++ b/rtos/freeRTOS/freertos_kernel/include/FreeRTOS.h @@ -871,7 +871,7 @@ #endif #ifndef configTASK_NOTIFICATION_ARRAY_ENTRIES - #define configTASK_NOTIFICATION_ARRAY_ENTRIES 1 + #define configTASK_NOTIFICATION_ARRAY_ENTRIES 2 #endif #if configTASK_NOTIFICATION_ARRAY_ENTRIES < 1 diff --git a/rtos/freeRTOS/vendors/gwt/gap8/src/device/system_gap8.c b/rtos/freeRTOS/vendors/gwt/gap8/src/device/system_gap8.c index e2be80db9..b9d56565e 100644 --- a/rtos/freeRTOS/vendors/gwt/gap8/src/device/system_gap8.c +++ b/rtos/freeRTOS/vendors/gwt/gap8/src/device/system_gap8.c @@ -33,7 +33,7 @@ /* PMSIS includes. */ #include "pmsis.h" -#include "../driver/semihost.h" +#include "semihost.h" /* FC & L2 heaps. */ extern char __heapfcram_start; diff --git a/rtos/freeRTOS/vendors/gwt/gap8/include/driver/semihost.h b/rtos/freeRTOS/vendors/gwt/libs/include/semihost.h similarity index 63% rename from rtos/freeRTOS/vendors/gwt/gap8/include/driver/semihost.h rename to rtos/freeRTOS/vendors/gwt/libs/include/semihost.h index fba61196c..81ba11c44 100644 --- a/rtos/freeRTOS/vendors/gwt/gap8/include/driver/semihost.h +++ b/rtos/freeRTOS/vendors/gwt/libs/include/semihost.h @@ -20,6 +20,10 @@ #include #include +#ifdef __cplusplus +extern "C" { +#endif + enum semihosting_operation_numbers { /* * ARM/openocd semihosting operations. @@ -64,7 +68,7 @@ enum semihosting_operation_numbers { #define SEMIHOST_EXIT_SUCCESS 0x20026 #define SEMIHOST_EXIT_ERROR 0x20023 -extern long __syscall_error(long); +//extern long __syscall_error(long); /* riscv semihosting standard: * IN: a0 holds syscall number @@ -101,20 +105,52 @@ __internal_semihost(long n, long _a1) // roughly this is the last stage of printf: // print a string until '\0' -void semihost_write0(const char *print_string); - -int semihost_open(const char *name, int mode); +static inline void semihost_write0(const char *print_string) +{ + __internal_semihost(SEMIHOSTING_SYS_WRITE0, (long) print_string); +} -int semihost_close(int fd); +static inline int semihost_open(const char *name, int mode) +{ + uint32_t len = strlen(name); + volatile uint32_t args[3] = {(uint32_t)name,mode,len}; + return __internal_semihost(SEMIHOSTING_SYS_OPEN, (long) args); +} -int semihost_read(int fd, uint8_t *buffer, int len); +static inline int semihost_close(int fd) +{ + //uint32_t args[3] = {name,mode,len}; + return __internal_semihost(SEMIHOSTING_SYS_CLOSE, (long) fd); +} -int semihost_write(int fd, uint8_t *buffer, int len); +static inline int semihost_read(int fd, uint8_t *buffer, int len) +{ + volatile uint32_t args[3] = {(uint32_t)fd,(uint32_t)buffer,(uint32_t)len}; + return __internal_semihost(SEMIHOSTING_SYS_READ, (long) args); +} -int semihost_seek(int fd, uint32_t pos); +static inline int semihost_write(int fd, uint8_t *buffer, int len) +{ + volatile uint32_t args[3] = {(uint32_t)fd,(uint32_t)buffer,(uint32_t)len}; + return __internal_semihost(SEMIHOSTING_SYS_WRITE, (long) args); +} -int semihost_flen(int fd); +static inline int semihost_seek(int fd, uint32_t pos) +{ + volatile uint32_t args[2] = {(uint32_t)fd,pos}; + return __internal_semihost(SEMIHOSTING_SYS_SEEK, (long) args); +} -int semihost_exit(int code); +static inline int semihost_flen(int fd) +{ + return __internal_semihost(SEMIHOSTING_SYS_FLEN, (long) fd); +} +static inline int semihost_exit(int code) +{ + return __internal_semihost(SEMIHOSTING_SYS_EXIT, (long) code); +} +#ifdef __cplusplus +} +#endif #endif diff --git a/rtos/freeRTOS/vendors/gwt/pmsis/include/pmsis/backend/pmsis_backend_native_task_api.h b/rtos/freeRTOS/vendors/gwt/pmsis/include/pmsis/backend/pmsis_backend_native_task_api.h index 3fc2f7763..7ce9bfd03 100644 --- a/rtos/freeRTOS/vendors/gwt/pmsis/include/pmsis/backend/pmsis_backend_native_task_api.h +++ b/rtos/freeRTOS/vendors/gwt/pmsis/include/pmsis/backend/pmsis_backend_native_task_api.h @@ -154,7 +154,7 @@ static inline int __os_native_api_sync_obj_deinit(void *sync_obj) static inline void __os_native_api_sync_obj_take(void *sync_obj) { - ulTaskNotifyTake(pdTRUE, portMAX_DELAY); + ulTaskNotifyTakeIndexed(1, pdTRUE, portMAX_DELAY); } static inline void __os_native_api_sync_obj_release(void *sync_obj) @@ -162,7 +162,7 @@ static inline void __os_native_api_sync_obj_release(void *sync_obj) uint32_t irq = __disable_irq(); BaseType_t higher_priority_task_woken = pdFALSE; TaskHandle_t task_handler = (TaskHandle_t) sync_obj; - vTaskNotifyGiveFromISR(task_handler, &higher_priority_task_woken); + vTaskNotifyGiveIndexedFromISR(task_handler, 1, &higher_priority_task_woken); portYIELD_FROM_ISR(higher_priority_task_woken); __restore_irq(irq); } diff --git a/rtos/freeRTOS/vendors/gwt/rules/freeRTOS_rules.mk b/rtos/freeRTOS/vendors/gwt/rules/freeRTOS_rules.mk index c2225d9c6..e2e16f5aa 100644 --- a/rtos/freeRTOS/vendors/gwt/rules/freeRTOS_rules.mk +++ b/rtos/freeRTOS/vendors/gwt/rules/freeRTOS_rules.mk @@ -413,7 +413,7 @@ flash: $(BIN) flash_noforce: $(BIN) gapy $(GAPY_TARGET_OPT) --platform=$(platform) --work-dir=$(BUILDDIR) $(config_args) $(gapy_args) run --flash --binary=$(BIN) $(runner_args) -flash_fs: $(BIN) +flash_fs: $(BIN) image gapy $(GAPY_TARGET_OPT) --platform=$(platform) --work-dir=$(BUILDDIR) $(config_args) $(gapy_args) run --flash --binary=$(BIN) $(runner_args) $(WSL_ENV) image: $(BIN) diff --git a/rtos/pmsis/pmsis_bsp/CMakeLists.txt b/rtos/pmsis/pmsis_bsp/CMakeLists.txt index 77c951b92..b2abc381a 100644 --- a/rtos/pmsis/pmsis_bsp/CMakeLists.txt +++ b/rtos/pmsis/pmsis_bsp/CMakeLists.txt @@ -1,5 +1,5 @@ set(BSP_READFS_SRC fs/read_fs/read_fs.c) -set(BSP_HOSTFS_SRC fs/host_fs/semihost.c fs/host_fs/host_fs.c) +set(BSP_HOSTFS_SRC fs/host_fs/host_fs.c) set(BSP_LFS_SRC fs/lfs/lfs.c fs/lfs/lfs_util.c fs/lfs/pi_lfs.c) set(BSP_FS_SRC fs/fs.c) set(BSP_FLASH_SRC diff --git a/rtos/pmsis/pmsis_bsp/flash/mram/mram-v2.c b/rtos/pmsis/pmsis_bsp/flash/mram/mram-v2.c index 6fb99e928..3cddb5001 100644 --- a/rtos/pmsis/pmsis_bsp/flash/mram/mram-v2.c +++ b/rtos/pmsis/pmsis_bsp/flash/mram/mram-v2.c @@ -338,7 +338,9 @@ static int mram_open(struct pi_device *device) // In XIP mode, we need to lock XIP refills to avoid having a read while the flash is doing the program operation. udma_mram_trans_mode_set(base, UDMA_MRAM_TRANS_MODE_AUTO_ENA(1) | UDMA_MRAM_TRANS_MODE_XIP_EN(1) | UDMA_MRAM_TRANS_MODE_XIP_AUTO_HALTED(1)); #else - udma_mram_trans_mode_set(base, UDMA_MRAM_TRANS_MODE_AUTO_ENA(1)); + udma_mram_trans_mode_set(base, UDMA_MRAM_TRANS_MODE_AUTO_ENA(1) + | UDMA_MRAM_TRANS_MODE_XIP_EN(conf->xip_en) + | UDMA_MRAM_TRANS_MODE_XIP_AUTO_HALTED(conf->xip_en)); #endif #ifndef CONFIG_XIP_MRAM @@ -896,4 +898,5 @@ void pi_mram_conf_init(struct pi_mram_conf *conf) conf->flash.api = &mram_api; conf->itf = 0; conf->baudrate = 15000000; + conf->xip_en = 0; } diff --git a/rtos/pmsis/pmsis_bsp/fs/host_fs/semihost.c b/rtos/pmsis/pmsis_bsp/fs/host_fs/semihost.c deleted file mode 100644 index 016237eee..000000000 --- a/rtos/pmsis/pmsis_bsp/fs/host_fs/semihost.c +++ /dev/null @@ -1,50 +0,0 @@ -#include "semihost.h" -#include "string.h" - -// roughly this is the last stage of printf: -// print a string until '\0' -void semihost_write0(const char *print_string) -{ - __internal_semihost(SEMIHOSTING_SYS_WRITE0, (long) print_string); -} - -int semihost_open(const char *name, int mode) -{ - uint32_t len = strlen(name); - volatile uint32_t args[3] = {(uint32_t)name,mode,len}; - return __internal_semihost(SEMIHOSTING_SYS_OPEN, (long) args); -} - -int semihost_close(int fd) -{ - //uint32_t args[3] = {name,mode,len}; - return __internal_semihost(SEMIHOSTING_SYS_CLOSE, (long) fd); -} - -int semihost_read(int fd, uint8_t *buffer, int len) -{ - volatile uint32_t args[3] = {(uint32_t)fd,(uint32_t)buffer,(uint32_t)len}; - return __internal_semihost(SEMIHOSTING_SYS_READ, (long) args); -} - -int semihost_write(int fd, uint8_t *buffer, int len) -{ - volatile uint32_t args[3] = {(uint32_t)fd,(uint32_t)buffer,(uint32_t)len}; - return __internal_semihost(SEMIHOSTING_SYS_WRITE, (long) args); -} - -int semihost_seek(int fd, uint32_t pos) -{ - volatile uint32_t args[2] = {(uint32_t)fd,pos}; - return __internal_semihost(SEMIHOSTING_SYS_SEEK, (long) args); -} - -int semihost_flen(int fd) -{ - return __internal_semihost(SEMIHOSTING_SYS_FLEN, (long) fd); -} - -int semihost_exit(int code) -{ - return __internal_semihost(SEMIHOSTING_SYS_EXIT, (long) code); -} diff --git a/rtos/pmsis/pmsis_bsp/fs/host_fs/semihost.h b/rtos/pmsis/pmsis_bsp/fs/host_fs/semihost.h index fba61196c..4d58a542e 100644 --- a/rtos/pmsis/pmsis_bsp/fs/host_fs/semihost.h +++ b/rtos/pmsis/pmsis_bsp/fs/host_fs/semihost.h @@ -98,23 +98,52 @@ __internal_semihost(long n, long _a1) #endif } - // roughly this is the last stage of printf: // print a string until '\0' -void semihost_write0(const char *print_string); +static inline void semihost_write0(const char *print_string) +{ + __internal_semihost(SEMIHOSTING_SYS_WRITE0, (long) print_string); +} -int semihost_open(const char *name, int mode); +static inline int semihost_open(const char *name, int mode) +{ + uint32_t len = strlen(name); + volatile uint32_t args[3] = {(uint32_t)name,mode,len}; + return __internal_semihost(SEMIHOSTING_SYS_OPEN, (long) args); +} -int semihost_close(int fd); +static inline int semihost_close(int fd) +{ + //uint32_t args[3] = {name,mode,len}; + return __internal_semihost(SEMIHOSTING_SYS_CLOSE, (long) fd); +} -int semihost_read(int fd, uint8_t *buffer, int len); +static inline int semihost_read(int fd, uint8_t *buffer, int len) +{ + volatile uint32_t args[3] = {(uint32_t)fd,(uint32_t)buffer,(uint32_t)len}; + return __internal_semihost(SEMIHOSTING_SYS_READ, (long) args); +} -int semihost_write(int fd, uint8_t *buffer, int len); +static inline int semihost_write(int fd, uint8_t *buffer, int len) +{ + volatile uint32_t args[3] = {(uint32_t)fd,(uint32_t)buffer,(uint32_t)len}; + return __internal_semihost(SEMIHOSTING_SYS_WRITE, (long) args); +} -int semihost_seek(int fd, uint32_t pos); +static inline int semihost_seek(int fd, uint32_t pos) +{ + volatile uint32_t args[2] = {(uint32_t)fd,pos}; + return __internal_semihost(SEMIHOSTING_SYS_SEEK, (long) args); +} -int semihost_flen(int fd); +static inline int semihost_flen(int fd) +{ + return __internal_semihost(SEMIHOSTING_SYS_FLEN, (long) fd); +} -int semihost_exit(int code); +static inline int semihost_exit(int code) +{ + return __internal_semihost(SEMIHOSTING_SYS_EXIT, (long) code); +} #endif diff --git a/rtos/pmsis/pmsis_bsp/include/bsp/flash/mram.h b/rtos/pmsis/pmsis_bsp/include/bsp/flash/mram.h index 4e57bc943..face1328e 100644 --- a/rtos/pmsis/pmsis_bsp/include/bsp/flash/mram.h +++ b/rtos/pmsis/pmsis_bsp/include/bsp/flash/mram.h @@ -49,6 +49,7 @@ struct pi_mram_conf int itf; /*!< Mram interface where the flash is connected. */ int baudrate; /*!< Baudrate in byte/s. */ + int xip_en; }; /** \brief Initialize an Mram configuration with default values. diff --git a/rtos/pmsis/pmsis_bsp/src.mk b/rtos/pmsis/pmsis_bsp/src.mk index 505fe287f..326ee544c 100644 --- a/rtos/pmsis/pmsis_bsp/src.mk +++ b/rtos/pmsis/pmsis_bsp/src.mk @@ -1,5 +1,5 @@ BSP_READFS_SRC = fs/read_fs/read_fs.c -BSP_HOSTFS_SRC = fs/host_fs/semihost.c fs/host_fs/host_fs.c +BSP_HOSTFS_SRC = fs/host_fs/host_fs.c BSP_LFS_SRC = fs/lfs/lfs.c fs/lfs/lfs_util.c fs/lfs/pi_lfs.c BSP_FS_SRC = fs/fs.c BSP_FLASH_SRC = flash/flash.c partition/partition.c partition/flash_partition.c \ diff --git a/rtos/pmsis/pmsis_bsp/zephyr/CMakeLists.txt b/rtos/pmsis/pmsis_bsp/zephyr/CMakeLists.txt index 69a891dcc..dcf7d9e70 100644 --- a/rtos/pmsis/pmsis_bsp/zephyr/CMakeLists.txt +++ b/rtos/pmsis/pmsis_bsp/zephyr/CMakeLists.txt @@ -8,7 +8,6 @@ zephyr_sources( ../fs/read_fs/read_fs.c ../fs/fs.c ../fs/host_fs/host_fs.c - ../fs/host_fs/semihost.c ../flash/flash.c ../flash/hyperflash/hyperflash.c ../ram/ram.c @@ -20,4 +19,4 @@ zephyr_compile_options( -DCONFIG_GAPUINO ) -zephyr_include_directories(../include) \ No newline at end of file +zephyr_include_directories(../include) diff --git a/rtos/pmsis/pmsis_implem/chips/gap9/drivers/i2c/i2c.c b/rtos/pmsis/pmsis_implem/chips/gap9/drivers/i2c/i2c.c index 566c8c84a..7bad66e79 100644 --- a/rtos/pmsis/pmsis_implem/chips/gap9/drivers/i2c/i2c.c +++ b/rtos/pmsis/pmsis_implem/chips/gap9/drivers/i2c/i2c.c @@ -342,7 +342,7 @@ static int __pi_i2c_prepare_write_read_buf(i2c_slave_data_t *slave_data, buffer[index++] = I2C_CMD_LEAD_START(1); buffer[index++] = I2C_CMD_LEAD_SEND_IMM(slave_data->slave_addrh|1); } - buffer[index++] = I2C_CMD_RPT(size1); + buffer[index++] = I2C_CMD_RPT(size1-1); // receive -1 byte because there is a "last" buffer[index++] = I2C_CMD_MISC_RECEIVE(1); buffer[index++] = I2C_CMD_MISC_RECEIVE_LAST(1); diff --git a/tools/autotiler_v3/Autotiler/AutoTilerLibTypes.h b/tools/autotiler_v3/Autotiler/AutoTilerLibTypes.h index e3d807233..4f4395b0d 100644 --- a/tools/autotiler_v3/Autotiler/AutoTilerLibTypes.h +++ b/tools/autotiler_v3/Autotiler/AutoTilerLibTypes.h @@ -49,6 +49,7 @@ typedef enum { KOP_DP_REDUCT_NOSCALE, KOP_DP_REDUCT_CHW2HWC, KOP_DP_REDUCT_IO, + KOP_DP_REDUCT_IO_NOSCALE, KOP_DP_REDUCT_MULBIAS, KOP_DP_REDUCT_IO_MULBIAS, KOP_DP_REDUCT_MULBIAS_SCALAR, diff --git a/tools/autotiler_v3/CNN_Generators/CNN_Copy_Generators.c b/tools/autotiler_v3/CNN_Generators/CNN_Copy_Generators.c index a6030494d..0f69bba89 100644 --- a/tools/autotiler_v3/CNN_Generators/CNN_Copy_Generators.c +++ b/tools/autotiler_v3/CNN_Generators/CNN_Copy_Generators.c @@ -721,6 +721,8 @@ static int CNN_MatTranspose_Internal( add_kernel_arg_func_t AddKArgDimFunc = AddKernelArgDim; cnn_kernel_arg_datatype_func_t CNN_ArgDtype = CNN_ArgDataType; + if (Size < 0) CNN_ArgDtype = CNN_ArgDataTypeUns; + if (Ctrl) { if (Ctrl->TileOrientation != -1) TileOrientation = (Ctrl->TileOrientation==0)?TILE_HOR:TILE_VER; if (Ctrl->ParallelFeatures != -1) ParFeat = Ctrl->ParallelFeatures; @@ -731,6 +733,7 @@ static int CNN_MatTranspose_Internal( if (HWC) { return CNN_3DTensorPermute(Name, Ctrl, Feat, Size, Width, Height, KOP_MATPERM_HWC2WHC); } + if (Size < 0) Size = -Size; unsigned long long int LayerOp = Width*Height*Feat*Size; unsigned long long int LayerBandwidth = 0; @@ -890,6 +893,11 @@ int CNN_3DTensorPermute( add_kernel_arg_func_t AddKArgDimFunc = AddKernelArgDim; cnn_kernel_arg_datatype_func_t CNN_ArgDtype = CNN_ArgDataType; + if (Size < 0) { + CNN_ArgDtype = CNN_ArgDataTypeUns; + Size = -Size; + } + if (Ctrl) { if (Ctrl->HWC != -1) HWC = Ctrl->HWC; if (Ctrl->FloatDump != -1&&Ctrl->FloatDump) AddKArgDimFunc = AddKernelFloatArgDim; diff --git a/tools/autotiler_v3/CNN_Generators_NE16/CNN_Generators_NE16.c b/tools/autotiler_v3/CNN_Generators_NE16/CNN_Generators_NE16.c index ef93bf8b1..0edf74202 100644 --- a/tools/autotiler_v3/CNN_Generators_NE16/CNN_Generators_NE16.c +++ b/tools/autotiler_v3/CNN_Generators_NE16/CNN_Generators_NE16.c @@ -316,8 +316,6 @@ Kernel_T *CNN_MM_ConvolutionNE16( char *ConvKerName=0, *PoolKerName=0, *ActKerName=0, *SetBiasKerName=0, *DPReductionKerName=0; int NeedFcx, NeedFcy, NeedDcx, NeedDcy, NeedScx, NeedScy, NeedFpx, NeedFpy, NeedDpx, NeedDpy, NeedSpx, NeedSpy; int UsedWidth, UsedHeight, UsedWc, UsedHc; - - unsigned int InTileCons = 16; int OutTileCons = 32; int StandAloneAct = (ActOper!=KOP_NONE); unsigned long long int LayerOp = 0; @@ -331,11 +329,18 @@ Kernel_T *CNN_MM_ConvolutionNE16( if (!(ActOper == KOP_NONE || ActOper == KOP_RELU || ActOper == KOP_RELUN || ActOper == KOP_RELUM || ActOper == KOP_HSIGMOID || ActOper == KOP_HSWISH || ActOper == KOP_LEAKYRELU || ActOper == KOP_SIGMOID || ActOper == KOP_TANH)) GenTilingError("CNN_MM_ConvolutionNE16 Kernel: %s, ActOper, expecting KOP_NONE, KOP_RELU, KOP_RELUN, KOP_RELUM, KOP_HSIGMOID, KOP_HSWISH, KOP_LEAKYRELU, KOP_SIGMOID or KOP_TANH", Name); - Wa |= O_NE16_LIN | O_LINEAR; + Wa |= O_NE16_LIN | O_LINEAR; + int Mode16 = (Abs(In_DataSize) == 2); + if (Mode16) { + Wa |= O_NE16_MODE16; + } + + unsigned int InTileCons = Mode16?8:16; + int NeedSetBias = Mode16; /* When there is a special activation (not supported by the accelerator itself), you need to streamout 32bits and do the act in the cluster but the ((*S) >> N) is done in the accelerator (KOP_DP_REDUCT_NOSCALE) */ int NeedReductNoScale = !(ActOper == KOP_RELU || ActOper == KOP_NONE); /* Also when in/out are 16bits you need to streamout 32bits but here the reduction step will be done in the cluster (KOP_DP_REDUCT) */ - int NeedReductScale = Abs(In_DataSize) == 2; + int NeedReductScale = Mode16; int NeedReduct = NeedReductNoScale || NeedReductScale; CNN_LayerOutputDim(Width, Height, ConvOper, Fcx, Fcy, Dcx, Dcy, Scx, Scy, ConvPad, PoolOper, Fpx, Fpy, Dpx, Dpy, Spx, Spy, PoolPad, @@ -376,26 +381,38 @@ Kernel_T *CNN_MM_ConvolutionNE16( ConvKerName = CNN_FindMatchingKernelAttr(KOP_MM_CONV, KOP_NONE, ParFeat, CALL_NE16_KER, Abs(In_DataSize), Abs(Out_DataSize), Bias_DataSize, 0, 4, Fcx, Fcy, Dcx, Dcy, Scx, Scy, &NeedFcx, &NeedFcy, &NeedDcx, &NeedDcy, &NeedScx, &NeedScy, 0); - if (ConvKerName==0) GenTilingError("CNN_MM_ConvolutionNE16 Kernel: %s, Can't find a matching Convolution basic kernel", Name); - if (PoolOper==KOP_MAXPOOL) { - PoolKerName = CNN_FindMatchingKernelAttr(PoolOper, KOP_NONE, 1, CALL_HWC_KER, In_DataSize, 0, 0, 0, Out_DataSize, Fpx, Fpy, Dpx, Dpy, Spx, Spy, + if (ConvKerName==0) GenTilingError("CNN_ConvolutionPoolAct_NE16 Kernel: %s, Can't find a matching Convolution basic kernel", Name); + + if (PoolOper==KOP_MAXPOOL || PoolOper==KOP_AVGPOOL) { + PoolKerName = CNN_FindMatchingKernelAttr(PoolOper, NeedReduct?KOP_NONE:ActOper, 1, CALL_HWC_KER, In_DataSize, 0, 0, 0, Out_DataSize, Fpx, Fpy, Dpx, Dpy, Spx, Spy, &NeedFpx, &NeedFpy, &NeedDpx, &NeedDpy, &NeedSpx, &NeedSpy, 0); - if (PoolKerName==0) GenTilingError("CNN_MM_ConvolutionNE16 Kernel: %s, Can't find a matching Pooling basic kernel", Name); + if (PoolKerName==0) GenTilingError("CNN_ConvolutionPoolAct_NE16 Kernel: %s, Can't find a matching Pooling basic kernel", Name); + if (NeedReduct) { + DPReductionKerName = CNN_FindMatchingKernelAttr(NeedReductScale?KOP_DP_REDUCT_IO:KOP_DP_REDUCT_IO_NOSCALE, ActOper, 1, CALL_HWC_KER, + 4, 0, 0, 0, Out_DataSize, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + if (DPReductionKerName==0) GenTilingError("CNN_ConvolutionPoolAct_NE16 Kernel: %s, Can't find a matching Reduction basic kernel %d %s", Name, Out_DataSize, NeedReductNoScale?"NoScale":"Scale"); + } + + } else if (NeedReduct) { + DPReductionKerName = CNN_FindMatchingKernelAttr(NeedReductScale?KOP_DP_REDUCT:KOP_DP_REDUCT_NOSCALE, ActOper, 1, CALL_HWC_KER, + 4, 0, 0, 0, Out_DataSize, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + if (DPReductionKerName==0) GenTilingError("CNN_ConvolutionPoolAct_NE16 Kernel: %s, Can't find a matching Reduction basic kernel %d %s", Name, Out_DataSize, NeedReductNoScale?"NoScale":"Scale"); } - if (NeedReduct) { - DPReductionKerName = CNN_FindMatchingKernelAttr(NeedReductNoScale?KOP_DP_REDUCT_NOSCALE:KOP_DP_REDUCT, ActOper, 1, CALL_HWC_KER, 4, 0, 0, 0, Out_DataSize, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); - if (DPReductionKerName==0) GenTilingError("CNN_MM_ConvolutionNE16 Kernel: %s, Can't find a matching Reduction basic kernel %d", Name, Out_DataSize); + if (NeedSetBias) { + SetBiasKerName = CNN_FindMatchingKernelAttr(KOP_SETBIAS, KOP_NONE, ParFeat, CALL_HWC_KER, Bias_DataSize,0,0,0,4, 0,0,0,0,0,0, 0,0,0,0,0,0, 0); + if (SetBiasKerName==0) GenTilingError("CNN_ConvolutionPoolAct_NE16 Kernel: %s, Can't find a matching SetBias basic kernel", Name); } + // If pooling you need an extra buffer for convout but reduction can be done in the accelerator - int NeedConvout = NeedReduct || PoolKerName; + int NeedConvout = NeedReduct || NeedSetBias || PoolKerName; unsigned int Cos = NeedConvout?4:1; if (Log) { printf("InFeat: %d%s, OutFeat: %d, InFeatCons: %d\n", InFeat, " Im2Col", OutFeat, InTileCons); printf("Conv => W: %4d, Pad:[%d,%d] PadT:[%d,%d] => Wc: %d, Filter:[%d,%d]x%d Bits\n", Width, PadInc[0], PadInc[1], PadIncT[0], PadIncT[1], Wc, Fcx, Fcy, Filter_DataSizeBits); printf(" => H: %4d, Pad:[%d,%d] PadT:[%d,%d] => Hc: %d\n", Height, PadInc[2], PadInc[3], PadIncT[2], PadIncT[3], Hc); - printf(" ConvOut_DataSize: %d\n", Cos); - printf("Pool => Wc: %4d, Pad:[%d,%d] => Wo: %d, Filter:[%d,%d]\n", UsedWc, PadInp[0], PadInp[1], Wo, Fpx, Fpy); + printf("%s -- >ConvOut_DataSize: %d\n", NeedConvout?"NeedConvOut":"NoConvOut", Cos); + printf("Pool => Wc: %4d, Pad:[%d,%d] => Wo: %d, Filter:[%d,%d] %d\n", UsedWc, PadInp[0], PadInp[1], Wo, Fpx, Fpy, Mode16); printf(" => Hc: %4d, Pad:[%d,%d] => Ho: %d\n", UsedHc, PadInp[2], PadInp[3], Ho); printf("OverlapC: %d\n", OverlapC); printf("OverlapP: %d\n", OverlapP); @@ -406,15 +423,14 @@ Kernel_T *CNN_MM_ConvolutionNE16( if (DPReductionKerName) printf("%20s: %s\n", "DPReductionKerName", DPReductionKerName); if (PoolKerName) printf("%20s: %s\n", "PoolKerName", PoolKerName); printf("Nb Oper : %lld\n", LayerOp); - printf("NeedConvout: %d\n", NeedConvout); + } /* User kernel C arguments */ CKernel_Arg_T **KCArgs = AllocateCArgs(7); Kernel_T *Kernel; - int StreamoutMode = 1; // Streamout = apply *Scale >> ScaleN - int Mode16 = (Abs(In_DataSize) == 2); - int Streamin = 0; // Streamin initialized at 0, set to 1 in the basic kernel if multiple chin tile + int StreamoutMode = !Mode16; // Streamout = apply *Scale >> ScaleN + int Streamin = Mode16; // Streamin initialized at 0, set to 1 in the basic kernel if multiple chin tile int FilterMode = 3; int LinearMode = 1; int StridedMode = 0; @@ -424,7 +440,7 @@ Kernel_T *CNN_MM_ConvolutionNE16( int QuantBits = (NeedReduct)?2:(Abs(Out_DataSize)==2?1:0); // 00: 8bit, 01: 16bit, 10: 32bit --> If tiling the channel input dimension you need to streamin (need 32 bits output) int QuantNoRect = (NeedReduct || (Out_DataSize>0))?1:0; int NormShift = 1; - int NormBias = 1; + int NormBias = !Mode16; unsigned int DEFAULT_NE16_JOB_CFG = NE16_DefaultConfig(Filter_DataSizeBits, Mode16, StreamoutMode, FilterMode, LinearMode, StridedMode, NormBits, Streamin, \ WOffsetCfg, QuantRightShift, QuantBits, QuantNoRect, NormShift, NormBias); @@ -440,9 +456,19 @@ Kernel_T *CNN_MM_ConvolutionNE16( TCArg(CNN_ArgDataType(1, 1,1), "ScaleN"), TCArg(CNN_ArgDataType(1, 1,1), "Infos") ), - Calls(6, + Calls(7, Call("NE16_Enable", LOC_D1_PROLOG, Bindings(0)), Call("NE16_SoftReset", LOC_D0, Bindings(0)), + SetBiasKerName?Call(SetBiasKerName, LOC_D0, + Bindings(6, + K_Arg("ConvOut", KER_ARG_TILE), /* SetBias output tile */ + K_Arg("ConvOut", KER_ARG_TILE_W), /* SetBias output tile width */ + K_Arg("ConvOut", KER_ARG_TILE_H), /* SetBias output tile height */ + ParFeat?K_ArgPar("ConvOut", KER_ARG_PARTILE_SIZE, D1):Imm(1), /* Number of output features in this tile */ + K_Arg("Bias", KER_ARG_TILE), /* SetBias Bias tile */ + K_TileOper("Infos", "char *", '@', AT_INF_BIASN) /* Bias Norm */ + ) + ):AT_NO_CALL, Call(ConvKerName, LOC_D0, Bindings(28, K_Arg("In", KER_ARG_TILE), /* Conv input tile */ @@ -452,11 +478,11 @@ Kernel_T *CNN_MM_ConvolutionNE16( K_Arg(NeedConvout?"ConvOut":"Out", KER_ARG_TILE), /* Conv output */ K_Arg("Scale", KER_ARG_TILE), /* Per channel scale tile */ K_Arg("ScaleN", KER_ARG_TILE), /* Per channel scale normalization tile */ - K_ArgPar("In", KER_ARG_PARTILE_SIZE, D0), /* Number of input features in this tile */ - K_ArgPar("In", KER_ARG_LOADEDPARTILE_SIZE, D0), /* Total Number of loaded input features in case of promotion */ + K_ArgPar("In", KER_ARG_PARTILE_SIZE, D0), /* Number of input features in this tile */ + K_ArgPar("In", KER_ARG_LOADEDPARTILE_SIZE, D0), /* Total Number of loaded input features in case of promotion */ K_Arg("In", KER_ARG_TILE_H), /* Conv input tile height */ K_Arg("In", KER_ARG_TILE_W), /* Conv input tile width */ - K_ArgPar(NeedConvout?"ConvOut":"Out", KER_ARG_PARTILE_SIZE, D1), /* Number of output features in this tile */ + K_ArgPar(NeedConvout?"ConvOut":"Out", KER_ARG_PARTILE_SIZE, D1), /* Number of output features in this tile */ K_Arg(NeedConvout?"ConvOut":"Out", KER_ARG_TILE_H), K_Arg(NeedConvout?"ConvOut":"Out", KER_ARG_TILE_W), Imm(PadValue), @@ -490,7 +516,7 @@ Kernel_T *CNN_MM_ConvolutionNE16( ), (PoolKerName==0)?AT_NO_CALL: Call(PoolKerName, LOC_D0_EPILOG, - Bindings(13, + Bindings(14, K_Arg("ConvOut", KER_ARG_TILE), K_Arg("ConvOut", KER_ARG_TILE_W), K_Arg("ConvOut", KER_ARG_TILE_H), @@ -503,22 +529,23 @@ Kernel_T *CNN_MM_ConvolutionNE16( K_Arg("Out", KER_ARG_TILE), /* Pooling output tile */ K_ArgPar("ConvOut", KER_ARG_PARTILE_SIZE, D1), /* In Features */ K_Arg("Out", KER_ARG_TILE_W), /* Output tile width */ - K_Arg("Out", KER_ARG_TILE_H) /* Output tile height */ + K_Arg("Out", KER_ARG_TILE_H), /* Output tile height */ + K_Arg("Infos", KER_ARG_TILE) /* Infos */ ) ), Call("NE16_Disable", LOC_D1_EPILOG, Bindings(0)) ), KerArgs(9, - KerArgPV("In", KerArgSpace(2,T0,D0), O_IN|O_DB|O_HWC, Width, Height, UsedWidth, UsedHeight, PadIncT, PadInc, PadValue, Abs(In_DataSize), OverlapC, 0, 0, "In"), - KerArg ("ColBuff",KerArgSpace(1,T0), O_BUFF|O_NTILED, BuffS, 1, 1, 0, 0, 0, 0), - KerArg ("Bias", KerArgSpace(1,D1), O_IN|O_DB|O_CONST, 1, 1, Bs, 0, 0, 0, "Bias"), - KerArg ("Scale", KerArgSpace(1,D1), O_IN|O_DB|O_CONST, 1, 1, 1, 0, 0, 0, "Scale"), - KerArg ("ScaleN", KerArgSpace(1,D1), O_IN|O_DB|O_CONST, 1, 1, 1, 0, 0, 0, "ScaleN"), - KerArg ("Filter", KerArgSpace(1,D1), O_IN|O_DB|O_CONST|Wa, 1, WBuffSize, Ws, 0, 0, 0, "Filter"), + KerArgPV("In", KerArgSpace(2,T0,D0), O_IN|O_DB|O_HWC, Width, Height, UsedWidth, UsedHeight, PadIncT, PadInc, PadValue, Abs(In_DataSize), OverlapC, 0, 0, "In"), + KerArg ("ColBuff",KerArgSpace(1,T0), O_BUFF|O_NTILED, BuffS, 1, 1, 0, 0, 0, 0), + KerArg ("Bias", KerArgSpace(1,D1), O_IN|O_DB|O_CONST, 1, 1, Bs, 0, 0, 0, "Bias"), + KerArg ("Scale", KerArgSpace(1,D1), O_IN|O_DB|O_CONST, 1, 1, 1, 0, 0, 0, "Scale"), + KerArg ("ScaleN", KerArgSpace(1,D1), O_IN|O_DB|O_CONST, 1, 1, 1, 0, 0, 0, "ScaleN"), + KerArg ("Filter", KerArgSpace(1,D1), O_IN|O_DB|O_CONST|Wa, 1, WBuffSize, Ws, 0, 0, 0, "Filter"), NeedConvout? - KerArgP("ConvOut",KerArgSpace(2,T0,D1), O_BUFF|O_ONETILE|O_HWC,Wc, Hc, UsedWc, UsedHc, PadInp, PadInp, Cos, OverlapP, 0, 0, ""):AT_NO_KER_ARG, - KerArg ("Out", KerArgSpace(2,T0,D1), O_OUT|O_DB|O_HWC, Wo, Ho, Abs(Out_DataSize), 0, 0, 0, "Out"), - KerArg ("Infos", KerArgSpace(1,T0), O_IN|O_BUFF|O_NTILED|O_CONST, AT_INF_NE16_DIM, 1, 1, 0, 0, 0, "Infos") + KerArgP("ConvOut",KerArgSpace(2,T0,D1), O_BUFF|O_ONETILE|O_HWC,Wc, Hc, UsedWc, UsedHc, PadInp, PadInp, Cos, OverlapP, 0, 0, ""):AT_NO_KER_ARG, + KerArg ("Out", KerArgSpace(2,T0,D1), O_OUT|O_DB|O_HWC, Wo, Ho, Abs(Out_DataSize), 0, 0, 0, "Out"), + KerArg ("Infos", KerArgSpace(1,T0), O_IN|O_BUFF|O_NTILED|O_CONST, AT_INF_NE16_DIM,1, 1, 0, 0, 0, "Infos") ) ); if (Kernel) { @@ -680,14 +707,18 @@ static Kernel_T *CNN_ConvolutionNE16_Internal( ConvKerName = CNN_FindMatchingKernelAttr(ConvOper, KOP_NONE, ParFeat, CALL_NE16_KER, Abs(In_DataSize), Abs(Out_DataSize), Bias_DataSize, 0, 4, Fcx, Fcy, Dcx, Dcy, Scx, Scy, &NeedFcx, &NeedFcy, &NeedDcx, &NeedDcy, &NeedScx, &NeedScy, 0); if (ConvKerName==0) GenTilingError("CNN_ConvolutionPoolAct_NE16 Kernel: %s, Can't find a matching Convolution basic kernel", Name); - int BasicNE16Mode = 0; - // if ((Fcx==1 && Fcy==1) || (Fcx==3 && Fcy==3 && Scx==1 && Scy==1)) {BasicNE16Mode = 1; printf("BASIC MODE\n");} + if (PoolOper==KOP_MAXPOOL || PoolOper==KOP_AVGPOOL) { - PoolKerName = CNN_FindMatchingKernelAttr(PoolOper, KOP_NONE, 1, CALL_HWC_KER, In_DataSize, 0, 0, 0, Out_DataSize, Fpx, Fpy, Dpx, Dpy, Spx, Spy, + PoolKerName = CNN_FindMatchingKernelAttr(PoolOper, NeedReduct?KOP_NONE:ActOper, 1, CALL_HWC_KER, In_DataSize, 0, 0, 0, Out_DataSize, Fpx, Fpy, Dpx, Dpy, Spx, Spy, &NeedFpx, &NeedFpy, &NeedDpx, &NeedDpy, &NeedSpx, &NeedSpy, 0); if (PoolKerName==0) GenTilingError("CNN_ConvolutionPoolAct_NE16 Kernel: %s, Can't find a matching Pooling basic kernel", Name); - } - if (NeedReduct) { + if (NeedReduct) { + DPReductionKerName = CNN_FindMatchingKernelAttr(NeedReductScale?KOP_DP_REDUCT_IO:KOP_DP_REDUCT_IO_NOSCALE, ActOper, 1, CALL_HWC_KER, + 4, 0, 0, 0, Out_DataSize, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + if (DPReductionKerName==0) GenTilingError("CNN_ConvolutionPoolAct_NE16 Kernel: %s, Can't find a matching Reduction basic kernel %d %s", Name, Out_DataSize, NeedReductNoScale?"NoScale":"Scale"); + } + + } else if (NeedReduct) { DPReductionKerName = CNN_FindMatchingKernelAttr(NeedReductScale?KOP_DP_REDUCT:KOP_DP_REDUCT_NOSCALE, ActOper, 1, CALL_HWC_KER, 4, 0, 0, 0, Out_DataSize, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); if (DPReductionKerName==0) GenTilingError("CNN_ConvolutionPoolAct_NE16 Kernel: %s, Can't find a matching Reduction basic kernel %d %s", Name, Out_DataSize, NeedReductNoScale?"NoScale":"Scale"); @@ -698,7 +729,7 @@ static Kernel_T *CNN_ConvolutionNE16_Internal( } // If pooling you need an extra buffer for convout but reduction can be done in the accelerator - int NeedConvout = NeedReduct || PoolKerName || NeedSetBias; + int NeedConvout = NeedReduct || NeedSetBias || PoolKerName; unsigned int Cos = NeedConvout?4:1; if (Log) { @@ -750,7 +781,7 @@ static Kernel_T *CNN_ConvolutionNE16_Internal( KCArgs[Ca++] = TCArg(CNN_ArgDataType(1, 1,1), "Infos"); /* User kernel kernel arguments */ - Object_T **KArgs = AllocateKerArgs(NeedConvout?(PoolKerName?9:8):7); + Object_T **KArgs = AllocateKerArgs(NeedConvout?8:7); int Ka=0; KArgs[Ka++] = KerArgPV("In", KerArgSpace(2,T0,D0), O_IN|O_DB|O_HWC, Width, Height, UsedWidth, UsedHeight, PadIncT, PadInc, PadValue, Abs(In_DataSize), OverlapC, 0, TileCons, "In"); if (MinTileDim && (MinTileDim > TileCons)) SetKerArgMinTileSize(KArgs[Ka-1], MinTileDim); @@ -764,8 +795,6 @@ static Kernel_T *CNN_ConvolutionNE16_Internal( } if (NeedConvout) KArgs[Ka++] = KerArgP("ConvOut",KerArgSpace(2,T0,Os), O_BUFF|O_ONETILE|O_HWC, Wc, Hc, UsedWc, UsedHc, PadInp, PadInp, Cos, OverlapP, 0, 0, ""); - if (NeedConvout && PoolKerName) - KArgs[Ka++] = KerArgP("ActOut", KerArgSpace(2,T0,Os), O_BUFF|O_ONETILE|O_HWC, Wc, Hc, UsedWc, UsedHc, PadInp, PadInp, 1, OverlapP, 0, 0, ""); KArgs[Ka++] = KerArg ("Out", KerArgSpace(2,T0,Os), O_OUT|O_DB|O_HWC, Wo, Ho, Abs(Out_DataSize),0,0, 0, "Out"); KArgs[Ka++] = KerArg ("Infos", KerArgSpace(1,T0), O_IN|O_BUFF|O_NTILED|O_CONST, AT_INF_NE16_DIM, 1, 1, 0, 0, 0, "Infos"); @@ -776,34 +805,9 @@ static Kernel_T *CNN_ConvolutionNE16_Internal( KernelIterSpace(3, IterParSpace(D1, OutFeat, OutTileCons), IterTiledSpace(T0), IterParSpace(D0|InFeatProp, InFeat, InTileCons))), TileOrientation|TILE_HWC, KCArgs, - Calls(10, + Calls(8, Call("NE16_Enable", DWConv?LOC_D0_PROLOG:LOC_D1_PROLOG, Bindings(0)), - BasicNE16Mode?Call("NE16_SoftReset", DWConv?LOC_D0_PROLOG:LOC_D1_PROLOG, Bindings(0)):AT_NO_CALL, - BasicNE16Mode?Call("NE16_PrepareJob", DWConv?LOC_D0_PROLOG:LOC_D1_PROLOG, - Bindings(21, - K_Arg("In", KER_ARG_FIRST_TILE), - K_Arg("In", KER_ARG_FIRST_TILE_W), - K_Arg("In", KER_ARG_FIRST_TILE_H), - K_Arg("In", KER_ARG_FIRST_TILE_PAD), - K_Arg("Filter", KER_ARG_FIRST_TILE), - K_Arg("Bias", KER_ARG_FIRST_TILE), - K_Arg("Out", KER_ARG_FIRST_TILE), - K_Arg("Scale", KER_ARG_FIRST_TILE), - K_Arg("ScaleN", KER_ARG_FIRST_TILE), - K_Arg("Out", KER_ARG_FIRST_TILE_W), - K_Arg("Out", KER_ARG_FIRST_TILE_H), - K_ArgPar("In", KER_ARG_PARTILE_SIZE, D0), - K_ArgPar(NeedConvout?"ConvOut":"Out", KER_ARG_FIRST_PARTILE_SIZE, Os), - Imm(Filter_DataSizeBits), - Imm(DEFAULT_NE16_JOB_CFG), - K_TileOper("Infos", "int *", '@', AT_INF_NE16_WOFFSET/4), - Imm(PadValue), - Imm(1), - K_ArgParOper("In", KER_ARG_PARTILE_DIM, D0, '=', 1), - Imm(0), - Imm(0) - ) - ):AT_NO_CALL, + Call("NE16_SoftReset", DWConv?LOC_D0_PROLOG:LOC_D1_PROLOG, Bindings(0)), SetBiasKerName?Call(SetBiasKerName, DWConv?LOC_LOOP:LOC_D0, Bindings(6, K_Arg("ConvOut", KER_ARG_TILE), /* SetBias output tile */ @@ -815,8 +819,8 @@ static Kernel_T *CNN_ConvolutionNE16_Internal( ) ):AT_NO_CALL, Call("NE16_SoftReset", DWConv?LOC_LOOP:LOC_D0, Bindings(0)), - Call(BasicNE16Mode?"NE16_FireJob":ConvKerName, DWConv?LOC_LOOP:LOC_D0, - Bindings(BasicNE16Mode?0:26, + Call(ConvKerName, DWConv?LOC_LOOP:LOC_D0, + Bindings(26, K_Arg("In", KER_ARG_TILE), /* Conv input tile */ K_Arg("Filter", KER_ARG_TILE), /* Conv filter */ K_Arg("Bias", KER_ARG_TILE), /* Conv Bias when depth wise conv*/ @@ -827,7 +831,7 @@ static Kernel_T *CNN_ConvolutionNE16_Internal( K_ArgPar("Filter", KER_ARG_LOADEDPARTILE_SIZE, D0), /* Total Number of loaded input features in case of promotion */ K_Arg("In", KER_ARG_TILE_H), /* Conv input tile height */ K_Arg("In", KER_ARG_TILE_W), /* Conv input tile width */ - K_ArgPar(NeedConvout?"ConvOut":"Out", KER_ARG_PARTILE_SIZE, Os), /* Number of output features in this tile */ + K_ArgPar(NeedConvout?"ConvOut":"Out", KER_ARG_PARTILE_SIZE, Os), /* Number of output features in this tile */ K_Arg(NeedConvout?"ConvOut":"Out", KER_ARG_TILE_H), K_Arg(NeedConvout?"ConvOut":"Out", KER_ARG_TILE_W), Imm(PadValue), @@ -845,36 +849,11 @@ static Kernel_T *CNN_ConvolutionNE16_Internal( NeedDcy?Imm(Dcy):AT_IGNORE_ARG_BINDING /* Pooling Dy */ ) ), - BasicNE16Mode?Call("NE16_PrepareJob", DWConv?LOC_LOOP:LOC_D0, - Bindings(21, - K_Arg("In", KER_ARG_NEXT_TILE), - K_Arg("In", KER_ARG_NEXT_TILE_W), - K_Arg("In", KER_ARG_NEXT_TILE_H), - K_Arg("In", KER_ARG_NEXT_TILE_PAD), - K_Arg("Filter", KER_ARG_NEXT_TILE), - K_Arg("Bias", KER_ARG_NEXT_TILE), - K_Arg("Out", KER_ARG_NEXT_TILE), - K_Arg("Scale", KER_ARG_NEXT_TILE), - K_Arg("ScaleN", KER_ARG_NEXT_TILE), - K_Arg("Out", KER_ARG_NEXT_TILE_W), - K_Arg("Out", KER_ARG_NEXT_TILE_H), - K_ArgPar("In", KER_ARG_NEXT_PARTILE_SIZE, D0), - K_ArgPar(NeedConvout?"ConvOut":"Out", KER_ARG_NEXT_PARTILE_SIZE, Os), - Imm(Filter_DataSizeBits), - Imm(DEFAULT_NE16_JOB_CFG), - K_TileOper("Infos", "int *", '@', AT_INF_NE16_WOFFSET/4), - Imm(PadValue), - K_ArgPred("In", KER_ARG_TILEFIRST, D0), - K_ArgPred("In", KER_ARG_NEXT_TILELAST, D0), - K_ArgPred("In", KER_ARG_NEXT_TILELAST, T0), - Imm(0) - ) - ):AT_NO_CALL, (NeedReduct==0)?AT_NO_CALL: - Call(DPReductionKerName, DWConv?LOC_LOOP_EPILOG:LOC_D0_EPILOG, /* DP Reduction also take care of optional activation */ + Call(DPReductionKerName, DWConv?LOC_LOOP_EPILOG:LOC_D0_EPILOG, /* DPReduction also take care of optional activation */ Bindings(8, K_Arg("ConvOut", KER_ARG_TILE), /* Double precision input tile */ - K_Arg(PoolOper?"ActOut":"Out", KER_ARG_TILE), /* Single precision output tile, warning use IO kernel when In=Out */ + K_Arg(PoolOper?"ConvOut":"Out", KER_ARG_TILE), /* Single precision output tile, warning use IO kernel when In=Out */ ParFeat?K_ArgPar("ConvOut", KER_ARG_PARTILE_SIZE, Os):Imm(1), /* Input tile Number of features */ K_Arg("ConvOut", KER_ARG_TILE_W), /* Input tile width */ K_Arg("ConvOut", KER_ARG_TILE_H), /* Input tile height */ @@ -885,20 +864,21 @@ static Kernel_T *CNN_ConvolutionNE16_Internal( ), (PoolKerName==0)?AT_NO_CALL: Call(PoolKerName, DWConv?LOC_LOOP:LOC_D0_EPILOG, - Bindings(13, - K_Arg(NeedReduct?"ActOut":"ConvOut", KER_ARG_TILE), - K_Arg(NeedReduct?"ActOut":"ConvOut", KER_ARG_TILE_W), - K_Arg(NeedReduct?"ActOut":"ConvOut", KER_ARG_TILE_H), + Bindings(14, + K_Arg("ConvOut", KER_ARG_TILE), + K_Arg("ConvOut", KER_ARG_TILE_W), + K_Arg("ConvOut", KER_ARG_TILE_H), NeedFpx?Imm(Fpx):AT_IGNORE_ARG_BINDING, /* Pool Fx */ NeedFpy?Imm(Fpy):AT_IGNORE_ARG_BINDING, /* Pool Fy */ NeedSpx?Imm(Spx):AT_IGNORE_ARG_BINDING, /* Pool Stridex */ NeedSpy?Imm(Spy):AT_IGNORE_ARG_BINDING, /* Pool Stridey */ - K_ArgPred(NeedReduct?"ActOut":"ConvOut", KER_ARG_TILEFIRST, T0), /* First Tile */ - K_Arg(NeedReduct?"ActOut":"ConvOut", KER_ARG_TILE_PAD), /* Pool Padding */ + K_ArgPred("ConvOut", KER_ARG_TILEFIRST, T0), /* First Tile */ + K_Arg("ConvOut", KER_ARG_TILE_PAD), /* Pool Padding */ K_Arg("Out", KER_ARG_TILE), /* Pooling output tile */ - K_ArgPar(NeedReduct?"ActOut":"ConvOut", KER_ARG_PARTILE_SIZE, D1), /* In Features */ + K_ArgPar("ConvOut", KER_ARG_PARTILE_SIZE, D1), /* In Features */ K_Arg("Out", KER_ARG_TILE_W), /* Output tile width */ - K_Arg("Out", KER_ARG_TILE_H) /* Output tile height */ + K_Arg("Out", KER_ARG_TILE_H), /* Output tile height */ + K_Arg("Infos", KER_ARG_TILE) /* Infos */ ) ), Call("NE16_Disable", DWConv?LOC_D0_EPILOG:LOC_D1_EPILOG, Bindings(0)) @@ -971,6 +951,10 @@ int CNN_ConvolutionNE16( CNN_LinearAct_NE16(Name, Ctrl, In_DataSize, Out_DataSize, Bias_DataSize, Scale_DataSize, Filter_DataSizeBits, InFeat, OutFeat, KOP_LINEAR, ActOper); return 1; } + int HWC = 0; + if (Ctrl) { + if (Ctrl->HWC != -1) HWC = Ctrl->HWC; + } unsigned int MinTile; unsigned int InTileCons; if (PoolOper==KOP_NONE) { @@ -987,6 +971,14 @@ int CNN_ConvolutionNE16( unsigned int Sol1TileCons = TileCons, Sol2TileCons = TileCons; AT_SetKernelCtrl(AT_KERNEL_NOSOLUTION_ERROR, AT_OPT_OFF); + if (HWC) { + printf("---------------------------------------------------------- CNN_ConvolutionNE16 MM ---------------------------------------------------------------------------\n"); + Ker = CNN_MM_ConvolutionNE16(Name, Ctrl, + In_DataSize, Out_DataSize, Bias_DataSize, Scale_DataSize, Filter_DataSizeBits, InFeat, OutFeat, Width, Height, + ConvOper, Fcx, Fcy, Dcx, Dcy, Scx, Scy, ConvPad, PadValue, PoolOper, Fpx, Fpy, Dpx, Dpy, Spx, Spy, PoolPad, ActOper); + if (Ker) return 1; + else printf("---------------------------------------------------------- MM NO SOLUTION FOUND ---------------------------------------------------------------------------\n"); + } printf("----------------------------------------------------------CNN_ConvolutionNE16------------------------------------------------------------------------------\n"); Ker = CNN_ConvolutionNE16_Internal(Name, Ctrl, In_DataSize, Out_DataSize, Bias_DataSize, Scale_DataSize, Filter_DataSizeBits, InFeat, OutFeat, Width, Height, diff --git a/tools/autotiler_v3/CNN_Generators_SQ8/CNN_Generators_SQ8.c b/tools/autotiler_v3/CNN_Generators_SQ8/CNN_Generators_SQ8.c index 44b3c2891..2298074f7 100644 --- a/tools/autotiler_v3/CNN_Generators_SQ8/CNN_Generators_SQ8.c +++ b/tools/autotiler_v3/CNN_Generators_SQ8/CNN_Generators_SQ8.c @@ -104,7 +104,7 @@ void LoadCNN_SQ8_Library() ); LibKernelTemplate("Ker_MM_Pool_SQ8_T", - CArgs(13, + CArgs(14, TCArg("signed char * __restrict__", "In"), TCArg("unsigned short int", "W"), TCArg("unsigned short int", "H"), @@ -117,11 +117,12 @@ void LoadCNN_SQ8_Library() TCArg("signed char * __restrict__", "Out"), TCArg("unsigned short int", "Feat"), TCArg("unsigned short int", "Wo"), - TCArg("unsigned short int", "Ho") + TCArg("unsigned short int", "Ho"), + TCArg("signed char * __restrict__", "Infos") ) ); LibKernelTemplate("Ker_MM_Pool_USQ8_T", - CArgs(13, + CArgs(14, TCArg("unsigned char * __restrict__", "In"), TCArg("unsigned short int", "W"), TCArg("unsigned short int", "H"), @@ -134,7 +135,8 @@ void LoadCNN_SQ8_Library() TCArg("unsigned char * __restrict__", "Out"), TCArg("unsigned short int", "Feat"), TCArg("unsigned short int", "Wo"), - TCArg("unsigned short int", "Ho") + TCArg("unsigned short int", "Ho"), + TCArg("signed char * __restrict__", "Infos") ) ); LibKernelTemplate("KerConvLinReduct_SQ8_T", @@ -558,12 +560,49 @@ void LoadCNN_SQ8_Library() LibKernel("KerParPoolNxMStrideSxSy_ReLUMN_SQ8", CALL_PARALLEL, 0, "KerPool_SQ8_T", CNN_Match(CNN_OperList(2, KOP_MAXPOOL, KOP_AVGPOOL), CNN_OperList(1, KOP_RELUMN), 1, CNN_Type(1,0,0,0,1), -1,-1,1,1,-1,-1)); - LibKernel("KerParMaxPoolNxMStrideSxSy_HWC_SQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "Ker_MM_Pool_SQ8_T", - CNN_Match(CNN_OperList(1, KOP_MAXPOOL), CNN_OperList(1, KOP_NONE), 1, - CNN_Type(1,0,0,0,1), -1,-1,1,1,-1,-1)); - LibKernel("KerParAvgPoolNxMStrideSxSy_HWC_SQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "Ker_MM_Pool_SQ8_T", - CNN_Match(CNN_OperList(1, KOP_AVGPOOL), CNN_OperList(1, KOP_NONE), 1, - CNN_Type(1,0,0,0,1), -1,-1,1,1,-1,-1)); + LibKernel("KerParMaxPoolNxMStrideSxSy_HWC_SQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "Ker_MM_Pool_SQ8_T", CNN_Match(CNN_OperList(1, KOP_MAXPOOL), CNN_OperList(1, KOP_NONE), 1, CNN_Type(1,0,0,0,1), -1,-1,1,1,-1,-1)); + LibKernel("KerParMaxPoolNxMStrideSxSy_HWC_ReLU_SQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "Ker_MM_Pool_SQ8_T", CNN_Match(CNN_OperList(1, KOP_MAXPOOL), CNN_OperList(1, KOP_RELU), 1, CNN_Type(1,0,0,0,1), -1,-1,1,1,-1,-1)); + LibKernel("KerParMaxPoolNxMStrideSxSy_HWC_ReLUN_SQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "Ker_MM_Pool_SQ8_T", CNN_Match(CNN_OperList(1, KOP_MAXPOOL), CNN_OperList(1, KOP_RELUN), 1, CNN_Type(1,0,0,0,1), -1,-1,1,1,-1,-1)); + LibKernel("KerParMaxPoolNxMStrideSxSy_HWC_ReLUM_SQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "Ker_MM_Pool_SQ8_T", CNN_Match(CNN_OperList(1, KOP_MAXPOOL), CNN_OperList(1, KOP_RELUM), 1, CNN_Type(1,0,0,0,1), -1,-1,1,1,-1,-1)); + LibKernel("KerParMaxPoolNxMStrideSxSy_HWC_ReLUMN_SQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "Ker_MM_Pool_SQ8_T", CNN_Match(CNN_OperList(1, KOP_MAXPOOL), CNN_OperList(1, KOP_RELUMN), 1, CNN_Type(1,0,0,0,1), -1,-1,1,1,-1,-1)); + LibKernel("KerParMaxPoolNxMStrideSxSy_HWC_LeakyReLU_SQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "Ker_MM_Pool_SQ8_T", CNN_Match(CNN_OperList(1, KOP_MAXPOOL), CNN_OperList(1, KOP_LEAKYRELU), 1, CNN_Type(1,0,0,0,1), -1,-1,1,1,-1,-1)); + LibKernel("KerParMaxPoolNxMStrideSxSy_HWC_HSwish_SQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "Ker_MM_Pool_SQ8_T", CNN_Match(CNN_OperList(1, KOP_MAXPOOL), CNN_OperList(1, KOP_HSWISH), 1, CNN_Type(1,0,0,0,1), -1,-1,1,1,-1,-1)); + LibKernel("KerParMaxPoolNxMStrideSxSy_HWC_HSigmoid_SQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "Ker_MM_Pool_SQ8_T", CNN_Match(CNN_OperList(1, KOP_MAXPOOL), CNN_OperList(1, KOP_HSIGMOID), 1, CNN_Type(1,0,0,0,1), -1,-1,1,1,-1,-1)); + LibKernel("KerParMaxPoolNxMStrideSxSy_HWC_Sigmoid_SQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "Ker_MM_Pool_SQ8_T", CNN_Match(CNN_OperList(1, KOP_MAXPOOL), CNN_OperList(1, KOP_SIGMOID), 1, CNN_Type(1,0,0,0,1), -1,-1,1,1,-1,-1)); + LibKernel("KerParMaxPoolNxMStrideSxSy_HWC_Tanh_SQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "Ker_MM_Pool_SQ8_T", CNN_Match(CNN_OperList(1, KOP_MAXPOOL), CNN_OperList(1, KOP_TANH), 1, CNN_Type(1,0,0,0,1), -1,-1,1,1,-1,-1)); + + LibKernel("KerParAvgPoolNxMStrideSxSy_HWC_SQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "Ker_MM_Pool_SQ8_T", CNN_Match(CNN_OperList(1, KOP_AVGPOOL), CNN_OperList(1, KOP_NONE), 1, CNN_Type(1,0,0,0,1), -1,-1,1,1,-1,-1)); + LibKernel("KerParAvgPoolNxMStrideSxSy_HWC_ReLU_SQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "Ker_MM_Pool_SQ8_T", CNN_Match(CNN_OperList(1, KOP_AVGPOOL), CNN_OperList(1, KOP_RELU), 1, CNN_Type(1,0,0,0,1), -1,-1,1,1,-1,-1)); + LibKernel("KerParAvgPoolNxMStrideSxSy_HWC_ReLUN_SQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "Ker_MM_Pool_SQ8_T", CNN_Match(CNN_OperList(1, KOP_AVGPOOL), CNN_OperList(1, KOP_RELUN), 1, CNN_Type(1,0,0,0,1), -1,-1,1,1,-1,-1)); + LibKernel("KerParAvgPoolNxMStrideSxSy_HWC_ReLUM_SQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "Ker_MM_Pool_SQ8_T", CNN_Match(CNN_OperList(1, KOP_AVGPOOL), CNN_OperList(1, KOP_RELUM), 1, CNN_Type(1,0,0,0,1), -1,-1,1,1,-1,-1)); + LibKernel("KerParAvgPoolNxMStrideSxSy_HWC_ReLUMN_SQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "Ker_MM_Pool_SQ8_T", CNN_Match(CNN_OperList(1, KOP_AVGPOOL), CNN_OperList(1, KOP_RELUMN), 1, CNN_Type(1,0,0,0,1), -1,-1,1,1,-1,-1)); + LibKernel("KerParAvgPoolNxMStrideSxSy_HWC_LeakyReLU_SQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "Ker_MM_Pool_SQ8_T", CNN_Match(CNN_OperList(1, KOP_AVGPOOL), CNN_OperList(1, KOP_LEAKYRELU), 1, CNN_Type(1,0,0,0,1), -1,-1,1,1,-1,-1)); + LibKernel("KerParAvgPoolNxMStrideSxSy_HWC_HSwish_SQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "Ker_MM_Pool_SQ8_T", CNN_Match(CNN_OperList(1, KOP_AVGPOOL), CNN_OperList(1, KOP_HSWISH), 1, CNN_Type(1,0,0,0,1), -1,-1,1,1,-1,-1)); + LibKernel("KerParAvgPoolNxMStrideSxSy_HWC_HSigmoid_SQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "Ker_MM_Pool_SQ8_T", CNN_Match(CNN_OperList(1, KOP_AVGPOOL), CNN_OperList(1, KOP_HSIGMOID), 1, CNN_Type(1,0,0,0,1), -1,-1,1,1,-1,-1)); + LibKernel("KerParAvgPoolNxMStrideSxSy_HWC_Sigmoid_SQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "Ker_MM_Pool_SQ8_T", CNN_Match(CNN_OperList(1, KOP_AVGPOOL), CNN_OperList(1, KOP_SIGMOID), 1, CNN_Type(1,0,0,0,1), -1,-1,1,1,-1,-1)); + LibKernel("KerParAvgPoolNxMStrideSxSy_HWC_Tanh_SQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "Ker_MM_Pool_SQ8_T", CNN_Match(CNN_OperList(1, KOP_AVGPOOL), CNN_OperList(1, KOP_TANH), 1, CNN_Type(1,0,0,0,1), -1,-1,1,1,-1,-1)); + + LibKernel("KerParMaxPoolNxMStrideSxSy_HWC_USQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "Ker_MM_Pool_USQ8_T", CNN_Match(CNN_OperList(1, KOP_MAXPOOL), CNN_OperList(1, KOP_NONE), 1, CNN_Type(-1,0,0,0,-1), -1,-1,1,1,-1,-1)); + LibKernel("KerParMaxPoolNxMStrideSxSy_HWC_ReLU_USQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "Ker_MM_Pool_USQ8_T", CNN_Match(CNN_OperList(1, KOP_MAXPOOL), CNN_OperList(1, KOP_RELU), 1, CNN_Type(-1,0,0,0,-1), -1,-1,1,1,-1,-1)); + LibKernel("KerParMaxPoolNxMStrideSxSy_HWC_ReLUN_USQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "Ker_MM_Pool_USQ8_T", CNN_Match(CNN_OperList(1, KOP_MAXPOOL), CNN_OperList(1, KOP_RELUN), 1, CNN_Type(-1,0,0,0,-1), -1,-1,1,1,-1,-1)); + LibKernel("KerParMaxPoolNxMStrideSxSy_HWC_ReLUM_USQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "Ker_MM_Pool_USQ8_T", CNN_Match(CNN_OperList(1, KOP_MAXPOOL), CNN_OperList(1, KOP_RELUM), 1, CNN_Type(-1,0,0,0,-1), -1,-1,1,1,-1,-1)); + LibKernel("KerParMaxPoolNxMStrideSxSy_HWC_ReLUMN_USQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "Ker_MM_Pool_USQ8_T", CNN_Match(CNN_OperList(1, KOP_MAXPOOL), CNN_OperList(1, KOP_RELUMN), 1, CNN_Type(-1,0,0,0,-1), -1,-1,1,1,-1,-1)); + LibKernel("KerParMaxPoolNxMStrideSxSy_HWC_LeakyReLU_USQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "Ker_MM_Pool_USQ8_T", CNN_Match(CNN_OperList(1, KOP_MAXPOOL), CNN_OperList(1, KOP_LEAKYRELU), 1, CNN_Type(-1,0,0,0,-1), -1,-1,1,1,-1,-1)); + LibKernel("KerParMaxPoolNxMStrideSxSy_HWC_HSwish_USQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "Ker_MM_Pool_USQ8_T", CNN_Match(CNN_OperList(1, KOP_MAXPOOL), CNN_OperList(1, KOP_HSWISH), 1, CNN_Type(-1,0,0,0,-1), -1,-1,1,1,-1,-1)); + LibKernel("KerParMaxPoolNxMStrideSxSy_HWC_HSigmoid_USQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "Ker_MM_Pool_USQ8_T", CNN_Match(CNN_OperList(1, KOP_MAXPOOL), CNN_OperList(1, KOP_HSIGMOID), 1, CNN_Type(-1,0,0,0,-1), -1,-1,1,1,-1,-1)); + LibKernel("KerParMaxPoolNxMStrideSxSy_HWC_Sigmoid_USQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "Ker_MM_Pool_USQ8_T", CNN_Match(CNN_OperList(1, KOP_MAXPOOL), CNN_OperList(1, KOP_SIGMOID), 1, CNN_Type(-1,0,0,0,-1), -1,-1,1,1,-1,-1)); + LibKernel("KerParMaxPoolNxMStrideSxSy_HWC_Tanh_USQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "Ker_MM_Pool_USQ8_T", CNN_Match(CNN_OperList(1, KOP_MAXPOOL), CNN_OperList(1, KOP_TANH), 1, CNN_Type(-1,0,0,0,-1), -1,-1,1,1,-1,-1)); + + LibKernel("KerParAvgPoolNxMStrideSxSy_HWC_USQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "Ker_MM_Pool_USQ8_T", CNN_Match(CNN_OperList(1, KOP_AVGPOOL), CNN_OperList(1, KOP_NONE), 1, CNN_Type(-1,0,0,0,-1), -1,-1,1,1,-1,-1)); + LibKernel("KerParAvgPoolNxMStrideSxSy_HWC_ReLU_USQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "Ker_MM_Pool_USQ8_T", CNN_Match(CNN_OperList(1, KOP_AVGPOOL), CNN_OperList(1, KOP_RELU), 1, CNN_Type(-1,0,0,0,-1), -1,-1,1,1,-1,-1)); + LibKernel("KerParAvgPoolNxMStrideSxSy_HWC_ReLUN_USQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "Ker_MM_Pool_USQ8_T", CNN_Match(CNN_OperList(1, KOP_AVGPOOL), CNN_OperList(1, KOP_RELUN), 1, CNN_Type(-1,0,0,0,-1), -1,-1,1,1,-1,-1)); + LibKernel("KerParAvgPoolNxMStrideSxSy_HWC_ReLUM_USQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "Ker_MM_Pool_USQ8_T", CNN_Match(CNN_OperList(1, KOP_AVGPOOL), CNN_OperList(1, KOP_RELUM), 1, CNN_Type(-1,0,0,0,-1), -1,-1,1,1,-1,-1)); + LibKernel("KerParAvgPoolNxMStrideSxSy_HWC_ReLUMN_USQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "Ker_MM_Pool_USQ8_T", CNN_Match(CNN_OperList(1, KOP_AVGPOOL), CNN_OperList(1, KOP_RELUMN), 1, CNN_Type(-1,0,0,0,-1), -1,-1,1,1,-1,-1)); + LibKernel("KerParAvgPoolNxMStrideSxSy_HWC_LeakyReLU_USQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "Ker_MM_Pool_USQ8_T", CNN_Match(CNN_OperList(1, KOP_AVGPOOL), CNN_OperList(1, KOP_LEAKYRELU), 1, CNN_Type(-1,0,0,0,-1), -1,-1,1,1,-1,-1)); + LibKernel("KerParAvgPoolNxMStrideSxSy_HWC_HSwish_USQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "Ker_MM_Pool_USQ8_T", CNN_Match(CNN_OperList(1, KOP_AVGPOOL), CNN_OperList(1, KOP_HSWISH), 1, CNN_Type(-1,0,0,0,-1), -1,-1,1,1,-1,-1)); + LibKernel("KerParAvgPoolNxMStrideSxSy_HWC_HSigmoid_USQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "Ker_MM_Pool_USQ8_T", CNN_Match(CNN_OperList(1, KOP_AVGPOOL), CNN_OperList(1, KOP_HSIGMOID), 1, CNN_Type(-1,0,0,0,-1), -1,-1,1,1,-1,-1)); + LibKernel("KerParAvgPoolNxMStrideSxSy_HWC_Sigmoid_USQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "Ker_MM_Pool_USQ8_T", CNN_Match(CNN_OperList(1, KOP_AVGPOOL), CNN_OperList(1, KOP_SIGMOID), 1, CNN_Type(-1,0,0,0,-1), -1,-1,1,1,-1,-1)); + LibKernel("KerParAvgPoolNxMStrideSxSy_HWC_Tanh_USQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "Ker_MM_Pool_USQ8_T", CNN_Match(CNN_OperList(1, KOP_AVGPOOL), CNN_OperList(1, KOP_TANH), 1, CNN_Type(-1,0,0,0,-1), -1,-1,1,1,-1,-1)); /* Global Pooling (Max or Avg) with tensor centric scaling and optional ReLU or ReLUN activation */ LibKernel("KerParGlobalMaxPoolFullFeat_SQ8", CALL_PARALLEL, 0, "KerGlobalPool_SQ8_T", CNN_Match(CNN_OperList(1, KOP_GLOBAL_MAXPOOL), CNN_OperList(1, KOP_NONE), 1, @@ -1076,47 +1115,38 @@ void LoadCNN_SQ8_Library() LibKernel("KerConvDWNxMDxDyStrideSxSyB32_SQ8", CALL_PARALLEL, 0, "KerConv_SQ8_T",CNN_Match(CNN_OperList(1, KOP_CONV_DW), 0, 0, CNN_Type(1,1,4,0,4), -1,-1,-1,-1,-1,-1)); /* Convolution, Linear output reduction with per channel scaling and optional activation. Out != In and In Place (IO) */ - LibKernel("KerReduct_CC_SQ8", CALL_PARALLEL, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT), CNN_OperList(1, KOP_NONE), 0, - CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); - LibKernel("KerReduct_CC_ReLU_SQ8", CALL_PARALLEL, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT), CNN_OperList(1, KOP_RELU), 0, - CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); - LibKernel("KerReduct_CC_ReLUN_SQ8", CALL_PARALLEL, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT), CNN_OperList(1, KOP_RELUN), 0, - CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); - LibKernel("KerReduct_CC_ReLUM_SQ8", CALL_PARALLEL, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT), CNN_OperList(1, KOP_RELUM), 0, - CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); - LibKernel("KerReduct_CC_ReLUMN_SQ8", CALL_PARALLEL, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT), CNN_OperList(1, KOP_RELUMN), 0, - CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); - LibKernel("KerReduct_CC_HSigmoid_SQ8", CALL_PARALLEL, 0, "KerConvLinReduct_SQ8_T",CNN_Match(CNN_OperList(1, KOP_DP_REDUCT), CNN_OperList(1, KOP_HSIGMOID), 0, - CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); - LibKernel("KerReduct_CC_HSwish_SQ8", CALL_PARALLEL, 0, "KerConvLinReduct_SQ8_T",CNN_Match(CNN_OperList(1, KOP_DP_REDUCT), CNN_OperList(1, KOP_HSWISH), 0, - CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); - LibKernel("KerReduct_CC_LeakyReLU_SQ8", CALL_PARALLEL, 0, "KerConvLinReduct_SQ8_T",CNN_Match(CNN_OperList(1, KOP_DP_REDUCT), CNN_OperList(1, KOP_LEAKYRELU), 0, - CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); - LibKernel("KerReduct_CC_Sigmoid_SQ8", CALL_PARALLEL, 0, "KerConvLinReduct_SQ8_T",CNN_Match(CNN_OperList(1, KOP_DP_REDUCT), CNN_OperList(1, KOP_SIGMOID), 0, - CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); - LibKernel("KerReduct_CC_Tanh_SQ8", CALL_PARALLEL, 0, "KerConvLinReduct_SQ8_T",CNN_Match(CNN_OperList(1, KOP_DP_REDUCT), CNN_OperList(1, KOP_TANH), 0, - CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); - - LibKernel("KerReductIO_CC_SQ8", CALL_PARALLEL, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO), CNN_OperList(1, KOP_NONE), 0, - CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); - LibKernel("KerReductIO_CC_ReLU_SQ8", CALL_PARALLEL, 0, "KerConvLinReduct_SQ8_T",CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO), CNN_OperList(1, KOP_RELU), 0, - CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); - LibKernel("KerReductIO_CC_ReLUN_SQ8", CALL_PARALLEL, 0, "KerConvLinReduct_SQ8_T",CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO), CNN_OperList(1, KOP_RELUN), 0, - CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); - LibKernel("KerReductIO_CC_ReLUM_SQ8", CALL_PARALLEL, 0, "KerConvLinReduct_SQ8_T",CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO), CNN_OperList(1, KOP_RELUM), 0, - CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); - LibKernel("KerReductIO_CC_ReLUMN_SQ8", CALL_PARALLEL, 0, "KerConvLinReduct_SQ8_T",CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO), CNN_OperList(1, KOP_RELUMN), 0, - CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); - LibKernel("KerReductIO_CC_HSigmoid_SQ8", CALL_PARALLEL, 0, "KerConvLinReduct_SQ8_T",CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO), CNN_OperList(1, KOP_HSIGMOID), 0, - CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); - LibKernel("KerReductIO_CC_HSwish_SQ8", CALL_PARALLEL, 0, "KerConvLinReduct_SQ8_T",CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO), CNN_OperList(1, KOP_HSWISH), 0, - CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); - LibKernel("KerReductIO_CC_LeakyReLU_SQ8", CALL_PARALLEL, 0, "KerConvLinReduct_SQ8_T",CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO), CNN_OperList(1, KOP_LEAKYRELU), 0, - CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); - LibKernel("KerReductIO_CC_Sigmoid_SQ8", CALL_PARALLEL, 0, "KerConvLinReduct_SQ8_T",CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO), CNN_OperList(1, KOP_SIGMOID), 0, - CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); - LibKernel("KerReductIO_CC_Tanh_SQ8", CALL_PARALLEL, 0, "KerConvLinReduct_SQ8_T",CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO), CNN_OperList(1, KOP_TANH), 0, - CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); + LibKernel("KerReduct_CC_SQ8", CALL_PARALLEL, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT), CNN_OperList(1, KOP_NONE), 0, CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); + LibKernel("KerReduct_CC_ReLU_SQ8", CALL_PARALLEL, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT), CNN_OperList(1, KOP_RELU), 0, CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); + LibKernel("KerReduct_CC_ReLUN_SQ8", CALL_PARALLEL, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT), CNN_OperList(1, KOP_RELUN), 0, CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); + LibKernel("KerReduct_CC_ReLUM_SQ8", CALL_PARALLEL, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT), CNN_OperList(1, KOP_RELUM), 0, CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); + LibKernel("KerReduct_CC_ReLUMN_SQ8", CALL_PARALLEL, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT), CNN_OperList(1, KOP_RELUMN), 0, CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); + LibKernel("KerReduct_CC_HSigmoid_SQ8", CALL_PARALLEL, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT), CNN_OperList(1, KOP_HSIGMOID), 0, CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); + LibKernel("KerReduct_CC_HSwish_SQ8", CALL_PARALLEL, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT), CNN_OperList(1, KOP_HSWISH), 0, CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); + LibKernel("KerReduct_CC_LeakyReLU_SQ8", CALL_PARALLEL, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT), CNN_OperList(1, KOP_LEAKYRELU), 0, CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); + LibKernel("KerReduct_CC_Sigmoid_SQ8", CALL_PARALLEL, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT), CNN_OperList(1, KOP_SIGMOID), 0, CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); + LibKernel("KerReduct_CC_Tanh_SQ8", CALL_PARALLEL, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT), CNN_OperList(1, KOP_TANH), 0, CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); + + LibKernel("KerReductIO_CC_SQ8", CALL_PARALLEL, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO), CNN_OperList(1, KOP_NONE), 0, CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_ReLU_SQ8", CALL_PARALLEL, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO), CNN_OperList(1, KOP_RELU), 0, CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_ReLUN_SQ8", CALL_PARALLEL, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO), CNN_OperList(1, KOP_RELUN), 0, CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_ReLUM_SQ8", CALL_PARALLEL, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO), CNN_OperList(1, KOP_RELUM), 0, CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_ReLUMN_SQ8", CALL_PARALLEL, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO), CNN_OperList(1, KOP_RELUMN), 0, CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_HSigmoid_SQ8", CALL_PARALLEL, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO), CNN_OperList(1, KOP_HSIGMOID), 0, CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_HSwish_SQ8", CALL_PARALLEL, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO), CNN_OperList(1, KOP_HSWISH), 0, CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_LeakyReLU_SQ8", CALL_PARALLEL, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO), CNN_OperList(1, KOP_LEAKYRELU), 0, CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_Sigmoid_SQ8", CALL_PARALLEL, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO), CNN_OperList(1, KOP_SIGMOID), 0, CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_Tanh_SQ8", CALL_PARALLEL, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO), CNN_OperList(1, KOP_TANH), 0, CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); + + LibKernel("KerReductIO_CC_HWC_SQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO), CNN_OperList(1, KOP_NONE), 0, CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_HWC_ReLU_SQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO), CNN_OperList(1, KOP_RELU), 0, CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_HWC_ReLUN_SQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO), CNN_OperList(1, KOP_RELUN), 0, CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_HWC_ReLUM_SQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO), CNN_OperList(1, KOP_RELUM), 0, CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_HWC_ReLUMN_SQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO), CNN_OperList(1, KOP_RELUMN), 0, CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_HWC_HSigmoid_SQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO), CNN_OperList(1, KOP_HSIGMOID), 0, CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_HWC_HSwish_SQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO), CNN_OperList(1, KOP_HSWISH), 0, CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_HWC_LeakyReLU_SQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO), CNN_OperList(1, KOP_LEAKYRELU), 0, CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_HWC_Sigmoid_SQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO), CNN_OperList(1, KOP_SIGMOID), 0, CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_HWC_Tanh_SQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO), CNN_OperList(1, KOP_TANH), 0, CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); /* Activation and reduct for CHW input and HWC output Layer Layout */ LibKernel("KerParReduct_CC_CHW2HWC_SQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_CHW2HWC), CNN_OperList(1, KOP_NONE), 1, CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); @@ -1221,6 +1251,54 @@ void LoadCNN_SQ8_Library() LibKernel("KerReduct_CC_NoScale_Sigmoid_USQ16", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_NOSCALE), CNN_OperList(1, KOP_SIGMOID), 1, CNN_Type(4,0,0,0,-2), 0,0,0,0,0,0)); LibKernel("KerReduct_CC_NoScale_Tanh_USQ16", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_NOSCALE), CNN_OperList(1, KOP_TANH), 1, CNN_Type(4,0,0,0,-2), 0,0,0,0,0,0)); + + /* Activation and Reduct without PerChannel Scaling */ + LibKernel("KerReductIO_CC_NoScale_SQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO_NOSCALE), CNN_OperList(1, KOP_NONE), 1, CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_NoScale_ReLU_SQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO_NOSCALE), CNN_OperList(1, KOP_RELU), 1, CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_NoScale_ReLUN_SQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO_NOSCALE), CNN_OperList(1, KOP_RELUN), 1, CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_NoScale_ReLUM_SQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO_NOSCALE), CNN_OperList(1, KOP_RELUM), 1, CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_NoScale_ReLUMN_SQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO_NOSCALE), CNN_OperList(1, KOP_RELUMN), 1, CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_NoScale_HSigmoid_SQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO_NOSCALE), CNN_OperList(1, KOP_HSIGMOID), 1, CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_NoScale_HSwish_SQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO_NOSCALE), CNN_OperList(1, KOP_HSWISH), 1, CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_NoScale_LeakyReLU_SQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO_NOSCALE), CNN_OperList(1, KOP_LEAKYRELU), 1, CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_NoScale_Sigmoid_SQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO_NOSCALE), CNN_OperList(1, KOP_SIGMOID), 1, CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_NoScale_Tanh_SQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO_NOSCALE), CNN_OperList(1, KOP_TANH), 1, CNN_Type(4,0,0,0,1), 0,0,0,0,0,0)); + + LibKernel("KerReductIO_CC_NoScale_SQ16", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO_NOSCALE), CNN_OperList(1, KOP_NONE), 1, CNN_Type(4,0,0,0,2), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_NoScale_ReLU_SQ16", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO_NOSCALE), CNN_OperList(1, KOP_RELU), 1, CNN_Type(4,0,0,0,2), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_NoScale_ReLUN_SQ16", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO_NOSCALE), CNN_OperList(1, KOP_RELUN), 1, CNN_Type(4,0,0,0,2), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_NoScale_ReLUM_SQ16", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO_NOSCALE), CNN_OperList(1, KOP_RELUM), 1, CNN_Type(4,0,0,0,2), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_NoScale_ReLUMN_SQ16", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO_NOSCALE), CNN_OperList(1, KOP_RELUMN), 1, CNN_Type(4,0,0,0,2), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_NoScale_HSigmoid_SQ16", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO_NOSCALE), CNN_OperList(1, KOP_HSIGMOID), 1, CNN_Type(4,0,0,0,2), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_NoScale_HSwish_SQ16", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO_NOSCALE), CNN_OperList(1, KOP_HSWISH), 1, CNN_Type(4,0,0,0,2), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_NoScale_LeakyReLU_SQ16", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO_NOSCALE), CNN_OperList(1, KOP_LEAKYRELU), 1, CNN_Type(4,0,0,0,2), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_NoScale_Sigmoid_SQ16", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO_NOSCALE), CNN_OperList(1, KOP_SIGMOID), 1, CNN_Type(4,0,0,0,2), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_NoScale_Tanh_SQ16", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO_NOSCALE), CNN_OperList(1, KOP_TANH), 1, CNN_Type(4,0,0,0,2), 0,0,0,0,0,0)); + + /* Unsigned */ + LibKernel("KerReductIO_CC_NoScale_USQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO_NOSCALE), CNN_OperList(1, KOP_NONE), 1, CNN_Type(4,0,0,0,-1), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_NoScale_ReLU_USQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO_NOSCALE), CNN_OperList(1, KOP_RELU), 1, CNN_Type(4,0,0,0,-1), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_NoScale_ReLUN_USQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO_NOSCALE), CNN_OperList(1, KOP_RELUN), 1, CNN_Type(4,0,0,0,-1), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_NoScale_ReLUM_USQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO_NOSCALE), CNN_OperList(1, KOP_RELUM), 1, CNN_Type(4,0,0,0,-1), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_NoScale_ReLUMN_USQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO_NOSCALE), CNN_OperList(1, KOP_RELUMN), 1, CNN_Type(4,0,0,0,-1), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_NoScale_HSigmoid_USQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO_NOSCALE), CNN_OperList(1, KOP_HSIGMOID), 1, CNN_Type(4,0,0,0,-1), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_NoScale_HSwish_USQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO_NOSCALE), CNN_OperList(1, KOP_HSWISH), 1, CNN_Type(4,0,0,0,-1), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_NoScale_LeakyReLU_USQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO_NOSCALE), CNN_OperList(1, KOP_LEAKYRELU), 1, CNN_Type(4,0,0,0,-1), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_NoScale_Sigmoid_USQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO_NOSCALE), CNN_OperList(1, KOP_SIGMOID), 1, CNN_Type(4,0,0,0,-1), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_NoScale_Tanh_USQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO_NOSCALE), CNN_OperList(1, KOP_TANH), 1, CNN_Type(4,0,0,0,-1), 0,0,0,0,0,0)); + + LibKernel("KerReductIO_CC_NoScale_USQ16", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO_NOSCALE), CNN_OperList(1, KOP_NONE), 1, CNN_Type(4,0,0,0,-2), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_NoScale_ReLU_USQ16", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO_NOSCALE), CNN_OperList(1, KOP_RELU), 1, CNN_Type(4,0,0,0,-2), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_NoScale_ReLUN_USQ16", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO_NOSCALE), CNN_OperList(1, KOP_RELUN), 1, CNN_Type(4,0,0,0,-2), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_NoScale_ReLUM_USQ16", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO_NOSCALE), CNN_OperList(1, KOP_RELUM), 1, CNN_Type(4,0,0,0,-2), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_NoScale_ReLUMN_USQ16", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO_NOSCALE), CNN_OperList(1, KOP_RELUMN), 1, CNN_Type(4,0,0,0,-2), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_NoScale_HSigmoid_USQ16", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO_NOSCALE), CNN_OperList(1, KOP_HSIGMOID), 1, CNN_Type(4,0,0,0,-2), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_NoScale_HSwish_USQ16", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO_NOSCALE), CNN_OperList(1, KOP_HSWISH), 1, CNN_Type(4,0,0,0,-2), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_NoScale_LeakyReLU_USQ16", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO_NOSCALE), CNN_OperList(1, KOP_LEAKYRELU), 1, CNN_Type(4,0,0,0,-2), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_NoScale_Sigmoid_USQ16", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO_NOSCALE), CNN_OperList(1, KOP_SIGMOID), 1, CNN_Type(4,0,0,0,-2), 0,0,0,0,0,0)); + LibKernel("KerReductIO_CC_NoScale_Tanh_USQ16", CALL_PARALLEL|CALL_HWC_KER, 0, "KerConvLinReduct_SQ8_T", CNN_Match(CNN_OperList(1, KOP_DP_REDUCT_IO_NOSCALE), CNN_OperList(1, KOP_TANH), 1, CNN_Type(4,0,0,0,-2), 0,0,0,0,0,0)); + + /* Activations with tensor centric scaling */ LibKernel("Ker_ActNone_SQ8", CALL_PARALLEL, 0, "KerActivation_SQ8_T", CNN_Match(CNN_OperList(1, KOP_ACT_NONE), 0, 0, CNN_Type(1,0,0,0,1), 0,0,0,0,0,0)); LibKernel("Ker_ReLU_SQ8", CALL_PARALLEL, 0, "KerActivation_SQ8_T", CNN_Match(CNN_OperList(1, KOP_RELU), 0, 0, CNN_Type(1,0,0,0,1), 0,0,0,0,0,0)); @@ -1255,13 +1333,6 @@ void LoadCNN_SQ8_Library() LibKernel("KerPoolNxMStrideSxSy_ReLUN_SQ8", CALL_PARALLEL, 0, "KerPool_SQ8_T", CNN_Match(CNN_OperList(2, KOP_MAXPOOL, KOP_AVGPOOL), CNN_OperList(1, KOP_RELUN), 0, CNN_Type(1,0,0,0,1), -1,-1,1,1,-1,-1)); - /* Unsigned int8 input/output functions for NE16 */ - LibKernel("KerParMaxPoolNxMStrideSxSy_HWC_USQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "Ker_MM_Pool_USQ8_T", - CNN_Match(CNN_OperList(1, KOP_MAXPOOL), 0, 1, - CNN_Type(-1,0,0,0,-1), -1,-1,1,1,-1,-1)); - LibKernel("KerParAvgPoolNxMStrideSxSy_HWC_USQ8", CALL_PARALLEL|CALL_HWC_KER, 0, "Ker_MM_Pool_USQ8_T", - CNN_Match(CNN_OperList(1, KOP_AVGPOOL), 0, 1, - CNN_Type(-1,0,0,0,-1), -1,-1,1,1,-1,-1)); LoadCNN_Copy_Library(); } @@ -1549,7 +1620,7 @@ static Kernel_T *CNN_MM_ConvolutionPoolAct_SQ8_Internal( Imm((ActOper==KOP_NONE)), /* Scaling when no activation */ K_Arg("Infos", KER_ARG_TILE) /* Infos */ ): - Bindings(13, + Bindings(14, K_Arg("ConvOut", KER_ARG_TILE), /* Input tile */ K_Arg("ConvOut", KER_ARG_TILE_W), /* Input tile width */ K_Arg("ConvOut", KER_ARG_TILE_H), /* Input tile height */ @@ -1562,7 +1633,8 @@ static Kernel_T *CNN_MM_ConvolutionPoolAct_SQ8_Internal( K_Arg("Out", KER_ARG_TILE), /* Pooling output tile */ K_ArgPar("ConvOut", KER_ARG_PARTILE_SIZE, Os), /* In Features */ K_Arg("Out", KER_ARG_TILE_W), /* Output tile width */ - K_Arg("Out", KER_ARG_TILE_H) /* Output tile height */ + K_Arg("Out", KER_ARG_TILE_H), /* Output tile height */ + K_Arg("Infos", KER_ARG_TILE) /* Infos */ ) ), (ActKerName==0)?AT_NO_CALL: @@ -1859,7 +1931,7 @@ static Kernel_T *CNN_HWC_DWConvolutionPoolAct_SQ8_Internal( ), (PoolKerName==0)?AT_NO_CALL: Call(PoolKerName, LOC_D0, - Bindings(13, + Bindings(14, K_Arg("ConvOut", KER_ARG_TILE), /* Input tile */ K_Arg("ConvOut", KER_ARG_TILE_W), /* Input tile width */ K_Arg("ConvOut", KER_ARG_TILE_H), /* Input tile height */ @@ -1872,7 +1944,8 @@ static Kernel_T *CNN_HWC_DWConvolutionPoolAct_SQ8_Internal( K_Arg("Out", KER_ARG_TILE), /* Pooling output tile */ K_ArgPar("ConvOut", KER_ARG_PARTILE_SIZE, D0), /* In Features */ K_Arg("Out", KER_ARG_TILE_W), /* Output tile width */ - K_Arg("Out", KER_ARG_TILE_H) /* Output tile height */ + K_Arg("Out", KER_ARG_TILE_H), /* Output tile height */ + K_Arg("Infos", KER_ARG_TILE) /* Infos */ ) ), (ActKerName==0)?AT_NO_CALL: @@ -2651,7 +2724,7 @@ Kernel_T * CNN_PoolAct_SQ8_Internal( Imm((ActOper==KOP_NONE)), /* Scaling when no activation */ K_Arg("Infos", KER_ARG_TILE) /* Infos */ ): - Bindings(13, + Bindings(14, K_Arg("In", KER_ARG_TILE), /* Input tile */ K_Arg("In", KER_ARG_TILE_W), /* Input tile width */ K_Arg("In", KER_ARG_TILE_H), /* Input tile height */ @@ -2664,7 +2737,8 @@ Kernel_T * CNN_PoolAct_SQ8_Internal( K_Arg("Out", KER_ARG_TILE), /* Pooling output tile */ ParFeat?K_ArgPar("In", KER_ARG_PARTILE_SIZE, D0):Imm(1), /* In Features */ K_Arg("Out", KER_ARG_TILE_W), /* Output tile width */ - K_Arg("Out", KER_ARG_TILE_H) /* Output tile height */ + K_Arg("Out", KER_ARG_TILE_H), /* Output tile height */ + K_Arg("Infos", KER_ARG_TILE) /* Infos */ ) ), @@ -3378,13 +3452,13 @@ static Kernel_T * CNN_SoftMax2D_SQ8_Internal( ), (HWC==0)? KerArgs(3, - KerArg("In", KerArgSpace(2,D0,T0), OBJ_BUFFER_IN, 1, Dim, 1, 0, 0, 8, "In"), - KerArg("Out", KerArgSpace(2,D0,T0), OBJ_BUFFER_OUT, 1, Dim, OutBytes, 0, 0, 0, "Out"), + KerArg("In", KerArgSpace(2,D0,T0), OBJ_IN_DB, 1, Dim, 1, 0, 0, 8, "In"), + KerArg("Out", KerArgSpace(2,D0,T0), OBJ_OUT_DB, 1, Dim, OutBytes, 0, 0, 0, "Out"), KerArg("Infos", KerArgSpace(1,T0), O_IN|O_BUFF|O_NTILED|O_CONST, AT_INF_DIM, 1, 1, 0, 0, 0, "Infos") ): KerArgs(3, - KerArg("In", KerArgSpace(2,T0,D0), OBJ_BUFFER_IN, 1, Dim, 1, 0, 0, 8, "In"), - KerArg("Out", KerArgSpace(2,T0,D0), OBJ_BUFFER_OUT, 1, Dim, OutBytes, 0, 0, 0, "Out"), + KerArg("In", KerArgSpace(2,T0,D0), OBJ_IN_DB, 1, Dim, 1, 0, 0, 8, "In"), + KerArg("Out", KerArgSpace(2,T0,D0), OBJ_OUT_DB, 1, Dim, OutBytes, 0, 0, 0, "Out"), KerArg("Infos", KerArgSpace(1,T0), O_IN|O_BUFF|O_NTILED|O_CONST, AT_INF_DIM, 1, 1, 0, 0, 0, "Infos") ) ); @@ -4007,44 +4081,24 @@ Kernel_T *CNN_MatMulAct_SQ8_Internal( ), ColFirst? KerArgs(8, - !Transposed? - KerArg("KerBuff",KerArgSpace(1, T1), O_BUFF|O_NTILED, Nbuff*ColM1, 1, 1, 0, 0, 0, 0):AT_NO_KER_ARG, - (NBatches>1)? - KerArg("In1", KerArgSpace(2,D0,T0), O_IN|O_DB|O_CONST, ColM1, LineM1, 1, 0, OBJ_CONSTRAINTS_PAD_REM, 8, "In1"): - KerArg("In1", KerArgSpace(1, T0), O_IN|O_DB|O_CONST, ColM1, LineM1, 1, 0, OBJ_CONSTRAINTS_PAD_REM, 8, "In1"), - (NBatches>1)? - KerArg("In2", KerArgSpace(2,D0,T1), O_IN|O_DB, ColM2, LineM2, 1, 0, ObjCons|OBJ_CONSTRAINTS_PAD_REM, ConsT0, "In2"): - KerArg("In2", KerArgSpace(1, T1), O_IN|O_DB, ColM2, LineM2, 1, 0, ObjCons|OBJ_CONSTRAINTS_PAD_REM, ConsT0, "In2"), - !NoBias? - KerArg("Bias", KerArgSpace(1, TA), O_BUFF|O_IN|O_CONST, 1, SAxis, Bias_DataSize, 0, OBJ_CONSTRAINTS_PAD_REM, 0, "Bias"):AT_NO_KER_ARG, - (NBatches>1)? - KerArg("Out", KerArgSpace(2,D0,T1), O_OUT|O_DB, ColO, LineO, 1, 0, OBJ_CONSTRAINTS_TILE_VER|OBJ_CONSTRAINTS_PAD_REM, 0, "Out"): - KerArg("Out", KerArgSpace(1, T1), O_OUT|O_DB, ColO, LineO, 1, 0, OBJ_CONSTRAINTS_TILE_VER|OBJ_CONSTRAINTS_PAD_REM, 0, "Out"), - !ScaleScalar? - KerArg("Scale", KerArgSpace(1, TA), O_BUFF|O_IN|O_CONST, 1, SAxis, 1, 0, 0, 0, "Scale"):AT_NO_KER_ARG, - !ScaleScalar? - KerArg("ScaleN", KerArgSpace(1, TA), O_BUFF|O_IN|O_CONST, 1, SAxis, 1, 0, 0, 0, "ScaleN"):AT_NO_KER_ARG, - KerArg("Infos", KerArgSpace(1, T1), O_IN|O_BUFF|O_NTILED, 1, 1, AT_INF_DIM*1, 0, 0, 0, "Infos") + !Transposed?KerArg("KerBuff",KerArgSpace(1, T1), O_BUFF|O_NTILED, Nbuff*ColM1, 1, 1, 0, 0, 0, 0):AT_NO_KER_ARG, + KerArg("In1", KerArgSpace(1, T0), O_IN|O_DB|O_CONST, ColM1, LineM1, 1, 0, OBJ_CONSTRAINTS_PAD_REM, 8, "In1"), + KerArg("In2", KerArgSpace(1, T1), O_IN|O_DB, ColM2, LineM2, 1, 0, ObjCons|OBJ_CONSTRAINTS_PAD_REM, ConsT0, "In2"), + !NoBias?KerArg("Bias", KerArgSpace(1, TA), O_BUFF|O_IN|O_CONST, 1, SAxis, Bias_DataSize, 0, OBJ_CONSTRAINTS_PAD_REM, 0, "Bias"):AT_NO_KER_ARG, + KerArg("Out", KerArgSpace(1, T1), O_OUT|O_DB, ColO, LineO, 1, 0, OBJ_CONSTRAINTS_TILE_VER|OBJ_CONSTRAINTS_PAD_REM, 0, "Out"), + !ScaleScalar?KerArg("Scale", KerArgSpace(1, TA), O_BUFF|O_IN|O_CONST, 1, SAxis, 1, 0, 0, 0, "Scale"):AT_NO_KER_ARG, + !ScaleScalar?KerArg("ScaleN", KerArgSpace(1, TA), O_BUFF|O_IN|O_CONST, 1, SAxis, 1, 0, 0, 0, "ScaleN"):AT_NO_KER_ARG, + KerArg("Infos", KerArgSpace(1, T1), O_IN|O_BUFF|O_NTILED, 1, 1, AT_INF_DIM*1, 0, 0, 0, "Infos") ): KerArgs(8, - !Transposed? - KerArg("KerBuff",KerArgSpace(1, T0), O_BUFF|O_NTILED, Nbuff*ColM1, 1, 1, 0, 0, 0, 0):AT_NO_KER_ARG, - (NBatches>1)? - KerArg("In1", KerArgSpace(2,D0,T1), O_IN|O_DB|O_CONST, ColM1, LineM1, 1, 0, OBJ_CONSTRAINTS_PAD_REM, 8, "In1"): - KerArg("In1", KerArgSpace(1, T1), O_IN|O_DB|O_CONST, ColM1, LineM1, 1, 0, OBJ_CONSTRAINTS_PAD_REM, 8, "In1"), - (NBatches>1)? - KerArg("In2", KerArgSpace(2,D0,T0), O_IN|O_DB, ColM2, LineM2, 1, 0, ObjCons|OBJ_CONSTRAINTS_PAD_REM, ConsT0, "In2"): - KerArg("In2", KerArgSpace(1, T0), O_IN|O_DB, ColM2, LineM2, 1, 0, ObjCons|OBJ_CONSTRAINTS_PAD_REM, ConsT0, "In2"), - !NoBias? - KerArg("Bias", KerArgSpace(1, TB), O_BUFF|O_IN|O_CONST, 1, SAxis, Bias_DataSize, 0, OBJ_CONSTRAINTS_PAD_REM, 0, "Bias"):AT_NO_KER_ARG, - (NBatches>1)? - KerArg("Out", KerArgSpace(2,D0,T1), O_OUT|O_DB, ColO, LineO, 1, 0, OBJ_CONSTRAINTS_PAD_REM, 0, "Out"): - KerArg("Out", KerArgSpace(1, T1), O_OUT|O_DB, ColO, LineO, 1, 0, OBJ_CONSTRAINTS_PAD_REM, 0, "Out"), - !ScaleScalar? - KerArg("Scale", KerArgSpace(1, TB), O_BUFF|O_IN|O_CONST, 1, SAxis, 1, 0, 0, 0, "Scale"):AT_NO_KER_ARG, - !ScaleScalar? - KerArg("ScaleN", KerArgSpace(1, TB), O_BUFF|O_IN|O_CONST, 1, SAxis, 1, 0, 0, 0, "ScaleN"):AT_NO_KER_ARG, - KerArg("Infos", KerArgSpace(1, T0), O_IN|O_BUFF|O_NTILED, 1, 1, AT_INF_DIM*1, 0, 0, 0, "Infos") + !Transposed?KerArg("KerBuff",KerArgSpace(1, T0), O_BUFF|O_NTILED, Nbuff*ColM1, 1, 1, 0, 0, 0, 0):AT_NO_KER_ARG, + KerArg("In1", KerArgSpace(1, T1), O_IN|O_DB|O_CONST, ColM1, LineM1, 1, 0, OBJ_CONSTRAINTS_PAD_REM, 8, "In1"), + KerArg("In2", KerArgSpace(1, T0), O_IN|O_DB, ColM2, LineM2, 1, 0, ObjCons|OBJ_CONSTRAINTS_PAD_REM, ConsT0, "In2"), + !NoBias?KerArg("Bias", KerArgSpace(1, TB), O_BUFF|O_IN|O_CONST, 1, SAxis, Bias_DataSize, 0, OBJ_CONSTRAINTS_PAD_REM, 0, "Bias"):AT_NO_KER_ARG, + KerArg("Out", KerArgSpace(1, T1), O_OUT|O_DB, ColO, LineO, 1, 0, OBJ_CONSTRAINTS_PAD_REM, 0, "Out"), + !ScaleScalar?KerArg("Scale", KerArgSpace(1, TB), O_BUFF|O_IN|O_CONST, 1, SAxis, 1, 0, 0, 0, "Scale"):AT_NO_KER_ARG, + !ScaleScalar?KerArg("ScaleN", KerArgSpace(1, TB), O_BUFF|O_IN|O_CONST, 1, SAxis, 1, 0, 0, 0, "ScaleN"):AT_NO_KER_ARG, + KerArg("Infos", KerArgSpace(1, T0), O_IN|O_BUFF|O_NTILED, 1, 1, AT_INF_DIM*1, 0, 0, 0, "Infos") ) ); if (Kernel) { diff --git a/tools/autotiler_v3/CNN_Generators_SQ8/RNN_Generators_SQ8.c b/tools/autotiler_v3/CNN_Generators_SQ8/RNN_Generators_SQ8.c index ca31fbf57..527c10588 100644 --- a/tools/autotiler_v3/CNN_Generators_SQ8/RNN_Generators_SQ8.c +++ b/tools/autotiler_v3/CNN_Generators_SQ8/RNN_Generators_SQ8.c @@ -132,7 +132,7 @@ int RNN_Sequence(int Nc, int K0, int K1, int *n1, int *n2, int *n3, int *n2_io) return ((N1!=0) + (N2!=0) + (N3!=0)); } -static Kernel_T *RNN_Stack_Seq_SQ8( +static Kernel_T *RNN_Stack_Seq_SQ8_Internal( char *Name, CNN_GenControl_T *Ctrl, char *RNNKerName, @@ -257,6 +257,45 @@ static Kernel_T *RNN_Stack_Seq_SQ8( return Kernel; } +static Kernel_T *RNN_Stack_Seq_SQ8( + char *Name, + CNN_GenControl_T *Ctrl, + char *RNNKerName, + + int BiasDataSize, + int FeatDataSize, + + int AlwaysReset, + int NCells, + int DimState, + int DimIn, + int UseIn, + int ExposeSequence, + int Buffer, + int FirstSeq, + int LastSeq, + int Revert, + int Dynamic + ) +{ + Kernel_T *Ker = 0; + + AT_SetKernelCtrl(AT_KERNEL_NOSOLUTION_ERROR, AT_OPT_OFF); + Ker = RNN_Stack_Seq_SQ8_Internal(Name, Ctrl, RNNKerName, BiasDataSize, FeatDataSize, AlwaysReset, NCells, DimState, DimIn, UseIn, ExposeSequence, Buffer, FirstSeq, LastSeq, Revert, Dynamic); + if (Ker) return Ker; + AT_SetKernelCtrl(AT_KERNEL_NOSOLUTION_ERROR, AT_OPT_ON); + + printf("\n\n=============================== Solution not found for %s: Trying PARALLELFEATURES=0 ===============================\n\n", Name); + /* If solution not found try with ParallelFeature = 0 */ + CNN_GenControl_T InternalCtrl; + if (!Ctrl) CNN_InitGenCtrl(&InternalCtrl); + else InternalCtrl = *Ctrl; + CNN_SetGenCtrl(&InternalCtrl, "PARALLELFEATURES", AT_OPT_VAL(0)); + Ker = RNN_Stack_Seq_SQ8_Internal(Name, &InternalCtrl, RNNKerName, BiasDataSize, FeatDataSize, AlwaysReset, NCells, DimState, DimIn, UseIn, ExposeSequence, Buffer, FirstSeq, LastSeq, Revert, Dynamic); + return Ker; +} + + int RNN_Stack_SQ8( char *Name, CNN_GenControl_T *Ctrl, @@ -485,7 +524,7 @@ int RNN_Stack_SQ8( } -static int LSTM_Stack_Seq_SQ8( +static int LSTM_Stack_Seq_SQ8_Internal( char *Name, CNN_GenControl_T *Ctrl, char *LSTMKerName, @@ -660,6 +699,44 @@ static int LSTM_Stack_Seq_SQ8( return (Kernel!=0); } +static int LSTM_Stack_Seq_SQ8( + char *Name, + CNN_GenControl_T *Ctrl, + char *LSTMKerName, + + int BiasDataSize, + int FeatDataSize, + + int AlwaysReset, + int NCells, + int DimState, + int DimIn, + int UseIn, + int ExposeSequence, + int FirstSeq, + int LastSeq, + int Revert, + int Dynamic + ) +{ + int Ker = 0; + + AT_SetKernelCtrl(AT_KERNEL_NOSOLUTION_ERROR, AT_OPT_OFF); + Ker = LSTM_Stack_Seq_SQ8_Internal(Name, Ctrl, LSTMKerName, BiasDataSize, FeatDataSize, AlwaysReset, NCells, DimState, DimIn, UseIn, ExposeSequence, FirstSeq, LastSeq, Revert, Dynamic); + if (Ker) return 1; + AT_SetKernelCtrl(AT_KERNEL_NOSOLUTION_ERROR, AT_OPT_ON); + + printf("\n\n=============================== Solution not found for %s: Trying PARALLELFEATURES=0 ===============================\n\n", Name); + /* If solution not found try with ParallelFeature = 0 */ + CNN_GenControl_T InternalCtrl; + if (!Ctrl) CNN_InitGenCtrl(&InternalCtrl); + else InternalCtrl = *Ctrl; + CNN_SetGenCtrl(&InternalCtrl, "PARALLELFEATURES", AT_OPT_VAL(0)); + Ker = LSTM_Stack_Seq_SQ8_Internal(Name, &InternalCtrl, LSTMKerName, BiasDataSize, FeatDataSize, AlwaysReset, NCells, DimState, DimIn, UseIn, ExposeSequence, FirstSeq, LastSeq, Revert, Dynamic); + return Ker; +} + + int LSTM_Stack_SQ8( char *Name, CNN_GenControl_T *Ctrl, @@ -904,7 +981,7 @@ int LSTM_Stack_SQ8( } -static int GRU_Stack_Seq_SQ8( +static int GRU_Stack_Seq_SQ8_Internal( char *Name, CNN_GenControl_T *Ctrl, char *GRUKerName, @@ -1064,6 +1141,43 @@ static int GRU_Stack_Seq_SQ8( return (Kernel!=0); } +static int GRU_Stack_Seq_SQ8( + char *Name, + CNN_GenControl_T *Ctrl, + char *GRUKerName, + + int BiasDataSize, + int FeatDataSize, + + int AlwaysReset, + int NCells, + int DimState, + int DimIn, + int UseIn, + int ExposeSequence, + int FirstSeq, + int LastSeq, + int Revert, + int Dynamic + ) +{ + int Ker = 0; + + AT_SetKernelCtrl(AT_KERNEL_NOSOLUTION_ERROR, AT_OPT_OFF); + Ker = GRU_Stack_Seq_SQ8_Internal(Name, Ctrl, GRUKerName, BiasDataSize, FeatDataSize, AlwaysReset, NCells, DimState, DimIn, UseIn, ExposeSequence, FirstSeq, LastSeq, Revert, Dynamic); + if (Ker) return 1; + AT_SetKernelCtrl(AT_KERNEL_NOSOLUTION_ERROR, AT_OPT_ON); + + printf("\n\n=============================== Solution not found for %s: Trying PARALLELFEATURES=0 ===============================\n\n", Name); + /* If solution not found try with ParallelFeature = 0 */ + CNN_GenControl_T InternalCtrl; + if (!Ctrl) CNN_InitGenCtrl(&InternalCtrl); + else InternalCtrl = *Ctrl; + CNN_SetGenCtrl(&InternalCtrl, "PARALLELFEATURES", AT_OPT_VAL(0)); + Ker = GRU_Stack_Seq_SQ8_Internal(Name, &InternalCtrl, GRUKerName, BiasDataSize, FeatDataSize, AlwaysReset, NCells, DimState, DimIn, UseIn, ExposeSequence, FirstSeq, LastSeq, Revert, Dynamic); + return Ker; +} + int GRU_Stack_SQ8( char *Name, CNN_GenControl_T *Ctrl, diff --git a/tools/autotiler_v3/CNN_Generators_fp16/RNN_Generators_fp16.c b/tools/autotiler_v3/CNN_Generators_fp16/RNN_Generators_fp16.c index 5a6ca45dc..435e965e6 100644 --- a/tools/autotiler_v3/CNN_Generators_fp16/RNN_Generators_fp16.c +++ b/tools/autotiler_v3/CNN_Generators_fp16/RNN_Generators_fp16.c @@ -106,7 +106,7 @@ int RNN_Sequence_fp16(int Nc, int K0, int K1, int *n1, int *n2, int *n3, int *n2 return ((N1!=0) + (N2!=0) + (N3!=0)); } -static int RNN_Stack_Seq_fp16( +static int RNN_Stack_Seq_fp16_Internal( char *Name, CNN_GenControl_T *Ctrl, char *RNNKerName, @@ -222,6 +222,40 @@ static int RNN_Stack_Seq_fp16( return (Kernel!=0); } +static int RNN_Stack_Seq_fp16( + char *Name, + CNN_GenControl_T *Ctrl, + char *RNNKerName, + + int AlwaysReset, + int NCells, + int DimState, + int DimIn, + int UseIn, + int ExposeSequence, + int Buffer, + int FirstSeq, + int LastSeq, + int Revert, + int Dynamic) +{ + int Ker = 0; + + AT_SetKernelCtrl(AT_KERNEL_NOSOLUTION_ERROR, AT_OPT_OFF); + Ker = RNN_Stack_Seq_fp16_Internal(Name, Ctrl, RNNKerName, AlwaysReset, NCells, DimState, DimIn, UseIn, ExposeSequence, Buffer, FirstSeq, LastSeq, Revert, Dynamic); + if (Ker) return 1; + AT_SetKernelCtrl(AT_KERNEL_NOSOLUTION_ERROR, AT_OPT_ON); + + printf("\n\n=============================== Solution not found for %s: Trying PARALLELFEATURES=0 ===============================\n\n", Name); + /* If solution not found try with ParallelFeature = 0 */ + CNN_GenControl_T InternalCtrl; + if (!Ctrl) CNN_InitGenCtrl(&InternalCtrl); + else InternalCtrl = *Ctrl; + CNN_SetGenCtrl(&InternalCtrl, "PARALLELFEATURES", AT_OPT_VAL(0)); + Ker = RNN_Stack_Seq_fp16_Internal(Name, &InternalCtrl, RNNKerName, AlwaysReset, NCells, DimState, DimIn, UseIn, ExposeSequence, Buffer, FirstSeq, LastSeq, Revert, Dynamic); + return Ker; +} + int RNN_Stack_fp16( char *Name, CNN_GenControl_T *Ctrl, @@ -400,7 +434,7 @@ int RNN_Stack_fp16( } -static int LSTM_Stack_Seq_fp16( +static int LSTM_Stack_Seq_fp16_Internal( char *Name, CNN_GenControl_T *Ctrl, char *LSTMKerName, @@ -568,6 +602,39 @@ static int LSTM_Stack_Seq_fp16( return (Kernel!=0); } +static int LSTM_Stack_Seq_fp16( + char *Name, + CNN_GenControl_T *Ctrl, + char *LSTMKerName, + + int AlwaysReset, + int NCells, + int DimState, + int DimIn, + int UseIn, + int ExposeSequence, + int FirstSeq, + int LastSeq, + int Revert, + int Dynamic) +{ + int Ker = 0; + + AT_SetKernelCtrl(AT_KERNEL_NOSOLUTION_ERROR, AT_OPT_OFF); + Ker = LSTM_Stack_Seq_fp16_Internal(Name, Ctrl, LSTMKerName, AlwaysReset, NCells, DimState, DimIn, UseIn, ExposeSequence, FirstSeq, LastSeq, Revert, Dynamic); + if (Ker) return 1; + AT_SetKernelCtrl(AT_KERNEL_NOSOLUTION_ERROR, AT_OPT_ON); + + printf("\n\n=============================== Solution not found for %s: Trying PARALLELFEATURES=0 ===============================\n\n", Name); + /* If solution not found try with ParallelFeature = 0 */ + CNN_GenControl_T InternalCtrl; + if (!Ctrl) CNN_InitGenCtrl(&InternalCtrl); + else InternalCtrl = *Ctrl; + CNN_SetGenCtrl(&InternalCtrl, "PARALLELFEATURES", AT_OPT_VAL(0)); + Ker = LSTM_Stack_Seq_fp16_Internal(Name, &InternalCtrl, LSTMKerName, AlwaysReset, NCells, DimState, DimIn, UseIn, ExposeSequence, FirstSeq, LastSeq, Revert, Dynamic); + return Ker; +} + int LSTM_Stack_fp16( char *Name, CNN_GenControl_T *Ctrl, @@ -791,7 +858,7 @@ int LSTM_Stack_fp16( } -static int GRU_Stack_Seq_fp16( +static int GRU_Stack_Seq_fp16_Internal( char *Name, CNN_GenControl_T *Ctrl, char *GRUKerName, @@ -943,6 +1010,40 @@ static int GRU_Stack_Seq_fp16( return (Kernel!=0); } +static int GRU_Stack_Seq_fp16( + char *Name, + CNN_GenControl_T *Ctrl, + char *GRUKerName, + + int AlwaysReset, + int NCells, + int DimState, + int DimIn, + int UseIn, + int ExposeSequence, + int FirstSeq, + int LastSeq, + int Revert, + int Dynamic) +{ + int Ker = 0; + + AT_SetKernelCtrl(AT_KERNEL_NOSOLUTION_ERROR, AT_OPT_OFF); + Ker = GRU_Stack_Seq_fp16_Internal(Name, Ctrl, GRUKerName, AlwaysReset, NCells, DimState, DimIn, UseIn, ExposeSequence, FirstSeq, LastSeq, Revert, Dynamic); + if (Ker) return 1; + AT_SetKernelCtrl(AT_KERNEL_NOSOLUTION_ERROR, AT_OPT_ON); + + printf("\n\n=============================== Solution not found for %s: Trying PARALLELFEATURES=0 ===============================\n\n", Name); + /* If solution not found try with ParallelFeature = 0 */ + CNN_GenControl_T InternalCtrl; + if (!Ctrl) CNN_InitGenCtrl(&InternalCtrl); + else InternalCtrl = *Ctrl; + CNN_SetGenCtrl(&InternalCtrl, "PARALLELFEATURES", AT_OPT_VAL(0)); + Ker = GRU_Stack_Seq_fp16_Internal(Name, &InternalCtrl, GRUKerName, AlwaysReset, NCells, DimState, DimIn, UseIn, ExposeSequence, FirstSeq, LastSeq, Revert, Dynamic); + return Ker; +} + + int GRU_Stack_fp16( char *Name, CNN_GenControl_T *Ctrl, diff --git a/tools/autotiler_v3/CNN_Libraries/SSD_BasicKernels.c b/tools/autotiler_v3/CNN_Libraries/SSD_BasicKernels.c index b1a395965..09e5e814f 100644 --- a/tools/autotiler_v3/CNN_Libraries/SSD_BasicKernels.c +++ b/tools/autotiler_v3/CNN_Libraries/SSD_BasicKernels.c @@ -1,7 +1,3 @@ -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wextra" -#pragma GCC diagnostic ignored "-Wpointer-sign" -#pragma GCC diagnostic ignored "-Wsign-compare" /* * Copyright (C) 2020 GreenWaves Technologies * All rights reserved. @@ -10,6 +6,9 @@ * of the BSD license. See the LICENSE file for details. * */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wsign-compare" + #include #include "Gap.h" #include "CNN_BasicKernels.h" diff --git a/tools/autotiler_v3/CNN_Libraries_NE16/CNN_BasicKernels_NE16.c b/tools/autotiler_v3/CNN_Libraries_NE16/CNN_BasicKernels_NE16.c index 1c302417a..e0bd7445e 100644 --- a/tools/autotiler_v3/CNN_Libraries_NE16/CNN_BasicKernels_NE16.c +++ b/tools/autotiler_v3/CNN_Libraries_NE16/CNN_BasicKernels_NE16.c @@ -1275,7 +1275,7 @@ void KerConvDW3x3Stride2_NE16(KerConv_NE16_T *Arg) SetNE16_ScaleNPointer (ScaleN); SetNE16_Strides (Tile_InFeat, Tile_InFeat * Tile_InW, 0, // In_D0, In_D1, In_D2 - unused Out_Stride0, OutBytes * Tile_OutFeat / 2, OutBytes * Tile_OutFeat * Tile_OutW / 2, // Out_D0, Out_D1, Out_D2 div 2 to take into account strideness - 2*3*3, 2*3*3*Arg->Qw*Nb_KI, 0); // Weights_D0, Weights_D1, Weights_D2 + 2*3*3, 0, 0); // Weights_D0, Weights_D1, Weights_D2 SetNE16_Dim (Nb_KI, Nb_KO, Nb_WO, Nb_HO); // Assume first subtile no need for right/bottom pad SetNE16_ConfigPad ((v4s) {PadL, IsLastSubtileW?PadR:0, PadT, IsLastSubtileH?PadB:0}, Arg->Pad_Val); @@ -1343,7 +1343,7 @@ void KerConvDW3x3Stride2_NE16(KerConv_NE16_T *Arg) SetNE16_ScaleNPointer (ScaleN); SetNE16_Strides (Tile_InFeat, Tile_InFeat * Tile_InW, 0, // In_D0, In_D1, In_D2 - unused Out_Stride0, OutBytes * Tile_OutFeat / 2, OutBytes * Tile_OutFeat * Tile_OutW / 2, // Out_D0, Out_D1, Out_D2 div 2 to take into account strideness - 2*3*3, 2*3*3*Arg->Qw*Nb_KI, 0); // Weights_D0, Weights_D1, Weights_D2 + 2*3*3, 0, 0); // Weights_D0, Weights_D1, Weights_D2 SetNE16_Dim (Nb_KI, Nb_KO, Nb_WO, Nb_HO); // Moving to next spatial subtile means consider less padding (2 because of the stride) PadL = Max(0, TilePadL-2*subtile_j_major); diff --git a/tools/autotiler_v3/CNN_Libraries_SQ8/CNN_AT_Misc.c b/tools/autotiler_v3/CNN_Libraries_SQ8/CNN_AT_Misc.c index 187fd3ab3..dd82478c9 100644 --- a/tools/autotiler_v3/CNN_Libraries_SQ8/CNN_AT_Misc.c +++ b/tools/autotiler_v3/CNN_Libraries_SQ8/CNN_AT_Misc.c @@ -25,6 +25,7 @@ #include "CNN_AT_Misc.h" + #ifdef __pulp__ #define Abs(a) __builtin_pulp_abs((a)) #define Min(a, b) __builtin_pulp_minsi((a), (b)) diff --git a/tools/autotiler_v3/CNN_Libraries_SQ8/CNN_Activation_SQ8.c b/tools/autotiler_v3/CNN_Libraries_SQ8/CNN_Activation_SQ8.c index ef6918d19..233b637bc 100644 --- a/tools/autotiler_v3/CNN_Libraries_SQ8/CNN_Activation_SQ8.c +++ b/tools/autotiler_v3/CNN_Libraries_SQ8/CNN_Activation_SQ8.c @@ -14,6 +14,9 @@ * limitations under the License. */ +#include "Gap.h" +#include "CNN_BasicKernels_SQ8.h" + #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wextra" #pragma GCC diagnostic ignored "-Wpointer-sign" @@ -21,9 +24,6 @@ #pragma GCC diagnostic ignored "-Wswitch" #pragma GCC diagnostic ignored "-Wstrict-aliasing" -#include "Gap.h" -#include "CNN_BasicKernels_SQ8.h" - static int CoreCountDynamic = 1; static int ActiveCore = gap_ncore(); @@ -135,7 +135,7 @@ int TanhTable(int x, unsigned short * table){ #endif } -#define KER_ACT(Activation, in_d_type, out_d_type, p_type, n_bits, is_unsigned) \ +#define KER_ACT(Activation, in_d_type, out_d_type, p_type, in_n_bits, out_n_bits, is_unsigned) \ do { \ unsigned int S = Arg->W*Arg->H*Arg->Feat, CoreId = gap_coreid(), ChunkCell = ChunkSize(S), First = CoreId*ChunkCell, Last = Min(First+ChunkCell, S); \ decl(in_d_type * __restrict__, In) = decl((in_d_type *__restrict__), Arg->In); \ @@ -147,12 +147,33 @@ do { \ \ for (unsigned int i=First; iW*Arg->H*Arg->Feat, CoreId = gap_coreid(), ChunkCell = ChunkSize(S), First = CoreId*ChunkCell, Last = Min(First+ChunkCell, S); \ + int * __restrict__ InOut = (int *__restrict__) Arg->In; \ + signed char * __restrict__ Infos = (signed char *__restrict__) Arg->Infos; \ + unsigned int Size = Max(0, Last-First); \ + unsigned int ActScale = ((unsigned char *)Infos)[AT_INF_ACTSCALE], ActScaleN = ((unsigned char *)Infos)[AT_INF_ACTSCALEN]; \ + int A0 = arr_at_as(Infos, AT_INF_A0, p_type); int B0 = arr_at_as(Infos, AT_INF_B0, p_type); int C0 = arr_at_as(Infos, AT_INF_C0, p_type); \ +\ + for (unsigned int i=0; iFeat; \ unsigned int CoreId = gap_coreid(), ChunkCell = ChunkSize(S), First = CoreId*ChunkCell, Last = Min(First+ChunkCell, S); \ @@ -169,14 +190,14 @@ do { \ for (unsigned int c=First; cFeat; \ unsigned S = Arg->W*Arg->H; \ @@ -194,14 +215,14 @@ do { \ for (unsigned int c=0; cFeat; \ unsigned int Size = Arg->W*Arg->H; \ @@ -218,8 +239,8 @@ do { \ for (unsigned int c=First; cFeat); \ } while(0); -#define KER_REDUCT_IO_ACT_CHW(Activation, d_type, p_type, n_bits, is_unsigned) \ +#define KER_REDUCT_IO_ACT_CHW(Activation, d_type, p_type, in_n_bits, out_n_bits, is_unsigned) \ do { \ unsigned int Feat = Arg->Feat; \ unsigned int S = Arg->W*Arg->H; \ @@ -246,15 +267,15 @@ do { \ d_type *Out = (d_type *) (InOut+S*c+First); \ for (unsigned int i=0; iFeat; \ unsigned int CoreId = gap_coreid(), ChunkCell = ChunkSize(Feat), First = CoreId*ChunkCell, Last = Min(First+ChunkCell, Feat); \ @@ -271,14 +292,14 @@ do { \ for (unsigned int c=First; cFeat; \ unsigned S = Arg->W*Arg->H; \ @@ -296,14 +317,14 @@ do { \ for (unsigned int c=0; cFeat; \ unsigned S = Arg->W*Arg->H; \ @@ -320,14 +341,14 @@ do { \ for (unsigned int i=First; iFeat; \ unsigned S = Arg->W*Arg->H; \ @@ -344,8 +365,8 @@ do { \ for (unsigned int i=First; iInfos; + unsigned char * Infos = (unsigned char *) Arg->Infos; unsigned int ActScale = ((unsigned char *)Infos)[AT_INF_ACTSCALE], ActScaleN = ((unsigned char *)Infos)[AT_INF_ACTSCALEN]; int A0 = *((unsigned char *) &Infos[AT_INF_A0]); int B0 = *((unsigned char *) &Infos[AT_INF_B0]); int C0 = *((unsigned char *) &Infos[AT_INF_C0]); @@ -347,7 +348,7 @@ static inline void __attribute__((always_inline)) KerParLinearLayerFullFeatB8_SQ } if (InDim&0x4) Acc = gap_sumdotp4(VectIn[InDim/4-1], W[InDim/4-1], Acc); for (int j=4*(InDim/4); jInfos; + unsigned char * Infos = (unsigned char *) Arg->Infos; unsigned int ActScale = ((unsigned char *)Infos)[AT_INF_ACTSCALE], ActScaleN = ((unsigned char *)Infos)[AT_INF_ACTSCALEN]; int A0 = *((unsigned char *) &Infos[AT_INF_A0]); int B0 = *((unsigned char *) &Infos[AT_INF_B0]); int C0 = *((unsigned char *) &Infos[AT_INF_C0]); @@ -426,7 +427,7 @@ static inline void __attribute__((always_inline)) KerParLinearLayerFullFeatB16_S } if (InDim&0x4) Acc = gap_sumdotp4(VectIn[InDim/4-1], W[InDim/4-1], Acc); for (int j=4*(InDim/4); jScale; unsigned char *ScaleN = Arg->ScaleN; signed char * __restrict__ Out = (signed char * __restrict__) Arg->Out; - unsigned char * Infos = Arg->Infos; + unsigned char * Infos = (unsigned char *) Arg->Infos; unsigned int ActScale = ((unsigned char *)Infos)[AT_INF_ACTSCALE], ActScaleN = ((unsigned char *)Infos)[AT_INF_ACTSCALEN]; int A0 = *((unsigned char *) &Infos[AT_INF_A0]); int B0 = *((unsigned char *) &Infos[AT_INF_B0]); int C0 = *((unsigned char *) &Infos[AT_INF_C0]); @@ -504,12 +505,63 @@ static inline void __attribute__((always_inline)) KerParLinearLayerFullFeatB32_S } if (InDim&0x4) Acc = gap_sumdotp4(VectIn[InDim/4-1], W[InDim/4-1], Acc); for (int j=4*(InDim/4); j +#include "CNN_BasicKernels_SQ8.h" + #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wextra" #pragma GCC diagnostic ignored "-Wpointer-sign" #pragma GCC diagnostic ignored "-Wsign-compare" #pragma GCC diagnostic ignored "-Wmaybe-uninitialized" -#include -#include "CNN_BasicKernels_SQ8.h" static int CoreCountDynamic = 1; static int ActiveCore = gap_ncore(); @@ -707,10 +708,10 @@ static inline void __attribute__((always_inline)) KerParMatMulB8_SQ8_act( S3 += V0 * BufferColIn2[i+3*H_In2]; } unsigned int Sc = Scale[Line], ScN = ScaleN[Line]; - S0 = AT_SCALE(S0, Sc, ScN); ACT_SWITCH(S0, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S1 = AT_SCALE(S1, Sc, ScN); ACT_SWITCH(S1, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S2 = AT_SCALE(S2, Sc, ScN); ACT_SWITCH(S2, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S3 = AT_SCALE(S3, Sc, ScN); ACT_SWITCH(S3, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S0 = AT_SCALE(S0, Sc, ScN); ACT_SWITCH(S0, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S1 = AT_SCALE(S1, Sc, ScN); ACT_SWITCH(S1, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S2 = AT_SCALE(S2, Sc, ScN); ACT_SWITCH(S2, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S3 = AT_SCALE(S3, Sc, ScN); ACT_SWITCH(S3, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); v4s R = gap_pack4(gap_clip(S0, 7), gap_clip(S1, 7), gap_clip(S2, 7), gap_clip(S3, 7)); *((v4s *) (Out+(Line+OffLine)*W_Out+4*Col+0+OffCol)) = R; } @@ -739,8 +740,8 @@ static inline void __attribute__((always_inline)) KerParMatMulB8_SQ8_act( S1 += V0 * BufferColIn2[i+1*H_In2]; } unsigned int Sc = Scale[Line], ScN = ScaleN[Line]; - S0 = AT_SCALE(S0, Sc, ScN); ACT_SWITCH(S0, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S1 = AT_SCALE(S1, Sc, ScN); ACT_SWITCH(S1, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S0 = AT_SCALE(S0, Sc, ScN); ACT_SWITCH(S0, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S1 = AT_SCALE(S1, Sc, ScN); ACT_SWITCH(S1, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); Out[(Line+OffLine)*W_Out+2*Col+0+OffCol] = gap_clip(S0, 7); Out[(Line+OffLine)*W_Out+2*Col+1+OffCol] = gap_clip(S1, 7); } @@ -765,7 +766,7 @@ static inline void __attribute__((always_inline)) KerParMatMulB8_SQ8_act( S0 += V0 * BufferColIn2[i]; } unsigned int Sc = Scale[Line], ScN = ScaleN[Line]; - S0 = AT_SCALE(S0, Sc, ScN); ACT_SWITCH(S0, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S0 = AT_SCALE(S0, Sc, ScN); ACT_SWITCH(S0, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); Out[(Line+OffLine)*W_Out+1*Col+0+OffCol] = gap_clip(S0, 7); } gap_waitbarrier(0); @@ -872,7 +873,7 @@ static inline void __attribute__((always_inline)) KerParMatMulSxSyB8_SQ8_act( if (W_In1&0x4) S = gap_sumdotp4(VIn1[W_In1/4-1], VBuff[W_In1/4-1], S); for (i=(W_In1/4)*4; i +#include "CNN_BasicKernels_SQ8.h" + #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wsign-compare" #pragma GCC diagnostic ignored "-Wswitch" - -#include -#include "CNN_BasicKernels_SQ8.h" +#pragma GCC diagnostic ignored "-Wpointer-sign" static int CoreCountDynamic = 1; static int ActiveCore = gap_ncore(); @@ -80,7 +81,7 @@ static inline void __attribute__((always_inline)) KerPar_MM_Conv1D_SQ8_act( signed char * __restrict__ ColBuff = Arg->ColBuff; int Wo = Arg->Wo, Ho = Arg->Ho; - unsigned char * Infos = Arg->Infos; + unsigned char * Infos = (unsigned char *) Arg->Infos; unsigned int ActScale = ((unsigned char *)Infos)[AT_INF_ACTSCALE], ActScaleN = ((unsigned char *)Infos)[AT_INF_ACTSCALEN]; int A0 = *((unsigned char *) &Infos[AT_INF_A0]); int B0 = *((unsigned char *) &Infos[AT_INF_B0]); int C0 = *((unsigned char *) &Infos[AT_INF_C0]); @@ -159,7 +160,7 @@ static inline void __attribute__((always_inline)) KerPar_MM_Conv1D_SQ8_act( S0 = gap_sumdotp4(V1, C1, S0); } unsigned int Sc = Scale[Line], ScN = ScaleN[Line]; - S0 = AT_SCALE(S0, Sc, ScN); ACT_SWITCH(S0, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S0 = AT_SCALE(S0, Sc, ScN); ACT_SWITCH(S0, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); Out[Line*Wo*Ho + l*Wo + c] = gap_clip(S0, 7); } gap_waitbarrier(0); @@ -235,7 +236,7 @@ static inline void __attribute__((always_inline)) KerPar_MM_Conv1x1_HWC_SQ8_act( unsigned char * __restrict__ ScaleN = Arg->ScaleN; int Wo = Arg->Wo, Ho = Arg->Ho; - unsigned char * Infos = Arg->Infos; + unsigned char * Infos = (unsigned char *) Arg->Infos; unsigned int ActScale = ((unsigned char *)Infos)[AT_INF_ACTSCALE], ActScaleN = ((unsigned char *)Infos)[AT_INF_ACTSCALEN]; int A0 = *((unsigned char *) &Infos[AT_INF_A0]); int B0 = *((unsigned char *) &Infos[AT_INF_B0]); int C0 = *((unsigned char *) &Infos[AT_INF_C0]); @@ -281,23 +282,23 @@ static inline void __attribute__((always_inline)) KerPar_MM_Conv1x1_HWC_SQ8_act( } unsigned int Sc, ScN; Sc = *pSc; ScN = *pScN; pSc++; pScN++; - S00 = AT_SCALE(S00, Sc, ScN); ACT_SWITCH(S00, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S01 = AT_SCALE(S01, Sc, ScN); ACT_SWITCH(S01, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S00 = AT_SCALE(S00, Sc, ScN); ACT_SWITCH(S00, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S01 = AT_SCALE(S01, Sc, ScN); ACT_SWITCH(S01, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); *pOut0 = gap_clip(S00, 7); pOut0++; *pOut1 = gap_clip(S01, 7); pOut1++; Sc = *pSc; ScN = *pScN; pSc++; pScN++; - S10 = AT_SCALE(S10, Sc, ScN); ACT_SWITCH(S10, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S11 = AT_SCALE(S11, Sc, ScN); ACT_SWITCH(S11, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S10 = AT_SCALE(S10, Sc, ScN); ACT_SWITCH(S10, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S11 = AT_SCALE(S11, Sc, ScN); ACT_SWITCH(S11, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); *pOut0 = gap_clip(S10, 7); pOut0++; *pOut1 = gap_clip(S11, 7); pOut1++; Sc = *pSc; ScN = *pScN; pSc++; pScN++; - S20 = AT_SCALE(S20, Sc, ScN); ACT_SWITCH(S20, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S21 = AT_SCALE(S21, Sc, ScN); ACT_SWITCH(S21, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S20 = AT_SCALE(S20, Sc, ScN); ACT_SWITCH(S20, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S21 = AT_SCALE(S21, Sc, ScN); ACT_SWITCH(S21, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); *pOut0 = gap_clip(S20, 7); pOut0++; *pOut1 = gap_clip(S21, 7); pOut1++; Sc = *pSc; ScN = *pScN; pSc++; pScN++; - S30 = AT_SCALE(S30, Sc, ScN); ACT_SWITCH(S30, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S31 = AT_SCALE(S31, Sc, ScN); ACT_SWITCH(S31, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S30 = AT_SCALE(S30, Sc, ScN); ACT_SWITCH(S30, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S31 = AT_SCALE(S31, Sc, ScN); ACT_SWITCH(S31, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); *pOut0 = gap_clip(S30, 7); pOut0++; *pOut1 = gap_clip(S31, 7); pOut1++; } @@ -316,8 +317,8 @@ static inline void __attribute__((always_inline)) KerPar_MM_Conv1x1_HWC_SQ8_act( } unsigned int Sc, ScN; Sc = *pSc; ScN = *pScN; pSc++; pScN++; - S00 = AT_SCALE(S00, Sc, ScN); ACT_SWITCH(S00, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S01 = AT_SCALE(S01, Sc, ScN); ACT_SWITCH(S01, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S00 = AT_SCALE(S00, Sc, ScN); ACT_SWITCH(S00, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S01 = AT_SCALE(S01, Sc, ScN); ACT_SWITCH(S01, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); *pOut0 = gap_clip(S00, 7); pOut0++; *pOut1 = gap_clip(S01, 7); pOut1++; } @@ -358,16 +359,16 @@ static inline void __attribute__((always_inline)) KerPar_MM_Conv1x1_HWC_SQ8_act( } unsigned int Sc, ScN; Sc = *pSc; ScN = *pScN; pSc++; pScN++; - S00 = AT_SCALE(S00, Sc, ScN); ACT_SWITCH(S00, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S00 = AT_SCALE(S00, Sc, ScN); ACT_SWITCH(S00, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); *pOut0 = gap_clip(S00, 7); pOut0++; Sc = *pSc; ScN = *pScN; pSc++; pScN++; - S10 = AT_SCALE(S10, Sc, ScN); ACT_SWITCH(S10, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S10 = AT_SCALE(S10, Sc, ScN); ACT_SWITCH(S10, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); *pOut0 = gap_clip(S10, 7); pOut0++; Sc = *pSc; ScN = *pScN; pSc++; pScN++; - S20 = AT_SCALE(S20, Sc, ScN); ACT_SWITCH(S20, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S20 = AT_SCALE(S20, Sc, ScN); ACT_SWITCH(S20, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); *pOut0 = gap_clip(S20, 7); pOut0++; Sc = *pSc; ScN = *pScN; pSc++; pScN++; - S30 = AT_SCALE(S30, Sc, ScN); ACT_SWITCH(S30, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S30 = AT_SCALE(S30, Sc, ScN); ACT_SWITCH(S30, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); *pOut0 = gap_clip(S30, 7); pOut0++; } for (int i=4*(IterOut/4); iScaleN; int Wo = Arg->Wo, Ho = Arg->Ho; - unsigned char * Infos = Arg->Infos; + unsigned char * Infos = (unsigned char *) Arg->Infos; unsigned int ActScale = ((unsigned char *)Infos)[AT_INF_ACTSCALE], ActScaleN = ((unsigned char *)Infos)[AT_INF_ACTSCALEN]; int A0 = *((unsigned char *) &Infos[AT_INF_A0]); int B0 = *((unsigned char *) &Infos[AT_INF_B0]); int C0 = *((unsigned char *) &Infos[AT_INF_C0]); @@ -507,23 +508,23 @@ static inline void __attribute__((always_inline)) Ker_MM_Conv1x1_HWC_SQ8_act( } unsigned int Sc, ScN; Sc = *pSc; ScN = *pScN; pSc++; pScN++; - S00 = AT_SCALE(S00, Sc, ScN); ACT_SWITCH(S00, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S01 = AT_SCALE(S01, Sc, ScN); ACT_SWITCH(S01, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S00 = AT_SCALE(S00, Sc, ScN); ACT_SWITCH(S00, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S01 = AT_SCALE(S01, Sc, ScN); ACT_SWITCH(S01, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); *pOut0 = gap_clip(S00, 7); pOut0++; *pOut1 = gap_clip(S01, 7); pOut1++; Sc = *pSc; ScN = *pScN; pSc++; pScN++; - S10 = AT_SCALE(S10, Sc, ScN); ACT_SWITCH(S10, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S11 = AT_SCALE(S11, Sc, ScN); ACT_SWITCH(S11, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S10 = AT_SCALE(S10, Sc, ScN); ACT_SWITCH(S10, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S11 = AT_SCALE(S11, Sc, ScN); ACT_SWITCH(S11, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); *pOut0 = gap_clip(S10, 7); pOut0++; *pOut1 = gap_clip(S11, 7); pOut1++; Sc = *pSc; ScN = *pScN; pSc++; pScN++; - S20 = AT_SCALE(S20, Sc, ScN); ACT_SWITCH(S20, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S21 = AT_SCALE(S21, Sc, ScN); ACT_SWITCH(S21, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S20 = AT_SCALE(S20, Sc, ScN); ACT_SWITCH(S20, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S21 = AT_SCALE(S21, Sc, ScN); ACT_SWITCH(S21, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); *pOut0 = gap_clip(S20, 7); pOut0++; *pOut1 = gap_clip(S21, 7); pOut1++; Sc = *pSc; ScN = *pScN; pSc++; pScN++; - S30 = AT_SCALE(S30, Sc, ScN); ACT_SWITCH(S30, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S31 = AT_SCALE(S31, Sc, ScN); ACT_SWITCH(S31, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S30 = AT_SCALE(S30, Sc, ScN); ACT_SWITCH(S30, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S31 = AT_SCALE(S31, Sc, ScN); ACT_SWITCH(S31, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); *pOut0 = gap_clip(S30, 7); pOut0++; *pOut1 = gap_clip(S31, 7); pOut1++; } @@ -542,8 +543,8 @@ static inline void __attribute__((always_inline)) Ker_MM_Conv1x1_HWC_SQ8_act( } unsigned int Sc, ScN; Sc = *pSc; ScN = *pScN; pSc++; pScN++; - S00 = AT_SCALE(S00, Sc, ScN); ACT_SWITCH(S00, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S01 = AT_SCALE(S01, Sc, ScN); ACT_SWITCH(S01, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S00 = AT_SCALE(S00, Sc, ScN); ACT_SWITCH(S00, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S01 = AT_SCALE(S01, Sc, ScN); ACT_SWITCH(S01, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); *pOut0 = gap_clip(S00, 7); pOut0++; *pOut1 = gap_clip(S01, 7); pOut1++; } @@ -584,16 +585,16 @@ static inline void __attribute__((always_inline)) Ker_MM_Conv1x1_HWC_SQ8_act( } unsigned int Sc, ScN; Sc = *pSc; ScN = *pScN; pSc++; pScN++; - S00 = AT_SCALE(S00, Sc, ScN); ACT_SWITCH(S00, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S00 = AT_SCALE(S00, Sc, ScN); ACT_SWITCH(S00, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); *pOut0 = gap_clip(S00, 7); pOut0++; Sc = *pSc; ScN = *pScN; pSc++; pScN++; - S10 = AT_SCALE(S10, Sc, ScN); ACT_SWITCH(S10, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S10 = AT_SCALE(S10, Sc, ScN); ACT_SWITCH(S10, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); *pOut0 = gap_clip(S10, 7); pOut0++; Sc = *pSc; ScN = *pScN; pSc++; pScN++; - S20 = AT_SCALE(S20, Sc, ScN); ACT_SWITCH(S20, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S20 = AT_SCALE(S20, Sc, ScN); ACT_SWITCH(S20, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); *pOut0 = gap_clip(S20, 7); pOut0++; Sc = *pSc; ScN = *pScN; pSc++; pScN++; - S30 = AT_SCALE(S30, Sc, ScN); ACT_SWITCH(S30, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S30 = AT_SCALE(S30, Sc, ScN); ACT_SWITCH(S30, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); *pOut0 = gap_clip(S30, 7); pOut0++; } for (int i=4*(OutFeat/4); iColBuff; int Wo = Arg->Wo, Ho = Arg->Ho; - unsigned char * Infos = Arg->Infos; + unsigned char * Infos = (unsigned char *) Arg->Infos; unsigned int ActScale = ((unsigned char *)Infos)[AT_INF_ACTSCALE], ActScaleN = ((unsigned char *)Infos)[AT_INF_ACTSCALEN]; int A0 = *((unsigned char *) &Infos[AT_INF_A0]); int B0 = *((unsigned char *) &Infos[AT_INF_B0]); int C0 = *((unsigned char *) &Infos[AT_INF_C0]); @@ -784,14 +785,14 @@ static inline void __attribute__((always_inline)) KerPar_MM_Conv1D_HWC_SQ8_act( S3 += V0*C3; S7 += V1*C3; pIn++; pIn1++; pC0++; pC1++; pC2++; pC3++; } - S0 = AT_SCALE(S0, pSc[4*Line ], pScN[4*Line ]); ACT_SWITCH(S0, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S1 = AT_SCALE(S1, pSc[4*Line+1], pScN[4*Line+1]); ACT_SWITCH(S1, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S2 = AT_SCALE(S2, pSc[4*Line+2], pScN[4*Line+2]); ACT_SWITCH(S2, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S3 = AT_SCALE(S3, pSc[4*Line+3], pScN[4*Line+3]); ACT_SWITCH(S3, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S4 = AT_SCALE(S4, pSc[4*Line ], pScN[4*Line ]); ACT_SWITCH(S4, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S5 = AT_SCALE(S5, pSc[4*Line+1], pScN[4*Line+1]); ACT_SWITCH(S5, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S6 = AT_SCALE(S6, pSc[4*Line+2], pScN[4*Line+2]); ACT_SWITCH(S6, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S7 = AT_SCALE(S7, pSc[4*Line+3], pScN[4*Line+3]); ACT_SWITCH(S7, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S0 = AT_SCALE(S0, pSc[4*Line ], pScN[4*Line ]); ACT_SWITCH(S0, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S1 = AT_SCALE(S1, pSc[4*Line+1], pScN[4*Line+1]); ACT_SWITCH(S1, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S2 = AT_SCALE(S2, pSc[4*Line+2], pScN[4*Line+2]); ACT_SWITCH(S2, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S3 = AT_SCALE(S3, pSc[4*Line+3], pScN[4*Line+3]); ACT_SWITCH(S3, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S4 = AT_SCALE(S4, pSc[4*Line ], pScN[4*Line ]); ACT_SWITCH(S4, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S5 = AT_SCALE(S5, pSc[4*Line+1], pScN[4*Line+1]); ACT_SWITCH(S5, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S6 = AT_SCALE(S6, pSc[4*Line+2], pScN[4*Line+2]); ACT_SWITCH(S6, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S7 = AT_SCALE(S7, pSc[4*Line+3], pScN[4*Line+3]); ACT_SWITCH(S7, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); v4s R1 = gap_pack4(gap_clip(S0, 7), gap_clip(S1, 7), gap_clip(S2, 7), gap_clip(S3, 7)); v4s R2 = gap_pack4(gap_clip(S4, 7), gap_clip(S5, 7), gap_clip(S6, 7), gap_clip(S7, 7)); *((v4s *) (pOut0+4*Line)) = R1; @@ -811,8 +812,8 @@ static inline void __attribute__((always_inline)) KerPar_MM_Conv1D_HWC_SQ8_act( S0 += V0*C0; S4 += V1*C0; pIn++; pIn1++; pC++; } - S0 = AT_SCALE(S0, pSc[i], pScN[i]); ACT_SWITCH(S0, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S4 = AT_SCALE(S4, pSc[i], pScN[i]); ACT_SWITCH(S4, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S0 = AT_SCALE(S0, pSc[i], pScN[i]); ACT_SWITCH(S0, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S4 = AT_SCALE(S4, pSc[i], pScN[i]); ACT_SWITCH(S4, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); *(pOut0+i) = gap_clip(S0, 7); *(pOut1+i) = gap_clip(S4, 7); } @@ -868,10 +869,10 @@ static inline void __attribute__((always_inline)) KerPar_MM_Conv1D_HWC_SQ8_act( S3 += V0*C3; pIn++; pC0++; pC1++; pC2++; pC3++; } - S0 = AT_SCALE(S0, pSc[4*Line ], pScN[4*Line ]); ACT_SWITCH(S0, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S1 = AT_SCALE(S1, pSc[4*Line+1], pScN[4*Line+1]); ACT_SWITCH(S1, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S2 = AT_SCALE(S2, pSc[4*Line+2], pScN[4*Line+2]); ACT_SWITCH(S2, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S3 = AT_SCALE(S3, pSc[4*Line+3], pScN[4*Line+3]); ACT_SWITCH(S3, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S0 = AT_SCALE(S0, pSc[4*Line ], pScN[4*Line ]); ACT_SWITCH(S0, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S1 = AT_SCALE(S1, pSc[4*Line+1], pScN[4*Line+1]); ACT_SWITCH(S1, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S2 = AT_SCALE(S2, pSc[4*Line+2], pScN[4*Line+2]); ACT_SWITCH(S2, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S3 = AT_SCALE(S3, pSc[4*Line+3], pScN[4*Line+3]); ACT_SWITCH(S3, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); v4s R1 = gap_pack4(gap_clip(S0, 7), gap_clip(S1, 7), gap_clip(S2, 7), gap_clip(S3, 7)); *((v4s *) (pOut0+4*Line)) = R1; } @@ -888,7 +889,7 @@ static inline void __attribute__((always_inline)) KerPar_MM_Conv1D_HWC_SQ8_act( S0 += V0*C0; pIn++; pC++; } - S0 = AT_SCALE(S0, pSc[i], pScN[i]); ACT_SWITCH(S0, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S0 = AT_SCALE(S0, pSc[i], pScN[i]); ACT_SWITCH(S0, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); *(pOut0+i) = gap_clip(S0, 7); } gap_waitbarrier(0); @@ -963,7 +964,7 @@ static inline void __attribute__((always_inline)) KerPar_MM_Conv1D_DxDy_SQ8_act( signed char * __restrict__ ColBuff = Arg->ColBuff; int Wo = Arg->Wo, Ho = Arg->Ho; - unsigned char * Infos = Arg->Infos; + unsigned char * Infos = (unsigned char *) Arg->Infos; unsigned int ActScale = ((unsigned char *)Infos)[AT_INF_ACTSCALE], ActScaleN = ((unsigned char *)Infos)[AT_INF_ACTSCALEN]; int A0 = *((unsigned char *) &Infos[AT_INF_A0]); int B0 = *((unsigned char *) &Infos[AT_INF_B0]); int C0 = *((unsigned char *) &Infos[AT_INF_C0]); @@ -1010,7 +1011,7 @@ static inline void __attribute__((always_inline)) KerPar_MM_Conv1D_DxDy_SQ8_act( S0 = gap_sumdotp4(V1, C1, S0); } unsigned int Sc = Scale[Line], ScN = ScaleN[Line]; - S0 = AT_SCALE(S0, Sc, ScN); ACT_SWITCH(S0, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S0 = AT_SCALE(S0, Sc, ScN); ACT_SWITCH(S0, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); Out[Line*Wo*Ho + l*Wo + c] = gap_clip(S0, 7); } gap_waitbarrier(0); @@ -1089,7 +1090,7 @@ static inline void __attribute__((always_inline)) KerPar_MM_Conv1D_DxDy_HWC_SQ8_ int Wo = Arg->Wo, Ho = Arg->Ho; - unsigned char * Infos = Arg->Infos; + unsigned char * Infos = (unsigned char *) Arg->Infos; unsigned int ActScale = ((unsigned char *)Infos)[AT_INF_ACTSCALE], ActScaleN = ((unsigned char *)Infos)[AT_INF_ACTSCALEN]; int A0 = *((unsigned char *) &Infos[AT_INF_A0]); int B0 = *((unsigned char *) &Infos[AT_INF_B0]); int C0 = *((unsigned char *) &Infos[AT_INF_C0]); @@ -1210,14 +1211,14 @@ static inline void __attribute__((always_inline)) KerPar_MM_Conv1D_DxDy_HWC_SQ8_ S3 += V0*C3; S7 += V1*C3; pIn++; pIn1++; pC0++; pC1++; pC2++; pC3++; } - S0 = AT_SCALE(S0, pSc[4*Line ], pScN[4*Line ]); ACT_SWITCH(S0, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S1 = AT_SCALE(S1, pSc[4*Line+1], pScN[4*Line+1]); ACT_SWITCH(S1, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S2 = AT_SCALE(S2, pSc[4*Line+2], pScN[4*Line+2]); ACT_SWITCH(S2, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S3 = AT_SCALE(S3, pSc[4*Line+3], pScN[4*Line+3]); ACT_SWITCH(S3, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S4 = AT_SCALE(S4, pSc[4*Line ], pScN[4*Line ]); ACT_SWITCH(S4, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S5 = AT_SCALE(S5, pSc[4*Line+1], pScN[4*Line+1]); ACT_SWITCH(S5, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S6 = AT_SCALE(S6, pSc[4*Line+2], pScN[4*Line+2]); ACT_SWITCH(S6, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S7 = AT_SCALE(S7, pSc[4*Line+3], pScN[4*Line+3]); ACT_SWITCH(S7, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S0 = AT_SCALE(S0, pSc[4*Line ], pScN[4*Line ]); ACT_SWITCH(S0, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S1 = AT_SCALE(S1, pSc[4*Line+1], pScN[4*Line+1]); ACT_SWITCH(S1, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S2 = AT_SCALE(S2, pSc[4*Line+2], pScN[4*Line+2]); ACT_SWITCH(S2, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S3 = AT_SCALE(S3, pSc[4*Line+3], pScN[4*Line+3]); ACT_SWITCH(S3, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S4 = AT_SCALE(S4, pSc[4*Line ], pScN[4*Line ]); ACT_SWITCH(S4, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S5 = AT_SCALE(S5, pSc[4*Line+1], pScN[4*Line+1]); ACT_SWITCH(S5, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S6 = AT_SCALE(S6, pSc[4*Line+2], pScN[4*Line+2]); ACT_SWITCH(S6, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S7 = AT_SCALE(S7, pSc[4*Line+3], pScN[4*Line+3]); ACT_SWITCH(S7, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); v4s R1 = gap_pack4(gap_clip(S0, 7), gap_clip(S1, 7), gap_clip(S2, 7), gap_clip(S3, 7)); v4s R2 = gap_pack4(gap_clip(S4, 7), gap_clip(S5, 7), gap_clip(S6, 7), gap_clip(S7, 7)); *((v4s *) (pOut0+4*Line)) = R1; @@ -1237,8 +1238,8 @@ static inline void __attribute__((always_inline)) KerPar_MM_Conv1D_DxDy_HWC_SQ8_ S0 += V0*C0; S4 += V1*C0; pIn++; pIn1++; pC++; } - S0 = AT_SCALE(S0, pSc[i], pScN[i]); ACT_SWITCH(S0, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S4 = AT_SCALE(S4, pSc[i], pScN[i]); ACT_SWITCH(S4, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S0 = AT_SCALE(S0, pSc[i], pScN[i]); ACT_SWITCH(S0, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S4 = AT_SCALE(S4, pSc[i], pScN[i]); ACT_SWITCH(S4, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); *(pOut0+i) = gap_clip(S0, 7); *(pOut1+i) = gap_clip(S4, 7); } @@ -1305,10 +1306,10 @@ static inline void __attribute__((always_inline)) KerPar_MM_Conv1D_DxDy_HWC_SQ8_ S3 += V0*C3; pIn++; pC0++; pC1++; pC2++; pC3++; } - S0 = AT_SCALE(S0, pSc[4*Line ], pScN[4*Line ]); ACT_SWITCH(S0, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S1 = AT_SCALE(S1, pSc[4*Line+1], pScN[4*Line+1]); ACT_SWITCH(S1, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S2 = AT_SCALE(S2, pSc[4*Line+2], pScN[4*Line+2]); ACT_SWITCH(S2, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S3 = AT_SCALE(S3, pSc[4*Line+3], pScN[4*Line+3]); ACT_SWITCH(S3, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S0 = AT_SCALE(S0, pSc[4*Line ], pScN[4*Line ]); ACT_SWITCH(S0, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S1 = AT_SCALE(S1, pSc[4*Line+1], pScN[4*Line+1]); ACT_SWITCH(S1, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S2 = AT_SCALE(S2, pSc[4*Line+2], pScN[4*Line+2]); ACT_SWITCH(S2, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S3 = AT_SCALE(S3, pSc[4*Line+3], pScN[4*Line+3]); ACT_SWITCH(S3, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); v4s R1 = gap_pack4(gap_clip(S0, 7), gap_clip(S1, 7), gap_clip(S2, 7), gap_clip(S3, 7)); *((v4s *) (pOut0+4*Line)) = R1; } @@ -1325,7 +1326,7 @@ static inline void __attribute__((always_inline)) KerPar_MM_Conv1D_DxDy_HWC_SQ8_ S0 += V0*C0; pIn++; pC++; } - S0 = AT_SCALE(S0, pSc[i], pScN[i]); ACT_SWITCH(S0, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S0 = AT_SCALE(S0, pSc[i], pScN[i]); ACT_SWITCH(S0, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); *(pOut0+i) = gap_clip(S0, 7); } gap_waitbarrier(0); @@ -1397,7 +1398,7 @@ static inline void __attribute__((always_inline)) KerPar_MM_Conv2D_SQ8_act( signed char * __restrict__ ColBuff = Arg->ColBuff; int Wo = Arg->Wo, Ho = Arg->Ho; - unsigned char * Infos = Arg->Infos; + unsigned char * Infos = (unsigned char *) Arg->Infos; unsigned int ActScale = ((unsigned char *)Infos)[AT_INF_ACTSCALE], ActScaleN = ((unsigned char *)Infos)[AT_INF_ACTSCALEN]; int A0 = *((unsigned char *) &Infos[AT_INF_A0]); int B0 = *((unsigned char *) &Infos[AT_INF_B0]); int C0 = *((unsigned char *) &Infos[AT_INF_C0]); @@ -1504,7 +1505,7 @@ static inline void __attribute__((always_inline)) KerPar_MM_Conv2D_SQ8_act( } unsigned int Sc = Scale[Line], ScN = ScaleN[Line]; // printf("Out[F:%d, H:%d, W:%d] = (%d * %d) >> %d = %d\n", Line, l, c, S0, Sc, ScN, gap_clip(AT_SCALE(S0, Sc, ScN), 7)); - S0 = AT_SCALE(S0, Sc, ScN); ACT_SWITCH(S0, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S0 = AT_SCALE(S0, Sc, ScN); ACT_SWITCH(S0, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); Out[Line*Wo*Ho + l*Wo + c] = gap_clip(S0, 7); } gap_waitbarrier(0); @@ -1580,7 +1581,7 @@ static inline void __attribute__((always_inline)) KerPar_MM_Conv2D_HWC_SQ8_act( unsigned char * __restrict__ ScaleN = Arg->ScaleN; signed char * __restrict__ ColBuff = Arg->ColBuff; int Wo = Arg->Wo, Ho = Arg->Ho; - unsigned char * Infos = Arg->Infos; + unsigned char * Infos = (unsigned char *) Arg->Infos; unsigned int ActScale = ((unsigned char *)Infos)[AT_INF_ACTSCALE], ActScaleN = ((unsigned char *)Infos)[AT_INF_ACTSCALEN]; int A0 = *((unsigned char *) &Infos[AT_INF_A0]); int B0 = *((unsigned char *) &Infos[AT_INF_B0]); int C0 = *((unsigned char *) &Infos[AT_INF_C0]); @@ -1703,14 +1704,14 @@ static inline void __attribute__((always_inline)) KerPar_MM_Conv2D_HWC_SQ8_act( S3 += V0*C3; S7 += V1*C3; pIn++; pIn1++; pC0++; pC1++; pC2++; pC3++; } - S0 = AT_SCALE(S0, pSc[4*Line ], pScN[4*Line ]); ACT_SWITCH(S0, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S1 = AT_SCALE(S1, pSc[4*Line+1], pScN[4*Line+1]); ACT_SWITCH(S1, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S2 = AT_SCALE(S2, pSc[4*Line+2], pScN[4*Line+2]); ACT_SWITCH(S2, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S3 = AT_SCALE(S3, pSc[4*Line+3], pScN[4*Line+3]); ACT_SWITCH(S3, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S4 = AT_SCALE(S4, pSc[4*Line ], pScN[4*Line ]); ACT_SWITCH(S4, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S5 = AT_SCALE(S5, pSc[4*Line+1], pScN[4*Line+1]); ACT_SWITCH(S5, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S6 = AT_SCALE(S6, pSc[4*Line+2], pScN[4*Line+2]); ACT_SWITCH(S6, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S7 = AT_SCALE(S7, pSc[4*Line+3], pScN[4*Line+3]); ACT_SWITCH(S7, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S0 = AT_SCALE(S0, pSc[4*Line ], pScN[4*Line ]); ACT_SWITCH(S0, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S1 = AT_SCALE(S1, pSc[4*Line+1], pScN[4*Line+1]); ACT_SWITCH(S1, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S2 = AT_SCALE(S2, pSc[4*Line+2], pScN[4*Line+2]); ACT_SWITCH(S2, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S3 = AT_SCALE(S3, pSc[4*Line+3], pScN[4*Line+3]); ACT_SWITCH(S3, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S4 = AT_SCALE(S4, pSc[4*Line ], pScN[4*Line ]); ACT_SWITCH(S4, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S5 = AT_SCALE(S5, pSc[4*Line+1], pScN[4*Line+1]); ACT_SWITCH(S5, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S6 = AT_SCALE(S6, pSc[4*Line+2], pScN[4*Line+2]); ACT_SWITCH(S6, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S7 = AT_SCALE(S7, pSc[4*Line+3], pScN[4*Line+3]); ACT_SWITCH(S7, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); v4s R1 = gap_pack4(gap_clip(S0, 7), gap_clip(S1, 7), gap_clip(S2, 7), gap_clip(S3, 7)); v4s R2 = gap_pack4(gap_clip(S4, 7), gap_clip(S5, 7), gap_clip(S6, 7), gap_clip(S7, 7)); *((v4s *) (pOut0+4*Line)) = R1; @@ -1730,8 +1731,8 @@ static inline void __attribute__((always_inline)) KerPar_MM_Conv2D_HWC_SQ8_act( S0 += V0*C0; S4 += V1*C0; pIn++; pIn1++; pC++; } - S0 = AT_SCALE(S0, pSc[i], pScN[i]); ACT_SWITCH(S0, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S4 = AT_SCALE(S4, pSc[i], pScN[i]); ACT_SWITCH(S4, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S0 = AT_SCALE(S0, pSc[i], pScN[i]); ACT_SWITCH(S0, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S4 = AT_SCALE(S4, pSc[i], pScN[i]); ACT_SWITCH(S4, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); *(pOut0+i) = gap_clip(S0, 7); *(pOut1+i) = gap_clip(S4, 7); } @@ -1804,10 +1805,10 @@ static inline void __attribute__((always_inline)) KerPar_MM_Conv2D_HWC_SQ8_act( S3 += V0*C3; pIn++; pC0++; pC1++; pC2++; pC3++; } - S0 = AT_SCALE(S0, pSc[4*Line ], pScN[4*Line ]); ACT_SWITCH(S0, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S1 = AT_SCALE(S1, pSc[4*Line+1], pScN[4*Line+1]); ACT_SWITCH(S1, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S2 = AT_SCALE(S2, pSc[4*Line+2], pScN[4*Line+2]); ACT_SWITCH(S2, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S3 = AT_SCALE(S3, pSc[4*Line+3], pScN[4*Line+3]); ACT_SWITCH(S3, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S0 = AT_SCALE(S0, pSc[4*Line ], pScN[4*Line ]); ACT_SWITCH(S0, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S1 = AT_SCALE(S1, pSc[4*Line+1], pScN[4*Line+1]); ACT_SWITCH(S1, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S2 = AT_SCALE(S2, pSc[4*Line+2], pScN[4*Line+2]); ACT_SWITCH(S2, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S3 = AT_SCALE(S3, pSc[4*Line+3], pScN[4*Line+3]); ACT_SWITCH(S3, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); v4s R1 = gap_pack4(gap_clip(S0, 7), gap_clip(S1, 7), gap_clip(S2, 7), gap_clip(S3, 7)); *((v4s *) (pOut0+4*Line)) = R1; } @@ -1824,7 +1825,7 @@ static inline void __attribute__((always_inline)) KerPar_MM_Conv2D_HWC_SQ8_act( S0 += V0*C0; pIn++; pC++; } - S0 = AT_SCALE(S0, pSc[i], pScN[i]); ACT_SWITCH(S0, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S0 = AT_SCALE(S0, pSc[i], pScN[i]); ACT_SWITCH(S0, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); *(pOut0+i) = gap_clip(S0, 7); } gap_waitbarrier(0); @@ -1902,7 +1903,7 @@ static inline void __attribute__((always_inline)) Ker_MM_Conv2D_HWC_SQ8_act( signed char * __restrict__ ColBuff = Arg->ColBuff; signed char * __restrict__ ColBuff1; int Wo = Arg->Wo, Ho = Arg->Ho; - unsigned char * Infos = Arg->Infos; + unsigned char * Infos = (unsigned char *) Arg->Infos; unsigned int ActScale = ((unsigned char *)Infos)[AT_INF_ACTSCALE], ActScaleN = ((unsigned char *)Infos)[AT_INF_ACTSCALEN]; int A0 = *((unsigned char *) &Infos[AT_INF_A0]); int B0 = *((unsigned char *) &Infos[AT_INF_B0]); int C0 = *((unsigned char *) &Infos[AT_INF_C0]); @@ -2021,23 +2022,23 @@ static inline void __attribute__((always_inline)) Ker_MM_Conv2D_HWC_SQ8_act( } unsigned int Sc, ScN; Sc = *pSc; ScN = *pScN; pSc++; pScN++; - S00 = AT_SCALE(S00, Sc, ScN); ACT_SWITCH(S00, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S01 = AT_SCALE(S01, Sc, ScN); ACT_SWITCH(S01, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S00 = AT_SCALE(S00, Sc, ScN); ACT_SWITCH(S00, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S01 = AT_SCALE(S01, Sc, ScN); ACT_SWITCH(S01, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); *pOut0 = gap_clip(S00, 7); pOut0++; *pOut1 = gap_clip(S01, 7); pOut1++; Sc = *pSc; ScN = *pScN; pSc++; pScN++; - S10 = AT_SCALE(S10, Sc, ScN); ACT_SWITCH(S10, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S11 = AT_SCALE(S11, Sc, ScN); ACT_SWITCH(S11, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S10 = AT_SCALE(S10, Sc, ScN); ACT_SWITCH(S10, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S11 = AT_SCALE(S11, Sc, ScN); ACT_SWITCH(S11, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); *pOut0 = gap_clip(S10, 7); pOut0++; *pOut1 = gap_clip(S11, 7); pOut1++; Sc = *pSc; ScN = *pScN; pSc++; pScN++; - S20 = AT_SCALE(S20, Sc, ScN); ACT_SWITCH(S20, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S21 = AT_SCALE(S21, Sc, ScN); ACT_SWITCH(S21, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S20 = AT_SCALE(S20, Sc, ScN); ACT_SWITCH(S20, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S21 = AT_SCALE(S21, Sc, ScN); ACT_SWITCH(S21, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); *pOut0 = gap_clip(S20, 7); pOut0++; *pOut1 = gap_clip(S21, 7); pOut1++; Sc = *pSc; ScN = *pScN; pSc++; pScN++; - S30 = AT_SCALE(S30, Sc, ScN); ACT_SWITCH(S30, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S31 = AT_SCALE(S31, Sc, ScN); ACT_SWITCH(S31, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S30 = AT_SCALE(S30, Sc, ScN); ACT_SWITCH(S30, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S31 = AT_SCALE(S31, Sc, ScN); ACT_SWITCH(S31, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); *pOut0 = gap_clip(S30, 7); pOut0++; *pOut1 = gap_clip(S31, 7); pOut1++; } @@ -2056,8 +2057,8 @@ static inline void __attribute__((always_inline)) Ker_MM_Conv2D_HWC_SQ8_act( } unsigned int Sc, ScN; Sc = *pSc; ScN = *pScN; pSc++; pScN++; - S00 = AT_SCALE(S00, Sc, ScN); ACT_SWITCH(S00, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S01 = AT_SCALE(S01, Sc, ScN); ACT_SWITCH(S01, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S00 = AT_SCALE(S00, Sc, ScN); ACT_SWITCH(S00, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S01 = AT_SCALE(S01, Sc, ScN); ACT_SWITCH(S01, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); *pOut0 = gap_clip(S00, 7); pOut0++; *pOut1 = gap_clip(S01, 7); pOut1++; } @@ -2138,16 +2139,16 @@ static inline void __attribute__((always_inline)) Ker_MM_Conv2D_HWC_SQ8_act( } unsigned int Sc, ScN; Sc = *pSc; ScN = *pScN; pSc++; pScN++; - S00 = AT_SCALE(S00, Sc, ScN); ACT_SWITCH(S00, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S00 = AT_SCALE(S00, Sc, ScN); ACT_SWITCH(S00, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); *pOut0 = gap_clip(S00, 7); pOut0++; Sc = *pSc; ScN = *pScN; pSc++; pScN++; - S10 = AT_SCALE(S10, Sc, ScN); ACT_SWITCH(S10, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S10 = AT_SCALE(S10, Sc, ScN); ACT_SWITCH(S10, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); *pOut0 = gap_clip(S10, 7); pOut0++; Sc = *pSc; ScN = *pScN; pSc++; pScN++; - S20 = AT_SCALE(S20, Sc, ScN); ACT_SWITCH(S20, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S20 = AT_SCALE(S20, Sc, ScN); ACT_SWITCH(S20, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); *pOut0 = gap_clip(S20, 7); pOut0++; Sc = *pSc; ScN = *pScN; pSc++; pScN++; - S30 = AT_SCALE(S30, Sc, ScN); ACT_SWITCH(S30, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S30 = AT_SCALE(S30, Sc, ScN); ACT_SWITCH(S30, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); *pOut0 = gap_clip(S30, 7); pOut0++; } for (int i=4*(IterOut/4); iScaleN; signed char * __restrict__ ColBuff = Arg->ColBuff; int Wo = Arg->Wo, Ho = Arg->Ho; - unsigned char * Infos = Arg->Infos; + unsigned char * Infos = (unsigned char *) Arg->Infos; unsigned int ActScale = ((unsigned char *)Infos)[AT_INF_ACTSCALE], ActScaleN = ((unsigned char *)Infos)[AT_INF_ACTSCALEN]; int A0 = *((unsigned char *) &Infos[AT_INF_A0]); int B0 = *((unsigned char *) &Infos[AT_INF_B0]); int C0 = *((unsigned char *) &Infos[AT_INF_C0]); @@ -2292,7 +2293,7 @@ static inline void __attribute__((always_inline)) KerPar_MM_Conv2D_DxDy_SQ8_act( S0 = gap_sumdotp4(V1, C1, S0); } unsigned int Sc = Scale[Line], ScN = ScaleN[Line]; - S0 = AT_SCALE(S0, Sc, ScN); ACT_SWITCH(S0, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S0 = AT_SCALE(S0, Sc, ScN); ACT_SWITCH(S0, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); Out[Line*Wo*Ho + l*Wo + c] = gap_clip(S0, 7); } gap_waitbarrier(0); @@ -2370,7 +2371,7 @@ static inline void __attribute__((always_inline)) KerPar_MM_Conv2D_DxDy_HWC_SQ8_ unsigned char * __restrict__ ScaleN = Arg->ScaleN; signed char * __restrict__ ColBuff = Arg->ColBuff; int Wo = Arg->Wo, Ho = Arg->Ho; - unsigned char * Infos = Arg->Infos; + unsigned char * Infos = (unsigned char *) Arg->Infos; unsigned int ActScale = ((unsigned char *)Infos)[AT_INF_ACTSCALE], ActScaleN = ((unsigned char *)Infos)[AT_INF_ACTSCALEN]; int A0 = *((unsigned char *) &Infos[AT_INF_A0]); int B0 = *((unsigned char *) &Infos[AT_INF_B0]); int C0 = *((unsigned char *) &Infos[AT_INF_C0]); @@ -2490,14 +2491,14 @@ This part is more efficient but NOT WORKING ???? TOCHECK S3 += V0*C3; S7 += V1*C3; pIn++; pIn1++; pC0++; pC1++; pC2++; pC3++; } - S0 = AT_SCALE(S0, pSc[4*Line ], pScN[4*Line ]); ACT_SWITCH(S0, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S1 = AT_SCALE(S1, pSc[4*Line+1], pScN[4*Line+1]); ACT_SWITCH(S1, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S2 = AT_SCALE(S2, pSc[4*Line+2], pScN[4*Line+2]); ACT_SWITCH(S2, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S3 = AT_SCALE(S3, pSc[4*Line+3], pScN[4*Line+3]); ACT_SWITCH(S3, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S4 = AT_SCALE(S4, pSc[4*Line ], pScN[4*Line ]); ACT_SWITCH(S4, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S5 = AT_SCALE(S5, pSc[4*Line+1], pScN[4*Line+1]); ACT_SWITCH(S5, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S6 = AT_SCALE(S6, pSc[4*Line+2], pScN[4*Line+2]); ACT_SWITCH(S6, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S7 = AT_SCALE(S7, pSc[4*Line+3], pScN[4*Line+3]); ACT_SWITCH(S7, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S0 = AT_SCALE(S0, pSc[4*Line ], pScN[4*Line ]); ACT_SWITCH(S0, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S1 = AT_SCALE(S1, pSc[4*Line+1], pScN[4*Line+1]); ACT_SWITCH(S1, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S2 = AT_SCALE(S2, pSc[4*Line+2], pScN[4*Line+2]); ACT_SWITCH(S2, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S3 = AT_SCALE(S3, pSc[4*Line+3], pScN[4*Line+3]); ACT_SWITCH(S3, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S4 = AT_SCALE(S4, pSc[4*Line ], pScN[4*Line ]); ACT_SWITCH(S4, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S5 = AT_SCALE(S5, pSc[4*Line+1], pScN[4*Line+1]); ACT_SWITCH(S5, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S6 = AT_SCALE(S6, pSc[4*Line+2], pScN[4*Line+2]); ACT_SWITCH(S6, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S7 = AT_SCALE(S7, pSc[4*Line+3], pScN[4*Line+3]); ACT_SWITCH(S7, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); v4s R1 = gap_pack4(gap_clip(S0, 7), gap_clip(S1, 7), gap_clip(S2, 7), gap_clip(S3, 7)); v4s R2 = gap_pack4(gap_clip(S4, 7), gap_clip(S5, 7), gap_clip(S6, 7), gap_clip(S7, 7)); *((v4s *) (pOut0+4*Line)) = R1; @@ -2517,8 +2518,8 @@ This part is more efficient but NOT WORKING ???? TOCHECK S0 += V0*C0; S4 += V1*C0; pIn++; pIn1++; pC++; } - S0 = AT_SCALE(S0, pSc[i], pScN[i]); ACT_SWITCH(S0, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); - S4 = AT_SCALE(S4, pSc[i], pScN[i]); ACT_SWITCH(S4, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S0 = AT_SCALE(S0, pSc[i], pScN[i]); ACT_SWITCH(S0, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); + S4 = AT_SCALE(S4, pSc[i], pScN[i]); ACT_SWITCH(S4, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); *(pOut0+i) = gap_clip(S0, 7); *(pOut1+i) = gap_clip(S4, 7); } @@ -2570,16 +2571,16 @@ This part is more efficient but NOT WORKING ???? TOCHECK } unsigned int Sc, ScN; Sc = *pSc; ScN = *pScN; pSc++; pScN++; - S0 = AT_SCALE(S0, Sc, ScN); ACT_SWITCH(S0, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S0 = AT_SCALE(S0, Sc, ScN); ACT_SWITCH(S0, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); *pOut0 = gap_clip(S0, 7); pOut0++; Sc = *pSc; ScN = *pScN; pSc++; pScN++; - S1 = AT_SCALE(S1, Sc, ScN); ACT_SWITCH(S1, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S1 = AT_SCALE(S1, Sc, ScN); ACT_SWITCH(S1, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); *pOut0 = gap_clip(S1, 7); pOut0++; Sc = *pSc; ScN = *pScN; pSc++; pScN++; - S2 = AT_SCALE(S2, Sc, ScN); ACT_SWITCH(S2, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S2 = AT_SCALE(S2, Sc, ScN); ACT_SWITCH(S2, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); *pOut0 = gap_clip(S2, 7); pOut0++; Sc = *pSc; ScN = *pScN; pSc++; pScN++; - S3 = AT_SCALE(S3, Sc, ScN); ACT_SWITCH(S3, Activation, ActScale, ActScaleN, A0, B0, C0, 8, 0); + S3 = AT_SCALE(S3, Sc, ScN); ACT_SWITCH(S3, Activation, ActScale, ActScaleN, A0, B0, C0, 0, 0); *pOut0 = gap_clip(S3, 7); pOut0++; } for (int i=4*(IterOut/4); i +#include "Gap.h" +#include "CNN_BasicKernels_SQ8.h" + #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wextra" #pragma GCC diagnostic ignored "-Wpointer-sign" @@ -21,10 +25,6 @@ #pragma GCC diagnostic ignored "-Wmaybe-uninitialized" #pragma GCC diagnostic ignored "-Wswitch" -#include -#include "Gap.h" -#include "CNN_BasicKernels_SQ8.h" - static int CoreCountDynamic = 1; static int ActiveCore = gap_ncore(); @@ -3209,11 +3209,28 @@ void KerPoolNxMStrideSxSy_ReLUMN_SQ8(KerPool_SQ8_T *Arg) } +/* HWC Version */ +#define KER_POOL_ACT(Activation, p_type, n_bits, is_unsigned) \ +do { \ + int Size = Wo*Ho*Feat; \ + int CoreId = gap_coreid(), ChunkCell = ChunkSize(Size), First = CoreId*ChunkCell, Last = Min(First+ChunkCell, Size); \ + signed char * __restrict__ Infos = (signed char *__restrict__) Arg->Infos; \ + unsigned int ActScale = ((unsigned char *)Infos)[AT_INF_ACTSCALE], ActScaleN = ((unsigned char *)Infos)[AT_INF_ACTSCALEN]; \ + int A0 = arr_at_as(Infos, AT_INF_A0, p_type); int B0 = arr_at_as(Infos, AT_INF_B0, p_type); int C0 = arr_at_as(Infos, AT_INF_C0, p_type); \ +\ + for (int i=First; iIn; @@ -3262,11 +3279,55 @@ void KerParMaxPoolNxMStrideSxSy_HWC_SQ8(Ker_MM_Pool_SQ8_T *Arg) PosL += Sy; } gap_waitbarrier(0); - // KerParPoolActivation(Out, Wo, Ho, First, Last, Infos, Arg->Activation); - // gap_waitbarrier(0); + if (Activation != ACT_NONE) { + KER_POOL_ACT(Activation, unsigned char, 8, 0); + } +} + +void KerParMaxPoolNxMStrideSxSy_HWC_SQ8(Ker_MM_Pool_SQ8_T *Arg) { + KerParMaxPoolNxMStrideSxSy_HWC_SQ8_act(Arg, ACT_NONE); +} + +void KerParMaxPoolNxMStrideSxSy_HWC_ReLU_SQ8(Ker_MM_Pool_SQ8_T *Arg) { + KerParMaxPoolNxMStrideSxSy_HWC_SQ8_act(Arg, ACT_RELU); +} + +void KerParMaxPoolNxMStrideSxSy_HWC_ReLUN_SQ8(Ker_MM_Pool_SQ8_T *Arg) { + KerParMaxPoolNxMStrideSxSy_HWC_SQ8_act(Arg, ACT_RELUN); +} + +void KerParMaxPoolNxMStrideSxSy_HWC_ReLUM_SQ8(Ker_MM_Pool_SQ8_T *Arg) { + KerParMaxPoolNxMStrideSxSy_HWC_SQ8_act(Arg, ACT_RELUM); +} + +void KerParMaxPoolNxMStrideSxSy_HWC_ReLUMN_SQ8(Ker_MM_Pool_SQ8_T *Arg) { + KerParMaxPoolNxMStrideSxSy_HWC_SQ8_act(Arg, ACT_RELUMN); } -void KerParMaxPoolNxMStrideSxSy_HWC_USQ8(Ker_MM_Pool_USQ8_T *Arg) +void KerParMaxPoolNxMStrideSxSy_HWC_HSigmoid_SQ8(Ker_MM_Pool_SQ8_T *Arg) { + KerParMaxPoolNxMStrideSxSy_HWC_SQ8_act(Arg, ACT_HSIGMOID); +} + +void KerParMaxPoolNxMStrideSxSy_HWC_HSwish_SQ8(Ker_MM_Pool_SQ8_T *Arg) { + KerParMaxPoolNxMStrideSxSy_HWC_SQ8_act(Arg, ACT_HSWISH); +} + +void KerParMaxPoolNxMStrideSxSy_HWC_LeakyReLU_SQ8(Ker_MM_Pool_SQ8_T *Arg) { + KerParMaxPoolNxMStrideSxSy_HWC_SQ8_act(Arg, ACT_LEAKYRELU); +} + +void KerParMaxPoolNxMStrideSxSy_HWC_Sigmoid_SQ8(Ker_MM_Pool_SQ8_T *Arg) { + KerParMaxPoolNxMStrideSxSy_HWC_SQ8_act(Arg, ACT_SIGMOID); +} + +void KerParMaxPoolNxMStrideSxSy_HWC_Tanh_SQ8(Ker_MM_Pool_SQ8_T *Arg) { + KerParMaxPoolNxMStrideSxSy_HWC_SQ8_act(Arg, ACT_TANH); +} + +static inline void __attribute__((always_inline)) KerParMaxPoolNxMStrideSxSy_HWC_USQ8_act( + Ker_MM_Pool_USQ8_T *Arg, + CNN_ActivationOper_T Activation +) { unsigned char *__restrict__ In = Arg->In; @@ -3282,7 +3343,7 @@ void KerParMaxPoolNxMStrideSxSy_HWC_USQ8(Ker_MM_Pool_USQ8_T *Arg) unsigned int CoreId = gap_coreid(), ChunkCell = ChunkSize(Feat), First = CoreId*ChunkCell, Last = Min(Feat, First+ChunkCell); int PosL = Arg->FirstTile?(-PadT):0; - int Iter = Last-First; + int Iter = Max(0, Last-First); for (int l=0; lActivation); - // gap_waitbarrier(0); + if (Activation != ACT_NONE) { + KER_POOL_ACT(Activation, unsigned char, 8, 1); + } +} + +void KerParMaxPoolNxMStrideSxSy_HWC_USQ8(Ker_MM_Pool_USQ8_T *Arg) { + KerParMaxPoolNxMStrideSxSy_HWC_USQ8_act(Arg, ACT_NONE); +} + +void KerParMaxPoolNxMStrideSxSy_HWC_ReLU_USQ8(Ker_MM_Pool_USQ8_T *Arg) { + KerParMaxPoolNxMStrideSxSy_HWC_USQ8_act(Arg, ACT_RELU); +} + +void KerParMaxPoolNxMStrideSxSy_HWC_ReLUN_USQ8(Ker_MM_Pool_USQ8_T *Arg) { + KerParMaxPoolNxMStrideSxSy_HWC_USQ8_act(Arg, ACT_RELUN); } -void KerParAvgPoolNxMStrideSxSy_HWC_SQ8(Ker_MM_Pool_SQ8_T *Arg) +void KerParMaxPoolNxMStrideSxSy_HWC_ReLUM_USQ8(Ker_MM_Pool_USQ8_T *Arg) { + KerParMaxPoolNxMStrideSxSy_HWC_USQ8_act(Arg, ACT_RELUM); +} + +void KerParMaxPoolNxMStrideSxSy_HWC_ReLUMN_USQ8(Ker_MM_Pool_USQ8_T *Arg) { + KerParMaxPoolNxMStrideSxSy_HWC_USQ8_act(Arg, ACT_RELUMN); +} + +void KerParMaxPoolNxMStrideSxSy_HWC_HSigmoid_USQ8(Ker_MM_Pool_USQ8_T *Arg) { + KerParMaxPoolNxMStrideSxSy_HWC_USQ8_act(Arg, ACT_HSIGMOID); +} + +void KerParMaxPoolNxMStrideSxSy_HWC_HSwish_USQ8(Ker_MM_Pool_USQ8_T *Arg) { + KerParMaxPoolNxMStrideSxSy_HWC_USQ8_act(Arg, ACT_HSWISH); +} + +void KerParMaxPoolNxMStrideSxSy_HWC_LeakyReLU_USQ8(Ker_MM_Pool_USQ8_T *Arg) { + KerParMaxPoolNxMStrideSxSy_HWC_USQ8_act(Arg, ACT_LEAKYRELU); +} + +void KerParMaxPoolNxMStrideSxSy_HWC_Sigmoid_USQ8(Ker_MM_Pool_USQ8_T *Arg) { + KerParMaxPoolNxMStrideSxSy_HWC_USQ8_act(Arg, ACT_SIGMOID); +} + +void KerParMaxPoolNxMStrideSxSy_HWC_Tanh_USQ8(Ker_MM_Pool_USQ8_T *Arg) { + KerParMaxPoolNxMStrideSxSy_HWC_USQ8_act(Arg, ACT_TANH); +} + +static inline void __attribute__((always_inline)) KerParAvgPoolNxMStrideSxSy_HWC_SQ8_act( + Ker_MM_Pool_SQ8_T *Arg, + CNN_ActivationOper_T Activation +) { signed char *__restrict__ In = Arg->In; @@ -3388,11 +3493,55 @@ void KerParAvgPoolNxMStrideSxSy_HWC_SQ8(Ker_MM_Pool_SQ8_T *Arg) PosL += Sy; } gap_waitbarrier(0); - // KerParPoolActivation(Out, Wo, Ho, First, Last, Infos, Arg->Activation); - // gap_waitbarrier(0); + if (Activation != ACT_NONE) { + KER_POOL_ACT(Activation, unsigned char, 8, 0); + } +} + +void KerParAvgPoolNxMStrideSxSy_HWC_SQ8(Ker_MM_Pool_SQ8_T *Arg) { + KerParAvgPoolNxMStrideSxSy_HWC_SQ8_act(Arg, ACT_NONE); +} + +void KerParAvgPoolNxMStrideSxSy_HWC_ReLU_SQ8(Ker_MM_Pool_SQ8_T *Arg) { + KerParAvgPoolNxMStrideSxSy_HWC_SQ8_act(Arg, ACT_RELU); +} + +void KerParAvgPoolNxMStrideSxSy_HWC_ReLUN_SQ8(Ker_MM_Pool_SQ8_T *Arg) { + KerParAvgPoolNxMStrideSxSy_HWC_SQ8_act(Arg, ACT_RELUN); } -void KerParAvgPoolNxMStrideSxSy_HWC_USQ8(Ker_MM_Pool_USQ8_T *Arg) +void KerParAvgPoolNxMStrideSxSy_HWC_ReLUM_SQ8(Ker_MM_Pool_SQ8_T *Arg) { + KerParAvgPoolNxMStrideSxSy_HWC_SQ8_act(Arg, ACT_RELUM); +} + +void KerParAvgPoolNxMStrideSxSy_HWC_ReLUMN_SQ8(Ker_MM_Pool_SQ8_T *Arg) { + KerParAvgPoolNxMStrideSxSy_HWC_SQ8_act(Arg, ACT_RELUMN); +} + +void KerParAvgPoolNxMStrideSxSy_HWC_HSigmoid_SQ8(Ker_MM_Pool_SQ8_T *Arg) { + KerParAvgPoolNxMStrideSxSy_HWC_SQ8_act(Arg, ACT_HSIGMOID); +} + +void KerParAvgPoolNxMStrideSxSy_HWC_HSwish_SQ8(Ker_MM_Pool_SQ8_T *Arg) { + KerParAvgPoolNxMStrideSxSy_HWC_SQ8_act(Arg, ACT_HSWISH); +} + +void KerParAvgPoolNxMStrideSxSy_HWC_LeakyReLU_SQ8(Ker_MM_Pool_SQ8_T *Arg) { + KerParAvgPoolNxMStrideSxSy_HWC_SQ8_act(Arg, ACT_LEAKYRELU); +} + +void KerParAvgPoolNxMStrideSxSy_HWC_Sigmoid_SQ8(Ker_MM_Pool_SQ8_T *Arg) { + KerParAvgPoolNxMStrideSxSy_HWC_SQ8_act(Arg, ACT_SIGMOID); +} + +void KerParAvgPoolNxMStrideSxSy_HWC_Tanh_SQ8(Ker_MM_Pool_SQ8_T *Arg) { + KerParAvgPoolNxMStrideSxSy_HWC_SQ8_act(Arg, ACT_TANH); +} + +static inline void __attribute__((always_inline)) KerParAvgPoolNxMStrideSxSy_HWC_USQ8_act( + Ker_MM_Pool_USQ8_T *Arg, + CNN_ActivationOper_T Activation +) { unsigned char *__restrict__ In = Arg->In; @@ -3461,14 +3610,56 @@ void KerParAvgPoolNxMStrideSxSy_HWC_USQ8(Ker_MM_Pool_USQ8_T *Arg) PosL += Sy; } gap_waitbarrier(0); - // KerParPoolActivation(Out, Wo, Ho, First, Last, Infos, Arg->Activation); - // gap_waitbarrier(0); + if (Activation != ACT_NONE) { + KER_POOL_ACT(Activation, unsigned char, 8, 1); + } } +void KerParAvgPoolNxMStrideSxSy_HWC_USQ8(Ker_MM_Pool_USQ8_T *Arg) { + KerParAvgPoolNxMStrideSxSy_HWC_USQ8_act(Arg, ACT_NONE); +} + +void KerParAvgPoolNxMStrideSxSy_HWC_ReLU_USQ8(Ker_MM_Pool_USQ8_T *Arg) { + KerParAvgPoolNxMStrideSxSy_HWC_USQ8_act(Arg, ACT_RELU); +} +void KerParAvgPoolNxMStrideSxSy_HWC_ReLUN_USQ8(Ker_MM_Pool_USQ8_T *Arg) { + KerParAvgPoolNxMStrideSxSy_HWC_USQ8_act(Arg, ACT_RELUN); +} + +void KerParAvgPoolNxMStrideSxSy_HWC_ReLUM_USQ8(Ker_MM_Pool_USQ8_T *Arg) { + KerParAvgPoolNxMStrideSxSy_HWC_USQ8_act(Arg, ACT_RELUM); +} -void KerParMaxPoolNxMStrideSxSy_HWC_SQ16(Ker_MM_Pool_SQ16_T *Arg) +void KerParAvgPoolNxMStrideSxSy_HWC_ReLUMN_USQ8(Ker_MM_Pool_USQ8_T *Arg) { + KerParAvgPoolNxMStrideSxSy_HWC_USQ8_act(Arg, ACT_RELUMN); +} + +void KerParAvgPoolNxMStrideSxSy_HWC_HSigmoid_USQ8(Ker_MM_Pool_USQ8_T *Arg) { + KerParAvgPoolNxMStrideSxSy_HWC_USQ8_act(Arg, ACT_HSIGMOID); +} + +void KerParAvgPoolNxMStrideSxSy_HWC_HSwish_USQ8(Ker_MM_Pool_USQ8_T *Arg) { + KerParAvgPoolNxMStrideSxSy_HWC_USQ8_act(Arg, ACT_HSWISH); +} +void KerParAvgPoolNxMStrideSxSy_HWC_LeakyReLU_USQ8(Ker_MM_Pool_USQ8_T *Arg) { + KerParAvgPoolNxMStrideSxSy_HWC_USQ8_act(Arg, ACT_LEAKYRELU); +} + +void KerParAvgPoolNxMStrideSxSy_HWC_Sigmoid_USQ8(Ker_MM_Pool_USQ8_T *Arg) { + KerParAvgPoolNxMStrideSxSy_HWC_USQ8_act(Arg, ACT_SIGMOID); +} + +void KerParAvgPoolNxMStrideSxSy_HWC_Tanh_USQ8(Ker_MM_Pool_USQ8_T *Arg) { + KerParAvgPoolNxMStrideSxSy_HWC_USQ8_act(Arg, ACT_TANH); +} + + +static inline void __attribute__((always_inline)) KerParMaxPoolNxMStrideSxSy_HWC_SQ16_act( + Ker_MM_Pool_SQ16_T *Arg, + CNN_ActivationOper_T Activation +) { short int *__restrict__ In = Arg->In; int W = Arg->W, H = Arg->H; @@ -3509,21 +3700,64 @@ void KerParMaxPoolNxMStrideSxSy_HWC_SQ16(Ker_MM_Pool_SQ16_T *Arg) PosL += Sy; } gap_waitbarrier(0); - // KerParPoolActivation(Out, Wo, Ho, First, Last, Infos, Arg->Activation); - // gap_waitbarrier(0); + if (Activation != ACT_NONE) { + KER_POOL_ACT(Activation, unsigned char, 8, 1); + } +} + +void KerParMaxPoolNxMStrideSxSy_HWC_SQ16(Ker_MM_Pool_SQ16_T *Arg) { + KerParMaxPoolNxMStrideSxSy_HWC_SQ16_act(Arg, ACT_NONE); +} + +void KerParMaxPoolNxMStrideSxSy_HWC_ReLU_SQ16(Ker_MM_Pool_SQ16_T *Arg) { + KerParMaxPoolNxMStrideSxSy_HWC_SQ16_act(Arg, ACT_RELU); } +void KerParMaxPoolNxMStrideSxSy_HWC_ReLUN_SQ16(Ker_MM_Pool_SQ16_T *Arg) { + KerParMaxPoolNxMStrideSxSy_HWC_SQ16_act(Arg, ACT_RELUN); +} + +void KerParMaxPoolNxMStrideSxSy_HWC_ReLUM_SQ16(Ker_MM_Pool_SQ16_T *Arg) { + KerParMaxPoolNxMStrideSxSy_HWC_SQ16_act(Arg, ACT_RELUM); +} + +void KerParMaxPoolNxMStrideSxSy_HWC_ReLUMN_SQ16(Ker_MM_Pool_SQ16_T *Arg) { + KerParMaxPoolNxMStrideSxSy_HWC_SQ16_act(Arg, ACT_RELUMN); +} + +void KerParMaxPoolNxMStrideSxSy_HWC_HSigmoid_SQ16(Ker_MM_Pool_SQ16_T *Arg) { + KerParMaxPoolNxMStrideSxSy_HWC_SQ16_act(Arg, ACT_HSIGMOID); +} + +void KerParMaxPoolNxMStrideSxSy_HWC_HSwish_SQ16(Ker_MM_Pool_SQ16_T *Arg) { + KerParMaxPoolNxMStrideSxSy_HWC_SQ16_act(Arg, ACT_HSWISH); +} -void KerParMaxPoolNxMStrideSxSy_HWC_USQ16(Ker_MM_Pool_SQ16_T *Arg) +void KerParMaxPoolNxMStrideSxSy_HWC_LeakyReLU_SQ16(Ker_MM_Pool_SQ16_T *Arg) { + KerParMaxPoolNxMStrideSxSy_HWC_SQ16_act(Arg, ACT_LEAKYRELU); +} + +void KerParMaxPoolNxMStrideSxSy_HWC_Sigmoid_SQ16(Ker_MM_Pool_SQ16_T *Arg) { + KerParMaxPoolNxMStrideSxSy_HWC_SQ16_act(Arg, ACT_SIGMOID); +} +void KerParMaxPoolNxMStrideSxSy_HWC_Tanh_SQ16(Ker_MM_Pool_SQ16_T *Arg) { + KerParMaxPoolNxMStrideSxSy_HWC_SQ16_act(Arg, ACT_TANH); +} + + +static inline void __attribute__((always_inline)) KerParMaxPoolNxMStrideSxSy_HWC_USQ16_act( + Ker_MM_Pool_USQ16_T *Arg, + CNN_ActivationOper_T Activation +) { - short int *__restrict__ In = Arg->In; + unsigned short int *__restrict__ In = Arg->In; int W = Arg->W, H = Arg->H; int Fx = Arg->Fx, Sx = Arg->Sx; int Fy = Arg->Fy, Sy = Arg->Sy; int PadL = Arg->Pad[0], PadT = Arg->Pad[2]; int Feat = Arg->Feat; - short int * __restrict__ Out = Arg->Out; + unsigned short int * __restrict__ Out = Arg->Out; int Wo = Arg->Wo, Ho = Arg->Ho; v2u M_Init = (v2u) {-32767,-32767}; @@ -3556,13 +3790,56 @@ void KerParMaxPoolNxMStrideSxSy_HWC_USQ16(Ker_MM_Pool_SQ16_T *Arg) PosL += Sy; } gap_waitbarrier(0); - // KerParPoolActivation(Out, Wo, Ho, First, Last, Infos, Arg->Activation); - // gap_waitbarrier(0); + if (Activation != ACT_NONE) { + KER_POOL_ACT(Activation, unsigned char, 8, 1); + } } +void KerParMaxPoolNxMStrideSxSy_HWC_USQ16(Ker_MM_Pool_USQ16_T *Arg) { + KerParMaxPoolNxMStrideSxSy_HWC_USQ16_act(Arg, ACT_NONE); +} + +void KerParMaxPoolNxMStrideSxSy_HWC_ReLU_USQ16(Ker_MM_Pool_USQ16_T *Arg) { + KerParMaxPoolNxMStrideSxSy_HWC_USQ16_act(Arg, ACT_RELU); +} -void KerParAvgPoolNxMStrideSxSy_HWC_SQ16(Ker_MM_Pool_SQ16_T *Arg) +void KerParMaxPoolNxMStrideSxSy_HWC_ReLUN_USQ16(Ker_MM_Pool_USQ16_T *Arg) { + KerParMaxPoolNxMStrideSxSy_HWC_USQ16_act(Arg, ACT_RELUN); +} + +void KerParMaxPoolNxMStrideSxSy_HWC_ReLUM_USQ16(Ker_MM_Pool_USQ16_T *Arg) { + KerParMaxPoolNxMStrideSxSy_HWC_USQ16_act(Arg, ACT_RELUM); +} +void KerParMaxPoolNxMStrideSxSy_HWC_ReLUMN_USQ16(Ker_MM_Pool_USQ16_T *Arg) { + KerParMaxPoolNxMStrideSxSy_HWC_USQ16_act(Arg, ACT_RELUMN); +} + +void KerParMaxPoolNxMStrideSxSy_HWC_HSigmoid_USQ16(Ker_MM_Pool_USQ16_T *Arg) { + KerParMaxPoolNxMStrideSxSy_HWC_USQ16_act(Arg, ACT_HSIGMOID); +} + +void KerParMaxPoolNxMStrideSxSy_HWC_HSwish_USQ16(Ker_MM_Pool_USQ16_T *Arg) { + KerParMaxPoolNxMStrideSxSy_HWC_USQ16_act(Arg, ACT_HSWISH); +} + +void KerParMaxPoolNxMStrideSxSy_HWC_LeakyReLU_USQ16(Ker_MM_Pool_USQ16_T *Arg) { + KerParMaxPoolNxMStrideSxSy_HWC_USQ16_act(Arg, ACT_LEAKYRELU); +} + +void KerParMaxPoolNxMStrideSxSy_HWC_Sigmoid_USQ16(Ker_MM_Pool_USQ16_T *Arg) { + KerParMaxPoolNxMStrideSxSy_HWC_USQ16_act(Arg, ACT_SIGMOID); +} + +void KerParMaxPoolNxMStrideSxSy_HWC_Tanh_USQ16(Ker_MM_Pool_USQ16_T *Arg) { + KerParMaxPoolNxMStrideSxSy_HWC_USQ16_act(Arg, ACT_TANH); +} + + +static inline void __attribute__((always_inline)) KerParAvgPoolNxMStrideSxSy_HWC_SQ16_act( + Ker_MM_Pool_SQ16_T *Arg, + CNN_ActivationOper_T Activation +) { signed short *__restrict__ In = Arg->In; int W = Arg->W, H = Arg->H; @@ -3611,12 +3888,56 @@ void KerParAvgPoolNxMStrideSxSy_HWC_SQ16(Ker_MM_Pool_SQ16_T *Arg) PosL += Sy; } gap_waitbarrier(0); - // KerParPoolActivation(Out, Wo, Ho, First, Last, Infos, Arg->Activation); - // gap_waitbarrier(0); + if (Activation != ACT_NONE) { + KER_POOL_ACT(Activation, unsigned char, 8, 1); + } +} + +void KerParAvgPoolNxMStrideSxSy_HWC_SQ16(Ker_MM_Pool_SQ16_T *Arg) { + KerParAvgPoolNxMStrideSxSy_HWC_SQ16_act(Arg, ACT_NONE); +} + +void KerParAvgPoolNxMStrideSxSy_HWC_ReLU_SQ16(Ker_MM_Pool_SQ16_T *Arg) { + KerParAvgPoolNxMStrideSxSy_HWC_SQ16_act(Arg, ACT_RELU); +} + +void KerParAvgPoolNxMStrideSxSy_HWC_ReLUN_SQ16(Ker_MM_Pool_SQ16_T *Arg) { + KerParAvgPoolNxMStrideSxSy_HWC_SQ16_act(Arg, ACT_RELUN); +} + +void KerParAvgPoolNxMStrideSxSy_HWC_ReLUM_SQ16(Ker_MM_Pool_SQ16_T *Arg) { + KerParAvgPoolNxMStrideSxSy_HWC_SQ16_act(Arg, ACT_RELUM); +} + +void KerParAvgPoolNxMStrideSxSy_HWC_ReLUMN_SQ16(Ker_MM_Pool_SQ16_T *Arg) { + KerParAvgPoolNxMStrideSxSy_HWC_SQ16_act(Arg, ACT_RELUMN); +} + +void KerParAvgPoolNxMStrideSxSy_HWC_HSigmoid_SQ16(Ker_MM_Pool_SQ16_T *Arg) { + KerParAvgPoolNxMStrideSxSy_HWC_SQ16_act(Arg, ACT_HSIGMOID); +} + +void KerParAvgPoolNxMStrideSxSy_HWC_HSwish_SQ16(Ker_MM_Pool_SQ16_T *Arg) { + KerParAvgPoolNxMStrideSxSy_HWC_SQ16_act(Arg, ACT_HSWISH); +} + +void KerParAvgPoolNxMStrideSxSy_HWC_LeakyReLU_SQ16(Ker_MM_Pool_SQ16_T *Arg) { + KerParAvgPoolNxMStrideSxSy_HWC_SQ16_act(Arg, ACT_LEAKYRELU); +} + +void KerParAvgPoolNxMStrideSxSy_HWC_Sigmoid_SQ16(Ker_MM_Pool_SQ16_T *Arg) { + KerParAvgPoolNxMStrideSxSy_HWC_SQ16_act(Arg, ACT_SIGMOID); +} + +void KerParAvgPoolNxMStrideSxSy_HWC_Tanh_SQ16(Ker_MM_Pool_SQ16_T *Arg) { + KerParAvgPoolNxMStrideSxSy_HWC_SQ16_act(Arg, ACT_TANH); } -void KerParAvgPoolNxMStrideSxSy_HWC_USQ16(Ker_MM_Pool_SQ16_T *Arg) +static inline void __attribute__((always_inline)) KerParAvgPoolNxMStrideSxSy_HWC_USQ16_act( + Ker_MM_Pool_USQ16_T *Arg, + CNN_ActivationOper_T Activation +) { unsigned short *__restrict__ In = Arg->In; int W = Arg->W, H = Arg->H; @@ -3665,6 +3986,49 @@ void KerParAvgPoolNxMStrideSxSy_HWC_USQ16(Ker_MM_Pool_SQ16_T *Arg) PosL += Sy; } gap_waitbarrier(0); - // KerParPoolActivation(Out, Wo, Ho, First, Last, Infos, Arg->Activation); - // gap_waitbarrier(0); -} \ No newline at end of file + if (Activation != ACT_NONE) { + KER_POOL_ACT(Activation, unsigned char, 8, 1); + } +} + +void KerParAvgPoolNxMStrideSxSy_HWC_USQ16(Ker_MM_Pool_USQ16_T *Arg) { + KerParAvgPoolNxMStrideSxSy_HWC_USQ16_act(Arg, ACT_NONE); +} + +void KerParAvgPoolNxMStrideSxSy_HWC_ReLU_USQ16(Ker_MM_Pool_USQ16_T *Arg) { + KerParAvgPoolNxMStrideSxSy_HWC_USQ16_act(Arg, ACT_RELU); +} + +void KerParAvgPoolNxMStrideSxSy_HWC_ReLUN_USQ16(Ker_MM_Pool_USQ16_T *Arg) { + KerParAvgPoolNxMStrideSxSy_HWC_USQ16_act(Arg, ACT_RELUN); +} + +void KerParAvgPoolNxMStrideSxSy_HWC_ReLUM_USQ16(Ker_MM_Pool_USQ16_T *Arg) { + KerParAvgPoolNxMStrideSxSy_HWC_USQ16_act(Arg, ACT_RELUM); +} + +void KerParAvgPoolNxMStrideSxSy_HWC_ReLUMN_USQ16(Ker_MM_Pool_USQ16_T *Arg) { + KerParAvgPoolNxMStrideSxSy_HWC_USQ16_act(Arg, ACT_RELUMN); +} + +void KerParAvgPoolNxMStrideSxSy_HWC_HSigmoid_USQ16(Ker_MM_Pool_USQ16_T *Arg) { + KerParAvgPoolNxMStrideSxSy_HWC_USQ16_act(Arg, ACT_HSIGMOID); +} + +void KerParAvgPoolNxMStrideSxSy_HWC_HSwish_USQ16(Ker_MM_Pool_USQ16_T *Arg) { + KerParAvgPoolNxMStrideSxSy_HWC_USQ16_act(Arg, ACT_HSWISH); +} + +void KerParAvgPoolNxMStrideSxSy_HWC_LeakyReLU_USQ16(Ker_MM_Pool_USQ16_T *Arg) { + KerParAvgPoolNxMStrideSxSy_HWC_USQ16_act(Arg, ACT_LEAKYRELU); +} + +void KerParAvgPoolNxMStrideSxSy_HWC_Sigmoid_USQ16(Ker_MM_Pool_USQ16_T *Arg) { + KerParAvgPoolNxMStrideSxSy_HWC_USQ16_act(Arg, ACT_SIGMOID); +} + +void KerParAvgPoolNxMStrideSxSy_HWC_Tanh_USQ16(Ker_MM_Pool_USQ16_T *Arg) { + KerParAvgPoolNxMStrideSxSy_HWC_USQ16_act(Arg, ACT_TANH); +} + +#pragma GCC diagnostic pop diff --git a/tools/autotiler_v3/CNN_Libraries_SQ8/CNN_SoftMax_SQ8.c b/tools/autotiler_v3/CNN_Libraries_SQ8/CNN_SoftMax_SQ8.c index 889d7cfd4..51ae1a98b 100644 --- a/tools/autotiler_v3/CNN_Libraries_SQ8/CNN_SoftMax_SQ8.c +++ b/tools/autotiler_v3/CNN_Libraries_SQ8/CNN_SoftMax_SQ8.c @@ -14,13 +14,14 @@ * limitations under the License. */ +#include +#include +#include "CNN_BasicKernels_SQ8.h" + #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wextra" #pragma GCC diagnostic ignored "-Wpointer-sign" #pragma GCC diagnostic ignored "-Wsign-compare" -#include -#include -#include "CNN_BasicKernels_SQ8.h" static int CoreCountDynamic = 1; static int ActiveCore = gap_ncore(); diff --git a/tools/autotiler_v3/CNN_Libraries_SQ8/RNN_SQ8.c b/tools/autotiler_v3/CNN_Libraries_SQ8/RNN_SQ8.c index 72a17aa83..5c134b67b 100644 --- a/tools/autotiler_v3/CNN_Libraries_SQ8/RNN_SQ8.c +++ b/tools/autotiler_v3/CNN_Libraries_SQ8/RNN_SQ8.c @@ -14,13 +14,15 @@ * limitations under the License. */ + +#include +#include +#include "CNN_BasicKernels_SQ8.h" + #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wextra" #pragma GCC diagnostic ignored "-Wpointer-sign" #pragma GCC diagnostic ignored "-Wsign-compare" -#include -#include -#include "CNN_BasicKernels_SQ8.h" static int CoreCountDynamic = 1; static int ActiveCore = gap_ncore(); diff --git a/tools/autotiler_v3/CNN_Libraries_fp16/CNN_Bias_Linear_Activation_fp16.c b/tools/autotiler_v3/CNN_Libraries_fp16/CNN_Bias_Linear_Activation_fp16.c index 7992ebbfe..30a622ee2 100644 --- a/tools/autotiler_v3/CNN_Libraries_fp16/CNN_Bias_Linear_Activation_fp16.c +++ b/tools/autotiler_v3/CNN_Libraries_fp16/CNN_Bias_Linear_Activation_fp16.c @@ -14,6 +14,12 @@ * limitations under the License. */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wextra" +#pragma GCC diagnostic ignored "-Wpointer-sign" +#pragma GCC diagnostic ignored "-Wsign-compare" +#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" + #include "Gap.h" #include "CNN_BasicKernels_fp16.h" #include "CNN_Defines_fp16.h" @@ -679,3 +685,4 @@ void KerParLinearLayerLeakyReLU_fp16(KerLinear_fp16_T *Arg) gap_waitbarrier(0); } +#pragma GCC diagnostic pop diff --git a/tools/autotiler_v3/CNN_Libraries_fp16/CNN_Conv_BasicKernels_fp16.c b/tools/autotiler_v3/CNN_Libraries_fp16/CNN_Conv_BasicKernels_fp16.c index 09a8faf29..86d55c0ea 100644 --- a/tools/autotiler_v3/CNN_Libraries_fp16/CNN_Conv_BasicKernels_fp16.c +++ b/tools/autotiler_v3/CNN_Libraries_fp16/CNN_Conv_BasicKernels_fp16.c @@ -14,6 +14,12 @@ * limitations under the License. */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wextra" +#pragma GCC diagnostic ignored "-Wpointer-sign" +#pragma GCC diagnostic ignored "-Wsign-compare" +#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" + #include "Gap.h" #include "CNN_BasicKernels_fp16.h" @@ -4024,3 +4030,5 @@ void KerConvNxMDxDyStrideSxSy_fp16(KerConv_fp16_T *Arg) } gap_waitbarrier(0); } + +#pragma GCC diagnostic pop diff --git a/tools/autotiler_v3/CNN_Libraries_fp16/CNN_Conv_DW_BasicKernels_fp16.c b/tools/autotiler_v3/CNN_Libraries_fp16/CNN_Conv_DW_BasicKernels_fp16.c index 681de86d8..5d7d4a3b4 100644 --- a/tools/autotiler_v3/CNN_Libraries_fp16/CNN_Conv_DW_BasicKernels_fp16.c +++ b/tools/autotiler_v3/CNN_Libraries_fp16/CNN_Conv_DW_BasicKernels_fp16.c @@ -14,6 +14,12 @@ * limitations under the License. */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wextra" +#pragma GCC diagnostic ignored "-Wpointer-sign" +#pragma GCC diagnostic ignored "-Wsign-compare" +#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" + #include "Gap.h" #include "CNN_BasicKernels_fp16.h" @@ -4151,3 +4157,5 @@ void KerConvDWNxMDxDyStrideSxSy_fp16(KerConv_fp16_T *Arg) gap_waitbarrier(0); } + +#pragma GCC diagnostic pop \ No newline at end of file diff --git a/tools/autotiler_v3/CNN_Libraries_fp16/CNN_MatAlgebra_fp16.c b/tools/autotiler_v3/CNN_Libraries_fp16/CNN_MatAlgebra_fp16.c index ece4f10f6..401728fab 100644 --- a/tools/autotiler_v3/CNN_Libraries_fp16/CNN_MatAlgebra_fp16.c +++ b/tools/autotiler_v3/CNN_Libraries_fp16/CNN_MatAlgebra_fp16.c @@ -14,6 +14,12 @@ * limitations under the License. */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wextra" +#pragma GCC diagnostic ignored "-Wpointer-sign" +#pragma GCC diagnostic ignored "-Wsign-compare" +#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" + #include #include #include "CNN_BasicKernels_fp16.h" @@ -7038,3 +7044,5 @@ void KerParMatMulSmallFeatLeakyrelu_fp16(KerMatMul_fp16_T *Arg) } gap_waitbarrier(0); } + +#pragma GCC diagnostic pop diff --git a/tools/autotiler_v3/CNN_Libraries_fp16/CNN_MatMul_Conv_fp16.c b/tools/autotiler_v3/CNN_Libraries_fp16/CNN_MatMul_Conv_fp16.c index 5af1deb3a..29730226e 100644 --- a/tools/autotiler_v3/CNN_Libraries_fp16/CNN_MatMul_Conv_fp16.c +++ b/tools/autotiler_v3/CNN_Libraries_fp16/CNN_MatMul_Conv_fp16.c @@ -1,3 +1,10 @@ + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wextra" +#pragma GCC diagnostic ignored "-Wpointer-sign" +#pragma GCC diagnostic ignored "-Wsign-compare" +#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" + #include #include "CNN_BasicKernels_fp16.h" @@ -1387,3 +1394,5 @@ void KerPar_MM_Conv2D_DxDy_ReLU_fp16( } gap_waitbarrier(0); } + +#pragma GCC diagnostic pop diff --git a/tools/autotiler_v3/CNN_Libraries_fp16/CNN_Pooling_BasicKernels_fp16.c b/tools/autotiler_v3/CNN_Libraries_fp16/CNN_Pooling_BasicKernels_fp16.c index c04650d15..0884c78e3 100644 --- a/tools/autotiler_v3/CNN_Libraries_fp16/CNN_Pooling_BasicKernels_fp16.c +++ b/tools/autotiler_v3/CNN_Libraries_fp16/CNN_Pooling_BasicKernels_fp16.c @@ -14,6 +14,12 @@ * limitations under the License. */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wextra" +#pragma GCC diagnostic ignored "-Wpointer-sign" +#pragma GCC diagnostic ignored "-Wsign-compare" +#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" + #include #include "Gap.h" #include "CNN_BasicKernels_fp16.h" @@ -1524,3 +1530,5 @@ void KerParAvgPoolNxMStrideSxSy_HWC_fp16(Ker_MM_Pool_fp16_T *Arg) } gap_waitbarrier(0); } + +#pragma GCC diagnostic pop diff --git a/tools/autotiler_v3/CNN_Libraries_fp16/RNN_fp16.c b/tools/autotiler_v3/CNN_Libraries_fp16/RNN_fp16.c index 08f52e1a8..f72da190f 100644 --- a/tools/autotiler_v3/CNN_Libraries_fp16/RNN_fp16.c +++ b/tools/autotiler_v3/CNN_Libraries_fp16/RNN_fp16.c @@ -14,6 +14,12 @@ * limitations under the License. */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wextra" +#pragma GCC diagnostic ignored "-Wpointer-sign" +#pragma GCC diagnostic ignored "-Wsign-compare" +#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" + #include #include "CNN_BasicKernels_fp16.h" @@ -485,4 +491,6 @@ void GRU_ParKer_fp16(KerGRU_fp16_T *Arg) } gap_waitbarrier(0); } -#endif \ No newline at end of file +#endif + +#pragma GCC diagnostic pop diff --git a/tools/autotiler_v3/CNN_Libraries_fp16/SSD_BasicKernels_fp16.c b/tools/autotiler_v3/CNN_Libraries_fp16/SSD_BasicKernels_fp16.c index 1703742f3..03fa3d2af 100644 --- a/tools/autotiler_v3/CNN_Libraries_fp16/SSD_BasicKernels_fp16.c +++ b/tools/autotiler_v3/CNN_Libraries_fp16/SSD_BasicKernels_fp16.c @@ -61,12 +61,12 @@ void Ker_SSD_Init_f16(Ker_SSD_Init_Arg_f16_T *KerArg0) } // The actual code that does the tile addition -void Ker_SSD_Decoder_fp16(Ker_SSD_Decoder_Arg_fp16_T *KerArg0 ) +void Ker_SSD_Decoder_f16(Ker_SSD_Decoder_Arg_f16_T *KerArg0 ) { unsigned int CoreId = gap_coreid(); - unsigned int Chunk = ChunkSize(KerArg0->H); + unsigned int Chunk = ChunkSize(KerArg0->N_Anchors); unsigned int First = CoreId*Chunk; - unsigned int Last = (First+Chunk > KerArg0->H) ? (KerArg0->H) : (First+Chunk); + unsigned int Last = (First+Chunk > KerArg0->N_Anchors) ? (KerArg0->N_Anchors) : (First+Chunk); bbox_f16_t * bbox = KerArg0->bbox_buf; F16 * scores = KerArg0->classes_in; int num_classes = KerArg0->N_Classes; @@ -152,7 +152,7 @@ static int16_t KerIoverU(F16 a_x, F16 a_y, F16 a_w, F16 a_h, } -static void KerNonMaxSuppress(bbox_t * boundbxs, float iouThres, int nnbb){ +static void KerNonMaxSuppress(bbox_f16_t * boundbxs, float iouThres, int nnbb){ //BBOX value are in Q14 and non_max_threshold in Q14 int idx, idx_int; //Non-max supression @@ -175,7 +175,7 @@ static void KerNonMaxSuppress(bbox_t * boundbxs, float iouThres, int nnbb){ } } -void Ker_SSD_NMS(Ker_SSD_NMS_ArgT *KerArg0 ) +void Ker_SSD_NMS_f16(Ker_SSD_NMS_Arg_f16_T *KerArg0 ) { short int bbox_idx_max = *(KerArg0->bbox_idx); diff --git a/tools/autotiler_v3/CNN_Libraries_fp16/SSD_BasicKernels_fp16.h b/tools/autotiler_v3/CNN_Libraries_fp16/SSD_BasicKernels_fp16.h index 3bb8ca9cd..513581a17 100644 --- a/tools/autotiler_v3/CNN_Libraries_fp16/SSD_BasicKernels_fp16.h +++ b/tools/autotiler_v3/CNN_Libraries_fp16/SSD_BasicKernels_fp16.h @@ -72,9 +72,9 @@ typedef struct { F16 NMSThr; short int n_max_bb; short int *bbox_idx; -} Ker_SSD_NMS_ArgT; +} Ker_SSD_NMS_Arg_f16_T; -void Ker_SSD_NMS(Ker_SSD_NMS_ArgT *Arg); +void Ker_SSD_NMS_f16(Ker_SSD_NMS_Arg_f16_T *Arg); diff --git a/tools/autotiler_v3/DSP_Generators/DSP_Generators.c b/tools/autotiler_v3/DSP_Generators/DSP_Generators.c index 06a9b3658..df0f64605 100644 --- a/tools/autotiler_v3/DSP_Generators/DSP_Generators.c +++ b/tools/autotiler_v3/DSP_Generators/DSP_Generators.c @@ -234,6 +234,21 @@ void LoadMFCCLibrary() ) ); + LibKernelTemplate("MatMul_DSP_T", + CArgs(10, + TCArg("void * __restrict__", "In1"), + TCArg("void * __restrict__", "In2"), + TCArg("void * __restrict__", "Out"), + TCArg("void *", "BufferColIn2"), + TCArg("unsigned int", "W_In1"), + TCArg("unsigned int", "H_In1"), + TCArg("unsigned int", "W_In2"), + TCArg("unsigned int", "W_Out"), + TCArg("unsigned int", "OutFirstCol"), + TCArg("int", "ColFirst") + ) + ); + /* FFT Basic Kernels */ LibKernel("Radix2FFT_DIF_Par_Fix16", CALL_PARALLEL, 0, "FFT_Arg_T", NULL); LibKernel("Radix2FFT_DIF_Par_Fix32", CALL_PARALLEL, 0, "FFT_Arg_T", NULL); @@ -332,6 +347,11 @@ void LoadMFCCLibrary() LibKernel("Conjugate_Fix32_Par", CALL_PARALLEL, CArgs(2, TCArg("int * __restrict__", "Data"), TCArg("int", "Ni")), "SwapSamples_Arg_T", NULL); LibKernel("Conjugate_Float16_Par", CALL_PARALLEL, CArgs(2, TCArg("F16V_DSP * __restrict__", "Data"), TCArg("int", "Ni")), "SwapSamples_Arg_T", NULL); LibKernel("Conjugate_Float32_Par", CALL_PARALLEL, CArgs(2, TCArg("float * __restrict__", "Data"), TCArg("int", "Ni")), "SwapSamples_Arg_T", NULL); + + LibKernel("KerParMatMulDSP_fp16", CALL_PARALLEL, 0, "MatMul_DSP_T", NULL); + LibKernel("KerParMatMulDSPT_fp16", CALL_PARALLEL, 0, "MatMul_DSP_T", NULL); + LibKernel("KerParMatMulDSP_fp32", CALL_PARALLEL, 0, "MatMul_DSP_T", NULL); + LibKernel("KerParMatMulDSPT_fp32", CALL_PARALLEL, 0, "MatMul_DSP_T", NULL); } void PieceWiseGenerator(char *Name, CNN_GenControl_T *Ctrl, char *FunName, int Dim, int DataType, int Inplace) @@ -921,6 +941,104 @@ int MFCC_Generator( return (Kernel!=0); } +int IMel_Generator( + char *Name, + CNN_GenControl_T *Ctrl, + int NFrames, + int Nfft, + int NMelBanks, + int SizeMelCoeff, + int DataType + ) +{ + if (__builtin_popcount(Nfft) != 1) GenTilingError("%s, Incorrect FFTDim: %d, it has to be a a power of 2", Name, Nfft); + if (DataType==FIX32 || DataType==FIX16) GenTilingError("Not supported FIX_32"); + + int MFCC_Coeff_Dyn = 15; + char *PreEmpKernel=0, *InverseMelKer=0, *UserKernType=0, *UserKernPointer=0, InItemSize=2, OutItemSize=2, LUTItemSize=2; + + switch (DataType){ + case FIX16: + InverseMelKer = "MelFilterBank_Fix32"; + UserKernType = "short int"; + UserKernPointer = "short int * __restrict__"; + InItemSize=2; OutItemSize=2, LUTItemSize=2; + break; + case FLOAT16: + InverseMelKer = "MelFilterBank_f16"; + UserKernType = "F16_DSP"; + UserKernPointer = "F16_DSP * __restrict__"; + InItemSize=F16_SIZE; OutItemSize=F16_SIZE, LUTItemSize=F16_SIZE; + break; + case FLOAT32: + InverseMelKer = "MelFilterBank_f32"; + UserKernType = "float"; + UserKernPointer = "float * __restrict__"; + InItemSize=4; OutItemSize=4, LUTItemSize=4; + break; + default: + GenTilingError("Data Type %d not known", DataType); + return 0; + } + unsigned int LayerOp = 0; + unsigned int LayerBandwidth = 0; + printf("Inverse Mel:\n"); + printf("\tNb Oper: %d\n", LayerOp); + printf("\tBandwidth: %d\n", LayerBandwidth); + + Kernel_T *Kernel = UserKernel(Name, + NFrames<0? + KernelIterSpace(2, IterFixedSpaceDynBound(D0, -NFrames, "NFrames"), IterTiledSpace(T0)): + KernelIterSpace(2, IterFixedSpace(D0, NFrames), IterTiledSpace(T0)), + TILE_HOR, + CArgs(5, + TCArg(UserKernPointer, "In"), + TCArg(UserKernPointer, "Out"), + TCArg("fbank_type_t *","IMel_FilterBank"), + TCArg(UserKernPointer, "IMel_Coeffs"), + (NFrames<0)? + TCArg("short int", "NFrames"):AT_NO_C_ARG + ), + Calls(1, + Call(InverseMelKer, LOC_LOOP, + Bindings(9, + K_Arg("In", KER_ARG_TILE), + K_Arg("Out" , KER_ARG_TILE), + K_Arg("IMel_Coeffs" , KER_ARG_TILE), + K_Arg("IMel_FilterBank", KER_ARG_TILE), + Imm(NMelBanks), + Imm(MFCC_Coeff_Dyn), + AT_IGNORE_ARG_BINDING, + (DataType==FIX16)?K_Arg("shift_buff", KER_ARG_TILE):AT_IGNORE_ARG_BINDING, + AT_IGNORE_ARG_BINDING + ) + ) + ), + KerArgs(4, + KerArg("In", KerArgSpace(1,D0), OBJ_IN_DB, 1, NMelBanks, InItemSize, 0, 0, 0, "In"), + KerArg("Out", KerArgSpace(1,D0), OBJ_OUT_DB, 1, Nfft*2, OutItemSize, 0, 0, 0, "Out"), + KerArg("IMel_FilterBank", KerArgSpace(1,T0), O_IN|O_BUFF|O_CONST, 1, NMelBanks, 6, /* size of filterbank type */ 0, 0, 0, "IMel_FilterBank"), + KerArg("IMel_Coeffs", KerArgSpace(1,T0), O_IN|O_BUFF|O_CONST, 1, SizeMelCoeff, LUTItemSize, 0, 0, 0, "IMel_Coeffs") + ) + ); + if (Kernel) { + AddKernelInfos(Name, AT_KERINFO_OPER, LayerOp, 0); + AddKernelInfos(Name, AT_KERINFO_BANDWIDTH, LayerBandwidth, 0); + + if (DataType==FIX32 || DataType==FIX16) { + AddKernelArgDim(Name, "In", 3, Abs(NFrames), NMelBanks, InItemSize); + AddKernelArgDim(Name, "Out", 3, Abs(NFrames), 2*Nfft, OutItemSize); + AddKernelArgDim(Name, "IMel_Coeffs", 2, SizeMelCoeff, LUTItemSize); + } else { + AddKernelFloatArgDim(Name, "In", 3, Abs(NFrames), NMelBanks, InItemSize); + AddKernelFloatArgDim(Name, "Out", 3, Abs(NFrames), 2*Nfft, OutItemSize); + AddKernelFloatArgDim(Name, "IMel_Coeffs", 2, SizeMelCoeff, LUTItemSize); + } + AddKernelArgDim(Name, "IMel_FilterBank", 3, NMelBanks, 3, 2); + } + return (Kernel!=0); +} + int RFFT_2D_Generator( char *Name, CNN_GenControl_T *Ctrl, @@ -1538,3 +1656,126 @@ void STFT_Generator( ) ); } + +int DSP_MatMul_Generator( + char *Name, + + CNN_GenControl_T *Ctrl, + + int ColM1, + int LineM1, + int ColM2, + int LineM2, + + int TransposedIn2, + int DataType +) + +{ + int Log = 1; + Tile_Orientation_T TileOrientation = TILE_HOR; + int F = 0; + unsigned long long int LayerOp = 0; + unsigned long long int LayerBandwidth = 0; + int LineO = LineM1, ColO = ColM2; + int Nbuff, ItemSize; + + if (ColM1 != LineM2) GenTilingError("DSP_MatMul_Generator: %s, Incorrect input matrices dimensions for a matrix multiplication: [%d x %d]*[%d x %d]", Name, LineM1, ColM1, LineM2, ColM2); + + char *MatMulKerName=0, *UserKernType=0, *UserKernPointer=0; + switch (DataType){ + case FIX16: + GenTilingError("DSP_MatMul_Generator Not yet implemented in FIX16"); + UserKernType = "short int"; UserKernPointer = "short int * __restrict__"; + ItemSize=2; + break; + case FIX32: + GenTilingError("DSP_MatMul_Generator Not yet implemented in FIX16"); + UserKernType = "int"; UserKernPointer = "int * __restrict__"; + ItemSize=2; + break; + case FLOAT16: + MatMulKerName = TransposedIn2?"KerParMatMulDSPT_fp16":"KerParMatMulDSP_fp16"; + UserKernType = "F16_DSP"; UserKernPointer = "F16_DSP * __restrict__"; + ItemSize=F16_SIZE; F = O_FLOAT; + break; + case FLOAT32: + MatMulKerName = TransposedIn2?"KerParMatMulDSPT_fp32":"KerParMatMulDSP_fp32"; + UserKernType = "float"; UserKernPointer = "float * __restrict__"; + ItemSize=4; F = O_FLOAT; + break; + default: + GenTilingError("Data Type %d not known", DataType); + } + + + int ColFirst = ((LineM1*ColM1)<(LineM2*ColM2)); + Nbuff = 4; + LayerOp += ColM1*ColM2*LineM1; + LayerBandwidth += LineM1*(ColM1*ColM2*(2+2)); + LayerBandwidth += LineM1*ColM2*2; + LayerBandwidth += LineM1*2; + + if (Log) { + printf("CNN_MatMulAct_fp16: %s\n", Name); + printf("In1 => W: %4d, H: %4d\n", ColM1, LineM1); + printf("In2 => W: %4d, H: %4d\n", ColM2, LineM2); + printf("Out => W: %4d, H: %4d => %s\n", ColO, LineO, ColFirst?"Column first":"Line First"); + printf("Total Op: %lld\n", LayerOp); + if (MatMulKerName) printf("%20s: %s\n", "MatMulKerName", MatMulKerName); + } + + int ObjCons = (!TransposedIn2)?OBJ_CONSTRAINTS_TILE_VER:0; + if (TransposedIn2) { + LineM2 = ColM2; ColM2 = ColM1; + } + Kernel_T *Kernel = UserKernel(Name, + KernelIterSpace(2, IterTiledSpace(T1), IterTiledSpace(T0)), + TILE_HOR, + CArgs(3, + TCArg(UserKernPointer, "In1"), + TCArg(UserKernPointer, "In2"), + TCArg(UserKernPointer, "Out") + ), + Calls(1, + Call(MatMulKerName, LOC_LOOP, + Bindings(10, + K_Arg("In1", KER_ARG_TILE), + K_Arg("In2", KER_ARG_TILE), + K_Arg("Out", KER_ARG_TILE), + (!TransposedIn2)?K_Arg("KerBuff", KER_ARG_TILE):AT_IGNORE_ARG_BINDING, + K_Arg("In1", KER_ARG_TILE_W), + K_Arg("In1", KER_ARG_TILE_H), + TransposedIn2?K_Arg("In2", KER_ARG_TILE_H):K_Arg("In2", KER_ARG_TILE_W), + K_Arg("Out", KER_ARG_TILE_W), + K_Arg(ColFirst?"In1":"In2", KER_ARG_TILE_BASE), + Imm(ColFirst) + ) + ) + ), + ColFirst? + KerArgs(4, + (!TransposedIn2)? + KerArg("KerBuff",KerArgSpace(1,T1), F|O_BUFF|O_NTILED, Nbuff*ColM1, 1, ItemSize, 0, 0, 0, 0):AT_NO_KER_ARG, + KerArg("In1", KerArgSpace(1,T0), F|O_IN|O_DB|O_CONST, ColM1, LineM1, ItemSize, 0, OBJ_CONSTRAINTS_PAD_REM, 8, "In1"), + KerArg("In2", KerArgSpace(1,T1), F|O_IN|O_DB, ColM2, LineM2, ItemSize, 0, ObjCons|OBJ_CONSTRAINTS_PAD_REM, 2, "In2"), + KerArg("Out", KerArgSpace(1,T1), F|O_OUT|O_DB, ColO, LineO, ItemSize, 0, OBJ_CONSTRAINTS_TILE_VER|OBJ_CONSTRAINTS_PAD_REM, 0, "Out") + ): + KerArgs(4, + (!TransposedIn2)? + KerArg("KerBuff",KerArgSpace(1,T0), F|O_BUFF|O_NTILED, Nbuff*ColM1, 1, ItemSize, 0, 0, 0, 0):AT_NO_KER_ARG, + KerArg("In1", KerArgSpace(1,T1), F|O_IN|O_DB|O_CONST, ColM1, LineM1, ItemSize, 0, OBJ_CONSTRAINTS_PAD_REM, 8, "In1"), + KerArg("In2", KerArgSpace(1,T0), F|O_IN|O_DB, ColM2, LineM2, ItemSize, 0, ObjCons|OBJ_CONSTRAINTS_PAD_REM, 2, "In2"), + KerArg("Out", KerArgSpace(1,T1), F|O_OUT|O_DB, ColO, LineO, ItemSize, 0, OBJ_CONSTRAINTS_PAD_REM, 0, "Out") + ) + ); + if (Kernel) { + AddKernelInfos(Name, AT_KERINFO_OPER, LayerOp, 0); + AddKernelInfos(Name, AT_KERINFO_BANDWIDTH, LayerBandwidth, 0); + + AddKernelFloatArgDim(Name, "In1", 3, LineM1, ColM1, ItemSize); + AddKernelFloatArgDim(Name, "In2", 3, LineM2, ColM2, ItemSize); + AddKernelFloatArgDim(Name, "Out", 3, LineO, ColO, ItemSize); + } + return (Kernel!=0); +} diff --git a/tools/autotiler_v3/DSP_Generators/DSP_Generators.h b/tools/autotiler_v3/DSP_Generators/DSP_Generators.h index e6ff452ac..74938f019 100644 --- a/tools/autotiler_v3/DSP_Generators/DSP_Generators.h +++ b/tools/autotiler_v3/DSP_Generators/DSP_Generators.h @@ -29,6 +29,30 @@ int MFCC_Generator( int OutFFT /* If output FFT beside mel spect */ ); +int DSP_MatMul_Generator( + char *Name, + + CNN_GenControl_T *Ctrl, + + int ColM1, + int LineM1, + int ColM2, + int LineM2, + + int TransposedIn2, + int DataType +); + +int IMel_Generator( + char *Name, + CNN_GenControl_T *Ctrl, + int NFrames, + int Nfft, + int NMelBanks, + int SizeMelCoeff, + int DataType + ); + int RFFT_2D_Generator( char *Name, CNN_GenControl_T *Ctrl, diff --git a/tools/autotiler_v3/DSP_Libraries/DSP_Lib.h b/tools/autotiler_v3/DSP_Libraries/DSP_Lib.h index c1f642364..292a84998 100644 --- a/tools/autotiler_v3/DSP_Libraries/DSP_Lib.h +++ b/tools/autotiler_v3/DSP_Libraries/DSP_Lib.h @@ -121,9 +121,9 @@ typedef struct { } FFT_InstallArg_T; typedef struct fbank_type_ { - short int Start; - short int Items; - short int Base; + unsigned short int Start; + unsigned short int Items; + unsigned short int Base; } fbank_type_t; typedef struct { @@ -231,6 +231,19 @@ typedef struct { int FFT_Dim; } Windowing_T; +typedef struct { + void * __restrict__ In1; + void * __restrict__ In2; + void * __restrict__ Out; + void *BufferColIn2; + unsigned int W_In1; + unsigned int H_In1; + unsigned int W_In2; + unsigned int W_Out; + unsigned int OutFirstCol; + int ColFirst; +} MatMul_DSP_T; + /********************************************************************************************************************************************************************/ /****************** FFT Library ************************************************************************************************************************************/ /********************************************************************************************************************************************************************/ @@ -353,4 +366,9 @@ extern void WindowingReal2Cmplx_PadCenter_f16(Windowing_T *Arg); extern void WindowingReal2Real_f16(Windowing_T *Arg); extern void WindowingReal2Real_PadCenter_f16(Windowing_T *Arg); +extern void KerParMatMulDSP_fp16(MatMul_DSP_T *Arg); +extern void KerParMatMulDSPT_fp16(MatMul_DSP_T *Arg); +extern void KerParMatMulDSP_fp32(MatMul_DSP_T *Arg); +extern void KerParMatMulDSPT_fp32(MatMul_DSP_T *Arg); + #endif //DSP_LIB_H \ No newline at end of file diff --git a/tools/autotiler_v3/DSP_Libraries/FFT_Library.c b/tools/autotiler_v3/DSP_Libraries/FFT_Library.c index 9a6e96b2c..cef2cb0f9 100644 --- a/tools/autotiler_v3/DSP_Libraries/FFT_Library.c +++ b/tools/autotiler_v3/DSP_Libraries/FFT_Library.c @@ -29,8 +29,8 @@ void FFT_InstallTwiddlesAndSwapLUT(FFT_InstallArg_T *Arg, int format) LUTSize = Arg->Nfft*sizeof(short); - AT_L2_COPY(0, (AT_L2_EXT_ADDR_TYPE) Arg->SwapLUT, (AT_L2_INT_ADDR_TYPE) Arg->L1_SwapLUT, LUTSize, 0, &DmaR_Evt2); - AT_L2_COPY(0, (AT_L2_EXT_ADDR_TYPE) Arg->Twiddles, (AT_L2_INT_ADDR_TYPE)Arg->L1_Twiddles, TwidSize, 0, &DmaR_Evt1); + AT_L2_COPY(0, (AT_L2_EXT_ADDR_TYPE) Arg->SwapLUT, (AT_L2_INT_ADDR_TYPE) Arg->L1_SwapLUT, LUTSize, 0, &DmaR_Evt1); + AT_L2_COPY(0, (AT_L2_EXT_ADDR_TYPE) Arg->Twiddles, (AT_L2_INT_ADDR_TYPE) Arg->L1_Twiddles, TwidSize, 0, &DmaR_Evt2); AT_L2_WAIT(0, &DmaR_Evt1); AT_L2_WAIT(0, &DmaR_Evt2); @@ -42,8 +42,8 @@ void RFFT_InstallTwiddlesAndSwapLUT(FFT_InstallArg_T *Arg, int format) AT_L2_EVENT DmaR_Evt1, DmaR_Evt2, DmaR_Evt3; int TwidSize, RTwidSize, LUTSize; - if (Arg->Radix == 2) TwidSize = Arg->Nfft * sizeof(short); - else TwidSize = 3 * Arg->Nfft * (sizeof(short)/2); + if (Arg->Radix == 2) TwidSize = (Arg->Nfft>>1) * sizeof(short); + else TwidSize = 3 * (Arg->Nfft>>1) * (sizeof(short)/2); // when floating 32, size is double if (format==1) TwidSize *=2; @@ -52,10 +52,9 @@ void RFFT_InstallTwiddlesAndSwapLUT(FFT_InstallArg_T *Arg, int format) if (format==1) RTwidSize = Arg->Nfft * sizeof(float); else RTwidSize = Arg->Nfft * sizeof(short); - - AT_L2_COPY(0, (AT_L2_EXT_ADDR_TYPE) Arg->SwapLUT, (AT_L2_INT_ADDR_TYPE) Arg->L1_SwapLUT, LUTSize, 0, &DmaR_Evt1); - AT_L2_COPY(0, (AT_L2_EXT_ADDR_TYPE) Arg->Twiddles, (AT_L2_INT_ADDR_TYPE)Arg->L1_Twiddles, TwidSize, 0, &DmaR_Evt2); - AT_L2_COPY(0, (AT_L2_EXT_ADDR_TYPE) Arg->RTwiddles, (AT_L2_INT_ADDR_TYPE)Arg->L1_RTwiddles, RTwidSize, 0, &DmaR_Evt3); + AT_L2_COPY(0, (AT_L2_EXT_ADDR_TYPE) Arg->SwapLUT, (AT_L2_INT_ADDR_TYPE) Arg->L1_SwapLUT, LUTSize, 0, &DmaR_Evt1); + AT_L2_COPY(0, (AT_L2_EXT_ADDR_TYPE) Arg->Twiddles, (AT_L2_INT_ADDR_TYPE) Arg->L1_Twiddles, TwidSize, 0, &DmaR_Evt2); + AT_L2_COPY(0, (AT_L2_EXT_ADDR_TYPE) Arg->RTwiddles, (AT_L2_INT_ADDR_TYPE) Arg->L1_RTwiddles, RTwidSize, 0, &DmaR_Evt3); AT_L2_WAIT(0, &DmaR_Evt1); AT_L2_WAIT(0, &DmaR_Evt2); @@ -2014,9 +2013,10 @@ void IRFFT_DIF_Par_Fix16(RFFT_Arg_T *Arg){ if (CoreId == 0){ xAR = pA[0][0]; xAI = pA[0][1]; + xBR = pA[k+1][0]; - RFFT_Out[0][0] = (xAR + xAI) >> 1; - RFFT_Out[0][1] = (xAR - xAI) >> 1; + RFFT_Out[0][0] = (xAR + xAI + xBR) >> 1; + RFFT_Out[0][1] = (xAR + xAI - xBR) >> 1; } Chunk = ChunkSize(k); First = CoreId*Chunk; Last = Min(First+Chunk, k); @@ -2085,9 +2085,10 @@ void IRFFT_DIF_Par_f16(RFFT_Arg_T *Arg){ if (CoreId == 0){ xAR = pA[0][0]; xAI = pA[0][1]; + xBR = pA[k+1][0]; - RFFT_Out[0][0] = 0.5f * ( xAR + xAI ); - RFFT_Out[0][1] = 0.5f * ( xAR - xAI ); + RFFT_Out[0][0] = 0.5f * ( xAR + xAI + xBR); + RFFT_Out[0][1] = 0.5f * ( xAR + xAI - xBR); } Chunk = ChunkSize(k); First = CoreId*Chunk; Last = Min(First+Chunk, k); @@ -2159,9 +2160,10 @@ void IRFFT_DIF_Par_f32(RFFT_Arg_T *Arg){ if (CoreId == 0){ xAR = pA[0]; xAI = pA[1]; + xBR = pA[2*(k+1)]; - RFFT_Out[0] = 0.5f * ( xAR + xAI ); - RFFT_Out[1] = 0.5f * ( xAR - xAI ); + RFFT_Out[0] = 0.5f * ( xAR + xAI + xBR ); + RFFT_Out[1] = 0.5f * ( xAR + xAI - xBR ); } Chunk = ChunkSize(k); First = CoreId*Chunk; Last = Min(First+Chunk, k); diff --git a/tools/autotiler_v3/DSP_Libraries/LUT_Tables/gen_scripts/GenMFCCLUT.py b/tools/autotiler_v3/DSP_Libraries/LUT_Tables/gen_scripts/GenMFCCLUT.py index 947e2d625..5cea41772 100644 --- a/tools/autotiler_v3/DSP_Libraries/LUT_Tables/gen_scripts/GenMFCCLUT.py +++ b/tools/autotiler_v3/DSP_Libraries/LUT_Tables/gen_scripts/GenMFCCLUT.py @@ -26,7 +26,9 @@ def create_parser(): parser.add_argument('--fft_lut_file', required="--params_json" not in sys.argv, help="path to fft lut file") parser.add_argument('--mfcc_bf_lut_file', default=None, - help="path to fft lut file") + help="path to mfcc lut file") + parser.add_argument('--imel_lut_file', default=None, + help="path to inverse mel lut file") parser.add_argument('--sample_rate', default=16000, type=int) parser.add_argument('--name_suffix', default="", type=str) parser.add_argument('--frame_size', required="--params_json" not in sys.argv, type=int, @@ -81,6 +83,7 @@ def main(): fft_lut_file = args.fft_lut_file if not "fft_lut_file" in models_params else models_params["fft_lut_file"] mfcc_bf_lut_file = args.mfcc_bf_lut_file if not "mfcc_bf_lut_file" in models_params else models_params["mfcc_bf_lut_file"] + imel_lut_file = args.imel_lut_file if not "imel_lut_file" in models_params else models_params["imel_lut_file"] use_tf_mfcc = args.use_tf_mfcc if not "use_tf_mfcc" in models_params else models_params["use_tf_mfcc"] use_librosa = args.use_librosa if not "use_librosa" in models_params else models_params["use_librosa"] sample_rate = args.sample_rate if not "sample_rate" in models_params else models_params["sample_rate"] @@ -218,10 +221,19 @@ def main(): from SetupLUT import GenMFCC_FB filters = GenMFCC_FB(n_fft, mfcc_bank_cnt, Fmin=fmin, Fmax=fmax, sample_rate=sample_rate, dtype=lut_dtype) - MfccLUT, HeadCoeff = GenMelFilterBanksCode(filters, mfcc_bank_cnt, fmin, fmax, lut_dtype, data_type, name_suffix) + MelLUT, NCoeffMEL = GenMelFilterBanksCode(filters, mfcc_bank_cnt, fmin, fmax, lut_dtype, data_type, name_suffix) with open(mfcc_bf_lut_file, "w") as f: - f.write(MfccLUT) + f.write(MelLUT) + + if imel_lut_file: + # Inverse matrix of filterbank generated with least squares algorithm + # A.T*b = A.T*A*x^ + # x^ = (A.T*A)^-1 * A.T * b + inverse_mel_fb = np.matmul(np.linalg.inv(np.matmul(filters, filters.T)), filters) + ImelLUT = array_to_def_c_file(inverse_mel_fb.flatten(), f"ImelLUT{name_suffix}", data_type, inverse_mel_fb.size, elem_in_rows=inverse_mel_fb.size) + with open(imel_lut_file, "w") as f: + f.write(ImelLUT) if args.save_params_header: with open(args.save_params_header, "w") as f: @@ -230,11 +242,11 @@ def main(): f.write("#define\t{:21}{:>10}\n".format("FRAME_STEP", frame_step)) f.write("#define\t{:21}{:>10}\n".format("N_FFT", n_fft)) f.write("#define\t{:21}{:>10}\n".format("DATA_TYPE", 2 if dtype=="float16" else (3 if dtype=="float32" else (1 if dtype=="fix32_scal" else 0)))) - if mfcc_bf_lut_file: + if mfcc_bf_lut_file or imel_lut_file: f.write("#define\t{:21}{:>10}\n".format("MFCC_BANK_CNT", mfcc_bank_cnt)) f.write("#define\t{:21}{:>10}\n".format("FMIN", fmin)) f.write("#define\t{:21}{:>10}\n".format("FMAX", fmax)) - f.write("#define\t{:21}{:>10}\n".format("MFCC_COEFF_CNT", HeadCoeff+1)) + f.write("#define\t{:21}{:>10}\n".format("MFCC_COEFF_CNT", NCoeffMEL+1)) f.write("#define\t{:21}{:>10}\n".format("N_DCT", n_dct)) diff --git a/tools/autotiler_v3/DSP_Libraries/LUT_Tables/gen_scripts/SetupLUT.py b/tools/autotiler_v3/DSP_Libraries/LUT_Tables/gen_scripts/SetupLUT.py index 671c7d190..5460da336 100644 --- a/tools/autotiler_v3/DSP_Libraries/LUT_Tables/gen_scripts/SetupLUT.py +++ b/tools/autotiler_v3/DSP_Libraries/LUT_Tables/gen_scripts/SetupLUT.py @@ -117,7 +117,14 @@ def SetupLiftCoeff(L, N, dtype="int"): def GenMelFilterBanksCode(filters, mfcc_bank_cnt, fmin, fmax, dtype, data_type, name_suffix): HeadCoeff = 0 MFCC_Coeff = [] - for i, filt in enumerate(filters): + if dtype == "int": + quant_filters = FP2FIX(filters, MFCC_COEFF_DYN) + elif dtype == "float16": + quant_filters = filters.astype(np.float16) + else: + quant_filters = filters.astype(np.float32) + + for i, filt in enumerate(quant_filters): if np.all(filt == 0): Start = 0 Stop = 0 @@ -130,22 +137,17 @@ def GenMelFilterBanksCode(filters, mfcc_bank_cnt, fmin, fmax, dtype, data_type, Items = Stop - Start + 1 print("Filter {}: Start: {} Stop: {} Base: {} Items: {}".format(i, Start, Stop, Base, Items)) for j in range(Items): - if dtype == "int": - MFCC_Coeff.append(FP2FIX(filt[Start+j], MFCC_COEFF_DYN)) - elif dtype == "float16": - MFCC_Coeff.append(filt[Start+j].astype(np.float16)) - else: - MFCC_Coeff.append(filt[Start+j]) + MFCC_Coeff.append(filt[Start+j]) HeadCoeff += Items - Out_str = "#define MFCC_COEFF_CNT\t{}\n\n".format(HeadCoeff+1) - Out_str += "/* Filter Bank bands:\n\n" + #Out_str = "#define MFCC_COEFF_CNT\t{}\n\n".format(HeadCoeff+1) + Out_str = "/* Filter Bank bands:\n\n" Out_str += "\tMinimum Frequency: {} Hz\n".format(fmin) Out_str += "\tMaximum Frequency: {} Hz*/\n\n".format(fmax) Out_str += "PI_L2 fbank_type_t MFCC_FilterBank{}[{}] = {{\n".format(name_suffix, mfcc_bank_cnt) HeadCoeff = 0 - for i, filt in enumerate(filters): + for i, filt in enumerate(quant_filters): if np.all(filt == 0): Start = 0 Stop = 0 diff --git a/tools/autotiler_v3/DSP_Libraries/MatMulDSP.c b/tools/autotiler_v3/DSP_Libraries/MatMulDSP.c new file mode 100644 index 000000000..94aa3cea5 --- /dev/null +++ b/tools/autotiler_v3/DSP_Libraries/MatMulDSP.c @@ -0,0 +1,514 @@ +#include +#include "FastFloatApprox16.h" +#include "DSP_Lib.h" + +static int CoreCountDynamic = 1; +static int ActiveCore = gap_ncore(); +static inline unsigned int __attribute__((always_inline)) ChunkSize(unsigned int X) + +{ + unsigned int NCore; + unsigned int Log2Core; + unsigned int Chunk; + + if (CoreCountDynamic) NCore = ActiveCore; else NCore = gap_ncore(); + Log2Core = gap_fl1(NCore); + Chunk = (X>>Log2Core) + ((X&(NCore-1))!=0); + return Chunk; +} + +void KerParMatMulDSP_fp16(MatMul_DSP_T *Arg) + +{ + F16_DSP * __restrict__ In1 = (F16_DSP * __restrict__) Arg->In1; + F16_DSP * __restrict__ In2 = (F16_DSP * __restrict__) Arg->In2; + F16_DSP * __restrict__ Out = (F16_DSP * __restrict__) Arg->Out; + F16_DSP *BufferColIn2 = (F16_DSP *) Arg->BufferColIn2; + unsigned int W_In1 = Arg->W_In1; + unsigned int H_In1 = Arg->H_In1; + unsigned int W_In2 = Arg->W_In2; /* H_In2 = W_In1 by construction */ + unsigned int W_Out = Arg->W_Out; + unsigned int OutFirstCol = Arg->OutFirstCol; + int ColFirst = Arg->ColFirst; + + unsigned int H_In2 = W_In1; + unsigned int H_Out = H_In1; + unsigned int Line, Col, i; + F16V_DSP *VBuff1 = (F16V_DSP *) (&BufferColIn2[0]); + F16V_DSP *VBuff2 = (F16V_DSP *) (&BufferColIn2[1*H_In2]); + F16V_DSP *VBuff3 = (F16V_DSP *) (&BufferColIn2[2*H_In2]); + F16V_DSP *VBuff4 = (F16V_DSP *) (&BufferColIn2[3*H_In2]); + + unsigned int CoreId = gap_coreid(); + unsigned int ChunkCell = ChunkSize(H_In1); + unsigned int First = CoreId*ChunkCell, Last = Min(H_In1, First+ChunkCell); + unsigned int Iter = (Last>First)?(Last-First):0; + unsigned int C = ChunkSize(H_In2), F = CoreId*C, L = Min(H_In2, F+C); + int OffLine = 0, OffCol = 0; + + if (ColFirst) OffLine = OutFirstCol; else OffCol = OutFirstCol; + for (Col=0; ColIn1; + F16_DSP * __restrict__ In2 = (F16_DSP * __restrict__) Arg->In2; + F16_DSP * __restrict__ Out = (F16_DSP * __restrict__) Arg->Out; + unsigned int W_In1 = Arg->W_In1; + unsigned int H_In1 = Arg->H_In1; + unsigned int W_In2 = Arg->W_In2; /* H_In2 = W_In1 by construction */ + unsigned int W_Out = Arg->W_Out; + unsigned int OutFirstCol = Arg->OutFirstCol; + int ColFirst = Arg->ColFirst; + + unsigned int H_In2 = W_In1; + unsigned int H_Out = H_In1; + unsigned int Line, Col, i; + + unsigned int CoreId = gap_coreid(); + unsigned int ChunkCell = ChunkSize(H_In1); + unsigned int First = CoreId*ChunkCell, Last = Min(H_In1, First+ChunkCell); + unsigned int Iter = (Last>First)?(Last-First):0; + int OffLine = 0, OffCol = 0; + + if (ColFirst) OffLine = OutFirstCol; else OffCol = OutFirstCol; + F16_DSP * pOut = Out + (OffLine+First)*W_Out + OffCol; + for (Line=0; LineIn1; + float * __restrict__ In2 = (float *__restrict__) Arg->In2; + float * __restrict__ Out = (float *__restrict__) Arg->Out; + float *BufferColIn2 = (float *) Arg->BufferColIn2; + unsigned int W_In1 = Arg->W_In1; + unsigned int H_In1 = Arg->H_In1; + unsigned int W_In2 = Arg->W_In2; /* H_In2 = W_In1 by construction */ + unsigned int W_Out = Arg->W_Out; + unsigned int OutFirstCol = Arg->OutFirstCol; + int ColFirst = Arg->ColFirst; + + unsigned int H_In2 = W_In1; + unsigned int H_Out = H_In1; + unsigned int Line, Col, i; + + unsigned int CoreId = gap_coreid(); + unsigned int ChunkCell = ChunkSize(H_In1); + unsigned int First = CoreId*ChunkCell, Last = Min(H_In1, First+ChunkCell); + unsigned int Iter = (Last>First)?(Last-First):0; + unsigned int C = ChunkSize(H_In2), F = CoreId*C, L = Min(H_In2, F+C); + int OffLine = 0, OffCol = 0; + + if (ColFirst) OffLine = OutFirstCol; else OffCol = OutFirstCol; + for (Col=0; ColIn1; + float * __restrict__ In2 = (float *__restrict__) Arg->In2; + float * __restrict__ Out = (float *__restrict__) Arg->Out; + unsigned int W_In1 = Arg->W_In1; + unsigned int H_In1 = Arg->H_In1; + unsigned int W_In2 = Arg->W_In2; /* H_In2 = W_In1 by construction */ + unsigned int W_Out = Arg->W_Out; + unsigned int OutFirstCol = Arg->OutFirstCol; + int ColFirst = Arg->ColFirst; + + unsigned int H_In2 = W_In1; + unsigned int H_Out = H_In1; + unsigned int Line, Col, i; + + unsigned int CoreId = gap_coreid(); + unsigned int ChunkCell = ChunkSize(H_In1); + unsigned int First = CoreId*ChunkCell, Last = Min(H_In1, First+ChunkCell); + unsigned int Iter = (Last>First)?(Last-First):0; + int OffLine = 0, OffCol = 0; + + if (ColFirst) OffLine = OutFirstCol; else OffCol = OutFirstCol; + float * pOut = Out + (OffLine+First)*W_Out + OffCol; + for (Line=0; Line size) + length = size; + + fseek(file, ext, SEEK_SET); + if (dir==AT_QSPIFLASH_FS_EXT2LOC) fread(loc, 1, length, file); + else fwrite(loc, 1, length, file); + + loc = ((char *)loc) + length; + ext += stride; + } +} + + +#define AT_OSPIFLASH_FS_CONF_INIT(dev,type,name) + +#define AT_OSPIFLASH_FS_OPEN(file,conf,filename,err) \ + do { *(file) = fopen(filename, "r"); *(err) = *(file) == NULL; } while(0) + +#define AT_OSPIFLASH_FS_OPEN_WRITE(file,conf,filename,err) \ + do { *(file) = fopen(filename, "w"); *(err) = *(file) == NULL; } while(0) + +#define AT_OSPIFLASH_FS_OPEN_SET_SIZE(file, size) + +#define AT_OSPIFLASH_FS_CLOSE(file) \ + fclose(*file) + +#define AT_OSPIFLASH_FS_FC_COPY(file,ext,loc,size,dir,event) \ + __at_ospiflash_fs_copy(*(file), ext, loc, size, dir) + +#define AT_OSPIFLASH_FS_FC_COPY2D(file, dev,ext,loc,size,stride,len,dir,event) \ + __at_ospiflash_fs_copy_2d(*(file), ext, loc, size, stride, len, dir) + +#define AT_OSPIFLASH_FS_FC_WAIT(file,event) + +#define AT_OSPIFLASH_FS_CL_COPY(file,ext,loc,size,dir,event) \ + __at_ospiflash_fs_copy(*(file), ext, loc, size, dir) + +#define AT_OSPIFLASH_FS_CL_COPY2D(file, dev,ext,loc,size,stride,len,dir,event) \ + __at_ospiflash_fs_copy_2d(*(file), ext, loc, size, stride, len, dir) + +#define AT_OSPIFLASH_FS_CL_WAIT(file,event) + /* * EMRAMflash diff --git a/tools/autotiler_v3/Emulation/at_api_pmsis.h b/tools/autotiler_v3/Emulation/at_api_pmsis.h index 733992315..584fc99ce 100644 --- a/tools/autotiler_v3/Emulation/at_api_pmsis.h +++ b/tools/autotiler_v3/Emulation/at_api_pmsis.h @@ -18,6 +18,7 @@ #define __AT__AT_API_PMSIS_H__ #include "pmsis.h" +#include #include "bsp/ram/hyperram.h" #include "bsp/ram/spiram.h" #include "bsp/flash/hyperflash.h" @@ -83,6 +84,10 @@ static inline uint32_t gap_cl_readhwtimer() #define AT_QSPIRAM_FREE(dev,ptr,size) pi_ram_free((dev), (ptr), (size)) +#define AT_OSPIRAM_ALLOC(dev,size) ({ uint32_t ptr; int err = pi_ram_alloc((dev), &ptr, (size)); if (!err && ptr == 0) err = pi_ram_alloc((dev), &ptr, (size)); if (err) ptr = 0; ptr; }) + +#define AT_OSPIRAM_FREE(dev,ptr,size) pi_ram_free((dev), (ptr), (size)) + #define AT_L2_ALLOC(dev,size) pmsis_l2_malloc(size) #define AT_L2_FREE(dev,ptr,size) pmsis_l2_malloc_free((ptr), (size)) @@ -328,6 +333,53 @@ typedef char * AT_QSPIRAM_INT_ADDR_TYPE; pi_cl_ram_copy_wait(event) +/* + * OctaSpiram + */ + +#ifdef __GAP9__ +#define AT_OSPIRAM_TYPE 0 + +typedef struct pi_aps25xxxn_conf AT_OSPIRAM_CONF_T; +typedef struct pi_device AT_OSPIRAM_T; +typedef uint32_t AT_OSPIRAM_EXT_ADDR_TYPE; +typedef void * AT_OSPIRAM_LOC_ADDR_TYPE; +typedef pi_task_t AT_OSPIRAM_FC_EVENT; +typedef pi_cl_ram_req_t AT_OSPIRAM_CL_EVENT; +typedef uint32_t AT_OSPIRAM_POINTER; +typedef char * AT_OSPIRAM_INT_ADDR_TYPE; + +#define AT_OSPIRAM_EXT2LOC 0 +#define AT_OSPIRAM_LOC2EXT 1 + +#define AT_OSPIRAM_CONF_INIT(dev,type,name) \ + pi_aps25xxxn_conf_init(dev) + +#define AT_OSPIRAM_OPEN(dev,conf,err) \ + do { pi_open_from_conf((dev), (conf)); *(err) = pi_ram_open(dev); } while(0) + +#define AT_OSPIRAM_CLOSE(dev) \ + pi_ram_close(dev) + +#define AT_OSPIRAM_FC_COPY(dev,ext,loc,size,dir,event) \ + pi_ram_copy_async(dev, (AT_OSPIRAM_EXT_ADDR_TYPE)(ext), (AT_OSPIRAM_LOC_ADDR_TYPE)(loc), (size), !(dir), pi_task_block(event)) + +#define AT_OSPIRAM_FC_COPY2D(dev,ext,loc,size,stride,len,dir,event) \ + pi_ram_copy_2d_async(dev, (AT_OSPIRAM_EXT_ADDR_TYPE)(ext), (AT_OSPIRAM_LOC_ADDR_TYPE)(loc), (size), (stride), (len), !(dir), pi_task_block(event)) + +#define AT_OSPIRAM_FC_WAIT(dev,event) \ + pi_task_wait_on(event) + +#define AT_OSPIRAM_CL_COPY(dev,ext,loc,size,dir,event) \ + pi_cl_ram_copy(dev, (AT_OSPIRAM_EXT_ADDR_TYPE)(ext), (AT_OSPIRAM_LOC_ADDR_TYPE)(loc), (size), !(dir), (event)) + +#define AT_OSPIRAM_CL_COPY2D(dev,ext,loc,size,stride,len,dir,event) \ + pi_cl_ram_copy_2d(dev, (AT_OSPIRAM_EXT_ADDR_TYPE)(ext), (AT_OSPIRAM_LOC_ADDR_TYPE)(loc), (size), (stride), (len), !(dir), (event)) + +#define AT_OSPIRAM_CL_WAIT(dev,event) \ + pi_cl_ram_copy_wait(event) +#endif + /* * Spiflash */ @@ -362,6 +414,47 @@ typedef pi_cl_ram_req_t AT_QSPIFLASH_EVENT; #define AT_QSPIFLASH_WAIT(dev,event) +/* + * OctaSpiflash + */ + +#ifdef __GAP9__ +#define AT_OSPIFLASH_TYPE 1 + +#if defined(CONFIG_ATXP032) +typedef struct pi_atxp032_conf AT_OSPIFLASH_CONF_T; +#else +#if defined(CONFIG_MX25U51245G) +typedef struct pi_mx25u51245g_conf AT_OSPIFLASH_CONF_T; +#endif +#endif +typedef struct pi_device AT_OSPIFLASH_T; +typedef uint32_t AT_OSPIFLASH_EXT_ADDR_TYPE; +typedef void * AT_OSPIFLASH_LOC_ADDR_TYPE; +typedef pi_cl_ram_req_t AT_OSPIFLASH_EVENT; + +#define AT_OSPIFLASH_EXT2LOC 0 +#define AT_OSPIFLASH_LOC2EXT 1 + +#define AT_OSPIFLASH_CONF_INIT(dev,type,name) \ + pi_spiflash_conf_init(dev) + +#define AT_OSPIFLASH_OPEN(dev,conf,err) \ + do { pi_open_from_conf((dev), (conf)); *(err) = pi_flash_open(dev); } while(0) + +#define AT_OSPIFLASH_CLOSE(dev) \ + pi_flash_close(dev) + +// TODO not yet supported +#define AT_OSPIFLASH_COPY(dev,ext,loc,size,dir,event) + +// TODO not yet supported +#define AT_OSPIFLASH_COPY2D(dev,ext,loc,size,stride,len,dir,event) + +// TODO not yet supported +#define AT_OSPIFLASH_WAIT(dev,event) +#endif + /* * SPIflash FS @@ -463,6 +556,116 @@ static inline void __at_qspiflash_fs_close(AT_QSPIFLASH_FS_T *file) #define AT_QSPIFLASH_FS_CL_WAIT(file,event) \ pi_cl_fs_wait(event) + +/* + * OctoSPIflash FS + */ + +#ifdef __GAP9__ +#define AT_OSPIFLASH_FS_TYPE 1 + +typedef struct pi_fs_conf AT_OSPIFLASH_FS_CONF_T; + +typedef struct +{ + struct pi_device fs; + struct pi_device ospiflash; + pi_fs_file_t *file; +} AT_OSPIFLASH_FS_T; + +typedef unsigned int AT_OSPIFLASH_FS_EXT_ADDR_TYPE; +typedef void *AT_OSPIFLASH_FS_INT_ADDR_TYPE; +typedef pi_task_t AT_OSPIFLASH_FS_FC_EVENT; +typedef pi_cl_fs_req_t AT_OSPIFLASH_FS_CL_EVENT; + +static inline void __at_ospiflash_fs_open(AT_OSPIFLASH_FS_T *file, int is_write, struct pi_fs_conf *conf, const char *filename, int *err) +{ + #if defined(CONFIG_ATXP032) + struct pi_atxp032_conf flash_conf; + pi_atxp032_conf_init(&flash_conf); + #else + #if defined(CONFIG_MX25U51245G) + struct pi_mx25u51245g_conf flash_conf; + pi_mx25u51245g_conf_init(&flash_conf); + #endif + #endif + pi_open_from_conf(&file->ospiflash, &flash_conf); + if (pi_flash_open(&file->ospiflash)) + { + *err = -1; + return; + } + conf->flash = &file->ospiflash; + if (is_write) + conf->type = PI_FS_HOST; + else + conf->type = PI_FS_READ_ONLY; + + pi_open_from_conf(&file->fs, conf); + if (pi_fs_mount(&file->fs)) + { + pi_flash_close(&file->ospiflash); + *err = -1; + return; + } + file->file = pi_fs_open(&file->fs, filename, is_write ? PI_FS_FLAGS_WRITE : 0); + if (file->file == NULL) + { + pi_fs_unmount(&file->fs); + pi_flash_close(&file->ospiflash); + *err = -1; + return; + } + *err = 0; + + if (is_write) + file->file->size = 4*1024*1024; +} + +static inline void __at_ospiflash_fs_close(AT_OSPIFLASH_FS_T *file) +{ + pi_fs_close(file->file); + pi_fs_unmount(&file->fs); + pi_flash_close(&file->ospiflash); +} + +#define AT_OSPIFLASH_FS_EXT2LOC 0 +#define AT_OSPIFLASH_FS_LOC2EXT 1 + +#define AT_OSPIFLASH_FS_CONF_INIT(dev,type,name) \ + pi_fs_conf_init(dev) + +#define AT_OSPIFLASH_FS_OPEN(file,conf,filename,err) \ + __at_ospiflash_fs_open(file, 0, conf, filename, err) + +#define AT_OSPIFLASH_FS_OPEN_WRITE(file,conf,filename,err) \ + __at_ospiflash_fs_open(file, 1, conf, filename, err) + +#define AT_OSPIFLASH_FS_OPEN_SET_SIZE(file, size) \ + file->file->size = size + +#define AT_OSPIFLASH_FS_CLOSE(file) \ + __at_ospiflash_fs_close(file) + +#define AT_OSPIFLASH_FS_FC_COPY(fs,ext,loc,size,dir,event) \ + pi_fs_copy_async((fs)->file, ext, loc, size, !(dir), pi_task_block(event)) + +#define AT_OSPIFLASH_FS_FC_COPY2D(file, dev,ext,loc,size,stride,len,dir,event) \ + pi_fs_copy_2d_async(file->file, ext, loc, size, stride, len, !(dir), pi_task_block(event)) + +#define AT_OSPIFLASH_FS_FC_WAIT(file,event) \ + pi_task_wait_on(event) + +#define AT_OSPIFLASH_FS_CL_COPY(fs,ext,loc,size,dir,event) \ + pi_cl_fs_copy((fs)->file, ext, loc, size, !(dir), event) + +#define AT_OSPIFLASH_FS_CL_COPY2D(file, dev,ext,loc,size,stride,len,dir,event) \ + pi_cl_fs_copy_2d(file->file, ext, loc, size, stride, len, !(dir), event) + +#define AT_OSPIFLASH_FS_CL_WAIT(file,event) \ + pi_cl_fs_wait(event) +#endif + #ifdef __GAP9__ /* diff --git a/tools/autotiler_v3/Makefile b/tools/autotiler_v3/Makefile index 0abf4ba65..d099d66b9 100644 --- a/tools/autotiler_v3/Makefile +++ b/tools/autotiler_v3/Makefile @@ -1,4 +1,4 @@ -TILER_VER=4.3.1 +TILER_VER=4.3.2 export TILER_LIB=libtile.${TILER_VER}.a ifdef GAP_SDK_HOME export TILER_URL=$(GAP_SDK_HOME)/.tiler_url diff --git a/tools/autotiler_v3/version.cfg b/tools/autotiler_v3/version.cfg index 332f897c0..047a40256 100644 --- a/tools/autotiler_v3/version.cfg +++ b/tools/autotiler_v3/version.cfg @@ -3,7 +3,7 @@ { "version": "autotiler-v3", "magicNum": 718930176, - "git-hash": "de88fbeb3017c0db55f1e86e49cce5a0160ccbe5" + "git-hash": "4be2dc2f29bb4719d481b20c8cd37ae3b68937cf" } ] } \ No newline at end of file diff --git a/tools/jenkins/gap_sdk_version.txt b/tools/jenkins/gap_sdk_version.txt index 59f52fae3..86cc31dbb 100644 --- a/tools/jenkins/gap_sdk_version.txt +++ b/tools/jenkins/gap_sdk_version.txt @@ -1 +1 @@ -9af2d93598d20541f4c18ba45e2124b767be2388 +65d7014bdc0a46fff8f45d826301de74829b89ab diff --git a/tools/nntool/_version.py b/tools/nntool/_version.py index 62227b113..a1297615f 100644 --- a/tools/nntool/_version.py +++ b/tools/nntool/_version.py @@ -13,4 +13,4 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -__version__ = '3.11' +__version__ = '4.1' diff --git a/tools/nntool/execution/kernels/float/dsp_preprocessing.py b/tools/nntool/execution/kernels/float/dsp_preprocessing.py index 2d094e224..111146cb3 100644 --- a/tools/nntool/execution/kernels/float/dsp_preprocessing.py +++ b/tools/nntool/execution/kernels/float/dsp_preprocessing.py @@ -18,8 +18,6 @@ import numpy as np from graph.types import MFCCPreprocessingParameters, RFFT2DPreprocessingParameters from execution.kernels.kernel_base import KernelBase, params_type, qrec_type -from quantization.multiplicative.mulbias import (apply_multiplicative_bias, - apply_zero_offset_bias) from quantization.new_qrec import QRec from utils.at_norm import at_norm diff --git a/tools/nntool/execution/kernels/float/fast_conv.py b/tools/nntool/execution/kernels/float/fast_conv.py index 0963ae22d..8c20195bd 100644 --- a/tools/nntool/execution/kernels/float/fast_conv.py +++ b/tools/nntool/execution/kernels/float/fast_conv.py @@ -51,7 +51,9 @@ def execute(cls, params, details['max_acc'] = float("-Infinity") details['min_pre_mul_bias'] = float("Infinity") details['max_pre_mul_bias'] = float("-Infinity") - + in_rank = len(in_tensor.shape) + if in_rank != 3: + raise NotImplementedError(f'{params.name} input has input rank of {in_rank} shape {in_tensor.shape} which is not supported by nntool kernels') in_tensor = in_tensor.transpose( in_dims.transpose_to_order(['h', 'w', 'c'])) if params.padding.h + params.padding.w > 0: diff --git a/tools/nntool/execution/kernels/float/tensor_functions.py b/tools/nntool/execution/kernels/float/tensor_functions.py index cae1352af..704afc0a7 100644 --- a/tools/nntool/execution/kernels/float/tensor_functions.py +++ b/tools/nntool/execution/kernels/float/tensor_functions.py @@ -13,20 +13,20 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -import math from typing import cast as typing_cast -from utils.at_norm import at_norm import numpy as np +from skimage.transform import resize + +from execution.kernels.kernel_base import KernelBase, params_type, qrec_type from graph.types import (ConcatParameters, ConstantInputParameters, CopyParameters, InputParameters, OutputParameters, ReshapeParameters, ReverseParameters, SplitParameters, StridedSliceParameters, TransposeParameters) -from graph.types.others import (ExpandParameters, GatherParameters, NoOPParameters, - QuantizeParameters) -from execution.kernels.kernel_base import KernelBase, params_type, qrec_type +from graph.types.others import (ExpandParameters, GatherParameters, + NoOPParameters, QuantizeParameters) from quantization.new_qrec import AllFloatQRec, QRec -from skimage.transform import resize +from utils.at_norm import at_norm @params_type(InputParameters) diff --git a/tools/nntool/execution/kernels/quant/activations.py b/tools/nntool/execution/kernels/quant/activations.py index b146a8da9..73bec1c78 100644 --- a/tools/nntool/execution/kernels/quant/activations.py +++ b/tools/nntool/execution/kernels/quant/activations.py @@ -196,9 +196,9 @@ def execute(cls, params, return qrec.get_outputs(params, [in_tensor], ktype="symmetric") -@params_type(SigmoidActivationParameters) +@params_type(SigmoidActivationParameters, TanHActivationParameters) @qrec_type('scaled') -class SigmoidScaledSymmetricMult(KernelBase): +class SigmoidTanHScaledSymmetricMult(KernelBase): @classmethod def execute(cls, params, in_tensors, @@ -206,17 +206,19 @@ def execute(cls, params, **kwargs): in_tensor = qrec.prepare_inputs( params, in_tensors, ktype="symmetric")[0] - if in_tensor.dtype == np.int8: + if in_tensor.dtype == np.int8: # Q4 in_tensor = in_tensor.astype(np.int32) << 8 - elif in_tensor.dtype == np.uint8: - in_tensor = in_tensor.astype(np.int32) - qrec.in_qs[0].zero_point + elif in_tensor.dtype == np.uint8: # Q4 sym + in_tensor = in_tensor.astype(np.int32) - (1 << 8) in_tensor <<= 8 - elif in_tensor.dtype == np.uint16: - in_tensor = in_tensor.astype(np.int32) - qrec.in_qs[0].zero_point - else: + elif in_tensor.dtype == np.uint16: # Q12 sym + in_tensor = in_tensor.astype(np.int32) - (1 << 16) + else: # Q12 in_tensor = in_tensor.astype(np.int32) - - out_q15 = sigmoid_lut(in_tensor) + if isinstance(params, TanHActivationParameters): + out_q15 = tanh_lut(in_tensor) + else: + out_q15 = sigmoid_lut(in_tensor) scale_mul_biases_q = qrec.cache['scale_mul_biases_q'] outp = scale_mul_biases_q.apply_scales(out_q15) + qrec.cache['zero_point'] output = qrec.out_qs[0].clip(outp) @@ -251,35 +253,35 @@ def execute(cls, params, ktype="symmetric") -@params_type(TanHActivationParameters) -@qrec_type('scaled') -class TanHScaledMult(KernelBase): - @classmethod - def execute(cls, params, - in_tensors, - qrec: QRec, - **kwargs): - in_tensor = qrec.prepare_inputs( - params, in_tensors, ktype="symmetric")[0] - if in_tensor.dtype == np.int8: - in_tensor = in_tensor.astype(np.int32) << 8 - elif in_tensor.dtype == np.uint8: - in_tensor = in_tensor.astype(np.int32) - qrec.cache['zero_point'] - in_tensor <<= 8 - elif in_tensor.dtype == np.uint16: - in_tensor = in_tensor.astype(np.int32) - qrec.cache['zero_point'] - else: - in_tensor = in_tensor.astype(np.int32) - - out_q15 = tanh_lut(in_tensor) - # compute_in_out_scale(qrec, extra_scale=QType.Pow2( - # bits=32, q=7, signed=True).scale/qrec.in_qs[0].scale) - scale_mul_biases_q = qrec.cache['scale_mul_biases_q'] - outp = scale_mul_biases_q.apply_scales(out_q15) + qrec.out_qs[0].zero_point - output = qrec.out_qs[0].clip(outp) - return qrec.get_outputs(params, - [output], - ktype="symmetric") +# @params_type(TanHActivationParameters) +# @qrec_type('scaled') +# class TanHScaledMult(KernelBase): +# @classmethod +# def execute(cls, params, +# in_tensors, +# qrec: QRec, +# **kwargs): +# in_tensor = qrec.prepare_inputs( +# params, in_tensors, ktype="symmetric")[0] +# if in_tensor.dtype == np.int8: # Q4 +# in_tensor = in_tensor.astype(np.int32) << 8 +# elif in_tensor.dtype == np.uint8: # Q4 sym +# in_tensor = in_tensor.astype(np.int32) - (1 << 8) +# in_tensor <<= 8 +# elif in_tensor.dtype == np.uint16: # Q12 sym +# in_tensor = in_tensor.astype(np.int32) - (1 << 16) +# else: # Q12 +# in_tensor = in_tensor.astype(np.int32) + +# out_q15 = tanh_lut(in_tensor) +# # compute_in_out_scale(qrec, extra_scale=QType.Pow2( +# # bits=32, q=7, signed=True).scale/qrec.in_qs[0].scale) +# scale_mul_biases_q = qrec.cache['scale_mul_biases_q'] +# outp = scale_mul_biases_q.apply_scales(out_q15) + qrec.cache['zero_point'] +# output = qrec.out_qs[0].clip(outp) +# return qrec.get_outputs(params, +# [output], +# ktype="symmetric") @params_type(TanHActivationParameters) diff --git a/tools/nntool/execution/kernels/quant/fast_conv.py b/tools/nntool/execution/kernels/quant/fast_conv.py index c965f0d81..493c38be1 100644 --- a/tools/nntool/execution/kernels/quant/fast_conv.py +++ b/tools/nntool/execution/kernels/quant/fast_conv.py @@ -18,8 +18,7 @@ import numpy as np from graph.types import Conv2DParameters from execution.kernels.kernel_base import KernelBase, params_type, qrec_type -from quantization.multiplicative.mulbias import (apply_multiplicative_bias, - apply_zero_offset_bias) +from quantization.multiplicative.mulbias import apply_multiplicative_bias from quantization.new_qrec import QRec FORCE_INT64 = False @@ -43,11 +42,10 @@ def execute(cls, params, in_dims, out_dims = params.in_dims[0], params.out_dims[0] prepared_in_tensors = qrec.prepare_inputs(params, in_tensors, ktype="symmetric") - # if zero offset is already applied in biases by constant quantizer this does nothing - prepared_in_tensors = apply_zero_offset_bias(qrec, params, prepared_in_tensors, ktype="symmetric") in_tensor = prepared_in_tensors[0] # expand the weights to apply the zero offset weights = prepared_in_tensors[1].astype(np.int32) - qrec.in_qs[1].zero_point.astype(np.int32) + # if zero offset is already applied in biases by constant quantizer this does nothing biases = prepared_in_tensors[2] acc_q = qrec.cache.get('acc_q') or qrec.in_qs[2] @@ -99,7 +97,6 @@ def execute(cls, params, out_h = ((in_h - dillated_filter_h + pad_h)) // params.stride.h + 1 if params.has_bias: - # biases = qrec.prepare_biases(params, params.biases, params.weights, ktype="symmetric") if acc_q != qrec.in_qs[2]: biases = acc_q.expand_from(biases, qrec.in_qs[2]) result = np.broadcast_to(biases.reshape( diff --git a/tools/nntool/execution/kernels/quant/linear.py b/tools/nntool/execution/kernels/quant/linear.py index 318e6e71e..f8a7a4ff4 100644 --- a/tools/nntool/execution/kernels/quant/linear.py +++ b/tools/nntool/execution/kernels/quant/linear.py @@ -18,8 +18,7 @@ import numpy as np from graph.types.linear import FcParameters from execution.kernels.kernel_base import KernelBase, params_type, qrec_type -from quantization.multiplicative.mulbias import (apply_multiplicative_bias, - apply_zero_offset_bias) +from quantization.multiplicative.mulbias import apply_multiplicative_bias from quantization.new_qrec import QRec LOG = logging.getLogger("nntool." + __name__) @@ -38,8 +37,6 @@ def execute(cls, params, in_dims, out_dims = params.in_dims[0], params.out_dims[0] prepared_in_tensors = qrec.prepare_inputs( params, in_tensors, ktype="symmetric") - prepared_in_tensors = apply_zero_offset_bias( - qrec, params, prepared_in_tensors, ktype="symmetric") in_tensor = prepared_in_tensors[0] # expand the weights to apply the zero offset weights = prepared_in_tensors[1].astype(np.int32) - qrec.in_qs[1].zero_point.astype(np.int32) diff --git a/tools/nntool/execution/kernels/quant/matrix_operations.py b/tools/nntool/execution/kernels/quant/matrix_operations.py index ba4c84ed6..162b7e477 100644 --- a/tools/nntool/execution/kernels/quant/matrix_operations.py +++ b/tools/nntool/execution/kernels/quant/matrix_operations.py @@ -164,8 +164,7 @@ def execute(cls, params, in_tensors, qrec: QRec, **kwargs): - in_tensors = [in_tensor.astype(np.int32) for in_tensor in qrec.prepare_inputs( - params, in_tensors, ktype="symmetric")] + in_tensors = qrec.prepare_inputs(params, in_tensors, ktype="symmetric") details = kwargs.get('details') if details is not None: results = {} diff --git a/tools/nntool/execution/kernels/quant/tensor_functions.py b/tools/nntool/execution/kernels/quant/tensor_functions.py index 39a050c9a..9487d3b9e 100644 --- a/tools/nntool/execution/kernels/quant/tensor_functions.py +++ b/tools/nntool/execution/kernels/quant/tensor_functions.py @@ -44,7 +44,9 @@ def execute(cls, params, else: in_tensor = resize(in_tensor, params.dims.shape) # output_tensors = qrec.get_outputs(params, [in_tensor], ktype="symmetric") - return [qrec.out_qs[0].quantize(in_tensor)] + if in_tensor.dtype != qrec.out_qs[0].dtype: + in_tensor = qrec.out_qs[0].quantize(in_tensor) + return [in_tensor] @params_type(OutputParameters) diff --git a/tools/nntool/expressions/symbolic/assignments.py b/tools/nntool/expressions/symbolic/assignments.py index 3cadfaf6f..ba376a030 100644 --- a/tools/nntool/expressions/symbolic/assignments.py +++ b/tools/nntool/expressions/symbolic/assignments.py @@ -1,4 +1,4 @@ -# Copyright (C) 2021 GreenWaves Technologies, SAS +# Copyright (C) 2022 GreenWaves Technologies, SAS # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as @@ -13,265 +13,251 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . +from collections.abc import Sequence as ABCSequence +from copy import deepcopy -from functools import reduce -from typing import Mapping - -import numpy as np +from expressions.symbolic.quantization_base import QuantizationHandlerBase from generation.code_block import CodeBlock - -from .iteration_space import IterationSpace -from .symbol import Constant, Symbol, Variable, copy_props -from .variable_container import VariableContainerAndAssigner - - -@copy_props('var') -class Assignment(VariableContainerAndAssigner, Symbol): - def __init__(self, arg, name="", var=None, **kwargs): - if var is None: - self._var = Variable(name, shape=arg.shape, symbol_binding=arg) - else: - name = var.name - self._var = var - super(Assignment, self).__init__(arg, name=name, **kwargs) +from utils.disjoint_reduction import disjoint_reduction + +from .symbol import Symbol, Variable + + +class Assignments(ABCSequence): + def __init__(self, assignments=None, returns=None, qrecs=None) -> None: + super().__init__() + self._assignments = [] + self._returns = set(returns if returns is not None else []) + self._outputs = None + self._inputs = None + self._inters = None + self._vars = [] + self._qrecs = qrecs + if assignments: + for assignment in assignments: + self.add(*assignment) + self._update() @property - def unbound_variables(self): - return self.contents[0].unbound_variables + def max_shape(self): + return tuple(max(elems) for elems in zip(*Symbol.extend_shapes(*[ass[1].shape for ass in self._assignments]))) @property - def var(self): - return self._var - - def find(self, name): - for elem in [self._var, self.contents[0]]: - res = elem.find(name) - if res: - return res - return None - - @property - def var_shapes(self): - shapes = {self.name: self.contents[0].shape} - shapes.update(zip(self.contents[0].unbound_variables, self.contents[0].unbound_shapes)) - return shapes - - def _resolve(self, **kwargs): - """Given a set of substitions for variable in kwargs resolve all variables""" - return self._contents[0].resolve(**kwargs) - - def _resolve_assignment(self, substitute_all=False, **kwargs) -> Mapping[str, Symbol]: - return {self.name: self._contents[0].resolve(**kwargs)} - - def _calculate(self, calculate_ranges=False, **kwargs): - res = self._contents[0].resolve(**kwargs) - if not isinstance(res, Constant): - raise ValueError( - f"unable to calculate {self.name}") - if calculate_ranges: - self.control.add_stat(self, res.value) - return res.value - - def _calculate_assignment(self, **kwargs) -> Mapping[str, np.ndarray]: - return {self.name: self._calculate(**kwargs)} - - def c_block(self, code_block: CodeBlock = None, iteration_space: IterationSpace = None): - if code_block is None: - code_block = CodeBlock() - if iteration_space: - if self.var.name in iteration_space.temporary_variables: - code_block.write( - f"{self.var.c_expr(declare=True, dtype=self.contents[0].dtype)}" - f" = {self.contents[0].c_expr(iteration_space=iteration_space)};") - else: - code_block.write( - f"{self.var.c_expr(dtype=self.contents[0].dtype)}{iteration_space.c_index(self.var.name)}" - f" = {self.contents[0].c_expr(iteration_space=iteration_space)};") - else: - code_block.write(f'{self.var.name} = {self.contents[0].c_expr()};') - return code_block + def unbound_shapes(self): + return tuple(self._vars[name].shape for name in self.unbound_variables) @property - def returned_variables(self): - return [self.name] + def input_names(self): + return self._inputs @property - def shape(self): - return self._contents[0].shape - - def _py_expr(self, *args, **kwargs): - return self._contents[0].py_expr(*args, **kwargs) - - def _c_expr(self, *args, **kwargs): - return self._contents[0].c_expr(*args, **kwargs) - - def __repr__(self) -> str: - return f"{{{self.var.name} <- {self.contents[0].__repr__()}}}" - - -@copy_props('preconditions', 'returned_variables') -class Let(VariableContainerAndAssigner, Symbol): - def __init__(self, *args, preconditions=None, returned_variables=None, name="", **kwargs): - args = [Assignment(arg[1], name=arg[0]) if isinstance( - arg, tuple) else arg for arg in args] - super(Let, self).__init__(*args, name=name, **kwargs) - if preconditions is None: - preconditions = [] - else: - preconditions = [Assignment(arg[1], name=arg[0]) if isinstance( - arg, tuple) else arg for arg in preconditions] - self._preconditions = preconditions - self._returned_variables = returned_variables - -# pylint: disable=invalid-name - def In(self, *expressions): - return Let(*expressions, preconditions=[self]) - - def Return(self, *variable_names): - produced = self.produced_variables - if not all(variable in produced for variable in variable_names): - raise ValueError('not all variables are produced') - return Let(*self.contents, preconditions=self.preconditions, name=self.name, returned_variables=variable_names) + def output_names(self): + return self._outputs @property def unbound_variables(self): - resolution = self.resolve_assignment() - _vars = reduce(lambda s, x: s | set( - x.unbound_variables.values()), resolution.values(), set()) - return {var.name: var for var in _vars if var.name not in set(resolution.keys())} + return self._inputs @property - def produced_variables(self): - resolution = self.resolve_assignment() - return set(resolution.keys()) + def intermediate_names(self): + return self._inters @property - def preconditions(self): - return self._preconditions + def variables(self): + return self._vars @property - def returned_variables(self): - return self._returned_variables - - @staticmethod - def substitute_variables(assignments): - res = {} - substitutions = {} - for var_name, val in assignments.items(): - if isinstance(val, (Constant, np.ndarray, int, float)): - substitutions[var_name] = val - else: - substitutions[var_name] = Variable(var_name, shape=val.shape) - res[var_name] = val - return res, substitutions - - def find(self, name): - for elem in list(self._preconditions) + list(self.contents): - res = elem.find(name) - if res: - return res - return None - - def _resolve_assignment(self, substitute_all=False, **kwargs) -> Mapping[str, Symbol]: - """Given a set of substitions for variable in kwargs resolve all variables - return a dictionary of variables""" - preconditions = self._resolve_contents( - contents=self._preconditions, substitute_all=substitute_all, **kwargs) - return self._resolve_contents(contents=self.contents, substitute_all=substitute_all, **preconditions) - - def _calculate_assignment(self, **kwargs) -> Mapping[str, np.ndarray]: - preconditions = self._calculate_contents( - contents=self._preconditions, **kwargs) - res = self._calculate_contents(contents=self.contents, **preconditions) - if self.returned_variables: - res = {vname: val for vname, val in res.items( - ) if vname in self.returned_variables} - return res - - @staticmethod - def _resolve_contents(contents=None, substitute_all=False, **kwargs): - if substitute_all: - substitutions = kwargs - res = kwargs - else: - res, substitutions = Let.substitute_variables(kwargs) - for elem in contents: - elem_res = elem.resolve_assignment( - substitute_all=substitute_all, **substitutions) - if substitute_all: - substitutions.update(elem_res) - res.update(elem_res) - else: - elem_res, elem_substitutions = Let.substitute_variables( - elem_res) - res.update(elem_res) - substitutions.update(elem_substitutions) - return res - - @staticmethod - def _calculate_contents(contents=None, **kwargs): - for elem in contents: - kwargs.update(elem.calculate_assignment(**kwargs)) - return kwargs - - def _resolve(self, **kwargs): - """Given a set of substitions for variable in kwargs resolve all variables - return a single symbol""" - preconditions = self._resolve_contents( - contents=self._preconditions, substitute_all=True, **kwargs) - resolution = self._resolve_contents( - contents=self.contents, substitute_all=True, **preconditions) - return Assignment(resolution[self.contents[-1].name], name=self.contents[-1].name) - - def _calculate(self, calculate_ranges=False, **kwargs): - res = self._resolve(**kwargs) - if not isinstance(res.contents[0], Constant): - raise ValueError( - f"unable to calculate {self.name}") - if calculate_ranges: - self.control.add_stat(self, res.value) - return res.contents[0].value + def axes(self): + var_shapes = Symbol.extend_shapes(*self.unbound_shapes, max_length=len(self.max_shape)) + axes = disjoint_reduction(set(frozenset(idx for idx, dim in enumerate( + shape) if dim != 1) for shape in var_shapes)) + return tuple(sorted([tuple(x) for x in axes])) @property def var_shapes(self): - shapes = {} - for var_name, elem in self.resolve_assignment().items(): - shapes[var_name] = elem.shape - shapes.update(dict(zip(elem.unbound_variables, elem.unbound_shapes))) - return shapes + return {var.name: var.shape for var in self._vars.values()} @property - def shape(self): - return self._contents[-1].shape + def ops(self): + # TODO: Implement + return 1 - def _py_expr(self, *args, **kwargs): - return self._contents[0].py_expr(*args, **kwargs) + @property + def qrecs(self): + return self._qrecs - def c_block(self, code_block: CodeBlock = None, iteration_space: IterationSpace = None, with_loops=False): + @property + def c_header_set(self): + return set().union(*[assignment[1].c_header_set + for assignment in self._assignments]) + + def variable(self, name): + return self._vars[name] + + def _add_int(self, var, func): + for uname, uvar in func.unbound_variables.items(): + if uname in self._vars: + uvar.shape = self._vars[uname].shape + uvar.qrec = self._vars[uname].qrec + if isinstance(var, str): + if var in self._vars: + var = self._vars[var] + else: + var = Variable(var, shape=func.shape, dtype=func.dtype) + self._assignments.append((var, func)) + + def add(self, var, func): + self._add_int(var, func) + self._update() + + def _update(self): + self._vars = {} + free_var_names = set() + for var, func in self._assignments: + self._vars[var.name] = var + for name, uvar in func.unbound_variables.items(): + self._vars[name] = uvar + free_var_names.add(name) + + # these are all the produced variables + prod_var_names = set( + [assignment[0].name for assignment in self._assignments]) + # sort all the variable names to keep a determined order + # the outputs are things produced that are not consumed + self._outputs = sorted( + list((prod_var_names - free_var_names) | self._returns)) + # the inputs are variables that are not produced + self._inputs = sorted(list(free_var_names - prod_var_names)) + # the intermediates are the produced variables that are not in the outputs + self._inters = sorted(list(prod_var_names - set(self._outputs))) + + def c_block(self, code_block: CodeBlock = None, iteration_space: 'IterationSpace' = None, + with_loops=False, with_comment=True, with_fixed=False, tags=None): if code_block is None: code_block = CodeBlock() + # create loops from iteration space if with_loops: assert iteration_space, "must have space" - for idx, _ in enumerate(iteration_space.axis_shape): - if idx in iteration_space.fixed_spaces: + if with_comment: + # write some comments describing the iteration space + code_block.comment( + f"Max shape: {iteration_space.shape} var shapes:") + writer = code_block.start_long_comment() + for shape_comment in [f'{name}: {shape}' + for name, shape in iteration_space.var_shapes.items()]: + writer.write(shape_comment) + writer.end() + code_block.comment( + f'Iteration reduced to spaces {iteration_space.spaces}') + code_block.comment( + f'Fixed spaces {iteration_space.fixed_spaces}') + code_block.comment( + f'Parameteric spaces {iteration_space.parametric_spaces}') + code_block.comment( + f'Paralelized space {iteration_space.paralellized_space}') + code_block.comment( + f'Interior spaces {iteration_space.interior_spaces}') + # write the loops + for space in iteration_space.spaces: + if not with_fixed and space in iteration_space.fixed_spaces: continue - code_block.write(f"{iteration_space.c_for(idx)} {{") + code_block.write(f"{iteration_space.c_for(space, with_fixed=with_fixed)} {{") code_block.indent() - for precondition in self.preconditions: - precondition.c_block(code_block=code_block, - iteration_space=iteration_space) - for item in self.contents: - item.c_block(code_block=code_block, - iteration_space=iteration_space) + # write each assignment + for var, func in self._assignments: + this_tags = {} if tags is None else tags.copy() + + # write comment with quantization if present + if with_comment: + uvars = [f'{uvar.name}: {uvar.qrec}' + for uvar in func.unbound_variables.values() + if uvar.qrec] + if uvars: + writer = code_block.start_long_comment() + writer.write('inputs') + for uvar in uvars: + writer.write(uvar) + writer.end() + code_block.comment(f'{var.name} = {repr(func)}') + # if iteration space is present pick up if this is a temporary or an output + # assignment from that + if iteration_space: + if var.name in iteration_space.temporary_names: + this_tags[func] = (var, True) + else: + this_tags[func] = (var, False) + else: + this_tags[func] = (var, var.name in self.intermediate_names) + + # The iteration space will be passed down the symbol structure + func.tag = True + func.c_block(code_block=code_block, + tags=this_tags, + iteration_space=iteration_space, + with_comment=with_comment) + func.tag = False + if with_loops: - for idx, _ in enumerate(iteration_space.axis_shape): - if idx in iteration_space.fixed_spaces: + for space in iteration_space.spaces: + if not with_fixed and space in iteration_space.fixed_spaces: continue code_block.deindent() code_block.write("}") return code_block - def _c_expr(self, *args, **kwargs): - return self._contents[0].c_expr(*args, **kwargs) + def quantize(self, quantizer: QuantizationHandlerBase, symbol_control, quantize_inputs=False, qtypes=None): + funcs = [] + out_qrecs = {} + in_qrecs = {} + for var, func in self._assignments: + qfunc, qrec = quantizer.quantize( + func, + symbol_control, + quantize_inputs=quantize_inputs, + prequantized_variables=out_qrecs, + qtypes=qtypes) + qfunc = qfunc.resolve() + in_qrecs.update(qfunc.variable_quantization) + if var.name in self._outputs: + qfunc, qrec = quantizer.quantize_output( + func, + qfunc, + var, + symbol_control, + qrec, + quantize_inputs=quantize_inputs, + prequantized_variables=out_qrecs, + qtypes=qtypes) + qfunc = qfunc.resolve() + var = deepcopy(var) + var.qrec = qrec + funcs.append((var, qfunc(substitute=True))) + out_qrecs[var.name] = qrec + in_qrecs.update(out_qrecs) + return Assignments(funcs, returns=self._returns, qrecs=in_qrecs) + + def __getitem__(self, idx): + return self._assignments[idx] + + def __len__(self) -> int: + return len(self._assignments) + + def __iter__(self): + return iter(self._assignments) + + def __call__(self, quantize_inputs=False, dequantize_outputs=False, **subs): + subs = dict(subs) + if quantize_inputs: + subs = {name: self.qrecs[name].quantize_and_clip(val) if name in self.qrecs else val + for name, val in subs.items()} + for var, func in self._assignments: + subs[var.name] = func( + dequantize_outputs=dequantize_outputs, **subs) + res = dict(filter(lambda elem: elem[0] in self._outputs, subs.items())) + if dequantize_outputs: + if self.qrecs is None: + raise ValueError('assignments are not quantized') + res = {name: self.qrecs[name].dequantize( + val) for name, val in res.items()} + return res - def __repr__(self) -> str: - return (f"Let({','.join([elem.__repr__() for elem in self.preconditions])})" - f".In({','.join([elem.__repr__() for elem in self.contents])})") diff --git a/tools/nntool/expressions/symbolic/basic.py b/tools/nntool/expressions/symbolic/basic.py index cdb9f9c2e..862dbb065 100644 --- a/tools/nntool/expressions/symbolic/basic.py +++ b/tools/nntool/expressions/symbolic/basic.py @@ -14,6 +14,7 @@ # along with this program. If not, see . import logging +import math import numpy as np from bfloat16 import bfloat16 @@ -21,8 +22,8 @@ from scipy.special import expit from .function import Function -from .symbol import (Constant, Rational, c_headers, copy_props, environment, - handles, handlesr, nargs) +from .symbol import (Constant, QRecBase, Rational, Symbol, Variable, c_headers, + copy_props, environment, handles, handlesr, nargs) LOG = logging.getLogger('nntool.'+__name__) @@ -33,7 +34,8 @@ class Add(Function): def _impl(self, *args, **kwargs): - return np.add(args[0], args[1], dtype=self.dtype) + res = np.add(args[0], args[1], dtype=self.dtype) + return res def _py_expr(self, *args, **kwargs): return "np.add(%s, %s)" % (args[0], args[1]) @@ -460,6 +462,8 @@ def __init__(self, *args, **kwargs): self._inner_function = self._eval(*args, **kwargs) # self._inner_function.name = self.name self._inner_function.qrec = self.qrec + self._inner_function.tag = self.tag + self._inner_function.comment = self.comment def _collect_globals(self) -> dict: global_dict = self.ENVIRONMENT or {} @@ -478,6 +482,9 @@ def _resolve(self, **kwargs): func = self._inner_function.resolve(**kwargs) # func.name = self.name func.qrec = self.qrec + if isinstance(func, Function): + func.tag = self.tag + func.comment = self.comment return func def _eval(self, *args, **kwargs): @@ -500,6 +507,14 @@ def _py_expr(self, *args, **kwargs): def _c_expr(self, *args, **kwargs): return self._inner_function.c_expr(*args, **kwargs) + def c_block(self, code_block=None, tags=None, **kwargs): + if tags is not None and self._inner_function not in tags: + name = tags.get(self, f'{self.SYMBOL_PREFEX}{self.name}') + if isinstance(name, str): + name = (Variable(name, dtype=self.dtype), True) + tags[self._inner_function] = name + return self._inner_function.c_block(code_block=code_block, tags=tags, **kwargs) + @nargs(1) class HTanh(CompoundFunction): @@ -544,32 +559,122 @@ def _eval(self, *args, **kwargs): return args[0] +@nargs(3) +class ClipFloat(CompoundFunction): + + def _eval(self, *args, **kwargs): + return Min(Max(args[0], args[1], dtype=self.dtype), args[2], dtype=self.dtype) + + @nargs(1) @copy_props('_from_qrec', '_to_qrec') -class ConvertFloatScaled(CompoundFunction): - def __init__(self, *args, from_qrec=None, to_qrec=None, **kwargs): +class ConvertQuantization(CompoundFunction): + def __init__(self, *args, from_qrec: QRecBase=None, to_qrec: QRecBase=None, **kwargs): self._from_qrec = from_qrec self._to_qrec = to_qrec super().__init__(*args, **kwargs) @property - def from_qrec(self): + def from_qrec(self) -> QRecBase: return self._from_qrec @property - def to_qrec(self): - return self._to_qrec + def from_is_float(self) -> bool: + return self._from_qrec.dtype in [np.float16, np.float32, bfloat16] - def _eval_float_to_quant(self, *args, **kwargs): - raise NotImplementedError() + @property + def from_is_fix(self) -> bool: + return self._from_qrec.dtype in [np.int8, np.uint8, np.int16, np.uint16, np.int32] - def _eval_quant_to_float(self, *args, **kwargs): - raise NotImplementedError() + @property + def to_is_float(self) -> bool: + return self._to_qrec.dtype in [np.float16, np.float32, bfloat16] - def _eval(self, *args, **kwargs): - if self._from_qrec.dtype == np.int16 or self._from_qrec.dtype == bfloat16: - return self._eval_float_to_quant(*args, **kwargs) - return self._eval_quant_to_float(*args, **kwargs) + @property + def to_is_fix(self) -> bool: + return self._to_qrec.dtype in [np.int8, np.uint8, np.int16, np.uint16, np.int32] + + @property + def to_qrec(self) -> QRecBase: + return self._to_qrec + + def _eval_float_to_fix(self, *args, **kwargs) -> Symbol: + to_qrec = self.to_qrec + from_qrec = self.from_qrec + scaled_val = Mul( + args[0], + Constant( + [math.pow(2, to_qrec.q)/to_qrec.scale], + dtype=from_qrec.dtype), + dtype=from_qrec.dtype) + if to_qrec.zero_point != 0: + # need to add zero_point plus rounding + scaled_val = Add( + scaled_val, + Constant([to_qrec.zero_point + 0.5], dtype=from_qrec.dtype), + dtype=from_qrec.dtype) + else: + # Just add rounding + scaled_val = Add( + scaled_val, + Constant([0.5], dtype=from_qrec.dtype), + dtype=from_qrec.dtype) + iinfo = np.iinfo(to_qrec.dtype) + return Cast( + ClipFloat( + scaled_val, + Constant(iinfo.min, dtype=from_qrec.dtype), + Constant(iinfo.max, dtype=from_qrec.dtype), + dtype=from_qrec.dtype), + dtype=to_qrec.dtype, + tag=self.tag, + comment=self.comment) + + def _eval_fix_to_float(self, *args, **kwargs) -> Symbol: + to_qrec = self.to_qrec + from_qrec = self.from_qrec + float_val = Cast(args[0], dtype=to_qrec.dtype) + if from_qrec.zero_point != 0: + float_val = Sub( + float_val, + Constant([from_qrec.zero_point], dtype=to_qrec.dtype), + dtype=to_qrec.dtype) + float_val = Mul( + float_val, + Constant( + [from_qrec.scale/math.pow(2, from_qrec.q)], + dtype=to_qrec.dtype), + dtype=to_qrec.dtype, + tag=self.tag, + comment=self.comment) + return float_val + + def _eval(self, *args, **kwargs) -> Symbol: + if self.from_is_float: + if self.to_is_fix: + return self._eval_float_to_fix(*args, **kwargs) + elif self.to_is_float: + if self.to_qrec.dtype != self.from_qrec.dtype: + return Cast( + *args, + dtype=self.to_qrec.dtype, + **kwargs) + return args[0] + elif self.from_is_fix: + if self.to_is_float: + return self._eval_fix_to_float(*args, **kwargs) + elif self.to_is_fix: + # if self.to_qrec.dtype == self.from_qrec.dtype: + # return args[0] + # sign_change = from_qrec.signed != to_qrec.signed + # growing = from_qrec.size < to_qrec.size + # reducing = from_qrec.size > to_qrec.size + # zeropoint_change = from_qrec.zero_point != to_qrec.zero_point + # scale_change = from_qrec.scale != to_qrec.scale + # q_change = from_qrec.q != to_qrec.q + raise NotImplementedError() + + raise ValueError('unsupported conversion') @nargs(2) diff --git a/tools/nntool/expressions/symbolic/common/__init__.py b/tools/nntool/expressions/symbolic/common/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tools/nntool/expressions/symbolic/float_quantization/float_qrec.py b/tools/nntool/expressions/symbolic/float_quantization/float_qrec.py index 5f2d4a2d7..bcb463e6f 100644 --- a/tools/nntool/expressions/symbolic/float_quantization/float_qrec.py +++ b/tools/nntool/expressions/symbolic/float_quantization/float_qrec.py @@ -26,6 +26,9 @@ def __init__(self, dtype: np.dtype, min_val=None, max_val=None) -> None: self._min_val = min_val self._max_val = max_val + def __repr__(self) -> str: + return self._dtype.__name__ + @property def min_val(self): return self._min_val diff --git a/tools/nntool/expressions/symbolic/float_quantization/float_quantization.py b/tools/nntool/expressions/symbolic/float_quantization/float_quantization.py index 00eb69f0c..fb6eae262 100644 --- a/tools/nntool/expressions/symbolic/float_quantization/float_quantization.py +++ b/tools/nntool/expressions/symbolic/float_quantization/float_quantization.py @@ -13,19 +13,17 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -import math from typing import Tuple import numpy as np -from ..basic import Cast, ConvertFloatScaled +from ..basic import Cast, ConvertQuantization from ..q15_quantization.q15_scale_q_rec import Q15ScaleQRec from ..quantization_base import (QRecBase, QuantizationHandlerBase, handles_scheme) from ..symbol import Symbol, SymbolStats from .float_qrec import FloatQRec - @handles_scheme('Float') class FloatQuantization(QuantizationHandlerBase): @@ -64,28 +62,19 @@ def _quantize_output(cls, qtypes = kwargs.get('qtypes', {}) # first see if this has already been quantized by nntool # note that the qtype will be stored against the name of the output symbol - max_val, out_dtype, out_q = cls._get_scale_dtype_from_qtypes(osym, qtypes) - if max_val is not None: - qrec_out = Q15ScaleQRec(out_dtype, max_val, out_q) - # scale clip and cast to output type - return (ConvertFloatScaled(qsym, from_qrec=qrec, to_qrec=qrec_out), qrec_out) - if not out_dtype: - out_dtype = kwargs.get('out_dtype', np.float32) - # Just cast - return (Cast(qsym, dtype=out_dtype), FloatQRec(dtype=out_dtype, min_val=qrec.min_val, max_val=qrec.max_val)) + if not qtypes or osym.name not in qtypes: + out_dtype = kwargs.get('out_dtype', np.float32) + qrec_out = FloatQRec(out_dtype) + return (Cast(qsym, dtype=out_dtype), qrec_out) - @classmethod - def _get_scale_dtype_from_qtypes(cls, sym, qtypes): - if not qtypes or sym.name not in qtypes: - return None, None, None - qtype = qtypes[sym.name] - if qtype.dtype == np.int8: - if len(qtype.scale) > 1: - return None, None, None - return qtype.scale[0] * math.pow(2, 7), np.int8, 7 - elif qtype.dtype == np.int16: + qtype = qtypes[osym.name] + if qtype.dtype in [np.int8, np.uint8, np.int16, np.uint16]: if len(qtype.scale) > 1: - return None, None, None - return qtype.scale[0] * math.pow(2, 15), np.int16, 15 - else: - return None, qtype.dtype, None + out_dtype = kwargs.get('out_dtype', np.float32) + qrec_out = FloatQRec(out_dtype) + return (Cast(qsym, dtype=out_dtype), qrec_out) + max_val, min_val, bitlen = Q15ScaleQRec.dtype_zp_to_min_max(qtype.dtype, qtype.scale[0], qtype.zero_point) + qrec_out = Q15ScaleQRec(qtype.dtype, max_val, bitlen, min_val=min_val, max_val=max_val, zero_point=qtype.zero_point) + return (ConvertQuantization(qsym, from_qrec=qrec, to_qrec=qrec_out), qrec_out) + qrec_out = FloatQRec(dtype=qtype.dtype, max_val=qtype.max_val, min_val=qtype.min_val) + return (Cast(qsym, dtype=qtype.dtype),qrec_out) diff --git a/tools/nntool/expressions/symbolic/float_quantization/handlers.py b/tools/nntool/expressions/symbolic/float_quantization/handlers.py index 298139bcc..0c5c8a5e6 100644 --- a/tools/nntool/expressions/symbolic/float_quantization/handlers.py +++ b/tools/nntool/expressions/symbolic/float_quantization/handlers.py @@ -23,7 +23,7 @@ np_fastpow2, np_fastrsqrt, np_fastsigmoid, np_fasttanh) -from ..basic import (Abs, Add, ATan, Cast, Cos, Div, Exp, HSigmoid, HTanh, Log, +from ..basic import (Abs, Add, ATan, Cast, ConvertQuantization, Cos, Div, Exp, HSigmoid, HTanh, Log, Max, Min, Mul, Pow, RSqrt, Sigmoid, Sin, Sqrt, Sub, TanH) from ..function import Function from ..quantization_base import qhandler @@ -35,7 +35,6 @@ # from utils.sigmoid_tanh_lut import sigmoid_lut_float, tanh_lut_float - @qhandler("Float", Constant, Rational) class BasicConstantQuant(FloatQuantization): @@ -58,7 +57,7 @@ def _quantize(cls, sym_ctrl: SymbolStats, qrec: FloatQRec = None, **kwargs) -> Tuple[Symbol, FloatQRec]: - + # TODO: Needs merging with Q15 version prequantized_variables = kwargs.get('prequantized_variables', {}) qtypes = kwargs.get('qtypes', {}) @@ -75,25 +74,27 @@ def _quantize(cls, qrec = cls.qrec_from_qtype(qtypes[sym.name], max_val) if qrec: sym.qrec = qrec - return (sym, qrec) + if isinstance(qrec, FloatQRec): + return (sym, qrec) + out_dtype = kwargs.get('out_dtype', np.float32) + out_qrec = FloatQRec(dtype=out_dtype, max_val=max_val, min_val=-max_val) + return ( + ConvertQuantization(sym, from_qrec=qrec, to_qrec=out_qrec, tag=sym.name), + out_qrec) out_dtype = kwargs.get('out_dtype', np.float32) return sym, FloatQRec(dtype=out_dtype, max_val=max_val, min_val=-max_val) @classmethod def qrec_from_qtype(cls, qtype, max_val): - if qtype.dtype == np.int8 or qtype.dtype == np.int16: - if qtype.dtype == np.int8: - if len(qtype.scale) > 1: - qtype.scale = np.max(qtype.scale) - q = 7 - dtype = np.int8 - elif qtype.dtype == np.int16: - if len(qtype.scale) > 1: - qtype.scale = np.max(qtype.scale) - q = 15 - dtype = np.int16 - return Q15ScaleQRec(dtype, max_val, q, max_val=max_val, min_val=-max_val) + if qtype.dtype in [np.int8, np.uint8, np.int16, np.uint16]: + if len(qtype.scale) > 1: + return None + max_val, min_val, bitlen = Q15ScaleQRec.dtype_zp_to_min_max( + qtype.dtype, qtype.scale[0], qtype.zero_point[0]) + return Q15ScaleQRec(qtype.dtype, max_val, bitlen, + max_val=max_val, min_val=min_val, + zero_point=qtype.zero_point[0]) elif qtype.dtype in [np.float32, np.float16, bfloat16]: return FloatQRec(dtype=qtype.dtype, max_val=max_val, min_val=-max_val) else: @@ -157,6 +158,7 @@ def _c_expr(self, *args, **kwargs): # TODO - Need numpy equivalents of sin and cos # TODO - All of these should return correct function based on output type (i.e. bfloat16/ieee16 version) + @nargs(1) @environment({ 'npcos': np.cos, diff --git a/tools/nntool/expressions/symbolic/function.py b/tools/nntool/expressions/symbolic/function.py index e09fabecb..b44404655 100644 --- a/tools/nntool/expressions/symbolic/function.py +++ b/tools/nntool/expressions/symbolic/function.py @@ -16,6 +16,8 @@ import numpy as np +from generation.code_block import CodeBlock + from .symbol import Constant, Symbol, Variable, environment from .variable_container import VariableContainer @@ -81,16 +83,17 @@ def _resolve(self, **kwargs): for elem in self._contents] return self._eval(*contents, **kwargs) - def _calculate(self, calculate_ranges=False, track_results=None, **kwargs): + def _calculate(self, calculate_ranges=False, track_results=None, dequantize_outputs=False, **kwargs): contents = [elem.calculate(calculate_ranges=calculate_ranges, track_results=track_results, + dequantize_outputs=dequantize_outputs, **kwargs) for elem in self._contents] res = self._eval(*contents, **kwargs) if calculate_ranges: self.control.add_stat(self, res.value) if track_results is not None: - if self.qrec is not None: + if self.qrec is not None and dequantize_outputs: track_results[self.name] = self.qrec.dequantize( res.value.copy()) else: @@ -136,6 +139,38 @@ def py_compiled_lambda(self): def c_expr(self, *args, **kwargs) -> str: return self._c_expr(*(arg.c_expr(*args, **kwargs) for arg in self._contents)) + def c_block(self, code_block=None, tags=None, with_comment=False, **kwargs): + if code_block is None: + code_block = CodeBlock() + if tags is not None: + args = [] + for arg in self._contents: + arg.c_block(code_block=code_block, tags=tags, + with_comment=with_comment, **kwargs) + if arg.tag: + if arg in tags: + args.append(tags[arg]) + else: + name = tags.get(arg, f'{self.SYMBOL_PREFEX}{arg.name}') + if isinstance(name, tuple): + name = name[0].c_expr() + args.append(name) + else: + args.append(code_block.lines.pop(-1).strip()) + if self.tag: + if self.comment and with_comment: + code_block.write(f'// {self.comment}') + name = tags.get(self, f'{self.ctype} {self.SYMBOL_PREFEX}{self.name}') + if isinstance(name, tuple): + name = name[0].c_expr( + dtype=name[0].dtype, declare=name[1], **kwargs) + code_block.write(f'{name} = {self._c_expr(*args)};') + else: + code_block.write(f'{self._c_expr(*args)}') + else: + code_block.write(self.c_expr(*args, **kwargs)) + return code_block + @property def py_lambda(self) -> str: return "lambda %s: %s" % (",".join("%s=None" % (var) for var in self.unbound_variables), self.py_expr()) diff --git a/tools/nntool/expressions/symbolic/function_collection.py b/tools/nntool/expressions/symbolic/function_collection.py index ff6717ebd..880c3f5b8 100644 --- a/tools/nntool/expressions/symbolic/function_collection.py +++ b/tools/nntool/expressions/symbolic/function_collection.py @@ -31,7 +31,7 @@ class FunctionCollection(): def __init__(self, functions: Sequence[Tuple[Variable, Symbol]], qrecs=None) -> None: self._qrecs = qrecs # save map from produced variable to function - self._functions = {k: v for k, v in functions} + self._functions = {k: v for k, v in functions} # now create a map with producted variable name to free variables in function self._freevars = {var.name: set([name for name in func.unbound_variables.keys()]) for var, func in self._functions.items()} @@ -51,16 +51,18 @@ def __init__(self, functions: Sequence[Tuple[Variable, Symbol]], qrecs=None) -> for name, symbol in func.unbound_variables.items(): if name in self._vars: if self._vars[name] != symbol: - raise ValueError('%s points to more than one variable' % name) + raise ValueError( + '%s points to more than one variable' % name) else: self._vars[name] = symbol if res_symbol.name in self._vars: if self._vars[res_symbol.name] != res_symbol: - raise ValueError('%s points to more than one variable' % res_symbol.name) + raise ValueError( + '%s points to more than one variable' % res_symbol.name) else: self._vars[res_symbol.name] = res_symbol self.init_indexes() - + def init_indexes(self): # iterators contains list of iterators self._iterators = None @@ -168,7 +170,8 @@ def _create_indexes(self): key=lambda x: next(i for i in x)) idx_names = ["_".join(["d%s" % idx for idx in sorted(list(idxes))]) for idxes in unique_indexes] - idx_dims = [reduce(lambda x, y: x*max_shape[y], idxes, 1) for idxes in unique_indexes] + idx_dims = [reduce(lambda x, y: x*max_shape[y], idxes, 1) + for idxes in unique_indexes] self._iterators = [Variable(idx_name, shape=tuple([idx_dim]), dtype=np.int32) for idx_name, idx_dim in zip(idx_names, idx_dims)] if not self._iterators: @@ -202,7 +205,8 @@ def get_iterator_vars(self): if depth == 0: iters.extend([('First', 0), ('Last', var.shape[0])]) else: - iters.append((self.iterators[depth].name.upper(), var.shape[0])) + iters.append( + (self.iterators[depth].name.upper(), var.shape[0])) return iters def create_kernel(self, parallel_iterator, fixed_iterators, code_block=None): @@ -255,13 +259,23 @@ def create_kernel(self, parallel_iterator, fixed_iterators, code_block=None): assert produced_idx >= len(execution_order) return code_block - def produce_functions(self, produced_idx, execution_order, index_dependencies, depth, code_block): + def produce_functions(self, produced_idx, execution_order, index_dependencies, depth, code_block, tags=None): while (produced_idx < len(execution_order) and index_dependencies[execution_order[produced_idx].name] == depth): + this_tags = {} if tags is None else tags.copy() var = execution_order[produced_idx] declare = var.name in self.intermediate_names - code_block.write("{} = {};", var.c_expr(declare=declare, dtype=var.dtype), - self._functions[var].c_expr()) + # write comment with quantization if present + uvars = [f'{uvar.name}: {uvar.qrec}' + for uvar in self._functions[var].unbound_variables.values() + if uvar.qrec] + if uvars: + uvars = " ".join(uvars) + code_block.write(f'// inputs {uvars}') + this_tags[self._functions[var]] = (var, declare) + self._functions[var].tag = True + self._functions[var].c_block(code_block=code_block, tags=this_tags) + self._functions[var].tag = False produced_idx += 1 return produced_idx diff --git a/tools/nntool/expressions/symbolic/iteration_space.py b/tools/nntool/expressions/symbolic/iteration_space.py index fe07dea7b..c2f8327ee 100644 --- a/tools/nntool/expressions/symbolic/iteration_space.py +++ b/tools/nntool/expressions/symbolic/iteration_space.py @@ -1,4 +1,4 @@ -# Copyright (C) 2021 GreenWaves Technologies, SAS +# Copyright (C) 2022 GreenWaves Technologies, SAS # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as @@ -13,31 +13,69 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . + from functools import partial, reduce from itertools import groupby from operator import itemgetter from typing import List, Sequence import numpy as np -from quantization.qtype import DTYPE_GAP_CTYPE +from bfloat16 import bfloat16 +from generation.code_block import CodeBlock +from quantization.qtype import DTYPE_GAP_CTYPE, DTYPES +from .assignments import Assignments from .symbol import Symbol -from .variable_container import VariableContainerAndAssigner def split_list(sequence: Sequence): return [list(map(itemgetter(1), g)) for k, g in groupby(enumerate(sequence), lambda x: x[0]-x[1])] +def tabulate(lines): + """Takes a list of lists of strings and lines up lengths to improve formating""" + # get max length of each segment + max_len = tuple(max(elems) for elems + in zip(*[tuple(len(line_elem) for line_elem in line) + for line in lines])) + # add spaces to each line segment + + def reduction(s, x): + s.append( + f'{"".join(elem + " " * (max_len[idx] - len(elem)) for idx, elem in enumerate(x[:-1]))}{x[-1]}') + return s + return reduce(reduction, lines, []) + + +AT_ARG_DATATYPES = { + np.uint8: ('CNN_ArgDataTypeUns', 1, False, False), + np.uint16: ('CNN_ArgDataTypeUns', 2, False, False), + np.uint32: ('CNN_ArgDataTypeUns', 4, False, False), + np.uint64: ('CNN_ArgDataTypeUns', 8, False, False), + np.int8: ('CNN_ArgDataType', 1, True, False), + np.int16: ('CNN_ArgDataType', 2, True, False), + np.int32: ('CNN_ArgDataType', 4, True, False), + np.int64: ('CNN_ArgDataType', 8, True, False), + np.float16: ('CNN_ArgDataTypeF', 2, True, True), + bfloat16: ('CNN_ArgDataTypeF', 2, True, True), + np.float32: ('CNN_ArgDataTypeF', 4, True, True), +} + class IterationSpace(): - def __init__(self, assigner: VariableContainerAndAssigner, min_interior_space=1000) -> None: - self._assigner = assigner + def __init__(self, assignments: Assignments, constants=None, min_interior_space=1000, max_interior_space=10000, num_parameteric_spaces=2) -> None: + self._assignments = assignments self._var_shapes = None self._var_axes = None + self._var_is_constant = {} self._spaces = None + self._var_axes_idx = None self._min_interior_space = min_interior_space + self._max_interior_space = max_interior_space self._num_workers = 8 self._var_strides = {} + self._num_parameteric_spaces = num_parameteric_spaces + if constants: + self.vars_are_constant(*constants) @staticmethod def _var_name(idx): @@ -68,10 +106,27 @@ def set_var_stride(self, vname, stride): self._var_axes = None self._spaces = None self._var_strides[vname] = stride + self._var_axes_idx = None + + def is_var_constant(self, var_name): + return self._var_is_constant.get(var_name, False) + + def vars_are_constant(self, *var_names): + for var_name in var_names: + self._var_is_constant[var_name] = True + return self + + @property + def assignments(self): + return self._assignments + + @property + def real_shape(self): + return tuple(dim for dim in self.shape if dim != 1) @property def shape(self): - return max(zip(*Symbol.extend_shapes(*self._assigner.unbound_shapes))) + return self.assignments.max_shape @property def full_rank(self): @@ -96,16 +151,16 @@ def extended_strides(self): return tuple(reduce(lambda state, x: state + [frozenset(set.union(*x))], zip(*tuple(vstrides.values())), [])) @property - def produced_variables(self): - return set(self._assigner.returned_variables) + def output_names(self): + return self._assignments.output_names @property - def consumed_variables(self): - return set(self._assigner.unbound_variables) + def input_names(self): + return self._assignments.input_names @property - def temporary_variables(self): - return set(self.variables) - self.produced_variables - self.consumed_variables + def temporary_names(self): + return self._assignments.intermediate_names def space_for_axis(self, axis): return next((axes for axes in self.spaces if axis in axes), None) @@ -123,18 +178,35 @@ def var_axes(self): for vname, shape in self.var_shapes.items()} return self._var_axes + @property + def var_axes_idx(self): + """Map of variable name to index of iteration space used + + Returns: + dict: Map of variable name to index of iteration space used + """ + if self._var_axes_idx is None: + self._var_axes_idx = {vname: tuple(self.spaces.index(dim) for dim in axes) + for vname, axes in self.var_axes.items()} + return self._var_axes_idx + @property def variables(self): """Set of variable names """ return set(self.var_shapes) + @property + def spaces_size(self): + return tuple(int(np.prod([self.shape[idx] for idx in space])) for space in self.spaces) + @property def spaces(self): """Set of disjoint iteration spaces that have the same set of strides """ if self._spaces is None: - spaces = self._assigner.axes + max_shape = self.assignments.max_shape + spaces = self._assignments.axes # here we modify grouped spaces so that continuous spaces have the same stride if self._var_strides: final_spaces = list(spaces) @@ -148,12 +220,14 @@ def spaces(self): def reduction(var_stride, state: List, space): space_strides = {} for dim in space: - space_strides.setdefault(var_stride[dim], []).append(dim) + space_strides.setdefault( + var_stride[dim], []).append(dim) for space_group in space_strides.values(): state.extend(split_list(space_group)) return state - final_spaces = reduce(partial(reduction, var_stride), final_spaces, []) + final_spaces = reduce( + partial(reduction, var_stride), final_spaces, []) self._spaces = tuple(sorted(tuple(sorted(space)) for space in final_spaces)) else: @@ -161,57 +235,89 @@ def reduction(var_stride, state: List, space): return self._spaces + @property + def expanded_spaces(self): + res = [] + last = 0 + for space in self.spaces: + res.append(tuple(range(last, min(space))) + space) + if res: + res[-1] = res[-1] + tuple(range(max(res[-1])+1, len(self.shape))) + return tuple(res) + + @property + def space_total_items(self): + return tuple(np.stack(list(self.var_shapes.values())).sum(axis=0)) + + @property + def space_total_bytes(self): + variables = [self.assignments.variables[name] for name in self.var_shapes] + sizes = [1 if var.dtype is None else AT_ARG_DATATYPES[var.dtype][1] for var in variables] + return tuple((np.stack(list(self.var_shapes.values())) * np.array(sizes).reshape((-1, 1))).sum(axis=0)) + @property def var_shapes(self): if self._var_shapes is None: - self._var_shapes = self._assigner.var_shapes.copy() + self._var_shapes = self._assignments.var_shapes.copy() self._var_shapes = dict( zip(self._var_shapes.keys(), Symbol.extend_shapes(*self._var_shapes.values()))) return self._var_shapes @property - def axis_shape(self): - return tuple(np.prod([self.shape[axis] for axis in axis_set]) for axis_set in self.spaces) + def has_scalar_parameters(self): + return any(len(shape) == 1 and shape[0] == 1 for shape in self.var_shapes.values()) + @property def iterator_names(self): return [self._var_name(idx) for idx in range(len(self.spaces))] @property - def interior_space(self): + def interior_spaces(self): """This provides the minimum tile space if it is more than one axis""" + expanded_spaces = list(self.expanded_spaces) + if len(expanded_spaces) <= 1: + return tuple() dims = [] - shape = list(self.axis_shape) + bytes = self.space_total_bytes total = 1 - while len(shape) > 1 and total < self._min_interior_space: - dims.append(len(shape) - 1) - total *= shape[-1] - shape = shape[0:-1] - return tuple(reversed(dims)) + while len(expanded_spaces) > 1 and total < self._min_interior_space: + new_size = total * np.prod([bytes[idx] for idx in expanded_spaces[-1]]) + if new_size * 8 > self._max_interior_space: + break + dims.append(len(expanded_spaces) - 1) + total = new_size + expanded_spaces = expanded_spaces[0:-1] + return tuple(self.spaces[idx] for idx in reversed(dims)) @property def interior_shape(self): - shape = list(self.axis_shape) - return tuple(shape[idx] for idx in self.interior_space) + return tuple(self.shape[self.spaces.index(space)] for space in self.interior_spaces) @property def exterior_spaces(self): - return tuple(range(len(self.axis_shape) - len(self.interior_space))) + return tuple(self.spaces[idx] for idx in range(len(self.spaces_size) - len(self.interior_spaces))) @property def exterior_space_names(self): - return tuple(self._par_name(idx) for idx in range(len(self.exterior_spaces))) + return tuple(self._par_name(self.spaces.index(space)) for space in range(len(self.exterior_spaces))) @property def exterior_shape(self): - shape = list(self.axis_shape) + shape = list(self.spaces_size) num_ext_spaces = len(self.exterior_spaces) return tuple(shape[:num_ext_spaces - 1] + [shape[num_ext_spaces - 1] * np.prod(self.interior_shape)]) @property - def parameteric_spaces(self): - return tuple(self.exterior_spaces[-2:]) + def parametric_spaces(self): + return tuple(self.exterior_spaces[-self._num_parameteric_spaces:]) + + @property + def paralellized_space(self): + if self.parametric_spaces: + return max([(space, self.real_shape[self.spaces.index(space)]) for space in self.parametric_spaces], key=lambda x: x[1])[0] + return 0 @property def interior_shape_size(self): @@ -219,7 +325,7 @@ def interior_shape_size(self): @property def fixed_spaces(self): - return tuple(self.exterior_spaces[:-2]) + return tuple(self.exterior_spaces[:-self._num_parameteric_spaces]) def preferred_divisor(self, space): if space == 0: @@ -232,19 +338,22 @@ def preferred_divisor(self, space): return 1 def c_indexed_var(self, var_name, declare=False, assignment=False): - if var_name in self.temporary_variables: + # if var_name.startswith('_SYMBOL'): + # return var_name + if var_name in self.temporary_names: if declare or assignment: - dtype = self._assigner.find(var_name).dtype + dtype = self._assignments.variable(var_name).dtype return f"{DTYPE_GAP_CTYPE[dtype]} {var_name}" return var_name if declare: - dtype = self._assigner.find(var_name).dtype + dtype = self._assignments.variable(var_name).dtype return f"{DTYPE_GAP_CTYPE[dtype]} *{var_name}" - return f'{var_name}{self.c_index(var_name)}' + c_index = self.c_index(var_name) + if c_index: + return f'{var_name}{c_index}' + return f'*{var_name}' def c_index(self, var_name): - var_spaces = [self.spaces.index(space) - for space in self.var_axes[var_name]] var_ext_shape = self.var_shapes[var_name] var_shape = [np.prod([var_ext_shape[dim] for dim in space]) for space in self.var_axes[var_name]] @@ -256,23 +365,24 @@ def c_index(self, var_name): assert all(var_stride_in_space[-1] == var_stride[dim] for dim in space[1:]) else: - var_stride_in_space = [1] * len(var_spaces) + var_stride_in_space = [1] * len(self.var_axes[var_name]) def reduction(state, x): var_space, space_dim, var_stride = x + var_space_idx = self.spaces.index(var_space) # fixed spaces are iterated by tiler code if var_space in self.fixed_spaces: return state space_size = str( - space_dim) if var_space in self.interior_space else self._var_max_name(var_space) + space_dim) if var_space == self.interior_spaces else self._var_max_name(var_space_idx) assert abs(var_stride) == 1, "non unit strides not supported yet" if var_stride < 0: if var_space == 0: - index = f'(Last-1-{self._var_name(var_space)})' + index = f'(Last-1-{self._var_name(var_space_idx)})' else: - index = f'({space_size}-1-{self._var_name(var_space)})' + index = f'({space_size}-1-{self._var_name(var_space_idx)})' else: - index = f'{self._var_name(var_space)}' + index = f'{self._var_name(var_space_idx)}' if state[0]: state[1].insert( 0, f"({index}*{'*'.join(state[0])})") @@ -280,20 +390,313 @@ def reduction(state, x): state[1].insert(0, index) state[0].insert(0, str( - space_dim) if var_space in self.interior_space else self._var_max_name(var_space)) + space_dim) if var_space == self.interior_spaces else self._var_max_name(var_space_idx)) return state - index = reduce(reduction, zip(reversed(var_spaces), + index = reduce(reduction, zip(reversed(self.var_axes[var_name]), reversed(var_shape), reversed(var_stride_in_space)), ([], []))[1] - return f"[{'+'.join(index)}]" + return f"[{'+'.join(index)}]" if index else "" + + def get_iterator_vars(self): + iters = [] + for idx, space in enumerate(self.spaces): + if space in self.interior_spaces: + continue + if space == self.paralellized_space: + iters.extend([('First', 0), ('Last', self.spaces_size[idx]), (self._var_max_name(idx), self.spaces_size[idx])]) + else: + iters.append( + (self._var_max_name(idx), self.spaces_size[idx])) + return iters - def c_for(self, space): - if space in self.fixed_spaces: + def c_for(self, space, with_fixed=False): + if not with_fixed and space == self.fixed_spaces: raise ValueError( - "space is fixed so not iterated and requires no for loop") - var_name = self._var_name(space) - if space in self.interior_space: - return f"for (int {var_name}=0; {var_name}<{self.shape[space]}; {var_name}++)" - if space == 0: + "space is fixed so not iterated inside basic kernel and requires no for loop") + space_index = self.spaces.index(space) + var_name = self._var_name(space_index) + if space in self.interior_spaces: + return f"for (int {var_name}=0; {var_name}<{self.real_shape[space_index]}; {var_name}++)" + if space == self.paralellized_space: return f"for (int {var_name}=First; {var_name}= len(self.exterior_spaces): + int_size *= self.spaces_size[space_idx] + continue + if var_stride and var_stride[var_dim_idx] < 0: + iter_space_descrs.append( + f'KER_ITER_D{space_idx}|SPACE_PROP_REVERT') + else: + iter_space_descrs.append(f'KER_ITER_D{space_idx}') + if iter_space_descrs: + argspace = f'KerArgSpace({len(iter_space_descrs)}, {", ".join(iter_space_descrs)})' + else: + argspace = 'KerArgSpace(1, KER_ITER_TILE0)' + if var_name in self.output_names: + constraints = "O_OUT|O_DB" if iter_space_descrs else "O_OUT|O_BUFF|O_NTILED" + elif self.is_var_constant(var_name): + constraints = "O_IN|O_DB|O_CONST" + else: + constraints = "O_IN|O_DB" if iter_space_descrs else "O_IN|O_BUFF|O_NTILED" + kargs.append( + (f'KerArg("{var_name}", ', + f'{argspace}, ', + f'{constraints}, ', + f'1, 1, ', + f'{self.ctype_len(var_name) * int_size}, ', + f'0, 0, 0, "{var_name}")')) + return tabulate(kargs) + + @property + def at_uk_cargs(self): + return ([f'TCArg({self.at_argdatatype(var_name, pointer=True, restrict=True)}, "{var_name}")' + for var_set in [self.input_names, self.output_names] + for var_name in sorted(var_set)]) + + @property + def at_uk_kinfos(self): + cvars = sorted(self.input_names) + pvars = sorted(self.output_names) + in_sizes = [np.prod(self.var_shapes[var_name]) + for var_name in cvars] + out_sizes = [np.prod(self.var_shapes[var_name]) + for var_name in pvars] + bandwidth = sum(in_sizes + out_sizes) + kinfos = [ + f"AddKernelInfos(Name, AT_KERINFO_OPER, {self._assignments.ops * max(in_sizes)}, 0)", + f"AddKernelInfos(Name, AT_KERINFO_BANDWIDTH, {bandwidth}, 0)" + ] + ksize_infos = [] + for var_name in cvars + pvars: + shape = reduce( + lambda s, x: s + [x] if x > 1 or s else s, self.var_shapes[var_name], []) + _, item_size, _, is_float = AT_ARG_DATATYPES[ + self._assignments.variables[var_name].dtype] + add_arg_func = "AddKernelFloatArgDim" if is_float else "AddKernelArgDim" + ksize_infos.append( + (f'{add_arg_func}(Name, "{var_name}", ', + f'{len(shape) + 1}, ', + f'{", ".join(str(dim) for dim in shape) if shape else 1}, ', + f'{item_size})')) + return kinfos + tabulate(ksize_infos) + + @property + def kernel_args(self): + return ([(self._var_max_name(self.spaces.index(space)), 'unsigned int') for space in self.exterior_spaces] + + [(var_name, self.ctype(var_name, pointer=True, restrict=True)) + for var_set in [self.input_names, self.output_names] + for var_name in sorted(var_set)]) + + @property + def at_uk_kerbindings(self): + bindings = [ + f"K_ArgPar(\"{max(self.output_names, key=lambda x: self.var_shapes[x][idx])}\", KER_ARG_PARTILE_SIZE, KER_ITER_D{idx})" + for idx in range(len(self.exterior_shape)) + ] + [ + f"K_Arg(\"{var_name}\", KER_ARG_TILE)" + for var_set in [self.input_names, self.output_names] + for var_name in sorted(var_set) + ] + return bindings + + def comment_attrs(self, code, *attrs): + code.comment("".join(f'{name}: {getattr(self, name)} ' if getattr(self, name) else '' + for name in attrs)) + + def gen_kernel_headers(self, code: CodeBlock = None): + if code is None: + code = CodeBlock() + for include in self._assignments.c_header_set: + code.write('#include {}', include) + return code + + def gen_user_kernel(self, ukname: str, kname: str, code: CodeBlock = None): + if code is None: + code = CodeBlock() + code.write(f"int {ukname}(char *Name) {{") + code.indent() + code.write("Kernel_T *Kernel = UserKernel(") + code.indent() + code.write("Name,") + # include some useful parameters as comment + self.comment_attrs(code, + 'shape', + 'spaces') + self.comment_attrs(code, + 'fixed_spaces', + 'parametric_spaces', + 'interior_spaces') + self.comment_attrs(code, + 'exterior_shape', + 'interior_shape') + code.write(f'{self.at_uk_iterspace},') + kargs = self.at_uk_kargs + code.write("TILE_VER,") + cargs = self.at_uk_cargs + code.write(f"CArgs({len(cargs)},") + code.indent() + for carg in cargs[: -1:]: + code.write(f"{carg},") + code.write(f"{cargs[-1]}") + code.deindent() + code.write("),") + code.write("Calls(1,") + code.indent() + code.write(f'Call("{kname}", LOC_D{len(self.exterior_shape) - 1},') + code.indent() + bindings = self.at_uk_kerbindings + code.write(f"Bindings({len(bindings)},") + code.indent() + for binding in bindings[: -1:]: + code.write(f"{binding},") + code.write(f"{bindings[-1]}") + code.deindent() + code.write(")") + code.deindent() + code.write(")") + code.deindent() + code.write("),") + for var_name, idxes in self.var_axes_idx.items(): + if var_name in self.temporary_names: + continue + stride = f" stride: {self._var_strides[var_name]}" if var_name in self._var_strides else "" + code.comment(f'var: {var_name} axes: {idxes}{stride}') + code.write("KerArgs({0},", len(kargs)) + code.indent() + for karg in kargs[: -1:]: + code.write("{0},", karg) + code.write("{0}", kargs[-1]) + code.deindent() + code.write(")") + code.deindent() + code.write(");") + code.write("if (Kernel) {") + code.indent() + for kinfo in self.at_uk_kinfos: + code.write("{0};", kinfo) + code.deindent() + code.write("}") + code.write("return (Kernel!=0);") + code.deindent() + code.write("}") + return code + + def gen_function(self, kernel_name: str, kernel_arg_type_name: str, code: CodeBlock = None): + if code is None: + code = CodeBlock() + + code.comment( + f'Output iteration space reduced to {len(self.interior_spaces)} internal ' + f'and {len(self.exterior_spaces)} external iteration spaces') + code.write(f"void {kernel_name}({kernel_arg_type_name} *Args) {{") + code.indent() + comments = [] + for kerarg_name, _ in self.kernel_args: + # TODO - add qrecs for quantized kernels + comments.append([ + f'{self.var_shapes[kerarg_name]} ' if kerarg_name in self.var_shapes else '', + f'{self._assignments.qrecs[kerarg_name]}' if kerarg_name in self._assignments.qrecs else '' + ]) + comments = tabulate(comments) + for idx, (kerarg_name, kerarg_type) in enumerate(self.kernel_args): + # TODO - add qrecs for quantized kernels + comment = comments[idx] + if comment.strip(): + comment = f' // {comment}' + else: + comment = '' + code.write( + f'{kerarg_type} {kerarg_name} = Args->{kerarg_name};{comment}') + # paralellize on largest dimension + last_first = self._var_max_name(self.spaces.index(self.paralellized_space)) + code.write('unsigned int CoreId = gap_coreid();') + code.write(f'unsigned int Chunk = ChunkSize({last_first});') + code.write('unsigned int First = Chunk*CoreId;') + code.write(f'unsigned int Last = gap_min(First+Chunk, {last_first});') + self._assignments.c_block(code, iteration_space=self, + with_loops=True, with_comment=True) + code.write('gap_waitbarrier(0);') + code.deindent() + code.write('}') + return code + + def gen_kernel_arg_typedecl(self, type_name, code=None): + if code is None: + code = CodeBlock() + code.write('typedef struct {') + code.indent() + for kerarg_name, kerarg_type in self.kernel_args: + code.write(f'{kerarg_type} {kerarg_name};') + code.deindent() + code.write(f'}} {type_name};') + return code + + def gen_kernel_model(self, kernel_name, kernel_arg_type_name, code=None): + if code is None: + code = CodeBlock() + code.write('LibKernelTemplate(') + code.indent() + code.write(f'"{kernel_arg_type_name}",') + code.write(f'CArgs({len(self.kernel_args)},') + code.indent() + for idx, (kerarg_name, kerarg_type) in enumerate(self.kernel_args): + code.write('TCArg("{}", "{}"){}', + kerarg_type, + kerarg_name, + "," if idx < (len(self.kernel_args) - 1) else '') + code.deindent() + code.write(')') + code.deindent() + code.write(');') + code.write('') + code.write('LibKernel(') + code.indent() + code.write('"{}",', kernel_name) + code.write('CALL_PARALLEL,') + code.write('0,') + code.write('"{}",', kernel_arg_type_name) + code.write('0') + code.deindent() + code.write(');') + + return code diff --git a/tools/nntool/expressions/symbolic/kernel_codegen.py b/tools/nntool/expressions/symbolic/kernel_codegen.py deleted file mode 100644 index 1e45a6ab3..000000000 --- a/tools/nntool/expressions/symbolic/kernel_codegen.py +++ /dev/null @@ -1,313 +0,0 @@ -# Copyright (C) 2020 GreenWaves Technologies, SAS - -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. - -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . - -import logging -from typing import Sequence - -import numpy as np -from generation.code_block import CodeBlock -from quantization.qtype import DTYPES - -from .function_collection import FunctionCollection - -LOG = logging.getLogger("nntool." + __name__) - - -class BasicKernel(): - def __init__(self, func_col: FunctionCollection, constant_input_names: Sequence[str]) -> None: - self._func_col = func_col - self._constant_input_names = constant_input_names - - @property - def func_col(self): - return self._func_col - - @property - def input_names(self): - return self._func_col.input_names - - @property - def input_names_and_ctypes(self): - return [(name, self.func_col.qrecs[name].ctype) for name in self.input_names] - - @property - def output_names(self): - return self._func_col.output_names - - @property - def output_names_and_ctypes(self): - return [(name, self.func_col.qrecs[name].ctype) for name in self.output_names] - - @property - def intermediate_names(self): - return self._func_col.intermediate_names - - @property - def shapes(self): - return self._func_col.var_shapes - - @property - def kernel_dims(self): - return self._func_col.kernel_dims - - @property - def kernel_args(self): - kernel_args = [] - for kiter in self.func_col.iterators: - kernel_args.append((kiter.name.upper(), "unsigned int")) - for input_name, ctype in self.input_names_and_ctypes: - kernel_args.append((input_name, f"{ctype} *")) - for output_name, ctype in self.output_names_and_ctypes: - kernel_args.append((output_name, f"{ctype} *")) - return kernel_args - - def ctype_len(self, sym_name): - dtype = self.func_col.qrecs[sym_name].dtype - if dtype not in DTYPES: - raise ValueError(f"don't know dtype {dtype}") - return DTYPES[dtype][0]//8 - - def gen_kernel_headers(self, code: CodeBlock = None): - if code is None: - code = CodeBlock() - for include in self._func_col.c_header_set: - code.write('#include {}', include) - return code - - def gen_user_kernel(self, ukname: str, kname: str, code: CodeBlock = None): - if code is None: - code = CodeBlock() - code.write("int {0}(char *Name) {{", ukname) - code.indent() - code.write("Kernel_T *Kernel = UserKernel(") - code.indent() - code.write("Name,") - code.write("{0},", self.gen_iterspace()) - kargs = self.gen_kargs() - code.write("TILE_HOR,") - cargs = self.gen_cargs() - code.write("CArgs({0},", len(cargs)) - code.indent() - for carg in cargs[:-1:]: - code.write("{0},", carg) - code.write("{0}", cargs[-1]) - code.deindent() - code.write("),") - code.write("Calls(1,") - code.indent() - code.write("Call(\"{0}\", LOC_D{1},", kname, - len(self.func_col.iterators) - 1) - code.indent() - bindings = self.gen_kerbingings() - code.write("Bindings({0},", len(bindings)) - code.indent() - for binding in bindings[:-1:]: - code.write("{0},", binding) - code.write("{0}", bindings[-1]) - code.deindent() - code.write(")") - code.deindent() - code.write(")") - code.deindent() - code.write("),") - code.write("KerArgs({0},", len(cargs)) - code.indent() - for karg in kargs[:-1:]: - code.write("{0},", karg) - code.write("{0}", kargs[-1]) - code.deindent() - code.write(")") - code.deindent() - code.write(");") - code.write("if (Kernel) {") - code.indent() - for kinfo in self.gen_kinfos(): - code.write("{0};", kinfo) - code.deindent() - code.write("}") - code.write("return (Kernel!=0);") - code.deindent() - code.write("}") - return code - - def gen_kinfos(self): - in_sizes = [np.prod(self._func_col.var_shapes[var_name]) - for var_name in self._func_col.input_names] - bandwidth = sum([np.prod(self._func_col.var_shapes[var_name]) - for var_name in self._func_col.output_names]) + sum(in_sizes) - kinfos = [ - "AddKernelInfos(Name, AT_KERINFO_OPER, {0}, 0)".format( - self._func_col.ops * max(in_sizes)), - "AddKernelInfos(Name, AT_KERINFO_BANDWIDTH, {0}, 0)".format( - bandwidth) - ] - for name_type in self.input_names_and_ctypes + self.output_names_and_ctypes: - name = name_type[0] - shape = self.shapes[name] - kinfos.append("{0}(Name, \"{1}\", {2}, {3}, {4})".format( - "AddKernelFloatArgDim" if name_type[1] == 'F16' or name_type[1] == 'float' else "AddKernelArgDim", - name, len(shape) + 1, ", ".join(str(dim) for dim in shape), - self.ctype_len(name))) - return kinfos - - def gen_cargs(self): - cargs = [] - for name_type in self.input_names_and_ctypes + self.output_names_and_ctypes: - name = name_type[0] - if name_type[1] == 'F16' or name_type[1] == 'float': - cargs.append("TCArg(CNN_ArgDataTypeF({0},1,1),\"{1}\")".format( - self.ctype_len(name), name)) - else: - cargs.append("TCArg(CNN_ArgDataType({0},1,1),\"{1}\")".format( - self.ctype_len(name), name)) - return cargs - - def gen_kargs(self): - kargs = [] - for input_name in self.input_names: - arg_indexes = self._func_col.variable_indexes[input_name] - argspaces = ", ".join(f'KER_ITER_D{idx}' for idx in arg_indexes) - argspace = f'KerArgSpace({len(arg_indexes)}, {argspaces})' if arg_indexes else f'KerArgSpace(1, KER_ITER_TILE0)' - if input_name in self._constant_input_names: - constraints = "O_IN|O_DB|O_CONST" - else: - constraints = "O_IN|O_DB" if arg_indexes else "O_IN|O_BUFF|O_NTILED" - kargs.append("KerArg(\"{0}\", {1}, {2}, {3}, {4}, {5}, 0, 0, 0, \"{0}\")".format( - input_name, - argspace, - constraints, - 1, - 1, - self.ctype_len(input_name))) - - for output_name in self.output_names: - arg_indexes = self._func_col.variable_indexes[output_name] - argspaces = ", ".join(f'KER_ITER_D{idx}' for idx in arg_indexes) - argspace = f'KerArgSpace({len(arg_indexes)}, {argspaces})' if arg_indexes else 'KerArgSpace(1, KER_ITER_TILE0)' - name = output_name - constraints = "O_OUT|O_DB" if arg_indexes else "O_OUT|O_BUFF|O_NTILED" - kargs.append("KerArg(\"{0}\", {1}, {2}, {3}, {4}, {5}, 0, 0, 0, \"{0}\")".format( - name, argspace, constraints, 1, 1, - self.ctype_len(output_name))) - return kargs - - def gen_iterspace(self): - # All iterators are in parametric spaces. The iterator we will - # parallelize on has its preferred div set to 8 - # since only 3 tiled spaces are allowed including the dummy TILE0 space if there are scalars - # we check for that and only tile the first 3 spaces - tiled_iterators = self.tiled_iterators - iterators = [ - f'IterFixedSpace(KER_ITER_D{idx}, {iterator.shape[0]})' - if iterator not in tiled_iterators else - f'IterParSpace(KER_ITER_D{idx}, {iterator.shape[0]}, ' - f'{min(8, iterator.shape[0]) if iterator == self.parallel_iterator else 1})' - for idx, iterator in enumerate(self._func_col.iterators)] - # append dummy TILE0 space to put scalars into if there are scalar inputs (which is unlikely) - if self.has_scalar_parameters: - iterators.append('IterTiledSpace(KER_ITER_TILE0)') - return f'KernelIterSpace({len(iterators)}, {",".join(iterators)})' - - - def gen_kerbingings(self): - max_dim_var = max(self.output_names, key=lambda x: len(self.shapes[x])) - bindings = [ - f"K_ArgPar(\"{max_dim_var}\", KER_ARG_PARTILE_SIZE, KER_ITER_D{idx})" - for idx in range(len(self._func_col.iterators)) - ] + [ - f"K_Arg(\"{name}\", KER_ARG_TILE)" - for name in self.input_names + self.output_names - ] - return bindings - - @property - def parallel_iterator(self): - return max(self.func_col.iterators, key=lambda x: x.shape[0]) - - @property - def tiled_iterators(self): - return sorted(self.func_col.iterators, key=lambda x: x.shape[0])[-2::] - - @property - def fixed_iterators(self): - tiled_iterators = self.tiled_iterators - return [iterator for iterator in self.func_col.iterators if iterator not in tiled_iterators] - - @property - def has_scalar_parameters(self): - return any(not self._func_col.variable_indexes[input_name] - for input_name in self.input_names + self.output_names) - - def gen_function(self, kernel_name, kernel_arg_type_name, code=None): - if code is None: - code = CodeBlock() - - code.comment( - "Output iteration space reduced to %s iteration spaces" % (self.kernel_dims)) - code.write(f"void {kernel_name}({kernel_arg_type_name} *Args) {{") - code.indent() - for kerarg_name, kerarg_type in self.kernel_args: - code.write('{0} {1} = Args->{1};', kerarg_type, kerarg_name) - # paralellize on largest dimension - last_first = self.parallel_iterator.name.upper() - code.write('unsigned int CoreId = gap_coreid();') - code.write('unsigned int Chunk = ChunkSize({});', last_first) - code.write('unsigned int First = Chunk*CoreId;') - code.write('unsigned int Last = gap_min(First+Chunk, {});', last_first) - self._func_col.create_kernel(self.parallel_iterator, self.fixed_iterators, code) - code.write('gap_waitbarrier(0);') - code.deindent() - code.write('}') - return code - - def kernel_arg_type_codegen(self, type_name, code=None): - if code is None: - code = CodeBlock() - code.write('typedef struct {') - code.indent() - for kerarg_name, kerarg_type in self.kernel_args: - code.write('{} {};', kerarg_type, kerarg_name) - code.deindent() - code.write('}} {};', type_name) - return code - - def gen_kernel_model(self, kernel_name, kernel_arg_type_name, code=None): - if code is None: - code = CodeBlock() - code.write('LibKernelTemplate(') - code.indent() - code.write('"{}",', kernel_arg_type_name) - code.write('CArgs({},', len(self.kernel_args)) - code.indent() - for idx, (kerarg_name, kerarg_type) in enumerate(self.kernel_args): - code.write('TCArg("{}", "{}"){}', - kerarg_type, - kerarg_name, - "," if idx < (len(self.kernel_args) - 1) else '') - code.deindent() - code.write(')') - code.deindent() - code.write(');') - code.write('LibKernel(') - code.indent() - code.write('"{}",', kernel_name) - code.write('CALL_PARALLEL,') - code.write('0,') - code.write('"{}",', kernel_arg_type_name) - code.write('0') - code.deindent() - code.write(');') - - return code diff --git a/tools/nntool/expressions/symbolic/q15_quantization/handlers.py b/tools/nntool/expressions/symbolic/q15_quantization/handlers.py index 4cd591872..eab7394a4 100644 --- a/tools/nntool/expressions/symbolic/q15_quantization/handlers.py +++ b/tools/nntool/expressions/symbolic/q15_quantization/handlers.py @@ -17,24 +17,26 @@ from typing import Tuple import numpy as np +from bfloat16 import bfloat16 +from expressions.symbolic.float_quantization.float_qrec import FloatQRec from utils.exp_17_15 import exp_fp_17_15 -from utils.pow_sqrt import (arctan_17_15alt, logn_17_15, pow_17_15, rsqrt_16_16, sqrt_17_15, - square_17_15) +from utils.pow_sqrt import (arctan_17_15alt, logn_17_15, pow_17_15, + rsqrt_16_16, sqrt_17_15, square_17_15) from utils.sigmoid_tanh_lut import sigmoid_lut, tanh_lut from utils.sin_cos import fpcos, fpsin from ..basic import (Abs, Add, ATan, Cast, Cos, Div, Exp, GapAbs, GapMax, - GapMin, Log, LShift, Max, Min, Mul, Pow, RSqrt, Sigmoid, Sin, - Sqrt, Sub, TanH) + GapMin, Log, LShift, Max, Min, Mul, Pow, RSqrt, Sigmoid, + Sin, Sqrt, Sub, TanH) from ..function import Function from ..quantization_base import qhandler -from ..symbol import (Constant, Rational, Symbol, SymbolStats, Variable, - c_headers, environment, nargs) +from ..symbol import (Constant, QuantizedConstant, QuantizedValue, Rational, + Symbol, SymbolStats, Variable, c_headers, environment, + nargs) from .clip_norm import Clip, Norm from .q15_scale_float import Q15ScaleFloat from .q15_scale_q_rec import Q15ScaleQRec from .q15_scaled_quantization import Q15ScaledQuantization -from .quantized_constant import QuantizedConstant, QuantizedValue from .scale_quantized import ScaleQuantized @@ -91,10 +93,22 @@ def _quantize(cls, # see if an nntool quantizer qtype is available if not qrec and qtypes and sym.name in qtypes: - sym, qrec = cls.qrec_from_qtype(sym, qtypes[sym.name]) + in_range = sym_ctrl.get_range(sym) + qtype = qtypes[sym.name] + if in_range is None: + if qtype.max_val is not None and qtype.min_val is None: + in_range = (qtype.min_val, qtype.max_val) + else: + in_range = (qtype.min, qtype.max) + osym, qrec = cls.qrec_from_qtype(sym, qtypes[sym.name], in_range) if qrec: - sym.qrec = qrec - return (sym, qrec) + osym.qrec = qrec + if isinstance(qrec, Q15ScaleQRec) and qrec.zero_point != 0: + osym = Sub(Cast(osym, dtype=np.int32), QuantizedConstant( + qrec.zero_point), dtype=np.int32, tag=True) + qrec = Q15ScaleQRec.override( + qrec, dtype=np.int32, zero_point=0) + return (osym, qrec) # figure out the quantization from the maximum value recorded max_val = sym_ctrl.get_max(sym) @@ -110,41 +124,41 @@ def _quantize(cls, return (sym, qrec) @classmethod - def qrec_from_qtype(cls, sym, qtype): - if qtype.dtype == np.int8: + def qrec_from_qtype(cls, sym, qtype, in_range): + if qtype.dtype in [np.int8, np.uint8, np.int16, np.uint16]: if len(qtype.scale) > 1: return sym, None - max_val = qtype.scale[0] * (math.pow(2, 7) - qtype.zero_point[0]) - min_val = -qtype.scale[0] * (math.pow(2, 7) + qtype.zero_point[0]) - return sym, Q15ScaleQRec(np.int8, max_val, 7, - max_val=max_val, min_val=min_val, - zero_point=qtype.zero_point[0]) - elif qtype.dtype == np.int16: - if len(qtype.scale) > 1: - return sym, None - max_val = qtype.scale[0] * (math.pow(2, 15) - qtype.zero_point[0]) - min_val = -qtype.scale[0] * (math.pow(2, 15) + qtype.zero_point[0]) - return sym, Q15ScaleQRec(np.int16, max_val, 15, - max_val=max_val, min_val=min_val, - zero_point=qtype.zero_point[0]) - elif qtype.dtype == np.uint8: - if len(qtype.scale) > 1: - return sym, None - max_val = qtype.scale[0] * (math.pow(2, 8) - qtype.zero_point[0]) - min_val = qtype.scale[0] * -qtype.zero_point[0] - return sym, Q15ScaleQRec(np.uint8, max_val, 8, - max_val=max_val, min_val=min_val, - zero_point=qtype.zero_point[0]) - elif qtype.dtype == np.uint16: - if len(qtype.scale) > 1: - return sym, None - max_val = qtype.scale[0] * (math.pow(2, 16) - qtype.zero_point[0]) - min_val = qtype.scale[0] * -qtype.zero_point[0] - return sym, Q15ScaleQRec(np.uint16, max_val, 16, - max_val=max_val, min_val=min_val, - zero_point=qtype.zero_point[0]) - else: - return None + max_val, min_val, bitlen = Q15ScaleQRec.dtype_zp_to_min_max( + qtype.dtype, qtype.scale[0], qtype.zero_point[0]) + qrec = Q15ScaleQRec(qtype.dtype, max_val, bitlen, + max_val=max_val, min_val=min_val, + zero_point=qtype.zero_point[0]) + sym.qrec = qrec + return sym, qrec + if qtype.dtype in [np.float16, bfloat16, np.float32]: + qrec = FloatQRec(dtype=qtype.dtype) + sym.qrec = qrec + max_val = np.max(np.maximum( + np.abs(in_range[0]), np.abs(in_range[1]))) + return ( + Cast( + Add( + Mul( + sym, + Constant( + np.atleast_1d(math.pow(2, 15) / + max_val).astype(qtype.dtype), + dtype=qtype.dtype), + dtype=qtype.dtype), + Constant([0.5], dtype=qtype.dtype), + dtype=qtype.dtype + ), + dtype=np.int32), + Q15ScaleQRec(np.int32, max_val, 15, + max_val=max_val, min_val=-max_val, + zero_point=0)) + raise NotImplementedError( + "don't know how to convert input type to Q15 quantization") @qhandler("Q15Scale", QuantizedValue) @@ -184,7 +198,8 @@ def cast_symbols(in_syms, qrecs, dtype=np.int32): def find_range(sym, qrecs): - assert all(qrec.min_val is not None and qrec.max_val is not None for qrec in qrecs), 'all values must be set' + assert all( + qrec.min_val is not None and qrec.max_val is not None for qrec in qrecs), 'all values must be set' val_range = np.array([ sym.call_with_constants(qrecs[0].min_val, qrecs[1].min_val), sym.call_with_constants(qrecs[0].max_val, qrecs[1].min_val), @@ -240,12 +255,21 @@ def _quantize(cls, if scale_to == 0: in_syms = [ in_syms[0], - ScaleQuantized(in_syms[1], from_qrec=in_qrecs[1], to_qrec=in_qrecs[0])] + ScaleQuantized( + in_syms[1], + from_qrec=in_qrecs[1], + to_qrec=in_qrecs[0], + tag=True, + comment=f"{sym.name} scale arg 1 to 0 - {in_qrecs[1]} -> {in_qrecs[0]}")] calc_qrec = Q15ScaleQRec.override(in_qrecs[0], dtype=np.int32) elif scale_to == 1: in_syms = [ ScaleQuantized( - in_syms[0], from_qrec=in_qrecs[0], to_qrec=in_qrecs[1]), + in_syms[0], + from_qrec=in_qrecs[0], + to_qrec=in_qrecs[1], + tag=True, + comment=f"{sym.name} scale arg 0 to 1 - {in_qrecs[0]} -> {in_qrecs[1]}"), in_syms[1]] calc_qrec = Q15ScaleQRec.override(in_qrecs[1], dtype=np.int32) else: @@ -258,11 +282,16 @@ def _quantize(cls, # Try not to scale if we are still in bounds # This creates more error -> if np.abs(calc_qrec.quantize(max_val)) < max_short or - if calc_qrec == out_qrec: - return (sym_cls(*in_syms), calc_qrec) + # if calc_qrec == out_qrec: + return (sym_cls(*in_syms), calc_qrec) - return (ScaleQuantized(sym_cls(*in_syms, dtype=out_qrec.dtype), - from_qrec=calc_qrec, to_qrec=out_qrec), out_qrec) + # return ( + # ScaleQuantized( + # sym_cls(*in_syms, dtype=out_qrec.dtype), + # from_qrec=calc_qrec, + # to_qrec=out_qrec, + # tag=True, + # comment=f'{sym.name} scale result to output - {calc_qrec} -> {out_qrec}'), out_qrec) @qhandler("Q15Scale", Mul) @@ -294,9 +323,13 @@ def _quantize(cls, out_qrec = Q15ScaleQRec(np.int32, prod_scale, min( prod_q, 15), max_val=prod_scale, min_val=-prod_scale) if prod_q > 15: - qsym = Norm(sym_cls(*in_syms, dtype=np.int32), - QuantizedConstant(prod_q - 15), - dtype=np.int32) + qsym = Norm( + sym_cls(*in_syms, dtype=np.int32), + QuantizedConstant(prod_q - 15), + dtype=np.int32, + tag=True, + comment=f'normalize input to Q15 - {prod_q - 15}' + ) else: qsym = sym_cls(*in_syms) return (qsym, out_qrec) @@ -400,7 +433,7 @@ def _quantize(cls, in_qrec.q - 15), dtype=in_sym.dtype) out_qrec = Q15ScaleQRec(np.int32, new_scale, 15) - return (Cast(Sqrt1715(in_sym, dtype=np.uint32), dtype=np.int32), out_qrec) + return (Cast(Sqrt1715(in_sym, dtype=np.uint32), dtype=np.int32, tag=True), out_qrec) @nargs(1) @@ -451,7 +484,7 @@ def _quantize(cls, in_sym = in_syms[0] out_qrec = Q15ScaleQRec(np.int32, new_scale, 15) - return (Cast(Norm(RSqrt1616(in_sym, dtype=np.uint32), QuantizedConstant(norm), dtype=np.uint32), dtype=np.int32), out_qrec) + return (Cast(Norm(RSqrt1616(in_sym, dtype=np.uint32), QuantizedConstant(norm), dtype=np.uint32), dtype=np.int32, tag=True), out_qrec) @nargs(1) @@ -504,7 +537,7 @@ def _quantize(cls, max_bits = math.ceil(math.log2(math.fabs(-340695 + qlog_off))) + 2 return ( ScaleQuantized(Add(Log1715(in_sym, dtype=np.int32), QuantizedConstant( - qlog_off), dtype=np.int32), from_qrec=calc_qrec, to_qrec=out_qrec, num_bits=31-max_bits), + qlog_off), dtype=np.int32), from_qrec=calc_qrec, to_qrec=out_qrec, num_bits=31-max_bits, tag=True), out_qrec) @@ -571,7 +604,7 @@ def _quantize(cls, if val == 2: out_qrec = Q15ScaleQRec(np.int32, np.power(lhs_qrec.scale, 2), 15) - return (Cast(Square1715(lhs, dtype=np.int32), dtype=np.int32), out_qrec) + return (Cast(Square1715(lhs, dtype=np.int32), dtype=np.int32, tag=True), out_qrec) if val == -2: out_qrec = Q15ScaleQRec( np.int32, 1/np.power(lhs_qrec.scale, 2), 15) @@ -583,10 +616,20 @@ def _quantize(cls, out_qrec = Q15ScaleQRec(np.int32, 1, 0) return (QuantizedConstant(1), out_qrec) if val > 0 and val < 1: + out_scale = np.power(lhs_qrec.scale, val).item() out_qrec = Q15ScaleQRec( - np.uint32, np.power(lhs_qrec.scale, val), 15) + np.uint32, out_scale, 15) qval = int(math.floor(val * math.pow(2, 15) + 0.5)) - return (Cast(Pow1715(lhs, QuantizedConstant(qval), dtype=np.int32), dtype=np.int32), out_qrec) + return ( + Cast( + Pow1715( + lhs, + QuantizedConstant(qval), + dtype=np.int32), + dtype=np.int32, + comment=f'{sym.name} POW on scale {lhs_qrec.scale:.3f} -> {out_scale:.3f}', + tag=True), + out_qrec) raise NotImplementedError( "power is currently only supported with fractional constants, 2, 1, & 0") @@ -631,7 +674,7 @@ def _quantize(cls, return (ScaleQuantized(Cast(Exp1715(arg, dtype=np.uint32), dtype=np.int32), from_qrec=calc_qrec, - to_qrec=out_qrec), + to_qrec=out_qrec, tag=True), out_qrec) @@ -669,7 +712,7 @@ def _quantize(cls, in_syms, in_qrecs = cls.cast_symbols(in_syms, in_qrecs) lhs = ScaleQuantized( in_syms[0], from_qrec=in_qrecs[0], to_qrec=calc_qrec) - return (Arctan1715(lhs), calc_qrec) + return (Arctan1715(lhs, tag=True), calc_qrec) @nargs(1) @@ -723,8 +766,17 @@ def _quantize(cls, # output is Q12 * 1 out_qrec = Q15ScaleQRec(np.int16, 1, 12) in_syms, in_qrecs = cls.cast_symbols(in_syms, in_qrecs) - lhs = Cast(Clip(ScaleQuantized( - in_syms[0], from_qrec=in_qrecs[0], to_qrec=calc_qrec), dtype=calc_qrec.dtype, clip_dtype=np.int16), dtype=np.int16) + lhs = Cast( + Clip( + ScaleQuantized( + in_syms[0], + from_qrec=in_qrecs[0], + to_qrec=calc_qrec), + dtype=calc_qrec.dtype, + clip_dtype=np.int16), + dtype=np.int16, + tag=True, + comment=f'{sym.name} scale and clip input - {in_qrecs[0]} -> {calc_qrec}') if isinstance(sym, Cos): qsym = Cos_Q15 else: @@ -782,7 +834,8 @@ def _quantize(cls, func = 'tanh' if isinstance(sym, TanH) else 'sigmoid' calc_qrec = Q15ScaleQRec(np.int32, 1, 12) # output is Q15 * 1 - out_qrec = Q15ScaleQRec(np.int32, 1, 15, min_val=-1.0 if func == 'tanh' else 0.0, max_val=1.0) + out_qrec = Q15ScaleQRec( + np.int32, 1, 15, min_val=-1.0 if func == 'tanh' else 0.0, max_val=1.0) in_syms, in_qrecs = cls.cast_symbols(in_syms, in_qrecs) lhs = ScaleQuantized( in_syms[0], from_qrec=in_qrecs[0], to_qrec=calc_qrec) diff --git a/tools/nntool/expressions/symbolic/q15_quantization/q15_scale_q_rec.py b/tools/nntool/expressions/symbolic/q15_quantization/q15_scale_q_rec.py index 5e43157ba..0cb6e4d7f 100644 --- a/tools/nntool/expressions/symbolic/q15_quantization/q15_scale_q_rec.py +++ b/tools/nntool/expressions/symbolic/q15_quantization/q15_scale_q_rec.py @@ -18,12 +18,16 @@ import numpy as np +from quantization.qtype import DTYPES + from ..quantization_base import QRecBase class Q15ScaleQRec(QRecBase): def __init__(self, dtype: np.dtype, scale: float, q: int, min_val=None, max_val=None, zero_point=0) -> None: super(Q15ScaleQRec, self).__init__(dtype) + if isinstance(scale, np.ndarray): + scale = scale.item() self._scale = scale self._q = q self._min_val = min_val @@ -31,7 +35,7 @@ def __init__(self, dtype: np.dtype, scale: float, q: int, min_val=None, max_val= self._zero_point = zero_point def __repr__(self) -> str: - return f"{self._dtype.__name__} {self.scale} Q{self._q}" + return f"{self._dtype.__name__} {self.scale:.3f} Q{self._q}" @classmethod def inherit(cls, rec, dtype: np.dtype = None, scale: float = None, q: int = None, max_val=None, min_val=None, zero_point=None): @@ -157,3 +161,14 @@ def __str__(self) -> str: def __eq__(self, o: object) -> bool: return self.q == o.q and self.scale == o.scale and self.dtype == o.dtype and self.zero_point == o.zero_point + + @staticmethod + def dtype_zp_to_min_max(dtype, scale, zero_point): + bitlen, signed = DTYPES[dtype] + maxquns = math.pow(2, bitlen) + zpoff = math.pow(2, bitlen - 1) if signed else 0 + maxq_range = maxquns - (zero_point + zpoff) + minq_range = maxquns - maxq_range + max_val = maxq_range * scale + min_val = minq_range * scale + return max_val, min_val, bitlen - (1 if signed or zero_point != 0 else 0) diff --git a/tools/nntool/expressions/symbolic/q15_quantization/q15_scaled_quantization.py b/tools/nntool/expressions/symbolic/q15_quantization/q15_scaled_quantization.py index 5f5f81185..1f7488c90 100644 --- a/tools/nntool/expressions/symbolic/q15_quantization/q15_scaled_quantization.py +++ b/tools/nntool/expressions/symbolic/q15_quantization/q15_scaled_quantization.py @@ -13,12 +13,14 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -from typing import Tuple, cast +import math +from typing import Tuple import numpy as np -import math +from bfloat16 import bfloat16 +from expressions.symbolic.float_quantization.float_qrec import FloatQRec -from ..basic import Cast +from ..basic import Cast, ConvertQuantization from ..quantization_base import (QRecBase, QuantizationHandlerBase, handles_scheme) from ..symbol import Symbol, SymbolStats @@ -63,6 +65,55 @@ def _dequantize_py_expr(cls, py_expr: str, qrec: Q15ScaleQRec, **kwargs) -> np.n def _dequantize_c_expr(cls, c_expr: str, qrec: Q15ScaleQRec, **kwargs) -> np.ndarray: return qrec.dequantize_c_expr(c_expr) + # @classmethod + # def _quantize_output(cls, + # sym: Symbol, + # qsym: Symbol, + # osym: Symbol, + # sym_ctrl: SymbolStats, + # qrec: QRecBase, + # **kwargs) -> Tuple[Symbol, QRecBase]: + # from_qrec = qrec + # qtypes = kwargs.get('qtypes', {}) + # # first see if this has already been quantized by nntool + # # note that the qtype will be stored against the name of the output symbol + # res = cls._get_scale_dtype_from_qtypes( + # osym, qtypes) + # if res is None: + # max_val = math.fabs(sym_ctrl.get_max(sym)) + # min_val = -max_val + # out_dtype = np.int8 + # out_q = 7 + # zero_point = 0 + # else: + # max_val, min_val, out_dtype, out_q, zero_point = res + + # qrec_scale = Q15ScaleQRec(np.int32, max_val, out_q, min_val=min_val, max_val=max_val, zero_point=zero_point) + # qrec_out = Q15ScaleQRec(out_dtype, max_val, out_q, min_val=min_val, max_val=max_val, zero_point=zero_point) + # # scale clip and cast to output type + # return ( + # Cast( + # Clip( + # ScaleQuantized(qsym, + # from_qrec=from_qrec, + # to_qrec=qrec_scale), + # clip_dtype=out_dtype, + # dtype=qrec_scale.dtype), + # dtype=qrec.dtype), qrec_out) + + # @classmethod + # def _get_scale_dtype_from_qtypes(cls, sym, qtypes): + # if not qtypes or sym.name not in qtypes: + # return None + # qtype = qtypes[sym.name] + # if qtype.dtype in [np.int8, np.uint8, np.int16, np.uint16]: + # if len(qtype.scale) > 1: + # return None + # max_val, min_val, bitlen = Q15ScaleQRec.dtype_zp_to_min_max(qtype.dtype, qtype.scale[0], qtype.zero_point) + # return max_val, min_val, qtype.dtype, bitlen, qtype.zero_point + # else: + # return None + @classmethod def _quantize_output(cls, sym: Symbol, @@ -75,49 +126,56 @@ def _quantize_output(cls, qtypes = kwargs.get('qtypes', {}) # first see if this has already been quantized by nntool # note that the qtype will be stored against the name of the output symbol - max_val, out_dtype, out_q, zero_point = cls._get_scale_dtype_from_qtypes( - osym, qtypes) - if max_val is None: + + if qtypes and osym.name in qtypes: + qtype = qtypes[osym.name] + if qtype.dtype in [np.int8, np.uint8, np.int16, np.uint16]: + max_val, min_val, out_q = Q15ScaleQRec.dtype_zp_to_min_max( + qtype.dtype, qtype.scale[0], qtype.zero_point) + out_dtype = qtype.dtype + zero_point = qtype.zero_point + elif qtype.dtype in [np.float16, bfloat16, np.float32]: + min_val = qtype.min_val + max_val = qtype.max_val + out_dtype = qtype.dtype + else: + raise ValueError(f"don't know how to output {qtype.dtype}") + else: + out_dtype = kwargs.get('out_dtype', np.int8) + assert out_dtype in [np.int8, np.int16] max_val = math.fabs(sym_ctrl.get_max(sym)) - out_dtype = np.int8 - out_q = 7 + min_val = -max_val + out_dtype = out_dtype + out_q = 7 if out_dtype == np.int8 else 15 zero_point = 0 -#pylint: disable=invalid-unary-operand-type - min_val = -max_val - qrec_scale = Q15ScaleQRec(np.int32, max_val, out_q, min_val=min_val, max_val=max_val, zero_point=zero_point) - qrec_out = Q15ScaleQRec(out_dtype, max_val, out_q, min_val=min_val, max_val=max_val, zero_point=zero_point) - # scale clip and cast to output type + if out_dtype in [np.float16, bfloat16, np.float32]: + qrec_out = FloatQRec( + dtype=out_dtype, max_val=max_val, min_val=min_val) + return ( + ConvertQuantization( + qsym, + from_qrec=from_qrec, + to_qrec=qrec_out, + comment=f'convert quantization - {from_qrec} -> {qrec_out}' + ), qrec_out) + + qrec_scale = Q15ScaleQRec( + np.int32, max_val, out_q, min_val=min_val, max_val=max_val, zero_point=zero_point) + qrec_out = Q15ScaleQRec( + out_dtype, max_val, out_q, min_val=min_val, max_val=max_val, zero_point=zero_point) return ( Cast( Clip( - ScaleQuantized(qsym, - from_qrec=from_qrec, - to_qrec=qrec_scale), + ScaleQuantized( + qsym, + from_qrec=from_qrec, + to_qrec=qrec_scale + ), clip_dtype=out_dtype, - dtype=qrec_scale.dtype), - dtype=qrec.dtype), qrec_out) - - @classmethod - def _get_scale_dtype_from_qtypes(cls, sym, qtypes): - if not qtypes or sym.name not in qtypes: - return None, None, None, None - qtype = qtypes[sym.name] - if qtype.dtype == np.int8: - if len(qtype.scale) > 1: - return None, None, None, None - return qtype.scale[0] * math.pow(2, 7), np.int8, 7, qtype.zero_point - if qtype.dtype == np.uint8: - if len(qtype.scale) > 1: - return None, None, None, None - return qtype.scale[0] * math.pow(2, 8), np.uint8, 8, qtype.zero_point - elif qtype.dtype == np.int16: - if len(qtype.scale) > 1: - return None, None, None - return qtype.scale[0] * math.pow(2, 15), np.int16, 15, qtype.zero_point - if qtype.dtype == np.uint16: - if len(qtype.scale) > 1: - return None, None, None, None - return qtype.scale[0] * math.pow(2, 16), np.uint16, 16, qtype.zero_point - else: - return None, None, None, None + dtype=qrec_scale.dtype + ), + dtype=qrec_out.dtype, + comment=f'scale clip and cast - {from_qrec} -> {qrec_out}' + ), + qrec_out) diff --git a/tools/nntool/expressions/symbolic/q15_quantization/quantized_constant.py b/tools/nntool/expressions/symbolic/q15_quantization/quantized_constant.py deleted file mode 100644 index 258036854..000000000 --- a/tools/nntool/expressions/symbolic/q15_quantization/quantized_constant.py +++ /dev/null @@ -1,34 +0,0 @@ -# Copyright (C) 2020 GreenWaves Technologies, SAS - -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. - -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . - - -import numpy as np - -from ..symbol import Constant, Symbol - - -class QuantizedConstant(Constant): - def __init__(self, *args, dtype=np.int32, **kwargs): - super().__init__(*args, dtype=dtype, **kwargs) - -class QuantizedValue(Symbol): - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - def _calculate(self, calculate_ranges=False, **kwargs): - raise ValueError('wrapper class for quantization purposes - not designed to be evaluated') - - def _impl(self, *args, **kwargs): - raise ValueError('wrapper class for quantization purposes - not designed to be evaluated') diff --git a/tools/nntool/expressions/symbolic/q15_quantization/scale_quantized.py b/tools/nntool/expressions/symbolic/q15_quantization/scale_quantized.py index 30d812ee4..90eb9c791 100644 --- a/tools/nntool/expressions/symbolic/q15_quantization/scale_quantized.py +++ b/tools/nntool/expressions/symbolic/q15_quantization/scale_quantized.py @@ -14,16 +14,15 @@ # along with this program. If not, see . import math +from xml.etree.ElementTree import Comment import numpy as np -from numpy.core.getlimits import iinfo from expressions.symbolic.function import Function from ..basic import Add, Cast, CompoundFunction, LShift, Mul, Sub, copy_props -from ..symbol import c_headers, nargs +from ..symbol import QuantizedConstant, c_headers, nargs from .clip_norm import Norm from .q15_scale_q_rec import Q15ScaleQRec -from .quantized_constant import QuantizedConstant @nargs(2) @@ -87,7 +86,13 @@ def _eval(self, *args, **kwargs): # this should be safe as we never go much above Q15 and the scaling step # is also a Q15 if isinstance(sym, ScaleQuantized): - return ScaleQuantized(*sym.contents, from_qrec=sym.from_qrec, to_qrec=self.to_qrec, num_bits=min(self._num_bits, sym.num_bits)) + return ScaleQuantized( + *sym.contents, + from_qrec=sym.from_qrec, + to_qrec=self.to_qrec, + num_bits=min(self._num_bits, sym.num_bits), + tag=self.tag, + comment=self.comment) # Check if we do nothing if self._from_qrec == self._to_qrec: return sym @@ -159,6 +164,8 @@ def _eval(self, *args, **kwargs): if self._to_qrec.dtype != np.int32: sym = Cast(sym, dtype=self._to_qrec.dtype) + sym.tag = self.tag + sym.comment=self.comment return sym def __repr__(self) -> str: diff --git a/tools/nntool/expressions/symbolic/quantization_base.py b/tools/nntool/expressions/symbolic/quantization_base.py index 48221469c..c66d6f346 100644 --- a/tools/nntool/expressions/symbolic/quantization_base.py +++ b/tools/nntool/expressions/symbolic/quantization_base.py @@ -1,8 +1,24 @@ +# Copyright (C) 2020 GreenWaves Technologies, SAS + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. + +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + from typing import Tuple import numpy as np from expressions.symbolic.basic import CompoundFunction +from expressions.symbolic.function import Function from .symbol import Symbol, SymbolStats, Variable, QRecBase @@ -123,6 +139,8 @@ def quantize(cls, if not isinstance(sym, Variable): qsym.name = sym.name qsym.qrec = qrec + if isinstance(sym, Function): + qsym.tag = True return (qsym, qrec) @classmethod diff --git a/tools/nntool/expressions/symbolic/symbol.py b/tools/nntool/expressions/symbolic/symbol.py index 0480073bc..31bf41972 100644 --- a/tools/nntool/expressions/symbolic/symbol.py +++ b/tools/nntool/expressions/symbolic/symbol.py @@ -19,7 +19,7 @@ import numpy as np from bfloat16 import bfloat16 from generation.code_block import CodeBlock -from quantization.qtype import DTYPE_GAP_CTYPE +from quantization.qtype import DTYPE_GAP_CTYPE, DTYPES class SymbolStats(): @@ -64,17 +64,21 @@ def reset_ranges(self): class QRecBase(): DTYPE_TO_CTYPE = { - np.int8: 'int8_t', - np.int16: 'int16_t', - np.int32: 'int32_t', - np.uint8: 'uint8_t', - np.uint16: 'uint16_t', - np.uint32: 'uint32_t', + np.int8: 'signed char', + np.int16: 'short', + np.int32: 'int', + np.uint8: 'unsigned char', + np.uint16: 'unsigned short', + np.uint32: 'unsigned int', np.float32: 'float', bfloat16: 'F16', np.float16: 'F16' } def __init__(self, dtype=None) -> None: + if isinstance(dtype, np.dtype): + dtype = dtype.type + if dtype is not None and dtype not in self.DTYPE_TO_CTYPE: + raise ValueError('unknown dtype') self._dtype = dtype @property @@ -89,6 +93,14 @@ def dtype(self, val): def ctype(self): return self.DTYPE_TO_CTYPE[self.dtype] + @property + def signed(self): + return DTYPES[self.dtype][1] + + @property + def size(self): + return DTYPES[self.dtype][0] + class Symbol(): NARGS = None CURRENT_CONTROL = SymbolStats() @@ -96,9 +108,10 @@ class Symbol(): COUNTS = {} C_HEADERS = [] COPY_PROPS = tuple() + SYMBOL_PREFEX = '_SYMBOL_' #pylint: disable=unused-argument - def __init__(self, *args, name="", shape=None, dtype=np.float32, qrec: QRecBase = None, **kwargs): + def __init__(self, *args, name="", shape=None, dtype=np.float32, qrec: QRecBase = None, tag=None, comment: str=None, **kwargs): super(Symbol, self).__init__(**kwargs) if self.NARGS is not None and len(args) != self.NARGS: raise ValueError("wrong number of arguments to Symbol %s"%self.__class__.__name__) @@ -107,6 +120,8 @@ def __init__(self, *args, name="", shape=None, dtype=np.float32, qrec: QRecBase self._dtype = dtype self._shape = shape self._qrec = qrec + self._tag = tag + self._comment = comment @classmethod def get_name(cls, cls_to_name): @@ -114,6 +129,22 @@ def get_name(cls, cls_to_name): cls.COUNTS[cls_to_name] += 1 return name + @property + def tag(self): + return self._tag + + @tag.setter + def tag(self, val): + self._tag = val + + @property + def comment(self): + return self._comment + + @comment.setter + def comment(self, val): + self._comment = val + @property def qrec(self): return self._qrec @@ -153,6 +184,10 @@ def dtype(self): return self._qrec.dtype return self._dtype + @property + def ctype(self): + return QRecBase.DTYPE_TO_CTYPE[self.dtype] + @property def name(self): return self._name @@ -182,10 +217,11 @@ def set_default_control(cls, control): cls.CURRENT_CONTROL = control @staticmethod - def extend_shapes(*shapes): + def extend_shapes(*shapes, max_length=None): if len(shapes) == 1: return list(shapes) - max_length = max(len(x) for x in shapes) + if max_length is None: + max_length = max(len(x) for x in shapes) return [tuple([1] * (max_length - len(x)) + list(x)) for x in shapes] @staticmethod @@ -226,7 +262,10 @@ def resolve(self, **kwargs): def calculate(self, calculate_ranges=False, **kwargs): """Given a set of substitions for variable in kwargs calculate a result""" - return self._calculate(calculate_ranges=calculate_ranges, **kwargs) + val = self._calculate(calculate_ranges=calculate_ranges, **kwargs) + if self.tag and 'details' in kwargs: + kwargs['details'][self.tag[0]] = val + return val def collect_globals(self) -> dict: """Returns a dict of globals necessary to execute a lambda of this symbol. Globals @@ -330,10 +369,19 @@ def py_expr(self, *args, **kwargs): def c_expr(self, *args, **kwargs): return self._c_expr([], **kwargs) - def c_block(self, code_block=None, **kwargs): + def c_block(self, code_block=None, with_comment=False, tags=None, **kwargs): if code_block is None: - code_block = CodeBlock - code_block.write(self.c_expr) + code_block = CodeBlock() + if tags is not None and self.tag: + if self.comment and with_comment: + code_block.write(f'// {self.comment}') + name = tags.get(self, f'{self.ctype} {self.SYMBOL_PREFEX}{self.name}') + if isinstance(name, tuple): + name = name[0].c_expr(dtype=name[0].dtype, declare=name[1], **kwargs) + code_block.write(f'{name} = {self._c_expr([], **kwargs)};') + else: + code_block.write(self._c_expr([], **kwargs)) + return code_block def _equivalent(self, other) -> bool: pass @@ -466,7 +514,7 @@ def _c_expr(self, *args, **kwargs): return f"(F16){print_float_constant(val)}" elif self.dtype == np.float32: return print_float_constant(val) - return val + return str(val) def __repr__(self) -> str: return str(self._value) @@ -524,6 +572,7 @@ def __init__(self, var_name, shape=None, symbol_binding=None, name="", **kwargs) self._shape = shape self._index_vars = None self._ispointer = False + self._cindex = None @property def shape(self): @@ -560,6 +609,14 @@ def value(self): def unbound_variables(self): return {self._name: self} + @property + def cindex(self): + return self._cindex + + @cindex.setter + def cindex(self, val): + self._cindex = val + @property def index_vars(self): return self._index_vars @@ -586,11 +643,11 @@ def _impl(self, *args, **kwargs): val = np.array(kwargs[self.name]) if self.shape is not None: val = np.reshape(val, self.shape) - quantize_inputs = kwargs.get('quantize_inputs', False) - if quantize_inputs is True or isinstance(quantize_inputs, Iterable) and self.name in quantize_inputs: - if self.qrec is None: - raise ValueError("can't quantize %s. no quantization record is set."%self.name) - val = self.qrec.quantize_and_clip(val) + # quantize_inputs = kwargs.get('quantize_inputs', False) + # if quantize_inputs is True or isinstance(quantize_inputs, Iterable) and self.name in quantize_inputs: + # if self.qrec is None: + # raise ValueError("can't quantize %s. no quantization record is set."%self.name) + # val = self.qrec.quantize_and_clip(val) if calculate_ranges: self.control.add_stat(self, val) return val @@ -645,8 +702,8 @@ def gen_index(index_vars): #pylint: disable=arguments-differ def _c_expr(self, *args, declare=False, dtype=None, pointer=None, iteration_space=None, **kwargs): - if iteration_space: - return iteration_space.c_indexed_var(self.name) + if iteration_space and not self.name.startswith(self.SYMBOL_PREFEX): + return iteration_space.c_indexed_var(self.name, declare=declare) if pointer is None: pointer = self._ispointer if declare: @@ -666,3 +723,17 @@ def _c_expr(self, *args, declare=False, dtype=None, pointer=None, iteration_spac def __repr__(self) -> str: return f'{self.name}' + +class QuantizedConstant(Constant): + def __init__(self, *args, dtype=np.int32, **kwargs): + super().__init__(*args, dtype=dtype, **kwargs) + +class QuantizedValue(Symbol): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + def _calculate(self, calculate_ranges=False, **kwargs): + raise ValueError('wrapper class for quantization purposes - not designed to be evaluated') + + def _impl(self, *args, **kwargs): + raise ValueError('wrapper class for quantization purposes - not designed to be evaluated') diff --git a/tools/nntool/expressions/symbolic/variable_container.py b/tools/nntool/expressions/symbolic/variable_container.py index 3647509d2..89399bc32 100644 --- a/tools/nntool/expressions/symbolic/variable_container.py +++ b/tools/nntool/expressions/symbolic/variable_container.py @@ -13,8 +13,8 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -from abc import ABC, abstractmethod, abstractproperty -from typing import Mapping +from collections import Counter +from itertools import chain import numpy as np from utils.disjoint_reduction import disjoint_reduction @@ -22,54 +22,41 @@ from .symbol import Symbol, Variable -class VariableAssigner(ABC): - @abstractmethod - def _resolve_assignment(self, substitute_all=False, **kwargs) -> Mapping[str, Symbol]: - """ Resolves an container that is one or more assigments substituting values contained in - **kwargs into unresolved variables - - Args: - substitute_all (bool, optional): If False only expressions that resolve to constants will be substituted. - Defaults to False. - - Returns: - Mapping[str, Symbol]: A map of the variable names and their values (Symbols) - """ - - def resolve_assignment(self, substitute_all=False, **kwargs) -> Mapping[str, Symbol]: - return self._resolve_assignment(substitute_all=substitute_all, **kwargs) - - @abstractmethod - def _calculate_assignment(self, **kwargs) -> Mapping[str, np.ndarray]: - """ Attempts to resolve a series of assignments to a map of values - - Returns: - Mapping[str, np.ndarray]: Map of resolved values - """ - - def calculate_assignment(self, **kwargs) -> Mapping[str, np.ndarray]: - return self._calculate_assignment(**kwargs) - - @abstractproperty - def returned_variables(self): - pass - - @abstractproperty - def var_shapes(self): - pass +def search_variables(elem): + if isinstance(elem, Variable): + return [elem] + if type(elem) == int or type(elem) == float or isinstance(elem, np.ndarray): + return [] + return chain(*[search_variables(sub_elem) for sub_elem in elem.contents]) class VariableContainer(): def __init__(self, *args, **kwargs): + args = list(args) + # if string variable names are provided match existing variables or create a new one + if any(isinstance(arg, str) for arg in args): + all_vars = {var.name: var + for var in chain(*[search_variables(arg) + for arg in args if not isinstance(arg, str)])} + for idx, arg in enumerate(args): + if isinstance(arg, str): + if arg in all_vars: + args[idx] = all_vars[arg] + else: + all_vars[arg] = Variable(arg) + args[idx] = all_vars[arg] super().__init__(*args, **kwargs) - self._unbound_variables = self._init_unbound_variables(*args) + # variables with same name must be the same variable instance + names = list( + {object.__hash__(var): var.name for var in search_variables(self)}.values()) + if len(set(names)) != len(names): + bad_vars = [item[0] for item in filter( + lambda x: x[1] > 1, Counter(names).items())] + raise ValueError( + f'duplicate variable names detected: {" ".join(bad_vars)}') @property def unbound_variables(self): - return self._unbound_variables - - @unbound_variables.setter - def unbound_variables(self, val): - self._unbound_variables = val + return {var.name: var for var in search_variables(self)} @property def unbound_shapes(self): @@ -83,12 +70,10 @@ def extended_unbound_var_shapes(self): return {vname: tuple(([1] * (max_length - len(var.shape))) + list(var.shape)) for vname, var in self.unbound_variables.items()} - @staticmethod def adjust(axes, adjust): return tuple(tuple(dim+adjust for dim in axes_group) for axes_group in axes) - @property def axes(self): var_shapes = Symbol.extend_shapes(*self.unbound_shapes) @@ -96,28 +81,6 @@ def axes(self): shape) if dim != 1) for shape in var_shapes)) return tuple(sorted([tuple(x) for x in axes])) - @staticmethod - def _init_unbound_variables(*args): - unbound_variables = {} - for arg in args: - if isinstance(arg, Variable): - if arg.name in unbound_variables: - if unbound_variables[arg.name].shape != arg.shape: - raise ValueError( - 'there is more than one variable called %s with different shapes' % arg.name) - else: - unbound_variables[arg.name] = arg - elif isinstance(arg, VariableContainer): - unbound_variables.update(arg.unbound_variables) - elif isinstance(arg, str): - if arg in unbound_variables: - raise ValueError( - 'there is more than one variable called %s' % arg) - else: - unbound_variables[arg] = Variable(arg) - - return unbound_variables - def vars_to_axes(self, axes=None): if axes is None: axes = self.axes @@ -129,20 +92,3 @@ def axes_sizes(self, axes=None): axes = self.axes shape = Symbol.broadcast(*self.unbound_shapes) return {axis: int(np.prod([shape[x] for x in axis])) for axis in axes} - - -class VariableContainerAndAssigner(VariableContainer, VariableAssigner): - @property - def var_axes(self): - elems = self.resolve_assignment(substitute_all=True) - max_axis_groups = np.array( - [max(max(x) for x in elem.axes) for elem in elems.values()]) - max_axis = np.max(max_axis_groups) - axis_adjust = max_axis - max_axis_groups - - axes = {} - for elem_idx, (elem_name, elem) in enumerate(elems.items()): - axes[elem_name] = self.adjust(elem.axes, axis_adjust[elem_idx]) - for vname, vaxes in elem.vars_to_axes().items(): - axes[vname] = self.adjust(vaxes, axis_adjust[elem_idx]) - return axes diff --git a/tools/nntool/generation/code_block.py b/tools/nntool/generation/code_block.py index e615c6844..659b61847 100644 --- a/tools/nntool/generation/code_block.py +++ b/tools/nntool/generation/code_block.py @@ -15,12 +15,39 @@ QUOTE = lambda s: '"'+s+'"' + class CodeBlock(): + + class CommentWriter(): + def __init__(self, cb, max_len) -> None: + self._cb = cb + self._max_len = max_len + self.reset() + + def write(self, comment): + for elem in comment.split(' '): + if self._cur_len + len(elem) + 1 > self._max_len: + self.end() + self._cur_line.append(elem) + self._cur_len += len(elem) + 1 + + def end(self): + self._cb.write(f'// {" ".join(self._cur_line)}') + self.reset() + + def reset(self): + self._cur_line = [] + self._cur_len = len(self._cb.get_indent()) + 3 + def __init__(self, starting_indent=0, indent_char=" "): self._indent = starting_indent self._indent_char = indent_char self._lines = [] + @property + def lines(self): + return self._lines + def indent(self): self._indent += 1 return self @@ -60,6 +87,9 @@ def write_start(self, fmt, *args): self._lines.insert(0, fmt.format(*args)) return self + def start_long_comment(self, max_len=80): + return CodeBlock.CommentWriter(self, max_len) + def comment(self, fmt, *args): fmt = self.get_indent() + '// ' + fmt if args: diff --git a/tools/nntool/generation/code_generator.py b/tools/nntool/generation/code_generator.py index 3a243be1c..093eff2fe 100644 --- a/tools/nntool/generation/code_generator.py +++ b/tools/nntool/generation/code_generator.py @@ -17,14 +17,14 @@ import numpy as np from bfloat16 import bfloat16 -from expressions.symbolic.kernel_codegen import BasicKernel +from expressions.symbolic.iteration_space import IterationSpace from graph.manipulations.dimensions import add_dimensions from graph.types import (ConcatParameters, ConstantInputParameters, - InputParameters, OutputParameters, ReshapeParameters, - SplitParameters, TransposeParameters) + InputParameters, OutputParameters, SplitParameters, + TransposeParameters) from graph.types.base import NNEdge from graph.types.fusions import FusionBase -from graph.types.others import CopyParameters, NoOPParameters, QuantizeParameters +from graph.types.others import CopyParameters, QuantizeParameters from graph.types.rnn import RNNBaseParameters from utils.node_id import NodeId @@ -534,7 +534,8 @@ def add_checksum_binding(self, cname, name, step_idx, eparams, before): FunctionBindingList(cname, checksum_func(self.hidden_graph, name), Imm(step_idx), - Imm(calc_value_checksum(self.hidden_graph, name)), + Imm(calc_value_checksum( + self.hidden_graph, name)), GArgEdge(eparams[0]), Imm(size), before=before) @@ -609,8 +610,8 @@ def expressions_foreach_basic_kernel(self): basic_kernel = self.expressions_kernel_cache.get(node) if not basic_kernel: qrec = self.G.quantization[NodeId(node)] - basic_kernel = BasicKernel(qrec.cache['qfunc_col'], - [inp.name for inp in node.constant_inputs]) + basic_kernel = IterationSpace(qrec.cache['qfunc_col'], + constants=[inp.name for inp in node.constant_inputs]) self.expressions_kernel_cache[node] = basic_kernel yield node, basic_kernel @@ -628,12 +629,12 @@ def expressions_kernel_types_generator(self): code_block = CodeBlock(starting_indent=0) for node, basic_kernel in self.expressions_foreach_basic_kernel(): _, arg_name = self.expressions_get_names(node) - basic_kernel.kernel_arg_type_codegen(arg_name, code=code_block) + basic_kernel.gen_kernel_arg_typedecl(arg_name, code=code_block) return str(code_block) def expressions_kernel_includes_generator(self): code_block = CodeBlock(starting_indent=0) - includes = set.union(*[basic_kernel.func_col.c_header_set for node, + includes = set.union(*[basic_kernel.assignments.c_header_set for node, basic_kernel in self.expressions_foreach_basic_kernel()]) for include in includes: code_block.write('#include {}', include) @@ -733,26 +734,25 @@ def gen_inout_list(self): def generate_output_check(self, tol=0.0, indent=0): code = CodeBlock(starting_indent=indent) code.write('int errors;') - for out_node in self.output_nodes: + for idx, out_node in enumerate(self.output_nodes): out_sz = out_node.out_dims[0].size() nodeq = self.G.quantization[NodeId(out_node, None)].out_qs[0] dtype = "%f" if nodeq.is_floating else "%d" code.write('errors = 0;') - if tol: - code.write(f"{dtype2ctype(nodeq)} max_diff = 0;") + code.write(f"{'float' if nodeq.is_floating else 'int'} max_diff_{idx} = 0;") code.write(f'for (int j=0; j<{out_sz}; j++) {{') code.indent() + code.write( + f"{'float' if nodeq.is_floating else 'int'} diff = {out_node.name.capitalize()}[j] - " + f"{out_node.name.capitalize()}_gt[j];") + code.write("diff = (diff>0)?diff:(-diff);") + code.write(f"if (diff > max_diff_{idx}) max_diff_{idx} = diff;") if tol: - code.write( - f"{dtype2ctype(nodeq)} diff = {out_node.name.capitalize()}[j] - " - f"{out_node.name.capitalize()}_gt[j];") - code.write("diff = (diff>0)?diff:(-diff);") - code.write("if (diff > max_diff) max_diff = diff;") code.write( f'if (diff > {nodeq.quantize(np.array(tol)).item()}) {{') else: code.write( - f'if ({out_node.name.capitalize()}[j] != {out_node.name.capitalize()}_gt[j]) {{') + f'if (diff > 0) {{') code.indent() code.write('errors++;') code.write(f'printf("Error @ %d: {dtype} instead of {dtype}\\n", j, ' @@ -763,6 +763,5 @@ def generate_output_check(self, tol=0.0, indent=0): code.write('}') code.write( f'printf("{out_node.name.capitalize()}: %d/{out_sz} errors\\n", errors);') - if tol: - code.write(f'printf("Max error: {dtype}\\n", max_diff);') + code.write(f'printf("Max error: {dtype}\\n", max_diff_{idx});') return str(code) diff --git a/tools/nntool/generation/default_appl_main_template.py b/tools/nntool/generation/default_appl_main_template.py index f0a3a5e5f..d6b20ecf2 100644 --- a/tools/nntool/generation/default_appl_main_template.py +++ b/tools/nntool/generation/default_appl_main_template.py @@ -57,7 +57,6 @@ def generate_main_appl_template(G, gen, test_inputs=None, test_outputs=None, tol * Put here Your input settings * <--------------- */ - #ifndef __EMUL__ /* Configure And open cluster. */ @@ -70,22 +69,19 @@ def generate_main_appl_template(G, gen, test_inputs=None, test_outputs=None, tol printf("Cluster open failed !\\n"); pmsis_exit(-4); } - int cur_fc_freq = pi_freq_set(PI_FREQ_DOMAIN_FC, ${gen.opts['fc_freq']}); - if (cur_fc_freq == -1) + + /* Frequency Settings: defined in the Makefile */ + int cur_fc_freq = pi_freq_set(PI_FREQ_DOMAIN_FC, FREQ_FC*1000*1000); + int cur_cl_freq = pi_freq_set(PI_FREQ_DOMAIN_CL, FREQ_CL*1000*1000); + int cur_pe_freq = pi_freq_set(PI_FREQ_DOMAIN_PERIPH, FREQ_PE*1000*1000); + if (cur_fc_freq == -1 || cur_cl_freq == -1 || cur_pe_freq == -1) { printf("Error changing frequency !\\nTest failed...\\n"); pmsis_exit(-4); } + printf("FC Frequency as %d Hz, CL Frequency = %d Hz, PERIIPH Frequency = %d Hz\\n", + pi_freq_get(PI_FREQ_DOMAIN_FC), pi_freq_get(PI_FREQ_DOMAIN_CL), pi_freq_get(PI_FREQ_DOMAIN_PERIPH)); - int cur_cl_freq = pi_freq_set(PI_FREQ_DOMAIN_CL, ${gen.opts['cl_freq']}); - if (cur_cl_freq == -1) - { - printf("Error changing frequency !\\nTest failed...\\n"); - pmsis_exit(-5); - } -#ifdef __GAP9__ - pi_freq_set(PI_FREQ_DOMAIN_PERIPH, 250000000); -#endif #endif // IMPORTANT - MUST BE CALLED AFTER THE CLUSTER IS SWITCHED ON!!!! printf("Constructor\\n"); @@ -202,6 +198,15 @@ def generate_main_appl_make(G, gen, quantized, open_args=""): CLUSTER_SLAVE_STACK_SIZE=${gen.opts['cluster_slave_stack_size']} CLUSTER_NUM_CORES=${gen.opts['cluster_num_cores']} +# FLASH and RAM type +FLASH_TYPE = ${"MRAM" if gen.opts['l3_flash_device'] == 'AT_MEM_L3_MRAMFLASH' else \ + "QSPI" if gen.opts['l3_flash_device'] == 'AT_MEM_L3_QSPIFLASH' else \ + "OSPI" if gen.opts['l3_flash_device'] == 'AT_MEM_L3_OSPIFLASH' else \ + "HYPER"} +RAM_TYPE = ${"QSPI" if gen.opts['l3_ram_device'] == 'AT_MEM_L3_QSPIRAM' else \ + "OSPI" if gen.opts['l3_ram_device'] == 'AT_MEM_L3_OSPIRAM' else \ + "HYPER"} + NNTOOL_SCRIPT = nntool_script ${"APP_CFLAGS += -DSTD_FLOAT" if any(qrec[1].out_qs[0].dtype == np.float16 for qrec in G.quantization.sorted_iterator(G)) else ""} ${"APP_LDFLAGS += -lm" if gen.G.has_expressions and "FLOAT" in gen.G.quantization.schemes_present else ""} diff --git a/tools/nntool/generation/new_generators/general/transpose.py b/tools/nntool/generation/new_generators/general/transpose.py index 9b5c3dbae..6e513dc31 100644 --- a/tools/nntool/generation/new_generators/general/transpose.py +++ b/tools/nntool/generation/new_generators/general/transpose.py @@ -72,6 +72,10 @@ def __init__(self, cname, params, in_shape, real_transpose, qrec, perm_op=None, if qrec.out_qs[0].is_floating: gen_ctrl.float_dump = 1 + datasize = qrec.out_qs[0].dtype_bits//8 + if not qrec.out_qs[0].signed: + datasize = -datasize + attrs = { 'in_dim': params.in_dims[0], 'out_dim': params.out_dims[0], @@ -81,7 +85,7 @@ def __init__(self, cname, params, in_shape, real_transpose, qrec, perm_op=None, 'height': in_shape[1], 'width': in_shape[2], 'perm_op': perm_op, - 'datasize': (qrec.out_qs[0].dtype_bits//8) + 'datasize': datasize } # other attributes diff --git a/tools/nntool/generation/new_generators/mult8/pool_mult8.py b/tools/nntool/generation/new_generators/mult8/pool_mult8.py index 2294ea81c..f98a9e881 100644 --- a/tools/nntool/generation/new_generators/mult8/pool_mult8.py +++ b/tools/nntool/generation/new_generators/mult8/pool_mult8.py @@ -202,6 +202,11 @@ def __init__(self, node_name, cname, pool_params, pool_q, act_params, act_q, for LOG.debug("%s: generating pad control block", node_name) self.gen_ctrl.PadType = at_pad_ctrl + if not out_q.signed: + gen_ctrl.output_datasize = -out_q.dtype_bits//8 + if not in_q.signed: + gen_ctrl.input_datasize = -in_q.dtype_bits//8 + attrs = { 'in_size': in_q.dtype_bits//8 if in_q.signed else -in_q.dtype_bits//8, 'out_size': out_q.dtype_bits//8 if out_q.signed else -out_q.dtype_bits//8, diff --git a/tools/nntool/generation/project_template/Makefile b/tools/nntool/generation/project_template/Makefile index 71960b115..c1f528ea8 100644 --- a/tools/nntool/generation/project_template/Makefile +++ b/tools/nntool/generation/project_template/Makefile @@ -11,22 +11,46 @@ endif include common.mk include $(RULES_DIR)/at_common_decl.mk -io=stdout +io?=host -RAM_FLASH_TYPE ?= HYPER +FLASH_TYPE ?= HYPER +RAM_TYPE ?= HYPER #PMSIS_OS=freertos -ifeq '$(RAM_FLASH_TYPE)' 'HYPER' -APP_CFLAGS += -DUSE_HYPER -MODEL_L3_EXEC=hram -MODEL_L3_CONST=hflash -else -APP_CFLAGS += -DUSE_SPI -CONFIG_SPIRAM = 1 -MODEL_L3_EXEC=qspiram -MODEL_L3_CONST=qpsiflash +ifeq '$(FLASH_TYPE)' 'HYPER' + MODEL_L3_CONST=AT_MEM_L3_HFLASH +else ifeq '$(FLASH_TYPE)' 'MRAM' + MODEL_L3_CONST=AT_MEM_L3_MRAMFLASH + READFS_FLASH = target/chip/soc/mram +else ifeq '$(FLASH_TYPE)' 'QSPI' + MODEL_L3_CONST=AT_MEM_L3_QSPIFLASH + READFS_FLASH = target/board/devices/spiflash +else ifeq '$(FLASH_TYPE)' 'OSPI' + MODEL_L3_CONST=AT_MEM_L3_OSPIFLASH + READFS_FLASH = target/board/devices/ospiflash +endif + +ifeq '$(RAM_TYPE)' 'HYPER' + MODEL_L3_EXEC=AT_MEM_L3_HRAM +else ifeq '$(RAM_TYPE)' 'QSPI' + MODEL_L3_EXEC=AT_MEM_L3_QSPIRAM +else ifeq '$(RAM_TYPE)' 'OSPI' + MODEL_L3_EXEC=AT_MEM_L3_OSPIRAM endif +ifeq '$(TARGET_CHIP_FAMILY)' 'GAP9' +FREQ_CL?=370 +FREQ_FC?=370 +FREQ_PE?=370 +else +ifeq '$(TARGET_CHIP)' 'GAP8_V3' +FREQ_CL?=175 +else +FREQ_CL?=50 +endif +FREQ_FC?=250 +FREQ_PE?=250 +endif $(info Building NNTOOL model) NNTOOL_EXTRA_FLAGS ?= @@ -43,7 +67,7 @@ APP_CFLAGS += -g -O3 -mno-memcpy -fno-tree-loop-distribute-patterns APP_CFLAGS += -I. -I$(MODEL_COMMON_INC) -I$(TILER_EMU_INC) -I$(TILER_INC) $(CNN_LIB_INCLUDE) -I$(MODEL_BUILD) APP_CFLAGS += -DPERF -DAT_MODEL_PREFIX=$(MODEL_PREFIX) $(MODEL_SIZE_CFLAGS) APP_CFLAGS += -DSTACK_SIZE=$(CLUSTER_STACK_SIZE) -DSLAVE_STACK_SIZE=$(CLUSTER_SLAVE_STACK_SIZE) -APP_CFLAGS += -DAT_IMAGE=$(IMAGE) +APP_CFLAGS += -DAT_IMAGE=$(IMAGE) -DFREQ_FC=$(FREQ_FC) -DFREQ_CL=$(FREQ_CL) -DFREQ_PE=$(FREQ_PE) READFS_FILES=$(abspath $(MODEL_TENSORS)) diff --git a/tools/nntool/generation/project_template/common/model_decl.mk b/tools/nntool/generation/project_template/common/model_decl.mk index 1d0ba1b20..4f72f28e4 100644 --- a/tools/nntool/generation/project_template/common/model_decl.mk +++ b/tools/nntool/generation/project_template/common/model_decl.mk @@ -48,11 +48,21 @@ RM=rm -f NNTOOL?=nntool -TOTAL_STACK_SIZE=$(shell expr $(CLUSTER_STACK_SIZE) \+ $(CLUSTER_SLAVE_STACK_SIZE) \* 7) +ifeq '$(TARGET_CHIP_FAMILY)' 'GAP9' +CLUSTER_SLAVE_PE=8 +else ifeq '$(TARGET_CHIP_FAMILY)' 'GAP8' +CLUSTER_SLAVE_PE=7 +else + $(error TARGE_CHIP_FAMILY not found in env or not correct) +endif + +TOTAL_STACK_SIZE=$(shell expr $(CLUSTER_STACK_SIZE) \+ $(CLUSTER_SLAVE_STACK_SIZE) \* $(CLUSTER_SLAVE_PE)) MODEL_L1_MEMORY=$(shell expr $(TARGET_L1_SIZE) \- $(TOTAL_STACK_SIZE)) MODEL_L2_MEMORY=$(TARGET_L2_SIZE) MODEL_L3_MEMORY=$(TARGET_L3_SIZE) + + # hram - HyperBus RAM # qspiram - Quad SPI RA # hflash - HyperBus Flash diff --git a/tools/nntool/graph/manipulations/eliminate_transposes/eliminate_transposes.py b/tools/nntool/graph/manipulations/eliminate_transposes/eliminate_transposes.py index e1f13ee60..986119294 100644 --- a/tools/nntool/graph/manipulations/eliminate_transposes/eliminate_transposes.py +++ b/tools/nntool/graph/manipulations/eliminate_transposes/eliminate_transposes.py @@ -513,7 +513,7 @@ def continue_down(G, node, exclude_nodes, visited_nodes, cur_visited_nodes, cur_ if check_continue(visited_nodes, cur_visited_nodes, exclude_nodes, edge.to_node, 'down', edge.to_idx): continue new_actions, visited_down_nodes = search_down( - G, edge.to_node, exclude_nodes, visited_nodes | cur_visited_nodes, edge, transpose_history) + G, edge.to_node, exclude_nodes, visited_nodes | cur_visited_nodes, edge, transpose_history.copy()) cur_visited_nodes |= visited_down_nodes cur_actions += new_actions return cur_actions, cur_visited_nodes diff --git a/tools/nntool/graph/manipulations/formatter.py b/tools/nntool/graph/manipulations/formatter.py new file mode 100644 index 000000000..d3ff09531 --- /dev/null +++ b/tools/nntool/graph/manipulations/formatter.py @@ -0,0 +1,122 @@ +# Copyright (C) 2022 GreenWaves Technologies, SAS + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. + +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +from copy import deepcopy + +from graph.types import ImageFormatParameters, NNEdge, TransposeParameters +from quantization.qtype import QType +from utils.node_id import NodeId + + +def insert_formatter(G, input_node, formatter, normalizer): + format_node = ImageFormatParameters(input_node.name + "_formatter", + norm_func=normalizer.upper(), + format_change=formatter.upper()) + out_edges = G.out_edges(input_node.name) + + # dims updated to reflect formatter + if format_node.output_channels is not None and format_node.input_channels is not None: + out_dim = input_node.get_output_size(None)[0] + if formatter.upper() in ("BW8", "BW16"): + assert format_node.input_channels == 1 + in_dim = out_dim.clone() + format_node.out_dims_hint = input_node.out_dims_hint + format_node.in_dims_hint = input_node.out_dims_hint + input_node.dims = in_dim + for out_edge in out_edges: + G.remove_edge(out_edge) + else: + if not out_dim.is_named or out_dim.c != format_node.output_channels: + raise ValueError( + "current graph input is not named or does not match formatter output channels") + if formatter.upper() in ("RGB16", "BW16") and normalizer.upper() != "OUT_INT16": + raise ValueError( + "rgb16 and bw16 formatters must have out_int16 as normalization function") + in_dim = out_dim.clone() + in_dim.c = format_node.input_channels + in_dim.impose_order(("h", "w", "c")) + format_node.in_dims_hint = [["h", "w", "c"]] + input_node.dims = in_dim + if input_node.fixed_order: + new_out_edges = [] + for out_edge in out_edges: + if isinstance(out_edge.to_node, TransposeParameters): + trans_node = out_edge.to_node + transpose_edges = G.out_edges(trans_node.name) + new_out_edges.extend(transpose_edges) + G.remove(trans_node) + if G.quantization: + nid = NodeId(trans_node) + if nid in G.quantization: + del G.quantization[NodeId(trans_node)] + else: + new_out_edges.append(out_edge) + out_edges = new_out_edges + else: + input_node.fixed_order = True + for out_edge in out_edges: + G.remove_edge(out_edge) + format_node.out_dims_hint = [["c", "h", "w"]] * len(out_edges) + input_node.out_dims_hint = [["h", "w", "c"]] + G.node_options[NodeId(input_node)] = input_node.at_options + # qrec updated to reflect formatter + input_qrec = G.quantization and G.quantization.get(NodeId(input_node)) + if input_qrec and format_node.input_dtype and format_node.output_dtype: + formatter_qrec = G.quantization.get(NodeId(format_node)) + if not formatter_qrec: + if input_qrec.out_qs[0].dtype != format_node.output_dtype: + raise ValueError( + "current graph input output quantization does not match formatter output") + formatter_qrec = deepcopy(input_qrec) + formatter_qrec.out_qs[0] = deepcopy(formatter_qrec.out_qs[0]) + if formatter_qrec.ktype.startswith('scaled'): + formatter_in_q = QType( + scale=1, zero_point=0, dtype=format_node.input_dtype) + elif formatter_qrec.ktype.startswith('symmetric'): + formatter_in_q = QType(q=0, dtype=format_node.input_dtype) + else: + raise NotImplementedError("quantization has unknown type") + if len(formatter_qrec.in_qs) > 0: + formatter_qrec.in_qs[0] = formatter_in_q + input_qrec.in_qs[0] = formatter_in_q + else: + formatter_qrec.in_qs.append(formatter_in_q) + input_qrec.in_qs.append(formatter_in_q) + input_qrec.out_qs[0] = formatter_in_q + G.quantization[NodeId(format_node)] = formatter_qrec + + G.add_node(format_node) + G.add_edge(NNEdge(input_node, format_node)) + for out_edge in out_edges: + G.add_edge(NNEdge(format_node, out_edge.to_node, to_idx=out_edge.to_idx)) + + +def remove_formatter(G, fmt_node): + input_edges = G.in_edges(fmt_node.name) + assert len(input_edges) == 1, "formatter node should only have one input" + input_node = input_edges[0].from_node + fmt_edges = G.out_edges(fmt_node.name) + fmt_qrec = G.quantization and G.quantization.get(NodeId(fmt_node)) + G.remove(fmt_node) + + input_node.dims = fmt_node.out_dims[0] + input_node.out_dims_hint = fmt_node.out_dims_hint + for fmt_edge in fmt_edges: + G.add_edge(NNEdge(input_node, fmt_edge.to_node, to_idx=fmt_edge.to_idx)) + if fmt_qrec: + input_qrec = G.quantization[NodeId(input_node)] + input_qrec.out_qs = fmt_qrec.out_qs + input_qrec.in_qs = fmt_qrec.out_qs + G.quantization.remove_node(fmt_node) diff --git a/tools/nntool/graph/matches/matchers/batchnorm_to_discrete_ops.py b/tools/nntool/graph/matches/matchers/batchnorm_to_discrete_ops.py new file mode 100644 index 000000000..9b7e9ae39 --- /dev/null +++ b/tools/nntool/graph/matches/matchers/batchnorm_to_discrete_ops.py @@ -0,0 +1,70 @@ +# Copyright (C) 2020 GreenWaves Technologies, SAS + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. + +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +import logging + +import numpy as np +from graph.dim import Dim +from graph.types import (ConstantInputParameters, MatrixSubParameters, + NNEdge) +from graph.types.conv2d import BatchNormalizationParameters +from graph.types.tensor_arithmetic import MatrixMulParameters +from utils.graph import GraphView + +from ..matcher import Matcher, match_name, description, groups, run_qtune_on_match + +LOG = logging.getLogger("nntool." + __name__) + + +@match_name('batchnorm_to_discrete_ops') +@description('Convert BatchNormParameters into a set of broadcasted operations') +@groups('scaled', 'symmetric') +class FuseBatchnorm(Matcher): + + def _match(self, G: GraphView, set_identity: bool = True, **kwargs): + + has_modified_graph = False + for bn_node in G.nodes(node_classes=BatchNormalizationParameters): + w_bn = bn_node.scale / \ + np.sqrt(bn_node.epsilon + bn_node.running_variance) + b_bn = bn_node.bias - bn_node.running_mean * bn_node.scale / \ + np.sqrt(bn_node.running_variance + bn_node.epsilon) + + mul_params = MatrixMulParameters( + G.unique_name(f"{bn_node.name}_mul")) + add_params = MatrixSubParameters( + G.unique_name(f"{bn_node.name}_add")) + broadcasted_shape = [1 if i != bn_node.axis else dim for i, dim in enumerate( + bn_node.in_dims[0].shape)] + scale_node = ConstantInputParameters(G.unique_name(f"{bn_node.name}_scale"), value=w_bn.reshape( + broadcasted_shape), dims=Dim.unnamed(broadcasted_shape)) + bias_node = ConstantInputParameters(G.unique_name(f"{bn_node.name}_bias"), value=b_bn.reshape( + broadcasted_shape), dims=Dim.unnamed(broadcasted_shape)) + + from_node = G.in_edges(bn_node)[0].from_node + to_node = G.out_edges(bn_node)[0].to_node + G.remove(bn_node) + G.add_edge(NNEdge(from_node, mul_params)) + G.add_edge(NNEdge(scale_node, mul_params, to_idx=1)) + G.add_edge(NNEdge(mul_params, add_params)) + G.add_edge(NNEdge(bias_node, add_params, to_idx=1)) + G.add_edge(NNEdge(add_params, to_node)) + + has_modified_graph = True + + if set_identity: + self.set_identity(G) + + return has_modified_graph diff --git a/tools/nntool/graph/matches/matchers/concat_slice.py b/tools/nntool/graph/matches/matchers/concat_slice.py index ef6fb82b6..3fa4f2c44 100644 --- a/tools/nntool/graph/matches/matchers/concat_slice.py +++ b/tools/nntool/graph/matches/matchers/concat_slice.py @@ -163,7 +163,7 @@ def eliminate_slice(self, G, concat, slice_node, remove_nodes, concat_in_idx, re elif slice_node.changes_shape: reshape = ReshapeParameters( G.unique_name(f'{slice_node.name}_reshape'), - old_shape=slice_node.post_slice_shape, + old_shape=slice_node.slice_shape, shape=slice_node.out_shape) else: reshape = None diff --git a/tools/nntool/graph/matches/matchers/concat_split.py b/tools/nntool/graph/matches/matchers/concat_split.py index e6a362b0c..d253489a2 100644 --- a/tools/nntool/graph/matches/matchers/concat_split.py +++ b/tools/nntool/graph/matches/matchers/concat_split.py @@ -14,11 +14,13 @@ # along with this program. If not, see . import logging +from graph.matches.match_utils import search_up from graph.types import ConcatParameters, NNEdge, SplitParameters +from graph.types.others import CopyParameters from utils.graph import GraphView -from ..matcher import Matcher, description, groups, match_name +from ..matcher import Matcher, description, groups, match_name, run_before LOG = logging.getLogger("nntool." + __name__) @@ -26,6 +28,7 @@ @groups('*') @match_name("concat_split") @description("removes concat/split pair where all in edges on the concat match the out edges on the split") +@run_before('insert_copies') class ConcatSplitMatch(Matcher): def _match(self, G: GraphView, set_identity: bool = True, **kwargs) -> bool: @@ -35,11 +38,11 @@ def _match(self, G: GraphView, set_identity: bool = True, **kwargs) -> bool: if len(in_edges) > 1: continue in_edge = in_edges[0] - if not isinstance(in_edge.from_node, ConcatParameters): - continue - concat_node = in_edge.from_node - if len(G.out_edges(concat_node.name)) > 1: + edges = search_up(G, in_edge, ConcatParameters, can_pass=(CopyParameters,), multi_on_target=False) + if not edges: continue + nodes = [split_node] + [edge.from_node for edge in edges] + concat_node = nodes[-1] if concat_node.axis != split_node.axis: continue axis = concat_node.axis @@ -54,8 +57,7 @@ def _match(self, G: GraphView, set_identity: bool = True, **kwargs) -> bool: concat_node.name, split_node.name) concat_in_edges = G.indexed_in_edges(concat_node.name) split_out_edges = G.indexed_out_edges(split_node.name) - G.remove(split_node) - G.remove(concat_node) + G.remove_all(nodes) for idx, in_edge in enumerate(concat_in_edges): for out_edge in split_out_edges[idx]: G.add_edge(NNEdge(from_node=in_edge.from_node, from_idx=in_edge.from_idx, diff --git a/tools/nntool/graph/matches/matchers/expand_to_reshape.py b/tools/nntool/graph/matches/matchers/expand_to_reshape.py new file mode 100644 index 000000000..547f0852b --- /dev/null +++ b/tools/nntool/graph/matches/matchers/expand_to_reshape.py @@ -0,0 +1,50 @@ +# Copyright (C) 2020 GreenWaves Technologies, SAS + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +from graph.manipulations.eliminate_transposes.transpose_helpers import strip_ones +from graph.types.others import ExpandParameters, TransposeParameters +import logging + +from graph.dim import Dim +from graph.types import NNEdge, ReshapeParameters +from utils.graph import GraphView +from utils.node_id import NodeId + +from ..matcher import Matcher, match_name, description, run_before, groups, needs_valid_dimension + +LOG = logging.getLogger("nntool." + __name__) + +@match_name("expand_to_reshape") +@description("remove expands that are really just reshapes") +@run_before('*') +@groups('*') +@needs_valid_dimension(True) +class ExpandToReshape(Matcher): + + def _match(self, G: GraphView, set_identity: bool = True, **kwargs): + modified_graph = False + for node in G.nodes(node_classes=ExpandParameters): + in_shape = node.in_dims[0].shape + out_shape = node.out_dims[0].shape + if strip_ones(in_shape) != strip_ones(out_shape): + continue + LOG.info(f'replacing expand {node.name} with a reshape') + reshape = ReshapeParameters(G.unique_name(f'{node.name}_reshape'), old_shape=in_shape, shape=out_shape) + G.replace_node(node, reshape) + modified_graph = True + + if set_identity: + self.set_identity(G) + + return modified_graph diff --git a/tools/nntool/graph/matches/matchers/fuse_batchnorm.py b/tools/nntool/graph/matches/matchers/fuse_batchnorm.py new file mode 100644 index 000000000..57722664f --- /dev/null +++ b/tools/nntool/graph/matches/matchers/fuse_batchnorm.py @@ -0,0 +1,87 @@ +# Copyright (C) 2020 GreenWaves Technologies, SAS + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. + +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +import logging + +import numpy as np +from graph.types import (ConstantInputParameters, MatMulOpParameters, MatMulTransposedParameters, + NNEdge) +from graph.types.conv2d import BatchNormalizationParameters +from utils.graph import GraphView + +from ..matcher import Matcher, match_name, description, groups, run_qtune_on_match + +LOG = logging.getLogger("nntool." + __name__) + + +@match_name('fuse_batchnorm') +@description('Fuse batch normalization into MatMul') +@groups('scaled', 'symmetric') +@run_qtune_on_match +class FuseBatchnorm(Matcher): + + def _match(self, G: GraphView, set_identity: bool = True, **kwargs): + + has_modified_graph = False + nodes = [] + for node in G.nodes(node_classes=BatchNormalizationParameters): + in_node = G.indexed_in_edges(node)[0].from_node + if isinstance(in_node, MatMulOpParameters): + nodes.append((node, in_node)) + + for bn_node, filt_node in nodes: + filt_in_edges = G.indexed_in_edges(filt_node.name) + weights_node = filt_in_edges[1].from_node + biases_node = filt_in_edges[2].from_node if len( + filt_in_edges) > 2 else None + w_bn = bn_node.scale / np.sqrt(bn_node.epsilon + bn_node.running_variance) + if not isinstance(weights_node, ConstantInputParameters): + continue + weights = weights_node.dqvalue + if len(w_bn) > 1: + if not isinstance(filt_node, MatMulTransposedParameters): + weights = np.swapaxes(weights.copy(), -2, -1) + if weights.shape[-2] != len(w_bn): + LOG.info(f'{filt_node.name} - weights shape does not match batch norm') + continue + if biases_node is None: + biases = np.zeros((weights.shape[-1],)) + biases_node = ConstantInputParameters( + G.unique_name(f'{filt_node.name}_biases'), value=biases) + G.add_edge(NNEdge(from_node=biases, + to_node=filt_node, to_idx=2)) + elif not isinstance(biases_node, ConstantInputParameters): + continue + else: + biases = biases_node.dqvalue + # fold batch norm into conv weights and biases + if len(w_bn) > 1: + w_bn = np.diag(w_bn) + weights = np.matmul(w_bn, weights) + else: + weights = weights * w_bn + biases = bn_node.bias + ((biases - bn_node.running_mean) * + bn_node.scale / np.sqrt(bn_node.running_variance + bn_node.epsilon)) + if len(w_bn) > 1 and not isinstance(filt_node, MatMulTransposedParameters): + weights = np.swapaxes(weights, -2, -1) + weights_node.value = weights + biases_node.value = biases + G.remove_and_reconnect(bn_node, edge_class=NNEdge) + has_modified_graph = True + + if set_identity: + self.set_identity(G) + + return has_modified_graph diff --git a/tools/nntool/graph/matches/matchers/fuse_gap_convs.py b/tools/nntool/graph/matches/matchers/fuse_gap_convs.py index 1b4c368cd..beecee70c 100644 --- a/tools/nntool/graph/matches/matchers/fuse_gap_convs.py +++ b/tools/nntool/graph/matches/matchers/fuse_gap_convs.py @@ -25,10 +25,9 @@ TanHActivationParameters) from graph.types.base import NNNodeRef from graph.types.fusions import FusionInputParameters, FusionOutputParameters -from utils.graph import GraphView, NodeRef +from utils.graph import GraphView -from ..matcher import (Matcher, description, groups, match_name, - run_adjust_on_match, run_qtune_on_match) +from ..matcher import (Matcher, description, groups, match_name, run_qtune_on_match) LOG = logging.getLogger("nntool." + __name__) @@ -47,6 +46,8 @@ 'conv_max_active', 'conv_average_active', 'conv_active_max', + 'conv_max', + 'conv_average', ) VALID_ACTIVATIONS_POW2 = ( @@ -62,6 +63,8 @@ 'conv_max_active', 'conv_average_active', 'conv_active_max', + 'conv_max', + 'conv_average', ) @@ -120,8 +123,8 @@ def add_node(self, params, in_fusion=False): try: for cnode in params.contained_nodes(): self.add_node(cnode, in_fusion=True) - except MergeStopError: # @IgnoreException - raise MergeAbortError() + except MergeStopError: + raise MergeAbortError() # @IgnoreException elif isinstance(params, Conv2DParameters): if self.conv or not self.can_add(params): raise MergeStopError() # @IgnoreException @@ -201,7 +204,9 @@ def fusion_type(self): @groups('*') @match_name("fuse_gap_convs") @run_qtune_on_match -@description('Fuse convolutions, pools and activations to match GAP AutoTiler operations') +@description( + 'Fuse convolutions, pools and activations to match GAP AutoTiler operations. Pooling and activation nodes' + ' are also fused into existing convolution fusions.') class MatchAllGapConv(Matcher): def _match(self, G: GraphView, set_identity: bool = True, **kwargs): has_modified_graph = False diff --git a/tools/nntool/graph/matches/matchers/gather_to_split.py b/tools/nntool/graph/matches/matchers/gather_to_split.py index 05aae2550..3acd9dc47 100644 --- a/tools/nntool/graph/matches/matchers/gather_to_split.py +++ b/tools/nntool/graph/matches/matchers/gather_to_split.py @@ -37,6 +37,8 @@ def _match(self, G: GraphView, set_identity: bool = True, **kwargs) -> bool: group = gathers_by_origin.setdefault((in_edge.from_node, in_edge.from_idx), []) group.append(gather) for in_edge, gathers in gathers_by_origin.items(): + if len(gathers[0].indices.shape) > 1: + continue # This is too difficult to handle if there are multiple slices axis = gathers[0].axis if not all(gather.axis == axis and len(gather.indices.shape) <= 1 diff --git a/tools/nntool/graph/matches/matchers/move_node_up.py b/tools/nntool/graph/matches/matchers/move_node_up.py index 9522f7dcf..36c815b66 100644 --- a/tools/nntool/graph/matches/matchers/move_node_up.py +++ b/tools/nntool/graph/matches/matchers/move_node_up.py @@ -161,7 +161,7 @@ class MoveActivationsMatcherScale8(MoveNodeUpMatcher): @run_before('fuse_gap_convs', 'fuse_gap_linear', 'fuse_gap_pool', 'fuse_op_activation_scale8') class MoveMaxPoolMatcherScale8(MoveNodeUpMatcher): - ValidNodesToPass = (ReluActivationParameters,) + ValidNodesToPass = (ReluActivationParameters, ConcatParameters) ValidFusions = (Conv2DParameters, FcParameters) ValidNodes = (lambda node: isinstance( node, PoolingParameters) and node.pool_type == "max",) diff --git a/tools/nntool/graph/matches/matchers/rnn_unpack.py b/tools/nntool/graph/matches/matchers/rnn_unpack.py index cbbd746d6..bbf2d3316 100644 --- a/tools/nntool/graph/matches/matchers/rnn_unpack.py +++ b/tools/nntool/graph/matches/matchers/rnn_unpack.py @@ -291,7 +291,7 @@ def _match(self, G: GraphView, set_identity: bool = True, **kwargs): if changes_shape: reshape = ReshapeParameters(unpack_node.name + '_reshape', old_shape=Dim.unnamed( - unpack_node.post_slice_shape), + unpack_node.slice_shape), shape=Dim.unnamed(unpack_node.out_shape)) G.add_edge(NNEdge(from_node=in_edge.from_node, to_node=reshape, from_idx=in_edge.from_idx)) diff --git a/tools/nntool/graph/matches/matchers/slice_to_split.py b/tools/nntool/graph/matches/matchers/slice_to_split.py index 53ab42b5a..74a577db7 100644 --- a/tools/nntool/graph/matches/matchers/slice_to_split.py +++ b/tools/nntool/graph/matches/matchers/slice_to_split.py @@ -140,9 +140,11 @@ def slice_to_split(G, slice_nodes, slices): axis_dim = in_dims[axis] outs = [] splits = [] + two_unused = axis_slice[0] > 0 and axis_slice[1] < axis_dim if axis_slice[0] > 0: + two_unused = True splits.append(axis_slice[0]) - oparams = OutputParameters(G.unique_name('unused')) + oparams = OutputParameters(G.unique_name(f'{slice_node.name}_unused{0 if two_unused else ""}')) oparams.at_options.allocate = 1 outs.append( ((oparams, 0),)) @@ -151,7 +153,7 @@ def slice_to_split(G, slice_nodes, slices): for edge in G.out_edges(slice_node.name)]) if axis_slice[1] < axis_dim: splits.append(axis_dim - axis_slice[1]) - oparams = OutputParameters(G.unique_name('unused')) + oparams = OutputParameters(G.unique_name(f'{slice_node.name}_unused{1 if two_unused else ""}')) oparams.at_options.allocate = 1 outs.append( ((oparams, 0),)) diff --git a/tools/nntool/graph/nngraph.py b/tools/nntool/graph/nngraph.py index 4448d913b..f7d83da0e 100644 --- a/tools/nntool/graph/nngraph.py +++ b/tools/nntool/graph/nngraph.py @@ -16,13 +16,19 @@ import logging import os import re -from typing import Callable, Generator, Sequence, Tuple, Union +from typing import Any, Callable, Generator, Mapping, Sequence, Tuple, Union import numpy as np +from execution.graph_executer import GraphExecuter +from execution.quantization_mode import QuantizationMode +from interpreter.commands.qtune import SCHEME_NAME_MAPPINGS from quantization.quantization_set import QuantizationSet +from quantization.quantizer.new_quantizer import NewQuantizer from reports.graph_reporter import GraphReporter +from stats.activation_ranges_collector import ActivationRangesCollector from utils.graph import Graph, Node from utils.node_id import NodeId +from utils.stats_funcs import cos_similarity, qsnr from utils.tabular import TextTableRenderer from graph.dim import Dim @@ -33,6 +39,7 @@ from graph.manipulations.dimensions import add_dimensions from graph.manipulations.liveness import calculate_liveness from graph.matches.fusions import fusions +from graph.matches.matches import get_fusions from graph.types import (ConstantInputParameters, InputBaseParameters, InputParameters, MultiplicativeBiasParameters, OutputParameters, ResizerParameters, @@ -383,10 +390,10 @@ def add_input(self, dim: Union[Dim, Tuple[int]], name: str = None, **kwargs) -> def add_constant(self, dim: Union[Dim, Tuple[int]] = None, name: str = None, value: np.ndarray = None, - adjust_transpose: Sequence[int]=None, + adjust_transpose: Sequence[int] = None, is_mutated=False, is_intermediate=False, - short_name: str=None) -> NNNodeRef: + short_name: str = None) -> NNNodeRef: """Creates a constant node Args: @@ -401,7 +408,8 @@ def add_constant(self, dim: Union[Dim, Tuple[int]] = None, Returns: NNNodeRef: A reference to the Node in the Graph """ - node_name = name if name else self.unique_name(f"constant_{self.num_constants}") + node_name = name if name else self.unique_name( + f"constant_{self.num_constants}") node = ConstantInputParameters(node_name, dims=dim, value=value, adjust_transpose=adjust_transpose, @@ -445,7 +453,14 @@ def nodes_iterator(self, yield_fusions=True): yield (step_idx, node, fusion_idx, fnode) yield (step_idx, node, None, None) - def adjust_order(self, reshape_weights=True, no_postprocess=False, debug_function: Callable=None, steps: int=None, single_step=False): + def adjust_order( + self, + reshape_weights=True, + no_postprocess=False, + debug_function: Callable = None, + steps: int = None, + single_step=False + ): """Adjusts tensor order to match selected kernels Args: @@ -461,6 +476,15 @@ def adjust_order(self, reshape_weights=True, no_postprocess=False, debug_functio LOG.info("adjusted order") self.graph_identity.is_adjusted = True + @staticmethod + def get_fusions(): + """Returns a dictionary of all the fusion/graph optimization pass names and descriptions + + Returns: + Dict[str, str]: Names and descriptions of graph optimisation passes + """ + return get_fusions() + def fusions(self, *match_names, no_postprocess: bool = False): """Run matchers on the graph @@ -470,7 +494,10 @@ def fusions(self, *match_names, no_postprocess: bool = False): """ fusions(self, *match_names, no_postprocess=no_postprocess) - def add_dimensions(self, quiet=False): + def add_dimensions( + self, + quiet=False + ): """Add dimensions to the graph and calculate execution order and liveness Args: @@ -485,7 +512,121 @@ def add_dimensions(self, quiet=False): self, self.graph_state.steps) - def balance_filters(self, step_idx: int=None, precision_threshold=0.20): + def collect_statistics( + self, + input_tensors_iterator: Union[Sequence[Sequence[np.ndarray]], Sequence[np.ndarray]] + ) -> Mapping[Union[str, Tuple[str, str]], Mapping]: + """Collect tensor statistics for quantization + + Args: + input_tensors_iterator (Union[Sequence[Sequence[np.ndarray]], Sequence[np.ndarray]]): + If the graph has a single input this can just be an iterator over numpy arrays. If the graph has + multiple inputs then it should be an iterator over sequences of numpy arrays. + + Returns: + Mapping[Union[str, Tuple[str, str]], Mapping]: Mapping of statistics for each node's inputs and outputs + """ + stats_collector = ActivationRangesCollector() + for input_tensors in input_tensors_iterator: + if isinstance(input_tensors, np.ndarray): + input_tensors = [input_tensors] + stats_collector.collect_stats(self, input_tensors) + return {k.key: v for k, v in stats_collector.stats.items()} + + @staticmethod + def qsnrs(tensors1, tensors2, idx=0): + return tuple([qsnr(t1[idx], t2[idx]) if len(t1) > idx and len(t2) > idx else None for t1, t2 in zip(tensors1, tensors2)]) + + @staticmethod + def cos_sim(tensors1, tensors2, idx=0): + return tuple([cos_similarity(t1[idx], t2[idx]) if len(t1) > idx and len(t2) > idx else None for t1, t2 in zip(tensors1, tensors2)]) + + def quantize( + self, + statistics: Mapping[Union[str, Tuple[str, str]], Mapping] = None, + schemes: Sequence[str] = None, + graph_options: Mapping[str, Any] = None, + node_options: Mapping[Union[str, Tuple[str, str]], + Mapping[str, Any]] = None, + read_existing_options = True + ) -> None: + """Quantize the graph + + Args: + statistics (Mapping[Union[str, Tuple[str, str]], Mapping], optional): Statistics collected by the NNGraph.collect_statistics + method. + schemes (Sequence[], optional): Sequence of schemes "scaled", "pow2", or "float" to use in priority order. If None use scaled. Defaults to None. + graph_options (Mapping[str, Any], optional): Quantization options to set for the whole graph. Defaults to None. + node_options (Mapping[Union[str, Tuple[str, str]], Mapping[str, Any]], optional): + Quantization options to set for specific nodes. The map key should be the node name or if the node is inside a fusion + then a tuple of the fusion name and the node name. Defaults to None. + read_existing_options (bool, optional): Incorporate existing quantization options and schemes in the graph. Leaving this as + True and just supplying graph_option, node_options and/or schemes is the equivalent of the nntool qtune command + """ + quantizer = NewQuantizer(self) + if schemes: + for scheme in schemes: + scheme = scheme.lower() + if scheme not in SCHEME_NAME_MAPPINGS: + raise ValueError(f'invalid scheme name {scheme}') + quantizer.schemes.append(SCHEME_NAME_MAPPINGS[scheme]) + elif 'SQ8' not in quantizer.schemes: + quantizer.schemes.append('SQ8') + options = {} + if graph_options: + options.update(graph_options) + if node_options: + options.update({NodeId(name) if isinstance(name, str) else NodeId(*name): v + for name, v in node_options.items()}) + quantizer.set_stats(statistics) + quantizer.update_options(options) + quantizer.quantize() + + def execute( + self, + input_tensors: Union[np.ndarray, Sequence[np.ndarray]], + quantize=False, + dequantize=False, + output_fusion_tensors=False + ) -> Sequence[Sequence[np.ndarray]]: + """Runs inference on the graph + + Args: + input_tensors (Union[np.ndarray, Sequence[np.ndarray]]): + Numpy arrays containing inputs (which should be normalized and in float) + If there is only one input it can be specified without a sequence. + quantize (bool, optional): Run the graph using quantization parameters. Defaults to False. + dequantize (bool, optional): Dequantize outputs. Implies quantize. Defaults to False. + output_fusion_tensors (bool, optional): Output outputs from nodes that have been fused. Defaults to False. + + Raises: + ValueError: Incorrect parameters + + Returns: + Sequence[Sequence[np.ndarray]]: List of lists of outputs of each node in the graph. If output_fusion_tensors + is True this will also include the output of nodes contained inside fusions (except fused expressions) + """ + if dequantize: + quantize = True + if quantize: + if self.quantization is None or not self.quantization.verify_quantization(self): + raise ValueError('graph is not quantized') + if dequantize: + qmode = QuantizationMode.all_dequantize() + else: + qmode = QuantizationMode.all() + else: + qmode = QuantizationMode.none() + if isinstance(input_tensors, np.ndarray): + input_tensors = [input_tensors] + executer = GraphExecuter(self, self.quantization) + return executer.execute(input_tensors, qmode=qmode, append_fusion_output=output_fusion_tensors) + + def balance_filters( + self, + step_idx: int = None, + precision_threshold=0.20 + ): """Experimental filter balancing routines Args: diff --git a/tools/nntool/graph/types/base.py b/tools/nntool/graph/types/base.py index e80eb5223..a75113604 100644 --- a/tools/nntool/graph/types/base.py +++ b/tools/nntool/graph/types/base.py @@ -28,14 +28,6 @@ LOG = logging.getLogger("nntool." + __name__) -class ParameterError(Exception): - pass - - -class CantPromoteQError(ParameterError): - pass - - class NodeOptions(OptionList): def __init__(self, *args, **kwargs): super(NodeOptions, self).__init__(*args, **kwargs) @@ -253,13 +245,6 @@ def value(self): def value(self, val): self._value = val - @property - def can_promoteq(self): - return False - - def promoteq(self): - raise CantPromoteQError() - @property def in_dims(self): return self._in_dims diff --git a/tools/nntool/graph/types/conv2d.py b/tools/nntool/graph/types/conv2d.py index b9444314f..3e7b7bed2 100644 --- a/tools/nntool/graph/types/conv2d.py +++ b/tools/nntool/graph/types/conv2d.py @@ -27,7 +27,7 @@ class BatchNormalizationParameters(NoSizeChangeParameters, SingleInputAndOutput, SensitiveToOrder): #pylint: disable-msg=too-many-arguments - def __init__(self, name, scale=None, bias=None, running_mean=None, + def __init__(self, name, scale=None, bias=None, running_mean=None, axis=0, running_variance=None, spatial=None, momentum=None, epsilon=None, **kwargs): super(BatchNormalizationParameters, self).__init__(name, **kwargs) self.scale = scale @@ -37,6 +37,7 @@ def __init__(self, name, scale=None, bias=None, running_mean=None, self.spatial = spatial self.momentum = momentum self.epsilon = epsilon + self.axis = axis @property def can_equalize(self): diff --git a/tools/nntool/graph/types/expression_fusion.py b/tools/nntool/graph/types/expression_fusion.py index 43afedf3b..554027cc2 100644 --- a/tools/nntool/graph/types/expression_fusion.py +++ b/tools/nntool/graph/types/expression_fusion.py @@ -18,6 +18,7 @@ from collections import Counter from expressions.symbolic.function_collection import FunctionCollection +from expressions.symbolic.iteration_space import Assignments from expressions.symbolic.symbol import Constant, Variable from utils.node_id import NodeId @@ -138,9 +139,9 @@ def details_collector(self, stats, stat, details): def is_same_operation_as(self, G, other): if not isinstance(other, ExpressionFusionParameters): return False - if len(self.func_col.functions) != 1 or len(other.func_col.functions) != 1: + if len(self.func_col) != 1 or len(other.func_col) != 1: return False - if next(iter(self.func_col.functions.values())).equivalent(next(iter(other.func_col.functions.values()))): + if self.func_col[0][1].equivalent(other.func_col[0][1]): return True return False @@ -156,7 +157,7 @@ def decompose(self, qrecs=None): LOG.info("expression decomposed into %s intermediate and %s output expressions", len(intermediates), len(outputs)) - expressions = [] + expressions = Assignments() inter_vars = {node: Variable( node.name, shape=node.dims.shape) for node in inputs} # TODO - Intermediates are not sorted here so there may be interdependences @@ -172,38 +173,37 @@ def decompose(self, qrecs=None): variable=variable, qrecs=qrecs) inter_vars[node] = variable - expressions.append(expr) + expressions.add(*expr) for node in outputs: expr = self.compose_expression( self.subgraph, node, inter_vars, qrecs=qrecs) - expressions.append(expr) + expressions.add(*expr) # sort the inputs by idx inputs = sorted([node for node in inputs], key=lambda x: x.idx) outputs = sorted([node for node in outputs], key=lambda x: x.idx) - func_col = FunctionCollection(expressions) - return [node.name for node in inputs], [node.name for node in outputs], func_col + return [node.name for node in inputs], [node.name for node in outputs], expressions def get_output_size(self, in_dims): # the input shapes may have changed so the expression variables shapes could have # changed and the iterators will need to be recalculated - dim_change = False + # dim_change = False in_vars = [self.func_col.variables[name] for name in self.input_symbols] for idx, dim in enumerate(in_dims): shape = tuple(dim.shape) if tuple(in_vars[idx].shape) != shape: in_vars[idx].shape = shape - dim_change = True - if dim_change: - self.func_col.set_var_shapes() + # dim_change = True + # if dim_change: + # self.func_col.set_var_shapes() out_dims = super().get_output_size(in_dims) - if dim_change: # if the input shapes haven't changed then the output shapes have not changed - out_vars = [self.func_col.variables[name] for name in self.output_symbols] - for idx, dim in enumerate(out_dims): - out_vars[idx].shape = tuple(dim.shape) - self.func_col.init_indexes() # recalculate the iterators + # if dim_change: # if the input shapes haven't changed then the output shapes have not changed + # out_vars = [self.func_col.variables[name] for name in self.output_symbols] + # for idx, dim in enumerate(out_dims): + # out_vars[idx].shape = tuple(dim.shape) + # self.func_col.init_indexes() # recalculate the iterators return out_dims def __str__(self): diff --git a/tools/nntool/graph/types/others.py b/tools/nntool/graph/types/others.py index 70bacc828..f22874cc6 100644 --- a/tools/nntool/graph/types/others.py +++ b/tools/nntool/graph/types/others.py @@ -142,7 +142,7 @@ def __str__(self): @cls_op_name('expand') -class ExpandParameters(Parameters, InsensitiveToQuantization): +class ExpandParameters(Parameters, SensitiveToOrder, InsensitiveToQuantization): def __init__(self, *args, shape=None, **kwargs): super(ExpandParameters, self).__init__(*args, **kwargs) self.shape = shape @@ -178,6 +178,26 @@ def get_output_size(self, in_dims): def __str__(self): return f"{self.shape}" +@cls_op_name('scatternd') +class ScatterNdParameters(Parameters, SensitiveToOrder): + def __init__(self, *args, indices=None, updates=None, reduction=None, **kwargs): + super(ScatterNdParameters, self).__init__(*args, **kwargs) + self.indices = indices + self.updates = updates + self.reduction = reduction + + def get_parameter_size(self): + return 0 + + @property + def can_equalize(self): + return False + + def get_output_size(self, in_dims): + return [Dim.unnamed(in_dims[0].shape)] + + def __str__(self): + return "" @cls_op_name('quantize') class QuantizeParameters(Parameters, ComparableParameters): @@ -429,8 +449,6 @@ def __init__(self, *args, super(StridedSliceParameters, self).__init__(*args, **kwargs) self.act_slice = act_slice - self.slice_shape = tuple( - int(abs(math.ceil((sl[1] - sl[0])/sl[2]))) for sl in self.act_slice) self.out_shape = tuple(out_shape) @property @@ -443,27 +461,17 @@ def graph_anon_label(self): @property def slice_shape(self): - return self._slice_shape - - @slice_shape.setter - def slice_shape(self, val): - self._slice_shape = tuple(val) + return tuple( + int(abs(math.ceil((max(sl[1], -1) - max(sl[0], -1))/sl[2]))) for sl in self.act_slice) @property def slices_axes(self): in_shape = self.in_dims[0].shape - return tuple(idx for idx, shapes in enumerate(zip(self.post_slice_shape, in_shape)) if shapes[0] != shapes[1]) - - @property - def post_slice_shape(self): - old_settings = np.seterr(all='raise') - res = tuple(abs(((sl[1] if sl[1] >= -1 else -1) - sl[0])//sl[2]) for sl in self.act_slice) - np.seterr(**old_settings) - return res + return tuple(idx for idx, shapes in enumerate(zip(self.slice_shape, in_shape)) if shapes[0] != shapes[1]) @property def changes_shape(self): - return self.post_slice_shape != self.out_shape + return self.slice_shape != self.out_shape @property def can_equalize(self): @@ -509,7 +517,7 @@ def does_nothing(self) -> bool: def no_model_code(self) -> bool: if not self.in_dims: return False - return self.post_slice_shape == tuple(self.in_dims[0].shape) + return self.slice_shape == tuple(self.in_dims[0].shape) def get_parameter_size(self): return 0 diff --git a/tools/nntool/importer/common/constant_mixin.py b/tools/nntool/importer/common/constant_mixin.py index ddaae71d0..8cc879542 100644 --- a/tools/nntool/importer/common/constant_mixin.py +++ b/tools/nntool/importer/common/constant_mixin.py @@ -47,3 +47,12 @@ def record_constant_qrec(cls, inp, cnode, **kwargs): if qrecs is None: return qrecs[NodeId(cnode)] = QRec.scaled(out_qs=[qtype]) + + @classmethod + def move_stat(cls, inp, new_name, **kwargs): + cnid = NodeId(new_name) + onid = NodeId(inp[0]) + qopts = kwargs.get('qopts', {}) + if onid in qopts: + qopts[cnid] = qopts[onid] + del qopts[onid] diff --git a/tools/nntool/importer/onnx/common/__init__.py b/tools/nntool/importer/onnx/common/__init__.py index 834daa668..e238b949c 100644 --- a/tools/nntool/importer/onnx/common/__init__.py +++ b/tools/nntool/importer/onnx/common/__init__.py @@ -4,7 +4,20 @@ from onnx import TensorProto, mapping, helper -logger = logging.getLogger('nntool.' + __name__) +_logger = logging.getLogger('nntool.' + __name__) + +class logger: + @staticmethod + def info(*args, **kwargs): + _logger.info(*args, **kwargs) + + @staticmethod + def warning(*args, **kwargs): + _logger.warning(*args, **kwargs) + + @staticmethod + def debug(*args, **kwargs): + _logger.debug(*args, **kwargs) def get_unique_suffix(): """ Get unique suffix by using first 8 chars from uuid.uuid4 diff --git a/tools/nntool/importer/onnx/common/handler_helper.py b/tools/nntool/importer/onnx/common/handler_helper.py index e6d32a8bf..6d4723a46 100644 --- a/tools/nntool/importer/onnx/common/handler_helper.py +++ b/tools/nntool/importer/onnx/common/handler_helper.py @@ -87,6 +87,7 @@ def get_all_backend_handlers(opset_dict): return handlers + def get_backend_coverage(): """ Get backend coverage for document. diff --git a/tools/nntool/importer/onnx/handlers/backend/add.py b/tools/nntool/importer/onnx/handlers/backend/add.py index 7b5dcff3a..fa67f4db9 100644 --- a/tools/nntool/importer/onnx/handlers/backend/add.py +++ b/tools/nntool/importer/onnx/handlers/backend/add.py @@ -37,3 +37,7 @@ def version_7(cls, node, **kwargs): @classmethod def version_13(cls, node, **kwargs): return cls._common(node, **kwargs) + + @classmethod + def version_14(cls, node, **kwargs): + return cls._common(node, **kwargs) diff --git a/tools/nntool/importer/onnx/handlers/backend/batch_normalization.py b/tools/nntool/importer/onnx/handlers/backend/batch_normalization.py index 0f01ef96a..645c72b30 100644 --- a/tools/nntool/importer/onnx/handlers/backend/batch_normalization.py +++ b/tools/nntool/importer/onnx/handlers/backend/batch_normalization.py @@ -95,7 +95,8 @@ def _common(cls, node, **kwargs): params = BatchNormalizationParameters(valid_name, scale=bn_scale, bias=bn_bias, running_mean=running_mean, running_variance=running_variance, spatial=spatial, - momentum=momentum, epsilon=epsilon) + momentum=momentum, epsilon=epsilon, + axis=0) G.add_edge(NNEdge(from_node=x[0], to_node=params, from_idx=x[1], to_idx=0)) all_nodes[node.output[0]] = (params, 0, deepcopy(x[2]), None) return params @@ -115,3 +116,11 @@ def version_7(cls, node, **kwargs): @classmethod def version_9(cls, node, **kwargs): return cls._common(node, **kwargs) + + @classmethod + def version_14(cls, node, **kwargs): + return cls._common(node, **kwargs) + + @classmethod + def version_15(cls, node, **kwargs): + return cls._common(node, **kwargs) diff --git a/tools/nntool/importer/onnx/handlers/backend/concat_mixin.py b/tools/nntool/importer/onnx/handlers/backend/concat_mixin.py index a5a658467..0663e06c4 100644 --- a/tools/nntool/importer/onnx/handlers/backend/concat_mixin.py +++ b/tools/nntool/importer/onnx/handlers/backend/concat_mixin.py @@ -32,7 +32,7 @@ def gen_concat(cls, node, inputs, axis, **kwargs): all_nodes = kwargs['all_nodes'] G = kwargs['G'] valid_name = kwargs['valid_name'] - inputs = [all_nodes[inp] for inp in node.input] + inputs = [all_nodes[inp] for inp in node.input if all_nodes[inp][2].shape] input_shapes = [inp[2].shape for inp in inputs] axis_sum = sum(shape[axis] for shape in input_shapes) axis = axis if axis >= 0 else len(input_shapes[0]) + axis diff --git a/tools/nntool/importer/onnx/handlers/backend/conv_mixin.py b/tools/nntool/importer/onnx/handlers/backend/conv_mixin.py index a672c75a5..920394d11 100644 --- a/tools/nntool/importer/onnx/handlers/backend/conv_mixin.py +++ b/tools/nntool/importer/onnx/handlers/backend/conv_mixin.py @@ -17,6 +17,7 @@ from copy import deepcopy import numpy as np +from sklearn.utils import resample from graph.dim import Conv2DFilterDim, DilationDim, Dim, StrideDim from graph.types import (ConstantInputParameters, Conv2DParameters, NNEdge, ReshapeParameters) @@ -86,7 +87,9 @@ def conv(cls, node, quantized=False, **kwargs): # M x C/group x kH x kW weights_idx = 3 if quantized else 1 weights_node = inputs[weights_idx][0] - weights_node.name = f'{valid_name}_weights' + new_name = f'{valid_name}_weights' + cls.move_stat(inputs[weights_idx], new_name, **kwargs) + weights_node.name = new_name weights = cls.get_constant(inputs[weights_idx]) out_c = weights.shape[0] group = node.attrs.get("group", 1) @@ -203,6 +206,11 @@ def conv(cls, node, quantized=False, **kwargs): # check if input needs a reshape if conv_in_shape != real_in_shape: + # if batch is present add it back + if batch is not None: + conv_in_shape = (batch,) + conv_in_shape + if np.prod(real_in_shape) != np.prod(conv_in_shape): + raise ValueError(f'shape inference issue {valid_name} filter indicates {conv_in_shape} but has an input of {real_in_shape}') r1_params = ReshapeParameters(f'{valid_name}_reshape_in', old_shape=Dim.unnamed(real_in_shape), shape=Dim.unnamed(conv_in_shape)) diff --git a/tools/nntool/importer/onnx/handlers/backend/conv_transpose.py b/tools/nntool/importer/onnx/handlers/backend/conv_transpose.py index cddd73fb2..17bd0f764 100644 --- a/tools/nntool/importer/onnx/handlers/backend/conv_transpose.py +++ b/tools/nntool/importer/onnx/handlers/backend/conv_transpose.py @@ -120,7 +120,7 @@ def _common(cls, node, **kwargs): dims=Dim.unnamed( biases.shape)) - padding, dilations, strides, output_padding = cls.calc_shapes(node, spatial_size, Dim2D((h, w)), Dim2D((filt_h, filt_w))) + padding, dilations, strides, output_padding = cls.calc_shapes(node, spatial_size, Dim2D(h, w), Dim2D(filt_h, filt_w)) params = TransposeConv2DParameters(valid_name, filt=filt_dim, diff --git a/tools/nntool/importer/onnx/handlers/backend/div.py b/tools/nntool/importer/onnx/handlers/backend/div.py index 39c9bc963..c668dd043 100644 --- a/tools/nntool/importer/onnx/handlers/backend/div.py +++ b/tools/nntool/importer/onnx/handlers/backend/div.py @@ -38,3 +38,7 @@ def version_7(cls, node, **kwargs): @classmethod def version_13(cls, node, **kwargs): return cls._common(node, **kwargs) + + @classmethod + def version_14(cls, node, **kwargs): + return cls._common(node, **kwargs) diff --git a/tools/nntool/importer/onnx/handlers/backend/expand.py b/tools/nntool/importer/onnx/handlers/backend/expand.py index dd83c73c4..fa7026a8f 100644 --- a/tools/nntool/importer/onnx/handlers/backend/expand.py +++ b/tools/nntool/importer/onnx/handlers/backend/expand.py @@ -17,10 +17,11 @@ from graph.types import ConstantInputParameters, ExpandParameters from graph.types.base import NNEdge from importer.common.constant_mixin import ConstantMixin +from importer.common.provisional_dim import ProvisionalDim from importer.onnx.common import logger from ..backend_handler import BackendHandler -from ..handler import onnx_op, constant_only +from ..handler import constant_only, onnx_op from .broadcast_mixin import BroadcastMixin @@ -38,7 +39,6 @@ def _common(cls, node, **kwargs): y = inputs[1] shape = cls.get_constant(y) - pshape = cls.broadcast_to(x, shape) if cls.is_constant(x): logger.info("reducing %s to a constant", valid_name) x_val = cls.get_constant(x) @@ -47,7 +47,7 @@ def _common(cls, node, **kwargs): params = ExpandParameters(valid_name, shape=shape) G.add_edge(NNEdge(x[0], params, from_idx=x[1])) - all_nodes[node.output[0]] = (params, 0, pshape, x[3]) + all_nodes[node.output[0]] = (params, 0, ProvisionalDim(shape), x[3]) return params @classmethod diff --git a/tools/nntool/importer/onnx/handlers/backend/gather.py b/tools/nntool/importer/onnx/handlers/backend/gather.py index 911396330..b86f44828 100644 --- a/tools/nntool/importer/onnx/handlers/backend/gather.py +++ b/tools/nntool/importer/onnx/handlers/backend/gather.py @@ -38,11 +38,16 @@ def _common(cls, node, **kwargs): x = inputs[0] x_shape = x[2].shape y = inputs[1] + y_shape = y[2].shape indices = cls.get_constant(y) axis = node.attrs.get('axis', 0) - pshape = ProvisionalDim( - x_shape[:axis:] + list(indices.shape) + x_shape[axis + 1:]) + if not y_shape: + pshape = ProvisionalDim( + x_shape[:axis:] + x_shape[axis + 1:]) + else: + pshape = ProvisionalDim( + x_shape[:axis:] + list(indices.shape) + x_shape[axis + 1:]) if cls.is_constant(x): x_val = cls.get_constant(x) logger.info( @@ -57,7 +62,10 @@ def _common(cls, node, **kwargs): out_shape = pshape.known_shape.copy() params = StridedSliceParameters( valid_name, act_slice=act_slice, out_shape=out_shape) - if params.post_slice_shape == tuple(x[2].known_shape): + if params.slice_shape == tuple(x[2].known_shape): + if np.ndim(indices) == 0 and pshape.shape[idx] is not None: + del out_shape[idx] + pshape = ProvisionalDim(out_shape) params = ReshapeParameters(valid_name, old_shape=tuple( x[2].known_shape), shape=out_shape) else: diff --git a/tools/nntool/importer/onnx/handlers/backend/gru.py b/tools/nntool/importer/onnx/handlers/backend/gru.py index 6e6bb8c2d..72625db7b 100644 --- a/tools/nntool/importer/onnx/handlers/backend/gru.py +++ b/tools/nntool/importer/onnx/handlers/backend/gru.py @@ -94,3 +94,7 @@ def version_3(cls, node, **kwargs): @classmethod def version_7(cls, node, **kwargs): return cls._common(node, **kwargs) + + @classmethod + def version_14(cls, node, **kwargs): + return cls._common(node, **kwargs) diff --git a/tools/nntool/importer/onnx/handlers/backend/lstm.py b/tools/nntool/importer/onnx/handlers/backend/lstm.py index c043fd030..230aa0835 100644 --- a/tools/nntool/importer/onnx/handlers/backend/lstm.py +++ b/tools/nntool/importer/onnx/handlers/backend/lstm.py @@ -81,3 +81,7 @@ def version_1(cls, node, **kwargs): @classmethod def version_7(cls, node, **kwargs): return cls._common(node, **kwargs) + + @classmethod + def version_14(cls, node, **kwargs): + return cls._common(node, **kwargs) diff --git a/tools/nntool/importer/onnx/handlers/backend/mul.py b/tools/nntool/importer/onnx/handlers/backend/mul.py index da171f978..6c8f7f1d4 100644 --- a/tools/nntool/importer/onnx/handlers/backend/mul.py +++ b/tools/nntool/importer/onnx/handlers/backend/mul.py @@ -36,3 +36,7 @@ def version_7(cls, node, **kwargs): @classmethod def version_13(cls, node, **kwargs): return cls._common(node, **kwargs) + + @classmethod + def version_14(cls, node, **kwargs): + return cls._common(node, **kwargs) diff --git a/tools/nntool/importer/onnx/handlers/backend/nncf_fake_quantize.py b/tools/nntool/importer/onnx/handlers/backend/nncf_fake_quantize.py index ff395a6c3..9d322f005 100644 --- a/tools/nntool/importer/onnx/handlers/backend/nncf_fake_quantize.py +++ b/tools/nntool/importer/onnx/handlers/backend/nncf_fake_quantize.py @@ -18,6 +18,7 @@ import numpy as np from importer.common.constant_mixin import ConstantMixin from quantization.qtype import QType +from utils.node_id import NodeId from ..backend_handler import BackendHandler from ..handler import domain, onnx_op @@ -38,8 +39,7 @@ def _common(cls, node, **kwargs): if auto_broadcast != 'numpy': raise ValueError(f'{valid_name} - only numpy is supported for auto_broadcast') - qstats = kwargs.get('quant_stats', {}) - qopts = kwargs.get('quant_opts', {}) + qopts = kwargs.get('qopts', {}) x = inputs[0] # input_low = inputs[1] # input_high = inputs[2] @@ -54,6 +54,7 @@ def _common(cls, node, **kwargs): raise ValueError(f"{valid_name} - don't know how to handle more than {math.pow(2, 16)} levels") bits = int(math.log2(levels)) + qopts.setdefault(NodeId(x[0]), {'output_size': [None] * (x[1] + 1)})['output_size'][x[1]] = bits low_shape = output_low.shape high_shape = output_high.shape bc_dims_low = sum(1 for dim in high_shape if dim > 1) diff --git a/tools/nntool/importer/onnx/handlers/backend/range.py b/tools/nntool/importer/onnx/handlers/backend/range.py new file mode 100644 index 000000000..242544e0f --- /dev/null +++ b/tools/nntool/importer/onnx/handlers/backend/range.py @@ -0,0 +1,47 @@ +# Copyright (C) 2020 GreenWaves Technologies, SAS + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. + +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +import numpy as np +from graph.types import ConstantInputParameters +from importer.common.constant_mixin import ConstantMixin +from importer.common.provisional_dim import ProvisionalDim + +from ..backend_handler import BackendHandler +from ..handler import constant_only, onnx_op + + +@onnx_op("Range") +@constant_only(True) +class Range(BackendHandler, ConstantMixin): + + @classmethod + def _common(cls, node, **kwargs): + all_nodes = kwargs['all_nodes'] + G = kwargs['G'] + valid_name = kwargs['valid_name'] + value = node.attrs.get('value', 0) + inputs = [all_nodes[inp] if inp else None for inp in node.input] + if len(inputs) != 3: + raise ValueError(f'Range {valid_name} does not have 3 inputs') + start, limit, delta = [cls.get_constant(x) for x in inputs] + value = np.arange(start, limit, delta, dtype=start.dtype) + params = ConstantInputParameters(valid_name, + value=value) + all_nodes[node.output[0]] = (params, 0, ProvisionalDim(value.shape), None) + return params + + @classmethod + def version_11(cls, node, **kwargs): + return cls._common(node, **kwargs) diff --git a/tools/nntool/importer/onnx/handlers/backend/reducer_mixin.py b/tools/nntool/importer/onnx/handlers/backend/reducer_mixin.py index 1d126bda0..945fed447 100644 --- a/tools/nntool/importer/onnx/handlers/backend/reducer_mixin.py +++ b/tools/nntool/importer/onnx/handlers/backend/reducer_mixin.py @@ -13,6 +13,8 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . +from functools import reduce + from graph.dim import Dim from graph.types import (ConstantInputParameters, GlobalPoolingParameters, NNEdge, NoOPParameters) @@ -20,6 +22,15 @@ from importer.common.provisional_dim import ProvisionalDim from importer.onnx.common import logger +def axis_reduction(shape, axes): + def reduction(state, idx_dim): + idx, dim = idx_dim + if dim is None: + return state[0], state[1] + if idx in axes: + return state[0] + 1, state[1] + [state[0]] + return state[0] + 1, state[1] + return tuple(reduce(reduction, enumerate(shape), (0,[]))[1]) class ReducerMixin(ConstantMixin): @classmethod @@ -43,8 +54,7 @@ def _common(cls, node, copy_qtype=False, constant_operation=None, **kwargs): x_rank for axis in axes), "axis out of bounds" keep_dims = node.attrs.get('keepdims', 1) - stripped_axes = [axis for axis in axes if x_shape[axis] is not None] - + stripped_axes = axis_reduction(x_shape, axes) if not stripped_axes: params = NoOPParameters(valid_name) pout_shape = x_shape.copy() @@ -57,22 +67,16 @@ def _common(cls, node, copy_qtype=False, constant_operation=None, **kwargs): else: pout_shape = [dim for idx, dim in enumerate( x_shape) if idx not in axes] - # if all(dim is None for dim in pout_shape): - # pout_shape.append(1) - # subtract 1 from axis for all None's preceeding it and remove - # axes that are not defined - axes = [ax - sum([1 if dim is None else 0 for dim in x_shape[:ax:]]) - for ax in stripped_axes] if cls.is_constant(x) and constant_operation: - val = constant_operation(cls.get_constant(x), axis=tuple(axes), keepdims=keep_dims) + val = constant_operation(cls.get_constant(x), axis=stripped_axes, keepdims=keep_dims) if val.size < 10: logger.info("reducing %s to a constant %s", valid_name, val) else: logger.info("reducing %s to a constant", valid_name) params = ConstantInputParameters(valid_name, value=val, dims=Dim.unnamed(val.shape)) else: - params = GlobalPoolingParameters(valid_name, pool_type=reduce_type, axis=tuple(axes), + params = GlobalPoolingParameters(valid_name, pool_type=reduce_type, axis=stripped_axes, keep_dims=keep_dims) G.add_edge( diff --git a/tools/nntool/importer/onnx/handlers/backend/relu.py b/tools/nntool/importer/onnx/handlers/backend/relu.py index 432208acc..626460a54 100644 --- a/tools/nntool/importer/onnx/handlers/backend/relu.py +++ b/tools/nntool/importer/onnx/handlers/backend/relu.py @@ -42,3 +42,7 @@ def version_6(cls, node, **kwargs): @classmethod def version_13(cls, node, **kwargs): return cls._common(node, **kwargs) + + @classmethod + def version_14(cls, node, **kwargs): + return cls._common(node, **kwargs) diff --git a/tools/nntool/importer/onnx/handlers/backend/reshape.py b/tools/nntool/importer/onnx/handlers/backend/reshape.py index d5f0dda54..ab930b296 100644 --- a/tools/nntool/importer/onnx/handlers/backend/reshape.py +++ b/tools/nntool/importer/onnx/handlers/backend/reshape.py @@ -111,3 +111,7 @@ def version_5(cls, node, **kwargs): @classmethod def version_13(cls, node, **kwargs): return cls._common(node, **kwargs) + + @classmethod + def version_14(cls, node, **kwargs): + return cls._common(node, **kwargs) diff --git a/tools/nntool/importer/onnx/handlers/backend/resize.py b/tools/nntool/importer/onnx/handlers/backend/resize.py index f5545d46a..0b3d42eda 100644 --- a/tools/nntool/importer/onnx/handlers/backend/resize.py +++ b/tools/nntool/importer/onnx/handlers/backend/resize.py @@ -14,8 +14,10 @@ # along with this program. If not, see . import numpy as np +from pytest import param from graph.dim import Dim from graph.types import NNEdge, ReshapeParameters +from graph.types.constant_input import ConstantInputParameters from graph.types.resizers import (BilinearResizerParameters, NearestNeighborResizerParameters) from importer.common.constant_mixin import ConstantMixin @@ -51,6 +53,13 @@ def _common(cls, node, scales, sizes, nearest_mode='round_prefer_ceil', **kwargs else: sizes = [None if x_shape[idx] is None else dim for idx, dim in enumerate(sizes)] + + if np.prod([sz for sz in sizes if sz is not None]) == 0: + logger.warn(f'{valid_name} has null output shape') + params = ConstantInputParameters(valid_name, value=np.array([])) + all_nodes[node.output[0]] = (params, 0, ProvisionalDim([]), x[3]) + return params + if spatial_size == 1: sizes.insert(-1, 1) diff --git a/tools/nntool/importer/onnx/handlers/backend/rnn.py b/tools/nntool/importer/onnx/handlers/backend/rnn.py index ce22a6340..a871f2719 100644 --- a/tools/nntool/importer/onnx/handlers/backend/rnn.py +++ b/tools/nntool/importer/onnx/handlers/backend/rnn.py @@ -80,3 +80,7 @@ def version_1(cls, node, **kwargs): @classmethod def version_7(cls, node, **kwargs): return cls._common(node, **kwargs) + + @classmethod + def version_14(cls, node, **kwargs): + return cls._common(node, **kwargs) diff --git a/tools/nntool/importer/onnx/handlers/backend/rnn_mixin.py b/tools/nntool/importer/onnx/handlers/backend/rnn_mixin.py index 6f8a17329..eac9090bc 100644 --- a/tools/nntool/importer/onnx/handlers/backend/rnn_mixin.py +++ b/tools/nntool/importer/onnx/handlers/backend/rnn_mixin.py @@ -121,6 +121,13 @@ def attach_rnn(G, x, rnn_params_class, extra_args, valid_name, tensors, t = tensors['forward' if i == 0 else 'backward'] for idx, name in enumerate(rnn_params.INPUT_NAMES): if name == 'input': + # x_shape = x[2].shape + # new_shape = [x_shape[0] if x_shape[0] is not None else 1, x_shape[-1]] + # reshape_param = ReshapeParameters(f"{valid_name}_reshape", old_shape=x_shape, shape=new_shape) + # G.add_edge( + # NNEdge(from_node=x[0], to_node=reshape_param, from_idx=x[1], to_idx=0)) + # G.add_edge( + # NNEdge(from_node=reshape_param, to_node=rnn_params, from_idx=0, to_idx=0)) G.add_edge( NNEdge(from_node=x[0], to_node=rnn_params, from_idx=x[1], to_idx=0)) continue diff --git a/tools/nntool/importer/onnx/handlers/backend/scatternd.py b/tools/nntool/importer/onnx/handlers/backend/scatternd.py new file mode 100644 index 000000000..9e3b6b3a0 --- /dev/null +++ b/tools/nntool/importer/onnx/handlers/backend/scatternd.py @@ -0,0 +1,83 @@ +# Copyright (C) 2020 GreenWaves Technologies, SAS + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. + +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +import numpy as np +from graph.types import ConstantInputParameters, NNEdge +from graph.types.others import ScatterNdParameters +from importer.common.constant_mixin import ConstantMixin +from importer.common.provisional_dim import ProvisionalDim +from importer.onnx.common import logger + +from ..backend_handler import BackendHandler +from ..handler import onnx_op, partial_support, ps_description + +def scatter_nd_impl(data, indices, updates, reduction='none'): + # Check tensor shapes + assert indices.shape[-1] <= len(data.shape) + assert updates.shape == indices.shape[:-1] + data.shape[indices.shape[-1]:] + + # Compute output + output = np.copy(data) + for i in np.ndindex(indices.shape[:-1]): + if reduction == 'add': + output[indices[i]] += updates[i] + elif reduction == 'mul': + output[indices[i]] *= updates[i] + else: + output[indices[i]] = updates[i] + return output + +@onnx_op("ScatterND") +@partial_support(True) +@ps_description('ScatterND is only supported at input and is not supported by nntool or autotiler kernels') +class ScatterND(ConstantMixin, BackendHandler): + + @classmethod + def _common(cls, node, **kwargs): + all_nodes = kwargs['all_nodes'] + G = kwargs['G'] + valid_name = kwargs['valid_name'] + inputs = [all_nodes[inp] for inp in node.input] + x = inputs[0] + x_shape = x[2].shape + indices = cls.get_constant(inputs[1]) + updates = inputs[2] + reduction = node.attrs.get('reduction', None) + + pshape = ProvisionalDim(x_shape) + if cls.is_constant(x) and cls.is_constant(updates): + logger.info("reducing %s to a constant", valid_name) + x_val = cls.get_constant(x) + updates_val = cls.get_constant(updates) + params = ConstantInputParameters(valid_name, value=scatter_nd_impl(x_val, indices, updates_val, reduction=reduction)) + else: + logger.warning(f'{valid_name} ScatterND is not currently supported in the nntool or Autotiler kernels') + params = ScatterNdParameters(valid_name, indices=indices, updates=updates, reduction=reduction) + G.add_edge(NNEdge(from_node=x[0], to_node=params, from_idx=x[1], to_idx=0)) + G.add_edge(NNEdge(from_node=updates[0], to_node=params, from_idx=updates[1], to_idx=1)) + all_nodes[node.output[0]] = (params, 0, pshape, x[3]) + return params + + @classmethod + def version_11(cls, node, **kwargs): + return cls._common(node, **kwargs) + + @classmethod + def version_13(cls, node, **kwargs): + return cls._common(node, **kwargs) + + @classmethod + def version_16(cls, node, **kwargs): + return cls._common(node, **kwargs) diff --git a/tools/nntool/importer/onnx/handlers/backend/sub.py b/tools/nntool/importer/onnx/handlers/backend/sub.py index 866db635c..a290997c3 100644 --- a/tools/nntool/importer/onnx/handlers/backend/sub.py +++ b/tools/nntool/importer/onnx/handlers/backend/sub.py @@ -35,3 +35,7 @@ def version_7(cls, node, **kwargs): @classmethod def version_13(cls, node, **kwargs): return cls._common(node, **kwargs) + + @classmethod + def version_14(cls, node, **kwargs): + return cls._common(node, **kwargs) diff --git a/tools/nntool/importer/onnx/handlers/backend/thresholded_relu.py b/tools/nntool/importer/onnx/handlers/backend/thresholded_relu.py new file mode 100644 index 000000000..b23f6f5f5 --- /dev/null +++ b/tools/nntool/importer/onnx/handlers/backend/thresholded_relu.py @@ -0,0 +1,40 @@ +# Copyright (C) 2020 GreenWaves Technologies, SAS + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. + +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +# TODO - This is not mappable onto our current kernels. To add if needed by a customer + +# import numpy as np +# from graph.types.activations import ReluActivationParameters +# from importer.onnx.handlers.backend.math_mixin import BasicMathMixin + +# from ..backend_handler import BackendHandler +# from ..handler import onnx_op + + +# @onnx_op("ThresholdedRelu") +# class ThresholdedRelu(BasicMathMixin, BackendHandler): + +# @classmethod +# def _common(cls, node, **kwargs): +# alpha = node.attrs.get('alpha', 1.0) +# return super(ThresholdedRelu, cls)._common(node, +# params_class=ReluActivationParameters, +# constant_operation=lambda x: np.clip(x, alpha, np.inf), +# params_args={'lower_limit': alpha}, +# **kwargs) + +# @classmethod +# def version_10(cls, node, **kwargs): +# return cls._common(node, **kwargs) diff --git a/tools/nntool/importer/onnx/handlers/backend/unsqueeze.py b/tools/nntool/importer/onnx/handlers/backend/unsqueeze.py index 3314062eb..9cbc10f71 100644 --- a/tools/nntool/importer/onnx/handlers/backend/unsqueeze.py +++ b/tools/nntool/importer/onnx/handlers/backend/unsqueeze.py @@ -36,7 +36,7 @@ def _common(cls, node, **kwargs): out_rank = len(x_shape) + len(kwargs['axes']) axes = cls._resolve_negative_ranks(kwargs['axes'], out_rank) - old_shape = x_shape.copy() + old_shape = list(x_shape) new_shape = [1 if new_idx in axes else old_shape.pop(0) for new_idx in range(out_rank)] diff --git a/tools/nntool/importer/onnx/handlers/backend/upsample.py b/tools/nntool/importer/onnx/handlers/backend/upsample.py new file mode 100644 index 000000000..048a620c4 --- /dev/null +++ b/tools/nntool/importer/onnx/handlers/backend/upsample.py @@ -0,0 +1,117 @@ +# Copyright (C) 2020 GreenWaves Technologies, SAS + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. + +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +import numpy as np +from graph.dim import Dim +from graph.types import NNEdge, ReshapeParameters +from graph.types.constant_input import ConstantInputParameters +from graph.types.resizers import (BilinearResizerParameters, + NearestNeighborResizerParameters) +from importer.common.constant_mixin import ConstantMixin +from importer.common.provisional_dim import ProvisionalDim +from importer.onnx.common import logger +from pytest import param + +from ..backend_handler import BackendHandler +from ..handler import onnx_op + + +@onnx_op("Upsample") +class Upsample(ConstantMixin, BackendHandler): + + @classmethod + def _common(cls, node, inputs, scales, **kwargs): + all_nodes = kwargs['all_nodes'] + G = kwargs['G'] + valid_name = kwargs['valid_name'] + x = inputs[0] + x_shape = x[2].shape + x_rank = len(x_shape) + + mode = node.attrs.get('mode', 'nearest') + + spatial_size = x_rank - 2 + in_c = x_shape[1] + in_w = x_shape[-1] + sizes = [int(shape * scale) if shape is not None else None + for shape, scale in zip(x_shape, scales)] + + if np.prod([sz for sz in sizes if sz is not None]) == 0: + logger.warn(f'{valid_name} has null output shape') + params = ConstantInputParameters(valid_name, value=np.array([])) + all_nodes[node.output[0]] = (params, 0, ProvisionalDim([]), x[3]) + return params + + if spatial_size == 1: + sizes.insert(-1, 1) + + if spatial_size != 2 and spatial_size != 1: + raise ValueError('resize only supports 4D tensor in NCHW mode or 3D tensor in NCF mode' + f' - input shape is {x_shape} sizes is {sizes}') + + if not all(x_dim == size_dim for x_dim, size_dim in zip(x_shape[:2:], sizes[:2:])): + raise ValueError('resize only supports 4D tensor in NCHW mode or 3D tensor in NCF mode' + f' - input shape is {x_shape} sizes is {sizes}') + + params_class = BilinearResizerParameters if mode == 'linear' else NearestNeighborResizerParameters + + params = params_class(valid_name, + new_shape=tuple(sizes[2::]), + align_corners=False, + halfpixel_centers=False, + in_dims_hint=[['c', 'h', 'w']], + out_dims_hint=[['c', 'h', 'w']]) + + if spatial_size == 1: + r1_params = ReshapeParameters(f'{valid_name}_reshape2d', + old_shape=Dim.unnamed([in_c, in_w]), + shape=Dim.unnamed([in_c, 1, in_w])) + r2_params = ReshapeParameters(f'{valid_name}_reshape1d', + old_shape=Dim.unnamed( + [in_c, 1, sizes[-1]]), + shape=Dim.unnamed([in_c, sizes[-1]])) + G.add_edge( + NNEdge(from_node=x[0], to_node=r1_params, from_idx=x[1], to_idx=0)) + G.add_edge(NNEdge(from_node=r1_params, + to_node=params, from_idx=0, to_idx=0)) + G.add_edge(NNEdge(from_node=params, + to_node=r2_params, from_idx=0, to_idx=0)) + pout_dims = ProvisionalDim(sizes[:-2:] + sizes[-1::]) + params = r2_params + else: + pout_dims = ProvisionalDim(sizes) + G.add_edge( + NNEdge(from_node=x[0], to_node=params, from_idx=x[1], to_idx=0)) + + all_nodes[node.output[0]] = (params, 0, pout_dims, x[3]) + return params + + @classmethod + def version_7(cls, node, **kwargs): + all_nodes = kwargs['all_nodes'] + inputs = [all_nodes[inp] if inp else None for inp in node.input] + scales = node.attrs['scales'] + return cls._common(node, inputs, scales, **kwargs) + + @classmethod + def version_9(cls, node, **kwargs): + all_nodes = kwargs['all_nodes'] + inputs = [all_nodes[inp] if inp else None for inp in node.input] + scales = cls.get_constant(inputs[1]) + return cls._common(node, inputs, scales, **kwargs) + + @classmethod + def version_10(cls, node, **kwargs): + return cls.version_9(node, **kwargs) diff --git a/tools/nntool/importer/onnx/onnx.py b/tools/nntool/importer/onnx/onnx.py index a89f4d71f..13032d210 100644 --- a/tools/nntool/importer/onnx/onnx.py +++ b/tools/nntool/importer/onnx/onnx.py @@ -70,7 +70,8 @@ def create_graph(self, filename, opts) -> NNGraph: opset_import = model.opset_import G = NNGraph(filename=filename, name=opts.get('name')) - G, qrecs = self._import_onnx_model(G, model.graph, opset_import, opts) + G, qrecs, qopts = self._import_onnx_model( + G, model.graph, opset_import, opts) G.add_dimensions(quiet=True) if qrecs: propagate_qrecs(G, qrecs) @@ -78,6 +79,7 @@ def create_graph(self, filename, opts) -> NNGraph: qset.update(qrecs) qset.scheme_priority = ['SQ8'] qset.schemes_present = {'SQ8'} + qset.options = qopts G.quantization = qset try: quantizer = NewQuantizer(G) @@ -88,9 +90,10 @@ def create_graph(self, filename, opts) -> NNGraph: clean_dangling_nodes(G) MatchDuplicateConstants().match(G) + G.add_dimensions(quiet=True) return G - def _update_qrecs(self, G, qrecs, all_nodes, ranges_dict): + def _update_qrecs(self, G, qrecs, all_nodes, ranges_dict, qopts): for node, idx, _, qtype in all_nodes.values(): if qtype is None and node.name not in ranges_dict.keys(): continue @@ -107,8 +110,11 @@ def _update_qrecs(self, G, qrecs, all_nodes, ranges_dict): if node.name in ranges_dict.keys(): out_min, out_max = ranges_dict[node.name]["range"] dtype = ranges_dict[node.name].get("dtype", np.int8) - bits = ranges_dict[node.name].get("n_bits", 8) + bits = ranges_dict[node.name].get("bits", 8) channel = ranges_dict[node.name].get("per_channel", None) + qopt = qopts.setdefault( + nid, {'output_size': [None] * len(G.indexed_out_edges(node))}) + qopt['output_size'][idx] = bits qtype = QType.from_min_max_sq( out_min, out_max, dtype=dtype, bits=bits, quantized_dimension=channel) qrec.out_qs[idx] = qtype @@ -127,14 +133,16 @@ def _import_onnx_model(self, G, graph, opset, opts): input_shapes=opts.get('input_shapes', {})) all_nodes.update(inputs) qrecs = {} + qopts = {} outputs = self._get_output_nodes( G, graph.output, substitutions=opts.get('substitutions', None)) shapes = {elem.name: elem.type for elem in graph.value_info} self._import_nodes( G, graph, self._handlers, all_nodes, outputs, - opts=opts, qrecs=qrecs, shapes=shapes) - self._update_qrecs(G, qrecs, all_nodes, opts.get('ranges_dict', {})) - return G, qrecs + opts=opts, qrecs=qrecs, shapes=shapes, qopts=qopts) + self._update_qrecs(G, qrecs, all_nodes, + opts.get('ranges_dict', {}), qopts) + return G, qrecs, qopts def import_subgraph(self, G, graph, opts, all_nodes=None): if all_nodes is None: @@ -153,7 +161,7 @@ def import_subgraph(self, G, graph, opts, all_nodes=None): self._import_nodes( G, graph, self._handlers, all_nodes, outputs, opts=opts, qrecs=qrecs) - self._update_qrecs(G, qrecs, all_nodes, {}) + self._update_qrecs(G, qrecs, all_nodes, {}, {}) return G, qrecs @staticmethod @@ -331,9 +339,14 @@ def _import_nodes(self, G, graph, handlers, all_nodes, outputs, **kwargs): continue handler = handlers[node.domain].get( node.op_type, None) if node.domain in handlers else None - if not handler or (handler.CONSTANT_ONLY and - not all(isinstance(all_nodes[inp_name][0], ConstantInputParameters) - for inp_name in node.input)): + if (handler and handler.CONSTANT_ONLY and + not all(isinstance(all_nodes[inp_name][0], ConstantInputParameters) + for inp_name in node.input)): + logger.warning( + f'{node.name} uses ONNX operator "{node.op_type}" domain ' + f'"{node.domain}" which is not currently supported in the Autotiler kernels. ' + 'It may be eliminated by graph optimisations') + if not handler: handler = handlers['__extensions'].get(node.op_type, None) if not handler: logger.warning( @@ -360,7 +373,7 @@ def _import_nodes(self, G, graph, handlers, all_nodes, outputs, **kwargs): x = inputs[0] x_shape = x[2].shape name = hasattr(node, 'name') and getattr(node, 'name') - x=0 + x = 0 params = handler.handle(onode, all_nodes=all_nodes, vars_dict=vars_dict, G=G, valid_name=self._node_name(node), used_tensors=used_tensors, importer=self, **kwargs) diff --git a/tools/nntool/interpreter/commands/dump.py b/tools/nntool/interpreter/commands/dump.py index ec05f2acc..d6fa2498a 100644 --- a/tools/nntool/interpreter/commands/dump.py +++ b/tools/nntool/interpreter/commands/dump.py @@ -83,6 +83,8 @@ class DumpCommand(NNToolShellBase): action='store_true', help='dequantize result') parser_dump.add_argument('--quantize_and_dequantize', action='store_true', help='quantize and dequantize float results') + parser_dump.add_argument('--append_fusion_output', + action='store_true', help='quantize and dequantize float results') parser_dump_group = parser_dump.add_mutually_exclusive_group( required=False) parser_dump_group.add_argument('-q', '--quantize', action='store_true', @@ -155,7 +157,7 @@ def do_dump(self, args: argparse.Namespace): qrecs = None if qmode.is_none else self.G.quantization executer = GraphExecuter(self.G, qrecs=qrecs) outputs = executer.execute(data, step_idx_limit=step, - qmode=qmode) + qmode=qmode, append_fusion_output=args.append_fusion_output) if args.pickle or self._in_py or args.save: pickles.append(outputs) diff --git a/tools/nntool/interpreter/commands/imageformat.py b/tools/nntool/interpreter/commands/imageformat.py index 35f7755d9..f0468dc01 100644 --- a/tools/nntool/interpreter/commands/imageformat.py +++ b/tools/nntool/interpreter/commands/imageformat.py @@ -23,7 +23,7 @@ from graph.types import ImageFormatParameters, NNEdge, TransposeParameters - +from graph.manipulations.formatter import insert_formatter, remove_formatter class ImageFormatCommand(NNToolShellBase): def inputs_choices(self): if self.G is None: @@ -74,103 +74,3 @@ def do_imageformat(self, args: argparse.Namespace): f'format {args.image_formatter} and normalization {args.image_normalizer}') -def insert_formatter(G, input_node, formatter, normalizer): - format_node = ImageFormatParameters(input_node.name + "_formatter", - norm_func=normalizer.upper(), - format_change=formatter.upper()) - out_edges = G.out_edges(input_node.name) - - # dims updated to reflect formatter - if format_node.output_channels is not None and format_node.input_channels is not None: - out_dim = input_node.get_output_size(None)[0] - if formatter.upper() in ("BW8", "BW16"): - assert format_node.input_channels == 1 - in_dim = out_dim.clone() - format_node.out_dims_hint = input_node.out_dims_hint - format_node.in_dims_hint = input_node.out_dims_hint - input_node.dims = in_dim - for out_edge in out_edges: - G.remove_edge(out_edge) - else: - if not out_dim.is_named or out_dim.c != format_node.output_channels: - raise ValueError( - "current graph input is not named or does not match formatter output channels") - if formatter.upper() in ("RGB16", "BW16") and normalizer.upper() != "OUT_INT16": - raise ValueError( - "rgb16 and bw16 formatters must have out_int16 as normalization function") - in_dim = out_dim.clone() - in_dim.c = format_node.input_channels - in_dim.impose_order(("h", "w", "c")) - format_node.in_dims_hint = [["h", "w", "c"]] - input_node.dims = in_dim - if input_node.fixed_order: - new_out_edges = [] - for out_edge in out_edges: - if isinstance(out_edge.to_node, TransposeParameters): - trans_node = out_edge.to_node - transpose_edges = G.out_edges(trans_node.name) - new_out_edges.extend(transpose_edges) - G.remove(trans_node) - if G.quantization: - nid = NodeId(trans_node) - if nid in G.quantization: - del G.quantization[NodeId(trans_node)] - else: - new_out_edges.append(out_edge) - out_edges = new_out_edges - else: - input_node.fixed_order = True - for out_edge in out_edges: - G.remove_edge(out_edge) - format_node.out_dims_hint = [["c", "h", "w"]] * len(out_edges) - input_node.out_dims_hint = [["h", "w", "c"]] - G.node_options[NodeId(input_node)] = input_node.at_options - # qrec updated to reflect formatter - input_qrec = G.quantization and G.quantization.get(NodeId(input_node)) - if input_qrec and format_node.input_dtype and format_node.output_dtype: - formatter_qrec = G.quantization.get(NodeId(format_node)) - if not formatter_qrec: - if input_qrec.out_qs[0].dtype != format_node.output_dtype: - raise ValueError( - "current graph input output quantization does not match formatter output") - formatter_qrec = deepcopy(input_qrec) - formatter_qrec.out_qs[0] = deepcopy(formatter_qrec.out_qs[0]) - if formatter_qrec.ktype.startswith('scaled'): - formatter_in_q = QType( - scale=1, zero_point=0, dtype=format_node.input_dtype) - elif formatter_qrec.ktype.startswith('symmetric'): - formatter_in_q = QType(q=0, dtype=format_node.input_dtype) - else: - raise NotImplementedError("quantization has unknown type") - if len(formatter_qrec.in_qs) > 0: - formatter_qrec.in_qs[0] = formatter_in_q - input_qrec.in_qs[0] = formatter_in_q - else: - formatter_qrec.in_qs.append(formatter_in_q) - input_qrec.in_qs.append(formatter_in_q) - input_qrec.out_qs[0] = formatter_in_q - G.quantization[NodeId(format_node)] = formatter_qrec - - G.add_node(format_node) - G.add_edge(NNEdge(input_node, format_node)) - for out_edge in out_edges: - G.add_edge(NNEdge(format_node, out_edge.to_node, to_idx=out_edge.to_idx)) - - -def remove_formatter(G, fmt_node): - input_edges = G.in_edges(fmt_node.name) - assert len(input_edges) == 1, "formatter node should only have one input" - input_node = input_edges[0].from_node - fmt_edges = G.out_edges(fmt_node.name) - fmt_qrec = G.quantization and G.quantization.get(NodeId(fmt_node)) - G.remove(fmt_node) - - input_node.dims = fmt_node.out_dims[0] - input_node.out_dims_hint = fmt_node.out_dims_hint - for fmt_edge in fmt_edges: - G.add_edge(NNEdge(input_node, fmt_edge.to_node, to_idx=fmt_edge.to_idx)) - if fmt_qrec: - input_qrec = G.quantization[NodeId(input_node)] - input_qrec.out_qs = fmt_qrec.out_qs - input_qrec.in_qs = fmt_qrec.out_qs - G.quantization.remove_node(fmt_node) diff --git a/tools/nntool/interpreter/commands/qtune.py b/tools/nntool/interpreter/commands/qtune.py index e7b60a90f..f687fc392 100644 --- a/tools/nntool/interpreter/commands/qtune.py +++ b/tools/nntool/interpreter/commands/qtune.py @@ -110,7 +110,7 @@ def reduction(state, x): options = reduce(reduction, args.step, options) quantizer = NewQuantizer(self.G) - quantizer.options.update(options) + quantizer.update_options(options) quantizer.quantize() self.pfeedback('quantization options set') diff --git a/tools/nntool/interpreter/commands/remove.py b/tools/nntool/interpreter/commands/remove.py index 3283f59c8..17f51d84a 100644 --- a/tools/nntool/interpreter/commands/remove.py +++ b/tools/nntool/interpreter/commands/remove.py @@ -15,12 +15,15 @@ import argparse from functools import reduce +from itertools import chain, groupby from cmd2 import Cmd2ArgumentParser, with_argparser from interpreter.nntool_shell_base import NNToolShellBase from graph.types import ReshapeParameters, InputParameters, OutputParameters, ConstantInputParameters from graph.types.base import NNEdge +from quantization.new_qrec import QRec +from utils.node_id import NodeId class RemoveCommand(NNToolShellBase): @@ -49,27 +52,32 @@ def nodes_choices(self): def do_remove(self, args: argparse.Namespace): """Removes all the edges and nodes between two node. Will only work if nodes do not affect shape of tensor.""" self._check_graph() - if any(node not in self.G for node in args.nodes): - self.perror("node not found in graph") - return + for node in args.nodes: + if node not in self.G: + self.perror(f"node {node} not found in graph") + return node_from = self.G[args.nodes[0]] if len(args.nodes) == 1: if args.up: nodes_above = set(self.G.nodes_above(node_from)) if args.leave: remove_nodes = nodes_above - inputs_on = [] - dims = node_from.in_dims + # remove constant inputs on the node left as targets for removal for in_edge in self.G.indexed_in_edges(node_from): if isinstance(in_edge.from_node, ConstantInputParameters): nodes_above.remove(in_edge.from_node) - else: - inputs_on.append([in_edge]) else: - dims = node_from.out_dims remove_nodes = nodes_above | {node_from} - inputs_on = self.G.indexed_out_edges(node_from) - + # check for deleted nodes that have edges to left nodes. These need to be the new inputs. + # group them by source so common edges have one input + inputs_on = [ + list(edges) for _, edges in + groupby( + [edge for node in remove_nodes for edge in self.G.out_edges(node) + if edge.to_node not in remove_nodes], + key=lambda x: (x.from_node, x.from_idx))] + dims = [edges[0].to_node.in_dims[edges[0].to_idx] + for edges in inputs_on] input_names = sorted( [node.name for node in remove_nodes if isinstance(node, InputParameters)]) self.G.remove_all(remove_nodes) @@ -82,6 +90,13 @@ def do_remove(self, args: argparse.Namespace): self.G.add_edge(NNEdge(from_node=in_node, to_idx=edge.to_idx, to_node=edge.to_node)) + if self.G.quantization and edge_group: + edge = edge_group[0] + fnid = NodeId(edge.to_node) + if fnid in self.G.quantization: + qrec = self.G.quantization[fnid] + self.G.quantization[NodeId(in_node)] = QRec.copy_ktype( + qrec, out_qs=[qrec.in_qs[edge.to_idx]]) else: nodes_below = set(self.G.nodes_below(node_from)) if self.G.is_vertex_cut(nodes_below): @@ -107,6 +122,12 @@ def do_remove(self, args: argparse.Namespace): self.pfeedback(f'adding output {out_node.name}') self.G.add_edge(NNEdge(from_node=edge.from_node, from_idx=edge.from_idx, to_node=out_node)) + if self.G.quantization: + fnid = NodeId(edge.from_node) + if fnid in self.G.quantization: + qrec = self.G.quantization[fnid] + self.G.quantization[NodeId(out_node)] = QRec.copy_ktype( + qrec, in_qs=[qrec.out_qs[edge.from_idx]]) else: node_to = self.G[args.nodes[1]] nodes_between = self.G.nodes_between(node_from, node_to) @@ -121,7 +142,8 @@ def do_remove(self, args: argparse.Namespace): edges_from = set(self.G.out_edges(node_from)) edges_to = set(self.G.in_edges(node_to.name)) - between_edges = reduce(lambda s, x: s|set(self.G.edges(x)), nodes_between, set()) + between_edges = reduce(lambda s, x: s | set( + self.G.edges(x)), nodes_between, set()) edges_from = edges_from.intersection(between_edges) edges_to = edges_to.intersection(between_edges) if len(edges_from) != len(edges_to): diff --git a/tools/nntool/interpreter/commands/tflite.py b/tools/nntool/interpreter/commands/tflite.py index 71babab37..b8a729a11 100644 --- a/tools/nntool/interpreter/commands/tflite.py +++ b/tools/nntool/interpreter/commands/tflite.py @@ -15,14 +15,19 @@ from interpreter.nntool_shell_base import NNToolShellBase from importer.tflite2.common.handler_helper import get_backend_coverage, get_backend_partial_support_detail - +import texttable class HelpTFLiteCommand(NNToolShellBase): def help_tflite(self): ops_dict = get_backend_coverage()[0] bc_dict = get_backend_partial_support_detail() self.pfeedback("Supported operators and versions") + + table = texttable.Texttable() + table.set_cols_align(['l', 'l', 'l']) + table.set_max_width(120) + table.set_cols_width([30, 15, 60]) for op in ops_dict: - self.pfeedback("%s (%s)"%(op, ",".join(str(ver) for ver in ops_dict[op]))) - if op in bc_dict: - self.pfeedback(bc_dict[op]) + table.add_row([op, ",".join(str(ver) for ver in ops_dict[op]), bc_dict.get(op, "")]) + self.pfeedback("Supported operators and versions") + self.pfeedback(table.draw()+'\n') \ No newline at end of file diff --git a/tools/nntool/quantization/float/float_quantization_handler.py b/tools/nntool/quantization/float/float_quantization_handler.py index 0fe9824be..776054095 100644 --- a/tools/nntool/quantization/float/float_quantization_handler.py +++ b/tools/nntool/quantization/float/float_quantization_handler.py @@ -65,3 +65,10 @@ def _get_in_qs_from_stats(cls, params, stats, in_qs, **kwargs): for idx, dim in enumerate(params.in_dims)] return [QType(dtype=dtype) if dim is not None else None for idx, dim in enumerate(params.in_dims)] + + @classmethod + def get_min_max(cls, stats, idx=0, direction='out'): + if stats: + return (stats[f'range_{direction}'][idx]['min'], + stats[f'range_{direction}'][idx]['max']) + return None, None diff --git a/tools/nntool/quantization/float/quantizers/expression_fusion_float.py b/tools/nntool/quantization/float/quantizers/expression_fusion_float.py index ee45039e5..62fe5989e 100644 --- a/tools/nntool/quantization/float/quantizers/expression_fusion_float.py +++ b/tools/nntool/quantization/float/quantizers/expression_fusion_float.py @@ -30,8 +30,8 @@ # Fusion handler attribute not set since expressions are handled only by this handler @params_type(ExpressionFusionParameters) -@in_qs_constraint(MatchAll({'dtype': set([np.float32, np.float16, bfloat16])})) -@out_qs_constraint(MatchAll({'dtype': set([np.float32, np.float16, bfloat16])})) +@in_qs_constraint(MatchAll({'dtype': set([np.float32, np.float16, bfloat16, np.uint16, np.int16, np.uint8, np.int8])})) +@out_qs_constraint(MatchAll({'dtype': set([np.float32, np.float16, bfloat16, np.uint16, np.int16, np.uint8, np.int8])})) class ExpressionFusionFloat(FloatQuantizionHandler): @classmethod def _quantize(cls, params, in_qs, stats, **kwargs): diff --git a/tools/nntool/quantization/float/quantizers/input_float.py b/tools/nntool/quantization/float/quantizers/input_float.py new file mode 100644 index 000000000..79c064ad9 --- /dev/null +++ b/tools/nntool/quantization/float/quantizers/input_float.py @@ -0,0 +1,54 @@ +# Copyright (C) 2020 GreenWaves Technologies, SAS + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. + +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + + +from copy import deepcopy + +import numpy as np +from bfloat16 import bfloat16 +from graph.types import OutputParameters +from graph.types.input_output import InputParameters +from quantization.float.float_quantization_handler import \ + FloatQuantizionHandler +from quantization.new_qrec import QRec +from quantization.qtype import QType +from quantization.qtype_constraint import MatchAll +from quantization.quantizer_options import QTYPE_IND_OPTION +from quantization.unified_quantization_handler import (options, + out_qs_constraint, + params_type) + + +@params_type(InputParameters) +@out_qs_constraint(MatchAll({'dtype': set([np.float32, np.float16, bfloat16])})) +@options(QTYPE_IND_OPTION) +class FloatInput(FloatQuantizionHandler): + @classmethod + def _quantize(cls, params, in_qs, stats, **kwargs): + force_out_qs, dtype = cls.get_float_opts(**kwargs) + force_out_q = force_out_qs and force_out_qs[0] + opts = kwargs['opts'] + i_q_ind = opts.get('qtype_ind') + if force_out_q: + if force_out_q.dtype != dtype: + return None + i_q = deepcopy(force_out_q) + elif i_q_ind: + i_q = deepcopy(i_q_ind) + else: + min_val, max_val = cls.get_min_max(stats) + i_q = QType(dtype=dtype, min_val=min_val, max_val=max_val) + return QRec.float(out_qs=[i_q], + float_dtype=i_q.dtype) diff --git a/tools/nntool/quantization/float/quantizers/output_float.py b/tools/nntool/quantization/float/quantizers/output_float.py index 57e2daba0..2d506f890 100644 --- a/tools/nntool/quantization/float/quantizers/output_float.py +++ b/tools/nntool/quantization/float/quantizers/output_float.py @@ -14,6 +14,8 @@ # along with this program. If not, see . +from copy import deepcopy + import numpy as np from bfloat16 import bfloat16 from graph.types import OutputParameters @@ -22,7 +24,9 @@ from quantization.new_qrec import QRec from quantization.qtype import QType from quantization.qtype_constraint import MatchAll +from quantization.quantizer_options import QTYPE_IND_OPTION from quantization.unified_quantization_handler import (in_qs_constraint, + options, out_qs_constraint, params_type) @@ -30,12 +34,20 @@ @params_type(OutputParameters) @in_qs_constraint(MatchAll({'dtype': set([np.float32, np.float16, bfloat16])})) @out_qs_constraint(MatchAll({'dtype': set([np.float32, np.float16, bfloat16])})) +@options(QTYPE_IND_OPTION) class FloatOutput(FloatQuantizionHandler): @classmethod def _quantize(cls, params, in_qs, stats, **kwargs): force_out_qs, dtype = cls.get_float_opts(**kwargs) if force_out_qs and any(qtype.dtype != dtype for qtype in force_out_qs if qtype is not None): return None - return QRec.float(in_qs=[QType(dtype=dtype)], - out_qs=[QType(dtype=dtype)], - float_dtype=dtype) + opts = kwargs['opts'] + o_q_ind = opts.get('qtype_ind') + if o_q_ind: + o_q = deepcopy(o_q_ind) + else: + min_val, max_val = cls.get_min_max(stats, direction='in') + o_q = QType(dtype=dtype, min_val=min_val, max_val=max_val) + return QRec.float(in_qs=[o_q], + out_qs=[o_q], + float_dtype=o_q.dtype) diff --git a/tools/nntool/quantization/multiplicative/quantizers/activation_mult.py b/tools/nntool/quantization/multiplicative/quantizers/activation_mult.py index 56c24ed63..0467048c0 100644 --- a/tools/nntool/quantization/multiplicative/quantizers/activation_mult.py +++ b/tools/nntool/quantization/multiplicative/quantizers/activation_mult.py @@ -31,7 +31,7 @@ from quantization.qtype import QType from quantization.unified_quantization_handler import (in_qs_constraint, out_qs_constraint,option_constraint, - params_type, options) + params_type, options, priority) from ..mult_quantization_handler import MultQuantizionHandler from quantization.quantizer_options import * @@ -104,6 +104,11 @@ def _quantize_sw(cls, params, in_qs, stats, in_dtype, out_dtype, out_asym, **kwa 8, dtype=in_dtype, forced=True) + elif in_dtype in [np.uint8, np.uint16]: + in_q = QType( + dtype=in_dtype, + scale=pow(2, -12), + zero_point=1<<(8 if in_dtype == np.uint8 else 16)) else: in_q = QType( dtype=in_dtype, @@ -133,7 +138,7 @@ def _quantize_sw(cls, params, in_qs, stats, in_dtype, out_dtype, out_asym, **kwa o_q = QType.from_min_max_sq(0, max_val, dtype=out_dtype, - asymmetric=(in_q.zero_point != 0)) + asymmetric=(in_q.zero_point != 0) or out_dtype in [np.uint8, np.uint16]) in_q = deepcopy(o_q) elif isinstance(params, TanHActivationParameters): o_q = QType.from_min_max_sq( @@ -225,6 +230,7 @@ def _quantize(cls, params, in_qs, stats, **kwargs): @in_qs_constraint({'dtype': {np.int8, np.int16, np.int32}}) @out_qs_constraint({'dtype': np.uint8}) @option_constraint(force_output_size={8, None}) +@priority(2) class ActivationMultSW_HSwish_I_U8(ActivationMultSWBase): @classmethod def _get_in_qs_from_stats(cls, params, stats, in_qs, **kwargs): diff --git a/tools/nntool/quantization/multiplicative/quantizers/add_sub_mult.py b/tools/nntool/quantization/multiplicative/quantizers/add_sub_mult.py index 68c39acd3..8f9d5832b 100644 --- a/tools/nntool/quantization/multiplicative/quantizers/add_sub_mult.py +++ b/tools/nntool/quantization/multiplicative/quantizers/add_sub_mult.py @@ -83,7 +83,7 @@ def _quantize_sw(cls, params, in_qs, stats, inout_dtype, asym=False, **kwargs): scale_in_mul_biases_q.scale = qrec.in_qs[scaled_idx].scale / \ qrec.in_qs[not_scaled_idx].scale - if qrec.in_qs[0].asymmetric: + if qrec.in_qs[0].zero_point or qrec.in_qs[1].zero_point or qrec.out_qs[0].zero_point: # (C - Zc)*Sc = (A - Za)*Sa + (B - Zb)*Sb = # C = Sa/Sc*(A + B*Sb/Sa - Za - Zb*Sb/Sa) + Zc = # = Sa/Sc*(A + B*Sb/Sa) + (Zc - Sa/Sc*(Za + Zb*Sb/Sa)) diff --git a/tools/nntool/quantization/multiplicative/quantizers/constant_input_mult.py b/tools/nntool/quantization/multiplicative/quantizers/constant_input_mult.py index 0ad4f0e97..467bea16b 100644 --- a/tools/nntool/quantization/multiplicative/quantizers/constant_input_mult.py +++ b/tools/nntool/quantization/multiplicative/quantizers/constant_input_mult.py @@ -17,15 +17,18 @@ from graph.types import ConstantInputParameters from quantization.new_qrec import QRec -from quantization.qtype import QType -from quantization.quantizer_options import QTYPE_IND_OPTION +from quantization.qtype import QType, DTYPES +from quantization.quantizer_options import QTYPE_IND_OPTION, OUTPUT_SIZE_OPTION from quantization.unified_quantization_handler import (needs_stats, options, params_type) from ..mult_quantization_handler import MultQuantizionHandler -@options(QTYPE_IND_OPTION) +@options( + QTYPE_IND_OPTION, + OUTPUT_SIZE_OPTION +) @params_type(ConstantInputParameters) @needs_stats(False) class ConstantInputMult(MultQuantizionHandler): @@ -42,8 +45,12 @@ def _quantize(cls, params, in_qs, stats, **kwargs): # derive quantization from statistics else: opts = kwargs.get('opts', {}) - o_q = opts.get('qtype_ind') - if not o_q: - o_q = QType.from_array_sq(params.value, dtype=out_dtype) + output_size = opts.get('output_size') + if output_size and output_size[0]: + cur_bits = DTYPES[out_dtype][0] + bits = min(output_size[0], cur_bits) + else: + bits = None + o_q = QType.from_array_sq(params.value, dtype=out_dtype, bits=bits) o_q.is_constant = True return QRec.scaled(in_qs=[o_q], out_qs=[o_q]) diff --git a/tools/nntool/quantization/multiplicative/quantizers/expression_fusion_mult.py b/tools/nntool/quantization/multiplicative/quantizers/expression_fusion_mult.py index cd4be879e..6e4b47eed 100644 --- a/tools/nntool/quantization/multiplicative/quantizers/expression_fusion_mult.py +++ b/tools/nntool/quantization/multiplicative/quantizers/expression_fusion_mult.py @@ -26,14 +26,14 @@ from quantization.unified_quantization_handler import (in_qs_constraint, out_qs_constraint, params_type) - +from bfloat16 import bfloat16 from ..mult_quantization_handler import MultQuantizionHandler LOG = logging.getLogger('nntool.' + __name__) @params_type(ExpressionFusionParameters) -@in_qs_constraint(MatchAll({'dtype': {np.int8, np.uint8, np.int16, np.uint16}})) -@out_qs_constraint(MatchAll({'dtype': {np.int8, np.uint8, np.int16, np.uint16}})) +@in_qs_constraint(MatchAll({'dtype': {np.int8, np.uint8, np.int16, np.uint16, np.float16, bfloat16}})) +@out_qs_constraint(MatchAll({'dtype': {np.int8, np.uint8, np.int16, np.uint16, np.float16, bfloat16}})) class ExpressionFusionMult(MultQuantizionHandler): @classmethod def _quantize(cls, params, in_qs, stats, **kwargs): diff --git a/tools/nntool/quantization/multiplicative/quantizers/filter_mult.py b/tools/nntool/quantization/multiplicative/quantizers/filter_mult.py index 57f1fb857..9b49b245c 100644 --- a/tools/nntool/quantization/multiplicative/quantizers/filter_mult.py +++ b/tools/nntool/quantization/multiplicative/quantizers/filter_mult.py @@ -311,22 +311,26 @@ def _quantize_ne16(cls, params, in_qs, stats, input_dtype, **kwargs): G = kwargs['G'] weights_node = cls.get_weights_node(G, fusion if fusion else params) min_val, max_val = None, None + wbits = (min(in_qs[1].bits, opts['weight_bits']) + if 'weight_bits' not in opts['set_on_node'] else opts['weight_bits']) weights_q = QType.from_array_sq(arr=weights_node.dqvalue, quantized_dimension=cls.get_quantized_dimension( params, opts), dtype=np.uint8, narrow_range=opts['narrow_weights'], - bit_pack=opts['weight_bits'], + bit_pack=wbits, no_compression=True, - bits=opts['weight_bits']) + bits=wbits) in_q = in_qs[0] - in_q = limit_input_precision( - params, input_bits, in_q, params.filter.sz, - opts['narrow_weights'], opts['weight_bits'], - opts.get('max_precision_limit', MAX_PRECISION_LIMIT_OPTION['default']), - out_ranges=stats.get('range_out'), - w_qs=[weights_q]) + if input_bits > 8: + in_q = limit_input_precision( + params, input_bits, in_q, params.filter.sz, + opts['narrow_weights'], wbits, + opts.get('max_precision_limit', + MAX_PRECISION_LIMIT_OPTION['default']), + out_ranges=stats.get('range_out'), + w_qs=[weights_q]) assert in_q.dtype == input_dtype diff --git a/tools/nntool/quantization/multiplicative/quantizers/global_pooling_mult.py b/tools/nntool/quantization/multiplicative/quantizers/global_pooling_mult.py index d32c2009b..38fb1492f 100644 --- a/tools/nntool/quantization/multiplicative/quantizers/global_pooling_mult.py +++ b/tools/nntool/quantization/multiplicative/quantizers/global_pooling_mult.py @@ -68,12 +68,16 @@ def _quantize(cls, params, in_qs, stats, **kwargs): params.name, o_q.min, o_q.max, "asymmetric" if o_q.asymmetric else "symmetric") elif isinstance(params, GlobalAveragePoolParameters) or isinstance(params, GlobalSumPoolParameters): cls.check_valid_ranges(params, stats, idx=0, dirs='in') + in_qs = cls.force_symmetric(in_qs) + if in_qs is None: + return None + in_q = in_qs[0] # scaling needs to be based on stats and zero point o_q = QType.from_min_max_sq(stats['range_out'][0]['min'], stats['range_out'][0]['max'], dtype=out_dtype, - asymmetric=(stats['range_out'][0]['min'] == 0 and in_q.zero_point == -128)) + asymmetric=False) else: o_q = deepcopy(in_q) diff --git a/tools/nntool/quantization/multiplicative/quantizers/input_mult.py b/tools/nntool/quantization/multiplicative/quantizers/input_mult.py index dddbc5893..9a35a16ce 100644 --- a/tools/nntool/quantization/multiplicative/quantizers/input_mult.py +++ b/tools/nntool/quantization/multiplicative/quantizers/input_mult.py @@ -19,7 +19,7 @@ from graph.types import InputParameters from quantization.new_qrec import QRec from quantization.qtype import QType -from quantization.quantizer_options import ALLOW_ASYMMETRIC_OPTION +from quantization.quantizer_options import ALLOW_ASYMMETRIC_OPTION, QTYPE_IND_OPTION from quantization.unified_quantization_handler import (options, out_qs_constraint, params_type) @@ -28,7 +28,8 @@ @options( - ALLOW_ASYMMETRIC_OPTION + ALLOW_ASYMMETRIC_OPTION, + QTYPE_IND_OPTION ) @params_type(InputParameters) @out_qs_constraint({'dtype': set([np.int8, np.uint8, np.int16, np.uint16])}) @@ -40,8 +41,11 @@ def _quantize(cls, params, in_qs, stats, **kwargs): out_dtype = in_qs[0].dtype force_out_q = force_out_qs and force_out_qs[0] opts = kwargs['opts'] + o_q_ind = opts.get('qtype_ind') if force_out_q: o_q = deepcopy(force_out_q) + elif o_q_ind: + o_q = deepcopy(o_q_ind) else: cls.check_valid_ranges(params, stats, idx=0, dirs='out') o_q = QType.from_min_max_sq(stats['range_out'][0]['min'], diff --git a/tools/nntool/quantization/multiplicative/quantizers/matmult_mult.py b/tools/nntool/quantization/multiplicative/quantizers/matmult_mult.py index a09de7233..8b400b01d 100644 --- a/tools/nntool/quantization/multiplicative/quantizers/matmult_mult.py +++ b/tools/nntool/quantization/multiplicative/quantizers/matmult_mult.py @@ -22,6 +22,7 @@ from graph.types.activations import (HSwishActivationParameters, TanHActivationParameters) from graph.types.base import NNEdge +from graph.types.tensor_arithmetic import MatMulTransposedParameters from quantization.multiplicative.quantizers.filter_mult import \ check_filter_options from quantization.multiplicative.quantizers.rnn_mult_ne16 import ( @@ -150,7 +151,8 @@ def _quantize(cls, params, in_qs, stats, **kwargs): kwargs['graph_update']['requires_adjust'] = True in_q2 = QType.from_array_sq( arr=in2_node.dqvalue, - quantized_dimension=len(in2_node.dqvalue.shape) - 2, + quantized_dimension=(len(in2_node.dqvalue.shape) - + (2 if isinstance(params, MatMulTransposedParameters) else 1)), dtype=np.int8, narrow_range=True, bits=8) @@ -235,7 +237,7 @@ def _quantize_ne16(cls, params, in_qs, stats, input_dtype, **kwargs): in_q1 = limit_input_precision( params, input_bits, in_q1, w1, False, opts['weight_bits'], opts.get('max_precision_limit', - MAX_PRECISION_LIMIT_OPTION['default']), + MAX_PRECISION_LIMIT_OPTION['default']), out_ranges=stats.get('range_out'), w_qs=[in_q2]) diff --git a/tools/nntool/quantization/multiplicative/quantizers/output_mult.py b/tools/nntool/quantization/multiplicative/quantizers/output_mult.py index 47a9c2367..4b1a0f67d 100644 --- a/tools/nntool/quantization/multiplicative/quantizers/output_mult.py +++ b/tools/nntool/quantization/multiplicative/quantizers/output_mult.py @@ -18,7 +18,8 @@ import numpy as np from graph.types import OutputParameters from quantization.new_qrec import QRec -from quantization.unified_quantization_handler import (out_qs_constraint, +from quantization.quantizer_options import QTYPE_IND_OPTION +from quantization.unified_quantization_handler import (out_qs_constraint, options, params_type, needs_stats) from ..mult_quantization_handler import MultQuantizionHandler @@ -27,7 +28,14 @@ @params_type(OutputParameters) @out_qs_constraint({'dtype': set([np.int8, np.uint8, np.int16])}) @needs_stats(False) +@options(QTYPE_IND_OPTION) class OutputMult(MultQuantizionHandler): @classmethod def _quantize(cls, params, in_qs, stats, **kwargs): - return QRec.scaled(in_qs=deepcopy(in_qs), out_qs=deepcopy(in_qs)) + opts = kwargs['opts'] + in_q_ind = opts.get('qtype_ind') + if in_q_ind: + in_q = deepcopy(in_q_ind) + else: + in_q = deepcopy(in_qs[0]) + return QRec.scaled(in_qs=[in_q], out_qs=[in_q]) diff --git a/tools/nntool/quantization/multiplicative/quantizers/softmax_tanh_mult.py b/tools/nntool/quantization/multiplicative/quantizers/softmax_tanh_mult.py index b2fbff55b..16ee1aad0 100644 --- a/tools/nntool/quantization/multiplicative/quantizers/softmax_tanh_mult.py +++ b/tools/nntool/quantization/multiplicative/quantizers/softmax_tanh_mult.py @@ -18,7 +18,7 @@ from graph.types.activations import HTanHActivationParameters from quantization.new_qrec import QRec from quantization.qtype import QType -from quantization.quantizer_options import SOFTMAX_OUT_8BITS_OPTION +from quantization.quantizer_options import SOFTMAX_OUT_8BITS_OPTION, OUTPUT_SIZE_OPTION from quantization.unified_quantization_handler import (in_qs_constraint, out_qs_constraint, params_type, options) @@ -39,7 +39,7 @@ def _quantize(cls, params, in_qs, stats, **kwargs): force_out_q = force_out_qs and force_out_qs[0] opts = kwargs['opts'] if force_out_q: - if force_out_q.forced_scale or force_out_q.forced_zero_point: + if force_out_q.forced_scale or (force_out_q.forced_zero_point and not np.all(in_qs[0].zero_point == 0)): return None if in_qs[0].dtype == np.int8: dtypes = [np.int8, np.int16] diff --git a/tools/nntool/quantization/new_qrec.py b/tools/nntool/quantization/new_qrec.py index 7438a5f69..4f0e6badb 100644 --- a/tools/nntool/quantization/new_qrec.py +++ b/tools/nntool/quantization/new_qrec.py @@ -158,7 +158,7 @@ def get_outputs(self, del params if ktype == "symmetric": if self._auto_dequantize_outputs: - return [self.out_qs[idx].dequantize(output_tensor) for idx, output_tensor in enumerate(output_tensors)] + return [self.out_qs[idx].dequantize(x) for idx, x in enumerate(output_tensors)] output_tensors = [self.out_qs[idx].clip(output_tensor) for idx, output_tensor in enumerate(output_tensors)] return output_tensors diff --git a/tools/nntool/quantization/qtype.py b/tools/nntool/quantization/qtype.py index 7d409ba36..45324622d 100644 --- a/tools/nntool/quantization/qtype.py +++ b/tools/nntool/quantization/qtype.py @@ -658,7 +658,9 @@ def calculate_scale(rmin, rmax, qmin, qmax, dtype, asymmetric=False, scale = np.maximum( divide_ignore(rpos_range, qpos_range), divide_ignore(rneg_range, qneg_range)) - return np.atleast_1d(scale), np.atleast_1d(zero_point) + scale = np.atleast_1d(scale) + scale[scale == 0] = 1 + return scale, np.atleast_1d(zero_point) elif asymmetric: if narrow_range: raise ValueError( @@ -705,7 +707,9 @@ def calculate_scale(rmin, rmax, qmin, qmax, dtype, asymmetric=False, nudged_zero_point = qmax else: nudged_zero_point = np.round(zero_point).astype(dtype) - return np.atleast_1d(scale), np.atleast_1d(nudged_zero_point) + scale = np.atleast_1d(scale) + scale[scale == 0] = 1 + return scale, np.atleast_1d(nudged_zero_point) else: scale = QType.calculate_symmetric_scales( qrange, rmin, rmax, narrow_range=narrow_range) @@ -718,7 +722,9 @@ def calculate_scale(rmin, rmax, qmin, qmax, dtype, asymmetric=False, else: zero_point = np.atleast_1d( np.ceil(qrange/2) + qmin).astype(dtype) - return np.atleast_1d(scale), zero_point + scale = np.atleast_1d(scale) + scale[scale == 0] = 1 + return scale, zero_point def recalculate_scale(self, min_val, max_val, narrow_range=None): if narrow_range is None: diff --git a/tools/nntool/quantization/quantizer/new_quantizer.py b/tools/nntool/quantization/quantizer/new_quantizer.py index f34a497c0..51a353c09 100644 --- a/tools/nntool/quantization/quantizer/new_quantizer.py +++ b/tools/nntool/quantization/quantizer/new_quantizer.py @@ -96,6 +96,14 @@ def options(self, val): def set_options(self, **kwargs): self._options.update(kwargs) + def update_options(self, new_options): + for k, v in new_options.items(): + old_v = self._options.get(k, None) + if isinstance(old_v, dict) and isinstance(v, dict): + old_v.update(v) + else: + self._options[k] = v + @property def schemes(self): return self._schemes @@ -369,6 +377,7 @@ def get_options(self, nid, handler=None): node_options = self._options.get(nid, {}) opts.update({k: v for k, v in node_options.items() if k in opts}) + opts['set_on_node'] = list(node_options.keys()) else: opts = {k: v for k, v in self._options.items() if not isinstance(k, NodeId)} diff --git a/tools/nntool/quantization/quantizer_options.py b/tools/nntool/quantization/quantizer_options.py index 48f114c18..59e56015f 100644 --- a/tools/nntool/quantization/quantizer_options.py +++ b/tools/nntool/quantization/quantizer_options.py @@ -89,6 +89,12 @@ 'default': 8 } +OUTPUT_SIZE_OPTION = { + 'name': 'output_size', + 'type': None, + 'default': None +} + FORCE_EXTERNAL_SIZE_OPTION = { 'name': 'force_external_size', 'type': int, diff --git a/tools/nntool/reports/draw_graph_reporter.py b/tools/nntool/reports/draw_graph_reporter.py index da7b40b5c..812299e88 100644 --- a/tools/nntool/reports/draw_graph_reporter.py +++ b/tools/nntool/reports/draw_graph_reporter.py @@ -380,7 +380,7 @@ def report_expression(self, dot: Digraph, G: NNGraph, 'labelloc': 't', 'labeljust': 'l'}, node_attr={'style': 'solid(dashed)'}) as sub: - for var, func in func_col.functions.items(): + for var, func in func_col: node_id, shape = self.report_symbol( sub, func, intermediates, anonymise=anonymise) var_name = self.get_next('Var') if anonymise else var.name diff --git a/tools/nntool/reports/quantization_reporter.py b/tools/nntool/reports/quantization_reporter.py index 8b8673fc6..09ce00a52 100644 --- a/tools/nntool/reports/quantization_reporter.py +++ b/tools/nntool/reports/quantization_reporter.py @@ -14,6 +14,7 @@ # along with this program. If not, see . from graph.types import ConstantInputParameters +from graph.types.activations import ActivationParameters from graph.types.base import FilterParameters from utils.node_id import NodeId from utils.tabular import Tabular, TabularColumn @@ -92,6 +93,8 @@ def report(self, G, stats, nodes=None): row.append(self.emit_qs([qrec.cache[key]])) else: row.append("") + elif "scale_mul_biases_q" in qrec.cache: + row += ["", "", self.emit_qs([qrec.cache["scale_mul_biases_q"]]), "", ""] else: row += ["", "", "", "", ""] else: diff --git a/tools/nntool/utils/node_id.py b/tools/nntool/utils/node_id.py index 2703db6b5..b44e6105e 100644 --- a/tools/nntool/utils/node_id.py +++ b/tools/nntool/utils/node_id.py @@ -25,6 +25,12 @@ def __init__(self, node, fnode=None): fnode_name = None if fnode is None else fnode if isinstance(fnode, str) else fnode.name self._id = [node.name, "" if fnode is None else fnode_name] + @property + def key(self): + if self._id[1]: + return self._id + return self._id[0] + @property def id(self): return self._id diff --git a/tools/nntool/utils/random_iter.py b/tools/nntool/utils/random_iter.py new file mode 100644 index 000000000..8007aeade --- /dev/null +++ b/tools/nntool/utils/random_iter.py @@ -0,0 +1,42 @@ +# Copyright (C) 2022 GreenWaves Technologies, SAS + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. + +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +import numpy as np + + +class RandomIter(): + def __init__(self, count, shapes, ranges, gen=None) -> None: + self._vars = list(zip(shapes, ranges)) + self._gen = gen + self._count = count + self._cur = count + if self._gen is None: + self._gen = np.random.default_rng() + + def __iter__(self): + self._cur = self._count + return self + + def __next__(self): + if self._cur <= 0: + raise StopIteration() + self._cur -= 1 + return self.val() + + def val(self): + res = [] + for shape, (minv, maxv) in self._vars: + res.append((self._gen.random(shape) * (maxv - minv)) + minv) + return res diff --git a/utils/gaptest/gaptest b/utils/gaptest/gaptest index e6d506785..ce077a9fa 100755 --- a/utils/gaptest/gaptest +++ b/utils/gaptest/gaptest @@ -77,6 +77,7 @@ sub exc_cmd_make { my $os = shift; my $platform = shift; my $flags = shift; + my $compile_only = shift; my $tags = shift; my $pre = shift; my $post = shift; @@ -85,18 +86,24 @@ sub exc_cmd_make { my $exec_dir = shift; my $res = 0; my $make_path = $basedir."/".$exec_dir; - system ("make -C ".$make_path." PMSIS_OS=".$os." build_dir_ext=".$target_name." clean"); + system ("make -C ".$make_path." ".$flags." PMSIS_OS=".$os." build_dir_ext=".$target_name." clean"); if($pre == 1) { `make prepare`; } + my $targets = "all"; + if (not $compile_only) + { + $targets = "${targets} run"; + } + chdir $exec_dir; - say "make -C ".$make_path." ".$flags." PMSIS_OS=".$os." platform=".$platform." build_dir_ext=".$target_name." all run"; my ($seconds_before, $seconds_after); timeout $timeout => sub { $seconds_before = time(); - $res = system ("make -C ".$make_path." ".$flags." PMSIS_OS=".$os." platform=".$platform." build_dir_ext=".$target_name." all run"); + say "make -C ".$make_path." ".$flags." PMSIS_OS=".$os." platform=".$platform." build_dir_ext=".$target_name." $targets"; + $res = system ("make -C ".$make_path." ".$flags." PMSIS_OS=".$os." platform=".$platform." build_dir_ext=".$target_name." $targets"); $seconds_after = time(); $res = $res >>=8; say $target_name." : Result is: ".$res; @@ -122,6 +129,7 @@ sub exc_cmd_cmake { my $os = shift; my $platform = shift; my $flags = shift; + my $compile_only = shift; my $tags = shift; my $pre = shift; my $post = shift; @@ -150,15 +158,19 @@ sub exc_cmd_cmake { say "CMAKE_GENERATOR=Ninja cmake -S $make_path -B $make_path/build".-$target_name." -DCONFIG_GAP_SDK_HOME=$sdk_root_path -DCMAKE_MODULE_PATH=$sdk_root_path/utils/cmake -DCONFIG_CHIP=$chip -DCONFIG_CHIP_VERSION=$chip_version -DBOARD=$ENV{'BOARD_NAME'} $cmake_flags"; $res = system ("CMAKE_GENERATOR=Ninja cmake -S $make_path -B $make_path/build".-$target_name." -DCONFIG_GAP_SDK_HOME=$sdk_root_path -DCMAKE_MODULE_PATH=$sdk_root_path/utils/cmake -DCONFIG_CHIP=$chip -DCONFIG_CHIP_VERSION=$chip_version -DBOARD=$ENV{'BOARD_NAME'} $cmake_flags"); say "cmake --build $make_path/build"; - $res = system("cmake --build $make_path/build".-$target_name); - say "cmake --build $make_path/build --target run"; - $res = system("cmake --build $make_path/build".-$target_name." --target run"); - $seconds_after = time(); - $res = $res >>=8; - say $target_name." : Result is: ".$res; - if($post == 1) + + if (not $compile_only) { - $res = system("cmake --build build --target postrun"); + $res = system("cmake --build $make_path/build".-$target_name); + say "cmake --build $make_path/build --target run"; + $res = system("cmake --build $make_path/build".-$target_name." --target run"); + $seconds_after = time(); + $res = $res >>=8; + say $target_name." : Result is: ".$res; + if($post == 1) + { + $res = system("cmake --build build --target postrun"); + } } }; my $seconds = $seconds_after - $seconds_before; @@ -256,6 +268,7 @@ sub process_yml { my @arg = ($config_os, $config_platform, $test_variant->{flags}, + $test_variant->{compile_only}, '', 0, 0, diff --git a/utils/gaptest/lib/gaptest/Loader.pm b/utils/gaptest/lib/gaptest/Loader.pm index 12e0a835a..441816565 100644 --- a/utils/gaptest/lib/gaptest/Loader.pm +++ b/utils/gaptest/lib/gaptest/Loader.pm @@ -144,6 +144,15 @@ sub load_test_variant { $test_variant{flags} = ""; } + $test_variant{compile_only} = 0; + if (defined $section->{compile_only}) + { + if ($section->{compile_only} eq "true") + { + $test_variant{compile_only} = 1; + } + } + if(defined $section->{duration}) { $test_variant{duration} = $section->{duration}; diff --git a/utils/openocd_tools/gap_bins/gap_flasher-gap9_evk-fpga.elf b/utils/openocd_tools/gap_bins/gap_flasher-gap9_evk-fpga.elf deleted file mode 100755 index 05fe0de497eac0d10570653d412f812d3e0dffde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 720132 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ÔjXXecf7uX^+^0u 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/g)BfIgww7 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 diff --git a/utils/openocd_tools/gap_bins/gap_flasher-gap9_evk-mram.elf b/utils/openocd_tools/gap_bins/gap_flasher-gap9_evk-mram.elf deleted file mode 100755 index 78e5c9b046c1e06b61db09660a63cd40c68bbed2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 583496 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%0D>+hv%0SY0B|Li~dtU#*c_4iSq03Gj8 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 B01p5F diff --git a/utils/openocd_tools/gap_bins/gap_flasher-gap9_evk.elf b/utils/openocd_tools/gap_bins/gap_flasher-gap9_evk.elf deleted file mode 100755 index 63d1e132b6393fa1ff100b3b7847835c440c6234..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 735132 zcmeFa3s_Xw)i=J+8D<8J0yrV&EYL9%A4j1|DMIAqE~|;2{PcV&EYL9%A4j1|DMIAqE~| z;2{PcV&MON4E!u+aZ>6_$tiQj>lcUVlNK*tChHd@En1vBzdMUvvphLv0hKdG^zvm9Hc%)=$t6TiuoJ8>HQ&%RfOiOiv#qQ4^DKF-IKIRK|$_k%ZeIq>M^`lpFh$kg;h&k*({MqPd zjANFV^* zX{mncvX%POxhQGzqF)ka zpzdsQ+^obY<{5G3spIu>($Wztc@=%?nx(RS*}Pw%(zMRx#HNPnmnd2D)0QkB&*!ov zY0*+z54zK!aS2nW5(T&?vpi+d(v=JJOVU;*uT~(!`m9WLQ3+#9la{gtOBX#sec=8h z*PV6nzZT`z(XyWMlRx}0(si$*J7ZTS{@0qF({+z>_tzsg)l5|K?@UaJUMBCc z)lFQndrh}^d-sUG3H$%L?`1Kf<>`OjiyC#^RgXm|^&fZLhq~_lT=&+APec#=qH){+ zUO)ZSQIX46KbMxAmdu`fY1xwGCtpfRTevK3;ghK;@{x_Dx)= ze@stD1O z(w43yER9Bbvcecj-cKd~3U>{3;lk4^guq$L6y)EBB^O0JVe&yUx_)306TEl_0L#}* zUzQ4vgz!OsD~J-}XPakOW=x)CcCVXH&o0!V-!Z%!1+LYz!0J-+%9-*@$@9}7V2MVO zM?y|b;8I{_bgX$&!c_B&#F+^*r<>y@nJ2mXUOj7({Br87WtOBx3MQ0pnLKOt)MfI^ zgd7gk4sV~M zyvsF8S*+M)i|0eZ02CKha++|p0D*AY2lc-am9}63D)M>z5-`dXK=hA&&*fnt2WZnp zE0dPW$?>wB2Jtzcrm%c|Oyty=W;Z>!M*Ke_1t!n<@8KGVAW^`SIbl80NGQlJyMS@w ziTzt-6Dg5Y$fo6-#_k`1c*`YD+$=gPI!ciO3_Rr}$h1`06Y~`uDspUkN-`8|TB;@K zt#!DYhI zc`*21Mu&u`uHdA)ZrTMtf#&$Mm3#~z0idL#qrfDxqGq7x*F=&r$#pe}lhl`I&WfBh zIU0z1!Go9l%0}nCq5Cab}@DKwJG4Ovm29`0sVHuknzKlhzUd9T?;Te}6*OjqI&lZz<6=R} zSfv?ha&@tm@^>!%Pof;~i~u~it_%k}xaQ*02X~diZrgdxb(QL0B?na zJ6wdrD&g(Mam~f0$8|-IG_JY0^ti4JMtX4Su!tM>v|B=-jA1ddUnxWW z*fBZb!x+=4)#<50>e0d2qU+SxuB8SgxSog6GYjt1(VquX_%AjI$4;4#WF(9XfMa*et0j!0wq{&GMh27%biITGpbyLU58xN`a z#L3x*RFB3XM>Qr+-h4G@~tPh=+EAEhXo%ZDl?=I&a*;*Z}h9IlR7Cg-MglZeKPZmOWtQ? zVjvq5t&R(ytY^Az-Sl=96T>IznK9>(stkAgtA75DM~(@Gp|hBrmmCn>1O4~-O|OlU zgFnVo_f2`a#RFODbidKzX7r#|&&`M`3t)mhC!ixTdiT6@f-bN!ka{)9*93b&YoIQG zslo#VrVH%o*e#zE3`?&GS)tvT{G0BYdJ_8@B}lwb%M#80+^xbQ>0(T zHJ=#@4-1)@#^mXO3!Ax_d27lHL!T0|<{efULY@*L%Yt!^t?T{^As=`9rcl8#H$v!N znALbf$ZGUs8zOW!doxFgSSj~WF)GWS zUCc0aA2STEVuq1tm?88kGdzBS8Ab^L$}#S9qG4!~Xc)diG>oiL8A8vf43A$`8Ajbu zDR9m^O{F7Pszj9`L(B?^6thMOqH1K7kToJhP>qNbvW5$S z3gcxB%K*njvMfFDEePF+OaC2kaqi}nmKAN!3t?HQGxhSTL~W{n8=S;7ZdhB`mF|ix z5|aoQ;IIJCoF3p7y?_1;;+Cj4l)7^t@#PlkSK+=wwNkI~k4n8O{$1D8s|2%9>}{tP z)#m&ZKEhF@WrW(dWoY%N!(lb!j*dTWIvG_PbGmQcfU|?@QyO0R_?H)db?IgZTf6OI zsv&6YZ!g_6=+_Rax)~C&w(p@-!}PTSj@&fNT|3B`nSLNT^)-2IXmo1O%(cIbN_{PA z?Iz?H*1j?`HAuJi`i#`q#IRK4pc}odf%Mq6k2BNjF;4HNYG}04ndxg*XzD|2!ptqp)7OO7wn>h%;IB>AlIdnh zmZw)}E`?ki{&8qciDWukWZ5B^>hdgEdu%;6Hism%EPsE5xscM@9*#2GmpUyAa%kHl zO!Z2gFpGS5e`xN} z8{-wG^q$o=DbJ#_*~F09Wj0};-8v$9ycH!s-D?X!FAUUarRtK|!?QCJLaZ&*M?WpF zw(0X`)y*2>noVf!sFPvGv5GZq5@u6BL&}I1VymUb7$K&_9ELGk$LzIPn@TM6B!X&& zRAMmzni5NtL{OxdZ;kC$NWD^z3hscLla18d@j3~(=((|Z9!@BTp z@K?F&g&a4vN}UvmaHBk%c%HL|>1ds#vq{={F=fFtvpsLp%-FQOHdA)BnfiQ9QhIEY zO!;+^;jQK#l-BlalOD}Qy12QAz?7BqwJ%#U3>Lz2v|zhencCQ5&QI?*7Y6I7+P>3-#E6I8Et!*I@%s=WAX)U zfLdjz)`2%iJHl60*=P4-#vk|lTDP@bFn*>HjLB-jnkB@gRoFGCHSm(i$53mR>+JbV zo}*ey;~XjDr9ZsPc&SFaRJSc3n!a`Y)k33$UNz||`EZTqZj5}gMzs4g(XruZgmLCk z=I9$N82j}T9M>0MT&9dU+sQ%;OxqmcfK_{&{W5Dyg-(Sw$j^wC{TDFw;AhM}8sX^Y zWX8|@1$Rp!=4zSoB`r^%t5{Ma_Yd@QT;Ibs{+-WJbJI^AsPc=lZhu=Ie_L>9)L1cN znMN?>kK1tMAk9G+bGt+C^^u=3Su4o?>Up}p`Rsr#$_h-*);vCk*O4Fnh`Gw=+Jk|G zdhJ}Q^Z7xerZU3ebj`P#&-aASd|y1m9NRG8K7BCX8o@ZWkR@z3);n3$R)_XFGlr`H zN$7?*_QMJh9muEI)(D>27GSp5fD_(Mi21y1&SrZ41Zy*xIsQ`mnL0*}=^IEhmU{*I zWn3cakh3*2d{j?47h``H=uWV_CnipLRNq_N&}gsH62B zaLQlasCmB3KY}^#1Pk`R^kaGc^1vp+h@N}Z5O(Bf4XcWkt(rLFLX0MAe^RE6z^;T= zKf|oc2bH~`Woi|t(SWAuj77$e*$lse!RI7U) z6wIl1TvmUFoF3pO|J5W~KfG&Mm!MN!S-&;ban!$3err^${GKVMX=^~MG2DE+X^7OS z)0%l^227Ec$;IRQ-mz{Iv3bN3>|C08^Z7|58jPovRa9l1T%I94ry`y$lQy1rP2pK9uj<5r!i z-Y_8d^FI(anuJRyIj9|ybmF+ls2E??nC zA+Bk%w!A8K%zom_=e{>zt*Ge4SAD@(*T7fTh_6bmbN0y-z)$Mp2+|G4@V`LDG)Iiu zP--1gVOP7jD#)R5m8c%&=BiR_@;)k;2RRgu@>4&~IqDPBVIW$f{LlUn!B6P#%3eH#OzKyS@Z5CoKc=$>OzA}z0 z{mdFGR~`*=wCrI-_wo+{yUVWyYUE%IwA+^*_WgZ8wSw8P@EVgdwIO!PEkQRZn3;ZW z5AMSprQx8~?X_~@sDbjErUB?{djN8!+tyfnnX^NFKW2dL#T-EwH;5TcgT6js6QU39 zlONIabX{9WVN zvo+##6?R+pT}S>MCd4i&Q|qW7<3|gb5F=~PGo6O{_0KVG!>Gwexdb&P?`DwLs$~&I zNTh2eQP$*xCfnG9VYV3SqX(_AP1~TG%WNHXC#~cMl(Sj=>D@BI(N_lvN00#@5chLQ z7u&x)L;6Prm0l~$kV>se%~I><6@r;0BClnxioN@1*z3_%6-@=|Vx88?)|577sf#~B zE%`T)GG!)~aZHg^LkgSzbJV?C7wn%s&-U7G{241UsOj3l{Y_%iJ{pI5?DKwRdStJV zn&F3^t&XcqHDGW2d-FNRPWAP>8M0r1$n{>}JxxxaEPL(*wZt{sjoon}y_5O2(>jnHii z0smbW*7f}$&UoY;lmAz3_p(83V0Vo@r#4V^yH+n|XT%G!8FALAVP*70<86!@Q$f_W z->E)j9HgcBp;WSH*6rfDV&{7WuDc`HFGJeARL?@R_IjIeAxC#vBRJ|> zRE|rUAl)__tVDmo(b1ynYjap%6srRr&FJUrGFFKGvuc~wk^7=(EY@C@*WMAv71*t)yRd=DX&BMk*nym2txz@p!(5~Pok)A`KRb-= zppdg#!LgoX`af0n8L$JpwX5FU=-Aj8rL%Ms;_{7tvqU+yj17OiYQ8-|E8P9TsMj57 z`K(%PT(zAY*eWmFz)UuI&<0Wd+98(M9e+N=N?#vdptH4i$k#Q3yhWpuTMjXK!3HM( z&`*%RaQ69mD)D585DqeNHIds@rfA zSOXp1Iw$BhGaey&*)4v;yZMf+MwR@} zcA+ZyU3=BCyMuL?(dJgWfVr>yr!Z(|(N_8TmqN8o{@s_VH;$G5-mbmVAz!^DQm(w^ zOO?E?6wrOvq3hQd+T|!K*;e}dsBHOll)egW=G0c&)%PaKiSPFy-BDG;?G?SjUk){D z1{4b(G z^WJgRTV;-;Kdz({>0H=Y!(n5+1!*z-R#mChWR+j_XJliAO)8qydvfOFNFg)5+ckT( zjV-EJa@XE>6)as1tW;Z-T^$f%*IZdIAHz)Qv406ZFPzKmnUz*1hZscpM@A-hSFyVm zyZXv{l3pg;HD=cW^;~?b{13WyRU=gTkod}_%hPi*C{y8oyXqF zDNM_8gtxLYxkd}p7;RTAA8Vw+PYyBq!CLdBTbL_Cejk94ZnC0wx z$ht419etd_hq+3Rf@H2xaPxWDlDlNh$_YDL6C9c$3dXid@&FavoJF{27%EsTMw$U&px5e}=KPU(HOvdv6`Jovjtt zCH&(8jo>RwEht2t*J4%gWyWL`*~SYz-M=m-_8GDb1MG3aCSo< z|6jl<^a`mRe)8GlaYtv=%s%|nYLBKbctF$pJC3eaH2r7Tu?-%}bX?O5T+)_FP+sQLBw~6hOmUt}(|;@I^q6lcqNY+=Hfv9)zwZ zU1-;GO}_z}zF!|9BmPFk-dx(9j)kT_iZMykM=F|rt5?%MQAJcCKXUGo2lafP%8WQ; zU@cShd_C#;Xwvh#fWb`u{7^vnVAA!vz+9c`l~bhaW1-`r>mMznCmL~M)MH*<--qjZ z>z)W*V1i56--@$qtsRaWND1hA$BVEtn!jXjZQm^?vdq|r>w0RXR&!l%b?N%A9?c|?Wl5bj} zKOOfHn4{gossqY@?^tDFx)-#9?qg`n?Av0A)o6o0Q-2lxZZ2u;ds`jZ!=cBHu*d}^ z+p2z{d-Y!(jy5aP)vEzl~n>TJ--`_g?@5ce46z_OpS|ho!IEvu|}c?p$V$^?zg4{*G*$c&`9dCOQH?7fm*!c4L(8 ztVRgQms8u>yF07kQFNrWv%5Lf>N7c`^a^)8^8hd>(bZ79_=W^|R+o8MES$2Qu+@A(LLVDtZT4OAH1V4hF z7zRDj&!s2+&{Pq)F5M$~7taRWzy9EZhB|$HMQ7&$b@taQo;| zuHW8?VLIqiT})p#p6gPbOPAUcvIYAQ>{0jk`C1)g)bx$y-iO+n?%0btYq&mjkUnj2 za((K!-j`$a95gC&Fy=l5Q=!1rP+%(9g{j@0G4*J%b+#iLy+fxuW}hd&md2%1`=R${ z><6(<=W+!p&4s56K3bLL#IVZ#0-`ze@85zBtQ>RkSL{!F^hlYNL z<$}`j^7BDDxnCgn2yIq;v<07ycll^na}Q}C?66pQmPXUPOj$NI7wDH`on4yVL z2l9PfkB+c!_R(gjOGAY5#Rg_{`D={}Y80>QOW31eMMDe96@RVm zHhU#^R~dO)jLJ%HP&}B9><0L2&wKr~XqnN;Un_6&50HN!z&*B`8~KcX&@qmCTGi?W z_Cbm#7LZ;HX#228K5*wg5AHGUowXl@wLR#v$lG;Odpx*FF5fMDV&vQHp;mmif78B5 zd+B5Q9sWU)9^Y+MUoAM`L|+yB1|so=@kQ)=$$QWT63XMdbul$nW6rM|=2v;m6>f+l<&79uJc}8(yDs?zxp}6whrQJeHd@!@2Kv(|x|% zK{j}R0){HSTOm#zPrloA&GN7P{fyy*;JY=(4RZT#e_QL1ex45xh+xKhPC;iH#CiwF z124OLw}emmPymZWOdXrK{>FcOW*C~Z}8p5dwsV70n=0U zgJ2=T`#9j#9U;!;yUq9(-)*iC*QZQoDnI!dquYBMcx8Q`IAdHur99jaD?e$BY5IXm z@!sk?dvA{%Z2GZ*ytkMKyte_cd7n1Ay|?HkBNpD<@dlUowohFD3VCKwpxjsCRhRcR z=dfwd3kF5|W`aMymwQAif>$#a{DyA)q%aHQMU>Gt9p>w^XC z%)nvj!_TpyPb7JP;rZn);kEQ|n2tCMK3v2sMbvtIxUUCzeYonT&OY2+t)6_i_I|;v z9NrP=M`$`B4nADHVIVAm0qCp03c1p4b)4IWYj4;f*pK$ZIZQwD;l{t=_2H8L*3?HJ zZ<2iwe7F|_zTJoGfyd>;ed9$@&IlZMA14Q2h7Z?=i^+%E-Q&Xr<)14Bzx7GHC&ZBt z_ff@%OK@<1a!sU;VEK8#clmI06(4Rhop8d3+l(Fdb$DW-v$+rVGeM5H+|3wx89v;> z|6U*NVD7`c+)T3c8+^F$kq%%QC_~0ONJU(1l3x6TWf8ika z;R0Vm+|#9QA8x7j2>0UNDsy>nxkQYNyG7pH_zM+H`5y0WrptSam^nGzsCaK7W8l60 zi2>eQ-O?A~z5V>pSc_hlo3|cp5-uy=Tl6@l+_h8IUYY3FhVx(eoZ+`UcAiyzX`@aS+V zD@d|NBj{}PmB##L_(65*(UA_#xd^K7IDejf1)Qj*s)|VIMj7`wxZoz632;m2**n*d z>8puo7JZX7R(oNfnX_xH`5oEKAQ;= z3Wk~1vzAyuQQN#d`P+_nA%JV$;bR6O$tV&FPJNLpwca(qT#7N(vD~oB3my0EHkDzqG%9JknfI@aM$zHN$gxcXGL~RnN}F6#Fl7}BgVo%Tr5nE})3Sj&t9EKjdf}{f32%l|2_iIj4ZF>Dyxa)L<#{Mx5C}D zLt~#oJ5Oz1Q!Sxyct6UmG``L%v2`A5Q~G+KhOoj@gZjLiptQ8H=fd63lJF+#D053? z(}NVqK*>-Dhuu_`=zXxo) zH8+?_y1}xft1KJ4`7G%S+obKHmyzul$=wU}z(+Y+jrb*JPvR9vnYPkYn}xnoq%PWz zazjzJ5YT~Z-Fy^QeK$O`wn*Bf4U-P!n@;9QDTuAwy`Y`BIgW6(MKT?}YcW-eH9~Q3 z#9f7$tHMhptCk{y-jJHwoA0^Tf@<5f5#s&zBe81VQs3|X`qpphpJYq2(LLgt6=EGU zwx6k9Jo`j(*le!7Ew}wB#;ZJAknF)hAO0!DHEkZ!UWhF*Dgmt;DvmNG3w zThwQ7i(%xIXR}7IDZJfr5m8}EyJ~Mc)IhshwS<-OwhO)Ttia5iHrx_(`HvLZ3^RM_ z`)Ne=y)$9X*fSH}F}mqcn||c!{^5(vM<%GvE1q7<424>@Mf>f)YZ)X^P*BKjtsq(@ zP@uS5BZvlESuu!WmClHuLvdU-Nvw^}lsV_HgM^ucmY`ORRRYza{Dx??i(^8U(4;_V<>#SB7|=^>ZH&MO@{U6GaJ%e00uiSst_^A>nN|gD$M+-Y3w*R zUq$xnNXA{oT?zVWL+$lVnZyNh|bzzbwWnhey7bY5NSgND}TeNiIt1 zv`pXNq;cJ4wlArSv`sk5OQfGW71-t=T9#WCmkv~xS63gdsoBdVFkcg=R!`Db{<4|v z@ZT2<+0CiOIk-(KxAr!R`4l-?GM#jtn=A1a!wUDamqTezYV)HW%|JC=Ivx?KLGfbE z&EU~bLE9lhf>XT(vAENOLT^1Ma$cL-RlU(u1n4%Do#fk=hopDNSUNT{cPq~zY@+gImq)%bH zfG-gF`zfMmtz!O=LIE;JC{*ma$X*z4M8pk6uS>V-?$+(zlC4?y=d;nINxoWTx3#bT zDwj%AU(=2zOM~nJH@>$RD91e#>1s7$9Yp?>En1yA1$d)q)tIao_(Wzg%`2wv=}i;*}D~uvg1MU_Uh+>W$w5Cvq~i ze)uh<-*uMVnaz}XS1a;7=3ZrG>`{ls+HT=$sfg=3ldS}n1zGfW$99H9Y3m-FuV)an z1Uq9kS?Bmj2*M)PnwOcZ7a$iD`-@hYcE$)Ozt{FPt4zqBA4dQw}ZCG3`eTyNPCy})uHpCpYTy_r#3XA8!?;1I58_k+T7rN}V<4D*77HIMHv=G^SmUNi9> z5paIe3!l5ps?}j6N*OjZe@b^1T6BW;z#j3&NOyg=#?+pCb8OELrJeRuWmHP(tlE=3 zhYIWf-Z@iv+9iommW7_*=8}b;9L?GwxmxSz?wPP&KVk@BRbr1pD+ zb7gfWfiGaBI)u+U>Aqz5u3Khfqdfj zU7l4UIn8A|$`mP09IQx6rTv5UlHjqIlr_%K!{&nghacjHz`k{(-YxH7*{y>84lOHy zZWIm6-xz|#B)zNbG$SE(lgFO%k;BT!&rJw3S9u_%JkAe$q-)gUjzrU8u^N&ew#1fG zbjQ9Fe0MS0gxnocZ$KjE_b&`FzdiBovCsg2(ux^o=wPmW6$&7!-oLP$dBubhNNX+k z1pMP~ovBTs{1SNSh$^UuMV=m%`3vS3xIY7LFI_X$K2~_+nQrE{$6j~_?-3>5`mZ(# z+Vyfb^Rx+qc`_*3tslS1zE%4C1iRQB(WJ|6`Dj%IF9HiQe-3Olz0=;&8CKdWUyP;| zoYM(!lL@!3-HunY5VkNvb%=S$$UJFB{6;7Jg1_%u-x3MB2$uU~^iB}bZ^2Ax>qGRE z(G1)cX`z{wT5mxAU5wv#NQ7tN;!Lbc5cw!}OqoZqF{0@>a-|vIGBr}5b&2U?~_ z__g6ZDlPa9+8z|>#*J(d~ z2%mgbp%-qMr+g#r8d@J(Ro_vKrVcSw!ZIL;}Y&MqQcO9$%g=Uo+ zN;#FJL0@`H_S#1Aec=I{p)dB=ycd-P@9si_+P7(iGHnODl?%_>$wsu@@9Fhv@>qD@ zQ8XQns*b7Tt?S$HcH%i>BYuUkb@&}Kp&Gx#CeT}pTPDD3oiKSq9)8~$n~C3Knu*Ul zie5O)9_iG1jx>ip&(KUadZ2l*#uL28E>8{8g``(WO-z#vLXVm4_M zPoP^alNAn&2CG6(hPOz*>^nvB26A{)vq*9d9t`ev?Pg939|K<@q)0^TM5Uz-ElZ>~ zAfXD#Um9fiLo=g0xaBS7iT7?Ds~=K0M$g~djG(b2T{{38@e_m~Fku)Zsj>^;D^OE~ zT^{XM2$s&4|0hP0Z6>QQR;-6?id~)Vm0CM#Zm7=z@K~6yVSniMNGQC=OKOQXZ-Jw`lrONL)37tAadWhYI0+_Zry@+oeW#M;x?L~((9A^&qop(I$KB-uFnmP9fB-g9WqondgIk5=8b>i22rpP@FFq z&ufG7ERK3@5Mf#IukV`BssFQzA4WW#B?;Wat*taL@^CAuU{C5%@_yG)*;Z*c)vyc^ z=gI_e5t9SFV zGeR#aJFKLxy4&#`qmlwlKB*C%QsF#ByN>O&E9H7El6c>(W3|e;mj{oSKjb!-B?@he z@Sm;{;15)pPR^5Dbb8h>fFtah1;Wf2Xb8@GHRS)|GzUI#b2{lz@{`f2 z86;9|o)jjvxz5ZK*`-*WN-62ttoCNTvcDy&bMM%ZfXeQxXzDQ?5;=uD8_=Z77I{f@F<-zqiTr1L&kU*ECwrjhR7t4i!E zpYdRitOAtv__74nm+SwtA>e<^>n!r>;2AibX~8MmaIznX)42^pZBXBI66MNCtH+jc zNiIk%NG^Qi#x1inwK_HPKNg-b5@UkfaVAr5I$R=UoB(x1y!Lnzb}J#~$MnD=w>lJD zl+f-A)>1<}o@Nrp+G0pc(iaXC9FTv>-QRY;2jV?@@(TF*xuLKbYwd-FT3}CDPj^V2 zdLMaJPdhGm{tn6E46gL}yy^>_>To5Jfm$^<-SrwI_fx@%Wb+GS;i(HE9kpfx&HBbz zwfVV`du>&o`dLmVb9;{*`6CV=bdnzlPnBEv9H@61Tk15nQYZYrIt#m~Bi&aAy29px z5Poe1$7B(ZJ%H2YTJDv=nYQVqyB>$}5#q=d0yw{N`=O0eH+ZQi6^xWs>QzWQO`Bv?i2cVZDG~!`EL3KuJ!uUs77bbC93P(2mGsD^1g2`ROh?;`6e0Cd98lmT-EW$Dhx6Yz0LQc%fCJJk0!p4{y?!X1wK8`Z-xV zT$4CPFs?@+-9R^_@50PU-`F>mo`YB2D?>>#5Z_%{;id(J-}Z&j2vicW9Q6= zCqEsXVD#p15t(4YwBnqY{E`lvR7Ly!_Nr2wJ14k~ax5QtbIK|yNAjuTtfd@hE!Ams zQ7_FsLvG(SO>7z-uao?FD<6FHrZ2sO)_lMII`>9Wy`}Z?Tkf8`vni3f;e-~}FZ|&+o8@;ymMiVL8(wXO{Y0~R zn%kf)t%>E33b08oM!R=sMHYA#7@gP_IF)Dl%@IugQ+PnHKX^E`PCV(3O~FpW6`SH1 z5#)KM7#8dYJS7o6&(l56RBIJak+#P<0Cq}>r3B7DU*MeQvS;vof@FFJ{A^T1*$I|O zfjBv7H<r&Qvcu(Q5d5~jQRa{R2-uKRUVGsN)^fd2<_7~Zh znM*I1<~IOdf=(ppV9Q-qrNHu|`7W!^lg43m1$Vi3vw_3g5yM>8wadfT)yd3#XB{rD zpG)45oN~4GoYs7M%$Oo~Z}8JLQ!T}AxG6%hQy$z=CfsMU++V}SCVOg-Ris4rI@t>k zoNwOWQWCu9vhIjq1wMC8*UkmIP}9jU^9K`q6<(dVVqz%#c3Ns>a?X zm7lLF)J-;KS#WQ@kHt>4yYC6OJ3oZtAiFCkvcB~%Vys4ZLsnIKTe;gHI?kVBdT3Wf zZAgD9WkphkGf&Fa_A1On`!;EwRPd3vp1b`HSKm0f^_v zo|In2OCV>~e;Ni~2<2JBLxF?sO^wpE^CGF`b`e6!>$)|Ki-I(?Z|myBIQWP z!3z6CLxk20DWo0~FNfiG@c-It`^SILY1JDZYuR_j+*rlF)k!NiqH=pv2KKMm`MNOD z*;f)iENB3%rlW3K{(j0=$~$~^(p|Nmcwc##`KpHxy6!RYNaqoKThQATMTeF1u2S3h z8bkjZ+#*-UQ2YWUeX_|3)p1oxZRM%KJVmuCK7xMuxXvPHXoHj*CA`M^bCjYQ zi66nQDQwMhz;kM9P~jO--4XI<&E)SCw)1=)zOX|YQ3Ic?twK5Z(4B9`8+0T7bs&GE zZEPXcecM&Hxq~7Asjf8m!McbYza(C?Vy~f$j~xi2d`VAiKh-9^9^Hs9mSFY4kKb@9t%1iakGZA-MGC=T-0blZ#XuEu9H<2P~pq3u$) zBBf0643YQU#-r;9staG})RlfMqbvQ%g3o9M1?Z0zcU3<{DmbL%!$(5va>h4R0nVoP zRvIN0puntPA2&)3up=GtU(p`JBD^6(uR=8~R>|u6}<# zoi$Qaw`wSmB%6c|=Kd#-n?5e2G>cv}%i)pm^;S_wJ$BitNio z4@#f9{8c#h=6i8}L@l02ezB9OinYSgDZhz79sl~whM7AoG5C^l=;={)VQ0tHk8d!2 zOcwS&yho9(RpF^GowQjFd{llW$1=!b2x-@pSmgbnN}TZaFT}4u&Y=P_Eh$pg>|Fsu zjB+xO_|Y722WD(JaHza0M;gTAL8>iVv^>vQe&k)rB%wD}ZP}&dohUz6E4|1gEUGR0 zl)O{rAATwQN+K^YMm-ShS8b`{CF4Ibo!Mj=fVVWLhcimvdDFSQmhlz??2&5ARVD9l zrVGa{KeZShr@R|V-euD#f4BV7VnFOdiA9$m%x0<*fg76{9&D~J_h7T3yuQ>DL-Q6r*t|&bs0(P`$WyR6zN-AvZA*6v^G2S6&GAP} zhkh%CN|?9U8Jh==lIm)G8wG#0>(JO!Hv&X(70 zvkWIszTf@WypXF<5aHH~)dPpitG7wR`Roa+<(1jw)AwK%oMah)$#k*Nl0v-#^Y^Cr z;#LpoLTKgDh2%~2$Uk>38*#sm!<#G5x$_iWL`(qu4;R6SC6Ev0R&Y^}ex|QCp)=2J zcY?oyPIoWi@ltLsquAom`cY@Y>c*WOUptWA0c=gYU4lJD`6Z+(Gh$O>GcBSeb9V39 zMG3FqU7OeXyK3EX$I6n{_4WaH(Asnf_T+u7Q_%YTJ_1wT&g*LAiZ8t*TOSy?wU;t- z#Xr7#Wr_q{FX z*+KkUb{{m3Ye#Zl92eiYcp{a&yA-#rUv5?GuEFhYYWW5$>h`yn@5Ji5wQ^T>+vR_{ z%jw+I?b)Zd(dbN%Jf_&Y`J9(lacXVjcGS+BZt7F4{~}5LL%UEUkqmAPB&y!8?JVzU zFW`A!5xX|;&f&k+mamPX{oUsVB{qYa-gn&X$Kw$2+r{W~_6Lm!&c^vua3xM@AazIs zDmnR;ieDvzUC2dm*thRvSuwlF`z+$SM(|N6?@n%EdHfy9Eo>XV?-Gk#_qRwh)uGSR zdHj@7B)Nonnms$DE}*I{;`^W!u2Xz*@~w3}r;vnuoZ#>XZA4%I3mk4~7vA&)G~d1o ze4p%Hg%aCt75Pe5uzOmQjowH6j`n(r!g06n3f?x-PN<{oJ)T|xST}^>JH+rLWJlR* zIMjIe;RiR^yBu}}0@#~?1GDMfi=MXh(Ux z0rFEU<3Bbv)Y1PHP*+>%Ohk*Q#~Gxt{GKT8)Y3vNEk`MOh4Rs|o=%6UWf5;_p?FE& z5`KG(DBV^@JcD*4YLqC3703_2L-{yc8PR;0U`+Dyv|UAAc=Qm}pt3}=E&RU#Q0zvQ zg-S+zY#2P=pDdPLdqpS{}*!-yh%h?;4*+4f~AG zPoKYS=FaaqGR?X-j|mBRaMoO(`Hbq8KmSu$hxPpbWYzy|Sch%dY5ecTy72wz?K`mU zqfNS4W9;d&_Gkf_+t)+(M_2Vc@&fktcS~@ar$;5)u8SUtulVRTKfKFr;ktwP1f1`Z zVzAJ^wY0_Cg zY1;49k$k7-?xm~oXw7UGNm(;)?cW#a-6-A7vO}MkvKwi4-I{2nNGsgGEaLaUU)1q? z%U9L>{^Zy2)1W>@T2Q@~yIxC;tU&BHrevIucLy_}I1Ib>2zf{$VlG0wwxIj`61xok zb_YcY;hD!Yx+8JnMTjQfB2H|uf7#wdQ8MIZ^gYp3^!bO6V|N5CxB};&?sq}4Ce~X+ zy>QW4CG|)aM?*CH9*2~%sUBfZ*#(U{JZC8NMIMZe&HM`;&c|qcoSjgM5bjsP+bWMg z(6hAh1hrDy7SIUr%P4&-cDnLSn1c8s-cv(-9`1S4j%bm`Vyj z)T6n0fG;F+hLZB-hCEnUt}i~|%MIlH()#tn zY~0aXv#vYy+c#Z5uMkFn?Q~A z6n8~?{*Dhqxzwfe=8of`r|G`_NNBA{_ex4lJQWK2W}`DDCKHjL=HY-J4)P+TOpD-An%mex4Gc1y_wGN7uu2ndZBG4Le5}=$r z5yXoA$#U8RKn^SGhWLOzikQ@k@%U~neOVSVi>$G&66}9*H{L|XcQWt}@@_#8NyZou zZA^X8Oeb#TZ(@L_FHTWOLqv_%x&Z&TqSCSLI(9%q#9lGF%}~t-JmlUY}x`l~F4;D3VNxaE29+C}tJP2s(m3D`tf#KokeWysS_-U)Fw<$^=6F0io$AeA2 zM=OCp6*$#U|7W_!DTl{oQ_f=vt9KFMDkA>r498#Ko0!SbD4grA5Hn{x@^ABZ17PtY zuShx@P5G1y{l?owxgcyQD}uzsTM#1dh#d?5dh?;I;Hx6yVrq>}zKg+r7$;jnB$u>7 zRFfqC2hH^57mg>qNkVN++1LjHPw$=eln@4I)3;%i*$3i$+SLXnZoIyCY+s=#|GvKB zy`$XM*L&wYZG8HQzeo@%ZzwBxd9NiDXWusjotE_>n_qcjqLD{L)69=>O-%FNjfhdo zsq*9)Tsg-)IlFlj#|lB0zYx2KBth{UJSQj~gByaft5Bk=voP02?pZnYxqH=LSdm?? zoP)tipcN0i;U}KWJSo;?VlT8~X8F-Zyfai@gJ(xfxc}NV?|W^ z`p^3pDpqE8lJRpi8Mswnm?25jotj$YkR;Vz=;rj8G?A2&Vm%3J9dTU z6iFJ2xGZm|v6v3&)ahbNQ2NWE@M07kqE*WH;oMrP{lxM2i#G|yJ%cV^c zz15XvllXfo$p1|~NNsGf0~WLjibw_oXW!xwoUt7F!vW}I#6o<2fRBP-oN##|KpGHqJ7p`06zqG61+ilJLdI5f){MtQo;hY=h@#I&Y0|?+7Cmeie`QT5t zEyiYT&;e;TM!N2LHf(NY2RNs8uiJRQ5fkmf<5#5@yiIyw=^8h42owXi-HV|>XdU1;UPP>Zk z<=LAco5J(QuF`3>5v1K5=WmM_f=x%ZO64DK!W(daF}j{h%sIJ8pFsU7MyGUGdFH%> zc@V9TbURhL*Gx2%h`NS!EhONM_|M4_ji=Mft4>6L1+mCbv}pJUJxj(y*bct}}9-qF3hhI;Sk z&-F}@{y!*1{RaLCUy(S0F>#JUbYYdY7jA-`YDjMutCG1F`bve}i%C_Dg{TtvgeA%) z!{t3g&;t7e5xtze?)j$9zan~qs};S)W1(Sp5Hy6LE;t7#;j|{OD!|?J{K*$0c8^45 zL=j~B(w$&lzcsWDw#=1|ZAv-vTH`;Y=RFV9t;kdAPJCS{r@FbvZ9S1nrHy=NvTuxy#5pc1O#T z{Qf`rCXmNw4k}y*cp|)eM$Z>2f(lpAK4`n%ZJ~buFH}J0{}VRnU4po?<=@dpc6x=! zrjO*Y@ZV+mD?3j3Pj%#_R9TXkVVgT{)-#jViJl#St3JI~3p?Mt!!FbMAwG3aqUk8U zop{`?#TRC9j@ZwCx&M|JMb_q))0`EHd<|mAaq`96Ym?zM0}{ApI0L;s#stY({IP@7Jw%8s;@xPianxW3(^xk5Dqc7Jyb6R^$KBm zc%$oxa`9Hz7kRv9IN&Te)W*LG)xcvfytGI)`Il!=vp4@A!x@P6>=}~@zs(YONitgU z=sjs>%2qr(6`zEep9oRD4`=rAf^^kOFW$>m^s=!Xe^#DAdTsC#_kUK_9;%L+ z5z}bKe^$QI@;m-EJ^r^comY@F^Bsl0Ti_n4C^n4$f93u$c^GM3DE_;0OV=ZS(Ht>F`VS60l-ngBY-*lBqU6c-Pd|N54u%NUH7!X-FOsTPN zq3B!V>`ctY0w^p|v4FKT@iRA#K8Tmg`xU%!E!8^s1KDR>$D=W2Y> z>i(H*_4wFmoxQX~s~l4aY`%vvptW|y?>j;NtGwV;BiB%kq?JBul%SRH+Z!6H5jv{@ zzXs@C)St2ip1F(oW=z4MA%#48^aTCF=I8om;vW&=Rm}5GDLI4pdZWYdhXs_nM}gzw z%w33x{3bY*u`kBc*gIx=$8JDm9#S7EBdy=<9=pMnlUU>(`+huQN0k2FAL+|pjr3JG zF9#(P2X(xLudJ!@Ub+<)V6P#CL|?gkziG{=ua>vKC76S6U(JiCuZh12wQXEzw`x}) z6{PRMdxNj1b8qBHCuv6i+dM-edsvO=J))JtpQ7hx{_Q$3%*E$Q&pWe2ZC9!1Ur^8K zn$EH)k)WXYD0G+7|ffo@2P5D{WzP#Fx7ts|lY z1cJ(#KtMqeVn9F#Wl;#=#-@Vf647Ch@l(W|K}0~J$N(b4FbpFIN^lty88tex{O?-Oy>Bystk`Tl46d2(}4ol~dIIdy8eRp-`?h@gv@p&_mqBVx-{dVZ*PqQ*Vfg!0L; zR7yUAGy0kbs^ORAvyHRI;SVc~^nWpz9D|~Bb;0VaCD+V>OJ%MuHIccD^iO$$CoE8N z`k=x8pOKWEw@A#yqu>q8le*}zOnd&bXzH9z2K|u{P8k8p95ap@{HyBDF%b0=%5nOB zgU`ox=jieeYmS}^WsZR#g>tmKWv-?75oh?;?EKpZj~XXf6TXjR)a&^b5Qk{ zSs10l^RxGoG!Oh`glEIN?B->gbNasJUyG8?>wvlc zN(XkTtus^3ti)I)qQBVZ91cF(I|t{`qaG~plBt~q(bD>^=$qoH(I(kEwv>X>JW`6e zwRqcpZE(XJ#E#a?z>beK?q_Y^k+gzXk5)5oeQR5BwpL1c@F?Fr#nY+HJV9$n4c@&c zU%4v7(E%Df&Fh7gpEtp?v40uPN>dcHfx1_z30wJwobNPNfi|EY5>EiC{R$uRSKMHY zbK}!N!)D~t&ehqaSt3GK%(1N6-Z5+r-^tC+?yjsLMun~7DRlQ@JcV+vDR<9wXYSlt ze5%PVMbET+b9IGp0s477@6`QFh7&mU<^-|k)vs4SvFqlqnU;m!&yuHG;2Q|dD)8K7 zyr(3klr3HlE=jO? z&qYiAXQ(uVnenN_D84HFbX8+wzAv_r|w%p;3s$*jXk@b(WVklir)*k*pU6X~g zU^qiqTzH`O{P%cm2U!*uLc`4$SIGaoigI8P==pg_PPUHlU6%9vjyYHQE_4um07sDD zR}AXgHKlCuYZU9q%5;nfaJ` z?c-ZPd6xBB)(<@jpO=g-RQ$G+d=#)dc(`V`InTH?^R%*+^^2xCY*yFsmd?=8`ZPq zY!bczd*KNSvm0TVIgalxZ4VDNYhChec#k97UC)!T*8tx9fnL(sH2~G-4%VV)g>R|0 zs9MUwAF^=5la#;wyI*z6+D@B3@xx)%MtJ?f+rG~d=dUR0%Q}(v;CHHCWLbW=x_tLovUi6K$iqceBuLu@FAN4P3TlNv8^L-yqC+$@U z{d@jf*(Lb>TOG2*X`?A~i1FbR&*eDHo+qkT-h#;KY49YY29#YxeBS&9XDAr87W}@W zVPW!lA|h5dyf%X0w-jd_%Q6p|J-&ur5so1%f{!_{$A)M^?y@f1T!vjbyj_`x2rXR2 zNyFFF*cJyb0F7+>>>)HWenrgv(Vq3~CMUcp$~J*MT=YQV$p`(~k*!syjt8HtWbe@~ zSmLX-9Y(7>j;M^o=0$;O^j&8){E2#`D^`hs%N`t$8NHvfhhvzVB{urVP79-@7}QEJ`W^ zbU1h)o-`>Dcc=#kOWIKOWuQdb!?=S)QVR`l_zXslwiRpfKlBzOqhsWVEoZ@RZlB#Z znSS$0c zm_rXe4O^)DqW#KS)%qXD8`I%i$=FHc~FU%vTva8bAxa{h_h5MD6K^8KU6 z&BG2gi=2m1UNt9_a;Q1kA@tXB=5w)#4+xF$k#jQtxnfSX@L)~!oa|CL52{A1`X+kT zG(*gq@S$a+B!jv^(HP+PSq|!9#_{M`)9GV%VT#1O=?Uy*TIZqYbv|K^$aMByVh2;4 zcF(9EdQs2s>N@k@%5!aSeedOXCrss<5z(ulv=4b=#QNTgK()R%IUhuCiTAJUT$Mff z0dzY+se1kpE-k#_@{*M;@a5feZ1XGIA~LLFhqD+TR`bN)J0d;|d=5nBu$FQfbJ&B} z-@)Dy&h1B=;a(4C6nHBDyv%x+{y+_acCpVS&Q(TF{(<5y+ezmwC>iS#n1kSn^z2S- zM@+G{iCAxOuw|$+!s6U&4t~uzx3mtb97#pZ-sF>SxpIoi8`0?U2`uh`ocJ*l9Q|o)E%!8r~E;4KvJIlkG>}HRlHS!c6R}70$nl z^VSRx&sfMAhTT=1HW5F$+P|?g-!m=wpB7j{=O|V_x!RMRbaHCSoZ7Eo(ORBsRP?$0 z+RilRs}J*(ir_a~SL%XyWoh-MpTb6;ag;-i-CgxDa(H&-8DBbEStZWxzYAy3-*<#G zyfeQVax31viDy|=DC=Miq75&HexHQq#Bz-Tk#2=G_M9M2Zp};OZL8hEOVvQ>3yrmuZ&dj|4ySZy|9yfZt zBJTdmd(OQ$n_N;}>1UjPy3gUbuu4G(dJ|SqPN*M7&8t+5GI-Noamw9-NWD$7&=y%* z?P*nVN&gx>M3oaPX~p;|oJnHjT!t~0@CuYC{Nn?C(^`BP3w*$TZSd_M7Nbs7pCHF8 z@hzl}O{RZoC&ek0C&6gw-7k2A(c z)CUx_nIWKSbneZ>0XZagv14$i;l$?Dmn z+$ZrYm%I1kRlA`9-Y4HyhP6#bNNS!!Ke_4l{^Or@gBRFjUG8vbqexWpLZ?NZYuA$5wU2t!-ezjdHM6* zg_y62_uubB&D>(c8{361+_QY=?m|ekzvU{{0OW^kh&OcD;xcDe*|08KSaM6P-Y$4D zc%-K4RBS5Ab^d$pg1ZY#rqm)As83X#IE=UGKSG%}*(&d`sujWeDg{4$7e!EFz9_AM z6D;1-gKq^((o~88=_0Q_=Lk8L{Id%5RvBkHDC2yb;wADb>dkdf$CEm(Vs@}(%{fA& zk}o1T`V*wqC@l)7ECSr;Rd!*)o#FEA(wY10Rfh`~-7_l!w?^R32kyyxmcJLC&n9q( zhYubezM@^UkK?5DMA2`X@0{}OOP-!J8|`O))n3$Ua3kLWrlpr-Cj5q&)4w>iRtJ?G zk@NAt50-pdg{Zg};^FmiY%6IMf?j8Yy~ob?2t5g;T=y`se`~?(6s)ARu)VTlsi)h+ znMt)L_@p3XP*HB>6j{&T-PP{}?V|L(g}GZ04Yp|$-Ur>C-)-Kv#@nDdh+cRC>k(>| zo$s)=d)s{Xb$jj(YBT%8*}G=%9@X!7zfpaU_pL5H{W$hWHgC)Cm49FGLXM*j$29qN zDfzv*b#?jK&v1NQQeJ-B!rps&%UnL}f|b1Q(3x+MkuPY;*K;!>te=$m9JgEYJ&AnR z)#%%Ti|$!eDaP&c%4z(T8cHq?-p2Ihn-`(4xi3iGAxV7LFTG=>A&G_K>ED6lz#1_J zfW?0sD(m3Wz#Megw!u!D@(1Vh)Ir7XjrP!bZ^;H5br1hPJ zeUmP;mb8d(my5Uew;_tlk$2yb<%mi+f7Q3*#ENwvrfRRqc6@KuzxnmT+-*||;k!6j zcX06c!6W~yIw5Q}^YmR<^WQ&gX!XoDA123?haBw;YyKeM2OaG=TBekjr|%BlkKQzH zRnYcmZ_-tl&R9X34cj;ExW4bVkm`vA;I^+HxE0~+(~_IOl=l2qQ105a+pw0fNy5;F z@HI8xd};r!=q+XL8B6Ofv*%n;|Jk9>-nWjk32ja=6WKc~a zTV;zAUsXyO-><+*+urk5y@K9$!`^;{&ji^zQ_#k~E##>5%7^gqIG#VndP6kgzXc8E zP>iu$RLQzKa=hw9N5oLHH0wBBGx}=Ki`uQKvb}=(uRXnP?^mad`nHFA#37yB(^d_m z3^$xv20;^q4Cq@78NR7H!8OQj7@=N2vQ3PDkL}!qz8!swV^-C+AjgzV^tX5Fl5YIIYr8+Uf3N?$S5^*wd)Ve{-um#v!v`XJrcj^s{9mxU`njxeYwy8b zvrt>N_D4;R0<+7ZFDQ&|>*y8HTV48O{D4qfZ+gV=vH?$NvmA(DPnd-@mfY=JxvxYA7`MC#reRz0S8O~nMi_`KEJ?Ve()mM)#DQ~fH!w#IFFg)e!+S3<0 zJT|;-Ir*3^De)hF(@PT0;BA#gGzp zeW{}z`Ccgdf#6Xg>nyk4Y_wPchl_#m65yY-;}J>u*)`s_YBFq%U=anNmTm8 zvxGOivuRtuetY}%>$?}@PxT&=wq?`SZ!rt6?U{Se$?^^N7*=lagP(REHRSk^t-)dW z>%ARz?YUCmekXfVj0rO-P5ZvD^sO#FxKrSao)$fsz*QGN z|E@>}e@R#L=Wsg5ETK_xm&$OugWD9GlGX$^@A7sCP6T}Lop3(o2A}6Qh3HUMr4MW& zEPRZ<1UY11`2Z|m@)w8xis;RRKX8O_l+QH%q4){Gi+Q`jJF^o?-mS9nZrArEeQIqS zOA+I{C$UgIQGfry8mFca5E33dm&6_#9Gi!tpLF(>9Y z*Q`R{wxICE%0Fz(eSh|z*?XH|9zE+l*>Yx8%CT@0VzYY%R~GX0&*p_IMcxg&n^nx- zy#TZ2S(Pgb7j2%s`<24^J4Gu}niuzcSy%+4?qWp$%N9E7GTA;~ysXyNvSQR_$1h7P zJgL5Wx$&XlgY#2boYhW^@p!(+4%f=U_csfP#Qdv3%)bf}k_$QC>b5&)_-sV^uRuJk zz6^SC&1x=eeHXtAvJy5=3wGbclR`S;dm}mJAHuc{ldi->3g&>n_Xc|49GD%fG$$`VovJ7CZIkjB_^L!7h2w zG5ys)@MQBptk2zh>+^Vnyb@<2ISTX=y;cW==b3NC41L`WJn@K9^@rs*OK$sv{6Bl| z>_R?mr8w5;CHGX>#sAA|0o(MF`v_<2C3jUNJhm#uu}d#OTr{6WN|sh7zz&s;jT?}k z-$0pzxb5W_O?i&GHEn(c)6NM?yF{d27?##i|L5|ZsF^v;Wa`^u^NMu zFPB$l@N3024?MDZ&n2sr-W7UD%UYfBH9=eV9giXkd}XlY?+%Q>QmU1(bWPp{d`D&_ zJl)WLx5|A;FY(seN&5#=icqP~BVI|B+GWY=-RD)Pd?*#W1eQ{9nhw?)?Hj+!tQXKvSP(nZa50Y|bJSY?X@+5pLp=3c-4lIyBpL-Xy zHMADEh@qEgC3$gpHO+P}JNP7}#{PvH`1(}gHA88j?JcBFzgwJ^JR)cGNNpqYU z4(}c3oNcyHjRaIDJHxb-doPn%=*9#~}C;c>3S3l5*dNoixd7S#PV9vw|TRA6T$@ z#|tuF!(_ziAyyeTYz*g|VBx*3xdJlO`AVrKQ%;Cemv$y2`N>?+BTGf>seuXYrbblwJL2RrXga(C2Q$ zhSXAL4g~>^RvB5(n|&^I7**Yx@FkUw3D$WhY| z4xK)z>S9(!w9N{z+9)}TUgQj8F;;rT=yqhGn~$1kp9?R$UDfo|qE*B^B*YQZlgjBu{)cLz@0=F9;54sT$T6!A!0x#G!|ay7Q| zmg&xR`1)KpWi{4Y)e0APG1tNh<+in0@8|B^vPu&+@0Pu%;x|+T9ALb=pw^+eLN9k( zR|Lzz=Q!Rr#M(ah*Mr>8WtLhd&5|5NynFE1nd z_tDEA1m-OV=0~=gTQF)a z!FfyKi_=5WADYM&bF6ve?RTygml49+2&|M^i6RFz{2Q%+-h!x*acr#%z;+%5& zp6>^RRSU81&hvA5Hu~Y<{HnF|F*D|YaU}b&7d9&R+Gc*`5^I>|-m2O^<(q8A`?uI9 z!aYs^k#F4Ky%cjFmF-EM9>=pOcy2#-S+L(w2A(}X&)PN^|9wAjSHQA|VZ>SJ*d@-z z?xeC6y<}r{$P&d@!@7vu!>;#{aH~32z@IFX8;8wC`#8sjcL$3~UTP6h2M)ZubI3w{ z=qkL$eMY#`z%`{Da^lyAefLBzU85LP>9&qwBDHyP^LGAUY85Ph)+( z(C{kT!v2hQ!z$t@9T6Rf$kNgoA6Flmh-ZYM6^l_5)rX$nIV(7F)mpq+H=TQ!HqQ{) zZZF<~+EH!Gwxc|}1F81x8Iy;|MMMiQtx)Xa%QU%R5)wHqOA;gO@pu}BWkexCA?2{S%_0b zcj*5Xt%>hD@1m{s!jjTjr_`En>CYBVkf@1+cR9Y&N?xpuqvcIB^diM} z4ZYV=??*3x0eZ_`Zeb?1UJR`l*Qs@7CA6LzDs^LKq}J?7ty)ifCZx3*Gx?1Yj0;7% z+eM5?HST-=`3SCP-PN{&p@>-&J;rVD^EtpWR&0H5zEyyDf|)y?HdAnd4o4B<9}Sii zOyu9nF^Tjc?BZa_tLLE4n^k$3>%Qne zjZyXBakCeaeH=%r^}Qd%$ZM2olFSwPerQ8dPJWw2lg(4j75B^W4{ew-+}fw zH)J8<>6YEwUYk~g#vqjI4Imwm?)M_xSMC+3=Pe2H7N z!}1T%&z>FPvF7&0*p;4xy~qbE7o+v9WkmJg*A|`?dKN(I8Tv*R zq{iqG);28???#jZ$Iyd!XCdx?&gPW(y!h%}r|)9K{`|_d_}<^Lzn@=$7QSo7T(8Iv7>@3T=_t~)nzObAHJ7MhvCp?{@OuqfLIJoTE-Tkn}n|HFsEBHzkqAvCz z5_+?~_w0&M!L|4z2A`Q1_ghZ;KX{ zxxj%L#{6K(*Vtta=5Ada%)y&;ynct4kCEEGm@$V~7kVD4ABnrBxJ$;|(uMZY`T@@n4Y@Qo~$R#oy^3%%OrpK^AEq$)oqsSr7IbYCI7vakgE zMv?i-KQ;M3TXhUAwov8{9^;y+f-_f0oca>Ug(w|6S^L>)`ndNp28yDBd4DF7Jbu#xx;Nej4!Lg;|J*d76;n}yU*jBbg!l{+G@^+7ru?s z;`U*KB}ThL{8ykzRzY=!h^QL)3&Y+;>>bgMap0n`&`vA%7gf-r{!H{h2vOt z-odwBX!#{?)@q`i%yk^Z6ZM=M?h3V6cTQ4Z)o z!(O2nvxA4p^Wg;{o}ON4Ge(3?5PXaX9q>`SzY?{I`l|Z$y*I>rMCj)Z9pKv=&`o+? z^*UOd-Z&61An@{JnZnjjH?tB-zzq}%dK1I|%drW*M*05R0BaY_s-f;}= zRD45n6yo=*jvWsEj}iUmsCu+FzHTXOTmA`cTlvS3Z3{XX`Kxlb@h2Qk*q}_Av+~nX!IB$m6BQqv!zVaMFB&Im0~%F{+IVLZp51b{qK64G z&X{@77U6C8t-@QqqIM=$Y{Gl`iz+u6^)~T|O%b)F;7qhF-bc4B@-j|sTBNAinhz8n zxw-ahjxY1yG^9rh5C7&+!v1v+FY7%=^lGFu^!jwsPC_jWeJYQc{=Bm4SZI`D>y$Zy zpDnl4^!p+oo>Gk(t~@Hg`$ef9y|&~~mCjsofRtSD;5ea!E!$;qJeIq)HQJxqQjW1U zr@k4g&C;f8=}}v$5#p3YY!|;uNS*Ko(g&fm3sD;TA&doE_++l0(fR*LM+wfFvZewb zqzsuWr7xh)V0+cVLvt5XvQH^li?>3O?TS}=eT169^WC8tKg_}VLF3L-T;yB;y)9cU z=17WH<>%z(5W8O~b2z$tw8PRj4!wEOu*_#KAl_a0&!HJ74oCQlf+;iam0gq#7>#fE z%OT&F%@B=G8Oa&t9l}{cUnmaJhZtk0JOe!>T0LhgAs^sM4RfO{eYzGSl)QIvj4w0;2pWxVIV^d08|kN#ii zT)nIMi;$))Us^!*=viBD^&9%`mu;xJ_=%H$KKGxmig9bJt0JZk;fA06XcRIr}7`whn^5$xJ#MiIEcCsqob@BpK)J~Rg)t1j?7`u|CxC&WPV5GKU7a9 zVaGxCXUgX&)9V$`=^xC2)r^nSm?3@XO=DE%T*4T2%(+B)DDBy*qt&}6;;UE9I*`v@ ze<-i|OXv+Il);s|yDD46FZvww=4&wqZ7gE+{>IZ)tx-e7@C*m096Xwa7A{hrJI8oJ zEU#hh|KU5;nl8>%^2^fL!(01Y)km?rT&9F<2oE~>X=4VjP4s)AQRkh0tV0`PW>s#ZHsw84&HOEZCn#fP;5bR#!zS+L0Q_S|^{%Eb;7vcQCgS^1 zm5z9xGAJQ@dlNeHUfF=-;qiVFrhJG1)k1NbD-Zb=Gnzc2|6Zs#+=W`hjO|2~Z84r7U){_;W7MGR909GhuSkO=HR?j2Vw&{`>o{1^#P+ z|3wQVp{&#R;WUHkT9R(dFv{L|u9iWZUB|`k7yo8yHWP1<*+fqPJYhHfIv9xU$lo0I z;rZ<(c}u2+Xb*!nIhr;x7VX!dWf_u3wjr0@AB#4l6Z)%Y+VohoJwQ7i`boY8itlJ7 zner;ztUAwX8znNE1Kl zB-vrU!gBM#s~spLFSA^VV)9buj%oz$-JlJae9d~GSSDX(i&dbd@Ji-2fZLmS{dUS{ zt%tq9_p{)8Mc^~KU|h7|dl-0C-U#4Xp3-YH;4G6~`IIQulvUB*58BQqt!Xcc8%4Vw zwAscN%9fo$yTz0t+rAO^R$Cqio^}bZ|4>~3C4SOz!uuNfB; zqHO0mU(5Im++S?rj@7rY9*KVh z_)wqj5uFP2vpnM008if3i||W;8`7VUb_Zzd>rWKl4;w-IC1~40o(Ow|^({(%PggC& zs!y8;xRU`ZdvpgJ8n--RaI@w|vErxrD_H3<0QvKgC}k^+;H|bZi2pM0{sz#pK1ur-XhSml&Hhl~Z5PJw9~3^h4!n{(0DOHqE81MplCP`>bNrz@ znDwd3y#}<_x@Q^Ix|jxhFO!$Yo*RJ&D1KI-XMQEiI^@p+93cz4;V4-?2CcPjScg_# zUjrY~%OhCAPs8+5<$5j(Z$E~QkiA*1qU``$Yuy>NEINud7qlE;BlMw)QM9F?os2n& zq+O^ff%$Bqh?NWT zMbnbK649*7z^|?LH~Gf2e_kVKM}W4wDTC>+G;@>;4}mt+4on%M+J5Am=N%Ym4f4`X zvOZMa*!|RZBs6}JzRh|degpWiJt%(Ef!P%P1n}J~cq(MY0~Eiy_}7JJ-PI*u^mZTU^`pC@slBnC$o1XE~IOC9yt$>)jr98 zZiM`XT`;o<>8k9qEJ7E9mM(AFMbS1!hQ`o73mFC@gR-X~L;qMZoC2*snl`K+mAq|o z8{r?IWuF`2<2kWpK$`ej>o>A4V)YreG?f$O@YWsbGw6H&7x1^kPN9A&{8^pyF9e>t zQGcsGtP?AICfn6#i`cwWI})7D^^MrP!k=TK<%-R#G3EYr+Pd3#w7mZbw2iUZFD0*R zPmyi$$N9i7CF4)$8(SZ#yBZ(qBTLa1NgL6pg^kew+KiZ$= zcdI9V|9bG()q^jq2S2wS{3G??p98)fbW#4p=Pl(w)NfZk_~Z59Q!hO;|8Di*hu4F@ zy&n9d_24(ugFgg(EdQgw(mv|P{*v(5pyy+mvZwL<;Y5--Mk!jASNc}$en8RMds){F z&9RR~Me)sO1Z`K)hU(vZmW_JurEbGO8yeS5+NkGz(w2g@hiM0sHf*d`x;+cp&@)?} z8rP$q*~s@)BVn>@^+Cl|79%H5o~!?{mzdf2d!0n~FW=C>@jg zSm(AL<$rAUCVxd6&R>mbqBQe4QPFk=-(qu}-Sq3>mSy&+ahQ1z1Z=kZo7BJl9c#=? zKO1@b#_qG|AH=T!-r7fzkMd9A*VdDNYd!e=z;ok4)fa<4to-f$V&kbh%kK<4I|`ZK z>^nLkDXcz7I|{U+HA26tJ1#3k(avlH?c<=ewqe8PqWW9P@Cs-f(l3&B7idF$ovB+? zUq{+@!G`ng0a`MNuvssw9aR0#1ugF-ZD=i2;a30;7c}sGyC3(~`U5C_);4CvZ$8TIOxFXMeweP0i_G`gLPwYC#Q3l`!h%Z}atlpcF8v+l8b?9_>JC|;+4 zzaFrX)2QR?kQC)Rqx)OOGr!0Z`RqykBG>j;p|A?%^_%7R#R9dm7x5c`57md?T$^SZ z@#+`L-em?TBFB;XbWk!Dqg<;EjJk;G zgIVr$(6Yaes5i0-tG8$w>-LwrXsz`WUJp`V<=57Fryo?H1AG>8(kK*+@EX9Oe!}#j zsQD9Vw}G}D@<|;{+OT;U?L}Jkll~!fRB{vl1$bHeQ`*jo_YbJsKco4F&o`p+9w`RO zQ1a!0f2?(0g%6j%KK?%yA1zf_{H*>MsgIIzO_&TGduQaNZz>rjCzQ(@xAg5uUa@KOM3#opHiobC zzn_EeVd$P{j(cVs$G1pB_E&cL;tK2d?zi`&Iq;|OG!K7PJJoGR#C(uALW$VCW-8i7 z)k$n#(sp&r9m2=1)1S}wRG&X-ui{wds6*fXUD{Z4iWBI-yIpCWpL)WcF^N|{sb8qi zB0u7qQikvt656R0c&m&a&|3ZDZs1GJ{C@j*1COkt{=No2&%|fjX~VkWJ5`-` z9b}z%nDxkFP5Biq(!{SJb<-bwL%MjBf5f!+b&Zf=awBLLfHq`rQ@2DY@so6Wlzh!G z$@C8nQ&D`M8?0pviKZP8i&h_^WekUK(mzbT1y*^LFI@v#*1PhhPPn(W$UE2o<6F6(g)5=`ypiLj|>s|^g>dUof^aU=cZLQ?J%_N*i7nP4E%63aH&t8 z_=mo!07*YdpVtZ-w%*ZL`~Tc_QvQ-ST+3Ks`gF0f!)&Whv!Pp`_h{pV7h#Y5>hONS zgLKu$5x=S){Q7$EyXwGG9`gSfc=|4NA$$yQL!LKDt6yWKHQQ9wvngpaK-&&wNMG?Q z8-+caDj9McL0b&kbd#?~@ueBVe2_9sYXDzmmq$SB1QR9G3c#E{OZiP*qsBF1L(qnv zUBlz&i9ZFr)yAZ?)_MB1;p-aI&x-E~d`Rc;y#n$d06gVZwhlz(pIi_Bh4tW{tq1>3 zJ@}7-XQ!v+qY zIyzfOO`G-uZA1AkXarxO80F=SJN6oil6NEcb|)<>-)+j914yZ6%8NAdYY5+P+5(X! z@)e`GKH@h5TAU#)fdBKZHRAQ559Xn_$%wdkE#bhr4BsxrF;v3 zr$JZ;gzpFJ$Gz0ouY4w|k0pXU@O19(=zEXXd{i_%qr6Fz}sB`9kwA zRe$b@XU^Xh_&#R-YP#lxe@j2kx@2ECl$Q?CLq+CZq8!&18VKE29Czfd$15CWfo{xKLeGLOX zv>xLL+aF>63gAQIvESa!$ggDG54_*xZ|WU$toS!*t#xnc#TiP%ep8Pl+uLF-M4Qr0pC=>k(Cn`36mI z>Z)wm2edSpYEyz9;a0%)x^GWaIN;yb$$GCa}(5ci>#0Xc^nbl2KX_ ze0g(*y781}29Qa8Ogp`TBqc&rtQ{RFpPh>Fql{MAT7Qvq?AWw*KkxiBzH&dS zVKT^P=!Vh8=G!p4#MYHQQ?d7ScXSr7j|*ypFWi`ae@n{RCYt)6BmO70HGAF_dI&oCP(+FZ~!WIo1n zhegP3%(0^8W27A$p+l_sn6k%o(DGi^St!<6$+)Z$yq=AaQQ21U+5mi4vn;coIw8rN z11Q=yXIbSkX<0QTAouJdPX$)Mm^Wj<~+}s z1xgwGVX@57ev>EMC)OOGv9vrdIrOY!${6;nqio7^mGey*P1-!G?zAIi;MvUAo3weM zeTQpIYV)~8~8BE-=qzj<14=X=V%%C zTI4s{z}==Ka85{yt_ti%dKhd$6S(Lw-I&NBQ*Q;CrP>Yx1RAMA7oB?IF>$1FW=4SDwjDBdB&| z(KWJ0qjbFn@>|!}4EYyZ%Te~{x!)94m1EGx^kJS0-Xof}Yb?GzKb*Qm@TI#(*@fqf zcQa{AMHaNr&ar5D9(hA)d2V@DG~afy`0{*n7AWO4WoRFZmgk`7MANdUDBXBodP8Y> zu6jdhdH#ByDFfnAjf$hql@O|qc}_c>SLzm`?G=M|Fla+I^DDMtHsc&5a(*`QNj>TwFQRE<&$*QhKb~)6WKeT;A${1qyRq^fZGg>U`NGT*N>kJy zZzIm%`7i#z_E8r2PxBA@v(-P@cCD~g-dJ-zr(EysyyJ9uPu0v8)Eb?3Mf8(&}k5WX?Cja^oKvV`!BDeI@x{&c^Kt#8P7 zvGE~&>%+&^QSxtC8Qbmv&v^NtOIu(2s}CRBHnH3KPp8c`d?(!I^~v~C z@v)v~3dYI)idP|x<=K|>Ry@nM!jj%2{{dGYo_34Q?-%(a$DjImH5A|ep1R{=C`&%@ z)KiTUPTZ?GQM9ZfT^plIU3MITvSY0SDBjlrU*DR4tU3+c1SO1LWSx>X@sq)uHk5js z>lLX;GS>_uc@v(AybF<+e3_r{QozZ$S2m>mlnser2|O7~yx;u30%ak79q?S!P^?- zPNu}7O}byp7#mGn9E)}`Xzw>^O&R9KqSYU;?qQg;{bSJ%0WFt3BXk=aixz3(cP5*u zKJYp4<-PKab$~;@9*Ut?ZOmY8)Q4Xb5!q+Nrj1>9EIV?YI^z~q3iRczWh^J}Xnbtm zigpKdVrLm)yG}?7^NYsvMSk(K${1-2+BKT5M`j_e9=y^)6oku}%8Ill;jv|SH*#TU zoFkk7m!Cw9}bsmqCUsWQg$5c1Q~IQS#l?2-?QT@CEp?QAip5 z;vf7u5KD$|zIFEl(ROGIt!yWeZ7P*O?|@socPYb*X8HLt6wZX zC%zZ*H^k3LI~=qP@pICaM#x>4pObcWgbsE2IcXnigbdGtmVHlzKl+gr=8xpNw-L0b zK-({xZ*DBUeHL5ykxhT>9E%od;#Xf=qrA6+Z$tc?wCZQ|fk=O(oqif^!~C56??uy; zM5r6yTE@ou@RTz;f9!rq@mdL6^+7(>C*-k6{3-lrz~61b&y2uNSc319TksVIzA>^y zws+>uyAALAEe(I?!ti~H7UrX*?FQN&Kt%X6rv)Z0Gm=*QqXGVtmSq6l6& zNHTdT8DsH^^q)xmD2M-cl{0od6aOsah}FME@*`Xd`VF9`PUKHm{iL3WV!gmHf)_9|A&H$ukGKx_5&y2eCNr=Ydkxvnvhw4R6R zx4F_Ss}Zz)K-*CJk7xw#WYC7{${(|?l)P&|>qmt}_*0l~E81P4?H)}V)u+|v1Ci}o z`DwVnME4Pi4_o7@Ono>NHho^n*aNf;)jho2y62qKXBzmni`KnWEEyWZ_Yv?7t%;d^ z3%jl;-NO0C?*AhDb=o+8CeGhQIU!#Qy%$e<;`ag1_DVYvJ`g6CY4a$#NUJZiwr7); zT}_w{q)i8HL)sl_JAu{@Cek-e+l2Y1(r*B0lT2DAgB-`mYdG-MzJbE=PvyTcLM~4P z9-#Qe>eI;o&WQYV^(UlV4BCeDf23Un+EBeIy~MI|lx;VH_8mwm?Ukq6{YE53(au|L zeK)sM(GIiH<^!M%>L+#26aQqq?qd6rcmY~>Mc)-EyT$bbafP9kosXj2Vlb34dh8=` z&w5aP*Y6SQnwzQb6p)xYBmszA59)N6&9()3X9FjB`|Wq)p1es$!u@_{^+k`e z0m;M4BJDMxr4EYM6u?{yWg77-0n=xcUZhk0Mf@vaWrfyDNEfNgcc524X}?gP$nuEa z7RE1p4UYH^fv29z7KT6ik!0#dd~{i{`$1K1!lU7RacA&QdXm>gz;jZd>_8h4ugV$^ zJQpt|-fYvokQ61?E1-SOq|FmqFovv*MLYU2oMjUo1HUIS2A(qJJ)vc6Gx?gnzsbs% za+5Z(0%xV65~RG?b7qBzV1PSuCq-64{G~>orB7q-8L#qG$gd=a8qCs!2OSSNA3keY zqWyRT4;cc!TNL(zxb6|xzliHzas8{f?h{wHY1g&Sp#O8KGO?FyR5&Mn%CM>qHoRaR zBMT(yS>bazMGKY0k81Ob7ygTkYx^;@|Aq|AC)F_hz>g#)uBjW+#81i)+dms4L##G8 zz8v2oSR31S>HEYF1HP^{PW<)2=Ydx06n>ru@hgEJYr&7ky=pteyI-`v+u%3f|BsZH zx@OEnp9K2#CO^}LFCi(+hNM+LX+zbA3n*-lgtX0H(lWLpLqy$dKvERn1E9@|roAW@ zZN|&i*nGeAJI&7NPZZz&pk*73kb$a4(IQR!q;9e2Ma&p&ho4SM8SCa7dq3>Q~&reK!56_*mmZkNYv6{YlGM zOWA}Tc}kDfND9+~w0l51IhuBSEZY3_TE@SlX^+RE?e&J1am=JO>;6zITBM2JnQTe_ zqrB?(%hJ}}ul(=HPh7EDt@YL1vlO|W9#^1_;%Q+WpMD8b~gL4 zWmf$a-*?{9GQNh;5q0tfl1y7E+Vz{Pdvm5;b7Rql+d+;Yk@cte>YJ_4WTw2E>gU^- z_7PhKRnOZYLpu~G?GQRwOv(5q@b8#-Q^t)}8I@1GvPH|V`p_1@ZOpvNZXtg?4E)k4 zy!~D)Zzac+x3!GX(X=CC(e4K=5fODe#7e7V?zT0wronb`J>XO`Z)lA{+3R-TJ6Z6Q zk2)(kaVvfeX$LF8>j0=D{B;kKqI^(t1ubvtI5SDf7)~2%+e&AJS2EA8w7#2e)-fN4 z>XD-{W5v%$TksCf0Euqr-D9psDnHnWpVV2lf90dhKOOm-gF>}=W3ERM zQ+C>fw2ML8khNISu8xq~;F}nW@A?QG3|g8bN`_sarEU@JnINU=$P1lliu|E3RGQ6kV1ap2=WF$Tx{PqE#o{D-; zPN*T&r;w|0Drx?z9(a2mF!F7A53`2Vc(7RSEmNiYkFta$@vJr0ooSx^BDG| zP91>X+flZ`SUTqee}9&YIgN!M3w*}8^4le`@biG54Ez9;_1l)%@4{eam61C0B^V9 zHX-#~+{XW&a2}W?q+i0@>rhfcU>I*ZGquxL-nIwtgzVdK8^4!ue=-;hy=@6yaN8{B zBiw45y%$t+I9dx5m(AwvL;>wn<8WIhZr=qX=OPj~wt@XwV>Alnv^!T0g-e|Ev;)AZ zEZ!ajU*|JSwI$LbV{q4m#BsJHr}HU(pu;r?dO3ejZhEH8br0H$b2VqRdZyiG_dyot zADPYG78K6sPvPpeH?@BY89esqfPj@-0%*p2`!?JqzT@NVOx!lf+lAZYLP#_qDSrxT z!Sxz!lhnTx3Po`#Bg<~EB@NgKQWTdmZnQ1wiuZ&hsjl4dAiVORK&87b#Q&s$w40vU z!?gy+NGjmmQ_swEdH)1x5QhRivybaubmd8dStWXAU)TL!KvzkqpKHovfQGy*a6#7+ ziZVp<%!f8FgI}sfOWX@d(|AGZV*E>feilfZ40;#$DI-hA*_sR<2@z>yfJgO?p+}Jg&>p3pcs-BLStlu0gnRlc}1pY`W|9EI`xR3n;_&H2ycaUCQN$ zM0-)P{Sj1dlcChlV}BdEd+c|Dm9)ST+zAV$mEjJF>p;MAWg?B1Ms{i9PSAMl%p@r( zlZA38$_S%;Lr~Jxl-EK@o)DzU#8ZO^ycEe}cL3$F)5B1A$Y!4eg2r978N$m9B+P_BehT|70^(^Ep} zuJPoOC!q}2SQyH4sf7Ht^qo-5sd@UpPFcDWcR6qAnkOjB077w@Gc{KWbV!~nsR}^d zHHY9J3Er)9Bge&a!}A}xCzZ^^h1{(Fj~2zJ*D3Olm7z&Tx% z$1{qSiOZa)!GPqM*dAE^8O%NQP5@eJ$qS&G({pPfAXi!;a!%nb%XoG)ps7X~V8bpj z`6CEF*7NeKFl0(msm=3>L7h@mX7jvi5T_JPwRv8XfYbFNo5A8Tm z%@NJbyn6m8WMGxGotF=)=9RkDfWi)u}C@!w(AF zaMwb**vA|<^vn^iJ6OUelFMkceD?dymnJTvd*FJ18Yy7@kAP}MRIA;nvJQ67#X7Cw zWkq{_txG;O?|Dvud3p;Jg+akPkw#RY)B7iuslX&}PZ-|Q%gF2TE+ebndJg#OnW^5< zB<^Qmv%PO2*%Q?B1-7d+iAY#qX8$(1W6JjQPn8 ztPh{|8|ap?3<4&3GPP!q*DJc&v&B7Hs&_L@(q4?ctnRM3(4kM zJs=2e-j%fQ2&2C2-aRPM^BX~_XF9#DDeHAQ`*J-q;O)w)FEZ*n-@BF?7wby|s{-#1 zb_gT&)+m*Aoy58vrOO61*83t0Dlx!P@0YN=XS4xM^A2S}WAs({$IjRL0_C_~e@(#i zG;dGlzCn~6msz2Chq0xM71`r5pVqwjENq+sKdX6{F#nAP{F3G!OUZ9C;PsmK2m17Q z1Ky%}Cs37}4gT9TTOy};lt$RErGzPsfE^NkN5L&@t!q4GdJSOjy)5}wanEWxK|SG% zkYCT7W=mvmMnLdsZA%OQWa}{CHZ`6?(WHIsH#`$`)}gN(7<;DbEKio)OXWznwRjR0 zs(I{8@@s6-!gb+7SCWIBjoPoVMJY$0Cep9RHIZI+KW;?nx~=U$QJUwJ&W=md+8!lz zT0bD5#EZb_Wze>>C1l=*!KK@30GgKYM+lXCAtxo8mUtBZIFA(!<7|nXGF2a zY)TgrC!ELIK1AX{U^R+L>6eToocD>VoSBg%O*G_dP`E827uS@02U0aH)1I0=5O;w9 z#IpsmpowO)j|WBS1>KPj{6!Oqe-;;8V5Y?13KORO`Whsmp&>oF9J&2zZ4>dJ?)t+t z6qhNd%$T=Aq_lv9G}pzLYNwse0?}w)HE^f2_GFJ%l5*3S+iYp)+%BLb*E)7Q9VFy& zZ6VZALaDAr&^9fLh3T2;DdVQt($1Br49If>eA@m795JoaOz=u%AKD(IFnAtN&AWI3 zQ1KQQJmP^$?}Eq{*n_JUILN{SpWzx8_y$*dfJ+bYfhM>n1VCqV1n51^KyzHr3bce+ ziGcvFO#)qTO$v0!)fMQAt2@9?I5rJji>oJaJ+93Hqai?Y;1=Ac1pa|*YG4or4IIOL z^T5AwZ4o$yYkJ@;P__)D;@T?U!_^ze!ZjoCD_mO#UdOdfU<98up{Uhcpdk7fi1XR8rX?zufTp>dj~$jwNIc1 z*S>+((4}ACWn6=Sjkx9q-oy2>09#o90A~r82fn~{K%f@aD*`$k>&k!&*MWhlxE2Iv z<2opCAFhJ~%W%Ca@D#2?0?*+(H1ImE!vb4yEe!0$b$DPuu2%;*VqFt>95%c*uoCwp z0x#hDo4|TpuM1S-S`^rgYjNNoxQ+}Q!*x{PU$~Y8-iLOh(a6Cl{SiKeqmlm|zL@?y z4vuK#bj&UAK+(uGTf$vXHU06Ikb;(c8Gx4OeFPx>eO&N-gR5Wr4p;eDRDs;K!~=li zn$fxAiAuPI*)CuT3h?6}|JosYd;C8;VHg@t%dTkxoxmr}R!uib$*zV!v}z`SME<*4 zWK38JExfr`${Z^R^pt?;lkSv6eD2M-WRfH*f(RM8>=mH!5VZb`o)Qo_UIvj+*k?-^ zhq}@}`Mt;{kh>MKsVyOk432IRNWbCEylYNV9h45*8Q?5_VAjYg9#A*bt!n*p6Kp(NM7F@SO;{I z#+b1H%S3^g!FXHW4{(w;PhdUXR`&v&tUV#XRB!rxfVXOY5@5Rb$bA5(Xa@wC;r;79 z0HYeb+M>IDE$PPX|{Va``ThxK6Gk zXg)rpSIM@ux1ssiTX0&d#m5z6izDH6FtN9!(3+Oyw|lQ{fzm#4BC$0EVrg+`H}*CX zvbzQm=aZ1rH5=Bjx0O(mD}|KpB;;`&Ba|tjRM%7t-u8fm(p^uWFSnm9p$wb-6O?an zf2cX;4}LTydk2aE5i7Q98RuwkJ&2?!;vwv%^R$fZ_=9M+4wY!`_6gc5z)bIiv@OWj zk&CzX3DiknG$N~P%w(IrR2XE@c-y((QT{B!tVbv8bs!_nc?uaj(aQGoxbUbi8r^9j zCFwl@Ld7jwGsAXX5%h`stA>IQLX5xLkgabzrZ88H6$o~`D6sPz@`aRgJHrZ^@!q{xk3^tv)?2K%5Z++2_&Kza{N^F5FWTRO~ zhvgXb^j~X-Q3lI-A7#9cGCGbaD?_?zjMpKH-c1-|JIF|W5~L?cN-OH!q!nSe7lb~QxY1cx*|chTKRs)(O{fs>_ry6Gl%go7Closgp@{ zvB(CpaV28}Tr_UXYXP>N2r(%!G+0ql+d_oCt_wTt9x~q_JblY{4ss z`Y*l8pVK+#qR!biZKhO&^=#L^#C(dshLzNCB_>TCSvL9B(jqGNiz#vpg6p=&g(7WJ zY&QSTrAX<`lg3TzQZoM5Nt4Hvbs1eYZps)`mH`({x@|(q*s_Te#!VVIdECSaW_roQ zvN6Ayu3Y=oZEJ+CJ<(aLckrcypUL~AzDm!@<8Fr5;#xFv(#^k^O8bOLeCV}ngVE%v zPQPD9rCUeeJhIEg612h6aq9mss+(+M`-E=8&__`(eiP(pX=k#!*zCKYeu{YWi&YZ4 zZr%2UP$at*fF{_?#@~-ogxw#zkfNK$luZ~jzDw!EvdJSyjUUq`*t>U^!I%B2_tobG zFDsa~q(?`8~m=2AF!* zrM)l5LZbnuI~nJrH8a2r=LH0l4bbm=5`DLpVt@f#;?tPiYNJO^Cn*)aUI7iD>YhmGLJ3{u z?n@mml28x#T;eX4P@ek=;<`(ykDCu`$-kCRzI!NfJtQ>1{TOkVNT|U58{%>$G{l{T zrjp!KLc`tflQK_2BiwC>yHrBO?sEwBlF(>(Hlf}U8tcB8P#+16cOM~_z7i^R_ad&J zgeJT96Bm@wH23Ai1T2eu}IH(XY6{;QlQuaTPA$gbtH)`(JSx}(_w`lHZbc*2;dNboz|y`TEtDXnorclRQz84^1) z&iyWlXG-wyIQOrKoh89}aqgL{h1n8B42b?EdEIqN!$QA3<(!k~IXx9au+-FneX?Ei zVeIg%D?>s@nb3v_V~{B&OD42NLbGvWZnmYID-$wE!EKV1PBOvEgty=fDd)+AR?LD& z8e2+dnb49H{g|bTOh{+K*cC{~770!d6K;f&QqC6%O*JM=giTX&WEPHcwq$!s`{qt0 zUJON2%SKMMrF114A#~6?RAS8cUD23)I<0QzZGrX?3<6i37A1e z{Cgmco8fid{xZVBmd3RO?|@Ix2vA%aR@1#Iyw1&a4)2xU2voY8;dNdWUgu_bowwj+ z7L%FhW_X=fh1a>c2JThib#8{&c~y9wo8fg{6<+6Nc%9b_uWM;v1o<+w$8c>;*0z>n zKfjH3FYaGtDlbUoVu@D-+_f51gZnhD?6ev@4|M_0bTifja5Lbp)$LL)KO{OS5Q*y-QiVIFutx$=P|(PjIZ-GpNhi0 zBEHVo3TtHTf+rKj2R^KolzC>wFi^MH_ej3x@Dre6J|S=4O1Iue*foZpPR7ek~!VoAGtN z9ui7&GrrDuiG)1v?+N8fDAmpQI$uu-rMnql=gX5&hI=e*;k#5qep}m}DA=j_`tPJH z-HE%LxAa8D*ZBqz5;Hr-*ZHobDvYmlGrrC@NP>v3Yr=ZtuC~z8XKOnT5-rqxzu}I! zwCr`fC1b|d`HG|nb~oeed?PyvoYPHte4}U?5ntERPM%GA0Lwpvc}qJVliF!s5nt!K z^=3eB#@G3#@RnsTzRow*CwGW&xhYyM;_G~`7}RNquk*cX5T_x&&i9%G zoNmU~`Ch+NR8Nwd@pZm+5^|?8zRvfjKB7dAoAGtN^)g?&oAGtN&9aeYxEWvPdwVE` z0mRq28DHnCyj?&6H{wG(83E6-k^G+%AMSvjmE?Hg= zH{!kwQ!^!wM-<7)T z3G$qbuk#Hwi2FDhU*{_@u=!5L*ZBtNQ$*eYPR7^yh8V;JPR7^yhU&BhOzO-hcADN^ z5D#~raW@pZm)H0c5y zHmPh&J2?kLe4VeSHi2vyU+2pc_hhpLttuYLufzaLonLAIM;qWYC*$jUWAqJ> zke#oS@pZoI^&JBKf9$<|cpX)_K0IsoBztEjduL~7W+yvscarYxCfP}vG#_o#rfvE` zDQ#&>sZyY&pFn^D6$%tABA=pw5L84|L=fal0p%N1Kt2=@P*G5jqa4733Md|r9tD2) z{X8=}&3Vtc-oM^I-s}41y7px5wVw5?k6CNY%(|cT%!MXF`?{v1C1<|=CTL&RG%Cqy zUzebLUDGikzSSgXU)OYOi0?EB+SfH57vcv^g7$SyJ3{=ZNzlHo>G)9p)5h}njK|VQ z`{fj~G=k%bUx{$N6@RzsB)bybGC}*grc>mc?MwT*rc>>#41nF1$JvZP^h~ilUI&hj z5EtKVIz)!_G|n4MC)m7((`aAUbehflH0SkEiUzA$?CWw4gC-k}Xz9A>LfdhUrv>Pl zEbMyJ(YXqfbN1lqv6p=VCz88uwb8z==>wY+moaU$uWS0y{)-@w=6X*-wq5P(T4p{3 z5Zc$Zg!Xmb8z>X=9p^G|!vba~G6~dEV3|OAu;|P4m2|OOFP~ImhFuwsH<>_>d<{+Sg)1DdaWeZYbCK>D~a`5 zNvzjOV!c)p>$Q?tua(4ltt8fKC9z&BiS=4Ztk+6ny;c(IwUSt`mBf0jB-U#sv0f{Q z^;$`+*Ggi&Rub#Al31^m#CokH)@voPUMq?9T1l+eN@BfM66>{+Sg)1DdaWeZYbCK> zD~a`5NvzjOV!c)p>$Q?tua(4ltt8fKC9z&BiS=4Ztk+6ny;c(IwUSt`mBf0jB-U#s zv0f{Q^;$`+*Ggi&Rub#Al31^m#CokH)@voPUMq?9T1l+eN@BfM66>{+Sg)1DdaWeZ zYbCK>D~a`5NvzjOV!c)p>$Q?tua(4ltt8fKC9z&BiS=4Ztk+6ny;c(IwUSt`mBf0j zB-U%Cz36LOOYh;ht)$j#9Zs=-A-mZ@9Mh%Gvfq>r#NaTc^_)LT+i;AP2Jx=!ltyr@ zP=mK=R~-q-(BN&_moF9|efc=DS)5HmgSTl{AC3@XCOv}{j_S6)Uje1&Lu*@T8)2pX zj$GRY??M_r@;{4`w9QmhkvbB2w#lfr3zex~P;$1$#Z%wF(_Pz;B8+KT)KzuA3H=q! zBzHH3NyYe!x1Pb})H`Wa%3*Ukuu%sJEXzf&ygss^S=v|WqR zw0Cg@MU3k@Y93-mO(l)%I%*Yo{I^4Nh;dzM{uW7GN#nZG0tGT5jj0gXXm{QPDn#Qt zcVFW=H#Dx36hDHHG;U~ISN;0El1w6Bk0L|ky6QK6A(1vs={i@u4=_ng>AJekXvC8^ zP3gKKQ@VhrbX}1tU5YjiU6CnWil%g3kttn@rgUAADP2HQx~|BSE}$u0S7b^jD-T_R z%#5aVc;iJ8#FVaU_!0yflXL#UAez#3&C{UDKVsTWb@IN4hBfF6sjd)g!0epr4#8!N znXaJg&uH>gZ$<3gT5EFmxtOO@!Yx$9MxMc5;}e*!pKA!PYq=32J?1#dJZ@I@o5>g8 zcM9%~U0AmeyNA@{PeGjxgOMI{E0f-fSpEAt&OQOT8C*q4-7B|-u?^j?Q``NFK&oz< zd!-)ay~Q3I?LHRWKJ`77+>SQjeWuTxi;e`pYrl*X!J_*fp3pnCg?}zh=P61(I;l zp6@`tFQE*nPpaTbRdT*6*{(`13YBypkcH&ucVo!dW9z%Op9}OQZJkl*KaKSsG->E( z9@Ef~UxfbdC)sKT^3)z%**(bI*2pj&JF)xw82YJ$6`j!iT^3oFhsKWY{uI-FMB{dJ z?_u7Xv?Qa0s|%KOEi$v75tKT!L9&LJ_K#!o z6@DDbM$5`ho1koWr0gmP-dR?5`na;aSty%pwj+)TzX@eeKv}O;bFRv5=)HoK4$=Bv zUhc%O#;xnl9s(ry0!}O6rKH>pFxIW%dohC~24x1>0QJlUGsvv_QH9EbImJz8@XwL! zie}_`BCbJYIP6aBz7k!h@*|qho;kmriW?Jzd-3an@Z7&3z#iLa4c>>7RS5kkesg~= zp}XcjA^&%y@mHV>l_TuDfLh|KP1W*p;{dP5&Ov6o}KQg7&EC-icRSLzKNBmQQ_ z4TS|6yd0WSP?TkMw}#nWQ_k)ws%|!zPTDd_Rdz%wKSb&u zLHIfR=H?2l*RHuq`HvdRTZd+;xZ2!^SgJ(}&VM3{po`3TfDAqaxy<@8Dq3-j*$T|? za}jnpb3PKSU2%-&g`T|*^I=7w8G#5zZ-dx5Wih>Da?0t3HfQ;S$^RvYzDLpTAa^Gk zE4_!Kd7Krhf3$ZqQ8-|?_Z~@fpvG+t=mwi$&C0lw)T9G$u9;oj{}hDYBZG zo?H73LyLLcF|>GP`MG$)ThLNoazwCr_Shb4f3AttJZNH^8<&x`s`&vcW*x8;&Eox8 zh@#l?U*1D-HNuxa0nK`f=Tf$@^&V;&y0y3mH~Wo{dZ7mq>b)XH3mmr-0SFNb99z9t z#At!z4lQFuXn~__+`%#AsXNHMByy;yfH;G_dhn z=katJ6nVWLWz^Sj5L24EzMF9hQyS+H{7;x?aIE6Na-A6Ifa+B*0mPl(;phn+5O@BH zbCf;@ebs-$d5i=>vfVK_3bPd>O^}-Y55|#>tBIe=Q_^wiuGKsx9hW{yPD#h5$0(2@ z9anp#ITPnKPWpx&P?#nim%ec!Pf5q6Z(^ub%NE>&vkZk}R$U@}9iQiX(sAkQsSPjv zKIyph%?Ba^FC$irbX@utCX2N|B7IxHQxX}O>=pzBLS$rmT5M=yC&|pa$@*$5?k5*ZPy_DN(!D4hk7k?C&}9X?v|5#(2U4-T^sBt=K2LS$rSJ;F>$WMqb- z;*-e8%!zU(k&&6JDB+XH$P6p0_DN)9<|#`1Br-Dd75P4ijLZT>4L*sC%!s1NK8cLX zLPgD1{j;c8!eo|vNaB;o$gJQgo03FEW+f5V(tHvbnN_R`i431aM&=-eATny%g(fjy zUY;haUWts%#;sH=Eqeq{shC7YW|J1d@kwN4wv0+#!e@ChTiG%~WW*intfjLI{zBz( zacj|F0wFRor`&`npF~FHRGu;q5*eA(!aQ&t*n0vYGBS5n;W}qQWMu9RrL!P1GWUeS zSr8eSdle-7@A9(UHxsF`TgNAnk-1+{DoY|G^S~!1$Fxr(BlDo9Yw$^AWPZp-!Ml@B zA|vzI7g28z89pE4GfzAysMRNtk$LiWg4%s|Gtg8264aF?k&$^ubLa&^nV;1%&jv!F zpVRz?eG(a&pWEmnAb5Qe8JXuZf)-~#7CsMTY)mn663=GO3KA5>=Ey^Yi9Z z&8W~(KxW8hv^WaL%(YdIIts{)*e6QC)lonhs-u81R7U}sMPXWX6p&eLe+GRxaukqR z8pf)lfXx2(H4>|i0x}1LvFa!wv%>z4#Hyo!%qm-F0(BISSseos97+vl469?{V?`6{AvrV|&Aoo^o@21P=Th!C$2 z`{cL~vidy&WL9QBlaYyOfa7dxgfYRB&d4;G+fXBQ7mz6!?kf~`0hywlW4wyHfXp%n>$cbkG^%E+DfhyyEIE zAhX#%QBbr`9;fXucKs=I*9_7JMOfXtD$C71t`>MkI2l${nF zx(mo0EjgFn1!P7gdD&e+=9mzN?gBE$hB$N=kU1{Ip}T<0ju40L0y4*k`kyvdEqfPB zBkh+{%+d&sD{hW3-34S$vX=piyMW9oa?bW8osl`!UXLic3#jFsMj(2oShc(ka--tO z6f6I3<`5a!;w~U_g3W6v?gBEW+00LKzADntV0l7k#Kj>}!f;$m*F_iNLTlXN&`ubR ztEi(tC*j}6v6j8;4V;9%q?vR^<^!A4mod$xGcq6A(*@PF`%}J%0H3dZe$&k;3hL+6 zHp*{S>)ovV6$&rz)!UX&dDi6s3LIM)|FZ{48yw{Gy@;pSDr{G)0qr+D7?p zikf}eM)~cETCEsuqx=rrwX7D$1nq~X053iPH^2@RvHUae#vYUuIsP&{wg#Pw68;*Z zE=AS;I;`{s-HOuwHlpc@eE%o7kp(@98vJ9Ju2<1y|1_c*ikkgvm`1HY#@E5SuvlPwtR}sxtH0<9!1!zdoi2o4L97Rj~CyC}N zTIN4bG^}W){|eDOMQi-MMDrD`^Z!D$K+$^tUqmB{Hu#myeW9Ywewt{JqV4|iSa1s# zD;o8={1z-xw8KA_Xg@_e{m&9DRkX|h64CyOcKhETTBc}^&jse-0HPS5#;zhH!FPE_@5=*qVTuIzm{;T!q?Ew%y*l@y~h6`;dX_8H2#Z(M=E^R_7XoY{r^EBb8!hadRo7F!?;U{gpqcHKY*SeUG_@wkPjN!6}jH3Yf26rC*7iynF zpSVn;>9M4K=J^sW9!u(H@tqK_%a0Uc_t^CyyARpV${vOb`&qf%UP_#T_sl(ma`}m(ma`}m(ma`}Luoj4}UV>niEJw%s1YHtFj zMGky)FiIH3#(st%gFoRPe^ZhCJ^Y_0jAG-!s}e0V;-s3-Ysp9>PO4QP|E6Ja34@lF zr<3PT0zmOeBTinRpq8arp+ck)r_38sA<~Fb<}(&4)?r*uS)f2toC6`La7ZJ@Uq4Bb zNhCd0NMuMO#^1P9B4eZx^DFKF2!uv#>KeckMV2&T({yUbgG-h)VpESI$0v>0)T=1r zlSXWsp{Uv?jo8$uD4ivZ*wnAc&yq%L8c@{W(}1~YkeQK2j5{oX(1=aL`y-GO*{uvB zjo36#gW6cfs@96wU!TD~cGjt?SP{Dup#4tVYOAK*%n7Ih0~4>EeYmewwS^%|AXEDZ z#NG(q(hv?fU(B^tr7M|RMeMbw%;b)*Gi2$dNUlms=1_*bX%@}I=iu=Bca%DYm*dXc znBSXHnXw&RHvrWk7n17`mvl9uLo*l=}hGpEEAk!Ll50-Wq@p0LU$d+`(nJo#S#t ztj{*{2;?Zc4RYK(r23AE_#BTx-SO)$`p}Kl#jfgZVs4z>-`9)h|*t`OJ93sc1-c!2TtuQ{|&( zB}6EC3&hBJbPn;+;ZZ&>#KwMbR?n_2M+5#IsbXXIp4GYJTE;58^Q@U2-$HpSf6T`Q z@W|GzO;B3FZA|)yMwwkiJ5}5@p|%Jfc#6TdOYj_I&tklYBAmk_{GM8F4=ZQQJ{G;8 z;uaC@f*8f2Vb(@!xWVKB8O*!_T;YnZi)0!>j6!h#VNl>~HgAKEXRw32&s)rgM1iw8 zY;0?24n|#U7vU?Aq;xMNhn|7b*oh2&20@J4fZ+a+nz<90;TIz8KuC5fHN*P}nz@to zNNllYF>1|GYUXyxGabq{_k3h(=O}O$LL>&7J`GJB!of7^1>0lIRkntbw1=SdZz1{J zvZNnL4)Z#izTR}G!Xh<)}oR~;x*{XYAet5$!VGD@&iD8W*p z1dF{41+LmVf_T}?Oj9R1tIi3?uGV7LfGKF!i*M%aI&|YX%~gC*}J&_ zxHyEZUUMtpk`T6gKVaJZLfGYfpBXI;VXt>9;r<~U@RqQU%R)HY>!zv$LOAUGg842F z;fPiJ8LD0x>oI7QYrId#u41EfQ^jXuY&AB@5tO+ogw5WiEbGM~9Py4}>?I-G?6orX zvjX}4Y*l}WIbIrD0>!d{tU5kq;gpP3vWuNXHjpJxl2bBP$uSC4ld(!2X-06Kbdoo` zkMt=rR>>QG##1s@$(tBzCD=QYvG5Xe16lIAKEN~?tK{{P9d`MVu}a?j3d<2~AWPoD zWHxGGC2zX{F||&{S%V<-b#icZJeU1qH6wJV=*xbw^s*!rr}?;*Uj9>@qLIW1Hofv9 z)C$_UUo3qfCuppYr@3D&y^0H{*zA<%ezEjw>9U34^zG1^UbBqZ6h_kAFP1*&X-T&v z&HZBOwGRv0FU|d8>4Oz5O>@6kdfiVYZvQm*i>248&Sl)ah(cve6OQ#%ZTV+^4$V}v zgkNq*4>W@V+>fUyclude>zbvC93+)O-+Uzk_h!j-dV0U0MftBmO*4HyvA}A=0anaeBHU*dBhR01fBUsdvK=G&nV1Wc%d~Zbcz; z$D?2-cOZ^7a%6kkd#2->46sZYM=DF=G_&eGB+58^Eo>Cx)ZT?6)Xi|w3>hblW8*yP zvNOoeZ~qW-vZpG@ejS>8p(2AG((GvxX2A@e@*;wY4EnUcIO*#k8=*w{A2Y{Mb(&OU z6eoMCg8nhl;iCXuI7_tP@OAuT+Cip5MFz9zcsorhG8l^bC8@|@PLwOD$Y8FbM4D7& zFs!ILO)4^&rzo8!6&cJ|;;%?e4!$PQ|iz%X;P8F zsXS#Kq#}dU!aQ&t04-mr$lxySU*(>v;Oy9RAlhd9WoKFNt22UUb!6Y1Kuo6Dl&L=9%=#-B~2FHe18vo~mH3t$J{? zfkZH3|6B_0cqc+b874gLsVc*2k9(?uMPb^s$30cSV*73A$3*LKPgSrqjP3Qfrz+Ur zb`WY820ZSm3JwTkXM2Hkd^;<#!yflk1*>eG2}V5bsR~wy!b?2vsS4JFvCBN}sR|CV zCrjFu9`{rQ>q6l*9`{rQAFJ zd#Zx7?di}>D$?Vgs^9|qa)^eN5!8D^?!11`JDrhs>1ro@NmCZQR+$4Ldf(6D$5|8)LU_{QTh9qRL zFocyJ_f!Ro#Kwg_%M)j!bo5djmezePIMiN;*7UfiDmdI8K|IxvgbX%>*URy^rz+Se zk{}^Hl90g>Hs^8-U5|UJf=%JIUgmL6Rj}Ei`<{ zxTh-E7Q&q#_f!SjL%7@Ho~qzTdpm?U`FeM-97ox^1Yc-8?x_lnmYhjKdfZbLj7oBn zkRJC`1;>Q=R^xF`Rd8&G?=&9wR0YR{_(9`wPgSrZ#E%+}d#ZxtL;WBj6MXn#X{7yf zidh=LamD9FxZZN#4NkIe1@^e7DmX>X*}fzp;dc8$M3IC{a5f_lJyWa%uLDO%h@0OH z4v`_@%2Orp+xQv~ ziw`IevQb@jR8bhS5_~MXCBk?HA}!F+L*Y0bk~b`2WVk7+Vd*mf8HX$UQ)GO+iL-hc z$aoY&68bD}SjG`!Ova(^1Sgs}mI_d+5uE0F{w1-kPNDzfFrv!|X^<1rASa|jPDq2C zkOny+4RS&n<%BfI32BfM(jX_KK~6}6oR9`NAq{du8svmD$O&nX z6Vf0jq(M$dgPf2CIUx;lLK@_RG{^~QkQ34%C!|46NQ0b^200-OazYy9UPlF|=HA7z zkQ34%C!|46NP}E08mBEMq(P2PhaEW~4RS&nDasR>MtM!-JPVtr0z!mD!+q6#`zJB zS@SC#>)EaK%_Z?Y;MedgSe1;5)3NuYeuf|eQ;UE26_7lR|Hb%6F$GK-_?tw>>DYU6 z&C6Ocj-ko53KIM`M-s+K8cdnrLro@5(qPI01u}3qsSrtn{JeE4MA9HXpJhY}k_Pz& z3M9o95RwWvS#cWRRJ?wHB$LSRMv*nxf(Qi_Z(Jvl{vA{Ch}3l0p&2~Ya(89Z2EJxt z_LLXPrj7bk>7=LOt*L2~qD1=oE}+fKoKLC;wg7EWlup0Y1GG(Vv3`0N^fw*3Npv=( zpP}SY8aG*9WSd5rHJ?=fRzTdbs-+d}`VdMZTces+919U&IE|Jry0ww5Q7zL|7I!vq z8ZAAFoHRL&mR?1PG&zly8H%dY{mt0aQYftq^U#t z!ass0WV^)|U{Y=wz6~Yk#J!0@Bw||TX;9)Ph~bZYnT;D?4K0YQphnaRJ+NE+q7WX-XtVBqB3F=k3NE5Ur&{UQ8GeJdc4Pxciz5uTQ z(oxUCMq;!{nvwDj!i)6>QsTRsK*G4)8SAZhpfOU16@6ixpPubFPSufi zQ;s0jM%<1&evkE+$|i|}O?}_(SoB?o_zn0qAig&O{omtq@YrrJB%j0C5r{tuzhTNm zp#K{pv&*suPQ}?y#P7zhH#+J6l*I2uIR-Ce#XmH!4VlR-(+-s99O#;f_W3ZnY=bU^ zer9&gMpYqrC4^#F0;SN;C=?s}@Dsh~Aa*li+qkw>`GWM6u@l?4wpIC}q7&Mrzx_%E z)7WU+b&C=A>%U?2U;|t42cd#lCms1QtMcF0paaFmE3+fp5-?cpgNDJMHY4fdrX9(c{Le^wG9+e8NgkJ;Kel5wXSB-4rRR^0 zT0`GqejCz|XF9qGn)50z-ocdk>nzY52tEM8gLkrNR+-lj#_&@RMlayA$x>9VQib3a z-exKGlgoQQ#3=rChiD)x#R6h!`h0yW1{ z4VkTqy`kuAGFuTEo&86mH#Khitb?tJcl3PEthH9fyL!Icn!BMH>vm@t&V0L3LYDL& zNO=dFP;9o8?ky0>6gPM* ze~O~qtrMFamPf8%ghu81#pXn6=8yricM<*?TBxZTTIP@evrlC3lL%tep$Hx(nPty^ z9FV~vv*vK0k!hmftq5TZ?Ud$`<1#r0Ux6S--GShh80Br`xJ=^^qPSIO9yu;kM@jPY zl>QAQIZLRdA4$&tpc(h6|CAcXIMXa(v&a9zq}U*a#*M$Fk({bD@{bZZGKjW{U!sv3 zaj8UDw<4)+@k)eD*3p=}HzM%bwTPJT1>4Z|?!<4^hE8_({VJ`!`cS0DXKx=tpZ#xN zr6r3L>s^KTiW6{0=eILK78oU^7KbK)sAi)X5nt>5zTMcNS zu)Kc_%R9Pmyu42#7yCs#kb!TDKLMrAK6{p8^2J?8*)>PmHAgA67+nR&4jh$)@|j)P zvlLr>hN@zP9HrD8rPO4Xk|W>Jjgc&Ky4ZHILCNVo5vLXAJ`~WrVBP?T{yI=G;>wc| z^LLz}A5?C`xmI&Gj7k28P?V9ZNP_3E(!sI9EG7JHUm+rZb#+G zePu9Owd2SWEb}-D!knshTILBA+YODUQsb=?G@cEO*G3v|-B)7>LXF?vN8@ed8lPc} zubEKeZ$aZ*(CGfV#If?YobEeZsQpvDugf+~A#vv(BHPDR_1 z-zwsxCgisf`E|siMmQ=gyf#9JMv?Lard&HAC0*)%x}0+Dgp?r~twdK@ixxv^wo9qk zMGeAIe?$R0&R#a_Qp2J~e|JIuZ_4_YPS78sQPH_wK9yhs|OK`!X;C^bMQI z{1z3lUaDc9qU&(D3~MV%iHDI;OKh3>p}y(_l9%wSI>s^!t`~tlpdOtHb0*tnhUCMU zhIu71vp)dk+C^uC`Dm-oUU|J?L+z>L?j9WCTaBPG~GH%&71}WDjZ!0W?a;acOk5|0j0NI9-lO~ zPSZ*L8O+oZCwciyx!W-lsrLO$x%m}McHouK)IIUt0?37Susd3Qj z4R_B}Pw*^UUHBbzgZ329!qu&c{2K0_sV*u~&%)Ky6sc$7>NZ8{S-86FS=iz3nd*+6 zD4)Zv%*i;PHXN?Sr@Bt&DYr7GPLfj^hNQ+QAfAP5j+DD++DYATH0o7L!;sXC!#t&7 zNa`kr!VCt7({Lv360?$t)OBA06wkt`>*e7FzBp+ZlDauEfpEB$Iduz@IW0(^x-E@U z+En}vW$>McfI`p00nZ(}6Hbrtr9Ug?A+^iStUxlFhtw|bhHhM<8oq?qu6zzN9;_m2 zuuM`r!JTmJs^3bKx)ZKl{YzwQ7ly^1aP6A!KsU@o#GP>M1b4!Suoy#oeZuFk?q6<+z-}x+#_2w!Z8<>lg6-$xyk{==@HP8&f{dkHhq-ZIU zUaH7J(x)Kq&{8D5KhygTA8dW+X&fC|ilonG7Fn?rsVz-qBhyl(wo9vHrD!Qq+x=Tn z@1$rcQafD{zU)d%k@We05XEd;fBZZ3nN_qV@SWv2=EVL(zEfYVxe0tX63A@f=GbWaJE<^2&(Khjs<^qZ{-oQa`#8Qa`#8O4nffdC>n$(cz;kT$c8Z z!r=}4!eN*VZ9YE6&Z#yZQI}Jjk0{rb=s`jBoqF-38${o!7eBf|^qqR~qZ>rusTV)G zLG+z^@uM4zs802x8!S}RY&AZMMxf2d{Va>xeDIXlRc$_qIOC+$=7UwC&4>8W4GvNW zn-7l{?@7o?9h>-C!$QMr=NOhdRAB#PSy^ z_Z=DsOfuQf=3_mO_|XkcI+R_VeI@9?4Pt=mybu>cx+4@I&p<>PI(tjO%q+Nf$r5!4pRcQa`%E zlb;c!esqJUt{2o*!|mt6Gnzv$5bRW*)iTcpf}u+EoqF-38~pqhNjD;Xbc5#~5VW|4 z+s}g+REzr24WjSViyz(KrAfGWkssaQl^4)HFi;Rby1}d8lsNUH8@$G8GV-Gvl)qCy z*~~yV(>2I}^=`PI2eu=c|5Zcm7d9UUNUZwNh0TY?svq58h0T4Mm|ew>E^Iz@ zCQv`Ru=!A7^`i@$4~!sbH;^ZrS zbYb&xpWx7sE^I!SGi^S^k1lLJn7r&q7d9V?LqEE(`A{7C(S^;2;?R#SY(5l+esp2; zq55I-;qi%vrIGf7A6;UWMlk&768|{D^rH)#k3R#8A6?jd@SK+^wE5urCv84F&SnIn z2Yz&0Q6r9y5I520gG0KR^9F1_cnzCFn-AuvIWLYAL7bt8wl- z9Jcl1-8t&$r%U+JIC|`5m*PZn55H3nn-5N0;dkm`^FhKJt}ch5=x)ejf0^2R+ya2z zVz;1B_51qKRgInHCpU5S8jt7@)ip~T8pwj1~T%64P;m2F9JE`+3r;SRpWt523> z@|EpL-PZtAT!w@1+<;@fxd+Dv=BE#b-j{(N!4Et57$rOSCiOD}4fSvM$KO;We;xk| zvV(8Z!1EFLFZMU`*|-<0`DfN%%jlm!aJZQ(o>QZl|zg_MkE z8N(fX`2`9j#V!a*g~J_um9KA?WD+?RMTR^0D&II;BC{bGKMQLh;_A3*1D|Bkt>rPk zX`|lmos^RCiV`U$ClEQ3fkB;&cAvW6QBTc)e5Rik9QB1im`woLF-+A>4qs>M%fOP`{2 z4L2CJM1D$ZxWTYxK;s&uY%POlWLUPzc&2U^GM+f4WV{yJN+}ty$Vn*~uSyarCFA)z zz-Cf1UQt6z$@m{j!?dQ9jMwJvN+}tyT6*PmXX>D$fs~T*+Mu&jO2+p~4#O!WrT>$;URdbEiPn z7G_Ltq1DV`KI=>#DVXwmNVS2fxKE&Joz!q_hp?wrp>xpVkm?QQwbFbr51X%$>P@6N zubgUSm6S-hF%R>)B{K(;@EoR(sCSc-Nj;gGz?j*YfoPTh0(f=hRz9XY5-WKqNL zZy|L289GW_K0t)@YE-3T83o;O!Q&y=0isF;-AJ%=7kDzr^&*Py8@qVYjf+6p>2IPr z5+|4|QCJrGOVF_q;ca_&Gd#+x=kFBTDk?947{&Qb^Nwdx_R3(q41Y%8)krU8Kt!Zq zdKU^?`F^=lQ&6FIAy;IjD&JSJ4Q(uH<@;LF_3iU#0DUMO63zf$7zA?6Tugne#td?@ zl@qM&gREm=VM?F%4KgV9x9{6<-Pabsrn9;_9$*tm)xaz&sK#;Xjaw zJ__1&D_|tnQG@FkTLx1x$WXS3Yp@D(odu0h!97+-9EE^`M)L}m)+u}t1WzjqE*7_i z98lBOV=)b+^FxrM?3s|e6>@D#I%_-aQ9kxP)sF8zhom#{H;{;lZ$iS?nXs)73a?Pn z4ed%gD}tL#C7lUBgEUP03#6MKlFqw<8E(*A1+0X%De0`KvETS%mUX8&3L+GxAtSG}DwvGmrma)q|E@yucGmAZ+oCwo_d+vzbL59R}meC z)QbZ+4YxH4hfve8lp#vII&>CU)45(k_TAR#&{<^7(8n0D4~I~5;JKnsI9R6@8Pu%) zf`kaEJaJp2Lk^*4FAE?XLfW5;)7V|ad>c+T9LQ5{YfQHu#Zxl1>8{;8C5Mpi{R~cH zZxC}^V_N*c2sho-_h*EHL*TzW+AP6r;Kn4y_G4gw6d1=V0?wW5sTZ0-uip;WqM7oL4`WY2OyZ`tOl=^vHCu4k(^}-n2xuSRzP`U_Qxo zYFt9U)7eEue1_OL9dX?n*Q_7joUZ9wQ?q&z*Q0Umsmr^8dKGo)7c6J65$!^6YK)T7 zx?Fgb?@0EmmXXwr%wa&&ElGWsXi(9z)c1*IDq5NPG0`kVYf{e>%~rH7^>0K&iq@yz zBATOUL#m6p&sDTpzf(D^7ixQIjCG&KxL5(-EPXZwIG;u1(plNs*T z+A~(bH%m7#cA>`NW1)ZP0bHbM@v+cDnCoJV#oM3sA10M+R&B+2S)9L>AhhIH$gjG& zuKjHUrR39&CfX=$|l{%3~{Lb@AU4o+5b+cEHMrcD}>ZWVDhSUdL zK;e~|Y&reNwXXME7J%e{KTZw=UFRYzAqRq!GtQ*4F??D)xbA#FAqRp9#=K=^A4cU(wi2Dd&i(;ak7e^Xcd{3E zLPNFz%~qMc3Nmra`8Pz@&*z)BL$0BIgy!t^!ZkE3y9?*?VBWC&zyu3vCHWNEu(G{Y zik!q-LBoMBAxrF#l5hSsteP!R$~82s<}?#=4Gn9)jBFyVq2Zv1ByNd(y0Bp_XRwHC zXiz8Fg{AW8!iIH^N!B5F}s&g4yv{h7Ybxg81`<(^Sr34J^ubPE2}-*z^-XZ=CzaGvBx59`?VzD1CJ^sxR6EmyPUZ-MeU zM~~dXQ0K%TsC93^nbbY^pO8Y}U1%2OsDW=FOqx0;XChPQFp)~KH2X*%1|1V57l|Zq zq%7$^l5+X#oE_zOmi@oQYmw@lixDLxQ2p8Lp!GrmHI&{%u#i9vU0PKoff~B+Km;cb zl0Xg96@?^F{rL|fvi@|8i0b;w2GPe;^_Uy#$07}P;znG5`To-Rozy$+K%dvR1bW^= zgy(ob8-4&qbq-b3IUGX{w-@IIq@R79r-N)Vryc5Zb9q|lJjMWSI&NHbzNDikkI70p zantdn8DEj$YZ*MR8DmDQn zsQjj=lH{WDTTYZX<)ZRi*)qaK)j8A|KMM!`LgjVN`2cxSFI-gql-q%Xi^`wMQ|3V~ zDt}s-2d)EeF!jPkLaVl*|3c`4#qeC3e{5{^R^ATW5k1m-~=z^+TvVOIzO7e-{cE4AVNmMmYFv$| zMpJ__vD@t<#Gpus+Zy#I$KE(DgiQ7#KpxrH!(>ci0^kTML>Q~$gyL7F;;nw!r+@lyE(hQ`t^xv2bzoKp?C zsQkhZR=V7OoL^)s*SOq&oZn)fid?b(*yaA?{8n2B z(5TD($N6m`-05=vaejLUce~twoIlbwa$!GdT<$;4A7$4HzRM^( za#1e#ALow=@vX+?{^R_yA->bN+<%-uF2oNSm-~9EzYiA`=L0lLBkh;7 z1hX`Pl_a12E!2* zb@ZP~_z!T5vzPrICz88u6}bO6|AEbk%a{W9ALl=`2L;8?Koh3$@ZPFiRP)RjK*&Wk z&w30+!^*(l@Q+XUqA+H~-vH*Kx8RVAYU!b{xFu~_!pM+|YFT<5K%Mh39CaXa^I}d0 z@^_KBa#1bIHcOH?rx<#CM0vRLcxun*Bs{>*^#oO&f~1?JkH9_ z^ zZDeJOyE+vqTig{EMcLx6UalKNY;o5NMamX;_5Dq{hO)(7{n{CnE$#}7qHJ-OyxhYP zkg&yFGxhQ-Tii8!mvl#Ei@Sz&foudV%XSmCxO4bZD7i6p&MXFzE$*DBLDTj}he+12 zAlQA4OJr4kVLC$U`w{{04V zC*{yPAKxw!JSR0+=WsNZ%qD8+w#{P@zjlF{{04qi$dSJAJHG+&3VvP3SjiqWks_rpzDFME=zR9 z#=dfvDzijcZ0yRjx?f|FZCh4Z@d?7@)qpW@Qnxq>8|nU4PB$w| zw^Gy13Db>s%TO9NI+V7LU#Cv0J2-5Q&E5V-05=<1^B&t!7UN)A84BV0qkDcEca~&w zVihK#Pka^qRjZJUs?gEKzK{%)ukYnOGnq0nGmfp(@s5B(?Nss%rI#V$(JXTE|aZ-IU>ir zN{ueo8g0@VT@uzoYxG$~>&i(6(BsB5!HMNS@%oVbyxfP!*03Q5x3SM3QNB$Tar0~zb_Yp`|VtaT9N4u{+To^X=O!>iLK)7Pr#qR8yETD!}3tLJfC z^6DkVJP8$4b0$=r2NfM8s}R9+&Lr3aRDrqmOcbno$e7z9$|N^I{JUlGp|be&Utly< zcNz1NWm%txAQSLohks(Ox{A_t7Y-YOnU3 z9erF3iO^^tjiRdF)VS^Vq;%CgdcJ31Ef#_Fe780GLKL>@mU1boaFdy}3m2s7oC$Ru zMEHr!l8sY!PPufS!$q#zH9>R>M6W7~?utYQe~bE7?I`DT3B>9P&^UrhSMAWzv|)h8 zELD+}n#>(lCmx*OrPw^w1`XvuBrOk%IkOQ%Q#)(!l6_=`50v0hjFSJr(^=Kg<;?Fx z=JU&$A015sgC~3y50lrG#a@Tlkrd-dNL;5g#|~?-9gi-F%gbW?yu!t0vCAW|SuVv+ zk()?V?0FEqr!0C(Bs%yEZocuamNgy&u>|hSeP7wiaJ^a^`u>hy8^2o7dNEvzU!!P8 zTQ%dpu4vR6dNGZ|= zt<;w)%q`-4rQ*G^iv6JClT<-FxQh35%G}e(8L8sEDBpQA(4x+{jEw$125>XdwLON+ zoby$3hc$l@rY`3b69zVn!xqq7%$a`~=0MJc2oawoF60YZ7#77E z{2DHxy}exGA0wh~8h$i!v$t!`TH**{D*PI{p1o;8IsO9)HK2_4gJpP>IhB>Y}EVS8CW?|x=+x%{U?>@Sg+SsaQ^U(7V@jtm-5%alN=RC+v^u8kIbFrb1G9q+gqMrf~o4MHP6B+S8 z?z^X9oYMevN;QmgT37It)^JWQW6c0rZm>O|~v-Xk z2RV?5?1GZqG+cS}I}j<`1y$a{WMUUodD}gRNjWuQ7nF85KZl!!Yk8h_PM|0a3lgi& zlYr0Qm>J*ATGf6yCAgc_oqiclSH)1KEL*TnEC{@ww2fks+VW=b6f02vrsFIxvLHxa z2iXWElJsC6q3YzDs7-{@J}d~l{;cTmQMfyhpL+ui(-0)>fK0`Lz?((C(Mehmctca9 z_IS)DiYy3{+|BAm76eIpF!v%0f+Rhdd-F71I{6Qx$bukA59VHEL6F=*Es+I5auf~a zE!1?)*c^$B6UJNqUn~oEvwACd$`!(Yu`DZzXhD$VZdPvA{}A zPA~E)ZwXRk)hwB0liaT;<iv+7 zf~C+TJ(zoseG>J?QfQJM%)KYB7u1^k@B*MGpA^)dbT9}EcR(Z;Ju()mLxA=9U=>YBt4jWFFhjl zTa)DbmiJ0Mbb;K6x3t*lQfWupmgD$sEcS1oh@cXkfYqIk4UhTXj zbtV{Tqy>RjwjgMv1%bCFj9u193j*&T`|FZ+Wg{&Jys`yBBP|HLkJxMrG-)F(2)y0) zK_a|fwtRbgYz_=s5H!+)z&q1spQi;uBP|HLv+eIfoE8L)v>@;_3xY;k5O|-m ze<1O&AV@px+j=$FzxKHrC+~ALEEeO0thPO`)T+8LjO-L4&cJg!H zq4uwE!rhIuAn=Z~-$VwS zd>d&&;2mZEL-2*Bkro8rxCKEYEeO0(NlpubMp_Vf$AtJ+(?|;f@7NIEX&Pxk;2js@ z2Th|~$Q>bm)HKq9z}v@yz~!x$rIGf_VMYdKX#~d=SD_mUuD2$?>z!oJ0B)oOfp?0W z^D@zbz&q7mh$vbRxSY)hB;6FtZAIg8bcA@yyWSx(q~*&8-U&9ZVV)KQ-f1@T)11$Z zQZ!f@u^>o03~DkQ(b9F%g-Da89S-Uy!x0sA^!p_In>f1cWzXV7aX)HhEd)}_+9gTa;bWW2iDU-?kSpy3YI?Rv>{O?||F`H91+fz- zh@C(|>;wv8Cr}VO0q|;g&MSzWKmpodGJ%$~5``>|RRysVD2SavLF@zyVkb}#JAuL) zG+a$V>;wv8Cr}VOfr8ix6vR%TAa();u@fkWoj^hC1PWp&P!KzTg4hWZ#7>|fb^-;l z6DWwCK;c|fb^-;l6DWwC zKtb#T3SuWv5Icc_*a;NGPM{!m0)-?-+v;wv8Cr}VOfdU7>VFj@hD2SavLF@zyVkb}#JAs1O2^7RmpdfYvh4+wZTVWqNf%H`y z(Op72fplmmARW`?T*?t_tV(()Phb6C=#!zHKy7y$qAU0qnRe)|zsbzUv4P#Xfe#Fp z%dZF=fM1JM!6>m4sO@KnF)lw4z+VfJ@4)|7u@k5rI9#H|P9Rfrsg{g(0-0I`F8_T^ z5{jKb-TcpM3fc+OEl}XH6pyM9?F9UJ+^UZ{ZbCKu`HTgioq)eUfu#5+grvfuoq&1$ z50XqG>B&+eLpuTUMgk#d4Sv=%SkVhmCp>bt>svVY$s=c{Q#&R~pFDE5N0F2K)^j}ELs50|#Up|G6s3Lg$k~2HzE2)GJD{i`Nk>ZAL1xBX$7zQ}5K1;X{18r! zNjpUbk&?~M)1b;Fe4p>*6lP3uD?z_hvLdz}UnQMpPGitqUO)N!DPFB-*5LJ;@5T09 z$r}4{xy93-I}Z`|*!qsSOf&Crv;$X9OAPKrd6;gRxtx*Xi$3o|;pt_CgQ{?cDjZaW z*xkw%P_uV}$ zZ0lR~cyTnpK^@IZy#8?rynG2F{@0g!?|*x#_x`t+dhh?`rM`OnrM`OnrM~*Vz0_y> zu4f@lod2G{k86b3{8Dib|1t38C=kQ(X`ENBOcwu&3+V2ihxe#9il7I&i)RD1D{|a{ zA)pRL3HL3clA>z&)j^<6MQQirjO$VaOWt#Vx)n9J3(f|bu4uA5h3R?}HM_51$s*aS zsMS4l4$urm?QSdMq+)n2a?fSDevRvOJ6P%gMFZ}_0iZ!ev)%t<9cC&TcHdyhW+@tR zU!j)Sik7&iF>XlFGRwJb7T}!Uv30IVesnda1ozh~5VW2x%GTiqtmL7Jn%y*Y9j0i+ zy^?Wu1yns1Hm>7-4pmQu zjhk>6B5^8g+-moH#)XZWb{|4zQ(@!!?!Tj#rozT;aC<2kHtuA%6U9x1joa*AGYk|q zZmU~`;-rj&jC0zYl z-W0h2)h^eXqBvP=3i`i=AiVIREcCk^aTlT2t9`n#;AOvgb6HYfWX(X)f2A#yzKnYfZuOF_uL=r}31d ziEB;4N+OOCmk$ZSDprMSO|E_|Pa$`!@R5*Tk&-%=*P4Qjd#U&y9D*ZwO2u4j3Zk_p zmupSImbWD?;XccT-pZB<*P5s^{s9jBh04>80~OI)Q*cTTkgH$I<0J68Ln65z%taroTd0;zY7~F@bT1JIyP54?KTSL~G z#yzLWS`&Puy(0zJwWc!EwWc!EwWe{;X|mP?&uK1td$iUx?m11?n&3IDSz>jqY20&~ ztTn-NTA#$~S`$2{sn0lFYZ~{QCTmUboTjn5)&$RKvn8#rHH~{tleH#zPGeg{YfbQ+ zwinlc>knLzh37O5jPhC&Jg2eGm)Dx$Ic+&~m)Dx$IqlnMpYmE0Jg0qB;$^LgeOs>v z``12K!^OajuErEZ)f>JlvfJ$=#Gpus{DZy%vp0?l;c6a@0GZs`!(>ci0+@#jeQkvC zl+Cp!d@XMf!$a4a@U^@*5ie^^@SMhTj8s``8uy$gYfbQ+rd@z*O{{F%p=Moc!q@V8 z(QLBTgszV!p3^89tu?`O8t3w8t!dnInyfX!bK04br>-@@bJ~AMJ$0=Kp3`&y=~@#!rzzC6 zCU{O$sB2B|oc2lNTV88|=QO&kp3mXTP;f??T6he#4L?q>{cPZCc<26g6Fg!0n1twJg4!Tmnrm| z_M$-SR^e<$AbPM{r4^0G(GlV)^qj^aEo)8ioW^S?YfboC9`nSvw<5Uw@V@4MF2FuvB*u;iN}OgxPXALq?`=DIcni`hD zxYpEo^%z3JwWdkk-v_ApHV$d$Q5>7hFL2bgCO$A&@%w;(iyzjS7!^9;V+dZI-^V}x zxYiVd`Gl@DO&a)%M28OeF4dB8t!Z+&))Z&hOeDaN(XZik0-*R@Ynrk^L7XcKhpUh} z;9H|YTx-hjyVjHs*P0~7T#MJW&O)>h#?9RCk{ZysM&b+wP5DK|GaC%O0B zgnPp!F$n>3FG)y%009}o90i$V2r@%}pb-%PqeVeQrL9w{wRNZyYMolG^FaGri(>2e zR;yO6wblXO`dX^Kt+v+wo@cFd4oTbh`~B4w z9(M-Lm=4O=@#qNy+t>y8RKSWGc#ICfO`ZR$+ucjQ;g^94P2x7HDfffKAa3m*3JV%$%W9>tw~?by5N>) zO@9VifAs3A$!K{U=}t8Ru97sa)aE0UaCn5Db2miPlruQ^>m$(&HIE^fXFDKBIM*}! zN>o8?kVa$AJTZ7A+B7y;Bhdd6L(Fv}5c73&*fg{JlIdpoBJ3S*hiSaF5oL>gos?G3 z>?}2mT_PIxEFa9;i(M`n_H+%-j03t^QTyP7%<@)6o!O2}Tk&A3XyIViZ0rd|9l0#B zI|2XMO-AgM3N~TSYHowBM0<;w4N>?z7aBbRjfRR28v`A7v&5TKzpkwKB5n0^HR{ZV znY!9cqEsx|4lHxPb)P)9^JG?*GQ5H<@O=c>^W3V<-4! zs<-qL)EO0z{n4`iW@#13=y@VcE#0jTcK#49++S2 z7p|!r8_L1o@N>Ak%=dg6uSCt{>*;|(>Np6v83LM?^cg}oWLkg$khj?!hg_K3e}U-=GI0XU+pJ{EYdL`i zsD1Df4A8tSzCfele2mMyjb<6xDJC@#hpC4mHue$WBVWX(P{b+JVvYIL6nyg$BBnru zTLvxmNW3pX^IaD*m5&C~apqlMBI9N-?IRQCg1qB`d^!5_<|t~f<$RnsSJA>+&J%g_ z6wRyU?3}0bf6we%&dzx{|M#@jaz4(}`M+mcEpN+t{-|tKwHB+CE~DXEl1?|bKqabn z4b=LKYVpv)yy-Ii_N)@m{k-XNOTzReH9FH5G5A}gY*W-}G<<}1&6{K{hA;{}2!Xl& z5Xiewo-9l7*-#ZRIn?4C@pIBw4 z`4iBP_HUr;0^JyKvn>-t6^8v7dIp1zBKeuohS?~;^{{y@SjbvC2s@o%6F+9_VI|XZ zH3I~uZ=uIpx0z>xfsDt4>6MV_wmwWg0@Gj64Ayteb}*1}7nlkM1UY@T50j6;G!D&g z?KMY(fsA*8sWoKU+lR?VU|NJ$u)57sFp%+8Fl`T+y8AHs2uwf10Jl2LPg?Ps$I{PsB2u!by15>;CBACe72&UhLOznM`d<3R>W5LvB{tyggTn47n@}MHx`Y`zj zOh3keGY^_qgMo|}g6Wum$voJbDL`Pl4~=W?H!lDK8Sewr*&);ZK1@CWQ{y-={m9%3 z1~UE@O!tLMKkCEeBQUjKA~A0@SAv0zg}5Ca3Yq+6iFPB?M_{UG#JRZ4onL|rpx*;`3Ov}j|bEF;kdjMOc#bs=l5aq5tzo4 zslyzIT$tNqV4}OFs@Ktn$wy%NBRZ_P)GP)A89xBipF*akeVBYi^)NKxE&f-$0!79W z+?a>pR;xL+^kMQ5m>ytG4JKddCF3M8@vf~*4Skq=gg0yGVjlHf%(*NWOBeH~x|oln zi+L0-=0|f`7xi7te}xr{W&A9I8B49vk4;c(^o=(mLC<8h^b44legV@`_iI_GxA>T~R`5GWwAZN#F^zP}<=NNb&Q%W4Gi z2vA6CopZ;nf*ix<=cJrF$!254fQA2NTwTYei7k?1iHgLXJJPrlwOB|)P-HlRkX5|u zBqK6nHE8f;Rk#no0g4vV#1}fCMGI+Si;P#~7ShBPnV=|9NE2IRqN375n%E+f z6qOay#1?5)R9;9ETV%4LDkJfN0sYL#v2@TXq=_vui$PWB|bMBL>qq=_vuhee@@ zt&k?R$b5w`u|*R|*a2E8W2KQ$ckalFA5*Z@>`DeHm?pN!DpkQLq=_xE=4X-?Eu=n? zwX7L2vBe$AjJ|{m|9#^!dG7p;ABB%R#pdAK5Zjrci zM;_=vgB8QX7J1O8E{2IM@{mtl40rCx!wRB>G_geI-RNi#)2RxR~zTk;mQu z1sTjX`+n_Wl~TjY&14C*qkkS4asTj!yEU=J#!i7oO@o|K`zkS4asyBu^@&GJH; z*dp(#lnx_la*as761lM4B{2CIC8R+0UxK7kCiVLznk?%?##&5H(VaVTv_&ekT8i%6 zkyh(XQQS$OJ{=C6y3QabA94zDY|n<=J}~@DY|n< z=39e>cXo>I+>wPo@w^n>xg(3Du&B~h8&kWjUx||KDGm~B4su}7#FnBvcjPRKeV!(^ z6y3Qa=U8JPn(xF2S@R(JLP%-2PMUiV!|vFNlu3s+EVwj#H%gL0Z5&f zqMLVQjr9&RhnY1+H}A+=O9xhGif-PKbw1pZqMLW5!-w4|x_L*|TPGs}PRc2|c}F%_ zX9?bGrs(D!*(f>N_-IjzZr+hjVW;UWMK|xrCLiBrrYmUHWgnw9Qh)swQyangis^PLIBk?2j%>9a08Y`(JF;EEY$lrC zB0H=nkwiD|C}%kW;j1vBYzK}SANM~TSt3I{!}%n#*wbW+~Hs^H#yRRjy^%+>u`;-mmQCQ$g+$I9uyb(%Ho8Eb0K(8 zT;w0t*9FPz$$}|E;d`EwTh|=pTOQuG^+@w zYVrG@(cCU5V;_UE6*M$L#iJ^5i94fkEjMT2TEYU9a56WdLxJbxzY@o6;-~6VvW;Yn zX+}5WhyRse--h4nDq8&un%8MEr}~Q}xr#pMvBq;He&AyM)aB7&Vhr3)P@iWn$MC2z z2cmw=G3F(OX8H5@KdBZrmE;wO8%Le!1Zr%>^4Bu9;%4eEY)=5s3W%z?6$$^Vn`Qq0 z=4P4S+s#rwUz~qjC&cyso_+pYwBrBaHOlA_kISffT=M$@QFU3PjW^nK3IyccgNwXT zSu)}=1Ytqq&u{QA^JT=ydk$fV{3M73+dBvsI0f_eqDf-Mqqqh02O-KaE77N7!zLqQ zfkqs~hzdsV;T{wfj5x6$A{J^yIU{~SibWFPlrdt)Bt$Hhh-iWlt;}VKM8qPD_>vUu z5)olnHVU1Bxi>-~_b3#C`Sir?asH*7KrRta}PS~E7$oIvqI81Ro>_Ek>RdJ&ygLECmK-|4AqMyW`r84&kx7LA_@P3J~rG(AY;Q@)T zGSq(z3-q8yNRgLQ#zPvBBE@h|=F`qKV%_`B=RoH}N4+gQ7&@d{jZ3QPh%{&N8$p8lSj;X=4?&CTI*P9H(en;u5AEt*9-rh-u>$%}#ueX%iI9 zORQkpL`4e|{o+8A6tyRK{9$3MqUDLBm^N9_>O?Kk6h$40CZef|Ium1wrYY)5{GL*# zE83En!n7HRwk2L?+Dt{=iCIi*Q?xTdCy>Hph`4x3>?S-`;T|*bb;4N+_nHa%L>JCx zmD)8InTa#lqQ`0KWgsS;qwoqdaTVcQh2J$3w-e4&c&(Y(M^W?Huec~me2opcKvVBA z6Q8lZj#qfUnHZ1zX5m7G51Wa{aZ@c^q;S8P_zmu(g^LwFZYCaKMoSbPFcaPE6zvM1 zMn;spRN=E`;$5bmpzuXA(M&a#DSX*XJi&aID}2pNT*1^83g0vngP8A1g>RdQktANF z@LeMSQ23^mxQDH9y27`u#GUM--3s5e z62~&%GZY@O5~s2z&s6x4l_+BCe@)?GD{&Qzzf<97R$>V=I!oc_R)XJ-DLh+i<4Y?s zg`#$8>TWyna}w`XxW`T$&D3)g?zI!U*$U?>#D13ZF=d^12)#jk=iU4YRHJ;{y{MiG z8abz-XsZOd8&@R0^GW~vExhFvIz_i~tysd{xT4$UGRWPyqT3m(?v&p^Nak+(&KK>w z8!*A$xT3&!KEd6%qC1u$A@rRux|3|;J708n4T7akKRKr%<-7#s`_88sPC2iW^fX-J za}G-c-<~Wxa!x}c%U96EcitQJC4=19OQyI)>n|I7$;O?~I>9H)?OzWaWKJ+y<~7s zLxLN7$-s9$!HvCSa85&l8+*y%oQ4E9_L9Ll4GC`SC4+Ms65QBJ2In*+xUrWE&S^++ zV=oz=)8Kz~JbCN}>N1XLvlv7LB)GAcoJ}OtFgNy+b66B^>?OFdmz=K<8+-Xrf_DdK zrHtWM$CE35j5w{?l?+laH};Z&?|gzAd&xC?jK?FgY&0g8 zeho0d>@OR8$?XnGnBc}Ui>1l`<`H0m~4a(~#iCUh)n7GReFIH};Zmod<60 zLM6Ddmwe|@DMNdL8+*xjIexLRm*B=;GCZfD+?R%%<*s;+7uF+&!6isaGf8}4 zvrZBld#H^{ZtNw)a~die@JOC)wdh%gxuB98dm)Tga$_%qZY4MNlHoZGmE71%PPKlE zSq?+5l8u}U&uOUS#$Ix!^*@r@T*-~SWOz|ecF~_6~7!@>G8cF)GWA?@)M95@3BE(moJxs== z?>ovdhN@%t~(H zC3~IIkk4B!wUPRR?>sTJ5e(mX;_U%W8`X!CTdnT_S8@X{xn06+CT`#*cUV6_l6>ib zvl)TN@qOnxI($6vaB_(Z=^Ad}B{y4a!y0bjB~Q1QpXU6>fTPSPlMTF-!>B=wfeCe1=p&Fcqc}_#WMglpfq2IKfLL|QP{bpPbkaBLpRR`Lm2vx{H z<=tI<=livBiEo-I=N^`p6Ul3cK(5>)OEo?xskP2gBWGhFnU!-IvT{yCR?cb2$~g^L zIj12j=QL#HoQ5o<8Tnb%BsTo8P&5j%a!x~b5V~z)R?cb2$~g^LIj12j=QL#HoQ5o| zeO|VMoh~cqG-Q8+n9}Tgben!zIj14}DPq!DIj12j=QL#HoQABN(~y;O8nSXuLsrgd z$R2>S%IpicR%Q7PM|D=tX~@#8x+W{9vQ5xxSXRzy$jUhlSvjX6`=5v(k(F~AvT{yCmfO^$vT{yCR?cb2$~g^L zIj12@Q{1?$oYRn%a~iU8PDA!~#81pVjH;ZJm2(=h2M{wk`vR_0vT{yCR?cb2$~g_$ zJ1{tBWaXTO?BfWxW#ycPten%3m2(=ha!x~5&S}WXIStt&4B5F^Ij12j=QL!wfxRFr z=QL#HoQABN(~y;O8nSXuLsrgd$jUhl*-O!PPRL$|`dpTka~iU8PD6G-;#bNdc~w@< zX~@bs4Ouy-A^Ry(*JXR1(~!Qp6Wzu4olghfb705ZfgUJB$M>C2U$+4Z z=i!oauEKSYc?Yf)?A8@rFc|rl06&2LAx0jP#CN`IBxA7i`Ahupe+bxL!*5Q`X(($x zD9PeG-#>n}YDVAr{+@z-{uH8zW602VJ~Pn(@O|eqlN97rizX$a@BDxX{M<2!R-p|C zOk^s+LX64*lN1OCoiL@qzVCeAdrO2(688j&zVCeA``aW@eCNw&T?^2^6B4T`>igrN zPreRcF^tkNQOeihD;gC!2|DRjG%1QE=)qVqT#=ig?|j7wMf!F4ijj&+z_|8|1uSX;&nI1;bcfMkRMoCfTB2~(1<4}cGPz;}hm^{1nIkSA| z35*z_5%UmHXa0sUKR20e$FXMl4fy{~tzjGl56-JT&4@fB8ufGyEnEW1XBBl0J#`Y$ zbBa2KI=G`pp6A?&gP7rT{6EC^n71I}t7FV^O8yz7*1^fHLFC+{oXa(jdxJbg>U}{T zBK3hFkA71i^Fc+ck;lc%<2KR!739Hu{)jx*GmpQsRJW-8l=Gopba|@BCtsFXtQoo^TT|=Mjg*xjyHth)0I*eiFde+ub zb3>b1PF-grx8q?1QazWd#JQT=QkB@I^4Ii{?;~Hnk2;3F%)Ga7!ybO)L&q_%Gq~*x z_e`VF{616Xo1>98^M?;((ZhrWmHi} zk+~TtLSO8>Ln^SVfyZ_PsI%cCq7OB#qyBg!?~fYZS--%@JFMYu9PJ4W?OEncC?m`H zEJWW#(d=0EEMN4{T2dY73mCZxk3kQE_;LI<^MF>XXInF$PU)LzG|eUJ6w&wsP*C*e z5c_+GRYB7OL6?E&5+q+iK{o{gMm&V(vF zDD@to6Na`@!o4)8&}cT|Ou~KUKnSDIc@VgX0`HP|)n@rn@j1Q4FS0S>N+w=zzBmIu zabVgBrn^EdE)TTes@w9>%Aq@`)3-wr>(Gg;^UVh#f?{rih~H6!ke%Nr-wOk#riai= ztX)!l*MW)5FN4v=W45YzPCzPgP)jAA$A07AjEhQ9V0Vpx&b(a8wK$I?r0B&0ad1odbxRqp6i2Hpcvl zWCty2FZ=G0^q`O$BX*-6;g|Xp)S_x{LaleH7Uh{gQbl&kS?mEqS&l$a@cZCS0`vRb!gwQkF59cwnM zk8CVojHr!Uv{7KoYTcIAx-F}9TUP6~tk!K=t=qC%w`H|%%WB=0)w(UKbz4^Jwyf4| zS*_c$TDN7jZp&)jmesl~t94se>$a@cZCS0`vRb!gwQkF5-Imq5Evt1~R_nH`)@@m> z+p=1>Wwj1-Ifkb#t94se>$a@cZCS0`vRb!gwQkF5-Imq5Evt1~R_nH`)@@m>+p=1> zWwmb0YTcIAx-F}9TUP6~tk!K=t=qC%w`H|%%WB=0)w(UKbz4^Jwyf4|S*_c$TDN7j zZp&)jmesl~t94se>$a@cZCS0`vRb!gwQkF5-Imq5Evt1~R_nH`)@@m>+p=1>Wwmb0 zYTcIAx-F}9TUP6~tk!K=t=rtvUS-Q_-Imq5Evt1~R_nH|)}67(;Kq0r1`m7Oy<5XduY4h|jYhL^xu9w~amSGfc=)yAGYVz+N#GR$2Qn z!iDxhP`dU_2p8FZ2Ys>q2~y+sxdfJWp9M!N;?YPD*GnHRNJQ`JkU-c zzQ%CYAS&|er5IHx>&K7VDAc`>WZLsUW!YCFAH)7Ju8#dSu2H)Y46eNiG=|-XYr;MQ z@l|%5F@|$Cl#hJzHOR?R=Vv)lJHPHX5)(~uv7mm?a-w$r*grEtU83`Pov58ZH|`)o zU83{UB|1-Cq9f{jf;75BJFOVq(XwAcjI%Ni!9jmuP`yF;Dc*dZ!(%xGO=sZOei6ks z?9->Rh>gZU*4c#e7L00F+F7@d_RVRe?Lmo5dkT^bdjSfMmq)*jvKGwS1DYs3 zdy*sgrj%(G@aH-F$Les282LObLL%P@BB9PNgUG)Gk*1OVK@jPp2*Qr{m3;yEM!qa_Ltm@dupv37+| zBO^*)s_C!wO zTcz+_)1`Snwwj}f=6RRq`PdpwJ#4x(&&Sp({LFM|o{z0l__^uQJRj>&_@(L6JRe)H zaJS{sJRjSjaF6BEJRjSraIfXkJRj>+c#-AOJRjSn@G{G#c|LZcw%`?(OY?l}Bu)LU z<(bO~Etlr`*vXoDgXPjZAKT2Cgywmd=K0tun)i=K0tzP2Fv~G|$I&E8JtdG|$J*QMlK3X`YXrt1vLn$IkQ6-Nig#m_G>BDCT*$ z{_ngq@MRfys|0DDcY8=sMDu*ndXp1(vE$yl4>N9@=6Uxv9uFF)dEUL9u|@%JW%nWE zPt%F0yYDq7(>(9qLTQ|!X`XlQ*n@=7Jn!B~HZjk;ch5%9bCP17FLAyE%JUt|87^_S zXchB(@tpn$mN=ET_B&#pk7o~47>~9~3>!>hn&-U~Z<{GG&wGuxAljwf$Q#Ze)JnrV z?~PC$9d{p!6QHO|^L&6@_e01DP$G@@ZoH9qii}d|G6SK4qj7l*|56XgRLt|H~8 zn&-W-L0!;1?~My`rFq^vT2a)cdEOhZ$aT4a?@dsYaA}_RCMqg*X`c5cDJpYmp7&Z6 zmAf?0dy^Ga8D%e^U{TXM_EPFX^Sn2ULADFc^WJPCnTBbe_vWxDfR;=1yfO-UGY~r(vG=9`vcx zFwc7r`NV0M=e>s&L|vNay+_^!H{A4Hn&-Vo6&0uX-i`N|BRM8qn&-X!%2(#@VX1z` zO2JO3OY^+Jg6h+J@5Xyxb7%sB&M&CW zEkIEEMa^%#OY^+<(r)2vb!ndWUcOAw)HL6_@m^Ia(_EV8z1Nj*woCK8_r?;@bDm4{ zy!X~!s2|vpU7F{;cYZHv?Jmvp-n$&XFweU*&wKBwln#8w_GHA9Z-87_?g4-1g%qg% zhmcgtq;i_svW_=a3~d!O&wEE(D#xg3hyu1+|1F9;6*SL>Fj_(Ld=e>D;YFh=(^WJ=GwD8WZpn2X~=o8PYpn2X~WU($#r4=;Kd)?Oi zxL?3zTfsr%?X);BXr8a2dEPtAVxQ-GHx)F`d*@hfkWKS^134p7)kn5)Co8vWA!Y?d4R^JnyX#O3Y3bG|zi0Ezadw+*i;%@2&FN zx~+odd2h82=e_mT z+0c-aZw1Zs-UjOu!F$aLn&-WZk~7z;6*SL#ox)D@dzqkim8p@e8txVIBirO_O@D20awsG z?`@Ybn~COmZ-?~?l4zbU;A}=9aw?1hwgX3pkE;%QOJqn_bKdYaTWrH>n&-XKE#{{= zmtg=1N14%2%=0A{A!jM&qH>G&Ked@X_Vtl)4x?vGO{&ZYQoMpHUG`nye zz}?@&%3Rt_%SSOY z+D%Iwst}!o4pTnu%bE_vbN?4d zKh>_=un~y+RaQ@1cJWm3Tp^Qf&(7?Xs7rgFqVDWGrroS)TbA45_AR1e&z3AV*zNBt z>dGC9&FA3nN@O{7Id`Lb+Kt@Zy;2@#%0Wq4K6JnQ!US5=i(=>miR~CVTz)%YLpN`p zf}ECzrQ$o!r{I}LOSN1}wY=VLBNcZXk!|)mYQ8ckRrNF=U0?QetL7J}=G$_Y^~!x7 z#16g5&$*7~r{Hhsc@o<-^mO^%LcNBwwikway$8McL3Y(^p|6+L_CjuoL9d1_>kWG` zN59o`N<+tKhP_0=X2=^d1M-eBch17eH~9DJadIEz)&BxBoPEq;3~LzChMkL~oAKYU z3AR7K`l-!8mUybU8cCEe0o)^D307^Usy1Eq4MN53Jf3wWhe%n6Oo|EqHi7Y5V63O% z(mLelP*1~UfI91CasHvE@p}W-A2rPH4OoXY40FdS)R5T|*3h>hx)#P+(aG#lve~t$ z6SGIFVOA~bBml=sk25bA~zs3ca_6Hw|zC{-`w*C^TYdUkKqNA0S}I!)^`n&wc%BJ)l715nJz z5bH-%QUUsXgq-CG-vc_ zzX1(!8OoqMV!fK7q+Rv3tS%pQX7A>d*`{f*Ul&u%q_CZ4Lc}*i5i*OyM5`iv)TtHJ zsvfdfBYHiKN@7Kw2BE(Ug^uZ?mydkC#s*@Vil#wKlSyw5in$&lI9X`X zbdC-5@{zBX&bU3kUOLCZP(OS>1Um1)UdZ`MKA8!`?Bs))e%KiK8?>+U8%y-JISnZ3 zZ-mqs{sE>MXP*hHW0gUHnB&&@(=;< zPosFeqy`P+O3W#iVGe{Kwdoz0tv0>+PavVso21THcw}*N*oeT(3X!A>mWhRkse`h7 zeSzi!yO;UE9lM4JYCe#cO5Nj5V@xkgf;;zoiOGKgirH#Ou>HeT+Hi+;4-G=PV<1>m z3RR7~TZm~^C@P!4Ak7LzgBCN$_f7rRJcdA*q9zPkBkvU^9ZLanSeU$eI$*@_5DNz^ z{uHBIiX#wSJ^cz;B5Q(3NGL&ABKc8Np~O3T*&y<`AQJEFO+dK7Dc&cy$k@oa5Pq{Q zCD1oM`HE)oEgBOyacht9Gr+~SYK+O7JzhX5zRCUp1i1@vk+(pLZxaHe_=Z`azFnjv zn-A>u7SrdM4S zX-u!WEcUrrmsB_6+y*_|JX}=Wgb*0T&&`3lo@kl4%#3H>jpE6GW~X@Wcj&ZW_h@#C z4^`xNG&{xX6h%Fno#OS1Tx@LuH7H7WG&{wIDJu17c8WJDD)VS|iZ>}L_h@#C4_8#> z(d-nLk%T8xk7lR%NKMOn+!Tm6a}>ese1{Jm+#D2HPbwro#IDpTAN3+Q+&Ll*&fYK@d=9Nc{Dr4Cn{R#(d-nT zq^RAa*(u(tXt_tTQ+%?b)gH}G@hOTrJer;2Qx$c3G&{woDeCfQc8X6|w8f*@DLzBd zHjief_)JCJ9?eeiHbpxQ z_;H$g8HfqzD7?b-Xm*OvRrp=gquD7wPvNzuN3&CWK4&gI%6l|B#TRJmJ*G#qQ~Y>^ z_nRKgPVt2bA2z+mu}q9FQn=srXm*M(R`|H-(d-moqVRy}(d-m&SNJqCqU5CtpEW(2 zo#H1be9`o1c8V`k__FEI>=a+F@HNw;*(tt4;hUyMvr~Mf!naM2W~cZnh3}dk%}(*v zoUdti@@RI7uhG=Qrbn|=e67OIOpj)#_&SB3n;y+h@eYMwnjXzg@%0LKTOQ3$@eK<1 zSRTzz@r?@iS{}_#@lJ&oSsu+!@l6UZvpkxe;wNegUSWAOJH=1Z)bCmz%}((yO}*Cg zXm*O9tf@Cx9?eei&AeC9?Bvnx6hB2%AGbW3o#I;*9=fUs@L9{F z*(rXS!WS)%W~cZzg)dtk%}(*{3SYB4nw{c16uxPBG&{vlSNOK&(d-oOR`{;v(d-mI zL*XIIquD8broxXbk7lR%*AyPMJer;2I~9Irc{Dr4&rYriCE?&!kP2)c|hUJ zIcYvnICHKhWjJ&GY#~rMbG8wMGv}Wd0fjT?E0hw>oIP`af|=8BhBLzvf5aS~%z70m ztWG>WV0e{OnsYf1N%5)_Io@f@fT|TmOL$0%H&Bu5@sJd+Mp44!At~MdKt|1oGdb?a#2Y8>;ndJ%nIp3DlUK zYP$p)dffX+9eXu`sOpk6TQ?f1*<;Y7kVgqNUQ)+B1L4@w_a=6MaL!CgD)YubT59eq zk~ZGE2i++(?`M#0)wFs%yE`@i9!Z<#U4&7RTEL~MRWseY1S|8@@rq`6JH7|B@BvAi z>0M4$7OKoPqs-x6ZJF~Mxl(VjGN$Lyx>x4>2-g8etc+#ZCrLpoWB*|fAx*4|nbi4^ zoe?Wzrja^(-2ToCXOQKEl`#{%1nli2t&gG}t&9P3y${h80ZNp>%9t5BL1dItQRJ8Z z94^NpN*WQwVr9&Xd5xLU%9sgW0`_QS%mgn1d$clUf|r0jS{XCJOTZqjjG5piV2@VD zOz;x0M=N6{cnR2}l`#{%1nkkum$0~PHT20gA`0FV2vz9d@R>m@iGV}QkDgS-pWez{FSz%_x%9z>yA3z?hjF}w_G7nlAGvQ0XWe&$t z=67hR&ddXqn2k$dWz0P2Q){CtM zdd9`1g9Tv;t&ExHHHRi3==_4}+yVrpgO`9kS{XAhC55lmqm?o9@<2gTOK4@xysA>B zd9*TSf|r0jS{XBM)T6Or81ZOj%)B)b^#hZbSC7df^UlMP*6z{Dn0c3z53GzHt&ExQ zCE%mXDTpUurCeC<%4c|?2O@^SF-Ypqq$;&CX2x2qjcQsMGvQ0X)wD8ZTCH88xKm9l zV+fBjWz5X9?vd2yYFZgH;Y+~P zv@&L9Sx-pn_-a}iGjlAR30kXZWz2*x0aw$?n3?CNwpG*0n3-?UVqn$Gu0D>{8@>cw zO)Fz&k;S?|l~&WrnCZ5PXenG3D=B^_4AGKYOzTZ8?pS8H%a4_e~~NIJ?K17>!+UPO!vh<+(V zY(MtKBSgsLFG!L*6MLA9NlXA7VIu;JhcH?hGnM9(D9b>xGG=PbGmu^_)9hdgW29Eo z%9sgX0^!1af+dpG1Dqxia9VDaIz00)wD8ZrkHD> z6s?T;47><7U)zEgGfOQ4)mBX_Vo>t88a&_&gFQP ztEQDP6TSpoO)Fz&wRO4VIj@>l#>^V)eB=r%V>PXenYESfLt7&D-bouyzSxqZrruR$0TqjT)sXx2~OiXPA<0W9?rU0jng2S1u zRy%Mtt&ExN5@s`f$#U+nI*}wV0dqDZ5IO!!z#JVuEr~BdV>f&1IP}cyUyetg%$`3Rqde;% zY-ji3sn0Q-8Az^Lzz&(acot%+PS{GWZJ@-<+zZKd<^pgTx%)urRBiYslhY7kWS^dg zWW#v?lB!N5TW++7IQ4GQynHNaey23M=YVGWm89u{P^W6|uSs(yqRs5W`BZBbc@5_< zDKCDMl+Pezr|LV^FuG+IOO7KDV`hIkm-LfxwX@gb>SQm0guLu+V2xz!L79)wKp~r| z8@W}JIUSmpR^7G>a=dpyUv-B*xES6?M0awy;~C0(jCFAr3y6D*w~YdRKsCA2dKM0#7mce=^iT>N&(f6Z>L3Q(yy>?a;K&BJH zs%-ra5H6vYLUx!I-6)}#Lbg$n_;>_|nWCG=9r zHY+NVC-v+oW=1cCGKVV2+uhmmk0WTBWzJwm(MusaL8F}W(TNLc-$Hzu^DeG~%>Thv z`vtqGQTGhGc0ogblswN~jn}*D&2ONE3vw1Zp#DA6fTun@w>K1BhlF7kpUCZ=n|B%Y z=0jvIIYRn5NKYaucW?^&TcUeUmvUD5oHvm3e=sfz%p;tGhrs|BW)kV0NgVS=!GD>d zJ_|s~_wO{5Kbd_p`P@|XB$L0QKNh@vgmV`-Yw=(8=nI}Q zMbn^GUj_Beq&|RI0EwJfnK^f03!e51wX>mssXzB&H)L&?gNTPrlaomBXEz$g;ZW8? zePuloFgN70Ivx!~qXain_-#i@&RF9yw`rGZb&ao8r}n__`JLmkU8>~` zzLp#NXjuvA|E%Tmf3GE!Z!|Nk#kqa8+zBm*;q6e>a;~rCKh7TZ6bc4nrrAB8pRHQY z@2mCkq1Lo#7PJRiHaxY3TIN z`rZ>HorLCeRSFPZ*=K| zzT12ClqW$m>SF0FU8ByG-!1>PFKwfqN6mtsjjHEI$Ke2jIcE8M5N7m$z)>tmdQkmM_^YeYCKS zwu^$N{i(8!ri+4~E9wl}yiR8AXEhrAbnHFM_SP`lrO0+IvaO@zTET6BFsYB*b*?z6 zZs_$H`W9(6j zka%$@;ztlMdLTr+%bYG&ve_-t(=JvKvsA>Tz6jOnGDV$zdQ=*M{2sO1?@=8_bMHRq zr?&g4m=?w!U>lqpD)bf<+DCbUJ*aG|2r#<+{fc)Coz_ns&rz&^V9j5I0iaL#P zSH-YeJ0v41DC?tO>^}%)rE6XEkd~*bg|2l0>TIEFUGzi0u8%(6i2hN-JC9yqL=S7Y z+Zdb0!YBV*VH3X((XA9so$|ls>tu|Jk!-s(PM}2+^>tE6x;-R4c|O)#-|D0AM37zw z(&k5V0XKT%vjFm)$FbY6*2+6CRN_RC|DKYa#f(>7yP7M9_F^6jfU_V*HOTKy_^RdM zhLU%7pM0-`pwwXGJEJ#id%!Yw9J*ZIDPg`(fP5LqTOPzf&pRc^_t(9Z{#2Ci9`!+> z{J4*Bm&iM@Pre^R&?U^5r*s5=qmp61AG3-Ug!yJLNM2&TA7BBLw;;%OeQ)Mn!rVRT zv`|P9iD!jEWEZ@Nh&TH;dX}z|B>4K?S1Ai~!Is^9Gx)K2-eAU>;Np#rYOuUj5_Xv3fSEs9`E2+o}pI|m{^p-A41?5!$fxr*H8i>woe=1z;9DUecA6C$r$ohJW=@!n&_WH+B4_430 z7S71FKR>Q$;fx%louF!M4Ah#m5NVyhT6NziI!V#C;aibw@V6V8jQWPC(J^Y5{B|16 zSN5V9^+Sp68nsV;w?Ns2#ZYI2`3n@3b#*J0eTvGi@5gw}rpp+62+*8r-UAYn{t{$= z3(90p9F*?ddEf^+Ymi(3r52 zG;>Uw^{+H@j?hTZm^2iF$2mqivCS$_x?@OZOvqw*I#W%XCD#N|Ni&h4G2z=3&|=!0 z7L}&uNG1|AT1PI%gYQ0DbKz7pnHnQTvYB!*nmIDgHgUXJkTgz`CbKk15wh0j&|Z;I zz7$TRDrJ-}Wd@XuG(rj|N=<6)B}KzVYm`!k`cgPODd|vO$^#fEkvriP%lSf+?v&?b z)kVX`lxvO$*$p7$+@xeT^di%+G36DKeH&z)LX_;=y~s3dw4Q{CAabUq^}`Xaq-P4L zF=aCAX9T2h9?_%`y`*T^Xk9xCWDUL)E_;=YnEaOJZ{=R4KeOMu` z0M*bpknpdbxv_uo%#HnTp1HAq@yw0=i)U`^|Kgb&J4B7eGq>=cJaY?=c;*%!@yso( z?<4~~a|{2;Gq>=FXKq>GnVU5WEH0X(Kd;6pjak0~GwdwUDVPw#uC619}Y5N zH*>}*wZ4K{g^pXh*@8Kd&b)3`>P0@u;y$_+5jlfPyLQ)sMez6?ZJJcD0H6MfIeFkI#2yK(?aK|?=mfPp1PDMbe@`snXD*uo|;KC zTyv=Mu4I0J+o|CkPoX2f1^vWTsrZPiQv8UkQv8UkQe0e>VsuqXsH;-36TkKAC|8oM zO7YuPGDugY`0b1}O4@L_3ZYU~h;0-`ny%$hBmjO2oE=P`4`OJ9m& z9h=cn_%+P8%2K9 z8_)=}Rgvp)J(E1`ZAnXbv#@cP+#ZvlskFH58wKS8v(KBb2<$nFTIvUDG(vH+=5S%B23EI^42oXXN8KNlILP>yGs zmF&eOijgS84LwMl%F<&lN0c~~rTaLQrTaLQrTaLQrTaLQrTaLQrTaLQr6;j+Ib7&e zmhR(JmJXfDDqjFm)Jz}yCUv1xS$YN(<6mR>Vf($uLey_Pj2PGxC_GE0s@D*t`q zX=g4#mH%al^!77>#HlR3gF)s&r?PbDRF)Q}GX1hd`hnL`%nY2$(hvI7890@t1E;bK zoXXODoXXODoXXOHQ(1;iW$DM}OOEPPmhR(Jmj0OzGIc6TKe-ka8aS1u4_+upoyyX` zxJ!^am8G9KD5yR|r?T|(nnM#1bbdi~ZUKVQeVoeDFVV-3vml+y(l7r;(9{f_%F?f@ z6m=>~_i-vqzcB%g7dVxr-}(ae6F8Nn-}$+usZ&|{UEU@Fr?PbDR5rlmG*7;AxyZ!u zCZfvO${eGZ@5-1Yub^k0^jM3v5v5aEI&>E#vSvqtoi_)nqJNP{cxOlHRF)2%%A#~COE0om7pT%GoyyYP z)<_|4kJ70uz0=~rpi^0tPG#w{EcSUil||`PmOjV&HpuBz7Nt{J`U2|C2K!g9*5C~{XpK%J4KUlF6T4k6B1Q#77Yh;FkG=5-5i+?K5hZO% zVGolri3x!CzXOb?1Ui+aE6v>~n>v-HYs_ZoAEi@Sda#5sQloS#ONUNnQ96~SYfbF} zylt|uX@`>4sVqIo{2Im3sVvXgy&-t7 z8KqNM`iN6mlul*oPGP50S(Hv?=}kVq%Z$>gEPbMn?>D1#DodZ_KyhzdITH4^`ITua!?euRL?vWy}B&GGe>#fi%_hw$i%^gpbB z2r5|yL9cq^mv;i~LfF$i~#8sC~I}s|E zL4Ot$RR^>IZHp0WnrVl6lyFkI8WAW#D+hk#rIMO;Dn=IL0W2ry-sa@o+uUza*H%u> zz0JwFw>dfYHYexa<{-_;&!O^+XfB0oK~B!S%?;u+R<03OHz()b=B6WDoRf2Jb8_x& zPR_l}bwGh+PR_l}$+@>VIrlav=icVz+}oU-dz&i&W&d0$u9=*idz+JUZ*y|)ZSE1o zAC)_RYh~^QT&r?&?rl!az0Dm)OifPCz0JwFw>dfYHs_&}*5*FOHJkea*IZ7{z0JwF zw>dfYHYexa=9(}thUJdNwJ|5>-sa@o+nk(xo0D^Ia~~kJIrj;!qjGZYZBEX;&B?j9 zIXU+>C+FVgn$a{z=j7bmoSb``lXGu#a_((T&b`eY0L|o_oO_#-b8mBU?rrWc;-}~2 z+}oU-dz+JUZ*y|)ZBEX;&B?j9Io?iY=j7bmoSb``E5fLoo0D^Ib8_x&?qb9&$jQ04 zIXU+>C+FVgcJkoSb``lXGu#a_((T&b`ga zxwpAP7&L2ha_((T&%Mp!V;65oWF(S1Y#;S35Tf`yWoO71un& zxf`?kQ4`oX#m%a+x0_X^?`9?4dIv~k%=vCsmDg=RjA{0No_h~fBi;q_CgM`%JLVYP z=TM+()C16h4qq=osjAV6^1SuPzDmZlRTJ@kMamXU%lB@^2(99I(cpud=rL%P>W0rC zI**y8oxkEb*erxReE{Ox$SCF)?bEjhR#>Df%8>{&R4aKl*9I*^Hpsh=d0R2&R4a%b6%6k(D|x%r1F(! z=zLY{x3M~3)sA9jbiPVER6(4tYRB(GkTYYHQFOklouE6 zhK2VZX!(M=KtuMXf_gB#3#oF;Dfu;D&MKjJ-O2Oga_)baWo`l_V*RBT1`DNV|?zwGO1MQh$<}*1R zyoQNq&nuE{^>j3LoQLFB&1YD%J*ykp@8K8qfWTFacT<-Du57%Siu~H=ZEt*tsR3Nr znCP84uW@7V)Y*-HA$;BEZEM_4_=d?MSUuB*u`2(^l)CKcYOJ^di2>|v`U+*~(C*p4i{p)zTW{u{fP|lG1)^l~S2qf_R^+Y~ z_;ZsLNWU>!4?xS8li?So_4ABhKV4eJXZ=!iYIQy5SJy_Zt^jT@hMPCCQ~czJGu9Gh zdQ3XV^d~{4+9;3vV*Olx+BcUc`sNZq=CXsi+;=3G^N2GzTS(gLH#PJ55eaFiT;St_6Z%Sw0#1&xsl(ADQF6+8A`m*h~gv7 zbrHlagDZ%NEjDMO0yxlQqAKF$#*s?_ zvp(!>lse4?RUCM8jx@hXvVTZ?(0Lw)Hg`cvvlQ|lzB1ZKS{;-xb5|@Z)F^WsCH={K zYoS@r%6%77-U+4r$(K?mUGCFYqzGNcDDx?D{XXoti7}Yz;pD1$|Gp2`dq=pgC)ck+ zuJPcS6LS5k57(!8myT4vCLTC45NQf~)U#zNKJcOawo z16b$#%@ZJvQm=r-ry)^g>}QZ332BGYMw)*i_4l>PKuxa4!7&Is(amyK`99YuX!tt0 zi`?#OUMII0-?!|fF{0m{+T%N*!=sdXviZXWFknOCN09gwB-V+NaA5>;}|#^9fq{yKOBO@&E`tTpq!^6W5`h) z8{Lctg(x-QbCRtUk;j6J-TZ7G=1tIbgYF&Bjb=4P{;u+tH?vHUziW}&>n08d`iItaSL3U= zF-07I>CkCRqz79>J=pd@Dka|xsgvR3+Ds3&$RVGznI3Eb>TIS5TjWDc>lkyq5&5Hr zcaB+LL_!a?@t?9}wdNLxrT7;i`fQ434MuAH3Yb(k$S}H*d^Y}Dn*qd)XyTPDZH1J6 zB~mElO9*%j0wxuMYBeG{@!u2#CRYZ$#>8cdu{a$qW4#PC6p$T#WX=gwmMLD zQ=fb{h5627zN^ilU?AgiFkKijt@fE@Qnr26IeOj6Tfn1f9i!K6-e%Zq6s=Yb*Qoea z#`s;Vi}tWC_Cow?q4@SbI<@;cHPh~I`)M6@cVmrhpP-aGjqx2UFU8==`K;TWo$m8p)0@eJA8_f77R=^DNE%;(n=-Uu@W+-q*9}Q>t0<{ACG+#r1 z7Tsw~Jefsqm434yLMhlCZx}xfg|_w)+Ug5cy{3c(eQ7boj5DtUJH@m>M6xC*=(s*2 z#)W#ZDf~2FuknGviBD3X`UdWRKnm`F(50bJeRS>dYp=PFUZVps;}^2NhM5b%PBE83 z#2ujseeMiI3=8$*k*0o{ua`bwqXDMSk<6Mn2eK#=j$|!^QG+-nF6=e?k;i+;qk(>F zNCtN=Ku7-_eLu)-*aA<*TF7bUGU4!_jC4 z=ZSoEGBWnoK`WyT+l{^h(b>z?f$02Ck?^k$L`AvL1}di4(SAk$n*&kNzc>&T{fh%p z(f`GPsOX3TQSm=H5EYkAfF^RZU-2NcxgPCTe8hpM_@5kzijO!DRRj)1zXM+}>PTK_ zv;Gf9`xWetXa9sph}g81@Y4v~T4DtqK!ICJtduBlYl%54fC9IcSlbCefm=&#FVh0I zme{1VK!ICJ><1fw0=Je}f1<#xCDyVAC~#|uT}Zy*G_}}QM9nM_4$p`k*a$RAQB!Om zH49Eti`};hXpE+{#D2RTC^$_mHf0^qSWRnq{vE@vg zplDt!LYcv7YOzgBo1|&&u_V)i)6`-+m^N9{R>$6A8Kx-eh@Ho@sfs#dN0D!uqORCw zOq;G~OKd39W+>Vg`ySI~D(a4nW?FEXn&DhZcudyBU?7ES`>l@w_oanZ=$1tGCI=0D zFNzl){uFzJC~W9mL}5ceLlidjFNwm2{xwn9&~Fok4gCR8*wFQBfWn4;8bwHi4LyQs zVM8BcTG-Hg(6JI>Lw}PfZ0K(hg$;e_a-guGuVPx*&^Hi;4gGzhu%UlQ6gKpO=#Yu9 zq4yJo4gCaB*w9ZCg$+Fu^_~bD`bi9J5(N!i$j6sN(9n3d7&B60x`%cuz%f`; z^3XPPfDVtriuE}LE7s>2tU}Ip;W1dTKF46i`W%B**yk9m*g-swg~wpU`W%B5dm@Fj ze?A852M+oYd;zn+jle*&ZYxYL>|QX?#dyqNa%hc7aJS-Cw^}P|ac`|_rIsod#SN9O z)wbKY~_^Pcytb7tPpc_(WflDwglwHSmq zaU~zZJJqKtC1>WCs4jyx9EBK0wk<&30Cf$~GTH63FuM@CSf{7pS;4b_(+1f#odoy=4jL$JB) z)>4u(hyvvw>lVGb<&5RTq+dSk9j3}K3X~t#t=BPDa%3C@%8%&QB}|op6e#~jw=$`- zjHEz045Ko|*%q?Emuea89f@QuCDPO~jv&%J4NFf>+cXTXs99FB3CXb?s3N?bF2~(B zb_Bmh%m7m$_62^;*g8y$jM&Lo$una=fKtKO7W{@{Q_&sa*c14*VlQK=X2shVLyjK* zbP)$c{C2FqI=(?S9`+l%4~UrC2Sm*610v=M5HXuT#5@H=>}TfQ^(wRzAY$(ByBH)8 zG52o9Do->tQc2|kS~!%uD--r5YZeA*t_MW4=rb+%o`=APF{znJ=#qOcvzY@RB=q zgtG`lESODO8z(V=hy^DoRZLO3V2+|f$ovgN=9#m=+rL17hy|xJqeUQM!D@=5jI2eV z)+oxf2t+J6^N6H{ECLY=)+#Du5r|l@Zn(5wwnZRf!G?uGqk0nMrX{r(-xfAR~>lSvX4|h58=DNtsY*sh`do{71S{DbG9~NqHtmm|zl%ravJO zzsBz|j_&$bl#+vv?ux6$=N&(%l@Lr~!Q~uCiJFO+Mi#*`iD3+KWCD|z@GyziE-2+u zA?u%weN@Ey98K$`WoH4Cm>Aw6GIF6DaSXw?@pCewWagpC1(TQ<@hJrBwF3*iNrW1 zrA$k_f`UVMb;DOA7BPv54hE?UF^P$(qzH?#3V=#TOlMVyNwnzbE-_1yz$6CQZ$!#S z9eqc4iG@2TSX%ZJ1}T`B#Ds@QwCLzAvG{UH3t7}Bv4kxnn8ZAjGK06^hnFin&%7N( ziC!R%?h+eb0%g(BU1B4HEQ6TDgpWzg6HH=(IJ!$blEQ5y3z)>jqb_$AFo_8dlb8ie zV#32DT6A=m@Gyy1luhDc60?X&Ogwpql$dSN(OqJXYS==Hj_wlAsQH$#=;$u->?3jN zR%X%BU1I<5g>o!9x=S4RUZ@JoS_JBa{&=p#UOkJL#Kg<0gj!J0`4y#e6DTO{VG=Dm zx=XxXCiz+|ViFUFYK5ARMNDGicS=f|wS#r=Fo_l&-6h_>5JL-?M2n8@67Nk#`v5>^ z4aJI|_^=;37MLoFj_wj4^Ns;bqD4n{2_KVKsB^_#SW1Vo@5n8ZAjV_WqG$Ja5v z!F#XQ8&4vsP`?VoIqZ&MVwA`9zA&->I2!wyP)G(M#IYSmn9NDn(Os)YV`ENCVj`)( z4wcKq(OsfkzX<6`SquhB7&A3VOk%>vBqoVTObpi55a1n@mCZ9LxlA10CC2ImmLzYM z(I8=p**6aP#<^r>l9P`}q zm{{tPYm#5-AiG?$H%UxlVwq7Y9lKpm{+xO&H>!ocSWj|FIkNn#Qc-IAUA_arfi zi4`t=pPnQpF|pF6AJ&t^Bqmn5^d3D)Ok$$PrT6JcViFU_U=oAe+)*28KRCK0O>KmR zqdU?xISO5%4LF=wYb*zyBqlMjLBi}NY`w8c8^jEWqdTrMT1kY9<=^|;dJkb^rlakejf(B7Td1UH=s2Jv>Zfyp1dr~Ge1JY;C+0K$rv~s zH;35Or;+~+Jk#j08lla9G1~G2Jt~Iil-ysy5>8sW(f#gkDBGfKgdT8!9>Oc6B!dsWK1xT zF~LN}1QQt(Oe8u4;$o-^p0bb=Pg#PAj0q+(CYZ>WU?O9JiHr#*GA5YFm|!Aff{Ba? zCNd_N$e3UvV}gl{2_`Zon8=u5B4dJyj0q+(CYZ>WU?O9JiHr#*GA5YFm|!Aff{Da; zEr`GsOk_+jk@#W*>W?oopvhu_iHr#*GA5YFm|!Aff{Ba?CNd_N$e3UvV}gl{2_`Zo zn8=u5B4dJyj0q+(CYZ>WU?O9JiHr#*GA5YFm|!Aff{Ba?CNd_N$e3UvV}gl{2_`Zo zn8=u5B4dJyj0q+(CYZ>WU?O9JiHr#*GA5YF7@r$EVuFc`2_`Zon8=u5B4dJyj0q+( zCYZ>WU?O9JiHr#*GA5YFm|!Aff{Ba?CNd_N$e3UvV}gl{2_`Zon8=u5B4dJyj0q+( z_8Ertl9*s3V+s=~s7B{lRHNfLkK@41DsX45i)wUk{TD`->pX5?sshOwh4{%ctMTjT zWAUq=aO4RlSPps$E;x^4l7J2e4rdIU$DM|Myaplr>G)qE&f^BwcS^Fr3kSvbVj#Ql z!a@BMQ7|9(F*Ddi_z@qLgUxS%3G1pBBm>>`VKUKWMsN&yko_(aV-*o3_a77!fro=f zA5u)GV)-9DhN;NGZ_^DPs|d-FU+6Z43p@;el8G2pgFO6*m#l6s@G$&oxg-kk5Z(kq z6o}Wi%AwC8oJHVar3=r)>o5QhD{CkRkN*~dhm{`i(4yD3N)LEwy}1mO2RzIo@UU{Y z%9oo(;9;e*-jo;03x>)D7DnJe&mTYQ$GyM*6rKrk{iqE%qe3L62RB70rlQ2m?IcZxMJW#lRCTtLk_N|E;&s zkX6&f281V)g;+JKrXR-Q$g1u{;Z-x}R2BOQ>rt$tRWqpo{Qg-y#9K9si#h!MS%)zg zt7dcQ#p>OvqP43QQ&Xz&5h_!)L{Sx*`98H>`YR+BtU%4CT7x?KL*5Bc)T($v`b$Z-DwTB8 zqI9cDNe_v1YlxB;5$V=YMGe)=9S~`y!jKp?t(vWrJb_We802uyGg+Kj0QIf9(+~_Y z<;S>WtfAwElfUT)h{*`de;LNmZ&3m3F@5=BeDthKPvnjUg0mF2Xc7Dvvj=uwzO|B; zYwHOaIrui$1>k;diJtfY9?2@%Al6e!DHiwKUJdH)T$w7Z z(6pzKbO2X%69{AHqUxdYA2MndS83XJNHQULA#zurjR-&}tIv@CZCcG}1hSD@h-(`; z=1NL?^%VI(RjVmNz(MLzTt6YlFiDwNJxKn~(Q5uy37`g2TX8)@j;N%}uQud=r&jYS zIA$aDBwYVX4!&6m?7VGT^?MS4L&BQ-5n7J)GjL_06{??=q}|)9={uu6@ft|N((^9_}3=9&|58|rc2O_ZZ+HF9YvX?5*uM^Oxl^m?rAN`&>inK9HQAfyB zJ@q%$Q{Ab5KteW>3UO8Ulj1JlR-GY%t01>#9JHH)#M!vAN}$sMQTNNO)zc+#c&k=Z zg3u{QUyiGWJPnd`WNUSm1ik^!KOu50(l_Bcfjs>r>AS7fnG)EJ`u`7jb|C#qTzofC z{U_1mf^F3wO5kGf{2Za%kiHui??=_oOVW#5tDlm4mjS_etJQERm2k9T<3Zh-B7fRB{TdQYF;4|>B0b^+Q zd|X4wqZ)DFR<{wK+p49Ac1a+85U%QIpgH(JwnqmUsdbTeL-$DN&(V@?Bg2NM8#shqF~)Sa?Y0QQt;UVy1R zOz$`av5V#9?Y>ii27<)XAg9ikW1M&Lhf?P6-mb{Nj*cmk#se#X-HCQ$#inj{$9uUr*Nr}d!mZ(z#c`Lav)G`~pZS6s5YZW9E&iEHHAW$U%z>u&sf)Gg1v4qKOkvUp#1PfWe1>0|YX`|g+n^uMImTH-edOldlI%q7s8T)K5 zo(0n0rnDOU@12@-kgDXoAHL%o6?CHe{jhzt>s;E-;cwFkVwf!D<&>B zAF4X{dnz>1R17{o4P(VnwR=!^Yp1n5auUQ`sOuk}j7El-YKYn9i@7jej7N5l;7JH% zQ*G9zq+aApZ5&74r>JT_2g#Iv5+pxQ$y^?hnAYA?y}Z)i)7)zIYK^zEnxmDZ`yhqV zc0dx(f2yh~A8TlBrN!7ZNv(a7%2`uDSlN|VK?GH>FtP&_M$|2?t#X zL%2|6xKy{eLCbj6ZFMF6bys>N?d2JVR9dfAbr(nVQ+ho_vxr8BAK{CCDow$?-e{#DW zs$13N6km}52hcp}kIx{6qJ9Z6|MbPoOH*XNm$Ax0-voZD-;NB-_$e}N9E4US_$=^K zm8r8*T+Q9>ifG^z2`GQ=IFqqph^9Tn@^GDstaTnSY9&%|E(&{tjR^f7>F?vJ-X_s# zxzTg*);VyieiLG;0MKw%&tstltg{y+qjSasPU`F9!8)}us}_T8n$&j@*vLKxtW~S9 z!UtOPF`ya05^-Pq*<0KS;F$_9kpgv?W5|Z>zL#q;w%9tmn~LAK8(J-{a{#j~l8M}k`0a17wA)p~$W zYKmudACCmJwkX@DOAqjgPw{m1@kmf>yMXNj_k?_IR6Gm%cqFK`jb`29o{&$Uif4Ks zj|8>0d$2xa!2=46J<9y!CQ zcqFJ*?ZPnAyYz#Y0h|T>C*UO)*u{sWF7?6&LuQRfVcq^W8cbiH??DD;oPP0)uY3Qi;z*Hl>CNyOrs7&Mc)qM9xi*TEYoLpwSYN&35(K6>>Eg~eST!B?OE z8;fiH7Z%t2zhQCB|H9&$|Aoah{~uUf^D_rZi8H^9|G?sA6pm&RKeL_DhsDk4!{TQA z2NpM@4~wf%j(ForJXB^M9xB*}hYI%Lp@M>k3K9<$Qh2D48N6#Qnl^k#5S#klRSXgj z6}+3Vn$?bNsFVFJ$)R;9j z3Of%}&cplGEDuu^^evA72yhST+ zhfKj##j3ABn)rE(3#KYpFjeuIC`Lk*#{T#)201c;sfv4;s^~5#{1A&;TxQD5V5>plT zFjY}vs^T7|DoRXM+{08wiK&Wvn5rl-RdEkf6(y!B?qRB;-B_UF<5YQN_!cD!4(ahJ z|DZ0!RK+_Oq%Oo%#ix=YrYcHIReUw~)cVtf6~5lS za5~~t%bvm@1rt*h_b^paVyfbc=SW&8N`2x>*fN5t$~Gy}>cS5%S9rF$5=60{E10VI zhU-8@iK&WjWRPVLQx*3yRoQ~6$`wpi{E@$*A@hK#ia+Xd=K)g{_b^p?z*NOOOjVSa zsEffh^dPEn5q(D zs^XIcy=0Wvmk?7G_c2u^#8kyQ3_^e4I<$nCs`zw6tpu$l#8kz7OjQXnRq>f_YI_MW zRq%u74J2s3-kOEPLlW*gA;?8suE(V;^!C~ z^Tbq@5K|RD*Z3LOiK!}KA@LnXF4%~vDmg^{i;O*z4op?H$+4|^gX8O%-r&90>y7h~ zl&|MPCl0$~m>A_T?G`5XA4g*!6AF0=5wa!W2$MO91)v?AA?V{SazSFM;z|8x)TLA~ zRq=9t2GUDpnH?x$%+wNMs^UJTs)U%T_+VWP0p3Ab*=&=NO9fLEAFE$aF~n5GTO~{} z#8kz{xnyPuF;($COcf2E+Fi)zYMVS5Utqj}l1qrGiu;(V5@M?2oo;`bCB#(47YZi~ zk0r!Z#ZNJ~mIG5&QqQjUF;ykRRK5Bh5@M?2OAIxEx=V89qZTzZdQLQGY>$EEk_CB#(4kHJ(~+#pgLX}=;(Xlf&LP|=xC zO6USDc{sk-s0Lj^OjUe?gxO8RRK+(MV~|8lmBrPJgybvHEC>C>+2PV#fM#(El=5g7QKYOAygp#qu6H=uBZsmf`eC|Pn$ zyY>o%YzJMh*~eh2?BV=4G18mvXS!gj?CqGjKn)O6Ww+dbc+%?EYi4e$j6s1RL_s<>3052HzP2T?p`Ngiz>xq}}UDiWo>xfP1aj_xB> zsi@p2kp;O`EDR25^MDY@9ioyF(C1!^Y4ca;uH2zdiGtI?mt*EtZo+?iO*gAqz5>;- ze}FJnATF{OA`Ly#ioAI>WYqN>Gk^3?ndRqT*6ht-M$IenFTeF_#OLNC7|Gx9Il_4a zdE{Trrr<8(W-?u(C^PynbkDz3QRurbP6K(_LzG}caw7kl)p4{M-*@L<$EPPq;1f;$ z^^GFVj0Vu?`8TL0%*b21PRqa1l@{%M0!cSfO`s~GA6)|K7L}GA{S_tt=mimy8=Zsy z`9EGDoQ2BYS;4W$paK^eB+YRnG?KCBB7+KUr8grN8B~~h6hy{d_{lc+;P*KFCH$&= zI&b0d;t%>wT#lB(BtZrh4rh$6TYtkpUJkPV3;zcSGN`cr3rQAaP*Hp@#JI?yqJE07 z_^&!!I*Rz8{$uccOfnJw(|@cYWU8E?n27%=9^I~(i2o@*7XMT1;(sK^rC^c@yZ9gD zlTDIM68XJyNp$f)#-~4&M8W?gI(`izw;RK}tYqjY9CXej{->l`b%PojCCbQzAy52I ziHHA*68}>&OmRk{#Q&6d_@6xDe@Z<3Pag3_YWvH3UDQ*+_hAW&<>^DwJe2@52fC9RF4P`rQdZb^{Q=3L6^LIo6_)lm3r|u zQSo}J7}$Biwn~0vGjIbRwux;~O5WrtIY_@@1rjdR_b!8}6qnPcX|Mb0U7FT*Y9aF4 z?y|JDyG*r@+jcJHww-I!QEhj5TH9Tb)^9yMSv{u`m-fHKix7r1L>V40y-k@KK7Guk8g?fMT)!UHPYMvV()ukKL zT5Y4-YSLvJRm)6Oqv|ZxGVQ9v&h9JvRTjNcpM+vr{Jkjpj6APpR;IVi%Ji05mEJO| zyq1yTSE;&R?v9w#)9b#vPl1!zHH&q8;2}XJ-h=|5`wA>htNUVAKXnr+e7CldY5r`QUpD|I>R_1$kpO;>DG2r#hr4!TZeqvhPPfV}-g7mtd z>?u&C&o~nbOcwj4JD;^WDDkqd#ALVr6}+tnCcE{o;7iBAWVim6UFSo}@h?CE5j(PM zOi^WYW5MV=1F56*-KZohdJ5#51zsgbx$;%6F@2gnb{2BgiJQCa$i>{3BIi^;XPuW* zO0V}y|7{oYHIR*NlCsSsvS^LkjM$Xk11XgDC?sv7B;ige?jCIjAvZ=k8;d z3Ar)E_=HLhmSb}+)jjx2+*}L~ax?S<&G=e1)Rv*MHN%J8r1+UU{c3$aG@vH2NoX;= z?3W3mU(Gjw#6VQ@GkN+3oiwqHWFHAu#kRp?(>lh1Uz=8g=2UiqH#R6c!SjXxM>|38 zf7uCg|8I7J-2bu@{!wJE<$n1`k%i#|rUt(JqsT;fILREBEDO6|{!yupmURaf5`6h502L$K z^DBDMrBS*L$*)u_S~QIDnqQ?TGfLMX`9l;HiqdsR{!m3lqI4aSpHftIl&(Yas}+?S zrR$LV8buXG?_Un8R#Ay4U5DfkQ&d^BX)!2iK0JR%FJivoDyyZ2g zMb$>>IwZeQQT0)}4#^*(sHP}ghvYXYYE+c2L-Lyy)f%Piko=K~YKzWbT8pCEqjVjT zKT1(kqjVjTKUz^UqjVjTKSoh=qI4aSKUPumqjVjT->Rt2C|!r-k5km5C|!r-k5^Pz z^n9jGP*iu6u0!(M6x9=@>yZ43idqw;>yZ3Oidr9~>yZ4(it3Hhbx3}@qPA$_Iwb%2 z2id1(1r^@~(5I30*!BB;T1Lw6Q)?wCzfZ5hUaY|H(-+o&^855NQhuLa-2=++)9Gh} z^7>RWf4vUmu=7!N#4Oy-C+S%GYOE&bI-D*U{2Ekj79-A65&4Yx9%UDvFA-)ABd*zq zhzlel5NE`C>`n_Wln8ta3lZH=zHo;`#5l9GxLLUE2PU3(g81pjk3SV&%w)|hhDwE( zP!*{3JdJ>{T@w&>fXSwOQwlGir`1CVt+rsFN7%m=zN8}fk*nB; z%<{5|kZN6#iHKKJ1V3^W+s`ZqRRlkB6x@O6o> zGRcvJn^fT;l_diatmkuQp$^$MnO;5LV6tXjjC*F`?^wUc_M(c8AiDoGbWV}q{kPy| zQ{;F53wQ@m5Jmo!{sT+*r}ST`r$41HA>~i$4_UfDr5{9V7Wq^9K9=B5>EE*@ z{3(4r##fO)rELt5B7aH;&I096=_b~}pVIUSUgS?{K6n-RQ<}H?B7aH;SO{3(42slF+lfvHk-Ja6$iW@*VD^r^k03!QC?*AM&1a@?KWocIKvNS7q*&HRaUF&bI zgFNN#@k(e~${)mDi+{ypOWuL(5VV_=x&6zz7zXl|60E!WO!1PnV)8FjE?|?od_;D4B$U(;<<<%>Z zCPr{ajNrv$1b1q_K(v@@onZ`e;KB&*q#40IN*TdDN*TdDDmwuqxHJ5)$jF5*mm!qD z9X}c-i%f2eH8FxaBlzJKF@ig3MsO$12=1gA!JRZCxRYiCchZdDPMQ(iNi%{wz7hPm zSD;x)ccvVoE;NEW9Sm~J(g^NMCFL8zo$0KKZv=N{DH2BTe0J-{;FUTiwc{>E|6Zj# z3x`C#mOX_*3U0$bz)3TLJBx=&nlgerOV~1E1n+NBX8t&&@^XduHz$KA*Nepn?rc~K zN{rynMh001jo{8%9DZCW`->60_yZGeiJeDY!;@tKMsVj*mpcI?xbv9HoPZJBNi%{w zX-06zGlC~*1b3c1UP@F(a3{?O?mVNWqcVa!&z_V`ZIlt**}qLFWdwH)+#!@Qf;%tp zT__xjBxnS8UREX4f`ZPkD4m-?LFqIjxbyn6l1~}IokRa4)Pw|$;Lh)q6lDZ=(v0BF z+xz8?qKx3qdw)jzct&vN!xPZ4Fye_3-1(R{CC>=%_(t#&oi`QcE0rHvH%m!NW9y zI}?m)ay!Wl(+KYPM({9=;Lc=YsifA23t5nF1P{{)?sOO%Bz07nMsR1kp;m&{Fpc1j zZv+q12=2^uQ`^I=t24{kEP1DfxlB2}5j;#IxHH#aTcAn9G=e+51|1ThO~afd&K83c zgGTT$jo{8X2FE;&;9(lUopX&Vz)mB0m_~4Chw*1L9gW~&8o`~5j2k5#MsO^KXk*nI z9AC%u25-$?Z!AJmiT)adbJ!ij#3+yHLSbV6aWwWZp^$qJAv+e1FqxBB0NTO%iAQ7q zL?gJ9)O%64fno%A%Jre>*f5RY&OixcriPzkllVsPFpc2OU|kIX-e6hT{w5_46eGAZ zR$oUkG=e*=5~dg$!JTm~nHi=L-03rd=i}j7J0ICxZ9@m01;#J%W;#qGxZ@ka!!&|B zoo;`bVH&}mg~AE*UYJI3=M;l$IUd5p_3V1z2p*;p-0_XzVH&}m#YU41=J{b7!JQ?B znn2xQ8o`~VF1aR5Be>J$lD%OX!JTEsGkkXr1X7qraA&#ky3iNvVH&}mJ|lRTMsTNF zveO72rV-p(;nMf%VH&}ml`j3T9;Ol8S>@7u^e~O!PLE6P)5A1^JI5Ho^SOVdHqw4Y zn$Xln=%AuM^5_CBbl6#I@GCxH8o`|n5@t8i2<~h&ie&=yYWZBvNQj&gE#E;uadx=$ zpu^6IGNlI-JmZ{Uunz~*2=1I^usl`rLN7<5Hb9Kv{Y^$y=$z3qbTNchAl%>Nq^{68 zqr8EBjl`de-+Yd;yAhDm4Xu(!aObGOg-h2fX#{t^H~t}1{s|Ct5WH1dkRLl6)X0u(FURVvBzhTl|~Y;@`v; z|0cHhH?hUPi7oz3Z1Hbmi+>Ya{F~U~-^A{RF*4ZxiX+7q|0cHhH?hUPi7oz3Z1Hbm zi+>Ya{F~U~-^3RGCbsxDvBkfME&fgHzhEV4u*JWLE&fex@o!?6V#R5;EAczhuE%eS zE&fgHTM-^@-;Lifw)i)(#lMNY4>99x@o!>_e-rx?#I)Js-^3RGCbsxDvBkfME&fex z@o!>(fYq?W7XK#pKMY4ik_cgi+>Ya{F~TUAZE6G1Ab4icj0%AE&fex@o!@9 zL(GY`_&2e|zlkmWO>FURVvBzhTl|~Y;@`w3#OzdC{F~U~-^3E`gB*#pR zK90lezaSc^Rt`U;pY#CJFU5$(P+o(vX{`4n(Q^OD-)#H0c*mpVzDApL0-Ukx3Av-0YYeNe0P7L!7OM&1>Qai#$*jdxyl)9KJ1UKS0cLVlwiJ}yaBz38x zTpUU2GDS;-8;Fcg@YCP?7k(@BNPn!$R7)PNwfw_~ zEkInAmcgXpnUGO4oH4qdUypyhs*rso{tpe#!)>spzEYBdTd;oA#-D{S+;srXg8wSA~b)ys&it?Re-DpKAFh`vT_rM%=BHaUX)TMzr>c*+j zp}-tHjODsXnLsQ@@ldbTwX@=Ep}(IE>UgDVc9gzW>ZT}# z6oRC#;}KE4Fj{sd(x%=iR8e&ET2Rvz)n7GOKBP-qCbi%StW4RTusrlUB5XoeU7tM-lVaeBlr?lb zg#UubYw&#bMCp*AVY=E4n1ZZpn4x+z6s6CehM81=s{*lm4YSl%BwMy34YSo&Bv-Z~ z4Re$f*(yI^i>?T3?UxXAd;=Yq#R$ z|28<`m;?pzTC9d9dnCwM+}T+}^8!feE_}9+&?0+~A#Wje&Z)T{T7gulGiwMg^2w<+ zL>JkE-PHD4z>7e!5a5eyPP`O}6$W=x{KjBTg^;o=?9_(w5S(4*X6>n)un4I`3|0)L z{5nn^dyHX=sIIzsSZ(dGhOEUq7hw?brqSQz8h=#Dv59Fs(823@91u&8*WGLdC09HXWeexR_*t7O5v&M#v`qo z)&qw1xEw^*d&G#0ab#Hpk3szq+5rKV<7zIIXpCgMNx>F%xc&%k!FE!Yb~^isHIas&V$6xKB z?D0GF2R6d92-;~a+tNWBNlACOC5@&McPb^?TdwBRzEicxWYs=DRn+Mzo~yTat75xT zCFHzcrJa`g9JhD-0hP8WHEj*32WdDrcFr6nYtAFjN_(7w?4K3iY30Uysp{eFzP{l>4`*>2rhWFl@- z;@eeqwkQ#+RdvqssuShnuvMjq%W(2Cl_wiNzPJ^x3S;6#aqqfMh`p zr(M$?p&BdL_EVJZGgPjrDpyZR?hDgAHDoZ(aBofWm0)|Ox~nZp$po9l3C22)<%a=t z;8o=&l*STgp|tlNWfYI#vW}fKMa_I4+EYDCNiG`#{5AZqyJ&R8h%6%d?iRC z;;of|aacphJMtU~Ia@yi`6=ga$e4oo7Jk+)=WMU6@zsdSSubUGf{pC|1J;qBGyV*{ z4K(BR<2CIPKfC{3!SUaaO?_9e8f;`wfpzRFs8=>V7g&f0CM-bY0q{y)k>Hg-lAjCA z{Ufrt+RzS1qA{4f@_MO3(WrB?fN=?E->5FWv7K!m_Q_7 z_Ghy0FNai0{yC)bzS}Rg0Bs>KN0TA89 zd-`}pOu<#}1>Bnn@@f-Ko`)r?Q7ZQBTDSuQUjs6iRiN~Jvzf*>fgC|2FM+_=E&A`l zM%Kk(n@cv{0b;kP@!2_wZ5+GRpF*24g(8pWw;=;FUV%(>GuQI(&5T#WxTmQK_q3;w zd;nMTco4?U-sTbVpEW!V6FYLZ+`{L9gTkJGppPIZC4%l%g0_gDO-SC+CuqGZ2u(S1 zFV^d<=XDFI6!Zy%)K|Jy$a-GD0Xw&}XqS;o^?h#(_orD06t%vEca5wAs(Nd*32##1 z!#XSf>6vgM1fl&p@Q_QPPvyEn zU?J(_&iyc5AU zX9zYk+;P8;o#?P>LPgp34Y;{o$>?{{G&_GuQ?fG zG5DoR&Z*%}A^0bkoLR#gNboE7OUZZv|QUDdI=S{+*wFzn5JVz27Z*Ro#sk@4@HY)GbYCLEaMN zUP<9QMfm#W3*|o;$G$=CC-KQvB(tFBQOJa$UPC_V71DGoawL%MP|V{hd-HwrpSrHY zojdpt9spKja}AciLCkJn%tM|S)oQW0=R@AL|3`Vs=32Kxa@%^aoHm~TZYRWG2_TXek_ z$&@?|Qs<;Rskiu258#j%xl#wne@eZT4RSTUaEoM0J{wX$^rc?y zis`I*V+HuGamo3rLA=L|Ep^<(1+RBgdmGP#_}LIPAJ;Pw)_jeWhtC9`g1}0|uEo{7 zQDWCLuaf_mqHVc7kaL9^jWMuLt2?35z-q6aSGa}rG_jCDNFPd3s(>x1&>vW#vvvK$ zGqAfs(yPe6+0TBqm%Zi?i`wLp-AzA+G!5(_N_$Kc>TSMH{zGb8G3W7erPv-wru2V9 z@>9O#<(}lGXOQa<(tnSu`H&}K>VzARCd+R#(fL!S2J*$pR%z~%5scRb7k3rj`;5E1wpy1{U z5y1!RrkMylfY?WIHFryFck@E|k5(F+jkPY=qU*ms9VbS>G8dZH)q0w@xCJQ9TYSy= z&L}uae^&N)?uZ%VYyJ&2ADgauYr5v+e9b40*0jSY{O`DI6x=)y5u*7>G;b4BYNh70 zrLDW0C(D0oem6Tgg*HbG% z?|`CfQ1C`vFH!R!dYbP<^FEH)y||k1cH8_`zs(PAMk%FOsCv-mV7VWf--R8ZT0=_H zG%xiuSED8ACc2|#fJ?fg#e0F_j+XLt%^hEJ6N(-|;osuA2n9Fid78h^Hit^B)chN_ z&Hv=L`31On2X$SaiHy|#Eoi=|&eL2?Av_t#IM;p6WwaRSZEpIS%V^1PNmujCbj^dl z<{T}XQ1EtK<4|zlXc>T%rxAMqS97z}r@OgY{$rqwT)}(cU-g5l@VRzyWX!-WAFl#i zNQexvf8m6ECXPnEW& zk)z~Wl&YcBzfxm=lq^BYc*IVj#+zJ?SNj?t;0%9XZ$w^dJq#MZ=4<@^u^NBiYTUwO z!@&;~by7^rCUg49Tr0Wf%RUC zzoqo=Y2o|Wpi6Z(?LzGcYk{@zM#cENE8ME3e3UrQ6| zQr%7ak^4JjFe&m6uE;~a$a>tGf(P`6z(KK(K;#R)NO!B<({j>kaJ`@k=x+KWavucq zo4A?-GOc@?zwt#rLgxGRwJYFa6dWHw3tvbCA5=rFz2*DU zLH$gnO=;l^iQvx_HMxZ^B!UkqYLdJF3I0OmYg1kPh$>)9Y7wP8s@~FcHpZdmQ_yH1 zu1yW-&N8L9)_5Lz>?_2Y(DfFk+#+4Lrui!Qzg}xR8G#CGQk6S-m zL}aoCvMv`4Mj0yAZQYcX_J;% z-`woBh&J*8JSPON)qmTK?|*}1Ig0zvFYa2eIN6L}rwUlr!Y`EvU25ehe(yE-L$A0; zAo(bSWwN-J+~S`0i@TL;(-rzn;9!wgqqrF(yr#LrD^4C1T&lb2E#!V2%zJS)|5=G@ z{#5?6!S37ykvsG=kV>&nLFDbe$Q_je(q7v z)So^L?^M9?1w>xf{1GM>~1Ma@@Z z_bj);Qnzsjakfg^oVtP_6_&VFN2M&e*xRSe74bE!6Vl!16!m109eRcIvcJhu&_vbXEge3Z&O;0 zekEAQIt6UU`)tani$W*T@vJ%KQgDzHUU(<1gYw~~3_ZY=ZZaSDKvC>up1yL!+N5C^ zx#0@1@xG?mDvn`OVQtdsWP8rg1H3^hw&%o#rlhH`Ht7SbSmDRP#yhQId;AzS71ky_ zfkqGS1{+7KV%vQTn+j{~N6!Y^yRv`=IO30&TD;3jXzeGhMdCRsk&p2z@f=BvQ(e+S(}k~mmc7bN+sOYCqRN)$5!mMLpSRIZU_|5&3!x))H(uK z14CEo0p9Bs&sBXq64cu7!a^LnOew;fwc@*sd|Jnz%}BgZ5Ae}eC0y7iK!RGwee6xR zC+35(;t@NMYAy+C?U%E?H>g7R$fo!~A;4T9%=7W%d83&z!S7&}EX+J-c zOCb}zBpXe74m04IjZ822nWRDeOfJ={jUAN@xXvf0PM0mrxfQvNAXg3D&?AA(jci)` zP*{KZx$cx{Sf5IF%KZ+MAYJRAb*CTPDbqSJjdqQG%BAx3Nx1;J{8@)J6n-k+c#H(Y z$L~k6Du_?8l%WW%b2x5=`nyQf^{vXC!lBXs=}sY_XXZqB%gn;K7=mfb^O4zz2^bl# z8%XHPKtl68CK$oDm|$iQv2QvEhh|{KKuqvy6aPXP6Oa%H1%Cy~Y=y*dVI9)NF+$ks zU~mv}g=@PI%(w|ZnRJ1WTX!ddz{2t0eq15e$j~xSJG@23&pTdZrk3%d7x`x|60$z< zA~Vs3l3mv_{_aHS@Q4!0`0hLlzwiO{&t*BfpmsE|S3atdGT16!+htx1dm03ecN#${N!n&;h)Nqwn zVOT0dgiXhqGm7BX#&qUKn6aZqCwHQ#!boUMxLv`U#aPEm`j!KB73 zs>`Y+H9=9`Rx_zKMfF%8QOZO`t+B>4ZIYtaTfb-8WJUE_9ZYLi)E4V3Qpc0xp%803 z$tjAwK)2}L%<53&#kzF^n{+ChG*EuIZk^2@74Tu890TGKlG7FQwYqg9$r*~gLAUNE zIa86h=+-WZn#FMyD8Eg&HnSsVtJI(A))BUs9Ka2fKdf8y=w;1OsgLW{UK`|GMefn9 zck@BcQ{-OVdV&R=sK|Y~)yqLKUy;wDAWB}K$QO0%W2T;@$b-67Pc=?fybgPF2Emon;|w zLXlS)))UOT^3T$P*BaKJD0!7iy}_{dF||jf-eOpF95<({)Y}Z}6{eoSl?3O34C_rw zUaeC18rJ`kT%*W+hQ;qiS!XKpIm61JsI`iG(Xet!u2bYe!zw4aUXh0k>z5=qDDq9i zI!bb*BHuBrpRpItQsn!FbuWi#uOdG-tSKz_Y(;)%SZA^&H!1Qh^&3JejvE@`8ZX!qjsWd2ztn&R#fA zkvI=*enna5mtizyRb-X$fPux=oLNb-aOM0C+ncO1MVZz*+@Z4uC@K`;-7D)jMMbP7 zMMx`GRJQdhs*vRr z<-0NcncDae@1y1S>DDZ?WJK2XKsgo%j_^nmZ;^p=EDmSmJ{pnLJy4G6&k-IONtFWS znEul{LCX3bD1TFrtfBg{z~kVgZk^0jS>bVRQn!|plqEh;j_J?A6B+AI|96-wi+rFQ z)Bknsiz2eh2g))1FJY=I^MP_q|4iyE>wKUbhuebeCANj!mP@q^_KrldmJ(@d8Mh;B zo(9W#q>U%<N|RKmIp8pQ7T7MU?x)Ta|- z_cEI}m54p~G*Yt7e&SRj$6Sj9*QtcfaE^Jl{9Ztf*CCia{W^)b8Na!Gr||n#EJuW# z!q2Jx34_y7Jv)Cj^5w}Xe7j}QSO@U30o^{9|VSM(kgu|7wg zJSsZ^T$eq3u*k@Tich1w;A8k1fhcJW6e_3i?GaD2P`aYGy;JzsJEXi*_|{akz3rXC zx9E!A_DPh zqPL%DlZK60QAoFcsi;_lr||73>4*SFKrFhVx4l#N7G2TX&#+N&UcsU(di&X(nCv)( zZ_yRKz5h|69P9fXpboq(RE1?N0`+DSZ27RYEN&==_S(xd{}M_D=@J``dbVYB!{gO<EVfzE4Jqc?#e5PvIBeKv5Hn3vmC! z94O`~eA_>TU(8eZ_GIHGNv$s~WI_HZ{9>NMw>ymcBz06VPvP6s4Yd-q7V{Lo?VrLg z<|%v}pj4^t#e|63vy6u%@6=*(7UG}6FXkzHd#=H@K$8~p6u#YS&}S=7;TLm~*jo%v z44%R-<|%yp9D`$?r|^q;3g150*avo=!Y}42e0zscf%f4k{Nh98zsNW!>0f4`p*gly zZ*Y7a(;M^_mVBdI@#x+LTjzFn>_MS8I;vjZiJnOe+K__luvzxWyU+hAP{0iIK4WphkQPRJ>I zd#rvB#qboq-6~;<**6a4IG4;U<|%v|U&@41IDMl98Tci#x!RT-v=jm!1)))`En5XdV4H9NI@f5zj(U^@S zx}pzqH6tN%O0=MZ#^da8>C(gYi87^=TsQ194EAA?r||8w43?)#zShf8sO8Ej{2Y@} zWjbfH3|$PN+Yrt%Ic>{y&M0r7ACUOR@f+kQdmjNQ-OvW`6h2NpbK%nU0X&6oe{WO^ z6}%KJ5X3{qamp2aUgLMj=(?iM8*u?t!+E(7c=KyWWb)*Ee%k=#a8J(XPig~^V@|U|KdT+QdV6W75*;e3x%z7JbB(;Rp=;+(5bLyYsrNl12XSdIpDqFA^B z&XGmnaSE|p%y5=q3z?~zlfi0MuSKr%DHxxoIsGL{7`BBHcHylR4#stXFlRrE_#l@n z`Zz${S~0Q;YTg8)>jTZ?a2{`WCQWd z8SeZqe(RmT;J3l~H+~x(IhgLq!E{FsraN*l-I0UojvP#PTL6K1R%TZouyejvP#P5d#scjREYqYkF$J%S+`DU4r^p%%f((!y*GeeUX(BcZULqD(x- zYK1u$Kopi{&3v9|Hiu^>NUi9mg~){Y$aB+0?zw3h*uMdbOmNpdf6=W!M~r)Jx_|0D z5E(DyC&&C4zh(O0@LR+(i@2@Pf^UJ=FqV(gGMFUp`TGxN3|_64;2*E!ki8uL2Z?+B z{`EPMEbjS><3CWE@!WKAKSkutUyRw8(X zC5dtfxTHhJyMR171YA0FE5Z>T0xqp~)s7I>Ra&Dc(;}*(v{q3ei>TewVTy`aZ!QB> zr>N`*4*{1BS5$6% zn=WW(1ipDePYgbXL^vaGq@R|k(AQz%1A-EbBY*dt0E9o}RMI_Qa4ds76p>?gAXk1D=i*(TGTND=&y(e2R}rFc=NT`x~?GYveiRV^~e<*DOR9e2v_b z^&Vu|{XJP)V>StOhEamiuY&D#iHsn?{}Fyhw}@-=1amVdBe>6SbE+@)4h7;%tI)FdeYx55>-ulR86LO zd1Y+$eL21Mb~d{E<#bQd7)at1z8Ynt(VU$0hM&USadobE|l2}#%blJe6f z6{bn*`*Qk_*iuMRUrzS~T@OLOhoDLs_}{s86EK*0)b0AA9QNOH)B=yDHSWO-Ht+I> z!PAfsN1~E&SDJ*~-r#9Was1xqXZi}6+WbtnrDeL^&vZI7-Q;KLj{(VftV(j1mL8?+ zEncP}7gN18X_IUcGXC1nxF)T%wO%Fh653n`CaL6*KW%}O6=_n|LP|!dSNw`JDXWf^ z(&I}xNGa+lqu1cKLQ01(Wl5Tpu4APv^Q1KLgYIUh-wX#J;YwdZrz@dS=9x=%t42A+ zZeyTEc3gFtf+Z8dC z)&}DqMRkwpD)UOjRv20RWw~hsQV0~(n$JCkXXK?4y$Bcte$d^x)h`@SvPOQ;-B{sA zO@}^PeSN$>(MGLW47O=$_1y&4##MMRZnXH>??T+K{Om1m1++$f(A}u>*2#16s#qvKqZl#`l;OS0qHlC%en4#w$}I=S`QzL*4)3U1=vUXnI@=A zJ<_B41h*Zv(Ztp1W4t_Qj4^~S1YG#SxyV13@P&YaFSHWA5CD8(9J?c+pbOf3wy1WX z5u-uD68^GP!4h`Q1S~-T5ds7v7(>`kh5{lO3WyNs#4f~WZfAl5BH;Vc1R?|oL@;J7 zW`Y7D7z&7BxIhH;nQ5f$$G$eO3t|ElKLB@zyuT0Jg9x+w0z?GHV;`Ln+{hq}4w*w| zFi4|A=2{8T=#aUS44E`K1efXOARII^@A?P+hiG)j-2EbhG&*G7%~&nW$^_9k7MW>u z$lNs)WQ0bC%sVL!&kzwB9Ww8EQz%mlB%w>@z04LEfVj*DZ^LiY4A4dp66cLEu@Qu7 z_%*%=UtWcVF$h_4*a$*(O0XH(g^V5*iqJ;jQIW{!P{E_JHWm-z%(`9-49kb)k(Q)WIMd^E>J?l@wo7 zMQ9@kO=neTBZ$yO5Spb(*a*Vok+2)QQpcp$PuU1U3%{mdY1va4q+r?zLZ>Pf%m{4+ zp~Zibv`|F!S;CeP8$q^7nb_20P~mcgXPa3da`c$k2tpegK}BdI2yJALWza?tI?F8s z{lM`P6B|M3k?YZ6ao7k#kGkA(*a$+8xy*6c2tto5A{3#GAoN5da^qEFgf@cEFBKJw z(?$?_Qhj7PJ3<>lXphQQ7@>_I^b8vXk24Y42tv=+qTa9(M7V1fiEz3ALc0^D9c{CQwlNpek=vgf@cE>pzivtr6M?LWh1X)Py)~ z1fkz4DQywj2tvPC`KCr_BM7~Huheg5gf@cEdyk-f@IpI68$sy95mJZw5!whsA9K>d zMi8NmAoPin0*5*JZylXG|5e^Euf7c zG}#y{sr3c45rmF+Q=1BCBM5aEvm|v?0c`}K>4sVfS_^0+2+eSr+X`qS2+ed;+Y4wT z2+cB1l)O_5Xd?*CahYcp&_)pY|JZx;FsZ6*Z}^;3hwiFVT}5?uS9f)F)75YaD4M3b zp`jUMRH7{)G>D1@5VTQ51VpAN3eH0`5fh_PV@!y~DOZy?MsH%GMz0t#i5iE*ye5u` zamr+FyypA;*4pP(6>{JA{l4${hCl4*=~H{{z4qGkK4+mxy4~Tzpp2lAGJ@!t4(B{&1dWstM9+3k0y<>`jg%2YFK~W_8c;^iNEt!<9t2 zLq?Et3rNDI-vq=A!zq`uUB~ALz-8kjpc$Xhg4&B`oqZ2RjMK3Ul~KV^t`sEZ<18&9 zp{NTGAv-l^o~%`D3|x6X4q$A;lpR2Ic`C*>E3$*AZ%5J2M%g5WOBgG-k+Os62%80Q zE>Lz59ck;-pc`9uLdqrOtjG?cGwcN>#?*sh0{aX{78RdYq#RYjq=K2hrmVxS^446B z5MAYb9R+YxZlvrWdV+I@z!%w#lpRD*l#;0^(Rd_R&}zv}*+C;^2ho!Ze7oI9*+F!T zf$y>#DLaUsY~Tm&#($!FqiYTPh}}rpLG%do9wqU#)v zVKZe1(X9^4(~>6#IkHxZ$PQ92qlVaA=`wXOg+7BY{K}&OLu{_JV4|;=_+@y;ILppQ zKuUM4R>}^dA3NO8Y`c}RgXq7U2Ly`DL?vR`0;&*Mj^2tDrZK2Gn@1v;r(C^_I-A}& zY7js>p9&7~`MBQZtd-4#-O>M52p8 z8>JA5*(p#){H^#&9NdE^+KgwNtfct})yu-a5=5*v+V4&D6%lLOG49AGAc*oP8Ax`~ z)3R+3a~peJL@)ay8Sq6i;EQCy7s-Gxk^wl)!8_U)$$(GV)jm4Hit?b;iuocL@I^A< zcVPk4_#zqbMKa)vWWX26fG?5(UnB#*NCte74EQ1$@I^ASGT@73z!%AYFOmUYBm=%k27HkW z_#zqbMKa)vWWX26fG?5(UnB$AvT1ZnBm=%k27HkW_#zqbMKa*C*C+cT8Sq6i;EQCy zzaH_^e31SGT=Xg_*uS427HkW_#zqbMKa)vWWX26fG?5(UnB#*NCte74EQ1$ z@I^AS zGT@73z!%AYFOmUYBm=%k27HkW_$nD_3{LRF4F}Y>=*;X4Z zq7J_PFPM{<=!XJGjTwsMd@UX+cO;%e>`8dmbE(zyW5kNJ06qx+L#;fM+Gr6q)x#JR zumV5)AByZJ;J465i>RsbM@VuTEuz*ArrZuS$)tpYLrd{r{G@%%nL{R^6d7E#kP z6o|1Fbhtd!YUBBR-L&s363_4JrZW{}d469vLjlRbRV5A1TWvJrX}|WGWRt`+7Mmmv zw%Xd+Nv}JIL2qmWnfkfy0FrWkpXs2d*}*)&&vcSHHrv5Gzt40j^E%|8~h!K zuj?WY*zGr^HoMjqdB7e(tBX8fx8KsVfl-HB_PZM1K5CI=zo+4CScQYpJ=XUog}n92 zJCwKn<&yuI%70|E?C_sd`H%c}D*urM{1*7{RsP+Q%D-Du`FHnG`L7vwBd9>Or7ZUl z0HWttRnqgTD(U%EiJo7zVYv%Hj)LV*Vr|5f<^DaQV#;ze7OLxbv?3HIasW+Jnl5_{lIYG)j5eY`mua@DIyN;-Q0Y>Ma zClQz6nJ#Jg#fqOL22U8g&dV7j_Z}AwzdGUG<6SAND)F-uAIl)BRS)hx9%%R_cB2jf zq<(e+Nd4>tP^uo>d%UMXXpnpVF3R(GQaS=r(hpdq!o9~QewT%kdyh{J`hwhhJkan< zkb92@8h#0K@9{vxFG21-9%%R_$i2q{4Zj4r_jsV;mmv2Z4>bG|m*@9{vxuO8fcJkanwi~KJ~K`e}kO9rgcqPTq3l-sAHf-3eyq$Qi^#4Zj?@_jtca?aPsSk1uri{p|Sja^&9Qp@v_M z+)4(B|%_Z+$R_}R|)L7Uurj@*0v z0;dtt2cp)g!J6KOc*Xttx$Cn8vxbz&k^!RdzdpVYFj$C>?)bPuZ zOOJ;demQdK@s-YUsnL=gx%BvPxc$hyt8?VirN>V;@Pl?v z26C-|AF*@f(&J?sejZ=7tc~@%B;OFrD`1?+S{r!Cd-0=WNw;#}h_7=vhOOk%<69k;rzM{o2a3rMLqZeXlDE#vLcJEmRl_f7 zcx#Vai1OB=bvO7^-WuQRpYqoKFY(r*HJ7?(8K$MtnoAk2IhmN`t!2>|t+|xptzGig zwZdBuD)H8N;jOb2Yi9YWV0k6pdJuVQ(VD9@ytVfU-deQgY7K8KT65`gt+}+(n)AL0 z(#l(lZd{$=t*gje*BRd0V=a`ot|D(;Z+Pn}^49g`x^eYJH%@Ypx0VJQ-ME0amPGQ_ zl4x|}0^VA5<1)fq*9mXkAiQ-wdFzHiH?E$%bwi*VmmqK55a`BB@b)5^XAOgSzGXB@v#y*122BOiL(Wm= zxe;3*#LOqH+eD6+@?-a7Y|_=EdQpY)tMk>P`y}QQSLdrIuVjKstlbU_fAwLfF{bPm zef5I#C1!uO==-oSSHH=3lWQRutw&X@K{pcSVQn)>Ye;x-@8)&} z$%A{hFcz1z@mPhB%t!Lz-fr^8!h?GiJh*pjFA~DLcHV8wCOo)z$H$;j;=%t72>}nz zusCq8c|4C`+D%OO7{CA595^SYKT2|R;GCFQ&((Mo-pKQkeLp~0CUJ7kH!%MAlE}~m zdve}vtV2{egB6rKY!7OQZ+~&%oSeT{lGK57asm53aNwNmzX8QK{>()4187%;1Lx!- z4y)s<1LvgNA9wtN6I;Fp%*A(0+98QAVLc@mE6qN9RXl|HHP}z$*+|lexf?&KxBolF z@_|?$KG%y&=fpxDHD~D3IkD(o1komO>6|!RE2l1<6N?q%m+&u;IpvN9Zc{xkDiji@ zFr&D1POK+6(ul7>)CPsrrE}ucrzA~XIwv+Nq%NHkrzNC6)unS{^F)EvrE_BIQ39z; z=ft+{0;x;q#OYeEHq@vC)WxN9;s~}c1#L+_pFyUfG5F&qo&SAM4$!?Tx zYm|`Sq+DiFOxCFkb2zD$W7Z*E3u1lCFwIa*3)9(xebTi`DR&u?a^liCaTTZ7eq1`I zTuw<0E$S-=PJ`#)2h5cFLp+;H2TrNtH_<*haH{Qm1Zi^Mly2buQZENi>8{zBKyoaS z9?KvnG!C576$efMqz6s`qz6s`l*-`1Dcv(iXz;-4HI(PQh{rLAl0}a~<-jRD@ii98 z1E+Mwfm6ETz$smE;FPX7a7tGkIHfBNoYEBsPU(sRr*wGW)S?GY={cQvy~=@8dM<;U zxjb-6&m$BbIHl*aDdB-rdZB_maN^)j2d=a+Z?))wQ+nC?BupMNy_`W3=7CeX;=n1r zlBbSf=@P6@`Z)HCIdCFP?^-gy`W}Ow!GTjcIB?3~z$ty-5a6>uJa9@^ICf44j-4|+a7sV0TT0Xe zr*y@EQ~F_DlzQNle)KN9B?HIK>Bn9WNDrLSPw)-u_ zq0W1?&XWM4(iI0z>0jn0pB^}+pP@(+2TmCtIHiB3RP?|pU2)))ekq2*3l5ypFV98) z1P4y(-(4wbdf=3Pl`pH{z$qObIAv|VY?!Z69&C5x&3v#Qu?&txQZ18&aV)y&$qsuX z&jY7)c;J-hfm3>>bE#C^&GW!11fzK#IE7$Mo(E3p@W3h01E=&s&bRTh!b>O51E+L& z;FRZqQ~D6+-z9Z?o(E3p@W3h01E=&{XRoAA&GW!1J>SutU}l~NPU-N#DbE9^biYaM z%k#h~z0i49^3Kciz$qObIOTcZls>{?U!Y6#Ja9^HbIup!C3!BA^mc~}g9lD|9yq1X zbU5dE;FRZqQ~GS@4WRSDDbE9^^aajbpz**d&jY9Qh0dQPT@IW$w{E#ahavV72dEk@|51jHma7u@co%1|!O0RUTK&iM=n&*L2`Zz}y(CR!7 zoYKb|a6_I4PU!&yZp-t)DZR=WA_KeA&hx-2eS$Ma;EU`$51i7a1E)L>oYJc$I}e=l zJa9^%WZ>KFJP(}GYYcpso#%m5`eXw?XyIdEcBgUuB!Qx{X{VT4mI7j=Wp6%|bMKS}&c zczT>=5ljdv-LVQha7usdaO1M=0uP+h|8f=zw#3JZ@XkkyA9osAoNLR%?&+wARg(HUS<02c)+(4RyVGZZbnZw9IzKrDVKGt7iZ0l zLwA5>7H7?k70#L)3;M-vi-*L<;VclJ`{E(7aRkX@m1O9wxpCyX0;#j+#-c*%thsTN zLh7u!v7Lp%!)gZ3nj1%JQVZ(y@0io#thup+?0w2TA9x;j(r+MuZl_L5w(BbZc$uuJ zCj)itPu(zo>W2CMQ8&!FY3-b5-#v+|=#15}ibmllH4tg4AJ?NK_l28{pJll( z+#H;Ia%=c8Y9yPjIr(h9{=0}V_k~-=ybNH_Q+TA@SMhAH|B9z_ul#1UycYmlb=+PC zF-cB7TY4B{!)P0R_&*%kef$>XAXqPFp+h^iKo*_hS?JJC9T=S~L%S4GXTd|e z6;fxxL&qwl&Vq-IQz(_;S?JInh3Ydr3mrOMA$1l!bOHitgD#%&r(5V+A(za9X zJB*^9(a>oc)nGq}q?Mj&OSv_i}_24e7b#; zfF1d3aI8CQyS+!i?mWNAhn;D^C*b(}@{0hTWm+^TzZ&yu*bY0MWw}%He`V@Ud$fQv z^OMH|Jlmct;OzW6mjFD+fPMM%aP~XwTzj*m&dZ<32A*f%B4EE&&##ffu<qQrK5OqTNBQF(*z52}yqolQ@Y=Nx?UCEn+n*XH{7`dj$E% zhUuJFW$Bfj0nCLVCa2tfF)RB4dCmZ4{o)vIe*0sbCQPSR>=k|&*E*-uJXFE&W}i{P z=N5c5`sQG-n1~>k-=k?A@*48Z&eUzyJX5vwcO-W!=3~_|9;TAq6hg-`fp4y{I{_WX zSwpR(|2h}Y@e0)^et}tCb%H|K#Asr!QK%*HcVeEbP+MXZX|7YKkf2k&s#AGv%Ojx= zNoA8ln-bo6fVQyYyRP2RF@wb)6XAr4?E3PK4od36^vid2P!BeQ zFWu2WX<*>&EIb{T}F5%xPhCtG7qCPKf~?(vJ^It{h!LG8W})~AL=vrp?+W)^*c#@qEa6R$}Hgr zpnh{med0dUCzhzoI8Kb{xCC{dTt?kz&vYqu7nE7T8=(HTkb2iX)Vo6J+7n~TsP(h1 zBbC~V7r_M(sMUWKTMH_nJuxz*rnyIz<<4{c6e>P8(LP{U2J)SmbMNhvBY&KErmbJ(E*#{7Ra(?{hh48C|T0MqZwdR99uqtb1Ro2R?tW}V@ zLd&&Gxl6TN-0jBTz?O>D`8I^{Rqs0XT_}^~{uyPS8 zQ}Svh_FY44p!;;>d>jAm!?;oY4>h8m`YYsjn~yMmQDU#f0(-aud-?pUI8*u{H6 za_P{Zz3al7Nk^><+bgSeox|12k(6yJNbT3@vd%PPo|eC%)Qq3)M43w+dl8zzrhJ4l zccV;g#?s1WEU#?Fu|YGe&YyDMnh(v&Wt8Q#>|YIAv4gu z9JxQjzs`(9D`&=G!OUov2G2Jj>O1CiHsY^p0q42%@w!GsjzA5*jT&^wRQ{{2Q`sz^ zzuIQ`bb+fxPF)m>J3dSPE&%&GR+NMDI#!i~edB06q3Z7@?^URg~cPHwn!+nokv4Zcjb?-2<_I^|Q)k^gNLv=u3J`b73tgt#C<+|Nz+rKy$ zp2$$pODH5$2nyL*S;#q+g`8Vi$oZ9pTv94zCSPzHZTmPB!h))oW4uv_zHT-es%G2U zXvi$lSKCHY1+!R!)P8*d1mHY<0R&*5E~Sm83bS=7Z8G&;YjysT%NMR{KRO5gQc$Du zs8RFqphhQD*64)F8l6yCqaf8R-xExkX8EozmAR6=0N=KEp-h&$5@qfT%Un`f=8~{X z`3zfP^D`{m{Fj(Q`n6%llnR;6hQadDIuyWyE<+)&g@w$iEM!h)A#*AVnNwNFys(hb z_DU`vSVgkT-~A|M>WHBGrrB~hzsq#Nj38tC>)d%}+Wh=?cCBdt5$pOHc?si9WR14} zz!~3NBKtbXekml|T}gIaCE1=zvXerxV_qiJHd_t^4n~)-YwC{0#o~~1o9ULdT|C$X zuI@3bb)~hL@gC@2gq$bfzx_{KH6v_NpaUAPB0R6?Y+y-^w%rCCmNWyUOc)t-OJmUa zI%rKn{jHwglH7|@V;r%xF#E~K`defjFYo6U0|rJ6&sF`}ut1|^zkFG@%heNTO{gkm z*C6|-hLaHfV~g~3-zZ7>8&5>=CDnZ=%5Z?BvkmezRDr{x&6UTyM;Bq8nqk>zH_`(A9TZ5ZWrbzE5K_5SscauF-(a_5mqMSxT-J|wAmeWPYGh!> zK4h{+q2==Fv0GnJYpvcrY~D5YcAyY-6VMJKnsm@L6|}E0w8zT|zlK$EU=gSHObq*= z&)KVyon&qRi8Ung<~GJ_N5WNTCnn#ZP12D^0*&ZT0=4%o#;>!d17`e(h`S}szAnuE zA<@*PRS{@JFQ5uNR1S^2Dcy_;$zMO>dB1c#6+|O%nvNY$1RUBC`PZYH%+v9i`OIZ3i~N!Vn*vYaEM{1D}qt)S=t7)(`CQB6lg^60O~Z9uJlh= z)a~O3h|?FLto^ZtR9c0Z5A?HK!T)}fXwQU%;um(V?~N8y~GTxNV&#} z6#GxCNV#QJq;QW>tw_1Xiqx|>baAX#rlI3hS@%jTj%66~m$vR#SvT?tW!=bsr>qhmXvkflCrK_Qr30%QPy=!%DRKcy@Dq0@51b9h!@8g zRV8KJ{a=`+TCTY;8!GEo{ddZ`RV8KJeJ{*bDC<_0ly$5Aca(LbqO2>5wy~KwnX}TO zXzTTD!R!)6TW?N>iy`){I!-iio~kOjb@-6>Dim$K`M<^Tg*ZJi5x?F7ng9OO#GMg9 z6^gcAg`%xjp=hg)ngT^zuR_t*D^s+kT5Y|oVv4LXeBcdw1%A?^RvTOR9|+e`tv0r3 zC91#!R61FWRjAd*%G7FkH$UY*i)TYx)M{g=Fr%o|#@3S@X~b86#s-B{tu}V*HleR- zwXux~sakF9G*#(Uwc6O`R|HelYGYe%=~-2)jcpqtkgC668#{vSOS#mI zPPu1+l=i@v5Rx9qY(xl=RI6pV8p(mkaDT{1NN`dvGbtwPRED`1WmI5N9YPCYeakRO z6BT(QOlJ%BN!Kc++-fA@!l2arZe$a^+4%f}B>GT18%uh#H6^{-MCSseiQa5d^k&nd zH=FFD9*SspCdV?!`3b$*WQE>r0IA+=0IA+=0Hx}nH=FEvR%lRfb^}7*DmH=C@`n@!G=x0>H(W%r`< zqIPo5{j3WwYA5G1$f-%a+2lMzq26qAKARHi%_bKr80gLZ2XLj0c`K`Wv&m(ts-S0= zGf2YJn@v{e%_dhiNSf-+CXZv!7`<82^hO|+|Ashp!vQqeY0;ZaZaxZ-=*=d#Fvv1) zA3zyfwV4#+^`V_<(VI=)eQ!0EGW2GX_ZaLt=*=eYHOO_)n@v{e%_b}KW|M*5Y#sGx zlMkqxvFgnxEA(cQ56f%RT+~iJsy4p#qIU8zb`0|C9+I_k|P zpVAV#0in)&wa$|Oq0$w4v&moHD*04zHu((IBcV52N4?qPuat`F%_b}KW|I|qv&olf zk|ofaO;+g5CM)!2lcC;hy-mGY=F7-Kwg;*)WZ0?be%g1bWs-5llAJ6S&%_l=GSr(D zS1ieyPNT;Ps4JEbR97q^sIFL&q28>xVo4t4jFY#9x?)L&db8q+C3%R`C#mX+B^m0? ziYu1nT;~``RaY#@`Ht=c>WU>9>dlHPmSn$4RaY#@h0Y4etFBm*q28>xVo8R2v*L;+ zxy_*u&cGE*a=XKY5xQbYp6PJThpt$XXFD5#9=c*lUf?{3fel@;BrkN%l629V<=ocM z;QT5Z4ZeYc(V$_edeNKZv@1iR-fV!hMvypuoQ)+Uj3%$Vik>WIn5;>oH~T~Y8@<_N z-d={bsVkPGZ`WdA#T83(xP-A%#T833)SDGoEXk3!P66u8vaudlHPmSm_mE3R0Q ztDKurLvFs}iY0l1Lvu^q7sVAzvZOaFu2_;Ky;*U^k}T=XiYu06NpDtMu_Q}+v*L;+ zS<;&oS1ieW^=4Tc=|7`4%i0KR^kyFqV7g*SZgk!QEUs9Rn{{TZd!`^B>66woUG!!PWqPye1CBww>dmG_Z?U2*}9RZ3#59pbw!0#Z?o^Zw+u+q`$my2 zbNykGO|B3(j5!^^pfz};+?{x~+4K;m->WxZs>0VN;Op=Y#~Vx%MY@I_#z2vd4juVF z4B3B#-{GQ2*D#)LAW<{20F8qm0vP~Qq-(5Iz~j#cl2H`tveVzt98{#s&QL%!-x>!? zgUOIIO{3>4P@*DTQ@J8tQ@JADd>~1K!z;woC7X~tIYTpC-k?s;kQIW2BnnsC=Tub&Kq_>EQT+2H9Qs`th zQ$?<2y=~a7X0lr?8>F%Pz@Um;%c=IWz~uH$6}gs;_CE!zX{L%?%W3vdo>=;+W~#`w zY_cZ_Sl>()xt7iLVga+wRFP}hVs93(rI{*nEnDrc2-wz46}gse1}rpFMXu#@_M?(o zY^I7_%jx#V0(LZ0MXqJLP0dWl?{21wT+5kupMc|=sUp{MmTA$X=GB-nEj#SvC3R{u zRpf9?b*_Ljo2eq#a<;u&z}d}Ik!v}}fPKwWk!v~E{+XoCYo>}^%XzlVGZ??$N{fnI z%lNy|9m4sxOkj{-*NZWITPCG2XH`XR68gPfPP5sS`|xa-P!AxsP5O18vOENx=*8q%fWHrYxO3g8UbU>6|%b>6M)U%v(ZCPOAN4R`vt({1SOa*qhJ8+!|`% zbcx+^C;rbn4)Q;c82Qry#xuzC*ObdeUbHVHw(9LsJxg*S$C=DQX@!&J1`3Ie2rHbN z=3m>+^BkvHX7#Ss>L&*#{8**n@7Ew>tPn67+6=}DfkJ^50)+@LQZmR`qO~O?tMoEr9Cf3RX?Yd@y@P3 zZ|$mefHZBkmeh8Hq%DDwgwLS_DUVT7o?{K7k=m&JFLaoh{Xmkx`%&H+Ed>3L}?|Qy@_~_AaJj_D3U}29hO0g>B7OKk$h^r4fWyG5tnWo|(4B<2_#3i) z4ASOv1LbK}gl0q<#1M#>e{SeTk6D9WVG_-VG{_OUm=P(AdmFKEF~^@K8?%kY0GT(f zV>=s*Z*V@$UXHzE6jAVT;Kk6{jqM7#UOl1F3Pn8^o!8i*P>t6I?Z(D23Z=Y@nAWLK zy*J}HKwS!Dz3-d=s9T{HuZhrDh1$GHXj7xq6Fj+hA@lWUTG9KM(0GM9yhlz1G(n+m zZ#Qe!tI&Aw`w-kVPE=@;_uEx~CMh)4JMefwlNFljy~BJ{6q@ZVVA=r+^?Covw5bZs z^OiDgnnL|v6=_aaXt8$^(`G2N#7i@6rb0`-EliuG&llL{I9iq@Sua{|k3T?L{UnF=ajibievc+W)jA{KQ?EB%E z772x8nqC7a9MjA28JO*$=}hR6d+%)kWX81KyJjsQGp1SZNNi$RGo~$;%qeD*IfdPm z@#}hY3bm`Cti74HcF6Qd0NCgQ7ugb*RQhK!wI+LCK{hg z(?oE~%`{V*{w=nymRlHWRdc6(93h!n5i1sL+5IPg-a?ew5|}6QXsn~<)~_OgY>as2 zX}OKrB14hC<&KpI*17d!A~@sL0^3y&77YwXowaVhZ8`NQP<(69HXACjN14vMoLC7$^Oub>XN_2g0FneUH) z9!v{)G%b{0hzFqA-lZ7i{334kFfHU!gFk<`LI-tcnX$oyMm&bX6+ zn`;z_XX`1<=#d9+T~BhP5nlmlgF>$N)+j)yz9eZ;uNh<8x>2DTk9=_JX*ub=lsC5p z(B|0!)qCXJTel7fl=bd!2ej>Cfm*z8VUSx-*Lt;~Mw3B3at+?etw*qZ8Mi1;$|ST0 z{)UkBK-04bF%k$YS0mYJO(fSOA;HPG%%qsCQyJzsQY*)7L%J5k`j%mmCaNr& z=@T0DsO;}iUiI^MEJ2j1Y@4*MtHIs5cKQ!4D*$9!*vIfdtf} zscJuvfO`KR6i7flnyU5#38=T0R00X8w;F}|v$*BJh>c||2l;b4K)|B})St^Brz$0& z{yaiFg!gEw+Mmy+Py*`FRJFfQK}bNWIhs>}D{Txd2l>m+C1L5=Hz!1Cf5;QI9Z+-%hM@Lis76w@cC7^yN z0nNDF5*tMV>fhatTq#IE{d){{3KCF1kbtHj0rdk3s7K2|{{8q;1JxRjrmB73c>$D6 zQ3C2e@C_+3<YWz(Nwkn==acN=yZ?Qas0=AB~Zcp*9Cx{_(-6l z=dA#=rx9-&NI+ARfcj5q3EhBD=e=6zNq|u4KmzLV9pL|Rh~%5;(b1Iu%ou?VN>Kvp z|4OOM_AX!>0tu)`Q`P=UYmpm=Uf#5|fL=Zn{R0W8M^n}Q?>>~YB_173`LFUl;`mEF zI-2rB324^ldw}_x0a1XL^s`7@nMq~dBh zC19oO1B7Oqvzz)Q$xYCH64|7a(UZWGHvaB+iIFAy!U9ON%GT-mAxmRVAe+9YK0F7U|J6HH#)}y7Ry2YW(l)@DFOAjIHw_rmV>If zn-LH?L#%3!16PNEhrQW1QQ}{~vzoKa#uuuT?pVWVISBrYxN+I`a9R%X|K%(YsG46NMc|H5 z%R$3?hX8NZqr_{4|s#KFP)_~Cc05R6#WuK+$SfTPw(cSO^<0E@Hmg0PBO8PUcp;!?0yHKqDV`NDlLsrS~{}l1;itLQWD?RMUj>kRazRMm7$Rb`~&G3 zm+fd2X=!mN{aSn91`k*CSvicd_X2vVSWw9J$cq(+vp{_Ld+)K|Mvy#KREpBl;>ad} zYCNjp7K;j{yhjL)QmEeBg>EmlixX`>n}W2oI9iihP@gC8Z4~);>^Q}aJZMF({ycck z5fp$_bL)K?aTuqWfMZ>hVc7OacT~@8FwRABpH&q1Sw(T5RTTGGMOrIzi{d`3DDJb0 zXq;7DL@!v;VgsJBqPWj07EsT4u?x?d;uJg+MV?G1i~V>GE{glCqPWj04xj?*qPWj0 ziudk4&nk-htfIKjDvJB8A}w4r7u)e{DT@27qPWj0K7yEhaW9^2MRA{1 zd=24Y#rN>^i%sZ~LQ&jj6{|3`BZ{>g;Nm-Y7K{JDb5zkqkF^)YeO6K2XBCGdW=ydg z&(7ijcy<-VeOA%KmN&L2?z4*GKC3A1vx*-8XF~D6@a!#$`>bLe`g>Bb70=1VQFu-% zj>q$W;+OE8TD%_5X~kRcoL&_7S;hMio>_bZ&sjxrpH&q1S;f~7GrRa6o}Vd-`>dk4 z&nk-htfIKjDpECJPLZt4+~V7K&MW>M&%=u1KC76(Oj}SC_gO`8pH;jJF^h^<<9T>d z+-DWVeOB>)#2i_C1ka<2;y$bRBEm-(#eG&$+-DWVeO6K2XBEYLR#Dt%6~%p4QQT)0 z-$XARSNt=c#~0OomdNMZuOTy!z2PP7e(gp+FB5YeW}xg1Mn2zu{c^+@_gV2Vp9e7L z3_LRKE<6kNH}O>NO1P)$3jluy|0AqHOcMEgyoWK^e4fA$|3@JE)A$`F^7;7qA4#&v z=SL6Tqcx*^esrw@)%=NIhGWUleOAZx4>bqn^Bpr3kgbf%07w)s)l8#%Wh0-jna&LY z01e&L%uqmb91A3Au#wNFURxm9ByoF?Xyo&$*Vjs7!M+l|!WyC}7b7eVwZ_c73Bg8@ z&v$mvQb&sN`OZ$3hixcD`Fv-WLaz6n0Zi&{g`yq}33QHCsK%oifzELXrBam7clIb$ zpQ3!ebG$-XIn?N!z``h>&$z6D$mct!_9D`@Gw!vFqI|w{nnp!v!lo;`80l)lrfZ%3 zwJa7d&jz~I+vadUOxSd7kj7%C6caXGr`qjJvQ>%+o34#^zkq7Ort36&i-2mvrfZXZ znSg4-rfai(i-2mvrfZA+gn(+orfaMHM*-D@P1iO9stKE}&)K;g%T*ILU8mcJ3#cY+ zy0+Wf1XL3?U1!=~6Hraqbe&~dq$X^-cG&kxs+zFr+G#&8pqjAhI@|tGKs900b&dhm zgiY7E_Anglzz2+&u<1I_K2pGbt5M|hUE_a>ew1^Xt_ckC?Xwue-!!WCTxmg!ltMuY#POcP1k}Hdc)gw4)XTvU|Swd*mNyah$d{F17!}!KBp8Y zgP995Hv6PioP~4?7Kf}1>k}s?M+z24QnAdD%XW$8h?ZqGXPgoLEsVG^fWDJl5m`(c>QxmT9X9zp(>!*tHRvh>Q%0OrRbCMV{8 zF)RB4d5XYneD+f8rQMxhLfC7?UeVpn9f7;nNt;fvy2t7XO~Ip0wQghDrf9`B)pZ<; z;{&hZC>+iP8=W`mGC*CN3;ex*5 z+~{b8rfvc&kB!dbrL4MM9v$)o<4+d>n)r~Ut@S+So21Yw-r`FDO;%_f&w1;nD6rnU zm52u@v;il`q%xH~(7qV0tUKmf^!}j8z*D%8%tn45|MIQ?!h|mX;j?ETW)Qw^@EyjA z-5wxRS);Eah2_^F##W4uvzTQd!qu-aW9+M0A}raE0{^bUE8#zprIU&kNMM+n6&ZIa zYSncPyLEX9{b67oiGk^)Rs|AxYz*{H-b@52eYI;_C$A3zXJ&TODd@@38{9kX1C9dRH$z>$_wuPv!w~ZbSGyPP+!P^G}=|b0VZb4FmKFchK(RIEqu%R!4w)2uivuENQBgMEgFS zZ{m{y$Sf)X`#zl%`U7TJw2sormvWeX`HoJ$mP7c`9i4nJhww!^I%#1CFjoid`^dHO zy6F*~42ylA?qfM-<11^o2}H)_gMJvlPwmFGsDum!ttf)Bj8rdnyz4ct?u*L&Fz&9`58z(9+GOWB-LI?s=Y*N7D)}O zB=rxF8qpT?$*_I;WLT+BWQ2y9Hp3#5w7F2$<|?kUTqX4pCs@{|ka}((>ba1*Qfn!r zb~Kl0x{})Ap!U6xS~{erx$Dbv*R%h<%G^7VyKQLDQZLM{bJGj!(n&ECGV>i%nwvp7 ztUF1|YsyNyo^#EvERC}IFNCGp`;=zyQ<}ZcTno~J(jsN0ozH#ad8a}txX<%FKUWEZ#`pNMAhf za8rxyLTx8=68y$tU9ea5@YZhKE5<<1>hY+B{B1#UhrGJp&=WV95t@wew7Rz(N|Jf! z-I`EU4A8+;ZUW%!n%TQrerNYCmEXSJe)*l(J6nGHdnd{7;@%GVUDDeoze{`T<#z=) zFTPT`zs=Xgla-xVeIocrKj_3Kr4!Kz?ZYRf525d*Ti27)g}Ah@J6DjpLObY5)8eJN z=|3s`LqkJdFLSDV$FYN^^`OkZhGl-olsQjdCEqb+_GuyCF;r(O)$bUpGquz2sO&Ar!?-zB{toBsJg`=|GH`Nd}3^$@4omr6BVftnsuK<~&9f60`# zw1WnS>aH}yxK=DA)qOSSEFI))DhK)NGRQDAVRhAU7)~t}av2IK3=f9jR5Ons+@bw( zs+q_4?a&@L)y%uQ%)C3TvJ18aT@cQ@KcW6wrL!ulw9`~+p0&U3>NnlB*mT#DUhS@> zrn^?4yE5Ec`%5kP0b25M*pmKIOJv3Lo0{KeYQCtl=0|;^=HCV>t@*ObnjiaryXILg z*|DXXzk!T()|*o2 z=~Qi~oT|BSs!D^J4LG2k-C~ee==Ljl1H-nYYrJPT!V$I@@C_if#QgPHrj ztvfJgt`zgWtvm2tW(N+^?=&;}eOq_b+fC2?*{;}8Ka|ZMn^8EkA47As${&kr2o1Bz zj%t}I_gVYv<$0!;`%Nz|Hod&W^zu^E%b4L47jQ%P4bG%ET9afKcv-47Nv8D6Qsqgs z{#5s}G=$LN?~ha7lAz}ntPcR{bX6uPnH$^WLeQB zEJd5J6s=)v;$V{f0m%B;4VCNzWn>>HBl|!ZSrZnr8n(I)G#%DqI-CQlIvviJ z=|BT=(rp)(MiU?47X^b^`r?*X<7HAL1`@BUJ=|SfHH#JO<=3Eyzl24&VG+W^RN2bI z;1!G_s)Hi5{G=&=V4o6OOo{E%=<%vttUaDIV5<$65MW0Ud<8vW{5TiXcI@Hfl}>nk~U3uPWc+x;!#$^g)2-)P7y}ZK#Qlym-iKTb)n3DE%VD-COSC{>R;hU6IHRNZQ!U~LiO+wpNBa; zl=VEy8fO7$!~fKith!6dGm*KqCcnroI4i8$UZ6L3pbLbpJxjUTrBe=?Ni5B^L`QX} zR(q{AeLhETjZ80)mA`+2%;_W}J-H@mp`19Z3COrSe^{%~+Hi7A9pLS^EgFr9FqtNI z(w_@!IC2f#MUXVD(xg9UvRgAc@w!THs;I@`K%M*+hSi9#wXAoD_Frc(p69WsZP?cKV=qDU7Ol_r_8(&j)@)U1+k_L!dZ+g+>68t< zr^)Xo(3yTKu~$|cpiD$@%dq6yrMTm@xNYq#a0pQ|pmaBdg-_kM>O`w%l_`9G#jQ2P zZ9s98PeO6=O?J=$$D^nlP}GzwFJrt?Sv%zv3`2Y~ML<~RvNy)J=x#A!O}?3^Cxj%v z2oleRBu+3D(M%_3Cd|ImvH0Ul!b}e!lh+-TyToMDa*x(>k?D#{A@1x8GrfUK%b4kA z^jxfuL2ip;5@wDeF=0|~&^AoqegHTO>-~)UVxniW6fZBl}wT|ULn--!y477Hl3AJe<+J;p?qwyg9dlzU6L$uxy?Ilv{3elR^ zS=P1?O$Ak4dmm$ns&<5EhX8F4(MIFtRJB8?EtMBS)!ByjggxOrL~p+a03Q&&FUap| zh*s}wMAiuvE8p2@O`Z*&c+ewZNvENtiO4f$a)R+xFo^8>(T)Q)tvnGRwFx4-?%OeC z_BWZT;9WZoZ2u1S#6kb@vnUIlXB{*JXQ!^r;GjQl0NsP0!r`I2p7jm>o<#KQt5AqL zJ%~c3K65_uM?`KC#C{0GZ=hc7FQ<@{(=Bql^_g?i0PD(07S^M$Ld^OAbK==pZPk16 z$@c*gC-MCah#4pGwAO^J$x|^Mo!^B0(GO}Pd(a=u;QWU8*oCJsO8{YU%mQua7h$ID z$h0)f^oxp2212IMSW(VnVWyjrX;+x(v5HIvLZ-JdF`Ng(OwSEtmGGPSY! z^TSLlkm;*oruh|_41`RNvU&%FnJz`9r@~AJRb(;{GX0KyHYv<>A2LO-8|&PjRFTO* z$h4kq8WU!E6`8oNYo;+3nGCeeI{02pQ*XeIECuEvTsod~(jisfSY= zG5-U?c0~^d5Nh*ZpGBrp4^Ks=pN5$#de|=Y@E@=@+ojH0jZFUxGgWk!UFxjAV5hcA zo%Lm8;@6e5+pg%W0NQ5tb&P=Cqp|qM&$mPWhK{RMi+=~7fj4Xqpik8P%%_$Cua0xId}Tnci*r63nv z3Ua}vAQxN;a>1n_7hDQ*!KEM1n_7hDQ*!KEM1n_7hDQ*!KEM1qW4nFLQ1-al- zkP9vax!_We3oZq@;8KtaE(N*ZQjiNS1-al-kP9vax!_We3oZq@;8KtaE(N*ZQjiNS z1-al-kP9vax!_We3oZq@;8KtaE(N*ZQn(+d9y1Ga!KJVl;R6eD!KEMXw{a4E!J&o9pGr0%_vaunv{3nbNo=!g(r7n}K~pS*#X@Dv+#v|6 zg~}lv*B~qwDu+~9s2oyZp>jxtg~}ln7Al8SSg0IQVWDzJg@wu?6Ihs9sALu72F#GD z-$9TTD$|VO4VWR*G|G2dM-QsQNS(Y3EhyZL(`CCb3}L6R`-_+*h4U^)lL~zZ4=Vf# z@l}PRuHa_$XT(Gc?;$m2xt~QsYwtrK4tj@-CcUSHULSDn!cTc-ZMk_Mx6Vx=wZ>~* zaVCE2wpp#maY&(FU-vny^>__Cbz8000S&u#tF6{m8m>xw1WK(Z+$}k1rxxT}PwXYd zme#lbj9>9%(E6tcxCGEl#8&{}9S#xn?-PGv?st7jizc2U^xkZNY7*~2z|i{sfIz7P z4OF&%piq5cJuCj_OC&9eZ_GU?pCtst&Vn_TwAG#1krW8 zyU_Y~k-E^y#Riy9`H%_d7UaAfp>#FS3;FiZ8T8@+MmOJatsq#5L4?L==4j#qbb4OR z+rdF^f@x#_4K1RBUJ9V{<2V6u)xU1z`jf1D4+k1{bS?KnptfauK|g&yf~mIiDaMo$ zYrD{xLX{C~yC@hjnm%p2_(7oIYc}B#x}U~N(Pk61 ztT%7ix8JWrdU`oVw`S<*e;}Ngi#`}SMx?8lJ&Oo+vUfRq*zTdG-I#mh01nH#cpay^ z5sVI-I|gBC&9KADTQh9FX^oY>7tMBub@l;KYCNoqL9H>%PqzZ0#vgq?DP>T)KZZm( zlUWzPqAq@^F1*H8$X*UqH8WdSXTQ*hy^hz|3YBJN3mas|LW9K2Y~fUU7{q_%71-AW zcw$FAa5G=b%oa|w`y^G(%oaA;#|o%sW(%8bx`xKsikaEM7W+B@)y!;RtNrf+s+rls zHUp}e*}~`Swww3W@ZcL+J6ybH8Wc{&o1KLP|3_}VZ4J{%2*X9Fvy`; zj0sUFGc(K4($&kZ+-JUFE=CdCCLLLpwij=VianqxSnOZLGDc$OOEmkrEVD^lC28#R zvNSH!U|%^~5I78F2;~N3zlkK}nK>F|NTsDxPVeCmoujp1^ygT-JjyeE5N71K?k^+P zERwV`9PKisu&;pBA0lzkOGrrC942uBl#+r2g3H77Co0p;E_-K~&N)$*zp^t>($gU( zr^|jZEBgU?{u6oJh1hF`w@gN+mIVlAhd<wHk4BsKIsW$mU%pUGK0Z9 z9zHddB*eEsC*s>|ma^X#m5=Asg321~7qznS!EF2|GU@oTu9}f{)n&S%{BFc*IxAmB znB^VA7Q-Gs~`Fi=IUNYVxSh7 z=B{0L;%dB~Mwp9y|3e$WG}#ZL z9*~tUMg$YyM&xCv#Hhz5Ug`%0!gl)_=3N6~@&}!b(e^7WV4y-3FMFD0J<051ws?R+ zs+Pf>1zz|?`(_edj(4U0%?37gR~37?Vs8iKms!|RLb(r>V&ygfcLb`VxJNNa?YNZ7 z@haLUGe^HoRY>Nz4%mxB?EV0|Xpdu^4-ISZIPkWIc!x5mROdI4>Uh?-BuD-Wux|~q z4`NWUe}XsLX!}Xlp{Jrh+BQKIDa_HMIo1Mq0&&Mw;LZbX6hdEZ;TQ&$`UYv?<*du_ zu;#d-ZuN%P!vpM&8}XGU%J#uHjiGAeK1QCuh0LR<)@TQw1V>S=F@RQ&qFSRJcoOU^ zGxFS7VdVMZ!6?k?IRyKU%Ba79HM9&RANoDWsLM>jMn-ob7OtAb5lopW*vRBQCa5V` zNVWT-WDQVyWWh=%sD)=o?Y}x||J8K|owRNf(;mauiI{wKvjt#_$yc{9jX^d2d?bQ{ zt|7de3QNVi5v&sPhGHCU(DAo2jdq=?s<$vmn~c>R3mDvrrB=OBg8zXERqrA~HEl9R zSJ`JG9CfR28iD~4FLc#6e}JeMZ8BEh!dS~=lc`4$CvwE9iB|7k1TaCHjMX=i8rL^% zGFIREu|UQqWA$y!78#1T>N|dlXVMh|cCm()00xTzyI9vVq(w7pv9Sz-77f_N#wlSp zu^YGnq%OPyNL_dZkQlIw^}HxF>aALLGeX`PJpO=xsXPi519q{AoAGfWF1%usg9iK> zJrbJ|lsXSx6+1woXo3dpVpA2WNzi~@Y??x;#6Jj4SExQg19q_)3S|>(NoA%&Eh4Ck z%~Gh%O7BI(qIPV~4_Ox)u#3%Qke&Gv>oSiJ4cH}Uz%DkQO`!q11P$257Agn>cHU|v zJOx~7W8O+%gc@CL$ChPK7wy^Q43aPn*u{?3D!2(6u#2s1mNa$Y6+4bSBL?hhUDEVM zBbEP#c&$4YK%G5U4A{jsF9jqnykc7zWEnJI7u#yez&LRJ3>E`+vAZ9{oS^}`*gXcD z2JB+@8e|%Y`#v4`0y z;PMkRU>AGzNVFT*zY{cI7klh%fz*Xp?1`HMQWsvaJwFym4cNt=(h}5wU2Lz`Sq<35 zp4RfFCTPGe_RGg4pStjhJ@YGp)PP;=S4u@)c*S1Sd@87mz4UWwUw?uI>|!s!g#HO! zc*TCVOxmy{aXF{ht6X$2V3(i)yVz?=WdPp;Z-4^xW#qwjXE@9mVxaq9M^Xcm8h?S= zSaf5P9VTb#t1WhbqjX^U7duvLro)+zkDcs#c47cVvk$P$0IbQ*0D;(nCT}WxHAx-h zEWjKFSDPIm^1&vxJNsiUfSA-9t&%!5yZu;z^Bvs@W@eA& z!dqaFXJ_wXx&0=!FT0$i7CL82-g()>I7Jp4rRVgtjqE@!)r&l!Nr#z#OiJ_`kPDW3KAuQ6hrj%BEf3WoARL1I46(h?Gix*ZX+ zQ*-9YTE)h|mG?#fV-u!fyI9^n4sC9_8r7_c`F1DTnU(E#xP-BSvk$YYM%X$v-0Z^~ z&yluHjVKCZC)B#6+;lpcn2gP^Hr>%GvL-9w#`@3Ve~Box$8EO34xb20MEsSI}z7PQ!NDJ{ES8fp537Ut<0> z2ENPAu4c_oHt>UX_Mhn9*jfWWVrSQ}DW@3vPuiBpImX&Z|3QF9n6(iYuDuAq7Ql^G z?!DMXCxPjjy_6+ymN5JGBervkGei~!TzhesBOr9(+Kc1BRb$}h_hLuMQg7jY5?kkR z3|o5HJ6j!=rzIa7#I;wg%cxeHD_y28rqIa<*ScKntu|L$Fww7+_;c~}ILmHB zKuUM4JPq5$K6bdF*>;|W?PC9O_;#`Fwk|;4xEoOgs7s&5O!I#$lwQMghE<~HN<%?j-7r~S- zf+=4FQ@#kMd=X6fBAD_;Fy)J2$``?uFM=sw1XI2UrhE}h`68I|MKI-yV9FQ4lrMrQ zUj$RwLE#YG7r~S-f+=4FQ@#kMd=X6fBAD_;Fy)J2$``?uFM=sw1XI2UrhE}h`68I| zMKI-yV9FQ4lrMrQUj$RW2&Q}yO!*?1@J*9>$=64EA3B4@LH7{1)1d zM8e?l9>S=MI7c4*MXed-PN`Z2JpRm=jBT{MRy+M5%|W?S?FYv~yZNRC^9Bn{46Z6{%~v0uAJvPt4&LE>Pmt(^p3zgH5)&RX4EuFk;83 z*jhNa5fVH)xg7sbgNGhF7^g9mOdyd|aZh$6Z^i&5eO#0+Zam(CTPOJUL$u6&ip~75iNcZy!x&T*KR7f*^+ytu#7p~;1ORnUj z`?!*iW~YI?ONTAd!jTNpVN0}QHG^d2qx-m$kBTdKmppx}_z|#_rx(Rmuk(FoBTpX} zKMO8-`Wo^6BA(@IN}lCw#Lt58^odn=0r{eC%}ue_%F`#inz6Wz zTW$uq(!kRP&bF1O51{|4TW%VqPxcHI8szDDgUI_X9%B(DmB;cnZn+<1p)^YW|D9WI z!_z0{@Tk(b5~f;Bu{?_63CkvdAs51lgs#VraimdaM1g8 z%gs-G3Iz9JoRY_}XADnInjWPi{5QmFUHYmIc>3h#-GGc+ZU$L-^7JLQ+_f$jnDX?= zyCays$N`~Ja?u4meYsoiPQ)``MjkR5c)+HDnp$@Zk{Xy~czU?yX0q_~ zCAZwd)5G!h8B%fO=|fO?`Vdr}zT}o$czU?y{tDK7z|)u9atlunx7@c&s`B(Dx7@g_!!5V+_=cy4TW)p3ZFqXP(+5po*wSHi5c+p zaM#T}KH%v~?z)AiFS+X$o*wSH&z1@*PY-w9y0Da|hr4bCm8XZhZUvR6hr8|?8F0hX z!(Dfaz=o$UbJs0AJ=}FOd&twnUAMx9r-!?4g$+*+cijpbo*wSH6*fG5g}ZLfG1f-< z4?I0#)<$6P^n^PCm^?k)byMahJU!fXGt6NkPY-w90|J7l=PpM;=ook1Tr~!6rn_z~ zb>ZpZuA5^hJU!fXvpg-C?2P0n@$`&pwYkz|>S79g4`J{Q7`s-RD=nDlzn1tX@boy# zK0rWd8J-^Qy1Ahlo*wSHivkHxKX}|Lr~)+W=&mU>a|AwQ1|J0)^J@E^L|DGKYv){r zS3lY=?wV@ny(^HoYpOkL53*wyOVDOX?fid9QZ_+%O|=W2leDP`x@)TK*H_HU1l={& zF1%CHW+yI916p*WK%Ys_T~qDh3LTu-@-;wfxO#C*Ts zTD7~U)qLl?-}AiB`^V=zPuJ9{TD5A`b?^FB?ONwvgF&C3k%2nZoo!&;hh7w+dM9p5 zOwUxxMN;bT-iv+f^uA1w>V@l{*@4cI-nf|Qv%?YDr`lW9+pYz5^$L;ZR{xa1GY-U3h)- z_X}BtZXA6a?WZ2*Ohkgr^_~PeBl#f*?GFcTvDXK@gsTAUp*@cnX5>6a?WZ2*Ohkgr^_~ zPeBl#f*?EvL3j#+@Dv2$DG0(-5QL{72v0!}o`N7e1wnWUg76ds;VB5hQxJrwAP7%E z5T1e{JOx2`3WD$y1mP(N!c!20ryvMVK@gsTAUp*@cnX5>6a?WZ2*Ohkgr^_~PeBl# zf*?EvL3j#+@Dv2$DG0(-5QL{72v0!}o`N7e1wnWUg76ds;VB5hQxJrwAP7%E5T1e{ zJOx2`3WD$y1mP(N!c!20ryvMVK@groKZGYdSu6-o>0~h1PsPdNJ0zhXJh>@1XbL@9tb~l-A1jldEPhg%`kyQogeN>%?B0V} zFdySoA&HY|Q+5OPIPZQc5+rhH80jn6ybYO$DJ~&wvrz;TN!HKzO8B zz@7mWM~Vkj94Q`9ain-ac%)b^)gKTZDV9t12bkk23ib>b&&(9;p$Y=_44AYNUV=TH z3?kSwV6p}cc^lKS*T5MVH$KOK%=nLO!t~({rXiNoM+Wk*ZN!}&afI)g%${Knu zbnu?;K}a;R@dZ2IZhy>VGi}bE^4Gq~vi^YhVL#LemVm~&d9#wYuT7X6Skdqg7`vY> znfEOnKAPnICboBYBeMy~9-K}&f&pFST;?Me+D94o6DI7E#}!ZC;E)dswWn=Aeih6E z^48e)d}PARUW3e79X3sP*Bm0GO(0XslMc(HS=5>= za2Fdj%b99|^@mSc*gx0~1X8fO+OiIT(9xerxGJ`2w50l2x<}u_jx-p%@Ed+L-a9L=RLy+ipb z;k~4p_Y9SWe$})y^00&mIn0ONJaB3+5?U?<9X<8axK#;>9s~3do9Q#?77H>+0~q3 zSud9oEi#ElOJ_Jz>uRBjI64$D@lt9#U#5f!5J6FULQHi-nD-$Sc`pbP?rx8yE;CCS zABR-aOQ~jtsa~au-C?SUyO`Y+8Crvp6|=k=32CK8i#k;k_Nt!KG$F27d~gJ2ze0I> zcnYbuA=NOxt0RJboMsyq93rH=q4%vpn{XB$H62XuJ9Y}$G20K2_$_A1so8x;rvcRG zXf%<#%l^~l=!sx!0O%dhhHSe+wuw!Y_H!9cuY;BBdxLdciS_3p>nL72=$>i+5G-Up z1#E|tjra1orAr6*z9XIj>KOnwpzu)xfIL-~+!4`T#pq+0h6c&tzSlu5f}hFlDB6uUo? zPisW-?U-EME}e&Zl9m4Z6kw4k$x4oCeu5A)3l&!nL*QmsdB5el7b0wXuuA7YD#+5Z=^{u#4oUvxHW zX0v5}aBf%ey+hBVh&xooqM>X)=T0MDCanL2uut)O9D+JRqCDNn%$q}IZTOj~4ioaI z0vZ`Na=na{qRv^^e=Mo;bycO;nwVmK8>M$X4py?y2kRirp{n)9kag52c)U47?YpT9 ze(S-um~8CtPU#*>&c62}dK-R5owew5*I}?YdJp9$#8Ajq2%x=|@qE5qhk#r0>j*uj zgh*>m;+=2y6mFa`EnX=m^XjCCxjKnCPT|!_k>}V*)>K}d6v5R=U3|nv^x7orpn51^ z-9HeG{;nB%-}7VQ%3Aw-gj8q(u&>3WU{3ddw>U6Yg}K> z)}~#4wPoPnTKe7RFk}-yZl#x4RI=+Ocr$`URduh%nqIJ|s{Pkv;e?m+I=%r`&2Hh2 z?jX1Bgr!zh1r}8`M>cy0DHc^#fkjo#-3-~zAjP7pDzK=k3M{Is0*k7uz@n;3SXA2O z=6zsqfE#{y_YiVukP&w)L+Ris`knZf5o6-XdB28VzKTd5bUJ4aR3Y!mOdhPtxdN#r z=PMOQ;wzCL?fw>SHZu^-J~(+Y6Ut{_$x|tgGO89s#&V_H>fa3mbsA5ja?h%HG^iCy zrK)L6JbC(45|^%~G4bT8_k{|o4?hjm8F8uW#%dZ9Pp%m$R9-GgN}i>9wLv3-DQWjv z6gcf(i1b?Qo8XgT*PjU=0my%#3hs*&Rm zf!`()?N3rpJ-6+L zhR5aHwjUZEmvh^GXn0)CZTq3&aXGi`Pg5yvR?|*YLfrQEk6|j2Jzjqnz3kRJx9!g+ zRodhA=ddWHJzjsFlHB8Evt_|6Wo)&Y^xU?8=MZ`!5IjLRd<1sJzjq`z08Aqyne~>cv|*&GjeX* ze<&KqG=M!`|6#*jhdo|DG(291JzhUFJTB+9{l^YOErsW{{l}H6siWa>|B1Ddqwewg z+qGi#+_wJ%?aO*@+kf^70L$SXum2-%E%4K&e_jMlpLyQ`Iu4p%N5kX(t13nJc>U1uxLmO0|2l!j z!)K6kZrk5A81)nG@%nFHD{;EV>%YUNP`JnImkf_L*nEmGUA;Igcl{PRtPc!>(TJ*L zRP)c#r`uhB4~Mmp=ecdaWOzJ35*&V)vrH6s^E|g*BI9|U+b)r*JkM?WCBx%+p4;}P zJA9I1cO=hq+kVOLc%J9B{e7M5B(^ipbK8E&@OYl*w*6Vo7Kxpd=eccvj-xX{SDxp# z{gUDF{5Ix0*Ti<`d2ZXE=iD!8XXklt+b zlaMRUXXjIF%VQiJKs|Y$&-RZs>A=l)2KHFdB{2Bi^`Q~{(+dt0nq@g$1 zd7jVq%ZA7EJfH3NNOJDw=6OEbKf%yj?ff-Nf1;tc+4&x7ev+ZLV@1V2-D~J)u;^w{ z`WYTi@`aJwNd1`$mZ*);*vn;nLr7vJ{y-DASkdoqNVGi z3*8KV+U1}QY>ud~qyJFCx4})am+_pb{gSKs{p0bjjLC0kH@HD_Me{i-BM%7oAT zMgZODkHP4qZ1fCr^W!c7M*r0fNMGH6^ndUMBr)+_-~WQ6`u-OjeHT4YMxnXjsQ%VF z5Q2`*ZODd^FM){efRlD#fr}5F;Og>+FEdv1dC4GD@7fHl@FN`c*aP)1FDSMB(S-%3I*BLdBI25}^ za-C80D1p|nG&=U=rB-vr-eYsc-eYsc-eYsP_gF`R-p%3OV;v28H&^UEHjig!+^M^h6A;54W9Hl5 z9pKB?L8kDHE%S|I-sOAS7lH2}@~ve0k+MAK>utaCW>N}V_CS*srW#^P$1|#IK*}vl zDOwLvtrxZPnc?tDdg!&VeW9dNYX0!om`A(G13GUe-D-2M5y)hI8zgoHp~TiuqEB5~ zHPu3u-)bc8M%>RCsCxE}7zE_+H3)kXzZM7@84{y9i3#>Wwb5Ph{R#1(;@7dC1f$l6 z*&C@#Lq!SSgg(5ZNK4od>LVp=&^#AvnHp8Q9@VF*zdm8ZeT({pgwbcQ(I*Tx`asPw zU-CJA3J57n*iMi={0P6dUB3b_P1R12z4S@GdgQ3_{vQi?yG=&v0P^vZ{{9~eczYbmh<+ancn6>% ztcZTy@AB(@??8+Ugv7p&(G$_H`y=M-{w~Z%vBt58moEZhgJ;ppF9KpCj-+=81jIT{ zg*W;j90QU*0WYRlf~4{Cx&MShto)Wgv4UE-{FXma21%14NSe5NFvggGq=_wm1E+wb ziF+7oC0W)^_{_^yDxSFGFpvV0CMwSTC+>|Rq6CsA?qf0mNfQtJ6jI6{>Dh<~K~nnD z?gel&7hz<%RhQoje|3Nvqv{Hl67N@*dncl*uDl8{287xn$$kj8u0IHM8aWh%0x}+g zP^|J0gqjV(285y)(u4nRAXFeA)IlPHAk=>#zvSC+j-l#_)Bn35RQ*oq zLl9~LdV~R?=;iCHf>5OTflw?;KM+buf>5U-VkUUabFV%Gp{}4{1)=Dr;4cHAu93J9 zgksGY5Q;M8*y$bc7~yG`$CMjNAk@pC3~?@FgJB z45TiDP)gMV3PRl{Ies|^#Yzc3H1MC@j+cfq2=$gwAqeGR)#wZgL8yU3jR+Kk(i}QK z5rk5mCxZGS2sKpFg&@@KLQM}8giVYwU6pwohI3h51SfKUWxaBX_7 z5`@Yb5Q=qyD$N-XO5w|gy_A0sta2}0!z2xZzFnX$0AyA*D72txgmVhjjH zKgAdjN=YwgKqx+X<&pq;-UX}CHct?Wt)8m{p>lWQaR?Af+sn-v5Q>}tp>hU<;#>|8 zDpv_YWx7#@bLMi=>o%;d^#RoFAk@^D&MVi_O z4G@a-J|Ug8@&uty2Awk?6#Z-_145lGBtR(6W+X(80iifL4BbKyibHyU0ioE20}Keo z{50pM!xW8HodKa3)M|4?OV>pgdLI6?%VFDUb3}z5{eMaLzr#&R{{_?}xjR;y0iif? z*>;-&p$-!&$vw}p;2ju(P(wjrX?P!$s@?r6xV9aFOy?uYfJ}Eu@6i3-%os+LK_-2% zA;>fv;Ra-)Hw2lUq#OmA=;eb>K_+I$cdWE~2~#S_w25Axb*~%Ecmp!Mh|m(q^hXeB z_b+gDsHgB+*(g&5UUrd$+kAE1EI5|h92C488zokdsR;ycGsus-0l9p2o55GN8T=o- z&A@<6T(n@6@iv1J$i$BMee^&Xwk441I|wO(O#JpDx)V;?eHU)4{b#t19B_?%S+SC@ zgSG*h;x+?D8IXw~==lTikH3LPJ{bQ8dxzpV(a>2Z(FSC?Nj2kH_iU{aa}6{8I7_(1cKApXXm$rZw~p0C`CufyFM-}Afgo2s)Y2Rb~jTMZRuqu zhxd{4I;JGT5-su_nP7LC9YM9flW%GTs5Tc7 zWl(Ke87zB;yc0_T)`G7Ls!c5O-NKB<+GkyjFDUWb0=_b+HrBvj3aTm2D4^O3rW#fO zs=bVqWl(LHf=32aGn4_F=}HZqmM zXrBQHWa<$}=@D!a-Y(&6HnPXhg;fUw zoGk>+@J@t9LTJh@0cRun0cU%IjqHoTDh65bnKhr&;os#5KkI)BID=7^5^x5iEM?$q zHv^oFLUzpdQHXvd)UFJi4FW(l0nwB2>lhJ&UnBbgXL-a>$U6|ggNdU(a1B7f5d6l3 zp0U|5Z3vtZDrVZx182{UCF=0H+1Pzd<_ttw z?16{jR=ds|Y&|C$SlSw6LgpFD;z}wphF)xi_&5cY7^{Na)E(drsd$QjRY;{$zk>=P zmG*H8EHUmmk-<}7%iv2K4(E0JM0sQ?r@#`sFT<8kil@L5dxQmegVdg3uKW}+v6oWu zR3~aCF-fUZN=?Wpl}`N)@K9okQbB4H%Qsc2##C<#RF_iuR1fMTF-@s9t9B;}MiVmk zQx`QMLoX^I#ZzF3*`#<1ER{uTCg!jxJO!3g6EaHT6j)**BAx=Tl(E&SRlq87B(JO0 znmvkM3g#)W#L=pPo8o7>i6vDM7f(^2#4)THa|(ne2SQOXe%1b$0@MH!-m@z6EcR`$0@MHqe{e6YC>ijQsXd5 zN=?WpRpav%SmKF6l4Ck`FBRRc=^9fPAT;p@)Q_M$fz7E z%Tr)55;Is1&bV2g0xOa6EKh-z$W)f6z+gf~)26e=gv?a*Z=3?l8WS=a+mYodFqn`z zL}EL$JOu_5G8#KEThBo;%Q;?RCuNNZ8J!8bvc`mrGSA5J6c|j%Xl!@Zn2^z9F0-@7 zgp4xJ&GHl&OvtdXsM4%4A=4rmEzEL|z=RA322X)yc?t|BWZ36<3M|W0U@#%G4(vPy zmgOlhn2`B*NaHE6EKh;Kgv@0UFQ>rvWR#kasi!~fvbSsdoCLaG`v^%r!8A=+XTzfwnDlu%3?^g_LYW)obQny? z@Os*;Out3(V+3b;It(Ucm=PxPEKi5Qgp76#uIX6`X_t~4LlZK~D2AuQU_yp|is9)n zn2=G@%kp#>OvvzQ$kSm7dRBqeXxl^+GIybKWO+IaCS>@yp%|VHg9#aJM>lIs$dD5| z7+IbUg9#bV@i-lpH6~ApVK5=11FI)%Ovos? zJj>HzFd?Jlnk-L;!GsKr+;CFP@^lzX$UH0b20Lp^$S~&!Ovq$;It(Ucn4G7>vOFCI z6EaF~wX-}O1`{$$Z?m&J9R?FJN^iHbJRJrTGD<&VXN?INm5&qE3HC8+BlXv$G_?^r zrZi2;2%WW>XhP;6ptC$31`{&$vwnFx3?^i%WnkbD%2|$tq-(JfYzK}SL&Fr!0*6Cg zK5d2x8Ma|FPlv&T4D-{R4-8W@T6uFij6p3nN4j)fbfF{QPrDq>EjCA5*wHVPa9&KB zU@xPcCdu8g1{f1EoX~8001rvQgv`%`!g)yW1+rx5fHpS>B*4;^d9 z(OV-QI@V15F6HnHTFsvHqS;bBgI2Q_v*Qa_+Fi$Ro*E)J!1L(tW5By>Hd;enXNZIP`L0K#6$sl9cYBy;!$T4v-aAX<-tlXh3aZLu$e8?Yth4TlmKx4+rs$7nd!V;qU9pYI{&8-2F-XlsIFFt1pmD! z3FRWpV9KvG1rG-WQA>P^wAZ|RWB8TX!2y+eL_6R6)RwHQtP7;0#!{Vnp`ZJ%htsKGu>D;5#+955Q%G4Tb zkbNWbS}o=M0FVRo>_L93On$4w{G`0AO_|!4!!+oc3Xz6dGi(MV9EYEl`|GOVN*3!J zW_6-XM21;yLN?EuY)%Zbkz$=#QLGayiq&g!g}mjIH=kok{&qm#UyZ!^rkO<1Lp2G{ zDs?jnFIdvQ50T_+SPZjfCxj~S{oa|txfUn6im$PSCXfkVz!h(o^cuH#SSV(QRL)e@ zbM25j$YiKBqQNxP0JV^IS+?OfLOSflvf;zO#`AF)T0c%Ry`!ifrzzD_)Q{7YTG~z% zHR@m6P7^iiUxQaCDsKG)XVcB8m;vYwT-?8c2cfYSTWKWrODw}W2hKu@|A}ST=P`sL zuN@C=G4blg7Sqf1d33}c^m2V3T_Iks&!c^0h;n@%S!Oex=SJ^-3IAhUpGUXcMK9Oq z(R&yQYc+7*#4jP4Sjl+w4u1Vr#r1jguEmJK3{u7QdGy|I3uR2aM(=wQWMm+m=mTfM zO{s}juYrZDz8s1*dZRCay@Aj_Z z`rMmEFDsMlb8j{&z6w@xeeTU+QMf*@;`-d1rzFtCiOExp(A`DOhUu zD0(TF>vQjDRl%*|`rKQ>msY$SR8b%A7}kue&wZCNT&^||+|N|{l`^||-Drkh>G^||-!3oNFaTgCOcx9dvO4;GVE zT%UVyr=<)FtGGV*-qBAk7gce6?!Bv0mI5ll1Zgo{oj5Fa-Cv+m9XU|_HzF!vRK2dx zy*(U8H*kIK?d6aQt=7Qxx!2|J10jsMhErLIAsKJr`n*J@8n{09_BLtL4P2jl(;WwW z80+%}uFt)hCbpx2>vL~kr%_@%8@N9A_A{{)8@N9AW;w$pc2Wb^=iVGgXM(Ns*XIpfpL-WOb0i+?bKm_3 zYQdOz4e0k>_I7QbQApOWeS~DqgULmd@A_~v_EiXBckIW?ps*>qBFor|5yD@&>NYy`_d+)4=t)x6E0C z3^*w_aDDC_=WGyqgWbUOxp%ze%=LK#*XLf3Bt^s%=Hb=U2U38%V@cS+Yd*0?q3p;wZginAQXD>Sn9+Bl(EnHH1pE;b+ zY`cZ)bMK$dCZQr+bH_TmpuzxqE#A896CqjuW}J`Jpxwa0S@sIN)NjRaIRbY_6_8jX){UqcQd37fIe-KV&*9b$3g8j zE=}y2ntlyZ{t0iVcBiDA03E2ykCF1YQp!$ExoFVxl`AZJf@;+}@Fz?+G1OzQ{VM5^ zHWw(A^C!q?dqToYinh;$GAY{LBQ;9nmbP6+{YPosVti=hLs{$1g{7C)#}Ut$)=mG! zOKZgzk^31cAo7Junj1&L9^mc=!B^TW7uUt+QUmg$iEft+QVF)>-d=a_eloeCuqYt9uhrNQy40k+j;A3vf|d+7 zO;+4Go9uV%EWfu@gFJ$R(7_VzYW&kXW)t&%0>9ibn>c7mL`ooc%qA-Cm`(J%W0sc# zrQKh`ZO}Vr6DKpF+%cOtmEuqf)m4kpR?C&rJ7yE7ohzPu=hQyy?&W*TU93 zbT{4$cr9$r!-kvJ!j?>b@>K>zTl4HFRBw1A zN6n887AiFTxkjka^e6A_46lW)c~NuFYhi14s?K^X?B`8?-YDtxMvj`7?-5F`g{^s2 zrF^;R&jbctcr9$ru4hp{SeR6EtyfcVEo@E2wXpq7fAU&brmGi+gSg^a*q0Dh%P4s_ zYjZ}PqpQ@u$hAdraw6_xYldt zS`Vf_+2^^|Yvx)HrazZJ2-kYeTem{p zIRkUP#iZ1Us6eiTWw-0c6tLY4(_z9yg1xcKg!JbiAlZ!=_AnWfm;gvW7Sed#<(dvA zKDob}mo*(seDXc1Stf&`_%Rzab4^z^@!8BZ9ZY;`7vRPa3k&=kZeG@OF!8xB#c)jr z6QA@`4A*op@u{TO%r)KTO?)l@tI@WFCO$7l&dprYl}&s$b4>>mpW0q-GiPm>_#`LR zbj@7T!Ney+v8HS0nyzf(vzcqUvWd@TuIXUnGbIWxZ04E{CO$8fp3u|GH62WRD!IIw zYdVxZa+7 zm9^zdS!-u7(%hF(JJUvN+T{k6zLVwQtCxYiA2QebGHSd3EJ@^2)=n^(OIb6chk<}T z+^ekXe_Li<|JyQ80+T3bE;6XQ^$1BOw`B$+H-Lz)fddl>aNF!}!0mrq=J}xS#Sgb- zGDn)4Q#P`(fQi3#<6}zgoq|zp#pre_<6L|8G|D@$xD@@wrueqP&Vv zlvnZQVnf0@iO;R#6XjKW{n)oqX|^5XzZz7t;GQun`WfiNjN~4XJX#|8lYwydjF1U4 zWb(&tAont)n|zq$BtyoNb}PuqhD;>~6hKZfWIDN-%u@{+B$KH2WS1cule?JFG(+Z- z`!ns{hHOjTI|$@-Lk>>14F);GknPE*nRXvTjz~VmjAk0LBe|92zJ}~f&Y+UrhMbrj zNm2V5a#He_%y)l7c3D-IQuORdosCM_oV+A*4l89OMO+$Tt+7&$BF|-pY)f86T`xCe zSMmhLUSY_^$-#`hQb;~Lt*RTD<5dyvAjuV#Rb@maRYp`&Wke+fY~z53jeD z+lt3c>OLlOQ35OVz@_k}-C8-|oN@Pr0CTRcj(&GN`ddxcJa~fzP-C{={TJrJ*F}GS z0*|PwdK&NXXHUa~i9G60SZetpjN(t}1>+oU1UZ8meZC9(A&lbF!j?aG1YB$u`7|W$ zhcJpyL(+Z-qxdu=?T0XmPeamv2&4GdP?ZvlB8H^#iVn>(E^W!c76IHWb3w>7{L8q! zel8HB&@~$uAl9c*=$by&#PVqry5{N=5P{Mt2%lOPeNLE_>*^$Ct)%?OZ?aVax)104R0@Qh0v&UrhKP2*tIPeA$HG!9nN%RIPg9F*+K zWW>HqAe+X)L&NZDRSzH`c-U~)14sx$`!e+a5`ss$fWp$j=caKG+L!UUX&i+1W$L+U z96YgEa!mUK5`qv&@VRLm{6Kqr-sh%q@GK2C14!_>X&n5B=IXH;@&9=dsONY)Bd+%J zlZ!z;-+<->kWkM}+4~D)%jc$X@D6839P0MD zX&k((wX_t6;qHS3rpt=Ma%Vf~kORZuU_{k1O0MW@cY{3~)<%**LQt|VlO&K3bUD19 z4%0@GKthR(CkZ5!$W)R*LQt|VlO&K3On3Nhk4@twfrOxBUnWT)A=uY>Tw*(u1QLQ0 zkdP#h5X=%gEzY1xNdgJM97kt@t|Wnkpk!YrNgyGZYht^T1QLRI4i`EA5|RWGf|7li zB!Pqghq|TO<|hdx1Z$l0gn40-KtizA;lLn}kR*^0ob9mB6G%uBNC?h#-T^y-gd~B4 z;3B6RYy=XL1QLRaosT6RKtjf4-`3V(|LWHoGJ~7ecmz=`_GUC0yInsf28B)bhA=S& zdt;dinb-)BM<;ujj7dxY-Qb)Q(s)@XkPx)mJ5iQa0TO~i_W6iU%4AR!KSpYjKtfQm zFOwvY5Dc}o3%~-0%fe<{N^TV(A((1EM==Bvf-dn>41t7TnjyU;frOxJUnaH$+P#is zM%%+K|g zgy1-5xX>HyB!PsWY+oixAR*|HcJ4qlR=x1Lh#upiCBlXv02~BN;jw!uoNN26Y$H5Bc7|=-q3BfAyvzZ7a1go7D zh~nmOjI$XDk<((u2BV!gIt<aE8PDG-n!zkra(qPJo1r z%b*7P1-R06(S>%vkGB_;tik4p3Oo7-68;+87<-w84k5A}tH90S;4_C4mu(lgIUM}c znIlx}UKDI7cn9g#o(&VY%*Q(RK8R>AKtk+25S)xfV8n`XX|*Jz4Umv60}0s~j5I(( zcIE{jGVY~t)q*IO>RB1cFCcRT60+TAN|G46>?80(A0B#c9KBV-1xRS>4=T6i1m0^BT1p>KmR5A;a<2H^`?{1YG{H;y4# zK<$rz{0&0#x%jU)BIY`$O0)n8&HfGuGeAOftr9W*J6{qCkdU9UMpF<-$WK*5>T-)R zacSH#`4(j&kkHZ}NN6!Yf~5F2FiC+8kl?<%Q<6#K-@`})B)IQ=D3Jmr444&Q=^pf; z7qqpG=!3tWhn`zQAfcXzo?Am8!RM}hYX~IxJoMZe0tr43J-3EHLOl;Xw}wDMJr6y% zhCqTW5?aSIGXe=2mnsO5&^qZ(cyW8In_v)ugx1L#RJ0Ge6`lD>3^n~*a{<00O{bjdoA{~uJ(J|e~35s*bcswThxz>-d_O7i-CpJ!MtL`tu55XzZhzjU3Qr+)55mi3#G zZZksNigqu{Fy4L;eB|u_UldD5E$jG@ZI?S&8FY4MQi8S){i&|WwoJGUQX=awM54qD=NH{0u(9e%+E%bJW= ze5o#Xv(~|E8EtN8iMySaxZOK8p^Nfj0b1gA@8r`hoChv~peykk0ztz=!ps9paVI9{ zf%_4^4L>svEJj7q61V$xy9c3EXBt#lT2kffVRMX`ghqC+lSWFN>a$CVr)5xOv1Vm55&uG3D zZNv}yU47){5knz=gaDe&8NrEh00M^KH$3#1%0OCc%%V2DoS#)Oid!zhX9-9wBP(*2 zj+V7UmXh;pgjoRO$|#O}O$)Hn>i8xGU8KkUJ8)p?updM`RT9yoA{MoCB8Z%*6G87# zP6UyYR78)}(MJ)-+HXPx#jJvecS|CUEsfcQ1t{=|{e7^I^)|5O8ldcM60TLXcE}YT zxpabFV~wdA2=clLv-dwm!h@M`=vc-n>!Nn~T;@ildaZG13_|2(B*VYIAzjC@3_i0o zKNl~xtUk&*kNKRbsn=Q^-=j{;OKkJN_GpQ1dB`@#C)>md?al`4Kgrs#fN{#&JLJ3Q z6d~2qE`{7P6w|4fni7g<<=}3H@x0VDYV5DG+fU%7rct%OzB?~9jl%x=L_S!f-)7Ch z0u#6#>)IpHqZC8m^BanxAKUb$7<%Fh7<%GgVd#l3VCac2VCac2!O-2&P$6*wdWRL- z58@&#@%~_h$f3BT!s!o^)-Mw$)2m-59!jr%nb<=w;q;`!>2Hx91L?_07^*P24zYTW zOAHRxkNps#crkPZ#jBFH9QSLZuv#21N!y3RyO(%RPXJk+!>>u>Za3V70D5uv2>1=U zn&h`a?#h99Wgl}Aym6N{d=it}kcXQ=hpK5`Ob*^b;kRD_ZuOY6S+43B{#FaDmFx2w9;ZWf;t2AQO#xr*e z2bm$RoC$H|3~}Ymy{{kz&<@3wGxsr>;L4c?ZbeK#u(IxQJVgOk5^2iFDtZjPSXR*v zQ3yf0nLChYNX0W1U}ffaP#}y;^UBm<+=C(`K=sXn4+eZKYX^R!ItpyS%2~)eQvp_H zD!|H21z4G>04p;UU}dHPtjuhJ;1XDwsQ@c8m0+c@Llo@KBpC%O=|u%(6s#mguri}y zC5u9^GNWLnk^n1x9+<|I0WVF~JDub0`hX`=wUqx}XLsTNw4pE6zJ49u$QtS``tgOS75!xXt zgOy^32w>$fiB&s9Ww2805CN>*OJday5x`2F3Dgcz8LSjLL;x!_R_zc0tehrk)ecb^ ztQ0#$04rHoRH}CDhWDXlfo}zJg2%@s~HiWSA^%!EvqBS2>|4T|E&col0zWyn&j z5dpH)ju1y?EOOkXWVJ>F$a0T3#2Cnueu^=WrIKoms2^nMFM)RZfz@c6CuDgh+Cr=m zl_5*9Mg+)GTTQJI0kR|~AWN}E1jv#zIv`82MpT9@#TpSHOTG#K{}*dSfGj_Q=4^2T zS?Vy-i&FtvDyi0p09h)j)`$REUV?l%1&cKzK$bTOZLAUXgDk}w5g!J&dhClA!iz;fhIj+Kvewc*w(45a+b}Bp~%Ta4YfGjzE*|u0C z0%XZY8c@aO@C0i3F=s!2cR05p8O-zyx&lLM!gU}FdYRpQ2eh>9e7l`+j=)P#j%OY0 zq{Fv2*2vxj#i|VH=4O#h88V*Z@ddlukg429fFA4`L#A_oBk3D5C`_9^%d*pkY|Q2H zhHlpyGM^hqGGoZL+--Fr>kK*AO5KUoj2$>nKy}$`n9FfSQrvCVSICd{f4^3K?#)Hyy0h%nUc#o96G3xP3F+WN(_UGP^OEah_^NK8itP27j<*`3bOw@DF&QdnS7oSPxbuTv4}izEYfWSXjLO!W~pM5cM&* z@nj~<{EDegr8vr{S`2ErQf}sV!$6&u0J@8bBGWt?)C#3inVYa<*?4-l#HBN{uw&V{ zYK2fi=J3-%opH5LjhV-WgIYu6nJ*7_VsJE`rFykNBf<9F_ zygr~#4mdP!{1f~c9&l*v)1p}!9&l*9n(#N?-7`Gk(6~wC;ux$v1=mOixjl)*ahD)9QP2Xo#ip4^5mTs#0SzOQuIef_^9oc&Nnbj0#m2lGPO>>1=n??9*+>&new zq}emb&0Gm0?w$o#OL!H0jq)VDhJ_bnUAb;OALsL#@l7yb7T}&i^XQvF*!B>2(70xd z)8bE{v{if=u3e;YB&YZR+(?l}`P?GQ7cFv&z$=2!iWQ;06)$4YT8Sc-w^p(^7;aT@ zG~85C?iDWX1Ak3%E?mEO1l)A-IJmXNrBEPKWlBg-%$JnZnpRt z+{R*p!?75^%@tdzc5yh|d~rP7mf~Y@2Na)y+gjWSx2;I)f&+{1!Yvd(hC8U(gmMoq z{ulhkqK6(kq*x1gXz?Ss?Zv;r9aeOa`|zR57;EpcNgxgU} zVp1Pd{2BaXi*LXkSNtv9&fUl@p3_EcJFT%DuwH0r2lp90qsKVkg|air2uM zROF$C$;Er%PANW$s+?MU4F0a-GjOLBxskee@pZV>Ozj!~~LyC{VJ+$}?+y%v*a2FO|hkID@DwO*0;;pE|BZ_y!zo__axJMSZ!#%3_ zBe+Kwe-3wX@i%an6yJw?Oz{)A#}jZcVjK{*y9s zYpQJu2Q$!-~GwE0MB?HE`A@5OuPLRTxo==c!orDvV-EJ|Ve>RT!<5o8cZ-p+l*7 zhI?3rF-oN}+`}r!QAvD8BUZf%<1|jKdKEgAYLsViVLUVA9#-6?3bKb)m^7GAbUW@| z!XWNp6((y?`=3}L=M16h(MT#|<%ikN;59X_82`+h?EEwM-E%2$LdY1-ovrxGQcEzN z^cgvSsZ`HyE0(Ra;;-;=K%?g)>&7oF;Zl#*Hmjqz9C#v1{|{; zWxq@M7``cofA(b<)4&gh^T{4R?T-kDm3OhH6AQ2C=60~=W_3IRu3h*k*I^+S&Ao4-l2!6Xvf~D9+koo`=8Z>IR!d?HL|tx*EPqVn=ZJT_ZrHwFJGxe}V^Oyp_)g>?(N2w1V1g z2dW4?|Lispqs~Aw+aCKZye_7ZVFP|0p=aFVgiX;}m`Azc5wl*DAohTMiR=8 zl{Q?)bHgR38!lIamF(NV+Ib^pz1Uv%IiMN-Cc?hSaxGi20^!;#daVgJVl+nIx2b*j zm%1FC5)ZSH+?R>IZwfY&`!XTbGm`r<(cfttEptWxpnh8BihivAHC8A0Bcem?6QKb$ znF!I-DVl|dhWim?e~41AK=c~?cHb#guoh2`>xP0!_ahb}hC-G?zX0G9=JEd!}51tf;`-t?Ga!h>w{o>gKQiW?#+A! zLo-U>c5gK`VRg2nzqwc2jYz)iJJha`8upy=p#`m6P4OvsahU)Qv?RQC_!S;JGw>#Dc zi%~ko_7B^v*nU0EELVQzZmwQ-_3Gux5D5@Fox(pS`U{9L-?LYK#Ln)Iibw?WYjb2tf@imK|@|3p5y`I?Imen2yN$X=F!qv?DgLzd7h{IrcZl^f&p?(K_&$ zQh)m$6gU#OUNZvy&Gs_rPyer1f$c#JwL>}Dp=2+}IpHWq#A8po=q~1VhGhtn!*|a6 z(3Z(~p?8FS+2V;zI+$K=@k9633q9i9D4 zcw_Fb;l}Mh!%c|epdJ$B5{D&fLh1Hds^wdVeRZT) zVrN66f52C5Uq~SrS88wqG(d}5{?v0Nl74hL|6nu#cv&^*b(;Uhl0Uj#4RgQPa0A~eYNObuDsQstGqQ~qw9F}$!k70GzJbD*sPLyyNvx=5Omp9*a1pk|2-|Li9UBVMYFcKh zX@)9(TuFBQJc^#-NDuqYJ@~K-qB(;e6b*aW4CgsiXQXfIIxWWxM=Nd1I)9@kepce| zG(B#Hqdji(I%%*O4m%v*1vA?mod%6tuvVT?MBoMAQm=T^+P z58#$d6fVP!cKZ>d&BBHq-$K3O_c{}Dqut)+bcyDVuEV84h&k?lSR5_IzAa+ecdYDY z#C(dMru(CV7iZ{+)D6!dx9$gVdILGu_5y~K3Cii4k7J(*4p7^*%PqUj^zpgm8EANB z175hBgY*^KX300*Y3JEQtI#~W)mkTjS8Q#b%T4pVVr%nkSXU#p_KKv9^j%<@E2P)2 z^QDxp*pwCN`|CNrRM#uE%z}M?I>(m=3h9r}@umHgcKWQ$o78QWO+diuo8B0=Kd_tO zZ#u-Xe{XMq!c8+R`$G|LWq!og{STXHL!|G9b(wWc{IPU9)?wy2#(yHT(>J^JEX)40 zeTyje;JVtg##;7Y47p`p<`$-POv`m=e#@kJL(a&&z}V4F*eUVca6bY^MDC@xo%`v( z9g^#3G2NkBx438`&-%R`b^B&4tlL9P-QH~K_E1x|H<-FT)YR=JQ@0_#(bVmsrfxT^ z)4Dy>)GgXV>Ncd&7E-rLqi$=DS#_L+OH!#yq;Jc*+TLXt4~I#1nCvpwqCeP&i*%=N zZstrD`AFQ6g@;&VL#>t9wpn4boKD|KnJp~pd8T%k)~-AmeeQgdygTz0lV4!(gC@f| zDeK&U*KqtYGM|4#bjGN|O9`jgkD-!Gv8`4e8;F?-ov+NceK0TOjP%{N&X++Q#$!g3 zE}b{kzS&f}(x_&w^^kP6)(1$f;|Zyi-WpbVb~y_35`LNQv4q2HJ|I!Kfcd5{;5}hn zdJD`^gX!-m@dE&pn&m0|9>*veE-&SMPal{)%`!mW(^+k4US?B6EpC<`U^o{wOZ%I+ zg?TCUd)l}Q@>1sabXJ|4ml7Mw%1bvhl$)1MW~jK8dx2^{Cu%=@GuCWSy?rAPF}yOV z+Rv%li&X9BRPBYT_H(NCd{x^}b5-r<_yoW(R<%uBw<`0TDmp`zF;rKJjM^7CXz}Wh zeFN%vP-nmimi>}ugh@PiJr#ahTC*1%RQeDod_5IDowtWQO)vT?(|u1f>cy)D)yX}{ z#E(i>nTUiGa4r)6h>4HwK@@wp)3?sb-9pa$B^wW1`SM&!%Ew);>Qs52t zF1)K#t7soiHI@Y4P$BS!3V}CN2s9J~E@CnJ?B^hmLdQTL??_M$`%G=9hJ7kZ%~TOT#tP%83~5U9d7R0!KpA#6j1Fhec3tmhoGhV|*OcrDh&>rd~{#l-o0 z{)@%yf4gFJ4m=Ev@#QO4o)U|6%t3tg6gaX>^~RnFubc2lQFi*)=J zIEgc$ToAp|LgACW@JIU?j5q(}jijz-1m66UBS~GOR6My4sZEy&XDWFfscR<-XBub0 zzD2>uAux#E&CuinWVq)BBY4!Epzhsh1P^B1eHRK9M`8~?_cpAlqc@103E)meZz6*# zcuR$Xw^k_l4Wppto^v-O+{XQxDt9_u*j9(!kH3k~Z!wFMJrNn(kJzl0n(tx(i{B+^ z_%{(*-H1%>N3Mexb6?HTggp-Oke$@Fr# zxE<@@b$7yv@gzWU?CbCnF84kp&svO`Xy-HVdY_Qy7>bT3yBk3pdUPVhb)tJQFyS(j zg3 zMkcG+mH&q5I!;!xK2yPUoUCG3GXnKe$H^*ojZ*PCPFAr^T4$*`PFAsN^ARZv+U|0s z$;f0CyPKhPoUCH^)JWO!VLOIQ>|TB_OTnD1V)t=JmGzx)-$mjGC#%>EB1a~x*iB?m z1#hWP@YV_izhM-#BAl#Zw~a)qgj;|c;XD=lmPqG$-T0i#B(4u`z;mp2W(}%29zSIV zLh2SEd3-s$Dw?kD-$#I%B^2z*(Z5Xsf)UL#+p9I&fVY(Gcb=7?hW5`|!cEru7i;#1bQv1|BM44;YJ=m`@ zZ=j0e_H^n}cMmhzCseY?WHXJDs8N{`ZldIUS)@z~-nhNre=+4hA4Kr1^`f>_cO02! zt1_s%V~~Y?z|XsGCX2d<4qKC`#OYR z`wm&-+P@tPdLxMn)xTw!#(xEdoGAN7QgZ0)ZC(W^Vpmd1*S8j5`QOA`o=)1-C;aO} z+QD9!_UVeW-wV^W{Do!weo_j8hgOq4k^#4sRd^C&PAZAHEfkZJ3b@@Q>=BLb45dP& zr&#~J37cIx{QDh5JyH_Yn|Pn~)wig{CGRN->GgfREz?+-Qxi{u6VF(*IxF8}!U02B zKMPdqpC1QO_k^9Vzs9mYqf|+^AVGgg>S3W&h~aqzkFj~%y$f=tS86v6at?`w^)F0^-+|lG^$dij!=}MPYGnL^`ftHQmE; zt%5~u^AUG5emt+xB135hw-r&$Q>}q_BH{!5T4co4CNu)Cg{>VdLM*d*7UJ9E zq4?X3_}*N%bj0{aBC*FBu#D;E#HH;b{*NqDDeat4wcIz^^AC(O3LCq*S14+3 z{4)_XUt9K|_$Na4w#e*pa9sN>TlQuo^O&|U;9$1;__)o;@Q;RDeuY@AkMTGr&Rlw1 zF5Uv(-Hn{J=(Ja`5k82OlJ19uy!u+l%?B|ZH;c6KK8$I-_M#)qr=(r6idn1}-;R_aNi1vxbIh#uFdKhCDh?@mjo+RD~H2H5t#=jN47d-MJ4~;9;>^ za5{Z6RFB;%^%zmoLx$DJFynz&BdY<(O8eK0SREfoeTxU)jPM-8Wn}CZdqBG3(Qp$k zOXyLryuFTDZ}cjv>mX>&OZc?9Hp(LvV1jDh=V^6y=dOMjNw4Z2M5b6mdfXmc#ey~$ba zcZOWpA}?>hceIi@e_CXJu2R3)^nAzo)2Z^9;DVUION0zi;8}+Bs$@8Ih415 z$Xfk|Q_<#+B7=Wt22WGOH%yvEI-oZ@T4`p2zTF91^(ivn;h1KG=-=OifSyXx??CkE zbSSzf6sGqW-? z{e8cCt$ohAmovzu^t9)EK4-pbt-bcz`|Q2;-*fIhr!t36r8&Q4$@M>(rM@+te)LZK ztQm?=L9u%?6i2c|x2DC57qz+N)_0X%*mgT_Wm~%FI{x`mD&I>>sk~bf*{+Gq#*O}r z^>u05wU+`?Vrnhe)>{>&bg7!2Eh&9m*_mScGBtf}Uzh*O)%3!?zh*u@nI7n>V^Lq1 ztyMl-Ncd&mUWX*?-D(mNF7))b*ioMF$x*`2)bY zj}GZ-MC3R`n8o71I;`ktPBx8S_DBIU_X}`13Nfkz43DF zG}PXhInA+?8h=Fgw#+$>ozi&WU0`p|@Qr;QJfCBRzTry0s(5y)iJ7G#mtky*v07-! z@jX&a%mPjMaFz{iIUf7l)L$O+!P0NR{?^Pjh?aAkYIRrt6v55hRI9s2i>;ZPYIWB# z0C(HWO|`n~gsW>lmE2k>n1*IFcW^St0ePxgMY0cCpSMwWVfkScfGUYHr49ZQ$aHL4`ms=p)7;{s2P+^wYr;% zh=pJA;J@2ctNR+Q*SwEBch<6QXRYR=PK(=XIc~4bNdI|a2C2DM(_TKk8*eMsSdR)# zcT3Y2Yrj9LEM22)OJgq-X}UJ;ouT3DVC&KoT-;LQ2dJD)zs<3u8=wCM*j81Z)VKyd z2S(yfZfs-d3F!|w!ir1JlOs!!+l zfv(Db1tVZ}{+o!N$#2I0ZmH_+$Vc`9-W=k+`zFS_3nHA2$(ze}fUe440UOo%GeKip z>J~8B_pXFy&h0s77ylG=Gxr>`OW06RG|k*|%zjX+1#!6Nm|eP=alQyYZ^&NU8<}su z2}P9sh&HC?5y(+?B|Vki)q(QLepI-+RP}YpPWF<=VWEam>oOhoS5B5 z4GS5^sUj~;l=5pCzG1LaVmWF<$S|zwA0cFEdLj4Ng6|{k^ci@s4D?y7fT`)fgS_T* z_}A;hxQq1k^!Gqx+iekE(5%ZaAoCrn@Lv;M>fb>)qgAQG3iJjTGJXV6x9S`J1tY{w zl$@8QVz=r?DftE^vsCg7B~LM-cczEbP-lrthx(Z#AgJNL!eBbqY}Hr>jlzd0IbW@0 zDESm6?@~z%C4Zua%}cWZcB@`N$rALJ>4mB@oRU9t!t^24xrCA@nZIS}lU%IJDETiq zMf$_4vx<`Uv8O2#m)6{@p_l6z_SBPv--$w`#pco%2qdP*MW zU3^sSY@lQzbuLM>wW3TR>6NF>C(W&lw6wup<9nvv>=Xdf&jC|7<>e?T;{v zdLZ5Y4;ZKKuEmR?Zf)_|yz|>@X1CnQ0$7vp1!EYi3lGuuwHmsxa4zj$m!IT97h(Ts z7`p%T`|@czt^fNGOb@JsX}-^oKxP%wfR>}!ycXqM3%_P&%PC~vpJz*+O6m0Sl+N%eiRme7dSSusnx2(+?H2RK zw)E+&tY>xz^p@dkSt9`FoAK5KWcIx2C_y6fW#pc2{R1dA@xj$zNEW{DLU?JRRyiJ+=H= zzD^%p*puBE-YRPOC6j+|PujuuON-0vMVi;iQX-2quL}zFi_*Jqlg zT($Oo)9f?nvi@wd7BjNd%F0|@o~is!JH6>4Bpi142~UXQlM|a=qxasAcgkDwWk3WR)tqLgqQCX26n}qHaNDj&tJO>3 z=QC*La`sa4HyoNgXQkyOmf7XO71~hGVx#|LptU6x@Tp*jYnclRdzt1H8alTSvd}!c zsPI|3;im)6QTY>_*7T2AQRZ^1U~5@}zll9P^d<`5V>Tb@;dAY5{k%tPtDPOPD71G++F$D-&W@)_O>ER_d!)xeiOQ&|-dkD3vwNf;xfh>6 zgskq1m|8a?+pgc6-9x*LRPT2%Uvrz%%b`f+(NOGwV&9cu9>gW3w4lkyNcFyrRnXCt z-n#?8OMu2)M0qcw6x@7lqMI3Wh1~lm%)|wa=^ap{GQThXWoF_(Zgc@p!!MxN_c4S$ zj;mk#zgV4X8`G%H{^-6E_ej%@amgt2n+6$W78ZWNTtBPqd`@#X`>J6Ab#8f6 zb0WyL^lzDy#~RW*kqhQz4|1^tA(D&7G#6|Lr?bEwY={~{W&^%G8)-hMnj9KFPR*NQ z%@Q>CQnMd#<)#KVf5)A1(U87b^Ek8cIo|gz4Ze!d3RtV>ODR<$Z_MLt*c#CTw)Sw$ zJ-=ZzXq1vfzCa^uhd0-k5^i}pnrRIqwx!?04lInbw;Cot5t$4dI9o!6O7@QMB`W>R zfT%><(i7M-G&Q8R-h*02*6xIzyCXYI4a3!rn=JJ3c94O~zJ`eRbWh*^eVhr1$d4mp zZ2)iW2j)&(g$Ho8l^{cnZs z55u;!t^rvop%pTU7qe0i?9z7AM|0(opG4$;V&tnC*i$1@`)0QNo9kTNJi86M^(e(W zetq*tYP&w{mO9OM;VBl@m+GW47WUoqJ#=?0^wU{t|4}D7LZSChf0%`X2d0m}BCX=C zj!1uuNu7eHulm=4WZKe8SX4i#O%H<_)fYkfsb+tl_tyHVAAzt-aTTgL`+T65I(Qmh z_%_)e*Sf{%HS-HUWW(NBiyR?zE_)L04b)J(H9dwIT~S*$&Rmc5{s*Bg|BrcIQS0l> zZMU!V$xBguwAK$hZrXQAt(5wF+{W*|j@T392d@0xF@KdTW+z5wU6D>wJBv~S{*exr zFVE65i2DJ?brbD;tsnZ_SXU^|Qt#RiLzAxs)MajhSJg0LTY4W`=cbydtlP0Je1Ilz zU_LjwO#${vE<2muDi1dL`l`Vx+c<<>i=Otj&~M!Pi=r|a_D;(CEM~mDmU*nrZf-w| z%M53})|)R3`vyYmG<3eqI6OPI;7U9jrP`YQ4%Hv+R@Oe2A>s8=!jE?IW#dwMtQ+s1 zUg73Qzv!m*Q+S!B>{+gFj;EX4S8n=7n0_KMeP6lh`_=R!G5sSo%@xcKdCwPiOLM2f z|LugW<-L6QT-Z&#YD(c>*s|Z#jjHIs3ssD|up2vlcx&N3?5aFFyYP12zh|{D-`h>< zdwyA6eWsf>O4ijUSyy8zkiS17FSju-BUlP!yGf@xTblDYjmbi(XL|pcDQg~sZp80} z3y9q34i_k6{Op$Tw6!-QwsbwYPc|jd3SCd}OScx{eI3iD<=I71&ZQUswHm=#(UzXX zykDM)@_sgwe;6+K{L)g)J8lUq9I z%coTRJ$iP$J|S5@wLI&mRf#t(?7Im0S%<6Oo`p=S8tLkl(}%jAh@aX6-_&Oqy)oRJ zkAMpo#m_MGm0)=f*!^0&_Ncc&r~KXb%xq+>_Jng7psxg*uaDQh?E?(x^oQGZEu#?b zPE)NLcqU0cuBa<9lijdjk(c9}M|}yTdpVxZA+pCZ#2uEJJMw9X*ucc+Hy|&dQFb2)qB_;UhYI!cGmp@Yd#Hd}2^+0iTuF;X;RJ`B0&LttywYe5g?Wxy%n?2M-mpe5g== zW9Da$os{K6h5Fkv|Lxc*Sw2*#zdiE@$4<-gp+fyPGOL{Bvs3lVEDgB~xpw$vxte zWCJ-#HkawK@tcU>%#&n$+esOj@=i^dVH19GDjeOkK5*uoQk~U3iQoh?j+gV$crG!^KiJ_F(gsV1)L zJWrC%`OjYExx{Xs8$>#iLuky7hnw4<8F!LwV}>^C`8E|VHQt!v3%xDrUhX8>+=rh9m*+{cx#c98#^(9pE|%NO zpdRQwz5Ww{3v=I`j`RySNj7(vY8P;lZ0=jCT);`Pxo-CL&E3o2SfbGLJV`e9!*1M)Ee_1T zd^x7B%|)NRYE6F}a>i?O|9IbRkKlIOSdJ+EOAyq9L46*CHxA9@ zPN-rq9!SAV^x3QI(a3SGqw3o(B_A1NIUgb`y`U$d$ zlVr2=sT_UwD*Jslg11)v%7u>3wlJaSvsYPu_9}N~)t_AG_$)trm77{6JwZp7pS{XO zpS{ZRvsbxk8ag@4&tB!uu1cd=@!6{^KYNvnK6{m|W4iBfH;W?8^0QaD6;)q%3C+y1 zk>oC^V#DA`ve}c!f2@i=&y!@c{Onck6IDGCizmru`Pr-76;(W~tQsfDX8GBx+^4Jh zyKtN&+nA9)njS87LN7CQG7Qz^>*NU-Z%r?QgwAJ_DDq0(5!C9=L!wW{N=ym@*DKS{ zT+2i^z;^aN&*Mqrdsr*|)6e6M>aIub8*;_;9SG05E@6?c!_hRe<7BWWD_fK0$FFh|)101E6&q6ZB(kV$ z&29Vc+<8?epbWF;(oFR6tL#RW^K7lPO!gt9m^W|X8G}}T>SB?EI)pgTj-+mB-t!KewBN#@|)Ay>lptc zq`SGjV`;_0B&i;v>y-4{T=`25fl`|i|s;74`H?I8f6>aj&jpOkZZSwE+JWrC% zEv>o+e3l=-%6-_;tR|i$n_FJRb65HCt9tfnWSkxSiZ~-2#!8B&Rj{njC?*rB58t~hZD4wFD(0Wb2 z(M4&@aI!Zb)A!hpCcN$Bj;ky_1gB0H-EoygcU)!B9amXQL8V)CqC2j#=#Hx_y5lN~_!(@fv3M%}Hx;Mhe~+R&uCmA%R&quDcB;APj;k#G2PFBT zJFc?mj;k#G7LwjYcU)yL3(eM|JFc?mj;kyVgQUIaj;k!X<0^|gAn9Lp$5j>|0ewXA zm-s)R=#Hx_y5lN~e}ZIC(H&P=%%Kp56raZbp+$FGWibP%9aijt|3?+wag{}PTxF5J zFBwtf&qGEQ-EoygcU)!B9ao9YHI+KH=#Hx_J`4J|qC2j#=#Hx_y5lN~{ZQp66y0%^ zMR#0f(H&P=yaDpJ6y0%^MR#0f(H&P=bjMW|-Eo!0N1$^`(H&P=bjMW|-Eo!0Z^AX+ zTHKERlZ)=S$|8UMaYoS{S6Ot&RTlpM$yvoJc;(b$BmTdw$lh>T@pAk>yZ9OWpI*Ek z|KDExC;XpLbjMW|-EoygcU)!B9amX&$5j?Ti?%bX=#Hx_y5lN~?zqaLJFc?mj;k!X z<0^~pxXPkCuCnNkt1SK-97T_-EUZ5t?gCH$IofhTkE?W^ei0nYH61;!vT(yJNc6bM z-ba6$-ghznHD*48|NYZ9;C~z4w~f<=RQ=`Pzk&z2~$sa*+q26RkluePGW4tEw!E`Og(ckum`Qz@aKVT zZ)pXCd*pGIZ4(#@hR0R5og|El@lGhY8`e`OtABZ>i{=7X_&_~{vigaIF3_Dq+2_nP zV0yVzDBFiO1}I5>Nv(YZt)rtX@D$4Sk-}y2Uz?BSQWCB%&r>Mdj}fjRzvn`5ql60z z{E}L`TPR~LRN$A?+DA)ROP(h|w;#vEcnW1>hFNf@P_~Z`Axx(mGoPY}r%<-PMMQ&s zf-QoYi@AF2R-MON8}(cU&VahR@sFnleVGa?CP9J&(V#Fm{Xt6ZO^^F=x_u6=(oLvV z1P}Q+s=4M~c4XM)8uCDYaxQPzEF7}S#gVZ2sln-e)cr`h0r6>PHf;Pq+Nh%5M@ZuQ zv?1RjxAKpUTQTH5#`)+^P_I?jEW`c%7IO6LNUt$79{&fYFQ@*z^iz1XgqBysDo<1$ za-);8OJ~mb3RulN_TAix9_$`3*1RRX8?hMkR>b1TszcpDc(U5UuHBLRs#dp;q_;wa zst-YpN39NV2OLIU)f&dHYIT#ZYHflV)l)a)2udFE*llt8TJV$)hwKMY^yrYsVLarq zn;i0Z3Dl@Q6RJmj0nSzKPg4MXb4Yl^xVQBJiW2{R}waV z=-X4(zZUwEq0{jqp3o~&NB(vY)P|%NA~_~|J4|0p)4aLrA)M@^2j#`J3sg~0l&p`-{JPHGMLSgv7T(ath^i+g1G9JDh zBVQ%r3qq7aGKwe3W%MLDX5!f2ry-D&w*(e4<0;P0LKdngqmWbeb=7Zs4A}idiq55eCIovj z*_n>b2uu2_<)KF_h;)0yrsj6vuu$EI;#jlYNKy6P!u6hqU3MayuaDj4-0wD}^%{+81lu12ZkaEh7}^U#6ZJY`B?nkT_(deCr0nF+S%7g1co;uWcr zFL-wb7fWv}}Zj2z8$2lJ)8GdF@AN1KlQ#g{ROm`F22oSBI< ze^L~&cH#LGB=E$j(zKf@}we-LV zOCU^)D;ba~ln{jz{Fakk_Md=a%TRYyF9je^cha4dzT1%-n?d$=1yFI<{{n-pc+bV< z{kHO4+>3^pYHfi<^yjIa<$-%#;Ef1Gt55x^Jn(;9;D{Wy@)5{+qq&Ed7+45UPW{UR za=3$3YaQ~+^v0J5j&p&RXdovV#^hNp5U+K)n9IupKgz&9Pol`0S4FjbHHE1H4ogj~ zKm|9iXUItUK|QF#8py{&-n)v0Hj?h#Jjkh#JQGy&)QEjA*>5h-Xx9rc$$rh-4S@{1Jv+fQ%c zZ>3#FP4RFjxQ?34S}>-gZpSU!j`|$!sA=G0glT6@79s4YN&WyK+EI50`!ZSSsL6i* zyHJ*nn#w)5!Hjg)&Wv=_B$p#ZJ8H(;Kvp_xvS;7{q;}L)epFa?)@1u`ccJX8$!-Cw zoi*cr?E7G)vnKoCJ;(w(YnDLaRyZD)%Gz18l2V235a2Oas(B1<1`kmY>(4)6z#a&B zaF1voE!xjOus+g0n%bxDpmrU)n9Jbl&3Dtx2$vTGG~X1lo5-$?*ga$~ir7DpJv(B@ z+zYlTVn0vz5!Sb}{7tZh5Giu6y!i_#c9Ac<5A4Sx_DZtPN3ph${cXhVBs(NZVn5lR zMxn?35XF4K1@BkOi@~N^78P*B9Effi=njvfZa`r3d!uA;BYR8~`UkR$qtNO1gFVZ! z?}4cc$*zdlFOvPFi_6e0WIq&z{uyklf6TLV6lkD8Y{)D{w#M#PWb516rO& zEOy*8%LB)_SThmp$GoYyEKf&(Da-efjmz@0WaF~@8rirke@r$m%gh61WjPrveqMki z`NI@bj#nbUl;e-d#^reTkHN;}_|~0p&A1#*8O}n8DZ}@ZjmvN=*i_41y)i)su>d(R zW%#cQY~77OP8LkSUIyS5!mS8+x&~Pq z#cFk9THU|E^lq5$fWik5)_b}OW9#bOCnB3KkH}Go(flPktFwF>+3!Z|eA;_PvpN~} z4$-u8tGL17Q#-%*~@9@=Pm3?^96 zKdy|y4Xnp2gzYv@_~;UDfzuZq68D3|fK)ytE`jk(YT@E&NW2$?#Pv#h8_v>%{<*8; zA#o$Zs-_(eX(nmu(v3@(>NC>kL!o90(>ln~rFJG1{tj2&eEfSEt8YM-OP6lrDX!+y zC8JB1%-eniksA>+=Tbit>e3}M)3JW(k~z<@e(92#<=A-Xl9|HyMcvXRGxZBF{~#lf*a@{#o-|R-KRHPhyrpWBDMbqb<)hG3z?eP*JaMXF4I$1FD#W*UY0JTF#vMm z!st2{k}SwrNHRUQw=7vWdK|k8)g&V!+4q3O(8nc(GN2UIRJI}jy#!)QIR9grkC#oVG?u31gpx{mx#L@1S`i!a& zw9kTPuqS*Q0(!@q|BiH0eaFJ45&n_FN}oF)5i_Yjd;tGtjhx2-PM_Nh%eO**=#~F> ze69iaEPUXY53&)}t!~ZL8@~?_?=Chn$CWd%r(ouL9eNgPs4u$iY6X4mP8Y zIM|@8{_i;0$0G;xcVFRPJ5Yo<->FUcx7UkoaAkfee85T<<@SzSny?E4UmNMAMr?0ICRHzWHZ zSnbcK{K=oX(UiM>&WsG9B%eTtE+iSR;bE}Sr;)u4tS%&}JmzPP2&lz5kQ7GU7M{v^>`rk4w-UkB7XuVLRo_)JjBX9vZQqA-m4SV(5)z?}*rMfGu!^ z`VmY#bjRu&y(M?DHw79C_yB^xg~W|EB;Z|@@;FWxRC8!tSr0h=mZ zj~x7=JO{T?FV4X|WaAwCfoz@KQdns8M(WLfjQn8>^>#(j5R;p!-+W2aP zdfV0tL18-tKP|UWy_Y6NA0cZ^F0XBhg*^~dBePc6$1zEq;fCdbn7`$U=VS#` ziW@brMrJ2~F{9=Jut}q)domS2C%g5(P-!y%XUGftU_?eu?$1B>ORzF(lD*--;a7>z z$rfN~Xr7ZDiJb)Voa}A?16D>&n%Vr68zvK;lXW}|Gx2k>fxkw)_&M3$XTZkK$u|BL zW;kN@ON*o~H6 z@tka@i?wrzq&FV@qVzPb3V!DTJ8&b+OvQ7ux)&g8ovDEp&&kFxu+ObX&panPox)V% zNk~_~b@bFy_{Ti4;H*w4T6bFwi<9`Ky( zd$0f-{ZJ9K@ygH1I*@zqq}eVXa`D?X!ktV<{TPi_ZqWQO&E?GO?tluH5p5@qhhp>7|EAC!jZrBJz z`poR>AXC9_wzJb72htZsdV_n(mM=F@`@dQ3@%s$6lhzFys)NKbVlYYVo=INtB79D| z=ih<-7Fp?@$&UFml+hs$xe&?R2B!C8sEv9s-$STustjWx;6wDN`8^O8KDQm&J&Kj_ zG9si}*C4^C3^Qw64FKktk@J1S75P)s7>XhgSD$hmdZ#64DJ-M=~3& zZkTdp+aU1G?iCKlr`pC;2wH4ts_h*W!EJnr+p3i7V+fuK@8UG0)xD@8Jr+DfzV;$N z?M(eWjAT+j{0RQ*TXeWx?yoIFl1z3-`tB!j)lvoS z_#uG0BgN{DH-I$mxF4*(sKIE)9UU9Hqhn)tbgXqp(+6D#LuD^&9DNVnkz#-Q=?#~m zgq%CF6>Xp&i91rR?nv@}gs3}`eH5&^U_} zXsYe>O8r?Cf^vPhF(VbBMm0o7^&hdt#tbIo|JY! z0(SV@k%pc|7iTB=q*wz@J=|IOJqXpvNkD=L}rC}ZQeyCDsd zTCZ+Szc3g@(7PwnV3u24>~21vt-Vr1AZ?4J-I&ilnj_p7ZMH`#y3oFwdB^nAyLL?f zI9@6hGAFclgccjDNwEz$0y!#XOc4wmitM$cUqBT^?dNEz|wa_Q!D z2WoEU2$TfxWJrUEnA(vz7E{ZEQHQ~nVULQVcsqWoyw z%HsDUz7iRFOq`C-El#LO1vTWV>-y9Us_WSex9Vi?sCi{cQoO%dR__1S(`^fg+eN4T zZ#|(du6#NTTL24QeW>0xmF~VlH24P52uqPuHmN0eJuUUHjU|Y~x_58v-q4*IIZX=@ zVqvpwk7y-qLitz`ePYbeNFlb2_9Bh2#WzCy(nA_yn>4~cQIl}Zz1{nIUukpw;#Sz7 z%`f!L?}(_Oxp)Jl`4uCnYeoYj`4vI!$+j!RwrJ}wo>WohLw^3hKA+44F}e4+}`eT1%>Pl>yZRBBQjdU{U@KQ$J`<$PKki6!+` zpOQB^IW9@OI~Ir1DAx3Gf8@HE@+KdTbJe!><8yz0DD1S!`-V{GT|O%=UoS1DyZ7`4 zX()}p1vS|YpoeXnrb(kI`>vtccMUyl^JfFrVVP~VSJYBmIkO3yv9Nd4tXyb|G`7~b zZ620kPn%KHCeh^Mu1$tMb_oM*D;?xp>0q`}H0!vP4y|mKN5%sB#jxa7dQ@Eh)N%vd z={-lghJCbcqvCM*@uRh4y?G=onGv*PBYQm#c+n8;EtYi!zQG(DJ8JCeqhq1B$aZvG z?BTqJF)b*Y<9!R%p&9bAu}EV>c!C#tgXkc<$miumpRCtmqT{_V>M+n1V4N;*K(^IX zdl$FOCvIUiGI^|xt4;c9d~HDHX<6^-_3G)a*Y6&8^z`%w+k6^r^D(1k=VPTCC8dQn z6F7SGlopyVZ$p)%qHpGSV8}=@(#M%OQDl`?0Hl6P!q z2fHKUGQdk1T7Xf*Dsr$ZZ$`*=5NOkbdTfoW$81WyiK-{XjX|OVLzfuZ?4kDQ~&Qmp7-e89 zha5e6B&D3tPrZsFvz^hap4&$YW7Au)PwG)VVh6Tkrr-iq0m-pY1Qq3xbJS>>`v z8fYskZk{-Jzz(c~;}LX-+g-rt5&ZqTeyiLqj@0H-){6{NliH2>Nr1A$d!^Z2kLEav z;a-f}j%uVIA??^#(sb2`@1M|+tjCWkcj;r}u4%NNiXZ14+068#JM_IyG?@Foee@a7<+a``ro8MNahbgRdY)^&cg&e{f2AG-qGy1N~%57_K6 zQ`E}lVEw;*UQB<-?wR+0*AU#2R{X!0olX|~s4O$!sPVP3SRY?H=$$F}tz8~Y_wtXu}iP9FCU zW31^|Y?jA1y{O^%28}teZ-i|1Xf(1SKG92EV-Z;=1Ge5lRHn#yv?%uNvtrn0QYXiC z7%zs=U$A|0DXji~@b($E#qu`#`r3*`32|2yYgD@@Yqpu#8^|g(ni3bJHMt>5#++!7 zDjRy*;xMN=$^OV;N^8`$*mA%36Kmb?874!}Q5=GX$4>7Z8G{p2HP#L`DeJ0-blQWvKF;^x z$moGRxb2qBcKxAj*8kt|5Z3%b{6nX4&Ogd4_(BgM%29SUB%L2UCfa0>DU#o) zk7o7kenuqCVtij-F>NWuo#8Qlo`R{2^oqxNL$P~~_9EZ?MGG&l!yKUJmf^|w#S|W| z4MXQqWgD8Z96BLxaa?{y6Eyal*wFOtqVs+eOOj6a^X!bI#`<%ub{B3>pz}=$*GT-P zgf@}}nUrAj-u8Z+(`XZBOL7mgI8zCt>4USClWwp%o`c|th@H_y>aL6P+w&+sT8(Em zE)Hn)1SSg?=x|`+Gnz3#70ECJy$%iQ^bTn zu1LE4|4JtoKM3h=Yr8=ngs>BfhGA1-ajeRfS?nb&{v66X8qk`pZ}E9#v}$v!Gz@@# z)>rHC%BwVSmCC&&O|Rj5Y~wgvRUe#_+V=<>z}b>RL>X&AF* zq&&(?F-DhrbH#jagdgrZ8;_G*)o(dqc_wb@*H&nmc(iz+Tb4af;OKc=oT&s4jeV}m z`-`I9pBDTKr(=&e!jYqrVgFL*s9_Tp3Z@zTm9(=QOTcx9x4msLLh{w@rkalBwUm4Tw<8SeC>53yCHyiuR^MI)LcZKpA zbjRgSDTc9kKC0Z2vHD2btEazek4JZ}eCfkRvOO+0$=LK!O^kMoZx3uGqrA^2ZruAO zG)A=COfgEOY+if7hJ7?aj2o|+HQMZ*sM*sICweIEA|k)h`ro%Oe90nqj+5d>={tVE z>UTRP(kM^1W5t1wz~j=#BXFojvk(99+s(|`SYONOlI<1`*F=poA6?apFO#kQfRY98fE3ADNc!vs!u%7v`ZuG%RRn+ ze(;KS^IX#nrRl~msJNzB*)r{{X`trbby|b`fa71@f>g%qA)GZ0wX=XD{Vd=W+oknk zKTXmm#@AI$i{tB9rrp}dX-Umo+ay~X#*cVnWfR24wQmD#(^%=ndU1<;g@`QC&To_%GK*B)`&FY zNw%Syw#k;sS5hKhel44+cl`r~QRkYKTQlW;&h7PRFl@Ab*5v)Hha>R5U0`Q}IXfCQ zmo-J10J_x+M?=>T+3@f#B_UpXy8O9qb=k@D8|!RouQW(TL#JzL=G{rQ-ov$au?zK~ z92P4#=wgqE9ne2V(&1xxJX9SWyBmf|@v@O#Mt{T#C8^bPzHJ^2ma(s~^_5NO;+$2! zA`&+@+bAlxUdr2_-*)lMvAkpP&%80x#mSEMEy^@a7mA#kH_3b+4sqKY*@`A)2M(Yb zid@F;kYUV}R(q;#wWq~($X5H-xFk{Em2a}Vipj5SOnS z_W4TBgv;CK>tR`@-of@TG_F*#2e#t4)p;*ub3DlV&)TumS|{782Mjo`%AKSuJ@BQA%cQ@&a-Bg60T6iIe$RH2f815+^SZN2{$t<;$zV zb`m#4$354r4E2*Z?@o})ByJcdaYwmZufZCh1BYKJ>7WpATb1>ce0$K&%hYXQn2vT# zd0)$y2#j((Gjq#~xceRL2MK+pfSx_ZjyibNNyehFUW%uoeta@(q}U|)*G=<62k&P( z%;#ImTN~zHar268_;pfQ0d&ah?qtsHqWM?!L=}ZuHV2E1mAxh$i%+eb!uie~iONvG z?p_Nqm6{w61%ByvdVHsNP1p{Y693FNiU_9IvE{6|B=EtBSe4daRd*04A|6-kTU6Pc zF!J=uIbr33O?xx8{zKgYlu4i4{NtqW!1p9ku6)>A`Ok&KAav7Bd2k^ex=)a98vI+~GDo zMPcRp23=?^90n%~EHHuo!K! z*v1~s7hQ{nR@pL6+FNIDMY4f$lSPZE^VW8-$AEq~s z8i}6=w%GyCv^)F4lOOr|sar-PUw?TFap0psj)(_;eS%L3>08(mi60mav3;iW>oS`& zqYsB)(-_|Hb9O&l`I~%ACVnpGYZEU*$XvpF6te+~HR_jeg(2{rsQ%1U<@cE0Fz?oJ}_F44RXM zoP*69bo%EedG;4AoxNV`^I5hUi{^oqt1+FM!Fs&k!nvXrL@ccQC7ZkPSh4K!89g;; zr>*~2_Uz;5`3HaB2o9q&40&PK{pd4(DE(@Fou=+pF)sP{jC6Fd54v4dt6aBh*mUjh zz5UwByjLU(Apf8n(fLEpXfhSMJJwzPRyll_mm|qmZr*qcas0AXS1gWRZnqP+4nJm{ z9Ix@TH$qwyxvz7I5AnSecjz^T&N>vMM`>P%#o;$^qJ4b7dE?q;(&kNE$MPF*ZBh8n zlfO&m{k7hUv90c}w$op}imZHgw>77nh)devs+R3b9Iz7;y&CAfEuL;x zO!e>zwX__s>8G4V54$ntV^3!T$-y=nbRhBj4TtrpoN`YwZ(O(`!|yl9!8y@>Lr>Xn zNIWoy9Z!6EfZMNYDc^61-@S05ct0xMZ|Gz98@RvkCeyUp*RO=#8&d26`fGzmUnl#X zf9Xbpoay10o)sOnpIK>#>=&QP`kxY(xd7kCH|tftJ!Pgboq5C|%%|S;h*#|q)5i+%s(O0*?hc?wKH8i zX!g2&sCligN$2R6AW}A$kc;Nn|JEr~U3<*0!sGNROcCqH|I{y%6 zf*r^Gb0ZWB2X4H#|+|@-V#Ahzj-9~+PoAllB zSre`kHeD?{e)$n=v?YuespBrXzwM$A<#*h6e=B~D!snp=g*UjPOuMneo8)GEVsAQB zbh@#Y^*i6t)V(V@-r@F<#L@mK3C8P+cW>M|O(OHJPn+(YMQ(l-;Jp$rsQN6Hy>UaY z^v_F>t-n35^ltXI`oqm=e(3u$&Ne&oKXc#^XQgF+8h3;TpB|W>cE(X~?2veu?K{no zU>ia74w?01@9h`>#IvIx==sU4f70h%T^5skLrj}p*=8nvn(u{03#eByrHPYx9rd(t z`gH7if0<9mE9%%%w0^QqoUn#s4_mQ{dOi5G-S)FTc8T8t?B?g^Z$2UBNEaW8@fSWJ z<`kjqN20cy8yI&$>}z=snT6~Rm>xU!NWYlV`9l1I>ezjKlARCS2V2S8Y2%x} z96rb|hvO%~@i5!p4zqEkh2=Hv4-e8h9AG2)%43hhU-Ow&c*4O#omcT8EX`k+<5>JO zfRp;f?HX>@pyj;2&NpVmPpBYPV`V!}YN5X;*AuD>2ZLx7PA6(wdE9$gzR$`ZS z!~A3y>pz+7Mk_z}i*b=*_ME(k^e+c!hvMI&E8BSKbX}M*O^;^UzBl6fQ1#sHqMDnS9gD@O+lQ5j^X=hI)B|+TFY1p&qH}n@ivy(em(v z$Xm@rNc#F4_Z27YXSLZEx&4B}HEqL;PpP%LAw%f@#+79gq-@#forW&)3fmjjq2qSs zfBUEIY~0?O)|W<^O1z60dl~0Y(LtK{-Jfq*X3-d@c%1icJI^;SiQ06rjFjdWy$9o) zMDiY@b_%*F>VIHl)~tMh8Le5(?xCz`xpx>foWIuIp>Iu{9s3;TSn9taxgs0OJH#g6 z<>7S)Uxx$0QHvNrxje`A6V^mu4K70*Z zK$B)ty$r?cTuRx1kF9fB3MxafT9t&~BWp2Kq*Rc4VWPc#6}8y?)z-LcLE*(^X)70J zVR)xzjo=r{z6Fr&8`lO|zNBmBMwnxZvY&P{D`BOu^Q!twX2z^L3^G!~I11AClYRz; z-pb9OeA_8&6ZYmSTSfWZmYww)_fTc+M8pTbMZ5OT$m7{=y6%Uw*2t|K_Sl}nL@4+W@3p}Xmht;ccKPUkbLFD?^DPlI{^gb0N%+W#c8E+R?}zltsiK{p z`WM9AB)~Lh>7US~b>>v|e1}b&32Bq)qmHI*yNzTk(EF$A^-FFj-cQR?M0dl=qst!Q zTh9OvzVW7kX>W(EhTTlbcRzS%jl7#FxsTP@8u!zFt*Ito<30TJsQgFPk-NCx0#weH z>_j5(pJV#Y8YxI+vAZ_4;=Ajza>N;mR;R3fZB?QFNvilh(WnuZHax9ervW}Gi2C|k z>Sv>H?b+W7{1hOxLZ1=TwH5o;i*>);Lpe(Ue)daocZ*Xza6mLcQi4*)DXRV9()OfF}_1#TfJX)UAI=&SPK0DC)Zz{On z#}8I0Uws7?W4M`6#X`K7YDaW)LY|yi9?i}<3b$%`wYuhA)6w$ziLET}oSD<$CjI=1 zwF|aqobM{k#_~GUxZ#RDpr7DC6*H`N^rpq$aU47x*VpvB^ELfeSC4My*Cr%>Y0PNo z!|=H!#I^myo8|7l>{e0ktQAx8otArC)LQD8)k+!1CH~6gZN1dLfsMYpo9#sXq|7^g z{PuP12;%gwCqFlC563os&M&;t&!g5;UfRa#5zqKKE5^*=SZ%FF8KEeDX(6ZqIy-!x zK28$jHCw?ex&Pm8b;JeE@;B9SkWL3B>?d99t`e%l7dV;#OW9Sxo2AU}MgH%X@|#2G zU(}Ven}|E|s1rdK!v6P_o%_vVFB?Bu2XD??=s4zi7@mgxMKi`j?^IaoahK0ZkX<=9 z7`B*h`%p&3{|het+7&GaLX3y6RIte_^1q=~PV{twlMS^oHL3?K`_?3+FRTdxo zROWcmR59+DIk7u167XN3-lv}1L5g5RYw;^RVxMB1^sKHpXbI!uypN8EcfK9T8I-6_YW+o$59 zE#fMnL*f-G_jWy2q#G5wl|L{FY2l)bc!t<25t*jdec_mN`-`|JBi;{vRMz$s2^zA> z0Th~5nfN>|r%ZyDtny2xbbHFnfK5V&L>jWXo!niRB!3ompTouYM5Y5e(j5W5q~XM8 zgf0;o*QVPJzMsm7!-Wosv}1Lj8kuf?8W&~6Hq|B4j@8|Y@NKF~+%I%Uq#dh!HTX3u zBi=1^NTeOBJ0JW4l@YHJxAn1x2TMW7Zn&D5^2ZkK964S1?~BWm=`*` z#O4a!eF%R-b&0=h%_DKU&;gP8M;boq)Q#Y8RvGbjp+h3=SY02<%0P!n^0kP& zPU91qj@6w4eyWBOuf^r27bF)5IP{zkkx$}L*p|#JQABEJR}Acx{o3J zan&V0C3HZf9cyh3!MdBElJ0Guk}A(3{h?vk@j_tZo3lS!Kk*LI*_JvAWM4j}Z$OWyB`cCDM-7-G}feRG0Xy z&;gNltnS_5x2lY|SLhOvcC4;aAk} z20&a)i?~AQ5^<%8-AaqEi9h={m-h%e*Wx#f!Ln7^1-ObS5f{QZZi$aG) z+OfJmFIEQnRoC0~NN2sKMcgEGNM!zOdRKs7tuo>|p#viASl!nkzpvWYmm*KgG+)G3 zLWe}&i_Py`@bgqgTq1Npq#di<0e+&&h;xK45oyQj_5&ZPj5tB)kVrdLw+ehlWyE%& z10wBM-N(?T9@ln7Oi6g?utIk`!tYUC;-f+bMB1@-ZvnqiWyEblmx#1ub*}_}mCA@W z3mp(?$Lg*Czfxty)j|hE+OfI|z%Nu8akUQG4T^WZGb#FciWrK@p5%&ol5T8)FPuru-7wAO0o#=*1@+2AT9W(Z$4yEwNp`q0 z(OCf}<>9bpxT}T}U1A@`(kFC0CH50H2#ItT>kAl%7|NpE)i+R>L!&i!V~YU6WuULo+N|aH=6G2p&SmmDZc^Bw=4H{xOBVX zlU>O}kkkf}WS!L;=lhpvdnH~ibU<9Aa&ONgYNLA zukneqgf0=8rnTDwzD;Gsu|k)K<5cd`erX~Wd0qxA2wfu5jHwj%L(va0X2mDNx5f=+xBGQi49Swer%7`b8ULr!wLwp+h3= zSltZx8kG^-gbs;%K1*;uw{C-Df*cHn@1d#Aekc(vB^M-3WhBb&1ai z9S~{9>TUslyUK{Wgbs+iRqpe!9{dKC5jP7R5NXHSy#oAdl@YHOIv~=H)m;jHnaYT( zgbs+bV|C|%pQ|$B5}^Yk?O5G2z)w*bakkI_k#?-^81Q3NMw~2kK%^b3>&wH+Kqn3u z0}ywh#wU&zIv_GlYoiH#pfX}8bU>sXtNQ|0X)o$Zjo6^NMB1^s+!=XNb&1al9S~{9 z>R#O)vo>6m5qAn55_hTG-~aqGuuFuCy2KlV4v9Ca-0Qw{Iyzu41I`n=M5G;?hlioN z2Nz|;7ljUpv}1L>eJcZs1L5E55n_=q~wM*O~bVy{H*2Wd!SF4P8qtF47cC7Ar@Do%Rtx^ za+MJ`2ptk>$Lh`lKVN0UON9=Jv}1KgfG??xI9KQrk#?+Z27Hamh{J^riL_&NAHnST zQJq0MRNX2d?O5IWpm)FO688ul5NXHi-U0qjl@WIc9S~{9>fQ|g7L^fi7djx)j@9LC ze~rqBHwqmPX~*g&`E*zJq!L?al3^sAsC&tos90Rg7;%%(CE{k4dwX-i&r=z3rO+Xf zc3$b`5FUD4ucX^)K}6 zHRGZ#algb1iL_(W^O39!bYdPl(G8R2NwTikMWJo?HeS)oJ2QMcZvGA}2;$>H2SgT< zy=kAAm33x!HR4{W@rhf6E)kigwQ&yknJOb*A#_Nj9jn_(9>OGfk_@&Emu`@hUXrYf zd3dAQebwdLfjXb4^-i22bU>u99D+Z*>M{$F&Hzn|I6>%;$o$znJcS|jX&pw1{Up3Z zq#di0YIIAU-N|iOBrfJj?<=TV=%6 zLI*_JvAR{@Gb$s_6uLyD9jm)#Iz}8^lo3;^>##z1!`WE>;i4{av&1VAX~){_q%OiF z`IWGBmD(k)7dj*|O>1`<_~j}it`<5Z(vH=g1AeZ`h)abIiL_&N&j3F~WyIM+2SnPj zx=Htd@Wgu?jksepK5??pA(3fXyU$I-rYL3cYQr zOMF!5kVrdLcOCfaRYts9=#WS|R(Co06)GdH6*?r+j@6wGeum13%Y+Vzv}1KUDYL{G z<oVtMQ3bgbs*PRqpLAco*si7t+OfJm<5mVbu^>9p4U^;{(ixy>5zi4iBr<!SK|@w~H59H?W#aWhheR5(x(mTyq%z_aLWe}!vAXAgpQ$q9 z0--}9?O5G0;K!d7VsNYM!a9>kVrdL_cZX6RYts7=n|23tnOg&LsdqcBy>om9jm+Vo#?G` zQAQl7xLYURT*)q&>@j_tnO&=V^l^wL+Fr5J65*^e4EOMql6BLv}1K&nuS@J zmjMexheX=3x=%uPKQ79MFA5zJX~*i`4E`3C5uXscM5G<7y8`@5l@YHOIwY=Fx$i9I zf}f`{;&Pz_BJEha6To+Cw*jJQkafJi$w54VEfq%z{&LI*_J zvASG>u2UItqtF47cC42h^ukAJd>a$s~muDRvB>;E@znpEm`HA7}Iy@xK3;m zR~y??B&OrC z%1IeRcwzxB_!tIuT#Qe=7RFJ{+fyW%sx|z;M^NgxC?n2C1SsE_CP7P9c?}eTb5%Lj*Bwl&4}Q#OoEoI^4t%jgT+M|aWf(~ zWfHVxm7Aats4{Vm&?O=bS=~+wIngV&EJKcQF+Q;Ywp=DiFi~rGJrp*mGI6ueA(4ix z?&aWDsf>8N&>@j_tnOm)OH@X@Oz4nEJ63l#_&F*gE)qH*(vH=g1pYLY5oZY<5^2Zk zjsRa$8F8Y}0g-mBZVUJ}l@W&v9TI8B>OTA-JeK8Pt1F3N~? z5*`w1$LelD`0c7o+$VI2NIO>dD)3jUjJR3okVrdLcQ*JrDkEMgbcskiR(Cx32`VGb z5;`E#j@4}g->x#^IH3a~?O5ICmS72ji!x%1goi}hvAXLJe!c1vpB1`9q#dif1pHE! z5!VVG5^2Zk4g)`2WyHloheX=3x+(H1BMuchB+`!6-TeVf?Ql^>d`ak#=h4_( zKg2~Du|ai-v}1L*B7B?b5+4^jB+`!6Jq`S1l@ae2xJ1lV#7U}4q#dg}4dK&Om$*yl5|MVS?(X-&E-q&mI8}9t zv}1M0AbhOq5_bt*BGQi4tq0$rGU8~VLn7^1-N!CM`QxIDSf{!~+OfKKApB0%B|a*2 zNTeOByY#(SzT%>ccss(~;7x*ttnw5nOjTv#5}`vP4O!g=@J%Wso*{Hdq#dh!-$FP9 zF3O1Ys!OCDtGgcI8&sFLL+Fr5J63lw_$4YMUN3Y=q#dh!&wF4C7iGjn5?&(Gj@7*a z;j2}bxLxRwNIO>d4DeG_MqDLyNTeOBI|6)3WyHxsmx#1ub(_EkDkBaTIv~=H)qQ#a zUPZ=58L>gaLn7^1-CYRZt-8dggbskBJEh+ z<=|JSjJR6pfOw_KeFr=b{Ct%WmkAvZX~)`~3Vxc(h;xMwh_qvM$AKTOGU61W10wBM z-NE38s*E^R=zvH&R<{{^US-6ALI*_JvASG5zo_d=VxYQ2+OfL6Jgf|Km?Te<9Y)>6 zrCBF=I9$4is~p~F`8{0a@TOfj^kHm6Z?y95O1tRFy#**{_hQn&Mx2HVlf=u?BxuMc zc>mvF2MiZw#2T+mf|jiEIw)MP%EbF{!SXXH60~HM=YwCMGU8fXPMHKPS>;jSN2`oD z50_IWK}%LS1HMLO#1by2OoEoI@*}G;rN%{>L$6!~f|jiEEl}L3%EUdmoMjTUWR(|# zU!pSN&A6O030ktsW5AD98F7)&B_a)3-4{NMi3Bdnh@(}PNIO>dPK4j3y2R&&E)i+R z>dvaiE&?vfh|daLB0i^b??fGlJ5l2k?-05~WSZ9QQ&(WJiHkDg1l1+dj@7*Z;Ww%- zalg_w5vReJ%LNIhYL(A`!W2~|K7`9Dlb|K5ynhw$85d>5$r4^7(va1C@RKlx zi!$Pq60bz09jiMJ;qz6OxEq(t1PL0l$}e7yEfZXn5$Aek60~HM?}Wl#s!V)A=n|2J ztnOm)OH@X@L+BEbcC4=VIxBNIP6|kpb*g+CQktx(5f=#^5}8ArVhDbK%7~MME)i+R z>JIn>76Z5_Blbf$GVx4`1Pxi`XD>qo!$lb}l!zrF4O!iO@W)VnlQ>rB5|Msub+^IR zcC|}ddhqL2M%*NHNTeOBdkOeURYqJVbU>sXtGf{V zMJgk%6gni*j@3N}{7jV*7YH2?X~*hL0NrX;-NutIki!gs4K@o}L; zBJEhaSAoA;WyGCA2SnPjy34_@P#N(`p+h3=Slx|R;t3}%%7|Np4v4p_+?O9`E|;o| zc#F^_BJEhaK8}@vPOOV35cf%qPkd46koc0yy*-bIVz(3BL!M!F+Dj!F?viq6CDA3r zyHGT{wRnj8gbs-;Qd>l<$~#m>+$nTGq#di9lnI1)WpQx0bh}b@@o&9e>E=*%hpv3M zO2UmsNkyL|dxI(`zlf4_gDB;$)b(y};}w5_)}>|&<;S~Xxl7qNe3qX%LbtS)VG~KTFPFHlhQVxg9ZddZ~M$T%80FmkJ#am#N(MAv3_AqcY-bp#viA974YndRvE} zo7k63MmlF`TEyu>2Sn!2+U4YKsLF_^2^|n=$Lc2K3*m`*cnx%4bvYcaJh0A}YuOO5 z7P>@SqjI0NM_Z1dyK--(BpXSx&g|a(S?sIgVjhS)g${_jRPOD0tjKR-9%dl!IU1k1 zS?CgRi^?N=;4>;CP8YgFq#c{yva3d&Bp za8X9A_sS$_$to{~!V*;`UL|yiNJCaPx=XWGLwI7TO+(!28lSjG=n|1>TDxPwk5w6Q zs?a4O?O5HewJA7KZMB-qtOoEoI@%p&A8F9PNB_i!uU7ran1D%+MuIOHdbS~Gli0gz7iOio(ZxQ&# zDkEMhbV#Hft2+z)Y?To&5;`E#j@6wAev-4RVpK{6*?r+j@4ZPeyPfcmkAvZX~*i$1V2k< z#Kl5~MB1^s6TweX8SxyU10wBM-A?K)Op=d4+>*v8b_g93nWnYd4!)nth{J^rh_qvM zlhQ(XqVFue4)=?T@rl7&M~B2_p}o1(e)z{z>LbKO5-%juj?Dx8`Bv2>J}Goaq#dj4 z6RCwgq9VW?>WYA5lxAmXL%p4c(61NFm zB5qf?x99Ot@~{GNS89CX^+Jb4rfF?-#qM~-ouKiF%Y_b!Ow-z}2j8GF;y9s0BJEh+ zPV$iG51r_SN%Gz6Fh|G5w1{<@2O{%l^Kd)D?@(RhE}=sr?O5Gq;Fqh6xJBrYNIO<{ zHuyOzBQ6y>B+`!6odo_gl@VtN9TI8B>J9@xTxG6gYgzr^d;tN8DMB1^s_kiD_GU8)G2SnPjx}D@Vu~Y3tH}T&7%DQ1vdZ(?&rZ+C$ zFYz9sL*fpV`*=@$0SyNib%~QCJRs7}E0vjZc5loouZFQJ)i7}%E+{{fBEeLx^7iYI zOI(x@uMp+!DH60~m2ZW@CRHYG6FMZ)kk!2w{92U}HwqmPX~*hb3jQ*c5!VPE5^2Zk zCfzZ@!zB4dh`UJR6E6`uBr;8FcP98*DkClwIv~=H)tv%+CrYx6K1{0I#vo*{IJ z$hg+l|7Y(F;H;{yd*M6x4kI8Tgis%)6EfkU&yN~FLa3qCQeugv)cC9tI?UXA2N(pM z8OSgYBm{`D)W?(1C` z;YGrm2+1d=eIC!m6YjZ4m~*rSGqfC^9CoyX&j=qw_^b=}`hDcr;QzwOya*1vG6g3%`V*YWm7uhnh4=lifNp!ls7|pH4VQxK9>foPIz;)FeKLoDVrE2;ahK#6&1! zoaIBmjXJ=|Fv0^O-dab5oMPg;_F@8xlVODWkpP_c)Da=4n0VwKj1X}$jPOn*0P)T` zBIFbk&+Ww%4=2M2ha&-qU(XRCrCCKxC<0hOi#F2coSi> z3-|o)M;my+wFAOYj+T&oVi{H-ex;)&+$+3^kbGj=MYvz=!U&fOA45n!F)iESWEVzw zz3?%FV0$;nl)GTUEvPAHfg>C-WlQDtV?8Qoer3 zP?hgS@Y>|~67Cf~hLCy2d{^Lpr3)k6AbboV`NXu({W0tsC&LJ5D!z$uR)%&x;x{;2 z!e@my5t2{L_vGX765wPQVUMFFB%he}al{{Sw1iBH_$IIS*S>}Kb#XEc;lqlbPWXs$ zPnvrI@lQHh!dHclAtawTU!N!ri}Q`cYtUA$t32|lcX<&W6F!}g^7VsnQ?>jK9LAIi zC({$=#H-0*hVRjDB43=OC45Zjnh41!mf_Mv@Dbo-7~v76n@&hRF>N)u5MNafHE73F z3$GS7gnX;Y@Ww$5H*vDOgqKJsO@!1@KlD(Q?-cO5%<(0BR(KQPb1vMM-@`bs0qS8O zb@2mBJD|tUxmNJJKZ1h^Co7roQfCl^G?uvXuRefhK2C-a&IP>{jtCjW#7|?A_KcgT z5za>fBPK#lF)?R!lN~YPQ#g&72sy>Xv%iCNIh+h5Y!Ti>Sajjuc1PiUv;PT^w+$tR}uWsJjshqA}vE0Ojlm!5E= z@Fqg$8PhJp{bCnJxI*|CLh^}eDZ@;h4Y}s8)-U;LJ@Ey@dH+v^e;#>pFXR2e&Y~gL z^40p*uhtU}bfeOA+w**vW_mB-9-MW#HiE}oFyTQ3KM8O}!6*ne;$%X?JqjjxeVBp? zM>PAi$+Dfn%G9JEA+gi~;WnqVr=U{lpc_9$Md)UL2ZcTYa8T&e08}yv_5i#j)N7KV(B3Ii;#}5!HgQ>(0c&x6-uj-a+|5#D^0o0w3_RLQqOk_O{}Jw zD!%9fgGOUD#STY6O}>tvoasAj7WTyU2gV--;%VEY=8 z`+RQ1>yt;kesOQo+)Avm^&(`AU1AkdnhKznS7PPeuFyLH_6bcIVTtuP$||HpzzVF( zwGhlzDC=>JP*&avp{%^?tZquIyl$aM<&{`@Zz`0Px5%ogR0L2nF0meuDfCHz=Y+CK z^Hw({R%xS9R%ux%0qYV%65Op&R;lW-#Cn`(HCAFhs=bt0kGmAgdVEr7(sW8m(7yy>o$3R`NbX?+YpWo%^`Rj^hTOx;>*VxX-_!CF}`S|((mao#JGMR;2% z<(_SFx0=wnQ10a>>>^s&R-v@8$Az*qFA04apuvi;h;}za=wbl%dy8m->iie6xatBI z(e5@`aTn37o)b#5T5cs@M6=o;lxFocp;XPwLSF&U(_s-UYzEG{+#)J$y--@%cA@(L zq`O7b-4vXlrS7%~rSAA_Md*V7j|ipi)S?&BC}<5JNFE7`*tOCG5K1-9H#IJTM(nr( zS3MHSRAUd$x?GuR9F5WgodD1zl)76el)7sXN>h;<%Ty!3f`Vjh$x>sPYMfxYE3?gZ z38hB$I4x773r%6=M5E=Tp_Zx9H$*@+&NhXW=L1|Llp5VDlxlofD6LW5aG7nk+uC87 zO;UO;CpKE9p7pRQCx%&0T3ngR)x)ZsJgmypC`TJ8F;r#;HF_=1x?GVO-7J(EeN-q7 z^Esg}157l96$vI8+Cn{Fuh7Isi&X9%3Z-%%6q=Z8k$S$!lv|{pHwdMkpAkwu%Up|z za*I^%NmFi-=K79M>Un{wu}E;8p)J(&O$w#u?h{ItpAbqtcbJ}w)bnwn)bo5Z*J9G& z6_akENYj2w1c~;G)c!8B+#)S}x6s7Oi%CTklZq%pr*>S4YczIK^Id`oSZ=D7aS8Ro zfiOl$)CUy-^l1QE4$uPteEhO+1Yj``Is;&VP?pAx-HJe2A`lz|ct$9J%&L`uB?19U z!`=-jfm&xP`#L^W5z4+!W);S6^AH)0-L~QugCzouWf#%H*cK7G9AKlN*`AF(IC~X< z+i-HQOsM(9<-MFOuu<0MM!tJN@9V&*BP5syAk%40OsAEDpo1bf3~*E^75I{&T?8~L zJPDJou!}t+?F)Pf^sw!sK}qjjiQX3-gx;xIO6unulFm;vbjKcXyQ#E`K#E>OKzm_o zZ#SY(o|;`rUunZo*H;p-MnvxGhK$Cbawb_lEt(8K%R@<$IY;PQ+4Q&LMCU-T3+E5z zw&pIMfb-&yY|ee)-FM&p{De{#XW3-T{>T1#Eac>XSVK#?I^<)HcdHfwGf8=sN&;tFGqZtRq8< zY%wx}BF%t3^<<2}=l<;ENgE;7BqBdL{M`wgbCb5@CVhIc1)_kxq`VgAL`S{V(!`{u zh+cO39G&%#>ph^P4WfVbrr5uPv{ssEjXFqdwV8dO47A)_5BtLjrJe-P<75c|yE=rf zfq`nU*L)bLd$JIyyJ$|ji#GNe>@uM0q#tZcdX8rH9LJ2HjexyJ1C+Nl*Vt<~>=AR? z27oDsmS+OYHq-|E&4#uS6mim82{pDVv)j2BCs+`$K|m6k_B%p3yOudOC*~YR{50p= zaYFF~H0cp|yvd4ty@g*Gf-b+6ALXS7FtX!w3t|Ekrv9X3Ay#`?oGj1?r_PWxt**k{SxXWt3DU8Xdb zSYwISIMR%*NFc*(Ner_{!<01^6KgEe8r}0ZvBqLzjV*~aMo;AyZ;iAan&aDMjxBju z$Q5QKB?8%8k$}dA{+(clp(O&DoIST?axIC;72gJdo^(ZarZl^#7OPren6F%kq&MM2 zmKM|qL`y=TF( z5lu4nAa9{5a&(AL_K|v!w`>J^k3#nY@L>)DPN3OsO4T&i*TWq#PNk*z>A*OJMk02s z+l6xa{D4pb^|KulVV$&Cs5lu;c5pbUQC9~oRL-*w4hCeF9d`qjS$6p6JUFoH(=0R8 z3}+phz?Ho!IOT9p1RwMag4~nA2hpYD9t%F`5=g~1hwhiX|01D@C~cnb%0L+U-iHtr zJs4Ox|6oW;7#NUJ0W-Vag+Q*e z@K%DNp^FH%8CoRRu22H%*%S_w=t%s|9nV2StUmghSr?DuB+ib3y#gx4Gw`Gs z8GA~g*;w{iKALzO|FT(5Gr@4vLWzJb?qTTfFQ04)AAkgS#t=M+)5YuuO4$$-b9~V_ z774}}#}1!&B=}yWBfCOw%kUu2F4)u_YfDAXkZ=x8zeYfOuH9>mfcRd!*BS!xQRoi* z8Upc)>|XK2>miko2YEP70`qGO!~-9!F%WMyK3anyUbcJ4fq3HVGktpE?2;@W#1p?e ziYFfA$gE*Jg1lKxgv=Msf`D^i1{2Dc&_=HJqKR?b0&pKr`u}Hsq?c&kwBH6UcFe|= z>LZW)0hP_iqHJy;>lbj=-`^_b%@B?CWx! zN~Vkn!oX zODLrqZMm#w-s6Qb?7a=S33^jdIBec2qZ^|K27)G>sIf}{rU>;6-U33g`4Gd@ z(W;sZ{k>=E@0kIaquWmyH&aM5$3u<$X%#-f>kycNQ!2t!IDH&(wsgj21w!Y|!aZXO z=^&se$d*7oMMn$JZiN!im5Y(f*5SRxb}NE_ofX^%r!MHdAK2FvLBL^={0hY0Q3Syh zNQS~(2e3gXM?ZJraR^$f0r96O&)0)&& zIZ!L2w)Vy5-6i#O+f4qXNBx8WQPL;N{h31~$whRUKM+%3^VI6+A8yrHcG8jKbRUQsB)tA-W{UQ;LmwFM3Yv^g3S zp%hrmDv;^|H32n6>O@sZbGjZXTZ|K=1e*-)Ah;E0A-8#5?;SvPT6ibHorV?(_}q&I zQ8UpVufT~Qg0i7qHvz0sC;_`;bTvq6#{t|vfpZuhZJ42bsy z$JqcmY01PdwHhra)MdvxcNDREE%q}$HttAhB>R+@=5SIdovLpMEu%f|v8LI{R(edR z=YAK69Cs!^W@$b{2fh|dK0`3w(k!_XfGn6j;UNodc^u$~p=APf1L4tkJJP>yTo>;| zEPIDYZ_M5~$_Y4J{~=V_$amkJaBFVv#b3%zB06{SB-=r<3DF;dw;9nAf_rfeM`2jviM_nL&q6l45Z*nNqTwCw9Z#0LQh5=X|Lr*ItZT8*+Fdf) zpriKO(B>|@FQ zEu0N7U0NmaQ#di9$%AsFsLA%ybiyVV2EmqCY;;4OLf4QU2l zh;Be5+5*PJm6;f@aq#|boUl29dvH#My2uF8F1NWCPn;BIJon;By`;Ri3N?+dlA4s1 zwtu{RxhCgSBrnMp*sA00%1TMRzLtYOyJ+-ZzNa3M`^uJ0xd}T^(5;BM4d)1{kU_j< zF)s941@}-c7ih)l_2Q=}y_BAk!UbWdSGALG~c}l%4F&jM{e79K&262*r>u$8h3zkfJvwUX4#LLqQs8|%48tL zu#-4pRvgV~+*a~6#n|d2K&7#zf$Af`*NthA@>$$+uRbUK%1kFN!Bl6?hF1XDNMp;`c=H#P5sZi9Zm<0}aPzz`O&Gc#s1QI^uJpc;Z10 z#1rR$-lr!XjVQKA!kQyH`B%73lVSJjlcG5-{HyhzCAs4aB+9=;Mj6w0pVJiE~xY#}nrwq~(M3 z#P>w;#Dg4&4?+MrfRiRq$b9i!A>fibg9-0eFuB&(8wCL;v3wfBolcbeqi51wu%jx; zV;`Wh`B;?A4P<@9Sl{plfMz~7aFydAPPo$-gQeJp!Ehs3u}_FR>vM6-oY2;p2_R82 ze^e*~d5pt32Pc|6fzqsIoo-er!R>~wCfH+WGr?Y*ED0ei9V~p^W3WSgv8oYDKz}Mi zlj5yr@rLIuG%4QdqQ>Xqs-knv9Pfb;2xoS0O(yu zD8*p2?+nMX@IHR7LR3{ZgAUR4bQW+-*3D_F&6erlK zP=ecVQhq|V4-ori0%G4n5V{wU4;VpdKfpnuEXY_ZNQnix$D}VM1qs6giuja?SR{BF zXK=Egz>Q=sQs(Q8b+H9NZl@vzy+@%G<9?wOXA)Iih`dmB} zEsJe9&J}b{EggyJbddiFW70uD_OMO@4WBy*Sb#!qM_n(GXK{jr;CY<#r4s|n2m1i@Q|w!8z-V1i%XJ05VpE5rgoHW?NuX~7&A*unYnVw|wC zGQduucLJzDt*o2}70SwaR4CO($&rlUWt_2RoA8uHQLNFcgQ-odya3xL- zmI$d;P$WuC#!%FxbXKI!_ThvBi8^~kXri+sb;i;=2RBg`AM^yY0T)9BuyF2{=%qM8 zNN|;*Ed&b{O5pY|6I`!Qf<=b55Ksf)K)^W@ErU=>DQ1;I6@Z$cnoT)7%5mt))(!0t z@PUNK>zx2vQ|%z&*b@W4~1$OMcx(vV?%tY{+y{CWT<4g(4y-8rtG> zA&cD>6vUc=TPA`nc`62FgrAL|H;ihjr(!j$JS&p&tcYWoQv>u(Um5X-abiT{Nw_a( zuLXrVCe=O*3i2@K3YjjI!beC1??@lFXkrQ zs^l?uFLeJ?_>xaYK67!tFZa3JCnkS6_mSySSuP*V@==t0?i0N}6XKQepNir?RVDuN zC_Z^;kv~P?^Nmn>eJrB=Sc=ybpc(E(?d9DZoUl;>mLrMuBHn>eH`N0vs1g z@ElI^COn~Ff+w*Xkimp68-95&;p;A(P%m(I5R8LrNKQBjC-RvLz%9}YCcIw31dDMF z!{%kY8BerDF$CQ>nSiiI!CuQVs9Bt_u1x?3gdPGoA@n4`+d}hoey7)x6F|A>h-7^H zQujcq_t8)xP%4-<4s<5~bqtjHonj`jWDdZaLLs$n00sd!dCak))e;UYIW$LTGk`WK zEV&;j_irGS`!(Jc%1YT}YF@G#V7t&e0kmy)3F~AyG>T+50dxyJ1i-35C~HBlJ1=1+ zoKk25lr_o}wq!KGSfQ+rCZS%t-~b)jF%?&-vGWj6sj-u4++zys+!u7$ndq*Qy5lMx zrhAF*IuqS>Qg>5LVV%^SwnTRB1**ADC)KF!ke$@W3R6NSmGFpAZ{4 zK8{++JE;#U0<^S5>7z4`QnU03O-de|@esvYH%6<8SvAwFw&O(TApq&4nfj1fHPfu_ zHq|s!HOGb0!d?+dEnQ-&X`T)+OXyVqWuZ3#bO`MRxJM{8%7-K}rbagirAF@+N{v1v z^lgC2rrc&KR~l`mMlUi8Yo=jp_R~zmWTy&ls0-;C~fpfp|)YhD#Bj> z=@LqFy;Ue{>Zs7fT$@=vT~-mztRDBG{^LMZQ_ZZUH$}jj;@cIFjJ0%;)l@TUszWH0 zZU^q-*Y{al(d+w3<&{`@+i>EkatJ_`S2_t)l~-cr&9iDMEdball=b+C&_e*+fCCP! zQjXt&vPx%KHI)chmze4ktWYSc^lqW7#|En=n~ZN1%6hyZ8cV6J?;?7dORYO^>|8X z(#%Rpw^L%}ym=^n~i70o|@pYUw_qNr&5&XsIjFQWv%K zBu+?{XsIjFQdd&_UF>DmwRW*mQZGk+a;6=)5E(=h4q+f%8A0tNi!=`VG~UsWol`K z&~AW@LaDH0LZ1P6PH19b<)mvZvmNfWwpC^`Q`;&h8ZA?!!_BP9i5km^8p~9p9^PdF zJ-4i5lyb{du1v5@<#HSpt#VMgWt^CU(*$=2Jp^!6=t+Rrgwh0On?{QSR~p(%?XOWN zwJ*ag(l8%WXrlchwST3lyh!cu5lZcAQ%x~3*J7gmVxs*bwNDoq=*EvbfU=w*cnyFr-U20%HMSD4oCswZ+0l^z zK!c=KKUzm9yFJ-m7%5%{sWkTPOu9bX4toGGt{05PkLm?GX@czHF$lXAAnFC##Ut76 z0CeMU$WKT;aw^OD4_ml4pN|JdB_hF102-{fCKlJ4SX?VdN%UTW_Ems4gi_h+D?15j zfFK}<2B)fxPS(adB1o#B>orsXwMTj>6T5MuBO$mSXN`Bu8TB=s z74P>m@IjoJ_xl<22+q{|{qs@P>}HVN0f0k>w$4SBYVg#&$JI0l9tFw{1>?ZUtRt(g z=IH?RO`z?u9jWe%tb6wL{da`_lk_2?0Am5Zni#abNQrK-~k0K;1=i(p|K%*I<_cRVTe; zThenhv*&o*2-*nPdvH~aFZC0jg%jgTf@VX@%K_Mrf+N9pL)!>;;G~HXYM51Kx1(WJ z8v$DZD;-9Ai5YJ5^}&Xl6B}-ZaoIr|z8fbLPe414Uh4N|oq9F>e$cRc;*L7(txwFd zn3!cTG0P&&QaH0WA!S320&9MsUzj`?i?u%pT#gvzElpioV|j2X>pZ zwWt=WnqKfoUV~EU;n&88-&UMx2Lze|v>pO_6sMcpykck@AAZBF?`tE_P|U_(W%Y<0 zf9dJiO28*1`1%KBJzUiv?&ZMjC{Err^%Bzzwe18@4w6O2ks2DDyE6=T4HzJP8LhV- zxTdf+Z*9gcGUB{d(Uwt2HcGB#WeU6rwaf+1o#bgE%P8-%gr zHe98nvH~;-a1RF`^e}`!gcIuXL3EtBhlLN~*k9t7eUNWv>ZK;x*5=!+G1_E+z7rqi z3*hfP3l7G(I?tWjJD@6#QpZR4#5HheWrJ9c6JoM^=D@+H;&^pmbWi*+PLOi^`hrjb z4laBuKkSnxIo4p$u9{}!;xe}Gh;iZ%EfW-7#D{x{Eyd|;nz&p7<_9={Tcn{MKqJXE z0=7*r!!^L^e)IPnMA8T6?>StIAk*(Cu*JGN<+H{_+bb8(g2Z_7G5MEU)x=>3COJ$ z-b%2;&@O^U3@s99SlQ)=m8nk`uw`f*)wUNVO>>82BT)|4Fo)E>GbB!Tygnci%Hv5f z{`ZtXeQA9xyJ#OxJdPi4x@#u5!q5@{*CX5q3YhR&D^7{v1Wp(80??Ng6LTDAY>EVP z4UI+)LGY)Mj_gtkI){P|!ZeMHn{fIC9paPiUJE+J*~|NQ;@YgR0 z5r5R~6%W*oF}O~|39Dch3xr+|uu>?&Mx6DzFMM@)FSFUJ2y)yn^kD!p2NPWFsK-@& zo5}YooET3L%*QzrOSeBhd1LOU`FShcGe0~s33?1|W|mtGE%~A$J-1FWUyNsx?3@?6?S5mYbB9 z0bYS~7#E5^+)I?Xf}hVODhCrJ{KC_nB6E5>5|!}dleK!wdotp#iS&9dLpR_gGeQ;x zV+xk!0T)at6{c*j5y9TJh&S22Y>zn0;^T==wR^=Azb1+&PK9{eBi<9m6W?n0N>7}U zdj7<>*}dY4vj{$(_>L$Zs2!~Ic{pK)1XPBsmIB*u%!Qv1B#Eu4BNfa%DH-(_kb1+EiY9?R;3I$+C6RuNnGK}yloDh_N z~x3E4=wP$;f;jK_5fPE-W}3DIBQ+)L8=3MZf_2){7Mg8TU6B(rfV zRS?VMK?%q&F3UI<7WJD9x&$W#B_Jb6MKIUUW`b&bCLx@>31{L&;e9Fw&qWZEWpv`Q zBBf%Rf!Q$%*NHfhI{^tzCnTMtaDsUXzp$4GSzM9(^rtuG#$MWx`{3}VY2$L!FB*&9 zZ^ES`@Ohw%{(ap=)Bf?@4>mGr((tB>#u0w>(z@J5A8ZU-r77ldQkgss{V4vnV3;mX z;GVXB5^yZwn}C-BHeQBbodM1P?5IPJ_fe&L7?3sWk47N*+?F5q{Ac9xCk16_B$F-v z>Ipu6YaRaiX)*Y_f42{~*f?GFITi46guek8*ZV0KKjw1$T?6rN10DxFHUodG0?Zx@KbFy>>ESQtc|Cag zZJ?tbb_3F`_5)H64+ByUPXba8CmehYka`$16Mqi@oao?X4$cOoU1pDk2)`PEcLB!b z+LNJw2=}qxvwRLCp7#C<;B|m=K8`0& zfT)acJcfJP$BTgE`z9di$6TRuTnb43R|3ueTmwia#fzUnd&m8?v+)NPz}o>^0AB>0 z3pn}5#b>UAEr7ETz6+3Y`Ga}obBEXa^6y7H>(?KffZ&fLpY!oP{2=JA#LYW^vwYwX zz*oUDpZl*6gW6Ay8FN%0vjAD1YXPaJ6@awE4GwO1@p}PT)T5nx&hfvY8~4g-Q6|l_92}1dJ3=!aN?CNA3)Ye_ITXd>tCYFO_w)ISL=Qw z_)-r$0ndy>EzajA{4U7NdfE@jdOhagi-2>6P=uzRtlpoVF3bCn?y4$8mmw^l`}l$W z*5h4P?<1e^^e=%g?e1*{N6*#$BnN$#v)ugx2a67NJGjlk-3~qoNIO67;2RE(`zeLb za&WPO8y&pI!GjLI02sH6H*p{L-}UpFNd6Oj2X0%X0e0c3sd1GM(x!pDD7bh8}< zi5)GtXTRQ)33t)`2D^}cQ$#)XD%qP4nu_}}>cSt5K=Qe}@#s}++JSM#TptPew8ek+ zpF{jlOE32UQXdbw`y&oM2gv@ue!k#Tz?ryT3dnwGtAqCfvb>J~QeVdbsi#Sw()}F3 z1-Rb^NEz<~oDArXBe-9Kn^{+Dys-k1dkp;X%+Kg~dJ1p_0+%mHw=e1_pZnh*taIhw zgZL(d9Rg&2+2eVHlh3@LRXMWpWrQ=`Ccx?0$SU_7%jR=`IL+t359wF~`vI+A0Hi(n z<5k>Kk4+0Drw{jVF2dO_4%M*;{AYmq?SLGo_+!5d_xGoRCqX|FWqC*)aw8951W{Yy!L; zaE`_3^0*6s5s>}LTkd}RwHj9!0mmYI4Itxh1EhVw2{;#U=6_7r?*iPDuIR#h9NZ2_ zKK{6e_t5u)*WqXJw7Ki?cQ!;e1JX{n177cmBX|PgY=5Z#GUaw{@%3`oFQ{A(IC#Lp;|{(E$a;DiknJSjEZ7Lh`nl4{gD(Qk1KlMps`vST zMcnTNq}?0?QP?K*-~O(?R!U zxvsGr_bb})N8PAC?m$>RH|f85{mxsiaxVs?{rIE9-EReCxgP*zJMhO7xW5WFW7;(y zo)5_T?e5;w9m4%=e^UkC2H7xg{g#*KZO~KSV^>I?OB|f-;57~|b#T3d+W~0@I{=#i zA9V0Z2VZk=^o@$23dsI>0U+DuHU|#_?!$f8O4ZYD2af>KPDZU#`&$Ue`t0UC^!?CH zqCer_$eVRP3vf5+jstE5ytYH|IN*BR&+pXz5eMgYDf|E+`JV)&y^LP1`Q~Bu*FgUduCHt4TJ+ux_!B3HcHScSjsbFO&5AF;AAxv( z+_f2h=kzy#mmw~n`_=mV8O}o@R{thYwjH<}FRrC8+Dtxo2bTQVDwE^7EwUFMvd{GX z?N55TZp1UidO-HacL36Eo&=;_oCItF%x{&wj024OtxIvwbXNk>t`<4Em5y!`AZ5SX z-S2bp2LWdyeBubjzkz$Uhe=|j6QCnD@gK-SMdkC!s(9=7MlFl^#X z+u1<*o~QrU(ZDIxXSMe9uOrR5%k?&7mCx<`f6vx#FZs`Uj$aKpst@t6M?BkQ5s>|( zKPCgo=VqSB%FzQl_LKh5^YNSi;OTZEo-OV!Kt8wc2V_6|7~llJrvcf%Uj<~pbm<+{ z$E{_AUxIjlY{Na}y9bcz9|k1>EcIyIo*#;#y#o%F$?#kzZQ`Fjz79^ z--MeTfSUnF?ZDrt0eb*<0Or4<{`Y#oX59PZLEKZ%j{#DiTF3Q>$mf0&Z`4)qm!3rW znY9x45x&>>e(yt`Z+@rhp#hNP9uFAHbs6rd&v}54;3+^p z|E{_-?U&z(`~Jwe5NY$dU&6-O>h*+ZJMIU+tAM=%cpG5XSL+&C#_T~`&*zq3@A-|r zOXKHRfQ<7;H|}Tqn+Q$@p3nVo$*1>G`#>Mt^&A^F{Z*HzJBavtPuvf981!rpF95Qg zzXRA5rEC0US5JVfr+I*EM=gM~|CNBOr>%f-xenl-_4t&Fe+7_ozXM1aioCcuS&)Wc#xmhUDP57ds$?*2|d>f-@G@;?N46!7+6)qKo| zad`>%Wx)Bn)9ZY)&v$>_%lSCsZ}o{t|7((~8Ibk39+2bK`vJ!QKH}nm+OZGUd~Wp~ z&(8(tjybv$fbsLV;U4Mv3c#5l?f_f>_z2*GfXja!{sq|L+}^szW4Ir=2mTx=@UFeE zFKmu{=(nM#;n*boyXkrYsU2@4JkHODd&s)Y=ML=i@=kh4ax4O5`BnhV1-u_{CE)1a z)A$*v9W$++Z2ujfz8Uccd?esS57#vw0el{CE@0#DYka%_ka|4RV<@lKklDLc&+2sKheCfR{XU`F+Z-NhdaMr*Z63ZXcO>!?(2W)>vO>| z^>fz%4oBP~K=xxR0V$_HHsPNA*PVdW`_~-Z0Y`Tnuo2;}0yY7T`i|PqY{1F5_Xlb6 zxj%T#=l|q|uvcd64#h8e)5nh=2l*O&thVvxbF2QZk8hk%*SIr@wrzg--2eI)AHNUr z4^+foiKje!ckCPdk!tb1c_04{;#Z*m@`vR6>k&SF=||8GD&*h%ejoqL|C83g(trK~ zK7PlP^!^>iFaMyAZ~RgD<0q<)_o!Hr4(cl7&kt)o@oteduS zb!Ypum2K;8T)pnbX=}TeO}nveO=<1&n>{QoZ(l#HyJz*wePp0Hv-?JL@r^{kz?W?jdcQunI0%hs1}T()f5&WIb?(pXA2w|957cX;_SyauDjGc5bmTGhg$*?q#xHw|rW z)v~Ph^pEHA_D-}_HqB+LyH>2ak?r^s1Cg%JI<=l)@VG7SUbVixJ8RGVD`?ycnersK zZ-MTvb4^EkC;GRJY3r7Ewhf--Xx?j}<^k%qcFp%8yi?M&70XKPD0I(23UO8$ZdjG= z8wbB;eBnO3Zq@STt8Q+;Wgw-CO?8!O+E;&4Kht~`gKPjD>(=(PcTXFjRh?0V;Nf~E zdBy6dKt{V zWVh|zQpEaJBJ?)((HdVx7BsAZRV@m6K zR&^j~6f#&<>R3%K@5|-dtN^18F%p&sw=|#9ven(~rH)ly2zoz~wJisNnP$(b&URqP z*f&z#eEbiJmH`k zlqB^vIEd#37W*TPCgI?7O!Vo?m4ql?PZ{gHKX{Ut=NzX>VjIpvwshGCUvh7O)g|{@ zRculsUtY@N@hpwB>dT&u^{GzJ;muqX^-&bxB*a>b5)qZLFJ2NJ8`*`~27r6?p3`v6 z;|FuZhq`-&tDw7Q-5QN9LKnHU4qfD5pp3C;su8Nx{t={d#Y!aZQ)O`}T^*(8ptLb1 zd8VtUuh>cr`^FsV1@#9_qUQ%_EZmC`g%?mHgLCyF_r=XCpf8$A+2T|cIG)ld+yoR6 z8{3D>WHb^F!+6blr@8ym+FQDot?XXiwQ4QK->bVg;0$dl&GaIXR3(me68slF`XAUQvlik%DkbX_Zisq{Ei zs{Du~JWZeQ_wpo^7rOpBq4C@l!t(Z6J4t`RZt(v6(DWA)YM|FX1+VPaRFwB)U9$=f2_b3S@RjMlbwf=IOSPj!H!=&~S}QF)p)`Y&4xT~jhjJPwv!Ig# zzKFG*a#w^g2HycMJYo;yi6~i}O*(z~CR+%@eIGWy2F{7ErvVQAz{u~nl6_&YYL`B* z*bBdAb$3tO(vJ3NpZeq{r(O3mAOGYpeDqU4b?qnMPeDYwTKOh>;h&-*N9b)wY^J2& zgRdl?n*;aE(2Vs|2f?Wb@6Xz4*Z0>hn;;RC2)%5nZ)diK|@URGMx)7>$2nYo(4njrkj)7sW7Ee(C1nF6-2 z8@l4Tto#$m`!ENRp&E)^OM~x9z8~SdpA|PS>CZab+mo z*lajdTGzE|2-m%Qj%(VxSFKr@G5dbi#rf6s_ulIIdu%1Vb~jM1Ba3?fL0-2!qlIgU zXjiTbhK&jecMpzC!x_XbA@hLJ6e-gYkQ?w5oij10T>GB_4?Z5bS^$MJIVGFv;g zC3I}90(Y>gSPI9Iav`c?MVmv?seFC298)|Htp!qgaD`u zrGt`6AqWf5Zhal>!}>b#u)dC^Xuq6}V3pPfU{N|9fYoTXzK+RNSYHPVzrKz&X}`YC zOj7IXsKEJ|^>r*;hxK)=Sclqh>*&}xs&#aHj?GknLOK)}^74Ur!$2yER@CuHwagkj z_DWV=WB*XJkd8gMVSybVMdPX_KZ#cO+YyOtiwo7Zlx{2G{8CzBEMw&g&^k4)5e>hh zR+yN0yV6VD{I*)*O2%TYs;k@x^;|9I7uO2kvIxy^<7|MtWn+@^qilum8EJ6zM61dy zPT@~|7B0K@MVTTVE6l^diJx;T%%CtT4wlOuBgXP0Z-u`zM%AME?YF{zj%Mas<);rp zTLj31ABJ-)1}ZfqcBO7WG`|;D_zzBF^%oSLE{uQ-^$msJ*#stDx1{73PEXr_* z!jIV%K29OBMPe*JaaWkbSZz&E6$wwaHIR}Y!7Kc8C{66ilsjrOWyjyTC|v`bG}MSx z%jEoaUg67;{#8lLuRqE8$-TmFol)`;$emy6D;%@DLcUJ8k%;C8{0e_;WusE#R^vUe zG8gUEKs^*buVT8=Ucl1UUs%{<+aBsi7GBuwc3#A46%Pmi%3t%8e=EvDssaKfa-sQ; zf{^^WU}oElg`R(TL^e3u!@K6|y^C<$;txuHFi)5K($x{UxSS zC@8EZggS8kT{B+TplBF7jOwj_f8p7jX?AqsK{XlAQ+C6OsJE>w4I_|?t5M3#Pc0U< zn!PA9)P014;29`Vu69&+%iiSeXsp+NlRW8uCakk9P& zVtElMmTe%4N@-R9d&X3a8&@=QS`72F=to0zv}p=O4hg_D!K3hq5kE{>I1+>}m>zAZ zitU|sku&qP%3|B6etcCy+Y-5eXEGMLF(?@t=jYJ73^^$Les!p7>f?3f?vm}s=gRpx zz}bo9)PS#Yu0SvSSXq;7NOkqepVf|uW?d28BKm2Pq z8F~9x_Oo^q4Q!^|r?0Vp68CEz#^<9Yivji$11r*y`KoA=)A07r3T%$)!5d|CJ)Kb< z_e*0LCzJOfoU;tiMIHGio-jooNa^Bdhf|h+{GET@0BKW5Q4!@LqRs7n8pAekh z*}``z_>K9~d64-1dCo}V`LfNEF#hKpgzg`Ho4&RmiC?Vmryq$QwJ-c5<`t3W!A*sj z55IL^c(ZCW-%j8s@Cz?kwB~MU=Mle*U-*qMQ!;OebNtXR#1G~d?ynhr8KeJO&1imJ zzp&q;eM}u43Yaa zQ9aZBApK%~npyCBXycFS+^&_|1~Pgb_}o|AtNSYY$Bpyc*zZwmXX=@3HOTTl8#ycH zuf9>8#cs~C_IvbMxdZ-C1l3jXbs1}kscQBgoJkz59JgmoX)sz*hGqZksiL0xkljzk z{e0z|Wq97tfG-wV#Z>l5{++CWR7T(JAl?#lCf&$DOzK}DuR&B)vN5gC%|gj21rv4n zNK})~Wr1x&y07gOffEJYN(opD!?bsJdrRGlx3(q69k52Y0Fg5>O=$8D02BOsbrJ>EZnPcLUqnE+HDiV?MuZM-F zY;vyM4&oPI^+uSk@?Sw1ZY?n2ZBEQp<8h{%;9q1}OHVOxg^>P(wnt&D+y2pL^hm{g zkZA)pEGQjQC7wp=mH&J!{JOnl zihQ`QYqJvwB4T&fSIilL@M}`RdZX61nIP^nPU%YWQKL-nxdHFU6!?S5!taJRTV>jQ zs}5CT+ig&2mZ8Vkeb@^9ImcQRM@kb9Hj^$D|6EykrfLSGP1f3s*f`bLsUH6NvhWXJ zG~6`VKq;bV{t>fq%JKyZD<*m2y++3~`#+t0g z>?he!n@QEWnq++zKEh52)t9=)9%-fJFdMh6Rh^*vS8(8ObhU>z;o#HSgQbtOR-z-B!bEO#S4eZOhhjuuMGM6+Mo(oJ z#aa>5n31&Nbt9%qffWpJGCZBZOX&>Kk$<0#Ow~_Zq_}?KaN)Xcq6DG94T(H>^iVci zhe&6CyFH5;88cF5n^Ww>!l=?Lz8Y94S(Mo28_Awdx+f%6?gL1=FC>j~joC=xjVy$d zBdQ_QQ{l4~`vJRFDVmlD$)Hvy3OB`LTP`Wr+jUeemVW`cE7yZ0cO=1=F?q}9{+)fe zW+=XIWHYw#hSv}97R|(ykQo~czO#?7sSn1EP}R-%^SX*k5Ij|<`4m#xWA<-m%$9C~ zy7L?Q&cCEQppVt}Zy9DVENgH&k<4&C-2nR6G5r9q?DS6o1M!)kUxummzXx?Yb{&FG zdc@o-Uqo=vhk-PyeldJ6f3Cas6kbL1J%hW`3aD39W-TIYBE?KF8Ro#P9&ai&M)tLD zL~w8EX+8#CxmseoFOd>{{+`t(EE+6t?`XfVt*0IH(f%x;AVum;W-N)EW)+2NBqpYR zeHp{xbO2UJ+_DK@PWGP%M>@ZXfL)_CmrXFV&Muo^T_h}Zm%=Xn1dO1)t8aEfH8}){d*bt zT9Te-F=GX3Ubktad;xSp%B{}Tg$<03-)BxoZ)bG;o^g6HV=tozvY2s*3G_uVI3O^! zO%^jK%?U<-%N(MLhC|!=F&Ulz2}B^)0zU*>&nGtk%=UI!Lksi#KX&Fj=7B1 z{y;@%u95S!Owte0xBYc_i*1bnzU@EruI{vVx|{U>f%JEn69$z3tPh}D^5_L@b8?*B zT8pvxmoVd&Ml_4{+R0iV{nD1~mraq`XzqO7#v+`IYz8GnUBP~wUPyE|iC&8|T#d*w z+K!Ag9gpVG_2gmEyQ<2;&5HY&g?#~ErYk2ot4f}4zmy_J6~p}(;zcisLe)Cq$@vsH zKM{l%yUq6Qr@i?bkxsl4q)!{EmS#e35z$-{X}_(qO9b{#`k)@{WG3D~7aX)2(=<8o(HR~*TLCues&SYK{Pb=*CY@6JIrz{G3?`&|DP#R6t9A^7nPxdA1 zfsDCNH)M6%4!_{>?KJzv>vV1OYcl?Wyr`2_N1t=vKI`|at5V$E#N&*(W!*35eur(p ztm!mcs?VtCad%-|lb^ty-?V%FXKdjInx}hcdH>Y;UAyOZ?c%qrXE_A&!=KObiR$5L=QVRu2w>0}-v_e%>uLWhe4K7cB@C_*C^=g0|L zXKU~3#a1IF(N11SW4Fmm*TNpu=M?^i>iAs*UvjxTTx+lT4Oa(jb;I+eHp%(l`2a6iSnhvCU`+Jghj z?;ZwP%_9c4miLGupY)y|__wkiF}SvZM=aj+>pWuo-k<##51W0f?kI*gE3=~*?^Rdb zQH+UY@VBAX;M_uerHhU4{RMYe#W((Bb8bhm`_iAyY2mVpyc6<_`T4FqUs37=5*?k{xhSTA+lQdPGdW<#cPF2kyM1Lu`aVqBf z&UqL%=*okZElKd~q}3o@I~IY)+$w=XWqsfe-%ji!X|b!2h8M2ClOa_>wjgis#E2Xh z^&y%5YE)I2l<>i2q!0In1g>l$`p%%qIJ*%2n^mKO$K`*g3*nfD=vT3^btHT}Rw(0N zKcaA-${1NSXdX8j#2&QRETcEm`NS@=6do~6X(LEa8nM0NQDqGa#Ta3fODtCIdLh6 zBI#Xh-}{VI9y|H-M0XKgkz5(3f#f->~k?ir>d>tvjYxp8b zkDArcy{K)x`s=0NA4>iHlkbcPb4mVE&G@(%9ndQ2Q=RL*Wh+|Ri@TfyU2_xiWEIT9JL0^*4jf#);$2Z^}%#@)NW`6Wx3L_Je%w* zHbW-af5X}$6%tpJaFs@#jzV-z@3f3Mk(3?9{KP5NPOMplE5z_@wfucXN3nR7hGLAe zEdC|KBF;a;v&pvM{eW1!IJX#&Xd)I(KZ(BS*Nug`N3PZA%bM|f3%<{aW7T;wM1Sh_ z^m=uM+^k27IzsEq{t%f}E&t;_!qrh+pDMqKP#IoXk1Jz)tcifmycOep^+FUL-Tpuy5H45!Ja>!vmfyinx!)@O8_Um211l z$ps6w4YbZSmre6}D=|V!EZuzh(4@80zVo~C#k(7s zF7@34JW#XlMm*MoyAclB;1G1~M)+x+ml2O)-;9t8e6<-bBYc}xy^L_B2Bt^|M{4jW z!iySkZUi*Hruz(m4L;7?FA*Gy(Z3|JbEQD@<9u`6j%v`P_%j(c3_>y7cCo zcdo&Q-0?4-q3FJTfH%Lm(brjPP1WMpmvuK-gGF&0!dH&^7>)K}T7xlUI=7?I zK^&!|8=zlzO4i&m2GuWJogW8xubp<|=X$1{->ZR<(fM(339Ie21;Vpjb@zk(F#5=} z&pvww^}lxg*Ln@-2VxvNfK7E__CAm)WALQJ!=YUK1WWCoz^FSFhphlBR<(C5Uz?>$ z?Xtk|JnXWFb{t@)3KLC+VHm|?WL^1OP`GTV_JjaKb&+T<1@g4L6t-QXl+7ynihBQE z`Kc5t`RY4H_i-tb2q^3H?*+L@2S&nS(hIFzdsac?uuHbqp%jh>4*edxO~auOr8Z=o{MW=Ox7UgnXL z7Fo_>%AFQjnQ{Rmf2~Gjk&*g(d}YdRM*eP%l-n42pho0wM*c~)NZa1=AfvVRsa*MH zkX*%_rX6SWv$lj#E&2^czg#nV+)p9;t(wuZ7_IMdRAauF(RW9Zr$yVy=m%;>-@|DA z)vOxxgT~xebh6Rhneqao`}i|v*j$p?nF8Cu%V>;!lN_r5h#+h?xwy*wH?{Uc%KCX= zbQvkR2<_i%fzWQ@hBS?&v439HrkP0^YYb>2F(2U(w?(A<$-ZgUkVgMP)N5kWBD3GZ z@1$WlLhDayLH9A4Ui#r`MO2#peYws)(T8xUnOFZ0!cmqnLx$O39&fT#<7vsRDwvD)|Hq7! zLd0u{sv0c>M%5HA2MUjb9(xspe!k^@N;h$?>{zoKL)F8A}n<$9N=rB+*n# z^q*jm+VLU{`tRf6MOCL$y|w9o%1L>Bn`b$y;iU236C|Ir;h-OS>IG2!u|hw*9cKNG z{dcu6BKkbzK;@MD`aqZ00L!&`#Dr*pwZZ)jl%1K+0aWUJHe)QC&s~e_ps%Aw-X%W` z^W(M5EUaH%lG7~0om-Dmza$=7zfQkqNZwsl_0u(dPJYj5CU%;79{ddXbtewyqp3j6 z&nvol4A)fr-frMw@dVR0KTRPCmrS~PFb}{D%r^D01WePsC4&GX(J-HIlN79naNNJ+ zLUdC2Pmo&ZaI`q$>Yeb3Shc{hnDFFt<1hmo$`+XRP6FgnB4r~Nr ze1gfKe>&M?QDd6;p_NL9aZo?p)MRac@qq6${iYtqKFQz-n@T7bK9#&~SD~#5Xzw&ce}s`?MHM>m)h+DU-f)M z^1ny^pQi992gh@~F~yDPFidm1UBEXQ{=r9`aXi~=f2)=+Uv+c)EwMK^{)QFAgMT_W zp0SlA;BZLG@eKd6jUs;Mlt++h>^9twMQ6P)mv*m*XI~* z9zD4rn6eB;oN16-pXh> zZL3A!%joz=lafB2#Umt=i#$Z55NV?0B+|E(C9<@P=`~2<>%}!prA=>>K7|B&$*eZl zIV93=RK-b-6ggE?AmrxCOIPnUCO8ZaS$$!feY?NDPi!vZx5WdS47>lpo87$n%<9P3K4(O5=nh z=UG>S^Z&47(vRgckdDF?bwHOk6RcnYE}7)@$Bmr6d7d9J9%1r+=* zqmiBJ8fO<;FtSFhSd2q&oX`Ckdh>HPD~@(v_y^`$kG9Y8bPf-Wvlcm;CHiT?kk5Mi zm*+r=CXqFg>2sHEdUwKLOwrD*E3(fSVBcDBlZ1>~`=x@R^=+P?PTy#o;W9OI7FB)z z-Ho&QfZh4&wE4UG?oPr!taI@8PMlXVz16%4b4vC5wKrN}z(v|+^zNtTpKZ&Q*>-x) zRWYi>bIGQMyyfOBdkX=>?9JkW=0!kw{B9qhoi&j zUqzZYgqbA477_{9G*DNBXtau)=KU<#Xq$%!1A{Q37mZI=FF#ToFJAd zF2A>Mk!Y}7Xj z;vE6;?u0m8c>iPL9RzVIn?+$he3voAeE3!Sm_()0L9@%#{Jqg+3&1bUXi`=wsIpgV zWS3z2m_;Guqn`&uXSMai3jbg`Ul9IPqX*>yPkF>BmHnS%H)1~bEE@Q^n-{s&u7M0j z&d5nVSikD2IhlwicxyV>4PANC%Y$oHf3Cf|)Y;b6c4PaHyr!k6a#XlMo4wZ5WV(d$ zGw!Uls?ykSBR&1Jph0*8*{Mq_bndVAL%6~^M3&Z{ck}u+lY37s<@Pzl8Ca*{O|Cwp3daPz2g!0g=JqKW zlXZDWn2HIW3W^>NV3VbLxJR-ZBQY&;i}uJVEZPGPi}rLwr2Zns*S%5!^hC6+y&1)c zznP14epw$52=DkH=hU+P*?lut71_tfb5k|4GKbf@GR_fvHn*yC1mDk%og;mGI+rW{ z`#Af~ytQLXoQT`+C+^-Mp#?R08^ZFLxe1Pu)ZVyJEH;2gQ+%6*|E-^arY6Ag2Tg_h zX>+s9S=aH3sp?EZoLqe6y#7^Y_=d66s`F>Kt_Z>@$>J_1w$1b-AoNm5<5!}YylEkl zZ}TgLApCi*n}Tp!L>QK=ZF2&$PD!r0b3@@vnmZ3GoQmeo^&#y{KksfRd{0FiR=8dN z3yx;%u4GI#m!kaymY53%?cTjRugq0%F6;0*Q1!3-hUn9L-S^CWVtjLF5i9u#Sd`pd z-tnl_Ypz(w;lk~$9M`DG;&!s2XG@9wmWQO}g*Sx$##=5v7W`8BgTlMx_9uIc-CqhZ zi-1I-1%S^t{YQuACc#d@%y&P9`~NIobsD_J?-=E|M+Bm?8<9l^ag*;1M-9X^y~xcK zMS40ARj5jK75a^;dAx$;;;yQfiB{^~VzYUF5g%Grf;jK0q+boB1IppI zL$VqZguVBr znpXPd1pYyHkLwjcQ%|-3clJw1=N;weU-??uw(iE&>u#LZXRoPVMgE?O#Sis1c!zF9 z_v)^m_O9hz9~nrOd3x>x;dZ*7CA~Nqb-;A=3?!qz#Xd7PeBV5)@B8et=FUhPzVr3_ zi3XyTv&yhqZ$EU!JO7T|d+;5*_z!XL?FT`WM?Ss+^KF)wwt=ss5BOLY_H$3JNRo(D#*vD>oc_dFMPhl4@Y83L$X$RW*aS5;j~}9 zo2aiu$%Z1q3JtCnS&}v8Uwxm2h(2$=T6t_Q7;!0RWFL9DTb%r?F)<0OrQpxGX zvXw9Bh$8B9R(%WiSrcwl4dKR_aGy2feZTpFZ%OPrG#$$JdE?_hkCt{h=dVXG{%h3k zXnFp9OL?j(?l617(Hk{rB26@t1wTz0FYm}ZU2jTDmO{3ZR3EBL>|AwIZ!OrgjQmlf zQ4VGye{MpCo+st3>%%ShHv>*~f*&78(*AdM0)8B(95GnDvMW#pzf*a6_(4ciush8_;Az* zC_(5?k*6$ASGI059)u^B;_b5XNyQNVKCw8{YV93n*sek*8P9B5Z*iihJicjG=1UsC z8l;{_Ekt<2Sv4rk7F|{HxC2y3O-X;R4`2Q1C9>||;MueI_F1tQxfpuU zqJv5vN(=R8$`4C~roxNh>P&o>l6`y>>|J|rJx!>8{in3SE%-5?_{)o5plOje81ZkO zltx`~gR^|qo2*neOl$M4X|mBPJX6E6u)nvZg&)J5;#@2($o1lPAIrU}Ne6zwK6DoZutXyG(S2S0SbM@W?wKT1*eQjy^y0(rI zZDZ&vr%G$>E9ZVKiu|B2994ac}({zAb}zd&;? z^YV*&Ri4kzxsGve>g|Wj@{3-x;M*0^$_d<&p^Jx0AL}Y%%#2&i!$WNHN`(E-GK7Py zf3H=fp6m%Xd%?moO%udlgn;X^3I*0?s{BBxKQCj1GA3_TKv~tZ=xkeqB7$p`mo9=5 z5JZj++Pk~E_{m1(3+)5JnvRr%ai3c;f)QxN2-7*P0f7pc`Ys4}RbR&lTtJXn z;|Xg&AF^DNfo5V9D{~V$TOXFc>lZLvuJIAZ2N=h1DR_TBX1H=4A>jc=*7}FfaYnva zEv3D{@gk$EE+TP>>E$HbcEWedqk>1=6NNIKF#N;Z?%gpGRs1y1Pw`4&8=o&7fNR0U;`m+p?e_?~|!{cOO|Lur;RFXigC{c~pZM=OkoexP` z7vND+_O;Owf>+b7YLinBbSNg*MF_34%|KP0ahv;x{%4MB`%0oU_*~STkdJ@sBq@|vOVVgr zkT=UH$bHuBW=WN?*AWHsYdOrI-dO~)bX87vE84*B8-d+0bDGzWxFpD^2h@dpvjrUS zBE+^WNN#4${QXi4R7A6;riQVZ;N_PWHZw=QI$^p%$Sa%K6cF+&KIBaw@?{@#%7@%$ zA>fH@koFh1xU>)i`6J{jKI9D_@~b}NWgqgJKIEi@ptiC~vk-9mtDKW|ua&QU6kpO| z)+R0M{{Lt1P2eQGs`BAVS7ny0gf&9I5FsKm)6+dWvQ2t=l7Y$0FiTiIzpw1+uI?_T zyQ`_Ho+Xe)6p%$^6BSXAKSTt-D7#{S01+@CMpVQIh*1#{10pDbpMKACp1Zwoz13aa z(=$n=f4`*W_Fc|B_ndRjJ@?#m@2i9DBHG;PX@mPdz0v0VH@Mzz_n7W*!@JdIJk4cn zal<|A{$9tw16h936y<{=UfleXaZZT!WI5!>0+|6Xl5x%U#y`yz(tK zIFj6E)Y2Irh=&`0V)av45&y$ZdOGayzS2ji0M7dU1?S@zPod!t{CBGRQ0;jC_q@%+ z%|U--6d&&Bh&1lWv3RfY@%DuAiYs)*75cxy6}luZV)$Cvsp`Rn?qPW!nRiayTm7R; zqM{#Ma5^n!bXq~=TUznRLXMX4Blnrr%=_;Y+K$CvH18hDj&Mu266#spj+bQMgo!W7 zz(MQWi%5m=a-`u8#1~=UY=g(adlQkZ-hD=J)cOn#*3#xh(Sk9IbCab(uyAhgpV>8 zZVu;Ym<*}!Fb#W0LwGBL%Q5#nuIn{z>>kR!VhsBPy^0|VI@o#K)v-`-Vg&PAM&NS2 z6FbEol24bT8`lASc{j2&aT9VEqTQ3<0L48N>%Wcl?OQPcUAN|&*V zUIf&avVj85yF;}h-iUo*G88w&Bqtf%t%Ry~HL%^&j-dlrgZjEfK(z+?ZcU)5P*T^c zAI(k0JK*qN_Dw~>VtR%nfwG|nQVM4xSgSvc4&y<`;OYN*$6^-iC7B1O-^eOp*CY$Fy@h29dRU_t)2-0fqPzTNR-s&|%N5@MZUXiXtl!qZ;u~1_ z-N(g<^gKeh^4@JPm+u1s$7<7!R{zBDcK>K&X1snn-n;F;*IeUIHDPCv&Jr~G`~YKE z(J9MzkE>Dtij(2=?V=aqC|W=+rsi6>u-w1Mw;{ruUCeXJ_m*fdTJe0E7F%B*)ij!q z4TIMq7&tJ0GjU@G5tFG00B}A8yBvSQ2aq;Pa?BDuGUq;nU6 z+2Jx6<)?c(yf*NDM6XS7d5{g^Nr5~MLID_%kSX(6aFQRYgJRAngnoig2?m$S4mu+54e&*H++HY?uC;=d0r3OiNCDJC2UR(yoTpA84#X)%2`$5{Nm z!q&WR|56qghQ=|#<`pb040vJb%`7bpcwy;hSXvnH!qU50dV7LaHlpQ%2^3#WuZ&zy zEY*-1X|tZCPxd~WRW5b}2e{75#Gsd_vX0`;;DmC~5jgFqYt3Dev+$nEn({UDW#NMV zkFzt^4MDt!AOhj%1#!@USf2y&QG$@y5y3Ec_;QV_c&(i`+f$zC6rKO79jIf#^0X1n z8{9=d2G-cQH5^F`r=QO{7}Zm)ht=gL=1`iM1WI}x8iYZ`s~k$(a}{6DigJ*t;vQFV zbFSjYS@9Q50>LK@0dV)a>Kk*_&#R+4Uz%08heaG9tv<$Fqlf1j?O`K*jTfW=^id1a zSY3WN8=_A-NF^a;U6a+{Z76NB>d$m=e=Js4pZF#B*OtGr#u4lnk25Fa|EJG?$#M6k zYI#28G*lW_DuL3|h%;De0S^f>?|Kf9`IMibs5tD9c|vZGUt+~Dl~HlGtGF#!@tmWm z_*V(Ut6jxSxr$p@QCHss))?z;7F`8YKlpqblc>M8{HH$uy~?+6Pt^aS&ws1sCu6&V z9emp`0q=qGki+Cj38DSnZHYD`XjqREVs-h+IgIyD0pJTPs!;%+;s7Ei0mnd5^WmGWI5jd&Ec#^^-13Y<4r7{hDb@QH(u!l+-Nd8@Qy; zudwlZta0qq_d`HFWHv5^?DL!^n%!>Aq%+lndQ* zmGcp`Y;l$6l|N*mil734Dg-zkKf%3;;NF`I0X+l6Hj}*bV2MCKqbUG594mARrtk9GhL-Mzi84q3)03^(?*%#P)&kBSQkM45lO9Z~YYO++1 zPx&REbKZv-K!A|G9KX_kYwXb`>2Ra=F(Ca`o4isLMEY!J6SD)4t~7<}D4#>}-EhD@ zR{T;+Yk2HlkLoCfJAGis_rkV%RL6p>UD}gOgp12k=blN!wyBuNumVyP$#S_3{p>hUMwBcz^nL_0s-(!mh^8uwL>knilFEPXw8 zsqDXodcAr$x&-nuQSW>2ArrD&pm| zy+o9LCUZGikma$Dar;4kWhoqhGr@qO>QOxVy>f@=9=O93Sh1K`gr!7-O3T^r^1Pe0 zB+R`^ytjwfq|{peP|p;4XZX~aj5JwdUkeN%e&jsHnjmZ=`4luipP=9ighPad9RVNd zlSS#tJ7WXvWuxv<9oWeRNU`ZCBTPC1IN->L0UR)i)Ac9DaKM8GK?T}Xtr)-$25Rgi z1Zf~f#06;pRtVBSIs|DTV#LL(D0D-ggwW?9>U^XJQ5^m*4%=mdEfBh~EBDmT!XJVN zXaacr1_ZkCa}W7=Fen#8fzXW*mVpY0-Uxva2*e0!L}(~f15p@^h_KyDE^+{QxFhY# z6!5@3O0pMG8pBO0MweSh#k9IbJ6NxFQzifwuvlsj>U1sDgF0P{^`K7I;`BisRLXa) z2X#<@hj1=Kp&NRo4-e{uzcL#)eU!1|n}KMr@3r=2D8PsfqksY%B1j{g!zNVvg6}_N zK)%vlMU{#>&CzB)sNd`z>g&zfw!l!{)Jvtp57Xwys~3B6-4%~lj_01L>cyU(s_Mm_ zo~nM{Tzs)=>X8my{%WpLp(yC>p9o14P2Pm$1F(5w>Fu9fvwS7JEE6jUo;(s={1|x< zI?OBvAyhkl^C0vL5JAWwOEv@lG4!OWda6J5 z$)vs-rR}5Rp^G)vMF*Yo9lZvkFR<#U6RdJnn$|IQQ0UIs68>77be^_JVC50{a6qIJ z1<_gg`YO4N&VdLYAzAvRE#ILY`n7N~ z%0vnwp}Fe+D6EXW(wAX>EW1xj23U4?TkOHOr=1K-eH&vr@XmP>mIGuzEVCTgB|1es z^Tuk&>Z410hP$`zdvExif%_}VL$@N)PyCX!UQc^R_myqzDeck224XSfOm~JW8)w|p z$Ua3;K%RKH>2$rBoNULf|7!O=Gv8BG<^ils5HrBQIkusEB5Qd+GYJ6au?8>=^}BV%KY89ZnO%b>$r zz@i^l`e-8{75w5z2fsLM0k`zS2nc2dErd3D!g7oy(HjwLm+^~Z(ac*5un>Z^0Mj6> z*v?vjRp6`zz)h?L*akUk0aif}%hXzcc@TgCy_|&*tcB$@56qu^;0A>2`~v(gYwX^d zLaXgpAvCwbci&ff#C~~nx8FA@%e@)L$)u#KG zKgJ_E8csX%EB-M#e){J%%T}z`dC9|N&#$MQ-iCQ~b2^1{V6>9b>TFKb`0{A}JrNkS z)_fi>8EjltQ3wm{(gvSKLCfhAgPZ3z4-9VFJOTTdUN5}cIx;ua4#qFc+-M)e2z5R* zq(T*>gMADW*FWHaZ1w6hXzN-`jL)DiOi$Co2n@zFKzL&sX0A7;*-6HjhQXURreW&_ zV;Y98-tmAREPcl#b&EM8JGFh|J07U$OmAS3nBI86HD`JwTBXqRMzl(5dc)ie=5{Vl z#f&6y1Ys&EMZk3y*x=qwhvk#nr`1_UdA}=;|WtKalltb+O{FE|!a~F0!T_ zwl3MZX&+d63_DYN39khB>tUdsy9B|*^e3^>-3d8WHCyQ#R{C~V7?Uh6zGTRw=jXFn zVJ5tuk=`$5@h`JjPqqfOIs{q#+bn*&oqfk*@sh^N3Hz-(1`H#1YP|vmNF=yHJYkgYWw;~{)R?qzPpR^~O^4bmfeTdz} z(CrlotF9*b%T*E1wbtWm>v6NCy}0Lb+hV123*dGcdOyqFGbtz63Q53kk%0OPm#7j* zrv?cDFZ*d!y%VeuE`GY{QWx>^_c{qkpD^-NA>;iBFd31SD2T=?C7kp!n}^Rjx=yK^ zhMunCwCF*kbs_B8wpG8#elK=Z5m%`MpqZfrIPObdfWiEde-I%cCz(Klr0OnK#Wg)t zVzK`Yk9uZ~zvjsvqG;L_{@q-7P)Del0v8M=Ymg6Rny1KlOPZtWK2 zRLGyC!DrdvMtc-NvX~ckd0+&{|4Q)U)bZcTBZP&haE?wLyMfl2hirz+^CA`&kU;eLW7w&!}#L0ap^xPkkXk-(jFdSdCsZ zTlm*gjy3(&F{YI-Ay22Wa`Ni*b421hhJ?gnVI-EP;{z{3$6v5ZbQ)`v65VfH#rwMM zM`_h^I z4tRFfZTUGgc)2x5RjR0}>)hD}Gi>lWH1K!*ImwEJb&yrxZ&kGls1mtRjPV#7+?q6?ek-o}I#&H;PgOt3s&`n`wChOk z;vUw#6wU6mW+^pvUz7|gZgzmp{u|BwlB)$)4Mbf0YF3=U0@PRfCtDa#%V)OyhSD}p z{ly`3i`rVQ_+!`ArpEiXt{+%G;J53G@h^!H+Q+W=W2b9y{LM`?<|g{*mBQ{WMK9o| z5LS3EJD{IeLhjZ6*zR1?m^`oCUvm7e_)b@Rr%QU)I-Msur>A!m&KvkAr`fWd>f_@f zbc({QW{3svCbp#640s})*HWHJU5!gZ0ALe%uVqIF09>AVuO)n+!D|Uuqr8^zZl+$# zH0IBFE#d5R{z>$g_$T4`%=stb$t?6w!ta^-ClMGJ{FAw_RC)g-JesE-J7`YH=hMi# zINDgjt_oIH^dj)%^*6EpBUvAInC$hJz|GfJx(fdAQ@O5?m%{NDo_lY#tK<2w`TN45 zb*WXGt`mKo6NJA;d1}z%+6VojYaeF>WbN;g&Yv>dSS-Qj1$#UG-p_fRxSdJd!Dw)C z7p4(p`CKv$JnH;Ku6HV1&HHmt6l&&6O;|#ypylg4qK94{)kB@fX6hupe1+sm-johP zy5o@)#JG9&>&lEv-+sY+Dqr|Sf z2sFEWF~pmfr?zsPzAtw<-M4(`-UCr$*j_CL|3an82z4JoH-lGg#%lhrtXCy$+!oX0 z{0v^=8#+rG#uEEV2atCSEb(hxIWRt~N-KZhp51lm>r%tLaqx{LpQ;hgR~DmLsG->8SsB(GvEYq)Ix+;2v5VX ze0Un%A>PpgXxZ>IM0@Q*;ekW@4%)}Y!4?F4VG=zTDScZC2?TtlZl3g+BIn%ceDY|X z&qf9RP3~h+-hYE{MUhwN_)_k;U7(bG`YG(JwcGV&xp$DVh5GDMmzIB@-SVrY`F?D( zZ=Vy-HI1c3D8>)3h$yuUF&@Ea|_r|Y<0IDhdg=P&-%`HOQ;2<0h$ z%lxfBF@LeX?9+8%Uo31LV)3%Bos9D))PaL1asOoMg!h7SF_4fX1SEyhV%~(}Zx^yI zJc@H$7=m6>k=H7Dme>)LF$N~Wn~S_eq4a-zZ}=(+UQY(5l~v_;UB`q2w8jH6hf*8;-Ff`_rJZTzV_IQ!Os+?EG z*K7iX%l1N0c#7zpSd#DVTcNvz1L_pO|5Hz-omYObo}98e4g^0OVi+r^H}st^Rupd6 zVnyMGVmIEDe*El+brfVwMC|-c(c>pNtd;-lNa&(spB)K*I($QY|Je~#K+W$YRL$31 zdh9Mg>tV><70BNy5~0%Fy;LgJ8v%x5ck_b|-{kmO=)!0iBqtS$jxa?@qN7Rx_1^(h z${@*)h-rY5X8%op^-E2$(S@(*KKqUo@qmYam4ZW^LqGHsB`ZZ!gzU^o@{_)e3vUie zRh3fJn(!r+&4PKUn#lyuck}z`Cc!ITd}|Jiq-v%&X&7~O_U^^v^~r8{rTOVVQhdABnLoex z(Rad8?oL{EdQ?&HRYz(*ZL4&GL!M0ew=Yu?DE;7hhuS$9vsm)o{HsMG zN1f6OH#$LgQcEbNqx`T))U9d?G#%@moJWhah5yEGjC%}hE;W**5; zTRd`J7bPRiH~9QK4N{Cd)9E;q4!X{mPLhlJU+J9gDd;qvc9SBcI`qJL3zPk6SukXF;n|rVNc2u2bD2&0Lr}#a+cXUhdRc{NOb}kM=rb~XF5uf*f z@&#Y&R-l;bdANKDT#S9C%ISC!#5{XG-q*R>mm!)OUgex){=Rqq*AvD|Jq}$tTpaBm zSih}*ffL`H5Y0=q?gueGK6fRS+FjJ|e9xde@rpFWDTJd4oDLK^4$k}Ufm2I=T(mr* zHV?IYc*}k2m~{DLX%-NGsU^isFG+mwy@#-)Bh$6!qN2P~s^*V$Yqi;CV^PtF^Fdo= zVB>tC?D)-}E_Od)#mOhb0{C#<@;z2}9}H{PJGD4xRRTs~VW2zCl5>IXID`%H66qUw zIN1${>p1(&1-FMoQyjHQAW;X$x0ChhkrPPb*jAFI?7>YZP7G`q+>F0)jH{ArYii_J zP36bx&Gy{LR5i3gEr0$Bs5*W{Vq~^8xcS716EkSm?cEP^p)TDQ&cJyC@o>M)Ne;NGTcUYy|Jx##F z{mmp`{VG=d%cN>Hp55s6r3JdPO1XpLV#I^@KSA~oG0<5hkWEnge^{V1AC5wooXuyi z+ol^4CDK>=1VTraJ;+?@%NvmT>lF7#omNjlP;^h5j|Gh9GaD}16UL`yyVQO0_k24A z!=Jzx4y5dDV{*zDGP{qoNKWUs(tG090upw{Y~~dsy@xLlcxjKDD1WQApUeDWn3Y;> zo%(8thVzo7cRBmgs0y_0ywi69S}g7b<`4-91EeDg5W$Es3XoSM+hgGpr3>0aZV1{_ z4LnQ-O9_FMKID$snHS*@XzAkhutM(21>Y3}SYkM`O|alEY8QA2bxn9vG&Wav79!kwocBBE(Urbof7nGcoMel zzP_A;yBzE6{~}9nImnTt@Vwf)kaH&Cez{z{aX9aaaLUMKruLGcam=aBI@@TrM~+O@ z`mY=s>OZi1^U$-_UAbfbqVC27GUj1BDlQ4nQ?`faWyG1gYr0tLDiCuq4@rCXv0spv zMDe9`xZ{w?M1PFdKm1~`8H+itzU z_=I`K<#n>zn5nl$+I4(l#O%{_jf5W;R%wR;4Er=1!09U@FiHL85}0ew7Dk0&3#+nh zVN~|EFtanZFdr4kytN!I`1tECyv_rCiO(oB`P~veC!)8QVY%+g8PCyxo#cnaf-}`U zMFRV>(2zcrr;>$zo-fXu4Wae8zC7@_NfFX&LA441ja)CF9q!6fw-@?EAxg zMeh&OU3nAhBZj%`-yiNPdViQTKfs#0%%N8_@JSmXW$>k6(O^`x<+V!=MQ!e&zIpqmyC1_=Dd7#y@C#zWv)*ZnJd){xL5H`1e@o zsovCMe6WC)*YdeMJ-4XmTKjUSoBuO+Am+vp zZgt3&i(Z951`Sqv5nk9kY%UyoYz$zMR@j!;4mynf^$uW zD=i<-61jljth$BZ{=%wi40<#Yu-!meX+JA{(JHA}zj2_U)4$7h>I96%GlcQ~p;)47 z^8+}k(=4P{uwcle!F}0@joW|75d9!(Zj=m0NXHl%tx2saIY-)j5?_ zKUIlDrSBJj$~OZlYYks}^4uMUc8ffqP`2dSQ zVEqVfj69FVtx0P%Oy-GU`H6s~Fi0bOm1E(a;d)9Mt1P4x&#a(OYppKMfvM3~dLjN; zcJGobI=_F_U(4nE5j1naOpi>#(mEacj9%PH%i$>aU*tEL*U2HK*>C3_<&+sH=%=#L z@6Bnj92`I8!JeXPC~WP|fNulRz1Rslub`|rOyCMMBJ>9~t~gA7@XikBpCqZnL>f20 z8Hc-oS{Tj)M6O{!J~dF)OjY!n8imI~I-DRdZ=w?f=X%cDfmHBz@EMi%n7kc4-E-T2 zWDB^@fIlUh0lUw6Ghmm5<3)f-yer;!!cOwOle`0jkDQniO2f+NLGcg1zap~VcZke-FgH2xNeosvAO5)G)+6ftiq%2sSCdj_fD+ngXuke1 zp}oU@1r|0q>f>&w>~{Tfmr^djO0J8(@;9%i{qMF%0jtZSkqnbld(fmWGj`{XO)Gr2 zAi&?+1N^K@DaGNtkd(gCzn%_jxU1WA<*YUNK)LAwEpFM3!xGL~3s=XagF?GxIjp-C zd%jg))Twyj6cg!@V6ip796VaFz?Z&NTd}}bEbwSw{@_OMX)TfIS`dDigxoF9ktNR5 zQzMym5dTEN`Aqw#Vu`XoS1aTi!6+vz9lEr@ZA2BfHb`hP53m zZh_ z((>+mB@ErHap=6bG%r`NbP?x`7qfm(=Z$9cF5Tki3E1P<*{Mb z-Bui(=;o7mRyr#^o0YmBlTER>`!U&#EdJ+t4!78ajrU)zQrH8?3h(@NdxOyIdy8tu zqqJWpN)O_;K!esVPYe8U1hy}Z0IdH})_(*`b)J%|pVYK*;Np$<`WFty4S<&xC0mn~y-(x#jD6`1E6h4i4Wx5sdrv!o({h_<-nBo6<-C^m%HC(BP#$XPGxX7rzRIY1fU2 z_`HC{-8Vk3WAQ>8pPN}p8=rJ9q8*!ZLfY*KxbgWMn`z_IYcp;o{+rE`jgMk5weg8T zT>d-O*-g;SSEKD^ajTMRo8PefSnu1AYYExTaJ0SZx(UiYBA;%Ek}Z{OY7qR`>lV!F zf3o`~=pW$r=qr5#u8n2i1W99hTULLasc@*C?BoS*QJ>1G#!^l2<-j{ zdGE``#mpPJllQN8{iJem=Oc8-yYpd6yTBb@bn>SFinLMS4k~+xKdZ3e3_noII+?f| zteNiU0N%`9Xp??C2TOJy&&d+j+Hej4SATHXyL(AEPH^V{z%n@pfS)pV4uAuNAW~_F zPkOijlyR^SeE&F12x(Z;%NckRzQ!P<#Dc9uV7Br)e~W^+^+0uJ-6VY5UJx*&=Ffvs zqXq()rqgGUl}%AVZGf{NAHZqt5%=nQv(q z^3KLzV`F~xLk)Z&zpBC#MLrGT>*%r%ccNBV5WfQYS10L;OB0PX*6u930%cD};qn3@ z=?WBN*4^Hkc?}TI7k7lc>~5z0y@Bp%uvXbVr>ri7fQI5PG!R~St&Cfm+~>k%J_}zT zAynNgQSelrGRDh4#UV$^o3)Vx;)5&IEdX&&!jg)Nc&Xn+4#dL`;1s5>^rr~@J57de z_t^YpvA}Tgak4&B%Pk;1fxah=QL`MW^`s3EY6%W>oZ^Bv(6iFNcx}aLXhvLm4V`FZ zW(Tc|Kd8#?|5}K*oiu6VCK<=CHg2e~g*EJ)iCapW9%1%s8fw}w?PXe<&#+Mh6qDAE zql#qEekEThY_f~=W8`dqk)6V6j%gC>!jC5TL^ULmZv9-mpa*cHU&EZFLEkjUO-_Jm73@o30M-e-nL{t(Qg5^ zED61Iu=k;hB+E0_40p3%ZCyEa>E)QZ>tX)NCU0h}(QNheJaZu;rH^FvvdNQwNH;S& z%!T}eY{m9Muqd#bO3VnG55ca0g`CaE?CJm_y!1wsg8^Y!kp2D;#z%Hbhz(wTBZz%o z*z;k7m*4YYZ|C-WfSc_3u*1vk`LMSu-1A|R7k~o2+&(Yt`4A$uOnbiHrkQiWS>*>i z%LZ1Cb~=}%@4nK@K!jyCvAc@ba$P3q+CkzE(@QCHGxhc6xs^~wCd&N@KOh1RO%qfau^e*;^AMwPATx1_k{6^`B0K7ZJt`n&sC1g1a@iO=7mWbY+l%e!94AF ze+_UGoA*@SUki3_?tL}dydR>$+BMq8TyKcINd3==UoRdwd^78w19`l2-9Qw7S2^6% zeOWe+Ki~Rw+2Yi{nEC+?n~!ol|7H#3q2x1Ta`p4;^j~JNo}p4P-0?1cg~k8H;;-6R zRGj-ws@k}|pB;85W{z@+M>MVD2FkFWOMVeOBd+S~>;ra{q6h3)e?99XuIg<6fL*2N z0Xx>bf;H!Rz>bxEl9fbf9e&WUE3&b8lEuaE+p+jY7QYFnDQ9Qix2t5{y7I5w2|irW z;Veg&#Lsr`+f_2}+Y!8xdg)hU_`1_A#PBZTmipH(*y~uzN}pw=`69zu>1(W192v&q z|6*}*WEhL@_c|2M_i`L7J(iU|pUAL~4IX=YuWBbN&G)<a4?-1q;nzo{VRmIwFy&$Ek3 z;h-lE?`?qBq0C**^8k_Ok@!tuzn-x5xTG*ng#qb&4<9r&aK6DZwO3hPZpFV+wm@Ap zS%Mn&S#0z_yub@!Mn?aca>=;hnp5722hpjh=6oKo!k#-kB;Dksho z?;9Di3!i|?6F=vd0R&%Moom;pRH~8sIx3~jEV465r5c8Qk zP=vds@IVo-M+A=zFv>k3kvdxRm;^o;N-xW;G@}1uEp2ZZ|8zTOw?HSz=UH6ngrQU7 z3oQK%Oml6`&b58giGqy?L8luL?w$L78IAQFN^K3I$P4+XdX6bxR1A=%PE6wLLSc6KpveLPJ@9P8X;!dh>?Zx1o-x+iFW?`ft z!dnfs%9`?*?FBv5Q8+EzD!$e4DwWTj>)UT^Ur(7Z9B30xnBWRc3+C3alUQa z1x+!yXRUo8@)fLlt&=z5%wFtuaz`yf3%m0qL>Q=WPniUq7UWo|_I?!t`U=syF$kR= z^Hy-J_$0SP#Wv@C_M3hfmLPV$9w6jq(R|Z}SijnGgA~ApIX>W+1gs?F^_{6ETQ!VC z4{&oh5c66n@4nJTsPtty+drKqd}=cmSTDWohL^(xzc1{ZmS9YibG+!#f6BXs0I5e| z=;tNtYHPMOS|6{ER%<8PwV4(^V}k%BzM^0!8j3GYO$f}{1>=YC9rouS__&4Djs{3_ zG6Dl+mm6?cz_F$UjCmwnJyz|882}=lh^ymmoUK~ms9xkUOD8;+B+gc>n($9?CZ6QX zr2`q7YgKuzD-SE2tNU^aD(~}Pp;M%YsX(Pt4Q{A@6RZCr?;mKz2EstT;=Xu*w4lC^)jn+< zqf1mC=jc)G5>{8Wufu5SE4>@sSQhP*Y6$Go@foQm?)Z%7_LTQMCD0Sby}Kn!B1`v} z{TPOibs?M^LR^pzm#IS38C}KcAyKj>Lbz_H7`)1a3sWFS$CsG>%a+Zx%dc0Eydb%@ zDAO~XI(@UiSG@sHDBNa#xH+YngBfEyoqomWLgUOD5wwOz$WHrsy2tU{K*Nc3QEL@Ol%f$! ze7Q#x?OmI+7e~NM|31$&Wo%=;i5z{N5W=&l#JcmfNmivRX7nlTM@ABLrhQG62BJOX zjUd_^?DHjT1QT#^8sd36z$(Ue7Lz>j|#D;Wp$P#i?B@`0@Puj~96wY}Q zQ21OxL2O=SZ1W%<0oZ4)eW?A0G=Zv9AtTDAXh1qvVHl2sXub+_hEP^JSRAImZpMb5 zLIma46$+yaYcuErLC$tk!dZ0I+AHjr>AtlAL(Nc>KE_H3$$vV?ka0wjJ?mFd;RG1$ z>2YXMBC=j8^@$&^W?01j-a!N@&`qqBka^f_qti4qIOVso$GJtYq4hd-c z91_SF<^@*5L{rG0o(dbbu+KX=l6obfLs{LS^r9ibvaTHAB?6wwM5SVTQfuc}229v( zn0uEQ4yem=BH<^HW%ZdT^sU{10;42r5y_Htli$}N3j>tB^RC|lgKmR;qivlZASKdU zQH0<(eL*h+S>{)40{iXtHsolgb^Fzzvon(t;m^G}+D<#vZ;?eL%@+19`!v;@(lxDzUj#s|1PG?Rhoab2YaxFa2(&wzb zRV+pa6e{-PT^0Fss&%|_W}Tq?6ByDx8fUg#{M8j-PX~(ZiM8wTdoHnxBBv?LL6(es zB^oQllRRl#i;FCs>W(sXXpb<;P6Lz5L4&z*h_--*{#d@s9D$iM&Oqs-+HgIk=8IQRY~`o0>ytw2HLQ`%?@ZXgPZ#&*dvI$98#s$5z2od_ zQMnc2K?K&AcBr^@E5$OZL@%3hPJdsQL0@WEMqaVGGcEnSYYZ${ARl@sRLI}1;^3r# zSzrD&Lp4-1)A;LF5!we-<*&?SONXtYRs8oJDt?b$-?*Ak#9fRf+ue&%n3(z5E`Hux zMqIjJ^cw6Z`br0}cVCwMUf8Z5tu<$AQ}_9O-hJhmyf-|H9Z99BdaK>z)-(0kVE1V) z&6QK+yWxKHvUfp>H*hj*funJvg;m=?DGjqKpz^eCU&A(kWb=oOvW4R;{2a2SBF{BN zsdQE)Yo_woRAzvF69IhNptJCP20$y&Lpjqjx?vTpajq49-Ox;AJ8vCyc5uPF(ZTz% z)srdU7dMXFzcaz~YB#M3z%S|;uJC+3j)wY5U%nSj%if(C{gaL9TL0w8+(ct;0&gC* z+W0_H|46f48y^{M!v!=qHCweC9{hB6|G@ff{R`apxGy+(IWtC%Ox60Y92)9BuzT~+ zv({a?WB;O_oTc(Khi^`c`gfyp+Vqs>yv||mjfmhv>dAqdxNPCU_0t~iSIl0g4v=yO zzDW54UnG6y;NNu~+h=payu?03%K2qh3uhr_1NX#S!@VUFS9m`owY5?^{>r24?OGa1 z7djQeNvAd5f44SW>1|!U4M=1k)v@46A_LvT?YjMAe<`o?mnK>-we;20w61H3A)q~m z%wMJT(#jgku@*>4S3dYXpxuqwgqqVSP)*;}wY`PQ1ER7RsZ#yc$!xeXDa=|R&??x& zqBkphIipehvaOqMOT$e;K7sBfGzpr+WB>p3?8C^8KCmrMyY& z$v{5G&P*gHTdglii;plM7aziW_F$r=b+c^SRzcF9*el8o<@mO9IA6$=gc1a2L^4Xc zzm(Vcy9y{riguQJSmKR(5r?!N1S4j(m=4! zP5PIjOzQ}ODM!?kT-Y>tA3}6GD_U2DWL+HjQbI`Sr#V77B~T|3Z72bg^m(`CAgSPW zLKW;}0dV5hNoutf1(i-$sZI#0Q^1HCOGP_jCPNg|zkcKOKI$5Kd zs-xdTnh~HtnN4!exO{K>J?OpP!pkIy_nJtU-V2K+m6Bg`lc@PY;*&i6tWuq`2zj37fumm(Rxb33zaegNpa`67ae5}J0RJ(Gb)4J{2%Wuy0@kxV?{r)jjoECDa* z+{s*E=GiSbm`(O%vjNt)O6<{FZ=760(3`qMUzo^}YZ-)#oE5=o=)KBl8*nobxcUBG zl2f@!nWFqGYpm(V&@^cj#30G*Txx?b{5vW0m)5(`*RaSfO=xexFu!0zfBlqtw*kBv z-!w=yb|Qpsb|2?V4+Fa&{|W;z5FfVBB2XQqfD)3G?Pg>Ek=$*}0{TKBE{WDJXW!B_ z9V8Gu0qraO-HP`R4^E8L?hD?-Qwa~vdkdG-6WQg&fbPAPjtmy(J?t9(nYafP8yb%m zoG&r)Hs&3Om;C`W$H(9=sZe`!YC%OLyLbC*wQa4;#l#xs>@rgYt)LJ?tJLYG?XEvs z<{FY}qO1=3b0YEA@LybJJ9sT8UPE)SQCjg?-Z4f^tYt=keY_7vJd^)r7Yu*(f1irs*+vHTU^F-CVJ_z${J8C)4Ap7NvG(X>#t#dd^a!E(@w#lum zy$t0VvxmeM=TZQ&%i0TYUqT&!8PL6^VOLE5o$vRgXk+3q61QC_+OPq$Vn`WkM*D*t=IQ6PF6 z$k2f`00Y8+GPa#{mL2~;09+9uVVbbaky{<;S9P)oXbk!lvr=S|7O)|RWOg~e$np%$ zFeE{d`%`eOWp)@J$8JCA+BMF~R|nEUAq(gW0Q6wP!oV#Z&^4?EN7_f5v{*li;1OoC5d6Yq5`3Q~g?_091oahU%t) z1l3vqaN>6QXaJYRE|n%8t3@IUO9PdmqgRLtt3=amhu;ky3jb`k4@^1|pp>M_NmNY^ z0hLIGgmQMokNpr=e(XNAh}w#bb%e{R!sXVieXMC#tzuk#F0oP_`=4j~D<6=~Iv3bh z&W;R;3L5Z2NH}E7t|=eGR#clJF;q?ab4SCOd0Zr~kGT~Le=Bx&BHwD0MSI)`Z0Anb+dW_dv0#>q z*gbdcEg^=Qulx0&<11^iOmw(Pxp{4|QB7 zKn2{KYbIxwU~)C(Z1XqyV?DClhb}@1q<|j=;5VwM4r_rZLoG+oV*9aU?HvH;tR{2L%u_LoA z<-%Wzbk`h_TD!oeg5Ne7v5lrwkfJl?$48_qN1aoa{GN_!LG=ixRDR!WKV_`X zfv-~4x3TbVP^gvTAtumrvEAR~{V;RzzpCHG>bG8!?e2Q&at;!B@U({;FC9_qS1MqY z4OPGXjtQhE2*a^I1n4gVv<`Z`%a7ytLE{>~B3AXw(mBKPLeeV$yOY4a@CbJY5QGv= z1Rw!_t_@U^S#$q+%;6|diK9s8lTd@u;idm55%38_9cT4-pt?mmJLM;> z0*8QIg}jzkZb23A{Ud7Hn`)jZ?E{s`1K-r<`{x5PCaTifnO_NYx+O|{avUcx@$*L7 zAzjkcE@=^F(oMwtU6+y;lskWC0vO6#A!w}IiJ!v6!uuqo3-~Kf@p&faiO{fpqE)2B zFESoy6|>RdXCCR9qVeiCtNRjt01|W9`c-~*y;GiOs#=05N+@k6PmY2QBHTbDL+u@p zB6nkVYMj+9R`Cx)MO9IwY{eIR0#yHuRW$i@n%N(Ra~|kW+8( zi_DYjpvw!p#`Ir-MR)sSoSq7TU}JTEi58wBDaDi)r9~Z4D#_0Z&A*@{Bi%fp1xP^C z&MYT@d-WfIz^}wBsWMpP;5?t&oS>a`K(+EIS;05~+R7c1xBY&6A0_<^Z3OtJ@yuK zox(04QZEmqEWRTRVwqppEIt5Q3GqKOA^tsGp13D(W}NcOE0`T_GA{k=6arws_tYzt z{&Up+S-8_qC*R@94Rf>L)e5JRu(zg>xs4Dx_VBEsu?jJ(9gT+sD!~+_|{qP$GUuR8X>|gnU zwG3Msz9#z)!g-%UF~7s1cM5e~%zNA68k29ysy?1o@#vPeGWdn_To^wD@bKn5=-b1c zYPFrIE3*vGI*A zc1K_#%FrQWjX7LjRC=m0Gr|Aymx;;QeV;iOqx}(jN`jDL$aFv5;5<&;t|(AZ^w*Zf z{357{(o$b#wcFkxxfUB8Wu6;S=WFwW(hHFSxskd^Dg1&{`1=B+)b1f6beTZfdoUyqbpZ*Z;q zDo;Y{QHJJ|R^hE0IPZYMfVQznZR7AYjGsVC#r+|5PAGi}QrPgJ$rVVcznw@4$A2Ya z$fV~G|A+&qJ52DZyf>uwAq6&}_yAJs@(@x&{m?437StR20-J_Bo641c^F%0DzT=a9 zmH!I>G>)+VsuofcND*dVWe%y!EH#Og&}bl~woRmj&^S`qu%g9|karv@Oey4@L`uVY zK2oGhx$**!Ou6#2Ou|oxnwO9y0`zDzL;E9 zK5k^P?6r<>Uvuao`Rgu;GRfS- zBNZq-0j5yBtD z4d!Y<|A$F+{MMNKO`o*MVN=czrLV#jhK>6w_d`l*=s_-3uH0m_;2eYSCc}CMLE@MT z*}u)Cu>LfYBKUV=@-0jXsheZ&@5bEU1z@jNknQ!#dz1d&&)TH1hyMpI0|?yWAdwB| z25eAg@97Irkz8xdkGrxDGDFqgoOE+LL1|c@VNwJC)7aM+m=p)T7?WRNQqBI6Ndf*R zCdI=~F)1eh1(TxDmzdP7`5KdA^0#8H5mCK;mAL@sw2K?6d6~hw2e?7^Rep$^rDXM0 z?k|v>n&=NTs71X!BDMJ=$QAQ{jO~bbU*)m@VIZV7h16!%!!Ly$D>zadPG4oaN|55B zkJ44;W7e}sZ(31!!ix?RQ3dAU2=*xVTGMc>erzeG;l&U1rXiRYSo0$!@#9FAla6+M zFdjwob0gcLIrl@TPww|s9vV_Vf)tL-kw^Bb^kGP8MJgkuDg0=pKx3|3DvG_!0KJ|s zcL5A-9M#C-Aog~{fzsX`2TF2Zg*ae%_?3WQqS@PuD6+mZbXuB9#gRV%d9q&~jMN5$ zM!PjqLoF^ro`n73NC~GO4)q?1le0^2?p#{UhEkjuO1X)F!EFtBoD$*(ty|5sCm==SISh**Z(%4m78oPq`bfh%iXCNhb&qhl9(tcIy{|>1tQX2V4$U72J#!WR@Md=lf zX`ZM*Zek=@7lzUYBBdr5IzlU_Q{nKxW)varsjhT>dl~Zm5t7e^Um*Py7l{lq*W2Y6=GDq+qN@ zN{CYSl)5~WQsP7VqwW!PAgZZx`BUL_JaqSHeov5 zpHo3Z6ssuwVg^;OSVgf{DHWem_#A^PrLd^p!qDG71%_fic=93nAdpb}cyMI6*c|6N*{7My^@y_K zMS-(cwWp8*a~Rz#9z7LW6^#g0ZR7fJOm+1OBsi1Rs2)lTc!Ok2Mxr(<+EGGd)lqqDP`?eo>cTzcA-=l zEXHot4l--Es*iiI-3lsTiF?w$`M|6-cVsDA?#Ls(R|F%JOygG?53?y_s`?#Z@XhsA zs3#-?oX?U%&S%ZyIG?$XQyyorT5uMt1&vy!$`x}7%UY$oK^3Dz;d#iTusBaW+8{&K z>1)sl+HK4fIP|ns}ym0{IQHw_V zA>>iBmn+}pV2Onzwg~k-Xl=pjt6UXS+Xz9aSDJ}RaYHAJX)r2}2BT6mMMaluk-E(2 zLeo*pN*gJ)J&u%UaTF=Fr9x5O^O2G+zaA+u?5Byil6L&XHs#7om@A#q`>EOuez4`r zOKrIlte3|gczou)-^ljf?^juEA@Lg4#!&IA=D)-wmnEDOI7qJS44kUHvg1_kI&=<9 z1A1>_QZwYu4n1J{e_Edcu{lj`DQ5zMDzt{t~X>_1Cay@1()Ip=t}@;9uj+%L!ET@eC~ zn*4d%H!(zio`#cof1LSw8@XU4$8&$lhU(<+BIK_z$q7)d*g=^F{Y)?bdvN=b|kFr07`@X z9&?rat%%9HWA1xnE)USWWsEFVbvv$HdD!~?yR&BdILI7nmwM(I>_x$^t*Tn)+W zx!OnLx!P|g-TVnbX;^>8qz3-E*w^1ODH*;iCjXg9HTyb~;=tWZiidYFDJI{^qzLnO zOlmHEgGsUTKVq&CQN8^Oa{8L$1c_C&tEG_4RUj_8xQfxgV1WsjFhTf98dg{IrQEIg!CgNmj^{DKhgQBI6vz zg&=i)v^!`8Qmp7L^QIm>p8`x%lbWTkLi0~H#$%Dvq0ZxwQeSjoCptlyk8nDyuW~v2 z6GU2l5LoT+Pu**oHaF8+65n3&*d_7poIoLwkp{gc*dvh=4|oV79$*gp zLn6Os@-W*RhhW=dBjwixxKKoNWdbPJ2L`M&2HbuxWx!Npq}{5IjW2rMT=L_fKW>29 zT`bVTmR-@5+bXKfK70(@OD?xdpegA|t!7^mLxl&$XevmsB=%uOuutEM2?m*63d!0z zl9{JRB%6mkre$n`gQ$?F{kyCCckHZg*s!$}lG|c(d#O4;)fhcmZ8Iplc4D+P+s0Rg ztH)}i?MAbNs~{*JX-(FeV0jBw>iAOZNUc>JZOr698Qbl8)Lgqh)#`7|)@B-`V^xOK zw)$Du0WMXiM@}3cYgu&q!8v^5cxJ3NR;pH;ZG5}<$lL@zwA!2-ZC7X8%~BP()lSsg z)sf~zt90ew!>7IF0RF)zZ?|k>%_H?E)~9AS4qm!$V(j=xb9^0B=&?T9US}DXu0yc=6A=xJ zj@FHj&&`aILhD+f5Wl~Sys?q?Nc#6oW8GM7s@ATpo0*%MS~uH3XSL?K(aGBAQPyuv z*AY709GR~9GGwAr8y_24H`Qp&t{cPWf133pa{w_r(ne$J2UVUkH$A(~K5Ej!mz_sW zPSqzS+odDT`q)GbJggoE+oq3zVk7NZsX8-_&%887OYPRtLwFt#Z}hdBjj1ch@E`&M z8)9-GCI@43V@z&}$;~mjB_^Yk4Qww>R2jrSI|9`BAR<@_0n&AV$&nde2Pl~gRNE(K zQ95-5EAq8SAQQ|zT003T8>?*ysew|pxoKOeHHiy+Cxq5scvQ9>icnWREnbYRn^@{lpsBRzePfw!w(;*+z>D8J_{8 zMjMTzbqwr^`UKIgR@>9nc6TH^#ATjAPq~sZV~010zTgF(5rN(ykw?*(`GxHLAz#TgX+)KI)7%<}iqaxh7v*qI?UJF+ukB_z-{lZtxfdwd7pO_h$s-jtm z@$Q$}4|V9oOl{2AUL9#+?oHRMPPN+FwR_JnL?0@|b7E5@+NMafO_6AuBGEQQqHT&q z+Z1JEQ=}h;o74JX$&>fP-tMq0HUV`C7XIgW~`m#Vet zT63Z{GkOwWpj_}F^%2a77MMV~RY@vOP*b3$anY0Se{&q-<~YR7afqAa5I4smZjM9T z9EZ3$4smlF;%0~lF5vRVnCoxORWTjLrfN+acVR{076-E}4rbf-(qyC61}8?wPTE=lCYRbZWYw_VowS=|$nhv` z;^0T8Y9ljqv!;uv!!@yj6bxN4MAdCZMs?4=p{G?33=bVXaB%lE!_`A%_4J9s&2yUv z1~+Y3fw|OPWiuo~ecJG|s)Nad+rEKN#%jmvqpokW(zZv!Y>$N59tpEO z5@vfO%=So_?U69sIZ&`{o6S>-bYq6SO5@Kq8xt@=5;UlN51wqbYtuuGW^KrjeY`<1x@=b+ogS;Ua(_d}1Sk-k6*yleYHiq*m?b4GGUHH!M@bT0 zn><<{J=z$D&LlhiACTSg(sPf3y+8|7=LjTrs&NF1MtypAu33|%$Vq&%HX6q2FN#V0JJxYpJbDI9NY;Je$qVSS&lHOlN5@CW8C z*7K$VJlU8-yU}V54=S{Sy35=}KGK;L7vDFPXv zq0!kYr8|t$*hwr@_0d>U0~xP3xh_Kv*>Z-XZ~|g$HUDrXOl{1ei+P7hAxjnuS{)mv z6C;sNwtE7POvFqG6AeUNF#s!++Stf$?Dy&md=JSeCL5yS*bo)RhNw6;M8&aTOKI1h z!w0V-I*@YAXfg;K)U?fJwM$p;IQX>c!Qn$n4DC5k!V@2uv!mFzpsa$2S0~{m6)4$2}^l!30{d;5S zNTbmvC1IC9F87U(Q_vu>)YeTI!!2+EPJ;TFrzxt;fl`n|h#cs7oc76cO_?<@Nx?19 z7c&&1LD?UJks~(1pv9+=TNpO%p|K-a(;+}WX}mfPC1%6KO$;wj(0f*1txncPW~TIiT-a&mU0)e6u|ghm_FvsjOs)gvR#X1&(*qu>P8 z9?Hy@=JDz32&`~WQ3iCYv}>rkduYedRWL@lb4CY1kxSjdLpu%~K4`PmB{^Tw5?eQu zMf_``h<{D!@vq4|{xy-uzne>S827e|Gs;0nP^>AL==ad>tA`I%2V!zCCb3juO{TDL zX{V$enQOs__FGD$HMo^Xj&YP~#7s5t1@xLd-UQ9K2`vTc1FX?3Om4#B?t2c#Jp|+6 z@SdtEwd#(YI}em*j)=S1kBCX*qsAn<7r=Q!sm*~wQejj}CJ`0W9# zM@fT&&pId~lpyXK_%pztLH=wkjbdwx@d2KJFns_EAUs{*&~Y+Dbaw6Dwazi*2uRuS7ngOg$)*6hu>SRL&~lOISoy|Hc2UhF4F6JhPjK3* z)i&vGh#pBd!F85H%^-~?BQ_~qn*rYyd@ioCEd~|4fal*Gpsv_u2R+r_Zi2_Q* z-Q0IQ_{G6534TS`UV?6f5eDO{J_BAr1yXsHj*pRb#o6=QVZ_uu{ms?*w9MiX@Tm zlbiMGOLU`@rrT7#b5r}9jZrbv$cQA{6Uk$Bm;mNuhE6ERR8P5@>NA(Q*_v~BQ_VT- zKWCHk5I;hYehxci_}h($q(2!#eU&BZu{v!m9;J}kop^~tISdNwiDub)MMEkYkp`4) zyQQFytp$183i7rado&s&I|Wk%34ca*o6k26b9NH8k?{%pA^4MzRmYl*S?dL^P7}X4 z)>zqz5(klFMouT0h0Pllmzd}Oid;)( zauk~+Q#FI64VI1_thM)pcn7Zmdt}Q&RSao{2KkLFj!)v8+gTibN;Q zv)DGyvzQm>SxdTs-W`P9LiK1+Fni!0yK1C4w#$~D=&zymSFM(&YqO*7 zXo-5&d=XyvX0eP4mYrb*M}1DF=@!z{I5|Bb$Gy2PxOs)IsWx3VS208v6QPQI@7#>J zIWZS;G+R1!VE2_*VtYfQ2tsdu5lF`HHN$%kRiCkA_aU3Dly6%EY#9W$+=X*HUiE8a zQ`hAGb}V;ltITeFuiCJBP16{7h}!A+Dm2r+9UWiv_vw7@s9c zNnL~7@LRVbURNC6wQKl5N)w89kWV^4Fff}N+R$?jkpT3EW2X?PPs+-pI|KVrWE9cPjKuAR`AaYfoKm%FP$O3#J~aGH$U%(Iumut!KHx44FB3C@$kbt62NV+yrR0-y zaw)Cmbd3JMI#=~RAMd`KX|(I(CxzG;4~VDX-5rJXI8~c~{*k-%R9R2cwBM#ezZ2Vj z|8lMuV+O@cHXAeWNKvbx9>T~{Ou!-xlmu~u^?y1imY-y8;VT4o4GSkCY; zo#v|hEOQN+uA8blD&@Ty0GCo80F1%2T=i2nl0^o7IgHVj%zr{(} zsW4Y?a6&5pv>?tFv#6RUFpdg~5IhDW1dySRVHc}SVo@vC}eH71t z;EYOVY1ACR$T_e$`~BR)^2iSHU$ly)8a$uiVKX}$1ceNyeMj*y@+V?hZ;ZCFoisLi z$mZ{}xeUmX%yj;mYsl$Cp<=k(!H@a(J)B4lkvZFoLGYm&7MU1^X0j6q6rm?naY}(6 zG8*^COivmm6Bh0s#7PPn=rKxZ?T%0|-KGXM!$PcSqy(JMhy3=WaIKvh18wqi+|HXJ zLD?C#Yu^Dsqip+SO8`%@!+5Cyvdo2t8bTsQ7~^xaM5G2x4%AYW1YyvqMdo8%7!xAN zF>QGOGHNkZJm0Xt+|;HxRK47U3GXwYW^5lsY|XCpIR{QF&YivK+VqXM{$dm_Ou6*1>MiYd;9*I|73d0iN&| z+YD?G<4hY1IQN&J77WOadu_|RAtnc6axf-!G;DP@#oWy?$%CMxMbR(& zejp~0PQy4su`muQI@(K`w2tF$uW2%x44Oocu1hi%7XYU~#3_T)$$D*SEYSx0pK-NQ z=ZW*eOL)Q}w;Vdf5hqy_t6!Lga1pp53!IF_g&^SM1{}d&xqtUQbo;uP+0xVohmGfXK|j>14sIZToAXs1KbTj6)}RNWh)x{Z!woYHmz7`s5{uD?za?2Z zObj~QY*lYeGWQHv8Pv>XI^$m$6k~P7Czx9YN1}dvU9!LfcX$Xj#1M(G8aMQi1|AT) z;BMuauml2h)TK*?;ee&7xwgE=kdXrLb>?t{%4$1NJzVKRt8 z+|4@hf|D7gxAj9|o&l}NIb1O~K7+`$ge^EtG|#&yOs3Ei+!Gs?n`6BZF;iDl9U+_^ zl4dZ~N4CcR6lc!UG*=@SgX*RfNXuD3?pSsg{*W=$Yt?}**=~&Mc0v&_>JS?`o+d#2 zjsnV)SLv;j(?=SN;;_25UA9lqt5^O7=K!&-PmoBUvQJ#^!gq=Y;Gwlpth)JA5#q{DxPp39YF{C!?&>9v@ zhZ`VNQK^V~&EzJVG!dCVX3(E$T*Gv$;jRc=kGwFV6|l1pOaN?(I^-q4qv^oyIQB1y z8qeSrMFSo32+;TM)|E_Uw@jHM&4hy#&?qyTe@q**LA*Yq7HM-Y!oj)#nG9grUCxa0 zbGM7a%13Bt0b%Y#|CvHlm(l<>gDGMiRO2kOX^Lp8;zFk#1uom0TMOh>s~$OteI$c$F z6ePRGl>B)-Etf8>6LSJ~M6f3^NI4@S(YIZI*}bDf&g0c-x~SOVyNfIv6msd zQ1?FSexJZ1i=+k5rS~~}FyjCe4Gz^{Ta6>yWpuR3%Q0i44Mw{y&BS2(P`yl~ zoLCE$ghL-hSy+ZAX)qPTvr!N#}{ z+Q9K*M00ji)i?sOTdiE7F~y^8RExtMA243wchD#}h9D~Ih}o1X(RBkso0BustyQ%g z-?hnr?mZ>QlXwAFlNB~%WRHu>v}nljjfM+;q4;r83X%-tQKKxuSH~qhphIyFgZ2)H zV#1M0>_G8;p0B>O1jflp7D@K*B`B6a#3fHmPzoS}z-|KHBC`!N=r(n9qj71RbSv>! zbTkTfr3>i}_bhA&Tz-N$@QQs269l0~M-j@7AH?VBVmQL!z4(nc8`C-Bx_IY}LAW$w zNQbc7!+=q(>MoWrLXIksR~`2s-m|AVym!YHxVr6YVHVqEl4b)oc1Ff&&?c8jjK&TS zgDI{&ufs#+4sEC&c&6_nmcZSwD`xy5*;02GlPCQV5!RkhYogNO+oBd zyN`d^Gm#SZ%!FTzPRQG_Y4p3uMX|Hvbqy7FpLO0bYOVzm4~jX zhRbz34_2?*eWhKZBjg~soRSdppd?U8QWx?Jj^A*bFUlHngUn=dgYaZ>14fzLaPu#d z8!iE6a&eJC^VAkF>Tsi#Ar9jJl;+>u{Ul`;mtZkI2`eI43f(}JLf63&OcL?8qXg$R zXmhZDCaxsVh0_O@Z_?|2IRPmoxVnZgbaX9zp*#|Gz*Ve1F^8**41P-rf<8+L!uV0O zNQE;>(!Rro_8&e}b%MInqYx|PMJgW3TTc+xrHp<%}fcSBpXc#ViXK z=<@)nbRE0Hf`$3MXWuhC3OVc!@AviXAT>0~0v@OmaF>xs5@s81=sJn8(m*$NfWuTl zn=X@xB?Vk`Z3+~OE72-HJ1uW6ndr7nrV(6rSoZDuH||D`(bBLO^Eo>bVf$%@k61Jy z+*qdt*v@4)7p_j-n_`*!V$z_4FK=#_fW%^o@K zoNwO1GZZnlu#+FU`fH}CY5%a+SYsLnmz~s#r|9+>JDxTSYXgKixM#;T!&%V_S0@b& zj)_~m12$7SGBShsVh=X<)~z*ekD05HxBGrK!tW{e|H!+E{USR=A_++ybq zcFr8~xfB^*kqQ1ROMGB(j~lS-HFSbUOs05)(-pf@XYx>g

jT009;9@)P#K7(02w#L2P`diSj;o1Rf=ZaLlrAoK zt_;QjUJ4kk`3Zv+xjsHGd=4A1=f?mQZ0P1_;!YKYN`_epYJ8G{+iM_Z_xGGc!trIX zom5q1SVj-$P|p+Y0)f7B9_fllW=&Oq|`VO zu%Cm|JHX)sDT?KC!HLgZE{ zY~eB!Jln+2OwW+0)YXAa6>lje%Up`1$4?aEY|98s)R_q!TLp|)+)^3;N~547@uBl2 zs1Ct$V?p5g3~n7MFi&}5^>iaKT~ds}xU?2(%#0n;D|=ByI0(;(M4X~16-{=hgFFGU z5|H5|W@Ls7#p;FxD&Vq7T{4RjV`+vV{BG(NHH}i65Z{?dFcUMK0jE@hQ$*c}j9WV+ zr|iYHD&~;mE#By%+R9FHuhsp+l_=j*6W38XSe;0mGw{?8CRq>%0VQg#Yjm3*M4~@f zF;90%6!v6UHGjmMb9V9+dP@yGgy7NW=>Zxk%>kN*%VMV?8kJ4&62H(}G@}q5=t=L* z*EHD#FM6WF|}11 zokQdWZgmJA>ynJ_FX#}`pSb{}Ou%)v5FTN{9V%lr4)mJ!*-1mz)no9M*x`WDLbJVv z`x}?P2^>O*qZ{)N5n*6T>bW}Tm~|4e;3#FFx*_akVqFHKxymsz(Vu8KoJdR3RM0c% z8C*o)L!IHhm{`f=2!b4Q2s4M2+_HgF5h=|%38p4ta;+ktSJaVKliWiKc3g}bpiw6#DL zymhw$qR-)@`{4rzs(bexs_xo%7#9mshH0UH2K3LM{@J8|HtU})`e&<6vWO92YM;gz zwqz5|J^k?RojZ5)rL^6+n!E35dZ)JoCC)~oG22p0${h5Jg|4O&Cdf|$DwUm8g zVU~hBcUKS4B*t?k6o=SQQ`ZMZ@xl##I=Xy-r-|l9H;}macc6$U#(B{VwV*mIgYQIP zGGqo(3mofTqJT;#FU^Mfyf1%x(KHw#>59xz1A zIw>GWh$r%Le(>=A{re6aLhMi$4~x3CN3c8&*p%C@k57&6JiKF%?gU>weD%Hq&#E5U zX9o?iPZI$@xUUP|0}gM_zX5YSn;`Q*57JyjV>4`=liItrDf>?Fi#Sgb5cg5Ip*nbG zVvwN9xwvy*kR+!FcJGDvc=yig(19VZ8~BPC{KG{9Lx*#-1NL?%7i3#WEDw)dSrO&U zURTVbJBp}UtzUv_rk5}$AB~qeRG(dIHgM-e+oq@+jA`Z=Lf9BzE41@($PzWS>_VnM zV$#mePqSRdJAPAhbR}Z)@Z`2YgiY)=8B&f)dj_E~s}O_|g?GAf3_P_6xZ>6WRkiM9 z3eO;*(+Uc70jGnD8AXqytBKsq#FPIDSk8`eZieyvjLX0#5KB}CT;GmiZQTnUc>=p^ zk-;P}+TgL!?n+rwkqP^v@nrT=_uI~dkAU2ro#}4twK>7z_NgOID*_i&ZDg9$}`p1^^kF7=GVp;<3 zN)VV*X$LncFR$KlCEn*8!n@^Gu0t9ltxYGb-EM~+RiV@8wh|R^)nrs5J_V(Ql6YQR zI#6{8!{yzihU9F5D8oie_?XyVLEpht;|)M-V%8!@Od;A37Pk%me{F9AW@lC2dp{Ep zF-8p5j~pFs#8d&v*AOB`;3S!RVm`*1Nr;H-O!n-_jF~TI&rBvrZKM<_$K$iVH$498^^4uZ|)p=he=V9`?5!J?t6gGD=42aA@e4i*hl z9pqCeoq{HM8zqc=0X>^p?lBF>WYa!xk}MT1z@QY^57io!i=dYJ!RqF`j|wM<^O~+M z)zyZZ#8%~%kiNI1ag(e=Q%5CQ7W#hVTiU7ABTrY|%G#0T_wM(1^)_^we!XLuMLiWp zOi)kFTHnSdn`b9_MpnamI~d4lQeB3oHDS>I>_FuI4*UPqS^5aE;wZ3T&1QQgn)Z@4 z-5X~~h{(i*<;wHzkX0TH<+{C4PG%U`OvJVrhxvaI9^@d_-IZW&&N93<)O@XuNS&=K zIeF0_ux4f?<;&1XYY1il=`PVT6gW-iX9ljbq2BSzeq}U8reMT zWI6@G0*KUw`eIci35^1_6E}FJIOd)DiAz~;LGrI_z7}X-8vgnkM66Jtz4$P*#5E2- z;HYjcYv2njX(G;F;~O&i{8*d}bNWIbCw~Sh8f4@91mC~H2|hCBQ3tze1kr*g7mnCe z&=hU1sw@d3p{J^Hq+MLTF}cix^)g4fSa#%Zq1I=aBk*dIUAfJ9=GLWJb!w7B(bY9# z-SMoBjUVvSn~Kr`B^V!(dJD5rtx$PJN0KPm6aAAu=}$t89g%6OoCc&Io11xvTM?xL zi#k}}g+e8;YFK9|(XXYKxGXopJeW^;rp0MHFN>id$hg(q?tjuNkC8onsI|J)OtW~f*GNrT0cbp&(LcV;wioWbflIEqSa;Q!5oZVC#NR}PSM1^X)1S3A;UtUjJ&-RZQeVa!Vt90s- zid(1_-N9B3N`f3)Tf=!ZD8DdxC)H4c(}~ofCT1q>q6D4Ys6or>KT#iNqAE`C6nMfD zM*{^vHln8;kzE{dk;5C?D(5{{g_NW%Ze*4~#?DxXYtA^VAkm~)Q6_8LgJKk@3$mYu z*ADhX1p_K;r!K+7OWIZbswZz`=rqexl4IMd(OYOyZ&C#&s>>+Uf#+H_Y6=kP^0#(Z z$(&H$BI~3HqOy&evOYLO&y=8;?vi;;m0cza%}0Oe=bJ=7bfl3wBZ8@zPhOf>t63V> zUD`liQ`xZMl((dfS82bQ;D~hWg3$PUsFeot+K3b6rGK3D_LvqiWA=P8eCTa6tCN+9 zRs)z%qm7u7$on}P+MfTSqp3||TSx+Gx@AL$ZzWl3PtOv1g2t54&DOyrsJ0`w zB*WhMTFZA4<`dvxZzP>o=}v9xw?(=YfrmPc1UrPbv%|N{U_|(HH4%p{XIWCO@bMvO zjnV1AWA_)ag}TYl4>~V0kzpA4V{bN;Q)4e*x2Bf^7tl2&;X=8F7ORbnx3EveZplj_ zEL600-qK@|lVJQ&`GUa0SX4%k$6@HY_-EK(RhHVz29%!7+cxsqNg~hIgOePSKA#w? zek2u|R7=oi^bGaSG*!8|KjrO|kI*KP#UP)Q>{A}MJFL;X$<<7@EG6S{*{@?qq-coq zllV7%mt-VsXEiO>x{YZ6%GRE>g;?g*&1aHUqX}+mL;(+TPt+`&iQ~_#@@8E`@-|Bb z5`a8$-U(d0$c%20E@%a#usPRsbWVg{quZJttRQ!vQ(3#2Wenf^Q?#c#PhP&|{UWJ3 zc9?tSFlox_D<1S!&ee1-M~?VwGRwM%V21@uWvH_z-ie-5NPs@fyP(NVNL5SThOR~F zvBuYEDOldp@mX$qhqu)cLxg5{VWigDj!k^@`5K>!#c5ES0wuJ1fshl+Dn^+W&F6Nx zE-dkqtaHsSr(2NI5|`s7uB5+5uSzYH#&SNGsm8QV7F&1^?lDrOX>1RzQ>fvl~IvVH?#1$E6B_ho}8mfg~$fp#~M9&sGi+JYO z$SDRENnbWZ}e@ZQdhNkt6OpQ&$vU6;;WI>z@vJ-J@k!Ch#<{P)_zld$* zrw;ou+*}>X$GA)R7<9a@qwwFIpF*szv^3Y`tle_EWF7LSw4y_2VhfQC6u$tc(}Kxs zshrBh#N#H$B4b}DwrzfKa%MNr^8V3oZ`CA8XY|3%{hZFMOKI7?rIYD=0bTy};E!=^ zA2RVu*dua)wk5FX1hVJ}B}H1-@Uy->20ejZCNfH8h*vUyJyO5!TJ-&-cB^rk)Uz%! z$WtX(=sFWUmBkNb#i~M~2l_f{@GcP)xZ%-ct4fP9?l9i;Y^wOEws{-(t%ZziLj*^Q zu%fLukM0}a3R{c&{3V3wXiksg)eC6&bJt}qKqXZ6B47zk;?~2@j z@=-04sB4?NNrR8{sH$f79R!LQ-RuYfhiOCDM=WW{oD{@i;6XfIg2Wp6OL@!S4_1UX zCNkT=1ldGu*X&r=&4+qAsz?MF!{bRi{{Bi@6~PM}3h%gVu<{BtFujl_-;RbLI!|qL zkU~2m6ZM7xJJkDxXJ&65QV%cIsVk=oD9BUDg#o!k>%`{k8!d{A^CN^priF01hdNG) znkeHbLF$%S|J2CHfrJ3faJ?MswQ2lt4Tjyn*wB~#Cf>l`XbL5qE%zlUiUtX@!g3DA zW=lGa;wzmKR0%CnSWS83n4*5ka%T;Vpyihtn8xW@zjgDb?LECr?<=~dal;nunMTj` zTh?^x4DlxaU7Ek`>RrEWU5ij{Sj$V3lu{4>E}V^vBYU{oqAA0k_3PR4kPnRLBENkm z&&J>1E^A82Nds#rt&u>@3_DA{+)AUP33ir!{esHQ_iBrFQI<(lW0vQ1Z>C2!`u1+^ zf`B6FfEHRK_1@QVWJ1@J!+Lnx?AhJDZF`gN=APc(_c!?(Va=TBcbrSQ6eSoVkf^Z=-!&<0K`|FVcIWz_jOTT2_TCpmvNVPKemg#{&M^Ev2CRT}b5EKW)Fq9Q?A^z%W-qZBoN+|uRHv~m*qa?Nbf%c2C5i*+1(YoXdwF=!26X|Y@p+r;`}E_&YLWOj1}?L2lL7o z_K|BzY8t{Y^r%uR^{IEZsSb8>a(!m$LwR;nMnQOK#VCmvEnIb%sN!6Ta+4Mf)5_= zd*9BDYq(~6-0rA$!r@)Dk6YpUba?^`PmC%0;*-zvhxp_hMOMX|mA|aM54&66f7`G# zWTyq_K1qGW#OzgPoM}ADYKE{W@gkao-#?D+qYq5aw3ktM28v`ZmG;RZ<^HF zibyEHNrWI3VoWM$&Hn7}UWr49?|07SWOb~VnOVN9<20vAd89>J?X!6gmFNX8XVGV_!gD#*@m&dX}j^$BN;&{Yc*L-g^hD$lx3+}UUyHG4Rus~b3ws7 zduh^;kuG)U-11)g)Rk)ied8Q^rO3N47cEianHSY4{3t-)-Y+J`28MXKQBbRXkdPp` zEdteV;$3qlqeV>h3e8}w9JFFCX~vpVR9*DErHibs0~Syvb!|UqefK&}X!8C*mgOoM z&(r~bfo9jh(arABr5q)~o@LhL_D_au!gSZ>QVQWxS_Hr!c!%P*Sx@_g9pMn?aPtIT zJhB0*@mdhOK833ty#=&l5ccxT9y8v`;cJGj$D?180f$AfUS?O6u|(o`jHXHK%NdOa z`Hi8aA}uGHCb>dG9V=F`NR-CN^Yl8GQb#uELI&5}zZN8h???Ec%kBUfMOSL;Zj#mp)X;jZtJc~#rhp#*D=cP2FCnVBhk!d}98iF6ktsYl z+mYLZP1mNrbb_fW4NYr!LMBC1qa4GOaq`)?FYJZ@R@|)|?clNF-SffQ z<3-Y87*?>AxT4o@5^yWq%W%44iN0UUULTd}#KNKt(j`x}%;a|_uGRu7!`aUs7XrtbUeSwVWPq&`^*2HPk0?*xo?<>2Q_Eb$h#zBd?#$X8bV^3B>0) zabSuj@Eqq|j+og!UaE&K8V=EoRfvW(Nqk2nMWv65t@>~-%^990QS(5Z?e6|!8G|4P z0T{>Bo3$I|S1$>9*)9ozNMlA$q=?Dm1$KaCze84>g#8L>!(8;YYEG1miFR^^?Ly-V zZ$B9kT?iQ#s<)s`LtSneg*yXd_~v^1>nUr z->~}VRYdnQaq{bhl|_*uFhuY}tr0!oJ{GT=dS1X+em!K={bE zAkTd5C`+m0x{fu8nZ?!`8pY_)1!4Aqwx77qR<`0~9J}4g8WjWAO_P~Tet6EZrrd15 zW_-I|sZ7!7SFT_X`qi}E9!^if8ughAOSOigx$S%$AF}2wtnhu@#j3+mb^MXlOPg7n z=;ru#?V${^t9Z6Fg(ycpS<{Zsbm|xlnAwBs=Y14hZM?#+7a7NKB{xa;5&e7y8n667%LYvfvFJC}BEKCScpi#M+6;x=gf z;mMTffa=QT{HyP+nxt)zj@aD8ZsX}L?k69q@dm#hs2=U_VShmXl+H==dMIsCk)BDK zpjVf}AiFcYW8>Qg%nN&enxdx0dnHJDfu2XF?hl%siW$+lnboTyRC~P^@*CT~d>LQq z@ac~}7$0CiTsnjON`Z5b*Wu05k`(}KUH26W+vwG6165NZ8Y^mBY(4Gp z7_yQlsiosMZ=_31~G5XMy zd3M));xxT||0n`Avy+28YTE}kk1CxV3U1NJf%ll%%w}$7vMBCR;qB^HgtU|ONM>=; zPm0338ZMX_pV`I|ZAynIn3~yUuahZ*yfE8|wckhw{!(q+*yoT?^(~`hq<1XV&}f&h zT}Cjol_f*IzUt}qIy7)kv}H5z(+zhUYt(C~+JlZ$w^Xm3s#=ITS%}o7m#}oOqK|B~ zDb>`B{oPU<-OD9bQ=a2ib{cX7Z~YwKh?J>AZl~dCC(F0fCi9(o>xLfcsg3lF59+&t z@tI9F)9wlrcPX`VY?|%qHrFlrdVPuzN%ats7k!|zlkFnw`0!C)mc(1ZA7K!)`5{i0 ztk$+y^`((U-6B!%Scs<`0~I^t#_6h0h6+Xc$h9Ee3F)rwrFA9_r2M6CN7|;U>$Dx@ zG&pPzD>HQa_<^pmx_xe%jaRpGCN#%d4R>QG=ib%cnJric@Ha|#Ba6qYN}ythloMqv zE;k#(7^=6O^Rzgbb-zcNnlXa-kjo!dWGF#Kj;+kgqV#HDvBc}R^@7zHdYHGn*L`Dc z(u85t*f2JJtnzquleWQllwOVuwK&~17+;sxn=$DaT`whXYcU8}(#~Zeb;)tcLP%a& zbNYf(d^IiEF?3zltN<72(&7D$x-OL{gmd|<`yxp z@Ql;vY##Rx61Zu8D#4h2YG$}=%w{RgaM-)%IPOUp?tU;^hBwy>C^~osx+Xq5-up&^BlKI$qrm9XE^V|b#!n{X9uw(s> z_1TP0u;JK~fZVRjW)Oji1Cj=rIWdl@PPKb71R=d65 zMPeFsYN_>TGOG{Ye{4kSau%449nQ-j(Hj_P8<}j%*IPGADpJ?bNrIZ~(Y%ZPtuw81 z14oS3>?iLxDuq~0Dq?yqZ_+ge8r?zdcl(>$X%oohv|>;L;o(%|(4ud{NK+X*Y$@El zLPmK%8?W~2K$4GWU749$l-C%e|At zQY2*RKxMi1UTrxi9W`{0anF*PoP*l0^>U8m#5Br^!!n0_D2O7xW&rvmftV+7P-O*{ zTh=|CMO~|}nWmQZnMz;{Ss8a~J-%*@Mw#jC8(pgjod#pw0Y6#eJlZK)tFbHwkM&yS zRd>&(Rh^LB>lP$pYNpeVdyGbfcebfvH&V!vgw}?ZnJ5nCi>bISw4IcyY|Rz>B#Ilp*T1I2y$;V8lM`DL%YRh$|md7+Y&P)R$QWM%`MYYMTBM$`&$)i88|nl z>f}=0x2`shrDi0XvWC-`thN2I34$!@YmQuq!<$#N>Qd7tnqcpnTMDalX+vLpoiM?C`mXvl}aq8FD$a${nej?Y*Juk{BSg5L3N z<)cFfx?Q4J-4{oaaA1^%JdV-wM(?Ae>|hdZYGPvAwT{=wvpHQPZsr_h5y-GV%)1uU zh$J{CLP3F$#HJ+Nig!&aWsytm_)N5CLpAao=vl=QLz5Mg*f1F;fO<5t5%gxkJF8l5 zN7W`cMZr2~><}g0jdF|JqZ+}ynHo0IWA~%By<_LdWVKnOs7<@FNu!G|MTnPZFXt?k z_c5A|P}U4H67?Uj!HaQps_FsOQ=HeT0d_R*&hL{^97CDq{oeN8?KZuJ7+f1%Vy2G1cqket5BsDd&eRTN1_E9&{Hc=I) z%Nq+@H>(9T;Dd9d1EGkD$THnJR7ZZTqS^Es&Z`e9Umau9*qA1JUs^ylnx?nBViyqji4^zaNR$^@=2BB7+&`HF!b;w|g*6LPw*EWf`n{f0U zhyi$wD8XD~)t31Hv}#+5g2ZsfSOFRV!QLC*zc zVH60B&?l?D*lq? zIE#8gHtEDcll?LlR6lmBZ^NqEVJiNWYdhat>0WaV z2b{9F*OKK+mM`pBw)|boPFwcwg^Ne3 z+EqJz=18rdl{B#KB0Y0r`qYl0k?M@T2bJHRp)-eu$4~8Oj=y)|;_Y=DLHaweXKH9z z6Sl=(Nqk1f7S|;&i`m;cX&>IGZ*m6ZBMpV{NO)l9w&C_sQ&fc+c@*Qe@IvV zHRi=)KP$Ry(`yXqjhr>U7BsfXx|Zj?V;fdwg~K$Ov$N**R-^fr>sW^l{delmDNe@d z#mLd((b|5PEhg`+b-0+F+Oe3I`J-d|M;F(I2bQMIxzrjm$RKQmZ%9odU7c&TZQr)J z6Bd>0T=FM=Wdb>+Uh6jRjgisQ+e^ zaE7zvi5JAUDB6z+X;th*Y@kMZ2vD|DgDt7$ZGY=(5J0jPv=Y$qbGFf}UEWzjmsbHM zQAHIc_bt40$*fEbw+ipA=zaW*aga_@nWny#X`)v8y@E}}=z13fuTrUfxSuLjDhLys z-MjKu+T7E#dE>S<+j!sA>Q(eFq~xp&RhSpVD(xleOv@zj50dqg?gCEIugn;0QXg%( zWe9lbMOr4I$PL|VxD&9uM+e|D(C%}E5q*2{?x*h=EvYAO8)@&^2J9>Ob zdWo$^c2lGEH1`0x6`ODK>wLL6(YOC4S3tKM)`$8Baw*@w)fhB25hOC;;R|S5yAx5d ze^Ngn#;S!UV!WKxV7X*-vn)Fu*M{qw8XjkB!~j=1@m2eoqhq7Bh1KyX ze;BWwxp?`)fvWx=?y&!tSBL$t`I3SEe#%cz2iw}(JLa^tlX?5qxDcGh@c%fvt^M%J z@h6_*#_*$gI2Jb__gdV^xMlhaji=zwCBk`%6n=`c0H+KV;uN<77k{eWD%@GPFX0}* zJ&b!27xSDT-wSZJ;_krRh5IJ%vN>6H1MYU*ow!GEryoUJ+zq$~aZli$!mWbnvv6y1 zn{e@`d_RgCChZLFV%#OT_-mv|v`ph}!$n#i;8|rqflJGbyqNQ{EIS%^0&WrRA>3Pz zAs^g@xT|s3;%>m*h`Sm0Ioy>m#~=5{xVvx<;2y$#3->7Q2<{2obGQ}MNp+0BV`zi< zxbw+p5AIvIRm5A1Q@-(c0{$Ji>+n-K@uxb9H>z98Yt^wGenuY0x+v|JaFIsQ)REA0 z4QbRSN8>j)@qZ-nBBqb!AIF2_W*&7oE|Dk6${Dx~xEpZscLxt&!M&ZhCnoV9$L|R4 zMCx%NF8&Vj{1EhrPbwq+zJ>o0+>^Lo>Uu5iI$ZqS$MgNT2XGH3{!jDVOMd6!cH>mv zYjN?HhFz8TKhLvhI3L%a&~ZD@--I{c!aaeDzen*uf_nn@G%o%&5vLn>0q$TDU+Kl; z$8e7){%QjC;Wy&m5;JM=TbTH7hFWN58SmI@|9jvy&KzUHGXSxTW~ky;_omI_u&rFUbiRh_XK`V;+7#V7vtjZS)Ml#?`+(b zB)yIF8)%#$MHXcQ(rxnvgan{r(w?%{sJxw zagIykrD4iLVJ9ZxdTv!e`LD*U3*nKz%faIHJ-GXE@%Kh#cmr~IHf~oUpX>17g4>4c z#l_zpJl~Cz?EfI~SNbhD^?}|bA4QQ2X`EVui{sA*+F=v!5+Yoh) zN!*1v$;90_$;IQir*L!B?ji3R`KvMO8@TV_eu#S>_j!0OJ@P0{?J);_NN3y>c=H^8 zpBGKk<4N@BQ@DOAF^C(+P2l41YSL>AycKsFE~bm&k=Fb0cpMjLya_rYZIAFQ8q~%r zJM!e&K*QL);6v zIn?1;oW_DhxbtzUWBhec_8GV<$mc5Dv84GBZUU!#}-78qeGg~Q+y_6C14 zPwx#f{@R$|D=fZjTs<6R1~v9pj$div(Y`$@n`ii$xiS8$4DbGW#NsCX?Hdul+A#l# zHRNx9^ce8*dd`1G8TWEX{NE@5Pe(Oy_NeT24dJhEz;9^4vY3kBQQ3bf08dBRXkU08 zmAxsnkoz5-egCJm=Vs_b3-{RUW+39skx<6y~&a2J1{0iPIf zAAj3VX=`5?@P7WD0UnkPBK}3-TNW4je*zqTD*w}fZxAlJ6#q8<9sx@xh5wqr&w^#w z2tUBz*DPskmt+b53x8h^j^W=0F9WN=6#guKSA$Oo_!ZE#C&6z5UkqLp!cPL<0+!?{ z{W|a=u=pgr8~iYML%_1B+n2VruMYT+z~_NudgxCr#>BL|Cfb**@dv&%J9Dm}!_wiNMU$)L9`b6}#(PQ4=DhkBhh5El4e8u{r{wINN z1jqWU1b;pW?*!kQ;4bhZ;Ml$&1RuSjz#jrH0k5Du)nD_hJz(i?;ZK4OCioWcAA@6m z_zL(AaOC&5!4HDFL;C*&pRlnAe>Dwt2Kej{z6g8?SPE0+y%&5Vcu~MZ;MITU^_6@a z0Cy$$zk%;1{&sh%Il}V*Mnnz|A+E!2StG@pMaNxv36@4prK-3VR;j``gMUI~urzYXpJ$M$_5JPKYI=%0TK@&^8Bzze}w zext2jBU4*;T(%NC=MzQy_JZRt@_WH2%lvK!M|#BXCE!>;@nENBtoA+yzeg^&xP~Z$0rpn&2m)C;r6$?}P9E zqayxKz~2E!e!L75=9ueQizAWbcRu)Z@QQ%n2p$H<{<#o*2l%!SeiFF<({1gKG7c#H zO7QB>w6)(K!qN zKKsCr-d>Df9|O04u^6AO1~2)`w)Tfer1bv_{KGrj+D{4i4)EFFTLb=Ea0ZU`dqg<= zRNmv@8~)DwxAe_3;77sYzwj~8`Mm@$0FNi**U8|?1g`@h4UXw|f)^xs3_O#>zZ`r@ z68;(Rg-Q4w;DZVN8}P*m{wDa+1U~`3Ji-47zB0jWn53%u!YTl;hHOYJcNUi(*V?N0`L3Hb4Qvx)8QojTcPK*ugThb$*+x-fhFKUFqs=ZtAXB)4Y;cT zp9}7X-&DioaTNT*WkvtKup$1(8}RiF_Y8PDSQd$=L|>tI+Me&7G;!{CSW_4#?( zKZ9Ry>-vf^FMGNn{ZGJij`8`6!e7A@Xy#=Fek=Hy1TP04Oz>*(kpzDLd`E(R2YhdW zKL>sw!CwVGp5Xrnyda_H2jKPuzY0aXBEjzfFG+AGc-_kj`ab}UKgrtw_@aa#2f>Su zD&l_%JTJkY2H%y$|5Na{5_~842MPW<_>D>WzXuN__bx1J-ys@jFHT(s(!xj{W7s#J?Q8mU!w<8Xq43$Nr`9^l|XQ z5U&1q;=v-l`rBFH*x%G&=YZ4x`dVU#cJSH1*VcY{z`MZ@{Vx0pg@N?vUMhO25 zc;%&q{rv^-D0pQEzYBa*g1-TN1blJ`|2FvO-!JTm?}0nO(LQ<}+@IjN^RYJ*ya0S3 zcy-9{ZQx_k$7ct;9DD}y)C-opy$2kB>VF#=@b(6LP6Mtq;Jpoaya8X(fIr@VKh=Q$ zqygUsu@|i@`j_V4*MMXH*80b-;5fffyWR_?+nIdtCjR|kWh?p7{QHpve~y5sz%jqS zRK#}`{rm60uSxJfgBO8gc|Qi91&;mm^(=v%3y$`I^v?`9>Yon6?*zy8Ukg40R4L*_hu|9W#&jLqzdKf$oo(%o-3Gk73 zvmO=7e*xUJs*vY-D7r=ODd>5f6kqsBe%{i6-_d~89vx>C?eQ<*mEg!f@xKck=@tJ6 zz{*Da5dUWqEdF1Xq!<5h0!My{|968U|KCGK-vKWQ`E3QyIkSkb^_RDRPYB@}4_1R0 z2CVVm5^$tP`uZpznnu?YG&_>7R>N#I+--2r!kUr6E)fERQY`F#w$D#3pYJ`Wu2lfM8@CgBf( zku7bFKtCLx{UeyUM~?p$j4hJm?}Ot{^7A9`4QChq;gu}G-wlrP`J3QJ!Ero49lZ9v zMgQ9Zjz8rmdB2tLDDTn-hrp3P&w}pBBF84-wuG!tV!P3Xb;7pyTOa_S9wp7ej2ENTc7x7O3pA0@Lq+bCZ1jqb0fiDF|`S}3&o+Nw> zd;}cjSNiPPBwYIJ?DrMn(r4#`BmaJn^b5KQ`$_uke6ZAt>MQ*=4vzVMlK2;c$3ysy z;Ag^97ckpH4n7>}(%+P*nAGP1Bl2;T7~z5MTP@xmwX4lF!!+6!9gWZ%?q~b5(*R zpW6~VLH>IZ{0HFa1WSG|14sE4f3E;9#9#eW{Jkx~;_m|q7C-+Z!GA{n$L%fBe+9e* z%pc3||K;Iq@EHOB2z*I`U-xGAp@DA=;j6%-gGKvSz}F@CV(`7-DF3&B=M5G5;%ne7 z;3!W=z!M6O?Tcae`41KOzYYAI1fK<-yRQg;KX@hhx2C27Dd3Yq-E)RycS% zg#QzG!$=W6=Qp80!S4WX7%k#&2OkDU`bWW!gJXZV3VhsH5&lK+3h=s6-nYRs;28fW z;F}WsriIW4Ml7v;-UH6Yi}}PZ@X6rF-)ZnTIMVYe@HOD`NhW#G`-NwcaE%v_Oce5P z2l3zd;X?o22R;MLA4~tQJe&uP^l1I#yvd^fYW-sr9Q)79-^zMSlHYHEZv&qm^4kc0 z0=y{T8h9@BYzg?c!8^fme)}o#4d7KFT;tmk%8U9`vNPI|z>T*ZbRp;HXcBFi^Wa#%-p|gzrYQe; z%0D^5iwIu_j^*op?Rg1)_1hpc{3JiGZ@_PE!0!Oh{X@5>UxWOe3Ept5uh+hYnZyUc zm;MjeFACoWz7ToSdWY}<@R65${Q1QHL-6YNIR6!X1NencdjAyuGw`~rd_7J0OWM`{Y~>(4|@T8{rliA{Ym*RScJY@ z;QOiO^XB0saQsGKKK$tb-|&A&`d^)$4dyrB|C^tE5c~x7-;IazyPzTcUt_2Z99{71 zcL}%e4lI*-*`I*#zP7FXzL5Tl;0@RL`*7v=P4J?XF2BP63_iEl^{?;`!O#7<+k?VC z1)wBkhrb^I7yM?w6SzIdi`xGu@8ErA*v~efndzqqA3rhje{Ob2 zIP7mzd;AS}<))&({|NrZSABd^eV+wS(0?@^2y1g+KlB_l`j5+A2YxK!|8IdG-dyl& z6*zlkY@b(U+rW1rpJ#>qc7P9mrI62k;Q6$N`lHJGFu47lZSA{+;pcCId*4*>_xHeY zzu)}qnCvR>D(It`Ed4O}Jj#poe-`}sQIVc`*%!cPCHQ`@_~-3&Z1xEF3g}-Q^7}5h zH)*dq@cS$1*VrHDgO40jEG+YSDf6|enqHXH~1RX8!imxje!R~ zUzGn*@I_zq^>*>+8gSa4w}2%dPXBS)pMm3k!}%H?!IShi=~KzygW$`9{!o8^3Vdx+ zpXb1-Jhjo^R3EcfVF0Z0*HTXID%Y&glJHTsc-_-%vz^Q(i z1m6yS6)yTN1>cRniRJwXcqjZ&A5s2a1mAk5kMF_{g1>Z5f&U5o0PT17u`WMPf_H}X z3&sC2_(s<6)`k531;IIShucpIpL-JXWB5gKqv!SD2a@(%4xYP<{SiUmb%IS95MTOj z2Y7(~H6FtIz|%qAPJmw@2A_fc*Z8IKJ_eqAr`u80p+(AoQ^l=fahJ& z);<{04}!ZBd*ox_NA4=<`J~d*pLQ{xDZkHvyOy!2$8SCq9ReTsg&^;Q{}uQ=;>Pjs z@4+X0xvl;4p}cIG=fJmh^L{Xd-vhq#-^h%g zjE~gkjUoPj0l)tCw)T4iUJQOL=^v}W_jmaF9PzIQ{6x}U`bzPS z$;QCfQy*{tS7#T4m!MyEhxWV~oZ7>;f#)as;vVoW*2{(iJ&%EZKz~>n(tj6xbRu7E z%aD&mf4l*FGVu?E^zQ^e$owLXe`kVc7%yV~J_r0w+9US=J>Z-FsOTTR3%->497}%U z_f_EQNRJs~?eRJAB>6{v-wED8`pED913s9fe++!vWMPm082rrcw)TmT-|>tmy`N}n zKR4i$z<1o^`>)0SRp1NXTiBZ$z*i>xJ|8@%H`sf`=dgzCJK(cJewTuuroK`CeoE;N z6#V%d_{6*0+HVN_{wwfPD++tyMVN%Fp8n5E;m2q9f^VZe)ZbM8li*aJJrBNs{uRsrjZ@(-_Fu#&f{&oz zBoCT@tOOsTb9nz~%Qk`at!c#PfuBt5qYJ?I&>!@DqsspzIL-&=gRcdr{P?WmGe5g1 z(EFF*E0Xc_>q>96*PrkI^dG^yk*D?$|GVJJkeA+oe+o|LV=rGpKwH#Tugrc6d@k)5 z)4v?zw2KhTkxblA*JPo~cJ4^pla7xdyr=hO{|1}?c8#v|f z67UIsfqfC$V>OtJg8gx9)(w7;@hS2{SJTvVf-UDA*yW(Q4VGt4J@U)rYZE#NA-S8* zu6Xw=P~rs{jy!-HZFEg=ywgDfbQ61E~x%++45iZEHJ8L4VnBW3t^R#n5 zPvz)KE+EZgau_VP_i&L#owHqZTe3WKFGp4POyoWs2$qEJ=X6fp#K4Ieoa{C+HSS4u zy|Y~jEy_5Ch{K%oZ1b?OdWaM=%tQ1rQ5&G-eVk1)V@c)5joo|1HV#Fa$bv^sGL;El zG@|)Bsf9l`>9q78pJ?!pQV=d)RPA&KX?lw=CwPsH)`sgIq!VAbS(NkR)mCuMnk%-> z@RZJouFyba5!*_SML^2$$c`DVh4tGb2Wp%@>UVYS4a{#D$TjBHPDLQsMhx4bo_2kg zN@*3QbkM`imD~oxxz0MvgNs)xl_e`qTY2icvw>lqp~nA}{t3T6SkKk!#B$3v2ckTH z4r?@l0Y!@;01pu<3hl3s<&t4ZImAtO-X(Gvy>)$8qqokZ)^Sq0mOZbcCCEcwBvIsa zkw9n2H5bGAICi^oPN@XVQbOwl%1uWB1F@ysBJH9TIz+s4 zGALfVXfhA0=NIoZ1=A48jhJb0q&)T0MVvqT+R$*prCk+eZIk6U$I(2VUw)^cs};L+ zH1{)>HpDBF^J3RE(X3(~%8A1j8B+QyV*`QF;SMps(UWT_ChbrkPRy*>WjVz)Kgssd=z@EEW=b;4~tc5x70VfnHp%TMp%9H;!QoebHv%Lz(nN^)8Sfd-ets{+gri3# zZ!dagaN{|md2MydXXEjp`5Aus(Q3MBe(`jNpcLB=<8tV3tE|dLNOw z!==A}XkYDsn^k_-BVGGNua?Hl;?DSSw-$S{4V{(F?cM7un>lNeGg*i2G`y_xA#Pah zu-kj1^P;_o8$!dwwP|h3*U-;LDxp_Rnvm`Ukjvh*4dNIKs^^2YT z=+-0-gSHC)d7?5X^nBPwfxFCO>!fVUB_1h<(6#BuLv^BT$dI` z8#>R=L%8-}Fb}g)n+Sy(o{%06hGA`TNe=_@NVRVYJC>md^M#CEUvs9Ksq8cqFE!o} zC%BXI$an=SdrT2!$Jw*ObOCbV(a)7Xc+{#GMM{;92@`hT+c>-xQ3Ud*XJ;fpwAAeu z2ZA*FkX;*yOTs2OfqA0RS0AA=V^yxsqXRCq`j3#4(Jn^-CubY(9DnX{25{b*{p{^T3tHWa)%k17mRCzc&s|=CTCle|7Q3x$4qJoFB##qm} zxM_%zi>@@e)wRi^qrVi1lXUl@Yf663M4f-v!rNz_rGN&qJb6O4d!&?j&6*-cVzAk` zsv=a{WjzFy{49O&@x00jxlF7?XH^~z^%s*u7Ud#5LouOLLYR1a1EvIo1`LrydjzC{ zlSgO>2x}SzKcRM0mtcD8M@z;dPUG36@xajh?8)MQ$kKU^`9X?|1@@eug{Xyyp)tHQ zf6{g9syH)wgHz^Hn(r`URxI<2v%}zL3J*IG4eztYG;XWFI1(sBQ=kYsY61!Isi|gM zDW0-xm4Z(a82tC@@_DRK`pd}B;23kLAzgHXjos+K$M1MTBgL5RrihK zA~j{1iFq{cI;wHPsV-a6y|1%JWIbl2vWI0hyG-;&BG!lYj?x)owzKDm+D2C?%h}_^ zTJ&?9pxprUB5^~0Tx|9tk*pfXejygkk=5_4c_t_NM(ZrZ2#ZE_r6M6B99IXL0;HJs zhGouD3bHZrZO%&}W%+C!XBZKuzw3(U))CaUtwX#%*i3ekb`#N}0O@5sX&Gd)7XsDK&MuPUDK#$<|X|q(iJE5WL+GZ^7`cE+eE`x+jPsl zt$Hy=kbAImvG|0f?wIKiLn}3A_R8BxaDti9j%7`XaSuR|*JHsq6}Wa*@JD+*6Az4hAi?(W;K>5 zF3QOx)wvzDT&)(7B6ISV&*MnJzgRg#+-~Q(zBw&APl2;g=z*mnt6b5MJ$=h&NlcKx z`)V$hE|VSGaxDFXGF@& z`dRVnqq+7iv(m{S_-B!|qTS?^0HIGqVB&%WWc~JLiUGZS;&lvEAg0X~bLhe3@~mq>Q72 zCAF;**@~cP^%xTQF4mR;LVtu1u6x?++Z9R?TsBR!o4~~NdfK3WXiUmyY!n@D+dE`a zhb0FdSyu?g6A68-LrVz5de5yoDpj=v-9Jx81elXYc2ebOuMX98Rtj;f8O@vwc8^t| z@HJ~Vw=`3OQE!Cv_qzQx7bDiR$a$Cx0Qm#SlZ;T!MQPrSWwfSeYh}ZZZCr!1X6O2f z?iJt4l~JABxnFBnuPPwh(#24M1l ze{5h|3H0$kSiJDx?=wnb#cd8|p}E~&ad~h9*oasbm%a%h4vQ0bW93yUTpG*$B9$#% zbfb1-VTFrQ&?7dn9vU@&%UV~5DTZuAinoSf=|@*9dcVoLoMqUxz6B8_P9)}k+$GeQ z?@+uO5w>YnYpBkAxn?^_(%fw&!kT$HEVyN1zma)b#RhBKV=F~!H6!)jN!^=7iF@iS zMDj{cYxBDDuUNLT6)@hj#`kZ$C==W4t$b*adZu?8-|j+QoNFX#QjyE9f*cMyKC-xH(M3CdZ&}G_3}Jy+^tmB^=|L3tlzc{ zL2J6Wu;HzYYMf9T-|l2Rwsou%%dk`3Q%#^5b*ULtT}FktRBAS@DrdTAHhvV{ynB5Q zbT;>N>XctjlykJS785(>wC<7IJgRFM*V92}yI?%_KGoB^pGFO`PFudBRn=UjvS$Wy zLS^~Zt5LfYT{VkE=k;{0npNtt`edW2ocC2*=FPJ)?P)JMRW`3x3eE3A7CI1v2rpto zOVI)S1>UGHY(sYtTCWR~)Ml#OV6Md!rugj1QKP2%%%%YLMk#P?Xp+U$p?b}(M}^>` ze&q%xAJ=EG|1wJH<~@^ht&Sw@h`eG7%A^Hh)P5@)g3F5Cw0nbAXJJdLFXXO-i9*Dv zkA2d#O3*`Txt206VTb+@?s^iB?G=r`FSL1;Gn!YZMqB9HE=Q3o(9qMXYcbg*S?Sq) z?)uWMAsQ#D!({i*%=@%2CEO(5L(3FAavj-A1!uiz+(cfNarq^<@gCQ8+-W&FSYu0_ z=Vr#Pb`DmsJe^a8h83%V{P^Bch$!C7dd9__t%)KDm)S+#)wJASADo)>%jY7~;+W|@ zCiL{s*!bD3U(J%rp)cQ%kO6Sebb%R@?f2=~DXH`qU>YMTf=W5Aqgu#|&wEl&Eb3TjVkQ+k*In*2=;@9~z6vJv~e?Z%^6)q}mDiDdyxqRR7^ z>*)=>8=LMAHfc|6wdILSC7Fv!X-2T1x-ahBva5dc+enLR5G9AV0 zeI<+9H0uVGEs1Bzn8uqQxAd$pi7zhgO+Cl?5!zKYL@~&^w(aT8?PzI8?IWH_2|+>D_TEu zJ0)l?o4fgoys2?&i%N^HUQMY5+a~nQWRT$v%usw^45i3clOD6tS1&Et=5E(_CL$xN zKWq}vewXs1T)`@slQoN4{k1()EC)?aOjWUOCnrLWC>wV! zfEx8oT{2`k+5B&cB`6uwFHtA31ANNtM1~+UMQw3*t1?k5Rn$yo9prY5GPUe%P8a2g z=~Ges9<%S*$VRuG8t>H{D$ko}aI(nFQpIkTn2pS^nwVxgTw2J#Z5}f{wRMOawfo;c zR2w#}tQSDmIm%UNXj$*GE+S}of6bBfX7(iW_6D^y&1UoXA}5mE(31Hr@Y>3lse@@R zRANp=^#c=(iv!Tdl&B=lhyy)&YPgeOdWbDk+gN311%L^OS%lMSuui>}nzhN`ozydf z7HudJeXtJQ#HWfII!#$bo5~rL8&=Vj?ksim)Q~c*P-?z7Z*ElJ%S*!zbCVX zx0iQrVPdHU*_`htHH}V{wb6w)v&k^vHX!>T-2_B8YKjg&;;YNhiEPy&2(Ina!C!qN z4&;p{j7h|L%_J*PX4JOHrvMsECEGp))$|a79;@0HIx$x>4;Y0RBnoXq$?-B;F~nq6 z?~f+NY}szsA|$~s)Gl;k=XA@dVVq-lHD;K?=e3X_);!)XODC9lQy|cx8zo~*|AEoI zks-u|L2;P&7%mOI+I4GVZnlJdAi9lx303pIgYn6RNLx1H3#KKquCgT)W7ZXy)CZaI zWlJ+!y$cufdyH?CXUp%bpEKV2pEKST;vI)meO2yb zZ}sySfc8^;<#fi1=u

Q~xCKE>)$%FY=`itU4*4&K?p-;^{87XZUz} z`0nO-pAPX<4}C+q`zKj;W-JW9Sf$VM9P6uZJwN?C9!eB`G2Sg;B@bE5pRIlG2ysFd zNMBq0q}6ha`F*v>%lwt!E!Wv&Dc*w(@xF9jTXw~Qm`hGi_Gm-A4PSU!cH&2h{9@Ig zYKS+wtRy4#rkxMhudpcr0 z6u+RF@9^)Po87?ovTw$}ivV$)#^h9`l6Yhbo}ZiT)pxex7t1{!oQP5OJ6x8bb5-Im GKK}nu-z7Bw diff --git a/utils/openocd_tools/gap_bins/gap_flasher-gap9_v2.elf b/utils/openocd_tools/gap_bins/gap_flasher-gap9_v2.elf deleted file mode 100755 index 29564a52439da3ad57254fd1d857229d2528653d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 731268 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¾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%0ATa&i<9y1k&&hWAI!kTehpHMHy}~)3>2R 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 m5xZF9Sw7r>t11K|6U^#1^U672o^I{0Pq{8;~a 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 K-D~1MfBe5&izxU2 diff --git a/utils/openocd_tools/src/fuser/gap9-efuse-gen b/utils/openocd_tools/src/fuser/gap9-efuse-gen deleted file mode 100755 index ef1a4462a..000000000 --- a/utils/openocd_tools/src/fuser/gap9-efuse-gen +++ /dev/null @@ -1,91 +0,0 @@ -#!/usr/bin/env python3 - -# -# Copyright (C) 2019 GreenWaves Technologies -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -import argparse -import runner.chips.gap9_v2_efuse as efuse - -parser = argparse.ArgumentParser(description='Generate gap9 efuse map') - -parser.add_argument("--usecase", dest="usecase", default=None, help="specify the usecase") -parser.add_argument("--output", dest="output", default=None, help="specify the output file path") -parser.add_argument("--name", dest="name", default=None, help="specify the structure name") - -args = parser.parse_args() - -efuse_map = efuse.Efuse_map() - -efuse_map.get_efuse('info_1').get_field('icache_enabled').set(1) - -# By default, only activate fast clock and fed other blocks like timer at 24Mhz/16 -fast_osc_freq_div = 24576062.0 / 16 -efuse_map.get_efuse('info_1').get_field('osc_ctrl_setup').set(1) -efuse_map.get_efuse('info_1').get_field('osc_ctrl').set(1) -efuse_map.get_efuse('info_1').get_field('fast_clk_div_pow2_setup').set(1) -efuse_map.get_efuse('fast_clk_div_pow2').set(4 | (1<<3)) -efuse_map.get_efuse('info_2').get_field('wake_osc_ctrl_setup').set(1) -efuse_map.get_efuse('info_2').get_field('wake_osc_ctrl').set(1) -efuse_map.get_efuse('info_2').get_field('wake_fast_clk_div_pow2_setup').set(1) -efuse_map.get_efuse('wake_fast_clk_div_pow2').set(4 | (1<<3)) - -# Lock FLL soc and periph -efuse_map.get_efuse('info_1').get_field('fll_global_setup').set(1) -efuse_map.get_efuse('info_1').get_field('fll_dco0_setup').set(1) -# FLL DRR (DCO min | DCO max) -efuse_map.get_efuse('fll_drr').set((0 << 0) | (0x1ff << 16)) -# Pre-lock FLL CCR1 (CLK0 DIV | CLK1 DIV) -efuse_map.get_efuse('fll_ccr1_pre_lock').set((0 << 0) | (0 << 8)) -# Post-lock FLL CCR1 (CLK0 DIV | CLK1 DIV) -efuse_map.get_efuse('fll_ccr1_post_lock').set((0 << 0) | (3 << 8)) -# FLL CCR2 (CLK0 SEL | CLK1 SEL | CLK2_SEL | CLK3_SEL | CKG0) -efuse_map.get_efuse('fll_ccr2').set((0x1 << 0) | (0x1 << 4) | (0x1 << 8) | (0x2 << 12) | (1 << 16)) -# DCO0 CR1 (DCO EN | CLOSE LOOP | LOOP GAIN | LOCK TOL | ITG | ASSERT CYCLES) -efuse_map.get_efuse('fll_f0cr1').set((1 << 0) | (1 << 1) | (4 << 4) | (10 << 8) | (24 << 16) | (6 << 26)) -# DCO0 CR2 (MFI | DCO CODE) -efuse_map.get_efuse('fll_f0cr2').set((166 << 0) | (0x1A << 16)) - -# FLL DRR (DCO min | DCO max) -efuse_map.get_efuse('wakeup_fll_drr').set((0 << 0) | (0x1ff << 16)) -# Pre-lock FLL CCR1 (CLK0 DIV | CLK1 DIV) -efuse_map.get_efuse('wakeup_fll_ccr1_pre_lock').set((0 << 0) | (0 << 8)) -# Post-lock FLL CCR1 (CLK0 DIV | CLK1 DIV) -efuse_map.get_efuse('wakeup_fll_ccr1_post_lock').set((0 << 0) | (1 << 8)) -# FLL CCR2 (CLK0 SEL | CLK1 SEL | CLK2_SEL | CLK3_SEL | CKG0) -efuse_map.get_efuse('wakeup_fll_ccr2').set((0x1 << 0) | (0x1 << 4) | (0x1 << 8) | (0x2 << 12) | (1 << 16)) -# DCO0 CR1 (DCO EN | CLOSE LOOP | LOOP GAIN | LOCK TOL | ITG | ASSERT CYCLES) -efuse_map.get_efuse('wakeup_fll_f0cr1').set((1 << 0) | (1 << 1) | (4 << 4) | (10 << 8) | (24 << 16) | (6 << 26)) -# DCO0 CR2 (MFI | DCO CODE) -efuse_map.get_efuse('wakeup_fll_f0cr2').set((166 << 0) | (0x1A << 16)) - - -if args.usecase == 'mram': - efuse_map.get_efuse('info_1').get_field('bootmode').set(3) - efuse_map.get_efuse('info_1').get_field('mram_reset_wait').set(1) - efuse_map.get_efuse('info_2').get_field('wake_mram_reset_wait').set(1) - efuse_map.get_efuse('mram_reset_wait_cycles').set(math.ceil(0.000003*fast_osc_freq_div)) - efuse_map.get_efuse('wake_mram_reset_wait_cycles').set(math.ceil(0.000003*fast_osc_freq_div)) - efuse_map.get_efuse('info_2').get_field('clkdiv_setup').set(1) - efuse_map.get_efuse('info_2').get_field('clkdiv').set(5) - efuse_map.get_efuse('info_3').get_field('flash_wait').set(1) - efuse_map.get_efuse('flash_wait').set(math.ceil(0.00002*fast_osc_freq_div)) - - - - -if args.output is not None: - with open(args.output, 'w') as output_file: - efuse_map.gen_c_struct(args.name, output_file) diff --git a/utils/openocd_tools/tcl/gap9reva.tcl b/utils/openocd_tools/tcl/gap9reva.tcl deleted file mode 100644 index 4a2da6f0a..000000000 --- a/utils/openocd_tools/tcl/gap9reva.tcl +++ /dev/null @@ -1,81 +0,0 @@ -adapter_khz 5000 -transport select jtag -# Channel 1 is taken by Xilinx JTAG -#reset_config srst_pulls_trst -reset_config trst_and_srst -#adapter_nsrst_assert_width 1000 -#adapter_nsrst_delay 1000 -#ftdi_tdo_sample_edge falling -set _CHIPNAME riscv -jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x00000001 -jtag newtap $_CHIPNAME unknown0 -irlen 4 -expected-id 0x10102001 -foreach t [jtag names] { - puts [format "TAP: %s\n" $t] -} -set _TARGETNAME $_CHIPNAME.cpu - -target create $_TARGETNAME riscv -chain-position $_TARGETNAME -coreid 0x3e0 -gdb_report_data_abort enable -gdb_report_register_access_error enable - -riscv set_reset_timeout_sec 120 -riscv set_command_timeout_sec 120 -# prefer to use sba for system bus access -riscv set_prefer_sba on -proc jtag_init {} { - puts "----------- jtag init" - # ensure chip reset done: this might not always be what we want - jtag_reset 0 0 - sleep 1 - jtag_reset 0 1 - sleep 10 - jtag_reset 0 0 - sleep 1 - # ensure jtag reset is done - pathmove RESET - pathmove IDLE - # "going to examine" - #riscv.cpu arp_examine - # "examination done" - puts "----------- jtag init done" -} -proc init_reset {mode} { - puts "----------- init reset" - # ensure chip reset done: this might not always be what we want - # ensure jtag reset is done - jtag_reset 0 0 - sleep 1 - jtag_reset 0 1 - sleep 10 - jtag_reset 0 0 - sleep 20 - pathmove RESET - pathmove IDLE - # "going to examine" - #riscv.cpu arp_examine - # "examination done" - #if { $mode == 0x1} { - # riscv.cpu arp_halt - #} -} -proc load_and_start_binary { elf_file pc_entry } { - puts "----------- load and start bin" - # first ensure we are rest and halt so that pc is accessible - riscv.cpu mww 0x1A100008 0x0fff1907 - riscv.cpu mww 0x1A100018 0x0fff1907 - riscv.cpu mww 0x1A100028 0x0fff1907 - riscv.cpu mww 0x1A100004 0xd0885f5e - riscv.cpu mww 0x1A100014 0xd0885f5e - riscv.cpu mww 0x1A100024 0xd0885f5e - #reset halt - load_image ${elf_file} 0x0 elf - reg pc ${pc_entry} - resume -} -# dump jtag chain -#scan_chain -#telnet_port 6666 -init -reset halt -riscv.cpu arm semihosting enable -echo "Ready for Remote Connections" diff --git a/utils/openocd_tools/tcl/gap9revb-bootmode.tcl b/utils/openocd_tools/tcl/gap9revb-bootmode.tcl deleted file mode 100644 index 4068cc609..000000000 --- a/utils/openocd_tools/tcl/gap9revb-bootmode.tcl +++ /dev/null @@ -1,134 +0,0 @@ -adapter_khz 500 - -adapter driver remote_bitbang -remote_bitbang_port 9999 -remote_bitbang_host localhost - -reset_config srst_only srst_nogate - -set _CHIPNAME gap9 - -jtag newtap $_CHIPNAME riscv -irlen 5 -expected-id 0x20020bcb -jtag newtap $_CHIPNAME pulp -irlen 4 -expected-id 0x20021bcb - -foreach t [jtag names] { - puts [format "TAP: %s\n" $t] -} - - -set _TAP_RISCV $_CHIPNAME.riscv -set _TAP_PULP $_CHIPNAME.pulp -set _CL0 $_CHIPNAME.cl0 -set _CL1 $_CHIPNAME.cl1 -set _CL2 $_CHIPNAME.cl2 -set _CL3 $_CHIPNAME.cl3 -set _CL4 $_CHIPNAME.cl4 -set _CL5 $_CHIPNAME.cl5 -set _CL6 $_CHIPNAME.cl6 -set _CL7 $_CHIPNAME.cl7 -set _CL8 $_CHIPNAME.cl8 -set _FC $_CHIPNAME.fc - -target create $_FC riscv -chain-position $_TAP_RISCV -coreid 0x9 -#target create $_CL0 riscv -chain-position $_TARGETNAME -coreid 0x0 -defer-examine -#target create $_CL1 riscv -chain-position $_TARGETNAME -coreid 0x1 -defer-examine -#target create $_CL2 riscv -chain-position $_TARGETNAME -coreid 0x2 -defer-examine -#target create $_CL3 riscv -chain-position $_TARGETNAME -coreid 0x3 -defer-examine -#target create $_CL4 riscv -chain-position $_TARGETNAME -coreid 0x4 -defer-examine -#target create $_CL5 riscv -chain-position $_TARGETNAME -coreid 0x5 -defer-examine -target create $_CL6 riscv -chain-position $_TAP_RISCV -coreid 0x6 -defer-examine -target create $_CL7 riscv -chain-position $_TAP_RISCV -coreid 0x7 -defer-examine -#target create $_CL8 riscv -chain-position $_TARGETNAME -coreid 0x8 -defer-examine -target smp $_CL6 $_CL7 -#target create $_CL8 riscv -chain-position $_TARGETNAME -coreid 0x8 -gdb-port 6666 -defer-examine -#target create $_CL8 riscv -chain-position $_TARGETNAME -coreid 0x8 -gdb-port 6666 - - -$_CL6 configure -rtos hwthread -$_CL7 configure -rtos hwthread - -proc cl6_attach_proc { } { - $::_CL6 arp_examine - $::_CL7 arp_examine - # since smp, this will halt all concerned code - $::_CL6 arp_halt - #$::_CL7 arp_halt - $::_CL6 arm semihosting enable - $::_CL7 arm semihosting enable -} -$_CL6 configure -event gdb-attach cl6_attach_proc - -gdb_report_data_abort enable -gdb_report_register_access_error enable - -riscv set_reset_timeout_sec 1440 -riscv set_command_timeout_sec 1440 - -# prefer to use sba for system bus access -riscv set_prefer_sba on - - -proc poll_confreg { value } { - irscan $::_TAP_PULP 0x6 - # size then value - set ret [eval drscan $::_TAP_PULP 0x8 $value] - puts "ret=$ret" - while { !$ret } { - irscan $::_TAP_PULP 0x6 - # size then value - set ret [eval drscan $::_TAP_PULP 0x8 $value] - puts "ret=$ret" - } -} - -proc jtag_init {} { - puts "jtag init" - targets $::_FC - jtag_reset 0 1 - sleep 1 - jtag_reset 0 0 - sleep 1 - # wait for jtag ready - poll_confreg 0x1 - echo "confreg polling done" - jtag arp_init-reset -} - -proc init_reset {mode} { - puts "hello" - targets $::_FC - jtag_reset 0 1 - sleep 1 - jtag_reset 0 0 - sleep 1 - # wait for jtag ready - poll_confreg 0x1 - echo "confreg polling done" - jtag arp_init-reset -} - -proc load_and_start_binary { elf_file pc_entry } { - targets $::_FC - # first ensure we are rest and halt so that pc is accessible - #$::_FC arp_reset assert 1 - reset halt - load_image ${elf_file} 0x0 elf - reg pc ${pc_entry} - resume -} - - -# dump jtag chain -#scan_chain - -targets $_FC -init - - -#targets -#ftdi_set_signal nSRST 1 -halt - -$::_FC arm semihosting enable - -echo "Ready for Remote Connections" diff --git a/utils/openocd_tools/tcl/gap9revb.tcl b/utils/openocd_tools/tcl/gap9revb.tcl deleted file mode 100644 index c3246be19..000000000 --- a/utils/openocd_tools/tcl/gap9revb.tcl +++ /dev/null @@ -1,167 +0,0 @@ -adapter_khz 5000 - -#interface jlink -#transport select jtag -# Channel 1 is taken by Xilinx JTAG -#reset_config srst_pulls_trst - -#adapter driver remote_bitbang -#remote_bitbang_port 9999 -#remote_bitbang_host localhost - -reset_config srst_only srst_nogate - -set _CHIPNAME gap9 - -jtag newtap $_CHIPNAME riscv -irlen 5 -expected-id 0x20020bcb -jtag newtap $_CHIPNAME pulp -irlen 4 -expected-id 0x20021bcb - -foreach t [jtag names] { - puts [format "TAP: %s\n" $t] -} - - -set _TAP_RISCV $_CHIPNAME.riscv -set _TAP_PULP $_CHIPNAME.pulp -set _CL0 $_CHIPNAME.cl0 -set _CL1 $_CHIPNAME.cl1 -set _CL2 $_CHIPNAME.cl2 -set _CL3 $_CHIPNAME.cl3 -set _CL4 $_CHIPNAME.cl4 -set _CL5 $_CHIPNAME.cl5 -set _CL6 $_CHIPNAME.cl6 -set _CL7 $_CHIPNAME.cl7 -set _CL8 $_CHIPNAME.cl8 -set _FC $_CHIPNAME.fc - -target create $_FC riscv -chain-position $_TAP_RISCV -coreid 0x9 -#target create $_CL0 riscv -chain-position $_TAP_RISCV -coreid 0x0 -defer-examine -#target create $_CL1 riscv -chain-position $_TAP_RISCV -coreid 0x1 -defer-examine -#target create $_CL2 riscv -chain-position $_TAP_RISCV -coreid 0x2 -defer-examine -#target create $_CL3 riscv -chain-position $_TAP_RISCV -coreid 0x3 -defer-examine -#target create $_CL4 riscv -chain-position $_TAP_RISCV -coreid 0x4 -defer-examine -#target create $_CL5 riscv -chain-position $_TAP_RISCV -coreid 0x5 -defer-examine -#target create $_CL6 riscv -chain-position $_TAP_RISCV -coreid 0x6 -defer-examine -#target create $_CL7 riscv -chain-position $_TAP_RISCV -coreid 0x7 -defer-examine -#target create $_CL8 riscv -chain-position $_TAP_RISCV -coreid 0x8 -defer-examine -#target smp $_FC $_CL0 $_CL1 $_CL2 $_CL3 $_CL4 $_CL5 $_CL6 $_CL7 $_CL8 -#target create $_CL8 riscv -chain-position $_TARGETNAME -coreid 0x8 -gdb-port 6666 -defer-examine -#target create $_CL8 riscv -chain-position $_TARGETNAME -coreid 0x8 -gdb-port 6666 - - -#$_CL0 configure -rtos hwthread -#$_CL1 configure -rtos hwthread -#$_CL2 configure -rtos hwthread -#$_CL3 configure -rtos hwthread -#$_CL4 configure -rtos hwthread -#$_CL5 configure -rtos hwthread -#$_CL6 configure -rtos hwthread -#$_CL7 configure -rtos hwthread -#$_CL8 configure -rtos hwthread -#$_FC configure -rtos hwthread - -#proc cl6_attach_proc { } { -# $::_CL6 arp_examine -# $::_CL7 arp_examine - # since smp, this will halt all concerned code -# $::_CL6 arp_halt - #$::_CL7 arp_halt -# $::_CL6 arm semihosting enable -# $::_CL7 arm semihosting enable -#} -#$_CL6 configure -event gdb-attach cl6_attach_proc - -gdb_report_data_abort enable -gdb_report_register_access_error enable - -riscv set_reset_timeout_sec 1440 -riscv set_command_timeout_sec 1440 - -# prefer to use sba for system bus access -riscv set_prefer_sba on - - -proc poll_confreg { value } { - irscan $::_TAP_PULP 0x6 - # size then value - set ret [eval drscan $::_TAP_PULP 0x8 $value] - puts "ret=$ret" - while { $ret != 0x3 } { - irscan $::_TAP_PULP 0x6 - # size then value - set ret [eval drscan $::_TAP_PULP 0x8 $value] - puts "ret=$ret" - } -} - -proc jtag_init {} { - puts "jtag init" - targets $::_FC - jtag_reset 0 1 - sleep 1 - jtag_reset 0 0 - sleep 1 - # wait for jtag ready - poll_confreg 0x1 - echo "confreg polling done" - #$::_CL0 arp_examine - #$::_CL1 arp_examine - #$::_CL2 arp_examine - #$::_CL3 arp_examine - #$::_CL4 arp_examine - #$::_CL5 arp_examine - #$::_CL6 arp_examine - #$::_CL7 arp_examine - #$::_CL8 arp_examine - $::_FC arp_examine - #$::_CL0 arp_halt - #$::_CL1 arp_halt - #$::_CL2 arp_halt - #$::_CL3 arp_halt - #$::_CL4 arp_halt - #$::_CL5 arp_halt - #$::_CL6 arp_halt - #$::_CL7 arp_halt - #$::_CL8 arp_halt - #$::_FC arp_halt - echo "examine done" - jtag arp_init -} - -proc init_reset {mode} { - puts "hello" - #targets $::_FC - jtag_reset 0 1 - sleep 1 - jtag_reset 0 0 - sleep 1 - # wait for jtag ready - poll_confreg 0x1 - echo "confreg polling done" - jtag arp_init -} - -proc load_and_start_binary { elf_file pc_entry } { - targets $::_FC - # first ensure we are rest and halt so that pc is accessible - #$::_FC arp_reset assert 1 - reset halt - load_image ${elf_file} 0x0 elf - reg pc ${pc_entry} - resume -} - - -# dump jtag chain -#scan_chain - -init - - -#targets -#ftdi_set_signal nSRST 1 -halt - -$::_FC arm semihosting enable - -echo "Ready for Remote Connections" diff --git a/utils/openocd_tools/tcl/gap9revb_gdb.tcl b/utils/openocd_tools/tcl/gap9revb_gdb.tcl deleted file mode 100644 index c21b8fc38..000000000 --- a/utils/openocd_tools/tcl/gap9revb_gdb.tcl +++ /dev/null @@ -1,245 +0,0 @@ -adapter_khz 500 - -#interface jlink -#transport select jtag -# Channel 1 is taken by Xilinx JTAG -#reset_config srst_pulls_trst - -#adapter driver remote_bitbang -#remote_bitbang_port 9999 -#remote_bitbang_host localhost - -reset_config srst_only srst_nogate - -set _CHIPNAME gap9 - -jtag newtap $_CHIPNAME riscv -irlen 5 -expected-id 0x20020bcb -jtag newtap $_CHIPNAME pulp -irlen 4 -expected-id 0x20021bcb - -foreach t [jtag names] { - puts [format "TAP: %s\n" $t] -} - - -set _TAP_RISCV $_CHIPNAME.riscv -set _TAP_PULP $_CHIPNAME.pulp -set _CL0 $_CHIPNAME.cl0 -set _CL1 $_CHIPNAME.cl1 -set _CL2 $_CHIPNAME.cl2 -set _CL3 $_CHIPNAME.cl3 -set _CL4 $_CHIPNAME.cl4 -set _CL5 $_CHIPNAME.cl5 -set _CL6 $_CHIPNAME.cl6 -set _CL7 $_CHIPNAME.cl7 -set _CL8 $_CHIPNAME.cl8 -set _FC $_CHIPNAME.fc - -target create $_FC riscv -chain-position $_TAP_RISCV -coreid 0x9 -target create $_CL0 riscv -chain-position $_TAP_RISCV -coreid 0x0 -defer-examine -target create $_CL1 riscv -chain-position $_TAP_RISCV -coreid 0x1 -defer-examine -target create $_CL2 riscv -chain-position $_TAP_RISCV -coreid 0x2 -defer-examine -target create $_CL3 riscv -chain-position $_TAP_RISCV -coreid 0x3 -defer-examine -target create $_CL4 riscv -chain-position $_TAP_RISCV -coreid 0x4 -defer-examine -target create $_CL5 riscv -chain-position $_TAP_RISCV -coreid 0x5 -defer-examine -target create $_CL6 riscv -chain-position $_TAP_RISCV -coreid 0x6 -defer-examine -target create $_CL7 riscv -chain-position $_TAP_RISCV -coreid 0x7 -defer-examine -target create $_CL8 riscv -chain-position $_TAP_RISCV -coreid 0x8 -defer-examine -#target create $_CL8 riscv -chain-position $_TARGETNAME -coreid 0x8 -gdb-port 6666 -defer-examine -#target create $_CL8 riscv -chain-position $_TARGETNAME -coreid 0x8 -gdb-port 6666 -target smp $_FC $_CL0 $_CL1 $_CL2 $_CL3 $_CL4 $_CL5 $_CL6 $_CL7 $_CL8 -#target smp $_FC $_CL8 - -$_CL0 configure -rtos hwthread -$_CL1 configure -rtos hwthread -$_CL2 configure -rtos hwthread -$_CL3 configure -rtos hwthread -$_CL4 configure -rtos hwthread -$_CL5 configure -rtos hwthread -$_CL6 configure -rtos hwthread -$_CL7 configure -rtos hwthread -$_CL8 configure -rtos hwthread -$_FC configure -rtos hwthread - -#proc cl6_attach_proc { } { -# $::_CL6 arp_examine -# $::_CL7 arp_examine - # since smp, this will halt all concerned code -# $::_CL6 arp_halt - #$::_CL7 arp_halt -# $::_CL6 arm semihosting enable -# $::_CL7 arm semihosting enable -#} -#$_CL6 configure -event gdb-attach cl6_attach_proc - -gdb_report_data_abort enable -gdb_report_register_access_error enable - -riscv set_reset_timeout_sec 36000 -riscv set_command_timeout_sec 36000 - -# prefer to use sba for system bus access -riscv set_prefer_sba on - - -proc poll_confreg { value } { - irscan $::_TAP_PULP 0x6 - # size then value - set ret [eval drscan $::_TAP_PULP 0x8 $value] - puts "ret=$ret" - while { $ret != 0x3 } { - irscan $::_TAP_PULP 0x6 - # size then value - set ret [eval drscan $::_TAP_PULP 0x8 $value] - puts "ret=$ret" - } -} - -proc cluster_reset { addr } { - # first reset the cluster - - poll off - $::_FC mww 0x10200008 0x0 - $::_FC mww 0x1a1040e4 0x200 - # SOC CTRL + 0x170 - $::_FC mww 0x1a104170 0x0 - sleep 1 - $::_FC mww 0x1a104170 0x1 - - # CLUSTER Ctrl: 0x10000000 + 0x00200000 - # addr: +0x40 - $::_FC mww 0x10200040 $addr 9 - # fetch en: +0x8 - $::_FC mww 0x10200008 0x3ff - # available: + 0xe4 - $::_FC mww 0x1a1040e4 0xffffffff - $::_CL0 arp_halt - $::_CL1 arp_halt - $::_CL2 arp_halt - $::_CL3 arp_halt - $::_CL4 arp_halt - $::_CL5 arp_halt - $::_CL6 arp_halt - $::_CL7 arp_halt - $::_CL8 arp_halt - $::_CL0 riscv set_ebreakm on - $::_CL1 riscv set_ebreakm on - $::_CL2 riscv set_ebreakm on - $::_CL3 riscv set_ebreakm on - $::_CL4 riscv set_ebreakm on - $::_CL5 riscv set_ebreakm on - $::_CL6 riscv set_ebreakm on - $::_CL7 riscv set_ebreakm on - $::_CL8 riscv set_ebreakm on - poll on -} - -proc jtag_init {} { - puts "jtag init" - targets $::_FC - jtag_reset 0 1 - sleep 1 - jtag_reset 0 0 - sleep 1 - # wait for jtag ready - poll_confreg 0xb - echo "confreg polling done" - - #$::_FC arm semihosting_fileio enable - #$::_FC arm semihosting_resexit enable - # APB SOC CTRL: 0x1A100000 + 0x00004000 - # cl isolate: + 0xC - #$::_FC mww 0x1a10400c 0 - # CLUSTER Ctrl: 0x10000000 + 0x00200000 - # addr +0x40 - #mww 0x10200040 0x1a00010c 9 - # fetch en: +0x8 - #$::_FC mww 0x10200008 0x3ff - # available: + 0xe4 - #$::_FC mww 0x1a1040e4 0xffffffff - $::_CL0 arp_examine - $::_CL1 arp_examine - $::_CL2 arp_examine - $::_CL3 arp_examine - $::_CL4 arp_examine - $::_CL5 arp_examine - $::_CL6 arp_examine - $::_CL7 arp_examine - $::_CL8 arp_examine - - # halt all - #$::_CL0 arp_halt - #$::_CL1 arp_halt - #$::_CL2 arp_halt - #$::_CL3 arp_halt - #$::_CL4 arp_halt - #$::_CL5 arp_halt - #$::_CL6 arp_halt - #$::_CL7 arp_halt - #$::_CL8 arp_halt - #set ebreakm - #$::_FC riscv set_ebreakm on - #$::_CL0 riscv set_ebreakm on - #$::_CL1 riscv set_ebreakm on - #$::_CL2 riscv set_ebreakm on - #$::_CL3 riscv set_ebreakm on - #$::_CL4 riscv set_ebreakm on - #$::_CL5 riscv set_ebreakm on - #$::_CL6 riscv set_ebreakm on - #$::_CL7 riscv set_ebreakm on - #$::_CL8 riscv set_ebreakm on - - $::_FC arp_examine - $::_FC arp_halt - $::_FC arm semihosting enable - #$::_CL0 arp_halt - #$::_CL1 arp_halt - #$::_CL2 arp_halt - #$::_CL3 arp_halt - #$::_CL4 arp_halt - #$::_CL5 arp_halt - #$::_CL6 arp_halt - #$::_CL7 arp_halt - #$::_CL8 arp_halt - echo "examine done" - jtag arp_init -} - -proc init_reset {mode} { - puts "hello" - #targets $::_FC - jtag_reset 0 1 - sleep 1 - jtag_reset 0 0 - sleep 1 - # wait for jtag ready - poll_confreg 0xb - echo "confreg polling done" - jtag arp_init -} - -proc load_and_start_binary { elf_file pc_entry } { - targets $::_FC - # first ensure we are rest and halt so that pc is accessible - #$::_FC arp_reset assert 1 - #reset halt - halt - load_image ${elf_file} 0x0 elf - reg pc ${pc_entry} - resume -} - - -# dump jtag chain -#scan_chain - -init - - -#targets $::_FC -#ftdi_set_signal nSRST 1 -halt - -#target smp $_FC $_CL8 -#$::_FC arm semihosting enable - -echo "Ready for Remote Connections"