diff --git a/.gitignore b/.gitignore index 4b519ef..f93b37a 100644 --- a/.gitignore +++ b/.gitignore @@ -38,3 +38,6 @@ __pycache__ # For Clangd compile_commands.json .cache + +# ACVP server +ACVP-Server/ diff --git a/Makefile b/Makefile index 964bd0a..180e3f9 100644 --- a/Makefile +++ b/Makefile @@ -39,7 +39,12 @@ $(GTEST_PARALLEL): $(SUBTLE_INC_DIR) .PHONY: clean clean: ## Remove build directory rm -rf $(BUILD_DIR) + rm -rf kats/scripts/ACVP-Server .PHONY: format format: $(ASCON_SOURCES) $(TEST_SOURCES) $(TEST_HEADERS) $(BENCHMARK_SOURCES) $(BENCHMARK_HEADERS) $(EXAMPLE_SOURCES) $(EXAMPLE_HEADERS) ## Format source code clang-format -i $^ + +.PHONY: sync_acvp_kats +sync_acvp_kats: ## Downloads NIST ACVP KAT vectors and updates local KATs + cd kats/scripts && ./sync_acvp_kats.sh && cd - diff --git a/README.md b/README.md index 1fa1e14..979349c 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # ascon -Ascon-Based Lightweight Cryptography Standards for Constrained Devices: Authenticated Encryption, Hash, and Extendable Output Functions. +Ascon Permutation-based Lightweight Cryptography Standards for Constrained Devices: Authenticated Encryption, Hash, and Extendable Output Functions. ## Overview -This header-only C++ library implements the whole Ascon LwC cipher-suite, specifically Ascon-AEAD128, Ascon-Hash256, Ascon-XOF128, and Ascon-CXOF128. These algorithms, suitable for constrained environments, are part of the Ascon family designed for resource-limited devices, prioritizing security, performance, and efficiency. The library offers `constexpr` functions where possible for enhanced performance and simplifies integration. The implementation conforms to the Ascon draft standard defined in [NIST SP 800-232](https://doi.org/10.6028/NIST.SP.800-232.ipd). +This header-only C++ library implements the whole Ascon LwC cipher-suite i.e. Ascon-AEAD128, Ascon-Hash256, Ascon-XOF128, and Ascon-CXOF128. These algorithms, suitable for constrained environments, are part of the Ascon family designed for resource-limited devices, prioritizing security, performance, and efficiency. The library offers `constexpr` functions where possible for enhanced performance and simplifies integration. The implementation conforms to the Ascon draft standard defined in [NIST SP 800-232](https://doi.org/10.6028/NIST.SP.800-232.ipd). The library includes the following core Ascon cryptographic primitives: @@ -11,6 +11,9 @@ The library includes the following core Ascon cryptographic primitives: * **Ascon-XOF128:** An extendable output function (XOF) that produces variable-length outputs, useful in various cryptographic contexts where flexibility in output length is required. * **Ascon-CXOF128:** A customizable XOF variant, offering additional flexibility by allowing for application-specific parameterization through a customization string. +> [!NOTE] +> All these schemes offer incremental API - meaning data absorption and squeezing can be performed by making multiple consecutive calls to the corresponding function, as long as that phase it not finalized. It is beneficial when working with large input/ output, which doesn't fit in-memory. + This implementation leverages a sponge construction built upon the Ascon permutation. It employs `std::span` for safe memory handling and provides `constexpr` functions where feasible for optimized compile-time computations for statically known inputs. **Key Features:** @@ -18,7 +21,7 @@ This implementation leverages a sponge construction built upon the Ascon permuta * **`constexpr` Support:** Compile-time evaluation for optimized performance where applicable. * **`std::span` Usage:** Type-safe memory management. * **Thorough Testing:** Includes property based tests and known-answer tests (KATs). -* **Benchmarking Support:** Prepared for benchmarking with Google Benchmark. +* **Benchmarking Support:** Prepared for benchmarking with google-benchmark. **Important Considerations:** * **Unaudited:** This implementation has not yet undergone formal security audits. Production use requires careful consideration of the risks. @@ -29,15 +32,19 @@ This implementation leverages a sponge construction built upon the Ascon permuta * A C++20-compliant compiler (e.g., g++, clang++). * Build tools: `make` and `cmake`. -* For testing: Google Test ([Installation Instructions](https://github.com/google/googletest/tree/main/googletest#standalone-cmake-project)). -* For benchmarking: Google Benchmark ([Installation Instructions](https://github.com/google/benchmark/#installation)). -* (Optional) For CPU cycle benchmarking: libPFM ([Installation Instructions](https://gist.github.com/itzmeanjan/05dc3e946f635d00c5e0b21aae6203a7)). Requires building Google Benchmark with libPFM support. +* For testing: google-test ([Installation Instructions](https://github.com/google/googletest/tree/main/googletest#standalone-cmake-project)). +* For benchmarking: google-benchmark ([Installation Instructions](https://github.com/google/benchmark/#installation)). +* (Optional) For CPU cycle benchmarking: libPFM ([Installation Instructions](https://gist.github.com/itzmeanjan/05dc3e946f635d00c5e0b21aae6203a7)). Requires building google-benchmark with libPFM support. ## Testing -This project includes a comprehensive test suite verifying the functional correctness of Ascon-AEAD128, Ascon-Hash256, Ascon-XOF128, and Ascon-CXOF128. Known Answer Tests (KATs) ensure conformance to the specification. +This library includes a comprehensive test suite verifying the functional correctness of Ascon-AEAD128, Ascon-Hash256, Ascon-XOF128, and Ascon-CXOF128. Known Answer Tests (KATs) ensure conformance to the specification. -Run tests using these commands (from the repository root): +We incorporate KAT vectors from two sources. +- (a) Repo hosting, official implementation from Ascon team @ https://github.com/ascon/ascon-c. +- (b) NIST ACVP server @ https://github.com/usnistgov/ACVP-Server. You can sync latest ACVP KATs by running `$ make sync_acvp_kats`. + +Run all tests using these commands (from the repository root): ```bash make test -j # Run release build tests @@ -47,47 +54,81 @@ make debug_ubsan_test -j # Run debug tests with UndefinedBehaviorSanitizer make release_ubsan_test -j # Run release tests with UndefinedBehaviorSanitizer ``` -Test results (pass/fail) are printed to the console. - ```bash -PASSED TESTS (37/37): - 1 ms: build/test/test.out AsconAEAD128.ValidEncryptionSequence - 1 ms: build/test/test.out AsconAEAD128.FinalizeDataCalledTwice - 1 ms: build/test/test.out AsconAEAD128.DecryptCiphertextAfterFinalizeDecrypt - 1 ms: build/test/test.out AsconXof128.CompileTimeComputeXofOutput - 1 ms: build/test/test.out AsconAEAD128.AbsorbDataAfterFinalizeData - 1 ms: build/test/test.out AsconAEAD128.DecryptCiphertextBeforeFinalizeData - 1 ms: build/test/test.out AsconAEAD128.FinalizeDecryptBeforeFinalizeData - 1 ms: build/test/test.out AsconAEAD128.EncryptPlaintextAfterFinalizeEncrypt - 1 ms: build/test/test.out AsconAEAD128.FinalizeDecryptCalledTwice - 1 ms: build/test/test.out AsconAEAD128.AbsorbDataAfterEncrypt - 1 ms: build/test/test.out AsconAEAD128.AbsorbDataAfterDecrypt - 1 ms: build/test/test.out AsconHash256.CompileTimeComputeMessageDigest - 2 ms: build/test/test.out AsconAEAD128.MultipleDecryptCiphertextCalls - 2 ms: build/test/test.out AsconAEAD128.MultipleAbsorbDataCalls +PASSED TESTS (73/73): 2 ms: build/test/test.out AsconAEAD128.MultipleEncryptPlaintextCalls - 2 ms: build/test/test.out AsconAEAD128.FinalizeDataWithoutAbsorb + 2 ms: build/test/test.out AsconAEAD128.ValidEncryptionSequence + 2 ms: build/test/test.out AsconHash256.AbsorbMessageAfterDigestIsProduced + 2 ms: build/test/test.out AsconCXOF128.MultipleFinalizeCalls + 2 ms: build/test/test.out AsconAEAD128.EncryptPlaintextAfterFinalizeEncrypt + 2 ms: build/test/test.out AsconHash256.MultipleProduceDigestCalls + 2 ms: build/test/test.out AsconAEAD128.MultipleDecryptCiphertextCalls 2 ms: build/test/test.out AsconAEAD128.EncryptPlaintextBeforeFinalizeData - 2 ms: build/test/test.out AsconCXOF128.CompileTimeComputeXofOutput - 2 ms: build/test/test.out AsconAEAD128.CompileTimeEncryptAndThenDecrypt + 2 ms: build/test/test.out AsconAEAD128.FinalizeDataWithoutAbsorb + 2 ms: build/test/test.out AsconHash256.MultipleFinalizeCalls + 2 ms: build/test/test.out AsconXof128.AbsorbMessageAfterFinalize + 2 ms: build/test/test.out AsconCXOF128.CustomizeAfterFinalization + 2 ms: build/test/test.out AsconHash256.CompileTimeComputeMessageDigest + 2 ms: build/test/test.out AsconHash256.MultipleAbsorbCalls + 2 ms: build/test/test.out AsconXof128.SqueezeWithoutFinalize 2 ms: build/test/test.out AsconAEAD128.FinalizeEncryptBeforeFinalizeData - 2 ms: build/test/test.out AsconAEAD128.FinalizeEncryptCalledTwice + 2 ms: build/test/test.out AsconXof128.MultipleSqueezeCalls + 2 ms: build/test/test.out AsconXof128.ValidXofSequence + 2 ms: build/test/test.out AsconCXOF128.MultipleCustomizeCalls + 2 ms: build/test/test.out AsconCXOF128.FinalizeWithoutAbsorb + 2 ms: build/test/test.out AsconCXOF128.SqueezeWithoutFinalize + 2 ms: build/test/test.out AsconXof128.FinalizeDuringSqueezing + 2 ms: build/test/test.out AsconXof128.FinalizeWithoutAbsorb + 3 ms: build/test/test.out AsconHash256.ACVPKnownAnswerTests + 3 ms: build/test/test.out AsconAEAD128.MultipleAbsorbDataCalls + 3 ms: build/test/test.out AsconAEAD128.AbsorbDataAfterDecrypt + 3 ms: build/test/test.out AsconCXOF128.MultipleAbsorbCalls + 3 ms: build/test/test.out AsconAEAD128.DecryptCiphertextAfterFinalizeDecrypt + 3 ms: build/test/test.out AsconAEAD128.AbsorbDataAfterEncrypt + 3 ms: build/test/test.out AsconCXOF128.CompileTimeComputeCXOFOutput + 3 ms: build/test/test.out AsconCXOF128.CustomizeDuringSqueezing + 3 ms: build/test/test.out AsconCXOF128.AbsorbMessageAfterFinalization + 3 ms: build/test/test.out AsconCXOF128.FinalizeDuringSqueezing + 3 ms: build/test/test.out AsconCXOF128.AbsorbWithoutCustomize 3 ms: build/test/test.out AsconAEAD128.ValidDecryptionSequence - 4 ms: build/test/test.out AsconAEAD128.KnownAnswerTests - 4 ms: build/test/test.out AsconCXOF128.KnownAnswerTests - 7 ms: build/test/test.out AsconHash256.ForSameMessageOneshotHashingAndIncrementalHashingProducesSameDigest - 9 ms: build/test/test.out AsconHash256.KnownAnswerTests - 10 ms: build/test/test.out AsconXof128.KnownAnswerTests - 557 ms: build/test/test.out AsconAEAD128.DecryptionFailureDueToBitFlippingInCipherText - 557 ms: build/test/test.out AsconAEAD128.DecryptionFailureDueToBitFlippingInNonce - 558 ms: build/test/test.out AsconAEAD128.DecryptionFailureDueToBitFlippingInTag - 558 ms: build/test/test.out AsconAEAD128.DecryptionFailureDueToBitFlippingInKey - 559 ms: build/test/test.out AsconAEAD128.DecryptionFailureDueToBitFlippingInAssociatedData - 565 ms: build/test/test.out AsconAEAD128.ForSameCiphertextOneshotDecryptionAndIncrementalDecryptionProducesSamePlaintext - 566 ms: build/test/test.out AsconAEAD128.EncryptThenDecrypt - 566 ms: build/test/test.out AsconAEAD128.ForSamePlaintextOneshotEncryptionAndIncrementalEncryptionProducesSameTag - 737 ms: build/test/test.out AsconXof128.ForSameMessageOneshotHashingAndIncrementalHashingProducesSameOutput - 3203 ms: build/test/test.out AsconCXOF128.ForSameMessageOneshotHashingAndIncrementalHashingProducesSameOutput + 3 ms: build/test/test.out AsconAEAD128.FinalizeDataCalledTwice + 3 ms: build/test/test.out AsconCXOF128.CustomizeDuringAbsorption + 3 ms: build/test/test.out AsconCXOF128.AbsorbMessageDuringSqueezing + 3 ms: build/test/test.out AsconXof128.CompileTimeComputeXofOutput + 3 ms: build/test/test.out AsconHash256.DigestWithoutFinalize + 3 ms: build/test/test.out AsconHash256.AbsorbMessageAfterFinalize + 3 ms: build/test/test.out AsconXof128.MultipleAbsorbCalls + 4 ms: build/test/test.out AsconAEAD128.FinalizeEncryptCalledTwice + 4 ms: build/test/test.out AsconAEAD128.AbsorbDataAfterFinalizeData + 4 ms: build/test/test.out AsconAEAD128.FinalizeDecryptBeforeFinalizeData + 4 ms: build/test/test.out AsconAEAD128.ACVPKnownAnswerTests + 4 ms: build/test/test.out AsconAEAD128.CompileTimeEncryptAndThenDecrypt + 4 ms: build/test/test.out AsconHash256.FinalizeAfterDigestIsProduced + 4 ms: build/test/test.out AsconXof128.AbsorbMessageDuringSqueezing + 4 ms: build/test/test.out AsconCXOF128.ACVPKnownAnswerTests + 5 ms: build/test/test.out AsconAEAD128.FinalizeDecryptCalledTwice + 5 ms: build/test/test.out AsconCXOF128.MultipleSqueezeCalls + 5 ms: build/test/test.out AsconXof128.MultipleFinalizeCalls + 5 ms: build/test/test.out AsconCXOF128.ValidCXOFSequence + 5 ms: build/test/test.out AsconHash256.FinalizeWithoutAbsorption + 6 ms: build/test/test.out AsconCXOF128.KnownAnswerTests + 6 ms: build/test/test.out AsconXof128.ACVPKnownAnswerTests + 6 ms: build/test/test.out AsconAEAD128.KnownAnswerTests + 6 ms: build/test/test.out AsconAEAD128.DecryptCiphertextBeforeFinalizeData + 8 ms: build/test/test.out AsconHash256.ValidHashingSequence + 11 ms: build/test/test.out AsconHash256.KnownAnswerTests + 11 ms: build/test/test.out AsconHash256.ForSameMessageOneshotHashingAndIncrementalHashingProducesSameDigest + 13 ms: build/test/test.out AsconXof128.KnownAnswerTests + 529 ms: build/test/test.out AsconAEAD128.DecryptionFailureDueToBitFlippingInCipherText + 535 ms: build/test/test.out AsconAEAD128.DecryptionFailureDueToBitFlippingInKey + 537 ms: build/test/test.out AsconAEAD128.DecryptionFailureDueToBitFlippingInTag + 540 ms: build/test/test.out AsconAEAD128.ForSamePlaintextOneshotEncryptionAndIncrementalEncryptionProducesSameTag + 541 ms: build/test/test.out AsconAEAD128.DecryptionFailureDueToBitFlippingInNonce + 545 ms: build/test/test.out AsconAEAD128.DecryptionFailureDueToBitFlippingInAssociatedData + 550 ms: build/test/test.out AsconAEAD128.EncryptThenDecrypt + 556 ms: build/test/test.out AsconAEAD128.ForSameCiphertextOneshotDecryptionAndIncrementalDecryptionProducesSamePlaintext + 977 ms: build/test/test.out AsconXof128.ForSameMessageOneshotHashingAndIncrementalHashingProducesSameOutput + 6222 ms: build/test/test.out AsconCXOF128.ForSameMessageOneshotHashingAndIncrementalHashingProducesSameOutput ``` > [!NOTE] @@ -95,12 +136,7 @@ PASSED TESTS (37/37): ## Benchmarking -This section details how to benchmark the performance of the implemented Ascon algorithms. The benchmarks measure throughput (bytes per second) and, optionally, cycles per byte if libPFM is used. - -The Makefile provides two benchmarking targets: - -* **`make benchmark`:** Runs benchmarks without libPFM-based CPU cycle counting. This is the faster option and suitable for initial performance assessments. -* **`make perf`:** Runs benchmarks *with* libPFM support, providing detailed CPU cycle counts alongside throughput. This requires building Google Benchmark with libPFM support; see the Prerequisites section for more details. +This section details how to benchmark the performance of the implemented Ascon schemes for a range of input/ output sizes. The benchmarks measure throughput (bytes/second) and, optionally, cycles/byte if libPFM is used. To run the benchmarks, execute the following commands from the repository root: @@ -114,15 +150,49 @@ make perf -j # Run benchmarks with CPU cycle counting (requires libPFM) ### On 12th Gen Intel(R) Core(TM) i7-1260P -JSON benchmark result lives in [bench_result_on_Linux_6.14.0-15-generic_x86_64_with_g++_14](./bench_result_on_Linux_6.14.0-15-generic_x86_64_with_g++_14.json). -### On ARM Cortex-A72 ( i.e. Raspberry Pi 4B ) +```bash +$ ./build/perf/perf.out --benchmark_min_warmup_time=.05 --benchmark_min_time=0.1s --benchmark_perf_counters=CYCLES --benchmark_counters_tabular=true + +2025-06-24T12:26:17+04:00 +Running ./build/perf/perf.out +Run on (16 X 4476.96 MHz CPU s) +CPU Caches: + L1 Data 48 KiB (x8) + L1 Instruction 32 KiB (x8) + L2 Unified 1280 KiB (x8) + L3 Unified 18432 KiB (x1) +Load Average: 0.66, 0.72, 0.75 +------------------------------------------------------------------------------------------------------------------ +Benchmark Time CPU Iterations CYCLES CYCLES/ BYTE bytes_per_second +------------------------------------------------------------------------------------------------------------------ +ascon_aead128_encrypt/32/32 218 ns 218 ns 647861 1.01088k 15.795 279.846Mi/s +ascon_aead128_encrypt/32/256 603 ns 603 ns 232372 2.82204k 9.79876 455.836Mi/s +ascon_aead128_encrypt/32/2048 3719 ns 3716 ns 37706 17.3952k 8.36309 533.76Mi/s +ascon_aead128_encrypt/32/16384 28763 ns 28749 ns 4869 134.509k 8.19376 544.555Mi/s +ascon_hash256/32 304 ns 304 ns 458926 1.42371k 44.491 100.367Mi/s +ascon_hash256/64 441 ns 441 ns 319251 2.05356k 32.0869 138.435Mi/s +ascon_hash256/2048 8801 ns 8797 ns 15690 41.1541k 20.0948 222.01Mi/s +ascon_hash256/16384 69569 ns 69545 ns 2018 323.49k 19.7443 224.675Mi/s +ascon_permutation<1> 6.52 ns 6.52 ns 21310975 30.4988 0.762469 5.7115Gi/s +ascon_permutation<8> 26.8 ns 26.8 ns 5203520 125.093 3.12733 1.39183Gi/s +ascon_permutation<12> 38.8 ns 38.7 ns 3450091 177.924 4.44811 984.442Mi/s +ascon_permutation<16> 49.5 ns 49.5 ns 2828246 231.737 5.79343 770.708Mi/s +ascon_xof128/32/64 452 ns 451 ns 307910 2.10692k 21.947 202.854Mi/s +ascon_xof128/64/64 591 ns 591 ns 234636 2.75744k 21.5425 206.573Mi/s +ascon_xof128/2048/64 9245 ns 9242 ns 14896 43.1936k 20.4515 217.945Mi/s +ascon_xof128/16384/64 71968 ns 71943 ns 1954 335.222k 20.3807 218.033Mi/s +ascon_xof128/32/512 2401 ns 2400 ns 58618 11.1967k 20.5821 216.152Mi/s +ascon_xof128/64/512 2530 ns 2529 ns 55372 11.8428k 20.5604 217.227Mi/s +ascon_xof128/2048/512 11197 ns 11194 ns 12540 52.3059k 20.432 218.095Mi/s +ascon_xof128/16384/512 73831 ns 73811 ns 1902 344.367k 20.3816 218.306Mi/s +``` -JSON benchmark result lives in [bench_result_on_Linux_6.6.62+rpt-rpi-v8_aarch64_with_g++_12](./bench_result_on_Linux_6.6.62+rpt-rpi-v8_aarch64_with_g++_12.json). +More detailed JSON benchmark result @ [bench_result_on_Linux_6.14.0-22-generic_x86_64_with_g++_14.json](./bench_result_on_Linux_6.14.0-22-generic_x86_64_with_g++_14.json). ## Usage -This section demonstrates how to use the Ascon header-only library for authenticated encryption (AEAD), hashing, and extendable output functions (XOFs). Remember that this implementation is **unaudited**, and production use requires careful consideration of the risks. No linking is required; simply include the necessary header files. +This section demonstrates how to use the Ascon header-only C++ library for authenticated encryption (AEAD), hashing, and extendable output functions (XOFs). ### Ascon-AEAD128 @@ -135,12 +205,13 @@ Ascon-AEAD128 provides authenticated encryption with associated data. The associ int main() { // Key, Nonce, and Associated Data - std::array key = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}; - std::array nonce = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + std::array key = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}; + std::array nonce{}; + std::array tag{}; + std::array ad = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09}; std::array plaintext = {0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19}; std::array ciphertext{}; - std::array tag{}; // Encryption ascon_aead128::ascon_aead128_t enc_handle(key, nonce); @@ -172,7 +243,7 @@ int main() { ### Ascon-Hash256 -Ascon-Hash256 computes a 256-bit (32-byte) hash. +Ascon-Hash256 computes a 256-bit (32-byte) hash for any arbitrary length (>=0) input message. ```cpp #include "ascon/hashes/ascon_hash256.hpp" @@ -184,9 +255,9 @@ int main() { std::array digest{}; ascon_hash256::ascon_hash256_t hasher; - assert(hasher.absorb(message)); - assert(hasher.finalize()); - assert(hasher.digest(digest)); + assert(hasher.absorb(message) == ascon_hash256::ascon_hash256_status_t::absorbed_data); + assert(hasher.finalize() == ascon_hash256::ascon_hash256_status_t::finalized_data_absorption_phase); + assert(hasher.digest(digest) == ascon_hash256::ascon_hash256_status_t::message_digest_produced); // digest now contains the hash return 0; @@ -195,7 +266,7 @@ int main() { ### Ascon-XOF128 and Ascon-CXOF128 -Ascon-XOF128 and Ascon-CXOF128 are extendable output functions. XOF128 produces a variable-length output, while CXOF128 allows for customization with an application-specific string. +Ascon-Xof128 and Ascon-CXOF128 are extendable output functions. XOF128 produces a variable-length output, while CXOF128 allows for customization with an application-specific string. ```cpp #include "ascon/hashes/ascon_xof128.hpp" @@ -209,9 +280,9 @@ int main() { std::array output{}; ascon_xof128::ascon_xof128_t xof; - assert(xof.absorb(message)); - assert(xof.finalize()); - assert(xof.squeeze(output)); + assert(xof.absorb(message) == ascon_xof128::ascon_xof128_status_t::absorbed_data); + assert(xof.finalize() == ascon_xof128::ascon_xof128_status_t::finalized_data_absorption_phase); + assert(xof.squeeze(output) == ascon_xof128::ascon_xof128_status_t::squeezed_output); // CXOF128 std::array customization_string = {'A', 'S', 'C', 'O', 'N'}; @@ -219,16 +290,16 @@ int main() { std::array output2{}; ascon_cxof128::ascon_cxof128_t cxof; - assert(cxof.customize(customization_string)); - assert(cxof.absorb(message2)); - assert(cxof.finalize()); - assert(cxof.squeeze(output2)); + assert(cxof.customize(customization_string) == ascon_cxof128::ascon_cxof128_status_t::customized); + assert(cxof.absorb(message2) == ascon_cxof128::ascon_cxof128_status_t::absorbed_data); + assert(cxof.finalize() == ascon_cxof128::ascon_cxof128_status_t::finalized_data_absorption_phase); + assert(cxof.squeeze(output2) == ascon_cxof128::ascon_cxof128_status_t::squeezed_output); return 0; } ``` -Remember to compile with a C++20 compliant compiler. +Use a C++20 compliant compiler when using this library. ### Example Programs diff --git a/bench_result_on_Linux_6.14.0-15-generic_x86_64_with_g++_14.json b/bench_result_on_Linux_6.14.0-22-generic_x86_64_with_g++_14.json similarity index 57% rename from bench_result_on_Linux_6.14.0-15-generic_x86_64_with_g++_14.json rename to bench_result_on_Linux_6.14.0-22-generic_x86_64_with_g++_14.json index 292f759..7a2c09b 100644 --- a/bench_result_on_Linux_6.14.0-15-generic_x86_64_with_g++_14.json +++ b/bench_result_on_Linux_6.14.0-22-generic_x86_64_with_g++_14.json @@ -1,10 +1,10 @@ { "context": { - "date": "2025-04-19T16:21:34+04:00", + "date": "2025-06-24T12:25:41+04:00", "host_name": "linux", "executable": "./build/perf/perf.out", "num_cpus": 16, - "mhz_per_cpu": 644, + "mhz_per_cpu": 721, "cpu_scaling_enabled": false, "caches": [ { @@ -32,7 +32,7 @@ "num_sharing": 16 } ], - "load_avg": [0.206055,0.427246,0.473633], + "load_avg": [0.487793,0.691895,0.744141], "library_version": "v1.9.1-7-gf4f93b55", "library_build_type": "release", "json_schema_version": 1 @@ -49,12 +49,12 @@ "aggregate_name": "mean", "aggregate_unit": "time", "iterations": 10, - "real_time": 2.1592939886252674e+02, - "cpu_time": 2.1583110649829541e+02, + "real_time": 2.1632577473159108e+02, + "cpu_time": 2.1621511190631298e+02, "time_unit": "ns", - "CYCLES": 1.0102698732266267e+03, - "CYCLES/ BYTE": 1.5785466769166042e+01, - "bytes_per_second": 2.9652835521482223e+08 + "CYCLES": 1.0107291302213428e+03, + "CYCLES/ BYTE": 1.5792642659708481e+01, + "bytes_per_second": 2.9600444969257659e+08 }, { "name": "ascon_aead128_encrypt/32/32_median", @@ -67,12 +67,12 @@ "aggregate_name": "median", "aggregate_unit": "time", "iterations": 10, - "real_time": 2.1586364515006434e+02, - "cpu_time": 2.1582200065583098e+02, + "real_time": 2.1602568334596049e+02, + "cpu_time": 2.1590648899153098e+02, "time_unit": "ns", - "CYCLES": 1.0102987758852172e+03, - "CYCLES/ BYTE": 1.5785918373206519e+01, - "bytes_per_second": 2.9654067086285740e+08 + "CYCLES": 1.0106736701380420e+03, + "CYCLES/ BYTE": 1.5791776095906906e+01, + "bytes_per_second": 2.9642463069753623e+08 }, { "name": "ascon_aead128_encrypt/32/32_stddev", @@ -85,12 +85,12 @@ "aggregate_name": "stddev", "aggregate_unit": "time", "iterations": 10, - "real_time": 2.3465094957970645e-01, - "cpu_time": 1.8658338742675104e-01, + "real_time": 7.1291415610754461e-01, + "cpu_time": 7.2051785560314896e-01, "time_unit": "ns", - "CYCLES": 3.6839145291298953e-01, - "CYCLES/ BYTE": 5.7561164517654613e-03, - "bytes_per_second": 2.5615094206346382e+05 + "CYCLES": 3.0819129562897057e-01, + "CYCLES/ BYTE": 4.8154889942026652e-03, + "bytes_per_second": 9.7956917702063743e+05 }, { "name": "ascon_aead128_encrypt/32/32_cv", @@ -103,12 +103,12 @@ "aggregate_name": "cv", "aggregate_unit": "percentage", "iterations": 10, - "real_time": 1.0867021851392220e-03, - "cpu_time": 8.6448793435724993e-04, + "real_time": 3.2955580859104828e-03, + "cpu_time": 3.3324121022371123e-03, "time_unit": "ns", - "CYCLES": 3.6464657877643243e-04, - "CYCLES/ BYTE": 3.6464657877643243e-04, - "bytes_per_second": 8.6383287654866366e-04 + "CYCLES": 3.0491977169143109e-04, + "CYCLES/ BYTE": 3.0491977169143109e-04, + "bytes_per_second": 3.3093055798248824e-03 }, { "name": "ascon_aead128_encrypt/32/32_min", @@ -121,12 +121,12 @@ "aggregate_name": "min", "aggregate_unit": "time", "iterations": 10, - "real_time": 2.1559764767224942e+02, - "cpu_time": 2.1558540033534001e+02, + "real_time": 2.1586079402635141e+02, + "cpu_time": 2.1576354098806056e+02, "time_unit": "ns", - "CYCLES": 1.0095033688678253e+03, - "CYCLES/ BYTE": 1.5773490138559771e+01, - "bytes_per_second": 2.9595846098154330e+08 + "CYCLES": 1.0102508621834158e+03, + "CYCLES/ BYTE": 1.5785169721615873e+01, + "bytes_per_second": 2.9336110197281086e+08 }, { "name": "ascon_aead128_encrypt/32/32_max", @@ -139,12 +139,12 @@ "aggregate_name": "max", "aggregate_unit": "time", "iterations": 10, - "real_time": 2.1628641563971556e+02, - "cpu_time": 2.1624656307423896e+02, + "real_time": 2.1824175406966538e+02, + "cpu_time": 2.1816116577695297e+02, "time_unit": "ns", - "CYCLES": 1.0106803504364989e+03, - "CYCLES/ BYTE": 1.5791880475570295e+01, - "bytes_per_second": 2.9686611384838170e+08 + "CYCLES": 1.0112148465359833e+03, + "CYCLES/ BYTE": 1.5800231977124739e+01, + "bytes_per_second": 2.9662101255346698e+08 }, { "name": "ascon_aead128_encrypt/32/256_mean", @@ -157,12 +157,12 @@ "aggregate_name": "mean", "aggregate_unit": "time", "iterations": 10, - "real_time": 6.0241629067167230e+02, - "cpu_time": 6.0230284221166096e+02, + "real_time": 6.0402547484189813e+02, + "cpu_time": 6.0371062347279099e+02, "time_unit": "ns", - "CYCLES": 2.8200752661347560e+03, - "CYCLES/ BYTE": 9.7919280074123449e+00, - "bytes_per_second": 4.7816500444149280e+08 + "CYCLES": 2.8232368514689620e+03, + "CYCLES/ BYTE": 9.8029057342672310e+00, + "bytes_per_second": 4.7705119528644335e+08 }, { "name": "ascon_aead128_encrypt/32/256_median", @@ -175,12 +175,12 @@ "aggregate_name": "median", "aggregate_unit": "time", "iterations": 10, - "real_time": 6.0242332737813717e+02, - "cpu_time": 6.0236150239790140e+02, + "real_time": 6.0368590094131082e+02, + "cpu_time": 6.0337404651894724e+02, "time_unit": "ns", - "CYCLES": 2.8194622637045959e+03, - "CYCLES/ BYTE": 9.7897995267520699e+00, - "bytes_per_second": 4.7811825565943271e+08 + "CYCLES": 2.8228948559014193e+03, + "CYCLES/ BYTE": 9.8017182496577071e+00, + "bytes_per_second": 4.7731585724043822e+08 }, { "name": "ascon_aead128_encrypt/32/256_stddev", @@ -193,12 +193,12 @@ "aggregate_name": "stddev", "aggregate_unit": "time", "iterations": 10, - "real_time": 5.3238651556561312e-01, - "cpu_time": 4.4456325403968122e-01, + "real_time": 1.1649632987812313e+00, + "cpu_time": 1.1108391770667914e+00, "time_unit": "ns", - "CYCLES": 1.6606674875080167e+00, - "CYCLES/ BYTE": 5.7662065568391714e-03, - "bytes_per_second": 3.5295883851929376e+05 + "CYCLES": 1.3921419555622481e+00, + "CYCLES/ BYTE": 4.8338262331998399e-03, + "bytes_per_second": 8.7475045903515955e+05 }, { "name": "ascon_aead128_encrypt/32/256_cv", @@ -211,12 +211,12 @@ "aggregate_name": "cv", "aggregate_unit": "percentage", "iterations": 10, - "real_time": 8.8375185699580180e-04, - "cpu_time": 7.3810585453530544e-04, + "real_time": 1.9286658382846468e-03, + "cpu_time": 1.8400192639923896e-03, "time_unit": "ns", - "CYCLES": 5.8887346286475408e-04, - "CYCLES/ BYTE": 5.8887346317030090e-04, - "bytes_per_second": 7.3815280340634173e-04 + "CYCLES": 4.9310136867826058e-04, + "CYCLES/ BYTE": 4.9310136853633320e-04, + "bytes_per_second": 1.8336616021052403e-03 }, { "name": "ascon_aead128_encrypt/32/256_min", @@ -229,12 +229,12 @@ "aggregate_name": "min", "aggregate_unit": "time", "iterations": 10, - "real_time": 6.0172133163834758e+02, - "cpu_time": 6.0172226929611372e+02, + "real_time": 6.0285453324457887e+02, + "cpu_time": 6.0258904474858730e+02, "time_unit": "ns", - "CYCLES": 2.8184320178928579e+03, - "CYCLES/ BYTE": 9.7862222843502007e+00, - "bytes_per_second": 4.7769129400879174e+08 + "CYCLES": 2.8212412236030546e+03, + "CYCLES/ BYTE": 9.7959764708439394e+00, + "bytes_per_second": 4.7474608412224251e+08 }, { "name": "ascon_aead128_encrypt/32/256_max", @@ -247,12 +247,12 @@ "aggregate_name": "max", "aggregate_unit": "time", "iterations": 10, - "real_time": 6.0327692208161102e+02, - "cpu_time": 6.0289983010387346e+02, + "real_time": 6.0709023588011291e+02, + "cpu_time": 6.0664007483596811e+02, "time_unit": "ns", - "CYCLES": 2.8232639067506830e+03, - "CYCLES/ BYTE": 9.8029996762176488e+00, - "bytes_per_second": 4.7862612819182903e+08 + "CYCLES": 2.8255778718084339e+03, + "CYCLES/ BYTE": 9.8110342771126184e+00, + "bytes_per_second": 4.7793766333763939e+08 }, { "name": "ascon_aead128_encrypt/32/2048_mean", @@ -265,12 +265,12 @@ "aggregate_name": "mean", "aggregate_unit": "time", "iterations": 10, - "real_time": 3.7193740083679331e+03, - "cpu_time": 3.7185752528729536e+03, + "real_time": 3.7293713857373100e+03, + "cpu_time": 3.7275808271975739e+03, "time_unit": "ns", - "CYCLES": 1.7374687033310387e+04, - "CYCLES/ BYTE": 8.3532149198607613e+00, - "bytes_per_second": 5.5936384885585868e+08 + "CYCLES": 1.7410182368889720e+04, + "CYCLES/ BYTE": 8.3702799850431315e+00, + "bytes_per_second": 5.5800641861018276e+08 }, { "name": "ascon_aead128_encrypt/32/2048_median", @@ -283,12 +283,12 @@ "aggregate_name": "median", "aggregate_unit": "time", "iterations": 10, - "real_time": 3.7160583064436423e+03, - "cpu_time": 3.7157631202669058e+03, + "real_time": 3.7262632973179216e+03, + "cpu_time": 3.7245127455410570e+03, "time_unit": "ns", - "CYCLES": 1.7383294550654027e+04, - "CYCLES/ BYTE": 8.3573531493528979e+00, - "bytes_per_second": 5.5977734120222950e+08 + "CYCLES": 1.7411549972090055e+04, + "CYCLES/ BYTE": 8.3709374865817576e+00, + "bytes_per_second": 5.5846242806657386e+08 }, { "name": "ascon_aead128_encrypt/32/2048_stddev", @@ -301,12 +301,12 @@ "aggregate_name": "stddev", "aggregate_unit": "time", "iterations": 10, - "real_time": 1.6473792569815423e+01, - "cpu_time": 1.6517006943925274e+01, + "real_time": 1.0257647966995176e+01, + "cpu_time": 1.0216585788030548e+01, "time_unit": "ns", - "CYCLES": 3.2471668547106972e+01, - "CYCLES/ BYTE": 1.5611379110004169e-02, - "bytes_per_second": 2.4598148918684470e+06 + "CYCLES": 1.1338814692553287e+01, + "CYCLES/ BYTE": 5.4513532246308694e-03, + "bytes_per_second": 1.5255688304920527e+06 }, { "name": "ascon_aead128_encrypt/32/2048_cv", @@ -319,12 +319,12 @@ "aggregate_name": "cv", "aggregate_unit": "percentage", "iterations": 10, - "real_time": 4.4291841941015639e-03, - "cpu_time": 4.4417568075741688e-03, + "real_time": 2.7505032097968982e-03, + "cpu_time": 2.7408086535608304e-03, "time_unit": "ns", - "CYCLES": 1.8689066735333400e-03, - "CYCLES/ BYTE": 1.8689066736312817e-03, - "bytes_per_second": 4.3975221081945740e-03 + "CYCLES": 6.5127489490372206e-04, + "CYCLES/ BYTE": 6.5127489574684505e-04, + "bytes_per_second": 2.7339628714159983e-03 }, { "name": "ascon_aead128_encrypt/32/2048_min", @@ -337,12 +337,12 @@ "aggregate_name": "min", "aggregate_unit": "time", "iterations": 10, - "real_time": 3.7091773817820090e+03, - "cpu_time": 3.7063237038606121e+03, + "real_time": 3.7191470191332237e+03, + "cpu_time": 3.7175888466548085e+03, "time_unit": "ns", - "CYCLES": 1.7296621723243130e+04, - "CYCLES/ BYTE": 8.3156835207899658e+00, - "bytes_per_second": 5.5255972752423406e+08 + "CYCLES": 1.7391728396374365e+04, + "CYCLES/ BYTE": 8.3614078828722906e+00, + "bytes_per_second": 5.5517540356589639e+08 }, { "name": "ascon_aead128_encrypt/32/2048_max", @@ -355,12 +355,12 @@ "aggregate_name": "max", "aggregate_unit": "time", "iterations": 10, - "real_time": 3.7653379759297009e+03, - "cpu_time": 3.7642989461420270e+03, + "real_time": 3.7484546131494390e+03, + "cpu_time": 3.7465636745434722e+03, "time_unit": "ns", - "CYCLES": 1.7406526770110682e+04, - "CYCLES/ BYTE": 8.3685224856301357e+00, - "bytes_per_second": 5.6120300497050846e+08 + "CYCLES": 1.7425101725100343e+04, + "CYCLES/ BYTE": 8.3774527524520881e+00, + "bytes_per_second": 5.5950243176343787e+08 }, { "name": "ascon_aead128_encrypt/32/16384_mean", @@ -373,12 +373,12 @@ "aggregate_name": "mean", "aggregate_unit": "time", "iterations": 10, - "real_time": 2.8754101663187728e+04, - "cpu_time": 2.8751587926078046e+04, + "real_time": 2.8842753414570820e+04, + "cpu_time": 2.8830285088440993e+04, "time_unit": "ns", - "CYCLES": 1.3452802312114989e+05, - "CYCLES/ BYTE": 8.1949331823312566e+00, - "bytes_per_second": 5.7096087176467419e+08 + "CYCLES": 1.3458950240641713e+05, + "CYCLES/ BYTE": 8.1986782654981205e+00, + "bytes_per_second": 5.6941171989567876e+08 }, { "name": "ascon_aead128_encrypt/32/16384_median", @@ -391,12 +391,12 @@ "aggregate_name": "median", "aggregate_unit": "time", "iterations": 10, - "real_time": 2.8757353285209225e+04, - "cpu_time": 2.8755731211499013e+04, + "real_time": 2.8778282189426631e+04, + "cpu_time": 2.8764845331139415e+04, "time_unit": "ns", - "CYCLES": 1.3450496108829568e+05, - "CYCLES/ BYTE": 8.1935283314020282e+00, - "bytes_per_second": 5.7087751318268132e+08 + "CYCLES": 1.3462764664747019e+05, + "CYCLES/ BYTE": 8.2010018669267897e+00, + "bytes_per_second": 5.7069663645990312e+08 }, { "name": "ascon_aead128_encrypt/32/16384_stddev", @@ -409,12 +409,12 @@ "aggregate_name": "stddev", "aggregate_unit": "time", "iterations": 10, - "real_time": 4.0391951939884962e+01, - "cpu_time": 4.2132484980645117e+01, + "real_time": 1.3066566749394087e+02, + "cpu_time": 1.3068093307000876e+02, "time_unit": "ns", - "CYCLES": 1.4679215572382907e+02, - "CYCLES/ BYTE": 8.9420172828707893e-03, - "bytes_per_second": 8.3617039526641939e+05 + "CYCLES": 9.5735606931963133e+01, + "CYCLES/ BYTE": 5.8318473986187450e-03, + "bytes_per_second": 2.5696036792833768e+06 }, { "name": "ascon_aead128_encrypt/32/16384_cv", @@ -427,12 +427,12 @@ "aggregate_name": "cv", "aggregate_unit": "percentage", "iterations": 10, - "real_time": 1.4047370497961521e-03, - "cpu_time": 1.4653968013512890e-03, + "real_time": 4.5302771762397356e-03, + "cpu_time": 4.5327658977053625e-03, "time_unit": "ns", - "CYCLES": 1.0911641479458495e-03, - "CYCLES/ BYTE": 1.0911641478847307e-03, - "bytes_per_second": 1.4644968449099842e-03 + "CYCLES": 7.1131555745612544e-04, + "CYCLES/ BYTE": 7.1131555718687836e-04, + "bytes_per_second": 4.5127340894109995e-03 }, { "name": "ascon_aead128_encrypt/32/16384_min", @@ -445,12 +445,12 @@ "aggregate_name": "min", "aggregate_unit": "time", "iterations": 10, - "real_time": 2.8692003901376396e+04, - "cpu_time": 2.8688129158110842e+04, + "real_time": 2.8714947962405749e+04, + "cpu_time": 2.8701933360756891e+04, "time_unit": "ns", - "CYCLES": 1.3428539363449693e+05, - "CYCLES/ BYTE": 8.1801531210098020e+00, - "bytes_per_second": 5.6929572708756280e+08 + "CYCLES": 1.3433232106129164e+05, + "CYCLES/ BYTE": 8.1830117605562656e+00, + "bytes_per_second": 5.6472801384584141e+08 }, { "name": "ascon_aead128_encrypt/32/16384_max", @@ -463,12 +463,12 @@ "aggregate_name": "max", "aggregate_unit": "time", "iterations": 10, - "real_time": 2.8835454415244312e+04, - "cpu_time": 2.8835628336755581e+04, + "real_time": 2.9082337310864288e+04, + "cpu_time": 2.9068860756890332e+04, "time_unit": "ns", - "CYCLES": 1.3474605790554415e+05, - "CYCLES/ BYTE": 8.2082150283591702e+00, - "bytes_per_second": 5.7222274445033979e+08 + "CYCLES": 1.3465309419991772e+05, + "CYCLES/ BYTE": 8.2025520345953780e+00, + "bytes_per_second": 5.7194753376596558e+08 }, { "name": "ascon_hash256/32_mean", @@ -481,12 +481,12 @@ "aggregate_name": "mean", "aggregate_unit": "time", "iterations": 10, - "real_time": 3.0904697484984297e+02, - "cpu_time": 3.0901137522909460e+02, + "real_time": 3.0508121672481002e+02, + "cpu_time": 3.0491297544262886e+02, "time_unit": "ns", - "CYCLES": 1.4451169035263983e+03, - "CYCLES/ BYTE": 4.5159903235199948e+01, - "bytes_per_second": 1.0355610937157983e+08 + "CYCLES": 1.4239246281132052e+03, + "CYCLES/ BYTE": 4.4497644628537664e+01, + "bytes_per_second": 1.0495018946192297e+08 }, { "name": "ascon_hash256/32_median", @@ -499,12 +499,12 @@ "aggregate_name": "median", "aggregate_unit": "time", "iterations": 10, - "real_time": 3.0899126128941998e+02, - "cpu_time": 3.0895133482014762e+02, + "real_time": 3.0429441853485315e+02, + "cpu_time": 3.0416305554467203e+02, "time_unit": "ns", - "CYCLES": 1.4451166548899241e+03, - "CYCLES/ BYTE": 4.5159895465310129e+01, - "bytes_per_second": 1.0357618632150459e+08 + "CYCLES": 1.4237770344395251e+03, + "CYCLES/ BYTE": 4.4493032326235159e+01, + "bytes_per_second": 1.0520672848556495e+08 }, { "name": "ascon_hash256/32_stddev", @@ -517,12 +517,12 @@ "aggregate_name": "stddev", "aggregate_unit": "time", "iterations": 10, - "real_time": 2.2913411715242224e-01, - "cpu_time": 2.2872259838531880e-01, + "real_time": 1.5575715284720153e+00, + "cpu_time": 1.4811318505644080e+00, "time_unit": "ns", - "CYCLES": 6.4985429251946031e-02, - "CYCLES/ BYTE": 2.0307946641233135e-03, - "bytes_per_second": 7.6610459541182179e+04 + "CYCLES": 3.4101546595714038e-01, + "CYCLES/ BYTE": 1.0656733311160637e-02, + "bytes_per_second": 5.0603027578287141e+05 }, { "name": "ascon_hash256/32_cv", @@ -535,12 +535,12 @@ "aggregate_name": "cv", "aggregate_unit": "percentage", "iterations": 10, - "real_time": 7.4142164719053437e-04, - "cpu_time": 7.4017533566765506e-04, + "real_time": 5.1054323999139527e-03, + "cpu_time": 4.8575559908997437e-03, "time_unit": "ns", - "CYCLES": 4.4968977314823112e-05, - "CYCLES/ BYTE": 4.4968977314823112e-05, - "bytes_per_second": 7.3979661852965797e-04 + "CYCLES": 2.3948982918359137e-04, + "CYCLES/ BYTE": 2.3948982918359137e-04, + "bytes_per_second": 4.8216232707847043e-03 }, { "name": "ascon_hash256/32_min", @@ -553,12 +553,12 @@ "aggregate_name": "min", "aggregate_unit": "time", "iterations": 10, - "real_time": 3.0878288250732169e+02, - "cpu_time": 3.0877242696579594e+02, + "real_time": 3.0409097025532401e+02, + "cpu_time": 3.0394599424484176e+02, "time_unit": "ns", - "CYCLES": 1.4450023075054651e+03, - "CYCLES/ BYTE": 4.5156322109545783e+01, - "bytes_per_second": 1.0341302132455446e+08 + "CYCLES": 1.4235804350759881e+03, + "CYCLES/ BYTE": 4.4486888596124629e+01, + "bytes_per_second": 1.0372888283041373e+08 }, { "name": "ascon_hash256/32_max", @@ -571,12 +571,12 @@ "aggregate_name": "max", "aggregate_unit": "time", "iterations": 10, - "real_time": 3.0950459293207950e+02, - "cpu_time": 3.0943878817320558e+02, + "real_time": 3.0893523490475070e+02, + "cpu_time": 3.0849652600921939e+02, "time_unit": "ns", - "CYCLES": 1.4452392850045267e+03, - "CYCLES/ BYTE": 4.5163727656391458e+01, - "bytes_per_second": 1.0363619677590182e+08 + "CYCLES": 1.4245609014962540e+03, + "CYCLES/ BYTE": 4.4517528171757938e+01, + "bytes_per_second": 1.0528186127112634e+08 }, { "name": "ascon_hash256/64_mean", @@ -589,12 +589,12 @@ "aggregate_name": "mean", "aggregate_unit": "time", "iterations": 10, - "real_time": 4.4608419145747803e+02, - "cpu_time": 4.4604958243452882e+02, + "real_time": 4.3922991352956763e+02, + "cpu_time": 4.3902442289617193e+02, "time_unit": "ns", - "CYCLES": 2.0851656882581419e+03, - "CYCLES/ BYTE": 3.2580713879033468e+01, - "bytes_per_second": 1.4348320113094556e+08 + "CYCLES": 2.0539535187041797e+03, + "CYCLES/ BYTE": 3.2093023729752808e+01, + "bytes_per_second": 1.4577819065082112e+08 }, { "name": "ascon_hash256/64_median", @@ -607,12 +607,12 @@ "aggregate_name": "median", "aggregate_unit": "time", "iterations": 10, - "real_time": 4.4558870358928925e+02, - "cpu_time": 4.4557350649847132e+02, + "real_time": 4.3894977441255071e+02, + "cpu_time": 4.3869484146876596e+02, "time_unit": "ns", - "CYCLES": 2.0856232415570839e+03, - "CYCLES/ BYTE": 3.2587863149329436e+01, - "bytes_per_second": 1.4363511099427122e+08 + "CYCLES": 2.0538744470204902e+03, + "CYCLES/ BYTE": 3.2091788234695159e+01, + "bytes_per_second": 1.4588729357349452e+08 }, { "name": "ascon_hash256/64_stddev", @@ -625,12 +625,12 @@ "aggregate_name": "stddev", "aggregate_unit": "time", "iterations": 10, - "real_time": 1.4952382593420368e+00, - "cpu_time": 1.4716217184960441e+00, + "real_time": 8.0449129618725146e-01, + "cpu_time": 7.9016618840366559e-01, "time_unit": "ns", - "CYCLES": 1.4470257209904749e+00, - "CYCLES/ BYTE": 2.2609776890476170e-02, - "bytes_per_second": 4.6958879107860604e+05 + "CYCLES": 3.4350063660715119e-01, + "CYCLES/ BYTE": 5.3671974469867373e-03, + "bytes_per_second": 2.6157872793227411e+05 }, { "name": "ascon_hash256/64_cv", @@ -643,12 +643,12 @@ "aggregate_name": "cv", "aggregate_unit": "percentage", "iterations": 10, - "real_time": 3.3519194088826323e-03, - "cpu_time": 3.2992334853537237e-03, + "real_time": 1.8315949606494543e-03, + "cpu_time": 1.7998228508361092e-03, "time_unit": "ns", - "CYCLES": 6.9396198543783744e-04, - "CYCLES/ BYTE": 6.9396198543783744e-04, - "bytes_per_second": 3.2727788854532884e-03 + "CYCLES": 1.6723875855957176e-04, + "CYCLES/ BYTE": 1.6723875855957176e-04, + "bytes_per_second": 1.7943611919208624e-03 }, { "name": "ascon_hash256/64_min", @@ -661,12 +661,12 @@ "aggregate_name": "min", "aggregate_unit": "time", "iterations": 10, - "real_time": 4.4539949910926225e+02, - "cpu_time": 4.4537387164920182e+02, + "real_time": 4.3862636757964549e+02, + "cpu_time": 4.3844060091484488e+02, "time_unit": "ns", - "CYCLES": 2.0810539250516977e+03, - "CYCLES/ BYTE": 3.2516467578932776e+01, - "bytes_per_second": 1.4215837497146121e+08 + "CYCLES": 2.0536470048248639e+03, + "CYCLES/ BYTE": 3.2088234450388498e+01, + "bytes_per_second": 1.4511617299285838e+08 }, { "name": "ascon_hash256/64_max", @@ -679,233 +679,125 @@ "aggregate_name": "max", "aggregate_unit": "time", "iterations": 10, - "real_time": 4.5030642073073096e+02, - "cpu_time": 4.5020210742313446e+02, + "real_time": 4.4129191052556507e+02, + "cpu_time": 4.4102596340622659e+02, "time_unit": "ns", - "CYCLES": 2.0857766749616849e+03, - "CYCLES/ BYTE": 3.2590260546276326e+01, - "bytes_per_second": 1.4369949400715971e+08 + "CYCLES": 2.0548046838774358e+03, + "CYCLES/ BYTE": 3.2106323185584934e+01, + "bytes_per_second": 1.4597188277376312e+08 }, { - "name": "ascon_hash256/512_mean", + "name": "ascon_hash256/2048_mean", "family_index": 1, "per_family_instance_index": 2, - "run_name": "ascon_hash256/512", + "run_name": "ascon_hash256/2048", "run_type": "aggregate", "repetitions": 10, "threads": 1, "aggregate_name": "mean", "aggregate_unit": "time", "iterations": 10, - "real_time": 2.3620641192827866e+03, - "cpu_time": 2.3618838042287921e+03, + "real_time": 8.8184760376055565e+03, + "cpu_time": 8.8143433388157973e+03, "time_unit": "ns", - "CYCLES": 1.1050743339230057e+04, - "CYCLES/ BYTE": 2.1583483084433706e+01, - "bytes_per_second": 2.1677631295154759e+08 + "CYCLES": 4.1143724405364366e+04, + "CYCLES/ BYTE": 2.0089709182306819e+01, + "bytes_per_second": 2.3235208064898777e+08 }, { - "name": "ascon_hash256/512_median", + "name": "ascon_hash256/2048_median", "family_index": 1, "per_family_instance_index": 2, - "run_name": "ascon_hash256/512", + "run_name": "ascon_hash256/2048", "run_type": "aggregate", "repetitions": 10, "threads": 1, "aggregate_name": "median", "aggregate_unit": "time", "iterations": 10, - "real_time": 2.3618854940636693e+03, - "cpu_time": 2.3616750147418088e+03, + "real_time": 8.8104573953630461e+03, + "cpu_time": 8.8064689397772836e+03, "time_unit": "ns", - "CYCLES": 1.1050731480077500e+04, - "CYCLES/ BYTE": 2.1583459922026368e+01, - "bytes_per_second": 2.1679528184349442e+08 + "CYCLES": 4.1143813100961532e+04, + "CYCLES/ BYTE": 2.0089752490703873e+01, + "bytes_per_second": 2.3255631918581688e+08 }, { - "name": "ascon_hash256/512_stddev", + "name": "ascon_hash256/2048_stddev", "family_index": 1, "per_family_instance_index": 2, - "run_name": "ascon_hash256/512", + "run_name": "ascon_hash256/2048", "run_type": "aggregate", "repetitions": 10, "threads": 1, "aggregate_name": "stddev", "aggregate_unit": "time", "iterations": 10, - "real_time": 2.3467457583918145e+00, - "cpu_time": 2.3682493581319539e+00, + "real_time": 3.6141808982632973e+01, + "cpu_time": 3.6254678718748991e+01, "time_unit": "ns", - "CYCLES": 4.2664196111136160e-01, - "CYCLES/ BYTE": 8.3328508029562813e-04, - "bytes_per_second": 2.1708536510373568e+05 + "CYCLES": 1.1130170899136180e+00, + "CYCLES/ BYTE": 5.4346537593438380e-04, + "bytes_per_second": 9.5051541911393183e+05 }, { - "name": "ascon_hash256/512_cv", + "name": "ascon_hash256/2048_cv", "family_index": 1, "per_family_instance_index": 2, - "run_name": "ascon_hash256/512", + "run_name": "ascon_hash256/2048", "run_type": "aggregate", "repetitions": 10, "threads": 1, "aggregate_name": "cv", "aggregate_unit": "percentage", "iterations": 10, - "real_time": 9.9351484120777231e-04, - "cpu_time": 1.0026951173007601e-03, + "real_time": 4.0984189137113543e-03, + "cpu_time": 4.1131457358932200e-03, "time_unit": "ns", - "CYCLES": 3.8607535078367605e-05, - "CYCLES/ BYTE": 3.8607535078367605e-05, - "bytes_per_second": 1.0014256730727640e-03 + "CYCLES": 2.7051928477542049e-05, + "CYCLES/ BYTE": 2.7051928477542049e-05, + "bytes_per_second": 4.0908410049913307e-03 }, { - "name": "ascon_hash256/512_min", + "name": "ascon_hash256/2048_min", "family_index": 1, "per_family_instance_index": 2, - "run_name": "ascon_hash256/512", + "run_name": "ascon_hash256/2048", "run_type": "aggregate", "repetitions": 10, "threads": 1, "aggregate_name": "min", "aggregate_unit": "time", "iterations": 10, - "real_time": 2.3594257939212598e+03, - "cpu_time": 2.3593603740207163e+03, + "real_time": 8.7886472677931342e+03, + "cpu_time": 8.7844429402834030e+03, "time_unit": "ns", - "CYCLES": 1.1050106309493724e+04, - "CYCLES/ BYTE": 2.1582238885729929e+01, - "bytes_per_second": 2.1625377796874809e+08 + "CYCLES": 4.1141774797570848e+04, + "CYCLES/ BYTE": 2.0088757225376391e+01, + "bytes_per_second": 2.3013501626334924e+08 }, { - "name": "ascon_hash256/512_max", + "name": "ascon_hash256/2048_max", "family_index": 1, "per_family_instance_index": 2, - "run_name": "ascon_hash256/512", + "run_name": "ascon_hash256/2048", "run_type": "aggregate", "repetitions": 10, "threads": 1, "aggregate_name": "max", "aggregate_unit": "time", "iterations": 10, - "real_time": 2.3676723275060549e+03, - "cpu_time": 2.3675886951394286e+03, + "real_time": 8.9029274421837963e+03, + "cpu_time": 8.8991237980769620e+03, "time_unit": "ns", - "CYCLES": 1.1051675259034622e+04, - "CYCLES/ BYTE": 2.1585303240301997e+01, - "bytes_per_second": 2.1700796776860017e+08 - }, - { - "name": "ascon_hash256/4096_mean", - "family_index": 1, - "per_family_instance_index": 3, - "run_name": "ascon_hash256/4096", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "mean", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 1.7702641419502943e+04, - "cpu_time": 1.7700754474017740e+04, - "time_unit": "ns", - "CYCLES": 8.2751944283903664e+04, - "CYCLES/ BYTE": 2.0203111397437418e+01, - "bytes_per_second": 2.3140295127079391e+08 - }, - { - "name": "ascon_hash256/4096_median", - "family_index": 1, - "per_family_instance_index": 3, - "run_name": "ascon_hash256/4096", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "median", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 1.7692111913973589e+04, - "cpu_time": 1.7689532192648931e+04, - "time_unit": "ns", - "CYCLES": 8.2748756083650194e+04, - "CYCLES/ BYTE": 2.0202333028234911e+01, - "bytes_per_second": 2.3154936804544562e+08 - }, - { - "name": "ascon_hash256/4096_stddev", - "family_index": 1, - "per_family_instance_index": 3, - "run_name": "ascon_hash256/4096", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "stddev", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 2.3399707323674626e+01, - "cpu_time": 2.4102773076925644e+01, - "time_unit": "ns", - "CYCLES": 7.8547774396976839e+00, - "CYCLES/ BYTE": 1.9176702733636924e-03, - "bytes_per_second": 3.1462541435809026e+05 - }, - { - "name": "ascon_hash256/4096_cv", - "family_index": 1, - "per_family_instance_index": 3, - "run_name": "ascon_hash256/4096", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "cv", - "aggregate_unit": "percentage", - "iterations": 10, - "real_time": 1.3218201040831818e-03, - "cpu_time": 1.3616805493972125e-03, - "time_unit": "ns", - "CYCLES": 9.4919551530410877e-05, - "CYCLES/ BYTE": 9.4919551530410877e-05, - "bytes_per_second": 1.3596430496251848e-03 - }, - { - "name": "ascon_hash256/4096_min", - "family_index": 1, - "per_family_instance_index": 3, - "run_name": "ascon_hash256/4096", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "min", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 1.7681287705832772e+04, - "cpu_time": 1.7678977566539841e+04, - "time_unit": "ns", - "CYCLES": 8.2745887579214192e+04, - "CYCLES/ BYTE": 2.0201632709769090e+01, - "bytes_per_second": 2.3074839717835262e+08 - }, - { - "name": "ascon_hash256/4096_max", - "family_index": 1, - "per_family_instance_index": 3, - "run_name": "ascon_hash256/4096", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "max", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 1.7751891381613063e+04, - "cpu_time": 1.7750935868187520e+04, - "time_unit": "ns", - "CYCLES": 8.2768987325728769e+04, - "CYCLES/ BYTE": 2.0207272296320500e+01, - "bytes_per_second": 2.3168760662677142e+08 + "CYCLES": 4.1145217358299597e+04, + "CYCLES/ BYTE": 2.0090438163232225e+01, + "bytes_per_second": 2.3313942772720975e+08 }, { "name": "ascon_hash256/16384_mean", "family_index": 1, - "per_family_instance_index": 4, + "per_family_instance_index": 3, "run_name": "ascon_hash256/16384", "run_type": "aggregate", "repetitions": 10, @@ -913,17 +805,17 @@ "aggregate_name": "mean", "aggregate_unit": "time", "iterations": 10, - "real_time": 7.0377256648914772e+04, - "cpu_time": 7.0371024937280483e+04, + "real_time": 6.9326233267873889e+04, + "cpu_time": 6.9294148986653498e+04, "time_unit": "ns", - "CYCLES": 3.2861432654290018e+05, - "CYCLES/ BYTE": 2.0057026766534435e+01, - "bytes_per_second": 2.3282517447383475e+08 + "CYCLES": 3.2351486520019779e+05, + "CYCLES/ BYTE": 1.9745780346691760e+01, + "bytes_per_second": 2.3644764911753178e+08 }, { "name": "ascon_hash256/16384_median", "family_index": 1, - "per_family_instance_index": 4, + "per_family_instance_index": 3, "run_name": "ascon_hash256/16384", "run_type": "aggregate", "repetitions": 10, @@ -931,17 +823,17 @@ "aggregate_name": "median", "aggregate_unit": "time", "iterations": 10, - "real_time": 7.0302680633057695e+04, - "cpu_time": 7.0292971650777457e+04, + "real_time": 6.9183358626584726e+04, + "cpu_time": 6.9153075135937077e+04, "time_unit": "ns", - "CYCLES": 3.2857519167084794e+05, - "CYCLES/ BYTE": 2.0054638163503903e+01, - "bytes_per_second": 2.3308162420133710e+08 + "CYCLES": 3.2348352347998018e+05, + "CYCLES/ BYTE": 1.9743867399901134e+01, + "bytes_per_second": 2.3692367834289718e+08 }, { "name": "ascon_hash256/16384_stddev", "family_index": 1, - "per_family_instance_index": 4, + "per_family_instance_index": 3, "run_name": "ascon_hash256/16384", "run_type": "aggregate", "repetitions": 10, @@ -949,17 +841,17 @@ "aggregate_name": "stddev", "aggregate_unit": "time", "iterations": 10, - "real_time": 2.2551192538526544e+02, - "cpu_time": 2.2231087783976403e+02, + "real_time": 3.7865320544859190e+02, + "cpu_time": 3.8020501639082522e+02, "time_unit": "ns", - "CYCLES": 1.1648377999326385e+02, - "CYCLES/ BYTE": 7.1096057124794831e-03, - "bytes_per_second": 7.3050530190790235e+05 + "CYCLES": 6.7323272557758841e+01, + "CYCLES/ BYTE": 4.1090864598241480e-03, + "bytes_per_second": 1.2818479138632459e+06 }, { "name": "ascon_hash256/16384_cv", "family_index": 1, - "per_family_instance_index": 4, + "per_family_instance_index": 3, "run_name": "ascon_hash256/16384", "run_type": "aggregate", "repetitions": 10, @@ -967,17 +859,17 @@ "aggregate_name": "cv", "aggregate_unit": "percentage", "iterations": 10, - "real_time": 3.2043295820730583e-03, - "cpu_time": 3.1591251944660865e-03, + "real_time": 5.4619036344509091e-03, + "cpu_time": 5.4868271268336847e-03, "time_unit": "ns", - "CYCLES": 3.5446957294497943e-04, - "CYCLES/ BYTE": 3.5446957294497943e-04, - "bytes_per_second": 3.1375700826114816e-03 + "CYCLES": 2.0809947176955157e-04, + "CYCLES/ BYTE": 2.0809947176955157e-04, + "bytes_per_second": 5.4212757819642084e-03 }, { "name": "ascon_hash256/16384_min", "family_index": 1, - "per_family_instance_index": 4, + "per_family_instance_index": 3, "run_name": "ascon_hash256/16384", "run_type": "aggregate", "repetitions": 10, @@ -985,17 +877,17 @@ "aggregate_name": "min", "aggregate_unit": "time", "iterations": 10, - "real_time": 7.0238941796832514e+04, - "cpu_time": 7.0231087305569410e+04, + "real_time": 6.9124386058597782e+04, + "cpu_time": 6.9093942659416207e+04, "time_unit": "ns", - "CYCLES": 3.2856278173607629e+05, - "CYCLES/ BYTE": 2.0053880721196062e+01, - "bytes_per_second": 2.3083211329315358e+08 + "CYCLES": 3.2347064162135444e+05, + "CYCLES/ BYTE": 1.9743081153647122e+01, + "bytes_per_second": 2.3294851781440720e+08 }, { "name": "ascon_hash256/16384_max", "family_index": 1, - "per_family_instance_index": 4, + "per_family_instance_index": 3, "run_name": "ascon_hash256/16384", "run_type": "aggregate", "repetitions": 10, @@ -1003,12 +895,12 @@ "aggregate_name": "max", "aggregate_unit": "time", "iterations": 10, - "real_time": 7.0993414451000150e+04, - "cpu_time": 7.0977992473657883e+04, + "real_time": 7.0359968859748391e+04, + "cpu_time": 7.0333136925358442e+04, "time_unit": "ns", - "CYCLES": 3.2894097942799801e+05, - "CYCLES/ BYTE": 2.0076964076415894e+01, - "bytes_per_second": 2.3328700478058425e+08 + "CYCLES": 3.2369180375679681e+05, + "CYCLES/ BYTE": 1.9756579819140430e+01, + "bytes_per_second": 2.3712643061579829e+08 }, { "name": "ascon_permutation<1>_mean", @@ -1021,12 +913,12 @@ "aggregate_name": "mean", "aggregate_unit": "time", "iterations": 10, - "real_time": 6.5262973329886149e+00, - "cpu_time": 6.5259251317179103e+00, + "real_time": 6.5233689307193830e+00, + "cpu_time": 6.5203189677124040e+00, "time_unit": "ns", - "CYCLES": 3.0515574840849325e+01, - "CYCLES/ BYTE": 7.6288937102123322e-01, - "bytes_per_second": 6.1294041663113022e+09 + "CYCLES": 3.0468505708082951e+01, + "CYCLES/ BYTE": 7.6171264270207373e-01, + "bytes_per_second": 6.1347503355579233e+09 }, { "name": "ascon_permutation<1>_median", @@ -1039,12 +931,12 @@ "aggregate_name": "median", "aggregate_unit": "time", "iterations": 10, - "real_time": 6.5268480541904257e+00, - "cpu_time": 6.5265543678268259e+00, + "real_time": 6.5125589904712955e+00, + "cpu_time": 6.5093310009683574e+00, "time_unit": "ns", - "CYCLES": 3.0519105992006203e+01, - "CYCLES/ BYTE": 7.6297764980015503e-01, - "bytes_per_second": 6.1288082226032181e+09 + "CYCLES": 3.0467944774158052e+01, + "CYCLES/ BYTE": 7.6169861935395133e-01, + "bytes_per_second": 6.1450249218459072e+09 }, { "name": "ascon_permutation<1>_stddev", @@ -1057,12 +949,12 @@ "aggregate_name": "stddev", "aggregate_unit": "time", "iterations": 10, - "real_time": 6.3903199339217483e-03, - "cpu_time": 6.2196806496846013e-03, + "real_time": 2.5188294711397208e-02, + "cpu_time": 2.5065967951753938e-02, "time_unit": "ns", - "CYCLES": 1.7150710957291655e-02, - "CYCLES/ BYTE": 4.2876777369062018e-04, - "bytes_per_second": 5.8401368161751525e+06 + "CYCLES": 1.2715013492684283e-02, + "CYCLES/ BYTE": 3.1787533757323376e-04, + "bytes_per_second": 2.3448246606068153e+07 }, { "name": "ascon_permutation<1>_cv", @@ -1075,12 +967,12 @@ "aggregate_name": "cv", "aggregate_unit": "percentage", "iterations": 10, - "real_time": 9.7916469444633792e-04, - "cpu_time": 9.5307263325089780e-04, + "real_time": 3.8612402546761215e-03, + "cpu_time": 3.8442855442926455e-03, "time_unit": "ns", - "CYCLES": 5.6203139042077140e-04, - "CYCLES/ BYTE": 5.6203139010398725e-04, - "bytes_per_second": 9.5280661181945984e-04 + "CYCLES": 4.1731660930490377e-04, + "CYCLES/ BYTE": 4.1731660964115487e-04, + "bytes_per_second": 3.8222006314028193e-03 }, { "name": "ascon_permutation<1>_min", @@ -1093,12 +985,12 @@ "aggregate_name": "min", "aggregate_unit": "time", "iterations": 10, - "real_time": 6.5168667675828118e+00, - "cpu_time": 6.5167756042383385e+00, + "real_time": 6.5030392151039962e+00, + "cpu_time": 6.5008198282928076e+00, "time_unit": "ns", - "CYCLES": 3.0486403011636746e+01, - "CYCLES/ BYTE": 7.6216007529091867e-01, - "bytes_per_second": 6.1181977730455770e+09 + "CYCLES": 3.0451593560702516e+01, + "CYCLES/ BYTE": 7.6128983901756286e-01, + "bytes_per_second": 6.0790168292590876e+09 }, { "name": "ascon_permutation<1>_max", @@ -1111,12 +1003,12 @@ "aggregate_name": "max", "aggregate_unit": "time", "iterations": 10, - "real_time": 6.5383947527070223e+00, - "cpu_time": 6.5378729952510835e+00, + "real_time": 6.5831842961714191e+00, + "cpu_time": 6.5800113938614002e+00, "time_unit": "ns", - "CYCLES": 3.0541753321817627e+01, - "CYCLES/ BYTE": 7.6354383304544071e-01, - "bytes_per_second": 6.1380048093086176e+09 + "CYCLES": 3.0491178911505198e+01, + "CYCLES/ BYTE": 7.6227947278762997e-01, + "bytes_per_second": 6.1530700829320593e+09 }, { "name": "ascon_permutation<8>_mean", @@ -1129,12 +1021,12 @@ "aggregate_name": "mean", "aggregate_unit": "time", "iterations": 10, - "real_time": 2.6758833293593511e+01, - "cpu_time": 2.6757173246064895e+01, + "real_time": 2.6755037910137155e+01, + "cpu_time": 2.6742528484325913e+01, "time_unit": "ns", - "CYCLES": 1.2510760025496938e+02, - "CYCLES/ BYTE": 3.1276900063742357e+00, - "bytes_per_second": 1.4949282029981132e+09 + "CYCLES": 1.2508790963075637e+02, + "CYCLES/ BYTE": 3.1271977407689096e+00, + "bytes_per_second": 1.4957478715426397e+09 }, { "name": "ascon_permutation<8>_median", @@ -1147,12 +1039,12 @@ "aggregate_name": "median", "aggregate_unit": "time", "iterations": 10, - "real_time": 2.6749190727926663e+01, - "cpu_time": 2.6746670120171910e+01, + "real_time": 2.6753586355062772e+01, + "cpu_time": 2.6742597913348494e+01, "time_unit": "ns", - "CYCLES": 1.2510736428238738e+02, - "CYCLES/ BYTE": 3.1276841070596850e+00, - "bytes_per_second": 1.4955132691146379e+09 + "CYCLES": 1.2508181435068875e+02, + "CYCLES/ BYTE": 3.1270453587672185e+00, + "bytes_per_second": 1.4957410883191552e+09 }, { "name": "ascon_permutation<8>_stddev", @@ -1165,12 +1057,12 @@ "aggregate_name": "stddev", "aggregate_unit": "time", "iterations": 10, - "real_time": 3.2349446721529188e-02, - "cpu_time": 3.2481947770551120e-02, + "real_time": 4.1126790601872368e-02, + "cpu_time": 3.9905938610004264e-02, "time_unit": "ns", - "CYCLES": 9.1269074640614976e-03, - "CYCLES/ BYTE": 2.2817267777837597e-04, - "bytes_per_second": 1.8101704818816253e+06 + "CYCLES": 2.1381783828948078e-02, + "CYCLES/ BYTE": 5.3454459328674587e-04, + "bytes_per_second": 2.2291369969046069e+06 }, { "name": "ascon_permutation<8>_cv", @@ -1183,12 +1075,12 @@ "aggregate_name": "cv", "aggregate_unit": "percentage", "iterations": 10, - "real_time": 1.2089259037042605e-03, - "cpu_time": 1.2139528892622525e-03, + "real_time": 1.5371606177500474e-03, + "cpu_time": 1.4922275817484338e-03, "time_unit": "ns", - "CYCLES": 7.2952462084324636e-05, - "CYCLES/ BYTE": 7.2952459263341254e-05, - "bytes_per_second": 1.2108745277875461e-03 + "CYCLES": 1.7093405663316615e-04, + "CYCLES/ BYTE": 1.7093405585388822e-04, + "bytes_per_second": 1.4903160080084795e-03 }, { "name": "ascon_permutation<8>_min", @@ -1201,12 +1093,12 @@ "aggregate_name": "min", "aggregate_unit": "time", "iterations": 10, - "real_time": 2.6735011487194505e+01, - "cpu_time": 2.6733163302868650e+01, + "real_time": 2.6711959301359844e+01, + "cpu_time": 2.6700358201055145e+01, "time_unit": "ns", - "CYCLES": 1.2509285612653257e+02, - "CYCLES/ BYTE": 3.1273214031633145e+00, - "bytes_per_second": 1.4900352802517030e+09 + "CYCLES": 1.2506596597328662e+02, + "CYCLES/ BYTE": 3.1266491493321658e+00, + "bytes_per_second": 1.4908313638969657e+09 }, { "name": "ascon_permutation<8>_max", @@ -1219,12 +1111,12 @@ "aggregate_name": "max", "aggregate_unit": "time", "iterations": 10, - "real_time": 2.6846482402074400e+01, - "cpu_time": 2.6845001947365326e+01, + "real_time": 2.6846201351003213e+01, + "cpu_time": 2.6830667081917177e+01, "time_unit": "ns", - "CYCLES": 1.2512129204334479e+02, - "CYCLES/ BYTE": 3.1280323010836200e+00, - "bytes_per_second": 1.4962688682527790e+09 + "CYCLES": 1.2514027393148334e+02, + "CYCLES/ BYTE": 3.1285068482870835e+00, + "bytes_per_second": 1.4981072425619845e+09 }, { "name": "ascon_permutation<12>_mean", @@ -1237,12 +1129,12 @@ "aggregate_name": "mean", "aggregate_unit": "time", "iterations": 10, - "real_time": 3.8047380970893144e+01, - "cpu_time": 3.8045856585428552e+01, + "real_time": 3.8094990076066942e+01, + "cpu_time": 3.8077429306080020e+01, "time_unit": "ns", - "CYCLES": 1.7791133078675301e+02, - "CYCLES/ BYTE": 4.4477832696688253e+00, - "bytes_per_second": 1.0513643859396050e+09 + "CYCLES": 1.7792204623092439e+02, + "CYCLES/ BYTE": 4.4480511557731104e+00, + "bytes_per_second": 1.0504974375684353e+09 }, { "name": "ascon_permutation<12>_median", @@ -1255,12 +1147,12 @@ "aggregate_name": "median", "aggregate_unit": "time", "iterations": 10, - "real_time": 3.8029492222762975e+01, - "cpu_time": 3.8025962256002657e+01, + "real_time": 3.8067123526649723e+01, + "cpu_time": 3.8051470125154246e+01, "time_unit": "ns", - "CYCLES": 1.7791241656441184e+02, - "CYCLES/ BYTE": 4.4478104141102959e+00, - "bytes_per_second": 1.0519129039346846e+09 + "CYCLES": 1.7791819123788468e+02, + "CYCLES/ BYTE": 4.4479547809471178e+00, + "bytes_per_second": 1.0512077424937840e+09 }, { "name": "ascon_permutation<12>_stddev", @@ -1273,12 +1165,12 @@ "aggregate_name": "stddev", "aggregate_unit": "time", "iterations": 10, - "real_time": 4.7578451564838788e-02, - "cpu_time": 4.8598016657493567e-02, + "real_time": 9.9692700542141827e-02, + "cpu_time": 9.8822155652454710e-02, "time_unit": "ns", - "CYCLES": 4.7908131950828619e-03, - "CYCLES/ BYTE": 1.1977030614689372e-04, - "bytes_per_second": 1.3408534833141002e+06 + "CYCLES": 2.0292904103238557e-02, + "CYCLES/ BYTE": 5.0732260351467979e-04, + "bytes_per_second": 2.7199929775334182e+06 }, { "name": "ascon_permutation<12>_cv", @@ -1291,12 +1183,12 @@ "aggregate_name": "cv", "aggregate_unit": "percentage", "iterations": 10, - "real_time": 1.2505053002527839e-03, - "cpu_time": 1.2773537257170459e-03, + "real_time": 2.6169504268954633e-03, + "cpu_time": 2.5952948361636185e-03, "time_unit": "ns", - "CYCLES": 2.6928094876796785e-05, - "CYCLES/ BYTE": 2.6928089541514828e-05, - "bytes_per_second": 1.2753461133418350e-03 + "CYCLES": 1.1405502877872969e-04, + "CYCLES/ BYTE": 1.1405502898864541e-04, + "bytes_per_second": 2.5892428484445710e-03 }, { "name": "ascon_permutation<12>_min", @@ -1309,12 +1201,12 @@ "aggregate_name": "min", "aggregate_unit": "time", "iterations": 10, - "real_time": 3.8004672447627300e+01, - "cpu_time": 3.8003230817429866e+01, + "real_time": 3.7997736559377117e+01, + "cpu_time": 3.7982652273432805e+01, "time_unit": "ns", - "CYCLES": 1.7790098061291980e+02, - "CYCLES/ BYTE": 4.4475245153229945e+00, - "bytes_per_second": 1.0482331575650944e+09 + "CYCLES": 1.7790854717235177e+02, + "CYCLES/ BYTE": 4.4477136793087944e+00, + "bytes_per_second": 1.0446825302227510e+09 }, { "name": "ascon_permutation<12>_max", @@ -1327,12 +1219,12 @@ "aggregate_name": "max", "aggregate_unit": "time", "iterations": 10, - "real_time": 3.8159280659223015e+01, - "cpu_time": 3.8159449270727762e+01, + "real_time": 3.8309490989721965e+01, + "cpu_time": 3.8289144158915967e+01, "time_unit": "ns", - "CYCLES": 1.7791748443333421e+02, - "CYCLES/ BYTE": 4.4479371108333554e+00, - "bytes_per_second": 1.0525420902281375e+09 + "CYCLES": 1.7797835097107094e+02, + "CYCLES/ BYTE": 4.4494587742767733e+00, + "bytes_per_second": 1.0531123448685083e+09 }, { "name": "ascon_permutation<16>_mean", @@ -1345,12 +1237,12 @@ "aggregate_name": "mean", "aggregate_unit": "time", "iterations": 10, - "real_time": 4.9592021838604595e+01, - "cpu_time": 4.9588024068453443e+01, + "real_time": 4.9680965287819603e+01, + "cpu_time": 4.9655320422955995e+01, "time_unit": "ns", - "CYCLES": 2.3176266979320599e+02, - "CYCLES/ BYTE": 5.7940667448301504e+00, - "bytes_per_second": 8.0665229929090488e+08 + "CYCLES": 2.3174381440784546e+02, + "CYCLES/ BYTE": 5.7935953601961376e+00, + "bytes_per_second": 8.0556704351763690e+08 }, { "name": "ascon_permutation<16>_median", @@ -1363,12 +1255,12 @@ "aggregate_name": "median", "aggregate_unit": "time", "iterations": 10, - "real_time": 4.9537877197557165e+01, - "cpu_time": 4.9533995097822341e+01, + "real_time": 4.9578437859770723e+01, + "cpu_time": 4.9548358419563343e+01, "time_unit": "ns", - "CYCLES": 2.3174680482430915e+02, - "CYCLES/ BYTE": 5.7936701206077288e+00, - "bytes_per_second": 8.0752622393845892e+08 + "CYCLES": 2.3174597407885778e+02, + "CYCLES/ BYTE": 5.7936493519714443e+00, + "bytes_per_second": 8.0729221008824384e+08 }, { "name": "ascon_permutation<16>_stddev", @@ -1381,12 +1273,12 @@ "aggregate_name": "stddev", "aggregate_unit": "time", "iterations": 10, - "real_time": 1.4305293733118732e-01, - "cpu_time": 1.4209317647538833e-01, + "real_time": 2.2108813409021702e-01, + "cpu_time": 2.1770271101904312e-01, "time_unit": "ns", - "CYCLES": 5.8169800574431732e-02, - "CYCLES/ BYTE": 1.4542450114291990e-03, - "bytes_per_second": 2.2960874867420304e+06 + "CYCLES": 7.2845997857423827e-03, + "CYCLES/ BYTE": 1.8211492354743605e-04, + "bytes_per_second": 3.5199407494407250e+06 }, { "name": "ascon_permutation<16>_cv", @@ -1399,12 +1291,12 @@ "aggregate_name": "cv", "aggregate_unit": "percentage", "iterations": 10, - "real_time": 2.8845957883457105e-03, - "cpu_time": 2.8654736530585850e-03, + "real_time": 4.4501577779210684e-03, + "cpu_time": 4.3842776396302869e-03, "time_unit": "ns", - "CYCLES": 2.5098865415355582e-04, - "CYCLES/ BYTE": 2.5098865364759092e-04, - "bytes_per_second": 2.8464401437402797e-03 + "CYCLES": 3.1433847778660582e-05, + "CYCLES/ BYTE": 3.1433835507157460e-05, + "bytes_per_second": 4.3695193066369030e-03 }, { "name": "ascon_permutation<16>_min", @@ -1417,12 +1309,12 @@ "aggregate_name": "min", "aggregate_unit": "time", "iterations": 10, - "real_time": 4.9511026006436381e+01, - "cpu_time": 4.9508334940846581e+01, + "real_time": 4.9488788076484099e+01, + "cpu_time": 4.9472350357471598e+01, "time_unit": "ns", - "CYCLES": 2.3173034660342799e+02, - "CYCLES/ BYTE": 5.7932586650856992e+00, - "bytes_per_second": 8.0026336157305121e+08 + "CYCLES": 2.3173224222192530e+02, + "CYCLES/ BYTE": 5.7933060555481326e+00, + "bytes_per_second": 7.9944509330690753e+08 }, { "name": "ascon_permutation<16>_max", @@ -1435,12 +1327,12 @@ "aggregate_name": "max", "aggregate_unit": "time", "iterations": 10, - "real_time": 4.9989530931481532e+01, - "cpu_time": 4.9983545318597763e+01, + "real_time": 5.0059843931289670e+01, + "cpu_time": 5.0034705741378502e+01, "time_unit": "ns", - "CYCLES": 2.3192581394731485e+02, - "CYCLES/ BYTE": 5.7981453486828718e+00, - "bytes_per_second": 8.0794476420571792e+08 + "CYCLES": 2.3175535287210300e+02, + "CYCLES/ BYTE": 5.7938838218025746e+00, + "bytes_per_second": 8.0853243702740252e+08 }, { "name": "ascon_xof128/32/64_mean", @@ -1453,12 +1345,12 @@ "aggregate_name": "mean", "aggregate_unit": "time", "iterations": 10, - "real_time": 4.4823400176606174e+02, - "cpu_time": 4.4819333232381058e+02, + "real_time": 4.5153918602443662e+02, + "cpu_time": 4.5132143045556751e+02, "time_unit": "ns", - "CYCLES": 2.0973247830065279e+03, - "CYCLES/ BYTE": 2.1847133156317994e+01, - "bytes_per_second": 2.1419331402211428e+08 + "CYCLES": 2.1077607486827123e+03, + "CYCLES/ BYTE": 2.1955841132111587e+01, + "bytes_per_second": 2.1271276397321510e+08 }, { "name": "ascon_xof128/32/64_median", @@ -1471,12 +1363,12 @@ "aggregate_name": "median", "aggregate_unit": "time", "iterations": 10, - "real_time": 4.4823707060580119e+02, - "cpu_time": 4.4818410293255084e+02, + "real_time": 4.5040354204933544e+02, + "cpu_time": 4.5020943911524762e+02, "time_unit": "ns", - "CYCLES": 2.0974529525288517e+03, - "CYCLES/ BYTE": 2.1848468255508873e+01, - "bytes_per_second": 2.1419769160025615e+08 + "CYCLES": 2.1075767452857499e+03, + "CYCLES/ BYTE": 2.1953924430059899e+01, + "bytes_per_second": 2.1323410304215610e+08 }, { "name": "ascon_xof128/32/64_stddev", @@ -1489,12 +1381,12 @@ "aggregate_name": "stddev", "aggregate_unit": "time", "iterations": 10, - "real_time": 1.9402200025298783e-01, - "cpu_time": 1.8784440862093718e-01, + "real_time": 2.1186054974409960e+00, + "cpu_time": 2.0840197346900089e+00, "time_unit": "ns", - "CYCLES": 6.7509460600585358e-01, - "CYCLES/ BYTE": 7.0322355011821873e-03, - "bytes_per_second": 8.9749537318522649e+04 + "CYCLES": 4.9192383219686459e-01, + "CYCLES/ BYTE": 5.1242065929163689e-03, + "bytes_per_second": 9.7510750908582157e+05 }, { "name": "ascon_xof128/32/64_cv", @@ -1507,12 +1399,12 @@ "aggregate_name": "cv", "aggregate_unit": "percentage", "iterations": 10, - "real_time": 4.3285872889725586e-04, - "cpu_time": 4.1911468795618627e-04, + "real_time": 4.6919637608735477e-03, + "cpu_time": 4.6175953412767971e-03, "time_unit": "ns", - "CYCLES": 3.2188367365692464e-04, - "CYCLES/ BYTE": 3.2188367466184128e-04, - "bytes_per_second": 4.1901185257937841e-04 + "CYCLES": 2.3338694038415049e-04, + "CYCLES/ BYTE": 2.3338694072721922e-04, + "bytes_per_second": 4.5841513732979731e-03 }, { "name": "ascon_xof128/32/64_min", @@ -1525,12 +1417,12 @@ "aggregate_name": "min", "aggregate_unit": "time", "iterations": 10, - "real_time": 4.4795646921723966e+02, - "cpu_time": 4.4792371237651651e+02, + "real_time": 4.5004868980059638e+02, + "cpu_time": 4.4989197274710278e+02, "time_unit": "ns", - "CYCLES": 2.0961521628465935e+03, - "CYCLES/ BYTE": 2.1834918362985348e+01, - "bytes_per_second": 2.1400612139502805e+08 + "CYCLES": 2.1072672920164960e+03, + "CYCLES/ BYTE": 2.1950700958505166e+01, + "bytes_per_second": 2.1031125973925245e+08 }, { "name": "ascon_xof128/32/64_max", @@ -1543,120 +1435,120 @@ "aggregate_name": "max", "aggregate_unit": "time", "iterations": 10, - "real_time": 4.4860283911794647e+02, - "cpu_time": 4.4858529921579310e+02, + "real_time": 4.5671843496850795e+02, + "cpu_time": 4.5646628772526236e+02, "time_unit": "ns", - "CYCLES": 2.0981403965487243e+03, - "CYCLES/ BYTE": 2.1855629130715879e+01, - "bytes_per_second": 2.1432221011622655e+08 + "CYCLES": 2.1086550346451527e+03, + "CYCLES/ BYTE": 2.1965156610887007e+01, + "bytes_per_second": 2.1338455855037972e+08 }, { - "name": "ascon_xof128/256/64_mean", + "name": "ascon_xof128/64/64_mean", "family_index": 6, "per_family_instance_index": 1, - "run_name": "ascon_xof128/256/64", + "run_name": "ascon_xof128/64/64", "run_type": "aggregate", "repetitions": 10, "threads": 1, "aggregate_name": "mean", "aggregate_unit": "time", "iterations": 10, - "real_time": 1.4126246415735925e+03, - "cpu_time": 1.4124297893761827e+03, + "real_time": 5.9066138755037423e+02, + "cpu_time": 5.9038843175116040e+02, "time_unit": "ns", - "CYCLES": 6.6035215375941370e+03, - "CYCLES/ BYTE": 2.0636004804981678e+01, - "bytes_per_second": 2.2656052007473800e+08 + "CYCLES": 2.7570332235361425e+03, + "CYCLES/ BYTE": 2.1539322058876113e+01, + "bytes_per_second": 2.1680927422051403e+08 }, { - "name": "ascon_xof128/256/64_median", + "name": "ascon_xof128/64/64_median", "family_index": 6, "per_family_instance_index": 1, - "run_name": "ascon_xof128/256/64", + "run_name": "ascon_xof128/64/64", "run_type": "aggregate", "repetitions": 10, "threads": 1, "aggregate_name": "median", "aggregate_unit": "time", "iterations": 10, - "real_time": 1.4118685614680767e+03, - "cpu_time": 1.4117168257420117e+03, + "real_time": 5.8986275348943491e+02, + "cpu_time": 5.8959580961756023e+02, "time_unit": "ns", - "CYCLES": 6.6034401957230875e+03, - "CYCLES/ BYTE": 2.0635750611634649e+01, - "bytes_per_second": 2.2667435527096993e+08 + "CYCLES": 2.7570580978583239e+03, + "CYCLES/ BYTE": 2.1539516389518155e+01, + "bytes_per_second": 2.1709788652537167e+08 }, { - "name": "ascon_xof128/256/64_stddev", + "name": "ascon_xof128/64/64_stddev", "family_index": 6, "per_family_instance_index": 1, - "run_name": "ascon_xof128/256/64", + "run_name": "ascon_xof128/64/64", "run_type": "aggregate", "repetitions": 10, "threads": 1, "aggregate_name": "stddev", "aggregate_unit": "time", "iterations": 10, - "real_time": 2.6054033940943229e+00, - "cpu_time": 2.3969114327289969e+00, + "real_time": 2.2477571609353442e+00, + "cpu_time": 2.2653613360233984e+00, "time_unit": "ns", - "CYCLES": 8.7832739806446991e-01, - "CYCLES/ BYTE": 2.7447731405815961e-03, - "bytes_per_second": 3.8366524902141799e+05 + "CYCLES": 3.5888884234502944e-01, + "CYCLES/ BYTE": 2.8038190808205425e-03, + "bytes_per_second": 8.2763534494633833e+05 }, { - "name": "ascon_xof128/256/64_cv", + "name": "ascon_xof128/64/64_cv", "family_index": 6, "per_family_instance_index": 1, - "run_name": "ascon_xof128/256/64", + "run_name": "ascon_xof128/64/64", "run_type": "aggregate", "repetitions": 10, "threads": 1, "aggregate_name": "cv", "aggregate_unit": "percentage", "iterations": 10, - "real_time": 1.8443706257254831e-03, - "cpu_time": 1.6970128007478674e-03, + "real_time": 3.8054919592041985e-03, + "cpu_time": 3.8370693160502387e-03, "time_unit": "ns", - "CYCLES": 1.3300893970953431e-04, - "CYCLES/ BYTE": 1.3300894075770852e-04, - "bytes_per_second": 1.6934338290486540e-03 + "CYCLES": 1.3017211373489445e-04, + "CYCLES/ BYTE": 1.3017211373489445e-04, + "bytes_per_second": 3.8173429062105559e-03 }, { - "name": "ascon_xof128/256/64_min", + "name": "ascon_xof128/64/64_min", "family_index": 6, "per_family_instance_index": 1, - "run_name": "ascon_xof128/256/64", + "run_name": "ascon_xof128/64/64", "run_type": "aggregate", "repetitions": 10, "threads": 1, "aggregate_name": "min", "aggregate_unit": "time", "iterations": 10, - "real_time": 1.4101773992171945e+03, - "cpu_time": 1.4101793725584937e+03, + "real_time": 5.8884410485384228e+02, + "cpu_time": 5.8861234440140049e+02, "time_unit": "ns", - "CYCLES": 6.6022622931013648e+03, - "CYCLES/ BYTE": 2.0632069665941767e+01, - "bytes_per_second": 2.2584578335196871e+08 + "CYCLES": 2.7563124382127876e+03, + "CYCLES/ BYTE": 2.1533690923537403e+01, + "bytes_per_second": 2.1493482659559822e+08 }, { - "name": "ascon_xof128/256/64_max", + "name": "ascon_xof128/64/64_max", "family_index": 6, "per_family_instance_index": 1, - "run_name": "ascon_xof128/256/64", + "run_name": "ascon_xof128/64/64", "run_type": "aggregate", "repetitions": 10, "threads": 1, "aggregate_name": "max", "aggregate_unit": "time", "iterations": 10, - "real_time": 1.4179529821473004e+03, - "cpu_time": 1.4168960573476677e+03, + "real_time": 5.9575394489776181e+02, + "cpu_time": 5.9552936128323722e+02, "time_unit": "ns", - "CYCLES": 6.6054059240465549e+03, - "CYCLES/ BYTE": 2.0641893512645485e+01, - "bytes_per_second": 2.2692148688816994e+08 + "CYCLES": 2.7575461589913803e+03, + "CYCLES/ BYTE": 2.1543329367120158e+01, + "bytes_per_second": 2.1746061090541995e+08 }, { "name": "ascon_xof128/2048/64_mean", @@ -1669,12 +1561,12 @@ "aggregate_name": "mean", "aggregate_unit": "time", "iterations": 10, - "real_time": 9.1555171940919336e+03, - "cpu_time": 9.1541278629689423e+03, + "real_time": 9.2465635641417211e+03, + "cpu_time": 9.2421153476898489e+03, "time_unit": "ns", - "CYCLES": 4.2702206179445355e+04, - "CYCLES/ BYTE": 2.0218847622843441e+01, - "bytes_per_second": 2.3072028888148856e+08 + "CYCLES": 4.3205698893259556e+04, + "CYCLES/ BYTE": 2.0457243794156984e+01, + "bytes_per_second": 2.2852102550151512e+08 }, { "name": "ascon_xof128/2048/64_median", @@ -1687,12 +1579,12 @@ "aggregate_name": "median", "aggregate_unit": "time", "iterations": 10, - "real_time": 9.1378399673296699e+03, - "cpu_time": 9.1356447960848636e+03, + "real_time": 9.2334110606816630e+03, + "cpu_time": 9.2303395893059151e+03, "time_unit": "ns", - "CYCLES": 4.2697108613376840e+04, - "CYCLES/ BYTE": 2.0216434002545853e+01, - "bytes_per_second": 2.3118237476809612e+08 + "CYCLES": 4.3205212347489833e+04, + "CYCLES/ BYTE": 2.0457013422106929e+01, + "bytes_per_second": 2.2881064992291844e+08 }, { "name": "ascon_xof128/2048/64_stddev", @@ -1705,12 +1597,12 @@ "aggregate_name": "stddev", "aggregate_unit": "time", "iterations": 10, - "real_time": 4.5104452996483289e+01, - "cpu_time": 4.3681857201597396e+01, + "real_time": 2.9575188635515637e+01, + "cpu_time": 2.8248974666323342e+01, "time_unit": "ns", - "CYCLES": 1.4163099204399892e+01, - "CYCLES/ BYTE": 6.7060128892170523e-03, - "bytes_per_second": 1.0944073231764406e+06 + "CYCLES": 2.7450548657460287e+00, + "CYCLES/ BYTE": 1.2997418718848795e-03, + "bytes_per_second": 6.9528874886785145e+05 }, { "name": "ascon_xof128/2048/64_cv", @@ -1723,12 +1615,12 @@ "aggregate_name": "cv", "aggregate_unit": "percentage", "iterations": 10, - "real_time": 4.9264778865348259e-03, - "cpu_time": 4.7718207409253007e-03, + "real_time": 3.1985059563326380e-03, + "cpu_time": 3.0565485934326100e-03, "time_unit": "ns", - "CYCLES": 3.3167136950449364e-04, - "CYCLES/ BYTE": 3.3167136991727147e-04, - "bytes_per_second": 4.7434377292176165e-03 + "CYCLES": 6.3534555303172740e-05, + "CYCLES/ BYTE": 6.3534554555003784e-05, + "bytes_per_second": 3.0425592014649942e-03 }, { "name": "ascon_xof128/2048/64_min", @@ -1741,12 +1633,12 @@ "aggregate_name": "min", "aggregate_unit": "time", "iterations": 10, - "real_time": 9.1224770635392269e+03, - "cpu_time": 9.1219884502445984e+03, + "real_time": 9.2282650172935191e+03, + "cpu_time": 9.2250397359824019e+03, "time_unit": "ns", - "CYCLES": 4.2694434257748777e+04, - "CYCLES/ BYTE": 2.0215167735676506e+01, - "bytes_per_second": 2.2846413659962255e+08 + "CYCLES": 4.3201347689845992e+04, + "CYCLES/ BYTE": 2.0455183565267987e+01, + "bytes_per_second": 2.2696483456266710e+08 }, { "name": "ascon_xof128/2048/64_max", @@ -1759,12 +1651,12 @@ "aggregate_name": "max", "aggregate_unit": "time", "iterations": 10, - "real_time": 9.2507321369487854e+03, - "cpu_time": 9.2443393148449595e+03, + "real_time": 9.3105877717799558e+03, + "cpu_time": 9.3054062937527742e+03, "time_unit": "ns", - "CYCLES": 4.2741110668841764e+04, - "CYCLES/ BYTE": 2.0237268309110682e+01, - "bytes_per_second": 2.3152846679425126e+08 + "CYCLES": 4.3210395959730646e+04, + "CYCLES/ BYTE": 2.0459467783963376e+01, + "bytes_per_second": 2.2894210328028324e+08 }, { "name": "ascon_xof128/16384/64_mean", @@ -1777,12 +1669,12 @@ "aggregate_name": "mean", "aggregate_unit": "time", "iterations": 10, - "real_time": 7.0853195643739979e+04, - "cpu_time": 7.0848188601823480e+04, + "real_time": 7.2751718591927376e+04, + "cpu_time": 7.2717335182331968e+04, "time_unit": "ns", - "CYCLES": 3.3118744989868288e+05, - "CYCLES/ BYTE": 2.0135423753567785e+01, - "bytes_per_second": 2.3215848867666808e+08 + "CYCLES": 3.3526393405238836e+05, + "CYCLES/ BYTE": 2.0383264473029449e+01, + "bytes_per_second": 2.2647142429673171e+08 }, { "name": "ascon_xof128/16384/64_median", @@ -1795,12 +1687,12 @@ "aggregate_name": "median", "aggregate_unit": "time", "iterations": 10, - "real_time": 7.0835832574194486e+04, - "cpu_time": 7.0830247720364147e+04, + "real_time": 7.1757477659280790e+04, + "cpu_time": 7.1722401900360244e+04, "time_unit": "ns", - "CYCLES": 3.3117932725430594e+05, - "CYCLES/ BYTE": 2.0134929915753037e+01, - "bytes_per_second": 2.3221717730219623e+08 + "CYCLES": 3.3525382408834103e+05, + "CYCLES/ BYTE": 2.0382649810818400e+01, + "bytes_per_second": 2.2932863145212913e+08 }, { "name": "ascon_xof128/16384/64_stddev", @@ -1813,12 +1705,12 @@ "aggregate_name": "stddev", "aggregate_unit": "time", "iterations": 10, - "real_time": 5.4875638906096356e+01, - "cpu_time": 5.3369256873020262e+01, + "real_time": 2.8276834859378741e+03, + "cpu_time": 2.8246872117452472e+03, "time_unit": "ns", - "CYCLES": 2.2991375471748082e+01, - "CYCLES/ BYTE": 1.3978219430610473e-03, - "bytes_per_second": 1.7470068546580526e+05 + "CYCLES": 3.7935780608618032e+01, + "CYCLES/ BYTE": 2.3064068893919793e-03, + "bytes_per_second": 8.0244218620874286e+06 }, { "name": "ascon_xof128/16384/64_cv", @@ -1831,12 +1723,12 @@ "aggregate_name": "cv", "aggregate_unit": "percentage", "iterations": 10, - "real_time": 7.7449772600263406e-04, - "cpu_time": 7.5329035118967976e-04, + "real_time": 3.8867583346019224e-02, + "cpu_time": 3.8844756957369331e-02, "time_unit": "ns", - "CYCLES": 6.9421034760772546e-05, - "CYCLES/ BYTE": 6.9421034300972583e-05, - "bytes_per_second": 7.5250612829890753e-04 + "CYCLES": 1.1315198789825745e-04, + "CYCLES/ BYTE": 1.1315198762414876e-04, + "bytes_per_second": 3.5432381312591195e-02 }, { "name": "ascon_xof128/16384/64_min", @@ -1849,12 +1741,12 @@ "aggregate_name": "min", "aggregate_unit": "time", "iterations": 10, - "real_time": 7.0808127659008867e+04, - "cpu_time": 7.0803884498479645e+04, + "real_time": 7.1629710830846132e+04, + "cpu_time": 7.1598161273755002e+04, "time_unit": "ns", - "CYCLES": 3.3117259422492399e+05, - "CYCLES/ BYTE": 2.0134520563285751e+01, - "bytes_per_second": 2.3174220211432609e+08 + "CYCLES": 3.3523697123780177e+05, + "CYCLES/ BYTE": 2.0381625196850788e+01, + "bytes_per_second": 2.0377437081173235e+08 }, { "name": "ascon_xof128/16384/64_max", @@ -1867,12 +1759,12 @@ "aggregate_name": "max", "aggregate_unit": "time", "iterations": 10, - "real_time": 7.0986820668320142e+04, - "cpu_time": 7.0975419452886941e+04, + "real_time": 8.0759748846685208e+04, + "cpu_time": 8.0716725731894636e+04, "time_unit": "ns", - "CYCLES": 3.3124955673758866e+05, - "CYCLES/ BYTE": 2.0139199704376743e+01, - "bytes_per_second": 2.3230363865633932e+08 + "CYCLES": 3.3536796302003082e+05, + "CYCLES/ BYTE": 2.0389589191392925e+01, + "bytes_per_second": 2.2972656989208424e+08 }, { "name": "ascon_xof128/32/512_mean", @@ -1885,12 +1777,12 @@ "aggregate_name": "mean", "aggregate_unit": "time", "iterations": 10, - "real_time": 2.3894631899052547e+03, - "cpu_time": 2.3892488021598811e+03, + "real_time": 2.3991379285702055e+03, + "cpu_time": 2.3982264725460491e+03, "time_unit": "ns", - "CYCLES": 1.1174410932640716e+04, - "CYCLES/ BYTE": 2.0541196567354259e+01, - "bytes_per_second": 2.2768675183900091e+08 + "CYCLES": 1.1201750198842787e+04, + "CYCLES/ BYTE": 2.0591452571402183e+01, + "bytes_per_second": 2.2683769143242231e+08 }, { "name": "ascon_xof128/32/512_median", @@ -1903,12 +1795,12 @@ "aggregate_name": "median", "aggregate_unit": "time", "iterations": 10, - "real_time": 2.3892645500770400e+03, - "cpu_time": 2.3891117955640684e+03, + "real_time": 2.3942409838713857e+03, + "cpu_time": 2.3933620816194207e+03, "time_unit": "ns", - "CYCLES": 1.1175961168449472e+04, - "CYCLES/ BYTE": 2.0544046265532117e+01, - "bytes_per_second": 2.2769968601628709e+08 + "CYCLES": 1.1200560540374474e+04, + "CYCLES/ BYTE": 2.0589265699217783e+01, + "bytes_per_second": 2.2729532056697905e+08 }, { "name": "ascon_xof128/32/512_stddev", @@ -1921,12 +1813,12 @@ "aggregate_name": "stddev", "aggregate_unit": "time", "iterations": 10, - "real_time": 1.8733328437223022e+00, - "cpu_time": 1.8679940235865875e+00, + "real_time": 9.8765358391746343e+00, + "cpu_time": 9.8151530830991565e+00, "time_unit": "ns", - "CYCLES": 5.3365006026376651e+00, - "CYCLES/ BYTE": 9.8097437575109057e-03, - "bytes_per_second": 1.7790869188684653e+05 + "CYCLES": 3.7174833510937542e+00, + "CYCLES/ BYTE": 6.8336090991485583e-03, + "bytes_per_second": 9.2335379821845342e+05 }, { "name": "ascon_xof128/32/512_cv", @@ -1939,12 +1831,12 @@ "aggregate_name": "cv", "aggregate_unit": "percentage", "iterations": 10, - "real_time": 7.8399736461166511e-04, - "cpu_time": 7.8183319455802204e-04, + "real_time": 4.1167019709703280e-03, + "cpu_time": 4.0926714784692607e-03, "time_unit": "ns", - "CYCLES": 4.7756437764872434e-04, - "CYCLES/ BYTE": 4.7756437777833003e-04, - "bytes_per_second": 7.8137480749273971e-04 + "CYCLES": 3.3186629634695782e-04, + "CYCLES/ BYTE": 3.3186629624367591e-04, + "bytes_per_second": 4.0705483836822225e-03 }, { "name": "ascon_xof128/32/512_min", @@ -1957,12 +1849,12 @@ "aggregate_name": "min", "aggregate_unit": "time", "iterations": 10, - "real_time": 2.3869285568079863e+03, - "cpu_time": 2.3868845049724864e+03, + "real_time": 2.3926816637818197e+03, + "cpu_time": 2.3916254074997241e+03, "time_unit": "ns", - "CYCLES": 1.1165544205597895e+04, - "CYCLES/ BYTE": 2.0524897436760835e+01, - "bytes_per_second": 2.2730499823316175e+08 + "CYCLES": 1.1197781204662992e+04, + "CYCLES/ BYTE": 2.0584156626218736e+01, + "bytes_per_second": 2.2510998317608520e+08 }, { "name": "ascon_xof128/32/512_max", @@ -1975,120 +1867,120 @@ "aggregate_name": "max", "aggregate_unit": "time", "iterations": 10, - "real_time": 2.3935020163132886e+03, - "cpu_time": 2.3932601756604718e+03, + "real_time": 2.4177688300838427e+03, + "cpu_time": 2.4165965112905415e+03, "time_unit": "ns", - "CYCLES": 1.1182513037831926e+04, - "CYCLES/ BYTE": 2.0556090143073394e+01, - "bytes_per_second": 2.2791215865983877e+08 + "CYCLES": 1.1209341992524194e+04, + "CYCLES/ BYTE": 2.0605408074493003e+01, + "bytes_per_second": 2.2746036996183014e+08 }, { - "name": "ascon_xof128/256/512_mean", + "name": "ascon_xof128/64/512_mean", "family_index": 6, "per_family_instance_index": 5, - "run_name": "ascon_xof128/256/512", + "run_name": "ascon_xof128/64/512", "run_type": "aggregate", "repetitions": 10, "threads": 1, "aggregate_name": "mean", "aggregate_unit": "time", "iterations": 10, - "real_time": 3.3571831157433612e+03, - "cpu_time": 3.3569937642239374e+03, + "real_time": 2.5415663308518315e+03, + "cpu_time": 2.5405335229324764e+03, "time_unit": "ns", - "CYCLES": 1.5677591878877894e+04, - "CYCLES/ BYTE": 2.0413531092288927e+01, - "bytes_per_second": 2.2878006065955079e+08 + "CYCLES": 1.1849476641386784e+04, + "CYCLES/ BYTE": 2.0572008057963163e+01, + "bytes_per_second": 2.2672754022150436e+08 }, { - "name": "ascon_xof128/256/512_median", + "name": "ascon_xof128/64/512_median", "family_index": 6, "per_family_instance_index": 5, - "run_name": "ascon_xof128/256/512", + "run_name": "ascon_xof128/64/512", "run_type": "aggregate", "repetitions": 10, "threads": 1, "aggregate_name": "median", "aggregate_unit": "time", "iterations": 10, - "real_time": 3.3502014110115351e+03, - "cpu_time": 3.3499148240423065e+03, + "real_time": 2.5357512278151362e+03, + "cpu_time": 2.5347966504153214e+03, "time_unit": "ns", - "CYCLES": 1.5677010229259995e+04, - "CYCLES/ BYTE": 2.0412773736015620e+01, - "bytes_per_second": 2.2925956197424400e+08 + "CYCLES": 1.1848994998194295e+04, + "CYCLES/ BYTE": 2.0571171871865097e+01, + "bytes_per_second": 2.2723723164832911e+08 }, { - "name": "ascon_xof128/256/512_stddev", + "name": "ascon_xof128/64/512_stddev", "family_index": 6, "per_family_instance_index": 5, - "run_name": "ascon_xof128/256/512", + "run_name": "ascon_xof128/64/512", "run_type": "aggregate", "repetitions": 10, "threads": 1, "aggregate_name": "stddev", "aggregate_unit": "time", "iterations": 10, - "real_time": 1.4696009666947145e+01, - "cpu_time": 1.4736846695257459e+01, + "real_time": 1.0693272139171805e+01, + "cpu_time": 1.0547412149666201e+01, "time_unit": "ns", - "CYCLES": 5.2693167327734880e+00, - "CYCLES/ BYTE": 6.8610894835248902e-03, - "bytes_per_second": 9.9802986436278548e+05 + "CYCLES": 2.3776108643130018e+00, + "CYCLES/ BYTE": 4.1277966622893219e-03, + "bytes_per_second": 9.3930631380586151e+05 }, { - "name": "ascon_xof128/256/512_cv", + "name": "ascon_xof128/64/512_cv", "family_index": 6, "per_family_instance_index": 5, - "run_name": "ascon_xof128/256/512", + "run_name": "ascon_xof128/64/512", "run_type": "aggregate", "repetitions": 10, "threads": 1, "aggregate_name": "cv", "aggregate_unit": "percentage", "iterations": 10, - "real_time": 4.3774822999766861e-03, - "cpu_time": 4.3898939736828164e-03, + "real_time": 4.2073551295385035e-03, + "cpu_time": 4.1516524204300116e-03, "time_unit": "ns", - "CYCLES": 3.3610498177801993e-04, - "CYCLES/ BYTE": 3.3610498117675583e-04, - "bytes_per_second": 4.3623988099555609e-03 + "CYCLES": 2.0065112884468643e-04, + "CYCLES/ BYTE": 2.0065112995576066e-04, + "bytes_per_second": 4.1428858306679205e-03 }, { - "name": "ascon_xof128/256/512_min", + "name": "ascon_xof128/64/512_min", "family_index": 6, "per_family_instance_index": 5, - "run_name": "ascon_xof128/256/512", + "run_name": "ascon_xof128/64/512", "run_type": "aggregate", "repetitions": 10, "threads": 1, "aggregate_name": "min", "aggregate_unit": "time", "iterations": 10, - "real_time": 3.3485734853475524e+03, - "cpu_time": 3.3484440984117223e+03, + "real_time": 2.5306368907286296e+03, + "cpu_time": 2.5298516070783808e+03, "time_unit": "ns", - "CYCLES": 1.5670885346046043e+04, - "CYCLES/ BYTE": 2.0404798627664118e+01, - "bytes_per_second": 2.2664764337805933e+08 + "CYCLES": 1.1847003015529071e+04, + "CYCLES/ BYTE": 2.0567713568626861e+01, + "bytes_per_second": 2.2526700850876135e+08 }, { - "name": "ascon_xof128/256/512_max", + "name": "ascon_xof128/64/512_max", "family_index": 6, "per_family_instance_index": 5, - "run_name": "ascon_xof128/256/512", + "run_name": "ascon_xof128/64/512", "run_type": "aggregate", "repetitions": 10, "threads": 1, "aggregate_name": "max", "aggregate_unit": "time", "iterations": 10, - "real_time": 3.3885018805521004e+03, - "cpu_time": 3.3885196799462792e+03, + "real_time": 2.5580358975740978e+03, + "cpu_time": 2.5569656374142223e+03, "time_unit": "ns", - "CYCLES": 1.5689511846297582e+04, - "CYCLES/ BYTE": 2.0429051883199978e+01, - "bytes_per_second": 2.2936025731004077e+08 + "CYCLES": 1.1854609443842543e+04, + "CYCLES/ BYTE": 2.0580919173337747e+01, + "bytes_per_second": 2.2768133845810753e+08 }, { "name": "ascon_xof128/2048/512_mean", @@ -2101,12 +1993,12 @@ "aggregate_name": "mean", "aggregate_unit": "time", "iterations": 10, - "real_time": 1.1067238907318726e+04, - "cpu_time": 1.1065653939681015e+04, + "real_time": 1.1188126296131402e+04, + "cpu_time": 1.1183769046099866e+04, "time_unit": "ns", - "CYCLES": 5.1789278706774043e+04, - "CYCLES/ BYTE": 2.0230186994833609e+01, - "bytes_per_second": 2.3134676514428455e+08 + "CYCLES": 5.2297527293029183e+04, + "CYCLES/ BYTE": 2.0428721598839530e+01, + "bytes_per_second": 2.2890400921494085e+08 }, { "name": "ascon_xof128/2048/512_median", @@ -2119,12 +2011,12 @@ "aggregate_name": "median", "aggregate_unit": "time", "iterations": 10, - "real_time": 1.1061055581827710e+04, - "cpu_time": 1.1059286672982704e+04, + "real_time": 1.1181387860360604e+04, + "cpu_time": 1.1176121231456362e+04, "time_unit": "ns", - "CYCLES": 5.1789369532606979e+04, - "CYCLES/ BYTE": 2.0230222473674601e+01, - "bytes_per_second": 2.3147966738432199e+08 + "CYCLES": 5.2294030906045620e+04, + "CYCLES/ BYTE": 2.0427355822674073e+01, + "bytes_per_second": 2.2905979705292803e+08 }, { "name": "ascon_xof128/2048/512_stddev", @@ -2137,12 +2029,12 @@ "aggregate_name": "stddev", "aggregate_unit": "time", "iterations": 10, - "real_time": 1.2782490150389801e+01, - "cpu_time": 1.3139337662730682e+01, + "real_time": 2.2998857456883979e+01, + "cpu_time": 2.2829101312011844e+01, "time_unit": "ns", - "CYCLES": 4.5606639773509556e+00, - "CYCLES/ BYTE": 1.7815094001873289e-03, - "bytes_per_second": 2.7425292185620678e+05 + "CYCLES": 8.7333043078554162e+00, + "CYCLES/ BYTE": 3.4114469434169655e-03, + "bytes_per_second": 4.6591615719759901e+05 }, { "name": "ascon_xof128/2048/512_cv", @@ -2155,12 +2047,12 @@ "aggregate_name": "cv", "aggregate_unit": "percentage", "iterations": 10, - "real_time": 1.1549845681868114e-03, - "cpu_time": 1.1873982083981064e-03, + "real_time": 2.0556487161604944e-03, + "cpu_time": 2.0412708111111318e-03, "time_unit": "ns", - "CYCLES": 8.8061932724975769e-05, - "CYCLES/ BYTE": 8.8061934407343407e-05, - "bytes_per_second": 1.1854625314737504e-03 + "CYCLES": 1.6699268129679798e-04, + "CYCLES/ BYTE": 1.6699267875924039e-04, + "bytes_per_second": 2.0354215673003078e-03 }, { "name": "ascon_xof128/2048/512_min", @@ -2173,12 +2065,12 @@ "aggregate_name": "min", "aggregate_unit": "time", "iterations": 10, - "real_time": 1.1058679614450832e+04, - "cpu_time": 1.1056474024948684e+04, + "real_time": 1.1168059897808496e+04, + "cpu_time": 1.1164269819747917e+04, "time_unit": "ns", - "CYCLES": 5.1782814937628296e+04, - "CYCLES/ BYTE": 2.0227662085011055e+01, - "bytes_per_second": 2.3079522123686859e+08 + "CYCLES": 5.2288894640293511e+04, + "CYCLES/ BYTE": 2.0425349468864653e+01, + "bytes_per_second": 2.2780347498866367e+08 }, { "name": "ascon_xof128/2048/512_max", @@ -2191,12 +2083,12 @@ "aggregate_name": "max", "aggregate_unit": "time", "iterations": 10, - "real_time": 1.1093079898864105e+04, - "cpu_time": 1.1092084083372913e+04, + "real_time": 1.1242198596955383e+04, + "cpu_time": 1.1237756579996836e+04, "time_unit": "ns", - "CYCLES": 5.1797216011369019e+04, - "CYCLES/ BYTE": 2.0233287504441023e+01, - "bytes_per_second": 2.3153855326964253e+08 + "CYCLES": 5.2313350534375495e+04, + "CYCLES/ BYTE": 2.0434902552490428e+01, + "bytes_per_second": 2.2930294961805242e+08 }, { "name": "ascon_xof128/16384/512_mean", @@ -2209,12 +2101,12 @@ "aggregate_name": "mean", "aggregate_unit": "time", "iterations": 10, - "real_time": 7.2988252650663868e+04, - "cpu_time": 7.2980496257796462e+04, + "real_time": 7.3708612532202867e+04, + "cpu_time": 7.3681078620326662e+04, "time_unit": "ns", - "CYCLES": 3.4028660051975056e+05, - "CYCLES/ BYTE": 2.0140068686064780e+01, - "bytes_per_second": 2.3154279340533134e+08 + "CYCLES": 3.4434666893101635e+05, + "CYCLES/ BYTE": 2.0380366295633070e+01, + "bytes_per_second": 2.2931364668425694e+08 }, { "name": "ascon_xof128/16384/512_median", @@ -2227,12 +2119,12 @@ "aggregate_name": "median", "aggregate_unit": "time", "iterations": 10, - "real_time": 7.2715676714912275e+04, - "cpu_time": 7.2701204781705368e+04, + "real_time": 7.3677658768641209e+04, + "cpu_time": 7.3653555028963208e+04, "time_unit": "ns", - "CYCLES": 3.4027956211018714e+05, - "CYCLES/ BYTE": 2.0139652113529067e+01, - "bytes_per_second": 2.3240330160305279e+08 + "CYCLES": 3.4434283201685100e+05, + "CYCLES/ BYTE": 2.0380139205542790e+01, + "bytes_per_second": 2.2939829653524640e+08 }, { "name": "ascon_xof128/16384/512_stddev", @@ -2245,12 +2137,12 @@ "aggregate_name": "stddev", "aggregate_unit": "time", "iterations": 10, - "real_time": 8.7188306667488700e+02, - "cpu_time": 8.7207738404982570e+02, + "real_time": 1.6823677837007187e+02, + "cpu_time": 1.6592668041187136e+02, "time_unit": "ns", - "CYCLES": 3.0606480126033688e+01, - "CYCLES/ BYTE": 1.8114631069698097e-03, - "bytes_per_second": 2.6857567176512638e+06 + "CYCLES": 1.6360486666138879e+01, + "CYCLES/ BYTE": 9.6830529332611311e-04, + "bytes_per_second": 5.1448636234598095e+05 }, { "name": "ascon_xof128/16384/512_cv", @@ -2263,12 +2155,12 @@ "aggregate_name": "cv", "aggregate_unit": "percentage", "iterations": 10, - "real_time": 1.1945525958100283e-02, - "cpu_time": 1.1949458126035451e-02, + "real_time": 2.2824575390911097e-03, + "cpu_time": 2.2519578095060158e-03, "time_unit": "ns", - "CYCLES": 8.9943242194331596e-05, - "CYCLES/ BYTE": 8.9943243749868071e-05, - "bytes_per_second": 1.1599396716915584e-02 + "CYCLES": 4.7511673967772311e-05, + "CYCLES/ BYTE": 4.7511672718737798e-05, + "bytes_per_second": 2.2435924323962264e-03 }, { "name": "ascon_xof128/16384/512_min", @@ -2281,12 +2173,12 @@ "aggregate_name": "min", "aggregate_unit": "time", "iterations": 10, - "real_time": 7.2681268190428003e+04, - "cpu_time": 7.2674444386694784e+04, + "real_time": 7.3545676671515845e+04, + "cpu_time": 7.3519344391784500e+04, "time_unit": "ns", - "CYCLES": 3.4025971517671517e+05, - "CYCLES/ BYTE": 2.0138477460743086e+01, - "bytes_per_second": 2.2390257093435729e+08 + "CYCLES": 3.4432784412848868e+05, + "CYCLES/ BYTE": 2.0379252138286500e+01, + "bytes_per_second": 2.2799720481309950e+08 }, { "name": "ascon_xof128/16384/512_max", @@ -2299,12 +2191,12 @@ "aggregate_name": "max", "aggregate_unit": "time", "iterations": 10, - "real_time": 7.5468610706737309e+04, - "cpu_time": 7.5461393451143042e+04, + "real_time": 7.4141631915006961e+04, + "cpu_time": 7.4106171669299540e+04, "time_unit": "ns", - "CYCLES": 3.4037035187110188e+05, - "CYCLES/ BYTE": 2.0145025560552906e+01, - "bytes_per_second": 2.3248887752203184e+08 + "CYCLES": 3.4438294628751976e+05, + "CYCLES/ BYTE": 2.0382513392964000e+01, + "bytes_per_second": 2.2981706569581515e+08 } ] } diff --git a/bench_result_on_Linux_6.6.62+rpt-rpi-v8_aarch64_with_g++_12.json b/bench_result_on_Linux_6.6.62+rpt-rpi-v8_aarch64_with_g++_12.json deleted file mode 100644 index 72e0e53..0000000 --- a/bench_result_on_Linux_6.6.62+rpt-rpi-v8_aarch64_with_g++_12.json +++ /dev/null @@ -1,2304 +0,0 @@ -{ - "context": { - "date": "2024-12-03T22:06:40+04:00", - "host_name": "rpi", - "executable": "./build/perf/perf.out", - "num_cpus": 4, - "mhz_per_cpu": 1800, - "cpu_scaling_enabled": false, - "caches": [ - { - "type": "Data", - "level": 1, - "size": 32768, - "num_sharing": 1 - }, - { - "type": "Instruction", - "level": 1, - "size": 49152, - "num_sharing": 1 - }, - { - "type": "Unified", - "level": 2, - "size": 1048576, - "num_sharing": 4 - } - ], - "load_avg": [0.78125,0.291504,0.213867], - "library_version": "v1.9.0-20-g50ffd3e5", - "library_build_type": "release", - "json_schema_version": 1 - }, - "benchmarks": [ - { - "name": "ascon_aead128_encrypt/32/32_mean", - "family_index": 0, - "per_family_instance_index": 0, - "run_name": "ascon_aead128_encrypt/32/32", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "mean", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 7.0637104269664053e+02, - "cpu_time": 7.0622414151609996e+02, - "time_unit": "ns", - "CYCLES": 1.2699847754113252e+03, - "CYCLES/ BYTE": 1.9843512115801957e+01, - "bytes_per_second": 9.0622806652100936e+07 - }, - { - "name": "ascon_aead128_encrypt/32/32_median", - "family_index": 0, - "per_family_instance_index": 0, - "run_name": "ascon_aead128_encrypt/32/32", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "median", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 7.0625941253425594e+02, - "cpu_time": 7.0626371252649619e+02, - "time_unit": "ns", - "CYCLES": 1.2701082214595740e+03, - "CYCLES/ BYTE": 1.9845440960305844e+01, - "bytes_per_second": 9.0617709602612749e+07 - }, - { - "name": "ascon_aead128_encrypt/32/32_stddev", - "family_index": 0, - "per_family_instance_index": 0, - "run_name": "ascon_aead128_encrypt/32/32", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "stddev", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 4.9352159549857816e-01, - "cpu_time": 3.4588879819236029e-01, - "time_unit": "ns", - "CYCLES": 6.3652580059767350e-01, - "CYCLES/ BYTE": 9.9457156343386484e-03, - "bytes_per_second": 4.4425522244862368e+04 - }, - { - "name": "ascon_aead128_encrypt/32/32_cv", - "family_index": 0, - "per_family_instance_index": 0, - "run_name": "ascon_aead128_encrypt/32/32", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "cv", - "aggregate_unit": "percentage", - "iterations": 10, - "real_time": 6.9867189574265561e-04, - "cpu_time": 4.8977198294271990e-04, - "time_unit": "ns", - "CYCLES": 5.0120742620045518e-04, - "CYCLES/ BYTE": 5.0120742620045518e-04, - "bytes_per_second": 4.9022452389287639e-04 - }, - { - "name": "ascon_aead128_encrypt/32/32_min", - "family_index": 0, - "per_family_instance_index": 0, - "run_name": "ascon_aead128_encrypt/32/32", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "min", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 7.0539742101524826e+02, - "cpu_time": 7.0530760068638449e+02, - "time_unit": "ns", - "CYCLES": 1.2682235086302614e+03, - "CYCLES/ BYTE": 1.9815992322347835e+01, - "bytes_per_second": 9.0580514641949669e+07 - }, - { - "name": "ascon_aead128_encrypt/32/32_max", - "family_index": 0, - "per_family_instance_index": 0, - "run_name": "ascon_aead128_encrypt/32/32", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "max", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 7.0731066418136061e+02, - "cpu_time": 7.0655372463914330e+02, - "time_unit": "ns", - "CYCLES": 1.2705273241142627e+03, - "CYCLES/ BYTE": 1.9851989439285354e+01, - "bytes_per_second": 9.0740550559383020e+07 - }, - { - "name": "ascon_aead128_encrypt/32/256_mean", - "family_index": 0, - "per_family_instance_index": 1, - "run_name": "ascon_aead128_encrypt/32/256", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "mean", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 2.0580439911405015e+03, - "cpu_time": 2.0579022893705701e+03, - "time_unit": "ns", - "CYCLES": 3.7006715090767680e+03, - "CYCLES/ BYTE": 1.2849553850961000e+01, - "bytes_per_second": 1.3994850168720564e+08 - }, - { - "name": "ascon_aead128_encrypt/32/256_median", - "family_index": 0, - "per_family_instance_index": 1, - "run_name": "ascon_aead128_encrypt/32/256", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "median", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 2.0586819315807315e+03, - "cpu_time": 2.0586936499317617e+03, - "time_unit": "ns", - "CYCLES": 3.7019762184294332e+03, - "CYCLES/ BYTE": 1.2854084091768865e+01, - "bytes_per_second": 1.3989454403319684e+08 - }, - { - "name": "ascon_aead128_encrypt/32/256_stddev", - "family_index": 0, - "per_family_instance_index": 1, - "run_name": "ascon_aead128_encrypt/32/256", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "stddev", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 2.3467710360387146e+00, - "cpu_time": 2.3632383885268955e+00, - "time_unit": "ns", - "CYCLES": 4.3084208979883947e+00, - "CYCLES/ BYTE": 1.4959794784408280e-02, - "bytes_per_second": 1.6080393085123270e+05 - }, - { - "name": "ascon_aead128_encrypt/32/256_cv", - "family_index": 0, - "per_family_instance_index": 1, - "run_name": "ascon_aead128_encrypt/32/256", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "cv", - "aggregate_unit": "percentage", - "iterations": 10, - "real_time": 1.1402919695308409e-03, - "cpu_time": 1.1483724959797366e-03, - "time_unit": "ns", - "CYCLES": 1.1642267862524351e-03, - "CYCLES/ BYTE": 1.1642267862311390e-03, - "bytes_per_second": 1.1490221682447187e-03 - }, - { - "name": "ascon_aead128_encrypt/32/256_min", - "family_index": 0, - "per_family_instance_index": 1, - "run_name": "ascon_aead128_encrypt/32/256", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "min", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 2.0542901924188873e+03, - "cpu_time": 2.0540700606096170e+03, - "time_unit": "ns", - "CYCLES": 3.6936149601561469e+03, - "CYCLES/ BYTE": 1.2825051944986621e+01, - "bytes_per_second": 1.3975836410695949e+08 - }, - { - "name": "ascon_aead128_encrypt/32/256_max", - "family_index": 0, - "per_family_instance_index": 1, - "run_name": "ascon_aead128_encrypt/32/256", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "max", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 2.0606633891504671e+03, - "cpu_time": 2.0606995641390631e+03, - "time_unit": "ns", - "CYCLES": 3.7059549757121263e+03, - "CYCLES/ BYTE": 1.2867899221222661e+01, - "bytes_per_second": 1.4020943371061349e+08 - }, - { - "name": "ascon_aead128_encrypt/32/2048_mean", - "family_index": 0, - "per_family_instance_index": 2, - "run_name": "ascon_aead128_encrypt/32/2048", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "mean", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 1.2810370002740865e+04, - "cpu_time": 1.2809583267950004e+04, - "time_unit": "ns", - "CYCLES": 2.3035551035489465e+04, - "CYCLES/ BYTE": 1.1074784151677626e+01, - "bytes_per_second": 1.6237871609222656e+08 - }, - { - "name": "ascon_aead128_encrypt/32/2048_median", - "family_index": 0, - "per_family_instance_index": 2, - "run_name": "ascon_aead128_encrypt/32/2048", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "median", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 1.2812975504078133e+04, - "cpu_time": 1.2812370951555542e+04, - "time_unit": "ns", - "CYCLES": 2.3041142277164494e+04, - "CYCLES/ BYTE": 1.1077472248636774e+01, - "bytes_per_second": 1.6234310006094584e+08 - }, - { - "name": "ascon_aead128_encrypt/32/2048_stddev", - "family_index": 0, - "per_family_instance_index": 2, - "run_name": "ascon_aead128_encrypt/32/2048", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "stddev", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 1.7117896548732070e+01, - "cpu_time": 1.7968875766004636e+01, - "time_unit": "ns", - "CYCLES": 3.3704528909727202e+01, - "CYCLES/ BYTE": 1.6204100438351399e-02, - "bytes_per_second": 2.2784640435332176e+05 - }, - { - "name": "ascon_aead128_encrypt/32/2048_cv", - "family_index": 0, - "per_family_instance_index": 2, - "run_name": "ascon_aead128_encrypt/32/2048", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "cv", - "aggregate_unit": "percentage", - "iterations": 10, - "real_time": 1.3362530937880471e-03, - "cpu_time": 1.4027681767730380e-03, - "time_unit": "ns", - "CYCLES": 1.4631527093838864e-03, - "CYCLES/ BYTE": 1.4631527094726064e-03, - "bytes_per_second": 1.4031789992963819e-03 - }, - { - "name": "ascon_aead128_encrypt/32/2048_min", - "family_index": 0, - "per_family_instance_index": 2, - "run_name": "ascon_aead128_encrypt/32/2048", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "min", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 1.2780605875380150e+04, - "cpu_time": 1.2779370860322964e+04, - "time_unit": "ns", - "CYCLES": 2.2979947632515283e+04, - "CYCLES/ BYTE": 1.1048051746401578e+01, - "bytes_per_second": 1.6206125889541402e+08 - }, - { - "name": "ascon_aead128_encrypt/32/2048_max", - "family_index": 0, - "per_family_instance_index": 2, - "run_name": "ascon_aead128_encrypt/32/2048", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "max", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 1.2834574673811416e+04, - "cpu_time": 1.2834652860140526e+04, - "time_unit": "ns", - "CYCLES": 2.3081478970896816e+04, - "CYCLES/ BYTE": 1.1096864889854238e+01, - "bytes_per_second": 1.6276231613701159e+08 - }, - { - "name": "ascon_aead128_encrypt/32/16384_mean", - "family_index": 0, - "per_family_instance_index": 3, - "run_name": "ascon_aead128_encrypt/32/16384", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "mean", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 9.9209872817497249e+04, - "cpu_time": 9.9196397161107016e+04, - "time_unit": "ns", - "CYCLES": 1.7836768772178853e+05, - "CYCLES/ BYTE": 1.0865478053227857e+01, - "bytes_per_second": 1.6549086977683321e+08 - }, - { - "name": "ascon_aead128_encrypt/32/16384_median", - "family_index": 0, - "per_family_instance_index": 3, - "run_name": "ascon_aead128_encrypt/32/16384", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "median", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 9.9150272533648880e+04, - "cpu_time": 9.9130365152590224e+04, - "time_unit": "ns", - "CYCLES": 1.7823905642299503e+05, - "CYCLES/ BYTE": 1.0857642325962173e+01, - "bytes_per_second": 1.6560012891286910e+08 - }, - { - "name": "ascon_aead128_encrypt/32/16384_stddev", - "family_index": 0, - "per_family_instance_index": 3, - "run_name": "ascon_aead128_encrypt/32/16384", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "stddev", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 2.5328220445586908e+02, - "cpu_time": 2.5581973792780741e+02, - "time_unit": "ns", - "CYCLES": 4.6186996571773187e+02, - "CYCLES/ BYTE": 2.8135353663556788e-02, - "bytes_per_second": 4.2584387226609018e+05 - }, - { - "name": "ascon_aead128_encrypt/32/16384_cv", - "family_index": 0, - "per_family_instance_index": 3, - "run_name": "ascon_aead128_encrypt/32/16384", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "cv", - "aggregate_unit": "percentage", - "iterations": 10, - "real_time": 2.5529939436753188e-03, - "cpu_time": 2.5789216670069680e-03, - "time_unit": "ns", - "CYCLES": 2.5894262106382179e-03, - "CYCLES/ BYTE": 2.5894262107683786e-03, - "bytes_per_second": 2.5732167148577244e-03 - }, - { - "name": "ascon_aead128_encrypt/32/16384_min", - "family_index": 0, - "per_family_instance_index": 3, - "run_name": "ascon_aead128_encrypt/32/16384", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "min", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 9.8881216464927973e+04, - "cpu_time": 9.8861748757984285e+04, - "time_unit": "ns", - "CYCLES": 1.7777132008516678e+05, - "CYCLES/ BYTE": 1.0829149615324487e+01, - "bytes_per_second": 1.6457037825486842e+08 - }, - { - "name": "ascon_aead128_encrypt/32/16384_max", - "family_index": 0, - "per_family_instance_index": 3, - "run_name": "ascon_aead128_encrypt/32/16384", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "max", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 9.9750096522139589e+04, - "cpu_time": 9.9750636621717626e+04, - "time_unit": "ns", - "CYCLES": 1.7937858977998581e+05, - "CYCLES/ BYTE": 1.0927058344297381e+01, - "bytes_per_second": 1.6605006694941968e+08 - }, - { - "name": "ascon_hash256/32_mean", - "family_index": 1, - "per_family_instance_index": 0, - "run_name": "ascon_hash256/32", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "mean", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 1.0089253737805745e+03, - "cpu_time": 1.0087955088741186e+03, - "time_unit": "ns", - "CYCLES": 1.8140721326720400e+03, - "CYCLES/ BYTE": 5.6689754146001249e+01, - "bytes_per_second": 3.1720998303309251e+07 - }, - { - "name": "ascon_hash256/32_median", - "family_index": 1, - "per_family_instance_index": 0, - "run_name": "ascon_hash256/32", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "median", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 1.0088571021757271e+03, - "cpu_time": 1.0087565708848203e+03, - "time_unit": "ns", - "CYCLES": 1.8140659431364352e+03, - "CYCLES/ BYTE": 5.6689560723013599e+01, - "bytes_per_second": 3.1722222118829474e+07 - }, - { - "name": "ascon_hash256/32_stddev", - "family_index": 1, - "per_family_instance_index": 0, - "run_name": "ascon_hash256/32", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "stddev", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 3.2214029542212214e-01, - "cpu_time": 1.4867454899462643e-01, - "time_unit": "ns", - "CYCLES": 2.2839615809773037e-02, - "CYCLES/ BYTE": 7.1373799405540742e-04, - "bytes_per_second": 4.6737575747591327e+03 - }, - { - "name": "ascon_hash256/32_cv", - "family_index": 1, - "per_family_instance_index": 0, - "run_name": "ascon_hash256/32", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "cv", - "aggregate_unit": "percentage", - "iterations": 10, - "real_time": 3.1929050829103498e-04, - "cpu_time": 1.4737828200737815e-04, - "time_unit": "ns", - "CYCLES": 1.2590246770469593e-05, - "CYCLES/ BYTE": 1.2590246770469593e-05, - "bytes_per_second": 1.4733954871374742e-04 - }, - { - "name": "ascon_hash256/32_min", - "family_index": 1, - "per_family_instance_index": 0, - "run_name": "ascon_hash256/32", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "min", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 1.0086574561363179e+03, - "cpu_time": 1.0086629204573267e+03, - "time_unit": "ns", - "CYCLES": 1.8140586657823787e+03, - "CYCLES/ BYTE": 5.6689333305699336e+01, - "bytes_per_second": 3.1708896838085718e+07 - }, - { - "name": "ascon_hash256/32_max", - "family_index": 1, - "per_family_instance_index": 0, - "run_name": "ascon_hash256/32", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "max", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 1.0097554679295499e+03, - "cpu_time": 1.0091804884730218e+03, - "time_unit": "ns", - "CYCLES": 1.8141359376576941e+03, - "CYCLES/ BYTE": 5.6691748051802939e+01, - "bytes_per_second": 3.1725167398332868e+07 - }, - { - "name": "ascon_hash256/64_mean", - "family_index": 1, - "per_family_instance_index": 1, - "run_name": "ascon_hash256/64", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "mean", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 1.4478787972236787e+03, - "cpu_time": 1.4475638121146915e+03, - "time_unit": "ns", - "CYCLES": 2.6031089370681448e+03, - "CYCLES/ BYTE": 4.0673577141689762e+01, - "bytes_per_second": 4.4212213619817615e+07 - }, - { - "name": "ascon_hash256/64_median", - "family_index": 1, - "per_family_instance_index": 1, - "run_name": "ascon_hash256/64", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "median", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 1.4477634831942310e+03, - "cpu_time": 1.4475540103024518e+03, - "time_unit": "ns", - "CYCLES": 2.6031009505978732e+03, - "CYCLES/ BYTE": 4.0673452353091768e+01, - "bytes_per_second": 4.4212512679605968e+07 - }, - { - "name": "ascon_hash256/64_stddev", - "family_index": 1, - "per_family_instance_index": 1, - "run_name": "ascon_hash256/64", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "stddev", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 5.9923500565105403e-01, - "cpu_time": 1.3345600075340949e-01, - "time_unit": "ns", - "CYCLES": 2.0626747647821433e-02, - "CYCLES/ BYTE": 3.2229293199720989e-04, - "bytes_per_second": 4.0756858807252374e+03 - }, - { - "name": "ascon_hash256/64_cv", - "family_index": 1, - "per_family_instance_index": 1, - "run_name": "ascon_hash256/64", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "cv", - "aggregate_unit": "percentage", - "iterations": 10, - "real_time": 4.1387097234940709e-04, - "cpu_time": 9.2193518266009037e-05, - "time_unit": "ns", - "CYCLES": 7.9238895284394549e-06, - "CYCLES/ BYTE": 7.9238895284394549e-06, - "bytes_per_second": 9.2184614771207883e-05 - }, - { - "name": "ascon_hash256/64_min", - "family_index": 1, - "per_family_instance_index": 1, - "run_name": "ascon_hash256/64", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "min", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 1.4474204145789306e+03, - "cpu_time": 1.4474278724812850e+03, - "time_unit": "ns", - "CYCLES": 2.6030900637179857e+03, - "CYCLES/ BYTE": 4.0673282245593526e+01, - "bytes_per_second": 4.4202893870772712e+07 - }, - { - "name": "ascon_hash256/64_max", - "family_index": 1, - "per_family_instance_index": 1, - "run_name": "ascon_hash256/64", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "max", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 1.4493012640159129e+03, - "cpu_time": 1.4478690057511660e+03, - "time_unit": "ns", - "CYCLES": 2.6031529231660393e+03, - "CYCLES/ BYTE": 4.0674264424469364e+01, - "bytes_per_second": 4.4216365607418209e+07 - }, - { - "name": "ascon_hash256/512_mean", - "family_index": 1, - "per_family_instance_index": 2, - "run_name": "ascon_hash256/512", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "mean", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 7.4584903351141284e+03, - "cpu_time": 7.4578834247962031e+03, - "time_unit": "ns", - "CYCLES": 1.3411539868932814e+04, - "CYCLES/ BYTE": 2.6194413806509402e+01, - "bytes_per_second": 6.8652186601396754e+07 - }, - { - "name": "ascon_hash256/512_median", - "family_index": 1, - "per_family_instance_index": 2, - "run_name": "ascon_hash256/512", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "median", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 7.4577742287677975e+03, - "cpu_time": 7.4575925462198184e+03, - "time_unit": "ns", - "CYCLES": 1.3411505194736001e+04, - "CYCLES/ BYTE": 2.6194346083468751e+01, - "bytes_per_second": 6.8654863736522973e+07 - }, - { - "name": "ascon_hash256/512_stddev", - "family_index": 1, - "per_family_instance_index": 2, - "run_name": "ascon_hash256/512", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "stddev", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 1.5198270236073292e+00, - "cpu_time": 7.3952570110044324e-01, - "time_unit": "ns", - "CYCLES": 8.1167433232971223e-02, - "CYCLES/ BYTE": 1.5853014303314692e-04, - "bytes_per_second": 6.8070249547908525e+03 - }, - { - "name": "ascon_hash256/512_cv", - "family_index": 1, - "per_family_instance_index": 2, - "run_name": "ascon_hash256/512", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "cv", - "aggregate_unit": "percentage", - "iterations": 10, - "real_time": 2.0377140082250615e-04, - "cpu_time": 9.9160265584421066e-05, - "time_unit": "ns", - "CYCLES": 6.0520591987346415e-06, - "CYCLES/ BYTE": 6.0520591987346415e-06, - "bytes_per_second": 9.9152340104085793e-05 - }, - { - "name": "ascon_hash256/512_min", - "family_index": 1, - "per_family_instance_index": 2, - "run_name": "ascon_hash256/512", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "min", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 7.4571299482742661e+03, - "cpu_time": 7.4571722521178481e+03, - "time_unit": "ns", - "CYCLES": 1.3411463903244712e+04, - "CYCLES/ BYTE": 2.6194265436024828e+01, - "bytes_per_second": 6.8639271355726853e+07 - }, - { - "name": "ascon_hash256/512_max", - "family_index": 1, - "per_family_instance_index": 2, - "run_name": "ascon_hash256/512", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "max", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 7.4612364004415795e+03, - "cpu_time": 7.4592866428685038e+03, - "time_unit": "ns", - "CYCLES": 1.3411681442804625e+04, - "CYCLES/ BYTE": 2.6194690317977784e+01, - "bytes_per_second": 6.8658733188654900e+07 - }, - { - "name": "ascon_hash256/4096_mean", - "family_index": 1, - "per_family_instance_index": 3, - "run_name": "ascon_hash256/4096", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "mean", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 5.5545760690146533e+04, - "cpu_time": 5.5541689607298700e+04, - "time_unit": "ns", - "CYCLES": 9.9880866164220555e+04, - "CYCLES/ BYTE": 2.4384977090874159e+01, - "bytes_per_second": 7.3746406373752743e+07 - }, - { - "name": "ascon_hash256/4096_median", - "family_index": 1, - "per_family_instance_index": 3, - "run_name": "ascon_hash256/4096", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "median", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 5.5546675327227313e+04, - "cpu_time": 5.5541392701308978e+04, - "time_unit": "ns", - "CYCLES": 9.9880861959539863e+04, - "CYCLES/ BYTE": 2.4384976064340787e+01, - "bytes_per_second": 7.3746800393156424e+07 - }, - { - "name": "ascon_hash256/4096_stddev", - "family_index": 1, - "per_family_instance_index": 3, - "run_name": "ascon_hash256/4096", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "stddev", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 7.1170643446143362e+00, - "cpu_time": 3.2296854788388680e+00, - "time_unit": "ns", - "CYCLES": 8.9646036881171942e-01, - "CYCLES/ BYTE": 2.1886239472942369e-04, - "bytes_per_second": 4.2882360659909773e+03 - }, - { - "name": "ascon_hash256/4096_cv", - "family_index": 1, - "per_family_instance_index": 3, - "run_name": "ascon_hash256/4096", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "cv", - "aggregate_unit": "percentage", - "iterations": 10, - "real_time": 1.2812974844859506e-04, - "cpu_time": 5.8148851820569342e-05, - "time_unit": "ns", - "CYCLES": 8.9752963028753795e-06, - "CYCLES/ BYTE": 8.9752963028753795e-06, - "bytes_per_second": 5.8148407181467945e-05 - }, - { - "name": "ascon_hash256/4096_min", - "family_index": 1, - "per_family_instance_index": 3, - "run_name": "ascon_hash256/4096", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "min", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 5.5537082109875431e+04, - "cpu_time": 5.5537374851249609e+04, - "time_unit": "ns", - "CYCLES": 9.9879690995636658e+04, - "CYCLES/ BYTE": 2.4384690184481606e+01, - "bytes_per_second": 7.3740246848057836e+07 - }, - { - "name": "ascon_hash256/4096_max", - "family_index": 1, - "per_family_instance_index": 3, - "run_name": "ascon_hash256/4096", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "max", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 5.5553969456697159e+04, - "cpu_time": 5.5546328837762492e+04, - "time_unit": "ns", - "CYCLES": 9.9882378024593418e+04, - "CYCLES/ BYTE": 2.4385346197410502e+01, - "bytes_per_second": 7.3752135583841667e+07 - }, - { - "name": "ascon_hash256/16384_mean", - "family_index": 1, - "per_family_instance_index": 4, - "run_name": "ascon_hash256/16384", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "mean", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 2.2047596903633521e+05, - "cpu_time": 2.2043833759873640e+05, - "time_unit": "ns", - "CYCLES": 3.9638964423380728e+05, - "CYCLES/ BYTE": 2.4193703871692339e+01, - "bytes_per_second": 7.4324640808308870e+07 - }, - { - "name": "ascon_hash256/16384_median", - "family_index": 1, - "per_family_instance_index": 4, - "run_name": "ascon_hash256/16384", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "median", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 2.2042934281313713e+05, - "cpu_time": 2.2042286729857829e+05, - "time_unit": "ns", - "CYCLES": 3.9638353949447081e+05, - "CYCLES/ BYTE": 2.4193331267973072e+01, - "bytes_per_second": 7.4329856067178160e+07 - }, - { - "name": "ascon_hash256/16384_stddev", - "family_index": 1, - "per_family_instance_index": 4, - "run_name": "ascon_hash256/16384", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "stddev", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 9.9573564347909354e+01, - "cpu_time": 2.9407952424352750e+01, - "time_unit": "ns", - "CYCLES": 3.0091435369866019e+01, - "CYCLES/ BYTE": 1.8366354595865490e-03, - "bytes_per_second": 9.9144312049911514e+03 - }, - { - "name": "ascon_hash256/16384_cv", - "family_index": 1, - "per_family_instance_index": 4, - "run_name": "ascon_hash256/16384", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "cv", - "aggregate_unit": "percentage", - "iterations": 10, - "real_time": 4.5163001112152624e-04, - "cpu_time": 1.3340670567877356e-04, - "time_unit": "ns", - "CYCLES": 7.5913777788091830e-05, - "CYCLES/ BYTE": 7.5913777788091830e-05, - "bytes_per_second": 1.3339359729381701e-04 - }, - { - "name": "ascon_hash256/16384_min", - "family_index": 1, - "per_family_instance_index": 4, - "run_name": "ascon_hash256/16384", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "min", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 2.2040279304782866e+05, - "cpu_time": 2.2040401263823098e+05, - "time_unit": "ns", - "CYCLES": 3.9636494154818327e+05, - "CYCLES/ BYTE": 2.4192196139415483e+01, - "bytes_per_second": 7.4307335556915224e+07 - }, - { - "name": "ascon_hash256/16384_max", - "family_index": 1, - "per_family_instance_index": 4, - "run_name": "ascon_hash256/16384", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "max", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 2.2073249604978185e+05, - "cpu_time": 2.2048967140600513e+05, - "time_unit": "ns", - "CYCLES": 3.9644536650868878e+05, - "CYCLES/ BYTE": 2.4197104889446337e+01, - "bytes_per_second": 7.4336214680866718e+07 - }, - { - "name": "ascon_permutation<1>_mean", - "family_index": 2, - "per_family_instance_index": 0, - "run_name": "ascon_permutation<1>", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "mean", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 1.2313824664003919e+01, - "cpu_time": 1.2312780664083373e+01, - "time_unit": "ns", - "CYCLES": 2.2142270956916562e+01, - "CYCLES/ BYTE": 5.5355677392291402e-01, - "bytes_per_second": 3.2487578372659464e+09 - }, - { - "name": "ascon_permutation<1>_median", - "family_index": 2, - "per_family_instance_index": 0, - "run_name": "ascon_permutation<1>", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "median", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 1.2293742189581589e+01, - "cpu_time": 1.2292224034377167e+01, - "time_unit": "ns", - "CYCLES": 2.2104349095180581e+01, - "CYCLES/ BYTE": 5.5260872737951450e-01, - "bytes_per_second": 3.2540898292400098e+09 - }, - { - "name": "ascon_permutation<1>_stddev", - "family_index": 2, - "per_family_instance_index": 0, - "run_name": "ascon_permutation<1>", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "stddev", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 7.2382207385501884e-02, - "cpu_time": 7.2637448932159038e-02, - "time_unit": "ns", - "CYCLES": 1.3109073255150164e-01, - "CYCLES/ BYTE": 3.2772683138007149e-03, - "bytes_per_second": 1.9009096614501510e+07 - }, - { - "name": "ascon_permutation<1>_cv", - "family_index": 2, - "per_family_instance_index": 0, - "run_name": "ascon_permutation<1>", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "cv", - "aggregate_unit": "percentage", - "iterations": 10, - "real_time": 5.8781255507958756e-03, - "cpu_time": 5.8993537620664286e-03, - "time_unit": "ns", - "CYCLES": 5.9203833611544228e-03, - "CYCLES/ BYTE": 5.9203833611782223e-03, - "bytes_per_second": 5.8511891518818080e-03 - }, - { - "name": "ascon_permutation<1>_min", - "family_index": 2, - "per_family_instance_index": 0, - "run_name": "ascon_permutation<1>", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "min", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 1.2248270241242098e+01, - "cpu_time": 1.2248333106050548e+01, - "time_unit": "ns", - "CYCLES": 2.2028091722747021e+01, - "CYCLES/ BYTE": 5.5070229306867557e-01, - "bytes_per_second": 3.2051146734226398e+09 - }, - { - "name": "ascon_permutation<1>_max", - "family_index": 2, - "per_family_instance_index": 0, - "run_name": "ascon_permutation<1>", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "max", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 1.2480899813327882e+01, - "cpu_time": 1.2480052689436311e+01, - "time_unit": "ns", - "CYCLES": 2.2444048241193912e+01, - "CYCLES/ BYTE": 5.6110120602984781e-01, - "bytes_per_second": 3.2657505028370285e+09 - }, - { - "name": "ascon_permutation<8>_mean", - "family_index": 3, - "per_family_instance_index": 0, - "run_name": "ascon_permutation<8>", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "mean", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 7.5095651707498391e+01, - "cpu_time": 7.5074265831780110e+01, - "time_unit": "ns", - "CYCLES": 1.3500328421447819e+02, - "CYCLES/ BYTE": 3.3750821053619555e+00, - "bytes_per_second": 5.3280574790344024e+08 - }, - { - "name": "ascon_permutation<8>_median", - "family_index": 3, - "per_family_instance_index": 0, - "run_name": "ascon_permutation<8>", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "median", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 7.5079688928763602e+01, - "cpu_time": 7.5072704844396725e+01, - "time_unit": "ns", - "CYCLES": 1.3500332685268364e+02, - "CYCLES/ BYTE": 3.3750831713170912e+00, - "bytes_per_second": 5.3281682198798603e+08 - }, - { - "name": "ascon_permutation<8>_stddev", - "family_index": 3, - "per_family_instance_index": 0, - "run_name": "ascon_permutation<8>", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "stddev", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 3.6370662410661621e-02, - "cpu_time": 7.4530928345922344e-03, - "time_unit": "ns", - "CYCLES": 6.1572306733021929e-04, - "CYCLES/ BYTE": 1.5392812543837425e-05, - "bytes_per_second": 5.2894267395317518e+04 - }, - { - "name": "ascon_permutation<8>_cv", - "family_index": 3, - "per_family_instance_index": 0, - "run_name": "ascon_permutation<8>", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "cv", - "aggregate_unit": "percentage", - "iterations": 10, - "real_time": 4.8432447929644857e-04, - "cpu_time": 9.9276266667628507e-05, - "time_unit": "ns", - "CYCLES": 4.5608006569086650e-06, - "CYCLES/ BYTE": 4.5607223952812982e-06, - "bytes_per_second": 9.9274956404756131e-05 - }, - { - "name": "ascon_permutation<8>_min", - "family_index": 3, - "per_family_instance_index": 0, - "run_name": "ascon_permutation<8>", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "min", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 7.5063544333817475e+01, - "cpu_time": 7.5063949263217580e+01, - "time_unit": "ns", - "CYCLES": 1.3500250251404512e+02, - "CYCLES/ BYTE": 3.3750625628511282e+00, - "bytes_per_second": 5.3273320197519082e+08 - }, - { - "name": "ascon_permutation<8>_max", - "family_index": 3, - "per_family_instance_index": 0, - "run_name": "ascon_permutation<8>", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "max", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 7.5179858140909360e+01, - "cpu_time": 7.5084488542658519e+01, - "time_unit": "ns", - "CYCLES": 1.3500422788645901e+02, - "CYCLES/ BYTE": 3.3751056971614752e+00, - "bytes_per_second": 5.3287897043275577e+08 - }, - { - "name": "ascon_permutation<12>_mean", - "family_index": 4, - "per_family_instance_index": 0, - "run_name": "ascon_permutation<12>", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "mean", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 1.1066918368831907e+02, - "cpu_time": 1.1065914480671054e+02, - "time_unit": "ns", - "CYCLES": 1.9900447595015987e+02, - "CYCLES/ BYTE": 4.9751118987539975e+00, - "bytes_per_second": 3.6147035467718762e+08 - }, - { - "name": "ascon_permutation<12>_median", - "family_index": 4, - "per_family_instance_index": 0, - "run_name": "ascon_permutation<12>", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "median", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 1.1065548871831149e+02, - "cpu_time": 1.1065486994732666e+02, - "time_unit": "ns", - "CYCLES": 1.9900430174529083e+02, - "CYCLES/ BYTE": 4.9751075436322711e+00, - "bytes_per_second": 3.6148431632664430e+08 - }, - { - "name": "ascon_permutation<12>_stddev", - "family_index": 4, - "per_family_instance_index": 0, - "run_name": "ascon_permutation<12>", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "stddev", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 2.7263849061487138e-02, - "cpu_time": 1.0458901275450771e-02, - "time_unit": "ns", - "CYCLES": 8.6772648760299973e-04, - "CYCLES/ BYTE": 2.1693123612841250e-05, - "bytes_per_second": 3.4160792510536477e+04 - }, - { - "name": "ascon_permutation<12>_cv", - "family_index": 4, - "per_family_instance_index": 0, - "run_name": "ascon_permutation<12>", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "cv", - "aggregate_unit": "percentage", - "iterations": 10, - "real_time": 2.4635447875237906e-04, - "cpu_time": 9.4514568079479030e-05, - "time_unit": "ns", - "CYCLES": 4.3603365374571753e-06, - "CYCLES/ BYTE": 4.3603287834137420e-06, - "bytes_per_second": 9.4505101368669349e-05 - }, - { - "name": "ascon_permutation<12>_min", - "family_index": 4, - "per_family_instance_index": 0, - "run_name": "ascon_permutation<12>", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "min", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 1.1064907484829799e+02, - "cpu_time": 1.1064964182434917e+02, - "time_unit": "ns", - "CYCLES": 1.9900380910056359e+02, - "CYCLES/ BYTE": 4.9750952275140898e+00, - "bytes_per_second": 3.6139708190123242e+08 - }, - { - "name": "ascon_permutation<12>_max", - "family_index": 4, - "per_family_instance_index": 0, - "run_name": "ascon_permutation<12>", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "max", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 1.1072927867485357e+02, - "cpu_time": 1.1068157991085207e+02, - "time_unit": "ns", - "CYCLES": 1.9900674836292495e+02, - "CYCLES/ BYTE": 4.9751687090731238e+00, - "bytes_per_second": 3.6150139612289047e+08 - }, - { - "name": "ascon_permutation<16>_mean", - "family_index": 5, - "per_family_instance_index": 0, - "run_name": "ascon_permutation<16>", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "mean", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 1.4631677887216821e+02, - "cpu_time": 1.4628137267912115e+02, - "time_unit": "ns", - "CYCLES": 2.6300851142976268e+02, - "CYCLES/ BYTE": 6.5752127857440659e+00, - "bytes_per_second": 2.7344564909545630e+08 - }, - { - "name": "ascon_permutation<16>_median", - "family_index": 5, - "per_family_instance_index": 0, - "run_name": "ascon_permutation<16>", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "median", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 1.4627294285604765e+02, - "cpu_time": 1.4626250837235281e+02, - "time_unit": "ns", - "CYCLES": 2.6300769577197525e+02, - "CYCLES/ BYTE": 6.5751923942993820e+00, - "bytes_per_second": 2.7348088352888250e+08 - }, - { - "name": "ascon_permutation<16>_stddev", - "family_index": 5, - "per_family_instance_index": 0, - "run_name": "ascon_permutation<16>", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "stddev", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 9.7258903653315326e-02, - "cpu_time": 5.3995950008832096e-02, - "time_unit": "ns", - "CYCLES": 2.7537648265868338e-03, - "CYCLES/ BYTE": 6.8844321580570014e-05, - "bytes_per_second": 1.0088856848441315e+05 - }, - { - "name": "ascon_permutation<16>_cv", - "family_index": 5, - "per_family_instance_index": 0, - "run_name": "ascon_permutation<16>", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "cv", - "aggregate_unit": "percentage", - "iterations": 10, - "real_time": 6.6471463083729425e-04, - "cpu_time": 3.6912389472360332e-04, - "time_unit": "ns", - "CYCLES": 1.0470249847112784e-05, - "CYCLES/ BYTE": 1.0470280403675093e-05, - "bytes_per_second": 3.6895291191557509e-04 - }, - { - "name": "ascon_permutation<16>_min", - "family_index": 5, - "per_family_instance_index": 0, - "run_name": "ascon_permutation<16>", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "min", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 1.4623973818684422e+02, - "cpu_time": 1.4624021675640847e+02, - "time_unit": "ns", - "CYCLES": 2.6300627155782695e+02, - "CYCLES/ BYTE": 6.5751567889456739e+00, - "bytes_per_second": 2.7325613172837299e+08 - }, - { - "name": "ascon_permutation<16>_max", - "family_index": 5, - "per_family_instance_index": 0, - "run_name": "ascon_permutation<16>", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "max", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 1.4651369721946429e+02, - "cpu_time": 1.4638280849178355e+02, - "time_unit": "ns", - "CYCLES": 2.6301443858481389e+02, - "CYCLES/ BYTE": 6.5753609646203470e+00, - "bytes_per_second": 2.7352257051579583e+08 - }, - { - "name": "ascon_xof128/32/64_mean", - "family_index": 6, - "per_family_instance_index": 0, - "run_name": "ascon_xof128/32/64", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "mean", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 1.4795721757777897e+03, - "cpu_time": 1.4792766865006035e+03, - "time_unit": "ns", - "CYCLES": 2.6601536340481298e+03, - "CYCLES/ BYTE": 2.7709933688001357e+01, - "bytes_per_second": 6.4896581715398051e+07 - }, - { - "name": "ascon_xof128/32/64_median", - "family_index": 6, - "per_family_instance_index": 0, - "run_name": "ascon_xof128/32/64", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "median", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 1.4794084010610682e+03, - "cpu_time": 1.4793116604487484e+03, - "time_unit": "ns", - "CYCLES": 2.6601511588581575e+03, - "CYCLES/ BYTE": 2.7709907904772471e+01, - "bytes_per_second": 6.4895047196002953e+07 - }, - { - "name": "ascon_xof128/32/64_stddev", - "family_index": 6, - "per_family_instance_index": 0, - "run_name": "ascon_xof128/32/64", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "stddev", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 6.3647489747382568e-01, - "cpu_time": 9.6169480573488592e-02, - "time_unit": "ns", - "CYCLES": 1.6504961019820113e-02, - "CYCLES/ BYTE": 1.7192555887248997e-04, - "bytes_per_second": 4.2190525178829348e+03 - }, - { - "name": "ascon_xof128/32/64_cv", - "family_index": 6, - "per_family_instance_index": 0, - "run_name": "ascon_xof128/32/64", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "cv", - "aggregate_unit": "percentage", - "iterations": 10, - "real_time": 4.3017495725697873e-04, - "cpu_time": 6.5011151362757145e-05, - "time_unit": "ns", - "CYCLES": 6.2045142087163717e-06, - "CYCLES/ BYTE": 6.2044738471148070e-06, - "bytes_per_second": 6.5011937552974036e-05 - }, - { - "name": "ascon_xof128/32/64_min", - "family_index": 6, - "per_family_instance_index": 0, - "run_name": "ascon_xof128/32/64", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "min", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 1.4791415466127019e+03, - "cpu_time": 1.4791516608714935e+03, - "time_unit": "ns", - "CYCLES": 2.6601356175820924e+03, - "CYCLES/ BYTE": 2.7709746016480128e+01, - "bytes_per_second": 6.4891419925875761e+07 - }, - { - "name": "ascon_xof128/32/64_max", - "family_index": 6, - "per_family_instance_index": 0, - "run_name": "ascon_xof128/32/64", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "max", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 1.4812591868584657e+03, - "cpu_time": 1.4793943499719837e+03, - "time_unit": "ns", - "CYCLES": 2.6601837051754933e+03, - "CYCLES/ BYTE": 2.7710246928911388e+01, - "bytes_per_second": 6.4902066866786510e+07 - }, - { - "name": "ascon_xof128/256/64_mean", - "family_index": 6, - "per_family_instance_index": 1, - "run_name": "ascon_xof128/256/64", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "mean", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 4.4163521984748440e+03, - "cpu_time": 4.4159946750418076e+03, - "time_unit": "ns", - "CYCLES": 7.9414526624790888e+03, - "CYCLES/ BYTE": 2.4817039570247154e+01, - "bytes_per_second": 7.2463855868015870e+07 - }, - { - "name": "ascon_xof128/256/64_median", - "family_index": 6, - "per_family_instance_index": 1, - "run_name": "ascon_xof128/256/64", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "median", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 4.4158122691896988e+03, - "cpu_time": 4.4158392411855548e+03, - "time_unit": "ns", - "CYCLES": 7.9414511063413402e+03, - "CYCLES/ BYTE": 2.4817034707316687e+01, - "bytes_per_second": 7.2466406165174589e+07 - }, - { - "name": "ascon_xof128/256/64_stddev", - "family_index": 6, - "per_family_instance_index": 1, - "run_name": "ascon_xof128/256/64", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "stddev", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 8.9310553725978692e-01, - "cpu_time": 3.3386959981140846e-01, - "time_unit": "ns", - "CYCLES": 1.4030379204876636e-02, - "CYCLES/ BYTE": 4.3844681483594608e-05, - "bytes_per_second": 5.4783695761390782e+03 - }, - { - "name": "ascon_xof128/256/64_cv", - "family_index": 6, - "per_family_instance_index": 1, - "run_name": "ascon_xof128/256/64", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "cv", - "aggregate_unit": "percentage", - "iterations": 10, - "real_time": 2.0222697310423173e-04, - "cpu_time": 7.5604620109340968e-05, - "time_unit": "ns", - "CYCLES": 1.7667270461946899e-06, - "CYCLES/ BYTE": 1.7667168301637179e-06, - "bytes_per_second": 7.5601408599029892e-05 - }, - { - "name": "ascon_xof128/256/64_min", - "family_index": 6, - "per_family_instance_index": 1, - "run_name": "ascon_xof128/256/64", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "min", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 4.4156150058146713e+03, - "cpu_time": 4.4156393421924677e+03, - "time_unit": "ns", - "CYCLES": 7.9414334143492943e+03, - "CYCLES/ BYTE": 2.4816979419841545e+01, - "bytes_per_second": 7.2454369467485577e+07 - }, - { - "name": "ascon_xof128/256/64_max", - "family_index": 6, - "per_family_instance_index": 1, - "run_name": "ascon_xof128/256/64", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "max", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 4.4181454183891155e+03, - "cpu_time": 4.4165728354533858e+03, - "time_unit": "ns", - "CYCLES": 7.9414748587481454e+03, - "CYCLES/ BYTE": 2.4817108933587956e+01, - "bytes_per_second": 7.2469686765928790e+07 - }, - { - "name": "ascon_xof128/2048/64_mean", - "family_index": 6, - "per_family_instance_index": 2, - "run_name": "ascon_xof128/2048/64", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "mean", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 2.7836468860575340e+04, - "cpu_time": 2.7835210419566381e+04, - "time_unit": "ns", - "CYCLES": 5.0057018114933395e+04, - "CYCLES/ BYTE": 2.3701239637752554e+01, - "bytes_per_second": 7.5875122784975871e+07 - }, - { - "name": "ascon_xof128/2048/64_median", - "family_index": 6, - "per_family_instance_index": 2, - "run_name": "ascon_xof128/2048/64", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "median", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 2.7834426227781001e+04, - "cpu_time": 2.7834609166832506e+04, - "time_unit": "ns", - "CYCLES": 5.0056979319944323e+04, - "CYCLES/ BYTE": 2.3701221268913031e+01, - "bytes_per_second": 7.5876761456979677e+07 - }, - { - "name": "ascon_xof128/2048/64_stddev", - "family_index": 6, - "per_family_instance_index": 2, - "run_name": "ascon_xof128/2048/64", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "stddev", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 4.2530836138434740e+00, - "cpu_time": 1.8427388264521116e+00, - "time_unit": "ns", - "CYCLES": 2.2785050610169136e-01, - "CYCLES/ BYTE": 1.0788450176182570e-04, - "bytes_per_second": 5.0228608182521730e+03 - }, - { - "name": "ascon_xof128/2048/64_cv", - "family_index": 6, - "per_family_instance_index": 2, - "run_name": "ascon_xof128/2048/64", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "cv", - "aggregate_unit": "percentage", - "iterations": 10, - "real_time": 1.5278818714923632e-04, - "cpu_time": 6.6201720722642129e-05, - "time_unit": "ns", - "CYCLES": 4.5518193988010895e-06, - "CYCLES/ BYTE": 4.5518505956111140e-06, - "bytes_per_second": 6.6199046985222876e-05 - }, - { - "name": "ascon_xof128/2048/64_min", - "family_index": 6, - "per_family_instance_index": 2, - "run_name": "ascon_xof128/2048/64", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "min", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 2.7833128255863565e+04, - "cpu_time": 2.7833259494929487e+04, - "time_unit": "ns", - "CYCLES": 5.0056775700934581e+04, - "CYCLES/ BYTE": 2.3701124858397055e+01, - "bytes_per_second": 7.5867331714031130e+07 - }, - { - "name": "ascon_xof128/2048/64_max", - "family_index": 6, - "per_family_instance_index": 2, - "run_name": "ascon_xof128/2048/64", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "max", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 2.7845291111349732e+04, - "cpu_time": 2.7838068800954032e+04, - "time_unit": "ns", - "CYCLES": 5.0057462318552396e+04, - "CYCLES/ BYTE": 2.3701449961435795e+01, - "bytes_per_second": 7.5880440822417974e+07 - }, - { - "name": "ascon_xof128/16384/64_mean", - "family_index": 6, - "per_family_instance_index": 3, - "run_name": "ascon_xof128/16384/64", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "mean", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 2.1532163646182968e+05, - "cpu_time": 2.1526065153846098e+05, - "time_unit": "ns", - "CYCLES": 3.8707212630769232e+05, - "CYCLES/ BYTE": 2.3533081609173902e+01, - "bytes_per_second": 7.6409696015417457e+07 - }, - { - "name": "ascon_xof128/16384/64_median", - "family_index": 6, - "per_family_instance_index": 3, - "run_name": "ascon_xof128/16384/64", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "median", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 2.1526835692454301e+05, - "cpu_time": 2.1525051307692094e+05, - "time_unit": "ns", - "CYCLES": 3.8702340999999997e+05, - "CYCLES/ BYTE": 2.3530119771400777e+01, - "bytes_per_second": 7.6413291084553495e+07 - }, - { - "name": "ascon_xof128/16384/64_stddev", - "family_index": 6, - "per_family_instance_index": 3, - "run_name": "ascon_xof128/16384/64", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "stddev", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 1.3363627949704585e+02, - "cpu_time": 5.4479897866300107e+01, - "time_unit": "ns", - "CYCLES": 7.7080523349448157e+01, - "CYCLES/ BYTE": 4.6863158605619402e-03, - "bytes_per_second": 1.9337091954298568e+04 - }, - { - "name": "ascon_xof128/16384/64_cv", - "family_index": 6, - "per_family_instance_index": 3, - "run_name": "ascon_xof128/16384/64", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "cv", - "aggregate_unit": "percentage", - "iterations": 10, - "real_time": 6.2063562999501777e-04, - "cpu_time": 2.5308804687217118e-04, - "time_unit": "ns", - "CYCLES": 1.9913736513327523e-04, - "CYCLES/ BYTE": 1.9913736493970571e-04, - "bytes_per_second": 2.5307118026482992e-04 - }, - { - "name": "ascon_xof128/16384/64_min", - "family_index": 6, - "per_family_instance_index": 3, - "run_name": "ascon_xof128/16384/64", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "min", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 2.1519334461537743e+05, - "cpu_time": 2.1519432923076703e+05, - "time_unit": "ns", - "CYCLES": 3.8700049076923076e+05, - "CYCLES/ BYTE": 2.3528726335677941e+01, - "bytes_per_second": 7.6381041778484002e+07 - }, - { - "name": "ascon_xof128/16384/64_max", - "family_index": 6, - "per_family_instance_index": 3, - "run_name": "ascon_xof128/16384/64", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "max", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 2.1560174615352968e+05, - "cpu_time": 2.1534139384615314e+05, - "time_unit": "ns", - "CYCLES": 3.8716975384615385e+05, - "CYCLES/ BYTE": 2.3539017135588146e+01, - "bytes_per_second": 7.6433240870217025e+07 - }, - { - "name": "ascon_xof128/32/512_mean", - "family_index": 6, - "per_family_instance_index": 4, - "run_name": "ascon_xof128/32/512", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "mean", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 7.9886249843015639e+03, - "cpu_time": 7.9880439093969662e+03, - "time_unit": "ns", - "CYCLES": 1.4364764089690190e+04, - "CYCLES/ BYTE": 2.6405816341342263e+01, - "bytes_per_second": 6.8101779102873981e+07 - }, - { - "name": "ascon_xof128/32/512_median", - "family_index": 6, - "per_family_instance_index": 4, - "run_name": "ascon_xof128/32/512", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "median", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 7.9883590460270134e+03, - "cpu_time": 7.9879624579219671e+03, - "time_unit": "ns", - "CYCLES": 1.4364748644947795e+04, - "CYCLES/ BYTE": 2.6405787950271680e+01, - "bytes_per_second": 6.8102473301715612e+07 - }, - { - "name": "ascon_xof128/32/512_stddev", - "family_index": 6, - "per_family_instance_index": 4, - "run_name": "ascon_xof128/32/512", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "stddev", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 1.1582054095823113e+00, - "cpu_time": 4.8189965885750163e-01, - "time_unit": "ns", - "CYCLES": 4.8574845059913233e-02, - "CYCLES/ BYTE": 8.9290677816730661e-05, - "bytes_per_second": 4.1083008189994671e+03 - }, - { - "name": "ascon_xof128/32/512_cv", - "family_index": 6, - "per_family_instance_index": 4, - "run_name": "ascon_xof128/32/512", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "cv", - "aggregate_unit": "percentage", - "iterations": 10, - "real_time": 1.4498182251117047e-04, - "cpu_time": 6.0327617665021242e-05, - "time_unit": "ns", - "CYCLES": 3.3815275180729306e-06, - "CYCLES/ BYTE": 3.3814776510784379e-06, - "bytes_per_second": 6.0325895639135979e-05 - }, - { - "name": "ascon_xof128/32/512_min", - "family_index": 6, - "per_family_instance_index": 4, - "run_name": "ascon_xof128/32/512", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "min", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 7.9873246420068226e+03, - "cpu_time": 7.9873791863981169e+03, - "time_unit": "ns", - "CYCLES": 1.4364717806812347e+04, - "CYCLES/ BYTE": 2.6405731262522696e+01, - "bytes_per_second": 6.8095204395961598e+07 - }, - { - "name": "ascon_xof128/32/512_max", - "family_index": 6, - "per_family_instance_index": 4, - "run_name": "ascon_xof128/32/512", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "max", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 7.9903961316581072e+03, - "cpu_time": 7.9888151423518166e+03, - "time_unit": "ns", - "CYCLES": 1.4364852855594227e+04, - "CYCLES/ BYTE": 2.6405979513959974e+01, - "bytes_per_second": 6.8107446423276052e+07 - }, - { - "name": "ascon_xof128/256/512_mean", - "family_index": 6, - "per_family_instance_index": 5, - "run_name": "ascon_xof128/256/512", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "mean", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 1.0928343226148294e+04, - "cpu_time": 1.0925402309973446e+04, - "time_unit": "ns", - "CYCLES": 1.9646414148587482e+04, - "CYCLES/ BYTE": 2.5581268422639951e+01, - "bytes_per_second": 7.0294895027243003e+07 - }, - { - "name": "ascon_xof128/256/512_median", - "family_index": 6, - "per_family_instance_index": 5, - "run_name": "ascon_xof128/256/512", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "median", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 1.0926802988878871e+04, - "cpu_time": 1.0925297213984752e+04, - "time_unit": "ns", - "CYCLES": 1.9646374590291867e+04, - "CYCLES/ BYTE": 2.5581216914442535e+01, - "bytes_per_second": 7.0295570457031995e+07 - }, - { - "name": "ascon_xof128/256/512_stddev", - "family_index": 6, - "per_family_instance_index": 5, - "run_name": "ascon_xof128/256/512", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "stddev", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 6.5217211071802570e+00, - "cpu_time": 1.2123068646819271e+00, - "time_unit": "ns", - "CYCLES": 1.2257711620234932e-01, - "CYCLES/ BYTE": 1.5960442409274970e-04, - "bytes_per_second": 7.7996218194859557e+03 - }, - { - "name": "ascon_xof128/256/512_cv", - "family_index": 6, - "per_family_instance_index": 5, - "run_name": "ascon_xof128/256/512", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "cv", - "aggregate_unit": "percentage", - "iterations": 10, - "real_time": 5.9677125546127665e-04, - "cpu_time": 1.1096221725173921e-04, - "time_unit": "ns", - "CYCLES": 6.2391597405657989e-06, - "CYCLES/ BYTE": 6.2391129890766672e-06, - "bytes_per_second": 1.1095573606679672e-04 - }, - { - "name": "ascon_xof128/256/512_min", - "family_index": 6, - "per_family_instance_index": 5, - "run_name": "ascon_xof128/256/512", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "min", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 1.0923875760804593e+04, - "cpu_time": 1.0923935929452276e+04, - "time_unit": "ns", - "CYCLES": 1.9646311222100827e+04, - "CYCLES/ BYTE": 2.5581134403777117e+01, - "bytes_per_second": 7.0281076400086418e+07 - }, - { - "name": "ascon_xof128/256/512_max", - "family_index": 6, - "per_family_instance_index": 5, - "run_name": "ascon_xof128/256/512", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "max", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 1.0945507023519973e+04, - "cpu_time": 1.0927550335570213e+04, - "time_unit": "ns", - "CYCLES": 1.9646694943031060e+04, - "CYCLES/ BYTE": 2.5581634040405024e+01, - "bytes_per_second": 7.0304330321947172e+07 - }, - { - "name": "ascon_xof128/2048/512_mean", - "family_index": 6, - "per_family_instance_index": 6, - "run_name": "ascon_xof128/2048/512", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "mean", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 3.4347850539829386e+04, - "cpu_time": 3.4345169847890014e+04, - "time_unit": "ns", - "CYCLES": 6.1762343547595679e+04, - "CYCLES/ BYTE": 2.4125915448279564e+01, - "bytes_per_second": 7.4537410335558087e+07 - }, - { - "name": "ascon_xof128/2048/512_median", - "family_index": 6, - "per_family_instance_index": 6, - "run_name": "ascon_xof128/2048/512", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "median", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 3.4347076423056955e+04, - "cpu_time": 3.4344839180568859e+04, - "time_unit": "ns", - "CYCLES": 6.1762231844946029e+04, - "CYCLES/ BYTE": 2.4125871814432038e+01, - "bytes_per_second": 7.4538127457561821e+07 - }, - { - "name": "ascon_xof128/2048/512_stddev", - "family_index": 6, - "per_family_instance_index": 6, - "run_name": "ascon_xof128/2048/512", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "stddev", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 6.5122118528857076e+00, - "cpu_time": 3.0355123140047082e+00, - "time_unit": "ns", - "CYCLES": 4.0604574437057350e-01, - "CYCLES/ BYTE": 1.5861153606886136e-04, - "bytes_per_second": 6.5874343773590199e+03 - }, - { - "name": "ascon_xof128/2048/512_cv", - "family_index": 6, - "per_family_instance_index": 6, - "run_name": "ascon_xof128/2048/512", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "cv", - "aggregate_unit": "percentage", - "iterations": 10, - "real_time": 1.8959590630960210e-04, - "cpu_time": 8.8382509897274369e-05, - "time_unit": "ns", - "CYCLES": 6.5743254068340851e-06, - "CYCLES/ BYTE": 6.5743219737666807e-06, - "bytes_per_second": 8.8377558969425092e-05 - }, - { - "name": "ascon_xof128/2048/512_min", - "family_index": 6, - "per_family_instance_index": 6, - "run_name": "ascon_xof128/2048/512", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "min", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 3.4341526742170267e+04, - "cpu_time": 3.4341720068694834e+04, - "time_unit": "ns", - "CYCLES": 6.1761824092247298e+04, - "CYCLES/ BYTE": 2.4125712536034101e+01, - "bytes_per_second": 7.4524971478444934e+07 - }, - { - "name": "ascon_xof128/2048/512_max", - "family_index": 6, - "per_family_instance_index": 6, - "run_name": "ascon_xof128/2048/512", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "max", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 3.4361544406383437e+04, - "cpu_time": 3.4350902109911389e+04, - "time_unit": "ns", - "CYCLES": 6.1763293424926400e+04, - "CYCLES/ BYTE": 2.4126286494111874e+01, - "bytes_per_second": 7.4544897427360982e+07 - }, - { - "name": "ascon_xof128/16384/512_mean", - "family_index": 6, - "per_family_instance_index": 7, - "run_name": "ascon_xof128/16384/512", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "mean", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 2.2195349477063431e+05, - "cpu_time": 2.2193578874801993e+05, - "time_unit": "ns", - "CYCLES": 3.9908467226624402e+05, - "CYCLES/ BYTE": 2.3620068197576000e+01, - "bytes_per_second": 7.6130133433235526e+07 - }, - { - "name": "ascon_xof128/16384/512_median", - "family_index": 6, - "per_family_instance_index": 7, - "run_name": "ascon_xof128/16384/512", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "median", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 2.2195428684596665e+05, - "cpu_time": 2.2192558716323212e+05, - "time_unit": "ns", - "CYCLES": 3.9903852060221869e+05, - "CYCLES/ BYTE": 2.3617336683369953e+01, - "bytes_per_second": 7.6133627714775190e+07 - }, - { - "name": "ascon_xof128/16384/512_stddev", - "family_index": 6, - "per_family_instance_index": 7, - "run_name": "ascon_xof128/16384/512", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "stddev", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 7.4105431702526786e+01, - "cpu_time": 6.2633164792196510e+01, - "time_unit": "ns", - "CYCLES": 1.0500209595374898e+02, - "CYCLES/ BYTE": 6.2146126833416580e-03, - "bytes_per_second": 2.1483065638925193e+04 - }, - { - "name": "ascon_xof128/16384/512_cv", - "family_index": 6, - "per_family_instance_index": 7, - "run_name": "ascon_xof128/16384/512", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "cv", - "aggregate_unit": "percentage", - "iterations": 10, - "real_time": 3.3387819272279087e-04, - "cpu_time": 2.8221300019037735e-04, - "time_unit": "ns", - "CYCLES": 2.6310731343672910e-04, - "CYCLES/ BYTE": 2.6310731329638710e-04, - "bytes_per_second": 2.8218872961473755e-04 - }, - { - "name": "ascon_xof128/16384/512_min", - "family_index": 6, - "per_family_instance_index": 7, - "run_name": "ascon_xof128/16384/512", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "min", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 2.2186468938218354e+05, - "cpu_time": 2.2186596830428010e+05, - "time_unit": "ns", - "CYCLES": 3.9897881774960383e+05, - "CYCLES/ BYTE": 2.3613803133854393e+01, - "bytes_per_second": 7.6096650315183416e+07 - }, - { - "name": "ascon_xof128/16384/512_max", - "family_index": 6, - "per_family_instance_index": 7, - "run_name": "ascon_xof128/16384/512", - "run_type": "aggregate", - "repetitions": 10, - "threads": 1, - "aggregate_name": "max", - "aggregate_unit": "time", - "iterations": 10, - "real_time": 2.2208300633821363e+05, - "cpu_time": 2.2203342630744912e+05, - "time_unit": "ns", - "CYCLES": 3.9923138668779714e+05, - "CYCLES/ BYTE": 2.3628751579533450e+01, - "bytes_per_second": 7.6154085861549646e+07 - } - ] -} diff --git a/benches/bench_ascon_aead128.cpp b/benches/bench_ascon_aead128.cpp index 1e58a3e..5267977 100644 --- a/benches/bench_ascon_aead128.cpp +++ b/benches/bench_ascon_aead128.cpp @@ -47,8 +47,8 @@ ascon_aead128_encrypt(benchmark::State& state) BENCHMARK(ascon_aead128_encrypt) ->ArgsProduct({ - { 32 }, // Associated data - { 32, 256, 2'048, 16'384 }, // Plain text + { 32 }, // Associated data + { 32, 256, 2 * 1'024, 16 * 1'024 }, // Plain text }) ->ComputeStatistics("min", compute_min) ->ComputeStatistics("max", compute_max); diff --git a/benches/bench_ascon_hash256.cpp b/benches/bench_ascon_hash256.cpp index b3ba202..237ed2d 100644 --- a/benches/bench_ascon_hash256.cpp +++ b/benches/bench_ascon_hash256.cpp @@ -13,23 +13,18 @@ bench_ascon_hash256(benchmark::State& state) generate_random_data(msg); - bool ret_val = true; for (auto _ : state) { - ascon_hash256::ascon_hash256_t hasher; - - benchmark::DoNotOptimize(ret_val); benchmark::DoNotOptimize(msg); benchmark::DoNotOptimize(digest); - ret_val &= hasher.absorb(msg); - ret_val &= hasher.finalize(); - ret_val &= hasher.digest(digest); + ascon_hash256::ascon_hash256_t hasher; + assert(hasher.absorb(msg) == ascon_hash256::ascon_hash256_status_t::absorbed_data); + assert(hasher.finalize() == ascon_hash256::ascon_hash256_status_t::finalized_data_absorption_phase); + assert(hasher.digest(digest) == ascon_hash256::ascon_hash256_status_t::message_digest_produced); benchmark::ClobberMemory(); } - assert(ret_val); - const size_t total_bytes_processed = msg.size() * state.iterations(); state.SetBytesProcessed(total_bytes_processed); @@ -40,7 +35,11 @@ bench_ascon_hash256(benchmark::State& state) BENCHMARK(bench_ascon_hash256) ->Name("ascon_hash256") - ->RangeMultiplier(8) - ->Range(32, 16 * 1'024) + ->ArgsProduct({ { + 32, + 64, + 2 * 1'024, + 16 * 1'024, + } }) ->ComputeStatistics("min", compute_min) ->ComputeStatistics("max", compute_max); diff --git a/benches/bench_ascon_xof128.cpp b/benches/bench_ascon_xof128.cpp index 83e963e..eeebbf5 100644 --- a/benches/bench_ascon_xof128.cpp +++ b/benches/bench_ascon_xof128.cpp @@ -14,23 +14,18 @@ bench_ascon_xof128(benchmark::State& state) generate_random_data(msg); - bool ret_val = true; for (auto _ : state) { - ascon_xof128::ascon_xof128_t hasher; - - benchmark::DoNotOptimize(ret_val); benchmark::DoNotOptimize(msg); benchmark::DoNotOptimize(output); - ret_val &= hasher.absorb(msg); - ret_val &= hasher.finalize(); - ret_val &= hasher.squeeze(output); + ascon_xof128::ascon_xof128_t hasher; + assert(hasher.absorb(msg) == ascon_xof128::ascon_xof128_status_t::absorbed_data); + assert(hasher.finalize() == ascon_xof128::ascon_xof128_status_t::finalized_data_absorption_phase); + assert(hasher.squeeze(output) == ascon_xof128::ascon_xof128_status_t::squeezed_output); benchmark::ClobberMemory(); } - assert(ret_val); - const size_t total_bytes_processed = (msg_byte_len + out_byte_len) * state.iterations(); state.SetBytesProcessed(total_bytes_processed); @@ -42,8 +37,8 @@ bench_ascon_xof128(benchmark::State& state) BENCHMARK(bench_ascon_xof128) ->Name("ascon_xof128") ->ArgsProduct({ - { 32, 256, 2'048, 16'384 }, // Input, to be absorbed - { 64, 512 } // Output, to be squeezed + { 32, 64, 2 * 1'024, 16 * 1'024 }, // Input, to be absorbed + { 64, 512 } // Output, to be squeezed }) ->ComputeStatistics("min", compute_min) ->ComputeStatistics("max", compute_max); diff --git a/examples/ascon_hash256.cpp b/examples/ascon_hash256.cpp index 74357a4..b7549be 100644 --- a/examples/ascon_hash256.cpp +++ b/examples/ascon_hash256.cpp @@ -16,9 +16,9 @@ main() generate_random_data(msg); ascon_hash256::ascon_hash256_t hasher; - assert(hasher.absorb(msg)); - assert(hasher.finalize()); - assert(hasher.digest(digest)); + assert(hasher.absorb(msg) == ascon_hash256::ascon_hash256_status_t::absorbed_data); + assert(hasher.finalize() == ascon_hash256::ascon_hash256_status_t::finalized_data_absorption_phase); + assert(hasher.digest(digest) == ascon_hash256::ascon_hash256_status_t::message_digest_produced); std::cout << "Ascon-Hash256\n\n"; std::cout << "Message :\t" << bytes_to_hex_string(msg) << "\n"; diff --git a/examples/ascon_xof128.cpp b/examples/ascon_xof128.cpp index 95733f1..428a9bd 100644 --- a/examples/ascon_xof128.cpp +++ b/examples/ascon_xof128.cpp @@ -16,9 +16,9 @@ main() generate_random_data(msg); ascon_xof128::ascon_xof128_t hasher; - assert(hasher.absorb(msg)); - assert(hasher.finalize()); - assert(hasher.squeeze(out)); + assert(hasher.absorb(msg) == ascon_xof128::ascon_xof128_status_t::absorbed_data); + assert(hasher.finalize() == ascon_xof128::ascon_xof128_status_t::finalized_data_absorption_phase); + assert(hasher.squeeze(out) == ascon_xof128::ascon_xof128_status_t::squeezed_output); std::cout << "Ascon-XOF128\n\n"; std::cout << "Message :\t" << bytes_to_hex_string(msg) << "\n"; diff --git a/include/ascon/aead/ascon_aead128.hpp b/include/ascon/aead/ascon_aead128.hpp index 8272270..6d2ed76 100644 --- a/include/ascon/aead/ascon_aead128.hpp +++ b/include/ascon/aead/ascon_aead128.hpp @@ -23,91 +23,37 @@ static constexpr size_t TAG_BYTE_LEN = ascon_duplex_mode::TAG_BYTE_LEN; */ enum class ascon_aead128_status_t : uint8_t { - /** - * @brief Indicates that data has been successfully absorbed into the Ascon state. - * - * This status is returned by `absorb_data` when associated data is successfully absorbed. - */ + /// @brief Indicates that data has been successfully absorbed into the Ascon state. absorbed_data = 0x01, - /** - * @brief Indicates that the process is still in the data absorption phase. - * - * This status is returned by `encrypt_plaintext` or `decrypt_ciphertext` if data absorption - * phase has not yet been finalized. - */ + /// @brief Indicates that the process is still in the data absorption phase. still_in_data_absorption_phase, - /** - * @brief Indicates that the data absorption phase has been successfully finalized. - * - * This status is returned by `finalize_data` after associated data absorption is complete. - */ + /// @brief Indicates that the data absorption phase has been successfully finalized. finalized_data_absorption_phase, - /** - * @brief Indicates that the data absorption phase has already been finalized. - * - * This status is returned by `absorb_data` or `finalize_data` if called after - * `finalize_data` has already been called. Meaning you should not be able to absorb - * any more associated data, after that phase has finished. - */ + /// @brief Indicates that the data absorption phase has already been finalized. data_absorption_phase_already_finalized, - /** - * @brief Indicates that plaintext has been successfully encrypted, generating ciphertext. - * - * This status is returned by `encrypt_plaintext` after successful encryption. - */ + /// @brief Indicates that plaintext has been successfully encrypted, generating ciphertext. encrypted_plaintext, - /** - * @brief Indicates that the encryption phase has been successfully completed. - * - * This status is returned by `finalize_encrypt` after tag generation. - */ + /// @brief Indicates that the encryption phase has been successfully completed. finalized_encryption_phase, - /** - * @brief Indicates that the encryption phase has already been finalized. - * - * This status is returned by `encrypt_plaintext` or `finalize_encrypt` if called after - * `finalize_encrypt` has already been called. Meaning you should not be able to encrypt - * any more plaintext, after encryption phase has finished. Now, you have to get rid of - * this instance of Ascon-AEAD128. - */ + /// @brief Indicates that the encryption phase has already been finalized. encryption_phase_already_finalized, - /** - * @brief Indicates that ciphertext has been successfully decrypted, generating plaintext. - * - * This status is returned by `decrypt_ciphertext` after successful decryption. - */ + /// @brief Indicates that ciphertext has been successfully decrypted, generating plaintext. decrypted_ciphertext, - /** - * @brief Indicates that decryption was successful and the computed tag matches the provided tag. - * - * This status is returned by `finalize_decrypt` if tag verification succeeds. - */ + /// @brief Indicates that decryption was successful and the computed tag matches the provided tag. decryption_success_as_tag_matches, - /** - * @brief Indicates that decryption failed due to a tag mismatch. - * - * This status is returned by `finalize_decrypt` if tag verification fails. Meaning you have to - * discard all of previously decrypted plaintext. - */ + /// @brief Indicates that decryption failed due to a tag mismatch. decryption_failure_due_to_tag_mismatch, - /** - * @brief Indicates that the decryption phase has already been finalized. - * - * This status is returned by `decrypt_ciphertext` or `finalize_decrypt` if called after - * `finalize_decrypt` has already been called. Meaning you should not be able to decrypt - * any more ciphertext, after decryption phase has finished. Now, you have to get rid of - * this instance of Ascon-AEAD128. - */ + /// @brief Indicates that the decryption phase has already been finalized. decryption_phase_already_finalized, }; diff --git a/include/ascon/hashes/ascon_cxof128.hpp b/include/ascon/hashes/ascon_cxof128.hpp index e5a6d89..8683be7 100644 --- a/include/ascon/hashes/ascon_cxof128.hpp +++ b/include/ascon/hashes/ascon_cxof128.hpp @@ -13,11 +13,48 @@ static constexpr auto INITIAL_PERMUTATION_STATE = ascon_sponge_mode::compute_ini static constexpr size_t CUSTOMIZATION_STRING_MAX_BYTE_LEN = 256; +/** + * @brief Enumerates the possible status codes for Ascon CXOF-128 operations. + * + * This enum provides detailed status information returned by various functions within the + * `ascon_cxof128_t` struct, indicating the success or specific reason for failure or + * current state of the CXOF instance. + */ +enum class ascon_cxof128_status_t : uint8_t +{ + /// @brief Ascon-CXOF instance was successfully customized by calling `customize()` method. + customized = 0x01, + + /// @brief Customization string length is too long, failed to customize. + failed_to_customize_with_too_long_string, + + /// @brief Attempted to customize cXOF after it was already customized. + already_customized, + + /// @brief The state is still in the customization phase, cXOF needs to be customized before it can absorb. + not_yet_customized, + + /// @brief Data was successfully absorbed by the `absorb()` method. + absorbed_data, + + /// @brief The state is still in the data absorption phase; `finalize()` must be called before squeezing output. + still_in_data_absorption_phase, + + /// @brief The data absorption phase was successfully finalized by the `finalize()` method. + finalized_data_absorption_phase, + + /// @brief Attempted to absorb data or finalize after the data absorption phase was already finalized. + data_absorption_phase_already_finalized, + + /// @brief Output data was successfully squeezed by the `squeeze()` method. + squeezed_output +}; + /** * @brief Represents an Ascon CXOF-128 instance offering 128-bit security. * * This struct encapsulates the state of an Ascon customizable extendable output function (CXOF), providing 128-bit security. It offers - * methods for customization, data absorption, finalization, and output squeezing. + * methods for customization, arbitrary length data absorption, finalization, and arbitrary length output squeezing. */ struct ascon_cxof128_t { @@ -47,26 +84,30 @@ struct ascon_cxof128_t * The customization string is absorbed into the internal state of the CXOF. This function must be called before calling `absorb`. * * @param cust_str The customization string. - * @return True if customization was successful, false otherwise (e.g., if already customized or string too long). + * @return An `ascon_cxof128_status_t` indicating the success or reason for failure (e.g., `customized`, `already_customized`, + * `failed_to_customize_with_too_long_string`). */ [[nodiscard]] - forceinline constexpr bool customize(std::span cust_str) + forceinline constexpr ascon_cxof128_status_t customize(std::span cust_str) { - if (!has_customized && (cust_str.size() <= CUSTOMIZATION_STRING_MAX_BYTE_LEN)) [[likely]] { - const size_t cust_str_bit_len = cust_str.size() * std::numeric_limits::digits; + if (has_customized) { + return ascon_cxof128_status_t::already_customized; + } + if (cust_str.size() > CUSTOMIZATION_STRING_MAX_BYTE_LEN) { + return ascon_cxof128_status_t::failed_to_customize_with_too_long_string; + } - std::array cust_str_bit_len_as_bytes{}; - ascon_common_utils::to_le_bytes(cust_str_bit_len, cust_str_bit_len_as_bytes); + const size_t cust_str_bit_len = cust_str.size() * std::numeric_limits::digits; - ascon_sponge_mode::absorb(state, offset, cust_str_bit_len_as_bytes); - ascon_sponge_mode::absorb(state, offset, cust_str); - ascon_sponge_mode::finalize(state, offset); + std::array cust_str_bit_len_as_bytes{}; + ascon_common_utils::to_le_bytes(cust_str_bit_len, cust_str_bit_len_as_bytes); - has_customized = true; - return true; - } + ascon_sponge_mode::absorb(state, offset, cust_str_bit_len_as_bytes); + ascon_sponge_mode::absorb(state, offset, cust_str); + ascon_sponge_mode::finalize(state, offset); - return false; + has_customized = true; + return ascon_cxof128_status_t::customized; } /** @@ -76,17 +117,21 @@ struct ascon_cxof128_t * can be called multiple times before calling `finalize`. * * @param msg The data to absorb. - * @return True if absorption was successful, false otherwise (e.g., if not yet customized or already finalized). + * @return An `ascon_cxof128_status_t` indicating the absorption status (e.g., `absorbed_data`, `not_yet_customized`, + * `data_absorption_phase_already_finalized`). */ [[nodiscard]] - forceinline constexpr bool absorb(std::span msg) + forceinline constexpr ascon_cxof128_status_t absorb(std::span msg) { - if (has_customized && !finished_absorbing) [[likely]] { - ascon_sponge_mode::absorb(state, offset, msg); - return true; + if (!has_customized) { + return ascon_cxof128_status_t::not_yet_customized; + } + if (finished_absorbing) { + return ascon_cxof128_status_t::data_absorption_phase_already_finalized; } - return false; + ascon_sponge_mode::absorb(state, offset, msg); + return ascon_cxof128_status_t::absorbed_data; } /** @@ -95,21 +140,25 @@ struct ascon_cxof128_t * This function marks the end of the data absorption phase. It must be called after all data has been absorbed using the `absorb` function and before any * calls to `squeeze`. Calling this function multiple times has no effect. Calling `finalize` before `customize` is a no-op and returns `false`. * - * @return True if finalization was successful (and it was not already finalized), false otherwise. + * @return An `ascon_cxof128_status_t` indicating the finalization status (e.g., `finalized_data_absorption_phase`, `not_yet_customized`, + * `data_absorption_phase_already_finalized`). */ [[nodiscard]] - forceinline constexpr bool finalize() + forceinline constexpr ascon_cxof128_status_t finalize() { - if (has_customized && !finished_absorbing) [[likely]] { - ascon_sponge_mode::finalize(state, offset); + if (!has_customized) { + return ascon_cxof128_status_t::not_yet_customized; + } + if (finished_absorbing) { + return ascon_cxof128_status_t::data_absorption_phase_already_finalized; + } - finished_absorbing = true; - readable = ascon_sponge_mode::RATE_BYTES; + ascon_sponge_mode::finalize(state, offset); - return true; - } + finished_absorbing = true; + readable = ascon_sponge_mode::RATE_BYTES; - return false; + return ascon_cxof128_status_t::finalized_data_absorption_phase; } /** @@ -119,17 +168,20 @@ struct ascon_cxof128_t * times to retrieve any number of bytes of output data. * * @param out The buffer to write the squeezed output to. - * @return True if squeezing was successful, false otherwise (e.g., if `finalize` has not been called). + * @return An `ascon_cxof128_status_t` indicating the squeezing status (e.g., `squeezed_output`, `not_yet_customized`, `still_in_data_absorption_phase`). */ [[nodiscard]] - forceinline constexpr bool squeeze(std::span out) + forceinline constexpr ascon_cxof128_status_t squeeze(std::span out) { - if (!finished_absorbing) [[unlikely]] { - return false; + if (!has_customized) { + return ascon_cxof128_status_t::not_yet_customized; + } + if (!finished_absorbing) { + return ascon_cxof128_status_t::still_in_data_absorption_phase; } ascon_sponge_mode::squeeze(state, readable, out); - return true; + return ascon_cxof128_status_t::squeezed_output; } }; diff --git a/include/ascon/hashes/ascon_hash256.hpp b/include/ascon/hashes/ascon_hash256.hpp index 5f67f15..e28e474 100644 --- a/include/ascon/hashes/ascon_hash256.hpp +++ b/include/ascon/hashes/ascon_hash256.hpp @@ -13,6 +13,34 @@ static constexpr auto INITIAL_PERMUTATION_STATE = ascon_sponge_mode::compute_ini DIGEST_BYTE_LEN * 8, ascon_sponge_mode::RATE_BYTES)); +/** + * @brief Enumerates the possible status results of Ascon-Hash256 operations. + * + * These status codes indicate the result of calling methods like `absorb`, `finalize`, and `digest`, + * reflecting the current state of the hashing process (e.g., whether data was absorbed, if + * the absorption phase is finished, or if the digest has been produced). + */ +enum class ascon_hash256_status_t : uint8_t +{ + /// @brief Indicates that data was successfully absorbed into the hash state. + absorbed_data = 0x01, + + /// @brief Indicates that the data absorption phase is still ongoing. + still_in_data_absorption_phase, + + /// @brief Indicates that the data absorption phase was successfully finalized. + finalized_data_absorption_phase, + + /// @brief Indicates that the data absorption phase has already been finalized. + data_absorption_phase_already_finalized, + + /// @brief Indicates that the message digest was successfully produced. + message_digest_produced, + + /// @brief Indicates that the message digest has already been produced. + message_digest_already_produced, +}; + /** * @brief Represents the Ascon-Hash256 hashing algorithm. * @@ -50,39 +78,42 @@ struct ascon_hash256_t * function. This function can be called multiple times to absorb data in chunks; only after calling `finalize()` will further calls to `absorb` be ignored. * * @param msg A span of bytes representing the data to absorb. - * @return `true` if the data was successfully absorbed, `false` if the hash state has already been finalized. + * @return An `ascon_hash256_status_t` indicating if data was successfully absorbed (`ascon_hash256_status_t::absorbed_data`) + * or if the data absorption phase was already finalized (`ascon_hash256_status_t::data_absorption_phase_already_finalized`). */ [[nodiscard]] - forceinline constexpr bool absorb(std::span msg) + forceinline constexpr ascon_hash256_status_t absorb(std::span msg) { - if (!finished_absorbing) [[likely]] { - ascon_sponge_mode::absorb(state, offset, msg); - return true; + if (finished_absorbing) { + return ascon_hash256_status_t::data_absorption_phase_already_finalized; } - return false; + ascon_sponge_mode::absorb(state, offset, msg); + return ascon_hash256_status_t::absorbed_data; } /** * @brief Finalizes the hash computation. * * This function finalizes the hash computation by padding the message and performing the necessary final transformations within the Ascon sponge - * construction. It must be called before calling `digest()` to obtain the final hash value. Calling this function multiple times has no effect. + * construction. It must be called before calling `digest()` to obtain the final hash value. Calling this function multiple times has no effect. * Subsequent calls to `absorb` after calling `finalize` will be ignored. * - * @return `true` if the function successfully finalized the hash computation (meaning it was called before and not after `digest`), `false` otherwise. + * @return An `ascon_hash256_status_t` indicating if the data absorption phase was successfully finalized + * (`ascon_hash256_status_t::finalized_data_absorption_phase`) or if it was already finalized + * (`ascon_hash256_status_t::data_absorption_phase_already_finalized`). */ [[nodiscard]] - forceinline constexpr bool finalize() + forceinline constexpr ascon_hash256_status_t finalize() { - if (!finished_absorbing) [[likely]] { - ascon_sponge_mode::finalize(state, offset); - finished_absorbing = true; - - return true; + if (finished_absorbing) { + return ascon_hash256_status_t::data_absorption_phase_already_finalized; } - return false; + ascon_sponge_mode::finalize(state, offset); + finished_absorbing = true; + + return ascon_hash256_status_t::finalized_data_absorption_phase; } /** @@ -92,20 +123,27 @@ struct ascon_hash256_t * successfully extract and return the digest; subsequent calls will only return `false`. * * @param out A span of bytes where the resulting digest will be written. The span must be large enough to hold a digest of `DIGEST_BYTE_LEN` bytes. - * @return `true` if the digest was successfully extracted (this is the first call after `finalize()`), `false` otherwise. + * @return An `ascon_hash256_status_t` indicating if the message digest was successfully produced (`ascon_hash256_status_t::message_digest_produced`), if the + * data absorption phase has not yet been finalized (`ascon_hash256_status_t::still_in_data_absorption_phase`), or if the message digest has already been + * produced (`ascon_hash256_status_t::message_digest_already_produced`). */ [[nodiscard]] - forceinline constexpr bool digest(std::span out) + forceinline constexpr ascon_hash256_status_t digest(std::span out) { - if (finished_absorbing && !finished_squeezing) [[likely]] { - size_t readable = ascon_sponge_mode::RATE_BYTES; - ascon_sponge_mode::squeeze(state, readable, out); - - finished_squeezing = true; - return true; + if (!finished_absorbing) { + return ascon_hash256_status_t::still_in_data_absorption_phase; + } + if (finished_squeezing) { + return ascon_hash256_status_t::message_digest_already_produced; } - return false; + size_t readable = ascon_sponge_mode::RATE_BYTES; + ascon_sponge_mode::squeeze(state, readable, out); + + finished_squeezing = true; + this->state.reset(); + + return ascon_hash256_status_t::message_digest_produced; } }; diff --git a/include/ascon/hashes/ascon_xof128.hpp b/include/ascon/hashes/ascon_xof128.hpp index 2d4be1d..b441508 100644 --- a/include/ascon/hashes/ascon_xof128.hpp +++ b/include/ascon/hashes/ascon_xof128.hpp @@ -11,6 +11,25 @@ static constexpr auto INITIAL_PERMUTATION_STATE = ascon_sponge_mode::compute_ini 0, ascon_sponge_mode::RATE_BYTES)); +/// @brief Enumeration representing the status of Ascon-XOF128 operations. +enum class ascon_xof128_status_t : uint8_t +{ + /// @brief Data was successfully absorbed by the `absorb()` method. + absorbed_data = 0x01, + + /// @brief The state is still in the data absorption phase; `finalize()` must be called before squeezing output. + still_in_data_absorption_phase, + + /// @brief The data absorption phase was successfully finalized by the `finalize()` method. + finalized_data_absorption_phase, + + /// @brief Attempted to absorb data or finalize after the data absorption phase was already finalized. + data_absorption_phase_already_finalized, + + /// @brief Output data was successfully squeezed by the `squeeze()` method. + squeezed_output, +}; + /** * @brief Ascon-based extendable-output function (XOF) offering 128-bit security. Provides methods for absorbing arbitrary long data, finalizing the internal * state, and squeezing arbitrarily long output sequences. @@ -42,54 +61,60 @@ struct ascon_xof128_t /** * @brief Absorbs input data into the XOF's internal state. This function can be called repeatedly to absorb data in chunks before calling `finalize()`. * @param msg The data to absorb. - * @return True if the data was successfully absorbed (the XOF has not been finalized), false otherwise. + * @return An `ascon_xof128_status_t` indicating the result of the operation. + * - `ascon_xof128_status_t::absorbed_data`: Data was successfully absorbed. + * - `ascon_xof128_status_t::data_absorption_phase_already_finalized`: Data absorption phase was already finalized. */ [[nodiscard]] - forceinline constexpr bool absorb(std::span msg) + forceinline constexpr ascon_xof128_status_t absorb(std::span msg) { - if (!finished_absorbing) [[likely]] { - ascon_sponge_mode::absorb(state, offset, msg); - return true; + if (finished_absorbing) { + return ascon_xof128_status_t::data_absorption_phase_already_finalized; } - return false; + ascon_sponge_mode::absorb(state, offset, msg); + return ascon_xof128_status_t::absorbed_data; } /** * @brief Completes the absorption phase of the XOF. This function must be called after all data has been absorbed using the `absorb` method. It prepares the * internal state for the squeezing operation. - * @return True if the XOF was successfully finalized, false if it was already finalized. + * @return An `ascon_xof128_status_t` indicating the result of the operation. + * - `ascon_xof128_status_t::finalized_data_absorption_phase`: The XOF state was successfully finalized. + * - `ascon_xof128_status_t::data_absorption_phase_already_finalized`: The XOF state was already finalized. */ [[nodiscard]] - forceinline constexpr bool finalize() + forceinline constexpr ascon_xof128_status_t finalize() { - if (!finished_absorbing) [[likely]] { - ascon_sponge_mode::finalize(state, offset); + if (finished_absorbing) { + return ascon_xof128_status_t::data_absorption_phase_already_finalized; + } - finished_absorbing = true; - readable = ascon_sponge_mode::RATE_BYTES; + ascon_sponge_mode::finalize(state, offset); - return true; - } + finished_absorbing = true; + readable = ascon_sponge_mode::RATE_BYTES; - return false; + return ascon_xof128_status_t::finalized_data_absorption_phase; } /** * @brief Extracts output data from the finalized XOF. This function can be called multiple times to generate an arbitrary amount of output data. * The `finalize` method must be called before the first call to this function. * @param out The buffer to write the squeezed data to. - * @return True if output was successfully squeezed (XOF is finalized), false otherwise. + * @return An `ascon_xof128_status_t` indicating the result of the operation. + * - `ascon_xof128_status_t::squeezed_output`: Output was successfully squeezed. + * - `ascon_xof128_status_t::still_in_data_absorption_phase`: XOF state is not yet finalized. */ [[nodiscard]] - forceinline constexpr bool squeeze(std::span out) + forceinline constexpr ascon_xof128_status_t squeeze(std::span out) { - if (!finished_absorbing) [[unlikely]] { - return false; + if (!finished_absorbing) { + return ascon_xof128_status_t::still_in_data_absorption_phase; } ascon_sponge_mode::squeeze(state, readable, out); - return true; + return ascon_xof128_status_t::squeezed_output; } }; diff --git a/kats/ascon_aead128.acvp.kat b/kats/ascon_aead128.acvp.kat new file mode 100644 index 0000000..a377e4b --- /dev/null +++ b/kats/ascon_aead128.acvp.kat @@ -0,0 +1,54 @@ +Count = 1 +Key = E3A21DB47B845F787F09370170000556 +Nonce = 146D6E3BBDCBF6C6D36C16A3CADCD9A4 +PT = B4B53B0B0EE5DDA2AEC6116CD97786680D3544A02172215F9FDFC6B14B637A0BC3910042 +AD = 2D32E051493240A0F450A931BBD8539E4D5262571257FF40982DAA0A6C4B4409F26F4D813C509A72983BD6526D3B18EEA22D70E80B1501D633A0B81C883634A80C9F3E4B8BD161FCB7EFBFD680ACD25D14BB673FDB5BFEDD6E764E9C977EEA62072D46CEFCCC62D1CB74301B562A5586CD5B07CCCEF5CDB1A061DD1582C56439055CCF5266046148599673662AE2874320C7CE3C761E941260952D9BEF4D4E060FF716F95B0220C9F9BF7337816686BED99AF4BBF628C3E6C8BDF2D1D7C5580B486C5733CC8DE71DA70542B7AB5D90FA0E6FC154589310E6332F309E104FF1336667EE150E53F24CB2D713F0E50C3B6B2CF7C2670404B2B55C70FF9C5D480C58130F50436E7BECBB7D75A1817F200127F3C571198C8A2F62B438B89D5355EE69CABBDCD6BBF8FDB10B07EA8F6231363C6FD7A898D6F3CB89E0EE8E35C24E68278637B6C4432B6BFBC8C00D859F9FFF82027C2D7BAC5692D7EF52F5CD69C7EFBC9EC2082A7B71F8446CADCF16E546E940EE0C334520EC7B2FA4DED4F0359E9200D051E6DD97D4069084E90FFF877CF2A968B5DE5D93AA9BB147D9869D9C070ECD1ACE45945F0CA91905A2C037DD7BA828EC2B877FBF356D26B53495BD4E69F37CDA41E4B8365E495C0CC458F0E964D4CB315DB1717F8F0EE5611EDE2A77EBCB9BAF445C9B96F0F18EE22B73FADD7C3D5160C98CF0B882FD4B33FF56177F1EE420F9BC41A5073834406C238F531B1308E4E18CCAAD5FDAE32C4611689799D90EC3465201203B984A27944B8494F3A92F20F67136F25437C11ED9145EF5D09DA79214CB0CC912E7A94842A31813564E399DE247A027A21B6E0F91E247273A5456F7A4F280279C660E0FC8EEB0B11FADC88ADAC11388FC7FEFF95DFD382FA0810EED4C206F63CE11007C39915EB46ABDF0E31ABC4C7941CDFB240286CA9E2DDE6E47E0C365FE3E64BCC8C0974F6A213B8EA00D5415E33495AB7E254B614747614E5B2317D4A757F1A4B50083B8AA7E9003C7F82A91D8C98A124A17E6D8F20374815E48F3470967E6481CAF5FE2B1DC01FF9548994F1DD07591980589907118B2B18C0259618A48F96011E2752869A7616E15E742AA6A24638ED362AF04DD55D603FDAE56AE829F744D4E393E3B5B4C28F0A41A7B89D60747679ECB8E2898F482BB0B722ABA51B2EB7572F55B30E628328639BF60C2DA4D2DF666EE0FB7114CB459B7822FE9216D9EF12F0517E0AB1681759807EED994BFE1BE45345462A234642640017964F94965CC206F93D5364C4A506D9A1E0A5DDBC5F7A071A4ED193C4EFBA1F09FA99D1C7C4FA222B9252C0B88F8E904F408155AC9653C81C387A578B3E320973445ACA1B2511DCF673B22A0CB95E9AB03154745E546263A6D1B59F5A92A6FD50494D7424C4851A3EB46F28E429CB62E9DFA749D9CDAB2ED1E713397F828253DCB4D9B37BDA75FBAC4A35A9E5498F7D0652A57AFB5D1382AE2EA23DA14B9ABC221B4C2F5017E71F69BBAD9F87F139886796332CDD07688FA147055D38384A50AF8977D9FD602CFE6B96014FAF740AACF519D60B187DEF1AB2CC7E190299D731614CF00E795F9B077934C1370628D03D3C68581E623F3831AA5D2720E203EBC1BEDFDE52840C23957EDE81E3ACA81489EC40DCAA31C8DF2204BE542C286A157548FF78264A7DA93034C29F83BD5484F2489D44A127418FF600AC4DC5A8077D14B91C9AAD2FFE4F7E97AC757F294B74B02961D38B25744E076F82259E2FE3982D458ACA90C9D7D25A5DC6098ADC10DCC5379DAC4623E1EF44DE833D9DC8A14EB41448299E70E3E6418F893D5F6AC33B5EB55066824741F9639B85C236AA3481AC87556683E73E4453B75AB69AA49FDA0B57DEE8684ABC7CC24EC5F2FB11AFA75B0790C8155CA777871C02DAEC9B6EBF0BABB6EECB4C1951DAE8A445113B593207A35B8313C7C4AEB067615C37D18026E006F74F6AC0EC0EFE3EFD2CB862664BC2D0C3394FDBAB43D7183E53EABD19F9587D551A4409D746C75C94E4CA97F64E011599671E56E7146BA37842928814411503D43B0D4C07B9098C71F336C6794F11E052D523B2DB019640AE909184B43F3853CFC6C3CB40B50DD06D91D4F3DDA52A2930A2253F1D6228C2A4CC9D672774C832BAE2F6B27B56AFADD75345492C9273096668540209F9366DADF116841796A8E8C99238EAAE77BDDA028767CA1CDFA602598400CF20C628C1BC89148A302B9630AA5C8F8A69886AFEBA79FF82816C50CE5B142A8395E9C7F369773E15632399E6E1372FB0401BA8C1290214A6C6A6304038463F2BF1129AC0949C10E24A458B86D018A15A4C907E3F7B695A83C5112CC336EDDD1CF47DF5CE9C5F2BB3FAB676D3768DD6BDF4E603A7C7FFA097B816FB736F5DAB6C787E925212D2BDED74BA44B4E2870D474A7EDE50EA354504DD6E168563A854AD1B1A6B07EB749B222816230DAAEBA53109A428E07F5A7233299D84B4CC3889CC65A7A9C81C055BD5D3AC28D4023759E1B8D58BBF8F642DC09827EE5DEFE655FF8C66A80341ED14F458531CD321AE30E233A30BF6ACDA4CF179E92FF4270DE5FD562947AB9F46AFDBB087672C575A9EE9F6FC1A4CDA6F52A219A68968BD10DD4A6D1F7CF8668552FD033036257310AA2F4A360D2AE3A912E6D69581E8BD471E9FBA1CBF37DD968361A92D49AA392D3F090C6A1E7713A256C40C8621C1037A3FCC11967B66516241B3B2AB81C65F68BDA96688DC5328978C07B5FB3B4774B25E2EED8D9892B1C8A7AA286AC46820907493D8786A7A9DEC937A1A63A06626FA3EF04D52D8D1D02AE79DE1322ACDD313E72586A77EFC57D39100EA1E884E2831732E2BC42ACDB792C3AD90DC996BB1C5A6F68C8AEF8F7B42A869C1D7E7C1A29975AFBF0C920EF9196DE3D3D16B8B4A255F146781C19D51E3A2E92BB0FBEFBAF20AF756F9ACB523A80D731D0BABA9D72D2F9C78C35A20D7D84DDB59B8D3381D8E28E1D67424408899E0CF745E70563809020E916F66F7A7DA1F7EBBC15B7AC4D5559ED2C9D362F8DF13EED29AAC8967F7A350B6D4A6BE273139FC64A594B73E75FAAEF8E1736E259F05B25B88150D3D8616B42E0AB3F03E9777A19FE70E534A5CA05CA00D807674352B17CEE4629F1C3CBEDE8ED08933C20A706179D1DE4E90B267FEE7C86D3005A04FF8DFAC314A24D89553283FC469C36C9AA58D2EFCA256EC870C7C63B743CF8ED8EE90905415C9263CA14C7B1660FE0E2B7B2DC7A2D6A3AD91E32524CDC1114193A956E5D9330874DC56E25B55EBD6161E7E483C25F7DBF23AE30E70F0A4587B800AE77D0A0824F862B8FB4BF44847A61D0F065F78D51B9BCD64AAE624978427FE76DB5B04591C06594FD97D0C800DE2AB5853F1AE08F2AAEF4BAFA56D3ED3DB24D34D8D7CECA1B3F2F006390BAE9F3D66C84ACC339279F574207BB8B976A91A7BFE4829328065CEA69FFEBE02C99F30AC623EA4F40797925958094C60E90A8C46EBCD1D6675FAD6528C259393CBE2BA914B1C473804266456A5CFEA77295DBD95726726FC81CA3667585277E1F40E9D755EBB25DCC34432C558B6B0A6106F292E680E1164CBBE0F70D5DFDFB1BE8262A73275286E37E0D23E2461A3DB199056F9294979F5ED28A990ABA4F6E3748106C6540963AB36CAF6872BE3305A1A34674588D69875086CCA19CB97B282E9FEB9A35ADD87002CABC25E42F2C9F9F85F86773DB16A9DE891BDE73F59EFAF08639D3D399D0F3CBD5728DD143A221592C0117C014B4528941BBAC91F9FC0D2CC2345DF559CC06B4049C9E6988D89AE6FA8447F38739DCD2E64A91DD2461D1D864610E0F452B0060FB62BC7816E9006920C59774B519A489588B0E0E3B2890A3CAC50426C98BA1CF84E6F8247D64BBFD4928BC5FCA5C234BBC85B6B91CF224D3D218AD51E5D99F9523C7F0CE21800BF4D011C4136B31D96DA2B86A43D5E8B391C1245264B669177088273B026B542A3C7AC2E90A2D1167A13F40AF2C6F5BBF3B145E0DFC2DA73D66FA548A44F5D6014D8E2EC912FFA864B0BDB12476BAEA012D6700EE0D472D0ED2848210D98722AC683E619E4091AD3B6BFA5C3E7C82C7AB0F535DDCF4E8F406601FF78D7C988A289A05BC37594CC09BBAC48212EAEE9250BDD700862A45B7804A5A3D219A1FBFD26F34A377C69051C392C2222F65E11C728DA6D0A49804FE554D3BEDFE0F9F009A05B0A2B54B1B892C853DF36823881A683ECB93F34E1B396B354E298AA252B3F3C1872AB53F6626721DA31F5B109631C42185C0430B0C4CE9763780FCF1FF8A3289FFA69B5E6529D7A421D6AAFCDE5A9F1D65691D926FE8B53B403F07E62A811D19ECD111EF9566BC5CE99FEA35A1ED97DDE0DF8C966CA01917F1601D2521F17A9FB9910F0C49AF87FEACC1A9D0FE7F9952A72A054AF587AC4CB8F9FE3448963AF7254A7C10DD8A9330578DE9ABF7491971C7CA7EF6EB2FAA31E4C3544FB052B51686B1ABB30389751C97D5F3679E01546FE08D6D7D17440CF59F4A2C1A36437F05D8D224469D656D3D55625F163C4393E26FE56F23E437FF42A4B514B85C5AE65355EE8FCBDC0ED17A1F3027B5E4F5B95BB749AB50D35C20A0D3E2A1E851B5E0FB7B0CC14EB4C8056014F503B40F495DAEFBB80113AF957FF8CDEFF8FA6DE8296A4F2C39D8346BA7EE444A3CDE586B908984F2ED98B3CD4BE68CC880C5D00BF22CCC9965E210857A901012CE6559A19F625E6E757BFB90B681E1534B6CEBE21E39581011BF05AD79FE775D88A0FEE68CEB281D66619577303CE2E401BD3A0EA52DF3950D498FE05CB1F577039D071582FBC65F43CD7CBCA3E0DFD5DC21ACBBC469B85AAC69D9435C48C0B56C1E739234CC6105F7DBCAD7B136F22C6AB9043B0439B299E5AD6919228202FB0CC650856D4CA00FBFA6C4E89FE0A87577ACD9A24385B0336BD9AD876348E374D8CFCBEBE66CBF1E18F47C5E74C9FA0504F3A275A95FB786161C1A939F19AB76C34F10CF14BD8E0AEDBB8A4E0852BEA1DFA78270A66DCB781744D5CA522B7EFF49059A24B92AF147649788EED5697EC35D78B4F7963BD0568498B8CFE8C4B8C13C8A0503B79AE7 +CT = CE323CC70536B5A7A7395BACED6CB6ED20F91A86E38A209C8DE86F9CAB26666F65008260 +Tag = 607BD8A6 +TestPassed = True + +Count = 2 +Key = 211469AD3073C618E77EF13CEF13B867 +Nonce = 593E30AD958B27372342DBB75908167A +PT = 4157ED58594BBA86297D21C82326AAE715B86A582F982E7DD923591E80DDD48E49C96AAEA42E017E93E1C1BDA89FAC883DE3CB33E8A322A829707F35F19C054BA9927F5ABCFC43E7B6EBC54DD770D43977D0E19D11A0A6A5A6C18534AECC8CF7DB7514161F51CC41A0E47CFCDED4D0B89B46BE21BA683908ECDAB3FA760E38EA5FCD72625CBE1A2504A0FD2D24A9C6D2F0CD98680E6B3C733B0B2A459ED2CA91AC919D10626E5BDD2B981D196B0CE44313E109A975CFDCF490FE265194D48631D66B80920CB56F8271BB3C754E23082F27E631BDC8201BDCB4A87F63480A495711EB43FF8B51375E718737BA9267A66DF6F629ADA3C969B54FA4DD63350B396771E56462DF08A4D5AFD34C41E8614A4D02126D51E09CB348828EAFE774D328654ED048AD02438EED5254FDCF7C28CCEE5A8F60239DE786D5321BE05159BD61DBABE6F318189D4ABF8380FF8C9FE3CB5AC1C18DE47304C7664A737BE7623D9495F321249634B4D5BC44A1A01DE8FA354E50868F972F7D68A61E8CCDA522635C45EC69987EBF35250CEBD09FD164AA7E4F3D2C96DCADFC6575B87E77A8E6309AE0455A307E61B78E1B6182AC5FDD9641730E7D67F5CD8098F00423C540BD7D26BA35BE8C0A7AFFEE869E7B7A2B4F0598213C039969C9A513C5C2407A3EF14E5DE45CF12A1F0937F90F8FE05751056CA0FE8AA304B9E3BCF18FAAC7473985B094501E96CE5EDA7817040A8AD9E84EC2BF559F7BB34D49A3009F009B7442EFBF8ADF4C07336E9E4223118CFFAF59E30840E807F29A09FC46067A952F5D3F04D5144A00FA9C478F51B75D57A1C149F4A7BCF85A8C3AFD2580E20600B8D86FE5E40DB6EB6458E86CF958B63B3DB25B84BC86EE7265E5789A17257F179546D778477873930B5E8F4ED38B613384C2E8CE87814331EAFC7FFE951BD43FD9D1D6B2813EF3C53EC7795EF79F9FD9844516553CB1901402A58D4BF874FEEF8A4F7502B5AEB145CE238FC007E53A4B5DA67A50047F022740C1AFDCB0A7CCC9C889D3A7299D24D593D1861921D00C1D6A41EE52F9AEEA0B4C4DC1F3FFD4952656C5F77E129321C082A5BC33F8E90570B592726EB97ACF1A9FC85ADCDB30D6BE3B5FC35BD98E0AD6202ECF54F1B7126348513E6D62266DDBF5DCDF4A3845E451CFFDF79926AA9726879B4E8BAA7B28E7B5F6948AF2685C15F2E765FCAFC09DDA497E85F4BF793D9DB917E5C6D8E2317AB4F79442B1595F66A0E2A73E449A77C7FD73412CF534283CB9F6D0DA83963D10B6EB48B82B5B29F01E1F53DCD1FE591E9F1EC864A004847FCE5888BB8884E20AA597885952BF9BA149500ED6E14C6ABA9CB13B64CDD86FB166C8E9D2D36E679A3C48373A7500CCE083261B4FF6AD9E82EECE1ED6497D3DCD28D7F389D5C8CEDBE9749A98142F449CE55BE1A6BC1FBBB82A67E4044F9050BE0B6A129E0D420ABA583F668213056DBE8982F1EE9B9710081C3A5F6EE4CA8B5823DC8DAA1DA58FA250274E7DB938A425F9257ACD9F622274590982D2E39BD58DB30D5F3778C3A1E4F34E9D7448924FE3953975BF4FBEB9C0B919501323BCBFB552C0C9ABD96DAD368496D950C5AE2BC6BA9F3CA926163EF5539E7D5E728DC0368FE82288C9A409278C3F3BB8E469FB0BED89598480158F3B82D4573BF04EC3F6D5A3C0DD8CA2FD1695141DE7DB8510EAA37171E8333CB67A59E606F54CCE373E7B44E241A81D7F4B8C43EE6BF8A860FCC46D977FDDDAC399EC4684A59C08C9C7DDDE6B96A2CE4185F2255CEF4E4B82B0850931DE36B861A08149556199D9AE8479278D193CCA5AF52B118CB77DD34BA1C4D31F92D6EB90257DCA145979DFEB1877D87526BD6874BBAF3BB2252BA922AEFEB39DC6B91CAD8E96689C71B5017C4B257440A55D24E35C5E63E29B386BFAD3A7665AC542255E5A2BE79055CC0206AEBE67FFB6697D50DACF4167553911562B6DC8C94EA6B7090015E57A76948E8F5C5D33DDD06C43692A1580F501BD0821199064E70338B808075EFEA18403DA4641B10BF8063485BF2A5F9F3825C107420CC360E52FA68C23A42BD5726DA1E4273B3AB34FB2101AE50BA5BDA4997FE24556BC94C0A2F5169B25E854DB5E1252887A78FDEB0DB890FCA87AD98AE9E78924488F1CB00C23844524182AC9BB3F87F85235292082F7389E2C9817271B8BB23D5E2F92CEF6A17B56F4B7C7F58DC64069F3E137B3BD69A250577D84740B5C2A9866EC6B8CACB802B1B9D32CCA3043106557AE343A54FE80F58D4276791C074A978D2E8EA15BB4BC3ADE85FAEA3CD71F146C1E1C5D28EF43676C76FE6A418995B288943D01B46F0AA3F2F95BCE0395B8B622620CFDEAED6F9EEA2635E5B551F955F04862A89A1D5FFD14796A2E937564D6BD4847DF7C97C79A249E178D3925EDA00005DDBB33101B04030EE97183410A75C25F276D0A1AD85980C783FB06D1C4EE8BC92E8D98A8A2AD2C43DB6EAE5617E394A1CBDAFD8096E62D843B6C8C20FD314AFAE5B9127CDD1ABC7A40C63E6AAA29AFA0666406E9F00B334860136C36210B45AA24B3715ED118C4B11E833FCFA7C2D912BCEBBA992A6009D986C91BC9AD855834819346F6B851CF4EA055CB6CCB63A09E3A5A793551AC7FC3AA97D807FCFB03982A0A4D147CE2596B1C6BF8D4949C0E22287D8E520B23E3D513824C2179C752A4513341C0158C2157010E18E6B3AB2F0D89B5DE7E6CB18C07277800FA9638F255195482615A4D0C9B5B3751FD0BFC2268533E97C3E8D337A0A73A999D8C27C1C81CC2CC5E28CDB23BA8422235608FFB2A5597A757A02E6D451DE2BA20B46F0F347688E04830C440858B5C1AA5B00140173E6E48F4806927EE558741451392873933EEBFD7AEB3FA915621CB4414C7941BA2A2E146261AB30C61F2F3A883FB71F9D4E071C24269688B73B69D5E9DE2D98DF225A371B14112183AB275BCC0510E5BB0D2703355D2D8393956D2707C556E7E1865B65D57004793CE58878FF3ACCB21A842AECB72A6381F4C6A375B6EA29CE544F6A45A9BB004AF8ADC65FC4B49458D8AB0C73AA7A30C712D9610EDC8EC242BBCA14BFC087086F73DFE4095413BD40324AAD0BDDB613EA1EA322D04A016E69DB83A40A9FE49851A2ACFFCA9627630F2C10DC81E1C66505A63AA11D54381572617A2DC07FA2B04DB24B6930B64953E74013B42934EC88152E9E5455437AFD6A978D691BF9929F79608EDF966D245F6CE6B9DD4083EC4D84F218A1D15E5B0A375DFE9928E037EDBD743AC8A60CE1B7FA4EF76E89ADBCE6AB4FD429E0F0CE1B057498486E9B267CBEDC2FCC492397780050A78266FC80999117FDD90C0DFCBCB62FB3317499496F187ABFBD8DF0AD87B86C1980493BB418E3FEA7569D5D60A0DF63061960660377073869EC3CD31BA06A6620AFE47C738A6BAA4D75F1F2C1CB1A1EDE2AEA84275258A27910C1D7EC10E306EC372CB0BC62EF8BADB6188D751466AEC22DF4F0B5E64EDE5741F362B893CE2C92EB069AAE69527B3B6ED66139DB2D64AA2305CE1BF24105E85E697A7F8CD309F7FBFA9A0DDBF068CB89B5470FDD948C148EB8859E0000909A00A24FFFD80BAE9BCC794DD09356DE229CF2923D09F61AB9ED55E0D44D7BF7EB69F00D29A078E37E16BB436456AB8137EA53010D7E53900A979612822ADA4E50815276A359B472240F24264EB2A65331D4A8E9EA6AEA7D065002821A5661534C6CE2E2F434DDEE35D0ED0E4A3D5147E132E0AD71E063E596E57053572267CDADC0D9E1CFC36F0D06CAB4098DEC22C8FEBAA0D775C3E16C090D4C1EC48A8703791F6089637F781DD3D396A72C5A57BAC2A7549C718057D9EF7DE8C28740387C43A0907E7B99658F328303922D3A3FAEB5814C1D35FA91E8C786A9E596B59683AB1A637BC9D93F2941C569FE8CB5ACA53E3A1CF5F42B46491EA7B6F4FF7FF88CFC7FF702D6C3D4DC4222CB6090935C01E9F4B75C98908F7FC41A5D22224A29D1DCDD021CCE99CE7A6540A3D16FE5B88B4BA51AFAC8ABE45BE0773ECC66B2AA07F8E983B3914F4340364CE757FCBE1FEE51D1D68D3F2F1930E8B62C475AF203B296ABD8765204E9FC51CAC48BB49C5F3267507A94DC1CC8D9D052CADB130BE5343934B140D5A98C5CE7DA2B645A9D8C5C56F9E00A877EE679E30EA60F3A0ED955E590428FDB1E5CBDD42DACF1F1547F32D67E84292BEAACCA5E476DD7037D12D900D58ECA5B0C81489D222669C1F4888E9F6338CB8AB02A0AE3883183A085BA570AC3F11BD5A4E7D9ED3B8BF9B432F869BEEF479044575E40BB73D6D2DAFD981767DF6EFDF37CA8EA8B5EDE4F243046B08FD7D4C14E2A12B375A06061DE150EFFA37491E4D3FA6632366D14E5790F2C7B2D26430318D6D94DCCBB88531C470C665FEEABAF9E61DC8561928AE1052D3A6683E534A7C20BD6CCAB442828720325FF50AE959A637CECCB49CD91864BF8489F7111DF370264A45417DF045A49A4136E7C9B805697A0030708796E047A4080B30B88A75033EEECFC0A31728478828195AA3309A067E207D11EC83E99069FE9C75E514EB10CC32A8DBE945C562D8E9E75F7C85A3746D05B2970C6416BB043F56A57BB262733C098E7088BF1C395B1B38039B8A13E45A2808E0625303681BEDD6AAEE1FE72587732272F733EBADE8793CF12B131F7A2B724B52AA8211E80626559BE9714A3C34137B2867A1EC273C5AF7E917113C07CD5C7F7BD3947A0561396CD1DD50C4772EFFBD1797F61289852415508A28D1F4E94DCD8CF1CE689F9876C62D351B49EB957FBA1854246FD649F6F6AF7E2A7A396877E79083378560961E7F2130E5546ADB2ABA0B6DB9A0C4DDF743FBD8B9206DFC8CC4BD34B8685DF95A8135A54EA664A28BD354706FCBAFD722B28CF48A87DDFD1124A320963522C15C1113376A1F8E50DF594CE5CBFD8DC115E61106DC696FD3A437932902440B56B193135DB8786C03233B15313AF7321497E20BAF241BE5F3A24093338B654D9A4DF63438E92F089D7A0DE2A0533D98AD057F9120395C3195AD1FBB78E43978BEED7AE444C2F92A68DA6E341639449F64A7E62D0BD32D61F1C59E8ACA748FB8419424B3D95954EA0B552946CB271A5C697F56D1FE0B6CEBC018F37E246F60F34AB5F3821490C60B53FC22B6A9E796C9AA42204A1EBEB9352838F3C066D5C59BF535FB15349847D8B94A7E02E9B641D98129D4E14E15D58CFCBD5ADC9D05A47D3686C173EB819512FB4890D340B64C71F71A3F3C01E34DDF606F19763E6B3AB3A500CC62F5CDED0094C2E60685024C4571E8E483C6677C5239E2137C681FD38F0DDD2D3FEAE97C292C3FA83EFD46595E22D3045686B7ED3E837A2912BA719775EE57F9A8D40C5B876BBB5687BF3D55F288B559941A7D0955EFEFBB70BF696EBBA73350A54DB18915787CEACB61657E4625378A0517025A714DA3B8E450EAC8024C9BDF8BEDAFA4D62B431C9D933EF48A70754B88DF69A3A5D8DE58AAF9A4C48DB4E87EC685F3587592B3D9D3E6BDDE0FAF2D73DB9F3F22E2F73AB30E57FADC867E8EE8ABBF2E047D1CD5F62B90CFBE1A0048FACB31E9ED75C59BCE4A3F4A1E97D6525557D432508029F6BECA48F652277B980E0E00105595A073E5245FB93DD2B65F543D7A6745CDF879A23A2A232CCE48A7CFA73C0F97C6FDBFB6614D2B216FB8EC14E9A115AC14524016866E1A6A7D4716DBB8EA9696A6C78E40BBB0E480CC5832823D0E422D33FBBA55FBF91157E254391A3650698522566E2112D5F1636DBF4A2D3B982C6E04E9A8BC2F409AADB6365D6677CA4A7CEFAD5FE7A0201A5E0956E73BAEE31C4928CA154CA7AC55E1BBC16ADB778BECA375CE3E8E3845CDE3CE49B3D8595EFED21A133EACB4FDD442577E2BDFB53EE67E6A43C6E0A58E11E2FD327D5DF97C885DC298C1634C40EF77F9FB36BA19EE2D9063346E15981D2D8C025BAF817F7649DAF5CE1C1D7D833129534EE7AA5757C80E04EDFAC40D72C5A56A3561F1916DF883B15CC44BD10F13DF0245C149368234AB92A07D927B84CC820977B347214098E65663F8FB927D3DF5DA1BC2C8B17B6FE700B65EF1F066072C8F41425A5CCBBEC1ADDBF3D28A3918156288B760C204D18D08CB476BE2A6F5F05CCB6B513BE3980F5C001AD5889C5DC79D488E68AEA76A8A6FB451918452DE06E60376BECDC6DA7FEFA803C1E9FB056B6D80CD9A188C41B461E1E18691078A0A2214EF84269FF9D76D0F7905A3A9A174AEE623048444EE59C1C15DECE553EDE71DF99FD50B8044CE86F62C09133B11B83F6DD8ABE38685DD2596C365420DF1192191E7AA09CC682DA1557D8E17E54685AFA4AC777B42049773C1AF75BDDF8C780412E7815466AE7305AA098E08F6C5404F3DB59D607A9EDE8D5037481CF270C2C8058904FDC43149F63972D139758E7CFB6E257F29EF188A7409F4032F6556123A47C6036DC1438B0C6BA62707CCA518C2BA4CAECDF098D9ECFF8FF3D02E1A90E26097F1AF8A0F3A2B9A73BD48F082A864DC417418A84549AEEC166D314FBBDD511545A735B36937AA1282327CDB90FC7DE78FF3EDA6773A1B4D43C273A209DCDF956C33ABDA72B07309C9062512CDD35C1AEF49BFC7F0AB9D0B8CE870A7C30809A653E66F5C51A275DF80E3DC711408806F6559B2BF1C17A5C095A04E893FCC46C0FD7EBEE664FFC84DD3DF470DCF2CF683680041695649893B41AEC7B153EC9FB39D1B749649990B659164EC3CD097F169A9CB213F8ADC6AB3F583A4B53816F9E740936FB3B86039CEF4DCD8F15C4C6AA9BC5E0788CB6029C1B1C0A1C6F5562D7A6A05FC3D283EB14992524AAE037856A818FAF8DA0F711CDF6AAE02F7BF72D99EAF5D8757502D817EACBDF578167ABD3869F8ADFA5D526BF8E91CD3793CB98A1F79ABFFA6F1FF58EA79792D517BA3C9EFF1C98EC6C4DE415CF28E6D335A0742F333D6FF6A7B174769A0C280E325197C4553E488722BC45A9A6AA2B36291259071373A1EA5A45E73DA812425015E5D37D91128DF767FCFC86E7C6400D864E5D87B320FACEAFAD7A1F470AEF1079E583C0C6BD95169451AF26872AF283F5D9B769C4CA9CF4FB14CDE3986EA05D1DDC1CF2328F46D8A936E36171C44784BAE6197D53755BAF488ED5A1EFB17E35A14208AB1E00417692DEB08DD73B8326DD3938A245330998806DA9B3B994E8F7C8BDB02FCB9C76AAA4A2EA74C4CDC81D0BAED4A678CBE07E48601AA0569DBCFDE5C8B5297B536B30C28E0D925894D3C2959CA80AC0427F0CCD41E75B81C64406F5EC8EFC08AE91A84393E3EABE5E15B39C581AC9F5A23DA349B86C397C0FAEFC4A06AC7C05D7B9F6FAFFC72C5E844E7F2C33BF39BB8A1143AEDBB24032683C33F4F7A0B7B1A9ADB4AE23CEF5EB1154C579FD0D48507530BFF558CD2A2569B492C3833756D386BD8285FA9B87BB1B688D86FCD6355AE3E37FB6E0B268EC739F347F2C2257E9FDE1E33F8AB255E9B904D9E03F9338837F47EFAFB7AFE2C45496126B57188EF910A3990AE305C0218D960DEBE878ACD056B0FFE442B8325DFF2EDAE4AFFA929075E0DF9C0A2DA07977BE12219206EBEBF93204A628AAA658614B1BC42AEB8193036D75F7A900D63900767C949610BBE832FEEB6DE5EC77DB3A772ACF01EC5E9C2C7F1E2480F442F86BDB95A23E11B2508F23912BF013AD16F5AABD21D617272427E06826F297673EBBF3021A56C5AD28B4CA3FDE5B229C18D2073EE637211254A4718A5DA99B6DF7CC527FFD0192C0200D946D0BD748D8F5445F44FB5871079AE0BD75D53B5F7F296C3801F8B29F073F370EE8A2B4067D5BA895095A46729F5B5AD51C542CFAF4BE1533AF9F36D032A54805B4599854D6DA401A2CA64614D2F9A8B6ADDD72B3124C1A3A9D7066DE14D862540230BE35C2F60E421402CE4E67F060B5F68022552294F3784F5DC7567361F55443E212923B62F3A7DF309F1F8DCBC29D1FB0E794A60D316D4D45E6653EB7DEA21D6A0A75EDCE7A838C8A85F1F5D3EA838B2A46B27A50AE36B0A544E57C8E692761ECF213C14CBF413654082B873F67695B62DA14611C37BCBBC3C538898516FE116E8008E1D6C23E7AF58C265882BF713DDB8A19B454B645B54557FD8776C7A14D1A1A18BF5E8784A0AB997B901164390443FAAE0B0D49BCB83A539C7EC4B7043DDAD94E7896C1EF44056918CB3AB5A3D12EE9437C29A64FC05D60750AFB05DBE4954DB53825B07D721B59F59430F17D84AFBB5FDB73881434997E2B365CD458FF8D2425FD007BBB6E7BC150CFA0BB8F5BF2E06B3FB600711D2980AEA7954 +AD = 9C015A129ABAA9191ED2223DCB2DBB9BA9BB27F2A541008C76F0B81565E83AE8871A93AC0F0287C06CEF3BE5B904570A6BF0ECF1094CB35B00CE9BA90294B435973AB6B1990E8CA6346785B5061BD27198ADA975FC49DF3A6638AC4167DDBDD83B054D7F4EA6705C6345BDA2C7FD54E4FB291154EB3E394E5B7C4A61624B3F57A9AC7A01CE5323F23C4C11B78C3D7269E3C8453DCB69EDFCCBFE24D15B0FFA180665F81A835315A7051F179E2D82C21D09E17D9905018B40BF7D35D02F51962D51F8B0264457E58FB29E38AC514ECF493B06C87A91601305DAB85A051E4577B388EA4C34D19CD9B1FBEEE766C8DEEF71AEEB9429891C9CF0E5AB4B8CFDE0716C26842467029A789E2C167EA379AC3CFBC9E95732B14E296C4E5B4F26514DB41B7C7B4044BA886F1373F5FC729DF877396E4FC213893EBBD85AB718A64B514DDF626326FD6BF841417A43BFBB51B7CF55E415B7018AA0913EBF68E9026FC8C821A71D1039D279CD760E8199457FFF86A3E7C3C235994C54C1D1E83D030E3ED2B17A9D1333A696826A4740F309074BBFC0E1451BAB0692875BC94E67EA3BCA67CFAFE8CBE1EC52FC51 +CT = 3EC8A64B34DC85524A711441CEBD13705FE0EA6E2B8F93DDBD431DCC01B6C254B374E7E0FB2BF44EFFCA9969CAD70F08D9A456FA4D08F13462C6F9764E085C1BE459ACFEE93C131243A4C5DB8CC229972F6C4DDBBE1154F4178D20B1658DE77607DB4B9DA551A837C2665A40E6F2CB820C7E3DFBD6E07EBEA331900E4BDCAF07DDA792AE081AF5626F5837AD50A186145735834CDD05F2AB8E81D24C5784B14B77A2246CEAB58136146770BEBD1583858892F4DAF7BE714AE3B8C16EDB9BCA3F7DAEDF92092486B83B23FB8B2E6C64EBCB7A0B43918533A8C701106BC170319F180D24A41DFAAACBFB51194403247C60944B0C3AD5F1193B94B593F0C1178E4AA936F5116D381694B611D8BDB94F62059A9F35F82222D1A47F0A945F20A1D4BC0F642EF7B04CAAA6FDAE4752C4A9803EB9A1F27CC870DFD21C18F985C118719CF1C3DA194010971A7F0630875D36C09A961ECFCF7C6EA87AB435041E70BA3C55B150D048942B53956A2CB702B8A2552366E0336E08A8FF2F46CD8EEB0926622BD8C42C1C5FD0E01D20D083BA78E72136394BC4318DDBFE28895EB1519936A5C60DAA668629428305A3AEEE69CC0C779E49BDC127354412906CB5079C17E6E00DBB4138D82E77396FA2AC6EBD7C9DFF050B176835214BFF932B45758C520FACE2F2BBCE95214C51A3258B21F36447E5B783FDAEA5D8A57950FC402A35151C3C25E3088839FFE87BC77E1D9E9457B5EAB07E7F112405112D92D84479FA0310B4B78666CDC4F212AB324E629B695796982892EF1C53BEBAAD1516B0DB5706A934F8C68D7839ADBA287AB1B5E38B63AE02E58BCA6EE4FE9E7116F31232B9E2711BBFBDDDD6621A22E5BCC9DD48DAF382D655C0F19614850C22F857F5B0193C9FCA2A5DB407162D0B639C6B5D604034AA1BC85F5BBAB9CEF27F49F47B2D8CB16C36D102F3402B6A8EBB337AB5B745554C06CFA5E8EA45795F203F2DA0CD0F034C741DDD360E6AE71AD5DC1870608DD18AB657420AFEF3F61D4B14484DE36576EFAD357B03A9004F5C6BBBD4AD6B4B05A3BEFF249BD54A6E9E1EEE128F71A3E2DB5ABAD103388B151C1DD27CEE2B7385031575A1A41E827CBFDA4E58D2EFCF49D9143B06F410C162B435C1C3E4631C8115CE6DC77EA0BEA625827EAEAE68084BCE5B9B29CE27438677B88A0CB39953E0349402020BAF514E792D600B423526154F35376D0AA11E206B1D45659B52BFE0613CFB58300D2A24429B0B8C2E9356E8C56A97B24A4AE3170443DCB87CAE8B2A247AD7E5D75701941588CD0AF35084764F7CA8A423A7D1440137E344E97076261797FA40C0A9A3E8E2440CC20B97F1B18A7A4449111772A930E20036EB4C2DF2946DE87B8FBB4D24EFC5E039F1B1A937E72D395D208506DC7C901D21D3AF03EF46E47004701AC8F6F1655197E24498927ED504FE4EC7DC48EA03ACAA060FC70A18E98260741A7A59BD1BBB57F01C44FF27A485F343524FF87A9127BA0067C1463F5844FE48962949F05A10460775D887C9D4A270E485677C6B00C7F60F829029D28044CA2D67DA8C94974CC19757664C1A290673856CC23DBC4F4795F336C3E2D919490EDE9A80308037736C5FA1CC2DD1EF7A68E4F29A17E11098CAA2E4D9DDCAF60B2ED77B6B4F222C09C6D22615A82A3435D972882978767088855E743DE700AEF1B878F3F0ECD798CF769365EA99B6DD6BA8C948A1ADB766AE20DC915158411C1B6D88849DEDA1DBA6C1A2539029C47B78D69E172190318DBD9BDF86F7E0AF9DEFCE3322315C7F81AA59884D281BEE08E41FE88C926DFB4758DED564CEA87C7739BB98066BFB36F50173F4DD218F6700B10446C45B2835F6E084B5051555644DC6A9B7795A2DF6E5A26087E6DABA03B13079E2107B47929EB150C06894387D2AAFDB6E471F4CABD5574CE68B3850F17E9B23773FBC05B13546362833DD36C20A1AF05A61B1520A77F2CF6B89E5AF5D595B1427BC34E7D2DF4165DC6C25B01F9F6BF5047F64F120BC74F62E2791E260D87B3BAD082DE19C78A7C2973CAB6AB8153DF57166824FB7B9C1F85E82FBEE06CCAA281F0223AA8670C60AD79CD12F05F5BEBE7E741BEFDA4868185A52C6E8A88E8B92E2C32652E3B5B5DE133303F54A7E5972BCBF1F8B0BEFE0BE91A814D2C1ADDB836FE57A8F3682B8942D1F35AA9AD76D6F96A78B337166113654BB3468DE6EAF7BC3A3FB0EA7F49F79B77DC1D768F22698DCDCAFF9408DE4E34E440BC5168445262BA9F88B01794190037AE56100094B417E0E2283EBCBD8C3EF6C90BE9F74E01483A0F4C63DBBE9B91A8571C6DA7B2C5063F56234288D883E8C8178715ED08B38FBBFA8429F43B40A3BD2EB4B7D67EA579C16BC20EC7D9E0BB73D700D51044C249490BE8EB88BBA0D036952780CD7FE564A01D3248F67E37B471603A7EB9A225130087F5B782757BA954C7A65E76A94FDE06019A9456AF727DA499B07F0F7518B62C6CA3F46A17864A89CB15338398996346B309FE34B400E551D952D61F5ED982939BCB7CF46AEE48E7CA76386C2B04DE400927C2EB4D37404B8DE1BB509FECB7F69D4FDC1A9DE15084BF1F464C71EC5F0F44486EEFF0E0356FB0D1D823CD1E8819322C8AA67144B0874AB4F63BE24AB223D9B09311AE0F38DBF2987F3DC9EC0366C06DD32C0412CBCD3340930291E32BB310B3DB02BE78DE6E8BE800BE84635D697C458A73AEEC0FE3D381B877A5B8CB440B69EF8FC38100F7933E4A9E0168761A704031BAACFC66493233960BDE0D0DF600B0D7BDA3F88817CC97A344D57040A476A3C2354779075A10028FA4BA69D28C20E2C551D08268EA75CD6BEF8C746247026876000C7672E51FC3A5E1643B60617353F2641993947AEB3EB1369419B9E534AC75E007200027236CC04F1ACF038592F5785B32DFFB5D517578862F7AA8B54CA6FE9552E7600F405D5A817C67D032CEBB2A8117A82D6A63D531456D0FD60225A019734C3B9A3EC4D7C66B0608488CF42B36F10FB580578F9BAA3CB99DC4249CF7BDCF97DEB364DF0B03E17B0159C02021D6CA7EB28377670FF59FD1F4C2381526D7B9BBE5C5588526175EADA0C6CFA8739D5484B4AE11A10F71DB13103BC23505548F3DB8B1C668CBC41E53B42B5C611447BA24DDEFD895B7C45E9265758EBAC9DAD30526798B038887DFF0254A95043CAB3C7BC810E6579C5413415188ED34D1948B3CB745062070CC4A00A3C00353117350936C05E755538B4E3EAD86DCA9B3BE69AA4F64B0C86D3B1F2C6A0B5FD872B3AE9EA0B5F0FA13448C68AD9AAA44A3906899395755B46090AD18E420C6ABBFF94439A28FAA0C681BE0B43A5E0CB5518F83E49097A8E200ECC855E111FE9B33E580BC53F730AED23F9150B3DB516B467DEF50D8A58CE3D172FFFA63F8137094CC34DB5DA57DFEC953FA7842D7960B8C06906F258D06B2AF63224AAFC4CAC3765675337622420834C286151A22687B430BB72CA43D574783282A58DF4CDAE69682DA45685EEEF41E9997F47D73E8972D6F7AA75409CCC97935DF9B185FF33B1F0F9A13D9E5FDEFBACDDEC54E80CA415C44113B53A28FBECED0DFF74A774883D62962EF7A40A56329107ABE1A257C14F4CFCA33B3C2EEB6ADC9F8229A558D74C93D00D25AE767F16B7ACAB909386BF8B07A22CF6AE96624590B5859E4DF618E16EF3EFDF21155A1A6974EF0D378502944795997892B5887898AB3BD52669AF88A6DA5491BFFFCEC9F8C7F45380B55708A426E1CA5ED433898A9E139AFBC5BCCAC5A966FB16ED38C23B1A8779028F108A16710AF411F9B37263490994EAD4E86DDEA080A052B93980B5ED826738A387CE185C8320A17E9C3F950A702C877D80576065DD5D72E037683EA3ABCED27797117B3B0D077F09C31FCC06EB903079ECAF2D0B06C965418D09007B283FB1A45B3CA537FEFE7BEFB3E36EE73903BD5A6C9D02B80AFE01EEDDEB31A9C94A2F68BE851D2DF54DB97C6CF30B86F3754AC3EBCE80B9A977B256C2266A271BBEBBA6CF3413B8BE3EC21D84D73F90BD9A11E6B992D0BDBDD000EEE8F69589685680B20295842D49A88AC42FBAD8E03B7262430B1ECDF69129B2CE02F8F0BE5917C1D095C9A65449256FA8A28EAF5D0CFD3A66B9E00B23C65CB7CC3E4B335BDB4C8C6AA94F08909DFA55FEAA12FBAFECC5F567C0615F977FAFE63A91C604B8743962086DA79202CAFDAF3BEE8201E4E32370D3F839CE29DBCA2D295966F61020454D17440C2396A593345A1426F5543DCCF9A3AE0DEF33EFA29036B12F9F6C782FFE3D93C0C58240D1B4AC65996BF71B17D3DE748695D253A6913164ABC66BEDD4138E5B30520128EE0B8A89CD2DB9A1580FD2605C496551847619EDB7D6BCFC68313736E581CA16F20DFD9C8D269A16C6F94209301240972B5E04648E5A87FD9E48DDA021C0D4444636A92FBFB79458CAD8289120CCD4EE6179B71C160C602FCBEA7705BD34D178BCFE98E43EC18FD818A714053748BA03269E2CFB13931AC5B1D1454461E0E4A80446C4C609D0D23C65F2B97E51833DEB8D4D2D788360E170A15997E0BCD53E81E8B506F754DD8096F3B0069B38F8124B31D7AEAFDA5BF73EE189139BD17DF786CB9098069D3032C5FE4C9B295B6CB12B25072DE78339FC2F3799A9A35971BC23A8FFB1F506E7A7C398A1738C9341850B478D4FAE5CA260BCC941367A05863180B22500789E62B4D5B052C4F031536E98E59703DA0E30E137743F88B690D69268376F8478660F0B473EFCFE1D92C649846DFBD82DFC3659CB3F856E4CC6266B19AD533FEEEEA57A5C8D57687D1F1FDA7BE307B4460858DEE9FE845821CB1A50C60E24BD2248F1BFC3FA1C4C513B76D1A06B81BBA8C5E8E2469F21A4CE3557E5715BAF3C92AB61FA363F0DF9C6DD9A475AF3BFB0576D01C413B5C4DBDABDEAF9707B90F7EA9A767D43A9E08F073C19DCED843EA03858B55737BF6A21CF3082018A7A8782E44B6D198E92C22EBFFE0DF858A23C96ACE1BA7A2A654B2BC7ADCA053017424A10A2BAA781E0487C54D4CB73AC4E9323EF753890F249786FA78669A1B41924DDF6FC238AC71A4F1DA631BE90714588CD5F6CE2ADE7037889110D05F3D23EEEBF2151E8AF64606E33346A91BA6D52CA43C6C1AB9DB87EB23097F045EFE94FF62C7121F072797F2651FEAFD25FE093892F9793C89AF0900566CECE23E64CB4BDD4C51517704A56B8D1B9F8FF85D06EE381A50D6294BA304B27630FE8E65884562F3E90AD8A2082123361E1353310380B4C06D21ADFEC607722C7E726FC495645784E91EDFB58B0A645E859EC9188068F6EB744FEB63ECB1DA2481E8D0D7AF1CEFD3B80E40564140985396EEEC0A62F80C6B6822D3B6DEEC58255D13CF81E09BB56F1F99D60900FA35B1BAD31A3D36113358107BA847F19FE076AF1C6768704EC910727CFBA7174E113B8CBFD3DFFC5E8B059EBDFACDBD417D7FF7220085DFE8CCF739FF30FD79334794A9F9DFE203B57E311BC956704B84271A645A6F7B0997F9DD31177689A4063C8CA4415D7BDE47962CBF6016723E25273D1805D8621FCD105D6BAED06CAE93E5E45E1FE7ECDD6B8FCF56DF7256CC64182DCE2D9F50DDB929A24BBD3656E189A7036C78E6D17453647832C8EC693D45FF38B8DE724B622F168C12C706E3828356826CE139B6F409F448183854F92B8076C88A57B15DE430967358C015BCCB57907B31AB1B72921166C0CB841E6B8CBC365C65C092841D5663DC9E4D43B5CDB04CA67378C5B12E1C861A16D3B3BE57058C1A125D29D66E6113F886951BFC72A3CA190BF20DF4B2A3F1F973726CB1E4AC1CB37400E5986112CC5DCEEDB660AA09495427FBCD269C2278BB3A3744E170BD6A2D48B8540492DDF3A4F0C9A977AE0FD023F390F1A00319A9C2C7F0924074C32D1D3928FCF0A6059B52A8AF2714D2A3BC7F64190A46D43CCD72F9B8452B88EE6A209B2A06D877CCC696C1CB2D96201F614F7C33257AB74E95848E839B49F3152E03103535888E2AF475C55B0F533BD04023902976188D27D805868D6EBCBBAAD30BA122A17D96568BA4FDD141D2E251925188B59FB18818B2DBF9914D8017E108B6AD99EBC370E7E4CF943D53665E2DBD13AB802AE5462EF7EBA54F3C2A9A97554B525FE40A1ECB710ADFF3B55161A2E2D0B93FC5C3E41FD5E27123A97C48165C14062DC4DC25E30859E349D60AFA48A99D7784A4BADEF13F04E4CA91BC55C41B4D84774EB09089DA6BC04F72E1551C995B00710EBB001AF5639515911B8B3419E93D47323B7F7DA01B59D84913CB51B6BD0932197501493978A9A9CE5868A7C461B4712730BAB3EF234D598A6FE4CF4EE7CD0D82EB592BF5653A4197DF0EBFB554D6C07A212161F8FF1765724282300B2CABDA023D7CC52FF7B8F6CD39F37B06C509352ABFCBB637B230E77BCEBA15807E372C668724255C90A731C60342936639DE38F57EAA1B17779A56630266739FD1356AFDAB42C382338AA062DEB68DA6C61DC6D8827AE8E8E4CC11F95FC9256A9CB920B4AA3DB33F6B620C6478F7552D19E50920F4502180B8A38152F97CD08F8FE50359E6AF5137346A591E51A2ECA8FD9EC928AF77480063F82734217DA52AA33D87AA07889046CA968B486FA228CF8C8FB1FDFF0EED06CE262F2BB28B1C22B55014717528E79849CD94325C43E5415728DD485C1A197A98C19A90DDAA9FE9F5C866F8EE1CF8771273B30D65A6FA92DD1E21120D691D003218128F2CE98B9E6B0E59B796C23666DCED3298AC9F4B60827F765612314F534120215F31EB07D8FD12230E1F598A3E981890FFEC45B740C52E3E07FE45398E885881586D9308C3CEF526D23A1FB298D1D57479D41900F3A35820D9F96E21426001484C53A6CA00D3DA3FB4274576EE3A7569CBE5535D5A42BB8B652C3D21E01F62878ADBD223B2D1544D057E1C26A220D09B4DF61CB886EA89021D709886A15F36F571EE833DA05F411A05285F2288A56A432CEF59D222AE2560CA1E373C2FD495B98A4E6165B3D7CB03E766C657DA73E8649F5AB5121C2F7B12BAB81A60F8410FBC3DC23EC6ADAD17BE9D7308C45F8FEEE09245B08C62A0BE995EFDC2D5ED93F54F43D7878B1CCD32CB7F35D05C41A3AE002D5AC8021ED861CD96349FF237C34273924B1C1B67151C561CA1466DDD72AE98ABC9018D83CBC303F6BAFC1E6CE4AC4CDB1BA8E9F437642F64472E58545EFC45CCC69870B4D72DCC703ACC225B014F870D072E25EF5FD4F2056232553B9182D1F374DE48234F6CBE689451AE0F48FA0C204ACF0632A2FBB72B2E325455D0E567344ADE814D47254C729A891A8984AB87B3D49C816997E09C8FFC74956D13D7FC45E82843954273F81F5D7773299E0BF775A37A04AAC390E378516F295BE010304218102664BDA55DE03B067A08F699837E84256700F9EF415E9DFC17DDD065BCA3569C9CE7DD330847EFBF91350A1AACCB9C801A67CF586E1E773228248404D04B9BDA9A23C471FCAB7D1B30FD4076E2C986C6DDF91BF7219030432DD4DE2E629817867E64A93F869944089B16489E71CB4713B7D84EB65BBF5B6947275486781B8D129907B6DABA77A6523F6F37E7E9C2254A2981ECEF7D0FDD12A8E69CEF85AACAD08CAFA746D48E761BB876C2555D9C3BC892448A0695E25A810CE902DE32F2B42AC17A1454108188C7F3E5C2E6B4C00D5DBD59573D89D845D231BF8A5CBCEA1D270051F33876872D971FC48CE0B679952C73EF57440737CD3CA20DF5399F016003B08BD4303500D949C5D1B56B0F8CA565A91468D8A8AC8B271271F2DE6A609E03240F2C0939DB7E492314CF503FB37CDAC8F201A3829D19233F78CC7BF89302A81E4D5C3D8E70A83E2948FBDC5E61E89032D9014905BF3985C35638AB330DC0197FA69519FBE9CD5799CBA9B0D868ACB2EA4EB7D2D053867582B8E224802A6ED473A754CB1F3ED99B80E56F84526CDFC16012CCAD48DBD816FE259F63C42491CFF1C26CD31981CA0306F5CFB2F7F50D5E4CB857938AC951AE1AA5B78C61E26844154ECBC3548F70F7C8977D8AF01ED658D9A25948ADA9B649D1CB60E7BEEB002E8473686A30976BE7FA6E5FFCE14AD53AB328F8E8C7090F38A4E24F44C9B36DC9C6DC17C29258100615480A733209449C24A484080926D9D953A7A9259E16FC98ED1D1E9FE1AF024AE9C242026E5AE98EFD434FCE129B9B0FA00D86355897BDABA7821C734615019578BD946DFD54D28B42B489F7726EF896BA299E65A91877530ADFDE4B7D8496B7B6BC74BB6B6D022BB60FE2E325E1B609E1F +Tag = 2291903A7CCB76130FADE163087E7F1D +TestPassed = True + +Count = 3 +Key = ED7FF268027E105E74AF4D6992020E04 +Nonce = BA5DB213BF9E22DE0B9E16C7CFAEE409 +PT = 222BA5B6A50BBCA4E9DD3E0782BC73ED6FF6B346AFF061ABB3C432F7001D29495DF8AC9B71E766D366FAD53574563714FD04F1CD0C400532CAF903E1D9C4A3CBB4F5A9890FD87B8790E0E0B51A2B375D8C1EF9FB2C5B3D1DF27AD077E484F9A1560A817EACAE042588693D2B5F50179FC2A554BBCAA79F59B78C96950703A30BE63F5E0FAAB8B1DE19D473C21D11BEA26231B53F303ED6AE6B27C720176F1D84C6314520F107F40AF475A1F634DC3BA6CEF432D64E63DBA768B0A482F190C7AAB6EEFBECCC9DB05A3DAA4ABA9DE07A8EEC2051223C473562569DB74063711963AEF73F45E04FDA3043D898A419200A88361696D03FA56D6FB999952EE66FF7CB90E60CA5A034AD9C4621DE64AE914935922E0A4DDA4824098AD08C47BAAB49D3E0CD13321464E70168F98A1DC608C0274F5F9BB765AAF047C1021BD0A765E29AD80A84E17E16212D4608E4E1BE0742820F65F75A0F916E36DCCB701149175A0216EF45BB84DEA9393D6D705CC50F89BAC099C0426E888B469C4D05B3A50FE42FAEE1CACFC287FD30BCBE1CA1201170CC42B651B05617948E64FE1F36D9F6932E8941AEE444BAF8389B9086AF6BE9258ADC3871EFBE34D9974C3B6AC368C757C52AEE18DF638C8787BD1914C690E4227AD89459A185A47055671697094F34D0D438C0857DD1462650B0E931A51F13066818F0EAD36DB540857EC2784CF57E388948408DCF5EA5A9926E09F09B73CA3554102EF05F49FC66827FFFFE0ECED95B31B0A85CDF8536097346586564C5A412B38C233CC68ED93F4CD90A505FA79AC494AEBFEBCA6E56CED9257D18F19702BDDAED4B81AA9D94A2D6680F057BE6AACBAC93D0B605B94744365562A011C14DB4D64C75725B181AF7191C14625E5052F37BB16B5EC64CB721A5064B543AF491151B5A2F2E71386F9379D99CE9A4E5E5E5026F256055EFEE899553CC55CDC5BC258AFF46032124814241D7E4EDAFCE7CBF206552CBCE31BF2C6CA5991D6B1AC6B41C775EA59FE2C4DDEDE21E7E0A01DAC6D60D346773F056593F1A977B8B63D7261130D0376FD7203EA074DEEC1241216BCBD2475EE65F402B210565854A4852890BF86DDA30A256FFECF5C6FF126A46FEF82BB0B81C7940B1EFA4166A719BF3582155E01AD4473B287C4771F0984119B6BE678C1F979A6C92B7BBEA8B8BEB8D51016EDDBD892C29B1F0883CD4075019AD8B5FAC0A0ED4C087E94E62195CAF9C90BA1FEE2A645C2D913DDB2E0F5D978A67A13DFF2C3F83422DAD56D43ACA105441EBAC1AE761EF492F321BCC33A5B12951C4FB771FAF705136DDC17C0D88F2C72D86ED23B17CA305B2F3D0FA23B60F87FC2C8276CF9834917B5AE30AA0723CA73F539FACB88D77D421F5C52CDF762D80CD3980E0057CF894525CA8569898653FB729BAD01763CF6EB4AD55D9D208B2042D633C66F25BA1C25B0A5A5CE4203C88908674B6BB5D696A6A112B58271EC249A9A329355CFE4C5C87F7740C08738A9371CC494B93FC49D0FAD2FCE02F499B3D4810B240F7062C9139182EC3E85C61F78798E65AD476B6AD5A583B8A026C2D3D5B37C4F8C0499C6AA0B8117ACD85E79D70045897624168D15A05E69ECBA28FCDEBF167B19869363EFB7CB91C653BDFD4719E19FD1396DA1ACEF39DBB62FD9FFE28438FDC1E360406CD1A9BE6884C6C1E25122D2D8891BA55164DE2A5CB7BDBFEDCBBF321AC03B63B991330F8FAF39282867F9550D07275978939C5D1535F3B523E9D0ACC584B72225CF2947561C15A23BB601E4CE58B2D6A455C97723DE5E739D7DDB95DE9C52A3B0C72F4DDDE0035C7DEA215F341EE6CB36F9F87FBB300E5770A5A9D8308FD39F536E3407296508C4527D0939BCFF4F8E97106ED4A3E2E870B8D7DD28362B1BFE16920BD5EAEF91D1F1242D4E36C49A71662B412020FEFB7075B34E4197D09E27511B232AE379A3B77E9CE37FC59A49F44D5BC21AE9EBDD17968B502791404A2095F5FD2BA17F8DFC7799B1841B7BBAEB695A043C0E733D653E0B8458297C162E42C2D9CFAD2E42CDCDD593503A490C2AD064CE473C0E1222C887ED95FB25C30B7393414891EB3E3B07466E38DFDD2AF50F5987B4BDCEE244A0B7071540BCD2980297ECA707B398F536834FF5AFE942EB5CE89691AE1E4DB4A0FC97DAE418FA5A73C63647F083FD4BC0928E2A8EEC94C7741BC8681630E9E44A27F60B1BBE011D98F581D9B30AEAD8EB5AC11B902325B467D066C850823432DC41FDC88DF22012816081996ACB147920FF7CCB6FDE54270241A34B5738CD06B14EFD610D224AE93ABE9A2F919C599CBBEDA7610578D30DEDD6C64C5ED4CB58A38AD81BCDA36C0EA48390B144248565E8069F69915BF1487BFF83365C0E9A55F3418C16B43DCF0871A8CC81E811C9C9415054584551B757899FAFDE2035A295F93ABE02A87EB1BA3786F7F89F7F505A35B9F50BBA4210A18A248D249DF0D84BF62688AD63C710C29E9A10BE69CEB80A3F45A8663096EBA71A1C7873E19D2C36BEABF268F6B2F66EA9226D10216247BB7C82E54858621B5F4AD193574E9CE1017DDA0FBDDC4F138C5F39CD1E39CB85B7D4CD076EA7D3EE4C90932E151FAF201C416B92576289EF2D6F68F91EA50D257F5BEB727195725999FBB32D39210E6CB009A0CCDE293E455AEDDA0F4EEACF97937DAEB9342CAE86DF02085BAF5CA5FC60FC3904F43057562D962793BB731ABF2C2B99CB824538835B29FDDC20D295FE37ED9E52A1BA935316588B9E050ACB6BE7493F83B2EA7A1BC3B5B9CA428B255AF0296BDDD4C80D618846A529B99A8E405E91E4D793124B5D63729EFC00C9009B2330ADDBAEFD872F3BDE0B7C3540522927696BB0A64DC7EDEE1E6A52291150BF361A0688FCA2A1610AB59BC516DF18132065C4A76D5FF4E578CFFD808324F62A7D4C362B49D93C84B80AA5E0A1F2C70EF65731C34CA951E62521103CB510DDD5BF7147CA98FCC947294FFF52AA043375F8EE8A3BF332DDD3FA4FF628B90FCFA72CD03130BB0C76098DEA9A0CB9FF4C10EDAA33C686A1E28C9363D048F6A09E29705825D9D302BAFC7880AE0898D119FB03E54B1ECC09108AEDA49D473C2D02ED4C608C61D9624DEAEF474E05F3D9E3C259D53511558F6D67379AEC2E6563C05B7DB0BC2844B821A1A7502F74CB1A8713B0CAFD56E7E187CD03152A3E761F758B86F288331DCB8D91A3937A056FE8AC2D13D87DAA6669638C38FF252F8DF32B87EAA3EDC89253F5F54D6BB34477826D1A790D2AADA1CB152D8EFC0A2EA65E13A077E21ABC0AE38ACFD2786D0AA62F14A6820AB670D87DE61F9EC039A649D75EEF4802DC8577A11F85726ADB296E0A776FD7639C9B9792D7F9FC0B2D4AA9E475FB197DB2A3428F3ED0FB20FE7DA2CCA18448D9CED64AB347B53AD2896C83C4EB9DE4D00FF047D41D4834BBA076A46A573F59A8F1C025AFB066260D787005C25D26456098C2BCB14C64BC76A18F12D110D08B5A12EAD31B68452FA9CA3A6BAD42725E8A2133C18472A85C9D13AF0E214344FC97F4ABAF725339F853A312E702091F343F3098BFDD0EF6D77A8E3607B9470E56754DC3A896C2EC26F73B7DD16FC15A83F47ACEE0BA951F98FDD434F41D224F0C94BC61C435769D7C4461B8A1811577B923B2134E781DABE02E3ABAC28DF819C4FC614CA35F965E8DDD52AC58EC7E17D85C8BC06B1EF094871081960ABBDAEE5C47E3A51FD8C4599D538561157142F3B012D265F227BEB5FBDCC592DE0043C202744000F8C9080F98323307898F8F05CD8DE5E7E964EC34993DB94313317B9D1FC36EA121420AE71AD2DDCFF4B72C7C4DBFC5501A5BE8AD881B77BB1FC4EC56C695E7C620EDE48B72FEDD06872C3FD2113CF5636C1B72B3EAB11915CA5FD755F677095ECF664B6FDB49ED2B8ED2166BDB9599D2CF78FAAB2333DB6FC4CEC1132777100022E112AAF18598223E572518AABD3A24B5F4867D8C5E2B8B8AEB9B0C78C9F417B20638EA82FEE149E0C86CDC1EC2C517849C6D22E0A283C4B5871005EA8BA964531D5694744FA1C7134C8CC3E15F7CC8168377EC6CD1271F827434FBDEDB5F551F0878F16C209344EA961FA425CFD3561A57EF5713CD0781E64702001AB5F837ED27A4E8E67B6BF5F032F1C6B182E9C2A0DED176EBF84151F0E71B151E932A34ADE7B6FE2AEA7F9EEBF966E0CB40D0635D4F6F4BD4714BF4E642F7FF6046D75D18CD28D9CBFBA7B65F429AF2815096B016A7C7DF33DE502C9BC207D7E2702EA52219D80E1806976197A8FC81E6596385BC47E8C88EF8293A6CFC3E09E3CFC3DF23E5C077888898101066379AE1CE46325E722BAA97662629E09DA12BC88D7DD7D51D6DF088EC0D23AFC8B818C09E589EB5FBAB71A42947CDCFA696EAE77C5782F86FB5C46045B97274F80ADEBE0D5952450275CCE1FC33BBD5A030D255224C3371252060D8842E6042390CAC1E690FC24D3495D5068A90FC2C09FEB014D72D42ABD75D88DCF879C0E4058AB8FF879D6C907E85108C773CE6843434DE857E4B6B0BB9F0471B86E554BAD4F0F10FE7FCA46C822FA6421CC6349A66F4A8C3AB3B75CA1FAD4597465109893055A7863BE6AC378061F34E9528FEE3BBACA4923C811F998B26E04AB70D1631161D01B71EBE6E7058613339382724F6BE51DBA9AC674CBF461E0B15065180835BB228881737C50D4E3449DB4DD6615401F99C55317C94AED0527100A34979F6E0BFED75FEACEF769CCE5B782D71616FACA7131CC52B51DF2D79A7B4C6B46A04BA52EA9DF8EB65550A25C863212C815EE101540C366D31C56E1E5874F52AAFD86456BDCA96D376C141BE02AF62EEADF0F858D3B5605DCE5D21152FDA82E06FEF75F00EDA7EB6B80D9A92BA885A82628F60678CAC56FA78068850A971B39C4E614E232962EFD3723190C62ADD9335F29EB2A07A2B63C3988B87F8421E0D4659FE44593A3758FF9F9CE54B0B80CF9A63526E1ACF032212FD8A8AADEAE78164245A6C2C894A0BBB35C300ED3618B807BBED84FFBFF28746DC215BAFACBB04B80B8116B114A3112946A2E4FC0234ECE4D282F20D6291B431D3154057EE5C0E8ABE58D1B50206E308CC5BA90D1D8B44974476DD29B9074579DCD4DE0F52C94AFA945A4DA96337D2CB9FE93116E8A72457C0B903677EE4C1B70367E82D28E3B60300AE68B33DAB341C940189DFC63E8125B0863EA9B5E38BBF989695FB5FB5A2BC333E063A3E611A2574F6C36D5AF1E0D4D6B26C92B50C5D2D22B91AA70548CCEE6EDD9C983846F74F6C0934BF201E64A6A5C1149D590FF726E0E917855673203C39D50E7D5558AC9FCB1D36BBD79DFD145473F144242F955ED665B74F3F61F8F8D908854B0FE7515D1484D23BD94B5F52EBF320D271EC080A4FBFA6EFA15D5059243DD2CF08B2046D12A42FAF4D69758B1654633C412676FCF07AFB504071ABC7348917AB78804A29FEC3BFCDCC68BCE63A1BD94CEA1417FDB6E5DE9DB6B42CA0F8586AC441DA12861A494D7D66A92097BE151634986EDD106119E482B1AC633A970EC563FDF8946FF95322A0C69A970DB546DFA19DF818998B5A5337F58FC46DD602E657E3CC99C570B63B453C2C49D672D6CD7ADCC1ACAEF63BE8A3955C7A698EB4CAC3B44F29F8AD1A20E7BCC35D5F008CB51EB2499114663751A7D3F620144BC1C67751862233ACD4DDB290B4E232DE89A318A75BA73523B65D7CED8214A6EA0CABFB0CD5FD7A5A8161ED7BDE73A1552EC95A53177CE01A8153AB28A5562AB026D88408F735F89C28BE15F9B9C94532AC27CEB8CA53C29FCBD07B825241B53B473D4505FFA85DE8C0BE3A6966F660B81E688C8D8771E5D305F44D26BA7649D708EAB27C743F4303C9D5E80C196928D57FB373E9C527A3C55761FFFB5B373E5A7453607C43E443DF1578B3B189D9B9ACCB77B6F7025001D146ED25123F57B892979D97C608BC818B7FA4D45C73E24B8DB8532FE370375824419F3566BF319FCDC01129FC31F3941EE62B776D8BB55D54919759EC27D5125035738479772ADC4E05169C52C84F4BB4BF10FD54CFFAA88C31D0C527D7B395FAFEC9B6CE7F2A97BB5F39586528FA9C425BA52D16D7CD904ACAF8379665B4765170A1540E987D459479320586923363374472CC32867F1331296C0376F2F155AAC2F6E487A69DB9DE5F989DA5C819A897850051E2E843CB019E22D52C79DEA177DC5AC3AB4EEB90B6C8FDD2FDE16D791FB36BE1F2AF62C27F2BE2F973B88D6480E715C96D460D48A96F9B29FA60DD2020A9B5690DECBED86998448F6BE21CFE3B895206CB940BD9B62338830448C81E5EC2C8C9F31456A4384D5FC4F18DECB7429CEE611EC6648CADEBB2EAA42BC420C036209929430B2732BDDE7E4436D828368130676A66FF986E4C2C07516BF01C793EF4CB5D539DFF91C72E60F7E64867138AB422EB6CC66936983ADD16F3C5C6BDB20505321CDAE2E330D593389EA08803C4F3D6B7DD211C789B84B528C0D89DF157A335D1332506BFD13FAA87232097F7A2D9520FFF1ED090F88CA68815BA226837A1E0EB6AA6C0AFED16D6AD7685557AECCD75E7869E0238D294E8A67E8EAA171D425F814FAC8D0C08A212D848331A63373B9B58443AD1999FA818D5BE1A216E7CCF903425D42B303069EED48B39F0AF7A757F42E341C2D270C5E1A793B75DEE80A45B78A2E64D63005B17EA5BFD1E55A7795B38AADE8B2AFCBDB36FE283AC791BF053D6DE77FC94381C429829E88673A78BF01A5C1543A229208BE522DD708CAEAECE5BA937873F7CB7009E9BE30114374FB85693921CF6BCA1ADADFC17715A9BC5E98B1A2ACA7004C09DA514A516362F77BDD32519F91C81C7AF0789D9336545A602D60975FA0C754851C2F477E2078B777E84699E3571DCCD09428BC2F63B8D385F7EA2402CB97DA16DECC8262809E5977C125ABF0BB76081093C6CB770B2522635BC2873654B4AC506B82058A9A6A50F6CF446D3D0DE3C980E1136F04CC620AB9AA1E06BD1723230C795A8439707E752976D5A8C7B7E45677F906544045A78408774CDF7B6393DFAC2060C4B25E8F10639E458EF7BA4301C6C78FC310CEE2C7D1D67CC1249EF9C6E3F5FCA65620A41969F6F0A2FF198D4D344A19B4D4CFCEDD3E99F2DCE1CEECC5A47FAB01BD9DABA523755A1ADE40C7B8482E8DD98545F113271F68BC2EC8379A0A2BFE806D8C90969F73905E75B4FFFDD13993B341123F5E8D97D99E35EE775B3EBF0FB241474BBC9EF63A11B5929E721F6AEBF4348459F7EB9FF2D5B2F161B0FC351FB6A44CBB8AEED7144AD82EA9FBF9667ECB038226BA6517C7A2547509AD958A157F72E8CED3AE60065D6F0E1FBDF6F7DC4B7295AC790E65508D85193579CD67B44E1929881198AB1CA37CC94B56F80AAB5D99BD3AFFDE9B700D97404D942A8D8F0759D1A3CC6FCBB3C67808FD451AF9947B6ED8DF0F2DB56F7DB87A79575E8878EF3A43FC2666DEEDCE0A7386D59E2BF39DACD22652AD7FDAA4612613F4515B68F0900D0AD6FD6D148FEA1105B92E9ADF8D87DBAB8B612542BA6857C540CBF97CAE0A964590201CA03EBD96689B792176C746866D76B0DD8F6ACB4F6EA5A8D4C4F19556AE98554E6C6A3A6DCDCABDA64047E1FEF9448B05FE2D07DAC5D1AEFB95E9D277062372DE71F71A033C420FC4AD240F26C4AADB7F65905781907A899BBB3ED7E4F845A01DD4028C012A87C9BB1D422DA0C18737EA0D531175CBF14DF76E7E48FD6B2BCC6784F151C11EDA54DDC69B634E4DE8D93307ECD6A4342A51E3B49492AB3FCC50F276C51CD03675CC33FE33AF2F8EFFA986A514F57E542733599F6E0D8947A99EFA4B70D788CB08FD9120A3A6007B2255B4EB0C062BD6D29E4F92C330C86842EC5495B4E41E2821BA9C17635EB08132DD7D18589E3AA3722379D188F508D73529DDB6516BC63D378CCA5269147273EECE60E5B3AF10A4B1B122906B4C9F2BB1C4E13A81F92FC6163FE1CBD3E73A5EB105E3BA952224851938059F4936D2EAEC9EA0A43238F2F49E99CE74CD44D0C977C3DF6669E5958EA05C2148F48F7DE06CF7DF3546952C7812EE1BFC53B0B7D4673B2885566C8007091204D516AAFF0E1BEE07D6659B83E29666537AC9993BF0A44CE1B967F8890076D82B3491576268EF0DE165A8E06FCBB846EEF018053D70D71431C9C846A7236407608D704E503F04EB8BBCB7D547C3DD1501210999E7709ABB5D7D25989FA865BD00A180E25B69F5AFEB2D7A80B801CC6DECB3448619CB1FF0F2B4F0D31A6C4BE257FAD4A643FBBA972B59ADBAF619035CB0B7ABEC63DFA4358190EFA67921957FE19729BE2C262AF0F9AD5ABF1D65FAD8B1942262C05F7E78559F24B20C131E09C42ED85EEF452F8A8CBAF3B684E4181B9616F5E4FF32BE8118B1688D0177E4E68E51FBEE8D9BE86B6598D5066CC8F37187091CF51D3A0A916F56463EDDA18914D50D2832E8298EFA2D8A7F675DB81550BDF606F75BEEC85447697F3654AA8EC30EC1305FA0C1895D7B22C892BAA334B741F680E69B91B9E644D3EB7EAA57A682FBBC589C88B5B0FC6DA87C39263599A435C7F45E2AA7277D07491BCCD50AB3237B4597FE4A982E8C468379F31480C00E3A4749E26348585394DB943F99E32762F459BDE09E9B599D986717A62E346886880D928DC0D1BF33ED43696E03EFF2625C16FEBBC3DF6F9EEDAC49FB30B1255F730EB68C5199A2239989F35B31EA99A975B4491736ADC3A89DF3A01487C4033B1D09FBF5386611C374DA2139EC146D0212A0867B670E29C54A0DEF5DF98E9CD586B73D27EFA4700FA386A25B8C89BC89859D01E63E87D30EE036AA2B77B3CAE63E4CB335D646136E3076D8E16BCD39C15165D85C8CB596FEE32E46B9F94597EFBCBC1D3FD586B23F8992B6C7AFF2A312FCE8D911DB6E5988B5B551A7FF5A74EBDFE825AFB0F9EBCAB398D2F9FFCF4FF08B34BC106B86144E62948A20340A3F2E1ECAE8C6CDF46202FD0E5E429B6088E665611CCB9D637F58D4D64C1B6FCB95A858A4DB35E6882397D2BA135C28D1B3020BA3BAD3EE7490BA4A90F2F6A846933179B5E9F68453FFDD3D85F8E34F232F0223490FCB10C2B9E41320EA56952CEE8B27E2E372E7BC7DB8A3DD95697BAD6B2760F0D25E37C721B7FC05E26469A94710966DBC6D3FBD1A67CB5727322C506866B5C3F6A55A90545FC12C76E2D9194EFA9685D30EF0FDE7A3D56B92DF9FEE8AAB9D7CAFA6B2A1B605195CAC1246388DB2082D9CA67D5A75B7DB53CFEFFD74C0D2A1CA455D6AA847F4CECDF59451D45C +AD = D071F261C4BF86B5 +CT = 80BB3596B416A03AEE989582FACE03EF1175892CC8EA2374BB26E7B381BC2FF3DABC41F0688E52B3BED995CE7F5F22DB14B36BF9463AAC9819B946707B24B5BDBE824DA98B9B293900E602B53976A05EBB97D08DDB3807DA529FBF65546117DA1A992652867552DBCB526C8DA6B55457798535EF1275EC125153ECA7DEDE06809CF0F2A5DBE3D54FB4F4C126C3CCA93401BD5072BF783D02563FAF62F2A80A60855EDB58A20681E39F8CE6D0A4BE5A6CE044238B1A3E92096964AC3F9642AA620479B88E41AA915BE13B4EA2F63CA25BC396E464834472DE4104718EE7D30B5169F3287E12F680441E23ECE95D1BF82558A2AF98146A356F5E388090F50F4718AB3DF7858F5F3CA8DDBF9940BC66EE84F7548C90EAB589D678F5EDE8F900DBFC94E5DDCD7157200AB66A29395559E018A640BB53CD2E92717BC5A8DE5BDF9182E74DAE8E05386F7D1B94EADA7E58CF7C133B8895D01C84BB49B91D3D503D57AE650F5197F9A5EB486B78C44AE03F9130DC7EF24B11CE8EB5DC0A39BAA161751E082D7E2E9E9EC8B00A117E5A7C887395B1D9AE17B71D93BA0853E3A18E3CF47ECE7506AE01749C5DCD998387691CD18186596EADC5C9160C3F75D59CBA4BA854418D498CA74F3F09C6EDB1782A3B5D49F2F0D4ECC87886A6ACC5871D1086ECF2ED821CA63130D85440D6345B8A6F55A7FBDF8FA64353B0DB72C4803CF58775B22D4B000748A4776C4F1E224EBB9FFFE8637FFD0B789F93D25E94F3B5B2F1672D25C370AAB2059B7B8CA558E91CDF96524217EF832F0AFE82F1722DFF61327976A062A8C6410DF847183E5DBD96BB227275F76B8A906F8B286BA35210E5FCDA5CEF8BEB51F071A4AE829B78D31C6A393930C6136A91972655893B5C83BC4FD96B0F778722697CB21B341D9E2052A962A9B3D947BBFA50CBF1C77DA136D20C6C92C95F599B13345BBECFC8FA0BCD18F16620BFDCEF59D459F9EA165E27A75A34CBD12DA6A68FB2A95CBCCA2DD293115AC8533C1D35308723302C760D377C6E5C81D55D8829800AAB1940F0EC61C0A03C1D36C801F9F4819E31D1B2E7B83239896FF8ABAF50229A3909DFFF21FEE9515D2E98824484B716938844E59A0F27FBEA8775C6E29F1F67E2213A38E6B28AA627CF1EBD4CD02273B822550E807B6F43E70DE56ABF55EA0D29286F1A2057D8F28F00359697A8803FB97DFC3C0AACC04BF5127B4BA476D5E250EE41C3164BC5017B2CAA88176FF59E47AB5C503F20571CFAAFF696FEFE5786EA626813A68A7B5B7F000AFA8FCB072E8A0A9E1D6DD0411C950AAB2BE4B054CFE661F4639FCFD230BDE3197D1EC4DF43EF2D6624D6D2C552F85207E3AD1972DD01AB7E331AAEA17C44B5E822D775C60A90FFB5360BC4428DF04FA7A8D96BE1180A7A1BFAB33A92D6D3DABD79DD3F6479CE59B929BC50C43182C6A3989C7D91575A65BD44B862815D83311C115551E029C7316E7F78B513D490E8DFAEA73C4C66636DA7DC5609169614322B984D443188D8A17E7C25B951CD6818EBA4D4B347F2F36902FCC4D63C79677855D1E9603AF67321922D1EC9728EE07583FE4DB306A3DD3065948860A86B50AA610F7A73EE76E6F986C8D5AFFC74E78147F186A66C49AD7870D0BA2CA29C66156A78B74F3813D64557E72F5A805D4AD4A0010A6E4414EDA6E4EE3E511E26DB33FDDFAEBD2E760091F816F008A23DC41CA8E6F68ADE383AA4424572B30D33127771C6D4259F575E3D7636F7D04AF2709F35B30456FFE0D627D2C25D217D3174BCB17F193A8599C9FFD37685F2D6CE634AA20B535392B4874647805DF4F9C6A8A353EBE564CE43B772908A37E4C868B3A7C8A104008A633005ED2025FE10A70F9E1A569D0DD17786DCB91617DDC0A8D4800EB1439AF9229674B86CDAB60599A9D29122A428FE94A6C42477B9B1AE7C47776F7B22A3D714C7DE93E16ACBF1B451E7BF786CA5CA5F6988FE62FD94645D477D2FB339A12563BCB566613BFF80C1B296CE3AA642E496F7F4159F8CF03E1194CDF1AAF5BE5FDFAB38C01962C05CF2B31B1817C34F7817682F1D8AADF0C99AFFD465FDBCDB803F82AB7FE41C9DD7E4656E2BFAC343F2B8F91B52434B515D89BCFF42F7C3F0981FF3ACA00C9251E2286C31A9943834FE9CAFC2E902BEED2F481070AA06993358ED0DDAA5CFFB4EB14D6C4456735A286A0CA23F266C1BDA463BFE0F0518CAE3F7FCF0B73D939F6718E1AAD61DDBB721668039B0175BC63CD73714C3550DC3B94E517BC47E77E81FE60DA426001CE7D96CE458DADBE4618AA8524A5366BF224FBF6A477BB30A2FA4010050E86AB91626F7BE46E11E050FE20C961483CEEF468AF275B7F7BB0466CD03717CD098B4C22E7C5DC6A0F4F4A1BD29FB62A77AA0F58C8A6B48F6DCEE93AC178FA1CED505DDEA04B40A6FD5DC35B4691F7108926A9CEBB722F9D1390F83982BD4247CBD1D0B12210583F7B02AF4A7DEDA5BC8BB4D7BF7AC7C5578A277CBE610DC8C321816761216C796BFCD4FDA95CA695154CAE679A727479281B1001BA4C81D1D9003F699FA3607EEE5B366FC1EE7BBF71315BCB66B1161371D723DBEE1BEB4CD4D1611B0CBCF2276DA10B7562CDF4F7280F8737C1B4AF92ECE8203A5F48F087186F1B3A4395878109172200879571943B89AB76635B9EA6A00FFD9B757C2F353105BC0606BDB97DDD5DF8542485A00D5ED0715C801CA65459728C5B4C6A35D4FE93970968C860F94447E1302E99980B3FDF9912E666FDBA79B60AEBC620A93EA6E869704906892A8C9B583A648AE283C987DBE2967D164726F803F2432F111814ACF380F028D8CA8C79A3B3380F6E606FEA78EDCB25C18AFF8C62E4C87126D8539702FD0F7F7612FF788F1096796F7DA82AF660EB58E409CC267CAD7A7A1BACEE17FF42EC3E81F199F34D3DE5F433307497EBE32E6565CF923623F779CAC294AF9E0073914441D818CC4139853B613A15AE3654C573D1F6FDE3AD2D122196CBA708E6F1EB47E2C7DB020AF8EF2A20264EF94DEE6329CCAD39FD84EC5FCB8DC56E067467FF5EC7AF8C2A6922BF90B462808C0CB9991BD0F07E12C6AE59260C4FEF378577F3CBC022092D82F622B8A606612EEAD1969AE6C1988B95DD17B61024A4FB8E54439CDB9D49FBA16B08C9D25BC28A9151C64ACDB1B0403AA5D033C2AC8DD828CD686A144B64BC74B2AB92A91E677E29124110EEC0A547E90C2E8B87A8D1C849D93192ED3B14A74CBDE5EF6D7626ECEDE8E2AEF3350D172A0CC99B4A7B622BA4B7846A72D315E7098056F1A500D5292BB72A80AE2AC4D6A0A213B46C6D8023CF803C5DC30E0DC99BF672412B24F5B357EA841D050BBCFD799CAFA913E0A12EE7FB951CC616858576E5114D7C3CC345843D0E88820E4D9B388A0E877CABEB11F8A6AE893DEC816AC19CDEF8EED861B8BDF9D9BDF3C3963C19A6F341DA979B28942FD5DE2E098CF80239DFB38C9EDF4B92317D866984F76C7CF62BC7121D82FFBB4DFC0D470038526AFE8B534DD8E27DF6C82B9F72A288AB1985634D9412EC6B73BA1594F76DE09096F2DF335A43B890A99EC74ED0240D10A452D4BD296EFA6A52F54939D49F52A0320F0BC1F1811F708FA77A85C2E40488E2EB5F6F531FB96991590D6BECB6247EB109AF45447C7E65D7BB398A08143519E7996AFEBA009CB845EFF80392402F20F46BFBABF8CBB78AF41687FFE2E20ED81853BE4705631BF7A72AAFD0625BB08721AC8D3A26AA8563D91E8D862089C702C292FE643131BE016CAB178D1D618FEE03D2474290AF594809083BD96DEC8517EBDE05FEAFF10330C61AF4E79D27DCB3BB621441EDB8022C7200DC4F6C4B11C4614E36F03A3064BC9747B11A0005ACBB8AC0D2FF127E37ACB7467D4CA25B4FBCD0484E8C94B2B1D6FEBE77352B9A3A5083ED1F47A89A76386F25D3FD7F8EDA938B0C43CA893A38ACA7A6B813EEBD43ED7D2448F335FB1FBEC3A8D6D1D120136BC7EE4F2BEE95BE15C7D773C3790CE989118AF0BA6C2CB7B17A4B7CFF117FF1BD040245B426CC80C0EE6F58A80CDE23C4D5683D82ABA6A1D51000833F0E7ED4830E3B8610B57E36146C7375D431F61EEB72698A4AEE70206B8CE0E64DD53AFB9502E9DDE0A9D7E9E00255EC4695225F5B15119E2E392CAAF74C82CED303088C1F008F3E80BC3C9651965BAC1E6219E632EBFD78CBA3CFEB98F439A611329E3962FE6C1FB08AF3D2A1C1BC3B5D9B56B4C83F26266E3B39C9762FB48E6BE97529B4BFA0E28B577F1CAC85E49B6635A8D389680E85AB21196724EE045BA5CD4FC373BB8789C99FD150B807459B8EDD5824EA54DE0FFB8A0D21C66217388E3FAB0C041318DEC6D602022C49E310DA8F166EE72CADAC619FD2DF3E705877DC12FD7100668FBE140CBD1DA0575D8F270F50243D37D66D21F084FFB68530DE4E5F651FD48193A56A8BD797293065D5D5BE652625B7ABA356C2A27620DCA6FB028307FC3F23A7AA3B804D0BCFFF66E1BEAE9C3D2B6591485F8EF8EDAE38C80520ED25A3B3FDFAFB65F6CFFACF3EE6E8A83A5672F2ADC051E3B00055CF184F61395486254D6BEE2A756C702BC906FB1B8D74E140874A063914EC1DA35627637D450DC0A1BD8DD45E8F461C09D52A29ACCED0CAA13F57B49D596007657B1704BCF2B05452F8A09D303EE07F2717A46FD440A05A67AE3778020D5A3E3D06F08EBEC98917231C29230978D0CB741A4F8EDABA7A9C53813B60437FD3ECDE8F6EDBBD2E71CD556F2A7CFB46185CAF3DA64F566875F0AE9AC58D0C6DA4928E69BE6FDE84475DA8F5BD60C7D4BAD46F78B70C70979ABC10C55E021F059C7C5055BFB608C18EBB28F918E64580F7088A8C1ADBB1288EBAAA28EF80540C92F400065A5B1997A6827E78CEC1807CF8C0D074440AC5220A97FB6FD41F1BA0E56D10F5B479E088646082E9B3957E8CA232AD0A21FCC97A1619C4295E1CD284587CF3243D937AF0022A09FB12493792FDC060A7C8178F72A7A033216D472C08611721AC7DCF94CDCA135272E6DD49D0AA05DF1F347E32D4D7485B9EC6F3C4A192AFF726B661392047B29AA0F0CF2D38EB4F2AD486A2D4323D49AE8C0592C3997F4B6C8D5B3418C0F31A594CAF4C32579ECC2E3A204F5C1543F45421F92CC54A7176A73291AFBFA52913583CE459B0302E944DD8F2EBCF29237A3A3C319690FC34B84BAAF2A8664E9E37E81CFE0258B4EF751A8FD4642FA1CC5C71212667B94C04B98D4FEC0D7850F2CC780D9571F2A796C47550658EB98B88401B6DE6564E1DC9EF865D2D4A7A5A25EC72502FF77AD5697AE8D448CDE2C43E52E25B4DB9BC15E24AB23CCC217EAFF730C771625C2019857AE364F2DBE4424358A6009E7558907CA90ECB8294969DD2FFF1AE7E83C73A9AFFF2FB2EB810BBB11CB90809A720E49ED010D2BBB735B2C87CCDF0675DDA6D1366B07BC612C284869E57335E99F936FBE221761A7D7B1A10517E25C4C8774929DB4481D54B27DF86B4229554C0AF2472389789F3375993CE6014CCF2706F5562400176A25D34E9C60CEBA3DF4E9DC5A0D90F899D7394E1955A82057F135105C35B5AEA4B566427CCA8B6493169E549FFB051DE251FDB9C28757D66290824C0F34F55D507AAD29B881830C52157BD643D19BF6C0CDFF08F1771D9443ADDEACA13AF2E9CC8E8101F768A5CB5844528B1F7BC1D7D81381D64E83733DE5680DF58FBEADFCA7CACD438C13BDBB0DA2A8052A607C3DAE8E884DD68E8B21BD84555D07A276DBB83A0580BCD573552770486591732F98EEDB532BF5CDEC4ECE22FD71918649E67C23B7FA7B2F7D3491C6DF2A06131CAED0F624FBB03C991BBD351A7211441468CBCB8A787E9F65074608B24394A5DC2ED39AFED06BA05C8A08E2B8913D4CE3CE5DB539575A371CDC03FE6B84890024E5CF83E57C2833FC2C2448D918468E31C1C91541A58AF3F5775BFB7264D7FC935A21F414F569C65ACF4E11EED965889B8FCF945902C76E71A08F99620027C0FC201679022D5CBFBA2B0C079C0383CFB42134F731AE13F1CD0880070809C3CED4D0EB8BD66471DFC3A27F6B47832FE7F9FB88F4EC782F2FBFB3387EFA4D388E51638CBC3C44C633F7C749FE9E3E354DB41719ED4F4A503F22818C12FAEC145879E30B523F2EC153CD533DF99A7F4EDFDA08035D678EECE478B3418AF6CF226A5F13E2CC75B2661B0C4ACFF0302F763460027E27191CEE0302CD3AAACD85E6AA17E0CE777A02273157CCC1A71E5E07E867F8AA0B48AFAFED62D228C0E0A5054B19790F03760E88B61E71A047CAD0F98540EDEB5168F1CD65239666F10F654A37026ED998EB066285B54C9B18A35392202C0B90B192204675E1C176ED2FF6A37E5E3AB8A055A993271CB6AAB8BF564621584D5F4885189D76C163E62DACB5609B6DDE62B4803949C2F4D35713104792B6B463D746FA117452348C609B8E4314175F74DDECB601849CB65DEC70A8EC7149E0D0C1A0E88A44D84B0906C02435D5871AE4481D6D8D9FE05C06D75754B4CCD8EAB0BAC1349CE9922254EF252ABD0BF8E93D9355A9151AB54753F979B7DA437A89569FD56653CE1D006040B6E191BECF40028B7DD58D3CBFBC493EEEB4AA9ADE44F16E42A44A17C96CF3F8DC59DFADC6BE4E9F1BB7D5E38B4E2B1A960FCF9E7DC2506E7060A405AB5761689DA54F4C95CAEE15E73CFF29B68A5B623BDC43ACAF2ED3F810FA81EE9325086E555077E92B391CAC27C1472ED8E5FFCDA5CEEF3FB3BCB263B2BE7574B0EBB22EC9E1A2DA3D284261C035DF93346D71D876DC17FBDE4C40197D6CF61807BE9D1A43600D6DCF86FA671FFF784EAD89BBBD84AB067C4E5631409063818F19BA4A93F011746D8804EE828DC9CAC18C6D504322C8AFB6E562DFAC4041E15FFB95402C222FC7B6C0C55337709988DFD5D90468D5ED3A14C9E2D2C43501B9C654410FF3B2385381C80C5E8E5C19AD4971C6186A458BCC30EE0564827DD9B12894ED7126A0F55D4C37BC89DA92DEA356328D33FC31D0FC18798A2FA6943305ADCDED92997D6E8D281884E7C022B1993004FA00525DD723EAC81441BE30836C131992F10B0E9E7AB046C6CB7D4D2270306CFAB3E2C123A8AFECFA3A957492C0B268A7050AA83921319A9DD6C0994B23C6588A0344EB31C902CE7DBBFFAEC374D3AC6BFD34D3EC083A7A9934EF30AB73AA758F95177DABD197469A4CD281EDA1592C871266DEB53140C5D30268A5D3215115374572BF5C68006A26EE134EA3D1A24822C8B66D6A5851D33269FD76411C61884B1E9965034B4E0AC0C2D147F5554C9717527BCF85C3EDA0E8771892EFC02C30F103452C9C884E82CE480C9E8F3535B7DCCF2B983F47E8D0FEB3F0760DDAAC688520103D7303606AB65FB263E9570EA195B6187AEA5DC9CEEE736469F4B9C8BFFA37A81C2A9BB22F84E21423B02A2DB2D27CB86B7CB1B4E089E07FD25C45107D8E51ECCBE7A7ED02A93EB9F7C16C83A5F5E3A6EF188F99DBE9D941574AF65D868F92C890B311B5CFA469596736011A349E014C052E2B05342B60EC243B602DD5A91B75F9C1B6C9FC405AD1322DC4BB3246A28EFCF4355EDC5050044C6620CCBCB405DF4EB7FC91C0546B3335D46B3FA140019DA4A763F7B34663A03630AB841B1CDA4513A7FDCBA1A74359D8F87B8AC17DCDD6A199F8590913478B3C2836D31C7025F6D59D3FBC4E06791F26D5CBEC093A441B41E8A6895103C29CB73A2210472F7E447A4EC8C0DD49CA659C8845B8AECC09BB6BD36D88C2127EB20551AF0F5D00F1CCAC0ADE14A9D12E02949BE48045193CA7451A2712D5F122F7FE90237C0022C0A7E4499D8FEC249BED00CAB1A493A1CBB641612C0E2195B5E0BA5E5149CF80960C5036295C372030188B794B113F493AD4506D18E4E19E295F32F3B93723AB68C6AB479B1BDBD6BF106EE96882A787D6BDFEE803A597D7D56D9DBCA7625891FEF06D9B5C2A2D296AAC2B7BDBA7F09EBFF161CC61FB65F8138959ABB4E11BA193D5E929581F372A94FFE458BE0E385BB29A10EB4C5817ED72B7B5948C59624A2C30247A1FA6A2FBEE2B48C983F7185283D010185C4F16DD927A70BF00EB7248F353CF14E815318BBBD138C81ACEC7B66668BE728F69CA3995014AEA407B8D5E85E0BD87F30459EC6B2CC13F67CACD548560C3BC6901452E6BBFE22D2356AA3330E04DCD6D7694A60A582F8EFE639D95FDB96DB3D406B4B2872C1EEF38F4AE1FD7C236BFBC4DC36E33D2EE837DE4DF14C6A9E748AFB44AFAB710909CFB2FA965AF57A98C6ADCEAFCBB028DC9BB19CDC6073227D386F92AC6531F122FEEBFD3B707C65EAC9D08F0FE814D9D4C1940D120F8C0D97DF3651BF37D15E979E8172303483AC4F07852C2CEBAD2BC21A430867835DE796F502A6274C70B90B7B410DA6BD44E8443494978A99F60C441C84457A580AA4C19B1933B52F8D30656AE1844ACBD958B7280DEBB849A30456786A95D38466D0CC9B18A4AE8CA1FE41A967C7A1B3841F166C23273E6882CEEF6B8D456C15DFD19D05ED5A18AF01299B816DFA4310074F322DC1241B467C1E58DD8F3740638EFE38A1645E26E2BFE6C00377B674650B5DF4AE02961CE66FE2BED9149635D18816C94317F8C55A1A0933C1D941799ECEBDAE299AFFE114A831A8562D894A748AB143A0A390BFA801C456908EA79A29AB483063448962D8D539ACCAA8DC21F769AE530332F018D36C2EBD9F83BC46C34C8C7EBD23A64F2494EF55E38299CD1F1A2B343626CFA8EE1DD0BFE4C7D5F0A67D7C3CB9F6768D12A0271AD2611D135E72F15A4B9C873797873541BFB5420D95CA157CF69064E5B5A88332674374E556955BE14EBB678CA206ECAB0DF04DC616D543C56CA3AC89C6166E7EA27FA6D092D841D17ED8CD2F400A5C3C96B2BDA9F7075DBCDB26E4610E15D6260DF480AEB23C2ACD14658F94D9153F0916671DB02B94E4719123354D9D0EA8D3AC510FD560CAC033FC9E69164D40B9AFAAE12D759BE5D85DBD9E515AA0A207D217B4C11787C65EF1C4978BEA663537211FB5CA2DC583F1CF043728D87180BBCF0EBE1D5E0A3003A59A7957C4B499CF81ADAD3D0B99397DAA884C81C72355A466237B37DF4FD936B5013D864E5DFB43E7CC2C5BAD9E64976FC92DFA792EFB2A27590B42A7BB2813E67E8A07CF44C77A904DC21401C389CC4C1B0EB1CA548DDB5792B16D7580EAE7B1C993DE3A1C48E58291769B31CEECE3C18748DD4A55C3D69F745371E473CC30F3BD0BF5E266402DF5C0664F22226AA8881119DD02503CE4F37402D3771F865C2 +Tag = 437A9C27D187D56754045402AD70B3A5 +TestPassed = True + +Count = 4 +Key = B5353DE617468AED4ADB4AE8A5302C3C +Nonce = 8DC3629E9308AB11C3A217956C0DBC19 +PT = B98FEC3B +AD = 2356 +CT = 7B576FF6 +Tag = B7D5AB0FAE77FD89D77D75EE11D73E00 +TestPassed = True + +Count = 5 +Key = 1B79A77E7D71324C5761CC70D3C7D715 +Nonce = 3A5D7D0B061C48AC94B1323A42B1D191 +PT = 65D051A50F02638A78CEDAB8201976E4F6C3581685808D1E985F0E72279DDC2A50549E738461FAB55A13DABBCD388AF803A09E18F50196E443330CAFF4F162DAF1AF68CB7B025F95C8A3BC72A6D1515FD5156E87FFC4354EBEB93051554AC168B0FFC91DD0BE7D0140094F5145233D71E1ACDADE83DBDB2D7A190DC1D10E407EE254C2A707348F16986C46F674E3099A7BBF6FA870E2E5D5239CA3B7B1BB2F31C8D16FF1619669AD1DC3461694E5B8970F7246129E970EFF6FEC836B90D765DC3D142DA3731838E455C28BAC9CCE413EE30CA73E751C9331C36F827513FE1C455E69D97FB71523F63A61BDDC0B6263A0AB4588842F26672081FBE00496C3D157A5464D32F4C186CEE9B004135FB625610CE1C9CE7598153702B8FDBC351F60768F6536C51430ACEABEBA9B7E2253C1CBD57FF7B5FA03E10D3115303BC3CA98C9508D83F97F604CDB35DF0FBBFC9615AEF732E6B627AB7C8C832994FEFF7026F421D12E94D0C74B75321B7F1BF325119A00824491E4E2A2A511F77556CC4EDCC5B91B9A2A6881DE2FE671830B2B61995E17F9FE7D2B940F3E2F8882D851F5A8E33FBA62D78BE6327EA414AB735E967AB05D173ED3505E99240B5CFBDFFE05DEF1C89FCC70FEC1D231C67FD916E99CDF980ED17B3AB6D593E1203DCB2FEB537F9E36B9AABFCA09B19C440D0CD084823B6F7C62D02D8AA43AF30BEB4FC1F5A34672FF3AE02FF120CE051FDEF5A9C8C35C9E025CB288835214927EB7B3DFB9F0A7A0C699D14AA20B7D5C94CA0DABAE912B488EB1BE99F1BDEFAC264EB13A6DEE4C2F3754E22EF111FBF7DE56F3B84568E3ED8B6A5007310DAF08AA2423535942EEA57EDE745AAEFD577DB6C7BA9BCA3667BD6AC3AF039E44FD29A5D983CDEDA79D9C674D3A67F4893E8E13D3516953143E74BD66E99693EB073AE04AB4D4798A8F0E2A1E337CFC00C8E18420F0CAF393D5909B0F0F87BE07087C460086AAD46A148944433F35E1C277BC9E071172FB3C474C742339697A074F2315B635FC791E0C1A0B6786AF53A0AFD99752E9B6F596810AB93A35B030AB0E3CF41C202A8C7B4380FBF66694B597F8D47360D1271E982D7E352B423FE85CEA605849BB377F854C1C0F69BBFF2FED542141613CD0D9E71E5BEFA1F4603804989E0C053B6BDBC154EE13B517B5DC2E4F48D720FD861F1987702B5F47DE90ECE30BD11CF229B1E845800D4EBC23CF697FC152AC881706117FF37ECA407C79765D26D20CE4BF3B2597EFDA7D78D05C64A1C2E0868BE464CB04BF9DFFABE6A7C90797F19651C384BF852D15983C8999AF9619297D9BF2EA78C2060725223C79B0471176E1DFC613DE3D20015DCFCB8E7B25ED6991BC292E14AC78D44ABB5F9D48B464502B13B8D0D0064B407AF08DA9F6778BFF34D3E7F41EE2613466F2C922DD83B8A96A7A62686D1D998B71E9B3231FCFDDD22F606975CC703249B18369DD3D2862F738E33E7C152391163A5C82342E3D159614F6F27D1A43DDF94719B7E9B4BB4E4886BCEB3C9061BD0CCE523B70EDFE1A736ED3C94635E5DDF4064534FB6BA7627F0D3AAD7252D906B239E6AEC7086C0C49FF437BE1F10712A1DEF6354B2DC1A027F0BB62B250A72195CC160D4F3615EC9938EAFC282C818D06280C935BA3BA85774586D74C0A59F85722E514DAF9C26AC90A9C1242C578FB6F2E5C8A4413C5F21291960AB03EA08FDFF2A405466DB30C66A1CA5106A843B1CC8B681EAECEB4435CF3014963B8BA8A690D32502072B4027B4F24A34973EB6A4EE43D24D682E1113D61A8526B69A8ADE63FE8F975F2915AD666A25EAA11F9E80797FA7F7A96B4E72C2112BEC9619611A676BC0A8BF2F45B52E34D6FDF82662C67BF4AD36E2832508A00CD53DFD29075CF91B73355EF5D15A29F2D97494507A9BAE6570916C3A27E436C7F8B24A07B8053D8A04DCB33D777623530CFFB9B0745F82499F97B865E0BEF39EFE970D1F10123AD4470A4BADD870FDFA7E193D282A864399200078205CD7A955E9243EE0790442EAC4E5696A13E4611E99BDF7C781DB64784363FF0FAA0A877F60F5C4B4321D8169D65263351CE9853BAF59869EDFD1D41DBFB69D05153340BA6DF9F91E2FACEC8C3C8DE12F682F5B59DEC3604073E89F8F21B7048B707C54A311A8D722E0771BF27D0A5251F0A4A5806B433651C2F036756A79FC78A8610BC0394E1DCF58386967A77DC379864D9E8D0184103D35F2D0117251C8768A935A1C0E9218A286D62822D9CEAA552CCCFF1CDB7F672440CE8A366DFC5D067FE2ED1413B76AF424EBF62B5BFD5377587AE4A562ABAB0B3C35DB3007D2448A8921A2F6E196317551FAE7FF793BC8437B12EDE307A793D447D1D7EDDC3AEC52A76BA22A4A6C85C2397F5367B3BB91F06D97C4F4F45172E19DDEAF0FBE5399271E95480D99ADF90E8D1BA998542C109C4FD7704475F76E45E8B08C6BBD7613E5D62C592E638466BF9EB667D8A7EA8D61CE12CFD6E354B117370224D9118D410707C3B227C2F238BB70B0B5BF8F859E0E332AADAAB63D02817B31E7516F8DAE016550D0E428559ECBEA145622AEF197B16416A5F6EFA650CAC130BC910AD75BE312A45A3EA4B9D5DD8BD1B0A1D6DFE279AA35FD48E7B721BEF00612F7990DC112B873000AA7690CAA40C86B0DE5BEE3E14E42E6C4DA02FB6B729B3E9E96DE348E10ADE963DFE7C2413943081F4C23D9412231A95616FC48B577A4881C2A6E136293ECFD47D580116680A59B86FAEC2F4EC1FD7C6534EE67146523FC2B5FB616CB3FA58B5F36816B922032C57150B1CA9B85394A3CE1AE2DA585D8E2B183E616CA8ED0474550C0183081DA44F218E5B3A36960A6166BD9D99187D5D95DAEBA0E3A2C0AE2806A753AB52119AB07693B9C90153F48233FF05EB4F6B5CD8AE6BA91D7DC0AD61DF33348F425E0F5522EC2284C4949487F61DB0A2BAC3D99B4A7BFDE6687D33B6E558EACE1F6540D4F0B0C86249D7131AD721275F0F0AA61B599944C76129EDA5B96B9F6CA9C56890DDDBB209FB76517267E30E4656D4A6DBB1CE7485217973C7C322A9DD38A77012B9968134579C20E247D15F7E1AA64FE4C4C3BADB50E26F6468EB46D8CD733ABF72FC8DBF53728314AD923E4F1AF5AC1CD3C41875EC94C1D6261DCB6C564714D3979F0B1D198F91523FA62DBEA4204A733E2A05095AC4D2DE3BB79835A717BE657D6AB77AEA8F034332C6354666033206D3582D2B420B79D2CC2CE262F65CAA27E8C8413968CF89AF27C1D6938F8C77388492624FEA922271F1E5AEBDACA14CD61B0D5D9EC1F89D03CE7D048135E5433FB5AADD64F95B3D56A5CF488321CC028574FF78812ED8768BF45E806D8DA13B0CA26E0702C3E8DDBFD007F9F1B01AE2027A7F0C366CC110DD33516F9BDBD0C903933BE0B2C4FFC28C22B8B027DE84DAD97B7DF20E94059FE05D2ACE717841E4003EF55D75392F3E7ABD8014B410E9FEAF7795205EDDBB6F8E9C00559A315014E0D4B0E9E82665A04B3E775114F1EACF732B1FFAE22185228286CFD939DAA3496C6B33E060FF158811F5D41F666A5B9CB130E16E115531BF4E8D6662568C66719B2DE4A8BE096F741597E9EC4D65BB182B332709F83438173A7492D299B331858F62843985B2DEA7C06D597A6B4471E9D14D3723645C7966F4CC6E4A779CDA6265645DEBE08292785480488ADBBEABF502A9014B7C0D2032E81E44B944932F2493F61407E786084EBABECEE414EE8A36217948CE9B8EE657432A02C23ED934C05024F7E5A9A30D7BA0B290BD3E3C1EFA940E98CB4B61880410BDC4BC844610E1890E93F0F6A58C7D6BCC2DE9FE2818060C082E30416975EE9BF3D5ECDE51F75AA1AF3430A82E03EF811B5F7E339F06E7A4BEAF7B18E0A02099A45403CFA09E1AD5D2474EF4E75DDE053EAE2609F6BBFBEDED4720A17B42C10E139703D9FF1FE07C45A96057B7F3BD60D076D9317A16A3E95815E2587D785A908640E0505905051FCDA9C34C5AA336FA8AC0D005698F94FDF41A80EA3D88FFCD4FD0D176126C06CB70B963D052568EB4DFE7CEBDA75426F7ABE35B3F841AE245AAF6FD8AD2BFE71DB90594B02BC3AA9D8BCC0B55B94126FAAADACA2F11C74756D71D265C5804E11FFFB104A2C076CBE839BDB4B70F8C8C68D003DFF8F4B80CF1BD3ED80D9C4D4586EAEB55083D8339330EE2F553138F464A91BE8C5525E92A47A512E4829DBD4BEC782DCD2336842B4CC9ABEA12C3B8DE2EF78E7CDEC1EF6101C10E622A9FB696509609DAE5C122130D923F8B79FE1883EC34B58A0E416D2A89CCCC62282100AC1215997BB9DDF86CD57A6F4C8163E702A88A75F6E92C870F29DE5119F5BFEBEB91927864659DCA0F3B49B593D221A925E4CABA9DAB0AC3E68D8951DB8CDF77168F83BAEEEA839C0BC066BAA077F33D08342B342B044E3F87CF92D7DB4BEE835CD29E044E66BB3B602DAFDC454F236F994C49A660AA4B114144321E58ACC0BFD1E35ECDD8EFEFA179F0D4FD5571FA38AC223D8F024822B1868DC309349CE2B36CEF0B61F05597AA5DA72D70D64DBBD04AFA72366F31BD89C1AC474A2CE56DDC0D209166669847568B93325A1BB1DB38D1F3BF392AAC443B3181A0430E4C7D773A5063B5BC5569B2B21CAADBFF636E0FD10E79382633B260DB5534E4F704483E15BA20CA4E257C7B890D870E01693CCE139172FFD24451069E02DA662185BAAED36CC54442A3C0AB92FDAF18ACA45F711965D06691486BD068192C4C4B15590353D83A95A4F78C70D0C76DD595385AF9A3684DBCB4531D8B00F4DC287673607CA3ABC5D36AC9CD21D96096CADA963B2FBF33A9E2C89D4EFFBBAF95AF1B63F95C67F131E973878FD99B2BE254BD52B069B9AC6943CA7DB4065DC618BA331E0676663963E96552BC37A3CF469CBAFA4268FF2BF56EF9B592E93C2B8CAD6FD4A57C256CED83EFC60367EF32A0FA36174B6383AFBB0828977CB1A779AC3AC50FC8CF29CA774E0CBF7838278E7EC71597B225DF2929BF199D548DF03CDB7519C9A1E069D1D06CA0FD56C33682E09918B59B10C7875A9CE508B58C75E95DCFE3031E5EED9E5D44C64584E2D2658996BDBA743AA0CBAE926E04FA601B44F6B69F87DF336481AB7957574A820278CA807F1FCEBB75232E18548CEFE9A4FD28814ECE434A8655313C0EFBE348812C8FF6397AE0FB763B417C58C7DED891C2D5592FC83333357FF92AEE92AC7940E59728FCF9AF2A1D2D0A138DC6F2BE7759AA4C258919B8F85CC0BA80B60DE48FC73C722FB5DB9812AA3C01BE20A66E8D3BB294E85F54B6CCDF2FA038F5AA66202683C68A7F8FC17D123A7B4C17FAD8B5522C450378FC2F7385A650853B5F1C00D6E1979CE0E30EABF116D525D96AB4E557EAE6C96463A72A535205D83F3B42B21D7A7535623BD56F1D991162260A9A1AF16B2E5079539B733A6D498DDD366CB6D422075EF47F821B1576ABCB51450348B8EBE6D40CF139CADE02FBF5F24791E72D5B8D03033B2572E8133B02A8D021F56900D5F24F97A9E3E93D80F1848C28CEE5C39DF6B700457DC574EBF9B637210EE1058CF2729E9895B1AA1AC6BB34EE5BEA6C1CE4322B3D69BB572DDBACB02DB21B71107E00365C462A07440DE67EC291858F0E491A3CDBB5C723371A71BDE9017D67AB49236F5BB410D6BA2AE730823C959B551CA1E397DE965BB6DDFE41D46D1E428F7ED3786D153459384482B0CE97A0FA84D667CD5F99D0CDB3C8B97DB5CF014C0CA4A004691D2D3FE747AB535BE58C1F3D04BCFE0550E3F6AE05C5A55CB6A3694236A32AF79B9167A828E517EE7C71CD3B9A40B1120246BCC1AA56635788E230A3411124416227A2725456DD6ACB073293F769C276F2563FEFE7684D442D102045B574AC6A4D8CD9729E3EBDAC6951F5A224CF5F1E20BAB1EBD1355AF9DA5D45443697B5575BC7466B9050D8B39893869573AA1F5DB00125FBC2C1991732DF9740F97976D19C9E465D88F38DCFE1FE523DAEC486303EE7943472B9949A2D2E39B1B998B91F1DB5F8D464C2D4BC735519C46E5B696D58670211E5415EE209AC2F5AB9DC1649443220F9CBB1CC7C13D7C01DA0D02BD2C5CC585295A83ADB5616CAB7927A02973ED07F3B3A6FA2A79B86FE0D80414239805D94ED84C4B39CF845A2B5E714E998D429DED051EF975629B1B70FA92D5A15D3913634E615127A1CE243F5CCECC0869C6639576272E790C53EC3D20DA3F3CBEA8DE155DDB4B1BF1664B36EACA2893DF1307343F303B261A9A66FA851406D78EF780A3F0B6AA9E7B47940FEBE79E423B586E1DC30AFD7E7DA80AC3745096DD6F63B7E3397493186878B8E79C3B4A230C14BF2CA5E90473FA123658BBE71A1AA0C690783FAB08B6B555A55A4215D2326DD7C76FA16A37866F33F9274E4A6C815EAE46D5AAC1F3510BF8775033AA21E43FF3EAD42FBA79369F0A190BB1D1787AE923FBA3DEFC97ABD46653A8F2D742C50204F75A5F8861A425004690B8F7AF3A800C771FAE7E15335C4F0FB966C043B7C743F9ACEA2E1B50B2578ECEB606F2ECC71928F650331683FFB3FE1088A84D54BC8ED964FDF24061F1165D56FF468D555C22F24DA75D57843D75AD362FFAD81A0A2A12272D8DEEC4D8B6F549D5BF94B92698C455B5FFBD6F27452788451A31F63E435CD5345627CE443D64E0581DAE8DE0F40F972672640A7CA30FE866567FCE84FF1B9262BF84D060F611788ACD071996A9A7510AAACFBBEF425881564F67EDBDA66B59021C1B217F3F263060EB8FAF9BE641BCAF2EB3EA2F5FB32056F37A219E33CAE451BE178A8E85D1CB749F5B03C2B8E56FFDAB3E9EE28129A258FACA7BB4F4922D109B4DEDDEB72E294CE8659004BF6DAE1E1A23E2F52BF1D084653193CB5616700D2DE3276B0781468D1541FA1B999DA99D1C6DAAC0AF37F4A97D5969859A6DF6D1E582E6CC36430688ED65EFE9F7C4FAD787F6AEE86BBF5DF5FE8DFDAE27B0E2B75B182606B6DD56C95721E349581AA1A86E91FDA3BF0E763624F0DDB85568512C73288EEF9EE410AA9FD58139CC149DD3DC453F85B34F084CA1FFE1C5FFAE73FEC0B6C62F8BC2198A815303D97D3C6A1052F9DC0028DB693420323DAF024AAAF1619279054E7E581A3BB504603B2EDF6585C172F5C263C5F55D91FF49846A8836A81267DAC364C1D4A1C1D473C6F8F90162C82930D7A52EFDDC73B7BC8F1E85C12CDDC828B6F4A220FF9E54008F422E5498FDE6CC41575EF2E37A0E4FAD1555933C1356F930D04A6E26083149512E7E8A5563238127C97FD57EC5354CE65273EA38C0C47BFB2513B8B37896491615A1C4FB83FA49E1D46B62A3717A7BAAFD77D3845700905A028F204F6ADDBF3326CF6923705162683A08645561C879AAA81DB5F0C2C4CF05116AF8F4C9FA76F6AC3F7CB211583AAC156B5A5EAC3AF83A1585A75D17BE606200640205587D9E3F816DA9225BB7995FE319EB576A7068D672CEEF445329EEEDCF0AB1AD462543A7DD2ACD3E81C5DE5DEC5779FDD308F79FFB2B92998E59EC578EBB534105EC09BDC6438A4FA33A54ACE081580BAFE11AB60321A21A92BA19733E65AFC6629D47F04DCC378F8EB7ECC0D6E5A8FCF1E0A7ADA0AD3DE449FF1B1C3A07013D8A8E4A433967BDE3B98B375B34E133BD111C815DBE0225C55F63B65EA12B5587A6BF4658AB55C39A22C3F41565D2AF68BB6DFB1D85A37F785874F3D5A15F429E25BFB4859AEB01BB58F73AFA1E005F8CB45DA343204801F33FCDF03661EDE8D38165EFB62E29CDD05C4FC49E78756A4815671153BBFF6DEDADB145DCEADB496B0E6778B820A95E9A9FC2E6D083738ABA53B810FADC851781F802087CE3F0F571065980110CB2277C1886C3E9089D6A3A368B7922CA4E9E894FF6B01E90E1A69EDD75CA29E369BDA18094E255C13E795AA7CE365877C2B6B7CB06D115F218EB36D0250B92C34056CCDDD7A2256C38B8017D6576C2AB5E171ABF125EEC98A7AF77B9BB859C22E69 +AD = A7A7E078F5E5F6E04385F57524B51262DC9AE68818CB3DE325332728B05B4BCFD437D5D7C70126ABDAD1FEB53C3C70F636BA297096D522DB6AFD52C2BECE30E83926A0EDDF3B9ADB733BAE46CD87A6E9C230F2F531DA38FF14F96DC9AF64EC0BA1157B159B8316FA1F4EFD5B27DB0EE25669FF8DDC3AB75FEEA0D8E5CED12B0F4EA2A5B70C914D3F1AF7D5E2DDDDD839EB8A7346655E2F665E1C27FAAA302C4E22ED0C843557D6C41BC073E564D48110C89EFA435EE5A9EF723F58EF6A5294E9CA87BFEFD1530393B4AE2AA5EB49018A9A16320B36E8F03D441C11F6FEE65AC82B8A1ADD14923F749B668FAFBA0404293ECE54531F88B3E19782ABB4410D94CD53617A602E247508D7BE70CF5940823F18E8B8309107A9A2D7394592E68B328DD1C15C598AA3FA19584B7B6117E38857006B9B5955643B4CB8D789F5DEE3224C8CE3FD97E329B574EE9ED7458B478AF3B0EE917AEFD9386D8510A0B319043B75292FD434E5F073D7B6266AB78CF6C0704C9644EF51A75CB3AB9011D388025BEA62621C5B73560DC07BBAC4C86E81E08F4F2F6683BF4B2482D2218955DF9F4EB4CB7F542ADA64FDF688847496E394442AAF8184599BD72A163E9A8952CCB8E0DC6C0FFCEE2CB6B5EA326FFA3AD78D9E3EDC5FA55D1AF518F4553DEC40DBAA2AD0A4982AD39755FDF8CC9A272CDCF03FB0FB4B766D1283C177F70899EFCA750E87452A963F63CAA68662AC9080CEEB1765FE3B449034BCBD20D7B3DC8FBC0E2E568B9FE7B159004D30A5EF0B66F240A90BF034F08E307E52886D7668AFEE16CA537E3AF52E04650BFEEE13EB45B1572E960AD19E871D9F260C4D5E44E3979D428E25B7E7B84A7A068B29F2A01D930CD61647D1A51D774336DE13E9E0A521286651D15C20FA6F754B8FCA135E2BFF087940882E9BC6F72517E28109A4619A6169008B4E4B36ECDCA7D185165263E40ADF0A6F9F1DF38CA059AB453E7965D1EAF469AA5D9FB0BD4254AC87C940E1D2B3FD762A99F1FA437673EBF5A0F1AE6241009B21E9B9866B2E4D2D4B706CC25F78D99140023B38F8FA2533E9B3BB1C51A54946C9A5BFE8FA760BFB4BC4AED20AB18C7CC65F6D6005C8A226C4859DB77330DCA62725F8B9B8F197CAF740EC344B522838273F56F137E9400102992474D953881AE708ABE4B8D2C3D5C7A368C4DB6EDB715D648F33DAEA6E3EE5F7B71FCD23F0A3B8D14D43A74480557B802A94807C2694BEB21675C45440FC9A6DFFC11BA408A3B3C40C092097CA18E43AB859C0D9BD68D022611A0C7BDF639150A93A44BF3AD67886E1BB6F1C7326E7FE90899BE63CC0AF96F0F843ED9637E5A877D0EE90D42500E2E139F801F8B4AE3B330EEA55C8AB14E88AADCF41938AF0A9D6C7A4A33757296B89B90402C8AD9E3B4908BA874D8FE0CCBB05052655BE4F56494E2B310F0B03DBE57ECC0FA61220DC0F93F88BD0685C46E7D8E731510315CA69ADB879826C2B3E04DEA2CFC3D025A9E52817C2C6C386E1F2E4493723D189E16801A5F859A75AA267B986F1C58C8316B23E4C29EC5304A527D7869D23F41A3254C066C12B2C4F3DCE745B0C3D951B65613384E48560F514FCFFD18220BC7F739F549C0426C1EB85EE0E5A77F8F86891BB213BF06F35ADF3CB51C42B5ACD1C12F5E76DE8F8173FA047FEF676067E1C04963FC7FF808F0369A6A939D4FCBF2A21F24782108B8099A4E19BA8703F36EC4C35C0941A051D9165E303414FDD6BA487D4D484BEFC0B7916A6231EE5E6932970BCED9E3C2B0F1BD4B61C2C873E4AC676F6209C6BB22E5029467E74E2FEAC7E50DAD193F0CC685CC4B8AF08DFDEF2D85C5CA7EEC6F7BEBD8D9C75F5AC9B38D60A9DDCAC6CB6D5A98EC4D8B20325704A54A6178556BDB8581C1405545772AF2880D9FE4102456BA587FD5F021F0BBA682B2AA00683B27F4CE5839058B181521B14AF3229272F480E3A71FE585DB63910599C282CD2A9A4CD5AB15C7EB513F305AB44ED6FD99040FCE292CC12B426EF2E4A7FFE145926496A0A65CF76D2CA59277DF8AD19C8CA36C95C2B4A40DD921933C22D343515DFAC84FA836474C0CA291738A494BB78D6667F4834B82DDC098D784B9CB3A49624119E4C291E4565C2089201320738FE5DBBECC7B4ECE0267FA8F1F6EC28241685811492F56F4FB7201A862B262BAA01547AEEE0C7DDE2373177CC812C4F7999E47B7CB0F3A508EE6C34A79965B40054FDEFA1723A434EA89FDD617DA2CE8BD1A0EC47AAAEF90EAF71FF74933548D17D7778833CAE075FA02DD41115448B4C9DA9D6F9796C56A504E1F2003ACFBB72570BE306294B4E22998DA77DD9E8F86AE5B3D6E95F4F581120D27E5BBB0624D17162BA0A608522525BB360EBC5D9CB1BE8871B87F8D11207B3D2E557CCF2679268D50B772EEE096090838EACEF6C4B4706637334EB9CD89F4FB2578EA0CB86694BCD83EFCD54ECF97DBBF77543661846869D50687E32A7CCFD6B287C977BC0C5FD256021E95B79B27679B62FA5635CE9991007027A1DEA1926B6F2622C706202FB31771E05F65D2B249DF2057B7726990E3EE28674BD4BDF3B47FB326917860616B43474EB3EE4A3B2DCDEDD2BE59DAE905853ED8DDC8E3DE698E3BEFB2BC10C16EBEEC742B2AED05A3FD397DF6DB355AA4CA110C399783A26F78D535B25A7871AD1C640F7D66CDDAA83934E08F65D78E48D13AE89B1487D73B3A04A245B7534974C7D0EA7735ED4E0C46640052A32309A156ECE12F9FD698848CC433521B84E0E5EB6BB794FD0712E3FCEC54A087848816FB00FECA6229E4E13855FA61B9EBE0B1732A67376B74B44FD9FD22B381F80D083C2C571A962673C186D65C971CA13A10FBA32D5D1D50AB865CBEF07507216F4058E2258D84C62B5CB6A5A095281D2328C311B7EECAAFFAEB80D0CDD725FECA65670C3E3A7BAC8C3587C09677B0066E3F9BC7A1E5797085A8F74A0CB4084436B7DB4B2E1BEEF8BD16858256FA09833B7A629E4B5E5CD4EBF676854331AFC82D4399EE9C64E84250931A9B5FE7198BAF741E924169F8D86AF65F37A559A58B76CD5513602AE6C692204DA833B174F4DCFAE5CF130D76C34AB1739605A0ACF6ED9F149292062B748D4800212C40A4A9815A6AAA63E668695691D8AEA740B0E18346BAA49CE262D6CF6141DB0D5596FA1CCA14BB45F2830736BB4C002D8CDD3C871E9DD585F01C9EF793EB02948D6BF0FADE81DD3C05AB80C3A36DE1A652A932940543EEB7B1741CBD75B3A2078072A95F4B054EFAF00071730D11D2923AF894FAA86E8F397D49496A752FB651F9893330B4925B5D5A47A404D26BAA9F918A828D2EB76F21E36FD201CBE485D04A2F7983EEA1DD98AD479060BA8A67019EA9D8EA9D3933421A014D54B0498165B1D3BAA2E216B0EFACE9DFD716FE6768F8C063221B9B3310FC3769DD5488E853B62AAEE6CFC41F77F8E93DA3595C2B1BA9E45BEFE66F5A1690A9B6BAACD38B24018C20FC4F80A934B0EB39225D8FB7A01C5E33702CF87D46C09846161D64CB155E19A1DD2B2EDC293B273EFB3637B910F2169E5EA01B07091EDA2BB73A83274C2013C443EDEA74ED721A3505C9721098DF352406D67C65431298CE510314FEA7FFE2DB127375231791A0DC95D5F14F9CC992E7F56F2075B3AE7131452C23EA6D2B8D05D6A6FE156A021C65259FDF6D11592187603CF948DF6D2763F233EDEB7DB67F7A58FB68E5CB8D7DE352CB4013DF141FEBFA9C8A30224426798F8A13262420E77F10651425E04BBBE2BF15E6141D0394EE23F1F0E13C4F5804C4FF66416A57CF31D3D1036A0FF9FBBED097710C6E025C8BE53502222FF632D11D0F60F0D57A886756B4304C002AEE3A06420094CE4BA6B2A2EA5C25459D01EDAE225CF0890AD9661F09B5B9D2108BBA56D82BEDE59E02C158AE5DFB2E5321B9A252ADDDDDEDA0FB68AA85C485FCE0925E91DE7D7123F8001F8B97EAACDE37BBE80C077F72ADEC692720754B084E3B6BCDCB9C8C84A4388E6A9DBE4255C65E9A62D9DC89E5612FB0A5655650AEBCF7D1503C1CD131AB2743C38914D4EFAA1360C1EAD83E61B1765CABEBE71F5DD7DFBDA5ECF219A97D58C7A298C65C5C4AC10B51E58EC3E4C96F9EB5C03555C417E5EBB9573F02A7F9B75482108BC8FB19F0512ADBCD68490BD8EC7D5363E94802F39AB2DAA2F51BBE53582E3A41C43D96A39BCFD43AF85A8DA2AD8E52955495DE1C7F2CE1162076FB456C88654A1ECA04AED6AFC81963D7FB4035280576C9290EC2502DC2A75C808324C48EDE7FE53393D389A3BEA4CDC4A8A72190E0F861848C338992E9E1075D52562CA344D5098B6AF19421ED157A59F48B851B85BB9F9AB340029AF64249A2CC3C5168882A7FC3AD9635FF543F9776B92FAE6E6BFBC7A6B681E004D26E9518A7F165B0B411C1DA1BC16DFF75904683A88BE1C6A3EB46D064BAA2063A6AE14EF12D5752D9E6B2A75DD442AA8DD821263B6C6C468CDE64BCAA854C097FCB9FA0D02EFE5838E3A9B1D94A68DFA8AC529C897BCADE0E9AC222B8AAB844AAB927923491CA5ED9D8ED57C2AA7D32659503FE32AF7FF400C192356CDB9F9E3B55171012D69B06D1F3C2B09E731B642D8FBD23A6BA11FB49338172FF94E1FE495F2C6D835D2F9EF9FD1C3EDCCF658DB63E07ED2E7BF771431BD6DF4528174D11D4774F56ADD0C0502E29A99DD31E89DE03BCC18D04DFDD57AB1A77864049C1E5DF2D08481637085D479CF0424DE3700D5D01416B45C01CF4A9E7AB83694A0FD467C3CEA60631B7CCB4644567DF8B19C7AA7A294F0856900F1013AE3E8B74F3FD8D2BEA8A14C9F72B5984B6E18AA5151EDDE3D8FF20C0DC0123BF95F28379313F7047DAB3A08FA2E0730DE583AFBE847B0E9F60A79C04DCCC4FD95655340497D043877132CA516E4E30F87C12DB5851753B1AF3E41889937B7B0E73C7394DBC7E660530284D41A0AD211266A388B9F0F787D12A1900A3C7B9E3F5C7BBED9704E34BFDBCD6183937F97A46C2F622FFE2C11D7C4F5823A36DB23D76344779E4CF9A1D83678B0D1ADF4E9920AEC9E0D196F413069E6147ACCFA88FFA9891F4F07F858738E8AF8867B402AD00CEF304A3C16BEF402473565E4260B3CEFB02824D49A8B11932B7E8F76BBB429BC446EDCCA3EC392CB2B4CBFC3F28F677EBC96CB1705FB71641EB610972E7D47930BA99FB72F72B1ED9658A84DCB4EA19C1711BA24E911B649FC78AB87B2FA9CAE042CB748EFAF4E4AE5DE81AD522498CF1574801DC323AAFAF356BBB7C6293B9BBCFA489F9758AC68C26F3F0A8F09F6D8DFDC723E7A7FEBE182BD5599F49783BBA3E6F158DBF838BCC7185A53E49F6AEA5FE2D7EAB7FC213C0F671DDA0313732BEC8367A9189EFDE6A3B677612598FDE2536B3912BF9904A6C4B44974DB5DB8B3A42E676037C0D2C1E5F1460185BF1777693A8798D9616C527FC1E56355880B46FDC3BDF7309CAB9299782DCD520320049DD10AA0D61FDA43C114E176DB6E6C5CE60003C2022046CD8FF4FF61349FFF7CA1E0C6837E6A6FDDE979351CBB35B72A0BD0E752FF5E017D8B3D11E120780E221464D5FAA8E9DD7C9025D988EA29115A3CD55563B7AD7C42DE48F740588DBD706B1307575FBD8222F26BC1DA847992622CB6A54B22AA6A66E7921C5FF19D230368681DD621BAFA7F5233714CECA2BE65B69514A1E8724EC0A9A06FCDA123305547BE721C5BBC4072BC25F8EF391D7A45D4B6A95C88811AF5195C2D814A2CDE2F021B042E30A109FA55A2E5C2795E878B2629F9EA79D4CCC6A37C02FE8EBF278F47C8EC1E184C1432ACAF07E69B577CBAD5A25A2032F3B52D4E3E8AB49E0B6B967B567BB1726972D915C73ECACDE62A4B004729EB64065C5312BFCFDAC16093A143706B45DCCB486C30800B6BB5EB6067143FB456E1803174F9289EB3999718B4339C875C7BE56F35FEBDBBE3FAF19D275E67C682AC3DBFC33FF64CB32C95D298685738196304EC2FD07F5824C54E7A088B765431D19608F6DCC41D8598BB0868EA227AA3B884C35A7B96B12DE59BFEF07C4328B641A0C6D24F423C9FE667961477EF39A2D3D74F07B2FAB63BE4DA1141C62C0855925127495CA8537647247314009CB6F6615B1CA5F4210347EA8BEE7431FBD9B95E418225C7F0462B83D8BF8E86A13A47241BE06A0F6360714DE05FD0BADF454C4AB9B6BF1A902E7115F1211B6175C04951A64F161B6FA9FAE011D7E7917571A3937344CCEB7A2C94EC6E551E42450FD81F157F138F2F31DB0FBBDF09B947E09F807D87EE31F35DD67ABB29AC1A8BB89A01FEC77BF65E13644169BC2F9B23DAA48EB59DC4BD20A72CB8A898D40585C084034407BA8064A8226923ACC8362E3B57E0841D64EDF3DDE1579BC34DC53F5EBCA8382B561B1F24290D7B5A9974DFF5896D41F381675C960F672663E5A15A5D2AC5EF1FFD03E43BC060F4577298436C77A539E0834BDD554BA21BEEF4BC3F87B21D30D384BFF786880632207305237624B9EB3F687ADADEE89AD35BE7F64604216CA454686FE8B7AEB3577C18BCE2467FA4CA3BD0FF1F374352EBEAEB9C9E92BF2EFF0660CE0EB5D13391B4225DC52CB88CDC432C0B33214C6C111684FECC1214C5BDEABCDBE6B09515699D6E6A15E68CBF325FC05B65B3FADEB9F3BDF831D2677FA05D9FDB6FDCA62BAD17A196B3E2572A8AC4CC6C51B95F09EFDE21F3F39DE39735EFCAB846B04F55B894AE4E12642AD79B926E6C06FA2DE7FD96EC91BBB2380F330A61C4189FE4D97577B4BD0A10F78AB34958602F77913AC1E2BAB0C4BD99065C9F1B070366BEFBAE94F68F466FDCEC9E61DE715AD7DFBB79260235E53314B8DDAD606BF5EF874D8B5CB29A8101F35106CD1163DE28AB84BF5F8EDD6389167A803DB1980F71F7AFD991E6FE2545397732B02F1822B1D9B502DCAB9561AAE90146371A44505A4294D562894D41AD5E792617AAB359FE58CE63FC9633C5624E2FA7E4B8EE2AF527D76D9A42C0288B73547D326F4AFF36A747DF4CE053C40FCF731359A65CF5704F30F0D245BFBB97A6D78841B693F2042F703D700EDE14D3135ECBCEACCEE5175F0CE23E592CF1E88C47A508CA82593B800F29351F8461701C1CBFE6F3ECEBD7F271E2A9B0B4AA037F54E4C7380B089005904D9CA4AFF7DBAA72213D6D0AF59F5CCE1659A0AF8ACC6526B6CBA09A3711132EE1639E4E32427906FF3E926C95745E446A6AF5AFF0550581367EF92C3A103A10293E2992000E9BD3DF99B04C39F990416C5B30CD1C643E8B5D1D17B4494DCCEF038242574BCC435CCE21D057A5B8473DEDB8C0DEDF6DF4C5009D34E3F6E78A92CDC148B7B638F69F18D4FEFA93E7E6A4D5D9C6918CED0F968D7C57AD976065E7973D89E3708F87B4C120C60B6EFA3219B78F0D1D20F805DFB2B22A39E14908B76E1762555D0234465212CF6B260328934A3EF6075248C69E37AA31BE654DD378180F9C5697DCBBB45BC7CA0E289AB9AE8A97EEA25200642651C31EB3D176E0043E57531766D1FB6E8241AC8B7DB7769DF08233CD5E302518AA7605D3BE08E3E4E6C6CFD146A148B89B80201153D9A9994D80C24E4212A50E313B6DF0CB27B07A5EC8A4B7E8A4574F3A7B32DE1014C4D1CC6C863D4695A1D320C19F0B3458ED73CFA5B38B34F2B1A9287213C7E0C7FE1D769C235FA17233C826D19626044B1BE28EBE0F6A61399CDABADC14D381DAF359C2819498348DD25C71EA64635B8AA4DD57303922B793BC3DFF48A5C45D60464CDD3D6382B783AD00EBB2F876D4397F3038377C51A0D0A12FC55698EBE80DFF11A318851D262126D3823836059B4569C5C8758C26E3F5AB0D9C34BD60EAC118DEB3E6D3BCB462091611A8CE68999B937FEDD3227381D82DAD6C7780F263C5E9C01F5852B471AD11666B75143A27437300A03E73179EA55DDAB826503CE117B34BBF0D484149DF0D40C1BC070BC4F28529047F512552D1217AFB77FB4B5DD58454C2C97B1AFA31B7C1303355E29D5116C6A1263761C58DF8EEEBCE46D1E3C2E2EC37B248FA776A2ED2C88FF41F7C3FDCA96135AA369D238F35D08D2F2CEBE5DD6E5069ABEA091B4E36F865993598D971ABF19D70AE18AC4E1423132AEA3A02E7E2B285CF1294F2A046E7733D3889599CF61B843B4D752F56A31A96C6F5F063FCF67DB683120A5E17FFFD2AC6A46E168ACA7733CFB6C6996C822F2BF8FD2BAA55837747BAD2D589ECBC6C3C504B69B134030CFC7DBC94452FE44A01E3DE661AD352D4432D275BB7F5EE47124A8A4921197DF7F4F12E2D98EF3118D688D3A50E565268FD7625840DA754078E7581FBA49B28E866E77128A5253C54FB0E852F214938BCF7224BAAF3F8E94C9D279E226D36733B60EB3F27E429C3D73AD189FE2225E5453DC503824F7EF56DFD248B7D8719E6C49B4ACF350A11D7CD5F7370216FEB2A774158E5A732F1EBE2F6D129C09E455020EBC463D756B03B2BED3523DB0DD3FE12FA133B2F343E91AA5EEC3F38E7172F19234F36AB875221911CBABAFCCD10D422D317C58A0921ECAC32B97869710343D6060AB7BD9D528AA7F1AA127A8494DC4E181C +CT = 2FAC98B76A4303066F560FFC66652E4885F22B3A6BB4DE22749DA4873192E6907778E40192C23ED326ABCEB9161FB6DF0821553AA40DD9A7815C786DC6F3987AB2FBBF7914EEDFE83994A8F5C525539772DA8FE2B3FEAA54E0B3E0539CCF4B92D37C39719386FB6B7DC2A9FF8904123673CC96DE0645AC5DA89B965564989053507638587A26AD2321D353220C987A9C15833232E8096AEC394D579EB77365D04A437E26A8F288ACE0142379F2872F8B98DA1F34CF759E0E00CFF0A70E330ACCEC739E55447BD91FF225DE4005968309D3F2EB51B938DBF4F701DD838BE3D2723E8536875A8C40E08B92F89B4475C4AE91C207AE73ABB232D003F146E89E205181C1305D969A0F870FE645CE94D8070D5BAC5B0013A69B88017019E611FB17BC6D83F116EA63A563E3446EC557A2C035CEEE0CFEEB589F4C74796FBDC06068150A776A7A15BF18C6F87C12EC665A927166410DF1B16E716964273FA0F3D12A5BDB1AC10192986DE7F83F64CBB17F08A57AC0721CCECC4CF1387A437431C9410D4629B3EB65E6F5766B7E31387085BCC164CAB43633EB3A2B4EE1E6586D18CC422BE2282B71CED397564EFEF0CCABE622FD256282E0DE690DED080248B4E124966B4BA87C7F47A25F43A4429A63DBF29EE3A627276AF08F6094EF1AFDBE2201F1FCD67C8DCFC8034D4FC34A9E566E0235A2323DE83F2281A721F82CAE91D614DEF7C3ED3FD568BAA8E0000866ED490EFA3DB770D0B2468E1143065AD93A7AB7E672993D04682918FEC874C1CE2844FCB566AF78F03AC3CB7931481003D0B9918514EFC5A1CD5924E2A23C7A7ABB1B96B7B686A372A5C0098FCDFFDFBBD9C4655D3FF40899F3DDAE2FB7EF2025E6EEF621903ECE6151B512BC1D232951691119EB0E2F246EC5F7A65C927AFD27265ADE0DD9A17F95E9E51D3DDC17A15A94E3E53CC5585815D05B2EBDDDE2B5FB59CA574F4E88B5428A5D8ECA71B10EF70A083E7D24F6578FE71F235FCDAEA8318A71C61C8D85E9AE7B944740E2D24BBAAE444DFBE3508A65985F856A7449A4E067B0EFF38797960910449601FF287F3012EFAC918CA694A4A97A224E56B22BDBFCC64C8B72A438256EC21A14E6C13CA02F7EE21E261F83D92AFC68973CBFE474D7B9E28C610CBBEC7CD79B91D6A86F9D6B7804BDB6766A59AE7E40C3863EEE6DA0B5DCA342F1944C2ED4173F5324CE1AB67E975A982C5876CB441C906D087A8CB79FF800523AE0FCF54BBAD6337F83BCDE0C53A9A80FFC73490BF2922FAD736BE2A0F95E9E4C476FA673DCC97D11E1F070C2F6A89638324CEAC8B9FD7ACE6DA10ADA266BE8E698B6D85AFE744D7178B929780863CEEB86B115C647114829EF04CCA000D02C673407BFD91AF2B7C5C95121DE10C5D9872D878709F65679AE0DAAD5567AD2A6BB35DB6FA1B1CE40FDDEDB6B5A07685A3C9A86ABF9297C94B0D663D3F5FAB1E1F6F3C34D25DA8730586B1E7F9554A8AE161C13BC3F2D8E9E39924C8D1D32DAD1B6502F744C1A6DBA9161C194D00746E17702AC17D060816C213F5B2C2ED92AA9BAB6ACB975E70F8B5E0561095A965E98B57841BFB2C1D2C8188C87993D7E20D9F7ADDDC958FAFB2A4339D788930CCAFFC67EF57422227B37BD84D08834BFF54B18B4CC7FBDA168C8BD18A2976D5F6300C41FA2F91B39A9A8B20BC2F9E1B291FB1236F0D2465F8E927FA19698C84E350BA12189CF3CD2F4AD1D824CA548830D907BFB973224DA66AA80ADB230202BA8F5A47FE389C8A314E59C921C967616614B18E7E79586F663FB2D595E090A288381A98237904333C108AD545E5F05B9169AFF5DC39682BD1AF1072282B61C7B8B4BCF249F8D74F8B70782396C08F20A63EF347ED2EDCB506615DBAA60B168A5D9F7C7F29FC40A0349F6E1015249FF9D860DB6AB4EBA1D16378EE78F05B59308A56E7358007E73C6554F06E7378F0B77D1DBEB6C9E513908F433B6EBD8B4AFA65C1DF1E89FAF59E9237F2F6609F811105B79F7E002D91E646C34AF1A257982A0FF30909D8E6823BCC8A170C273DBF1E46555DA6C99FCFE18D5BACD8DCD0FCD16EFD0859D39CED58CC990A310454215EBFDAE8D8A55ADC06E1C4C36E81F355320F13A916F7C137724219D865DE0D354D1E17478826ADA575058A562F95256F856DFDEB0FF78E7DD93EAFE60C17B31900D4C1362DD692207E6876CDB1C881831F386EE88DA4BB06D94E1920A9C6F4C8C125D14969C176F36E6BE26E591011ED951857D0A03B6AF88840D8F3D5D2F5D13EBA7B0C8BD65E29F70558BF527C78A7196D72A1360A73F40270FB92CB45C7FB3645A03BA7A066650D5B3F41A3F02F559572BF1C6EA737ABCECC3A86A8789BD6CBB76A324883DD44E7366E2B1A671C72D8218D5CB1C63B7EB7815069AD9654F1FA9F1442716DF1DD395CE92576FB3F1587B3575FF8393178B5DE4A66693CFF4E1405422FFA1D5B089080811DEAEE191DB87C7FE5BCA17744F4197C67D82A0A45E772336769920278C97AFFC62A7882B9BE205F60067D5A31D19322C33FA97C6A75D11F15DB6D1910BFB9CB17FD1157521F8902DBB0F8A6DF7007054C9AEA35EEE4B6DD367895DC380292635117F778958843868E31289CF01970505DCCE17A54E7C3D656D21AEE1F0D2A53067237C8F1ED5C3C6036955488AC2CF12E744BA0DC7F1A7219A73978F52AC17F8D4D9803F2794EFF8AFA061F304A7EB9FA29691127F5A8EEF1B20C897ACD20B5CD67EE4D7F74C48364D950791F2549F6F6B0CC78AA12D4BB89EB5BE9505DFA0A2D5C65C349BD77F6F8A0CBD1A129FBB02521AABD528C51CE1615E99E8BC928F973A422FEB13BB81EC6E01BC1D42E87F567038D07289B6F8A7B22BA7168C20EB8B913FC5E3843F19C588A9944263E06A7CBCC763AF74C2866584C1E557B19213E5956E712B01820EEF8CC6AA5C582392D205728425ABD7580658126EE06423F09745F2711CE1C85084C4C4E3801ECFC679F778D297DD3C9A3A02EB201CAF75367F397E3D06DE9560178367D9582326E5DB52B976E25ABD95CC7E7F0338A97C4282B270495458854C2C50EC765E0C38FE61B95B34D870291C9A416BC7ED7E64C960C0A4CF4BF9801AE294F0FAE88248D5BB0BA54188D7F08BBA8A01B887BF7BC04C2A6A91BC0B01F7630122D33A98922158A6028BDE6879179954BC448B6821426181B71374AC57330355C554717F361E6CC443910F308844DA4CA944CE1837CA7976498176DF69CCA7A70D2496FB333F3C270298DB65D745C122C09BD0AE1C6DA9F4567CE953B0B357125A6F60ABDF7C034B5A8D07F9FAC2D12FDD8CC672C094BFBD32F372931B269FF74D5AF8E676525874CE8EE348B207EC389431F04D1799117FBD464B7DC96AF49228CE97EDE67AE0C054DF4C0FDFC329FBC21BDEF49061C6E85484DA438660B30F793041A040823305996B8DD69F1B1F4A71829C3E48498D3A0C135F2E0746CEDF116724D09A43F90EC377BC6808ACCC4487D531A9F7B3597402ECB9E9A70438A5404A618FFA67BED73BE0F482870118CED11E75E97E31828389316D4C009DD2F86A807B381015D8DC7F52DFD41A53EEB54CF627568DB5FA0FE5F9EC6201FFDB76882C4D427477A5A3861C524F75D3B843FED8E1433B532743CB3131A9DF8269EE901073D1B8FBD2B29F54930242C6B01E8044C2E149649B41B9223B14EA12BC147F5B13F4A5A514578BBBA013645068A3F9A4FB061F9C8F00C12D8E6BFD27B9B61D92373DF57605A97C4580E4B9A8959417CFD15DF44BC874CB924921BBF714CBC7DDE80AB676DB1C3EF75328BA9D0680681B3D7E4A33E1A7A7A023882E96A23277FDBE9970919DF634B015AE5031C755B69EF8D1FD50B5B46BF73A78984B4A829A541B99BE3C580887E1825F849173345175A1CDB266F8FFBE4FB135BCB557DE5460E2CA6F33C33ACF75C66300361BF5411FF2EDFE6091549DB1CD3C8EFD0D5E1259519B0D2236CF4CFFEE8A490977585619479D1211F42BE7FCF4566F9DF5DA6EFEA9808469F6BDD6E02EC6287B25F70AA6C50C9B30117F1D8A1F7EF3983EAC3AE579246560A0F055775D2C7ED196555873290E71B8A40FD08CE62A2CB65FE51E54EB79B6A77FC072404E4138F8053F65396ED6EC8818C619C0D517864769F6B0EB7C10A269BF70E61CF889CB25FA623E2234C80E157935C2969966D06147AFE1E866F2AA72C5AE970C9DCCDC670682EAF91B3D4FE0BCD6E82492BC233F3E7E11E6B7F4D010AF3119A2BA331D89E51FA1557B62E7CC9EC6663BAC3E3B7948740A66C00A1EDC526658CA150031295B239874C38A5353955A3FEE2930C886351EA79B9020FD0563BA9BB8CF9FD8ACB4C1837B95E6CABA178B53D79E4EADADC7A734782F8AD8791C08A9530646E61FD9C0BA67F7050D22984C4BA2FF0FAC6B2EDB8B632DB4B0271AF8945AEF44C6D491E2AF3FD8490B842928878DC62E42347B9BC1221D2DE0D29F0D774B60163B730115AE748864F40A20CBD813CCEDB33993BC0D309FCECF4266F48F125BE93D65501D852123CD63E93E8A133A62D54706D778AA36E71D10B36915151AA0D317CB6142F8B753A78896B3A11626C8342A8E4B3909954BF5D20E1769195128EE37B7962F87CA975B22C3DF902B1289B93E2FCDA9C43CC8D5E2DEF3CF06994706FDB236BF7D2CB8B6F8C8C85D1F09A0B508358A188F48815FE2AB09984EBD1EB4F6F0470AE6693FD1D22256346556246BDC6EB4AE031C91EB47D907A934DA4710345EA75E6EED26DC317B33354574B14712224D3EF5C93E0DC1D1C7D825D744A9BE8E4B3436FD65FE055600826A45D8F0B3299EBC872FF7C74FCB7AB9C9CBD47026E285167FF3BCE3479F806148B6E7046F658D0C565C6DCA80275B371B8ED205B79131CC44BDA1E43341285F997D342FD45E0E7719FA6DF1EB4168CB41E198E283C87032583EE3DE1DDECCB4D86914E46B19F463A26A1FD78AA4774E5E6C12E498544B7432E5B267C1682B295104AAA321EE6EC20B56230E50963B518B1E9E0F7F33160E6F9EF970A43F06AB3A6701BFA00E3CA98D64F8BC89BE0110743DEA090998B6C846ADC7AE9E4D9AB593A6A783E5BA0F94C90F1FD76CCFB15723E59176CC5EF870C1C7D8D342FE550F811CC63125759EED3D431D439D6B2160DF1B21E7910D414B97790C5F26A364B350108F174AA03E835C570AD0223A227186F52C3F676EE6EE712046B3E2D0FFED985C34655E80F8DE2A4ED5C60F71E9FF58F3EAC28BE18BA9EBDAD85B52EE3563679CE5D35CE48CB17ACB40818E9D51E0764226BC34B4460D3D70D3D057F2FA51C3A9B7E3D1036EED86261964524FC2F944E44721117B2906AD20725DAFBA1B8AEDFA20BA56EA987A7A569A92B605857D17526FDE66AFC139C0C3FCAA9F121B96509308E692CDB56705181EDDDFC38C7FFAA04F8F2936A2169AF3F6A0221268CDC505764FFDC967CF83E693D7CC8BCF37193A589A599B42E0A03838EA309303410282300F97454E8843644E14CB2CDA1C030F1ACAFBDCD9CEE92FEF5D53D5ED71FDB4991B329707B07A35A007A5632535014229FFC2B09CA7E8CDD38789B3F6125CFB313D289EA7FAA4B890CEF302845F734A6DAB1EF5CDD9A962CF23250383FBC2BA46A696F8D7C403CA744824A2DD27EB7F9B160AE6B19DB35163F77F0398DBE99289BE22CAEC16961E35DA0A78CD4AD1A8E76A432FF702359C32F7CA66B688AAD1D406E9A4797A964C5FCB8F8623990BF6EC83CFAF663D65DB8E4BE9258D32306C349E0790B081FDDC2175A1CB1D4344F5A02F02CBC26874959930E3C01F3B51520946B1D9456A7F135748E094A16BBD600452C6CF3DD121C320E7C94D57F44406B02282D7D42342D8F65D16076872FAD58D1F460D16C37BCAD724702C0EBE1A20A399692941B2A04237F1EE4987E335D3F9AA2D3D5084BCF0D7657EF25243A02C70BEEFCD04ED0859AD9CA7A0C221FF147FCC4BEC35A2F5B957E10A916E326B64DB25249E8017AF926125EC13E819C3886295F8A925E6930AC999CF3D274F52A107A2733467D6D756A7C92A76FCA130E8CD01C67A5D686E2B74C7857B0E67EE0ACC208E47E38EEF1FBA948D9C883EE556D40571F9F3EFD01B3C302D27D8CE27013187639CB5C5FCA45052B3B8840543BF6BFDE39EEB54D25E8ABFBBF28F4201F072D279FAE2AE33D6EF86CDA3F4451B7874B3F66CD0BCE674C6CDF0E2B3CBB773FCACC369D9C27E5A9E813FFE0F307D565FA43B17CC03EABDEE3F3408A8C4F591E99113298947A752A8D6F46C8C3A2F38CCE6722191A90B83ADADC8042A436F84C7DFE495F37298ACF8CCF0ED511D09BC87272E3D6F1751F2E8D0CA0B0C771CDA4F6E62CE952A39AEF52A5C85DEF7C50623C325300AD77288493D382190BC5BD78803955D347DE2126A0DF3D9FA79270144224031ED32016EBE7108177C996686F56EE890AEAB9B1EF66847B61BDC98D9D4CB1BA62DCD3DFB822A2A2AD572A8A1AA6052C1E3035C1969D0FA658AB76246FD4989FD880CD8099CBDD06CE32D0A949FFFB11573C0547155DD9061C53238F172411B532D30CC02365C825AB25F01DE4E7252346D1A51C4AAB48A5A7183D69C83054D6FC9DFB49F681FCB90F18C046199628A3888CD2B9CBEE9F8A1AE84CAC442D1D3EC4C35853C0E24C090B7339A05B504E51B25CA8C20A7F9F5B3660E8F7AB2DA74C9F0BC961D107FFD0B7A7059B60A16D9479D134F9C397F7610E69EC9211CC75355321AE6F41E4E248F5A2F4471562BD5341EF073247E897086C541DE14DA09F96DB85E7BA86B92910C21F1581C0F4E32FC98A9BF63A06E2FFA63D7B7EC6054728886AFB66F26F78C2F01E2A445CB171BC7741DC63D26D4B75F79D6929F5F1DA347FB57D457AC74BABC7533DFAECF1748193C96A89F57B13F788ADC8C511AFB33CB2F3714A39A88EE7FE4A7F12EEF5B3E40D079A6D4A1CA87248AEF977F4D6410A0E3BE3081E047DE2B7EFD55407D8A60D2E51B4574DBB65D695B3DF437784551FBDD6327DBD7C9F8326B64BF8EE364776E46A8835C9A3893A3712AACCCF86616731224304CBCD881B078AE10646E3F1D7DD41E72DD21DB45E9FC2A7C4467D573F3DC40C4871FA84E108F5C8B4DD70641F345DCB1B94ED9650E43E967C2E4CA342810B318A4E2B17B0926E7AA921044958055CBCE4355B699077D9347943CF68BA540F5C74EF6E642CE4862074CE8A400F8F9ACE57B6F5EEF5E143507F595A853BE3A993F2C15F8E3B20FE2169CDF22A1B078310EB2E9F76CB67AFC4F8E208B1E514DB5A26B4460E3BC27A5DB7A170C0E98051D93E5CB0CD8D022251A7ADEDAB5BF0834B3D583020F0E96FCCBB537E24D6C2AF614021D819D073597871B41A2C54C7FA14AC4076607BA94C1ABF0933F46461632DA77ADAF8A1E19D70D7FFE06947A588FC5953AC9EA372792BF9B4FEBE77BDE4B322FE0B2E75CA1075F2CE54A7448F04B8C8D99A235016C861400E6715897AA837EE1854B8F61A89B10BCF42FED53338095F4BDB367755A739FECB5DA6E52F7274FD4F59F2603BD5444DBC8B880134FBB32FDDE9C88261CC8C844FF9209BDBBC1A3AC1B160F0CEE5A81E1FD64249CD898C06B1B82FAFD2D28027A3FF6CDC61AEF63C13908D3E9AB937223A78BD0FA5007D4843AEBAB0CA7CFEC3302222B8C9920DD8F21CD926A002FAAA1186725589D1F75EC3427C856A9307C742310E367F18918F41D9FC59111B1903B6D43EBE8A1EE74CB62C184C49D51BE1ED07DD9C3C17A0F86439A0FCFB8E50EC4AC23405E774C796A531291C4A71F454B571FA6FB0418AE3384D261A74B36201ACDC0EB4D0EA7373210FB332F4855FB432A615AB9EBE6F03F2FAD067AFB8AEB92244AB023E689B5DE2E220342083EC65D23C450A1B6FD88FDF03690083A37E601760AE117562CA2DCE11F9515DB25ACCADFC114E5C7D28E46CBC2B2FF60C3A984E0259CE956EC4F1715EDB3548E2D96F6C478108A436569D1 +Tag = 2D47AC4A67F4915FB0BED790D1563548 +TestPassed = True + +Count = 6 +Key = 491705D2D1B208F709940B96AD67418F +Nonce = C6163F8691A0AECA92471747A9540853 +PT = 06F278DBE8E35FC24549194F4E156D3F117B666939249A78FAD5E2E76B0283B7F1ECCADF8D3B616FA99164FEFDF743B540607F0BD9AC8CE15700E11200775642C6625D624A8EB2D619F6C0A7C09C7A02922DA60A8378DD4560E8878C594F6E313B21379B9AE16AB2ADA9F1E3EBE421BB85DF80D3D04BBF4E8417016106257CCA878F6C9E64DE67B0C2F45DDA86FA5A7BC7CC067ACE9B60EF62E91682DF08AC882C275B5B778256A777CF10DCEEE5C78ABD859A391E01FBEC2F7D3C7BC7E4D0BA47D4AD5F9EFE0444765F02FF8A83007D218CC55A6E72692B2B6E2BF946DADF92FE56951A3768EBBF8156C3BFFEFC62AC7DBE593B1F764BD56B82332FD20AFD9B80700033EEE545B8A006D817AEAA2C2F0C7F7C8780A373870ABFAFB535BCEC7758283E8EFB2EBE9779A19B199E3426C0550323528D751ADCFC79292E368F83E41961BE866C9D34DDC1E40EDF075AE9D699EE5F319899E9E30D619181059061E91DB7FF3D75A054B8CF4691A9673BD4A29052944730514B8078DB780A0BB2D8308324C1505AAC60F99AA76252073F7BD28CEFF1B2FB19B9CB6B7FC499274AAC1C6E612642798447E4F19BAD88EFF9783860A67D1CC02534696BF6E4DBE7C7D150FA45E4A619385908A70DC0606C30DC72068C3981CC8F5C482CBCD7839F6CFD2AC95C8EAA15D21E274C7475B364D4FD3A1972D55A8D50836AE99B795C60D6683B1095960FA2315C346D1234571AA8E358BF9D692C96A29D79D924C17958C2C6760B3AA2CE3EED98E716A0EC7B1B2B4F40B7219DC36D3CA46EF81C367D70E2DCAB4BBE4BE0061519D1048116F6B5225EADD480C236240309CF9534D621B71A7733C4412F5CDF6F3AA207CBBEEB25AEB8D5BD88A9EF20A58648B47C4AD13EF81AE90AE23173F201CD6446202E59441DA9E77C01632E7087131EBBE7A7632568640FB1D5E1437C44E2BCBB45A900772D0497D262553D94EB7982CF13B80B59693FDEBB1EA76F3C666B371EA7732BDE13A68EE21091C212267BC55B5E73688CD7625106CA445885955B6BF71E1FEC784DA4BC6C2A2849D87CCB95A3E213DDF202AB4645222413CE4E094DB525CBF4078E4D0DBAB7FC61AE187889FEAFB5A2817E78F473D8A7562990ED1E21DA94B2B1D78D159405223B0649972CA99A141F9966CB36ADD6812EE7F7E429CADD40D384C6D827219F0E7C5B3DEE29407AAC8E7BCD85BB0F5D05DA555E2D9D20F9702909C3A8E2C2EDFEF9574FDB6FE857EE6D4A56ADFD5785C427C1FED1C371715B61CDC4207DD1CACB8ECF8C63BF8195F2FE70C052C94B73D184FE8121C41B3A87E6F379A22337709B808A1F2ECB2104A52B0CD352B11E91165AF39B7E50A8077294047CCC07F3CEC6FF25D13E2C440562F9DBF6B748E8D6C76163482F9BF24AD883AC9AC6A5389E373D0C538C4D53E915ED398475B14F2AAC2EB56AA3AB9E2A0CDAF9BB80AA3FBDC13CBE7A3B944A7A0E7A3242626ED5263381ED97F0CDFA8C9FE146B15397686AAE7BC238F3D5EF17E43A5C29785CC89E04D387FFBCA7CDF34231DB594D98267711C793E6AB9C325E91D6B3B571D1144219A8AD800F69AE07AECFF6C1FA96C94C13E518B0C8E2F267A0296DE6F41882711C9840A5EAA667A7198C38DCA67063FB0C66A18BB9647937B545DFE5FBC712964D84A5625524616D7D70963CAA16C130C572D98E76F6B8B81E09F0A5C781AC5279A18F21CB01A5E804340E49CE3D8C9E84AF2089ED841F56CCED444C34BCA5FCC344C208879F64C4CCF18942E86FE9E07C512118612264F5813855DEBD58B3488E12858A7A8416E44A5CBCFCFADD6E5D0363D0E29A8D9AA0E0CD864F4A8506743D41B3D6E95F65F73A3CCD056668FAA4C9F7DB5A88D1AD0077E4A9ADFDC79AC45548BEB92A9873A3FDD8A75DC0943A77D2E28552AAACEB6C93B25E05B5B8F973A208AF1DAA417A3184375CAF294F40E2AA32DA1B41471AA95C5125773A6EED45DF34BBB7E51CCD916854CE724F3C4343727B5B83DDDE325AEE06C1581B02F7164A17D0F49488FD8D6448B3ED79A7591F0DE104BE126967000160C9DE5B7475655CB728386C4EAFE97DCD1F952B45E046ACA14B3AFD3803E0B0CFF334BE1E32EFD24D90C27E21B2BE321B40454AD2D5BC7F8332B9293B6724B448889D5B7A2B5E9B2FC2DDB51EC78AEE8C07E2F8BE95DDF936B43BEC78C597E66C0E36991562B7EFE1AA1A10F80761BBA7CA9C33842BF5B2AAA325C6EF7222692AF6481090F1D92A50F316147ACD012F538045AE296361401884EF713DF1006F88B0E501BE502AB6F172E39114E137DCA2F5726F2C7440C69508F70C0167EC5FF2A78CCAE8FF7002568FBCB680D02B374D12CF477E9142136F1E6CB6591DB48A86849E6D556DF4A28570199DB78A46C4DCC0BFEF98A4E06164785AC993BAA938DB3130FC31BEE2DF1E2CC20E78A55CE5D8A7D9995EC5F2E1A33C09DC132B0FCAC7E0C1865A49931EDEDFD06BE2D1E9BE1C74F0EBE010DA153F4E58F4B505CCF21CF74797E3D58B8E13BBBA7EF486FFD1534AC09E3A23EAB606AC470BF09F68D813DD4EEA8A52DA46E961D724555B21B84F86A16A442EB8F90D9090378E7F9D7452E26B16371547006F7AB4D94BC561AA8A8EBC6AFDFE93E42555DCFAC1A3B76AC363D172F00A80393FA0FBCA79DEAD472EE5AC00C23377544E86F0E2384D3FCCC24A15E8F4EEBA800D832A5D03C96B47A795CBDBF6B7A88FEB7C24691A9E01F2612E082FC9C553402B2CF23F091951851AA93AA38163D60AA285FC77CA50656F8138FCD4C03C7DE2418BB0C9C56886D22A9F4F70645E70FD57FE8D43C8DC75DAC683BDD11D7DC4DE2B5761F6B30D4539FF2A4C2B01F50A23C7FE7CC2AF3A1A6515D50242ABB5B4ADDA70450CFC7A4A4AB953449D8F4AD9D1789A091E00022FF13CFCE0DD0A028D49759E5091AFFE264DB432095BF57CD5CAFC30C910AB95ADD74053D000996C40B6C5FA27F1F948227A74BC69CDF9D4FBBF2616E1D9397D9EDFF179505B2D25B448F15295FB55E4D1B40E4F9CEE2CDFDD6C5810D9838B677D485B470080F7C64C4E0821DCA63E006A42452CCAE9E0B0B3119BE3031D4B31BD8AD54C9F0DE350BC48034DE60A03372D57A5973D5E9C9467AB93EEE514C32E03D76451D1F1605D5EF47081E593C9A90E64B5AB77B4F35EED41E5F379F56AA885D54A0EA5B1653CF7483849EE1AAED4E1EAE0815E17B64FE405638F0C6DE46989C7FC1049BB035CFE79B42F7CAA70D29210128E14E94A6D1EFB2AA04DD62F8963CEBF261E9E8B26E68483E46387D3399490FCFC5B5555A07D8EF24D90630E284A2ACBADEB4AB4F485EBA88F66650A9628F00BBCD9332E0E781EA98FAB3D9683755A9A38BB254E4ADC07766FADC53A17845B259F58514E16FBBD34CCA12448485425190BCAD1DB02A2C1E0D1BCBF60B3E4910B5017F72A240B833DFDF082A9B7BF2E1A88AB2E4DB27F23FD97717D5A3C5C81E70F19F8305DFAF5FF4794DD121F1728128EA4D807B64459D0F4FA93B38E2900A16E9A999EC6FDBD8EB62E061DA210DD7F486BCC98847A31CBBF273C636642711D943CA3857E8A4B90E74A51873D3C2EE31C146B235D681CF469CDDE9FC1592873BDE889656D5801BD1F3BB03A29AA8D83F8584651D74EC02B1FAE1BB0ABACCE8E21DDCA55B2C975C413AD0321B7E2CABF405BA66812D69C6F285E45BE3C5011736D22184CE038D02FE3823E294A9E733DE35C705006657B4B405A2D5483B687C29B90B495CA7EDF078A76858F98722489EA08DBDFE0C16C07A7CD0B850B7CAC2CFB7B8EB9E9DE72657D68C58FDFEBB2CD35A36A7ADBA8E2D923ADEEFD7259FC0ECA59941DE46A9F0C95756177FCDD27BB1A3E4F681231505398B4963CEF75F2246CB6C4865795E8CA035DE466466ADD468533E2340A94FC9809418430D4631C1F833D0B4518A16485558464B44CEA0C2ED650B6BC93BE19D7BA2C7D1510B7F6A040C4E2085E982DE4CF5DDE852F484B1F34565A84AC5F8CC424338BEC234E749E8EC473870704CF3E22D1ED35E093A772E05EE0BA5D72F4E0381EE42B0C41C080E840F76BD4C31730861B61DA7256E4908B190CC56DB9401CD0924FE920A431E1106D4DA09C3C9D1C46B0344110196EE139549FF334FB122EFFDB9B41742E0FE1EA7FC9050944F34F7BEF7FBD85FE0BB6246EB0CC053DAC155A1EA0C0A05CA718A05257904F69D7F4604F78457B55A900D0E41D067E43DCACD2B3AAEBA433AE1F47671C33A77A66BA96BB6BB5C5679A04749FF0BB3EA1995D76ABBD9CBEEB502CA158FD13397659557E626FC2D726E66B19A6760443F2E0A5CDBFBDFCBCCAFCAA6B3F146D6A86CAFE469A3DDC32D7854FC4528218744BE9AE7757467AB95D98B366C4579812790092DB78BDA9B50473F6396D376948E4361F5666F513405045E9018A756D80ED3D4B52EF3CFC8E40F973E34F404B252F6B828E3742AB83ED528B33D4A72B8E05754C30EC1758A73991166D822FF00FF9C3D21EF3DF48AA91C7659DB1C9BA98CDE4DDDAF41A391713DA54A62C3E01BD627B3910D40C9A262DA19F24B2BAF670D67D9F9E51161BDE8ABA0B198AA27E53C6A73B358FAAC3C149B7AD527B156558E3E4CFAE9E636C4B605A851901819C8A234B5D0B7FC1E02CB9DE549A69C8627555B336A5D2CFB4633BEFD43524A9BFC71B222F2FB75AD82103A2F4C00ED2E297F710C44D4AF6B75397FACF90EDAB08101E8C7E469933BDFBDA14A22FDAF355690C3C3D13E5727C256ADB98BD8A4834589AE4A181539BFEC453C87336538778A3A46683B06DF42AAC0F59DCBD9AFF7192E04A95F651D315713E79C01DFE46D1E263F41823C583EAA6BAF571FABF40295356E05509F28251D1501272F4340DADC887F95AA6E64DCD5D5FEF3C5C611BB1FD4F6CC61DF1C7EFE0A247D2B310F672AC47A872C5E5836C0813F7AA0346F56F356075A4C7468FD7C0097A039F7A194D697D8F14B8A9EC18CCFFBD09F91DEC9AADD79D529B51AA65B8D1B2BB6B7FCD8DFAAA4185B6E0B68B735DD8C78986DDA21DDF56C7DDC6B117D22A5CE7F731AC4C322F0F4EDC66E4CC2112DF3E79E3DC31F40F9E8B2905B033F929B38C84CF9442B08B9559768EC6B6FB89A6CAE7739EEF4D2AF3E79221232C7EDC55B3B35747517D9C8DEE4E82BB6549E78F9F5FE64B858BC33E59DCACAF8E6768DA99381302A441554C4BE5AFA1CB6F8D9EAA9184CD9891D028F018EE75D1ECFF86E5A7212C35E5EB5D0A99009FDB2273EA4E0D04FDE39A420868EB128B53DF7B5EE629BB234D6168C5A626C3FE90304CCDA40326C3E801A34B6518C44AD260092A1EA2B9B166509DEDA43F56BCD64378389E44E650B9B775E48670BE349C1EF2461D99E0EE779B675465391EA8ABE67421A08BAC8E79B871662CD42BF5926950864C109F3D628AC102DC92EB8098CC39A0FC9C94117264CC64287AC1A27072C2FCE8985C9A4636BE16CAA9B1E7CDF1CD5F9B8BF8F5D53F14E8433A15E8C81E926ACFEE9700709F59C6DD7D46C8B2E59737AC6207E479CC27A88474560C21D64EAC164617DE59CDEEFB32321757F94B355EA3DE3B6517AEF103C7EE7CFC484DA5072F9AB26CCDB9DDDF730BB247B4D0AF393FF768429BE894685514166B50F2B2E48D10285F98C891EA005BF10BFBAA4EF73E42BC51E4626C46054A17B9A2728E8058CDB9A4A750A076667E413FF6886CABC51F2C0E3561002AA4E1594EB1D7478ECC70B22DF0AA4FEEA146EA65202C4F7CDD6BF38246804BF7CD8FFFC6F652C48F36B37385D53FBA1BD03D6CEF779A0A7791DC7145E3C5484B25BB5F61AA88F74F825B2F6CB9C9A69DB1D8B208145C7F3385883419E17EAB716B27601ADF597047461C6C1B6A9DBEC736D3940B124037C93B2CDC2254DD6E03AFBE0191698CBE57676BC1F7EF63C8E8C96DE30EEAA05E2AF096DEB37D4EF369AE696CAC9B2C5DA9153CA3A77E3FDAD764F458E6F95F190F5FD6A1D3AE0ADA1978584885F71B4C9D0F3AF8ADFCB7ACB0BB064F89F60C6F4E505C4DC48B8AFA0A628A2F26F754E048A7BBD7BF666B13A82AF117A8BB51226CE8FA359BCE8812853FEE4B728885B9672606E13B34B0E7E448A4999972524E1067C23DFD1F447A1FA8527F7820A020A438B082B56FE7373812515329EE7812EC9F3A0BC548BC47E18BC292E1306FC3A784F561C2D099A17F8A05EACDF15131304092D8E5955A5C7C68A029AC555507A28DABA4F917501C06998B3A43D179F03A9161A19E96DE122A98E5593070F42A34FD484045AD3819F076D24C0A1F19ABEEAFEE1BF3B4690CAE997A6032F6EB95A46106458939AB8D5948B128C492080A7F3A6A8181D93680943B91AC32D7E7F98A3CA7A819D321B50361C2AB0241471C9170E1F78B6A14CB2B85B14DA7FF5A8161B89D87EA5FF0AB18B47D20178A7E53F4741AC2F5EF6D1F28DC7C9422D40E0406404A4AA3C032318036DFD6EDF3B4A0075E5832E4988C714A7E5E0EE25B8843A67819D74033AF3442E942BF0F97313428DC8DC47BDB206EB3D8002561244E24AD9B3075DADD5FD3AE24EFFA56CC61B24C29E606CEC4C8CA57AB2367338AD21E9A1D117367BC5A4A7CB91556EB2518E6764DD9373D4856E8D3651E2EB9F8A02452D16038BAEE4B8FCE9B8914AF71DE31933CF1E5B09AE051C729A0019E2C908418F0041AC5DF2C88014968A2BE41386286EC9B7D06BA73B7F00E71914D4AF1A20A05FCBF6DC46BB31068E367323E9386F13E7BB190137D5E7C4C29B66E9A3AB757C598B94579F4C280E76D9ED70C85B27BEAA00FCE4012F7879D42209AB545752D2B0F6CA6D9417749B930A9A5DE8670C7763A83FA2BE817B3A031A736D427CBA1F871ABFC180CA2A928C5150F6851A817D258237AC27A0142F8B805A89A4174916407AD6DDB73AE6A98DAD165D3074A4E8890647B0351DF7D6F68046007F90FE75183AA61A43B3B5EA9B9E1E7A99C6FF06EB61F0ADCF88E13272FFE726F4E629FCAEA144F5CE9AA4D5406D24970F7D4D2F813F151DA050A58F49739743CC8EE5A56421DBE872093840CD2B5D62645A3305B2B7A5C5D11C5C5DFBC5AC5AF35118B1777F22EDA154BD87F6C44074F3431AFF40918104E92FD457D57DFCBC5CED5D6C12ABFAF52755546E0A1DCF0CDBD75AB8BAAD0A61C003D8479ADB082368012B1976E462574825D7FB3D230ACB60D78BFE133401AFD2EBAC0ED3A36A5C4D210608E2B585F765036094D51F249CF90CE6B35F1A1023FF7B369B386383A4BB7BAE1C2D01E8AB5184991FD37CDAC3B70F05C6BCA6FD3310E209677EFABEF18FCBD95961187FF7244B61CA71004082A062D4395DBCF8148E7AFB3AF8712C66D5978017A371529E8F0EA2714522C2109176B71C1685A3C2C3B4DAE62D350EA31F0AE4D97038EF3F1045AA4F0A76DF5BB8EAA971BA10505FF3BD43EE967C714A0FFF524A3DE890588787FBC0DB64C84CE57F3D329B8CF8FEAA94D5B2E500A8A3D4603F0B24951DC04A40FA32148F849EF4F6F9174F3EBE8306639FA902ED6386EF57FC7B25BD2850616CF84A92C6DA2B0046BDFE07816495A1BC04B0F564CD6CDD6352BC83197947CEA8B5D23663F04F896498CC2F758F5DF356C969A8775AFC9F9B6D2F742DA7F6DD662F5ECB825F4DCBC53790DC013D67E3F4B92C400FAF575DC942AAF6C0CB6BCCA1EEC956209271078BADD34FCA209E5E054B7F647BA6DDC6C801023FA4470AF9CBC43A127411C3624824C451CC1783A8A45CF1754C0740FB00F28E1F80315334A2E973F5E68BD9F3881D1C56E27BFAB08D699B575585ADC4733F017193A3D206D18FBEE2A38DB22872FDFD3EEAFA089507CD9226A5FBEF1D3BBF82A77A686FD43B158552BD081CFFA772E457887ED989367C79C611BB60D590A1B6E40B0AAE1A9E28F3C574A5D7FFB0927F23179784BCD609710DEE99B28FB4AFB21B5128F4ACC4D9B96F8B040480947A158F3C3DCE091CFA1E0189A02C04666410C4F3BCAE97ADD25E4DDE1531C1F4F0696484335376E1B90E570AE31324ADB50916F33F9CD7DB8DD169EF702AF7C85C0C9936B7702310A9E33ABE478CBABF2990291C2ADEB56381990661E997619E169EBED689FDF634E5F6495C522993F116BAB5EFF1EBAD7D5725A52E79B1370271ACA7B8CDD4253B99E4262485590167F5054B2EE1819C2AF1318F5448D7CB24CF46EAB581EB2342857A460DB588F7FE244D2964760820E0007CC79C54C0F2C228F1554E7E4BD619E20899674B8E656849813FFBAE66AEC7160AB5052396EDC48783E4C423A98FD8671F827D6EB9A482175F42D380F713B2429E286396C0F64B1AD4EFC799A1449FF167849EE431585C5632FDD4441A339060227195811C31A619375299D9ECE8660AB2D2296274DE1135CC1D63D3220700915F57673FAF1ED535EE75BCEECE82794A97C981381A2DEB54506FB50ECDC2F72041F88A8571266BA40CE3740F2132674994193B6875D877217C12DF4F69C6681B8E8C9CD607F3D9615DED3B26B9EC332DF86B7AA4879EBA797159196E572C3A368B588094959141A04FDA0A889D50778FDFB146FE5BB393EFC21354AEDA7B1A31A2F4AB516B9E886729CA64BD9421DC20E1898E95E54BDAD7C490D2823CA2C5D4CFC8E598B516244128DFD4914ED65B903733BD50EC745C6729C39CCACC062A87049FEDCB4C337BDB554D7D05674988EE45324B08E564E85B6C7E7EE189698512A55D9CBEE88043F3C7D1FBAEF756FFE04AAE7589CB21919FB7925EDDC48A51FBC85A5019BCC9F5C4EE473103793954158E9E96DAE3FB5773BC0D075621763F3D800FE6ACF6D63380A8B0AB73E09E167E3E495F35F37707CCF2DC6DAFC2AF93681803836952B72EA86B1632235FD3932DE69917E826F94A08F819AA1A6883BDF91D336BED1ABD1B871AA6DADD44E47D2F494FC93997BB411EB97A71491D143FD75839062C77A613297D80CD802E7CC4139C8AC128BA846161F25D23A04BD27A0666F3750BDE50A7A33C9FBC06EDC0E04CA65DAC8243172CD3D7943A1A7272EDAB16C7193AF7B8354BD31DFC1AC85A84216CE6F9EE25E7C35FC6A1343A269D30C9B210F026A7B544EE1860BF251B020B7D1008BD8B790F752F03B96456840B2545ED2268B76A6D89B7920BC5C5289E34B4A5C72A2DEFA540B2ABC112FE50FE6A1D4B7937E8A95412B28EF5F96D39BFF66574AFB0BCE0F76647E1B60B994A8B5693A1B879BF564C1B41B467AEE9ABE378FBCABD79A14DAD2C4412E006F3487967F3AF55CB8136471F28846F0879587CAC0E3D1FDE9D11B545F48C35AC664528093B0FAB4A4617F7C573AE411CEEA4B2EB964408B6289ADAD1EA1FD6F4F0AAA8E36C55CD79AD3255E6455A5AEEC098675FD95A06223C71E0A024C9503640F2C4D9056DB098D7493E53EE1260CE3FEC1151A8872BA69486A6EA752D44D3E22FA5429581E962D7DE78801BB2341A01126048B7FE8DB9D72E347EB6C613A9F45A61CE7D1E38BDF2BE89DA0E9B8AE2429CE952CD0C2BF391EB7B774D6AAC01BADE8BB14065ACE2D9A2460974A3BB3B93523C29ECC0ECF83E7E3C81A2C1709802782F300FC9A1ECEFF6791AC6228EEE304FD3FB3E8214E9E19382C2291B401831BDF6FC848B2BC9A04F39F647C2320BFF4E5152ED85597053354E7C36DFB3D4A660E9182B8269A5241A4AFF582EA22F6186D2DAB9FD2AAC5486994F3CAF82D09B655FE6D919E06CE4BC2ED33A6A2834931F0ABFFCD91AA9363CB3A4E92A6874876A63E2DECB4647A665F60DCE5771FA5E64AC2DA4C2E3B24AA6A09C663B83CA43BA5BDFF64565D7C8C31986E31CEAEECAB956747E4ADFB486A198281AA9E16AE22BCA140B91F4190ED454D1B95CCF3DCBC1D1ACE50F5BF8DA974954AD3DBD1EE1BE94B742C6D328C53D7599F5FE0B29D26A5C48D83475E2DFC1396448AF7BC11735F00AB817EAF4EEA8E7A789C202EC9C1F7232E16446AD38A1E7719D7ED015C1A472BFFE0071CA7F576A3F4CDE591DCE4CD8293D38EFB2FF42C2062069677FC8D1E5E54F42EE9BADA7B38A0A07606A58D9B340A6A6E888B4CFB0BB3E6B9A15FFEA667AE873CE7B6E3C8B857565A8E7E267BD56B616D911E95D208F82336D420DAD8A1FA0E571D50B37E26A2B53035F26D8C8C6AE435FE91154819B434EE93ADF3977D7EB8946FCF5D84B8E346EE68649D168B96A9693CA5DA10E5C63E691CC4EA78AE1EB3B639D91DBC0D607D1A4A26DFB4171E63FC038A5BD7A3A8AFA891F467F3F8CE3F4AB1E6DCB279EC5CDC27BFC5BEE78A51FE61EE7424C3DB139129742B18F889217CE694023041B083172D7FB0E4E2F0C106A269920A591B87D5D34A8804C144E39D9D49D8528720BDB06A5DF6432B2FAF39B224758EF71722CA0D2D5DF6287E56E99B124699186F7F82ACE2A0FC2443AAA49B4F529CCE55A686260D455AC3C687EB070DA818E8162043A5F3E2147726A6C983B95AD82CB91A466CBF720B2A25BEE55AB4F4179A91BB852E0FF6DB72910E00667BD70A6BAFBE4DF262AC28A315188034FCBAC2318F2EF2FDD5A91DC33FD3DAB171A4AE4EB479ABF5A72438E492E119F676A775D74BCED74CE50C9605A18AB38ED177327169327F820ECD8A6AF60D6BF390264C975D0365A3CC6168A8E3A6541C71A9121AAFA78C4327F3C87E446D56D7A1A2747A3D1B31CE128EA507C9D79F68796DF94CFB5044E89909706A3BE65F5E0B91074131D9DF557844082002857A50536005D6730ADC505D8BE034ABC6922C2F46FC37CF5D369F8EA4D3B64823E6148E1F16DBE188EA00B5B6E3A5F8AAA9B2B1DBF1BC884280F5296548CF3625083AA5CBA58BAFB74BA65BFC82187A91A7E3FA21046C32298C4B9E21B17B401BC98FAEA9FF2C051E02FA904A618CC0687B97BE64D515219B077C3F5AEC8E05CF664032F36AD1917ADEDC1E0ADBE8C8008B36A51ABCDB45B46E12A283EDAA3174F5C0E3205ACCFDA9064486F9F617C01EB33FCEB6E8EB128AFA7D85572F0E8C33AAA9141A05A8A5BE38FC1378554CBE565283D0AEDC7B8C09AE5825DD47A67AF8B7524E4C02A5190B99107DECD79A35AEBF2E04AB3DDE572F1D0B6CAC82C87692811BC002FD7154AD6AC414CBFE9F311323771D19A1CEBAD9FB1E2EF7386C89D199EA6ABCD933B04DDA574179C98B317ED959890AAA5DF1B260E706DF425D74FD3B43321334753AF0C6CF3F498D410F6FEDB01EDFE37E263BF9B85BF22CD10B7CE2433D86591D49631F9944DA1EA7251FD797F1913F9519BD1DF71A7C1947C3F5C4C26749038916CF67BAC04A3A4B1C52923C1B95DF7A3D4D2A80696103CC4AD7D54F165C40DB1B4D80222A84D4CE82D1DAC8E9DC2C2E154A84191F8320B4CC9A6FE875EB35C011B621CD14BD4FB9785BFD97873BE26DABA739CCD826BC982DCB559015EB59979B19B633BB5F1957FACBA0C385882D91B7023DCEB169E8EBFA88A04967BFA48C0166FB6D84AFB24C8DE2D10D86F812A49EC4D812AE8BE63231CB3932BED0EF3A2713C11E8CBF0C0750F140CE97DB640176FBABA3E791DE +AD = +CT = D9F821897E5545851178DD53CDE2D058F2127CF29310EC7B3FA69DF7819E656A728F3543A54BE457CDB357605048CCAD9197BA1F7C677388B790A6112D89EDF9C9E19C233D75731A5267A258F7FF9ADC90CA0E5BE6F52D04E63B338AAB168942DAA651C1729084073741A7E40695FE6C2E5565B03C0DC30EBD0DA44503F0131D564E9990451C0B34D10999B308F45E38FCFE24BD4F67C850D18E1231DE880B44DDE8FDF07B147982257AC5114945D9D46E3EEEE03DA4FCA54C5D8A8C86E9E86BAD42118AA282BD7A2A58333410D936570DD1E71CBE5B840646C43B4ECC4BB2873A7888297D6E3A5BE2CFF70B6AE2D46B4B73493828D29FF9C90F7C4FC21CBCA29F1699DE2233134EED894434DDC58B237E715369A1312DD6FFDBCE70B9342236605FFF3191AD5378C6CB7680243A9EEE539D3C30D617533CDE6F4B4C5F8A6D831CD39E91D162AF136F683A143AD2C6A4AB5BCB6898D0394762E1DB7140F18A38776730A08EE4C4F9C3BB66B10FD21EF3713A7B9895CA04C3F44098C086DD0D75A595CCC08033202E4CE35E543446B5361062ECCBB3B06FA11715F1108997F74984AF90D81EE0B65447ACE5A37322DD16382819B6E8319FAEAAAE44321471FDAE5DF4DF93C3A5131DB69819A47267E6D80171BE2219E771BE1E77ECD9A2B1B677FC904042D06632F324D63EA61B52DF574C625B6A1D1C96A44E23392674E1BBAA3231B71D6B874C40895F445EC0A537D730662303B7E689F92BF9B1A8D61C9FC47B210B645D5743DA54B18F6E791FCB6A6742AD598E20224231D737AF562BC0C146DE03D0FBE03EDB45DD46E3EF950C67BDF8819489EF10EE1ACF6CF3EF3EB87BAF0EE5D90FDA23E816DB289C3A3BF680AFC0E880074FF5371E7B22E182B87378F333F0C28371E68EFB39B363F035C8185DDAC66A9D7C667A4F8F64C25B34DCC1CBEF621399F21AEA9A9A0D7C7EBFE4491EB36BE9E5892E965E116CBA1A2A0E1FE0B24989B1F21310398F24488FAA2B6820DD30BF3451CEDDF37FFEA1E964F4110EDCA6E1D4EE70366232E5C0AB3F4056DB2BB998C353708E1E69FFA06A35DAE6C60C2F978A3B4F02C96956501270F9785C66C913BA5BB9C9948E699AEC1B3151E254BD0616436B2DC18BF70C41588A84CB681CDB71B986E87A86738CFCD22971775EFF626E84B7A5A087BD03F87D30A730793F9F4CEB95DB2897C9E38220E54E33001CD868B681AD0DD8ED2E7E04BCC05D926108AE7CADD8F888B0DB8403843D6914E872B6704BD3B138586603C663D5E052EB78EDC2D082BDCD48FB3A5E60DCFB99EEDC88C5DE320E9F0CADDE111B6F0A63127FFA0740C5BD9B7EE319B9800B91A7388C509BA1A02D168D38E0A266F737AABF1D018EE75C7C37F97D732427A702582A1355C2AAFD0DE9D601E04587A2F4807BD5F12B0FA8207595184EE6E645B46E9F6090BC60A9D0C545C077821785A6193A772FB9AF4AF32DB5D93AD67891A55090CC6E031D0C3A5C14A91914C57E0055D765D0222F1BA1E09A49CDC60658C5474781C9DE6F78EB8989579D453C867D4681A2C9B4D6B5EF748F0199A2EC7C2E514346809FFE6890C2190D8D680B5411FC9D38AF30683DFB9BA72B35F7429AEBC0148C3F496BB1C47C5BE93219BB555F17DC7FE0EC843DF7F6BAE6C6DC39BDFBF81CF209EAA39B943A7E5AEAD1DF95E2AD25FC242D3A19201F198157FBF384F09711DC1224755170ACC45FAF5E3B056435418D1B18AA2321FFBF3DB94A48B2DFCF6770FE791EAAE5DFD0E95478A037A70DE0FF21DCD55C0C0F9F508A3E5DE661D8DA58F021E02C37F0395AA0D3C1DB2BE4CCB5F82C8A3C25ECCCAFED94F15A14DBFD096188B8F4029CB0AC49A5D290506C58A1E0D115CF1A05C79973D72C5E1C686A11879D74EA82BE02E884A546D2F45E3BC9914E7B8CE9044ACA74181A9B7D2AC8772EBB3260D5A3D1531652C71038ED31E90A94D22F453EEE704DF801FC7100A242755AC5E207676360508CFF24C227F148F596EFFDD2684C34C015632E60EB4B992D074E0819564265E1728AE467D0CD51B27952602462D54D5B0075BEC33F778F04BB69EC45621BDBD43B8ED9AEA266936662F160DF03036E53578E9BEBDF0344DBED95BFF5DFEE9BF1435DA77407D9B82680132354F5B4CF4ADF8EB5B0C7AB4F2F1131DFC4F2A8D2C7ACCC4CD72925B74B144B908CEABA1047E3B62963C6354E3D12D55DBE532947DD7580EDC6A4C050EA5C936BB7271546A374CFB4036D489454EC81335932976F35C331AB59975354A2BC4A1ACD4C8775278260F745931D8611805B55284B9281F9091179DCDCE0A25AAAA513B86BDC2AABA586D0916850C9CBBE28410FD0D85C6DABBBAC0E5DFD9D8ED003E99C467B0279751C8B4716C9C003315703CF764FD086585705E256BE8A68057733D92B9D91A62D410423D39FF38C151A1BF3683E3745FFD883709D930389DFCFFA0E43F258DEE6A08E709F1B89C855745F697BA0D920F185CF36EF387E463BA20CE80561CA9645C099F358D7F4300EBBADBCDF3B0EF86ADE1208293235232A9C56D6F163CB340E300C75FB838F8A7A604A136D6782D596943A5CC84B154DE1B2CF1069D750B4F07A2D6A2FB3458CE267C91BF08A462E1D4638091F013DCC27F91AC495B57E6DA896DF8DD02B66A34CB49FE9181DF270E052F2948D5F3E5C7B2A07ADBA9B4F67BEE809BBD53F6E748B964E691968465AFB90B03371BD31C2E8F6BBD6AE80F2E2E7CDD98AB5C0F31776D1952552EA4E289FA9CCD2ECCA13D863A32803D7586D59D3021A21A06E41444E86806F066123AB7E7AC562054AA00532CB3CB5BF90EE3AA3EEC845C87880F64B95DEC5B7036B3A4284C7B7C1FBFD8D50D0B8010EAFFC5174C3B21950A3E2852608A8121C0EF4B0A437018B69ECD6D16E6C565AFE9F57EDA948BBD87342A48E2E52F84AF3B9D87E1E83ED6B70610240355E8503A2B4965F70042BC39F400EDF32D2DB1501D5F6F742A6082AA49AEE69E3FB06C7ACCE4EB7B53653376721E84931AB33016345ECAAE0A3A9F74F771BEF9E6298E02B489DF02C7E99DC354F302C92D3F73775A8D0096E13A5BDD852E0ABF9C57DD67FEB23B9F5AB17B72921A83EE026084B34EA590A3666C50EE4502AB1547EBFA023CAEBFDEDE59A6E97380A83D59BEDBC4C00CD0DEFBE7B538591D263A9E79C6BA8BD548107DD57943B8660E8F3B42D4D6A9F521699685EC15B7ACE2E06D296A6D199FFC3F3E40D15E1281F504FEC72CB75F45460E0EA049B526AA46491C209C6C54F7A205BE29A58460EED1433BF763DEC71A0DAD5AEC1542FC1B4CC82D38437183649E8376B6863C573E9A320451BB167B8C09D6C14525CB436DB544B29F39DA3D0153DC50B92B54AD23ADCA4C6818B65E4AECE833A7F369C01DA59E131A7528240896A8D3D63F8604C4B3DDD87418AC6E3AC749697ACDB065D019A8E220A5649D7B46BC7D1D6F28BE0860330BB576CBC28F804231721187B46E89E59337CFF86A9E68123E7AAEDF188A3C548DC6CCD767B5F614685534C0A6AA0239CE0D77F5C09EBAD37B8E285BC93F828409C60F2FF21FF50E67CD8DB5F9E73DAA6896365FA138BE8A49EFB86110B4BA62EAFB7A6B4D064D514E6CBE7C84EC1F4F85434173691B8DF55D55430C24A4AE4F49663B9D7AA36E7416C7C7F4EC885BFF5EB8B86C10B591A57955B1025FE0802DDEBEB125E412C7E36507B292414697197A90452F936C12993ACE549991F2D1698AE669881FAEE2AB5283CB443914933E106B38AA6A50B21375EF467CD38D0EE94E7A348D8794D7308700BCE772CEB541815A7D34EA6E24FFD274B24BDB6CA28BF8A5EEE04BF152956BD1FF7FC6174A2FFC6373ECC5EE3EC46B710166FA18E3C48DF21C01E6F57FD872C70B8056C026AAD1E1FA0DC60CB1A3B0284F59DCE135BCEFD592D2A13A2C6D73957B0DCD208EB79030A6EC75B931159DDD2C3E51A3D8E4A34C3ACE5C43FCE3B9220913933DEA1187FB7B88C75494154AB15B46F953606AAB76FF20C9305F7CE40C253C09C5745E78DA1959F02417E3EE3B0BD36ADE82B0706C7BBDFBB16567DD87C58CAEC8EDDA992425338B2E0A692169341790B746A372690FC48C52DFC33DF86C2BAAF14B330BDD57DAF2F240972A791015766A3B47C4751EB7E804346AAB792FF869749BD74FAE073430AB9D8DC6BA809B622BAC92E657084B9D30052E017FCE7A4F5B69E0502D316BEA65F6EBA60F43E6FEC62CF99FB013C3782BEF651AC9BD3EE8E22B7FB5CB133FDC48E9E4C7372DD9A5F6DE525E3A32E8FE3249A0A41052607FFC9B7E28BB8517B2823F29573A8424963D7E0B5C4E47E6A608308E8B8F10463CB8F4CE1CC34CCFDA7B553A5F7EAC85DF71C26A5218F3C9F9A352FA0E6CD7E953ADF2B5861579F4A7B2B5C6D1560C4C7E50C67A697F64C0FECFEE96C9259CEF982B3E0EEA53AE42956ABFC9FEB7297D536F662A996D603C34ED655B353AA10F5913A4902F916B724707177DB9B4D37061A9325712F7B6552E203D3485DA89B3869BBED144F770B204DFEA45B633CF59BB44E36F6C7E1E69A71F45DB7AC9091F51EE31F9A43D40E03E8E5921CBE2791863CCD063659BD78741FE52FA5DB55C71A1698C4DC6F3417C9FACE5AB85540A373FF0B1E785E28DCA12DD935FBA8E31207471776A40DF2C646A3B8EEDB1BC92AA760986C221F1A004A00B87C35042031F85AC2B66978498460AC5881977568D1225F1C17DEF8509503AD041742E60FED5A0D40C35F4762B2098E359C2865EE6222BBA83EE86C71F0BCF0CAB58B35D7FC6C650DEDE57685D02A97E4B1121DB38E32F21CC24204E640C5745383221E1D7AF4866594A371509838EC4DDBC6DED66DCECFCC5EBDA68DDD08FFD78825F3A38D5BFB2E4A57E21746C7CE74AAD70714377F5FF55F707E7504386B03C7B28BEEA082B5B6EB2D3C3BAA6DD4A2B2F9AA524E414F0244A9AF4F0E0823BAB80C5266341A1DDE98050726627C3E8080FF0CEB3219EF746286139712C129BC0FBA572AE76BCF69EDA2311A5CBFCF5D51AB26981384B415476E2CB9364EB934150906662BDA1467AD70B786ADECF27A4CC828A4B0C4DB4F3C1477052C61B2400EFB6FB07D7753C5B2F36F73630A7B1B3C639C41D4118E372C825F2B3892816072429A9AF632A995CE60A9B8464465553F2B0AFBABACAC31641EF5E4EEB3D77CEB0982A48A73CBA341C8CF89775BBEEFFAB622422858960D788B3D5CB71C84FEB0F82C7A312F014693617745764A455F5749C5F977B7061361EA47B35B8FB56081168203749B63E71E4E5C45616BD05B04B642BBEC08C9B2B7255FFD6A61B9434C715807862AED7185B607EDFF8E2125F7A63F5042FE263851F1E483A8ED557FDCC095C7D7BD4ADAAA87C641A7E4194D978BC101072359B2030BDA169256451A501979E9B1F04C5D42656AFA09D0B250A31FC220BB4439C5269C4DC5D3B843E2E5A9BB147CDD154E91A6E35950A9CB91641E3C4A22B3D83D8BF9C9F0B62BA6BE55DF8D718D6864C17E662DD9B4D6CA60CC9540465056136033397952D111C9133B7B8FB567A573AB9931A1FA1E3294BA6AB595EE0F2D528310B068F420E1D2AFD82FA8090E2D6DACBBCC738E7355824BE12DAF6AFA3A04075A36DCCAF49874D7F68AE205D316600B0A4691B7AAFC850D331C32D2AF24D79EE5B85C861661AA896E47B2DD9CF161570038158C3D9A80F828939E60BC46772BE60AEBA7E7BB06D61213CAAD3CA2FE171C9C3C358014657D9B216B56DEDEBE259EA08D04019E109C346EB4A45DD0524417C0B2AB95169B05658D6C3D5C9D366427E4EAB8B4D45357A55ACFB1BBE53D0DEFD6800B7C4160B184B82164F547FD35636C51CB3449F1B2AE0E00729D2AA0B2B1A34DD3FF0C32CCB3C6C23D43E0981B3B74045530D5E9FCC55A8775FF4AA5A144D27F67638CCA311CAD0FFE7DDAFD1B5119D24B643606DEAB3629690625DBFFF7EC4AFDBDC4B6727DC4A597E5024BCD0F8793450B369115E4A5656F87FE7122E1549F0FF0922DDC59236383072F0B096E84A541EBFB1A61FEB0F1977AE34F8605E2A927FC12171FB2EF78FFB54308E245B5A38E5A565E641CF03777D91CD2BFC753684B1B90A9724615753CFDADDF62C7266992911BD906FC6535784BBCA207B33779F50113376E779ED4D06C1FA0EB0562E6B3716437B526BD2991BB47B25B0D227EE4143C21694A4C5487E18A26DB88996A87E3F158CAB98681EF8B2BA0FD6196B0BB6546B748F435D7C993DCE642604080A34ECB6C758FA4BF4646F44480C8CA41296BD0279AC9AEEEF880614F377CA0B3B73DA6546A6B1B1E695BAA161906DEE246F3D4B156E2A05BC800081CE874004B6C17AA5CA0658B2648CF70F53217859C525A0F54031DA87630F9931CEE2A6E8BC8C9C10AA6462504B13B3F64EC62ED3EC2C2D090E5008E2C77A9EBFCCA4B36B0EFD081C9E2C1FBC26FED6CD7244BC2E04969284E36DA5F0E85ADF5BE7A7636AFF2B5AF6F8BAB63B45F8127BE8CCC369EB642A3D0217C8732A6313967B11A71C79A4A528D2402607CAC5088E11D7CE85867DBC9293C2E372FDC2987F0736A796E8CB91BF1939BA493820E773EA90D6FFF0E056AE61D25604829E79ACFE02E15D60758CD984EC668CA7A1E9AD26D0566995CB7C1F409C93468BE65D4D74BEA1CEA51AE9C027FEE56EBB5378B13EDDB39ACBEA2A3971496E997F7BC43AA365CF861AE31C8D102E324E4AFCF6D76AAE694968A0BAED7C7080B6661B2196450986D65E93E53869A857919782316857A962D3A64B5CD89F28B621B3955EB108C661947DD5CFFCA8B9F685C84A9F7F0A7495B15EAF78119DB5D7826D365CBFBB9324F52F534F0E40C77B4B216F16B5846EF52206C09B09BB98CD8E364CC9192A6B818FD3614E2C640005D445185CE4F72E5523CAD834487AEEFA51EB504BC2BB5284840B9718083DC311FD184A8FFAEE4B915C9FA781D6BC71AA6B65BAF3EE76C3B9628802103BB0DDF94A30DFB74FDA35225E4DB08D164AA00DA233EF5DB71BCF71AADACEB29CE4CC93E6094635E92EBEC78DE01E5A2D00CF6443DBB317010FF96B9F59E8CB503D0BB26945B90A7FA4ED0527E4D41ACC17FACB588DEA7F94E25443C926C08396A68F68E657588DA0ED6F343B687C5C7D1AA25E82B4422654EC48D7DB1CBF49713842B7BF4024EC2E90DFC8E6BE880C327193178E6DBD1084CD7A9BE73B013102AA327AED9ABF067B4F348FA8D5260A87CBECFBC601CC7007E63A2555636F65A700DEF85F93ED663D8BBED9166A32265AD3444A846F3CDC04202405BD12544958E23EB03B93481517351FF05AC3A8AEC5B82C881DD7920F502CAE35FAE92FFA90B2D6C6C310D3376F6F45B85EB9BBCB505FFF8815120D9A7B69929DB798AEA1B7F230694B831A0C7C20D4EA477CD67B696952F720B9C8F17F7FCEE86FDC53E371CF514522F5BEF98DD5BE6AAFBF20C99F57D81EB4F18F32BB2A470C6F6930DB98A3502615178BE4F02E7D9F60D8518F3D39D76DC367D3DE2FBB0A0153EE0AD82F97C05D81BE60CAB29BD8A7A2D6540ACF270E50E9E4898902F9C380E03F6C16A2A23FE81B1481FBAFD4ADED2917BE344F404E2B2A09B04FF91D5CEC30180BAC4C684F39B17030060D3F12AD0488BE7F59C85923A6943299F0040350D4E3AADB583F482C0822AC880C211A08B56F332789B8CC0C433F313881E80F366CABA5255FBCB1DFD58FE028778AE120FF03C77A796C1AF6261FBCFDA780615AD2CE5A9D138CCCE1F763E0D69D8E94126D00158BD9A63A16E3E8D0433268DC3D765A8241C3FC66CE50421EAD2CA81EDDF3AB6CAE15C7913E8B447213E272606F4305956AA8CBB688D17025E25FF7D0405A59E5402839896F19722E1973725871FE16DDF629D47E44C98416B7937814CC0ABCBFEF4161663BE58E2BAE3A15BB8B49F4B75275E85A689BABCE4475047CEBFAE88A1F54A8B953539A299B920B2DE894B32D20A9573BD9458A3FCCAF0A1346885F6C1E3490554D1DEA81AB9DFD971E688073BAF71956D2B2AFBF13B9A36A004944362FBB08089E5A41057FC59A85F056E590ACABD36D2AC2600DD21B810655429AF29A669D0B338CE244DFAA100E46C0736377FC2B3E2060209849C4067FDC5D201CE9444DFFA83A89B5A025CB19B922B1DCCEA593F6B8B0439A92C40BDDF61BAE1D8BF5F6217C94020675E5AA777AC12A23C72C3C5C53357ADB2E40F40DCD780F9E56FF13B77D25E054DBE5A12150C36046B98ACC6093EF0819F2F06EEFC8F6C9DECA3E29A994797B0F391321111837ED336C4BE6D21A42279E6A90356E33140E35D32E44F59F0F0BAFBE702A8C5836986BC0F4B3357AA3A49496C78BA24B5E8AC0ABCB4761071123856A2F24C821055B4FB130EF781934A37DB64130FA948E7150BD6136C96B0B4CA86EACACC02EA33D78A7A7AB38B60130F4F6FCF658F1E9E44BF3114CDB4213EBD238CC0BC2CAC1B2567A06153B9EEF352C1CE55C7E138C2F645A6A3F1919B8DFFD44FF7AC439D00D607DA29C810988C7DC1977A12DA478650F7A88BA5ACDDE97437A68A73577EFD0A2CA9BCE3FE9634D0B9076C360155EAAEA3423E6521B75075CFF74712E516842AFEC30B3D54C73697C06FFA67AB9E750FF78307F8CAB8E44B0261556A4A9A31F56A97786A211B980C642CD53BA1A62D340A074792301291F59A992AC27A1E5207E3506E7D9F3E3AF8D84E4ACB79374D2D39F64CF7585CFC22A016D42F6A19677931A4EE35D4B52DC2F5CCCF15403F91CBBA298CE188A57AE23A01BCFD4490F55281ECECF03707DD4E98E7B8D9E0B313F838A933F6A988A14EB24210174DECEA7034D144753E11D7169D34EA0F4F69DB262ACAA226132DF75AF8E0D3CBEBEEAC38133266665DEA2A23C0951FA1A6733C8828CC4385955604B41D3589B9326A74B776BF85104D73B25D381D66D8F945810E1D2C0391E86527D0A3B7E3919930B1E19718AED20E40F6F41E65839F3EFFE5FBC3CF12295A147E49D77A85A9CC815FD5A093022CE4FD053CC56F9F4988A052D1DC4974574970B8D9E8B7F880E850F493FAAF1FC26BC78EB8461712A412E2109AEAE08054A9FE9B44BD09962CE159ADFF16166A19F052515D22702B95C3A940FC6E63A8380F343776E037B2EEED02C136A076B7ABA315B4CFD43C2D18A43DB385412976B0CA3F92E2C1D8EE4DB2E6D1D246FFF051C5BEDBEC1F10696F92A592E4DB72200A8F612E1F96C0B5471965B6CD82CD2F3791EBC6A6EAE6A3D36B0E4CD4E9DB9D137784C0F857F0198B1C1F2C377DD2D4959F155BBFAFBAE3C1D05EE0BA2F4A5367E0B6295A0AC46C0CF252C5250C1E352A1C490AF5577F76FB3A23E60584BC802981E00B1C5CC126E2C25B659A563ACB697453D2D0C4A6EEF1C4E178147AAEF03651519A4DFC0EC60487043A7B9FA0617729249DEA49A08C7B5FAC7C82B7BD60CE60E27BD815D66AC98604841001C02E998252A077E0E753148082ACD6E04A61AA261112822B3DCE9A3380EBA3034FCF9AB32634CC7A2B0DD72874F6FFDDEA0AD7990463506D5E59F003E20176E45495EA7832CC23108DB87965498080D1D79F173138BA7AFDDF96D29D09F26DB701BDC51CC04E8ACB38B51D038648920ADC8F53F56FE56B39CF34285BA6D481661E5FA9D23DFDD8618837C3045ADF1335C2CB5DFF9AC76D44FA1597F1007212C9D0EA9F169602C8597619ADE842EF8B3C99C4F477A5B90EAC38FF63E1D3B3447CEAB69A18C57608E069F5A1092535F5E72276BB5A743CE530750C910288AE39A20267353C4979E7AE945E92C3D64FB36DE1D16D03320BE0DD76CEF00A100D0AFF68B89E9665ED13FB6A206D670B39B9F7465F8CA61FFC3A352210F6F9696D1F8FC7CBC3F07FA6D4C53EB6E54BCE5FE22CC6A366AA7AA331661D95568526F2837C403308473E629A8845F776623264FE7FD511568ED0C65A2B3EC4B0F91DF086C3F9AC98C458AB6AA3EDCBE31682C3F8740206719E97E8F37DC7A3C82E1AA16C5AB49EB5EBB88B4F844CF61939E78AE4376A52C0414D213068E9AAAAA8A7BF6BF26AA67F4C0543E0DFD0CEE6EC1336D502A378A23F6B3FE4B0E09F98E87F614A8C0A75482C121EC012ACDDC76003D191F0FB8C7B3C78DEB19A0AE72BEF3F4943EF4606F50DE056A7558D6DD7E748857FBEA15650523D3E186F38D480E883577F28B08903666D932B87F05736B609CCC60691C917059C7FD405BB5BB1835BE16DF6C139258D47BB27D84EB2A6600C12D9251C39C1EC1640E9693853BF2254577DD44451DB88561C886236D79B6A09EA83DCDD8C8A3EE5980DC81165A8ADDA6399D14D62E0545CABFCD6D3704B6BCB5A2FBAFB11EB42973F06E03BCADF5793D32FEAC08AE26D378223AE8011654A317A636AF271973D25C0503C548A98514615F0A30D2508A141C1F74372545EF44EFF2181DAF3BF11C2018E81E6F160B36D8F451F00670AB3E314205CDC469F85CF782AFC353426355DF04D13C226BCC473B738116A51B086F5BB9F8F792ACC3C6F3CB814D73315F4C0F0403F518CF926C5D131DE4A386F04AE3A71B3482651F84980185EBB634EBFA7AB16BBA824846AFB8AFB182FA7E9E1E654EFF78C4B1B7C22D282787881CAF90943C740F4AD6255D5AE5DB7B28A3621D18635FBA6E02E371B27CE6D41472C2A968E44CDFA5411BF1927A8115342846D20B11E526C18854993532D9FE97B8ABBD400310E53ED057C03B752CFDCE9B3F2B905A719600001DD9009404414A90758E0A312F810A29FF7DF3625C4448E23D5EC8AF4D7D9C36F78F02867AF64B82E17AD5A5BFB829C897396FDB070DC2EB089EB98224540C1BEE7D6D41D3AE3F256BB1394CD72AD92F1198981D37EFC7F34A20E3D92E001DD584BAA814FCB2CD8BDEEB12A25C50F318E6BAC3375496B580B9294C34BBFF178F4EAB8E8263B45F8C12A6C038D5EEC4F812734E5F80EFC96D52FBDB5B8AF9BB008C02FDA4A9D7937A556721EF5D0413A4D2FBB818BD3BFD98B3A33E48136E82C3706350A7C2ADE064456B0305CB8B1D969056E61B1A7BF05428381C8BDEC4F1C5F5F5E0EA8A8D26BA31D451A0245AF8CDCBC840BA74E4D3CAFAAE82C66ECB04A607D94CC55903523448EF5C40E31EEF7659EBB90F4A2E892374BE36B450D9C7B3237396BB7952C9FB88C24416C4C6FAEFC2822E7B706A14D6F8543A97B38E6C3C3F10EB5B24ADFCC0F2646126B6A8805801B107C39F191C02110005023FD1DDEBB33EE4541C02A71EA5B9418CC49E06FA4AEEC43C14B2A02437F09411DF7DCCF46855A15F1F044219F37A273A9EFEAA0C37CAD0254212F8884A2491C423C05F35995F6E9A3E636C8345F50D71D57FE80F92D8CA27C3A03E0007BD03C3D852503D9F9D52F467A7710E1CD018C948EC69A621E0FD67C2E011EB6F0E69363E2E1C666401C4641F20103694736D180464F49C6557A31C1F3BCE6CC40831CEEDF29503A3876CD15B57CB9B6A66388D04027D393042C9B7574D1280100E09C9A3FA37C3CB615F93371E6DB9094C92FBB +Tag = BB7A49FE +TestPassed = False + diff --git a/kats/ascon_cxof128.acvp.kat b/kats/ascon_cxof128.acvp.kat new file mode 100644 index 0000000..ee17cf9 --- /dev/null +++ b/kats/ascon_cxof128.acvp.kat @@ -0,0 +1,10 @@ +Count = 1 +Msg = 986C521DE0D8BE29B284613162F9D05A +Z = D9 +MD = 34C9 + +Count = 2 +Msg = 36DB8C65EE7D160030EB2ACBD7EF89DC7224028C78B8E281CCAE6291FC3F60B5C0A7F8BA9BDAFE095E337D9F5E31755C4A40528C40F0677EF80A98401A8403F08B750B30F6CE419825F82E443B42239B380647BCEDD474D0407AC19042BDEED9308D14E82545657BFFBA6648C12242B6E7FC08143D4602B7013BF07C0DB056670A5514AE2D3A76F3A0CCBD326D2B0E1D380BA945B5D99BE98A5DE7E954E96D4E64FE3D6C0D9388AD8514747189CF49D52DD244020610B230B92B24CF538D9EB75E6ECE6FEEA110A482FCC0A1652A60BA1411BC82A46A47544C0CB3E16FB859F875BC121A01DAE78BC2A07F0A5010CB8ECB69BB42D01C12F3267A22E1EE2E34CAA2C72BA81745B93A2A30BF04EB3D033B41241606FC172759AA1EF387B7069D946BB46788E5227685B08018A05C0D08E976E79FC9172DCD8B9FD1FEF952318323932B9836D57B551EAE91557BFF87FC9C160A11CF66D37C3DE7DCE914247D337EFDF40C3174D213FB92801B86D8518B17D461E24720B3BDC0AE5B4FF89241FA305DD77E0B7BCB2843F6163DE5B8F6659551D13FC39AEB5D49364C8219831B685086EA2800D3809C09399E510A76D807B8F5B9A7C0023695717934D52F480EC0DBADEC5ECECD65C1D035358AFB9A53D35E44CA24C973A84E5054B7879EAA6CC12BDD765D897939EA8FF8D68BCCAC9AD7266177EB7DE9F767049E0E7916DE2325C8745F1D24F549E40BE094D09C1C82A3BADF603C33814341E60E58EB6BBFD4B1D4B0C3574D7CB2301892DF9D5526CAE81B6ABF367DE6F146311D37159C5D794B0CE2FBEC582A563E2C3024A1A1A6ECBF4470CF00009D34EEBE7D262F449D94BA189491722ADE8FF11481094DC150A48B3177D02C8E794B6EAD0D2DDB0427F98F9B6A880D14799565E1DEEC7E94E72D6ED89BFDCCCC672B9F4823C41DB1B3ECEC877AB156C79776B7E26B4BAF8CCCDAC6DFBE0368292DC2343EE8C4F1B577B42DF1FFF71A36D6A6412445E9611C7C137C49FD3DF2B084C359B77D18DED284026BB61DBD8DD5BF900917C243E3446017C2D548A8B73AC17D6D3C9D62B9BEC76E9F437EABFFBE85A7896D33DAEE40DF15566555098ADC4A31F4A05050375DD74A5053A3A0C5B518034FA01F4906E78F2D5C880B5368BEE3C3F84CB65E6E35702B96E98A9A9C3F4FA14D52B9E9BC012B0D1123F3AF5183E2916FE0A779FFB9951A30F3B31D5CF4901D386A061605FA06F721A94D4B41C1D91206F92BBC98D6A193BC9EB9C94D0DB01C92D676E77DCB8B75D9AF57556C4AD96F1AA01663C9D48561C8725A67413DA913F931B86A4AF2953B6DB5E2E87F4C2772C449AEADF74C53BD51151E0A7124349B05435C3B916E25280BDBF613F29CE27C4BE7A2F78EFC1CACDDFB1935D38AC9488146E23CEFECE0552486A11C553FCBB433A2BF89813C0D0926AF5D9655EF548111AD92ABBAA58C5E064CD3085BFF579E2F640230CA3FC74439D915408F4A003431200BA8AD1FFA8D156183356805AD2758BE66F0ED24B7D1E64D72E0904CCFBC4C9FD63BF4AFF11069751B68BC92DC342BEEE8D0E40F460D6839C15FAD19FDC992C6E8C92E7232A8CD568678084E1454713DB5A264FED83C58C8D2BBED9162507751D6F6A91205B8BB3F038E88CE041A246DEE6F645B6493EEAC7166A077BB3BF33600B7771EAA5E38FCE625FB49B389C3B7967FA3F3EC1CED4307FDA19E184383C89A52CE4DA306C28F3767743F98A4F8E7A3E8E13B97004AE3CA3417ADBD99E4A2A132AE61BB751490BD14BB84A8ADAA6204BAFB306247309A07EA836EEE15D29D82D29D65F5962B2ED3517E8344C53B1C89B4A8029EB43F5A01145AD1F1A5A1A8421E02D510446C6E8ECD5C11C9AD5641AE67E5396CCFFFCE924363E13C5A3C2DAFD64026C3650B44483A74D0582E9054BD182289C0673B731E3343CCE18A3234902E61F26C307D495BA1F1315A2E7663B20F242338B26D489ACD0790223E63BD08404029CC9DE78D9BD92E1F750918EFBDDF1AD1660FFBDDC019589F28ED261C3D33291AEE4C97142797875F844ED290B517D242249157F8446268B3454864ADB211E141E0FD01714805A9CE879C597247C7E9111BE4F8ACDC30D58BE3E3CFDF33D9AD736C90B0B71660F91FE88871A808F66C7E5E5392CD193565AF28758D6436CA9BADEFE605B61632FABAEAD8C453BF2D83ED775080DF47DF59372B018FA0D295E91DEDC3B822F0B5672C58D7E3407111EFFAF2A0ECE549BC65108CCD8B15A25AE755EFA666FC7560FCC2E8538770FC19C6191195AD32A803D4315DA896222A528AFDEF8D50CBABF38492A42AFCF534F514720772030DACB5ACEBD1359ECDCAD99796C989806EC8FA6D1E101B8E7D07DEFC6794231BB74F7C503AE064F97554B7C7CA92662CAB74A5A90D04E5FD91272FE4F3393639A7BEE0474C38468D6301F7CA5853C3EAA0B251F2EE790DB26A7FBF12B180063C1D7E200CB21FDF722E18460C0D1BA53D63444340E8434A2DB02DDDCD7933DBE3FABAACD933B73781D3DEC4D53301A54FDA81AF6C3CC554D933F25B854211F9FA3C6211526ECB0AAB0DC26D097F75FAAF878DF3F7846FA73566D2A6405CB13EC1E4CA99D0F053E00E76045F79584B5ABEF7ACFEB41D0276CDBBDCEC9C25CA4F5B83AB24B5DC2ABE33ADE480800F2DDD1B78E748B0B38AA3E254CB14146744E9ACB503F6AC26A5E2CDEDCB063981F5BD8EFFD0233D819EA8F90842611015AACC69FAD3CB0B3731F4D2057BC3E8836A615E0D86149620AC2B165BFCA3E444D1B842FE9D3EAD2AB257CDDC503705DBC0759DE002038E9535484DA7B4AF3A8D108E34C380E9E52BB3335B2F46BACF75263A9B86050341CD29ACC955F00675021C40CBC202425BD790722DCFA85F4E7B78D8817A14B3870D4D669AD41F903AADBD581206EF0D72E3DFC4F693D67125C95D4EDC1884FBED69B9BE749CA787B7FF377F124F4D488B6B669D9A4FBCF336DB41D076D1B42229C16BA84C3198D53C580DF75B575FD67B14C270B1E6619DACC587995BD610E64A155650E4A4FB5AD390614142C598DF7C6A54610E43704260CDFC87A9FF7A654727AC46000FF1D719679D21851F5BE72DA71DF081AFD707A413EF17A774B1D315FCF91B1851DE6C787D48A7A54FBD4171155901E18AE3984FA5A2ED20DA2FA4B6C90B88253FCEDCC9B077046730615456ADA5921AAFF18B1961CC73AEF14C9D4DA3F0DC44341C32477D383112DE311F444E9672359C8906D77F6FC3735A2DD764D9B6C33F850F2191724B9D77C0793A2FAC2F605ADA68B01AEA04C5C558BFEC5061CD38286EDFBF3E75E0C251EC8F17053594C62BCC7C897105A854804A5C38B35E4C16F34112C1CC6F22E5F9A55F2D5BEDBF8FC4F8C084E443C722C58A3EF318A80FF2A07823C423D3F9BBAA9790CBA67BF9938BCC74BA9DC831B07AEFFB42312ECC51966C8DE2C9FA6CF1FF05D94DB2FB7C4A91AA674B335455D747734A33D7B78A7BCA3F353AED17CA906083BA98EEE4FE7E73B1B087C7801D4117B59B56B03819487B5E8272C6415C79E0D6EBB099BCE96275CBBF250602B34922F323387C74E02769721D8F618BB8315437A6F0956DA75ACC38E1E578F44178AA3950D21E24FD6BF6C347279F5A01E9128ED1CF5CC3B4B54BC86B4493FBAE7530A4E4283AE612303A3BF9D12680BA7137F7D2EA23721CE7859B8656B8B9D8FB14D1F6FB75D8AF2C7BA09420CAE28ECB0EFA0C9B28C352BE88FDA39F5FBC778162FDBD548ABFFC5E48A66F82DEFB1CA20CBB47BEAC3CD3507F387278350FCCBE2813BECC253A404EFDAE538154CFDF8CE00092A475B9D4252A6CD4524C832938DAB159CA3C507DD17BF8C0FEE851FCB058E597347D28496F3E99A2B966ED0279841BA7A37615509083C0297CF8D63CD86F24FA66ECF5BAB168EA8BA3AEC46B8DF64679CDA9593A429507B1BCFECC76675CC94941F39B8D8F60F53A8B89ACE1BF559C85B25D6F2F16EAB7D0E444FEB29B732446E57A29995AB8EA6CB41EAEB9E926F1676247C40AED9A33573BCBA94B62429F186565FC442B022BF973027AF73CFEE7BE52975054AF19594B47D25D8F0F9E0A717E96538329AC3B601CCB97EA1F3B1B3DE3EBF9CAF24B684B0CB1FD59A49BE9D4F80979A5AA6494A55BEF38E3826E2B0CB620AB24A53F7E332D077678AFE2BB80E1C2F215C275927F57536F021385C99E85F0A284EFC52FB98A4578A3EE1BF57834B701BF7C164A418E2CCC51CF7C1FA73DD8F2BE4036901C93388A7CFDEF903B5EF6CE5B830A216FA661F6C3F8DEE90E25D06515293638FD27E52C438BCD439F9B91F2D9ADC42433B68318DE40CD23B44F7C562C897B1227BDD0349EDEDEE3D91D572766EB0F6061AC315FA51E59BD59C177F30F761715207FCB1BDD8F8655D89F3EC1E9A6BCC93F1BF480571B6C096412DADC66EAD462064106E720F483D225DC8705DF98D4B304AEB4F48296BD0512C1B7CAB4AAEEEDCBDCBBA79FD5A94B98225A7B936629CC3E27D7B836E0E06F8401D55E3DB81E7BED993A03DC2D132F04685C603C4271AB98EA8C8DD236B7EAFC4C229E004A0EDF04DF8DF92C26EF1113A8B3CD847F32418F29C6522C91A9B7E24F07900A752FBA5A7C5C5CB5777F72FB7A792982EA667C19E10ED684BCB37235D517DC1E5F079D78F9730723D58C17AA5457B1177F34F8E88A76296658359EC9E927DF5FA2539B73DBB089765F584354F62C3064015BB6A01FF394E8DD3620C3D53D3AAEADB80700BB3E3BCEAB81893233D4702B0539C88D703E40AEBEB395A490C5A1211E94A73E252FA9C21FE8F59E6A62B509C6F4BE9B75AC3E6E77584108A8973DE6DF67149E2D3106D58F056E8849A1445CFD8CDD9C0605AB715638C6CDEDA11988AA0EBF034D16DB95EEE90C703EB525D614E40A1CB9A1DFD9BBA248F46A39E7EEEBE6DE3AE2410FE7B048AE1DF93B32A013F0B80896FDCE082EE547ABCEE72AB4011D8558D7EAF3D3D5236C70F3C2DF806FA7E07A80DE57EE17D50BFCF96318C81EF91BDCB6DAC928FCE53273915E146C05C73B2707AF3322C5964101DFF6D9720AA352FAA603C995DEB77E9AACE45DB8C09FF73128F1C16EC5F9161F99C749050CC068ED0B1AC502FDA6494F319876E139884040FFA74919E2E334ADECAAFB166E788EEB7C6FADA6D9F43481A7713C2C8335E51186080664774E0B27E6181553AA32E1B90A8B65CADB9A670A73C77170A6072AB7C4EA9065722A742D6485C0C0DEE0D775908322F7D01B35EBA1FBF0AFDC9A81DEEE5E8FC0A27B46DF17376556DAA62B93F0FCDF23E432E6A8B4A4C3773AC450C904E1D1805116D2153C43E098B5DF11FACF5DBEDFBB5DF9BC78E60CFEB7CFA552E79C52F9D4AB41DA2ACAE6A1514DF3D492C8A8DC06700EA6E715086B0AD35D6D9E8EB1198D1826231BE4B5F077586B2AF2376BEE27C84B768DAB11BFA3D6D0566C7802C29CD9467AA284C122BB1D2E8FAADD78D2676E45D5433B8BE106668045145E83FE55A88D19F0F14BA20729BA707D8115C55EFDEEFE322C7F614E64733C047B0E5D993039014F5FE17622A3CE19801B648551BAE6166F85CB28292CCB8C7D0F9E8B1B5DD64C471375FE1C78DB8F5E65E03200EEEB4A95F7ED146411D8239455F9130443FE2245173D3D44E7FAF7AA3CCAC34C988C8F2454F62370C1E8363A526AC67EC78B1A66BDECE8B1AD05ADFDF56A284715D7FBC96AEFB04DDBB2842F0602F17D3378E2B0AF5C8EACA3DD764E48257A57C0EF257B6FFD14D8DACD8B0B68B9AAAA132FCA7C887797B8494F258C796104B6382C6E17DD760E356409D5E1D18243EA33CB3A195BFDCF49576C321FD8885F79C9D4D23B4A92CD9D2194187EA1B6E7C60B3A58AD27EB5A3A5D25C07044EE5DDBAA5C17FCAF08A0A1FE9DF7C6E450A7A0856C149D2FB252DE7A98DD25D15C5933373CD3449EEA16039AB7AE89F394560C7D1FEAD8D9C0ACF80A3982172A7BCFA143C38FA87D62019B5510037803C8EAE541D1A7B17181597690DA3A6568FED91FE80C463004AE8F1A1E4F82C9BD33F5424E9CD559D31D30C2691817A2289C335637E390F681BAE093418C9321FE90B95CE5F716CB28804BCADC83C6EC96ECF1811C2B91D9A3FEC094BB421746890EC3D95FBBBC3185672DB698C51AFDF3F4FD549B1205D2FEE0B9E636820FE6690441CDC0EC8CDB2FC0FBB4FEDB40DDE4C2A0C644C2AB7709F0DB7E02D5FA0358464D93844C3D06682225DA1650D4239FDB0274E148A2A659C9C4CF110ED959C6F85CB78DAD599785995E219DD160B81CB7DE26D386210FA4A73ABA876EF55949CB131DF41D96F2816AEE48E9800988690CB3592FB28640D64C13E6729F1016A405D8D2BD42C3FF21ECA56897D926239DB2517BBA9B2A9744D347A80AB080E25AD8A3E4A837CA2648B338430C1DA9FD25EF48C04D945B09DA418DE9FB1BF5716CC30EBF35417B66E72B320763E78A262A49821A67BF94C57C9A0A66A9E12A2DBEC6D6490FE9C7E373E1D8226254A6F2B666BFB198DA0AAC2E48439B3714BC060005489C10401740829EA785E6716327F317B043227895E4BC2A1BC6A62BAC5E25D2225D0C09E2754F7E2FF93284C5BDE51CA7206479E3886F63E0E525509956F24960144E051AEA343AF3A3499BB238655DE18A838BF9ABEF9AEDA929FC50FFE4D806E823B16EDF01BDEB2A863F3FD4B1A880C76E0FD2674FB525B41871C038EAF4BF7094C914B4EF0188C69FCF25AF5B19F7817C8890D5069F986E8CB9C790FCB33F9180CE3FE893CBD86D860CC780907559FE793FBC6163E96AF530A6283539F8C9EC8F932E8CD90FEEB0AF224FF9D818DE1660C816BDF6DD2E97644AB7EDA3A3338D42DAF0FC47CC256A510CB2409A701C17C812D471E10CF5B26597288F57010C0CEFC1B7FD28E1CF93A3AC6CEA2BEDFCF42D9F2491CEC2AC35E53E97AFA4951250FFA551D9B91FEFE64240CD35A00A86779A3362B7DC7B3E2C148118E9491FEF0E991BEB859B233B0EB03E4E8DF57795DAB71F1470335B74846725C43706059C2351BF9C841F00DC77F853079E2CB0379DEC3D312A0A7EDA3DA7661E765F0307AAA12B3B35DA10BBB7439D77DF54D657B7ED264BC8D37219D3E45EDCB8E26517F54B5CFC017401C2DB827AE66C06FAE9D10E668839B73FD62E1268517C3302D4DE868294F7D95642EC637045598CACCCE9740BA97BDCDE3D0C85CDEF0BB046A780A608E68466F2F8B8249CD647F97DA2659C670828585802A84588710B67363B1DC8C5B284C548838212F1573F07F512082B896F483D7E274D053E3FDE80EC51ED60B97F33CA1E9F53E385156701C2A04F7569E0DDC7F2DF499D657E8709A50226A06ADE4E76DF3D0DE91B65B769C04C439DEF69160C73266DD9359565A0184A3E83EFC796E351D9962CD2F3AB8D27E0DD183AE9193BEB192C4371744049D76CD1D1263479F9B55F4C16D3E939807ADFB255B84C652E300298D69A5372DC984C556522DA67F366E463DB9D036801DFACC991C2EA918A07A2A0239BA35E62ED6F7D8694D35DA078BEEFD3E98A902D9996F6EE89E11AADBBCA5E7F394457C28600ED2E85E26D0B4E291803FBBDA17D11738905AC6FD80B54D0CACA75DE6634672C4DE89C62A7B729EAA060C816B1FE29E06DC6BA52151628E2DAB518A29670C2E49CCF6FB8E1AFCBD2DBC2CF78423D1ECBA194709F79151637C0B988F29E86542F9DE47AE18E70FFBEFBE8765347AF9F9C964C010100236A87B938F82727D833556D9FDA5EC23C3C3095B1A3919EC2F01019EB5B5185532F7A79F3285677D89722B421E6A7D541D95A0FD06C4E7FD9E8F748E80D3B7DE1CF196F60E4CF14E6B9BC1A81DC7DDB483BD8120142B4E7E1FA9F0A300E8FCA5BA5D351CC38745D0A452917AF34FEFD6B1CFFAC35297B9F1B328E6645C4E4D729F2BEDB082B0E10C67A07BB189D37ACFBA19F140EE294322933369AA90E18456151EEBC7623F4400DEFE6BA21C0877DFAE26AA325D0C9465D8BB1D5F47466B762C15AC6AE7B36D8AD5E061FFCDA1069ACB89FC7A474209188A75FEA711F4B98882E576065C0CE7FAC91F5C6C9AA4A837A47283BD59F12EDA0C83E071B4B678D136D96CD82B003EBE91F1B137F5AC8DD5DDB6F2AF60FC3E91B69BF9D82C764602A68B25B147C00CA433D52B684FF6E460060A940DB3C9703AAADB118F1666922BBBAE916A76CC9E0DAA5E6B9BD0D641CFB789C221E2485EDD1AEB166CBE8D8DDD42FFBC916579E9496C8653556DD469D48941D79CA46039635FB45F8BB6315F2CD08E58D119B06A3D9078B55BE4F96F368141E36CB5F128D2B64941A12A5D933B372674DF8B88BAD8E7A9FC2BBAED8E5655290A645DF276EF65861AD07EB91332E58A24CE848FBB08970A750C050D17D8CAEB4BF1532EED44BF9579F56DDA5A2E86B93620C8BFD1C56DF1DD437D6AEA586E4215836D11EFC6ACD00EEF15B59ABCA046854BC6E7100B198683514199C754BB11972BC4D6C174D97F83E8B0F2BFB867209326E59E9177320A69E68E8E750318BA23F42E7EF7D98500725763275A26D6DAFA2106906F2C801FF9BA6CDAE64AFA70DFF6CEBB89F838C9A1D51C3A140AB0431FB384540C784B07640E753D6CBA2A276CE25753681B4101E83CFE9A00560BFEFA29CB32C6967457BBC7478B72FB5CF7BAE4DD21A36CEAF462726BCF79B0F71E02864332EEF760C67E0FA7A0D3C59EFCD006EF2B78DA4B9D4ED6C0442AA4DE0AC02978ECB82A08C38406B3A3C54A209CE37EFF72C1CB95283AB5F418271C9BD921ACD0AA4CA244B5FE2B977226A7D804A62350BBA56B38F49450A1F225E09C677ADA7218698650312A3974A63422F192EDFF61F3BBE023B663DC05FC0042901D8F30074C35BF9B2FD32F817BF692C0615F1F14368EA8AB8AB6BBA49D706430E7A96716F42BB56D3E5442209C5EA7CFD10BA49CE13E598EE6847C857A0AFDBF7EEEA9D28F7BDC45A9B1E5D23C881F3C0EFBC391CBD74FA94FD8307FBF2FF3236692A1BDB4D530653F6EE33F5877525E7530868E376BE3A79EF082B73B6C8689CEB27B99D6618739BB6E526CE40050D875D1FA7EA964EBFABF0A1EB4528939D2D85970960BB88813B94CC2D90976B38EAFBA31596217E059C680EACC42C2D722348F948A9FCACCCD59E6C55C9212E138568014A847D070C06926CF7ACDBBC0E665909479E228FED4ED740F7B5293B7B39FA275C2BE3EEA641ED42168FB51FF9E25DEE7017E77563D813FBAC3C0F57DD57F1BEB2B460E3826B6306B0E0795E99B84615573ACB635284C48317E84169329564BF9EF66D4481796B04B3E0C4825FB562F4F6FAFFA28C8D6C2DF0DDCB9A29FAD41A7BBABFA24B0293DDCFC6AF71BF412362854C733796C132118A3F53A4ADD0DAB80CAA07A5F5BFA9F36721D3C5DDFA6DAFB96915DD879C84B987AE180BAEEE2FFEEBF764153A7E6CC6A37FD074EE6D338FD2A4EB44BBFD3170254D1D47A69E4578F2D5D9E69657753AFD4E3908CB10CB1A7A89390A03EB42EEC5F4F0ED60241F053A588219934DF97A2EB0466CC328A4158203CC1D643A740692EB20A26788DAD82F34CE738DB1872D8FBEDB53A4D52A9D4FDA6A5D5801A0FFE37B86A72C5612A6D56D3D8F5A3087D07C9E8EA55F2161BDC183528C1D7C802E94CF90122ADF0138AB347D36989B421F539AE1B973FA9FC119C9E5A904868959ED0EFA8B9F75A59C9D55FA2AA32A2426403339839BC7BB992FCFF860FA573425AB244989A0B67FDDF4451B1D00741DEEA4BF68D04C06BD2653605CD07D45A24520D47F7FE19B858AB45B8E56AB9D99BAB109BB3AEF64D8A566 +Z = 23353F5AAE60AFA2D5FD2BF59E0D093ADE1BF077677AB6C7A11F73896756BBFBDA18BD65462F05FBDFB3D69F6DC512FBB2001148E72DFFA97F78B98FEC263A7F41301A8550A3F3AE16F597B3A41659DB0C78D667447313AC1914E6CD75760FB978565E3DAA8DAB0F0C6232F2954B04681EDD82744FD33ACE1C6E6C3BBD26399FE6DE3A4DB81B317ECDC75BE2412116CD0F7DAE97F39A69A51C90213C216F52E529920CB710B7B003AC03A68877588CFB589E2C3F77A1 +MD = C0CCDDED433C5B160DB671C3193AA83EAEB20A65C7D3CAE35C07F92578EB9FD762406E254C13362FBC54B10A484FDD7F780DDC573CD67872297791B6D1752DB0C7FF880F46FB4AE56A7119DCBFDC820B44E21DE1916C802FDF2B3CEBB328D83B853BA3CCED7C0FDE5F05250C80E8186B5C11C0340D95EE422C4F1D83234F352163145AFD8DF3AB41B0D9E96495A7ACEEEC9DE50172C5C548B17C75208182F47C932620F15848E63773D020B89FAFB06EE9AACF085B8AB07E9114F099F07877041A378971F964EBA014F4BDE1E08F8C7774DBF0C02871ED2ADE41B1DF09633E48C4E98C35648D4986AACD7A0CD859F24EC36BB4019C85BB726FDA523B570BCB94C343CE65BEEE69682301BDE1256FF48295D54F92574D0E93166744FE7D2F466D85F41562D0141BBA9C277237113B260D5CDAFDBB3385B34FF18A542A622C14BAE092DFAF8B9E9C17F713B1E37BEA54C54B838926D180A0AD63688CAE0A016321732518EC8A16AEEB97DB3770D928DB9356DCB061BEFD5D5AFD9BAEBA8DE01FCC4235A4E4F58B9A51DEBF9ED8900E08562256FAC9F6F73D6EF1687A44382DEC1826E3B4A142B4F93DB29A94F3A4EFB0FCCD42A2895942FB1B93927F747272EE28FEA14224442BD6FB867E46970B732EA8700D266FF9E983F8A8ED542301BFC796242FEABFD539FB3FEA1E8AC31178A1948FC3011879305FD5896154F6193DA7598E8880B9F5F905503B7671B70893B527B6EAA46549C307811DC787EA805E4970DB39265AEBA1CA4BB9E2137FDD49945DC956C1551B860E8D025EC3B0C1C83DF543B7C3A9EC1B5490E585BD780A9F8F48BDC1AC3DC12B4826FF6C0C828FA02AFD0F92E2DF6DAB344582EC9DD89F54BFD037A5202AA689972994E4C0CA7177737291A195843A696A0387865CD15ECF9C59E8B94EF3799B91500050147CE0FD01D2C67CDA045E83E0286C7AB93C852910CAD59BD898E671B2C5CCA032A168DDC44887DA3A0D5D6F798780D7C43C4721DD160FA89FED190A07383B7FA54091E6379D445331F32E040C7C4D8EA1EF76E6B25A9D67ADAD8FCD9D9B14361081378F0B96DED46D43059F50E629F67788E57D945678DC9723AC5BF39E65F673EE307A67BF8909DD6A159B5EFBEC626E5BB6F7F0F8C119546324ABFCBC1BACE07CD06350C8E7FCF46DC96DF79F1CDB87DD788041C7597136FB629C850DC13F89FC685855841FCCAB3D476AA465A9AB923B262C960255E363F4EF4CBFBC4A92E7E92F8A07876B696787FCC70E6132B439C6F6D3FA71FE1A4D0EC7441CDCDC2D709A0EBB42AB4D1D93D6C0BEF8E1FA456188881C9DA3AA9334A5A623D410B2D981A2DE7E65677F342C539373DAF08D05C8E75DAD868CBA30907A32B557BA3316AA70985F7D4D9C7737AA040DC3F269B93D65A187FCDE9D3B1FACBE33CA5A5A + diff --git a/kats/ascon_hash256.acvp.kat b/kats/ascon_hash256.acvp.kat new file mode 100644 index 0000000..16bef67 --- /dev/null +++ b/kats/ascon_hash256.acvp.kat @@ -0,0 +1,56 @@ +Count = 1 +Msg = 0A74ECC30782F39D61BAABDD484D885DD93AAEAAD42B4A8063E42C0FDA4F6E1026C647E37EB74FB97D0679A977C7B870BB6745833207CFDE296B602256E3C3114B9AB78205A4DE22EAF42CCEB2A1099B2BBB53720AEBDD1FF669BA12572C639942685EDC10366B168823983EDA012C8762C4F79B9050075FBC988C9CEACCCABD90928B49432C8BF5503CE9E6539F44F43D32AF9235C709F160FE2077AACE2CBC58DAAD4776E2443639024B5466200C1D54975FB71C3888C88999E9450C134A810F2D8E78F1FC7E5BEE7959337CB48B40F20223136E75A02052E5BEDCF8FF2925B7C9443992932C571804C8A2DF554CD40EA95309F03712998C6D260C3EA262EF4F337BB27051AD5ED6CBFA6AADFD41FD99E9CE4FAB20357FB6AAAC246D201976A2D852ABD99964BCFBF533243CA8EC8F2C287254D412432FFEFBFBC5A588F0B6B284C8D4AA9524FF851153B6EC10430EBD1DF745ADC4A28F9523ADDD9D9E1772047C72B8DF18E4960473CFC2BF8C42EDB8ED078790AB09EEE1393F87E84662E6F9E0B2709E8A2FA538614039F4DFD008E0BF24B09790E2597284D7A6D85DAEBD10E9C9DEDAD24E2EBD624E2F6ACFF9026937A72822B24E69FE58FD1AB289CCDBB282290B16F22D0E71F5F23541B2EFA28AD53DA1B6859B5E9A5FDF82D4337B3495727DE7A6EEEB770998B72CC019284C695B90DD4C2A252CE7CB70B612AB3A3D7ABD9FCE3507FC9CE9C6981DCE6F9D8137931879A39DE86A4C5000DB7D34645D5E79B202795917615EF3F48592085E782DEF7F7F92C09ADCD53581E407211EB5613ABE55BD9B07DE7CB71AB0A962D844F287AD8EB5E5CB9DDFD52C44D732593DD43E24574909BB91E7A103DAA6EA32735D3DF27F7390007C6F2175E76EC306495EDDDB6A3E80FAE8CC1CA713E1F0F7F5A3B9E69A3FD9C9443EA7E82893D322239BB97CC90EC734DD4209B257E8EC9A7E298044B4DC6B0A8413972B9697D255F9F9847828732DE6DB8409573526725B520D69FE128F6E462FAEF8B5779B9E4570B4B95E6473710BFB9A6930D314D55DA03BD9882DD343698B3D49797B786E3FE6C4E7816D14F6DE9B5E0277263D731BD99A153BC216179D704FD3272AF890832B294A0E2C54F08C45FAEDCFD0CB434DCA2E9FE062327CCFAC4A101D41CFB4A3CE7E4BFCF364EE85AA89F6C72948CCA40B865CFB58B021F8AC7A62E243D34B75464A01527F475965401A35D93CB5A6647D6B11BB72B84A1D5D525079020B41D73D8081DF467A24C42CF6BB3D7A47BCF7D3FD65D7C190038DFFE3F42DF7DF6335D85E9BBB33C71D03464C8E7BFD0CA3169658A504A66A15AD7DF4DF6385F7CD4D9386651CAB01C30CDF619074018790F240DE969E395E8F6E48ED3E3FE7BA7D4F7F40E877A7866A9594992444D9A0ABF564ED22A7602E1334F7F7D4BDC2842425E341F5C19F194BB974010A9F3A4A95A74148DBFA97D6EE502CB37FB0B2ACD20F75FF6097ABEA564BA169335F2474FAAC622C7B7AA9298E0D53A594EB999B07C72FFA293AE9FDFC57F28F582EA38F2BB8B9D34E853057664C70534305556AB206616B2F2A4ABFC26430248819D06069C47ADC32C54C8296D794DDCA96B9F70187DD51CC385F006DF910E9540BCF4C7B10E97F8A7938ECB9DFD458966DF52CAA3923003B7E9331647A6E38B5632D8B074761B9AC3A6C874EF198ED6307690004E43F1BE8CF10FC7DB81B100B003656B249504E0B3C7F70CD9BB14AE6A6CD5C106D33D12311A23837643BF41F5B7C4EBB413A1AB71AF4C864CF4E4C1DC616D7EABE009DCC6532A0A71717A7008B51721F638EA56BB3A5F5796B6D54C3551B714E6409605ADE81560E9A739F034DC7D87DDC2DB937716B37180B2361F7DEDD51FCA6599B81F01740E23896D14006F22CA394D7E728623ADDF8D2484FBA205E30BD21A35CF42B568DC4ECD6FEDA9AF61118F7BD6306F529996C7BA2AFA7C785C2DA66141E639537773D49223B8B3B025EDB3636C262FB29C7F809F07889A7E5FC6714237486D8AE83C04525BDD3EE0E307944D37191C25FDF3C4D2659A4BFEE966425D476178ED70387B3021CD56CF309FBC0FE44D3746BA4B4443739B255DE00578E58AD1A9718EB6CD0E9DDC04309CF591C5EE4C0AAC2F0BA2FC1D3569E5032D401C5461346EF63A713D7038A8EE4713B68E096F6FA40ACCC68F3EAD54594CE7FB608BE7DC2BB122CFB3CACD2BF652C4B5098EEBDBA3BDAC1187AAB53058D627F0883D38526F378ACCD69FBBE93D90C02C69E85ADA610C57B2EFC644710BF266DD92DCA3C91A6255C1F42F0513F1B2E3F6DA88C6707B5D8F7BD5856298F309B0D428EE4660FD0712078298D6420743B12CE25D96733BF652454D27E3850FCCDEEA6E30EB136C72F9D376CEEDE2774D7491D435B695734D98328C0123D5138CF7C5C9EBD3C6589DC06F53C2FC7D186FCDFFA351B0CA0639772098B8875B5F24CFF9C718288B69AE3946754731A0412B1A1C432421C1DC3DBF8074B33DA00665103EF302B5F0473285F5186A54CEF7C6DF6D9E6B183AF30E2D99689816B6708930103702BD4E7529D5109E3CA961E8F098ADD3C0119B5CD53BF4D51C97BF1BDF848F3A3487F51990F86495F79CC654BBA0680F68D2A07794B351D6B86958921604CEB81A37A478A39442C7AD0555486590197C2FBFA2FCD4179571261E5137AFD27FF2CE1E3A840BFF5BD49FD8DA9F6E1961184FEC626651C1D402A2234285330B27DA85627A576595603053DE6CFB3CF6131CBD38F7B36019A10C3A37E1E8ACD69184B1001A0B9F19B2BA7C32128364E8D5AC0025D80A13746A6BC17E1D2DA387838D3CD84A3CDC178D93864D372E072D97516235D8770E97714C95AE4A110C8506F4AE85469CAE98DFF8A83473D63D3C64A3D6BBCB6DBF1C8EA5570DA72DDD6C96F136428F71D70AA2C965DFDECA139B0F5939964A40C999459206A135A0F1A21B4BAD829FEABCF2CCDC090207DF3DB481BBFE4DE437224637AD0CED6B35C501C7B3B4831C80FB249C46D96E37B7816654421F79A2A3BDE429575AF2EDDF878717073A441ABAA7F0C0D9A1AD5DB41E701B968929264B5F23F5D069B535F836CCCF5247308D4D5BA9AA1EB8D90210866548EAE757466E60DBA8165E3A40E2CAC892E4DE0B6CEDE2CE3AEF7F07827611D54A047C4B10EF7660E17B8876EF1158C753F0461D427AF86AF8191C66EF594921F478F04C667FB7B36E7D29F1557BEF2986B7B382300492CF0C0152F7D31F718822667276211C50D44882AEC55107157C39E2D027A5C6E1EFD62140551CBFE05F0B91CEEEF969087A66DF49AD55DD7E04FBD6BDE03F59E26B8482900FDBFBB788A25FC9CF382672D0EA65C0C68D349A08B33B694602001FB1AF636A66C8F8AE7B27B10B0613AEDCC563ECF5D9892BEE4FF8974C90927186A230182FC4CC0C07E1B755AECC3983E5046E93D2250A362883852A7E31AC0DD8A63A58C60B7F080957D50422338D121664A248320E9F519809EFAC3FA19DD645A97CF891D0CDE985568A8A4FF613E4F67304098F63DBDA16D8B0BC1BD2D867BA0ECE78C6848035A6C8B2EB741501A1F60AA5CC9D9446D1DD92E1B91001DDB28E12C041379B1E71F2DE62C6B0E06601D71EC6013D0BDA25B7FCAB33A2C72594FB006D5144C06A5AFC23D9CF218010ED3CEFE1F13BCC757248AA893AFFEACF2BA8CDCBB08304BD06B47B1509320AF427DBBE06B2E524592E8AEB089A372F6B1164BE1663B4505A2822DB4CC0B76C403DA6616F31E40C367464AD2597FC22DF851003A483F490637B63DE9019E798771EAADAE3D5C0292D587791FF173AC22C0FFBC7B0B3C7BC4915FDE3DE057C1C9CDC3606ED213F09B4E6D65C0C52A15C40A1A2901E1FD7C356FE81DDD7EC5B27DC6B0512E123D50AC0F212C9DD6BBFE67491933C52EC0E7D0472BFFE9F6121C89BAE7FA15D8E7B2CCCA7DF2C0D0DE5FB3EAB5936591EC4F06C881E6E63D67B5FC04A3E2EEC1E98F626666FBB0CD27FF68CB4CFF417FB7F7CD98F44D5700CB8F63C7F5BB2DFB70F2012631FE2BF19E38A0817E1BF067747D4DAB1556CC9C37619AD698E8D86BD26D5B59FE1A4DB8CCDCF9BCACD582B09EFB53776D81E6192564EECF635459B55F34AF10BF9769593095DE395D10EF61DFEA379C9561FE50874133992C7E547882435C772671F00791FA47D8A2ADBC15758DEF791CBD20FD365E897D63D02CB14066B61AB3783A6DF9300A9A1A25AED9851E249E8EDB5CC5225E40C8E772A4C1CD95983CF6A261FC52817FECB286E311AFAFF844AC8E22640AF1F754377186868B49CC848C71E3E3BD274C0C5B70139C7B2F19377A5F143F73343205AA0CC5E0FBF96068B95F843DCC14868541150899DE5AD908584E0B2B358D11583FDE38B1626B11620FAAE31CABDB6B65D98FFD5D2B98275032BC88ACED34332B4D2BFEEDDBD522D604A68A3377BD5C7DE3A652A58FB42DA7B7E87EA5E36474DB77B7CE7FDC7D89036C2658840EF3D875600AC947E18D9C99FD5736F3567DF3A032AEBBBFEEDDA0651C4E39685BA998C30F0945D89A2DF9E91B3581854796ADEE33B8525F3819878269642B9254333D54BE72E34D381B0505B4D1A4B85B1B1E85A14A35A357388BF681C26E36016795E7F82DC6D4B360B618B24CAB6675CE264E45A6F10AFE99FD86E7ECCB76ACCF034D3CBCC02E5449D140941DF10A8D2481B39B20F05B758AE95F2F40ECC6943F6BE2495D29B80EF8F9FBD4B076E0A7F2F8C26B18DA8CDEA7D8B2D361FE145D0AAC54B20EC02FFBC8A4A326F486C41408B73D47295B7C65DE04A18577E5ADF9E59ECA04212E9831C9C7A3733666E921139DCAA9C1CC33AF2FEED30A1EA984E3F7AA4156BCBFF2DA1E0B7E62B8082E781A8072D91A0337196A1AD5325B8E131F43BF7C8C25936453ABF08BB54DD1F727C05AEF9D37AAC8F47227EBA1EABF7E8FF85F1EF88CA153861C1E2E2A7781CB9923AD72009E75E899F7871AFDA8C268EB71FBBDEEB3FF9B1E076981187C9D7CF05C527E3D4D7EF183768501048756DE5AB543B87BC4DDE6231253F935F3CF1C590A2AA156432B9EF30A3A772DFE9797B18A276239E5012B7E6C5B2AF985BB8FA668A7F95CB5881689A4C5718A66B8257ABC48AACC6DE37409FE22E9E800A46E4EAAD0C5569E3AFB0110D8941F8FA118B335B03D3D10C3398433EF5E929E2E89005723DF96F2CFDC814CA9BB944F547A5C0A35B25067313DE7964022AEDC6963E24F93C86CC182C166D3BCF16707A434DE750188687B389826E5F8FFB1AC2EA4E245D845BB8C0D9B88744C7DAB40D5DFF10C4339DAE0FA6717FAA286C9820FB9A5170E212F5F7952676600F42EBAEDE60F190DA568F4C9024B712EC0EA86D1056592D89332B3B09292F1D274E006395C0DBC76B0756951B04D0BD6BE31B868E094FA8F9BE25AB35C687B12772155214538D1B32E0F218FFB41274526DDF260DA88F2DFE5779D79B2081A47FA57D98FF8E990865F043AD0736B945ABB148D7F761A38EE2F753CCE9A580025F5DA95A368984D3C4C6B00D54E226C7AE243BE9E7A9BD0DF1EEA5F82ADC2EB070314DA99D5F0F122C651320B1A62A00D09C1EB579962AB5909B5857D38CB8E8980F9D13947D2A4F2519CD72968C5C5BC4A5278ECD6936DA168808F1F6B74E9FBC2A88A209066C5371CF806FD8A82F144EFC833E653A2B2EC8B30D0C6438587DCB2DC66BF3BA42BE38C41CFDE8D6F16E68F4B2FA24103A820F59D956095FFF39771294BAD1C31094B9D4F5A11D3D45F1B19EA36F855E59BAF3446C99D0FCA4D8C4D376C642469CA5E41E404F1A8964D213E7947ABC8FB428C8E9C79D5676B3BD202CDC49B68FBF7B020D8B670E0A9069EF9A85F9683A2C351F4E0D588F0F4F6D5A932EFDBD1B1B84282968BF045D2ACE495DADCBE0CA54F600973A688256EC02BE1E0C6AEBA2ACC47F01C13EC17D30C2234F0F2151737C904E28FD25E0A301D13D65F0E640BFE2A6B0D95CEEF91624935668454347CAA13A917C2CB2B586E3CBFFF0016B7C4A71635C687078269DA7280469CF786DCE8962C4B654D4932FF129F580FEF904C9171BF6D1E6EF5A291403C4F4AE4BB76B5E21769E96B5F59CD03C774682A59EBE234B42A3819BE79A189BA2410F9E81A5628A22DD726622612659F1AA7803966E6516D1630913E9B239DC860B03A48D41BAC1D3F872C13BBD18E18D37AA3D2204F543DBF8CD1EAC5EA0709395E0175D71CCAFFFA63F9DFBA3EB144A1786A2080CBA7105CFC894849C257558023D95DCF1841B6B0A3D8BD55748381DA8C484D7FE6896EB6F119DA9281B6380BA45F966454758837B370DCF2EABBE879076DBC7A0AD59A9A6AA6DEFF66232EED9FB2B014EC1D8617BF16CC75AC7BCC3530618A14F9BE01CFC5FCF9AD9688D18F42EE52370AD38CEAE7A5BAF40924EDEED9A8CE04991AF4E1B0E14FEF23D88036453C33BE28942B5DD49F2C53030CC6A00F0AD3EDB9CCF627FA718729839DC70E2483AFCDF12FC5457D7130F9EEA0DEA31BAEDF1805937C78450BC3B70D02D937D81D2F7F5DF9AFE0458E6F489BFD395A92E30ED5BDAF0991073688E56B0D377B97F920D0705E4622FFFFD3772334DD47D168252AF3047929139E782770C9753756F4B1A2DD69E9349DECD6BEDB926DD258401402E80D87927FF7BCD2E51EB1358A9C202E833A6A687EF18C072EBB4D8130A5CE30B5724E486D1E22E5AC174E7E3AA0333F713E4F1DD6AB84F7807F64C3A93BA13F4F817F184DD7C1651884BB67A20ECC8D870D0FF256B05909ED56C8EDB95F3B71750E2EB9211BF29A7CEA0552F01C5472B2D63C9C2BAFE99F27752AF60FD4ABB9484AF194DF136C6B1B75756CAA0619D102553AE3229F46C5248F92ABF1FB8AA83F4C0AA62AC0939F69D080B53A7DF4205C59F4B999C796A8032C704F80C17A1FEACD2C5EFC73A641C29B79521F908BA79B714F9807D00E77B661A2FE50441EA75661CB6D509523E8B2B2F7FE4D438973A1C8B30F72E1181ABEB5A79BD1A7F17E7CD1FCBDC51E56054D66E554D90F2973D82E5D87900F357449B0AE9BEE88160AC179827C47CBAE8372ADC20BFBC340AE8C34C3A34A6AED6D9C8774146FBB17C44FDA935F8DAD2B0C7FDA14E24C2978856FFF0EBAC573C0568B15DFBF569A13B796FDBB202FE121DE08B6236F550B20720EEFA470AC5DFFDB1A3DD478CD6CB6E5C75D4C4F6E58568EDD30B10F50500180F46DB067F5A30A39FEE006F20CA9119CFF3DA8F8BFD104B69915927CABEF8BCA3B548360BB4FEF235212508E516382341F141012A709C12369F9CDE0118E8D0F543CB6B826B0E1AF4E85A5AC80766535935D5D96DF782232925FF6C1810F12C385413915ACC90E6E3360C4226314A2F394984CB331F62FDC198325C6B91F2E3F72E1273F3C4F88C94FEF637FB300CF7DBC032CE9C25E928E115CFC28A447B4133185AF82ED63B6450F83644293B02819B4A70AB6F2447D134F982EE0535F25073A4F4D2E514C90594DE7DA3EFA4FFB6133E374FC3DFE21ED079B325435D5F2AF5D5C074362FAC76717B0680B6A3E19FF9DCCAC6FEB29C93C2E6026B5193B2378F52BE19D47B7FE391B0CE58C951582C98133B6682882C33492CA1501D3124DDB8CEF163F5C7CB7E6CD7354DF443DA618DD5C33E684BB4F7267AD0A7CA1FC6508BE09FFA5FF436D057BD09AB52DE4EF5524FC2476DE6756D1A0A3D7AF713A44D00D4B203A3D00199AEF2E6BB4209A4583BDB458A5D8EF2A57B22E055C6CBD93408BC9A7E2C3B51723E38986B0FBA2B1065D54F2BCE19FF81E21C9880FFBBC2E329A2A2856F363C0089C35C14E687A5B107DFFFE18CBD75EECD188C0FA2C0827275B5416D0795A13FA94E91FACDEA9B6A76D7792FBBE1566C3CC3C846AA2C6DB940E99F213638A9722EC0384E1B7B20D28D1198CB5752B6945ED53043CD5A858CD0E8B9D44B6A243E2E06F0FBA91840B192F5C988839261EE230AC2510855A4C43ABB6D32B14C9712ED6A9D4061CAEB46947EB0D790FCF94E76CBB13097D325D8522CB0EDBB0DF0466EA69B2905118C682F8BCC99A4DD334DB21ECBF59B568B1A34C4FE3509FD8B867E6A68EA61D049654F59111C069C2374F9732B9C420ABB082B70E43023475E2200361B3A6448DBE1D566A632457F13A891794B86C1EF4463BF60CEE0EC0931F7FAFF0BC070F910A09749C6EB6488C2BC6D3BAEBA0BC75010F1B78B0389FB05DC24BE3756634337A8589AEF8828590F369E0273B05A77EC339EEACEB96E0D269C43EAB6A6417C5929F3F65170D7C7F8A8A8546577874571BCC203B778747E3A5B7443443DA258E521B949BC64266B5BC6F226111997AF14FE6909D44DC4D0B575BC060C8473CAF64F6F43BE4D991D8656B7E0864E6D10B3C53E55C49874A76CE88436A8106EC743372FC1AA43F0C7555B738D95D45A67189B4247562DF65DCAC7E6D5B9626575F7E09D4F1E9B766FC467006924F701888E2D1E0CCE27612530D1F6E26D1B1DE2E60D85A5470B587D24D272EF2D8D38C3B66E579C4468A7D08F681E4C949402B9491D8327716C4172C4A0D7FBA48207B399332BFEC381AE8D55B525DEFD0BD890CFC996000A01525A2CD4C7A380BC2BFD605AA3617813E5C76EF5C1BC466285C8C8372BEAEBF7B997D0C1D1FECA0AFCA999287E92686728BBD3DE91043F9603BA5F0EDB5990311168A11B90A641F70D640928232DF3E350511E60171D66A5583ACE179FCB2FA309580705F15CD68279DCD12D0B1772E5B66BAE7A3B2029F3F20BB355E82A574244561ECB16EDF2038A8BE63A4C39AA40C7D851341CB567E93E1303F59970AA4F858EE8A4F8A7CED879AAFFBF39EFB7C861729E0FD923258EFE358D03E9FC6A09E1A6A4BD40F558100988BA71C5B8AF4E5B4B8426E29A76526969B6B32ACAEE7D30E5CD933B0A876C1A8E064078B3C935964EA89E78432757205253E74E94F53E9A3D30DFFB0C0350C4280C649435E9A590712CDC225004EDBE7672E8A6902D8588C7A63B72F94A9A3B57DA4046C2B2EA68AE56CD78191C4A28531184892AAA23FA76DBDC8FAE32A73682A0DA75C496FBB388700849600D7FAB6C031FD7C60110ADB645CFF6E66ACA6BBF86E56841D463BC25D100AA91EA9A795C21239B12CF7081902CCF7ED704CD2DB5AC99D918075997AF63B1F500660BCBBB569AB5472F58E01663D82504F4E51103D2E4F540C15144D79BFBBF1D8B812A10F3C3807A07E69643B9B2B43F3482AA8E90E12D81068AE9F545EDBB23A9C29AE2AE04113164A70BFC4EA1971EAD15930941207C9A53A90A78D98B241A2B62A9E717D19130617929F9E5213264E3DB58305AA1D27945F08F04F9A867D972E1C0EC07BFF6DB846297D80682B52276A584FE22E3CF899030A127429C46C9014086F360566D33E48CBBE809FA62C33B6C8E441369A68F12474BC70EDF88E82BDEC6B5FBC1C210485119A637D78F95CDDDEBE60DF2B5A799F7D1290A962504F3C3CC2B23ACC7799A7DFBB24000573AB7B60930F3A2EA29292F2C03E0A915A23C14A2641B54621106624B9FF6F36799909661449CE41150D9A3020480C388F15849862B5DF32F6353E83A81675A2225B782735A37C11547F3518A78425D9042E94A37AD7D3C4BAD76FDF0B4B99FF98F70DC4D0E503EB987343E380C68B710F657E7981D2274B88B46C5E339D0609E63680AF7661081F2AA80B0794F044F44BFED0A6CD1F7DC6CFC23C1C78A5B7FB6D39FD4945DBFAAE5C5F4FD8C620B69870781235CD603CC6B8BAE0B424ECA685F00F995AF3FAAE700321496DD0A5FFAE0CA4AB0092822E0DFD36918BFA46896FB8C9E7B7865CA575C9A132AB16CEF613BB31A88040A6F26EE18C5CBC682275BC98D9B506BD4828AFFF3636F04F82F62F3F7ED0C99E092E11D679D5F9FFE80DA72C76133C18EF557209F8800A70011F5F962D7CE952AB1D8EABA32F44732EB016288FC4D86FBA164F285DC0A68824A1D5597563D26B23548058849174C011FFDA486AE2E03D46EFDB162DC1F4EB760686015AEAFDCADDAB043A437FEB28A28F175DE65E1E42C197128688BC3E625F95E27E0A726526020F6ABEDDA6F9C604B2749DA9970518E74440C2D77642216DA2DAAE9D6C1E2F29F15AD6F45F641A9D4C82D547A0B9C890C996C531A34E8CCC48513ACB4B2897944473B73C2E2487E025248BF46DD9CCE9121DD4D558FD86A2CE09AB0E294F5223EA40022C018C61A50FE50B7EC2975E6E8451B82E54C23C47EC146D247879B6D6D2680A2DD69FE786BB2EC672F108E037AB3C89D89623CE2804BB3FEC1E3D2C952F35AB598D3197E569327225FBC956E43436793BEFDE3FAE9AE2281B5FFB687E023042BB5C86A979A5A46E64B1A82C3A645BB7E7C3F1A651F6FCBFAA087C856ECAF323CB869A87AD8C00964B70DAFDF1B6EEB6044380BB118AF1C560C6FF70281EFF9ABE8460B3CAD3095BC35A5AE11BFFCDF41AC5812A4A38124195D527E78D8F6D2C70403F6C553AEC303924F7B62F10A960F90A56639DD45085721F1EF4AC22CE33ED2D70DBC0619FDFD950F025405C11842CC6ED82390A8F9BEFB9FA361CF7841756C3C9019FCDA0986B768A4DE32B44160E99C8E5344BF9E29ED4EB066668C3E1CCD9CF7C920FE45E265517C37F41B8C475E428822F9EE20BCAE663CBE29A3102B2A8800A5CC783FEB46ABFDE3336635C1C2791824041B22DF7C3B2ACAC197C8B241510D7C1AE68AD6029CDC4DF03D7938306AEBA08AFC171F652129814D7529BEE33BA1E258C9B6EBEE4211774ED4EF4EC1F28A66AC18374539FE06E9BD09889D731D5AB48B86DF76A40FC248EAAFD08041EABF5AEAB312DB045CB86AB2DD2EE4B98404217A3AB34B1313B29C55EE6A9A2D76A7C24A3DA2B00A8FB03EDE74B3D6D0DD9F56ABAF0617377437C6F0768515E22E3D3C356C9A7BD14416FA7A846CAE6FEBCB785F03FE7E70909AD5F5EBBF940A9A4CB03777A17443138557981B9CB307996704BB0CB6EE3FCECBA4C1C485E58472FFD047BC66E84A47354B8E96D654F3E7CE6C74AAE8FDD36E7078BC0CA28E9D9FD3152BBC7B4B328ECA63D77B5F98E866A0E9F62970D999F20CD93BEE2C4D94A6BDEEC3B139477C7329F5E08516680EE790455BC888642EF98B29BF920F54527CCF20CD70D5272D597D72FF8AE904EB94DA544DD6E1DC2E49BFCA361F97DA73D59363B5E59A8E027917F24B0574A400863E1AB7BB067B8AE30283B10AF11DC1930F29E7755F060A4C41D4CEFF8118D51BB9BFE17D22B8CF17E8C2D316DD07880A20B8064ABC9B2738006B6931BC9B61E9BE9551413C5470466ADF9C8C22F37F4A5CB4CED9128A5F2E88A96CB74F8D5B4D60F95837A636DDDC37BFEFECFEAB151CFC2EE507DC88C7244622B882E7B8F6ED845F1B299B379415E6E2A162AA723FDD944FCB20984360E82233F1737E5AF48EB90268AF8FEB81B48ADF20F9E76489C3F2EAEE97EDD64530EE2307574620979BFE12B9A819905DB8CE16A5C9227700CDAA3D70936C5C90E2BD37B15CD42 +MD = 7B453F145FA39BE7075100E965DEDE18CFC27B68461CE8064060DD481803EBB4 + +Count = 2 +Msg = FB +MD = DA8D556A9A27A7032174AB1949FE8AF48D8F37D2DDCED27D7FE4BEE0F9C9F91D + +Count = 3 +Msg = E07B9B6EBC28667E2E7624DA1E88EEF8F1C566BAF0BCA2E9F7DBD7AF6507A98B2355E3308DBDB056F0C214687F836450A42595392BFAD424D8B177E150B71926CD98B6C9A5BE6B341410C92EA739697376860A40726F5F2981BE57DB45CF0539A9ED9BE6CD9BABE6B961241B30A67D9F48046AC9ACD9B45D398D48E6668FEF450A8F84B99E82A5DADA2486114B43F8DB41B89240643B8CCF393DAD3F53C57F2971DF11A021C300C65E8FEF8853A312F5946DA4AEFDAEE0CF02B58060D4668715A55C9F6B3257B97EB7CCE1D44C047C952BB8AAE621D12CC2FF419E6C42A0F1F808D9E2F704A6C23DB325F630CD0B82FD38EB341BBBA1F4D32FDC6CF0B94D3C17DAE8CC7221859185F66D32FBDAFCF5F4BFA033576BD63D67E50FC72739D18365E9DE55E43E0FDBB259AF254D6EF8F833E67831191AE4AB04AB658D12BD694B25EACD11FCA611B5AFC480FDBCB0F0F8EC169441C09F6A4B05335038D982C9F4EF630063A1E7FC8CD5C3815599E7EF54BB6DA1FC29288A8580810CC956D8DC2DFB8B0D59B08C570519086CFD1E14B11E43FC7D6CE0CCCBC7D87BE31FDA3335FCE6545A0DD995A32E159CE220BC8D666BD0EE85595B704C2EC0468135A9382AE6D26F16C9BAA444AD594E5644EAAA0A4B14784FECAEDCA076072B4D92146D85DD72FC4E4C769CB02BA9D7000D190844153C362131E83D38F6CFA0C28E57B299EBC978D2ED5CBDD477C72342D6DC935CFEE73756DE4C53F434C4587DD6DA22D4F73E1443A13656B97E61AA6AC5FA611A3B43C3A61F5BBA9F75849D290440FE9DA44F4B98C74FBBC8907ED87DA1E92F39623D4293167BB49C8474CE1C982DB53E630DC576AFC952EB87FB15A1823CFD8B5563C6C6FE6B86299BAF1352809E3063C89A1A9424B98A99EB560B1B651219477643C73467EE40F7869BDA00B5FF6BE8CAB2D8E82269669BD92DDBA85F6BC48895CCDB3DD7FCFCDA5A220D89DE8AE3EBEA2350B23930240DDC2C5A391398981BD7526AE9232D11CEB6FE8E005BDDBD4F49EFBD3C1A114F65A7CE60ABA1C2C6C28AF2B18B1FFAC7BD1182FC3AA224B1FF6E0BF024DA5B00C602054155CD662CF437CC75692B312F4F27002A971414C3831D613C95D2A2E72EF1EB881AB872EFAB560802D5AE47D33CDBA0FCDA3169B2EE42BD376B29962295E5477840A81596B5107F410B11EDD4D58EFFBA31A60CFC87389AD7FA3B8481BFE66DF067CF9293C50A47CAB127A6DC54E961DD29DCF0EED84AF0080E3E9B7A8CFE8225A3FD6D06FB6BF4275F424B6092BE8311D9A657E2F57F171CDF8A85876ECD3EB3A58038577B5BE2BDE7C98F96FF907550BA8AA0E5A69F2F24E5512671E66DB8920397BA11852B967DC499FB2BF0811C4F1535CCE42C580D065014722A3470D77A11FD9268D563CA8FF323210DA303346334D75CB0A0D465AB89B3C170B96C4853C1801AF3EEB479B16A3DF0083600624DE00EF55D1427DA3D97E7DE22A25AD687DBCE4B23E941757F5EAA4563E35D7589517390AA76EB3E99A6DD5B07D6560F1066682D67B43F639E9975FE6AE27659397254D12ECA2B11EF90B17C0BE56DA9079B34FC7A2F0DD41110F11100ECD4B7308322958185E1463B573DD703C358B92BCCF7CEAD7ADF0A647FBF1ED81A1003BBFA4C87C3D82781BAEEC122F136D14EB737E634F50509B5A4183002C6C26D20473A1B0976D0F652A47514BFB9BC182EAD7166A134DB0DB6F096E2ABA825BBF780A0DBB71AC8D7E64193907FF04AFCE8FF0154545CCCEC6B2D6518E0ED4BAA7EB91D3F18E16114E5997F5FA04B8DC5A699FAABA6D0669BB3B37089B4AFF7F9F5E911C6D20BE3079EED6FBADC6C4C1F9FA07246F39F03AE52828B6571D75F35A28669B63AC7F29BB6F30CB861ACBF466750EA143CB00555E66373507F7E96C78E3917550395E5D8ADD79000934A4CA6C344FE20ED4AF9F28113D0D754A11B375C452A28946943D16B1166642005C29B16CC8D3B8075D9433F25D4EFC40D830BBC58A34E1F231259002CB5DBE394D17B5135C08814DFB7E76BE7E96E94540D5D8E5BA8C861747BF3B9333B53C0FE5FAB54589D8F4DFBF7DCA0BCE2383AA4C4AB1E584D88EB081ADCB9CCCEE1A464276C873D193CB67E109263CC28A59142B9156E8F3467B1D6BF4B3EC1D5802D16373C9575B0FC8A88F4A047BB241FE0754B7613B972152FBFBBB17ECDFEF5A890644D94EC0F1B92BC8AE69A9420F6B19F6BC8765E6C74A3220DD6BAFF7EBD8AFFF7B756D78BF4652FE4572E8C7A9A9EC5FFDE62357F4A23F0A971DE3961933DCD5C9B9C689FDA147663467A144517A87237F4FFA05A547FAD93652D1A152BCD51196130DFFE362524C9EBD238D00EAA92C86C026D939C72071BEFD43AADF961377928FBE3E7C97400CEDBD66E8247DD85BA9B51A8295FBE7CEF28C40E61EB77D08A9ABFA713C7ABFFF8019EB8C60384D3124F7F12A7B80D196A7EF4BE04659EE36306E4E8883571F3F052B028C106B6EBA3F0FC126B6528D28CA53C95D2ECFA9262BB54BF1F9C4BDCDD8C215507E55864C7081A14688C77FEDE125BE3F9DB2003571DC605B1F7CC07A52034DF43D2CAA74CD7CDC9D2E629D64356E10C4168E2016B1EFEE91F53B3D03C136F485798BA0C47B396210E573071F3F0C15B16BFC53C3D327424D3E088F924FD8DBF76E17EAB9BD4C58DD1C1F313EE8DF52F9157BA7C4D320B24249538662B9CFD10C971FA127116BF41FA376A7C3F603646EA5868CC42117144D65987069C5E6135C3E24A7D92E3BD7A98798115C78EE5C35FF17CD33430CEB8FFB63C188FB9A59BD635B85C15B9B4079BEE34C98F5C7C4773C3A7AAE28E019214927EDCA6A5EBDFD4E63F91D689AEA53D743845FC0428A239F5A4CC12FAB847342647833BD760F50354F5A91CEA70EA15016C6E56BB950F69DBA2B1011ECCD92DF85DB0412A6A65134242A70F7F864F84BAB7108D4AF0789037196035AFF3E4881C7B248CC0A8EA97065A1378ED00EA54532C4767BC4BE207E41F0A110930644E5E1FF20362C2C312CD7987F0DD00A2372E0BE182AC7CCCD0991CA8A19DD88DD5F6C41ACE0DE6F29168349A42C4F12AE47DD3E3FD4FE1A1E153226A45192274F4EBB1FA18E6D42948194F1A78E2890CA7F2C424CAF590861423387AEB7BAC7746C0A55712F712FDA8A99AE4FFC729FFCA15C35255FEA9FF5B2AE5F5AD5A3DCC6CD8D3B73C31F9AFE0C67B205AAB874DF939AFD6B859224816A5FCE7111D4F4E6CCE7727F372C2981B13728F8288A5AFA398FB74AA671312B68AA09635129EC3762DB48B345F59867616BAA4E792C68D004C437921DBA305BA647068D12B630975AF1954D4197A433E74FE93AC6F2B23C41296E8CE25A19B8AAFD0D0EFF0B54BB3B12E377971B9E7D1FF3AACDD0F584B384DA3BE957A3B500D7ECA2548AA544DBFB3E0FB40F4AA5359AF16CEEAF5BE7A578597A14DF6B53876DE2AFBA6949E26AAECEC292F5D0A44A25065E6646C6517BF50CEC313B300C9FDA88562CAAEACC410EF23FD08944AF97A53FEFC90CFD40978123B56C6DA13F7EC232C87D7A879F4A3A0D57449680E2B05D448BFB403382ED37CE9B87355FE36DB2B11E567C322D2D90A58F0F960BF10030F51F2925443E8EBFDB35BBFC1804EA29F981E5629C342B176E5A9AB473573BCD8B563040CA387E728F96A10C61317890A4D59C8A1BAD94C0E401B6E9A3DA3C83F9FE60C1D4996FB10362E305931EB62CE1FA0F9DBAB1B1EDB17F5CB87194DEB55A1D0272C0B6CC1B75DB76A8BA9F2DD54B9A07B9CA9ED9484C8310653CA73F7E942DAB861C436C2B2DF427DF4B09232241876CE78D24FABB43CA364DA666DEDEAC08148CE3A7B9082DDC8BC676F9FD335FEE23A53A57E17F32E032521D2E84C725493332E4963E99DE64C9B099244449CCF2EDB83339944426A55A036566FB0F47B4A13DC6CA4EC9BF89D6D59E20D61EABF8851A30DC83EBA4EF1C4F4C2B246779BA68E473168302A42408B952CEB5F5CF3B677CD1D0CE7B20B588D7ADFF7D84556F6BD3C7E19B956582761CC3DA98E629267000C3A79598EBEDB3CD8DBB54A4A67453E362E22DDD9FC2175F6AB1B7562C92AE778F6CB0BDD9C2F7DA3DDE07BA2DC1664F76A57346F8A260F190363E2A366D90FB0CDD2549C3A6199FFA53AFC1CA6D21995B67DF772F678EDCFBCF2D9394CDA3C03D1CBD409C1C8BD08BD35CA4F2AF37331494DEDE9E29CBA55E484DF488760B3CBFEF84BDBFD10D3EDBFEEB4C0AD9EA4C87FA8F0FEEC522134107F253DE875815D82FF5032A79733397A002AF3E8F9A746DF16C8DF70B4DEABD616CA7EEA9604496D563EAE4D7221E775B684EC282E4B17D7DE5DD1ACA1EDCD21A55B90CDB44EE3FBE08592BBF9F86CF5E169B930F183A8CBB3A60C38329DCB69708DA8179019C068A0F047A9B95BDEE6F0DCCA37349D2F21B3C51A0E42AAC943B9294A6B505565C8A95090003BFE1157C7264856D29334D35E8664CBFFB226F52704EF901173959B77028EE30C2EE6B4B3C3461C62737125F4760DC9F09AC8F72A9AD9370F81455490ADDFCF0551C62FA0B0173C6C0992B393CA9C9B65CCAADC3A97B87254AFA5327DF18CB594A120A2AFDD2940828C8A200725A345E5AAEEC40202956E9954DBF10BE5BE7A7DDD1FF1A9FAEB88A26A5AAD0C976A2F0B604DD202C7B3920CB2085B0238349DCD10A22A06B19BEABF662197A7E76101EAACE5AB98EB78B62A8DE5F7F18F866A35BDE0FCF43F2959C462139BA61BEA2450077156538904E197EC0078CCA3F92FE0B761EA07650DAA838BE636D8DC0F0EA3C0A6EA1E2F17ABB8FE64073FB08D2068E3BBEFBAFF1DEBF9C6D3C7A3CE08BBDDF1D50BFD0F11B09FB5320800056BD2FDC5CDF4202054A3A3BAF0585C4F08E9F5A92A4DDB822358D20A4F04CD14EBF45A00C9DE01139ABC9D3267421FB85450AD481356DA1EF77BA1742216D150D58FCFFBFD5B8629E7E10F6DAFA81AE13919B6FE56840194193C094D3C8CF184EB4D5CD87224BBF8CA846031476D6E4E61C03B085FD2F9508E3BE1C05238EC5BF08A81624C416E155EBE34D124CF4CACCEBAEC7C51E82419530B4A3742FAA591970541BCEB0B021F5225AAA19D282CBEEE34F2984C70090766680F40F737D26318A2391E8E8FC1C2B7CC2A2C3E837C2BDF8C480D080D4527FC3A5683FCC2281A524689FAEE0E305F732FE07F45DCC8E3ECE4606BEFC55B0A5C122153393DC6F5A30FD9F8F9813DD15CE99AD92CC6E11F7273971761BD2B8DEA7E9EDBECDC253568EADB3603CFE96AA78F0E062A82DE963002E1C6A6AE93E6E34C0E7BE361E580C3647041EAAB1CA2892C70D2AE256268A007ABEAFA5F8FB957F552B6C06E8746AA8E42C6119CAB85E53F3D793EC138BEE9A6DBDBB5FA8564D5B6EAF55865E11BA42A271FE39C56045B2604BB22157B95BC94CD1A93AC90AF09DEF15BB1B62C7F5D21D4149918DB4D50D77F8FF5CA42BF3B5538C398C788F899781604AAFA52A5F9855E004067FBA4B97FCABB2C01B93E9C321F5C7D68E79699DC7A2102D6A35584DA95706C417ED459940A18FCCCCC98BED76878DBF627909EC86664ECD9A2E3DC7537526B49D25AB34B02E95ECE99CD0FE1632A6D2A798EB205D2A4DB1AE77FF1263B87947A2C75050EC490F43E31CF2E98540A767776B2FBA99F66772E7E996382F73793123895B5EE255E65E99A73D3037542C5DD097AB0898CEBDAC6FED78F2B2C7146F93B1C60BF558852174C110E2B9373B83CD386797D870A854CBBEEF04ECE39BC282DD9C759E106878027983C7ADDAE338A1E5358A6F8C97231961303679803491254E6FEB9AC5F5ACCFEF855EECD0B6F0CBA662F7BE1162F636695C2CE0220E8234F2925F6B079DDBFF98BA7007383638BA4F7AC32D4CD313EB69A52179C8CCADE0F329FA3E5795C41887082566E2FF0E33137290B73B64F81F8E73F1526C6226CC1C8F041E4BFA52B9B6BA9634BDBCF87AA6FE56562BF6A58E21DABFE39461AC24E1594A63EAFFE7192FE6F080DEC351D17B86AB7E0BC0A025D975EC714A6F15450E71436462948FB7173D3634F614BF6E78EE680DC63E1910A9248A650365DEB0C1BB825D7FFD6EE6F6F456CE9A6B2FB4B68E085C07078ED05822BB3E0A2AB3A16E85634A9261EE7B8F7116D1D74A864E04C5AE756D72A9BA2CA2054D3220DCDC30B56014F7E512549F8CDC85F0BD090DAC7D39447C3E33FBDBA91DF06CA1495E944A9111EA71462FA349D5E09613C97FA8F7A0C4F79850027164394EC721F7FE438DE1A61BE7233B27199122584355B7EF9E47650074570BFA8E907637F7587151E7AD18221353B1C465ADEE072DAA2E1E816F28DA82FDCF26E5BB8D46AD033FB11FD070A64D85CC4A85909AD678F4CCE47267A6883F96CEE9DDE14C57C67B27626E2CE74D2987C0FBA2EE44F252F8ADE0FEA8D4355CA781791186C86C4964741A7938685C1D7FBAEA96AAE54141CC86D5335B692D96E215C6AB6E2B92BF64B23E7A3A792A9051D37EEDE9AEA1C23027450FF328FE0B4673872291A0AF54283B31F8A6D717536C44D177EA4FBD4364047B46D692CC4BB43323B6E207FEB1342AC5BE6CB91B691FF193AE47861106C643BE9D35687D856EE63473A3506154462043CF79FED6BAF90226E4FF1DF43E121CF0AE59618BCBAD304F767497B5BF804F582732418CC76D03A42331988650F20661866FC30AE4A4782249BF5046615C7754BFC5CCFBC080293145CD588A14A9FE847E262F5FCD446382CA2F43181CCD32D6CA43D69B350A91063691B5274BEE1D9FC0DBC83B2D17976B523A31A13D1114888A71CFC0D3635F738529192B9F4C36DC11B35740F507A9A2BC7B38FAC8FFC9257D2CACCA2E4CCC5D7C54A6040E6BDC15F3659F89C9D39372D81D14582A54AA955FF3AE629F7CBDC4F6F9C49051A5A4409F22F763604F6BA98929F20128643327BA10A40ABD697686A7CA82C01F03213268D3C8F76D4735109804D9757AACAC92B6ACD640F1A98325BC60BBA5BC9B9A8608BF98549B4BBA72DB8362B88FF10C0B2DE019722CD030CF40933AFC8B9F540C6A537CBB0457F76AE263656E36CAA5BB54A077DC822859288ED9040800BDE74C3F665E3C845106C5F8AE8FC96AD28885FD8F97DB17878A420A443C3B43EF6A247C193ED07C692703A9A1E3D3988FCDAC408E1A81261C34A7DC0C224014DB8209446B4D41A3B8098458842165A3A6A97A769FEAC5D4D90E6FE486F47046D6FEDE2FDA9F3D427C089874863891EADF043552B7D984E0BC247B5CED6D1CC3994D71955335C9177C380A8752414E906C850582CF1D8F0D79FD63B623D0551EFBC4EB48B70C97A93B1DE68FCEFD9E6AD5DAF0585789F48BBE641B55C212F39BD2EB9B8D65F5D96FFD6C57A1370F3E7C6EF8D048EFFCB761D05F9A42E131D7182A4AACD3620104DFF1806AFB325354BF259EF6C942AAABD63439BD166B967EBB853F76EC525B1A5DF3F0575F91BC3F7D0AEB1D423B1DD58FAED6AF3853FE746B11BF75F2DC685CDA84A8C542534C44780A300B80792C707759F74D8BBBE20A058BEC4DD2463C90928E42CD9248933C5292373E13E2E3F1E53EFE98E52AD11E92AEBFC6670E6221CDAF6902266EEE2EC6CAFAE984B3E622A7FA68935793BB77BD342AF388CCC5442005607489D1CB7650DFD21A3FE799EEB89D2E6C95CEDA39F3F144F233EA9609F5A6C98F5371A8C62EE23277C19137D5AA4C4AFBAE58BE512B3680889CD9427639D824992E1A9B36F4584DB39C526852B97F47E7AFAA5B9CE868541CF11039459FCC4DF97CAEA78FB10407461B0AC4C8CE2DCF1D815AD69F7C87A0B5B67E45E42EF813C0147EE61AC7C8369B930581ED938B5ED3411BB444F5AE7CE4FDE1D942CE231722E704B44F37A445C9243AFC6705B3223B1F62931333DEDA7601F12CE5EEF3CD7FFE5F069ED71F9B9CC5EB10BAA205EF3ACF9E235B8003EF183A3E4D36876FEA306D7C78A6BC83540FC6F64D58BE1FC3FC11E21640C071FFFA7FEE6498D255156600E05D359D488E4C3A138499B6966A1A7A41249559996FFB8C8E26DE2ECB3D71D0E747CDC29E6EC963DA06BCED5633D9744A1E8130800C778051A90F11B02D7EE612B8CF4E9C57EBE26B318F82B31E264A5D59D4ACAC3150DAD04D60E55FB7A3BC97C6CA9D648AE7E232AEC54E8CE4DD4372B4C46648C239D167E47E5EF6F682B38DD2EAEC5398D5C261F27A0D7C025DEB702D729AE34D63D59CE935801C88FB3C1C11B0BA09E0FFE9DF01F456483C65559692EEC983F7C0406F155F6A5355A5E8F74DF15A4193E18F3D88BBE1591D8D5073DFE989AA31A82451705AE4918586895C1B5F0A4B1B13F2A15F8BFB3BDEF74197FEE6837C2C3EC595CD08D148FCFDB7F232954DBE731568CBF6D84AA5BCF87289095C929F030D2FDC99747E0232B9B461D408F949B98314D98DB78553E41FE8D496484FA05B18EF25756124FEA756893D23E8D1A3FF38DF7637C9115B87CBF8799BA97BFA6A0416CB19C3D4486E1632272E48300B4E34D55D68C97881F7939DA978BB630DDA9ED31FC2069A2B5487181196FA2D4F9BFD2B66C41E81A09B84D386262ADFA2B3245C9F75103937AAAA08E1A156FAFD665E0D7B8FFC39BC0D22743D33140539B7655E62AD8DDA7BB3F3CC1A15AFFF4499D61FD82D5422B6FA9092429BFC0486A4DF3A4BF8985FE87381C79C302F966D333FA36CF42D0C5342A7780CFB97EFB7FF35754675B34C017637549B9C9686DAFA251F5C58978277C2D709512042ECEBA20FAD0AAA4FF78FF3A1F6CCD860B6AC109D02C678836F57A2FD839EA9EAE1234A68F98CF98C20BA3D8F68B6A0C5AF52205D30833016632E904557BCCC58D608C0C3826F7729A2947C5888F91AB8A6ED4E317E5CAA5DE32405DAFCA42463EDE4B95FE5ED434FEAF6BA9C06E78D7A03E79E7A7E9AEA895E62D05E69AC3CFE70087AA43FCAC2C9A9FE4677920E470BA68BC70515B9F552FA3FF1830CE4E63EB9BC2C0E7CE94A4914D4C0804462E7401BD4A7DDD537E8C61317BA0FC94FBCB50817CDE5E2489ECD418DE030E9751E8748A167383D186981C365EB552F3A7FD5181B783CA4F16DC335EA9C4747A7DCAE0922B717D88477FFAE3C128C6D399E070E1B28DDFCE1D2474393F2527C224A1B894D5BFC83680C8393788E78DEE165FC5C95392C8F0EA117506FD4348225838BE206F32FED9183A61E953A84536978523E05F5E6E91D9C8A9C34AC1383C8017DF50286D7FE461EBB11831DE9C42CC3E6F772068C2FAC92C46A6883A8E560224693CC8F40D29063E7E73AC5560FA2B67F70B51C01C1754E587FB26D85C275D5A160D75607AD8314671E1EA4F4D73CC4C7A21438304410752E7E26C11022DE25716523F5384CBEC1EDA0B4F3A2D0598132FDA5E3BE3D955D4052379976B1F4343FF9238FB3479C7AF3424A8F9F2CD24E24A59 +MD = 54FFE4363D7A9C4BCB95993A7B3A42E9DC44F26489E2C823D111787015CD3240 + +Count = 4 +Msg = E2CF +MD = 20F0CFC6E67BD2194F39FFA49A98CFEE98D6FD71F0DAC1FFB96C457A9A95140F + +Count = 5 +Msg = B6E242223A48C027 +MD = 95F30F0D0129947AC183DCB36DBB8BC4306CADDFE462B9BFAEE745DBC9A1205E + +Count = 6 +Msg = +MD = 0B3BE5850F2F6B98CAF29F8FDEA89B64A1FA70AA249B8F839BD53BAA304D92B2 + +Count = 7 +Msg = F121DC5A9AA1BE603D929D34C6A044A1 +MD = 373A06DB855D651ABA3EA4D1B6302E9F21D80112CB7383A0FD21B6160907BBD8 + +Count = 8 +Msg = B8C08031BB79E6070D26646D0586DA8EB55A1AD48836DE5F2DAF4702DDD6F78D6FCA3A42A9E0E0A9561C3CC861CEAB4D5EBD3E0D924DA282E121040B31E32A362ED6FD3B4C97E4D47A717E6BF916FE5F03FAA41F98EAFA2227B76188DCD47872F206998AD06F01C6D8699221CE3689CA23A408373F0B9E43DCDB1394365CF7A6F90B79F37C738F94F9DD462E58D953F12E966437CB4132E76755ADF55C6C907C72EB28C2BC954DAF15743D62C470EB03872266A0F8BFDAB8D9928B27C599378C4DCABB6CB091349848B5225703D022F76AAA6D3A06F083B21070E92A0A26E97B3CB015FAB47F52F6EDCD57439D82B4087094BD1B2BFD865C46095B40A70A8E21CBA61B52BA2742EB57774C389840158DBBE0B97569CE4F3E2AB8B4AB23124EE23F3577F667624D4852D1C3B4B04DC405F4CD84C75019B8FC56DD28027397C745296AF963C81E2659927123970B9B8DDCF4AEB6558E8791257D7BA089394BD4BA0A7D8B4654613DD6A72A34DFF620F1BB4F4C0EC5E072B6A1D8D3E54D7D9C1F479C688D8D1046879371E0AE6352B22F5C89E53AED3D0FDA97C7E96E807BEF580A0AED428D9264AA09C47A53FFC4534F25A488C49862320A8C8EF6C626D707178188A358656FA1CA243A3028C2BBDAD3749A49DCF22BBFA7D8E2B5FF9C9E8331BD62D27620FAE9B502BE9F5E310947D1B322518C8E2B2556C9FC8082B9A22D86B6FF6B5FE964B37AB193D9338B6175CE9BE44C794CF7A2923D7CAD237966FC5F9018A8329DE8E74F6ED7DBFB51F1CA6886B1E7D455B33ABF5CD9216DB68F004A967AA273B84331B2FCFD0A741BA6414BB1459DC77E270ADCDEE9D5C3C67A98DFD79065D74E57AF438035D758A8C5A3B598D6BB71F238CC6F6FC694CF6D6DEB82642B9D8A4169FC5A955947494FB1331945202BF0BF26EC9EC4F56788C3DFD6124955F37D2818742ED961DC99F0821FBE927B8A4C42FBC23E3FFEC64C027397B6823400F9BDB6F02DACFC165E4A52AE42D5A8F6485589D04D92B53D2A52272B65C92616BB822600DB8A5CA045E564F3ED5083765A7D4F60F964B2660779C6DB84D0B094243CF2BFAFA71ABDF8E88B682DC250DACEB1D1E87AC51D57CFBFF862C4811C7434D0CFB15DC4C6B262916710D84A384529EC0CD2FEC8195E1E9AEFF0AEB8F977CC16335DF39F7C09EA1F85E85D0D7E8586B338D7744A756CB77092C3D4D603A998F044C216DB528A7002E7DF423001111B6A69FB80210282A0C7A6820CB835141BDB506DC8BC6FAA60AE6771629629866F81A76A6C072976EDC2214F35CF7DB7CDD2C366DF93485FFABE9BD1B9911F099D1F138B11CAA814B2D97F069A20759030B0A38FD3C2A6DB38486FAD6C57BD5CA217B116BCF2A5032AAFB4051441C4DA490AA008ED9036DB783853C85AFAA75A1C2264826E5FD43E0BA064230EA0C6F684946462B7B46F12E1D59D839EDCA830085AE9F1DD416BEA3661FD4C2B13CCD7715C44C59644A368B352A198C250A02EF8341BB4B7D51842297A2C55B623E6CD09C5124298E29AC3B7803E8B9FD228E6C1CF53F7F7181F9C43029C1C184DB28F6BD38FFC3D5D95169A58FD37968DA256524693E6CFEFD6F0A576FE96457DAA69CDAF20CC432BA8633A3D5D9E1BE805B65F46CAD2BACCBF7CFD9E56C75FFFD01CAE9369E76CD612269D2FAC929137D5BD704737FEB3D7AF01EFA4CEA4D4E0043A6D41F0877E1E4A8833A3358A1F2DEAC5C9995618C8D168D6E468F8C8076E51BC2B712450474E3F52FDAECA0FA224E1C1B909DB3B8AEB729BD819A215258180C552785FAE09997E7A5A041B19075834C086370FFE9315323FFF89782DAB292C7B2E05BD29C433B81F8B60E185D058947FE5E28EEE7282323C451FAE7F2150CF30D79FEB019B0AFB537EEF733233AD6FA6F5F848C99A3E09ACD280E4A58438FD3A91B1AE306D92E4DAE63B6F820EFF0898B0078A2908059698963F2F1A2656CE46F139A182FE3F3962136EE25ECE879DD2774BF47DAED4318B1A159A2E63CAB3906C2990D55E869971CE27159A2237C90FA15CA2DA6151971D071567E8A50BFF49BA52F1A5F6C873F1B183AF87BE9668E34B8A8C0627D92E1B9173CD481EB1CCC227CCE0D0452418D9E8B128DEA1105E71AD849C1A7EF922E124D61383FA2BD200B6EC5FF2B6989D2771B31D76B04F7981145C9B9A14B2432EAAFEAC6F1195DFBDDE2827B5B16CBA14E675A8CBDBAB30D45C926E9D8F38EC04A83148B7EC2E16DBD45F978828C4D0A8A286B39F097852FECDD7127E27412EA53B220C80230228B75FCCF77B13A8AC97C2C6FB08854DFB30DE4AE9141B97B49231F24C05B74F849F5DFB3F3C80D6EA252B7BBC61452520EE27DCA1D919149BC7186449215CA6DF72415CAB890DBEAF075FC4E8A0DA524D0CD25DDEDBAEAB86496078241C8CC8C8849B4A1FE97A96E1682D9979542BFAEDC5173D4FFEC804C496D56129959A927B97FB6305903363923B7B75AE1431311D658A5E044F79CABC97868913186D4CCD9A1EE258C7F55D92B3AA13825255AF65A444C30A3B8E2B1D31A76E09A9507ACD2FA814F54ED855702DCC51A466476A41D6246FD3AA42920BF2C527208653E863304553AA41BA16CBEE53DC6F3D87B6EA3D2D3385E1A623EC15080289B135E9DAE3ED7420F3BF001C0EA3E5566623CE6B0E3DE2591F63828A22679438B78C19B969018B4F1396F67D2C17773DC1CC86F23A977B745290BB806BEAFE8C2BC86481892CED65977F587846652C08EC44C855E1A2FE2011A566D8460BE328976A5264B2F5B394DF205ABA3E022DED64B2932721A9AB88C94470E4C5141E8C9B2FE0DB12C755F7903375C04743E10E7779749377BC07EEBFC99B6E84CFCFCB01CD1F0E2252DA9C5D9C96ED33EA408662616C4C9F8B15DF28F21C492CE672C164AABE7A24D3EC259ED735DA261ABAD489140C2262822B76B73FE62F359170772AD488892CC6618E7546ADC8563BB80D3747C017DA4F5EE27E48C2E4ECBCEF0D67BEAF519130A7C2B37DAD1BD463207C87D8F8EED1589CDA76A60BE4047CA2B957A061978B677C079FFD645CA2420D1A27465D13C4013C0E21D5DBEB25C3BE36DBF4C4340288F01F5CF04ED3F440383398F0BCBE1F8EF455635275B68B91E2DC3F2E80AE7DD9189F553DB7D3B36819E09DA852340600174CFF6FD0AF123A94CB0E7194C6BF89B5BFD81D68E1D720A2FB389519E33EADD53F1734AF0E08688C1BA9EBC541D4532113F2925CE9973575DECCD5767D21B08C619C54AF8BDAA6B76F904D37EB5B6026E57305F1AC50ECA7E1BED04233F20FFAF95E64A57FA495384BDBED5849FE89826BAE91091BBFE010B0ACCECC0A64837D81533E8DF7BBA641DDCCA5D163935DE3354DD6846005DE397E54F5D2D6C82EE75770D7F6BFFC8BB008502B4E190EAC1C4FEA97BC8EFE1C7C74040EA3C6D36A159EBE79F3BC672338C2257C10D9902070A7D883EB31725858545A82BBEDE7EA34E516B05B94B960E7C75EF968820BA3E3E49EFCED4F7FE42B65219F61E4684ADB3B482AC2E0C5DBED779B23D279EFD648B79ED74FEBFCE4653284F5731AFF025F141D2D3AE1E1031EC30E76B45B11B1764A56AA4690FBF03E63C58F5BCF67D37899C4BE5BC19C67D69BB88CDC86300920D27F29C354BCCE182DEFD61B51A74F5B3BFD1A975355B4AEEFD4AAD86E13B733BB6E88503E0F23DCF5A52ED2C64B84F46931A1891571CC7DCB7AD38011F6AA1937A260E21EFE1D2BD93EA2AE27E1E8A44FB66F3D722E1D49A20B85C33BA3CAFFFA149A23EAA2D56A1375AFD6CF1D55E9922E305B866DA708841640127959EF3573A3B41246C4B9ADE00529FC7F477A84B69B300C736F788D6D929ED462C3F0BA8579632B6943A3CE75837A8143AA893D9CBB5CDE28E2C2042B26A4B426E54B1D146E7605E44E1A72F86297EFF4F649C3086037A6661292A3B65E00429EEEA78F375D6DD43383594DA1E9E5C54BD20F34DCE1ACC5ADA5B601DCD34F854ED8D409BB08B79789758F8407EA047D2DCC58E34FCB65BD42E2E192A66BF76034D4FFC915DB0A421B78AB675227BEC3A039D4107B6B36827217C7D82625F01E7D2E4F32EB3B6751C215C8D720FD6A1A241EF26D96E7E4C99D7C56FE14311CF5878CEA23D78BD864D1834D66A25F6274ACACB307338388954A86946EE4693D90F8D24F9313474399468D9C139A7E263E19E252 +MD = 81046E4F5B3BB3632713E4C0ADEC48D114C5C99562B8005999A5F3EA666734EF + +Count = 9 +Msg = 56A719FD86848B7CDF2CEA583BED0A49BAA936E20BBA4BFFA7A4E204357604DF4A7A171A2F019D87421F49585E4CB33FC23446D31EBFB79C5B1A55E2A2864669270A0DC1D6EF1AB80CAEA0EC70F2A15BF1A341013030C18AC37BBF14ABBBE5BBD8DF31533EF168D2198DC76F1FCA2B6879FAF0FE454539F74983FE5A30060C51C9E41390C14E1CFF3A6FE7A268516AF84F569BB1CAE67692A63909BBF30EA2138076A63BB79BA62BDDF1C4D65E968EF818050BDA6A5B87E26D80EA8844610B2CCCD322F2AA2F41B4AF70D4D821A0340FAA11A3EE02C8A825EFC4CD36B01EE67CE598098A749B4DE8C4572AFA87AEC0CD4CDADD33BD1D2A032BFD03E6610A03908957F38996A99B0FC4BA29AA9DAD9D400300EAD540B3BEC86E055F76976687BA5399712FBA3736A23FCE6E03F47F667D5FC2E361202D4FD6982B1B914A24775D336F56033C6E86CBCA47967244BBD4EE9FE117D482259A264A9A968F1BA4581A5711D084286241F13C1896D897DD92DD562CF1680DA2DB0DD530B9A1D7F6AF25EE7B1A33EB4FC63DA026986A8EC18E6C08B938EFB3F00DB535C2AFF7A89F1A466871E91BC25EF10766B4C7E70A707E13A14D981DBDC072FE6E65FD289FCE94010C52021DD773A9A9C73188FE2926ABC5449B565B06FC88A7FFEBAD5D61C967981FC5DAB76E603C2EA3EE558C3873D447BA38E3047839FA0FC95A1EEBC54C48FEC9EFDF644BF356E35F27B817A6FC6F8C1766A329E56320E6CACBEE1442506956A657C2489370FBC6E200A45080E368CDEA92D45FA91F1866CFF899800441A00FBD61714F3927F8A66ADC47E4BFCF65E7622029B07B0AAD873E5C789BD77BC2A05F94921F721994C39A2DF5CDD833A7FF93B21DE417EF93B3B4E910DCAE5DCFEE1AA6852A3C4674488C66164E14E0AF0AB57907245DDE887000DE6B8809B7143C5D06B331AE7CC24D3DD557B1D8459ED43A05273555AB913B1E15295DDAEC3FD551D9F00E2C7D5B38B6B9E78886D797BB3F974D0390DFE7B2757713995364725096825FFE5590A7BCA9EE7F9BC309B5467D6E1D439E3B4572F23E99B56AC2E5514796F104789865AFEF9159A1604BEE6CC2CC1BE4472FB25A3DEC0C17F6F151E7082D542C17B0CEE5086E530DE2A312A64F2DF39EA6000A17E497C78B8B4EB8FE3F719832F6C25411FD36DCD8DBA57899DA65C8C9FEB34108233C487FE94359B9B555CD700ADFAF8CD8E2A07024313C3F1F2DB02686EFFF8C30900FBA79D428BADC222385D7078EFBB53BF01C12D1E4F2000960BB923333C65641407AD0F51303B9E693010EB667189FB5704BFEE37A5FAB1DB970746C28A9EE5C2F96C6132BC028ED622C3DE2E349A1481BDDC2E8C873C7E1CFB33BA28F4DBDEA12B187D1518B8AB02211804E21C83970CE2B504BE60694BCCEE5447784855D156E53D032C2D0F7905212C5B6F279C00679CBD363FC72030C1CCA026B47122C9CB36BE0CDF807ADFE34C0F8D340DECA55253EFDB8B1F919FB4FC415F7CD8C4840E628028699F20D721ED52F3B7A30CB3E00AD46081473EBB952E47D34F2B531A877B7ED17DB43BB32318B9ADCCADD801FF8D6F71F46402B723D4834B475D88068A487C3C242B363BDF113D789D90EEF74645D3C1CBE1162378B7BDA920E07BD580A3138431ABDDD44723A2D3269A2982E59C050179C64AA92248B36C6D9D1AEEA567E7EA8D6AB5AA680F8A984E42FCEE9E3AB384EB6A5BCA687A51E8E86166AA08B42DCEA23F057AD65AA96A4BA25AEF5BD4DE32E986033B0C2D820318DCB1F6A8D09F8A153E4C5F3538AE80C0F18EC61F729D139333B072B0E2B274BCF26209A8B2C16B12D0DA1D887F0DB0E7727A1AAEBBE3A63F9E5365101CD9228BC7A232C6A4D81E2013B34E988F8B14360F9B3E7897D5F11ECBDA1A5F6C4AF5F7B791C0DCCAEA429A6BFA9B08A50DB0034F3F10719AA9E3F1A1240ACACDBEC3C8BD56E0EDCA376B2558940CAD4AF879BE2A07002D3A745D0DBDDF3BA6DF77DCBD36C24B4E2CC23907D3EB2906AD36A6A8BA5CA0B6AE968E38F9E33FFB0BB445E0C75F7678AD2B9157CE08595F5B5650772882FC82C7160E9044125449824E0C1FA5483F5DB03E0B8ECB48F8A64D3EDDA382C8D278B7C319B150E6349AC747D58FFC39AA131702B6FA876DC78E1D58430534B0C6C97B9367D22E8DFCD9F970C7737378BA1384BA8C7001D7E149FB9B93F8933F5616811C0458D1D7F49915DCF116A6540AA4AE3F707A3446C793B21DE692EA0446CA1AA0E267645141BCC5E36A24E6CAA3A780EF5A53BEDBE23A5470A6B3E151BF0196370BF571A3404CFDC3A450EC92BCE76A3F01FAA9F30B3ECEA812F3AA8DCB7424589EAFCEAE35DDAF0D65EB37815DB1B3CF59B24FB457932BCD26C9905CA27FF8302C93F41D18CC09345BAC8D20073D5A513FEB3419247FF0FB7401776C4D526AE5F2F764B9BDA6A68DA91B68BB160BC5F97F4F1CB74BEF1BBCA3089917449CE6F931A72D0FD890938934A660090735E5784B8DFD0E45A3AA03DBB816B51D9F491C347F796EDEB610DEAB8382957F12A56D1320DBC69FE8B39DFD29341089DE7BA56D43C497CC7699856D2E52B2210484C902A9A1FCC3827C4BBBEB71B581F044CD07DD383B4E1DA09C8746597195F16CE8946B1DD03C8ED1EAD788DBD104D4036CD985BA43DC597AF50905658D290AB5BA7E892116E27480890B5D53C531CF97A332EC980047191C3AF018C7371954B1CCD311627BB2FC8A64F521487EF5B5B3496DB24A4C62B573657CE626C9AD596FA69B96E2106D2BF04662330B15D09D353A657DD9671A756A2DADFD0ECCC5B0C7ABC191E36EC392EC31C1F3DA3FAA5D94DFB0FC642F80089C262CC472602D2380B16B5F543EB9D666C2919795169B3A7350682F1BD94C982BC905BD420F208C14AE7328C45B095625EA85A19DE863759AF25121F80E17A764C3338B38FC8457920572F6A36266284701F931439B0A335580224FBE0E841696CBB3F1277E2D29562E1F88657CD2288C28DAF604D663D9C8F035A8DA44A983716C6FE7AE6500D8E4DFEB158B71DDD8BDF9B385339E11B057EA282748745F11848C07091CFA8A2728020124FB5E4E57225CFAE081245FE35AAF8FC44CD9807080C990FF6AC4CBB36F9C5D218CECB5099BD104FB796E80502C23AE7D7AB5EA5E8190A421BD5EEC5D913770E4C73E566DFA76286BD484F7123930D337264E48A9B20EAFFC38835C4CE4B76A31EDAB98FDCD3072F48D7E89FCA981E88C7BA53742EEC722C88E6A356729EB771D2AB5249DA7D579E5CB542C4384A352A69ACFC13F7027432678D06F530B1BDAA2076CC1E46D5AE4963B51779AAAEF33EB178ECC5A2A379D03720E24C77616DABF797A3C27D16E494FEB2B042EAFB87B899C844B8C4F7087CFCFCE725F361D202486B81120A31C09A9358C7EFF337E53B9929B3AF1DB4E6FF8F27C5812FBFA19CE0AEFA7E7974AD6708A9246C301889C517AB8CC9AE23E593858283E36C3E6AD4B62B0F453C66C2247B4BA6739079CF769DFF6A8432D7EEBDC967F9F7F0C9FBC93E50B505094489B0E8674D627C71030CB20D466CD4E6A1DF3C527CD46DCB33B250DD343FC3CA6C5976B99CCA8A8C405764ED44E3838FF458AED6C8B7C8B4431C349B119E3DC348E8A0ECF51B49D654B01124707F874F2EC1E9DC90EC01B490C2757F96EE7AA21AA1A45C439699D80ED88218A6A344C395E46D50B560325BE6EB5B33A5CA3F66356F0ACFDB2A0C972710CDB86AE90EED7EB2E9B1812AECB96E4875573B663344981BE2379975E86AD8D528A5937AF1FDDD6EB5F3E08EE40B82506092B5B45CC1DC891F4E06D65409C97ED9AB014625F457787ACCB13F630A37D7B4481456B5247966C80A5AA3F7061AAC2962B539093B2B6C3A3C398F109D2615172E220BF473C9B4329A7E1B99B48074B205160154FDCD781DA81B78EAE9562BE3458BC8E40EB7B59800076FBD0FD286BCC5DD0B8625C01960A9EE4C5850CA484452375428B790A34D606854F65EBA0DD595BC250C4AA4BE8472683A1F6B5D4835BE2A6AD77E5D04353ABE26BC6B2201EEE176C393A53CFAAE78D0B64F5583E1021F1F373450355737B8EFD28C7E02184F664B3EF59AB5908230BC5EAEA7B4DFB6DC239D4CEACD9EAB1E8BDAB5696D2F76B766E90A44EC686A8EB40493D6A98F04101BAF5A64CB6598AC93D60EDADA19C28CE8F641CAD471EFBA32BE35C90BD475FCD6A44EBDD511EB01515DB1165A90B49B4106EEB24E393BA9C09F320D2FCEA1BE61120335CA04B7D60B407977C0D960A1099A8805E5C2AD9C68A4FD35DFDDD182BBF2B4488D7ED13C4E18A70EC0C4E9E63F900395469CD89F6466CC260782F62D6EF6BBCD2418148BC94BB6CD1A9EDCA4BB16F54FD93C3B1F1915E326B1AA35CB227AA0C9091BC2277B78CCFBE50B85C68A286AF08CA75332BB9BB40F34EED91E15EAAB9FFE129B9F54CED361703F3A0E901D9B893F443F7A276E0E6D67B3F28D9EAEE6FA60E5C7788CCA9CBED4F1C27C61A57E175250DED0AB307890042E38A0DC46C2C1593FAEAA5523FC75A880A635AB910BC134DA3A4DCF154F2F6D37735E92FBE28D2F002222F7D3C12F5469282B8A42E47222776C010B75F144F07E3D1EAF9DE2AC9E1806AB6FE8C960180BF966EC23A52A52013B1A8FE082B90EDE327896A37FB7867C8C713C38033AAD0BE8FF7C8A57CCD912CCAE61C81CBD964C9D90B651C9758C42E0709733EE19FE016D84F7823D8386669F84D6D055BE5FCEDBF09B72845B4172733AAAE634A524B2B05F5A98C5130E1A0A4FB2459EBBEC2211C858FE7E8C7D1143850F03D9A031F95F2420F563C708C7E1816734A9FBD4B74D87D56B4D263423E2485440040B40691DB9E57A9BF7BE4AC0901CFC24486747B057B651CAC5AB39EFFC131B72C7C3D540FE17F015591C56C88BABBD0937FF99E00D8FAC55EF9F570DAC8A9EE3A3D8F8CC47BC26317731573B5F883F1AEE30B8FD793A64371680505EBFE269CE7E7225B3B3F0C17BD96869DB3871F5665F3D1F7BD2A06A6973C0B6C76BC77194C789BDED638C66FE6E3D2411D089FFA58AE9FE82C3EDFBDD08BB40F23AFA0F11F6D413AFB40803D3D6200D957C5898EAC1103D81C8EFD1DA8DE0E5A84C73C4732D121BFC7550F181E62AABA2E06660AF22553129BD8E4906033921D4235B87625C99686A3D9C74711FBB9A9D432EF9267F3685F6429AB69FC914F83B2E1C5D8BA2484546FEF57185E0C00901F3ABC2D43FFB54EDD59120C1E3C9A129A43942025D0FFAFBE8B32889C4FF158190B4AB1D5123FB33C870B511288462345448E1A77D07A3E3B0C7EC8CD2CA28D67C9E302E1D83D7803D0F3AED5AE9D26451F3357C1E6D048911C86C8A376F60FD47DF9489533317D070606A6ECCB689C6F4873BDE95ACB80E9AA71D55164D49CDAE3CA67B5549111DDC640BBD0395BC5B3FA595AF3482689B2785EFAC16C2BA23179CBF900F0D71AB761E0230A0FB0B04EAC21670B799992CD40A54CF59640619AAE8A566D62C4B3134EA38168038FA2B79EBC253AC496C7D0293BB05B9A2511217E885B855A42EBD77E43CCC6183AB9C1028556EA2B26D617B276442704678919826FF97B242D6D5BD04DCC70CA01C7FE71FF4914CE36F647A243C2D40EB4C316CAA333A8414E9CD5180B09ED6A554DB0AE45A5051E744B5B79B1D8E06A894D1B7AB5B616CE2FBD336273FCC32D18DD4CF60225B91FBDF85667E83E9F75AC6A9EBDFE62A4AF36F28E9861A29A77882E60D48BFA5853940BBCBD6FBEE5F12DCDC6095E053EA638ADCF1FA710AE1B6DDEDFB9CDBAE9B2124B29E2A5F74F780C9D7A93EC812972FFBAABDE3B48BC735DA15F80DF3C2362D413F712EB4BF0315E471309960A3EDCB56CBA131F1B76D98EA69504A7BEA8D07A17CFD89A0687B3BA6A7FE425A2DD537272DB62721043C89D2D8434B6FB999FAE329F8E4A5632AED50658B49B82A3EBD9318224E3366E59D3F73B7C8252FCCEC0D045F3035F091C303C9D6BB78F3D0A89A86B756974BC77D435AA531AC62C820999F3BB4CB0D87A3875E4B698F2A254BA30F2D9E787554C23CE1EDDB4B5F16A100B522D8B81BDD8CFE14CF38005DED1934598E9D3429A8234B7877E920AC572747A969DA074D938732A0A064A61BC1DFF4D3A6F2D1796CD70DFF8D3FA4F36C51BCA7F156F41312E7C5066B9389437D2FB798F54D066556CE3D91CC08C054E33E344EA8FE2A6AEAE0C1BE2CCA0DD84DC9825D880CFE1F4B575122196246092771232D5F3A9B7E044CAD148B47388BC16443038662CBD73F150250AC0851889AB797BBA6DF79132D03583B5EE993031FC660B41E4383C4A54CED4A384BD1FCFA257AD4B07CE4E1EB30D5820990785682FF31E6A79C695633D3155AF22FDBE2315C40396FBE53A2E17FC9ED6E01BA15D497C83819EB545EBB23A1DD668AEFBC55F250AD4F3EE7C3AB8F0428D37BE8321800865B66A2C94608E27E4B1D763B57900D987BB00DC595B0048C8AE62B8A3F3B6FC466039355B3280AA56CC09BA63553AD98C6E36C820B3AF1AB62153F60DC583E0FAEB1D453FCB7E452A66759D4145D57363992C45CCEECB82B12E8F29DE9AAC814828BF8837E599C0EFE19DCA3E11C9704BE08264993E241C1F8A94014C44668FB9E45518865D3B7DFF6B55DB410154AF551EEDFE1837F80A04A378AD5188849B7B0E0049BCB0E9FEA514752DE848CB0E35E4BC2D66687781FC4B13D2D49E1C66E6BA5033010AE2A424FF58F3B2CA21BBE87A676CDC573512967E5D719D171A16F80E472DF887FD3B020808771F83CF322967FA6A26BF9A8F854DAC92AD71171DD541FBB472F3B3507D3C6AD45EBDF302AF2B48251CAFE04873C7A8BADB6A8D90E0FA91CD881ABF35A499FCFA54B630C74AA9E38228E1F13551B340BB5B087512AEC9E3541C358A946C128082B2F5F3BD86D16031770B680F096C7BD4CA03DAAC14DA4B8AD2DCAB151F5F1616616E725BBF9324899843ABA361E45AAFC9B5CA6837D46DE8BA78EABA265B1217E5419D9AFA101536EF5103D13EA828EE720B4B6984BDDE8D0099A146B86A534D2183BE1046CFB5A9909378E6D08CAA024FFC382B1FA8832773108A606ECE7E74FDC6BFAAEA08A7B24591D8F134F7AC73EF9EF6CC32382D78F096AD2645553AD21503E919DD0F18474485D57DDF91E27B640670CFC7B242B59936AA536B716CF05706DC310E92A6D086BF77AC62BFA96EA421C23ED47B0A62C133709664C4DBC318E516D8C5B16CC15FA049183A9652D99D3BAF39BF3E2BEBFC796FDB22007BB1D3B4838DA8C0A8F2B4F0DF3421F2283AD0A70929259203EAB92ADC4C4191AF4F2497348602D520CC92AC84BE5EE7CA0A4134FA7B07529C41A0A8C48DF45CA12351800F8ABDA2280B763C86791D459BD150C1FB1C972447D20AF2D56A00A2D8360B516CCED84F5CAF1CEF04DACC23245B0CF32D2251948C2D483D8FCACCBDFAC354507DCBE8DCF911755BFFA82F6D15E7DE7A5D1D75B5D466D53F76AACF81D25EE431767BB568723FFA1BAD0594D40DDB17A7FC5250ED5DAE7C06E6A9564E51F379A0C3EDF6AA2266082D235A18CEC1F1319B9317958FFE06E3D7FFAE71C8E9BBC9B99BF4102FE47D75864A33C9F395AD34F577BABB3A5DE9A2BD0A2EAA83F43F4367906F32DDE101B715A20F35CA4CE04252798C512EF09F5BB2516315C5C2F1921AF05263267A6714660395984EA3D86019DC481A77EE1476F103708C8DFBF142B07D2AC9FA7D1BE80277EB2B5B070D0E78F2FBE97AE72A2CEBDB6222F9EA867A1242D7C1790E75ACC06007F002F91BF9F662038AF007C7D9530DEE1F0AE8EE27E17119182F3B956A7D5F191ADF2A29E2CF782C97D70B7A0A7B0E7E6B106691D781D01E91D003CABADCA91DA0FEBCFA38E40B4F92CC5650E5F71E9D10CD2A4A16CD3198FF1B9812CBAD61BB2DEDD90BCE14458715170F1B2B8F389AC166B9FDA26EF6D3BD23FB2D5BE883E55A9B22F81E02DF0C87A3250FCE166D7FE2FD4154F37418CEF6F55E9A19282B2C8319C0905C307CCE97AD760F39F71596C68B3A5EA73EF1E682640128A434F36F77F87CA455CD13A28072BD560E09850FDFB7D39DEDCC855427EA0DF83F541A62BA0697417A7140F97797DE24719BD878DEF148FC616571AB63188C7BBF1B632C685A9BF77243856E76DA1645FE50E28C0195293E0B2DF15484FBDE51F4D53A5C24B1CC270FE1069B6BEA75874F3BBD1235F06A29F235214A59476276653379A1AFCA113C94BB8C208E9DC220A87A15594ECC1BF46B0069FF9081DDC88E80263860D3E7751A707D8A7449AB6462F091EF220937A91775369F5021AC12EDB391FE6799BFD482904ECE4E91702165059C9FEFEE9675587D10EB9D5814E8C45A9CB0A7ACFCC930CD5C91CA695A85F5152A5A951C22FF2D2CA5FA78C4473A7B5609E404CF79C818C36F229204BAEF129AF6782DCA53B8379D938AF6F2506C762216746F668135AB6241D1BCF06D1861C6D7DDDDCF0CB0F241BC672BFEC11662F2AC6FFE467FAC19B0DCBB78820B37307B19301A728EB71555721DBA1A19BCA12B6EBA540D2A2B573BC42CF2514870468526A0D590FBF063F54A98D451F1FF97200A4D2340E33340EDE8EEBE61C4C41D01D724E368D7103F6E565EB29156F539C485D256FB4CF5A1F36FE7B81D420230868BC27ACD0C3E48FA1DB4FA8470BF96E3A4E9DBF27D11B4D182F008EF68122C542E3C15847A7CB857895CED880B2D82A050C47858264E196A1DA94A1C2569820B989656449A02692821846910342CC6557D589E93A9C43DE012BB76D122AC222FDAE1FF74C73E065E6B4036A1D50925F0D2E4AECCDAFE51D4687621EE9B880585524935523D519E3F523038598D8C0B1985860E4DFD5554EC801B0C410C17B2D34AA14F8BC3D3B371466F7A9AB60846DC6B18691589B787FCF458D212554D233A8D551EEC4C7F45B1C29CF78DDABA2687D42FD5F3BEAD59832942976AF1911C094C401D50E96A9FFBC2B742FCCFFA223A325A4E25773F7BD00B9BB2F9E7EAB02170FE419AACC59E699FEA21075A5CC32F205D389752E6820CC43D555DA7A603E7F7218BC1B8878D6CBBD4958D1E7475BED893C98AA228DE8A6C34C66F7040C1E9D6391038D0F17698CFDBEB7E4104FE5FC7967513DC7945DE42F16573C12DFC7B12BBA6D5543CDDD72D30BAD63D5039674666A7D9CBAE1D5CF341E5EF9BF2C7A1EF606B955E28FB8AC8ADF69BBE6F90F2B7FE3D5A7612AF649E49D21246FE4B2A6918F6CCE4A4191D7B1D112DB7819E83B0F3279DC57D2BCCC0F7070446E943CA62CC32A578C40E13D52FEF690181BD1CAB4E6153C6AD64FBED2A0BFD9D14C691D946CAEB4EF91AECE513C8A58DC2CB4F39FA590877FFF3B56746B84EB81076C0595D9FCAB6D1CDB233746EB2E4CF6E2A6ECCB3A2BBCE19D94305740830CC34D49CF84C20330088682C96C5038140D0A7D89DDFFB5CD4048B43B677B15DC571774F9A25EC734DF76E345B76250916580224DC2FA2EC3987C8E3B0EC7C88C70A67155DB3E72AE4249AA671B6F15DEF822D5E758C7195DE8B06126D08C2517AE57D511F0FBB5260E730B794FC7A72866B042EBF2E133A88D146C2BDD4BDEB52492B9C49A04EEFD6DAED9E5BCA00D210938BF20493925CC232C84DC8E8A48C2955555BD0EE38E61C1447E43084EECEC064A21A58CBE6CEA6DECA06E80116EE365164F664A501326A95E5E04BBE1C4D43F97D64468A336D6E96A4F214220E0B0D59ADDF1FE86A2B536FBFB2D60672F8B27CC2EE93B2A7AC2E0797DE001F1E3897EAE2E2004D3D6B9F4200D6CA80876823BC3FA76F1F674AB201B108509C2B4451772AFB1380E8754F575F41B1D0D1AD702FAA43DF76D97873A8300E9C250B0326CC8553559C4492C3BA6807C01588E120038820E1D764DA9DA2777B40E9E91A5C4C2AF54B8E47E3DB1780250ED1B85E1F5EEE889CDA215F57AAB5B314C941E9D14DAB73FA939591CBA455CA574FCBCBFA196BF20B607D722ACB9D90D894CF01C5A653C12634637BB94CBCF884570817EEF9B8FB6D5FDE60D039493F0604C936D54404B0FC0A95C5B5E038BEB374FDD3C375B1DEDBC3A465C7E2E0FCEB3475B48386234042572BD453F3457D272FBD5B4B756B8042EA5B019F9EE90929A8DA817A743B2D51AD816C59DD8AD88E274EA83585A175C8E561992B21A0B36E22BABB18B3F2A2E480099DE40F36756F8273684040C393F764C89512A2023FFCDE0E2722CFBFCA24ABB3A58C1381B9AEFC39A8AE48632D5F26C3B3FB6D90428DD9A105F10F429FC2A933A48D2E07E3D30EE616786981B47AE0D7FC0C0BDEC71B7127B2728BB8AFA999D5F504BE90311EEFD0EC8779CA1447EC9B10375693B6DA7C891BF655615746466CEE839CAFBC40A6DD2C2AE24F91A7036A85E0A86852F62F2A9835843AC97E89A6311CEB90BB3CDEDF8079779BE83CF764E2EAEB66ADDE09E86 +MD = 9CE6D64EC3BF9D2173C1A58ADB4D1352F35BBBAFA90DC866EDC4598839D1F243 + +Count = 10 +Msg = D791321895601100EF04177C8B72440B2705435EF0A76B663DE747AE6A36C86DC0271FF6EBB1064067E23526C410282B512351E1E9A8B33026CCDBAE196396B83CAABC64524E1F76FF02F60E7144A22CBE1C5D46E5E6831874EFD01FD55826034B7CE91954C4D80204DAE2E6B1A4BEE129AEEFFD064FD35526A4F0637EFFA0A7DCF2C3F55A88D7FA435A420B049D66CF31EEF6266829FDFBA994F3B0D47484043A3A0ABFE1C886A0D7F5B9AC0CC751883D20328F097A3EB2F4C74CC6952726CFD53ED0C993A7EE6867554F726F51EFE1426A72B342F4FBC0FC57CA1A7CBF0AAFCFEAD6CEF787F59632C928B32ACB43A3D86A832AB4728CE14210CD3CDDD4EBA74BA0A3847B20EABB75DC8078CC489530142641123BE0FA5C5EF58BE6B9B8B95EDE80688A28BE28B780C8B5D8F21314FA7B9D28B692D96C6AA5462686950301BC23229A4CDF0B0755FE8A91732A226A4AE0906B1C9002CC0514FDE5E197A1227CC7F8B4CF79C71A7095D2B70847F84082DCDCA50498E42B20569538E22525BE5C6715AC316D9AD11975FA86BE4BC3BD1BBC6205BBFC1DE3E2CD9479E48E384A70135AA0314C0E14410A8B8E9D5E6CD592D71D25C32003604A31CA64D920EC8A3DB016ABF0238BCFAE4DC4B0708E458460BFE70D7112875010FA56FF81AA3B201E0151ED47C1E56E4B4D77755C52EFBBEC46031A39DF182B29C69AF5CD8B4D0312A3926F3D583C9ED979C1239A12F3BE0B9A133BA621E73EE825C38027EFA0BF007362B8C0807D94096440C01EF49117D2DCEA3378115DF1BB53861794BC77E9D8012326AF3BFD8A1C7F3241E02720F494ACAD4A056D47EE1671FC6CFA66FF4DEC56E71CD16A6797DE5F16F8DF1B1094339283E70E2DE46ABA350F3D3E9190B67FE5548A3F04222945166CA5574E0EFB61683967E2173EBF727C619B5B29594DCF5F78FAC685542E6F59A2F7C03E136B2614DCD55828D368A69418C3A287CE1BBD1FD6F7D61434DB140AF8897546FF3469F675464D83F4A68B1054316D918CE88A873AA1671C9512DF00C14E2F4AF35F95E45AAC1287CD392A2F6BC5C0036E827D10FEED0C5DCC4C6162674DC2A677411DF49B8937E0D602BA017737B0CF51DC913ED01F4B055338170D4BAF207F7783B82AA8CB67E44B9D3AFC320BE5949C91118ABB83D658F617A162722A9426E23B89F47F86278674ADF332E44FD348538370B99D95C3F4AC6034902A04722008131AF781F01416698B150E8FA473A644590FEEB9DB884C7795471F51975B703AD329D135DBC6626E594F127FB56508ED8D4BD0F583662D8ACE7FEBA8F5C4D22FA5D3BC7AA2716992AC805F8B76CCC2303F31C44B8B7AB76CFC46675CDBB978957DE3DAE1A88D4B1BE23D480307A21401BCBB69C30087A32B1B4F7E5B0A0CB7F307CA0E92F2E087B1E6A8684D31B4655932659F2050B494F53FAEC5590FEF10D58655FB3C94820FDB33B7DC571E56F967EA2429A56D97A253351852431B2EA2F79893C7DCB928C5AF55C3EC98D73DD7E9B55E6EEAC66B68EFB2A7067B2FCCC00515E5BF8B8F1DAEC25E7950AAAA0A7BF841688EBDC0B7302C2AD82911214A808902E782F27D4B5A97AFAB8B4C1BBE44A82C0E3AC73D03445EB59260B7F39DA014F9C6A7C387897AF50EF60D142BE3116C9381E4130FB94BFEA2243CEBEBA3A4120B765354168020A39345B847F63032D181F32371B88C05407BA821634C8F096A52FB08B490BC561361417FCA00030871F16B69F78032597E7113D86D5FBD56043B4EF5FA277E40C49D1010760D3A4077A0AF71E02511EA1FA189427DE3E9B3A4EB7A8EB10E0D4A732BA55A7021E27136D261CCB04B76DF2964D5589D3BC3E0B45C6C8B92AC8E699264FDB580B77AFDBF180BAA821C0358759B654D39B4AC3867C4A613B557DF8A44F83A4B4EC05E72E9D799852F185E97591316F646402FDEB8C54DBB106648673881658AE1B70AB43CF264611A26084F660EB9A141E94304C85B938973A362838F324DAEB2D3B6A20961B954DCCDC391BCFE5501ACA6264F3D61C1862481419990E0D2E8D95A9C92581798DF2FEF27FA9801CC754D61D6E80BFE7151122F7E882020C4FBFADAB86161C3A8950E471F4D39C7ED22B4CC4C2E0AE9DDDBE94B8028990FBE0F2B2CFFBE496A1389B840DAC4DE23174B425BD454D395F010FDDC7816437FFBFE8810220DC72FD849B8C276C90F18FCC53335E63D3B6A3B953CEEC06CF2FC463944DC3BCE010A8313828A9B111F2601E4E0B3E20E99BEC31DD48CD1D86E6C57BC7C3C8533DC2EC429B1D3BAB0CF297615EDDC8C3E1A38A086181EF97439ABA41633DF95E2A1CE07B1EFB95DC503124EAA16BBEB92DF18A1449CFE1ABE354FF0052FA47DF09493731ED4DB4F61DADA8306CF4E5E7DC011361A3D5145A3B4487B9FC957965E955E168247CCBE04C94069C27A14EFE7F172451D6D62B2434DD0698B5FAF98834325707137DB35F3523251FCE88329A05994AE561178F133ABD335776233A519A8E57E55A37DAF153C52CA3A10B65ACAA7C931CB004171CA333DC564A6BE901F8D38530204D3FCDCE49919BFAEB622F4786AD09901DA186773B32166B74A6F7EC1AAADD86258C5D3CD55E66727B21C7D1AD1EC3BEDF71EB31FEC8E50B195249A299BFD030849921FA5FCCBABF3B13FC197A44BE65E3390CA8CFAB976C9742137314C3D8CB51974D13ECC96F12B72BF6DACCDB90D4A3D3BF60A32760E901B5630DA947AA773B30B7E2F7AA7919D9F9F1A3A4BC9FBBB14EDF310478182A265402276651696F717F9F9C13BDDCF95AA586B935CD344525B75C6A786972C3189DBC939841B378908222351CF3980361D5E66EE16EF +MD = 3C76BD111DB7DDCA9F337446D4DF4AC95A1E62DBD0613D90423E17AC93EAFD76 + +Count = 11 +Msg = 19606473 +MD = 1F6B86FE6038F37AE51CCCB61C24FC99F0E3FF410E9EDA8645A605DA546B3FD2 + +Count = 12 +Msg = E39D6EC3991156ED067F7682C777D0B42ABF62E27777BD3C8917776EB955E587A2615D69A1794283C1E03782D09B5869364C7DED2F674B6CDF31398199E733B09AEFE0651A6612B07DDF2197403B6CEEBE0E386DD8F7573A16F08A703FC0E9D9AC86E8E1BBF24FCF3ACC705046B42CA4C54BC28BAEC6D8A297A54F29DCA270BDF547EAB9538A33CCBF68320B8706F362C4E5AAF4FD5E2BE6AD454915A326F3985BB35BFEC972503A18F6CC4693CD1A90B1EC64F6F77CBF961C030C0D411D2899749AAFD4ABF49851956FDB0692E453E02AB863B6C1FDA0 +MD = 404AC84DFC4E8B4F4ED80CBC0715360B0D21365F2FAEC828BD35281B76728F68 + +Count = 13 +Msg = E60A +MD = 1BC305F51817EC558B3B6E3308F7DED33C05E454F7BE4FBA27B4C07BFDB8C222 + +Count = 14 +Msg = 59095209AD1282F8137DDC1017EDD52DFAFA5AE6CC5A0B3E21877F09C4C484B39043314411B5E3A5096AC466D0B583CF7CC4A3F435B920FFFE13E7259378334EF9297FD4BB911C4516B5DC6295A46E6C04AF8D0021907ED6223245FDCDBD119136756DA735AE14EAA85EDE7FDDBD695AA57B21E4EB332D68AAA9B1884B1E7758A44B2B2036C636569BA258C3B1FEF965C9EB58529C2DA5034804FC8CFC8B9E89E785DB91924823DE45CA4849DA69B7ACB04CBF60C524BB77A628D831CAA9591003CEDC2C2267D281C8790CD2E45C28DE4D50DCAFCC3EC3C2C964EB6A6FF1149B7138460C8D8B89487A3E984C18E99249FFF9E479CDA944C40A1A62BE7C6811D6657061AC161C51C2C693358DA677A9E0D2A16A750D9ACEC7F381017228CBCC112CC1E6A788E633E3A821B33A73B61E927082EBDAFE9BC9CAA299B8941ADE99FBC72460E5900257EC6E86CDEBE793533D636E02A6DFF11391F71C04EE2D9EC9C988B8724F5538026D2AFF6C77CDDEE30E467A31ABDCF31BD611CFED74FD68BECFBD03632E2104E72A6C947BDF849CC31939F5A8B36D1DED959C9C3E864B8D70C2419DB9CA7BB4ED4292063E48773B51740BD33B08BF0B61A016CE9284C561DFDE24B99EE7E2F99E8407662066DEA41D614BC97A77526702363B19B3AD22697C31275F24BD9D6A911135B60059EBFBC172B03139FCE6678CBCB767ABC946F1629EEAEE3E7E8060C3E03769419B67A94B405741FDF12F804BC0D3670635BEC7CB4453616EFCBC42F14F6D58C47D25F0550D1C6B7205F4716F6AA37EAB19598D226F9DFD48053A4E83144FAD83D7BBCD9AE212F8195255C650E2F204593E97D8F6DF3554DF28A850D3CDE85DB546ED98AED5E4C8076173D01AD7AC651236F5457D77B6A4A166ED7139C1254C6AF81109F45A55835ACED1956B653A087C423D9DD7A3DF3D9049F647E7728E453B266621C5A271B8E072EAAFA521383B2CE5F5F7848775C618D379AA630D9BE73F8C5945FF1842D9D185BD65B830986E11BB1B027D97C0B4B19F09F228C654D2D6036F19C8F23B13A21B25FFCA100EE73B0B99A8F2996AA7CBA493600F50B10A30EA8EB4C17EA51E7F07606272C1E9A19022B71D2DACE03D99C84D235FDB04516A1ACEE0815926BC657A28EA3907350ABBF2D0EC9893DD840A511BF83082BFA4030EF857F2092036FBFAB7B384F503919343686D0B17B8D63D4AD62F3D2D8CE3BB84E72A0FDD18B2D199F19EDB2A00144D8A65ED195299EB55211AA733F0F8CE6ED4F8FF0ED981B52BB69B71261AFA134AC2E1B3C89FC968EBFBD5EEC3707FE0A02230073100057408AFC163B627C43A26065D710F4505CE0A8F14130393F2BA37BAD103EAF3E14ABC6CAA18DD66B1C3369BC7BC130DD15B1D61FDA2EBF27175BD072CFC55C050332512B4A29AEDF1A3DD50DC68CB35A729E876E688F53F5ECAFA345AD639B56E754A949700592EC02F7059C49A1509AA885F0313DFDAC83DE5B3E9A766921B6A28E2661D369DA6CFBAB5B6189C7AC4B4F189D27636A18E9B8257B14C70865A9C54EF9CB8AFEB74EBB833592923AFA06BEF34B6DCC0A5338753CA9BDEEB5A5F335B1AC3ADDD0B050615E7BD02476578D2B6465C3BD07DDCAFBB1564E44F95FF5ED426CD09ECF38DE42FB0C7D9E7313FEE52C927A5FD2463DE3E14F1C8A620B67FE75E2D20976EE6C3B8780B20B602C78AD57692866E5A61B0C3EFCBD801C53D0FFA48F289031F57E3E364EC841842273B4C67F3308D2F108CFC7D5DA7A30DC1F23BFC256D0F3D87B61FAEA20A6DDD9780C78F8B9AD20C81CA37658D85C1AF3FD5A2F9481C1CBA2B0EE03D11DE8C061E1EE5DDDF138226202F7A5B35AAB001F46F6ECD6774947B630D637CBA94FBA23D31466EA0E4CF2C527BD819A1C184815EDE48A16FBF9FAA896A79D2AF066C8B33D71D04634261109F427AEB9B7BD9A288E21EDB4C59337E929CE4356AFD7C4C0F4CE5CAA3801D1B7D38022C44B30F0E90D749CDE8903FDAA49F72C75D2BA5A1C62EDC4E950EFE08C4025E1357063ADF8DD6A493B4AE637E0D0A26040E56BE5293606615D6C07881D84008E6322B839E64933A878611ED17CA5E418AE8F9FA6E430B80F69F2408CC5D23BA73A67D4BE187879F7A1C36CB81734E4B787FED99DF4699A226AA8CFE408A6D2A635779714C125F03605A7F520D40FF8351D9904C6F89DB2D0CDB2436FA895FF0AE0C672AF9DDFE6520EA3884C64795E6AB09AC67FA20BAD97B4B6471EE2808D7FB8FA300D8D58974DA2A2C84515667C5463E8BF1DCF7F58D518EAEAE788D77F7E2618936A4940DD67F388CCFF4358825E49F2BAF9D16FA039A15AF4A26DBFB4DB334A2EFCC3021B130B472A46A25991C0589CAD961C75ACB67869C8EE5C3AFA33C3F1CBF929858B37E797FE8A45698747C92449D1122EBECD9D788459492CC6D04CE672B09D9896C30175BE747722611EE2811527E12921A5330E6BB10121EEBAD12E3D6EE6D6AA309D86DFAC603A467B177576B8179EFF23B4CD7D9F2CE5C1DF86F3A358F502280BD6E48A6A498544F8C7F0A98BBB36A3322F09AA29591B03B7B4F0156C96ED76055D6AE1231494DA3F8874C73C4C462450507139EB680EB2BBE0D2A5496FD861DA7A943E4045702D9A3F7A90E443C77B7EDBC51C15B39AAD5EB8254231EF80CFB002FCC1A807E40AD0539FABED6DDE781957367DAACC4C26DFE6EF88203DEBAAAEBAE0D15705C366F7CA3BC213EEBFE0E9BD38DAB91324F3C6C5E1B1286BEAA267E50D327CFD110393CF75D0808A12E136FE9E62F500F19B85FD1A9114124E9BDF996A2EE18D73EC9C2546E99D44633CB3008A39CD77AD56F361AC8FE28FF +MD = A1D99DA7EDA7C79EC52838EC33417286AD5F36B7D7040698B78511C5260B0CC3 + diff --git a/kats/ascon_xof128.acvp.kat b/kats/ascon_xof128.acvp.kat new file mode 100644 index 0000000..91f1248 --- /dev/null +++ b/kats/ascon_xof128.acvp.kat @@ -0,0 +1,44 @@ +Count = 1 +Msg = F25ACCFDDCCB00A156DAFE6F62198EC1 +MD = AF4289E22F3AA157EF5634626528133745C6EAB371E28CD0662B3651663DC28DE458923FDCA813852A32BE5B0A2B1D69BE61B9C1BE6D4711C739FF7AEF7380B689FF790AF007E9EC8F0854CE8871EC92DFC450CA3E655EF64C79E8FD4A986E9941CFFA7EC0B27494791CF99D9190D4C641DDEBEAF09283EF4278ED258B53665B2AA87E685EDA75EC899776C7BDF61578E8F43422165745C5A0B24C5D4E7F4AB7F90CEA6C8F5B49A8ABD4858A1C88ED2748DD1E87C42C58812E82ABBF91D8E2D942E32655366B7E8AA16A985CC7569CDC78FD20D843E7D20850650DBC07665F523197B738B81F7414133142E66F9B7ED29B5DD57DA2413D29AE3955F477E8EF735BFD5C985732EC3BC51E03BF0332D85F56A2123E9D8A5BA79A3A115EF4E03FEEFEC64775232BB751ADEC0577EAE5416DDA784B188E1164BD2CDB30F71079D629EF0E15A863BE2A07B9FD42B544CA4242E2B588D25333799EC08203A7452888F3F970980FE42C9670CB9882921A5B10ED6B2DF65749C8AF971BA58CF3D2F0BF042C7D114BF78D4166AF844EA0C1844C57C574804FC7D1F9E9686474B9AAFC6C04A998F0DF8732DF4572B37A39810185029FB4BC0D57349A10E826E50EC59BCDE0D5A0D3F254E74B3CEA2CEA50415C06DDDB8D2FC1363BD1B08E4FBFA253EE5A2CEDB49294798E718A63F377164F53F85881263AE31D8196F9C5BB1AD65B1A4CE73C82A390081E5D58C8B835A6CC1023A17C08101ED2FEF82AB43EE131EE279F0C2C22FB2B82FAA48BFC63A1488F057299EB1144C702019BD73E3A1533B5067CC487E1B4B6C5930B427FB4BD22AA9E6C2FD51234CF33520B0C9DF5497267EE701DF5DD01772E33728606883109DD8D707D68809165E60DE1126003B8F0D9419E49CD050EC2F2547CA1DE8C7EEC1C4F316561684A076C1C1A6B54D3C3776578A0A99D0A94741F548D63B010030D72B3A3602B5AF56289C82976DEB8DED543D0E459C7F7C44D97599889306D2BC42BDE9A7FC9B039FB28C6204445330E97B8C160D7E23DB0C497F4760271BD30B958433E9687CCCECC30DF21615BB415F7096D49B6F6842D35233894EAA289B6DA9D61DF7A5F27B6083A63E595A8A55834DD86B529843E67B61FAEE07DC51734D451321DFF6FA75865BF87DDFE94D5F73896BCBD3FBF40B9726E3993AED387BC8B31875E1B5F8560C5CD4856D7A062A7A40B29231FA23AF3AA775E5C2F0DB9E5D74CA782D69DB43CC014234D428920958247596A2747506771848C84D582DC739C8AF631F7219E537B1FAD93ADA7C6DB5814F6BA1C9AF0B72BDA4D4C9C2D778DA420DE2049AD875EB4F03C73E72E78236A57188FC75CEABA2F2EE53B385AB4FB54A96EB31DD78E62CEE84DBEA697EC77687EC438EF37BBC06FA48EA2AD90AF05ED3320BC0EBB43CC32C090BD761660CF64A76A7352AC940FDCB3005F77DBBEA5453E5A908F9609D8677B2AA2AC7668E87B47C6E6B62AFB218FFFC43DA5757FE825F15E911637B9945CA7C717FECBF72A9D79A16930CA0CF7EED07C2F26ADB0079B970EA1101DDAA76B41B5FCE12D6825C9835D15A3AB043A4719D789DBA73252ACD4069B32243CFB471957E30D646DA119CCC1F1039370F29CA5039D034252672F4A04F62BCC40553B2FF1268F9BC39090B21D204A2C8CDBBD70BDAC96B834D0B612016680A027D40C4DE155CC844C7E5371403E5F64837950C081BFEB663654A0CDE1B16A530A1FAD81341766BD384B362B49A1C8A1227F8BEB01EDEC51BFAC61B89C5CD4BEBE9E50B05A1F9A4E9B5CAF63EEF5D0A014323FAEF1EDC7AE0424FE1F652275D3DADCD7658FB489D50A654ABCE101F3F2D03512F0BC648190FFEA65254C8146C4CA96440E0293B550AC0EBCDC60226EC684771C50AB0EEC185DFF1EFB0E53758F13CE9566EEF90CE3CFB9D35934AE381C1BF9C327B65746F5B86F7E64E14EEA90D390E673A34BDDDD419CDBFCD44523DF050028A64BAC2E9E52167816D464FAA51C1574B2CA5770A3A3388BC95894B70B5989B520D323EB6AA7BBA5A7DA93D7169E4542881D09354EA66F4CD2A0865FCAD991BD8B166A96AC301146DEA683B594E62B96009DA930C7BA0949CB33E39718395C9CFB0DC692C4904A65E52AE96EE93F21CEB7326149AD4A345721013E2BDA1401F78F5F1AAAC41479755495B43192298B2CB5A5E3DA01F6E15BEEF2A56286CB2C192AD8844BA81D7BF773181003ED7DDFE0A002798C18BDE25E95C7985B2639393888CD2CDA4412770B63DB8D8F2080BF1E217418ADB1B9752D9234C2CD4B80D88058E5AA23933079FED9F7D2047A620A95B294AD2C1E77F9633558BFB07AA011E712B90935C9429E64B2594612D648113C9FC8B59BC31DFC27EA2C213828444CB183A80BFB462A1129F429E4EC7F69506C3826D3C4D5063738DB9A4C03AB2EB927C567E2BFBAD362A45E736DB1812E8834893FAD4B6259B35FCC4C86E34481F5BF0098E90BC013C4F093A04FE09B5917026B805B433B89B6FB06D23F1454750438392541987BBCC59E3894B4661F64ADEC1A955614643F0B0A1462BDD13F033DBB03BD5EDB86278CB34684CD1103FEE2E0B40E14A19AD2283A35DEA385A07955A054CF099393D738E48473C19237C2FB77FCA65DC504378C9EF98CCDF48F8009AB7FC7FE2E3E26C831C8B9F7F9C4C3457B21B25BDD54F7606A94DCE498BB6A76F0A122DFDA66F015257E14E5D4FC5A084BD2B79546E7622E6FF37C1B2D7BC593EDF2077F825697495C92A1E6109C46E28A4B46FBCAB521336553A309CA2FB1FECDD53D400FB2F459254A9E4969DE5037C5931C09D7C503AE07D5FA12D3ACA35D47D86522C061818F20F999A238E6F0841B045B2DF02A505D50D66F73A237A1F6E2AC4B83BE7BD80500F4720B38F084A10DE449C3DB2157F3D80C60A81F1443D3C1EBEB82BD002DBB5FAD9AEE3304BD28FD855DA39CEDCB1BB874457BDB267046196390F5179AFE26B0B1F720158E7FC6131ECF70CE42D0693F7C909D2BD8F3A0035BC1B42804963F2BDBAFEA4E5B2BD567B7CE7A218AD06582F5118787B0E85CFDBC036F378EC96A98569B58F4F38B8AED9EC3E4E69D72C64B6D319A45283438E4EC4FE8647033B6B53D52CBE4CB925BF530146BEC3A7E646B9888FAC6DF7155F1C2731D0F6C738DEDC3CF22D25B4B2D2F4AF6930E78B537388A371EA1374AC2CAE146A00D5875A7FD51371621BDDE177302F0E67319000686C8B73C36FB63BC337B8133030BB4B127853F48A184B5A118E3D3FE15234A58220BCEA57C1ED18C43C97392DEE468AF38A04A25BA3E3D2EE79B5686DA926BD1E917B2C521DAA60656C4068F62F4887D83459D3966D4D22A89B7C67BE15E27BFF50D606C6877099EF6BB104F0CFF98031CB8716B2A1DBFE25E01A51240DF7652E9DC46464FC25161C48F7CA1922CA261E6B2943518B1487F4BC34B52EC03DD2EB392EA8E05BA0E1920CCF0CF287DD356D28F31DD08317BC69F09B8F4B1E9CA6F4FE8ECFA9E09CB708BA60E5780B062304DA41E38E3F3FA29FDB49C42690454EB4533BE2463BAD84F3D8E5885DD8CA692FAA8E66B9BC7DD7AB6C21221E951A44595A53EF3E0AF0F85DFDE1827610891214626FF8733893B15B4E5AA31CFE7F0C91B630899656DE3F88E6D1F22896AC7944F50E175C068AE83099F15BFEDEA0D07FDBBFCEFC4F8624E9C184EA53B151104B628FD18148716ED130C92B57F20F8D56BBEB32B78BF97EE38B122E0BD11C7623D6A372860FF3E750C720E15C1DB7F911C60C9E1CAA176E056D66E9EE2CD6144E6E77840262B54D33C11E5BB36CB4B004F1141AF6D34698EC71763EB71AE6079F2692CC70DCD360370AE403C7D4C532E5F38B22C226AF3F275DFAEFE25B492F9D6BB10666FA6D16B9FAB2967F6F35290C590569AD046060CFDC74E022C034C8EB6CDA94BB05C65DA6D9C0D7D016F96CA94346F4D2263BDEB71A0ACD907AF8D8C9DAA2236D0891A6E8DDA9D33ECAD661790A569D9CECED82A066F396D61E8438B297976901DD1D9A6908349A62A4AEA8AADF7A68900D7A6B21B91620ACEF9C5DC9970379DCB196B1120DD37767EE94008231ED7A55D1803DAD96EE9B2805D0E0720594347C00C38C01DACF27E988846B7BF5B10737814269B5A658DDA05D9BC5B7A448A5E5B11ED3B46BB81FCE4AFAD8B0AF3446E615D868644698BC2918CCDADCA38CAA2188915BDF25F81921582A00E8CA9C4A8F5DABAA7E0C5724119C98C22EEB50925BD4A46F7D44324276F1C973424F6E7228DBA6C57C47B3C65D14A7E71040A8DD97C97FE76F671DE9410D065352C33CD826779D858967FA98CC7C27CD904991C2B100AAEDE4781192B185EE519AA572A3EFF5910293451EDD522EEEFE8B225D6341A9FA81F12D830FFCB6ACA9FD025E9B8003E3170BBBDC8EFCBCA10B0CF23335DDA1DD5A13865D1706E4E5EB52D019F6E0F7833228CA2B385DFE50294E4A337DE57424C9559B0624C7DE11CD2EE9B69170CA6FEF1AF701300BAFEBA0BED44EC450F7D36CA9E398E8A68A904ED2204060D0F26DCA6EF09127FDA36A6105B2CE3D2C961683AEE2CE920E30431F45502024E04FE602C9F600E4CB4358C9F04135C3583C1CC05E79564BAA5331FC8E85F364A07AB3A108CAD5C9AF770506BB4F729B6A8E838D29014E2FD1C14FC3F00F958FD0E925BE034DCA8331EE91DB06CFE6E43CA4D1ABBECE8639B572E342AD4FA41296297707C77501060B13A0533656CA37F7B83170C810C4B598B65B012F23B801501B42A7229ACB1667B2E25C3CB3A7DC128742DF3F6F953CDE38573FF266CBEDD217883BAF417CF38D8A739A129DB34C507B5C8B4C3E7EE6F10525B4E67D7961D112BE3DB57AB11F3EAE346CC3E4EC4946171E13C87CBE728CB630E835E3D592B4D971261BA39182FCAC4FE8380866F27CBA2689E648D77B2E15B2DF0C49D4FAFD40E6B7F111769CF67B72BA3F10620753CD5D27EB8390B01DC4C0DE21AEB3AB760671C519E425FE09450722ABA0581B6DD696D4F81BFE2E058588543433DCC573592D06E7DE848FBF1366E721C8B6F0E42A744FE5947D8930C09D2AD0CA36F81BBECEF1CE86F462C669B9D2837C9EEC0117F75B4185107F03AAE83DC79A15242F67FE01AFA1B628C4534700C36A1B289AEB054273C868DD9B4296AB8EAAFD74F3D922F4279F0E1E76A7E04E9DF5F94BDB086ED1C8C32F948370E396D285B0EF6A6052BCC028E026E948DF2E0F836E960688E9900443766149760A0D85AAA6C22ECF0C1C9E4D1C4714F6A2C584DE8F0737DDAFB52428CD829CDE56B71C584DE6CBFB0CDCDBFCB7387EB29BDE2B7BFC2A1A7DBE2803EB88427A0F65B21665AA66DDD6D761921F007BA2D437A2FD803826BF3111D64AB038290BB6487BAF80C36EEA2F1EDB1307D8C7D8C79F2BF831D1D898AF28E4E295E0D5A64B7E7E894F90734EBF58764DD096126B5B553DE17ABD41FC28ACC87778E9B220D40655C50991230D1E450566A312F1CACCEAB60E64FA527ABB0C1F30B86385DFFEFDB250D1D1CB355C51E7B95E937D460C464A7865B7686FCE015F71C7F01807CC2FAAA1073C609511D7A225C88847D7BEE74C37FD5414728F2DF98594B4B0EB67ED16D9A6CD21566F0A4D3FD508F6358ADCA5C2799BECBEC256F30753A8140D330A7567F9507E9303FD6E7B731F3B80BEDD88D3CCBDAEC2BCA699465C9DC0A01FDA1CF2B3F3261BA48C4542375CC667A741D416ECC3F3F22B94969A634D5BE5F1BC45D1E35E2D1BCBB14163851ADC70A0AD7139F73F070D7D5AB9055F541E90D6B2B26E3BCD5B8B6F7478BA2F2B4605476F71C6986A30CD30466C25122AA01BBEF02576B546CBA5F440B06438EE7DA01A8F368AB4D66FA335F74DAB3604B406CD1225340405226A690B89F7593CB67052466C8DD4718D18CD4FFAFEFF9F02D0A84D1B273FA3AEFFA319009270390877725F4D09DADEADBA875B5B462E9F42CB6267B0EDAACCD13B9B470DE5037A64C6C81A7F3FC5469F73C8F8D09F17D6C436569331882A2787335E2576A123F137EBD5A6926B02DBE621E7C6C62AC6490D1F4AFC1B1DD4D42D2BC39E56D09D3A92C2E6DD9BAC2D37C9AAEC02CBFB2B0872688CAA82F681D698541AF521A360E00FFE4006F39F9DFE90F9069C155E3910C33EA3235CCAFAB7AD3554936E62FA51A0A4B3CA6F38E8EB62CDAB5AF617DD58791CD44A7863330E3A40F3FDFD75CF448C10AE369E5DA7662E00F5AD23F064077B9894B3D4334562B486D942F40BF89DA5440051AD823CAFEA50B5228CC78F1EEB0315E5C1BA7691B2C323AE2052696D2CF54043EFB13B1AC5B8166A841EBF3499D8C67ACC71076800F3C03037DE7800C7D50A8C811AAB18FC47774E9F2B0C909673121E76F85590EB1A4409BA916D690F4EDEBECF9DE6C0F7C04E9B52C3FA80B8E5F4BAC39216E98704D065FB4CE2CE97A098D7567CF16D8D9E5F3ADFA3CD9211C4A03C8A6E7E769740C1182F026107105101501D46D23F698122B58A84B8C923C0761410A7F1F772026B757432A80C5DDA660D7FC4F9AF381873879A27BD699C4A519E9B80F43EBE5B1AEFD6663D583CC590DF5BF1537FD1905E468E96952F7CBB766EBA91E6597EB2FDB6BC4ACE4F9638C69731B0B765BA24D6C162D3D73ED949069A74158FC23178BBBE5D203F9C6C41CF447FF2DC19C214F474DA1877E2C55869107C9235CEEF9365341BD5CF69B9E3515A71BA4309F6F24B8AD1680E1728807217FDA04CD3E3E58EEFBB65490ACC7CC0CB2677F27E26D909433023D65EC3A2A243D11408394444564D127AB245D2B5AE0F9CFE2D536C0706FB9DF1C1BD7BE3CA3B37153A81443D0B3A3C9F909747688554393EB26EBD2F3B9B6BE152E1365E529054F21C411FDC60413571669026D46F44FAB2FE15D40DED63D5FD7769193C7C4124FA7962D213A00DE67F203DF9D6B7C41469BB38D9A4939A3D0716C9CEDC860A93EAA65E4DFC90E36D7C68E02E94544CC4D5DA980DB55FF435F674975AD17F5A0AAB9F89AD7E336F7F94360F078F12902DD3668E571BD712235F22A1D5A5BFE6F6024544B3A076504EB10F093F7FB429EAD16DCDAD44EF8A1A6EA7B88ABFD04D0CB6364FBD51B14697BD469DFB01279AC62CD03B7891582D586E571C55663F9DDFFF7AC350223642424EF9408A622B6B95704261306CA77CE67DEFA62BF2E2C8A6D54A86C9E6033C00037616416212A5F0BB9F297B807838E11E3EC5F1684067742A2AABAEAA0C10064659C0ED9D08C41FFDF70191EFB3A8A857D370094D8AF4A6287B642BA8C7306A240E12E22F4611C9E043C88B7F2892A1ACFF81EFE810E42CEA464D9DFB9EF9FB2287ADFC33432FF44A683A011A134848ACFCD04BED56410E7D588FC9159209DA31BEFF8A829A5A6DE37B768E2E72531B4C926004BF477C7EFE8A0D2194359B2257C73D2BC5C1767E6A66B1FB692A814CA5B57ED8445AF7B23D48C9C353726EF43862444FA40E58A6F67B962A8A395AB3E2967D4564362E1AF264A07DA332A30F1DFE554913AB9234573EDFD4F4E4C8A5745911A3DD8DF2193802D9DB87E34A747F5D6D7777F0E5B0EAFD125BEBEC4BA07A1F561709E8A9592F0AFE3FD11A55663A0DD22A95A83FFFB6BF2716F31E18C18D6C03995E1C8A8D36328B74C34DE78C84DA23435AE7FAA77B21AEFED0CC7803AD484E7A81DEE0F0E3F6BAC1263FD9B2282C3A6C9FD2DFBAD34999414DFAF7011A5F2AE1E45ADE67D447F6279826DA1385B19091B0A540F2F179E3D77DE00575F44B56C14CC74DA76A51ED77B1C2513CB26B1F499EF4768158159A310AC3726C6D02A6A52A591AF3613A227E089029866C967DBE2B758C25BA342B8F8FE62E62EBE075BAA6B0395ED348BDC38AC680E76C6F828F3C294DAA604852D714A506232661F5ED4C433C647D498E686A7E6F18B99F50D69E15B7FCB5DD907569FCB45B89D982740ED715C74AF8DF612A969DFB202AD270E992BD0D8D309B7E5F96B1CABE71332B742627E6C67FB9BB5EDFF0463A25544E61C3C3A3A78CF4CD6A253A27C7A15FF1E7375723E7E3D0F581C94F0EFAA76556B9F71A517337D30C3BCE854BF76467AACEE9A805CC45209FAC29A5A454567BCB8BE4069C68CD0450E1565416EF19D3C1B100FEFAB49CA7961E7F3897031A6BC44D69B3D0160BB78CB85629003C657AB0B8BD95E83CF3CD233381E1E05F5572FF13D7388C891330D62F502FC258683F9 + +Count = 2 +Msg = +MD = 473D5E6164F58B39DFD84AACDB8AE42EC2D91FED33388EE0D960D9B3993295C6AD77855A5D3B13FE6AD9E6098988373AF7D0956D05A8F1665D2C67D1A3AD10FF8966B6F247CF481522575094EBCD7D2272C08B3F42BE30ECC8C893DEC410C953F64760984723B74AEAB4D65D0E23E7DD1498B09A8CB11BFF254FDC2CE9490316DE34A1BC19941978FC9878A9BFA3D0379C6979B902757F9AC4914B29D6E7854954EE197A385DF5EB95EA961BD288676F61CAEA6FC7B2E55C45B90602F1F1D2AA8622CB9842C70B9928D208B100820341CAEA0598C180347AB96C74AF8AACDB1652AEF430497CC627480F71E664CC83743F096C8FEBA774E039004A38C0FBE1BBA51C4D4E705FA3724DDB0C3997E324C09FACB7452FEC685129E678E550994841CE8213CF7503DCE0751A9EA01DAAD5A18B808D9C721CCD35DDAAFD8920D2627E8827CF2DB55FEC808F1759F953613CE464CE2B6F45C1B9A4857FD2AEF73C12BDCA0D5A84446F1E535AA8609B73787704A24CB9BBD88FC324CECC8BA6044831B6250B865A669D3022D217AA1A2C7B31319763A11E267AE210CFFC7D64B18D81549BDA76DCA2563BE8378F1CD663893F000AB8D0C2C9681E82089D71F75368D726D6AC4093AA459712220FB9716730A6206260612A3B0ACEE5C71F7AE168E2AB7A6E5331FE124F758AA0786E7D7293F6D7861AFFBB50A019360ABB6196C76F8EF0BEEAB6B7C3297167FF48765DA15690FF46D2441CAA75D272A49741CBBDF20977041FC496EC56E5CCA7D9284027D318654BE17572CD035A88B0C85B5DB3770F56C46B894FF165FE8A9862F9BDE7AFAB10087DED9864F9A0B1CCC81810C6F14A3DB8AC2320DB83989E7297E50480D554077C8D04A41A81062DDB9B74414D008491971CC1667A534860D8CCE349BCF4E0399987A5B414F51A46B5094773C640C433035AE24A9FAF44BA8C1372B59B72720661014A5F49EE3B9A2214B8C014DEA9109C9DDF91DD1A41831F748A1F781C90AE600E98391732A464620CDD49357EE9FDA3529AC48276433F7A4476201A04F2FF07C3174733F21463C7F0C6AF57FC23CCED53EF55D87522CB8B45845750AB7A0230883D799A1EEC7B289051D489EE10029526696FEEDAE179E678861EA790B131A9174B03A83E607EA51205264F446F9A377400CD83187902D8E22C618AC5D3980CB85A438224561D2CB31827E1B4543B051C61118E4FE1B450E193E681FB0616D7A4FE5F57C88D178720F3C9893EF0F1EFDBD5C547D61BDB248F4DDB5BB2B33F6B419A07158515CEBEDFE2108C9FA9927E3D81E9A6814864E1451FA0ED16DCEC665BEB5C81E69FEA6EC3F2FB7A571DDC49E5C603574E7045C1ACEB9333EB8D9449835920CF1342F08FCAC80DFB2963468916A8E8E69DBB16BF22F1C04E5B1AF3E69F02E0E6251C3072DCCEC5D51ACE9E203D1385CD5F1E679338F7B604569AAFA7372A3C17D6CB5D91BFB7D3DA9569A924C696C3A7AB12A5CC43D1E9ABA3F58BD6ED0FA88A6FB1E5BFC7DC1E460AE732BA0C7D02A8F7517EB7E56899F5E1D8691A417D99CC28B1752A244F1626711708A9636DE4DBF6C9934136D198FC53D164229C00B5CBF8F1386F9F80F44EA6D28251AE6FACC9F7D4CF531E49BC3E93174FCB848FA04436E7769AF742D0F872B06F583E2EBA8BBAEA40685FA6A1269E71E558F0D58B262515FB01562E24BDAFFC1D1B64A680F4EEB3BD96899384E4EDC6A8F532B3E2ABE01E3770E6DB1D242DF7A91341BDA8D9C0F8D9A08D24B5D4736186811A4F41689C4AA03B885336656670721EF786C8E2F2D863EC7CBBF69A42981755530DA3F29A0AA2268390EA0FBA6EAFBA48625D1F9C6BE209C51A1D83C426023FC871B0DBE546C272BB7D7838DD1E5B602D57207E98AD3EA8C649358A8302729EE1623F752060D98E59FDBB315E9A12FC0A2BE69072A2676D089613F40FE55BFBF8C594F20C750B881D6BF9231087484A69CC3F7B2E1235DD259DF9C2879D1563838EA2DD1D6A796F0F0881FA9E4810923CCCD58A560C0BF41C10BB640E66617FFE6C28D8CFCCEB952EE194E68D31D4BB90B6101E9D92DC5ADAA698B4D79E63A86E1E92DEE97EC102191A4916EE9DB7B6AC9263882FBC1F50B39E4D317FB5F69DEF08F9B5F7F02633CBC95AEA335E773DBB1A8802C6174FD1D9E8D969B246BD5E9CBA3E606457B38AE1172ABDBD09D2EEB3F6C500AD6C57DA84F3A62E1D2A2078386CBD84EDBF03CC96F441FC2ECDD2C45B5AB6F51FACB5F3BB32BDC7C3B1A43D5A0446433176411598C380C816BDE98163F31FB57BF433B21D380010D749B7639FBD33C7C431FA6482056A8DD5AEFA54C5FCE04048962BDB2849A13356B3E3B26A804F0F2A9F4B625A335584A8BD7A19D9EC6135F2F982D9B0363F8E85B9E27B1C9EC5567C6857D7A1804264AEB2517F0BAA5BD52D4D3E2B0DB2E99EEA6F2F77366AC2A204BBF0AD4187775835118D33C7ECA656D89C0234B2891107C5FB305D215575BE101FBF1FD9396624D5B4FC4307E28C8CB0B96C32D246D611892EABF0DC4461FA8AEC4A254B77323E2D397BC423A98BCDE7385EFF838C96BF326EBB81B18AF420A2BDACE42FF81EAAFEA8E70B9496CDD6F133098B059120A531E5ED94DD01F06799D1F89325E684D691B6859B613F9D587C615E564CC2D0AA37DF52E2E0499B638FF79E5269B5054D1E20F9C49CDF5C3027BA2E0390E97A8DE3CC7180D0C4313FCF0A9185F4FEB6680C7A9E4A396B1B4AA6088A87AF336FEBC169998610499E3242AF6E1A9A6FCE2876620154EA6E7B6BD275BAB2E002ACA88869AC0FDD796AC4AD70B7433C8B27BC6E60856A76A58D920E331E27C8F0E54E5070B801A90AA120007CE66E7F1EFD36CC11B638CFB5CF5ABAE7741D604C2113241A32A638FA6548E25CDEFDCDA3B431968C516334B93D92773DFF1015A49AF5A658CEF0B3593AC27AEC321B62A907E74F33BBE5C8395BCA3F80E83CD5C2DFE2FF34A5838A84E1FBA40FB6D2D513BD07C6D2FC5AC66AB4CA452E2B537430649FC6287F315CB866D6682A9A2F80D7E2409F2CC09352703B5BF3C4CFDA9DA5A1B1093AF324DC0E5927FBA7DF1D9941B8157B7318A88E3E5DCDAE3D66FE108955EC09DB193E0F7CAA8B9F1AAD016249F9CB7B5DDAEBACF436374A7CCC868A2DB826E88530CE5CD359319AC336240C7EBF660DC679532EFA85511C51E35836D52091B5412548B2B3DFB2EDAB231F395657FF17A3570673573F36477C7A3D8B0064613B3A9530447CE7A5252A1154BE99C6442AFD0C15FB2822E6D39D264901F01F31B81B735881AD1AEBD276495681DF9A3A9A6565A7C39EA38EA01B37D68D156E1B1AC41BB476B66633C0A334ACD5EB2D795C894CA82189BAD53D9602786FBEB5FD2535F87CA85F54B4BFD47A1853D946DF5DE396B4302DD107FD158F4E664C970D26A7B87E7109B8B9F9B871636E34183CE42C1883AB627E820CC56A4A631CA3F7171B29D9F8B2CD81C24FAA666ED50C49FE39A917EEB232A476976491D9636FA14D96C11030142684F65472C726490F36874A4AD59173CCE65A824D946CBC4FA27AD980E9A170AE89DB03038C1620B85394F769CB248FB0A8FB920F518A23277C15162B56C46B324D6F777F74F81A3106209A34948BE1EFDF115D1C4FAF9A988A23A180A3B6A85AF000AD7A86432FBA776F1EF95922A87060EA846129643297F91821621F1C13D48462F2A1AC46855D70569877793E281D4BE1996D80B8A0F5DA51297F2729C105DEE77A569FDDD111915B5BC1C45945950DA228963864506830683500BB4BEB0C7B5EDBC599D9D977AF3304D89FA2816F297D21C06558270F533959445059C1B5B6DBEBF6AE681682645F9CD4B078AA04686DA129E669C5A12346C637BBC79FF1A11DD3532429A983EA8A0E80F2CE59B2714CFD9EC92C524B3F40EC2024C6A21FE6122D0C03D330214F969C7D8FC75A79ED1A20AEBF01183C19FFCD831CBF9404EA79B92EBD9E933A321B24F0B048F333AA905D01C7BA5058CB96B8D99A6B51144764AA61C8B88540BB0F13B5A26390C52EC48353D20470391656CD1AA88870D03F737D2360EC6A959020F195A184C6E2B812A8851B87892D800B4BF8CA33CCDEF41FEDA0F266123D4412A43B62997FEEFF34E5D4F808DA2D2D755D41A0A05C181C56B9FA87B604D4DAEE16C3D56A0526CC9E115B3B23ACF94B18AECCDF94166272F79F4318641BD992ADC1B35D76D896479C77A971DD8C720419763D52C95A5F1F2074A39D265ABD0CF9DA2592A2E488AF71F8D08330721731D0CF145BD4804C5B7DB307A9531AB2965EED4B3D62F95D05AC3CD16F39E7CA40E3CF6EB1C1A8965C300EA4F48DDD0B3E5501E65F44FE9B8049C2BC7FF768C9ADFE6E0234828F26BE40751B12F4CC53CA8CFDB54812D584547C37E6FF29F281AB0EF5BB773469EE4903053F27790FB17D7A0F3CA8A6D4069092144266207C5AC491F8F205974304844B037F7335B41C788136B39AA5466A0586912A0858C94717A62277C46FC918CD81F04CA8FBACFE0C822A83AF83678884F220A702A604A96AAD8202853A27D5F1839459E6F736A903705FEDDDD63CF35BB58F5A21265EAA54AF59E27BCC66B06EFA31E4C64636FE5B0511F24E16F2D23B62B511DCD8E4B42BC5659053CBCC7EB1290C61A927F5F4E1C5E24404719805154F33ED0AEE684521473188E07B6CA59FBFBBAFE3FF9769ED13C2607869D7752E51DFE5F420970BF766398A136FEA59C4985EDC2C15DB1373ED8FB0F116D75C5D846764B3254DDC8CC3EC7A452CF91A120E36DB9505AF3060D716110354869B1671980D9C3B63A4CFA439874FF52C74D5278AF4BC41DB38ECF3901BC3D5F0AC57EBB30E94078D342089447D9F49945B12D7CF7800CDB2B216CA935C97E6EB925DDA3D1CFF0363913160802C35BD5628F92E7AEFD17557C841B9F15B6D2919204EF6F4BF74DC9BFC9F27D129CC6134B6ABBFD106D002917A946645D5B52BE0FA2DC1F3786A6309E30692E6F38961A9EE440F1DD2D59CC07E583E33A88D9020D1E8DDDB52FDC7F3882A88A374212BD166F0B2CA0FE95769BF4D4AE5C9BCB568EFF61F5EEA81BC0676A3A45F606412249AD5F318AD0F0D1A5EC26E066795DC733BDBBC15A00A16972DEBCDC554EC65F48D6D55D7155D758ECA0AA7CEA02177484FC8BCDB3C938286D250ADBC3C6575B5843D36CE1F500EC6D749AEEC452EFEDEA6AAB547002CEE6E04428956ED3568F0BB400B3EA3717B4253E95BB4BAC8F6DCD10765CE3097E0824A31F866F7A487F9F901BB60E9E6DB1E521D83D16382347C0BA7EE088A116E0382C5B6E545292F537385741FE1F7C3AF44B37B852620A5D6827E8E272C60C39D23CFBD6530DDC8F137A831A46828C177A544EF2F67879D5BA8CA971F4E870C264AB8A90513DE98915D61012EC41E65433CD75FA31ED50A60DAD5F3DA126DC8C87CF7F06B424B07A7BDA37508A93A71977A14B939C4571DA088A31736C13625D8D431E0D3E5E8640B8A0FC7ECC05AAB8A01E44DB18587D414E449D07EA6F3AB3F96708A2B320F8C320F5104DEA3BD1BAC600A22939AAAB2C9C265FCF82A5D5BF3E08F1908E2F0697B68CC0FEDAF1F6235C44ACC871B6E590570DCDB5EA77B6BC1AB245BC85B02AC3AF323578C20C7D7A5C877CB5948A589334F85B6BF43E0E123A7005B65321C8AD5280D6D5A1D85134B9E97E327690B133C1214AA894FFA274C25517ED0146A18B914B18C775FECD2F2FF75CB46BC4D1EE5679F4486A64417ADD34A2F2B6B6C5F9944AEA752C8309A2C83D9A90EE8E5C279089C8030FA47552D16285AC393CCE0D8CA4AEC78C8251FF02CF00689A58330D2CDD2A8A85E779801A14581E9EC2943BD2D3898C8CDE4C9D3C31331405AFED4A342992CE4220774531CA6DF0D967E51BCFDD7D232BB40EFA7FFBF83AEDD5831D28DC537D2A28FBF599169D3BE3374C8642FDA41FBF41CAE569FD5B2FAB041D663B9110794E1E583F957A76890DD71997A058CE1F317FDAA306693559B63C243A8B2A8C2E1D5CA0EFD04D3A7DE36DC36BA73008C7DAA54A0AE3A7FFEBFFC6BBD2DA07A16E988AC2A7CC94C0400716349A5B6C8966D429E1DC85AC58E9410B822FF6FEFDDA486D46F1A5015F62D2BB77818742A680B75926FD718CD136D69EA44A3337F0CACB09357BC334CF2EC0EE3903EA9DD99BC184A302CB27212C52FEE6DCB0B47C2F6C6D29F7B3ECC85A932C196993300B418D766E8E3F7075DC6B630FDC67DC9FD67044DCB1D8F741B645E5F33F04B66A2802DC774A487B30A74CA0F475AE483006AB1005B68875EEF165F2968C67142ED43F2751DCB8A5ACC2BD2F754AE0CFCF65D54C3494C007FEC712FFB45799EF0AB8C622EA3296B122A7706A5A2E05D914B6FB6CAEE438989B4504F9A2D23647143442D28446BB67968D258F28EDAE257EB1BBB0F4E9379CDE13FFEDE04D0455443DFC460D12436AE34CC152C8990A25D13094FAA98C19C620286FE920003E4AF509F5EB3509E8AEFE356ADCA4CA8D6CE09CEFC3DBDAF49D1C8ED4612C0083BBB853898D17B6A80E1DA1A580E50DECF3C737C566F50C0D5E36D9531087A33A604D520E29C30410851A96475CE7EFF2DC80348F1CBD42C9F5D60F3D3951CA206A1BEEC4AA18B19BAE1BC6888E257B224509E87F673133F13B053DE2096F7E9E84902C7A9E1687A752A94B459D3571074AB015F842FD99D442A9CF5D2AB6420D34687B02FE6D411280A89137E4A46013830AF487999C473B959467CE23B39A4DC9DE8E821AC7A65B273C0929E684B46D2EF397A8AFE5BE4C7DE80818EFF113B46272E3D729E49D6245CEF61729FBFABB176340BD26AE2EDBFCB75BC7457C01AFAF8E4E332ED383E77A267726B5D430135D389ED5D8B5C299BE21B68E179CCF31F6B6FBE147BB3D5B41FE01232255150B2B9BCF661FB5FA26E90703D688CBF1A2FB8080F40DDA74A0962686846EBE75ACA70D684A7F885486E1C0A0B00F44F5ECE5E9017AFBA592954DED72CFF215427E7D8D71D38AC45C6B77E04CB5710112E47FBC7F24FB50C2B53A640C5F9B0262F7E5A352457C870585D2F240EA47AF407F050CDF437BF0FF0061105651D098DC204D34B1E2485B98C518C44DA07D3894BCF1CAF31938EAA8309D16E904ECCE55B4F01810D26AB64E24CB39CCE9BB4854DBF87C53BF26928F1A47C2A1AF1C5230EA0A0B40C8AB14F01F5E5F4AE9311BCDDBE3E6E050C7C318433FAADB87AE9D9C0427CA32A45B90A0C10C7363CA527F1F4EAF64A9BBDD35013831667AD2327B008E19FF3CE7334858CEAF3FF3389A54F5C81C0F9BEC35463FD53BA56747BABE6CBD053D736A208C61E2060E03486A1C4ECA0E7BE86EEE3F249D54979477042378697CADC5BE5C914003BBDB8B5143D050192834E953717374FFAAF4FAFE28B32AEC5B72C304D8D628247FCD1CB45819EBAD6B8C6564BF187B38EA25D1BD7249685C7F7042F9C97D7DBE7973ADAD29EAB41A084463B8190C4C28B87D7F57C2E7F36AFF878ADF0B212D7D27CE5E550938CAAAE6C5265A4B3C3E95118FD98266BAFE53BE2F3C7B77660C66692475319F53C4931BA21E1D02F43D789FBD14858A3AF5D3C0F787C81A172784D15F177D04041E0426B763DD03C6471BBCDEB03C64D1F051BED50E3A4EE0BD3F62A1D27723741D7E7711DFA8D87E30E95D73F532FB98903AE3FBFED7176D3CECECAA5CA0229A530AA07FA9DB111559495576679781F125BEDAEE634D3585D8A7B4C5A1EB7CCFA828B694E685CDBE7303C10625A4383C62088D89F8FA9E965F6FDD775019AD802DF507FF1978D204BCC82B10C471876E96683E4C4944E24BEC9F4B986EE1E54CED667E5258292C8D4EB0CFA3602AFFE15ADBA45315505013743F90932FB63FC1688E0B6D7D148313A25AABDD71026840BCAEBCF3EA1E701BB638985053327CB64E5B2C4F32FE8B0FB84C0C53EAF29C9EF8DD972269E29C576BEB17DD40A51054462EA6D095C21432E77C1962991C04B03FEEA8A695AB24B167126102F23A0B44F037E1F1C6779C1661309CE64F203FAF87279CD18B696FAE8A24763F52387366213DEE436F489103BE0E4FD3D3451092AD7D731308373823C0D999849C1990BA4F95BF6869B6F338AD1455E08E0C20017F67502E6C9FCE22E0F987355C0B4CBDBDBB6F9E2285FA11D6763D49BF2DFE78D8F72EB0D189D7B3A430524A073881835DD0C536A2792B30E52FD28CD141C36646A1F7D16117FFB195A9834D6CEACECD901CB35EAEFDA41D67C9E1239BC4474A5692E404595B6951353EB3E701500DDBEF93EFC8CE92D26836757A290B543708BB4B7FB73888D8351A3D7414C39F575FC732FCD0C96D84C4901D410AFE2A086F3F700E1EF6F08E88247617508EF0E5AC097BC5E8A1B4CD6882B4CA585D0DEB0904439CB4E40E9F76CF31AC4BB6CDFC3E8327EBA81E98074B36EB37139716A5726184C45BB0A30D02D84DD5B94A18B558FB581A939143C96BBDD379DC8D13120637FDE7ABD9A0F9E19AB21768269B9E9D9D922658C09DE9CFFFDD11D1FDAE94D7B7E2987DB73A87C573DEF7D6134C7B33D78D76CF978CDB52A80AA3A16D2DB426E4FCC1BD6750102A5D85F1F930D6926F5BEB504B1217FEF478511D1AD060B01425ECC78CF1758C764F266AEA58B0018229C989D2BBF4E31E63BE17DF12037C145E753D33E490BCE10B1B7D26D9B709C2D9519DF193DA30CC9EE28F56B1AD379B9F6E9D880F8055EAADD0A61D200039DB2AA6FAFC1C84309B9170F75EA862BF0A8E613280F768C413B75FE9E49A7C3C4DEBB645921560FB459EF8C8FBA66E217966AEE3ABB2723D4025920CD9CC6D38C27D1491B463A99D7952CC44D02146E4A51147130D19800DEC288E18EA226D81EE2022FEA3BF345C85A4DFC89AF2DAFDAEF468104750AA24F7FA2ED73151ADEB7EF8EE5B91C2CD1F0009A4BDCEBF4748FD24F56037034F419304CF3DA492B599368BDC15CB10910824C28D0778ED03CB2DAA95F1817A74DC306688428D48B571A64631E9DDDFC5EF700FAB9F27C67C7FBFDD137DB0396E0036550488D8B4425140E47F618315487B573FB461F76477922093DD29AD4EC2F59351FB0CF075C09C9366AFD5992C1A03DFE5EC12465F9B5FEC5C30954866DBD081C567B8DB31BB047375B788E3D5D2B1E50E66A1A05B75FE1FE5DEF43901E7472F5047AB438C25F74AF5277FF90C97DBBD5F39F5C68BA582FEFCD2624CBBC28837E11298E9A72186FB6AD3B8C71A21D56CC057D2D25BA8E4247D99CAA173BB997C4D3B2F8EDB83B081195D92205C3C7E86414FD6D8C479CA27EE6E2786DDC345173D3643245FC6E04A95EEA93A2FC34D46EA940BE5D52BFEC16ABBD2242966AF1435BC9EDE21D2783CF3962756009CDB1820675CF717DEAD7E31D4660548E676E3035B750B272085444FCFE0F61D45AD53AF747D4302A81552B76C724C7AE97E3219188886A559CB7E1CD4091C8208B4018F5C1FD7DAA32C0A37713A925A3293451E93AC71F374C8044A2FE0ADFD05C2AD2D2B978FFA702F4AAFE39D3669B49CA000F1F0B2C1F0DE8046C9C7244A322F38790D0385E6F693D1D3260302EABA49C18488C610DA456513DF2FE01D7D04F763D94FCEFCA43D423833B413EFBFA027F3D1F9AA3CF59E0DCC2315293286DF6FC2F933FA1A26FA5D30671BFC16DE44C66A58537F3FEB57CA811311B30A58AAC061571D97F3B6A0CBD2B3587EAB63F8D37DB4EBDE95B5A9F99FEB1FF61E4D40DC8C149D79644616FED1D247F01F5C7527CAA3DD3868B04062E5E1262DAB0C67F4A4D06C6B817854C7563C4722E7F32C6DEFE1BD92693434591DDE0BE0ECD6418FB8818F2F0C4F31518B74F6669FBAC3B4B8B5FC6F6E9598A2076302A8D0D9BA5ED38760660084F09DA09BD0DA832DBD7D644F15BC3D10AF1FFEDD7305980ACFC0D48512E34810EA7D82DA466F4265D2D27 + +Count = 3 +Msg = 0D17A072 +MD = 680CE2B0CE5C4DD1BB895F4CD0F2189EF040B41DE7B934C82AD0E243534E97123F1028F9E4E7F7A60E661746604093D475614ECCC345B08242A5FF21B90E73592D52DFAC3A4618FCB7FCD08CCBC0C608E18A7DF255F84AB6977AB5C27174841B78E2AF890DB708B6DAA3FF51FC07549F69D5F880633F8487F1BE8A5C4776D4E1B6510FE29C93781E696B1CA9A67F0881A5BF24C240FB39C3209C9C0C62D0E83FA0D656FB5446F3359789F1337718492B346E196D032C8137557D96D9F4B6B7168D07D2761DC2FCEE16535CB1CCFD8F0C115C6693317762901BAB8B346BF8A3FB3C29918A7DECAFE092AE020E160B074FE5C02F45429660E0332E6D18D6D266A543C73EAB2CA14302AB8646FDAFD4253E8BBB7D7601ED1438B30A9CF05CD6BFF03D263F59824FB7646435EF3348EF2570A6FF0C2BDE3C625DF4875DFEBA8EA4D71AC11D902FA7D140DEA21491193A455C4B92639E73D95ED5116560133AC2B434CB5E16B54AECE36ACE459AAAB6CC9B51FFF3F887937AD0EDCDED3BC9AE400AE7375D680E2BA2EE46510C592553F5AFA3DAE6659AF553F49A87BC212654E5106C5F52637D49C5BD189057AF6E9ED0F70E4E13511E87EF77801B6B91B8F0DA58778B30060238AF4D05C48C30B8B66332AD667BB5E989EDEF449F4B2EF2F73F110EA8789B7F4ED635AD8637D99191C7A22949AE42C0453522DD147D559D27AF6429B221CFB464A470205B52A21240F30C0C5C5D3A61C8BD9DAAEC99B746237FE1D151F89633B2720E270405454E2A9EEA3D19F2F732973C1276292ED813AB84A55F4EDF9D7DCE02B16A705E0550C97B0532A420EE94D24145DF7F75A43DD0D7547975EEDEBFB96C62321D991F0C25FBFCB9093D0DF30B667C2964748396EC5BDD0F2268019A3629F352745AFCCE35033CA81D471C6536F2613185683F66A38D649A1DECF7046E707B6CCAA4D63D6A5DC3C13A5B50547B73272DFE8DEC3FFF527BC6BE3E0875CD4A2D186B98BE35F228060FB70A9B67FE123FB322F27DE3047786E644C74950134A1E4FC42819959E0688FD6D738DE09E923170093A96D169FCE806520C66E69E97B8DB6A353234D22DA4000B1B53A74698AE690FB822ABDD95F4867FB37CE2B7F02F09588BC217642C4C6EE4C6014739F91DBA1FF023AE01BA19F6E510D3454658353E4B6735538F02EE757223AB6C0A627DB2F3CBF47B633E7F46C74F3C20350CD1E46F4215077452DF2A4D88853C59CBC16759402EF5235B645245458F0882D7C0C1C3C15AAF56E9327D68FD3AFD877AE5D935D3AD88F71CF98B80FF0EDC387698F6C08DCBC344D790C4EB0E1BB5F5CCDE5DBE2515AB60890661DCB7BAA194E502B8862E406309372AE22C21971EA04BE3372593BA0AFC486D07F9D06012AFDCF3C3ACE4B2FE6A893B2A1BB160ED2EF13722F539B6D6934817DCC79089A387F055645971B9EEA78EABF98A72854AA9E9936406D7A272DEA9D29CF7865F295E3562B85A0E375D64B0DF50676DDE0E5B101E8846C99113C119B846170CF7415B6F5D6DC7D2C1D97793B4CF05E2F607225E460A954F204BFAA7B6B70B0C1D7787FDC6C2676DDE4411B6C3B5D64CA914CAF40D23DE0825057B12D0D1B7E3A1B47C2B21799C2310B1E435184A86DAF27840BE83F380C962ED447E8771CD4E08791BA9172526A61587AA5717BF6E9810C83B501AD14CA8050E6E7EBAC016919298E95D6FDB6E4B79D9E67C7528B003D432F6C81F9C7928701AC790120996F2521B71CDE634409EF2B9D6A8C0D9EFB7C20B5260C53B3BEF89DBAA8858C6719D0F4378D9B4D0FCB3E85F8039D97D2D389F176C2B522C1B12B08DF6D692B10652D37F50F05C06242F677CD587C1B94B82DEBA7173450AA11B2D0E4853522543648E1A62FCA7B8C81396DC650EB7ECBBA7CF6D14D9B83BB42DED3E94B79266A9499084DF5C36AAEC77AEB707FBAD5B3443D1304CF42AB6228CF15581E1F5E1F696658FBAA4864815E9FF5E57235B58C20D676B69BA8DB996F99C24D79B8CDF740E1EBC9497671246724DF83FEC86797DD04D7449588C58964C266ADFD0F5D2EF5E4D077DDDFF9D131F6951C576D370540CB1E69EB9487934838F91F2D92689DBEEE03A0F684EAE65B0734E782FE26A6C1CB5266756BE37EBF03A3AB6E09A643EB22F989E2E561F23AE848FE9891BC96BD1064E08A2EF19D13FEBF0EEFF340323C14038324FD3D97F3227CB912F4A1BF7636E3BCF98029CE9571E21FD9D9F1AC3EA154AC9FB790813BEDEE8EBA1CB1E45D7CAB48CA7E95C9F9FA0F840DB5A85C278DCDD1F1C6E44F9B988317B4F5D1CA74B3EC41B98E66184D78986A1D26927D75107547B683B6527399BEF93A7EDC7E4E98338375BE7970416287888612FC6D31AA42176CA69A2127DAC35B517D424EED507AEB6BEBFF883753D138D6F7B8794CBE79DADFF6B72CF4EF2C05CC8573FFA0D6456F8BAEB2BDF36973AFDEA2658E3468BB14C5AB8F80C02251384B3E72A2FD50536175A68106AA2781729A69DEEB110D47ECA23F666B238BA1CD21DA5C11C5FC308A6E27F836F2A3AB349BE3F4F52F6B2B563744F33C9CB21FB2735BBBF0C073EE2A4A4116E9A8A5A77B8383DAFF3958CA7D36F9A4296CB2D16CC5BD97CA101B2D56A795C613AF46A69FA218021325D20965DFE1502CA382A069CB117A22D87B6BAFEEC50068763C96618224EE5083CC6B3C91C65230E39C6C5E3E705EF43C76621159F25EB00126C16F996869EE96EE5AF8F8D4E0D7D1CF5625C0F27B66877287CCC6CC1F60E62ACDB1B4BE62FD5C0AB186A8325C89478906F759B2894E42694D4B49A4438D7C2301329345ABCD2701063E4698FEAEA67643549FB77EA2B756CF9C9FA9F7693C59A55C0B24D123822AC8B310747FE6D0CD507858F42C5A36967EF1D05554C9E31F4ACF5CF00AE8D45B5E9CE6FB685D478BFB9D81105B0D4FA23C8787FD771117821061050E01F5EA08E7769BF829323256D8A05BEDC3195B21F530D6CB43528DD59CE60F2F7F48C5AEEF5CF05D747B6AF8B3E4356324D6AE273EF0DAFE2AEB6A2480AE7C0B74E4AC2367BDC21E5413442B09EEE4E2290AA9C56D438EF95865744C5F835487D5CDDE7AE995BA42529F5014F4FF3E7D2C5EC80B2A87848837167044901D86CD83BC74159958D3E19F2DAC184E68D914690B4C7F8915FB2C385DB485FBF3D63F5F1661C8DF7490C06817D2C9328166EB14268B3C1EBF107F0C2C0ECC32C86B1BCA238A3E0D28C6C66BEA5CD86EB6885E0D27E9F9E2D3E6857C3B4BD0D14E9693FC4E8F4AEEF8DF260E3D3783E68E69A48D4A84267027726D3202B530CAB9008F79925439642E1624DF7FDF32D8FFA67E79DAA9597BB3A0AEBE0C2A354A2A255E2040A16EA39418463DECBE1AC38146CDE34509D02E24EF1777AAB7BA20AE9C491B219BF8CF7169FF634D72F9722BC5BAB0D125912ABE768386C06CB4FB559B5107009F90D29DB3B4EA981A940E9CE0992C736AEA1BF96A9EEC161911001C7921239DC9456574A37E8CCD977300F78878061BEB9842ECF148DE8F3D1A853D01AC4058DFCF815FBF5F4B0948B79DC8CBF4A591C44AEA2A0DBF4C8D0116100F618CB1787468C35729ED243B8C1279D3DC11BF6629BF7FFAF934B4127C53864123F36CF5AC96B3F662FFB16AC855B1A27B09B9D48EBBCE06A83B8B0A62A4FBA635E449ED857F80302937D0A29B311B0E803DCD85F8874D610D92251138AD8A462D2B5516B0C05EF6256314370EC0BFFF2588A3F4DC10B0C0F0A2C704BF4B3743F9CEC8C3BD2CFA335519EEAAEE85D614954332FE0128A0B3DD68C16BFB95BF2C915B875308FB71F26799C0A821042CF089F2EE821CC0201F73DC33DD1CEEFDD4401C4D782C31D4070045E6DB21CB5567482BCBC279E22EBA2A788909FE7EF502FE07D275FCEB53F92D89BB8281E3CAFDF7EC0A97814E564F4BC0821D9C6350CA3C9D8A10FF65B69548E759D617412B355ACFD7A9339ECBBAD5DED8AC6354C6464033265F019F63D64E3721981BC22E42B286A73BB72AEFA0629688F9633A7B0A4C57CC9FC59020605BFDDDB6EE0A85906E4CF917BF26E725637F9F8CAFCFBB29D0F0D59D8311FC9F560437440C39A0E46D653C7DDA1EDAC11140E371DD8AA98228935917432C609C00C4D882018105FC05452AF154D255096B47CC5202A9A46E1832D1A0550238E8ADFAF1D878E5A66F74834956B714593B7CB2C981617E55A2FA6E98CB57C5E6A52BFD54C2CBB336C1ABDD5A1C2552F5FF7F57132BB39F45B9D5BF872066B399EDB4F998319C10993DA9B732468DF36162F19F73695A5FA2DE3FE8C6A124AC71F9E5AFDA6072E84E7F89AA17E649D66AE1A6C9D4DF195DD7BE447D69D72B607B3C1051C5000966DD4A10D3520E7883EAE16EF9A0EBA984EE9A3B79155DF3980BE4CD67794D4E012D1CE0BDB3ED70B94DAD47727E7D1A0DC90E04E853F0919BB1464EB9217412ADA106FD5F73A98EFF3CF7FF36E3AF8AFFA18F8A17F67DF1B15D0A2D12685EF9F7A16F5ABA8331619C9C8F90CFE99B2EA810C86715687B65A4202C2D3715ED3785903ED5B1AF5860E0769C8D6781636D2EBB790F4C61356544DDB81DE37404242F16D50EF8ACEC03AED584A0A1D663A4631B023C451E9E6F5ED11FC6B93326F38C914B5EA29DA52125F1D30D25D7B7E341E27BF871F164BCD25968F9FA87C48974D73A45F19CEB091CE69CA7451F9C66B951FB09736F1CF4D39502B9FCA2ED8BCDF0F651CDC760E162D1D3D4AC9F3AD2854F6018FC10A5FE5FD93397BEFA84924C9AB8D539373B42253723310C155B1AF70879229D4C78A8960C69359F9577ABCCD602683BF6C492B0353D88DA78B77E55D3714DC3486464C871245D82C0B7F8641E57EC5CE8161F2D43C6E333872B0706206903DF53AB3F4175A131AC9AD4AB4FFA607A443EABB17C7F49778ED4BE436ADEC94190354BEF905F2D6E6087A1EB8FBEA1B5A00F0656334673C56B0D2279E9353EF64C89631FB91DFEDFCA050CEC672A625C5692C8C02B794765A3DA75C97E4037A721472FC9B7BF01A6A07F2EF5826C957BCC06058D9F9190A205E96AF1C7AFC08D81DEF5C7D6913BB462E60354EB354431DA74A35A986BFC336B339EC496A37BB342B4198DAD550EC0B81C34BDC2F242EA8AF18A402BBA69F5E49F0F9069D2DB2A0EE445F6BD08EF401D4FBE0372C9E5233FADD771DF4048BB9D735C6D0690447E2AA41E13E4C01A8C250A07FDA3AA77008117A401A7BA2C7108E9F28AD8687B84F3783D9F227252C62033B78D78E6D046A9BC96E21278CD5570A844FE4672E09685ABF1C4E31D3FF080B6E3EBA63B85DF7BF7249844D92BEEF6A117B4EEC3837B540148C04650119620725B7A1446C325F99CE2BA2A7E3F6FD657AC47A8378A64222FECB1514B0E19B61CEC9FB1E16DA6E96B7DB52F04D724AAA0858A4F12BBA31DEEDE712BCF222C3B700DFEFE95A6FB800AF8AF03D2934D808E270B9861579ED1E5988810EF1DB659758D613BF41FA76D82024933C7682DB6C7E94FCF7F8C538E7B95B43D800A5816E8107B309FD0AB78929C19916CF3886447024B5D02F111C38605A36945B9F46020604910AF697FBF79E79B3702749620FF84D025115F0DD690DE01A5953AB6E27A4B068464FA77F9CE75D2CFCA449AD0C49742D19165B793B048AB8C4592048D6F69D8C3CFBAB710B2508975B39A31177121C66BFAE20BD96CC59876229D909B94D303C5980CD2C85528F949340D0690923547EEBE1A39E735BC97CB8CD75B3B12223635DBC9E9D53D97B7429A69CB4B8550182F375D7DD2ED5C66620ED32489FD9B94983DF3044B8766E4E53AF6FF9488B28704BAF8B4AA3540E662ADD41B887BA9675F00DC5A1F8D1214937B34CF2A82A9DFFD58433E14066B0775C7D4DEF8E98E64DE88F069A3CF695C1079742BE58417715BDFEFDBE1EAEC1889565B9DA4EB002382A3D25C59F76DD3B247793EDCE5067FDD23ACC26CF0A6C1EB2A88FF53042498F87F3B824C87156D52C1CAAC617642CC20C5F7ADA29C21B53A2CB67E1339C127F9BBAC1CE61B55FFC74E222B087F2BA9A1EDDD64490DDD5415CCFA813881B3EC8E453722D43A6261390EE46B4B971953E1F0E90AEF13257110FB73622B7116E78B3CB83E0174CB926FFCEF458D764971E8BD956AD80837F2B4796672DEF28F2583F6CA44598A89939115A9BDF408A63EE638F3CBE1FA996D83C06120CE9B074909B79F9183A0E5B7282EC76FD62274C9FD2DAC8959CD42F1C1DB5B3EBC57EA385188829ACD957B6B57E17139AC61DE2B817DB503E4D98188D276447DFE873C19B632B734848D7CB5FF9F574080E276792435AD691A9DD9BBEF417D295668EA8C968351E28F1D20463745A9240F5D1FC1CF2377D256611C349EB096DA3329E4A460855649D2E43ADB2794304DA4F61619252EE021E8E0306BD5895FB7CDFA03A010E71C162425F7B16055E9E53545990EE097717667D8FAAD9DFFE138C7B59579F2150201905B16FCBF9F397372943F059B097947335DFB061D5441C5E1A0AA6B08FE7F2BC506095344576D87B5448271E1566598F2E2CC8820E7284F6EFC0E6488C0841B8A56AC29A3D32338C0E783B3298E8A46A8F31BE0C7B05CD43B91825004C83CD2089829CC2369B8C9E12B9FC9D91DB4FDDE71C9198DF4457BF315128DA3C8CB6B179BC071D3290E597F6706818F2A11263A3C7FF1F1D5410EFC2E25BACAFA6B0782F4BF6C646D930112316559929B6BF14F65659BBDD0246E1259CF3F9F0725667DB5D001BB9078BE13A51565A6CEE763804E572DBE5A24348C287DFBDC9A5E0515EEBF6BFDF2D1956E3FFCA53C36532F3D40509FFB75BD864B5DB956D4F3FC64307B4D1184CE50B18DB47821C2B09DB3078D4F0FAA74965B4502046244A84A530F59739D7E4C01E9284A281693EDEFB516C700833620132CB27002536DEBF42BF4D788210E1B9B1FA3F0B5F5EBA03646CFB04B7840E53AB9E4F84C032741EC049D99A83BA17BE8B1FD73562F7CC2F2FF519C7030ACE0FE913372D65358924947661EDD82FBF9A2442C0B7EDF065A3AF6AB8280AA9D2C483200ED8F55FC46D4EE1BECE8B70B5B1050F790EE725135757CAFAA335C34A53DA9E54013D3C5143D2792B234BDE506907845ADCEC4DBED0761F1B68B6A09A28B08DDB0A36F90C698108FBCF69BAEED0BDE2FFF619E46DCD52E49A7B02E9AE2C3BCCA75A15248C9D03D8CA6299D27013AA55E0915587711D1018067BAEA9D92F094C6D33769C1EEB4F8807C74396BBE89654DED5BA1F9002F7C15576EABB4EF6C03AB7028B161CDA2775D653F9E8A08866E3C96456D9F5038B8E73478AED8CC3F399BC7FF34EFB85AEEF8F6186C3531BCF6292B21BF97DD8AAC2F0EB787CE9AA27A657CA213454B759FEBF0A5CD49B02C51850B7CA4C5A7064808432C6FB77D6D6B7BB87729718B86E09EB98D7FA281F33E5AB0C7E3BC3194684C2C4D4A649D4798BA4AAA854A50345201BF99F1545E8156D322EF5B351ADCB4850B2F26366EA4ED09478B08136D603C595C52C2F16B5CB571121D03DB6E78F337A244A215AB5680AC017EB3E397E447208D295F3A38097D0F9BDD711D2189CCD950A78A3EFF3D91E287B3635526F29EDD14A36580C9E95C282114D0529D65E4B5B197E28E042AECE759C30FA1AE64E2F6FB6CA228333217154E89E438DB489E0B49EF782833ED48307CAE06DABFFFB213FF701DFF205887D1D5106D1D632B3CD57FF52784558683B5B76B204760A604E2AE3213F64ABC79A7137BD953B00BE3CDF7A9C3A1DEB3CFA3D1FE453636E46E72DD4E66495C3201C58F42A19F0CD42FEB974D61D66AF441DA50669749F67114022D4DBE178037B1908354BE50C56FD7A6F9943C74CBF5FE65B5A888214EC14D99EF1CDE15205702BB7E086759A7D1746C176B8929B908B0F989074CA4A3433EADF7426AD02E7ED27DF475AD4251D55D4FCDB1DC6A1CE0DF103CC553BF167FF014CBC49A4265A9E3EBE2FFDE9AEC8B5022D77C2E33772529B10D16BFA2CB6232720F094B3994804B6ACB4CC907933598F8005A0BEEAE74B1D4FE5F5FD69A98AAE0BEE69DF7A9ABF35254645F68EFFC9B6BC0FD0BC78D9E2658860F768BEB5374206BCC0472DA7972165FDDB25F35D690A3B84D444390948E0F1DD77E8BD1313DCCBD7A5A043892176F9DE15E2E08136A5F55EBB1A41A7A914DA0A45760253E1BF1CEBA3F08F070B87C61E339CF7E16914D7F8D8F2BF4405A46FF3A0BCDAD2302683418E670CFB5921626A53813E36745F64C1F5009238C4DA11479E0168C6E04637EC59C48EA1C948EA7AEEA927052119A3CBEF8985835C28D64CDED1D224950503CCCFA4FE9583D3FDDEE0D14CF60D97959AA5BCE9A1C7CE43E944C55B2CA69B9B8E335E455C49A95E8E94DD7D2E4D1C7E465A6FA0D62231948F1DD313CDA009512D3C7AE025C8DB01CFB274A926BEDC97B325B8F86E745BAEB26332F6105868414DBE1C9944C93DE5FA9D5363CC0969FABD40AB200EB7E8F73D87F040016FADD14E4747612410255CB28D4F6E3A38800B9181D4AF26BADEDE8AB1AB916D3A1A7A6FD80C79256C925B15C6BA0096158811D7ADE5CCA30C121BA71961C98CDE9C25C00C68610C5C7E2F66BD430F84A114B86B70502E4113F73F517E84DC89E5CFD44CBA3200A78EC446E86A11AA0FC01A1C26AE526FB64AC5137BAE53A2957149186243B23EB4D2A68E99983DC4D999A33C0D8473AA5BBAC05AB0107C10737E2F8682BAA2864FFE0DD18E40F6A8F8C709F73516B3715C76F06A4324360959549F8657B3A789D52331B348DB79F0913D0FE9BD262F8BD06F27C623D2120D69DA4AC3ABB4C8208545FDCDC55846DD39C8B7186ABC7F48F0216A957C4FC5B6EF848D469637129A5437AC290E200D4AB4437A6E3C37D1CFD04F00803F94628070D2DC4B09791611F7589658F636B79EDDD7E64EE4855E55EBE3EB23EC7B3C758B319BD4B85B025C91BE5795E5DEC93D34093FAD70D39B54A124B02C3FEC440F4899B59A8E1E7C300D82AC587DEF2A538710343877DE3A7792867FF1F37C52214C5DC8319BC1FB4B8D5A4C9F20D2DFA89FA028BD7DBF4BB397C95AF8CC9BF92576AE3DEA8CEE91B3F1E033511EEED41CF1658060224AA454962D49CA78D5ED36CC63B455048623A989E4BB0F6C34CADF529C715E274984FD3007F142070E04E2CB27EDF634EF79BD60BDBC05526425066344F2A1F5DE108B21513120E47E8F9A00C045D8667A92D4C5CFFBD999BC3960AA565D7B32377F5A288CB264562B47E48A08CC434333109CCAD7C9173C3D6911F5E5E1AE90DC0ECB525CEF95361D0835624F128D32F20DDCD607A40AC6B5558E08F16C8DB619C5FE2926D4803D1A887D46A7F479AABA8BF6A858462FD2F5184B0C40C95D5168479F7355365E0052CD8C3CF78D32069E709EF7BBBF21353C94EE6EA6A33F78FE96C17987322F3BFA1E9F7B71592EAC3E4C7F70AD40AA38A629D95117EA84C49DE567A63E2636D0D6C6D9F385FAC1836E17E123038E767FB469A989ADB872CE2A22088D809EBC2CB3BB17CAE9CFFAFD53F51B6AB2D4FCD787EC446700C92A15E6B618D3C5D96B98C3A1E40FF1BE163045C9B1BB6D5778EAA2649E3E4FDD5B0FC6258245BE26B4C7EE707DBC5C7CC503B6540427A8974CEA32AADBE7E5A6B4A7F56F3B4FED68B57EE0233339C0638518B6FCEDF7C435D7AB657E2A7505438E71EDF1C017A145451AF4C0CF8B694CECB36A843DBAA0ED9D9E02188F6788F35D4CB84895524E3C8F2BD1F453478233677077BD35EB0F0B884123B4C9415E75D3FA81E5B2C8F52DF22C1AD09F517B08B2617EFD491FC7BF4558DDF7FD2F1C195BCD1426A1298FB3C2095216E87167964379D1509F426482712B3C0EC43FCE995F716F011C153265642A9535F37A173168D9F3A4E6DDE34FBBB9EBE1B93DF10EA5F2E16940D013B0DA2F0F93F027CCCD4CC38E01DE8F3A7F2790B71C94D9E8AF3EB408FB780AA26B260776F02B39FD514296DA28E887429D84831AFC8220EDC8AF3AB82EE6A95CF0043CE14084D62FAEA7800C4FC3A4906DCB00BB208D24A17ECD91671705EA62AF2090EB0D25BDD35258841DE0ECA3D6148DBB5C0AA390EF47F5582768F36D6AE9AF697A741317F12B915D4B1FFDD02AF42C9B90DD54003D1D58578206EE504801F894E0541BCBBB580F91BC73261421FB2E852BD1F412C8389647808E049C0694081234F82B3D3885C4853DCFAFA629F2EB1C38573A4735A8A3E00B3D40EF792DC4B3A50191FEFE8D984D556FCE62382A52B579CCECE043F686BB641F29E49EDA60B3A157DB9972FA26552A2FF6E57F9FA72B9BCC33762BA06F6A3AC6C82397EFCA9F0500C2BDE19EA14866007EDEF1AF8E98254AB2B68B7FF139724A954233D383BA8B4F76CBE9B3E131E7F0 + +Count = 4 +Msg = 1C +MD = E3261F9E5F3DBD4FED886FACD6013A405C0F97DF579F292042E7C3CE831B556253E62C817B47BBB47026E7DCDB8D125E7363744C33CEF359146A6ECD5A213CA11F511C1EDA210F9D83713EF627855CE3CD8449C3DA7878EAA2AF767DD3514275F2782CDB5299B0A317416B63FC3CB4888322290CAB7F63E088003896FDA8642FA75C5D87CDE44524FC012228DEB2F515353D4CE3C443681496E872757C707D90692F481AABF1A90781A6E3C3542C4C0CF1AF87860E359BA0E5EC5A4C24B8D8B286AC31F86037F66448A9C7653BB8C36746F23B52339E37D237D306187E90E3CD2FA47E939066A5ECC79B318A893BF6DEF3875D8FBB3DC648605DC70655D1E13CF753E1E6FD69E3DEA6F83774784D85DD63516CFE870DDD1D9FA33213E3B7FB6C336180C167365A5E85233D866ACC4C00D17A79BB4B325D8C90354B31F144EB22E44DA620AE62C1A55629296C14AA03FBAC6A262C5324B48A8B72462E8663E32094F61D4D4B41715898AFA7ABC9FD0704B268CC1349DF085CD49085F71BE5DDB34A1DE738BADC268374F88629B8BBCBD8D15DB7193649214A2627287696F574BA91F7E51B86CDEE907C8808A09B8B12A7F9027C8D357F02346C1E151F3AB33E9F8627A1A311D8D73D2838074A1C871DD5C1DD413544C78406D57506A621A0EDACA4E0272123DE21FA5DDC189EEABF9AAE37E3470079F67C5492C3A548BDD2E07EE5E761E3000877097ECB87249C69DCC04F29A50E665E0F3349384C98D89E95E7EAB5047224D78C276D9CAE476991A7EC303BD2CF591B7E7A402644EF4AB712348653E86F67EFC742E3D72C790DE31C60C83BC0D6EF040AB8D796025D3866826DE8A292711A7210EC118FB1743857D6E50CDD92B90A426BC5322F6E3694D86E7BA558F153CA52F1E84D45EB45736DF8177F0881884B472D8E8CD5444B32076744E4F5123CB0F737E488B4454DB1DAC38D6D425228877BACA1E1D44BAA7E56C24A9D091DD6561EDC8588DF0629065CB0D340F21F8EA853678BABE20904269DC01C10E7114773EDE44911167349DBEF82DCA44104FD350CFA1D3A50FA3B44F995333221723B4340FC8151F2E8479943D6D44236A159C8F6B0F81AD0F192AB422C13A9D0E276F6E82C271F37E064C028D54E3D95DBDFEA15B20EC672DB5A3621F8ED45BF9467D5AFA7DC7BF18469900F530A318B4B4035ED56063074E7EE5F3165C1D3782DE693D3EACC68F856CD773CA622C8CFD1489FD65A720AB54715DF97140A2B93775A24A9CF0DC16FDCE351749EE6FC1DBA7F8DDB9FCA0AA0379C85564F13862B8EE114D7A96ADF709B0209D1B5BFF437C56EF126BB284AF29D16DC67EBC261F5064DAF015FA0D1DB6D178371247649988BAC84674BA6A42EECF4AD36D82A62D1A41BB637A8BE46AAE1E98B5994AF4BBEEB2DA8812AF2DC01F14A184391FABC6122762F25C7B7FF0F1327C71842676A876B1BB96D7A46606DE443098E83313905FBB08677EC2A04EAD7B087A59FDEC500BDA167F4B2F3C1BCCECF5EF505DC9DB74BAAA2DEFA2C0A751A396765D43B0BC814EA1FDFBB534A9266E732E2658F79FBF3BD595271A45ACE2C108D5869C0A10693361CC9613E77EB6915DF019D3CD5C315F610F6CB1FFE20DED67AFA3ACAB144D331CCE3B888EC894C4468D23E869F07E24B6585E31496BA19E52424C7F0E83B4FDAA5C6719A3DF086828DCE6A5D50CD3641C8B2AF922977DD6712DAD9397FF0ED49A895926687739456198A03710371A706917C97863B374C56DB3D1F098D3500FB4A5552178DAD48F1BF1AD94DC5CFA4B658886786240F8E8FB6B4E9A28FA6546C1326B5442B1E38DE4E21F81ABE94FD7AF8F93653A2CFCD081A55DFEC007E1C5A507B8E70AFF75954D1657AF9F2390A638885127B6D0B442C5E5B0907DCF5CB37DBEFE611F10148860B7D4C3D7C70DCB02072DEAFC0F4D8E92FAC9E91CB524CF912EF606D7B4D5DF5D34FB76FFD8C6AC96295F0AD1571287447A68154519A4F8B9E6A2D774E22871CC7EE8111BC58DF69287FEBB841C68DA9FEEDDBB3EAEAC861D743646D1E84881556A8557B6A1B7A4F9F7B47977D7E18CEAAF5539E6036662665030995F01715B8C61056CD3A0E8FE832F9EB48885CA917DA88BD50E9172B49B7A7343795CD5528EA702436FC726EF9052BEBF42087FD4F377073BC9B67844E51308A48061747C191D6E2A464AFFE6404BFA3E26EA2BD6955CC37447E2F41229E946B87319B114E2BAD4976B20746EE92F8276C15D575A43AEA4CB297F7B3F41D0557E7DE181EFD590D97A165630563E3A930653F706B5426BA9BEDBED7B96DB90B6677299B52DA582714841705A4B81765C2F4DEBE131F22119125BC80374C03D60A701B558348C1AAE3BCDE88FAC6E226384D756946CACD0800B8513FC8CAB8A8B1B06A9E74FA0FFDAE5DFC631601DC73ED4BAA42416373956CE9A56A987DEA7A28A7ECE02814C36B26EBAEEDD8250EF7E9FE985A196FB4B82004AA8201791DA07AA62F90F68A2CD07C6B260A0F91BD78E827263BBE4FE0D6AB03BE137F2B347703762DD59AF4CA05D0C1B71167A81809B09A0B9904E827DBACD9A36A263670D6F8177B2ED391F4D213FAE27A5D4E6DF74F7E4C0F90DA95607F313CCE3B1EA98269BE01A31731D975E0B18572291EAAE7BEE6B53398214644BDD89FFB3BE518CB4874CC9A80C34E0049BD3037334F6EB52E79B62B59E7584D5EEC45C686D0F9CD1212B571F5F66719467212A208B0FEA9063F2B55FEF74C293442992792130AB44662EC1920F0068A5A24D6E4B96357FC9FD97EE7526335F848A830CC6840B306236D82B15783038A445200BCB8FA354E71DCF0C97C5B8D251E3A61C400DBB6F4488BD43187E883D372ACFC6383921A4D80BAEE84FBEF8DDFF8E6402E746D11F3C1DFE9E6B64AE8A41ECBCABCF9B69302CE96AA27EACBFC3EFC2397A39FF02241DAE6D60ABD8A94EF8E2E4C0BBC5D51AF4726B35572E255714EB4638A084830385443652C185FC0D73EB376D32FCB7987BDCE58DA8CECAC035361F7948D81274EA097DA80C956BBA19AF42AB7101070BF38E95F2127200AC095A86DF4223DA6132A145638A436FFE81D60367EF50443844C955719BEA6DFF4FB85B174C7CD8960DF6F1F3B8D06A7AE73C51C36D0DD257BBD0268498D8135092A6F5EA58E0E5925CF46D35097FC71301760A7660F5BDCF595398C6936821B76D4FEA8688A3AA1B3273B706FBBD5145794362A058F56E023D91E22EC350276102ABDBE79EC42113E8A256C4B65B7A9558E65BD021F2CAF889668E1D07CDE6278EC4DD149E21B5C1370D76097F4B0E17A63E9C44FE9870C4B1B7073B70C2C74B7CD63CE93A163110DC6199ADB8C9F0C0AEB8C3AF80E5C50AD7FB3080C35BBF6A551F833B8A816B2EDB59975C6877F80CB4417A962A325BDEAB1DA86787A7DF74A98DD6CA26AFBE23DEFFD5A54320501B711BEB0845634F2D1DBC2AD57002C8463FBB0FD12323B3AB636EECE48C3953178704F9D3B5C5175C259F4551FCD07785582E677B07334267020374C1225B053B7A9758EC720967395635F22497566FC25DD5B220D930B012CBB5B928F3589233BC7D201527F2E06FD36C35773476170D3589989AF4BE4E8A4E0212B6D08330312134B4850B8AE7BEE51756205A8F0DC8E7E41E4C005BBCF5F4AEE5178623574CE90CA1735AE14F1E98CAAEE9E4C7EDBE1B7CFC8DB0D4EEE481FBBF214E6E35FC4F6B49E90A8E64DC605C543FDC9E9B7F71AE734F3A30A804D66E3244F7A31B726358C00D916B0D02447E945D7FBA6E97C0F3DF3EB3AD10ECEC5440B8FDF7761AAB220FD30B5BA3AF86936FC89A0320CA8F953515A3B0846BF98F3B0F458456EF5EFB41F59ED1EC37FFCC0BE6883C08FE9415A7F1A46E894EA2BB8808C223AAF1396F785F2C0B680DD2E7404B4F69D6D12A79297240B2492C8C5E3852C4F9B26417375DAA0452753DA02C176FC84896C45BC036A014AD38A6A67F3B81AB771A47C601405D5C557CA8BDBB1CE729892AC026B9CA0BDEEEAE9EEBCB851F24C8BE0B033092CF02C40CC74095F3810134D9D0E3C36DDDCDFF65800DC9E1A52E234E58198C0C041673E14A0A909A31931BDB12444CCB4A400F83AED718BEBB76B6767E5906807B04CBB94402ED27E71653B11BCCA7D0B329B3F24DC3ED7A4DDCF90FE55A7AD26A1A070DF3DFCF299E4D1800BAE103DF6BB3E9AB4184B537D565F1E81E3B86DE00E601D350FF4354EF71AE0FD8222DFCF5E9DDC73CDA8F3BE2EA5D61F5FD1578338A534019A1B840E95ADCC9363310F635CF477CE491B8D9A469A4D14107E1960D0602493BB210C537205F9EF7FBD4FD4926C866C1D785CB2197D8604CC23F5668210FF07368D088C5014E3429F93173D3921E6DB51DE5BCEF0380CBE69B98859B2E32AB93461658B1AF41DE37F9AB4D1044D173D1115287CD9AE120361418806DBCC7FFE5F878B81E57446A3417D6A716F5DC86B0C73954724BCE9B70EDE823153FB65F3F152076AA661144DCBF8634671E5B570D452944E7F687756753860EC0F6750D99FE2BD6292BDA20094317685C590608E489BE912E4298BE051F7554A01889AE42754FD3A2C8BD1F81981032813966F3EC648F4711D16D94C27BC24FB84670C6558AF1E3A5C937665463852F613554DCC71F8D6368129ECC9908903322431BEBAC3631202F602EEFDC545268BA5E4D820F2DE7FF1A9D388AD44C65581E42B14D462901F743F6C89F7A18C54B96260561D9BCE57E5F107C06512BD9DDE021CE38AAF58A8FD774B7D0324A0171E421212CA559AC9832A941C0E81952CF280536716FF07D35BD424A69EA11D467D718A453A705EAA01EB7BA9DEDFB8947CB5F7A8D2BBDAAA69792EE74CBF916444E4BF63D9BBF765E090D0163134A8E65162E90C10747D49558C9BF6C73A245B3C9CA5B5A905CC0FE836AE2E3D2AF99D385D861A86659B38507F853B3A0CBABBB2E9F984B312A5C4591FD4D5A4A17BC04F3E18226197893DFC98108F7F2934D11C785676441A6406BF9216FD9157140D7334490DAF8B6AC4FE9C9DDC3C059C8C3ED6E074EE201B31B84F84892525657D098862066630E2EA407BE6B02A91D8336FB1EC8E99E8DA901AF0FE044865C06CC2C1A9CBB0C49E3AEC2E004AA04B8CF69E6345316BFD0C993E017FD84AC7FFCDFEAA8A3223AA1A6455DCC41E9E70DF016B47237F4E19D201BF964C26661751A16F28468783B3D4020C13E5A70140550A7EE70116F7CBE9691A76C305265BA0CB46BE99A02CB7CE1C0EFE958C729CE84CC9E097666D91C5D995D60F4D5205EFC3A4C1C9966A8971CCE2036276B7F7C5EA29E3546F96E1F4F87F41615915FC922D4D899541A04898E704D5DABF5032611938DA2A8416479C724C4212FEB7146A8C0230A4DE2B1365A8E74C697EE061B6FD57A22DAFC8AAEC1EC86502F67F787C1CB49AC0F1B91F0139A56733B601B13F60DE99F3923355C46281FF0DA8ADB2C160A52B5472E772FD545BBA1278C58D9E9F624FDCCEF1CC4928747E841B5660C2A27CD12E897131722908A49349B2EADC9CB571A507CB785872A2E389097538088F8166F63A95A4F12C4B5F5E22410DADB968E06DB291CA31E73DAF1579D57407C4FA9871AA475DF4A6B3CA683FD34957F482C9313B117F481F29641FE0D7AEB2CE3DDC4336B0695A64CF5935C238201AED1F9612BD830D15238E98967A6F2335A35476217C4C42528EF6A96C7F25D91380056268C5DDF81AB44A17831F13AC54DA50E23DBDC0BAB250903A3676268215B0DA84C2FBF21FFA9E0BAE70FE97656CDBCEA81E0CD168FEB01955CF5713B08E2FCE57D2AD720D4BEBEB85D0C7FADBE470C66F56C58D5115CF266CCEB8F4654C29CB9791B9200F7CE2E6C5CCB7E989AAAF98A4D064D644A18D97DB42EE5D8C1FDA38C5CD32E0DD6D477B2BF1C23DAB4946D3016F3D9E878F8F4D8C99A0CF351E53D3730FAE32E921159839F6E3BD8D18B550604E289C65CB7FD08EF4214E1DC4BF34E3EF9BE48561D70258900F0D90277FB0394382304DA093E676EE9885563B24A84B257A829CA5D78971FF73989A2FFDB80E93532A76E36DD6FC21D22606FA31E1EBB56BE980D810E0F6315213ABA98D6DA44C9EDCE4E0D2A047AB0F254552C2E2C26DD92E77C0F9F683CFA781D53B7B6451985033B2EE888007CB80DA657874EA9D55A914EBF42E377D61E9E64EEE22A731A8CA58AFEBB327BE892C80D62F62E7660A502C532EF89D7A176D5C782615CE3DA64ADE1F345ACB6A007D2FBDC448272747BC7386543466C2168FC4B9262AADA6CDAF1EDD1574DF0F51C47DF4C27DBA6891F79C76D4738987E890C32BD021E9FAA2D7ABBF0B1AF85ABA463850008143F07CD82FC42B5FB225A0A5B4E17C213CBD99DB0032AF60CEEA7CB8A1444DABEF7593DA6BA4756E0E83EBBAEEB5CAF8AC3F3CC565ECBD633399E4ED13ADE26AC05CBC86B1595F9D9701211CA6520C5FE39C64D013A465ABA752C9770442FB82C33536D32A15753CBAA9368D4FDBEAAE9E2565F55F2FD417F607652DC9DC8EF6D2B1D5C56BBBD6F561B833E4D844A75CDF00565961FB989268CEE5C8C09A72406311EB177A5D7192DF80BC6A664431C1EF66FD51BD434A523BC55D102AD04BAF82DADD96D3DBBAA0A6217A63CAE7C48654E2AA41887AAA786E0E1EA5AECD4AF4D765623ABCFEEE02CC1571693131B1F18494370BA36301F625C3E32256E9864B3E589646F36CDBF45DBBA0B4D798379D2018D690EC974D0A64E07CF5ABC42CC8F1EACEAD0408448230D97DE48829FA661F10E335DA46C4A6246B490B19760E7170AE6C76D9367A28EB7033367B9A3974BFDD43BD7E1499A5C34877625ACC513CF3E160319E97AFA64ACF2FF3748A73EAFE906577ED8EA8179081116479BC7253ABA02B2E9CA8C10071EE125189F57A937F5D6245F7001832BDEA6F1E9AE8F1330E056341D451D65F4C47ED143BF17EDAB7774CFA6BCED48176A353FB4743E0C21DEC9EA85EC9E70E664EC63E3A34A30A470623F7D1DC4B2FD47236174CF839E6F93A7779E48FB0E44E09C036C9C02EB0C031D76AC2F2524086163A03CD864E65C9A89F6EC0E482FA67F4EA4A03BB7B135AC65663B86E3E2CEFB58C6260483C59064E03E91C23F272CD79470698EDC42AFB77CBBEC6E8B1529BABE7D35C3E0AB52CA965020FB0DFB96DB32F40B62DCD6A54551E3E729ECD21438C639B2A442241B5E40D870DB757250E3D9FD262AE741E2A97F890282EAF780D55C23558E690FC391F7B91F81922816AF2A76DC3AFD6E9B84420DEDE0AD2E854F3B20B3B7334483DC35220FF013B6E5F0481CB5CC2AA5B2AAEE1E1F71EED4BD60D7D6FBD3CFB2A4877AD9387B3E167D83519755C6B4CCA42792A62DC2A095DC52D515EAB288A1E9E0B3707B22413D6BC9A9E3E04A1A1C2EA2DC6CD15ACED5C522135E662585502A95B444C60A96012531F3C4B51E2A335FC816B5A5E73E0D4E7BCA4C3298E79C28981F7494704373BEB39BD7C91859C9A16A11F728F895E0C45DC3963DFEF560AAC68DD638125E44CC9AC35B29E2DEC905194272083AF7223D1D00E875A5EDE39E65CAB84F478E171AFED178E8A6FEE78664228AADCBA99447F561AE072AD70808EA8E8903C804BB96086B5429C4B2EB23515CC4C2D169414C329B84E12EEC86D324FEACA3C5D600ED45252CC4B84DF8A8D746DE98ACE350425759EDD664EB13574E0B9F77A31D1772B7AD7AF3A798F49C83EEA57CE5BE39A837A2F453CC9DD538D7109260510E1D6AD101922D37109B515403A85F6D6B1AED4C165353FCF919E872394FFE703370E398DD15FE0A9A328E0BA70F9404F81712F37F98860C2F9CE1CEBE0C49B8095B26183C22F0785C95B9445489E5D1AEA113C95E7F083559F5D27A822CCC2A4DE8ACA2E07CF5340F62DDA4D09BF204B5FDEC8E98F0DC67B8F1B249FD80DBB7FB5ADA9CAA9A2A710367B29C61D555AB412AE1A2D32FBC6901E8352FE48D19B7E61F64BE247C2BC0141FF0D608293B58576A1E9095CA09FE098678239324CEB2FC587658EFD905562614615B5E201F9635943FA1FE259CE1B8514A4D101990BFDD85461038890254259BFA1199F2007C68C974918701CB5C5795FB369BD49AF187FEA433325878C3BAC8BABEC94467EFC31DA00B1434B48BA78C538E1C49AE2AC8E29014B22F20DCCF40CC6397CDB354D4EE31FB9CF7476A0614C08C143AFE6503951E54CA57653F540B3CCE3F577D1E73FABF27464C327ACF244F03945D39BFE4970D3BE0D3AE15B85209DE4E1B460A8D8743B4BB459FED868DA72504082 + +Count = 5 +Msg = 5B6E7281CA905D32 +MD = 17C9CF60E0AA482BDF367E43B44A9BECF191E4359674ADC314307CB7D09440249E66D805610BFCBD0CABBBD5CF5C47EDB59E8DD1FD7390AF2EECA6D6C1B97A42027DBFE04F91712672E852C21CEA430D611AC282A2F7EEE8E1B55194F9BA3E4DE267095B88E7D42F82B8E64A7CB1CB234D171F1AC64E526702F303E28A049E275A34E1317FDE5CD6E473AA559C5CC574D1B8478E2D855BD0C40AF37A915D3E7BB9119452A1B0B99CEE1ECAB760E838BF6A2F6D7EC6F796413EADFC88DBF676CCE6C729D51C32CAACAF743FA3611A9CDB386C116CE71D6D23CE0DD1BE8C7A3D3E29E87998E54DCBA548B1E7FE7F048DBD6C1D5F2F5C0894984EE8D5DE20622C318DAEF7DA1178D1EFDA53F3AD647889442268EA6CB11860F17FCE8E6B16E0E250BEEDE7EC2284C4808923895403AB0163F265F2055A3ED6EF8B3B4BF83F7B532BFDE6A3144395495DA6338DB567101D9A550C1AEF9DC2D701956B0228B2FC6563A0DE726D5CF3E2615BEC233B8B4A6B6BE1D45A3D5258BD87566E0D1896D4B92D7722949B0399890AC1776A51EB7AE1CF281FCB1E408A732F88D749C4A5F5EC0393D8175375028B90543737F4544BC027B1671DC37EF060CEA75A5A60CF71165AAE5B96CC3CA9070E9349D997843D7A83B7151F3F5A60A1B7A927B15F2D5C085DF326FAC894236EC26CB4EF1EBF0EDEF40856FF958B977CE54ADAA21ED3010CD1D62A91C55513EDC23BF99E6FB34B6C4352D60DEB29B06CA7D2B3D98CC5237BF48C0D7B4BBC6DA11D9777D479F84E721DE5E23A6F1DC7B0BDDCC0A6D3AAA0FBC97A62F6C5C4924FB0EB5D5441AF68E38E7CFCAE4DD2552B86941A501D6518D4B59B90BE7FE8FAB1A585B5748DC7C826D453A5A8D69F580F3C641FE83DE1AAFF0B1455CB121C6DFCBA97D692A99630517BCA6805114B2169ADC0552679A03BCFE769C4AA0421A835AAB249647464B354DBB083206C63DB033256A2E7F40C996AFD5769ACBD8B504B0A1DB381AE97A066DD09D654A623FC941EF31F859567036861A2A1593BA0B14AF7AD568C89D9F47F5AFC597A6831CE2625109EC9D8DC4CD7A5BE725215B25CD8ADF9C1C0BCA3820C3EB980412FDCE2AD1D94E6EE7BAEB3F83B01653F8D746ADC20716D72BF308BDB71C950004BC6186685EE98F7B41E8C92DD446F2371D358DBADBEF10F6B0EF5A2BCCE1D6C18C512A5D8B928315F997671C3F56503BB952DD2125AF5340C706E43B57582FF7A6E8DC5F8D660A0865B2DE833344959F52AB3902D478315D72506D918A0C60BE14851D230AF9F4BFC20A04BFE52BDD51D4F97E3B63F532E008905A5E76E69D18CD4749A754DF7BA4265FB1DE0CF8287305E8EB2ADF84DBE767EBC8FAC4101477A5211FF46016AAB313DF63D1F8E668B697E67F8DB88FA1EF9DA520588B20EBFDB85AFA1AA0AD2A9A127F91F49B428A9E84E487DDC35891F236C15B0D2FDDF1B7E0B695CED07A8ED8FD0FFAB01C0F47FDBB2C6B4A407F93544B42676D1A40B003A86ED4B76E6D82AE8E441F063D721B2B9C8CCE00D9A787F8DE51A55BF4A2C402836EE6A3E18F1E8B11EE220F10AE84456E8B312216A9B4F7DEE8999422FEF2FA007ED8CD3BDC773F9849FBA0BD18E353FC22A51D0BCD6A91DCF99C89975ACD836A7231226396B0C5DF297BA4F406FF9F73201F932F3EB7705F3E362AB2520636ABA61CBE7A753DDB36E36A1CAD672C2B0DA07549746BD89A0C23F575945267D78FFDD1D09F67DB3BB391EF3BE5E8ABA3896E96712DB7202DE61E67A862B222EC92D7EF667E1C5A900A7BE2617B896F19CD282458CF6D506AB7C5CF9C1D27C2570A90CB8C69D321AEC2B291C3EA260E17DCDAB3D117CE87A07FBEB1CD45B87D73BB1EB6F6FAD2A4963FDCFB26EBEBE10DD9B8910D1E4090134CEB21D8EC8EC0CA37D900AEFFD4B8C43104D4DE48990D6169960EB3C6461D28FBB302CBA38E3D7F902D483BEAEACB3011DA461657294D67B2FB87F6FCF17B73E40A73335436741A214B072FA567715CD5AA2B3702A963BD6E42233B8AA848D9D7DF4A31DCA7395972F2E98CB35BB17F73AD56A502EA418C3B922F44242CBAE741E084DB8BAD0302C6AED24D386AFDFB568A673F957B95545704EB1CDE02BFAF3A86CFCAC2DEBB6144B684EDF826A9DAB6C490A328464ECFCBC01AF122AC39C0C2497CECBDDEC2E33C74C15E83ED09FA698708104ED85BECFA561BF434B5362E10377E557885A886D1C9B838D1032ACB2B672CEA422C94C52F801F1023193DA240138AE1DFE671AB7858549CC5BDDEA8A3385E8DE044A22C12497B5499C7E4076CA34722CA0B3E30FDFB0344ACED2B2EC1FAB11A862D2F8EB83F51BFC01C530433D72D7E89435975793CE8EFFA76CE737FA5A6EC7B1A9BBC62CF65364D12775D4D803B81ACF5DECFE9E4BB40F2A48F1ECE6AA5098EC386123B42FCF906CAB028AF570CC1232E2B3FB2DB1BAEEF6216325BD5FA04FB216CD5C5EC28EEEB5B3FBE6074482A6C2A21E2B09D26E1D03258E5374467E9299AD8ECCAA75536DD0D8F4B348F1FB3F8C2472937A18A01195BA747847E64808477EEA4ADA46CE8645DC7E98C5AC18D2DBAD56617CA2D480BBA23354D5C1EF143F4A89278930B3FA4CE78924551D83E331F32F9C2363BA50C9088C862144CB61AFD0392CEFC4EE34AFD643E65A22968A51BD8BFDEAE2346E92C297CE6C8C5A83CF8750FC1AEDB9C841BA958500B6995F31599C2A99226844C74EC2BFA829585F74A032B8E061AE52F1BFC4A00C36239BBA7FB815EC5BCCF489FAB04EFF36F1AFABD6CD6E677EE9EF8281B2399C3CD38CBE2F5EF3FC7F2CCD8FF0C406DBCA49EAC8C8048CC5F13CCFC3067ED35B68A775178C11F931ADEA793A4DF56536D81410267752020B9E84729C199836E5918FA703CA4EED5582349A82A799CD0602C60561E64D6E4604A3BDE8DC43A7026D131B5039B4993942A15089EA82F83D44EDFBDC01D5783B65B08BA647A2DE09BFE1AB69563415ED54C908F7E851D9362AD769BF454D4347A7A413AFD9212BA32EF80C2AB6ECB752EA118651F876537FE98AC640373676D0999631DCA53755CCA255B35C53DD7931222747EF317CF0135A88639C74A7A16661A8BFF41DE3C5C62906A8032050444C67EDF5911F5BDE0687ECC294C434D87D5F4F7F2984E5135093B1DA76C7AEF77AC4FCDF2D009839B78581CAC0D6A742AF33AB790495C4A5165A94E9C2D49F8D3DD22008BE496C62BF7EACF4F0D2FCF51A88CF8207759608F897745703FB72CB110CE6D807EA66FC99BFC74C19227353F9FD54589D6E6C2DE3AC21CDAD1538CA3C87026B552F35C8AF1C53A32DED8B0FF1396A7A6920EDE2E4F2A96E20998FCB488A77335F15D1A2032388F0096FCBCDA4A5C8670135FD636333FEE7E91B6AC2AC0438ADDBACFAFAF30064257B761E3A4A6CFEB57E2B108EAB381D2DFC44FC1AC46F4DD949F32CC875934FB649B7E8431BC85AE04B9E7876E24FC41FEE950156B84A6297B54757E1B6AA4F37D1953F7BEE1AAA72A05DD88E4078EE985B922264BE8619C720DEC775A69D0AAC28D89CC1674BCF92887285F8D8D5D2A78F14D5CC5810B234E0BC8E173BFEB32EC1964E9671B3DF7C1CDAF2077749C7B34EF7C3C32F80C73DAB052D4C272F741F8AAA7C8224AE5A91A1108D29A09D01FB6517B6C84798B0D9B41182EB24C05C6DCEEAEC0D4239E355A9AFC246F7C36B4BD6C2D451B0BC5197D1ED7F4D0284949ACA85104B937F40C696C588AF108117804A91ADF0CDAC92DF7D58E69DB151F471C4776A0382D28301A1B8BDC94C5E7D10BFBB579B47613974147402E01229722AB271F71B5C8897045CE5BF8063C46C9A34B5A3BBDD05F5668BA97263861BEF1F651694DD362E3CFB9E99956AB6D12BE9B7C9FD1BC1DB630B54D503E07C4E282493106AF6CF84C76CD3CB7EF121E70C39EB9A3D1142CFBA7DCA6830877DE628954FDF7C8E460D5A11E0C382BFFE0C7459FD4D8D59D73B7ECCAF99D66100038767E2B8BC788630EC84A96BF89FC00E184B11277CA94CE0931E595187E08AC36895F529BB6E395EDF1D82C9708D514E4785D17204C874CB5FC3D19FB935D33EB444CCDB2ACAD73CB3632BD9B9E786568977F45CA14DED02A102F43AB5DE9E6D1F88FFC6B3B760A4C9A4EC41D15FC8FE8937C5BDF5431E5A0E89488DA38AC59BC1DDFA6495FA20E91EC081B161991A717EB8A9A9F2040E33DA9C43E41DA9E5A64702E086AEA94D28D5A3C173A3D6E7C277CB46F880822D9CA0383F195299AA9E06C2B7DD2C791BCB1A20BDD55E9A04D3B544EE89AA40CD799E0FACB4ED76AC3C052350D4BB4D4021DE15B91CFCBF78DA76BD1A17240E7509B5095DEB0025B7DE6888AE8ED374CA54908B7A7025AF83A7FCB278E1E4BA54B01B99489D7892DC34C6D8359179AB522660B9EE329BB93477FE0CF5D812338C427F6FA3AEBFD9E40411C7945D7229F1F9187445DF33D61B3D4FD9D203A2D4F0C906CAF2B71FFC238A7CF2F8D3082CFD9E5476DA4A4EBE37A6D7D77A71A7A5A0C2D2B40136470C7DDD82CE7D22280E24E5F406A562839C4E8C849D57A2ED05A9E2320EA0DC818657B431E51EB61C0FB7FE9B89ADA7BD99F758C09A6594F529CF42E1BC49AA313717C3840EF492F66540B5882099EFC7BDB9D63059847132549E2F4E6819B8CA96DEED917065D55F4D190C9A0D9F7153655B5C9209ECFC3074EEE181503FBA37880248D26F7C317FD8B307EB168827CB0315A3FD686E0261D82251D23AB0C710651202E98596B83C43993800F33963E43867F668603BE35360114EDF3ABE8C53A66D741E55F5E3927FA05B7A3A783DC62A2506C4EF4D1D4D2C9235541737B348D3AC33DA643A729859345D2B285178B678E49F7700CBB3542FDA3EE1A885CEBF3C9D7A618ECF8E74B6491D0A78A81FAF5B3E10CF05A4428A5BEE313CE8AEB31F45C3A08162E174E5B7641A10BDCFAEFBB73CBB1B97ED5C9A93F0B7CB6061091EAA4370B49A40899202F5719D76C577AC2654636674A735D1F10DD807CF1EAF9C9F675B8AB891627F94217BF4549B9BD2BE3CBE7F75AC9B40AABBEE00932AC95742DF70DA0C37375040652594FDEA6BC340F73D123FFCAE9C8E89A829D9F45B2E7207D1D67F977D161CDEE06EFE62C6F6451F9F757A422589484FC9839EEEC8F3913DAC0711A245F83ED14371CDE09FA673EB1E6F4C2023E6F83D6E4D06CBD733EED208FE709641222F6DBB320B70DB7A8E8359EC740DFE25B4CE36C74C6FABD6F0B154237E42796496936B6CCAEAAEF901D6D06D1B435E1FE4E3440A7A67DFB3AA54654DAF5FDC1D05E7F08C542175C669EB89F4CDEF310FB362C4F08DF897B8A6A37A6F2E7B266C9EEA1523F21F2D9C2E2B474D2F1296EF6691EC807DE5FD64A417375A57347663278BD1272740F0A9F15EE007157FA8F8C2904A5203255019208B9C069B81773EB6D4718BF5FA5C60B337B55193420C0494C99C7E59AD8DFE2D53F144F3C9143B655F1FDB22548329A1E1403F03FF8E9DC200C615C39A212A910A0A85F3156C40AC6B353E131042E82ABE9DB1A46ACC451CCF83725189CD89577659DA5BC899D50ACC3CCB4A4D54F9A7628F04B75C97439D2F37275954BC9F657F7030BBD8614EC4CB203D6580E0808568CF86EC07A2378F46BAF416E50D3527D0EC1DDE696DF4AFBE53CB5CCE0432037C2109CB6CB2D754F8A02804E79AB5CDD74158D31E14478A2938DFEF22CB6C57CE8DDCD1D4A633D119D5DF6043E3A5DD14DCDEE81551726DE9699AB9C57B52EDFBE90503870008E6B245D611D9E8BC63DCE4E81D341355650801CAF3D04D37B3CFFA84E047EABC534848581404B4895BB4EE4D8C2315E36456FFA26270FB0656838A2996A7CCCC55888E6F2254ED40F1DC0AA7326D5DD556AEE57B0D2647B1CD58EA2DC26003064A6C36727646B923138B60592951AA9EDD12945202A370BB475FBF091CB93461674D6EC92D290AECF96504B5A47902BEEEF8E18CA57C241BF030973923594B5F08710B3739EE2F592CD782561C4ACD2B0FCE3337907DD6B28C7AB30837F147006B08E90CE49E56E08393CB028515D801624A3A66F79C7432AC1485445191B14999F1EC79550794090D4466DA9D829778E97046B6B58C43B03D0732F1AC3A469F78732ABB24CC7B0985D3C68F30B3A7DA22CC8E9776995BB4D9104E7AD03CB94747B333E1D070FD7482DAC7036ED7607FD3DE29B35E15F80F18EA79B26B98FFE9F6C969A726FDB065AB9C4E4623375C2CD21C2BD4C9CB346A83DCFBE4C1F77057290F40CFF49CB6E390CCB1A97167AB855342D7060E2F565BF76DAA70F324EB2B6FC1C28F0D7516FE1384FB6D523D947994D069FE218AB856CBA3B593F86ABF3EC6524A07B81A31657A95380B04C84A7644202635274E13831CFE8C94047403ABED3D425AA18408F6393E9244CAD68C1A4DB06EF631C673EEA8AF50F5E691FE28560BB36524E3737798E4BF7FFDE7A0AB54954BE5B280AD142B1F3C3202D0A5980E2CFAE42D32CB4B5434638B9A527177C22A21455DFFADBD2147AA1649A88C22994A5A6449B2AFCB389AE02346090A65A157A095AE3F96CE44632612EB1B8E734903592947F579A93B2C73BEDFDDC2288A46C334D61DCB5B460A1DA44256D32720A26191E77E5685D86666046CFD23230ABD3B047929F14FF51DCF2EFE3098089941737908A4F93C1C92A2440C42FACDD6D80A969CB6C72D5D7556EDC36FD1B8416FB41FA8F96350EFE462BE9A00C606BAA0623658D446BAAA7937B42FC8D6D22DF98888D53E566C4E1939DDF37280D4D70D1B91A064C9F429195140432F5104FBE70F97C954C5E93484704D07B05C18EDCAD2D1F911E5BDD94FF246F4913000AE9212FEF3B5589C80A598024A1E6996A77C06E2F97746FCF84C8C92EE50033DC47381606BC9A09CE19DA1A313BE2F4D6DBB06B52D31227138F921C69E4D0D9C716CC926B7B12A2B8C8C129BEECEAEF52CD1E33BF89CF9B45195D85B8B655B35A858988B823B00E9360C478277CBCC8B1513670FCD1351254E7C75B34D0E6FCF208B349AC45E55A5DE84917849E92B09F2F3979C07AE7A0A51109567884D688121D0CA44D0200E35B891DCE9302BFF5C60D82F3A0FA77466E01A0AEA66DFAE05028B15C422A4C53EC3812C3D6E6CB04D6F3AB455B50427DF50DFBC5D292B1A1449DA9E5BBD34382F15B44936DA69FE99C9778CEE8CD0A25143A1789C433C4408023D12A03FBD584049B4DB63AFE96E411E40900B4DDB28C78043A31396E0980A2CDB62D67571A8F66BD64B087FC29AA4DC9A320DE091B004D8481A78212A4A835E0259663D08B3CC9F9F501BE58A4F24BC37E8EB9F3835A83956E0D252D4C7185841AA179BC71595D16121C0C1FA2AEA8616BAE61327D81DDF464CC7921124477C2BB137DDF9EFFCCA03A0C440A0DC4753D0AE4D078E11D8CA4E53891DCB52A77099B7B4B14FBCC29CAC53A72B8A4C3E619ABA5D50EBCAE1979F11E9EFF4E628DA00D58E1E6AA0A1C4E5B33C0B12E0BEF6E5A02031822DB8941CAA9ABB94A3949225C76B01B9972D52F2B7D583C7F5CDA0A1CBD99227ABC319F3A88867C07291A7D2437869B72FC4C641EF6A17DC06CDD2264C33B9AA76AF350F2886EF1B298A2EDB95032BAA8B477B645956E07D4EB00DB652D7A1D78A56A3343547C54B3835BEDDE11F5EDC33240F8C96AEC41714DFBECC81E1BC7408C5AE26D357DB32DBBA6ADF4B97E51F93CB04C25C6C70B64AE2787E0A7AC366605CE1282A46E3DCE0486F85033159179521096A8206E56C5EA21F4263E1698707FD67FA0811F5FD9B9C528A640D05C93ED6A2FB8698AA66F055AFA4B129D9A4E6C5B94C86400AD203EF32F52C8A882D251043126A4AC05591FE6D1628D8D4476C53E4F25EE9E93A0666B74A52FAEC06675F0139B9689B4E334EBF8581D469DB864F6465E769977FAC8B508F09832FD2CEA32C8EA4569E0B87B90E927BBFE9A0F186247EA2C9C73517E903F067477A05732FFEE5DBFFFD38C1052F63B6F6872DDF4EA6B4EBC6E7951DAE927F302AF10659BF2B1C40DFB95338688C99037A933521AA5F051073BAAF8F3CF6DE3573F04DDA3B0B3033CBE7315974E24A5E4CEB711605A325A2F582A179AA0D05926915EDFDDAC367BF22E480DE0850FF8A78655F0710018F2F65DCC285EF4A8E6709F02D7A25111EEEE0D81E265FA2DB5EF74C346FFF0818CFDA7143D2EF2481B69C31F30918588480D05E769A93E65633725582C57201BA87CDF92E693353EA1FB1810584CB8245E465585C63BFA2D6014F1E2821C92620C86D7080D010B8D9C0A2719CD4E5684EEBA0D1360E7C50BDA189CE5D82CD9C3DEDB2F8B2461EE3BF9826EE2305691E353E09856D2FA48125A2A2FCBA9C81514929B573D476D65D29EBB145BB87EF6D0B039D85A296C1A589B2AA9FBA313FEA9E590FAC665073A429BA06CFEF39D493B2C1D4B33F6C1B9E9D0BD3A19F6D3DC754F89A78DEDE2664A8E95044492FE8C3F672D467A652C1E9F150D2D986B68E4EFB276FA75EECC9C8B1CC9E1113FE8D2D6C3F334A913428527A8F26115E2A89957E6DF92C559A1F87D2FB4E5DA3C972A87705998A592015917B0A22F597771CC94F8A5E80B0A904CD6016A1968E307B3B029C1A420D3EFD75F32DF9C72565B6C41CF10B1C35B09461C9FA8701C5D19C2757C400F098D42ECF6CBCBE3D43B402C5D1F7DA4D5296DB94566AD01C535D7F4AD0FFC59CF27A88496DBC9C26DADDC09752A96DCD30307A43E7566A76F1350E73C3BFF565658A13ABA94D5F30A65CDFF12789B9B0C57610C1946B1C7ACF5676162B3CBEC1531A0F866F1D4EB39F9B7D18B9428F517203C213C4972A61EF8A253A98EB231EF76534E06BF0C06851627E26522EA5EA010731E3678F943B56EDA6126E945A6F8E77656737940E43519E50925E3CB59D205CEF461C7BA3483FE7F6A64AF101049B3F8DAB032644ADAF1CFE208EF734AF3DFBFE8865DA2801C5EF4E555D614329C6928AD235149C6377FDFBA2CB8D835B4AC0CD23AE553A0D30D2A866E95BC0C150A958D54C2F498801E50960A574BED4B87D40FAD3E5279DA1B2B208E0A706E28AFB4CCB3FDF18F0E7D88C8475BE74EE56D4149323A1761F18234008604003AD5A212AAA20C58DCA475F9A4FB7F38E711C093808D76EABF65710144BFCFB1EF87D26BA494F27C4F7684C2EA6248F0510B1F8B2DD35B1B53C9ACC99BA8B16195DACA7273D72DCC0FB1F9F6E06848D9E903B84A50605F6A0ABEC4F80BE31241CA2C7279F055A3A34AD4DE5738FB2F219C43BFEEFA91A5242B2378A971854084FB20155FA5BEF71F2907CF4D3F5FDFE29D6283010BE55CA5B07FBAB06D41803B173C5CFB5E76A974789B0192575D8B80DAEBC9E97D5231DDE672C76C4BFFE5465EC7331B3EA8A4BA9516E5CF9FB4C20E52238DB6A1D5B4E97CBEF12010B9B15B979BDDA7BCB192B0451D66059C8C357BDF88513FF5C4AD46CB087226EF4BBE5B26DD888F0D146B7256E09065121635572B7AAD81AF6842E85EC7CCA9FCFD386C25302438912EA6A334DB91CF923154E818D924C5862CB032FB8948C5EA78913200CA9C3552AD83F30877A71106C8B35AB08DF4C0FC8ABC5419437D45EBDA98CD425D2EC40631F76D3082676E35846879DE2B1696B5E7D244FEAD3B24CC3CA85C97B47317017D3098598B6B111EF030D04D83436E08675F9A4C6708B58B1711C04552177AC45E9FD33C012D38264254596144F5F3DBCF2351ADA47E6DE8482C2ED5E5CFC13B739EC76CA9FFCAA0D008F70898BB1B10B29D6D1F358D24E58A2A09DDD79C07BC969F857853A7B2F6CD3460A9D36BBEB2FBCF4303DEFBB18802790175563A2D2D34B + +Count = 6 +Msg = 48F0C9508C3D12F425FE23B3BEA7469249ADF90D08CF5169C6F1249107DD3FB798136AB8916C5EA9EF64F8765BCE8EB439E8CAACE2E42A799F608A9B1980ED47BE6C1AAA3C8E00DD4E4F1DA4D6DB0DF8626F581E1392D4B4E8F11831E2C38F6E76B0B7EEB3E378AAE7ED5D92C686A2C4529138A928CE342C9766C14A75CFFA8BC0AF2D25231E457FF7AE36263442EE624F54DE508AE546A77C8B564D212D3418F2D2D117597CA0334CB9B17A980EF755775FFB21F1AA01DA6885A998C8F75DCA791E336270D708D2B4AA03D033CC0F6E9301D5C232132648D0F7AED3D3076B545BE70079DA94E49F56286C46A630A79C763B05C7219B9865F8EB92792835FEAD3FAE744BCB9693FF1C366B09A7DFA19F4F125D9802A433C04F9B81EE026B772129BF07F7BC5BD0DFA705AAEB2F8EBE184AF22916D766AA9A7BB4FC3015A5FDB0BF4ADFE7D7A9E3F4417DF1FCF94790C1DC68A40F416049C3146D7B085FA0CA0108F92CE5AFD740A00F35D45A75AEA134233B54AC01EE6F5E001CD26A2DDA95A1B2EFF4FF1AAB11052803FF0C8BEF4E66CB47E5244C1E001A8ACEE49304D573359F33A786B9A11978294E83FDEE62D211CE6C9EE6F5715494EED9744CC67E005290CA6C5747C8AC292D6CFAFD9A022B28FBD3C598368C3F2EDF1397E02DCDB1AA4D316D24F57BCA05BF75B8887656F9ECAD4C51F3B9681B038A3E783430CCFC60BA50AF699407327F09BFD8C1D4B6B88819AB32E07CBEF0E5166A99B70395D5F37858CD25A79057A61AD1E9FA90592FD485EF1A85991CE3FB5FCA522A6E7A7C73E9E5497BE892E189548CC5ABD5F655BC3AC431137A4F595C74D2C6DC3D2C37A0547610AA10B3EBF30E91310D563826697496EFA94869F8998BED0616CC044B275425565EE5AAAB87D83E04E91E4C053CAB5C68A63C8E57EB7D761E23ADD5260A450AB831E2C883CAEA68D009640F7B3FE8CA6B6F9CA4EAC6CD6BE16E8B88DA0318FAA31494D359E3D99DBCD4BD4D876EFBDF3BE269B66EA01FF16377E6143E628ECCF1696B67AA14708896FEE8150980E47273AC4DF799618C02F4A370E2FCC45F5A46F05C1D0294352671E1206FB809E7E39374A09214963390DD687207A38E8BD19F8ECF1824C66FDF762686B8411C4AEBBB8D4F8723CC45AFBDCC4099212D83E3554ED02A39CFBECC04C11BEE107A4EC01E874B163E03AED248205B5886D6BD48A3A262F24C1FB1ECCE828362B1579F427D807B9AE16CA451A0FDE1197366462E03D24B6D185C73FED55F48BB804B21F18118DA065A236636FE10524E3E9878673C555FDE0B312A210C7CC48224E9D154DCF0975B8B3FD3DF6B146F070925C03DE6E07E2AEB43E54FEEB9F9DE5EE412143FFD714D001DDBFC827F72F7C12217E7BB869B436AA668990A486CD246F48187015AC80BB3723DC90582A86CD0EE8ECCA21223D748CFAA9894D843B7B109B68EFEEAF567590B334849D23DE8FEFCC81CBAA02F33D1A93E32B03077DA2F8518FCCB1A6EE5F8267296DEDA8E7691C299980F26FD10D983BC54ACC3B629945918C3B9411CE48EE224932D9954F61AC7A1ED96DECA09870722475D1939356F490285C1CBBD4FA5B4092D026AE3402FC539E422C992B58E0F3BB21FD48775A9EF23E396CE354F0A5148E1D59D061D23E21897DF5412A6B74DF7B18F0A2FD02D94841347FFAA6090EADAD080B0E0F0091E8E3DBBEF9554DC7C2C49D783BFFF2177B44019F3D62438B806F47A4226066D06A8717CF2143DFE2F36CAD260890D2ADAAE09FC9FD61547690503E8A0D9995626DCD0DA4D832F627641E9BC0B51D72FF9CAA0941C09CD2F922912ED11555D569D74AC84B832DD577FA6865DED593C182DD3EFD63805391C0EA0482370415120E4931F96A45276C7ED481476826F4239EDFABF3D66871D973A8F7517E9B9E73D556579593AA673DB5D27E9F0F0C3999E5E0E36768213BA5C75875C15DD5FDD3361D7201DF6E8FF4786E4E03E9D2DA776F5D7B9DA8270BA42AA1CE4B3495EFDFD49B58E18A37CA8750FEFEF9E327CBF48DFE51F06A502B0F01DDE72D9044BFD28E6E2F5E79E8ED3782E43CB93811C0F2E5D9CD3643EF75846049DFBC50ACE71C3F2C7B85087D7A95011A6D761371D6F01CE437C677898E9EE8AAEE201930D6E60D207A1B963BEA785F382529720F60EE72EFAF6C651094B59DDC9C6D8F5A8BD0338778F307BB59D0F9CF774F54651CD939FFBD29917A70EC9BB48DC99F8CE904AC54E5FA867DD6B785CE62A5A9455138BFC3238 +MD = 98103A0026F1125547F839536464D79DB860CF5103CC86DC7FFFE587550FFBFB2BF3503C9412118C91E9706ACDC2870622687441CA2D6A999F6315211FC837B40359C5C7EBE41ADF3F536196C62D4EE2A5B68B2004DA9A6DBE4611AE738C4524EC402B52EEF527756BD5161764BF6A2FDF457D7D16A37FF1B7969023FEEE4B781D6C19B86F9A5470EB662D95626124CFCC2A73B465E13DFC6B33FB3D972B3471DB5DF255D1728EE1E466393BA9CF86BBB659986BBEAEFF1A9DC2960C90011E55F4A3F56762F11460D3AFD257B439CB953F73E6B3659D672B288FED2DB6DA390AB40325DFAE3E8BB41D9D020204CF26262DF3BB19EAD55AF2DC112EAAA910A92AB89C746F5132019AC04551F808CECF7AF757290937DE15D61068E185738CD033932C96E4F67A2CB88B0B08ECC215A62336C4F4A2A94E23FA148504E99D7CC28C51143250C1019A934D045D603F46D36768084461CC63DDD323F472C6C5CF3B6E3786099A3B1099A20410AAD1D5B485832AB2753185573B5309B079CFDDA3CA520754B163EF923E8A524D7429376983FB30B5D4F36E87E17D04F5789E97929CF075E827CA1A223A0E63680049EC4EDF70FE4757D9CB7AB031406C82A82EE9EB73FC85057949CC15822F82FBE0845DA3CBBAA42396576D886DEC83131D60CE0EA9EAE18101EB6BE8D14373079EC35AF734006B4F82C78D390645590B1EB3127A0E0CC5778DD0F38F678783DB081731151E990DE63E8532AC98C0E7EF6E0385C40D9EC158950E740A3CE228D9652ADDF1AE981DF695D3988876CCD0BB9B19E0C2EBBEE6EB08691B05D7DB072C9E8314F63323EEE62173EFB378F077844E0E1C17FF94B9B3F642F00222573D3E67F8561B290362A3D32BF3CD59062C4662A4192E60F299A41B3AE99AD77F77E8BB1FC8A23E522AC8808EB80F92B24BCACD14757886BE9A645E0059C15D9B5D3883F7CDF697E86E4C5EE0C815ED574A1B7919DAFF2C8D1D2C559067C21C584FE37DD4687186072E716FAB3E6507ECFDBE99E4CDCAEEF04A55E04BC4054CE0E7E2B4521DAE0F89CCBB0248FC1A3D3C82BBFCE4D8EC6848AEBC215F4ABE686039A3109486828FA4A3819C668DF547A974AE12499F6C2D3B866FA5B96D6F5EF0EFCE4679E36AC5935B5722A7610D4AC102AE81FEB7A5BDA8A747C1D3C4A838DB5123A18665B5C4FC4FAA733B75283ED50F4FCF50F67C4D7621A60054D7EF2B983A60DB4C956E38DF799D9177204B6DE7B9DD778161C4FE48011358F74D8DDA36B3AA6C3787D8BB5C2FBC401493401A4842981D182ED0826A9BEE6AB15A48925899ACE502C97416AF5E01198BEFCC04754A37B75844CDDE658646DE3B8871A96C583B4AD9F73BC08B5E9C324E362721A1CD7B1C45EC3E72B9D330F8BB60C5416F3EA82D2EBECBEB391680922CB167AB4980B1AD11DAED2C795B10F89401949320EEB7443805EB9CD87BDBF7D0E1E066CD2CFE56F4810131DA3DAA13F706D8BAE4D64891858642F92285ABF32506BC4DC44633FAE54ECCF270465743B13656C2DB2B68D96E0A436C72E0CE28B63BBD7553D4A8325E7757B48C4191C0DA465791B729918A054EEBB2BAA5481A08346095EA1E272F2CAD2177045D09CC8C348C7CFEB436A77E7E1C62E0489DBA5500FE6EC84DF984CFB4BC89171E843177D89A4B766734E30FC5B2B9C9945D70DF18DA356374D709B1BDD99B330562CFF6425D7A514A55FF708B22152D80AED15CB4B7B2BC09C4528ECF0FDACFD71C5CAA83685FB6D7E1608FAE28F54E9A5CF285155E72D0FD67A4B4C91095090BF67A1782965CDF9E20796706495AC674B8255D790A3EDD4C54D8861D784423F3A3205AF4D449F49521EF1854675820AC5568995FF16EB747A6CC68791CD07EF88CADEECDB519D79D54A33D61947CDF1C9C8CD8E0BB4BF05250E43A106BB12B1E0DA93A8E08E0B09782AE16CAC3AE3A837C92AB200C6F9A3CCD349EF2F7EA78B34BAFEFFD41B4BC732EA621FBD65B86D7330DEF79ACEC8F1431553BCC953D37B2B8018CBD9C91E9C4C5513A13399AC26ED3BC68C55CE6C05E4C335CBB519123C03A9E01B4383669B6A15756A7D68145C12039746AF9971F2223DB7726BB3DD9EED3614A8E2BE3F74F7226AA11F9DC16F0D8403E5F72D975EADAE04856DB6A39111358117E73723128C6F1B2CB6C0E062A9446150C8E99F861C80889A843F04F2ACD3843B50A1C650D82DF1C64F6639DF706634E78E62D36F603EA810DF37F08EDF89847A70F2D777888C5B2029C47B387DC98A28A891B9FDCF5095635F1A41F04AEF045EA91E5CCBFB0432F7863B80279E8D001F596DB1C996547B523A5377934D6628FC98A07921261DF3604A326E328DDF15D424457ED45089F2570C474FAFB168B3DF6E1CD2106EEF4549B5E50FCF97A2FA5941A4DB9CE7B0A95C2C08B089F60AE2C24B919F8B641FC4011C11F286430617E4B9C8464C18324C9CFF4F58BCDBF6ED5D75C6772A5624152FF1B3A13F39539857B7D24AA11BB2A60C04B225B130F765F952CEED4A9F748A7B9B05874F16C3C2C9BFF3AF6FD252D0F4A28CA2595BDB73DBEA7977DBC4B00BB395C7F82A1E5640BF356FF4EC6389F582D0BFE766A4830A37CD22EEC3CF8CACA764ACB8B254C2BAD44CC7F9C8A357327EB5634C06C1A6915A98DE3A57987F8A67DB23D4C3D4DD55C1EC52C3D41DA6D91D5B2E58C09BFC9B90D5DCFEFD05E9EC05967873B8EB87F9ECBBCF63FC29904FEB64416357E031C9571FCE1883BF9AB0CB01FBA51D022EEE173D397C52AF0086A0F76DAFD4ABAFF44A453BAA7B186E3ED9A1F06B18FDE8A1283B6651965D50D87FF504AE091CC910643E6E6391299707FFB3FFCBD52F4F3729DCD49C24199ACA02A93A1CDC4E384D1AA706051A304D6E1D58D2DC4C52852F552F9364119146BE508E2299E3E7746BB38B23E08928300A9DF511969D33B2738B7EA3FC989BB93B6F1CF16E3F0015E26470B2EF0B620236961944365D8E158234D8E6F16C9DEF55F12CA65FFEBDC69113595044D84287F276525A55913BA8C47F24B3FE533F9811E87D189250BE0F2D1B2A9F94E0F106D2857E130B9AF9EF92D0B0DE4E806CDA45210071B7E1CFE755CDD8B42DF7DB98AE461C1F72C06E9568A4E5B7E595BA2E114C2C538ACC93A0B57B72695318EA3B79DA4EB6F5E2D4C1556EEE38EB6F5026DE20DBDF11F6AAA8A495FCD424EBD4F7030E88F48457A13E30D7423C2997FEB299AF85E107C41E21EB4A99CB7104797478DCF45A2C9B9BB7DD77690D68D0580AFC9DE7B5CD8174F899C3F46A2C4C2DBDC945E8256AA6EF026EBE0E556F38BF0257AFE70426B87E6BA79A9E8114C411D4958B8354C0573DF76549A5A277218D71A229E079A24B8EA19B0033C07F405322D6D4B5010ECED8DF718025A89D64869AB4814F763462B3B744A3CEA30C77602C839B275F20CD85908A78B12670B8DC9B9310607062493768E8D17FC84A98347459D48206C3D805BFE789B0D6A7B43B4B77039CA4136E45208970868492DF67F98436124D3CAAB33DF67F3581D8A7643AE4FA8A72A71251E87350EF13FB5F39D565B51FCE87D621C4D75B9B1C1BBD992D7F39084E7EDB8C4E086294A8D09D6DAF9602D7BFA4019042AE9962D73E8C3DE9D50839989BDDA4EC82339FA4AAA84D6FF280BF5995CEB9FDC0BECE221179D7244864CD458F0507E5366B6F97A0E7ABE0C23FF192AB23890318B8FC4273FDDCFAC44C3C365CCA6E96B8CE4B59352E84C0A9EEE9E2A723E0188D4BCFF87CBCB325D704F8587507E5362717777317E130187D8B2E8176B5117A968463CB5A75744A2083CCF121CACD5DE58B7AAD1867DEF8FBA976F39E7FE96AB5D6553D0E1D0AE0E42637B0DDB34D8139AE94468B34D23A1BD720BBEF2E2D05A030D9FBE4B520A09B5926A19E7248D22B20274CDD5687935B663BF62CCC4DB5BAC79C1D1FEFAEC6587BD2CA86BC3DF38A52B0E77442428A20B1DD72808825F27CE1CC5E6D0591D35F9A968A44E49DD5A68EB55F0DD8AFEE4773EF8C9B140D04E5305A082643B793D76A302A6060A692C207D56A7E96E6C0227C25DC8A8916C59A55C23985E1AA77C36DF929D571E42110314BDCCF77C3A74CFD26556C93AA368EDBD59A3E84726C22824EA65AB3CECAE23DF0C4D96163EA83A4D2784C4C90B7654EB2BC73E3D642B86F63191366A210432663617EE18E15CFA2F7C2E28B25BF339E367713DAD121AAD8D8C654CBDEE53674A47C791F415338DAE39BFA788E1420905B8BB29467CCECD36B053D417C7700C50188F322531710DA67B2B8453DC2D53C9A10C2E2BC24040BDD03F3B453F5A2FB115214CBF47BA8EE88B566510F0DF3814210C645FC886FAAED49FE56B95014AC425540B7AC2F2FC2F9F882A16D33D51AA7DE8EB27DAC2EED89476E4346A9EF303B8B3502BEA72ED528F7CC571C39E3FB099F69F73D1D0A4732B8294421684EEA7751AEFB9834D45FF9549F90A9CF380F941A7D5277C6693FD17537AEC700C490CBC34CEA7D2690B60E4819AF2FC794753637713E8D85CD586467F5193D41BB5C26E5D30129CC6F3080DE9F5D309EFFB29FDD60DE9F4F73788CE47C2EB4328D5ABE6125F737D0050969EC5D834E8872DA51CD7CB839C29AD1876E946B836E85771EA8AD376F0E0DAE8AC7CABE2101D80C14685A7567D4E5920BDE2A5FA3EDEA08D4EDA7BCF83E8003871427AB2E6A9EAF86A6EE81E99D6FA31E1AA4C9F5963D8AAAFF7E148E9F36F8269D3876E26AD93273FEC898564B47C369F5E5426E009E2E23C47F192AF3FB1C991775B457B58D89F9B5DCBF9F2E2CE577ED4D2E135D12086BBA30F1190935389A458B1D5E2A2DDF2E4B2C34237E6F5AFE483606A8587D87C83E69469079CBEEA0E98500E5435AB407974FA467E25FCED8794FA1EB9E973F438BA829682A2F70F2632153DC4E33C8FC0C6F8A822015EE66EEBC3408ADBFAEFE76273F52C36BEF50354CA1A1EAFDCD484782015D3E75719781911F26BBBECFF1FC0B264710A89E85B8D55F605FA4615D5A62C8849574EA2A50A4C671EBE990AC8D3A1DF52B34F71E56566A422C49B5758449624CA736DD58A060B8397A10EA2D7D42C45A0D728293927B74380396FAC2E0425E8FB1827BA63F8DE5DB485DF2B026C0A73C1A710D9CF989595C89BDB2E7F5C31BA0EBCFD89E384770A7C41B5C01B3790F0F4A7F9523F0EA98D495C2D614D62064A7930105DFB0152126002F51B807BE3EB3C65151C97FA741417FD4AE3042669A83EFABCF662044ED6F88F46B486544164F84991D7CCC631C50E7356F33606169CA33F2A3185EAC92F58761A674D97CD1673EDBF77207A786D3F122A04F2B370C2533B4C67D134CFC06D61E6F6C2CCA78E125C7356E4077962B69A656CF09C504BD3AF15667268A28184FA9A376EDCCFEBE74D07DB25841360ECEE84AFA519A3A6D0B9B06DE0ED611B4FF7B920DE899D62B7042255A310B35FDDBFCD5B31CDA4826C1AF4D1B2F3DAEDF75A277B8810B5673F331CE2F22BF5DD99F7024E209B3179CBCC99EF8BAA800A526F77C8A9092BD1462872E5CAC4AF915803DEC4DE27618E89A316AF0DC346BFD0FC309A99646B0E32F7D68A2DF58F69103F962291309A8E0A1811091418BE9E46190A8D29891E78FDA987DCC38677B7646D9A1753737159B0F2E417806829FC8D801B6104AE1F6D7B8CF6C5BDB5525436AAAC10B7106546212EC8507FFCDC121E37855AB4621EBD76D3D9CF4E9F79B5CE54C7A79021009C232B4CDCA9DCD0135FCD029E9348C48055BA83EA2466BA77EABA29968DC9B550BE8D64368BA4F55EC7B23738ECE336E96770820D284CBDD4CC4C486DAA01B2BC52 + +Count = 7 +Msg = F12B3FB641730859A40ADE1DE584413F9D14E6C9C3BA11D6AD6E552C804325BC304BF8365225838833F177416749DAD72D32E4B6AA946E37196909D31DDBD960E522EC998B0BED78905E95D242D06E63937DFF4D5F6F129CDCC01DE81BB06A5818165B455D414B21456C254CFE9CF448FAA6409FDC8B01760F4FBCCBEE045CE0F33DB92B7529055132DD08F349C69E40CBD4EE756FCA7C8C15E5350D85803340104558C0E3C8D3D1A0EE6DFE830D2D49B17CFF1916E67029C12C168FF3F7CCB1AAC7E3046DDE5D02001DD5805C7D0907B8EC5C0881192A29D42FFEB6B243DDA822BC54BB2A28DBD31FFC19F911F0CC43230ED7079AC330909DB9303EDFA650BD3F2C5EA0294DDD8F1089E984003117E462BB92A46BD60D5E8BC41E70F89CF378AC5BB9E4912C1AD53048F611D9AC8F6BA14CDC2313AB51691FFF14652F6C96739571D7A477335235A0BD7323DFFC84DF34B2CFACC0D064010A50C59118B5A6C4B1837B68D4EAF46EF9A68356372D8A237B34307C9DEAB3C50DD69A276DC01DEB16AF725C811C0B49BE60B2194C0DC9DDC6A216E4842927C7CFB55BFD50CD003889973F88BB2EA15F28E7BE3C379979FF0CBC61CBAA3966EC87AB8CCBC00EF9F15F7A90B4CE41229800B7BB9D6BEA90363C5CF0936C358E5031520010A2D69E1AEECCDDBD08C431CA9AC8CBF27DC9819D1A558F641D65852AEB40837B4111F62A18A1AF9F0DD22E782B25F8A3699BD268D162F54C463AFC8847B2D1C840B58988D2A1DADC19E19048271738F86CE1C04F6E1BA9DE1CA9E3DEA526575A016537759C6FD0C8C1F64EEFD2AD252F01041C65F18259240BAA6C29BDFC37F28A3546C1DFC25BFC11F88E77CDBA0C6F84B3DCA00AF1687F0C126AF203A60AC5BF5B659C6663503FA91F54F9F3E257519EFCA50A2096E899CDC7B5CC5868F86AEEC9B871556F0920629DF7EA9D6E8B29BB18540601FFA42873CBCF9EAE84E64026E90B2A29E6FC2FF384A7839EFDFC5E3C8B113F14F269EE248FFE899F6A72DEB6B7C4B36360FFD51C25137D57218A76CF70622273A62B34801D069AE8738F8811C9CCE73948FBDB8B3B23EFDEEB96020587B92F08506B0F8C8F33465A65EDA9958B6C8E55A23D8675869637833B569486049460B95F80C15DBC5AA914B581264E7959537F07AC624A33BA81B9348C51399FBF55D18CF0360AAB3099489371BF0570E809E103147F57311585A5FE07292F097075F62B55C1892348D4D6131AB7C1FA7B494B826F358A3FFD9F776A900CA307693E22FCC9DA1B2780BDBB40A844175EC4AA83BDDEAC993AEAB62DB54A1F933C30CFA9DB94C431A12D2402B27A4A96B88719A5E689E629BCA4E81112AC65DC612A7F0FD99B3BC9FF78E190B9AAE7BFA01F742E3179ACB24AA5ED36ACB31FF5C847A187FB3BBD1D4C4FA66DA7566F12BD2871F23737ABE77DCCC433AD041D4C59ECC771085FC4646257E1E1D33F0BF435DA7984412CBD909BB90A2F76896F47315913BA8EFE095E640C90E055C9143DC0D0FDD28B990A2D2E36D54E5494EED8E79AB0792C506637D11B20359CDD3BD2A5CC6FA58B9CBC984FE58C5728BA09CF1DB7F9BB199A116F6AC5017079D49151FB03A98824484C4ADD172A46C40E0F16115017E4E480B80ABBFF3BC59B4C1F7A543A5C241180ABD46AAFDD0170CAAA5BB6EB5E28BDAD6D7A4B9ECD240D87AE91F8AFF289B2EB0490A5427934A2B799F055E00FAFEEF6BDA6CDE1D973B386C7E3004C08C1D721A9CBE6CD837A3338D89304DCCF2D77FEA202F24BBCD01191DD1E7A963456AED818333644C8207242739509456ED7B69A6C01A906CF8C64D8B955F064FF9D0381E52CC49BF63336818FAFD827C7CB220568E02A33ADA8088CCF5E8A73300E42D691876041131AA438CB27761FB33D10EE32EAFC1F72D0D43D2337CC97A9C251816C01963F6BE1F24D3BF1688531E9D8924D9B4046112363C0B3231DDB4E0D8F08D6F5B2B2A7D18251F7AEE381684E0B3A5F3A490D820B6F499ED58B47C317FF2E625FAF3C3626EA7C19EE4E6340E2586518E27C13C38185CB856913D1453B8DE0AEB41F089FCE04384FCCF493BC0C09BC7C262FE09AEB6BE0D9E3B6CC121837DD606DB48BC24FC549DE43C4F68DF20E796057541E0BAD45C2493E2FBB183725369516334E577DF92D61E60156277452E7D53D6CBBC418D2B327F14284200A31A71D8D6177BEC022E25E27BD24ABEF9BD4EB47E6DACA6A727C447F26653B750D57B55A389A13DB28141B895D9C5BAD0838566D98D82356DCB31AE4323E99BCA6E819666F50B600C1101FD1BF400DD5219677ED0ECEDC35335F7E857F2EA8E97B5FE27482F53DB78256AC88B852979BA645C29CC7ABADD80CE43210D2308192673555605E98522C58C06BB822547CE1C7E2DF3A6B0C22D0B10A679EC22DE452D5192083FC373D0DF296430640F4B6B8685048F05046265A1285AE5330B4692BDB18E30833F8E590A4D248D5C91C8FBC53AF3671E4F4018EF2C5707688E9DC3D2C182A2711AD846F6BB84B7EFE5191F6F6F100817EF846E71755156D886F07BBF50AA8B0F167ABA52BC6062CA98290A1347A8097E95BBF34D24310BB9816E7FCB08F88F3A8E1048E455A55B7F2193D94C473390DEF70D19A4B74DEAE57F00D14DF097C19F99CF95275F1518E050742B8057BF624DDD90D3FBEEDA833025636554C41D8E89C239B287AE698FD1E4295433225A8DCF9E93705FC3C5B0BF4C5501EBBFC41C42F5A1BE1E0CEA9F6410F207B586401DCAE595C630AD2EB60C88F34B49679412200D114D80AC6FC2A3F40C4EC1BDFB38FC37470619FDEBA5C6EBB195199F560C7CDFD7A875029D2E85D3124C90DFE44E8DBA5F02109E0832217B7694EACAB914AE0FD1F1E652C3E99A288046EBAF04F6F763075F4043EBEED7A586F98C0833BB2A0DAE910DF2683AF66567F80DC14682668FAD77C359C45A13F31A30CBCA6D91F4D51CEE0073E8F50ADC68DADBF3D1166EF492FC6ABBE7C039448D1AE8376F3C07D60338A45881F2A6A87CE6F0E98E101203C1D727613738ED5CB4BBE6DE1CD36D2CD305E0A86206729055B23EF0DF4FB66CF8D4659804969ECA4B57A3C60BC88BA989C416883F79A1BB54970B84F9EC8D64F589D5486DD5283C77165D1A62BC949D3695770B393E3D8F32AA437D9B19C06ECA3EC081F3433BA49BDA01191C8758A8027E4E6465723BC75C4605B391BAA15D55FE4023EC12A9E369D26F5F2D1462AB519B6B2CCB6BF958030925AD3D7812E138B3C32E4734BBFFD46AFA9302DC9A37E35A61F64F8491E9F4F820E2ECFCA5F1CF8E26795134641CEF7B4850716645266EEDB9E3061C91B411E9394F13D902D7B508D384B610E6AEF65506C43C31789EA2FA73FF42C2EBA2FC7267780B15091678709B6882C0705E071AFCB105CD77D0609AAC19550394F22D209843B96E93D14BF05BCB96000BE28A25F827D62A9D2EFA87076078FFB164DBA94B62383CA498772B751571BC3A609EB99F3F1B6D2BF2836949226723585C3EE6EFFCB4A9BA4D716FA0BAB587AD3E5C96D1CF5072596E8D58DECEE3722143C328D68ACC4DABF50F41BDBBBC713D0BBC1AC5C05188FBBC9D717F6BCAEB6A0F3E6CE79CB122721EEAECB00EC4ADA20C1BD302D8AC60F24A2D19ED5ADE402A13E7BE7D5F99A05A99A8B6D564D8ECF7FFCF634FE7D89152CD6AAD6F97352730AAB29C27062052727B88793FE58B8D714011FD8B6B00324B566BAFE4FC30B35471863AA23CC5F1DF7CE0C46F6F616D41ED3C2F85479BC5AA8050D09A706D863AC524BE6F50EB347A101E0E8A3BD2EBF50E6E07B0113E0CE5B09021DBE5576F0F5A99AA4AA2FDF101F7A565398D4B6EBD74EB9C0265C6198717D8BEB0B96894C8AF0F2FA228A142007D05C87BD8D3586521746709BB5CA984701322DA3F30488F109C8A8E1BCC84D3A99B955FFDADBE3470598F35018B0D4255AB22157E67C13CBD496B3C58CA5964FF83602FC75986D254FE59E5A1038D859F3838709A6F6531CA6892B43271DBB5F02A457E2AED8B0C145FB0700DDB8BB9CBE5AD2081E8CA802E3E556EB6D29FE312A3F586BE0F6AA1AD3C5C3AAEE523FEDCE8F85CC4BB24175FC54FFC982C4541BFDD6D69E604FBBC8AFB73558C9FD1490A6681DDDA431E578FDE26F8BF6E1980F71A7AD187CA08D7ED3BD1C947DE9ACFE406F2219A67677CBF05EA17DDF30D1CE1E26E62150FC1305DA9E09E71450FB1336714A87BE7E68FB30E1271EFF109FA3EC4E7656038BAE445B1C3E076C90B79F628D466DE5490F9FBDEBF06ED4F406CAFF66FBC6DAA410ABC3062CA23F608E9F2A88BB71C931BDA23FD698179A3F6F661574080695F1C4BE7C9BAADF1C6D5F5D5C51434C389500CDA85886040BF8118396C58CCB57880A39C3FDF42E87DE85D1763BBA48FC232E80733B5D3C6AC0B38489264857E19405D4460A893BA0D246C9D2B58DCF3DC88773970B571C2ACDCF024A70A460962EF0E136E602F29AF2DFA1F5936AB432E346C19FD5C0D53DE8AA783A86F1302DE533A4C4AC9957C595D8A52CB52796631AD0662AE2C1C06E1BA44D3B89B71400AF730F60C5F08649EEFB0AFC1BA887C1131520B58A054A247236A9074C1B3CDDC4A47C4117369D2A4A1D3BE7B6C453721C8B2874975E75A929EBED8F477EFCD2BF2C38762B46A9DC77F56B6DC9636DAEE336EAC0F3C846652ED3182C490DE3CB206927898BDC46D6E24BFCA1F208DFC57D3FAC10933BDFF7E6D347582D7C936912A04C603CE42306EF14DEA7CBA47326F353AF0A61D237E58A30A3B895EEA966B8928E52BC7E89991BA5207F5D372B41602065DACC88083F6867D60B406A71016A78EE3915206A74CA16EEBBB1B887520561587488CF992F894EE954A87D58B0341E14E448F12B3FB6F010B59A4C8EB0DF8405DE12FD789BDEBEAFC73615CC4CBE3D8792A3A209143618BD98BEE3953DC039752478799E37A679068A416408A023C4F75CC5FB0C3C7AF1A8F93FE0DCFB297206FCA0A8D3449F50EC2A9C7FD2D1101D74FAEC3877C52C39A987D1A4F7C59C0A60CE5E0B007BF0B2BD750EE29FFA1ED6E9226BE10EF0FB40CF67FE4C72FA58268D921E0373041CF90A397A02B74A99AE68FBBAD45ABAFB6FD31D3B997CA440C21CE7540DDB1A62E50672D7D576F98985CD50E3764083CCD396AF3055C8827C66F9B7E5CFF58BD24E99D5CEE8E226F9DA94B6CB2CC0C982991B81772CEA0D1C83F571DCBE13B98F417D95DD6BB4E4F06FB556C012B750A52F354CB47414A5648BB84BF271493BC6DB2689AE2BEB16E436900777944C0ACBA5CBAC88C7051A2DD73051B269F17E257A8FE5EB2DA179441E687DE40C2ED03FAE7F4CA59DB2FED50C5CD7FA99637A4411E1FC04661E9E045268695F873620A8601204E9A4D988C79010DFD1C97FAABAED38D22A31CBD98FE1485334499F4ED53B2E99875F919F38583573563FCD3AD2BEAE724E64F677953875085C85547DF1C10A959BE5225B5B9899D1FC578250130E80759A2CFF7045B7044EE98943B304B7829435379EED9B5216B5CB247B3DB625F44D04DFE3C4C29950E4E0D472D255E5CD44D5EE1BDC7092DA471649A5213CC698C395F6AE25D4BDD19BE7BA0CC7E04460E5563667C70A17DD71049BAE79F32FA7193BAE3D5F36A86F181C7FF5B5861267D2E8C0CA055FD0B97D183D20380F58A7B712F38B310701AEAEC64FAB8B2227EBF234DC903365A2BA6BF5BF46F9883709C4D73DA3928735CBE6111C3E0F252E5AF0512E0433C774527038203C47BBB4258F46E7B3E584586AFE10AA214863AA45C76555A85A32D5FC62EA325A66F9832B5DF6AFC93E7A756CF8C306221D52090C8DDA74E2660CCB5C70EA51FA51FE03048D7EC452B3E1074DEFE8AF962CB3DF10E125CC8B84A1C4502A525853297A1AFABF01949E8DB759ABD327F27D5C352FBC0B40192B31787FECB973286189B32475CEB5D72B1E41822ACC21B85DAE47F4F5229B48E861EEC94781A8E41A8EF7221F037DAEA75D049ECABEEF5E10BF223D727F333EED6B3C14E0EC90AA765C689BD5FE995A31984C971EFD7D29718FB8875F6A729A5BB935B3C769CEBBCD5A276D5654891126C80CD9329B1FEFED12A25033084A0BEACD3F1BC8E593C7CA91C9C3D610D21D05A761975E9867BF9A46C5B4C67E88C50F1C8389146E484134440FA1D25B19DD3F854A8CA6B3AD51668081821FDE014B0903B4BA8D4908965E20621989C5ED3E2CE8744033FC1E5B6E312294EDC5215643C398CEA75F50F67CB32D865193C8A0924356366AC0180DE5584B5B2674A998FE0CD6C62D1F96CD987EC47FCE9809DB698201AA6FEAEC82AB8BE94E13F4CF080A958845BD017373AC889EEBFC983E4D4F70F2A473FF28131F541AA13648B9A3AFBC75390FC41E670F8DFEE74C0086124C9BFFA3022A940B6C742568E7D13D64CEFA3C4022053D8A528A94E50041C71FCE08549A4816A184276ACC9B9EB5803D4F9A1851C445EF475E74517896AF0A2AAD069ADE7CA31BB859B718B838A2EC9D0956956628765A88180D3BD3C429EE7860A1ED971AA1C1AC7E5FF70C2D370EBC88B46E3F19A30237AB12C66E6747F430C9A05897B454826895E9E8C97E4E5BE1FF7F4B10BAAE5EBD9FB6EB07DB5244366BC6428CDE7607333106A930BA38B85DB7E56FE8FBE4751A429BF7FD687B8C43A4B15DB70BCE02887718DEB4052E0266FE8E50F6E25B3A8751284A437F0ACAB679668B08DB0152E8E2E770E305C115139890FFDA2A96604976D666E384BF096D4E273B9EA3F98BFD3C6813FBEB57818F1236AAEE0BEF8BE2064291059A6E6323DE0394DD8577709F05029EC283645D1F54D6D04E141A625F9B599760678662CD04EF1DE7C3A4099BC50BE80951C95EA1E472B0C49D150EC3A134412CDF0F377F9FD0BE9347765BB0CC35880931580DD2FAF57CF5D59E2FEFE159458E62DCBBB5D36969800BCB5A6D1700F7688C059148266F32E99342A901A0CFB2ED30CC4DEF7AD236C7EF8DC72F9B0EDED4A6C762DCC8FD67F3AAD22291C067DF3B186C3D4AB207EEBACEC95899A7034D8464D45AD96DD62533655A45A7AFA50788AD8B162ED093219FD9A70DFEA4CD4BA6849D2CEB0C06CE42470AE458C1460A29C2D0EC1CED1FB3D0B3BB00C5C8278E970F9F2311781C7BA7BCD3E7C6AEC9DD929CE33CD3E12FB965E95C3850050979207B4D482222F8B1A654455F1937ED21E9DD6D28E5EBBAB6E0E5BE281CE32AA1B25AC74A6180BB6FA432957F9BCF9F2DFC3A4E7298E19434C097683C64D095C229A4ACBF70A2C06822FD84B2553B1A1046902BE195B808D1C59289C9187E0BD39DD355F722E0BD5A7AE64F9A5DE1DF857D57F6D3A5B32D719BDBF9DD18F650A4F2B01582E623EE65D3D167AE686D74E4B2044CC087372EE9A5E35B47E6DF418496ABA8ACCB5D9E5A699000D34C7E092E66152B13A98F1CBB822BDC02C7A67FF48FE218BCC5C7185566F257F6365A9D27DA2DE1D1B42DDA068EEC2A9F819C92C3110C4469654C689EFCD5ADB6372584278EB5289AC5AD3F6107112ED89D78D4CA6094E52A1633C18DC442D5DE8023CF68680311CB73F7FD64CCE261541E8F018301E356A34059115AF49BD582D861E1E442C570996708566896805D33D16C6E344051DC9CCD2B270EF1B6D7D8217B8C6B007D11581F671CF98DEE0DC0FBDD88872CA04286844516179E61A8B0307E461BF4F233545B1515D835E20FDF1D6712132D50AB803805E7BB67FABABDBF6CC90EA7F2CB09AA342B168B6951A13537F9364F9482E0D2C5E2EE0A77EC615B5719C91900372B9C0869F82495F5CFB445852F00846E2AE9E83CE20FDCFE3248CABB334F888735FFCD9A462B89BB3DCF123AC5F2BD60D6E9EEDF31C3551BBF0936B05AD9C17F2CBE4F3033E928FF5F2DFF12FCA239408A6AE44A60A85671AAB1DB3CF5D961630E930D06A28D2CECC0EF8003C4431E1CCFF525EFF4771E8468DE85810EEB0A86CB9C046994339EFD3DF789712852AD6693BE6CFFB3726E9674899EC407ABDED4E4F938283FB5879C5728B2FDEDAD5C15311EEE507F0AD3592D6DF50B94D9F69119B48C2E198427DE36CFA88ABF71A9C72D8893E8BD8E55DA26DFFAD2BF7C077D3220E338202DFBACF71019AF624899BCC42EDE0B460DD48B5EB2083A89551EBAC82A589F8E70A6FF8DE6F0AD74A677DD453E0D909DFB36244B57D96E25C022A2F15EE737F0FA2E5388DE7E5F1D2716B83A2AF54B478D1CCCF43453369638D9CCC44EBB16BF40ED4B10BA08BF7DD60724402133FACBD75A63411A42BBA6F7BD4F04B29BCE6B00F9FA3DA93A8D845D4E1D2D2FF67404DF00ECF458D4A4FD31A419FCB9BACB3A38B93F2839BC219DCDDEE4CC258E7701484B25B1AFD9132C54FC0C052190CBA383E3F475B64CCA22DE4F2779F0D8D8A22D17B36D95198B5EA513D33CAF1C7B3C134148419A014BFB8002D260B29A3C7C2469D709DD5D0E695895CFA2798D73C2D3EA65AE8F96082BCCB7ED92472AAC0BD756184644725EB533DEE90431A882F28F108DC8348DEC8E61AC3C25707B222DE9C4CA23752C7D608BB07BB1AC03F92335FA03369DE3D74A698AE598353944B7BBBC1B6DDD5E7C62932C3C83113BE15DB218EF7577EC9005EC80B9EA47E42A526BC3F6F0E88C46D77DA1A370A753382EA887E61C49CF40CF2B16805CA5921AAE01E9184E44F17426D218F7D6481F5D99488A41BFFE0E089C8327C4D20BE931EB86F56EBD3BE9EAB712C04A31D769860BB8E7141A505AAFF3E17BCA1D2CA21AE9E60B5053B19F5D5EA08AAD3EC3D6C519A0B91924D4179B2B457BDCC01FCC8B70A5604BCB19325A1889B57AC6AD712F0AB5B07C7389F614CF70240E35C39D3FD4FE3C98628BF9006E5E019A1F9DD57ED34BD10A6E4F18E7AF4C7C5BF4232454EB75A5C770D8CC7FBBB00E14875BF5319AA63AEAF292D184E655E9160F9E0B4A39ACAEA9F70E0DFB7E524EBD41035F54574AC04EE93A6258A421E01AEFB66F1DA4C3DADBAC4B3A8C983F6BA0441343E3F695BFC5DDBD61FF4A5504D52DF30CC8E231197D2883A70B0F34B5A9CFC21490DDFD2359F6AA3FE661DB915646645EA533A2BE12FAC5BA73EDB4B5A907B82F874173F830CFB2D237F2321B4CF151C4AAD50F762C0302961742B06C42F5 +MD = D906D5A636C9BEBC03FB4B21602C578B732E729FB8EC96DE6FB25D58A8CCB07DE382E52E0227710300D4B533BDDE833BA02822112C1F331B5070D150848F3C23BFE0746F5E962623B4B600C29AB611C5A9A05A7C67C2AD34FBFD727F65265AD7EB9323E699DCD416EBDB8C7C06092D591A1134AC75F303CD99C54D6E47A98846DD66113BD5BF6C94AD6BEBF9522CF82E047418BA49C7DD243E5FF598EA9B30BBADFAD0857EA7526A8C554F108F09D83C354F3F11C2621F17EB6E2B47E3459E87E69F110CF7B26ACD731DD417F22AB6B813BEB99E2F88B0C2EE06A8FB9D5C82AA10CD7199E8182565B73226AC2E3643C8A2C64C5DD3F02A1984C2F1D3389D8A258B4365D1198F57157624DBC3183BC6CA3DEF716097D0581F5A9BC43C37B63D2F8294C5771D1498D969DE9270590E204E9947E466BC80BED452974908C4F60A2C54321B4CEE177FAA9A649517DE90BA0C47D0CE56D9DD60FDA5C3A8CB4E7246FC42614C3CC4BE61014E897BD89B237B43FE20172D13CE9CA2D6553979D5131B7CE4B39846B4B324A681221C47E7CAADC999F6EF9546BA299D35CF524FD7C8CB542E648521BC1F8249FEA10B0FC253EC3FAC8ED9EBDA17FF1E3A97E1B7A66794C76B1F002E325C776D2ED46C69C085C7F93CA91C2ABCBAE79E11C494E4E7D6F4BDBAF32B106CE02248FF2EE802A23C8136D86C8E578D1A6AEBC76F2A4E3F964F61C3E9FF14AE548B5949CE83412845F38083376A359F6FBA45B268E57F57FB60499E13474B859F66A9210D9F71295ADFB123BD8735BFC8505976CB39817D5B4BE740DE0F60CA7D2A756F8E0D61D0DCB2FD3E8B55E6A3FF8944B0EC0DBCD124FE3A976B2028703F4F1E6E19EFF29F690E3B8B5DD5810B7958A8FBBF0E7194FF0D0D415B7141933B32F605E008BF495BE3823F2BFA8340E7B06395F247DD21DD41318B43700E1D1CD3F1255BBA2B48651F21D044BDA332E5981B7DF7D9706D519EB30D886B4D49231511118ABC6361947AB68CD683E0F454674A0B28E726FBF059F70B4425CAD6A8548B99C30330F59561F2D276FC67A276BBC17C0DB5E0DC1C35D58C2CBBA38AC8B4D68186EB745ACCDA4AF177ACF4D297C5F34E5BB43C4BC44553B20894FC347DD480734B330A934E0B6F803A874864FB684ECBAAEE867D49A082D4A735CC7053F40C3EC8824EAF5E70239B5F16A34DC8C69D3B5AC87E0C25575D20FA410CD9F83EAF31DFF11DC3BCD645D420787AF0104D282B6086BE14C535AB5E2BE1E5351B400E1B713503B2C15F2717554ACA7F97E73BEA7C9AD08C35886057995C1332C2D50FD5BC20FE862E5735BA07002C9CD6CF9ED4EA76476BC78541A8590EB761B17AA9A5ADA893201199515CCABA7DD496E42CAA395AD6E03C046846B783F98F3B1E5DE7B48E8204467F86F4B074EAA3CADFA9BAAD36090DA4A3C174F03B4A4AF4F679E01C32D6D61EE88F91431F64A844B2417A9039C4155BDB66E7EA1FF63153E415BB7D2DDB1303916BF1E16C11F18FA5C6254C23F3E949AD216EEF7D771E3EDC15E9CBB447EC108E69C281BE8CAE4486B2ACECB5179C33E435D54A1A16C145923CCA10DB10EB4E90AC9BDB25426F15C8383F1EC61234FCDCD5E6D080A4943918E56BC2764F992C5F014CAC9AB9810142D45F9EB4E1005F6EF8CCB63676570190E1B90F3928FB4F0E1452372446B4FA35549D4A07AF414164E66E1594D0D2C27F2D513331149E8240150159CA43E7AACA4C4BA5B67D995832DC4B7022A197B9D52F364032BFA8B16FC7D313C600EB4EB5886F0F3C2EA26B1B2ADB6FE5E7D9F60663BCE7FB6D5A7C35E450E98FCD373317BAB858CD3A46A6C4BBFCE6D2953398C1ABF999075D8E536D1301AEBAA6F03FBBBE97035206AA65A7D4D3BD89A03BE10FAD4A3F32F9E34337C4B82F2FAF470A015DE69C637A25DC678AAF668733D28062D6F216E6B906DE94434354063D00E89261B94DF90386CE773D45629B91B2C8F0F5AE4C1B1081E0DFCA77EEFA008AA62CEFF5D7636161D2EA015E4AF631321F97E921FACAC45B4339D70F83E732D68E38ED318BE42E14A22AB3B5D713A2206110C7A38763F90380D161D72A415051B5BAF8EA3797B20F306EE768400DFC6912223B65BAB42BF75D51384C9D3F4062ED5BD2E1C82D0604D787C0A725B2BDDE00C0384E556B215953AC974049026080B145659E714410AA858FDFE0657CA797E1FB19357D54E2272A481281CDD891616B3F34AC90CE34671F8D4567A8EFA9BB47BAA83F9A8C395802B54D7ACDD51D5458B10BD4D04128DE0A5CF10A3E3899C6DB99364D51F6B6C2D679BB0C89B9F95244D0F94D + +Count = 8 +Msg = D0B4DC8C5AB5CDAD5C8034C08529C4FCDF1A96541C1C134487C59287333082F95E8A035B3093CC0DCCC31E2F4D7A0CE93A3A74CED943F4B4A098059422457A2CFE3B62FA2568CC4B4D898759FDE4F60CB9A84DF8BBB4201B954EBA988E38EA8649F130121811C3D16E28804FBB9BB6BBA1F9DA79F88170491A4764D6AD33BD159F000F0CB3E3F3A7E57B8A9234D05FFA97FFF6955D708EC880E6F7D1ACED243B6B6AB0BA8BAA07BD0533947DF6DE154AE76A3EAE3C28B82F72478BCDEC22FAF7574F26C91FA56EEDF7398F2ADB10D1A2D1ADE942AE75FE43B28147441F3AD1E2389D26A7B74C2A42FC51B703988D536275E8FB3E39B849E150E3179E5D29CDBC67ADF23EEA2AEA8583A7455CBDFBAA242DE5CF363E93A97F534457D3348BE4D284FB9BEB9B15784BFE76BA9172EC245439F270785A967DD30372EAA5D31750F8C372D8C25FBE88186C8438C8D9180C6620029A421B6B78ED7DC8E7292AD277E726C2CEFF1362F47A6A570BD55EB5FAEB658385D07C0DDC57FAEB4497D65FED9A0C51A117490D53BD0D1FD8C360A28EC8CDFCC4A74DA66A19E57705281D5DA30B6A71C90C14E2A15830C7C35C3519F7575C7CCADA9A464C65E78832D2072A9FB07CCD59EED981B3EA5A6B7685E30DE3CB80ADCBA193C970232463258CB0CF50052713E068C0087EDAC8DF802FD0C782D9A46652595FFE1DB25C35CA755C27398A1A705DCF2C7A0B772FF0D9B34941535DE04BE74A7DF7A629F62E0B8B3E087EA0A5F5145F69B3AD2A5BDA296E2469691BE16C951040EF0D23CA34D8FE6E7F392772390E532CF4F32D9EBDEEA2CD37048DC4F0A9D1736E5FB5E7F09435DAAEBBDBA101FCEB5B15EEED78677183006B56932F4B3A7ED667B403D9586C3B5FBE53EF021300CB3A1931AE01BC580BFCDCB57B9A01068F743C04394DF91203A9B38DBA148180ED6A8A5815198B7D1A0FA907FCA3F0A15EB8C37AC50EC77E41072E054E2E9EF77A5BC71110A8F075E9BFEA2AA3F21560B8112E015006BBDEA30B170EEB862FEB70B28CA0DBDF90B6C84E9106239CDA4FF1CE4C3C009CA673A0E86D0491E189638FFFB9F1657584D98178390175B4BA0631C71D1D39F3EBD30B18FFF2718C24E6C42E7724E3E8E97B4973BA8763A4FEEC2E67D3C9C46C299C13E5E64D759267F553523C463D952348DEA1D4C638646F661912C40AB85B225805DA11FD029C06B60BC5331168B7AF98448BEB22986264AF76803362CE5D3CF82FE44162842545419B1DBB72305EFE61632CC52C6FFFC0A27661878268A3E8AD883AE183764C131E46A9877AA6F17E1781D1FFA1970F8830239EEC229EC2D9F7350EE9F57D7AEB1718A7E6C67845FB84E2700097A4461579B1B15FD75FF18083D08F449808899A07E5E789F028C2B7DDA3683F2EC24153EFF87043CB1A14B7272763F6E801627C59D5F9B1BCBD2550EFF98133F6B151C08E3B559F9745CEEDD12F61C9C4CBCEDC40ECE558C9909631D32054D298E0C176D5A368ACABC3E414070CDF8C5B5C8B232AA5F30ACBF9F7FDA524CC77F1FB54F16EEBF3216321317D07D150BDB00AD6779530A7F3ECB6AADBAB6A0787F76D220CB7EE1E6F6869BF09737602F9A93A4C9A4D54E2C1546104B7401776F919AA869AAE4405C2EB660E2B709E8076B4B132701D6C39A28B61B756E9662E50F2C6EFC8EF684A64358AAFE645B650B6E18D038FE406DBAD70E30F4C8CAFD88538BE38A9AFB7864C66CE3B93BD535DD41101755B639E6BECEA42570C59FDD785B12AAE877DA6072907B72916CA48EF1D863A3B8B3A7D2299524CBF6D5F7AF368F6B5E293A5D5566AF94B54AB755422A2523A851EC24B4B3407143531E79ACA8CC4C12014655B78B1E3D192EF287624FD291C1A25F5D4A6AA6AAE8B90A025825F81C8E7B3340D3CF6C1D43BF0B95B0B91F03708CB7FA497EF1B76A9B7CFE810BE4F326E608F70C91CDF23632099B5F00FA2FA9F681DB6DFDC31F797BD638526D9C37CA087EDAB027F6EEBEB5C41765665859A15D548A7A19853912E97D80BB85AFC895C1C146921F6F81FFA31CB839ABAA03238C97051911CDB08345B7C6AA76333915FB7193A501C791EDD28AD70CDCFF774F6A6D2EFEAABF840400C35C5798D7896FD3A23E2A066E11C4F5174686E6B3A64640873009044A6B4BED9F943E6B4A44FB0177293AC14D390C5B69F983790D2D5D2D16071197806B9936F23C76C9D359BAC24B857F9A7B75034E23AD9A40D7C2E072471155333363710B8FF3CF00C24288104EC12D87ADB2A190F3D363D2C1585F2F5BF472B204779EE804640A77B6027BE1258A02169558C4946FB44F6FFFAE4A3794AFA4CDDFC61BD722458349B839EAF15782AD47464889F33FEE4240383EF85629C2D3065DAE016F7E2AE45FD58ADC35D94E086CF102E15C15A19DF173CB9EF35D2D1FE556D493A9814DD92B543A2DA5021C66EA268B5526E186E0AC100FEBA28BF0F2B86AF6EEF4BA5EEBB329C5F7EB83E8FF6754B4CCD1C7F903CFF3E7997152269F6337754A0B2D723FC79F91FD1B9F05282710744DD73420E061F31F00C2C57A60F33694A41EAEE449E284F532260BE830FECF6250DDE8B82F1684D8180E616D022530F9E4FA5109882C3A5B523EEEBA661AEE12036319831A7E659D89C6DC3B8117F30CF5020346ADB5DA24939D65E027DA620D205F699F1BADEF6684B37FC1500EDA3A4BE1C55407A7744D88E4FF8D088565BF64DF0B21BE53F147229CB1EA3618D494B33BA446050DF588DB1C0626BE526E0F4DB06C7103A87BE7E07E317AE59A0770105AC9DCD12FBA56E97256924DDA98D02EA29C85BC53811ABFBC5596DC7AA3410496065398913E2E0605978151E9AA15E5614C42FD81C3CCC9BF1D24CA137A6EDF058DB7D435379D747E7FA6BC0FB8D6024FB17B2E505382D23989D9740953E28B28B24C5BF231A029BECE8F021D00C9F647127A620F407EB20AD59AAB6E196B1A8D1B834D7C8A101E01517F91D470B528CFE33CF6E9808BE8439A411CA704CB95536484F18D8C89CD026C60BDD0DCDD9A1061EB7AEC74310C9F9AF9D238F3670C85DA3E6FFBC3AB33697FF47D1FDE1766BCB6FC451940B8EF337861E282A7840F056427F6AE7DAE5CB6A8116C8FB3ECC1839325820721E345115F3C7351C8B0B1EBE577BBB610C84F189F8E612F4C5F7F8BA05EEF820207D370D2D54F412B0AFDF75F709A4C311B62DAE66967A37215D50FBCE7B169C13FE9ED944AD33B78FDED948079DFDBB5335A84FC14AB98903FFECD004F84334994262F96ACA7E6382751E87BC3130846094A899D2C6DAC94414D645C163B3979BA5AFC43A035188B645CC4C2B31CDD1CF67707050A961D26898B456F339A21FC287EC16816B495C431FE28DFA8D9D134704765AF24246F144DD5CA24FFA957CA2AD8AA445B650631D142D30C7D3D7DAFAA00EEEC3482C7F40FBD2A40FA70C488A65EA4D03F9CE90B4123CDE15152A700582A7AEECA6B95A800B6449E3AB547507E5A661E88AD601D27D39B00B4E692AD0619F8D005E5BE3AC90CDF89484AC09BEC6D6306FC9887AABA5DC6E6C084E31A13A79820CC675A989C2B458BDDE6D4ED030F2457739BB07D924E15B82ED77A4419B565A0B2AFCF7512DA6AC152FBDCC388E9D3B1609BA687E71A8E8E51A279B4B101621881242A633FAF349920EF2A9661522F44F3B8D38E1EEDB9982141237060A6004199C44264BF7081B1670D5707FFE81CFF7334C1082DE409936A9231FE7BC4387AEED90CAD0FCA85833712271186B1A84934240D3BE4F823B5BAAEFA2D4E934592D4DC1916DB6FEFA8AF3DD10BCCE81CA8E9F8BA47B6FC85E6B556E260D0684493DC844CAA98816DC444549CB72717F8C292413345D8FDEBD8563261848D8ED836F93D2F38AB6200689AF603626FDECF9D6E1FCE8F34FECAEEA86454661FD946B57C55BDE9F8B0273040CABAE2EA79687772D4266DB05901FA724090370DAA58B1BF4DE60A10D5A4BDF89E4E6A33E7F42EFBECF34BB2E9052343C377A81FE022967209339C836E569D3F7865221AA7B68A4C613B10A71D0ED648C2C65D6DFC9E186BA7F83AB4579B9D86661C4A73E318AC0CED5BAEA501EF650A6D53C0A8092F32DA4CB662AF7BD5F4D5AD9A4100B45265BA1A508090EF7359B893305703DAF58D36D960272CA60C810766D90777AE64460AEE168DA89E91EAD95CBA1C4B8EE10AA80D0A27442B49141DDF893A067BD21A3EFA4C25B477E49837754DCFEBE0457875DE5F7A943CF1DF95027FD91567D46D7AAFED4132CB46302861FFCEDD79282D9A00B4381C6775F1F86C80B1F80B82CFA0E0454C02F445BA982F42224D22F22BDA524F14B3AC411329EB58D64A84381CEF202DFD23EC1AA5CAF9AFED1543B4C57A54D7A5CC6E0BF49F3212279B7F7003E725431D0504F7FE37A959CA0C63FDE626835BE5AC92508124395DF1C9F30A4B899BF5F000A7C0656CE96E230441F83B443C0108138A5754D4B1F8CBA70634449F0E30606E0DD57EC2F688C3343D7CD24122BD8DE1F237FF44A11B5EBEF4CE66A51983F61187CD366682352D018420A735168A7448A6529CC6312BBCE286CFDE28121E1AA976C0B95577276FBD1AEDB0807419986A4A1E0EB6E72FD06C0053EFB266F4EF7605FDBE55D12ED18EF2EFBB536B3C7E6D2763DE041F53C246F05D452347AD5625FE4A7A765B42892B3C8FC407747CF0D3D5729AF316EB56A23B675583D9BE374589955520B1F811E4DAB2C79F9FBAD2735C714DD512530F12E3D84AE3ED05518E487E7DEF27D011DD50B6186413C7127094E237686062333686323CE9BD2DF7D5614947114CE35B8C5F60746C3AAB0F2CC5DA5F0ADDE92DD64B3758E593282032BE42F2CA7FF123A196AB08FFFDC70BEB331023D2DEFD07781B70C6058A65E9374031ADF7A834BCC4A6AD6422E02DD8843B7DB283044D53C14B7AAEFF2B1E1720B1D1BFCC191432FE535F2C2188D487FD9841DA1CB36622F2DDECAC3D85BDA9988633611E7E1C6B274AB42FA511323866F2B166D9440A7D5BAECCEE2C680578A5B5939B4563798F7BD6B2C20F368DD1ABA4453AC456C0548BC6057FA13E3ECF454B89FF8D96F2F37931EB0291487E2520FB328812CAA45EF54F1F8F5E09DE4D97E37CB3BC8E4414B141C1927BBDC34347E05EB5FBB6AC8A973B0A3E7773A57F639D6AADCBBA7892A72DD6D0F911D3378BDC377DBB2841D146E21C7184159D3DAC423EDE5315779D77BC0EDDEFCB818557D2B2AB4C27C43B4B8956E99DF70E91909934B6D304D466549A05FF1973F17B509729B162E1F1747DF382C9CE9DFF70BD7D3D5686DAA252FE4C46A221D511D797DB8906DD4D3EAE97C038EF721AA7C6AA8531AC369AF485E4D6C3169B5F42A8D1BB31E304F8A3603E9ECEC691C2D0D3947FF7AC937590FCE6F322068A1803388D800DC6E8C4C1B1D1C16DA7DC2DE41205EF722B5796056C1A34FC11C6ACE6268B864901B509FADFBE45CAC207F910C91F0FF09A95E7E0E78AA1BCA3D8BFEB34EB471C55E4D26CFBF4A26D01CB3354112432F2C6AC5B80A3A55187134D47070E6A95E6C0DCBAD43CA30495F38ADF1C474D9B8F95BD24888FC678B0935B59BEBDAB5EA7355C9344696EC623A7C58D28C6354FC5B1B76151360D670A540A30E14955D8582C27E6FABA572636E700E0CA395FEA5E0B840CF63A0D6127F588E05F2DE4DA51ED34FC9E4E550B5A812A7A352C9CC1041FE2D5B558E21E1EB6CEF52176C718F2269EDD04534C0FB688A2651F933BFB58C7EC4F4B1F14F90B16EDE78F5FE9E3CA11780E9DBFCCA0C3D31F3CA67D0E8B8AC3AC698A87DDE31195D1ED75648066AEBEAB0E2B2D6D98FB4B8B77FFD8529E18625CBBA37059423384FCF7EDEF2B5F42B89DE7C200606D56136E4EFC65F3493343D51317C4B32E6568CA963065AB1C102C25374A6ACC0801EF6590021A45CD91A3B49A0A18377DF56F826935CA3CF068523EC040BC0ED887CD11286F231C5B22FCF48CA11101F7F4A741DAE862C237B26527BFDB758CE5A4EC123D071F1ED253373648C5A04F574046DB997A23F0150AD965F9FB6C7FAD601ED7C4FEC4E0E5986F87A12C89621225D06F9499F37B70FC0D322DA914D6E6B798D8B6C87A588B55F6010AAC4EE8717753D42B0CEB037CA356D8F192C33C739890F993B0BB49AB77D44EA3F260D4AD14B0B64540ABD9DC855C0371A166F882B98D720B5554C0BC1A28B328AC6F8A32822BDCD21CF732ECC71D0E54B7D7FA00EBBBEA74FEC947BFFFFA3B17F8B12025D1C0EF858A2675C24A954438567C04322EA23CF0751543C8D42CD212BC1AE415FCE882E6E87486C536282A69751F6983E5F8F956743FA0CC8D26A16D4453062FA13E4B6DF92D59AA2B77BA5CEAEA43C4B35E3CC3219D91BD47B669B1D31980E311FAB836C40B9AC89F4F3B0C7543D1A2E2ECA9F626430E13AC8E2632C3A7D701E6D73AE0220CF0B7C36423D2629537F3D4C6DEF67F9ABCDEECA49A45D55804F7782915AE18E170D5EBE232B22F3BB10746225E0CD8E0825C2A6C037D72AAE26B6F2C5A398F99EAF345F90A8D57FABFA0F392FFA309F82E9796B983BCEDF363310FD742F2E17787BC476AB6DFD605042FAC5289EFAB3F51670DC2A2C6062E054295C98D80A7CCCF7C0B436BAF415EB191B564009B798385D075DBF51ED4B1A61965744A0C777377EF831DD467D3B225AF010110A22D69D90233BD1ACBD7A09749AD4249CD14A52A41EC21085BBF2E0CC3B6461DD3A0F3FBFB9B37C8BA68AC17D2768ABA8178589A5BE6CEC60C517D5315B047158192C3A8B9465E31DCDC6FE9300935D524737B5B5DABB1ECD22DFF9A1DD4B30A1196863FB2E2013B1A26CD8F76E595F32BA83E9244FBB7E5E0D6C68B56B414081955C79982F6224272303136DE3275EC97FC6E75A620C515DE905EDC1B75E46602C566212DFC703575EC2004CA8107BE60D9F35A559E51F890A1CAE2A74626FC5BDB2418DC54CEAB8C38FFB9F0B05B4D98907B31828A0074636D807C319D8E3FC523B8EF6CEEE21C1B57DE1CAEA7F7E0467D4A06CAE579D1CAAFB56EC45269FEAACFF4DCF77BD0A9BE6F263AABE3D5BB659025B4438764DFB9E714BD397347C8EDEF71DEB32AE8DA9CA0486BCF3F25D6D9F9F9342CB5AB235B1513105713703B176D5CCC71F7084AA74B17A34EF9107AC14DE33F8A139C28345E739E07D88379200D5461E26954E2F1BE8CD19E07E45204A84F193040B103C1248823736A32DEC79E7331A4AE9857E8F03DDB86CA9A3C6A11996F897A48EF4C4090CDE1216F877BBE19FF94A2AD561FF7204002E57D068A4BB951D0C3455D5583E5640DCA76B790A65FD8B09AA7C764335F924A08EC66D39A3395780DB6A878BC9A00CD4948457078AF5C859455FFA3F1ED9D73A3135C977E807396D14F82FFA76FF3F0970A2AEB1A11D1598FD13F4443F176101934C5A94D694EC8D4AEAF392C6CDE3451FF0CF7C2B25991320317AD412F52DFC962D6729A5AB32DCB52166B62A82D22F30AF244E48E5D66EB34674A519177A55BCF6FC9966B9A073BEF2C709BEE2E99D5E4AA463D0DEB3B156F9765E378CC29EA611FA338639C9760EB090551DCDAFD05CD646CF721784DD424A426D42413C31302862ADE7B61725812E541F4E5E938949A5026046F32C8F8C1CF03BF75B33CD735F25F56A02E8A6BF214E44C2658FE4B7B8239C3FDCEB3DFCD320CBC5DB2E25FA87ABEE399E1F47BD5CA024A4E8CD278D0C843E37968D9774E7F897E11DE0E3F228493AB9A0AB1998DCDFE33BC6981405F93EB857EFED63FA147951A588669F7BBC317C9E936EEC616AA55BB6A95CAD4FE491E8DF278C033BE53FA5265974107640677E941C75728B5157EC4991AD50B8CC01C0F67EBF54302E40B953C8C507F695E57641DD19326E1F5C8DD09FB9A938EFED5A58B319F780134D66DBBC1EC28C50F6B4AC370EDAB2CF51D72132849174968064DB6AAF427CEDF52D8FB256B2019A007FA804FD01E012A7886241D64E8FBCF1453BB9E622A0B438BE41E04A00789FD6863104E86F997F84C9C226DF3A16A79ED3C0117647B4DEDFF3CC3FBFFFC7A710C36B501C8BD381ACBC351C607AD4FEA79A42773F66298ED25224F4A359C084011A161CCEC68A12FF3F65BA11977E651FCE9725BD5067A999DC7DC966DEDE52FBB11B4564B82FE00F307800016E7D3BD4BFD5D4C19AC7B1B36C82F149C0AB206013BE607C3900669EB7158CD867A82B5F42F5A708099061E96991F7353E974E84579FEDB01CBF9ABE6E360A843AD94CC3579206CB041757825C7712A70931601FC70880C7BA7A42835AE89AD385DCAE904534DDAC9183803F486B53A5ACF3B53DD5EBBD32588408DD4F82711B7D83FD80C88261D453B48E4488417E4F269DD667325CFD9A1E7C37C12C005D0E1264C2C46DD3DD2A91E1E9215D79AA1705B8B6B1AC09E9208662614C4AA0A853578031237EBAE153C0ACD55173DC3DA5D11FBB7349AB62087BA13E0A7190DFF13895CADC4786984BD663F1FF3497ADAA25BC7A2BE43509AB1D29A8DD7BD7E12FCCE318DD11605D4A86709CE6B962D3E3F394E5B516B40C038C1EBF1EDDBBCFFF81C233507FCF98C55E2FA4749822F1BB56C5E9E7F12C1817D71551F2A13F6CCBA09C65F72E826423FC1F57E60F986B692D03C718D1E80D55A91B796A7EA6241EC2D9D3FBBDF98CD361C5EBD2D431083FA9E7C59D7754FAB88F0F4E1309FAA555FB382436C46FAB3377F4B70BFD3B80771339C096E086A66EDF1B6CADAB79C9672095D79B0DD17B3A3B9126839DEEBA538FD7FFCF3A0E757492B656A802FE87FE2A50EA6864E46941BE855B4E6023D0F060181ED479F92C121F6209577AD2373D0A28584D0352EFAA6DBE11B4B326136EE56647EADFB3843023D84801DA12C6EB4E1D4438CA83EC0E297466BBE8785EF94F9B71148B4D5E56A327292B0AEDCF5BF7256696E1DAA4617939C06B4CC948AA7A4EB23FA0B26000BFEE95A35AC1033BA40BC3C211C81874F7109B518CF209DADE7EB1BB3A90BA45C566D7F3450107B73584C641058699B1363E4890160E73CCE5BAC4DB10480114517EFCABF1242EF508E31C082BC8D558E5FF84FC472A2EB6F20A0D8B3C2BA7ED83B2EF8689EDBF1110528733F26BA01DE56BF510C304CD275046B9E617A3B9DD3B2E8479D84ECEF83F73EBF4A3FAC4876AF0A5D13696297EE5C8364333D8FA6D99AAF7C3E62744979CFDD15019D8835582327C26FDE7A6A50406930F178BC466787E5BF80300A042AB0E3438C5D9650D44E1C1015CD46FB10352BEE093357F11396AD79B7D8B5281913A7AEFB36EDF2BA186CA36C9C20AA40EA9F5B041C0AF768E22FF5B02C98FB98F3F6F215980FE9472933F0C6B4848765F338CD395A140D18B0460916F8429D7F710A78952E84A8EAB603DAD80A20A46DA88FBCE3DBB23EDFF9E96551F6C25EE6A68155AA1BE2476E9FE2835649350E8F91AB6E7895A993BECBA8AB452F46F3E3B4E43188CAFA41C6484E53E93EE886B4DAE5C04B63E650FCEDA6EE6336F24F58FEAF91550385B49759A8304755AA8FD311E66A3976B88FCE9334AB241BEE8F45FF0AFA8F4731B1552128E1BBB609A733170B51408805D2461FD2B1CEEA908B7B18EA485ABFF08BE02515184DC6C418898D680D009D4EBDE928B47F747FE27A90AD66A2CBC14C83267F711B72FD847F5BBA384172837AEDCA3C6F21FB81176032AA87A060215CC840E4E6911C333AFBA44513CA47A0F80D3278D88F622A87A56800D8C865E40F2A6D6FF09DACE9C196F1637DA66D4D2891B27A6DE758CD66165D31291B5A7285C035F96CD7A06A6058B7319DFEACE1381AE84715EB7627C19009EA306BB0B64C8EDDBD7063E040E1481A0530273F77797C091E33135C9A4A1E27CCDDC63A0497F0F50F20EF70C43A9765DDD170E7AA609260C462A28329223363523C13731B1E156D3F3220568A0B34E39BAD8EC8D9268D6C4B556591F57DCBECED7C1E9817245ABFCC03B868304BE6C93DCEE77B937A9A3BBEA737B5A87377B17633690DECACCC7752CEFCD56E153C0F7EAC643696404972E1E2D96FEC9517488C06F1FCD2D8DC80F26028C47DC4CD997B3836FC0F412B35F9F62C09C35C8ACDB7B44967233F2C95DFD334262774F52D254FF4B46E1B494ADBCC02DCBCC2CDA5E56B1CC97B56764C0B912C2C0CF51E74F0FEE48367D66FAC6AFE8B672C4FE90D159E40BC683BA1CEC9A8B8CCEF1D3DE6BD9DEBCDEE4A3E1F0B605E7CCB1F1FBBB81F167EB4520CC55D15B9CF1D92BD5DC0A4A99E642B2EDB6031B107DD2503BA98FD04DFF6BF226B811660C8807EF168A300BC166581579CE04B1E829104E82811FF36209DED5701824E0D4DBA664AE1305854DC78ED55179567EFBBA0AFCA8C3E48A68148C0CAC5A9BA94177409E279F02D4238A00BAF34AA1E8B35FD9B60D273810F61CFB9A87F9D9F32CE493DA38B7575CB735D91DC32A961E72A3594C80E49B193E30A80BA3674D29B00D8E0EB6C7B0FB087DFED84E1A4DCC85DD28E4A08C724749799B080F4CB84FE8AF6CB59B8867AAF35D4403E6C3CB23E2DC85C53F6989249B46C53C2CA7ECBCC5AEEF9EAD9730FD767EF043486F6186AE782632C7F2107F26481A55C22A7E4C70883E37D32C754AAC874FC07846DB2BE53F8EB480B9F5D29E7078657CDA3A4B00A4D2C03029B28102DB863FA24F07E06DEE6F839CC9CBB7936B9962B410CDD14C04C0D3731BFABC8C0CB1A532B52F4E6997F78D6BB7AE36D91B2DC5904FCDF20DB5F29E8F336C52F3B3F68F182684DD3C4AF91C184065955589FA58ED352B3C3FBF977DC291BE362AA599B7C01E1EB3974F894656B0D9CD4F5D4806381464BE88BA50588E071BAB8BC3F173A6AED5366B47C09DACE5E68EE6C92D6548B8FD1640DB2F06CEC5248F34DEBA92BE6627A188129BF153C612A2D3C172C5DAB562D3C5DB32CA7ECE68A5223169CE2B53D080A28BDC351C0CC279C98C320C535FB57E7BE6CDE2335C23B9AAF5CE225D44777FF1F1224ED92DB6B918B801F19C5B51C37BEA524486ED4C4567238B263D9F1C8515B31B613C67A54D2F13C97B5B311D4EA40BA773F132F903A5DDE6B6A18F7B799C7CDCE940F087144404157223D1EA36063D8232F8A994E2BA17BC5F80EFAC9F9850DEDE55340DB384932EEC1D86E0D3F2B0AF640D4980F3E8F92F28332793555876DAD2F20BE0D22FCEAE647AA7C53337E86CCF3F47924ED0EBF65B04E4805CFFD993A6AB0DE1E6D0DD343E9A1B784034FBF14BBAC41510E38B02061484CD4A4E5265A1131E882A0786FF611253B4B473B62709F334A13BC383C31F0ADAD14B10E9EF48B6D72C1572C74434C5B3FD90D74E935E5CC3571AB029DD905B681F2CB4B35129646BFD9C8912962BF06D750F853347BC4772EE4D92D5988DF99CB90AA8177F1162D42B6C51F7D44A2C2B2943B3CE0A282062E541C403968ED36FA2ED588C83D9ED64ADB007DB6B4F9DA42066AC55D92B9191E945313D4D5E3E9D99E154E7F19FA7 +MD = E7DDFB3A920EE6643B5014396DE5BE + +Count = 9 +Msg = A2F75E5F168A1531259531B6A37E893D1B18E430E14A697F51170AC7F405E42BE0C86B1F4113775AD1037710793D662FC93C509EEFEC6F578DDF0DFF7F4E3D1FB106D6DA1369FC07A0895FDED3580513B0DBFDB7B5463BF4591392620577DB82C5575F73678C1C5F4048FD668D918434D9FA4EA450856A6ACAE181FFD7990228ADDC187BF992AB24BE9E776C49D567C78E5D890B28373240EDF5A9850A1D87A646D4B8B078093B474E2AE5B20EFD20F47AB9707A10F70076A9D88E03E82519A116D025751DB64F852142BCFE527F32EFD4B40B51AC0D964FD44106A07B385E2910439B3DD8ABD6C469EA58CE3A01242AA69E2E341AC7F5093AD5A0DBAFAE0AE9E393ED0EE3F41729DD46E7C1B4C714D21DDCFADC092A0E494E9203020AFA14BBE06FEAA7141646B1870456D3E0335573C1CEBED2B42DDFB984A4BF51F1141FE2322CE144DC6CBD0796485504D33A681B3D90413C3C4106B38F31237056F4C073E573A1B35210965410B73C6BD8DBE5493BA41361D3E3A6F0252EB5AB494DB1A188E21E6099B4C92CF9ED2B84059ADAB44BD934B1E15FA002CCB18D235BEB0AC2069AE3F6BC85B086DBE667E5B721EA8B53005F6F19FFC029411B93E826A5D10EE2687E6BB7E4F7C629ADD5FAF7BA4BAAC602D05A8B9AA906D9BAB4A1F1C760361559034EA37FD46F0999466B2AC63187D0E82124D5778247BF7791FC3056D5614D9FE49DB7FC07472E6150F2543DDC13882CD008A63B609ED6BB8F2CEDD73EB3C4E41E8AE194D0D3E1DAF5742690F2819A7E740385CCBB113E46C7FC6DDA5956229D2E701F5231F45CFD26CB45EC7846C80D916F633B2DF7280C4B9BCCD46606809F5288628262484C80A788A6EFCB51CE80335F49EAF3E67037471206962788971F4BA69AEFE446AB4823E394A5503941F9CC4BA006BD96AB6B182B3A4F42B5581EF186A424B7DE9CEDB400C61052CBE60ED10CCADBE79062B4FA2FD7B80B5B066D8A75B3C9951C42ED +MD = 4D89A2E7F9627FC7B0EE41BF16C56CBC1E470B98C0D87B49623DB0A257EA3B63BE9638908CF76AC4D2B3D0EB7C9EB3707AAB1AFD68A60AA830FBE8533038AC1E9965A22991515C8A0A50AA7CF64B46928B99696277AD0EB6B1D10A43CF11CDB8D419C72423CB03185286745D8D7014730F8CD23EB36DA4E2DA2D0DCF07EBA4712AD4B836879FEF773F679E3FCE5C64F6A63BCE00817706F3DC7F7F4254D06D8B34D34E1BB9BC09D6C30FB8BA22035D3CDF7B4810F7B0DC4E4F487DE39C2458808B725EAC825EEC7CC41BBDA9D138782C5E0381D788BB2572628BFFAA9DA2F139750B7AE281341F672049D36D284233F1C916890AC5CA89B39DD2CFB2CF4690D99D0932C898A5B738FB9DC10C9F0870CE70E9238DBFD24E3567C30AF3869B418819A36F87A15FECA721DEC5EBBE4E6F69A30FB6EE7C0965867073EB2421C61CB979FF3BBF25490E94A95F19110378C45DACCE9EA478940F7169A960CC27483584375B52BE822D6B1887DEE1C9AE15FE11DEFE9D11BFFD4E7CCB01AF08B683776FD7DDB2ED8AF0CFA77D288E1445D3F0E87B2C3700316DE03283652ABE535FBB8383351B2441614AF085381C98F6C90A21D2941C848BF7624790FC08DEE120E9AC8275137B76CADC76C25809B9DD532139270C8B9DAFECA4260944F40F4AC855B35F7C053A003447EA92F4C01032093AF3D4BFA3EC80509467C5C6E0A86356DB6F116F165D48E73BA9F21A6F688CA6469EDCDA2CCA0BC4C367ED75EAE5B60EE1B3A02A7878416290BB5865DE9E42DF20C0B7A8117457EC48274990F183486A86E4A6816E0A9043ABF2E4B1A1B37DE4668FBF63FE2EA64E912F27F2EA01A677DB1B99989C9E1456FE0DB941D572DAC5C9B44DC46C1C2A0A0214CD9559A81E832A97D2AF723E3D884CFCE000AB3D5437E85ED8F0733AA5AE59DFE9591574806E416697EB9FAEB347C6492D545070BE112E2668D58132305EBF67D827C3F430BB1E2A653A565E85912D9DF1984689C6E7C736FA48CF675645C5CEB17868981DE6691634D779089A014071B73A03B56B90FD157A194242CC573AD1ECE4CD3A35255A17D879E1A3B3CC23710F5221F93CA2647A3333F46714EFCCC731E7E7B85DF10450511AF345117D07DEE13D48605C4345B7206864878A2E24CB5BE555BC4CC67297386877D4900B51307840CA695EF1306027483FF443CC0E9E0F40D53BB2E89D4DF59DF0441C11FED4B6603BF5519423A801879CDCD36B8C14E300FCC500B177C084789F26D089BFC13FE06E80B58E84308C0FEF5DBACA2D7EA12A5C1B4C4D4243F9570A285E5032CD3774399534D642DEB0AB1948B423A2960C2444374FB10A230F9D1C5EABABC3A65389C676D1DB1F48561CE232F6EE03177A9C7F6B0C03773E76D9220DBBC17EE0F6663F02156EB70A09C301CA1C5FC1DA7B18E7B77C17D3AD8F18E45A29BC5A4AA1B4DF4868E96C91AE398E3301C23B40B839C4D4E668D855ACA3DE4C318008806CB2C5F661684A7730BC0C417AB8B759A95206AE032188D58F759B63D9074A3CECB38B4BF0D0CB65F8F0E290D22697CA738D08E021AADFF75F704DF18B1470A3BE041FD342630F0B8B3A8416655DC75106F98D49C5D6881A519D37D01663AB28D3D7DC13A3129D7933AB1F364A17E4ADB85D0BCE99844AD82012CEA34CF6A127B6749FF31866C4CEA4C91F129C43C2B34FD244E74AB14EDA0D6CF804E59909186C3CC4C00A567CA7D00E3B66B6887551C2B32891DAC79D5A0386C87A377ED842AA07050AE138D261BE6ECF7BDBEDAFB9118C222D54646DADEBA0FA9D8D64E1A83F1EBD38F6A7A1C6ABD35CFB72C92BCA6726DCC2862D3127D78B87B5BDC134D39540D990EFDB0B515383ADEB7D3CEC1D7A6D99EB15CCA67D57EBED9B9792588472ACA892C5E71C6398C4B531FC1937F7D7A51AB8E7845C10358AD8868EF968EAF85C12390819DFB26BBC0E5419D7772210F75554908F925CFACC27D6BF42AAB3C749B34D650450DF66F5D04FFBA814843584F5FAEF5B46017FBD86F9179F4E4A8A9053B3555EA940B9C66A7F22F024ED0515A031C043AE0E11556EAA064B5A437CF26D24C2BEA90C411C4C02D4984F1F090AD6347EACEC0D609FAD15214AF40EE353508E54CA21352F23667ACB4197BD5CED5933A0CD75130F42F38227EFF5F5B8C34CE56F675E36B8F9344506FF1003CB48FAA365DED7C10CA69A6A025A53A9A7A425AE6D4124A2DAA4DAB7AFE7FDEE27967C80B46290AB043506F76B1CD79D2DD488BBAE98D5BBFFC0004887118A6D21289C61020EDE00DE39A45523C5B83E81DE9E485FF0E0AB0236DEE1AB1544BE316A753CF506AAA095A0A0E2795ED1B68E3DF58F1234DEF967A6D8D2A393CCD1DE031BA6A66BD03453A25D7ED4E229D96F201691AFB954577FB0DED548A81DD03C340CB31458FF2C3181FA4ECCF2B45B18A44271EE70D801D176C6B5EFC9587813B1D314D9162050AFD534D0C6698974237A49C505C471D4D47693445042F573AE10BD187C204187BF23B55FD1B82973746EEC11EEF011B2BBFE8A0C45988894C00FDCE1447C2F64497BA7DD676AB315536C34A0ED2CF9A1AFF774396D33DFE8B0C53282A5A21C0C51CE97CB0C4B23566AA8177244F777AFC6C6ED8E044B2C1EE8C2A1B06A3EF5A6F7FE8CE86CCA4C3491A1C56CCEC3F637C98B83F6B57676CE5E4D9206C528F70F6FC5F3F2C17BF0888E352104258B8F6B07CD99C4D5DAAA542F1633BBF717FB5CDD987F9537877ECFA7F744B1C372F98D858267020060CBED1FF7B580998ADB3DC6FDE3E6ACBBCCC37EDC69D5E4A316DC7C60FCD76F12804A6900DBFD82D07821B9114A15ED08E4A1B7ABD8BD08D394367F124971A4AB76B7D3249116091A1E8B4BA03B9729B441BBFAAAA181C233D817FEF4CD84F5A505A056B9069A310F6EC27B81583DEA86C71C9CF95388DD38F4018837479B02DB56F9B15060F58B23B83887B3ECAEBBDA5EDCB6F2DB71E81E9A99FAFDCD8C0116E8243AA0FD1B7839AB84E1BB146F55CD549B40E5A0BE3147F5A7631990CCB35D2AD37FC30B367DBE1C026D1195CD4D34385087947057F0935616BD3D2714F9FFAA + +Count = 10 +Msg = 2B1ECDA06013DE92003EA0FE72CD0FA323A3490B37B80C1E6772B35E57DEEB6BB6FC24B650EA2A3F53B444C83D0E7A2990946988F869CA7211AE38ED60803A2152344775A85952397909B7837444E158F889CDC27562724C31B2A4A2B13CDFD379227508C604803742300FEFB247FECDCDDFF5D7B277ACF0C1FB43F6B4AF873C2AE30951CFD992F40996804553839AEAB3D7D4D146082101768546CBC08A8292A8D2C4CE3DADFDF44D01CD1CF7669C3E605942DDDAB5F522C207DA4A92C6337E14ED9C81BECCAC06D9E084453A050A10E8086B6647A4B7F2DCA20B36D2B36286CD4F070ACA1B7F93AD3C04FA31B0E7BDFDCA61895BCC376F35A9A41BC07633257EFD77EBFD0045CD89D7B90A9FBDC12CBB4E380851D82B001798D4207663D33608DE7B3338FCBFFD8494FF83132CCF78E87860723D2BD3A5D177D4652B255725048202C1428DF3BE8E3A83BDD9A8EDEAC85B38FD0360F9DC0AD562C1285AD15F3CD97E902A0E365A85A1E302A716CC2989E99CCFED5A22A38925B66C2B329633692480FF295DC0B925DD77617CF635F40939373EBE0172E2B7DA060458CA2F530BB0998295CDFF2C29E3AA0FE2C12792F0C162F2FA577567B29D484F56BB605BAE2455CC5CB25E3C3A0B15DA576200F5B3731497673D58B43A32D0F884AFD66D824F61BD6B5A363D6226B7EE419A104F9D529BE2A7C9F470CCA1912AE266B78A35A85808014389583DD63440856972A021805A3214F3C5B85AF0F1CAC90B5BFC6F2DB99942074E59C942A4D195B3EB622EF109610B857541E29FAD1052BE8F327A38D057B0D85D19320169D14FF423A6058E9CD701FAF0EAB778B7A25A3D070AB371565DE293B25593EF2E0A1CA4F1ED7B060BC322B7318047E69F3721BABFF5FA5E1DDE9DC6C371DC464412CBE6CE1386CA27533143E7FB40D615FCF47A34D82F3910BD86134FB5429AE6DC731EB460188CB057936BC4B677229DC7B0C77C62126BE292D6118C737A7210965D0B882121B4E368C9DD45C4755945647588047A1D84C9083B228A07FF3DDC215A2D596C997BA5FBE4149835261E1D7CCB28FDF16D9578D84180E6FF2ADC688C0023694700D9CAF9E3099608EC94E11D050E3BD63FEBB4C4B4802A1995A5D107AC0C3402B5D57BF25D040E64FF70ECAC9EC8FA1CA0914C156FA49380AFB1633D378E5CE060DF67309249793BDC4FC544947D7ACCABB5671ABF1F921141FB43ABA0D12C70130C4CBF61CA89571811381FDE4FEB3137969182274220404C56EE9706CE9A0A2355318831BB6BE12B0F02ADE77332F2101174093FA948D0EB0C720ADBF2514A772DFC891E62FF7B2AB05618407359D924FC87F45990CB790D609D2449610539BEB836B976A9D4AD11F9DF8F522F9078B399E6DF6A5CF0E662827BBDC5DA32C9AA1D59883C9F627A28DAE260B13B26DDD02471B07A26CE61C74F57F42D16E736C615E435D6073B13366BB7907A9035265C9EEDA169824E844EF8C1ED486E4C11F2AB999C57F007C8E95E790F6F3EE6371930988F2845CD44C660E7DD464DCBC81EA59DCFF699CF6B9725B80B083F150F1189D317D6BDE8ACDD54D5F70829819B92B1F0C9A0174080612CF8038DC23C864AD7CCBC79B3F261BCF0F1A2C3D7626DA31C78574F4B6FF94953B6A9C5E41F1A184FAC305DC421DEBE8E0CAF259DBC89CA8A5F714AE436FF68D27226FD489CD7D1D789742B3110DFFB9998C03EBFD4AC972CDF3A85ADD03418ADC88A51FBE176F235DD4E13475E987A8075B04B76C0A8FEC68FD06961522306555C7E68858D00B822CE09E285984FCE47C0043720E8A2EC208C8B6B100C90E2B948BDEBE02FF4F375F828A7B7C6782D3F0122A14EECE66CBA9148F90294A7153D26283DDA63EE17CB11C228C0FA355A145D2C0FEAEE93CD6150314EE6FBF0E150126A909D3A52DC120AD63D2ABDACC05CEEE4A468982B4E925ADB8A32A030D020E0D7AD8FA4BCD90A4FFCE01856A3A3A470F2F8164C79B8E71BFD435EC8A972D9061D49E6FF30B7320B9A189B4A353CB638E5C1AD38B9D4661FC673A7787B41A68A0612395ABDA5403AC60BB2611D9CE5C18C26E2E8C4A14C48E2C738BC10B9905872104423025C7A40817371AE210501298DE6EB545EBDC565C5F077F66C832A0D7B59EE0C58C2BE30ACA266512F9E26DDC50F2E2ACD3BF9B44ADE5E11E583D4FE486433C816F5D1CB27BBA8BC57743526C999315D54003F3F603AC17963AC4B28CD6808CB6B5EC6CF3E630212923C5DD6A937484B5277A94824F367DC3457687A6F80EFEE6C6ABB6AD3621EF1FD2DAC24DDEBD02C6400D556BFC0A678F7EA9BE6FB88A2124D6E6A3E7CDD77F058B84AF74643FF49863B156FAA982FABC44373E8C737F6758A9AD66E8091B08788E5FD0775AE31B3EB515FBF723268B43FBE7A38698F2920C1D56DAB6C90C8F58B8DE7C49B28361511BFFD75D836025832222EC217771EF8BCDD459F4185465A896A33E44AA31917886426A991B4488AD215794A6105DE136FEE07BEE396D48B79A2EB6D031E0D8E08173AB25074670894BACC2C0BFCF8848C1F745C9C5B34F1909B30EEC8DB87B407EB424ACB2BC3FA87FF2928C9A8807CA967E1E3A9B1F2ADE34922B544783FB932182420B9AEB9605C7AD49D310B27E71AB34461FAA40B56F9946682090DB60EBF70F6B1835FC3FBAD80862FDC557CD8213A9A9133DEBF8D0DCD26254737574EC4C5DDC1147663BBF049B3791EDB7AA4188E60CE7224DBE1B068A3B6389DB37629376A1677BAC3AAD6DFA0EA2A456F3152820CB8D688DB9FEAFC10ACD2AD8252953D50E670642D5DCBB6F79384F1B66BF87263B690FAA0A05BCB2B7AAA16D7295D4E54ECF588C0EE55AFED1F90481BF945A5B3604ACBC29A9CAF8BA538B2B2B4DECE35369CCA756FB17461E10D801012B03234056377DE918BB95046FD1BB6A2FC3841C112E55C7B3043AED56AE08D1C9E78F4057EAD5167EFA3AAE37A2E7296BDBEE4D53F4E00CBD5B8D51FC80827AA2C33A78526B0234EE6D9D16E3A790101D11818ABFCB8DD50782930C5D8319FE77CFFB74686EC700C9A95EE657C91905CB6D34EAFF07CAE7356570DFC805D76B53AEAF23BC2BB7BE4A80B1066CA77D4E699D40F04E3EFF6FF5043EF2FDF738C3D1E382B919E5499FB586907E46B47A9DF832663AC4E72D14AF4F2EA7ECB4B05347FD347914C4247443A13AC79E81194089A10ACB810DFEEAC66E09DAC6A1B2F0C63D2659800189240DE1E723AC55762E25EE1E4BA9F4D24A0E59A2A6BA49BDA1EE49F1616ACFB08817D6BD9F26DB3E60F7EBB4D8836746C16AEC5B365ED279B4343535626414C3662D9623D3373313231B41BECE94D52E76F32FF67E648A39456CF96AE195CC0CD3285EAAED43739A27C9281B1D23AB2F5F06BE7F341E44F1A36CEE663DC8319D5F34DB96463A31337F95CEB54C6F2C11B1DA1BDAD75CD8B4E35D0780551D5C6F979ABBD84804E914D58AFF9E4F9FB53430DCA463BC56B6026C26B2E932B0DE62496F2DB1B343C9BCF0F7055C5D3A6553A7C34F8868E8B330D4B97C21520FE224AC8D44E0620380FD02F772B54169A521B16F316F61560960BBECECF9D7A86AE114E0AFDFE584E1A43252857175FDEF6B045A7FF2DE72B35683E424852687255A9C819060B9D53C2C7D8D3D0EC097EABDFD71E57D386812922D594C01605C8DAB3D3AD4E45D8EA13F1E43754145B485FC096687A491A812247F0E4360893ACC10FF81D195B2F6607ED0B66EF4F2C15C78D35FF7F9C4E9098518B0755F4B40A5E3776441B3D2E039030618D3EB492D31ADA1CA8D3932C24C16784C8D0281013380107B7D9E8F9895E326F4F3BC152E4BEB7ED7AD70B36CB0B5183B3B86632681F4E543CACDBF932E1924AA023DCE900159F09183A953B2CCA3CAB876445D0F8FF072FED6C1638E3BEBB9944C195A72E68829E185C1A2D891227716F2F71CD9BC152A11CADFC93FF67265A7EFCF76B34957D1FE1A7B79BE5D9A5DA45A4C8B34CEEFE826FF48A816CEF9FB136BFAF8D1BBC3DDAB252EBF30AB6BB4307214E5A9E720E90FD74FB400AFCB3F2080664262A18BF8867EE01F9020A78B838477A4AA04412C4B01E8FA6C0FCD0B59EF8EB03519519EF61C5F3B070148DF2FC4207C2816852C3F3A0750B8819C86A1D4B5B0A1F7466A22E8BE8DA5062539C909DAA7DF50D3435A6270FB1200D6648FD899224B983D387DB6493F6807772914CD97AEB6E4A740F172564F764B58221249FDCC7CF2FE20DC922A1907A3DB52EB47E6447927BDAB314830C941FDB2226E272D2E09AABC21DF66D214CA8E395DA703543E6503A8EA8C529B34C224EEEEE007BAE076AD49309BC4751255A8D0A30ED3123E9983BD5A7E32A1B71F776FAA87F324B2C358D709BA2392A09E9694D371E835EF02A0456C4A6062340B92212454CA9A52842DEFB5FC188475F11CBBE7ADCE3527417097D7ADC86862E6A30E28026E4BD40C325F54087FE2FA2BDF7B3DA48A963D6CF9D2E422B2B4BBB57CCF590A5C7382C0D7EB6B6ED12EC19DADABDE4D3ABE6C0CC0BB089B67B1498D939E9BB089EFCF6BF86CCCAF3ACE8BDB11468516E66E7ABE635C39A16AE7692691DDCB32831103BDDC6254CDF1BCD1F23F3D8A113C32A72523DD4D3DA62E010103A60D6D034947F042D73A7419ACCCA67A47622D6D57FA6F26961EB5C3C607BE6153CA4BBF74FEF5F589CE64F8231B7710A6C36ECBD393BBAB9E366D2A823C8CCF8C12B5E270F705487C37E3899577037AA7951D0298F28DB01E90113E91CB634D41957C1065949FBFBE264FABB022162732E272ED1F7A36999505C3D0D5C6B6A0C49637FFFAE31513056D5472A2D1FFEC89EA0BAF48763DC75ED28B5FC0BED9E76FAEE729FA162C4FCD6FE7B225C3E6B305D756EBCB07585E5870A11867C54246837D02F3FAC5F263BDCBD1E88E8B919AFBC849E967EE2C584688C1897503D8081DA12EB8B0E2B84FE4F33DFF257FCFDCDF062C9F7B68EE9550AABD61F478FEA9E3D9CAED5CE8EA091009F464B02D32D6C8F4BA7ED7488CB4B299681635464B7C04841B5BA4D28FE62C238F716479D52377D6A90FBE7FC2AB4D163AC370C3C3C9CE88603C11D731E664C452B3B91B4038B4349E6EAD3BBD84B1600E8EA7CC75586FC5A2EC09A9119094B2AAFA2D1EF231D5F21F3C35552C92CAEB7AA1D8B34EA84EFA53F368543F0B230DD9EA90C357927DCCA8B5BD39230A9910212E2E6FB7D173F2AB22CAFEC971C30419278B31F20783E8340C0A98FB15D7495A483310DCB345F8769E1834D77F0336E2A92FFB7F671E299A463BABD6DB07954B71A4713EA22755D192BB63EF5F00B508D3A641E5EBC9F33A19769677AA21AB8672E955DA81F84071CA19ECABBA3A4B3586A2F324B5BF6FB7B147253B90EE37611FED7C65BADA76DB65C02BC1ED477FEF3B50F0F72E76D0C379AE294AD304E0EBE27B9BDCBDD58AAC2C27CEE583ADDA69C746003FED4042991CB8FC0CB13C0850EF3FDF61ABA32165D654CAF6B7EB3FDBD3BF738D04B0FEA238F2C004D97DEAE02F6E0653CE68CE1424AA6988754BE121892038F1C87B5C2E413D38B8E31C8C5869EAD749D4EC0D6AF15F686A57663CED019E8BB944E927A411D80281300531082E011E8A64A74C9D12CE007902E1D6DB004BA75490C30380B32337FCD97C3AEC2E604C4657A2786A41EEA676E8BEA120013780F46DDC775AFD9DD7417F4FC39693144AA2A580836DC34D02A21C9CA8048207FB91FB468E41E8E158B9DB36EAF21B0FE3C463FE8A80B4232110C9C54E60F5C2BF675431AB5C9608B9B437C9829C6200970CA8D3A0938D6AEDD8157D7823A2E7B4088773ADE964872E6B34C658EA9084BEC93E31B812221BE9E953D3372880961140058A14EE62ADA821A5455EB711F33780CEBEE5713FA1E66B99B495915005DA9EB508E5067FC0569099966CECCD32D7509BA659D1B0A01063A3A954BE0806D19F6ACFF2191E2100FE6854E79934F9AE56DD3505A9BC08EE14E87162D67B988882C4CD71FD30BE426A956B696BB8772EAA0AFDE0D30127E361E1ED209CCE3A72DFDC54D46777A1261EF29B04409F825C6142B8CB7DB7B5719CDA101B439DB59C6AE8999F63A2B72259D7C1D06623A2C26F90BF4A056F052816E3379D6785D2814D0EA96805F2F8CE9B8671A5F5D50B69374DBBB2DE6B96FBE37178707B29CAC4053093678A3ACC7C97F0BE7EFD5F3241D7CE5629DA1FA2D167AD84947A784361CBADA0B53193EEFC714F2AEDBD17FE843F2698ACD3A0F9E59DC1FFDCB637F21FAD4CB35FBE7D0033EF59A89AE4C5245FBEF05543EFA68E1AA3BB277FA40246394D0B306054AED5C22654CD89F86EF0C8AD902DC5E2AE3006CE98ABF355909FDD136F4DE984B40B102A832D8AE9041244BA5ED203E47056AEDB39A1BBF2D26C85C4F07699111743E9951DAB5F70B51DBA86574906CE9BE89318AF1E4B124F1D482697C5F89D8933A30AE86ED6D4F72E161BE7359B9965C72907D3807208F8C745F05338E8FF252CFD23A5FBD62D11BE1170F82F3B1971AEB0D09CE0BA08B19A021128D681CE4526F6CA3877F379E10BE6256F0110D99C2C8EA48808524462F4620BE9C5044B3C533BC13860D0F9BB36FF90FA9499B0893884FC47DD363CD4A2574405F7902BF7AAF91BC54F912B5B84F94118C149DE6AB172A13007F36F1CFEFC96099CF3C3A6C3995F9B8DEB49A759A0C2D3F524135888E95474EEEBFFA799FED6530B21BE91359A4527FA32DCC63909E667308B27CAE93D80B39F4EC7E7A9A8018F14E6AC37F221AE5AEEEB6E460C9E3BE4F588671ED71B79DD90FAF1E6D25D8E42315DB1526DBE750EDCDCDBFDCF3AB70112E2E21130F2B8097CCE96F73FC778816D1C14AEDCE977471368420A3F7C0E6633F0C3FF7B6D113E95B7D59F277DDF05545A90B3260824296BAB0DD8B0BDCA00C030B34EF37915F00AD6092513E81F95893CA5D4DB5B303BCCAA93C06F388DE7EDD4CEE6BA8001DB34A0A84FFF0F15738B684F7407F52574F0878258E55590C25821374F1928EB092ACAA03AA2F03CBD851034F6F909DFF8AF59F6330DB8F5EF0FD5E7DDC7D66A528D46594D44FAC1F05AC4D3C51099D95E414EAFBF32B7FB71D4B12ACD185EE5AEB5E279A2A092A3A497F5D838E520DE760C898C8936AB2FD55AE77893DFF4E7FBEF251F3E1026ADBE9AFB273CDFB29CA3E2A4C08EC25C680AB2A457C91A1FC4A31DEC59B0019055D5EBDDFE3B83E2F5984AC4A12B34692982BD047B7BDED4A48B36842EF358DCA2425EEAA2F46E3C86DFAEBF7E457E996EB4B2D6F2FD24EA07073963050FC4023F7E225EDC49C62514808DABDD1F565F1C9D157A3081D9A52D64E39BCAFB27870B9C7000231FBD24EE8DB2727F891CF7A0DA5667EA49C1BD948D3177662A6A29690690309F562BFCEFF08BB2DF67359457EBEAE094BF9CC1DAC26B95EE45BEC423991968E8DC585AAE6987F9CE1EDE3D579D1F7A4F7984A969DE65CCEA961E9A31C79F465DCCAB8B8380323B2792F3CBE43E4E41363474BA146FFF1A769B70184AFDB8067F97EF8AE193E6BF374981C6DAA9D8AC47DD640D42E531EDCD9104F81029E039EAFD4C5C5EC35FA24DC572CAEE383FDCB2C3D07D89BAB39A65F1BD508EFEAF1D5947EBED5D8C5D847DB1BF8D62670F955138454C4972A02039A1F65D060F135F166561964C527F36665C0FC80B3637FEE2280F56B952C3E6A7BBA3BB95F07E6EAE5066FCF57958FEB91ED5FD62D8250369F77AEE0FCCA5C3918AFE80BEB39075DDA129AACF3AF978DF00ADAA8CD683CF9690519E85905ED1BAA36B7A8AC84FF57E601FC1AE7A342EFE020F0F2F0B36CAF72EFA1E61F1E04D4257F02BDF7EEE06C0A82C1CB6C2111C6C229083815FB2AF6C90735BDE21837C7FD27F568A085F8F14083E76DF2A04350DDDB24F516CBBF29540CF4EFB82389F14BF9CE442CA8253D3116F89113BD0429C4E5DF07F441B13268CC13949008381CFAF522F8D2FE2434B5E6C300D22D159707CB2BD34382FD09489CDC609590AC29DDDB971D9B0B56C5C1AA510D7EB15F3AB67C8CC5DC65D978F818B03522C49F243A9922F696F8FCFB7466129930EF8B963CA1AA1803E64D78021F24825B21A3FD0A2CD3E48F68A4BD80915175533F47098D19F980198721534CAAF476D37AA053C3158E031BA707D4FDEC977295D725C2D71BF4412722E3830B8097E5742DEA06F0FEB23DB144EDE61224832DEFAEBE7484319FB7855E2BA1310AF79B0F225FCF0290829625E711922D0E2F029EB5935DC22260428E328191D3110BA64C52D6EFC5B42B5E2C274F9D200C8A772F28027C779AD9ECC21D41CF0FF0C313DB6A46DB373F3DEA8A34319AD3C22281A70962AA0F8F2FB279E92DA7725B4F3B633BC1B5C6AF3FEFEA17F142683E19FFFABF27068D18044B3B94614E1195772EE5F53697006DBBF8C972C0F79EEC493ACF2EADB23449AE4B377679324DF1DE549FC25D730782FE8C042F3C1A580CAD4E4A267EE3E8C4FA9C47EB5F8AF388AAD8946B57DB8FD5334D2F20AE050C93F22AC82BE72673FA6CDBC8C02C1C2274987B846485EDB5D2BF74F330B4C716F58FB3F835C1C8A183649AFF7C12CEA9172ABA873280A80D0575F66B72334246A4C4D2317823EDB2D0DA00FFEBEE38BFF0CADB06F93FE474E6A6F3BFCB5C2E5021545AB7409D31F43D08B75880A922173C367BA7573C4C64E05E4AD22F2DE673ABAFDD9793807F5299E7C8F0888BF33D83DC8295E186F8E507F5D7E2535EC40F2243ACD0CB8A83BCB7280E70735CDC546A0C4E52AA519224B7F78F9EA99DFE3A22B9CE44DF2372F959C6DEB8788872AB18827747107265D1B18719D3FAE4121929D34DBA8D9875479955F9E373DAAB2E85E4852625B72AB053FD9257099EFE74B4C48EA53BB81D800D30ADBA78815DD7DBEA4D165FEBF472A99C6690051D3DFB57842FAE4B06F3CDC70519F40A6F38D29FBB7C1F50E815C8D01CFC9E528D7BF0F2B263F352AF8BD5F6804F5AD2FF67396493F04AA11EAA6F6F66DE2F0A +MD = CC1C + +Count = 11 +Msg = 0C292A965C13D5E816C0B1137A47DD90CEB637695BDF997611C250BAE29EE7597F1568384592F1595B71681FC1351EB9C00E13FD09A7C02C8FB48499C31A0578D9579464DEA44A3BC4DD0EE9777AB4DBA496FAD38AE94FD7553CA8910E5896406BEF466AA1B9DB1CC4D7392C99D7B415FFA8F42C2031EDF007BC0FA2FBB82D6C46CD7E87344A3AEBBBDD0FB3AF233E7D87939265636A203A025562E4A938200BAACDE6CB582CE1B46E097043223A40E47E911A6826C709DCAD4385DEE7564182BC0308E23C73255AB2DDF759F9DD18C8157E66181EB8E5E3C30A1E15A702CD17C8ED861E325DA70B6CBFB648CFAFE2D02BBDC969F02864041E241E32540FB3AF10DF900C56F996B7D65AAB5F029C1313274DEAEA3963279F8982000D3F74B65C0B0638EF1FD57931271192957D040181110A0A0725C976ACB8F182D4F9887862A44E53FC6423F452D4B8C327D1912284807EFB3469AF37428F8B372D53A5379E9930F12EB0051DED15B8336C054EDB26CFFD547A8D43F8F517106CD8EBC7FF2E80248DA0A0F3D47A610D1EB17BCA3C40B0115E5551BD115638FB169F9945024EB904ECE1C13A85DB29D9197F2546794DD42B27DA68A9DDC3133768A5DD34E11C0BCFF777DE5B7F758B832B78A49130F182C9CB6D1D27E50F2628CD89D2E0FEF5F7FC73554F026F78ABB24FE57E651E81067723136874FEE4E9E850B58DF6A3AB843580A71EDBA1805A52C16BD8FF91C0094C825ABCEA8D82FE8F6B66B1BAEAB50FA36148E477632BD5A3B915B2930CE9578FAB417348EE9AA8FDA98F6F3ACE9F680C5C349E48DB92E95684193077D06A83810F210EA941C6B5C6A0E6CED3BB9AD419ADA637D74B0EB419581CC4D46A312D3E0BEE2BAD91BFCA967FD8A8F4C4159BE94516C92A32AB36016DF5502401E05B6EB98FC7CD6F2688EEDBA1577266BF544381DA8F5467030B60B72A409B6EA6949F7C393B354DCD791E8DDB4F9154C39AAEA00CA327500707B683671545E6EC7F350DB8F52D831FF6B36070C68BB37A0CF38F92FB62036D4E743184B2E5B83438A15B1A849BCE6D2A8115EFC6E0417B02085B21B653F11D319F6981FBFE6D11FB2C38243099F670252267794C13A66D32B582A989967EE4AF3DE8E4314C712B1404F399A81C4B6812EBFC93EC77D11DF8FC4E467CC48765AE5375F2B1113ED8B03B65471F0CC5156919969E9AEAF8376CCAEB35FE2BAF507C8EEB55A759B700AC23E3B01289FEEC3638DC622DE9CBC45B3D86E72608DA858C15CA9121706D106296F176064725E2CCFFFFC54E4D2293C327F96AD3D0D9A3485E24FCBE6CCAC6CACC0096F754BD1317A31A270914363EF237CDF976033D92BC4E2DA82328235F3438FB824C8C9C6F6AE6532FB5B2993427E50A879FD14FC78E6ED9A92614EFEF7FBBF2D119B3F2669B5D8E90B00DDD0AB4F9803D1E9BBF63E934F4DEB2F24855F663B0F9BFC81B74F3A4EC4142BF178190CFF52D93B2D1E3FB8FE7E5BF13B3A81539994C5DE34AEBDE0B4A79AF7E20291C724DE2FD1BC14492CCFD2FE036B5E0F0442C0925CA24AD84094F886757347D6EBEC84CC5D0AAFA7755B990E51B0AA7566A886B521704514DA05EF4CB39DC3B9780C0226E681A20993292D01193C769FEA731FDCEC92B57BA76FF2472B62E3D787DF9645AE739ED4F68D120853340B9D8F4F52408DF6DCE556968F769F6ADE2035457949A630F176D43AD65F70BD28635454C7EC1093499102A0FF07E428459BAEF1C30DBAC1E75E5DEB6C43107D64A97E2C123A92F21FA1FBE836F531E982BBE54AA08EEA1AA8926D699E25370680954C4599C8061AF8BCD21101D28AF21C6458A05DC5CCE5BF53837FCD3963EA6AF567A1B8FC4FCAB5DA51F3BCD918C6177B4D29DC86A8BAC866863634864DBF48E7B60C7AD93920149DFA7373C928E64ABD6851EC4A1DE44CBCD9526609863F9C92AAC5130C5B3E422D053E9C25370F3DAFFB871DEBD30EC9C1BFCE0FD6BA0B07BAE6E11E63C34E622A1FCF34EF582775DA24C61DFF11A0BFABFB514C9D3E6B72FA26D14E45E0C9DCAD24F3DC13D9EA79984825B1F3FD08A9462172687201D4FBA45C3AB876E93FE95AE970DA2DC4ABC210D7A44508A97F0D1E2808146E616A9B5FF827C79F31F2BF184C670A7C3E8B7185A0479A6D8FE30ADD2D9A5ED11B8AE98ED58A259CE432EEE4E52CCC427480EFAC869EBE19C03DC0052CFA6197A3DE0CB17D7BA6A465D4917D68B5785326C8589CBAB25A7CCCCFBE97CA107FF9C1474107200AC508EA3B36B1FD40B11AC56CEE6491C4ECF1838FF4BDBD0EEA4564A7BC117461332BF35FB27F7B988F8C1EA3D25D320B57FC6A4F739006174BEB50F14D45849FA65439B26142126D85EB00789F192C8D13595FCFB724FD9315EC13D71E8A5B39F78F0D8E237F9A05D9FCC9889F9D7822BEC3DDE3F5C4E8715696AC853E4B4EFB9FD671101BAE69A3CF49E5BA5B65038863E1184AAC673432968C278CC304D79EBDCDF8B91C5817106A2A24ABDF3E25F19324115D23045F38924E798F76DCD0BA72570C8D7C4A6C1BDA07E082428853686635F9AEF38A6BA97EC016CDDE87999D496A397821988548B805731B13CCE619EB112940E331C6E7FB530EBC239E3D427E5348D85EEB36CDA0A0F6EE074095B1DA0CE2CD6E58AA17A3418CDE89D91519D830ACC0841DBB0FDA5B90323AE8E0AACD5CD226BB6FE415A921350D5E6843D78BDD05D693C52DCC41E2F302B867DCBA60D2113CF6FE5E784C972752D8BDA16217C8A66DD31A16F82F15D4D86CD16D31547AAC7C4706D09D8E9D8A0CADDAE3943180FAEFB17EE746CB191DD129860B7B29E60E5E11251B00E818DF45900A5A54223096DBE67 +MD = 30836481F9406F1E0BD310D27A789B3D + diff --git a/kats/scripts/parse_ascon_aead128_acvp_kat.py b/kats/scripts/parse_ascon_aead128_acvp_kat.py new file mode 100755 index 0000000..13a01b8 --- /dev/null +++ b/kats/scripts/parse_ascon_aead128_acvp_kat.py @@ -0,0 +1,48 @@ +#!/usr/bin/python + +import json +import sys + + +def main(): + json_as_str = '' + for line in sys.stdin: + json_as_str += line + + acvp_kats = json.loads(json_as_str) + count = 0 + + for test_group in acvp_kats["testGroups"]: + if test_group["supportsNonceMasking"]: + continue + if test_group["testType"] != "AFT": + continue + + for test in test_group["tests"]: + if test["payloadLen"] % 8 != 0: + continue + if test["aadLen"] % 8 != 0: + continue + if test["tagLen"] % 8 != 0: + continue + + count += 1 + + sys.stdout.write(f'Count = {count}\n') + sys.stdout.write(f'Key = {test["key"]}\n') + sys.stdout.write(f'Nonce = {test["nonce"]}\n') + sys.stdout.write(f'PT = {test["pt"]}\n') + sys.stdout.write(f'AD = {test["aad"]}\n') + sys.stdout.write(f'CT = {test["ct"]}\n') + sys.stdout.write(f'Tag = {test["tag"]}\n') + + if test_group["direction"] == "decrypt": + sys.stdout.write(f'TestPassed = {test["testPassed"]}\n') + else: + sys.stdout.write(f'TestPassed = {True}\n') + + sys.stdout.write('\n') + sys.stdout.flush() + +if __name__=='__main__': + main() diff --git a/kats/scripts/parse_ascon_cxof128_acvp_kat.py b/kats/scripts/parse_ascon_cxof128_acvp_kat.py new file mode 100755 index 0000000..3c6e2bb --- /dev/null +++ b/kats/scripts/parse_ascon_cxof128_acvp_kat.py @@ -0,0 +1,44 @@ +#!/usr/bin/python + +import json +import sys + + +def main(): + json_as_str = '' + for line in sys.stdin: + json_as_str += line + + acvp_kats = json.loads(json_as_str) + count = 0 + + for test_group in acvp_kats["testGroups"]: + if test_group["testType"] != "AFT": + continue + + for test in test_group["tests"]: + if test["len"] % 8 != 0: + continue + if test["csLen"] % 8 != 0: + continue + + out_bit_len = test["outLen"] + smaller_out_bit_len = out_bit_len & -8 + smaller_out_byte_len = smaller_out_bit_len // 8 + hex_char_len = smaller_out_byte_len * 2 + + if hex_char_len == 0: + continue + + count += 1 + + sys.stdout.write(f'Count = {count}\n') + sys.stdout.write(f'Msg = {test["msg"]}\n') + sys.stdout.write(f'Z = {test["cs"]}\n') + sys.stdout.write(f'MD = {test["md"][:hex_char_len]}\n') + + sys.stdout.write('\n') + sys.stdout.flush() + +if __name__=='__main__': + main() diff --git a/kats/scripts/parse_ascon_hash256_acvp_kat.py b/kats/scripts/parse_ascon_hash256_acvp_kat.py new file mode 100755 index 0000000..e872aaf --- /dev/null +++ b/kats/scripts/parse_ascon_hash256_acvp_kat.py @@ -0,0 +1,33 @@ +#!/usr/bin/python + +import json +import sys + + +def main(): + json_as_str = '' + for line in sys.stdin: + json_as_str += line + + acvp_kats = json.loads(json_as_str) + count = 0 + + for test_group in acvp_kats["testGroups"]: + if test_group["testType"] != "AFT": + continue + + for test in test_group["tests"]: + if test["len"] % 8 != 0: + continue + + count += 1 + + sys.stdout.write(f'Count = {count}\n') + sys.stdout.write(f'Msg = {test["msg"]}\n') + sys.stdout.write(f'MD = {test["md"]}\n') + + sys.stdout.write('\n') + sys.stdout.flush() + +if __name__=='__main__': + main() diff --git a/kats/scripts/parse_ascon_xof128_acvp_kat.py b/kats/scripts/parse_ascon_xof128_acvp_kat.py new file mode 100755 index 0000000..e7aa7ab --- /dev/null +++ b/kats/scripts/parse_ascon_xof128_acvp_kat.py @@ -0,0 +1,41 @@ +#!/usr/bin/python + +import json +import sys + + +def main(): + json_as_str = '' + for line in sys.stdin: + json_as_str += line + + acvp_kats = json.loads(json_as_str) + count = 0 + + for test_group in acvp_kats["testGroups"]: + if test_group["testType"] != "AFT": + continue + + for test in test_group["tests"]: + if test["len"] % 8 != 0: + continue + + out_bit_len = test["outLen"] + smaller_out_bit_len = out_bit_len & -8 + smaller_out_byte_len = smaller_out_bit_len // 8 + hex_char_len = smaller_out_byte_len * 2 + + if hex_char_len == 0: + continue + + count += 1 + + sys.stdout.write(f'Count = {count}\n') + sys.stdout.write(f'Msg = {test["msg"]}\n') + sys.stdout.write(f'MD = {test["md"][:hex_char_len]}\n') + + sys.stdout.write('\n') + sys.stdout.flush() + +if __name__=='__main__': + main() diff --git a/kats/scripts/sync_acvp_kats.sh b/kats/scripts/sync_acvp_kats.sh new file mode 100755 index 0000000..4807a20 --- /dev/null +++ b/kats/scripts/sync_acvp_kats.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +ACVP_SERVER_REPO_PATH="ACVP-Server" +if [ -d "$ACVP_SERVER_REPO_PATH" ]; then + echo "> $ACVP_SERVER_REPO_PATH repository exists, let's just fetch latest." + + pushd $ACVP_SERVER_REPO_PATH + git checkout master + git fetch + git pull origin master + popd +else + echo "> $ACVP_SERVER_REPO_PATH repository doesn't exist, let's clone it." + git clone https://github.com/usnistgov/ACVP-Server.git +fi + +cat ./ACVP-Server/gen-val/json-files/Ascon-AEAD128-SP800-232/internalProjection.json | python parse_ascon_aead128_acvp_kat.py > ../ascon_aead128.acvp.kat +cat ./ACVP-Server/gen-val/json-files/Ascon-Hash256-SP800-232/internalProjection.json | python parse_ascon_hash256_acvp_kat.py > ../ascon_hash256.acvp.kat +cat ./ACVP-Server/gen-val/json-files/Ascon-XOF128-SP800-232/internalProjection.json | python parse_ascon_xof128_acvp_kat.py > ../ascon_xof128.acvp.kat +cat ./ACVP-Server/gen-val/json-files/Ascon-CXOF128-SP800-232/internalProjection.json | python parse_ascon_cxof128_acvp_kat.py > ../ascon_cxof128.acvp.kat + +echo "> Generated all NIST ACVP KATs." diff --git a/tests/kat_ascon_aead128.cpp b/tests/kat_ascon_aead128.cpp index 2995f8c..23fdb51 100644 --- a/tests/kat_ascon_aead128.cpp +++ b/tests/kat_ascon_aead128.cpp @@ -82,3 +82,97 @@ TEST(AsconAEAD128, KnownAnswerTests) file.close(); } + +TEST(AsconAEAD128, ACVPKnownAnswerTests) +{ + using namespace std::literals; + + const std::string kat_file = "./kats/ascon_aead128.acvp.kat"; + std::fstream file(kat_file); + + while (true) { + std::string count0; + + if (!std::getline(file, count0).eof()) { + std::string key0; + std::string nonce0; + std::string pt0; + std::string ad0; + std::string ct0; + std::string tag0; + std::string test_passed0; + + std::getline(file, key0); + std::getline(file, nonce0); + std::getline(file, pt0); + std::getline(file, ad0); + std::getline(file, ct0); + std::getline(file, tag0); + std::getline(file, test_passed0); + + auto key1 = std::string_view(key0); + auto nonce1 = std::string_view(nonce0); + auto pt1 = std::string_view(pt0); + auto ad1 = std::string_view(ad0); + auto ct1 = std::string_view(ct0); + auto tag1 = std::string_view(tag0); + auto test_passed1 = std::string_view(test_passed0); + + auto key2 = key1.substr(key1.find("="sv) + 2, key1.size()); + auto nonce2 = nonce1.substr(nonce1.find("="sv) + 2, nonce1.size()); + auto pt2 = ((pt1.find("="sv) + 2) > pt1.size()) ? ""sv : pt1.substr(pt1.find("="sv) + 2, pt1.size()); + auto ad2 = ((ad1.find("="sv) + 2) > ad1.size()) ? ""sv : ad1.substr(ad1.find("="sv) + 2, ad1.size()); + auto ct2 = ct1.substr(ct1.find("="sv) + 2, ct1.size()); + auto tag2 = tag1.substr(tag1.find("="sv) + 2, tag1.size()); + auto test_passed2 = test_passed1.substr(test_passed1.find("="sv) + 2, test_passed1.size()); + + auto key = hex_to_bytes(key2); + auto nonce = hex_to_bytes(nonce2); + auto pt = hex_to_bytes(pt2); + auto ad = hex_to_bytes(ad2); + auto ct = hex_to_bytes(ct2); + auto tag = hex_to_bytes(tag2); + auto test_passed = test_passed2 == "True"; + + auto key_span = std::span(key); + auto nonce_span = std::span(nonce); + auto ct_span = std::span(ct); + + std::vector computed_ct(pt.size()); + std::array computed_tag{}; + std::vector computed_pt(computed_ct.size()); + auto computed_tag_span = std::span(computed_tag); + + ascon_aead128::ascon_aead128_t enc_handle(key_span, nonce_span); + + EXPECT_EQ(enc_handle.absorb_data(ad), ascon_aead128::ascon_aead128_status_t::absorbed_data); + EXPECT_EQ(enc_handle.finalize_data(), ascon_aead128::ascon_aead128_status_t::finalized_data_absorption_phase); + + EXPECT_EQ(enc_handle.encrypt_plaintext(pt, computed_ct), ascon_aead128::ascon_aead128_status_t::encrypted_plaintext); + EXPECT_EQ(enc_handle.finalize_encrypt(computed_tag_span), ascon_aead128::ascon_aead128_status_t::finalized_encryption_phase); + + ascon_aead128::ascon_aead128_t dec_handle(key_span, nonce_span); + + EXPECT_EQ(dec_handle.absorb_data(ad), ascon_aead128::ascon_aead128_status_t::absorbed_data); + EXPECT_EQ(dec_handle.finalize_data(), ascon_aead128::ascon_aead128_status_t::finalized_data_absorption_phase); + + EXPECT_EQ(dec_handle.decrypt_ciphertext(computed_ct, computed_pt), ascon_aead128::ascon_aead128_status_t::decrypted_ciphertext); + EXPECT_EQ(dec_handle.finalize_decrypt(computed_tag_span), ascon_aead128::ascon_aead128_status_t::decryption_success_as_tag_matches); + + EXPECT_TRUE(std::ranges::equal(ct_span.first(pt.size()), computed_ct)); + + if (test_passed) { + EXPECT_TRUE(std::ranges::equal(tag, computed_tag_span.first(tag.size()))); + } else { + EXPECT_FALSE(std::ranges::equal(tag, computed_tag_span.first(tag.size()))); + } + + std::string empty_line; + std::getline(file, empty_line); + } else { + break; + } + } + + file.close(); +} diff --git a/tests/kat_ascon_cxof128.cpp b/tests/kat_ascon_cxof128.cpp index 705643e..e188127 100644 --- a/tests/kat_ascon_cxof128.cpp +++ b/tests/kat_ascon_cxof128.cpp @@ -3,12 +3,11 @@ #include #include -TEST(AsconCXOF128, KnownAnswerTests) +static void +ascon_cxof128_KAT_runner(const std::string file_name) { using namespace std::literals; - - const std::string kat_file = "./kats/ascon_cxof128.kat"; - std::fstream file(kat_file); + std::fstream file(file_name); while (true) { std::string count0; @@ -37,10 +36,10 @@ TEST(AsconCXOF128, KnownAnswerTests) std::vector computed_md(md.size()); ascon_cxof128::ascon_cxof128_t hasher; - EXPECT_TRUE(hasher.customize(customization_str)); - EXPECT_TRUE(hasher.absorb(msg)); - EXPECT_TRUE(hasher.finalize()); - EXPECT_TRUE(hasher.squeeze(computed_md)); + EXPECT_EQ(hasher.customize(customization_str), ascon_cxof128::ascon_cxof128_status_t::customized); + EXPECT_EQ(hasher.absorb(msg), ascon_cxof128::ascon_cxof128_status_t::absorbed_data); + EXPECT_EQ(hasher.finalize(), ascon_cxof128::ascon_cxof128_status_t::finalized_data_absorption_phase); + EXPECT_EQ(hasher.squeeze(computed_md), ascon_cxof128::ascon_cxof128_status_t::squeezed_output); EXPECT_EQ(computed_md, md); @@ -53,3 +52,13 @@ TEST(AsconCXOF128, KnownAnswerTests) file.close(); } + +TEST(AsconCXOF128, KnownAnswerTests) +{ + ascon_cxof128_KAT_runner("./kats/ascon_cxof128.kat"); +} + +TEST(AsconCXOF128, ACVPKnownAnswerTests) +{ + ascon_cxof128_KAT_runner("./kats/ascon_cxof128.acvp.kat"); +} diff --git a/tests/kat_ascon_hash256.cpp b/tests/kat_ascon_hash256.cpp index 1056e16..d044e92 100644 --- a/tests/kat_ascon_hash256.cpp +++ b/tests/kat_ascon_hash256.cpp @@ -4,12 +4,11 @@ #include #include -TEST(AsconHash256, KnownAnswerTests) +static void +ascon_hash256_KAT_runner(const std::string file_name) { using namespace std::literals; - - const std::string kat_file = "./kats/ascon_hash256.kat"; - std::fstream file(kat_file); + std::fstream file(file_name); while (true) { std::string count0; @@ -33,9 +32,9 @@ TEST(AsconHash256, KnownAnswerTests) std::array computed_md{}; ascon_hash256::ascon_hash256_t hasher; - EXPECT_TRUE(hasher.absorb(msg)); - EXPECT_TRUE(hasher.finalize()); - EXPECT_TRUE(hasher.digest(computed_md)); + EXPECT_EQ(hasher.absorb(msg), ascon_hash256::ascon_hash256_status_t::absorbed_data); + EXPECT_EQ(hasher.finalize(), ascon_hash256::ascon_hash256_status_t::finalized_data_absorption_phase); + EXPECT_EQ(hasher.digest(computed_md), ascon_hash256::ascon_hash256_status_t::message_digest_produced); EXPECT_TRUE(std::ranges::equal(computed_md, md)); @@ -48,3 +47,13 @@ TEST(AsconHash256, KnownAnswerTests) file.close(); } + +TEST(AsconHash256, KnownAnswerTests) +{ + ascon_hash256_KAT_runner("./kats/ascon_hash256.kat"); +} + +TEST(AsconHash256, ACVPKnownAnswerTests) +{ + ascon_hash256_KAT_runner("./kats/ascon_hash256.acvp.kat"); +} diff --git a/tests/kat_ascon_xof128.cpp b/tests/kat_ascon_xof128.cpp index 95d791c..9b63d4d 100644 --- a/tests/kat_ascon_xof128.cpp +++ b/tests/kat_ascon_xof128.cpp @@ -3,12 +3,11 @@ #include #include -TEST(AsconXof128, KnownAnswerTests) +static void +ascon_xof128_KAT_runner(const std::string file_name) { using namespace std::literals; - - const std::string kat_file = "./kats/ascon_xof128.kat"; - std::fstream file(kat_file); + std::fstream file(file_name); while (true) { std::string count0; @@ -32,9 +31,9 @@ TEST(AsconXof128, KnownAnswerTests) std::vector computed_md(md.size()); ascon_xof128::ascon_xof128_t hasher; - EXPECT_TRUE(hasher.absorb(msg)); - EXPECT_TRUE(hasher.finalize()); - EXPECT_TRUE(hasher.squeeze(computed_md)); + EXPECT_EQ(hasher.absorb(msg), ascon_xof128::ascon_xof128_status_t::absorbed_data); + EXPECT_EQ(hasher.finalize(), ascon_xof128::ascon_xof128_status_t::finalized_data_absorption_phase); + EXPECT_EQ(hasher.squeeze(computed_md), ascon_xof128::ascon_xof128_status_t::squeezed_output); EXPECT_EQ(computed_md, md); @@ -47,3 +46,13 @@ TEST(AsconXof128, KnownAnswerTests) file.close(); } + +TEST(AsconXof128, KnownAnswerTests) +{ + ascon_xof128_KAT_runner("./kats/ascon_xof128.kat"); +} + +TEST(AsconXof128, ACVPKnownAnswerTests) +{ + ascon_xof128_KAT_runner("./kats/ascon_xof128.acvp.kat"); +} diff --git a/tests/prop_test_ascon_cxof128.cpp b/tests/prop_test_ascon_cxof128.cpp index 717f59c..05b28fe 100644 --- a/tests/prop_test_ascon_cxof128.cpp +++ b/tests/prop_test_ascon_cxof128.cpp @@ -1,5 +1,6 @@ #include "ascon/hashes/ascon_cxof128.hpp" #include "test_helper.hpp" +#include #include #include @@ -21,26 +22,28 @@ eval_ascon_cxof128() std::array md{}; ascon_cxof128::ascon_cxof128_t hasher; - assert(hasher.customize(cust_str)); - assert(hasher.absorb(data)); - assert(hasher.finalize()); - assert(hasher.squeeze(md)); + assert(hasher.customize(cust_str) == ascon_cxof128::ascon_cxof128_status_t::customized); + assert(hasher.absorb(data) == ascon_cxof128::ascon_cxof128_status_t::absorbed_data); + assert(hasher.finalize() == ascon_cxof128::ascon_cxof128_status_t::finalized_data_absorption_phase); + assert(hasher.squeeze(md) == ascon_cxof128::ascon_cxof128_status_t::squeezed_output); // Returns hex-encoded digest. return bytes_to_hex(md); } -TEST(AsconCXOF128, CompileTimeComputeXofOutput) +TEST(AsconCXOF128, CompileTimeComputeCXOFOutput) { - // AsconCXOF128("000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f") = - // "0b8e325b9bbf1bb43e77aa1eed93bee62b4ea1e4b0c5a696b2f5c5b09c968918" + constexpr auto expected_output = + std::array{ 'E', '0', '9', '8', 'F', '0', '4', '7', 'A', '8', 'A', 'C', 'A', '0', '3', '1', '7', '0', '7', '6', 'E', '4', + '8', '2', 'E', '2', '8', '4', 'F', '5', '7', '9', 'B', 'E', '1', '7', '3', 'A', '2', 'F', '0', 'B', 'D', '5', + '6', '8', 'D', '3', '3', '1', '9', '8', '3', '1', 'B', 'A', '3', '5', '2', '8', 'C', '4', '4', 'D' }; + + // AsconCXOF128("000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f") = "E098F047A8ACA0317076E482E284F579BE173A2F0BD568D3319831BA3528C44D" constexpr auto md = eval_ascon_cxof128(); - constexpr auto flg = md == std::array{ '0', 'b', '8', 'e', '3', '2', '5', 'b', '9', 'b', 'b', 'f', '1', 'b', 'b', '4', '3', 'e', '7', '7', 'a', 'a', - '1', 'e', 'e', 'd', '9', '3', 'b', 'e', 'e', '6', '2', 'b', '4', 'e', 'a', '1', 'e', '4', 'b', '0', 'c', '5', - 'a', '6', '9', '6', 'b', '2', 'f', '5', 'c', '5', 'b', '0', '9', 'c', '9', '6', '8', '9', '1', '8' }; + constexpr auto is_matching = md == expected_output; - static_assert(!flg, "Must not be able to evaluate Ascon-CXOF128 correctly, as expected output is wrong. I'll update it !"); - EXPECT_FALSE(flg); + static_assert(is_matching, "Must be able to evaluate Ascon-CXOF128 during program compilation time itself !"); + EXPECT_TRUE(is_matching); } TEST(AsconCXOF128, ForSameMessageOneshotHashingAndIncrementalHashingProducesSameOutput) @@ -64,38 +67,38 @@ TEST(AsconCXOF128, ForSameMessageOneshotHashingAndIncrementalHashingProducesSame { ascon_cxof128::ascon_cxof128_t hasher; - EXPECT_TRUE(hasher.customize(cust_str)); - EXPECT_TRUE(hasher.absorb(msg_span)); - EXPECT_TRUE(hasher.finalize()); - EXPECT_TRUE(hasher.squeeze(digest_oneshot_span)); + EXPECT_EQ(hasher.customize(cust_str), ascon_cxof128::ascon_cxof128_status_t::customized); + EXPECT_EQ(hasher.absorb(msg_span), ascon_cxof128::ascon_cxof128_status_t::absorbed_data); + EXPECT_EQ(hasher.finalize(), ascon_cxof128::ascon_cxof128_status_t::finalized_data_absorption_phase); + EXPECT_EQ(hasher.squeeze(digest_oneshot_span), ascon_cxof128::ascon_cxof128_status_t::squeezed_output); } // Incremental hashing { ascon_cxof128::ascon_cxof128_t hasher; - EXPECT_TRUE(hasher.customize(cust_str)); + EXPECT_EQ(hasher.customize(cust_str), ascon_cxof128::ascon_cxof128_status_t::customized); size_t msg_offset = 0; while (msg_offset < msg_byte_len) { // Because we don't want to be stuck in an infinite loop if msg[off] = 0 const auto elen = std::min(std::max(msg_span[msg_offset], 1), msg_byte_len - msg_offset); - EXPECT_TRUE(hasher.absorb(msg_span.subspan(msg_offset, elen))); + EXPECT_EQ(hasher.absorb(msg_span.subspan(msg_offset, elen)), ascon_cxof128::ascon_cxof128_status_t::absorbed_data); msg_offset += elen; } - EXPECT_TRUE(hasher.finalize()); + EXPECT_EQ(hasher.finalize(), ascon_cxof128::ascon_cxof128_status_t::finalized_data_absorption_phase); // Squeeze message bytes in many iterations size_t output_offset = 0; while (output_offset < output_byte_len) { - EXPECT_TRUE(hasher.squeeze(digest_multishot_span.subspan(output_offset, 1))); + EXPECT_EQ(hasher.squeeze(digest_multishot_span.subspan(output_offset, 1)), ascon_cxof128::ascon_cxof128_status_t::squeezed_output); auto elen = std::min(digest_multishot_span[output_offset], output_byte_len - (output_offset + 1)); output_offset += 1; - EXPECT_TRUE(hasher.squeeze(digest_multishot_span.subspan(output_offset, elen))); + EXPECT_EQ(hasher.squeeze(digest_multishot_span.subspan(output_offset, elen)), ascon_cxof128::ascon_cxof128_status_t::squeezed_output); output_offset += elen; } } @@ -105,3 +108,193 @@ TEST(AsconCXOF128, ForSameMessageOneshotHashingAndIncrementalHashingProducesSame } } } + +TEST(AsconCXOF128, ValidCXOFSequence) +{ + std::array cstr{}; + std::array msg{}; + std::array output{}; + + ascon_cxof128::ascon_cxof128_t cxof; + EXPECT_EQ(cxof.customize(cstr), ascon_cxof128::ascon_cxof128_status_t::customized); + EXPECT_EQ(cxof.absorb(msg), ascon_cxof128::ascon_cxof128_status_t::absorbed_data); + EXPECT_EQ(cxof.finalize(), ascon_cxof128::ascon_cxof128_status_t::finalized_data_absorption_phase); + EXPECT_EQ(cxof.squeeze(output), ascon_cxof128::ascon_cxof128_status_t::squeezed_output); +} + +TEST(AsconCXOF128, MultipleCustomizeCalls) +{ + std::array cstr{}; + std::array msg{}; + std::array output{}; + + ascon_cxof128::ascon_cxof128_t cxof; + EXPECT_EQ(cxof.customize(cstr), ascon_cxof128::ascon_cxof128_status_t::customized); + EXPECT_EQ(cxof.customize(cstr), ascon_cxof128::ascon_cxof128_status_t::already_customized); + EXPECT_EQ(cxof.absorb(msg), ascon_cxof128::ascon_cxof128_status_t::absorbed_data); + EXPECT_EQ(cxof.finalize(), ascon_cxof128::ascon_cxof128_status_t::finalized_data_absorption_phase); + EXPECT_EQ(cxof.squeeze(output), ascon_cxof128::ascon_cxof128_status_t::squeezed_output); +} + +TEST(AsconCXOF128, MultipleAbsorbCalls) +{ + std::array cstr{}; + std::array msg{}; + std::array output{}; + + ascon_cxof128::ascon_cxof128_t cxof; + EXPECT_EQ(cxof.customize(cstr), ascon_cxof128::ascon_cxof128_status_t::customized); + EXPECT_EQ(cxof.absorb(msg), ascon_cxof128::ascon_cxof128_status_t::absorbed_data); + EXPECT_EQ(cxof.absorb(msg), ascon_cxof128::ascon_cxof128_status_t::absorbed_data); + EXPECT_EQ(cxof.finalize(), ascon_cxof128::ascon_cxof128_status_t::finalized_data_absorption_phase); + EXPECT_EQ(cxof.squeeze(output), ascon_cxof128::ascon_cxof128_status_t::squeezed_output); +} + +TEST(AsconCXOF128, MultipleFinalizeCalls) +{ + std::array cstr{}; + std::array msg{}; + std::array output{}; + + ascon_cxof128::ascon_cxof128_t cxof; + EXPECT_EQ(cxof.customize(cstr), ascon_cxof128::ascon_cxof128_status_t::customized); + EXPECT_EQ(cxof.absorb(msg), ascon_cxof128::ascon_cxof128_status_t::absorbed_data); + EXPECT_EQ(cxof.finalize(), ascon_cxof128::ascon_cxof128_status_t::finalized_data_absorption_phase); + EXPECT_EQ(cxof.finalize(), ascon_cxof128::ascon_cxof128_status_t::data_absorption_phase_already_finalized); + EXPECT_EQ(cxof.squeeze(output), ascon_cxof128::ascon_cxof128_status_t::squeezed_output); +} + +TEST(AsconCXOF128, MultipleSqueezeCalls) +{ + std::array cstr{}; + std::array msg{}; + std::array output{}; + + ascon_cxof128::ascon_cxof128_t cxof; + EXPECT_EQ(cxof.customize(cstr), ascon_cxof128::ascon_cxof128_status_t::customized); + EXPECT_EQ(cxof.absorb(msg), ascon_cxof128::ascon_cxof128_status_t::absorbed_data); + EXPECT_EQ(cxof.finalize(), ascon_cxof128::ascon_cxof128_status_t::finalized_data_absorption_phase); + EXPECT_EQ(cxof.squeeze(output), ascon_cxof128::ascon_cxof128_status_t::squeezed_output); + EXPECT_EQ(cxof.squeeze(output), ascon_cxof128::ascon_cxof128_status_t::squeezed_output); +} + +TEST(AsconCXOF128, CustomizeDuringAbsorption) +{ + std::array cstr{}; + std::array msg{}; + std::array output{}; + + ascon_cxof128::ascon_cxof128_t cxof; + EXPECT_EQ(cxof.customize(cstr), ascon_cxof128::ascon_cxof128_status_t::customized); + EXPECT_EQ(cxof.absorb(msg), ascon_cxof128::ascon_cxof128_status_t::absorbed_data); + EXPECT_EQ(cxof.customize(cstr), ascon_cxof128::ascon_cxof128_status_t::already_customized); + EXPECT_EQ(cxof.finalize(), ascon_cxof128::ascon_cxof128_status_t::finalized_data_absorption_phase); + EXPECT_EQ(cxof.squeeze(output), ascon_cxof128::ascon_cxof128_status_t::squeezed_output); +} + +TEST(AsconCXOF128, CustomizeAfterFinalization) +{ + std::array cstr{}; + std::array msg{}; + std::array output{}; + + ascon_cxof128::ascon_cxof128_t cxof; + EXPECT_EQ(cxof.customize(cstr), ascon_cxof128::ascon_cxof128_status_t::customized); + EXPECT_EQ(cxof.absorb(msg), ascon_cxof128::ascon_cxof128_status_t::absorbed_data); + EXPECT_EQ(cxof.finalize(), ascon_cxof128::ascon_cxof128_status_t::finalized_data_absorption_phase); + EXPECT_EQ(cxof.customize(cstr), ascon_cxof128::ascon_cxof128_status_t::already_customized); + EXPECT_EQ(cxof.squeeze(output), ascon_cxof128::ascon_cxof128_status_t::squeezed_output); +} + +TEST(AsconCXOF128, CustomizeDuringSqueezing) +{ + std::array cstr{}; + std::array msg{}; + std::array output{}; + + ascon_cxof128::ascon_cxof128_t cxof; + EXPECT_EQ(cxof.customize(cstr), ascon_cxof128::ascon_cxof128_status_t::customized); + EXPECT_EQ(cxof.absorb(msg), ascon_cxof128::ascon_cxof128_status_t::absorbed_data); + EXPECT_EQ(cxof.finalize(), ascon_cxof128::ascon_cxof128_status_t::finalized_data_absorption_phase); + EXPECT_EQ(cxof.squeeze(output), ascon_cxof128::ascon_cxof128_status_t::squeezed_output); + EXPECT_EQ(cxof.customize(cstr), ascon_cxof128::ascon_cxof128_status_t::already_customized); +} + +TEST(AsconCXOF128, AbsorbMessageAfterFinalization) +{ + std::array cstr{}; + std::array msg{}; + std::array output{}; + + ascon_cxof128::ascon_cxof128_t cxof; + EXPECT_EQ(cxof.customize(cstr), ascon_cxof128::ascon_cxof128_status_t::customized); + EXPECT_EQ(cxof.absorb(msg), ascon_cxof128::ascon_cxof128_status_t::absorbed_data); + EXPECT_EQ(cxof.finalize(), ascon_cxof128::ascon_cxof128_status_t::finalized_data_absorption_phase); + EXPECT_EQ(cxof.absorb(msg), ascon_cxof128::ascon_cxof128_status_t::data_absorption_phase_already_finalized); + EXPECT_EQ(cxof.squeeze(output), ascon_cxof128::ascon_cxof128_status_t::squeezed_output); +} + +TEST(AsconCXOF128, AbsorbMessageDuringSqueezing) +{ + std::array cstr{}; + std::array msg{}; + std::array output{}; + + ascon_cxof128::ascon_cxof128_t cxof; + EXPECT_EQ(cxof.customize(cstr), ascon_cxof128::ascon_cxof128_status_t::customized); + EXPECT_EQ(cxof.absorb(msg), ascon_cxof128::ascon_cxof128_status_t::absorbed_data); + EXPECT_EQ(cxof.finalize(), ascon_cxof128::ascon_cxof128_status_t::finalized_data_absorption_phase); + EXPECT_EQ(cxof.squeeze(output), ascon_cxof128::ascon_cxof128_status_t::squeezed_output); + EXPECT_EQ(cxof.absorb(msg), ascon_cxof128::ascon_cxof128_status_t::data_absorption_phase_already_finalized); +} + +TEST(AsconCXOF128, FinalizeDuringSqueezing) +{ + std::array cstr{}; + std::array msg{}; + std::array output{}; + + ascon_cxof128::ascon_cxof128_t cxof; + EXPECT_EQ(cxof.customize(cstr), ascon_cxof128::ascon_cxof128_status_t::customized); + EXPECT_EQ(cxof.absorb(msg), ascon_cxof128::ascon_cxof128_status_t::absorbed_data); + EXPECT_EQ(cxof.finalize(), ascon_cxof128::ascon_cxof128_status_t::finalized_data_absorption_phase); + EXPECT_EQ(cxof.squeeze(output), ascon_cxof128::ascon_cxof128_status_t::squeezed_output); + EXPECT_EQ(cxof.finalize(), ascon_cxof128::ascon_cxof128_status_t::data_absorption_phase_already_finalized); +} + +TEST(AsconCXOF128, AbsorbWithoutCustomize) +{ + std::array cstr{}; + std::array msg{}; + std::array output{}; + + ascon_cxof128::ascon_cxof128_t cxof; + EXPECT_EQ(cxof.absorb(msg), ascon_cxof128::ascon_cxof128_status_t::not_yet_customized); + EXPECT_EQ(cxof.customize(cstr), ascon_cxof128::ascon_cxof128_status_t::customized); + EXPECT_EQ(cxof.absorb(msg), ascon_cxof128::ascon_cxof128_status_t::absorbed_data); + EXPECT_EQ(cxof.finalize(), ascon_cxof128::ascon_cxof128_status_t::finalized_data_absorption_phase); + EXPECT_EQ(cxof.squeeze(output), ascon_cxof128::ascon_cxof128_status_t::squeezed_output); +} + +TEST(AsconCXOF128, FinalizeWithoutAbsorb) +{ + std::array cstr{}; + std::array output{}; + + ascon_cxof128::ascon_cxof128_t cxof; + EXPECT_EQ(cxof.customize(cstr), ascon_cxof128::ascon_cxof128_status_t::customized); + EXPECT_EQ(cxof.finalize(), ascon_cxof128::ascon_cxof128_status_t::finalized_data_absorption_phase); + EXPECT_EQ(cxof.squeeze(output), ascon_cxof128::ascon_cxof128_status_t::squeezed_output); +} + +TEST(AsconCXOF128, SqueezeWithoutFinalize) +{ + std::array cstr{}; + std::array msg{}; + std::array output{}; + + ascon_cxof128::ascon_cxof128_t cxof; + EXPECT_EQ(cxof.customize(cstr), ascon_cxof128::ascon_cxof128_status_t::customized); + EXPECT_EQ(cxof.absorb(msg), ascon_cxof128::ascon_cxof128_status_t::absorbed_data); + EXPECT_EQ(cxof.squeeze(output), ascon_cxof128::ascon_cxof128_status_t::still_in_data_absorption_phase); +} diff --git a/tests/prop_test_ascon_hash256.cpp b/tests/prop_test_ascon_hash256.cpp index c2d0df1..35a4bbe 100644 --- a/tests/prop_test_ascon_hash256.cpp +++ b/tests/prop_test_ascon_hash256.cpp @@ -1,5 +1,6 @@ #include "ascon/hashes/ascon_hash256.hpp" #include "test_helper.hpp" +#include #include #include @@ -17,9 +18,9 @@ eval_ascon_hash256() std::array md{}; ascon_hash256::ascon_hash256_t hasher; - assert(hasher.absorb(data)); - assert(hasher.finalize()); - assert(hasher.digest(md)); + assert(hasher.absorb(data) == ascon_hash256::ascon_hash256_status_t::absorbed_data); + assert(hasher.finalize() == ascon_hash256::ascon_hash256_status_t::finalized_data_absorption_phase); + assert(hasher.digest(md) == ascon_hash256::ascon_hash256_status_t::message_digest_produced); // Returns hex-encoded digest. return bytes_to_hex(md); @@ -59,9 +60,9 @@ TEST(AsconHash256, ForSameMessageOneshotHashingAndIncrementalHashingProducesSame { ascon_hash256::ascon_hash256_t hasher; - EXPECT_TRUE(hasher.absorb(msg_span)); - EXPECT_TRUE(hasher.finalize()); - EXPECT_TRUE(hasher.digest(digest_oneshot)); + EXPECT_EQ(hasher.absorb(msg_span), ascon_hash256::ascon_hash256_status_t::absorbed_data); + EXPECT_EQ(hasher.finalize(), ascon_hash256::ascon_hash256_status_t::finalized_data_absorption_phase); + EXPECT_EQ(hasher.digest(digest_oneshot), ascon_hash256::ascon_hash256_status_t::message_digest_produced); } // Incremental hashing @@ -73,14 +74,120 @@ TEST(AsconHash256, ForSameMessageOneshotHashingAndIncrementalHashingProducesSame // Because we don't want to be stuck in an infinite loop if msg[msg_offset] = 0 const auto elen = std::min(std::max(msg[msg_offset], 1), msg_byte_len - msg_offset); - EXPECT_TRUE(hasher.absorb(msg_span.subspan(msg_offset, elen))); + EXPECT_EQ(hasher.absorb(msg_span.subspan(msg_offset, elen)), ascon_hash256::ascon_hash256_status_t::absorbed_data); msg_offset += elen; } - EXPECT_TRUE(hasher.finalize()); - EXPECT_TRUE(hasher.digest(digest_multishot)); + EXPECT_EQ(hasher.finalize(), ascon_hash256::ascon_hash256_status_t::finalized_data_absorption_phase); + EXPECT_EQ(hasher.digest(digest_multishot), ascon_hash256::ascon_hash256_status_t::message_digest_produced); } EXPECT_EQ(digest_oneshot, digest_multishot); } } + +TEST(AsconHash256, ValidHashingSequence) +{ + std::array msg{}; + std::array digest{}; + + ascon_hash256::ascon_hash256_t hasher; + EXPECT_EQ(hasher.absorb(msg), ascon_hash256::ascon_hash256_status_t::absorbed_data); + EXPECT_EQ(hasher.finalize(), ascon_hash256::ascon_hash256_status_t::finalized_data_absorption_phase); + EXPECT_EQ(hasher.digest(digest), ascon_hash256::ascon_hash256_status_t::message_digest_produced); +} + +TEST(AsconHash256, MultipleAbsorbCalls) +{ + std::array msg1{}; + std::array msg2{}; + std::array digest{}; + + ascon_hash256::ascon_hash256_t hasher; + EXPECT_EQ(hasher.absorb(msg1), ascon_hash256::ascon_hash256_status_t::absorbed_data); + EXPECT_EQ(hasher.absorb(msg2), ascon_hash256::ascon_hash256_status_t::absorbed_data); + EXPECT_EQ(hasher.finalize(), ascon_hash256::ascon_hash256_status_t::finalized_data_absorption_phase); + EXPECT_EQ(hasher.digest(digest), ascon_hash256::ascon_hash256_status_t::message_digest_produced); +} + +TEST(AsconHash256, MultipleFinalizeCalls) +{ + std::array msg{}; + std::array digest{}; + + ascon_hash256::ascon_hash256_t hasher; + EXPECT_EQ(hasher.absorb(msg), ascon_hash256::ascon_hash256_status_t::absorbed_data); + EXPECT_EQ(hasher.finalize(), ascon_hash256::ascon_hash256_status_t::finalized_data_absorption_phase); + EXPECT_EQ(hasher.finalize(), ascon_hash256::ascon_hash256_status_t::data_absorption_phase_already_finalized); + EXPECT_EQ(hasher.digest(digest), ascon_hash256::ascon_hash256_status_t::message_digest_produced); +} + +TEST(AsconHash256, MultipleProduceDigestCalls) +{ + std::array msg{}; + std::array digest1{}; + std::array digest2{}; + + ascon_hash256::ascon_hash256_t hasher; + EXPECT_EQ(hasher.absorb(msg), ascon_hash256::ascon_hash256_status_t::absorbed_data); + EXPECT_EQ(hasher.finalize(), ascon_hash256::ascon_hash256_status_t::finalized_data_absorption_phase); + EXPECT_EQ(hasher.digest(digest1), ascon_hash256::ascon_hash256_status_t::message_digest_produced); + EXPECT_EQ(hasher.digest(digest2), ascon_hash256::ascon_hash256_status_t::message_digest_already_produced); +} + +TEST(AsconHash256, AbsorbMessageAfterFinalize) +{ + std::array msg1{}; + std::array msg2{}; + std::array digest{}; + + ascon_hash256::ascon_hash256_t hasher; + EXPECT_EQ(hasher.absorb(msg1), ascon_hash256::ascon_hash256_status_t::absorbed_data); + EXPECT_EQ(hasher.finalize(), ascon_hash256::ascon_hash256_status_t::finalized_data_absorption_phase); + EXPECT_EQ(hasher.absorb(msg2), ascon_hash256::ascon_hash256_status_t::data_absorption_phase_already_finalized); + EXPECT_EQ(hasher.digest(digest), ascon_hash256::ascon_hash256_status_t::message_digest_produced); +} + +TEST(AsconHash256, AbsorbMessageAfterDigestIsProduced) +{ + std::array msg1{}; + std::array msg2{}; + std::array digest{}; + + ascon_hash256::ascon_hash256_t hasher; + EXPECT_EQ(hasher.absorb(msg1), ascon_hash256::ascon_hash256_status_t::absorbed_data); + EXPECT_EQ(hasher.finalize(), ascon_hash256::ascon_hash256_status_t::finalized_data_absorption_phase); + EXPECT_EQ(hasher.digest(digest), ascon_hash256::ascon_hash256_status_t::message_digest_produced); + EXPECT_EQ(hasher.absorb(msg2), ascon_hash256::ascon_hash256_status_t::data_absorption_phase_already_finalized); +} + +TEST(AsconHash256, FinalizeAfterDigestIsProduced) +{ + std::array msg{}; + std::array digest{}; + + ascon_hash256::ascon_hash256_t hasher; + EXPECT_EQ(hasher.absorb(msg), ascon_hash256::ascon_hash256_status_t::absorbed_data); + EXPECT_EQ(hasher.finalize(), ascon_hash256::ascon_hash256_status_t::finalized_data_absorption_phase); + EXPECT_EQ(hasher.digest(digest), ascon_hash256::ascon_hash256_status_t::message_digest_produced); + EXPECT_EQ(hasher.finalize(), ascon_hash256::ascon_hash256_status_t::data_absorption_phase_already_finalized); +} + +TEST(AsconHash256, FinalizeWithoutAbsorption) +{ + std::array digest{}; + + ascon_hash256::ascon_hash256_t hasher; + EXPECT_EQ(hasher.finalize(), ascon_hash256::ascon_hash256_status_t::finalized_data_absorption_phase); + EXPECT_EQ(hasher.digest(digest), ascon_hash256::ascon_hash256_status_t::message_digest_produced); +} + +TEST(AsconHash256, DigestWithoutFinalize) +{ + std::array msg{}; + std::array digest{}; + + ascon_hash256::ascon_hash256_t hasher; + EXPECT_EQ(hasher.absorb(msg), ascon_hash256::ascon_hash256_status_t::absorbed_data); + EXPECT_EQ(hasher.digest(digest), ascon_hash256::ascon_hash256_status_t::still_in_data_absorption_phase); +} diff --git a/tests/prop_test_ascon_xof128.cpp b/tests/prop_test_ascon_xof128.cpp index 598766e..891eafa 100644 --- a/tests/prop_test_ascon_xof128.cpp +++ b/tests/prop_test_ascon_xof128.cpp @@ -18,9 +18,9 @@ eval_ascon_xof128() std::array md{}; ascon_xof128::ascon_xof128_t hasher; - assert(hasher.absorb(data)); - assert(hasher.finalize()); - assert(hasher.squeeze(md)); + assert(hasher.absorb(data) == ascon_xof128::ascon_xof128_status_t::absorbed_data); + assert(hasher.finalize() == ascon_xof128::ascon_xof128_status_t::finalized_data_absorption_phase); + assert(hasher.squeeze(md) == ascon_xof128::ascon_xof128_status_t::squeezed_output); // Returns hex-encoded digest. return bytes_to_hex(md); @@ -60,9 +60,9 @@ TEST(AsconXof128, ForSameMessageOneshotHashingAndIncrementalHashingProducesSameO { ascon_xof128::ascon_xof128_t hasher; - EXPECT_TRUE(hasher.absorb(msg_span)); - EXPECT_TRUE(hasher.finalize()); - EXPECT_TRUE(hasher.squeeze(digest_oneshot_span)); + EXPECT_EQ(hasher.absorb(msg_span), ascon_xof128::ascon_xof128_status_t::absorbed_data); + EXPECT_EQ(hasher.finalize(), ascon_xof128::ascon_xof128_status_t::finalized_data_absorption_phase); + EXPECT_EQ(hasher.squeeze(digest_oneshot_span), ascon_xof128::ascon_xof128_status_t::squeezed_output); } // Incremental hashing @@ -74,21 +74,21 @@ TEST(AsconXof128, ForSameMessageOneshotHashingAndIncrementalHashingProducesSameO // Because we don't want to be stuck in an infinite loop if msg[off] = 0 const auto elen = std::min(std::max(msg_span[msg_offset], 1), msg_byte_len - msg_offset); - EXPECT_TRUE(hasher.absorb(msg_span.subspan(msg_offset, elen))); + EXPECT_EQ(hasher.absorb(msg_span.subspan(msg_offset, elen)), ascon_xof128::ascon_xof128_status_t::absorbed_data); msg_offset += elen; } - EXPECT_TRUE(hasher.finalize()); + EXPECT_EQ(hasher.finalize(), ascon_xof128::ascon_xof128_status_t::finalized_data_absorption_phase); // Squeeze message bytes in many iterations size_t output_offset = 0; while (output_offset < output_byte_len) { - EXPECT_TRUE(hasher.squeeze(digest_multishot_span.subspan(output_offset, 1))); + EXPECT_EQ(hasher.squeeze(digest_multishot_span.subspan(output_offset, 1)), ascon_xof128::ascon_xof128_status_t::squeezed_output); auto elen = std::min(digest_multishot_span[output_offset], output_byte_len - (output_offset + 1)); output_offset += 1; - EXPECT_TRUE(hasher.squeeze(digest_multishot_span.subspan(output_offset, elen))); + EXPECT_EQ(hasher.squeeze(digest_multishot_span.subspan(output_offset, elen)), ascon_xof128::ascon_xof128_status_t::squeezed_output); output_offset += elen; } } @@ -97,3 +97,105 @@ TEST(AsconXof128, ForSameMessageOneshotHashingAndIncrementalHashingProducesSameO } } } + +TEST(AsconXof128, ValidXofSequence) +{ + std::array msg{}; + std::array output{}; + + ascon_xof128::ascon_xof128_t xof; + EXPECT_EQ(xof.absorb(msg), ascon_xof128::ascon_xof128_status_t::absorbed_data); + EXPECT_EQ(xof.finalize(), ascon_xof128::ascon_xof128_status_t::finalized_data_absorption_phase); + EXPECT_EQ(xof.squeeze(output), ascon_xof128::ascon_xof128_status_t::squeezed_output); +} + +TEST(AsconXof128, MultipleAbsorbCalls) +{ + std::array msg{}; + std::array output{}; + + ascon_xof128::ascon_xof128_t xof; + EXPECT_EQ(xof.absorb(msg), ascon_xof128::ascon_xof128_status_t::absorbed_data); + EXPECT_EQ(xof.absorb(msg), ascon_xof128::ascon_xof128_status_t::absorbed_data); + EXPECT_EQ(xof.finalize(), ascon_xof128::ascon_xof128_status_t::finalized_data_absorption_phase); + EXPECT_EQ(xof.squeeze(output), ascon_xof128::ascon_xof128_status_t::squeezed_output); +} + +TEST(AsconXof128, MultipleFinalizeCalls) +{ + std::array msg{}; + std::array output{}; + + ascon_xof128::ascon_xof128_t xof; + EXPECT_EQ(xof.absorb(msg), ascon_xof128::ascon_xof128_status_t::absorbed_data); + EXPECT_EQ(xof.finalize(), ascon_xof128::ascon_xof128_status_t::finalized_data_absorption_phase); + EXPECT_EQ(xof.finalize(), ascon_xof128::ascon_xof128_status_t::data_absorption_phase_already_finalized); + EXPECT_EQ(xof.squeeze(output), ascon_xof128::ascon_xof128_status_t::squeezed_output); +} + +TEST(AsconXof128, MultipleSqueezeCalls) +{ + std::array msg{}; + std::array output{}; + + ascon_xof128::ascon_xof128_t xof; + EXPECT_EQ(xof.absorb(msg), ascon_xof128::ascon_xof128_status_t::absorbed_data); + EXPECT_EQ(xof.finalize(), ascon_xof128::ascon_xof128_status_t::finalized_data_absorption_phase); + EXPECT_EQ(xof.squeeze(output), ascon_xof128::ascon_xof128_status_t::squeezed_output); + EXPECT_EQ(xof.squeeze(output), ascon_xof128::ascon_xof128_status_t::squeezed_output); +} + +TEST(AsconXof128, AbsorbMessageAfterFinalize) +{ + std::array msg{}; + std::array output{}; + + ascon_xof128::ascon_xof128_t xof; + EXPECT_EQ(xof.absorb(msg), ascon_xof128::ascon_xof128_status_t::absorbed_data); + EXPECT_EQ(xof.finalize(), ascon_xof128::ascon_xof128_status_t::finalized_data_absorption_phase); + EXPECT_EQ(xof.absorb(msg), ascon_xof128::ascon_xof128_status_t::data_absorption_phase_already_finalized); + EXPECT_EQ(xof.squeeze(output), ascon_xof128::ascon_xof128_status_t::squeezed_output); +} + +TEST(AsconXof128, AbsorbMessageDuringSqueezing) +{ + std::array msg{}; + std::array output{}; + + ascon_xof128::ascon_xof128_t xof; + EXPECT_EQ(xof.absorb(msg), ascon_xof128::ascon_xof128_status_t::absorbed_data); + EXPECT_EQ(xof.finalize(), ascon_xof128::ascon_xof128_status_t::finalized_data_absorption_phase); + EXPECT_EQ(xof.squeeze(output), ascon_xof128::ascon_xof128_status_t::squeezed_output); + EXPECT_EQ(xof.absorb(msg), ascon_xof128::ascon_xof128_status_t::data_absorption_phase_already_finalized); +} + +TEST(AsconXof128, FinalizeDuringSqueezing) +{ + std::array msg{}; + std::array output{}; + + ascon_xof128::ascon_xof128_t xof; + EXPECT_EQ(xof.absorb(msg), ascon_xof128::ascon_xof128_status_t::absorbed_data); + EXPECT_EQ(xof.finalize(), ascon_xof128::ascon_xof128_status_t::finalized_data_absorption_phase); + EXPECT_EQ(xof.squeeze(output), ascon_xof128::ascon_xof128_status_t::squeezed_output); + EXPECT_EQ(xof.finalize(), ascon_xof128::ascon_xof128_status_t::data_absorption_phase_already_finalized); +} + +TEST(AsconXof128, FinalizeWithoutAbsorb) +{ + std::array output{}; + + ascon_xof128::ascon_xof128_t xof; + EXPECT_EQ(xof.finalize(), ascon_xof128::ascon_xof128_status_t::finalized_data_absorption_phase); + EXPECT_EQ(xof.squeeze(output), ascon_xof128::ascon_xof128_status_t::squeezed_output); +} + +TEST(AsconXof128, SqueezeWithoutFinalize) +{ + std::array msg{}; + std::array output{}; + + ascon_xof128::ascon_xof128_t xof; + EXPECT_EQ(xof.absorb(msg), ascon_xof128::ascon_xof128_status_t::absorbed_data); + EXPECT_EQ(xof.squeeze(output), ascon_xof128::ascon_xof128_status_t::still_in_data_absorption_phase); +}