From a2427fc1f25e84d212cbfb204fc3a91bd7120536 Mon Sep 17 00:00:00 2001 From: Harold <8866033@gmail.com> Date: Sat, 25 Apr 2026 19:24:20 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E7=BD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- py/红果短剧.py | 228 ------------------------------------------------ py/红果短剧.txt | 15 ++++ 2 files changed, 15 insertions(+), 228 deletions(-) delete mode 100644 py/红果短剧.py create mode 100644 py/红果短剧.txt diff --git a/py/红果短剧.py b/py/红果短剧.py deleted file mode 100644 index 5419bf8..0000000 --- a/py/红果短剧.py +++ /dev/null @@ -1,228 +0,0 @@ -# coding=utf-8 -import json -import re -import sys -from urllib.parse import quote - -from base.spider import Spider as BaseSpider - -sys.path.append("..") - - -CLASS_LIST = [ - {"type_id": "逆袭", "type_name": "🎬逆袭"}, - {"type_id": "霸总", "type_name": "🎬霸总"}, - {"type_id": "现代言情", "type_name": "🎬现代言情"}, - {"type_id": "打脸虐渣", "type_name": "🎬打脸虐渣"}, - {"type_id": "豪门恩怨", "type_name": "🎬豪门恩怨"}, - {"type_id": "神豪", "type_name": "🎬神豪"}, - {"type_id": "马甲", "type_name": "🎬马甲"}, - {"type_id": "都市日常", "type_name": "🎬都市日常"}, - {"type_id": "战神归来", "type_name": "🎬战神归来"}, - {"type_id": "小人物", "type_name": "🎬小人物"}, - {"type_id": "女性成长", "type_name": "🎬女性成长"}, - {"type_id": "大女主", "type_name": "🎬大女主"}, - {"type_id": "穿越", "type_name": "🎬穿越"}, - {"type_id": "都市修仙", "type_name": "🎬都市修仙"}, - {"type_id": "强者回归", "type_name": "🎬强者回归"}, - {"type_id": "亲情", "type_name": "🎬亲情"}, - {"type_id": "古装", "type_name": "🎬古装"}, - {"type_id": "重生", "type_name": "🎬重生"}, - {"type_id": "闪婚", "type_name": "🎬闪婚"}, - {"type_id": "赘婿逆袭", "type_name": "🎬赘婿逆袭"}, - {"type_id": "虐恋", "type_name": "🎬虐恋"}, - {"type_id": "追妻", "type_name": "🎬追妻"}, - {"type_id": "天下无敌", "type_name": "🎬天下无敌"}, - {"type_id": "家庭伦理", "type_name": "🎬家庭伦理"}, - {"type_id": "萌宝", "type_name": "🎬萌宝"}, - {"type_id": "古风权谋", "type_name": "🎬古风权谋"}, - {"type_id": "职场", "type_name": "🎬职场"}, - {"type_id": "奇幻脑洞", "type_name": "🎬奇幻脑洞"}, - {"type_id": "异能", "type_name": "🎬异能"}, - {"type_id": "无敌神医", "type_name": "🎬无敌神医"}, - {"type_id": "古风言情", "type_name": "🎬古风言情"}, - {"type_id": "传承觉醒", "type_name": "🎬传承觉醒"}, - {"type_id": "现言甜宠", "type_name": "🎬现言甜宠"}, - {"type_id": "奇幻爱情", "type_name": "🎬奇幻爱情"}, - {"type_id": "乡村", "type_name": "🎬乡村"}, - {"type_id": "历史古代", "type_name": "🎬历史古代"}, - {"type_id": "王妃", "type_name": "🎬王妃"}, - {"type_id": "高手下山", "type_name": "🎬高手下山"}, - {"type_id": "娱乐圈", "type_name": "🎬娱乐圈"}, - {"type_id": "强强联合", "type_name": "🎬强强联合"}, - {"type_id": "破镜重圆", "type_name": "🎬破镜重圆"}, - {"type_id": "暗恋成真", "type_name": "🎬暗恋成真"}, - {"type_id": "民国", "type_name": "🎬民国"}, - {"type_id": "欢喜冤家", "type_name": "🎬欢喜冤家"}, - {"type_id": "系统", "type_name": "🎬系统"}, - {"type_id": "真假千金", "type_name": "🎬真假千金"}, - {"type_id": "龙王", "type_name": "🎬龙王"}, - {"type_id": "校园", "type_name": "🎬校园"}, - {"type_id": "穿书", "type_name": "🎬穿书"}, - {"type_id": "女帝", "type_name": "🎬女帝"}, - {"type_id": "团宠", "type_name": "🎬团宠"}, - {"type_id": "年代爱情", "type_name": "🎬年代爱情"}, - {"type_id": "玄幻仙侠", "type_name": "🎬玄幻仙侠"}, - {"type_id": "青梅竹马", "type_name": "🎬青梅竹马"}, - {"type_id": "悬疑推理", "type_name": "🎬悬疑推理"}, - {"type_id": "皇后", "type_name": "🎬皇后"}, - {"type_id": "替身", "type_name": "🎬替身"}, - {"type_id": "大叔", "type_name": "🎬大叔"}, - {"type_id": "喜剧", "type_name": "🎬喜剧"}, - {"type_id": "剧情", "type_name": "🎬剧情"}, -] - - -class Spider(BaseSpider): - def __init__(self): - self.name = "红果短剧" - self.host = "https://api-v2.cenguigui.cn" - self.api = self.host + "/api/duanju/api.php" - self.headers = { - "User-Agent": ( - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " - "AppleWebKit/537.36 (KHTML, like Gecko) " - "Chrome/120.0.0.0 Safari/537.36" - ), - "Accept": "application/json, text/plain, */*", - "Accept-Language": "zh-CN,zh;q=0.9", - } - self.classes = CLASS_LIST - self.filters = { - "分类": [ - { - "key": "area", - "name": "分类", - "value": CLASS_LIST, - } - ] - } - - def init(self, extend=""): - return None - - def getName(self): - return self.name - - def homeContent(self, filter): - return {"class": self.classes, "filters": self.filters} - - def homeVideoContent(self): - return {"list": self._list_items("热播", 1)} - - def categoryContent(self, tid, pg, filter, extend): - page = int(pg) - items = self._list_category_items(tid, page) - return {"page": page, "limit": len(items), "total": page * 30 + len(items), "list": items} - - def searchContent(self, key, quick, pg="1"): - page = int(pg) - keyword = str(key or "").strip() - if not keyword: - return {"page": page, "limit": 0, "total": 0, "list": []} - items = self._list_items(keyword, page) - return {"page": page, "limit": len(items), "total": len(items), "list": items} - - def detailContent(self, ids): - result = {"list": []} - for raw_id in ids: - vod_id = str(raw_id or "").strip() - if not vod_id: - continue - payload = self._get_json(f"{self.api}?book_id={quote(vod_id)}") - data = payload.get("data", []) if isinstance(payload, dict) else [] - if not data: - continue - episodes = [] - for index, item in enumerate(data, start=1): - play_id = str(item.get("video_id", "")).strip() - if not play_id: - continue - episode_name = self._clean_title( - str(item.get("title") or item.get("volume_name") or f"第{index}集") - ) - episodes.append(f"{episode_name}${play_id}") - tags = payload.get("category_names") or [] - result["list"].append( - { - "vod_id": vod_id, - "vod_name": self._clean_title(payload.get("book_name", "")), - "vod_pic": str(payload.get("book_pic", "")), - "vod_area": ",".join(tags) if isinstance(tags, list) else str(tags or ""), - "vod_remarks": str(payload.get("duration", "")).strip() or f"更新至{len(episodes)}集", - "vod_year": f"更新时间:{payload.get('time', '')}" if payload.get("time") else "", - "vod_actor": str(payload.get("author", "")), - "vod_content": str(payload.get("desc", "")), - "vod_play_from": "红果短剧", - "vod_play_url": "#".join(episodes), - } - ) - return result - - def playerContent(self, flag, id, vipFlags): - try: - payload = self._get_json( - f"{self.api}?video_id={quote(str(id or '').strip())}" - ) - return { - "parse": 0, - "jx": 0, - "url": str((payload or {}).get("url", "")).strip(), - "header": {}, - } - except Exception: - return {"parse": 0, "jx": 0, "url": "", "header": {}} - - def _list_items(self, name, page): - payload = self._get_json(f"{self.api}?name={quote(str(name))}&page={int(page)}") - data = payload.get("data", []) if isinstance(payload, dict) else [] - return [self._map_vod(item) for item in data] - - def _list_category_items(self, classname, page): - offset = self._category_offset(page) - url = ( - f"{self.api}?classname={quote(str(classname))}" - f"&offset={offset}&showRawParams=false" - ) - payload = self._get_json(url) - data = payload.get("data", []) if isinstance(payload, dict) else [] - return [self._map_vod(item) for item in data] - - def _category_offset(self, page): - page_num = max(1, int(page)) - if page_num <= 1: - return 1 - return (page_num - 1) * 20 - - def _map_vod(self, item): - total = item.get("totalChapterNum") - remarks = str(item.get("sub_title", "")).strip() - return { - "vod_id": str(item.get("book_id") or item.get("id", "")), - "vod_name": self._clean_title(item.get("title", "")), - "vod_pic": str(item.get("cover", "")), - "vod_remarks": remarks or (f"更新至{total}集" if total else ""), - } - - def _clean_title(self, text): - value = str(text or "") - value = re.sub(r"[【\[]热播(?:好剧|短剧)?[】\]]", "", value) - value = re.sub(r"[【\[]新剧(?:热播)?[】\]]", "", value) - return re.sub(r"\s+", " ", value).strip() - - def _sort_qualities(self, items): - priority = {"1080p": 3, "sc": 2, "sd": 1} - return sorted( - items or [], - key=lambda item: priority.get(str(item.get("quality", "")), 0), - reverse=True, - ) - - def _get_json(self, url): - response = self.fetch(url, headers=dict(self.headers), timeout=10, verify=False) - if response.status_code != 200: - return {} - try: - return json.loads(response.text or "{}") - except (json.JSONDecodeError, TypeError, ValueError): - return {} diff --git a/py/红果短剧.txt b/py/红果短剧.txt new file mode 100644 index 0000000..60ed90c --- /dev/null +++ b/py/红果短剧.txt @@ -0,0 +1,15 @@ +// ignore +//@name:红果短剧 +//@version:1 +//@remark: +//@format:secspider/1 +//@alg:aes-256-gcm +//@wrap:hkdf-aes-keywrap +//@sign:ed25519 +//@kid:k2026_04 +//@nonce:base64:3yMG/lP1rbyiuq2u +//@ek:base64:+KBsZiOu5xvmWi8uouBxrTm6kxabuwL4NGTFM/130SPS/5D9g9nDCYcEFDECR+EB +//@hash:sha256:656890e9a95c07003623fc29165860798021bcb22330a9506c2570eda26e7b6a +//@sig:base64:p8EDrbE4DwaXS/DDPe206MP3x/vZkYCSV+TtioaMZcsArumBwzeTT5A+OFbJUp0pfJ59mWC/I5phwESRtntLDA== +// ignore +payload.base64:i4NB35pef/Ukun0+l1eYBROXB5O9OX354FyHvhc08MpVTEU09GpNrNbyG0csR6j4hi1F0Xvt17J9E5frNquCzpCRv17ipYMXCgJPBb2r9t/45etHHoyK61FLwxpJFEspOBu2zCuJCUkdrm1P6ccZpfnIlwbNYGB+WNtS8JT2UxA3iboqzewNDWHgV9y3rbNUtIzcBnkx3enlVzKKHebwIgdB9eO4LQQQ8fHQSf75oFNWT+PwDCKN0G37hM4360H6NrWDXxVpIeNlppULdoODg1xA51Ut3RphWiGoo681nbo/H8cedv6pZycdjKS+A953zjGy53KJafXWsbZAyRBVVMK5oznnZa3sVwMXKEjVvrhmSqLUSlc9h4dIR+S8Vs4ee3QYTiz2efat82xpVkpzo9wIsvVPDcckpbzyN7YiSPHvG//Glm/4r0+evibG5On2900CLurxq6PjE9i0yA06VDzZzeDrND70Ng1zX8UL5Ir+fQLuaOQmGNJfK4jsPASFdb9SPeZu/uEu6+vqqchlYpJSocIbl/+Ozb934Xf+fSnMAByQuPDX1Lxmd1vvBmHWHPOWBK2srhUG9sCxIgaxiCh0s3BZpeK9yhgWzvilDaGYedRaUJWmv7sn+UXKsYs+S0YKDVZbD01/ZMJlIDbdRGyEeuzv5vB0dNmkH/z6LAWxO3Fx0RC1kVbkieaovgOeJ6JEFCl3yL4zJCd+Cp3kui82yfjhOPb0a7e688fj+2qKLRrJBM7hubcVXBOVbH1meKVGe1xKbXrokvnHFEyIBrWQ4AeFM3v8uoFhD8RIH0nX10HSdqtA7Bwosgpf6XJBj0xIZ+yLNxE+IskVgJ/GzNgx18Sbg+gglKxK+qens/2wW3r/iwwww/Mri8NsW5Pbev4i9i0ARc7io2kHXccpipYAStLi5dl/QdWkTs/ayySy1NUNjIq26q5bL1t4MX9NzGw/WxEqU2RfK8QUBlW6mqLeDepIF/+zWIIm78DmqfDXvxHTiHkaexGWEOAAvF6YS9SPQnd1gK+5wj5N0tqo6tvk3cvoWVGjGmq7l6hPjgToFLKs4bk3ljNOLIyWJgVUTA7ufsv6H/5wMopCLigioAd5MgsFN2cMQPwWiP/5gw+vyUIMNPf01m2s5PATlVjs8RsTHfVqNMLw54FjRMQfzAHjhyLYuDXJZe6ScyrtHi+v2q8UsmMc6KOOCLBxsmKkFY82c+DYPXXMaPSw/P3IZ7IQ63T4MJoYkGufBnOkAxSl853RZJ7Yfnez8uUnvxgpsolusg/GfbEpn3XnA1XqZqsXHeqEt8FkXtPu/U6lqfmcGENjfQ9wk1TFZkCvPWcfFvKXRNnjDqS+DAMLccrt43VU8fG3Z0EVjDXJgCCGWjso6UaE8xdkXmujuoO9wooEzfoLesE9K4yIR6WHORs3WHpPDR6iPGlGJJkcx9d5PpeHjiGIukmLzWImt6tY4YxWPTtoKfnfyWsEqAR2VWwzZMhPIIbGuU/usEhwSXvW4/8NkP36159R8FJIhnySIVnhjVPg0SiuDswhgLBBQlrdH+0rFdNub8ypYBH4IuFJYoztwCaoAO5FgoPbG0MPrpNkNWZnxnSVdkRmHDXh3bWmu8Jgl/df7r9jqxanItriM/dGm23SMaznKia9OmRY+mFC9m67JZhhnsMZB18yJPrtj0vyO+dG/iAQ8QgB9svZovh7HaxAW2hSkvtrz+HGvn2GkfXQ/1JFLRkFcJ0QJrD7RRaBX+04Fg2RgKaOJzYoydtleznyXIUWg/EHiP1+zQXJ5tSy9mg2Ux6NgDu2LcS14QJn0jtb4ivhENn29n7G2W+FNLVD2+2itywDGEqOsZJJ8jtl/G/iWsGR6LJkWYrGc9Qr+nhBcnOswXDfLc4hEK7iX+7riO4Aspmp+FjdUO5iqvOQXcbtgvG3uYghvulIlYYpyRbXuCqIJwv8VN1af3tRZcvS6RpntpWvGX8RY7oaav5c2WTyDbeASETT/sZWz3GVL1c6o6h2GYZeBPmeKa89QzcnMwGVdI5Fh4XR7+o8jZxCwdUkmhnogW7SVLw9SBIS7SpBwWXTSgztc1q1yM5mUeO8xOPzVGZB6B7Sq5wsP+nH9es/SI2XXi9luAR36CTX+I6Gs8djPefd2oLLl73vxlHLgXCpIVLNClLmu/6HVtlp5XiRbTBSBj55o/oV8w6IcYHxp2ejL6kSs9Xahmu0PePJL8OMWJLS+QqOcCLblRI1xvEMCdeGBfG7SKLQ7+pTsdFqUzhCdQBHf9og69qi50ZFOVuTmH/gADATbCMJ2OZe1gRgbDS7i47UkdCtYFaM5rvvcCSs00k0hF77dXTM+txRbmdXh31HYf5pYEDmCAi4WsyO6B6y6jRzyeJlRv9we2TGj3AlsN7BAFYVIaZfYVNp6Q2fOiOm1N+2PxVRx8VrneLQAKk6oo7Mm+Zkf+PmMW+UJgQLC466IWviyV0cMXxIdz33c4/iymO8V7l7oiNzAAx6hrD/4OPCGS0ySQpeXUWmhlC7gjMxMtOPOJXu7vvm9MqP2hKptXSP79NYUgvXANQyiIRgFqAXWn6qcXop5y/losLH+4rx0bPZIaApJhzrzwyCxdJ1WNhcfYRH9s6Xe1CXFUe0zZZ8QHYN4LYMdlr4VmCjhmFumvZxB6hYyT1eey9R0sb16uRwM9loTxea4ld7Ptz7x56TKNQzhu84ehbj3Fcwx8SIrBk6kj5f96qrxO4VzE/Ij2/vel+Imemo+lBvY1h7/QZk28/dWOsq9/AZyo0+7+D4m5g9MFkMT9rSY+SU8ik1so55OHL8B2scOaUakrfkJVKgRivr2VAaAjWTMmF0vtO6goH9lq6Pjt0bLy1kuyIPPZQxJMGW4IkNWdu3bOztO3t/cmjjhPaiR7oDNUlhIkWljBzBhJ0dJc11kYyiDs2yQS8mUGgN1e4UDYusaI4NSsyvKYYu30hD7vpbfKquZymi8OefjEXa1+vvSZQRrKe39nRDnth5KVA60tV9JECUg9Oq1b1goiYD+rVNX3dfha5WFPJcITXqgvAwrrJ0golh6s1RUQR8L3oMf6eXddccJhO5UJL/yGGM4wc/XAnrR1w2rQI4LiGP0zrPyvWtroPwDjw3nW93Tct/VPmHxgcHbi/cDtCgNhx2Hf+1XmYhnZlxAJgKll31MpcmhYeg3TBare3j0DB1RSfVXoCKcU7C7lJ9jToC98E+GCsCh9uxdY/WfqEDhPXykBL5iNycWI7UGg+OxZ1BDtT6jW6jxHN1+FVjEzE3bYSvp69K0gVQqrRU9scL3fK9DbmVdEo019ywXHu7I6qg2oPbgI1OZsj4bTw24eZhAX13C579xrYpiyI++Hct8gK7ocsSJTAzTj2V7jPi6zGvEpV9m8dlMTw5brYpmEmOM7mcMr5xo8Yo/5CoOALId+TMjoI4PfNAkd5KM0I6FSw+bP8jKNzkIcl0q/Eeu+gzzjtun5SB5DyzFZh4O2Qs2ndw4l8yXvOHN43goB7hOUpvapp/2FIasXvnOqVNlCQegh2nKT2qQcyWQHuTLHn+ItfUChGkpCGRzSBbbZ0E6F7a4Js025J/ioWwuPClMr1lnRoG+OjiJsxAfXnSeh/etm0oh1pa0541I54X+XYKtvASB7/7eknNzzGoQ4/J7MImgfcAI2pdOXzJeNwPerpUmdaYVJ0rbxpHsRcTO3xz8hC3pGNmmBN8SyHADH6XFQGCl0RSQWXZQ6ErR+cHquJ/zyimMnQ3XXflVCF6ut4abFQ5TKBIEYSrHTnFZDT+WBY1pIwgQGlrklkdVS9W0+mvjE+NsXcsVt2LW3EQjX/EHHkaU13aNiFNy21uq70JtJeXBNTRtbBYILZAsVYr6LeLEy6si4rZGSiDIAW1s3s7xls8vxS3ZhyCYg+e1jdg9GTtNrCKFEJP83Gar+j7hOZgJcJZRuIrZ6Dm31KT+FcNVMlWKFVvON9khHqbuNbgtDsTIZ2sjbWOcqv9+YeaGcDNxLH3qjpZBaumjoIR5as2mEVkLPy4MTx+nTH5gvhbtoa+syhQBWva7IfIFK4cnfGXsMsSWkdFKNU9zotzU6CMILbSM+EAxDpsstESKWNwD6Ep8ul8QWt6zHLDg/eSmPyE0OvtFzg7snSMgFvneDT5CL+bmG+7qJ5pL8NSuqSODFwL86pq1cLymy5PjkF3VvwP2HOR9UkPv8Oihex9xA5BIDvjLxdCnmYUbGdPYMMboSkA6syxejiiYk1mZEmWD5uQ3LEuI4hyAubWHQzghtCLt/ZSt4s9ViotlbCFEmn/YXxI9H3JVpJjaZfS89SJ0YXOPGzYnMXbIF/9yxYw0C4Ngdv3Kl7UonZci+DeSC9GpvJabYag+AQmX7uO5//purCJcmOrE9ze0suV4cOmLb4GwiqMSG76CEB+t9pGckH+pqGVdF2IgqYiMNzYfx78Iz1XHa3T81rv8CthG8wdWMzsnlWTcr2A7EmkhpzGe3eltrCwlfJziDubRAzuNwZxmJ93eG6VoqDVUla5cp27awed48mRSR2wA0Z9hrp8J+eKOSXXMdEdVZAk2pSqdVxU0GsZzG56EgMVoBMvMfbs5ciGe7OsbCPlNfntlAqmti3DJZfSB5WCcjGq/WAJJZc9Rhg7xnP04+lzFfSLUK8eA+1yqQKPhpWFO3Ph8BdhfMMLr/II+dtKffWOTTJhZWNrqITqFsHAMPVImzQ3ehB5rRVv80CgkRYNrwLmVUOkqyLakjbAXmsdiH1t3oEFncUaW1DpASQDzZaEvFKo2jPkBoPoPJt0qfnbNgC9Z1LkRRHvZg4uXinf/fyYk9qkWf7EtTWjpiHCqp5KJtzta+mUtWRCgAcaoSykO8qKgQ4ovagEgP9Ad0O+O4kGz1LyXqy3UmXgkyuEjk7rpe52ozeYMRA1uzVCvLYMa2cr5D/ziRLfuED93lhKOtfpO4Xk9BLkP4L+D1K1iU7bnfgE8swtxUqlU2AVyBUwvU0RVImfNPN+bGNv0MMBBgQqvczE5Ke7lTnXxJKLKpmashW1EtjWvDk7cOWEmLHACE2hoMXtBJCBRenHkhlXY1+Nq7hXGtJE/zj223+pevF/6BFaiUpvwGTJtC//yTSRR3XrLqTOnBkOyRnWutcsX+l/Zuv9byEfI8jPiqJAqnYADVt61dOmxyb3wWFCn43bB9SCZAj+b4SzK3IAgwTGB8cdbPaDiluck/r5b65ppXjkTRRkboQKHpb6c3yFAL1OWgdtZ42k6GApBAnF0ZqdtYZ/6zs2xRoq0SfDPWPcrY7qaYnMEvocjP3UoxvEH0TklOZ1FVvKr0gEJHc54d2obWhr+eVCJMDAj8dD8x2yUTsRHjm0ZY6CTKo2xppu011/optUtebSriF/jWczMeb/oZQt69CrwUmur+exPDBNfNZcZVJ7hYkJL8GuKakPNAo5n3f5i+64pjRMZFAn9BWHXfWjU2BduM5dmdJcPlOTwN0x/HN8E93CSjMu23Hi75zNhancaJKHGYKME/voqc3O5l1oiIqMfdjGigwFocQa+0hPrWDKPMYl483vBasN2F5gx+Lw28kaybjGWbU7k3lTGRzvpf/o9nSCEgk5WZqv2MXwWAtggnRtkee/sVcBRMe6WIbWRZIoaZthlLS/tCpEKEFO5qTuGY3AbC525dleXgauyKSOE9m7aWQoxBR6WltDERPLNgF74+Dg+bdNcC2E20Gfp52/JRNEH3dOfaOtY35lMOGAZfejC5eKe0ZdE9/GHPpj+MBoiTdzcUtIJ7iR9O+0HiLMCMdI9o5ZqzSsOpTXFaYvhHDeVOOZ4UjvbbsV1efBlcbgGORqoYdzztCuhzuJBaVb5f/EDATVibAo3gaDkzHXRpcBuAXWart9lR5cwFQxVMwlo094fVAWa2e2zZY5PI2Q9l/FQtr/xCUqzE+JI6MxS1F/XUASpI3ElTnrwgvYVIfZR//edRyQVXqrZHtRgRFQ0Oq9i6qcQufPm/XUO0C9kIcAqL3SgKZXcwzZwUBKDpX5T5Sv/ig2viYTn0LLLgpdGffrzF41a/xbwfGw329qT4NVVmiNFpeXOGfmNZScn/Qxm0k5vqDiPRfXvl+33VS+jatgCBIz74e/HLQiJf/090IXhpW79bDhrJMC77gA3ORYSmvfZq3AS+Qpd9HcGhYzbGC2rh4Vx6EBRjhRDOH/uwxkcHBcIL70Pal0bX3FSjlHN6s6BrBZLPDqk/q2FqvQHz5lkX59N6WnAVRtbamGrNM5GNfL3UpGkSXyfTn/H7KyHBQbMNlvUc3jRNRrjZOn92iq+j83qTWMaTJJS/s+HWP7O5TUOtvgn+yP+lSXQLCcTp5ZOn/0fw0xsrDuOiK2GxQa5Ro9wroRBLdstkpwd0tz00F3wAOEXVn1zZaRq75Xcb7Zl0SGJhRIHjOTKcj9YsMzK+ELA0DUz0D4EOs/JrPxI9v8ct/AKMtwFSgJqdTjolxEQQPnbgqk3icluUVwCV5rUARs2Mt735AvTRUrENkPBfl9J9uH1iwOr9lxUDPPRlQv9iIbub1D8UuutEoeyRUdIvmEHWmNxkb7x9EakxMyOuZGFB5nPMpeG/hw4d7b8VC68jcqEznlu9R81XqnqzXI/9oUSz6oMJOZ26vt3WfH/1DhT7wbeJRDuzAH7OnzPSLBDetshidiRxZngTBdLvBHbj86Hb5igLzXql9FbPgPovywEBk3KSWEwKXkVYN3b6IbHAv3ycobKRP1sTTHGS/FDiFL9sGNin/7mTvgLUTLorKatnFoYwaZqekT3kKbo0w/8O44GnJNXC5dfSbK5w3bLvc8CMX7gqsOocgX7V1I2mMs3xB0Uqz2jeBucCrM03xlJc5VVqON9PpWWz9SmCs/3uAlGtRJVSL2uUlUqLiX1oky8OHpt+Rjjl32eB9NTTPDQrd6Tl6QUKgfCXNMIJ6E8Gycdd6nM1VVdDecJFRGxLOAzbwCOgEMEZRHrwI7K2gJJ+VKzgBKxIpHWWwdpzI470B/HwvV21SprFhO8Q0I/QKVjm3p5eiEgkK06lnpzGtCh4UF2qpDe3tAjj/K0gOxwtgR32KbBjR7d9U0RdbjYR2FXr6h/r6tC0x+cc8KUuCNMmtplln2s6MGwr/3kVZ4aCK5EG0vVQfUuKlxZHPwZB6IlOpk2UNptj8gcMkcFEUi2bUMHORHuMQHjtaj5FEifxuTrbjgyTCvf2s4i/vAaLhxJ6g9Pr4+hSJhnxlA71uF3Z7CLUJOGOFRXL5nG/k5TqjK0zMJ0pfgWXY+hfBX2c7RZuzeXII+fLinOk9maqRLzGA/H63YEw9aCV/0rdnxUUUyCjrOWAh3HxxL7XdaqFDdIn5bu0QzUpQ1T+JVxSpikWbg8C35EC2lieawAwQ6PzAsDByXgebsAdDzth3HlPPGkHj0NSAKdpUFglqXEUMNvbx6MuqMDXg40fV+6tj1iWG606AJiW5Sf0edomklPNvdJS96/PCgVfGifYlDR2hWytqsFqRb2/2jkGuAhskv3MVhwA+Ikg1vBbxHunLsRLqujyJ1JQbk1mWCzrY5xtnC80N2LC1K3g7VErrf1AC6c8Df7hTajVN6t3V4V8vStAy+6rUJkaLqVzQUMzIJzkhiZDU3usXjxSbV5stgemB9BmvGA1y11xDtbjWOljYO9key0LbNTkBkduXKbe/KBJT954AuQBf3fXqnAZGsfqXmknxinM4eYwROawAiwqyklPmOXGvUEgy5shjZRUxEKlEbnAB9hu/MTso5T617TMOiiY5NtFXvnwq3KJdbCDNYe9muioWcWJz225oQzhYGXi7nRf47jipdcZrtQdnWWW1JZHr5s+ZFHvnF5udaYBW2bSYpe/lps3kME00Zdkxu8mwfdDuVslbWBASeI9iqZQEPjHpont8Zaj8WyabAo+nzvJf89DiVEX1BYATx9DsNKm0fjzQ9kVXEMzeV8nGqh2SLI+kcfvxXsQE38+iFJUE3ENbojo6d5cXW+3aaNrzPdVDEnIISnTl3FiZlo4X9NAKOzTix9I1p5ZECoAxQssLOoar8cLr4Tgy31XjA8aGMIKukc3w2UDDW8aP/uziLzgRIGSL/uBETONuMwkIfyjUzobeQa+26yEMtuQU41bl4cz7ar3ryjZYojaUtG7EnaBCcLZj9SfxZHELR+baDlbCNH0q0u+G85oKT1kSOr6ZHf949utrCyKea8KhswYVsBAGnpzYDoDrXGLlgHlkg/M10yod22mVbuwS+wcA+f4E/b7kmywp7ufnwVtRfmLhBRAKhPTushfiLF0MNbGIx0LkD0sYfSg6sw7JNd86mEw8HwXWfwx743R6dl5aQtI+1B1KSa1e6Wy8u+7jSFIuemSlqoxRVVzSg7W1kP7oyEMc7qQwfy6xF6r6LbstFsW9i+ymzDiA4xnE03g7v+WS44DQt/jIEzmh6Z7MxKv2jnUxhrBWlOrXbYq7g28H3KRLPdtn3ZBpbzZpq/v6Z7oj30AgC+2B4UKgbrQie675wgvxxCYDKK+6c64dM8yFNg5MEiTRemW/WML6cHBuDFWBlKDjIJ7ygx82QXzYjgiJBxgw1DOT84wIAZtZ0rBASu6kLEgiVsIumY1h1cq6clKzDUale0iSATRywDHPwthZAuygUkRSQW8f7pVnt2407nHQjG3WBiYq8xHIzz73hpCd68+r6aGjPUatss1+eUCWfkse8oXRE0JfQnNoErxmS4/nu6rM9+08+xo0BL4NVp4R27NYwFbU1P5sP1p2GXKFlcbG53YWbjR7RM0uL7gO2FZ1acShYgYQGiyRixSL3IMrZs7aPCe4MqFKF1grQrFQjERBRK0vCEd1iJQvEY1AS4tEUOyy/yYjNi1MhGhixvdSgAewFpbN/t815ro8CnuA7ePIqEonStL/+Tusfyyw+pgJIIQX6bW+bBiiTVvPJDZUuTU6LCjQHz9mheNFVB3Nz3s30YiS2m+nX21WKNlmR393ORHsrYiAmXRIkeB/asu5vB8chZD8IiQZ47NvJ4zrjTNsCkaYBCdh+5s5jlB0MFRzWbLUNM57liH+fROG/1xca1wxrVlbpP3E/xtqYtbxIi5j2Xp3+wRX70J9VM0jLBx61+ZIAGYF8Yq65dylouismodjElYc2z9hDXS8+QiZ0A0HH+ON8UfNvdixFOkBoRIf5lYVvWlsS1FA2rWd1PpTGQwJq4C0qS4r7QLWez//c7KxQ+8d5MUSY0dB35klHgqoRrb0EMyErlBuHPsdgX+2kYZ+HBQZmqDaGVSWNOlJIegSh/pwu/o4/O7YSRz5Z6aWHQRhS2fy7/bW+wYpw7QZsWwnE/7QDp8zpEdHLRLDWkHZoE4pNq5wydXWoygRcnAcQW8LA0bIQG+z70j8FMSy15F6Rz+FzEi7a22p7rwHaqvT0UKGv4oP7/LomKsGwl57y3L4tTAJgtEQvwbvPttiQE3QQdqhPVFwjV7I+JPMbD5NNPDeM9eQPhAAE9o8kCipvHqWbNsOzkfbd+Ojf9opGA6qV1jVmAbFmGdsLymly/IonPSbWrWIbZuEYKAgUGdRaJzKMcKBgvs0zCoVGw84kcJhxrJS5kxD/nWvMdtSA0uGCv8t3isFV3YdKNvA12wQ+FYoWFVCZlfa8YYzsCDTHT73q5K5yHaQHqTUlh5BZ9JeFC+cRdXoKXosgLOgLo95ilLOWGCjotGxJ2VyHBWnCdHWyg6WJWDFcTaxHUJOAYGLqEoB6SGL1uuHPNm2iEf3PkRV2n9munKCr1BY1wQPcfto23N/ebCOitBo1s90FBIi9IjYm3FI5Cgr/ps7HidFhPQc3wIFbJK7rHv+vrXCB0nzT3hXbBCuDSkanbzyM/J+gbNceKeqQ9Kcr5b4yb6/L3v4Du3OBYY0FU3vEtf++YDLj7EwhVmmjJ6TFzzHfuiajJzZ1B/YjKug2eZHjWEQk1hQe996LPwcnwsR6bnNhKQgNrMdDY73bgjk/12Ch71wEIVt08uKLWfNhVsx/2IMNt7v66eYxtX8tS/8JbcLsz1RXcIo6HAm8CkCnYVMlnTc5ts1udAKjvlAZzTQ5Pex7JSQD2CT+TALTuu+0YWMwvMbV/OynvYIhUj48ts3RH9R7Hqky9HRgorqH+zUMmoJLKpgk1lGj4mzP6qUWto3uNffOTWuV5aMfFFqu5pbhPsvkYNXytWfl/2qhy7Riy1fmCk4HL+OfKty1nEy9V7bwOpgespay5CjOeG+2xTbSMvD49dHf3RPGNmwwj0ap+zUT0d2KOxHKYcqCF903TdBWuu3b7vFm4DCSYjv60hOWYYDqnCGzbaDxMo2gYoEMUdRarjp07n8zOGNcGNrP4ofkhI84sd95Bj7viOPEYRx7xUxsxa3GqmAA+yfy4gHuSNh2awHeLQc7nuraTW3IVvd31YiJO0kBQLUe4xiRpCfkm8lNdwjZKS6BK4PXzO9YEonyDKmsc1vA+hE4V/Ltm1ztS8CCEeiLS8cPUbPU1dZgNGkQigJR5Vg4sTFDBoXK9kfFQYd8JEpy1nJ0hBgBZkoVDT2eYoUoemeU7apPV7/oSCKZTwuMpmQUWwC3crba4GH0ZC2hdX49r4yskG3K7f20ddTIqKXgFHZYn9qfqULXGsRNGYFHg1TamkQqGrV1nI7WGW6U+RzEHy52LPfxWpApLpbKAtK43a1l4M8i5x8FwZ/FFoLxeKi/hEMTYvfcq0i5lq3FFcLIr2FKViV7WLq0cgZILLylo1HlnYYPNgMdHbUw/Jg+tJVddKOJ77DjdAuj/8wKC74qLsjgWStZlnqVKEyPRvYhzsAvQ4jbU+7nYm+IE+E3xfdZIDXO2pIa9oIvc0DDnkPM2BQ2yY5dgbbMxs5yj0NVLnVNoAWHhHgDeRKQnP85Rnb2ApF8WlTlKnu8t8gcFy0cgZ4ggJmOoU3F349QvFqrZZnVD/Zyttjpr68ZNXNrJ4A83PO/R5S5IIs3VRfbXUdkGXKwB/z+cvrdycU0poUPbMvXXUSkVfqp9os3rfqqSalsjBizV0kIDXIWvNOYPS63QKvx/+9dI20TK7C3gUXG6Oi6m8j0QgzfQcZyVVdw1LP6KDzVV6q/NgqluqkAHYzdtgqZpa82mcWmWlwmh8WvkVPyu+kHLFpVKgMhRDRJ3EHuQapbK7dbs9gtV8Cq2BPEW5+kfog5QOIrezXhlctCSXsDiT/LXqlYbRLmBbsqBvLE76JBFqIHQQ7etOw5Uyl07mvXQStJaW78N5SE/9OzmKmzsJhTDf6ix0CPizO09oCsMSvOCd2JaPcopUoHRZEfbGxuM7hTSepoBtDfW60gR3g2v+5dNWZCYsyZh65tmEq61A+HBf+9XLSuvwj61KLy0a8pZBqpntlaWjQM8gcsPOARsk9mLmYpw1FJMq7hVA4c/ihkEzp/2q+qrsyokVLctp7LT5r1XZ9FT/R2efwZ4lpCiRXZsBRJQfVJeu6bqRtPZvAXE31kjGa3St9Gx8ZeWZmLkqyAaNrSVbtF2+Ssn642qTMsnazWak89kfCVPlmdLBfeuU7k2NnhEtrs778J8NdhRayNQ8auPaApnyfaohiNMdR4NFAbC4IaLoPkvC90099MRQVUKRfb1QxogrKTc4OgYYDMyzQse3vssIbvIR7aQvPgEtrxbVxSKZpsFk/yxTatiV1OraWMkZTP6vra9HHCAqDZ9YmYb0blIJz4WWaIkQmsiQ/EN+2C3d7Vl/x9vMFjDnTDJDaQ09fps4M5/anT4iyjOUwYuh9ol/VRJoIcX3vWDYadEP2bsI95Xn8uI0rBAcPqM4g3oIbLumeMWUbazvND2B/LgGGsR2sale3c+MjNAJ1RStSKzQAGIs0Y7AffUd7WTyrETktG+dhITdqv4fzaWDfRFGydHoNsGE2Kia+6JCAZAB6FqNF/KdQLDowNAD1aGKyPyyRMgrllD891xwBdw9Xm5Kdt4mb7+taJaPmSnmOhgNA+NPQP+GJqlR1B4rm12097h0sHzK0vkaOe72yEm+uN6oPettMlc17YtsHesy5JxCXOX/lDhp0VP6CFg/BjxVHQNtKSTaszfEwnd+e482NuVCOKxY1dDglPp497iCv1SBwM/PuQ0qwAEmoEV0ZEdrMwFz3waL1WT9oJZehEAwZE5C7/GRhDvyT7bH2hRJeyjRSFuM9oUCSJ/68c93ajwjev1GVFkJtpdXv2nagnPnvaaQo5znXTbrjWrsZ4pAdivn++bxkS4407xRjPRIYWuGsrilP0uooMVG/9Xw0Ejwn8RDe9WQsyU3Cm8gk0648/gsH9u6h5BuFi1dM4lMKvjjpbmwOx+q34w2YxfnpEpNUXvQDcFMqe7rjh5LIwkzCyLlFT9VWSDh3oEA7jSvJjTUtLNbE6K38SpK5e4oGZzdIGgUViRDe78PKqiaywshsUE2/fn40cZ3UmZ9o+WRamwXYfFwxJcMfWUQBl+k4qSM/4Tno+1UN48HTO1eiOp3t1NZaXvQuX6OecDq29lKsB0HH7GGeUPa3lLCnAxXtWfoxNAsVtB3ruWzIwk5FelUk6MtHnBJSn+d2CAbtnWyn1rclBCmMlDnk7eHJVVzUdtWqI92I4ig9vgrkz2wI1o1hOuPZRrOqDNZQFfWqqUz9g/VkF7cQKX+l29Sk7xCcK6LOxP4MZn27rXo4/Op95oIqgfPl+tC7SN6ddbVLChsZomEjsu/wLliVDq0zSmYoztXrAZVhNK8Ph+ATV8ynQctWf9Tr5VUZ+TSQ3/iHutwvx0d0AXBdBFiineLjM0Z/NEGPceTeuMthCk0XxY21s4ZsGGGqeth/tYhk500fUWv0kLW3Q8KBtW4CTWTQyLB3YjfsM9v8TkCEnA43QxgGSnxGiOVpHLL8iDGELmsQptxsZHWk1uNcwJCgvCZimHvdWRdD7VZiMVFBYfBwMpFbDsve2kK10O+UpByczdxmXwBzZ6+W3Feu2AVx+FTOKcoC5 \ No newline at end of file