{ "cells": [ { "cell_type": "markdown", "source": [ "Some imports just to render the results in colab" ], "metadata": { "id": "DvGm0V_AWiEw" } }, { "cell_type": "code", "source": [ "!pip install swig\n", "!pip install gymnasium[box2d]" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "E05FHRDUNm5Q", "outputId": "b4803c1e-d2c1-4cd8-846b-ba7d2e9cdd61" }, "execution_count": 1, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Requirement already satisfied: swig in /usr/local/lib/python3.10/dist-packages (4.2.1)\n", "Requirement already satisfied: gymnasium[box2d] in /usr/local/lib/python3.10/dist-packages (0.29.1)\n", "Requirement already satisfied: numpy>=1.21.0 in /usr/local/lib/python3.10/dist-packages (from gymnasium[box2d]) (1.25.2)\n", "Requirement already satisfied: cloudpickle>=1.2.0 in /usr/local/lib/python3.10/dist-packages (from gymnasium[box2d]) (2.2.1)\n", "Requirement already satisfied: typing-extensions>=4.3.0 in /usr/local/lib/python3.10/dist-packages (from gymnasium[box2d]) (4.10.0)\n", "Requirement already satisfied: farama-notifications>=0.0.1 in /usr/local/lib/python3.10/dist-packages (from gymnasium[box2d]) (0.0.4)\n", "Requirement already satisfied: box2d-py==2.3.5 in /usr/local/lib/python3.10/dist-packages (from gymnasium[box2d]) (2.3.5)\n", "Requirement already satisfied: pygame>=2.1.3 in /usr/local/lib/python3.10/dist-packages (from gymnasium[box2d]) (2.5.2)\n", "Requirement already satisfied: swig==4.* in /usr/local/lib/python3.10/dist-packages (from gymnasium[box2d]) (4.2.1)\n" ] } ] }, { "cell_type": "code", "source": [ "\n", "from gymnasium.wrappers import RecordVideo\n", "import glob\n", "import io\n", "import base64\n", "from IPython.display import HTML\n", "from IPython import display\n", "\n", "\"\"\"\n", "Utility functions to enable video recording of gym environment\n", "and displaying it.\n", "To enable video, just do \"env = wrap_env(env)\"\"\n", "\"\"\"\n", "\n", "def show_video():\n", " mp4list = glob.glob('video/*.mp4')\n", " if len(mp4list) > 0:\n", " mp4 = mp4list[0]\n", " video = io.open(mp4, 'r+b').read()\n", " encoded = base64.b64encode(video)\n", " display.display(HTML(data=''''''.format(encoded.decode('ascii'))))\n", " else:\n", " print(\"Could not find video\")\n", "" ], "metadata": { "id": "Q5PGqOlHWjC5" }, "execution_count": 2, "outputs": [] }, { "cell_type": "markdown", "source": [ "We will work on the Lunar-Lander environment:\n", "\n", "https://gymnasium.farama.org/environments/box2d/lunar_lander/" ], "metadata": { "id": "70l66Noa6ECO" } }, { "cell_type": "code", "execution_count": 3, "metadata": { "id": "NaYswgHeLhvq" }, "outputs": [], "source": [ "import gymnasium as gym\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from collections import deque\n", "\n", "env = gym.make(\"LunarLander-v2\", render_mode=\"human\")" ] }, { "cell_type": "markdown", "metadata": { "id": "k9w5IYGJLhvt" }, "source": [ "From the previous notebook, we can obtain the action and state space" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "U_QvDHr8Lhvv", "outputId": "f2a706da-c7dd-4d95-f67d-993772eda966" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Actions : Discrete(4)\n", "Variables: Box([-1.5 -1.5 -5. -5. -3.1415927 -5.\n", " -0. -0. ], [1.5 1.5 5. 5. 3.1415927 5. 1.\n", " 1. ], (8,), float32)\n", "Max. var: [1.5 1.5 5. 5. 3.1415927 5. 1.\n", " 1. ]\n", "Min. var: [-1.5 -1.5 -5. -5. -3.1415927 -5.\n", " -0. -0. ]\n" ] } ], "source": [ "print('Actions : ',env.action_space)\n", "print('Variables: ',env.observation_space)\n", "print('Max. var: ',env.observation_space.high)\n", "print('Min. var: ',env.observation_space.low)" ] }, { "cell_type": "markdown", "metadata": { "id": "DH_8llutLhvw" }, "source": [ "Variables correspond to position in x axis and speed. Actions correspond to forward and backward acceleration respectively.\n", "\n", "Let's see performance of random behaviour" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 562 }, "id": "FCqI1P6hLhvw", "outputId": "214df23f-2473-40a8-f8ae-2dab408bfd77" }, "outputs": [ { "output_type": "stream", "name": "stderr", "text": [ "/usr/local/lib/python3.10/dist-packages/gymnasium/wrappers/record_video.py:94: UserWarning: \u001b[33mWARN: Overwriting existing videos at /content/video folder (try specifying a different `video_folder` for the `RecordVideo` wrapper if this is not desired)\u001b[0m\n", " logger.warn(\n" ] }, { "output_type": "stream", "name": "stdout", "text": [ "Moviepy - Building video /content/video/rl-video-episode-0.mp4.\n", "Moviepy - Writing video /content/video/rl-video-episode-0.mp4\n", "\n" ] }, { "output_type": "stream", "name": "stderr", "text": [] }, { "output_type": "stream", "name": "stdout", "text": [ "Moviepy - Done !\n", "Moviepy - video ready /content/video/rl-video-episode-0.mp4\n" ] }, { "output_type": "display_data", "data": { "text/plain": [ "" ], "text/html": [ "" ] }, "metadata": {} } ], "source": [ "env.close()\n", "env = RecordVideo(gym.make(\"LunarLander-v2\",render_mode='rgb_array'),'video')\n", "\n", "observation, _ = env.reset()\n", "\n", "for _ in range(300):\n", " env.render()\n", " action = env.action_space.sample() # this takes random actions\n", " observation, reward, terminated , truncated, info = env.step(action)\n", " if terminated or truncated:\n", " break\n", "env.close()\n", "show_video()" ] }, { "cell_type": "markdown", "source": [ "# Q-learning with DNN\n", "\n", "## Some definitions\n", "\n", "1. Create the Q Neural Networks and initialize them\n" ], "metadata": { "id": "ROr0NfAVO0MH" } }, { "cell_type": "code", "source": [ "import torch\n", "import torch.nn as nn\n", "import torch.nn.functional as F\n", "\n", "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n", "\n", "class Qvalue(nn.Module):\n", " def __init__(self, input, output):\n", " super(Qvalue, self).__init__()\n", " self.fc1 = nn.Linear(input, 64)\n", " self.fc2 = nn.Linear(64, 64)\n", " self.Q = nn.Linear(64, output)\n", "\n", " def forward(self, s):\n", " x = self.fc1(s)\n", " x = F.relu(x)\n", " x = self.fc2(x)\n", " x = F.relu(x)\n", " output = self.Q(x)\n", "\n", " return output\n", "\n", "def init_weights(m):\n", " if type(m) == nn.Linear:\n", " nn.init.orthogonal_(m.weight)\n", "\n", "def copy_target(target, source):\n", " for target_param, param in zip(target.parameters(), source.parameters()):\n", " target_param.data.copy_(param.data)\n", "\n", "def soft_update(target_model, local_model, tau):\n", " for target_param, local_param in zip(target_model.parameters(), local_model.parameters()):\n", " target_param.data.copy_(tau*local_param.data + (1.0-tau)*target_param.data)\n", "" ], "metadata": { "id": "JHYosPQHO7Aq" }, "execution_count": 6, "outputs": [] }, { "cell_type": "code", "source": [ "Q = Qvalue(env.observation_space.shape[0],env.action_space.n).to(device)\n", "Q_target = Qvalue(env.observation_space.shape[0],env.action_space.n).to(device)\n", "\n", "Q.apply(init_weights) #\n", "\n", "copy_target(Q_target, Q) #\n", "\n", "criterion=nn.MSELoss()\n", "optimizer=torch.optim.Adam(Q.parameters(),lr=5e-4)\n" ], "metadata": { "id": "HG0Wz-PGDgVx" }, "execution_count": 7, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "3d6nnayNLhv1" }, "source": [ "2. Definition of the Experience Replay buffer" ] }, { "cell_type": "code", "source": [ "import random\n", "import numpy as np\n", "\n", "class ReplayMemory:\n", " def __init__(self, capacity, seed):\n", " random.seed(seed)\n", " self.capacity = capacity\n", " self.buffer = []\n", " self.position = 0\n", "\n", " def push(self, state, action, reward, next_state, terminated, truncated):\n", " if len(self.buffer) < self.capacity:\n", " self.buffer.append(None)\n", " self.buffer[self.position] = (state, action, reward, next_state, terminated, truncated)\n", " self.position = (self.position + 1) % self.capacity\n", "\n", " def sample(self, batch_size):\n", " batch = random.sample(self.buffer, min(len(self.buffer), batch_size))\n", " state, action, reward, next_state, terminated, truncated = map(np.stack, zip(*batch))\n", " return state, action, reward, next_state, terminated, truncated\n", "\n", " def __len__(self):\n", " return len(self.buffer)\n", "\n" ], "metadata": { "id": "tacQaa6WkScb" }, "execution_count": 8, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "7RwwqDVMLhvz" }, "source": [ "\n", "Function that implements the epsilon-greedy procedure" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "id": "KfDwNCIDLhv1" }, "outputs": [], "source": [ "def e_greedy_policy(Qs):\n", " return env.action_space.sample() if (np.random.random() <= epsilon) else np.argmax(Qs)\n" ] }, { "cell_type": "markdown", "source": [ "Function just to collect performance of *niter* iterations of the greedy plolicy (no exploration)" ], "metadata": { "id": "M7vgMaJP8TF8" } }, { "cell_type": "code", "execution_count": 10, "metadata": { "id": "CYbG98YULhv2" }, "outputs": [], "source": [ "def rollout(niter):\n", " G = 0\n", " for i in range(niter):\n", " state, _ = env.reset()\n", " for _ in range(1000):\n", " Qs = Q(torch.tensor(state).to(device)).detach().cpu().numpy()\n", " action = np.argmax(Qs)\n", " next_state, reward, terminated , truncated, info = env.step(action)\n", " G += reward\n", " if truncated or terminated: break\n", " state = next_state\n", " return G/niter\n" ] }, { "cell_type": "markdown", "source": [ "## Start the learning" ], "metadata": { "id": "BQVAZrpS8Iwr" } }, { "cell_type": "code", "source": [ "env.close()\n", "env = gym.make(\"LunarLander-v2\")\n" ], "metadata": { "id": "C4tmSE9G3u1X" }, "execution_count": 11, "outputs": [] }, { "cell_type": "code", "source": [ "ER = ReplayMemory(int(1e6),1)" ], "metadata": { "id": "p15LxZML7jES" }, "execution_count": 12, "outputs": [] }, { "cell_type": "code", "execution_count": 14, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Mw6qKMb3Lhv3", "outputId": "7c5655d4-afa3-47be-814b-77aa030b193a" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ " episode: 99 avg reward: -104.66 epsilon: 0.61 steps 9804\n", " episode: 199 avg reward: -22.83 epsilon: 0.37 steps 47752\n", " episode: 299 avg reward: 57.36 epsilon: 0.22 steps 125610\n", " episode: 399 avg reward: 151.07 epsilon: 0.14 steps 200650\n", " episode: 499 avg reward: 212.47 epsilon: 0.08 steps 254516\n", " episode: 599 avg reward: 188.89 epsilon: 0.05 steps 305507\n", " episode: 699 avg reward: 208.04 epsilon: 0.03 steps 351906\n", " episode: 700 avg reward: 208.08\n", " elapsed 20.92 minutes\n" ] } ], "source": [ "import time\n", "t = time.time()\n", "\n", "# Parameters of learning\n", "gamma = 0.99\n", "numEpisodes = 800 # 1000\n", "epsilon = 1\n", "\n", "# Variables to collect scores of 100 episodes\n", "rewardTracker = [] # with exploration\n", "scores_window = deque(maxlen=100)\n", "all_rewards=[]\n", "\n", "# NN parameters\n", "batch_size=64\n", "steps=0\n", "for episodeNum in range(1,numEpisodes+1):\n", " G = 0\n", " state, _ = env.reset()\n", "\n", " while True:\n", "\n", " # Collect data\n", " with torch.no_grad():\n", " Qs = Q(torch.tensor(state).to(device)).detach().cpu().numpy()\n", " action = e_greedy_policy(Qs) # select action with epsilon-greedy procedure\n", " next_state, reward, terminated , truncated, info = env.step(action)\n", " ER.push(state, action, reward, next_state, terminated, truncated)\n", " G= G+reward\n", " state = next_state\n", " steps=steps+1\n", "\n", " # Train\n", " if batch_size<=len(ER):\n", " # Get batch from exprience replay\n", " state_batch, action_batch, reward_batch, next_state_batch, terminated_batch, truncated_batch = ER.sample(batch_size)\n", " state_batch = torch.FloatTensor(state_batch).to(device)\n", " action_batch = torch.Tensor(action_batch).to(dtype=torch.long).to(device).unsqueeze(1)\n", " next_state_batch = torch.FloatTensor(next_state_batch).to(device)\n", " reward_batch = torch.FloatTensor(reward_batch).to(device).unsqueeze(1)\n", " terminated_batch = torch.FloatTensor(terminated_batch).to(dtype=torch.long).to(device).unsqueeze(1)\n", " truncated_batch = torch.FloatTensor(truncated_batch).to(dtype=torch.long).to(device).unsqueeze(1)\n", "\n", " #q_targets_next = torch.gather(Q_target(next_state_batch).detach(),1,torch.argmax(Q(next_state_batch).detach(),dim=1,keepdim = True)) # Double Q-learning\n", " q_targets_next = torch.max(Q_target(next_state_batch).detach(),dim=1,keepdim = True)[0] # Standard DQN\n", "\n", " #target = reward_batch+ (1-(truncated_batch + terminated_batch)) *gamma*q_targets_next\n", " target = reward_batch+ (1-(terminated_batch)) *gamma*q_targets_next\n", "\n", " q_expected = torch.gather(Q(state_batch),1,action_batch)\n", "\n", " loss = criterion(q_expected, target) #MSE\n", " optimizer.zero_grad()\n", " loss.backward()\n", " optimizer.step()\n", "\n", " soft_update(Q_target, Q, 1e-3)\n", "\n", " if truncated or terminated: break\n", "\n", " scores_window.append(G)\n", " all_rewards.append(G)\n", " epsilon = max(0.01, 0.995*epsilon)\n", " print('\\r episode:',episodeNum,'avg reward:', np.round(np.mean(scores_window),2),end='')\n", "\n", " if episodeNum%100==99:\n", " rewardTracker.append(np.mean(scores_window))\n", " print('\\r episode:',episodeNum,'avg reward:', np.round(np.mean(scores_window),2), 'epsilon:', np.round(epsilon,2),'steps',steps)\n", "\n", "elapsed = time.time() - t\n", "\n", "print('\\n elapsed', np.round(elapsed/60,2),'minutes')\n" ] }, { "cell_type": "markdown", "source": [ "See plots of learning. All rewards and average of 100 experiments" ], "metadata": { "id": "CPXWxcla7qHE" } }, { "cell_type": "code", "source": [ "plt.plot(all_rewards)\n", "plt.plot(list(range(50,(len(rewardTracker)+1)*100-50,100)),rewardTracker,color='r')\n", "plt.show()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 430 }, "id": "1m7s5chI7VyW", "outputId": "8b7ac6d6-2516-4007-8be0-687a9d408aca" }, "execution_count": 15, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjMAAAGdCAYAAADnrPLBAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAChJklEQVR4nO2dd3QTV9rGn5FkuYALBmyDbXrvvQZICAHSK+mFFFKW9HzZTdlN32U3dZNsElJJJaT3Ru8ttNBC78UYY3C3ZUnz/SGPdGfmTlOxJPv9ncNB0rQ7o/HcR28VRFEUQRAEQRAEEafYoj0AgiAIgiCIUCAxQxAEQRBEXENihiAIgiCIuIbEDEEQBEEQcQ2JGYIgCIIg4hoSMwRBEARBxDUkZgiCIAiCiGtIzBAEQRAEEdc4oj2A+sDr9eLIkSNITU2FIAjRHg5BEARBECYQRRFlZWVo3bo1bDZt+0ujEDNHjhxBfn5+tIdBEARBEEQQHDx4EHl5eZrLG4WYSU1NBeC7GGlpaVEeDUEQBEEQZigtLUV+fr5/HteiUYgZybWUlpZGYoYgCIIg4gyjEBEKACYIgiAIIq4hMUMQBEEQRFxDYoYgCIIgiLiGxAxBEARBEHENiRmCIAiCIOIaEjMEQRAEQcQ1JGYIgiAIgohrSMwQBEEQBBHXkJghCIIgCCKuITFDEARBEERcQ2KGIAiCIIi4hsQMQRAEQRBxDYkZgiAIgggjLrcXby/eg+0FZdEeSqOBxAxBEARBhJF3l+7FP3/+ExP+uzjaQ2k0kJghCIIgiDCy/sDJaA+h0UFihiAIgiDCiFcUoz2ERgeJGYIgCIIII17SMvUOiRmCIAiCCCNkmal/SMwQBEEQRBjxkGmm3iExQxAEESe8tXg3xj6/EIVl1dEeStgQG6AVowGeUsxDYoYgCCJO+NfP27CnqAIvz90Z7aGEhUU7jmPA03MwZ+uxaA8lrOi5mcqqa3GwuLIeR9M4IDFDEAQRZ7jc3ojt21uPLpIb3luNk5W1mPLhmno7Zn2g52Y67T8LMOrZBZYFzdGSKnJf6UBihiAIggAA3PfZBox5fgEqXe5oDyWu0XMzlVTVAgBW7Dlhen/Ldxdh+LT5uPezDSGOrOFCYoYgiLBwsLiyXn/VE+Hnm/WHcbC4CrO3NCy3T32j5WZi44MS7ILp/b0yz+dW/OGPI3B7vCgoaTgxU+GCxAxBECHzwx9HMOrZBfjHd5ujPZS4prjChepaT7SHQe6MEPEwouVEeY3/dXVtwD2YYDc//RZXuPyvJ8/4HcOmzcPa/VRlmIXEDEEQIfPC7O0AgE9WHYjySOKXE+U1GPD0HIz89/x6PW5xhQsvz92JQycDMRyeMKTj7Cosx0lmEo42JVW1eHH2duwqLI/4sVgtOPCZuaj1+ERMWXWt/3MB5i0zrJhZuqsIADBrNf2tsTiiPQCCIOKfpknGjxJRFCEI5h/gscTJChdcHi+y05Iidox1B04BAE5wBEBReQ3W1y0PN3d9ug7Ldp3AL5uP+j8LNV16z/FyjHtxERLsAnb+85xQhxgWnvxhC75edxjTF+/BjmfODtt+F+84juZNnejZOt3/mfL6VdS4kZHiRFlNIBapxm3eAlfMuSdSnPYgRttwIcsMQRAh0zRRX8x8tGIfhk2bh12FZfU0ovBRWl2Lkf+Zj3EvLEJ5TeQCY5MSAo9j5WR4watLQ8r42VdUgad/3IpjpepYi2W7fIGo2woC340nxGSpVXuLAQC1Ht95iKKIHcfKoupC+32fb0zhzATbW1SB699bjXNfWSr7XOmmk96XV7Nixvw4eF6/ZKfDv+9pP/+J+dsad5wTiRmCIEKGFTOljCld4h/fbcGx0ho8+k3kY2pEUQxrgOT7y/ah0uVBWY2bKwbCRVJC4Je2cqI7ojgfq3aTC19bhneX7sWTP2wxtX6obia7TW6BW7C9EONfWoxJ01eEtN9QsOLW0ePQyUrsK6oAAOzmuKz2n6hApUsu2iRRV8aIGT1hV1Zdiz3H9d1hkmXmuw2H8ebiPbjp/YaV3m4VEjMEQYSM9LAGoCsk3PUQWPrvX7dh2LR5+HLtobDsbzczqVS5ImdZSHQEHsfKyTBUpHTgbUe1LWPNmzj9r0PNSnMwYsbjFTFr9UEAwKbDJfB6RRQxQbGxgiiKuPadVbju3VVcN9upShc8XhGn/WcBTn9+ISpdblnWktvjxZYjJRjz3ELsrRM7EpI1qLwmIPTZYGAlpz+3EGNfWITtBdrfV3Kd+D1KmU0ASMwQBBEGWPeLnpipj9L1by7aAwB4+setYdkf6xrQExmFpdUhudFYywFb54Vn6bJCBfPddMxqqrleM0bMhJrNxFpmKl1umaXpjk/WYtAzcyOSjXOq0oVKlxuPfLMJP/xxxHB9VlQdLanG0l1FWLKzSOVOfH/ZXvR7ag4++/0gc6xamZipdns1U9pd/gBgc5YZKW5q/rZCzXWk8DNWOIb69/XHwVOYNH051h+Iv0wpEjMEQYQMm6URyeq0VmBjUEKBnYCKK1x4Z8ke1S9vABjyr3kY9+Jirivq8zUHMfWTdboTGOvaYS1AR05VGY6x0uXGPbPWc9sCbD1a6n+tjG1iLTCZKYxlRjEpFpXX4MkftmDnMetirdLlkZ33b3UT/oxley3vS48T5TXo99Qc9HjsN8xcdQB3fbped/3pi3Zj0DNz8eGKfQDkos+mCFR/4gefMH7km03+zxw2AUt2FvnfV7k8yGQEIUvAMsOIGRMBwB6vV1OgSNZQVjhWBRmT5PGKEEURV7y1Ar/vO4mr3l4Z1H6iCYkZgiBChp3w9VxJ9Vm9hI1BCQU2A+WlOTvwzE9/4swXFvo/c3u8sloiOzgT/l+/3IifNh3FF2sOqpZJsAKCtQAdLDYWMz9uPIrvNhzBlA/XqATTxkMlzH7lFoeTlYEsmfSUBO5YAODBL/7AjGX7cMkbyw3HAsgF7Yxl+7jBrk4LdVb02Hy4BP+bvxPLdutX1FUm0v37l20AgMe+88URVTDXvNajLSIkZizfJytFUF3rQXpyAnddnmWmRsfNJOH2iprVhGs5UdqSO9GISpfbb/Fzub0468VFuP691X7XV3WtF5dPX4FX5+3EJa8v88cIxTKUmk0QRMiwrhi9JnvKReU1bpW1YFtBKeZvK8RNI9vLBMlDX23E5iMl+PqOkXA6jCfCJEeYxAxjddpeJ1RYvXbha8uw5UjA+pGUYMehk5XISUuCQzFhF1doTzaihpj5eOV+wzGyroaPV+5Hp6ymGNOlJQRBwKZDp7j7BYCTlWzdkwDKeVISCuxkrIeL2cH0Rbv5Y7ZQAVeP8171ZRKN7NRctaywrBqztxzD5YPyDTtZs5aZsS8sQocWTfDlHSM01393idyyVFXr0bz3JeFR4TLnZpJwe0TNfbqlfdYE9lNSVYtW6cma+5u9pQAHiivx5uI9OF5Wgy1PTsDu4+XYU1SBPQrBsnpfMVbXZYA999t2vHbNAMPxRhMSMwRBhITXK6LcZdIywzyYZ646gEe+2YR/XtwL1wxtCwA4XlaDif9dAsD3i/HecV3868+qi1dYtOM4zuqRbTiupDDV4TBKx2aFDOCLc3hj4W6M656Nd24YZDqOgb1sJVUurNxzAv3yM7Box3HVurUeL275YA0Gt2uG28Z0lG37zE9/AgCevawPLh+Uj/UHT/mXKQOYWaHGfm/SBLp6bzFEUbTsOjRjdUiw2yAI+n2MrLC7UG09uPLNldhTVGGq1xQrZoorXCiucKGkshbpKQlITrCrXDhKkVHl8nCtJUDAUuVmAuVNiRmvqGnNrK37vmTxVVX653nrR2tl75/7bTuuGJxvOA7tUcQOJGYIggiJcpdbNiHpZcKwS6T4g0e/2YxrhraF2+PF4H/O9S//g5mEWfQsP+xkkhyGmBlRFGVWJzO8sdBniZj7py82xGw9Efa63T1rA1xuL64YxJ9oftlUAJfHi7l/HsNtYzr6f6Wz/PXLjahxe7H/RKCy75r9J/Hcb9vw4IRuAORCjQ02dbm9qK714PI3zadSF5RU458//4kbhrc1dc4JdhsEhM/1yLsvJGvDt+uPqNxMSnjB3XtPVKBfSobPiqQwqinT16trPXB5+GcTEDNeZn3+NXIrrFpszBNLrVtt7bnj47X428RumDQoT1agcu3+k9h/Qi323l++z5Soym+WYrhOtKGYGYIgQkL5MAw2/bpaMQF6ReDAiUo88Pkf3DgUHqVMzIAzDG6m6lqv5vmY7SzNZiPpCTH2MNLk95lGjA3rxlm7vxgPfb2Ju94/vvXV9Ulm3HWvLdiN2z5aA5fbqynUXB6vaZeSxMNfb8QPfxzBZdNXmLLkOBS1aERRxIaDp3CqMrgWCHrX9khJlUxw86xlPAvcvqIKuDWuhXIXVbUev8BQIn1ftcyXrBUA7FII08UcyxwQ+DurZNxMJypc+OtXG2XWvOW7inDpG8tx/+d/cPfDCxpXYqWPVLSI/RESBBHTqKudak9kei4F5Q9nryjipg9+x1frDuHS180Fnp5ixIzWxGKFshrtGJcT5caTrsvtxYhpgV5LFTouq2DTai99w9h6cu2wNrL3v205hqd/3IrNR0q460uWGSvsLw5YgMyU6rfbBVnW0O/7TuKi15bJqumW17hR6/Fi+a4i/3iW7SrC5W+uwK7Ccplo0ksnP1VZiwPM+JTxIQBfnO4tqpDdU3pU1xq7mTwm3ExmXXquuiBlngjbwFg1F+3kiyGJVBOtSJTf58HiyphrRkpihiCIoJAeZmoxo72NVd+71BSwzGQbgaOnAmnRZlJfjdBzMZ2ocHHdOyzdH/tVZtnZdLhEU7REam5olZ6Eyznuqo9W7sdrC/jBubUer8x9wVJYpk49F0VRFq9hZkJ2e0SZ62dp3aR7+FQVvF4RS3cWofcTv6Hr33/B1e+swoNfbgQA3PDeaqzeW4wb3lsts3qxwcxGnPnCItn72VsKUF6jvl/2nagwbSmqMiFmar3GbqYPlhsHfAO+mLOh/5onE2kSbHkAoziaJgatSABfvNolry/DsdJqvLZgF0Y9u8AfmL5ox3FM/WSdqRICkYTEDEEQljlwohJ9n5yNf/+yLWyWGaWbQMttoHQXsEGtbOaMmSBUI6QeQzyKymoMY0OU12bV3mJ8sHwff90IFRTslNXUVCNQFpfbK8uSYRnyz3n+16IoorCsGv/3xUZZATozMTNKwZPDZOEcKK7E3bPWQxQDIk8qgieJw8OnqkynIhtx60druVazfUUVpo9RXevVjJmRRA57P7CWmc2HS/DinB1Yu/8kXpq7w/S4C8tqZD21JKTClTVuDzdWhsVMVeuyajfWHTiF53/bjud+2w4AeG3BLhw6WYkb3luNnzYd9QfoRwsSMwRBWOa/c3egvMaN6Yt2qyZst1fEsl1FOFj3i5G1XuiLGcV7E1rkyR+2otcTv+HPuiBJ9sEeimXG7fFi6sx1eFgjFgUAvtlwOKjGiVIBNiV6MR+hMKxDc6QkWBczejFBknXpmZ/+xJB/zsNX6+StI8y4mWrcHlmQKrvNliOl3E7RAJCVmuh/HS4xA/CtcHuLKmStOvRgs5nat2giWybFwbDZTKyYO+/VpXhl3k48+o32/WaFglKfsLz70/VYblB/x6wbDQD+YNL8B7fLlLXH2HqEH6hcX5CYIQjCMuzEu1nxEFuz/ySueWcVRj27AABw+vML/cv0pgWl+8XM5P7+8n3weEX8sy4dmd2GtcwUldfgie+3YFuB+oFbVF6Di19fhs9+DxRA+3HjUfy08aj//ZguLVXb/ba5IKiKqwmc+iqztxRgGVNNNlzcfFp7TBnVAcmcNPVUHfeCy6NtmQGAP4+WoaSqFu8u5VfxNeNmcrm9sjgpNpvo8Cm16wTwuVZaMmLmIMfFEizHOO6z0mq3qdgoQB4APL6nvHSA383ECPtajlrnWVmC4VhpNaprPf5qy3pYCbhmBabdJsgscLsNGmNGGhIzBEFYhrWi3K0oG/8745oRRRGHTlbJ3pvZp29d8+OR2gtomfH/+uVGvL98H85+eYlq2183F2D9gVP421eb/OZ5ZfO+4R3VBdncXhEndYrgaaGsErv1SClu/Wgt3tEQBoA8G8ksC/7vdPzjvB5wOmyqIoMtUxPx/V2naW6753gFbv94rebyc15ZgjtnrtNcbsrN5PHKYmZYN49WQ8xHvtkkq+tz4ET4xMzC7fxA2ak655ma6MD1w301ktgAYGV1YxfHzeQ2afEJhuIKFy42GTRvJVbrBCNmXG6vzJq270RFRBuxGkFihiAIy+hZTVwm3UpKzFtm1J8fPlUFURQ1xYyU3cHbJVtleNEOX60VZXNHrTobVuqwSChjeeb9afzrWavnjx48C5CEXRCQ30y7UqxWbROWJTqWJPOWGbYhZeD7+nr9YcPtAeB4lLtvJybY/EKTrTOjEjP+AODADWjWfRUsf5r4Dq3C/v3Uerwy0drU6cDhKAYBk5ghiDhCFEXsPl6uW5huV2E5rn57JVbuCfjKC0qqcdp/5uP1hbvCNA7tZbJ0WQtqRmWZsXjsGcv2ycUMMw6tLBNAXqxOyogpU4iZts35YsaKm+mx83r49l3jxu/7iv2xREYxDQDQrAm/548eSmvMogdP97+2CVC1WggnZiwzNW5ty4xZzBQ0NCqWFwqJDrvfhVfBxMwkONRi5t+/bJPVjKn1eLH1SCme+H6L6ePlNUvGveM6665zUb/WpvcXCi6PFzV19//wDs2x8Ynx6KTTlT3SkJghiDji9YW7ceYLi/DUj/wgUsBXBXT57hO48q1A59uX5+3EoZNVePbX7WEZh65lRqf2x67Ccs105mBiZjowgZbbC8pkx/N4Rf+xWJP+N+vlwaqs4DpVWYuKGjeOl8l/8Tdr4lT1kLJCdloibjqtPVLqJr5J01dg1LMLcLysBr/v086Y8h8/xbplRmkdaNs8cK1656UDAF69qr/l/ZrBTADwkp1FMmsMrwKvEWZS9sPVo4uH02Hzuw1LqmoDYkZx7V9fuFvVo8rt8eL2j9fifY3sNh5L/noGumanqj5nO2fnpCfjjK7qGK9wU+MOWGZaZSTJgrmjAYkZgogjpLRIvQdgQak6kFHPkhMMekKD1+OHXXb7x/wYBFU2k8GQ//Xzn7LiZyJEdYl5txf7T1TILCj3fSavhMoKoH1FFRg+bZ4qcDLBJiBPxy2j5LNbh+GlK/r639vrHvT3nBn4VX20pBpfrztkqmJycG4m9eP9hztPw1VD8vHMRb0BAOf3bY3Hz+9hed9GWO3lBAA/bTqq+qxbjnriZpEsaHrXJzEMbS009+2wIaOu23hJZS0TM2M8sdd6RW6NGD0EQVB9r91bpeGWUe39750OG+w243PWc0OagXUzJUZQMJqFxAxBNDB4jygTzzZLmNVGvCqhczViRJTCRy9YuLCsGm8t3qNYX3286loPxjy3UHeM7HF/3VKAUo7rwqYQM3oTQdfsVAzt0FxW3Vb61XrbmI4yi4ky0FiLoCwznM7ivfPSMe2SPrKMoEhgth+VEQPbNtNdLlW/1QuQTjTRYT1YEh02ZCT7vpsTFS6s238KgLny/26PF91bpZk+lnQ7sd3Grx3WBr/cMwq9c9NlYzLjQQzVYsUGAEfyGpuFGk0SRCPAFmYTcDCdoI3XVYoZjWODHzzJi88xyq74fM1BPPadccyCwyagW04a5v7pCxC22wTuGJ66sCcuHZAHQH7NWTH54c1D/C5As3VqlBlQACCIXgzfvxFXbpyNwQe34Fhqc+zJzMXeZq2xJzMPjo2tgS5dgCZNOHtk9mNqBNbQqh5shfTkBORn6jc4lGJmeKnnEklBZIKZxemwIb3OMsMG3JoRM14RyM1I0g3UvX54W3y4wldpV7qfWDGc2SRR9VmCXZC5nQBfir4yjd7psAEhxE+73F5/MHskrV9mITFDEA0Mnu863GLGrEix4t5SahG93i+8s2HjYpx2m69WisGk+te6EvlG2GwCejG/fu0a17NbTpq/PLxMzDCvh3VojvYtmmBvUYVpMSO5MgAgu6wIl22ahys2zkabkoCVq1X5CfQ7ylSP/f4/vv/z8nyipmtX3//S67ZtAYfDdKzDPWd2xroDJ9GiaSK+Mcg2Kq6rzZKUYNMs229Ey9RENDdwr5mxzLAWCKfDFpQLDPAJWOU9meiwI4MjNJUBwFoYWbBYkSJ9S2zgdmbdfZEketDm5FGUJ6bAabfJ7rfJI9rh2mFtVWImNckhS7W2Sqy5mSIqZqZNm4avv/4a27ZtQ3JyMkaMGIH//Oc/6Nq1q3+d6upqPPDAA5g1axZqamowYcIEvP7668jODhQdOnDgAO644w4sWLAATZs2xQ033IBp06bB4SAtRhBKeHOTzaSWOVZajdlbCnDJgDzdni1mq9WazWYqqao13c4A4J+jmylClp6SgONlNaYLnhnhsAnolRtwCSh/+Uqw7id2FaWYlMzyZoNem9i8OGvnSlzxx284Y89a2EXfuZY6UzBvwDh83m4Y0qrL0bH4ENoXH0GH4kMYWHMcOHECOHTI92/+fPlOExKAjh1xRst8VNWkYk9mHvZmtsbezFwUpWSoLvJdYzv5J1IjMVNRd15pSQmorg3u53+Lpk70ycvQXUdyCeqKGcZqkOK0By1murdKxX+v6I9L31jurzzsi5lRCy4zMTOAcWyRZPFIdlWjXXkR8MsvyFn/J/62cAVySwtx2i8VQNFRjDp6FItFEU+PvQVOx2my+9MmCMjN4Md7zbp1mCxRQAnPosOOvdG4mRYtWoSpU6di8ODBcLvdeOSRRzB+/Hhs3boVTepMn/fddx9++uknfPHFF0hPT8edd96JSy65BMuWLQMAeDwenHvuucjJycHy5ctx9OhRXH/99UhISMC//vWvSA6fIBoMZn99X/L6chw+VYWtR0sx7ZI+muuF2zIz6j/z8d2d2kXclAgc2wzr9klP9omZa95ZpTkum1mFB594yc1Ixk0j28Pt9WL2lmPc2Bo2TkWQxczI10usm3yNUrvbFR/G5Zvm4IJ3FuPyE4X+z1fl9UTWvX/ByXMuQFMxASs+XKPadt+/z/WJmR07Av+2b/f9v3MnUF0NbNuGNtu24XbFtqWJTbAnszX2Nsv1ua4yc+HYlAt07mzotmJJTXKgsCw4MdOxZVN0zUnF9GsHahbwk8RAko6bibUaWJl0BUFuLRQgoFNWUyQn2P1ihs1mYjHjZgLqSgaIItJqKpBfcgy5JYXILS2s+/84BnxdgpsPHURmVZ0r6m2gDYA7lGMFUO1wIqm2xhcAzNxwdhs/fsrtFdEqPUl3fBN65miLGZllpoGLmV9//VX2/v3330dWVhbWrl2L0aNHo6SkBO+++y5mzpyJsWPHAgBmzJiB7t27Y+XKlRg2bBhmz56NrVu3Yu7cucjOzka/fv3w9NNP429/+xueeOIJOJ3WA+MIoiHDDQA2KWakolfztxXqrmc2ZsasZaa02m3JMsNbxroAeKZ/lhtmrMYZXbNMjQ3wuZUEQcBjdZk/HVs2xeOc+iDsQ13PMpNUtx7PzZRYW4OJO5bjyo2zMfxAoFfP8ZQMfNVrLD7vMx57mufhl6tHYUCrNCzbpdMGoXlzYPhw3z8Wrxc4eBDYsQOrf12OLYvWokPxYXQoPozckkKk1VSg39Gd6Hd0Z2Cb75/1/Z+bi08czeuETp5P9GTm4lB6Njw2uahITbJWH2fqGR39nbx7tva59Sb2ykGv3DRsPqwdW5KiFwDMWGYcFiLh7YIAN3OfSV8h+1X6gm0FpCU5ZOJWJmZEES0rTvlFSl7pMeSWHEduaSE6Vhah+YkCpLqMi82VJaYgtWsnlOXk4qsiOw6nZeH6K0cjf0AP/OlshrNnbgMEAa84bDKhriXaPV5RN9YIgL+UAA95zEwDdzMpKSkpAQBkZmYCANauXYva2lqMGzfOv063bt3Qpk0brFixAsOGDcOKFSvQu3dvmdtpwoQJuOOOO7Blyxb076+uk1BTU4OamsCvgdLS6DbAIoj6hB8zY20fRhrErJvJSgCwus6M1nr847OF8dgYEx5LdhbpVrBVonQrXTesLV6cs0PV6JCdxNhtlDE2PMtMj2N7cMXG33DRloVIr/GlnHshYFGHAci46w5cfrg5au2B85KEk1krgAybzRcz07Yttqd2wZMJgwL7dbvQ5uRRdCg+jPGOElzatCJg2SkqAg4fxkgcxsj98ngjl82BAxk52JuZi92ZuTjYIg8J7q44VJMmc1vZBP532zc/A3ee0dkvZjq0DFiAeJY4Fr1JmbXMWMnqsykGKij+9+/b7UaXmmLYDh7wW1a67p2Fj1Zt9gmY0uNI9Bi3vShKScfhtCwcTmvpE4b5bdBpcE+8uKMah9OyUJuajj+fnohjheV44sVFAICbrzwTSE+C41gZIPjKNjjtgtwyU/e6W06qrPfTXyd2NWyToVdbyWeZaSRuJhav14t7770XI0eORK9evQAABQUFcDqdyMjIkK2bnZ2NgoIC/zqskJGWS8t4TJs2DU8++WSYz4Ag4hcrLhU9Fu84ju0FZaY6WgPWAoDVdWb42y7cXojurdT1R6QAYEHwxWqEE6VAtNkE9MlLVwkip8wyo+NmqlvPVlKCa9b/gis2zkafgkB15kNpWfi8z1n4ovc4HE1rifcmDkLt+3JXkiSIQq0Xoty6xuHEzpZtsbNlW3i6Z+PSGwJCB8XFwI4d+OCD2Sj7YwvG2k7BsXMH2hQfQZLbhU7Fh9Cp+BDOktb/GXgCvtiePc1zsbdZLopatcWIc0fgrxursbdZa1Q6ffEcDpuApAQb+uVnoLzGjQFtAmnZRrevXsYSa5lRisqZU4bihz+O4NPVB1XbSes63bVoXVqIvhU7gXe24dY5i5BaeBh5pcfR5b1i4Mpj+NKjtrCxs5YXAgpSm/vESnrLuv+zUJvXBuuENBxOa4nqBJ/Lp1lKAm4f0xGX9M/F7K3H8OepzQCAJnVDZ615UmVo9r5zOmywM/eEo+7ifXjTEHy9/jAmDcyDy+NFq/Rk3SB7ALK4ueZNnJzeTI3EzcQydepUbN68GUuXLo34sR5++GHcf//9/velpaXIz8+P+HEJIhYIxc1kxPXvrba0vtHDkkUlXjQ2/WLtIW4WiHQsuyCgaVLkH208CxhrJWEXy66/KKLH7o2Y8NNMnLd9KZLqAmRdNgdmdxmOWX3GY1m7vhAFNt1WPVmEZJkxiUpEZGYCw4Zh0oBBWL23GB07NsfIfy/AibIqtCorQocTh9H+pM9d1aOsAO2LD6NF0VGkuSoDbqutAOZ9gJ/qdnm0aXPszcxFebuOEKpH4atOnSF07QobvJBKoRnFfOlZGOTxI/L95GWkYGgLJ9Ye34fc0uN1biCfO6hN2XG0OnUMWRUnZdtM5hyj1u7AkdQWOJyWhUPpWRg+dgCqW+XhsQ3lOJSehYJUuVVNolV6kqrW0IX9cnHbmI4AgETZ/eQbu9RaQxACVifW+uS022XnLP2QyUpLwu11+9W6HkqaJNpx95md4XJ7cdWQfPz92824YnA+7py5Hl4xEMDe4LOZJO688078+OOPWLx4MfLy8vyf5+TkwOVy4dSpUzLrzLFjx5CTk+NfZ/Vq+QP02LFj/mU8EhMTkZgY2aJQBBGrhJLNFG4s9WZS6BM9V9b3fxxRfVZbtwObTV1nIxLwDqFlmbHZABQWAh9+CLzzDu7bHmgrsbN5Pmb1nYBvep6B4pR08ODFekjH4gV3WkFPJ2gtS3E6cHpdzFFSgg2iYMORtCwcScvC0vY+13+3nFS0TE3E6j+P+NxWdSKnZ/kxnJdUhtI/tiCt/BRalZ9Aq/ITwIGNwOJv4J8WHQ6gY0ega1dMrmiClY7m2NM8D3ub5eJ4kwzZ4JK06pyIIpqWn0LPgl3IKylE/20lcB466Hf/5L51Em1OFuMig2tUmZCIE81bIb9fN3x3MgHbE5vhUHo2hp7RH9dcPhrnfbod24sCcS/vXD8I43pk47K1h/DAF39o7pfXM0wWk5OgFsepSQn4/dFxsnNm7wG74v7XKiNgBofNhvvP6uJ//9HNQ2U9tKQKzA2+zowoirjrrrvwzTffYOHChWjfvr1s+cCBA5GQkIB58+bh0ksvBQBs374dBw4cwPC6gLXhw4fjn//8JwoLC5GV5fvjmTNnDtLS0tCjR/jLcBNE/BN6nZlwNT+wVGdGcdR9J6yVepcsMw6boNtYMlzwrilbF8QmCLB5PRi1bwNu/W0+cP8ywO2bCFyJSfimyyh8M3AiVmZ1MeyG6HQIqliTcFlm9OJRzNw3Wi6GCpcbObYkmdsKAPIzk3HeX8filukrsP3P/ehQ7LPmjMFJXJhcHsi2qqryZV9t346LAJngKHWmYG9mLvZm+goEdrUNwPlbC3wCpbQQeSWBINsmtcZVlksSm+BQejYOp9fFrKRloSSrFbYnNseh9CycTE7DgLbN8PVfRuLF5xZgf9292bF3FyA3F7DL+y5JlYuNLh/Pwsh+H7w6MwBUFZyV34GNY5kJBp4LkxVOu49XcI8fDSIqZqZOnYqZM2fiu+++Q2pqqj/GJT09HcnJyUhPT8fNN9+M+++/H5mZmUhLS8Ndd92F4cOHY9iwYQCA8ePHo0ePHrjuuuvw7LPPoqCgAH//+98xdepUsr4QhEmiZZmxFgAc2rGk1Gy7IMgK6EUKrmVGmnz270fbV1/DkvffR25ZoFMyhgwBbrkFL6X3xRvrjqt3oEGC3YakBLusLo10rJBjZoKwzLBoBd8WlFSjc5Y6tkmaaAUBKElOxfrcblif2w0nu7bEhTcO8a3k9fpq49Slk//81SKk7NuDDsWHkFdSiDRXJfoW7ETfgrpsq6Wf4FydMR5vkoHDaVkoy87FVmczHErPwuG0LPz7vvOwLTET13+5TbVNi6ZOFDF1iiQ3DysUJIsEe53uGtsJzeqK/WmJQamoI6/ODHtfaaX6q/anEBOsvg3FSsk7poOzvwbvZnrjjTcAAKeffrrs8xkzZmDy5MkAgJdeegk2mw2XXnqprGiehN1ux48//og77rgDw4cPR5MmTXDDDTfgqaeeiuTQCSJu4T3z2IeS1RoroRBSzIxFpA7ZdrsQ8r7MoHzQJ3hqYfv6K+Cdd4DZs5FfN4ZTSU2xdNhEnPfyP4A+vto9tt+2AQiIGV51Wdm+7TYkOmwyMSMdX9kdO5yYqU+k1eOn1iNyBZ+NIwoAyJsj2mxAmza+f+PG4QPHAKza6+sunuh2If9UgaxA4GneYhwsqamzrPisK4fTs3yuoDF9MWuTL1C7b146/jhU4j+Mp1cv2I9XgIdyfPxsJptqXbbujNblS0qoEzMGbqYEmaWPvy9ALjBEyP++Q3Ez8eDdEw3eMmOmFkVSUhJee+01vPbaa5rrtG3bFj///HM4h0YQDRajAGCPKMIWkY48aqyIilAbe7uZAOCpZ3TC52sOhbZDA6T5omPRQVyxcTYu3TwPeD5QBqJk+Cj8o8Uw/NZlOHp3zMZ5fQJFCJW/ZB0mxIwvY8cXo3DtsDayZRJds1Ox/ViZcnNd9O4EM3dJ15xUrNkfCJKVrA6ds5pyJz5evRaA/4tfuQ3gy7ba1aINdrUIXIO/TuyKZ3/dztkSGJwYKAyntFLYOF2otdbljVuyiMh0GKfBqJJkpx2l1W6uNVKrDYaesGSXpSUlcAOAtUhOsBsWbzSiwYsZgiBiA/Z55vaIMKpxFS7DRr1aZpgA4LbNm+C2MR3w5qI9BlsFSUUFRi75Abf8/CUGH94a+LxVK+DGG4GbbsJOezN8P32Fb0wa7QwkEuw23T49TrsN+Zkp/syXZy7qHdiW2dfD53TDb1uO4bKBeap9aKH3w91MzMzfzu6GhduP+wsuvnn9QCzdWYRrh7XFv3/5U3OfKsuMjrvMaBx61gd2W5VAgXYAtdoyI7nH1DEtcgEC7msW3fouGtsbGVP/c2lvHDpZhV656fhtS6BsiZEXcuGDp2PpziLdQGUjUnTq0dQX0R8BQRBhhZvNxDwJfZN+/fi43WYL0sB8VWEtPJ5AADAgT2sNC6IIrFnjcyN9+imuL/NZQNyCDQs6DsasvuPx7qzHfFk4AATGWqH8TpR1URwGM06CQ8ALk/ri4a834ZZR8kQKNmYmPTkB0y7prdxcF70AYDMeirSkBDw/qS+uetvX46d1ejL+cZ4vOYMnQqRb0YplxlDM6Fp1+JYOaZmWm061T0H2H4CAEBI0LCFa49ari6NtjdG/BlcMDliq9ASckuy0JEzslROamGlsFYAJgog8vMlJ5mYK1Z+jAS/uw0ogbqjDqq3bgXSudivlXnVIryoDXn3VJ2I2BqreHs/Ow4yuY/FlrzNRmNrc9yHT/NZMo0kJozL7DpsNrdIT8fEtQ1XLEphtg7qEIVpmALmgctj1J/NAALAyZiZ4UWUTBFw6IA9frVO7Ftltea4jLcuMUlxJ73hig11V1pNLY7x6YobdxoplhoUdu5m/AyMxbURKIokZgiAsoGx+Z4Tb48UzP/2JjYdOBT4zqRqUgcJGlhO7IMCjmE7NHks6XihIAcDSgzmUB7QgejHswGZcsfE3nL19OSCVo09MBC67DLjlFjxzOBXfbQqY85UNB1V1ZhiUk5lRRpJekG9Egz1NrudgxseKK30XlmIfIVhmHHYBz0/qgwFtM/DoN5s1j6Pcj00QNOM9lLEmvJgZaRUtN5NWnIvu96lh5bHy1cruCROaPsGi8P/45qG49t1AE9dIBqGbhcQMQTQw2IfeV+sO4f3l+2TLzVhmispr0O+p2fjstuHo3irN1HY2GwBFHKElMRNqADCTmg0El5LasrwYkzbNxeUb56DdqaOBBX36AFOmAFdf7auCC0CYtd6/+PJBeX7XioRdx92gssyYcDPpcf3wtjh0sgq9c/lF9/TQ27PZbutalhlda4vivZ4FweirtAm+RqC8zCqbIODBCV0xfeFuPHZ+D4x/abFsDFqWGaUw5MXM2DiWGb02FhJ63zdPLCn3a4TevcfDanbjaZ1byN6bvU8iCYkZgmhgsI+VI6fUBcPMCozSajf+8e1mfHnHCADG1Xx5VgG3heJ1ocbMSOclPZj1fumz2L0enL5nDa78YzbO2P07HKJvzGXOZHzfYwxm9ZmAH96/RzUzsZNEh5ZNVR2i2dVVadyKX7JGv4yNCuM9dWEv3eV6KMc2rnsW5v5ZWLfM3D7Y8TlMTqTKZfrZTOZiZniX0VaX3Xb7mI7cbCYtq4KmZUa2vXp8ZgSI3vcpc1OZcFnx0GvhYMTlg/KwaMdxnN2rlaXtog2JGYJoYLAPQJ5A8FiIY2HXNIrl5f26q1fLTN0ApUnR6CHe5uRRXL5pDiZtmovs8mL/57/n9kD/px7AkM3pqHLWpfVyU4z5E1jgM9b9I1+m/GVuZJkxK8yCgd1z37x09MvP8IsZs4dlz9VhN+dmshIzYzQOafLWC2bm7V+wAU5BwzKj+FgaLiuYuDEz0L8vALVbMa9ZMg6drKrbPoDZ1GwlcjeTtXsns0kiVj58ZkxYW6xAYoYgGjA8gVBrIcOIxdAywxMzlgKAw2SZEbQtM4luFybsWIErNv6GkfsDwbwnktPwVa8z8Vmf8djdIh97Jp+Dqkf0a1sZ/QLXqhcCqGMMjAKA621iqXPX+N+atAewwzMKAOZtA4THMsPN5NMbA4JwM0F9flquJU03k+L7bprIBo5rxd/w98XDbnBv6iEIseE2sgqJGYJowCj7HQHBZzMZbcd1M1kQTqGKGWlzaTJlYzC6Fe7FFRtn4+ItC5BRXe47HgQsad8fs/qMx9zOQ2Vdjc3EEOiJFd9ngdcqN5OyzkwUi47JJl/Fe7NxoezZsS4zvcuoXKZ3zQ0tMza1qDA3BkFTRAUfAKxvTbltdAd/TR7eNlbjb3jYQ7DMxCskZggiSlTUuDFj2V5M7NUKnbKahm2/7EOPpz+sWEvYx6BRthHXzWThWOFKGZcmgKTKcly14VdcsfE39Du607/8cGpLfNFnHL7ofRYOp2cFfxxZ1Vfecm13g3ICTYjihKO0JMitMdbHZTb4VF3zRXufRtYFm56YMUj5FgQBU0a1x7HSGuw4VoZtBb76QVqZYbwAYC0ByNvDw+d0x32fbZB9xlqztCw7ViwsZmrdaBGv0ofEDEFEiX//sg0frdyP52fvwL5/67XJCyDAWi0RngAJ2jJjYDnh/cK1YpmxEl+jiSii597NwE3v4oJPZ+GSat8v4FqbHXM6DcVnfSdgSbt+8NpCr4uhVSjN/5mO5UYZABrNX8+seBEQXG2TNpkpaN+iCZok2mXxIPol+OXvrQgfJXaOqNA6Dm+/j57ry0Q7++Ulsu0EIWDxk85FJvUMLDNa41b+rWhZc2Sfa5+G7v6txlvFoYcJAIkZgogav+8rNl4pCOSWGbVAYAXG9oIyPP3jVtw/vgsGtGmmu19DywzXzVQ/dWYyK0tw8eb5uHLjbHQ+cRCA7+G2KzMPs/qOxzc9x+JEk4yg98/DqJ6ITBQo3DWqbKYYqNMhYSbmQ4nDbsPc+8fUualYFwdv/4Lsf//nJscE+Gr6lFTVMseRLDOcbS3IALlQEWQ/HqRlPDeQ1r2gmc2kKprIt8yYEUY8rFQAVmLlesUSJGYIIkpEqrEz+zDiHYO1zEyesRpHS6qxdFcR1zrEPj+DCQC2YgWqDULMtC4txIOLPsS525bC6XUDAGoSEpF4zVVYdvpFuGarPWI/NbXiHHjL1anZ+u/rE0ExEQc7gfK+f6PgW9PrKpblZiRzxYyRqDQanzJ+yCYEOrAHYmbU18dq0K7SrajlFpKtZuEWkbn6LIqZvvkZltaPFUjMEESUCDXg1dwx1J+x1hKpcaEZDAOAOQ/NWksxM+ZdUk53LW75/RvcueIzpNTWAAD+yOmMz/qOR9G5F+Otu85E2eajwJ/rTO/TKuzZ8uIr2I+Uy5WWGEeMWGaUZxGqxApfzIz8fV6zZGw9GuhQLl0+o6wyJXquLkGQ3teJGc5YeHVmZG47jUMrv2+7bHt2fKELS7NVoefePwZbj5ZiXHdrcWRZqYmW1o8UJGYIIkpESswYuZmCjZkxrDPDeWZaKZpnNlj49N1r8Pi8N9H+pK9C76q8nnhm7C3Y1KozAGBMk1QA4evNpIXRRKNnuVGJmagGAPMmcPWy4PatvUzVx9GC8Onfphlmbz2mWs7bQ7CWGZsvGlo1PrlYUbuZtGrOsCjrCmkFTcv3ZR69VhpadMpqaikR4eu/jMDzv23H38/tYbxyPUBihiCihJGWqXS5kZxgV1cENdiQfejxxEytBYHBPoyDqjPDEU42gR8fYxRfk3eqAI/Nfwfjd/q6Mx9rmol/nnETvu8+RjYLScIg0gLBKG1WL6tH7WaKYmq27LUQVMyMFlZcR3pfF7vqqM4tMKpzC/zn18BnUt0W7sRtwdWlFnbqdeWCR/qfLwA1i+bZtAPAtWJmrHwXwVhmrDKgTTPMnDIsIvsOBhIzBBEl9CwzO46VYfxLi3FJ/1y8eEU/S/uVVwBWL49UnRluADDH2uIVgdlbC9Trauw/sbYGt6/6Cnes+hJJbhdqbXbMGHgBXhl5FcoTU9TjMFkBOFSMiuYpY1FYlG4GrQrAT13YE4PbZQY/yCAINmaGvy/1ZzxRYHQsdtnNp7VXrStpA6sxM8rV2bc2RfxQIGaGPa4gO77yeFrxKnrZbFoWv/oKAI5XSMwQRJTQ0wZvLd4DAPh6/WHLYkZ+DOsWECv7MkIrDub2j9WxLCqXlChi3K7VeGzeW2hT4nMpLGvbB4+Pux27WrTRPKb0SzTilhmDwmR6v6rVFYADKzgdNrjcvmtx/fB2YRipPrKxCeog2FDgTcCixjKzBfYEQVBZYKTv3HrMjP4YBM47XrsCq+nUem4m2dcR5BcQSgBwvEJihiCiBK86r0QoBeTkbqbw7TsYy4yVDCV2/21PHsETc9/EGXvWAgCOpLbAM2Nvwc9dRxo+4e3+CsBysRGuonwSRu4YvUlNz800pktLzGHiQSKNss6MUf0cS/sO0sWjRBlHorzX/NlM3G0Nh8kdg5Zlht+bib1m/P2xKL9/u+L8AvsKzjLDauVIuZliDRIzBBEl9AJqzVhPRFHkPywF+TrB7Ju3r2CymSwFAHtFJLuq8ZeVX+DW1V8h0eOGy+bA20MuxmvDL0elM9nUfvyWGWbCSHHaUVbtNj0WM1hpZ6BEea1YMdO/TQZuH9MRec3MnW+oKEWZwlATEnqhQFaymZRxJMprq9fOwEoQs8oqwrFS8Xsz8Y+nmc2kEzOjVTnaWsyMjXlNYoYgiAjCExoSZtKUvaK6G7N6HV42U5CNJg3EDO9ha1o4iSLaLvgFc995CrllxwEAi9oPwBPjbsPezFxL4wx0zQ480JsmOiIgZtjX1iZRQRDgtNvg8sg7fUv7Gti2WfgGagEBSmtEaBMh97r49228Lm8cvpd8yww3RsfCKSgFqmHMjPSZzj54KC0zNg03U9A1fyhmhiCI+kIvO8iMS8TjFf3uEy2fu9neTGYeeEbZTLyJz8x5dDxxEI/PfQuj960HABxKy8JTZ07B7M7DggoakCYGViCkOENvX6A6jmzCUC83uqYJdgEuT926dv73Vx+o3T3810HtO0zZTErhqGpSWbcvfgCwFT+T/CUvzdqoaJ5cjPAPowoA1wgADva7YA0/JGYIgogoevO8GRHgFUXMXHUAz/y0FTMmD8bQDs0ByB+GZgOAHTbBsJ2A0fK8Zsn44+Ap2Wd6RfOa1FTiruWzcPOa75Dg9cCd4MRrgy/FG8MuRXVCku6x9JB+lbIP8SaJ4X/UqVLmFRjNIb4Jzadm2IDgyJdSlKOcMIPpzaSFWYECaNdk8a0rFwuaMTOcXVg5B6VbhycseK4f7QBgLcuMXMxoBYvzatqYwa4xnoYMiRmCiBJ6biYz7hmPV8Qj32wCADz09SYs+L/TOcfg7JsTx5Jgt3EtL26PFz9uPIIv1hzCkPbaKcL922TgoYnd8NPGo4bHgiji/D8X49EF7yKn3Nefak6nIdj98NN4aUeten2LSFaOyFtm2NfWLQLshMbGUNRDYWgF8olUHhAcfjcTeyy991r7sdkETTHDd2uZPweleOAKF864NIvmaRxa6WZSuhl5+7KCMvi9MUBihiCiRDCWGfaxxIoPdrKWu5m0LTOs0HDY+dk+hWU1uHOmz/2z81iZ5nhfv2YAmnKsH8p9djm+D0/OfRPDD/hE2P5mrfCfCbfj57YDMSU7D9ixV/MYZuFZZnhjCxWjScfoBzE7obHBynpZbpFGWTQv1HlQb3N1ALA54WMT1Nc2bDEzbCaSYkym3UwmrCLKAGAzMTNWkJUNIMsMQRCRRK9uiyk3E7NOWlKC/zX77NKLmamq9fg/c9hs3PGcqgxYSo6X12iOxW4T+L2Z6gaQWlOBe5bOxOS1P8AhelHlSMRrwyfhgxGXQUhKAqrdsJD4pIs0DnbCSHFaf9Sd16cVftx4FBf0bc1dblQcjZ2IeN8ma5lhhU19W2ZU2UxhDJrhnQrPwgEYFLdTWkwUK0sTdqgxM8pMJUG+UDVOfwVgjaJ5ykN/85cRAHh1ZvjjDVbMyNxMsdH2K+KQmCGIKMFOWl6viAqXG6l1okTLzcR+yq6TnpyAWo8Xc7ceQ3FFQID88McR1T6kDJoqV0DMCAJfQNW4A+voxb/YBbXpHwA8Hg8u3jwfjyx8Dy0rTgEAfukyAs+MvQWH07OQ4rTDWff0dweZZaUai5TNxEwYwcTMPHtZH1zQtzVGdW7JXW6lNxMPmWVG5maqXzWjJyoi6aFQBwBrH0zZVkArNTvUmBl1/BDPYqK2wmjV5mG3H9W5Bfq3aQZAv86MLAiZFSIW7gtyMxEEUW+wlpCbP/gdC7Yfx5K/noH8zBTNYFt2GzYrKT05AdMX7sYLc3YYHlfqzcRaZtweL7fujdmu1w6bTfXQ7HFsD+77+lF03vkHAGB3Zi6eGHcblrQf4F/HLgj+B3mwlYnVYxFk/wNAkyBiZlKcDozvmaO53MjNZNQkMHYsM0p3D/M6ArlV0vlZ6pqtEAjqdgZqd09gvxYsM6rUbPUyrmVGQwDK3WOBN+p2BjbuekFbZkjMEARRX7CT1oLtvtoq364/jLvO7Myd2EVRlG1TXOHyv05LduDr9YdNHVcSM5UuudXFKPVaD5st8OBNqy7HA0s+wrXrf4Fd9KIiIQmvjrgS7w6+ELX2BNl2rFvDY1I4GZGU4BMu7EM8xYRlZliHTKzcU4zUJHOPxVDqzADyCU3WT8vU0cMHO0pBIRRCnQf1bil1ALD2wZSiQLmmw6YWGoH1DQbJHkfxRh4zwx8L+79yL1rCRl00jz8Gdnsr94WsbADFzBAEEUl4MSoZKb7Jnufy+WLtIdn7IiaGRRAEVLrMFYU7dLIKHq8os8y4PN6Qyv07bDbYRC8mbZyNvy36AC0qSwAAKwePw72DrkVBWgvudnZb4NdvbZjcTMl1VhjWMpPoMA4ceOjs7lh/4CTGdc82dZxQf0GzcROy+Jroxf/q1pwJN0qR0TpdOx1fmbqs5aLiWZKsWGaU1jRe+BDve9cSgFquSL2ieTaN+BkrsJuRZYYgiIjCEzPpKU4AfJfLX7/cKHvPihm3R5TFwOjx3YYj8HhFXDUk0KzR7fH6LTbBYF+3BsK99+C5VasAADuat8HjZ90GnDEWBXtOaG/HBA7zivkFQzLHMiNZa/Ro4rTjxpHtTR8n1Kwf1jIj/wVezzEzenEiIQcAq8+FJwrO7JaFsd2yNPdjVDRPP2YmeDcTL5SFJ3C03El8e426aJ5WXRh2v8GK3MbSaLKRxDkTROzBM4RI1gSjAnUAUFoVCPT1inJLixE/bjwqczN5ReDcV5aY3l4io6oU//r1f0gYMRxYtQplzmQ8fcbNOOfGV7CibV9TzSmlh/f3TLDynWd0sjwWCUnMsJOCGcuM1blCWfvE6r6ddn6cRDSzmZTvQ7XM6J4Ls+97x3Ux3WhSKbgAo67Z5saqXFdL2PGCfbWsdFrCUNnRXavDezgK3pGbiSCIiKLXBNJM/IqLsaS4vV7TwboSSvFzstJ8wTqb14Or/vgN/7f4IzSrrqs/c+21GJs+HsebBorrGWUoJdhtqgnzsoF5GNO1Jf63YJfp8bAkJvhEQorTjqHtM+HyeE01bbQqIkLN+pGl5wYZGxEOlF2zwxGAagYtCwQPeRwJp2he3bXkpSFbOwX5ufOsLLyYFq3YGK3XqgrAmkXzGJEb5J1BbiaCaGSIoogat9eUSyIc8GvA+CZ/1qKh7L0k4XJ7mXWsH79Yp26MHv0Pb8OTc6ejT4FPbPzZsh26f/UhMGoUjj/0k2xdowwlh11QiQibEFrgqWSZEQQBs24dBgBYsrMo+B1qICt0FsSkn6BpmYli0TxFcG0kp0Er+5a7fxQpy2DqzIQYM6N0K8m29LuUjGJmtF4HdqVXAVjLfRm0m6mRWGbIzUQQdTz23RZ0f+xX7C2q0F1vb1EFbnhvNVbvLba0f1EUZVV39SwzrEXj7JcXy4SLhFzMWFczu4/rn6eS5hWn8OzP/8U3H/8f+hTsQmliEzw+7jacN/llYNQo7jZG1iKHTVD94vQ9fM0/gK8e2kb2PpmthiwIdf+M92P1ly87qRmZ8nlL5SXsmXFEMZ1JgLkKtmbROxUrFiClu0admi2tp7+tEcrgXbm4ETjrBNZVjoVdrhyHWctMqDFLQOOxzJCYIYg6Plq5H6IIvG7g3rjvsw1YtOM4Ln9zhaX93/HxOox+dgEqanxZR3rVedk05R3HyrGrsFy1bo0nNMsMb5887F4Prl/7A+a/fRsu3zQXAHBi0tU4Y8qb+GDg+fDYtC1Z3N5MDAl2m6q+jbInjh6TR7TDRf1yZZ8lcyxr7C/2Ie0y0Tcv3dwBdDBKzTbCrjGB1XsAMPtaCG/MDPd4Bq4ZHqoGkIrl+hWALYxN0aeK5wpTuryUx9ASI+zQVBWANYKGWayI3OzUQGZYI9Ey5GYiCCVGgbSFpdVB7ffXLQUAgIXbj+PcPq2460gWGWXMzAfL96nWDdUyc/BkpeE6gw5twdOz30D3477jb8ruiB+mPIpHnr4RJxQuJR5GAcC8nlC+3jvmnsAer6iaCHluQtk6GvvniSA9rMR88LBruBbCVDvQNHqVeEO2DJgsNGMoZgyK5kWiN5OyB5Q/ZsbAzSQXO+w4Am/UdWbCa41JT0nAj3edhkSHLSz7iwdIzBCEgupafWFgpgCbEtal9Or8nVi9l5+u7LfMKGa0z9YcVK3LipnyGnM1ZljKqrW3aVlejCeXfoBz/pgHADiV1BTPjb4en/adgLO68HsV8TCKmbHbbKp1eKm3WnhEUfVLNtmg2q8A+eRx1ZB8ZDZxom3zJuYO6h8n+1p/wLyrEO4JLDyEN2ZG382kdVQ1yjgSdQaWnmXG/FkoO4bzBCv7t8wPAJbvI/A6gKqdgYawZbGqcXvlhm59jCdIzBCEgqpafWGQEkRpfDYNeltBGbYV8DtQS5YZM6X9WdFVUWM+LVuirFqdveTwuHHD2h9w77KZSHVVwQsBs/pOwHOjr8PJFN/D0YoP3tDNZBNU9XZ8bgRzx/ByLDN8N5N8/6xZf+oZnZDXLMXU8eTjZGJmgrDly2uLBD6v99Rs9rWgtk6EG147A6PjKBtAagkUvmXGgpjRcX3pBRcrA5T5r7VjZrRcjoR5SMwQhAKj4nNmsp3W7j+JRIfN/+uowqTlpFbDMsOjmnGHWakxI6E8xPD9G/HknOnocuIAAGB3+564d9Qt2NSqs2w9u4U2vLVBuZnMBewC0nWSr8z9fpRWAEHUX98EoZb9164AHMWieVDGjYQ2sep6mTTGwENd/0VrvRBjZnQCjf2WGc6+zdSW0Y2ZYS0zGmOLZpZbPEBihiAUVBm5mQwsMyVVtbj0jeUAgD3/Ogc2m4AKk9V5pYndjJhh2xdUByFmJHJKi/Dogndx/jZf0bwTyWn4z5jJEG6cjE3r1F237RYmh2qD806w21TnqgxC1cMjiqrJyigAWBAAN+OiC17MMPsPYtLXirOIap0ZZZxIqCEzehWAZV+c/oGMspmU+5Z9ZsFZpmelCriZ1OPSDgDm7ztBGTOjkQ1FmIfEDEEo+PNoKdYdOIkBbZpxl7NiRhRF1UTGVuatrPWgaaLDtGWGV2dGC9Z1FYxlJsFTi5t//w53LZ+FJrXV8Ag2fNz/bLww6jqUJjXF31ulA1CLGSvl0SsM+kU5bHzLjFlTuyiqhQSv2q9ygmZTxs1UB+ZhzU2ixqERMxPtX+BK60T9HNP8cl7MTGC90CwzSheRUQSRX8xo1onhX0tbXU8y6daXbR/R6j4NFxIzBMHhhndXY9OTE7jLkhMCfzYVLp9YYWEnx/JqN5omOkwH6LoNLDNju2WhvNqN1fuK5W4mk5YfiVF71+GJuW+iY7Gv0/bvuT3w+Fm3Y2t2BwDAjMmDUcOpbQNYK49upMkcdpsqc0tvslLi8coDgJMSbFyxJZ+SBFkfKmX8glnYMQYTMyPP0Al83jrDuFpxOJFbD+TB15GcVoOtM+NzQ0YqZkYuKnjp4yLUn8kEjMb3qsRht/mD+GWp2aRlgoLEDNGgKa5woVlKguVfmGU64oP9RV1aVasSM+zDThIxpi0z/qJ5fBXQNNHhn4hZy0xhmblqvrklhfj7/Hdw9g6fG+x4kwxsuedRTHZ3kz1Fz+iWhblbj3H3Ec4iXAkaMTNmLTMeUR4ArJVerfz+XSE01ZSwMhnzvk2lZWbGjYOxaPtxXDO0bchjs4LStaIMtg0FPSOTFdFktiZN6DEz8u3k4kb7eNrNJbUtbgk2Aa6612YCgClkRh/yzhENlgXbCjHg6Tl46setlrdNTdLW+awlgZfezGbnfPb7Afy+r9i0ZabW49XNALIJActPpQVrTKLbhTuXz8Lcd+7A2TuWwy3Y8O6gCzF2yps4dP4k7gxh1wiOCWcXXoeNFzNjPjXb6xVlE4YZK4vPzRReMRPMnK/8BX9G1yw8cUFPOIN0ewWNQihYKWYX0mEtHEcr3Vlvn7xtDcekCH7mjdEoNVt2X+h8lQl137MvNsf4XqrvYorxBokZosHydJ2ImbFsHwBfsTuzFpJW6b4KmgeLK/Hagl04cqoKK/ecgNcryiZfXnoz+wvq7SV7MWn6CpyscKnW4+HxiqjUiX+xCYJ/sjMbJ3PG7t/x27tT8X9LPkayuwYr83vhnBtfwdNnTkFZYhNNa4aWOymcXXiVWR2ANDGYtMwoUrO1rEbKIde6Q58YQq0A7DDxa7w+UNZWgey8Qts37yoH2gKYP3+lxURzPW5ci+6udde1GYgofm8mdjzaSIXzbIJ8z5SaHRzkZiIaLCcrAwLi0MlKnPafBeiWk4pf7x1tuG12mk/M3PDeauwpqsBzv20HADx5QU/Zr3pelpKybgoAPPGDOetQrUdEpV7NGCFgfag0CK7NP1WAx+a9hbN2rQYAFDTNxD/PuBk/dB8tmx2U2TxPX9QLgHyyZQmnm4l3DCtF87wKN5Nmlgv7WhDCYpkJuc4Mk7YSS/OX0QRuBf0CwMHtW2+yD7U3k/JeMh8zI7fomDm2VDhPgPKa8yE3kz4kZogGyykmq+i7Db6sHK1idUokwbBH0XTyi7UHkc8UWJNcQj9uPIIjp6pw6+iOIT10PF6vbgaQTRD87h+tSsWJtTX4y8ovcfuqL5HoqUWtzY53B1+EV4dfgYpEdXG4ZGdgUm3exInrhvliNrQm6HD+ctSKcbDUzoCN8dCwNStTZMMTM8Pfv1nsGhNgfSM7tKAUfhE8bpDHUd4zRmLWyr5VaeoaFXwD6wiqZWYtdpJVUllXKXaqQccXJGaIBgsrKsw0VXQ6AtkFWr/c3R5RFpzrcnshiiLunLkeAHB616ygU32l/eu5woS6cXIRRYzfuRL/mP8O8kt8wbtL2vbDE2fdht3N8zX3meRgUs2Zz3kuIAAIMvmHC+/BbRQz88XtwzFpuq/Jp1c0nszq9srsP/wxM0G5mWRF80IeTtAotIwifiNEy4xOnEewdXqUcShG34Olrtl6vZl4phn/Mv7x9A4t1ZoxG6dEhhl9SMwQcYUoithxrBxtm6dYKnZmRsywsTDSZJea6JBlNrkVMTMuj1e2vNLlCTrVF/BVzNVrTcDGzLC0Lz6Mx+e+hdP3rgUAHE5tiafPvAW/dhlh+NM0kbmOrItMq9JvOANUeUPzxRDwx5ya5MDgdpn+96bdTArLDFtnJhwEI2ZCFUPhQuki0bIyBIOWq1J5XGudreUY1d6zdmkV14KzrVEgrmkxYw/EzLDHpZiZ4KAAYCKu+GVzASb8dzGufWeV6W2SE+zYf6JCdx1RlIsUqeFjVlqibD23xyv7VV/rEXGcSYv2imJIRc88Xq9uLIwgyMVEiqsKDy76AL++NxWn712LGrsDrw6/AuNueQO/dh1p6kmelBDYHzt0rUBfpz24irk8+DEO8mGP6Njc/1p5aT1e0dTkoYyZMVOU0ArBBEXLU7PDOZrgEaAUN6Ht75bTOqBd8xTcPbaTapmlRpOy7RRuJuiLIkuWGYWFJKiMNZPnFXAzmbTMUNCMLmSZIeKKmat8fYPW7D+puY4oyl1BzVIScLJSnXXEopzbJMGSk56E3ccDQkhpman1eGVipsrlQVpSgvGJaFDrEXVbHwiCAKfdhqTaaly37mfcvupLNK8qBQAs6DAQT555K/Zl5lo6JmtJEmWWGQ0xo7DMhDLhcTNEbIKmtUUZXK0smmdm4oqEbtBLwdUiVqq+Ki+ZObedOZo1cWLhg2cAAF6Zv0txHPNCQd4PSTlgnWUm9q21rqprdt2BjDSFVqNJJQ7GMhOslYoIQGKGiCvMPJgmz/hd5lZKctoBAzGj/KUuuSHSkxNU67kNxEwov6DcHi/m/8kvVgcACbU1GPzdZ7j+g9fQsuIUAGBvs1b45xm3YG6nIUEpC1mTQ+ZzrZgZlZixfET22MZjYk9JKWZSnHZTabuRDqoMPTU7nKOxhtxqVX9uDnk8SnDbAfpWG63PtFDed2bHqDUG3Wwm6UsXlN8/fxuyy+hDYoZocCzacVz23mc6D7zfW1SBj1fux62jO/hTsJWTpGSZUeoSVcyMWy5mKms9hiX89fjjUAmKOTVpnO5aXL5xNv7v7a+QVlwIADiQno1XRl6Fb3qeAY/NnOvHabepMnnYSVXmZjJpmQll8uOJjOpaj45lxvf/S1f0xduL9+KpC3vJ2i6YS80OergyeN2TrSArmhdFNaOMJ7Jq6QqWYFPAlWMycgVZOQP5uSusR3X/G1tmzFmctLKZNG8FUjO6kJghGhQ8q4goyh9Al76xHMUVLmw5UoJZtw4HoG4foClmFBV6XR6vrApwlcvNrTNjFqWQcXjcuGzTXNy54jPklfpEWnlWKzzT/1J82Xsc3HZrf8KfTBmK3YXleOjrTf7P7DIxw7iZNJ7EifbwiRkeFTUezSJk3rrv6eL+ebi4fx4AYPfxgBVOywIj/zj8E7TWNZg8oh0+Wrkffzm9o2pZrFhmWJQdqSNppAk2tV3PLcYNKLdwcc30ZrIyPj2LYCAAWBkMHSM3Q5xBYoYwxZ9HS/Hy3J14YHwXdM5OjfZwNOEFdiqFiiQY1h84pbmd5GZSChO30s3kFlFcHhAgPjdTcGNnsXs9uHjLAty97FO0qUuzLmiaiTVX34Gya6/HrJ92BrVfmyD4ffUSrDuJHbqWZSYxIYwxM5xtK11uTesATyiy62olkinrh4QbrQnoiQt64tFzu3Mz3ORiMZoTmNz6EM6YGe7R/N4VtdVDcxvmtToAWHuZ7zPrY5O2k1v06mJmLGQz6cFmM5mxHJJhRh8SM4QpLn9zBcqq3Vh34CRWPzou2sPRhNegUVnyXoKdYNRips4yo9y/Rx0AzBa587mZgn/s2LwenP/nYtyz7FN0OOkr9He8SQZeHzYJM/tOxFVjuqJncvBdlW2COl3WriEWNGNm7OETM7wHf4XLo1lRlefCMxOjoHSl2ATfvrIV2WrBojdhaqXq22PEMqNr6ainMQSbcaTclreXYHszQWmlCnJ8EspbV/o7VFrDyDITHCRmCFNIrhSz3ZmjBd8ywy+QVl7jxqo9JzC0Q3PVdpIoUrqtqmo9sirCtR6vrMhddZCWGUH04uzty3Hv0pnocsKXsVWcnIbpQy/FR/3PRZXTF9ujTM22is8yoxAzEY6ZSbALqPWIaJWehKMl1bJlvC0ra9yKfku6u7dcPVUQgK//MhIvzdmBR87pbri+FvKGg9YnIDOdkusDpQfOpiEkIzoGS9YThWXGwJJk5QyUmUg845mVmBk9JJGrDDTWglKz9SExQ8QVWg/XSpcbSQ67rKO1hF5NkSveWol9/z5XbZlx82NmlLg8XlmRu0qXRctMXdXe+5Z+gu7H9wEATiU1xXfjrsKznc5StR8QIKgsI1awCYK/wZ0E+17U+JwNHLYqZsZ1z8Yj53RHjduDcS8ulm/LEUwVLrel4FCjOiO89fvlZ+CDm4YYr2ySYOb8mBEzimsdbJZRSGMIwQZklOIdbG8m37VQ34dGf91ah1N+LK8zExv3QjxDYoaIOURRxN6iCrRt3sRUA78T5TUY+MxcDGmXiTevG6habqbaq1IE1dZZc4yEicstdzNVmXUziSLO2LMG9y/5GL2P7QYAlDpT8O7gi/De4AvRvmNrVBwqUW1mC9EyIwiBBncSdjZmRiMA2G4TgDrNZtXNlOiwIT8zBfuK1IULuZYZl0f1+bAOmVi5pxjn922t3oeJGI9IT9DBWDDYeztW5i8hghNritOOSpcHIzq2qDsYc9wQyrcaWeaCTc02W8xOeVyte0HtZqKYmXBCYoaIOT5auR+PfbcFkwbm4blJfWXLeH/nc7b6AmRX7yvWjJkxwq1IV5YEkNGWSjdTlcujv40oYtS+9bh/ySfof9TXibvcmYwZAy/A20MuRmlSUwD6WTlWOzQLQsDCxAsAZkWLzM3EiBz2mFYtM1LbCW7aLOfDq4e0Ue3zzWsHYd62Y5jQM0f3WJp1ZqIaYMsnVsSM0pPC8ayEhdn3jcbC7cdx2cA83TFYxWhbS9dWIV54Qcq83yrBuIASZKnZZJkJFRIzRMzx0pwdAIAv1h5SiRkebI8mrZgZvQdErceL8S/J3R8erwivVzSsGaOs2FtVq100b/j+jbhv6ccYcmgrAKAyIREfDjgPbw65BCdT0mXr6hWTK6nSLwCoJMEWcBHZbJwAYDZmhvlcK3XYagVgqfEmt9qvADx7WR/8/ZvN+N/V/dE6Ixk9W6fJ+l0JApCekoBLBqgnQd85Gf8qjobrxAh7jExgymsjm1jD2PAmr1kKrq3ryK4eQ/Dnb3TtLMXjKHozsecf7q9IK2ZG0zJDphldSMwQcQX7h15R40aTRIestxCvG7LHK8KmkZkDABsPnZIVXvPvy+s1/MX1zfrDsve+mBn5OoMObcH9Sz7BiAMbAQDVDic+7nc2pg+7DEVNmnH3q9nrRwCapTh1x6TaF+Mi8sXMyPctL5rHb2fAWnOUXcGNJpNEXcsMcPmgfFzSP1d2jCB/TOtUAGbXD8+sFOrcYrfHiJhRXI9IXCv+cfmvLe/HYONQejPxYmbC5fBhi+Zp1VViMUoJb+yQmCHilp6P/4b7xnVBn/yAVaO8Rt2k0e0Voddg+9DJKu7nbo9o+ddQVa3HX9it35HtuH/Jxxi9bz0AQHQ68UGv8Xh92CQUpjbX243mA9gmCBjVuQWGtMvE6n3FquWds5pip6JDuNLCIhMNgtyywQoxLcuBstGkkddLKX7k2/o2Vrq+rBRuk2c+aVhm5N3/YgK7hXOsL1T9iOppXKGJOf1tQwoA1lgWDrSzmWLkZogzqGs2EXPo6Qfln/lLc3fIAlJLOS4YUdQP5N2tmPwlaj1eyzVjyqvdSN60Ae9++SS+/egBjN63HrU2Oz7pNxHCzp144qzbDYUMoJ8RIQgC7h/fRbVs5pShyM9MUX3OpmILgiALANbr9syKHIdOzIyRi8DvZuJZZjS2sWIdkGczmXAz6e6t/oiVCsAqN5NsWf0MLJTDGF07K9dWHQBsLmYmGKTv32eZYcfAX5/cTPqQZYaIe9g4mdJqtWUG8FlZtFB285WotWiZ6Va4Fw/9MAt9ti7zHVOw4ateZ+LVEVfgUEYOrmnTBsAmze1HdmqOZbtOADCelJM5pia7wJ/2WauHTRBk1gurwcQALwBYf/1Eh7ZZ7Ozerbif2yyoD6NsFvX6sSFnzMT61DfqbKZIHis8OzeOmbFgmZFtpzj/uv2ES1M47KzIj717Id4gMUPEFbw/dDatmmeZAfiVgbWQaqqYtcx0KjqAe5fOxHnblwIARJsNX3cfg1dHXIl9mbkAgK/uGG64H7aui1bgpfTgTnaqBYLDLnCvj9ICwFakVcbPaMFeY6vZTFL7A3ZsbZunYOaUYcjNCL6asYQ8NVtjHY3XoRBqnIv8e4lizIzCxVFfMTPaYwjvtpYCgBWuVV6jSaPtzOKUxcwEPo+VPl3xBokZIqYZ+8JCPHVBL5zWuYXmOl5GqJRVW8v04eGwC3B5gHl/HtP9Fda++DDuWTYTF2xdDBtEeCHgp+6nIeeFaXhg0Sn/emO6tMTAtpmGx00wERAqfcqzzCgfiuz5BLaXBwCbtcyw1i/LAcD+bKYASQ67rpCxUkbespspTJPFmC4t0Ts3Hb3z0o1X5iBLzQ7PkMKCGXEYluMwr0PqvG6wPNiYGeV76XWwlXiVmzmo0WRYITHTQDlWWo20pATuL/hwsmB7Ib7fcARPXtgTaUkJYd//nuMVuPbdVdj373M11zHjZrJCZV2q9T++24KsVHXvnvxTBbhn2ae4eMsC2EVfFtSiXqPwryFXYHvLdni1dXsA6/3rmxUMMsuM5qTs+zyJ52ayCdzt2LiYZKcdrN4LRsyYteZISG4mK4LC2q/pwGvtoYVfODgdNvxw12lBbx8zFYAVTThlVoZ6GpbhYXSuj5FVxMopKFOz5XVmwnsx/L2ZwP8RooRiZvQhMdMAOVhciVHPLkCLpk6s+ftZET3WjTN+BwA0b+LE38/rEZZ9Wv2j9ZpwMwUL24sqt6QQdy6fhcs2z0OC1yd45nQagv+edg3yx47E/h2FQK0XpxRjMDv3JzhYMcNfxx8zwxGpec1SuM/86tpA2nlaskOWvm43WUiEtX4pJw+jXfDqzBhNQFb6Awk67wL70N1FVIiZonkK7SJ3edSXmylyx7Hyg07p7uFVAA6XppBlM7HWRfIzBQWJmQbI4p3HAQBF5a56O2ZBabXxSmGAVxSPLS1TGgY3k5LssiLcueJzXPHHbDi9PsvPwvYD8eKoa7CxlS+r6KrOLbDuwElU19bgZIX8uptuPGfil7r0eRIjfJ66sCcGtm2GzCZOfhdqJl090WGXuZ2k8JkrBuXjszUHcevoDtzj6sUcmY+ZCXxm7DqysK6JgFXZ/mJE2cgsM1GcwNTZTPXv/grl9I3EdNNE89OcWthF7lo4ZBWA5cclrBM3Yua1117Dc889h4KCAvTt2xevvvoqhgwJX6O4hkQ0zJH19QuO1wGbDU4tC4ObSaJl+Un8ZeXnuHrDr0j0+ETS0rZ98eJp12JdXqDb8uQR7XDl4Hx8sHwfCstq8GJdBWMJs64c+S91/ZgZNkMpNyMZPVun122n3obtHQXIXVTSpXvm4l64Ykg++uTy4z+SnXZU1Xq4y4xjZuyysQPGE5AVl5SZ/jlmAznrE0eMxMwoXSky60Q9iSxDganzUDNy/6RYsMzIqx/zm24G+3xVnmKC1JvJpnSV8s+HumbrExdi5rPPPsP999+P6dOnY+jQofjvf/+LCRMmYPv27cjKyor28GKOSN7yWs+c+vphyUuxlgcAhy5mLmjlQM+Zb+H6dT8h2e1zM63K64kXR12LVW16q9Z/4oKeAIC0ZH7MkGnLjAk3E29yMYq9UBpV2OBhqc1Bgt2GAW2aaY7t9K4t4faI6JufoVpmdHr+Cs2yX58GriNL6bQWb74YUTMx2ym5nqwE4Tplo2ePpXtJce5mGkiaRalFEhwBy0w0ChU2NOJCzLz44ouYMmUKbrzxRgDA9OnT8dNPP+G9997DQw89FOXRxSARVPBaf2fhfBjr/QLhuTvYGJBQ3EwZVaWYsvob/GXTzxAqfB2e17XuihdGXYdlbfuqnjLn9WmFPkwmS1oS/8/J7K9b1s1kxppz37gu2HKkBKM6t/R/ZuZrYFOzazltHHjYBQEvXtWPu8y8ZcbYHcTDcFUTIknutoqN2UIe8B29cSitD1bilcJ13FBWDucYlefO+17CVmfGFihZYMYSSXYZfWJezLhcLqxduxYPP/yw/zObzYZx48ZhxYoV3G1qampQUxMI3CwtLY34OGOJyFpmtAIs68vNpD471v0RTABwWnU5bv79O9y05lukunytDYq69cb/9boUCzsM5D5dUpx2/O/qAbLPmmj45nXaQslQFrfjwX5+z7jOusvNUKtTTJCFt9bdZ3bGK/N24onze+puy60AHMb7xcxEEInU7FCRudqiKWYUr2Pk8sgYUyfYM5uo+5KF8/tU3qJmU7ODGYNUikEdmxOL30DsE/NipqioCB6PB9nZ2bLPs7OzsW3bNu4206ZNw5NPPlkfw4s4s1YfwMer9uOd6wcjJz3J1DZegwJxLrcX87cVYnjH5kjXcI1ooW2ZsbQbiKKIfScq0a55iiUh5OY0kmT7MVlJzW5aU4nJa7/HlNXfIL3GZ4nZmtUePd7+L2Zn9cXCbzdrbvvbvaNVn2mlLJt2Myl6JvEIZ0ozEHAzGcEzlt1/VhfcMaajZrbIhJ7ZEEWgfYsmvrFZG5ofK9lMmtctCkGtRphJxa8P5BM2P70/2rRpnoKVD5/JfV6Fc7TK2JVIiozurdKQnGBH/zYZss+pnUFwNMjeTA8//DBKSkr8/w4ePBjtIQXNQ19vwubDpXj2V75w42F0z78weztu/3gt7v9sg/5+RBHVtR5ThehYt8j+ExX4509bUaiT4fTKvF044/mFeGUev5WAFrxspsqagGXGzFiTXdW4feWXWDL9Zvzfko+RXlOBHS3a4vaLHsa5k18GLrjA3+lZC2UVXEDbnWTazWSiaJ5xH5rITERaHXuVQub+s3zZXdcPb4s3rxuEt64fxJRtj8zYzEw4MWmZMRH0GQ3qayhWxUFOehJXOCvvq3kPjAl6TMrsJbPGxNO7+GI3W3LqUmnRtnkTrH/sLDyusGzGSrZdvBHzlpkWLVrAbrfj2LFjss+PHTuGnJwc7jaJiYlITDR/U8USP248gqd+2Io3rh0gqxorFXIzAzvfi6Ko+uN4c/EeAMC8bYW6+3n4602Y9btcCJrJFrn0jeUoKndh69FSfHLLMO76L83d4f9f6S7RE2O1HEsCm62j5zZJqq3GNet/wR2rvkSLyhIAwO7MXLx62tWY3Ws0Kj2Bc+CJFRbe5KNlmdFr5ijf3kSdGcMOwdrLMlLCX9RQyV1jO+HsXjno2LKpapnSnREurD77Y8WMHzuTlnwcsTMucyhHy7v3gtqvYD4LTrIcWf0b4xW/1LTMUNSMLjFvmXE6nRg4cCDmzZvn/8zr9WLevHkYPty43028cefM9Sgsq8FtH62VfW6lISDr07XQkkiFUsgA2g86dnhSfZt1+08Ff3ANeJYZto4Kj0S3Czes/QGL35yCfyx4Fy0qS7A/Iwf3n3sfxt/8On7qdTpsDvlDyEjM8L4Pre/IZF06Wf0XM2X5ucs5j9yXr+yHbjmp+OimoeYGwsPkfSQIAjpnp3KtUcHOkUabKSvY8scV3LEjCXuJopl2q6ozE4PXSo9wWrXUAcDqe0vrq8pJT+KKE6vEm5iMFWLeMgMA999/P2644QYMGjQIQ4YMwX//+19UVFT4s5saIkoLQ7D3t9vrhd3G/wOzUn/BPw7mNfsAtgkCdhWW48U52/2fScXSeKQmObTTqHWe6zzLS4WG1SrBU4vLN87B1BWfo3VZEQDgUFoWXhlxJb7uNRZuu+/2twuCTEgAYRYzJr88JxsArLEvw8q5nGGf3iULF/bLNTUGLZLC0BYjaIuIhTghMwHqsTJXsPdFKD86QkVuMYvNmBk9whoAzN5Lqvf1c100s5nIMKNLXIiZK664AsePH8djjz2GgoIC9OvXD7/++qsqKLghobyh9R4wi3Ycx2e/H8DTF/ZC86aJsvL+yhpzVczEn5NmLqBYa1yslcQmAFe/vVJW/l/ZkJAlIyUhqJow/JgZ+X4cHjcu2Twfdy+fhbxSnyvtaNPm+N+IK/B5n7NQa5dbYWyC2kWUaA9CzJjIQNJDbpkB8pol49DJKtVY9eBN5mYtQzyeuagXPvv9IO4b1yX4nUgEGbdiZRIxs2aszNXySsyxMShBqL8A6Vj5HliUtX/47QyCbDQZxBiC2b6xEhdiBgDuvPNO3HnnndEeRr2hvKH1nnU3vLcagM//+uLl/WQK3lcxN/Cr+kRFQGwYWR94sBMLayWx2QSZkAEC9UV4pCcn4CB8E/VXaw+hqLwGt43paHh8XgXgBdt97RvsXg8u3LoQdy+bhXanjgIACps0w2vDL8esvhNQ41CndQK+a+1QzPiGlhnOA0erz5HpRpOK1Oyv/zICQ/45T7aO0Z54hwrll/a1w9ri2mFtg96eJVKTl6nUbJ130SI1KQF3j+2EWq/ITTmuL5RxIfFmmeGN939X98ej32zG69cM4GyhjV7NHYlIW0i0rn6nMMUCNVTiRsw0NpSTkpkHzOG6X/Gs8UI597NNB6s1ytPrwQ6DTevljU/XMpMceHg/8MUfAICJvXLQtnkT7voerwi7TeDWmbF5PThv21Lcs+xTdCw+BAAoSknHG0Mvw8f9z0FNgn4wuE0QVILDMACYs1jLmGPezST312elJmFEx+ZYvvsEc1z9ffGsGLEyOQUbAGw0fDP9c2IxmwkA7h/fNdpDUF2zWLo+ZuD9LZ7XpzXO7d3KcvwJu7ZNYaYKNZbF7NbKv9cf7jwN7y/fh/+bEAbraAOGxEyMovzDsfKHxJpBlZYMVsBo9drRg3XzsJlFvNHpxczwUixrPSJW7jmBMk5A7/xthRjTpaWsnYEgejFhxwrct/QTdC06AAA4mZSKN4deig8HnItKZ7KZU4IgAE9e0BO3fLgGd5zusw6F0zJj9qszl82kD9cywxlWgl0wXTAvXEQqsNGUaykG68zECvEeAKydjm/9RJSxVTyhfGb3bCzffSJi1jTlsHvnpeOFy/tG5FgNCRIzMYraMmO8jTQ1eZhJShljUuNmxIyFdG8Jt4aY8XBsr3puJl7xO68o4sq3VnLXn/LhGtxyWnufOBNFnL5nDf659jPk7vXV3ylJbIK3h1yM9wdegPLEFNPnA/geWON6ZGPjE+ORluSLp3EGEzNjwms3pH0mVu8t5i4zl81kYJnhxcxwPkuw21Drsf79hwtrvZfM70s7AJj/mpAjCELMpK4bMb5HNmZvPabZ6T0YlD9i7ApxAwA3DG+L3IwkDGjbLGzHZaH7MzhIzMQo6pgZ82qmlhEcSpFRI3Mzmav+yuLxiv7aNbVubdEEMA0GOfDcRS6DPkHvLN2LEYc2476FH2Lw4a0AgHJnMt4ddCHeHXwRSpPUPuVz+7TCTxuPqj5//8bBmDzjdwABoSgJGcDYMsObNLUsM+xX8O4Ng/DW4j14db66WCBbAVgrzsaKy0XvM9+x6lfMRMrNZGa/8nVotmBRWq1iJBbZkDeuHYjDJ6vQprm1Hy9PnN8DT/ywFbdzYvQ6ZwWeIcreTNJLh92Gib1aWR6vWTso3Z/BQWImRlGJmbp5ThRF1HpE7mQruZdYq4eyy3Q1Y5lxebxwe7w4cqoaM1cfwE0j28EjivjLJ+twzVDtoE+PV4TDLsDF/LKv4QgjnmXmzUW78fmag9h9vEK1TK9JZJ+jO/B/iz/C6H3rAQBiUhIOXn0TLmwyEidT0jW306pB0y0nzf+aN9kHExxtpjhealICzuqRzRUzbEaV1q6MRC1vMW9yCub8QiX4OjPmz1nT4kPzgyaCQg3WV52TUI9jtwmWhQwATB7ZHhN7tUJ2mjqWjn0uFJXVyGLU6uu6xIuYjDVIzMQwbB0X6Q/pnlkbsGTnccx74HSVz1YydrBWD6/CMqO0xlS7vbjyrRU4UlKNdftPonN2U6w/cArrD5zSHJfbK8JhB1yMZeazNZwCe4r3W46UYNov2m0Z9hVVqj7renwfHljyMcbv9Lmfam12fNZ3Ai77ZjpSmmfh5DNzNfcHyFsdsNgMJsBEu/W6KspaNVokaPijEkw0mgwmZoZ3fpMG5uH1hbvRNz/DYI/hw0xxu6D2a7GGDJnx9WkMk6lWnzs2lq/S5ea6mSINFc0LjpivABxvbDlSglfn7ZTFpgSDzSYXJdID5vs/juBkZS0+41TnlWBjWZQxLjNXHZCtW+Xy4EiJr4fS6n3Fpop3SS4lXmsB2TgUOztRVxlYiz3Hy/2v2548gv/+8Bx+ee8ujN+5Eh7Bhi97nYkzpryJr255BElt89GiaSLuHtvJv01rzgPqov78YnHsA4P38NYLXtZCyzWkrEuhJWaUdWZ4GFlmzGYu3TuuC968biA+vHGIqfXDQdCWmTA82ykAWBtlYbj6mkyN4tKixX+v6IfRXVri6qFt5ZaZCB4zmakcTPdncJBlJsyc+8pSAL6JXGq6Fwx2QZC5iJSTVEmV2iUjWXLcGgHAbyzcjaW7imTbKNOzs0w0Sps6cx2euaiXoZhRBvka6aSNh0vQqvQ47lo+C5dvnAOH6Nv+p64j8eJp12J3i3wAwLntAz2r2rcMpHJf0C8X0xftBgD0aJWGx8/vgcHtMvHIN5tUx+IVw2IJ5kFrtgeT1r5ZMaQpSoziR8yOwWHDhJ783mbxjGbMjBlXFFGvVqszu2dhRMfm6JOXUX8HNcFF/XP9P4JsgsGDIkzkZ6bgrrGdkJaUYLoxLSGHxEyEWLufn7FiFkEQdOu4cMUMfNaSRTuO+z9jxcy36w+rtlGmZ6cmGd8SC7cfx8Nfb/KnMWuhjNfRo0XFSUx8+y1cs+FnJHp8cS7zOwzCC6Ovw5Zs+XHaZAb85Gw6M6sREhNsGNqhuebx5IXCOEGzNgEOjbo2WmhaZhS7YONVBCGwnBVDmh24g4iZiRWUFoBgtgt23Ri+LFHHbDPFcJNgt2HmFH4j2liBfaZE+to8EAM1h+IZEjMRokIjVsMsgqCo4yLIhUkp1zIDvDRnBw4UB2JP2G149VuU6dkuA2uLxN6iCsM6JbVeL16dtxPlLjcemtiN20wvrboct636Cjeu/R4ptb4Kwivze+G50ddjbV4P7n6TmMBiWQYQ81A2shqZ+fHjdNjgtpC+brbSbwLjTjqtUwss2emzltlklhn+tsHEzMQK9ZGlEc6aI40FWfwvXSYZvEaTRGxCYiZCBFPDhcWmcDN5vaIsDkeyzHgZsSIC+GjFftl+WDFTzumFpLTMsOnWejRNdKDWIJW61uPFC3N2AAAmKlwaKa4q3Ljme9y2+muk1fgymza06oznR12Ppe366T452CA9VhiwYsDoPMxMbk6HDZWREDOMZaZt8xTcMmoImiY6wDripIeoUv8Z9VmKlWq/PJRZMxa2DO4YwR6ukaF3y7RoGr02C7GAzcCCa4arh7bBzFUHMPUM43YtRPCQmIkQFS7rTRRZbIK6KB0rkE5W+oJpZZYUUUSy0y6zwLBuEl7F3xqFIHGZLKTWNNFhaP1g07Uvfn05nrygJxLdLly7/mfcsfILtKgsAQBsa9EWL4y+DnM6DTX184etX+MIg2VG65DK5pNGmBUzbMyMxwuM6dISALD+wElmTFrZTEZuptidtoMdWVgCgGP3ssQU0v31/o2DcbLSpdlepLFgN1EuwYh/Xdwbj53XA0kJoXeeJ7QhMRMhwmGZYYWKxyuimhEeUk0W5aSdomgTIFlmeBV3Abllx7c/8zEiRi4pVig5PG7UvjEdC799B63Kfb2G9jZrhZdOuxY/dB8FUbD5x29kDZG5mWx8y4zR2MxYMKxaOcy7mVgxw4+L0nQzGRwipt1M9aAoYlnMxSq8lPnTu2ZFaTSxRbiymUjIRB4SMxEiGMsMKywEhZvJ45VbZqRlbNVcrwgkO+VfqSRmKjX6MCkr9xpV4ZUoqao1FD4utxc2rwcX/LkY9y6d6e9kfTi1JV4ZeSW+6nUm3Hb5eIe2z/R3wdYiiRFsDo2quUbBx2bmPLPixL++yYmU3S+rueRiJrjYj1iuHhqsl8nSuppupti9LtFGHphNsESjzgwRHCRmIkQwrQJqZb/S1fVi2DRqaRlrgaj1eNEkUf6V3v/5Bjx8TneM6MjP7FG2O/h9Hz8L6/Hze+D95fuw/4QvuPhUVS0q9QSbKGLkxkW4dd4H/iaQxU0z8MrQy/Fpv4mocfB98YPaZeLqoW0x5cM1mrtmLTNsbRb2wWNUGTQSlhmtonm8wGcJ1jLDHk4SPMohxHUAcD2MTfMQMXxdoo3s0tCMLUPezoCuTSxDYiaGYC0dymwmj0rM1BWuYwJdXW4vWqbKzZlHS6px96frsfyhsdxjKt1MW46Uctcb3C4Tg9tlYs2+Yjzxw1aUVNbi8Mkq9YqiiNF71+GBJR+jb8FOAL4mkG8OvRRfjLgYx8UE9TYMLVMTcVaPbPRsnaY5FlkAMNtp2ibgu6kj8c7SvfjbRP00RzPPbKNgW9X6QUwErAHJjH/esGges48OLZpg0qB8y2OKFFYr9YZzXZqjiWCwydUMEcOQmKlnDhZX4ob3VuPG09rjumHy/kduRV0ZVtx8t+EIlu4MFLyThM4app5NjdsrqyTJouU+MltGxWEX0C0nDR1aNsETP2yFy+PFzsJy2TpPZBSj+2v/wdBDWwAAFQlJeG/QhXh7yMW+JpAmjpWZ4rPYNHFq35psAHCCg7XMAH3zM/DqVf0NjyPPUuBj1m0kYTVgGJCLSXNuJv39scunXzcQXbJTLY+pIULzkA40X2tiN/GcIGIDEjP1zHO/bceeogr849vNKjGjDFpVBveeqHDJlnm9Iu7//A//ZzVujyoAWGvfEko3kxZScbrkBDsS7D6hteWILxupV8EuPLj4Q4zZu843DnsCPup/Dt4YNgknmmSY2r9EsyY+y02SxnlIY1COC7AW4xIJN5NWoTu9K+zhtKxQvpaPSX8MDbFsv6UCe1RnxjKR6pnVEGCts3QPxTYkZuoZvYmtVhHwq5deXOsRZR2wAZ9lRqsbMmuZee3qAfhk1X4s331C5WbSQkonFgQBKU4HSqpqkbZ7B55Y+gnO3rHcN2a7A7N6j8Orw69EQVoLU/tVklFnmUnRif5nMwO06swYwa6pdQWslhUPxjLDikl50TytfRm4mUyknMcCVAE4dgi2MnNjwIwFl4gNSMxEEK9XVE2IyToNDNkidD4xoy80yhRF8GrcXk23kZQm3SYzBef2aeXvcq3MZtKCDW7tXHYMV/86AxdtWQgbRHgh4NuepwOPPY5H15Vr78QEzSQxo2OZSXQY15kxwlQ2U7gsMzqXWMvNJP0KVBXNM0zNDjZnqH6xJFCs7DfMx24M0OXQJhx1Zoj6gcRMBPGIImxQihntSdrtlWcvGRV+U/Zncrm9mvVkpOBhyXIjaRMtN5NNkMfTOOwCcOgQ8MwzmPX2O3B4ffv7pcsIvHjaNdjZsi2e7dABWLdRd8xGpCcbu5lYc69WnRkjzJiM690yw2YzaQayGqRmx4tlJkJj0yw2GMPXgohdKDU7fojNHuwNhCU7j+O0/8zHwu2F/s+Uk/SJ8hq8MHs7DpyohMtt3s0E8PszaaWES+tK7iLpF4eWm2naJb3Rs3UaACCzsgRpj/wN6NQJePNNOLweLGo/AOdf/xLuuPgR7Gzpi/3RC9o1izQuPTcTC2uZCfZZo7WdVW1i1ZIDKGNmjIWZYcxMAzSLhyNWgXWfmAwTazRQLIg2Rg1pidiBLDMR5Kb3fbVSnvttu7+iptIy8/DXmzB76zF8seYQ3rxuoP9zM24mqQowi1ZxPGldyTIjTZy8FgeAL0X60ZGtsOau13Dzmu+QVFvtWzBqFB4bchU+dLRRbaPnGrKK2X2x7q9wT1KWi+ZpBgBrD4wt7ierNhqkhUEeM9P4Hr6Umm0dujTakJspfiDLTBjRKo6WlZrof82KGY9XxKq9vtTqgtJqVV0Zq24mAKjSKGRXWuX7XIo3kf5In/xhq2rdZFc12r/9KgaPHYS7V3yGJrXV8A4YCPz6K7BoEQ70HKjaBpDXfwkVtpLxeX1aaa7H9jnyhlnNRKqdAYuWm0m7nYFRAHB8WGbM/MqVvvcbRrQL634JOTRJa2OnGTJuIMtMGNGKpWV78bAWh0qXG8kJdr8oYS0xbq8XNRyriZQWDQQECotWXyMtywyL012Lqzf8gqkrP0fLilMAgB3N2+CFUdfi9S+f9v9la7mTtKwpZvotAcCzl/bh7ut/Vw+A074BX68/rNqGjVMxWzPHLOGyzOhhuc6Mwf7iJZvJDK9e1R/PXdbXkkgmywwRTuSFHukmimVIzIQRNoCXhZ3IWWGz41g5Ckqr/e+X7w4UxfN4RW5tmGUPjcVZLy5GSVWtXwRlNnGivMYNl9ur2eBSipmRLDOsS8Pu9eCyTXNx97JZyC3z9UWqadMOe+98EOccz4PXZoedGbfW5KIlZpwOG77+ywhM/O8S7nIA+G7qSPTNz9A8xlVD2+Dr9YfRj1kHkAsILcuMIATngrIcMxNENlNLxmpnptGkobWoAfn4BUGwbO3TTmiP72sRSejaaENF8+IHEjNhRCvNmW06ya5x6RvLZeu9On+X/7XbK6JGEcyblZqIrNQkvyCSBErv3HRsPlyCE26XjmXGNwY2m0kQvTj/zyW4b+nHaH/S1wTyaNPmeGXkVbhm+uModonwvrdatS9WtLCWohQNi41dEJCdmsRd5l9HMXsPaJMhez+4XSbmPzAGrTOSZZ+zv5a03HwCTBUfVhEuN9PNp7VXfTbjxsH4cPk+PHFBT+Z4geXhiZnRXzeaRC6bKXrHjlvoemhCMTPxA4mZMOLWEDOVNQGBYdZC4PGI/towEpKIcNYFvUquo+QEu9/iotX8UZbNJIrovXYhbvvgFXQ/vg8AUJSSjjeGTcLH/c9BjcOJG5MT0VqjVyP7a9lpt6HW45GNT4kgCEhL1u/JpGzS2CkrFV/dMRwtmwZEUIeWTXX3oeVmsgmCbjxNuNJ5lWLm4v65mHZJb1mRP4kzumbhjLqgcHacRhj2ZqInLhe6LNrQtdHG1oAsnQ0dEjNhxKORfVRZy1pmzKkZj6h2M0mTopSOLLmZUpx2v8VFKzuptLoWEEX03LIKGHY7bl7ts7iUJjbBm0MuwYxBF6DSGbB6JNhtaN+iCV68vC+yFFYVNmYmwWED6qxBWi4Bu804noSX1jywbabuNkq0LGPBPqy1Hl5D2vPHxaszwxMyWpipa9OYYmaCIdhYI8JHY7xn9Gjsf0/xBImZMBJOy4zPzSQXJpLlQyrhLwUAJzntSHT4lmmlc6esWYVP58zA8AObAACuxCS83f98vDn0Ul8TSAXSMS4ZkKfel8zNFIilcWqE/mtNMDeObIcZy/YBCC54VolmzEyQjibesL+bOhJdc/jNG+2KNttabi8tzFwCw6J5sj47jfDpayILjOrMyGmEd4lpZG6mKI6DMIbETBixGjNjtC+lmynZL2bqYmbq3EwpCXbNnkw9j+3GA4s/wtg9vpo3bkcCHFP/guf7XoS3tldoHt9h085JZC0wfXLTsXjncbRomqg5eWqJGdYaEw4xozlJBWuZ4WzXVxGAzKK0LlmdM824iKx0zW6MD1/NRpP1PI54goSeNjaKmYkbSMyEwNkvL8Hxshp8OmUoOmenamYzVdd64fGKvgnb5NOCK2YSfF+XUswkO+2yfkUA0LHoIO5f+jHO3b4MAOAWbPi8z1k49cDf8JfrzkDVt5sB8MVM1+xUWZaNEtYyk56cgI2PT1DFvLBIuuilK/rivs/+8H/OCphIWmaC3bXlAGDFNbA6MYQ7ZiaWH76RshpRarZ16NJoEy+9zggSMyFRVF6DovIav2vHrVOxt9LlRmpSgqVf68pg3mSFm6mkMiBmJMtM3qkC3LvsU1y8ZQHsohdeCPi+x2j8d+TV2JeZi3tycgFoi4eXr+yH8/q01hUX6Uwwb2KC3TB9VrJYXNw/D+8t3YdNh0vgdNhkv3r0LEFmadbEyf1c+Wu9b156yMfiEbJlxsQlMMxmYvZBAYsBGqXLzSR0abSh3kzxA4mZEJDubSmoVytmBgCqXB6fmLEwwynTrNOSlJYZn9hp4nQgu+wEnp79Oq74YzacXt/nv3UehhdHXYvtLdv596FXNA/wiRwjK0l2WiAgOEmnC7gEe6zXrxmAl+ftxC2j2uOnjUcD64SgZV6+sh9W7D6Bi/vnGq77yDndcHF/dRwQD6sToPK6WY+ZMWOZMb+PWH74RmpoZvYby9cl2tC1kSP/cUDEMiRmQkD6w5fmLK2YGQC48LVlmHHjYEsTnFLMSK4fNui2WWUJRr75H1z16Qw4a2sAAIvb9Yfr8SexIrMDHu+ZjavfXuVf3180T8scb+JPNocRM6YmYOZg+ZkpeH5SXwDAz4yYCcUyc2G/XFzYT1vIsOd66+iOpvdr9eEVqqtMdi01bxPzx2iMD1+ajK1DFjxt5HVm6DrFMiRmQkD5ENCKmQGAoyXVuP+zPzBpkDmrAABU1MjdTC2aSmLGF3tz9/JZmLL6a6S6qgAAv+f2wPOjr8OqNr3x2ehheKJDcwDA0PaZ/h5QTkVvJiVm5uNMxp3D69xtdp/sfB2OmBktgn0IhVpnxnoAcOjryARRI3z20sRsHZmGpgBgGfHS64wgMRMSViwzgC+rifewOLd3K/y06ajqc2XNGEnM2AQBEAS0PXUUqa4qVPXqg0/OvxXPeNr6B8UG5DZJDHzNTetea9U0MVXrhPkDP6UQM89c1Aur9xZj69FS7CosD4zXgIiKmXraTnUOFicGM6LLWqPJ2H38RrMCMEGYJV7ctgR1zQ4JKzEzANA6PVk1v6U47bKS9iwVNXw3U1G5z5300sircceFD6Fk8QrsHTxa9tfG/hGyYkYKkuUVqWPPySynKl2y99cOa4tXruovy64yI1R4BefCRj1lMynPIRxdvJVFFo0tM4HXjfHh2whPOaw0xntGD2pnED+QmAkB6VeynmWmQ8sm/te5zZJVMTOJDpvmBFWlyGZqWWeZOVLia055KCMHv3Q7Dc1SE/1F8yTYGJQmTLZRsxSfmNG0zJj8i71uWFsAwH3junCXsw8BrX2ylyKalplwpfPWx8POyNoSL16miI3NxJdArhQ5NElrI/txENN/UQSJmTAgPRt5qdmSeACA5pzU4aQEu+ZEXqEIAG6R6tv+eFmN7PNEh7poHhtPyzaAzEzRt8yYjcN96sKeWPePszCiUwvucpmYMSFUtMYTDpTNKc1jbUxOuw2dsgLVlCMxaVq5TLEcsBixOjMR2WvDhiZpbRp7DFo8QWImBAIxM75Zi2eZGd8j2//6zcV7sLouEFci0WFTPdivHJyv2k//NhmaXaml/bCwlhm2y0CzJgmqz1h6tDJXg0UQBFkgsBKHzDJjvD8zgidYXr9mAE7r1AKfThlmaTvrlhkBv9072v/ebB8ua8cwXIPzquEjFXI8vWvLKI8k/ohhzRt1qJ1B/EABwCHgFzN173nZTAPaNkP/NhlYf+AUAGD21mOy5UkJdtVkf9Np7bH7eDl+33cSADDnvtGyX/xvXTcQt360VraN0jLDihUXU0lYLwB4+rUDkZOepPo8GGTVfbXcTBGY7Hl0aNkUH98y1PJ2wTy82PMOxTKjdW2M3ICyH5Ix/PQN99BWPHQmjpRUoXurNONjx/B1IWILSs2OH0jMhIBknpUmLZ6bKcFuw9D2zf1iRkmiw6ZyM9ltAsZ2y/aLmZREh+wPaXzPHOyddg6+XncY/dpk+Pcj30fgPdsWQdoPT2B0zlY3nAwWMzEzsU6o446EVDPszSR7HZ/XPRjSUxKQnpJgvCKhovHcJdYhL1P8QGImBAI3ughRFHHLh2tU6zhsgu4ElOiwqyZNuyCgW6tUZh21T0gQBFw6MFCzRumCYsWKy622GPEm6nCKDlZMacXhxEogZqT6+YRyflpCxNJ3FMNP3zjVtw0SsjhoE8lYPiK8UMxMCPhTs0VfM0keTp1sJQBITLCpxYxNQLccfTGjpJniVynb9PCsurgdWeVezqDCGbbiaACWmdCHHbya0XIzGWdmUSopYQ26TbSRuY2jOA7CGLLMhIA/NRuAR+NnuMMm6E7mPsuM/DObTUCr9GTcNbYTXB4vUpOMzefKJovsL4qJvXLwyS1DZQKJ1+Q6vJYZgfs6nmCtI3eN7YRx3bN11lYTjWwmQeM1QWhBolcb9sdBOOpGEZGDxEwIsJYZreq/CXab7qTiqzOjdjMBwAPju5oeC5sCDqgD10YqUqh5AiOcGUXybrNaAcCxgdYzih22le/Cv98gx6OHkUtAHgAcy7NU9MZGcxJhFtlzku6bmIbcTKHApGbrihmdScVuE1QiIpiei1LKNbtfPXjCJZz+YdbNxbMCAbE/qYQqBqx2zZZvWzcGxaRvZUSxLGWI2CG2RW90sZNlJm4gMRMmtMWMvptJEh3sKsGIioxkbcsM97jcAGDLh9XEEUduJs0A4BD3G8yjb9LAPORmJOO8vq3r9qFsZ9BAUrOjOLZYvi5EbMH+sDToVkNEGXIzhYDfzYSAmLHbBIzo2BxLdhYBABx2/QBg3kQfzOTvdNiQYBdQW5cebtTriGeZCecvtIZQnyEaw35uUl94vaKmy884ZkbgviYIwjrsj4dQLK1E5CHLTAiwvZmkAGCHTZCZI512m+4ExLWQBGnJSGMChYOxzITTgsLuP9pF84Il2IBoKbNsbLes4I6r8z0YjilOLDMEEQ/I3UxRHAhhCFlmQiBgmRHh8QQsM2whYIdd0I+ZsQcEkf+zIGehtOQEnKhw+cehBzcAOJxuJiZQJpgYoFgg2Mvx232jseHAKZxpMfspHMSLfomXcRKNG/aHBVlmYps4nWZiAyGgZvyWGbtNkKVpG6Vmh9NCkp2WqLtfFt7isGYzmagz0755E+7n8U5WahLG98yJSKyQle+ILDMEET7IMhPbkGUmBPztDAB46swxdpsgU/CCoF8BmG8hCW4WYrtDG0164TwuD7bRpdZ+Jw3Kx5GSagzv0Dxsxw0nsRjrY6loHtk/CCJsxLpbvLFDYiYEAl2zAU+da8kXMyNfrz4CgAEglxEzRkQ6m4kVMFrnY7cJuP+sLuE7aJBoTfoxqGWMs5nY1zE4folYHltjhr4WbcgyE9uQmykMiBD9HbNtgqCqR2AmNVu+fnDjsCJm+O0MwmiZYWJm4nXiisVhG8b/sgHAkR0K0QCh+VobipmJbUjMhACbzSQF/foCgM3f9DwBEax7o09ehul1+ZaZyMTMxGuztlgctqU+k7F4AnWQC4yIN0jLxDbkZgoBts6Mm4mZUbuZtB/cRvVgrNCjdRpevrIfWjRNNFw30tlMdhNuplgnFhtkGokAeZ0ZgiDCBVUAjm1IzIRAIGZG9N/odhvPzaS9j3BmEAHAhf1yTa3HbWcQoWymWLYQ6BGLwzb6iqgCMBEK9LVoQzEzsQ25mULAL2YAuNk6M6JyPWup2fUB77jhFB3ydgZh221E0D7t2Hu0GzaatLBuNInhoREEF4qZiW1ifJqJbfwmfbbOjKCOmdH7Ne3Q6sIYYSJdyI5tNBmL7hozxOKw49RjR8QJNF1rQ1omtiExEwIBy4woCwD2KO56vV/I0ZroI20RYvcfr2ImFoSDsoGoYeBsDIzZDBQATBBEOCExEwL+AGBRGQBsJTU7UqPTJ9IuCDMVgGOdWJhwn7igJzJSAj23BIP7JRbGHOvQNSKscP3wtujYsgnO69sq2kMhdKAA4FBgU7OZRpNKc6R+BeDoqBlPhKPZ4ilmJpbJSU/C57cNx/iXFgMwUwE48mMiGi50+6h56sJe0R4CYQKaZkJAlppdFwBss5jNFKWQGb8lKVLY7cbtDGIFrdHFgptJSaxfS9NE8TSoLD1BNDxIzIQALzXbYRNUVg/9rtnR+QrcEbbMyGJmYlEVmCAWs4EMKwDXzzCIBgrJPCJeITETAuzEIYkDm8BxM+nsI1qp2R5P/bmZ4lTLxCSGvZliUIDxiI9REgQRL5CYCQO+rtl1lhl7fAQAR9zNFEftDNKSE7ifx/iwuZBwJEKBbh8iXiExEwJsbyYPY5lRiRmdqxytAOC++RkR3T9bPydW3UzTrx2IXrlpePHyftzlsRifYjSmfvkZ6N4qDeN7ZNfTiAiCIKIPiZkQCEwrYsAyYxNw59jOAICL+rWuWy/2LDOt0pOx+MEzcOvoDhHZvy0O6sxM7JWDH+8ahU5ZTbnLY3HURpfSYbfh57tPw1vXD6qfAQVJNN1hlJpNEA0PSs0OgUAAcMAyY7cJuHZoG4zo2BztmjeRrccjmhN9m+YpSNdwsYSKPDU7PiePWNRgZu6XeImbIQiCCBcRsQvs27cPN998M9q3b4/k5GR07NgRjz/+OFwul2y9jRs3YtSoUUhKSkJ+fj6effZZ1b6++OILdOvWDUlJSejduzd+/vnnSAw5KKRfeCKYdgY2AYIgoGPLpv5JXL9rdnSNY5Ga9+SNJiNzjEgzeWR72ATg0gF50R6Knzi9lCoaynkQBBEbRMQys23bNni9Xrz55pvo1KkTNm/ejClTpqCiogLPP/88AKC0tBTjx4/HuHHjMH36dGzatAk33XQTMjIycOuttwIAli9fjquuugrTpk3Deeedh5kzZ+Kiiy7CunXr0KtXDBQy0rDMqFbTLZoXiYGZJ1Im94yUQBn+WA8A1iI3Ixnbnj4bTkd0v6Sc9CT/6zi9lDEF1ZkhiIZHRMTMxIkTMXHiRP/7Dh06YPv27XjjjTf8YuaTTz6By+XCe++9B6fTiZ49e2LDhg148cUX/WLm5ZdfxsSJE/Hggw8CAJ5++mnMmTMH//vf/zB9+vRIDN0SgaJ5oiwAWImeZSZW40lCpVdumv/1sdKaKI4kNKItZAAgLSkB8x4YA6fdRi4kgiAIDvX2pC4pKUFmZqb//YoVKzB69Gg4nYFf8BMmTMD27dtx8uRJ/zrjxo2T7WfChAlYsWKF7rFqampQWloq+xcJeDEzDo5lJha7ZkvkNkuOyH5TnAGdvO9ERUSO0Zjo2LIp8jNToj2MsEGajCCIcFIvYmbXrl149dVXcdttt/k/KygoQHa2PH1Uel9QUKC7jrRci2nTpiE9Pd3/Lz8/PxynoUIWM+MNtDNQrRfDlpnzerfCX07viPcmhz/75e/ndkeiw4Y7Tu8Y9n0T8Q1pGYIgwoklMfPQQw9BEATdf9u2bZNtc/jwYUycOBGTJk3ClClTwjp4LR5++GGUlJT4/x08eDAix2HbGbh1LDO6FYCjnOljswn468RuGNst/HVJbhnVAZufnIDB7TKNVyYaFZSaTRBEOLEUM/PAAw9g8uTJuut06BCoW3LkyBGcccYZGDFiBN566y3Zejk5OTh27JjsM+l9Tk6O7jrSci0SExORmJiou044YJ/HXp0AYP0KwA37wZoQ7QhngiAIosFjScy0bNkSLVu2NLXu4cOHccYZZ2DgwIGYMWMGbIoU5OHDh+PRRx9FbW0tEhJ8tU7mzJmDrl27olmzZv515s2bh3vvvde/3Zw5czB8+HArw44YfjeTKE/NVqJbAZiCB4hGxLjuWZj7ZyFuGNEu2kMhCKIBEZGfzYcPH8bpp5+ONm3a4Pnnn8fx48dRUFAgi3W5+uqr4XQ6cfPNN2PLli347LPP8PLLL+P+++/3r3PPPffg119/xQsvvIBt27bhiSeewJo1a3DnnXdGYtiW8buZmGwmnjjRrwBMYoZoPLx13SBseOws9ItwOw2CIBoXEUnNnjNnDnbt2oVdu3YhL09ecEyss2Ckp6dj9uzZmDp1KgYOHIgWLVrgscce86dlA8CIESMwc+ZM/P3vf8cjjzyCzp0749tvv42NGjMM8jozan2oX2eGxAzReLDZBFkNIiK2IEMxEa9ERMxMnjzZMLYGAPr06YMlS5borjNp0iRMmjQpTCMLL7xGk7wQkcYcM0MQsQYVzdNGpEtDxCkUnRkCgaJ5ZJkhCIIgiGhBYiYEeKnZZJkhCIIgiPqFxEwIsJYZrxikZYac1ARRr1CdGW3ocUTEKyRmQoAt/OXWyWYiywxBEARBRA4SM+FADBTN4/VaiuUKwARBEBIUAEzEKyRmQoDtmu3W65qtI1ii3ZuJIAiCIOIdEjMhwHbN9sZp12yCIAiCiHdIzIREoGu2W6drtp6jiQKACYKIFehxRMQrJGZCgLXMSL2ZrFpm9FxQBEEQBEEYQ2ImBNiYGa8/Zka9nl5cDE/8EAQRfk7v6muSe9WQ/CiPJHahAGAiXolIO4PGgixmRtR2M+mZbskyQxD1w3s3DEa5y420pIRoD4UgiDBDlpkQEJiYmTrDDLcgl26dGXJSE0S9YLMJJGQMoMcREa+QmAkB/x++KPq7gfMMLbqWGXp6EARBEERIkJgJAb+bCQFfM0+c6JVPl1KzP7xpCHIzkvHJLUPDPUyCIAiCaNBQzEwI+N1MTMwMT7dw2jXhjK4tMXlkeyTUdaYc3aUllj00NlJDJQiCIIgGC1lmQoHpmi0lAXArAHM+G9cjG2O6tIzg4AiCIAiicUBiJgTkXbN9r/mp2bxtKVaGIIjYol9+s2gPgSCCgtxMISB1zRZF+AOA+fG81tK1CYIg6pOF/3c6dhaW47TOLaI9FIIIChIzIcBaZvQCgPmWGYIgiNigXYsmaNeiSbSHQRBBQ26mEBCYmBmvTulMboYTqRmCIAiCCAskZkKA1SP+CsAmhQvFzBAEQRBEeCAxEwLymBnfZ2azmUjLEARBEER4IDETJvxlZkxWACYtQxAEQRDhgcRMCMi6Zuu2M+C5nkjOEARBEEQ4IDETCkzXbCn8lydSKJuJIAiCICIHiZkQkHfNrqszw1mPspkIgiAIInKQmAkBgbXM6Daa1N6WIAiCIIjQIDETAmzMjF4FYG7MDDmaCIIgCCIskJgJAdYy47VaAZi0DEEQBEGEBRIzIcBaV6S+2TyRwq0zQxAEQRBEWCAxEwKydgZe6TOTFYBJ4BAEQRBEWCAxEwJyN5PFOjORHBhBEARBNCJIzIREIDVbgmJmCIIgCKJ+ITETAjzLDD8Nm7KZCIIgCCJSkJgJAXk7g7rPyDJDEARBEPUKiZkQkBfN046ZMVtIjyAIgiAI65CYCQG2nYGoY5nhbktqhiAIgiDCAomZEPALElH0BwGbtcyQbYYgCIIgwgOJmRAIxMwwAcBcMcPZlrQMQRAEQYQFEjMhILmUZNlM3KJ5vKBgUjMEQRAEEQ5IzIQJva7ZXMtMhMdDEARBEI0FEjNhwNc12/fadJ0ZUjMEQRAEERYc0R5APCMJktcW7PZ/ZtZ9RGKGIAiCIMIDWWZCgFfF16xIoQrABEEQBBEeSMyEAL8bttmNwzoUgiAIgmi0kJgJAZ4eMe1mCu9QCIIgCKLRQmImBEKxzJitFEwQBEEQhD4kZkIglPoxJGUIgiAIIjyQmAkBvpvJ5LakZgiCIAgiLJCYCQWuIDFrmSE1QxAEQRDhgMRMCPAECVlmCIIgCKJ+ITETAvymknyV8spV/TG2W1Zg20gNiiAIgiAaGVQBOAT4rQv4617QtzXymyVj/rZC7Y0JgiAIgrAMWWZCwIplRrmMYmYIgiAIIjyQmAkBq4KE1TkUM0MQBEEQ4YHETAhwLTM6EcCs+CEtQxAEQRDhgcRMCFitMyO3zJCcIQiCIIhwQGImFDiCRM/1RG4mgiAIggg/JGZCwLJlhtxMBEEQBBF2SMyEAL/RpE42k41dLwIDIgiCIIhGCImZMKMnUuQuKFIzBEEQBBEOSMyEAL+dAcXMEARBEER9QmImBLhuJp312Xga0jIEQRAEER5IzIQAPwBYT6YwAcBkmiEIgiCIsEBiJgS4lhmdKyqQZYYgCIIgwg6JmRDgWVf03UwC9zVBEARBEMFDYibM6AYAs69JyxAEQRBEWCAxEwJWu2aTgCEIgiCI8ENiJgR4qdl6goUVOiRsCIIgCCI8kJgJAX4FYJPbUggwQRAEQYQFEjMhwJMj1GiSIAiCIOqXiIuZmpoa9OvXD4IgYMOGDbJlGzduxKhRo5CUlIT8/Hw8++yzqu2/+OILdOvWDUlJSejduzd+/vnnSA/ZNPyYGb31yc1EEARBEOEm4mLmr3/9K1q3bq36vLS0FOPHj0fbtm2xdu1aPPfcc3jiiSfw1ltv+ddZvnw5rrrqKtx8881Yv349LrroIlx00UXYvHlzpIdtCqvtDOQVgEnNEARBEEQ4iKiY+eWXXzB79mw8//zzqmWffPIJXC4X3nvvPfTs2RNXXnkl7r77brz44ov+dV5++WVMnDgRDz74ILp3746nn34aAwYMwP/+979IDts0VmNmBJBlhiAIgiDCTcTEzLFjxzBlyhR89NFHSElJUS1fsWIFRo8eDafT6f9swoQJ2L59O06ePOlfZ9y4cbLtJkyYgBUrVugeu6amBqWlpbJ/9YVemwKqAEwQBEEQ4SciYkYURUyePBm33347Bg0axF2noKAA2dnZss+k9wUFBbrrSMu1mDZtGtLT0/3/8vPzgz0VXaz2V6IAYIIgCIIIP5bEzEMPPQRBEHT/bdu2Da+++irKysrw8MMPR2rcujz88MMoKSnx/zt48GBEjmNVj8jjZEjNEARBEEQ4cFhZ+YEHHsDkyZN11+nQoQPmz5+PFStWIDExUbZs0KBBuOaaa/DBBx8gJycHx44dky2X3ufk5Pj/560jLdciMTFRdexIYNW6QpYZgiAIggg/lsRMy5Yt0bJlS8P1XnnlFTzzzDP+90eOHMGECRPw2WefYejQoQCA4cOH49FHH0VtbS0SEhIAAHPmzEHXrl3RrFkz/zrz5s3Dvffe69/XnDlzMHz4cCvDjhhW9Qg1lyQIgiCI8GNJzJilTZs2svdNmzYFAHTs2BF5eXkAgKuvvhpPPvkkbr75Zvztb3/D5s2b8fLLL+Oll17yb3fPPfdgzJgxeOGFF3Duuedi1qxZWLNmjSx9O54gKUMQBEEQ4SdqFYDT09Mxe/Zs7N27FwMHDsQDDzyAxx57DLfeeqt/nREjRmDmzJl466230LdvX3z55Zf49ttv0atXr2gNW0YoAcAEQRAEQYSHiFhmlLRr1w6iKKo+79OnD5YsWaK77aRJkzBp0qRIDS0krMfMBDbgXA6CIAiCIIKAejOFgOVsJrLMEARBEETYITETClbdTBEaBkEQBEE0ZkjMhEBo2UzkZyIIgiCIcEBiJgRCqTNDEARBEER4IDETAlY7X1OnbIIgCIIIPyRmQiAUywxlMxEEQRBEeCAxEwKUzUQQBEEQ0YfETAhYtsyQm4kgCIIgwg6JmRCwKk5srJspzGMhCIIgiMYKiZlQCKECMEEQBEEQ4YHETAhYjpkJYVuCIAiCIPiQmAmBUBpNkpGGIAiCIMJDvTSabKhYz2YScNnAPJyscKFjy6YRGRNBEARBNDZIzIRAMNaV5yf1Df9ACIIgCKIRQ26mECBXEUEQBEFEHxIzBEEQBEHENSRmQoCK4BEEQRBE9CExEwLkZiIIgiCI6ENihiAIgiCIuIbETAhQRV+CIAiCiD4kZkKApAxBEARBRB8SMyFAhhmCIAiCiD4kZkKAspkIgiAIIvqQmAkBsswQBEEQRPQhMRMCpGUIgiAIIvqQmAkBsswQBEEQRPQhMRMSpGYIgiAIItqQmAkBsswQBEEQRPQhMRMCpGUIgiAIIvo4oj2AeIatAOy023DfWV2iOBqCIAiCaJyQmAkBURT9r1c9ciaaNXFGcTQEQRAE0TghN1MIuL0BMeOwk9OJIAiCIKIBiZkQYMVMgp0uJUEQBEFEA5qBQ8Dt8fpfk5ghCIIgiOhAM3AIsJYZu43cTARBEAQRDUjMhIDbIxqvRBAEQRBERCExEwIer9d4JYIgCIIgIgqJmRBg3UwEQRAEQUQHEjMh4CExQxAEQRBRh8RMCNRSzAxBEARBRB0SMyFAMTMEQRAEEX1IzIQAxcwQBEEQRPQhMRMC3XLSoj0EgiAIgmj0UKPJEJjQMxvPXtYHvXPToz0UgiAIgmi0kJgJAUEQcPmg/GgPgyAIgiAaNeRmIgiCIAgiriExQxAEQRBEXENihiAIgiCIuIbEDEEQBEEQcQ2JGYIgCIIg4hoSMwRBEARBxDUkZgiCIAiCiGtIzBAEQRAEEdeQmCEIgiAIIq4hMUMQBEEQRFxDYoYgCIIgiLiGxAxBEARBEHENiRmCIAiCIOKaRtE1WxRFAEBpaWmUR0IQBEEQhFmkeVuax7VoFGKmrKwMAJCfnx/lkRAEQRAEYZWysjKkp6drLhdEI7nTAPB6vThy5AhSU1MhCELY9ltaWor8/HwcPHgQaWlpYdtvPNHYr0FjP3+ArkFjP3+ArkFjP38gctdAFEWUlZWhdevWsNm0I2MahWXGZrMhLy8vYvtPS0trtDewRGO/Bo39/AG6Bo39/AG6Bo39/IHIXAM9i4wEBQATBEEQBBHXkJghCIIgCCKuITETAomJiXj88ceRmJgY7aFEjcZ+DRr7+QN0DRr7+QN0DRr7+QPRvwaNIgCYIAiCIIiGC1lmCIIgCIKIa0jMEARBEAQR15CYIQiCIAgiriExQxAEQRBEXENiJgRee+01tGvXDklJSRg6dChWr14d7SGFhcWLF+P8889H69atIQgCvv32W9lyURTx2GOPoVWrVkhOTsa4ceOwc+dO2TrFxcW45pprkJaWhoyMDNx8880oLy+vx7MInmnTpmHw4MFITU1FVlYWLrroImzfvl22TnV1NaZOnYrmzZujadOmuPTSS3Hs2DHZOgcOHMC5556LlJQUZGVl4cEHH4Tb7a7PUwmaN954A3369PEXwBo+fDh++eUX//KGfv5K/v3vf0MQBNx7773+zxr6NXjiiScgCILsX7du3fzLG/r5A8Dhw4dx7bXXonnz5khOTkbv3r2xZs0a//KG/ixs166d6h4QBAFTp04FEGP3gEgExaxZs0Sn0ym+99574pYtW8QpU6aIGRkZ4rFjx6I9tJD5+eefxUcffVT8+uuvRQDiN998I1v+73//W0xPTxe//fZb8Y8//hAvuOACsX379mJVVZV/nYkTJ4p9+/YVV65cKS5ZskTs1KmTeNVVV9XzmQTHhAkTxBkzZoibN28WN2zYIJ5zzjlimzZtxPLycv86t99+u5ifny/OmzdPXLNmjThs2DBxxIgR/uVut1vs1auXOG7cOHH9+vXizz//LLZo0UJ8+OGHo3FKlvn+++/Fn376SdyxY4e4fft28ZFHHhETEhLEzZs3i6LY8M+fZfXq1WK7du3EPn36iPfcc4//84Z+DR5//HGxZ8+e4tGjR/3/jh8/7l/e0M+/uLhYbNu2rTh58mRx1apV4p49e8TffvtN3LVrl3+dhv4sLCwslH3/c+bMEQGICxYsEEUxtu4BEjNBMmTIEHHq1Kn+9x6PR2zdurU4bdq0KI4q/CjFjNfrFXNycsTnnnvO/9mpU6fExMRE8dNPPxVFURS3bt0qAhB///13/zq//PKLKAiCePjw4Xobe7goLCwUAYiLFi0SRdF3vgkJCeIXX3zhX+fPP/8UAYgrVqwQRdEnCG02m1hQUOBf54033hDT0tLEmpqa+j2BMNGsWTPxnXfeaVTnX1ZWJnbu3FmcM2eOOGbMGL+YaQzX4PHHHxf79u3LXdYYzv9vf/ubeNppp2kub4zPwnvuuUfs2LGj6PV6Y+4eIDdTELhcLqxduxbjxo3zf2az2TBu3DisWLEiiiOLPHv37kVBQYHs3NPT0zF06FD/ua9YsQIZGRkYNGiQf51x48bBZrNh1apV9T7mUCkpKQEAZGZmAgDWrl2L2tpa2TXo1q0b2rRpI7sGvXv3RnZ2tn+dCRMmoLS0FFu2bKnH0YeOx+PBrFmzUFFRgeHDhzeq8586dSrOPfdc2bkCjece2LlzJ1q3bo0OHTrgmmuuwYEDBwA0jvP//vvvMWjQIEyaNAlZWVno378/3n77bf/yxvYsdLlc+Pjjj3HTTTdBEISYuwdIzARBUVERPB6P7AsCgOzsbBQUFERpVPWDdH56515QUICsrCzZcofDgczMzLi7Pl6vF/feey9GjhyJXr16AfCdn9PpREZGhmxd5TXgXSNpWTywadMmNG3aFImJibj99tvxzTffoEePHo3m/GfNmoV169Zh2rRpqmWN4RoMHToU77//Pn799Ve88cYb2Lt3L0aNGoWysrJGcf579uzBG2+8gc6dO+O3337DHXfcgbvvvhsffPABgMb3LPz2229x6tQpTJ48GUDs/Q00iq7ZBBEsU6dOxebNm7F06dJoD6Xe6dq1KzZs2ICSkhJ8+eWXuOGGG7Bo0aJoD6teOHjwIO655x7MmTMHSUlJ0R5OVDj77LP9r/v06YOhQ4eibdu2+Pzzz5GcnBzFkdUPXq8XgwYNwr/+9S8AQP/+/bF582ZMnz4dN9xwQ5RHV/+8++67OPvss9G6detoD4ULWWaCoEWLFrDb7aqo7WPHjiEnJydKo6ofpPPTO/ecnBwUFhbKlrvdbhQXF8fV9bnzzjvx448/YsGCBcjLy/N/npOTA5fLhVOnTsnWV14D3jWSlsUDTqcTnTp1wsCBAzFt2jT07dsXL7/8cqM4/7Vr16KwsBADBgyAw+GAw+HAokWL8Morr8DhcCA7O7vBXwMlGRkZ6NKlC3bt2tUo7oFWrVqhR48ess+6d+/ud7U1pmfh/v37MXfuXNxyyy3+z2LtHiAxEwROpxMDBw7EvHnz/J95vV7MmzcPw4cPj+LIIk/79u2Rk5MjO/fS0lKsWrXKf+7Dhw/HqVOnsHbtWv868+fPh9frxdChQ+t9zFYRRRF33nknvvnmG8yfPx/t27eXLR84cCASEhJk12D79u04cOCA7Bps2rRJ9iCbM2cO0tLSVA/IeMHr9aKmpqZRnP+ZZ56JTZs2YcOGDf5/gwYNwjXXXON/3dCvgZLy8nLs3r0brVq1ahT3wMiRI1UlGXbs2IG2bdsCaBzPQokZM2YgKysL5557rv+zmLsHwhpO3IiYNWuWmJiYKL7//vvi1q1bxVtvvVXMyMiQRW3HK2VlZeL69evF9evXiwDEF198UVy/fr24f/9+URR96YgZGRnid999J27cuFG88MILuemI/fv3F1etWiUuXbpU7Ny5c9ykI95xxx1ienq6uHDhQllaYmVlpX+d22+/XWzTpo04f/58cc2aNeLw4cPF4cOH+5dLKYnjx48XN2zYIP76669iy5Yt4yYt9aGHHhIXLVok7t27V9y4caP40EMPiYIgiLNnzxZFseGfPw82m0kUG/41eOCBB8SFCxeKe/fuFZctWyaOGzdObNGihVhYWCiKYsM//9WrV4sOh0P85z//Ke7cuVP85JNPxJSUFPHjjz/2r9PQn4Wi6MvUbdOmjfi3v/1NtSyW7gESMyHw6quvim3atBGdTqc4ZMgQceXKldEeUlhYsGCBCED174YbbhBF0ZeS+I9//EPMzs4WExMTxTPPPFPcvn27bB8nTpwQr7rqKrFp06ZiWlqaeOONN4plZWVROBvr8M4dgDhjxgz/OlVVVeJf/vIXsVmzZmJKSop48cUXi0ePHpXtZ9++feLZZ58tJicniy1atBAfeOABsba2tp7PJjhuuukmsW3btqLT6RRbtmwpnnnmmX4hI4oN//x5KMVMQ78GV1xxhdiqVSvR6XSKubm54hVXXCGrsdLQz18URfGHH34Qe/XqJSYmJordunUT33rrLdnyhv4sFEVR/O2330QAqvMSxdi6BwRRFMXw2noIgiAIgiDqD4qZIQiCIAgiriExQxAEQRBEXENihiAIgiCIuIbEDEEQBEEQcQ2JGYIgCIIg4hoSMwRBEARBxDUkZgiCIAiCiGtIzBAEQRAEEdeQmCEIgiAIIq4hMUMQBEEQRFxDYoYgCIIgiLiGxAxBEARBEHHN/wPljKT9HP81ogAAAABJRU5ErkJggg==\n" }, "metadata": {} } ] }, { "cell_type": "markdown", "source": [], "metadata": { "id": "6Z4k8y1M7yUL" } }, { "cell_type": "code", "source": [ "rollout(100)" ], "metadata": { "id": "Clq2fkWA82mn", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "59e5ab62-43df-49db-adf8-f2c2a6b51392" }, "execution_count": 16, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "179.6353845079027" ] }, "metadata": {}, "execution_count": 16 } ] }, { "cell_type": "markdown", "metadata": { "id": "2EbGU_OmLhv4" }, "source": [ "## Let's see behaviour learnt" ] }, { "cell_type": "code", "source": [ "env.close()\n", "env = RecordVideo(gym.make(\"LunarLander-v2\",render_mode='rgb_array'),'video')\n", "\n", "state, _ = env.reset()\n", "while True:\n", " env.render()\n", " Qs = Q(torch.tensor(state).to(device)).detach().cpu().numpy()\n", " action = np.argmax(Qs)\n", " next_state, reward, terminated , truncated, info = env.step(action)\n", " if truncated or terminated: break\n", " state = next_state\n", "env.close()\n", "show_video()\n", "\n" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 508 }, "id": "gN14SiexanrI", "outputId": "eec8af94-0e5e-4173-c3d4-c318a609dedd" }, "execution_count": 19, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Moviepy - Building video /content/video/rl-video-episode-0.mp4.\n", "Moviepy - Writing video /content/video/rl-video-episode-0.mp4\n", "\n" ] }, { "output_type": "stream", "name": "stderr", "text": [] }, { "output_type": "stream", "name": "stdout", "text": [ "Moviepy - Done !\n", "Moviepy - video ready /content/video/rl-video-episode-0.mp4\n" ] }, { "output_type": "display_data", "data": { "text/plain": [ "" ], "text/html": [ "" ] }, "metadata": {} } ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.4" }, "colab": { "provenance": [] }, "accelerator": "GPU", "gpuClass": "standard" }, "nbformat": 4, "nbformat_minor": 0 }