diff --git a/Figures.ipynb b/Figures.ipynb index ec2d441..dc48b2b 100644 --- a/Figures.ipynb +++ b/Figures.ipynb @@ -40,11 +40,17 @@ "metadata": {}, "outputs": [], "source": [ - "def read_profiling_files(profile_dir_path=\".\"):\n", + "def read_profiling_files(profile_dir_path=\".\", drop_multinode=False, drop_singlenode=False):\n", " profiling_data = pd.DataFrame()\n", "\n", " json_filenames = [file for file in os.listdir(profile_dir_path) if file.endswith(\"_profiling.json\")]\n", "\n", + " if(drop_singlenode):\n", + " json_filenames = [file for file in json_filenames if \"1_nodes\" not in file]\n", + "\n", + " if(drop_multinode):\n", + " json_filenames = [file for file in json_filenames if \"1_nodes\" in file]\n", + "\n", " for json_filename in json_filenames:\n", " with open(os.path.join(profile_dir_path, json_filename)) as json_file:\n", " profiling_data = profiling_data.append(json.load(json_file), ignore_index=True)\n", @@ -65,151 +71,106 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - " t_init t_total outfile \\\n", - "0 14.511714 181.754037 /work/martinls/232557/ShallowWaterGPU/mpi_out_... \n", - "1 15.153404 188.838794 /work/martinls/232558/ShallowWaterGPU/mpi_out_... \n", - "2 15.607471 190.535054 /work/martinls/232589/ShallowWaterGPU/mpi_out_... \n", - "3 15.332916 188.146165 /work/martinls/232590/ShallowWaterGPU/mpi_out_... \n", - "4 15.941363 193.263406 /work/martinls/232591/ShallowWaterGPU/mpi_out_... \n", - "5 16.805506 194.776481 /work/martinls/232592/ShallowWaterGPU/mpi_out_... \n", - "6 18.009921 198.615131 /work/martinls/232593/ShallowWaterGPU/mpi_out_... \n", - "7 17.990572 199.018155 /work/martinls/232594/ShallowWaterGPU/mpi_out_... \n", - "8 19.366701 202.898836 /work/martinls/232595/ShallowWaterGPU/mpi_out_... \n", - "9 19.890607 205.122811 /work/martinls/232596/ShallowWaterGPU/mpi_out_... \n", - "10 20.974516 207.287065 /work/martinls/232597/ShallowWaterGPU/mpi_out_... \n", - "11 21.358601 209.105944 /work/martinls/232598/ShallowWaterGPU/mpi_out_... \n", - "12 22.813077 211.172879 /work/martinls/232599/ShallowWaterGPU/mpi_out_... \n", - "13 23.636758 212.722331 /work/martinls/232600/ShallowWaterGPU/mpi_out_... \n", - "14 23.983026 214.176335 /work/martinls/232601/ShallowWaterGPU/mpi_out_... \n", - "15 24.996966 216.951382 /work/martinls/232602/ShallowWaterGPU/mpi_out_... \n", + " t_init t_total outfile \\\n", + "0 5.327343 72.445652 /cluster/work/jobs/5977262/ShallowWaterGPU/mpi... \n", + "1 5.766222 70.390925 /cluster/work/jobs/5977264/ShallowWaterGPU/mpi... \n", + "2 6.594021 72.797283 /cluster/work/jobs/5977265/ShallowWaterGPU/mpi... \n", + "3 13.090770 98.327636 /cluster/work/jobs/5977266/ShallowWaterGPU/mpi... \n", "\n", - " t_sim_init t_nc_write t_full_step t_mpi_halo_exchange \\\n", - "0 10.661480 113.172576 42.137838 0.0 \n", - "1 11.083883 118.234985 43.038861 0.0 \n", - "2 11.338173 118.849141 43.378157 0.0 \n", - "3 11.166394 116.970772 43.362903 0.0 \n", - "4 11.167876 121.090511 43.696337 0.0 \n", - "5 11.125732 122.019746 43.435468 0.0 \n", - "6 11.410769 124.265493 43.508696 0.0 \n", - "7 11.951049 123.907622 43.785883 0.0 \n", - "8 11.861801 126.177618 44.059032 0.0 \n", - "9 12.045421 127.249941 44.542234 0.0 \n", - "10 12.357193 128.412160 44.133266 0.0 \n", - "11 12.668238 129.337771 44.327086 0.0 \n", - "12 12.733378 129.754346 44.384927 0.0 \n", - "13 12.836023 130.674045 44.157766 0.0 \n", - "14 13.105231 131.080429 44.535530 0.0 \n", - "15 13.106097 133.506058 43.892579 0.0 \n", + " t_sim_init t_nc_write t_full_step t_mpi_halo_exchange \\\n", + "0 6.785504 34.131567 24.233159 0.0 \n", + "1 6.297029 31.896560 24.437577 0.0 \n", + "2 6.115570 33.620830 24.389490 0.0 \n", + "3 23.062950 35.326106 24.479295 0.0 \n", "\n", - " t_mpi_halo_exchange_download t_mpi_halo_exchange_upload \\\n", - "0 41.482056 0.042358 \n", - "1 41.775146 0.042603 \n", - "2 41.762573 0.041992 \n", - "3 41.740112 0.041138 \n", - "4 41.728638 0.043213 \n", - "5 41.725586 0.044678 \n", - "6 41.731934 0.044067 \n", - "7 41.630493 0.043823 \n", - "8 41.810547 0.044678 \n", - "9 41.643677 0.044678 \n", - "10 41.851196 0.045288 \n", - "11 41.774414 0.046509 \n", - "12 41.790405 0.046509 \n", - "13 41.642212 0.046387 \n", - "14 41.643066 0.045044 \n", - "15 41.756714 0.047485 \n", + " t_mpi_halo_exchange_download t_mpi_halo_exchange_upload \\\n", + "0 23.969971 0.039307 \n", + "1 23.959106 0.035278 \n", + "2 23.961182 0.036865 \n", + "3 23.963623 0.038574 \n", "\n", - " t_mpi_halo_exchange_sendreceive t_mpi_step nx ny dt \\\n", - "0 0.059082 0.025330 22528.0 22528.0 0.000001 \n", - "1 0.402832 0.026062 22528.0 22528.0 0.000001 \n", - "2 0.779541 0.026123 22528.0 22528.0 0.000001 \n", - "3 1.217041 0.025879 22528.0 22528.0 0.000001 \n", - "4 1.111328 0.026855 22528.0 22528.0 0.000001 \n", - "5 0.885742 0.027466 22528.0 22528.0 0.000001 \n", - "6 0.954346 0.027405 22528.0 22528.0 0.000001 \n", - "7 1.984375 0.028320 22528.0 22528.0 0.000001 \n", - "8 1.729980 0.027954 22528.0 22528.0 0.000001 \n", - "9 1.878174 0.028931 22528.0 22528.0 0.000001 \n", - "10 1.613525 0.029053 22528.0 22528.0 0.000001 \n", - "11 1.831299 0.028137 22528.0 22528.0 0.000001 \n", - "12 1.806152 0.029480 22528.0 22528.0 0.000001 \n", - "13 1.662354 0.030518 22528.0 22528.0 0.000001 \n", - "14 1.943604 0.029297 22528.0 22528.0 0.000001 \n", - "15 0.937256 0.030579 22528.0 22528.0 0.000001 \n", + " t_mpi_halo_exchange_sendreceive t_mpi_step nx ny dt \\\n", + "0 0.049072 0.027039 12288.0 12288.0 0.000001 \n", + "1 0.200195 0.022766 12288.0 12288.0 0.000001 \n", + "2 0.150146 0.025269 12288.0 12288.0 0.000001 \n", + "3 0.281494 0.028137 12288.0 12288.0 0.000001 \n", "\n", - " n_time_steps slurm_job_id n_cuda_devices n_processes \\\n", - "0 200.0 232557.0 1 1 \n", - "1 200.0 232558.0 2 2 \n", - "2 200.0 232589.0 3 3 \n", - "3 200.0 232590.0 4 4 \n", - "4 200.0 232591.0 5 5 \n", - "5 200.0 232592.0 6 6 \n", - "6 200.0 232593.0 7 7 \n", - "7 200.0 232594.0 8 8 \n", - "8 200.0 232595.0 9 9 \n", - "9 200.0 232596.0 10 10 \n", - "10 200.0 232597.0 11 11 \n", - "11 200.0 232598.0 12 12 \n", - "12 200.0 232599.0 13 13 \n", - "13 200.0 232600.0 14 14 \n", - "14 200.0 232601.0 15 15 \n", - "15 200.0 232602.0 16 16 \n", + " n_time_steps slurm_job_id n_cuda_devices n_processes \\\n", + "0 200.0 5977262.0 1 1 \n", + "1 200.0 5977264.0 2 2 \n", + "2 200.0 5977265.0 3 3 \n", + "3 200.0 5977266.0 4 4 \n", "\n", - " git_hash \\\n", - "0 aa693a9a468e3d591417342d96128d90c9df7884\\n \n", - "1 aa693a9a468e3d591417342d96128d90c9df7884\\n \n", - "2 aa693a9a468e3d591417342d96128d90c9df7884\\n \n", - "3 aa693a9a468e3d591417342d96128d90c9df7884\\n \n", - "4 aa693a9a468e3d591417342d96128d90c9df7884\\n \n", - "5 aa693a9a468e3d591417342d96128d90c9df7884\\n \n", - "6 aa693a9a468e3d591417342d96128d90c9df7884\\n \n", - "7 aa693a9a468e3d591417342d96128d90c9df7884\\n \n", - "8 aa693a9a468e3d591417342d96128d90c9df7884\\n \n", - "9 aa693a9a468e3d591417342d96128d90c9df7884\\n \n", - "10 aa693a9a468e3d591417342d96128d90c9df7884\\n \n", - "11 aa693a9a468e3d591417342d96128d90c9df7884\\n \n", - "12 aa693a9a468e3d591417342d96128d90c9df7884\\n \n", - "13 aa693a9a468e3d591417342d96128d90c9df7884\\n \n", - "14 aa693a9a468e3d591417342d96128d90c9df7884\\n \n", - "15 aa693a9a468e3d591417342d96128d90c9df7884\\n \n", + " git_hash \\\n", + "0 0f0cbad2dd661c59f9a2c43740eda12d90cca413\\n \n", + "1 0f0cbad2dd661c59f9a2c43740eda12d90cca413\\n \n", + "2 0f0cbad2dd661c59f9a2c43740eda12d90cca413\\n \n", + "3 0f0cbad2dd661c59f9a2c43740eda12d90cca413\\n \n", "\n", - " git_status \n", - "0 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n", - "1 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n", - "2 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n", - "3 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n", - "4 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n", - "5 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n", - "6 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n", - "7 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n", - "8 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n", - "9 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n", - "10 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n", - "11 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n", - "12 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n", - "13 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n", - "14 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n", - "15 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n" + " git_status \n", + "0 M conda_environment.yml\\n M conda_environment... \n", + "1 M conda_environment.yml\\n M conda_environment... \n", + "2 M conda_environment.yml\\n M conda_environment... \n", + "3 M saga_scaling_benchmark.job\\n M saga_strong_... \n", + " t_init t_total outfile \\\n", + "0 5.409974 74.459357 /cluster/work/jobs/5977267/ShallowWaterGPU/mpi... \n", + "1 10.191378 87.734289 /cluster/work/jobs/5977268/ShallowWaterGPU/mpi... \n", + "2 10.992114 92.724516 /cluster/work/jobs/5977269/ShallowWaterGPU/mpi... \n", + "\n", + " t_sim_init t_nc_write t_full_step t_mpi_halo_exchange \\\n", + "0 8.215068 31.199623 27.619763 0.0 \n", + "1 18.097157 30.747718 26.639607 0.0 \n", + "2 18.207139 32.633317 28.926713 0.0 \n", + "\n", + " t_mpi_halo_exchange_download t_mpi_halo_exchange_upload \\\n", + "0 23.962158 0.035278 \n", + "1 23.961914 0.035278 \n", + "2 23.966187 0.037476 \n", + "\n", + " t_mpi_halo_exchange_sendreceive t_mpi_step nx ny dt \\\n", + "0 3.625488 0.022888 12288.0 12288.0 0.000001 \n", + "1 2.509521 0.022278 12288.0 12288.0 0.000001 \n", + "2 4.665771 0.023193 12288.0 12288.0 0.000001 \n", + "\n", + " n_time_steps slurm_job_id n_cuda_devices n_processes \\\n", + "0 200.0 5977267.0 1 2 \n", + "1 200.0 5977268.0 1 3 \n", + "2 200.0 5977269.0 1 4 \n", + "\n", + " git_hash \\\n", + "0 0f0cbad2dd661c59f9a2c43740eda12d90cca413\\n \n", + "1 0f0cbad2dd661c59f9a2c43740eda12d90cca413\\n \n", + "2 0f0cbad2dd661c59f9a2c43740eda12d90cca413\\n \n", + "\n", + " git_status \n", + "0 M conda_environment.yml\\n M conda_environment... \n", + "1 M saga_scaling_benchmark.job\\n M saga_strong_... \n", + "2 M saga_scaling_benchmark.job\\n M saga_strong_... \n" ] } ], "source": [ "# DGX-2\n", "#weak_scaling_profiling_data = read_profiling_files(\"output_dgx-2/weak_scaling/2022-06-09T134809/\")\n", - "weak_scaling_profiling_data = read_profiling_files(\"output_dgx-2/weak_scaling/2022-06-23T154025/\")\n", + "#weak_scaling_profiling_data = read_profiling_files(\"output_dgx-2/weak_scaling/2022-06-23T154025/\")\n", "\n", "# HGX\n", "#weak_scaling_profiling_data = read_profiling_files(\"output_hgx/weak_scaling/2022-06-16T162931/\")\n", "##weak_scaling_profiling_data = read_profiling_files(\"output_hgx/weak_scaling/2022-06-16T170630/\")\n", "\n", - "print(weak_scaling_profiling_data)" + "# Saga\n", + "singlenode_weak_scaling_profiling_data = read_profiling_files(\"output_saga/weak_scaling/2022-06-16T151516/\", drop_multinode=True)\n", + "multinode_weak_scaling_profiling_data = read_profiling_files(\"output_saga/weak_scaling/2022-06-16T151516/\", drop_singlenode=True)\n", + "\n", + "print(singlenode_weak_scaling_profiling_data)\n", + "print(multinode_weak_scaling_profiling_data)" ] }, { @@ -243,129 +204,91 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - " t_init t_total outfile \\\n", - "0 15.227155 189.004926 /work/martinls/232634/ShallowWaterGPU/mpi_out_... \n", - "1 12.726498 145.335962 /work/martinls/232635/ShallowWaterGPU/mpi_out_... \n", - "2 11.482033 123.139408 /work/martinls/232636/ShallowWaterGPU/mpi_out_... \n", - "3 10.548483 100.839853 /work/martinls/232637/ShallowWaterGPU/mpi_out_... \n", - "4 10.746949 95.866956 /work/martinls/232638/ShallowWaterGPU/mpi_out_... \n", - "5 10.345715 87.113081 /work/martinls/232639/ShallowWaterGPU/mpi_out_... \n", - "6 9.915406 75.785243 /work/martinls/232640/ShallowWaterGPU/mpi_out_... \n", - "7 10.107682 69.963608 /work/martinls/232641/ShallowWaterGPU/mpi_out_... \n", - "8 10.620777 66.039795 /work/martinls/232642/ShallowWaterGPU/mpi_out_... \n", - "9 11.305829 63.000684 /work/martinls/232643/ShallowWaterGPU/mpi_out_... \n", - "10 11.614343 60.330283 /work/martinls/232644/ShallowWaterGPU/mpi_out_... \n", - "11 12.639043 60.506280 /work/martinls/232645/ShallowWaterGPU/mpi_out_... \n", - "12 13.312508 57.034760 /work/martinls/232646/ShallowWaterGPU/mpi_out_... \n", + " t_init t_total outfile \\\n", + "0 9.692163 80.12349 /cluster/work/jobs/5977971/ShallowWaterGPU/mpi... \n", "\n", - " t_sim_init t_nc_write t_full_step t_mpi_halo_exchange \\\n", - "0 11.414952 118.087399 42.976445 0.0 \n", - "1 8.819334 90.167300 32.226894 0.0 \n", - "2 7.751206 75.901292 26.841162 0.0 \n", - "3 6.980121 58.661561 23.018016 0.0 \n", - "4 6.335883 57.172819 20.371334 0.0 \n", - "5 5.870950 51.546669 18.195306 0.0 \n", - "6 5.579971 41.915547 16.725574 0.0 \n", - "7 5.234274 38.144568 14.960167 0.0 \n", - "8 4.945005 35.074090 13.968068 0.0 \n", - "9 4.773231 32.496020 13.152020 0.0 \n", - "10 4.734492 30.088176 11.919627 0.0 \n", - "11 4.422556 30.348880 11.168828 0.0 \n", - "12 4.536324 26.665879 10.616396 0.0 \n", + " t_sim_init t_nc_write t_full_step t_mpi_halo_exchange \\\n", + "0 8.455713 35.275914 24.448944 0.0 \n", "\n", - " t_mpi_halo_exchange_download t_mpi_halo_exchange_upload \\\n", - "0 41.536133 0.042114 \n", - "1 31.025757 0.041748 \n", - "2 25.926025 0.039062 \n", - "3 22.155762 0.040649 \n", - "4 19.375610 0.040161 \n", - "5 17.366577 0.039062 \n", - "6 15.636230 0.040527 \n", - "7 14.279663 0.040649 \n", - "8 13.050293 0.039307 \n", - "9 11.995850 0.039917 \n", - "10 11.195801 0.039429 \n", - "11 10.509277 0.039307 \n", - "12 9.817139 0.040283 \n", + " t_mpi_halo_exchange_download t_mpi_halo_exchange_upload \\\n", + "0 23.929565 0.03894 \n", "\n", - " t_mpi_halo_exchange_sendreceive t_mpi_step nx ny dt \\\n", - "0 1.334229 0.025146 45056.0 11264.0 0.000001 \n", - "1 0.792480 0.026306 45056.0 8396.0 0.000001 \n", - "2 0.567139 0.025024 45056.0 6997.0 0.000001 \n", - "3 0.596924 0.025452 45056.0 5997.0 0.000001 \n", - "4 0.803955 0.024841 45056.0 5248.0 0.000001 \n", - "5 0.732422 0.025330 45056.0 4664.0 0.000001 \n", - "6 0.979492 0.026062 45056.0 4198.0 0.000001 \n", - "7 0.487793 0.025635 45056.0 3816.0 0.000001 \n", - "8 0.795654 0.024780 45056.0 3498.0 0.000001 \n", - "9 0.995605 0.025330 45056.0 3229.0 0.000001 \n", - "10 0.691406 0.025452 45056.0 2998.0 0.000001 \n", - "11 0.388672 0.025757 45056.0 2798.0 0.000001 \n", - "12 0.655518 0.025146 45056.0 2624.0 0.000001 \n", + " t_mpi_halo_exchange_sendreceive t_mpi_step nx ny dt \\\n", + "0 0.340088 0.028564 24576.0 6144.0 0.000001 \n", "\n", - " n_time_steps slurm_job_id n_cuda_devices n_processes \\\n", - "0 200.0 232634.0 4 4 \n", - "1 200.0 232635.0 5 5 \n", - "2 200.0 232636.0 6 6 \n", - "3 200.0 232637.0 7 7 \n", - "4 200.0 232638.0 8 8 \n", - "5 200.0 232639.0 9 9 \n", - "6 200.0 232640.0 10 10 \n", - "7 200.0 232641.0 11 11 \n", - "8 200.0 232642.0 12 12 \n", - "9 200.0 232643.0 13 13 \n", - "10 200.0 232644.0 14 14 \n", - "11 200.0 232645.0 15 15 \n", - "12 200.0 232646.0 16 16 \n", + " n_time_steps slurm_job_id n_cuda_devices n_processes \\\n", + "0 200.0 5977971.0 4 4 \n", "\n", - " git_hash \\\n", - "0 aa693a9a468e3d591417342d96128d90c9df7884\\n \n", - "1 aa693a9a468e3d591417342d96128d90c9df7884\\n \n", - "2 aa693a9a468e3d591417342d96128d90c9df7884\\n \n", - "3 aa693a9a468e3d591417342d96128d90c9df7884\\n \n", - "4 aa693a9a468e3d591417342d96128d90c9df7884\\n \n", - "5 aa693a9a468e3d591417342d96128d90c9df7884\\n \n", - "6 aa693a9a468e3d591417342d96128d90c9df7884\\n \n", - "7 aa693a9a468e3d591417342d96128d90c9df7884\\n \n", - "8 aa693a9a468e3d591417342d96128d90c9df7884\\n \n", - "9 aa693a9a468e3d591417342d96128d90c9df7884\\n \n", - "10 aa693a9a468e3d591417342d96128d90c9df7884\\n \n", - "11 aa693a9a468e3d591417342d96128d90c9df7884\\n \n", - "12 aa693a9a468e3d591417342d96128d90c9df7884\\n \n", + " git_hash \\\n", + "0 0f0cbad2dd661c59f9a2c43740eda12d90cca413\\n \n", "\n", - " git_status \n", - "0 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n", - "1 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n", - "2 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n", - "3 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n", - "4 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n", - "5 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n", - "6 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n", - "7 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n", - "8 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n", - "9 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n", - "10 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n", - "11 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n", - "12 M Figures.ipynb\\n M dgx-2_scaling_benchmark.j... \n" + " git_status \n", + "0 M saga_scaling_benchmark.job\\n M saga_strong_... \n", + " t_init t_total outfile \\\n", + "0 10.973809 93.593265 /cluster/work/jobs/5977972/ShallowWaterGPU/mpi... \n", + "1 4.248161 39.835643 /cluster/work/jobs/5977974/ShallowWaterGPU/mpi... \n", + "2 11.035480 60.120367 /cluster/work/jobs/5983711/ShallowWaterGPU/mpi... \n", + "3 9.521014 44.935236 /cluster/work/jobs/5983714/ShallowWaterGPU/mpi... \n", + "\n", + " t_sim_init t_nc_write t_full_step t_mpi_halo_exchange \\\n", + "0 18.225805 32.501692 29.925707 0.0 \n", + "1 4.393575 15.181573 13.800955 0.0 \n", + "2 26.829786 10.607348 9.628182 0.0 \n", + "3 17.313007 8.706373 7.796057 0.0 \n", + "\n", + " t_mpi_halo_exchange_download t_mpi_halo_exchange_upload \\\n", + "0 23.949829 0.037476 \n", + "1 12.015137 0.035522 \n", + "2 8.051514 0.038574 \n", + "3 6.057861 0.042480 \n", + "\n", + " t_mpi_halo_exchange_sendreceive t_mpi_step nx ny dt \\\n", + "0 5.814209 0.025513 24576.0 6144.0 0.000001 \n", + "1 1.679688 0.023071 24576.0 3072.0 0.000001 \n", + "2 1.506348 0.025513 24576.0 2048.0 0.000001 \n", + "3 1.665527 0.029907 24576.0 1536.0 0.000001 \n", + "\n", + " n_time_steps slurm_job_id n_cuda_devices n_processes \\\n", + "0 200.0 5977972.0 1 4 \n", + "1 200.0 5977974.0 2 8 \n", + "2 200.0 5983711.0 3 12 \n", + "3 200.0 5983714.0 4 16 \n", + "\n", + " git_hash \\\n", + "0 0f0cbad2dd661c59f9a2c43740eda12d90cca413\\n \n", + "1 0f0cbad2dd661c59f9a2c43740eda12d90cca413\\n \n", + "2 0f0cbad2dd661c59f9a2c43740eda12d90cca413\\n \n", + "3 0f0cbad2dd661c59f9a2c43740eda12d90cca413\\n \n", + "\n", + " git_status \n", + "0 M saga_scaling_benchmark.job\\n M saga_strong_... \n", + "1 M saga_scaling_benchmark.job\\n M saga_strong_... \n", + "2 M saga_scaling_benchmark.job\\n M saga_strong_... \n", + "3 M saga_scaling_benchmark.job\\n M saga_strong_... \n" ] } ], "source": [ "# DGX-2\n", "#strong_scaling_profiling_data = read_profiling_files(\"output_dgx-2/strong_scaling/2022-06-09T160712/\")\n", - "strong_scaling_profiling_data = read_profiling_files(\"output_dgx-2/strong_scaling/2022-06-23T172838/\")\n", + "#strong_scaling_profiling_data = read_profiling_files(\"output_dgx-2/strong_scaling/2022-06-23T172838/\")\n", "\n", "# HGX\n", "#strong_scaling_profiling_data = read_profiling_files(\"output_hgx/strong_scaling/2022-06-16T152945/\")\n", "\n", - "print(strong_scaling_profiling_data)" + "# Saga\n", + "singlenode_strong_scaling_profiling_data = read_profiling_files(\"output_saga/strong_scaling/2022-06-16T190721/\", drop_multinode=True)\n", + "multinode_strong_scaling_profiling_data = read_profiling_files(\"output_saga/strong_scaling/2022-06-16T190721/\", drop_singlenode=True)\n", + "\n", + "print(singlenode_strong_scaling_profiling_data)\n", + "print(multinode_strong_scaling_profiling_data)" ] }, { @@ -414,7 +337,7 @@ "# speedup(t_total_no_init_or_file_io[0], t_total_no_init_or_file_io), label=\"Total (no init or file I/O)\")\n", "\n", "ax_weak.plot(weak_scaling_profiling_data[\"n_processes\"].to_numpy(dtype=\"int\"), \n", - " speedup(weak_scaling_profiling_data[\"t_full_step\"][0], weak_scaling_profiling_data[\"t_full_step\"]), label=\"Total runtime (except init and file I/O)\")\n", + " speedup(weak_scaling_profiling_data[\"t_full_step\"][0], weak_scaling_profiling_data[\"t_full_step\"]), label=\"Runtime (except init and file I/O)\")\n", "ax_weak.locator_params(axis=\"x\", nbins=16)\n", "\n", "\"\"\"\n", @@ -440,7 +363,7 @@ " speedup(weak_scaling_profiling_data[\"t_init\"][0], weak_scaling_profiling_data[\"t_init\"]), label=\"Init\")\n", "\"\"\"\n", "\n", - "ax_weak.plot(nproc, np.ones(len(nproc)), label=\"Ideal (constant)\", linestyle=\"dotted\")\n", + "ax_weak.plot(nproc, np.ones(len(nproc)), label=\"Ideal runtime (constant)\", linestyle=\"dotted\")\n", "\n", "ax_weak.set_xlabel(\"Number of ranks/GPUs\")\n", "ax_weak.set_ylabel(\"Efficiency\")\n", @@ -464,7 +387,7 @@ "# speedup(t_total_no_init_or_file_io[0], t_total_no_init_or_file_io)*4, label=\"Total (no init or file I/O)\")\n", "\n", "ax_strong.plot(strong_scaling_profiling_data[\"n_processes\"].to_numpy(dtype=\"int\"), \n", - " speedup(strong_scaling_profiling_data[\"t_full_step\"][0], strong_scaling_profiling_data[\"t_full_step\"])*4, label=\"Total runtime (except init and file I/O)\")\n", + " speedup(strong_scaling_profiling_data[\"t_full_step\"][0], strong_scaling_profiling_data[\"t_full_step\"])*4, label=\"Runtime (except init and file I/O)\")\n", "\n", "\"\"\"\n", "ax_strong.plot(strong_scaling_profiling_data[\"n_processes\"].to_numpy(dtype=\"int\"), \n", @@ -497,7 +420,7 @@ "#ax_strong.plot(nproc, gustafsons_speedup(0.5, nproc), label=\"Gustafsons 50%\")\n", "#ax_strong.plot(nproc, gustafsons_speedup(0.1, nproc), label=\"Gustafsons 10%\")\n", "\n", - "ax_strong.plot(nproc[3:], nproc[3:], label=\"Ideal (linear)\", linestyle=\"dotted\")\n", + "ax_strong.plot(nproc[3:], nproc[3:], label=\"Ideal runtime (linear)\", linestyle=\"dotted\")\n", "\n", "ax_strong.set_xlabel(\"Number of ranks/GPUs\")\n", "ax_strong.set_ylabel(\"Speedup\")\n", @@ -507,6 +430,81 @@ "fig.savefig(\"dgx-2-scaling.pdf\", bbox_inches='tight')" ] }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/cluster/projects/nn9882k/martinls/.conda/envs/ShallowWaterGPU_HPC/lib/python3.7/site-packages/ipykernel_launcher.py:45: UserWarning: Matplotlib is currently using module://matplotlib_inline.backend_inline, which is a non-GUI backend, so cannot show the figure.\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA8gAAAF9CAYAAADYykHtAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAADMM0lEQVR4nOzdd3yN1x/A8c/JniIhQmLEJvaoWVtRu8MoHahNW1Wjqq2gA6WqrRptlRalP1spbdWs2puUCjEiNiF73PP74yZXxs24ZInv+/XKK7nnPuc833tzefJ9zlJaa4QQQgghhBBCiCedVW4HIIQQQgghhBBC5AWSIAshhBBCCCGEEEiCLIQQQgghhBBCAJIgCyGEEEIIIYQQgCTIQgghhBBCCCEEADa5HUBeo5SSZb2FEEJkOa21yu0YHldybRZCCJEdzF2bpQdZCCGEEEIIIYRAepDTJPtDCyGEyApKScdxVpFrsxBCiKyQ3rVZepCFEEIIIYQQQggkQRZCCCGEEEIIIQBJkIUQQgghhBBCCEASZCGEEEIIIYQQApAEWQghhBBCCCGEAGQVayGEEEI85mJjY7l8+TJRUVG5HYoQQmQbBwcHihcvjq2tbW6Hkq8p2TIhOaWUBtlKQgghRNZI3EpCay37PT2kjK7N58+fx9XVlUKFCsm2WkKIfElrza1bt7h//z6lS5fO7XAee+ldm3N8iLVSqrhS6iul1D9KqQillFZK+WayroNS6jOlVIhSKjKhjaZmjrNSSo1TSgUppaKUUkeVUi9k+YsRQgghnnCWXNeVUg2UUpuUUneVUuFKqeNKqZ6PGkNUVJQkx0KIfE0pRaFChWSkTA7IjTnI5YDuwB1gp4V1vwcGAB8CHYEQYLNSqmaK4yYD/sDXwLPAHuB/Sqn2Dx21EEIIIczJ1HVdKdUB2AFcBXoBXYBvAYesCEKSYyFEfif/z+WMHB9irZSy0lobEn7uj/HiWFprHZRBvRrAEaCf1vqHhDIb4CRwWmvdOaGsCHAJmKK1npCk/hbAU2tdPYPzPNIQ67nbA6le3I1GZQubynYH3uTY5VAGNyv7UG0KIYR4fOX3IdaZua4rpVyBQGCp1nrEQ5wj3WtzQEAAlStXtjh2IYR43Mj/d1kjTw2xTryIPoTOQCywPElbccAyoK1Syj6huC1gByxOUX8xUE0pla2D9qsXd2P40sPsDrwJGJPj4UsPU724W3aeVgghhMgVmbyudwM8gRnZHI4QQgjxSB6nbZ6qAOe11hEpyk9iTIjLJTkuGjhr5jgAv2yLEGhUtjBf96rF6wsPwFJFo72eDG1elhLuTsTFG2BbJ1iq4PL6B5XOzjeW7R34oCziirFstXfyE/xWx1h+++CDsmP+xrJj/g/Kbh80lv1WJ3n91d7G8ogrD8r2DjSWnZ3/oOzyemPZtk7J6y9Vxq+k5DXJa5LXJK8pP78mkRWeBm5jvFF9XCkVp5S6pJSaoJSyzu3gRPa4efMmSim2bduW26FkKX9/f6pWrZpr5//vv//w8vIiNDQ0W8+zcOFCXFxcLKqT2+8NQEREBC+++CJubm4opQgKCqJ58+YMHz7cdEzKx3lBvXr1WLVqVW6HkbfdC8mR0zxOCbIHxvlNKd1O8nzi97s69TislMclo5QaqJQ68MhRYkySba0f/IH40YYAmkzbSsUPNrEroWf5u13n+PyPM/xy4BKBN8IAMMjK2UIIIfInb8AJWAosBFoDi4APgOlpVcrKa3Ne06dPH5RSqb6OHDmS26GJBEFBQSilOHAg+Udw1KhRbN++PZeigvfee4+hQ4fi5pa9oxN79OjBuXPnLKqT8r3p06cPHTt2zOrQ0rVgwQJ27NjBrl27CAkJoUSJEqxatYpPP/00S8+T1mubMmUKzz33nOnxv//+y0svvYSXlxf29vaULl2ad955hzt3kqc1H3zwAWPHjsVgeNjBtvnctqkwuz7cCsz2U+XqNk8WzkH+A3DRWjdMUf4M8DvQVGu9Uyn1LdBRa10sxXHlgTPAq1rrn9I5zyNv87Q78CYDFh3Ar1gBjl4OxbewE/ci47h2P4r0mrVSULSAA8XdnSju7oiPuyPF3R1Nj4u5OWJn8zjd0xBCCJHf5yAnlc4c5N+BZ4B3tNafJymfA7yOcY2QNLvDcmIO8prDwXy2+TRX7kbiXdCR0W0r0rWWzyO1mZ4+ffoQHBzMTz8l/5OkcOHC2NjYZMs5Y2JisLOzy5a2zbl58yaenp5s3bqV5s2b58g5s/I1BgUFUbp0afbv30/dunWzpM1HdenSJcqUKUNgYCAlS5bM7XAy1KdPH27evMmvv/6a5W3Hxsaa3Q94xIgRHD58ON2bGM2bN6dq1ap8/fXXD33+tF5bw4YNGTRoEH369GHfvn20bt2apk2bMn78eHx8fDh27BhjxoxBa80///xDwYIFAYiPj8fHx4fvv/+eDh06pHneJ3YO8uUD8GNX6PI1VOn6yM3lqTnIj+A25nt/3ZM8n/jdXaVe5i3lcdkicc7xt6/V5X9DGrGw31PcDIvh8x41+HdyO7aNas6S/vWZ+kI13mhZjudq+fCUrzvebg5o4EpoFPuCbrPqcDBf/XWWsSuP0/u7vTT7bBsVP/iNhp9u4cU5uxmx7DDTN59m2b6L7PrvJudvhhMdF5+dL00IIYR4WLcSvv+Rovx3wBbj9Khcs+ZwMONWHSf4biQaCL4bybhVx1lzODhbz2tvb0/RokWTfSUmxzt27KB+/fo4ODjg5eXF22+/TUxMjKmuuSGiKXu0mjdvzpAhQxg1ahSenp40btzYbByJw2KXLVtG2bJlcXV1pWvXrty8edN0jMFgYPLkyZQoUQJ7e3uqVavG2rVrk7Wzf/9+6tSpg4ODA7Vq1WLv3r2pznXq1Ck6dOiAq6srRYoU4aWXXuLq1aum548fP06rVq0oUKAArq6u1KhRg61bt6b5Hqb1GpVSrFixItmxvr6+TJ/+YMCCUor58+fTrVs3nJ2dKVOmDIsXP1jCJnGv2aeeegqllCnJTzmMOPF9nzp1KkWLFsXNzY13330Xg8GAv78/RYoUoWjRokydOjVZPKGhoQwcOJAiRYrg6upKs2bNUvVWp7R8+XKqVauWLDlOHAq9ZcsWqlatirOzMy1atOD8+fPJ6s6bN49y5cphZ2dHuXLl+Pbbb9M9V8oh1pn5nCR9b/z9/Vm0aBEbNmwwjZBIa7h9Rp+vxN78n3/+mZYtW+Lo6Mi8efNStdO8eXNmzZrFjh07kv3OMhpSHRMTw9ixYylevDjOzs489dRTbN68Od33x5yrV69y4MABOnbsiNaafv36Ub58edatW0fDhg0pWbIkHTt25M8//+TixYuMHz/eVNfa2pr27dvz888/W3zefCsqyX3T4nXh7eNZkhxnJHtuUWaPk8BzSimnFPOQ/YAYHsw5PgnYA2VJPg85ce7xqewM8tjlUL7uVcu0inXinORjl0NpVLYwvoWd8S3sbLZuTJyBq6FRXL4TweU7kVy+G2n6OfhOJCGhkYSERhESGsWBC6lHmysFRVztTT3Oxd0d8Sn44Gfvgo442MpULyGEEDkucR2QlF3AiTezs3RMoe+7Gx65jcjYeEYsP8KI5UcyXSdoStq9PpYIDg7m2Wef5ZVXXmHhwoUEBgbSv39/rKysmDHDsnXOFi9ezMCBA9m5c2e6o+OCgoJYvnw5q1evJjw8nJ49ezJ+/HhTEjJr1iw+++wz5s6dS926dVm8eDHPP/88Bw8epGbNmoSHh9OhQweaNWvGokWLCA4OZsSIEcnOERISQtOmTXn99deZPn06sbGxjB8/ns6dO7Nnzx6srKzo1asXNWrUYN++fdjY2HD8+HEcHNLfCSyzr9GcSZMmMWXKFD799FO+//57+vXrR5MmTShVqhT79u2jXr16bNq0iRo1aqTbM71jxw6KFy/Otm3bOHz4ML179+bIkSPUqlWLXbt28ddffzFkyBBat25NnTp10FrToUMH3Nzc+PXXX/Hw8GDRokW0bNmS06dPU6xYMbPn2blzp9ne7OjoaD799FMWLFiAg4MDr732GoMHDzYleatXr2b48OHMnDmTNm3asHnzZoYOHUrRokXp1Cnz6y5k9DlJatSoUQQEBHD79m3TSAkPD7MzHTP8fCUaN24c06dP5/vvvzfbe7xq1SpGjRrFv//+y6pVqzI9mqBv374EBgaydOlSihcvzsaNG+nUqRP79++nRo0amWoDMCXChQsX5vDhw5w8eZIlS5ZgZZW8T9Lb25tevXrx888/8/XXX5t6M+vVq8fHH3+c6fPla0eXwcYx8PIKKFHPWObonn6dLPI4JcjrgIkYV8JcBKZtnnoAv2utoxOO24QxYe6dcHyil4ETWuvkt9OymLmtnBqVLZxs26e02NlYUbKQEyULOZl9PjY+MYF+kDgn/hx815g8X7sXzbV70Rw0k0CDMYH2STJsO+kQbh9JoIUQQmSPNcBkoB1wIkl5WyAqRdkTY9OmTcl66Jo0acJvv/3GN998Q7Fixfjmm2+wsrKicuXKTJkyhUGDBjF58mScnMz/nWBO6dKlM5VUx8XFsXDhQtO81oEDB/LDDz+Ynp8+fTqjRo2iV69egDGx3LFjB9OnT2fx4sUsWbKEmJgYfvjhB1xcXKhatSrjx4/nlVdeMbUxZ84catSokawn9ccff8TDw4MDBw5Qr149Lly4wKhRo6hUqRIA5cqVIyOZfY3mvPLKK7z88ssATJ48mVmzZrFz505KlSqFp6cnAIUKFaJo0aLptuPm5sbs2bOxtramUqVKzJgxgytXrrBp0yYAKlSowJQpU9i6dSt16tRh69atHDlyhBs3buDo6Gg6//r16/npp58YM2aM2fNcuHAhWcKYKC4ujtmzZ1OxYkXAmJz27dsXg8GAlZUV06dP55VXXjH1olaoUIGDBw8ydepUixLkjD4nSbm4uODo6GgaKZGejD5fid544w1efPHFNNvx8PDAyckJOzu7DM+ZKDAwkJ9//pmgoCBTz/zw4cP5888/mTdvHt98802m2gFYu3YtXbt2BeDMmTMAaQ6H9vPz47vvvuPGjRsUKVIEMCbOwcHBxMXFZdtUi8dG8EGIDoXTvz1IkHNIrrzzSqnET3biUqPPKqVuADe01tuVUqUw7pc4SWs9CUBrfUQptRz4QillC5wHhgClMSbDJBx3XSk1ExinlLoPHMKYRLcEuuTAy8s2ttZWlPBwooSHE1Ao1fNx8Qau3osyJc7BSRPpuxGE3I3i+v1ort+P5vDFu2bPUdjFPlninDgPukRCb7SjnSTQQgghksvouq61PqGUWghMUkpZYbw2twb6A5O11mFZGY+lPbmNp/xF8N3IVOU+BR35+92WWRVWKk2bNmX+/AcrqScmSgEBATRs2DBZr9PTTz9NTEwMZ8+epXr16pk+R506dTI+CChVqlSyRZ+8vb25fv06APfu3ePKlSuphmg//fTTbNy40RRz9erVkyX8DRsmWzaGgwcPsmPHDrMrIwcGBlKvXj1GjhxJ//79WbRoEa1ateKFF14wJcuP+hrNSfpe2tjY4OnpaXrdlvDz88Pa+sHfSF5eXqa5pUnLEts+ePAgERERpiQ8UVRUFIGBaS9CFBkZabZH3d7e3pQcg/H3Fxsby927d/Hw8CAgIIB+/folq/P000+zbt26TL9GSP9z8rAy8/lKlB1zwQ8dOoTWGj+/5BvdREdH07Jl5v/9h4WFsWXLFr788stk5alnfRoljnZI+ryjoyNaa6KioixeQTzfafsJ+DYBv845furcujXxvxSPE2/NbAeaYxxyZU3qOdJ9gY+Bj4CCwFGgndb6UIrjxgNhwFtAUeA00F1rvZ58zMbaKqE32Pyd5bh4A9fuRydPnBOHcN+N5MrdSG6GRXMzLJojl+6abaOwix0+7k4UL+iYugfa3REnuyf8bpcQQjyZMrquAwwCgoE3AC8gCBiptZ6VA/Gla3TbioxbdZzI2AdreTjaWjO6bcV0aj06Jycnsz2kWus0/6hOLLeysko1nDg2NjbV8c7O5qd1pZRyuKpSKtVquuZiSrLQTYbnMBgMdOjQIdk84EReXl6Acd5q7969+e2339i8eTMTJ05k7ty5qZK7pMy9RqVUpt6fzLzuzDDXTnptGwwGvLy82LlzZ6q2ChQokOZ5ChcunGr1YyBVb2Pi7yXpa0nv95dZWfV+mZOZ+DL7ebaEwWBAKcX+/ftTvb7Em1aZsWnTJsqVK0fZssbRpBUqVADg5MmTZnv9AwICcHd3p3DhB6NMb9++jYODw5OZHF89Djs/h+fmgo09WNvmSnIMuZQgZ7SSZ8LKl6mO0VpHAiMTvtKrH48xif7o4aPMf2ysrfApaBxKXa906jkg8QbN9fsPhnAHm4ZwPxjGfTMshpthMRxNI4H2cLYzO3Q7sTfaxV4SaCGEyG8ys0K31joGeD/hK09JXK06J1exTo+fnx+//PKLaXgswK5du7CzszP98e3p6UlISPI9QY8ePYqvr2+Wx1OgQAG8vb3ZtWtXsh61Xbt2mXrd/Pz8WLRoEeHh4aYkZs+ePcnaqV27Nr/88gulSpUyO380Ufny5SlfvjxvvvkmQ4YM4bvvvks3QTYn5ftz7dq1VO9XRhLnr8bHZ/0iqLVr1+batWtYWVlRpkyZTNerVasWp05ZvpxO5cqV2bVrV7L3MenvL7vY2dll+P5l5vOVnWrVqoXWmqtXr9KiRYuHbifp8GqAmjVrUrlyZT7//HNeeumlZCNCrly5wpIlS+jbt2+ymwAnTpygdu3aDx3DY8sQDyteh5unwcsPmo7O1XAkWxEm1laKYm7G7aSe8k2dQBsMmuv3owm+m3z+s2k4991IbofHcDs8hmOXze/W4e5ka0yWU/ZAexgTaVeHtC+YQgghRHbpWssn1xLilIYOHcoXX3zB0KFDeeuttzh37hzvvvsuw4cPN80/btmyJSNGjGDdunVUrFiRefPmcenSpWxJkAFGjx7Nhx9+SPny5alTpw6LFy9m586dHDx4EIBevXoxfvx4+vXrx4cffsiVK1dSLTY0bNgwvv32W3r06MHYsWPx9PTk3Llz/PLLL8yYMQMbGxtGjRpFt27d8PX15dq1a+zatYv69etbHG/Lli2ZPXs2jRo1wtramvfeey/Dxb5SKlKkCI6OjmzevBlfX18cHByybO/h1q1b07hxY7p06cK0adOoVKkSV69eZdOmTbRu3ZomTZqYrde2bVv69u1r8RzV0aNH061bN+rUqUObNm3YtGkTS5YsYdWqVVnyetLi6+vLb7/9xunTpylUqBBubm5mb45k9PnKThUqVKB379706dOHGTNmULt2bW7fvs22bdsoU6YMzz//fIZtxMXFsWHDhmQrXyulWLBgAa1bt6ZLly689957FC9enGPHjjF69GhKlSrFRx8l78vbuXMn7dq1y/LXmOdZWcPz8+HgD9DwjdyORhJkkXlWVoqibg4UdXOgTqnUzxsMmpth0VxKMXQ7aSJ9JyKWOxGhHA82n0C7Odqm2QNd3MORApJAi1wwd3sg1Yu7JVtsb3fgTY5dDjW7MJ8QQjwKHx8ffvvtN0aPHk3NmjUpWLAgvXr14pNPPjEd069fP44dO2bqERw6dCjPPfdcsi13stKbb77J/fv3GTNmDNeuXaNixYqsXLnSNHTUxcWFX3/9lSFDhlC7dm0qVarE1KlT6dz5wRBJb29v/v77b8aNG0e7du2IioqiZMmStGnTBnt7ewDu3LnDa6+9xtWrVylUqBAdO3Y0OyQ7IzNmzOD111+nefPmeHl5MW3aNAICAixqw8bGhi+//JJJkyYxceJEmjRpkuY2RZZSSrFx40bef/99BgwYwPXr1/Hy8qJx48a8+uqradZr3769KWlPb6/clLp27cpXX33F9OnTGTFiBKVKleKbb76xaIGuhzFgwAC2bdtG3bp1CQsLS3NP7Iw+X9nthx9+4OOPP2bMmDFcvnwZDw8P6tWrl+ke5R07duDo6JhqjnSDBg3Yt28fkyZNokuXLty9exdvb2+ef/55PvjgA9zdH6zKHBwczO7du5MtSpavRdyGS3uh4rPGx941wTvXZ9wAoCxdDj+/U0ppyNxcGmEZg0FzMzw61dDtB4l0BFGx6c9jKeBgk2zOc8rVuN0cJYEWWS9xf/PELdxSPhYiPUnmaFo22U+YZHRtDggISHOlWCHym7lz5/K///2PLVu25HYoIsFbb71FbGysRStepzR69GhCQ0OTLdxnTr74/y7qHsxrCqGX4NV14Gt+j/ak1hwOztJpMOldm6UHWeQYKytFEVcHirg6UKtk6n3MtNbcCo9JPXQ7yZZW96LiOBVyj1Mh98yew9XeJs1trIq7O+LmaGvxghQi79JaExuviYk3EBNnIDouPuH7g8cPfk753XisqSzeQHRsfMJ3A9EJ341tx+PhbMsr3+/Dw9mWO+GxVC9ekF/2X2Lj8RBc7G1xdbDBxT7hK8XPrgnfHW2t5fMnhBDikQwYMIDbt28TGhqaZUO+xaOpUqVKqlXbLVWkSBFGjRqVRRHlcQ4FoFIHOL8DCpbM8PA1h4OTLaQYfDeScauOA2TL1BjpQU5BepDzLq01t8NjUg3bTkykL92JICIm/YUgXOxtkm9jVTB5El3QSRLozDAYjElptJmk1FwSanqcIgl98D1lYptWwpv4c7wpqX2c/qlaKeNn0NXBFmd764QE2taYQJtJrFMm2Kbn7G2wsU65yL/Iq6QH+dFJD7IQQhg9tv/fGeIhKhScEtY5io8DQyzYZrxSeHZsxSc9yCJfUEpRyMWeQi72VC9eMNXzWmvuRsSaHbqdmEiHRcfx79X7/Hv1vtlzONtZm+2BTkykPZztTP+gcnpeqtaaOIM2m4RGJ01QzSahyR8nTTbNJ7jmktgHz8XG552s1MZKYW9jhV3Cl72NdcJ3qyTfrbGztsLe1gr7hO/GxwnlGda34sy1+3z++xmerVaUjcevMqBJGYq7OxIWHcf9qDjCo+MIi44jLCqO+wnfwxLKEp+PjI3nXlQc96LiHvl1O9hapeq5dra3efA44XviY2f7FIm2gw2u9rY42FrJTSEhhBBCZJ+oUFg5AMKuQb9NxqTY2sb4lYHYeIPZ5BjgShrlj0oSZJFvKKVwd7bD3dmOasVTDznSWhMaGZtq/rMpkb4dwf3oOM5cC+PMtTCz53C0tTYlzjZWVsz68z8GNC1NPd9CHL18hznbztGnUSl+OXAp3Z7QtJLQpD2s5uob8k5eakoe7c0klXZJk9CUz6U43t7cc+aSWFN7D+rb2VhhbZX9yd3uwJt8ueUsc1+pQ6OyhelS0+eh5iDHxRsIj47nfnRssmQ6PElCfT/qQaKdmGCHJXveWDcq1kBUrHHf8kdhbaWS9Uyn6rlON/E29oS7JnyXXm0hhBBCpGKIN27hFBUKt85C0WqZqvb32Zv4rzuZ5vPeBTO/T7UlZIh1CjLE+slmTKCTD91+8DgiS3r+HoV10t7SdJJQc0mrfYrkNK0k1N46/Z7UxLpPUq9jXlvFWmtNZGx88iTaTM91WKrEOzZJWTxh0bEZLoxnCUdb62RDwp3tzAwRT3jsbJ+8Jztp4m1vk78+XzLE+tHJEGshhDB6bP+/ux5g7Dl2983w0Eu3I/h4QwCbTl4FwMPZlrAoYwdSIkdbaz59vtpDz0FO79osCXIKkiCL9NyLik2yCrcxcd56+jrnboRTqpATlYq6YmdjnSqJtTfTE5peEmqfpI2kbUkPnchqsfEGwpP2XKdIrJMn3gkJdnQ8YVHJe8HDouOybD64jZUyJdDmeq4TE++kPdlm52/b21g8wiA7boZIgvzoJEEWQgijx+L/O4MBtk8FBzdoODTT1SJj4pm7PZC52wOJjjPgaGvN8JbleP3p0mw6cVVWsRYiLyrgYEuBYrZULlYAMP7hvPpwMG+2LMfivRd5rZGvbPsjHiu21lYUdLKjoJPdI7WjtSYiJt6YbJsdMh5LeEz8g57slM8nDDW/HxVHdJyB0MhYQiNjH/n1OdlZp0qaUy9+ZouLvbH3OzbewKCfDjLu2Uo0KluYS3cieGvZEb7uVeuRYxFCCCGeCJf2wPYpYGULfp3BrXi6h2ut2XTiKh9tCDDNN+5cw5tx7StRzM04jLprLZ9sWbHaHEmQhXhIKffCbVC2kOyNK55YShl7fZ3tbSjyiG3FxBlMi54lJtDJE+/YZD3b4TFm5m5HxREWE0dETDwRMfFcv2/ZXO33Vp8AoKCTLd/0ri3/poUQQojMKtUIWn0IRWtkmByfuXYf/3Un2R14C4DKxQowsXMV6pX2yIlIzZIEWYiHdOxyaLJkuFHZwnzdqxbHLofKH9NCPALjXHfjgnuPwmDQRMTGJx9CnpBgm0+8HwwZP3cjjJthMfSqV1L+PQshhBAZOfM7FC4PHqWNj5u8k+7hoZGxzPzjDD/tuUC8QVPQyZZRbSryUr2SObIAa3okQRbiIZmbj9iobGH5Y1qIPMIqyQrdXgUyXy9xdEji1Imny8u/a5E7hg8fzokTJ9i2bVuWtblw4UKGDx9OWJj53RpyS/PmzalatSpff/11rpx/4cKF/Pjjj/z1118A+Pv7s2LFCk6cOGH2cW578cUXadSoESNHjsztUISAE6tgRT/wqgKv/wF2TmkeGm/Q/O/AJaZtPs3t8BisFLzSoBTvtKnwyNO9sookyEIIIUQCmTohckqfPn24efMmv/76a26HkqPSStBXrVqFra1trsQUExPD+++/z5IlS9I8ZtSoUbzxxhs5GFX6JkyYQLNmzXj99ddxc0u9taUQOapsSyhUDvy6go1DmocdvHAH/3UnOR4cCkC90h74d6qCn7cFd7FzgCTIQgghRAKZOiFEajExMdjZZW/PjodH7s03XLFiBQ4ODjRr1izNY1xcXHBxccnBqMyLi4vD2tqaatWqUaZMGRYvXsywYcNyOyzxJLoXAq5FQSlwLAiDdxq3cTLj+r0opmz6l1WHggEoWsCB9zpUplP1YnlyW0fZM0YIIYRIMLhZ2VSJcKOyhXNlv2vxZImPj2fUqFG4u7vj7u7OiBEjiI+PT3aM1ppp06ZRtmxZHB0dqVatGosXL052zLvvvkvFihVxdHTE19eXMWPGEBUVZVEsSilmz57N888/j7OzM++99x7btm1DKcXNmzdNxwUFBaGU4sCBAwCmY7Zs2UL9+vVxcnKibt26HDp0yPR83759CQ8PRymFUgp/f3/AOMR6+PDhprZ9fX2ZNGkSffr0wdXVlRIlSrB8+XLu3r1Lz549cXFxoXz58vz+++/JYj916hQdOnTA1dWVIkWK8NJLL3H16tV0X+/SpUvp3Llzusf4+/tTtWpV0+M+ffrQsWNHZs2ahY+PD+7u7vTt25eIiAjTMVnx+0o878KFCylbtiz29vaEh4cD0LlzZ37++ed04xYiW5zdAt/Uh10zH5SZSY5j4gzM2x5Ii+nbWHUoGDtrK4a3KMdfo5rRuYZ3nkyOQRJkIYQQQuRH/m7Gr6SW9jCWnf7tQdmBH4xl6958UHYvxFg2vWLy+vOaGsuvHH5QtvXT1Od5CDNmzODbb79l3rx5/PPPP8THx6ca8vv+++/z/fffM3v2bE6dOsW4ceMYNGgQGzZsMB3j7OzMggULCAgI4JtvvmHZsmV8/PHHFsczceJE2rdvz/Hjxy3uoRw3bhxTpkzh0KFDFCpUiN69e6O1plGjRnzxxRc4OTkREhJCSEgIo0aNSrOdL774gnr16nHo0CG6d+/Oa6+9Rq9evWjfvj1HjhyhadOmvPzyy6aEMiQkhKZNm1K1alX27dvHn3/+SVhYGJ07d8ZgMKR5nl27dlG3bl2LXiPAzp07OXHiBH/++SfLly9n9erVzJo1y/R8Vv2+zp8/z9KlS/nf//7H0aNHcXAwDmGtV68e+/btIzIy0uLYhXgkcdEQFQrBB417Hpux7fR12n2xg09/+5fwmHhaV/bij5FNGdW2Ik52eXsQc96OTgghhBDiCfDFF18wZswYunfvDsCsWbPYvHmz6fnw8HA+//xzfv/9d5o0aQJA6dKl2bdvH7Nnz6ZDhw4AfPDBB6Y6vr6+vPfee0yfPp3JkydbFE+PHj3o37+/6fGFCxcyXXfy5Mm0aNECgA8//JCnn36a4OBgihcvjpubG0opihYtmmE7bdu2ZejQoYAxYf/8888pV64cr776KmB8rQsWLODEiRPUrVuXOXPmUKNGDaZOnWpq48cff8TDw4MDBw5Qr169VOe4e/cuoaGhFCtWLNOvL1GBAgWYM2cONjY2VK5cmW7durFlyxbGjRuXpb+vmJgYfvrpJ7y8vJKd39vbm9jYWK5cuULZsjLKReSgSu2hzwYo2Qiskve3Bt0M56MNp/gz4DoAZQo782EnP5pXfNRNIHOOJMhCCCGEyH/8Q1OX9VqeuqxuX+NXUgWKma8/aEfqshbjjF+PIDQ0lJCQEBo2bGgqs7Kyon79+ly6dAkwDh2OioqiXbt2yYYlxsbG4uvra3q8YsUKvvjiC86ePUtYWBjx8fGphmpnxsP0qCaqXr266Wdvb28Arl+/TvHi6e+Hml47Li4uODk5Ua1aNVNZYsJ4/brxD/GDBw+yY8cOs3OFAwMDzSbIib2vib2ylvDz88PG5sGf0t7e3uzduxfI2t9X8eLFUyXHAI6OjslegxDZ5k4QrBkGnb+EQgk3Y3yfTnZIeHQc32w7y7c7zhMTb8DZzpq3WpenT6PS2Nk8XoOWJUEWQgghhMjjEocIr1+/npIlSyZ7LnH15z179tCzZ08mTJjAzJkzKViwIOvWrUt3GHNanJ2dkz22Sugl0lqbymJjY83WTboadWJymN4Q57SkXNVaKZVu2waDgQ4dOjB9+vRUbZlLMAEKFSqEUoo7d+5kSXxJY4Gs+X2l/F0kun37NgCenp4Wxy6ERbZPgwu74PcP4KWlyZ7SWrPu6BU+3fgvV+8Zpzs8X9uHd9tVokgBy2885QWSIAshhBBC5CI3NzeKFSvGnj17aNmyJWD8o3Pfvn2mob9+fn7Y29tz4cIF0zEp/f333/j4+CQbtmvJ0Oj0JCZhISEhpp+PHDlicTt2dnYP1aOdGbVr1+aXX36hVKlSmd4yys7ODj8/P06dOkX79u2zLJac+H2dOHECb2/vNJN/IbLMs1PBzhlajE9WfOrKPfzXnWRfkPFmTTUfN/w7V6FOKffciDLLSIIshBBCCJHL3nrrLT799FMqVKhAtWrV+OabbwgJCTElyK6urowaNYpRo0ahtaZp06aEhYWxZ88erKysGDhwIBUqVCA4OJglS5bQsGFDNm/enGWrHJcrV44SJUrg7+/PlClTCAoK4qOPPrK4HV9fX6Kiovjjjz+oVasWTk5OODk5ZUmMw4YN49tvv6VHjx6MHTsWT09Pzp07xy+//MKMGTNwdXU1W69t27bs2rXroXra05ITv6+dO3fSrl27LItZCJPYSDi4EOoNMs4xtneF9p+Znr4THsOMP06zdO9FDBoKOdsxpl1FutUpgZVV3lyZ2hKP14BwIYQQQoh86J133qFv377079+f+vXrYzAY6N27d7JjJk+ejL+/P9OnT6dKlSo888wzrFy5ktKlSwPQqVMnRo8ezYgRI6hevTp//PEHkyZNypL4bG1tWbZsGefOnaNGjRpMmDCBTz75xOJ2GjVqxODBg3nppZfw9PRk2rRpWRIfGOcA//3331hZWdGuXTuqVKnCsGHDsLe3x97ePs16AwYMYNOmTaYhy1klO39fUVFRrF69mgEDBmRpzEKgNfzcEza9CztnJHsq3qD5ac8FWszYxuI9F1FK0bexL3+Nak6Pp0rmi+QYQCWdSyJAKaUh+RwbIYQQ4mElzpPUWuePvxxyQUbX5oCAACpXrpyjMYn8pWfPnlSpUiXZcOe8bPbs2axduzbVPtAi/8uR/+/++xN+GwM9FoOXHwB7z93Cf/0pAkLuAdCobCH8O1ehgpf5kRl5XXrX5hzvQVZKlVBKrVBKhSql7imlVimlSmZcE5RSpRPq3lVKhSultiqlUi2zqJQqpJSapZQ6p5SKVEqdV0p9rZSSVQyEEEIIIUQy06ZNo0CBArkdRqbZ2try1Vdf5XYYIr/QGm6ff/C4fGsYthe8/AgJjeTNnw/TY/4eAkLu4VPQkTm9a7Okf/3HNjnOSI72ICulnICjQDTwPqCBjwAnoLrWOjyduoWAY8B9YAIQAYwE6gL1tNYBCccpYBdQAfgQCAD8gMnAGaCRTudFSw+yEEKIrCQ9yI9OepCFEMIoy/+/i4+F9W/BqbXQfwsUqQRAVGw83+86z9d/nSUyNh57GyuGNC/LoKZlcbSzzrrz55L0rs05vUjXAKAMUFFrfRZAKXUM+A8YBHyeTt0hgBfQLEndv4BzwESge8Jx5YFGwCCt9fyEsm1KKQMwB2PifDorX5QQQgghhBBCPHasbCA2AgzxcPsc2rMiWwKuM3nDKS7cigDg2apFGd+hMsXds2ZBvbwupxPkzsCexAQXQGt9Xin1N9CF9BPkBsB/KeqGK6V2Ah2VUjZa6zjALuHpeynq3034LguTCSGEEFlEKVUcGItxRFcNwBEorbUOSqfOPGAgsERr/XJOxCmEECIJrUEp41eX2XAniECrUkz6YT/bz9wAoHwRF/w7V6FxucK5HGzOyukEuQqw1kz5SaBbBnXjgRgz5dEYL8ZlMfYMnwR2AB8opc4C/2IcYv0h8FviUGwhhBBCZIlyGEdxHQR2Am3SO1gp1QjoTeob2Y9Ea20aMieEEPlRlk0B3f89nN0CPX4CK2vuG+z4+qAVC/7eQWy8xtXBhrdbV+CVhqWwtX7y+hZzOkH2AO6YKb8NZLSj9GngGaVUIa31LQCllBVQL0nbaK21Uqo98BOwP0n9DaSThCulBmK8my2EEEKIzNuhtfYCUEr1J50EWSllC8wHPsY4tSpLWFtbExsbi52dXcYHCyHEYyo2NhYbm0dM38JvwV8fQeRtDP/9yeqwKkzZ9C837kejFPR8qgSj2laksEvaW6Pld7lxS8DcrY/M3PKdizHeH5VSZZVSxYAvgdIJzxuSHPstxiHZg4FmCd/rAisSkurUQWk9X2udakVsIYQQQqRNa23I+CiT0YA1MCOjAy1RsGBBrl27hsFgSShCCPH4MBgMXLt2DTc3t0dryLkQdPuBi81m8uIWF97531Fu3I+mVsmCrBnamCkvVH+ik2PI+R7kOyT09KbgjvmeZROt9TmlVG9gNpA4D/kQMBMYBYQAKKU6AC8BrbXWWxKO26GUOgf8DnTC/DBvIYQQQmQTpVRZjDtYdNBax2TlcOjChQtz+fJlTp+WNTiFEPmXs7MzhQs/xHzgS/sh/DpU6sDNsGimH/Zg+YFwtL5LYRd7xj1biedq+WBlJdNUIOcT5JMY5yGn5Aecyqiy1nqlUmoNxpWoY7TWgUqpOcAlrfXFhMOqJXzfn6L6voTvlZEEWQghhMhpc4FVWuutma2Q2elPVlZWlCxZ8lFiE0KI/Ol6ACxsj7ayYfVTS5iwO5b7UXHYWCn6NSnNGy3L4epgm9tR5ik5nSCvA6Yrpcporc8BKKV8gcbAu5lpQGsdj3FvY5RS3kAP4LMkh1xN+F4P+DNJef2E78EPG7wQQgghLKeUehl4CqhkSb2E7RrnJ+6DLIQQwkKelbhesj27g2MZ89d94rChaQVPPuzoR7kiLrkdXZ6ksmw1tMycTCln4CgQiXGYlQYmA65Ada11WMJxpYBAYJLWelJCmS0wDdiOceXLKsC4hONaaa1jEo4rgDGBVglt/4vxgjwB4yrYfonnSSNGDVm4SpwQQognWuJQYq11vh+7lrBI17ck2eZJKeUCnMM4JWpOksOPAf9gXKwrXGsdm067cm0WQojMCrsOVjZcjnbg4w0BbD5xBQNWlPRw4oOOfrSuXOSJX/U/vWtzjvYgJ+xb3BLjRfInjEnsFmBEiqRVYVzEI+mCWhooD/QCCgKXgQXAJ4nJccI57imlGgD+wBigGMb5yesB//SSYyGEEEJkucKAJ/BJwldSJTBuEfUcsCZnwxJCiHzo6nH0ku5csvKh3a0RRMQpHG1tGd6yHK8/XRoHW+vcjjDPy+kh1iTMFX4hg2OCSLGytdY6DuiYyXNcAl5/yBCFEEIIkXWuAi3MlC8DjmPc8ulEjkYkhBD5kNaa7RdjqXE/jOuGUGziwulUowLjnq2Ed0HH3A7vsZHjCbIQQggh8hel1IsJP9ZJ+P6sUuoGcENrvR3YZqZOFHBNa53qOSGEEBYwGDhzI5yJ60/y99lblFUf4FikLN92qUn9MoVyO7rHjiTIQgghhHhU/0vx+JuE79uB5jkbihBCPDnu3Qrh1sLezL1Tn7/jnqagky192rTlpadKYGNtlXEDIhVJkIUQQgjxSB5mATKttW82hCKEEE8Eg0Hzv4OXCNg4F399kBHWF3Gt3Y0Rbavi7myX2+E91iRBFkIIIYQQQojHxKGLd/Bfd5Jjl0OBRpT1jKJe50FMLF8xt0PLFyRBFkIIIYQQQog87vr9KD7beJKix74hOL4VRQt4Ma59JTrX6PDEb9uUlXJ0H+THgey1KIQQIis9SfsgZxe5NgshnmQxcQYW7Q5i1pb/eCN+EYNsNhDkVg/PIRtxdrDN7fAeS3lmH2QhhBBCCCGEEJmz/cwNJq4/ybkb4QCcKf8K0ZFB+HaaCJIcZwvpQU5B7lILIYTIStKD/Ojk2iyEeNJcvBXB5A2n+OPUNaqo80QWqsoHnfxoUbEIaA0ypPqRSA+yEEIIIYQQQuRxETFxfLM1kPk7zxETZ2C0/SqGqRXENfsSm4rNjQdJcpytJEEWQgghhBBCiFyktWb9sRA+3RhASGgUAM/X8uGVEo3hj9XYGKJzOcInhwyxTkGGcQkhhMhKMsT60cm1WQiRn526cg//9SfZd/42ANW9nZnQpTp1SnkYD7h5FgqXy8UI8x8ZYi2EEEIIIYQQecjdiBhm/H6GJXsvYNDg4WzHrBqXePrCbJTHhgcHSnKco6xyOwAhhBBCCCGEeFLEGzSL91yg+fRt/LTnAkop+jTyZevIZjS5tRJ16ywc+im3w3xiyRDrFDIzjOvevXtcv36d2NjYHItLCCFym62tLUWKFKFAgQK5HcpjRYZYPzoZYi2EyC/2B91mwtqTnAq5B0DDMoXw71yFikVdjQeE3YBTa+Cp/rIYVzZK79osCXIKGV2E7927x7Vr1/Dx8cHR0dH05gohRH6mtSYyMpLg4GC8vLwkSbaAJMiPThJkIcTj7mpoFJ/+FsDaI1cA8CnoyPgOlXm26D3UyTXQbIwkxDlI5iBnoevXr+Pj44OTk1NuhyKEEDlGKYWTkxM+Pj5cuXJFEmQhhBAiE6Lj4vl+13m+/ussETHx2NtYMbhZWQY3K4sj0TCrKYRfB48yUL1bbocrkATZYrGxsTg6OuZ2GEIIkSscHR1leokQQgiRCVsCrjHp11NcuBUBQLsqRRnfoTIlPBI72pygzUdweiNUap97gYpkJEF+CDKsWgjxpJL//4QQQoj0nbsRxuRfT7H19A0AyhVxwb9TFZ4uXxii78PV41C0mvHgGj2gencZXp2HSIIshBBCCCGEEI8oLDqOr/76jwW7zhMbr3G1t2HEMxV4tWEpbK2t4P41+LEzRNyCgdvArbixoiTHeYps8yRMmjdvzvDhw7O8XaUUK1asyPJ2s8KBAwdQShEUFJTboVgst9/XPn36MGnSpGw/j6+vL9OnT7eoTm6/NwBr166lfPny2NjY0KdPH7Zt24ZSips3bwKkepwX/Prrr9SsWRODwZDboQghhBCPDa01qw9fpuX0bczbfo44g6ZH3RJsHd2c158ubUyOAZwKgWtRcPSA+JjcDVqkSRLkJ8SNGzcYOnQovr6+2Nvb4+XlRatWrfjjjz9Mx6xatYpPP/00F6MU5vTp04eOHTumKg8JCaFTp065EBEcP36ctWvXMmLEiGw/1/79+xk6dKhFdZK+N0FBQSilOHDgQHaEl6b+/fvzwgsvcOHCBWbNmkWjRo0ICQmhUKFCWXaOtF5bTEwMbm5uHD16FACDwcBXX31FrVq1cHJyokCBArRs2ZLffvstWb2OHTtibW3NkiVLsixGIYQQIj87ERzKi3P/4e3lR7l+P5qaJQqyZmhjpr5YncIu9qA1xCUkw9Y28OIPMGCLcVEukSfJEOsnxAsvvEBERATff/895cqV4/r162zfvp1bt26ZjvHw8MjFCPOX2NhYbG1ts/UcRYsWzdb20/PVV1/xwgsv5MhKxp6enhbXyan3JiYmBjs7u1Tld+/e5ebNm7Rt2xYfH58cj2vr1q24u7tTo0YNAHr16sWmTZv49NNPadu2LZGRkfz444907NiRr7/+miFDhpjq9u3bly+//JJXXnklR2IVQgghHke3wqKZ/vsZlu2/iNZQ2MWed5+txPO1fLCyShgyHR0Ga4eBjQM8N9c4lNpJ/t7O66QHOYfN3R7I7sDkQyp3B95k7vbAbDvn3bt32blzJ1OmTKFVq1aUKlWKp556ilGjRtGzZ0/TcSmHWPv6+vLRRx8xaNAgChQoQPHixfnss8+StX3mzBmaNWuGg4MDFStWZOPGjbi4uLBw4cI04wkODqZnz564u7vj7u5Ohw4d+O+//9J9DYm9qLNmzcLHxwd3d3f69u1LRESE6Zjo6GhGjBiBl5cXDg4ONGjQgF27diVrZ9OmTVSqVAkHBweaNGnCmTNnUp1r9+7dNGvWzLSlzZAhQ7h3716asSUOld24cSP16tXDzs6OzZs34+/vT9WqVZMdu3DhQlxcXEyPE49ZtmwZZcuWxdXVla5du5qG3fr7+7No0SI2bNiAUgqlFNu2bQOSDyNO7ElctmwZzZo1w9HRkVq1anHs2DFOnDhBo0aNcHZ25umnn+b8+fPJYlq/fj116tTBwcGB0qVLM378eGJi0h72Ex8fzy+//ELnzp2TlWfm83Lx4kWee+45XF1dcXV15fnnn+fy5ctpniux3aRDrJVSzJ8/n27duuHs7EyZMmVYvHhxsjpJ35vSpUsD8NRTT6GUonnz5mme6/jx47Ru3RpHR0c8PDzo06cPoaGhpucTP4dTp06lePHiFC9ePFUb27Ztw93dHYCWLVuafmeZGVJt6WcvLWvXrqVLly4A/PLLLyxfvpyFCxcyZMgQypQpQ5UqVZg6dSpvvPEGI0aMSPY76Ny5MwcOHODs2bMWn1cIIYTI7+LiDSz8+zwtpm/j530XsVaKAU1K89eoZrxYp/iD5Bgg9BL89zv8uwHuBOVazMIyOZ4gK6VKKKVWKKVClVL3lFKrlFIlM1m3dELdu0qpcKXUVqVU3TSO9VFKLVBKXVVKRSulziulcn38cPXibgxfetiUJO8OvMnwpYepXtwt287p4uKCi4sL69atIyoqyqK6M2fOpFq1ahw6dIixY8cyZswY/vnnH8A4bPO5557DxsaGPXv2sHDhQiZOnEh0dHSa7UVERNCiRQscHBzYvn07//zzD8WKFaN169bJkl1zdu7cyYkTJ/jzzz9Zvnw5q1evZtasWabnx4wZw/Lly1mwYAGHDx+mWrVqtGvXjpCQEAAuXbpE165deeaZZzhy5AhvvPEGY8aMSXaO48eP06ZNGzp37szRo0dZtWoVR44coV+/fhm+V2PHjuWjjz7i33//pX79+hkenygoKMj0en7//XcOHz7M+PHjARg1ahTdu3endevWhISEEBISQqNGjdJsa8KECYwdO5bDhw9TsGBBevXqxRtvvMHHH3/Mvn37iIqK4s033zQdv3nzZnr37s3w4cM5efIkCxYsYMWKFbz33ntpnuPYsWOEhoZSt27qf3rpfV601nTt2pVr167x119/sXXrVq5cuULXrl3RWmf6/QKYNGkSXbp04ejRo/To0YN+/fpx4cIFs8fu27cPMN4cCQkJYdWqVWaPi4iIoF27dri4uLBv3z5Wr17N7t27U/3ut2/fzrFjx9i0aRNbtmxJ1U6jRo04efIkACtXrszwd5boUT57SWmtWbdunSlBXrJkCeXLl6dr166pjh09ejQxMTGsXLnSVFayZEm8vLzYvn27RecVQggh8qM1h4NpPOUvSr+7gbof/cHTU//Cf/0p7kXF0aR8YTaNaMr4Dn4UcDAzcrBIZei2EAb8BR6lczx28XBydIi1UsoJ+AuIBl4DNPARsFUpVV1rHZ5O3ULALuA+MAiIAEYm1K2ntQ5Icqwv8DdwHngTuAb4AuWy+jX5vrvhoer1+nZvuo8zEjSlQ6aPtbGxYeHChQwYMID58+dTq1YtGjduTLdu3TJM5Nq0aWPqVX7jjTf48ssv2bJlCw0bNuSPP/7g9OnT/P7776ZhpDNnzqRx48Zptrds2TK01vzwww+m7WLmzZtHkSJF+PXXX+nevXuadQsUKMCcOXOwsbGhcuXKdOvWjS1btjBu3DjCw8OZM2cO3333HR06GN+buXPn8tdffzF79mw++ugj5syZQ8mSJfnyyy9RSlGpUiXOnDnDBx98YDrHZ599Ro8ePXjnnXdMZXPmzKFWrVpcv36dIkWKpBmfv78/bdq0Sff9NCcuLo6FCxfi5ma8STJw4EB++OEHwHhzw9HREXt7+0wNzx05ciTt2xv30XvnnXfo1KkTK1eupEWLFgAMHz482SiBjz/+mNGjR9O3b18AypYty9SpU3n55Zf57LPPzG7pc+HCBZRSZuNJ7/Py559/cvToUQIDA/H19QVg6dKllCtXji1bttC6devMvmW88sorvPzyywBMnjyZWbNmsXPnTkqVKpXq2MQh2oUKFUr3PVyyZAlhYWH89NNPuLq6AjB//nxatGjB2bNnKVfO+N+Hg4MDCxYswN7e3mw7dnZ2ps+Jh4dHpodVP8pnL6kDBw4QERFB06ZNAeMoj8qVK5s91sfHhwIFCnD69Olk5d7e3o/lwnVCCCFEVlpzOJhxq44TGRsPwM0w4wg7D2dbpjxfnWf8vJL/raQ17P4KilWHMs2NZRXa5nDU4lHldA/yAKAM0FVrvUZrvRboDJTCmPSmZwjgBXTUWi/XWq8HOmJMlCemOHYuEAy00Fr/orXerrVepLX+gCfUCy+8wJUrV1i/fj3PPvssu3fvpkGDBnzyySfp1qtevXqyx97e3ly/fh2Af//9F29v72RzLJ966imsrNL+WB08eJDz58/j6upq6tl2c3Pjzp07BAYGcvHiRVO5i4tLsvj8/PywsXlwTydpLIGBgcTGxiZLzq2trWnYsCGnTp0CICAggAYNGiT7j6xhw4ap4lu8eHGyGBLbDAxMfxi8uR7VzChVqpQpOU75uiyV9Pfl5eUFQLVq1ZKVhYeHm3rrDx48yMcff5zs9fbq1Yvw8HCuXr1q9hyRkZHY2tqa/T2n93kJCAjA29vblBwDlClTBm9vb9Pv6GFep42NDZ6eng/9niUKCAigevXqpuQYjL3BVlZWyeKrWrVqmsnxo3iUz15Sa9eupUOHDsn+rWS0d3HK5x0dHYmMjLQgeiGEECL/+Wzzv6bkOCkHG2vaVCma+vp6chX88QGs6AdRlk+REnlDTi/S1RnYo7U2TW7TWp9XSv0NdAE+T6duA+C/FHXDlVI7gY5KKRutdZxSqizQFnhVax2bPS/jAUt6chMlDqt+uX5JFu+9yNe9atGobOFsiC45BwcHnnnmGZ555hk+/PBD+vfvj7+/P6NGjTK70BCQaqEppZRpCxitdYZ/eKdkMBioWbMmy5YtS/Wch4cHBQoU4MiRI8nKMhtLYllKiWWZGcZrMBjo378/b7/9dqrnkt4IMMfZ2TnZYysrq1TnjI1N/ZFM73VZKmlbia/bXFli+waDgQkTJtCtW7dUbaW1OFbhwoWJiYkhIiICJyenNM+feL7MfF4s/Rxl5XuWKLPxpfw9Z5VH+ewltWbNGvz9/U2PK1SokOYNiODgYO7du0f58uWTld++ffuhFkcTQggh8ouImDiC75qfmhgSmsaURb+uUOVXqPIcOGT/QqYie+R0glwFWGum/CSQ+i/05OIBcysHRQOOQFngNJDYhRiplPoDaIqxl3k98LbW+paZNnJMYnKcmBQ3KFso2eOc5OfnR1xcHFFRUWkmyOmpXLkywcHBXLlyBW9vb8A4vDO9RKV27dr8/PPPFC5cmIIFC5o9JnEoqyXKlSuHnZ0du3btokwZ47L58fHx/PPPP/Tq1Qswvt6VK1cmS4T27NmTKr6TJ08+VAwpeXp6cu3atWTnS5r8Z5adnR3x8anvXmaF2rVr8++//1r0emvWrAnAqVOnLOo19/PzIzg4mKCgIFMv8rlz57hy5Qp+fn6WhG2RxM92Ru+hn58fCxYs4P79+6Ze5N27d2MwGNIcopyVsuKzFxgYyNmzZ2nXrp2prFevXvTs2ZM1a9akmoc8bdo07OzsePHFF01lUVFRBAYGUrt27YeOQwghhHic/XftPkOXHErzee+Cjg8eXNwDRauBnTNYWUO3H3IgQpGdcnqItQdwx0z5bcA9g7qngfIJc5EBUEpZAfWStA3gnfB9AXAGeBYYC3QANifUyTXHLocmS4YblS3M171qcexyaAY1H96tW7do2bIlixcv5tixY5w/f57//e9/TJs2jVatWj30Vj3PPPMMFStW5LXXXuPo0aPs2bOHkSNHYmNjk2ZPXO/evfHy8qJLly5s376d8+fPs2PHDt55550MV7JOj7OzM0OGDOHdd99l48aNBAQEMGTIEK5du2baQ3fw4MEEBQUxYsQITp8+zYoVK5g7d26ydsaOHcu+ffsYPHgwhw8f5uzZs/z6668MGpTRDIDUmjdvzu3bt/nkk08IDAzk+++/N62sbAlfX19OnDjB6dOnuXnzptle6If14YcfsnTpUj788ENOnDjBv//+y4oVK1ItXpaUp6cntWvXTrVCeEZat25NjRo16N27NwcPHuTAgQP07t2b2rVr07Jly0d9KWkqUqQIjo6ObN68mWvXriVblTqp3r174+zszKuvvsrx48fZsWMHgwYN4vnnn8+SGyYZyYrP3tq1a2nVqlWyldK7d+/Oiy++SJ8+fZg7dy7nz5/n1KlTvPvuu3z99dfMnDkz2Wrce/bswd7ePt21BIQQQoj8auXBy3T++m/+ux5GEVd77G2Spw6OttaMblvR+ODIz/BDe1g73Dj/WOQLuZEsmvv0ZGZ85VyM8f6olCqrlCoGfAkkLgmX2G2Z+Jq2aa2Haa3/0lrPB4YCdTAOv04dgFIDlVIHMvsiHtbgZmVT9RQ3KluYwc3KZts5XVxcaNCgAbNmzaJZs2ZUqVKF9957j169erF8+fKHbtfKyorVq1cTHR1NvXr1eO211xg/fjxKKRwcHMzWcXJyYseOHZQpU4Zu3bpRqVIlXnvtNe7cuWPaGudhTZ06le7du9O3b19q1qxpWmm4WLFigHF13lWrVrFp0yZq1KjBzJkzmTJlSrI2qlevzo4dOwgKCqJZs2bUqFGDcePGmebzWqJy5crMmTOH+fPnU716df744490V4dOy4ABA6hcuTJ169bF09OTv//+2+I20tK2bVs2bNjA1q1bqVevHvXq1WPKlCmULJn+wvIDBw5kyZIlFp1LKcWaNWvw9PSkefPmtGjRgqJFi7JmzRqLh1hbwsbGhi+//JLvvvsOb29v0+rOKTk5ObF582bu3btHvXr16NKlCw0bNmTBggXZFltSWfHZW7NmTarXl7j918SJE5kzZw5+fn7Ur1+fvXv38uuvv5puICX6+eef6d27d6rh80KkRSlVXCn1lVLqH6VUhFJKJyyWmfSYVkqpxUqpQKVUZML3OUqpzK0+J4QQ2SwqNp6xK47xzv+OEhkbz/O1fNg2ujlTX6iOT0FHFOBT0JFPn69G11oJU598aoOtE7iXkgQ5H1GWbq/ySCdT6hqwRms9KEX5N0A3rXW6k96UUi8AszEu1gVwCOOq2KOAUlrri0qpQRiT6Te11l8lqeuOsad6vNY6zZWplFIa0p6vGhAQkCPDLR9XR48epWbNmhw4cIA6derkdjgim0RHR1OpUiV+/PFHmjRpktvhCODmzZsUK1aMS5cuZXrl7JRu3LhBpUqVOHDggGn/aHPk/0HLJFkHIfvuBOUipVRzYDlwELAG2gCltdZBSY75H+AC/AKcA8pjXGAzGqiutQ7L4BzpXpuFEOJRBN4IY9iSQ/x79T72NlZM6lKF7nVLmL+BHxMBdkluIt+/Bq6Wd6SI3JXetTmn5yCfxDgPOSU/IMNlbLXWK5VSa4AKQIzWOlApNQe4pLW+mOQcYL6nGh70NIsssHr1apydnSlfvjxBQUGMHDmSGjVqyPzFfM7e3p5FixZx+/bt3A5FJLh9+zaff/75QyfHAOfPn+ebb75JNzkWwowdWmsvAKVUf4wJckpDtdY3kjzerpQ6A2wHumOcFiWEEDlu7ZFg3lt1nPCYeEoXduab3rWpXCyN6YdBf8OKvtDlGyifsD2lJMf5Tk4nyOuA6UqpMlrrc2Das7gx8G5mGtBaxwMBCXW9gR7AZ0kO2QNcBdoBXycpT1y1Zv8jxC9SuH//PmPHjuXSpUu4u7vTvHlzZs6cma1DZkXekLjPrsgbKlSoQIUKFR6pjcRh9kJYQmud4Y3nFMlxosTrceaXaRdCiCwSFRvP5F9PsWSvsY+tUw1vPn2+Gi726aRHF/6GsGtw+McHCbLId3I6Qf4WGA6sVUq9j7GXdzJwCZiXeJBSqhQQCEzSWk9KKLMFpmG823wPY0/0OIw9xjMS6yZs9fQusFApNRdYBZQDPga2YRySLbLIq6++yquvvprbYQghhHj8NEv4HpCrUQghnjgXboUzdMkhTl65h521FR908uPl+iUz7uBpMgoKeEP1njkTqMgVOZogJ+xb3BKYCfyEcXGuLcCIFPOPFMZ5TEkXEdMY5yz1AgoClzEOyfpEa51s+yet9SKllAHj6tV9Mc49XgyM0zKBSQghhMhVSilX4AuMyfGaXA1GCPFE+e14CGNWHON+dBwlPZz4pndtqvq4mT/43hXYMgnafwb2rmBlBbVeztmARY7L6R5kEuYKv5DBMUGkWNlaax0HdLTgPD9hTMKFEEIIkUcopWyAnzEOrW6ccH1P69iBwMCcik0IkX/FxBn4ZGMAC3cHAdCuSlGmdatOAQfbtCutHgzntxtXqu74ec4EKnJdjifIQgghhHgyKaWsgEVAa6CD1vpYescnbNM4P3EVayGEeBiXbkcwfOkhjl4OxdZa8V77yvRp5JvxkOqOM+GPD6GF5dt0iseXJMhCCCGEyClzMS6u+aLWektuByOEyP/+OHWNd345wr2oOHwKOjK7d21qliho/uC4GDi3FSq0NT4uVBZ6LsmxWEXeIAmyEEIIIbKdUmoG0B94TWu9JpfDEULkc7HxBqZt+pdvd54HoHXlIkzvVoOCTnbmKxji4ccucHE39PwZKrXPwWhFXiIJshBCCCEeiVLqxYQf6yR8f1YpdQO4obXerpQaC4zEuLjmf0qpBkmq39BaB+ZguEKIfO7K3UiGLz3EoYt3sbZSvNuuEv2blE5/SLWVNZR/Bu5ekL2Nn3BKFnVOLnGeU1rvS0BAAJUrV87RmIQQIi+R/wctk/gHmdY6324Qn84c4e1a6+ZKqW082NYppUVa6z6ZaV/+ZhFCZGTr6euMXH6EOxGxFHNz4OtetahTyiPtClH3wKGA8WetIfIOOKVzvMgX0rs2W6U6Wog87sCBAyilCAoKyu1QslSfPn3o2DHTC7Vnue3bt1OhQgXi4+Oz9Tz+/v5UrVrVojq5/d4AXL16lTZt2uDs7Gz6T9XX15fp06ebjkn5OLdFR0dTsmRJDhw4kNuhiHxOa63S+Gqe8HzzdI7pk7vRCyHyg7h4A1M3/UvfH/ZzJyKW5hU92fBmk7ST4/hY2DAKvm0BkXeNZUpJciwkQX5SfPrppzz11FMUKFAAT09POnXqxIkTJyxuR2tNu3btUEqxYsWKbIg0/9u2bRtKKW7evJmsfNasWSxevDiXooLRo0czfvx4rK2ts/U8o0aNYvv27RbVSfneNG/enOHDh2d1aOmaPn06V65c4ciRI4SEhACwf/9+hg4dmqXnSeu1DR48mLffftv0eO/evXTu3BkPDw/s7e2pVKkSEydOJCoqynSMvb09o0ePZuzYsVkaoxBCCJGXXLsXRa/v9jJnWyBWCka3rciC157CwzmN+cYA8TFw8R+4exGC5UayeEAS5Fyw5PgSfL/wxWqiFb5f+LLkePavjrdt2zaGDh3K7t27+euvv7CxsaF169bcvn3bonZmzJiR7QlUXhQTE5Pt53Bzc6NgwYLZfh5zdu/ezb///ku3bt2y/VwuLi4UKlTIojo5+d7ExsaaLT979ix16tShfPnyFC1aFABPT0+cnJyyPSatNevXr6dLly4ArFu3jiZNmlCoUCH+/PNPzpw5w4QJE5g/fz5t2rRJ9nnt3bs3u3bt4uTJk9kepxBCCJHTdv53g/azdrLv/G2KuNrz84AGDGtRDiurDGa12DkbV6juswHKtc6ZYMVjQRLkHLbk+BIGrh/IhdALaDQXQi8wcP3AbE+SN2/eTN++falatSrVqlXjp59+4saNG/z999+ZbuPAgQPMmjWLH374IVPHJw6LnTVrFj4+Pri7u9O3b18iIiJMx0RHRzNixAi8vLxwcHCgQYMG7Nq1K1k7mzZtolKlSjg4ONCkSRPOnDmT6ly7d++mWbNmODk54ePjw5AhQ7h3757p+R07dtCgQQNcXFxwc3Ojfv366fag+/r64u/vT79+/ShYsCC9e/cmKCgIpVSq4apJe9MTj1m5ciXPPPMMTk5O+Pn58ccff5ieb9GiBWBMrpRS9OnTJ9n7lah58+YMGTKEd955Bw8PDzw9PZk1axbR0dEMGzaMggULUrJkSX766adk8QQHB9OzZ0/c3d1xd3enQ4cO/Pfff2m+VoClS5fSunXrZMle4lDoZcuWUbZsWVxdXenatWuynm+DwcDkyZMpUaIE9vb2VKtWjbVr16Z7rpRDrDPzOUn63vTp04ft27cze/ZslFLpDrfP6POV2Ju/ceNG6tWrh52dHZs3b07Vjq+vL2vXruXHH39M9jvLaEh1aGgoAwcOpEiRIri6utKsWbOHGu68f/9+oqKiePrpp4mIiOD111+nffv2/PDDD9SuXZtSpUrx0ksvsX79enbt2sWsWbNMdT08PGjcuDE///yzxecVQggh8qp4g+bzP87w6oJ93AqP4elyhdn4VhPql0nnJvzR5bBt6oPH7r5Qol62xyoeL7KK9SNSEx99zZWI2AheXvUyL696OdN19IRHW6jk/v37GAwG3N3dM338Sy+9xLx58yhSpEimz7Nz506KFSvGn3/+yaVLl+jevTsVKlRg3LhxAIwZM4ZffvmFBQsWUKZMGT7//HPatWvHf//9R7Fixbh06RJdu3ZlwIABDBs2jGPHjjFy5Mhk5zh+/Dht2rRh4sSJfPfdd9y+fZsRI0bQr18/VqxYQVxcHF26dOH1119nyZIlxMbGcujQoQx7wj///HPef/99Dhw4YPHCMOPHj+ezzz7jm2++4aOPPqJnz55cuHCBEiVKsHLlSl544QVOnjyJh4cHjo6OabazZMkSRo4cyd69e1m3bh0jRoxg06ZNtGvXjgMHDrBo0SL69+9Pq1at8Pb2JiIighYtWtCoUSO2b9+OnZ0d06dPp3Xr1gQEBKTZ27lz50569OiRqjwoKIjly5ezevVqwsPD6dmzJ+PHj2fevHmAcejzZ599xty5c6lbty6LFy/m+eef5+DBg9SsWTPT71dGn5OkZs2axZkzZ6hUqRKffPIJYLzZYE5Gn69EY8eOZcaMGZQrVw5XV9dU7ezfv59evXrh4eHBrFmz0v2dJdJa06FDB9zc3Pj111/x8PBg0aJFtGzZktOnTyc7f0bWrFlDhw4dsLGxYf369dy8eZMxY8akOq527dq0atWKpUuXMnr0aFN5vXr1LB7WLoQQQuRV1+9HMWLZEXYH3kIpeLt1BYa3LId1er3GtwJhzRDQ8VChDXjXyrmAxWNFepCfUG+99RY1a9akYcOGmTp+8ODBtGvXjvbtLdsTrkCBAsyZM4fKlSvTpk0bunXrxpYtWwAIDw9nzpw5TJ06lQ4dOlC5cmXmzp2Ll5cXs2fPBmDOnDmULFmSL7/8kkqVKtG9e3cGDx6c7ByfffYZPXr04J133qF8+fLUr1+fOXPmsHLlSq5fv869e/e4e/cunTp1omzZslSqVIlevXpluApvs2bNGDNmDOXKlaN8+fIWve63336bTp06Ub58eT755BNu377NkSNHsLa2xsPDuPhDkSJFKFq0KG5ubmm2U6VKFfz9/SlfvjwjR46kcOHC2Nra8tZbb1GuXDk+/PBDtNbs3r0bgGXLlqG15ocffqB69epUqlSJefPmERYWxq+//prmeS5cuGA2YYuLi2PhwoVUr16dhg0bMnDgQNPvD4zzckeNGkWvXr2oUKECkyZNokmTJhYvVJXe5yQlNzc37OzscHJyomjRohQtWtTszY7MfL4S+fv706ZNG8qUKWM22fb09MTe3h5HR8cMf2eJtm7dypEjR1ixYgX16tWjXLlyTJ48mTJlyqTq9c/I2rVr6dq1K4BpBEVan18/Pz9Onz6drMzb2zvfLWonhBDiybQ78CYdvtzF7sBbFHaxY/Hr9Xmrdfn0k2OAQmWh3afQcaYkxyJd0oP8iCztyfX9wpcLoRdSlZdyK0XQiKAsiip9I0eOZNeuXezatcuUWHzyySem3rikTp06xfbt2zl69OhDDQ318/PDxubBx8zb25u9e/cCEBgYSGxsLI0bNzY9b21tTcOGDTl16hRg3E6mQYMGyfatS5nUHzx4kLNnz7J8+XJTWWKPb2BgIA0bNqRPnz60bduWVq1a0apVK7p160aJEiXSjb1u3boWv95E1atXN/3s7e0NwPXr1x+pHaUURYoUoVq1aqYyW1tb3N3dTW0fPHiQ8+fPp+oFjYiIIDAw7W1GIyMjcXBwSFVeqlSpZMmgt7e36Vz37t3jypUryX5/AE8//TQbN2604FWm/zl5WJn5fCV6lN91Wg4ePEhERESqhDsqKird30VKZ8+e5dy5c7Rt2zZTx2utU+3z6OjoSGRkZKbPKYQQQuQ1BoNm9tazzPzzDAYNDcp48GXPWhQpkPrvF5OQY8b9jb2qGB/XH5QzwYrHmiTIOezjVh8zcP1AImIfzK90snXi41Yf58j53377bZYtW8bWrVspU6aMqXzw4MF079491fHe3t5s2bKFU6dO4eLikuy5Hj160LBhw1RzhpOytbVN9lgphcFgAB4kseY2bU+yN1mGr8lgMNC/f/9kK/wm8vHxAeCHH34wDU9et24d48ePZ82aNekmHc7OzskeW1lZpYoprQWdkr7uxNeS+LotYe79S+89NRgM1KxZk2XLlqVqK7Hn2pzChQtz586dTJ0/5etI7/eXWZk5j6Uy8/lKlPJ3nRUMBgNeXl7s3Lkz1XMFChTIdDtr1qyhVatWphgrVKgAGG9epbw5AcabSilHPNy+fTvNYehCCCFEXncrLJoRy4+w87+bKAVvtCzHW63KY2OdzmDYi3vhxy7gUgQGbpPtm0SmSYKcw3pX6w3A+C3juRh6kZJuJfm41cem8uz01ltvsWzZMrZt20alSpWSPefh4ZFmAvXxxx8zatSoZGXVqlVj+vTpplV1H0a5cuWws7Nj165dpmQ9Pj6ef/75h169egHGnsWVK1cm6xXbs2dPsnZq167NyZMnKVeuXLrnq1GjBjVq1GDs2LE8++yzLFq0KNO9cvBgnmviFj8AR44cyXT9RHZ2xi0HsmO/4dq1a/Pzzz9TuHBhi1Z9rlWrVqpe1YwUKFAAb29vdu3aRcuWLU3lu3btws/Pz6K2LGVnZ5fh+5eZz1d2ql27NteuXcPKyirZzShLrV27ltdee830uE2bNhQqVIjPPvssVYJ86NAhtmzZwtSpU5OVnzhxgtq1az90DEIIIURu2R90mzeWHubqvSg8nO2Y2aMmzSpk4qZvsergWdHYe2yb/TtOiPxDEuRc0Lta7xxJiJMaNmwYP/30E2vWrMHd3Z2rV68Cxi13UvYMp+Tj42PqiU2qRIkSj/SHv7OzM0OGDOHdd9+lcOHClC5dmpkzZ3Lt2jXT3rKDBw9mxowZjBgxgqFDh3L8+HHmzp2brJ2xY8fSoEEDBg8ezKBBg3B1deXff/9l/fr1zJs3j/PnzzNv3jw6d+6Mj48P586d49ixYwwZMsSieB0dHWnQoAFTp06lbNmyhIaGml1EKiOlSpVCKcWGDRvo1KkTjo6OGf4OMqt3796mGxeTJk2iZMmSXLp0ibVr1zJ48OA051K3bduW77//3uLzjR49mg8//JDy5ctTp04dFi9ezM6dOzl48OCjvpR0+fr6sm/fPoKCgnBxccHDw8PUw58oM5+v7NS6dWsaN25Mly5dmDZtGpUqVeLq1ats2rSJ1q1b06RJkwzbuHHjBnv27Em257izszPffvst3bt3p1+/frzxxhsUKlSI3bt3M2rUKJ5++mneeuutZO3s3LmTyZMnZ/lrFEIIIbKLwaCZv/Mcn20+TbxB85SvO1++VItibukslBl5F+xcwNoGbB2hz6/GxxaObBNPNlmk6wnxzTffcP/+fVq1akWxYsVMX5YuppTVpk6dSvfu3enbty81a9bk2LFjbNq0ybRgVMmSJVm1ahWbNm2iRo0azJw5kylTpiRro3r16uzYsYOgoCCaNWtGjRo1GDduHF5eXgA4OTlx5swZunXrRoUKFXjttdfo3bs3Y8eOtTjeBQsWAPDUU08xaNAgPvroI4vb8PHxYeLEiYwfPx4vLy+GDx9ucRtpcXJyYseOHZQpU4Zu3bpRqVIlXnvtNe7cuZPuiuUvv/wyZ86csXiv3DfffJPRo0czZswYqlatyurVq1m5cqVFK1g/jFGjRmFnZ4efnx+enp5cvHjR7HEZfb6yU+L2US1btmTAgAFUrFiR7t27c/r0adO89IysX7+ep556yvRZTvTcc8+xY8cOrl+/TsuWLSlfvjwTJkygf//+/P7776ZRCgD//PMPoaGhvPjii1n6+oQQQojscic8hv4/HmDKb/8Sb9AMalaGpQMapJ8cXzsJ85vBFv8HZfaukhwLiylLt6/J75RSGtKe+xoQEJDh6sdCPI7effddbty48VA9ySJ7dOnShcaNG5vd0imzunXrRq1atXjvvfeyLC75f9AySdZUkL/SHlJG12YhRP5x6OId3lh6mOC7kbg52vJ59xq0quyVccULu2FRJ/CqCv02GXuQhUhDetdm6UEWQgDw3nvvUaZMmWyZGy0eTuPGjXnppZceun50dDQ1atQwu4CdEEIIkZdorflu5zm6z/2H4LuR1CxRkA1vPp255BigVCPovUKSY/HIpAc5BelBFkKI9Mn/g5aRHuRHJz3IQuRvoZGxjFlxlM0nrwHQr3Fp3n22EnY26fTlRd6FdW9Ak3fAu2aOxCnyj/SuzbJIlxBCCCGEECJXHLt8l2FLD3HpdiSuDjZ89mIN2lUtmnHFf76GgHVwJwgG7ZC5xiLLSIIshBBCCCGEyFFaa37ac4GPfg0gJt5ANR83ZveqTclCmdySqeloCLtm7EGW5FhkIUmQhRBCCCGEEDnmflQs7648zobjIQC82rAU4ztUxt7GOu1KBgMcWQI1eoK1LdjYQ+evcihi8SSRBFkIIYQQQgiRI05eCWXYkkME3YrAxd6GKS9Uo2P1TGx/uOFtOLgQrp2AZ6dme5ziySUJshBCCCGEECJbaa35ed8l/NefJCbOQOViBfimd21KF3bOXAM1X4bTv0H5Z7I3UPHEy/FtnpRSJZRSK5RSoUqpe0qpVUqpkpmsWzqh7l2lVLhSaqtSqm4GdV5SSmml1OWseQVCCCGEEEKIzAqPjmPE8iO8t/o4MXEGXqpXktVDG2WcHN+/+uDnEk/BW0ehXOvsDVY88XI0QVZKOQF/AZWA14BXgPLAVqVUuv9ClFKFgF1AVWAQ0DPhqa1KKbP7jSilCgIzgavmnhdCCCGEEEJkn9NX79P5612sPXIFJztrvuhRk0+fr4aDbTrzjbWGHZ/BrBpw+cCDctnfWOSAnO5BHgCUAbpqrddordcCnYFSGJPe9AwBvICOWuvlWuv1QEcgApiYRp1pwFFgc1YEn98NHz6c5s2bZ2mbCxcuxMXFJUvbzArNmzdn+PDhuXb+hQsX0rJly1w7f17w4osv8vnnn+d2GEIIIYTIJr8cuESX2bsIvBFOBS8X1g1/mq61fDKuqBTcvwZx0RB8KPsDFSKJnE6QOwN7tNZnEwu01ueBv4EuGdRtAPyXom44sBPoqJRKNp9aKdUYeBkYlkWxP9b69OlDx44dczuMHJdWgr5q1So+/fTTXIgIYmJieP/995kwYUKunN+cbdu2oZTi5s2bOdb2hAkT+OijjwgNDc3ycwohhBAi90TGxDPqf0cZs+IYUbEGutUpztphT1OuiAWdJu0+hb4bof7A7AtUCDNyOkGuApwwU34S8MugbjwQY6Y8GnAEyiYWKKVsgfnAZ0kTavF4iIkx92vOWh4eHri6umb7ecxZsWIFDg4ONGvWLFfOn1dUq1aNMmXKsHjx4twORQghhBBZ5Oz1+3SZvYsVBy/jYGvFZy9W57NuNXC0S2dINcB/f8KS7sZeYzBu5VSqUfYHLEQKOZ0gewB3zJTfBtwzqHsaKJ8wFxkApZQVUC9J24nGAvZAprsIlVIDlVIHMj4yf4iPj2fUqFG4u7vj7u7OiBEjiI+PT3aM1ppp06ZRtmxZHB0dqVatWqpk5t1336VixYo4Ojri6+vLmDFjiIqKsigWpRSzZ8/m+eefx9nZmffee89sr2NQUBBKKQ4cMP6aEo/ZsmUL9evXx8nJibp163Lo0CHT83379iU8PBylFEop/P39gdRDrH19fZk0aRJ9+vTB1dWVEiVKsHz5cu7evUvPnj1xcXGhfPny/P7778liP3XqFB06dMDV1ZUiRYrw0ksvcfVq+lPely5dSufOnVOVL1q0iGrVqmFvb4+Xlxd9+vQxPXfx4kWee+45XF1dcXV15fnnn+fy5Qfrzvn7+1O1alWWLVtG2bJlcXV1pWvXrsnev+PHj9OqVSsKFCiAq6srNWrUYOvWrQQFBdGiRQsAPD09UUqZzr1p0yaaNGmCu7s7Hh4etG3bloCAgFS/k5UrV/LMM8/g5OSEn58ff/zxh+n5tNoG6Ny5Mz///HO675cQQgghHg+rD1+m89d/c+ZaGGU9nVk77Gm61S2RccW4aOM2Tv9thsM/ZX+gQqQjx1exBrSZMpWJenMxxvujUqqsUqoY8CVQOuF5A4BSqhwwHhiutc50pqa1nq+1TndF7DQtVcavpLZ1MpZdXv+g7Ox8Y9neJENFIq4Yy1an2P/ttzrG8tsHH5Qd8099noc0Y8YMvv32W+bNm8c///xDfHw8S5YsSXbM+++/z/fff8/s2bM5deoU48aNY9CgQWzYsMF0jLOzMwsWLCAgIIBvvvmGZcuW8fHHH1scz8SJE2nfvj3Hjx9n2DDLRsWPGzeOKVOmcOjQIQoVKkTv3r3RWtOoUSO++OILnJycCAkJISQkhFGjRqXZzhdffEG9evU4dOgQ3bt357XXXqNXr160b9+eI0eO0LRpU15++WXTDYCQkBCaNm1K1apV2bdvH3/++SdhYWF07twZg8GQ5nl27dpF3brJP2rz5s1j0KBB9O3bl2PHjrFx40aqVKkCGG9UdO3alWvXrvHXX3+xdetWrly5QteuXdH6wT+noKAgli9fzurVq/n99985fPgw48ePNz3fq1cvihUrxr59+zh8+DD+/v44ODhQokQJVq5cCcDJkycJCQlh1qxZAISHhzNixAj27dvHtm3bcHNzo1OnTql6+cePH8+bb77J0aNHeeqpp+jZsydhYWHptg1Qr1499u3bR2RkZNq/YCGEEELkaVGx8YxbdYy3lx8lIiaerjW9WTf8aSoWzeRoPRt76P4jtBgPdfplb7BCZERrnWNfwDVgnpnyb4Abmaj/AsYVqXXC10Hgs4SfSyYcsxHYABRM8rUUCE742TGDc2jj22LeqVOnUhcuwfiV1NaOxrJL6x6U/TfPWLZnwIOy8GBj2apiyetvrG0sv3XgQdnRCanPk0mvvfaa7tChg+lxsWLF9EcffWR6HB8fr8uXL6+bNWumtdY6LCxMOzg46B07diRr56233tLPPvtsmueZM2eOLlu2rOnxDz/8oJ2dndONDdDDhw9PVrZ161YN6Bs3bpjKzp8/rwG9f//+ZMds2rTJdMyuXbs0oC9dupTu+Zs1a6aHDRtmelyqVCnds2dP0+P79+9rQL/xxhtpnv+DDz7QLVu2TNbu7du3NaD37t1r9rXeuXNHA/qvv/5KVu7j46PHjh1rts7vv/+urays9Pnz501lgYGBWiml//jjD6211hMmTND29vb67t27pmM++uijZL8LV1dXvXDhQrPnMPd+mxMWFqatrKz0zp07tdYP3pO5c+eajrl8+bIGTMek1/bRo0c1oM+ePZvueUXeYvb/QZGmJNeVHL3m5qevjK7NQojcc+5GmG73xQ5dauyvuvz4jXrp3gvaYDBkXPH2ea1PrMr2+IQwJ71rc7KFrXLASYzzkFPyA05lVFlrvVIptQaoAMRorQOVUnOAS1rri0naKoX5odx3gFnACMtDT0cvM53izdenLis30PiVlJO3+frPHkxdVt3f+PWIQkNDCQkJoWHDhqYyKysr6tevz6VLlwDj0OGoqCjatWuHUg96rWNjY/H19TU9XrFiBV988QVnz54lLCyM+Pj4VEO1MyNlj6olqlevbvrZ29vYE3/9+nWKFy/+0O24uLjg5OREtWrVTGVeXl6mtgEOHjzIjh07zC4CFhgYSL169VKVJ/aUOjg4mMquX79OcHAwrVq1MhtXQEAA3t7eyd73MmXK4O3tzalTp2jd2rgfYKlSpXBzczMd4+3tbYoVYOTIkfTv359FixbRqlUrXnjhBSpVqpT2G5LwOj744AP27t3LjRs3MBgMGAwGLl68mOy4tH4HGXF0NG7XID3IQgghxOPn12NXeHflccKi4/At5MTs3rWp4u2WccWwGzC/BUTfgwI+UCL130xC5BaLEmSl1N8Yhzr/orWOfojzrQOmK6XKaK3PJbTpCzQG3s1MA1rreCAgoa430ANjL3KinoBDimrvAnWAbsBlRIYShwivX7+ekiVLJnvO1tYWgD179tCzZ08mTJjAzJkzKViwIOvWrUt3GHNanJ2Tb4NtZWUc/W+8wWMUGxtrtm5iPIApmU9viHNakraT2FZ6bRsMBjp06MD06dNTtZWYTKdUqFAhlFLcufPg/k3S12iO1jrZTYqUMaYXf9L3wd/fn969e/Pbb7+xefNmJk6cyNy5c+nXL+2hTJ06dcLHx4d58+bh4+ODjY0Nfn5+qYZYP+zv4Pbt24BxfrIQ4vGklCqOce2PukANjAtnltZaB6U4zh3j9bprwjH/AG9rrY/nZLxCiEcXHRfPxxsC+PGfCwB0qF6MKc9Xw9XBNoOaCVw8oWYvuPkfFK6QjZEKYTlLe5BjgUXAF0qpRcB8rfW/FtT/FhgOrFVKvY+xa3sycAmYl3iQUqoUEAhM0lpPSiizxbiv8XbgHsae6HEYe6VnJNbVWu9JeVKlVB8gWmu9zYJY8y03NzeKFSvGnj17THvxaq3Zt28fxYoVA8DPzw97e3suXLiQ5n69f//9Nz4+PnzwwQemsgsXLmRJjIkJU0hIiOnnI0eOWNyOnZ3dQ/VoZ0bt2rX55ZdfKFWqVKrkNL14/Pz8OHXqFO3btweMybSPjw9btmzhmWeeSVXHz8+P4OBggoKCTL3I586d48qVK/j5ZbT4e3Lly5enfPnyvPnmmwwZMoTvvvuOfv36YWdnB5Dsvbp16xYBAQHMnj3btNDWoUOHiIuLs+ic5tpOdOLECby9vdO8oSCEeCyUA7pjnPa0E2iT8gBlvHO2DuO6IW9gHNE1DtiqlKqptZab10I8Ji7eimDY0kMcDw7FztqKDzpW5uUGpdK8mW8SEwHR98E14ZrfeiIoK7DKjSWRhEibRZ9IrXVzoDLGJPlV4KRSaptSqkdCAptR/XCgJXAG+AlYApwHWmqtw5IcqgDrFPFpoDzGRPo3jMOkFwBttdbZvy9QPvPWW28xbdo0VqxYwenTpxkxYgQhISGm511dXRk1ahSjRo1iwYIFnD17liNHjjB37lzmz58PQIUKFQgODmbJkiWcO3eOOXPmZNmKxOXKlaNEiRL4+/tz5swZfv/9dz766COL2/H19SUqKoo//viDmzdvEhERkSXxAQwbNozQ0FB69OjB3r17OXfuHH/++ScDBw7k/v37adZr27Ytu3btSlY2fvx4vvjiC2bOnMmZM2c4cuQIM2YY7/u0bt2aGjVq0Lt3bw4ePMiBAwfo3bs3tWvXTvPmRUqRkZEMGzaMbdu2ERQUxN69e9m1a5cpwS5Vynhh27BhAzdu3CAsLAx3d3cKFy7Mt99+y9mzZ9m+fTuDBw/Gxsay+2rm2k60c+dO2rVrZ1F7Qog8Z4fW2ktr3R74XxrHdAaeBl7RWv+std6UUGYFjMmhOIUQj2jTiat0+Gonx4NDKeHhyIohDXmloW/GyXFoMCxoCz/3gNiEaVXWNpIcizzJ4k+l1vq01nok4AP0wZjILgUuK6WmKKXKZFD/otb6Ba11Aa21q9a6a8phWFrrIK210lr7JymL01p3TLgI22uty2qt39daZ5jxaK37aK0tm5Caz73zzjv07duX/v37U79+fQwGA7179052zOTJk/H392f69OlUqVKFZ555hpUrV1K6tHHh8E6dOjF69GhGjBhB9erV+eOPP5g0aVKWxGdra8uyZcs4d+4cNWrUYMKECXzyyScWt9OoUSMGDx7MSy+9hKenJ9OmTcuS+MA41/bvv//GysqKdu3aUaVKFYYNG4a9vT329vZp1hswYACbNm0yDS8GGDJkCLNnz+bbb7+latWqtGvXjpMnTwLGIctr1qzB09OT5s2b06JFC4oWLcqaNWsyviAlsLa25s6dO7z22mtUrFiR5557joYNG/L5558D4OPjw8SJExk/fjxeXl4MHz4cKysrli9fzrFjx6hatSrDhg1j8uTJ6b42c8y1DRAVFcXq1asZMGCARe0JIbKOUqq8UmqRUuqMUio84fvChB0hMkVrnZk5LZ2BK1rrrUnqhQLrgS6WRy6EyEkxcQYmrT/F4MUHuR8VRxs/L359ownVixfMXAO2jhAVCpF3IOxatsYqxKNSGc1/zLABpWoDnwNNE4oMwGrgDa11+hvC5kFKKeNymWm8LwEBAVSuXDlHYxL5T8+ePalSpUqy4elPmtmzZ7N27dpUe0uLvE/+H7RM4o0srXXW7NOXRZRSzTHu/BCJcfeHa4AX0AFwAtpprbdb2GZ/jNOpks1BVkrtAUK11m1THD8GmAq4phhJlrLddK/NQojsc/lOBMOXHubIpbvYWCnGta9Mv8aZ6DVO/PeaeNzN/8CpEDh5ZG/AQmRCetfmhxrXoJRyVEr1U0rtA/YDnsBbgDcwBGiEcfi0EMKMadOmUaBAgdwOI1fZ2try1Vdf5XYYQjzJZgCHgVJa61e11qO11q8CvsARkqzvkQU8ML+7ROJQGndzlZRSA5VSB7IwDiGEBbYEXKPDl7s4cukuPgUd+WVwQ15/unTGyXFsFKwZCnvmPCgrXF6SY/FYsHQV62rAIKA34AysBcYmHTIFfKuUukra85CEeOKVLFmSt956K7fDyFUDBw7M+CAhRHbyA3qk7LnVWt9XSk0FsmZRCSOFcS0Rc+Vp0lrPB+Yn9iALIXJGbLyB6ZtPM2/HOQBaVSrCjO41KOhkl7kGgnbB0aXwbwGo0VMSY/FYsXQV66PAFeALjCtYh6Rx3FmM2zcIIYQQIm+6DKT1164dEJyF57qNsRc5pcSeY3O9y0KIXBASGskbSw9z4MIdrK0Uo9tWZGCTMlhZWTBLpHxraPMxlGkmybF47FiaIHcD1iTsRZwmrXUA0OKho8rj0tuXVggh8jOZA5qvTAUmKqX+0VqbkmGllA8wAbB8ZcS0ncTM9k8Ye7Evpjf/WAiRc7advs7IX45yOzyGogUc+KpXLZ7yzUSCqzUcWgRlmoO7r7Gs0fDsDFWIbGNpgrwOcADCUz6hlHIGYrTWsVkRWF5la2tLZGQkTk5OuR2KEELkuMjIyEzv+y3yvGaAKxCYsIhW4iJdDRJ+bp6wkBeA1lq/9gjnWgf0VUo1S1z4SylVAOiEcScMIUQuios38MWf//H11rMANK3gyczuNSjkksmdK/Z/BxtHgVc1GLgVrOU6IR5fFq1irZRaBNhqrXuZeW4xxgS5XxbGl+MyWinz3r17XLt2DR8fHxwdHaUnWQjxRNBaExkZSXBwMF5eXk/8InOWyMOrWJ+34HCttU5zG0el1IsJP7YCBgNDgRvADa31dqWUFbALKAGMxjikehxQHaihtb6UQayyirUQ2eT6vSje+Pkwe8/fxkrByGcqMLR5OcuGVEfehYUdoNGbUKNHtsUqRFZJ79psaYJ8ERittV5u5rnuwGda61IPH2ruy8xF+N69e1y/fp3Y2HzdWS6EEMnY2tpSpEgRSY4tlFcT5KyUziJa27XWzROO8QCmA10xjkb7BxiptT6a2fYlQRYia/199iZvLTvMzbAYPF3t+bJnLRqWLZS5yjfOGFemTuwsMsSDlXX2BStEFsrKBDkKeDbFqtWJz7UAftNaOzx8qLlPLsJCCCGy0pOQIGc3uTYLkbXiDZqv/vqPWVv+Q2toVLYQs3rWwtM1k0OqjyyFdW9Cy/fh6RHZGqsQ2SG9a7Olc5CvA9WAVAlyQvktS4MTQgghRM5TSpXM6Bit9cWciEUIkXNu3I/m7eVH2HX2JkrBW63K82ar8lhbMqTawQ0MsRB2LfsCFSKXWNqD/A3Glaxbaa2PJSmvBvwJrNZaD87yKHOQ3KUWQgiRlfJqD7JSyoD5vYlNtNZ5YrykXJuFyBp7zt3izZ8Pc/1+NIWc7fiiZ02alPfMXGWDAaysHjy+ehyKVsueQIXIZlk5xLowxjlDvsB+jHso+gD1gPNAI631zUeOOBfJRVgIIURWysMJch9SJ8iFgA5AGWCy1npBTsdljlybhXg0BoNmzvZAZvx+GoOGeqU9+OqlWngVyOTMyOCDsHY49FgMhcpmb7BC5IAsS5ATGisIjASewXghvQn8DszUWoc+Yqy5Ti7CQgghslJeTZDTo5T6CbigtX4/t2MBuTYL8Shuh8cw8pcjbDt9A4Chzcsy8pkK2FhbZVAzif/1hZOroNbL0GV2NkUqRM7J0gQ5v5OLsBBCiKz0mCbIbYEftNbeuR0LyLVZiId18MJthi89TEhoFO5OtnzeoyYtKhaxvKGoe7BnDjz9NtjYZX2gQuSw9K7NFtw6EkIIIcQTogjGrZiEEI8hrTXzdwTSY94eQkKjqFPKnQ1vNsl8chx+E7ZNNc47BnAoAM3HSnIsngiWrmKNUuo14CWgJKkvnlprLRMThBBCiDxOKdXUTLEdUBUYB+zM2YiEEFkhNCKWd/53lD8DjCtMD2xahtFtK2Kb2SHVBgP82AWunQBbR2j8ZjZGK0TeY1GCrJT6AJgInACOANHZEJMQQgghst82Ui/SlTjUbDswJEejEUI8siOX7jJsySGC70bi5mjLjG41aO3nZVkjVlbQ2h92TIdq3bIlTiHyMktXsQ7CuJXT29kWUS6TeU5CCCGyUl6dg6yUamamOArj4lxXczqe9Mi1WYj0aa1ZuDuITzYGEBuvqVHcja971aaEh1PmGoiPgxv/QtGqSRsFlaf+2xIiy6R3bbZ0iHUhYH0WxCSEEEKIXKS13p7bMQghHt29qFjGrjjGbyeM97X6NPLlvfaVsbPJ5JDqmHBY1gsuH4QBf4FnBWO5JMfiCWVpgrwdqAH8lQ2xCCGEEEIIITLpRHAoQ5cc4uLtCFztbZj2YnWerVbMskZsncDRHWwdIOqx37FViEdm6RDrcsAqYDqwEbid8hittSHLossFMoxLCCFEVspLQ6yVUudJPe84TVrrMtkYTqbJtVmI5LTWLN57kcnrTxETb6CKdwG+6V2bUoWcM99IfBxYJ/SVxYRD5F1w88mWeIXIa7JyiPWZhO8/pPG8fog2hRBCCJEztpM8QW4FeAF/A9cSfm4MXAW25Hh0QogMhUXH8e7KY/x6LASAlxuU5P0OfjjYWmeuAUM8bJkE1wPgpZ/ByhrsnI1fQgiLk9lJWHDnWQghhBB5h9a6T+LPSqmBQH2gkdb6cpLyEsBm4J8cD1AIka6AkHsMW3KIczfDcbaz5tMXqtO5hrdljdy/CocWQdQ9uHwAStbPnmCFeExZNMQ6S05ovPDOBJ7BuJ3En8AIrfXFTNQtDXwGtAZsgX3AaK31gSTHVACGAS2AMsB9YD/wgdb6aCbOIcO4hBBCZJm8NMQ6KaXUf8B7Wuv/mXmuO/CJ1rpczkeWmlybxZNOa83y/ZeYsO4k0XEGKhV1ZXbv2pT1dHm4Bs9tNy7CVdrcduhC5H9ZOcQ6aaMuGFe1vqK1js1kHSeMC3xFA69h7I3+CNiqlKqutQ5Pp24hYBfGhHcQEAGMTKhbT2sdkHBoG4zJ8SLgEFAQGAPsVUo11loftPS1CiGEEPlQcYzbOpkTDchkRCFyyZrDwXy2+TRX7kZS1M0Bn4IOHLhwF4CeT5XAv3OVzA+pBji1zvjdr7Pxexlzu7wJIeAhepCVUh0xDrWukVD0lNb6kFLqO+AvrfXSdOq+BXwOVNRan00oKw38B4zRWn+eTt33AX+gUpK6zsA5YLvWuntCWWHglk7ywpRSbkAQsF5r/WoGr0/uUgshhMgyebgH+SAQDrTRWkclKXcE/gActdZ1ciu+pOTaLJ4kaw4HM27VcSJj45OV21oppr5YnedrF7eswYt7YUEb42rVw/ZCwZJZGK0Qj6f0rs2Z3CDN1FBXYC1wExiLcYh0ovMYe4XT0xnYk5jgJgR1HuPiIF0yqNsA+C9F3XBgJ9BRKWWTUHZTp7iCaq1DMS4wJnfDhRBCCKMxQD3golJqoVJqqlJqIXABeAoYnZvBCfGk+mzz6VTJMYC7s53lyTFAiXpQsze0GA9uJbIgQiHyN4sSZGAC8IPWug3wRYrnTgBVM6hfJeG4lE4CfhnUjQdizJRHA45A2bQqKqU8EmILSOsYIYQQ4kmitd4C1MLYW9wEeCPh++9ADa31X7kYnhBPrCt3I82W37gfnflGbpyBiITdWJWCLrOh0XDjz0KIdFk6B7kyxjvOkHo16zsY5ySnxyPhuJRuA+4Z1D0NPKOUKqS1vgWglLLCePc7se20fIWxt/uLDM4hhBBCPDES1u/ondtxCCEecHWw4V5UXKpy74KOmWvg3HZY1huK14XeK4x7HUtiLESmWdqDfA8onMZzvsCNTLRhbgJRZv7VzsUY749KqbJKqWLAl0DphOcN5ioppcYBvYDhSYdnmzluoFLqQFrPCyGEEPmRUspKKVVVKdUsYW0PIUQu0FozbdO/ZpNjR1trRretmLmGCpUFG3twcANDptbRFUIkYWmC/AcwTilVMEmZVkrZA8OB3zKofwfzPb3umO9ZfnASrc9hvMtdBzgLXAEaYtwyCiAkZR2l1GDgE+B9rfWCDNqfr7Wum0H8QgghRL6hlBoGXAWOYdxlomJC+Rql1Ju5GZsQTxKDQfPh2pN8sy0QayvFKw1K4lPQEQX4FHTk0+er0bVWOkvpxCWZhehWHAZuhW4LwTaTvc5CCBOLVrFWSvli3HtYAxuBV4EVQHXADairtb6STv2/ADut9dMpyrclxJLhmvNKKWugAhCjtQ5USs0BOmitS6Y47hWMWz19rrUeZcFrlJUyhRBCZJk8vIr1AGAOsADjvONfMF7HDyml3gE6Z+a6nBPk2izys9h4A2NWHGP14WDsbKz4pldtWvt5Zb6Bm2dhWS9oOhqqd8u+QIXIR7JsFWutdRBQG/gVeAbjwllNgT1A/fSS4wTrgAZKqTJJgvMFGic8l5kY4rXWAQnJsTfQA+MF3kQp9RzwA/CdJcmxEEII8QQZCczQWg8EVqd47l8SepOFENknKjaeIYsPsfpwMM521izs+5RlyTFA0A64eRr2zAaD2RmHQggLWLwP8iOdzDi36SgQCbyPsSd6MuAKVNdahyUcVwoIBCZprScllNkC04DtGOdCVwHGJRzXSmsdk3BcU4x3wk9hHPad9H+KaK314QxilLvUQgghskwe7kGOAtprrf9KGJ0Vy4Me5ObAJq21Q27GmEiuzSI/Co+OY8CPB9gdeAs3R1sW9atHzRIFLW9Iazj4A1TrBvauWR6nEPlRetdmS1exfiRa63ClVEuM84Z/wrg41xZgRGJynEAB1iTv4dZAeYwLbhUELmMcFvZJYnKcoCVgj3Hrir9ThHAB42JiQgghxJPuJmlfEysCwTkXihBPlrsRMfT5YT9HLt3F09Wexa/Xp2LRTCa30WHwpz80GwsunsYVquv2y9Z4hXiSZNiDrJRaAEzWWp9P+Dk9Wmv9epZFlwvkLrUQQoislId7kOcAz2K8sXwBYw9yHeASsAvYoLV+J4vP2RiYANQEHDAuuvl1RgtpyrVZ5CfX70fx6vf7+PfqfYq7O7Kkf31KFbJgAfk1w+DIYqjwLPRaln2BCpGPpXdtzkyCfB7oqrU+qpQKwvw2TYm01rpMOs/neXIRFkIIkZXycIJcCNgNlAD2YlxTZDdQCbgONNJah2bh+aonnGcP8AUQAbwIDASGaq3npFNXrs0iX7h8J4KXv9tL0K0IyhVxYfHr9SnqZuFMhnshsGoAdPgcPCtkT6BC5HOPlCA/aeQiLIQQIivl1QQZQCnlCowA2gJFgFvAJmCm1vpeFp/rE2AU4JF0WpVSag/GG+wN06kr12bx2Dt7PYxXvt9LSGgUVX0KsKhvPQq52GdcUWs4tw3Ktsj2GIV4UuSZOchCCCGEyDu01vcxLpY5OQdOZ4dxGHdkivK7gHsOnF+IXHMiOJRXF+zjdngM9Xw9+K5PXQo42Gau8tphcGQJdJkNtV7O3kCFEJZt86SU6quU8k/jOX+l1GtZEpUQQgghcoRSqrBSqqNS6jWllEdCmYNSyqK/ETJhYcL3L5VS3kqpggl7MbfCuHinEPnS/qDbvDR/D7fDY2he0ZNF/eplPjkGKFEf7FzAoWC2xSiEeMCiIdZKqSPA91rrr8w8NxQYoLWulXXh5TwZxiWEECIr5dUh1soY2DTgDYy9uxp4KmGbp83ALq11lvYsK6Wewrjnsk9CUSwwRGv9fQb15NosHkvbz9xg0E8HiIo10KF6MWZ2r4mdTSbuPcVEgJ3Tg8f3r4Jr0ewLVIgnTHrXZkvvDpcDTqbxXABQ1sL2hBBCCJE7xgHDgUlAfYxbLCZaD3TMypMppcoDKzH+HdEJaA3MBeYqpXqnUWegUupAVsYhRE7ZeDyE/ov2ExVroOdTJfiyZ62Mk2Ot4Z9vYHY9uH/tQbkkx0LkGEvnIMcBhdN4zvMRYxFCCCFEzukPTNJaf6qUsk7x3Fmy/qb3Jxh7jDtqrWMTyrYkrKY9Syn1s9bakLSC1no+MD+xB1mIx8Uv+y/x7qpjGDT0f7o04ztUNvVYpcsQDwHrIfQSnNkEdWT2ohA5zdIe5H3A4DSeGwzsf7RwhBBCCJFDfDBuuWRODGDBxqyZUg04miQ5TrQPKIRxFW0hHnvf7zrPmJXG5HjkMxUynxwDWNtA90XQY4kkx0LkEkt7kD8G/lRK7QW+A4IxXmD7A7WBZ7I2PCGEEEJkk2CgKrDVzHM1gPNZfL6rQE2llJ3WOiZJeX0gCridxecTIkdprZm15T+++PM/ACZ08qNv49IZVwz6G/77HZ6ZaHzsUgQqZ+kMByGEBSzqQdZabwdexHiXdx7wa8J3T+AFrfW2rA5QCCHygiXHl+D7hS9WE63w/cKXJceX5HZIQjyq/wEfKqUaJynTSqkKwDvAsiw+39dAaWC9UqqLUqqNUupr4CVgToqkWYjHisGgmfxrAF/8+R9WCqZ3q5G55DjyDiztAX9/Af9uyPY4hRAZs2gV62QVlaqIcUjUTa31mSyNKhfJSplCiJSWHF/CwPUDiYiNMJU52Toxv9N8elczu7aQECZ5eBVrR+B3oBFwAfAFzgElgN1A26xOWpVSzwJjgSqAAxAIzAfmaa3j06kn12aRZ8UbNO+uPMb/Dl7G1lrx1Uu1aFe1WOYbOLoMrp2AVv7GIdZCiGyX3rX5oRPk/EouwkKIpAzagNd0L25G3Ez1XCm3UgSNCMr5oMRjJa8myAAJi3P1AtpiHB12C9gELNFax+VmbEnJtVnkVdFx8by9/Agbj1/F0daaea/UoWmFDNatvXeF/7d3n1FSVFsfxp89gTBkJCggIGIAxQQSBMQAgmBABSUKqGC813BVFPRVUcCMeo2oBAETIiiIIIIKqIAYSFdRkkhGcpp83g9VI2M7kQnVPfP/rdWrp6tPde/qMLt3nVOn2LcZajYunCBF5B/yVCCb2bXAJ865Hf7fWXLOvXWEcYYFJWERAUhKSeKd5e8wfP5wfvnzlwzbGEbqQ6kZ3ieSJpwL5Eih3Czh6FBiCjeO/565v26nXKkYxvQ7m8Z1Kme90o7VMKoD4GDAV1ChZtbtRaRAZJWbczKOYwzQHG+v8phs2jogogtkESne4pPjGfPTGJ74+gnW7V4HQLRFk5LB6M8qcZmd9U4kcphZfaAp3qSbG4DvnHOrgo1KJLztjU/i+jHf8d26XRxVpgRvXd+UU2pUyH7FinWgWgNwqRBTquADFZFcy0kPch1gk3Muyf87S8653/MruCBoL7VI8bQ/cT8jvx/J0988zeb9mwE48agTub/V/URZFDd/cvPfjkEGr3Ce0WsGbeu1DSJkiRDh2oNsZqWAl4HeQPrzIKcAY4FbnXMJQcQWSrlZwsmf+xPoM2oRKzbtpUaFUoy7oRnHVy2b+QrJCeAcxPoFcfweiC2j441FApTXHuQRwL3AKqAN/nDr/AxQRCQouw7t4sVFL/L8wufZccj713Z69dMZ1HoQVzW4iugor26Ijopm8OzBrN+znmMrHMvJR53MZ2s+o/O7nfn82s9pXqt5kJshciSeBnoCD+HNWL0VqI43q/T/AQeBfwcWnUgY2rznED3fWMia7Qc4rkoZxt/QjJoVS2e+wr4t8P61UPl46PwymEGpHPQ0i0hgctKDnAK0cM4tSv93oUQXAO2lFiketh3YxohvR/DSdy+xL3EfAC1qtWBw68F0PKHjX3sWM5PqUuk7pS/jlo6jYqmKzO07l0bVGxVG6BJhwrgH+U/gWefcsAzuGwzc6ZwLi+MIlJslHKz98wC93ljIxt2HOPnocoy7vhlVy5XMeqUty+HNdlC6Egz40jvHsYgELq89yFuBFsAiwPCOMxYRiUh/7PmDp755itd/eJ345HgALjzuQga3Hsx5dc/LtjBOE2VRjLp8FHsT9vLRyo+4aPxFzOs3j/qV6xdk+CL5qSRebs/IQqBEIcYiEtZ+3ryX3m8u4s/9CZxVuyKj+zalQlxs9isefSp0exuqn6LiWCRC5KQH+Tm8IVY5KYydcy6iD6jQXmqRomnVzlU8Pv9x3lryFkmpSQBcdtJlDGo1iGa1mh3x48Ynx9Pp7U7MWTuHOhXq8PV1X1OzvGYllcPCuAd5MvCbc+7eDO57EjjROde50APLgHKzBOmH9bvoO2oRe+OTaVW/Cq/1bkyZkpn83E1JgpmDocElcNy5hRuoiORYXk/zZEAXoCHecUpjgI2ZtXfOPXjkoQZPSVikaFm2dRnD5g/j/RXvk+pSibIorj7lau5vdT+nVT8tX55jX8I+2o5ry6KNi2hQpQFz+83VDNfylzAukFsD44BPgIkcPgb5aqAj0AvYlNbeObcmgDAB5WYJzter/qT/W4s5mJjCRQ2r80L3MykVG535Ct+9CZ/cBeVqwO0/QUw2Q7BFJBB5LZDLA/ucc87M1gKdnXNLCiLQcKAkLFI0LNq4iKHzhvLxyo8BiImK4drTruW+VvdxwlEn5Pvz7Ty0kzZj2rB823IaH9OYOX3mUL5k+Xx/Hok8YVwgpz+Jd/qkZxkswzmXRVVQsJSbJQifrdjCbW//SGJKKleeVZMnrzqNmOiorFdKTYGP/w1N+kGtJoUTqIjkWl4L5BSguXPuOzP7ArjZOfdLQQQaDpSERSKXc44v133JsPnD+HzN5wCUiilF/7P6c/c5d1O7Qu0Cff7N+zbTanQr1uxaQ5s6bfi056eUjs1idlMpFsK4QO6Tm/bOubEFFUt2lJulsE3+cQN3T1xKSqqjT4s6PHTpKURFZfIV/nkaHH8BlIgr3CBF5IjltUA+BLR1zn3t721urlmsRSScOOeY/tt0hs4byrcbvgWgXIly3HL2LdzZ/E6ql61eaLGs3bWWVqNbsWnfJjqd0InJ10wmNjoHE7lIkRWuBXIkUW6WwjTu23U8+NEKAP51QX3uandi5hM4zn8OPn8ITrkSuozyTuMkImEvrwXyUuAPvOOTRgFDgEyPQ3LOvZWHWAOnJCwSOVJSU/jw5w8ZNn8YP235CYDKpStzR7M7uK3pbVQqXSmQuFZsW8G5Y85l56GddD+1O+OuGPfX+ZSl+ImUAtnMKgAnAFuccxuCjic95WYpLC99sYqnZq4EYFDHkxlw7vFZr7DtFxjdAS78P2hyXSFEKCL5Ia8F8qXAeKAc3vFIWSV4l90xSmZ2LDACaOc/1ufAHc659VkG4q17HPAU0BaIxTs9xT3OucUh7aKAgcCNwNHASmCIc25SDp5DSVgkzCWlJDFh2QQen/84K3d4P2SOLns0d7e4mxub3EjZEmUDjhC+2/gdF7x1AfsT93NT45t4udPLOT6FlBQt4VQgm1l74Hzn3H0hywfhTcSZNjXve8C1zrnkQg4xQ8rNUtCcczwxYyWvfrUaMxh2RSO6N83ksJyDOyGu8uHb8XuhlOacEIkkeSqQ/QeIBmoBa/FmtM50ki7n3OosHifOXzcBeACv4H4MiANOc84dyGLdo4ClwD68JH4QuAtoAjR1zv2cru1Q4G5gMPA90A3oD1zinJuezbYqCYuEqfjkeEb9OIonv36S3/f8DkCdCnUY2HIg/c7sR6mYUgFH+HdfrvuSDuM7kJCSwP2t7mfYhcOCDkkCEGYF8mQvFHdlumXtgJnAMuANoAHeDuZ7nXPPBBJoCOVmKUgpqY4HP1rO2wvXExNljLjmDC49vUbGjZd9AFNvh6vHQv22hRuoiOSbrHJzjs5Z7JxLAX43s0eABc65TaFt/F7bitk8VH+gHnCSc26Vv95S4De8ZPxsFuvejHf6iTbp1p2DN9z7EbzTUmBm1fCK48edc0/7635hZvWBx4EsC2QRCT/7Evbx2vev8cy3z7Bl/xYATq5yMve3up/up3YP22N8z6t7HhO7TuSK965g+PzhVChZgYGtBgYdlhRvZwKPhizrB8QD7Z1zW+CvHw49gLAokEUKSlJKKv95fwkfL9lEyZgoXul1FhecnMW8FX/+Bon7YdVsFcgiRVROhljvxJuk6wf/tgEf4Q2LXpOuXTPgm6yGWJvZbKCUc65lyPKvAJxzbbJYdxpwvHOuQcjyD/DO11jeOZdsZr2Bt4ATnXO/pWvXD+8Y6nrOubVZPI/2UouEiZ2HdvLfhf/l+YXPsyt+FwBnHn0mg1oP4oqTr4iY43rfXvY2vT7shcPxaqdXubHJjUGHJIUozHqQDwIdnXNfplu2HfjROXdRumWdgHedc+UKP8p/Um6WghCflMKtE35g9i/bKFsyhjf6NKF5vaOyXik1FX6bCSd20IRcIhEsq9yczcncAK9XOH1PcxRwCdn3FmfkFGB5BstXAA2zWTcFSMxgeQJQGkibReEUf9mqDJ6DHDyPiARs6/6tDJw1kDrP1eHhrx5mV/wuWh7bkuk9pvP9gO/p0rBLxBTHAD0a9eClji8BcPMnN/Pu8ncDjkiKsX1AmbQbZnYCcBSwIKTdXiByvmQiubQ/IZm+oxcx+5dtVIyL5e3+zTIujreugLe7QcI+73ZUFJx0sYpjkSIsR0Os81FlYFcGy3cC2U03uxJoZ2ZHOed2wF/Dupume+y0693un7uZd4a0+xszGwAMyCYGESlA6/es58mvn+TNH98kPjkegHb12jG49WDOrXNuRE9ydfPZN7M7fjeD5gyi9+TelCtRjk4ndgo6LCl+fgEuBz7xb1+ONx/IZyHtjgO2FmJcIoVm14FE+o5exJINe6hWriTjb2jGidUzGCzhHHx0G2z6AeY+De0eKfxgRaTQFXaBDF4iDpWTX72vAv8G3jKzf+NN0jUYL4kDpKZ7rFw/h3NuJDAybRiXiBSeX3f8yuPzH2fc0nEkp3qT5nY+uTODWg3i7JpnBxxd/rmv1X3sit/FU988RZeJXZjZaybn1jk36LCkeBkBfGhmlfEK4L54k3N9HdLuCrKYkFMkUm3dG0/vNxfy69b91K4cx/jrm1H7qLiMG5vBla/DgpfgvPsybiMiRU5Ohljnp11k3INbiYx7lv/iH+/cE2iMN3x6E9ACL9kDbPavdwKV7J9dTZXS3S8iYWDJliVc88E1nPziyYz+aTSpLpUejXqw7OZlTL5mcpEqjsE73uWJtk/Q/6z+xCfHc8nbl/D9pu+DDkuKEefcFOAO4GzgWryh1V3Tj7oys1rA+WhSSyli/th5kK6vfsuvW/dzQrWyTLypxT+L40O7YXm6s4JWqQ+XjIDY0oUaq4gEJ6c9yDXNrJ7/d3S6ZbvTtamVg8dZgXeMcKiGwP+yW9k5N8nMpgAnAonOudVm9grwR7rzKK8ASuIdk5z+OOS0Y4+zfR4RKVgLNixg6LyhTPt1GgCxUbH0Ob0PA1sNpH7l+gFHV7DMjFc6vcLehL28t+I9OkzowNy+c2lQtUH2K4vkA+fcC8ALWdy/gSObZ0QkbP22dR+93lzI1r0JnFarAmP7NaVSmRJ/b5QUD2+0hR2/QWwZOKlDMMGKSKByWiB/kMGyKSG3MxvanN7HwNNmVi9tBmwzqwu0BHI0dsU/5dTP/ro1gGuAp9I1mYE3mVdPvNM/pekFLM9qBmsRKTjOOeasncOw+cOYs3YOAKVjSjOg8QDuPuduapXPyT62oiE6Kpq3rniLvQl7+XTVp7Qb1475182nbsW6QYcmIlLkLN2wmz6jFrHrYBLNjqvMG32aUK5UBqcHjC0FZ3SH5ZOhmnZaihRXOTnNU5/cPKBzbmwWj1UG75imQ8ADeAX1o0A54DTn3H6/XR1gNTDEOTfEXxYLPAl8hTe75inA/X67C51zieme53G8IWSDgB/wiugbgcudc1Oz2V6dSkIkHznnmPbrNIbOG8rCjQsBKF+yPLeefSt3NL+DamWqBRxhcA4mHaTD+A7MWz+P+pXrM6/fPI4ue3TQYUk+C6fTPEUq5WY5UgvX7OD6sYvZn5DMBSdX4+WeZ1EqNt0E7ampcPBPKOvnIucgOV5DqkWKuKxyc7YFcgEEUxvvuOF2eL3Os/HOqbwuXZu6wFrgEefcw/6yGLxe67Pxhn5tAN4BhjnnDoY8RzRe8dwfOBpvBuwhzrmMesJD41MSFskHKakpfPC/Dxg2fxhLty4F4KjSR3FH8zu4reltVCxVMdgAw8Se+D2cP/Z8ftzyI42qNeKrvl9RqXR2k/pLJFGBnHfKzXIkvvhlGzeN/56E5FQuPb0Gz159OrHR6abfSdgHHw6AP3+F/nOgVIXgghWRQhVWBXK4UxIWyZvElETGLx3P4/Mf57edvwFQo1wN7m5xNwMaD6BMiTLZPELxs/3AdlqPbs3KHStpUasFn/X+jLIlygYdluQTFch5p9wsuTV1ySbufO8nklMd3ZvW5rHOpxIdFfIVTDwAb7SDvRuh94dQs3EwwYpIoVOBnAtKwiJH5lDSId788U2e/PpJ/tj7BwDHVTyOgS0H0veMvpSMKRlwhOHtjz1/0Gp0K9bvWU+7eu2Y2n2qXrMiQgVy3ik3S268u2g9909ehnNw47n1uO/ik//6Hv7DrnXgUqFyvYzvF5EiSQVyLigJi+TO3oS9vPLdKzy74Fm2HdgGQIMqDRjUehDdTu1GTFQQp1uPTL/t+I1Wo1ux7cA2rmxwJe91eU+vXxGgAjnvlJslp16fu4ah038G4J72J3HLeccfLo5TU2HeM5CSCBcMDjBKEQmaCuRcUBIWyZkdB3fwwsIXeGHRC+yO3w3AWcecxeDWg+l8cmeirLBPs140LNmyhDZj2rAnYQ99z+jLm5e9qdcywqlA/jsz64h35oqzgFTgV+Be59ycLNZRbpYsOed4dtav/HeOd4bPIZefwrUt6v690eYlMPI87+9bv/POcSwixZIK5FxQEhbJ2uZ9m3n222d5ZfErHEg6AEDr2q0Z3HowFx1/UebD2CTHvvnjG9qNa8fBpIPc3ux2RrQfodc1gqlAPszMbgRe9C/TgSjgDGCFc25aFuspN0umUlMdQ6b9jzHfrCM6yniqy2lceVYmpw5c9DpUrAMnXlS4QYpIWFGBnAtKwiIZW7d7HU9+/SSjfhxFQkoCAO2Pb8/g1oNpXad1wNEVPZ+t/oxL3r6EpNQkHm7zMA+d91DQIckRUoHs8c9Q8TNwv3PuuVyuq9wsGUpOSeXeSUv58IeNlIiO4r89zqT9KelOl/fb51C+BlRvGFyQIhJ2VCDngpKwyN/98ucvPD7/cSYsm0ByajIAVza4kvtb3U+TGk0Cjq5om/S/SVz9wdWkulSea/8ctze/PeiQ5AioQPaY2RDgP8BRzrn4XK6r3Cz/kJCcwr/f+ZGZK7YSVyKakb2b0OqEKocbrJwB73SDSnXgxrk6jZOI/CWr3KwD20QkQz9u/pGuE7vS8KWGjF0yFuccvU7rxYpbVjDp6kkqjgvBVQ2v4vVLXwfgjpl3MOanMcEGJJI3rYBfgG5mttrMks1slZndGnRgEnkOJiZzw9jFzFyxlfKlYhh3fbO/F8cA9dpAjTPg9B5QolwgcYpI5FEPcgjtpZbi7ps/vmHovKFM/206ACWiS9D39L4MbDWQepV0GowgPLfgOe6ceSdRFsXErhO5ssGVQYckuaAeZI+Z/QLUABKAQcBqoCtwE3CHc+75DNYZAAwAGoNys3j2HEqi3+hF/LB+N1XKlmTc9U1pcEx5/86NULY6RPtnAEhOhJgSwQUrImFJQ6xzQQWyFEfOOWavnc3QeUP5ct2XAMTFxnFj4xv5T4v/ULN8zWADFB764iGGzB1CiegSfNLjE9rWaxt0SJJDKpA9ZvYrcAJwlXPuw3TLPwXOBI5xmSRf5WZJs31fAteOWsTPm/dSs2Jpxt/QjOOqlPHuXPMVTOwDZ/aGix4NNlARCWtZ5WadYFOkGEt1qUxdOZVh84exaOMiACqUrMBtTW/j9ma3U7VM1YAjlDQPn/cwu+N388KiF+j8bmdm9Z5Fi2NbBB2WSG7swCuQZ4Us/wzoABwDbCrsoCRybNx9iF5vLGTtnweoV7UM469vRo2KpQ83iIqBhH2wfSWkJB/uRRYRyQX95xAphlJSU3h/xfsMmz+M5duWA1Alrgp3Nb+LW86+hQqayCTsmBkjOoxgT8Iexi4ZS8e3O/JV3684rfppQYcmklMrgOYZLE/be59aiLFIhFmzfT+93ljIpj3xNDymPG9d35QqZUuCc5B2Gry6LaHfDKjZGKI0zY6IHBkNsQ6hYVxSlCWmJPLWkrd44usnWLVzFQA1y9XknnPuoX/j/sTFxgUcoWQnOTWZrhO7MuWXKVQvU535182nfuX6QYclWdAQa4+ZdQKmAV2dcx+kWz4TaOicOzaLdZWbi7EVm/bQZ9Qi/tyfSJM6lXiz79lUKB0Lu9fDpP7Q8Uk45vSgwxSRCKJjkHNBSViKooNJB3njhzd46pun2LB3AwD1KtXjvpb3ce3p11IypmTAEUpuxCfHc8nblzB77WzqVKjD/OvmU6t8raDDkkyoQPaY90LMBk4HBgNrgC5Af6Cfc25MFusqNxdT3/++k76jv2NffDKtT6jCa70bE1fCHwA5435Y8DIc1wb6fBxsoCISUVQg54KSsBQlexP28tKilxixYATbD24H4JSqpzCo9SCuPuVqYqJ0lEWk2p+4n7ZvtWXhxoWcXOVk5vadq2PGw5QK5MPMrDwwHK8wroR32qfHnXNvZ7OecnMxNO+37Qx463sOJaVw8alH81y3MygZE324QXICzHkUWv8HSlcKLlARiTgqkHNBSViKgj8P/snzC57nv4v+y56EPQA0qdGEwa0Hc9lJlxFlOjarKNh5aCdtxrRh+bblnHXMWcy5do6OHw9DKpDzTrm5+JmxfAv/fudHElNS6dK4Fo9f2YiY1ERY+Cq0uBWiY4MOUUQimArkXFASlki2ad8mnvnmGV79/lUOJh0EoE2dNgxuPZi29dr+9c9Aio7N+zbTenRrVu9azbl1zmVGzxmUji2d/YpSaFQg551yc/HywfcbuPeDJaQ66NeyLg92akhUlME73WHldGhxG7QfGnSYIhLBVCDngpKwRKK1u9byxNdPMPqn0SSmJAJwcf2LGdx6MC1rtww4Oilo63avo+Wolmzat4mOJ3Rk8jWTKRFdIuiwxKcCOe+Um4uPMV+v5eGp/wPg9gtP4I62Jxzeubt+IXx0K3QdDUc3CjBKEYl0KpBzQUlYIsnP239m+PzhvL3sbVJcCoZxVcOruL/V/Zx1zFlBhyeF6H/b/8e5o89lx6EddDu1G+OvGE90VHT2K0qBU4Gcd8rNRZ9zjhfnrOKZWb8C8ECnBtzQ6jjYsQqqnHC4oc5vLCL5QAVyLigJSyT4YfMPDJs3jA9//hCHI9qi6XlaT+5reR8NqjYIOjwJyOJNi7lg7AXsS9zHjY1v5JVOr2hYfRhQgZx3ys1Fm3OOYdN/5vV5a4kyePzK07i6cQ2YdgcseQ/6fQq1GgcdpogUIVnlZu2CE4kg89fPZ+i8ocxYNQOAEtEluO6M67i35b0cV+m4gKOToDWp0YSp3afSYUIHXvv+NSqWqsjjbR8POiwRkUylpDoGT17Gu9/9QWy08dw1Z9LptGO8O6NiwQz2bgBUIItI4VAPcgjtpZZw45xj1ppZDJ03lLm/zwWgTGwZbmpyE3e1uIsa5WoEHKGEm2m/TuOK964gOTWZ4RcO575W9wUdUrGmHuS8U24umhKTU7nr/Z+YtnQzpWKjeLVXY847sapXFAMkJ8LO1VBNI6NEJH9piHUuKAlLuEh1qXz0y0cMmz+MxZsWA1CxVEX+1fRf3N7sdo6KOyrgCCWcvbPsHXp+2BOH45VOr3BTk5uCDqnYUoGcd8rNRc+hxBRumfA9X6zcTrmSMbzZ92ya7pwKyyZCrw8hRhMNikjB0RBrkQiSnJrMe8vfY/j84azYvgKAqnFVuavFXdxy9i2UL1k+4AglEnRv1J09CXu4+ZObueWTW6hQsgLdG3UPOiwREfbFJ3H92MUsWruTymVK8NZ1TTm1ShRMfgL2boSVn8ApVwQdpogUU4Xeg2xmxwIjgHaAAZ8Ddzjn1udg3drAo8D5QBVgA/A+MNw5dyBdu6OA/wMuBY4BtgCfAI8457Zn8xzaSy2BSEhOYOySsTzx9ROs2bUGgFrla3HvOfdy/VnXExcbF3CEEoken/8498++n5ioGKZcM4VOJ3YKOqRiRz3IeafcXHTsPJBIn1GLWLZxD0eXL8X4G5pSv1o5786NP8C2n+HMnsEGKSJFXtgMsTazOGAJkAA8ADjgMSAOOC19kZvBumWAH4FY4GFgPXA28AjwsXPuGr+dAfOBE/GK5J+BhniF9a/AOS6LjVYSlsJ2IPEAr//wOk9/8zQb920EoH7l+tzX8j56n95b57OVPBs4ayBPfvMkpWJKMaPnDNrUbRN0SMWKCuS8U24uGrbsiafXmwtZtW0/dY6K4/1OJaietAFOvybo0ESkmAmnIdb9gXrASc65VQBmthT4DbgReDaLdVsCJwDtnXOf+cu+MLPKwN1mFuecO+i3OQe40Tk30m/3pZmlAq/gFc4r83m7RHJtT/weXvruJUYsGMGfB/8EoFG1RgxqPYiuDbvqHLaSbx5v+zi743cz8oeRXPrOpczpM4cmNZoEHZaIFCO/7zhAzzcWsmHXIU6qXo4JXapTZUxrcKlQ9SSocUbQIYqIAIVfIF8GLEgrjgGcc2vN7GvgcrIukNO60faGLN8NROEN186uHX5bkcBsP7Cd5xY8x4vfvcjeBO9j2rRmUwa3HswlJ15ClOkjKvnLzHi508vsTdzLu8vfpcP4DsztN5eGVRsGHZqIFAMrt+yj95sL2bYvgdOPrcjYfmdTMa4EnH09JCdANf0vEpHwUdhDrLcAHznnbgxZ/jLQ1TlXNYt1SwFLgc3AzXhDrJsCE4DJzrlb/HYGfIl3jHIf4Be8IdZjgHXOuY7ZxKhhXFIgNuzdwDPfPMPIH0ZyMOkgAOfXPZ/BrQdzwXEX/DXUQ6SgJKUk0fm9zkz/bTo1y9Vk/nXzqVuxbtBhFXkaYp13ys2R66c/dtN39CJ2H0yifd1onu1yCmWqHOvdmZoKUdopLCKFL6vcXNj/lSoDuzJYvhOolNWKzrl4oBVezCuAfcBsYBpwW7p2DuiIN4z6O7/dQmANcFWet0Akl1bvXM2AqQOo93w9nlv4HAeTDtLphE58c903zOkzhwvrXajiWApFbHQsE7tO5Nw657Jx30bavtWWzfs2Bx2WiBRR367eQc/XF7D7YBLXHn+QVw/eRZkPr4WkeK+BimMRCUNB/GfKaPdvttWB34P8HlAN6A20Ae4BrgFeCmn+OtAcuMlvdxPQBPjALOPxq2Y2wMwW53AbRLK1YtsKen3YixNfPJHXf3id5NRkujbsyo83/si0HtNocWyLoEOUYiguNo6p3ady1jFnsXrXatqPb8/OQzuDDktEipjZP2+lz+hFHEhMofMZNXiw23mYRUNUNCTuDzo8EZFMFfYQ663AlCMcYn0r8CJQ3zm3Ot3y/sBI4Azn3BIz64TXq9zWOTc7Xbt2wGdAZ+fcR1k8j4ZxSZ4s3rSYYfOGMfmXyQDERMXQ67Re3NfyPk6qclLA0Yl4th/YzrljzuWXP3+hea3mzOo9i7IlygYdVpGkIdZ5p9wcWT76aSP/eX8Jqakp9GhWhyGXNyIqymDnWihfA2JKBh2iiBRz4TSL9QrglAyWNwT+l826jYBd6Ytj3yL/ugHeKaQa+be/y6JdpgWySG5MWDaBwbMHs37PeqqVqUbVMlVZvm05ACWjS3L9mddzb8t7qVOxTsCRivxd1TJVmdV7Fq1GtWLBhgV0frczn/T4hJL64SoieTBh4e88MGU5Fd1eJld7kzrHdMGiTvPurHxcsMGJiORAYQ+x/hhobmb10haYWV28Uzh9nM26W4BKZlY/ZHkz/3pjunbgTeCVVTuRPJmwbAIDpg7g9z2/43BsPbCV5duWUzK6JPeccw9rb1/LS51eUnEsYatW+VrM6j2L6mWqM3vtbLpP6k5yanLQYYlIhHr1q9UMnrwc52BY4/3U3fsd9vXzkHgg6NBERHKssIdYl8Hr5T0EPIB3PPKjQDngNOfcfr9dHWA1MMQ5N8RfVhdvFustwFC8WaybAA8CvwJNnXOpZlYe+BnvuOZH8WaxPhl4CEgEGqY9TyYxahiX5Ejd5+ry+57f/7G8Vvla/HHnHwFEJHJklm5dSpsxbdgdv5s+p/dh1OWjdLqxfKQh1nmn3BzenHM8NXMlL3+5GjMYcvmp9G5eB757A07sABVqBR2iiMjfhM0s1s65A8AFeAXtOLxTNK0FLggpWg2ITh+fc24d3sRbPwGPAdOBtOOP2znnUv12e/12nwL3prueCrTIqjgWyY31e9ZnuHzjXg1SkMhyWvXTmN5jOnGxcYxdMpY7Z9ypQkREciQ11fF/H63g1S9/446YSbx6SVWvOAY4+wYVxyIScQq1BzkSaC+15FRmPch1KtRh3R3rCj8gkTyatXoWl7xzCYkpiTzU5iEePu/hoEMqEtSDnHfKzeEpKSWVez9YyuQfN/KfEpP4V9QkqHEW3DBbp3ASkbAWNj3IIkXJ0AuHEhcb97dlcbFxDL1waEARieRNu+Pb8c5V7xBlUTzy1SM8t+C5oEMSkTAVn5TCLRN+YPKPGylTIpqm3QZDrabQboiKYxGJaOpBDqG91JIb6Wexrl2hNkMvHErPRj2DDkskT8b8NIZ+H/UDYNRlo+h3Zr+AI4ps6kHOO+Xm8HIgIZn+by3m0JoFrCnZgDHXNeXM2pXAOTB9zEUk/GWVm1Ugh1ASFhGB5xc8zx0z7yDKopjYdSJXNrgy6JAilgrkvFNuDh+7DybSd/R3nLNpDPfGvs+25g9QrcM9QYclIpIrGmItIiK5cnvz23mozUOkulS6fdCNz1Z/FnRIIhKwbfvi6TZyAT/9sZtdZerhomKoVqFM0GGJiOQr9SCH0F5qERGPc447Z97J8wufJy42jlm9Z3HOsecEHVbEUQ9y3ik3B2/DroP0fX0+q3YmcXzVMoy/oRnHpG6DSnWCDk1EJNfUgywiIrlmZjzb/ln6ntGXg0kH6fR2J5ZsWRJ0WFJEmNkMM3Nm9ljQsUjWVm3bzwsvPc+YAzfT9ugDvH9jC46pUFrFsYgUSSqQRUQkU1EWxeuXvs4VJ1/B7vjdXDT+In7b8VvQYUmEM7PuwOlBxyHZW75xD1e/+g0XJnxOLfuTlxqs4KiyJYMOS0SkwKhAFhGRLMVExfDOVe/Qrl47th3YRttxbfljzx9BhyURyswqAiOAuwIORbLx3bqddB+5gJ0Hk5hc9wESOzxLyYseDjosEZECpWOQQ+g4JxGRjO1P3E+7ce1YsGEBJx11EvP6zaNqmapBhxX2dAzy35nZSOB459yFfs4d6px7IJt1lJsLyZQfN/LUzJWU2LOGbtFzGJ7cg06NajDimjMoEaN+FREpGnQMsoiI5FnZEmWZ3mM6jao1YuWOlXSY0IE98XuCDksiiJm1Aq4Fbgk6FvmnKT9u5P4Pl7F19z7GlRjOjTGf0DtmNheeXE3FsYgUG/pvJyIiOVapdCU+6/0Z9SvX54fNP3DpO5dyMOlg0GFJBDCzWOA14Gnn3Mqg45F/emrmSg4lpZBMDA8k9WNaSjM+TG7JM7N+DTo0EZFCowJZRERy5eiyRzOr9yxqlqvJvPXz6PJ+FxJTEoMOS8LfQKA0MDSnK5jZADNbXHAhyV8S9lN1z7K/bn6Zeia3Jd3OAUqzafehAAMTESlcKpBFRCTX6lasy6zes6gSV4VPV33KtZOvJSU1JeiwJEyZWW1gMPAgUNLMKvqTdZHudnToes65kc65JoUYavF0cCe82Y7xJR+nnm36x901KpYOICgRkWCoQBYRkSPSoGoDZvScQbkS5XhvxXvc8sktmkRJMlMPKAWMB3aluwDc7f/dKJjQhNKVoMoJuLJHUzLm7/spSsdGc0/7kwIKTESk8GkW6xCaKVNEJHfm/j6X9uPbE58cz73n3MsT7Z4IOqSwolms/zq10xkZ3PUFXtH8JrDYObc/k/WVm/Obc5AcD7F+73DCfnCpTPl5H0/NXMmm3YeoUbE097Q/ic5n1gw2VhGRfJZVblaBHEJJWEQk9z759RM6v9eZ5NRkhl84nPta3Rd0SGFDBXLmdJqngCQegI//5V13eweiNKBQRIoXneZJREQKVKcTOzHuinEYxv2z7+eV714JOiQRycyB7bBqNqybD39qQnERkfTUgxxCe6lFRI7ca4tf46ZPbsIwxl85nh6NegQdUuDUg5x3ys0FYN18iKsC1U4OOhIRkUKnIda5oCQsIpI3T8x/gvtm30e0RTOl2xQuOfGSoEMKlArkvFNuziPnYMHLUOFYaHhZ0NGIiAROQ6xFRKTQDGw1kPta3keKS6HrxK58ue7LoEMSKd5+mwUzB8GUm+HAn0FHIyIS1tSDHEJ7qUVE8s45xy2f3MKr379K2RJl+aLPFzSpUTxPZ6se5LxTbs4j52DanVDvPDilc9DRiIgETkOsc0FJWEQkf6SkptB7cm/eWf4OR5U+irn95tKwasOgwyp0KpDzTrn5CPz+LVQ9CeIqBx2JiEjY0RBrEREpdNFR0YztPJZOJ3Rix6EdtBvXjrW71gYdlkjRt3wSjOkEk66H1JSgoxERiSgqkEVEpMDERscysetEzq1zLpv2baLduHZs3rc56LBEirZaTaF0Jah+atCRiIhEnEIvkM3sWDP7wMz2mNleM/vQzGrncN3aZjbWzNab2UEz+9XMHjOzMhm0rWlmo8xsi5klmNlaMxue/1skIiJZKR1bmqndp9L4mMas3rWai8ZfxM5DO4MOS6RoSdh3+O+Kx8Kti+CiRyEqOriYREQiUKEWyGYWB8wBTgb6AL2BE4AvMipyQ9YtA3wOnAs8CHQC3gD+A4wKaVsXWAScCPwbuAh4GEjOt40REZEcK1+yPDN6zaBBlQYs37acjhM6sj9xf9BhiRQNv38L/20Myz44vKzMUcHFIyISwWIK+fn6A/WAk5xzqwDMbCnwG3Aj8GwW67bEK6bbO+c+85d9YWaVgbvNLM45d9Bf/iqwETjfOZfkL/sqfzdFRERyo0pcFWb1nkWr0a1YuHEhnd/tzLQe0ygVUyro0EQi29blsH8rLH0fTr0KTPPBiYgcqcIeYn0ZsCCtOAZwzq0FvgYuz2bdEv713pDlu/G2wwDM7HigPfDfdMWxiIiEgZrlazKr9yyql6nO7LWz6T6pO8mpGtwjkidn3wBXvQnd3lZxLCKSR4VdIJ8CLM9g+Qogu3N/fI7X0/yEmTU0s7JmdgFwO/Cqc+6A366lf33IzGb5xx/vMrO3zEzjjUREAla/cn1m9Z5FpVKVmPLLFK7/+HpSXWrQYYlEjr2bYWJfOPCnd9sMGnWB6MIeGCgiUvQUdoFcGdiVwfKdQKWsVnTOxQOt8GJeAewDZgPTgNvSNa3hX48CfgUuBgbiHbM808wy3GYzG2Bmi3O8JSIicsQaVW/E9J7TKRNbhreWvMUdM+7QOW5Fcmr63bBiMsy4P+hIRESKnCBO85TRL6BsxwOZWSngPaAa3uRebYB7gGuAl9I1TdumL51ztzrn5jjnRgK3AI3xhl//MyjnRjrnmuR4K0REJE+a12rOlG5TKBFdgv8u+i8Pf/lw0CGJRIaOT0PDztB+WNCRiIgUOYVdIO/C60UOVYmMe5bTux44D+jonBvvnJvrnHsabxbrm8zsdL/dDv96Vsj6aRN7nZnrqEVEpEC0rdeWd696lyiLYsjcIYz4dkTQIYmEn+REWDHl8O3yx8DVY6Fs1cBCEhEpqgq7QF6BdxxyqIbA/7JZtxGwyzm3OmT5Iv+6QbrngIx7qgF0oJuISBi5osEVjLrMO1vfXZ/dxagfR2Wzhkgx4hy83RUm9oGf3g46GhGRIq+wC+SPgeZmVi9tgX/O4pb+fVnZAlQys/ohy5v51xv96wV+2w4h7dJuf5fLmEVEpID1OaMPz3d4HoD+U/vzwf8+yGYNkWLCDE65AsodA1VODDoaEZEizwpzUhQzKwMsAQ4BD+D18j4KlANOc87t99vVAVYDQ5xzQ/xldYGleMXvUGA90AR4EG8yrqbOedOgmlkfYAzwGvAhUN9f5yfgApfFRpuZAzRZjIhIAIZ8NYSHvnyI2KhYpnafSvv6GU4bEVHMP+2Oc07n3zlCxTI3H9wJcemOSovfC6XKBxePiEgRklVuLtQeZP9UTBfgFbTjgAnAWryidX+6pgZEp4/PObcOaI5X5D4GTAf6AyOBdmnFsd92LHAt3qzXU/GK6PHApVkVxyIiEqwHz32QO5rdQVJqEle+fyXf/PFN0CGJFK6UJPh0ILzSEvZtPbxcxbGISKEo1B7kSFAs91KLiISRVJfKDR/fwOifRlOhZAW+6vsVpx99evYrhin1IOddscrNyYnw1mWwYbE3EdfJnYKOSESkyMkqN6tADlGskrCISJhKTk3mmg+u4cOfP6RamWrM6zePE4+KzOMvVSDnXbHLzfu3wa51cGzToCMRESmSVCDnQrFLwiIiYSohOYFL37mUWWtmUbtCbeb3m8+xFY4NOqxcU4Gcd0U+Ny+dCBu/h4sfDzoSEZFiIWyOQRYREcmpkjElmXzNZFrUasH6PetpN64d2w5sCzoskfy1dxN8fBssfAXWzgs6GhGRYk89yCGK/F5qEZEIs+vQLs4bex5Lty7lzKPP5Is+X1ChVIWgw8ox9SDnXZHPzUvehYR9cPYN3mmdRESkQGmIdS4U+SQsIhKBtu7fSqvRrVi1cxWtardiZq+ZxMXGBR1WjqhAzrsil5u3LIekQ3Ds2UFHIiJSLGmItYiIRLTqZavzee/PqVW+FvPXz6fL+11ITEkMOiyR3Nv0E7zZDt7t4Q2vFhGRsKICWUREIkKdinWY1XsWVeKq8OmqT+k9uTcpqSlBhyWSO9VPhVpNoP6FULpS0NGIiEgIDbEOUeSGcYmIFDE/bP6B88eez96EvfQ/qz+vXfLaX0OlwpGGWOddxOfmQ7sgpjTElvJuJx6E2NI63lhEJCAaYi0iIkXGWcecxbTu0ygVU4rXf3idgZ8PjNzCqRgxsy5mNsnMfjezQ2a20syGm1m5oGMrUNt+gdcvgE/ugrTPaYk4FcciImFKBbKIiESc1nVaM+nqScRExfDUN0/x+HydPzYC3A2kAIOADsArwM3ALDMrur9HUhJh72bYstSbqVpERMKahliHiPhhXCIixch7y9+j+6TuOBwvd3yZm8++OeiQ/kFDrD1mVtU5tz1k2bXAWOBC59ycLNaN7Ny8fgEcfZrXcywiIoHTEGsRESmSrjn1Gl675DUAbp1+KxOWTgg4IslMaHHs+86/rlmYsRSo+D3wbk9YO/fwstrNVRyLiEQIFcgiIhLR+jfuz5Ntn8Th6DOlD1NXTg06JMm5Nv71z4FGkZ++Hwu/TINpd4JmWRcRiTgaYh0i4odxiYgUU4NmD2L4/OGUjC7JjF4zOK/ueUGHBGiIdWbMrCbwI7DEOdcukzYDgAFAY4iQ3JyaAjMHQbOboPJxQUcjIiIZyCo3q0AOoQJZRCQyOee4dfqtvLL4FcqWKMuca+dwds2zgw5LBXIGzKws8CVQA2jqnNuQTfvwzc2pqfD9aDi9u4ZRi4hECB2DLCIiRZ6Z8WLHF+nRqAf7E/fTYUIHVmxbEXRYEsLMSgEfA/WA9tkVx2Fv5iDvFE7T7gg6EhERyQcqkEVEpMiIsijGXD6GS068hJ2HdtJuXDvW7FoTdFjiM7NYYBLQFOjonFsWcEh517gPlK8JjboGHYmIiOQDDbEOEdbDuEREJEcOJR3i4gkX89XvX1GvUj3m95vPMeWOCSQWDbH2+Oc6fhe4DOjknJudi3XDKzfvXg8Vax++nZwAMSWDi0dERHJFQ6xFRKRYKR1bmo+7f0yTGk1Ys2sN7ca1Y8fBHUGHVdy9BHQFngYOmFnzdJdaAceWc/NHwAtnwqp09b2KYxGRIkMFsoiIFEnlS5bn056f0rBqQ1ZsX0HHtzuyL2Ff0GEVZxf714OBb0MuNwQVVK4lHoTUZNj2v6AjERGRAqAh1iHCbhiXiIjkyca9G2k1uhXrdq/jguMu4JMen1AqplShPb+GWOdd4LnZOfDfR1JTYeNiOLZpMLGIiEieaYi1iIgUWzXL1+Tz3p9zdNmjmbN2Dt0+6EZyanLQYUmkWD0HxnSChP3e7agoFcciIkWYCmQRESnyjq98PLN6z6JSqUp8tPIjrvvoOlJdatBhSbhLTYEZg+D3r2Hxm0FHIyIihaDQC2QzO9bMPjCzPWa218w+NLPa2a8JZlbbzMaa2XozO2hmv5rZY2ZWJot1upuZM7PIPs+iiIjkyanVTuXTnp9SJrYM45aO4/ZPb9fhNJK1qGi4ZhycPxha/CvoaEREpBAU6jHIZhYHLAESgAcABzwGxAGnOecOZLFuGeBHIBZ4GFgPnA08AnzsnLsmg3UqAr/4z5PinMt2lszAj3MSEZECNXvNbDq+3ZHElEQePPdBhpw/pECfT8cg512h5ubd62HNV3BW74J/LhERCURWuTmmkGPpD9QDTnLOrQIws6XAb8CNwLNZrNsSOAFo75z7zF/2hZlVBu42szjn3MGQdZ7EK8g3A23zbzNERCRSXVjvQt7r8h5d3u/Co3MfpWKpitzV4q6gw5JwEL8HXr8ADvwJ5Y+B+vrpICJS3BT2EOvLgAVpxTGAc24t8DVweTbrlvCv94Ys3423HX+r/s2sJdALuDUP8YqISBHU+eTOjLp8FAD/+ew/vPmDji8VoFQFaHYj1L8QajYOOhoREQlAYRfIpwDLM1i+AmiYzbqf4/U0P2FmDc2srJldANwOvJp+eLaZxQIjgafSF+MiIiJprj39Wl7o8AIAA6YN4IP/fRBwRBKIpEOw+4/Dt1vfDT3eh9KVgotJREQCU9gFcmVgVwbLdwJZZiLnXDzQCi/mFcA+YDYwDbgtpPlAoCQwPI/xiohIEfavZv9iyHlDSHWp9JjUg5mrZgYdkhSmfVtg9MUw7gpveDV45zuOig42LhERCUwQp3nKaIaNbCcuMbNSwHtANaA30Aa4B7gGeCldu/rAYOA2v6jOETMbYGaLc9peRESKhgfOfYC7mt9FUmoSV7x3BV+v/zrokKSwlCgLyQmQkgj7twcdjYiIhIHCnsV6KzDFOXdjyPKXga7OuapZrHsr8CJQ3zm3Ot3y/njDqc9wzi0xs+l4RXjPdKu/jFdQnwIkOOcOZfE8msVaRKSYcc5xw8c3MOqnUZSOLk3F0hXZsn8LtSvUZuiFQ+nZqGf2D5IJzWKdd/mam9Mew39f2L3eK5TjKuf9sUVEJCJklZsLuwd5BV6RGqoh8L9s1m0E7EpfHPsW+dcN0j1WR7yh3GmX7kAN/28NuxYRkb8xM0ZeOpKmNZpyKOUQm/dvxuH4fc/vDJg6gAnLJgQdouSH5AT4+F/wxdDDyyrWVnEsIiJ/KewC+WOguZnVS1tgZnXxTuH0cTbrbgEq+UOo02vmX2/0r7sB54dcZgJ/+n+/mIf4RUSkiIqOimbL/i3/WH4w6SCDZw8OICLJd5t+hJ8mwLcvwd7NQUcjIiJhqLCHWJfBOy/xIeABvKHQjwLlgNOcc/v9dnWA1cAQ59wQf1ldYCleoTwUWA80AR4EfgWaOudSM3neMUBb51ytHMSoIdYiIsVU1CNRuAymyjCM1IcyTDHZ0hDrvMvX3Pz9GKhxJhxzet4fS0REIlLYDLH2T8V0AV5BOw6YAKwFLkgrjn0GRKePzzm3DmgO/AQ8BkwH0o4/bpdZcSwiIpJTtSvUztVyiUCN+6o4FhGRTBVqD3IkUA+yiEjxNWHZBAZMHcDBpIN/LYuLjWPkpSOPeKIu9SDnnXKziIjkp7DpQRYREQlnPRv1ZOSlI6lToQ6GUadCnTwVxyIiIhJZ1IMcQnupRUQkP6kHOe+Um0VEJD+pB1lEREREREQkGyqQRURERERERFCBLCIiIiIiIgKoQBYREREREREBVCCLiIiIiIiIACqQRURERERERAAVyCIiIiIiIiKACmQRERERERERQAWyiIiIiIiICAAxQQcQrsws6BBEREQkHeVmEREpaOpBFhEREREREQHMORd0DEWWmS12zjUJOg4peHqviw+918WH3ms5UkXhs6NtCA/ahvBRFLZD25Az6kEWERERERERQQWyiIiIiIiICKACuaCNDDoAKTR6r4sPvdfFh95rOVJF4bOjbQgP2obwURS2Q9uQAzoGWURERERERAT1IIuIiIiIiIgAKpDznZnVMrP/mtm3ZnbQzJyZ1Q06LslfZtbFzCaZ2e9mdsjMVprZcDMrF3Rskr/MrL2ZzTGzLWaWYGYbzOx9M2sYdGxS8Mxshv9//LGgY5HwVVRzQqR+/s2so5nNNbP9ZrbXzBab2QVBx5VTZtbSzD4zs21+/D+Y2XVBx5WZnP72NbNKZvaGmf1pZgfM7HMzaxRAyP+Qk20wswvNbLyZrfa/56vN7BUzqxZQ2H9zJDWImb3mtxtfSGFmKzfbYWbN/f9Tu/3P1DIz65bXGFQg57/6wNXALmBewLFIwbkbSAEGAR2AV4CbgVlmpu9V0VIZ+B64DbgIuB84BVhgZnWCDEwKlpl1B04POg6JCEUuJ0Tq59/MbgQ+wvu/fQXQFZgIxAUZV06Z2WnA50As0B+4CvgOeNPMbg4ytixk+9vXzAz4GO/78S+87YoFvjCzWoUUZ1Zy8vv9JuAo4DG87RgOXIb3e6BsYQSZjVzVIGZ2DtAT2FvAceVWjrbDzDoBc4EtQA/gcuB1oFSeI3DO6ZKPFyAq3d83AA6oG3RcuuT7+1w1g2XX+u/3BUHHp0uBv/8n+e/1f4KORZcCe48r+km3u/9ePxZ0TLqE76Wo5YRI/fwDdYFDwB1Bx5KHbRgGJAJlQ5YvAL4NOr5MYs72t69fvDjg/HTLKgA7gRciZBsy+p6f67e9LhK2Id39scByvJ3+64DxQcefy/eiHLANeK4gYojIvZrhzDmXGnQMUvCcc9szWPydf12zMGORQOzwr5MCjUIK0pPACufcO0EHIuGvCOaESP38XwekAq8GHUgelMDLLYdClu8mTEd+5vC372XAJufcF+nW2wNMxSueA5WTbQj373kua5B7gGjgmQIK54jlcDu6AlUpoPjD8osmEqHa+Nc/BxqFFAgzizazEmZ2AvAaXu/KuwGHJQXAzFrh9f7dEnQsEtEiMidE+Oe/FfAL0M0/PjTZzFaZ2a1BB5YLY/zrF8yshplVNLP+wIXAiODCyrNT8HosQ60AaofJEOUjEXHfczM7HngAuMU5lxh0PEeoFd7og0b+ccfJZvaHmT1kZtF5ffCYvMcnImZWExgCfO6cWxx0PFIgFgKN/b9X4Q2b3BZgPFIAzCwWbwfI0865lUHHI5EpUnNCEfj81/AvT+EdD74ar6fpRTOLcc49H2RwOeGcW25m5wGTObyTIgm4yTkXyTtlK+MN5Q2107+uBOwvtGjygT8J33N4xfGUQIPJnVeBD9P35kegGnjzCrwNPIo350Bb4EG8Q0TuzMuDq0AWySN/r+dHQDLQL+BwpOD0BsoD9fAm5JllZq2cc+sCjUry20CgNDA06EAkMkV4Toj0z38U3rGJfZ1zH/rL5vgz4N5vZi84/wDGcOWPUpqE17N6E95Q68uBV80s3jk3Icj48sDwjiXNaHnEMbMY4B28odUtnXPJAYeUI2bWCzgbODnoWPIoCm8yrsHOuWf9ZV+a2VHArWb2sD+E/4gfXESOkJmVwpuVsR7Q3jm3IeCQpIA45352zi30j8m7ECgL3BdwWJKPzKw2MBhvD3RJf2hjRf/utNt5HrolRVck54Qi8vlPmx9iVsjyz4DqwDGFG84RGYbXY3yJc26ac262c+7fwPvA85E6KzpeT3HlDJZX8q93FWIseeK/B2Pxeiw7O+eWBhxSjvg7754FngDi033Ho4BY/3ZskDHmQlbf9Vi8If1HLFK/ZCKB8/+JTAKaAh2dc8sCDkkKiXNuN94w6/oBhyL5qx7eHunxeD/W0i7gjRrYBYTFOTsl/BSBnFAUPv8rMlme1ksZCROpNgKWOOdCJ4FchHeKobA45+4RWEHGRUtDYL1zLpKGV78KXAN0c87NDjqYXKiCN7HVMP7+HT+Ww6dV6hRYdLmT9l0PHZWQL991FcgiR8DfezgBryfxcufcgoBDkkJkZtXxhietDjoWyVc/AedncAGvaDgfb8eIyN8UkZzwE5H/+Z/sX7cPWd4e2OCc21LI8RyJLcAZZlYiZHkzIJ7Dx+xGmo+BmmaWNqkVZlYeuNS/LyKY2TN4px7q55ybEnA4ubWFjL/jW/HOvX0+MD+w6HJnin/dIWR5e7zvSUYTwuWYjkEuAGbWxf8zbUKfi81sO7DdOfdVQGFJ/noJb+KPocABM2ue7r4NkTSsTrJmZpOBH4ClwF7gRLzJH5IJw9MjyJHzRwZ8GbrczAB+d8794z4RX8TnhCLy+Z8OfAG8ZmZVgDVAF+AiIud48BeBicBUM3sZ7xjky/DOST0iXGcdzsFv34+Bb4HxZnYPXm/l/Xg9fk8WdrwZyW4bzGwgcBcwCvgt5Hu+3TkX+E7zHLwPX2awTjywNZy+49lthz+Z3RhgiL+D8ge8Ie83AI/mdUSChflcBRHJzDJ7Ub9yzp1XmLFIwTCzdUCdTO5+xDn3cOFFIwXJT4hXA8fjnZ/yD7wEM1wTdBUP/v/0oc65B4KORcJTUc4Jkfb593slh+MVxpXwTvv0uHPu7UADywUzuxhvwrRT8Ia9rwZGAq8551KCjC0zOfnta2aVgaeBznjb9S1wl3NuSWHEmJ3stsHMvuTwaZ1CjXXO9S2QwHLhSGoQ///XfOdcr4KKK7dy+HkqAfwf0AdvjoF1wEv5MVu9CmQRERERERERdAyyiIiIiIiICKACWURERERERARQgSwiIiIiIiICqEAWERERERERAVQgi4iIiIiIiAAqkEVEREREREQAFchSBJlZXzNzZrbbzCqF3Bfj3/dwAHE97D93TGE/d26YWZSZPWdmm80s1cymhEFMdf3X7oZ8erxj/G1rmW5ZFTMbambLzGy/mcWb2Woze8vMzgtZf4wfT9plu5nNNbMO6dqc59/XNpMY1pnZ+PzYHhGRcKfcnDfKzcrNUnjC+p+BSB5VAAYC9wUdSITpAtwO/Af4FtgRbDgFojOwHW/7MLNTgZmAAS8Ci4Ek4CSgF/CFmR3tnNua7jG2A5f5fx+N93pNN7N2zrnZhbERIiIRSLn5yCg3KzdLIVGBLEXZZ8C/zOw559yWoIMpDGZW0jmXkMeHaeBfP+ecS83l80cD5pxLzmMMBa0z8LFzLtXMYoEPgQNAS+fc9nTtvgBeNbMeeEk5vUTn3IK0G2Y2B1iP9wNGSVhEJGPKzUdGufkw5WYpUBpiLUXZY/714KwapQ2vymD5GDNbl+522lCim8xsuJltMbN9ZjbezOLMrL6ZzfSHAK0ysz6ZPGUDM/vCzA76Q6WGmNnfvov+kKJXzGyjmSWY2S9mNiCkTdpwtXPNbKKZ7QYWZrOtHczsWzM7ZGZ7zGyKmZ2U7v51wMP+zRT/8ftm8XjOH/p0n5mtBRKBRmZWysxGmNly//XYYmZTzezkTLahuZlNMLO9ZrbJzF4ws1LZbEsVM1toZj+bWW1/WXsz+8bftv1mttLM/i9kvfLAecAUf9FVwAnAwJAE/Bfn3NvOuZ1ZxeOc2wv8CtTPql0W23OimU02s23+ELL1/vuqHZkiUpQoN/9zm5SblZsljKhAlqJsM96QnAFmVicfH/d+oAbQB/g/4BrgVWAy8AlwBbAUGG1mp2Sw/hTgc7w9pW8DD/qPA/yVJL4GOuElxE7AVOAVM/tXBo83AViLN/wq0yFr5h2D8wmw34/5ZuBUYL6Z1fSbXQGM8f9u4V8+yewxfX39GO/2rzcBJYFyeD+EOvnPVQpYYGZHZ/AY44DVwJXAK8CteK9zZttSF+81ckAr59x6M6sHfIz3WlyDN8TqWaBMyOqd8H4sfO7fvhBIAWZks51Z8pPlscDuI3yIaUBNvNeqPd57mYD+T4tI0aLcnI5y81+UmyV8OOd00aVIXfCSgsPbW1gZ75/iKP++GP++h9O1f9j7KvzjccYA69LdruuvOyek3Yf+8l7pllUCkoGHQp8HuC9k/deBfUBF//aDQDxwQgbt/gRiQrZzRA5fl8XAb2nr+8uOwxue9Gy6ZY9l9Hpk8pgOL+mWzqZdNBDnb+edGbxXj4S0nwb8msFrfwNwuv+c04G4dG26+G3KZxPLe8DEdLc/BTZn0C7K/7ykXSzks7Eh3X21gNf857/Db3Oef7ttJnGsA8b7f1fx214W9PdHF1100aUgLig3Z/a6KDc75WZdwuuivR9SpDlv6M0zwLXphyvl0acht3/xr2eme95dwDa8vZah3g+5/S5QFm+PMUAHvOFYa82b2TPG3wM6EzgKaBiy/uTsAjazMsBZwHsu3TFIzrm1eHt722T3GFmY4Zw7lMFzXu0Ps9qN94PkAN52ZvQ+hO4JXwbUzqDducBXeHuYL3POHUx33094PyjeNbMuZlYtg5hK4L2+U9IvznizmO4/Xtrl+pD7a6a77w+gB15vwwuZPF5WdgBrgMfNrL+ZnXAEjyEiEhGUmz3KzX/FpNwsYUUFshQHI4CdwJB8erxdIbcTs1ie0bE6WzO5nTaUqhpeskkKuUz07z8qZP3N2YdMJbxkk1HbLXh784/UPx7TzC7F2xv8M15yagacjTe7ZEavSegxRAl4Q8FCdcRL5K+5kMlGnHOr8IY/ReENC9vi/whI/wPjQqA0f0/6fwBVzax0yHP9y4/5MjK2zb+/Cd7e/orOuUfd4clT0uKLzmT96LQ2zjkHtMPrSRgO/Gpma8zs5kzWFRGJdMrNys1plJslrOgAcynynHP7zWw43t7qpzJoEg/eHkznXGK65aHJLr9Ux9sjmf42wEb/egfeP/jbM1l/Zcjtf0xikoFdfruMjjE6mrydLiKj5+8GrHLO9U1bYN6MlHlJ9uANcbsI+NTMLnbOff23QJz7Au+0DyWBlng/vD4xs7rOuT/xji37yjm3O91qc/CGh3Ug3R5/59xvftx1M4klyTm3OItYt/nXNULv8HsdqpHuB5lzbg1eb4rhDVW7DXjZzNY550J7RkREIppyM6DcrNwsYUk9yFJcvIyX5B7L4L7f/eu0YVSYWUXgnAKK5eqQ293wJudY7t+eAZwMrHfOLc7gsi+3T+icOwB8D3Q173QPAPgTpJyDNzQqP8VxeC9tmt5kvsc2p5LwXr/PgBlm1jqjRs65BOfcHOBJvIlAjvOT26X8fQgXwCS8SUieMLOqeYwvvd/wjoW6MoP7LgFK4J2q4m+c5yfgLn/RqaFtRESKCOVm5WblZgk76kGWYsE5l2BmQ4CRGdz9KbAHeN3MHsIbPnQvXmIsCP3NO3XEd3jDjm7Am5hkt3//CLyZHueZ2Qi8vdJl8BJza+fc5Uf4vA/iDV+aZmYv4w2HegRv2585wsfMzAygsx//NKAx8G+OfBbJvzjnksysG94MoZ+aWSfn3FdmdhPe8LfpeEOzquDNtrkJ7wdOc+AY4KOQx0s0syvxjiP7ycxewntvEvH24F/lN83Vjx/nnDOz+4FxZjYJb1bUvXjDvgbh7R2fCWBmpwHP4w19W4X3Y6Uv3g+ZObl5XhGRSKHcDCg3KzdL2FGBLMXJaOAevPPq/cU5t9vMLsFLfu/j7VkcArTFm+0wv10O/BcvKe7B23P+aLp49pjZOXiTSgzEO/5pN14ynnSkT+qcm2FmnYCH8LYzEfgSuNc5t+lIHzcTr+NNgnIdcCNeUruUHExakhPOuWQz64F3PNN0//1bAlyMd5xQNbxjp+YDPZ1zh8ysM7DYObchg8db6ifCu/COy3oAb4TNRv8x2jjn5h5BnOPNbA/eaTbG4P3A+x3v/X/UP74JvGPN1vvPXwtvaOEy4BLn3Pe5fV4RkQii3KzcrNwsYcUOfwZERIouM/sFGOecGxp0LCIiIqLcLOFJBbKIiIiIiIgImqRLREREREREBFCBLCIiIiIiIgKoQBYREREREREBVCCLiIiIiIiIACqQRURERERERAAVyCIiIiIiIiKACmQRERERERERQAWyiIiIiIiICAD/D7Hl3WbUatSdAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "###\n", + "### Saga\n", + "###\n", + "\n", + "plt.rcParams['font.size'] = 16\n", + "plt.rcParams['legend.fontsize'] = 14\n", + "plt.rcParams['axes.linewidth'] = 2\n", + "plt.rcParams['lines.linewidth'] = 2\n", + "\n", + "fig, (ax_weak, ax_strong) = plt.subplots(1, 2, figsize=(16,6))\n", + "\n", + "ax_weak.plot(singlenode_weak_scaling_profiling_data[\"n_processes\"][0:4].to_numpy(dtype=\"int\"), \n", + " speedup(singlenode_weak_scaling_profiling_data[\"t_full_step\"][0], singlenode_weak_scaling_profiling_data[\"t_full_step\"][0:4]), \n", + " label=\"Single-node runtime (no init or file I/O)\", marker=\"x\")\n", + "\n", + "ax_weak.plot(multinode_weak_scaling_profiling_data[\"n_processes\"][0:3].to_numpy(dtype=\"int\"), \n", + " speedup(singlenode_weak_scaling_profiling_data[\"t_full_step\"][0], multinode_weak_scaling_profiling_data[\"t_full_step\"][0:3]), \n", + " label=\"2–4 nodes runtime (no init or file I/O)\", marker=\"o\", color=\"green\")\n", + "\n", + "ax_weak.locator_params(axis=\"x\", nbins=4)\n", + "\n", + "ax_weak.plot(nproc[0:4], np.ones(len(nproc[0:4])), label=\"Ideal runtime (constant)\", linestyle=\"dotted\", color=\"orange\")\n", + "\n", + "ax_weak.set_xlabel(\"Number of ranks/GPUs\")\n", + "ax_weak.set_ylabel(\"Efficiency\")\n", + "ax_weak.legend(loc=\"upper left\", bbox_to_anchor=[0.0, 0.8])\n", + "\n", + "##############################################\n", + "\n", + "#ax_strong.plot(singlenode_strong_scaling_profiling_data[\"n_processes\"].to_numpy(dtype=\"int\"), \n", + "# speedup(singlenode_strong_scaling_profiling_data[\"t_full_step\"][0], singlenode_strong_scaling_profiling_data[\"t_full_step\"])*4, \n", + "# label=\"Single-node (no init or file I/O)\", marker=\"x\")\n", + "\n", + "ax_strong.plot(multinode_strong_scaling_profiling_data[\"n_processes\"].to_numpy(dtype=\"int\"), \n", + " speedup(multinode_strong_scaling_profiling_data[\"t_full_step\"][0], multinode_strong_scaling_profiling_data[\"t_full_step\"])*4, \n", + " label=\"Four nodes runtime (no init or file I/O)\", marker=\"o\")\n", + "\n", + "ax_strong.locator_params(axis=\"x\", nbins=16)\n", + "\n", + "ax_strong.plot(nproc[0:], nproc[0:], label=\"Ideal runtime (linear)\", linestyle=\"dotted\")\n", + "\n", + "ax_strong.set_xlabel(\"Number of ranks/GPUs\")\n", + "ax_strong.set_ylabel(\"Speedup\")\n", + "ax_strong.legend(loc=\"upper left\")\n", + "fig.show()\n", + "\n", + "fig.savefig(\"saga-scaling.pdf\", bbox_inches='tight')" + ] + }, { "cell_type": "code", "execution_count": 18, @@ -645,11 +643,8 @@ } ], "metadata": { - "interpreter": { - "hash": "5ec8a684eb355694b427c525a814c01edbb663f485e9b356374be21a7726d858" - }, "kernelspec": { - "display_name": "Python 3.7.12 ('ShallowWaterGPU')", + "display_name": "Python 3.7.12 ('ShallowWaterGPU_HPC')", "language": "python", "name": "python3" }, @@ -664,6 +659,11 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.12" + }, + "vscode": { + "interpreter": { + "hash": "cb8fa661d82d1ec49918052345889e962ab1d5f5f5cbd9596ba31c436e222a26" + } } }, "nbformat": 4, diff --git a/saga_scaling_benchmark.job b/saga_scaling_benchmark.job index 7944eec..4ba1297 100644 --- a/saga_scaling_benchmark.job +++ b/saga_scaling_benchmark.job @@ -16,7 +16,8 @@ #SBATCH --partition=accel # # Max memory usage per task (core) - increasing this will cost more core hours: -#SBATCH --mem-per-cpu=3800M +##SBATCH --mem-per-cpu=3800M +#SBATCH --mem-per-cpu=24G # #SBATCH --qos=devel @@ -26,6 +27,8 @@ module restore system # instead of 'module purge' rather set module environment to the system default module load CUDA/11.4.1 +#module load CUDA/11.1.1-GCC-10.2.0 +#module load OpenMPI/4.0.5-gcccuda-2020b # It is also recommended to to list loaded modules, for easier debugging: module list @@ -40,12 +43,23 @@ cp -r . $SCRATCH/ShallowWaterGPU ## Make sure the results are copied back to the submit directory (see Work Directory below): # chkfile MyResultFile # chkfile is replaced by 'savefile' on Saga -savefile "$SCRATCH/ShallowWaterGPU/*.log" -savefile "$SCRATCH/ShallowWaterGPU/*.nc" -savefile "$SCRATCH/ShallowWaterGPU/*.json" +#savefile "$SCRATCH/ShallowWaterGPU/*.log" +#savefile "$SCRATCH/ShallowWaterGPU/*.nc" +#savefile "$SCRATCH/ShallowWaterGPU/*.json" +#savefile "$SCRATCH/ShallowWaterGPU/*.qdrep" + +cleanup "rm -rf $SCRATCH/ShallowWaterGPU" + +export OMPI_MCA_opal_cuda_support=true ## Do some work: cd $SCRATCH/ShallowWaterGPU -srun $HOME/.conda/envs/ShallowWaterGPU_HPC/bin/python3 --version -srun $HOME/.conda/envs/ShallowWaterGPU_HPC/bin/python3 mpiTesting.py -nx $NX -ny $NY --profile +srun /cluster/projects/nn9882k/martinls/.conda/envs/ShallowWaterGPU_HPC/bin/python3 --version +srun /cluster/projects/nn9882k/martinls/.conda/envs/ShallowWaterGPU_HPC/bin/python3 mpiTesting.py -nx $NX -ny $NY --profile +cd $HOME/src/ShallowWaterGPU +mkdir -p output_saga/$NOW/$SLURM_JOB_ID +mv $SCRATCH/ShallowWaterGPU/*.log ./output_saga/$NOW/$SLURM_JOB_ID +mv $SCRATCH/ShallowWaterGPU/*.nc ./output_saga/$NOW/$SLURM_JOB_ID +mv $SCRATCH/ShallowWaterGPU/*.json ./output_saga/$NOW +mv $SCRATCH/ShallowWaterGPU/*.qdrep ./output_saga/$NOW diff --git a/saga_strong_scaling_benchmark.sh b/saga_strong_scaling_benchmark.sh index c16944f..e550aca 100644 --- a/saga_strong_scaling_benchmark.sh +++ b/saga_strong_scaling_benchmark.sh @@ -1,12 +1,30 @@ #!/bin/bash -# one node: 1-4 GPUs -sbatch --nodes=1 --gpus-per-node=1 --ntasks-per-node=1 --export=ALL,NX=8192,NY=8192 saga_scaling_benchmark.job -sbatch --nodes=1 --gpus-per-node=2 --ntasks-per-node=2 --export=ALL,NX=8192,NY=4096 saga_scaling_benchmark.job -sbatch --nodes=1 --gpus-per-node=3 --ntasks-per-node=3 --export=ALL,NX=8192,NY=2731 saga_scaling_benchmark.job -sbatch --nodes=1 --gpus-per-node=4 --ntasks-per-node=4 --export=ALL,NX=8192,NY=2048 saga_scaling_benchmark.job +TIMESTAMP=$(date "+%Y-%m-%dT%H%M%S") -# 2-4 nodes: 1 GPUs per node -sbatch --nodes=2 --gpus-per-node=1 --ntasks-per-node=1 --export=ALL,NX=8192,NY=4096 saga_scaling_benchmark.job -sbatch --nodes=3 --gpus-per-node=1 --ntasks-per-node=1 --export=ALL,NX=8192,NY=2731 saga_scaling_benchmark.job -sbatch --nodes=4 --gpus-per-node=1 --ntasks-per-node=1 --export=ALL,NX=8192,NY=2048 saga_scaling_benchmark.job +# one node: 1–4 GPUs +sbatch --nodes=1 --gpus-per-node=1 --ntasks-per-node=1 --export=ALL,NX=20480,NY=20480,NOW=$TIMESTAMP saga_scaling_benchmark.job # 1 ranks +sbatch --nodes=1 --gpus-per-node=2 --ntasks-per-node=2 --export=ALL,NX=20480,NY=10240,NOW=$TIMESTAMP saga_scaling_benchmark.job # 2 ranks +sbatch --nodes=1 --gpus-per-node=3 --ntasks-per-node=3 --export=ALL,NX=20480,NY=6826,NOW=$TIMESTAMP saga_scaling_benchmark.job # 3 ranks +sbatch --nodes=1 --gpus-per-node=4 --ntasks-per-node=4 --export=ALL,NX=20480,NY=5120,NOW=$TIMESTAMP saga_scaling_benchmark.job # 4 ranks + +# 4 nodes: 1–4 GPUs per node +sbatch --nodes=4 --gpus-per-node=1 --ntasks-per-node=1 --export=ALL,NX=20480,NY=5120,NOW=$TIMESTAMP saga_scaling_benchmark.job # 4 ranks +sbatch --nodes=4 --gpus-per-node=2 --ntasks-per-node=2 --export=ALL,NX=20480,NY=2560,NOW=$TIMESTAMP saga_scaling_benchmark.job # 8 ranks +sbatch --nodes=4 --gpus-per-node=3 --ntasks-per-node=3 --export=ALL,NX=20480,NY=1706,NOW=$TIMESTAMP saga_scaling_benchmark.job # 12 ranks +sbatch --nodes=4 --gpus-per-node=4 --ntasks-per-node=4 --export=ALL,NX=20480,NY=1280,NOW=$TIMESTAMP saga_scaling_benchmark.job # 16 ranks + +# 4 nodes: 1–4 GPUs per node +sbatch --nodes=4 --gpus-per-node=1 --ntasks-per-node=1 --export=ALL,NX=40960,NY=10240,NOW=$TIMESTAMP saga_scaling_benchmark.job # 4 ranks +sbatch --nodes=4 --gpus-per-node=2 --ntasks-per-node=2 --export=ALL,NX=40960,NY=5120,NOW=$TIMESTAMP saga_scaling_benchmark.job # 8 ranks +sbatch --nodes=4 --gpus-per-node=3 --ntasks-per-node=3 --export=ALL,NX=40960,NY=3413,NOW=$TIMESTAMP saga_scaling_benchmark.job # 12 ranks +sbatch --nodes=4 --gpus-per-node=4 --ntasks-per-node=4 --export=ALL,NX=40960,NY=2560,NOW=$TIMESTAMP saga_scaling_benchmark.job # 16 ranks + +## one node: 1–4 GPUs +#sbatch --nodes=1 --gpus-per-node=4 --ntasks-per-node=4 --export=ALL,NX=24576,NY=6144,NOW=$TIMESTAMP saga_scaling_benchmark.job # 4 ranks +# +## 4 nodes: 1–4 GPUs per node +#sbatch --nodes=4 --gpus-per-node=1 --ntasks-per-node=1 --export=ALL,NX=24576,NY=6144,NOW=$TIMESTAMP saga_scaling_benchmark.job # 4 ranks +#sbatch --nodes=4 --gpus-per-node=2 --ntasks-per-node=2 --export=ALL,NX=24576,NY=3072,NOW=$TIMESTAMP saga_scaling_benchmark.job # 8 ranks +#sbatch --nodes=4 --gpus-per-node=3 --ntasks-per-node=3 --export=ALL,NX=24576,NY=2048,NOW=$TIMESTAMP saga_scaling_benchmark.job # 12 ranks +#sbatch --nodes=4 --gpus-per-node=4 --ntasks-per-node=4 --export=ALL,NX=24576,NY=1536,NOW=$TIMESTAMP saga_scaling_benchmark.job # 16 ranks diff --git a/saga_weak_scaling_benchmark.sh b/saga_weak_scaling_benchmark.sh new file mode 100644 index 0000000..70da66b --- /dev/null +++ b/saga_weak_scaling_benchmark.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +TIMESTAMP=$(date "+%Y-%m-%dT%H%M%S") + +# one node: 1-4 GPUs +sbatch --nodes=1 --gpus-per-node=1 --ntasks-per-node=1 --export=ALL,NX=20480,NY=20480,NOW=$TIMESTAMP saga_scaling_benchmark.job # 1 ranks +sbatch --nodes=1 --gpus-per-node=2 --ntasks-per-node=2 --export=ALL,NX=20480,NY=20480,NOW=$TIMESTAMP saga_scaling_benchmark.job # 2 ranks +sbatch --nodes=1 --gpus-per-node=3 --ntasks-per-node=3 --export=ALL,NX=20480,NY=20480,NOW=$TIMESTAMP saga_scaling_benchmark.job # 3 ranks +sbatch --nodes=1 --gpus-per-node=4 --ntasks-per-node=4 --export=ALL,NX=20480,NY=20480,NOW=$TIMESTAMP saga_scaling_benchmark.job # 4 ranks + +# 2-4 nodes: 1 GPUs per node +sbatch --nodes=2 --gpus-per-node=1 --ntasks-per-node=1 --export=ALL,NX=20480,NY=20480,NOW=$TIMESTAMP saga_scaling_benchmark.job # 2 ranks +sbatch --nodes=3 --gpus-per-node=1 --ntasks-per-node=1 --export=ALL,NX=20480,NY=20480,NOW=$TIMESTAMP saga_scaling_benchmark.job # 3 ranks +sbatch --nodes=4 --gpus-per-node=1 --ntasks-per-node=1 --export=ALL,NX=20480,NY=20480,NOW=$TIMESTAMP saga_scaling_benchmark.job # 4 ranks + +## one node: 1-4 GPUs +#sbatch --nodes=1 --gpus-per-node=1 --ntasks-per-node=1 --export=ALL,NX=12288,NY=12288,NOW=$TIMESTAMP saga_scaling_benchmark.job # 1 ranks +#sbatch --nodes=1 --gpus-per-node=2 --ntasks-per-node=2 --export=ALL,NX=12288,NY=12288,NOW=$TIMESTAMP saga_scaling_benchmark.job # 2 ranks +#sbatch --nodes=1 --gpus-per-node=3 --ntasks-per-node=3 --export=ALL,NX=12288,NY=12288,NOW=$TIMESTAMP saga_scaling_benchmark.job # 3 ranks +#sbatch --nodes=1 --gpus-per-node=4 --ntasks-per-node=4 --export=ALL,NX=12288,NY=12288,NOW=$TIMESTAMP saga_scaling_benchmark.job # 4 ranks + +## 2-4 nodes: 1 GPUs per node +#sbatch --nodes=2 --gpus-per-node=1 --ntasks-per-node=1 --export=ALL,NX=12288,NY=12288,NOW=$TIMESTAMP saga_scaling_benchmark.job # 2 ranks +#sbatch --nodes=3 --gpus-per-node=1 --ntasks-per-node=1 --export=ALL,NX=12288,NY=12288,NOW=$TIMESTAMP saga_scaling_benchmark.job # 3 ranks +#sbatch --nodes=4 --gpus-per-node=1 --ntasks-per-node=1 --export=ALL,NX=12288,NY=12288,NOW=$TIMESTAMP saga_scaling_benchmark.job # 4 ranks \ No newline at end of file