From 6d30cf4c25772eb45e641e3c9c63786d7849d8b4 Mon Sep 17 00:00:00 2001 From: Zixiao Wang <95837786+Lanbiubiu1@users.noreply.github.com> Date: Sun, 15 Sep 2024 17:06:04 -0400 Subject: [PATCH 01/15] implement cpu version --- stream_compaction/cpu.cu | 58 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 56 insertions(+), 2 deletions(-) diff --git a/stream_compaction/cpu.cu b/stream_compaction/cpu.cu index 719fa11..f25d814 100644 --- a/stream_compaction/cpu.cu +++ b/stream_compaction/cpu.cu @@ -2,6 +2,7 @@ #include "cpu.h" #include "common.h" +#include namespace StreamCompaction { namespace CPU { @@ -20,6 +21,16 @@ namespace StreamCompaction { void scan(int n, int *odata, const int *idata) { timer().startCpuTimer(); // TODO + if (n == 0) return; + + + odata[0] = 0; + + + for (int i = 1; i < n; i++) { + odata[i] = odata[i - 1] + idata[i - 1]; + } + timer().endCpuTimer(); } @@ -31,8 +42,16 @@ namespace StreamCompaction { int compactWithoutScan(int n, int *odata, const int *idata) { timer().startCpuTimer(); // TODO + int count = 0; + + for (int i = 0; i < n; i++) { + if (idata[i] != 0) { + odata[count] = idata[i]; + count++; + } + } timer().endCpuTimer(); - return -1; + return count; } /** @@ -41,10 +60,45 @@ namespace StreamCompaction { * @returns the number of elements remaining after compaction. */ int compactWithScan(int n, int *odata, const int *idata) { + int* flag = new int[n]; + int* scannedFlag = new int[n]; + + timer().startCpuTimer(); // TODO + for (int i = 0; i < n; i++) { + flag[i] = (idata[i] != 0)? 1:0; + + } + + + + scannedFlag[0] = 0; + + + for (int i = 1; i < n; i++) { + scannedFlag[i] = scannedFlag[i - 1] + flag[i - 1]; + } + + + int count = 0; + + for (int i = 0; i < n; i++) { + if (flag[i] == 1) { + if (scannedFlag[i] < n) { + odata[scannedFlag[i]] = idata[i]; + } + else { + std::cerr << "Error: scannedFlag[" << i << "] out of bounds!" << std::endl; + } + count++; + } + } + timer().endCpuTimer(); - return -1; + delete[] flag; + delete[] scannedFlag; + return count; } } } From b27fb4c795dc97a2b0e1b5ef5b54492a2c136972 Mon Sep 17 00:00:00 2001 From: Zixiao Wang <95837786+Lanbiubiu1@users.noreply.github.com> Date: Mon, 16 Sep 2024 14:58:42 -0400 Subject: [PATCH 02/15] naive implementation --- src/main.cpp | 2 +- stream_compaction/cpu.cu | 4 +--- stream_compaction/naive.cu | 49 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 4 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 896ac2b..d4a3150 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -13,7 +13,7 @@ #include #include "testing_helpers.hpp" -const int SIZE = 1 << 8; // feel free to change the size of array +const int SIZE = 1 << 25; // feel free to change the size of array const int NPOT = SIZE - 3; // Non-Power-Of-Two int *a = new int[SIZE]; int *b = new int[SIZE]; diff --git a/stream_compaction/cpu.cu b/stream_compaction/cpu.cu index f25d814..2cd1f9b 100644 --- a/stream_compaction/cpu.cu +++ b/stream_compaction/cpu.cu @@ -88,9 +88,7 @@ namespace StreamCompaction { if (scannedFlag[i] < n) { odata[scannedFlag[i]] = idata[i]; } - else { - std::cerr << "Error: scannedFlag[" << i << "] out of bounds!" << std::endl; - } + count++; } } diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 4308876..d349714 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -12,14 +12,63 @@ namespace StreamCompaction { return timer; } // TODO: __global__ + __global__ void scan_kernel(int n, int* odata, const int* idata, int step) { + int index = (blockIdx.x * blockDim.x) + threadIdx.x; + if (index < n) { + if (index >= step) { + odata[index] = idata[index] + idata[index - step]; + } + else { + odata[index] = idata[index]; + } + } + } /** * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ void scan(int n, int *odata, const int *idata) { + int* dev_buffer_A; + int* dev_buffer_B; + + cudaMalloc((void**)&dev_buffer_A, n * sizeof(int)); + cudaMalloc((void**)&dev_buffer_B, n * sizeof(int)); + + cudaMemcpy(dev_buffer_A, idata, n * sizeof(int), cudaMemcpyHostToDevice); + + int block_size = 128; + dim3 fullBlocksPerGrid((n + block_size - 1) / block_size); + timer().startGpuTimer(); // TODO + for (int d = 1; d <= ilog2ceil(n); d++) { + int step = 1 << (d - 1); + + if ((d % 2) == 1) { + scan_kernel << > > (n, dev_buffer_B + , dev_buffer_A, step); + } + else { + scan_kernel << > > (n, dev_buffer_A + , dev_buffer_B, step); + } + + } timer().endGpuTimer(); + if (ilog2ceil(n) % 2 == 1) { + cudaMemcpy(odata, dev_buffer_B, n * sizeof(int), cudaMemcpyDeviceToHost); + } + else { + cudaMemcpy(odata, dev_buffer_A, n * sizeof(int), cudaMemcpyDeviceToHost); + } + for (int i = n - 1; i > 0; i--) { + odata[i] = odata[i - 1]; + } + odata[0] = 0; + + cudaFree(dev_buffer_A); + cudaFree(dev_buffer_B); + } } } From c0ebba46d6d83896f810d4d022d6f3377f9d08a3 Mon Sep 17 00:00:00 2001 From: Zixiao Wang <95837786+Lanbiubiu1@users.noreply.github.com> Date: Wed, 18 Sep 2024 01:40:52 -0400 Subject: [PATCH 03/15] finished Work-Efficient and Thrust's --- src/main.cpp | 2 +- stream_compaction/common.cu | 14 ++++ stream_compaction/cpu.cu | 4 +- stream_compaction/efficient.cu | 120 ++++++++++++++++++++++++++++++++- stream_compaction/thrust.cu | 11 +++ 5 files changed, 146 insertions(+), 5 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index d4a3150..c2988db 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -13,7 +13,7 @@ #include #include "testing_helpers.hpp" -const int SIZE = 1 << 25; // feel free to change the size of array +const int SIZE = 8; // feel free to change the size of array const int NPOT = SIZE - 3; // Non-Power-Of-Two int *a = new int[SIZE]; int *b = new int[SIZE]; diff --git a/stream_compaction/common.cu b/stream_compaction/common.cu index 2ed6d63..b2acda0 100644 --- a/stream_compaction/common.cu +++ b/stream_compaction/common.cu @@ -24,6 +24,12 @@ namespace StreamCompaction { */ __global__ void kernMapToBoolean(int n, int *bools, const int *idata) { // TODO + + int index = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (index < n) { + bools[index] = (idata[index] != 0) ? 1 : 0; + } } /** @@ -33,6 +39,14 @@ namespace StreamCompaction { __global__ void kernScatter(int n, int *odata, const int *idata, const int *bools, const int *indices) { // TODO + int index = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (index < n) { + if (bools[index] == 1) { + odata[indices[index]] = idata[index]; + } + } + } } diff --git a/stream_compaction/cpu.cu b/stream_compaction/cpu.cu index 2cd1f9b..5b0117c 100644 --- a/stream_compaction/cpu.cu +++ b/stream_compaction/cpu.cu @@ -27,8 +27,10 @@ namespace StreamCompaction { odata[0] = 0; - for (int i = 1; i < n; i++) { + for (int i = 1; i <=n; i++) { odata[i] = odata[i - 1] + idata[i - 1]; + + } timer().endCpuTimer(); diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 2db346e..ed9b4a2 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -11,15 +11,82 @@ namespace StreamCompaction { static PerformanceTimer timer; return timer; } + int block_size = 128; + + __global__ void Upsweep_kernel(int n, int* data, int d) { + int k = (blockIdx.x * blockDim.x) + threadIdx.x; + int step = 1 << (d + 1); + int index = k * step + (step - 1); + + if (index < n) { + int offset = 1 << d; + data[index] += data[index - offset]; + + } + + } + __global__ void Downsweep_kernel(int n, int* data, int d) + { + int k = (blockIdx.x * blockDim.x) + threadIdx.x; + int step = 1 << (d + 1); + int index = k * step + (step - 1); + + if (index < n) { + int offset = 1 << d; + int t = data[index - offset]; + data[index - offset] = data[index]; + data[index] += t; + } + } + + /** * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ void scan(int n, int *odata, const int *idata) { + int d = ilog2ceil(n); + int new_n = 1 << d; + + int* dev_data; + cudaMalloc((void**)&dev_data, new_n * sizeof(int)); + + cudaMemset(dev_data, 0, new_n * sizeof(int)); + cudaMemcpy(dev_data, idata, n * sizeof(int), cudaMemcpyHostToDevice); + + timer().startGpuTimer(); // TODO + //Upsweep + for (int h = 0; h < ilog2ceil(new_n); h++) { + int step = 1 << (h + 1); + int threads = new_n / step; + dim3 fullBlocksPerGrid((threads + block_size - 1) / block_size); + Upsweep_kernel << > > (new_n, dev_data, h); + cudaDeviceSynchronize(); + } + + cudaMemset(&dev_data[new_n - 1], 0, sizeof(int)); + + for (int d = ilog2ceil(new_n) - 1; d >= 0; d--) { + int step = 1 << (d + 1); + int threads = new_n / step; + dim3 fullBlocksPerGrid((threads + block_size - 1) / block_size); + Downsweep_kernel << > > (new_n, dev_data, d); + cudaDeviceSynchronize(); + + } + + timer().endGpuTimer(); + + cudaMemcpy(odata, dev_data, n * sizeof(int), cudaMemcpyDeviceToHost); + + cudaFree(dev_data); + } + + /** * Performs stream compaction on idata, storing the result into odata. @@ -31,10 +98,57 @@ namespace StreamCompaction { * @returns The number of elements remaining after compaction. */ int compact(int n, int *odata, const int *idata) { - timer().startGpuTimer(); + + + int* dev_idata; + int* dev_odata; + int* dev_bools; + int* dev_indices; + + cudaMalloc((void**)&dev_idata, n * sizeof(int)); + cudaMalloc((void**)&dev_bools, n * sizeof(int)); + cudaMalloc((void**)&dev_indices, n * sizeof(int)); + cudaMalloc((void**)&dev_odata, n * sizeof(int)); + + + cudaMemcpy(dev_idata, idata, n*sizeof(int), cudaMemcpyHostToDevice); + dim3 fullBlocksPerGrid((n + block_size - 1) / block_size); + + + + + //timer().startGpuTimer(); // TODO - timer().endGpuTimer(); - return -1; + StreamCompaction::Common::kernMapToBoolean << > > (n, dev_bools, dev_idata); + cudaDeviceSynchronize(); + + scan(n, dev_indices, dev_bools); + cudaDeviceSynchronize(); + + StreamCompaction::Common::kernScatter << > > (n, dev_odata, dev_idata, dev_bools, dev_indices); + cudaDeviceSynchronize(); + + + + + //timer().endGpuTimer(); + + + + int last_bool; + int last_index; + cudaMemcpy(&last_bool, dev_bools + n - 1, sizeof(int), cudaMemcpyDeviceToHost); + cudaMemcpy(&last_index, dev_indices + n - 1, sizeof(int), cudaMemcpyDeviceToHost); + + + + cudaMemcpy(odata, dev_odata, (last_index + last_bool)* sizeof(int), cudaMemcpyDeviceToHost); + + cudaFree(dev_idata); + cudaFree(dev_bools); + cudaFree(dev_indices); + cudaFree(dev_odata); + return last_index + last_bool; } } } diff --git a/stream_compaction/thrust.cu b/stream_compaction/thrust.cu index 1def45e..df90fda 100644 --- a/stream_compaction/thrust.cu +++ b/stream_compaction/thrust.cu @@ -18,11 +18,22 @@ namespace StreamCompaction { * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ void scan(int n, int *odata, const int *idata) { + thrust::host_vectorh_vector_in(idata, idata + n); + thrust::host_vectorh_vector_out(odata, odata + n); + + thrust::device_vector d_vector_in = h_vector_in; + thrust::device_vector d_vector_out = h_vector_out; + timer().startGpuTimer(); // TODO use `thrust::exclusive_scan` // example: for device_vectors dv_in and dv_out: // thrust::exclusive_scan(dv_in.begin(), dv_in.end(), dv_out.begin()); + + thrust::exclusive_scan(d_vector_in.begin(), d_vector_in.end(), d_vector_out.begin()); + + timer().endGpuTimer(); + thrust::copy(d_vector_out.begin(), d_vector_out.end(), odata); } } } From e708efe94e3e90051034a29d0270ffeace6adfc9 Mon Sep 17 00:00:00 2001 From: Zixiao Wang <95837786+Lanbiubiu1@users.noreply.github.com> Date: Wed, 18 Sep 2024 15:16:29 -0400 Subject: [PATCH 04/15] partial radix sort --- stream_compaction/radixsort.cu | 68 ++++++++++++++++++++++++++++++++++ stream_compaction/radixsort.h | 12 ++++++ 2 files changed, 80 insertions(+) create mode 100644 stream_compaction/radixsort.cu create mode 100644 stream_compaction/radixsort.h diff --git a/stream_compaction/radixsort.cu b/stream_compaction/radixsort.cu new file mode 100644 index 0000000..b38bcd3 --- /dev/null +++ b/stream_compaction/radixsort.cu @@ -0,0 +1,68 @@ +#include +#include +#include "common.h" +#include "radixsort.h" +#include "efficient.h" + +namespace StreamCompaction { + namespace RadixSort { + using StreamCompaction::Common::PerformanceTimer; + PerformanceTimer& timer() + { + static PerformanceTimer timer; + return timer; + } + + const int blockSize = 128; + + __global__ void kernComputeBits(int n, int bit, const int* idata, int* odata) { + int index = threadIdx.x + blockIdx.x * blockDim.x; + if (index >= n) return; + + int mask = 1 << bit; + odata[index] = (idata[index] & mask) ? 1 : 0; + } + + + + __global__ void kernComplementBits(int n, int total, int* idata, int* odata) { + int index = threadIdx.x + blockIdx.x * blockDim.x; + if (index >= n) return; + + odata[index] = index - idata[index] + total; + } + + __global__ void kernScatter(int n, int* b_array, int* t_array, int* f_array, int* odata) { + int index = threadIdx.x + blockIdx.x * blockDim.x; + if (index >= n) return; + + odata[index] = (b_array[index]) ? t_array[index] : f_array[index]; + } + + + void sort(int n, int* odata, const int* idata) { + + int* dev_idata; + int* dev_odata; + int* dev_b; + int* dev_e; + int* dev_f; + int* dev_t; + + cudaMalloc((void**)&dev_idata, n * sizeof(int)); + cudaMalloc((void**)&dev_odata, n * sizeof(int)); + cudaMalloc((void**)&dev_b, n * sizeof(int)); + cudaMalloc((void**)&dev_e, n * sizeof(int)); + cudaMalloc((void**)&dev_f, n * sizeof(int)); + cudaMalloc((void**)&dev_t, n * sizeof(int)); + + cudaMemcpy(dev_idata, idata, n * sizeof(int), cudaMemcpyHostToDevice); + + + } + + + + + } +} \ No newline at end of file diff --git a/stream_compaction/radixsort.h b/stream_compaction/radixsort.h new file mode 100644 index 0000000..fe38607 --- /dev/null +++ b/stream_compaction/radixsort.h @@ -0,0 +1,12 @@ +#pragma once + +#include "common.h" + +namespace StreamCompaction { + namespace RadixSort { + StreamCompaction::Common::PerformanceTimer& timer(); + + + void sort(int n, int* odata, const int* idata); + } +} \ No newline at end of file From bfd69c8cd3ab2b200ba7defe82a918154b383edc Mon Sep 17 00:00:00 2001 From: Zixiao Wang <95837786+Lanbiubiu1@users.noreply.github.com> Date: Wed, 18 Sep 2024 16:49:39 -0400 Subject: [PATCH 05/15] non_tested radix sort --- src/main.cpp | 2 +- stream_compaction/efficient.cu | 4 ++-- stream_compaction/radixsort.cu | 42 ++++++++++++++++++++++++++++++++-- 3 files changed, 43 insertions(+), 5 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index c2988db..8c38c04 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -13,7 +13,7 @@ #include #include "testing_helpers.hpp" -const int SIZE = 8; // feel free to change the size of array +const int SIZE = 1<<20; // feel free to change the size of array const int NPOT = SIZE - 3; // Non-Power-Of-Two int *a = new int[SIZE]; int *b = new int[SIZE]; diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index ed9b4a2..1824bca 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -63,7 +63,7 @@ namespace StreamCompaction { int threads = new_n / step; dim3 fullBlocksPerGrid((threads + block_size - 1) / block_size); Upsweep_kernel << > > (new_n, dev_data, h); - cudaDeviceSynchronize(); + } cudaMemset(&dev_data[new_n - 1], 0, sizeof(int)); @@ -73,7 +73,7 @@ namespace StreamCompaction { int threads = new_n / step; dim3 fullBlocksPerGrid((threads + block_size - 1) / block_size); Downsweep_kernel << > > (new_n, dev_data, d); - cudaDeviceSynchronize(); + } diff --git a/stream_compaction/radixsort.cu b/stream_compaction/radixsort.cu index b38bcd3..ff2675e 100644 --- a/stream_compaction/radixsort.cu +++ b/stream_compaction/radixsort.cu @@ -15,12 +15,13 @@ namespace StreamCompaction { const int blockSize = 128; - __global__ void kernComputeBits(int n, int bit, const int* idata, int* odata) { + __global__ void kernComputeBits(int n, int bit, const int* idata, int* odata1, int* odata2) { int index = threadIdx.x + blockIdx.x * blockDim.x; if (index >= n) return; int mask = 1 << bit; - odata[index] = (idata[index] & mask) ? 1 : 0; + odata1[index] = (idata[index] & mask) ? 1 : 0; + odata2[index] = ~odata1[index]; } @@ -48,6 +49,7 @@ namespace StreamCompaction { int* dev_e; int* dev_f; int* dev_t; + int* dev_d; cudaMalloc((void**)&dev_idata, n * sizeof(int)); cudaMalloc((void**)&dev_odata, n * sizeof(int)); @@ -55,9 +57,45 @@ namespace StreamCompaction { cudaMalloc((void**)&dev_e, n * sizeof(int)); cudaMalloc((void**)&dev_f, n * sizeof(int)); cudaMalloc((void**)&dev_t, n * sizeof(int)); + cudaMalloc((void**)&dev_d, n * sizeof(int)); cudaMemcpy(dev_idata, idata, n * sizeof(int), cudaMemcpyHostToDevice); + + for (int i = 0; i < sizeof(int); i++) { + dim3 fullBlocksPerGrid((n +blockSize - 1) / blockSize); + + kernComputeBits << > > (n, i, dev_idata, dev_b, dev_e); + + StreamCompaction::Efficient::scan(n, dev_e, dev_f); + + int total1 = 0; + cudaMemcpy(&total1, &dev_e[n - 1], sizeof(int), cudaMemcpyDeviceToHost); + int total2 = 0; + cudaMemcpy(&total2, &dev_f[n - 1], sizeof(int), cudaMemcpyDeviceToHost); + + kernComplementBits << > > (n, total1 + total2, dev_f, dev_t); + + + kernScatter << > > (int n, dev_b, dev_t, dev_f, dev_d); + + StreamCompaction::Common::kernScatter << > > (n, dev_odata, dev_idata, dev_b, dev_d); + + + int* temp = dev_idata; + dev_idata = dev_odata; + dev_odata = temp; + } + cudaMemcpy(odata, dev_idata, n * sizeof(int), cudaMemcpyDeviceToHost); + + cudaFree(dev_idata); + cudaFree(dev_odata); + cudaFree(dev_b); + cudaFree(dev_e); + cudaFree(dev_f); + cudaFree(dev_t); + cudaFree(dev_d); + } From 9d72be6fbe5c6d4b93a4fe05744c1cc58e09a140 Mon Sep 17 00:00:00 2001 From: Zixiao Wang <95837786+Lanbiubiu1@users.noreply.github.com> Date: Wed, 18 Sep 2024 19:30:37 -0400 Subject: [PATCH 06/15] upload picture --- img/ScanSpeed.png | Bin 0 -> 45677 bytes src/main.cpp | 2 +- stream_compaction/radixsort.cu | 8 ++++---- 3 files changed, 5 insertions(+), 5 deletions(-) create mode 100644 img/ScanSpeed.png diff --git a/img/ScanSpeed.png b/img/ScanSpeed.png new file mode 100644 index 0000000000000000000000000000000000000000..628aa4bb6583a081542adffadad07f6366bec191 GIT binary patch literal 45677 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

6!bL;l_d|r2?q^w9_*T(1piyBx^4h}??43wPl z^ewIgA&f!5=NbUBEdqs*nl9ks^#RQWsfuctsUs^SC|`3=M0!pC@+D}}yM8Ct;T&n> zRsAc@EIcqs5EA3b9^KIV^{aWg+~cR9hiC}Viy8zBD;+@g834K4BK`WoPiDyFWnN?a^>fO=& z@#FH+g(#?g0#w9Hn2k*_G8&LM%gf8ovWr(dek2Rh`E~sK2h2g6i&6t9!q6-1$I&aQ ztJ4KZ!o0aIYnXv=ukT40FRjM5ls--yEFEue+`rj2eN%r{xR@2{Gn*QVSdA6`6o<&Q z-$B6}7<=*Ixn>}0XzPZJVgBi#R8VBQi&%17_`BhsEN!$eF1ntR8<>{D>kP%geb#A^ z!FPYHjTWeZxi%Jd0=wyjFEmN(2?3}B8ivYmhO`#3L`6pVu%`jl0n%=z90&#o;jYXq zAwBc|uaYGMLPF8Heh>|D)m*v*O)aN#VJ(X&7VkJxFY# zhgoiS%huYNMIfMKHP3nMZ)l^Pony6i<#E`4Eolj=2-Z42zucP-jW4LQ0h}388}ho7 z3JP(CK6_HI+Z`iHHn+Awh{nPn=}!LdDp$-e@A%^mKocU2amen2WTOiqBjxy=l4+9bGAXupsHis#~N^n%w0G6n_29xu&o^JW}Dw4$=3XddeKs$ z-PH+*HKg7JS>BG@c+VE1AP;bnec;X%gTmjEKQ5IrNO~97&Qd^E#n0j-pNM%nz{#^6 zT-4rKHkRc5ICwwg`9(fKvi47jbVb+bDgP|@mb$(xsFyqdGo3I4vKaPJq23NQx_Vhk)M$K}_@n}2 zxDc{3@c~!b?Tj~UwLBG%x6-veyp-Rl>-?AlCz}1U!`ALHVcrsJ-Z=i7&-ttZ8%VMd z{}DQP+s&H#t?d!0Z5!Qt00fIqzK|X3Asw>Dk#aOJ=(ZU%Ju5rasQ60bANQBDC6W!T zljg1(NjkljjqAzJFGwV}Vp3kQEX3@ZRJ1~c+Ww2auwZLl*dBEHRDr_KLp;7;af*Q4 z^AueB`PT93!a=rqWA@hLsw%Dc{)Z9jbc3UMF_%u-gMJsxuLOZQ}iY1j9Zt{OjbDrh|X z?aBrvWOL{!eqY_qs%)mG8yYP3ttZ`0nVGe-FJ?KFjuNjuILSWk>lcU1(7B#1oDtgD z##efGw6eCt_;DV8?OSaM17#}Zfxxc@A z%lS&=*iv~p)X4thpCdpDr7Q$U@jO2dN)ymGY>7-Vub=qavwWLeJBwgVUXhB2S5xEP z59rwny6bEXQb(ga>gpHs{L7%-bW^9k zoYnZ)p~Nz92!Po{A@nyjbZ*HC)eaB3ZATXG>Ev_wjOqsO7hr>GRi_`>TWJ#I_XVI5TCjd_cMTipDl>>PI06@_6gQ{hD``Z9}^+81nr zxor(IZxA!o+^JWo6|9sEcnfK4YwbAzdry^j*+<6iR^mIvq27P4njS6jPsqz>J4Koh zl<^B{07fnvRa^THc%cV}f;L5uu7xnVT+MDJT{~}1qD>frnt>~)2Z^hr4M{E$xVh9Epff_Grzq8^4BARZ7CyRl}%JVH9wZX8*X7BTvSa1bFcs%6m~LslffE z!Qxl2&uJ<5b#w&(s5()Nf8i@knI3idw`*rkyMzB7Kb{?=CihoX=V5`_*Q&~;F(%hE z#@fBaB)rJelNx=ec%Wy-18L92pvFeCUjyC*?0n#`;Qjqy25qH}wX6kH7x%Mg7OkvV z^-j?{>HY5x%-=)FST+*g?STGR5`09Qt3eeW$y*0~aj{Ziu|kS*dhxNH3BT=N4H!%@ zS$%WcXzu`28?6=O+^4DT-c?Pj=BVD)N8n2mm?|k4@3YSSl6d{^x#GceBh|`Z--F}{ zS4gu@FzJEbg@V0xD!u;Q>})pt8rC~mRuPUKr;C@fJ%T*fZT{tHp1Wgd4N#=0B$}dH zMWKzxB0HxDp~ooR>&Eu%dgP}cgcwPB`{Gv10kjqp5r>-{*w-q?Sah9*((r*zy}PWw z1$x__lb5{s<=b1^i}(O&xa}vx)(xq>%JSGX4FeNMCe*}roE~QV z9)I&$V*PY0GF3?>g;_#JATmn_)1Yp57#v5ySYT%F#!^=QN>!Ctc>g9NbJp9uGG*`6 zWrX}v*9j8Su4o?jaW;DCEjk7ukNT~{-tuwPeKFmUn+l7yviU?d_UzH8+z`K;z~gi{ zuF;s|euzRpHd)G-{HYwJb|*5rTwiBgrY_#r=3p?+lP%)!wWK6G`crKFWXS)>hW(ck zlakLxX8kkJRadvkdi3CkY~-23eNJH_ejP~PYnR-WU~w4HnD9H%xlp{p&b<<=FP7>f62fWh+c=#~2 z!mY;ad#Yr~ezm;Q1loRlb~Zrr->2xuec?90>@lJ-3?8gM)7&nKM8h6g^q*|vGvJM6HwWJJ$-Xga(Jt-Vsl%*L+53T z&U@DN6m{m)&$l6nB(pvUSned51+bh7?}PtkqDk8S6*#=#u#IJ_SzV3H+QFA}(O;?q zOzIowx3;@U)QN{*uwL{}Ju@ zY2U{W#Y}foMs3!ita`1ns`g`mw}OJYqItI5&9i7mt&!nkgI?YVS=Y1iNqE0PPi-M; z;peaOLa|8yiR5ab{|X(zRPoJ|!((@&x{mB&lgo?F%D;A+os|eY^#bWD!QJx*hJ><_ zB4c`6{ZLcmtY|d(zbtg%1<4cqpZdcD#BV&3AMdN=&9JCg#6Cz&%o|3Ju(2)C>6eZj zbF2xeme8vjaX)m5h$)7Hs^udMP4k9K z+7KgcbSmzcPBHSBN6N575sY+w-HGR@g9rPV{D0VJ&QtuAvLbXxPRKjQS4Mm+^hgFu zemU6ZF3!wLSPkH-7TcMK1wsn*_l8G5C;w%IpC)dIdBd3fYqulkupdH@*vsjID*V^=O{V9@@* z479*0%P2i@&vV6R1zn{mM}BoWXQZB&Pf&%|=t}RbQ}5b6LmhHaokbpfXJc#5?~W*B z0RyeC)fV=FNCoqRq&)ZcPb_qDeh7DAZxCbl*qWXWIk$>6uTnXusn|b3vi#?I1ps}n z0_Zbe!~W+k{DDG(sK}U`HlY>v(Jqs3t6QF7>n_jvOKl+=DVrKmZg*GO0o64>D3jsBRC;u5xv#JyP`}uMZ z<3zMFfh<_AjcRs`=t_GFwFX7~J$Kc!(J%g+=?0T3dm-c&|78~ZQyD;YqW{KQY}=V% zdA~mqBC3<**boqz(p721C{L_nmV$Qg+uQ;nP3{5-1I-rmNx zt1$3+VIqs(skg;US2(@4-{RHG#P?CXT$dAn>c?XAE7T0YfqG>E{3!UpNE1LdBdSb|)v!DS%^`CHYM+F868A9B>wZD##CJPF4u z>Rnd2+HQV=8&t$oBE|RIEa;_w{6@-#V6k_SYo-S_wL=Se&PqHtbSRSrEyiErg^Az6q#u2gU)g^o ztN%cjef5o$#K5UCjXD;<7Au`)%46*md%Lotv6l4pS=%eg*C^_YWdY}WJ-L*E^P<%k zl-1^Kh!*~a_fP4!eH?3M5Lu~OD65HG z_3{nuGBnN*c!4rJrDLXkE1+r)=R4FN-us+w&h}ZZ$gm0@jdA^S#HJ%{t)?W>^(ikx z>onfHfBEeNF@hpvZ9mVJe$BAhN{yS7y`tR+a}#)}94{{T_9y?@La^>>38UgUV%AZQZs+-J~V`qPzaimj+#Lq1mHY(Ok{IZLBCYX+yPszq^eBcXqi z5A1n+{uTfS5#3l2sVb`;8_oYT0y{{Y%mtc%nkyBGJ5}2~30O;GdaOtz4>+p1YEeC^ zWc@&St>ddIo=yy204?2qKTNxs)vk*_=_6xUimsqi^z3ZvJ<&tnbOTq7?Ag_=G%_Mx zA3j9DHa~8`iu@!Hy62E6V}-3vq|ca_>W|t%tdWXBEyDHBEN9yVXxP>m zQx3-<+m7?>jFb2Y=Ygd}j&vSI;URKS2+0Id%Lc|ENKf+!BSCuptpa1qgV)^1yDD&F zKm=|-@NHY~FM@#U;*b2Qk59Z6WS?VoQAa}Auxq8NQdBZ46)$UY2YhIyGE_DYcq~*i zVAP`~@Sc#?G$1XY|7{1FAsk!02?+`9oeeze($I!MF$3-iNatjc^*kHppva98_vN%~ z6~6*t3bu*VLNehYn{tBQe+P#t|LG%V&uJ%{2PT0eE>ID5PqalJ8*B9}fm$+v zIAazi3z_~)FryhoEl%HZx^(quyad60pk_}$LfLHkbK|56ubPzQ>Nh7Y{@{{Gp%{vc zlW8F|_~p$+)sdI>tIqQo>kr82&b?Go8YPUpys0Pn0#**#Ic5|p3+iUs)YC^=AlQT; z?Lf8i#V7*x1HlZOSl~MgZ^xzNl+R!*^PEa`ycPk*Z>89J7Gj8o$G*hGs5zEb&kx_J z<9kz8S6x_iVrlPt#?TwZ;PzlZcLg>7kYi!L*+6C0b@&^SVm%!aE zk_iB>0s#F9d2Z!Gb(%v>?5LhTix{fie$H%RH;1G0+Blu--;x>Cg$_D(=j;B+6$ZJ=ZKE35MiBFy zV|Lhay`3Cwmm%R|r$DJc#;Wixwae@HX7LBkEH)0=kz)_5`&*WIV@Z*LhE*R| z>kJ;TG4G$>6Sa*g*ZqOY$Ps2C+dY_uJcmkB0)X6>t) zgNDxRRpxi^UG}x0Z=)5GL>IWr$4l-gczT5jAV?J9cAxCK;e^7?1VPw$7uWj`&!ujSSkuEHV`7*kF55ANxVxF5zG49utH0;YxFtRO~9x$T~ zrc_I$RFz-W)+(EvKYt#Xi2@iUz@oqa8Mn3ZBGA@H(Di^})c|$uAGat^)1jD;Z51y< zCfwAKEphz(AP&%09|w|kfaLx$ z5@bAckN^t!@P~z}5&HsFDWQ|lK6!BOrESr;t3pQ=gVm;g-~N*RuVQv`WVb^QpfdNy zc*EJEyxMwc%b|C}M|JQj5~xA<<|ND32I>F+bkqv%K*2c^7_fEi7ax^StRbM4MD6lKrnID6MtOnWjjjtvsnb8Kth@Cbyg zF1!5kft$G*X@hGvC(zlE0a*a9>k!mvIZ599763yON@r0CPEm7NcChxv51gtzh|dj* ztP3m@Co1CFITJ$uBgaNV)8x~=7X#xD!85)%2^yIS znsa)QtAPdSEsK5u7G&Q&SEgeadBfi-&m=74@2woCRoG{l%?uA$;-ZH-V@DelUj;^T zUz7yC1q>6ZhgQ3G;k3w_D~u3jnsXrwKDjd4qOIo}gxn7i)^JL)j!`4DKkM!WFTqK$ z9^$-fU(C*s^|bHccxP2qEPtbm`p;Z)tr^235J)2?X7^9P#$vz0^UPVFtdPyx*QR6E;RyT68A(o$xB!Qe+7Q;(H)wj+eE*mC-k>jemz2m}s>y@=rrSI zjkg>0NX@cyFVVN4TJXL9+D-m>acCYVaz0ul*Fb?MYkb@QR`JoKY!bA=9P6LFPlwT^ z@w_(Voe#L-T#)o=JO=1AX7?THc3_lG&l1^SkhsvoFN!m-=8BG*#=BCN@O9E`d!|An z^R(3xgCnh?ZfsgJzIr->xqQH&yc=6BjumTrHe^+qm-T`Rj1N9OoB?pndBL8fCZi9~ z7B%8ax@9xSI={Uie!!KW@COvpLjhjh^x*BDjO*@K{Ih33Jr5(QjdUT5w>UnX1hC@Y za$W9I=8B9y3t9BMF6Jd>*{DQky0FZQ+`mQYevb_=%U$%XZgZR?=QBMu&2L$){LM=+ z1Nrl>UA}Y9KQ@-UzrX*3Nm+Vrt)N*Wj0A{RU;r_v%+k_J6pHS?cnS<8?+(V+rXd6o z@czTOxU>`z7Z)5ENeuJ)J`Kb?O#5?yy!5-Ix7>2B`3esQAe+d$5XYYW&xIdkwZu=q~?^!Fp_X!=W+XSkWvbV-iLb<>uwxv9n|AN+UdS zCcpsE%8PG*yqumknVFpp-6wjkQ$!9;HW??UTR^?nFEo5lC8YoNNZ&X>3Az2{8BOf` zdufs$uA)2IiAI(60gI#$=uH)^#5BKlv_$iWJxToRSA_H3mCW&7``bc!9L)xNg<8FV zQU=<%j=(6!dl_%uoRtZ^e#gP#w;d}+IMgZM{y-i8Bz2uaxx_f{z!Z4ejBq8MN3S#L zsOky$(u;)Md49DqpVt=UAS{^uW&FUcJ+~yB2xp<_49gMKyx8=8rB-asMqD#ib^hY> zpX{rVQMN}BLzJPDnAG&>kAV6-M0>zY*b5P#FQ0DRnW5ev!TPw@N|%g8m8x8Di|+N? zlr;$8+Q@Ax>j+$>NI(m|Dl4WFZ_)YS`T1>fJYk_Hwd{*D3w@b_)KseD)+I1r*PUm! zGcsu557KmAoiFK6uS}vB_Vu|a?<=N~Vwvp)w~Oxz^yuVkDl9K(c6YSI&6?5O`O-Ab zB+;dXNv4IhquK53OjJ61=0=|KKJ1bUk+zihM2#aCk~pRub0VG5`MZ{4h3mzl-&Z=DRcVjCt3zl9fquTwPsZR&Z`n z5$JQuw0gpXmZLAP6;p&_e#+(gofm?$qmo=;vm)KnbXNU(q0B=W!=C*ul&EIc*OtUy zkpsTO59u9Ss4>{y->AF79)|}*d4j<-MbOC@Rq99%c64{| zGX8>{L^a1`#d-SHo#yqb@neE1l$}a3Wv&T78DyO2sp*V<1usZjfSZKE&5)k=y6^cv z^917V4rTFfXG)i={TS|y)tE$oeSmkxV{GB#Dm`6?GrWBOhp^n0lRVw-q>TI5*_SJM zkgbTTRCVVn&u|heCZ5FuV?`^fc7-3DiykbpEctslj+4jR9Ni5#+8Z~;XPpFzVXhb^ zUCB+k-|oahDeOiwu1}iMC9+5fs1A`sbgQ$7>Cf`rYsmW^8h-FSr727*k((F4Kz_5- zWL4b^wfQMoodNrI%X_R~pI*ZUb%fe~NNI0vo1Q6cU;T+UTJf~;ep*9o=_+eeV67O&Yvx+$yVQ; zxEQgsod;qc$_Rr{PsL45GjB6H*xBLV=U`*|I^o)wp6&-%zVYwM8Lu0MxWDVViY|_L zJsHfo;;OB}MFtP89C`cslSUO6mE;dcy8db<+i`53lNs@fSorKd;kE5udn=3?|cu zb!Er0+${M^>uu|rHMp;K7%;UtA9Eo-s#XveeRf<|PNnk)zIP3#W$|y;4$sMQem|>g z{V!Rpx3;&ZAcKO9EdYZ^!|6)8lLbj0yuHd0b-t~w!H(YG^k{})*-K4ss?EX9qw=yz zG;*y8SnQ0C4B&;GC&+R6ex5X028x2_K+tH{b8=KB)!dHQv4!u3MNz(SUQs~-9{CHL z%F0Rs7?;r+F|_R|`k*@%AFLq=cF@uIhovT+JAF%echC8geANf5@}>9*zU5jO?m(LY zuhGD$9uhiqE~_JVp|?3xx+Isr8E$d^_Id3+_V7J=*Pp6rUEOQe*4E0px-a(k_rqO* zjbzM~psc3{3PTUX3(V{IzWwG$Y&%bvj?e*O5n)?8)m1WDJ~jy;*CO>g>vfZ@)35VR z8q?rbG6u`hI5#eaBtfYsW4J-Sz1~mRbN)d=XMI)22M5W^4Lm)Cz=;EKBqA-XJ7S1Y z;B@Q!Ot0^L{=VP+tXDy?4WUj+3_WXtC{DrLFXM$|=2O?nb5@7|vmOk(%@!-8BCh6p z!YtA}ia~eB`Z0mW`xUpDfuu!np97}8-)_})bK{dSV7z^LaiVF*+V%A^&1kKmpP89# zj&)DgxKo7fh+zv&ZA9kD@-AvTi?qC0`51fI09T;FP$HY$D{}Lbi0jXg8^O&)oEvpu z1n!rlr+-L`zL&^jm7JNS-GrS25u4>jW{F8?zRBih{P{8*!W}+4XX4WsM`T7p zPMtJ)(usMl*+(aZdX{jwny@N{4UY)-%E zE3o2Y5X$HXJxS9SVP?iGnDu}+-HtYo(+uITs6OL$gsI$chEnN1X5n{&`DqKI=B_R! zi2vX>oG1#3XX!$a41u3}5fUP>A@u6X>7G{+8nSC%mBi1@E&fvWrZ|23Y|7cVgomXN z1;%y8U&P1t&2V?w;59m~#+ce+o%6Y>eZ-LdYDEU~0!`2G@Z!DpYuBzx4$3Pj1+|$4 z{ILBD-cxWxNS~BS6tP@%;PFd`dY>Y}hfh94urDmjQO4_q3WbSr!RBvluWX5oWeB*< zcuYnq9(DvyV6<0Zlq*$+vj?37$J>lB4zuZu5Y`9KHpY@Run4kUK}?3$flr96r2D^-(8{{PUpMe`m}^~fvm1`tiAS5=XV ziZ+FbVfz6Qct1@gH72GdOC(@%(XZ)V_QP7gpI`bMCowo{q9h(LC@XXNtpA6hxb*Z= zY5$}2hB_*0D*L-R14QZ;i&=LIQ{#dMvTIw@k`bH9atSNf^HQ!y{`DzhIl(0y|8^&+;dXT+hAphTCv+?4}3O=~16*t_0Zck(4 z+{DvSv~``Lry#M%EnQ0zAJZMjI$qWO7w z0}JDllb6@(V6uygB~Ozt-Lw7=Co3}eO2J6rIF<4r7$oYOQYmSIaUpuVQ7U8!ZUSEMjG=|!jdlM87oTs+oLQI4vw(u9A$Nrlj!%BouM7K&(_@_hKiKkf3QZ9~N)@}1$!m z6^L}ysT;M7e2DJ&!m_O5RI3LTVs~dJs1RW#-D`&dj0w?UnAO)xNBrN3bvI7Dvnq`3 zPEk7`$$xPYNVOE2GLE{>ybo=jm6iIPlI`!t_dQ)c+DKuSm66`kNvcg9$pc0MF1Cs| z+^$mFR_Fx<73fB2mV` z13J1h-V4&j&v-UyQ&5JMDSdf6IbjYb`70B{zyKzF3s-Wexv>MC%~;Lc56K!I4f5E| zRN{?smke#5SvtcVeNs|$!Z_#TP;b9Z%hb>XfT&%!w*2?*+}4`voc>U^v$X=vw2ZGu39PAe?($oQQ?*2)?E_iB?F^fUca|}ZYd!1Qk{>;$oO4?p05ws7PsPw{quEH3_@cS-s+pDQBz0sEm2cD^qSuQ!eeLKTr&9 znF;~Hx`RuYm8<&+^N+5b#1|Q*wPYcTy@ZZxefyQaV8_>=!AZU8fmYjkWXGb-J5 z*Cj+uV(VTAu?V3CANgjcjLhXV-(&vYIk!DXW~#g9}{BkAXSj?zbOa0p+e}aNDqE)SW#gQ0U zS6pS~`{~%2F|DLiEK+l2tTU(O7I^e)YFeM^|*rh%SXkiiOCu;oITc zXS~Pj)Mw(}oT<@I5f372D;`vcWKKjfypZr`BCA33Sfn&PrVr2359muWOt^j5r|V#P zit$u8U^-Sbs)PIT8H1bbSGjmNt+zNWw`6H0 z;$JWt_xv#G-)-Xj$#RAK7$fNJN^TS|-&Y~t?dv0(nLRuBZNX(cVo3fL3^;*&F#`9V zQ(pRqhhn7O5zWtGuAj-?Mo0R2`iJZQ`LK$`COWtBLE?BQ#rTnRXe`b2G$2fp0`#W#!v*{*x`lieu)y=oYZ{xQK zOI0_ae}C}EEiWs6_}Z01(MSSD{CvoeqC0+h?>0WGo`BnJ?u;7c{VSYn2gbfjG*89V z)S~_?f5C@Py``lEbSM2--(Dv87RY%gOk$Zr{w^JnJ+X+G*7E_S0MnI0h5=(oF z+HaxQxPUn%psr5nn7bWB10g+aZwI?34doMOXXhJb1!q*g|8WqwP-esW?YlB*_uKpW z?A@dM_y+Id%U>@hiwM@mQ+r>Mm7};H(1{Y@xli81h#{2Xr^%T9&6B}Ug4JsDQsgxW zH%Wgyi5-THGsM6Au!rBX-mn=9=kZ6oDQ6UIvo5({Eimh3G1}Z>9uUrUm!ZGcOE)l| zki*DugI6V3J(EfYzl4+Mn*j6Ui=2-=S_hPJpaq=l2SrM#0zpb3fuz*IKWu}*9D{kL zBV$t;H4RWAZFzbn&5TQRB#%;(m4!n~H~>aql&yReQKw8%@|UlfdP+i2O+qmBRNv{t ztnK4g6Rxv`K z*D(;K&3JZgpmpfHy_o@Va`G-@Tu`||GA_5}E6FreF6uxmy2$ld%fcjp5f1NK6IwBF|#Q1+sjpM{N3dhz6sNhp3-~EE1a8C zc%oijzh~szNnA4j_VCOy>}R?^JG&9){WzC6XGiSC*qr9aVw8A*pWjRxW2;+XasytU z{1DySWjEioj^bi=sPN<{r34U9zXoAf0-ysTFADsYF{dMjd`8)4Y|&7WgTlEix