From 3aadf2f3163da322b578bd44d54eb0c227f74bb3 Mon Sep 17 00:00:00 2001 From: Rashid Kaleem <230885705+arekay-nv@users.noreply.github.com> Date: Mon, 27 Apr 2026 20:41:19 -0500 Subject: [PATCH 1/4] Consolidate llama examples Signed-off-by: Rashid Kaleem <230885705+arekay-nv@users.noreply.github.com> --- examples/05_Llama3.1-8B_Example/README.md | 62 - examples/05_Llama_Examples/README.md | 107 ++ .../05_Llama_Examples/calibration-list.txt | 1000 +++++++++++++++++ .../download_cnndm.py | 3 +- .../offline_llama3_8b_cnn.yaml | 0 .../online_llama2_70b_orca.yaml | 0 .../online_llama3_8b_cnn.yaml | 0 .../qwen-multiple-concurrency.yaml | 48 + examples/06_Llama2-70B_Example/README.md | 58 - examples/README.md | 8 +- 10 files changed, 1159 insertions(+), 127 deletions(-) delete mode 100644 examples/05_Llama3.1-8B_Example/README.md create mode 100644 examples/05_Llama_Examples/README.md create mode 100644 examples/05_Llama_Examples/calibration-list.txt rename examples/{05_Llama3.1-8B_Example => 05_Llama_Examples}/download_cnndm.py (99%) rename examples/{05_Llama3.1-8B_Example => 05_Llama_Examples}/offline_llama3_8b_cnn.yaml (100%) rename examples/{06_Llama2-70B_Example => 05_Llama_Examples}/online_llama2_70b_orca.yaml (100%) rename examples/{05_Llama3.1-8B_Example => 05_Llama_Examples}/online_llama3_8b_cnn.yaml (100%) create mode 100644 examples/05_Llama_Examples/qwen-multiple-concurrency.yaml delete mode 100644 examples/06_Llama2-70B_Example/README.md diff --git a/examples/05_Llama3.1-8B_Example/README.md b/examples/05_Llama3.1-8B_Example/README.md deleted file mode 100644 index d42ae123..00000000 --- a/examples/05_Llama3.1-8B_Example/README.md +++ /dev/null @@ -1,62 +0,0 @@ -# Running Endpoints with [Llama3.1-8B](https://huggingface.co/meta-llama/Llama-3.1-8B-Instruct) - -It is recommended to use a config file such as [online_llama3_8b_cnn.yaml](online_llama3_8b_cnn.yaml) to run the benchmark. - -## [Optional] Download dataset - -The Llama3.1-8B benchmark uses the [cnn/dailymail](https://huggingface.co/datasets/abisee/cnn_dailymail) dataset (for summarization). If using a config (such as provided) to run the benchmark, the (validation) dataset is downloaded automatically by specifying dataset name as `- name: cnn_dailymail::llama3_8b` under the `dataset` entry. - -For post-training quantization, users can use the [cnn-dailymail-calibration-list](https://github.com/mlcommons/inference/blob/v4.0/calibration/CNNDailyMail/calibration-list.txt) to select samples for the calibration. - -``` -curl -OL https://raw.githubusercontent.com/mlcommons/inference/v4.0/calibration/CNNDailyMail/calibration-list.txt -uv run python download_cnndm.py --save-dir data --calibration-ids-file calibration-list.txt --split train -``` - -## Launch the server - -The following environment variables are used by the commands below to make the scripts easier to run: - -``` -export HF_TOKEN= -export HF_HOME= -export MODEL_NAME= -``` - -Download the model to the local HuggingFace cache before launching the container. This allows the container to reuse the already-downloaded weights via the volume mount rather than downloading them at startup: - -``` -hf download $MODEL_NAME -``` - -The cached models can be verified with `hf cache scan`. - -### [vLLM](https://github.com/vllm-project/vllm) - -**Note**: To generate same outputs as the ones produced from submissions with legacy loadgen, we need to apply a custom chat template (this is taken care of automatically by the cnn-dailymail dataset preset). The flag `--trust-request-chat-template` is also required for this behavior. **Security warning:** `--trust-request-chat-template` allows execution of request-provided chat templates and should only be used in trusted environments or when all requests are controlled by the benchmark harness/preset. Do not enable this flag on publicly exposed endpoints receiving untrusted traffic. - -We can launch the latest docker image for vllm using the command below: - -``` -docker run --runtime nvidia --gpus all -v ${HF_HOME}:/root/.cache/huggingface --env "HUGGING_FACE_HUB_TOKEN=$HF_TOKEN" -p 8000:8000 --ipc=host vllm/vllm-openai:latest --model ${MODEL_NAME} --trust-request-chat-template -``` - -### To run Offline mode - -**Note** Double-check the config file for correct parameters such as the model name in the config - -- Launch the benchmark with config yaml - -``` -uv run inference-endpoint benchmark from-config -c offline_llama3_8b_cnn.yaml --timeout 600 -``` - -### To run Online mode - -**Note** Double-check the config file for correct parameters - -- Launch the benchmark with config yaml (For performance only, remove the accuracy dataset entry in the `online_llama3_8b_cnn.yaml`) - -``` -uv run inference-endpoint benchmark from-config -c online_llama3_8b_cnn.yaml --timeout 600 -``` diff --git a/examples/05_Llama_Examples/README.md b/examples/05_Llama_Examples/README.md new file mode 100644 index 00000000..2049674c --- /dev/null +++ b/examples/05_Llama_Examples/README.md @@ -0,0 +1,107 @@ +# Running Endpoints with Llama Models + +This example covers benchmarking two Llama models: + +- **[Llama-3.1-8B-Instruct](https://huggingface.co/meta-llama/Llama-3.1-8B-Instruct)** — CNN/DailyMail summarization, offline and online modes +- **[Llama-2-70b-chat-hf](https://huggingface.co/meta-llama/Llama-2-70b-chat-hf)** — Open Orca, online (Poisson) mode + +--- + +## Llama-3.1-8B-Instruct + +### Dataset + +The Llama3.1-8B benchmark uses the [cnn/dailymail](https://huggingface.co/datasets/abisee/cnn_dailymail) dataset. When using the provided config files, the validation split is downloaded automatically by specifying the dataset name as `- name: cnn_dailymail::llama3_8b`. + +For post-training quantization calibration, use the [cnn-dailymail-calibration-list](https://github.com/mlcommons/inference/blob/v4.0/calibration/CNNDailyMail/calibration-list.txt): + +```bash +curl -OL https://raw.githubusercontent.com/mlcommons/inference/v4.0/calibration/CNNDailyMail/calibration-list.txt +uv run python download_cnndm.py --save-dir data --calibration-ids-file calibration-list.txt --split train +``` + +### Environment + +```bash +export HF_TOKEN= +export HF_HOME= +export MODEL_NAME=meta-llama/Llama-3.1-8B-Instruct +hf download $MODEL_NAME +``` + +### Launch the server + +**Note:** To generate outputs matching MLPerf submissions from legacy loadgen, apply a custom chat template (handled automatically by the `cnn_dailymail::llama3_8b` preset). The `--trust-request-chat-template` flag is required. **Security warning:** this flag allows execution of request-provided chat templates and should only be used in trusted environments. Do not enable it on publicly exposed endpoints. + +```bash +docker run --runtime nvidia --gpus all \ + -v ${HF_HOME}:/root/.cache/huggingface \ + --env "HUGGING_FACE_HUB_TOKEN=$HF_TOKEN" \ + -p 8000:8000 \ + --ipc=host \ + vllm/vllm-openai:latest --model ${MODEL_NAME} --trust-request-chat-template +``` + +### Offline mode + +```bash +uv run inference-endpoint benchmark from-config -c offline_llama3_8b_cnn.yaml --timeout 600 +``` + +### Online mode + +```bash +uv run inference-endpoint benchmark from-config -c online_llama3_8b_cnn.yaml --timeout 600 +``` + +--- + +## Llama-2-70b-chat-hf + +### Dataset + +Download the preprocessed Open Orca dataset from the MLCommons R2 bucket. Navigate to your desired download directory and run: + +```bash +bash <(curl -s https://raw.githubusercontent.com/mlcommons/r2-downloader/refs/heads/main/mlc-r2-downloader.sh) \ + https://inference.mlcommons-storage.org/metadata/llama-2-70b-open-orca-dataset.uri +``` + +The dataset will be downloaded automatically to `./open_orca`. Additional instructions for downloading the model and dataset are in the [Reference Implementation for llama2-70b](https://github.com/mlcommons/inference/tree/master/language/llama2-70b). + +### Environment + +Go to [meta-llama/Llama-2-70b-chat-hf](https://huggingface.co/meta-llama/Llama-2-70b-chat-hf) and request access, then create a HuggingFace access token with read permissions. + +```bash +export MODEL_NAME=meta-llama/Llama-2-70b-chat-hf +export HF_TOKEN= +export HF_HOME= +hf download $MODEL_NAME +``` + +### Accuracy evaluation setup (optional) + +Accuracy evaluation requires additional packages. Skip this for performance-only runs. + +```bash +uv pip install nltk evaluate rouge_score +uv run python -c 'import nltk; nltk.download("punkt"); nltk.download("punkt_tab")' +``` + +### Launch the server + +```bash +docker run --runtime nvidia --gpus all \ + -v ${HF_HOME}:/root/.cache/huggingface \ + --env "HUGGING_FACE_HUB_TOKEN=$HF_TOKEN" \ + -p 8000:8000 \ + --ipc=host \ + vllm/vllm-openai:latest --model ${MODEL_NAME} --gpu-memory-utilization 0.95 +``` + +### Online mode + +```bash +uv run inference-endpoint benchmark from-config -c online_llama2_70b_orca.yaml --timeout 600 +``` diff --git a/examples/05_Llama_Examples/calibration-list.txt b/examples/05_Llama_Examples/calibration-list.txt new file mode 100644 index 00000000..fc5d2588 --- /dev/null +++ b/examples/05_Llama_Examples/calibration-list.txt @@ -0,0 +1,1000 @@ +eceaa658027ad9625f832368198e11bd2fa38977 +70052e55c12c97a9bf6796a25b6ced8f3ec4be06 +9767fdf0a53da6ee9e2f75582cac5964d80e1b5d +1f8c736647d06c42beb553b25a02e44ca15ca0fb +d3ce7d615ecc15f094d8130654812ad77cd604a3 +55086c3f69cb41b991d3db0c6b10b0aa374788b4 +2745f93afca3edf25dd9ccfd094eef06298f62cb +343644770a597a2dfa7548ba165fa9c6bdc88245 +e2cecb8734918ac6a2d9cc8afcfafb16b1781ae2 +feba32aa9aa3b51fb451bc48a54e78d02efe977f +9c2e4d2f6085ef9f237e6fe1baf83000a264cf93 +d85158494b7041560466f153c4d050362f90a7e6 +1e14852c49e84434ca249951e0fe603610eb68f6 +369d721d1102f0cad726ad3426d79c965a224b28 +b9898d6014353a7411c0cec222996431c832c35f +7cbe104b3203061bb544267879fa316436a1ab5f +f48a6b4fa0827b4c6324bd47dc2e8954141b1a6a +acb5ce76c230bc66633414678bf254387c3d6c85 +d70d5115ec3adc5fb3aee8b1e29c7f0f2db083be +ffbe89f592457d39ab9c28de4fd89fbac2150f81 +d841808ba87a4aabbfe4427c53eb0e2e8a74995c +2d4125c6162f9b4924a262a55bd8fe3faad0b3c7 +95fbe3b3a7e5fb6fa48289885df25d9a6e911d2d +f6ffa98e7d46000bee325e5284a2ac897ba4149d +31e424f7a6fe1f5ec61486eec17a85c78ca2ce8c +2165fd490b9d14ce0cd3784beb2f4a1d10028a1d +4d6b1a85d264397e956c0a03f70de123ed4fff5f +4d20111e71a06547613e161292a51cc44eb74da0 +b90b35dfde9fc08fe1651e36bc02a3f1503e3b6e +2d3b2eb21a6691c764aaa1f27030453fc44331ab +dbf02196bae40e0adbcd1790294748a560b1e45c +0ef5c715acd7a70f51a9d800c9e01bfe69657bed +f0f65f40fc56b69bbfab5d88a157dc52ad967484 +db3575fd124f65a7aeee7b4512b5e0fbebf2c8ea +1234fafb7b6ecc9224d6d979536115771467f4ae +c31f79babaf4d93609ef3ee2966e25428a4fc130 +600b619001a9d840f5bb5ee3362787ee38df26fd +5e68842017bc6f5806d962ae5ddea8490d763b82 +fa87334256af163f8f56d8035d1be4c7909147e9 +826f2414623f8e444725f1c9af593f27b440ebdc +3603896c0fbb49d6231ced092ff7d057db2c43f1 +4b8505e0219b78f9645fb12177d97b8e29821ee5 +3332226f8b4f6c46ed3c66ad0765c3720475254f +97223b7119e264a598afe67e0ba82fbb97fedd2b +87fd2fd13729ba13920591bcc96a83ddf61625e0 +2160c5d812611becf442b5079a7908c2f48f6de7 +559d3b10273acbd4b98ff5557aee92f33e50129d +273c1d2936592874fb599f39dce8d6a0813a49b3 +3e6affd8cc6ead338996574fe1d0cb03ca983ea2 +3b733db6e80a89bb4062c1e661b9f9d4690ea0c8 +4a0f219f4b67d9cda499b71e3ee54bff5736f8c1 +064396600b73dc4418ef783fc82f4fe1ff038f6d +eee1cbcef13cd16096734414da992aa1a7048bee +e190b373844d5d3a59b9abb867de8f0fdffddeda +8700aeab383d481d613759f19717ea4381df1433 +087b05a98112135d9fb1c7628fffb72ae2456e9e +f69c5a3c9ef4bfb195ad7ce2590021121a7afced +82958d258a7fe963f8c9a001010365437bf15fc2 +b6b37b9bc60519fd214d6e980fcbb16da066eb68 +a49ac163d47c1e690f5d3237433194a9d0ab558a +aa35fa6f613b29bf80806552b1bf260f04bbedc2 +c248fc3e54b451a4117f23f5adc88cb8067be3aa +f21eae7e796721088234b885bc6eae0daef05738 +b5c4d6f671adfb997abb53a5f2f54519180df7b5 +457b2ab2b4edb94c4b67c1219451be80dc369e8b +e80b0028e44685e39581ced42c1e1ed9cf44f74e +c2d90734f9228cf3163187ad72405c90bb09d13b +a999f5732f9bbe0991e6e895f9bfd42bdda75bf1 +cea6ac133923e62b186aeb17db37be6640a81200 +7facc85e37ababb8c029257f246fe0934f84a808 +21dcf444d4bec9d4b2a6ffb54112c4cbb797025f +f880779ad1b262aac438a8cf3a6df9c0ecebdada +7313410020b93dea1f223d2ffc0b997385d7886c +b0b2948eac6b4e082bbd420da8dff3de6a187377 +360b51c738cde3fa09cef18c3d7672a1d20d3379 +cdaa77a96e1d96a672548b6dc0bd83bffe6f1619 +cd2cb113b1cd90e2ad235466df3a64dfc956877a +7140dd21ed480a3f47a59c647c1f4e690939caf0 +f2c9d3d8f0622e67574f386197b92570730fa61c +010cd75a5b587285f7697cdb6db6526bcc0320b2 +86983b2cddcc91369ad7d4ff61c9e6d258c78b71 +bad5a939cc0d695a97e7f3fedac53c93f04c3253 +0b8cb37a8d54e1761b3d99b8a6e6f921f07e00ae +613111ac2a3831a7291656bee2def306453552d4 +0e29e9cf2a08c4b35ba840bde03b0537e3821a74 +2f425306562bf94bf5f4567b8c63c5b204a2c414 +8bdc6411954d7163b137c4970f6d6431aeeb9ee6 +be9ef18a4a0a08f94a0340b2df0d0f83144299b0 +cafdb2911d9af6038659354058586d6bd5174338 +0c14f1a16ad395dd9aff4437452cf555ae8858d2 +c3db5ce828128fc91c5bbf59d144e825f49ad271 +273221df42c8dd9e0296cf3ec203c59fa205ecd2 +5abe61623d56bbb0d7bbc79f5ffa96732b3a1d97 +98d6f13e4f3ed36591298430dcb49bddf89003b5 +18686c211cc5f466c48fb8dfaf5eaa00cf3ef0ee +d85b6f625e9e57efaa1e3c21e626dd25e3414758 +69e2ec5703156e86990ba690b2a9d4dd0f5733b0 +cc665a9316a9b22400183776d396940ffeea2fde +319a27f92609641ee0f0fe1f6a88a9aab739b98a +94817c53b53b3979c3d32d197ec26dc489921e6b +c803d0b957abefb26e1fe0ad87aea5fc80180a20 +6c5b9c68e7890f4b683e148ac62dace194b45b59 +b377a0f9dac858e2bf7271bac531591140a56e33 +6604ac30dd3d9a29faf40def3e4549feab4d9d02 +b7fc4ea36690353003cd172e597c456534bb2811 +b42286dd9b577bcc261e838045e51133266f7fce +73f9e1772ab372f36898dc95ef18711434827717 +838a481841bf69bbe3ac8a3b53da54d692ffd084 +0a1c17d84f846eecce39356447e4d556ffdd07fa +98f8a09b98daa05cd412e83d724e4b914e8d921f +f859c4b5c39653753b21c575a98d525fc47c16bf +2abf786570b9f9de945c70d9678cb67dd2a2e57e +f4a4d960ecfb87fe06e38f56310a14d23caddb42 +d96bcf6baf6cf8c61d54ad9c9abd997bab870077 +c6eaf9d97b059f3e824a1ab4ffdfe45494e5f8a1 +8bbbd3d05e22fc3372abdbb471799bd5f5380a75 +09dba9542ee64697d789d47ecd3bd53bc8b0d953 +7d42400c49f9cb313345f7d9ea74c51d0147a4f8 +1f58239bc2fa91c3787bda0c2b9ca5cffaa7510d +a0e187806f8ec8f02e0d329ac114ac44fe69a4b4 +ad2e90052e15364c93011386322f6a5007314348 +adba3dadc7c6a3177346ba9119a8df8f5b81ae0c +af2d712599be471d1ba0b91fa18c347220ca595d +77c610007679f13e1f5d314ddcf4b14c7e57876b +0b1d14b9f6619ced37003ff77f22dbd122fca645 +310fe57a8497cb5215c1d70d9f9a22ab91d5c054 +7056abbadea0a2eec779e157890219171bc98938 +3863aca32c99daf6ef8a0de6f60471bd9c54b885 +b32151c4d36a4b42e9b832e14f539396627f8eae +f72c81d6c240a6dc8395c6ef33b64edc423b1fae +4409a8f066166ba9aad02611f6979b44fc91afae +75474ebca7f3413b4e814794d6ffc13663120bae +55e430f0c68f6f0c4cc996fcb87c2e53233e2738 +5dc954a346ff3dba1629e03f3e6485235d6d4742 +95a92435cdb8f2b51ede4ce6220c5613c8dbfc2c +a39a529543dcbd6c0088cc301bd82173feb5f18d +2b8179710437421d5a1f0d281515725ccebff3f3 +087f4bd441c0032caec0a1f65a139d336a09d133 +3636a522fd19a2ae4ff514319d5c1fc012c4bcb6 +c5f38edba57d815658097ba5ebe37532ca160d7f +b0f17178ff8d37e5343119bd8917e262f386203d +dedac076c1649b0edf55353e9bd374c0cd4ad956 +9a3e0978753d5354eaebdcec8550641314c71b83 +0c9881539c0c5249e911dd70b37cf7f74327b97d +80e02450839ab9c1a08082e404c6f0398ae2e92f +6e85c4357ae3dccaae1b354641d22a359a100d47 +b05f9fa99ca30d7ce2611a6deb139f2274d1ad3b +306a3efeb8ab8919079525b9aa747093bdcab563 +98c31464a9052c1ccddc9cbb71c2529f3fba6f4d +35ffb93ea7e6cb006d5019185815f03c67b94d77 +2f3f088adba0256b27e6da9efce4293106e34291 +02d287e484a9da84424d10eeb0c8f3ae52cbc70c +33dedcbe9423f6031122f8be1f7c2c69ea4ad4ad +03765604d9073697904c2dc4cf29e90b924f36f0 +d2845ecaded68fdc5b372d10c3663441ec8b358d +4cd67a6ead5211ad92e1faaaf71ef28f7da2f593 +806333db217efd7e2a4562bb73e695bad88e712c +1307f117d423d143e6083faa99255c2bf2a2f3fd +c92b96b8114ec521af30fc090cef40c07f9544d6 +04b3d6adf722b3b33524c8d288c74e7db2632a2a +ee5db06cf8ca3010774965c3674c273c680c1611 +709e0af32c2463474cb8ffb85d2dbc07960037c5 +d503ee11d8f7d43c67841ba1b6bd863a6180a223 +709555f0f163e09098b58d03898a9e0d6e7ca0b2 +010f73477cd20c14cab78ad9cef350ac8c0f55b3 +9e95f4744d105fbcbc32a12db7287cb64254325c +6e47b7f6a76cc2728e61f4bdd30bef697d6490d2 +5620139a78269335505edf23a902bb0c9c264e3e +70908608fd62696f99cb3f7a185b226fe32e475d +0e907ac0dd02b47f4a0726790d01f0c57037ec2f +bab2d77edbb5ffb3a7938f16fabd7ad3cc83fae9 +f5d5c855f2e708067e3532980aef101d20c40cab +c50895475b8a401824cc9f1bfaaa8fd7797e172c +98690365a6ab1e82c25ca08c26db63a834c21fb9 +3368d60307efa2661820d3240854967fbbf6fbc9 +1f7b9e38af5bfddef1649c83b119e45063bbee34 +3fc0feedd683b49702d0da9d7d3c36b7be02ca09 +2014aa562c1d05dbbba727db120d9e163fb8f43a +e22249a8da0886b4c1338dbf2e54b766b13f4db6 +8344960457778ea0a4fdbba33e7eebb69aa979bf +2c7fb7b897db7f304961e919cd5ef1a5a93877a4 +e2b409c9d97825acad579abe22e0a37b685d6ca9 +b2fadf8584ecefe2a32cc2eba6590d10dc8a9d26 +5f201c66bf26298986c3dd2aa84818a312a596e3 +8dffb657ffd1e331b99cc00cebf18645e219da12 +3236d66fb8a63916b6fd00c2f2ec417b5cde01b6 +95cf024d3f1e40344f16cf4faab052d6fb1e60cb +9faac843955464da41331af273942e38561c9a8f +d383fbcb1a69ef97a660318a2b36486e5fdd6a44 +9939959cf9cb1a14497e63aec0b88a08ad3e451c +3c0c3ce2681718b816289eeeb3ac343ddc037fc4 +259d8cccfcb9b9edc00d757ec6efecde6fc06110 +9057ca8e09723c9959f923a412e409ee793d0062 +79f5ac0831ef03c2ebb40d325758350937a55313 +3f36f6f4d3317275130051db2405459021f56b8b +e35c3d07dd54243acf4298ee0ce6ea7e4621e90f +115a59d5c4916cb14b4c408bec36bbc6116043cc +5d563efeae0cab135ec70ae4456a4e55bf598aff +2d8d73eade954a63f892414accaf2db229ff3312 +d42bd8a35e147633d3d750266939c6539aecece9 +27155662fda1f5febdbb42e6572dda8d9e31588a +a210a653a08fd0460b52c7eb68bdbde0c40ea63b +fb4be2d8538e5e4418042eb7d81491dc7e94dcc5 +53940e5d960d1b63e5ec84fae802fcd599b20f01 +213dc667b6c665a4257c4afef5e5fd39d42eb01a +08a16f7ffb9968774fe4562acfb79aa6a1a59a2b +d1caa4726d8ac1d9ad611708038db896828f06f7 +67e3d20bbadc184c57efe184ce8ccc402de23bed +ae05bddb7e816fd0e14e95cc525e06caf9392918 +b2bec4804d38db4d01520c4b65f410acb20e4d2a +78a8c13605a8eda09a0ac0f04910b414eed6b765 +ebdd1d2b3891d6f0de29ffa1eeed3f03bbef7912 +d54da603155d9e507b81d7188e1baee2f984a99a +18823ffe4e7d30056229c6b0c3b71f9c72c1d2e1 +86b8d10094b19ab1059b5dd7983f26fc2bb133ca +a16c62ef8dfc132a0a5c406e429a08e1d40b8756 +64e19e8802e2f598c5a84858a4b2c0c43b99877b +3fe31bfa86777b3f4a1bcbb46650f683fa477935 +d6e9929980eb730124e8cf6561991d43f19241e8 +20ffd27dc3be9eb895fe8a5ae3cffcd795ad100f +3960b049e19e3217968723430f3595fb1d4e1dab +846e738db5d5df03f621e5cca067016e84327f16 +2c20a17cc4846b8dc437fd00f84d08cd15d0c8d4 +16cbd9a93ee9067271748479378a31d24390e048 +77677862965b241d7b9c4ea61836ccf09b3e37a4 +3ec8db9d06345bf26aad0ccfd05408880946f4a7 +3747faa432e732538f1636c9aca56f068ec44a4d +f1959058e2074a54c0bddf7afc60131df132415a +216558f2fb3e918840acc2fca7c81f27c7a80e3f +1c7e55eaf41d1e43121755c1cd667d210e45a000 +ce5c91d45d83f9f114814c8db9a1230b2d79eb02 +e735d473af54e1ff29a66b379fff9e88ccd8a164 +7809602d8d9398f05b032bc399a922af1567c56a +e85a828dc7853ddcce5d7d919b07370236fd089d +0f81b75410062d52138ab8a67ae49d03321e991f +c9bfa4787bab601fe2e0749b4fb1e44d3f168373 +c03e79ef13869270df1be0c63ae86dddb7c21bf9 +91e1856c8de122ef09c10589afb9b3728bba9296 +0a661af9686af6c8f298c8309e8e1a96ef0cc08f +08102a4509565732289f843007d08cfa72ea5456 +9b9b7248f513f621089a6cdb956828a3fa6da09b +7e4ec1b8fa3a477f43f00075da2ed26a31db45f2 +4c5589e14718f8d6ef4027baa22b680f556d9ce9 +f63c67c039b3bfb83b3d46f4250e3509c2e9394a +8500584842b1a7abfce6a2453fb9f76c5b39d26d +5f43c3db85393d73b57174a6e3c72884cf1402e6 +1401f556e033d9f10dbdf83e9b5bfcf6a84823d1 +ff7e6d2a2c5fca5f33db717bd68228538fa09f37 +9d6addd57bfee73721c64830eb2d0fd27e8fb9bb +a55a50b6cd898fc79bf4657fef0f0ad44de6a5fc +6af08a408468481f5847013cd8b7f9c0ec7296ec +7d54beb04ea368c6386dc8174ffa1915b3414bb9 +93456d2e7f067d518838df8cd7f32ee85289f4bd +d603f66ebc365627756eab740140ed43f0e5f40d +e9217085cfc52f0fc47d91f2feb681a33f88fb59 +d0912f63112be8069398b3f6c926c727469f1191 +2d1edae390d9f079095606c8bed0a83f5bd5d767 +b6136dd5f245f26dece12bf294d524bf584bed69 +c4a4d6e24e7753e098e09324e903c3fc2cb45f74 +8f49dee3dcf6b505e43475e3b7c15a5e25f0d85c +edc1c91f5eb0547c18877e123cf3ec248ac734d7 +f9f269f3df343d14b11c40286b22f2c54d74d8af +99c98449dd5a99222dae7cfb14bc060852f220e4 +017d27d00eb43678c15cb4a8dd4723a035323219 +61e137b37db0b3157c04fab0a5f4314fe4b03931 +43f54e39221310d45fed028b202e0e26490846be +ff5b1552320e183941d8d58f726f589324035284 +f140814244c9e54cf4ff2085d7d52b2dd87d2737 +0264d85da73237f1967bcab20b2f99313a00250e +7d2215881b5399038a625726794c523be20e567a +77810c807b3c7452a00968927dc8b3b76c2aaf63 +361864a24f139d975cb02736e81d106b6b50de37 +5b08a44dcfaa7da30b066b62e688177ae4c27bc6 +f0bb651f7498ac35c750d4216b3fbdc1c6e83508 +0865448cb045a8b9568e679dbdb5b752ba0e38fc +afbe85965b4aae74bc86d5c56c75fe55e782c7a0 +c4e68babe61c2389be350f11dfc8e2c5ddc9f032 +7de82ac3cca30893284f93cc133d87276f39f8df +0e983ee75b47509844fddf43d06a989b3448376f +645ec5713498f91b494d39bbe8ac6619a20d45e8 +2a853caa0177515501abb206103e15fed7bf2315 +6b675d840afe29591d304e7b52a1edb442decf2e +aa4246332705bc11ed706555620cf99aecace692 +461aa6c463d8ed8a3485519f8347d3e8fd30d5f7 +0963c147bc9d5370ae2062863e776853744c64a7 +b6bc7591f950b6647f2d5cbf11bcfaccd8da0ec8 +aa3cbdb196eb266ebeb48c1be941df20ecc1bb90 +945cbe99df1af1b5db99d8dfcec142e5d0452065 +9c2b9de4b8928f63bfbaecc97bddee210e2cd38a +6ae4c366fec9f8ffb28f74e03fee29f300e4b0c8 +e9797953e895ec7596bb0c80d6c3e13a6170ba32 +4d63952d88ef8b61c631d92744b8b88d5900ba82 +6c668fb743f9af4bb080654040e6416f7e9b5605 +31d2a88aa62215e0046d4db0c0cfcb7390e16762 +941f9ba5091a41a41338a0b5c06ef998ab76bf92 +4f31114f7ead2ec76449bdfba502b576c8cbdc51 +636ed1de3d915dd13e94ea6f83ed418139898672 +e1b8a490189840089a0e42f357d7e18aa04d695f +e92c4914629728b8c18cf61320cf4a34baa77300 +9afcefd2944149fff4d5b74f5b26a39288b7cd59 +f802525632b1c8fa85b43911f07d8129694621c4 +c7b0320fd85f3ef25cee88621de6eb541b399c36 +ee5ee7b755e26ac0eabf5191e7747f6d72ddc84b +65a03a7e863b3a5b97576bb3fdda2d8c4380c706 +cefa54e79f57eec0b1273f69ff7149dcd90c7ee0 +c2add6ebc7d17385f7e0d0d9fca5fc98115c68fc +169f5f6ab3818fc14b9f2471ee0d8dbd61d5e566 +9862b8aab2db9c82fd1012792783a90ec79f7269 +0e1e33051f7d782d2643d645eff67157c37370a7 +8ab2735a3a614a5e95b2f53fabcc04cc482a0abd +1d400e7242d8570c79f9f34c392ce02e217e01b8 +c56d3923764328f6767dec2e5617f562cc88e791 +f9689fb9656132e1c6d186851563f2b968643791 +08d845c78055627eb898cb74bc38274794351b17 +ed3449c7f2b4a2f4f1548af509dc9ab1960e9fa9 +0892fc2908f83d76b147c3ba1847af0056a47e9f +eeb9ec2b66bfce439d6ad3f25e364d3b1d826bc4 +55dc9832dc56cae9f0bf180d2103a1d20c1b1ee8 +b05f9fa99ca30d7ce2611a6deb139f2274d1ad3b +3152602658285f9edadaa1d9cb7cc4948ab8fa54 +ba620c801834cdcd41547b08712734e30e84ae52 +c02f067640c67b1aa5013207c2c7782ac6b97399 +3349e092bb3bf21585d52e72e2c782692932b139 +26e816229351dfe7578c758ba07c4d2d2a891b2b +064f086f49fa410b664d59a0494367c421ed2f8a +1241b04b4380b1a796390d32183e3e738d7b82ff +79879bbee2c8f0b46fe44c80949e24b3c11ff7fb +2f4e7d5a0130b48ba687536a3bd5623fa906f9a8 +a72c848bc3bffda7aed21ece2b07327153fc11f4 +b10cfb970a746327ce47764050473ea27b15f649 +b30975204e2d948c1ca8d33a9f6e755f86d8e200 +e54abc8237ffb5e2172f192200fbde85a100cdcf +0eb8e5740eecc2098cd862cb5d1ff41f9aa97eb5 +0807b672dd1a7ee6f8038649f70a66cfa3ba4fed +e22b4d2a35411b0b2270871f83c19e9f6efbfa67 +6bb9d73ac47b68b90872d97b9ac1e1aa34ae72fa +c83faf99c08fd4d44d9ee38d1c3ef84c273909f2 +cf91d2b46870970ec013ea2ef0567f695ca80261 +151ea6f1dc4a40cf854a8b2d9fed22ea457d2afa +cd29f730499023601901dc9ca801c279637c5a81 +4fbaf01100e4d6ee1823f1b25ba309fe73ffb6d9 +49654512a36b27837b069fef447ebcc460b0c911 +09df70a379653872798f1284efe95240944f6af6 +43e9d988417d90e85868aa09b5c53e2ddf0364bf +5730ccc0f1a125be76253006f14a6d3a39fec5ae +65012f2f3ec9d16629eb8577d149de30257127dd +ae05bddb7e816fd0e14e95cc525e06caf9392918 +a65f3d75c5cbf99deccb00c9b94f91b5ad52a050 +bf6d04b98e0af89f073f4b71c5125017c9aa079b +6f1f25365bd131c0caf19acf0f4fd02a3535f538 +23a87dcd1007f73c4a6278d230aacb6411c71266 +a6d88d33454805c4c3b9f3c50b1b2482048c32a2 +d6392fc14b8c5e61bb6342dfada3b5085dfa691a +ad61eb84269497ea2e8d9e6f3b1a504d9bf82d7f +b90e7d7139f69d50d53d5bab66a560785596bcb4 +237f4b3fafb5bca89627701cabdb01a61ddef306 +8df29408cf5fbf40bcdb5a73d9eff3e30b928638 +02f0cb84d4e8f2c78189f3008c327db6a7dde4b6 +d7449a49a1e808c3d2f2c87f6b6b26dc8cbfe638 +096fb4a6df33a35a8a4c28cf6707d6093b8fb483 +54ce333c923bc3d8107ed1b803575c249d92a7ca +390a82f6f49cad470b3278465d07a9320c163fd3 +b44d920cfa42cb0ea8e279c4401f565577217323 +3c2a82b4460be3eb08988c038156f24e690ce149 +fbfdc61792dcee3d0102859ed2681489b037339b +5d788ec362a874cc113c2204b06fae82d1d70ea7 +e4a186c4590ba156eb3e45862c2a5b4181e2fab3 +5f7c94ff1e4c755c47343046fa0ed6823124b85f +aae35772a13f84876be5fadd919f1265159acae6 +22680dc843e4692474815b0c9ca78b9f4f1a116a +1c23f12e590b2cb4a89314c0b933f12b7193a37b +674cc0ecfb854619f3e50df0e4baecc67c73724a +fe41f09089b134bad7f40be0ea4a6fa7a691655b +12327d1afb02007b3b736570856176234edfa8bf +26fe548ac5f3ff1e700b2cc6890c2d5b152234b4 +861bbb99177d314267023bf3699ec069f3bda6d6 +cdaeefc0fc597b0b591b76d20f979c1207e98880 +2a370c32d2c1464da03bc2440bc96ad23059e428 +6bba3c06659ebeaeca823bb7517baac4425faae5 +e7ddfb8e15144c1a1e48d8b98ce1a44b666c18ae +62dd1f31cd4e2c8250c587b557f4c2be67d5e495 +3ab9f2c8f9512bf98dcd467971b3ffc6d612d308 +00120f91cfcab17bac165f7a4719019a628a9db3 +3ee94d218979b459196743ab0a3d2957f72422c3 +6970a0ff24ea28a7500763ec1b72a671bae412aa +ab356240d60a6e7d6efce1a9638415f13bcf6591 +39d0bcbfe75fb7bbbee7d4bb72a77cebf03e39cf +ae202f1474cd1ea41a5172230fb083e1bf932d17 +7dc9c7399c2e313bbc6264072f6a592b6915b082 +fa79ac193bddc262fb35a468c8bdfaae536bbd7d +412630c97420afb50e5278d3406e0cf4b08d0b77 +eb1cbbbc594b324145c3155bae5614a2553a17c9 +c948920cd3dde6dda8767bafc8173c0c37127430 +43ecf30e43686b2a11f6b329f5046a68082b7272 +49b2330923275c10d5faf66681fea724f9938893 +ea6c2b9b8479325e3c081252b59c61047988736c +d28da9e2bb92814351486125aa35b16d112f3a76 +393a89e4d5b67ce3e29678656d73a0dbc2ee930f +daed716140202e583ad4cdc98fcd8b4b3aa5ae35 +51ce09bfb256ad9ac38a8e071f36b0097f6fa68c +36beb23a74208850b1bec50c966e985aef7e4075 +52894d78609a1022f6dbc4ec4fe32fcc31fa9366 +3988b5a02009b7589973eeb2cb929f2d37c4f409 +cbf788987b75c11aa5c49518c5b3cb45e2c177df +ba1d997f0df5b17a0899bb643a467e95332cf0d8 +4a0453760d334ccbc84d00ff67a87865fabae97b +d39cf4acbfe4fbc26e001266243644ae35beb712 +d05b5e0e3619b87fc46e731ced5111f47ccda50d +bb98ef0258299046aecb9fe0070ec309d1cac401 +080b5e433c62201fde1221066f4d723e3ef427dd +92a6b2e9d9e7da09ab27eee906a8c38c0219f390 +04d7b42001e7249bef064a175aa1236be8211e4c +75855c9acc21043af85c9f161fdb0f68af165771 +2fc69a299b1a7ce0a9dd2552a910f319773f3eb5 +98ebcb90dfca1bfcc7bd2cecf53cc12f7dde6970 +db8025d7b55de50ac56606023c838bb9975dceee +f1530622d659a31a36b4cc5b79d3ad9302ecb384 +a9e946a8ee4153ae7e45143941da7f61fd04321a +c6f17e5ec10ffaed02b111f02af4afa86d347d3e +a7ce2524995e668268028e9f7237dbfbae3cadd1 +407f1d56cdeccb0e313c15ddaac53b186acdbf0c +a8c0086c0ce76f960aedff7a7d28d9009751cc34 +e28316232274fd9444562d8f7b5b6949072d0a2c +ce5ba5110238d225394df833987db22b197dc93d +32f66b696f66911ca0c73e36ee32708d59124f32 +242c50a749fe607d1a652db0e06f453d5d7f80f4 +4375cd51b7ac544735b9c89df29db30369b0eb9b +1458f8a2a10e49686cbc0b5e14a97acc3aa78a30 +c6ce5c4febbfb715453373d447c4b5572f5fcada +0c145a6bf87af0340fe06024ad8ccea391c9134f +b5d3ce4d0549d7802002f2d5e90f05ac35f5db5a +7944055eb6cd49f12b5d42ca0b971eaa6dd51e07 +63c0d33115ed9eedd51c7f34177a113f6b40156b +f2ab65bb852cc93aaeb521f0f65fc2ffd14e996c +c7147ba3242871a59b80860245ab60c3d04c5ecb +d9accb542e2321181468e8f7e490114b30c1cf53 +8ae25fe05b21fc819243746ad7caf4555e11df0f +a3ddfaae625902b0394f854d6b341b21684638c4 +1a71c481191a57d4ae387450f040d1da83c10eb1 +7045e190e940ad597893d85b3336afa77cabe20c +714db9c2b78eb2e4b26fb94c3927bf372a993900 +85ea5ac1300194927b58530756575dbc84dd46af +18de5b9eb32fade90cb550ca65052bc1e0095a99 +667ae97a088538b0b321579c5b5bd12fa101e04a +da9609278b099c165aa343793bc2e03c2ed17752 +27bb197b70f0475abd00cc0db2ffa53de84c9e75 +debde12bfd41f1960cacadf1239f1b50db2624d9 +c7ed3ba86b0e3978955714855a42b4a7d8c67233 +e5572a346b97cbaadbe68f0ec35a09d923a66383 +a729d22dafc85162347b87dd530c05caf64ae2f3 +c12d47630071fbbaa5b10507aa97f02c58aa37c7 +6d9afc0ab84073e890da12d0332a5987ab659d68 +240b251022182eb14ad96aa9f558150f8cb4c543 +000e009f6b1d954d827c9a550f3f24a5474ee82b +a8fd170d0ff3f6178900977ce422ddcded7c6c43 +8c8d04a5274fd92716fcf0926aea0c06e83e7987 +61e06a233a45c987979139488084ccd0012d466c +6d5f7fa2062d3e5ca89760dc09b13a16199d1359 +7e84933971ea1853295b9d73e4b75f3478498c72 +e10c7f72bc3de187cb7adfa31a1f098d0f47bbf9 +f450b642e3e32641ef9878aed22f732d314a8c4a +ef17977a93067d945566356f538640febe56157b +c2d40cafa9bdfbf9d04d096d09a6aab9584c3ef0 +87b1981c3d51bf560e628fec4e65e4bc8f54566a +f9f7fc8e9da723e776abddb6f7e836fe72136eaf +c2e3a01f8e6f8a021a1551f72529f92c9a7703e4 +d7dcb4acee7cca3e54b11ff196c0c26528e665ae +3c2452d9487b0b6b5426fc7c502b4d8115236051 +e430e7bb4e1316f3652bcf9ac93ecda4aae3729b +e21cec4d51eaca6fef39f717a12355853c8e25a8 +0a5c494f13f21e009f531c2a56543d274a8c5932 +3f68dbe78481050ae64297153361f374956140ce +a54ee0a7552c6d6a5fd5ff6e0b67ecf511a8777a +a1d08c47cbfe06de1206493bee12f301386725e2 +a91d9dc6a9ad7fa6aca2c9ca4d9c7aefd1503585 +991ee479aee8194c495fc11e06f91f7b33809161 +39405d7bb73434ad12a0106c15cc194689eb4de5 +89275be2a434addb83a29a275b63113f4500e328 +24a1a847d4d5f74b57a02c5898af9364aa83debf +6ef88240d12dc57a102450dd26ee7a0510a848df +3299e38fb5351c11d9beba7400722773f3b74e6c +99f61cef6386573c8cce688a30fa2cc82a1dc05d +a49f8c20eea4af67ec54408cca737bff98628769 +7cdffadd7c11226ad6973a1707e404fef96dd541 +d853339b5945d07de64c5d8738e89259dbd40401 +137797fd34ea672ca506d1c8848d0da355baf7d9 +9b00d0ce1008b4c3765bf57817dd5241bdeb5c8b +81984aa7d079c46380e4baaf49d078c86466edc7 +78e6ca8bc83669866fdf9fc5ecc19797f4011261 +70172cb5f244c48d2cb41621c35858ccfdf31997 +a509b26bb05b83f9fbdff3465a2acfef5b35ae30 +694c620e98472213a53e932214054137e278a073 +67518afdc981945e4cbf620ff05c773934607a44 +2d3dd578113df1602cf753d2b11a4e802f616990 +4abddb8c6e0df6689eee21bfe27aa231d0ae8dc9 +ee3ed04d53a5c7d1f60a5fc4d7c6832a7f32d3bf +f76269f3e3c431fccf5d9991a8a5da27977646fd +ba30d4f9339aca62283d1df7756b42158f637931 +31dc8c2da848a7eb21c8287e23990cb3ee8b6307 +68ac8fb1f847b3307be2a6a9a0fe66235a5e8c4f +8ce0548b386ac1e48150a945cf36dbb6a0bd0ae7 +2b4439bdb73d8cdb6637d275f426f13135d415fd +3b0b095afa3ef1b73a2bae29a5a131bd02c0e714 +9170bc3cbca5d8f82b02ae1e33128c62fa2a00a1 +4ecac34a02791711bc456edca64c086b9aef357b +d70512d3069e6532b7069fd0c8fda28d75324293 +9e39cf719ab85cc10326ed1d9df2273e75b67b89 +65c44ce096871da2588e1c140ac91ef771fbae97 +a8949852e1a6258f3e7146d5a0b073861d12dd56 +4baf74306ea4d6d60d89c2575484dbb111cbac83 +4a410aafb82e10f1cfee2062b5cf2e038a3d12af +7c7cf4f235cd2c455b2826e96803b1a6a47ba4f8 +d42801a7b4d67e49ed3d417db4efc7dc6d4b5ce0 +9964dc1ba45079060e594be6429829042854b4ff +db275395dd0a2455ae378265850a90a3025fac09 +65f5e35193414c2998a1b5de2f959cc785f1fd6c +19c0f1cd0bf5780a7c2a8abd5d5d8dcdbcf2fb86 +279e575b7c82e95beab30d37836e1e56176d7ee3 +3945e22c503109659c8d463d4674d153a6f5e8ec +e553763df924e731b9aecc68342af73ccf47ad2e +128c6f4780cc59cfb76bde414ce42bbd544efacf +ab3ae67419bec16ebce20cdbcf76f2e8508b35fd +42986dc0132012b6150eb6066fdc1047d57fbf29 +7ca2a2cf7fcf4afe8dc3ebb4e7f8f9a599d5748e +7c478b9c7f099c8149ecaf11b917d41b5cb36011 +6cdb121b56dcc9cced06a26d1b11bdc907e4aaa6 +2d60a7c9131bb6044c9636d42f6888295a519dcc +883b0ca02ebd243bb393bfc6144974539735d64a +d4c710c356bbc78529b427336e4bf7163a904239 +3952896b9156a43e6e2193cb3ae8a71a0cff6923 +79b92f4b2e09bb0bab7af1b036c03bcf075e2682 +6e0f11b530638be7f478b43a715dd3bcd6b17d04 +e7d4a4d0b37b35569ce85c261d6c9ce9b57558d2 +bad9a32c0b3f74e4f54de56f37f24a265f45fce9 +4ec3467fa91e3889a3ba2d695c863b5207ebe9c4 +d8a1ee24cafd2ad6a648b4b62be7b06f446b1a89 +d61dcadd8afce804e85d4b40ec5eacdf37f04fed +1a15d2dc834fbfb276c67a2cd73d7e8cf650bfb2 +08d5f0581bd3f7196c90036e40f615c43c97eec5 +020a823e09ab8f8c2f13f78aba48cd5549848cb7 +fd091455b9ed6ec71dc4eabf4b59ffb5650ea2fc +c0d25282a77168ec25c503cdba87a0b16f73e759 +19094aa75ff7ab5a9331eeefd36c15a201b0ab62 +2e74bfb1f3a9e72a00f6727067bb42cc6d8c4db1 +e3cfe5af31c4c3e4cb9bc30ddae635241b476b19 +d030d0a5f16a4087cc56137190fa0e7ddf19dacf +fb15d9bff157666a98e09d0e75cb0f05d9998e51 +64cbcdde35d49cb5220009a855561f6a440c91c9 +faf5e36c67de12654252e4890b40297de6f0f18e +f7ae25006ab8f8e2beeb218acbc5d273376d54ec +0b95bd0ff7b9d14421fba10a50634c26f3bb0692 +9db0f5d741239f0adf441c69f7037f1143c99fa1 +1a528a69a27510d5b3036ecef3f8ce416cc8a9b0 +3f0ba68515f730c5edcd6b5f7a2487672238b381 +28c9b5d17fd3e52e27b5b8d6d5338f823f8abe96 +52a4638c81b3feb5cbd2b66987b1c7fc1ca7ae59 +10af2962663aabf4b56357038b430adb7b2d0986 +65961456d11269a4191a41b0f0a0f2d92fcb6907 +46e7cc2ba0bf218cb004f58ebc249e5e72b8c29f +b616399a316a7816941a498c09de81c3ecdf0f03 +878cbf5db93ed95a2ddac0927543addd0d6105f6 +6d48e2be404813f7d346516d519369ede95d7226 +c968e9268088153bcf51f3555b80f69e7f162db3 +405f21274bd606e89a0366cd8aa82e6dbaf8050b +2b9872f1248cda295127c4374dbe49850b81d95b +c94ea8bfd1a74b0d93a2a207a1234b0ef1f73d0a +b0f4c1bd78e59b33cd73b510dac2b45e3cd735ef +158c5fc595eb5ebdd337f44438d98d5581a87756 +a210729626a48d3c75bf2adef15d856d0a9e5918 +248a68920a184395f2fb66fe69f7a2b1276e0f95 +8ceae55b2d091350328e94bb7e3ad1b2048efd6d +26c43e258d65949742057d164454efac73bbb63b +cd76aa45608dd3370639d3ae4d2e774ea7c3e5a9 +b645b284600692840ecb34473db3394bc354472f +9caea797113b583b5ab74990ea22db63d14c2f99 +9e9394a307c29b74289f20464554131438b34216 +90519a813017e881d6d95e4df8952a393d1a7726 +7dc1bba5f4ccf529d19ed517880a10491df307a0 +653abdecd41eb6b1cc3315bd4a6e5819d1831df8 +a644add72093f735a99ce94b304e91703f250b94 +ca1385936bd95b3005b923bff4ff0077816e3d68 +e85217770edae3f88d5114fec35166bf7a80e4d4 +47bbe920c329ac749fa3dcfb10570fdeacc6fc3f +dc36563ebbfbccc065d91fa24fe84f9b0402ed68 +1274f8b5947b2a5f87801d40503ef5b8c883771e +694ec8ba0a9dc85fe62b5cb5041b71198936be89 +c2fa24208e4bf7d91592ed094f88713be35fa708 +1ee394eff8bbe8488411ecb68712b0a6f08280f5 +2849071dfbc3e18241f7a5243d4ca06e4418174e +c0880199e5c76be3640005137c2c383f0c84b57c +f0814435ad279f8e908c65049775a8676ce15f94 +8669e9660c67b2489c0e4308eefe20b8fb3d2cf7 +1c61acd00fa431d425fc79b0c90ecefafecb3ace +999e5dd9f1857d3f65650882fa2cf6d19ae3b9ee +04e19a432042f4044bf0d51e3657f890f10cfaca +91a2a3da8d7ab82cb4034056381a44c4848ff19e +1c0a7f35b6eef0226ed7af5ad8ac87ce07fff38e +3458f834c56fbafded76527b01578e5ef34b9b42 +80bb4f72ab3dc526c23a3dff758e7777cf1b3c09 +6c4bccb7aeb5aac67d498b8da720199c63e277c1 +9061d2012210b95c86401af9dacb0e63ac871657 +fbeb39fdb55d24b827bdd578cd6a471a0a1063b4 +748b0badc59cdacb0717ac7a55a490f7e0ab4d71 +70952d29c9b7db955fbabde8800a629665a0d24e +a576c35a831b1e889631b757ed86916341fc7202 +a5858355506446cb36f949d98bfa811e7d37e76b +a5f97dba2ae0b7949bea49a0e7068a1c6ac42ae5 +1c16e278550ac208d9aa1a65d0a9795f4132bd5e +5a2cf867e368a77f135a855cd1de59ba5fde99a1 +132d7c4172cc25eb59c7745e6d74cc4a4dd88dd6 +061dc0ca6fa3ee55aa7e688910169e4e6c74257b +e2ee40eb4145cb1450572a7837ef544802b99866 +b2b0c6a0f14f3b76df69046861fd04972ac9f3ee +dfc83bc2dc59d24775e3e8228beddf9e654167d1 +8ea9a921345fa2ea894bd9b953081f15713224cf +c6b2ae26499e736ac081af57a7b41c39a7b97fda +abac6c071e35ac30cfe3317089061124ac301495 +5e0f057dcb8b6c21806b379cd349d85598f5bf39 +b4623e58d28e1d790a508d26b754a752f70c288b +621f194999cbead9449bbd7222c6e8852c5043c0 +5d952c025f36694c06917bb1a5395fa13ccb84d1 +a0fffbb1fe7c929f520de855ce045b840272cca6 +e2e8fe4405767b62766efa00f95dc7b501e9eff3 +d24495608f98c48e6f3030d4af691b009d09cf41 +826c9569ab9e52eb031dd692baf84337eb217cd6 +470ec40f14d3d077afc6702a1c1c0bb4baaeec57 +281237526c3d4125250aa204bd6798e16cca4bc3 +2fe0fa9e25453b1797f4cf786c40eddd64483d3f +d231ee5ec82309024acd028a83ae876d9ffcce94 +71732a91bd25ea50aec127f95b7f8b8609db3da3 +793ec3ff30c242c570c9a9e8c95d78b05c7489ed +4b5cb898edd34436e4065c5d3de05c2ec7d95153 +23d0930474aee4957dac9571e06d40757b5535aa +992a3b15640c2613b5481fbe2cf022178e5f3ff8 +e8c0ce0985596758a82b71bdb6759c72af43d06d +846bb87419fc959197879e04dc9c15f3723555d7 +8c6907fb70ecd74ffba960283bf596155a7fb273 +1cc3cd345edba8eedbcf183afd6e746b5b29a422 +f3e48a4d193edb98933989cf54dfb46310ffdd9f +30a4a422254a4026dfb77d2660467994b18b1eb3 +5f5ea4d8846ad79c33bb149e6acb853ac78b4247 +c6d0ae6864fc9ac5307e23d283b1ca4b291b21e7 +2de834aa1cf63d1e6b7098c5528e4d021f131f00 +55e79f31165cd20502922ceda572d3b7db9cb41c +6ee19b994fea7c9447b05e9dab49350e2f8c1377 +de44cbbe8fd64ea13caaddab77560a48806c2180 +a2619695901d714b44c3941aad3689a40abcf363 +485385e26c8fae0a7efd34ee11ba645662074a13 +8035d023b91b92978788fcdcaa6062c38883f4ae +38a7dee7cd042726d64a95d3c5c3d341d656d68e +0a280b46be0fde5d87ed47fc7e970e3ed494cad6 +aafdf3a5bd71126c9ad07d93285966dc04d40c85 +93cb2f4e32053398d3602e0cbdaa12e8bca062ef +4ab039bae14499bc4f432f9f20a2509fe9310fb0 +29c411d098ce2a631503bc168ebb0ee6f65df497 +88ce7a6fa029b6e8f51c92f1666b02a404b827e6 +4f98a1294468c67a563b48d1ab6b4766a6d899ec +ef0e221c7edde75caf0d5bedc0d93745890a854f +94a1929f8845d841bb1f47667c1e489ab21bbc56 +4ab4b43b33178d53a5a445283d6be39ac57106de +5ae9d4c70fa9dd4cc70037f4920ef15d4fc63d2f +08af6504291f39451465dd1f1df6466e61c4595b +23be51cd2399b9825facbac2a88475450c5927b9 +750af4d960982c1655e9edc08470aada3c72a9a8 +47f51c462114ca3590df18c3c96da04a217b79a1 +e9e46f551280ffcc98b45c3c9b18085ed14f38ba +cb0ce99d40bb9d942aeaf08cbb83b075927a96d0 +62045a56ba933fab5e2bc61be05eb5bfb81a8527 +9112ffd4afcd36702f2e6ff7aafd653edf2557f6 +b1fadf90fed9739d72e98b56727e471e070b85b3 +75fba14591fb8de7567bd2378b5c5c114bad77b1 +7e81e309cfbc2385f04c4d377c4562efac6ca238 +0a38f333c2a4adc64c5f8d074508632418074755 +f4aa472201d2337eef2115dae23439e0a6dd9663 +d1adc7acf92d644b3e1a821668a05b024974c350 +699fc0441179a3cf82b303cbe25bd5a3be551ea0 +697a6cba6628b2f233f2a1cf317fe8127e4d05eb +397e0ec274130aed3bc1bdc461bad41c485f629c +02aba4aeba128defbfa587e3f07efdef724666b7 +5e31470b18e9dd499b9f8787056cf0e68d52e055 +9507c23d0741682f71cde608ae517c0c1ad2a4f4 +16c115ba95f7b71292bf5c00a1d425a8586c551c +42ef162afc768b86b881bd4c59beb8839149d76a +a7714cc78a381995633711d95465e883b613ddd9 +91519a0367b9eaa66b5ffe27964ca4c913093aed +e90d736f7f5e32ff845a898036c529518cce0c6b +82b0860745881e030c57a3d1bbfea46bc404bce2 +26c3e814a69b6335ab65aeb2c4a1e97015595206 +7990c00e8ae3117587f54a880d7d20d0578d4646 +260d91a2ece614587559ea3bf37f76e4d5a48beb +bc19bf14032da3bd5d3e6b86fdddd47f80152747 +1badd9612877ba84a92b025096fca1e0a36f07e6 +4f339c24142d0442f20301c1992d523946d1c6d3 +fc89b29738b18fe4c0ece96bf00f2cbe687e45db +ae3e7378f86cac99783c3de50d0c073e79a92759 +a1e6044b7e31b86d42b6dfb7ddaa1eb6bac2070a +948ccfbc7690989a96170839cc5d622e12e0b044 +9ec16c5ec0fd561efdf57572fe22e3e768ecfdc4 +c1849b79963362d71d09ff4cea2c46f9b3a03d89 +e82a29a4c2fcb1ecaed942c6fb550a14b916345a +b8412b898cf77763bdb3da689bb1bc9d10447116 +147a073799722bed54c3606c8833cdd58b1aa1dd +79f4216bdb44dc618f168d2a5061481350c9a38b +c4352c74759634af80f1f6acc69c55261dd12acb +b6a68adc1d771af97938d64d3c21ef4fcc99cfb8 +b5f8a569e73948a0930d18622740f52ab91c1a42 +fb784ea50559ccf087521510e7760473038cef2e +b7aadd7612b6a1970dedfdc175ec4780a8732703 +0146da64eabaab5d7f53e1ce58aeb9e74dea18f8 +7465d748cb38e50921b446953ef27b0c0fb6abe1 +4cc4e5eb162c622f786e1c98a9e00237f5687ee6 +a95f85c1672b2ff74f860a5980d83b440715deae +afb99fceb6c0532a769b61a81e8dfeb7cb70a86a +8a7b29224fce56d21e0b4d8b83cb42c32a4a2e29 +2a4c040c4c53d763d1263d8cf797e0b672c154fc +a81140222a3c6e2323cb290f353d595686473491 +642db49c7519de4227b0dca5b23144945bbf54ad +40df1682f34e463ba031f077e211a1e8eb1b7e0c +cb778e62e3d6b15a836e50d65a18a269a8a82577 +3aed3c2855ec616b87c4cf79a69298ba45c427a0 +f18f929339d5ab26ce8e26e716da4ad095474768 +8e03a13f5223f71d02f875b4fe4e48cdc1ea3738 +4443f53a766617ae7c30c48d8cb55d6fdc3ceb30 +f38b2e2284f48100513689571ce9d41cff63bd4c +a5182de1c12d3ff131a5dedc6130e02b43c3b267 +9054ed7b6b3eca10003d19098e5d3c51a8dc071e +2f0833d2eed57049454b3e0f41dc02eb7587bcb9 +a9883044091acb92e2edc709d5136af372d06ebf +1360b846750bd2c7e31cfe015c77c5968a9b541c +156253c33dee7a50df8e9e5e78adcef72705f3c9 +42580982bcfa232a30d39a26fbcd605cb041e092 +5ea3d3524c6c824950289855e33037576e741d30 +87c21fd886502206ada74a652082ec8dbb0fe7c7 +958b77776ac602ff78ddee5ecc758ee170cb5fda +0baa5e5fe65401be934349bd1f067b31a4a0f0d0 +0f18a06bd539d1de1e3abf38469e1d14030ed41b +cc06d014fb7fc7f5d0fae8c3576c134a281ca14c +cae072ed5710b9cea48c8cb0b011dc3a9cdceacf +cc7928b6593cb03aa125a5865684da7fc0405d74 +9f71dfac529fa72a12235f016cd481b02192c3bc +2f77ee6c43941f768b9771bca5a02332d89bf80b +cb6bd932f7a9e1c4845bd0d974f8983f2d5d6968 +a3b808778e2f90b6605b09b68cd7f3eb4659477c +7e7f7e823c05955c57123af1b61dabeaa5221825 +784321dfdb51fa207c790a3f670f0022fd575775 +69891ae41f6320ec437455913c5dd6d76a0241d0 +a243d306ec4c022a4199b6e160bdeba677415fc8 +1990eae2d51f66f9b5dd3b2d2beaa17f2b95599f +4d55ea7163e490d3f37218482269961898c62a87 +4d33676bdf0c6738fa3088d5e972ceeadd3730e9 +54aefea5f3c14105ae08f09aa60ba5f6917b1b88 +d0fb72f2df7282c349193c0ea47af281034a2c32 +284f81ec4d1297d3949ed95a114f4c10011abf40 +83fec7b4d265b21ae38e07c6e1046416b7758993 +f78bc049eba41b15d9e2ea28bff38e508b0e71bc +bb940fa349ab09d69edcb5f3a8fe96e55cdb69b8 +4dce40768f628700555244e91a69c5775d6caf6c +d176f57c12f30fae319ccd5b50b3096837767ed5 +1bd87d9bd116cca4f00aa031cab25897d35418bf +684d8d97b04fdbce1a08fffb59e1e280318cdfb7 +99b1b03fc906723790db2ebd04ecc51b8ed52052 +ce7ff18c9588042aaf62c8c71c69f769a16c4a7a +ee14d42f2b34f4bb5bf90d8c813934aa5d6b5e01 +d7f730f7658fb4af7d492e848fb759d031726e34 +caefbcb40174cb97c8361dfaa7899beb20202509 +fbc427e1bc2cf82ac3756c8c7de4249b52e56505 +a2e4de47a027a36757d181f61e2d3fa6dde7274a +85b17ae766f1da36b8ed0556a932d63bec08c785 +36ebbab9aeba7a8a04ceb800b2e445a85e4b2c0a +5826b9a1cce4a960cbf4516004b194c988312730 +a06ecf2bf25af0a6b32be1d6a82ba618d9ecbb33 +8f03971de78085457c1440e3ca545ae5cbb5230a +06588a8ab74f068ec61b89de9ca03a28f5ebd6f4 +72bd7e434c944937912039c7cf79c07bd40241f4 +14b5d1ee3b508505b96a3f403f1b6685e110c3f5 +6ce0eec1ba71291ba928d4a825e582c919a2457a +c25eaa87d7ff1d1fd503bfb7049a41bbf282e916 +0ca9829040ed3d37f3df6341e28becc8df839409 +4e516c3549d4aa6a057dadc9f9f6f9aeabfe35db +8a63d4ed82617bb5f3da2ab351138b4690c9e03b +0956df18b019953eac5eeaf6eca49674af37e52a +a8dedb9efe2e9bfe658503702a0602fbefcc3316 +c0787c279f755fe76464ca4fbc94e24add71e3ac +b11cae312129d1e47a4102f87ad8e1f0781d34c7 +248e4202dbe0d45e76e930b614578206b3dbc383 +a0dc9ceccd24357326241c97c07df17c93e77420 +5468413e75a18f8d7acb2d26c2b80bddfc9adb99 +7c81d09ca7a80c686ba8530986cb53e555eb60a9 +8df13df883dbd7e8944d8098b74ebf3aeb4b735f +e2ee2a92b8f493b2960c4e1ba2abf4f2a54c6758 +c470e5a7568645a10488f402443f3701f69403a4 +23e3897002ff686867b2372767d5d8f121cc9b4a +f1f670d0fe617fb374b15bcc20110b89b6082aa4 +b17028b6a57a1301be1bb2021cf51d6fe4bdd354 +d3c8813d44913745f4ec4253e048af17d4cb159f +b1b3a8940587229a063dc836cb0422065ac0d292 +ff7672f15b344e93c02d0d3b9676b8070a735e93 +331073170c761735eab3c9a516903016c2aad8dd +07605b39c50fbc320453c583ee749ae4f97126d3 +e710845e4cc7eb6a1d99073dfbf6f9278c24bfa8 +0cce9dd80952ff900e8704e6115f9c1bacae894a +2ffdb3f488210d4ebbe41759618bd8c6d15878bc +16d1cc466220c90c009bad3f09c2a085bdd47d5a +1a71e84c0c599408ec18a189dbd779d5e20d4e21 +51de15d048a6f3b0330e8da198b2d17260ce8c85 +36ac969d234f196366b404c9c714c3b8d30ddf6a +244d6af0cf929f993a2ed2de0ede4f57d501eade +a834e49430e3b3b1cd596dc1338a028e7166643e +2e489b53225f71cc5b73f9aaef5c692737c0f6bf +1d52cef8af071ed110d3ef8feb3e4b275dfddd01 +ea0e27967a6c62875355c5f423e4962835c5921a +02535aacbfed4c3ab00a0945d59933dab54f6fd1 +0cf6cbdeca67c729a260b7c1f5710b7a1e0aefa5 +ca42191efe091ea06d25dceef9ebd84df8ce75e4 +c5001aeae4fe17f8b7ccc1d6c604727ae63c35e7 +730b9668fda289b194a3b66a53fd3745ef42ca32 +3207c07bc7ace3a01ad233641f1df91ab37a505e +de657634cef20a388d43127a184619105d110a27 +dfe850a4b3c6c002dbee134a112f16f8e1b974c5 +1b0e7715e01a62130ac573c38834b09274a7a866 +99c6160a2f6e22b5040bb47a279f81b4224fb222 +ceadf8419c256716569dce2c60d98dd703bf2cb1 +d8fb13c8444f71e7f309d7ccdd7ef329a47a4df3 +75805d5f1f22bc6fcdff850c88a4fcce7dc3e17f +e6bb6b913b34b30af0e19a93bca4f55b39579f88 +c29d27094de54106cc903c2e0dfeb89cdcf9ae02 +41ae19f40a339b6b47fceee00f512d849df292be +04090c2dadbd1d446a8364df894344687131f841 +ba47d6e2e838b11290d702d1fc03261d27ba59d5 +ebd463e2b4b89a626e16b43071b06f3145cfb661 +78141478f00ac19912fa2b283e8c91e30eb3a7c6 +d8a4f3fba1b67bb6848489e45a92e9c1229ff7d2 +929b032a966f563e8401285e4d96850b17f640da +82a3799090db99bdf611599094170b85bd4eee4e +620fdb835eb7e095e9a34f8a165843f81fe50328 +66f89413b6f050fb903d58b36ec961461145af82 +fb824fa4ce932e860604ac21db4b555c6ad1114e +d8c925f283216521073497659088f4ba707311c9 +a28c2815223f89026b6a198415a1291cd67eca0a +8201b77f669191dd01caacbea1e3b5ffbab92962 +dbfd44e667bdeeb17295ab40d123ddae70d3daff +f324f1736d24f14c7685df0f2a2cc4bb20999fa4 +296f977687e8ce959a2e38129ce1c0d31e755d8d +e4888dafd50eaf43e1476701bd26bf940865d973 +17ca1470986faac5115d246d3f9b78244b7215eb +0904469f246fecf43062b2863bc81f730a96b20e +09b7e506802fe6fa4a12154e322dddbc34553f9c +b526d3ce8d4649e96446e1e8947b674001fe16a5 +46665024a071b4916afcae4b9ed3cec0aaeabc7b +36fee230f41e1fc89a26b1b7bc7e884862dbf56f +702806939cff2095b2ff97a08d84bc14d1dfc5ae +30ea107c7831a846dfe6828947249489468f3ef7 +8d51b266df630345c667bdbc07f172b906e627af +3691b1bffd90518b4017ccefd8c15ffaa8d87d6d +6c81ff344b4285b42f2733cadf42536addd736d2 +6c15f6261e0d7d09ca59071955ce30d09bbe97ae +aa3acca1a17c375731214851c56020878929a068 +c4cf20cc2e3665ba0b7d948683bfa1e82aa9b7e2 +9ef570f878a8c2d9460a99ca523b835535de67d5 +7d76f893313ec0b855d1dd6ce9b8fc9bc77723cb +e7ad68df97b2c9bcdf6e56cc017301f84a7f9b4a +8f5a3860948e5dc213ed825fb4715f0ffa013ce3 +27e795d99164a2372106c9e1f118cc19258e41a2 +fb438b2cad9b7583f4eda4fbe6fe9e9cd1f59f10 +6c6e755b03472223c69700bb166d81d9adf080b1 +8cfbb990201cb91fff3db779885041d2b5c52c1e +eef5130bd17ede5cacf8be5881eab0c09a538bda +f20d8a304a9009a79a54867664bce33473947272 +aef5dcb164dba680b436bbb37faeeccbbc4fe2b4 +b412608a7f30af28fb8615e4b522b7dcecabe212 +799415d8ea5094bd6cca8c178d6d8531827da191 +ef5ba9f7f4c954dc6208e9a47fdaa730602fa27c +6204780ab854a5443a52c343534637fc227dd70b +58733bf4d2489d1823a432b2f515f22fa835a88b +a8f30d02868c8ffc924271d9da99e0c180477a1c +c8baff658f6506e04d7f530d9b266ba2d4b632b7 +87a31d871a336bc60987492515a20ef25d18d0d4 +e2929ddb475b033444f85c3cf7e5ca38e84ed7e6 +c7fb0295ad6226798e65332c841f6a1508eb9efe +db80674c14610f0b964fb574ac32c6984cd226f5 +ebed652b9c7ae1784ab032b2023445e8b8cbaa41 +08ac1c4c2c7589f889b2bce3687a724d0c636c40 +dae2a0e1c908135eebc98a0db33ca435ebe7ad5a +3d415472346209c9e90706dfd313728a0ea15003 +df08670661d8887644542806a8d69046e3ba87ab +32a96ae444a08d6ae828b34539aec76a835a95e4 +4a0465f87d082b8e9a22608da161f232e8d6f464 +c7f47a4f22bcd6f11e6ee97e9687b5e917d9e495 +9b4dec196b29bcc98a377d6f433638a85177e0c9 +c0f1425ba0cdac23bc342587ce6ea6cb53515c55 +ca6f373a6c76d4a4284240fe5e88c130bd56d27c +785966c05fb5fe10addeca3a86f1857329957fb0 +fd71a64340425384294a115d3a42bc8069ac9f67 +08784cd3a744ca0750c746910124a6056d46f608 +ee9284abb97ecdc3ed78a4807303124652924051 +c9cfae108e2aaea3b12010dfd0404f7bbffa5c2a +d7a63c81f8bed7df99b942d88a380c100e74accd +23fc6eff1bbf238513e2f9c76e40762f01b1737d +485c7afff53fcb4f694a5b3cfdc09c372cf73e18 +8656b25529d3e5aabde19eb42d10aec5d8af2088 +fe954e108708531e155eadf4945fff5e432c57b3 +0f5fe6ee00187bde832acb092e42431f9fa8430c +8827ce43536f7246e21f643fdcc1b1ad44c05a12 +869e1a290cb6ce44eada26c00d5abee0e5c2ecd5 +a2215dc789a33e1ab3be1dfcc03e8f7f02d046d5 +62a233d2e55b159001ed622fb96b9444fce9c11d +26fff6559df5149b98c3366e7c01236daaf2b1d1 +115e024f021871b307a7a315aef720bbffe1d54c +19719df575d3ae0d8c93c037f7f1972b9e10f1ba +3628f33e8ef1350912bab8d4ae467c7e1f3056fd +e123e08e23278c95e399b3b11da411325135da21 +77b3598df08e6f3a2b4ae157904e30d5aa2ad49a +e071ff877d67787d0a6582ac3dcbcb627dec9ac4 +722a05a34115832ebdfa990a99bd999d097a0ce5 +3dcebec3361c047d19cf639879437ed5b769e7f2 +8f37fd4e1147e623fe6f8cc6d190c304467d999e +5339c690ad044e082f8a31bfe929099d7e75531d +82fd9658604cefb93728b198e73889872ce7d70a +804983224e3f5cccbd52b26bebc53b88369c448c +562f9fdd5811793c11970c856d21c7f0c32118b8 +5914ca61115649643f88ae110eaf3da4b112e6e4 +f44b0a2d303b725a7f5c82048d7423858e78e490 +de5e6430a7c1166ca82500ab7fb82cb95cc643c1 +c174eab1c3615c3ba5dbc0c6c30ac67ab6b47024 +aae0341ca8ab04c9c169f4dde3e2e943d758422a +517dc966b1379d84a9ef741ff9ca43e281868c60 +436fd9441cf9517b6e8b5162db78031228b18d9a +cd7e1db2eb4709309b43cc400d6619aff480484b +5c100f2e25d49a90b25685b9d3bb17a35e325374 +362892feaf8dbf44a0429d3676f9b5e4ea6a46a2 +ca8c5f96adddb61025107907704ec344143b0088 +8c97077f3dc6794837f887a8d57bc8d3c05e8b4b +04ba3c53b4068a8bcf31bbfc674d520ab2843a2d +c91c677ceb1093b393d46dd21252147c3ddecd1f +d85824d0d1dbc389c30ba584837d82e85c5bcd37 +c0f7e29dfb195770d68e6ee608c7129e72a89e23 +e55510a4c7ea27d0e47137479fcb16562f8d380f +8845f1c8a8b45987a6fe69bcd89060ba38475d2d +8ebf95f844971fbacb819e2e05fea4e27402a34c +5be6327602aabcb3fafaf439f69ebc621601d30a +698560f44a2c58c87988498dcbe51e30ea62c989 +29f215bf015e848c5af9a9c70e1e3e052016704f +6211582a40d5a1d67e930e337ea11f1b3538ef5e +80cb64b8ae5710be8044127b678bbc0e010e79a2 +7e613e66f3b7da299b8f4689cfa31da7bb381e31 +128131f6fd6e7bb018806ed5f150a207ae8c7e69 +f686c1c3a2fce19f177aafc281d6c724977a6dfe +56f58b9bd5e4a5c6aec7f2c5a4a04a702fc3f2dc +e63e6ef318e5cc205518f7fc052da7020742f55a +c19c8562df56700121a61f5cdbc8525a46197e1f +7ffa78b92966e11b0142829ae17c871b9f6b5c15 +426952f1145f112142141f26556313924ce7465a +f975e857f57f0f6d96ed50006a7b4e126edf1f1a +8a6220895e1d634d0aa0f41ce6882c98d7b495d0 +12da0f4b955b911a893158bd3beb9b24f1a0043e +ff8441521f15f11db3c60850a1ee551b81661fef +0b88599d7b1e25e59f2da8338520ec3325de9337 +0fda61a11326021d7ff0071b6bd8b2b3517100c8 +acdaf288f8a96f77e2c34104fadf26c04307f5fc +16d04e701ed59f32ea3c4226b553b6f0f50c7426 +7b759405d39047b5aa0f0c22d91c3d254fbaeba1 +facb5a7732d083c66484c9b3dbb274ff1d6a1ee1 +f959116e0606392633e8d8eaeb710664e4532c6c +febbd51aa5181f74d56f3d0e01d38e264444f825 +90ffbc94fcd43cdbd2e54f5cad75d2a7d659bdd8 +61cfcbd1b8ef945165acef5e7145762bb510453d +5477b6eb53ccc404db0ac820d3d858052bdebbe2 +4c6156e3830087141b0014005bf955f1a87e1edc +12dc55dc446574144eb863292c3565736ce0bfc3 +a761ce0dc6d89ad3170a3b69e3d2c71bfd014b8e +8cf55dd9b1bd7a4c8350c81e469d92ec956af62a +8671360c5d830f38316ccc4f63362ded7a2d20a6 +97f1a15d8196c514517e76f1d80571fa769e28b3 +85b2c0a31be506ef27e0ca124be5a89c628de120 +935dfa6867b975280d63f75cdef228372adc40ef +63367984bfa6dcb0ae560d7bab812c622481920c +ec10a4353082865abdb5697560390653c3902065 +b7974f532d25aa2eda5e16e5dc58d3f726373c03 +f804d65a6009874a0c4d555b6e9d8d14cbf935ef +cf251f22dbe2c976d340eaa8469e1ea21ff88a42 +6998dad2b81635da9c328ef829a8b1125393c38b +2a073e0f2e510318e83c16ad9141f5c1a31cf6a2 +eb6f4e52212ccb96b2aa08e0af5949dc8c67a024 +09b9f830b520e68635c45a604641874e0f2bfeb0 +17a33c4bc2856e52acf16f3f86dd7053e340ffc5 +81f4e9eee7d046992f4091cd2d82a6a82981b354 +5a6746c9041d494e8f794e4ecfb6a7c941f5ccce +5249fba450a5865325c2b47ce5fac5a585b2ca23 +e35df1cddab6e311e0b4f0b732c555c51e8a739d +8f95ac3d57280ec506907f000e60b9bcb065b4bf +2750ae3dac18bcf9eecdf9127e5aedaeac19a67e +dc4d88520f9221eea943cdc54bd89e21e52677ca +bdfc42f3dce77e9e964ba2922c19faba2ca563ee +c3b349b83e4fa2389ee59ea9ca036001b358ca02 +3c992e03d64ea763d4b6db96e3371143294172b8 +f40f581bb9a644dc31feeea1bdc3dd6bbc42ccca +d59c8256b9451b83457299244fa9f81d0369081f +b015c20c7868a98a3cee9878553502c708fd96a0 +b6e30268a7f110d767dac9144454d2c6fe49eb34 +dbfc2a5e7753d96913593c41db73a32dac062ff8 diff --git a/examples/05_Llama3.1-8B_Example/download_cnndm.py b/examples/05_Llama_Examples/download_cnndm.py similarity index 99% rename from examples/05_Llama3.1-8B_Example/download_cnndm.py rename to examples/05_Llama_Examples/download_cnndm.py index 3f11430b..cb3521e6 100644 --- a/examples/05_Llama3.1-8B_Example/download_cnndm.py +++ b/examples/05_Llama_Examples/download_cnndm.py @@ -18,9 +18,10 @@ import warnings from argparse import ArgumentParser -from datasets import load_dataset from tqdm import tqdm +from datasets import load_dataset + PROMPT = "Summarize the following news article in 128 tokens. Please output the summary only, without any other text.\n\nArticle:\n{input}\n\nSummary:" diff --git a/examples/05_Llama3.1-8B_Example/offline_llama3_8b_cnn.yaml b/examples/05_Llama_Examples/offline_llama3_8b_cnn.yaml similarity index 100% rename from examples/05_Llama3.1-8B_Example/offline_llama3_8b_cnn.yaml rename to examples/05_Llama_Examples/offline_llama3_8b_cnn.yaml diff --git a/examples/06_Llama2-70B_Example/online_llama2_70b_orca.yaml b/examples/05_Llama_Examples/online_llama2_70b_orca.yaml similarity index 100% rename from examples/06_Llama2-70B_Example/online_llama2_70b_orca.yaml rename to examples/05_Llama_Examples/online_llama2_70b_orca.yaml diff --git a/examples/05_Llama3.1-8B_Example/online_llama3_8b_cnn.yaml b/examples/05_Llama_Examples/online_llama3_8b_cnn.yaml similarity index 100% rename from examples/05_Llama3.1-8B_Example/online_llama3_8b_cnn.yaml rename to examples/05_Llama_Examples/online_llama3_8b_cnn.yaml diff --git a/examples/05_Llama_Examples/qwen-multiple-concurrency.yaml b/examples/05_Llama_Examples/qwen-multiple-concurrency.yaml new file mode 100644 index 00000000..cc84aafe --- /dev/null +++ b/examples/05_Llama_Examples/qwen-multiple-concurrency.yaml @@ -0,0 +1,48 @@ +# docker run --gpus all --rm --shm-size 8g -p 30000:30000 -v ~/.cache/huggingface:/root/.cache/huggingface lmsysorg/sglang:latest python3 -m sglang.launch_server --model-path Qwen/Qwen2.5-0.5B-Instruct --port 30000 --host 0.0.0.0 --attention-backend triton +# Online Benchmark +name: "online-qwen2_5_0_5b_instruct-cnn-benchmark" +version: "1.0" +type: "online" + +model_params: + name: "Qwen/Qwen2.5-0.5B-Instruct" # Path to the model + temperature: 0.0 + top_p: 1.0 + max_new_tokens: 128 + +datasets: + - name: cnn_dailymail::llama3_8b + type: "performance" + parser: + input: prompt + +settings: + runtime: + min_duration_ms: 600000 # 10 minutes + max_duration_ms: 3600000 # 60 minutes (Arbitrary here, and doesn't have counterpart in legacy loadgen) + scheduler_random_seed: 137 # For Poisson/distribution sampling + dataloader_random_seed: 111 # For dataset shuffling (Will be updated after rng seeds are finalized for submission) + # n_samples_to_issue: 1000 + + load_pattern: + type: "concurrency" + target_concurrency: [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] + + client: + #workers: 4 # Number of client workers + max_connections: 25000 + warmup_connections: true + +metrics: + collect: + - "throughput" + - "latency" + - "ttft" + - "tpot" + +endpoint_config: + endpoints: + - "http://localhost:30000" + api_key: null + +report_dir: logs/qwen2_5_0_5b_instruct_cnn_online_multiple_concurrency_17FEB26/ diff --git a/examples/06_Llama2-70B_Example/README.md b/examples/06_Llama2-70B_Example/README.md deleted file mode 100644 index 94cc6ed4..00000000 --- a/examples/06_Llama2-70B_Example/README.md +++ /dev/null @@ -1,58 +0,0 @@ -# Running Endpoints with Llama2-70B - -This document describes how to perform MLPerf Llama2-70B benchmarking using the inference endpoints. Additional instructions to download the model and dataset are provided in [Reference Implementation for llama2-70b](https://github.com/mlcommons/inference/tree/master/language/llama2-70b) - -## (Optional) Get Dataset - -You can use the MLCommons R2 Downloader to download the preprocessed dataset from a Cloudflare R2 bucket (more information about the MLC R2 Downloader, including how to run it on Windows, can be found [here](https://inference.mlcommons-storage.org)). - -Navigate in the terminal to your desired download directory and run the following command to download the dataset: - -``` -bash <(curl -s https://raw.githubusercontent.com/mlcommons/r2-downloader/refs/heads/main/mlc-r2-downloader.sh) https://inference.mlcommons-storage.org/metadata/llama-2-70b-open-orca-dataset.uri -``` - -Dataset will be downloaded automatically to ./open_orca before benchmark if not downloaded previously. - -## Get Model - -First go to [meta-llama/Llama-2-70b-chat-hf](https://huggingface.co/meta-llama/Llama-2-70b-chat-hf) and make a request, sign in to HuggingFace (if you don't have an account, you'll need to create one). Create an access token with read permissions. - -Set the following environment variables, then download the model to the local HuggingFace cache. Setting `HF_HOME` before downloading ensures the model lands in the same directory that Docker will mount, so the container reuses the cached weights instead of downloading them at startup: - -``` -export MODEL_NAME=meta-llama/Llama-2-70b-chat-hf -export HF_TOKEN= -export HF_HOME= -hf download $MODEL_NAME -``` - -## Prepare for accuracy evaluation - -Accuracy evaluation for MLPerf Llama2-70B requires additional setup. Before running the benchmark, run the following: - -``` -uv pip install nltk evaluate rouge_score -uv run python -c 'import nltk; nltk.download("punkt"); nltk.download("punkt_tab")' -``` - -These steps are not needed when doing performance-only runs. - -## Benchmark Llama2-70b using a config file - -To run [llama2-70b](https://huggingface.co/meta-llama/Llama-2-70b-chat-hf) on a single Nvidia-H200 GPU, launch the vLLM Docker container. The `-v ${HF_HOME}:/root/.cache/huggingface` mount makes the locally downloaded model available inside the container: - -``` -docker run --runtime nvidia --gpus all \ - -v ${HF_HOME}:/root/.cache/huggingface \ - --env "HUGGING_FACE_HUB_TOKEN=$HF_TOKEN" \ - -p 8000:8000 \ - --ipc=host \ - vllm/vllm-openai:latest --model ${MODEL_NAME} --gpu-memory-utilization 0.95 -``` - -And launch the benchmark using the config file `online_llama2_70b_orca.yaml` - -``` -uv run inference-endpoint benchmark from-config -c examples/06_Llama2-70B_Example/online_llama2_70b_orca.yaml --timeout 600 -``` diff --git a/examples/README.md b/examples/README.md index bb3e4367..c1900811 100644 --- a/examples/README.md +++ b/examples/README.md @@ -21,13 +21,9 @@ Compare `inference-endpoint` with [vLLM's](https://github.com/vllm-project/vllm) End-to-end example for benchmarking `openai/gpt-oss-120b` with vLLM or SGLang, including YAML configs and Python scripts for AIME25, GPQA, and LiveCodeBench accuracy evaluation. -### [05_Llama3.1-8B_Example](05_Llama3.1-8B_Example/) +### [05_Llama_Examples](05_Llama_Examples/) -Sample yaml configuration to benchmark `meta-llama/Llama-3.1-8B-Instruct`. - -### [06_Llama2-70B_Example](06_Llama2-70B_Example/) - -Sample yaml configuration for online benchmarking of `meta-llama/Llama-2-70b-chat-hf`. +Sample yaml configurations for benchmarking `meta-llama/Llama-3.1-8B-Instruct` (offline + online) and `meta-llama/Llama-2-70b-chat-hf` (online). ### [08_Qwen3-VL-235B-A22B_Example](08_Qwen3-VL-235B-A22B_Example/) From 0d7353f23800e23e2f087078d53d55a276d57a40 Mon Sep 17 00:00:00 2001 From: Rashid Kaleem <230885705+arekay-nv@users.noreply.github.com> Date: Mon, 27 Apr 2026 21:19:07 -0500 Subject: [PATCH 2/4] Sync lock Signed-off-by: Rashid Kaleem <230885705+arekay-nv@users.noreply.github.com> --- uv.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/uv.lock b/uv.lock index ed84bd7e..9017350e 100644 --- a/uv.lock +++ b/uv.lock @@ -877,7 +877,7 @@ requires-dist = [ { name = "sphinx-autodoc-typehints", marker = "extra == 'dev'", specifier = "==3.9.11" }, { name = "sphinx-rtd-theme", marker = "extra == 'dev'", specifier = "==3.1.0" }, { name = "sqlalchemy", marker = "extra == 'sql'", specifier = "==2.0.48" }, - { name = "transformers", specifier = "==5.4.0" }, + { name = "transformers", specifier = "==5.5.0" }, { name = "typing-extensions", specifier = "==4.15.0" }, { name = "uvloop", specifier = "==0.22.1" }, { name = "websocket-client", specifier = "==1.9.0" }, @@ -2403,7 +2403,7 @@ wheels = [ [[package]] name = "transformers" -version = "5.4.0" +version = "5.5.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "huggingface-hub", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'x86_64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, @@ -2416,9 +2416,9 @@ dependencies = [ { name = "tqdm", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'x86_64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, { name = "typer", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'x86_64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0b/4c/42a8e1c7bbe668d8e073941ec3205263afb1cd02683fa5a8a75e615fdfbe/transformers-5.4.0.tar.gz", hash = "sha256:cb34ca89dce345ae3224b290346b9c0fa9694b951d54f3ed16334a4b1bfe3d04", size = 8152836, upload-time = "2026-03-27T00:24:24.692Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ff/9d/fb46e729b461985f41a5740167688b924a4019141e5c164bea77548d3d9e/transformers-5.5.0.tar.gz", hash = "sha256:c8db656cf51c600cd8c75f06b20ef85c72e8b8ff9abc880c5d3e8bc70e0ddcbd", size = 8237745, upload-time = "2026-04-02T16:13:08.113Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0b/a0/0a87883e564e364baab32adcacb4bec2e200b28a568423c8cf7fde316461/transformers-5.4.0-py3-none-any.whl", hash = "sha256:9fbe50602d2a4e6d0aa8a35a605433dfac72d595ee2192eae192590a6cc2df86", size = 10105556, upload-time = "2026-03-27T00:24:21.735Z" }, + { url = "https://files.pythonhosted.org/packages/e7/28/35f7411ff80a3640c1f4fc907dcbb6a65061ebb82f66950e38bfc9f7f740/transformers-5.5.0-py3-none-any.whl", hash = "sha256:821a9ff0961abbb29eb1eb686d78df1c85929fdf213a3fe49dc6bd94f9efa944", size = 10245591, upload-time = "2026-04-02T16:13:03.462Z" }, ] [[package]] From 790a08a561f912e93cdfe699126b715fafc1f6e1 Mon Sep 17 00:00:00 2001 From: Rashid Kaleem <230885705+arekay-nv@users.noreply.github.com> Date: Mon, 27 Apr 2026 21:24:09 -0500 Subject: [PATCH 3/4] Fixes. Signed-off-by: Rashid Kaleem <230885705+arekay-nv@users.noreply.github.com> --- examples/05_Llama_Examples/README.md | 7 +-- .../qwen-multiple-concurrency.yaml | 48 ------------------- 2 files changed, 4 insertions(+), 51 deletions(-) delete mode 100644 examples/05_Llama_Examples/qwen-multiple-concurrency.yaml diff --git a/examples/05_Llama_Examples/README.md b/examples/05_Llama_Examples/README.md index 2049674c..f9456654 100644 --- a/examples/05_Llama_Examples/README.md +++ b/examples/05_Llama_Examples/README.md @@ -13,10 +13,9 @@ This example covers benchmarking two Llama models: The Llama3.1-8B benchmark uses the [cnn/dailymail](https://huggingface.co/datasets/abisee/cnn_dailymail) dataset. When using the provided config files, the validation split is downloaded automatically by specifying the dataset name as `- name: cnn_dailymail::llama3_8b`. -For post-training quantization calibration, use the [cnn-dailymail-calibration-list](https://github.com/mlcommons/inference/blob/v4.0/calibration/CNNDailyMail/calibration-list.txt): +For post-training quantization calibration, use the repository-provided [`calibration-list.txt`](./calibration-list.txt), which corresponds to the [cnn-dailymail-calibration-list](https://github.com/mlcommons/inference/blob/v4.0/calibration/CNNDailyMail/calibration-list.txt): ```bash -curl -OL https://raw.githubusercontent.com/mlcommons/inference/v4.0/calibration/CNNDailyMail/calibration-list.txt uv run python download_cnndm.py --save-dir data --calibration-ids-file calibration-list.txt --split train ``` @@ -54,6 +53,8 @@ uv run inference-endpoint benchmark from-config -c offline_llama3_8b_cnn.yaml -- uv run inference-endpoint benchmark from-config -c online_llama3_8b_cnn.yaml --timeout 600 ``` +These configs run in performance-only mode by default. To also evaluate summarization quality, add `--mode both` and install the accuracy dependencies listed in the [Llama-2-70b accuracy setup](#accuracy-evaluation-setup-optional) section below. + --- ## Llama-2-70b-chat-hf @@ -67,7 +68,7 @@ bash <(curl -s https://raw.githubusercontent.com/mlcommons/r2-downloader/refs/he https://inference.mlcommons-storage.org/metadata/llama-2-70b-open-orca-dataset.uri ``` -The dataset will be downloaded automatically to `./open_orca`. Additional instructions for downloading the model and dataset are in the [Reference Implementation for llama2-70b](https://github.com/mlcommons/inference/tree/master/language/llama2-70b). +Running the script above will download the dataset to the `./open_orca` directory. Additional instructions for downloading the model and dataset are in the [Reference Implementation for llama2-70b](https://github.com/mlcommons/inference/tree/master/language/llama2-70b). ### Environment diff --git a/examples/05_Llama_Examples/qwen-multiple-concurrency.yaml b/examples/05_Llama_Examples/qwen-multiple-concurrency.yaml deleted file mode 100644 index cc84aafe..00000000 --- a/examples/05_Llama_Examples/qwen-multiple-concurrency.yaml +++ /dev/null @@ -1,48 +0,0 @@ -# docker run --gpus all --rm --shm-size 8g -p 30000:30000 -v ~/.cache/huggingface:/root/.cache/huggingface lmsysorg/sglang:latest python3 -m sglang.launch_server --model-path Qwen/Qwen2.5-0.5B-Instruct --port 30000 --host 0.0.0.0 --attention-backend triton -# Online Benchmark -name: "online-qwen2_5_0_5b_instruct-cnn-benchmark" -version: "1.0" -type: "online" - -model_params: - name: "Qwen/Qwen2.5-0.5B-Instruct" # Path to the model - temperature: 0.0 - top_p: 1.0 - max_new_tokens: 128 - -datasets: - - name: cnn_dailymail::llama3_8b - type: "performance" - parser: - input: prompt - -settings: - runtime: - min_duration_ms: 600000 # 10 minutes - max_duration_ms: 3600000 # 60 minutes (Arbitrary here, and doesn't have counterpart in legacy loadgen) - scheduler_random_seed: 137 # For Poisson/distribution sampling - dataloader_random_seed: 111 # For dataset shuffling (Will be updated after rng seeds are finalized for submission) - # n_samples_to_issue: 1000 - - load_pattern: - type: "concurrency" - target_concurrency: [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] - - client: - #workers: 4 # Number of client workers - max_connections: 25000 - warmup_connections: true - -metrics: - collect: - - "throughput" - - "latency" - - "ttft" - - "tpot" - -endpoint_config: - endpoints: - - "http://localhost:30000" - api_key: null - -report_dir: logs/qwen2_5_0_5b_instruct_cnn_online_multiple_concurrency_17FEB26/ From 9260d6f77eef2196db35cd4ba1348e92d9e68859 Mon Sep 17 00:00:00 2001 From: Rashid Kaleem <230885705+arekay-nv@users.noreply.github.com> Date: Mon, 27 Apr 2026 22:29:31 -0500 Subject: [PATCH 4/4] Fixes. Signed-off-by: Rashid Kaleem <230885705+arekay-nv@users.noreply.github.com> --- examples/05_Llama_Examples/download_cnndm.py | 3 +-- src/inference_endpoint/commands/benchmark/execute.py | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/examples/05_Llama_Examples/download_cnndm.py b/examples/05_Llama_Examples/download_cnndm.py index cb3521e6..3f11430b 100644 --- a/examples/05_Llama_Examples/download_cnndm.py +++ b/examples/05_Llama_Examples/download_cnndm.py @@ -18,9 +18,8 @@ import warnings from argparse import ArgumentParser -from tqdm import tqdm - from datasets import load_dataset +from tqdm import tqdm PROMPT = "Summarize the following news article in 128 tokens. Please output the summary only, without any other text.\n\nArticle:\n{input}\n\nSummary:" diff --git a/src/inference_endpoint/commands/benchmark/execute.py b/src/inference_endpoint/commands/benchmark/execute.py index 73c3427f..fec8afa1 100644 --- a/src/inference_endpoint/commands/benchmark/execute.py +++ b/src/inference_endpoint/commands/benchmark/execute.py @@ -488,7 +488,7 @@ async def _run_benchmark_async( args=event_logger_args, ), ], - timeout=30.0, + timeout=300.0, ) # Create endpoint client on the shared loop