From 66c1f950d108222af56e8a58fdbb9c04d026046c Mon Sep 17 00:00:00 2001 From: shengxiang19 <1228205102@qq.com> Date: Fri, 25 Dec 2020 10:57:57 +0800 Subject: [PATCH 01/26] Add C51 algorithm --- examples/atari/atari_c51.py | 154 +++++++++++++++++++++ tianshou/policy/__init__.py | 2 + tianshou/policy/modelfree/c51.py | 223 +++++++++++++++++++++++++++++++ tianshou/utils/net/discrete.py | 72 ++++++++++ 4 files changed, 451 insertions(+) create mode 100644 examples/atari/atari_c51.py create mode 100644 tianshou/policy/modelfree/c51.py diff --git a/examples/atari/atari_c51.py b/examples/atari/atari_c51.py new file mode 100644 index 000000000..22c33e368 --- /dev/null +++ b/examples/atari/atari_c51.py @@ -0,0 +1,154 @@ +import os +import torch +import pprint +import argparse +import numpy as np +from torch.utils.tensorboard import SummaryWriter + +from tianshou.policy import C51Policy +from tianshou.env import SubprocVectorEnv +from tianshou.utils.net.discrete import C51 +from tianshou.trainer import offpolicy_trainer +from tianshou.data import Collector, ReplayBuffer + +from atari_wrapper import wrap_deepmind + + +def get_args(): + parser = argparse.ArgumentParser() + parser.add_argument('--task', type=str, default='PongNoFrameskip-v4') + parser.add_argument('--seed', type=int, default=0) + parser.add_argument('--eps-test', type=float, default=0.005) + parser.add_argument('--eps-train', type=float, default=1.) + parser.add_argument('--eps-train-final', type=float, default=0.05) + parser.add_argument('--buffer-size', type=int, default=100000) + parser.add_argument('--lr', type=float, default=0.0001) + parser.add_argument('--gamma', type=float, default=0.99) + parser.add_argument('--num-atoms', type=int, default=51) + parser.add_argument('--v-min', type=float, default=-10.) + parser.add_argument('--v-max', type=float, default=10.) + parser.add_argument('--n-step', type=int, default=3) + parser.add_argument('--target-update-freq', type=int, default=500) + parser.add_argument('--epoch', type=int, default=100) + parser.add_argument('--step-per-epoch', type=int, default=10000) + parser.add_argument('--collect-per-step', type=int, default=10) + parser.add_argument('--batch-size', type=int, default=32) + parser.add_argument('--training-num', type=int, default=16) + parser.add_argument('--test-num', type=int, default=10) + parser.add_argument('--logdir', type=str, default='log') + parser.add_argument('--render', type=float, default=0.) + parser.add_argument( + '--device', type=str, + default='cuda' if torch.cuda.is_available() else 'cpu') + parser.add_argument('--frames_stack', type=int, default=4) + parser.add_argument('--resume_path', type=str, default=None) + parser.add_argument('--watch', default=False, action='store_true', + help='watch the play of pre-trained policy only') + return parser.parse_args() + + +def make_atari_env(args): + return wrap_deepmind(args.task, frame_stack=args.frames_stack) + + +def make_atari_env_watch(args): + return wrap_deepmind(args.task, frame_stack=args.frames_stack, + episode_life=False, clip_rewards=False) + + +def test_c51(args=get_args()): + env = make_atari_env(args) + args.state_shape = env.observation_space.shape or env.observation_space.n + args.action_shape = env.env.action_space.shape or env.env.action_space.n + # should be N_FRAMES x H x W + print("Observations shape:", args.state_shape) + print("Actions shape:", args.action_shape) + # make environments + train_envs = SubprocVectorEnv([lambda: make_atari_env(args) + for _ in range(args.training_num)]) + test_envs = SubprocVectorEnv([lambda: make_atari_env_watch(args) + for _ in range(args.test_num)]) + # seed + np.random.seed(args.seed) + torch.manual_seed(args.seed) + train_envs.seed(args.seed) + test_envs.seed(args.seed) + # define model + net = C51(*args.state_shape, args.action_shape, + args.num_atoms, args.device).to(args.device) + optim = torch.optim.Adam(net.parameters(), lr=args.lr) + # define policy + policy = C51Policy(net, optim, args.gamma, args.num_atoms, + args.v_min, args.v_max, args.n_step, + target_update_freq=args.target_update_freq) + # load a previous policy + if args.resume_path: + policy.load_state_dict(torch.load( + args.resume_path, map_location=args.device + )) + print("Loaded agent from: ", args.resume_path) + # replay buffer: `save_last_obs` and `stack_num` can be removed together + # when you have enough RAM + buffer = ReplayBuffer(args.buffer_size, ignore_obs_next=True, + save_only_last_obs=True, stack_num=args.frames_stack) + # collector + train_collector = Collector(policy, train_envs, buffer) + test_collector = Collector(policy, test_envs) + # log + log_path = os.path.join(args.logdir, args.task, 'c51') + writer = SummaryWriter(log_path) + + def save_fn(policy): + torch.save(policy.state_dict(), os.path.join(log_path, 'policy.pth')) + + def stop_fn(mean_rewards): + if env.env.spec.reward_threshold: + return mean_rewards >= env.spec.reward_threshold + elif 'Pong' in args.task: + return mean_rewards >= 20 + else: + return False + + def train_fn(epoch, env_step): + # nature DQN setting, linear decay in the first 1M steps + if env_step <= 1e6: + eps = args.eps_train - env_step / 1e6 * \ + (args.eps_train - args.eps_train_final) + else: + eps = args.eps_train_final + policy.set_eps(eps) + writer.add_scalar('train/eps', eps, global_step=env_step) + + def test_fn(epoch, env_step): + policy.set_eps(args.eps_test) + + # watch agent's performance + def watch(): + print("Testing agent ...") + policy.eval() + policy.set_eps(args.eps_test) + test_envs.seed(args.seed) + test_collector.reset() + result = test_collector.collect(n_episode=[1] * args.test_num, + render=args.render) + pprint.pprint(result) + + if args.watch: + watch() + exit(0) + + # test train_collector and start filling replay buffer + train_collector.collect(n_step=args.batch_size * 4) + # trainer + result = offpolicy_trainer( + policy, train_collector, test_collector, args.epoch, + args.step_per_epoch, args.collect_per_step, args.test_num, + args.batch_size, train_fn=train_fn, test_fn=test_fn, + stop_fn=stop_fn, save_fn=save_fn, writer=writer, test_in_train=False) + + pprint.pprint(result) + watch() + + +if __name__ == '__main__': + test_c51(get_args()) diff --git a/tianshou/policy/__init__.py b/tianshou/policy/__init__.py index 456993d5d..9626d97eb 100644 --- a/tianshou/policy/__init__.py +++ b/tianshou/policy/__init__.py @@ -2,6 +2,7 @@ from tianshou.policy.random import RandomPolicy from tianshou.policy.imitation.base import ImitationPolicy from tianshou.policy.modelfree.dqn import DQNPolicy +from tianshou.policy.modelfree.c51 import C51Policy from tianshou.policy.modelfree.pg import PGPolicy from tianshou.policy.modelfree.a2c import A2CPolicy from tianshou.policy.modelfree.ddpg import DDPGPolicy @@ -18,6 +19,7 @@ "RandomPolicy", "ImitationPolicy", "DQNPolicy", + "C51Policy", "PGPolicy", "A2CPolicy", "DDPGPolicy", diff --git a/tianshou/policy/modelfree/c51.py b/tianshou/policy/modelfree/c51.py new file mode 100644 index 000000000..b2a64e8aa --- /dev/null +++ b/tianshou/policy/modelfree/c51.py @@ -0,0 +1,223 @@ +import torch +import numpy as np +from numba import njit +from typing import Any, Dict, Union, Optional, Tuple + +from tianshou.policy import DQNPolicy +from tianshou.data import Batch, ReplayBuffer, to_torch_as, to_numpy + + +class C51Policy(DQNPolicy): + """Implementation of Categorical Deep Q-network. arXiv:1707.06887. + + :param torch.nn.Module model: a model following the rules in + :class:`~tianshou.policy.BasePolicy`. (s -> logits) + :param torch.optim.Optimizer optim: a torch.optim for optimizing the model. + :param float discount_factor: in [0, 1]. + :param int num_atoms: the number of atoms in the support set of the + value distribution, defaults to 51. + :param float v_min: the value of the smallest atom in the support set, + defaults to -10.0. + :param float v_max: the value of the largest atom in the support set, + defaults to -10.0. + :param int estimation_step: greater than 1, the number of steps to look + ahead. + :param int target_update_freq: the target network update frequency (0 if + you do not use the target network). + :param bool reward_normalization: normalize the reward to Normal(0, 1), + defaults to False. + + .. seealso:: + + Please refer to :class:`~tianshou.policy.DQNPolicy` for more detailed + explanation. + """ + + def __init__( + self, + model: torch.nn.Module, + optim: torch.optim.Optimizer, + discount_factor: float = 0.99, + num_atoms: int = 51, + v_min: float = -10.0, + v_max: float = 10.0, + estimation_step: int = 1, + target_update_freq: int = 0, + reward_normalization: bool = False, + **kwargs: Any, + ) -> None: + super().__init__(model, optim, discount_factor, + estimation_step, target_update_freq, + reward_normalization, **kwargs) + self._num_atoms = num_atoms + self._v_min = v_min + self._v_max = v_max + self.device = model.device + self.support = torch.linspace(self._v_min, self._v_max, self._num_atoms, device=self.device) + self.delta_z = (v_max - v_min) / (num_atoms - 1) + + @staticmethod + def prepare_n_step( + batch: Batch, + buffer: ReplayBuffer, + indice: np.ndarray, + gamma: float = 0.99, + n_step: int = 1, + rew_norm: bool = False, + ) -> Batch: + """ Modify the obs_next, done and rew in batch for computing n-step + return in Distributional Q-learning based algorithms. + + :param batch: a data batch, which is equal to buffer[indice]. + :type batch: :class:`~tianshou.data.Batch` + :param buffer: a data buffer which contains several full-episode data + chronologically. + :type buffer: :class:`~tianshou.data.ReplayBuffer` + :param indice: sampled timestep. + :type indice: numpy.ndarray + :param float gamma: the discount factor, should be in [0, 1], defaults + to 0.99. + :param int n_step: the number of estimation step, should be an int + greater than 0, defaults to 1. + :param bool rew_norm: normalize the reward to Normal(0, 1), defaults + to False. + + :return: a Batch with modified obs_next, done and rew. + """ + buf_len = len(buffer) + if rew_norm: + bfr = buffer.rew[: min(buf_len, 1000)] # avoid large buffer + mean, std = bfr.mean(), bfr.std() + if np.isclose(std, 0, 1e-2): + mean, std = 0.0, 1.0 + else: + mean, std = 0.0, 1.0 + buffer_n = buffer[(indice + n_step - 1) % buf_len] + batch.obs_next = buffer_n.obs_next + rew_n, done_n = _nstep_batch(buffer.rew, buffer.done, + indice, gamma, n_step, buf_len, mean, std) + batch.rew = rew_n + batch.done = done_n + return batch + + def process_fn( + self, batch: Batch, buffer: ReplayBuffer, indice: np.ndarray + ) -> Batch: + """Prepare the batch for calculating the n-step return. + + More details can be found at + :meth:`~tianshou.policy.C51Policy.prepare_n_step`. + """ + batch = self.prepare_n_step( + batch, buffer, indice, + self._gamma, self._n_step, self._rew_norm) + return batch + + def forward( # type: ignore + self, + batch: Batch, + state: Optional[Union[dict, Batch, np.ndarray]] = None, + model: str = "model", + input: str = "obs", + **kwargs: Any, + ) -> Batch: + """Compute action over the given batch data. + + :return: A :class:`~tianshou.data.Batch` which has 2 keys: + + * ``act`` the action. + * ``state`` the hidden state. + + .. seealso:: + + Please refer to :meth:`~tianshou.policy.DQNPolicy.forward` for + more detailed explanation. + """ + model = getattr(self, model) + obs = batch[input] + obs_ = obs.obs if hasattr(obs, "obs") else obs + dist, h = model(obs_, state=state, info=batch.info) + q = (dist * self.support).sum(2) + act: np.ndarray = to_numpy(q.max(dim=1)[1]) + if hasattr(obs, "mask"): + # some of actions are masked, they cannot be selected + q_: np.ndarray = to_numpy(q) + q_[~obs.mask] = -np.inf + act = q_.argmax(axis=1) + # add eps to act in training or testing phase + if not self.updating and not np.isclose(self.eps, 0.0): + for i in range(len(q)): + if np.random.rand() < self.eps: + q_ = np.random.rand(*q[i].shape) + if hasattr(obs, "mask"): + q_[~obs.mask[i]] = -np.inf + act[i] = q_.argmax() + return Batch(logits=dist, act=act, state=h) + + def _target_dist( + self, batch: Batch + ) -> torch.Tensor: + if self._target: + a = self(batch, input="obs_next").act + next_dist = self( + batch, model="model_old", input="obs_next" + ).logits + else: + next_b = self(batch, input="obs_next") + a = next_b.act + next_dist = next_b.logits + batch_size = len(a) + next_dist = next_dist[np.arange(batch_size), a, :] + + reward = to_torch_as(batch.rew, next_dist).unsqueeze(1) + done = to_torch_as(batch.done, next_dist).unsqueeze(1) + + # Compute the projection of bellman update Tz onto the support z. + target_support = reward + (self._gamma ** self._n_step) * (1.0 - done) * self.support.unsqueeze(0) + target_support = target_support.clamp(self._v_min, self._v_max) + + # An amazing trick for calculating the projection gracefully. + # ref: https://github.com/ShangtongZhang/DeepRL + target_dist = (1 - (target_support.unsqueeze(1) - self.support.view(1, -1, 1)).abs() / self.delta_z + ).clamp(0, 1) * next_dist.unsqueeze(1) + target_dist = target_dist.sum(-1) + return target_dist + + def learn(self, batch: Batch, **kwargs: Any) -> Dict[str, float]: + if self._target and self._cnt % self._freq == 0: + self.sync_weight() + self.optim.zero_grad() + weight = batch.pop("weight", 1.0) + with torch.no_grad(): + target_dist = self._target_dist(batch) + curr_dist = self(batch).logits + act = batch.act + curr_dist = curr_dist[np.arange(len(act)), act, :] + cross_entropy = - (target_dist * torch.log(curr_dist + 1e-8)).sum(1) + loss = (cross_entropy * weight).mean() + batch.weight = cross_entropy.detach() # prio-buffer + loss.backward() + self.optim.step() + self._cnt += 1 + return {"loss": loss.item()} + + +@njit +def _nstep_batch( + rew: np.ndarray, + done: np.ndarray, + indice: np.ndarray, + gamma: float, + n_step: int, + buf_len: int, + mean: float, + std: float, +) -> Tuple[np.ndarray, np.ndarray]: + rew_n = np.zeros(indice.shape) + done_n = done[indice] + for n in range(n_step - 1, -1, -1): + now = (indice + n) % buf_len + done_t = done[now] + done_n = np.bitwise_or(done_n, done_t) + rew_n = (rew[now] - mean) / std + (1.0 - done_t) * gamma * rew_n + return rew_n, done_n diff --git a/tianshou/utils/net/discrete.py b/tianshou/utils/net/discrete.py index 0a8452ced..e989c908a 100644 --- a/tianshou/utils/net/discrete.py +++ b/tianshou/utils/net/discrete.py @@ -130,3 +130,75 @@ def forward( if not isinstance(x, torch.Tensor): x = to_torch(x, device=self.device, dtype=torch.float32) return self.net(x), state + + +class C51(nn.Module): + """Reference: A distributional perspective on reinforcement learning. + + For advanced usage (how to customize the network), please refer to + :ref:`build_the_network`. + """ + + def __init__( + self, + c: int, + h: int, + w: int, + action_shape: Sequence[int], + num_atoms: int, + device: Union[str, int, torch.device] = "cpu", + ) -> None: + super().__init__() + self.device = device + self.action_shape = action_shape + self.num_atoms = num_atoms + + def conv2d_size_out( + size: int, kernel_size: int = 5, stride: int = 2 + ) -> int: + return (size - (kernel_size - 1) - 1) // stride + 1 + + def conv2d_layers_size_out( + size: int, + kernel_size_1: int = 8, + stride_1: int = 4, + kernel_size_2: int = 4, + stride_2: int = 2, + kernel_size_3: int = 3, + stride_3: int = 1, + ) -> int: + size = conv2d_size_out(size, kernel_size_1, stride_1) + size = conv2d_size_out(size, kernel_size_2, stride_2) + size = conv2d_size_out(size, kernel_size_3, stride_3) + return size + + convw = conv2d_layers_size_out(w) + convh = conv2d_layers_size_out(h) + linear_input_size = convw * convh * 64 + + self.net = nn.Sequential( + nn.Conv2d(c, 32, kernel_size=8, stride=4), + nn.ReLU(inplace=True), + nn.Conv2d(32, 64, kernel_size=4, stride=2), + nn.ReLU(inplace=True), + nn.Conv2d(64, 64, kernel_size=3, stride=1), + nn.ReLU(inplace=True), + nn.Flatten(), + nn.Linear(linear_input_size, 512), + nn.ReLU(inplace=True), + nn.Linear(512, np.prod(action_shape) * num_atoms), + ) + + def forward( + self, + x: Union[np.ndarray, torch.Tensor], + state: Optional[Any] = None, + info: Dict[str, Any] = {}, + ) -> Tuple[torch.Tensor, Any]: + r"""Mapping: x -> Z(x, \*).""" + if not isinstance(x, torch.Tensor): + x = to_torch(x, device=self.device, dtype=torch.float32) + x = self.net(x) + x = x.view(-1, self.num_atoms).softmax(dim=-1).\ + view(-1, np.prod(self.action_shape), self.num_atoms) + return x, state From 64f42ceee854d31adc43aaa31851fa39effc8bb4 Mon Sep 17 00:00:00 2001 From: wizardsheng <45480804+shengxiang19@users.noreply.github.com> Date: Fri, 25 Dec 2020 16:14:16 +0800 Subject: [PATCH 02/26] fix PEP8 fail --- tianshou/policy/modelfree/c51.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tianshou/policy/modelfree/c51.py b/tianshou/policy/modelfree/c51.py index b2a64e8aa..6ace99bed 100644 --- a/tianshou/policy/modelfree/c51.py +++ b/tianshou/policy/modelfree/c51.py @@ -53,7 +53,8 @@ def __init__( self._v_min = v_min self._v_max = v_max self.device = model.device - self.support = torch.linspace(self._v_min, self._v_max, self._num_atoms, device=self.device) + self.support = torch.linspace(self._v_min, self._v_max, + self._num_atoms, device=self.device) self.delta_z = (v_max - v_min) / (num_atoms - 1) @staticmethod @@ -173,12 +174,14 @@ def _target_dist( done = to_torch_as(batch.done, next_dist).unsqueeze(1) # Compute the projection of bellman update Tz onto the support z. - target_support = reward + (self._gamma ** self._n_step) * (1.0 - done) * self.support.unsqueeze(0) + target_support = reward + (self._gamma ** self._n_step + ) * (1.0 - done) * self.support.unsqueeze(0) target_support = target_support.clamp(self._v_min, self._v_max) # An amazing trick for calculating the projection gracefully. # ref: https://github.com/ShangtongZhang/DeepRL - target_dist = (1 - (target_support.unsqueeze(1) - self.support.view(1, -1, 1)).abs() / self.delta_z + target_dist = (1 - (target_support.unsqueeze(1) - + self.support.view(1, -1, 1)).abs() / self.delta_z ).clamp(0, 1) * next_dist.unsqueeze(1) target_dist = target_dist.sum(-1) return target_dist From 8e905936ddbcd26f248458322be82a87122aebc6 Mon Sep 17 00:00:00 2001 From: wizardsheng <45480804+shengxiang19@users.noreply.github.com> Date: Fri, 25 Dec 2020 16:30:49 +0800 Subject: [PATCH 03/26] Update c51.py --- tianshou/policy/modelfree/c51.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tianshou/policy/modelfree/c51.py b/tianshou/policy/modelfree/c51.py index 6ace99bed..d8baadada 100644 --- a/tianshou/policy/modelfree/c51.py +++ b/tianshou/policy/modelfree/c51.py @@ -53,7 +53,7 @@ def __init__( self._v_min = v_min self._v_max = v_max self.device = model.device - self.support = torch.linspace(self._v_min, self._v_max, + self.support = torch.linspace(self._v_min, self._v_max, self._num_atoms, device=self.device) self.delta_z = (v_max - v_min) / (num_atoms - 1) @@ -174,13 +174,13 @@ def _target_dist( done = to_torch_as(batch.done, next_dist).unsqueeze(1) # Compute the projection of bellman update Tz onto the support z. - target_support = reward + (self._gamma ** self._n_step - ) * (1.0 - done) * self.support.unsqueeze(0) + target_support = reward + (self._gamma ** self._n_step) * \ + (1.0 - done) * self.support.unsqueeze(0) target_support = target_support.clamp(self._v_min, self._v_max) # An amazing trick for calculating the projection gracefully. # ref: https://github.com/ShangtongZhang/DeepRL - target_dist = (1 - (target_support.unsqueeze(1) - + target_dist = (1 - (target_support.unsqueeze(1) - self.support.view(1, -1, 1)).abs() / self.delta_z ).clamp(0, 1) * next_dist.unsqueeze(1) target_dist = target_dist.sum(-1) From da9e36935c50b57f5d272630dc2fd6de26d664a1 Mon Sep 17 00:00:00 2001 From: wizardsheng <45480804+shengxiang19@users.noreply.github.com> Date: Fri, 25 Dec 2020 16:36:29 +0800 Subject: [PATCH 04/26] Update c51.py --- tianshou/policy/modelfree/c51.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tianshou/policy/modelfree/c51.py b/tianshou/policy/modelfree/c51.py index d8baadada..1363ca420 100644 --- a/tianshou/policy/modelfree/c51.py +++ b/tianshou/policy/modelfree/c51.py @@ -174,8 +174,8 @@ def _target_dist( done = to_torch_as(batch.done, next_dist).unsqueeze(1) # Compute the projection of bellman update Tz onto the support z. - target_support = reward + (self._gamma ** self._n_step) * \ - (1.0 - done) * self.support.unsqueeze(0) + target_support = reward + (self._gamma ** self._n_step + ) * (1.0 - done) * self.support.unsqueeze(0) target_support = target_support.clamp(self._v_min, self._v_max) # An amazing trick for calculating the projection gracefully. From 8e82d7a42bb8b00ea5b7b4d419835b72653292f9 Mon Sep 17 00:00:00 2001 From: wizardsheng <45480804+shengxiang19@users.noreply.github.com> Date: Fri, 25 Dec 2020 17:13:02 +0800 Subject: [PATCH 05/26] Update c51.py --- tianshou/policy/modelfree/c51.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tianshou/policy/modelfree/c51.py b/tianshou/policy/modelfree/c51.py index 1363ca420..3dc193e21 100644 --- a/tianshou/policy/modelfree/c51.py +++ b/tianshou/policy/modelfree/c51.py @@ -114,7 +114,7 @@ def process_fn( self._gamma, self._n_step, self._rew_norm) return batch - def forward( # type: ignore + def forward( self, batch: Batch, state: Optional[Union[dict, Batch, np.ndarray]] = None, From 3abf81034907bd2ff972663e8da1220c91e6bb39 Mon Sep 17 00:00:00 2001 From: wizardsheng <45480804+shengxiang19@users.noreply.github.com> Date: Fri, 25 Dec 2020 19:11:35 +0800 Subject: [PATCH 06/26] Update c51.py --- tianshou/policy/modelfree/c51.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/tianshou/policy/modelfree/c51.py b/tianshou/policy/modelfree/c51.py index 3dc193e21..180decd0e 100644 --- a/tianshou/policy/modelfree/c51.py +++ b/tianshou/policy/modelfree/c51.py @@ -52,9 +52,8 @@ def __init__( self._num_atoms = num_atoms self._v_min = v_min self._v_max = v_max - self.device = model.device self.support = torch.linspace(self._v_min, self._v_max, - self._num_atoms, device=self.device) + self._num_atoms) self.delta_z = (v_max - v_min) / (num_atoms - 1) @staticmethod @@ -138,7 +137,7 @@ def forward( obs = batch[input] obs_ = obs.obs if hasattr(obs, "obs") else obs dist, h = model(obs_, state=state, info=batch.info) - q = (dist * self.support).sum(2) + q = (dist * to_torch_as(self.support, dist)).sum(2) act: np.ndarray = to_numpy(q.max(dim=1)[1]) if hasattr(obs, "mask"): # some of actions are masked, they cannot be selected @@ -169,19 +168,21 @@ def _target_dist( next_dist = next_b.logits batch_size = len(a) next_dist = next_dist[np.arange(batch_size), a, :] - - reward = to_torch_as(batch.rew, next_dist).unsqueeze(1) - done = to_torch_as(batch.done, next_dist).unsqueeze(1) + + device = next_dist.device + reward = torch.from_numpy(batch.rew).to(device).unsqueeze(1) + done = torch.from_numpy(batch.rew).to(device).float().unsqueeze(1) + support = self.support.to(device) # Compute the projection of bellman update Tz onto the support z. target_support = reward + (self._gamma ** self._n_step - ) * (1.0 - done) * self.support.unsqueeze(0) + ) * (1.0 - done) * support.unsqueeze(0) target_support = target_support.clamp(self._v_min, self._v_max) # An amazing trick for calculating the projection gracefully. # ref: https://github.com/ShangtongZhang/DeepRL target_dist = (1 - (target_support.unsqueeze(1) - - self.support.view(1, -1, 1)).abs() / self.delta_z + support.view(1, -1, 1)).abs() / self.delta_z ).clamp(0, 1) * next_dist.unsqueeze(1) target_dist = target_dist.sum(-1) return target_dist From 631c4610058b5e594d6bacedd15aec539cfab417 Mon Sep 17 00:00:00 2001 From: wizardsheng <45480804+shengxiang19@users.noreply.github.com> Date: Fri, 25 Dec 2020 19:16:07 +0800 Subject: [PATCH 07/26] Update c51.py --- tianshou/policy/modelfree/c51.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tianshou/policy/modelfree/c51.py b/tianshou/policy/modelfree/c51.py index 180decd0e..0603b5ba5 100644 --- a/tianshou/policy/modelfree/c51.py +++ b/tianshou/policy/modelfree/c51.py @@ -168,7 +168,6 @@ def _target_dist( next_dist = next_b.logits batch_size = len(a) next_dist = next_dist[np.arange(batch_size), a, :] - device = next_dist.device reward = torch.from_numpy(batch.rew).to(device).unsqueeze(1) done = torch.from_numpy(batch.rew).to(device).float().unsqueeze(1) From 2b43654da6eb1b8f4ed276d6013d0a144f4a0db9 Mon Sep 17 00:00:00 2001 From: wizardsheng <45480804+shengxiang19@users.noreply.github.com> Date: Fri, 25 Dec 2020 19:21:42 +0800 Subject: [PATCH 08/26] Update c51.py --- tianshou/policy/modelfree/c51.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tianshou/policy/modelfree/c51.py b/tianshou/policy/modelfree/c51.py index 0603b5ba5..5261699dd 100644 --- a/tianshou/policy/modelfree/c51.py +++ b/tianshou/policy/modelfree/c51.py @@ -65,8 +65,7 @@ def prepare_n_step( n_step: int = 1, rew_norm: bool = False, ) -> Batch: - """ Modify the obs_next, done and rew in batch for computing n-step - return in Distributional Q-learning based algorithms. + """ Modify the obs_next, done and rew in batch for computing n-step return. :param batch: a data batch, which is equal to buffer[indice]. :type batch: :class:`~tianshou.data.Batch` From b0e73176efd800aef75add34b79958352bd98903 Mon Sep 17 00:00:00 2001 From: wizardsheng <45480804+shengxiang19@users.noreply.github.com> Date: Fri, 25 Dec 2020 19:27:24 +0800 Subject: [PATCH 09/26] Update c51.py --- tianshou/policy/modelfree/c51.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tianshou/policy/modelfree/c51.py b/tianshou/policy/modelfree/c51.py index 5261699dd..ea20dddeb 100644 --- a/tianshou/policy/modelfree/c51.py +++ b/tianshou/policy/modelfree/c51.py @@ -65,7 +65,7 @@ def prepare_n_step( n_step: int = 1, rew_norm: bool = False, ) -> Batch: - """ Modify the obs_next, done and rew in batch for computing n-step return. + r""" Modify the obs_next, done and rew in batch for computing n-step return. :param batch: a data batch, which is equal to buffer[indice]. :type batch: :class:`~tianshou.data.Batch` From 3d96e3b9d8a111e3533c6f5fb18276640cd5f933 Mon Sep 17 00:00:00 2001 From: wizardsheng <45480804+shengxiang19@users.noreply.github.com> Date: Fri, 25 Dec 2020 19:34:25 +0800 Subject: [PATCH 10/26] Update c51.py --- tianshou/policy/modelfree/c51.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tianshou/policy/modelfree/c51.py b/tianshou/policy/modelfree/c51.py index ea20dddeb..767115edf 100644 --- a/tianshou/policy/modelfree/c51.py +++ b/tianshou/policy/modelfree/c51.py @@ -65,7 +65,7 @@ def prepare_n_step( n_step: int = 1, rew_norm: bool = False, ) -> Batch: - r""" Modify the obs_next, done and rew in batch for computing n-step return. + """Modify the obs_next, done and rew in batch for computing n-step return. :param batch: a data batch, which is equal to buffer[indice]. :type batch: :class:`~tianshou.data.Batch` From 6688aefab40d34fe2ec60a8a4ce830afcf7f8501 Mon Sep 17 00:00:00 2001 From: Trinkle23897 Date: Fri, 25 Dec 2020 21:11:30 +0800 Subject: [PATCH 11/26] simplify C51 network; modify readme --- README.md | 1 + docs/index.rst | 1 + tianshou/policy/modelfree/c51.py | 10 +++---- tianshou/utils/net/discrete.py | 49 ++++---------------------------- 4 files changed, 11 insertions(+), 50 deletions(-) diff --git a/README.md b/README.md index 21e8cdbc7..833a8562a 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,7 @@ - [Deep Q-Network (DQN)](https://storage.googleapis.com/deepmind-media/dqn/DQNNaturePaper.pdf) - [Double DQN](https://arxiv.org/pdf/1509.06461.pdf) - [Dueling DQN](https://arxiv.org/pdf/1511.06581.pdf) +- [C51](https://arxiv.org/pdf/1707.06887.pdf) - [Advantage Actor-Critic (A2C)](https://openai.com/blog/baselines-acktr-a2c/) - [Deep Deterministic Policy Gradient (DDPG)](https://arxiv.org/pdf/1509.02971.pdf) - [Proximal Policy Optimization (PPO)](https://arxiv.org/pdf/1707.06347.pdf) diff --git a/docs/index.rst b/docs/index.rst index b7e65998c..3b1fe023c 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -13,6 +13,7 @@ Welcome to Tianshou! * :class:`~tianshou.policy.DQNPolicy` `Deep Q-Network `_ * :class:`~tianshou.policy.DQNPolicy` `Double DQN `_ * :class:`~tianshou.policy.DQNPolicy` `Dueling DQN `_ +* :class:`~tianshou.policy.C51Policy` `C51 `_ * :class:`~tianshou.policy.A2CPolicy` `Advantage Actor-Critic `_ * :class:`~tianshou.policy.DDPGPolicy` `Deep Deterministic Policy Gradient `_ * :class:`~tianshou.policy.PPOPolicy` `Proximal Policy Optimization `_ diff --git a/tianshou/policy/modelfree/c51.py b/tianshou/policy/modelfree/c51.py index 767115edf..165b272fe 100644 --- a/tianshou/policy/modelfree/c51.py +++ b/tianshou/policy/modelfree/c51.py @@ -8,7 +8,7 @@ class C51Policy(DQNPolicy): - """Implementation of Categorical Deep Q-network. arXiv:1707.06887. + """Implementation of Categorical Deep Q-Network. arXiv:1707.06887. :param torch.nn.Module model: a model following the rules in :class:`~tianshou.policy.BasePolicy`. (s -> logits) @@ -153,9 +153,7 @@ def forward( act[i] = q_.argmax() return Batch(logits=dist, act=act, state=h) - def _target_dist( - self, batch: Batch - ) -> torch.Tensor: + def _target_dist(self, batch: Batch) -> torch.Tensor: if self._target: a = self(batch, input="obs_next").act next_dist = self( @@ -173,8 +171,8 @@ def _target_dist( support = self.support.to(device) # Compute the projection of bellman update Tz onto the support z. - target_support = reward + (self._gamma ** self._n_step - ) * (1.0 - done) * support.unsqueeze(0) + target_support = reward + ( + self._gamma ** self._n_step) * (1.0 - done) * support.unsqueeze(0) target_support = target_support.clamp(self._v_min, self._v_max) # An amazing trick for calculating the projection gracefully. diff --git a/tianshou/utils/net/discrete.py b/tianshou/utils/net/discrete.py index e989c908a..826b067b3 100644 --- a/tianshou/utils/net/discrete.py +++ b/tianshou/utils/net/discrete.py @@ -132,7 +132,7 @@ def forward( return self.net(x), state -class C51(nn.Module): +class C51(DQN): """Reference: A distributional perspective on reinforcement learning. For advanced usage (how to customize the network), please refer to @@ -148,47 +148,10 @@ def __init__( num_atoms: int, device: Union[str, int, torch.device] = "cpu", ) -> None: - super().__init__() - self.device = device + super().__init__(c, h, w, [np.prod(action_shape) * num_atoms], device) self.action_shape = action_shape self.num_atoms = num_atoms - def conv2d_size_out( - size: int, kernel_size: int = 5, stride: int = 2 - ) -> int: - return (size - (kernel_size - 1) - 1) // stride + 1 - - def conv2d_layers_size_out( - size: int, - kernel_size_1: int = 8, - stride_1: int = 4, - kernel_size_2: int = 4, - stride_2: int = 2, - kernel_size_3: int = 3, - stride_3: int = 1, - ) -> int: - size = conv2d_size_out(size, kernel_size_1, stride_1) - size = conv2d_size_out(size, kernel_size_2, stride_2) - size = conv2d_size_out(size, kernel_size_3, stride_3) - return size - - convw = conv2d_layers_size_out(w) - convh = conv2d_layers_size_out(h) - linear_input_size = convw * convh * 64 - - self.net = nn.Sequential( - nn.Conv2d(c, 32, kernel_size=8, stride=4), - nn.ReLU(inplace=True), - nn.Conv2d(32, 64, kernel_size=4, stride=2), - nn.ReLU(inplace=True), - nn.Conv2d(64, 64, kernel_size=3, stride=1), - nn.ReLU(inplace=True), - nn.Flatten(), - nn.Linear(linear_input_size, 512), - nn.ReLU(inplace=True), - nn.Linear(512, np.prod(action_shape) * num_atoms), - ) - def forward( self, x: Union[np.ndarray, torch.Tensor], @@ -196,9 +159,7 @@ def forward( info: Dict[str, Any] = {}, ) -> Tuple[torch.Tensor, Any]: r"""Mapping: x -> Z(x, \*).""" - if not isinstance(x, torch.Tensor): - x = to_torch(x, device=self.device, dtype=torch.float32) - x = self.net(x) - x = x.view(-1, self.num_atoms).softmax(dim=-1).\ - view(-1, np.prod(self.action_shape), self.num_atoms) + x, state = super().forward(x) + x = x.view(-1, self.num_atoms).softmax(dim=-1) + x = x.view(-1, np.prod(self.action_shape), self.num_atoms) return x, state From a4e8750ef5f4dbe3558680eec9c29751bac795e2 Mon Sep 17 00:00:00 2001 From: wizardsheng <45480804+shengxiang19@users.noreply.github.com> Date: Sat, 26 Dec 2020 13:39:15 +0800 Subject: [PATCH 12/26] Update c51.py --- tianshou/policy/modelfree/c51.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tianshou/policy/modelfree/c51.py b/tianshou/policy/modelfree/c51.py index 165b272fe..a181f7e62 100644 --- a/tianshou/policy/modelfree/c51.py +++ b/tianshou/policy/modelfree/c51.py @@ -167,7 +167,7 @@ def _target_dist(self, batch: Batch) -> torch.Tensor: next_dist = next_dist[np.arange(batch_size), a, :] device = next_dist.device reward = torch.from_numpy(batch.rew).to(device).unsqueeze(1) - done = torch.from_numpy(batch.rew).to(device).float().unsqueeze(1) + done = torch.from_numpy(batch.done).to(device).float().unsqueeze(1) support = self.support.to(device) # Compute the projection of bellman update Tz onto the support z. From e02dbc32e2bedee5ae43f7273aa7e67a5eb430de Mon Sep 17 00:00:00 2001 From: shengxiang19 <1228205102@qq.com> Date: Sat, 26 Dec 2020 14:36:35 +0800 Subject: [PATCH 13/26] add test_c51 --- test/discrete/test_c51.py | 135 +++++++++++++++++++++++++++++++++++ tianshou/utils/net/common.py | 61 +++++++++++++++- 2 files changed, 193 insertions(+), 3 deletions(-) create mode 100644 test/discrete/test_c51.py diff --git a/test/discrete/test_c51.py b/test/discrete/test_c51.py new file mode 100644 index 000000000..b4353e148 --- /dev/null +++ b/test/discrete/test_c51.py @@ -0,0 +1,135 @@ +import os +import gym +import torch +import pprint +import argparse +import numpy as np +from torch.utils.tensorboard import SummaryWriter + +from tianshou.policy import C51Policy +from tianshou.env import DummyVectorEnv +from tianshou.utils.net.common import CategoricalNet +from tianshou.trainer import offpolicy_trainer +from tianshou.data import Collector, ReplayBuffer, PrioritizedReplayBuffer + + +def get_args(): + parser = argparse.ArgumentParser() + parser.add_argument('--task', type=str, default='CartPole-v0') + parser.add_argument('--seed', type=int, default=1626) + parser.add_argument('--eps-test', type=float, default=0.05) + parser.add_argument('--eps-train', type=float, default=0.1) + parser.add_argument('--buffer-size', type=int, default=20000) + parser.add_argument('--lr', type=float, default=1e-3) + parser.add_argument('--gamma', type=float, default=0.9) + parser.add_argument('--num-atoms', type=int, default=51) + parser.add_argument('--v-min', type=float, default=-10.) + parser.add_argument('--v-max', type=float, default=10.) + parser.add_argument('--n-step', type=int, default=3) + parser.add_argument('--target-update-freq', type=int, default=320) + parser.add_argument('--epoch', type=int, default=10) + parser.add_argument('--step-per-epoch', type=int, default=1000) + parser.add_argument('--collect-per-step', type=int, default=10) + parser.add_argument('--batch-size', type=int, default=64) + parser.add_argument('--layer-num', type=int, default=3) + parser.add_argument('--training-num', type=int, default=8) + parser.add_argument('--test-num', type=int, default=100) + parser.add_argument('--logdir', type=str, default='log') + parser.add_argument('--render', type=float, default=0.) + parser.add_argument('--prioritized-replay', type=int, default=0) + parser.add_argument('--alpha', type=float, default=0.6) + parser.add_argument('--beta', type=float, default=0.4) + parser.add_argument( + '--device', type=str, + default='cuda' if torch.cuda.is_available() else 'cpu') + args = parser.parse_known_args()[0] + return args + + +def test_c51(args=get_args()): + env = gym.make(args.task) + args.state_shape = env.observation_space.shape or env.observation_space.n + args.action_shape = env.action_space.shape or env.action_space.n + # train_envs = gym.make(args.task) + # you can also use tianshou.env.SubprocVectorEnv + train_envs = DummyVectorEnv( + [lambda: gym.make(args.task) for _ in range(args.training_num)]) + # test_envs = gym.make(args.task) + test_envs = DummyVectorEnv( + [lambda: gym.make(args.task) for _ in range(args.test_num)]) + # seed + np.random.seed(args.seed) + torch.manual_seed(args.seed) + train_envs.seed(args.seed) + test_envs.seed(args.seed) + # model + net = CategoricalNet(args.layer_num, args.state_shape, + args.action_shape, args.device, # dueling=(1, 1) + num_atoms=args.num_atoms).to(args.device) + optim = torch.optim.Adam(net.parameters(), lr=args.lr) + policy = C51Policy(net, optim, args.gamma, args.num_atoms, + args.v_min, args.v_max, args.n_step, + target_update_freq=args.target_update_freq) + # buffer + if args.prioritized_replay > 0: + buf = PrioritizedReplayBuffer( + args.buffer_size, alpha=args.alpha, beta=args.beta) + else: + buf = ReplayBuffer(args.buffer_size) + # collector + train_collector = Collector(policy, train_envs, buf) + test_collector = Collector(policy, test_envs) + # policy.set_eps(1) + train_collector.collect(n_step=args.batch_size) + # log + log_path = os.path.join(args.logdir, args.task, 'c51') + writer = SummaryWriter(log_path) + + def save_fn(policy): + torch.save(policy.state_dict(), os.path.join(log_path, 'policy.pth')) + + def stop_fn(mean_rewards): + return mean_rewards >= env.spec.reward_threshold + + def train_fn(epoch, env_step): + # eps annnealing, just a demo + if env_step <= 10000: + policy.set_eps(args.eps_train) + elif env_step <= 50000: + eps = args.eps_train - (env_step - 10000) / \ + 40000 * (0.9 * args.eps_train) + policy.set_eps(eps) + else: + policy.set_eps(0.1 * args.eps_train) + + def test_fn(epoch, env_step): + policy.set_eps(args.eps_test) + + # trainer + result = offpolicy_trainer( + policy, train_collector, test_collector, args.epoch, + args.step_per_epoch, args.collect_per_step, args.test_num, + args.batch_size, train_fn=train_fn, test_fn=test_fn, + stop_fn=stop_fn, save_fn=save_fn, writer=writer) + + assert stop_fn(result['best_reward']) + if __name__ == '__main__': + pprint.pprint(result) + # Let's watch its performance! + env = gym.make(args.task) + policy.eval() + policy.set_eps(args.eps_test) + collector = Collector(policy, env) + result = collector.collect(n_episode=1, render=args.render) + print(f'Final reward: {result["rew"]}, length: {result["len"]}') + + +def test_pdqn(args=get_args()): + args.prioritized_replay = 1 + args.gamma = .95 + args.seed = 1 + test_c51(args) + + +if __name__ == '__main__': + test_c51(get_args()) diff --git a/tianshou/utils/net/common.py b/tianshou/utils/net/common.py index 8b52a87a0..12130e96b 100644 --- a/tianshou/utils/net/common.py +++ b/tianshou/utils/net/common.py @@ -32,6 +32,8 @@ class Net(nn.Module): (for Dueling DQN), defaults to False. :param norm_layer: use which normalization before ReLU, e.g., ``nn.LayerNorm`` and ``nn.BatchNorm1d``, defaults to None. + :param int num_atoms: in order to expand to the net of distributional RL, + defaults to 1. """ def __init__( @@ -45,6 +47,7 @@ def __init__( hidden_layer_size: int = 128, dueling: Optional[Tuple[int, int]] = None, norm_layer: Optional[Callable[[int], nn.modules.Module]] = None, + num_atoms: int = 1, ) -> None: super().__init__() self.device = device @@ -62,7 +65,7 @@ def __init__( if dueling is None: if action_shape and not concat: - model += [nn.Linear(hidden_layer_size, np.prod(action_shape))] + model += [nn.Linear(hidden_layer_size, num_atoms * np.prod(action_shape))] else: # dueling DQN q_layer_num, v_layer_num = dueling Q, V = [], [] @@ -75,8 +78,8 @@ def __init__( hidden_layer_size, hidden_layer_size, norm_layer) if action_shape and not concat: - Q += [nn.Linear(hidden_layer_size, np.prod(action_shape))] - V += [nn.Linear(hidden_layer_size, 1)] + Q += [nn.Linear(hidden_layer_size, num_atoms * np.prod(action_shape))] + V += [nn.Linear(hidden_layer_size, num_atoms)] self.Q = nn.Sequential(*Q) self.V = nn.Sequential(*V) @@ -159,3 +162,55 @@ def forward( # please ensure the first dim is batch size: [bsz, len, ...] return s, {"h": h.transpose(0, 1).detach(), "c": c.transpose(0, 1).detach()} + + +class CategoricalNet(Net): + """Simple MLP backbone. + + For advanced usage (how to customize the network), please refer to + :ref:`build_the_network`. + + .. seealso:: + + Please refer to :class:`~tianshou.utils.net.common.Net` for + more detailed explanation. + """ + + def __init__( + self, + layer_num: int, + state_shape: tuple, + action_shape: Optional[Union[tuple, int]] = 0, + device: Union[str, int, torch.device] = "cpu", + concat: bool = False, + hidden_layer_size: int = 128, + dueling: Optional[Tuple[int, int]] = None, + norm_layer: Optional[Callable[[int], nn.modules.Module]] = None, + num_atoms: int = 51, + ) -> None: + super().__init__(layer_num, state_shape, action_shape, + device, True, concat, hidden_layer_size, + dueling, norm_layer, num_atoms) + self.action_shape = action_shape + self.num_atoms = num_atoms + + def forward( + self, + s: Union[np.ndarray, torch.Tensor], + state: Optional[Dict[str, torch.Tensor]] = None, + info: Dict[str, Any] = {}, + ) -> Tuple[torch.Tensor, Dict[str, torch.Tensor]]: + """Mapping: s -> flatten -> logits.""" + s = to_torch(s, device=self.device, dtype=torch.float32) + s = s.reshape(s.size(0), -1) + logits = self.model(s) + if self.dueling is not None: # Dueling DQN + q, v = self.Q(logits), self.V(logits) + v = v.view(-1, 1, self.num_atoms), + q = q.view(-1, np.prod(self.action_shape), self.num_atoms) + logits = q - q.mean(dim=1, keepdim=True) + v + else: + logits = logits.view(-1, np.prod(self.action_shape), self.num_atoms) + logits = torch.softmax(logits, dim=-1) + return logits, state + From 489ecaa641c2e28315b00e4e3dff00f83dab7cf4 Mon Sep 17 00:00:00 2001 From: wizardsheng <45480804+shengxiang19@users.noreply.github.com> Date: Sat, 26 Dec 2020 14:45:30 +0800 Subject: [PATCH 14/26] Update common.py --- tianshou/utils/net/common.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tianshou/utils/net/common.py b/tianshou/utils/net/common.py index 12130e96b..afde5f3f9 100644 --- a/tianshou/utils/net/common.py +++ b/tianshou/utils/net/common.py @@ -65,7 +65,8 @@ def __init__( if dueling is None: if action_shape and not concat: - model += [nn.Linear(hidden_layer_size, num_atoms * np.prod(action_shape))] + model += [nn.Linear( + hidden_layer_size, num_atoms * np.prod(action_shape))] else: # dueling DQN q_layer_num, v_layer_num = dueling Q, V = [], [] @@ -78,7 +79,8 @@ def __init__( hidden_layer_size, hidden_layer_size, norm_layer) if action_shape and not concat: - Q += [nn.Linear(hidden_layer_size, num_atoms * np.prod(action_shape))] + Q += [nn.Linear( + hidden_layer_size, num_atoms * np.prod(action_shape))] V += [nn.Linear(hidden_layer_size, num_atoms)] self.Q = nn.Sequential(*Q) @@ -210,7 +212,7 @@ def forward( q = q.view(-1, np.prod(self.action_shape), self.num_atoms) logits = q - q.mean(dim=1, keepdim=True) + v else: - logits = logits.view(-1, np.prod(self.action_shape), self.num_atoms) + logits = logits.view( + -1, np.prod(self.action_shape), self.num_atoms) logits = torch.softmax(logits, dim=-1) return logits, state - From 0505b163dfe9c0d6e685ec23c6852c71dfab124f Mon Sep 17 00:00:00 2001 From: wizardsheng <45480804+shengxiang19@users.noreply.github.com> Date: Sat, 26 Dec 2020 15:09:33 +0800 Subject: [PATCH 15/26] Update test_c51.py fix bugs in pc51 --- test/discrete/test_c51.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/discrete/test_c51.py b/test/discrete/test_c51.py index b4353e148..eff2c898f 100644 --- a/test/discrete/test_c51.py +++ b/test/discrete/test_c51.py @@ -124,7 +124,7 @@ def test_fn(epoch, env_step): print(f'Final reward: {result["rew"]}, length: {result["len"]}') -def test_pdqn(args=get_args()): +def test_pc51(args=get_args()): args.prioritized_replay = 1 args.gamma = .95 args.seed = 1 From ca130049c3893c1b2a03de0c9d9f2cc20ac94886 Mon Sep 17 00:00:00 2001 From: wizardsheng <45480804+shengxiang19@users.noreply.github.com> Date: Sat, 26 Dec 2020 15:10:59 +0800 Subject: [PATCH 16/26] fix bugs in pc51 --- tianshou/policy/modelfree/c51.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tianshou/policy/modelfree/c51.py b/tianshou/policy/modelfree/c51.py index a181f7e62..f0e8593b9 100644 --- a/tianshou/policy/modelfree/c51.py +++ b/tianshou/policy/modelfree/c51.py @@ -181,15 +181,17 @@ def _target_dist(self, batch: Batch) -> torch.Tensor: support.view(1, -1, 1)).abs() / self.delta_z ).clamp(0, 1) * next_dist.unsqueeze(1) target_dist = target_dist.sum(-1) + if hasattr(batch, "weight"): # prio buffer update + batch.weight = to_torch_as(batch.weight, target_dist) return target_dist def learn(self, batch: Batch, **kwargs: Any) -> Dict[str, float]: if self._target and self._cnt % self._freq == 0: self.sync_weight() self.optim.zero_grad() - weight = batch.pop("weight", 1.0) with torch.no_grad(): target_dist = self._target_dist(batch) + weight = batch.pop("weight", 1.0) curr_dist = self(batch).logits act = batch.act curr_dist = curr_dist[np.arange(len(act)), act, :] From 3c6c4a7244f264b95c2d7ffd641f4d6a55ecaff7 Mon Sep 17 00:00:00 2001 From: shengxiang19 <1228205102@qq.com> Date: Sun, 27 Dec 2020 20:48:08 +0800 Subject: [PATCH 17/26] add c51 atari results --- examples/atari/README.md | 10 ++++++++++ examples/atari/results/c51/Breakout_rew.PNG | Bin 0 -> 71297 bytes examples/atari/results/c51/Enduro_rew.PNG | Bin 0 -> 61608 bytes examples/atari/results/c51/Pong_rew.PNG | Bin 0 -> 38824 bytes 4 files changed, 10 insertions(+) create mode 100644 examples/atari/results/c51/Breakout_rew.PNG create mode 100644 examples/atari/results/c51/Enduro_rew.PNG create mode 100644 examples/atari/results/c51/Pong_rew.PNG diff --git a/examples/atari/README.md b/examples/atari/README.md index 474f74c42..7fd8e4683 100644 --- a/examples/atari/README.md +++ b/examples/atari/README.md @@ -23,3 +23,13 @@ One epoch here is equal to 100,000 env step, 100 epochs stand for 10M. Note: The `eps_train_final` and `eps_test` in the original DQN paper is 0.1 and 0.01, but [some works](https://github.com/google/dopamine/tree/master/baselines) found that smaller eps helps improve the performance. Also, a large batchsize (say 64 instead of 32) will help faster convergence but will slow down the training speed. We haven't tuned this result to the best, so have fun with playing these hyperparameters! + +# C51 (single run) + +One epoch here is equal to 100,000 env step, 100 epochs stand for 10M. + +| task | best reward | reward curve | parameters | +| --------------------------- | ----------- | ------------------------------------- | ------------------------------------------------------------ | +| PongNoFrameskip-v4 | 20 | ![](results/c51/Pong_rew.png) | `python3 atari_c51.py --task "PongNoFrameskip-v4" --batch-size 64` | +| BreakoutNoFrameskip-v4 | 536.6 | ![](results/c51/Breakout_rew.png) | `python3 atari_c51.py --task "BreakoutNoFrameskip-v4" --n-step 1` | +| EnduroNoFrameskip-v4 | 1032 | ![](results/c51/Enduro_rew.png) | `python3 atari_c51.py --task "EnduroNoFrameskip-v4 " --test-num 100` | diff --git a/examples/atari/results/c51/Breakout_rew.PNG b/examples/atari/results/c51/Breakout_rew.PNG new file mode 100644 index 0000000000000000000000000000000000000000..6b510a04f5df1856552d4a396fdb794ecdf488cb GIT binary patch literal 71297 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 C*PAy0 literal 0 HcmV?d00001 diff --git a/examples/atari/results/c51/Enduro_rew.PNG b/examples/atari/results/c51/Enduro_rew.PNG new file mode 100644 index 0000000000000000000000000000000000000000..0e08380a135bae2b10690c5d781977a32fe1d3d5 GIT binary patch literal 61608 zcmce;XCR#0`aY}^ohTzZNf32HFgi()DoPTGP7u+184MA-~RG`P-Z;VTKB!~c3taU6aL`71`Xu}N&*4`np>JTbO;DY zR|yCRYbeNocMc6kr-2`Yt~wfO1jYRvYrqQNqt3$fvc}z6Bq)d#Pdg>6! zhAet0N-ClA#WONC6*WdiqInXER|NA6vy=k$m|3Y=D4a%$V%1@F8#neETC%;qUi7i| zBk=WbK-~Q1Z&Qrk+9H9!9U`cCU(u^k{J(GCX-R$l^pb)%kLW?Rz%P$nA^5jP zjwlbJqob|Hi;Y&kzZJGZZ%$g_&v5o6;T(NAhz-q(1dGQF4I zKJJYaZ+w1&-m>*S$mLEs!(r1jV!2X+saR8sjp|bK^DjH%hH^F1y11ad=Z^^6kHw5? zlTS{3P>TOg)}K=AY%MXZju$;yROn>ChCkUTf#$BZbVRcDiTm$Txo%E?2Qs}^*j$hI zEcfSHh_#CFEp+~-(vGv6qEs#ZJ991hm6boBTL07^@SC3e6H=e3^w1sJ3l}cb5A8Sj z9A4cR`@C=05y70PLdU>WXqyQ;^G0183yf2?{LZxhO(4tbCGJy6$~TZJwj zR|3O*vevYH?I3VJeJ8O+(0iiZd%wO3*`FZ^!@?2urw6d3HtzbN!(XB z#+Ikv+5)pZv$C9If>!V0mUU`2_+U`&VAUPRyYjhu_C=4@uL8sc5GktMPD8=)*p<1K zpjl{MC7aaq2k`Ersi~*??dP?UO>pav?K@1tsb@{NYP?nc{fza7UyUT}QmG1lb%N0>hQyEzi2}N8GbvK1ZsquI1jC8P5iW{nivo>s~GYz1OtxU$#a~lO<4z zRa8`TmcpB1<=iiSW6T^R`gJ4KB0~S=9UVf!!C%$M3<&niF#q8ZmA5K*V5cQ*$3$E= z#zc|7Jg>G8UZR2+95kJU;r+^?7zbo{j9^u?dl`+LaK`me+7vBi+^Cd{j6B^h|Hh~# zckVX_X$zrQVQo4JW`nroK|Ht9k+6f+_{k<%)01k4j2gGK1myW0uCvzyTB*7p?pJO8it zR#sMKqD~GstQI??SDFKfXRElBe4hhOX|X-quu-|_c<1iy>FSWHgdYZd&A zCn80>@u>9_hDYG7jr|TEmfORnwVuPaD#!0O`Qv(9gQ@xkU}wPg?OQo|pW>A9NPIG| zxYXGOXd3yRFdu_p@KacnqDEG#L(%vzXadM%vWpM|1Q&I{a6KHL~j z`)Pc$)^1xdKZ4)h<#y#8}wqX=h2Fv)Z; zpN%)2Ro+YQ>~@LDOd8supW_XXxpvLl95ej>j-v97L*oV?@2$!1Y3bn~r^f>@G#3#; zQ~+x1bDBT}em@H@1;uP1o+gQ#NV~4|?kb(%FlV1gByjd?eRXa-gL&1msq{0eu~*BT zK;pPut_=$}g?8_-1CX||*N*9aujGIiyzA;upY44s{J7rzm#`5hc<$ohbuWz<$;xND zu`5ky8%@1Gzxfc!-q=Lo&oIU(Y=mbLM7Z7*$-bu3o+dANFb;vo!tN!B87XLUE)+jc~ zPH42$HO-gUH?GGqBiW%3h9`Di<@UO)? z2qevM(0S<9n3px*}H<`Qx&&6*JCrHDH$YwEU%WjK7^MRCG?wiC)}MfQvF@MDg@ zKnZT9-mg`mlZg1aHCYl-aY>=%n$|&~ggT}y-a95fYnM=F1iwTW9m+412Xpgnp_vcF zOfS~vWisq=^{B*!&e6;(8G#1WSE?-8Q<`J-M=_kGv(q0bVFK`Qy`L8>tJ?>bXPD|MWw+F!LvJL4@)0xY=GJ+4|7k*Y!nG6|rGqpd?uZA0=x8O))hUjz!?_pmce{ORQ zg}6NkyT1ePa7%W!72U$LdTZgGN(r~eUAMNFa0j(W z;)~i3I0k>8jDMxUL>~U7neCTs{C@A0SQ zG|=U%Xfe`}`rt|}a@c_-ov*S`OCaqa{Cyr-wRKxK>50F%oVDdS<{)e8FWAgX7}s>8 z8IIe-`B%yQ=TKt##ld`oP53*=qMxz}G*$l`%-Cz+8ICUf2GQjBlgiOb$wZ2`6qr^I zf9eQO`@M;nbGKNS$Pa!~Ll6qQDQS#*5J&WP?BiSe>uuEPPQ3T#0{t# zP}Jp3KM7Kw1TVqCjZi>CfQV_OoaYln1Zh`8e>a0KJKy#J$<@)RigfK+20v$DHown2t_}@dhY7~K3d}d9M_i!GhW4| z8*O*qMDn}^oaX<$I+BHJb|XYsR{jy;yR#sUi}-qpk7-8eZrZ;&PR@KLb4eXu%6-3P zsF4d3Xj{bLZL#B!1oQWe0c>M)VCxHelQXT3&EN1yK8LS-AN|hajTVg z)UK*0#(Myw`5thEe}u&U<)2}iTDJV&Gf<_)3&I-xAdbs;g|ML@a`V44#6*2}#CSOw z`^eM_6HmY1#$q0b#ZD&uF|wuYa@}cKtUP(4)ZcJWh8_WfU7s})Y-88JCKl?siKUE} zBpcv*fdOltdA}Pk_sB392QM^ngLop?rMI?md*Y>Xlb;!#{y$|X80*DaibL@x*o+9 zfsf9N>R_t-15_jAQ-@Xl8ytBFKzRE-hSi>fa^DTiya*HyCqF$6NC%hgx?WwRiXi?y zcsbqZ?%sR7joJGFMdMmT(SE_*7lL+q2(heE`1(?pk4BC|Ai%I+{S60E8}2Yvv_@!c zI3gTPtPqdGiojlIqzArrDT|zMQ;R}q^L4`C3B!SUVESUz4>*QO9geZJn#3^k*-~%g z6K0x(t<(8=SYzOaWVjB9=93zKrNi7A$KIK=S%bf^PXRzOtk^zD27mrMR{f&(Q1s)b zVuT~Lm=s>&`B%qrKkO|ekEP{lDEhP{bH2gy|8D0L1tpa^Yve}h{G<^Dt)V#|ncHQ^ zPzH_|Q9Hndf0nh9YmB?+ zhvOVKha3B^T?6olqC*HRr_DA3Hg^m#L47&FJ-v&uiuRelIgw9l%s<<_WuWxVRw-fs z%e^NtR4}_a5(x8%VIr4)g7`|8o_qDEa}GkflEoTw+Exr(iF1wnGK7Udw>3O5vseFY zRfZmcjm6vf$1d%%u8ZoQZES47w&M;`x*z({?H&||#N^bH0LnWgIX>QJNn;is^V;|^ z${}shc~=@>x;$zE+xj{plNzdgfiyt#mlXz4%yvc28jz3pI|_-%FvlDH+HAfSrAt{& zzEcpjJ$IA3v;MdJs^2>el)oSwQB?o3?>%CJDEMOwkFDvA*~$1_NvmE-Pn18h(tfsn zrV=zD<3G(bGCJ|h>TZ^8u}O)$XeWn)SG$ObLkISMEQ?3)x>T@}sG;Jxs^({=409*& zF*5l5`7P<4q&Kl4P;`CUtnaidP>2503juxkW43WtT`@D;oa?IR9;d!=aMK_ntpQ5sCFFQY z;uA1*2r!VSi-Q*46~}?%UbS0Ol|6Qd#+m6l&)EDyX}gKJa|izRQk+!)qhX?aFZ9Rg zX!6E*3ASn|!SRDu7P_}2I?=byk+sRJNjjC*f_lt8s-*+oR%7Dz(q?4%+m=6t7`=9# z(n`a9lg9K!wjl0)kR8VTM=xzpa9Id{U4wmvFWM8~@zkbhe$WG(;Sz!;24dsyJR<-SIggjg?Mc0lLJ&p#*=!lGKl}F z?7erQPrkIDU&T#5m$Mtnx!LHSN^8*IQz;|Y{@ZFr1d>hIMUO)eV*YJEW$OeL!9hWh z)$+Ns`y?Z_R08fhGM@NCq;e(9lN<&Sl_ZlnJPWGULRJ-Tl^TNND;<-nqgS|;_w7Ht z?JO3_n9uMm`*bJ&D%s<}KX6FM5j!+ci8Cq>@3VJToK?|f#BuUVTP3Ijw3&Bny)dOiPc4=FuZEH!`5YByYD*Zviq*3EU3#+JiQ^FKJ_83R2QrHrP(oQWCN%t0kkkj z0h(!x$Pb0v7J46e&z_WIdB*IG@RDi714T3TR^8_iY`^O5{*YsIdgSNi?;u0ce_{jS zD}&daG-}gQQ`_uO(8G1)`wE*EKF?QrjZLc@DqkwT!fNMU_ByMrH2^5icuo?m;eU5h zGW-l>K5LA8=;Ho(5x$ofDX7e8zH=7s0lUluEC+PJTK73p0El$ymln4ms6$(SM&G9nhnpnB|vhfyRJ8{8jBw z-*PZ^4e1oMWrMqxmXUkv7S^(FSM2L}(W6XdsjCWI>`JTSVnzK0>8s<2^<0Agx{d`Q zhwp@>J~Mw^oX&mbe$rBL9PcWdPgikfkC4+iUZW2pueZY>_iV6@AeQJd_*2Lah~~HB z?_+Wj8_21qtkX>JS4sfD{9mww;YB(fB(1p+WvkT}rwV%m#Wu)yEd%P9t9XTp+I9yz zI$llhqfJM2dX~I7K0oTuDdWGF)sah`H-!^(c7#qTxm z=ND5=%(5C~1ij(7_1+B|0_MhbLj6#~PdZJP|7kk^5mo{)^Ea$3mN0VdkFA5jed3|4S%WE!%^=_5?gkJW8BJ8FtpVx1>wb-D!2M7N?gX zYY~xX+;I3THb2+`6!i8VIQ}otE|BJa)8tpp#Cuh(Ys2UI<2w)ctNO&1{ZgJswp>3m z!;q4y=bHCIJ<^heRBrc_&7ciqy?PoEWxY`Ra~Gfn{J(1ol4UUOwkQKk(cl9|Zw~;j zP|-1m$tuITU=nS^1CIGOrN{d{06{!HS0GO|8qv6KxLNGVyAm*&@ITYme=Ht<78F0N z*(v_+X*cBu?3ld9g|%SC-C81^Gvhk1mhCpUmYm~_xpyR0@>o|S&n1gK5omD}n+*bS z_wbVr$^eQ>1?xk8Gnz3V`*Q;rJmjAY3P6DTR-jz6>FltEp}xDJqL)usQ) zrhgc1qqzS3!8!!l&0_)$S3Pa0bPk^hEknsW-kARSyc&*${2cxJ2ecu|aGpcRX;!z< zwXRy0e2C)rbb38-mYnhcnC1VmHh)O-hedUZ)6E~uaw5Cu_Q&n9YZs7$;$cmmtXdUV z34ra0rnh5NzunVaz2&V`)dSJVHnsci={;kPj;JC~Tfmq$?8cY-=P_7#ZZtFPMAE1j1BISALnoifF< zTw<6c$-Emks4mO>CWo3wiS)|CIn<^9J=YwXMmW`fumj@j#P@NswjJ`FYQb@lLgwVe z^qkJS?(S`Vc_7li%G84I`(hFSq6_?EeZd|jk*G*Nki#eslzz=C zK!x*LVE-+@@ikLuhUF9E7dVteZqMYJraTen`= zhZ!LJhqv3>)REC~mD@*+Y-=1BUDj>4AZHR5`JIz(nN9CtG2}Nc?gH{$w|dxjVc{nz z_#bA>u=&&`II$3y-WJN)vvqakL|((Y#{c9i?i2%CQ((|7|Ks+&6G+qm7{))yD?pvU*xF~ z)Ft+xXuFK$;d~%b9t75BxSC5DLIf8A4Eew4v8R1`r1RjY5UTszlzTlTDQg@`U!^Wy zI^VtT1l{t*9_uQ(XNIXxaWJG)l1efdDp@VGp)Jv;_qkU&wkm+?rOHSdrH~grb*IpF zeSi_a^AebwetFqvtvKbs`>&<>+6`!%zf+{^8}iOMzT_#y*?@xP~b7V!VHtu}# z+(NsA=O(xw&13=F?kzEY9(xQ5HoDTd`a*f}86lGS7+bd8)#M(N?6meqQS5PdSxzsu zH8YoHKO;9IbcAfGN;EP(w4&_P7V4m0zsB(mh-~LHwS!Uo#T}a7A>&;hyGr^Hrd7XR z(H;;|e=`v9S8Bs1Q^zs0nXD_ew?ih{=PX};e#;2yf+xyp#QUOU>KdrJGWeh6t}Nd)n$A@XpzyGMdAa`HGw9>4I8Al?jM2j-9h{qGx z)l|L_{tooQP+w_sTQ}HB$xX#daLzM9wGGW&WxprTe|>5dV~+I{{)q4;HKl$;5W&0% z{c2j_*W~X2ht87!Og?nKLaaX`lLT2(pen3VW`o~IY3*u+eOXuw{eaVSsoHQJ$^20! zdZ0OMNic3}`TDEYPssG#D3X~j^X6^`U-jhuE2JLExLi(L^!WQsRfZ57;_t58F9Td( z;dX>bpm_cDlc=f|m?zh8$SK~G+s(OusRfkolzPEFgT|L`Hye~aMm-yg>cIY2i(_=% zNNvzYo#~dCrejVrxZw<)mOLzAuR)Vd=eE}TTj##7+}z3v91v#tCK`)3Pzq@>OA`Ij z7Hapkf^t^yM91Y!|LeZbVG$Upo$iizML|54uCC;6J>R!C=SWm`nK!V33W8Q@#27 z+cyJ8iT2nWmDkd5^0*V9D4;kXApAQc4?G!C@VvvA$_TPVUL!m%lv%ak_RbyX_8Gv~ zl{EG@q8R4PG-~1wZkFEe^`%ecp7itD(C8mxIQ1|<__T`Yc1|&uX}qAgyXDxMPl`UA zz!+J4`KbV$$rnV^0h963=hmcJt34%snKIT@-mfs}RVvr*>0muy2XLBwqUp!nWInQ;>X~mPjtXKv4-Gs+Z}~`CbShx_DbYQN`Epi5=&et?B+&Wo z8C36)v+i90>ZO4FifjBE#wznpO37oBmwP^YWzqe!jQYJ4_>J?3YPm$xanpH!c1vI@ z*Thl^O!D51u>6Le0vT*(oJ(B2b^#R!`x+7!FU2~O^#wM-i? zlgmffH{q8S8wMJ%eIP*cqo!r~5>4c*gM0eh0Bi5oEfRFKkKl zmW~4u+YM%pQPF$M&JwB^4h*WdB{s$!_NE?vHni?fx5-iqVUqrj91o9vjM`rb|Ex^` zx}W*P@VwBiIRvMjgbo-Gy$S0IEn?LjXE+soC}z*58Y#tk6v+hYDD{3f)4%x+5Ijs$ zADtH8uYFm9o%gV&dc5B=hVg1mtYT*dq<^De+k>s?38R-+pmZMJN2xB4Nk0a7)#x?7 z0OGVwr6_DOMD8WR0Y~Dw?X1Yla!cE7qt-9>gw6|rgXtYU^Q*4G_QVzLJk z7pzdT4V-qsskhZ^z4y;fBB|gi(-tDFY>X{%0$$^aJONI?H{p&=*WlHT82j8yh_TNG z$drHKqYN*|*ZY+>cxz3zDAvhUaNe?&uYg*IRuz0s03WR{4b)o{;XWo|8sA~|XR+sP zlRTbQf#hq3S;FfPm`ko^jm-BP=wMx*li81CPKX`lldSyL;F%8AO_jj`D1Y=vM`+H7yn?y?KmP<`PEIq z3sr3h*__G?oK-SRlWMN!Y?_%lAL`vR&9)bUy86TF!!!zK+@$QjW0D~^x{o-?fs(_f zqrtK%=v5CnNHH4UXuxo2FwJEwt3WR!>WLh{BOj=@qo!)c?IwpaV`)1~ z1@5Ifq^73!z7Z-{&^DQ9!kZerNWU8=Cor=!%8p6Fk!zJI#PFJzcX1SHII})aW}Y*(CjRkEY4!G~_1}7zO?+HCFpACd!@@6X;kMRqQxZ(^{=~ z<G z1vx^UZM`p5myh^*_*vll`5>)Y^RVkCTccxF4oMqVrwT=9?s6M!RxA(OAkZ#PJ}pIe zKKD;=OUXJGdrWJaVM9e-?eKIC9)sAf>2vUCZC1vL>DrHZ*k@eJvtXxe_Yu;_loG|D zJnSONz+?ggPd#f8c>{-~efNKO^(d_3t$|c4-Hya<#>ky6Z^lGRs)~$_6ruLkC zW$eYDZ_-&fg@cY`8UhCrt^F5esyHDdcQiZ9C59*Fj!boUSdY7QmDbzMvcroX`VE$Q%Ool54^&dRj}L4kg`!%{ z-B|D5dn9LX@GMVY}!gR3=7g`-5;3Pf?Xps`68^TSBiKpU^FnFnw`n@WF zVJa;8hnKzbX^XDa)F{MQ`$<5P7oGA{nc;)K3Pk}}&uH&`XN%dBcyRQSz0W<*2Ml{| zr~n$++rHimI<9ifn|P+H`>dzhNFt@xk*Q`IJLRUZGUbizCOkvvS3%iGM=zvZF5K;L zSdMH-K^_jZq3aQXZ_;89UAMltDtX3G?w(0{D5HxjVZte_CR{A0EFpCE;EDJ2dyTd~ z?!((8xpBxj7P$1zKtBTv6m-6`<2+hEB(z!dQBQ9~ot3}mM!xHfSEHw1C|2Mc@#ZG! z$?ZSU1i#Dm2Ld3mGkD>c*;S9^c;X}^eH)VV)g0{A$pf`pYuy^k7z>>w)xLW0ux@6= zAz(baX$pgkox}w5yeu$j(N*3lCGC+>c8OtJY~P0JlD`!vqdR)7*h$s3h3&A|f~KPq zSvGot^SCdZdLj!5lKTSv0-QXKEBqAaEXVZ;mCioTgw_i855-r36jsGOAYnm2Xd~Jd z4389xp5ODM1NZQ&A|t@EX4!%wjV5u z`5qQGIM0^#LcRn@QR_Rn(ILY!BRWjk-bd+)5WONfl316!eIxEuNjXZu-wt8%%8gg$ zS=R~ujDbOhBpnL>Wl`x(s<(+(mZ$Z%rM-^1-G)uDxkvkta*sp`>XM+H(lWm>%^I#} z&lYruQ-F4!-Ys_YA-R#E1!;3lv(hsNw>?^UfB+aW)<*s@Mru}I-IrKOz~mNV2$g`g1hD{A|_%>A7O;Q(tsCLW?`wQL-{ z1|p1L_Y*P58D(Y;Z+YDRbe@3EPYz^BqZ}jC9k#)vSqzN|W4V!S0R90{<7>4SV~}`# zCO+vdaixyK)I)uJ-@*Rr(?(Fepu2L2h2gcneTN`?KV-|L3!mie2PhsY zd$6o))2FwUVj{+W-ewM`!ML zHg`euQuZ%Y;_p1=AFN9l8~$B`O-M4^E78c!z1&)eMupx*vYzYYd1~KoyehY-%gEJ4 zJC?%la1Vto#P85R0UpBTnZ^u)tSwQR2VY9xo_3GR<Xud;E_4Ko80a1|XMaLZW)uf1Ojq^8y52WSM zIcgDu79kT$TAQ|pcQkKOu>aEi29O}%uh7PQ`FVZ{^!B|R8u|L9Q*c+pG*5brN^V_= zl{Ll_bnPh`;lPWV4s=SWf{TXa=EdfS&}EI2_%U3lSpU$ZiNK>Y$gPq|`F>JUQ+&Hko! z?wljblzFMb(K^~*W9qyBTpA%KX4>SR^E-~L8&QY%~-2}^Og))gLteZgL&-h9|UXbS&n)V?m_%q8Gb%U{#JtG|j+6G>CeaIx9B*)W12_BkyAv zk&v7L^c#djhe|~!ADcx zw}LoaC7`6^)V{IBneP2_3P+pV9y0}8n&xEZt3vgxRdgWVu6GqQixj#jINg^uv-oo( zA^`XAO?D9KJi5&{$d8dyKf0XlWw4|&-5SkAInzPXITt4Twd2f@O7yN=ZJklmAje8V zziMx^ptvn{@tqDLUyp$g8Exd=pdp}o(!S_YpCaOxI~QMkStP+$)>Y46EU#2#O!S(h zQh8RTh4j>4q_KGspfJTcR|9ei|b+8mES`+H;nl5p*R$tXANuv`8eg<#R(wto7?i8GJ1PGd5Sho^qQ=g~ z>E%m??TP-MoiWjiP(wJppW&r(Q`JVTlxkqyB(XmoRgU`bNgi6f46Hw_YIfs!jmm9K zU#pX_L6`i?-$@Snb|w$q`-f6!!TRcZEPI2uh_lXyxbV@D{S5TpUKd8l*`r#(D{j%a z?YZiwJdcwggq$xu%d#73s@@tiJ&FjiAkchcn#f)yT=gQ=mS^oh$jwZy$pbX7vu{rh zRSdUioREjbCdBX?@ZO5{l^o_OS14$%SOR5>kuA!5f^(j5t1`Uv>K5+T<}s-$Tvv_k zHNR01_O1Ip&61U0w{m^8WpoQ)?FxJ0m0*arL>1^p(aw1hN4XXba}WJeE)nVi@j&-l zjW@LdtTx!B36MxIZCf70mBdM<63tE<2zXU~ll;TIojy4te#q(B(Jm z?$ZLM&XZT$uye^TWiOW-CWdN$deagtT3q1CRQ}0|rVQRnUFJ4>Tz1HB;?Kl^u&oZA zB-Zep9G76aF2MQknTAoAHco}<(qL|o_<~vWXy0`oXVtsRA>4fTDg)}LWvv)o%{rJ! zqA4DNK|-&Wrj36WG|rr4C^7sk|rwT5ztzE+)XWH2dd)h^q8ySsMO>T+Zp8W8T` z+Zp7eRP_CvWl9*8Pj+)tu>)JjQLaZom&l#lAAk-{%ny=bg82z@pm|Ph7)j@W(_WfY=E%$hyDN>{WK{hH&uDR`|Ei3npWNXEO7a<1fgU z-lHmt_4*4Npk!R-O~`RY9D?B~T@~|zV}p-42pHU72YP$aw!BXodpiF@b*sAn#+l< zm*ai8i!)tgm^71!OltP$O_VH^tMNVk^ID;xC|jB_0Qg}WQ{zIDG#~3yc!5?wbMw8` zw*B;3G*GRT7_akXp}w9jhAsJF5c%{`Bagj7d}YE8*8c6JWyhG&8v1-)Mm`zRNhHG* zXGSTA%mMmGplPB$-;VTkxQ>{#%OKvRMN#fqzvQ3 zE6gTANAu}EnwLg}1T$Y*dUZ4Z<@M%pB8tQ{1hcY-h@*1<0sC{aH|#>bUeIH6i5TuI zw!Gq3dF#yuP3EhZoEh5o`^rnI6YoCvGY~|TcF3t(gYzWkmZ!1jN!h%+&$9>ZN>FtL zrrca6$|AqRI=y7(%#>@;=G6N>x?7k3oi4Rlp3+M)mYAxphRZ#6DZbg7iesT>iFd`E z8dT&i_BzD5o2puoGZUbKEZQRqxA3Si%G?DEoUhO&qOgu{yf@Z=k;A4t2rg*#-WXz0 zeb_j#nQ4E=o}KzoUUL=n=SBkn1-;gH4j|!sqY}%JG3?y+X3kegokzm#$uzwUnOa0T zE1M!|pr*Rs592S5l<%&PjoUdWk1q?3om-(U&tm<7(T{j!C47`<%p?sLA!KT~flW5+rfF{E^BWX zIfHl!=JhE>i#S3~o?@RQFUOrbEp=fmm9_r>iXzw0M;)jl3m6~p6LcBf?IRL0Zvaq- ztOW77a-SV1rt*{0C=ge%c-rWhX&wnNr5E>Rx3)-)NZ$CJh|(}+|EAc^4-4n2A`fDM z`3|q{Wc22VR?cXp=TbbNW`V1%D=ABO5p0z*_FcKf`0ph`P6uH^k_wUH-a?LSzT3p( zyUsM;DqUPXNH*1EuSc~EPtGfQ&~_aJj+xxpEfaje98@jx0?*a@-MJ0_?v5?v!+xlc zG-VHy*hplnRh>7PeBz{K{-L-Qbs__fp7$kRm%gC=%Z-xsHgX|8s&`6)^r+GprWu+b zrY2GKSKqpTTHAU~RW0I17qBxCIV3Nom3kblUPZkTv%W_^dav1f!R#rmT!(2db*oR^ zBZ$V^0PQwehtq8;QvSs@DVGf#XGzu=a_kH6Tb!CO7~vxmn@t+y3xse-3=AUXy-SDxirTkVd_JLlDasZ2(_XZuIX;$&Jz??T^Bs{XCEJ^&H@W}1s(c!x7B1k z(diKZS;F@XbzS&yF1;7MlaXfOqZxr_Zpu14=@V&RMlr|tgRQT>iU0TFY-oYt+nxJ? zT)GXGagC2(t z&y8;mh1xq2u6c2Kav*S~qgB9NPZ+Wba6bE+F4yy}#48*J=NH92A*#`NrAhdJiJay( zn6Hj$ok}jUfL@}NHEVwFxquv55Ahqpz01h!>b@t-Zxe^gz2+W??PL>VrC49|{Qwdv ze`w{q!tpSm*B|JjM+y>A>`t&mh*;?PCb!OlYNFiZvy{|6o+*I}@fSmuJ{mAx1M!L# zl4+NaIG2;mVX)a&X}ENAt0-C*cjGTKui}|t9ld*T>-80;Cv$$a> z6z?XPq$RI$Ln{A$jcTJujZMh%h2@m~uBQD&@>)uy^I_7g^u3Lp& zInrlGjr!a_;q{+Y<4fuj7Jv1Jykv=w{zW?6>URG-iY3M*HZu3e>5{}tEjQ&|cpd|F zkNz-BrM=T6nQ0|Db-!y99slt?lcqL=N%*aWY78zrd(P}dhVZAAx6)*HQWK6% zR_6L6@_u|vie&G2S!P&;Fuk0hUJz#Hn*-WFjtOm$C%u z*;mLc+%EKA(rFGGO#L+Y1h{PSLuYwlc5!$*ESTAkb&6x$T{1LD8sL!_@`TS3s~1=_ zsC`(xqgwB4b1P1Vpoep2nZsK}jzh#G%v40kAWkWlY1HluTuZn!?FbYVS}&V#=lwQU zZSO8tu^?XWp>0I>3dErw;^ zYYxM=vbK=c$u^(T{~1^QApTx^IR`A|1<5{0I#IsUf56~qnPtV!BE(WCO4l$=vHhK2 z;hWxuPIPTw&___zJ_T_C(R)3jT3<(_vi@$H7tgu-$iQ+U^a{Egvz*5cYv!d)j<1%5 z1(U*ixl{u?)#w8y5t_Ctw;qah6Zo z|Bi<&>-J3BV)E@>dFB`5@BtO-eTyD*cucC`vP$vsWJKtPdEvo3XFg4Cic@i}!EE%- zgyl1(T4oVi$m}bqATX2>$Dgjz&cKtqx*t9mJosik)C^v##?{E83ip$U7+c(@Vw({w z+}``4t~z8Pf-z%7QnX;3DmIL1Qn-+=GHo3L5kmTD^sSw9U#Jd%^Kwb$#xDHQ-D`@p2DV6YkZ zuy(_uv;Np*s1Hq_c)v6&cog)Wr1j=I$ve~CRb!*OFi%X3t9sPZwy{hXM2*pn$@g*s zo_md9kJrZR!KoNG?<-xCXSH|(;QS;E=m=-l)CzqIxF&hBOF!Rjw&8G#x-IJ{uMx=A zIP!b+E#CuuVdS_UkS~kEgFPtPj@(Lqx~GeJAIL7erPdG2E_Hf1OK$N>rk~r2pCV!G zGn1dHP_bdRT?L;_9UVZ9Y+vWak*x)pP{sMsEGQ(>JoO~i6b-PW1H1ATI$xz3KaeD! zQS$*JxUkYou2$?zQbg*>iF_u_ADt-s16kD*Mf&k4y!i!%5WCK(6uS%T>{~9xp=pt< z;?V!7QWsR`!;ypVIGTiahYJDrrdsy-ao53-_HQ%BOzg+IR)*})%j0^(nH555BHWANw21n zR&wn*gWWSr?Z84WN|i+HzGv}hHbhjM9$hgnlEJRh zKbo2TNS{~Q2^X{$iAP>C_^(!2=-n%%^dw}94v7!GrJ-)I5UBnj?hA2l^sH}v1#*)7 z8rTc-0y_Hv4M5if#%IUl{S1VHZ=&pTxUM%(HZoh-X*rs(dlb3EP{d0qcjRRzpN7wn z?X85EE$h`8KNUk4nW9M&I~;|%6KZpk$u0K=iRid;)n72?^-*Xu1bsNH?y9_Gnh{W% zO-ouuX9lM`7VFte)8StbQ*TAKJkCyfV!bvl_xY|nB057jo&U0FRj5Lk#{2|d!AGoV zy39ee(<~3A^>Ew!hCqGpOINWJbe=tT;eMq|pibg5iS8haUQ-&P_0Oi>d9lT@XG3bLFaYyUN?LW?yV}y^vvXKqHxVGMhy7Yi_~s;r6fm0{F%wvx7~7 zB39%R;mZ*WN;g--e57R815E4K);#svO@&xe>|a64mZ0<(%fC{7gBwy@B~nt+erghU zcA#2!Ryv+>9ekCFlFxEFt~KMekGzJN-VZ+s%D9E}`Ic?|PYfO^l!fY|d3PGICvrer zqdlf&uM|Z0v@IZ1SKsmbhyHl-lxr*%>O}qL61&>s6IqZKReyT!l|gPfuXagZ-E8uo z7utTmv4vMCuwsw%4%lu%eb| z+P%!SpCzFR?N`Iej=XU}f@@$gGz6hEh3nKs+YkenFm=l3C&ZB5Z9A~3<@oOxS@#BcySq>Ay1i9r_XSnu zF4@UkfAf$bD1L#W>(NJs&4k-R2Dh&W@q}-9K$0bU{bxgt`{OxH0*$!@4^Apw1xd&4 zdPUms@AVGPMW|Xen&ByhmbMB~v8KL`+5ih@G|I9=Y?C&~RZ-wcANPV3Ui9GIJT0b0 zCybfSFo@4D?T2JKKf#^~5n{-6#Ln{*^jV{xZaoFTRc@2-dX!k>Su20p68XJuUd zPWJnghnUc(;7{+n2715s+14XUQC}FQf^qU&*7**z{pm`}b$1yz$Ebztr|}E+2(+OG zdh{0RsO&7*Pu@34DA*>v1rc4fX6PW2Hq?SIeY~Epu-sH{Z%+>6^>8k^7dU)6D_MwI zvq4xcJWHyAvyntMz)*1Gf(%9f(Fza0X~}xD!R0Wc$>*deA%U<%`vI%Iv zqtf){lJJU&4n=8eOk1o!63#_lC%?__$c?(Y4!mgpxU6(^=7im0gyE*l#>d1C63?-p zcX_g9Enk?d5y{!j@vvdm1%GKF1?Ym#|ub#SM=4#vNbpyazso1zFT6+Elvuryp z@;8drmnwJ;P%HxGCtUgsn>WZ%x{yQjpU6;=#WGPz&dlT``@!^3{mh@ujixzOWQ&K& z-bZfoJqI4SrHL^<8?-H#>7Tt(2U;VeXftO~vyuBY+&6O^(@-jiI6iU{{g|iVE$Z8{ zUqE{itl1)+#B0`WFnctv^@Z9Zm3Q_CeQSm=b?160_LVm(aB>=7;6As{xzAR^%O)5< zM-|pC)k^fP4Y}2aag_Ep@@;U#mQ<0&Btu;k>4-N9zw&Lc0Iljm0F3tH4G#3!Ez9ew zdc7X_p3m#AiGrCGgP)$f zCOsQ3@MdXekT5&`WNl6>Z2SB~xrCb(?&LqfQwL>E=yQr#P`7$-Iv$M5o5i*-;Cv2Wj3HzD;qJ2%il4Shli zOB0@Xf$CHphhu@fKQx!K!wwY!&a?gW_F0BUQ{_F(5?&Pj^pzV+iYaVm4mbTyhBpTq z)1czsSe@Hrd|m)ICI720wzs0d>AQx|E#Eylp9T6XS%!__=UIY|Us) zNmt#*haAnOaQfBE?3pzP*ye&SHQ4iMN%~OBvyHEGcs7=9Ny!>Wyi_VfHNj^w9jwBsJ!qX<^~3=lSB(=_)<#(IAbdz{^N0a~ zjmBJ5CW_geDT&)AauT(Sj!vEU1lA%wVKZ{=&h$JXvngw!0Swlw{_%yD)d@B!#+TND zvpZzv4@;+JD*M%#7!rRuebxQU3&a}Kcyno0CHoBv`le&Q{H>5YaVLhZsNZKI+U-EoL=#n{cMntDMK2P>j~=V; z?sZNkgYoO;#wOxGL(WP0ZsI>e`5ZZ#d{-VUExF&hw@1M$k}A^v5T-38sMtpDxcZ4Jt5}D#$~Be2H;B=$E%(%ltOy$}ZYgsgcmP9$V)11T?Lq zXDV3#stGzm(VFy_=ru z>MMTo-a8|vbPq<0&}#Xn*#1}^`_oi!40=O3BK@D^^OPpvjHUjW+{YOZ%f^Q^+#RtA z`EDekO;EcS7@bFR;Z{eupDvHK|JKNp;_`(Ncugu80{(8LQ*t;OGyUbq+m5ov-l5-b zFI>1L8CQY2)N_^*^%Wvi#Jb=E=J~iWaa{O|fF+{dgfZ}ugs(TP0 zeGyHh{VsrjN2p;;I6zI6K(4{li;SZfViEiD&UuJd98q2%6U5xWU6;USEJ3$l%|`^} z$PAJ}ovRaxo0QG9x*6z<;2H*K5_6!e{)8)nfeGtB)Up2cUJt|g5s9eoVrzft>Q5&u zUq(*?B4b`Ac1zVqijLMTJkNy2pq>hSeyPPewc;%d*`^vfADuFpu#NEq`(IV5O(!W& z97#v)NLRF+-Bz^2_&&>hL`#MhkA1JOf&`~}d@F0vhzK!9@8f0|t5cVZHWxBVu}h46 z;y+Y0PN+UCgSDS+oXSS0mfAj!oIgiO7dF1)_sxll=oM zoBB6(>6y$9@7nuGk52L+&e50*1zNFH4>7Yq;#T~vg5h;}h_11cq&}QZlfm0SbJ0zE z)1h+75CUW7H3H)UaR>cKu}n4bA0ds$rH^tYR(AoS+L0UE+#;^d^B+Z>zhCU{g;c*7 z1jSFaPSq@?C4!~Ht6rhBraKv1!CPa9*7+rh*phenwy;Lr2DzYU3cNdtEf{n06lj-R zPUXv7b0qL%Gq({856MJ{j;Fk5Re5MhT@ zxmakGVVA!cuS-#qUW)Q(-`mIr?q~g*llhPF+MIp;cwL;Gr<-dK1CfZl3ZiAyCV-m; z4y47x3W)qxDAcSZ|^P3t4E}7T)JSUgpR3jsF82c~D10#9g@&E`(&mdLG@!70W z8x@CkCkA>~`n8MxO6M&;^TCfEci1r5!zoyTrHF3i0JKN6iZnsRbHx<&3`U>YdLk=kCH%>u#LEdDTf`FJqV$k zppm6w7VT`Q%6>4zHuhRnsZUauATfbZt+yghbW2K(eC6Cn1`8AB)t}hbAD5a2bC3Mo zVQ&)R#0Ki>+n%Z`G`FSHb&%WGsb5HiK*Pw-hONU19ra|Ym7?*qEj0#6OGL^GHoni{ zYua5d<;@T-urU>jq#9Yt_x%j7a97xFjl!A*cAFm3F6M^Nuc0ZZ{RhhMS62?T%e-Wz z|Ip|7cC26?zWh*0?zN}gS|>_D@{29~*!`r#QwG8?;(0H*DzZE3C^%lAIwII1ffbwC zw-AxcE=w#o%F$HiL`v93fWtxJ`mJuU`I*5RYQI^#ma3&AitsO645!gM0N4xl`*Vnb znZ~f8g?AzrH~SO0B-Q6IX(rN0aGS@;@O0(;p;<>=ImKMq5jEshxTW;!2;RmOe5a4zuWQ8M_9Y1}Gz$;jLr{d>=8IB~H*_&>4-SZug@e!QB zrcA&`oFaXi@VZhzDhnoYvFX1lw1(G13G(u9b|dT|=K0d|=Lifw?1`l+PM2u(*x9>A z)ePck`s$DVd3>b{soI44`KRTHYsh4hXR#DM!jU4%s^@BQJDof|8j?3s!%sxdb2C0? z?QPLcq=+Ooa4ZIuyfor~@4vAjn?tf!1wVqE5)G~2pnPEz`{9>qI%9>89NP^j4XGDT;#&(aj%pfK*J*BJK$c6d zc_I`0pJY;SK#V~c;G6J$5h_o3@w8v0DUg4&W2Hn`o_Ov$#)j09w%(<$nA)^H0e#Jx zo&&4vK#YLE<4b2aH21wxX=u5-#MP7Yk5Jk1{||2XI~T2XpHPFEA~!nvO`=*KDe(%QIER^H-lUIosS<422y*> zHyl!h9H-(-r&mi+$oo2$+~X51{cC}tCu%=&Z%5F$L77j>msB7D(6s36Jb2s*$WhN4 z)W%X`hN89cm?uw1L#N)4O02fTXaDp3SqJA2dQK^LEG4oxk&>(~A(4r=a^=el8ikOs zfdF@Eve5I+_kTQP>3h~9wi22c-(f)f5cUVYFDT<#g%U+lwN}BNij%8b85lMZe~O=3 z9=H8-I4EQ@9XNu0^i30`*&Tmw>ljvxRc1JuNU3)~MY2_kANn-c(#+ndF$9!0+jGVK z#6~r@V9}4Z87ywK@4fXlSjVvpHqe%8Ea!cmH9ksH+jL}jTKpn94R&JG9b@BtB)Fp5 zY<+(}k@+g=E^)6RQ}kIZA9fB=k?5#Yc)d<0+gC*VfhVpO;Ts8aiN2nOMOs#g8SZ^t*n5;dm|q_gSJ{(?*!@# z%j1T7CsQ*v93z=$zMi}B_FU8PKN!^OYzb3RZNWuJPr?!S%^Od>Boh8vZPf_J_z{5X z`Z-Tn-uwZ`@QMGBw(V^WNLxKA`l6V|Y{n2wcm&DmdMc@4yc;UG)eyn6x3{x-juPBF zXUliVmW;hvr-%wQHGC%S;WZL>D8PsFSf1A+0{Jj+eBsnJ!0I-dI=bPs`chECg50x} zvwFq2SCK@V3A8<%0yhuBM+_gb`|b~TzK(UHLP=Zt8^wt(Xvqx}Mk3WA23JV{XdK7x z5a$WW4fZH}R$vaie#Y(sIZrSf(Ig=5URsai?r zmy1#({?BguH;r*KsF#}XLc7P!lEni>RogdPDCRurIWCo<;>Q@5jurB15g47l*ab0P z&GM`m+Wz+#-NM9Izz=*d8cu|6^5$c5g(yi$e=P(CLA%}8){>hqPLx+O@_$=P1}_i`AJw_Jb`)ymopZm zea*dU+9BD}!utb9dRWUeny&SjhGb*S&fyAIIQL zQ+40hqcPt2)D&|a~UA2%v` z!{6dTO9HvO=S|{239RPV3zP}VOQ}=7r~jdGiFY$9hg@>6-eRqhmfEt@8+9EobyKc% z8dQ_iN3e%#>6=&YNs+JE8#v#)Pzwvl*YewvRU^{EEaZTMkG30h4S7{GS&_&gjV~G2 ziZB)K2YkTIm86>rqA*Mo#8z}LMo16)iH^4&>rr=xL>mX@=1%O_L+DT=T;$8=snG~k ztsAK*ztKm{k@@+tIMk>6JD;9+imoM5AXC%J?}~Hb(K6V->=b3Y_}4Pq==L}A^0+7+nRCsBv%4S*qv9U5zk?B?X>{ZJ?K z{3_;)u4Q%1+M!1S#NTf>tU_S?o^A06@el#?S`NDKkFvf@;TJpKyjFJI?+Jr3O7T{+{(>92Jg$7!DMRcpcWfWc6i0k|LJP&O z!srQ@1kV(eItfzI5HArpe!%aRQJvR4=b|&hOmcK0K@>m0+KHIcwr;qp;rY>LG+x;) z42>86;IS4IeT=Me&FsgX+}*9EP(7hTNj(cuXP({4r!Sgnw5pESkW^i~$l~!P*sX^o zF6=*~@cvz7gZ~GG5L^5JJ$ozM9gENRPB*G(PlF>2K}zHC8WuFp@wPZZ2#~Pd<8(z7 z2zT4)5T`;Q6Zs050hD&SFlrOaNyM(uZzMb&v{u|B6_t0J0U%JC;^nO`I-M;;JP_h{ zp`s^B6O|4Y<)SS7&ytB3CYm}uh(DL-5=P*ielcS49yNH&Tt&-bClXE4^Omhu$MWk8 zj-tPL=(Z8A}xyM zG}?)Uh6cZgYP_!M(w#iYBIAz#(0p}qZE!f|+K19UZsz=uxTw17P4mSM?_Uz^8whtk zaqlf{{t649)!GTfxt`v(GSgQu!+Og}m{X897{|Mde#y zWb_?sg%sm_FQwMM1=$$4x=l%SV{LA{_2?(2Jw9u&u8#VS0Ev{b(o!SVAh?#`tEWsU z#dI$wnJ9nJ<`I326luc<1My*$zTWuF@bv64wy6-YY$*xLF=xA?iQ^}RAvjmhzdJ$w zp?pg8YLkh_A~Ne4UJSt$RcnIpSlHs_z1yHGtC43Ek=G>s$mL*=At}PZZ&`ZoN;_)F zhDCqTZAJfT{Yv=JE?eoU0hwHEsuvK{h!>_dK;Pz0}iXm6=t+=aLaBcYe^xc@;r|6R>^ z;~+`W8O*U}gRXoY6D-LMAyw^!JvDLOO%n}pq=_ZApV)UI$5UrAsO$7dCB(dY5+{E? ze|x1DOfDFkNMR;v^+^U=`Fl(}(id_LV>+GrC%Ggy5mS{h zPz_^4C#Gc(3Bh8%UB)GM6$qlR+i(wPfHKV8Qo=Ls6mMG!+U|&<=Niq+z}(K~#IwLi zb>SoHjgRKBT_&aw$Y2p4dm#FN2Ze>=Fl#MbENgssiKg(P)u8JKjdPF?-Id`fWndaJ z<~|WMvsR7_ozYvR3=%eM#l06mE!Vp-JdX@ zGGL(Vy_`IrU&)7MnmvXMZyxM!1K$yICk1aBR@wE>{{I+<=cMy~WcPeb9$#4ntdQL- zj`>IXj&fbGuQpv7)jMc=eVQ7YvoVFM%lf*!K^A{NzkCZkKA)8~k9u(&T=600ZgmGT z5w}MG)}!uA$&5=hkwL|ypYKzR5#G(7(3IygfUoVSeH{tHY%?{`<^`UkqTi*E^UgpI z)CXD{g|0Bo%*VP*MaBv)DjRH%*YBfloxdQ3X@*mulM(@iDS8flcsDsa&BvWA6V1gx zNO_+ zx3iH<|GB}bFK%eHJN=KA*XoY{*dxzggkm^kB^w2Yk&MS_^GO)m=M zo+jcU&+Uj>pS`e zvzYrX&kLyAq5li9L@EDYAXcFqO(+HtQQSKr`EP+mo%u_Q*Y?o{t#X-3P#kUMPHjSy z3Od{9_yF9z`^=Fkj(Sc@U2;@J2ydigN=|{S>YaDKFCAgW0R92@&wws(zpym#WK?fr z9IAU5wqEG(r9-x>&S}($RG;G1|*vkf@Fi-chfPkvN5ppi(f=EPmf?nBh~T< zKV!OghF^9(DSwbt1W+Q}Qy`~?v)iUxK4FXBnBq9Nb^qw#0^4$~I=U*>d&)8PKwR^T zL0#!P=k$k%lPX3kfCVJ}OX9mVw5))8UTmdobZi#(Pa$+0e*TcYWZ1iB#>P3iwsZDQ zd-JCMRyg}RE&qa0_4aYxSm1 z#Z4y-2)kb-)j-m+e5b!9Df{1!&nHOiqKz9bLEdJ+N6u{b{ugy1 zWB;5xW9vC%&gPzEX&QWJ7KpmZhfj`PGI$YjWuqJ6RtbL#c^0A?ZXDbcvGtZyYW0wRW50R&Xw&oXU< zBsO504Uz_mK6)});m9CcuBOBPuCkzkbFw=no|8d%Cos1GkB+LxnhUzm8pdc%z*Q$X zJ9;>%lp%2cH|r)_f1vldW$$v|)(Fea%w>Nhy+W%X!{qLli zMwF1M1%qVv!bjUvM>zgkjv?&L1I#kwRoNO)SH_|+4c+3j%UGiHWVwGbUk0)WKs*d( zy*g#L(`t5~qM2db7{RRfWDybpU29!kGK$q83l6tn>JMiJMMp1V9z59v_W^pBXaW{2 zg8lp?YD!jic9O+kgS$6*rJ7&E9g@(gMr6aslQOGFTy_Id5Y-ajz34CV`AFRMf;14e zfw8i9LI>*EX5yWcpSqjZcXQsArAtRN8)8cQ4EbdkEbV2yTY+|ztmZxdSrn7^WW{5H zT$Ep0L-(-u4RFtCSjX=v(LL&;T&7}bzHI2l!HT}vxsKPBP$_(07>>Mq?)W2(Xs>KA zL3V$atla8m02!aJ1cf6rE@phN)oWP8z{A|f7ijfpkdxLz+O1{M4r0q6pz>wZ^ixi8 zVd5mc9J18vt8I~K$H@45xYsd88;P;u;F!FT5xO;7x#088N)E6$E~h z2R1pRW-jFYAL^*d&#T^}2XO9m-f%{1r4&H| z*RH!BotpSwG4jUfS@}Nw1%IQBWwx@xg2pz@%p*zB4KyA^HS;9 z24dOA#o7F2fghk{o4?FmA9*Z{L%dP%Y<*xSGfdhvC&>) zxA7zW+3cI0vKaT6S>NTaZJJKpsUHg*F63R$59EQkRit4ZPh*vi>v?QC|KL8d#0xd@ z%&1g9RiMsgG@7T)t$cf(bk=m+T6>K%a3ewAQ~XI<>lq{ua%96jI$8We{^+#IyqpJC z;}FRS^>mvSY}j(B#Nm7Ee(vq7ci4zz(PZ5Yw4)ziPCrQeIB-(6QtsJf{ide%PbIEbEJAS@Ykv0zl#I z##R9J-J={>4%FCDf8nX)Ge=mQT-=$hazp`RN3nBTBl;1ZLzh2i`HSgDy|QOZX)*1^ zt7v-Os3&>{li!su7ky|a4U?2JURyOfE=qnn^7`A9V5!QgZVR3xPk%L8EtaqAx`N0> zsd%9lER$mBqn#V=ydSrrW|ju7fUH{|SGu?bok-d3Ym!FOeXUEc^U|g5Lq;&AUvld> z^*n_uReZLj2+sX%M!#sUqCPqwL?A1vpC4Nm7#~G23nrnA5+M!lb&_0 zfm7hMLF?n0^VHAF&Oi+9$@gYg2QlQVw&J~WFu|4IoW*Jg&nwOOgmK(H-8r&R5e!56 z*idc#`sC^=KfUhJuvJa|>~OL%^{~LsQ~ce|^<^3TSrxe@r@f#5d5;Ty!&C*edM#x?5S7 zQ?>YJe^R4lud;-&!jZ}!9!)>u=TBjOZk9qVIO#OFGwVB8q+Qol-*cmkc0(TCD5DvM zr-n-Tyh!QxD47v{D32O#7)VzY{nBW~7zg_q9nPnnBqWdBNfPBsvF|^o=Xi(xsHn^b z5yI}LnOlQazuD==9VL|opV?z``XdSdK3skurOz{o`uV;DlpJtXdv2}S;>qs&s9d!Q z<4F#WWX@T@Xl86jP*CksfxMG;19p)prp6RFnv_y?31<8-HWn_LW6gs1=$b1+C}Z5; z;5a=CI9g4+>UKgO0kzy>x8FrhCZ9O5U*X4>3u`0o-EDAAcQ>1eQ%q=%}Dz z77c<#>2Dd0+cdW`*}s@c!cGTCl-jnzos8qy6(WoGIq6(nM*RTs>3+gD;#6`G`R|>e z@*w-Ajc)g&u)<%r3_UPMZJ>emD>{q}56>@U(8G+11V!l3y-M^hzb6Q=-HXuqtzG>G zlCJqOUyVf6S9h9|oAXcQxxXbZ|NKD@TWgax9;Ey&a_m>3%i0^JfihxVBg{|$;#Yx2RZVqh^R`6ep3~(j{ z5^(ap9gQ|So!&z~gdgIFuvW^eHyUn2Bae|{&IkO|5okj&Vd#M$;CGfQm9?C~z(_mfh2_EZc;cR(TF3wx(D{RaZ zE+Gqk6gq4aYEd>aus;qhJE*ii076j~3illkJh-KgCT(P5fK7CiH9&8Tl=v>EHlH77 z6*eAKks_}Kn_M0_rW3(j+Gud4g_hir{BirxU=ejhW23c6V?p2ufpLGdkB)`!^)w7T zmdEVG=wd7p0>cZ+!8+XOj?u}?0UI~b&{_Vfcj+OF(GkaV=#^_a2<3AkJM(=#{809@ z4KWUJ$KQ{UAP>}W>j|27JlkEy!K8mFr~kDK8SAX~_=taseufC3iZn8xJ9_>Wt>b=o zUJ-K@Xjmx3PDnff`y#;>k1kn+i^k`ABVp6+z(3{GA1ld%JX8DB%Z3wS6Kz<2VFhvr zZgh~%nI#%iIXQds4?i>8f3on9yb;FPW40prC_ebH@rwoIxnPZz@Z^KrM`*6yWLUq| z-DLaTmv3cYJUo08k58;eR2O)wOu>v`s(vZ0w&1D1PY17O^u=&OmrI+Svp3P=FUIgv z`Cw6k=AztK;4f*@xDh1kNB5&|+b)Zb4yw9$ZczIPu0s7T!oSMQPtd7+YR)ZcATgv$ z{`n>O_l{$>yv2Hmp1=eh1_Apwc=mtjoBf$iii!2968ezTs3kW{mi&$7!619BU<;Yn zqtE7=_vI>oi3Pnq=qQSTV%tjFbG0nVOu4R%rxifkyyCh)sG75dE1Rt&GN^+86@cWjux z(=omP$J%$NU@>e8I`McJsekL%{k15F0oUA5Es|$&EqC7F$3CJKpsX-b>O1L;gp;A2 zGXB~)t$=|(=XXK#$<&lVLr;Tm5gU7z1dO2kH1Q6p8_QO5iQ=dPoi$(i$SW)a^^83( z>a5`69Rb!W?<0_G&7t0G&UsOx)$lmUukrlYJ)KV!NN<@OIy4QTSdCk?T_q4FC)u!K zMkB;(g?`x-8}L-Hm3Xa7hS+Z2uLG?)K85O;IPR|lohmIqI3XknEl<#wcLwm}28h}14A*d^&(R=n(*|Z&m91QK zSGNyGF2Go;)g^Kp0{?+`7%z}_tq3yu*j#f+XBfk^XjP!sp&E}{&9olc*tY;99&voK zdC!C-+Md8qlDES}tuq9ggbUwkPT?qKFz6Rj6vU}@)jSNo+N*mY@IsFgEQrVnW+80N zghnlOvVW^j{?*LPe9MDw$f2ibTcWb@_ooSNnTD z0oRpQFgNjh{MK}*cK64BKR6l8d0l#4YGeyvAt*<|rxRXrU^8#w9AyoreO?eR-6;Pl ztL)f5M<-FfLX=}{D%TvKR$Laqpi6ZmyJ-^Ekh9NltF2NIZFtD=9IlWQ^WL_?yYu4u z#lt}i$~B(}QW@RHJq_FfG38Lz=tAW%1WW5NBMTO|gQ|Bu*03@ouq=}9{dTnjmw$`T z%hM-6!RHI+o~=+E`d!Nxt4-~vJ~T2j8-n|vxcS;%lRY-hYuyDh=KmH7ys3k_Dlti_ zOU*6w(JDOm*Xbvn|0$QG?Xr2^{|+sD=8k=BUODFzkwBV#A@lkSV4+K-?eFvJwWkk5 zO$geoR1x`ac#|U&o3lVxFEBL8Cp5I3{g-eTWuTfQ)d~^BKThCw zNzA5w6e;F!)>3YxWMOr@MJdSwx!sRS(-}tR6a^VEK*z}RiFjnbrN2*As_9$zTj3N1 zGyWwy8Tj5sY_YR1(Pa7Y!;y}3JP$5eF3`?FLRMW<>sYAL+-f~G^Hd|jerJ7Ea&FqZUAFbMFwEA~;;9t06j_DrDUNtgbt z?;o0PUVZvxxc5XZhza5hFZ?4jX{wJm5W>f}+c2)hpKlki#W3p%os)W86*51?$PRMJ zAMFv$VF7*kTSo?Jq-6;jE~_msh0AIoa(!6r*}i=%Sz)82aBdDgcJXuVb2rDa2P={H zzeE1h(Bx*v)4pSh6WyM`+|_#GSe=yomb(r$AW_=o@%2_#c1TZ3j9P>g@=nXq=$)+4 z_|nR9-5ev6gh%_*uVTmX4ka5@Ky!K=4z#arUz58FzJ1h7$uFfq@12-!1jPDZgrE8% zXfe8!0k-H7A}dM2J6uOI_l^5nUkCqPH*J#kNnqrmb4q8ZxoGkog%|jTa|^Q*P9Y&x zcLhs6Iz?dx;4F;ye-j33chf%B)vqM~_zHG=>kBVBGgBG=QA@upHgl*!DHc%PGku|4 z1X>Cu`?MX21)BHFKhf(KOQxxKe76cPTu*=53CT;x zO>G7D%f+eHD}OI|4G16(qKy`Yc^}5$fX|VDD+9`(bZtD+yj-1bIU1+GdVF zjcT7g^56LTbh&$O$JXihyOdpGP_omsHQ|KrkCVxqp|c5LyZLte*p6FS-TUpbweo_X z!6=StHdy@iOBwLBOIb`D-mX+;rQs5Umv&Ij_J&2z6G{ws`u}v`xk;Kmz9-8NOtU9Q z9xskYFplDfpLU`Niv2jjvVM`~Td zKnYYqU-dQGuNNa*XZUg+b`QbDW{-7_9>+_-OMSo489y8p+f5H$lX1Q*8O(RMHpXA^ zkd>qCX@HjsGX_+FYhLKHUM9{y56;{9p|-Df_0wc#7Nq!iEk@dGQ0-e-9doh;p5|U$ z#m8+7Z8dQ#+Tnuae+bINLSODc1wKnsmx0PrCEhiCa_`K0O2`MCjs)EQ_B#PtzLsbO ze*;T?k(N%W34R)SA|O`a>OPwu|rEsj(2p$g(yT zl{ZCLZy4s0H>f&>$1d?FwdUa1xF_O|;_-}njCO2f0kwM9K)?Aa(XFIx1FKg2r7)no z7D?%@vz%h#aax8xW9f%F=M%%@OaAEIc#*4#2Nbe~8ok>sRSl7IXmeM0T(#Yao`Y{R z@aRj_>JA{H&4W4=D z0a}uV_7I#NaVs|e#V91v{%$6Qufib%KW@WkAHM7=j;}Vx>OD|gtTX7E$8Zj)f>ltC zld0R2M(8Z4;?~>(i?zWWV(>d?|bO*b6oUm>rPu1nPvEYQ8W%1GE34NT}P2g)h@{{n$(DF10aY`Vj zl#NN%e-^oJ7W43)krq%5k0|hNIqgo`UTT-E)0tgKXZ~fd$QXUUv)5lq)r(@os7fw8 z9H7z)loio_3~SVy20YwQoClGfu{N&70D%O}c2!%t8#KRw)0(8MHG%{$m8&NP5SG`h zcv9+SPslX=YV#?kMszn?2>jskmO+`eVGQN?JZuP69__m*HWnXtmMTCa;UKRIR0?N< z8e#bn2{QlfItAY0>{=ZrLlh`OjtW(yG-T*~8tvqvUEcZ6DwwQ-)-7ngg~mup@PcLPofwf<=n6>Z=P+bMPDpMU)3k*H}-)4 zHa!DJ?lT3EdwnsJ^4Q*I@+%tXw)6Hnf!EtKjH?GYb+*ECthL{dA?Nivln$AdKazo- z_kwIV%^iavR={c!8%Z-^o~0CjM1Dx=|AmpaV4Sk_4oqB;bAfkr-rKl0q!`zmG^AiX z{X~fI;9}DC8r1_0>OhmgdCB0o*#~B|x#go#MRMJ-Oqr7UOh9Gv@>;Tp8(YD_8MtW$ z<>XU*ch0`F?qa5UYx-{Un~#fl>>mU+H@$Q?xenw%xp4QFQ-%5d@k%DiDEkgg6n(M z+Uqp$fnkuC&qE=*TD<@LCGm$e6Yn+cTmkhMvt%yAsCV3CAFn!-hs) z4+^Wp*KrYe>?}V&Nr7+bd?JZ}a9}Io0PCke=P7c7S-h@81^hSaC@gd@#Rw-ezwtoR z=DdM8N-WQxLO5Z+y?KgNPB@E_=V@3t{@YLuoQpCuumVLaDd+9DyT1bUC&tDSpb?kA zVATC0ybH^8P#?d}0x#mB?W=05C#G#^#1i%-X(lGnlU-jCc~N+fBt(^gXa&OD!{`4x zMnJS?So%$U0FTmDYwCtdaq!+3|yrF~t9t90XbgpKWRvzR@=tEX_$@sH0EAswV zdNi?dI;rHs^61E8%8pW>VyD)?R@}p6DgT3z`K**s$vm6zqdJM|4pO<*SR8kA2xt!l zf>RfId_BVZehY2;$)r;I(hix;I$~ChCA=ss7jhZIcfE@_bi6}Wqj~uwU+6N@@Luwr z5F2PbUb~tzft;c9X3I7a^H0-ut>QyPN7}chskMo>)#D945N=F1H$m2a&&=a{-@+=4 zhbM>iXpVXrjq`q2msE2*;j<)jPq(}^!un%TvCWks^9e2+7L(ASHzVDA(@Z7kQr%QP z8x_yJ^}G{?Mcbh|_vi$O>ig3bSlM4Oc$wx!N)j7Z+z?O+3O>RM2`qIYIn}R zd&h`&yJs9ug)#{lCj0=FiySvbUR%MGFj8#xN5ZG?+(R+k?U~zL-U)@%<&2i@1YXV4 z>@mX7#r$vs4njlR)&LK9R?Xu6HkdxX_}*(ZL(0AJdSmhV@D2lZ=@4K>D^$_PC9y2F z!ccp2NH93gpNF3@xpNBF2=+SRL*+S)O66Gkdcq6()o$_fIku+u6MxJ$-rcKrrH@VI z!99>4U)mF-4;7o)s|QMJempTt??h2$|IhF0TBWOU;?C(6L&D>-#(MBow1FF3kJsJlok#?n9q$=vqShF6&^=F)v?9dE}!3==Qs4 z#QD>QCm%>Wh#oD{_Zx!U)bOT%`_-UYo_1qp&jJ#^3%|{uf`Q!zxE=Z$5|au=KO^|r zKB;wdeF)6J+5D=I1OVd^mF+MnKn6&!Q}o8-i%P~%DqC0#ejPq(vL%OP1bAh{O=6=O z9NUF)Z=Mq1(*2K~-Er8^GZWf(+G92ybgtLMziB5eXJfW3X79&QCvC!<&mGPkNPB1n zbLrk1#jEk{)7EVn*UhsM!nw|FS}z#k4X>0!VkpDzuEwont-ze_H9szxCA%OZc~oXx zD^{HO``&I{(>|rg*+aTOm=*3h7CyRMh0z2^*#<5K%u5o)QtCOqooFOJ(lR0qOZx>f#(IO_=|K}%} zzO!EOv6NVWJM0DhZsXyH8?ZbZ0KQqo#L144TZv2(jnGfueFgRA{UWokPu%+BZY@5( z=-NqV)?;}J(m6f)c%QmMU*MWd#?DtuIcfC}1V$#@0p@_bmL#X&4q$FIx@5H*3VLjW zt+x~&j{$UKr{Q;Tmix_jIM_#A>XRPuU@@bEQv$Q@M=rnchIcPtvX^wKAJ|5yYcYD>D4iv z;FFN(N5?y;A*KIC>{Kj2RGR+}gUC2%B_2-l0>#1F5H{ASdQ)$)4A6dw;O!bpvO_mM5;EyF^2h zcggK8_Lz{nQhtL$OKJ$-D9u&_VxB+*V|;?axu6hE7uL;k^;iKul;IVAo<&Bb_v|^F zukpw7q~oq|huulxEHF*H+yR(r`1$1*!Igep`<=;xl15`}LJBh=;j(^v|6qkv;Ni=0bl3l1+UDjoijNM1 z5+C-c5lC<}Q_p;LXeQlx(6(xUsETtUQ7hJtiBvN!Bf*)J8v>dI-K~`e+p=(MVD~MU zcRECJf6y4g)W1>#**wqPMuQU^oXev}-yvfWOGF5F66qTe2j;pn_%xnU9DUP$sr}6V zu9O1DySF_}4%q;QewCq2_8R99tfK^A5zpz{_{j_P) z?LY8Y(uHjoy^G(lQ5eRUx=(Lo?gYAk*JLUXv|s`ih{hZFrAM?;drY=DpK( zvnhKEdC7V0_xOy@bet}~rADXC&mo!3PWNx6A42~|JpTIp+u`Zi#*LsY4dJho^7?b# zJPq;l{9P){S_}QFN++4f$jJy^Qp_M_>yahj=v*NNX_JPvsWwOMA7h~9MBD(m!iaPA zAq6??>^IrtS`YaqB!2-~T9{~`2 zyTHieP4L*YE+{_j&J-fTV5x_4c#|1mw(??INg63+@jc3AJHByk<6(+G?qBu@B%7W| zqV(Xt8fMfc)D-^7%o!>oND#&YW9@s^1jV6}62N#+-{0p)x65*G%29y|+>p<0Tl%@S z_QvhQJ9qw1d*2;T_51$cFbbh4o1{cmhwPOWiWI%=l@pS2aEy#Y2xYHCRz*ryvgb)0 zWE^|XtYe?7V;{f!Q15qrKD|Hr{{QQ79(6o&&g;If`?{|C+Rq~ys3-uz7)?y>*{`Vv zf*t^M?gR97%xg(bRZX&S(d%}rvX(lPqNSDrQ*-)P08*igOi$6VeqF4#alY*45m0^^ zpj0J7Ww9_&rOF&K!v7b)b6>#g69;5CV($8QNXl!;-4^EcZ#IRTu>s{VcHHugJ=lHv z=Evbx*0MPl+Q;Iuch$iutkmj}9xU0v1p#;(q zyMHm9P1f9P)$47E)Z)rq|KesexH+TTXM2`!9*`z-%UScdAU2t2+Q^y>>RE0QY8VP^ z63;eme@UwYG?nuG7tE0RU=9 znVyf8`O-Q4>7v0Ru25~#&6L^L&)V0@psaJfLwt+Y+nlYQx)`(Bn#mq1Fi}*(F|AcZ z$7i!bXZ&kzAuK%`U)*RfKknNn z6Ify7S3SvG6g!Em)V3gUuL+yE=)s6ep`T7Ch%mu23 z8NGy~M(@E&{+jNMuhRxusPqkM9UDaJJ1|`-ps{4jDaSsBfcYr@11b5 z)~yC15=X1c&00Bp^!+J;RU3x0RrG1S)b3D$CUPn^nWcqhl>`&DW2=EL4GOHyrpR4d z9f=Tmw4z`#;EbVpN1CFg=__&D(L>6w`1DJjT$&*Xa|?Yga@ zUybj3u#HvhC*t|6mjLO@FQu0(Gxg1%tqLX#2@B|FTJp=E&678F^hFvsHr5Nc z_EvPwBZ^Bcg&keqH{_eOayGU+_xIA%zppkg<%;x&x!jU0H4ZEkPJV7C$J*V7GvrGd zL5k1Oz#nW}8??8M&uCEWe}Z#J5sMXGT1zaHSmA-YZnMITf@w~x^)B~b)1}zO*BgFd zDpDl1gl1jZ$Oh*z^I*!w2U;S%AU)`iWu7hHGgh|#QcZ{1=v&GxQ^}V3`nS%qS);dk zg=5ZJRrzrp-F|`PIS+Mop&v*pmJf9@={j!qz_m7trom(^?K_aw+D)4Qd|U9uK*}td zuD>L2T8IpLc33Pca0&maYspvVM?Y<@ch;m-cwd&C*HGAhG)4 zZoHlep%j~%JB|4AtDbl7R8W!@G)^Cx<|Iv@cEO1GgjTVj^gy-Ep;8BZba8T-YtCn@ zKdVpt(xV9WFd0RPtLQwwBN`#ApKYMy6y^ys{G1%~x0!{iP79)rTs%i7-U+$Me&<4% z#7TpAs4Hm}bIUnn>KJ<7?M&U1hy#)3uy7*J)@gg1Y5G{ZK3>sG0eTYdmccD<3|DN8 z(YI$p4he$(1E>CqqPSRqs1PT=g6=HmLw^mKCFM5J_x{Hu2crZ~}h_d4<=v;c?E{ z*`NcrwPAft3i4^Mv}Iqc4$LX*5WN5%oV7=bR!$0$CmB0{Cc!5e^%xs9Ue^m%7mS8;s^*$ z=t94SfPU>Ox`VR@kE8`^)coL^9l@%YLX3uJFR4PEN~1Tl=}@^|3z1=2?Eb)yDAVms4tO5doEE~X@_ zkiVD&p{Jtw0K>{c2kVwE)RM+WWqC*Vb|3D2{^&|;*JIIdna=*jJr?n5LzaBstzg}8p*}vg@5q8(5_ZoL57QR!Us|Spa|N} zUrm8b(@bBva87ywAPmTb9y{WGck(JUaUW_mOD`q=LSeA^NwdQ`tu zInmSZ+(VYf^K3ma`vPbK{fc-TVi56;LA2Sv+Jj*>=%ZnW`RUG*v8a0j)J#lbm$~N2 zdT4*ZB_mo=yUQLj`(Gv>aEnPS0)xfEPH@)Q18qjnP5mK(>we6Uwz*G&@96$!jVqN7 zik-)Z+NwWE_`fc643r`Xo-$ccu|?e|is1^?`e5{IYLSzOkmmtm%%A!#S!ntn&qbw0 zn@KKFX9J+O{@aHxoD0I{_A1epJ`m7hYiYYM;D~Xw#cbS%hzQv-T4U&F2 zcv;Yd`_?WqSg%EFStiRWDVcUn=Skm?4%S2&7RnfN7)VYM0U-n^&LRG1XO>Nx48Rmt z8rhH2hD!**#9pB)1{sMTq=`Gu)K-%sA8b>gAJ!iJTfzJ+cb6QMlEiq)vPrJ0it#ef zG9UfWK4u~BhOxUx>ze1<*xgl9li}Npe|DvXln+dH-hc77X8nUt&Ri#ANWcPay;Rw! zVBkGC4n|r@&_yq~R^^#;TeGCn^LDz|8`ct~pqe<>!WB<`Km4H=PtDQtNSmO2h9tN0 z%r*CerJ9TMZh5h5NDa$#ubL!n1%NsaghJTy-;vZC00~~x78QOx9TjVx*umcN`0mPs zVtw`$osaB^0q0-KvT#TGea^YNx+z=?I$+LyiN5S0`}v7(SZdCoKf0N6cfp4QwIOP> zVV>R}cq`A51V5~sn^sIf6uI`~9ofu=hnysk9%_Bq%+)YcoG{RR;ZaV2Caco`$EgK+ zS4?uhJb*up%_gdu@!~~&QI!0h9ym;VRgE1tr)gE6PZI#T{2{=d2&xH1yVt&0FEM1j zIcE;g?5lLe=G4&#h#b=L0d6|c=$&&UhNZeF;tEeDI*V3;OlcWX%VKp2dDaI4-N45e zrc`)^dbxpg3Dg_F>_7BVptr#~R`$Ubp*0Q-cGS39KPNDJoinWSpvH=b&#pnkQ@UldbZPxK%PAnx}si6v0J( zAAm7O&8g%L=Fl2d41Q=e2u-AM>X&m4!hIm#cSh6|i;3kpU>)0)Jb2mra<7HX_RMPy zQUGyR*U0vj`M3$@da>-om&b^r-Z$ zFU|boQFm{9(4Oxa@Zya-$1K@H1#=8y9xC4-*&yomGPY#zayk6chk!X8DyDt9Nh3Eu_Gc*oiCQ%;b|4y8;`v-~D4JOHx-YDeGgS z?t?M0i4VbPXebMrtY2J7e%x0SIhEj;rgKGtP!_Z6YyX4Pcnk`hHke4r;6vOkXb1YE z+C$?umwm31oC?K{B1DBq7=$JSa6*-yhX&jf*sqN4<2&(1vWKJk5QkLAC&9IrDPSTz zpWY6GR}vka<6N-`Vm_I0E)vD-OF{jb(_6IT)e-mvQ04U92|dq})rfmrPYd$AroQ z{RYA8?2nJ^LNqD8uAWLd4H1JT^Q7?pc8x@9<2H%&<0Ia|_Z=hBp$qNB4hdA2U{dYH zue=sK@&hKp?LxK!zHO29cBLf_R?i*5cQ2pi(Q4A0(dy7~a zZaIwBVm6+Ry5a=CfF&?K)XGerXVQusP(9mq zQTc8WMd8D%jI#Bo*8vWC{i(5O&<}3ERZ9C***scrO*wZaQC?GrOh0OVd&OG_UfDf{f`4Ynja z>>F|ej+r26lUsmz{;G&GoBE-VWW4m2g90%YgQn~bkcaITiU$?=*xTM@K)xY1b%0R3 z+7$}8wSOtjP~@&ih&n~x(rPsP3hBQr^PEz}7Ot-hRD>$2d6_@)0aVP0&#it0>Y1G-R>ptStLV|?hU^Rmx)#IZDlgw}`>1!op%yEQA`W-wBDpWRHo*i8b zvt?KDOYcGrNoP1zCk>!OhiC3iGc8d4vpBDay9GE`{0sQ1_5D=6@l?k+4hed%<=-hn zRk`!3c>fGs)qxbHxdGcF&A0P{o(ACNa8L{vHN)X$0^~`}1gnEIZB(h<`>j~c{iAl* zUa-;@D<{O4nj}jHF{5m`fzBJg=n1B<;`OgqMv`U{kl3{dXG=2@+R0F6!zM<0nC!c_ z)+bfwzQvM*0sy}WC_{89Eqg%u`q$s&aZ*m!2nWZI(GC`~o{zhsP}>9X5DOkL11LAd z*5e`lRhUeWV!fGMR;`)YnO#-ScGm!-$aj<{x$uItLO8q9927yg^i2s087!{Az5%cA zA_G;ral@q?TeV@e-yNtFY>{sg_HEE*V4SU+9I>H12J*c-cRYQ;u%1SO10`FM)zOx( zS1A7NY%9a&aXtssKVRTAo{g$`(wvF`>7Jzf=N4*xK_0rdk(oTB(7U zyx%@dIPf{RC{I%q;%a!~sTLZE{ER6gNABBlSKNC%wLm1j6mS@bN(H?x$*6P05h>cM zE{M4Q!CjxgoL7?r+{z&mFCRzbLOl;;iSdu#6o@#kHX}j?>;%VjJvtE(1y-W2(9hop z((RzG`nI0V#?aa`eBuZ5(<@Xw8ce6vW&vYuLgF;5hVp#9OlLQ=y!vy^LJ=wlcJ+qw zzHB9%Ejfu#N+BnxEkV1E_-k*7rtI%70pszBn=V58bpXE14S6j|&Q{W%ksbhcPi9zU zYQi#iL$#|;;!qMD&NJZ>cMC)y~_?Du6)M0 z^6M;4+O}~7aadL1{;uCvcQHY>Yg%R27^85o^K{NDF2}?FqFSFGbmG7LGABY;+*~O? zp)2O8lYyA28Mk@$y-6Y$3!Y>N`TYvbeXXQmVN6KK`0Uw0vzoXS@w}HG_=4O)ZX7$) zsOR-#Z9_#tgX#2S(irwg$iq47;_ZTXLIxN>Q1`3=fb!k5JAaG4clj;fRtG>k;roTd zHSWBGSy_p2Ael`auvT=9!T*gB<#Nx$Kas41 ziPk3qZD7|QKgk$z5tp9?yCIsSvUWw$9@|{acVLRj(>v@DEVc7A**6n-bYuejBX($MKz8o`}M zc|5kcuTwpkIcnV~#|!-i>g=}XZ!y%&hcxYa84OViDW&)s?J;IE5Ln2&d&1&ZRwyt! zAbkaQ=7xF{i=;#T;U&WG`G%O@1pdL&jW`BbD?hUb7J@>_jl!Lookb_0l&n%lkplU{ z2$|g(&~9B28-)kY_HiF3J8)GcYwPeBlQb33NQF^FPs<^cVB+QDBwUyt8!=fb19#0K zm#&FeJYivkb%TaR7~P3SK&rspYCILbn6LgxCwA+zaM<}DYnT13?{)q%Hw!oQMl&py z!}%9o4H87b&GY0ZT+JVtPfOY86RrQn(-|#figwD}ui8}~SA0HKH~nmr=!FXfC!kgX zC1aKxhyKo$i4|>iIV{Oefc)5EdFBi*7;7K2aH}Kei(~#Q#OR6|J9DpPCtH8N_pqy8vRV&%*%&!IK2+|-V$twIIAxai0?1px;?6<&(|vE0=F|M}snbB&!G4ZDGkp64 zMxYd_TA! zslF}h^k`)T{ba7JuGv5hGxj5&cUnvP<{wC?RV?ycFnm}4?XF1y&2+6c4 zhy;j$ocvB_soUy@%zEV3G?fIyX0gMZuuk5L^^G2><#0}AQDtRiliCQa@v1-^^U}r& z+lA>4D_g9D=cSL6J_4H=dc_iJW)c=7Re|vrv7Ogi?@Bt(EiG$=3#-gc+b^(L>Kbax zu6eDjf1S%MtMkcC&XzBoW%s@b-QpWGzHa7A#U^5JZ(n8!AV?Yw@-f&6D?p46!Fg!$ zTt<7@Y`cjvoyz)p>+I&*V*FZea~NzlWp>T~t+cibDu=?QLaMK@Heb3GB)oL0mXsE zsT|ZKUy4o&CbZ0_YRC$_Q3h~MLZ-L_+4iZ&XW09K8HLLiJKOsOFZ%?{ob1AQa$DJf zj@tFFZDq8GSp_+Pm6b>oZaG9l7aCe`M=XoEr_{hlW1P_Ao5L%npR|0Koa~s99&OAS zk3*8V!KcY@W_GGrK)(Upj^$Mrjf6LMh})i3OfD0wje}u6woL|c9H{i^j+J?AY~qDq z)GafQ2kVc>{n}Tmc)`|W^gLPZflZXlYID$-=cV1`hT1X<4Yv>J(bu_W?B!hV)o(Ov z4t_b+s9XU&8@JC^P8a19l0|jG zAwTruCqp`2FQCB0Re4#>5rlE6zdregJAVgJ4aUIseyKLt&rx8kE!#3cd&xYNW!B4b zMh6=^_I8FP{F1ydd-{ly@U}=+}Y} z2E(MjK%Ei#hjwdOz6W~~-eaQ-N2Mgz=oJ&tq8#aL;_c*LYbcBHqW+P; zPh$fG#J_s6DN{j*ZP9fKPNT0?-j<=Gfaev|BZsg1;JO^&Klc%g=3=NFfD|GsSXX@Y z0K}EKY4>tSMLdzujz*t2+X2zMa=ucoo{Zzwt{WrRynV)n4}|QZigrAMx9DAowO_YeS*?f5GXaoQ$kx)2tWye(g>9JJnsql~wyZ3B# zhjiz#63wYk={_Yb^xZ{*71ti0eS=112@9tK|OI0Lpv z7>lx7dh;V-t(MCY?z55S6}%)20?_{D?)i0AQ5a_N)ft#WcY}Xy;>SBlP|w&cG16%a z2%Jut&n|!(kX`o(JeO_v@gO)Pm}L?Yt*G)5w3gPn7Dy-)_vkRy=Si>fZMvj`J5IpGU3;4lu`o8; z_=v*`<8RK5FkS~Gv~D0p{$CrS8I7PicM71SVKFlc!1a4e#UYJ;FN%N`w!N5Ajz3n)O`~V zW*mdYu;kAR2m|XNin)Hsc*FL`x;A|Wbgf!w&|$xkVJQmt3h*q8k9soq+4Wm?BK*uv zR6C&tLQp(fOb@#8)aWd($ft!M>40Fn%Jgr6vjn-MF9WHLK~fiF1;@8cXC!>{B~2Mq zle_amVUqGvfcJsLDNPq;PyN_zYj#0WSm66gZ=CG$_Wo!hd^?arNkwR&V+C zgeaJec=Rh043wu#`n2}a-|}+VI{od?AjKQm;3>D8dZuEUkz4^R3IbCA|u6^RWig@^u+fKNE zkQA&_aD4v4cGd#J^{@K@03{9!jVv}n)NP&J_IE}38R1)(Ha4(U#ooi0Q4*X`mmaw7 z{Z#n9{TS*xLchexyWekt-G~n1?&o-C{upn>(8?|dJS?DzKt=UWmB)W|Ld*(aU>eL; z%?UTY$7Tm-M9v>`AE3k8GraBdd1b^Bu623FsT&{%eFW$ddRBIhzj+4XBz_|?_AKEe zE@>yF0E7?MBXi8Gh@s$EUP$w*@k{WvAbQ{gMv24k-CaCY+!uQnE%$jh_W6&v5XAg9 zLNX=6S%=K?{08PK-#!T)$nN!6cK;$iA`j@%`@9=2l#T>nT7JK{?}gU?=}S+gVRf*~ z#J1~(#TSv5De$UbKYOL1**uKNs3bbn`zc%Z7!GDfd5mONH~p=mb|mY!l%4#l+R_&= zSv0uF`#XJfq{d+c7GyIv7Uy%Nsocl-^)dIlei ztQ$>Z6BQnaFf2AGtZ>E?c-p!#e%eabA&9qRD@kvTU~&By8~n=={lyX<$CE}cg};n> z@<>v&-~XX%bCBZ7+nF^VO)TjZr<@fKc-+0-P(KMHL2tG zQfm%6+|oPb%F!RlMi#!s`iRKum!>3jyW78SPOV@*$o`x$cfl+q$D%J$g5Br^uo6uS;M>tt6WJ-Fj8Q z81n|D-ZJZ)Kd-3y=n{xlnDiB7He@B9Em>J!cC7!jzoLGuPD5JG4PSyXLHP;m>nJze z1^A`+U@WlRxW@Be7jbV&jGcrE1Ox7n9-obJl`M~6Bs4f3R20u~0{w$KX2`#vlkPmN zsLKkgf}Y)jlFrp)r$q;>aDmH;q>x)5ZEIWCJrkt_^9+Mbd%h~>|C}EOC~&X+0uM#OzBJdI8+F=MNaL2LN&F<}=AAZ{dUlpjW@~HaB!w>&9aLt;ps;|VUj#u+r zy33CdBnj^)qX0OdUpZmYy#1}_pf9h|aj^u1>U&KXr(U-$&p$tVcLw1OZ1#9JzkoBx z*E7#ulP^-4)JK^DcXL4TB@$6QV7@p4d_oqB)?{Uq_V<5{52O46Af^$D>^mUlGailg z^<1sGV&u2Vp;X~w*WTQo@rIa&`H^Zw?{&*g2N({$Rv{y>ninI=w$dYzZ1mJXk`FoC zU);Hant5cm5b(Z48o;B>)jk6}>Lo%gB(Q0ifVBpt=l~dyS#%S`w2!U=&(vJh8M}3@ zNkF%tt*yO(iA64f57iLJBq~9FO%vAjp`7WdN~>wAMkbEP87Ts4A(3vSnFitg684oe zo;t;{W4#&O4zoSRpkfu%tNx(a>1%*A7K<-|_ogK3>(r4Vr`oQOTLEtwSDzUe=~}S^ z;t9Sd)rVfULH!Hxb4v+cEKtF_Yy4g^7$S4bZ5LdWWx)JVo9Ivey#96OyW4m#ll~s% zIX$bW;cKEwHi-%Eqk8g91J9DgK(ONS%eUrJ5HS36=@npmeieJ>$MlWLrC(fu{c&86 zd>HZD&S_sz!?)|T{;IMFaL8abWV9$O6pR}yUHN;IlCm;YLu@yBeMh?b2VZO12W>=+ z1{#ia6bynNy$ln`cV?AjCcK}B0s(x~&~df6MCW%8t4G5Jd*SXQVQ?`}@Ptpbm)+T7`)i6uAKv56eU2w!D&+hfIK+Ftt67{Z8@Q-ak zFh2jW*)ksb#n@ilb;1+Npe>si^i%4f5xR{K4|GElkLe^D@UF-Evx3WC& zkY_D;h(Jk$_$Saht&#pTt$AEIyWrvN=+!{+G%2uixY>14Rw-n8qa*5zc(`whJE2 zUl&)^m4qRHX}#xfy5p!6B13%Xo20BraxO|dm9RnJvTP4|@q^^pH-~Aa{t9u0SO00V z{{EW0-4E%`A0R8|7<34lN(AiCp$;vQF-d>Zy)NPg-4+1YsaVDGJ%87lNz!poBp7AW zF3&5$3Bo9NHY>e+?AZ24he(79*>}(U55`6CRM3|ujdbdOh;x5k2Vb+`E(WhDW7~d( z2tM#JiR*u}=MR_S-E0)Wl}KmPVlVhw23Kdxnut=`tiiK|*dC(T^hdadib|vY(zvrf7&5-V5bX2iuf6OD$%1KsEs0_6~<{$JW zUKr;NNy&!*Gp7@@Dl;lV_I7wrfy|(2c_u!WIg8picTX@bd;=&v62L{@`QF2R6~pe3 z&A>J~t5U>~ta#cZ|64)*h#hGH;S+d3hiOg6w2J7}w!^K;DbDw>)|Di{-N1HZlHcCO8mi}7vV8Q+R&&^e?U2poSKw=o0$19RNU#0^= zc_`-{;mAvk?XpuE-4+G~lK$Ha+>CoO`?6-Dn0t-uV}f82>e7P0bON0@%C7(91Yge80haK+h!+eX{0y|au8dnLPG_2^Q$Lo;IB5L18P zT0`QY8BAtwX1Eo-qQO{YGIXJPPy!EoAW%rMSJp6U2YH$)BFF8NZsm}p1st`?hcaKnoz3F9|n4rVg?yR_0`Q?LfsHsP6*K`8oTe7FX3PWRN zhrxJi_)S&bz40wL@RUrU_sR?y0^j?NzlSFwZeXru|Jr>E=d{749bMXeQO z9)BQ>{@bl=eO12cvZ1UCt|S@)jbAA%!v`^l z8AcVluDw57)0mLom8O|hWuBTMZc!BwZNbRIG;4d%H^!e%z{PUydm5G7ta@~=q3zjX z8sx3H>QO=axJM1F4^V4VZpKQpXYx;S9|uLgKV2@n0kdB`c59ScUmwVRu9@JEVVBDg z!X}I3v%qM~`=trbIo%urvS6SI&z5HZt?@2sZpfAdPkQX6(0LO?e(plGb4u@Y6wBija~L1yR7io3BKL zr7zrwOgj%efazNk?J%OP&)zqb_4<_uk1lnq_QgurzxN_cYUb6+p_Help^B z!#2N-*wGY0ZSCG3$GFI1m`|hsyt5w`M-xlVL9-cJ2FL+?gNt z;^V2PzEn|QFLocu;-bA_L}(8B-@E()Ja)Jpq9s}#6wkI84-Y9IG+q5~4WRb&>{BrF z)$NkK(t4R8@%js8wA?V|-XGTo5qIhGTa-?K00=;M*#F^)2OO15C_Wz8@@z)Sh3(t> z6WbtW56&m|s-#_XA9)QAJN;?TdprPYC=uqUwMGLtWf<)rRn*@ZqL(`!z(uN8@u$i5 z%rW8lP|pYvYE0-bNs5)iYs2a*pnCO(HT^wN1N7p5M@O9`IR^uB4s0!X0J;$EnJ!f!Dq-fyedQ`5M7w?S!ndOEPk zQDjS``C?}kPwjb&)%j3ci|0V>LGhxwKVY{1(?i3Z!6?glP0UF}?>(P|-Bi?tJ|Tjq z=z-^iNrdfP6erstTC$yfixnWE5O#0x-2FC4agZ+UA`)5%h`M)$Az`P4X2}|M%}=0T z{P0CwG3@RiIh+TWj1u-8^-(gNr9$I1p(EpC&-H}{w+BW{CYnOW@mr+v$il*IUhRT< zDSTJ!_?NRqQO|ffUUYP*{{wi!BEcy{s^h`x{*>&Gdn6bcgm7{I!y*WRN!Bl!!Fyc) zuLvuaJM6l)ny>z{TEY4Cfj?@1f?d*4gl7Or(0AoZuU1H>PG zd!kj==eP31ur!;F3YfD(Ic=VK@Mm=aJ=2t_U5JhqhofDNgnTxc>+?>|%j=+-U}9v{ z^@oVU1_VLf+VsGf&+gS%JskxwSx{>$ZlP0w0}gyw4*pRJtiiy(M|r!*6|J3hNpIe~ z@%s9jq;9Fzt}BvHN6KR$GcdV=5~gWf->c$$0Ab!>0`LmHQH5)vza!f^SM_kLOr zxr;?|L`U!EnpKF*oEkpxdg+izgAvCCvvr0t%s^|bl|ZG}7wd$4tVX*UPP)@z>1%A` zifh4&UFwSNTBexe2(#64ynmJmY@lzUz(1?r5GUx>T}Lr4AQV*!e(>8w(Jsv&UPq&! zs~QY`jZAncJIG-*d`ex9M7Z`8t8b|PU z$ue@J)|n4jf9X2;8DlOPn;PIxmUbzo)*V&Igs}#T2*|bm`Z=;%FTj{2`#D3szR7v_ z=<*rxgT^Q<;q=<+)@irg;Pg3-jR-oVej}!Hy1U*`L@26(VqC}zyv-|O z=u;;~(0*I#U$LH7h$$~`H7j3anG6(V^hVIGv?e!j1%WKf+b`j7gU-zeRC>lYc(TrX za^Y59^}i;!9fUdm%*go(|0Dm*on~-Ejm%Eyr2XECyy?Wojq|(W=P!SC%=GJrT z&NV~B$y=J5ZrMoT88Sy6mauIP&>71$n#fTJFBL~{;tRMi8_5H$Qe3A;nm=*zI$BI+$hGWobKvr-p$@sfhq z>UT>1ytLgXoL_Y7=E97uEzUEqXYc6~Ct;Qr5sUNpV-8}4sU)JB#G^iFQG(aE=yHo4 zVw#XF?!49Mr^tJ$f#aQEzsamJIe--a*9+>|@dp zsa?~_ygoTZ+Teu|i~8{AwFx=SSYLN^%fH=}89yi`_5!fT-(2#YMZm5ScHXu(7?L|1 zH+ssz)i^KIt{L=)wS2Q)9J)`*X#rl52f=HXoqpvkzKLhj-+KY!N$FP zh+zegjhp5LX&L=q1P8(CkPeGj%-4%kH7I2w-qS}&+#Ds|Y``pNmw4jMST~3Fbfyds z&8{WJx_^T)8Y7hVL}!uC&X|^T4Pml%NB%h}yYqM9=kI1S8)h>P{UF#+3erL@b4IHv zzmPj02tqea4Cxg3?LB-TOF5NkY*TOWhS`wjq9I~$3$vfPa(%@WdAn(a*OIkF><=Hx z=AQ8N@o5P|k4@I{WT*_5IqPb#ExfoOCDrG;@|ky{n|GqO?X`hu?V9{Hcbv3V45>iS z{}#p}3$pdu-a#c5>18De`>8t;&P$pvE=Q4x~PHP?$^aURjI3fJ3i97$f9zA%1!)FU&b|| z5-+6%F6G9SuN7Mq2ueNeHMa_*xw%@<$; zug6o#{cUCVElkm|Hv2VHR8$CeIksf_z5(MvHfq^dA7-gE8H7DSy!8#2o4!40P}x)B z1g{(6uj}e+7VGjquN$*1{PE9{H_wEx zuW##2_hRd-%b0jMr2TYITW)gk+Jl@`KLvZsz5)oJ*2mL?m=m$CK*_gD^Q6dj7mQA^ zBqnKu#(ip?Bb`r=M+fhY>>69E(+6QMmHz&IzCrjH5=7VZ(!iP*3~c7A#QUbC>7co4 zB$+z-=w(uUV-jH7JlodJeel<=_415i=Qr#f9P*^*jCg^ubjsa^7%?%am5{6)6G}n~ zN?*(H7n~N_ZhLQeuTnURB*-;lvRArXajZK1rdVzPo4NH(ogcUR&-ZRO?b7ATmv@YX zvFCa*R`iao-Q?}KaYmLMR z=MHq1*^6S8{sYN&@8JJWt{*nv|0kE%|K~1(qXgWIU7P+-!Wc@7fWffu+FM)I(xhE* z1&>mTizWH=igLzW_^TE+jWdrhi6q5II)WJ^;C5j0*GwM(DtEXq5MIy@eq+bw{C-p5 zcYnyNF(6-u5O4LukZ}$(UCj&bQ9RqZz{MVBItD%r=>Te0o7EAb9*eYL-BHedo5Eg& z|9Gzd;l>8uT=!qUE;XFYJB6~_T%8{lxLbML>uJI8X5gZx(vFw$FD5Yj{MTLOw__dc zx<@~~{q8Aw9sVvg1iOCMTiJ04e{o!xl~#9k-;VS28w>TD#_N~QPb-EIUMc;WO*eMl zDTdh{-rIW~^U_kbw})xw6bCn}@>}#AWkM*~=3r%s%tt8WZ<5Dj6!6!CQ~x8*7MG3RI*YbCg|8! z*Eh_S!j8k0UpO!pu?f?iuyby#JQ`_?(?@|eh;_F?M`B=w!+rMd3_if-i^ZHssuL&{L0|>kZ^hQx+$0qeb8nws zOu&D6c9j*x&fY(4q(Jv}S#jW&k;#qxIB}dyUF0mv2K)TZ$Cny;!=5XvBPz-LuvtZ5 z^C$wgx{+)M2jcFYy0xDW7Kqt1kFm|Fh0v`fHadVr}Bf7HU&b)9+Wasog2#qlGh_ zuFUeIzpO19a9Q!cC*Bgkk7%G=ptE8w`m(D-r|Uc@q-5Oz_K~nJgAv8g%;Rae+e zf!0U`TNl=^wwFME^<{HQ>(cqYbKGoif`p{OgR<+BOOvfv&6>`AiU`(FcL;o}NpS{r z0IFn`cBp|3G5MWMh?=|=_G+YBR@vX+Vb-d+6{8VXAQ-pZfReob4CPrwLXwz z!+gtb++4wAH26{?RCTk#aEaQ>uAj{@==_$FLUMVsbun3JaN?nNelfws~5$G`k>^!hnx=+~auaIef=_Vz6^e zW<=r?HRA@8_bu0tna)rKx#PsxI)O|Ft}jg>v?O2FLMM6z^0;bVrSG2e zVpQ8s*_I`q;7v1+**8BT_0V}eEV~? z@AF#0fi2@Fuy}sGk0o85T-f()3WVbn*XEmmqW$C?4PQ4=_y9I{ z$1LBhPBzzXcjuo36tKpW^Uia{OpRFd8TdSOHFT}xHc3m(Tu;q08;Km3G&wKlI{n6# zNGmom6N$g(ygq3vPv$Hn1{-62);aQifpKOl>^cZSsWWK)m8yYMcU4tbdr!#-wtM@7 z^s<-P8bF!Cl8VvB>S-B9=`L#gg`5Cvq3spz1KH17;u92UCZ^nCM z2=}AR;bQJtvNl%gd- zXzlaPB$$D8hGy2_eEQpkqoO9(1GUl*>>FtkUIrtrQ_&p*0*G9#CLSFdIseR!XQv84 z39*{gp!Ux0ZmHs#J&q%-&&0)+Q8NNOh#!tk~tWrREf0}^b)UCL1`2s*HY29-%JS?IUf=6 zVt5_G=iV645R0@89&Wx$(3H#1-_1W9U#%1Qp-_iUAZH~m@s_RACGb8`dCUcCmrIn0 zsB~+L6@S|`a_IfgtuWt*bCbAPn2153h{MnmmB31Ynx{-P)Ei72X;PKBVr4!|2JI{x zhu5hM8UwfZ61=BBMJHsrXqQsTvr`+?Wyn<3+MX1c2ZQN}5Ni~7z`@LO*RNg;wXqB` zx07<0$!NBrj45XZx_qOrZ~{Lr@bSX+(yl=<_iFvb2E(AP>{aqeQnsi&o8CI-y%sh4 z6IV?thfxA2Ft*D!@Bx98dvcj+DCH{I&8^kp=lUoCq#t?gg8GrHsawZRr45s0kAfX^ zRb(ZA`*6-zJMy3n{HT|y6Z9xy{W#(C)~^eqpG;e)xo_vo%gYoBI}8Pw+s!yetdx5Q z$wF7`X6(hv)C~qSNr3ot_HNj$cdNj-Ga5P#Rw{sW!4TabcXju> zY2cKmSW$>uYvjF&73bXV7O&hmr}cj{BwSNGW!yHtefo59YI^!cX=$n1Hh#-&und9n zOBm5Cq1(Q>S$t)F@Hn#m6%r|nSZbCx!w!`0{-^vF?1u%TmllDini1v@xL4V^vJd=G Nyn6FW#wA0~{|8$w%q#!^ literal 0 HcmV?d00001 diff --git a/examples/atari/results/c51/Pong_rew.PNG b/examples/atari/results/c51/Pong_rew.PNG new file mode 100644 index 0000000000000000000000000000000000000000..c835399d349d7f860dd6fd255426fc7be9158f50 GIT binary patch literal 38824 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 UBzq@03tii}!)1Gc{lRnp1J|T#3;+NC literal 0 HcmV?d00001 From 6116eb52f6827e1cf920d3d39ecd912f57709e43 Mon Sep 17 00:00:00 2001 From: wizardsheng <45480804+shengxiang19@users.noreply.github.com> Date: Sun, 27 Dec 2020 21:06:36 +0800 Subject: [PATCH 18/26] Update c51.py --- tianshou/policy/modelfree/c51.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tianshou/policy/modelfree/c51.py b/tianshou/policy/modelfree/c51.py index f0e8593b9..4d1f148ee 100644 --- a/tianshou/policy/modelfree/c51.py +++ b/tianshou/policy/modelfree/c51.py @@ -163,8 +163,7 @@ def _target_dist(self, batch: Batch) -> torch.Tensor: next_b = self(batch, input="obs_next") a = next_b.act next_dist = next_b.logits - batch_size = len(a) - next_dist = next_dist[np.arange(batch_size), a, :] + next_dist = next_dist[np.arange(len(a)), a, :] device = next_dist.device reward = torch.from_numpy(batch.rew).to(device).unsqueeze(1) done = torch.from_numpy(batch.done).to(device).float().unsqueeze(1) From c06fba1a90818f658dff8baa3c7770b44c021e4b Mon Sep 17 00:00:00 2001 From: shengxiang19 <1228205102@qq.com> Date: Mon, 28 Dec 2020 21:15:04 +0800 Subject: [PATCH 19/26] Add c51 Qbert result --- examples/atari/README.md | 6 +++++- examples/atari/results/c51/Qbert_rew.PNG | Bin 0 -> 62394 bytes 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 examples/atari/results/c51/Qbert_rew.PNG diff --git a/examples/atari/README.md b/examples/atari/README.md index 7fd8e4683..4bfead13e 100644 --- a/examples/atari/README.md +++ b/examples/atari/README.md @@ -32,4 +32,8 @@ One epoch here is equal to 100,000 env step, 100 epochs stand for 10M. | --------------------------- | ----------- | ------------------------------------- | ------------------------------------------------------------ | | PongNoFrameskip-v4 | 20 | ![](results/c51/Pong_rew.png) | `python3 atari_c51.py --task "PongNoFrameskip-v4" --batch-size 64` | | BreakoutNoFrameskip-v4 | 536.6 | ![](results/c51/Breakout_rew.png) | `python3 atari_c51.py --task "BreakoutNoFrameskip-v4" --n-step 1` | -| EnduroNoFrameskip-v4 | 1032 | ![](results/c51/Enduro_rew.png) | `python3 atari_c51.py --task "EnduroNoFrameskip-v4 " --test-num 100` | +| EnduroNoFrameskip-v4 | 1032 | ![](results/c51/Enduro_rew.png) | `python3 atari_c51.py --task "EnduroNoFrameskip-v4 " ` | +| QbertNoFrameskip-v4 | 16245 | ![](results/c51/Qbert_rew.png) | `python3 atari_c51.py --task "QbertNoFrameskip-v4"` | + + +Note: The selection of `n_step` is based on Figure 6 in the [Rainbow](https://arxiv.org/abs/1710.02298) paper. \ No newline at end of file diff --git a/examples/atari/results/c51/Qbert_rew.PNG b/examples/atari/results/c51/Qbert_rew.PNG new file mode 100644 index 0000000000000000000000000000000000000000..47ee25ed9b24d61e2bae3e47c14a2ce243c9346c GIT binary patch literal 62394 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 Np{aZ9t@@RF{||{VWP< Date: Tue, 29 Dec 2020 22:08:49 +0800 Subject: [PATCH 20/26] Add c51 MsPacman result --- examples/atari/README.md | 1 + examples/atari/results/c51/MsPacman_rew.PNG | Bin 0 -> 54286 bytes 2 files changed, 1 insertion(+) create mode 100644 examples/atari/results/c51/MsPacman_rew.PNG diff --git a/examples/atari/README.md b/examples/atari/README.md index 4bfead13e..49f95b3b6 100644 --- a/examples/atari/README.md +++ b/examples/atari/README.md @@ -34,6 +34,7 @@ One epoch here is equal to 100,000 env step, 100 epochs stand for 10M. | BreakoutNoFrameskip-v4 | 536.6 | ![](results/c51/Breakout_rew.png) | `python3 atari_c51.py --task "BreakoutNoFrameskip-v4" --n-step 1` | | EnduroNoFrameskip-v4 | 1032 | ![](results/c51/Enduro_rew.png) | `python3 atari_c51.py --task "EnduroNoFrameskip-v4 " ` | | QbertNoFrameskip-v4 | 16245 | ![](results/c51/Qbert_rew.png) | `python3 atari_c51.py --task "QbertNoFrameskip-v4"` | +| MsPacmanNoFrameskip-v4 | 3133 | ![](results/c51/MsPacman_rew.png) | `python3 atari_c51.py --task "MsPacmanNoFrameskip-v4"` | Note: The selection of `n_step` is based on Figure 6 in the [Rainbow](https://arxiv.org/abs/1710.02298) paper. \ No newline at end of file diff --git a/examples/atari/results/c51/MsPacman_rew.PNG b/examples/atari/results/c51/MsPacman_rew.PNG new file mode 100644 index 0000000000000000000000000000000000000000..001af14eef37bf483c3fa5f334cffbbef312716b GIT binary patch literal 54286 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

xnLVtazwd9eb16t$G)S>f?*`<` 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 Date: Wed, 30 Dec 2020 14:37:37 +0800 Subject: [PATCH 21/26] Add c51 Seaquest and SpaceInvaders results --- examples/atari/README.md | 3 ++- examples/atari/results/c51/Seaquest_rew.png | Bin 0 -> 53278 bytes examples/atari/results/c51/SpaceInvader_rew.png | Bin 0 -> 67522 bytes 3 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 examples/atari/results/c51/Seaquest_rew.png create mode 100644 examples/atari/results/c51/SpaceInvader_rew.png diff --git a/examples/atari/README.md b/examples/atari/README.md index 49f95b3b6..7fd034461 100644 --- a/examples/atari/README.md +++ b/examples/atari/README.md @@ -35,6 +35,7 @@ One epoch here is equal to 100,000 env step, 100 epochs stand for 10M. | EnduroNoFrameskip-v4 | 1032 | ![](results/c51/Enduro_rew.png) | `python3 atari_c51.py --task "EnduroNoFrameskip-v4 " ` | | QbertNoFrameskip-v4 | 16245 | ![](results/c51/Qbert_rew.png) | `python3 atari_c51.py --task "QbertNoFrameskip-v4"` | | MsPacmanNoFrameskip-v4 | 3133 | ![](results/c51/MsPacman_rew.png) | `python3 atari_c51.py --task "MsPacmanNoFrameskip-v4"` | - +| SeaquestNoFrameskip-v4 | 6226 | ![](results/c51/Seaquest_rew.png) | `python3 atari_c51.py --task "SeaquestNoFrameskip-v4"` | +| SpaceInvadersNoFrameskip-v4 | 988.5 | ![](results/c51/SpaceInvader_rew.png) | `python3 atari_c51.py --task "SpaceInvadersNoFrameskip-v4"` | Note: The selection of `n_step` is based on Figure 6 in the [Rainbow](https://arxiv.org/abs/1710.02298) paper. \ No newline at end of file diff --git a/examples/atari/results/c51/Seaquest_rew.png b/examples/atari/results/c51/Seaquest_rew.png new file mode 100644 index 0000000000000000000000000000000000000000..6cc069fd85156bee35350af5c709124d465d0761 GIT binary patch literal 53278 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

0pz6> z{BEGjb8uAU-Qrn?yQON&?|yiAN!{$DFFNv~_^piwvMx><{4}$aYfD~eU$q-k?|hW3 zjo(46QIa-GO(FY8tW8kTQc+Xcvd!2hQ zr|R3j&vFiA&oIM$>wKg~V+ix4NtEa}EijK@jGLEIe>QgV*hE^qId`_r_F)Vh65u?; z?RO*8CN)IQKpJsGcj`Da^TR1vI*HtkTVcsbKV2%F#e`0xOf$3|nkr*VMMVXW%&9C_ z;u0Y*+5W{eu>jD_#~3viwU+0cQYw9hkXeT%OLlOg*uDimLFeh%=Z(%`>Osy zIFu*y6grO}#*J}DZf5zdp1o&VD4c`zGB1jryFS%RyggR_IP^m|3i|nHn3ojJ_Vx9x zOO*D|HK*JCBY)zi0U+*=m-+y41BGBf+=O5D+rK$#9)vJAPk-CASdexvHH4+Q3xq4C zy)d4Ff_t>)T)oE4z1L&q-2Kl!!iUJ-CEkMk9=|)yOj+yr=hu&Qn>qK9wXns4- z+I=%@|8A-B-WR0=ILn~}@Fsn}&zhP<5WR**MUK!A+wz0A44PSQY&4)b$ zrTooci7$2s96<(@UFfOCf9hvAh@08_wzN&MoL^}{O2dr zn}lPyxWNe_=MiyI0T(paETZn@>&^nD_4#(07Y(-6;p)$v>Jxm#Rfhww-_?()_DAB*pqe&22 z`SoyA(9dqYVZ%w(sp+=T4k9|gVuPj4=S%qr=#k;#2;7lye zGzR{WJpp}ERb=+2YIoOIA79knKJ|9e3vcb>?RrnY#`9%Wy~o25GkSe{twI&^>;2&3 zeC%cQYN*TXcQy9GWAIohYehD7U$xxBs-os4|AGzt zgAz|k*Zp;rl+EozAJm(6w1@jai!4Hgmukwc{&1BPYYvOjbHS*ZP5X`6d+=9_4X4;9 z)s`%^n;BH_mVM1nVr0gTRI(b3stPO)E*@lHI-gconHA>?mJ&-2Z&jtr$GZ7Sf?Vkf zd~rML*%?@5Al_jue0_hC^~ldLJlO_i0b}zpc`P`ZpOSd3Pj9oP$su$0$SSGTA*yUg z3b_9;e5>*q9V$wQUM3J0T-V$)U%QHN=n5;)%PTye2^=gZHf!04OK4^f;Wj0ER*SgD5_1BnZ#ZE$I|AB;QQKipWD!Y^i-KF0abHiwi_ zmBvfg{jYNcXsaRAV(w~~0C#+^bK34rgHi4>=;OnB$7xhOYpR=Xx$|C)L!j@9w9Ev* zAvLUCY)r0kbN*1hQN*wNzFhs|*%LuXobU2)Lpql4)JG#&dWsT!5>RV&gD1Rr>>BjYZnI5268CbVt-< zmcB)WWhe19*AU~=lEp+;%b&$D)!BV~L&wKA&-9@#C4X)eo4Fc~jF?(C-5F=wcfVd@ zr~B1#N#Kk5g&|ge_;f;mf(W6(Jr21&+qcxTy@jj?ON|jqx1KN?#<2!7$=+?d`L(@E zc{{^v@}Bt*8hn*9B$Zlfqp{^}$2~({ZRWy)Fn~n{664mbma#~e9ldN+tq{sy77V28 z>T&0V3JCjvvM87*nmTIYNMw-r)s1-Xqv3jLE~?XVb(CD6`Oo!qJ~cZhLc5h{=8m9l zus_T%s4=FUw4Edc#(u1thSXjK;aN-Kq0>#TD4< z$4JNV`bPZL1)fx(5V$?r4^1b=I8?M>_$~-=obq+NSxam4` z#8ayg*lE9Ya2-*lKnE}}G!w#He6Ro(47CnKJ2fOO5b@5`we=IAe5y9(>^=vjx;IdP zpy`y=YYjQ9aCd(d-Q#nqoe_&^p{eJu4^pW(hrC=r)#Yds5mo@h}Oy+}Wo z<|^een4s>9#;-0_z3Tm$HK&Yymrz&u7yMg$b0&u2FTQM*vhnN8Q)!$xw8pER3?%fq z7vCyzEe1UR_!M;Bh@EDn#MW~W&7sn#J2!Y=->`4Nt;IlYorYm_BFrPT+hb`%cD*`D zG>q3DdGpuCD=k~N)%hBt=+qNO-=DO@5*De_vcm1`Y4)Xb2Dz5Y6aR9DRb|NQ}1q*$JC?XgY;YLucx#t|DJZ!Wo!KpG^u_rPwsi zGzG{2qK^8^AkmJH)FM>aSAo`I-*;2u&9|ap@nByQqf<-ODEmH)Dxkt`zK^2H+<uEkW?d#5+%J2LL>_)v`l@ zJ?K&Lg@$0${b|`=f9}^;f+o6oiN&e5q#O0s_HgU5_N{e)O2zI2s;B$6>X92~u}Ez` z)66xn&!#Ct1?c7^q!-0}TorNdt*ApLh+!E^96o{CDD`q?d~u=rv6R~b^H9>-b)p+j zbz8>7Io-6@s@JsK622sUPFJcOi<1-B^4bsUM8R>d>v#i?v{@Y+RW`j>wrV3XXC{RQ z?5=%|5J|bttivf`I%F})^BBixHvNQswHAC?I5*H2DKy0ApGME<;$nE&=PL;#b3+UGJ?O^@o4o!OI` z+Z=sQKYoNXE9_dX4i-QQDfdcAY*3X70b9#HZS@;OHwbnv;O4m0fQj%Iuz2AC4nxj) z>xid{4iggF3Gqs*@!;w)dV!txi6fycPUo*?XZ83q*?qO!7HaPhjmH{3h}A58pNVrB;X5e>BFz|w&>JW%HdkVNSx+@o_qMHY1NaA7L8EW-v z-Jz+7gZ>y)^?lO;3mL{)`2xMPmmQ}E2WG|=>)RR$#kU0P`O8{z-n@9pWwWACBRJ@J zhpa4K{{_A-Ge~CqXa4y6pqD9tik1H+-(ME0j6i?p6m-^m8WZZWviZKsYunMym65a4 ziQ3nwev}}RNj~NhB|7UAz}1-$sZ-4WXlhuGWi`{`#S(63cqBkcTD6P<3Y*MRHc|da zW%~LxGpuSODkPaey(y}RDp{z4%yeK8@R^cY>p+FkW$vl0Uq2X{9=?YS$bl5krmgt< z8&Mv6BZ}Hcx}pH9X+?UrP&Ja73kUvd5IdL z_Go~1F+i<7m|}vaD;&yzDnH!52!t!)ghEfvO6re)C{4Ts487=YLs#~bvF%N@hr9X{ z&pPLf!ZARL*{fegdYOMa-|Xy!#;j_(>a}J*60Y=CFO}ZLNP5;Ww#+^zz^NYfo?qZ~ z2u&ld7&U^i6RBN%X4b>HOk{4m-&WrcO@1XT!yJa$U*g8N`-^N17_F@`BR7aF2vlSZ z=j(C+p4c((Yg31$J@wao5}`%FX`jAOJ7-f7&GH9VtLF^3+Vg+8+Q^W82PU@#M@c7M zvkP)hGMuY@mL3holD_J@woYZDsgZ1c_-NKt-_z4?>@gO<5MeBQ7uJ?SAc1KkfkYE7 z@qCtwd#`ygw%(8*RJ*6Xv>p)whNWNC7_^YtA6mcYEhoG<)*lLgV(ya3`WhrpE3CJ$ z!10mQj4h4=u*w%z&W+j6C=}5rV-)}BiUVDkxUb~2p(=mPD{;=b@CzPwk(_-lntA1I zx42Cb*Bt-7<251bs~GGg?ivf+tRY#neX@&qwqN*)pQ*0+tYvQX;T9ieOcetZGc@XE zg|hOd;K;jRcH#}1%cp?_rhUvgD_*oNr>NWHL%RQYp~RDFvb5`2gEbM$6?(YrvxphN zQ;!8*GXGGH*H{6JE%UEQ7uu~4+D+kEj|Y#cW)7+C?=KQr5PSJ;8BjhMBKb(bb<=HQ z-@Y;AJC%V-Pu&jkwown0=RG~Nunw?vwc2H)zQdK_ zwwxD=E4gPwbGsAxO9GSUXWKae$aM%MYnHB5=t*%nq;x#gZgBHIQ^=x$b^~{uvcF~G zy--%b{vX!N;i05F2hf&JrbGu9$tJCZmhwn*X9IPY)XiI@8~0g^jJX8_m>5jL`Ux}d z6u_JtuLSsP8SUDLKy;1wOuqYG*6e{YPuums!+!$mVDcRGTfS}C-O~(IH5o!xTcWLE z9m`ODs)$iwf*(rSV;rDS+n?7BWtRdfL9?FT)F-_;k$JfE;)T3=+ZVEOgW`*s8{O^* zCDhO+9e>oy9MLO45A6Ts9~OX+BlB0tVJ2KCeKsB#Go@~^R5-)juYF;G$l|k>r_F@y z{pnDiOvg_nOXIBDuir3(QK13cm!d0JR{6-eI$Kwx)>nvV6}#w|t(pV&T)hBxc29-_ z0Ciq#mm`du`b_~E`T9f6m6uoNTnad4wL+BvCBE#>bXy`=V>*4?#Q@r{LL?lJW!M*zgDlAON?IqvOM7sEY1J;`rLQxNl`Y?;1!dn}8;N1aOo79b| z&Z$-) zQcOx{bEzHJaR53mYJu}qo6gz_2Gr59zDhb~K-En%O1{RJBtdf0&#+rV^WK8$8sGqZ zs%1VD$Sze^L83|IAFz5M!djyq9ao3z_+BCmw{ORV&wAV`g|Lm;YXVf@RW<}F;9S$H zNe1U6h-621rt;Zz&?cQ8I4Phjs;50x{G9SH6?yFad-!{M*PUbkZ$C`zW9Ybr?(g=4P__Ql`jFf z`bV3kgwn^N)pt-t13dTR3k*xeGY(hVgt{6Y3H1{iGP$U?kf*MEb^^W8ys#6t*Pn6b zkaz;=;O^g*ju8<*ffr?UzYoUg@=3?|{2k%cRvg3^)e2kr3Je`%5;nbt zM|<4;=?BqK7+GVEUX2<3kOk4U9VgstS#1Qa7hB`ep4qK-F34;I>g3P7*S|KY4&<#d z?s^OCt<=(W$B&VGgQ~9-fVQ~#7{mDVmN;g26Wkqg@4{qli{y8BFNrC^#EZ`QjIw>d z_(Y#gZf{5qHPBh}e0*sP6aC++!wu(BU6k>6Wpz3|lMAQoP5RyNV&KrwX~Btk4icRQ zj1ztJq*>h`h~?hgViqT_mZf7}ojEx7Zgu-z38pss!DY6D_vaDoKG!`CWUiO_~od)^{tMDXmtx` zIF5Cs&&glJ85McdbL+witdJP`AZi}O6`$X&MitPX5q(=#pLD`bc-Bg|v<|s`&$KJy zwxh?}nHXS}Be&XTK1oY)zCeDGQjryV>B}w+Cgp`M1t++Y)_?w-v_lB~(2B~#pZV+X z1bX7Qi{wi1f4SmVaDK`XQRm{w*?4ci31e`me=I3lIOaJ=FaJ?jeUye~miK6_!uizl$b?2C}^faU_xa14-w+xYm;Fj$+G z$ijhLIwDXnLJHI1`6+E4iEZ;_=*VTCngU`4dA0m#Y6k-daHiljKd(56DbE%U^ zE;yxjEE`=}S3fHX&jrzUN=Ju*ed9VNG?S9-<2E^S;1r7g<7ubQ>QQ(-PPq7x9yO;E~8x=4=?BQAJ3d5X6 zy#hg^No~XQcwAHwXt3`rQQlKI!Er1=NCnaNx4MNT$=UckS8q`NHe}f8NBT@O2eB)cnc~Z^M1PQ1ik0{keL0xOp3f zVSMtzX6$===nPS-i`haAh9NqC$JtUs4jGUL=4EN-g zu$)>k0NSQmEsb7OhdDqk0X}FtDh2Mi-T)s%(`>l=-zDfVtwp`hthAY;6R}$_(YcfL z%+S6*3K(u-CvuT5Y3Et|5T_Led^niiZaCVqV!wP_JQe^uDks>t{NLuGm(Bn~HNR?k z#A-(bnWzp{V3e-XvR~_)Lq8+0m`1D4G#Te>LO7izz_H+=OISNw5U6f2PlTHE?0K$( zboVDS-Zn@X&5DAh6Zq6`DXH>!_4|w2G)R^? zWq_2^Q6LP%v!0@8P})aQoo5R~;vWlp{kyzx{0IBza0&T)@EQ{RuxwvY#U5&w0ix!P2%n?68jk1^vlpi0J^k@P?Qf3k2xGSL?i{NH| zE990gTVSCNID*;%`FBo8pFM8T3E2grJYt`IPb3Tu)DJ`|wF>czt+6on%l!L;^&9VX z7@&`GgA3*Dzh8~pyhM{q)HI|ZaTk_pZDchJGqq$mc=?xhyQ5avu9$W(&hqq{N4?z6frExvXeHO>{(`(dn=vpiT$&clrn6`^UMQwABAjuSvs`&z zA);+7PIY3l>M-n$VB=zQyK?D=A&bMv%~Ygs7s-njxFs?VXd!+EPIP2K5)!T0Yf-cQ zrX8AI3skZ?`%FK%BMY5nyVw6f)dU=Ul)@3D3)S7Z{BxNG(EG}EJF79eIIbBz?{|5 zLR#y>J5o}Qv7@(|SJt@AOD2K(NSiEuf-J>*tt^9J;qj4PpaYt!}CO?QXF)wkO8P>%n`*q$a|8(C0HU5V3F z0*0S$+8zUyk$-tH0`IAXWL=fZ_hM?QYyIkF@u787 zNo4$cldORP!=2yqF}}0e%9228!V2Fa28To`#M?Z!wYRTrtBSSPBGhCv#fCa_S}h6H z2&%*eZygW0ONVFK+d&_Fyt0+T?|*ymYhU`z zde*bn9pC%&CB$pI$e~H6s2Uf8s0wT2cRW62;BL*ve<2u<3X&j&rZPpy)#o!znN@hEY&Xc;+HHw3i#DoWMZ8B4WEsmj|S%ZKIp*p$?9pa8fx2v3mVb(hLPy;_VvL2L%sLo)y4{Q8HO>D7ov zP%D^P`#FV7^HlVsfQj@i@U@M!Sko*Gz?aX6ZNX86Kii)xq>LGQ~_Mb9GS zz?M0-MGNy!JG^tj){HN%kkD`u%<&*=J?tyRoJ;qeO->#3Z_-U++K{xC{D?{t?OYV? zwa7jH((A@Xk_BL_v(l)8m(e~lG7Bb1N7=~8a^;VU_aAJJE1y7d@2^V&55B-|{=!uV zwzegSVb0etL^V%^i-iTLYiXPW$kn=5m%m%pXSJvn2oCl(UC4({R+@GoG)D%-U0d_c zHcU487txzj9W@KN`O%(Ke%LaD2jg*@Y|t4Q1oGSImrN3-syL)?>ExltQ;XImS41O^ zc87=#Rvs=SN0P;Fd4#{&b^uXbOXL~|WW|5GgIT=qbwBdLzsm%I^XU|vSf){5;}bN}g?-q$6H;WI0*l}&ef`1?=z=;>A|A4C03ARy?4vkO@zOfkv)0y zc&4jn&3>Osg3c-${6BuCgy4#A)KrtoM}Vsz41dycI!XD=a8|)Yh6x{BnnaL%l=W;R zbmHHDyCJTr!dU04RyYm2-k^yFpTWf{FD$hj&DGu;hbW%iRrlQ4e5P{oj}k}@D){>9 zIVK4cnZpl$yf420LeT`R5P$b8mC8d?KEd%7V;5(<)6pgj9ioo8U4%OMs7dIjb&|U1H>|J=1L2?oWp2^>5WVYg zicnw5Hm*@y@-^KbC6cOSvA){;wKo6?T1AH)rYWM&`A^cM?6qe>cmBxr#m~unZOm-` z@k@$Xb|rUg5&GmZpSn`Rp>i)oFUNi2iD0B9FZyzXB z1(*{J5*YMNI_zY>JFI&gm-|Py3`hpaR*})02sa;l4xa;8try?ltHyOEeqA2db}I~5 z^TPj0i;2?(^+K+nQ7D)c4%2V4jHrArILqlE?bA=#ds7IMqf^L~;k_5&U1=)fZ&49` zuZ&!$u^j;$9Okvj3zU_&;{-^q85AtDfV#@~@uPB{dC^s!l~Vqs^#E6{_@)Zsz<#lP zM*e9>5&k%Wf%VBXf;au;aoD|eICFhQslDuq44LTnnhR4FJO+JPX!%qh-bmkW=so&Hs=B0{TthP5V#XeJxq;}T5g&2uv5)O-&t)=FD1z3KjeDHh7? zK5KV|>R)=q{oq$>{Crtp;Ma3m(7H;Ot>(t1rE3>Dq(RfIWP~l>{Ddx+o6n1F1M*^l z;hh05Xd=u)4?h#mT*-xEDA$OccKnUgOr=%08Hem5qpulCD!w)yM`%{b@w9Yb@!!$C zCSK8(zl;teyB>Xrc7n&Pcu7_bLj8_HVEHbI0#Zxd0%U|3v?Lck1Qq8Lg?zeUkust#OLbf9- zQy!J|MM9{7yoa3tr9!`#t#gS7P+=+5Fg*A2&0qxp8e@v2z_C?70)7fCf=QA(7DrNn zIdsm9bON{v7ROWR%|z`^oU!FCk2sEUO{!>L%|itaR&KW?0d+}DY5%-rmlDF&$g*Vh zbNlN0z-i2N^22)ryX5oeve#(o2oKKX!w>I`k8U?O+83k%aZdJ?B~kNarT= z@{n-0*xt||ob~SD7A=>H(Xk#etn+PDOOfE&Clgf10BTc$WvXw_5wh+iO>elkS%yI5 zTMXsiN3Xf*N#dAci-08j(em}{jV~i@kLrsV_A2BAQN8a~akS}J^Rt^K~VsGBxxXo!%keHrY&ICh@1L54;K!@vCGg_BXIXoJ_sRkY2( zu9m7g-0w6}y4XW;VE6qSo2qKRni_nq$<6Z4nc67?@{k8!+F4Z_-#e8$w(pAp|CQ5n zh`~DUrQ2g_`|$ZzQK7)@nU>ppBB7u^fv|dXvTQW&?}|#yyQ%EuHM~qTA$pv~s9z(t zTs9BIrSgChau?`uWF-hs;PC*K%`0oO5T8n^C?rB+>Lg1xMQy~sXT#jJFeoI zv(Epa*Xfz99n)2hvmc<{9!6|t<(+p|PJx;d+^{4_00BUu8o4_p))xT|nr7*$>PG=S zvK|lK-5CqgD>3#bJMWY`P>XasS1G5qQ)ppaxnS6ujXI`pdm}j({zL@GSp6^Hbcq9- zEc*4+@E3Yw6NC>0?(vOurvcE$RQ=`ppgm9wO^i82Z|x=c? zyhrX^PMzpGlk4JvlP3FtmtJhjhpOa?;72!5J7R%E;rydztNh^bw+r=Zvm7y<#4(;; zkkh?(&hSzFeX0}muQF;OY)-gn^0z*7dmAvjs!l1H-8UamXLYFlHr6>!RTh7F7y^xg zuJz2X-yPi(0*MUQ(+R&44CCk`L59)R-Rf>J&QaU-h4Wl}_SdtZ7)I>-*y4 zsmOl+7VjMz%t>TtiG=QjfBkJ9Kx_3c0-Ni<#PJvrJd9-?#}Fc~QvD^v%?2{uWKecj z|LWq|i&SUw3mbzJ#axBey0slsS4s6;@0srUWM__RSE)I8k6l*c-uosPcC|VSH~&pg zkLIEc?;;PoRjsK;K~FqbFf!|Um`B#6sR2gqh%GUz085eIcsk|1pe#}WK`R}xA1w|2 z(!N=jH_ot9JSY&G$Rjd95P}x8d*bHZf6Saq!eQQGDZK%2aVg{u4#?Wi0dkEo-Mkv! zb`5avWmv%h!u7}4EqFn9fT;W~IQcUlgCU{1G=OO!yp@~*BvK!U7Elc8Rx+97E59swA;I^7*9~Ug%%`R#BKK9q~IDsRp>=O>o@r{xVpGXmijas zm-XpYng=mDVbmOJxs<#gT+dMY<>P*7uzJQbGHviZW@#ebjV>%4Hu z>T)FJ3nBfc=mq`}8456Ih-BEPBD)?y*%4%{P*S+RZjy$m?CI9H!Mvmbvv@@sVQhco}zBYP(JP&^3Br^amywBq3_zEwdE_ol6cbT@I07p0$& zEkT&rS3p&yu`SrN%SU=!3#uiXCdgq=v#V`jltH2B+r4m3)p_oYiOb-TGd9a$HtHb>%oY>cLg$QMeF1X*}yS zJvJ3at-j5$-_7g?rp0(l($P*Jdz#!~YH~G&{^w-`yAu}^U(H9w@ASGC+8c;20RGGg zm~1|)pbwtXtJcVmIE!LsC11g z04!r5XXr*{`c#YgMR0>Ag_OtLYW^Fn1oQ#GIfqO2bsS+6B|UEW06qlIF`F!R(`!{9uz0axCeY*>9L;|HE~kh&@6@ZI>FNATqw(g?c_s1ePJc`b#cG| z+1AA`J#;x0TKBKs933|GsT(Go;Vgg-isUznzn$`fKVJD}P=15ls9!Lma(Mhq{7w-} zk=ecHG)F0Vl5i_`@y6h+z|&2!!b z!E3?}U=3>-*t69qfWz^m?$In_03k;X>JX9QdqOlyoZvWMs66OZH@={3BZ?dJCzb1R ztX{;Sj80eIIG#1834#Z>&{;ipU|t^6;pW;u+teJ;y(+L6`3ZGQv^=pj{!!^lACaif z@qWkFTeK5h{TSK)Q90Dz|2r;`zG%-E8bbMx%oI18jytesz%<@lk8PVyUWAnETNrgw zG(D^($oz=tL4@y~cv>AZD6R8TxZ7>-{ z1e1Nm>VGv@$edX<*An=rW&>OVxN?N9Zk$hhOvhL+rhIq^09#mR*o3Q+Q3?}v<1J)L z;#&Lw@Pll!7igaApTA^3y!Wzar?Mhx!R!rLDZz#r;e^muaop!ldaqhMU>p#8Y9F(s@8cQV! zKO1dP7npnr3hf8jpx#+gP@N_-!*ixu?n(vB6fvLvc&O&kD<|AYzW3BNsn8sz?s0jW zkTJ)_<;BrG(99-NXp+4+6TTv-RS3mYZ*vKmrm~`2guV2o^Z=#-TZeJBdtVV+7hM8i z5zlbyk^kY@OsgI^n*#8SgNG@4A*ZtFdn@92nR#y0ZG|n zBG(!GbY%RUhrgl2YTC5$K$jX<0J&%jHrn492!HWdGt;WZHnpse^lQEmP-I+`JDQ^S z`D7HR*Js%;EGxP=`3FtCI3E!hpw-CDnFU?PfVfP5A%{hP$+G?3^(h_aPsuA4_xV3F zBe}QDKHgd?hCkchume+kYInm-F_c)H>w8LfH>mXdK{+`TcU70x@LmP5y}t=4aNJVR zT}ldBD(=RN0^UZek&_=HzkY`xjbHm6s{H$kd*rLL_GM|TFWq&iBg&EcD=-=*QLsjS z2Cx%=Hru!R1e47PB`ak+TIaetSRlfbp8ssp1pjhojZ{&bPhASU&@WEijYmNjBwx3{ zT>-SSY;ON)bF0NIMiymu0~u{p13)lVSp~x6nr>WmIhebF8TZ?vp=p&bpjj315&@K$ z{>ic!mRZ{Pu{Tfe;Lbgtf=_z+%Lk^bRh8+WM(jUHJAsJ=hn>>V*~l9wPX1fb@#w8I zz7;PtA>5w}H#37fa+|&t2Z0du?}~z-Bs$TH01|m%F49Mp%~42E*?9|c8%a<^Bqh?&(SHX5)N;>JJvHE0JQ6Kv0!q3sA+!e( zKI@2qO1Wq?Y|~nu0}!%DHkHPeL(A8P<6?-%NGUJ=FOSqSpU5+?VRaHjR*LJ*)-JEZ z3{kXL3y|Ad z?y)Dy3E>XjcRlNsPeJ{Wfl~#dON9UxXxX$FGAew#SmQ}tkG=YGPR)ud@n8-YC~p1O zUkXdbL9c(kzepzSi(6FTbzoAEt!iwZ1T$iso?)zEnzXwO_OJ77BGcLM?pb6b^qX8r zT!Zb3gkj4b|H70;`3*?+7jxMgE3d~ySqKI?KaF1E^L#f|(kQdf+m@VqFtXjO76S2R>n`9yzYP)WY8`?SRm zv)ew1)obkBCGqLpb(9VVv2_hMf%6IA>7B8OpKO$%6`IRSbDl@G?B=4YC8fR-T$-{v zWixtgOv8m|U)sgEKp-{u)%+x>^|Y1o`G=dhQe&|X^!d{rm7(>0UoZw4{FqPkyY(a{ zU`w-plpfSaLB3oGP$QxD|2dlcGltTQ;uT*sHI7C(uHF`Am#t9E)pmoSExc=`dJzMo ztBOc5$r!`s{z3aI4{LAt!1a{&Y z7+CMV5kb%h532^%TlMBnrbs{eQxHtq-70L4FH!ta)t#=CQj818yJA^>ZV22X0)WD= zZ-s2uc(dzv+f)m&nxBgOk~*y;PXxYKMHep@cXLO0_Zlb5nwMjyG;zXwcu9J{BPbG4 z(maeCHAQ4f7^_CYX`6^7uHt##OY? ziz>M@pwMQEbalsvf_N2v$_RwqkD4Y+b1P>E^3MBp%9D|qW2F$?Lwm5dM?WtR+@}U; zP`~1mzsk{2QXGlvpY9x~=+v>F2*-SZHa7WTrV%Z_>A6LVY_mjw6&7aJ$ zLiu|vEgmFlj#ge2n7ZB3$i*8C;<h#o!2G-Kmv!oa^5T@Gc)eAL39GW6&{PHt7jh@h7Jrr#$i8+RR_ZC@}@Y5WQaSk zcepB;i!_rp`{!`FU2yVV5neT?BmuJ0UwoNYgj3Fk6~8QU0*JPZppx*#Fy}oYep2!= z?ai2O3k1oR(FI~zNk_Q@mtjrsN}FP`IeaVaLhQm7XcTLdA5*rMgYSN-2yfx$>pmOu z^smu|wN#4kpOEq)Nwi!laRMQ<1>^I<3!)zF%CSk;kK3X_@0FDdfNjf%D+dVo!F#yP zFgPtlyHN$JwZ0o!h{}7t%Cox24^-iE)BVN>pTSAQ59KDVjHRsZrKbQGHvb%~#|0qD z>YS(3Q;qX^lV%9GKQDf7nY>~s5%cX_OTWGwg92U)UqsCE(ka;-MA4X(=MbT3CUP4s ztij~uFSSqN96iFWyuU5)PZDy3NthC9sk&uYA$Ph<^m~?HI1t1XUJn^CpYua5p99*Z z_At$tx*bv!xZzZ%_t61bk-OszeqK%BnDNfsXOxh79EWvBcou>8VKhPP4b=SL@4zu8 zWgDc6?f|tqE`l-8?lYi{1`LW{eZ$&4Bvv2nRg$#08wH>aYcjGDier;DWu#LlYq2Q`G z{3--{8iV_$mN)gL+JX)IKAphDrtX$$A9a$C@n1ddC*+atRh%jR`=_0eR>R8%#@qfm zJ@5nDnFeusTcnO>O8CCh2fPwT9_{)!K*M4D#mnJ%UB+tmxkhh7u;!%z7a`-Z3XAX9 zvw>nx#g;RDd91|V?~DuxR{F5wG#}WKs7JNh#aJ@v+C|?j(Z-EftYDybPJbFq;vklB z?jTgU|#>5cYGRAx{5qw|*k}9>RuRZGi+PQu+AlJ4%OA}}-}gI6CR=FGlnD*?B*UAuZRE5c@tNtkvVJ?; z5U8vPdr=xu4;`3~#QcL_Cee8Kgtc6AW7Em#Zm9J**ZlN=tZ?$&Ll`SFPQ{;3y#78a ziMlypM^a42?miW&wxv6JelcwMlt64Qjeb;IfQ#o>a*U^o@7QtY-kiF1!{k_lj)w96 z!7Usm6Q^mzO$5CPK^Nl?cE7wk_BC2N>8(G$O_s1ZVXL`Kzrp^(5)8-ihJ7p!ccFc+|my(vwRpK%l->z#np3tp~ZnXtEIeYu*Jcu`DN@J*-*fA9E zB;4A_Q;mFqZz;cf{^*&HQ`mU>w|PjJcTLVsCZ@#tbAV}DXS#0w#3 z4D=AA<%xC_v5#53*d+|RzS-F@mAis_WWt~C=es}x{QBq%bEr9r2lRcC+1+2#tmVt@9xhx|X8j_th z#S!+XYK`cHT0ofYZ$p{glRvdbAhE5!TwBA7!=wH3TleP7KyDA{-%z1;*m?@{-BU&+ z>v|t!<#qUYlWfY@_rKM!Zv#y9GXF?LRL?lw^}hLa(c#&8g<8kXmJq^%_3kUAt>%$f zR1|c9nO}Z1>uJL}S3cz@S>__70*O$Sz#c)Fo?s7XSBe0ZVO$lqXkVPP*m2>5^aQb= z6A%i{7&4yHygnti@3(GI{t6!8I;>e0!pZTBFuPzQp&Dq2&5To3-$BqWI&>f%{c&`8 zgRTg`egEQPiHf=s>7FKeiAM9G>3eeuFWI6+P_&QYueM6CCK%BV^FXe>q>@YU=yU4i z1?*-om*K@&xZoGU5VP$Ih?7MY0Mj+ge9t8c`WS-^>ZBR1!4TP=$8~;ShzG=}%hA1D z6zo!DMc=o+l&>DN2qZE=j);)o0owN98y{MX>vct23@a#pkkqU!1|~gABY~^%4qisZ zN1j^Fjn!8A{m|+GpN!xyKN)#EMPf^3?wD^Ht%nB#_Zu?aB&adi%(mvGDpbFdw2URA zQnK*HaG$d2hz#g5r&ye3hShr4a=%xMb>W)0JXTmw$TkH}t?vwX5~$oPj~J}?l6I^o zG|fOi(Mdf5UIYB6P8d=E9-~R~BOoYL?kl@FPs8aOEbox|vMuVv1q48VrVVQ-Gz7#z z1-W&a)pa6GbZJJJ);a7t=?Sj+jZ4|$6hIZW4YU$}kwoCrDvxG0pIKA9Fit|Z_fGh3 zRG$O{9x0ZcZjYTyrL~3edOWFTPzmL{9!@Jwzbe_DgW@-L?BEh5sMb2WEqgVdoEix# zCS*+=pb)XCh4xtvFgKbdz|bpwjkP+yw0l04qM^!}Q=i}0WY8S`f_vs{8e*S;1IIm5 z*cc~-+bbnPw9P192MyAynN3^(?6<1I5}F3j~x6 zkTYUkX(V7g#e<;U&+g%yDqwse-fT(X?yva9*W8q!0;Qw}z~#>!!S$n1-@SPLHpP>% zBd)$=JY~g&JHb;=n(Q5Lc+Gm*1_8e?GF|51GoqiKM8N6?H02W$mlp!Er0oX6I$ZIH>ZSkM0azb=+WTQC{fGwy}VTw;nNeGnNR*E`IjkDlllB!KYEQrw1EF-5#e`7D}}G~O_@l&VzcMs zPEFxdSD&iJL6d}Y2NCaAj2IHo1b;eOWl)8ES=(o@*50Qq1sBTeH{iV)J)Q9u=rIuy z>}<#gYYLaZw}m=D-YSHE0jyT>Qq)2GWgImo$av0YvNrIh&f&%AUt%Q%FG1hTm021o;@sfR|(Z$x}mv~E#SLKFX=-})V#N=Hj2LsYpc%78d(c)C6 zj-Paxwc{}~#_0bB=C}TK3?y^)`7U&LF328ZX%<*cJW!01Zfrpf6)%T<4|fvkKfFAU zu|yL%&nRq1Jc9NyZ!W^UnvWJweCvVJH)bvTsr>Ku20xlmN~8yyN-SmlxSt5@d1E-k>I*LcHG_dY?j^s)Olw1LZS{a57i=Ti1R{@V5jeS;CV|abR;#u^x z;})2%t>jHvA(#hntQC7XwQuuaKHeyK+#Rh%b6zV7{2o99JEj)0CqF!ZJ?L1~w)#Ek z%0S_inBYhb?zECUEaB^jU_t~|qk$EYiP3^3P~xm)NC(Q$Id)gwW!L)jUP*iTf8FFyf>qB!H_vkW3Xjh|eWdVd%{ zbvS+6Ljf(&Ldm)HmVCecMbjtdZ`!J z@}bI`#7G13uKA4)N4>#&xtD*7>#kbg@2A0*;Gi$eMx5BZ6sPU+31Wo~=3M zTu1uGJ@3=@+w0ZXR_W2ZRp5Ae2-fRbulX9zqUs0erQXG`*u&FkgfG6X>DIr>M!qO{ z894Mj%8=%(y4e}3Nbx>woPofZE&jZ)scsE0qH7U&H4xnzebdLVcrkb{I`X)Hy4JRG zLsPg(0N=Lb^4++>?sB+Zs5mugi{@b{$(8QdRE(?$+Q#K17GC__2>?jCX<{w{_{mhW zFR^>o)1UxFmzH{}dy{zywsE4@ic#?%i1y#}&p)l}AXY!jmSiwC-u!~h=`+MQXwXMl}1sxQ#_o`AZ-Ws`!O=`D7B+S`t8YdASf0z&J04 z1R?8^<`(es821IT{tpDcYfme-YLH4Mu5^%z8KJ;7210leJ!GLw8{F1lm;}zpaS!?e zn4nfz z$?Q|dAc-L%CNRMGV)ajnx;8oF%(#)fG93@#O(s-ximna3F0KT9~1uQKJB# zo)mt-`f46A$eW`O6G@G~LUOVi| zlRmvrxP)0;ZqPsPsG=puS5N<>zTl3x&%3!TF5dn05aJca>zx&SM(Wxh>+~ScE)0?! z6h}(ShP~yB1$8-$uBp=vxYH$L$d@O8r@CIXzA7I*GIRS21#qu;zzOKEV|b0>{N7z) zOwx!ME&7M+;6Bvst9es(Vxl-T>QdYBt<3DJ77YxTNi|Yx$XAlhn9wr6j0#;*S({IoOIPk(X*gq64OP4> z+K(_QRw{*JCTEJd!61puJYkp@?S5W-@$y#wF1lpxBoWvtEI1&rpB8719NsF) z{`Nz4%Zrs4zvAjr|7QgFbeicSw}96(;5@W#f*2p#3v5S%qfvB z2W6|bXKMFb*B){UiBA9AIx@r(+9DS}k8=tzcb!Pu6M|OGZTC-baqY>u+4Q<0+sIYt zpYKTET^3e7twMs22`5(z)>bDdoYC?{`k3A1k|7_vdU9STo{a*v}%d~Lq%x+cio&!gRd}=3SlQmi!Qqaj!xl*K`!bfI16PEA6 z3e}RuzU(|8cCRoJRIY~BZO3C73+9yTw4L8C2}L^Tyo?IL#Wp9EgU?IH`Ll@1JOOIy z{CifgHAMKV4zYI18Y3M4h_U}Z%?r+&J4PQo`?l-dXn3E}-CUI+Lvm(81pPirXDRyt zR7RuZh^di_L*<8DVO-JGbs@s7VeXX&jCm&$%e&{ZOdx(=u*Xi6cUV(I_Z8?NpG0h2 zSA~LMo6)HkZ@K8e5##7lj)kRxE_cA!+y7;cUXERYKM*4D%nHSa+%l=_o>14|G@FuL z6}N@05m4TjL^7M&h|+MKGDH^@_;0J@2M^A3pITWA=2ZOr?T{G3)L~3{M*wCZ((H@g zUtRp16?&KhCkxUBK?S7zJG~?e&q~H1iTr8%C!z2o;KU^MSS0SdrCyQvm@pbqTB zqoBzu;J#Mz_Cq|>@R9df@8cAfZtQ_3-J^0niD5zoZk%=Je|w-P%Jus(HUkd83L~P9 z1YPHOsIZHxJPqyjmIqZIRen3kk-j^|UTmy?80=&`k@XB9;wL)MLQFWaSb!g?>AVZg z`L}6RM+#8l#39U?ETkI#SvX0+*)mXJNXF_5gh(QW$3Zx8Y;J3J=ZMP z=$WPouGOFJz3;d1;m5ma!cDsUpJzL*46GG*wiEETGDJEeHtoMkUIOWH%|oCD(qJk> zwwn_GAo!Jt;BAG7IjU$<*xH6Q=D+|kM?j|r{7TeWW(Yp(Xu)JkQNHIua7idw;e*P* zY4ynAh89Q!Dt@oJ{PcSNMg5z^^qAH>>I#UGQj{?52|8)_7h$V)+#Y=Z=?v?w5XLVId6z~G{x>1!{5ij1sToRi^ zkH=nzkTQ<^^dyrkGgSB6Rz@va$Ut(GkdX{Ix(^2HSOv2ypnhMweOXlNobX>F@E-w< z3BK0V|6vU%hxYOWEHx{h$1kn*w#7H<8(Pt&%H(@}o?52?^ zn0-jnhr}Fb#)60FZ9_Y^j1i^2cw!1hlv`$%k`$DhK{c~u21C35f=rBBz0mPJf5_SY zwiB;_ayNE#OqOICCG$S~S$A{Z1M8@Fu|T-g;Hc3N+QZNH#+|ujeIE3MgGl_wwkiF} zQJF(n#BoDBI7#_^GUVgj?F-?q3w_iNYm16f`6`}1Qf_t?*YOfuWZBrJ$k?%py$mL9 zaigrtxZVM%C;of06Bgb7waV|6CT~gF_x_97;!b5&NtCzRK6M%0`Q|l(n z#~TBS>tN;|_>dwcPCWT&KJfE@-!zbrod$@LBn~kVm4Z6@lE;dsk;{n>6JDBP64BC8 zYiOmbF2nC1liEdj0K1QtflgQao>%u>D(~|j2-n8pIC;^)YKk@$dZCE*=YwX4Ktn@- zwE1VK!%Da>Y0I~zM5%|`+Bt;v^AbXVDHjMdai@&xZ!UVer~jz+ z{OukhoYA=f(slZ0+;1~9&P=3ttJhe(A!})!-$oB{0soVRt3q2$UNRn&jzV6~q|vYV zU~f;4S>B7xBFMq-eK%EO7BLdeAk|ZBmnr~A_675*dy6*A*j$>i7ZmY__fM2VtH-&o z2m>YZKx5(FB);!58|RfJC*3G&;z@PP%T>rN;d?7ih?iqTY!tw=7#G0&)?=GE4&8H}qW%LTw3J$PDBt`)^NnzZ#FO&-sMX5A06asod9q4%SC~rc-EV~^{qgV6uKsa>IMNc#PW>0mX*Uby9Z{s`!MU=B`fz=Mbu=o z0c}k@pnD=qs9mj&t@wgooN9B{C;3BezjSLG(Q@r3|Bg#I0@3@&RlMyHE(tiI!QUHO z2q|!2cZR=PUD>i+A2E;bB;j=8Gy_v((rhnJ$}XZ$fIHZ0fvHY*?>Bf5J(J2r2-~4D z-K1ChF-)*0F9?4uqh267k&VNylgTtv+_@rD7q2=pc)zu42Gu@U+b0AT?Q-P- zfnaSTgwfl3SLPvj_X1k0^sib*j;^0ss#^#vK8Z8!UA-IjUmy1TKv!7{k)raTewjeV zcR6whKihkifMDHWTf^aC|!owWsvN6ST4weNet66W}IShL` zdOY|wI$BdLa%%myhPIL772%<=B=NHqZGztn)!~#X`gPC6xJQ4c-D70mw;+(Db0zZus$E|yA{4zfD zajUudh0(j)HoO#lbTM&dQUjgK>Pt=J!`WMu z3_ov~xSa3BTs%K*@Bg98D1Pd_D`SpI)Pu&~Soqe9T7>ZvJ!YtTxt%p8zeEKa?sVq9 zhch%IKl-+h9R;3Wz8RLNqgh{*kxgm+w*mWFS-!9CA4O_=jYH!=2@dVSk1!<|T*-rK zj?9`|_vW73i=Zs8ufy{cdSL)1OW8fhrr67Q4P5RXjX@@MCqQ#$!Ew zIFGD~N-zC>(B?oxi+`EXK!N6#;3jbIa~3EnAGdfMR#}RyWw9oGopu$m9X{&GzNkhG z@fbEk*m>Nh3BuFPnW7!$5NPf^cX9|0MAB@GeZ$RU<(AtP-gZ$5$4^dOBK7tfy4z>CY7jEzN0@>0>JIg8gg(j)Nx{Xh2Z zpt+XFFZZtbMoQ8cgj=3eSx3nH>A0`9Ax%&a%W8@q2(#`gW=*xPVLH*mh$E=f6>>#G zQ^~mn4>bkp-h|X)5nUZ7x*_=uUs(UFIOSt5R16ze0W~J1X-J46)C-O zmgd?kP?SC1H@KCi^co7BQBQ*8aho7~789<=pI_uy{+Uog|Mxf@_Btz3G>tTQfji7@>-lWb7JTmjA#irrF8vXe?(o-1kxYy; zS{Rt;H829v#BK9gEH%ajU(sn+_>G#2KO?!bqM+jXn{8kxYzY-R_V=#eALG zi#J0*gi^l*Q#<-NGJJ9>g{VAJ&fCs9qqRbBHh_&AS0x=Gp=`VTr;GJ3AJ{r0e;_{c z*hIa<#94@4m;}u*I8GRXrix5 zdWYYUFU*(r_(1WCR}2CLLBEg}r|bJ#I}p$ftM{KgH6ymD-Hjj9J##-{$=zhijuGWAw}7x6W0_Ph z944N=;tM-12gW!;qz;j|^u*=Qgqhge#;qqHC-+WJk;^{uQX_9ke zmoEeZuMgFJ0LYU8$JbBWqhIvcGQZw)LuKASRr21^fV|}Ph-sKFaH+-P_9#3THfz&z zG}hxLtvG)B`rYljZmsH(gIpr+2spnRIEc?okG!8zKkigr*%Sz2)MSYbblqOD#?izc zJmusplre07>pitEM$y~T)H<$lMzMW%Ki=@&c?X^L$*6iu)(gSFRaas4SZjVmDN5%N4=1$w61PRNNDeDAyZ^-x^=g>ii2| zwP*@_Csv=WOj<-nx`;l1nsk1MSyX{O#5+epmmCPZ{`-b39cibq5ZcOYtPf*%CD}@w zz27JaM2a;h7UfK%orF#sv&IM}(vD#^lDri#F%lV?ysWhWL78lg>GvCmW&&)PWOba$ zhNc|3$2g(MT(6#&O>80x{51H(6CfgDC0JyT^Yi{xzbeO$Y=cI~ycK6&y zZF%(XT&DbAA9F29d7xTB1|#;=^RUYl9skm;(ug`LglLrYmhz?a0&LK_T{o5V14&Es za;GPK;tGVC98IyBSQovKlS9}>nQpHAHuu}EZvMPRpY?45 zqqnp+xuepmPo%CdKihW^JxHbA6qP@$T_Ir01`{Cv!)E;LuG?;TlHxF2VlDv0N>c#L z2P{A$B{=+~VN)5OT9+dFIfn{b$F}u&Br`tWP+?>&=$BfKub@Hdf$Ts~E`;HP?xgT5 zVW=7U3_@0M7ug1=>a%vR1p@I6?k8Q0&i-sb@USLp4S3GCOEg;dnbEET&!hwbs5Fi_ zfFmdD&gF~$+gi4_+l}j68&IrI5eWG2umdYwF!#a2DjQqxY(e{K2tWv3~Ow zL%tpl0+72MXFNU|+0Rx^-B+q4h>?j2CtH!oAP8xncXlIqIM)p*IE1QAvX`EU6K<(* zghuZVxh*@)fT&05>F1B3pznl+Hd3JIT_9Pzjvb_Y9V8P65}txhHVW@wj+`1k&Ai$beA-} z4fww^BD*@8BaRN@_aU2LsG(44psNUDx+9@oPE{}cdc3CwOVtUM0lObciD06EzSt33^PWAktHYm7M0 zwus#R>Zp7Qj4)jI1Yvs>38I3Z7E^y#I5?d$d~V(h9Io1xEHQIzihinBFEIFV*eFvY zVTtVzZp4L$!`D)c)D^?-M#M1Xt~y3LW$IV&#rlMU>Cmkp_Z6p;d#g^mFI)?eZKD2p zvv%h0Z?%$c*IDk}B1w`eyT8$o7m<*_;y3t&;U;~ew)krSIzDYotcn1)SFLm1>kr~f zSkE|ri)v{lf?6M(^eI(x*;aQk4hkSrtv;63>O673hiKp_$BzBWdp zILsnr!zoh2IFviOb|E*MI4jjXKgGTh4W;X`W+HMq6g>Q()zpPiv3h2Pv< zKdBR4bBc&udwkNZCagnB>liWX>eofsu2e27lJK6(tGwdkm16U3X@jgu5z=E%nhw15 zp6G$*NUqxrCqd?;G86;d&V|4CeYPG$-1@&7 z+ss|)-TDlVze=K}7&>@Mh4Bcs^ZX$tfXNY?dJjO zjF@KZxa8W>vyTbphV~|WG>_)y@ELAadVpbN`a7J@a0s)1k58P^aQ!=aA@ePA=b3$F z8i7A7Os?a+rXJlbvl(Xo$nwL)M0#suz4P78+X1_&hlfu}d@ve9-upwzEm#1BNPG?U zZz8VcJdSYBjd~4E6{1WmdUdoU|DLjYf~;TdaFwg|fa~k4!~;;Fa)}ctKaIWbM)GjE zCwANwxi~b2F0YdMY6CYx`3p~;MrN&}$o;XR*Ucx*caD5+JGifJSE-B4i z4G(3nN@QTEc@#d}()(rYhO?vDJ!hj`QH!rRzujna3#&ja6}%Xeekr-iOxh(d>ZXMX z9-a*}oppa@>r?Awk}2F{E$bn&e5gNvWXVE=Nl6f6#r;dWToT)vx=EX5)oT?Nj;n|B zH+fe2C_arJyNJ52&JG3+J#X2YGQGOQrToSG^;WFP_hJ=uRaMyC>8riw6Sx-jAD!ws z-6Zs2!6ZK_uAmlq=cQGh(eZ`y*d%$UkwE2`Ou|u%Q|bFcWKhuOFT0+qlR~ODT zG-6okbOqPDrx|lWcpo@{<>D$w`+A9LdNod!Wv+dH?^RYgyY*#|FV&;FN?tXP;kiMb zk^aE$JXg7UzNjlrw*~Cp<4Wv!;uLn@DGLc#$8HrQ`S>Cun8;KXe9d_V^M|Uj`(at+ z9kuGg^Ax}Valb^-0>*Ne{za|r9_+|`V7Ib;)pdZ}o_1Uqw;&pOi-B0X6ft1Zl1(_s zn?K$`YjBQmvN>-Zc6^LJmsCY&nP{8!>PXubc9+{Q`vWvrx74i9{9@|Q#lWoz6f6ya zy2d8}lG(m?8+j^z|939J8STY6Hn>%!PaVcCj!w`_*P-JNua=}7nY%CAbW?h06P+0# zJthoumAAXlCY3Jee1EHaL)RMw9DAZba4oXvMV%&dmpXxPc4g7~omxSqon7Dhd*pV@ zO1s~-I9_(#k#BrQIW4~@4;nXUatBXodCssv&CF+PZ}#4bwaFTh?6ly5;Q8#Ek(e!Q zM;P_Rn^v^{42_d%f9Ov3GAeI;XK?ucZ-Xc0{N^^P_E=D4G19T&JjYJ)s0PzFf?NEi zAI53?9#URhf7Y*G1W9`n6DS$BG#*RQ8uqRK{w9+E4|Q=#uqx; zB{2GUkx&q;gW!wM;v!o)ov~2j4tu*RH%Zda>N|$_*cpzE5GeNU7b5F}u=4TJpMM~#n=}VBTH6BAu3DhV7k@Zv_gskqtcH96DvuVFY(XCR zGvoPZby=sVeXW(*^sv_EY%?fnaw~+)w+Q3>+#`$JOUPaTL^yrr5Ocv~`y=6$C{s)r z-Nus`4%DqX@-3JV_QMlyNkH0%0iAMT(g<9bOE*QLTeXvWNgZ9!XU9Wm zCYi~XS&DU{?I;`NU5{Q#a z0p@lF9k{%$zE-J4{9lX9t!hp@yEV?46y^#yl+sYFsGfFK1V}9J<0Am)d%OEiLy3L= zc$;qZIX~#QOXtDYK^s`K+iuUCg@)@KKo#KPpFdO4UvDCamwCBG8LrD3jyf)&1J2$L zDTNj_X#3EvBJHw?U#xFk?)Q;bzt2giVT{Rdy0a^M;mOAKrl zz#9XVgWqL`Kenv%KgU>t^NMrpY&)JA3=}FPh*uxIs1#L_J*g*T1R%l9i-rifWrdU| z+Tp!CtU8W9J7)wYb;dy+^HvIM#c+^e|M|y)-2czy;4cY^I`3KsmC1v z$#N^9AtOEBjHC%?RK3XGmmy-WJDIw*UHmAyZB9{Hj2iq7{*%1jkOPe zaUcPqoKUQ-51%Nu4Y&fu~1z{KiF5vv}$p5iYl%(`}Jo04{xf5Kqc4WWJQmYH@ z)Gz?voj_nE{RW1906>a1fC;;Arwt7k%m27Tvx{#Yd&I}+5Cb^BT&iPoU&R`fwVxz7 zA=Glko;;@0!W3u|4g)1&Z@vG=jneZvMKiQ-7tFPBe0-(w;FZqH@qjy=8RTF-6pJ;K zSpI+QeR(|8Yx}>5LR62khLbv4WRJ-@bwbKg5+~UkMq(_DI2lV(v=}PM%rFrSIf=3_ z*&@PNM`Rdljbwx{wwUkzp;XUvmht=Z_d5PC%WFQ%ec#vTx~}_L-fwmhJN7eak7Y{D z|6on>OrogHFoHN|q?^5RFyHLcuxIDms&$^;}UWuD{N*a4(DCyR3!BvTZ^g_tWv zVrxL{$BCUlSJak;J!FWU1{hD?L0gUd1RS)wA$1;kgD&PIF5 zP#31Y21t6SR+2sICyTEIn;tKXiMN%SMLG*PNK6@d8jlJi;{89(Punc5pb2%>;L}ps5rQ% z8#N1bm1ll`SZn*Y%J~E~$oYDW; z-MYvMhzTp|KpKRwfRUBzxkQ4J=qHl6fkagHQ5lr?3klW_;B9h^Vu)y&%K()G3=?R^ zFEQK|E%QTzq{9>XZNZd^j3=850RHODY+yz3j~?f=>&48w^3OM0Q*$!AP$vRdyfqic zL2`eXUp1$WsL8IRut~pin;q2*5i;Q0Wk!TjYd--S1Y=?SrcZef)6Q^Y4!DOEc-Me^ zA9S{`QTq&mI6a=(7G0y^&gq zO5fntFeQ5|NjF?hTH^k=d(lzWsa9=E2LHV;3LNy(K%%dF)Evx=WZ z5Ypp#SX&3%GmmcRI8h6+wDIZ(D)5CG zd83qYDhY~S5-%=6>?qYDF~}*6YxT59(`s2lIDuWp1+ub#f*g8HYN=#>&p?X>0+=opI_7hS zTxfi4IMfCIw=@6TIgmzDn;?w^0hThQ0BQLcVgT0W9MJN4z#j%L zMawVXQvvkl!ANJLc?g>FoEuM#^G0bSf}m>*_VKS7st`J=s+g*)0yr(eN}aK>r^LYn zwL#d%;U1tS#%VM>1r)}F)B+FHVQ<+bVATTjU}n1MQ6IJ6#_UdHJ^}B_Rc^V!I@O~l z!K301WKwWQ$!GZmd_qHCUXeB>Fn(lpZROGJU&Si(md&L?nCo zh;lO79d#_$UOcS8`nU5kD_pk_cIJ}9|D}TYn^^-bL3^bWv@ncVsQGMm=y-th5~uWU zW3MozHrHf-qxy>zhw`+`*XHilDxBsGH`~3`!4>BbP6wHU9c@n~$**xCzIh1>-%#Ct zNI86O6>g}EL@pQJ@51?8VlU0xySxE_HJ}&HO}CE)xm-z3b2|>6fm|n12H3>ejj!rZ zhfW@l$9CeIH&eD!5dDJ=$tX*@%m2ljr{IdaV+0HAyjU3R*Mg<_wa@xpGzv>bGDPJI zU(20d)it9Iph-9_F|36e6~{RchM#< zSDx7VTUfQsYG7pC20j6vvVYPkD{x8Gq^l3wo{r82DdvH8v#ArSm@0%r1v^m7Fs+ks zce1TwLbRogCH5y%gWIxuavC@vM*t*F$Upi@b_60%&^G>?zw}+5m?TFIHtJ{|{7ePJ z-ekzN8mZh6_Tenwd;n7+c`=t)nqw6=T%rRS()s3%OI2uK$8N~KnyYee>vS>%a2{lu zHiF^iUG4x(Ez65@B#CxY(VA&@q@z)6AgJc>KRW>{ttb&?M2#vyK*5LkTukmY-??!W zEtT)rfNO~8G+}`95M$C0mE(=OC#z z+x^_rOCLIc9m9mhXBc?OE%LD7a(z*cClM6eVmne9EX{)1#!;0POEbUDiv3=;Xa;)? z=Q%pDL!Yjy&;jcYF7c08UR{=NeJ3Tm6kUx2)nhGvc1j%}1b572JKP|z06gzmL{cS!oWaZZcur_}nqXyp6Km zUygHY+%G~0p%YTHf0$Z+1?m)AN`$B~#(}&utK|87k|G+87Q1nh^%MX6F1uRi875Cy zIX4CbsGA%L0q`W^en6Ce%Ns&n6@Y^ZPiWl#;SQHmOLY~!C%J1%k@ZP98*^O{sTnpW z(FlVLfN}{E!>r2H8cBN8P~V<|c_q3C%BzB}=d<9hkYkqiFq2NUxHu*~V5#x6Gk5EQ zDjl$!d4^};?Xo}5NK|EGo)#R9Xki3EJ`8f;MU~{ci+RDjg;)?HUl2LCyA@d#R*+m$ z(jBWgn>f^gzFYu`7A(cWK~HGySqcX5!lZhDBn-$+0KZEXQ@hPXl?AQen(S|lB8tF2 z%9xsx_h-%mmWeHz6dQ2ojw&O%uUQzrY0T0_F;dzHZE&As9se@CfXDZJw14ZHU3jd# zM51zkpUubnFTRnbd_i0O!Tb2$FMo0&Y2ki-XV*zIzod3oTAEEUB}_t#5+(_^xt7+8 zx#k=PZIkM7iU?A^=fKh~X7=+$WAOhn6)bP1mNrk{c2vCkL1KZ|tt-D{rrZx?Zruw_ zuibD4H6sJ}3Fwbq1xUw=5I*Fmw>8M-1l_$3jOgv9(jElPn z@go2Zg+Jj(`0J|*g8Cn4BnjsNp-?m@RvR%F569qV?3edU6<7(GfuBDh9HnO8d)od` zQuMu>hVRY}Jp{KaJ25d4M|HOeNX0@33jc-D@wYJyLw8Da(Dxn3f4ebWabnS{aTxyn z@tS3yi!K4@1c|w^9x`^MMC%)n1A0pQk%J9H3%CcUEoP zmshyG!Xmz=#j)W_NgR0jS}nL-JGfjY7t(085A3zZXvMu85!*((i#uhxRmZ3wo+%lx zq!<1&i3@F*qr_pr7haLsZ}Hxh!lZ9`=A&HgAC5>)l|Ig!>E`lRlDh7Mm}d~nr{(X~-Puu1 za+mOz&i6JM^JgDYS{E&EtLQ(^uL@^&EYPNp7u$jA+0B)|*9~!@&IZ=cefo^fSlffA zkcI~5ro@nCmmij2obR_~Iy2}ULeS4ra&z0lM3kF9x622hBz(vAWSxIq*ju=^<=x~3 zP@6b0J80XD+Bkrb0L+6v!`-M(@3o%R6;c9tMuORuo32gqn~|f_@Us3gN|-A+fVB6CEQzxJMUehF)WM?Jtc z$_*uuAF>O|ipT&ON%{8*>Vi{KQ-?MXZ+91Saj8@95;dlA8@1mj8tWfBo#&Pa)pshB z7qKvPoHe!wVKC;Oh+vl$s^RQ;m+APp>!bj<{ov83J=KTVv)E7rhDmi+WeNnCyQc^0 zkNVhvWTO~V$t+UWgZe;o7U40#H-a3xFjs!@=BOa*?ZluwLEE2;v;F7Waw!|FBJ+;| z#D??Ao-bPMM0!PuiU_wctpU-G9q5DcHH9I%(n=$`kJ)#;MAj2V?}rs!95(mxQML>= zOXBcS2PALuB{)~}bStraPV9%zRgOLTa5?FAN0wlh%Exx;8SQ9!ODbvK!Ch|IJx`bouep!Py+6>;)d^B`!S4)weO0T+QLs-TPKCNHgAAyZXPg#9%y_I{s@XT z8GNS@p?7>ejGVKk4I*D z4IKliyqDA1M^7A#Bhca=T?cmF!%qYa@^%_8mp|lCv0*Te{4tA!{Dwri%&8NuNZHxEh0r*jJ`N(Fx=5I}+1wWa(D`yxPCWjng zl%F&1ik%>Cx#QqMx+a97;f-NaFdVylad>g+B@uueZuP)Oe5XAf3_5P}!qEhMx~JnQ>n zJ9xY964^E?XW16}*6Zp}#)#pr%*4AD^to5~4XtaAuAAx3^goX06W-#bWG`p;fM@^d z*O!k<;@cf)Oa-BE2`!1P{3{)7OCyn35ZEHit9}pPF8ygwBR;DsR@+~CreRHq53^K% z9ljtEQk^4bg|#L80u|h@c;PwVzS;sgc(Rcy>KZF_foYDNHrSE7ukDoeWJcRo)}JIuGxFw?T5)n9C!Vi z)?ZpI_?3Wd^@qqSdo1g?Hl$ncKkc`}oDb)~F<|%hdSiXyLVx=q8+tBEqo=-<=ZsC< zZzLGnAzpp^kkrJy>m^h|Bscn%kHRzYT%gG*w_Jo!DaPVOc+(W)b)HN5`ML=KA_!c9 zK7Db`fP-U=el&Tbo>Tvgl>3i>UXQPE&%?mZnQ8$bROEPqWBJrRpgc6Z>HHt8w#;l* zQ89|tHHan~ojP3sc0hS-U3}zt4Cyf244IC#X7xVUst4Dn# zN|{u?JkbZ?eZ*I-VQU+fnSlw>MM6{i0J(GAZ^SJh4 z(dYZj*gEXeFD};&o`Vl|AwG+|k28KyleP3^S)XaPB%+IJ78dEV^aa~yv1`Y#b3SSq Rd<1sFcR>`eh*`9wSC1OIKKh^puDYWpt^5gSuEYI z%|YPbG_E>k9{cuzkmUdNw?Yc+_U$7*)74PD>T9(?_?F1|%1;IUwMx-msn#myJUR*n#1+$*NW$QSjuv1H$QZAbUcyFw(wsRV^cfC8^ZLj z|8apjZ2t9k@~7YKUjniG@PQ6>hyi5ep{h0?Khef^kcfNluv9&dcu zy)xNaznPqTOv<)}Udm-e)?;nPpoAeqDR8(Bzf?OjSY``a}4 zppNl`kCO-pQq@qoePoUM^rP)=NYG?b?!MWcY#HUPM#ipp!3Vknaig(jgIXhjK}N;zg)JBh@a;IYj$UIXFU(&^@$8NK75K@!toQo5rwVVg?)bX zWeQMYK#4L!;ouM3DkQEW-V`Ke`L=JjgtUR^ns^@xj_k>l_vsp{xV?CGGU<^@n7CjD z@?L(i>y;~sLXptTitIN@nJ0eOyG+Jh%$*nx8JE--*+Ihr-}I~{3%H`_CxGXfCTjUM z6%sJXG1C^$=dBBEsu2so&@Il<=Jktr=;v4p7V-V(KsNWCt^1g?7HxE_nvsmk&YMf4 zPASW(^%&AtENPj)tg|JWqnj16^&Z|n|KpYoxe7~gm!&-=;I=ZM>9H|)4fTUR9^&Qi z%s=^)Lxp^O@PF>2YI4qI6%Ns9ivDm%N5`_WKdlX+k$`+i#ju)t!=ldj*v{T81T#OcAP2ky?j>GqWUJc@A!VPbeXf8 zi>TY=o#G2!3l1R?uuw>`Ma?bqAI*~AAbc9eYfPF{CL#gTTQ5_PA}thM$M0_gE{%CZ z>O|~Drug|UjmVWS=8!Njp3NP^`ZKXK8)R5oE4P2qB2nIF>D=0EkBraK$chWyWNR$M zU!ghCNXgMm+ihNR#t;?g$2NG{b8RO+51u zzy@|`4nGWkpMq(V3=>bDjhaqAYwpmn5)G+*4gHv_X(gX!{-<|9H-~O#jd)9Cmvx~@ zL?3bt``IRM@(MV^Ts0$LtkwY^>2_n`6}Nky@DRRgXI%Fx>Il=9eKwa3Eu9S&F?S6zDz3G5WHsO~*?{=6T> zvGVP7^zQRC1;6r|KsXdPQ4yLj5QSJ(ZjIF28$+klMK4JE#d zYm95U*`6Sfr4oc+tg1)FwZyeDp?};x2?v>zl9(K$5ERWX?6%dC$9&L%iy>$7U7wbN zwnLJV?%(O|sq>QZUfDwId?`^#qc0uV*_b!5waxRX?VVJgnkixJIV#Cvd^~(aGpwvq z^#NkJiEhk0QyDszIPE)j2gVQ6hfYKY)fpd+YhhH{$`LC5F|zQ}@fXX{2g?U+xvov} zkOmWr0rRGyrk3+{6TA3g6+Q{xRh4tEuBjPP*yy`r_1q0eMW~4Z1knp+dlJby)M1Su z9;gFrhLxTvL2~n`ZDo^oU!-^~B#;7lo1n`Nd3yF}?u0GJ3a$rAtf=a4JFWGNLC02DLiIyY5dC0F6uvH3PsR)$tg?P5D*LyEM@j(n&`M(|w@%+PaAtpPjagv}b&-EQys#3QYaM?1DtQvn@ zu?aH;OAD_pdzC~Z*BmiR!S9oK5Q#{z8nqQ>57u2GqDgqD!{YFpF|Yzvhtdgu+3Wy0 zdhr!5!8-LCT4$E5fmbCBcV|9i&Tr^>uaUFro7Yz;&kKG^Y@hqlRQz;6;EQXt-uaX= zJS7?;dQoI|9zlGy-Nf23ZUCnWUbxtMfEwhx__ftNwU?p%`johx=-ors4FN;7ixk_B zh|uj6sAH#=7Dw}vNyF+u_eHMqm%s<@H z6vSeoB!6tsc1XL;p|6EkUfjd0X0goC*FKY4_H~hCaF&uxwEv{=V}fX>jh_;~KT>yZ z<7NHyLuvhT!J+!?9Io6W54^Es^;W{PRYmH;%f8#jN9UVuk0reJ6|q|gv*+*JR5_x) zUjW@;F{{6>cxdatC3qIO*jD2Tv8h}M$4ez2B-sfsYb}eI& z-2f_7$FmPbCY>>P0!G0@Hzmqh<-He{8(5J$Y(r53ddaCq%7k;3vGMhTb$%5j|79hlSzxA45IGf;gB9s?~!=fSPI{l4K zUYiSM{*iW>bgZJjLU%P7nRZgdtl?EU{o4x_JzW?iY!SG^W%R8*9D-gV2wZqKOP4K` zdtf&xaJ5}%^Vr9IF)YfYT@PRgt_;}9h#8{~c5EX?K5j(EbDyfdoCWnI(EI~;Q=Z4j zw>g~s)YGM+r(j;Haz%_CHkQCw58X{!|Mit?rixq-&JlJBE=QS1%1 z0Sxu;OMszvfV=$rlJ8#)(ERHb|?*E(c|1A8!E%7fG{{OMl zdESu=Se+7YV>qRZ6u%4w5S-AP6K_oLvq3qc!(+a` z8!5D5kCDE4#byyZiRaBfFtN+e&L_bU>R(DuUmW>+( z6^{?Mwpoqm-<$7${WK5&4gg;426(G_gbg8T;h>WBRz~OsfEl(3H{RU620(-K;K^on z7-$bj$TA|gO-%u~uwOfLGKNLSaPNLPeNQ<>gU`TbyUiEucV=2m5UXd!9Lv=$qo8F?(NJy9rK(SK9?NOOjqhk{&P!1iiy5CAK( zCF}xVSS))#JyHtKr#(=s1^qo}BN*bM*HB3t9{9F(c0` z7+pffL;&nzmo*$IwNWRdo8UF^jM%+pxn7lBdKdbklzbnTNAA^>+wQ)d$zRpOaveZ) zral=PbRuV-(j_PLQg>ebN@1dGc3qA2k53K)pFFe|@N6t+-nnT;V_8}hB5HbFjYs56 zd`?kwpKwK;2>MiWJknIC-%`Y*n(6mJ0Ou7@9)I(zdbA`1!x^$a*2@se@`SnuC0Nuu zH8qlurURdzodH;~1CRPSMJazDiO9RNHC0(7RA>6TH>p1qb5a=?q;#7@8k`#Z&<|(k zt?_Wbr%qxX*GE3H=5B6Bpa!_eUu)PS^*ODza1CUJ2CeFkNz7>^aCjS z4wvRBe?(+IVWPhvtYVhmoy9} z`|!>ttL-&^T(4eAu{Z&JuV(~c+u&NT-* zAC$h@?~;(U-is2iOh(Vx-0rc8L&Xa%yuM$MhBPU*I4^bkgH#}%UgXC02|%iNTISGw zyyDh-T5LnqLMs446y@staZ6+faBKEM=1g-03mKpsG%RpaVeW5jb8rS2;S6~nQ8IS{ z?3!>O&l{1m`+m1KfGmK8m?{IAzK2!mwhj5RAcQn{_y_=Y9L8l=`U13@=% z9Y1xY^xno@Koa8$d+^Tbpj=c@+#dERIa+?1ObA5+&%}4=Ao)Hma4@P4lSv-`prmh{ z4HNm6CmvF_Q*Qky#1d9r@VTcVrkqWH&3Br(J1Q zJ1^>IN_KXxMyqkkMS0yCeJ=^4YkY!yd$Zdnuym$W)YQY2rwAZb`hfz$2_R_B!@Pj6 zcYv=g|NS-Rev=;%QeBi~-M3gSMVpqGG`1U}Ctq^5yaf=j&CWXerP2iriGSt}{}-6( zS_*QYgssB0h$osF%ojoXyBt#Pocq?6l`V1mtg=$pT@Kx=f6_&NkW$~#)GtCYaK~DY zR@sxV+33<}{?orpL`A;r#CWY8kW;8ZfcY;2McGf~&v%aM7YORAB}j~$rwwyi@gJ_v zcQ{7{gg~`RClmm&@28OdxBS;jQJ6N4cFGlvMrko0{WU-LSM;d)WqLUWO66XSH~NQj z+--fk~EMd@nw+tBcaj1^CC` z<0T7TauRpf>)p2ox&Ps1VTV4XAhTUcGymBnEuFAQ$n;|-XLXLP@DNC+7RrtUzsg~6D57*86@UWiHaVh9y67&Tg{7;_LUH7e~Zz>>& z#htE4j*W}+CJSo$M}B|nw`1~Zddk|yjbzv={B&LMySlYZ!vE&ZeT!{NWOZdo_?U*+n6zn6ON z#j5N5>n+0{|BA-~;9m$C=K_LpuYQK?C`;3!HjIR=(rUi=V9nZ<&lR_MJeEfMu*kB2 z?bDx2&?k&eKYaeY^SOD|SQe8OX=O6{dFPr~dP~a|^@Cr{LX(F|k}Y7V@5ESTGlWk- z_ZrCBNzwshs;u;?$v@|z+FxY~!?yOs7hQO4>;`|CD`AJhh^R)D7dTk@aZy8Tm+c@7OLZ4p`q!-$Eb9^+AJv8ZwXvbmKLxc-%+z;;eV>FPP<8BC;O3sMp45 zUBMtXwv~qtE4sxTadmpRi#M2)oA?0C@2LKZhkQsdNj(q)R9F7SY%HG)(xp+IRL?mD zp8=-%cd93EP3EeWs)xEF%v>&@BnbS zF6tRZ<^nrY#AG6mouysWJL3&OeG=p~isk9;A3N8Zf|Ri)+Sg9AhuQ*^ro+zqw=r}n zQP%BsZ1>2A_lvANAj`1JK|k_?>{1SUqstmv{GopSn;)z;4V#Ps%oa)}QW+Q+9wQxt z=_kr;1)oH+ilqU4H2&;OE<-e>fSZW*#srDX8h;I^3Fq?SqeE06HQ-?Sg z)IsVCFfyK(eX8X7_0pciI@NX<=wE8t<1_QDk8^PBtv3+A={GcH6X^Ipi4Q-_KNWpc z3N;Lg#?HQZo;zhCX z-S6Bc$l@`XAhI?@xwQgnzZzK@20Hw%fL^?R`cS(|o8|cvARvlK`M$f) z3v}Y#WV;X|)?s)~dPlu^rpxMU#4Xklt2*Db`lDO`C;FcZ=+$RM&GDnbAtSZz(le&w zFAek)?&Jf-T^g3Mgl^(So$($1<3G@;5B?-iBaYl(A1$-3@~gRR?LpiC!sCkFWAMnOx6X!jw*l7cN0T$cY>f0AF9G}<6`Pc(L?oBdK&OPn!+d8MB zBF$YHEq7g?Zn(s{EIOa9u-#?>GK6D(5j$*{Aoybx{VsK2LPp;Db*?W;^^)s7Npu}n zb#2Fq&|TxPsHdSq(UV!*_DVa-o(jZvx7ZqC;~%)WFa*g8$W5%udXY8f90OD!{u4h5 z!es1H@QBk&N{A^gC6i^Vn?V&{lL(JL!gpRSU{0qLD*$q?$mBQp$=m-D;TJagD<5|GsGLIi3o#z_Rvx(2LV+c`-9XQoPgo1c z3+-Ds(Ry8kcisu-eiD5CP8W}S*@oF~gkN>jxsAG6 zi4-E^ETqfwV{CrA7tnqo;REImnl@<&;KaQJyZUbKN5q=Fiq|m!#eT(LaY06GpGjgw z67uce?1*2kR)oU0{}O7vcTEBTF@~a49>qW5JjScAd(c+t>kNrB!vastr}=SD{(T)~ z0jhn*mmK;yMuqFvdUQa$blk0cL74TuJ~TFNl?A;@(&o_R`n`2lb1Fe4qa`+M7M!hLJGSVd!L)R}{;rEUVZ;Wt8_ z-bt8PCY@E{8;@wS^HSA;8wr--`9O~Q&(4NlRgD%PX!&WT*le!yXwVhvoxoA(Ee;(C z<9K8%j;f@6X`{v2`tXR7SD&cHr=OIAzby?0?jqtLq?tM{XhNcb(~gZV>sG(kNa7%cX7!z3M^!{p(>_++6sZ^E(Pb2K+OgM`^sOo85&&=f*EU$SNhETA`7AxlP$TGo^wd^PExI2|gHrk3opTzNUZTx{I2kufMvc53$;c`fU=x0dfJ?OI z6NAiSwZR8;fjITucmHdbP(cBw(g0g{TQ>t-A|y+BEhTL$8GIu2lsPC{{#%`(p0jPt z!Mt6#A&%qoFhJ@Y|Gg)pIlYX@3=SWudM_Q;i!~xj@>!QNXRAzyT$hVzQ6=MKxv;?5PMy={U8=XJJ($fJaxff^9*#Hy6B`r4!Em z0y_V-jVba`2j+am0gUhKcIhy2cojk)z~WTK;pNlItHO;=?rU$sU2eW6y$#S;06hJ( z3Xm7!wAIIDZzV=Lcpf?QubKa%&E@oI7;6+L#8%=t!)nSm;uVw%?PWM8Q0k%wEV(Ng zj#V97Nqz<|JFq{(ef5$HwG1k3{m*%GjRl;*(kaqaGfjUpFZr$K2qoRIqLZN#(=d3>iT!2J1jTM&4KPWj&9pnC6|VsBuEi05Kt?nCQGk)gMhdA_GKe&YApHV(izUzhV&&wo;!6*Lp^!}yM=H|L@Eh2V=3XpFH z!zii~^D~_)zfblIVimVmJpg{FUShoyIEfz)12r|vJj7WaY?l4kD9-G+gnW`xWj=Y^ z{rS*jdAqy29mo}#jK8=rHIZligR94M$F4gJO`~M(O8&)^QoOsMbbYs)m-> zdSNm$o#O$)JoxyAS;*e(?Du_?2M;g6%b8C}?O&mb;goX_G|InRm}LOwPG20 zChgg4L+tsr|Du9lmXHhJ^ReI;y7Wv?w$@kB)O%8mY&Ja*-)G&;HK8-$Jmgdrp@BPg z5O}H{XvR&wS?qAjzrE2TD)0*lG{1An^=SzOYwahMH=Hi1OuJS^*$|F-jy={UW&hYR zON-HY()KjIPDM~$^3i^Na+O?9vg}oIZhhC`PtOE@Rh++{62D8` zNps{bE$d`|_syZ{L@*yso`_tX&y~{b*sy>SQBIb1pCcpAcO&#>oo`Z?bH$hbU5hkK=%dUIOH24?{_c5%Nq7*a#yuW%DzBD z5xEn`s$bj%I2hE#g4oJ-Pdx%`m>)>X(}FNYEWKe4fb^p^!*4vueRw6A(+Y9I*FZFE z7gU_avYz++miBmG{J5N+h99EkKA=s?T<->r(be`3Ur(^VP{%ozjsK8?Yk2|B|A$YT}kGA`vf8Tx=~pqTPCBFj%e9qdb;04P@v4$=YbH}^K?_LM6? zwQ^XS>3;f$&eWYCphs@Ei2}~j-FqNQt|s4UegoQz!#0yxZXYvnkq^E*a&<>$)exs$ zXJ1l>ma5Fgv^E6dyMU^m+*R~`VnQQ*rSDsi$5d~l|4xrc*6}(A4wI43*0FB)hKk^` zB5pyOUwiEnss3y}deOp2KSn2|9U_WsyFM=KhJu5i26FL=#s+mmdz99|9-i12Gb43w zU@V3OB^@&MBKeOB{%9nf)ELCyD*N>frnmafCTCtDoKRsi4NzLk=VN>Q%C$aN5V>Eu zzsO8oE+gcuxe`qh;*L6csA3jX9&UNPHVbyey@#pedmuMHZa%Rzt>X7gyBGQV;3O)m zqWMeg4oo!t-12tQ>|Q0m6`+qEuNVK8*=x@>M9V2O;VV&8!l$7Zt6h(q?+zv{yI7mD z>OTp?ZtPAwaeZ&tvM#HZUW$g#dO5D-_u8N4+9Es#-}y$=`6{__EIK-R%#E7gZBIO< z6Mu}PQE?D24_T9fwFb(zlR3dodT#NX;c^~=Y(dnRNZqf;IS9PBJRHQTC6PE3v^ej!y{<1ifFAr^Y|oL4At^<_1DLaD@rt!fCbE+tEVK%e$zkq z_U?1E_s*SO_~O`V>Kj2fvj`i@hqIx_x4+D|=q+zCvjgc*8kiMha*|FPaHh}z5%jR` z0y3`Q&@SmNwrY6pkotN<-=x>)KF^_f;Mhl*$qUneQ4U%9EwI_~M&wMA6~SHEn6;iL z``5H02ou`C8D-p4a^SdlU)Qq~IJr^5Kn~r@=Fm;t3SMkDOu=RBkfCpdti*{qM91c$ z;Wtyi2i?qp(Re56o3yVYg#ZA9lX$RQCJ6;rr9EPatEs9N_#_19+^95G%c(*>`C~bH*PX z*k|rAe*fvr&c?|8N@SKIzB|##Q_`ByQPp+D$V<94CaY9&K=@7bB>SU0kD zpx-1xXHak{E&z~x{Dg~b#M4VYvdaRUg-z#LBkB(G_5`#-dd7YHPRa$~ibngIe>}SK#_rwfpxA$ zVEX;+m8K2>Jg7KcLCOum?k-+Ir#P53$4b1Ee zEM1fm`{iIBIB)t3dTVjZrIRgUYI%Far$E6(qbGYP=5)EeBOa_$lxF+iCufCNH_A`~ zNa2g)k80*kocY>?$~avv@GPJ==$vg29U#q!Ns&u0UMdAH1z6=AMduE{Vs|y1ZCpHn zTA-K)peDT^qt4B6rS@}N*Fhy|Ty;hqjDuR8wVAt{xU4dUA>MdSZ$!4h%kFYroXdeA z`8m$Nx0Q{s5z|Jq<9zwJ-MmE}n136vRO==s9`_ljTqt!+L;&pztRD7t_2x3?4p3w! zH-6D;+!2re9QwI&@kmAEDcDg=|J@{6uV(LrqE9x{%e|sR|8qrflBs;zNiA)=C=K_) z`uieo(q`;E&HB&*=m;y6Gpd|@w9~s^?C<)@$On3MlM<^65;4_gs@mQttpuZ6a=Yy> zZ<20#sU^&d^N1L%ZTG$&5ihnK8yT5sT*56- z`CkmyX45rxRtSPhMzt^laBQiUTtIKyNBO&p{gE|T`7gga-8=YPg$b(TRF?9AfOdRxDV~z=SmC+zy&6u*^~Vj)eYtpr;_5(@Ks{*71?l zI!^)!_ibMVR7jwVlY2D-0ih<2N*~#`kv07W#VUEV=6c&EZb!2;aN0_P4gV66HIPA* zZXvg|?T9i3bihZZ>o&_fh>hDMY-uq((Jl!j1RIrx=L&ppPp+^%GJlfSJDY zKaCqke_OpIzTL+G1(g3+p0aWZwxy)8<`B>B0kAE%kNE>^`7;*q-h6Qox-7b8S;286 z8T*P}Iyj>5yekbW@gtS^oBI#PaBtCPjA*=%vuukSJ4Lc929vh1eyz=3&nZyWRn z-yZ2B<1^9YAwEO=C{x=J@D0ha)CTA>ptGCGwY@*|c!Wtbi-wzSBjpMJe-Fd69M?J# z^cT}^Zjs}jAqW@H1%))=qQIwA26%QlG4&a|w>kmkl`tDz?J0^wos+A!e0>k$!Z0fZ zw>UPX;L^i6fiAxCU*>AxCKP7hs(O*S?n>^uDz#udXM>lNY+>}tfb76`*4_ZWd&xEi zO9zLx&fWYZtAFY75&aHWmv_-^;wjV}-R+QUV47I(RV)0f!0hFUvnxs}<5C)udawlK zix^65=h4s3w)=O8W7aNLjZkq6z+{Ku#}u@p?;BmG!jD&|2bn)}3#|;`X$#M|fXFfU zdl!$oa9`Hup0b0(i>`(k7E$JlK$0w$kS#oWHTx4eH+ANQs2@}DqZf~JuD6849$G(mVYzq%9oe1!Ye9sg{;wcNXW8gtXK*{^PsQiU2 zf6`snaq%X5%jlvIJa{Tm2gI}6j4nB}YfW4DK2m>4@Fr^Gp6|B>7c8i?O@)>F$>+$Ap!OBEfCJk_LCw zEfBXj=7BDVU(dU5THG*h%Fc0`9>sQ8e_!&t#{BARgN4>qXTyb)@tmMnNv8B^G!6b* zlGV?O`SQ=p`knGsLM7wDZf+H^Yq#;%GRj|TFWnmSrUVL9qgLgWGaW#?R8K9RVN)2E z3BSwnf*vRIHh~blgXFIOrXIyCyPBnOcGI{TQK+kJcJ;og`{2`Lv`7XV29W&eG?D2%rVm^!KzE^(46&>ek>y;yW9kTtd{dPDo9 zoXGimwF-6|7vrAMyVxytP`aHG+i&4GAl?XxjO>dI5Y2a42?jUrkh5reVK}Ff|47fe zL82%lRge6$*<#ukG2cGQP3}sYJ2Y`983HaDk3?E8qhm+8;S2)rD6=*dGX?zE^+2`L zmYd+RXgRwOJ@n})*BTVF{>?{dZH&f}TpL{V$bj(Qh33Leo4%RHiO)`LfGsy63`_oY zRp6-bE{7PlwMXD0W#)F9!X&mgVWQ;~cGf4IUL{wva*RABoLn3cDVDvt88m|EnS?iD zKGlp%nDmtIEkWz-$8$nyO&Xr783GAQ=C4)4P_sd<5rLxs(+_!d-TS1j1}qNAw!tfq zo@>SC?(_=!wo$r2%hcVM@L*i7nosW1Eeh}{vCEDCAIV|QQL5PV=6OyaK$4q6|I0H# z*^{`dq7S=u9$bj=6FFDy;ffZ=mx%co)-b+P|*o9_f;?bEF}VCaM^` z=9F7(-hCz#Bv1it#y##cOsKewzUk6%3%i}?q5hY(oBgkMJi1EvLK>HKO^*P_i0y!V z5%FE0c&AG7mTcG7-?F~7C^WOZ1sEwk$`w$M?v!}8N9EP5G5Hk*`th9>KS{m#nQAC( z=R1k=*8p?UORmoSo-1=G`}@i9tTq>mI~;ruju*OHYh)(qfN(p{5JtI%k~0qJU*1;k z>(FY0k9giapeMcl3Q@)&@ohU5O42=8Zfozoi?gm|Xx9ZA897-N64!)Z54<*bR4%eg zddlS;40^XJ4DRutbvT25PQQ%0r!a>WOv_hqvk8Ds*0bSq;{uJ+HF<`^hFSDLu}jks zguc#cmAFoiNMmRX=Ln7dnp1t}R|*TAmw%grj8l*Wbdf9q^w4O%&dhO2`ilG7)4T2C zLCn$A&bI@Bke25l?(nizDgH_QvufAVgRvZ}LoLT8mb{?y;_PvqBIa6@8{v}^{jnna z`uSPYPKYlFQ-b4KtI%Ai;a}Z1l*R1DjZ{C zzUVl8V;t~ih=JN+`fHDyBh+!(J2<^sEkE|=1SCWW15utkTU(iqK7nb@zw9Q;nKq-K z`X~W-UXzFQ{@yh(u{+yB7wdy;IBu=(GVbEFkEXrro{Jx>9Q5vIEt?h(Lv<)c+)!qH zb9P$EjXzM}&KaJSI&f)`+uTXMNd-`LHfYIQC#X{sq>+|?8aBF<9$s$dx zcjAdmz|VEAfeU60j)0X3G>cS0nMX7uH_|= z{fb#*HuCzVh$iuu@l;dt)Box(| zP2H(+w)OJ;K7d+wx#gdQ4-)TUcUudyJi%Lhf9OrW^o%do4DlLQ0#?^*JQ#OQML1(* zt)76H59W07o)arcovDiNy3Fb>3lF7%{T$16G#=q^tP=7aF z|Fna#En8LP?F|Z{@=bBft>cOBZJ4`9JnGLc)~kRH2!knjjU*%P%0>Sz z^h8T=?!pTVdP+|!zy_>Qv~Yq;+X`QdRBs9ZehR8v&(mq4v|y+j^sS+mFdDdotqAul zf|2=q0ZjYp3EtSW$|cWl;bUtz`AF%S+JIFJPfjF!V79MNYNqCcVqK6(RUqCF#qvWJ zHLz34yQl8E0Su5SX@n0ZQ6VL`@-Ar0?irZhjQ5&cz**eePJg8$rJF~@ztJzD0oeMK z($}cnc0%J`iO1#VmlVz3Hzy<8##Uk66hMh(2aYyF`O|pzqnO{q&@e* zD7|DzI%_mU4CeNfHn2ecqGZHH;6R4wc98c0f%s1%M$6yAZjQ1S@^G7hI^W;oXAQyh zYn43S@8D&I(^_{Nt*&fe&kJ%T`Z}%w8 zjMS`+!ECozuRRA2f7TpWLs>zue767m+8knZD37$YqV;)tI|XxtT-iTPc2SEEI08{5P)-}N0 z88^8ucc@iHyjC6x<1~J_l@|nm8U$2X61qH_nj*G46wOJO&ZJ~xBNnrJ+alS_3f@oK@h=%9U#vk*#M^Jm z$$F)fK&(ftK$HHIfo@`IaW9`5gL(+>pw_(jdS+wO>U)KY^@~YX9sA;^#bYwdM%mh# zTV@T-3NLm$t+c-!mpE|)$%aB_k>C2p!c$nKYZj!j()YJ2h^!U3e)4q}L_o4cx&F=H~tE z4yzaXa>o{c;%-tb+nHm{6?R0OS)(zt4aD;KsO@CaO*8$kiE-uA;({j4(se*-cvH1S zd^lb;oCvio z^R(gd{19&-Cx5acfG;7B#D8gzzHp+j!zSZhyHnJS&$_M^v3mAbEEQNp=KE#6_1^Ze z1KDcAUVe;3BW`h070RX_n?K3XVkCWw)L+NRW=xG$yeI<0_+=PdzqcJK6_^&)2)J zn)=HvEX|%-oXsd?t4@vLT?;qw2AUVuo^gsM9ZeT>7fFu)crJdb)cnI!Q#tw?({n(Z zkWShVa(6?SbO6Ql0M8X4uS-%eoZ2jNW<6;$YO@!mUQh~VsUM1a$DpSKucG)5ZI`-U zYQ*C05wR;#|2EVOxrKhKq=LSfoycfLhrvLN`U4)U3F}#5N z^3r>1{X5s`!&S_rzfnfYbtE8-dD!ibth!y~P0b{Rw+>bheY_omYEejzVoZ*B@-$N# z=oH$}J}d>>T9kAg$BXS$B|a!}taaH9dXtFU;!bD{buOfGkz=$wpO{;ah-8a6Q34sk z&hYEdJc;USj^-z~+iV_=DWsFAu0V7F&DLR$;}Z^7i(flrq3{^|`YPahUFEmTDe^8c z|KWSpL4+`&fEAO1$DA#&dEoFOu6cF3vm4N9fkTG3*=Td0K5a}yrb~lq$x^24%0cS* zy<>r6_5R&+UtX!>%Q;i7%Of+v7U{c&U&}X+@j!RWM%^UZ~J7Vu&= zgz@4@iyIOzMgz;4XF-cnCNnY824@`7J+wg~qAYuYV%bUHFk|h?cE3uNwFOzuRCC+3 zvqc4#eBeI(R==#e&NtWb#)b2hVizsax8S(J*F8ZpmDXzT!`RSL;%;>YO0dT0F*c`v zmY|C+j`ioORKEDVfg4aVtL09WxqA)A0ZMY#AyKuk4ef||Z)Luwox`k~lxl>IjLT0u zuU>Fr*wsc!kFXK$n&Z10d;GyZR;0k%=}9Up>!R5uI_1?M#In3#Agi~tv%m8$ycYNB z>ImoYE;Co~r+0v|stSnCz>E5x2AV}ZkG=h-zJb*n46+pLzQeuq0B7oBh0pFK-lhJ2 znp7wldu~YEhQKVNwY|FO5(~6mcSfTKgh=Bp5beBnH9Fov??tHSmB>5oi!4K;5o`X+ zG?sAF@VpD|Q#yBmxfi7N=E>yFGcR{ZA2OZCVL9LJLUv4#1lufhEMOB|fxStnycwA=K}<%=X&PpPlK+ zhQxHyl$U-mV*k|d6A*YQar0BS$?$0G<@9%l*uvvV8>-z1iwOS`ut&CX*rs;$c)gS? z@QApvGiMNv13|7vahJEZw}^{7<;*W;g9hQzw{OQBvJ@0?HCFUlvH%X_A~;?gGj#Ef znw+0RwD?FwN&BGn@~jyb#g3Vv13y@BEXVdXoN@z?E7!L+4B??_c!8zCMD&@5wPBmH zt)a0GR;6tS+iq)LNGr+p$^Ipw8`?DA-%EA|7{Kp2*qjkNc>HbGViwVL*!7mIXr)91mydH=qolvp|WN$1R^TB3L* zV)&1a16>RD;cnE7{3s92VoEqZlUrtK&~~d6`4+aR*CuU|Dt-d^?Z@i7mr>H~IR1%+ zg^y1=S?Od?bNY;*yiFF}%kF+T4Ltojj*b#MF`0HBGUXxW0UxpyvG#}Z(DoZIy{vM$ z2&NyN0sTW{Ssi%uNFe#mBYnw9?-q7snbb3@;uQ&`H6fPMFnY$M)<#=BW%)kVjS~>6 zJU0dLqQilw6z`i=>Kf?2DGKQm-j$e1`btv}FMu!0==+?aJDt3F1ceWL-hdGU=?uoN(01*_;B9pv5@U-~VlvBE06brz z+Uit4t!)#fSSV_HY)8XhU?hS4{ai=~mTnBI>pN{iBxoa?IcQ67dX_30usYiwjYAtZ zFUNg4+$ngFu#GtH7Ki)j-!o!i?u6!n0!>iY>pTsGxS(!if zFQ7^-y*y@=`naM+wQ-w{m=Z+4Byv*QT09~0=oOT0QrQ`Aw$%5bN3=}Y%yy5z9)taH8XVt`_zxI5f|KUKu-oPJJEbmMe~Q;^n6R-jY1Ya9-$wt8IelQih|L&?_ zL9Wf5mCn;LxYJ1+CL6R<(vueG&*;mO^^lq|-Q?azCqd_Z_Q&KO)BXtI1yOadFL+Vt z`bDQ>lZ1?o=#}ZC_hbrF1ORZ#cIlTfner(BV@NxZNNb|WUaI9;wfQRx<|Ip(3pK9*mi$$HHFM{ z4~<~XV=w6OrHEk_EzxA)U81N<>LUZ@W433W9|X@%5|S_P5n1|zMp^NwVBkFqo8J$u z1Ym1p_nJc3WpCc8)t!I$i{6j0l2<=sb^v}hckE{~bd~TZ8yQ1<5xpvS$|Sh$c$;hD z?4zzKHI=P4ciEc)=YazT3$#7%QgqMOb;^wQCwv?N4jH(F(kBw^>`N8ho|!#!Lz52a zRD}cEo5{?SB!5^>bV}+=zk9Q0hU|$mCRr#cbd2>Uid^F*l34`q`58zLz)5TRF5!vg zQezbi0#OX)k{!iKh*|oL3&B$rILzDJ$6_=yv)v@0a9^{eLJs&u}=qcKt_-8a+m@ zqca%Mq6MRuAfiNPNTS7zXhB5pok5U94T)X{iC#t*5m81rBzhza5%RzDy!+kz+53II z{J;3%aNt;T-RoZKy3X@=%9J!n*>WBIo)|VhPAt-+eq_b^ZaF@QLWcqVX~da#p<@6* zx>sjjz_UEX2%p}s-OXQZ=Hd5~2Q90JroBH%hPDQMmYpFJ9{j#b)E(6{5Yc^7)#9rOH0%;GcrrVXDA{IF>uI>>{%tv8nsKaXWB(T5 z{8*$UGBMhW4`XeyocJRk;(2u`gzEM_luX45FEl`w;*9&laxy(LVs*q65-(zW`H1An zz0AGLum^&1fTH9+3|o0%iUuv~xg@uN_PHI3SL}XRD)h<@0Qd6!W6Iy(xV4J8tp=DY z=wr|>+JJ0!WH6I5t((LwkjmzUnz@58JP?x$ZX8j{X9I>b1(PWWlv%`l58>95gzH41 zrqxBuQLt=4fn9R*fFC5sAV&n+&>wch6S@ftQx0ELiNf;RE`$ofBSl^T;%R5hN80xM zm5K)ccf1*;r?Bf9g_#r|y6o0f13KoMm7(+83poV&h3PG-iN+e&t-OwuQoFU>)BzJw zXne1E>5_;WHIuqt3*%dY_$dL)vU|Q9#YbfYwI7m%=*6_f6vTYRGoBvYx-xvCSr9oo z_A`rlrr%GiL|k85{r!WMlgAaKR&qhrW~~&UvrD5>m3aObgrjCNV$5T~k}wx7>=lik zew8Rvs5bHP46kbnDPhDAGF60invhUNBi2=P8{E@mlFs>niAZ)YT9SLj4C?;VVIP4* zoOs+Qb5!@`v`}~h^qGa!IQHClL1}-a*iFSH?0(C56TOu8k0h9i!FQjJ1}@t_%GBjq zoPZ49oTdPmV*EDl#|i%P0=?^^7VnjmW4R|FWA;(L&~GPtmAGxD_cQTmd5Y)uLUdXJye*ucjS(`zJROgwSx0$5zWGqe&GS71sT&wc>08`xj-yId8pWe%F5T3 z&_tkv1%P&6yE^k=+s2tU*+|Yf16H*M3|MHfs>!q4c){N)@~bK8(>(ncG1MOU+dH;o zESo7vLGoDs7|kDkfkJqvm`r_gjT7mO+w8`?1b9*N1x2okn1m3!a%yk-eXQ(elIqW$ zfh`py@-n1g_-n}E=UjV~V`Fv#>8mXLBbFbhfWE->6jPS(A@ zIPU{q3-ngh?dNR#Tt(qXO{D5HcQPSloIg;^e?#v%pUQ?DeHc;zk!tWgvgY<>RF$zp z{zgM8v2Zq@3mBWAgfseKH3-beUl$zdf8vzlXBqj_W*JWhCE4TxUKmmogbS=P?W~|% zE}dGrIX6TiF2B}D55qEbrc*ruQN64=3&x@KlveiZ8%6SmRAK)iI{=z%qycnl@{}vj^R~ig7u?A4-9c< zDtO9XtbJ;%K824+G|qbKQ!RB=v!#yF~rfu{*U_A9O*W$Y=ld-oqi$%AgLg(o7Eu0lM> zLw>KcTnkx}O$`R-^oHZ$R3V=`hEoQnLQw{paUZ03fGuB{^V>m6nvltZ>^ZJNErgkO zH~Eg3dB?D(9@fGBGhvIEiRD)?yjs7tg4s7l_z%eU?>ZP`;TT-k$k-E~`}W$NOUTq? zoyV6iRL$O--#XOu{Oo8u3eb>?MjR#G9~|1$%XZr_9^T|5VrB6?(>P^Jea?sC+x08F03&vN31H;Id*H-pNh?kdvK8+~XdOS&s8M$6P zjG##fr;^jJLY;9=icd17X=L6fu1+=A)#5<&UE`hE_lmKp?SAwy*;s*UL(03ZgOOtJS=>ugk-=0l#H z#OLHnK$j!9DxCwq!J8~f;bJUU{ts`2n+gC!K|bekLxOS5o%s=#^lfTg_GQ6St~sHm z9%XX*AG*N`yLxGj&<}4&>djpi_?LpGKu)O=n0KS{fUno!X7rXl_Z=aoePRz-JK4K#861v=Zxlslc>um9&aGMR<%UoYH$ckl(xN7KW` zI%u40?i9<7_dPvZaq0$!lb?wkqn2C1uNu=mZuiYE?xh|{&!X6YX`I1;+&A%sR45yW zWP-@WkvMj()^94BRl&w9WEbhJJ(X$wvx3odo0QH}psbwTPg@3d@l-8694ojcl%H<% zp0ToF8vZ&wIJ+zi0Nzpg!1)e&gWIc|A*^eCIV9;jqn z%px*i?8Qd5h<${Igtb3bRGQBrrxWuFP^>0tJ`3orN8dKXip@G@L={piq162DvU5wh zT#)x^fEC1?IL;Nx`RtDlXmr`5Oq4Hh8StOQjnSE^vF#EhRF6=s<*^)eBaV@)uGa+8 zKACQPzKp(}*?XGk)EddafP$xw(GGO@A|xoZ#ha$Ojd^0ez0jWHf0w-P4{!4B6cn|Z z>M@MI6&Wme9e5$d#g;P^64Di)?&%ZZ17TxYsG-Mn4`)=8!-Jk0djv5|bCmtzB>df0 ztX{zG=Ps!3)EZmz912VxFt*U<^rPABc;u6m&~!7322xqf`8R zI`@k9nE6t4&rz!KZRdfA!cGVbc-eR!91t`Y8o=!xi&#K%`iGO$3zo#O>|*DCM7Y-w zx7kY>6RB82h36}Gfo8qH{qHaETpk+gu$8Rmse|IAVWXxXIETJ{#euMJJDm$5clX$? zxNKeNv|P%~4+RNuV`uYUIl!*AFS#wmGVdsc)bfT6F#GEx;z0TU7nk73%s@{p}dh&iRpj%cxHu2@JW>0R2$i|_t z_EGV)WfQ_ZqgWuM)LV6dJ}|xIPt}Is7)(tA;wH{ZWC+I!PMJWjidKxg0-J}eF1a4# zx#WJYnKB=R(AS}$|1s0u-l(0PxTYwdVU?1`gJO);t|TJu?i%yZaTl^>PraTn=x2mt z7;@zHh0~omDZj;RJag25N!id?dB~fncTT&E)4+9{gm_U&KD?Rqz@8AO^6=AoW(LSW z7B^*7tHsQk7phi@axj(kh*3naZr>f8?Z6-dR+fMHqVjM;GF1AX{QcZ1w-S1aTMxXy zTHkRBs5bDEJ?2=TC6H@q>DoQrBX%luiRU4d>b?{MM)Qp>3rGD=%p~awD*5!PT&4~M4r(b9HC9<#Y*;T#Y^w}3x)G{!Q1qZBVGO<`G7pe z`)e$zbD<6kIez8fc=^n;)OGtd8=!q#=WQmo0?b9VLB_UT0#-8KQH=E`Mc&)765llG zqeejaR=Eztd=&Q9`y_~RW7?i~^R#M2^T{?b4944&rWu^{>3blck{U&x{)*E(&^Nlp~ zbHwk)bG0mmFqd14j;LGmyDSWf|RBje2HypU*KWE<>WxL z)f5sah#Oh>o7tn8wPqAMmeUQKav~o_{Q69j5%q~M zxCIkbZYp!SxGoA9QvUK z6F#OTsW`}0g_#LN#oyDIthkzjU#;#S z`^2hjvi7M0LVJbyCY4gCmFsVFKq;6zTQiyJ)WWWte-jmM-OMAv4~)L5qq7)di8>@| zUznCks90TB$_6u_aS@bJyubOqzX^0+NEd)68v`f+g29PDD?( z+RnN?@0-DZs$S-&)8}j?U=dHr8qgFJE{GU9UgKVHkdVDg!eaI8vmC`f!X%P1@;{IE z8NJBb>#~hY94C1tGnIK(#D(CMH=T_V%r0!ASK!x%xniHCVn&hyqe{C*mWi~?$g2~+ zX6Y)i>u?IbJ0!i)E?nH+CWYaE`+1S)8{+n6Jb_8HZ_(AN6+7;@JJx3Vcg8ZBf>DZA zG1ZZ`&gdR$zwe<3I%4}z<8MxP(&p4^&G>%J_Z%f!Ca5xqdLRsvoR zS*FMPFDS0HYb#J%`O}j}Qc@y+=YUq@haD^RXYxw0Q3;v!EI()#jGy(dhYu#2KIaz^ zeSNOc?XpOgxfC`_41LI1Waj5%vq5+_KaNVRz3}96tL7EEpM+hB_=E5IS~wqZe4a>3 z5~XYj2QUrH96=C)O24s%h1inAdm2khZKkd?;p?vHLU)TN$DUq(dwSKYm1yhq74Rz> z@`{r&^jPxn44W&Xr2LO+tI?&8;5Y0mbZtKNT)ZE|JD8OuUjl#)4afhGPaE^cr0If5 zA2_na@0Yk^n3EFn0`u)fX`om3$fK1&By-8kgc2D^tzic5Qw!rzC+@HGn=S}6_Qzy9|?{1c)7`_$?!sMW(Sqx-LOR+jmcBTq<+_XXKs>) zWS(Wp&d~_r8(IZ=EH{hC>+NENSXxXwX{{FfQzxjlYhrj9JhXC+1-XPn!-lwfb)c|W z602%t=xzox@Feda+Sv#RkqX~7dB8>HY=4~HdtcU5QlxCP_?D86jxHF+FTjyx)!u$h zt~hj=sixu;do_H_yrRyoa;7=ctJ|Oap|%IG?Y8ph@(gbHYOaJ!KpHhX%A%}iuHr1+ zq6{WkTi_auSmLXh3bY$Vv?p(?wC#?w|lmFiV?x7oNW;)-Ra3r zI`KgW*>TOc|9F4kk15t+{CYe6OnU#ghZO0)b#({QVlGZyyR~JMh#i7~Q?FkQy8{+2 z_E4Zw<888%`gXgJ=Sx%H*o+ZW@hM}p@A2p5gWJu8P+;22Z_SYACr}Wpj=A4G7LX_% zXwUCrX$C_XvN*7@!}7C4NK^TM11|OJA#O__IyEBK}U5$10fN4Bsf1t0THH z0-*^BqE@{n$-$v(LE_~5k$zHwzr}z)s{;PA$y103?|+52ffjnR&^YAFjjqd{9r3wz z`tre-jnzmg?EE4E+^%?!gir$5nyKJcWQUEn#GhC_lHw8Q#jYDoeEtiFG-GbKDYg6D$d@p6Dw|sAp=u_O`TB7nYj@wj)_P#T?odJ~W^uwfGfu{q z`vtD!;j|gbx1R$Mxg3D4F)O%ieDHRM{d*9P)_)C}|Ninb8*9RZ>CvfckxdG7WM3Ozb?ET-Tdog|&J3)ex;Ui|74pGc*tpLMbI zlFjk{lJQElbHGET`hgaCcrct^d3rTD!Md3=_v0Cc{4tiN2VzOE%AuWep8AlG2^vx<# z=%q|hJI{bNt0@QsYC7unj|uv~5QZ0re94w3=Sd!^g^+FC3#a^j^ls`ZA5-npueJj; zGdRTWhmjgU+SjWM(H#zYRY|pubceOl4@x7SM2t?)#@J_B?RL zJZk?}lmCCo@iuDVl&^?2c!pV~1W6H50y*i0K_-GFn8C4a4F@(U8*!s(*JQH|$<$FR z*!;2Zh$hrzv2vzS?Lt5B@^v!c6xRjEEbe+`hLpnuUWppOzVLnrwbcDyUvWKtE#qj% zj*UZlL$gzY{U|?;_{M@`K*{8s64&6ij&tc=t3N zZ!5%$G0!|lDXLl1OG;hiY&SMMWH~sypz8qf4z23?A*)}c%tb@fCRP)>o4W}Z9u(3X z#0jmeF`=~44A?Ad!MTD{vW(w2zK|$LwWeD1@nGeioiX*u0YOoIB@84?dgIM&PfRaI zv#l3-Q6W%UiC~CB145%ivI}=JmAv+uOJ4nD+A^4$uxQ0a z5aYw4$(`#f$*FNxFI8lbV&-p_LV0*+{^9zT#r|~2X#T3yo!Bht@Q49<79r+walEMP zoerwS1U_-8xE!jj=t%JfPCGXw^R5kp(t)Y;p#`PIJa2nbI%d5jP(6 zzZHS@uqfQ^yWt%Zr{S~;w)GOMcqH~R2^o_opav0O6v@6aCq7ZtCpoQyWY+MngTUXG zsuj+CuCbwNW}6!}@s_T)`4CRYJ@w+pS|(i0kPXfzhMolP*hvq{3S2qxx4KOQoa2XF zA#x*QB;j;BefO29;GrWvIzByBV%$yb`ky-d(kOxML$)T)dx5M_+e0H4-TPVUtB0^; zE+5Kpr@>YbXjbmumminPA^QcM`j8b>s&`<<>hCmmLre5oUaPZ?)mBW++yJe29sLMZ zKwB+4YRVm$!J6p4^@vs+vc^)mwJF> z4~#um2V8}>sWpT~LPV7rWw>yD^c7LitLR75RG%B=L5|F-(W}GIKWZFr z-XX_aZ?USv1L(V(p=N!X{M~+oL+V+(=J+Pd)E?dU(_Z7h-=Pl{kkD4i-1N%VeLEZU zfTA2qrrSW*>n*W_bpu?OIe}au{li=jNtSg3yb$pA={f(U1z;^L#eX1U^M;hSE*#GE zGQXSX!GV)1UB6a9)T*7?9DwA}B6g|U=+Gp#x$EsdU3S-e;DSR)*3HvgGNmW#qP=IL zz(qOroo<&;x-XjV&e~eCw{AH6G$yH8mlChc;(w&Vc8Th3DG73gMm&c( zjI}j43@SW$*PL8=UVNz=(u@PlZ5c%#Xoewk_wqhOwHEYN4yJAa?_F8X%bW;0v}jd8LGo$ zmo1ui;w$-cG`O{&(B~Pt##x#gJ2d`l1e#E;4?KC7e0sVN4d6CnqU*WOg9C; z2Gc&|n;-(EPu)t6(=%+|ip98pjKK!&CoXHxH46>aIHGZ)l2&e}lEb7su~zEk*K%*& z9Gl-b1C)TjrG}MNGEMGkZhyP;e?|UU+&h_;b0Nd?>@-1^y}fVX477xSD`xI zk|{1ySc$JN(LlhgL_mGy(y8V(oxT;i@`zNxvf_r9tIlW~fkv2E=CLkIrcGnfG;y>E zQ}6pn{4siMnDxS4b%1g6Td?YTB9gGa!)^SBM26vYwrFZKkp*+!JkfM^l&@ob)eRvt z28D-vdmoL=(K^pNPT;KR^1|u4(Us!aCAi?D?)%0w5p=|KVUj? zUN5!3JxAg#_hdMmqwvkaTKb(Ef{BmNhX}eKe$VnTOn|5I8K-w;z0R>AIoAC^YL$@q-HpfTlelR55B2E0#n7Jw0W7IRkxL z=>ubWFlF%M;_{0dT8_G#LDLtjHm}-l06EqVx)J0*y%BHO;hA)hr-CFP`a0_AQ={;p zMBt{Oic=3|M zkzM=8?70nU4oQ&uuhG3;k}3IAxA>A+CWPNu zmWUSyapiuKCcYP5Y3iRxi_0VtYPq3l(=1NY+-_E7ohw-bbM@0zNK7C*%0b+>l86+& zjssHL`MdN#x2Wc<-R=KZI)-zudB&rp*2{&m2}R`c;` z_``&iMyx%)O~2Lf|LbR1qOB(bL>d2jl-i5|_XiIHb!8Ddca4t`q$q!O2yToJ7`Vl8 zJ23IrP%^xTYC5;7Yr_i|4P0>{*=Th{2Q+z0r%1wU?_uI@)Dw(!D_3ZaSx}Z--^e0$ z<;cb(pPD@(^I?X5NP&m7`BMTKKb6tC~-`W*4eHIS7W zVRwg+#JTX*R>aQI`XL58zGyMCj^aui{T}xSICFc)d|y-KA;e=G-wmKcOZ6JLDb1Td za0mdVkVfC2S=nh8<}scL#rWxNA!4f~x@e$zm*^mj=Vbtffy#)6->KIn7Hlg#%vzR| z2{Y2l!t$!b!{~T%!TUbIARxzsG9{{B68G$YndKovDW^E3-pMKvGeiN%oz6Shu~dia zL7vXUHjW+s8J?p&3`?jx{+ug8oIASDtwI4s=F zcS#)D!v2zYKrP$-idg_}z+aK>1P|CyJ3gBKhKcWd4zT*mPEj5rdu@h%jvauy*#4!M zu>^^1)CScvxP0kUY`vFR_`YV2$aS=j>$<=EIgkP%6$2ONOLv83z5-GNbx{08tkTUy zazXXaW!yC-QHs;_xr3Is?G``zA(^>FHKC8dsg9Xbkx_N23{T>aBr+#L>DwnTRlEHxSn*gFCQ(47VY*|JgF?!`0m^XW$QB?N&>Ceaa(#tPbpj<#;k50C*M z@Gt1wt)N{vm^2bD3EJo*Ea^WqOw&-c{F2 zMbJHsG)e~(t*pD0Ee6I4E=BM@8*D(m3r59 z(W#}o#DNnsxq}o}{h=QrR8Vu3~#RP5C)*`hI(O!PHWe|7; z!Z{Dz3Mx?N$rR|iKNDUk<4dc?Xad!lgm8>za+wsv`vea*=zW|z5h1UzFbFv~UeDQA z%jo(YL?9v)_PyVaRVSB%82*TSe#lX7=WV8?Uc9J4e%#FHch$p%VR4fTml7j|?ITo= z_{1|P1qu+3Kx;=T@PTtf$N`uQf=()ivh?BlQ&20Puea1|8~BY__+cBr%Ww|!pP5xk zNV;oy+lqR4WlhespEfj8`h)8{`sicT7$+&dU9lS$B)9AXxwU@29lU>T;^q98xI zY{nO`Kn`?q0L1NwrW@gX)BYYB6tAAvd9XoVypB@5Nd}@h`WGKX-I#vuJznKdPd^gz zmqo;MpIDft5y&cBZeKp{9n2B6mJE(8ObGieq-fm`!cdGcyAKWD}xX?>|Q3kCFXGo``1bk=~Xjk==zXYC`P zT!Xj3qTFWBAbahEiG#SY4{rpX8VZ40AA||DM2n^lwZW0b)6!YT+2@yZhd(hl`E)RV zf5j~zn~$mZ*;dM68qa(+xMs3E%>aPOU-~5S8ZM?0Qv;`n@DGLfgnq%d;lAKjlZ@@(Y}rG(L+i;q+sH-~NBKN%BcKpd_( zK2mQ5K>y|j)a$*z$J?KRoPaN`07maG0%81hQ6&W`7W%(JJ_q+OX?(!9PY^zz#6HH0 z-BF;eL)@RGEF7`mJzQ@FD1DP1m3;-Pmjs^{u>=m5p_W*duUt2l#tIrEkM*&an3tm^ zO(PM77p3Z)+G{6~avItC(tnc6jS6mFpU?KgKL4(^;L~2`?D+-y5ca)|&V$gWHi~RiZ{N>J3O{BcCMHWKJCy4@*o=S0h-sQgUi@fp)cDR> zQ0wv9&sF8Zk%2gO!IbBD34%GB#|g;uSHBLD{LZiJ*fGaexxai#^Zs@^+OMrne4Vbw zcNR+jhmse4Ks|@rG}PC~HWc+5W1&+zNC3SH!TOy~$4#D3Yha&0lo;ONtz1r0)M$S) zvKaDx$ZzlTLcKnDVN>h-%q^tda*OigT+P6dc5*T1a%WzgOK?AN8&{*a5pZ>R@Q7Jgg-zZ_39+_>KR$Nu_740-y@}6e zsLDAMYguZqQRSQu4XU)i!!r26@uG=pPO!z5>Kfn#`AoAHCOh|v#E)(Wbr(8pd!l*^IQQwB?C~AyLJq454?@&`}M}wEr~y68O3u#sD-)T0{Fs4U#k9oaU#~&t*K@>Sw`@i z%2vQDSOutjoKZGc^vP>FMOl&z&jf^6TE`r+Na5YYFSoOJmZ&({#a5b~?co_T8Qyc5^T6$!DIKsX_}V^qg3 zR3gRs5Q~=`c2B>5{Zo=X2RRFy10A^5?*MdE+ckyKw#*E3F~N9NnH{fa8@f@ozV>QM z{d_(8{Kc8auP(n3Il$M{Wd9YP?YDK>`$qKrYh~CGn{=CgiG$Z&tSVH*VC4sp9v(%4c^Ph6k#?& z(qhQRfP>b-?}M+YXl%>!XFG2&(;ddo6Br_^%Y@E{tQm#O^i5BIU_*-dpFEs@#|^uU=sD;JRWn=AQ}sWe zY}s4sO7Nl~1>~Zvfp=L^Z;C1-cNwN765|yewd#;`rg`Xma`8h}Ck`QTW0E)b%n5^6 z^l2m{ZR+WDt_|=Mcxq$`8?#A6O+Ozm8a4B9e{|uObj(&dxFMiHSY9Z$BL@9uZH3l2 zrSSsLF{y=Z&h|~$@TQHG!~&0dFGNj1)^7R0zw?v{A(+sEugtXgf){MRHH`7sm>8rm z8vkr=PS~4JCkFi}lBDR!__Ws~0`z;!P{+#O;m9Cx=?^!9@KqTE)hmgNNe6sGj%T{t za>V8pc)?7m07$ENXPo8t?Ld&DPKWR+@Wj5IJbUl7!vj{k(H!}-&$q3g~0}J4&VOZ9e`&3`b zvn@!V5;2Pm-Ue5IgK-a4{*9;)UMH@iUoxJNm%Nd3%q!hS&Q@JyYh9ZT#(qYx@-0}p zV1K6Tf;+KtCF5RYILR)5S}@{XhEN;Bve`Cowl%)_nIshnh|BvWZ^lF59?L5t2yo*} zi4Q^ojmV~H#zg9q5(cjJP~t*G!mPD@0k_gDXK=^(E@iY+P-n}hE5{z+0?=q71`5}^ z+rTmQD_G!>Nc1k(DBFs$DK$}GVk_5dG;@h>*l^Wn+iI~M|H4YjmwCZ9g-PUnYisdU zPEDpJq2?%!i}l#ZVaH#7n6~tp9f|%JH73vY&-5UHk`Vu^6Fb`H#Rj8nQah`Fco8a~ z?3vMf=JUM7*DLHmsgh=h4&l8OAmndqF^$gl^-Ma5+%FvDyKM9BE;eQSw{#TxjF?mY zij05toZN3CfMakV>qzzC+%)C$`vuy6_8H-|$JPLs(f9iF_5TXPD$nfYrJ~K@kvBZ? z_#s%CcFYIx@N*_8Mo|*dVSK$+6mUCg!7(Z{-84*E^#1ICk|aZ&m``wxr@<9hq8eTx zaq(4*Dy*LOK;IxeYhcHiy818{(X$&i6u;5IQxE8mb6smO&TH)jezts?at{~)R!WdrPr4k2@NvldYPX?qFPLd*z>bpwV zM?H&`VvvH*IXqIN)4;}G8pL%eau`J+$Ys-vp4Ia+l1`iG?0#khvL2wPP@Y)Q6q&wM zFwhcCS>=4GA*L5JrAsL~L}fii07_bW29IETVUY)1m2T7O3ZzmJb%xcC{}MZOLKkOI zxS+L3K+!I?IDrRf(~k7zRnc%$yQQedKv38pE7+As0hy_%Oa5Fkf8|8E*PO_0jgyf2 zr*`>lL5_ZQ0%2?~bUL2CzW|N>gDvTANLoO?#_lmpBf|@~3~=(E+^aqZ(zhJZ{oc}d z-$5g%HB4a!NH8yUFr{gcvcjqjdry&C}!WPv}7vggdJ2q;F`0Yh>?K}ON{L@%FKRIA`p0W)K z!0GUooSjxC=)54WqXjG1hxxJ!R8M~2oJEC%rHUm0j!6JS6L`Hkwib zopG3V>@Q?7%OFI9#4YQwmMu>WPNY*rrG(}*jC$R{YAL%suRvhYW8lucro;53&5ZtK ziKs4J^8J{bPj~>Rry<~fBiHi zd=$|4(%K-G_41XRLNPxZEHyroOxZWzb@CZaJV)!y$nidkBv7%hnpn7r`XshfE1Tm` zE)Ef4Q^<;Zdi!+Zx<(1*D#~w|!4#0dXEFrHxSrIUTSt9qt(%b9kcI1kZSpU zA4r5B;QW;TEl=sY`cdzuLZHy>jQqh}n|G<_GPbozF5DoY7^VAc^x+3Am0L-w^U)N% zTQX!er=$Ps*8H363iKus$4oLW57!gLuC**V-}8myHp+H1nt6EZZTpShneu)|G8a*w z^X?xaxS<3YYmqz|I510(m4+K{Om}Vd&LSLU7$5uTWDs88czxR|tuHrAj-u1ZNL zHS7})pg*sU##7v?(#gM7^i=31W13f-iFUM{BZ1NtvhVNv-4_rC>WH*TM2p548&f+k zAXGhqO1lo|Upy)mIMS!YxX-1~Gl$#ja(~(g$&fSoc>iraWgU+CZnDNDiEAd+7c!ki zgV>Miuc#|`LBSJ>fK;yhPU88%#k<1B6s7(9!odf6egR<#q5O!L58A@-c{6-*hHDm# z3aGdY&-er8q1pkJ0a%76TAR9^_qt&p?BON^`*hbM`Y zFkZN!(pXW!h8#QPDU?NfeH!2zmWIJov!x%FSesK7Cjh65(bY-aS`KK>-54mXqg{t7=_l`VYw}efWu4M@W(H!!%#~Hvn$cbd_-hW1rL^KbU&?M zrcdhXW`Ca<50>1cImCl);SQjYcr;)g+I)>8Cn+KPLdZlNQcBqI7WXZmJQk7^B>f;I zsQVQ=_Gf!+%gcHW-(&-=sQIQS?*`@X^)7rvjy7VM=Rn`kv_Ym~bZjuBX3M@jKHTOp z3^v4_1=TkZ{26{F`xx}xzL0kR(M?Dfh-J|)g?#`owGWaz;}J%7)2+I`9N~HVQYej70|ku3VnX z-hadR3e~CG1v!fCn*n&@%<;R*5*S*B-X!A&HKsP>{3ZjFS-8Q7Bbn_SjV>_+irKit zEFlyc`M!*74`~v(3B(Z8yVXrhu|5%;!<6$|x??M+%5#mqIOYijp8ke5%k%~kHsR{2JhZ>lR z;;&U?am44HC9Y?ha{HL0ZktZQw9q`pOM((3)<8WLk4x?|90z7mJ{5&4mO>zW;Rth}|qd3gmps_>YMtP7d;Jc^ms(%m~;U_yLbQg_-d^PCZrznhA* zbfwdFT|EQ^hlL@P5w0?%%unMcL}qx-tq2*`z-oQ!1g-2MF$=ckKQXd?4o8C4RhuQo z3l_vF3FIz|6P~ToGlB$s5pHLvOnA16;;ZLGRLA1Km?ML8kaHxKsW>7%I*RzBKL4uZ!G^gWN0JHB7d1C@n*R| z#O12$J^-rruaPyO7X2Hw4=NtRW4kEEHBI?gZQ%KjEJe2W)5GFs2hEJg-^lF;n%p0e zvtz%agpw1;M2Ow8+YFjBV)=8wR1Zu8(uJm}TAGpWv892@MKNv}=3+zU`w??DU7Ui!dSCZw~xjUpSQ@ zZl!G+;goP?b4EFz2JHG(add{d6MdB=EZ{wmC`1b^pmV)QV4^RbwBI5*;YW5~{<&lX zI7hT#&FDGP@#%*#14xS!O0j~&=`>+apv7G<#^mG{Dq^&n>2%+>rLN0Az%})QM1TET z8k`F0QLt(L{Su(~mZVcxOwvpl8=~i<8NK!O`wEzS7vHUPWK|awq)6*E`VJ8fJG%T2 z16R8YI5GLEc*q9G?Udvv+FIyop;K#9iP--y?SH5V+m(5CcAeyXzqvZ2ic za7>tzR;HK(ykTVWS2kyos$L=BPfJ95lU3ZI@CVP=DFfu#{a8ku9Fe}kI}x}dR{;=F zu_C;hig;Mr%5laBP@{3$t-Gzy)DB|8#3INE>k9gz_YmJ;FDABLdpe&1@rUhvhee6a z$dQ|?@AH`CRc|R!SAq_fjAfl!QeG}ST0n1TnWM-VhNCAfw6jWRn3%@BfH`$=~H z@``C7e3{Q(f@-={I}~&H4TD5a_Ag3;+d*l5SLN!9T^8xl^6|Q*-m5~LR4f~rvD>^L zYRd40(j$3{fkdRi_?cULXCa2^@>S5`X>2POF_PIgsZ@ENIN)I|V8}ha{vxB;!x%!j zVD*K0P+T=;D~lJH^ay=jnF)o+5RO(YC#_>{sC{Lz!f&+vF~_w{o+?+6$VWFXcsmVC z0zmn{Rh9rwGFs00RQTyLsgjD>5{`s?s9mH z$GO0Wj|2K-H*O`t0z+gWjY&_+TiLIgKIQqk`^)R9?$qv2y;>gp)6_kYES`7|Nvmc| z95v2+z+3Pm1xp%mBra`UW0Q)``m88VkbOZmWa4S;Zu#`H4+0U0gA}FHf+HFx!NI3v zn!g*>fR+Z}P&?wG?d+dzEZGY&PWyR`ri~rd5ysOp$s1XBc4fbE&no}ZV zscxHV32aCTSf+(odd#}>NPdmSs($Tr%Idn_QQADBtP6pD1q16fi=}<%#gjo6J-ph{ ziO;_6PG9ik3d8rIr?3;axcBzO3l-#~Z2B9?$>d)`H{f%7w2Np_xWR2tOr$EKk)CY|mf!r(_sJDHvNz2!X z6p2V4|J}FUCo4X-qD(373(1>fGC#%n>k8Sc8UB@OmNGiDDm?D-!9;K}oh3R0exuFm z8gsl2^}ex|L7y1`R5S(=E;#W%zc69;Q9b8q?X}G$vU$dIa=?nLtjl{~GOn>7S~W1y z-!FdMss4cvn$hC%_lmIV3&<|`6xuu07dtvF{U?8K8iDf56sWjzH>p z;b33vl#-*L=3UI>=nYII`#`E>AfT+%NFfyXo^k9^XR#5}xw2gCvZ>DkSEnY*eRoZ8 zKcHrSz={L?sF0_j2?i~egw-*d-f4i%F$}LJhUtbLw(-b{HzyGQ0w28@T`(@=+^$pp ztL^Zr8=uA|-I)XO##c(ZX2ABfkz6S#)-ZA1)C#j5!>H{Cj`W>M*M~r@SOjE!5bmW# zkIk>kcLcPxE{x??Qsao-$hEj!ICMPb?7af%awDnKYw1}U72ZH%y60QFziU=Reh*w8 zGL0wWe<%`{_(QlkG_6W}As*=@Q+9nTpk6tPmHd`z6!O1su28<1v_KJyC^|%RN4p>x zL4yV7(e@rp-GT|Yu2o&h&FW2+J!0M9ascL{5iElQuFyeGDnm0J*NsC|X?KU_*r1RD zS*^j(*c_QrKR8*1_2=`?z(;HIAbsnZ!4Fie{Td+M(3o!WmQO)W2{O*)g{@#~5$ zrqmW}EtTV0SbSST9t*h|3V47Lk^Ddna;y^4i8dWbJt1n@NdorYiDeGQb-iyCnP4)a z!8p)u_92dpjxSsqX;U_2t+ZcJlvc6;{QHVbTJM$4ilblNRJf-QT=3>zCvb&a)jPxc z9DJ6n@JRbsuZ{s);WMhL}}$bt#2OmOkP^;V4Z;^Myd zc;8mxrb)P^kgv8uXo9KS1cWMhcs86qxI-xBEtQ@CW{X!fVOsf;qGE@`in`dZqEax_ zN$%GReJ;)#&hDpKTVGt|hJ6MP9%ccd)LSnX60VGTBqqOmn%biyo2GjM@#~Hna6t%D zw5QOr)P3*5;(0eIojXV9PO~Ha$-<0C# zG=*orj>wz~>xc_0qtXteen)9U9hj5N>wSG%%rS>h zrU*3~hp+&PB# z)a}H3EZ8wbs{u3*#pW9m)W!qqs0+_^*6xTN;gz+V!hKQFqe zb~~yk7E@E|4V0cCeTLj(96N}4Y0=E6bK_@wWKL11B9Jeov~8s(k;)1XMf=5$2GuFH zUYcq?>fS7#tO7tx<1^VsZp>9;k?14!!B817H~0$*g{Buwa`Dna&v5~`IFyy2_nP1V zlIi@YbEhcg=F1-}0iKZOFP|_3a}xw##PzN9(Klhkkhp~T$kD5)#!FI0L~JG_9!^!~ zFn6Qn&rFc9=P(iHB>0lzA+?rN@787O1n+6vzj~K7L)3oD#pbP`((F?Y)aen7wwvXHvy$rRdS~!Zrbs~$3Oa$2c9D7<0gq_9chQ4*0I{cFm zr}imR^-Rm+aLhSx*QOcJXSG49cBZB1ay$=*MB;|a+z8uPr3p8%e#+Gn2}?64tXs_r z?z;bmAz<==a*-sTE2a; z?lF|34#Z*D>lOo}Et(YLnqA#}WZc&3;oZP{b0%zr?4WB=2jkWw`i*Z7eb5K}5iTmg zud*$jXS>AnB29YnPFC=jiZz{{fZGj^oFv&Lm7jG|wv4|1X!I2bpj?m@-0Db_UzxgJ z1S@QIEHq$=H(K<X1M{E<4+UE?iXgtA)ld^d4zLGuOr(s z1j4_cVl!(y84tP@_2?XazZA(4{Q^nrjAeB%pQi1q7IEOM38ULAoo!bc18^ZJ92e;A zW$~hzp3}c-c;?IHXVftSN-2sti~F_D_<%7XzW6Sw)Yl!^hp97duZ$QK+Rs_X^#Un& ziA&w63SD>P9 zD2~P489qgTQ!bR5)+I!|cTj`76gk(HF0HL{B1O1NlqgI}A}}V4Wt-b;@aV6dQTM#3 z3Nt>L{Z6x~L4^|efZs}ff4A?`TA{2{;k-rE*GD`1)xFPBZcb|!Q{3Pg&Ei7}vuhNy z8Q$pN6}Bqc6E-LEnOHDxbISfnxZc5>iBxxvXEe_@e7lD?iV|1iZEVfKVMo!!JX9|_ zujT~s&w|m(2^)2It|me{>Hz<&qze^aa`p(O2r7g38v@k$p-a#<_mT@F zpW~rg2Wao49v*eLL?g+qd-ZJkWnh85`Do#jxar&SMl$BoAD>D~fb0(iUZrnNNjpjPo&KH3u@YN^6uEZTc zo(q4j2B6IH=Zkk3?&FQKG@lOfe{QTZ9cb1Rc&v6vfrnG)vGi-5wnLb^j$0fr>Ih4g zz_HEFQ|JU*@CqYK`Sq&Ud$<6Rk=Ugi4#$gMl@yPKyuJjED^eA3c6Aa)*yP3@OnmXp4y7 zXc>3(pwzMXIdMs2AoxCv$!!q_6l^mVx8CMdC(l_wHhpm?*UmUgAO&Of>7@eC=zMSm zeyQ?mecm(DIWDl@!Ms@uihn&?dl5c7PHj&N1G#oQ4k~!Gu$YRRC-|VVFqYEt_iA%s zFwIqYBiu*z3L-6lzAqy-!L@@Wa|fG!-dujGrt0`p zB2K^;s*TqdHY2stIuMuw!hbF0d-6XHVAGY-##pB|1-)|W$zM`!`D=4rRb13qQm z69yf>c8&$sB{LDzT_z`GeQ=Zr`y7(T=1er}mZ%KOLsIQ@te(WDcqXr{ zOuPuzk1~`O{m7|E+1BU;G^9Ck83WQHkV7G{fJI}CL)O~CO!G-dElKYaT$YnBB#j_d z#XN>#koOe81Pm-aUHY6{G0SR zQ@Za<)0>G4T+fj~HH@OGH$0NATy?3~T9`3otXIq!qIn-b&K|wrUx7-??KxZc`Q#`u zpo#nnIyGf>j5_;Tjg2|4I3z_i)(<{Rt=j}CBT2y0SnHT7<;JQM*Z7nm+FJ0|<`_`I zw;d%z45Q5Z!F&xiQ?lh8T2$#4msp3mgENd<@!CwMq`qmR2goHdFP7Z_3iyiu#?ih) z0NnBwc^F`X=IhcID6l3XeCxp;3p))Z5F*-iwWjY8!fQ>y>dXptcl}yt15Tq`ObmWJ zze^j4#P2^A(t9)Y;In)x|)xH=QX+@!^PxQ{H=upQ}UkTd2fir@sTJ=O4AJ(~hu&84M>v#F(Szu?g0KYxi zBhmv)XAfKL2mI?c3f4h>RZ)5~WvT)|Ahz`Mbj#jP@Ud(aR*7A@MzUKTqh61?wJzPC zYNuZ^8fP(#Fv~&D#E>tU)Q5#Zla;mQy6knnprLnkWr3HL|qYWJ^ z8p62rnZJ8NFydAmv7gI9OpbXzgg^9So#~7;xv-C|O4Eht2c`P9hIZJv18z`*%*BVd zULbFnt!53#at@SnLN=(soh0a~>g2w`vhy(`Fr9!a0TUegn&qJ65DPv1YQr;t46K&I?lzh?DX zb*aan%h#!hoPznhb@^JaN)ya$qr4zWj4vw9a=ckf0~GNz7CVoZQPwPurd|O=o=zka zg=P46?;7427WO3^Q{Gt^hQDiA5{#{`UMG37HzuG->-wT{gcS)Fn1tjDk`s}hzQ-v> z_f7h*EN{MrsP1n(EP(M_q}?dWf25~b2tRo+JZ~`js-e^&P;@HO>5ajmU$#}oZ-3BV z-t;k1C!-}7KYIlxZkL8_Z~55irOsGCcqY5L1Rqld&%N6sf`ysRcEc@) zD%UvxH#IG2O(*S6Kjb}EkYrA!PN9{}&Df**P>B}JokL-f@~#drly(L^C)p_Cy=3)K zh$`|*TE~(w=Gil{6gaxLyC+Jx-N=25bk2~mV;_(eWiS2%?M)Qj4EK#kgBHbxg zVQAM~=dFT7ZhqUIqAKe8Q&Pg#BW})%7F&agK685DwB)V#VCyM;%qze=C-&xJ+YV2| z8Tb@vx|WEFudOTpqUN(LKX|m{!j&GiL5_|C@L=guCgiDGLSZc3!c?I7sTIi%KeTpC z7V6T4Dvg$^%*61bYpTq?%Fo0%9BeffnG)tYUZ`epl|qkdLk9GevI?!ArCZ55?I&8F z!uX_!VQJuFzmbgth?d@OL&M& z-Si-amk+n}@HwapXxL|fC~@)Ww2^iiiHbgV&$sO4BbOHmckS%N0Y|rahEcJ#2lT7l z!{w(vey94b%I}FxH^SU{ze1&ee9Du+o8+29b3PBC%FDzb8AM}H5+lX4NekpkPWw#~#D&F0TgbO72muNmn*CMVZN%J^0HPzj3M0HG&{k zCk>=H-L{!iA?7RK(3y59J;smUG^Ha+FOX;!hqqwlaLN#NYnIgha8R_=vYYUNny%t|-kmO^aNaVEgz-j`Y=fRikLRhD#U9GWQ9MjE5zhDw3g{^pI~-G{LjiSnomqF@JE(tskI!Cq^b!r1zhZh_PWj2)Ee9Ne)@JL z{`@y}GxBLrnMxyYQ&B38rs({E?4Y#%Tq~3Z{TJXY3OcQR-#q+a?O>{2W*;^9pExLW zC7U(35Y$c6AFMOAsP|d1;?58w&L^`!8*4qc>fW=3xT6~Rb(HU9Q!LR3UdP!b=hqFo zXXbs}M{2{q$|*K{MtESpb&s+;&-P5Zcy?-%(0?whL9}FK>gSQK`Uw}5FYDihF*us9 zRTn^P`f_@V%GTX6vxaSbWMx|1!*dM?Ay;3-UAwak_8C|V%cmbNf$@y&HD+9`Yz=`cJm6CEey< z0kRUkyR1nC>OBO5@gkq*T z;;3FXaL#WXB0au0)C-jX)P$<@pJRRd+#%%x&SB}a#IUli5?8@dhnwfbZi!>bna1uA zaf-Tqe#8!R@iyK0r-D4MZETnQ{9h{z?-8RjA*y*BE>B$2Fd%j9aK3W$TtVRuEYqa> z(8o%^=3L`Bw^gxv`(4`^P)%9c*Hqym5PuiIG%o82m0pYXO@Tv~xogk!t^s6n$(POi z2}hyw;$w)*e$S^7FZWq_Q_G3URgC!RxE{;TjFq}_MnhlsP5u2QPue=G{eWL{)}OfH zvPG1dOWtKbUrmfitNd1ue}8PLPqg5r1%1TJ_ri<4k_$}(JNeGG<7J?CtXhnhh!VzK&>!;(`*~6vc2Q?AfN0yIO?$u8pmRu zLP|Uv#K#5$S5G~#X1BK3(9-R$KJu8fdtTCwCD(6bCn>I$8TLd2e&Pl4_KTA%QMGeJ z^ccGRu3s*uMDVJS0Ouq+Z(p%RPnBCP2@IFPxel1d0<$0KIp+%$Nhd-&dYqAsHILiS+$LtC^*9zgj7@#?pYO)dGKJ}q_tgD5(fENU0gtLdd z%PW+=?6MWjJr}c?*vvVytRKy2%CO}4vcI>YAT8K0s;U?81a#2Mvml(e;ptvtNH08T~6_##;d^wH;3BLl(@Ykpl{ zL_y5&15eagtyE#NwQ(e)`))H{uIoAhj--R;F(M~n@j(i&RmEu! z7`(4?n=QmUdE-qP&(sF=Y+Wr-Kk!9g7@VShv|YUfU47g`f9okV(P0{k!9h9Jm0UQN z21pqM|CnC08?z=Fl#! z^Pk_>VH~?bf+X|{mm1mUPT=mn2=;sA*|0bp1mvqcL}3)XFd&4%6mnlmpMSShvDnt1 z4`(-$Waig<@9WroA7?rr<*&1Nei$5+RB`rPGzxL zsh$9-|0ri(@6Haqc&~x1^xcw6^lu0;tf;-ke010;kfYSPgNG^B8}ufRSxui?zz9p7_r(lQ+TG3ZKgKK|NCp7}od$ zgxlSi1cg!RzCw!c)L#b=opa0;>uAn~yT4L?$M1cd?&Q08CgX`K{E-%{{0{YIaW;8y z8dr|jkOqkP%ZUa5oua72SEWD`zu3Am$>g~+mp`h?M{u76ET{k?(vxsI%$ND-T$QlT z^9;@BkGG&@Gw=iR$hQBI*A5jjF!EZ`-wYT+9;^(7#KNNyOU;TBb^=4^=v&by@;Or4 z9+Kqk3=y-B($a+>pi0AvJJ)rctU!W?7Dd-K=>=oX^+hX_*(EXKlz8Mm96rUnP|Z4X zv=?-fNl(8>bKctVjc&@Lay_rnwX#)tJVZzM`>+X3o-QxBTC%flyt8A}gRToQ0^`=a zPo#gJ*(DPU9mOB;;qK}Hb)HjTNI>tGf8bt#ifBI~TWi$;%*dEI6t1NHp4QDYn& z@}3F2=$1kOr2<9x6Y>*jM5Cu~&H?^mPZ+ka^Uc|jYNhH%25b8X9|z0%W3L}fOo!=(78zZg z)@6|hgqFogzX~56FSXx&wXv2m?;7=_=Ir+Mm#xfzc63_49A(cL07&Q@sT5anpWLgN z(9At}w~x2{ukUf(Suw3ir!{!@^-pKwLjc`5(8JsHj|QBto8=h)mG*;bwo*4E2O;Rv zC&+z$@zWD3NBioaN)GtxT$tfJ9l^Q0pj$M` zvLlTPewL%kB3 zti*P8FY4?u$~xaOP>&wFR0hFiQyF$kRK7pqXVAK9@j$^7bn32yNU>uWg#7i6$@ZPT zSqsMc+x-y(!tCQiPp%ji!vbO)ve9|TkY2qAuC4-|ydL3qu>vWNKYMZC3D>7cDi@j} zcm33ldd7QW&)OZKTe>`tS)3v2Q)3v-V%d}XJEQ0C{1mA8({8<}$)j}wT@FZx8#o@Rk5Np-r%<38r8=*mn^=bebmG+cUO4k8z5;93 z@I?3pvi>)r{-{5BOkOxw@JN3a(1Jd)IY0jXL$sP&kqcUo`|*QUd5XpUjY>3*#f@}K zG6?D|K0&}|Cu(VH@8SJo@5~3`evfi%aAcvyMY*n`qgf*VFo#P1&7fsY;MdWMF!X66 zTZJpSs3R=)CP%32)R-*}P95VtMBkXh!WY8_N{^`Asw03t}ccf$P zvUn^5qP9$EL+NhcoQXHHD^d@pg55KmDKl9cApPZStCfVc4rDBY%?7oE38Hkl{x-AUCu8qdl80{Iyx9nP3qS7wSW`n|I9l(bbpV3 z4D5%x@S0&(vmwEcUii_?=Ry2GOBZC=gP7j;g=1n6V=cL|#*mgSz4OwiTaq>Dmhy&l z4a+!hh%M#sb>in6ZtfX@J#~pY02+lX)T>;W3S?5=@E=4f$6^X`{HFUG#LuP8U)Bs} zkm`$*aj#!pKk>-~B&r{TsY#W(tFdWoG3UdnqRe<7O>aH}Y%M$);WZ$0F0T8i>1Z{y z9YyoSL6VZb&4@euDmnFk8t_i~^Apsi=a75qYC7KT&S(Z~=cx$oKVH3V6= zRa1<8Ol)k^UiXZQZWh+>6st}-3^hht7W^AQ)h!u2kdzg2W#f0szt91ZCdN0J6oCD4g`?{;S;BlNj3De4 zz6GPR-3j=TxwriPLrMNLJaNYkoBEp`Hhb(8rN|u)5W5?@YE7vbc*u$ln_i?=0sK(W z{j>Ts;njD1hCSfu)^fb7+^(bf59{(L^>jFJ_0oa2Tvv6zaGOvhK^5hSP+txmO*lxw z$Lct&oJ%iZm$N284lP=p#kgwm8{|}8i4|{Rl5}|Vnr*BpcD!!zC7+(}s-85(EV`Em zBA+P4c0byzrFE1YTOR4>LN*&IDSt;5GaRR%3wS@%lob@b(OISncUb|`q5G00*sXd4 zGI-+V`0b6pix&Fe$B%>J06nQA;T!u&MfS)e0WacX6s?@qZsOAm;Q(d*n_TE;?ZG0V zI#yF$@J!Xm8>y%Kh7T-kd1K`*30*#Xs)Gbq#d$U3mPMYjKfk4$d2{?wcMEKF#vL>4 zjWJ!LX7kgEKR;SE*_MJiK=O=?hF{34InMOd;q9!86!zVDrvY{2!bX7@q_yDQXx!I3 zfmP{v*vgzo36@o1i`x#d@U+lKoxt~*%T(J~qxOIxO|~o6IQQYo6hTNLgt;FD^ASR- z)gdeKWxtT}4YZxq*=7H6B2oI*`u`YJB;!D=SNbB9>5YO8%~VxPJ{zLf8pU(_|qE??3H*hxw zG5?VV450?+p(%g-tKo98KcC-zMXb84v4n<3q^z)veV>`Ab^FtTwA=o}DLb2S=)$!} zYlBj5^I7h1^$`WVt^<2|lYT9BsM?^xt!jt3t51BadY?kh-$O8NA3h~O3 zt8=&YE3tD2ut-2(vSorVhJ5`G_xU%ba+mmr!`Z2590hfhUcG@i7CxNWNLzr0po%3m^%Pb<4xe9Uc0 z4WZ$vMhdL^AK~7gM(4+~^bs1Te?_n22`;3u)>Lmo92^3? z^L5Dz|49zogebFsX5p9aw2LfO(%z=mh&1+E3%`{-}uAg7%P8nh}8 z-x{;ah9}eg@`8zJ7%arkGz_{*gJkSp&hDS#^j@5-F*@HgT@5@+Byvdwt^D6z*{5-_ z3>*W4aGw5U0h z-DTYFJDh8e-H%S~9!DB_AUl_ErME-rO&>dm>OP{O~CPBA0-dCBXbv3KH`?^&^=*HCs z0$4Sc@Sg@&U%C3msz=7ys-Gh~hgz!VVQ17?$_*#CAwwY7uRKa~zXb)W?8Bb>vx`oK z1_77rOrb@Z2{P_lAVThGjFmu1`&(GZ(+C>R)D0eG6o0y^$I%Qi>DSd6YJFb!x|h^X+G1aSR^krtVzGXHrn+o0iqk*VhYkfB20r950GpfJ$kgSKg&yb z^+2K^w0RfQZhHyb`gD$P&2CF3 zo_!XPif?$Wpwjdg;YzJ3^z$MSYbm{`rJDh9@JtP8 zk)|goj2>0cTJA#i2h+N_7In{ex@0!RGyv@&1hN`KC1P<$33V3V z3pT>aK4WP^u!L792NdxKuIyg3Bor6wvm%^B>u_CiuB*($^)4ZV2@-sPJUwVhlql=b z*KkZ(H@g8Wfzk`oo7r*dueV-40oYqRJm%Qo(AI&j3NpZgV1yNAp!&_u+8-0~prgo4P1`KU>8H6YRaC-c!^NBkEDp3;-&h>6J6~rL-y;*z9k{JuC zE)#xV2r##_Y?3ItwaPLtCqqKXBA&TC6}c7mX=0^@U@<_`oN=v!moJ1;t-#VIlm`53 zvVTonJlqm`N@NBmTVTmm$^1Gkz(E>7c>p{svF=!mj`Bfq+jDDz$CLi@EUpuQAm8 z4x-Ehmh-WcS`07Ibp769tge*Q%aN#$(H~l!L7hyT;~0~uw${|$3(t=U-c_a!e&a?o z%H#Tl`69#3n+Lhh>9w)3-7Yk;Ek2cZik8Zqvj3ZntGzgxf`q35YG~tn*|)Mz>m?#S ztTEPWwcBQi&d(qi$zN^CGVGuPKKt@hB+7@kdc!)I{rY2`+h2$6enF<%lxA2c$T6x$ zveArbOqe3~`;P|$g(z~#4Vdt^uVHb%Yj$-KALYN_kMQ*>$wqS~OJRz?cno6Wp(|ZT zs^9P#vz6GN-vl>y|KklZ4i5`8JgXX{^=e`EOT@XCU&P({!(D%Sx4nn)eUWSw;c{I6 zGD`c15*IlqS-SobnzY&QhqosP6}tQEU7_@zI!4`59h!fPSnji57o1*#PYM2%`ZqCt zHyB1#)us{b0mxLV)#^dflwZFfGh~VasfDvCzbFA-^*@I6uU_iw@cdi*YYZ#lbCNP^ zXlRlhc+($a`?n+Zs%B6ja>v!C@I_bY`TqBeroS*|6OL}PPx>Uc(J33sy(!|Jkpxy3twxwOUHc`bt&-+^2TlL7+$GF+aP6R`E`A!*Y zGRD3{R3l1gC2(h{rr)-wD`u{II^q7bfU5;;Yh#>usjThNdaEa64utS zdhy{*c1qjAFmDdx-aUiJ>JVm_yQvpDhINNANku;T&|nvAeqiw2)L>29Akx$1FoT}~ zu>b{%1;gyCf|u-n_1Ns6^^oK%sGDn57c5Iq>OWlR$nEGk0fz`8&Yhm^%@y=0_3Eu| zZ_ne|DjO?XyV({eMYg2Ui2|$r6qxO#wU2`mUXk|g7j`Yw-zy@~sUd9Mz1+4B*KVO_ zIe9drVs2?0W#&Jyv9>dg?R7G%ABmo<4QqyK724ojVQ^p;t`5xyQM&jIQpsPLOr~;v zMNhDszq17YxrPV#pU@*$VG7B@^x++2q+PYkQ}k?2ax9cwUM|>Br@U=TK{T%251PG} z()>v#pn1eF1DK&ZpNAbVn|-Oiky_0X)@=XwgyVWgwGz&8mY^K`5BHRA#?P!h%$CKU z<(LPsB`0xZXknd}$5M}V%?I51!ti{Ry$-{YRUtQv_y zS9{<3z=n$!vO%i#{=nzQUpzw=;j62w?cLosi%{ClRQ3)ma?m1ZOWwy(_Kt6=x| zseVbXZMSZa=U&adi%5cUj_Eb#z9C#F39G7NRoY@2Wy;o^nV2}$1HS9uX}a(*?Jl?h zC&P_2>GRUkWNXs(5-zjdcbLkl;^S4?f&|MWaA|rao{C9CBIPuF1|? z_`G?0CL&Q#@EcY}dMyv7U7qcQ+sv~?=K%4XLaKsjtrDM{CJ5p$Ar%`Fb7W1bUSjCb z3RpwAiAr0{qm04`vxJkg&M)jMH*8woDEaJ(6zq0`a5Jh*VW`^$>*Htu*~$P~ppgg@WV!zx^`6 zYjb-k91UU5IO#ZCKj1iQtfmsWTAjR(SwH>>=~qJgupuI&@seYiTdDQ8nC+GoQQ-Pj z!6wry339C+6f}wWcOL&YKftnU8h4%5Tne*vcWXowW=W-rV_9yq_S%Qk=^%b`L6h<` z8qp%Dyr)zoy$0}M_pk|`=n*txCuzAdD%-$qjt^L|N0oz)l=uAxi_$A;&)O3I3uKr} z85_%=wBH#kNUhe|8I^xneg&+ISbOoetho7%`&$s#cjGl>F(5LEolQlTZ6TL)Jy@?4 z_BpA1!j@A_4u>dgB$NXq(&NC?x9Nhtfz+@cVHAt{7xPI#P(~Ec@(BabIxbo2s02p3DR&XhaQPSH_Y6diqmq{~ zuo()ZIsWup`?Dj`=U)866m6dHTeF=jvtGwN*ib$y_6xpSu3vX3xA{dMR2KGX@b$A~t9^-Fhy(RxE>OlEwbv4vu$e~BhZ0PBS$uB;0sZVWg8WsY? zk&hPOeRm}xI)rHwz^9T9*jneWjnB85!FA8M9wjt(#cb<2H(x6OV*V`<`*&p|xoXao zfio5?ARw@y&tT8E)~h3^X4oVuN;7_{zR-yE*Cc)Ik8~^vcte%#h}&G5jI}R!+^5Wx z>W>7Onmy-lep0YCa1{WF5Ej`O08t2_LaM;NKcP&OZx=J&pSapxXm2tIa6@&ps8wr6 zy5V1-4NL*#2ih3W|Bg1GvyJo%miN=7KYjXigaDqpF&H?K=&dkC%`7Jav*gz>-STg7 zN&{~&Dsi$NXPcsg1-A^i`rHH5IwboZPN$y(*@&55dXn|FH*NQGSE;*mj6BTiFHoO50pP`Pb_8S_ z^Y7xSpP;XgKj?u9^h+55DJFgRP$wyKb!vD%+nhIt@2Q}1X_Rb+0m9B)+{|Mp6p`wh zzLPOFgU^EHU@;{_}AgN>d3Fmay_0qS$EX+EMFHH%NXZdYv3m~ z-BG4ASgFQgSwDl)aiP#PCd-8cB!8cCRE-Bkt{cjf1^ja8w_mbcSaFn8obX%@OVQEm zq&1*3E{EQT5xJv_x=}$D!de8gAgoSt_f_o9DOq95nbGj}I$M~@uPr07>Oud{_T}go zUdzam*4e_|=mgd^>+{ZIw&jJGxn9erS*@bvHN>HoBG zCnSOX=LixaS@t{c#-~AfdWw6HoeGoKKz$&K=pXM(fAoIjW)CfAtVfr7{C1G zOTDT5`rXIl?=Oz1k=)M9%d>EF+ghFVA*2o*(f(0uFF|t(hi0 zq|v;4fg7?>Qih!40Bx__&mjrB!fXiL&L!KepdBUQtBgx(o7V7 z$Uz6mAAczb2P2UK01w<-Os1dg%BJ3kuv?HUsKEng8_Fv0^$oBcLSp1RAKv_Q{{xYb zWn)yBMmfM@G;^*m>>Hy+c?I;dUJ=qloFU(U!zLr39dJziB{-jbo$$KCFgz4x`ihXI zu??yEvwY4!5Ca+QS^nKTQNCv>3jryOJ3vqjOJhx<6qJ#`!MGizoko5EcFpIDEIs{{s%+vsSx%u>WU)gQ=O*gZuZ5!~pMFIEX_5 zn^-s4AMi(}>ZV@?We~fLELI$H8APLe1moOQ?&-1WYXEZIQYtcn)f_p5e7^Z~M|uMC zLQ;CVK&<(~pSJ>-cCESp1G6;RAVOd~^gw^l!uNL-J6o;B(b>nGoCV$ln9Zy z5OyTS!Be2t9|&)Sd_ZE;-oczPE5-THEU&6ugd*~a!0{k<4w#HVb&Wt}7AT%ro=iy` z3%%|Fisfr*IEVZX!SwX>@TzxQLC23g*baU>tp2PWFV%F&(l~0|@VX0OJ0O6)*~F2B zTBR~oUoeo}*sp3@SXdD}*AFD;{ZoD6$dkXzHvWGq|Cgc}U++sdq$Uy)=@^BSsvcSx z3K+h_H0BVJ4K`N3f2!PQ7_J&(GGB1Z22v4zIDusnrBHv)r3U`AYSc>d6Fz`H670iS zyC0r&^*#+o?)~ujeQJ^a`0~oNKR{Eh?(8Ii{v;7F_pT4OX7e{VU$&rg$6KEqQg4&r z#_e2zZAlcqh3ypX#5N^?#M>zBwMenU;H4O0bK}jr_#Ihk$U=ODa z>=CTQHFzxqX%jXlpqa@aw%^`3cc(s$uxnt+=@kk&lS$Z70wHd#G3U-qA4wYseaAem z^9YApqGA$v6F|u`Ju8i(g72^}EXkybd?{bL@wcJ#J3MAg5u5A@k}9EIB4h^rUR#j! zZu1TdEAzvX^MhK8h_4PCo6}_X(5){gi^q-Cz{063d}oXCz~+yI2F6P{i{lm+Nwe`> zA1bI9%HQ6(wTfjS3)Pa_I48R~aqUAHZg^Wz=izL=L~FSx$)ZXXNMD5QM(E%~NV$>% zJHD6IV`g%>g2ZD3`Tmp~nFK6>1A zJwKqWwa76uSrD;(roWpnq_>jvS}tPiEG(u_64JZrg;(`vA43xMSTdqa@*PpKYikER z6R8_Gn+=!71nQe_QRSFbV%y#|&5`OhXFE+!NJe>We6??@VfM@EtR+Av*^Dyf5O=!q z6iF@5NJ&)HhNky$?dUKS$`plPc$<)asnnN6+6B70$v@U+l^EaHu>pawT5NgSJhKL> zgv;6u7}^Ng?fEYZR)rR>yw;?<$~7$RqCHu!wmJ z@nEyTaQEwC~Bj<5sFB3)B|r=xKL9ruwoGi-e4p4zHMT;x#r6GjPR zX`yPz(2Z~FmIcJh&?&)?YtSd6-Aa)3ELT+dIrGh)gz+!OmaMne17uNt85ch`N%F5~ z%b03L%Pf7QwNHe3iFk~kmwT8#NE=kODanM`!B387ZrE9s8g6b*x3xK=%4h0q>8ie1 zjMf(}shn<#+en!yx@FVCYJa#=I9BGKuVAZhh40bW47co28NL+#${K--LsOxf<5dGp ze36^9)=F{aqarwX@g#1|bu2W4#wP5rLH~n0=FUsqGj8-5zQ&D_ZWL*^#F(I({GpjB zSbS4q*UdbJOE3&_ zN{;I&MhUB+us2muenmhwx}s+iW#dqFpxn#!c#V16yL2?8h*A)KeG8P&CQIego?y{C z8X`#p+i1wJt?GVBliQ_-)8+#>Ob~?!dRqlNl>@Z}krf7Uzv{!s5j6#Gs#N(EhYlI{C^Uzo=L6hMvfc_D)~2rEl%vqkn+QDwgKmq?1&jve zy{4*Rn|sW#b{9JFx&=+^+~J(?QXSgLZP%tFO#?>-RY>WwEMOT~-@-Renv77JOyt^h zCh*A(O)~L?MzIQ(EkEoon8nSgM-CNL(LSgi?iNmMDlR&be@eU>Vmx#t&0p6y_4P@6 z+v-?hxSrrwI{_gd|&{_Of;m{#?G{d;Qd*xDJvRYf_rzyGeXMm-4%~srGsPu&M z%+0mgkRrPA!fwZJ10PNJjBI+3p~CaWFLkngvjiscl%`qr;G&Ju^>$55$1j1@dY+Gh zLvIQi=gDmK0-^o)9T%)D-<+x!T>iius(-h-W+>C2tH~yp&nrWWSIljwN)I|&o2e}8 zRTU&KZctqLMRv%+{QbvqCccy?^95hDHzj^7a7*HRO+6>xb66vXHxbGs%`!OAVveSz z=?pP|G*>MIrw&dbiX<!Mfuyu3h|-$u3Ruo&eOIDI_ymkgWlF3iS!yEhD5VAV zdjo?oBy++B>2@}_nA+qDEv;8&ij8@BWlx|K4Tq32c}BpJfss2CDn)7fqS}-3cBWhTAP|H$* z50B$Cu6i%9JpC<1WhUs5Ii!WP{|IaUDHeIpFmb3^U+H#ha)L*?G^(ESiy8DpmY1=Z zoFFlbe*}W2FZM?(_2?lVeU#{;$fR=V8?`BwOd$NT~~cTSYH_rv@hUU<*JNw*+RjBZ*5AQBqdSxDHBx@&S^bEO3p@7dc(l19%fwG znPU$zfEt}Y*Ic~b1!2l9BC*CrS_6BkTUpgDV?E+*=3Xfr2sXqjPFG?@-=Ss=zNBzFfRb>tO~ zxr0&*^cSx3Q>Huk&{k^m>Q(5-C1j?fwl++J%<+H+DD%oZPx?@VkzwHu$AUes(+=6{ zCS%sZYSPu-nsc^)2+YVaXPyL-VdK~p!GbueQQc*;1}R<5>;ixDg$6$_k1DdWK=CTS z>1fFai;O+7arR|xSyjN@Y#4n0^AOb!||GBPlN zDVYly9gQyvh2YX}GHd{&xq!vjSQ%d_?02zREnROM?Vk?y0V|ELVeB>Uy7Mf)2EPH@ zPUIg`xtkUM)>)cy9AZdD7m>h!K7+vxj&dbbJJnK!T8!sPdO6;3klnMPdtf>__L-yp zcQ9>tsoL~A+WtgJ@5jCOd6LJ1DdNYMzk*sp5S^rCWMtgmUSC+Q<4sIf@S}L^O+vYg ze6t1dJb0J)RT6y0V9(cc<(u9lX!i$7 Date: Mon, 4 Jan 2021 11:11:22 +0800 Subject: [PATCH 22/26] nstep multidim support --- .../{Breakout_rew.PNG => Breakout_rew.png} | Bin .../c51/{Enduro_rew.PNG => Enduro_rew.png} | Bin .../{MsPacman_rew.PNG => MsPacman_rew.png} | Bin .../c51/{Pong_rew.PNG => Pong_rew.png} | Bin .../c51/{Qbert_rew.PNG => Qbert_rew.png} | Bin test/base/test_returns.py | 16 +++ tianshou/policy/base.py | 17 ++- tianshou/policy/modelfree/c51.py | 112 +++--------------- tianshou/utils/net/common.py | 2 +- 9 files changed, 43 insertions(+), 104 deletions(-) rename examples/atari/results/c51/{Breakout_rew.PNG => Breakout_rew.png} (100%) rename examples/atari/results/c51/{Enduro_rew.PNG => Enduro_rew.png} (100%) rename examples/atari/results/c51/{MsPacman_rew.PNG => MsPacman_rew.png} (100%) rename examples/atari/results/c51/{Pong_rew.PNG => Pong_rew.png} (100%) rename examples/atari/results/c51/{Qbert_rew.PNG => Qbert_rew.png} (100%) diff --git a/examples/atari/results/c51/Breakout_rew.PNG b/examples/atari/results/c51/Breakout_rew.png similarity index 100% rename from examples/atari/results/c51/Breakout_rew.PNG rename to examples/atari/results/c51/Breakout_rew.png diff --git a/examples/atari/results/c51/Enduro_rew.PNG b/examples/atari/results/c51/Enduro_rew.png similarity index 100% rename from examples/atari/results/c51/Enduro_rew.PNG rename to examples/atari/results/c51/Enduro_rew.png diff --git a/examples/atari/results/c51/MsPacman_rew.PNG b/examples/atari/results/c51/MsPacman_rew.png similarity index 100% rename from examples/atari/results/c51/MsPacman_rew.PNG rename to examples/atari/results/c51/MsPacman_rew.png diff --git a/examples/atari/results/c51/Pong_rew.PNG b/examples/atari/results/c51/Pong_rew.png similarity index 100% rename from examples/atari/results/c51/Pong_rew.PNG rename to examples/atari/results/c51/Pong_rew.png diff --git a/examples/atari/results/c51/Qbert_rew.PNG b/examples/atari/results/c51/Qbert_rew.png similarity index 100% rename from examples/atari/results/c51/Qbert_rew.PNG rename to examples/atari/results/c51/Qbert_rew.png diff --git a/test/base/test_returns.py b/test/base/test_returns.py index 69649e864..a8bdc7c9d 100644 --- a/test/base/test_returns.py +++ b/test/base/test_returns.py @@ -76,6 +76,10 @@ def target_q_fn(buffer, indice): return torch.tensor(-buffer.rew[indice], dtype=torch.float32) +def target_q_fn_multidim(buffer, indice): + return target_q_fn(buffer, indice).unsqueeze(1).repeat(1, 51) + + def compute_nstep_return_base(nstep, gamma, buffer, indice): returns = np.zeros_like(indice, dtype=np.float) buf_len = len(buffer) @@ -108,6 +112,10 @@ def test_nstep_returns(size=10000): assert np.allclose(returns, [2.6, 4, 4.4, 5.3, 6.2, 8, 8, 8.9, 9.8, 12]) r_ = compute_nstep_return_base(1, .1, buf, indice) assert np.allclose(returns, r_), (r_, returns) + returns_multidim = to_numpy(BasePolicy.compute_nstep_return( + batch, buf, indice, target_q_fn_multidim, gamma=.1, n_step=1 + ).pop('returns')) + assert np.allclose(returns_multidim, returns[:, np.newaxis]) # test nstep = 2 returns = to_numpy(BasePolicy.compute_nstep_return( batch, buf, indice, target_q_fn, gamma=.1, n_step=2).pop('returns')) @@ -115,6 +123,10 @@ def test_nstep_returns(size=10000): 3.4, 4, 5.53, 6.62, 7.8, 8, 9.89, 10.98, 12.2, 12]) r_ = compute_nstep_return_base(2, .1, buf, indice) assert np.allclose(returns, r_) + returns_multidim = to_numpy(BasePolicy.compute_nstep_return( + batch, buf, indice, target_q_fn_multidim, gamma=.1, n_step=2 + ).pop('returns')) + assert np.allclose(returns_multidim, returns[:, np.newaxis]) # test nstep = 10 returns = to_numpy(BasePolicy.compute_nstep_return( batch, buf, indice, target_q_fn, gamma=.1, n_step=10).pop('returns')) @@ -122,6 +134,10 @@ def test_nstep_returns(size=10000): 3.4, 4, 5.678, 6.78, 7.8, 8, 10.122, 11.22, 12.2, 12]) r_ = compute_nstep_return_base(10, .1, buf, indice) assert np.allclose(returns, r_) + returns_multidim = to_numpy(BasePolicy.compute_nstep_return( + batch, buf, indice, target_q_fn_multidim, gamma=.1, n_step=10 + ).pop('returns')) + assert np.allclose(returns_multidim, returns[:, np.newaxis]) if __name__ == '__main__': buf = ReplayBuffer(size) diff --git a/tianshou/policy/base.py b/tianshou/policy/base.py index 809751fe7..b875f6075 100644 --- a/tianshou/policy/base.py +++ b/tianshou/policy/base.py @@ -245,7 +245,7 @@ def compute_nstep_return( to False. :return: a Batch. The result will be stored in batch.returns as a - torch.Tensor with shape (bsz, ). + torch.Tensor with the same shape as target_q_fn's return tensor. """ rew = buffer.rew if rew_norm: @@ -257,12 +257,11 @@ def compute_nstep_return( mean, std = 0.0, 1.0 buf_len = len(buffer) terminal = (indice + n_step - 1) % buf_len - target_q_torch = target_q_fn(buffer, terminal).flatten() # (bsz, ) + target_q_torch = target_q_fn(buffer, terminal) # (bsz, ?) target_q = to_numpy(target_q_torch) target_q = _nstep_return(rew, buffer.done, target_q, indice, gamma, n_step, len(buffer), mean, std) - batch.returns = to_torch_as(target_q, target_q_torch) if hasattr(batch, "weight"): # prio buffer update batch.weight = to_torch_as(batch.weight, target_q_torch) @@ -275,7 +274,7 @@ def _compile(self) -> None: i64 = np.array([0, 1], dtype=np.int64) _episodic_return(f64, f64, b, 0.1, 0.1) _episodic_return(f32, f64, b, 0.1, 0.1) - _nstep_return(f64, b, f32, i64, 0.1, 1, 4, 1.0, 0.0) + _nstep_return(f64, b, f32, i64, 0.1, 1, 4, 0.0, 1.0) @njit @@ -311,7 +310,12 @@ def _nstep_return( std: float, ) -> np.ndarray: """Numba speedup: 0.3s -> 0.15s.""" - returns = np.zeros(indice.shape) + target_shape = target_q.shape + bsz = target_shape[0] + # change rew/target_q to 2d array + target_q = target_q.reshape(bsz, -1) + rew = rew.reshape(-1, 1) # assume reward is a scalar + returns = np.zeros(target_q.shape) gammas = np.full(indice.shape, n_step) for n in range(n_step - 1, -1, -1): now = (indice + n) % buf_len @@ -319,5 +323,6 @@ def _nstep_return( returns[done[now] > 0] = 0.0 returns = (rew[now] - mean) / std + gamma * returns target_q[gammas != n_step] = 0.0 + gammas = gammas.reshape(-1, 1) target_q = target_q * (gamma ** gammas) + returns - return target_q + return target_q.reshape(target_shape) diff --git a/tianshou/policy/modelfree/c51.py b/tianshou/policy/modelfree/c51.py index 4d1f148ee..a0662d2ff 100644 --- a/tianshou/policy/modelfree/c51.py +++ b/tianshou/policy/modelfree/c51.py @@ -1,7 +1,6 @@ import torch import numpy as np -from numba import njit -from typing import Any, Dict, Union, Optional, Tuple +from typing import Any, Dict, Union, Optional from tianshou.policy import DQNPolicy from tianshou.data import Batch, ReplayBuffer, to_torch_as, to_numpy @@ -19,7 +18,7 @@ class C51Policy(DQNPolicy): :param float v_min: the value of the smallest atom in the support set, defaults to -10.0. :param float v_max: the value of the largest atom in the support set, - defaults to -10.0. + defaults to 10.0. :param int estimation_step: greater than 1, the number of steps to look ahead. :param int target_update_freq: the target network update frequency (0 if @@ -30,7 +29,7 @@ class C51Policy(DQNPolicy): .. seealso:: Please refer to :class:`~tianshou.policy.DQNPolicy` for more detailed - explanation. + explanation. """ def __init__( @@ -46,9 +45,10 @@ def __init__( reward_normalization: bool = False, **kwargs: Any, ) -> None: - super().__init__(model, optim, discount_factor, - estimation_step, target_update_freq, - reward_normalization, **kwargs) + super().__init__(model, optim, discount_factor, estimation_step, + target_update_freq, reward_normalization, **kwargs) + assert num_atoms > 1, "num_atoms should be greater than 1" + assert v_min < v_max, "v_max should be larger than v_min" self._num_atoms = num_atoms self._v_min = v_min self._v_max = v_max @@ -56,61 +56,10 @@ def __init__( self._num_atoms) self.delta_z = (v_max - v_min) / (num_atoms - 1) - @staticmethod - def prepare_n_step( - batch: Batch, - buffer: ReplayBuffer, - indice: np.ndarray, - gamma: float = 0.99, - n_step: int = 1, - rew_norm: bool = False, - ) -> Batch: - """Modify the obs_next, done and rew in batch for computing n-step return. - - :param batch: a data batch, which is equal to buffer[indice]. - :type batch: :class:`~tianshou.data.Batch` - :param buffer: a data buffer which contains several full-episode data - chronologically. - :type buffer: :class:`~tianshou.data.ReplayBuffer` - :param indice: sampled timestep. - :type indice: numpy.ndarray - :param float gamma: the discount factor, should be in [0, 1], defaults - to 0.99. - :param int n_step: the number of estimation step, should be an int - greater than 0, defaults to 1. - :param bool rew_norm: normalize the reward to Normal(0, 1), defaults - to False. - - :return: a Batch with modified obs_next, done and rew. - """ - buf_len = len(buffer) - if rew_norm: - bfr = buffer.rew[: min(buf_len, 1000)] # avoid large buffer - mean, std = bfr.mean(), bfr.std() - if np.isclose(std, 0, 1e-2): - mean, std = 0.0, 1.0 - else: - mean, std = 0.0, 1.0 - buffer_n = buffer[(indice + n_step - 1) % buf_len] - batch.obs_next = buffer_n.obs_next - rew_n, done_n = _nstep_batch(buffer.rew, buffer.done, - indice, gamma, n_step, buf_len, mean, std) - batch.rew = rew_n - batch.done = done_n - return batch - - def process_fn( - self, batch: Batch, buffer: ReplayBuffer, indice: np.ndarray - ) -> Batch: - """Prepare the batch for calculating the n-step return. - - More details can be found at - :meth:`~tianshou.policy.C51Policy.prepare_n_step`. - """ - batch = self.prepare_n_step( - batch, buffer, indice, - self._gamma, self._n_step, self._rew_norm) - return batch + def _target_q( + self, buffer: ReplayBuffer, indice: np.ndarray + ) -> torch.Tensor: + return self.support.repeat(len(indice), 1) # shape: [bsz, num_atoms] def forward( self, @@ -164,25 +113,15 @@ def _target_dist(self, batch: Batch) -> torch.Tensor: a = next_b.act next_dist = next_b.logits next_dist = next_dist[np.arange(len(a)), a, :] - device = next_dist.device - reward = torch.from_numpy(batch.rew).to(device).unsqueeze(1) - done = torch.from_numpy(batch.done).to(device).float().unsqueeze(1) - support = self.support.to(device) - - # Compute the projection of bellman update Tz onto the support z. - target_support = reward + ( - self._gamma ** self._n_step) * (1.0 - done) * support.unsqueeze(0) - target_support = target_support.clamp(self._v_min, self._v_max) - + support = self.support.to(next_dist.device) + target_support = batch.returns.clamp( + self._v_min, self._v_max).to(next_dist.device) # An amazing trick for calculating the projection gracefully. # ref: https://github.com/ShangtongZhang/DeepRL target_dist = (1 - (target_support.unsqueeze(1) - support.view(1, -1, 1)).abs() / self.delta_z ).clamp(0, 1) * next_dist.unsqueeze(1) - target_dist = target_dist.sum(-1) - if hasattr(batch, "weight"): # prio buffer update - batch.weight = to_torch_as(batch.weight, target_dist) - return target_dist + return target_dist.sum(-1) def learn(self, batch: Batch, **kwargs: Any) -> Dict[str, float]: if self._target and self._cnt % self._freq == 0: @@ -201,24 +140,3 @@ def learn(self, batch: Batch, **kwargs: Any) -> Dict[str, float]: self.optim.step() self._cnt += 1 return {"loss": loss.item()} - - -@njit -def _nstep_batch( - rew: np.ndarray, - done: np.ndarray, - indice: np.ndarray, - gamma: float, - n_step: int, - buf_len: int, - mean: float, - std: float, -) -> Tuple[np.ndarray, np.ndarray]: - rew_n = np.zeros(indice.shape) - done_n = done[indice] - for n in range(n_step - 1, -1, -1): - now = (indice + n) % buf_len - done_t = done[now] - done_n = np.bitwise_or(done_n, done_t) - rew_n = (rew[now] - mean) / std + (1.0 - done_t) * gamma * rew_n - return rew_n, done_n diff --git a/tianshou/utils/net/common.py b/tianshou/utils/net/common.py index afde5f3f9..ea804385a 100644 --- a/tianshou/utils/net/common.py +++ b/tianshou/utils/net/common.py @@ -175,7 +175,7 @@ class CategoricalNet(Net): .. seealso:: Please refer to :class:`~tianshou.utils.net.common.Net` for - more detailed explanation. + more detailed explanation. """ def __init__( From 22fa78a7a50b37c5ff314ca9fdb4103ed1884a7b Mon Sep 17 00:00:00 2001 From: Trinkle23897 Date: Mon, 4 Jan 2021 12:27:13 +0800 Subject: [PATCH 23/26] fix nstep rew reshape --- tianshou/policy/base.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tianshou/policy/base.py b/tianshou/policy/base.py index b875f6075..6e172dfd7 100644 --- a/tianshou/policy/base.py +++ b/tianshou/policy/base.py @@ -312,16 +312,15 @@ def _nstep_return( """Numba speedup: 0.3s -> 0.15s.""" target_shape = target_q.shape bsz = target_shape[0] - # change rew/target_q to 2d array + # change target_q to 2d array target_q = target_q.reshape(bsz, -1) - rew = rew.reshape(-1, 1) # assume reward is a scalar returns = np.zeros(target_q.shape) gammas = np.full(indice.shape, n_step) for n in range(n_step - 1, -1, -1): now = (indice + n) % buf_len gammas[done[now] > 0] = n returns[done[now] > 0] = 0.0 - returns = (rew[now] - mean) / std + gamma * returns + returns = (rew[now].reshape(-1, 1) - mean) / std + gamma * returns target_q[gammas != n_step] = 0.0 gammas = gammas.reshape(-1, 1) target_q = target_q * (gamma ** gammas) + returns From 3efac0163abb78cfdf621c05b026c165fca9b104 Mon Sep 17 00:00:00 2001 From: Trinkle23897 Date: Mon, 4 Jan 2021 16:21:31 +0800 Subject: [PATCH 24/26] merge categoricalNet to Net --- test/discrete/test_c51.py | 7 ++-- tianshou/utils/net/common.py | 63 ++++++------------------------------ 2 files changed, 12 insertions(+), 58 deletions(-) diff --git a/test/discrete/test_c51.py b/test/discrete/test_c51.py index eff2c898f..eb97e56b6 100644 --- a/test/discrete/test_c51.py +++ b/test/discrete/test_c51.py @@ -8,7 +8,7 @@ from tianshou.policy import C51Policy from tianshou.env import DummyVectorEnv -from tianshou.utils.net.common import CategoricalNet +from tianshou.utils.net.common import Net from tianshou.trainer import offpolicy_trainer from tianshou.data import Collector, ReplayBuffer, PrioritizedReplayBuffer @@ -63,9 +63,8 @@ def test_c51(args=get_args()): train_envs.seed(args.seed) test_envs.seed(args.seed) # model - net = CategoricalNet(args.layer_num, args.state_shape, - args.action_shape, args.device, # dueling=(1, 1) - num_atoms=args.num_atoms).to(args.device) + net = Net(args.layer_num, args.state_shape, args.action_shape, args.device, + softmax=True, num_atoms=args.num_atoms).to(args.device) optim = torch.optim.Adam(net.parameters(), lr=args.lr) policy = C51Policy(net, optim, args.gamma, args.num_atoms, args.v_min, args.v_max, args.n_step, diff --git a/tianshou/utils/net/common.py b/tianshou/utils/net/common.py index ea804385a..40f050af8 100644 --- a/tianshou/utils/net/common.py +++ b/tianshou/utils/net/common.py @@ -53,6 +53,8 @@ def __init__( self.device = device self.dueling = dueling self.softmax = softmax + self.num_atoms = num_atoms + self.action_num = np.prod(action_shape) input_size = np.prod(state_shape) if concat: input_size += np.prod(action_shape) @@ -66,7 +68,7 @@ def __init__( if dueling is None: if action_shape and not concat: model += [nn.Linear( - hidden_layer_size, num_atoms * np.prod(action_shape))] + hidden_layer_size, num_atoms * self.action_num)] else: # dueling DQN q_layer_num, v_layer_num = dueling Q, V = [], [] @@ -80,7 +82,7 @@ def __init__( if action_shape and not concat: Q += [nn.Linear( - hidden_layer_size, num_atoms * np.prod(action_shape))] + hidden_layer_size, num_atoms * self.action_num)] V += [nn.Linear(hidden_layer_size, num_atoms)] self.Q = nn.Sequential(*Q) @@ -99,7 +101,12 @@ def forward( logits = self.model(s) if self.dueling is not None: # Dueling DQN q, v = self.Q(logits), self.V(logits) + if self.num_atoms > 1: + v = v.view(-1, 1, self.num_atoms) + q = q.view(-1, self.action_num, self.num_atoms) logits = q - q.mean(dim=1, keepdim=True) + v + elif self.num_atoms > 1: + logits = logits.view(-1, self.action_num, self.num_atoms) if self.softmax: logits = torch.softmax(logits, dim=-1) return logits, state @@ -164,55 +171,3 @@ def forward( # please ensure the first dim is batch size: [bsz, len, ...] return s, {"h": h.transpose(0, 1).detach(), "c": c.transpose(0, 1).detach()} - - -class CategoricalNet(Net): - """Simple MLP backbone. - - For advanced usage (how to customize the network), please refer to - :ref:`build_the_network`. - - .. seealso:: - - Please refer to :class:`~tianshou.utils.net.common.Net` for - more detailed explanation. - """ - - def __init__( - self, - layer_num: int, - state_shape: tuple, - action_shape: Optional[Union[tuple, int]] = 0, - device: Union[str, int, torch.device] = "cpu", - concat: bool = False, - hidden_layer_size: int = 128, - dueling: Optional[Tuple[int, int]] = None, - norm_layer: Optional[Callable[[int], nn.modules.Module]] = None, - num_atoms: int = 51, - ) -> None: - super().__init__(layer_num, state_shape, action_shape, - device, True, concat, hidden_layer_size, - dueling, norm_layer, num_atoms) - self.action_shape = action_shape - self.num_atoms = num_atoms - - def forward( - self, - s: Union[np.ndarray, torch.Tensor], - state: Optional[Dict[str, torch.Tensor]] = None, - info: Dict[str, Any] = {}, - ) -> Tuple[torch.Tensor, Dict[str, torch.Tensor]]: - """Mapping: s -> flatten -> logits.""" - s = to_torch(s, device=self.device, dtype=torch.float32) - s = s.reshape(s.size(0), -1) - logits = self.model(s) - if self.dueling is not None: # Dueling DQN - q, v = self.Q(logits), self.V(logits) - v = v.view(-1, 1, self.num_atoms), - q = q.view(-1, np.prod(self.action_shape), self.num_atoms) - logits = q - q.mean(dim=1, keepdim=True) + v - else: - logits = logits.view( - -1, np.prod(self.action_shape), self.num_atoms) - logits = torch.softmax(logits, dim=-1) - return logits, state From d315052044514d97897bd0e1445c3b6c19a7cd79 Mon Sep 17 00:00:00 2001 From: Trinkle23897 Date: Mon, 4 Jan 2021 16:35:56 +0800 Subject: [PATCH 25/26] change self.support to nn.Parameter --- examples/atari/atari_c51.py | 9 +++++---- test/discrete/test_c51.py | 9 +++++---- tianshou/policy/modelfree/c51.py | 17 +++++++++-------- 3 files changed, 19 insertions(+), 16 deletions(-) diff --git a/examples/atari/atari_c51.py b/examples/atari/atari_c51.py index 22c33e368..ce465ed2a 100644 --- a/examples/atari/atari_c51.py +++ b/examples/atari/atari_c51.py @@ -75,12 +75,13 @@ def test_c51(args=get_args()): test_envs.seed(args.seed) # define model net = C51(*args.state_shape, args.action_shape, - args.num_atoms, args.device).to(args.device) + args.num_atoms, args.device) optim = torch.optim.Adam(net.parameters(), lr=args.lr) # define policy - policy = C51Policy(net, optim, args.gamma, args.num_atoms, - args.v_min, args.v_max, args.n_step, - target_update_freq=args.target_update_freq) + policy = C51Policy( + net, optim, args.gamma, args.num_atoms, args.v_min, args.v_max, + args.n_step, target_update_freq=args.target_update_freq + ).to(args.device) # load a previous policy if args.resume_path: policy.load_state_dict(torch.load( diff --git a/test/discrete/test_c51.py b/test/discrete/test_c51.py index eb97e56b6..f017955e6 100644 --- a/test/discrete/test_c51.py +++ b/test/discrete/test_c51.py @@ -64,11 +64,12 @@ def test_c51(args=get_args()): test_envs.seed(args.seed) # model net = Net(args.layer_num, args.state_shape, args.action_shape, args.device, - softmax=True, num_atoms=args.num_atoms).to(args.device) + softmax=True, num_atoms=args.num_atoms) optim = torch.optim.Adam(net.parameters(), lr=args.lr) - policy = C51Policy(net, optim, args.gamma, args.num_atoms, - args.v_min, args.v_max, args.n_step, - target_update_freq=args.target_update_freq) + policy = C51Policy( + net, optim, args.gamma, args.num_atoms, args.v_min, args.v_max, + args.n_step, target_update_freq=args.target_update_freq + ).to(args.device) # buffer if args.prioritized_replay > 0: buf = PrioritizedReplayBuffer( diff --git a/tianshou/policy/modelfree/c51.py b/tianshou/policy/modelfree/c51.py index a0662d2ff..96cc6801a 100644 --- a/tianshou/policy/modelfree/c51.py +++ b/tianshou/policy/modelfree/c51.py @@ -3,7 +3,7 @@ from typing import Any, Dict, Union, Optional from tianshou.policy import DQNPolicy -from tianshou.data import Batch, ReplayBuffer, to_torch_as, to_numpy +from tianshou.data import Batch, ReplayBuffer, to_numpy class C51Policy(DQNPolicy): @@ -52,8 +52,10 @@ def __init__( self._num_atoms = num_atoms self._v_min = v_min self._v_max = v_max - self.support = torch.linspace(self._v_min, self._v_max, - self._num_atoms) + self.support = torch.nn.Parameter( + torch.linspace(self._v_min, self._v_max, self._num_atoms), + requires_grad=False, + ) self.delta_z = (v_max - v_min) / (num_atoms - 1) def _target_q( @@ -85,7 +87,7 @@ def forward( obs = batch[input] obs_ = obs.obs if hasattr(obs, "obs") else obs dist, h = model(obs_, state=state, info=batch.info) - q = (dist * to_torch_as(self.support, dist)).sum(2) + q = (dist * self.support).sum(2) act: np.ndarray = to_numpy(q.max(dim=1)[1]) if hasattr(obs, "mask"): # some of actions are masked, they cannot be selected @@ -113,13 +115,11 @@ def _target_dist(self, batch: Batch) -> torch.Tensor: a = next_b.act next_dist = next_b.logits next_dist = next_dist[np.arange(len(a)), a, :] - support = self.support.to(next_dist.device) - target_support = batch.returns.clamp( - self._v_min, self._v_max).to(next_dist.device) + target_support = batch.returns.clamp(self._v_min, self._v_max) # An amazing trick for calculating the projection gracefully. # ref: https://github.com/ShangtongZhang/DeepRL target_dist = (1 - (target_support.unsqueeze(1) - - support.view(1, -1, 1)).abs() / self.delta_z + self.support.view(1, -1, 1)).abs() / self.delta_z ).clamp(0, 1) * next_dist.unsqueeze(1) return target_dist.sum(-1) @@ -135,6 +135,7 @@ def learn(self, batch: Batch, **kwargs: Any) -> Dict[str, float]: curr_dist = curr_dist[np.arange(len(act)), act, :] cross_entropy = - (target_dist * torch.log(curr_dist + 1e-8)).sum(1) loss = (cross_entropy * weight).mean() + # ref: https://github.com/Kaixhin/Rainbow/blob/master/agent.py L94-100 batch.weight = cross_entropy.detach() # prio-buffer loss.backward() self.optim.step() From dbbfb7d4c31af42d4a0e0509b0d7d941ae72d27e Mon Sep 17 00:00:00 2001 From: Trinkle23897 Date: Wed, 6 Jan 2021 10:00:30 +0800 Subject: [PATCH 26/26] improve coverage --- test/base/test_utils.py | 6 +++++- tianshou/utils/net/discrete.py | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/test/base/test_utils.py b/test/base/test_utils.py index 6057dfc6b..e947571fc 100644 --- a/test/base/test_utils.py +++ b/test/base/test_utils.py @@ -4,7 +4,7 @@ from tianshou.utils import MovAvg from tianshou.utils import SummaryWriter from tianshou.utils.net.common import Net -from tianshou.utils.net.discrete import DQN +from tianshou.utils.net.discrete import DQN, C51 from tianshou.exploration import GaussianNoise, OUNoise from tianshou.utils.net.continuous import RecurrentActorProb, RecurrentCritic @@ -61,6 +61,10 @@ def test_net(): expect_output_shape = [bsz, *action_shape] net = DQN(*state_shape, action_shape) assert list(net(data)[0].shape) == expect_output_shape + num_atoms = 51 + net = C51(*state_shape, action_shape, num_atoms) + expect_output_shape = [bsz, *action_shape, num_atoms] + assert list(net(data)[0].shape) == expect_output_shape def test_summary_writer(): diff --git a/tianshou/utils/net/discrete.py b/tianshou/utils/net/discrete.py index 826b067b3..bff229cd7 100644 --- a/tianshou/utils/net/discrete.py +++ b/tianshou/utils/net/discrete.py @@ -145,7 +145,7 @@ def __init__( h: int, w: int, action_shape: Sequence[int], - num_atoms: int, + num_atoms: int = 51, device: Union[str, int, torch.device] = "cpu", ) -> None: super().__init__(c, h, w, [np.prod(action_shape) * num_atoms], device)