{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"### MMDetection 설치","metadata":{"id":"Zr4A7LiVkNnv"}},{"cell_type":"code","source":"!pip install mmcv-full\n!git clone https://github.com/open-mmlab/mmdetection.git\n!cd mmdetection; python setup.py install","metadata":{"id":"zdMSR63rkK0C","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 런타임->런타임 다시 시작 후 아래 수행. \nfrom mmdet.apis import init_detector, inference_detector\nimport mmcv","metadata":{"id":"Chqi6PKikK0J","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch\n\nprint(f\"Setup complete. Using torch {torch.__version__} ({torch.cuda.get_device_properties(0).name if torch.cuda.is_available() else 'CPU'})\")","metadata":{"id":"GiNQPBlkp2mA","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Balloon Dataset을 다운로드 후 압축 해제","metadata":{"id":"MIediU3b5sDs"}},{"cell_type":"code","source":"!mkdir /content/balloon\n!wget https://github.com/matterport/Mask_RCNN/releases/download/v2.1/balloon_dataset.zip\n!unzip balloon_dataset.zip ","metadata":{"id":"fkOus5ji5dH4","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!sudo apt-get install jq\n!jq . /content/balloon/train/via_region_data.json > output_region.json ","metadata":{"id":"AzBizT2w5dNS","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### coco 포맷\n![coco_01.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABEQAAAHwCAIAAAAghC2wAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAANCUSURBVHhe7N0HXBRX4gdw7i53yfX2v9xd7pJLYu+9a6IxibHXxC4qImLDjgULIlJUFBCUotKliEpVkKIgIL333nvvLLvzf8sM67LsMosBXPT3/XBk582bN2/eLrfv58zOylEAAAAAAACDEMIMAAAAAAAMSggzAAAAAAAwKCHMAAAAAADAoIQwAwAAAAAAgxLCDAAAAAAADEoIMwAAAAAAMCghzAAAAAAAwKCEMAMAAAAAAIOSVGHGHwAAAAAA4G1gMok4CDMAAAAAACC7mEwiTi/CDLMAAAAAAADQ/1hjCMIMAAAAAADIItYYgjADAAAAAACyiDWGIMwAAAAAAIAsYo0hCDMAAAAAACCLWGMIwgwAAAAAAMgi1hiCMAMAAAAAALKINYYgzAAAAAAAgCxijSEIMwAAAAAAIItYYwjCDAAAAAAAyCLWGIIwAwAAAAAAsog1hiDMAAAAAACALGKNIQgzAAAAAAAgi1hjCMIMAAAAAADIItYYgjADAAAAAACyiDWGIMwAAAAAAIAsYo0hCDMAAAAAACCLWGMIwgwAAAAAAMgi1hiCMAMAAAAAALKINYYgzAAAAAAAgCxijSEIMwAAAAAAIItYYwjCDAAAAAAAyCLWGIIwAwAAAAAAsog1hiDMAAAAAACALGKNIQgzAAAAAAAgi1hjCMIMAAAAAADIItYYgjADAAAAAACyiDWGIMwAAAAAAIAsYo0hCDMAAAAAACCLWGMIwgwAAAAAAMgi1hiCMAMAAAAAALKINYYgzAAAAAAAgCxijSEIMwAAAAAAIItYYwjCDAAAAAAAyCLWGIIwAwAAAAAAsog1hiDMAAAAAACALGKNIQgzAAAAAAAgi1hjCMIMAAAAAADIItYYgjADAAAAAACyiDWGIMwAAAAAAIAsYo0hgyjM1FMNwYF2WmoHj+2+4v0orIQpBgAAAACAdxFrDBk8YaYxvyXsnP7hVXO+2vLNYWerFwVMOQAAAAAAvItYY8igCTN1uXEBavPULxuoPuFlV3AoisusAAAAAACAdxFrDBksYYZXnuJvveXr81dtb2ZTbXRRx28AAAAAAHgnscaQwRJmqouT3IxWr7qoZ29ZStW1M6UAAAAAAPCuYo0hgyXM1BYnud9as/Ki3n2LYoQZAAAAAIB3H2sMGTRhpoSEmbX8MHOvmKpFmAEAAAAAeNexxpBBFGY8bq1dgTADAAAAAPCeYI0hgyXM1Jcke5r+uPziNbs7BQgzAAAAAADvPtYYIuNhRnDHsqrKtIdXFq5V13NyaKTqcSMzAAAAAIB3HWsMkfkzMzyK195GUVGpYaZH5xzWMfMNpqhmZh0AAAAAALyzWGOIrIcZTklS/v3DWvu/Wy2vtNsg7UlyOy4xAwAAAAB4H7DGEJkPM6WpBQ9O6R1bvkFx7+5rCe7xra3MGgAAAAAAeJexxpDBcAMA/idk4jKjzI/NOqht8iwQl5kBAAAAALwHWGPIYLkBQHVF2qOr361V13O0b8ANAAAAAAAA3n2sMWQwnJnhw62ZAQAAAADeL6wxZLCEGfpLM1fiSzMBAAAAAN4TrDFkEIUZd4QZAAAAAID3B2sMGSxhpqaYhJk1JMzYWxRTdQgzAAAAAADvOtYYMljCTHVxkpvR6lUkzFiWIswAAAAAALz7WGPIYAkzVHnqc5stX52/amOYRXE6SnBLMwAAAACAdxhrDBk0YaY+L/7lha/VNa8fc21OLW7htuPsDAAAAADAu4w1hgyaMEM1FbRFXTQ4vGLW7B/n7ne865/PlAMAAAAAwLuINYYMnjBDNVCNYSEPrmuePHvI0M89qowpBgAAAACAdxFrDBlEYQYAAAAAAN4jrDEEYQYAAAAAAGQRawxBmAEAAAAAAFnEGkMQZgAAAAAAQBaxxhCEGQAAAAAAkEWsMQRhBgAAAAAAZBFrDEGYAQAAAAAAWcQaQxBmAAAAAABAFrHGEIQZAAAAAACQRawxBGEGAAAAAABkEWsMQZgBAAAAAABZxBpDEGYAAAAAAEAWscYQhBkAAAAAAJBFrDEEYQYAAAAAAGQRawxBmAEAAAAAAFnEGkMQZgAAAAAAQBaxxhCEGQAAAAAAkEWsMQRhBgAAAAAAZBFrDEGYAQAAAAAAWcQaQxBmAAAAAABAFrHGEIQZAAAAAACQRawxBGEGAAAAAABkEWsMQZgBAAAAAABZxBpDEGYAAAAAAEAWscYQhBkAAAAAAJBFrDEEYQYAAAAAAGQRawxBmAEAAAAAAFnEGkMQZgAAAAAAQBaxxhCEGQAAAAAAkEWsMQRhZpDhMf+ldV0CAAAAAHiHsMYQhJmB9TPTB6+NaixIiop3fZbwqrilmMMUv8MQ1/ofxhgAAABkFGsMQZgZeDyCy+34IY86i16X9DC35FRT+Y8uHz73vxkX5b3LnjYyxf2H3x26YyI/vD6YAr9unP/fziKREhnC7y/pHOleT8/RoCB0JIP9UAAAAOAdxhpDEGYGEpk31uclht45q79rn87Co5aL9KP9c0o41alOV0xU9mn/cOj2fO0gk6Aypnp3nCoq5/7pnYc+GnJihVuJSz1T3PeYGW5NqJ2t+p7zX8lfnrFVc+62y+Rn5vqz3+y/tdu9xruIrvNmOBRV8tLJ+dIhnTUHrs9T89jrmF7LKct55ad/4urmfVe+VnVYa5oUV9TEVH+7+KPRTFFJIXZaWtv2yB+4Z+GfXkFRXHrtYMNrb6t/aeqps2PnLuUz9+OeFlDcQXokAAAA8K5jjSEIMwOJTIqbUgLdT37708f/Wyw35rDcjueWCSXtpVF6GxVGf7lIbuhOubWPlR8WMtW7a6+nyl/ev2Wx+YCNbkRNOJlg9xteS1lhoteFw1oLvj025afzk9ZfmPzTefIzfqXqrF368o+rPSV3Uwpk+lzsonV51bjFcp+tkZtnOFQrvqytPPmx1e6ZK3792TK5yed/eSjMN72Bqf7WcQvbSkyMVLctm75hzU6Tu35pgzrM1AXccldfvmnFnB8O2511bapqw+kZAAAAkEWsMQRhZqAVx4RZKu+YMHWN3NcX/qOZ+jiXoioL3M8c+mHuKrlpKn88Hqrxsserx3hcDofT0spp4/L6dTJdGPrC+qDijBNuGx5UNjS3UVxOc0sb89PKaW3ntf/sCXCU5a0TK9f+dvxWuY33F9tVVbZTZS/cr2/Z+J+JP8ktMRhrmB9aKCufCmrLj8i+vfbERSMFi/yymlZSMqin//zONyS3JlxTO6i5XcU5rqmtP3MxAAAAwBtijSEIMwOtOCbcSnn7uCkr5b67PO1O9bNyiqoodD+jsmjOcrmZh4deybwZx9Rk9PShhp/7gQeRzYWbywt4qrN63/o7CfoSr3rrsnWPXRG/riPMrP7tuM1/2uOx3YeqoaiS527Xt6z/ZMK6X/9o9p1ja0wFU7MbcXv7uYPRk9rUly9PzT6hY3PqOf8KOb5+3NvAqKLaHhjsPbVng75XY4vkSxsBAAAA3hrWGIIwM9DK4iIcDymOn7ruw2XXVrq3hzRSVHm+j/rRJfPW/GL2iXkWpbZ5TE0BTnNTZW52cnLmq/issPjssITcmPTS3HpOnYRTM02VZQXpGZGJ2a+SShLza5uoptra8rS4zMj4rNC4zPCEnOj8hnwxF3CR6XljdXlZSlxGQmaUxe17m785tsHAXyOsJDQ+KzqR7DqT/MTk1eTUUxwxu25ra6rMTMyKjssMTcgKS8h6FZsdlVqa18T/uIlYCXamaut++mic/P9U/U/GUnVkJALcbyls+ff4DX+Rt9n+gkohRZK01XOr87Iz0xITM9LSisubW1uYFf2iMjHA4+CUM9fstUKp+jamcJAjSfGJ+R7Vo2u0nRqau73oAAAAAN4+1hiCMDPQmjJiw3SOzpij8IfVt/ZFtMWSBFFdlG5yYdPinb+aq/GjZ5lnLVNToDI92fnE/oXfbf/FZKXfTVP6cOKBz1br7wuofCHh4/HxjhYXN235eLaS3Gy9SUefhvGi3J9YrJyg8K9Jih9M2vmHmQf+rRp49Dkz+Rc6wUBKYt2tjL4fp/Dx5F0fTNn14USFD6fs/u30Pb+frvSH6Uq/m6Lw20k7Rqr6HAqhyoUCSmcLuWnhDltm7/nfOIXfTFf6/fTdvxq99z8rDVUimyM7awjti6/iqbXxHsXfjjs44fJL/WKKxCtO1DOP0/s+m6z0yR6nM2lUNv96LgmKXtQ8VNm1ftHESat+WHrJLCE3g1nRLyqTAp4ennrm2n3NEKq+h14NJuUU5WGqfPLIWl3nhpZ8phAAAABAhrDGEISZAVcQX37nzNRpBz5YdkejuC2dlNQWc5y1ti/dLzdJVzmi/BVdTUhjeWmc28PbJg7HbzioGd1bte7UlK/UtnqXukm4m1lxXJSvlfmli+cn/Hj+j99rbz97RfGS2ZrTzoeuPLpgdFf1utakH6/MO/jUKoUq6HI6g0MiQlJEsOlVB42bVvIHL8+au3+K0u1l2o9P3nigpv/g5HUHVT17Hfe0xzlUQ+eHWfj5pKmCSntuanZr4ymDVaeclLWd1QwenNJ/oGZofkTXYOXBO9tuRtyMbavrngFeOTgfV5H7XHXajRB7cpikJMU//uqx/xt5+F97Hxs1UsV0NXHqX1n5n5i+cNrwj/85fMz4pbvt4jyqmFX9oSPMTCNh5tK7GGYeIswAAACATGKNIQgzA64qi/I137pVf4qKhyOnnT9fb6ykQm01D98Y+tN9w/yaTLqagOhHQaoD71oeW33hoJ/EMNOhhapwN7x2+V+zDv1nrOpSDf/bNR1pgX/6JeL2gSPff3dxhmWDe9c5rNCumlJ93dWWnlR5lGEvZu7Or/e6bm50qZnGnEXH/7XbUbuAErpjc1VjhdfJNQdGL9afeDUtpLBbQxl+YSYGI3+4reCcGNLRM6oouuLhrfkrb/6g+9KL4n+KRpICH1P7XaO/nzVu6LCRU6Z/tcEwyjaNWdUfmDMzV+0uBb8zYaaMhBmTPScPr73ysBFhBgAAAGQRawxBmBlw7W1UY3VhYWVWSX0dxeOf4eC2U021FSWVGQW1VRxuj5/IIAmi7JnJvUOrSJgp6ynMcGupwsfax879b+a5VZYpNrlcoc/INFJ+Fncv6/3+yCuzsGqmTFRNzBMX1SWq+xySLbtd9iaE9Kch6Znf9R911FwjLGtby9uZFZ1qa8rjrfTubl979VxAqX+XE0EU1dbYXF2VkVddVNfSRKcjTnN7XVVOflVeRRPpcE+3a0tzyTJcvnj2qL/+feKYCbvOv0iNYFb0i6rkl95Hp5y+ancx6F0KM263lU4eWnP1cVNLAVMIAAAAIENYYwjCzADrdsutjq9g71LY0125SPYpeXrrrgprmOFUUXkPLx7THbHIVDelmX8xG19H0+R/iQ+fmBjIKfrcDCylV3RFQkRVpMfj40tUle0T71VREr+MnySvylfO5vfnrLtvk1Il+Lg+XV1wHDlPnW/tPLrsTtKVZKaE1qXVzq5Jqza9NdbRyvSG+kVjfcMnQSVVEu989uZePxP1qb4P5Gee0XO4lvj6ErtBroaiAi33q5xYd9aqkhKcmenFUwAAAADQz1hjCMLM4NKbMJPrfP6c+fhNbk+K6rtU5HGpSMdHhvof7H1uHFTOFHYhdZhpbaQCzfV1jORUQjySJJ7BaQx7GqB7csrF4P1Pe7owrlfE9Kg/puEkzrQ1cqncxADba2vWa5l7OVdSzT2dMBpE2igqy0fryBXFfVpBpeSF0P7zvzkIAAAAoE+xxhCEmcGl92Fmo6tnYX+GmZd3DHSMfnEwuMcw8+SFzskpGiEHvPoszAyQqmSu74VLe5d9vWbXavUX7jHV79Z8n0PluYRbH9i6bPmyg3fOu1dWN70jQQ0AAADeDawxBGFmcOltmDEbt8HFvaC+S87o2zATYH5D+6acSoin5DDTFM4/MzP5YvC+QXdmpjaL+8rY9LLSpt2Htpx8+CCkqKZjdNi9Sf/e9ADe/MCbG+Nsn9/ev2uH8s5Lj4xf1NT1cNapP4YXAAAAoEesMQRhZnCRtTDTRIVY3Lxy6zcHXrolSrz3WN2rJ35aJ6drvlJ5JuarOt8UjxxIO4PL7fjoUb+pK4h0Nlq59OItN+tSSrqzF/zuve4fWWLK2ZCtmM3IAykPihy8YF9kIyn31UJRqe5n91/atv9afEsc+10NhPfCP6R+HXEAAAAAgjWGIMwMLjIWZngcqiXBw/LB0qXm5kllzB2xBJWZB5zER45XNxxdZ5t2M4cu6QuVsU2BBlpnD2+TP3XkmJV7TonQLaH7Xm2K32PFGWeu2evGUA093m+uU0lliZftqeOn5bcdOq1+3b82QuxId8Vrqm0IvPlIb/+e/UcUjlmauSdVsJ8Iaqeo7PRwO5O9+4/t3H5cx9wsksoW3IqhJ1UU5Xdv35Fj69TtqnlS3Jq5oCTb1eL4kdM7t+09oXboboJvssjN6QAAAAD6GGsMQZgZdCr8zCyOrFY/HFjl1W1WLfSP5fVU8SONC3cmbHL3Lm8WnXXGPfC8ZfjB/kDzcEm3Zq5L8HI9tfTkgQepNj2dTSH7a8159dJ6/7XjFoH66TUlTLlAa1PeC7MrJms2mV4JrYgUvXHzzxDvFK+98Nvpw/7y19Gjxm46/iQpUFLi6gtVyS+f0bdmfinlrZlfZT0/Iz957Ji//mXYpLnzNSKso5kVPWitTIvVXX3s28/++8XIj4dt3Hze+WUzeSJ7xGuhWt39zHYt+98XI/7xt5ELt600LnwpVWgsoyjXjlszX3vcLM2tmSPTX6rvGj9q/J/+NWzaiqVGUY/TSbQGAAAA6EesMQRhZnAhE/YyH5N7h1erq7yoeNLElIrBq6EKH6qfNx+/0e1JSWPH12UKiXFyMzL4YF+AyatKpkRUTSz/e2ZO7nNMtpL4WZhOzZlNUZZrl+rMVHhs1zFHFmipKPE+e/DHffoTjIpiS/ty7pvnbWKzY+Si2RNGjBw5bebcH29EWSUxq/pDx5dmTjtz7f6lEOnCTJpDsvHGb+ZOHzFixMSZ34zYdu+6ezazSqLG2pIXNrt/2DZt+PhJU0ePmLv6kIFRJlXQ84mgtgYq/JrL2eUTJk4aO3rEmK/XT9rv+jRaitNAFKnjYap88sha3YcNUnxpZr1vksuR9XOmjf3Pt9+uuXyvpIb1eAAAAAB+JtYYgjAj23i8+kjfJyY316ro/7BXf5XKjdWHtacuOvDvsTv/9aPOFGWj1Qf1V+27uujk/dUmSeF5TGbJDvC9f1ljs+KRf83ZJzf++Pgthsq2kU7lVB1FNWSl+ty8flThwKhvlOSmn/p8+a191wM9Gtv4Z1S4zVRVhLfT/W3KemtVdGevOfaf0fL/XH5xjJLRigP6qw/eWL7PYKmy6QnnRLdqqqHLxU8tVEPGKyebi2euLDio/91+/VUH9FceIL9vLD1gOHef1QHLmCc53OY+PC1DUZzo++Hq8xZOG/bXv48cNXadyuME3/686KnXYaY1INPr2MbJY0f97W/DJs2ZrRZ0L4z96rTmiqQwjRUq8z/99IuR/xyydoOavU89/+tgesJrpuqcfYzkv/v8y+Ef/334gs2Lr2cGZEkz1r0LM7wYc3/tJQtnjBv+9dENGiFJjW39eSYMAAAAgI81hiDMyDYer+aFs+2F06OWqf7n++NDlqgOWXxy5Oqz4386P37FyVFLTwxZcmLI94c++Ul/+IVw/3TmiqQUVwe9fQfHrTwzdJXapHVqQxaeX6rjZ1REVVNUbWLkgzPHFm1Q/d+Ks9PWnf5igfa8g67W9R1z2fZGqszf4Zb+jIXHhn5/YthKtXHrL4xfdWr00hNDyV6WHP/ie9X/fXtxnUm4BclFQmGGmdRy45O8LZYsUx2x8OgX/Ponvlh4cPhP2jNv5Thm0DWEr4L72crCGrwvnTwgv2Sp0nYFI8eMwjxmRb8gYebJoakkzGi+ouql+sxMQVnBI5M9CspLl2xTPqzuWRXU7Qq87riN1bXel23Ob/px4/aVO430HGNK2T8zw6GotKSXplc2bNy5YpnC6evXgqk01pNpfCTMeJoqq5Iw49zQwjp6Fe4X7RQnTJ80Y7bKvQsBzY0tyDIAAADQ71hjCMKMrOO1tjQ31FdU15dX1ZeT39X8xxU1Hb87Fsur6sprGisa2lo7v/SQ09LcWFdHryU1y6saqhtam7j81MHjcFrq66tJYXV9ZceqqrqWZh6v41/yeRS3tbmpsZLsqGNfXfbC3xG/fk1TW3NHU91wOK1N1aR+Zz9JxypqGiqb2vv2nAyD28Zrbaivq6murq2tbWxu5/bHTgRImPFUmULCzGVpwwyX297SRLpWXV1TW1ffwm1jCyV8PB45qOb6mpqa2uraxsZmjjQbkRjKaWtq4G9TXVvf2NhGSfftlyTMPDHbo3pkjc4DKcJMmt1x/bXjpo7Zts/yBfn/Anz2HwAAAAYAawxBmHmnsN0uV/Lajg2lmgN3Eqn8pjt+Q2Ia7M9bBdenBYWpzT2mZX3Mt3PXPe5NXF9Yu/eG/Re7L8ltCdZUU8321/ee3rXJyK+xpYIpFKuVolK9Lm89+PVXczZZ3A7Mr3vjvgIAAAD0BmsMQZgBYNdeHFNgs+30hWvyN6ISMsqbW9v69URQP+Nxmxta8gPz/S8cO6i765RXcnNbj2ebSqg2x1t7lqya/uNq43SfTOlOFwEAAAD8bKwxBGEGQBplvCb7uyc3LB/17ZzlV667JZR2fMPLYMRrb63x0rI/NPubuZO/Pf7wsj9V3/N95jhZVMa1c+u+X/j17tNBddF9+MWnAAAAAD1ijSEIMwBs+NdUtVJUToKXpZW6tvpVN/eIvBr2j+bLKB6X0xj7KMhKQ0NT5/azzFflbBfocSqokudetpZ3LDwCy7hlODEDAAAAA4U1hiDMALzn8PkXAAAAkFGsMQRhBgAAAAAAZBFrDEGYAQAAAAAAWcQaQxBmAAAAAABAFrHGEIQZAAAAAACQRawxBGEGAAAAAABkEWsMQZgBAAAAAABZxBpDEGYAAAAAAEAWscYQhBkAAAAAAJBFrDEEYQYAAAAAAGQRawxBmAEAAAAAAFnEGkMQZgAAAAAAQBaxxhCEGQAAAAAAkEWsMQRhBgAAAAAAZBFrDEGYAQAAAAAAWcQaQxBmAAAAAABAFrHGEIQZAAAAAACQRawxBGEGAAAAAABkEWsMQZgBAAAAAABZxBpDEGYAAAAAAEAWscYQhBkAAAAAAJBFrDEEYQYAAAAAAGQRawxBmAEAAAAAAFnEGkMQZgAAAAAAQBaxxhCEGQAAAAAAkEWsMQRhBgAAAAAAZBFrDEGYAQAAAAAAWcQaQxBm3gM8HvOgk+gyAAAAAIDsYY0hCDPvhfbWlsba2tKa5uqmdqYIAAAAAEC2scYQhJkB1e0ciXhdavW0jbSnWApfvbh//uzsU56HXQqZIugHUj6/hNQV3wJZ7psYPQy69M8HAAAAyCTWGIIwM5DI1Kqlqjgn2OO5naOP4aNQ4+f5aZV13KbSaJ+gB47PjJ1f6j/LeplVz1Tv1FxVkervfd/eQ/ve06uWXtcs/Uzdov0Kmws4TAVWGR6O2qtXyC02+8o4nSmCflFdUZL69MELC9tnt13DLMOr0mtrOM05AZ5BNtbPTB4GmgcVhRS0MXXfMi5F1RTGBgY/tHWys7ayuGPt8NAhuDC5ROpXlczgclpLIj2DH5lbWVtbWNlY27s5ecYmFda0DLpgBgAAAF2xxhCEmYFEZla1yYFux7/b+unw1XKTT8jt9LVOyGsrDdfdqDxh5Eq5cXvk1j3c75zPVO9UmZ704MierxdskRun8OtJO+W+3PGHry5tflbu1cBUYJXr72myV+nfCg6bbHOYIuh75PlNjwmyWjlh+5/+tVJu9sm/X0i5n5XVVO6294d9//p4pdyE3R8eCjzm28hUf8tIpkr11lJUmT502tSp48aNnvHNioXqwfcjm5j1gwenuT7SYPvFVSOmTJ02aeKY8VO+H/OtjrFPakVHYgMAAIDBizWGIMwMtLzwwJtbtg4fu0Juxunfn4x2zGijKjLtVfZ9NWWZ3Pi9cnv8Tz2rZqp2amusL05OCA2NexIc4xv+Qv2Y7qpF5xR9St1ET+FI1FxVUZCSEphcmlDSzBRB3yNhpjw13O3AN9v/9dlSuXlnxhhXupY2tVYEa248MOrzZXITd/9XI+lyJFP7bWslYcbj3B61VesOW/tb+oZFhEeGZVQX1Q6++T+P216bE5cRHUREPdUxv3xowfe6xp5JZQgzAAAAgxxrDEGYGWglsRE2+3ZMmLpabuGlMTeLnxRTVGXRk7Mqi+etlJt+iEx2r0V2vTRG9Lr/uuB7VidWX1Dx60WYEcH6UQK29b3Ux83JsvqsaJ/zKxWHDF/30Q9ay11bApqo1opoI8Uj00ev/dWMI3PM8+7mMlXfNhJm0jzOHby887BBBpXBFPINsqdL5NXM9U500169XM/UIxFhBgAAYLBjjSEIMwOtJCbceu+OsZNXfbBY9zun1sA6ilee73Hm0KI5K+RmHZ1yu/iu8LxSFIc08PTWXZVVFw76lb1xmIF+U5cV9ezsyl2fD9325+WGymHNsRTVUh5luOvwlJGbfz3rwlqXfJc6purb1hFmzh/QlN9/NaYpZvBdXCYOj0tVPQ5zvLSChBmcmQEAABj8WGMIwsxAq0uJ9jt/YOrMrb9babg9kBNJ4kllYfT10+u+3fLLOeeWPSx7XM7UFEfqMNNeT5W9dLxzd9VWrW936szfpfvtgVvf6wYZBZIJXg8E/8idHP/MUX6Hzvfy2gt26SzcpTt3i+Gmc/bWscGX7788YxAeU93CzH47/1282Pexhcal7xR15+3UXcjfRGf2JtP1F54/baeEZ++8dk5tsLuj3rVvd+nN3W6lYv4qmGp4+dLb6LDGCkWdufKXF+65+dW1CPPIWqZ+99ME7S1tAQ63ta/N3q4zX0F34Y7LC3frzb0aeeJOcJSFkZl3mkU61fZ6Dstszw1zvX/9+oIdOl/v5PeNf0Sbrm/SemZZQXWMCL+a0K46H1YXVbqbnzh9dcY2/iYLt19acNBs/s0UwzseEbZ3rwZUP+l2c7iihLDbOxVGjVL6+6p7lwqbM0loqMh1OnHkm0nbfzNLb19oUTBTUQxec11DsKm70fFDx07vU7tv+TSlqh+n4wgzAAAAIOtYYwjCzEDj5cZnGZ+aOWvf71aZn8lsSyZFNcVVdpryy5TlZmgrvCx/0dM3wUgfZupIvLinbzBn8anxq8+OX7Rv5HxFuRW2K+/0dN6Hr6WxMTcp3stWU0Nr/Kozo1aeGbtabdxqtVHLz8ySvyCvfXXEOoMv1z10LWpg0gbR2lyWEm989vLalcrj1qiNXn2W/CY/Ixeenb7RaO+T2IclDaVcZlpJwky1/wMrjdPj1xyU+/zYp4v1T0U8O2Fg+uPSk5NXqY1dfXzkatVfLjFerRcWX97e2n0q2lxfHBfhqKMlv111xEq1MaRvq06PXXPus53WczdrH1q2ZoHmS6Vgqll4DNuaqlNiHl66tG3z4U9XqY1YrTaePqKlJ6YrGmyyirdNbirsft8rHo9bV5n2/JnpGbWlm04NW8HfZPyqU6N+uvyZov3ytUf2/7hzxq1CvSSmukBNeqKn6u4JUw7/9Uene3XNJJm2V1WG6Bxf+bWS3Fxz9cSyNKaiGK1V6QnX1p74/rP/fjHy4+Fbtqo/DmmlpL7LQ28hzAAAAICsY40hCDMDriyl3Vn766/P/PlHu1tNnDxSUl9G+Rge+Om03EwjtfTKeLqaeNJfZsajeJzW1taGxtb6Vh6V8jLPRufL/Y+Wm7OEmdbEwBDt48Onqo054n6vtTW7ndPa2FbfSCb7KbHh1uvn7P79iLP/UXziXtoomGSXRATeP6j4n01m867H19Q3czlt9U3kh0OVhcW53pw+R3XOKa8bpVR5Z8DgcUhuKGlo8tNU0Zs2bO+oJdvGX3iy24fKrSJHV1NcEKGzXWX+umvTzEvCikWDXX3gQyeNs39Tcjv6MItqb2tubmnk8Gpr67Idjc9v2frLMVv/cybsVCTVIrRda/Qzv8uqn3xv+N2VV1Gctqq2tib+ETVTVGKI/50VUxTnHHtxPIaq73rDZG5rS/lDI3VVrT/s97MLK+Gf6mpsbiJT5fzsOCP19T/8JDf14ATjkjvd7nTdSqLgtaOzllz8P4Wnz2pb+SmptjLvjrr8+pNyy51MkipFb+/wWlNdyQvb3T9smzZ8/MQpo0fMXX3IwCiL6rc7OSPMAAAAgKxjjSEIMwOuuYbKjXVzi7DwyUzhcfmRgNNMFScG+0bcfpwUWd9SQ1cTT/ow0/VMQ1l02+NrI1UeLzPrIcy0Ui2pPrZ2OzfqbNd+ZhRZ2vUW0e282tjnNy/PX6L5z3WPXIoa+BePcduo4mgPS+tZ264r3432zhaZdzfyisJdDHQ3H7234EpScJnwjdTI41c3j52bOe7Q2EMux56Whb2+Fq2y0M1I9dj1/+567phYQw5YWLXHHavjBz9SjbkUwZQw6jNzQvyN7PwsX5WFlZO+0qUtVFOSxx3L7Vuu7jQLv5/R2HVq29ZWG+1td2OzouWyY5H+jW2vzzWRI2tpKjQ/f+LQxV9fzHshcuFfSeyrZz76DkFOCU0pwtt04DZU1ya8cvGKtgooKG7j8jvS1tKUFvXCL9zEOzu1ukXkiIQ1VySEqC8/8PWnn3058p9DVq8/bedVS0kOPz8TwgwAAADIOtYYgjAzwLp9BoTHL+lSKOZjIgK9CDNd5IZWOl4ZduBxT2dmWmupZBtNDZP/bfT2LBS9gzO/T7wGqsbvlrHz2uP+geVN/G9LaWmgPPV1Lt38SC0luFDs5XFcqjXISv/ezBUWdxPLhdIRiWyB2vtOfr1A66dnVCA/yXTsgf+/VqrW2/aW+bAfbE0iSjo+0PJaQ9hTL6Pr32gGqD1KS80sSEjPj03NjU3Nj8mozq8TjFvng5ZKKsHy1Dmzodv9X9aI7R4pTL2vfnv7EsPLOQ3C+YjX1lrxxMpE7/YcnfC7z7MysgtiU/P4+0orjMuqq3idSLo+W92fOzElzH+74zZU1TxRtzi9ZvmajYs239Cxiyru6GL/QJgBAAAAWccaQxBmBpd+DDPttRVFNprHLpiNuZ4XKf5r4HkUt7m+vrG8urml45RDa33dS+2TqmeMl3pSyZJnw+keT27tv3A2sMDldYerSJi5pKS/aoXFzcq2Lh8j4TZTZZ4WN82GLXMwjyytYEpfK89Ms1E9tmSR/EfTlf8wU/nPM5X+NHPfr8ZqLlR/7klRHXtg4gKnsijPQn3fRZupJuX5kr9fp8bL1lVLa6Nbw33+NX/CeBlBz28oKk5ZoPDracp/nkX2tfv30w59OPn6TqekUGaiLDmavAEel9tc01BdXlZWXlpRV9vQ2m9JhkCYAQAAAFnHGkMQZgaXfgwznOry7NvnDp03H29WHlcmfhYtMnNvqa/zVD+puPnQiIMPNmk4ql61O6x7X+jH7shVh6M3HsvvOLf4B+VvLXOMc5gN6TCjsdt47Wo7y9bW18UECTMlnvcMzYYtFx9muG2t+b6u1iZW+7Xvq+jcP3zF/rCO7THV6ztOmK2+HuyUX0eapvvZVl6UZnR2l9K5v8lb7Lxod/qacN/o7jkeufLggNKxNVuPf6GTYxjdsZmQ1oqSFFf764Y2e7U6NrnqcETT8ujxq+tP2crfiw1q4fTpl/n3aS5ihzADAAAAso41hiDMDC79GWZqynPN1Y9cMB93qySmVOyZGVGtDXUvr6nvWrH5V9P2fjR9719mdZy+6Przp5nKf5y2699Lzn57p9Dy9c47wozSzTWrrM0bWjOZwg5sYUY8zqsX925NnaS1wynOpWOYiPaqkgILzT2b98hN3PO76cpiusc/saP8x+m7/2+55hjdJKv4lo7tetZC1XjdVNWbNM/gZFxJCFM4GCHMAAAAgKxjjSEIM4NL/56Zybp97tCFO+PNKxLLpJoEchrr0000dDQMF1qXO4SXZGXmdXywRMxPQlZxRmVb1euw0Ndhhmrnpoenmlz5/uyj7y0ym+gvmqktpVz01HSthuomPgnPzWM+9yLmJz6rNKW0uaqZOTfS06eW+JpbX3n6Xb868qzf0afFTFkfkPEzM+K6xzZSfG+ynbj1Uu2rV2FGbIP8Qin2BAAAAAOBNYYgzAwu/RhmeI1V9d76Z07f/GJfiHuR8M2NXxOZ5PFaG1v8b5nctJx9ozxcqi+2509IOxp5gzDTRo49NjjpqVtqOkXxr+8S6g1/zlqbTQXozTtg9ZlaNPNhk7YqKste97rjzGOx0dJ9+qRzwtzIaSsI9Izze5mX37Hjzn119r84uP7x1d9ve7hO8ni+AV5bc2vmi1g/x/uOzjaPQoMTSshhCh1l3+r9mZm2Oqo4LPqFi42d832758HJBaXs9ycg3W+pyIiMcrF77GDr4B36LKWppkmKY2oq4eUE+j95aGX9+MGDkNjS6mpphqK3Z2Z4DVR9YtzLp49sbJ3uWz0OTH5VQDVLdVYSAAAABgJrDEGYGVzI1LHEiw4z/mXuvQkzVY5Xhx3sKcxQ3Aaq3Mvk/PUxM26cDMsX90X1PKq9raW5pb6ptbmdx5/FcluoSh97kztjllrrB+blip87cjltrU2NLU1tXKEv5idT08BL/DBjY97YlsUUdiBhppQOM47mUaWVTClB0lKQ3lHDRXONdXOqY5hCIUWJzU5XvjnuOOV6ciPzdZtkhh5te/XO2jmGmnHFEi4J47W3tTY3tTS0CnevuLHee+9i3TXyTmYt7aL3BSCSfZPvXvnk4BNFJzEr31h7bWHBXflLP44aOmrSp5MP7r3mk9KROfpH78NMdQblqXJx28z/fj5h6Ocb9tz09KVYv9OTJIPcUEu1UzO/nDHifyOWHV5lkJFQJMVX5+Q/r7bZumnRpH99Mn38BGV13/hI8a+urnobZlpzqbTrV/Ysnvzpl6NHjPjuqPXlEKpK8r0iAAAAYICxxhCEmUGnNuieleqai8dD658zJa/RJxbEXI9TGUO56o084rnGppApeY1fm96Oohqznzww2q3yubztBofsbt9400QlPtQ7c2X8VrPTYbWh/Dkf2aS5IMjrrsqxSfIWq++kltAVu8gNfmixb52GvHWhTTZTxP/kCRV2bd/tDWsd7lNUx/e4kKY6ekE0+jiZ3Ru58pF9Wp3Qv5KT6BZ8S0194pf7/rLlkVpAadcZcVl28INj3xxeohV4OpHb8noO29r0ytNX7fyIlbeX3eNPiLtpiHG0VN97eZFxmnWiIDiUNtZ7HVtz+ItRpz455H8/R2Smn/3C1Fjx2zNLrDPMSYDrM631pcGPDizeOePLkWMmDBm6YM2R2/fyqW5fHNpXeh1mGnJjXl34Rum7EV8OHzNy2LglR+/oRFFdvj2oO24NVe7oqLl10cjhE0cNHTLtpznyNh6p5ax5oSLU0fPgpGWzR//vi5HjJ8xZf/2lZQbFYU0zvQ0zdenUyzPq8vM+/2LSkEk7jpq9CG/lvzQBAABARrDGEIQZWddamJEaGmLjFnT3cbCNR4DdU48j+y8tmHto/mVPFcdwW7cgG5eAO09irENLC2oE0/v6+pqcwKchTs6BFm7Blh5hTnctjU+p/nnVjdEqzqQpe49gi8dBli7hXimVaS2Cr5jsUJya89h8t9KNVcdt1N2DTT1CbFyDrMiPR6iNw1M7ratbd2vPOmqvFVsfI5j0leeUuN85uO/6koMW51xe3vbs3MQ1xNrt+f0nNsfOX1m0yXC3U6lbEanNbS/ITIt8Zu1mvnTJ2XFzLm9z8DeOL4ss77iaq6asOOqll/3NLUrqf559dcvVp5ZRuZE1VB1/Tso/M3NT4+r0kYenrb66UffhZc+QO+7BNq4hVq6B9k/tL1w3+WGzpYZXwat2+ton/lHx/1eX2fLSYbeC7qJj9w56hBh7BNt1ds/G47mN+6PjJ2+s3nl73b0sl3TBAJY0Nngd2nx+0tjjs7caKpk+0XsaaukaZO36ysbdz87Tav+ZWyuUnG8nNaUw9fsEp6EszP3I4l0zPx82ctznQ75de8zMtpgqZZ3Bv6Feh5mmvNhoze/2fDf8f1+OGvblxKXH7+klUuU9nzni1pJ04awlv3TEkAnDv/hi2oY5Co5P0yp73oioDn/gc3Tqslkj//PZiDFjv9p0M8g2t+sLVazehpmiuPJ7Ww6vGjt0yg+zFB5ZBIkkZAAAAHjLWGMIwoxs4/GqnlrePqD0u8kKcmN2/GrCTv7PxJ0fTFT4gH5MfsZslvtK/TcHX3okCb6OPicryWnb18r/GbJVbsLOX3bW/IBsyDzeITdK4Rdjjy68FWVeQTWJzPjamqnw+1Zqx+XG7Xi903Fb5SYelFtw96hLRmH3T0pw26nYRx6XT/5mkoLcqO3MJhN2/GKcgtzw/VPOeekWUKV0wuC0Vbia6e3Z/euJO+XG7vzl2G2/GLP1y+M+Kq+oajJVjff1uXBgxFf8Rj6YoCA3RGmIgrVqMi+FP/klRxesd91l8xrLqIcGR1VPyI3cTnpI9vKrjppDFW1PpVKpYmej3CaqzMvu+qX/jtr+6zHbf8F0byfZ9S/Gbhty6sXRUKq2y4ZFjY3++/c5qyrdjXW9tmjzQbnh8swRjVWQG3Fw5uXn14upqr4+Z9JeV1Jis/vK1kljJ80aNvvEIYMXmfQndvpFr8MMVZtF+ahqK84fOnLGmJE7VEyfBdIfXuoJGaPCCLuLF+aP+nrC8AlrT643yU0W/y1GXRW9bHDcvWPlrP998dW06Ye1A5LiWJMJ0cswU5US9OTwjE0z/zPlh227HOoCup+2BAAAgLeKNYYgzMi61sKstPDQ+54hlm4hth4htu6v7L3CnXwinJ68sieL5MctyNI7zi68rPD1mZmG+trcYO/Qh4+DbOg6nqF2TyMePgt74PWKv+gRbOMWYuMe6ZNWmSFyZobWUFCYGGPrHmLlFtxRn+w3yNozwsovN75UwmU4jcWVqbGkS5aunZuQvbi/snKJ8E4sz+icVPJ43Jb89KTQUDuP0PvkQJ6F2rsHuUQWh1d0fDikurg4LtzlWZjNk7CHPuF2rmEuIVnRtVQtf3MyA65MzyiJDCtoKcuIj4uxciXt8/dC9mX1OMwtPD9J3DVCnQdXXpyR6OIabOcWzIyJB/98FxkH94TKeNFPHzW3t5fHxBYnx+a1lKUFBEdYuNAHRcbtlbVrpE9qZRbrWYI3wGltK4zJiPTz8X3u9SIpPquy+XX/+1xHmDl38PLOwwYZlPBHqSTukdNIVSSlRQd6eT9/5h0dn1Ne1T3WiiKNtdUUpKYGPgvw9fYNSwzPbWlokeKYWip5xTGRr54/eRrg75+QXlVPniLxm4lcVcn1TnTTXk3CjEciW5jhFce5Wm6asnjyNwvk9Ryz2/rwznQAAADQJ1hjCMLMO0XiZ2Z6wq8tsgVLA+JWS7NPXk89I6t6Wiv9QYmtyLY1f72gjnT76rJJH+jl0/azkTCT6nFuj9qqdYet/S19wyLCI8Myqos6gqM44ronTZ/fZDtx6yVvw+O21+bEZUQHEVFPdcwvH5r/va4xy5kZ0lpORoCB+qLJ336vuk03PIuDu5gBAADIHNYYgjAD8H5qI2HGW0tRZfrQaVOnjhs3esY3KxaqB9+PlOaCM9nCaa6PNNh+cdWIKVOnTZo0ZvyU78d8q2Psk1rRQ5jhcak6rwhb5bXTJq445qwbQjX02/V8AAAA8MZYYwjCDMD7iczzawpjA4Mf2jrZWVtZ3LF2eOgQXCjVB1pkDJfTWhLpGfzI3Mra2sLKxtrezckzNqmwpqXj/It4vHYqzcT/0trxQ5ZsNX7u1kpxWE4WAQAAwFvAGkMQZgCgi0E2q+/hkrWeVnGplPvhxqfX/6Sj/zwxjf3DPwAAAPAWsMYQhBkAeC9xGlvrayoq6upb2vBxGQAAANnEGkMQZgDgfdTlrA3bHQkAAADgrWCNIQgzAAAAAAAgi1hjCMIMAAAAAADIItYYgjADAAAAAACyiDWGIMwAAAAAAIAsYo0hCDMAAAAAACCLWGMIwgwAAAAAAMgi1hiCMAMAAAAAALKINYYgzAAAAAAAgCxijSEIMwAAAAAAIItYYwjCDAAAAAAAyCLWGIIwAwAAAAAAsog1hiDMAAAAAACALGKNIQgzAAAAAAAgi1hjCMIMAMBbEBkZyTwCAAAACVhjCMIMAMBAI0nGzs6OWQAAAAAJWGMIwgwAwICikwzCDAAAACvWGIIwAwAwcARJhmCKAAAAQALWGIIwAwAwQISTDMGUAgAAgASsMQRhBgBgIIgkGYJZAQAAABKwxhCEGQCAftc9yRDMOgAAAJCANYYgzAAA9C+xSYZgVgMAAIAErDEEYQYAoB9JSjIEUwMAAAAkYI0hCDMAAP2lhyRDMJUAAABAAtYYgjADANAvek4yBFMPAAAAJGCNIQgzAAB9jzXJEExVAAAAkIA1hiDMAAD0MWmSDMHUBgAAAAlYYwjCDABAX5IyyRDMBgAAACABawxBmBlkeMx/aV2XAOBtkz7JDDCmfwAAAIMKawxBmBlcuBSnsaayKq+wuqypvQlZBkCWyGySIZguAgAADCqsMQRhZkDxpIsfEmu111LF3rcuXf9qjeHxwMqAJqYYeiDlmBPS1+xHCKiDliwnGYLpJQAAwKDCGkMQZgYSmag2V+Sn+zk+Mb3reskmQOtJTmJ5TXtj0Ss3H8u7LtpWPhddUn1Sa5nq3XEqqRy7UztUfv35sWWuJY/rmWLoUVtrU0nE0+e291x0Lb3UHya7J5VTVHX6q1BnS1c9C88LjtH3XpU1tnKZ6m8TeYU0lqWHhTiY25oZG9/UN75128Qj3j+tRSaCVi9VJr4Ic7xufttI/6bxLVMrU9uAF3GF5MUtCwPd52Q8yRBMR/uHvLz8hQsX6McWFhZkkfymF9/My5cvf34jQCNPDRlMZqHvCD/pAAD9hzWGIMwMJDIhrUsOcD327eZPhqyQm3hMboevVXx+W0m4znqlscOWy43eLbf24d4H+Uz17jg1VKHHDTXtSYuu7vev8GtkiqFHLbXlsYa7Ds0YsUxu5Ha5ZfYb7qdSVK671uWl41bIDdsgt+DmKK34kro2pvrb1E5RxdGOmufnDps/bcrYyZNnz5n39VEnLe/adu7gSzMZj3TM5cd+O2/m5CkTpk+fNWTG8SNGgdnkVcysf3fIfpIhmL72DynDjKTpLx1dhFe922GGHJqUmA1+HinDDL3HHog8d91LAAD6A2sMQZgZaPmRL2/Jbxs5fqXcTLU/nYl1ymynKrKdjuyfP2253MR9cvsCzvjWMFW747VTrdXF+YXxKUXZtZzad/KfuPtBY3Wx69kTK2cvlxu7S07h6V6vWpJwIs1uKH+78pejN8uttVlwt6i8kQSJt470oSjCVufyD4uO3XY1CUpLiI9PyqnIr24fhCdmqObKgpL0mISEpNRX1i9sjq9arn7iuj8JM7KQGvvQoEgyBNPd3qNzhVhkFV2HPBbMaxFmWJFDkxKzgQRRUVH6+vpKSkp0ZTKALi4uzDohpJy1KYJupAciz133EgCA/sAaQxBmBlpJbITNvu3jp66SW3hpnHHJ0xKKqijyVFNZPHeF3IxDn15K1otiajJ6usCo67o3uxSpFxsNlhm1aD+ba2r8tE5v+GaF3OQ9H5+OuBDBL0y0unlsxeoPx2/9nZLHFo+2quaOquKIOez+GomOMGNz9cqq9VeeFzLzxE6DZfTFiW2J1du1Ufu0nn/OuxVmBkuSIZge914PYYap0Udhprt3OMz8/BhAcgs9SiJIy2VlZUylDqSElDMLUqObYhbE6aFC93Qq1pt1DADeN6wxBGFmoJXEhtvs2zlu8upfL9Fd5NwWWEfxyvM91Q4tmrPyF7OOTTMpuZfJ1HyNx+O2c9raOK2CH047hyvusweva7a3cnjt7Vwuh7/Ywl/kcslq/npBU6QR0QDE4wpXeP3T1s5jOTvA5W8pZhN+eXtHSXsb6Q9Tu0PHzoQ3oauJPzQhHQfRdSsOl984KeaK6WdzTZWf1pn1C1b+YsresXrphvwR5iVYGh5dvuY347b9V/XFsTCqppWuKw6PNErGhCC7bSd967dcQZ+Zuaq7ct1lzxRvyR+eGmQagsuDdbav1zp9/Z0KM4MoyRBMp/uIiYmJ8DRUeObac5jpFYQZSby9vUkjSkpKZIjS09MFhaqqqqRcW1ubLqG9QWYgbZJNSGvMsjg9HAXCDAD0IdYYgjAz0OpSo5+rH5w6c9vvV97cGcSJItPXqsJY/TM/frf1l3POr3hU5lLB1BSoycvy0bu8a7fauJ8uTtugMW2D7tITDrrRtdEtTAWBmtzMZ9c0dyqeGa9kvuBmyu07rn5XLyyTPztss/lizbAoTl1hQZS1qubarWpj1l2dvePhjYiijI4ZtEBhRJCj+tkV28+TfU3fyP+Z+uO5aRsubrBMt+j8LE+XACRYiH7icUN75qaL439Un/bT+ak/nl9rnnw7haISnnmZGczbenncitu7TMN8SCeZDSgq6UXA7SsLt2qQTTr2pT5xlebXSlZa8c0JTA1xsYHT3OprfeO85rgf1adsuDj9p7PTt1werxG63zgg1OSaoUeKSQrV1jUMtdXVJJtpKq3Y+oupJ76xyr5fRcp4JS7mOvLbPxy/b9zlkKs5VL3wKAgjB1jgk/FY85DK/q1bzp/VdnnZ2sxvoF8gzAwagyvJEEy/+wiZhgpPVYVnrm8cZoQblPIyM1JNMJUfREQO9g2oqKiQRqKiRM7jU2VlZXSeISPDFL1RZqCfREIwvPQzIkLSUSDMAEAfYo0hCDMDLi8+99apGbP2fbTSXC27jcz2qZri2vuX5Zcpy03X2RVcHtht/l6Tl+17Q1tpz7lJmy7O3qb2v2nK/56ptt6r1L3b3cxITZ/r2vs2Kn7+zQG5ZXcm/KitvOXQwq0Xvlyi+eVSvXOP3c6b3Vv4tcrctWfHLT37n7HHl5mGmNVRwt9XUxgR7HTx3Oqd6hM3XJq1hfxoztp0btbmU7OOPtxxL+tJamNZt2+3aW+sL4kNt79hsFfpzOwtl6Zv1py1+fysTaozjzrLX3/16s6N3buPy40//r9FxvvvRfhSFH+KzmlpzUt+Ynhzv/zR8Vs0xm++RDYku5ux4eycHZdXXPXVflEaW0O1dDtBw6uvyosIvqepI694dtqmSzPJhpsvztyiOXq35VcbNXYvWj3n4kulYKq5azLhNdY2Pr6uumGv3Dj1Hz1yvDrKqAAbi4P75YafmGUYZtNCNYqJTR143HZ/bZfD00ePGPq3v0yc8cMx3aTaRGZdn0OYGRwGXZIhmK73ESUlJRMTE2ahN2FG7AS3+9yXLuk5zNjb25M6pCfM8uBBui0l4UwiQDIMWaWvr88sd0WftBEeut5mBpKIhD+HQxcizADA28IaQxBmBlxZCvfxlYULz/19g4NpMyePlDSUUX5Ghzad/eXc2+czKsVMlPlXh3Hb28kEvJXEDQ+jOwdWXTjgV9Y9zBD8MyVJXmE3Tn88fYfcPL0h6tFZtVRFiI/B9i1Dp2+Um3Pxw/0Bz7LaWjJibfYpzD/qsNShpqbl9US+40K0dg7/h9vxQ8pauLwcJ03N9UuOD7ucbB4nej1WUehzy707/7357nyj1JY2/gYd/SxwNbq5Z+GOn5Qu/VvR9v9OvIrI5XeX3lNbTkKSwcnZK7W/PODzor6ljpS38zr2VVhe4rZ3yZ6Za8zX+1AJ3Wbz9S+cHC6c/sNuj2MuHeeJSG9Ja83NxQ9vX5Lf9stx2z87G64WRbV0DTNUSz0VdOfKnrNyk/VVwgoi6cL4R14a5z8Yo73CJtaPVKELuyEjn3D30NV1Q2dMmzJyxNA5SzYq2FX7Sb7h3M+DMDMIDMYkQzC97wv0ZJpMmpnlPgoz3fUcZuhZe8+XQskm+uikITbM0MMlaXC6r+1VZhCc2yFhid5QUmoiq8Q+m4SkJ1QsZhsAAAlYYwjCzIAjU/fCZD/feOeg3Cwej/+9l5wWqiw9KjjO7llGQmMrmdl3JXLKoOqFucXR1RcO+pW6iYaZzprZvom3NP72lcZYNR/jjBb+nXBzQxP0jn8+99Tfdzhdiq7hfzi0Jqvs7tlFR2zGXk2vZL+RV3uj512z42d/cyhI84XQNVbtrVRuyKM7FpPkjQ/bxL3MF77pLrcuP8bXxmz/+sP/Xm7wD7WY1MqOtSR9cDKivR7u2Ki7U8/PJKGm24w9PyHQ8uzp2/M2PLuXVFXEFDKqPe5Yn1D5/ak4TSaRdGrOL4p5ZeMa8jCmMraKEr2PMZdDVWQlh8fbPkmNqmqqpgtrC0oS4+97JAXkVJMBkfgpHR635ZnmgwNTRo8Y+ve/jp+x6JBmTG0c64C9IYQZWTdIkwzBHEBfoO+gJfwpczIlHfgw897qvzMzpGU6yZDf5PlNT0+nT9GQfQk/3TRSjjADAAOANYYgzAww0Q/c80+FvE4hHbpVEULyQMnTW3dVVpEwU9YtzHRK8gg11v3DaseDj7OZiWNBeIPztZEbLRdej62kSyqzKG/9lao2X16MqWgQDiES5PvE2Rv9ZYf7WTf+ySRGSwPlbainbfzbs6kv85ldCfe+tTbFWvnAlKWX/noyIqqAH9z4uSLzof1t409+emoWKekm1CUxHg/2ztNQfZbpxpQwGiN9fE0Mf7jke9I+LjwuPTg6LTAq9WVUekBMaVqFIGHwuyDUDZFFssBf6pJeehhzsirXM9X+lMKObSuWHz181sGvubnbx5r6CsKMTBu8SYZgjuFno69BEplJkymplGGmB8Iz455PPkCff2aG5Bb6iSPoJEOXk13QeYbsUeS+z6Sw5zAjaa2ANB0DAGCNIQgzg4t0YSbB/ZWZ3u+VvE57FjIluaFVjleH73+0zKzzw7IVmZSH3gpV26GX4oTDjMRJfXNo4pN7Y1fYnLifQhqlcwO3qb7YRvvmDYslj6nw8o6irjhVJem3z2/Ye+3PJ8Ij8/nf8cnjtFU8MjS4pDf8Wq5blsS9tSUEhumcUrRJU48T7VJVbpbjySNLvt38i0mKv5ms+NEUhY+mKMkNvzD3jM9j4bsL9CFua3tLY319fW1tQ0NjS1vHtW39A2FGdg3qJEMwh/Gz0fcxE/nYPSkRMQBhhj5BIXznLvKYlJAH9vb29HSf/BY0Qh4ICoWvkSPI3J2spWMAQR50/8IWsomggjBmdUd/SAfoqT+d94TPZpD26fpvRmQo6NMvZC+kXPBcCHookiKkyQyCGz0LJxma4HQN2Z3w805KJMUVhBkA6EOsMQRhZnCROsyY6/1+n8/ZJ8VMSU5opePVYSouK+503vhZQpih2kqpBG/d61abTpjtPHuH/3Pu7s6zd/ecvLxMQf3PC+8efZCa29EPorWh7tXV0+fVb6/zoqLE3uGrvoryvHFI7dYfj4VFdIQZLqetyPGm7sEjf11/c/5B870XSOMdexH8nLurcMFGfs/5Nat3/u9kkKKX6J2WeW2tRUHPnG0eqBk9Pm/8WP22q7rxI81LhsqnTBZrPLfNriGpir+JxKDUa2Ja6rvGu0KYkV0IMwSdH7pf4EQKRYhMvntLmjDTfcZMT45J98hvklgE2YMEMPox+S0oFOQZMnenQw6JImSPpDIdSIT3Th6TEjoaCSrQ9ekKgnRB9k4K6VhFFgXBgG7hjQl2JCDpe2bIAYqkESkzg/DhiCANkqMWWUvalBRXEGYAoA+xxhCEmcGlN2dmlJ+d8ez8yEkuCTNXhh14vNw8gynpHmZ4vPbmhuYIn1C9c5NWHpKbdeCfXx/s+FEhv/81V/FPc47IfXP36KP0gs4zMy31dX6XTpw4fXP1EyqSuXytq4ZKytf4uLrpH0iYyWPOzNR6mBse3PfhrAO/nXXg3/PpXYj+fPzV/v8sOTP6fPCFF/VSBQdeRLC16dypl7fdj3HiMllrEEKYkWnv+WVm9KRf5J/nacIzV3rWLmla3IckhRnC3t6eLqHveEaQbgvSC31yiczd6UVyOCQAkJxGLxJ0ZiMHyyx33L2NEIQEeteCFkg5XUG4EXrX3YNfHyLdIO2T/ZIdEeTwu59QIvopM9B7ZBa6osdHSsw2AAASsMYQhJnBpR/DDLehtsLt1ultJz+Ze3WPX9Ljmtrs/LKc/LLMgsrMgvLypKculreGL7E8bp+S13lmhtNYn26mcf3avbVe4sMMt6ai0vaywpEbfzoeTp+Zodo5VIDFQyOj/12OvxVQVFNWkUV2Ie4nq7Aip7K5sknqS7qyo/LvXf3ujPN8s/QmkS+a+Xlk/MyMuM/79PS5qw7i1rNs8wabdOplmBHbeyl31d/e5xsA0GcbxE6XSblgXssaZqSf6faciCSFGUGSoXW01OXjJSS9kBKSAZhlceit6Mf0jkRiCSkRtECfJCEZiV4UEK7zFr1xmCHxjxy14FwWjbRGjrR7oBWGMAMAfYg1hiDMDC79FGb4J1oaytLdVU9t26o7UzvatYbXbcaZUBxoPXm59QnbZEGYoZob2h9fu3HF9EvD8lfFzGxTeNLZXp/7TO3YwvVaf1ENj6RvAMBrp8q9vB2sJ8o/t0xs7qjFrmN2y7/dc5hfjLN9QhJF8Q9daE/87FKbTQXozTtg9ZlaVEMrfeqoT/CoqoTSiMdWlveMbj5wdI1IbW9rYFb1uTcIM+TQy0oyg3zM71jfMrJ28fXNpsqkGFdeXUldtLP3A3Nj8/vmDmGRWZVkfFkCQ2sNlR/w6qndLRNLU5MnvrE55OXFvBJ61rswQwahuCD5+VMzc2sTIzMHT7ugioLqPnxCf65BmmeY3r8pMqkl805J5xnIKtkJM6ScWe4gdirPb71rYVlZGZm7kz3ShCuwhhn6VA/ZEbNxJ34T4ibrdLk0mA1+HrEj0DP6bBXdB0m6h7ee0VsxCwAAUmONIQgzgwuZ0pV43e4IM/5lHpLm1IkeYeZ6v9/7TK3LZ2auDDv4eHnXz8wsV7UdpplQxT/70VZZGK2z4dQuNedzuVSJ8BSVR7U21HNzfbzvm4xcanXCPlVwmRnV1kRFOpjo3f6Dspd9ZPc7AFTmJfpf2rRvyPdafz8VEVXYEWb4k++McB/nbdO0D9tEOtOxpJv21paGmrqK+ta6VsEEm0ztX147or9wpqFGakUEUyikML7GTvebE04zDFIb+/DMDI9LRRq/uPj9xHGjP/6/r+av0jAvqc9m1vW5NwgzJIMEBtkf3Tps+IR/fzxx+Z7t9k3hnU97D5ozA+Muf7t9wZB/D501ZI6a1sOYfMHTKkl1OuW679ymaf/+dOwXn65T1Hf3lvD0iepdmCFRLPC5pcrmL4ZO/O+noxbvWWmcEd55rzwZMRjzDNP13iOzfHo2LCnJEGQtqUM/pifx5De9+Gbo/NBzI30YZsiOBBdrCaPX0leRqaioSLrMjN6FWGLPzDDrpMBs8POIHYEekMOkP0RENnRxcRE+qUVWkWMnMYYerl49y/zj6aMjAoD3CmsMQZgZdGqD7lqdWHPx+Kv650xJN1neydb6vz/w4tLzzk/lZ7+qdLw69JDHWluSRDqUZ5Aws+yUw8grafTEv7k413H/3m82a3+un50pNEXlleS80Dq1YZ3C7+cck1tofcYrX3glxWuO9XA5tU15weWXZ8OY0g6NMY+sL27cs2br2b9ttvjHybDogo7LzDpwc2NyDC8tWqU77Mgz147Za1ec/BDPazuPf6MecNxf8NX8ZLchJufUJ36p/Lt1Tid8i7puVZwe6LBv7uFlOkEX0qjWvswy3HSbYwYbhk+ZNH7IF8Nm/bBV+WF1QAmztq/1PsxwGqh4Q7eLqyaPGTd62Jejvl4/7egz7zixd2MQICNanx9uZ7Ju6oopw4eOnDxm7NJdhk8fVVGNPY5bfU7My7Pzd387YuiIsaNHjF18xOxyuFRngXoXZniNVOPjp0Y7F48YO+qf85fuNTAta+181cqQQZdnmH73EpnI0tPWHpIMQSqQiS/9mDXM0ElAGgMTZujP7quqqgo+VEMIVyDoE1PCNwAgBLN8+sxMr2b2rMR2+830tin6qjlBVBOLDngEsywF0mavugEAQGONIQgzsq4lJynuue9Nu2fXrH1u3vcydnTerXh+1qwDM88+VLjzwsju2U2bp9ecXhk+L8yr41GNtWkBfh76uvt2H5dbfGPuEVfrJ6lRrRS3OKLaRmPIT1f/Le9gZB8dXNVeW5dLueqs3KX1y7WWGqavAnIbMtoak5/eO37k8perbqrqu5k6+RnYPjNy8Ne8+UBBWWuz4ol5Px771dQLs/bbaHnGeBW2FnbOSRvzM6MsjHacvLPyrLO+zTOj+76G95/cvH9/v5r5FgXD65p684/Z/PVEWBT9mZmOqTTVUkWleRtdNFy220De8uk5Bz8j22dkdwa2Pga2XsYOTicv316303i9cZxpTHNnmKkjsxcDDb0Zo4/NX39l4+X7J+19r9n53LT1NbD1vuVoeULXZImig65/cRSX7QxDb/B43GLn0+bbR48fM+o//x4x4/tdR31qXvXLHaCJ3oeZ9kYq566nzk+zho0Y8eknI77aMPdcqG9yz9fBkRFtLYl+YLdt6sopX3z65cShY9ftve37rJESjLVYzflx8To/KH8//NPPRw75fPJyVQv9VKqilVnbk16FmdYaKlrP9swPsyZMGT371AHD4LSO008drxvZMrjyDNPp3iPzeJFPoXRHJqmCUDHowgz9WSDhJEMIV6B3RKoJrrwij7t/1l/6y67oRqTBbCCE5AdmXSdygD0gm5DfpBq9uTToZ1BkGLvrbbP8vvamPgAAjTWGIMzINh6v6qnV7YN7fj9ll9zYnb+eqPDribs+nKL40bTdH03e9eEksqjw67Fb5L6++JHKS5/cdl5BqtNhpbkLtspNUPzdVAW5YUf/tdRCp7i5qD6l3kFn/vI9cp/v+2ia/qGwkjheGfXUUHn7AblhSnIjLv9oEePD319NnKv9oe/kP5m8Q248v/Ffjtr04RLdYTfyQ+LDSvxvzZuv/KvPdv5t0RWFgGr/1ydaCF6kmd6R1RtIl8iGvxon/8ux24aqBR1/3sbzNrmkbfaHY2HhHXcz66IpMsHNcNqs3R+NkP8VOZaOnw8m7pQbufGTnTabfKm0LtcwkTATom/gvmODbYKrkerpk3Kjd/xi/M5fTyLDsktuqPKIPffPZlKZfZhjaDwulWwVob/h63mzhw9btVLewLG2ofPre/qcUJh5kupNjpgdiQZREe4XVaZNnz9q+IKtx4948mKl+FLPtryITOMfD66ZOmrqkinLrt18mkw2YjmhVZdD+atd3fv96HHzJo3ffeyObzB5Dpl1PWrsRZhpry8vtlG6unHsuGnzZp1wvxHQ7WUjSwZRnmF63D/IJJWeNxNShpmeg4o0+irM0GddhPtDn5oQVKCzSg+JTnBHAeGEQ5BysZGgo22pMBsIoQ9HSvTgiB2BHrzxmRn6qX9jP/8lAQDvJNYYgjAj69rK8nMT4p4Exrq+iPUIID9xT4ISvF8ler+Me8JfjPV4Ee0anOaZUFXexKOaG4oS44Jexbq9TPANifd8nuQdlp/R0t7c3thekh0RleDmn+AZmJVY3VJHppQVecnxSZ4B8W7+6RH5tR0TYF5zRUl6eKxvYAy9O3f/KM+wrBd5nPrmBqq2ICI88alfrNerzNjKttdfuN+hsTA7NSrKMyDW7UWs+4sY9+cxz7ObMssaqQDTc5pmvz0cEp7X/XRBfUtlbnBQ3BP/GHf6WDp+3PyjfOOL4mpEZr0ckrVy8yoS40taK/PS01Lcnse48zsZQzZx9Ut4kVCS2dbxT/h9rqm4Pj8+PDzs5cvYmIT8Mm57v+yFryPM2Fy9smr9leeFIpMgCWcmSHF9XUV22qvQiKCXEQnpaZVUvRSfyue11LUUxKXGvgp6FfUqOi+/spE9BrY3UzWZuSlRQcHhIcHJ6UVVtaz5hxHbEnt910bt03rsYaatpjLBYN2pb8dPnLrjyNPEgD5Pp31tsOQZprv9g8xE6XkzQc9oe5iYylqYodshSKohvaLrk2k6+U1XIBN3ulCArCUlwvFGkH/oRgj6NA55wNQQQsrJ5sxC/xM7Aj2jO0827NVnZsgiKXxjYscKAIA1hiDMQCcyK+7dlTydtXu4D3BrFfX0+nF1s7+djossEP10hTR7612POrzBJj0T0yDrrY/fEH1mRuvSt1/v1bpz2dn/mbe3X1RuQlFbDzsUt4qtf2LXs2zU603q8xMzQjx9fXz8Hl93NNi76Idzx677Z7OFmcaqONej3+38atG89eaOWRViv75I1gyKPMP0tX+Qmahgdk7PaHuYmArCgzREkokwMskmFYRPINAXjImcHhE7leefUxA6q+At9O3+pD5ZpJui15IG6frkoGgksdAfkRe+tIx0lWxFqnU0w29H0skcuoI0BKP6c4gdgZ6R0CIYEEmkv6wOAODnYI0hCDPQjzjVZXnmF1Qu3B1vXBxfJtVdfN9vJMyUxD7U0fhm9DdTJoweO2bKtBmzDjpoPKlp57LEExmU7qxpsmnYVzMmjRk/btKUOSPmnjphEpTTcYpNstzqYovLy+YsW6Tyo0lOUpfb6sk02c8zTEf7B5naCqbdZK5PFslverG7vgozA4YONiI9IdN9uofMcm/QG0rjbYUZGgl1JLYJpxoS1UhrJMb0/D0zAAB9iDWGIMxA/yltjPdQXnJ25RmXCwXtRcgy7Ehiaa4pSE7wc3/m9vjxwwePXVxcQ7Ki81vZTrXIotrsmGR/R3eXRw8ePn7s9tTtWWxMZnmj+FM8nbgRZWHndkyd8f1PGmrhvM57RgwOMp5nmF72P9YwM+jQYYCkF2a5A31eSEVFhVmWYW8cZgAAZAFrDEGYgb7A47VVFOWnpjwPT/YNTfYPT/WPSAv1dbW/fXPOT5b77idE0fdfHoQz8oEmeYjei8FrSqiKNLu079g5/ccelVRV391ie2DIcp5hugi9R8czJSUlwedh6HM1hMg90AAAoM+xxhCEGegDvHZOpftdg/3Kv5uqKDd+14dTyI+C3NAj/11+RyOzIpapBcCG185rb2lubGxqbm3jDcr8JrN5hukfvBEXFxf6/AZNRUWFBBuRD+cAAEB/YI0hCDPQF3jcprTosCceWmZu6iZummbkx/X8TT8D5+R4Hs7JgLTejZeJ9HmG2QAAAAAkYI0hCDPQ/5Bk4D0jZZ5hagMAAIAErDEEYQYAoO9Jk2eYqgAAACABawxBmAEA6BeseYapBwAAABKwxhCEGQCA/tJznmEqAQAAgASsMQRhBgCgH/WQZ5gaAAAAIAFrDEGYAQDoX5LyDLMaAAAAJGCNIQgzAAD9TmyeYdYBAACABKwxBGEGAGAgdM8zzAoAAACQgDWGIMwAAAwQkTzDlAIAAIAErDEEYQYAYOAI5xmmCAAAACRgjSEIMwAAA0qQZ5hlAAAAkIA1hiDMAAAMNDrPMAsAAAAgAWsMQZgBAHgLSJ5hHgEAAIAErDEEYQYAAAAAAGQRawxBmAEAAAAAAFnEGkMQZgAAAAAAQBaxxhCEGQAAAAAAkEWsMQRhBgAAAAAAZBFrDEGYAQAAAAAAWcQaQxBmAAAAAABAFrHGEIQZAABg4NtvAABAprDGEIQZAADgI0nGzs6OWQAAAJABrDEEYQYAAJgkgzADAAAyhTWGIMwAALzvBEmGYIoAAABkAGsMQZgBAHivCScZgikFAACQAawxBGEGAOD9JZJkCGYFAACADGCNIQgzAADvqe5JhmDWAQAAyADWGIIwM6B4POZBz6SrNeh1Ocx+Puaft6+y/PSg25cstBxS7LOppnamdPAZRK8/yV2V8iBkBr+7Err8lo9EbJIhmNUAAAAygDWGIMwMsPaWhtqirPyUtNyYjOLY/Prq5lYep7EsrzA9LTc2vTA6t6awpo2p+85rb2ysrUrLri6uaSHH3I8zOx6X4tRVllem5tRUNXN6GUZIv1Ii/G4t/GLdcIWnO4OomlZmxWDEbWlqLC3KyMqPTimMTysraGir53KaK0rycvJjUgtiU0qzKxprSTWm+tvE43GbKvJLs5PTUpKTkxKTUjOT8qprGjnM6kGEy6Hqiyry0xOTkpOSkpOTU9Mycotqmuvf6ihLSjIEUwMAAEAGsMYQhJmBRKbFNWmh3uobDk3/evfvl2j+7XDAg+T8tvLom3tPfzd/19++O/XRbo8zHgVM9XdebVjkE7t5m500XTOLSLRhSvtBexNV+sza1Gb2NleHpIpqplRK5FlLjXxusnjEhrF7vHcHD+4w05wWHa5/7ocfD344VfXf841UQ4oDm8tS7uns237wD7OO/mX61S13I7woqp6p/jaR3B9/59DVrdMWfD1n1vTJ077fNEPF1T2ilFk9iDSVU8FaFqqrJk+bNWPm7Fkzvvl2yS419+Tnb2+Ue0gyBFMJAAD6lLy8/IULF5gFkBprDEGYGWDczJBnmis3/HfoErkJx+X2hdgk13LLkkwVdk8e9YPcCEW5LU8OuZcxdd951S+CnG59Ov/OYdvkvP4NM41U0aObOkb/XmhrGl1awZRKr6okL+aBudtd7xyvQqpl8F5mRmRGZBoenzRvo9w/FOTG3VB5URTfVlphfXHrys1y/94q97nmcuPwQDL9Zmq/TZymulCtleqb5ny3V//4xesGJpbXnOMT8mQhZ/VSWz2V/SzU5c6Va9cMjDRUFTatn7HoiH2kay9TdV/pOckQTD0AAOhTCDNvhjWGIMwMtJLYCNv9OyZOWyO34OLQazluBRRVWfTk7KEl81bJTT/0D7Vo7VeD+V/+e6UuKMzl7uil1qcfpBV1nAHpL7xmqtTDXN98+Aonq/iKGqb0zfC72Y9d7W8lia3OOt8uV5QbeeQXKxz0wqtaeBWUj9HhHXvlRirLLbiz1z6luF+DpdQ4TfWhOqtvnFE54kulCaWrQf6ZmYYMLzODFSsvO7+dMMOaZAimKgAAsCHhhESUHlhYWDBVEWbeFGsMQZgZaMUx4ZZ7to+dvPKXP2jPs2n0r6J45flup1W+n71cbtaRsfr5JslMTYYUc7c3nt0JNuxFCxKq9tjNLuteL3DDE59ajl12X901t44pEtXbmatI9deL9V42xvdGrnrkmFEvaaYu3a74tXrZqS7eZFsJoyBNU6KbFic0O2otXKIgN/GknMIz2/hGqr2M8jI8sE1Jbux+uR8fnXbPZ2qKEre3NzkYaZEwE6az5sap/YeeUvFVTOHgV5Hkfktv+UpN50i3AQ8z0iQZgqkNAABsEGYGAGsMQZgZaFWJke6qypOmb/jt8hsbfNrDWsj0piBI+8TKBT/9cs7p7+6XORYzNQWaKsuTvD0trR5dMHHTNHXTNCO/XTWMHxl6pT0tpbqfxylNiH7h/FD3jqe6Rdg9/5xyqjw7O87ptsu1267qt10umz+98bzQv4ipzExH28pqcyJtbDy1jFyu2QfYp3CTCuoao/3vO7ifNXYhO71w64Xpk8w0iiL9FZnCdi41NpQlu951v2HscrGjk+o3PfXsI3wqqEqmQkdNMrluzsuOe3XLzP36dcM9h9X/OU9jvoqFqqXnJXN3Lf6huV26/UjLMdw0oq6w20ekW/NSk32fXL/nfv52xziYkcqPL9/xvOZfHNA5bq+n79wWqi4tPPDldSPna9eurtpx4R9fa63TcFCzfEI2vEw2N3HRNHHVdk12TGxu4nQ5Kl47pzElIsjD45Kpm/ptV1Jfx9L7blDRyxKqVfLntjubKE8ODrYyeqRt6qZh6qpp4q5u5H3vZV60SIriNpBXg+8T3ytGLjr3nt55VRZQRDUmh4d4el647aph4nLx9jNd69jgyuZaZoMuOvZVT9Ukujzw1r35mD8api4XTZ5pmkcERUfH5STefJ4fkdfYUVdIVWqzl/7y5bvkpp/706kolzQOxaugQu8c37VPboKK3N7nWs8l54a2OqroVZT/Q0srBxsrv8Ck/FISOZh1fY8JMyf3qXhSseVM4SBHXjql8S7G15avvDTgYUbKJEMwGwAAwM/w8uVLhJk+wRpDEGYGWlt2XMIN1Vlz9/xxjemxhLYEUlRTXGChsW2Z0i/nam31LfNppiu+Vpme/OCo8vxvtspNUPzNZMUPpyh+OEnhV2M2fbLT+kc3bky3eV68wz319Rv+PmWr3NgLH2+1dy32u2dv/PWoHX8bp/DLCds+mqrw0S63rQ8qaoVjUGNC/nOTRT8c+PWna389dc94g9yLjvEBmkfmL1aUG7fzwym75D4/8sVPVrol9SnMBkLItJpDOh333OvO0im7/zlqx6+m7OJvMlLxH4t1tnoVe1RQbe2d83xeO1Ud6Gd9dcxUxd+N2fHBJIUPJij8ehKp33Fc5Gfyrl+P3fK7NUaTbxWGFYlOleuDXB+e2v+fOaRXzCa/GS//0XTlP+3zUnatqGvuGhfaa6lCt5sXL3wyesdvJ+z8FdnXRIXfTH69r99M3PHhxB1/UHBe41hV0dQlo3BbW8oe3dbZs4cMuNxExQ/Gbv3FyI3/O/H8YAjVZdxE8Nsob2z2u3rq4sQh8r+ftOuDKbt+M0nxF6P2TTjx+FxSe5rwJz7aSqkMx9MHT//ly82/GPbTf494b3lY42+oc3ybotyEXb+atFNuxP6PJl3Z45vxXFJmqEnI87+9bOXB343czj+cKTt/Oe7QbyboHtHQPHVHX26Xt6ZXt2TcltuSYC2/VunPczVG3Mh7kkuKqqn8RxoqRz6edPiT8/EGkZIPrzqD8jiovnXGf/83Ycjn65UMPX0oqoFZ1/cQZvqQ9ElmgDH9k1pUVBSZDWhrazPLMozMYEhXyWyGXiwrKyOPyW96sZ8MovEBYQPz8nhvkb8LglkYQG8cZt5Wh/tEenq64P/3eiDlUNBYYwjCzIArTmy0uTB9+pEPlltcreZkkZK6Esr9yq7lh+Qm6h1OqIikqwlpa2osS0+Jikr0CU32DyM/qc8jEoPigowNzTdvuLzsRoxhFP98iUBDeXleTEiY+235o5f+tkBt9pITK0/aKj1KfxCcGRkf7BNitW796Rnr7qoGUXGCq7vaG1prihKSc2wMzQ6t3TJ7o/onW0y/3ONo8Cg8MjHreUTqo2s3VHee/HS/p3pgEdlIcBaD/6A2lwq2Udpzdsz2m9vskywC04MjU56HpYbEP3f2uLNu5ZmZyo+2ezWVNNAb8ShOTVVJwavwlAhfJ+Prep9/a7D5yjOn+AzfiJQX/KNL9g9NfB5XEFbQUtsq2A+jvaa8LDP1ZURy51AkB0Zn+ATH3zirs0H52uzrcc8zhWbXPA7VUl6Qmx8UHB329N5R1Wuffn/7pP0r14QMsmHHvpLIz/PksrhSTpvI+RYet62sIDclhdQMiMt56OCqtnHbEo1nSj3cmpl0Nj8o0kp/2qoz8867nfDM8nqVEhSR9iIiLiTOVVv7yoLvL36ll2gU37knXivVVJqXV+j52EddftfSdYeGbDX6eJu10s3nIdFpwfHZnnbORsqHJihYLLublCVyvRi3iaoMcr55Z/WPBiouoabxGeRwXkRmBAUFv3C6rbRtz59nHJBb537pWbcwQ5W0VLvuW77zy+nqM2yaffjryfPpf/XI4ZHD9o65UWSaRlcToyE3JuT8N7u/GzFk+JiRw8YtOWquHUWVdcvefQVhpq/IbJIhmC5KjZ4cDIp/2hQJMyRgkMX+jhmDaHxA2MC8PN5PJBWQsSUGPh68WZh5ix3uE0pKSqTz9vb2zLIEpA7CzGBWX0xFe2pdfqh0M/QFt51/TU9LHZXiY2vsvEXd73F5Q+f1X50kfF6CqAxwNpNX/FjZc51T9xt0tVHVHje1Nf4948iwxQY778R7vP72mvRnmufkf9QYpl/smMZMrAX7qHz1zEJx69jFR/++w3aVRXaG4Aqn/EC/W1dHzLuyzSQykKKEZ7AtiaExGhd+2Hl1zrWA+zXCd/Vt5jWFm5/VWrzBYIZqgEs6/wtMuuBFJHtZjlt+/6J7nqR/4Jd89F1UPr5xcq+q3E8et0O6/MvW660bvW1v3Ru16vGDzEZJTQrtS7QKJy/V4+iuHVe890gOMzyqqfqh1Z3D54Yp3lHyLghhimklKS+dTytcmLTVbued5JTmrhcH1pT4qu1fvVzxT2v0p+tGOyZ1RtPGnLInxstXXp6x59GDam6XexJzaql8e/XDV/485d7t4rYuo8eNdja33Hjw3rpbcZ4p3a9Qq+dwk5xuWly47H4tikrlp1myu0y/B46XzthcDmgKknyvt+b82JjL3+/5fvhnX44c+sXEZSfuXU+iyns4T/XzIMz0CVlOMgTTS6kN3jBjYmJCFslverGfIMwMGDJXI0PNOmPrjs4tIvPUgXl5DCJkQkwwC1IT+6Skp6fTrZEHTNFAebMw8xY73CdUVVXJYXp7ezPLEkgzFAKsMQRhZjDLC6txujri4KPFJt1e8ZxqKv+R5qFzX8zW3OlX+Uz4Vrs8LhXl+Pim/q+U/Y2DRCeJWc9cDHft/PM2+5+s+VcgCWnITwq6uEpV6aqPbhFVxVzPRSZn5aEuT48tua4Xli3utCK/wnNL6yPLz+x7kv9AZGpd8/LV4zujl1qfckrN/zl30OJxqEofFwvzYYvtrvnnlXTPIu2NVLG76Q2z4SscLWLLBZ/hkV5ZYozDQYWtus8kh5lmbnum2WHzEwfvW7dzRcauQ0tzQ4rxbvU9B++dSqNShBqpyc10Oa48faPufy7EZlUKt97a3p5197D2XkXj44ncaOEE2V5PFbpe1zYbvdbZPrWSHBGPyyM/XPLDkzIA9l5tNuV7Unv3gmEjZ44dtfOQ6TMSa7t9KKfPIMz8fDKeZAimo1IbvGFmYCDMDBj6+RWep0qJPDsD/8IYdMgQEcyC1N74SeknbxZm3hO9GgrWGIIw87Z1n3mKFvQwN82i4iy/VbBerhlOZs/MSRYap4rKc75wymD0Sps7WY2FTGlH2+R/sQ/cjQ1+oeRn9FL0Ct2Mp49u7VGcoxN99hVT0rn7psLUEM1VJ5SuPNMu7AwznBYq3cPy5r0v5T2ckrtNzTr7XfrcxfHo8QX60WfDXp8e4ut9mJE8FClRXo6Lphte8EwP797UAISZ2ixOiM3ag7aLLoVJ/NJTbk2cwWW1k4ZzbCsCil4/XdU5GY+OKq07abv0EaeiywWDbTwq1/KI9r5dRkcTuJFdLuhqpziVJcHejzS1f1DUHLNZc+62y/O2ac7adHGOvK6CU75z50GyJhu29UI4TVRlSkZcsK9foL9fbGIe/+tH3zyCskGY+ZlkP8kQTF+lhjDTM4SZAfPG82aEGWmQISKYBam98ZPSJ7pHl+4l/KMS8ra6KgvI4SPMvG84VG1+clySq3+MR0Bsx0+cR2Cir4+Hk6XBpJW3V6gHxXS99Itqq6Jync+dvzN+s7t3cX2Xfz7ncalIx0eG+h/sfd79zEyap7PJXqUfLXKuidwhmqrPT3yp3nFm5koRVU3PYVsbqRem17UM5Q6FPkmSdHdlqjniadDVk5MuBO/17FrnTc7MNHFrC8JD45/6R7szQxHvERDtF+2urXtr9rgrxzxSySv1LYSZgliO4+UpR5wm6qdRgrsddMVtaa50vKp18cbnV3K8Ml+3UpWd/vDIbiUt111BVEmXZ7GlnZN557C2sqLxiURudJec0xFCajN5AZby+zSHrTg7+acL/J91pyb/dGL64Ue7bQtCSinmY0p9Q1xb/XYSiECY+TkGRZIhmO5KTTBZLysr09fXV+q4OFtVVbX7JQ3p6emCCvQmLi4uzLoO9LxH5IqU7pMP0gK9O1JIt6aiotL94qKoqCj68iGC1Cft0O2TB3SF7hfASNkyOTT6sg0RzOqu+mp86HJB5wn6On7SQ2aZjXAHCNK+yDUz5KgFxyW2hz0fOD2epIcEXY3si+yR7Fd4W1Io/GzS6L6RY+E31/FJFZGLvshWPTw1ZI/0hsIEe6EHVrhxUp9eRerQhcLotd1fHgTra1h4EMhauhrZo8hQs6KPVPjpENkR/domD0g5fWikVyYmJvRo06TvDKlAN0iQdoSHiBBsK4xe1UM/SQt0oTDBk0L2QtCPaXRTgqeJNEUWhQ+HfsGTQvpZEFQT7qoIug+CnRJ0ifBgdjTzmnBlYSIdFow/GWS6z+S3YFvyQFAo8nfE+swSPf+hEaSRnv9eRNC9Fakj6CQ5LvKYtEkek+eaWc2GNYYgzAwG9UWUr9HeHSpyI7b/aqLCryd1/kyQ/2DSbrmZ+kuuhiWQZMHU7sDhh5nz58zGbXBxL6jvcnlXz2HmyUMTZaVVZhk6/PusCRMbZpqo4HuGusYfHAhyT+z+8QxGfegTf+2T0y69Oujd9aMxbxBmWuLz/G8v+Eb5d8Pl+XcnEwzFpO1yI/Z/MOHaXp+M4LcSZooTOI+vzj7iOE0vuVVSmGluLLa9oqmuP/xG3rPs1yepqjvCjMKlR9tfUMVdvnu/pzDDR57Kdk5ra1tTS1sz/6e9nWpsacu0Oae+be355Q9b3EU/gDWYIMy8scGSZAimx1KjJwfkTZG8I9LvhYK3YeGJIHl7pgtJTeE65C2ZqdE5syS/meUO3acjZJFsTrcgeEAI7468bdP9oXdHP6ZrCqY+3XdH16GrCR4Qwi3TW5FmyQMyd6RbJnMF4XaE9dX4kBkPvZZeJOg6gsNhRdcnDdI9J4vC29JryW96LdkRWRQ+KPKY7gBdofuB0xXoWSZZS46CPCDIA7qQPjS6kLRAb0WQualwa6QyvSjcPbJI+iboJP2AoMeQtEA2pBsnv8ljgt6c/CatEfSB0z0hBGtJIX2wdAWCnuuTB6SQ/CaPadK/hum9kJ2SauQ3eUw2EZ6X94zUpLtED4hgtIU7Qx8svSPhgSWbMDWk7gxpn79lx8CSOvSuCcEkmzygmyLIAxop77mfPTwpBL8todm54DVA95PeiiBdEnSVbEtKyL7omqSOoKuSpvL0JmS/zHLnmAi6QZBF0hSzIBl/N0IdpnsoGH/Bi4EMAv2Y/BYUCvKMNM8s3UNSTbgCXZ+uIM3fiwi6t8IV6J4TZJWgw/QiU4MNawxBmJF1bWmvAk1vbV97ful5q21O/ldtnxnbPjOw9TGw8zO5Z62joz1k6e3lmq9I9Ogy1x2gMEOfmbnJembm5c8/M9NSS6W9sNPTW6GgvuCSu7Kpv7HdM0P+UPga2HqbOFvtP35t3IRrR5+mBb6VMMM/M6M15YjTpN6fmRGEGXkpwwzL+ZC2yhSP+7duLtriruGen8K/F0SfELdTmTozI6Evb9JFtuMSt16a/fQyzEjqRo+7GkRJhmA6LTV6ukC/F9KzQIKeeZO3WHoiQn7Tb7fC03eyoch7MP0uLnjPptHtCxeSRYJsK9iQNEtKyNs/vUgIphr0IumA4M27h93RFXpumawluk+w6MXu6ArEzx8f+qDoDtMdExwgK7obkurTQyG8lnSJnnUJ+sw/7B4PnG6EIO3Q1eh/SqcJxpmOBKQpepGgj0swdSboDYWHnd8E21NDd0CwIxpplnRS0G2i+9DRHRC0TBNpTcrniN6KEAwC+U2PpPAB9oyMOXm1CE/Quw8I3WdC0B/BaAueMmk6Qz+PwgNL0ENECumtaPyGhGbzhDT9FBlGgY7GxGQDwR7pxkmhYFu6q4TwnxJ5ckmJ8LMpjN5EeO90f4QPliySvTMLkpFqBLMgbvzpQSPIuAnSCx0UBX8m0owY2Vx45OlDEP5Do3fd89+LCHoTwVHTbZK9CHpCSsgiKZRmKGisMQRhRqbxeM1ZtoYaWw7+/rt7+/wKM5higXwq3X7ltnurzgW9nTDDaabinc1vmP9zl/fDJIlTs4oAN9czqvOuRZx82fXkQvXLV4/ujFpqc/pBWhFrmCnPbrS7uOFH1Y/W2agn8/i3tO4iO97fee2Ea2puKc/Fhxk3EmaGrXxgFV/+Bv8gzh5mKtM4fmZLVOzma0VJmnhzW+tSTbTPqxlMuVPin/+6j70OM6QpTlttUX5BSXVuI9Xl2z6Zx/nZSe4/jdJQNgx+3IdfBcNtpRqKS/MzkpLSkpPyCiv5ly++/uhPX+v9mRly8K31JXmFaYmpKSmp+ZWFtVxuj/N+Gq+hvK4oLT0tJTElLzO/urFdmo3aOJyq0syMzMTE1PSM3MpW8a8KUb0+M8Mj/xdQkVeanZiampqYnJtdUN3II3/AEg2uJEMw/ZYa/b7Y/X2UnjPRb+rkfVfs2yT9Ti+YiIid99DtCxeSRUJ4QkDQ78T0YzJjII9JCb0oQM97BO/o3XdHFokeWqY7IzJzIiXd9yXQh+NDjovuDGmTPCCE55o9o7shaaZCd0akNXp86LmaNAdO1xeedRH0LEow4aPRu6PHmX6yyAyPXiVAbyh4Lshj4UUa2TspZBYkvH666z4U9L5IObPcQaS1Xr2GRQaBnuaydqxnpAWCWZAwsGJf4T13hvRceFGADhLCM2aySDALkolUo/vQvX3haoI/WJFXIJ17BX879BNHFoWrkZcEKez+vNDoTYT3TvdH+LnuYXNhpBrBLEgYf7qO8KtU0v8XCaO3oh/THe7hD03KvxcR9FrBUdNPukjnex7J7lhjCMKMLGvl8XJsT1/dv/2GSmjDS+HvW2Rk85Jsl229u+r8Wwoz/NRQEODkrrTIwDAmP5ou64LMu+pCbG1Pr1BVcMmxFrntb1VgyMM7I5fZqT1MLxWaFoudSlamJz0+unu7pou8L1Ug5hZa6RHeTqsnXDsjKcwUuZlcNx+66qFtYrnEU0gSdk2whxmqgduUdH2/2cGDTg8pqoQUiLbVzmnNvrf3/N4DZgfjqQSh0PIGYaahvMRbQ/XkVec9IVRhl01o2Wmxrj9N0Np/65VbH95wrD6PennJ4MiqaTMXzZmpomb9IoyixOy8j/Q+zHB4vEx/PRW17yd/9838hUetz3vWNrawB5OmEFPfi0uW/zB/4oL9G44/Cqts6Jq5xcqrLL5/fdPqnyZO/Hb5WiWrbLccZkWPeh1m2ttaEy2O3JCfvHDhwkkLjiiqu8e3cCR1b9AlGYLputTod9/ub4HCkySx752EyLZi5z10HeFCskgwC53od2vyTk8eS+qSyDym++7IIsEsdOrecg9Tje4kdeYNxoeg+0wT/OuvlOjpKZkLkhmq8HSQPKYbJI0Low+cPCB1pDlwUlNQX4AuFIw5jW6ZLhRMWElNYXTgEWxIHhP0YwHhp4YgW5FF8pteFEbqkKPuaJi50kx4VIX7I0BqCrcm5XMkshWNriMyeqzI80IGhzRFIy0QzLoe+yxIIPQi+U0v0kQ6Q49z90lw923JIsEsCOm5n3QJ+c0sdxKuRgdFkdBFE64mMtQCpJAcBbPQFb1J970LE9tmd6QawSxIGH+6kFno1LFdl8IeRkzk2aGREsEfmpR/LyJEeiu28wQplGYoaKwxBGFGpvF4lY/Oamz/SW26bbFPl/kcr+i5h72+rvzB83/7zmT1tejOewELpm7NVKWrtsa9iZs9n9e+/vp95r/Jj56ZGn1wMNgyRjQhlTx3sz6g9KNVoWHnuY/OjMGpyQ3XWXPqoGHgzdrXwYO0WZ0aEXDtxo4zD/Y5pyUyhQLNxX73zp8xmLvP3TqhTnBTtU7REc/Mp009s1o73L5L3spJDXp6UdP6iF2yXSIzG63NTPI5uWuJ8t3ZJhVdbhdWX1z1wvnG7RvfbNL4YsIN1cD8GGaF8DU6zVT7cytDvbFTNJQflrx4/XX6XKo1ydfZ+ZTWA1W3wud5zAqhDRmtOcnuRxQUbrxQEZfY6A14VEOOm5O5utHyS/4mqTWi39dSFB9qe2PF7rtbb0S+ahD+Nh6KW1Hgpbp7r6777jDmLg6kvc4+FN4/oXtI2fRcDiV8Xq6+tMj1hNLy5Uc+UfY1SOaIfDVmS5KLvf5lkmPPueWRMReNdm+qtTA+7fqyfT8M/+TT4Z9/Om3laatbOVTl68HsY70PM8XcQnvDPUu+//zfI4cP/d/8Y+s1g9IaWC+yq0i4d1x3yZcTRg39+LO5M5edMY6pYGYrPagLKHhyeNOcSSM+/njE+KkT9z/S86lhVvWk12GG01b84tKGI9P/PGLYF8NW6O41y8pvFfrjEzIYkwzB9F5q9Ltv97dA8v5Kyslv8ljSe6fItsKbCNB1hAvJIsEsdBLeBf1+L6lLgm503x1ZJJiFTsItk1kImVWQeQN5QK+luyd2HkajK0jqDL134V0I674t2S8pIXqIT5KQbQWX4JPfggOn9yIJPX2X5sC7jydBF4ocmvDx0hUkEUyy6UX6sYDIuIntAOkwnUNECI+q2PEXaU1sHYKUCLcmtg8idaRBWqCfKRHMaun6LE1nyGOCfiys+7Zia5IKPfdTbB8I4WqS6hDC1SQNo3AdEfQmYlsWIBWkeWo6dvJ6L2LHny5kFjp1bPe6kHSmhxFj/UOjx0oSKc/M0P+uIdJ5ghRKMxQ01hiCMCPTyHw8yf7WKeVjv93ifPFhckVFVXZBWX55XWJiusXpM2sXb/7jzD1y03W/UvN5WliV18pt6pgCtzW11BWkFodZ7T9sMGy1nWlYTnJLWw2HP5PitrfXlZbUe901vqT7i+2uFx6m19Y11/HIqjZuS315Vb2flZXG9l0Lr4Qf82/JrWzm8HMQWdnQ2JwX7OupsuTohrMPT0Y3xJa3tbR1zrd5hVTOI+UNul9vtbqSWxpUXpWfX5aVX5ZfUR8fk2h26PC6o3d/cKrLqe2s/1pBZvyDgz/snrP7wboH9REZ5cVl1dm5+WVRTvrqav+dofLJkRfH/Zg7crWX5eXaXlu/+dJnm2zvxufFVVbnFJTnltUl+D9zVDsya+luuTH7fzPu8ub7Yc6NTfkNvLYuU3gyo017/sB469d7ZqiFHvZuyCooKyityc9Kznt5Z++uI3+fd264VtLduM5/8m5v5dZXFxaXp+eVZZIDqWwI939hsGvHSrWHG13qY7LKi4tLM/PLMwprS+taSdOvD6w1IuLh3TkztbaaBlpV16YUlOeRoSisyCuv87vvoLHrwBzd8AuvOqf/vHaqrb6+sTkmOMxYadc6VevVzg3BuU3NdNe5LW2tpVnZEVq71Tdu1lP0K3EvaKtt4tIRraG89Mm546u+2fz7b9WXWSeaJ9XlFJTlFpTllFRnFZQ/uqZ3SOncbNMcx7S+CjJ8ddnRz09/rfjtyOGjx40dNfqHQ6YaIVRpv52a6XWYactsT9HX3Llk9rDhkyZOGDpTad3xx1H1LT2eZiHPRXaAgcrJecNnTJ4wdNj0eYv3qr8sjehyTzlxct3zLOWXz58xfOjQCdPmDN9iesm525WPYvQ2zNS31Qc7Hl8vP2HI5GnzNtwIss6g2sVlmUGaZAjmAKRGv9d2fwukZ5D0NIK8E5PHA3Bmhn57ltQlun26jmCxVy0T9HHR/zJKZwNC0hyCkNSZNxgfgr6oif5XWOGeS49Mklw6739FWqNLyGOCriAJ64GTclJBpFd0oWD0aMJDKil5iiB1CGahk8hTI7YD9IiRERZ0tfuoirRDE2nt57+GWY9RgB4TMuMkD5iibiMgTZ+l6Qx5Esli9xdw923JIsEsdJCmn2L7QAhXI6NKHgvm68KEq0kaRuE6IuhNuu9dGKkgzVPTsZPXexE7/nQhs9CpYzumUJoR6/kPjW5Bmg4LE+mt2M4TvWqZNYYgzMg8bn6kr/OuRXvGzNz9t69VPv764Mdz9vzz+9OfHH1+8b5PvLv+gu+V5T5V+NsCjQ0P0h818qdL6Y/tdHbuHPL1TrnR8nLDd/1m8vGvNJ/dKKCqKKomPvz+0f0LFm79xdhtcqMV5Uadnabscre+vZrKLHtpsW6d6j/GyH84eoPcOAW5RXqfngnzzyJTwSoq69HFkxc+Hb/zN8M3y43a+tGiC0Mvx9+KEprxtdU0JnrY6WuNXqDyj9n7SSf/Sfdz0Zn/HvE971VSLml22JBbHWR+SPn0H8fu/8e8g/9ccPDjrw7+bfLe8XstlZ6X++W31DYL5m48bmOtn6nJvuWbPlmw/w9fqZBd/HPe3t8u1v3Xfne3mKdu9jenf7ntD8M2f7zVcK1L24suX5hP8KjymAx3/SWrjv9+3D7+tvMPkq7+Y/qhOZeenomoiy1tbRLEs+KE+kc3lmw49psZ/Jr/WnDo/2bv+f2YDXITFH8549A/vlb511d7/zH/+O+X3NtjnZjdMSPuxOVVpef7392/78y/OrbtGIoDH89R/r+fjKbpxj1JbWgVRJ+2MirrscZJjf9NVPzjmI1yo7fKzT3zm91PNfjn4NqpmkDPe9cnzd3zezLmwzf/auaBj1WeKrrX1ndsX1dS+vDQqTO6lzd6Plq2Vm3y5L0fk8OZf/Djefyd/mPH/dV3MhLKWvsyyhCVaW3Oiqd/mvjxJ6M++2T59qsu7qQnzLq+1/szMw3cpleOJ9ZtGfF/I4cNGbJWV/FubnkT6xi0l7lfslUYPWn0kL99uXzuRmO33Bryl8ImsSTx6pGvpk77699GTJzxnVbEvVhmRY96GWbaM1pSb17a9t3M4fMmLFTT90nNFU7OnQZvkiGYY5AaPV0gb8/Mcid6uky/X9KTFfImTa8SoCea9JSaoOc9gkUava3wdIQsEsxCJ+G3Z/LGTx6TGQC9SoCejwrewund9apl+mBJO+R4O+p2mSWLRW/SJ+MjaCq988MzPe+6B6QFsrlgiOjWBP8Y3J00B959PAm6kD5Mge5PVvfxEUHqEMxCJ5E5mdgOdD80+liEJ20i7dBEWuvVa1ikD9332DP6hSo83yVICcEsSNdnaTpD70twZZoA/UT3MOcmpOmn2D4QwtXo1wD5i6AXBeiJu+C1IWkY+Q11NkUPi5TonpMH0jw19CbMgoTxpwuZhU4d2zGFrCNGHyOpJukPTcq/FxEivaW7QV7S9CKNblmaoaCxxhCEmUGgsTLnubmN+kWzLWfu7Dh7Z/upWwqa9oc8KkLyq6maqAfWD1RO3VU853Q9uCi0hT/XKQ4NeGh0S/mileIlaxUta4VT1ucdY9wq+Zc2NeamB1qan9G+t/2izVEty50nHY/dDvVt5jZQJTXJfrq6lkpnLPZo3T+gbrZT10XRNj2+hEzU66nSUAdLp32n7u7Tsdurbr7v8v2DzrlPMpkLeDpnV7mFMT7nz99VPGm2/eydnR393KXleORJeRD/EyR8Ijdn6lhqo1qTnru5HD9tuotsctZ8x9m7W07aqT9M9G99fX2U4Evta5OjAizNDqnf2XKav4udp002XfE+8LiwmirjlEVbXrE9qmq897rHlTBOQterfjq2r6Oqo2zv2B88aUK23XHWXP70ve1nnfWDigXXjjG7qc5rDnXX1LP8SdWMrqlwgQyL/QFNq/3q5grn7uxQM91+znKTpp/Ji3wSml73k/+rhWqO9XR0PnjcVIF/RHd2qplvP3V7t0mQdhinTnBWhvyvvZYMrKOVw96Td/Zcvr9P494+TZtNJtEOsSQgcKnGpAhf92Nq9/Zq2Oy9bLnvvLnyvSijiMbmjs/7t9Q1JLg9C4wJ9arOtr7tpK56m//CIF09Y7rzrLmybZJF59cEMUfUJ1pIrH3i72R86fINHS1H19D0vI5zXv2EhJlQndU3zqgc8aXShM7/iLyKhJA1lek+Dq43NK5fu6r3INQtsZXT5fYI4rVnB6Z5Gty8cfXiNXsz59i8RgkXcnVR3VAf6WdubKp+Uc/wlm1oVbzEAMTvgFAnGjK8zAxWrLzsHOnKGmbqYjgBJw+snDJm+vpFJ195pYn52NygTjIEcxhSo9996XdBwZSRnsEIZif01JkQnjPRMxVC8JkHuoTMPgUl9AySEJ4M0SXMQieRd2s6KgimmKRj9Pu3cJ3u0yy6ArPQSbhluj8ik4Ce9dX4kG3pg6JnNnRPhOc0dH1ymMxyj+g9Cjan/zG4+0xd0B9pDrz7eBJ0oWDMaWKfLJH5NDle4TkfqUAwC51E2qE7KXIUdOPCHaAPlmzLLEuY0IscjjTPESF2EOjXgPAe6amq8CRVGN1D4UbITkkJwSx3O3aayN6l6QzdMvmjE+4MndAEr08aHQsFR0pI00+xTwohUo1+moSrkf6IvDC6DyON31BnU/SwSInuOXnQvc3u6E2YBQnjTxcyC506tmMKWUdMmj80af5eRIj0VvCkC55Nsi39/EozFDTWGIIwI/N6NxvtuXbv2qJJuc2bNC2r+vVYfv54Sp7Nv1PoMzN6x3fvdW4Izm7htDTUNba1Sbjt9UAT0wvJHSNPGKe5tamxrq66hZv5yv661tKVGs5R7GdmCoPq7u/c9v2kqetOqPpSyeLqv59hhkzOBO+F9HstIfzmKnjPJmuF64i8JdOTPNKUoA5dIvz2z9+s24xB5N1aMMukd0cekDbppgR1SJtksVctkxkDvShAd7WHyUdfjY/IGQCCPhzBrunDIdvSiyLIWlKfzKXIA9II3RlB4+S46NbIfkkFgtSk6wgqsB442YqUk9/Mcge6UDDmNLopQSGZtgoGh79vCws6XQgfC1kkmIVOIu0I8gY5FoK0QwrJb1JC2idHTR6TAxTsi96KEAw+KSQV6AbpDelGaKzPEdF9K4J+DXQ/HJFhEaDrE/TzRR+m8NNB0IUiLYjsXcrO0DNsggwaKad3RH6LZC26Gimn65ASafop9kkh6EL6MSF4DdDtk5p0BdIyU0Ncz2l0TWah98S22Z3IXuiDFRl/upBZ6NSxHVPIOmLS/KFJ8/cigm5TuLeCESar6FcyXaeHRkSwxhCEGWDxfsycZQ6GndNUR8KM2tIhE79e9c33i5dt2rfsnLdPnOiNFQaB5koqwtBRc+eiJctWrPrhm5mzZ09YtNcuyo3tlgE1UY/9VOcsXrBx9Qn7F3USr+h7ry4zI++s5C2QvNeSB4KzH+SByNs8QUoEFcibsdg65L1ceGpFpvt0++QNm6nR8S/EBLPQiX4nJpWZ5Y48I3jDJvsiq0gnyWPBTulF4VkCa8vkN12HnkMQpLf0VEA4Zgij+/8zx4duhBSS8aFLCEEhvUg6QxaFJ3/CyGjQB0Ijj4WjFEFaJi0IRowcFGmK7IJeSx7wD7vHA+8+ngSpSQpFDpY+TEHjBJnyChokSDdIs8IHS++dWejU/UknuYJuhPwWHCDpA11IWiC7po+FbEuvpQkCHtk1/c/VYg+nh+eIJmkrUkgqM8udE1zBv4t3J/zqpZ8ser/ManFjSNCjLdi7lJ0hyLiJPPXd+0aeDnqnhGBz1n4SYp8UMnoE/ZhGvwZIYUdj/NaEUyJBDpaUi/ScIIUiTfUKvS9mQbKO/r7eC32YIuNP2iGFzEInkQ17HjH6xUnw/8Y6dP9DI1j/XkR07y2pLBht0g7ZESkki9IMBY01hiDMAIAs4ra15HibOl85cOLIgQN7FZWOXdp7Mzgklf1T8zKnpYZKsH1qorZ7zz7lvfsP7D+uek7fKiw/nu3eCZnexkarhs1boa50S/JVbB3enxsAvFfoOYHI/JVMC/gTim6TmAFGZiRkLtLDhObnkOUDH3TIHJ0MGj19hLeOPBfSz+D72yD6Q2ONIQgzAACyhkveU5I8rl5ZPnPVcadL3uz3WRikeYbpPYhD/8urSGCg/8GYZAlm+W2g58eCf/buczJ74IMRGTHVXn6AG/oPeQ3LTpgZRH9orDEEYQYABpP34wI8cpQtdaUZGWFBESklGZVS3JJgcOYZpusgjkXHZTxKSkr6HZe8E/S/pBL9FySkQSY6pEvMQj+Q2QMfdEjsJMMofMEPgMAg+kNjjSEIMwAAMqf7bR6kSXGDLs8w/QYJyGSU/tdTGp0i3oe56Xt74AADabD8obHGEIQZAIB3x+DKM0ynAQAAJGCNIQgzAADvlEGUZ5geAwAASMAaQxBmAADeNYMlzzDdBQAAkIA1hiDMAAC8gwZFnmH6CgAAIAFrDEGYAQB4N8l+nmE6CgAAIAFrDEGYAQB4Z8l4nmF6CQAAIAFrDEGYAQB4l8lynmG62Nfo708QfLM1efzzv6iuTxrprp+aBQB4Z7DGEIQZAIB3nMzmGaZ/fU2aMEPXYdXbRERv1QORRrqXAACAMNYYgjADAPDukz7PMBvIKpIu6FQgFl0HYQYA4J3BGkMQZgAA3gtS5hmmtqzqqzDTW2/WCOtWPVSgj5R1p6QCqcYsAAC8c1hjCMIMAMD7Qpo8w1SVVfQUn8QVZrmT8Jxe+jBDt2ZiYsIsdxAbD3poRJL09HSylaqqKrMsDmvfWHcqtrcAAO8M1hiCMAMA8B5hzTNMPVnVH2FGZK2SkpKgKYEeGpGE7gZBUg1dQu9ORK/61h2pQKoxCwAA7xzWGIIwAwDwfuk5zzCVZFXfhpmysrLua0kJwSx06l6tZ6RlOhQJb4gwAwDQW6wxBGEGAOC900OeYWrIqr4NM0T3tWLr99yICJJkVFVVySb6+vp0x8gDZl1XPTQrNvlIwmwDAPDOYY0hCDMAAO8jSXmGWS2rZD/MREVF0UmG/CapJj09nT5FQ/IMWWQqdeqhWYQZAACCNYYgzAAAvKfE5hlmnaySPswI6yGHkMghslZs/Z4boZHcItg1nWTochJv6DyjoqLi4uJCF9JIoaRm6SNl3SmpQKoxCwAA7xzWGIIwAwDw/uqeZ5gVsqqvwgyzQgre3t50fdZcQYIKvYlwkqEJTteQVCO4HwBBSiQ1izADAECwxhCEGQCA95pInmFKZZX0YYbUpBfFRgJSKCV6X+QBa64gtLW1u/eNRuKNiYmJyNoemkWYAQAgWGMIwgwAwPtOOM8wRbKqr8JMb/VJI9310Cx9pFJitgEAeOewxhCEGQAAeJ1nmGVZNejCjLe3t76+Pn2NmQBpysTERPh6s+4QZgAACNYYgjADAAB8dJ5hFmRVP4WZsrIye3t7Uk1FRYXUF6BTh6CpXiFZRSTDdEcaZ2pLh96KWQAAeA+wxhCEGQAAYJA8wzySVT2fr6Dr9DbMuLi4CL7gUhLSQvcbK/eAVKZzEdmQtB8VFcWs6FhF+kZiDL3T7sGsBx19QZgBgPcIawxBmAEAgEGjz8MM3SDJFfQZGJFLv0iJvb29IJYwpVKg72ymra3NLItDUg3ZL8EsS4G0STALAADvAdYYgjADAADvlF6FGZI3hCtLQl8wxixIQaQPkpCO9apZUrlX9QEABjvWGIIwAwAA75RehRl9fX3hypL0Nsy88ZkZuvNvjGzONAQA8E5gjSEIMwAA8E7pVZgh1UgFkij69jIzgs4/ZKtefWYGYQYAQBhrDEGYAQCAd0qvwgwhzQ0AtLW1SQhhNpAOqd/ndzMDAHjfsMYQhBkAFjwe8wAABoXehhmCBA97e3uSWMTemln4vEpvdf+eGRKc6GZ7/p4ZAAAgWGMIwgwAALzLSH5gDTMAACCbWGMIwsyAkvLf+N/imYDuPcRpCYoqyUl5rnfqtpplgkUG1dTOlL5d0r6WZOD5k9yFQXbSq4fuDrIjAQAAGCRYYwjCzADjNNVWZiemR0anBsTlBqZXlzU289rqC1KzYqJTXsZmvUipyKpoYeq+HVxue1NxRl5mdlluM9WMKRp/Kp4S7me04LM1Q3c+3f6Sqm5lVrxVXIqqrygpiotMC4lMDUouiipqaWxvbK4vS4rJCI1ICUrIDctrLGsk1WQAt4FTl5eVFBcTHh4RHh72KjIuNS+/aTC+utrbGiuKEqMSIkLDwsnBRIbHZybm1Ta1ykbABQAAeOewxhCEmYFE5m41qSFPzq7ZO36G/C++ufDb/c8dkvLayiJv7Dr+1cytH807Jrfd7YRrAVP97Whuqksx2a996KTdxUwqQyYm7m8XedbSol6YLRu9eeLeZ8ohVI1MjAlJvLFuVsaLJij+a+L2P643mXE7L7EhKSv8/oY5+/43Ztsfl14arpt6P/HtBuNOzdGVry4f/WnRVxMmzZg+Y8KYeav3XzNMp3LbmPWDR31Zmrv5lvkbZ46bNHXatGlTJ6w4uuLSy/TiBmY9AAAA9CnWGIIwM8B4Wa98ddZs/Gz4UrmJJ+QOhtqm1PPKku8oKk0bs1hu1G65bV5HPMqZum9HU2NNwrUtp7fvMT+WRiUjzPDVlBcledx/5hiQ/6KEapWJsx0kB2Q8tTBaNnLtLz5ZKrf05jSL+sTmotwwR/npm//0zx/kZp/68nrx/TSm9lvWGFwWeG7L4m1r1h/TtbhnbGrl9CQkrJKqGXznM1obK9OiHlk6W9w1M75urbpi4/ZDU488S8irY9YDAABAn2KNIQgzA60kNsJ2/44J09bILdAYdj3XvZCiKouenD20ZN5KuemHPj4Xqxv6dv+9urW1IcVIUV35sNXZLCoTl8+I4l8aJQOXR5FEVRHywHrv/M1/HbH+b/JWW/2pLF5LSbTX2RUKX4xY+9ES7SWPWrxLmdpvWUNwebCO/Pqr54xCRZL64LrQrOsHYxqpsAsmOhqzTvgizAAAAPQT1hiCMDPQimPCLZW3j5288lc/aH9t1/S8muKV57udVvl+9nK5WUfGGxaYpjA1RUg17ROqxFJfZLXwYnummZLGgWO2FwspErXEkKorQiTU71UzwpV7u/8+xd+5xA7088fAhVonKbMsyNFy97ytfxqm8Nlep5PJVDHVWBjheWqpwqdDt/5llaFiSPOrRqZ2N+L62X997wgz29drn7nxIrej6++C5nIqQO3mZfXZCDMAAAD9hjWGIMwMtOqkKM9TeydN3/jbFfqbfNvDWymqoiBEV3XVgg2/nHPme4eyByVMTcbr+XFFS16YqbHzKa37x/Qcjus5HNF5eNrwmVtCnHt08m37hKj8OjJ3ZWpzm6iahBdPnp7Xvq961YHUP0F+rtoduvHkpHVyTHXnyZ/X89e2prqCQEe3WzctD2rdWrjo0KTl52efc1K88uD09Y5tr90/qvf48K0w14SKmo7zAozO7lXHBD+ztVXVczh8taO+nr2Klscl67hIHtVM1xDsTXBE9dmVYc8uGDip6Ngfv2Z/TNf2tEOcWVwrrz6nOC5Q3/jhSa0HWg4RHqVUqcj8tyTqpbv7IR37o1cdjl+7f1zPab9RyL3g0s6p++ujIlrz01KfPtK66XBQ1+H0LQ+tp3nPi/jljYlhfrY2p6477Lv88KLVK69ynvDA89o5DfHBvk5Ox685HL5if0LP8bSRi75fnk8h1dLjZJzXUJPj/cjMxE7lCukbfxyOXX1wSNvPMrQor7MK819a52g0ZiWFO9leNHAgG5645nBMx1bNLvBGeMmTR8EvvSN9y3nFHLqiQGuMm8OppVv+Mkxl1FH3m3VUFUWVxgRc27RzyIjd//jxnnpuSyJTUwxeXXFdlNNTR9ObprYm90MjMivJK7Frz/oOE2a0Tl/3z+m4Qu5d0FhKvThjqIkwAwAA0I9YYwjCzEDjZMclGZycNVf5j2tMjye18aebNcVFlpe2LVP65Rwtef8y3+6f2eZR3OaG9tyAF/evT1944I8TFP8wc88fZ+75aPL+//vq5DZ9w+XnzP/1jbXBy4JSwXyUU0MVuOmrX/xsvOKfp+35/UzlP83c86fpir+ecfKvyy01fTNTuLwmuiajubok2mjvyW/mbP9outJvJil8OFnxo+nKf5hBNuz4mb7rt7OO/Wax1Um3zMJu/7jeWFnhfkVrx9JNfya9mt6xr5lKH4w69vlK03OJRaFk3t1tmtzeVM8LeeSqefr/5u2Vm6z0x+lKf5iq8MeN92bfiE+KeGSnp/5/Q+TlhiiP3Hf/bCovtfOjO+1cXktRdr2L0QnlI2Sr307f86cZu/84c98vZl/59ryvd3ldMZdq67qvxii/ZxpHx363V27k5t9O2vnhfl/lJ3UNVdWBt/WVV23526w9cqN2/2f5lY1Py7wqmU0IbltLuYvp1X37/zBjz4fTlH87Uf6Dkes/O+6/L5jlBgDZ4a9uKu2etUD+19OU/8gfvd1/mLbv16POfavpfbehOVfC5204Lc2h9tZqG7Z+Nnd3x4Z7/jBZ4e8bdEZc8lj7w6k9CoYH47mRglDYKdff7dbObX8frTZZzc+FRAaKqkuKdj68a+zEw//a9OBOY2sPt5JozgyM1VwoP3/Iv4bMGjL7zOWHMSRr9dc5E4QZAAAAeCOsMQRhZsAVJzbbqc+YefTXKyz1ajnZpKSuhPK8tnvlEblJ148mVkTT1YTwKovKHlxXXH922NrbJ0JTH2cXxSXlRicVJGZHBUfe37Pp8H9GH/tgsZ1eaHGFIMzw2qnWmtLCwtiEnKiknMiknKjk3Kj0oqSA52FGOt/9ZDD7nJ8bj0vqd+K2tzWV5hZmZ6cEhT8/senMOgWjXd55j+MKklL5LUQlZUcm50ekVRTUtJDJqHBeqE6Keqp+fOzmm7PO+4Un5iRl5Ecl50Wl5KeGebnf05+xVHP5tSCbOqqWv01n70qzi+yvbpTXnbjHyTw6MzCrIC4lLy6z2Pmu3emd+1ae0RkjbzjiO1N15+iXFXUFza+zUL7vY/PDR4Yv0//xuv/jzILQ1LzYtMKohMz0B3euHjn7jx+ubH2c5d3W5WovbmNdXXF+UnZJgPMDC9XDM689W6jhaqhw9NsDdstvJbxKyM2LdHW6YzjyJ4ej9umvcxqPx6kuK87NJUMXl13m4+Z1eZv8Ss1ne4LEhhnm2LKd72ocOPXHrfZq96PSswuiyZinFsbEp6T425w7qTVmpeGxwIqgbomhvijf79qlHapmC/UivcKzUjLyyJMVn1X69JHb+R2Knw7Z9H+rjJVjudHdUm7tK0/XY7t/N1178oXgSJKISE7IiAnV2Df6K7W/bvd82tAmYYpNelqXH25nsm7qiinDh42aPGbskl0GTx9WUv11J2eEGQAAAHgjrDEEYWbANZRS8T76NzyO3YkM5nKrSUlrPZUe8OCe+96rL59UNopcZUbCQkHkc71955bL3/rpZkRAx5y1E5l7Jj/R01r+3ckPvrHWDS4sp6fVHYTm88LKqAT7rUvPjl53V7eyPZ0p7DL7p6isO3s0VI7bXSqhxH+A/PU+2qm6vEAnhx+3nFms9dwgTOQjGhVt6d7aKucWH7Rea1cYU013nGxcmfnSS3fP2R9U7Hc9yBE+Xk5WQsDt69v2nfxsseZnax87ZNULzfzbqLYCp9t3Nm64sOKcv2V0TZeJd1VsopPZxp1qs896H/aqLOOKO/qs8AS9Y1/t0/7PFoMfFYy3myXdTaVXFNdnBJ+/+sLqeV4ZE2ZEN2/LTfE4umvHFW8JYYZ0vYHKjbty7soPu/Q2WmVFkoa6SI1wvqMsf27+pSD1l7Ui9/GtzEi23fHj94dtvn0qdP0eUVeU5nhHTf3eftPgB0W8ItHLzChOfnL6kwcnDF/oeeeSHZJOk9xb4v9I97b3aYfUrNb2blvQSMXWkmhne/mpK6d8/t8vJw4d++O+274+jf32xS8IMwAAAPBGWGMIwoyM41Hlfr73TYcsua/hmSN0GVQnEieq/VytLMevdrwVUiQcZiRo4/JyrU/oHNhleDSuPaLrpWYdmhtrkwx3qe85ZHkmg0rr8ZIqqrWRemF2XdvoV4fDvNPEfdUGr5Eq9zDQMRuz0sEutYp/Ioh0uMzbzcLsi6UO1/wL+FmuK05TQ7Du6fXLDv56lZNRbPnrCs0lVIrNgSsPZ1+Ir2oUPbvBP+r2IirLYece03l7nr5s4tTTK4Q0JwYHaR4aO2vjh+tM1nlRsTVMuTQT+LLEGIeDClt1JZ2ZoajCuGYn7RlHHswwyGBKRLSlN8XZLdlotvp8YAxFCQ98dW6my8l9Spcfbfehsqo4FKe1sbm1samlsYXT8+dzfg5OXkTWrZ8OrZ02ZtrSacv1jLySybPTTydmEGYAAADgzbDGEIQZ2cbjNfpbWOnqfn4q2ixKwhfz8WqqyopD40rpC8BekzxJjzDQvnTo8o9P2n1FTyAQvQgzbQ11sTfUTp8z/uohlS65ZpKL+2XFy5ohhT4cMl/mUAkO7nfNPz8TZxsv7mZbnBbK46b6fvVfrHQyiC4ThJm63NQA3aM7tNw3uPHqup1x6DjWZqot3vDY9S3bTLTS2+K71WmMDQjWPj7jgM1i0/S4mtcT9z4JMxVRgU9P7V1xPUIljCkRg1vhqHb9vKadQTGVLZRSeJz66rwgK/3bP648M23t2bFrz01Yd3bC6lMjNtyccTLYt+z1/qTpqpR4LfUtRQlp8eGvwmPDYvMLuwfEPoQwAwAAAG+ENYYgzMg2Hq/0gdGt85rDbuTYJImfBHaZ4HZcLtZ5zRi3tiA7yjfIyTPYyj3E1oP/Y+8VaeMWcmH/0Y1KmosetD/ruK9XV70IMy11tR7njysrqs3SjdJ0jHB+yuxF8GP3JMzeN/7aBcN96w+uc8o1L+0IM77m9w1vDTPIf5Qm7og4TVSyo+llw78sdzSOKq1iSqmy5AQbJXl5Lc89oRT/xltikPhSYH/m6oFt1w5GtQZ1C0qN0f7BuqrztEOVnzHbS58NWMNMTvALE4VtS47brbwVR0bb8YnoUNj7xFg9Dj4rf3jbEWP5UCpGcOaI6URLit9Tw0MXlylozdquPX8n+dGat0n7m61GypaRTln14mLfz9D1skKG2MI+gTADAAAAb4Q1hiDMyDYer+LxbdOLWsOuZFjFd7/NWQ/aKarE38Js59zNf5u4XW7czl9NeP0jN+ynv63WW/yw/YWYz8T0Isy01tc9v3Jh+5L1cuN3iuxC+EduxIaPZqlMMcozzSZhpq36ocEN9SvDrmU7p4hrndtMlXjeMzQbttzBPLJUcIuCirREp0O7tmt5KAZSleJHgrSWY3362l75G8di2151u/dXY8xzEmbmagTsdO/11JM1zBRFhljs2T5hzha5MaKHL/SzQ274+n9sNlvtSUULUpoQngCdcYriWpyvzFpvNPZkQFQ7r1dPv2xBmAEAAIA3whpDEGZkG31m5sLlYQZ595MkfJxbjKrykiDTM9pLthpOPex2wz7A8UmwlWsQ+bHxDLV8HHhmz9GfFLWWPGr3KWY2ENKLMMNprE80Ur9w4vK0K5Ea9mEPPF7SexH+seT/fmnvE+2V1pjZREIWh/IxszPo8cxMiqOpVj+cmenPMFMVE+yjtn/NOafFRrFWLkH27vSBi4xDkLV78MOQrJeFVHVnIz2eDWmlipMeXLmhfNJkk0tJYHHfXQgm62dmxHWFtXsS1r/JUUkzFL0MM+JafJOuAQAAvFdYYwjCjGyjPzOjrf3FkVDD8FqmsCtxE6K4xEDzuTMPjVF4fDiA0/1f9FPMtHWPqy971O4l5jKzpsbaRAMF9T2Hrc9lU+k9Tjy5zQ01bjduG1l/b9MWK+WFUFwOFefgfvfO52fi7eLFfQqI00x53rzI/8yMo8hnZl7oHNmu5b7elVcnvleNFIf/mZmt225rpYn7zEx/hhlOVkSGhfoOoyiV50wJm875Mqe2vrIkMrE8t7K56+fvO9d73ryjofkP9XSruL48N8P/zExxUkZiZFhkfGR8QVFVk2x9ZqatjleZkZYYExoWGx2dXVDXJOZeFaLIiDVX56VlRYdFR0VFp5dkVbZzpbinAa+2sDonJjYmKjQqLSGjvI7TLlXI6O2ZGV4Dpz4vMykuOiw0OjqSbFLU/SYVAAAA0BVrDEGYkXE8qtLf757BkInXFZ2SQsRNBMVMvJI8Qu9c/+Oep6fcxH9rYvhNzYtHLvYQZvQ7wsx5tjBDtTdTha4WN02/XPnoXkyFhBsUdMW/m5mXm4Xp50sd9fwLarr1v725MeTKGXF3Myumkq336z6cdT6+ukHcxJtTSGU77txjMk/pSaC4u5n1a5ihmjLbYi3WKd5beCIokfSFKZVCbWjsU+vpP9qfc04v7bg6UBhJPNWPbxpr6Hyuk3k/sS/DDCcvMstk/eEfZ4ydsXz6yuu3vFIqSdJkVva1NwgzJSFNjw/u+embkaO//+rrU9eDU8iosnWvjctL89HZe+LrMV/NmTX3wL3TrtUNLezH1PjS2Evtm0ULZo2cvXuNilNIeX23SxTF6W2YaYmridA5sWHpvDFj5s2fv1E/0ipR3B8vAAAACGGNIQgzsq+64NWza1uPzlO+t9whi8wFRZVHRjk7bD5hp+Ff8LK5Y8KX/yzMQvdPCw3Xmyen0HUYmekhT44cNf72O4Xp8nornlCRnVN+4ctqmuuKHA4dX7dFc8LdwqjO+xfz1ef43757TM1+9+3oyJqWjpk12VtZorfLhZ1nvj326IhnoXD1TqWJLzyunryj/qT8Cf+qNrKniozAp9pKZxdffHI4oMvpJk52YqCp/vZ9J/+3WOPTVU53Y8uE7kbdRrXm+drZHD2i/5NponumSF6oK0v0MlQ6u1Lt6f6nFa+/Z0Z4tpgenHDj5Nc6r/b4ij8JIdhGeCNaW26K+xGFXTdeqMQwJd00UzXpD6/o79qh/Y1uqFN29/kw6XDqQ4O76rpPr0ZTmYKwVRsS/fD6iCmH/7XNQfFZZdfNmqnqUIP9Wmt33FaKqhH9Fp83R46vrTTa2X47/T0zE4aM/WmfiZ9vkwx9z0x91MOAkzOW/X979wEWxZ3wcXwv7ZL3Uu4u5ZJL7hKNLQbsvUSjXtTERiyxN3pRioUmoiC9d+lI700EAQHpvffeey9L3513FhcERAdrFv19nr2YzM7slMV7/l9mdnbt/C//Pe+HhVtO3oxzrycozpgwaxnVjgYCv26d9fUP8+d9+5PkIaXIgp6xL1ydEvlkY4b1BbXts5csnPflt+vX/CZtmNZcMJ2qe9qYaY3puiN2bOvSr77kXrDqpLx3XuK06h8AAOCNRpkhiJkZgNla2+ipe/asBvdZN/PUktjK+pzCqqzCqszS+qy80nIvKw1xuX9uUzngVuzdNfKr/cG8kjD7w79IbbrgIRjZGJlXU1hWn5VfVhrraaKpNv9niU+4jnzxm9Jakwrz5O7a9j7GxNH7UG9fxi0dIcErH53wNrmTW1FVn1lYXVSTHxLiK7RPfN4m1aUXw+81944NrZnVeWV2ajsOa6+W9HPOr0osryM3L5P1qMsuKSmsuqujqrp5k9wuyxrbMvYiRENZrbPmnvPmy+XD47Mristrs4prcisafW2d5c8K75bT+OGMOfded/uMhzcAeICZHnxPX+W/fC78lsnkUrnF1ZmFtZlFFcU14Xa2Fr9s0jjnXnJncCxHyD+Getpbq0ur8ssb4/287aUlFkn67LEoyCqqLigll2VtZ1ZVR3n78PD48etgL6O9sbisJi2fNUN+VUtEYKjG6dO/Srvvd2uOzakuKiWn16QXt1S29g2MrOaBwXgvFyWlWbtvCtklBFfXpxdVjxwKckV1hVXp8WmuZw5c2Hjs1tkwImss+7oSs/wNlm4899ZPmoulQ4KTS0sr61iLlNQXZsan3jbfe8R0h1z4XXIwTM484Y16ZuSrdFUnO9/cv2LP8vlzf1jGxfUrn2GQdytBn84g/hk8fcw0xbv5iSzavf7H2XMWLFm69qB2tE0BMfTkzRsqGy4yVuXduX7OnCWLub9fI3xA+nZ6d/+UJ9JGkYVZEWMkLvfT3FVLub+fs2rDr2LKsU1p0zkH9rQxUxxYdfPg/q2Lv11+5Gd+7+CS1qc4fQcAAPCmoswQxMzMwOjrYSTeDtG48s3PorRlgp+sFWY91gh8vFbs7fU6O5TCQ5s7a4eYA2OjvZaKXk9dkTPitMVCH6wW/vtawY/XiL77g/xPV4KMGlttdFX5tu2jLRWk7bH72Si/vXfSsIp8lepoH6fTm87MWsX3/hoRcl0fLT/18f/kv5RO0Alv6qYPDIzccWvMcFfbUITzLQWZD9eJvL1CiL15a4U+WiX8wdLzy2V85NLouR3M8b9ZH6Z3lfjYaYuI/GuD8LsrhT9eLfTRSr6Pj9is08vKSfK2NbGet9vNOm1yzJB6qkoSDJVO/SH03krhD1ezVvTxGuH3F4vM57MVjelMmnBuiCy7plg3B9FfeP+7Tui9ZbwfcB+ncfHSlrK28O/kgqsEyMenQr5/eLW39o4bKddldXlqb/tdgrZYgLUj60Q+Wsn/3sKjNG5e2nKRj9YI/301/4frJN7aZsVrl0MG2sPROZPBqMxpdNY+elyCPLzknKOHgjwOQp9tubrXIceugtHWP+7sT1tUaojd93yB4hLGHlck5m8dO4CC7y+S+OdabYHA/LtM4gXfmpkg+kqiMm5sObl59pez18xeK6filV75yEVuL8wzXGZWGdZs88ehrdyffrF04Y9n5e9mJlJfZtbL6E/xlvnj9A9fLJw/d94fukL2Na19lPvEbA1SdRPkWs4997M5PJuOWwTVdE51gvERTxkzDZG3vIW5ti//dsWhK8Keg3lTfAMuAAAATEaZIYgZjjc27KVXdqeEXDdwE1ZxktR0YT00HCW13IQM423jm0YvT2LNzPofY5CoT4vw95dQc5LQcJbUJBdxFVEONouoKSbH6gWpkc5OV/WcBc3jdCLq6Q8b6MHCrD86aoru27mp6jiJqpOLu4ir2F80DVaN6cqf/AUpo5vXUVgVHXRZy0VUdXTzNJ0l1F3P3fAxDCtPYA8pRzZvbI+qs/MCPWV0XETUnCU1nCTU7C+5ZJun9xANwX5W1vN/c7VIbZjiWz2ZQ4ysCH8nN3IpcdausTZPTMlT3SsrvJcYuXJn9PVZo9/u0pQEV0MHOU2nc9oelwx8FAw95PUebJ6LpLojud6LzhlWab09g2NLkftS25cWamDuLvjgUGs4X9BxlzbylTfwkNd1lmJNcZTQ8hAxiHGIr2ue3AB9RFW8j6uP8I2Hx4F8nLvhdtngnlv5wNiFguz19VbWl+eahNYnR6c1RvrdMHQVVmXtEfmWian4XNSLD2nqZd/SbdwGPj9mZ11nimugi6m+qb2pY3xSSUv/C17DOCMxc+oPrasmCeThGu+xa+ypZhYG+rlY6erZWliExte0kFlLtXnkD1Z7WbR/iKW+xU0z84D00MLB6XyYf7gqqTTM2tbSTPemn9OdvNre8X8fJphQ8OTPWtI1cw2ltdOKGUbhbT3DPQvWLd3KI2PvUUu0sX5oXtbxBgAAeG1QZghiZsZ42oHPU80/eeYnLjzlk9NZ3fQ2qZ+oD7A2tJi119M2rfGR35FTv8b01jKFsQWf+RWmZ8LLT2tdL36DpnrFl7fbdDJm1E4fuCqp7JPa1lrT0trW3tU99KTPwEzxzMSSmL5nWeyxyzAZQ309rU2tbZ3NFbndfpKqV6+SMZNLETODBFGW5Cgnt3nF2l+UL1mnNlCfZQIAAAAWygxBzACHGR4gsh2NdczePhvml/PwZmYwg9ETmqNkT23ZtGLhyp937Ni8cc8pGVOrMqJ6WheccZSeltIQR+F9Ajs3b9m6Zce6Hxdu4195ITSv+ol3WWZ0EW3e3mqH9q1ex6OUaJ3KngwAAACUKDMEMQN/mql//T1cmqKhJipxc5F1ZULdEz+8DTPFYGVPaYCrieYNWRk5GdmLkgqaVreD6onml/UZnZenr7MuNcxQUV9W6pKMrLS8goyui8HtosaOJ94xoL+ZyFIzE9q5ZNHv4gHV91/4558AAABeX5QZgpiBPw9jeHhwoJve10Xv66b3d9OHGERZdZU/706F3YKe6tVE5cwb7AI8oreJiFU2F+XbsEPZoqR+7JZ+AAAAQIkyQxAz8OcpjU6/ZbD6D4VZu+S4ea6Qj4W7Li85orLbOMkkvbt+6KXdXAvgVWIMEh3ltYWFaZmV9f0DL/KrTwEAAF53lBmCmIE/T0Vijof1bmGttafUt/JpbuXT2HhMZ5ekq15+Xx57jpf4oXSAV4L1Izzhx/hZ72QAAADwBqLMEMQMAAAAAABwIsoMQczAnwa/oAYAAACAJ6DMEMQMAAAAAABwIsoMQcwAAAAAAAAnoswQxAwAAAAAAHAiygxBzAAAAAAAACeizBDEDAAAAAAAcCLKDEHMAAAAAAAAJ6LMEMQMAAAAAABwIsoMQcwAAAAAAAAnoswQxAwAAAAAAHAiygxBzAAAAAAAACeizBDEDAAAAAAAcCLKDEHMAAAAAAAAJ6LMEMQMAAAAAABwIsoMQcwAAAAAAAAnoswQxAwAAAAAAHAiygxBzAAAAAAAACeizBDEDAAAAAAAcCLKDEHMAAAAAAAAJ6LMEMQMAAAAAABwIsoMQcwAAAAAAAAnoswQxAwAAAAAAHAiygxBzAAAAAAAACeizBDEDAAAAAAAcCLKDEHMAAAAAAAAJ6LMEMQMAAAAAABwIsoMQcwAvAxM9p+jJv83AAAAAFChzBDEDMBLwmQyGMPDjCEGEyUDAAAA8AwoMwQx80pNc1SLse8LN+GQvpLjS29qSLA2ltTwOO5QWtc5yJ76Ukzjx+rZd/kpSuyVHFcKj9kG1mRO2Lzpe8JxRxwDAMCbgzJDEDOv2GB3W2NBcnZkTEZAfFFgdktddy9joKM0My8uJiMwLu92RkNeQy97XnhRmMNEf1N1RXV0WkNt18BLDYsx7eXFboJHZm2/QpNIym/sY099CVgj2+FeoqUsKSnLMzTVNzxt9JHqGVEQktHYODA8/GDWZzNAJxrK0zNy/SOz78bkJ1Z2VdGHiZbqsrz8gOjswKjcmPzGYjrRx2DP/icbau6qz0uPj4km/z8r/H54WExqcV11PzE0wwKA3NyB7sbSorjwOHInyH2JirmfWppb1cVgIGUAAOANMlIhiBlOQY5COgpi78ju5p+/9Chtw5W/CEW45FYNNqbonJJcs+wwbbU47ZiflG81e3Z4UcixfkOgtaH1j7972mc1t7GnvlydVWW+FwSWH1T9XD6tuLmfPfUlaSoY8tXeySNKm3fqnSW8rMfiM+8sPk1brjxb8G5Qc28Pe75n0lJK3NY7cuwcbR7vu4subjHLsCrvJSJstCWlaFx8tPliSy/53Sgnql9NIz4Zk0F0Bmd4SB5av2Y196IlS1Yu4d52SsvHsYHofK6ee/XINGzODzbW2L54+8rF3EuWrFi5esF+NaGbmX0DM2xPAAAAngdlhiBmXrWKxAjtg0e/W7CLtkz6Lclkl0I6s7nQTkhoDfevtIWCtDOhF4Na2LPCizJMJ+p8TbRMv/nF2Sq96dUc38Ge7qqU+DuR2W7prV39L20Ayhwi+gpSPV0v/nHjkK6ngHeksWvYTdcwE5d75EPPLdk+orKyd2iIPfcz6a4g4sxOHhaifXqU9s3lbTZZHv39RI6z7gUJ2tdHaZ+e47ocYNxL1LPn/lORMdPmk+h0aft6XhEZHUtfH2cXv7C00kI6MTDzzsz0tlVmpfq7+Ht5e1qou8nt2Xpa7YBmci9iBgAA3iSUGYKYedUaMlOcxM4sXslD26I8X7/6Ti1BtNYFKUj8unEvbZXEl4pZWknPNfKEqQwQLYE2hlbz93o65rZ1sye+Ui/t4qBBotbHWlX3k1XW6lntreyJj3ietQ/WEUUuEvySH/xXgMalc8a3OJk8ng0BFkpXvph7ljZbeatG9F2C6GTP/adixYxvorvqnj3Gt+5Xjbu2j7X/MytnJnwwpq+QCJMSlTM6oIWYAQCANwtlhiBmXrX6jORbwqe5lu19e4fGzy59kR0Es7k6QE78l3V7aGullhjXWhay53y5Hjeye6kjvmd98ef+xPMw0X73lrHNgn3eLgUdj/v8yvPv+hNe4ble/EkLDxPpDuY6N98TiwsqeQGftppiVQO1RL7TeV7x974XoW2yvhhUXUf0EbX+popyn87no60w4DFOzWX14lN4/kM9tZGYSXK/sWe3rkVQfvPLW9Er1pxG3DkvKG14UBsxAwAAbxbKDEHMvGod+Wl35UWXrT76wR6D4xHDyeQYsLUmSUuGZ8uRt9Zf2eHe5NXInpNtdCDfmZMUbmNxXtn2pIItv6IN7xXL83b3VWJq/BxC791JDmwmGscGOaOL0Ety4h2sL6rYnCAXuUY+rE/LuwqqRPrX0cd+hT9+tDfy74MEURJo66koY8F3zZb3qtVpJU9e4/TYpvZuRt19J2+tGxYiGh4XAuqdAlOjb1nJqNueNo6SvV0THxAUZmspcM32qFq41t3KNqK/OifJS8/6/HXr41e8Lpok3+/oY39YZSxNKjOz/VzEle1OXbEZ2Tyb07L2YlrBjuVDFew5xjavqa4y0Vz1lpSslZBh4NWIjsLiSiInWE3f8ZisFf818hVcFd0zwuhEF2vm0YUYvUR7Rpi/v6Ssudil6xsOyvxj/dXN581OqtiTqyM3lf+qNfkQskkxSqJ3v4DrkJhEb0lxYrCCkp2gvDXvNVs+ZUd+02j10NpW+lRn24Y7icYkD0cPMVkrYRUnpeAav3KiKyXsroP9KQWbs1etzii4iWrFBjX0sN+scRvI6O1uiwt0tnI4LW8pLCCz9nfpt37T3iVpIXnjFutIKlqdve5yWivGI6OpfeTjFw88bMKShDh3R4HrtuSK+BVZB+GYUYxyeCv7+clHoolou60gdOHzuedp+73VIppY5TJ4307j+rx5/LT/3TphX0hnz/ko8rXodZlh4Tc1zXTUdR3uOqV0t/RMXsELMz5mAvPIDeWQuxI8r6Y0IuC8gLThIcQMAAC8YSgzBDHzqg1XZBUayaxdL/whj6V0wWAuOamjvtH+xqldQrR16qfvN0U8+ituJrO3oy3MykLi4On/bhb7aP25zzaKfbpW+N+ndH+86s2zSeqMsKVEPpE78UPmQz2dkfZ2UgdOfL9ZZGSRc5/9JPrJCql/rdc665Ph0zvYMvTIqJU5MDxYmJvjIXREdsEioc9+OvfpRuFPNsj8c6eFQmiST1r4pd/OLuQ69NYv1+ZpF8sYBDieF1i18Qht4zXaMT/Bs/ISh0598ZMYbbnKIhE3r8o0QwPjPatP/WejyF/mi/9jrdb55NoY9mpYhrva8lytVPmFv9h87oN15z7fSD7EPlkl+vVOJR6HHLvSoZaB8ZtXXpTpxbtdcs7cQ++vO//hpQQ18zuZpkor9ki8tVqU3LVPfuSff8L8VERn/PirnYa7iLogCw21eSuF/7VW8G+rBN5dKvjxOtFPf2IdDXKNn64X/my9yFei/sd82lt7n3vcS7ZCZ2Kil8nan8//a7Xop+uEvlh2jLZF51PZlKlvADDYRJT5XL+s9A3Xmffn7f9a1Pd3hzoPTXWJ0yIfrxf7x0bRDxeJ/32pykn/XP9hYtLyw52tta760gLiH64V/ecagY9WCry9XPiT9WJfjOzaZxuEPtkk+9Fep6t3y+vJmdkLkZjDQ4Mt1bXJtsZX+ETJmckVfb5B9PMNIm/tMuCWj4zJaewZGCbXNfEHgzym8QYSMtxc4jSh+yasQ0y2Wba3iebmhXy0w35CPrXsGadA/jQXRlteFF/6zdLZX83aJrJTIze95qXdDgExAwAA8HqhzBDEzCvXkDfgqrx27aX39zrod4+cguhuJIJ0hXgu0pYbXMpvyXgw2zhtpQV3lGT2X7bfaZafUlRfW99UUt1U0dh539tb8fipz2cf/9dxO8kConBcBdGbG+I1ZXecVP1SPPReelVjU0txVWNxTVt1UVpBiMX+Q4rL+Vw0q4iS0bEea/DK7Ce6o1z1tVf9fGW/TaZpTmdpVWN5Q0dVRkqZrcZ+Sf2P9+ns/Z/4UTVfmbTujOahrp6BrpqK9gAL1fMStGWitO03d+klF1U23jExFeE5OWeHCG2n/pwLEfFFTbHOTnLHhFZpJComsjeRWV9aba/62yG1uXyezoW1WU2tZZVNJZUtNS1ZqZluJ3dJbjrjKppElD28Cdfg4FBvQ11rpvutm5Kiyw9e+dsWzblHnYwSSlI7ukvLa1r8b+qKK773s414VGXO2BCWHNoO9XS0d1aUVdSnut5QMpr1q51mSH5Ka1txZWNpZWNxZQP5KGnorutmDL+QswWMvr6u9kryUNe2V+Tm1DprHrho9alsalHTVMN35jAx2N3ZTU+PSzYVEdrPI/SfA1rvHHMXsU2vqW+pbu7KDr3reUnix8M3f9JLL2TN/RCTMTzU1dbU3F5cUtHoa6qgoPcuf5BleElzcwu5a+ROFVU1FdV0NvcMjjslRO4hvTAqQO3I+W8Omm/TTiisaKipby6paSmtbU31djI8d+GbjQaH7TITCIJ1vdrDA0K+a8X20jLb1p/7u3y2RQb5n+RztSHmeodXn/y7WKR46OM/hTTcTtQ7uCgf2/rDwmVcC+atOLj+qLV/QeNz3V3tCRAzAAAArxfKDEHMvHL0ZiI/ytLy3nXnrBQmg3UiYaCHKE8IcA2VMUsMa+9tfjDbOA2ZKTbHeTbL+P0exZ7C1lFd7OukrO2u4JYR1Ey0jA1y6HWVUcEneK/vlPe5HtE+8Za5/URXmree9klh/c36+R7FD68PGuisznEykrmgs+7iXZP8/ir2ZFIvURbpbmS264DcnLVSv5okWHSNG+hmuzkryNJWyc9XjjEqGBk6xrrYifHTuKQ+FfWXTRwZ5haER6temCUefMLjwc41F0cHXee7tlfaWyqolhxxjkO+Qn6glRafkMlGyQyvUvrIZWPjBtapAcEK5+dsk//qlPMZ56L8sX2jFyXbWW/bJHXgVppVBzE4Ov/D7ewJdjS1XbDPx6Ok53ED3IczP6uJr9BJxJiev273uJh5OHNb/T15sV17RD7+w4LHIi+0fHSvBmrbou2PHlDZJOhu38SoYU8ll5y4nnQHS32Ld6VS7ldMdXfkkXlZ/2AMER2Jwc52mw8b7NZKtM2YeGlYU2GJ161LJ69vv+ZzOqmtdsJ5KvLfO7JDQ51s72jcb0ltfLB2enlKgo+Vl8bdqqDyx9+ygtlNdAf7a579ff633LP/899VRzeI3A4raX/cW/C8EDMAAACvF8oMQcz82UYGphMGpxP+g6WlMMdHVoxf665QKKOssYfe3d3c3t3c1tXS1d857mzMQ2neUSYaH5yPVgp/zN2t+hPjfG5x/2J9zb+4nH0ZUndLTfL1/VcEr/prk130yDYQFfcyTRT/sUSKWynSsIHoeDCgGuglEm6ZKGi/vc/bPKuF/cH6vIA4Y60Pdjmf9y3reDCarIhrcdf5Tsxv/y0ykRhE810fa/P/7vI0iK6f6rMW5LqLItycDy7TULhfPunHrivSw1X24oe/3jrrUsy+w/LoyL4+PcHj3OnDurHi8cTkOyEP04n6AAt9y3l73O0ymx97y68Xq6uBCDUSULD97HFnZkZ1VJb6XRJafVz3O9WC+u7xm05GWaX9BXUxPmOpHEbqlDcuIN+CWFtDTdN3z8cG5D7xjmJ9XcRd05smjgstmpPYQTLRUBeRZCl73eL/RGISqp507mSqhR+H3J2mTG9t7T1rdm1cufG0Mp9DXXHTpLfnxUHMAAAAvF4oMwQxMxMMd3XWJdhqGPJsl1zw6+Vvd17+fuel73dIfbXXYNnlmKj2yb8XL3IxNbksv8mx27OOPeVRXfmZZgKK1zyS7DuJPtbgtLa+Ppz/gIWMTkIy6/TNo/IKo223Lbu442qEXgPR/mBARY6k42yN1I3fEYr0zSPLZUS2f7S53vu8d6+FjK6+PK7JTZuMmYOONeTODNyzMFXX/16l9E4l+/lHDeZERSjIi7gXa5ZMGDp3hrt6KV35Xi7xWuTkgXtdapyr2JnDenESiTMsZtorSnwuCB654vb7HaJpQrEMMBjldlLqInwmF3MYac8VM4O9HUVuF5Ql5RxFMojiqTenj2BGWmhYrd9sc7OwpYQ98fkN9bbV1xfmFObm5JXWlrUM9T/+RM7zQswAAAC8XigzBDHD8dhj+b780CBTGc1D4vo7xQz2nmc9dvHq8PCb8tulOhd1jh+dJlgZXT0psEo++KxZrKV7mJlrmMnEh7lforq2o8Bu3r16kXIFRA9rdJRfleu184DTBeMMMjGmGm02luXdPf/z5RM3wrTrx8VMrK2Rltk7EvFBeaMj6Sy/SAu998XCVe41sKeUxTa4kDHj/4dzLRkWbV5GWhfk/iXqw28Yessz3HTy5oWbesYbapleFRJafiNZJGxCzHSEuXirKHJp52uNfvxmTG1yrKPo2cP6cVJJMyxm2sqLvaUEBNT8+WKJhgnF0j88VGotqS7Mb3o5l5E+5WtMN2boXa1ZakcV+CQclauJsqlzglx3upOO9b7lBmp5TUnsic9tqvM4ky6Ue2EQMwAAAK8XygxBzMxk9WndHtrcPKarrsWmjwxFH8hysVY8dPiT5WdpXLzvLJn68RbXyXeX8C64GiebQrCubOpPr7hvt5rHjtc4vYRg3Z75Ed3VuTHX90kLat/Tqpt4ZkbT9J1z40bSZMyY670vfE85dPRL4Udj5tBIzNCDrPWEBci107jOTtqqscfbXCfeWynyD4kIiZDuiTHj6q1ydaFatlr85O9Umbkx0z4SM7w3fE5FEvUTdusFxkxfd1uO/hlFoQuOCqVEyZRXJ7I+9p9sr23922oT7fwm8idq5kHMAAAAvF4oMwQxw+me+CvsAaI230dTW/SK9QGfpqTRL5qp8raylZHeqJNywT0/NDLtdkSab/gUj9tRWfcL2ws6iJEbeRVWF/ruPuh06bFnZupL8wKFf7p8TClMZ/yZmaeJmYNOrMvMiCg7Fy3tL6XDZRyTI6PT/R7ZsAeP29E5wbktec0TtgUxMxnOzIz3omKGavumep5ylx4zw3QOBWIGAADeVJQZgpjheIOtrfXVkcn15a39E4c9rP8i/zfkq6V/Xesz5TL/0Xsz98e73bPQ22ba4PgUn3uor6+7L7jf9LJWbMyDO/NOll0Ubrlx2cVtj35mZtoxc8ChmjW8rL4d7OzAfTHDo2S6w7KxseOzx0zdbXM9q7l7vRxzmp8w5H+ROCtmhvo6S+/IKV+64nA6gVn4yBs8coB7iYEwU3XL5dvsbYpax93O7jkNdtWVlCREJkTfj04rTK8ZoL+A7yd9jGeKGUZbRUthXHxsdHhMVnJOfcfgdG7T3Tc4UFuanJAUHh4Tn5hR3dsw1d+ZyRjDw415Vdkx0dGxEXH5OaWt5ELTOhaIGQAAeFNRZghihsMxifaoSE+bH3c73wgoa3hkcMYY6Gt01Va/rjdHt/Ju6ejVYR1xGQHWXLsdLjgVjJwKmQ56a22q2h/yggo+N2qIukd/c18UnKSn8MkSKW7liXcze6qYsascGbzlRQe6/rZYV9avIHq6m8f2vGdm9nrcympuY099yTgrZsgX6yHuW1jfdJxvVBtVPdWpGXobEWl26brVh1KJqTWP/07/p0O+E3WpLjeUt3L9vPSHpYfkjlpWFTROfWLoBXimmOmJNAyU3vDz+uWzl5/eJeIS09Q9jTApb662Vdmzbces2as3/3LMvMhzGr84YPR2tHhKmvGvXLZizdx1UkIaoUVTX9L5CMQMAAC8qSgzBDHD4VgxE+WgOWvR+c/OeAmETLpCqpOou694XGm30C2pQnreww9C9LQWJFpKKezmN//VNDdniqFjR3PZfe3zuhcss8wLid6R0dFQT13lbTM5KcPlgvecGwfZX/DC0k0UBJppGK3eJb9wg+Rv+pH69cTDO6hlONoYWLwjlRJVPbr6TN/7Fvp/PRetGzd6f7PSmAZX7W/Fg467PcgbRm9BfLT89V2nzDYZJJM98+gvp1tyYp2u6QmYp+kl9054NsErVOsat26xYSZ7wthwtasg1Vf87EmzNPlc9pRx1wKRHRDtZKy9aJH8Cee6wIdj1WGiL9XHyurEeYtjDuW3S6Y1sJzSVNcddRKxpueUHT5XzJ2qZcYt0VobIi0oonVHIJl9HznyqdHdqnO9rCUpbKFYSZSyp5BLTlxZhoOVgcW7F1IiK6d4px/OSw706bVJfl5CwjeOWGRZF7Inj2rsywm6ckh5n4KfeEF3/Ys6ecLsJNr9vNVP7Z4/e9Hc775beXg9v2dwceuzH+gne+qYIZ+vT7WQUv7f90u55n/93dq1v13UTWnOo+yFlrBqH5GDG5bN+/fXPyxZxSXgqhlIru3JGP2d2feu/C62/rt5C378z+wtu4QN7auZtdPpLcQMAAC8qSgzBDHD4ciYiY511Z23TuL9rbo/XQkKjMtLyymNSSuOyShLibkX4mT6yxHLQzoJZBKw8mN0CMrsbu+8c1PmnDrXcTu1e5mBeWWxaUXkIyatJCatMLXgnq2D8Y6t0jtvJKtlE/QHY2DmANGX4GtiuWOHtqhPgmVBBTl/XFZFUnhknLHGfmnTb44bH9xxQcD0vk490UGuqLe7PjezwEFXTFKNdsxT1T2ntIHeSL5Ojn+0sdo7R5yOGyXnlbWxbs9cFd/oqPbtaZvVVyOTsutryJFsfxOR6nyRX537iPnl+Dz3vLIE1raNbF56QVJeos1NyxP75NZdi1WIoo/sU39fb2thdlmYmbHSuYtfiweetS/KLGtrG2QwiWEmo6OuqiHI3v3KkZObLnnud2m4V9DRRh8/YCb3sDwxwOrcLtFVF8POOFeR60rMLk9MTCR3+Ay/9Ne/aqzSL3QZl4NPb4jJ7KguqUhNKiBfPDqrMiE6IfWmym9Cuv/H7+8cnpOZR75rRVHJxSklzRV9I7fDZg4Sfc01tQ3B/mE3Tp3ZIWb+P5sar8y2hi5yy5nEUGdna2lCUoT0CfldB1QPexXY5naWtw09uASKMTjYVlmel18anZidaad7TkqNdtxT3Ss9K7+MdRhTC6IyyiOL2ms7J1dDW25q8A3Z7RddeIxTo1KLkrKKY9LJY16SFnnb3dx4FY+NiEtuxoObSYz+LD0XRgfR5Op+4/gvC+Yv/WHunBWH1p+wDyhsmsapj2fy1DFDhkFVnInElc1zVizmmvX96vW/nlONb8qg/EGoDapy4t3308p5383iXr52wSlbVV/K6/IG+zrSbl/iEVoz+0fuxd9/v3GXoPbNUuZUBfoIxAwAALypKDMEMcPhmERzWHiA47d8ITdkDN3lzn21XoC2iO/95fzvr+ClLRD/x0ZDqfjK2JHR+iRMxjCRE55prDh3izCNi5e1CPsh8JcFgrNOWIgmdMV3PDJmbc+pCr+5h0f8bwvOkDP/ddmZt5ZffO8X2xvRGREFcfL7pEV07mk3ED0EUR8VZHL25Lw1x2kLTtAW8tJmy6+8eNeBQQyWhaRoX35/6Vnav6W+PeCk1zLQ3JbRaqe4cDMv7d+iH683lk6uSSNXNDRA1EXdd9JevF7ogx/P/vXh5vG9w3X0q5PW+7wH4kevUyOIsoJ0t2MbRb6Ze4z243Haj6doy67/58wdr6reYaJzoDdciV9+4axjby8kN+YYbZ38XwTDrRLYX6r5UFd+Y9RNHh6Jv84Z2bUVfO8u4n+PW3y9VqRWGVHbw3i+4Xvb8HCkhrjikjkn/285/7srBD5YzvfB4lOsTf3x7HvL+D9YQb5rArQFolznPRRLiFJylM1oJEo85MTlPp138l3Wlh+lrZSinQiQDyIH4cNEe4TfTfW5S86+M/c4bf5R2hK+vwnePurT0TVyzoTe3BiiLHNo5/G/LOF/b/Gpt7hYa3lnKd8HKwRYx3Dxybc2ytL47xnHTHG6oK+zI1RPnW/XkQ9W8L+1lHXAyQdt7oX/7LVWLmkZO+P1grAyMsFOTnr1d6vm/WfurxJ79Iuz654nGp/omS4zaw/R8BJdsmrxgi/mH/j5lHVoXee405KPU9RYYiy3de2GL77gWrl+j262Ux77iScYprfUOQjqHFkw7wfur7gFTl4LyBp+eBPCJ0HMAADAm4oyQxAzHK+3qrqi2DaqqSA5sy72rpaVn5yx73Uz8uFzxTBY1S4jvnv8JWEPjI7K+xsZ+TFmt27LGvqMLPLg4XdF/46hf040ndUkD2Z+sMDIP7uJjhxf9yBVfe9rZr7XTL0UzO8puhTk0ltqa1NU918W1grVqCU6yTFxZVGij5euTcB1yzt6tgGKhmGmgUUZTGKoq6opNdrUIUBeP1jLOSOOPtw90NKfl+DsHqhgGKhskRBc01E7sjqCaO6pSLGx8r9h6K04tnmmvlcNPXVv5/rXjb8PQVtzXbaHpb+2yW1lmyAda7/rlhGa3oW5HYOMkQ+WhPuEmhj6qtoGa1j6qtiGXvUvS6ma8KmPkV2jE10FQb7BWkZe5IqumfkomvgrmoW5ZLaMXXI1euCeQS+TUR59J8xEz0vJzJe1Ozf9r1kGadgE6trcVr7pd82U3DU/BYMAozs54a1EG7kmZg/RmhMSEKJu5KtqE6xh5a9uHSjvVRBSRL4tDKKvLC8pWt/EX80qUM0mQN3cV82/wD2vr3/k1MwgvafkfoirvYeCqd9V80A160DyLVAxH1kLuWoTr6tWIVd8SxMqJ36R/+g1Z+1ZieHuHuR2KpiwD7uc/j09j7ysF3hOho18rb7mwqQkD1t3exv7gNjA3N72iVcOvkgjMZPorrJnj/GtiMpxncBa4+PWyqhNr4x1dXNxsHQM9gkraugjf6godff15if7enhbWjq5ed7N6SqZxm0lmEODg6WRWfcc7R2crVyi7iVXk39zH7dVE64l7C0gwqRE5YwOaiFmAADgzUKZIYgZTjetcd+kD1GMms6yk+Z5/CLdNblR8r/JCuqE6beM3s3smY1s8PQ37zH7N+LxT01a6omrYz35xBkoPGkLp0axT0969mlW9tQb9rTzU5rqBZ/+cE3PgzMzroq7tl9Vtw1NbawrLa9qaO3qHJrWKZqHqDZvqu2n3KWn3efhgZ621qryqpqG2pSAclveo+K6B3FmBgAA3jCUGYKYgWmqLssNPLFcRcQw1pN1+gaA85Ax0+6f4ii8fdGKlUtWrvtpy4a1e4UMA9wbia4ZlgBkfLUUhVno79/w+5aN69eu3Lx60be/KR7VTUHMAADAG4UyQxAzMMHjfmU+VHrH56bG4t+95Xwqqqf6iA4AB2ASfYV1mX6Oxno6qioqyqo3lPRtQ9ITO4m+pzs186cj/x521+dGBBsqG6oqXVdRVdXSU7ML906oY98CAgAA4M1AmSGIGZiEwWQOdHd2t7R0NrayHi1dvU3t3SFG+pf4ZZYZldrnIWSAc70+I300CwAAAGIGnl5zT1ekqtiNn9aJf7fj0rc7Ln33i9Ss7Re/OeO41yw3saZ/pv2G+yk8/wc5MP4EAAAAeIEoMwQxA5N09NLTbmnbCgvo8kgY7ZMw4jmnzyNueMQy0ziTPVZ/WZ/e/vP19NHLIvwjbW3vGjiFkg9DyodDsIFzmOadouCCadzNCgAAAACeBmWGIGYAxtS11Aec2ysxe/aJt5byvr2U913KB/fJd1YI0w66n3QqZ78GAAAAALwglBmCmAEY0zfQ35iTnBsenh4QlUk+7lA+ItPvRGf7ptal17ysL7UHAAAAeGNRZghiBoANn5kBAAAA4CiUGYKYAQAAAAAATkSZIYgZAAAAAADgRJQZgpgBAAAAAABORJkhiBkAAAAAAOBElBmCmAEAAAAAAE5EmSGIGQAAAAAA4ESUGYKYAQAAAAAATkSZIYgZAAAAAADgRJQZgpgBAAAAAABORJkhiBkAAAAAAOBElBmCmAEAAAAAAE5EmSGIGQAAAAAA4ESUGYKYAQAAAAAATkSZIYgZAAAAAADgRJQZgpgBAAAAAABORJkhiBkAAAAAAOBElBmCmAEAAAAAAE5EmSGIGQAAAAAA4ESUGYKYAQAAAAAATkSZIYgZAAAAAADgRJQZgpgBAAAAAABORJkhiBkAAAAAAOBElBmCmAEAAAAAAE5EmSGIGQAAAAAA4ESUGcLhMcNk//nQo1MAAAAAAOA1RJkhHH9mhslgDPb199LpvX39Q8QwWgYAAAAA4M1AmSGcHjND9TlVTueuC+w9KHJNM3o4p509HQAAAAAAXm+UGcLxMdNUXOujYCS+7Y9jJ3hUMjzT+9lPAAAAAADAa40yQ2bIDQA6g/PvqO7fo6XjklpPEMPsqQAAAAAA8NqizJCZcgOAzOpkM+ENUmoW4akEgbMzAAAAAACvPcoMmSFnZoi88kwb6VUiambB9wmilz0RAAAAAABeW5QZMlNiJqc83erSGjG1myHRBNHHnggAAAAAAK8tygxBzAAAAAAAACeizJCZFDMXV59DzAAAAAAAvCEoM2SmxEx2WbrlhdXn1c1DYxAzAAAAAABvAMoMmSkxU1WV4aS48bCycWAge8rDO50BAAAAAMDrhzJDZkrM0JuL77kIHFLRtDRM7yppGRgcQssAAAAAALzOKDNkpsQMQfTXMfKMLaT3b996cJ9avFs6rjUDAAAAAHidUWbIjImZwbaCCt+rRgqip6W0rrkXxJYNsJ8AAAAAAIDXEWWGzJSYaa/L8TPYtVtJz9OpnehnTwQAAAAAgNcWZYbMlJgpqsiwk13Hp2J6N4wgBtkTAQAAAADgtUWZITMlZrLK0iylVrFuzRyLWzMDAAAAALwBKDNkpsQM60szL60Rw5dmAgAAAAC8ISgzBDEDAAAAAACciDJDZkrM5JZnWF9eLapmFhyJmAEAAAAAeANQZshMiplLq1lnZqIQMwAAAAAAbwDKDOHsmGGOfc1/am28wanNMmrWkfm4mxkAAAAAwBuAMkM4/cwMc7C/v7GkKdnU30J23yk709tFHQTBYD8JAAAAAACvLcoM4fSYGaxOKzU7JP7b/BW/HD5m3RhSzp4OAAAAAACvN8oM4fSYGe6oaYmz97bRN7rlG1RM1PaypwMAAAAAwOuNMkM4PGbGPjMz5uHHaAAAAAAA4DVGmSGcfmYGAAAAAADeTJQZgpgBAAAAAABORJkhiBkAAAAAAOBElBmCmAEAAAAAAE5EmSGIGQAAAAAA4ESUGYKYAQAAAAAATkSZIYgZAAAAAADgRJQZgpgBAAAAAABORJkhiBkAAAAAAOBElBmCmAEAAAAAAE5EmSGIGQAAAAAA4ESUGYKYAQAAAAAATkSZIYgZAAAAAADgRJQZgpgBAAAAAABORJkhiBkAAAAAAOBElBmCmAEAAAAAAE5EmSGIGQAAAAAA4ESUGYKYAQAAAAAATkSZIYgZAAAAAADgRJQZgpgBAAAAAABORJkhiBkAAAAAAOBElBmCmAEAAAAAAE5EmSFPETMAAAAAAACvGLtJpoKYAQAAAAAAzsVukqlMK2YAAAAAAAA4DWIGAAAAAABmJMQMAAAAAADMSIgZAAAAAACYkRAzAAAAAAAwIyFmAAAAAABgRkLMAAAAAADAjISYAQAAAACAGQkxAwAAAAAAMxBB/D/+yF27vTG3SQAAAABJRU5ErkJggg==)","metadata":{"id":"NcF7pCbx7OO0"}},{"cell_type":"markdown","source":"### via_region_data.json을 coco json annotation 형태로 변환 ","metadata":{"id":"FliE4cFufCrr"}},{"cell_type":"code","source":"import json\n\nwith open('/kaggle/working/balloon/train/via_region_data.json') as json_file:\n    data_infos = json.load(json_file)\n\nprint(data_infos)","metadata":{"id":"JIjpn21QLnn9","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os.path as osp\nimport json\nfrom tqdm.notebook import tqdm\nimport cv2\n# json을 coco json 형태로 변환\ndef convert_balloon_to_coco(ann_file, out_file, image_prefix):\n    ''' ann_file은 via_region_data.json, out_file은 coco로 변환할 출력 json파일\n      image_prefix는 image jpg가 있는 디렉토리 위치 \n    '''\n\n    # json annotation 파일을 memory로 load\n    #data_infos = mmcv.load(ann_file)\n    with open(ann_file) as json_file:\n        data_infos = json.load(json_file)\n\n    # coco의 주요 key값인 annotations와 images를 담을 list 생성. \n    annotations = []\n    images = []\n    obj_count = 0\n\n    # 해당 json은 image의 filename+size로 고유 image id를 가짐. \n    # 개별 고유 image id 별로 regions key값으로 object별 segmentation 정보를 polygon으로 가짐\n    #for idx, v in enumerate(mmcv.track_iter_progress(data_infos.values())):. \n    for idx, v in enumerate(tqdm(data_infos.values())):\n        filename = v['filename']\n        # images에 담을 개별 image의 정보를 dict로 생성. \n        img_path = osp.join(image_prefix, filename)\n        #height, width = mmcv.imread(img_path).shape[:2]\n        height, width = cv2.imread(img_path).shape[:2]\n\n        images.append(dict(\n            id = idx,\n            file_name = filename,\n            height = height,\n            width = width\n        ))\n        # annotations에 담을 bboxes와 poly 정보를 생성 \n        bboxes = []\n        labels = []\n        masks = []\n        for _, obj in v['regions'].items():\n            assert not obj['region_attributes']\n            obj = obj['shape_attributes']\n            # polygon x좌표 list와 , polygon y좌표 list를 이용하여 polygon x, y 연속 좌표 list로 변환.  \n            px = obj['all_points_x']\n            py = obj['all_points_y']\n            # polygon (x, y) 좌표로 변환.\n            poly = [(x + 0.5, y + 0.5) for x, y in zip(px, py)]\n            # polygon x,y 연속 좌표 list로 변환\n            poly = [p for x in poly for p in x]\n\n            # boundig box의 x, y, width, height를 segmentation 좌표 기반으로 구하기 위해, 최소/최대 x,y 좌표값을 구함. \n            x_min, y_min, x_max, y_max = (min(px), min(py), max(px), max(py))\n            # 개별 object의 segmentation 정보와 bbox, image id, 자신의 id 정보를 Dict로 형태. \n            data_anno = dict(\n            image_id = idx,\n            id=obj_count,\n            category_id = 0,\n            bbox = [x_min, y_min, x_max - x_min, y_max - y_min],\n            area = (x_max - x_min) * (y_max - y_min),\n            segmentation = [poly],\n            iscrowd = 0\n            )\n            # 개별 object의 정보를 annotations list에 추가. \n            annotations.append(data_anno)\n            obj_count += 1\n            \n    # images와 annotations, categories를 Dict형태로 저장. \n    coco_format_json = dict(\n      images = images,\n      annotations = annotations,\n      categories = [{'id':0, 'name':'balloon'}]\n    )\n\n    # json 파일로 출력. \n    #mmcv.dump(coco_format_json, out_file)\n    with open(out_file, 'w') as json_out_file:\n        json.dump(coco_format_json, json_out_file)\n","metadata":{"id":"LMPVC9S2av1g","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"convert_balloon_to_coco('/kaggle/working/balloon/train/via_region_data.json', '/kaggle/working/balloon/train_coco.json', '/kaggle/working/balloon/train')\nconvert_balloon_to_coco('/kaggle/working/balloon/val/via_region_data.json', '/kaggle/working/balloon/val_coco.json', '/kaggle/working/balloon/val')","metadata":{"id":"Fxvx9GpWCRPI","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"## kaggle kernel은 jq가 이미 설치되어 있음. 아래 수행할 필요 없음. \n!sudo apt-get install jq","metadata":{"id":"SVTwLroFHJSc"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!jq . /kaggle/working/balloon/train_coco.json > output_train_coco.json ","metadata":{"id":"vsF7vgd_MwW6","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### pycocotools를 이용하여 변환된 coco json의 segmentation 시각화\n* coco format으로 잘 변환되었는지 확인하기 위해 pycocotools로 특정 image id의 image filename및 segmentation 정보를 추출한 뒤 이를 시각화 ","metadata":{"id":"1CKuj5iKfIlA"}},{"cell_type":"code","source":"from pycocotools.coco import COCO\n\ncoco=COCO('/kaggle/working/balloon/train_coco.json')","metadata":{"id":"xzIRz6UeNEYc","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# category id와 image id 출력. \ncatIds = coco.getCatIds(catNms=['balloon']);\nprint(catIds)\n# oco.getImgIds(catIds=catIds)는 해당 catogory id별로 한개의 image id을 임의로 출력\nimgIds = coco.getImgIds(catIds=catIds )\nprint(imgIds)","metadata":{"id":"Zso0cnlGNEbT","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# image id 0번에 대한 image 정보와 해당 image의 object별 정보 추출. \nimg = coco.loadImgs(0)[0]\nprint(img)\nannIds = coco.getAnnIds(imgIds=img['id'], catIds=[0], iscrowd=None)\nanns = coco.loadAnns(annIds)\nprint(anns)","metadata":{"id":"SQATtsD9NiSL","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\n\n# coco data 실습에 사용된 시각화 함수를 그대로 가져옴. \ndef get_polygon_xy(ann_seg):\n    polygon_x = [x for index, x in enumerate(ann_seg) if index % 2 == 0]\n    polygon_y = [x for index, x in enumerate(ann_seg) if index % 2 == 1]\n    polygon_xy = [[x, y] for x, y in zip(polygon_x, polygon_y)]\n    polygon_xy = np.array(polygon_xy, np.int32)\n    \n    return polygon_xy\n\ndef get_mask(image_array_shape, polygon_xy):\n    mask = np.zeros(image_array_shape)\n    masked_polygon = cv2.fillPoly(mask, [polygon_xy], 1)\n  \n    return masked_polygon\n\ndef apply_mask(image, mask, color, alpha=0.5):\n    for c in range(3):\n        image[:, :, c] = np.where(mask == 1,\n                                  image[:, :, c] *\n                                  (1 - alpha) + alpha * color[c] * 255,\n                                  image[:, :, c])\n    return image\n\n# ann_seg_list에 있는 object들의 segmentation에 따라 instance segmentation 시각화. \ndef draw_segment(image_array, ann_seg_list, color_list, alpha):\n    draw_image = image_array.copy()\n    mask_array_shape = draw_image.shape[0:2]\n\n    # list형태로 입력된 segmentation 정보들을 각각 시각화\n    for index, ann_seg in enumerate(ann_seg_list):\n        # polygon 좌표로 변환. \n        polygon_xy = get_polygon_xy(ann_seg)\n        # mask 정보 변환\n        masked_polygon = get_mask(mask_array_shape, polygon_xy)\n\n        # segmentation color와 외곽선용 color 선택 \n        color_object = color_list[np.random.randint(len(color_list))]\n        color_contour = color_list[np.random.randint(len(color_list))]\n        # masking 적용. \n        masked_image = apply_mask(draw_image, masked_polygon, color_object, alpha=0.6)\n        # 외곽선 적용. \n        s_mask_int = (masked_polygon*255).astype(\"uint8\")\n        contours, hierarchy = cv2.findContours(s_mask_int, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)\n        masked_image = cv2.drawContours(masked_image, contours, -1, color_contour, 1, cv2.LINE_8, hierarchy, 100)\n\n    return masked_image","metadata":{"id":"DzLyizK9OXqA","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"color_list = [\n              (0, 255, 0),\n              (255, 0, 0),\n              (0, 0, 255)\n]\nanns = coco.loadAnns(annIds)\n# segmentation 정보만 별도로 추출. \nann_seg_list = [ann['segmentation'][0] for ann in anns]\nprint(ann_seg_list)","metadata":{"id":"pCqd2ggROXxv","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nimport cv2\n\n# 원본 이미지 시각화 \nimage_array = cv2.cvtColor(cv2.imread('/kaggle/working/balloon/train/34020010494_e5cb88e1c4_k.jpg'), cv2.COLOR_BGR2RGB)\nplt.figure(figsize=(12, 14))\nplt.imshow(image_array)\nplt.axis('off')\n\n# coco segmentation 정보를 기반으로 segmentation 적용한 이미지 시각화 \nmasked_image = draw_segment(image_array, ann_seg_list, color_list, alpha=0.6)\nplt.figure(figsize=(12, 14))\nplt.imshow(masked_image)\nplt.axis('off')","metadata":{"id":"bIjKuslROX1J","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Pretrained 모델 다운로드, Config 설정","metadata":{"id":"Z1RBgmmWg0TH"}},{"cell_type":"code","source":"# pretrained weight 모델을 다운로드 받기 위해서 mmdetection/checkpoints 디렉토리를 만듬. \n!cd mmdetection; mkdir checkpoints","metadata":{"id":"aWai5xDyDuFI","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!wget -O /kaggle/working/mmdetection/checkpoints/mask_rcnn_r101_fpn_1x_coco_20200204-1efe0ed5.pth http://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r101_fpn_1x_coco/mask_rcnn_r101_fpn_1x_coco_20200204-1efe0ed5.pth","metadata":{"id":"228FuB3ZFtAf","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!ls -lia /kaggle/working/mmdetection/checkpoints","metadata":{"id":"76v1kl65FvA_","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# config 파일을 설정하고, 다운로드 받은 pretrained 모델을 checkpoint로 설정. \nconfig_file = '/kaggle/working/mmdetection/configs/mask_rcnn/mask_rcnn_r101_fpn_1x_coco.py'\ncheckpoint_file = '/kaggle/working/mmdetection/checkpoints/mask_rcnn_r101_fpn_1x_coco_20200204-1efe0ed5.pth'","metadata":{"id":"i0-4EInUFmJ2","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from mmdet.datasets.builder import DATASETS\nfrom mmdet.datasets.coco import CocoDataset\n\n@DATASETS.register_module(force=True)\nclass BalloonDataset(CocoDataset):\n    CLASSES = ('balloon', )","metadata":{"id":"biyRsmLqFoy-","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from mmcv import Config\n\ncfg = Config.fromfile(config_file)\nprint(cfg.pretty_text)","metadata":{"id":"geEkm2UvGpxi","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from mmdet.apis import set_random_seed\n\n# dataset에 대한 환경 파라미터 수정. \ncfg.dataset_type = 'BalloonDataset'\ncfg.data_root = '/kaggle/working/balloon/'\n\n# train, val, test dataset에 대한 type, data_root, ann_file, img_prefix 환경 파라미터 수정. \ncfg.data.train.type = 'BalloonDataset'\ncfg.data.train.data_root = '/kaggle/working/balloon/'\ncfg.data.train.ann_file = 'train_coco.json'\ncfg.data.train.img_prefix = 'train'\n\ncfg.data.val.type = 'BalloonDataset'\ncfg.data.val.data_root = '/kaggle/working/balloon/'\ncfg.data.val.ann_file = 'val_coco.json'\ncfg.data.val.img_prefix = 'val'\n\n\n# class의 갯수 수정. \ncfg.model.roi_head.bbox_head.num_classes = 1\ncfg.model.roi_head.mask_head.num_classes = 1\n\n# pretrained 모델\ncfg.load_from = '/kaggle/working/mmdetection/checkpoints/mask_rcnn_r101_fpn_1x_coco_20200204-1efe0ed5.pth'\n\n# 학습 weight 파일로 로그를 저장하기 위한 디렉토리 설정. \ncfg.work_dir = './tutorial_exps'\n\n# 학습율 변경 환경 파라미터 설정. \ncfg.optimizer.lr = 0.02 / 8\ncfg.lr_config.warmup = None\ncfg.log_config.interval = 10\n\n# CocoDataset의 경우 metric을 bbox로 설정해야 함.(mAP아님. bbox로 설정하면 mAP를 iou threshold를 0.5 ~ 0.95까지 변경하면서 측정)\ncfg.evaluation.metric = ['bbox', 'segm']\ncfg.evaluation.interval = 12\ncfg.checkpoint_config.interval = 12\n\n# epochs 횟수는 36으로 증가 \ncfg.runner.max_epochs = 36\n\n# 두번 config를 로드하면 lr_config의 policy가 사라지는 오류로 인하여 설정. \ncfg.lr_config.policy='step'\n# Set seed thus the results are more reproducible\ncfg.seed = 0\nset_random_seed(0, deterministic=False)\ncfg.gpu_ids = range(1)","metadata":{"id":"BswAu8G7F4bt","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(cfg.pretty_text)","metadata":{"id":"9phYwByLGobG","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 학습 수행","metadata":{"id":"wujIzW4LhOsV"}},{"cell_type":"code","source":"from mmdet.datasets import build_dataset\nfrom mmdet.models import build_detector\nfrom mmdet.apis import train_detector\n\n# train용 Dataset 생성. \ndatasets = [build_dataset(cfg.data.train)]","metadata":{"id":"3ENZjGqOHyQF","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"datasets[0]","metadata":{"id":"CMRhUQsC_3a0","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = build_detector(cfg.model, train_cfg=cfg.get('train_cfg'), test_cfg=cfg.get('test_cfg'))\nmodel.CLASSES = datasets[0].CLASSES\nprint(model.CLASSES)","metadata":{"id":"y1UfEvU2ICFe","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os.path as osp\nmmcv.mkdir_or_exist(osp.abspath(cfg.work_dir))\n# epochs는 config의 runner 파라미터로 지정됨. 기본 12회 \ntrain_detector(model, datasets, cfg, distributed=False, validate=True)","metadata":{"id":"A4X56347IEoe","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"id":"UbqOLPqIIH3d"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 단일 이미지와 Video Inference 수행. ","metadata":{"id":"MiAHArmZhq4Q"}},{"cell_type":"code","source":"from mmdet.apis import inference_detector, show_result_pyplot\n\ncheckpoint_file = '/kaggle/working/tutorial_exps/epoch_36.pth'\n\n# checkpoint 저장된 model 파일을 이용하여 모델을 생성, 이때 Config는 위에서 update된 config 사용. \nmodel_ckpt = init_detector(cfg, checkpoint_file, device='cuda:0')","metadata":{"id":"ocB3V1_0qY-R","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# BGR Image 사용 \n#14898532020_ba6199dd22_k.jpg, 16335852991_f55de7958d_k.jpg\nimg = cv2.imread('/kaggle/working/balloon/val/16335852991_f55de7958d_k.jpg')\n#model_ckpt.cfg = cfg\n\nresult = inference_detector(model_ckpt, img)\nshow_result_pyplot(model_ckpt, img, result, score_thr=0.5)","metadata":{"id":"ntxP4wF3rLY7","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\n\nlabels_to_names_seq =  {0:'balloon'}\n  \ncolors = list(\n    [[0, 255, 0],\n     [0, 0, 255],\n     [255, 0, 0],\n     [0, 255, 255],\n     [255, 255, 0],\n     [255, 0, 255],\n     [80, 70, 180],\n     [250, 80, 190],\n     [245, 145, 50],\n     [70, 150, 250]] )","metadata":{"id":"eW7ITCEWhwyf","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# model과 원본 이미지 array, filtering할 기준 class confidence score를 인자로 가지는 inference 시각화용 함수 생성. \n# 이미 inference 시 mask boolean값이 들어오므로 mask_threshold 값을 필요하지 않음. \ndef get_detected_img(model, img_array,  score_threshold=0.3, draw_box=True, is_print=True):\n    # 인자로 들어온 image_array를 복사. \n    draw_img = img_array.copy()\n    bbox_color=(0, 255, 0)\n    text_color=(0, 0, 255)\n\n    # model과 image array를 입력 인자로 inference detection 수행하고 결과를 results로 받음. \n    results = inference_detector(model, img_array)\n    bbox_results = results[0]\n    seg_results = results[1]\n\n    # results 리스트를 loop를 돌면서 개별 2차원 array들을 추출하고 이를 기반으로 이미지 시각화 \n    # results 리스트의 위치 index가  Class id. 여기서는 result_ind가 class id\n    # 개별 2차원 array에 오브젝트별 좌표와 class confidence score 값을 가짐. \n    for result_ind, bbox_result in enumerate(bbox_results):\n        # 개별 2차원 array의 row size가 0 이면 해당 Class id로 값이 없으므로 다음 loop로 진행. \n        if len(bbox_result) == 0:\n            continue\n\n        mask_array_list = seg_results[result_ind]\n    \n        # 해당 클래스 별로 Detect된 여러개의 오브젝트 정보가 2차원 array에 담겨 있으며, 이 2차원 array를 row수만큼 iteration해서 개별 오브젝트의 좌표값 추출. \n        for i in range(len(bbox_result)):\n        # 좌상단, 우하단 좌표 추출. \n        if bbox_result[i, 4] > score_threshold:\n            left = int(bbox_result[i, 0])\n            top = int(bbox_result[i, 1])\n            right = int(bbox_result[i, 2])\n            bottom = int(bbox_result[i, 3])\n            caption = \"{}: {:.4f}\".format(labels_to_names_seq[result_ind], bbox_result[i, 4])\n            if draw_box:\n                cv2.rectangle(draw_img, (left, top), (right, bottom), color=bbox_color, thickness=2)\n                cv2.putText(draw_img, caption, (int(left), int(top - 7)), cv2.FONT_HERSHEY_SIMPLEX, 0.37, text_color, 1)\n            # masking 시각화 적용. class_mask_array는 image 크기 shape의  True/False값을 가지는 2차원 array\n            class_mask_array = mask_array_list[i]\n            # 원본 image array에서 mask가 True인 영역만 별도 추출. \n            masked_roi = draw_img[class_mask_array]\n            #color를 임의 지정\n            #color_index = np.random.randint(0, len(colors)-1)\n            # color를 class별로 지정\n            color_index = result_ind % len(colors)\n            color = colors[color_index]\n\n        # apply_mask()함수를 적용시 수행 시간이 상대적으로 오래 걸림. \n        #draw_img = apply_mask(draw_img, class_mask_array, color, alpha=0.4)\n        # 원본 이미지의 masking 될 영역에 mask를 특정 투명 컬러로 적용\n        draw_img[class_mask_array] = ([0.3*color[0], 0.3*color[1], 0.3*color[2]] + 0.6 * masked_roi).astype(np.uint8)\n\n        if is_print:\n            print(caption)\n\n    return draw_img","metadata":{"id":"Ds8MG0whiALA","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n\nimg_arr = cv2.imread('/kaggle/working/balloon/val/16335852991_f55de7958d_k.jpg')\ndetected_img = get_detected_img(model_ckpt, img_arr,  score_threshold=0.3, draw_box=False, is_print=True)\n# detect 입력된 이미지는 bgr임. 이를 최종 출력시 rgb로 변환 \ndetected_img = cv2.cvtColor(detected_img, cv2.COLOR_BGR2RGB)\n\nplt.figure(figsize=(14, 14))\nplt.imshow(detected_img)","metadata":{"id":"gjXfjeoZrmCp","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"id":"qo8MtufErmF1"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 원본 이미지를 Gray scale로 변환하고, 컬러 기반 instance segmentation을 적용하는 함수\ndef get_detected_img_n_gray(model, img_array,  score_threshold=0.3, draw_box=True, is_print=True):\n    # 인자로 들어온 image_array를 복사. \n    draw_img = img_array.copy()\n    bbox_color=(0, 255, 0)\n    text_color=(0, 0, 255)\n\n    # model과 image array를 입력 인자로 inference detection 수행하고 결과를 results로 받음. \n    # results는 80개의 2차원 array(shape=(오브젝트갯수, 5))를 가지는 list. \n    results = inference_detector(model, img_array)\n    bbox_results = results[0]\n    seg_results = results[1]\n\n    # 원본 이미지를 Grayscale로 변환. BGR2GRAY적용시 2차원 array로 변환되므로 다시 GRAY2BGR로 변환하면 3차원이지만, 여전히 Grayscale임. \n    draw_img_gray = cv2.cvtColor(cv2.cvtColor(draw_img, cv2.COLOR_BGR2GRAY), cv2.COLOR_GRAY2BGR)\n  \n    # 80개의 array원소를 가지는 results 리스트를 loop를 돌면서 개별 2차원 array들을 추출하고 이를 기반으로 이미지 시각화 \n    # results 리스트의 위치 index가 바로 COCO 매핑된 Class id. 여기서는 result_ind가 class id\n    # 개별 2차원 array에 오브젝트별 좌표와 class confidence score 값을 가짐. \n    for result_ind, bbox_result in enumerate(bbox_results):\n        # 개별 2차원 array의 row size가 0 이면 해당 Class id로 값이 없으므로 다음 loop로 진행. \n        if len(bbox_result) == 0:\n            continue\n\n        mask_array_list = seg_results[result_ind]\n    \n        # 해당 클래스 별로 Detect된 여러개의 오브젝트 정보가 2차원 array에 담겨 있으며, 이 2차원 array를 row수만큼 iteration해서 개별 오브젝트의 좌표값 추출. \n        for i in range(len(bbox_result)):\n            # 좌상단, 우하단 좌표 추출. \n            if bbox_result[i, 4] > score_threshold:\n                left = int(bbox_result[i, 0])\n                top = int(bbox_result[i, 1])\n                right = int(bbox_result[i, 2])\n                bottom = int(bbox_result[i, 3])\n                caption = \"{}: {:.4f}\".format(labels_to_names_seq[result_ind], bbox_result[i, 4])\n                if draw_box:\n                    cv2.rectangle(draw_img, (left, top), (right, bottom), color=bbox_color, thickness=2)\n                    cv2.putText(draw_img, caption, (int(left), int(top - 7)), cv2.FONT_HERSHEY_SIMPLEX, 0.37, text_color, 1)\n\n                # masking 시각화 적용. class_mask_array는 image 크기 shape의  True/False값을 가지는 2차원 array\n                class_mask_array = mask_array_list[i]\n                # 원본 image array에서 mask가 True인 영역만 별도 추출. 색깔을 가지는 풍선 영역 \n                masked_roi = draw_img[class_mask_array]\n                #color를 임의 지정\n                #color_index = np.random.randint(0, len(colors)-1)\n                # color를 class별로 지정\n                color_index = result_ind % len(colors)\n                color = colors[color_index]\n\n                # 원본 이미지가 아닌 Gray scale 이미지 위에 masking 될 영역에 mask를 투명 컬러로 적용\n                draw_img_gray[class_mask_array] = ([0.3*color[0], 0.3*color[1], 0.3*color[2]] + 0.6 * masked_roi).astype(np.uint8)\n\n                if is_print:\n                    print(caption)\n  \n    return draw_img_gray","metadata":{"id":"DtPTX10eo5nx","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nimg_arr = cv2.imread('/kaggle/working/balloon/val/16335852991_f55de7958d_k.jpg')\ndetected_img = get_detected_img_n_gray(model_ckpt, img_arr,  score_threshold=0.3, draw_box=False, is_print=True)\n# detect 입력된 이미지는 bgr임. 이를 최종 출력시 rgb로 변환 \ndetected_img = cv2.cvtColor(detected_img, cv2.COLOR_BGR2RGB)\n\nplt.figure(figsize=(14, 14))\nplt.imshow(detected_img)","metadata":{"id":"RMGF1X2By-LA","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!mkdir ./data\n!wget -O /kaggle/working/data/balloon_dog02.mp4 https://github.com/chulminkw/DLCV/blob/master/data/video/balloon_dog02.mp4?raw=true","metadata":{"id":"mDTvtXIUzFWA","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import time\n\ndef do_detected_video(model, input_path, output_path, score_threshold, do_print=True):\n    \n    cap = cv2.VideoCapture(input_path)\n\n    codec = cv2.VideoWriter_fourcc(*'XVID')\n\n    vid_size = (round(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),round(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))\n    vid_fps = cap.get(cv2.CAP_PROP_FPS)\n\n    vid_writer = cv2.VideoWriter(output_path, codec, vid_fps, vid_size) \n\n    frame_cnt = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))\n    print('총 Frame 갯수:', frame_cnt)\n    btime = time.time()\n    while True:\n        hasFrame, img_frame = cap.read()\n        if not hasFrame:\n            print('더 이상 처리할 frame이 없습니다.')\n            break\n        stime = time.time()\n        # Detect된 segmentation 영역만 컬러 처리하고, 나머지 영역은 Grayscale 처리.\n        img_frame = get_detected_img_n_gray(model, img_frame, score_threshold=score_threshold, draw_box=False, is_print=False)\n        if do_print:\n            print('frame별 detection 수행 시간:', round(time.time() - stime, 4))\n        vid_writer.write(img_frame)\n    # end of while loop\n\n    vid_writer.release()\n    cap.release()\n\n    print('최종 detection 완료 수행 시간:', round(time.time() - btime, 4))","metadata":{"id":"cuvyuI0J2Oqt","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"do_detected_video(model_ckpt, '/kaggle/working/data/balloon_dog02.mp4', '/kaggle/working/balloon_dog02_out.avi', score_threshold=0.4, do_print=True)","metadata":{"id":"skR68rtj2akr","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"id":"HxWRmb7Q4-A6"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}