From b0f82c5d9bce7693ae468a18f058f9e1abeff08e Mon Sep 17 00:00:00 2001 From: KeqiangSun Date: Mon, 1 Apr 2024 18:56:25 +0000 Subject: [PATCH] add 300VW --- .gitignore | 1 + README.md | 1 + configs/_base_/datasets/300vw.py | 134 ++++ docs/en/dataset_zoo/2d_face_keypoint.md | 55 ++ docs/src/papers/datasets/300vw.md | 18 + docs/zh_cn/dataset_zoo/2d_face_keypoint.md | 56 ++ mmpose/datasets/datasets/face/__init__.py | 4 +- .../datasets/face/face_300vw_dataset.py | 114 +++ mmpose/visualization/fast_visualizer.py | 90 ++- tests/data/300vw/001/annot/000006.pts | 72 ++ tests/data/300vw/001/annot/000009.pts | 72 ++ tests/data/300vw/001/imgs/000006.jpg | Bin 0 -> 47251 bytes tests/data/300vw/001/imgs/000009.jpg | Bin 0 -> 47565 bytes tests/data/300vw/401/annot/000731.pts | 72 ++ tests/data/300vw/401/annot/000732.pts | 72 ++ tests/data/300vw/401/imgs/000731.jpg | Bin 0 -> 17280 bytes tests/data/300vw/401/imgs/000732.jpg | Bin 0 -> 17459 bytes tests/data/300vw/anno_300vw.json | 690 ++++++++++++++++++ tests/data/300vw/broken_frames.npy | Bin 0 -> 6696 bytes .../test_face_300vw_dataset.py | 182 +++++ tools/dataset_converters/300vw2coco.py | 254 +++++++ 21 files changed, 1878 insertions(+), 9 deletions(-) create mode 100644 configs/_base_/datasets/300vw.py create mode 100644 docs/src/papers/datasets/300vw.md create mode 100644 mmpose/datasets/datasets/face/face_300vw_dataset.py create mode 100644 tests/data/300vw/001/annot/000006.pts create mode 100644 tests/data/300vw/001/annot/000009.pts create mode 100644 tests/data/300vw/001/imgs/000006.jpg create mode 100644 tests/data/300vw/001/imgs/000009.jpg create mode 100644 tests/data/300vw/401/annot/000731.pts create mode 100644 tests/data/300vw/401/annot/000732.pts create mode 100644 tests/data/300vw/401/imgs/000731.jpg create mode 100644 tests/data/300vw/401/imgs/000732.jpg create mode 100644 tests/data/300vw/anno_300vw.json create mode 100644 tests/data/300vw/broken_frames.npy create mode 100644 tests/test_datasets/test_datasets/test_face_datasets/test_face_300vw_dataset.py create mode 100644 tools/dataset_converters/300vw2coco.py diff --git a/.gitignore b/.gitignore index 1b18d31b7f..2b337460f3 100644 --- a/.gitignore +++ b/.gitignore @@ -126,6 +126,7 @@ docs/**/modelzoo.md !tests/data/**/*.log.json !tests/data/**/*.pth !tests/data/**/*.npy +!tests/data/**/vis/ # Pytorch *.pth diff --git a/README.md b/README.md index 6d0fcb2134..a45e03ec9f 100644 --- a/README.md +++ b/README.md @@ -243,6 +243,7 @@ A summary can be found in the [Model Zoo](https://mmpose.readthedocs.io/en/lates - [x] [Human3.6M](https://mmpose.readthedocs.io/en/latest/model_zoo_papers/datasets.html#human3-6m-tpami-2014) \[[homepage](http://vision.imar.ro/human3.6m/description.php)\] (TPAMI'2014) - [x] [COCO](https://mmpose.readthedocs.io/en/latest/model_zoo_papers/datasets.html#coco-eccv-2014) \[[homepage](http://cocodataset.org/)\] (ECCV'2014) - [x] [CMU Panoptic](https://mmpose.readthedocs.io/en/latest/model_zoo_papers/datasets.html#cmu-panoptic-iccv-2015) \[[homepage](http://domedb.perception.cs.cmu.edu/)\] (ICCV'2015) +- [x] [300VW](https://mmpose.readthedocs.io/en/latest/model_zoo_papers/datasets.html#300w-imavis-2016) \[[homepage](https://ibug.doc.ic.ac.uk/resources/300-VW/)\] (ICCV'2015) - [x] [DeepFashion](https://mmpose.readthedocs.io/en/latest/model_zoo_papers/datasets.html#deepfashion-cvpr-2016) \[[homepage](http://mmlab.ie.cuhk.edu.hk/projects/DeepFashion/LandmarkDetection.html)\] (CVPR'2016) - [x] [300W](https://mmpose.readthedocs.io/en/latest/model_zoo_papers/datasets.html#300w-imavis-2016) \[[homepage](https://ibug.doc.ic.ac.uk/resources/300-W/)\] (IMAVIS'2016) - [x] [RHD](https://mmpose.readthedocs.io/en/latest/model_zoo_papers/datasets.html#rhd-iccv-2017) \[[homepage](https://lmb.informatik.uni-freiburg.de/resources/datasets/RenderedHandposeDataset.en.html)\] (ICCV'2017) diff --git a/configs/_base_/datasets/300vw.py b/configs/_base_/datasets/300vw.py new file mode 100644 index 0000000000..f75d6ec922 --- /dev/null +++ b/configs/_base_/datasets/300vw.py @@ -0,0 +1,134 @@ +dataset_info = dict( + dataset_name='300vw', + paper_info=dict( + author='Jie Shen, Stefanos Zafeiriou, Grigorios G. Chrysos, ' + 'Jean Kossaifi, Georgios Tzimiropoulos, Maja Pantic', + title='The First Facial Landmark Tracking in-the-Wild Challenge: ' + 'Benchmark and Results', + container='Proceedings of the IEEE ' + 'international conference on computer vision workshops', + year='2016', + homepage='https://ibug.doc.ic.ac.uk/resources/300-VW/', + ), + keypoint_info={ + 0: dict(name='kpt-0', id=0, color=[255, 0, 0], type='', swap='kpt-16'), + 1: dict(name='kpt-1', id=1, color=[255, 0, 0], type='', swap='kpt-15'), + 2: dict(name='kpt-2', id=2, color=[255, 0, 0], type='', swap='kpt-14'), + 3: dict(name='kpt-3', id=3, color=[255, 0, 0], type='', swap='kpt-13'), + 4: dict(name='kpt-4', id=4, color=[255, 0, 0], type='', swap='kpt-12'), + 5: dict(name='kpt-5', id=5, color=[255, 0, 0], type='', swap='kpt-11'), + 6: dict(name='kpt-6', id=6, color=[255, 0, 0], type='', swap='kpt-10'), + 7: dict(name='kpt-7', id=7, color=[255, 0, 0], type='', swap='kpt-9'), + 8: dict(name='kpt-8', id=8, color=[255, 0, 0], type='', swap=''), + 9: dict(name='kpt-9', id=9, color=[255, 0, 0], type='', swap='kpt-7'), + 10: + dict(name='kpt-10', id=10, color=[255, 0, 0], type='', swap='kpt-6'), + 11: + dict(name='kpt-11', id=11, color=[255, 0, 0], type='', swap='kpt-5'), + 12: + dict(name='kpt-12', id=12, color=[255, 0, 0], type='', swap='kpt-4'), + 13: + dict(name='kpt-13', id=13, color=[255, 0, 0], type='', swap='kpt-3'), + 14: + dict(name='kpt-14', id=14, color=[255, 0, 0], type='', swap='kpt-2'), + 15: + dict(name='kpt-15', id=15, color=[255, 0, 0], type='', swap='kpt-1'), + 16: + dict(name='kpt-16', id=16, color=[255, 0, 0], type='', swap='kpt-0'), + 17: + dict(name='kpt-17', id=17, color=[255, 0, 0], type='', swap='kpt-26'), + 18: + dict(name='kpt-18', id=18, color=[255, 0, 0], type='', swap='kpt-25'), + 19: + dict(name='kpt-19', id=19, color=[255, 0, 0], type='', swap='kpt-24'), + 20: + dict(name='kpt-20', id=20, color=[255, 0, 0], type='', swap='kpt-23'), + 21: + dict(name='kpt-21', id=21, color=[255, 0, 0], type='', swap='kpt-22'), + 22: + dict(name='kpt-22', id=22, color=[255, 0, 0], type='', swap='kpt-21'), + 23: + dict(name='kpt-23', id=23, color=[255, 0, 0], type='', swap='kpt-20'), + 24: + dict(name='kpt-24', id=24, color=[255, 0, 0], type='', swap='kpt-19'), + 25: + dict(name='kpt-25', id=25, color=[255, 0, 0], type='', swap='kpt-18'), + 26: + dict(name='kpt-26', id=26, color=[255, 0, 0], type='', swap='kpt-17'), + 27: dict(name='kpt-27', id=27, color=[255, 0, 0], type='', swap=''), + 28: dict(name='kpt-28', id=28, color=[255, 0, 0], type='', swap=''), + 29: dict(name='kpt-29', id=29, color=[255, 0, 0], type='', swap=''), + 30: dict(name='kpt-30', id=30, color=[255, 0, 0], type='', swap=''), + 31: + dict(name='kpt-31', id=31, color=[255, 0, 0], type='', swap='kpt-35'), + 32: + dict(name='kpt-32', id=32, color=[255, 0, 0], type='', swap='kpt-34'), + 33: dict(name='kpt-33', id=33, color=[255, 0, 0], type='', swap=''), + 34: + dict(name='kpt-34', id=34, color=[255, 0, 0], type='', swap='kpt-32'), + 35: + dict(name='kpt-35', id=35, color=[255, 0, 0], type='', swap='kpt-31'), + 36: + dict(name='kpt-36', id=36, color=[255, 0, 0], type='', swap='kpt-45'), + 37: + dict(name='kpt-37', id=37, color=[255, 0, 0], type='', swap='kpt-44'), + 38: + dict(name='kpt-38', id=38, color=[255, 0, 0], type='', swap='kpt-43'), + 39: + dict(name='kpt-39', id=39, color=[255, 0, 0], type='', swap='kpt-42'), + 40: + dict(name='kpt-40', id=40, color=[255, 0, 0], type='', swap='kpt-47'), + 41: dict( + name='kpt-41', id=41, color=[255, 0, 0], type='', swap='kpt-46'), + 42: dict( + name='kpt-42', id=42, color=[255, 0, 0], type='', swap='kpt-39'), + 43: dict( + name='kpt-43', id=43, color=[255, 0, 0], type='', swap='kpt-38'), + 44: dict( + name='kpt-44', id=44, color=[255, 0, 0], type='', swap='kpt-37'), + 45: dict( + name='kpt-45', id=45, color=[255, 0, 0], type='', swap='kpt-36'), + 46: dict( + name='kpt-46', id=46, color=[255, 0, 0], type='', swap='kpt-41'), + 47: dict( + name='kpt-47', id=47, color=[255, 0, 0], type='', swap='kpt-40'), + 48: dict( + name='kpt-48', id=48, color=[255, 0, 0], type='', swap='kpt-54'), + 49: dict( + name='kpt-49', id=49, color=[255, 0, 0], type='', swap='kpt-53'), + 50: dict( + name='kpt-50', id=50, color=[255, 0, 0], type='', swap='kpt-52'), + 51: dict(name='kpt-51', id=51, color=[255, 0, 0], type='', swap=''), + 52: dict( + name='kpt-52', id=52, color=[255, 0, 0], type='', swap='kpt-50'), + 53: dict( + name='kpt-53', id=53, color=[255, 0, 0], type='', swap='kpt-49'), + 54: dict( + name='kpt-54', id=54, color=[255, 0, 0], type='', swap='kpt-48'), + 55: dict( + name='kpt-55', id=55, color=[255, 0, 0], type='', swap='kpt-59'), + 56: dict( + name='kpt-56', id=56, color=[255, 0, 0], type='', swap='kpt-58'), + 57: dict(name='kpt-57', id=57, color=[255, 0, 0], type='', swap=''), + 58: dict( + name='kpt-58', id=58, color=[255, 0, 0], type='', swap='kpt-56'), + 59: dict( + name='kpt-59', id=59, color=[255, 0, 0], type='', swap='kpt-55'), + 60: dict( + name='kpt-60', id=60, color=[255, 0, 0], type='', swap='kpt-64'), + 61: dict( + name='kpt-61', id=61, color=[255, 0, 0], type='', swap='kpt-63'), + 62: dict(name='kpt-62', id=62, color=[255, 0, 0], type='', swap=''), + 63: dict( + name='kpt-63', id=63, color=[255, 0, 0], type='', swap='kpt-61'), + 64: dict( + name='kpt-64', id=64, color=[255, 0, 0], type='', swap='kpt-60'), + 65: dict( + name='kpt-65', id=65, color=[255, 0, 0], type='', swap='kpt-67'), + 66: dict(name='kpt-66', id=66, color=[255, 0, 0], type='', swap=''), + 67: dict( + name='kpt-67', id=67, color=[255, 0, 0], type='', swap='kpt-65'), + }, + skeleton_info={}, + joint_weights=[1.] * 68, + sigmas=[]) diff --git a/docs/en/dataset_zoo/2d_face_keypoint.md b/docs/en/dataset_zoo/2d_face_keypoint.md index 62f66bd82b..9cc14eb548 100644 --- a/docs/en/dataset_zoo/2d_face_keypoint.md +++ b/docs/en/dataset_zoo/2d_face_keypoint.md @@ -6,6 +6,7 @@ If your folder structure is different, you may need to change the corresponding MMPose supported datasets: - [300W](#300w-dataset) \[ [Homepage](https://ibug.doc.ic.ac.uk/resources/300-W/) \] +- [300VW](#300vw-dataset) \[ [Homepage](https://ibug.doc.ic.ac.uk/resources/300-VW/) \] - [WFLW](#wflw-dataset) \[ [Homepage](https://wywu.github.io/projects/LAB/WFLW.html) \] - [AFLW](#aflw-dataset) \[ [Homepage](https://www.tugraz.at/institute/icg/research/team-bischof/lrs/downloads/aflw/) \] - [COFW](#cofw-dataset) \[ [Homepage](http://www.vision.caltech.edu/xpburgos/ICCV13/) \] @@ -94,6 +95,60 @@ mmpose ... ``` +## 300VW Dataset + + + +
+300VW (ICCVW'2015) + +```bibtex +@inproceedings{shen2015first, + title={The first facial landmark tracking in-the-wild challenge: Benchmark and results}, + author={Shen, Jie and Zafeiriou, Stefanos and Chrysos, Grigoris G and Kossaifi, Jean and Tzimiropoulos, Georgios and Pantic, Maja}, + booktitle={Proceedings of the IEEE international conference on computer vision workshops}, + pages={50--58}, + year={2015} +} +``` + +
+ +For 300VW data, please register and download images from [300VW Dataset](https://ibug.doc.ic.ac.uk/download/300VW_Dataset_2015_12_14.zip/). +Unzip and use the "tools/dataset_converters/300vw2coco.py" to process the data. + + + +Put the 300VW under {MMPose}/data, and make them look like this: + +```text +mmpose +├── mmpose +├── docs +├── tests +├── tools +├── configs +`── data + │── 300vw + |── annotations + | |── train.json + | |── test_1.json + | |── test_2.json + | `── test_3.json + `── images + |── 001 + | `── imgs + | |── 000001.png + | |── 000002.png + | ... + |── 002 + | `── imgs + | |── 000001.png + | |── 000002.png + | ... + | ... +``` + ## WFLW Dataset diff --git a/docs/src/papers/datasets/300vw.md b/docs/src/papers/datasets/300vw.md new file mode 100644 index 0000000000..53859f6da5 --- /dev/null +++ b/docs/src/papers/datasets/300vw.md @@ -0,0 +1,18 @@ +# 300 faces in-the-wild challenge: Database and results + + + +
+300VW (ICCVW'2015) + +```bibtex +@inproceedings{shen2015first, + title={The first facial landmark tracking in-the-wild challenge: Benchmark and results}, + author={Shen, Jie and Zafeiriou, Stefanos and Chrysos, Grigoris G and Kossaifi, Jean and Tzimiropoulos, Georgios and Pantic, Maja}, + booktitle={Proceedings of the IEEE international conference on computer vision workshops}, + pages={50--58}, + year={2015} +} +``` + +
diff --git a/docs/zh_cn/dataset_zoo/2d_face_keypoint.md b/docs/zh_cn/dataset_zoo/2d_face_keypoint.md index 62f66bd82b..b66ad47a1d 100644 --- a/docs/zh_cn/dataset_zoo/2d_face_keypoint.md +++ b/docs/zh_cn/dataset_zoo/2d_face_keypoint.md @@ -6,6 +6,7 @@ If your folder structure is different, you may need to change the corresponding MMPose supported datasets: - [300W](#300w-dataset) \[ [Homepage](https://ibug.doc.ic.ac.uk/resources/300-W/) \] +- [300VW](#300vw-dataset) \[ [Homepage](https://ibug.doc.ic.ac.uk/resources/300-VW/) \] - [WFLW](#wflw-dataset) \[ [Homepage](https://wywu.github.io/projects/LAB/WFLW.html) \] - [AFLW](#aflw-dataset) \[ [Homepage](https://www.tugraz.at/institute/icg/research/team-bischof/lrs/downloads/aflw/) \] - [COFW](#cofw-dataset) \[ [Homepage](http://www.vision.caltech.edu/xpburgos/ICCV13/) \] @@ -94,6 +95,61 @@ mmpose ... ``` +## 300VW Dataset + + + +
+300VW (ICCVW'2015) + +```bibtex +@inproceedings{shen2015first, + title={The first facial landmark tracking in-the-wild challenge: Benchmark and results}, + author={Shen, Jie and Zafeiriou, Stefanos and Chrysos, Grigoris G and Kossaifi, Jean and Tzimiropoulos, Georgios and Pantic, Maja}, + booktitle={Proceedings of the IEEE international conference on computer vision workshops}, + pages={50--58}, + year={2015} +} +``` + +
+ +300VW dataset follows the same mark-up (i.e. set of facial landmarks) used in the 300W. +For 300VW data, please register and download images from [300VW Dataset](https://ibug.doc.ic.ac.uk/download/300VW_Dataset_2015_12_14.zip) . +Unzip and use the "tools/dataset_converters/300vw2coco.py" to process the data. + + + +Put the 300VW under {MMPose}/data, and make them look like this: + +```text +mmpose +├── mmpose +├── docs +├── tests +├── tools +├── configs +`── data + │── 300vw + |── annotations + | |── train.json + | |── test_1.json + | |── test_2.json + | `── test_3.json + `── images + |── 001 + | `── imgs + | |── 000001.png + | |── 000002.png + | ... + |── 002 + | `── imgs + | |── 000001.png + | |── 000002.png + | ... + | ... +``` + ## WFLW Dataset diff --git a/mmpose/datasets/datasets/face/__init__.py b/mmpose/datasets/datasets/face/__init__.py index 1b78d87502..21c531f6bc 100644 --- a/mmpose/datasets/datasets/face/__init__.py +++ b/mmpose/datasets/datasets/face/__init__.py @@ -2,6 +2,7 @@ from .aflw_dataset import AFLWDataset from .coco_wholebody_face_dataset import CocoWholeBodyFaceDataset from .cofw_dataset import COFWDataset +from .face_300vw_dataset import Face300VWDataset from .face_300w_dataset import Face300WDataset from .face_300wlp_dataset import Face300WLPDataset from .lapa_dataset import LapaDataset @@ -9,5 +10,6 @@ __all__ = [ 'Face300WDataset', 'WFLWDataset', 'AFLWDataset', 'COFWDataset', - 'CocoWholeBodyFaceDataset', 'LapaDataset', 'Face300WLPDataset' + 'CocoWholeBodyFaceDataset', 'LapaDataset', 'Face300WLPDataset', + 'Face300VWDataset' ] diff --git a/mmpose/datasets/datasets/face/face_300vw_dataset.py b/mmpose/datasets/datasets/face/face_300vw_dataset.py new file mode 100644 index 0000000000..35979c618f --- /dev/null +++ b/mmpose/datasets/datasets/face/face_300vw_dataset.py @@ -0,0 +1,114 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import os.path as osp +from typing import Optional + +import numpy as np + +from mmpose.registry import DATASETS +from mmpose.structures.bbox import bbox_cs2xyxy +from ..base import BaseCocoStyleDataset + + +@DATASETS.register_module() +class Face300VWDataset(BaseCocoStyleDataset): + """300VW dataset for face keypoint tracking. + + "The First Facial Landmark Tracking in-the-Wild Challenge: + Benchmark and Results", + Proceedings of the IEEE + international conference on computer vision workshops. + + The landmark annotations follow the 68 points mark-up. The definition + can be found in `https://ibug.doc.ic.ac.uk/resources/300-VW/`. + + Args: + ann_file (str): Annotation file path. Default: ''. + bbox_file (str, optional): Detection result file path. If + ``bbox_file`` is set, detected bboxes loaded from this file will + be used instead of ground-truth bboxes. This setting is only for + evaluation, i.e., ignored when ``test_mode`` is ``False``. + Default: ``None``. + data_mode (str): Specifies the mode of data samples: ``'topdown'`` or + ``'bottomup'``. In ``'topdown'`` mode, each data sample contains + one instance; while in ``'bottomup'`` mode, each data sample + contains all instances in a image. Default: ``'topdown'`` + metainfo (dict, optional): Meta information for dataset, such as class + information. Default: ``None``. + data_root (str, optional): The root directory for ``data_prefix`` and + ``ann_file``. Default: ``None``. + data_prefix (dict, optional): Prefix for training data. Default: + ``dict(img=None, ann=None)``. + filter_cfg (dict, optional): Config for filter data. Default: `None`. + indices (int or Sequence[int], optional): Support using first few + data in annotation file to facilitate training/testing on a smaller + dataset. Default: ``None`` which means using all ``data_infos``. + serialize_data (bool, optional): Whether to hold memory using + serialized objects, when enabled, data loader workers can use + shared RAM from master process instead of making a copy. + Default: ``True``. + pipeline (list, optional): Processing pipeline. Default: []. + test_mode (bool, optional): ``test_mode=True`` means in test phase. + Default: ``False``. + lazy_init (bool, optional): Whether to load annotation during + instantiation. In some cases, such as visualization, only the meta + information of the dataset is needed, which is not necessary to + load annotation file. ``Basedataset`` can skip load annotations to + save time by set ``lazy_init=False``. Default: ``False``. + max_refetch (int, optional): If ``Basedataset.prepare_data`` get a + None img. The maximum extra number of cycles to get a valid + image. Default: 1000. + """ + + METAINFO: dict = dict(from_file='configs/_base_/datasets/300vw.py') + + def parse_data_info(self, raw_data_info: dict) -> Optional[dict]: + """Parse raw Face300VW annotation of an instance. + + Args: + raw_data_info (dict): Raw data information loaded from + ``ann_file``. It should have following contents: + + - ``'raw_ann_info'``: Raw annotation of an instance + - ``'raw_img_info'``: Raw information of the image that + contains the instance + + Returns: + dict: Parsed instance annotation + """ + + ann = raw_data_info['raw_ann_info'] + img = raw_data_info['raw_img_info'] + + img_path = osp.join(self.data_prefix['img'], img['file_name']) + + # 300vw bbox scales are normalized with factor 200. + pixel_std = 200. + + # center, scale in shape [1, 2] and bbox in [1, 4] + center = np.array([ann['center']], dtype=np.float32) + scale = np.array([[ann['scale'], ann['scale']]], + dtype=np.float32) * pixel_std + bbox = bbox_cs2xyxy(center, scale) + + # keypoints in shape [1, K, 2] and keypoints_visible in [1, K] + _keypoints = np.array( + ann['keypoints'], dtype=np.float32).reshape(1, -1, 3) + keypoints = _keypoints[..., :2] + keypoints_visible = np.minimum(1, _keypoints[..., 2]) + + num_keypoints = ann['num_keypoints'] + + data_info = { + 'img_id': ann['image_id'], + 'img_path': img_path, + 'bbox': bbox, + 'bbox_center': center, + 'bbox_scale': scale, + 'bbox_score': np.ones(1, dtype=np.float32), + 'num_keypoints': num_keypoints, + 'keypoints': keypoints, + 'keypoints_visible': keypoints_visible, + 'iscrowd': ann['iscrowd'], + 'id': ann['id'], + } + return data_info diff --git a/mmpose/visualization/fast_visualizer.py b/mmpose/visualization/fast_visualizer.py index fa0cb38527..fdac734575 100644 --- a/mmpose/visualization/fast_visualizer.py +++ b/mmpose/visualization/fast_visualizer.py @@ -1,5 +1,13 @@ # Copyright (c) OpenMMLab. All rights reserved. +from typing import Dict, List, Optional, Tuple, Union + import cv2 +import numpy as np + + +class Instances: + keypoints: List[List[Tuple[int, int]]] + keypoint_scores: List[List[float]] class FastVisualizer: @@ -9,7 +17,7 @@ class FastVisualizer: Args: metainfo (dict): pose meta information - radius (int, optional)): Keypoint radius for visualization. + radius (int, optional): Keypoint radius for visualization. Defaults to 6. line_width (int, optional): Link width for visualization. Defaults to 3. @@ -18,18 +26,23 @@ class FastVisualizer: Defaults to 0.3. """ - def __init__(self, metainfo, radius=6, line_width=3, kpt_thr=0.3): + def __init__(self, + metainfo: Dict, + radius: Optional[int] = 6, + line_width: Optional[int] = 3, + kpt_thr: Optional[float] = 0.3): self.radius = radius self.line_width = line_width self.kpt_thr = kpt_thr - self.keypoint_id2name = metainfo['keypoint_id2name'] - self.keypoint_name2id = metainfo['keypoint_name2id'] - self.keypoint_colors = metainfo['keypoint_colors'] - self.skeleton_links = metainfo['skeleton_links'] - self.skeleton_link_colors = metainfo['skeleton_link_colors'] + self.keypoint_id2name = metainfo.get('keypoint_id2name', None) + self.keypoint_name2id = metainfo.get('keypoint_name2id', None) + self.keypoint_colors = metainfo.get('keypoint_colors', + [(255, 255, 255)]) + self.skeleton_links = metainfo.get('skeleton_links', None) + self.skeleton_link_colors = metainfo.get('skeleton_link_colors', None) - def draw_pose(self, img, instances): + def draw_pose(self, img: np.ndarray, instances: Instances): """Draw pose estimations on the given image. This method draws keypoints and skeleton links on the input image @@ -76,3 +89,64 @@ def draw_pose(self, img, instances): color, -1) cv2.circle(img, (int(x_coord), int(y_coord)), self.radius, (255, 255, 255)) + + def draw_points(self, img: np.ndarray, instances: Union[Instances, Dict, + np.ndarray]): + """Draw points on the given image. + + This method draws keypoints on the input image + using the provided instances. + + Args: + img (numpy.ndarray): The input image on which to + draw the keypoints. + instances (object|dict|np.ndarray): + An object containing keypoints, + or a dict containing 'keypoints', + or a np.ndarray in shape of + (Instance_num, Point_num, Point_dim) + + Returns: + None: The input image will be modified in place. + """ + + if instances is None: + print('no instance detected') + return + + # support different types of keypoints inputs + if hasattr(instances, 'keypoints'): + keypoints = instances.keypoints + elif isinstance(instances, dict) and 'keypoints' in instances: + keypoints = instances['keypoints'] + elif isinstance(instances, np.ndarray): + shape = instances.shape + assert shape[-1] == 2, 'only support 2-dim point!' + if len(shape) == 2: + keypoints = instances[None] + elif len(shape) == 3: + pass + else: + raise ValueError('input keypoints should be in shape of' + '(Instance_num, Point_num, Point_dim)') + else: + raise ValueError('The keypoints should be:' + 'object containing keypoints,' + "or a dict containing 'keypoints'," + 'or a np.ndarray in shape of' + '(Instance_num, Point_num, Point_dim)') + + if len(self.keypoint_colors) < len(keypoints[0]): + repeat_num = len(keypoints[0]) - len(self.keypoint_colors) + self.keypoint_colors += [(255, 255, 255)] * repeat_num + self.keypoint_colors = np.array(self.keypoint_colors) + + for kpts in keypoints: + for kid, kpt in enumerate(kpts): + x_coord, y_coord = int(kpt[0]), int(kpt[1]) + + color = self.keypoint_colors[kid].tolist() + cv2.circle(img, (int(x_coord), int(y_coord)), self.radius, + color, -1) + cv2.circle(img, (int(x_coord), int(y_coord)), self.radius, + (255, 255, 255)) diff --git a/tests/data/300vw/001/annot/000006.pts b/tests/data/300vw/001/annot/000006.pts new file mode 100644 index 0000000000..3889aa8f93 --- /dev/null +++ b/tests/data/300vw/001/annot/000006.pts @@ -0,0 +1,72 @@ +version: 1 +n_points: 68 +{ +743.224 197.764 +744.067 213.767 +747.494 229.362 +752.659 245.009 +758.92 259.223 +767.901 272.356 +778.802 283.44 +791.215 292.702 +805.644 296.179 +822.777 294.269 +840.544 285.779 +855.834 273.961 +867.449 258.999 +873.996 241.046 +876.935 222.009 +878.567 202.398 +878.29 182.498 +744.007 167.503 +750.098 162.094 +758.537 160.906 +767.509 162.778 +775.861 167.055 +801.008 165.555 +812.685 160.407 +825.422 158.165 +838.176 160.521 +849.128 166.753 +789.759 186.16 +789.699 198.174 +789.273 210.165 +788.975 222.281 +782.603 232.478 +787.429 234.27 +792.678 235.337 +798.527 234.133 +804.664 232.902 +755.736 189.198 +761.237 184.449 +769.829 184.474 +778 190.301 +769.807 192.891 +761.326 193.176 +811.185 189.658 +818.224 183.243 +827.82 183.095 +836.647 187.198 +829.057 191.518 +819.507 191.948 +778.412 257.689 +782.738 250.599 +789.035 246.573 +794.615 248.185 +800.403 246.606 +811.204 250.488 +822.537 256.574 +813.083 264.925 +803.39 268.215 +796.966 268.73 +790.759 267.758 +784.142 264.276 +782.377 257.528 +789.969 255.358 +795.418 255.634 +801.363 255.421 +817.652 256.63 +801.613 256.589 +795.658 256.775 +790.094 256.132 +} diff --git a/tests/data/300vw/001/annot/000009.pts b/tests/data/300vw/001/annot/000009.pts new file mode 100644 index 0000000000..7435d19b43 --- /dev/null +++ b/tests/data/300vw/001/annot/000009.pts @@ -0,0 +1,72 @@ +version: 1 +n_points: 68 +{ +742.873 203.975 +743.86 219.009 +747.556 233.644 +752.945 248.605 +758.873 262.435 +767.402 275.713 +778.158 286.99 +790.906 296.386 +805.448 299.882 +823.054 297.715 +841.765 288.765 +857.714 276.621 +869.301 261.256 +875.322 243.141 +877.652 224.024 +878.624 204.199 +877.759 184.091 +739.839 173.49 +745.097 169.057 +752.507 168.519 +760.509 170.747 +768.073 174.906 +791.577 172.962 +803.164 167.369 +816.229 164.505 +829.601 166.297 +841.772 171.687 +781.866 193.207 +781.874 205.541 +781.423 217.922 +781.105 230.353 +777.568 240.329 +781.547 242.003 +786.186 242.803 +791.695 241.762 +797.794 240.677 +751.554 195.364 +756.158 190.45 +764.343 190.443 +772.432 196.54 +764.574 199.384 +756.473 199.727 +804.344 195.462 +810.661 188.458 +820.197 188.077 +829.408 192.078 +821.842 196.959 +812.389 197.654 +777.821 266.056 +779.868 259.244 +784.392 255.175 +789.378 256.665 +794.399 255.071 +805.22 258.831 +817.54 264.382 +807.933 271.958 +798.515 274.526 +792.885 274.904 +787.314 273.956 +782.133 270.936 +781.614 265.715 +785.822 264.012 +790.616 264.186 +795.84 263.973 +812.474 264.499 +796.13 262.77 +790.946 262.751 +786.04 262.145 +} diff --git a/tests/data/300vw/001/imgs/000006.jpg b/tests/data/300vw/001/imgs/000006.jpg new file mode 100644 index 0000000000000000000000000000000000000000..18bbc740a1a5560b9ea85d2aa01251794033d7e7 GIT binary patch literal 47251 zcmbSz2S5|swsxojf{2D{K|q9nC?yn8I-!J`girzsQj`QiiWLu4L5=io=phMRMFNNo zM0!yO0hOi{K|sJlQ4sid@SOY3yYIgD?)#%Nd-lvYGkfo~*Iw)U)^hXh<_E}5q=~r+ zgpCaXVFQ04n}ZM|$evwLQK--!Q4!Jod-oiWH&m3Dm6bnIz#VZA(Eu_v7gSMEj- z0uq9pPexTmC*%~AmY1Flf7ZOV%uzlNP_R=V%z#b{`|4Ab8vETZ{y+R+YWB1+6iH2_2S8OL67zXv3@cs;qkFy_RC5oEv)*_@(1nYaE?>DCeEmjL^vzqhiAl*R zscGpMcS+;|3YAt^R9y0~l3rC^^QiW5!^_5|=9bpBc1AC=um8>4cLSqi;}ahzr#?;3 zeEs%)acOzw$In$(yVyWG|N8xI*gv&P2(*ixlaqsU8>?Mx?3cmDA;ifgrNX_-0JZIO zz;0>P2p*_mVt&O7UKus?7h(6n9zKzS@KM>XtfpbOM8f zG?KszXfbR#tl+(|a0Z(ItLSEzz!ys3^SDVy*6?2aXodvF%zJ0AxivgGLx55!;mf|0 zfhHk2rM4cEl0r+0;5D~Eu+JURS- z+cXhMvP!lsd^levj=eBEIophjN`cZL^ieC&_40*$-i5X*2rUdk%T}c!Edkxl5hYI} z`cqW!%z=v#@K)Bn^b~qM4!jJE1x=atHQu0Y$UooC>LxG@U@YLE{}LMEy{xVlfJbNH zX$ilJaMsZDT0!8w_{mKDXcE4V1jd9Rfiu#-0UrpU(4=Td*=F8sU~iRYD1p2v`{xK; z2mOgBr!Z{UQK0*8fLCvgIy-pf*2Ws9f6)UO;7%9>493<5zCPt2mA_8@U&<5|0s{TV z2E;&$N`bTC!k(e*l0#SId?oN(qkcWot+y z!I=F1RM6{r9#L8tE-kd!s5NVT?0}LpNhp0mD40gx;JySjLyS(3Ov~7AVFpfkQ>d(7 z_&p+cd1@XfXmvOm%|Nrs!$Ff%qSF$(RRlCxFm9NlVsxl3g`&ef>InZ@ZJnS*d zgnD#EB>wZ8mR)B`t#%s@;xamx)9=Gyi0gCOhnM;4ZRp-)RC8HKNLoV&P-giJSuk>n zEzp-qcU1aamvTWU=!jh z$4KT}QkQ$Y^AVcTt49}Ii_Wjxgq+e%J!w}_FRmU#^{7^kz2~~o?K&^9b-DP~p^Z_B zirLc?>B8*zG}-raTpOcQ(N8wR>bb~grv16cw^=#9A$djbmSNW~ksS07d#zc#w0k4` zJ#tFmf~j4g`P<=*!Ru@Hf1<;D2R9)XOZmzW9zpW$#sLf1{1cu18v`|q1ik9=XM4Vt zRrlWO_H0U=!xBGyh!HZ0=zK*U_;@5a`0V~A^)sJbzs_tz7VJ~c;J}(-t0Evpg-3_) zv2usBeZa(?nN@vgT(m>eR`g&py4oo6=PE|8N-3<)@l1^5d~SP5Yn(^W8uHEB;!RW) z=&{rrrWL=6#_nuWsa?-M7ZyhwpRO_AR=fXyy`PVO~>-S~4KEf9U%I*=wqpY_>@F&2y zJXchhUB9+YP+&A4F?oGgawTd{?^;7eQJ09QN=0qhQ<$pYAN?j)j+F;HkHL3*Tt(vK z*#u-^6bd_QH2h?}^BgN#&0)68?o^G-;fIB>iZ9!E2=Z zAu{=UZ-4qL8yqBwNOdUW_$@uSaPdz>I2c4OaZkE$+;)nJ~W2u%|xON0;=X&eV;l2fTe{+>g3_XezJtjoMY-`iVX(t$6jDMa36| zwe07tc!f9KX&rlSnP#6_qlqID-Ib=_fBpW$zP>Ev_=av6-&H_EB>tx_)z~8{cukqN{E4iHd<;E34lZ zi{`@KlV5m- z%t<(Pa_8h(@$C%y`6?*=C)P-ls%FgbIqZu|@V#$vgl9Pu%s}N_cqjRpN$vnUBoLX~}Ub-p`&Z zlDJRbDh6*VD2p;`Uob;_D4x3v9%Ql8Ri*7~p42>ckKhhzLiPD3iP#&2_XQ6$96zhd zec0zXx>n7i2G8bgP-k* z@!*Bd(^oWowO%tal^&~p)GGP52`M{Y?o@TK#WK1Kbvn|ZRHM$Hd6{DuDQ$4wDc^6` z+YT_Ur#2zDSi4F$yL8Ff_p@lnBDI+Q7R8}TVM@R~7tfV0ZfBSAkH3o5xfR7Yo}HC2 z3f_H^r}276vxtL$Kf`vdp7HFh~k8YS>OKtYguoHMui0sj5z@ z&La9jNMD;X!YA}*Oc{B%DXQaHw$gI3$>pl$C&wXJ9OO|hkmKk=*Cm;0TRSylg?t(5 z^!D?}G|5^^)dZ&F5fi&O`atE&a{ZSAW=AYUhtyHezm^89zr^lYkf0mw%7W%ZrX3u5 zTY9j}f^k>&Wb7xrLKt0eo_XZ5igZNM;6-)!yy^uEgJmAN0fXrP9}&;DLz`K3YJ7nR ziBXdrgMV;kG7hwj-80>BEz9<855L0a;K_TGD|>qr*%wQNBI52Aoh#iDt(Sf{6otKa z#Na1}Y6GWY&Lcb1)8t4-vZj;wUK}=tjOXGyEw4AZM7$6?XUny$Z{i@9fBB+O>kO@Q zqB-!U;xwl8ruf3F8E;SHopsnH{s5G(+~i)(@5M6y#_H=nG=2s zU58%1&(Gt(^TbF5IYG>0g!=;l8h%kWY}lIk%vMAgpVX5%rDRSjauDbh_P!vTFWrNH zhOmCN<0V z`=D#><;Z#8CE`_z9y#U^Zy*VVZ(VwK&M4Fk2vUy@=oAU*2n*)u!2Vdu31M{}*4v?Oc}f3wWeFbF!E*NuC^{7JKdSufipzC41po zYeZLb8!BBFBp7$rZAP8qS7Lqk#dsb@i)AU#;SxK98{Eb}`5cO{ZX`uF>*rF_8Y|jnd@zQa5GPp}`%p#5#?y6Jb?$6`HaKGPHCY=>*5*tFJKQcm zVd6QMW#{j7*s3=3P;p2}*a8Fot%j=$+ryXnw&t3@#%Ih@iN(sz{-jivu5*3@|M>98 zOxV{Cz^<{nfGhlUr7DQ_c)a4JnyKki$Gt654K+r%%hf_7kiiGTx9**PW+U*iQHB@R zl22}=c?@m56-|)BJ4tLj$_tcG)OT6ycS)OCo zY~{^VGnNG-4~2r69&Y5gIyDkkE#Tpk8?5bZ*)Dk{#E1Oopi_n9@V(0igX~?=kFGqe zjPZbeJ}c@zlI%Z!O7q-`Fn5JW+spW|k_Xmb%=T$B(={Ku6gk+cOe1avmY?s~gzPU^ zAE;kA$+-#nI-?s&Mlgn6sfP}QPGBYO9&v*5UnoQM$_DJ`l`x9>!2DX6lA$j2^!z+A z+B|#pi^4rb=8$K3ZCk0x`d=-yG=-cT|c=z?i8)6 z^V9{Gi*rup=atW$Q$MVkWTG5;8WZMyf!6t zy39sbmIIP#h{hDN6do-pToGu}Qb`=u;b`cG)jn-c(Q&O?l7w@CWjDf=@gjCR$4`uv zHVk^^xerAioM1|q4f`ta9Oxr(p4^0_$xLHsUTi`zKd`~k-gksT+M_nU78k6gv}}ovoCtkd3=&kSzqYEP9p4)_b(n# zkRL0Ro-9N(EEbE~UphRcF0}nYvdtsTXNFT8+(pLSrcbC&Lc$Y#g}#UOT)&P}Jdkku z(F!#DwzZ&Ss@e6&UqWC9Z(L6_-s3=uzbL!b;lc5B#mf7xlCU?GQgV=`cNAb7A1!Q$LIxoB?L}l2 zld)@kd1{iQ`U2ky{G#&{H6+rs+N;fJ*7Z5^>?-|bHLDfa^rF(ED_n=*MrfXg+Pw;) zx6Np#A0>QX(2@y>#ORNC#xmvRa;uMHE*8sfLL3aa?eo~Jgx#TRfrQ)A-`+D4icgWL zS0DJpVvmeQ%ClWBcRm$avZLzU1t<%eNMQNoektL!_g8xH&cy&L`J3zc-yGAp>k@KO z>dx9AlZc10?r?n!<;y(JaOrEhdJ7V{ zR|@@p23hiLLf(B1CZP&n=Fq6S`Fr0jhvOli$Y$w;BV0&@L;jCes8`t`Ho<(d&?=$y z9irlgD01F%jEHz>6~7uUFT_JwE00S!RVF`1Aj2(qwLddUM$*73>B%{}3olOH93Y#X z+9!lU2ygTLF=y3$^~1%&&fbcYm(ahu_WgDn%)K}G$ripCZrdcHuhC%NRi!Kd@NU~0RhP@ z(rP+l>_GPl`@FDwO-v^!FOH=6{q%(ie z^~JxFsTA!e8LOfkIAy<8_L2sZR1r~7P9Uw7tzh>>tIt(6MY*q+1 zgy|r0;xvY^sbTbDv4jPPfyDohDIOU z_>_0}EIN*SKLfKyPHu}|BZoh@3D$1x%t%iR#?oRM-D93wX<}3EsG=m7L@zs@fX2ql z;!mWKU--wbJC*pZ#Gcw7)nw=!ajXk1m0JAbU9d#v=a*~Dkj(WGckwB`auaK7E1PAH zS^er`6Wtu;(NGd8(N4aeN?}2M5GtimelmQY#6(}#Dn{mHsWnFoQ#DFQLGS6HL;2yD zfC%PSWRshUQ1V5MgZmJ&KEsC zPbB3(`XtZ(VAlRc&CGAUP0EtH=U)-Tqxatkxe0%$70L{EUlR7(_)s#v66KgY zPqY-;Ig81CV!NYC<6{dB@lcqPl=USgGX=BndlS2uHZwV--F>OhW(A+;6}p7i>+8dj zV2}^J2X8-SVAF0pClHRw@M!l6Ni3CmI2LA zZ*b(lJXY2O069%L>8!jKpAql?+Bv;>FuGPt;`@doQX zdG0&OM}yEpYq<^NdcJb|ZPMY=Mw8lWd?7DJL+Nk1_W_G`X5D*7Wc}sV&fw)@xpT&S zyEf+Cjte2$!`T+}SGj81l(+pzyGP86y3sQ)Hs{d9VSM@EEwLSi5q3vpFS{KSQ&6#= zA8xL{e(;axA`7WB!>)d^=|wKD0Q#Av80MbZ-A2;VkFKmlYU!rdh&9MB3&-PO2$hVL z!#Bmt6BLaD>@R!4?qX2(K~e1YuHNddl;U)Y={shpODTDIAb#4O5@GekI9FabNeQC$b666j?QR{D@XK=6Uoqr^mhVRcz)a z$TgtEl${EQVB`5nez$p<4<7+0hX^co;K<$5&Pf z3K@V|$tnY%*jzul$HLqUfbisS@FpUsEbHnPDw4rEMFg0VJUG}w%F|@qidt|FxEojC z8BH_z#$_680Vx=qc&GO;fgW>m1|PRucrQK&FCgWC%oa%$p|YoTJcv?5!7sWeL)o0R zOSKS^`G$&L6w=+8UVMvr_Rz)2tRzpjCEBiQy}UGYwY}f8dtGje%0xr!7td~!PKYvB zRVFkB21F7H;x6+AS8*KiYc06suy2MlI26yHeu?M&E80OJQd#*c0rNcpM98_)TC=iR zQ6C{(m)%jBmwx+Z##+5_Fe{C+grY*jdUwzeg{w!W%|GfmTQCQo$kGupR%9c_zp>| znJA=cwz(qR73XF0^D1-*EeZ78vrsmue!4J$lz3y>X3Lu3q}3oVsy{}v-<<{X5De`9 z09E~Y4Z{(bmXwxJAHyIbaS(mwAmlbUfdBcwtxvxQbwM+TZgT10d<%=}*&~oJeq*aL zn{q|k7qx*jfCb;*|4q;k_Im%fr;CMrD1CvnqiW~1ngD%Zw&CLSOkM(Eem3#YS!{dA zP~TzZYj~s#M@$eYGCw=uk|6_qCe`RT7b@u*pZ)~ivGu3LrFd^i4J$m6>Y?~LJyBor z8}X4sPnVLDcn$Z2O^$xELTCXrGR0PUkI!j#)#z6Xgoq0(mN&A)mrEDvP3}+Ap8FVg zPN{5ENe||c%#XJ!BP=ZRKO=nE2b(I)We$GFdi4rZhT^NtC&Hp!sd38k|IFC5_krfTI>=?3}A&=+#QdRIg&*Q!s#iEK>B450HHUsd0iQ9|h zYoR(9gtEUCfd~Dx^IyT8f1TUXE`JIkJ4SMz6r!>*oyW&QhW;&lzz^Mv$H(AUj{0_e z3KcLav)s>zm88&!YMl@fu6E8n5q$*k2wtwfZceKPECNV}lykc@m zIx_}V&`~=n=BO1EP>R{0q7OJPG!cS>!Mw%jXml@&BLW*NoYhpI$2h?7Az5Gx3maFG zqJV)1)FI%sSPB)$150h1;hRZ#NH41ZL?R%#NciyIwVi;|qLDZ?w$v{?WgLhMi>YL( z%A^b+JzGi>Fj>FFhDBx;qHU#E!oqsvpWm`ovLn{$uNFV9(R*!Gt}%*#78jHs3ueG} zNQRafBkUb)fA!rO)o)~#T(Fa`Rd__Z;LiT%XhZV~x?%5i9GQ%hpqxr6WSK5#9B z_6F?A5{HJu$&-RVXX>(#@3MyVxts)CmyW~t!tEJhQ{;^cj+f=2qu7mJ!C#B6uX2(b zr}#dQ*e95PPK~%@VGgE%g*k#lgore3FG%82*+DM&J_4lqJ*z_a(6;WZ0aZcdp$3wx@kefR(c z?&rE7_$p@Vnba+y2m}uNW^N&;f%#ws569C;0W^{uoFM@U&ff)4q=1&@K^j>ACY>d@ zJAo#MW>MktY%l>OS#~~o;1(yPu;^jH)*Bd*e{<(7{+^u(`%UVH`qKw6jLd=j6fIlr z?q@KBRGuB@1Ti4yA~c+c-dKd{iu3K2cqplEtkq>1uitTu@(PwWNtz?-tJ=H!({J5; zB4OA-@@#@Q+2KO_)KQ+rBIi(Ua^G6q@q7GNC{6~2=efhh{0ZW_)sHp7W4fj9MAEy* z`^!5dIr}fX^a!v_vwRD0xRgb_WrnwyB61Q2_BJZG``7pR$gGt-9FCQ`9ur@FRw!DU zZvK;y-7xxn*8WDTl`IsylVuhEMF(@S2zRjH{Ab!f1rTbiNe&U-n|pzoy0`8^Ht@@wI^2{}okZ*K z6KIsuN%rA5o(&~Kbl-0vVbc_+*pyv(1*@nmx~_ga9IRw z)NasQyIV&^i|-|;-fj{DPHz8PRgB2jd4I8$L($B`snuDMdDMWnFY6aegI#}xwpcSg zBTX^fDsz^-VdKl%Vvn=sLEHh#mY{`Z@Udny2rJlEEp^_&rK#`bYef-{m@kTyTEOmH z)lF@eU>s~UBC0Ann^Z?%$!d+br5VFfjy4=>pt7_ zX#((bSN{0LASSJ3Mz7k1O3tdAU)zL8DmgN>{XYilN#yj2m`6TnE$#C4E10xZJeaAO z!Z?GK#b+MBEGg&eVR!FJ^#MeLQ$~I6g5;~m$M>Hbe@zXFetcZ;$M-wa<~Pi{SmZLL+sFz&Zf?dc z0V0S7ARWx3`}Veow-lFfU%maB^gi1>1hfbpf=_#Jo5o|!R-)#6d--r5_&@#^~6`)S?f1g;&Kl4X;fTfp$ zKSFwa)Jj7@`r2K7)CAVG+WeD3(+W%ER(r%W9M?Qn`E=iILWYIe6^}K<^hKPR2n^7_ zvE~tW0loeJuwI$6rFnA4gtsBNg3R{>a?Dy--CRfaev&r=-V21~PJ|m-UKQ3R1z~x` zDka>#a_Mr69IIlTqg+f(>rHcqNexv<=+p=A`i6Um6Nc4}Z}IGujR?>87*8hZGSd)b@7vW*1cMc)zkHL^bAkMwJ?l*l6z$ z?!Peo&=8g%Rkymh+MoS;Ncisgjc2-5g#jyE7795ZaXmImu2E<0iD4zb6xD0#HS#%C z`R6{4iI*6Pi^q33xTBzd^g7?Df_17$2?xGjN1zkt0||4vt0a-}oM!cw)&AAKSeVht z?{DoyC1;&yZ62l|{L6yvJ14J^f-6&MAZL>un``FtMQwez<>d7rcN$XkXqTHd+;f1X zx58u{(s-q0uDnq9umrkjVpT$1F{l892&UyRQCp!Vx{Z)NKfR}oj zJO2hYLU$ID@zDo_l3ah9(lW)4>NCDpKJ){mJ7BY&ATcQUvt&Wv5Cr1Q+B z4H75cPE0;lLJB{sJiP6Ir-R0o5(636mz$7aT-wTpt^fl3<7Y}1EJY^Z$kcp!=QKFt zn8wWL1%y^{-Td`OJk^njB_3f@&$13C8_ikFGdeO1-PbJ=E z^$fjyl1RXeQip(Uxx zrHN%N7Y$?@J#8^5#hj48Fee&9|c89H%B%hCBpiBYwwo~i|lW`NT1tz_}UXv^tH4R!>`23 z^PL>~Q*-49CM0o?fJX_%oKx!iWTB0CqmAOwl+|;tGwIXT6k9Z!^k-lVht=7d5%oMD zo#$WkjF$_J6+SI0r&|Ko7Ctnd^sH;Mm%Pw!b$TI<%_3swG-3-0= z>Z%GdWZM=}LJ6OzUT~TpIiamtBL;JvncD!nUVdP|HrkiJ9=#|m`*^~W0h1!D3PL~d z=v}ZI#b097+DpH@oX5|6f>5Q`>R?`hB2@DF)<@! zecuux_Z_K619cFlJB#&*6l0(M)D~zqZ($Xj+q3jG;doA;d%*W{huTjHJ^c3(!Y5Gt zUL`jSu1_PJRHd`r$*HL~*%Nq0-wOv8zg%f@rm^?@$#MU7guFp?;a|a)EM27ldp=rh zh0q&*P`PqyVhUobJeYW{H?4^MtF@& zkUP0tAK80~2_JqWe7ukHm@m(F8vCnQ?=k+5V!cN`N>;;n&(2+6OWm6;D7TNxL^^pb zI=vn2?o^cWI?U-Y`;IEu%u75wS61N`hi?fas7Z{2k0dBm>O5_>m)1DJ3_Fv%aaHr9 zb5#oJEZ_=*l8h5a1cgrrJ>Prp*7%w&Aogp8z7o&hbIM(G|)I;#9Q^>w-K zH%+w)KC?2yxeKFyZ}sf^)ctn3V4wy)kn+x9OKnTV>hG6$mnb!{jcqA1q-0#|h%gW3`#?1{KkB3< z2YT?NIbp5f#O3|;Xx_T1>TSDEb@&C|St(b04fQC_EmGqZY*{m)h1Yx! z=YB;EqCuc@EbWZE0XMZ5L^Mr=D3s%R>&C~wg zS@)Jdmhf5sj*%woNu0Fi zIs02)0sZ9_jei7V4f@OTcVy6{sj|rK>MJz5*EV>)eCI2;4{vUvn z!k+kAjGd-rV1jTFP)&b_NdB8+H(#I{o0YbFOnS=i@c3{TLKc`H#R!coc`=|UQ$Tb# z2&$LQ+e&p{1$MKd>Ol=;JlL`mL8^m4g`J2)qAWd%fb9li@_+AWY%DB-3ySV$LC7jB z)E@Zfw5{v|UIg%6SuU;snH3R_2I2E&9#*n|8Q`!2G=b~^881wq0ZnXtV{8KpV!3&4 zG)eyY?%GZ|eP`q9{f`)s2XWZYZR^;u@m65bHUO00J+F-de+yS8o+#P_A$C$78 zn7P}`6B8Kd2QD`na)%4r^aHt&c)Fv5_(31((P)IxvRT*@d%S?{UAuQppS(2^gC!o~ z>3mIL6)g+aW-{>!3Irr4D|iLM!YH>QS@};V63cwe^@7V8LS_h?hc)GL?=qR#$MWpC z?*^Hu<;$g4$l=nFszieYEALlhgkYRlk1L2xyWnjUr*PT=-4YNmYvqBoQi;Q}L9F%DU0vaOrF*=}no_LHv;p5SMW80Ne!77^Z8 z#4h&nXuYr(Gy<6z^$GSP&%=N^Z1xg5#9%Wo%IIw?8URqUicOOkO{xls|5e*UJ*A!; z)Y)a3=B?goeRl|!P`z^IvqEIKYs96z6`C|qLiPls6(}AqsNvH6drv>iNZ{Y@fXYF!=@ z9{L6Qm?&Qz7|h(tb@|sc9}Cln&d;5x0aQsA*XIirb%1mRgOJ|0h} zhvQJ@NO>{(jIR>N%>nQ$D-Xwjh5V+V0pHNVhcW|MJ6f11IHrgV0g`f{kWrSc4KfgZ z%RD(83Q`Sv#lWun084(^|I9^zY(c63Rob!`K!Q#8Z#+sY1@K%cH#C6BDV6781@aQ) zxA1?#jHx6J1bWtiaKki;MjZ&p3$>AlHP|ww_cXG)I*HCRnc`^i(}SwBq>vmN0-i~ z+BiTY|#_iQUUqMOOOfY*azMaf{s-Rfd>L-iSa zLgV&s?1UHu>*?~SR8fEX(IN8g)PQMo*v~Kti=gjjIz?iWg@wbkx?sC${YdL2yQNa} z1$D=zQsW9>8_=YFYXTfA|Aia@Gy%ZH|H@1PibDDKS*R@s0R-k)*}h(ZvDt6odMs@3 zf81!?eL$0`+yPHvDWokB2+zMI9Bc@A7A-&qfy!C(Y=|v=#>!Cnr(B^tu0oL76%GZW z0zmwWto$u^1`AHYfutj4fPtrMab+xnvL2{ZZWdCvh1RjKI9cwkOe>649w+=Rz%L;w z(J71|Gk1*D7UKydftJwxJ9|q2-fP23;sU}VVFYmht(pLQ;36PMff@v`zW|VojA#a? zSm3V=E*#R3#fU|PdB{#{#mx8)&RWzbzO_`lAJBezgg*b1zLt0fp^*`W(OCy(Nx|qxSS&Qw+*4Cd-a9 zxu1ARR0Yp|Hv08An&*4Bflc~fg-Z|MO_9}FjP|RLtF(X5(upFZP z6YA`byN;-{TcQC@YEnwqu4_e9{{Hnau!20lyAo>Gf!i%v01eO+NRsP0h z0JH%_IoK@;ydI`-{lx|RCq&}ECYNRGu|pwL;KN|3F!R0#mK^(;e}mDseE)b!WqvViOq z{w?~4wIm~vE-dbkB?V^OBo+n8YlgRyq5#&A3ct|}5}AJInpvIropQFw%0~NBbXZIf zc)&$j6+pz#;J5PoSj0JHYl$^8WT}pStg~E4@bXZeQ}iWhL_mMEpR$4p|47OZ8pA|; z2%Ey=Uj|L1V35F>uc`1QN2lao0(x%tHqn3mQ0l?3E)*_=frN#n# z;-`)`fFcVrj#;FT$tH(%hQHbk%-CL$F5bBaFDiRo)wMoqI(TT~OWqLzAFgA~^Zf`k zr271VV0(CN35*a$ZA`MLiX;4>Y~>+p|EWm0SxXN(3DP#Lzk@2AtVhEH;qZBHKK~L? zQPmb0_5d3yCrU_LE%`8mX?*BDwZ@+n;AK-5E6#5kJYI;z}wRLkAbqn$B5hcUG&JM-8kSDcq zxXHSz-*>srIkT>UEF%UATPBMyN1N)Yl){OIKppb4#2F?(ZMU@jBi*3caS__+(j}+< zTI2qumIFnA+DEDk?<>p7k^^8wy7S|mw4U~7h zy4B=wLnWN->@g9yQ9o)pUaSXA&0L;dN5~DHT@ubccK_j-RM|7@)nV9QMQb3y`tyd} zHRJtlq(h_tr%i}o=HR!|Xp=R)jNoxN^PXkF>4|HMAjd+7M;kMYFrT5Y0K#Xl&e&u# zz`~pwU%O+zeqZlOf9mzS63s~u>#EM^ed{88jD6|S+*!{qNH}~v4a~PLI718sv5cGj zW@8h20fPlkYOgplsct*No3nE)!lfE7V7HZJraO{51b1{$Vqjfsay4oGWa9m>jO(dQLakw_E&>q_-S8$F^cMM6rlrc=#f z#Q0-+PvzN-%q_oT)*8|~Z5H@AwNoU3u`|YG1OatuSHZ+8pgoN4KCL>V6LqFCDbNO2 z^~c*=f(sG_q?AKPyt|Z1mVG>-_#o6|iiE!T<5*@p&P@-#curY2I=}1K4l@ee2Y$Vu ztVD7vv`d42L|d6vj3?W$Cp7ca=Rbn3dMxJgND}WYtSxa=S+5hy3Y19hhgYZ@yREiK zXT84^!SRht3u8mLOwdsm3wBfaXO0n)xH*H#}vD`9H(Y&5Niy3{7h&SmApPJpO7|D6E-_=7kb8o zZ-;>H!g>%2nCz0mv1XSNM0LDEb~Go7?g_o^)&Kj?Pc1(@pDnkntG;@sDQ3& zk8-jWbI%rC?OW}eeftvebO!=;XPpp2z*Qb4eO2<2{5q*yb;IW}m_P9b_AWI6RX>4O6u2Y5s@}ksmT6`3eb(7o>bS-ftk* zS}Za%YQTQx#T@nvScj!4aH?i;=F zl?@KN+g>~cs_jM39LMN&4?Y5%q~KeLhU?d#qHBG1#jRflL}C&~nD2PS1HEf_Y8~vC z%YF(K1m06doX4xZR@KbT+Hs@*65Vbj`*~Kk2C+K#>vzfinkvC13rCIrICgsNfjfS8 z$?Ke_m%yVSY^lp$=g8wqr=b_R=!+Nb_SFcoGN=gS&ehsAt8?~YI z&XLgxq+WP0P7~Fhh^yI^;W5H(Mst3>93J?niK8MN?Ys%Ohr2kynGsPWS z__WHYc8y#bM}Bx_)@>j};E+zq?9S3GJ0EF1sAFa--V}xI66262??db}vADQFE5feT zEvcK(O%5Y%DT~57^y3>IjKZrPcVcX%;{>U)&Pm?GJGcd~c>+9jefJsJR(IANS24x> z@=YM6+nvw<1QBTqQ#RJVIgF(EAm=W>SS)*K&H+&+Y-CdROkavt*oMKnTPDu<6hA=G zreoE@#p2|J?gWtOnn!oF@3ZsNP}KH5wM{DOg8lcho^<~0Ds3g&x5NkD9@t3D)hKj$ z=#s8#K&8m|?7W7;WtAy7iXKr=>2j%w=S^lZB#c|1#3?j1Z^K216_@f2Mw#c$SYpES zK%f>miK@P*o9ptdt#DiE4h5aN@J1dL;?-$0QD`9*vOi@Ef5&>k%))YckE*u>yB=G|M+6e%L=M-g%SuIUc^yVUD+n9xd@x!F_b&`3_J2MH zqWDN0b|Cje-R>LVJy!t9J5Hs`#>lwEL^-llZ$urQ6s}z5lGW24pk%sH`lW1Y#>YgD z#h8I>AXOA`hvT-`{xRBfL#$bee3O`Rx!6=3_NCB|?t^F1_UZ5Ph2|1g6h?)s@%Ph`H;SKE zrTN$(y@WI-IY{T?s09Ihoic8k!HK9D?`DDap&fmuwr)o{V4r-f4w{!=J>8mDz(=RM zK9fD$s@!<3KkoJlg>2}Y1nigl@anMHCfWC^-x2wZsZrNCHy=$s1*|`ZRcP%%+7%-W2bXXYbIx9MBo|Z~>>aQE` z4DsRVUk2Hx`#okI<;pL#c*L2SQq1Z;<`<=hD^sRMcxOF<5ZN=K9P9vETO)kzI}TqUnqPL=BFR=&T~U| z+q#2s<17;h+R)p!R#oRHG4(4{aD|X?*ScdvPYN)2k1g(^#VlG?xq|F(Y%jX4#a4RW zK277Ho7gU!a!%<^v}~vNtq+pceO)f4)R(16W;#~hpDy!7ja`CV6fdfx+R%B0B8HA* zjLsGMfQ3Y5-RH6`=$blQ187`)#zxh%BEg~i{gpY*DVNo{d<1_iOV0P3Pvd$XirI)88wlt9D1mSecbG6G5Wu6B8nNUuH&T0Ocjub7|Z6WIJ9=7`aFq(a2K8|J>(M0n9U zItr4XJM@E+e==aD86mT-W?%^iVa;8Suud6A^{Pw;>5@xwQ2@m1m9zZX9D+V z%NOF0H3ezGwu3+lKo$YB?oFuhDM7$ZmZ)AMB};3Mu405mGBnu%(VAnhkpH4WeY0iM{ju4)#q^S1V{qJM(F#z0<6H`P-J=yBX91LJ*@f`utKC(F-PfTes?T*s^hG*Zywerk`-q%egv1g!D=r)i1SI(QX*;`}ihTbK1%Mga-py+Tn} zG~uB^^LUz$2A_P|6X(7218kCa=hU8rRgB2JhF4Jj30tlUjkf}r!3?n%(=STrb{P2P zNusa=+|8!a;Zl4ZOw2)-n6a|Jr^;FsShGW-mGYTuA z%3t1u`1kH9H;4SRG8x9JCj1CLR+td}jZ0(y;=AWdkYfd$o_5A=%!>W6r1cs7n@x<8 zy7%gYBdOSppQXmi*r5PS86US}uWw72g@20{jXh&rN5Dabn~3Ceu31Y}LTno<#&5Yl z$ooMIkUN)?5?=oA@Q45&x7_YTF2BlanvlAe_Oywh@ET-sJvT(P?|mV-N_q{l^ig*5 zEreSGCf5Fh{^;`Agdo-PsoC8;kXHp!`mJ+UTHzrd@Q9NtyH>dwl+Lht1C^)8&(ezrKTq z1})bCV{)ypn;Ls z9lztd{T>gHBNR`(WR=4;baeP<$bBS=-DW99=Y7-2fiGFLOlstK`sby-I-8a-t{HT6F0FeW5!%9^vd7cU{jeuog*8^y4BdDunIH!8f}CiLw0Sn04@uAW{DY19|r!t4W8_C0LpG`YkN5bk43 z8tp!z--L<#NT;+8dF8?W(Lnc=u_q5t>poBs%g&)Fa+1#cJ&)*`5^-ODG?2nne(l zaRFBWj%_eMaZ@y4O{(b4(8#Sfx-NOoDm!u0SM+aqmn|8)pUvWUW{->P?Dar;_@{)0 za#*-MNqf6=K#0DjzQiw&P8UmjC8FcJYMOL2*7aKee-VnR?6s~U^s%%F<^<0ClN(5(K-sa|3#y zE`If8o3!zA6#WN~$2Y3OtMfXfPeP2e3)*MbKq>>Qr+;bV@_(S}Cei zU@rs&QhGAZQTmwDI;IRz$3kUlfZuD1Q8=HtWAQ!taKk_oLlOPg zMdcU+YrsG301!w6GJ)a>pahN?P`&}NZ-5j9>=A`96{onUj4WRLUcY=phrxfzIF31< zBN+b$rx+#sMB9<;_h4(j;KJ)5MR(q4ULQq>vSgGf~( zEAJZoIm@zi?SgAv)p;?{&;PqcmLJwz_5dK%DS|EnNuPTXtQrXNs{&`y%O3x#qF0pWyT;_9Fg%O znd!}Nm-SrHWu_P;lU6%Vz7zfi1U1aB{Rm|xQnMh>w{IqucIq_jeL_d6ofbcn+~g1I ztC8I1;l?8LS(g-^lV^RGCF*wv3q-2ybJe?aiRRI%0bY|Vf>L^scIwOb0^1@a4I7S} z+6pb?Sjo)8(Mg?EY6QWDX03)L3Q?SnT*})}M(HL_b%d$8K)RW(4gn!|5+No{&CI4{ z>^|$=%$rwMYOWbQQy;~=YhHfyIi1?KSU&c9ya4k0^k&dg=7B3eYOl%>%X_Uo#x-iO zUx)JxO3X4@KAs9i=B4-bCD7nsh#J`^N+I{gSL&s?_j9b5EXxNk6n}5o!Kl@5Rgh5} zy3WD8w6{zRnh_AW)7Y5|=&}SA0OsqQ!k?JgZxNPH=DpTKP)_Xsh5evBj;FzbEe2q> zz{yV`%t(OTqykp~0wN7~4siNY%rs1N7vZUO%s%k^A%rp$#HU>XWPE9MhMRD5mqxf# zk?SV%49r5x0D2G0PcZOl|L3`M&}ASEkS%2b$#BPqq%dd47aE!Z{~cc!{}r@G`P~$% zf)2Q00N)AD!&FLkAtSH~fTV;dkjoZFAyFxTZ{Pv}DSZES7*dE;I0%6oGL}1GT#Dp{ zV1Vxmc%;Av064Lrb*YSvrJZpkf&7Zr;d=q2Ot>7Z4O=OVQ7MfcgIg@g4F|C&MPPZn zoE}H{HvA1?y<6#VXr(XzWaDBzn$}|i8~Cd8R&vDG$?L{C_`at!jUPF_#Cv4KYdrPU zh&$CFN|my#|HH^y>4jpckJZF2hjspvYSF|-(PaHKjEk4#Dfg4{=8Y8&+O_+}Uz~SN zr`RUJT05=Oto4+ZR8`c)63ysCqrLC%C&1Xc1vsNS6-A%hBnRW;bd0Ib6JzdyMsiFu z;N-T}QI%>QHhTW-eYUp;Y{j=#rSnFmX=D#)H$uu_tc_>wol7K7Q7ucZ_TI}7DJ!=C zO-1C{SCR_ei^J*?^NIEqzweqN`bl`lqz4j62n6iQKcNI5&UI*hw$xpC>fGvp88B`$gzoWAn8i^f0|OsJ)2n978H0q$Z|X~}ypA9QG?3-uv>r?=pN_kjW-1(K&jg{mQn!+4 zpsBw2E}wy(KXv+{(E;pEzVl)U&dgZ$9B2e&z{Ll30$0jEmvH7kxcI-kA0Q3!pDTs_ zztM+i18w%>Bv24I2_h1Y-G-Qa+7f(#*uN!Xa1hW);-$zA0KG`r9s|M|T;RZiyO?pi zTz!e?)aUoTS%TvZs$CKDz6j`d3KCiST(Ri-mWk7glFD#935y3me7Bu7Z9Wd(IvT!nu4TBhPr>2MK4M%r zFG-n`BweR8Apb$F`LNw@tmLU;1rODxh(`O8W^7w`g_2p8D};IY_O*^Cb=H2Kw8ti? zEL_rc4M;6`+wF(>D^gc+FlIS?p70^R32RsbM<`gxPk^rixqpG-dO?XWUbjjp?aSTt z<+if&&kTV>R#khd{GFWW?*_jX?-a@XHvQh)xOk_E?KNy?zD7jl+9Y|N$XQ>mF6$E4 zCwhMVhN+bK`5qO1GGjI#qc&iy6n+YMT91W3lTN4rsF;fe@hq}7r0RkD<;?7u+DT5JiA9 zrb!9A9n$C7j{XM%jux=lI@HSr~lQ#@5;RdX=-jmP?T1b=KIc@fMkKrL@ zHI&;QF&L;(iSgbsHm^JD#o3HK&=4cXj7A|CUGcF1coQ&4F92CZVMC(61xX2T*3?!X zI0^$4TP!djT+lXeoXIxU*`i{8jQjZZRu=;iW8fntK3#8sDbRB-E-0fPq+EvL7zGnh z>i4Ni!f{m8VSR?W!p*>c<-H>VM=bp~$*4Z-MTX`M7|)7nOgmk)PJ;z=X>+M2B)0 z?Hf6K<;>ENco}C()IQw1GR(G9A%nX>|6=Uf(NBUl%j?%x(jFHN?j1ohM+)B#3hWT> z|2f3QN#FGMy85#rVI*T!Zf}@Z;omcW#u5 z7kaHgPp8-vpS!Y=WXJ}5cLM|VOX0=P_C?rCQ8hyKA7?Yzk5HN0Uqjqd5c#%e(b(=E zlnl>c?Y%cF$~=5DO5FAadIBtf4L-gMlYURoFt~$r*q!^Dc9|p46XchM1_0f#!|H4A zwfgTiMwQJL303EzD`##RdX%-@-WOrGvVGyR`TKDPl}b-$00{gIX~iBD9@T|NsknRU z`=99GjXL2i?5B=-oJWLTmP`|%nrJY^Tse^QQs9e{!il3 zWD!wFRiCl1&#RwVe0*#M-KforBQLNAOY46uhl1n?&{sl76ZJ>4gNKdYhnh@8G&>!>ZvnF=z~O>>VB16RkOH*_b{>Kds$@sLK z2op%3W%R9yqc4=dTgtxE=iwH~j*TLK4SDXO3~CO)i~KNn7wCEJI^}`;s*g_Vah&L` zWP4u;5-|_Yu}}v;O)*IdnYml`cJvJ4fPhb!GAOn&K^gn%jX`4&uI>vQdZ6KW;qkhA6tt2Eb4^Q^|fj<$4B8@ z>ksagl8Oitp0-2{X=}na$1+29$g(lBQB#_(*|5l~USB8uP(=Bqu?qdns`%lxqZWf+ zWdU@uZnsFk&|RBa{`suzY>Dnt1T^Cm?GwY(*XVPKbv++vuw7h~;4w8G?9EL75xIPN zq~6>TDj5d7O^q{yF(Z|WOo)QlCB>$zHBaMue?g^XavF7vJYWB;l4N9!t(50>#6f1- z09>A5C9Q30XO~57K&$C>rEsj)50-3tYx&v3yrd`=<6Emn$bixs;V10+xyn45eq_QmW?BB|#4*>ldMQ%!cHWvTpArqbD6Tg|~ zOwLUIL`ok!@gd+`Kmk1#8aR+klZ=GJcqAFFvY0zJjcEp#wL4&oeM&AQeSA5e_;K){ z7O_@P_cSA}lT@20`Ktd9FX_exwR#y34Bj@9p#mK;N;)y0t7_rVW6_XLTMDfG5Ej{? zIN1Rj-a>3rxp+R}-or@6_)by$XMjN>zZ!IwUj^1>U`PSgRvJ2{pvhWP)CW`?XEgju z%VZvW7viMIX#TekurtEsE4c$69jMKq5KF1`w^z~v2@au^0tQ8NuKR62&~_pg6BdqE z?v&fH#WRwZaaXzHXiKROR!x!4f-kgD?`}DT%*{W0oqE~x93dP{L>;L=Ce>6RH2~9N zkgmLDSrOO@U9tpz{Jo}rLfzwxCnl^422OFGaa9_7ZOAdXchL4~8kr$n^-c1SR~W0D zN$q||1~RuD5Y5}$7StwmXtKs<%R4G*y3O7L3-|CNfdnS{8|mtYu$pCGoqbC~XHs#K zsGX9!6gvr)@#3O$Lo^+d#UkO*=@64Tw-0z1eNyQp^p}xo)0Na;W@r#M4qz9jV_hek z_SSPJ@9h`c&$G8Q4Ca9i6$q)&b?2-7{}Nd8%v&4DSzShZPCTt$vJF0e@Zi!uu_EXu z=g3#tS!g6j_uN;zwJ}B!Qsd}=u2lXat5kk!%-O3#MqyIffim9{kp33oD-MI9v-?Lh zXx@yy>8;AuGe;UN-xLc8p;ZC~AKl28q_im(-WO8Qg)(>BU9^vgz+VX5v;2Lwts}u* zdR{ZBt0J^}Wb0QS&-7{~pbOrx-ugo-*p>~p(D${SQv&FL z;m|pLz?NF7w_7Z*U>8R`gcOv!&e6H@F5bQs5`KmFTE%KQlu-3-V=zdgv>3@do+dQ2 zEcdP)pZ;J{CV0MlNbg*0HZc30eMsCAqnQDY4?Qy&g1!6%jlt_I-wU?DhaNm=-_DOOdH!rr zvLIx8Z@5ppAOxFyxV`uJ^2BPwd#uV|#vhp3u#s*N*JTyfBn^{};=da7GVtL%6VnEr z<|ibknk8QZlfCgYc?LbuEd5EY0Jc9H-tVhDya7p>z;z&X>Xq(=dYLciCl7*nsH;o^ zIO}`jL+CD>3M|IpJ~oL?s9dT0V1IA1I4+gIz~@%GM>2z@_&a?*QXg7ElCAQ7t>qcG z_Kj)EUb(roRpy#(EP1uj|4;CU%g!kiACuGj#IvvU# zz6{4**2i?E&r0TGG(L|Kwa|=yW^tQ3k$udz9mD^nQ@!8cN@?i*075A4qzN^S4sx0J z*Mmd-vCP9bh@RxhA4wSOCP(&d{%!fKqGZK1Cek}T!^vC=k$r=Q*cLO% zst()FZEAI^4Qf(UHer++l0I?2qms696{(>~qpH0M{1{KJvFk-N$z zdVh3-)1Pv`CxKB5P$nROr(~6osZLuMVXez-282(7tF+iTm-s?M!b5OdQIA5(KnejW zN)M9*W^D1}&q~i4_tVt1{C8lC|FYjvs`LLpz2m>Nbd+s!X~@p!C2Pr?ov#kXNa|8w zbgbTEk>^qu72PKv^7l0pt4Ne7ed^)`|B=Eo(xWh5TYH}d z{$Xp*r>CYLYMdjCgx(=@t8ZFKU-?B?R=H(;OgEdGFkXqOT6XyHm_!&kWES;$zvRns zy%1k0lOwY}nTSBeTStFql^h_?3%oCh^l9k6Rg6<#Pbk)Gx%+^qwnO^#lpCU6PRrxE zH^c$zpn!o-$$9YkPT2(?${-8S&H|*Fvv&eq#~t4dvWy_8f75B+l_U@$~}umRe?r)CpXXZFZ@BXz&B zZn!Yej>sohGA>JYQWTnxT%8MiJtw&YUrJ6FIr@$jy-h<3hizc9-sD7Gnq4yEy5MJG ze8tf$=ruF|6h3mx9N*s%E!)|$y^*NmzafGPdrVFDl5FOG80x&%vuP7*bxyJ^N#P{< z-ujfhV}e^}J?jCs!f=J|yA8j~IUKHCl}*mRH}n+wCg5F)fC0jvGb`{l)t8z2Ez>{0 z90--HZ*qwPi(OXT{!>wmEeNOuo(^m*j{}qzh}2+)s*VjGF5>d0LE&KwPD7I zPT_`S$=<2?wVDsM-}M=Su*Ty4iq+OCQtdAN_tZb!6BUe|&+_({t`=AG2Th^x&ab=H zCe2MaL$*H$F^9{yc23!Y&3w|5AuuZoB!xC>vzELq+(G@Ycx=91G4^=Ep$hpN;}zI8 z4KKO+i}RdbdD7@xEk8)nzRO#3)Ea70qDc&~V$+!9934)MwF*$l%KRRWDM<-}>2%eH zf`vwUi}SHv5D2@S`Ko1;)}$iVSXyGF#NE9>6q|gg_kC96d|BnUb`y(l!>Q!+S`VX2 zq@En+$~rJb^<&~sh_$##OwNT(b_93%n$d7mi4 zRDvVTRI}!M zIA`g8NliZr9dv$9F~i~!=pSW|AvgdZ0+R(^L6Z@CGOrP+%QgJ|Lwv;?0jD44Jd>?1 zvH7@|=6q4v{plrL@EtX_;_g|MYlVvEDZ$vkmQ22xZ-^aD7j|XrN4?mcB_-6c8OR7f z9{mocQUKHNgyOw^{?r2BB}AtaZv3N(l2xpES~Tp3o(y})H+K)BnxG(v5J77rDpHbR zM+Rkc;d(MUp-`}9vGeox@c zt*OZ#PJPYY#)LW1b@4{>O}aD6oDM720uzVWnMtZ)tk#{DNyXwWi4a`q+ELx~4V4wi zo$)jKC8^gh?iimrDI7ht#`ZJeQxzK18_#d=J63!qW)Xu}-s6?wJp%#JSnWWf=tGLx zI$A1{Uo0+n7&~z|WO$elG}6pXFl@&7=lzm|RnDX7d>Mzzr#Uhhx0_aGyp^HuFLqci z{!XR{HyWU!)j;c-8)JAFr?E5g9BevY>=<9(*VkykOjscVRzM50P(T8Cvi*Rb<^qpn z&L2NH)Mv1l>n|l$`}7@ZD<9u4mOT}2+0Pld%R=jbRXSl6el$%8PCL`{GH;X=df)sI zjH773yl)H+8(KHCA61&hd(W2T=u_xA&U9tr=nv?aFr_;z0%MrNHeJax#KghUD-Zru zWU%vi#@cr1C|Djp>-ezc`oi{WsH3)&qhOrFii*ZUSw-mB6Y#X(_)wqWO^#=%eGtaD zP5}5 zl>N6?f_VRZSu%lg+`;2x*vnimD%UuEjmLNTH1a|ktp^y;{r;m7D$tUP34Qt zi-40x`4^onjbq;y)L~fMX8jRLv0q>IEKBS|!9B)eG8P){y|Xtj5-+Xz?OP?4;8o0; z3#IJ;BH3|wBBd1ej4+sF8imiO{Hb} z>AQ)hAiA6a^0R%fMywL4L`QN;az)yDdII@V!-boRAL>8Oh}_z)QZ$Pp>Oe|Kyi8}U z@&#UVqN}uyD$PFhoIv8@B+UV*1v2h{BZp%91N*XmgV+ITox6m0GZjMfrKolY0)DWH zeh44s_Es*U4?o3(cC29kV3(rFVw3e48h1K=*oT>!$$;K0-=cOl2uQS4L1xlbCL;B; zza`l0G0*?FB2S- z27Crt!C0w;MkF4Xo{${K{|=x2|8JLsH6y^P2lkAVntJS8qt1Xonu#TGujc#Rg|7s` zhvCUrV9dU^e!`MZ4?IX6R_`+?;(rLGI+GD!M@z7AA@7X*a9?~D<7GysGIf=WMNOF+ zBqU?Pp7mGhapRLa-W!hcu$QOt%oikIim;07;4xvL=I4&D`{s{CqlsI&_IGHRlkZvH zOE;LQ3aRT$*d2quVPQ*AyGK%v-Szv#=uWZxb^MK z>FDlO!A*17u@Av~X24iX**^b6T!L=^W{*%+p0Z|qcmezMx9@d+_u*y*O(+3t7h@~k zH5pM_$Qo5(dDF4{#CakFYWc3TCSmGhbjXRa=bp?=XM>w^zYWj@Co7}>y2;J-Fd5?* zVfc8QyPvRC5j7ZlRiIAyv+_2aD#y??mm&OjmuzT`p|{Itjx3t;GUfR&sX?ne(cQl&?j{<&Y(|YMQ7D{ z&b0Kk&doyU!`ayDxG}d1%=su+c##L%u z2)?vnESIoGgn08fcY-v!XUXorj;cddJ2oEgoZT$^_&4N68I7fQf<{QFs(6!egEf6k zZ0HJ68FAF};5L<03BT@ zAN)NIRup2=Z~f4PuiHiYqAi>2djnEu1w1K;VnpH;fM*`mL>9Gden{xZnKRP(o^`ND zW4byrTR{qSNB<4!H|TK}chriV9mBt>jc4}6K|b$?v>a>|UHTasT#Km8_dRQ2?4hEu z3;-8e?76F7_dD?3tNp)td-g#azj-`~VI^h9^dLCwV)F_^A@8Z*RKp41!6NPUbid`# zwldm2&;dLMZ>jS1)TXc0vZ*@l?W&)j%KUm zN_FdC+M8cg>moMvvXn=#vU>I zb}MQnX(zsk{pn$7-DAqWBEnsM7DjbX_hZPjjIspbI2|E>+Ms9^@3hWm#iWdr{s7vF z;|=Kb<%$p8Htio6qV`baGW2Hu8)A2vdaB1Z7`H|)whzzfFm}*?J6PT+wDg)uozA+k z?ox1F5^T(nKZFi)0#lm75z`@ar;E?6Fr6W4uJx{?kK9xdOUd{IV>-;$@ympXJa+h< zz|W-iTq^3!C}K_>x80Mj)QzjLGf(}UUZS6jn0h8#8=28!MXbvmX}e)4pzH5RAt*uk(hKIlO+jOLE`czbP=OQbHGiNS>=u zMs#;8VlNxoKGC}=ZseOZQc(Zu%;}!SR|PKB6-r3-$s!vkzYjk@4A81NrIM+0^VzXf zXN`TFwUTXydmMI|FAWpmZ$jQ)y+_{;IX~)Yc~H`D<)#S(Px<<-!AVB$Z9x}{Rk5hq z%%V>r?&;Gq-Zxy35J6zW?slbn6M6F~e;6xP>a{~{nv3VJ7Hyp(|B#C##SIHa^?P_H zktiwe3-BR!)1Tpp;j$-OdSCB*4v?$ph&2~;dFF0pvy%5;=?sa;l?;Dv?W0jx1gmND ztq1)#L}%Bl!OR|JFfNqN%ekUW0o%XDt&?H#>NXG zuj3c-?4RWg#r3^ow+3HKp=&z!Aj`$DmU3%6prXbLTj)mw&U z__rX}5EsW>gq1{sigjK7v^+6o2#}s9+|EE2bcb<=$ysjg@){e6J10Acl6an7Fr*{z zWN7$Y0=s9$B!6GA-o6WuMUT>IFA(mjjVNTxI)A@ZN_6h?`e`uOCHp>1n2&FG*suC| zTkNn|R>hOkXA$0Od88zLW{kr=xnI?EeJCP!=*^qoMVDFZqB?t5Q3$xp!Kbe|R|f?Q zo+LheSCU!jDftZYoU!;lNcyX(TE9LKw%`{kIgGQ+q7mwXzmpwnnS^>etl@mi=F@3J~S{1y7M%xnGnT$+95gPcCAZ%lu^y4(labd3egyVqV-G=iyw z-rizut6G0XnyV@Ue{@Pu42VX1O6SToSznlXv{j)DT|qi!Is57%lyTZ1x*0`~pdw-g zmE!5FD$GL$^`9h{@hnPO(hOJ_qNMfMAi+#N{O=Q)?m!`#zl+oYONZFd5X_P}{wbfu zO&p}^vM2iaiP8xrbj+Qd?A+8=JY)Y9wvGkvBWC~ulP?=fs#L?6$<{272-vEg`>kfQ zD#d+*1>q+(3$hV@V+A zgJUG6Z14YY3BARe4zv*DWoI)Q-ea#X~VRWG`R43W#9J*_CA+sR`N;A$tWahi8kd6>Sth}5VY*bK`nriXh5J&az zeW{jQcYDLHm~X=|-S_*%696O_gexG$g*hS)S-D1g|@!(k3dqXnbTpq5GD0fuSRyh!@Qu^vs z`Ws_1(Wek}=btr_LJhH?Q@i6)A zw(+>HC^=+_aU^-uIQ{CXr}(^z+OTCql(d$3B)3lKW&Qc`862cmZ7N`>xA9tE(yGt1uvZO9rR7o(w|rKs21?)NV%d{E=fa8c+1$G zt}43*a&JwbnxeL--WjQpB=_R_ukg-C9H@r&OK|%N=oot&tp#=n{mSf{<;V|<=Ux`n zPrA2DV&{@>Emv3CIvV9oa%RCv_HTDhLKtqChhTJU!t#@`z3-pfeu00ud_Xu@?n}p? zIc3_tLVOm>%;YL6uS`;8dPtoLW+c=9GtW8d=|6K7K7+Wk4k@4ek>BgfL$~I>x%N}ia-c7NHvy#DAIKr zWRg#B6$v+k7xJ$@vFMompmcfv?*~frI-rBKSyM-_CraEB+d%RL(3|qJ&<=rj`pvzB zGys8(g167wcebG)i+#y(9&h|1Lhc=$F-=UQV7_=C<(#I-zuG{9Gu!=!zaaO+r}PD< zpieMw`JeOgsSm*<2G=)(_;A-1%szoi9K)gzaCQ-L!}2?~;!Tw@H$D_Kht;%-mZfB0 z<1QxI7>J7hB|S_otv1_9lDaKzbOL3Xn2$Lp+^^Y*kDn(Q-sgIU8hmV^c;e)gVZ)X( zr_-)zf!Phi(m zV8QTy(CE0{*E_LpPjB*eL@k?dyqM%K36CB*b>h+Gfoh%~mU@DT!MH3LhgGLQ6_xG^ z1v_tY>cxrBr$6%%wpCN?PhT3whDo}<^vUlQ)-eU|CjI;w-k0asUTAHV2g#63Rywl> zXh>7q0ds|MQ~AHli;P95(1$Ct`0A3-&gDZE1XSAB=i?*hQ~Lc{nx{i=Hqwe#*RoC1 zm$PdLZgV~uly+`1uBZE|4k-_cEm$*8yyC2R(vvMm;@ZdNT>|m7J$=$OPE7%syXDbs zcXnS7zNkMiVg&vgGg_|nQQO>jjS~Pends)e%g4V z+{iPXn)>R7=xZm`+P^tB3rfB#h5xLKxRaqC;|BxWq84LPNeo7rTOCV`thhEo%O~;u z>3~I3I=u>a_O-8!*DSR5w{`DmorI)3bJhNJS+4{S~f*I1SBx<5Xy0u(kI5u7> z>7`_^^l$yNXj+RdYGx|qte}n%cLC`*#~_HVHo|g9eADw)-kWU8@_Z&r6gxL%+WZ(q z8+@jS?kKtJX>I~dl0@`lFfoWnSwn)Gz*Rt>TT=8F5QImhzBEtKWc{Q%jG6CxKje~H z-MVC6Zvb(%PV?)i66Px1rBNH8RSI3E$F`Q}yw*`)n#p|p&=6>7!+g|+-hs(3K5*s- z?tPcwqi3$n5$8bw%6;Q_%1*e{ZJAvf~PfXb{A z(^!o4gwT>sYn7yEp2RBvb*(!@JQ0tgOr$aB^yM~dI7eUs62{bR)2fpOU+;nhEiq6p zIM)j{Ju_JglT3$-H$AP@tsf%!5y)!slb;{`tRjWMjdiw#%BI4E)G-oXbp!4krbvy~ zmCG%JkoLWi5F|U2!X3blC5<4R7sNzqn;DZz6=^47j1iRdyML+=^51zt|I=6MsbvLy z%_6g+A&e;i6pu%hQ=SKs$-sLIgTa1ib|m3UwuR6hG7^x)gZao#e*>L0jFNzX6I4+( z5mrj2=j5y3f_b-ODy0u~vh@izgSeu(U#{Y8Z){9(kkUjje*Q-EUS1tZF-d)TzgE{t zSzx%GWYSsOnNoPHQZ|n2l*`^=$`6w`Z3z|N?;lCSHHma@7y53)=Z#PpsL^AXnP@+B z260}}AJw@dSr{^F5j$F;Qr+UMHgWbY+gGG=A0jA#)+*xDU{<)wUAEwUNOfxkjJmAH z-zY_A^x4rnb00mO#JIMyvTsUOw4Z9T=4j>|40LiQmMT1x8m{=-)0^RUclyHJujrw|tz=k=-a$<)*&QV~pCV|) za)hs{5l+S*SpJzmS+ZNTLx!Ske_rqw7Ym8`fy1xe4$!+ntCQQ@2hpZ2;Yrsb^AeS7 zpDNrvvI>q+x~I)!Ps`CxYIGN+oleUq;L>8+pAXbc9SYNy$0QmJLNmFquM7n z)|g4TncUO_b3K-)muo$3}){i2fqoJK3?0!Ipdja>HH|M~jvh20kO4PY5`m zjp|nHb5|X?m#5OK#^z1y){@>@@0!*ZTmI-bDEonU;#p&xHlnks;^>3D(oA=~ zp*~qpC^aE7uF53hi;nyRK8Ws=gmfs*^kZc|7O;%Ur2z$cBrNXt%rWRsL6bMP3Aw^GBUV*|?9S!WF5VfH7vHnN;1 zbQMqAC+f9d8E_I-Uw)kc1ez`$bbi`?AyOt^)}GjrtyBpQ=sd=m|0*0nLWg6hbL-xj zLVG)@A@db|O0(glr|_@uiA>u?v=t~(M7t;l*W6ZxqobplyrO17(mpBy?XjuJ&U)05 z9{b?e<1!%R0(xj*0jQfc0{Z^|5$0HmWM4RP$&~&n0;0!qS&>hh9+98PGZk zxN88STdzy|#ET zc3rE)@GV#Dwn0uG#M-NlN#}=VzD{6?uP{?zvRNtTJyhqI^B!++!~V9OQP3De@%b_J zawflLUa21p7xv8;_EGm!j9ka==AY!~d9y{3Y;Kt%EKS-(5*(D~??33d%;@lF zU$hRy7il)eqRa}50~3z2QViIjjA*nQ#vknNq!rYLB0*~7NM!DC1|dl|D~vvuBSkK%iFT-*y_QnzCJ z8*?M4^Aq=mjCd7#x`Oc-MbFjn{gR3vo>;e>?w7;ol?mL_3a0gu*Qw`R9-1`8StiS6 zC#4u!fresu=n{MINF4EvDVLtQI=1>r5IfZmWS{dn`WI5>m(asepX9h@SRW7#^iuA& zDnG04xZvUtSbk|rk%;j;t(^=WNs^CDYh7fq50FoO`Ks;W7D2`)jG;;(cU|*CW38(b5|tT)4YW+MJzlE@|s@`Fzycg0BeuZuucOsh}Sz)+jkE!dY_xV8czJ zs#Y)_xK-zuf4LG)a23f zjy#S|yk}WJKk+xDEM>{&T1D`}k^0=86&)HHr+(>3y?-QPB}Go1Y9>zM&@cqEp`2*+ zh%JTl!e6g0=GD<8;MM#>mYciXods|A>6flZ!vsSsX4M-@?aQ1-IR&-c#tSsil$pFM zpRrAQyx~XtA?`_4@^)S&b^+V`i2nw z1VHrAh2mh#M(+-K3#R@twA%t_fs}0G%^T~Qkqy$E?^RSp_-2WiZAg4n%^IiCBbp@Z zTVk8izw_QarVkT`g90ZfrwLuAgGfLhANn1_W>N&+Iut`Ryn&1Jmaj1wzF3gm1|5SG zJYE@lynoU9dpSDxu9o0(NoCu`r(OwPx#6v0x$diaUxPD?3d!f13LZzWRfQneI+GCd#VpFCD8s#mwq?P*sf?rU=W7SGG+lMMuwxHv*eY zK5a$|7*n}_Ria~j|KDWn|NZr3elq6KrYQ}RF(MahD5?=y@E}d-JC-Y-p7gsAdfG@+ zLOeNfK=2$^%LpAp!&g$GZN`)aW8pFzj($qZTV7JELy+d>=+&Gl+I&*ZwDoiAv0qSn zMekg^@nsb?vNhASE7!@8=<3s1rqoZRzcK%%OHKG#DnFr8Y;7d(v?( z$hp~^tZD_j&~5}8`o<*@&34&J_REe zuM?|F`gi%eo8#m~HZ2vdln}GaV>bCL!=)Qkxcl66{D@+R(YhOc6Fc{!$Oix&LQafy zi|7m;B5w2_5#JIUZyps?i=*c2L4vq9OFS?rO13_XkV1}Ik3Dlkb^6*qHQh1&Zb)ot z3YDzj8GRZ$_A11G&&u=gy?uW(J-uX0`qxQ~G|7&+Zz2yY*pO>+K zJe|*v?!xqGj5#kVoK#hGRdFUspW~fpUe@wASFLa}h1}H1qdMG|q&e{dKQfQSJ<{FY z3ECnWP?oH!&R%eKZrj=$w$Gh~eiwC&FUaJIlgs0TXFArf#%rJnuy;jrRj{HdW7+Dh z{L8^8(KMTp;l@cO0qlq9HN{#Nf3LR_mV)PekBX1dB0Tc5-Nd<9ZN!y8y)7Tea_g8^ z=6sm#R)lkqzk6Nboe0tFODOm+RC}gbFUupu^$Sax#k$Y`Vc0B{qs4pTD>_vcBp&i@ z&!-Z$%6RykS=&a+KWf|=_939~5r6IWAl+U%J6?9c55~1dUn0864;MSn73`bA65M1) z2{#h%S@;S$hoj|mIDC!57oX|SsfHs2pb~_U2HzD zan9y<{$CkP1wl+&H0Q3Qj_YhZuRf4xegK!z>j_vlN@c&qTJEper%v`N{j2AKp`gGW z)Njh~2Z;CYi^XT@ASbnEZts**nH%_u-kb`P2ASO~(h$W+T@-Khc0S|WwO?u5oF?tR zd4#+saLu-#MY@|#u||c7dbgMyftdL{-~Bqq4-G1BGsbbH8ec2qmAt-RDXB2tSx(I2 zR#v>hC;P5^3&r8wW3*l70^tYiTJ`|#$RRd3icSQNr)*0>=5Lf&np~Odk|rgw^xuLG z!GG^s|EI4qm#ClhD@y$`OX<^hd2~QLCv&G{C;#e@u?&Vq4ghzlke`4dD98oYY))ZT zOc25 z+(`syZC88K4k4`5z&(-IMDpAbB(g5YN{Y?IK3a!|5o(=yZjtf+Hqv>GAR zMgN=;Omi+~*#43%8U2{;1KNZBcEqD$;u)93cq-j_&a)OJ8EG<_C$l zsRJslr4QTnz4_<6^NrJ`XU62QUC<9pNG45bXh8;`mI|RO0E%swktpti$i1E3v(W#@ zbib3M@psvb#%r(|!=Ra^GbvC=m^m1B3WPS);7Py&&qp$&jYvh&@cLjOfiPb^-V8Y9 zSRhoOp=jK+5DMw5dt{LbTzH6AiB-n98&E2KSSxZSn+_t#ncgj0pv5g(;qvWwm5&tr zWwGAZHnAyF;cOZqwIFsbtw-P!Sn%{j^117_FVps)L!jYI@t?MPH4 z1Y&^-1%qOZ&Fd99BzVLm;Jgy-bseQBbQpKA<>le80u2?nd?epIJdcM&a7}V|&!N6d z8*6clf(Z*)eLId6&DcQmd4*uS^M^`5tbsw1@I^8A4XYv$dr$koU_jU$2}D`+s>neE z=!ncUPna1}keFr|6=i>-^`9Uy_g{W(e=rEfgxkPgQNW;$+=cDTmN4wDV6*no)t7EC6{F1 z<*bCm1vVyIz(EhA^EN3r40=_PqJH6`37i9=H%bq7y!Ypj=T5L4)PozSS^;@kiyBfb zFm`FYL>=9$2k$|ZT42`;9JAnEZ!Ar_K8L8)=+A?jm0%NbA7?q>d_9HoLofYBxVK8= zs@7NFU~xWvEbib+JmbDL@DJ8VylhPB?%kij|MfiM_#^N*Kuwrrz+!f%BAHM#%O-gk#ZwJiG%S&5<`Nd!rfRWg!AvM|IU42Wa~ z95RR?%m`c5A%o;JB#A>FP%6+*8IW2u*z%6a%;y@>d z$N8+?*6|qpGejeT-?E%$BLjeE){n;oyg)oTG0ggK`b*NC6<>^xLinB-HrcX$RfuDt zh$~Pr!LgtG$X?CHwTC|I-oe@cN#)xkD*-TFVFrQ0VZeul?WdHA3Wjz8I@r54mhCydNWaH77sElHxAS zae(ws5E5m~U74c3-Su4^r!-sZIrF0bxIyaly47Z}+R6PX;8p(N$;35n`28}2d&#pW zLZ^I6IOUTDFg7Oq-S^H;IN~B;s#LPZcVxvG|15ChnA06#65x(A#Su#Vt=RyT#70=H z7Ba`SwRJk6@@S~r6&7aB`2TKERpR&~wX>sd0NHW9Bz{{{jP7i-BnukfzU5<|TK*KO zd{^lwNN60OsOd`q;AeY!WFkF)T6wA$LjPurxvV37YQI^3j!BG{fa`(FoVu~Y|*(@w@w}~G@?d9o98taIe%T(2P|3QHqyh;ZMPYBRC*cbE8 zmI62n1G^vUi#!|PH`VhFF(p=n&U)ioCCRorq^_fmim6hlOgQn&=#E@H1&htwDtuEC zwr%9ne$R%>c9$NDPj1=7Ii9px9gSYr~q#S#y!H(19Sx%BCO9e%wi}>H{$GWHF(3Qe-%)I>1&62_!p`#jSWdCUcjh1?9;|sg=t~e@% zrI}O0%Z5$@SxydfABg7GWw7VuTpD@SP~fTuYliH+am}10Sq#Zw4iy3 z+Kj|mzF~o@VYiu^k_)|v6}C1{B?d#_MEJBmmC}LEiVn>4AhNzyWW-c!QNs-a|^f*d;77HIBvvJWuPJTqG7N{ zwDIcvHhg&hK9x2;=4_w^R3}$2yoh_@0>py5qYa*c_w)cyPrW@W{G4Ws2XnaEk=hL8 zq)(w9mNiT|S$|?^BCMvOJr8IodElZWMO3nlQATCt2D9=*njg#nN22x0iWWZt8cRD$ zp&bD*`IbwghEbdHBOaT%26#_yaW<*G0{PP&-bqE#rUjkWw|)A?fT*9FM{I8a+8zjg z{=-Az@bJ|75fP%M{&5PpOP&=vGf&iksBa20S0YaWPwfw)RhsSixCzh#L>W0H&rfJO z0oO!8OgEy{jya9{~VkNuVrXJNOi4Sbo<>E`=*eYA!3xF#o>LzFDRH z6LjO$V4^?^yd~Kuv{Fq=r`F@C+A)VaqJJFFbA(S%jV{n2H(+&}@SCSrSM$ap4uP9C zAd1hb%{aIV;1Og1Hnfq1ZS&=+1wOOeiXOwpfIOXhWx2fvbfy_-ocDL*ivPzJb;*QO zycPb|io(oAz%Wk%Qv-q?Jqz$Lhu&|hBLDVS(0}!#22O+cfJMds^-upaS@5r2*?;^0 zd9DAX(f{nB{~hNI#P2$OhnG;3FO);NwYGdu?C7tE zB*1$VI8HVpB;W*`%5S3_A83HWBC^tcbNJP1e5IOL5v4X~Dt}lqCG!ADvqdeRDC!q@67N5^%_jul@SXGFaZ)~XKhbB0h_t8}sy6&ABt9x|68 zRx%EBNyF0jKBiPXI9H&kBc**>A#$!15htJ04^@H(; zf#%QX2nNQTBoeeMm_DTpW#*mMfNw9D?0fb5Er~-@V1Iawj(4%P-nOUb?-H;c@wfIx2ayzm{mct7kgopq$Zh+Nqzh16P#KJU*lGm zt#V2DN%fi{OZ(P@IX3d<%NNtwaDz8f(3j-)_J1CoU+Nmgy=yF>rdX2OWpT%NDQ&CjorEgY}EL3 z%fzyIa?o;tQ$t$enDRoA=yuEp4~-%^g1A{}+voRgT&j@RWimje`yUh+Uo=heq-Qa% zW5&!z9uj99eZyv0`z#mW3-(cw>>0JZMBsZtTc+9z^I^G-^X!}1U#o1Rt;2IXpXtTG zK84Rhn}kP&jH;`ah>yrY{Xr)`gy)*###bxV4Pdea7V7MPCzeS~cwScy%iTBNXw|9w zf@6ipdku2RSLzW0y2PH}FIsDmX1d*u5;gSl=i8-#ByB9|UnwEjDM7gc*@eJQnkK0~v=x~B1yp}F})L%nvl8rv0vV?*#4YqnNfCXBD! zHSGq8FkMpfWZ56#dkI5=!DyQ(Ckr+`|8g!#ii%mzkgJWmxh9Ya-;#hd*`|~g#f$Y@ zk(UJJZ5{_ge3nq7#gack(d7y&aW1-~5^u%IExrhPh=jy0g68A|?woANu-K>T1fzGw zlV)iS@Iy^2c?SkhbUlRV8)p(0(PT<+L;*T|aba!F1tN7Y_w_aNEma6=&zpT|!$CYB zO#<@jpsON?o;A%4>gGYIDldXGQ;q5-?+CCMJ(hQPAi=)ep6^?FA`8sqOM;5Nuhl>l z#)9_`u4*WF(Kvwy2G>e@u#>B$4M%rry0gFQi4FdZ^e?|iN34W{T#V#Q$K)ht22f?n zK{7_&xy3(0o%~Bc+Sv2i>RaF4WW!8RTiW0!ZGx}uxGww=Bp(-^OJ$6^&Bp$2VQyja zGriE#UehS|*9YTOORVmPx+IY_T3lm>t^$?SV8MW8xY@?4&qYm|zCfd+WXw#)A+g%Y zj}vdO;ak*_Y0#Jk;k)w_^ZR0;TA{XH?8fK~TYC|-m!M~Vu9tYf^Jj?f<99G+t6tGOb4^`+{!8?6`KA%$HsNs^Fv+IN6)!q;4)82`o=qZfP6e^Vr4BZ*3nT(iZVK)YR`Ux<{5s1;LJ(0 zkq7(Lz4g0_8Ers5XJr(mO(doMRXybMe}#?{1^Al(K6fc*Or z4vl&*FRWS1e1aDB6yZiH%3Osm;cXi;G@Gm(Si=)hm+HdScjd8ZGY=WpU*Z<;I}%!D z9yf{awjefK@*#^G>U9w;Z)I^X>dVTXzzr@VlBghHJA*KAKk=3#gKP2F4_%=TQEN-{ za!#+3l~q_|mLCxq+Q#@na;pP-FR#~;BKSM&qj&wM%9_=y!xkM_@%eU4P8%Wy}#W3n5kn*yF(W8UN1+l*gfA!4@qJTq#JR9B&;;|b)czOAxo>t zPb!H*h$wc&(`M=lzVyO9J`4&oy2wrsVPE4c7Sd3u&*5u3bmKF7tbQZ&lxjD(#*l&s zA>Y@kwm7US)LRTAst#S6Dt2ByPV8dWm6okEl2gV@T2@zI$>H?Z_f1K9Xw*0pn=y!F zb+rlz%<>%kJtaF3lopZAhYYA}=&-J!`#7!jQxdO*D}D(2u^+MxWG zw%ruTqlc<7e)eX~@KhK9zIPl4fpIH}%#isM-!5rxHHBwddQe11mE}6kg8oM`KJLk# z+nC`WGWEI&AO84JT?>W2SVwDQNkizPb9mu4`Vc1KY1BizDmmpI>%cbYL-0No2pk|* zFiRmdqI#~|1HI`qg2|_nANREwyw!T6pipv2o~yiLUt1K~GExOBN&za6+`;$i>-5Ce z=25-<2~5p&vEOUrog6CaqPw?j0+r}%R6zFQ7C%8wFqeVYD{uG}Ws3|0S!?}6c{CEM z%5OogV~jVKjsq-#fp5I%el+k<{@tu}=6BZCbxRCLdsd*pI*3>3OL0ZbX1W`H0QvWl zop}f8=s?Kzk;1lD_AOP#bS{D_}p1%)r* zNaC||msUm2Pp>Q}=mG9kZ? zvb$%H_cgpQ?elTC#MJHwAW#p~lxvB>=Lg2zpl%E)IEaTms7AJNUK0WNq}pc>TL%d5 zI7!Uiy7j(OAx-psOwQiriuRVc9AdUsq_{YP?ck!9bulLw?MQ{!q=a)1;}ZPNj8+5^ zz1Nc8gN}zP!bxBavBa7lw%RZ9IHxN{&D8rF}dLv15)c zk0KyOf&FXu^>Ful59b_m?GK7hl)eK~0}_yPtH!hQ^Ko=X5j4BBfOiVNCTJ1Po}o8< zgTB;0+$NAPIet%Ol9lAcBUf2PWl`IQ09E416}y5UmbEyU-_>VQ(F zYV~qAQq2y?yHNW|X0}gu9!(_>wfVims>>_vcyc=e3%*<1j;fsKRwrIa#C@vkx@aK+ z<9yIP5OeOxSm2>K)GVc}15E9~@LBE~k<-Ma)8{*L{w?;;=XKp|^A1oz4D&=ACyyOy zO{&-Fj*a81w(!J50L>@*Z)VMzR4-T4O7IFVd#PEThYNCWuRe+EapFdY->4-3x%KAv z+Vt-Wy#MXESj%z3H+`o2rhe)bcc_;xkqN1OUM6FS-=Kz<^g@uY#oA;IC%R7{JBL$@ zAUXNHfo6FNafK+``ZRgu{igUaTB=&<7^QtAE(?n!LbnNlJjZ-;VO9@0pw2-Z3Gmcd zNNH|>fm+IH0Y}Zg$%9l#106wdo>Ljrl#6G~D2|kzco~*#@&<81TWqt+E>@~T^V?0) zR8K8MI-SgLb<@Keoqfmd#s#;4`0%mvdYMZk^%t)Z@RBs_I9Z+P1jHR^&2{mTA@)$qmpbXaU!6d0A*ue#3(v!>y z%nr~X8C_DJ$UN~>oo$Jgml5Vi{zm8Q>ju{CH8Nv-S!)DJxr~)nK%TLo;Vyer)oYZr zR}$R2FjNjY{+)yB)T1-f$}4MTUatruNvj7Ug^$Ke7Fab)lnSOl4K8}47}L zzHvLTSSa@~m>|iGjy)4zGISg!Xbp7BLOEx{18?if0p6-9Hbmw69l~qtUW>SYAPe%~?dU9f{ ze~)6pCUV!~X_Sfz+!dc!40d;Cy4kkHQ8qmSlrg|b^qd4(13PZcBIls@KKrOK;pCd< zh>!q+56HIuJuq=f?%C`X^YbLr&->tVuFZKsk=~m{tg*_MEo?_Vq+(5+B2AnGgRd*o zxqO$27_xhf2~GJ@ym`(pw`#E4kMIp)&cM#0P<>Bm4D+l_e21&k5QsV$n3VThet^r~ zt)Zfe2$FqLlw2)-aGq#&9|%Hs)&m4|SvJAXpW_zcy;SNn{=FjW+Gm+B(u$=GzB#SY z5j=wzPMDx;hK1%Q>d({J(n3hz(nS+w?dw8%`z)!+LqUn#ZelkoWLcTy83GpqpbNx1E@u z+OacCM~`5ye&yrQupscl75f`j>5^K$h|bW6)6=>VK{kRJ>!<^xBpE*_(jFKk^Ae?1 zq{C^`M-~};A6<+H78n0o@>v(#5ME!(73`upO+JpM)Fll_)yjcsa`il9f@jMn_t!@6 z7WMd|Uyhth@voyaRvJOx8btCr^FuY?7!jw{6PVWel+$CwZfdy7&zoQ2_M+1zkzu_f zGds>1E%6f+;BE|T8{P7jn#8V<8gVO1v%3lCY>mkDID{xgz1tF(qa%pS>Xp4HpW#(( zrts!q8in$AP7}tjuW^dB+z?T{jhf6tiXdv%s^{NHxvsA+79ASj{xs~NO&c=E8HM@O z>oV;JjBnMZ0PZS63NKd?rSRr}0i!Cs&S3i|D=p`+U7N~+-I5>_sJD8=>P?!piG%(G zp#dt^6pOo`CiuV(InktNoR6mVe>b4*?z8`hzd7sNXScTdpVyM-bgYpHVb9IIF}Hb% zXx>F@arXPW<;ecQ+u1>nIF-}PNEr*AdHIkMK%w{?RqZ*k4-4f`*OTc*4Ig6j5*dqy z>|zX>1#gl(q*Y`@Q%*|spEK*2vrpNCfMj$W zO++>pzH<95k*La5}&lsPF~t&rF% zRmUs3BtksRu)QGJ_2`HtR|CUi6-uPiW5QT2p)WodV7T0PH?l#WqRq>pkyvM6cz}|& zN~ak2<{qY#V!|x*5-HrlN{l_UYG*z1=`YB~hRd7gL~MP0>dv5qpD_bQ;$5@l{Bdu% zm_9XHSVhJAv1ef>w&Ljk%k#MQn*we~KNK$^wjoT{B=nx0#58V1rOx7;%g1_cxlCz@ zj^<||M*-7y%j%9Ey43(e!-TQemb~*LWEZ6wD$=bjoMTw8vE@W`k6J zf*yo17uVv;Et8pskLWN?_h^(98U4HrELJW$37roSsxy>?G^5rd;`@|>_=IU>GGbC`P9gAAjR34JN165@Mc?NKbZavue1c`@Pmh=Yel{MGXXcH3O7S#cN!6Xx_m z_M{1v;;`F`tR-s|4+Gp8SwZ|d*=VcqyIl1 Ik^LO~Uv8Q-?EnA( literal 0 HcmV?d00001 diff --git a/tests/data/300vw/001/imgs/000009.jpg b/tests/data/300vw/001/imgs/000009.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b9782a65e18f94a6c3bb420a912bbfca2911a79d GIT binary patch literal 47565 zcmbTe2|QH&+dn>biHb%cOV-RtS;kuShA|9g25Hh=A(;_bT9uHfCi`xzjhSIANk(WB zg(zVRm8dLb3oVwiO#jcg>v`_~_gR0>c%Ab(=ge|G>-${S`+Z%0z5ew9vI%W#Zwuk$ zgFyJeALQ3thz(?$6m%<8a@*D|TNUNEZP&Ec(o|R1#G0DvSRZja=5yHX&_U9<>?l%j zQs}`$F*UJC`9)Uwr%mfGUHM@3YEp?XotH$_#gs~V+o-Cxx7y+SUp6Wg*?MpjN;V}~XT zjxaDZGBz=_*@v{XL)oM8u5Rx8Jq{4OeUAAa_al-*Pn|w<_T2ff=qoX?SFc?sr=+H( zXJlq&Q>aBWI-|IRS$e0MRdcttuKr%rlc&ustjDGwyHa;== z_1pKk`Gv(FKbLsz;sfpc^ZL7C|I#i=&@O&KK>w=lRejtSX|IrOu`OzdA@#4krmeN?f7h_f|EHGyTf_dnUHuSo0X{Hz z0+J95NI8tt?cl1*p;BN?Q8%2R-A+&li<*)Vl>ntC;n*_NTo^T1ldmZaCx*3b6+4Z< zbqU01Bk(cGWLOgg#(}U{mou`~Bl*b?0s&1BhO*LFk2R@e2ya7cQX|E{wy7Hlg~X<0 zq(ogKvL?}%2)0}>gJOy3!5FjUAVdZwn1+D#U=SlHKRyP9*pd<@f#`8U^jNM#5s4D~ zazq#>?J0tdqo4(qX>>#yBsQss$r6Q0Xsh!}rDQ}~uCsTrcNCNXYx4c6 z!=Lg`U3m5Rmn~`?66(U|VDDhLcECINzijrPk=V6O9RiKbNa_+gzeJ9u7nGDRe_#Le z{(oBX-FHC2NU^3F6qujP5I9Ccw2kpZq;dkCMu$R%&@drw0eM(c78s}m=nw|VTDzu6 z({0K~!gcYJ304l4>p?3Vh3L>U&`2;G-v4Z=6q$gAz+ip|NE)wp0vP3DJVyB%Q3A&6 zeH0O+OcTH$dg7G}g(<}19t`B~@eu@tDaDTu#>ib83khvyhB9pJOKEAW*eG7#TVA2j zsgYnPQh29Gh`Ks&WO(=c=QI#QgA1Tme_#DGFrYjF#Uho3pjgW$vSy*x@4n~%yD$IK zzWN{gGYyM`fFJ#PTN{f5+%F}i_K)W6Q2gK~|LvBMk`ZYnq^+*)(hR!3&>PJ6zh^yf z4~7H`j}wE;TMj`CauBco!QzROhars+)T9l?Vt#an0Fy`sYlzNZlOdXJh$$K}aBC^DqceA`LMD z3bc&_iWu2r@5JZ=BccrzMT5@u+J=PDX#6-lQ*#p-pfm_?Ckp!?)4&}bQ;C!UT?dxg+6v>Xvj6S&|67f`TKn;rzYi;7sxQwgZ2#vR{V$HQR}Z=|0fXCRF6F^0J?sA(D=Y3u^VJO`6~w`qDDMicUncQW=U zz5E%zak}UiWN!rFMQ94fRO@`P;M1HcH>&b8w%n^#-BqG(?JtPq#xd83>X~1Vv2^54 zsVCe!dMv-Kz9oIFD_<@02vrSRPdrxk+`or#Z{yONOKG$y^yi-Z&(_OlQn9}vej9&& zBCVhO@xuZgVrbR3r}e9a z4Fd@3s{SJ8c-J26%f=pe!yVa2uRMF4q-C)jvis+!UT>_$*WD5H(Aaz4r6y{h10w>h zR$Es}xNoDE<2`Ir6By;qM^9_EH@7}?zw%vw|1#Y;VYR$><_vyzT<(-Mv*d;=D zR~1Q)whYxTxm)i*dzan%(D}eUrIj$FA$+vga|k}Q_!B5EdOb2A+K_AoZDSv@r`}^n#G_+y80HY zmw^#}2O~Psxpi9i_wF}3_`&N%#C?}u@{PJ}*BTz80#&%HSX%kd_@9y&Iun>kLI^oog#O2{Tw<1P{xHZ!L-dk0V zzi^%<8x=3ccw>>#S+55g-a&m7=Mz)$Z&G~aDORD@Jbbg^q2D@tC*F#~p_ZW(+Tt!} z5$MxH)RLdyBEnKTQ zht3}~JNmJ09KQO3YYiz% zbwdmr-JX}$pwgxTIbF$zr$fi~Or*SE-~BX&#gV1xdU)SCQ<} zZUgWhEO!_1^aW;+%w)nC*NnD=pUAZMI=zEU5y&(1KWOs{;;$&+gCzaaMoPTE-cZVPIiA`mt%wQ1?h zSC|Q``ZUByDF=Ey0=JKzWAsO~HuY3CjC@#y-7Wa~rRK%rp7%|}&fTespM9yZ^XdWR z_wA{_AY8Lw5V_7obFYy;=6y+-;%%8H174lXiWWRws#>zt#{#XIc{5j@zWjWiuI8#R ze3;WPs`v|n9+Nl~mbr4yf?faQkk0GT?Bb#W<+PV0+k@b%3xyd4DkZ**@xt}etrf>e z*~=$#m^Za0{ruy*sWJ=YZAuray=6@pSXYO$Ml6dT^Cv6(`p#Va1yQ^@MKH)gBs8&c z-Kd-3k)&KGSRQ`1JR<&tyZQaaq9wfb1zAw5SEy!{==0b}Gp!t@bK(AUA1SNbx%|2| z1J}}z+^@ao6{Qm{T1u#31*M;o8QfpN`Z1mROs1-Q+G(_7R|idK{wB09M(*9oA9G4G zeH+8xNAM0f&tNkyWoOzM%1Q8>Wp^7UkzNVe@wb16>#lmIJxmAy9d^xE~ zW~J9j&07SeBnUOjvD7-5G|t_IpjD!Fvv%D5#QDy7hDzoUA@c}u#5@7f|Nh#2OlzQ8 zx*WU9lm9|0%D3jF`Qi3dtk)*Kfxcjx(M^LcXZ^)<&DxnuvrUC%TP&s;#Jp@{fGvDO zDv8Z@Q3f`S;Qsqyp8V()dw8B(`L)z_T`K+Vs0d=4&FYZ5>Msb+JpHdNNo@(ime+jZ zQ!5NB21op)agn=C?z%-9t`&<*KIqv69 zm&hDpuTOchh;fT}MB*Gi)$6|8Qn9I}=W=Qno{E_!-+ob5iS|i&rs=cJ!ooAl8miY!kb^b6D8 ztmJ_)y1hc($ll(p5!uJm+VRTCjR{vMO6yyQi~8psYDgKwPWDXMW6H;uiwyMkjfY~b zK4}ib-coCFl0RA^^Mmn0SU!yNfnN_^x9$92uJh2LZx`F1&A|8!H^Aqqc2KEO1?UTgTMK&;!7&iM3zw= z%>}+7XeVS~Yx&D?xUM(ucXsVwxllkqR!iU<{;_C*23SWsqnkADql=Ppr-d{J zWf?EYJ)_GjO6-v$=7`$AL@ji*awj=u{~DtQkw57cda4g$H~Y^bAf&_xWa0ULSJgaIV4w?>c5c z5j71u=X-&Fqe{&w-Q{|Vccnf8eMutD^Ekb5*!KZ^Qyb}ejUnu!jADAZ<-KaNMeR^_ zw(RxL)F~&2vTLtMXzL~S43iwU?g8LD*W`dQQ3FqRvr(eR2Ph=Plbfmx&`*(1E()8O0wi@hr zjKO^Nd|1b42>Vo0`A&&|c3XZjg&XWJIdNmDa^+l2sP8?q{oK8T`kq7B*B`R!MStzw zc{FM0Aj98wp=r+xofAf0S~;`sDi7&kCIug))#$8TLfxMTZ=>076yL{)1Dsn~o}+zH{0(9g%Wdi5m-y&&v3u_#+& zaP6*>{HddENAjjeH{_8Va^CE66>-s>Kwb^03>((~PYH`3qUC&j_trIx^l$~Rdd!*Q zat{NzH%al1nLBT=Hl&kHX}44xRZ&3?HoL1j!}ne~z3xH844G`7w?sLs(J^DE6&ONl zu3RdbFKwwfxN%UaVtuf)x5~-+%K74ccjb$PYksyk^YR>I@9(jyBrdHAp?=5;gXD3`SgyVigra$;#!EF8c= z33V8)Q0!I1WNRPO?fLsU^BSjY^&fRtE{LH%9?*}9#vE|5iTh5jTpyE~p9ZPje%-`C zv}`}}0H2_5X_w06F9=f!9sSTlX);2r^4(2}%G1Lkg%J-(=eQr0@g-#2DIjfvtnYh;f=~)>?BZKAAED} zD-d;4)$$Sv*`B^-l^xC!39QIW^$kN^^Gr^ltZ&Tq|9APT`SdXa(Lq)7YgZw>vwVVG@jsE zCEeQ)ZLc>sLu^fZGnX%y?Z&zvo)L5OBhw^(PM1txx{hMleU$TuK|h8_phmPPkjT?a zwO^3^*n}Fj_mkt+$4HR2VRDsNq#mhF9@5dOzm4+h8#3i zMdUek12x#Bh~p7GHo!m2`vt+k58ilM8&pn9(Qh_Cm`3I^atS7TUaKUvgFbja*E2^y zWFfxpQf#?ZP_^|jNTfc7JfR*#m+gNT>YOaX^1gLs8CieBxHIg9>9&Z@lk6JpPY16p z-m-jY!t~$gJFnYtyK`k;DP8IHac)>*``wb_ppUv6Vh0(;PpFW`&ow^maeoN)G_j># zaVgaiG9_zj0{*E`kVdB!3K|qJJs!S=*$M#T5$7T-**(TxVn=unM1=dFN$L(c@2K?o zLez=_>eP+IS@l4QE_(Q*j%|97=*xFCWjl`*zBU~$rm3WI>c)My*@p}5cynw{nub&^ zAHbNr$yqoMaStZJdUTnEL3Fpve}1{Vw_&hsQ_;?Is+8Ow49;D>{S%_ET2|&-+oz)C zoxdR8U-S*pRBnB8(olNC0Nv}G`Ydxf_U=~{a_d$YS^MLT8My|3k+k|iMg^X@p@~PX z@JSfv691-H9y2d2iu5u2n2>pBk6gql7YExz(#0QlEFzV!TinxJFUxYj9%FG2_Q)|} z5Gr)Vf(Kvw#p1lOybhyd$&MANQ?||(9^W!j+Xy@NB;ni=)rou4sf|I-^KOpwWkW%A zC79ct1ey)JC;HBufyJAvi%jzlZm+KR_kzBn9Xm9Nmv!e04~DiCiX7aSMxi8IVxt^T zLOe08Y|T{$#n26cVpwHp!%gM6SVmrBLI zL`~p34Szw>jHKmm2|=vijKfjeL=+@6*c*t!-+d!@(XwR_dIByj!0@9tLL;xsJbe<> zzQlPNv1t?=8B)>3@jkUfB;8C?7JhrLT=q73#dNnve<2+<&p`Q(81_W7bFJ`oc>TH~ zY`~PP$I0A@f2=bJ>$a~y&)Cu*{JIAa7UmN)!D4cPkCd{Y>y=U06G6nA`f}$U)T-7X z37N^UnBJ@>!ZnVufMSF`RksOVL}FY9R=X{wTM4y!RlcRJj{@<5uqZX$$!7+FPd4s5 zSykS%HB@1`$*Cg|Xc-t{+SynW&1IcBvRFH{IHhjy3;M z=9Se%)}-;F24Tc)bO00yk4)ks(Uoks%qkSKH27%@ z{n5#vb!ibge!ok()Y4|kNkCH0vXI#UFBqT*BVr^s;&I7Y5n?wW@R|dYn*306@5d1)CpRe)sa#KV;)h%Pc6?y>j`odo{oJzRUy#;vz=+jY*jwBSet+7?379s(8}B3? zQnqak{Mih-Ht(u2q`P9nUzB0Ju*ueR#)3}ZSd4snJGDwG$9m1UP0M&&-k?ORM8D+< zVGl$+GmL2c=}I}f5}otvQ|Usr+8Mnf`7LT2+q0fioL9mk9>*UlCD{Faz`%(CO!C44 z1%aPuxAAD_G+?X%K8KCtg8}J*CrwPQQLxTD)q*W|8UfgIL=RJxCLp0)EQf|1UE^aP z2Y?e|p^YDck<_Kkip{gPl%N&kTu}Y!)9MgJ_nJnrMvjy=z3o%|-CX~xr*<$R=biKIA4mDQz4YZQao@vSB_ z!7pufN9LhpC45f;6((^ZnzGwML_hl*4jI;07?x%d)1Q^yP*2mO)5^BPWxH<6FqxYC z#VOpheEgDIyQ7Pcv-YZlM$24TT@jQID_Oe%PShu7LbGnhOWzLHY@91IF5+iAsXqu! z_xGdqYu@&Z3hTLLKF&Ooh?cdQa>S&SlwCrH;m&JKI3mNJon8xaxK#3i%P=`&~uaVq;$nO85bd+f4i6{K}4*h_-=l}32S9pUT z9U6H&bJltNx8aP8EQxPiOpQt$1SVvf)ItsL3hhhpIVU^q-~<)-Nj|xKOc0-M_VN6L z6LiQ@JY%>1N#kZm7%Rp6+4Hbdg+yuJx@3*xZtdX%z4Dw&#AQ{1xKK*$&Ai|<)@+<_ zy3HOTZ0a~nAerv1`cb>ztnlI+gA#apT&4M6NJwQn{6m=?qQ=K|U|X{Jc>$R+1zVVq zX5l`=z9zwA5_#`>`6p(w*X_|ffGPiwAnS%fU0^r;~WIPNIlGc_2PrRTI8EdP=#xj-?U4%UXaV=<1cl!RR-^iD#CZu@zS?4Wb> zztU1xKT4}_k2fw8WxeiW@F)ABu}DoCzgJQrV#ui(V(qO;M~t2+lcD(tXO+7lZhl37 zO~y((Vm5E4*viT(khVW{B|jz$iVZTy=eNa$z-}`6P8cG$l?sMknuKI4RWYN6na4#8 zd<{Fc%R58cghv~T6CWlLh#!V2!oH~c9^_*O?s*!LYW%JpMMCkL{>Bo}kpDtY|C)Ar@pyvBP=WXHPn9a%4y-$F*@U0qL2+2g%_#&kHG zR7<*@y?J|Zey^~<(__c0pTF5%vCu`Zm7jHA*%X<4`Ml~oIz3yaj@p(&U-u*l!~o%kBQrDTvH0qUkHky1H;D;L118?#*mh>ScGP`faQ z?-)cRz|cwJn)E1VwM<8CPC!A!A_b-0Ur4No_1X-FFd$vU< zvr{5DPxqKL8{1=(_J5L3M0+a^CvCBb#vg1jF4bJ&beXFw&hedJmUP%*eDqyvNwa9k z6-AEt<%v+maQO8K!$Z&9t38e+yI=DL?hw`bcWwWbI{znm#0N07kUx9JAYv)O`JNwt z9u)iU#NF@j|7rC(}@i4PZeJQc-^Aip8#BfR>_3v6vW0eimt7vv)D z=i0vR^V5ue*rRXXC*chXUWzG7?G@LHxIc=Ev_du@`Mjdo&pxV+o_bcc(1gj(5n2jH z1uEmCRmegdrSH8Frf1Zu9Nd~m*N%hkM{~m}$DE$jAHk8Mr(J+8fLxiF*y|K@YaMN? z29yPODlahULC^tkD8RHsy(l&J64G6dv>SW!3u3nQdr{{NZrJWIr^XO8EdS!+@7)om z&gQ#+jyL3OkyVG1C*PlrT5>sL^)a$=3$+{bee?2@??piG+4wTO)mIz(Uf1H0g(=W} zu8tv_UJ%emu<@p(B-30xfI?^RUPIoFY^B9l->Hvbw4#d68bA?Q$UE zfrY6)pnhze5V1)--Igb>^MV_QkSA+JB<~E!w>B7_xd8Na@WChvF#XYx04Rgv$CGVi zqlDCJ{5fzG75UP@gXG8Hbfs~9F`!E)mYrN$b{~; zHLyPRR$2OdJ*4+w&8PuRJv|<(bjnbK|J#3wsk**3b5 z@3g=d>abo(g&X8dLdltW2@nW9`=?>oFO8;)y z1=zQUhrccrpbd6JjpBuM!iM8_b1hOQY$UR~$ppV*v1ltIQAiu2&6_r=pW}17_UoPw zR(~3koBu#;VpqgSzcW1~mUUfkGugNzT&{23kZ-bpd~a*ClijyBu155&>KdU1@!ElZ z5jXwBs0k1SEC^4=Nl}B_%$4?{%_d&u4jAZLP8jtSoc#q+lJIaf4f+^nA(ziKNI9YN ztobj0|I^FuLO!X-Z77cIR91hx$l=sPx=a3+m@i>rT|HK^j4cCB1%%8)Y6lq`%t;Av zx#pXvoL@C??6~tpR8v)~J@@;iQ$D{S=NnAnGX=#t)enEfU8<>nUUp1=pOc($#>t=Ky%#5v0TAKfuv2|*>PiTq?ETaF5uG;p1I}76rE`-=Mf}AgC1r9E zD;E>#kevFEk8e=@!7e}95n=QP%g^07fk(8q%$rJeoz2^^Sn{1V&y-+t=Mis>D&)xH z#|w5;z+ZffG%k6A&Xu%Y9kMmGJj~TqTu;dw^&$+M z5R@PTL4Jra?p-HSEk(SZ@u*wr;g0^zeWhMxLC^0!%bayZ+<81Ta(7wTDa00mhgSYw zY>W4ZZ2K)nyDKz?rrb)Hb)OFkdS$Z9o?bcve>{Z}NdS5xN$0K8Uf7Z={IO;m4X3dS zCYalUd}8sy-VRAWvV+BtCU1X@7I2Gtg!G*W62Htn36eM1qO*5#g*w!W2*#G z9naISNjk99kiLb#T4)DKGYfVPif=>Yd(Zrg*&^qgl!^HKsmwOi-32G(bs6@WhKMW+ zR+7$9`Oxx*wOF|Fh5HWv_dAQI(qIi&bFwMMIUE~YLNb8;j z9mPm)aV7g@xX|cc0+JZt^_;#dG0;w3Gve9e3VsEoQP>js(A1 zRsV2ep~7*nviK`Kt$khinz6ho98;E=&|L@*MxjpW-tbFsy3luV_7jT03ZQ+z**3+l zp4sek1#cs@hEDDPoyyB1<|pPW4pz>4(bJtnvMT^Z>-NK)_`3`q=tqiw=!>b|a?O`1 z>f_teLw+cCjoLVEJ)nN8*`zLsTnn&@i8^ayaHew=vp%@fTW(}Ebd~fnh3~=G?b1c1 zse&n-2U?{b7bZ8DTN&!GKjgNi?58TssjW%jr4mJzF8=awJY!qa{E&KLwTy_?Z{hHD zg(*@-x7IP|8h&t{=^D;>8WaQ_k}!6_&F+9PnA}bdf`fdyw9?WUb^?>+wS&R(+g1n=Sxui(gv>U&nSl-?F?qxTm^Pi?%vd&mh$v5B$eBn6q^ez00ENgL7^ z_fNS@0IB@z57#AfmD^*D>V%ep6BWl*)jseCk=_*+KDl34vU7T%T_F}S&#YMoNjx5k z2`DLOz3H@uU`_zRTIU&Wfo300>|b2U;?|tHUVc<=;&YmvZ;suUPxYyX6f@x+zR`6u z2Gu6iBc9KC9ACCRwAnxV`B zTWK)4`a~!{*R23PofJLgC?Y!ww=(Ilvq$nHhQSva(5DS|&pXT&vo(Q#s0rv8B8c&P zdGdk(zP`}#5yy4Yw)RZ5WXXke1|dS)?8E->r(N4q41AtRJNDM+JjWEep&?a&-JVc7%;CK#>4?KC?Ndl5bBpgRRGNtvX z$@bDOMEsh~MV&qzR@+F(wS984Sm@}xyr!qVy7};r)Qjnd1OAFU3Sl0T#3(u;?Wz-y zo<}Khg$O=mk>fXg$MmytZmr~^Z_ELAEjuyh*f(jNYx<{{?gDt4m0ulO6%{!Scd0Ap zBTJxK?du6JI}}+=Ix&2&-!{SAK`vPs?F|D5Yj>JSd`eE4t86;-K8qu01>hDFV}(r zgRtHMUX3!;J>(P31w3#wC%x$Fk@dKi_1$q90VIL82Kcy1w!z&ZgaGkLlwFpg-mYH}%Ew5HDcDTdI0?1rUdO8CfIcB+>H z9))9z5u&lYKv7~OiPQ5tG3^`@2t}Iwz7R~$=*(!EiVn- zt=|~@wJ{)X-1C&ZOpChr>0UXuGrGrWIebbg^2@zOXOe4mKV`P3F311G zoySFV>e~dwYgSz4g(8Mmo%%-3CYX^Aiqr(4n(i{zF)IQ;)?BCk=>%#_*?nQDU_2U;L^hVO<5;@K{$yO$NQd*C42P;%k~dS zc$^!~NsXR8!0}n`(#lk?y{@Wuda2jcvjA_++`*p|ulWnoTglEt6^V(^wS|Dwr_PI~ z7ETfmOwS+mx4P$k;WR_TgT;lPc;S8`8mkspa3(pczO4{hZ~LRPAS}tTG1zgjaJ}LC zQ$5>e<-#im5iQFt^i0Vw^N2hAgsenX&&qp}&Fvqqaj7`3?9G9Q751hpqr(-p#?p?t zI%UE6ur1du>COCkD5{FC`%NI37->}OGcL5rp(ErjB*5iAuw^v{$V5lEizjrQj1hc_ zx@g!_{6?raju^+$Ey?PFbYQCrDMvp=>1Y%M*6cDad3y_XO-XCr<2Ht-uB|?Py8i(O z$Nxj2+Vc9yhf8j-p{SCpw#8#1utJ-|%%UHz-O5vzpL8*zm&b#O-<5bSRBVgN0zqys z?*T~jS-%)V2)#C0@}ajzd4!>or;hHrdyc_6CW3hEap^}{x|7oU5V(`5h>Z7pWMg+k<$MVh%PH6^ta3>KNnO=&GtA@K_a2Rfz@x#dub^fY@ zpM#fsQUntV0n5KB3viH;Vm7?ESU`IUc=)*CNui6SgUZk=uFG0s-3z|lFJ-6F9y1qw z=b;71BS`f~yEe{!PR>%LT}WjDZaMwoM)p$!o;ul z^TocSj$OGFj29_UwKhR4L6T~8<28s90&*=y-p&THfOmw@n~lZ1HrKe;r5^3@3{1}p z2^q!jyEAZh-A->o0gSuEc4^9{z8FdXrj^Oi%6N5?cJL>qL&sa04;$9L&@8f0!1 znAxbo3H*$Ua!LrJIxta%^){)uU@x)*r<^w7);`C?+z%r=SJ${idK#MI6|Ki8XOlSR zH(Ck`j7bMl$=h=mnSOsyRo>A5D}liyJ#1V$7vbJu2jg@9Kh0g#8ePku3uCdwgVvZ^ zUZxLO*c4>?q`B}C9C-2VM3CIGmea5uP{_ZdUs;oWU>>iT>s>HjdJ1pu@;M-(f1D!S zm_JSrFaE6u36N{eX99ed%bFq(Ah3y-`ord9#pZ%(xoIr{$Wn(b$xHV68@nxI<#@zd ze&R$kD<(4`@hL7keUQ~@;8&dCK;|pP4l=viIU>wbORfU z0h$oci~L`)U#D1Ucp0Ak5h=tQyDdO0NCK%{YuPP^yutsCTf7MY2?9(%$Ohx3BJna_ zz)7JH57DTR3g|V~m70>~!rv1EzQ_-_*d9=`G~g(MUjs+rHh(;3UhUJ;cnS}wCcrd6 z<;yv;d5K>%m0Y3;O#oydQ6uGuy!;~N_oMuUd9mMM*;1Hgvvp9vtkntH=MgkaSqb84)LXK%DKG~eROOBxHW!VPQ?;tTOj+Mth> zJwHsP=Eb}~`I<2$o@nc(A0$pt&M4{bJzIWG4CA!pj71RJP7nHXzr;J5yEe{G%*mv< zn~b*9hGrKbt_b#cbYZM#9fi>=a-~JulnfgRNz5n3T5qJkytuN$N~Q(l;S@b#DY`0J zvK{!RR}HijF-Vbjp|hxUqaR}g3Tde&MaDSdwZMqeF3+cMzaY=yajWe#4G?PNCI$W5 zIOhk`Ad0sNFaO2{@Gw~mKVAzx2tWoe!bz7$W^nu!e^%;$Uph+M`$JQJ$wIc|E%~)| zFR%qn8<5+i2{NDxy~rRDiU2tcphFX+OMw)rHRu3Yf)LHWMJQgv6hWAm+s1*gcQkd^uXn@g7S6NDx3}{4--fN+A$b zem`r`g1nyGD`}@e5kgT@W%$UpW=w_qKuJ4F7BOK|{ftKm?LPzdq8+LBl%u4;$(vHX zahwaxvo6X%ix30d6i8S-KAGS?bBAH~*L*sq#(P)W?Jy%~cCc?OOv3o9qi@MhG!YTk zyUmaoxyNJ|zgkG9{s{s;RM zIwZW?@~ROc#ZYyLg6}KJU1?`QW`Fv^uFkOQ8`n?UVKM8H<Vy>UpZ@ zdg?X~*X-8tD-thG#m((9|LT=f_1zHBGl*9QObMw2IKh3l-gp|kK)!}p(T_4bfPso&%f#}scz$6J)dP2G0FS;IHr0%9wyxzD-?b#x)~B-ZK1n+W z$Me%}?UBM_e@@Jzj-&Ul=N-1$<>s?yv~=gv;)ZOU`Lh>5#+PNby0lV(EEm3al>4P{ z9Sm+^VDSKU@hLbF!P<$?p`yu_Q2jHEPf4I=xztqX$D5IN6q2`;ioYp4JAK#SF#f41o~SP603b9-*lm-4D^owuRSs?8wsyebDolZD@uG;&J{H9;wKY&O8bzMWq;$Sn|!L z-^M5OavI2_EUGuIjiB3O2LM5Pe-&1!lSrrz@L616@4+|gmPqJjM{o)%4DE1ApR*$# zS-{B`WD7m-iY_o`cO6fdl1xoRcb(~A>TN)Ow{kb(&ND$u)N|*GV~Z7L8_QX!^m>E$ zOA95#aqUA^&E~VK7jS@qs3eSC$a}@Iw=LMQ*eu-SCMzhH|IIc*T{9>Yd+<m~M`V~AK9`r=GVB^y0Qt$KeCw31`OFQibOcay!g1va%n*biuy7T3m`)X?{e|%RW zG@1FA?vcl-)z)SVTPDXXFS(Z!xfRx+R86cI?vi zqfw)-dvfoFUPwgVx>^z1Kelq|7vwRC>Y({Vmf{xgyfc_!@fsKio!Fmldp7=9y}CL% z*sFGKdc7^`!~)|P>P7gLq5bg5cfENkh(Nbk(TY_S|LfF~dyGXc`x_mApGAxo!*2!*}Xmle^bcsB%+bQLY$KxCCVH>i5@?$_&GrVPTac78vh=Zv@ydaLads37$In< zXrx%ouFl|2*qi%aVv)P02gOYA9C>#}B9{)7f%3avGamChG-?nL^Sin88fu4u>1c!V zGh8zgen%t4RoEv|w%(R@gn37`m4zkpbO0fqrrRs~@aZ>o?hu0&Sd^|(6L?Ig^?^7g z-~oUve0qzfLR@La+to1k;CB1hVh$(gpIezZWF9`{7FK8Ja zwMA3XPNb^~-qW$IB}j)<0r9h26f)0N8c;%?2LE*-*s@qo*a$kh%o&hN7EwtRv|>hI zOAI7MRUEQf-tv1&&< zseAWJ+1?R$lQ)E4>3Se;Lmn^8_Pr5w=33OOb8_O0_+x|dC=NTeUu|^u?H@7ag zq@IDPgg@zvf6`ZmrR-O@aqw!zwix%eB82Bo!b_sQW86xO+nZWN40h*zioWYvBPRXb z`*#S@`$(LW@vOs`MTO2TEVijRlai9u1k5CBxyxfSA9>fkfs*0@i5?{C8Mov;9;WQEm%3?)FiiuFjV z+QgXVpfzQvc^K%VuqMMZf`_8R*}>eK+_Wwk+Zsf{JZ8SUnh@rodA(Lgev$EPlHh;M zJ$M`6eGd7CtDVk_`-d~7gy^U<2b}4|BHF@(+oLYn7(&>NcPZ60885RbyM4=Stcv?+ zZNyZ6Mkkp2KufD6X^U=-`|3FxTKhR;7EqSE`%2$l?%4%jF2{-MihQM62?}hF`qAT; zGja6f2JMdHPq_8wHQK$cl%R%Ft{|eP!npz#NN~UI?*UMB_fvPiidAp!-Uvw#;d|ay zZDuc1(LoEkBe$Eq-aqa3tW&)lN;#7kzF^xwaC245zvIq*=j`N1EN#K;7wiRthMlGt zb?(03trpyIghC~lVpO?SU)=_J6;yMeWshC;_i4)%f$%gho>Npm9m=(c_+ZfW%IsD| z>+Fg!bKPh6+n^5P5$|r1Kly#QaWPt@{=SOPz`k7ZzL!;SgJixallj7|JN>2uZ&M{7 ztJZ{W6??9KRV^uu(%Us7?KXTyKt$Ex-~r^;gPhAUXBbhF2*oX&Og&Ygc#){+m=snprrRE z!yhP3rB1o}kX~M!xNeH)->JKKQ-{9G@W3iDW8*!Q;u;mQUe$5+dp#8quPU?$E~uN& zWxSut$ToARJ+!4Pp=b&}c#05tTKdMo;0Z$JDt5`ueE#&S5J{JEk-fcoSk<_eOX)5k zWS?#Sg1;bBIf|@yoP+L;hYrx4W5v>_w#nw&YgKI%`@@-%{JVrqlTk#1 zB$;v=8cT?;6$>u?YAE3`jq*}Vmz=`YqREk)$T3$9%xs@f1Z}CgPspzFJy{@yxTJVE zRlW;SlxTRv37#TvZryjY(Y@C4yG{h6W)rw0dV=mZ!=VvxfTW%_iooFm% zDv*Bp?u<|-@xq&_iPFA+GR%8An9DIaN)^^ z`(m#?^`YU(hn5@s8fB#=WsI5By?FIyPSnO5Gn5h#B-mT`XreT6v4fy~ z`PK;e_H9ii1HIQ5TQY_cf*q~1ip(S|ZMQ+Q%~>u&WfAo_4oH$eLtpzJ0sL+k^3%Qk zUvQY|F*?o3dk_)Q75*lqOJvXOeJy=BmL2o5GMf~|N@zcD>TX8I4 z#2hS}8J#?w{fcUr*%T({Ck`@Uk8{XxxSh2YO%bMtKTk!>Tw={&;!d{26%gLYoo-mf z7!&WlAGFBZx?ZM%(9>-`m+nLCdp}@c_K@Xr{JE!Z>X8iko`(5ptb5MeR^{ir5trFY zGu)cg>wTqKvK;r!H_F^;O;+@BTD`|ARsS4Q+2Wydg~FjyfW2LVA{>(Dd++4u=gvPzH38TFDbl)hG$i-`W9-f2q3*-I@v%#mWXKk> zn~-IQvJA5Cvsi{UBr_swg=8tzWZ%*dW0|p&?4`6Jq%cFWCCM66maO;hGw%C7=lq`6 zIp=x)7OQUb@?<-7+ zt2c43ALS6q zp~A`{+g@-I3cA-^=I)?lX$*87f4f+9(*A;cO4`6@NsHd@@g5yMFskYXYo;FA3l;Aw z=_yFFmWo$TRXA*tl&)3&<#Qo@H!%)qq)3yGcEJKpHT}BKW@`u($FZBa`V%YtwsO38h%Ex0{s(zF<|nU zW_@GOa4$tK!{R9S2RTJlgbw2kXqA9Ar747U^cF_uMfP<+lXoIw#e{`#jj_k>P8x4< zq~4E-cM39RxV!;&@dBN=ecz}1otY(|@^DLhtL zA-=hEeZ~4Xf*13Xl)x6dRVUAC%$DgtP6-BdS3BG)Rn`(9AYx2zwTyeq8@7N0V2mO(% z-;=toaPr!>cuTIlTCE&xOf-HYQ87|}fONW0BwOJpH8~ zuYQE=VGxe7afaArPtA51#_}F3l1*yP%82(Gfnbzb{LTZ_U@RZrW`g57Y`lT5$OFOl zDaLery7Ew`(g+XI^_Z`*0~`OTk5SPIcW>iX3kA!?Lfy#-8yCrB0iV6^)^;PiUBtgd zNcAkA#>)A@7ieVZzukiW?K|k;S~JvwGgQ3__S?8v2%Y+|uSQ_N8Ota!L6KC@52j-c zf1An?AoS2l_nF&=M>~)N0}G%ekS`+t>v9Ip{Toy0{To=IcPD|noI>P2rto*Cd!KqD z!wU2{bhtzWIPd_;Jt{#4qL~V0nGBTFN9JZmbQOvb0)V7+J2OpSu?4*6sMb3B8~cr7 zYdEz>Gb^@V7)2*kfhU2p`>+D|QW&QSG%f5_sL2GfA3+;F+)th4?P%GZ-b1S>8F09e z&WNKHkfkMUTEel+r2gqb*7#oLI`qZTm;DShq$dIR0@<{AdLMZ`JlYrwLjPIP_w#`mWq@wJi(y-THDUh>~N>trhX0y5P>srv4-o}pKONRTzQ+^TC z46};mi|Z>&NBq`{>=WxaU6H&tBm&}$u`J9`{-71BTg5Q9wQ)m*b5)=jjwb~th0S;X zk93O~LTXWBrgN-MX?Z07EaE{SxL~T5M<1rtZkSfO5XR8aUsQoE>m9|?(|Vva-QcMD zV9xxdJ6b}=d(P)7t)!qU5`|Jq4`Uvwyy`H4&T@ZZt*F!basV)S@nwwMJa{9Gg5ft> z(~nZ$i!u2zvT4)%XcrXG9Vz^H$#Nb@zQ;B zK{{su!Lnbg&0{TCAg7@%K*7K&5C1^`&V3xJHjLQ>S3A`SB;mpqH3|-y4~Fy2*{}^q zLXiZ7DOtXaP9ES4?Wf-qfJ5*fP>hN|6j+MEt)U`7u)zM8cKyE?3Y|(o@B72ko50&S z1hhhSjKUUl2Sy;jC+!;n0v!S?(E>%cn*-=86~PXqIoA8K1t86NtC>pQNC!HF^hkiX z?tA_jLwG5h{NdK#)eweW%t7h*G0!-98Pg7ZwImu?zz}}$W=bD|yGLG@lsPSb!&9X7 z*?7%zy|Z+etbKS1Z?%8v@W|087AGTu0`Ty`D?>*=*d@N#t~x8#Eg-i-e)#I8Yuaeq zU{=+Yac|#=%Ev>k1Lh2^i2mTQR>v04^Q)6uq7#9)~M*-5!w>Q-RnSW6w$ia0`5jTYB_c8z!vL^x>_iDlxi1B zTjw&8$dpA<63sP(et%*+>2@mvpBmYG*yZh`BXTrq>1w|M;aeDWkO-pTF|&6So9MQ{ zrXYOp7^a#pC@c;bBwlP5Fc`q6PlP;skUw2DY$oJ~ucUdN+%-1qJQhxN4d-&5dpC=Z zso_)!6@JDu1`8!z=m?Ua7K&WbOXz`DyIbb4=)NKu6BOhr$3UP;10OSA+<_v{?Is%D zC>pc!Br&_Exen~;8IP0*GEX_0SbKQ;{{<;e=MJo+o~eZquojOw`#phDlf(q~q&onn z#`iJ~gjGL<-K3q=4@f4Y|Cjg-TGRg>MUcKvMY9Ab5%&o-0K>2Q_cj450a!GE40oSf z18y16+4yQ{T@3ofzMvc@1Kq3@U2yex*$ipH2HsV+tT?GW#qgOX! zEvq~GisT*zZ3(4DZ~$ylN%Mhh7I#6K9<2}xLH2@109cT+{!fgI&RF>m=^;cDyjwuP z0fYrXx<4ZzU;Gy#Fp#qWkWm8Q*13Sn0F;mbsXj!PLIT^;zfS|AU^5`*iOr1nj6C67 zH56AmT|poyLwWG&=)2*7cF9ul$kI{uw9(a#IF=;*KoxTP^2m(cH<3=(JF;hf^lM*s zdml!0&6|{_n*G|OsC$+eb{^9SDne~i5z>R}Nrg+2VNo5I){0IGRy~0T6<#RLmn7bA zj=AR87xHuWksp(vEvck()kPkCYr%ib9pTj7r`R^|CF{%lx01C5YG6=T@stfqP~PR( z@v*}Akg(n383XXniq5p_4|!+&77_8^dYo$Sbjk~s%{Oa2qqs1Oxrd^J#TpJw-xKxq zjl9NR!@-Pz9rWrxI@4%TkF>kiX5Vc0#NV;(&dg0p^4+=FIzn@4J(rZ|S1NH-eiqDuZn}o+_z**UlQEBaFopvA{+aq!dQh%k=*i>y5Hg1y}2CUYo8I zXfsg1Bp6EYGSvs5`d#@#I3N{((8&bN0y=I+^pW$|ikI!qh7TLU=;hD+7% z-yYEh1va_+maO~P5oDit1Naq|h>m^k7p;!|Bi&Eb9>KlO$N7hTL055JDCVGV_2OOv z|IvNGodr0&)x!f`T<*9RhQfeU_QE%s(*uKgA9+ zNTmROgRWomQK73ZlkbpiUx3m*?`F6clR3=5Ud9S$E|4 zgXXG$^>y!0-H%E?vp}%4;OkBA?GC4G==OO2)P_H7!#<{xpZoba=>72Gwa==DnS6MK z=+x*l&v$_vxO`;%hSxBDLmhTMLy8{oSJRTmYG?M_}_gK|M*GP~R3!^aC6CX=KkSDA>3 z@G&_iMQ=mFx8{kvvw~}&q0kGiWu)n8J0ht(jo7TcscOeSKtS9GSXIOUluMP1UIr_E ztm(C97N4+>7WHqY*S;Wge|a99vni4yKw@(g1Ov@p#6}9KEhog?su%2T7Y$}&tw8hc zq&^jkOEJ47scBYB8;JU4RyjmdRB<}#S)S4{J@RA&@Oo>6KEMpM%GP_HGw7PKR-CkO zlS)c>{opy=&x=hqiU<153Oc`k-yNd>B9<^D(Wnjc@G+&L)gu4ewq5U?OJWqjgs1_+ zY?>WYpb5_3M4q9!5Dq{{$ioul7qg`+c4OgvX2x_b58#^o?+=gzd2tc{BNMXE;ee5U z#B=xhDMV>E-3|6PU(afNaa@g{D21YHJa5{smqfHW2iafHxHZ7D5o0CjGd5gv+$o}? z^{aUT{`AMB!3T@HTLZ$_57VPDe?jU@cjwR3zvNpQ4{h?^aP3&IO~gbz4Rjvx>@Lk$ zyClMAex1|0euQYdC~|dK_+u;R@@AF|)W>IQM$}dQ1!=Y1C12hB=2Vz_TSFoisU~&B z?ucg-Z4od8a4YkgORo&HHSXF!SXO}6h>sT!#zxOracQBBkcv4{_wQ9K|qPb(d{V&`#(|_jVYMkKlL>X=E_pLcOKqaMPEJ~!{yc+Y>y5FZhEQMu^===(druXYhJ^ecpQI0!DC z+oyq6*v(US_+Gq~lLefP*Oha5D}OdR*nb`-Ex7EvepUcg5*D z`+O17EwcG3yOb1}|7hdZoh@`a;c$lDpCXb9QZR?X%;XLRv^O!9e(rIHEw_{|kIh#~ zsE(wT_O=E(@50U~rkcZJ&7Eq+rinH;n2164=Kd0iGK%d_kDjzhq#clX)4jz3Aya1C zR+M^Q&I9xrgMsdsLr{`ua+_%HHzxR+V8Quk2(I`Qw2sk1%i`s8HycK8W!yTI9NC4A zk5=(wy6?!U_o$2si;c}~_@u^?&K~&@pnYlzX>MVj7;e#>con>lqG}7~+@^R8+Wr{_ zDK(5^cGX(DGA>W$Z5(NpPbJcUZ$kyr_YiSSQH z4N9%0l)p>#3)y@Pl)e)r!HXK^YfOyIm*S~Q^e3dgi7%b!Vv^H;mZP#=IY@E04(%JiwIR0+7!jz^NR-7XXjcp$bPzg?7=nA!79<0}o1*p5pS=VxXY( z!z#!F`+_w1L%aaE-LAWXE};LN|Ca{{;grbF^g!-L*RiqK1Fe&j zUPfrim++OvgFfLQNCpPHaD1nTfS(m53`QcxX!Pdd2?!CLmALi|P?^4U~&DHbg7vlO$ydqY%BF4(M9&CLFmq}Ce z&60u7-gCYBN_aF>IfOrjjjqqm_zSWVrg51oLAF{Vc3vTIJg%2^q@k&dd>}zcO#Op?Xq&-YGJ}o!~1G0s_J=$^k#9*Dq)lD}2uQr)egW9#&VI|^=%lo2+11lgoSwFUn!~-ef-d_*{ zd)$|m-6Mk~Jxjjl#*~UKehy3{Tx#k4VrVmdIvQsAET}ojy@3^XkK?mT&0XJRq;p(2 zd-V5jM_H7!0pwUiQ-4Rb=s(Gvo1wYCP4x)Y&=8*}!|lIM<$LI~7bKlX+W zdTj7$&)nHtG+FA`oY98&hjAD}b1>N=2ddA17ePG}t|`V@s~&c}gnF`}(fgKgmlq04 zj6_HAKT3Brj7np7+dspiT7 z2+85yOYa=-)!2|7VHbtKWe zT!W=)f|&bv1q#+gNLC>f=wSD4Z;Zia`XDx326DzBo95n6mdr9fmZAIrXU^u{BQWFh zE%Ch?EF|rw2S&xhR%8v;?j=;5L$lF-SG+c7?VJAgU6K;2=b zI90evL&T1m)B7}X`}P8s$9ZF??GM#Z9TegvhJcETU{z2B=gBIl+JKHKD08}MFiW?- z|3}x0o;T9}{{KGd`_E)g2^1$UEsDc8KFvA89&LO%PlmJD(;Tu>A0O5|u7b&Y#;Ti* zQ$0Lv(|@=kq@)_58fcf-h&KXmB1Vq0LywkU4Y~?WM zL+s%5OAFF2v>(@_{0OR1H!~AO_Zok%*2Sv^d>N&*JZai)5~H~~T(OKDlRH|v9&T-L zdsMgvw~?S+nAzrIx_kXA20C$j7C%mY`(_Tka4SwHVd$u@!~zW?6f}4J){kgd5lY8Y z-rvEbSY?kNer(iZ5NRZ~(Pl(XlxWm1mZy9!K-Np#nBTQx-A)c%Qe7$=AJ46yFJN-LBVb_>sViH1>2EHTRMIvy$WX zDDb+*AZODzihRw1?DgvPauu@=UvImv&bntL#~;F5hHWmQJUraT3y7C+9#=O8Y3<6YMsaEQ>Xriv#6gER0MmOrOiC%r7)%YGs&QZr=67GL z-6FJEbex$Sd8+6#lpfx%qP1xAB3&_zVQRoAPv`&2EzX>9J_~ozCUB zXYlcl!;N{p`h2h+y*p(~DknGdC;HaIUEU_CnE4%eS5a$z`>dS6`?(W!vr9j}HZ)cu zg@uGpoD_Rq(iR@f{<_P5*~Z6WrJXZt3wb=N%+Z^7?kx9x@ZUYKRuz_OzHnA7o_vK* zclN@4n!T|B=^bGc!7M&^b_nt!nq6#b=_g5KKE2pKDzcl4&-jV-}y9nk!D{U(edLv z_EOvX2h#9Jk5JU=UywgL_ZN(~DGh}{|BZgI%u{)m#@5w}C670gn@4!=P#+z9iw@R6 zp4J>an9Oo=F?Aa$(wsyp4zjpER2wXjD9MIYb*`KCbkEc-(oh;Di%5O|zJ_9#e^y{e zXc6Du@A2RD4hpahw6x5+qRRInK)&U%ns%z1S}3816Fns={DgR?OU3UC)??J@q6%{Z zD~m(<)e?(&lU{Z7oa;gB(AWF~Wfg6F`I6TMm}OXqvPj~Q<{~EEa}L9|W$RZL^|U^0 z>UoMM7aK4ln(RLYIxL#9rZ_0c*ko{^yUl>&*GCJD5;)pAx z&3iEbiJy{z;!DmGSV-Wz(zOz+AGZ8r=Gt((V~bKMQ&cZ7(Lk6kx!$*UVkV0cEmHYM zY3)u4*GiyUpnV2PR`8%B^e6@{0K`D{RVbj308xlnSWQ6irnEWU*f?%F8UX82rL7$` zW)ix3Om$*SR5-AaU*u>)Q~2P*4=?xJ^gDXIAMoz>ueC~5tyn;x4@$nuR($2?{-__HsO zF9=l9s4ey9C!x`^+ys{eDvsk4h1)w)zss)?{Y`lkM1%MxTFx8U9O<6*YVvZ0xaFv$ zW47qPc`PY!3?AzWt+(Aa(0_`HsN>s?je20LWWU!7Uf}#9|K3-U^0|t8tEJ?JkDL+i z4iR;Z+p!O}%_Ev{qa6A}wV|4^bZN7Uhk?mySy&tqae^B3d`ba@fJ_qCAzi(cOi*Pk51E$6*} z4bWJ<-39zp2Fn3q9mv4NhwtsaL1)}cUqbD@N!tr0=syO!z1)JTi2pe1_}(N&|HnzN z7XVLtZz4A5^JCG?~8XE>f@WJt*W z&+Q`zAI!nx)(ay1`u2CaDxWI=ga`T)$?fm;A0+^%-muc0Hb1ShFGEkjg~XJ%(%+{; zezNr;KULy&f$5X$ieG*YcKPy@Kkh?j%e!NMt_yixejv;LL z!MpPP+c27HTZF!X{5ExC&3LN&iIO5s96HBSL~4P z3lL1_BVafe>sie!Ph0Dl#${)&t`;5OuT&Ja(rGzST!|~&xBk^jjgBSO`|4lElnpfP z4i&x1M3VUrqYH`*sWEg1IneS%l|V{{i%P~LrLMN3j+K3XGN2|5@u2>$Lksn2x-rK= zd%buiKr>XsO|Z6;N%LWIlDDHgeVEa z#z28US{QN*7iiU^1%z(GAi&`$x@P#3B#tKz!GA%<#Ib#;waa_+R6}_Htzp>z#RjeH z>876bTpgntswJ1VW0MI%|1%syheZB<05GKY2td4z1pbb&`;nFf8mtAq)5~RU)DRi! zL2VKx8pAuqb2uQk0_|V8PT1Yywzg=JiXuSby4&QF;Oh&7+Hl{7M1sh*?_3CI7X+rB ze4|+B&MGAU7dbIAm@Al@A(L?D!4tJ(7?^sG$w~_!)ISz=8xhAURjDIN%WOypmwop~ z!Xs_C{C&00>9-v+Hr(=z7mZa#Rf?%}r7{ITnhuJjBPSWvMobR$K#Yu!b5)q;10hu= zxi-?(MoJEHyT{~>H}9-JxYVFoP4ATh<>B9R)_`PRYuJ(fwj%z^y8k&buYu?42xuwZ z<-W7hyRqovLhjfCz)37SAXg88VqO(LNgD6E8-Adq%7>FfB=l+SL@zV+&sQ98&IK5^ zIXU`(viKEuz2g2V5ffGRTYciL-)Oz8;n2;A8{$`Pvu)BE)~)@8l24W0PV{1Y&W~H& z%0+%+~l3+zLlcMS(4(@)2co$#(L?NdAP7aHUrYf|rukG%mjU5;Lk-w_|7NY0_Uv zpOwVlQu|`Skgc@Rx^9ich8^y>(sa(HxzxO5PQGc$45!eN(sq(LxZqpUZ%3))bpfzg z`3`tCZ$*6TIKMTz41cpp^OOQBYxWw6%SlY>3!DI(ZEj>@#8mmc zjhM;4Rrf`vbtW6dMBc`gDN8rE(tkO!-P_-f$n!n5J>yYS-PH#-3hy#cnJ zRcP$5(cokUdy^lPR=q_TCUqyohW*8Fm2@P#EIuMy0jvN!$v zKtyd1cmqA+o?s2?KJ0Z+xP5N~EGsN)fNhvr@Wi^V_4o2te|YNo&5d0z{)D6k7kY#* zTxeQKAug_h*J>i zc5u`DUl6j~dQ3Gq+z{=_EcijUwA@>3qJ4ZI zMl#87ZQNTaI=N04NL1I1MtlU9Jsi243E*9@KCjF}S~h;>#z(;L<1cv>BVdK=&VNCg zL1_VeMP?rFdNFR{4;>Hxwuzwy2XhwRcFJ>a7ES3GtPASAe#TALu2=0lJ@8$_DKL;p z%8H{Ko(x>T!J7*>c!$3+Gd}e{m6rei z{aHumKv7GVGpW!UbEF)*8vugkwCXb;AsHqn&}XLlYbJ>bkyGWF*A@fi6I4#8hB9EF z4po^EeOEblSHz)^!GqE~C4XJ0?tUa1%H zn5zG~KT@)x?y#XJ(N_6bdl>Oq@hhI;Gs%`MkO21S^6{18;h60v5U-N*8vJ*u#0!X$ zC$1Tn*_*XxD>`uAstTM_or!9vXb$VICqu4l(yTHyJi9Cng6?zLIOPfwA#qknVkC;j z$c2!?RdIT$Sqe9M{{=Y~yHzjyAgS@4?S&x{^R`l1Yx*a)_j515X)ukzuN$)JnhEi% zn_q02R#4Bw$~0MK4>?04*+u&W=M*OzlPi9^_cHVtUH4uOs7QEmQdC$&Dtj()0XZ5- z8QHZ~<$c57m?@0AEB6OcFi$&kU;63`%~`xd?C|F!A31-id|<w`Mlndn0|RjZr~ey~a~I&HUZb6`NQTXVgpPBzwopX&y*_Xxxe!+dWw@!@Om&G+;+@z=njGl&c=_?8 zCA%svpf;l0D9WZGBcFPdD)ePMinD*9KVU{ug?kczT9UiqPLLx0-NWidtj=Oe2qXw! zT->;I(`Y>MUW;}<-_?>Ic}G?hCYH!81InrMXlE6sL#(hDc~a)3XWj=`P7#gZ zGWRY#&HXjA#JYK8yZwo>uXOW6a`IGOf5WAW6PJnYfw7!7DXZ%hA(i6?u-dGGcFdNq zSgXo260V7Qmfb18Cn933wOzbggftR%{PBf+^23Ae)rs5i7w5u|O+Pezx%DpNYdC8T zpFEAZb~kZ=?>N&dN>+tW*)btI_CnCt405MQU$UQ7nBXx$fKb*^&m4v-k&F~% zQH|4(D4EhCv3vTIqu+SYs4wO{c$XsZ7p$)exi_trI~UnOA@W7c1l(tel3wHy4X!s| zVc7D3&sXf2oeSaiW=!yc)STOj@{BYic9;eJCm81XFCPb%PiPkLR9!85 zntrL^Fhf_bx&?tSXs_|ad|rEtRtMn#?KzOQYUt2>5QpBWI}a051TQXNZPCl9o7@U_ z-xU!4si}cAFyIRqLs-j4!-sQL%YN?;8y=_sasLkwhFb(c*Qv9UhjS{ZTg#@wBmLp& zk8oi~2&sRaQbS>~h7oKixmqNa(jUIV{XP@ENR_TILKO}{;yO|1B(?c?_S4-Q8T7L+}z0HVO4J32XOe4*)elpQeMV3MnE5}0(2Up`xpO$W()X8&E^!-i_m z8R%b-hAS^l!dm!p#4W0=@sN6@p7;QfyOl%TIgz1Em=o1|eK(ceS=gC`)=Ne`cxE_|(-H}sz)YzP5Rp8_H-9#!amr@Jn<~clYJK&+1ooXY9?i(8( zc_+r6t=oM~Y`~D(sLymS-I;%T1kM=fQMcgQZ19ipyRy9?qm(*P_MO7qZd>k>i z8A=PXV;RitGHU*M$#**xrL0_dgZWTLJ;O&0PG0ygW~Vb z@oIrEaZFOhF2HfT^t7)u@p7o4Mo|m(Qt~qw^X5cb4UF%x`*!B}CcLE|`a{Z^3L+Ih zo_rMaTiG$tBMj4h|LxN#ows@cD^1rc{&eum7a>Ij8m=hqEMS;}d)%4M3S`bJCNq5m zuHNoC+=<+C3|%cr$|yN{(V~y zw(fDrhmB3t=0Lg9Nx{@x&ok@%qoS;EydA=4qU^BE0sArjg$jA7U*}5>J>a08i z%NuLJv8lra6>w^sV$ej`YOt9}oFRdan3CJ)YCw)f=)ZF(U!kTmuA`>cue8YYqCx z+^nhKIiNqNUL-cp2YyWOflD7;eo>a*Nge$|I@75+exI1O=o-LYvf(q~Pq2HL>-D%( zAlP^H=gW<<3f530XJTw}cSxZIWA_ks!;bl35xj@SN@Bi2!FG3p-A*POzfA8Z%k>F8g9uBUX^m0E zG0QTep`skQOw+i)@_<9pb?mXnwJ+T<%aX`J$Jqwl>5w!twJRpx2q3Bq`#1l@bLn=C zo7Sy?)h9)0R5IFWy*%Rcdo7&1 z!eQc@KH@W$H?MylG5c~O-ZT5MaC_{${jcgVF-p|k!NUjcobIg=S^#{gQ~ z$<(~KBQapeE-hA2JuFjk-Mryj*bIpuxsraiOO5Tl7o;KXL%QWtD~`XRr!sY0yUk1 zQ&po;iS-;B8P5~m8qS(epI|yV$Kb%FT^!@V_qO?mONvdNMJoH51VtC~m#-Eu6-wBp z35l5_Ie|!3cPb7i{|8<#5o(6#}%cNkS~F`r+F-j?xo-JRUSswtCjD}Kj&9efyc>3 zp)Z#UrqsnjFy+?-0!uG3i>;~28^l1n?~LaJLtSrDnzSK_=@_3=S5FOHUOvHEF#x8$ z=iur%jpzg3L1DIUM-K+lzs&CiA93dzl4{cpD;~JH(jWZ}bzZmr>atPCuE< zqHC>|!v#4F_e>?ua9BeOq;Ye$PlGtvQ@VcJOzIn{s7B6aBJ@~$*=&T;F6%* z@(jY$E3HY8em(ta! z@^HtVF0xpID{m)E#u~wYb@I1T;;Cv$3YGl3@`!%O4frqhHq>MN%g%+7!| zoytEDX!8F_9{#V}0vq;33l_;3cWbf^ohk{IfPEgxp*qi00F?kDOeK>@Jd&pcW~dO~ zG#$k;GYya2rV?g|jN%p-INBeXL8*~Ns#CUx6xxw5Lb~gA6 zyEU>~)!kp=)*?xz#cFQZW(6MF7E!V{iVrJjqf$^E8?eIgZ|L~X<=Qo^S9L~3LU_iJ zT0O?sgP9$oKlD9}(hlJX{Qyaea&V7AbfcvE8@wVOqg@a47D@Td!?d_EqSPy@mGE;;y4QRskTD95gA$ty?(Wit9?ML0aW++~~?pE@_QQw<` zAQQPe=+JPQ-C3L3!-wtADZ@ns@8irki4^j~2TW2TV4PGT$x}$KQdMB_#VhxKC!5pm zxmpupgW*&6l}4W&>#98ryQ+NHza6hI!G7|D1*>7PH`8n&7MneMwtCnhKzf+L@bus% z_*&6hys^J`m}lmOja#ZR?@BK0`Fl;f*EgTth8I&RLY)GsiCqNPu&MTPWL^-MO_!g)W~T2IRpBhI3mZ+#*vPaV7{*d0Jy;*h?!{#@9$ zt3s5UMT=@y+FaluVv1Kaw`MwGo7VYE6%273tiNbxVUc)Rc$7^-99w6|`_9gM_PD0C zLG5Ei_@AjMQ=d=687SY zbTKq0%S}zO?IokeSbXqwxsG-x6Twl)^MF;2uM{z%%1qkr5nh!W_ADuD7w_TCA260f zF@J1ofVFfE#ph`!)#EEAWtzSs0cRQ|ea%n1jB4F95mZFH@)O2uc7VkqiopsO#I&5#ohE!p`(BEqeQ9UGQku2;Z zL^{Aw%w#v6BOEDHKooueGOvHAW1f)$sqy`ukxXV@vROR{_I9H6F%Zm(sOF>r_0tb7 zJ`?PmLkP?n8$i20aS2{YAl-IQMbPO#AR?#NfoYQFC$}=UP%kMq`axa{K20%rY@(Rt zd9q$42l*CRNbX!&NO`^J+_Ygg81>erm8#+28{do1eV{yxRUhDTg+pQs1Cbhr(~*+5 z>P_v#Gk@S0f-4r!@97F>#V6JASm^aFV&>*!o?;H0&urVzY@=>wQq(eZdRgwIg_Odc zw~m+2((^4&BRlK|{*wGmEb zW4(52tg^X~fymQ7jFiS0EYzo2`Ww6xWBnPkU5=>Gy*06gI(aB` zFkN5;t}QVmR&QT$_AMl|-?Jw1HhKwr@9AKjfdAcBet~Oc$hW!f7evFot{Su}rTiUB zT^t%};6f5J3r@dE4yznxC{Lsy9mKDwt;uvBf~=9LXMFq{tbh^!UT&qpEPCo%&*=k# z>2<&PV%yt4_Qxiq#UYEwAKlUWJ4kw_9kvX@bO=`FU%a|Y-J}f_c_0T{hm?SAbHpjV zSM+_or-h&n|L!{fV>@Cg??aSRM@g0bfbiHhOY4U13`XO$mV2!yB0zU8f9PfTATVx@ zLBFhAJoQ0HG3B$3*&3yfy~9b+@|lk3qkswJaUe1hEPC#B)2x#;m2LGthP>-6{{3sFng-9k&dWlL*Oy2Pmx9qY23l-w3|ESb`ann*ObwB$|&oU}%uzZb_5=#4N)HJnP6n(fuj_hg&c}a3lzi<7k)vI@pZjFAF#2(b=T+C*Xo z4I~7IaJsHqYNX5;%cuE0%JYy1!6Ic!G+)wz>&UAm8%WPc=@VA6Aiq#I2Mrqsf5Tr* zAGBoaOtJ6f)F023euT3J{kZtd(LME49-g{!lApCVf=l7UWv5XNx{f{NeGwx5X! zrD|lC$hsZoF2k?2M0*EC*!QULC-E~8b8RvljCv%5+iUBS{;X--s;y7Ee{qdssfxZ- z)+wn`wz9i|vQcX;77V$Z1-1R^1k> zwzW-cIpHDKv4YpaH6m_hrKOlMOOrc+7tp!>8V2Wzc+9TLguq&s%%-Tn(|Sz($kc;0 z6vJIfxs5o+Y^4d#Gp3BCT~8R^NuUjEa6_41ii@9Qi>}z{1%G^QKW@q&I{G!F2(JF) zN9+7h)GS^h)v(EfZPXzWZ)*3N=w6e3bR$Kq?Y`nEzTy0P_hgb#odrw!%5J*2$GP~2 z4^a4FwA0UaGM`Jelu!k2iX+_kbIZkm(T%WJ+Rl8XjFOUbnYonV$35M)i#_xiBF`@G zksP31HwP!yD!Q=W1A;V)8~*{(<@yT93eFs0J(LX z`+OgAMMTH_f#K3Jg)ljc5WH8kZw@<%t#@=J!mK{dVSFd_b^PSz@EPjRBL z#CnfaBYT%U?U1+jyFODRSUS44op>Tt!6-;scj0+^yH#M!|jBkY~&eFfmXVO9{{!Dg+KDX^hoZMN2(z@P}oATj0DLf z)h1nAJhS1`mV3tKsHcg>*f#q-&5cs|+0b5=OYR<{ru-96bUX`t4*lWJahSJm^JkU|1JfjP!eqjfLb@8EeF!SH+i4$Z`=YVDW zKiSfMYeWC9q=4~T4#yoaylF{okGaR4oqGP$I;gPTV>n7C5e$j|z4&7jZkbsyW0HGh z>ESGx$590?9($yGkpVJN)$B2Z799hjK1DKA_?uOBXmI{6TN%&iOTEDwsr=RH0wHG6 z?pF&+z+qKG@_iV={qaDf{UEtrp#VV_622mj*-s}E5%x6InVDfy{LX;Ph;J6ne6XS? z` zGfulj1l>Z{6=bpVMm*Jr*^z=6f&2qFj01sGL1s2kxbKey0m91*C%#%n&4GsB3FxEQ zHnqt~5vQF_7cW4M;BoQ!Lvk8!>UGhlk*><0 z-p!5@nEUL%8m$$2wL^+)DANx$`JoJ02eu8ZRgIiem>%7`*U!5OdmXHcF(nlvF_Ev? zNM(&A#w?~v7Y&CWhgaMO)A+>6jXO6Lm@-^%1^W@oDN?a{Y~L9IHwXIbC5>^8$L%0I z*oFm6mJgow*o1q%p0x5y6i-i-08PRh|y%muGxLumbW!1st7#L!t|9)D56_?3mi* zOJ2bzXpkLy0)qCVm&xCffW<;Q<=gbqppf@Sx1u%?FGk(E7(7w|m`=3GL+9<}8AuM! ziRJ>f$F&_gJILNqPASh6f5lw!`27)k=;5&s(;t9gX1|)kOs4xhP8Gq2yZWm|u1qwE ze6AurLiW4#V((x+oKqgy%QM)$*D9SC0_=)Q$0Ppi$u+2AF^?|&)?9X|RFgmSa1w}5 zdl@iSzkT5jOT-VDN^~WAF&@19`xrBzjV4z*)ajjl^EOm0w@ zaQpMq6iQV3PDWuTHZvZ>e!mlYUIw>n2Vp%$hpp(Odae@LITSJaTzVu(At)06G?@Q4 zRExpWsK?N|?CQbxFTVg)c;g)<;mpYpI76)r8pT*O!C{k>aX_WnRye-hgM zg6P`(eRluK-rxQT_m4+^6$0id6iu}bfs^^R8^^5`90K<(#CCQO zd$R_ta_Hi|4a?@HpNQT;P|=YuOHuOlA@Jl0Sc@8zZeD^Tm1FeWIn_fzObqM+5<#G% z-wE>Cn>DJk>gX`mS40kTaM15~PHlG-9JJ`~tbs2tKglIU^It3PH?)f%?mGnRQTy9R zCAdz}?_J1;QvaJe$59)Pxy7*kR885s%v6#}L}f_!@x7=c_ZSE`>ed$~SSVZ^n$jh(gm1;BV zwx1i~op>eGRDKA!fO;^>X<~%CpyJE59TSQ!Ka;6Sv7s z9M+=z9swbpQ`LdJZ##OmtxCXWcZJtlq?#nWrpIU6zD~e{DpydW;e?|%+c)&bfBPWq zV-L3DxLvq$QdXj>YWf6w;*7>o5-WA0Lpo|t_TXpXyP8>ECy4$%7v?oqNi?lGlzHd9 z%N54jkdor^xhW{qq5{=o{*NXd-e58QTUWFUul};&LCh@m?voqUiezCmUg&FUk(S)C zmizI^<-jHzob2XrW(oW68o|jvIWM90p*USwbjF(Tmj&;i3!QSn@b+gy_0bp1rM}t_ zRcqkKkmG@kEm*kmM;y3l%JfG7A*_%`0fsgRgW3i8fI^$!P!hO*zCU3n2m~;r%AKTy zMyaSw>^bfuAfi1gW0=#XJXepHk}@mzbNJpP=SW%;^Duj3vJs!8Lqz_5QHy%c7B4Q8 z8|`^HCic<-hPYt}nqn$F1x5Zb$3Q^mck6mVoDRQ2E_A{Nswd@qBL##Vh+&~%JKi$E zU6^xmo)D!~3H#ZX$Dbrg-;}acOutj$&+`u~l5BC?)dh7_p3hZh%Rx#XDL_wL9 z>=`0tn*c%d9$^%y`)hlIxjhOLUEChodz;zr*#~zy`u{!eI*YoyR5Wg2!)OgP+8<)3QL0qmSK0KNwh;kL{aVu((bILW1Wf#Zuw^)4l7=A+o z!r|g^zn+7c7#-rb9V6mdLPfOrP>*OlDgkH?(`(uLD#1q}s$HvtOf|F6%}KKdSD~_@-+u4x!k1MuyEOcj=m7GFyNC zSC#FIR@EW0Qn)9_+E`vP8(VT=H3w7*+cAo1qss0EZYqN$iYA4 z&{-gt5#Jd9VA_Z#f#3XGD5BfYT7RF<@HZDCP55;kJo;v1!0IS?y3YaS@M;$N-HZFh!0Ux39@2!UaZ@09#_}^Te|FbLg ze@q8$fc`Z0`Rhqu@V`*;KQ{EQ{%eDQzw!&E9-?TL>2sxy zqlzozb5$4(b#P1_G<`|UqUK#h6ugaig>RH0zuTn`qnex_sR$F=-E z3v)qIWRP~v=d_>Uk_ziz{rYo3{srRVR{?$N#H-!*xKB$0o3 zEBlXigXza%-Tyoz|HD)J@0q&)Q0L$4|1aJJt=-N9`mz_Qi{4Faf$?)#zgZcysB~l$ zRhhIlu>2_gc7cfiGgtdSHEkB< zqE$wFCZ){HO_C&M&!uu)*UkIRY)aKr^b=ZqIQD{Dr-VK__QBfSXP8z=aSOM?dKM1$ zysQi;n{jVi;v|YGIw~HPNJ-zJ7Fq*J_qy)POYBuN}mh&;46W zp-jRhuY=;b5M>6zp8jxc53>bvReI}pdJ1}MKLrTA_3>foD}>ZlZ!cki^>T&y9+lHA zVw;m!1uZmcF)48^K4^r=5XF5UdJ3AwcQ>=xqqO4*wMS8ted-T3KWVyxjiBUC+clE* zk#K>>x()TDmMfhs&$2}&!y&EjQ%AO`AvU@<{nh0ttBZ1I;1;w&Zb@&WFzIv zft@Jq(+p2fWGdRtom83nOWCa;_+DQ;9U zTK9$&l;|VMCf=3COvvxIKHxDpVWMO5eHAvqEn=RXmF}3VXO=@#!O+bwZy)qL2~*US zb#r5?)!8oj(|AS^_T86ZFJ?psKj^7et#pqGW1_#R-*7XSoY=3zao348xywt8-&tgv z_eAu$tvvq6%<%JBkl2(PrCyAaI{}^UWoVS_#XbYdd#u}!0=f3fr<^mdKGXV2wX8}` zD$mi{09VrE!3s3pLtZAT>3`enMK3M0&CTpsgrCpWOkvcNrj8hj$jr+d(=W29?nTHa z&Uw=p_!%RLQ;386CD5j+by~08(mU=(3J_Ko{-k3fts@d>|#?kqsAeRNDpmC6=B z!MqK#B?`cH)+VexeTDj@jbX1aS*)~n1G$2n6dbl9pmJ#zh>r>U< zer`*=A1P67`lk4Va)?}+8X!nkC|i(2lfc*`e8y19NP=6O^yYLKZkfRhThh6qKvH!A zCVj0H@$(xi(T~MeA6{2=FvQ*XVO?u4C&Yj<{s}z5x*YEuiXY$!GvU^LRQUI%D)P6lkbi3sS<$5a_KjM3xJc%l+s1m**#=l$XQZ|=RQBf zW+`0Iy>YB>hmu>2TXgMhv6nLXpi^{%auOxGlF$_{9CX+G!a!cI_4C)kj(B7DQG{b< zvO$>ddd1MN7Y#@w`INU4HeTH=_+%>o>CAxU8MYe>7r|@Zeos+&MObIZ`AcbJxsESF zp}FNDHnla*G0QlA$*U726R^qB6<;`KXMdY3S>~SqWKFT+yhhOZCmzL$fJafhTDr8K z9E_c^N~$P1q{m2((j=Qa%-?kNiM*As+glM{*@$;>fM|V@zErY6er%E@kzgE)DS$t4 z%zq@qb#TLXO18A@YKPgcJ2NZ1ywBg=@X$ldQYo)I*vvWEa78%9&9EWf`jKMFi>)x9 z>x>K^sqXB+0%H)f^xQ*-fP6nFl1K1-zmu!#&zaF0p2*9bE%|D%%D~O@?Wsbey zMS{JPsR(Xdc^dazhkBV2?e8$e0A`XvSklZup`Sx3Q=|gSGrOS2-t54%Pg^-{8Gmtf29va$CnHs8Itg@`JI zv;uZ3x7?&HbzIl@A32>+po3`nJub>~i89Qniw$p&GVrK?cwE+_I*~|*)(>+NLyKI8 zM+U+A1$K06KMRs+Tzem~cV#_R^MMBg?$xA?wJi>v78UH8y&|x=YqCcz`~7x{!Se~1 zz~Ze^JT>SZQh!QfLxqW!er~6toca(5@xO|ZxvMteJ=wW1uIc^y+^f))fU1U@tb5{2 z+YKL)Kz-<~QDlUt(*rMM-j$pA0~~^5Q^s$p^7vB*&?0XLt{DF>k~=W9*@O}tF@{vF z+C@?p54xCNG_bO=lJ1`PJhJQ^k+Hv}^i;8Lc^hWj@mXotQ*OG3FODzHG4ATCSOCgu zNjYd#-DpD@a0PH(#wa@t&Sh|lv)LAx;%O&uw0U@>-%9dszOz92yi5j*7yf>8R>8|F zr*MkCa%BX=;~@7SeTc-RMMfWvN@8M3R;SAMM|JxXpXBF#YSSW(=$y+eUgln^Bcdzk zc+X-}S|++3K!naZNCj3xs8_a_aFY$HwPtxUq|Yy>`Fj>xLdSF}6gX!&#<)Ovq6)KL z+;!Uzfufyx3f7^^+uDCZoP@Y-d7u#)=Oc;4=PvBE<( zTblKn;ffZS^33`HWzo-b?QuAZRcGnj+gOWUUk3g=TmlMTJ3@I;$ zQ&Vsr5{+Z|mq(Cy8baq^)ljrYmuvPKClq+NlBg$nz1eF3N5YgF*I+Y2c|cgMCKz2o zj-M?iqu+6r&#YGiz(cNsrt-YNot;BqYdJcuVcX)Fu*{ox)feY|TAX&N8cVFT?uZZG z?#0^@9TUD<^u0#Me;%`YXeVa847x&;Y|)22)0|G5!R=`o>mRhF97M`+gZ?aRa(^nV z62fd`cCtl7gG$&&-oe4`-#3*rVi({t+AcKCuA>0PD0DeG{kim3oz(=c%R)7=$eY5W z^WR2Ba(>`JDNH;NzEXLWM%reGb)%=2;#EfRd&P!|;CQw8qMG^Pbx9Q7X`m_x%6 z+EZ*F+O>i9XIgdP?6)hNaSh*n6Wu>26%pT`!PQ@gUG*=c`Z%Djs2aw!hOhuKN8Bu1 z0xz+%wVgg)`xOQT=tFe$gC^ou?VDv?K+BM*sHnfmU{1z|`asEe)RGYwNOHZ($q*s_ zI>l}}K`V+zY@SSc$XC*5S7oDza;MJRSr7o+tR6hjOQF-rcbUg$`MyV$B7h;zbJmJ>nVZ?OydZF;`_U`zM(uBXbnXj2d9K`sP-8WT=yTb}8ew0tpvz_NZ zwTCH;bP@YE3tE4lNsrE@|Lo^rsXo)PO=lRH`gI054u*F9Adz@{TnZFMAHn&Mu#5V(1FYrm%NA-w-nGJV5|NtRN8i&Dsy?8P7& zszYthIBs=DvHtdKCOQ)Tz5^-wpb)XlE1RHLl`2{v4^I#jN7I`ApRO4ny$5LZ(0;wX|;qfcUM28QF+^Y=eK>5hzmJFqmJcgI( zxkl1n#j32dZL!ndcxE0v)M^ihb_LONhePf904@r^U_j~+s2s;+fZp;adACb@tBFyz zb?KVUPTl~dwj7xrE-^jIo2;fv{iG)Bs5UW=lLLNWtj1fx$qbpz*bEvY%YHT-FScx0v ziC3|=>R-$Dj;)sgyX0<4 zKXEIvS}GFpTAhsae$CUthbcbU12}1wpExTbQkZVs$MS*YLISE2K5u1}ILgFXqYwhi z0Q}era_H_JIJ!*>ymig@W0;w<8m_ANpvmn5?)~0FEs#LVsNrn=;26V0MyIcSOQvW` zmLU#O!%+1E^6b7-J&*mNt!`&_RJb6+*{c#xIS9r^y6c2B>6F5zH>f&g6@X(Su$y#J$>XszhT=b0KYS=2YQyjv{^s?u;8*x2hQO~vSSSMNZcXtO~~|1 zz>f8uRyc@K#=}E3PrYBA5}*TJZl{vyT!-mFCe2P?-ISL8CE_Sc#-IB&6mr)BXzMpG z^W$2Js}1COJOA{hTc>pW1g`0vc}5NB;H6d#Fbaiq_En7Kv9onp6nxtdsqb}!)SSPa zdp;8Cjs#054H^tl3jvMf@#rGLPb~@UMQYTfBNlYbD6xM%c31Zm(rngS3GF#@1$)o% zZJPs-&{PV#)L%{AaE&Ek#Os^iruwlLmv05sMVEbt&js_J^)UrtlYm3G&K@X>+f@p`X~^PJYvP+-fNhALz!OekwTm(hzKwnIwhS2*+GtZ$<>VNZWSRj+Eym zyT)El;*9nz_Xs2#0O4DDZ%HKQv}Im!GL0wM8nO(v9FTswgv!#&rG)FbewiN#^6;8B zv@I))&GPAA8MAI?_EcaummJB2Dd%>P@6-Ta+&QGjV@!Q5jN-IM2wF&}#1?ocw~s9>h~5&u74iOQ%D?%762SoOB<;88f(%7Y^Wi#96E6p9@XM*gaLLo z#}FEdvX_!7)8RsHm&x?285aCv0~PLOqNW9%NU1xRpYnP(qi^@Cu!o()1eIdlR2g+! z$E8hM47+K5*o+s8=H!0p@iJ6l-(@MT8FZu*$8Xex>Zz5wt@rQ;rr)Q2SVxbi8U_K8 zZ`4G6yu|HgqCbfb1X|Ml+=R9)mG0q$V)>;A%ll+QhAJ#&-yI@bEF6U}CvdMtu=r~M z(bI0Lr@CJI!0JGAx=wjwjglG4agj0q{m=_q*&CIz={HzTE^U?3kn~ac1HSUGT#8iP zfsfwXjGP^N@*|NReUcP=S3Y#MPn5X}l2Nxji!$#h`oyr!N%d?mjDBbPH=#%m7rJtA zTWOS;QD%?aZrFKr6}jK{8P!+dVPtog3TPgDnTa<`F?7|v1jpvqp_S%klrGeGqg-P* z;uS_fbCzVjj%ZFw7#q*1K=IfFRvrtfPM=r#nJAgyzEYG!m6@DAfHEOZVFx1;Ky`*^ zsw7eevPAr(Qc14TS_sXgwHOP=I?dfBLgfhoBXcoWoDjM8czysIX&n^^D^%jZ z=8=THxo^gA$e*;Mi~5J=N@rP@U=Ec<*+UTW%$wuE_*S{_SG`V=QwEq6pC9~&iNhGx z`S45gBbm;ZzKrYeqr%O-Da`se302XVut`OfZ}yS}=*k*cuvz%7#QQc=)5*yhV6hrr z-1@?wWc+;_sA>yU8hVx4jErE-&#A_PG-4?Skf#EA zkRv+QsW=)rG0 z!tCdxK9s!@Bq`a}7mnTwBxI$1j;xCQ3!(4-r~MO;jsHJa|EKVx Hd^q-R=)+^H literal 0 HcmV?d00001 diff --git a/tests/data/300vw/401/annot/000731.pts b/tests/data/300vw/401/annot/000731.pts new file mode 100644 index 0000000000..181faed42a --- /dev/null +++ b/tests/data/300vw/401/annot/000731.pts @@ -0,0 +1,72 @@ +version: 1.0 +n_points: 68 +{ +354.326810 277.170196 +356.862516 297.896319 +360.708857 321.402933 +366.772339 344.811744 +375.576753 367.589576 +388.959244 386.799754 +407.262945 401.811444 +428.068560 412.214259 +453.614796 416.691435 +471.226590 411.577691 +484.005875 396.976013 +494.537085 376.929648 +502.043375 358.298449 +508.351854 337.612143 +513.750512 315.400709 +517.398128 293.446696 +519.878097 269.587778 +401.071060 289.120463 +415.868158 283.175462 +431.633197 280.639818 +447.288182 280.860303 +462.502056 283.726681 +493.759549 279.708941 +501.023665 273.761758 +509.227751 268.874220 +517.254018 266.415103 +522.849079 267.392002 +483.202797 299.142724 +485.261679 313.765218 +487.619687 327.980627 +490.111994 342.128622 +462.545119 348.143214 +473.539324 350.954483 +484.012453 351.175083 +491.398925 348.749592 +495.698470 344.339799 +415.040415 304.069825 +427.740254 304.565914 +438.181828 303.487879 +449.618639 300.557420 +438.347956 305.781678 +427.813322 306.703437 +492.929038 293.082034 +501.907509 291.762309 +510.255618 289.897320 +516.708942 286.473615 +510.344380 291.584684 +501.907485 293.272054 +431.746485 373.402051 +449.048791 371.628950 +465.248833 370.765301 +471.581789 371.573768 +478.582506 369.215815 +484.976525 368.995428 +492.130309 368.389324 +485.662685 378.849941 +478.521143 384.643953 +470.975365 386.597756 +462.553999 386.328249 +448.270860 382.261998 +434.809022 374.014486 +464.103456 376.087702 +471.312425 376.020313 +478.521168 374.807624 +489.607029 369.877287 +478.184380 376.222430 +471.312350 377.165647 +463.901645 377.165623 +} diff --git a/tests/data/300vw/401/annot/000732.pts b/tests/data/300vw/401/annot/000732.pts new file mode 100644 index 0000000000..bf0dc33355 --- /dev/null +++ b/tests/data/300vw/401/annot/000732.pts @@ -0,0 +1,72 @@ +version: 1 +n_points: 68 +{ +363.817 271.708 +364.252 298.829 +365.968 325.877 +370.470 351.633 +381.256 375.027 +397.661 394.398 +417.463 409.304 +438.872 420.327 +460.669 420.571 +478.411 411.705 +487.951 392.441 +496.754 372.500 +504.338 353.575 +509.906 335.599 +514.506 317.927 +516.599 300.991 +515.792 284.064 +404.467 290.300 +418.546 282.394 +434.658 278.447 +450.617 278.359 +465.479 282.345 +496.947 282.828 +503.613 274.821 +511.716 269.283 +520.833 266.200 +527.099 269.220 +481.812 299.263 +483.596 314.370 +485.608 329.230 +487.438 344.276 +462.064 350.710 +471.954 354.403 +481.878 355.891 +489.689 352.322 +494.701 346.437 +419.526 304.128 +432.296 302.727 +442.685 299.918 +451.791 301.013 +442.576 304.957 +432.247 306.164 +493.153 294.574 +502.979 291.036 +511.389 289.049 +517.585 288.486 +511.946 293.834 +503.509 295.495 +434.752 372.539 +452.756 370.355 +467.045 368.214 +474.267 369.293 +480.141 366.373 +484.881 365.139 +488.812 365.241 +483.252 374.699 +478.597 382.170 +471.995 385.121 +464.377 385.874 +450.608 382.911 +440.029 373.013 +466.575 374.235 +473.917 373.978 +479.839 371.716 +484.497 367.569 +478.771 372.052 +472.793 375.438 +465.679 376.251 +} diff --git a/tests/data/300vw/401/imgs/000731.jpg b/tests/data/300vw/401/imgs/000731.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d3f91e17d0c4fc4469f9376cc996f50de39fea51 GIT binary patch literal 17280 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 literal 0 HcmV?d00001 diff --git a/tests/data/300vw/401/imgs/000732.jpg b/tests/data/300vw/401/imgs/000732.jpg new file mode 100644 index 0000000000000000000000000000000000000000..04b5bf772355e86474c794a904d3df80a6a7dde2 GIT binary patch literal 17459 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 Z*UB+fVyebei>V$LjTuyuv>x30{{R&m1xf$_ literal 0 HcmV?d00001 diff --git a/tests/test_datasets/test_datasets/test_face_datasets/test_face_300vw_dataset.py b/tests/test_datasets/test_datasets/test_face_datasets/test_face_300vw_dataset.py new file mode 100644 index 0000000000..74d350c1f8 --- /dev/null +++ b/tests/test_datasets/test_datasets/test_face_datasets/test_face_300vw_dataset.py @@ -0,0 +1,182 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import os +from unittest import TestCase + +import cv2 +import numpy as np + +from mmpose.datasets.datasets.face import Face300VWDataset +from mmpose.visualization.fast_visualizer import FastVisualizer + + +class TestFace300VWDataset(TestCase): + + def build_face_300vw_dataset(self, **kwargs): + + cfg = dict( + ann_file='anno_300vw.json', + bbox_file=None, + data_mode='topdown', + data_root='tests/data/300vw', + pipeline=[], + test_mode=False) + + cfg.update(kwargs) + return Face300VWDataset(**cfg) + + def check_data_info_keys(self, + data_info: dict, + data_mode: str = 'topdown'): + if data_mode == 'topdown': + expected_keys = dict( + img_id=int, + img_path=str, + bbox_center=np.ndarray, + bbox_scale=np.ndarray, + bbox_score=np.ndarray, + keypoints=np.ndarray, + keypoints_visible=np.ndarray, + id=int) + elif data_mode == 'bottomup': + expected_keys = dict( + img_id=int, + img_path=str, + bbox_center=np.ndarray, + bbox_scale=np.ndarray, + bbox_score=np.ndarray, + keypoints=np.ndarray, + keypoints_visible=np.ndarray, + invalid_segs=list, + id=list) + else: + raise ValueError(f'Invalid data_mode {data_mode}') + + for key, type_ in expected_keys.items(): + self.assertIn(key, data_info) + self.assertIsInstance(data_info[key], type_, key) + + def check_metainfo_keys(self, metainfo: dict): + expected_keys = dict( + dataset_name=str, + num_keypoints=int, + keypoint_id2name=dict, + keypoint_name2id=dict, + upper_body_ids=list, + lower_body_ids=list, + flip_indices=list, + flip_pairs=list, + keypoint_colors=np.ndarray, + num_skeleton_links=int, + skeleton_links=list, + skeleton_link_colors=np.ndarray, + dataset_keypoint_weights=np.ndarray) + + for key, type_ in expected_keys.items(): + self.assertIn(key, metainfo) + self.assertIsInstance(metainfo[key], type_, key) + + def test_metainfo(self): + dataset = self.build_face_300vw_dataset() + self.check_metainfo_keys(dataset.metainfo) + # test dataset_name + self.assertEqual(dataset.metainfo['dataset_name'], '300vw') + + # test number of keypoints + num_keypoints = 68 + self.assertEqual(dataset.metainfo['num_keypoints'], num_keypoints) + self.assertEqual( + len(dataset.metainfo['keypoint_colors']), num_keypoints) + self.assertEqual( + len(dataset.metainfo['dataset_keypoint_weights']), num_keypoints) + + def test_topdown(self): + # test topdown training + dataset = self.build_face_300vw_dataset(data_mode='topdown') + self.assertEqual(dataset.data_mode, 'topdown') + self.assertEqual(dataset.bbox_file, None) + self.assertEqual(len(dataset), 3) + self.check_data_info_keys(dataset[0]) + + # test topdown testing + dataset = self.build_face_300vw_dataset( + data_mode='topdown', test_mode=True) + self.assertEqual(dataset.data_mode, 'topdown') + self.assertEqual(dataset.bbox_file, None) + self.assertEqual(len(dataset), 3) + self.check_data_info_keys(dataset[0]) + + def test_bottomup(self): + # test bottomup training + dataset = self.build_face_300vw_dataset(data_mode='bottomup') + self.assertEqual(len(dataset), 3) + self.check_data_info_keys(dataset[0], data_mode='bottomup') + + # test bottomup testing + dataset = self.build_face_300vw_dataset( + data_mode='bottomup', test_mode=True) + self.assertEqual(len(dataset), 3) + self.check_data_info_keys(dataset[0], data_mode='bottomup') + + def test_exceptions_and_warnings(self): + + with self.assertRaisesRegex(ValueError, 'got invalid data_mode'): + _ = self.build_face_300vw_dataset(data_mode='invalid') + + with self.assertRaisesRegex( + ValueError, + '"bbox_file" is only supported when `test_mode==True`'): + _ = self.build_face_300vw_dataset( + data_mode='topdown', + test_mode=False, + bbox_file='temp_bbox_file.json') + + with self.assertRaisesRegex( + ValueError, '"bbox_file" is only supported in topdown mode'): + _ = self.build_face_300vw_dataset( + data_mode='bottomup', + test_mode=True, + bbox_file='temp_bbox_file.json') + + with self.assertRaisesRegex( + ValueError, + '"bbox_score_thr" is only supported in topdown mode'): + _ = self.build_face_300vw_dataset( + data_mode='bottomup', + test_mode=True, + filter_cfg=dict(bbox_score_thr=0.3)) + + def test_annotation(self): + dataset = self.build_face_300vw_dataset( + data_mode='topdown', test_mode=True) + + meta = { + 'keypoint_id2name': None, + 'keypoint_name2id': None, + 'keypoint_colors': [(255, 255, 255)], + 'skeleton_links': None, + 'skeleton_link_colors': None + } + visualizer = FastVisualizer(meta, radius=1) + + vis_dir = os.path.join(os.path.dirname(dataset.ann_file), 'vis') + os.makedirs(vis_dir, exist_ok=True) + + for i in range(len(dataset)): + instance = dataset.prepare_data(i) + assert instance['keypoints'].shape == ( + 1, 68, 2), '300VW keypoints shape should be (1, 68, 2)' + img = cv2.imread(instance['img_path']) + visualizer.draw_points(img, instance['keypoints'][0]) + save_path = os.path.join(vis_dir, + os.path.basename(instance['img_path'])) + assert cv2.imwrite(save_path, + img), 'facial keypoints visualization failed!' + + +if __name__ == '__main__': + tester = TestFace300VWDataset() + tester.test_metainfo() + tester.test_topdown() + tester.test_bottomup() + tester.test_exceptions_and_warnings() + tester.test_annotation() diff --git a/tools/dataset_converters/300vw2coco.py b/tools/dataset_converters/300vw2coco.py new file mode 100644 index 0000000000..8be0083266 --- /dev/null +++ b/tools/dataset_converters/300vw2coco.py @@ -0,0 +1,254 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import json +import math +import multiprocessing +import os +import subprocess +from glob import glob +from os.path import join + +import numpy as np +from PIL import Image + + +def extract_frames(video_path): + # Get the base path and video name + base_path, video_name = os.path.split(video_path) + # Remove the extension from the video name to get the folder name + folder_name = 'imgs' + # Create the new folder path + folder_path = os.path.join(base_path, folder_name) + + if not os.path.exists(folder_path): + # Create the folder if it doesn't exist; + os.makedirs(folder_path) + + # Create the output file pattern + output_pattern = os.path.join(folder_path, '%06d.png') + + # Call ffmpeg to extract the frames + subprocess.call([ + 'ffmpeg', '-i', video_path, '-q:v', '0', '-start_number', '1', + output_pattern + ]) + else: + # Skip this video if the frame folder already exist! + print(f'{folder_path} already exist. Skip {video_path}!') + return + + +class Base300VW: + + def __init__(self): + extra_path = './tests/data/300vw/broken_frames.npy' + self.broken_frames = np.load(extra_path, allow_pickle=True).item() + self.videos_full = [ + '001', '002', '003', '004', '007', '009', '010', '011', '013', + '015', '016', '017', '018', '019', '020', '022', '025', '027', + '028', '029', '031', '033', '034', '035', '037', '039', '041', + '043', '044', '046', '047', '048', '049', '053', '057', '059', + '112', '113', '114', '115', '119', '120', '123', '124', '125', + '126', '138', '143', '144', '150', '158', '160', '203', '204', + '205', '208', '211', '212', '213', '214', '218', '223', '224', + '225', '401', '402', '403', '404', '405', '406', '407', '408', + '409', '410', '411', '412', '505', '506', '507', '508', '509', + '510', '511', '514', '515', '516', '517', '518', '519', '520', + '521', '522', '524', '525', '526', '528', '529', '530', '531', + '533', '537', '538', '540', '541', '546', '547', '548', '550', + '551', '553', '557', '558', '559', '562' + ] + + # Category 1 in laboratory and naturalistic well-lit conditions + self.videos_test_1 = [ + '114', '124', '125', '126', '150', '158', '401', '402', '505', + '506', '507', '508', '509', '510', '511', '514', '515', '518', + '519', '520', '521', '522', '524', '525', '537', '538', '540', + '541', '546', '547', '548' + ] + # Category 2 in real-world human-computer interaction applications + self.videos_test_2 = [ + '203', '208', '211', '212', '213', '214', '218', '224', '403', + '404', '405', '406', '407', '408', '409', '412', '550', '551', + '553' + ] + # Category 3 in arbitrary conditions + self.videos_test_3 = [ + '410', '411', '516', '517', '526', '528', '529', '530', '531', + '533', '557', '558', '559', '562' + ] + + self.videos_test = \ + self.videos_test_1 + self.videos_test_2 + self.videos_test_3 + self.videos_train = [ + i for i in self.videos_full if i not in self.videos_test + ] + + self.videos_part = ['001', '401'] + + self.point_num = 68 + + +class Preprocess300VW(Base300VW): + + def __init__(self, dataset_root): + super().__init__() + self.dataset_root = dataset_root + self._extract_frames() + self.json_data = self._init_json_data() + + def _init_json_data(self): + """Initialize JSON data structure.""" + return { + 'images': [], + 'annotations': [], + 'categories': [{ + 'id': 1, + 'name': 'person' + }] + } + + def _extract_frames(self): + """Extract frames from videos.""" + all_video_paths = glob(os.path.join(self.dataset_root, '*/vid.avi')) + with multiprocessing.Pool() as pool: + pool.map(extract_frames, all_video_paths) + + def _extract_keypoints_from_pts(self, file_path): + """Extract keypoints from .pts files.""" + keypoints = [] + with open(file_path, 'r') as file: + file_content = file.read() + start_index = file_content.find('{') + end_index = file_content.rfind('}') + if start_index != -1 and end_index != -1: + data_inside_braces = file_content[start_index + 1:end_index] + lines = data_inside_braces.split('\n') + for line in lines: + if line.strip(): + x, y = map(float, line.split()) + keypoints.extend([x, y]) + else: + print('No data found inside braces.') + return keypoints + + def _get_video_list(self, video_list): + """Get video list based on input type.""" + if isinstance(video_list, list): + return self.videos_part + elif isinstance(video_list, str): + if hasattr(self, video_list): + return getattr(self, video_list) + else: + raise KeyError + elif video_list is None: + return self.videos_part + else: + raise ValueError + + def _process_image(self, img_path): + """Process image and return image dictionary.""" + image_dict = {} + image_dict['file_name'] = os.path.relpath(img_path, self.dataset_root) + image_pic = Image.open(img_path) + pic_width, pic_height = image_pic.size + image_dict['height'] = pic_height + image_dict['width'] = pic_width + image_pic.close() + return image_dict + + def _process_annotation(self, annot_path, image_id, anno_id): + """Process annotation and return annotation dictionary.""" + annotation = { + 'segmentation': [], + 'num_keypoints': self.point_num, + 'iscrowd': 0, + 'category_id': 1, + } + keypoints = self._extract_keypoints_from_pts(annot_path) + keypoints3 = [] + for kp_i in range(1, 68 * 2 + 1): + keypoints3.append(keypoints[kp_i - 1]) + if kp_i % 2 == 0: + keypoints3.append(1) + annotation['keypoints'] = keypoints3 + annotation = self._calculate_annotation_properties( + annotation, keypoints) + annotation['image_id'] = image_id + annotation['id'] = anno_id + return annotation + + def _calculate_annotation_properties(self, annotation, keypoints): + """Calculate properties for annotation.""" + keypoints_x = [] + keypoints_y = [] + for j in range(self.point_num * 2): + if j % 2 == 0: + keypoints_x.append(keypoints[j]) + else: + keypoints_y.append(keypoints[j]) + x_left = min(keypoints_x) + x_right = max(keypoints_x) + y_low = min(keypoints_y) + y_high = max(keypoints_y) + w = x_right - x_left + h = y_high - y_low + annotation['scale'] = math.ceil(max(w, h)) / 200 + annotation['area'] = w * h + annotation['center'] = [(x_left + x_right) / 2, (y_low + y_high) / 2] + return annotation + + def convert_annotations(self, + video_list=None, + json_save_name='anno_300vw.json'): + """Convert 300vw original annotations to coco format.""" + video_list = self._get_video_list(video_list) + image_id = 0 + anno_id = 0 + for video_id in video_list: + annot_root = join(self.dataset_root, video_id, 'annot') + img_dir = join(self.dataset_root, video_id, 'imgs') + if not (os.path.isdir(annot_root) and os.path.isdir(img_dir)): + print(f'{annot_root} or {img_dir} not found. skip {video_id}!') + continue + annots = sorted(os.listdir(annot_root)) + for annot in annots: + frame_num = int(annot.split('.')[0]) + if video_id in self.broken_frames and \ + frame_num in self.broken_frames[video_id]: + print(f'skip broken frames: {frame_num} in {video_id}') + continue + + img_path = os.path.join(img_dir, f'{frame_num:06d}.png') + if not os.path.exists(img_path): + print(f'{img_path} not found. skip!') + continue + + # Process image and add to JSON data + image_dict = self._process_image(img_path) + image_dict['id'] = image_id + + # Construct annotation path + annot_path = os.path.join(annot_root, annot) + annotation = self._process_annotation(annot_path, image_id, + anno_id) + + # Process annotation and add to JSON data + self.json_data['images'].append(image_dict) + self.json_data['annotations'].append(annotation) + + image_id += 1 + anno_id += 1 + + print(f'Annotations from "{annot_root}" have been converted.') + + self._save_json_data(json_save_name) + + def _save_json_data(self, json_save_name): + json_save_path = os.path.join(self.dataset_root, json_save_name) + with open(json_save_path, 'w') as json_file: + json.dump(self.json_data, json_file, indent=4) + + +if __name__ == '__main__': + convert300vw = Preprocess300VW(dataset_root='./tests/data/300vw') + convert300vw.convert_annotations()