hiddifypanel 3.0.0.dev64__cp39-cp39-manylinux2014_x86_64.whl → 3.0.0.dev66__cp39-cp39-manylinux2014_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- hiddifypanel/Events.py +27 -4
- hiddifypanel/VERSION +1 -1
- hiddifypanel/VERSION.py +1 -3
- hiddifypanel/__init__.py +7 -3
- hiddifypanel/__main__.py +13 -3
- hiddifypanel/base.py +88 -3
- hiddifypanel/base2.py +40 -3
- hiddifypanel/models/__init__.py +10 -3
- hiddifypanel/models/child.py +26 -4
- hiddifypanel/models/config.py +105 -4
- hiddifypanel/models/config_enum.py +207 -4
- hiddifypanel/models/domain.py +106 -4
- hiddifypanel/models/proxy.py +55 -3
- hiddifypanel/models/usage.py +58 -3
- hiddifypanel/models/user.py +171 -3
- hiddifypanel/panel/__init__.py +7 -4
- hiddifypanel/panel/admin/Actions.py +170 -3
- hiddifypanel/panel/admin/Backup.py +80 -4
- hiddifypanel/panel/admin/ChildAdmin.py +122 -3
- hiddifypanel/panel/admin/ConfigAdmin.py +54 -4
- hiddifypanel/panel/admin/Dashboard.py +70 -4
- hiddifypanel/panel/admin/DomainAdmin.py +195 -4
- hiddifypanel/panel/admin/ProxyAdmin.py +128 -3
- hiddifypanel/panel/admin/QuickSetup.py +127 -4
- hiddifypanel/panel/admin/SettingAdmin.py +224 -3
- hiddifypanel/panel/admin/Terminal.py +51 -4
- hiddifypanel/panel/admin/UserAdmin.py +277 -4
- hiddifypanel/panel/admin/__init__.py +82 -4
- hiddifypanel/panel/admin/adminlte.py +13 -4
- hiddifypanel/panel/admin/commercial_info.py +23 -3
- hiddifypanel/panel/admin/websocket.py +9 -3
- hiddifypanel/panel/admin_2.py +33 -3
- hiddifypanel/panel/asset.py +17 -3
- hiddifypanel/panel/cf_api.py +35 -4
- hiddifypanel/panel/clean_ip.py +125 -3
- hiddifypanel/panel/cli.py +172 -3
- hiddifypanel/panel/commercial/CommercialDashboard.py +59 -4
- hiddifypanel/panel/commercial/CommercialSettings.py +224 -3
- hiddifypanel/panel/commercial/ProxyDetailsAdmin.py +38 -4
- hiddifypanel/panel/commercial/__init__.py +50 -4
- hiddifypanel/panel/commercial/restapi/__init__.py +14 -3
- hiddifypanel/panel/commercial/restapi/tgbot.py +57 -3
- hiddifypanel/panel/commercial/telegrambot/DefaultResponse.py +11 -3
- hiddifypanel/panel/commercial/telegrambot/Usage.py +71 -3
- hiddifypanel/panel/commercial/telegrambot/__init__.py +6 -4
- hiddifypanel/panel/commercial/telegrambot/admin.py +120 -3
- hiddifypanel/panel/commercial/telegrambot/information.py +123 -3
- hiddifypanel/panel/common.py +98 -3
- hiddifypanel/panel/custom_widgets.py +71 -4
- hiddifypanel/panel/database.py +18 -3
- hiddifypanel/panel/hiddify.py +655 -4
- hiddifypanel/panel/hiddify_api.py +70 -3
- hiddifypanel/panel/init_db.py +393 -3
- hiddifypanel/panel/usage.py +85 -3
- hiddifypanel/panel/user/__init__.py +25 -4
- hiddifypanel/panel/user/link_maker.py +416 -3
- hiddifypanel/panel/user/templates/clash_config.yml +1 -0
- hiddifypanel/panel/user/templates/home/multi.html +1 -1
- hiddifypanel/panel/user/user.py +233 -3
- hiddifypanel/static/css/custom.css +6 -0
- hiddifypanel/templates/500.html +1 -1
- hiddifypanel/translations/en/LC_MESSAGES/messages.mo +0 -0
- hiddifypanel/translations/en/LC_MESSAGES/messages.po +194 -190
- hiddifypanel/translations/fa/LC_MESSAGES/messages.mo +0 -0
- hiddifypanel/translations/fa/LC_MESSAGES/messages.po +123 -120
- hiddifypanel/translations/zh/LC_MESSAGES/messages.mo +0 -0
- hiddifypanel/translations/zh/LC_MESSAGES/messages.po +123 -121
- hiddifypanel/xray_api.py +109 -3
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/METADATA +1 -1
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/RECORD +74 -76
- hiddifypanel-3.0.0.dev66.dist-info/top_level.txt +1 -0
- hiddifypanel-3.0.0.dev64.dist-info/top_level.txt +0 -2
- pyarmor_runtime_000000/__init__.py +0 -4
- pyarmor_runtime_000000/pyarmor_runtime.so +0 -0
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/LICENSE +0 -0
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/WHEEL +0 -0
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/entry_points.txt +0 -0
@@ -1,5 +1,226 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\t\x00a\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00^*\x00\x00\x12\t\x04\x00\xa4\xbc\xc1\x9foLM5I\xfc-\xb7\x1f\xdd\xecB\x00\x00\x00\x00\x00\x00\x00\x00Q\xad9\xd1\xd8\xb1\x18\x03\xa2\xcb9(\x06\xd2\xd2\x93\xbf\xdbn/M\x8c\xab\xe4\xacf\x84\xce\x18\n\xde\xd6\xfe2\xce\xc1"\x82\xe6\x97\xbd\x8eP\xfa\x19|\x9d\xb7@\x95\x94\xc4n\xea\xbd\xf5\xec\xa2\x89\x9a\xf1\x1a\x8aI\x84c\x13}\xec\xbfJ\xc7%T\x11\xd8WFF\xed\xcd\x10n\x18\xef\x8a3\xfdA\n\x8a9\xc6\xcb\x1fY\x13\xc1U\x03\x15\xb5g\x82\x16\xa0FR\\\xe1\xfc\x1e\xa5\xea\x07\x9b\xdb\x9c\x95\xb9m\xc5\x07\xb2\xc5z\xf3Q\xa5~\x0c`e\x11\xde|\x98!\xf5wV\xee!q\xe4,\xd2\x0f\xe6\xb0\x88\xf4\xf9\x89\xe4;\xe6\xc9h\x9f\xcd\x1d\xc3L\x9e\xda1R\xc8\xf1\xeb\x9a\xf9\xf7\x1b[\xd8\x91_\xe0\xc7\xec\t\xb9\r\xb4e`\x92\xc1\t4\xf2\xbf\x98\xf4\xbe\xd9\x96e\x7fI\x82\xf4\xe2\xa8{\xe9V\xeb\xda\x88@\xfen\xa7>?9K\xe1\xacy\xb9-\xf7l~c\xe9\x06\x85\xc5[K\xa3\xa4\x81\xbc*%\xc5a\xaf\xa3\x84\x18\xc0\\=\xcf\ni|\xd0\xb1{\xcdZ\x06\xf4\x05\xb5:?#\xc6\x16\xb9\x8b=\xd7(H\x1c\x94\x92\xb1\xb6\x97\x19W\xd1\x85NfB\xa4{\x01\x0e\x92\xfdOs\xca\x04\xaf\xc4\x98\xfa\x98\x8bl\xc5\xf2\xcf\xac\xd7\xc6\xa6\xdb\x8d\xfdE\xbdt\x8fj\n\xa1\x101\xb6\x85&\x84\x17\x11\x04w\x97DVG!M\xdeX\xc3\x0e\xf3\x1c\xf4\xbf"q0?\xca_\xa9\x05\xe7\x96\x7f\xcc\xa64[\xa6\xcc`M\xf7\xda\x10\nd\x8c\xd3+\xc9C\xb2|i\xdf+\x04\xc8x\xa5\xd4\xa0`/w\x81}\xa2\xca\xe9\xf0^\x15\xcdw@\x9dW\xc2\xaa\x8eO%\x9e\xb7p\xd3L8\xb5\x96\xea\x8a;"\xc8\xc7]Vo.\xc5}\xddphn\x0f\xfc?\x18\x1a\x1fm\xce\xf3\xf5\x8a\x08\x0f\xd9\xc70\xd7\xff\xe2\xb2\x13\x1ec0;\xd0\x95\xfeY\xd9P\xfd\xd9c&\xe3z\x07-\x8d\x1b\x868\x9a\xa4\t!8\xd4\xef\xf2\x0bI\x80\x1fUP\x15\x99\x92\xb5#\x13U%J\xe8\xec+\xf0X"\x15\xee~\xd4\xf59\xa5\xd2\xbdc\xd2\xbd\x01\xf2}j\x90\xaeH\x11U\xb3E\x1a\x7f}\x80\xd9\x82\xdc/\xf2\x10A$\x86\x10(P0zF\xe7Q\xdeS\xfe\xf2\xe77X\xe6*\xcfM\xbaoE\x8f\xbcAXZ\xf7\xeev\x99\xfe\x99\x9f\xac\x97\xba\xa6j\x0f\x8eWS.5k\xee\x80p\xbd\x10d\x93\x00\xb2\xe7\x14\x04\x7f\'\x9c\x0b\xfe\xd1\\\x0c\xea\xde\xe2\xd5\xe7uE\\U\x07\x9b\x19V-\x9e.8\x0eHD\xb02\x14D0\x14\xcbe\x08\xe7\x80{Vd\xec\x17f \xd9\x06\x17E\xe7\xb1\xbfa\xf8!D\xfb*XL\xf3\t\xe8!h\xcc+\x97O\x98\xae\x9c\xe86\x9a\xe1\xdb\x00C\xbbi`,\x80\x8b\xc4I?\xd8;\x94\xabi\x86^\xaa\x04\xc3u\x99\xa3[\xda\x8e\xcbO[I\xf5\xb2\x96\xcetm\xa0\xec\xfa\x1a\x8d\xf8\xb5\x02\x00\\\xa2\xbc\x1d#\x9b\x02\xf4\xc9\x9f=C\x98\xef)+\xdfQ\xc0)\x84\xce\xd3\xd8\xf0\x83\x91\xbb\x81\xce:\xf0\xb3\xcfR\xcf\x16_\x12\xd5U\x82o*/\x93\xad\x956\x1d\x17\xe9\xb7\x8e\x01\x93\xf1\x9dfk\xd3\x1c\xa2\x03\xe3\xc4x\'J\x17\xb4\x80\x94\x19\x0e\xbe]\x0cwV\xda\xd0\x0f\xce\xc2\xd5FIHv.`\xb1r\x0c\xd0\x00.\xf7\xf1FQ\xb7\xb3#\x10\xfd)\x16\x8e(\x9a\xbb\xa16\xce>M\xaf\xf7YY\xcc\r0\xb0\x97\x19\x99\x9a\xe6\xab\x9b\xc8\xcb\x96Ld8L\x05\xfe`\xdc\xd4\xd5\x0c\x18\xac\xa3r\x9a\x86A\xffr\x88\xdf\x95\xdf\xbc\xe5`\xb5$\xf0~\xd8\x18d\x83\xb5\xe3\x9a\x80]d\xff\x0c\x05\x89g\xdb\xff\x82\xf8E\x8f5\xb5\xeb\xbe\x81\x1c}\xbb\xe6\xa5N\xa7\x18\xc3\xba.v\x07\x87\xcd\x7f|w\x7f\x86\xfa#\x9f\x02\xc3\xc8\xd44^\xe0\xe0 \xff$j\xaci\xfb\x8d\xe2\xb3\xf3\xea"\x9a\x14\xbc\x83N/\xf8K\xae5\x1f/^\xae\x90e\x11"^\xb1\x06?\x89\x198\xec\xbb\x8b\x1f\x99\x9d\x86\x1et\xf4e;\xe6\x99\xdc4\xba\x80o\xd6\xbc6\xda\xee\x07T\xc7\xadY\x8bx\xe1\x8cx8|\x88\xd4.\xfc\x04\xac%\xe0\xf5\xf7\xc3V\x11\xb8\x00\x811sc?5\x97?\xf2{\xfa\t$0!\xef\xf6\xcc\x8f\xe4s\x1c\x16\xae\x9c\xfe*$\xffm\x04\x9dt\r\xb5\xe5z\x88\x96,iU\xd8\x8e$\x07\xad\n?\x93)\x8ep\xc9l\xd2l\x81t\x12\x81h0\xe8\xa5$m\xa1\xd4\x8a\xd9\r\xa0\xa9\xd0,\xd8\xf0Mz\xcb,K%\xe7/\xbb\x84\xf5{\xdc\x8c\x1c\xfa\xaeN\xe6\x95h\x039\xd9\xe9|\xff\x90\xd9\x91\xfa\xce&jcv3\xb5G8\x03\x91\xf5\x7f\x95\x9b-\xfb\xe3\xa5\x16u\x9d\x86\xdc\xbb\x9c\x8d\xc2j\x90\xfa\x94\x02]\xb8\xd7d\xab!W\xf8\xed/\x87tD\x9ef\xc0K"\x14\\\xa1!\xe9\x0c\xe6\xc7\x9b\x0cV\x0f\xb1F\x12\x85\xb3I\xa0\xc41\x0bh\xe3O\x1c\xb5\xe2\x1d\xe3\xf9\xbe\xa0\xcb\x8c0v%\xf4\x0e\xfbSo\x10\x05FE\xe8X\x14L\xd9\xb9V\xe5\xac<\x1d\x03qfPaj\xcd\xd3\x87\x08\xaf\x19\xe6\xd1\xbd\xeaVj\xb4g\'y_\x97\x1f\xfa?\xb9r\xfb\xfb\x91z\x90{\xea_\x84_:\'\xb8O7M\xef\xd8 \xcb\xe5\x84\xee"\x8fb\xc9@\tYz\x11\x9c\xb98\xf6\x86\x88\x9dNl#\xb2\xda5\xba\x8c\x17o\xd1\x042@b!:\x03\xc0\xfe\xb8\xc2\xd5\xecn\x99\xe1:\xb8\xff\x93P\xad\x19\xd8\x030\xbc]\x95\x94\x96\x8e\xa7J\x9c6\xeeuT\x0f,c\xaeR\x81\xe7\xc3;|\xee\x1c$\xa3;0\x85\xd8,\xd8}f\x88\x82\xbcT\x02\xf2qq\x95\x8d, _\xe5\x83\x96|Pb\xba@5\xef\x8d\xfa\xe1v\xd5\xe8\x1f)\xca\x1f\xbda\'\x99\xae\xfc\xcf\x8a\r-\x0b\x84\xc7\xa3\x0fi\x13\xe6\xa3\xb4\x9f\x19\x83\xe8P\x965\x85I\xf9u\t\xe3\x8e\xcf\xd1{\xb2\xaa\xaa\xef\xab,\x18\x08\x180\'\\\xc4\x02\xe2\x93\xaa\xc4\xa1\x89\x1b\xf5@@d\x8d\x1b\xf8\xad\xa5Z\xc4xZ\xf7\xad\xbe\x83g\r\x87\xf5\x12\x077\xff\xa07\x94\x10\xcd%\xd0\x99\nzl\xb9\xa2\x800\x1b?\xd9$!B\x98\x85.RAu \x12\xe3\x8cYFC\n`\xba\x06@c_\x92\x8f\x06\xe7\x92\xbb\x05\xb9<y5]r%\xe5\xa3\xdd\xb3..\xb6cy=XW\x15U\x9a\x91\xe2b\x1f\tZ\x14\xb2h\xf8]\x82=SbZ\x04\x920\'\t\xff\xac\xcah\x9b\x88\r\x10wF\xa14\x82\x95\n\xc1\xcb]\'\x03l9\xc6\xe9\xad@\x8aY\x1e\xbbD\x8b\x80O\x10\xc4\xeb~\xe4EOmg\xf9\xcc\x98R\x92\xaa*"D5\x15#\xf2\r\xa9\xb1\xd2\xd7"\xd5\xe57\xf2\x12\t\x95\x9560N\x85Z\x8aq<\xd4\xdf[2\xca\xe8X\xcf\xb72\xb2N<\xa1\x9e\xde\x8fN\x13\x0b,\t\xff\xa9\xbb\xcf\xf4j\xd2\xba\xab\x18\xd6\xfd\xcbgz\xf7B\x97\x81\x1e(\xe5\x8d\x9c&\xe6\x96}\xeb_\xa1\x0c\x91w\xbd\x95\x84E\x92r\x84\x11P\x08\x90\xcdmY\xa4M\xcc\x89\x8a\x95\xaab!%I\xaeY\xcc\x01\x16\x90\xfbz\\f\x81,3\xa7\xd8\x1c\x91\xbd]=\x80\x84\x8b\x1e\x1a\xf1\x80\xb2\xfa\r\x8c]M\xad\x8b}\xb6\xbf,p\xf9\xa7YbJQ\x99n\xd4\xc8\x8f\xe3(\x03\xef\xfc\x9b\x1e\xc9e\xa3#\x1845:\toZ\xdc\xe5z7C\xca\xe4\xeb;\xfd\xb2\xfaP\x1aU\x98F_\xf4\xcb\x8e\\\x8a\x12\x7f\xb3a"p\xbcj\xebA\xcb\x13G\xee\xbdA\xb3\xb9>I\xca$\xbc\xb5\xbba\xeb\x8c\xcb\xa95#\x0c\x96y0\xbfxv\xba\xc9\x91\x08\x8fjxt@\x02\x8f\x16\xd3\x88\x1e\xc1\x95f=\xae\xb5\xd0 \xe4\xf8\xa5\xa5\xb8\xb2Z8\xd1\xad\xa7\x9f\xe4S\xda\xaa\xb8<\xe6\xfd\x1f\xb2\xb1Vf\x13\'\x943\xdd\x122N\x9a\x82)\xeb8\xaa\x0b\x9a\xe7+\xb4\x16;\xdb\xace\xd7\xf0\x12Qc\xc5\xf8\xfe\xc7\xe5\xf7\rC\xca\xa2\x82\xa0\xc9A\xca<\xa0\x1a\xd7\x955\r\xb1I\x901\xb8g\xc3\x0f-Z\x1dM(m\x8b\xb7G&g\'\x8d1\xdeE\xe3\xd4\x98\xa1\'\x1b\xa6\xcb1\xf0\x8d$!\xdd\x92J\x14\xf5<\xeb\xb8\x8b\x88\xec\xf3~38rc\x07\xe3z`\xd4\xa5F\xb0\x13\xd2\xc7w\x93\xd5\x12\x05\xed\x15\xda\x12\x18"\xc8\x08\x9b\xe2I\xfe\x10r\xed\x00\x02y\xa9\x16 \x9cXT\xc0\x9fK\n\x0b\xaa\x93\x9f7\xf7\xb0\xf7\xdfYG\xa4\x01\xcf|\x81Yv\x8ch\xf2\xf7\xcc\xdf\xca\x84\xc7M\x08!\x9b#\xc3\xfd\xc2!\xc5\x91\xfa\xee5\xf0\xac\xe8\x15\x9ab\x88\x04Mv\x858\xd5^F\xdb\xb4-j\x19\xeb\xda\xe0\x7f\xca\xad\xc5\xb4\xa8/\xb9\xa7\x7f/\x128q\x8d\x0b\x00u\xd7\x80\x80\xbc\x13V\xd2\xe9\x81\xa3\x9c\xd2\xef\xecC}\x99\'\xea`\xc72\xb1\xb3}\x19B\xcf\xbe\xcc\xb5\x81\xdb\x86\xf7\x8c\xafJ7\xbc\xb8\r\x82\x8f\x17\xa6\x94\xb0\xef[_\x14U\x19\x98Z\xec\xbb%\x1d-\x96\xa7\x15\xe9O\xb6\x87\xc07#\x01\x85%\xd5\xb2\xaf0`e\x06\xf6\x97\xc9\x93\x16o\x1dUKA\x89\xf5\x8as\xa0\x02\xad\x9a7\xfdi\xca\xbcy\x9fi\xbe\xe8\x7f\xb3\xbf\xe3\x16\x8d\xc3[\xefq^\x1d\xddGL\x80\xbe\xe8><I+\xf2\xbbl\x1e\x95T\xc7o\x95D\x14JI\x87+&\xe6\\Gl\xfa \xce\xf1\xd5\xde\x16\xe1\xf9x\xd1/\x7f\xfbCX[\xd67d\xd6:R*\xb0\x07q\'\xb5\x1b]d\x1f_\x8cK\xdc\x90h\x81\x13c\xb5\xf7\xcc\x13>y\xcc2\xad\xfd\xa6\xb7\xe1\xbf\xacSiM\xec\xee\x9fHQ\xa6c\xba\xf5~\xbc.\xfe\xe1\xcb\x7fBn-\xf5~\xafK\xc0k\x8fCP\x96\x1b#\xc4\xd2\x82a\x17\x86\xe5\xe4d#\x83\x803\x87U\xd2\x9c_\xdd\x92/(\x0b.\xc3|e\x01Q\xfdE\xf7\xfb\xc3\xaa\xd6\x17\x07Q\xa4\x10A-\xdc\xa0\xe5u\xba\x15\xee\xbd\x0f\x1d\xfbOsb\x88H\xb2*K\x0e\xab\xa7\xb0m\xd9\x8c@xs\xe6)\xc2\x1d\xd3\xe7\x12\xc7eY\x01\x86O\x82V\xa0\xbb \xd4J\xb2\xe7\x0e\x048\x8f/\xcd\xbaR\x02\x13\xad\xa0S*`\xd2\xdbC\x06CF\xd4\t\xd8\xa0\xaea\xc30\xbc.\x93"yp\x03\xb6\x10\x0b\x8f\xb4\xcdzs\xe0\xc8\xac\xd7Z\xb5\xf4\x10\xaa\xde\xcb8(\xdbo\xbf\x18\xb8\xcb*\xb8d`j\xe2\xfdT2C$\xff\x8b\x0b\x01z\x99\xf9\xa7\xb4J\xb5\xc4\xfe\x8fV\xbf\x02\xaa\xe4\xb8H\xdf\xbe\xf3s\x19\xbdO\x90D\xddR\x89y\x19\x97\xc3Z\xfe:\x8b\x86\xbd\xfa{*\xb5KzM\x8f\xcd\x0f\x15\x1b\x11\x876\x17\x9a\xef\x13\'\x96\r\x9c\th\x0e\x03\xcb(X\x9a\xa2\xbdf.\xd7\xd1O\xa5\xc0f\x89s\xa2\'\x8b\xe4\x1dK\xe7k\xa3\x16!\xe0<\x10\x0evL\xd8\xfe\xea\xa0\xdd\x08pRy\xcb\t)\x1b\x0fl\xa5\x1c\xeb\xd3~\x9bh\x8az\xa5*\xe8\xbf\xf1#!v\x0f\xbc\x0f\x17\xc5f]\xbd\x06\x06\x9c\xc8\xfe\n\xe57\x87xc7YoC\xa4\xee\xa8\xd3\x89\xd6\xef\xfby\xe6\x90j\xed\x89`Y\xdb1$\xab\x94\x1cI\xca\xbdJtw\xb0f~R\x04S\x1dL]\x06\x8f\x1f\x91\x80mvN4\xe9NH\xc7n\xc0\xf2\x9c\xdc\xf2\x9b\x16n\xd6\x8c\xf7H\xa8\x16\x1c\x01\x82\x01a\xaa\xef\xc8\xa5\x8d\'\xe7\xd0\xb8;\xd2\x84d"\xf5\xba\xb2\xd6\xf4u\x87\x94\xfd~$c\xb7\xff\xad\x9a\xf7\x12-\xff\xb4\x92\xa7\xed\x90\x10\xd89\x13\x0f\xd5k\x13\xc5\xe1\xcb\xbd\xdf\xaa\x9bUj\x8f\xecn\x02C\x1fbY}\xa6\xbf\x0f`\xc5\xfe(\xb7\xe0;V%?F\xae\xc6=\xadf#k\xa8_^\x1d\xf3\xa71W(\x1d\x1e\x89\xdd\xaf\x8cg,\xe6\xb6\x8f\x08*\xe4\xc8CWHm\x82\x87\x93\xce\x00\xc83\xd0\x98\xbd\xa5\xc8\x00\xeaz#\r\xa5=\x96_)n\xffih\xc8\x02\xc7,\xca22\x1f]\x1b\x1f\xb3\xa2\x8f\xf4\x14\x99\xf2\xe8\x8a\xb9\xac.\xf0|\x91\x1di\xfaqe\xea\x03v-\xb2\x9f\xac5\xdc\x89v\x06\xa9m\x7f}r\x07\xc6\xa4\x80\x86j\xe2L|N3\xe6ln\x00\xcc\xe6\xfe~\xb8\xee\xd0\xady\x16\xdb\xfc@\x0ec\xdd\xb9\xa6]W\xc9\x89\xe2\xdd\x82\xe0\xfb\x91\x12Q\xe5g~\xf9v\xafw\x10=\xae\xfc\x03dn\x99\xf9\x16\x0e\xf6G\x90\t\x91\xe3\x86sk&\x17\x06\xf9\x02}\xe9\x14G\xd0{{\x01.\xd3+\x92(S\x17>\x90\xfa\xa5j\xae\xc1\x959XF1\xa4\xf7\x8az\xca\x13\x17\x898O\x11(\xe5\xb9N\xdbfe\x130\xe1\x90\xb3!\xf5\x89\xd8L1&\xc4\xb0\xda\xd6\xff8\xd9\xfc`=\xbe\x9fG\x9d\'\xa3G\x83Z\xbf n\xd2\xb0\xf9$\xab\xd5\'\x7f\xa1\xdd4 \xb9\x1b*oDE\xbf\xed\x97\x86r\xd22}\xf9\xba\xf2R\xf2\xbd\x942P\xd8\x91\xb1\xc9v}\xe9\x98M4.\xad\xbek\xeca\xa7\xd8\x95n\xdf\x0c\xa6z\xea\xed\xeb\xafM\xb5/r\x11\r6\x8f\x96\xac\xac\xf8\x9b\x0f\xae\x1d\x14tO\xa3\xe9.\xcep\x87\x0eC\x97\x18\xe5H\x9ap\x1f\xebE\xf4\x05\xa5\x0f\xba\xb6G\xa5a\xf8\xc8i\xab\x00\xe2\xf8\xc9H\xf6\xcc\xa8\x8e\x86Kx\x02\x93\xad~-\x190\x99|h\xf8\xe9\xfe\xd7Y\xc8(PEHAk\xef\x1f\x83\xaf?u\xf6\xdfnWI\xf0\xb2\xbd\x93\x8b\xcc\xa9\x9f\xc5j\n\xe1\xe7\xf8z\xd0\x8d2\xacrg\x08\xdf\xf5t\x07\xec\xf9[\xea\xd6c\xf5\x1f\xa5\xef\xfa\xef%wZ\xf4\x1d\xb2\x17k\xcd\x8bK:\xd3\xc8o\xd1\x81w\xc1U\x04\xcc\x00\xc2\xfa,\xab\x92y\\*\x96QE\xb7\xa1\xcf\xc9\xf0\xda]\x10\x15\xcb\x9d\xe3&\x9c\xcaX\xd2\xf5lrtH4\xcbI6TBz/\xe0\xf1\x08:F\xf3\xfa\xd3R?F+\xcd\xe7-"\x9a+*\xca\xed)9\x9d!\xb1F\x85\xcb&\xc8\x1d_M08w\xbbS\xea\xb9TGM\r\x18\xa6\xc6\x0cI\x00\x1f\x00LH\x15\xfbL|_r\x85F~\x06\xf6oe~\xc9=\xf0\xa9\xa8:\x87\xdf`]\xd75>\xd6\x92V"\xc3\xc4EA\xdd\xf8\xbay1\xe2\xa5A\xddK\xc8\xc9u\xef\x92\xd5\xc2)\xe7\x1fBk\xedc\xd5<\xf82\xa8-\xbd\xc3\xa1\xceq(\x85\xbd\xab\x97Wi\xd5Q\x19\ty\xf9\xb4\x8a\xa5\xe8\x02\xc5\r\x05z\xcc\xd8\xda\xc6\x98\x06\xcdq\xda\x9e\x9f\xfa,\xde\x17\x97\x10\xa7}H\xf3\xb9\xc2\xa8\xba\x82\xc6\xaa\xbd\x8c=\xf8rl\xca\x1a\xa5\xed\xeewD\x00\x9d!\x1d\xef\xfb\x05\xf4u\x85\xf6\x98w\r\xc6|\x0f:\x18\xcd\xcd^\x83\xbb\x14\xd4\xde\xe6\xa7\xd9\x1d\x19\\\x07\xa7\x1f6\xba]$\r\x86\xdaM\x15\xcc\xe9\xcf?\n\xd1r;\r~\xd7\x04\x04\xb2k\xeb\xfc\xdb\xfd\xcaL\xf4\xfb\x08\xbf\x840@\x03y\x8f\x9e":\xc8\x8dG\xdd\xf8\x1b\xfb\x1e\xd5\x9d\x97\xbb\xb6@\x0ffV\xcc/\xaa\xff\x90&\x919\x00k\xb6\x03\xbfw\xe3w|$\xf6\xd1w\xbc]\xbbp{\xeby\x80\xcb6Q\x9a\x93kV(\xa6)\x8c\xb8\x1b\xf3\xafp\x1db\x01\xb7\x9e\xfb^\x1f\xab\xd2b\no\x1a\xc0@biD\x16L\xc5\xedo|\xf6[UP\xf5\xeb\xec\xe4\xac\x98\x177lE\x1e\xb0\xf9\xcd\xc4i\x10\x92\xa8\xf8\xfeA\x130\x89A\xf6\x046\x00\x97k \xb4}\x0f\x08\xae\xdd\xe1\xfch@2\xbc>\xcf\x01\x96j\x8fu\xc4\x1aF\xa9\x86\xb4O\xca,?\xd4\xa6\x0f\xcfu+\xd0w\xca\xaf\xc6<\xd4\x04\xdd\x9b\xf1\x966.\x9f\xc0<&\xbb\x07\x01\xfa\x16\x95\x87;9\xf2\xaa\xb4\xe0x\xdc#5\xe9e\n\xb9\x06\x15\xc0T#\xe4\x1ba}8\xc0*\xa9\x83\xe0r\xb5Y\xc1\xdd-}C@>:\xe8P\xee[x\x8el\xd5\x89\xa57\x9e\xe1 \xcc\xe9\xfaOn"o^gV\xaboEl\xfc\xdb\xear\'\x08\xedF\xb9**\x0e\xf8tV\xa5H\xc12\x89d\xa2~\x19\xde\xc5\x14\x0e"\t\x1b\x87uuX\xe5\xca\xfep@\x16y\xe2p,\xa96\xdf\x95\xea$\xa5\xc1\x92\xe9\xa4\x98\xa3\x8c\x16/\\\xe1\xe7z\x1a\xbd\xf0Q\x04,,k\xbb<f\xf2\x7f\xc4k2T\x9a\x8b+\xe6\xbf\xf1 \xc12\x9a\xdc.(\xc8\xd8Q\xaa\x1d\x03E\xe4\\\xcf\xe7$7c\xa1\xa7\x10\xbfp\x9b\x16\xb8\xa4.\x93l\xe1\x90\xca[\x9c\xd4\xe5o\x17\xf5\xa52\x9c\x06\xa03\xddU\xd5\x8cJ\xda\x1dg\xbb\x04\xdc\xbc8_:R\x17\xbc\xefh\xffyl\xfc\xb5\xa0L\x00\xd2\xb3;\xbe\xea\n\xfd)\xb2\xd0\xcbJ)\x90\xcfw\x9e\xfc\x00\x89\xa6\xfb\xd4:b`\x17\xe30\xbc\xa4]\xd8G5\xbe\xb7<\xb59\xe3\xbbw\x87q\xca\x95/\xfc\xfcJ\xc7\xd7Q\x85\x02K\xef\xa4\x92vn+\x81\x1b\xbb;\x12\xf5Em\x1e\xae\x8aB\x1e\xab\xc13\xc3"\xcb\xda\xaaT\xb0,\xb4n\xec\x9c\x19J\xe1I\xd7Gy7s[&[pu&[\x1bt\xcdy\xb0A\x97\xe0\xab\x86\x89\xf9^\x15\xe4\xb2%\x8f\xcf\x16\x9b\xbd\x8c\x0f|_{\xce\xcdw\xe5\xd2\xee\x0b*\xbe\xea\xdf\xa3\xcf\xe9/\xa9\xad\x08=\x12\x06;\x9e}U*z\x1c\xad\xeaG\xc3\t\x93\x95\xbc\x08X\x00\xed\xf0\x19_\xe3q\xda3q\x92\xf7\x0f\xfe\xb6\xad\xe8\x9b\x0b\xe2\xdf\xe1\x1e\xc2\xb9\xdfv\xdfR\xc1\xf4\x92:\xd2\x8f\x19\xa7m\x9cN_8M-\x17\xc8;\xf6i\x19\xb1\xb1\x87\x01S7K\xb4\xfc\x18\xe2\xf6{"\x98\xeb\xdaNz\x02}-ni$\x96\\\xdaP-@\xd7\xe8\x115\x05#\x98f[\xeec\x9c\xb9\xfd\xd1+\xb5+qj\xfa?PIS\x8a\x8aW\xa9`9\xe5\xc5;\x9c\x9f\x10<\xebB;Q?\r\xdf6\xe1\xa7#\x10\x19\x9f\xd2\xf9\xd7Y6cr\xe7\xa6<E\x06\x07\x9d\x85\n3\x8b)\xce\x96\x18s\xeb;e\x8bR\x0ci\x12Y\xd6\xac\xcd\x81;\xe8\xb4\xbe"+\xf8\x10_\xd4\x13z\xaa\xf4e-\xd7h\xef\x9e\x0c\x8d\xb8\x1c\xdfJ\x0c]\x1c\xb7|\xe9_\xd8\xcc,\xab\x135RR[\x0c^\xf5\xf2CS\xa1\xd5\x1b\x89\x13C\xcc\xae\xf2\xd5\x1cm\xfb\xa5Z\x10G\xc2!_\x10\x05\x96Q\xee\x03\xdcu\xf0Q8\x0f~E\x9a\xbf\xef\x02\xe0[l\x8d\xabK\\[\xe3\xf8\xe0\x1a\x81\x9f\x85\x99\x1d\xb2\x05b\x9c\xad\x12\xaf[x\xb6\xeb\x06\xd5oT\\J#j\x12\xdb\xdc_\xfd\x02K_\xe3\xe8\xde\x93\xca\xbdl-W\x1a=G\x1a\xe7\n\x10GZrX\x83\r7\xcc[G4\x9a\xc6\xd8\x02%\xf3-\xa1\xc4\xdfLq\xc5\x8f\x82\x0b\x0c@\x94W\x9c\r\xb7a\xb0\x18\xaf\x8b\xf7\xa4N\x90y\xe4l\xe2\xbf1\xfe\xa9\xf9\xf5\xf6\xfc4\xad\xfc\xdbP\xd8\xeb*7\xdf\xceF\xf0"\x13\x05\x95\xf5\x06r\xc7WJ\x07\x8f\x89\xfc\x05\xf9\x1b\x9cH\xcd\xbe\xa3\xc7\x07\xc0\xd7\x0fs\x8b\x10\xd3\xb6?\xe5)\xa3\x96\x92\xfb\x93\x0eVk\xcf[\xc1~\xc0\xcfp\xc5\xf6\xc8j\xc5\x81""\x96\x88Sm\xdd\x14@\x7f\xb9\xaa\xbb\xfd\\\xd9\x99\x16\xaeO\xc5\x1b\xf7%!\xff\xa6\xfd\xe1\x80,\xe5\x95\xfan~\x8d{\xd1-\x1da\x8a\xed\x13y\xb12\xdc@l\xa7\x96\xbc\x19\xb7W\x98\xcb)\xe6\x1e\xfb\xc1\x95\x81\xc9\x9f,\xa1\xe2\xdf\x83a\x15\xb7\x08\x886\xf2\xd61\xeb\x8a\xa4\xce\xbey\x99\xde\xf2\x02/N_1\xbc\x10\x81\x00QwS\xc5e\xe7\xfbn\xe7\xdc\xca\x8b\x02j`\xa8\xf9\xd4\xb4\x8c\x03\xe6\x13T\x1c\xec\x97\xda\xc2QXC|\xcb\r\x84\xffX\xfazv\r\xcd\xd0n\xdcZ\xc3\xca\xd0\x89\xadq&\xc8\xfd\x17\x87\x8e\x18\xd0M\x95\xaa\xfeqs)*\xc9\xc2\xb9\xa6%\xde\x16<T\xa3\x05V\x01\x874\xabf\xf1\xc6B\x0f\xa1\xcfeW\xa9\x12\xc8\x96\xe4\xad\xed\xf10\xe0=|\xc41l\xd9E\x04\x8c\x8b\x90\x97\xa1\xc8\xb4\x0c\xbc\\\x14\xe9\x12\x0f*\xf86\xc2S\xaau\xa0\x08C\xd4\xce\x850\xaf\x8b\xd2a\xabF\x86\xf2\x82\x07\xcci\x87E=\xfb/\x04]w\xa1\x1f\xca\xd0\xd8\x87"r\x1a}n\x86\xa2Fg>\x0c\xc7\x9c\x84#\x00\xad\xd5\xc8\xc6\xc0\xfa\x8d\x91\xcb\t\xe6nCnb\'\xa7j\xee\xcd\x10m\xbcDQ6\xfb\xce=\xb2Uca\xac\xb44\xc7\xce~q\xbd\xa4Z\x1f\xa3\xc5\xc6\xf4\xcf(\x9d\xee\xf6sC\x92\xd3\x11\xc2\xf7\xda\xa5+\xd3u\x8e\x00N\xbb^\xe9\xdf\x1e\xbe \xd7\xb0Y\x95\x0c\xb9W!\xa8\x81\xf7\x8evyI\xcb\x1e\xad\x98\xaaL(\xaa\x9a\xe6\xe3s\xecw\x11\xf1\x9e$\xc7?\xb3g\xe5eZ#\x8a\x97\xe6OBF\x0eu\x9a#\xf9~US\xe2\xcb\xebO\x87\xe6%\xf0"8\xa8\xeay\xa2%B7.e~\xd6\x03\x1brt\xf5\xb5\x96@\x95\x93\x86\xf5\xc5\\\x02\xbb\xf3\xeazw\x80\xdd\xa7D\xeb\xee\x93\x9b\xec\x9d\x0c\xa7\r63>YE\x88T\xd85 \x17\xe2 \xc5..{\x9f\x84j\x91a5<;$\xa6nP+\x1b\x84;FpL2O\xc4<\xd0\xa3\xa7\xa4Z0\x9f\xa3\xefCcTL\x04\xfbBZZ\xb3.j\x1b\xf9\xbb}e\x18r\xf7\xe3\xdf\xa0\xa9\xc9\xac\xa4jdF6\xb1w(\x06\xd1\x9d \xf3\xe7VT2v\x9eVK\x9b\x0f\xd93\x16\x87\xc1c\x02@\xed\xc9\x8e\xa4\xf6wP\x93\xed\xf5\xf1\xc5\x06Lz\xa1l<\xb4M\xd8jn\n\xb5z\xc0j\xe0e\xd9\xd88\xa0\xd8 [\xafV$@zr\xec\xbe\xc3\xf7\x19\xba\xa6\x1ewC\xd0\x1a\xad\x89Fj\xf8 \xf1\xfe\x94\xb6\xc4;\xe3T\xf3+E4\xac\xaf\xbe\xe2\xd2\xd6 :\x8c\xd1\xfb~\xc9\\\x9b/lcq\xa3:\xc5\'\x0cV [\xe2\xb8\xbf\x0b\x84\x1dn\xbd\x9d\xc0\xef\x17#K\xbb\x82\x05}2Be\x17\xc3m\x87\xc7\xd6\xa7\xcfB;\xc8\xe4\x8a\xc2\xf3\'9\xd7\xf5\xd7\xa4H\x0b\x99\xea\xe3\xcb\xbdt\xc7\xd2Gvc\xc2\x95Y\xaf\\\x04f\\\xbd\xc9m$\xed\x07G\xf1\xd8\rDd\xf6\xe3g\xfc\x9f\x81\x94Q\x9a\xd9\xc7\xae\xd2\x80\x19!\x00o\xde#\xfb\x06\xd9\x8c\xdf\x7f\xea\x97\x1d\x82-\xef\r\x8b\x13\xab\xb2W\x9f6\x98\x95q\xa7\x10C1\t\xb9\xea\xa2x8\t\x1a6\x19\xc5}\xe4\xef`\x8d\xa9\xcc\xeb+[\xc5\xd5\'\x8a_\xcf\x97Db{\x1a\xc2*\xdd\x83\x12_\xe8\xde\xe5^\xa0\xfd\x06\xe1-[\x86u\x9f\xee\xb2vM\x88b\xd6\x83Q\xcc\xb8\x01\xc6-\x04\xd0\xf8\x13\xd8\x9a\x10mq\x16[\x0b\x10\xa8\xca\x81\xdb\xe0\x9cB\x0c\xa9Yi\x0c#\xf8\xde\x9a\xca\x90}\x8d#)\xbc1\xa89\xda\xfc\x96\x92\x8c\x00\x16\xecL~y"\x19\x93\'\xa5:\x12N\xf0\xbfn\x0511\xe4|\xa1EQ\xa5\x16\xfb\x94\xdf\xc4\xb0\xda2\x15\xd9B!\x04\x87\n\xe2\n\xfe\xaf\xec\xca\x02C\xed\xa2\xd8\x80\x8f\x9a\xe2\x95\x87(\xe4\x06\xdfW\xb2\x81\xad\xb3\x1d\x1c\xdd\xfd\xd2N\xa1\xd8\r\xcd&\xfa\x13g\xe3\xe9\x82h-$\xc1\x98\xf6\xd61\xa2\x88\x8ciP\x086w\xb5jP\x01\x9b\xf1\xa3\x0e\x1f\x0f\x17\tOy\xe3\xf1\xaf\x94\n%\xda\xf8jm1Z\x10I\xd8\xb7\x19\x16\x13\x1fl\xc9\xa1\x80.\x1b\xe5l`#\xa0p\xe1^\xbf\x18\x8e\x14\r\xdb\xb4\xa4u\xa4\xee\xb0\x91\xa5[\x85\x7fvN\t\x80\x17\xe3\xaf\x16\xf9\xea\xef\xe3\xd0\x1b\xb4\xcb%\x7f\xd0\xd3<m\xc9\xd3\x88\t\x9b\xe2\x9f\x18\xa7V\xe0\xcc\xa0\xb5Wp\x1eK $R\xba\xf8Uh\xd29\xcd\x85~\x80\x13}P4\xe6\xccNF0\x96\xd1\xce\x04\xed\xd8\x961\xfa{{\xce/\xb7"&\xa1IF\xc8R\xf4\xc4\x96#\xd7\x80E\x94\x06\xdd\xa8\x02\x1d%o\xc5&\x9f\x88\xe4\t-0\x93W\xf2/\xc1\xd2\x02\xcd\x0f+\xf6\xe5e]\xb6\xb6\xef\xc6\x00)\x17\xda\xa5\xbe\xa2\xc2\xc3\'\xaf\xd7:gX\x15\x80\xc1h\xde8\xe8\xc7\\\xb9~\xd2\x05\xda\n:L\xd6SO\x06\xfa\x93*,\\\xa5\xcaW\xca?_\x9a{H*\x17\xf1\xdb\x03\x0b\xa8\xa1\xe0\xdd\x1dqg\xfb\x15R\x17\xfbi5y\t\xb8\x18 \xbd\x7f@\x08\xb7(1\xad\xc7\xd0\xa7J\x0c\x12\xdb8\xb2\x0cT\xf2\x8f\xbat\xeeD\xd9iZ\x87\xbb\xdc\x9f,>\x0b\xf9hV=4\xca\xbf\x94\xe3\x1d\xd9@O.\x0cN@\x1f]\xeam\xb8\xad\xd6\x8d.DBP\x0c7\x9f\x0e\xb0h\xc0\xb5>\x96\xf8\x08\xc2J\xb1\xf4N3\xbeXk\xe6\x93N\xaaz\xe0`\xa7\xf1\x1a@\xbe\x94\x0eq\x8by ,1\xe9{\xc2\xfb^\x17\x884\xe6t\'\x96\xe9b*\x04\xaf\x95+\x07{\xf4\x89*\x8bp\xf4\xac>\xf6\xebC\xee\xb5\x94s\xe0\xa1\x0e\xefv\x90\x0bMg\xa1\xc9\x7f\xf0\xbd\x196.\x0c>\x16_r\xd4\xdc\xdf\x17\x8a\xa5\xc3\xc6m\xfc\x1f\xd5U>IX8\xdb,\x8a\xd0%V\x17\xa8\x9e\x02|\x84i\x16\x92\x02\xc7\x10\x86\x17\xd3\x7fj\xda_l\xcao\xf8\x94)\x86\xa1\x01\x93\xba\xa9cl\xeft \xf1\xfa\xf6\x85\x9d\xd3\xd0k6\xe7\xe3\x86\xfdi\xe1D\x15#\xf4\xd8l\'\x91\xc3\xce[\xcc-;\xa0\xf8k#+@\x0c\xc5m\x1f\x16\x1e\xde&k\xaa]\xf1\x01\xe3\x8b^y\xa8\x1a\xcfp\xd1<\xad\xc4\xeb$F2t\xa0\x9b\x17\x80`-[\xb2\xd3\xa92J\x11,\xea\x1f+\xff\xf9\xaeX\xaf\x0e\x1c\x03\xe7\xfb\xd3\xe0\xaf\xdc\xc4Z\x821K\x0b\x93\xad\x82`z\xef\x02\xd6/a:\xaaa\xa2\xf7\xa8X\xd8\xc1-\x1b\xfb\xf4|\r\xd0\xb4g\x8d\x14\x8f\xd0=\xb1\xf4if\'\xd1\x0b\x1c\xda\x14\xb35A\x9f\xe9.\xcf\x07\x18\x88\xac\x90K.R\xbd\n\xcc\xf3\xfc\x1d1 \xfc\xbc\x0b#\xd7\x8a\xe4\xf61M\n\xb1\xfd5\xc5\xbe\x80\xc2\x02?A\xc7+\xac\xd4\x94-#\x95\xc8H\x852\x9ee\x82n\xb0\xf3\xb3\x8d\x8b\x0b\x87vx\xdc\xb3\xb0\xf3\xaa\x11\x82e\x05\x88\xf6\x93\xc6Y\x99\xff\xc2\xb5HR\x8fh<\xb5\xb5\xc7\x9b\x91\xb3\xe2\x9d\xf8$\xf5\xfe\xdeF\x1c\xc2\x1fi\x17\x0eT\x0c[\x0e.\\\xb6\x93E\xd8#\xca\xd2\xd9\x8b\n\x16\x90\xe9\xaa6\x98c\xb2\x02W\xdb1\xbc\xab\xff\x0e\x95"\xa7\x86\xde*:X;\x10\xd5\xc5\xf7\x95\x8d\xd5\x1d\x9c\xdd\xf7\x8f\xfe\x14q\xd7#\xf1\xcbx\x1c\xab\x0e\x15\xf2\xbeM\xd2\x17\x9a:~\xa4$1\xab\xa9,\xbc:(\xd9\x0b\xad\xf4\x07\xc5\x02\xcca\xedF\x9e\xfbt\xa7\x92\xb9\xaa\xe5\xcf\x12\xf0\xf2\xac\x11:\x99@e\x0e \xa9\x85\xa40x\xb4D\xc8\xb5\x913\x8a\xfe\x1c\xa4\xfa\x1aX!75\xd0_\xafGvk\xe4v\xdcIDju\xac\x8b\x9c\xa5\x98;\x9c\x1d\x82:\xd5\xdc\xc9:\xf0\x86\xa1\x9a\xd4\xb8\x0f\xb2\xe5\xbd\xdaA\xa3ssg\xf1\xa9\xed\x89\x1b$u\xc8\xdb0\xe5\xa0\x13j$a\x07\'\xc2\xb5;\xf2\xa4\x94\xae"\xfc\xcc\xd4\x00<-\xd1-\xb8\xbf\xb3\xa0-L\xa7\xd6o@\xbf\x7f\xa6,\x04\xb6.\xe8\xbcS\x87\x88v\xd4\xd1!\xb1\x9a\xfe\xffU(\xa9b\xb3\xce\x1b\x86\xd9Sb\xf7\xef0\x85\xaeP\xf4dK\xb0\x92\xab\x97\xa4\x1c\xf7\xf1\xeaA\xbb_\xa0\xa5\xd8\x12a\x9e\x9dhl\\X\xdb!\x01N\x99\xf43%U?I\xcd\xc3%\xd9\xc8\x93B\x1f\x9a8\xfax\xe9\xd0N/?>\xf2u\x1c\rZ\xc7\x0c\x0b\x0e\xd5\x90Ferp]\x06\x10\x9aP\x01\x81{\xac\x8e\x82cG\x1dq\xc3\xe5wNIZ\x89\xf4\x8eRZ\x96J\x14\xb3\xd1\xc1\xcah\xf7(@9\x89\x94\xc5\x98\xfe\xd0\x9b\x18\x04\xbch\x1d)\xa3\xe1\xfe\x9btM\xf1\xd5\x11/\xcc`q\x14wk\xcd\x86\xc5\xd2\xd5?g\xcf-P1\x01\x83\xa9.\x02\xdbK\x8e)g\xe3\xff\xa8\xe0A \xfb\x16\x08\x9e=\x02q\x1f\xb8\xde\x84\x1d\xd5\x13\xf8\xa0\x87t\xbf=NU#\xaa\xb9\x8f\xdeJY\x8c\x13\xa3A\x17\xd5\xd4\xcf\x86\xbc&\xa1k\x9av_\xe5\x7f\x84\x1a\xc0#\x86T\xbb\xe6\x92C\x0c\xa8p\xff\xd8"[\xb5\x96\x83@\x0306ZU\xa1PR\x99;\x15\xd2\xddY4\xed\xf0\xa2Zxh\x82tH\xc2\xf3\xfbL\xce\x7fryq\xf1\xe9\xb8\xc0\x90\x1db\x18~\xad\r\xcc\x1e\xc4\x10\xf3\x0b\xbaS\x10M=\xce\xd5+\xc2:w\x8f\xdeC\x0b\x823\xbaP\xbbs\x14\x9f\xe2Y\x95\x82\x8d~\x94>f\x96\xc8\xbe\xebH:\x933\xaeKo"\xa9mx\x87 y\t\xd7\x0e\xf3\xd0]q\x10@\x0b\x04\xdab\xc6\x98DrW\xd66\x97y|\xee\xb2O*\xf3\xaf\xbf \xf1@\xb54\xf7k\xa8\xe7Qq%h\xe1\xf5n\x9e\xb5\'\xbc~\xe8\x00h\xcb\xa4\xf0^\x9fN\t\xac\x0b\x9f?r/\xd1\x84\xcc*\x10q\xf1vn\x85\x0f;\xc5\x05\x9c\xd2\xc2\xca*P|\xea\xc4\x06I\xbc\xd2"\xcf\xc7\x9b\xb9\x87\xfb\x81\xf8\xdbZ\xc7\x08\xec_\xa9\xdb.\xb8\x98\xc2\x1a\x1d\xe10UT\\\xcc\xb5\x90\xaf\xe4\xb4u\x93^\x14\xd5\xba\xee~\t\x0f\xech6<0\xe3\xe6\r\xfe;\xc6\x14\xf0\xf7\xc1\xb6\xd2\xb5\xaa\xe9\'\x9d\r#\xd4\xfb\xbe~R\xd0:x\xcf\xc2B\xd1\x89\xb3w\x1d\xb3\xd8\xcb\xa5g\x86\xd1\x18FT9O\t@\x92\x98\t}\xd2\x15\xfe\xb2=v;\xf5l\xcdM6orr\xbdoJ~\xec\xb0\x11\xb6\'\x84oR6\x97\xeb\xc0\xb3\x8c\x9a\xf4\x00\xf7\x0c\x98d\x9aZ\xc5\x84`p\x8c\xf14\xe4Ww\xd0T\xd44\x97|\xec/\xe5\x04y+\x8cq\x80\x97-Q|Y]\xc9\xcc\x0cz\xfa\x12\xb4\x1bHI\x1c\x00\xf3\x91\x13\x1c\x8aes\xb97x\xc7\x82\xe6k7z\x968\x8aI\xad|Sw0\xce\xb2\xe2\xb6\xea\xca\x0e\x94\xf8\x15\'"T\xb5\x1d\x9bv\x92\x8d\xe2(\xbet)\x9d\x90\x9dF\x07\xa8\x07\x07D\xd1\xe8O$3\xe4\xb4\xe0\xe9\xf4\x93sp\n)x\xd5\x05c\xf9R\x1a\xb3\xf2\xbd\x0c\xd7;\x93\x99\x10V\xb0R\x10\x1e\xf1u\x12L\x86\xf09\xa5\xbfG\x15\x89~\xd4\x01\x137\x0b\x1eH\xcb\xf0\x88\xf9R\xd7E\xe7\x8f\xc9\xc9+(R\xe7\x99\x7fk\xa5\xf4$\x18j\xbcZE\xd2K\x8dH?\xdc\xbe\x81h\x92y\xc1q\xf3@!i\x83\x08\xd1\xd9\xec\xe8\xc7\xdd\xa1\xff}\x1e\x9b9\xeaz\x90\xe1\x12\x99\xdc\xdbH\xcaS\xc8\x9fa\x9e\xa6\xcfN\x87\x95\x10\xc7\x8e\x0c\x13;\xfb\xceDG~#\x8b$8v\xbd}\xe2&\x93Q3\x1d\x87fOMZ\x8b\xb1\xb9\xe5\xff\xcb\x9b\x85\xab\x1a\xc2<nF5\x1cM\xbc\x88\xd5\xba\xc2\xcb\x1c\xd4d`\xf3s\x16\xb2C<jJ\x98\xe8\x90n\x84I\x95\xa9,\x16a\x9ep\xab\x94\xc7\x929\xb1\xd2\x97\x94\xee\xc4SH9tn\x82\x9b\x0b\xf5nv"k\xf3\xd7\xc4eP$\xfd\xc2\xa6?\x0bC\x95\xda@d\x14+\xcd\xc2\xe7\xe8`Le\x9d\xd7\xbbi}\xc92\x86\xc5E\xd7\xa1 \x990\x1e/m1\xb9\x88\xd9\xcd\xa7\n\x81_\xd0\x9b\xc0\xac \xdc:\x04,R\xaf\xacn\x0f\xfc\x83\x92U\xa1\xf5\xbcY\xb0h\x8e\x87U\x0f\xc6\xa8\xb5~\x9f\xff\xbcS\x90\x89\x0ci\x1d\x8a9\r\xce\x01\x97\x92I\x95:6]\x18\xc0b\x19\xd6\xec\x8c@\x11\xbd\x13\x90\xd0`\xeb%\xed#\x8b\xbah%\x96\xc6V\x92,w\xee\x87\x89@\x96\x81\x9e\xd0]~\xa7w\x1d\xc6\x90\x95\xf3m\xb1\xdc0\xcdQ\xc8,&\xc3A\xaeC\x14*UX\xd8\xea\x1b\xcb\xe5\xa7\xca\xf6@\x04\xc9\xc3H\xeb^\x05u\x1e\xd7\x9c\xe5t\xeb>\xc1\x97i\x05\xa3\xa2\xb5<\xfa\xa3\x18 \xdc\x8e\xd6\xa9\xd0\xad\xb2\x7f\xe5\xc1\xbfw\xc1\xee\xb1\xc3\x84\xe0\x05\xe2\x10\xf0\xd3\x8e\xd4\xeb\x0b\xe4\xe9\x03)\xed\xb7Xo\xfa\xebN\x86\x14\xef\xda\x07\xdd\xdf%y\xc9GI\x1c\xcd\\!6\xd0\xf0\x8c\x8d3A\x0b\x82\xbf<s>h\x81x9y\xf0\xb7\x8c*\xd7b\xc3\xfc\'\x7fP\xd2\xefD\xfb\xff\x8e\x88\xa6\x84\xbd\xc0\xd7\xb8\xc4|\x01\xd8\x11}\x9a\x8b&\x92\xe5\x98U\x01\xf6\xd15\xca\x92\xd7\xec\x8e\xefA:`\x94d\xe7:\x8e^\xa4\xc6\x85\x01i\xf5$\xf2i\x86\xf8\xe7\xbb]g\xc9l!\xe2\xaf\xbd\xd9\x80\xbf\xfe\xf9X\xb7V\x1a\x15\xa5S\xfd\x19N.\x10\x0b\xe4\x8b\x0bz\xe8\x8fD\xe0\xf9\xae\x89\xd2~\x1f\xabk\xbf\xee\xd0\x7f)\xa0ofB\x1cCT\xd0\x8c\xdb\xb3\x1b\xed\xd9\x15\x9e\x885\xec\x8cxj{\xbb8\x00\xc3K\xba\x04\x85Jm\x16\x87\x1a]\xd1\xd1\xdd\xe8\xfe\xf8\x9fWg\xc7\xcb\xf1\x9e\xd1\x91xO4\x97\x8cP\xd7\xe1\xccK\x8f\xf4\xcc\xc3\xa0\xbb\xe6\xefx\x8c\xb0\xbc\x87\xb8\xf6A\xd0\xca\x9a\x92\x13F\x97\xef\x1e4;\x06\xb8\x81\x99\x10\xe8\x1e\x034i\x8f\x1a\x13\xd4\x92\xb7\x98 \xad\x14\xfd\xd9\xdf\x1e?\xcfq\xab\xce\xfdX\xeb\xa0\xca\xa8~1\xd7wh\xa0\xc5\xaf\xe8o;+H\x01\x938\xbc%\t\xb8_\x046\x0e\xebh\x8a158z\xacd\x8fD)\xe7[\x1a\x19K\xc9\x87{\x1f\xf2f8\xf1\xcb\xb6\xd6\x90X_\xe6"R\x83\x16\xe4h~\xe6I\x80\xccg\x9d\x08\x13\xda\x0b\x13\xf8\x80diQ\xe74P.\xfd\xf5?9&\x04\xe0\xd8U\x83\xca*\xf3\xe8\xbf\x8f\xc6\x9a\x9d\xafC.\r\x97&2Z\xf9\x9ci\xac\x8f\x8a\xa9w\xbf\x88\'2S\xd4\x071\x15\xcf\x92&\xeb\x03\x05d\xff\x02M\x98\n\xd9\x86\xf1\x85"!\x97\x96;\xd6l=\xe5\x18\x05\xf2\xa8H\x00\x8a\x8a\xab\xc598\xd0\xac\xb6b\xb7c\xf2\x9cex\xce\xb2\xac\x8b\x0c \x92\'HGb\x80]\xb3\x7f\x9fh\x95\x81A\xaaR\xb6pyR\xd9\xc4\xc3\xf8\x12\xf9\xea$\xe2\xbd\xbdLR\xc9\xdc\xaf\xd2\xd4\xed,#\xfa\xeb1\x9f\xe2\x816\x961\x8a\xb8TM\xac\xb0\xa8R\x8e\xc7;\xf1\x05\xae\xfe\xce\x14\xfa\xab\xcb\xd0\xa3{\xb3A\x8dP|"\xbcd5\xb8\n)\xfaZ\xec\x94\x16<\xd5Rg\xc5_\xcd@\x1d\xd1\xed\x13~[\xc0\xbf7\xa6~$\xa0\xa3\xfc\t\xd1\x9d\x81\x9eS>7\xddd<\xc8A\x05\xab\xd6\xc4?\xf7ANg\xc4Y\x01{\xa7 p7f\x18\n\x104_\xa6\xe9\x96\xc0\xb4]\xaeaZ\xa4\xdb\\w\x9e\xc3\x13\xa3.\x0b\xfe\xbfc\xeb\xdf\x0f\xb5VR\x8c-j\x9f\x0cW@\x83\x9b\xbc(\xb7\xf7\x14\r\x94\xbf\xb3Wd\x89)\x8a\xd4dv3k\x16\xdb\xc17ehx\xee\x9a\x9c\x87\xc4\xc3{h~#\xbb[\xffv\xb5f\xc5\xe0\xf6\xc8\xc9\xa3r+\xaa\x1a}0\x1c\xa7\xb4\x0f\rh`\xadp\xfdG!\xad\xad\\B\xcaC\xde\x98\x99y\x068?&\xa4KY\x8a\xc34`\xe3\x03!>}\xf6\x88\x99B\xa0\x95\xf3n{\x1fS[.5$\xd7\x1bo\xc8\xb0\x0b\xf7)\xb0O\xd4\'\xe17\x96\xefx:p\xd5a\x9dN\xd4\xba\xe7(\xb4\x9fx\xeef\x1b\xb2\xe2\x8a0\x8b\x88\xcczW5Nck\xd4\x1c\'MuE@\x8fx\xe58\xe2\x0c\xd7f\xfa\x9eI\xea\x0e*@\xec\xc9\x14\xca.\xfc\x92\x96\xf2\x99\xc5\xe6MR)F\x88\x96\xcdF\x9c\x9e\x93B\xb8\x86\xd6\x1b\xfb\xc5+\x03\xabTnyO\xa3\xf6\xbc\xd9\x1dH_u\x93\xb2K\xfc\xfb2\x9c\xb4R\x0c\x1c\x85\x02\xb6=\x0f\x1d\xe4:\x83\xee{\xe0L\x9f&3ka\xab\xac\xdd\xc0\xc7\xb0\xbdt\x90\x8f\xa0\x06\x9e\xdc\xde1d\x9d\x18y\x0f\xa2\xc0\xc3T\x0b<\rs+\xa4\xe2\xea>\x9f\xe6M\x06\xd1\xecb\xe0G\x7f\x94\xb9R\x00M@\xf5\xf8\xfeq\xbe\xc2\x04(\xdc\xd1\x18S\xb7\x8cc\x825A\xb6\xbc\xd5`0\xf3G\xd2\n\n\xa9\xd5V-\xd8\xd7KU\x12\xbf\x10\x16\x08\x1a\x03\xce\\\x82\x079_ck@z\x87T\x9a\x87\xe6\x1c\x18\xc5\xc4}^\xf71\xe5\\\xa2\x0fx\x80@t\x05\xa9\xff\x93\xa01{=\xa2PC\xcc\xe0\xd0vq}]v\r\xa4\xfd\x0f\'\xf0{\x1a\xa1\xe4\xa8O\xa2\xceynt\xc8D\x99\x02\xd1@\x98h\rx\xaf6\x08\xc9v\x1b+_\xa3\xc9\xfd\x7f\x802\xaeC\xa6$\xe9!\xfc2\x1b+\xf83\x95/@aI\x80_\xeendB&bX]\x98\xbe\xac\x16\xad\xb5\x08U_\x83\xeab \xfe\x95\xae\x02\x91\xc1L#\xfd\xf4d\x83<\x88\x83@<>\x0f\xad:@\xb4_\xc6\x84f\xe5 \x1dl[8\x15\x1dd\x0b\x0b4\xc0f\x01_\x10\x04\x02\xcc\x1f\xb9\xb2\xd1\xf1$\x9e\x84\x95\xfa\xe7\'\x88k]S\xe9\x8fP\x8a\x1f\xf6?\x10\xa2\xdd\xd3s\xdc\xd7\xafZ\x19U\xe6\xd0`\x1b\xabE\x1d4\x1c1\x15V\xde\xe3h\x9f<\'\xa6%\x99\xb1\x0e\x7f\xf4\xc2\x8b\xb1\xdb\x99\xc8\x1a\xc8\xf8\x95\x8b1\x1c\xd9H\xb0^\xf6\xbf\xd0d,\x81\xa4\xcfZ~j\xf2{n"\xbbu\xc5I\xb2\x86o\xef\xdd\xa1\xcf\xe2\xbd yaY^\xed\x81S\x8c\xd9j\x7f(}d\xd3\x82\xfb\xdf\xc8\x12\xfc\xc6Xb9\xdf\xe6*\xac\x1b \x89\xfa\x9bu xH\xd9(\xb7\xdfy[\xb1\x82=\xdf\xa9\xf7\x95\xadw\x9a8\xa4\xec\xfb\xbe\xbc\xbd\x0bX\x91%M\x91XL\xef5\x1bmEa\xa6\x85s\xc4OE\xd9\'\xca\x06\x8d\xd3\x90E\xb1\x89~(:\x97k&\x04\xdd\x9a\'_A\xbf|\x14\x00\xb5k_\x0b\xd8\xab\xac\xc7\xdd\xb9\xeb\xd5_\xe6\x82\n\xd1\x96\xc6#\x1b\x1b\xa7\xadq-B\r\xda\xcb\xefhs\xc7T\xb7\xdd\xfc\xd7\xea7k$\xb7{,7\xc5\xd5tC\xba:\xc9J\xc6^w\xd6\xc0Ak\xbbm{lf1\xd8*\xb1\xfc\xbe\xea\xf1\xe3\x99\x9d\xf9\x1d)\xdb\xa5\x83nj\xad\xdb\x8c\xd8\xbe6\x10\xceP\xca\x18\x92\x18\xee\xda\x004\xc8]:\x97\xf5z\x82\x81\xef\xc1\x1e\xcd\xb8s\xc0\xf8\x08PPa\x8dV\xd092\x83\t\xecS?\xde!\xf6Ml\x9eg\x86\xe4\xb3\xc2W\xf8\xe0\xea]^\xa4\x9e\xadS\xa8\x9b\x7f\x11\xe7)/\x85)\xa7t\xd1\xf3\xb9\r\xdf\xbd.\x1f\xe8\xe4v\xfc\x00\xee\xb0\xd9w\x8e\t\xab\x14 Xa\xab)\x976\xeb\x17\x1cB\xed\x9a}\xbf+Y\x7fvd\xa3\x02B\x10\xa1U\xd0\xfa\x0f\x18\x84\xb5\xc0\xb2\x00yS\xd1&\xb9\x81\xc4\xf3\x1eDn\xae\xdf)k\xfaI\xd1YH.\x17\x1cJm\xb5b\xbb\xab\x13\xbbo@\xf0\xcf\x9cf\xd9p\x19\x9e\xe0\xd2\xe5\xd2d\xdc@"\xf6\xef \xd2\xd7\xfb\xbfKc\x8e\xfc\x11\x98\x9fO7\xfb\'r\xe1$\n\x8b\xdas{\x88\x17\xe1\xab\x115z/\xf0J0\xf8{Q%\xde\xa8\xf6\x12\xc0d\x1d\x83\x17\xffuv-\x93WM\x15?ePoZ\xa9\xae2\xe3\xc7\xccPE\x9b\x8e\n\xde>\xeb\xb1\x1b\xbc\xf4\xb9l\xec\x84\xfc\x97AOZ\xc9i\xbat.\xd2\x01O\x80"eq\xd7\xbb^T"\x92_c\xbbAt\xfcR\xec\x132^\xe4\xde\xf0\xbe\x82z \x93Ep\xae\x8bGC\x9e\xe9\xb9\xba|e\xdbn\xb1Z\x82\x90\xe4\xeae\xa9\x88{E3\xf0"\x01\xb7&\xeb\x82\xc8hK\xbb\xc0\xbfE\x8e\xcc\x82`\xbc\x11\xecrN\xb7\xcd\xb8\xbd\xec=g\xb1s\x94\xd9\';9\xb6\xdbR\x9f\x91[\xaeq\x9f(\x0f\x15\x94\xb1\xdd\xad\x11\xcd5\xe3\xd7_\x87w\xfa\x9a\xe9\xb9k\x07+:\r\x80\n\x83\xf9\xdb0C"\xf5\xfa\xb0\xde@\x1ew\x06?\xbd\xd8\x03DK\x8f,\x05\xb5\xef\xd2\xe6\x90\xd5[\x99\xa2\x946#\xfa\x84~\xf0J\xaa?\xa963eF\xe7\x9d\xb4\xb8\xf7;\xf7h\xf5\x9fW\xdcv\xed*\x81/\x17\x98\x82+\x86O\xb6a~=\x95s\xb8\x83\xe3\xc5\xf2\xce7S\x9f\xc9\x84\xb4\x88\xfbkyn\xeb\xec2S\xe8\xda>W\xfbn\xb5%\xcc~\xbe\xe8\x8a\xdd\xca\x98C\xa9\x87$-\x04\x94\xa6\x08\xba7p\xe9\x15\x049[`\x8e,\xaf\x1d\xcf\xf2\xd6;I\x05\x81\xab>\x87\xac\xc9\x97\xbb\x85\xe4Fp\x122\x86k/j\xa1x\x8d\xd5ES\x1e\x87\xf9\x92\xa3\xb8\x13\xa8t\x1f\xbd,\xedk\x90b\xd7\xae\xb5\xc94\xca\xfc\xc7\xec\xdc5z\x10\xd6\xf4E\xdfH\xf8OU\x8d\xd5O#,<\xd5X\xd1\x19\x05\x03\x7f\x89y+\x98\t\x1dvS\xc6\xecd\x08\xcco\xef\x9f\xb1!\x0b\xb9\r\x8f\xb6F\t\xca\xeb\xae1\xd2\xa0\xb2uT\xfe\xccC\x9e@]7#\xbf\xfa63-/\xd0\xa0\xd2\x92"\xd1\x03r\xce\x1f\x10i\x041\x1a\x0b\x13\xe3_\xd35Tz\x1a\xc8\x01\x8b\xdd\x7f]}\xff\xd0\x9e\xab\xb9\xab\x85\xe3@\xce)\x1c\xbd\x04!\xd5Qu\xaa\xf8\xf2:\x81\x14:\xa1\xd3\xa94H\xdf:\xd1\xd4\x13\xa0-\xc0\x89S\xbd\xcf\xd8\xe0@\xdb\xca\xfe\x7f\x18BF\xc3\xc5$\x85;\xbc\xd7\xb0\xe9/\x9dAp\xb5>\x14i\xd2\x8b$1\xc8\xd5v\xb3\xfapm\xba\x91~\xfa\xae\x1cR\xc2\x93\xfaT\xf9\xc4\xcbD2\x1f\xe1\xa3\xa0\xff\x94G\x0f\xff\xe8t\x19(\x86\xc5\x94\xb0:F\xd8`\x8b\x96\xd4\xda\xa7\xb6;\xc4\xd0apK3\x9e\x14]\xa2\xfbm\xd1\'\xe3$n\xb0\x933A\xa2\x8a\xf6\x95N"\xcfW\x81\xdb\xc9\xc6jk\x0e\xad\xee\xe9\xca\x04\x15oB~\x8eH`R\xe2[#\x02\x17<\xa4\x8f\x13\xf7\xd9|\x9d\x84\xe6\x04_#Y4q;9\x0f\x90\xac\xf5Xl\xca\xfd\xc1\x85Jj\x98\xea\xa8\xac\xa9dg\xb8\x85\\\x8e*\xe9$K\xc7\xa8?\xa7"\x83c\x82j\xaen\xbbe\xd6\xd3\xe1\th-\xdc\x15\xda\xa7\x15j\xa4v\xa9m\x9e\x89\xf6E$/-\xf9\xbf\x9a\\y\x0fF\xde\x1dLZ\x96 \xcc\xa0\x19&\x1f\x82\x0ec\xb7\xd0\xb7\xadX(<)\xce\xfa\xae\x90\x02\xe5M\xdf\xe9\'\xa3?\xb8\xa7\xb4\xf4d\x1c\x19\xe0\xc7F\xa3\xdf\xcc_Q\x99\x88\x94\xac\xd2\x01V\xab\xe4\xc4Y\xd3\xcf\xabZ\x13hL?\xd3\xa6c:\xc8[Q\xef\xb5vG\xae\xdf\x16\x1e|\xd9x\xf4y+\xe9\xb3YN\xca\xfc\xa3\x9f%j\x83*fSA\xfdo\xe3V_A\x0f3\x90}\xe9\xd7\xe2\xca\x12:d*\x8fp\x13v\x8d\xdb\xe1\xfa\x15`\xe6\xcb\x83\x850\xd7W\xff\xaa=\xaea\x03\xc4K\xf4\xffh\xb8\xd6!=\xa9]\x9a\x1d\xbf@\xfc\x0eGQ\x1d]\x8a\x19a\x94^lxd\xe2*c\x9d\xe1\xaa\x82\x18\xfd\xb7{\xfb\xe2\x91\xc5\xb9\x12^\xd8\x97kF\xdc\x99\xfb\x16:\xcb\xfc#\x9bT\xa8\xc0}\xc7\xdb2\xafW\x19c\xc5\xfcx\xf5\xa2\x9a\x1f\xfd\x0c/\xf9\xc0\x94\xf9\xce\x89\xef\x85P\x96\xf4\xc9Bl\xfa\x80\x9a\xdb\xd0\x81\x03PH\x88\xd6L\x06\xcf\x9a\x1a\xf0\x15h\xa4@\x19\x02\x8f%\xc1\xd1O\x965\'\x84\x81J\xddx-\xefD\x9a\xa3\'\xed\x1f\x02\x0f*D*\xed&\x8f\xab\x0c(\x1dc7b\x0f\xe52\xee\x91\x0f\xcf\xc9\xbdT\xe1\xea\xfaj\xd5\xd4T\xa9\xe7\xe6\x96#\t\x8cv5R\xf0D=\xc0\xa0O\x82\xba\xbd<\xe4u\xd5\xbf\x07\xec\x1b\r\xc6E\x03\xfc\xda>\x9cu\x9c\\lW\xee\x12\xc7ncu3\xff\xfb\xfa\x13\xf5\x11\x17\x17\xddh\xc1\x99s\xb8\x153|\xb8\x00o\xc5\x96\x9e\xa9zPK\x17\x04\x07\xb3e*\xeaB\xc4wV\xfa\xe9\xf9\x19Bqpu\xf6 \x01B\xdb\xe3\x92\x8c\xd2\x18\xef\xec\xb9lY$\xc10k\xa9\xcc\x15\x80%\xaf\xb5Y\xff\x8e\xc43i\x1b\xf4h\x07\x11(\xa2r\x1a)\xfc*\xdf\x86\xfb\xc0\xb9\x8e\xc0\x04\x14\x0f\xbf\x94\xf9v\xd4\x16\x8c\x93\xa4h\x02\x04\xb7\x02\xf5j\xa7\xfe\xa4\x85|\x03\x821\xeen\x99K\\\xb0\x9f\xaf\xecs\x1c0\x0b\x8c0\xfa\xb2b\x1eR\xbb,\xd5\x9e\xaflB\xb78\xe8\xc9\xe7\xd6N<\x94y,\xe6nB\xc0_\x12CDs\xb6\t\\\xda\x15\x8c\x16\xfa\xf4\xe1\xc1\xcc\xa6b\xbf/\x96\x94L\x8a\xb7F\x86J\x913\xd82-\x7f\xe9\xb4')
|
1
|
+
import flask_babel,flask_babelex
|
2
|
+
from hiddifypanel.models import BoolConfig,StrConfig,ConfigEnum,hconfig,ConfigCategory
|
3
|
+
from wtforms.validators import Regexp, ValidationError
|
4
|
+
from flask_babelex import lazy_gettext as _
|
5
|
+
# from flask_babelex import gettext as _
|
6
|
+
import wtforms as wtf
|
7
|
+
from flask_wtf import FlaskForm, CSRFProtect
|
8
|
+
from flask_bootstrap import SwitchField
|
9
|
+
|
10
|
+
from flask_admin.base import expose
|
11
|
+
# from gettext import gettext as _
|
12
|
+
|
13
|
+
|
14
|
+
import re
|
15
|
+
from flask import render_template,current_app, Markup,url_for
|
16
|
+
from hiddifypanel.panel.hiddify import flash
|
17
|
+
from hiddifypanel.models import *
|
18
|
+
from hiddifypanel.panel.database import db
|
19
|
+
from wtforms.fields import *
|
20
|
+
from flask_classful import FlaskView
|
21
|
+
from hiddifypanel.panel import hiddify,hiddify_api,custom_widgets
|
22
|
+
|
23
|
+
class CommercialSettings(FlaskView):
|
24
|
+
|
25
|
+
|
26
|
+
|
27
|
+
def index(self):
|
28
|
+
form=get_config_form()
|
29
|
+
return render_template('config.html',form=form)
|
30
|
+
|
31
|
+
|
32
|
+
def post(self):
|
33
|
+
form=get_config_form()
|
34
|
+
if form.validate_on_submit():
|
35
|
+
|
36
|
+
|
37
|
+
boolconfigs=BoolConfig.query.filter(BoolConfig.child_id==0).all()
|
38
|
+
bool_types={c.key:'bool' for c in boolconfigs}
|
39
|
+
old_configs=get_hconfigs()
|
40
|
+
for cat,vs in form.data.items():#[c for c in ConfigEnum]:
|
41
|
+
|
42
|
+
if type(vs) is dict:
|
43
|
+
for k,v in vs.items():
|
44
|
+
|
45
|
+
if k in [c for c in ConfigEnum]:
|
46
|
+
#if not k.commercial():continue
|
47
|
+
if k in bool_types:
|
48
|
+
BoolConfig.query.filter(BoolConfig.key==k,BoolConfig.child_id==0).first().value=v
|
49
|
+
else:
|
50
|
+
if "_domain" in k or k in [ConfigEnum.admin_secret]:
|
51
|
+
v=v.lower()
|
52
|
+
if "port" in k:
|
53
|
+
for p in v.split(","):
|
54
|
+
for k2,v2 in vs.items():
|
55
|
+
if "port" in k2 and k!=k2 and p in v2:
|
56
|
+
flash(_("Port is already used! in")+f" {k2} {k}",'error')
|
57
|
+
return render_template('config.html', form=form)
|
58
|
+
if k == ConfigEnum.parent_panel and v!='':
|
59
|
+
# v=(v+"/").replace("/admin",'')
|
60
|
+
v=re.sub("(/admin/.*)","/",v)
|
61
|
+
|
62
|
+
try:
|
63
|
+
if hiddify_api.sync_child_to_parent(v)['status']!=200:
|
64
|
+
flash(_("Can not connect to parent panel!"),'error')
|
65
|
+
return render_template('config.html', form=form)
|
66
|
+
except:
|
67
|
+
flash(_("Can not connect to parent panel!"),'error')
|
68
|
+
return render_template('config.html', form=form)
|
69
|
+
StrConfig.query.filter(StrConfig.key==k,StrConfig.child_id==0).first().value=v
|
70
|
+
|
71
|
+
# print(cat,vs)
|
72
|
+
|
73
|
+
db.session.commit()
|
74
|
+
flask_babel.refresh()
|
75
|
+
flask_babelex.refresh()
|
76
|
+
|
77
|
+
|
78
|
+
from hiddifypanel.panel.commercial.telegrambot import register_bot
|
79
|
+
register_bot()
|
80
|
+
if hconfig(ConfigEnum.parent_panel):
|
81
|
+
hiddify_api.sync_child_to_parent()
|
82
|
+
reset_action=hiddify.check_need_reset(old_configs)
|
83
|
+
if reset_action:
|
84
|
+
return reset_action
|
85
|
+
|
86
|
+
if old_configs[ConfigEnum.admin_lang]!=hconfig(ConfigEnum.admin_lang):
|
87
|
+
form=get_config_form()
|
88
|
+
return render_template('config.html', form=form)
|
89
|
+
flash(_('config.validation-error'), 'danger')
|
90
|
+
return render_template('config.html', form=form)
|
91
|
+
|
92
|
+
|
93
|
+
|
94
|
+
|
95
|
+
|
96
|
+
# form=HelloForm()
|
97
|
+
# # return render('config.html',form=form)
|
98
|
+
# return render_template('config.html',form=HelloForm())
|
99
|
+
form=get_config_form()
|
100
|
+
return render_template('config.html',form=form)
|
101
|
+
|
102
|
+
def get_babel_string(self):
|
103
|
+
res=""
|
104
|
+
strconfigs=StrConfig.query.all()
|
105
|
+
boolconfigs=BoolConfig.query.all()
|
106
|
+
bool_types={c.key:'bool' for c in boolconfigs}
|
107
|
+
|
108
|
+
configs=[*boolconfigs,*strconfigs]
|
109
|
+
for cat in ConfigCategory:
|
110
|
+
if cat=='hidden':continue
|
111
|
+
|
112
|
+
cat_configs=[c for c in configs if c.key.category()==cat]
|
113
|
+
|
114
|
+
for c in cat_configs:
|
115
|
+
res+=f'{{{{_("config.{c.key}.label")}}}} {{{{_("config.{c.key}.description")}}}}'
|
116
|
+
|
117
|
+
|
118
|
+
res+=f'{{{{_("config.{cat}.label")}}}}{{{{_("config.{cat}.description")}}}}'
|
119
|
+
for c in ConfigEnum:
|
120
|
+
res+=f'{{{{_("config.{c}.label")}}}} {{{{_("config.{c}.description")}}}}'
|
121
|
+
return res
|
122
|
+
|
123
|
+
|
124
|
+
def get_config_form():
|
125
|
+
|
126
|
+
|
127
|
+
strconfigs=StrConfig.query.filter(StrConfig.child_id==0).all()
|
128
|
+
boolconfigs=BoolConfig.query.filter(BoolConfig.child_id==0).all()
|
129
|
+
bool_types={c.key:'bool' for c in boolconfigs}
|
130
|
+
|
131
|
+
configs=[*boolconfigs,*strconfigs]
|
132
|
+
# categories=sorted([ c for c in {c.key.category():1 for c in configs}])
|
133
|
+
# dict_configs={cat:[c for c in configs if c.category==cat] for cat in categories}
|
134
|
+
class DynamicForm(FlaskForm):
|
135
|
+
pass
|
136
|
+
is_parent=hconfig(ConfigEnum.is_parent)
|
137
|
+
for cat in ConfigCategory:
|
138
|
+
if cat=='hidden':continue
|
139
|
+
|
140
|
+
cat_configs=[c for c in configs if c.key.category()==cat and c.key.commercial() and (not is_parent or c.key.show_in_parent()) ]
|
141
|
+
print(cat,cat_configs)
|
142
|
+
if len(cat_configs)==0:continue
|
143
|
+
|
144
|
+
class CategoryForm(FlaskForm):
|
145
|
+
description_for_fieldset=wtf.fields.TextAreaField("",description=_(f'config.{cat}.description'),render_kw={"class":"d-none"})
|
146
|
+
for c in cat_configs:
|
147
|
+
if c.key in bool_types:
|
148
|
+
field= SwitchField(_(f'config.{c.key}.label'), default=c.value,description=_(f'config.{c.key}.description'))
|
149
|
+
elif c.key==ConfigEnum.lang or c.key==ConfigEnum.admin_lang:
|
150
|
+
field=wtf.fields.SelectField(_(f"config.{c.key}.label"),choices=[("en",_("lang.en")),("fa",_("lang.fa")),("zh",_("lang.zh"))],description=_(f"config.{c.key}.description"),default=hconfig(c.key))
|
151
|
+
elif c.key==ConfigEnum.country :
|
152
|
+
field=wtf.fields.SelectField(_(f"config.{c.key}.label"),choices=[("ir",_("Iran")),("zh",_("China"))],description=_(f"config.{c.key}.description"),default=hconfig(c.key))
|
153
|
+
elif c.key==ConfigEnum.package_mode:
|
154
|
+
field=wtf.fields.SelectField(_(f"config.{c.key}.label"),choices=[("release",_("Release")),("develop",_("Develop"))],description=_(f"config.{c.key}.description"),default=hconfig(c.key))
|
155
|
+
elif c.key==ConfigEnum.utls:
|
156
|
+
field=wtf.fields.SelectField(_(f"config.{c.key}.label"),choices=[("none","None"),("chrome","Chrome"),("edge","Edge"),("ios","iOS"),("android","Android"),("safari","Safari"),("firefox","Firefox"),('random','random'),('randomized','randomized')],description=_(f"config.{c.key}.description"),default=hconfig(c.key))
|
157
|
+
elif c.key==ConfigEnum.telegram_lib:
|
158
|
+
# if hconfig(ConfigEnum.telegram_lib)=='python':
|
159
|
+
# continue6
|
160
|
+
libs=[("python",_("lib.telegram.python")),("tgo",_("lib.telegram.go")),("orig",_("lib.telegram.orignal")),("erlang",_("lib.telegram.erlang"))]
|
161
|
+
field=wtf.fields.SelectField(_("config.telegram_lib.label"),choices=libs,description=_("config.telegram_lib.description"),default=hconfig(ConfigEnum.telegram_lib))
|
162
|
+
elif c.key==ConfigEnum.branding_freetext:
|
163
|
+
validators=[wtf.validators.Length(max=2048)]
|
164
|
+
render_kw={'class':"ltr",'maxlength':2048}
|
165
|
+
field= custom_widgets.CKTextAreaField(_(f'config.{c.key}.label'), validators, default=c.value, description=_(f'config.{c.key}.description'),render_kw=render_kw)
|
166
|
+
else:
|
167
|
+
render_kw={'class':"ltr"}
|
168
|
+
validators=[]
|
169
|
+
if c.key==ConfigEnum.domain_fronting_domain:
|
170
|
+
validators.append(wtf.validators.Regexp("^([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,})|$",re.IGNORECASE,_("config.Invalid domain")))
|
171
|
+
validators.append(hiddify.validate_domain_exist)
|
172
|
+
elif '_domain' in c.key:
|
173
|
+
validators.append(wtf.validators.Regexp("^([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,})$",re.IGNORECASE,_("config.Invalid domain")))
|
174
|
+
validators.append(hiddify.validate_domain_exist)
|
175
|
+
|
176
|
+
if c.key!=ConfigEnum.decoy_domain:
|
177
|
+
validators.append(wtf.validators.NoneOf([d.domain.lower() for d in Domain.query.all()],_("config.Domain already used")))
|
178
|
+
validators.append(wtf.validators.NoneOf([cc.value.lower() for cc in StrConfig.query.filter(StrConfig.child_id==0).all() if cc.key!=c.key and "fakedomain" in cc.key and cc.key!=ConfigEnum.decoy_domain],_("config.Domain already used")))
|
179
|
+
render_kw['required']=""
|
180
|
+
|
181
|
+
if c.key ==ConfigEnum.parent_panel:
|
182
|
+
validators.append(wtf.validators.Regexp("()|(http(s|)://([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,})/.*)",re.IGNORECASE,_("Invalid admin link")))
|
183
|
+
if c.key == ConfigEnum.telegram_bot_token:
|
184
|
+
validators.append(wtf.validators.Regexp("()|^([0-9]{8,12}:[a-zA-Z0-9_-]{30,40})|$",re.IGNORECASE,_("config.Invalid telegram bot token")))
|
185
|
+
if c.key==ConfigEnum.branding_site :
|
186
|
+
validators.append(wtf.validators.Regexp("()|(http(s|)://([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,})/?.*)",re.IGNORECASE,_("config.Invalid brand link")))
|
187
|
+
# render_kw['required']=""
|
188
|
+
|
189
|
+
if 'secret' in c.key:
|
190
|
+
validators.append(wtf.validators.Regexp("^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",re.IGNORECASE,_('config.invalid uuid')))
|
191
|
+
render_kw['required']=""
|
192
|
+
|
193
|
+
if c.key==ConfigEnum.proxy_path:
|
194
|
+
validators.append(wtf.validators.Regexp("^[a-zA-Z0-9]*$",re.IGNORECASE,_("config.Invalid proxy path")))
|
195
|
+
render_kw['required']=""
|
196
|
+
|
197
|
+
if 'port' in c.key:
|
198
|
+
if c.key in [ConfigEnum.http_ports,ConfigEnum.tls_ports]:
|
199
|
+
validators.append(wtf.validators.Regexp("^(\d+)(,\d+)*$",re.IGNORECASE,_("config.Invalid port")))
|
200
|
+
render_kw['required']=""
|
201
|
+
else:
|
202
|
+
validators.append(wtf.validators.Regexp("^(\d+)(,\d+)*$|^$",re.IGNORECASE,_("config.Invalid port")))
|
203
|
+
|
204
|
+
|
205
|
+
# validators.append(wtf.validators.Regexp("^(\d+)(,\d+)*$",re.IGNORECASE,_("config.port is required")))
|
206
|
+
|
207
|
+
for val in validators:
|
208
|
+
if hasattr(val,"regex"):
|
209
|
+
render_kw['pattern']=val.regex.pattern
|
210
|
+
render_kw['title']=val.message
|
211
|
+
field= wtf.fields.StringField(_(f'config.{c.key}.label'), validators, default=c.value, description=_(f'config.{c.key}.description'),render_kw=render_kw)
|
212
|
+
setattr(CategoryForm,c.key , field)
|
213
|
+
|
214
|
+
multifield=wtf.fields.FormField(CategoryForm,Markup('<i class="fa-solid fa-plus"></i> '+_(f'config.{cat}.label')))
|
215
|
+
|
216
|
+
setattr(DynamicForm, cat, multifield)
|
217
|
+
|
218
|
+
setattr(DynamicForm,"submit",wtf.fields.SubmitField(_('Submit')))
|
219
|
+
|
220
|
+
|
221
|
+
return DynamicForm()
|
222
|
+
|
223
|
+
|
224
|
+
|
4
225
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
226
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
@@ -1,5 +1,39 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
|
4
|
-
|
1
|
+
from flask_admin.contrib import sqla
|
2
|
+
from hiddifypanel.panel.database import db
|
3
|
+
from wtforms.validators import Regexp
|
4
|
+
from hiddifypanel.models import User, Domain, DomainType, StrConfig, ConfigEnum, get_hconfigs,ShowDomain,hconfig
|
5
|
+
from wtforms.validators import Regexp, ValidationError
|
6
|
+
from hiddifypanel.panel.admin.adminlte import AdminLTEModelView
|
7
|
+
from flask_babelex import gettext as __
|
8
|
+
from flask_babelex import lazy_gettext as _
|
9
|
+
from hiddifypanel.panel import hiddify,hiddify_api
|
10
|
+
from flask import Markup
|
11
|
+
from flask import Flask
|
12
|
+
from flask_sqlalchemy import SQLAlchemy
|
13
|
+
from flask_admin import Admin
|
14
|
+
from flask_admin.contrib.sqla import ModelView
|
15
|
+
from wtforms import SelectMultipleField
|
16
|
+
|
17
|
+
|
18
|
+
from wtforms.widgets import ListWidget, CheckboxInput
|
19
|
+
from sqlalchemy.orm import backref
|
20
|
+
# Define a custom field type for the related domains
|
21
|
+
from flask_admin.form.fields import Select2TagsField,Select2Field
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
class ProxyDetailsAdmin(AdminLTEModelView):
|
26
|
+
column_hide_backrefs = True
|
27
|
+
form_excluded_columns=['child']
|
28
|
+
column_exclude_list =['child']
|
29
|
+
# list_template = 'model/domain_list.html'
|
30
|
+
# edit_modal = True
|
31
|
+
# form_overrides = {'work_with': Select2Field}
|
32
|
+
|
33
|
+
def after_model_change(self, form, model, is_created):
|
34
|
+
if hconfig(ConfigEnum.parent_panel):
|
35
|
+
hiddify_api.sync_child_to_parent()
|
36
|
+
def after_model_delete(self, model):
|
37
|
+
if hconfig(ConfigEnum.parent_panel):
|
38
|
+
hiddify_api.sync_child_to_parent()#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
39
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
@@ -1,5 +1,51 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
|
4
|
-
|
1
|
+
from .ProxyDetailsAdmin import ProxyDetailsAdmin
|
2
|
+
from .CommercialSettings import CommercialSettings
|
3
|
+
from hiddifypanel.panel import hiddify
|
4
|
+
from hiddifypanel.models import *
|
5
|
+
from hiddifypanel.panel.database import db
|
6
|
+
from hiddifypanel import Events
|
7
|
+
|
8
|
+
commercial=False
|
9
|
+
def init_app(app):
|
10
|
+
from . import restapi
|
11
|
+
restapi.init_app(app)
|
12
|
+
return
|
13
|
+
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
def config_changed_event(conf,old_value):
|
18
|
+
|
19
|
+
|
20
|
+
if conf.key==ConfigEnum.is_parent:
|
21
|
+
if conf.value and not is_valid():
|
22
|
+
set_hconfig(ConfigEnum.is_parent,False)
|
23
|
+
if not old_value and conf.value:
|
24
|
+
Domain.query.delete()
|
25
|
+
db.session.commit()
|
26
|
+
db.session.add(ParentDomain(domain=hiddify.get_ip(4)+".sslip.io"))
|
27
|
+
db.session.commit()
|
28
|
+
|
29
|
+
Events.config_changed.subscribe(config_changed_event)
|
30
|
+
|
31
|
+
|
32
|
+
|
33
|
+
# def db_init_event(db_version):
|
34
|
+
# if not is_valid():
|
35
|
+
# db.add(BoolConfig(ConfigEnum.db_version,10,child_id=0))
|
36
|
+
# db.add(BoolConfig(ConfigEnum.db_version,11,child_id=0))
|
37
|
+
# return
|
38
|
+
# # if hconfig(ConfigEnum.is_parent) and ParentDomain.query.count()==0:
|
39
|
+
# # external_ip=hiddify.get_ip(4)
|
40
|
+
# # db.session.add(ParentDomain(domain=f"{external_ip}.sslip.io",show_domains=[]))
|
41
|
+
# Events.db_init_event.subscribe(db_init_event)
|
42
|
+
|
43
|
+
|
44
|
+
|
45
|
+
def admin_prehook(flaskadmin,admin_bp):
|
46
|
+
# flaskadmin.add_view(ParentDomainAdmin(ParentDomain, db.session))
|
47
|
+
flaskadmin.add_view(ProxyDetailsAdmin(Proxy, db.session))
|
48
|
+
CommercialSettings.register(admin_bp)
|
49
|
+
|
50
|
+
Events.admin_prehook.subscribe(admin_prehook)#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
51
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
@@ -1,5 +1,16 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
|
1
|
+
from flask import Blueprint
|
2
|
+
from flask_restful import Api
|
3
|
+
from .tgbot import bot,register_bot,TGBotResource
|
4
|
+
|
5
|
+
|
6
|
+
bp = Blueprint("api", __name__, url_prefix="/<proxy_path>/<user_secret>/api/v1")
|
7
|
+
api = Api(bp)
|
8
|
+
|
9
|
+
|
10
|
+
def init_app(app):
|
11
|
+
api.add_resource(TGBotResource, "/tgbot/")
|
12
|
+
with app.app_context():
|
13
|
+
register_bot()
|
14
|
+
app.register_blueprint(bp)
|
4
15
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
16
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
@@ -1,5 +1,59 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\t\x00a\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00<\r\x00\x00\x12\t\x04\x00^\x14\xd9E\xe7v\xdc\xc4\xcb}\x8ev\xb2\xc5\xbf\x9e\x00\x00\x00\x00\x00\x00\x00\x00\x93\xfd`\x04\n\xc8\xf9X\xb2\rP\x9e\xbb\xfa\x99\xe7^\x7f\xbfU\xd46O\xc5\xf2\xac\x0c\x1eH\xf9U\x00\xe9\xfa!N\x9ct\xe9\xbdM5\xc5\x83\xa4\x87\xd7HB\xb0>\x7f\x0b\x14o\xd1\xdd.\xdb\xb5\xce|\x16qA_\'\x9d}\xcb\xe3\xf6)J\x87\xaa]\xa6\xd2\x84f\xb6\x9d7\xbf\n\x16\x00:\xca;\x92\x9dg\xe7$s`\xbc\xef\xbep\x12\xc3\xfb\xf5\x83oL\xde\x99\x00\x8b\xb0RJI!\xe1\xaa4\x06\x0c\xb7\\\xd4\xc9\x04\x9a\xd5!\x9aF\xe2\xdd\'\x88\xd6\xe5=\xb9.\x943\xa9\x18\xca\xa9\x85\xd9\xec\x95\x8cQ\x07\x91\x81~\xd3SV-{G\xfaP\xca\x9b\xfa\xc76\xff\xe5u\xfb\\\xc9j\x86\xa8\x16%-\x8d\x12\xca}n\xb8\x12\xb6@\x9a\xe7\xa4\x14\x9d"-\xe1\x1e\xe8\xec\xdc\x95\xebKySz2\xcd\x8d.\x82\x98\xca\xa3nzn\xfdWtn6\x9c\xca\xc2K\xda\xef@\xcf\x80%\xebJ\xd7A\xe8\xc7\x07F\x9c\xb1D\x14$\xf9\\R=\xadW\n<\xc1zl\x06\xd1\xe8\xd0uR\xc6\x92t\xdc\xdb\xb8\x11t\xdf|2\x88R\x19\xf3L;\x17\x97L`\xb3s\x14\xa6\x1eR\t\x15{\x08\x9e\x03\xfa\xd7\xc3\xb7u\xf4o\xadH1\xcc\xe3V-0\n\x1e-\xe5\xdf\xf4q\x18\x7f\xdd\xdfB\x18x\xb1\x89\xfa]\r\x1f<\\\x1c\xe4\xd8w\xa4W\x07\xd5\xe4\x87\xce\xa2\xc5\x1a6v\x11l\xe2\tV\x89\x94\xdf\x02\xca\x8c\xee@\xa8\xbb\xb6\xcb-0[\xd6\x11\xedn\'\xb0\xc5\xf5Q\xdd)\xd8\x98&\xcdE\xe0\xe8[\x8aU\xada\x0e\xbc(Hz\xe3\xc6\xacP&f\xc4\xbe2\x0eg\x9a\xb8\xd85F)\xe6c\xf2C\x803\xe2\x8cl\xb6\xee`\x7f\xfa\xb9%\xfb\xb0\xb0"D/\xce\x16\xd7\t#\xaeJ\x91\xa2\xd6\x0b\xd0\x9aLXS\xaa\x9c\x93\xe9\x9am;\x88\t\x19\rB\x15X\xd3\xad\x17[\xd5_1\x11\xb7w\xa6\xa7\x9e\xa2\xc3\xda$\xff\x1d:\x0b\x99\xbb\xc4I\x9e\x9b\xed\x8a7|\xb4\x1c\xa9\x17\th\xa51}\xdb\x0b\x19r\x8d\tQ\x9eu]\xd5\xd2\x81\xb9\xf1\xf4\xf5\xcc\xcagn\x0b_\xf44Sp\x86\xfb\xe3O[\x1d\x83/\x98\xfe\xfa\xf3J\n\xa0\xf6\xa6\xa9V\x94:T\x92\xc5\x91\xb2\x15\xaezu\xbc3\xc4\xe9.4\xb24\x97\xc38\x99t\x7f[>\xb7\x1fYHo\xf7/\xd7~\xbd2|\xaa\x80\xf4\xe6\xb0\xf4*\xb7\\ym\x0f$\x80s\xec\xe3Cb\xd1\x85 Y\x14\xd5\xfc\x86\x98\xef\x8e\xc6\xdb\xd4\x93\x84\x00aO\xde\x17\xb2P9\x14/ \x04=\xad\x90M\x8e\xc38y\x11-\x8b\x97\xf7\xde\x1f\xd1&#\x8dL\x0f\xf8<\x0bV\x92/\xea\x1a/\'\xe7,\x8d\x7f\x94|_x\xbfBv\x11\x89\x1d\r\x12Y\x8e:\xea*w\xfb\x85&\x05\xf4\xa3f\xc6\xbb\xbbN\xfe\xe3.\xd5J[\xce\xcav\xf0\xab@\x98\xf7\x8b\xe1\x1c\xb7U\xd7-\x03J\xde\xb3\xfbs\x1fa\x02@\xddF\xe2\xb0o\xb4\xe8\x07\xcc\x84 ,V\x9f\x97\xb6M<\xe7\r\x17\x98\n_\x8a0\xb1ABV\xc1\xad\x00\xef<C<\x0c\x95T0\x0b\xae\x9c|\xb2<\x9b\x8b>=\x0e\r{u-i\x86\xce\x95\xcc\xc2\xae2\xb6tY\x1b\xf2\x8e\xeaf\xb9\x03\xbb\x99s)\x1c\xf7dZ\xc6{\x04)\xde\xb4\x16\xa2@\x15\xe9\n\xa8\xf5`\x8cYa\xa3d\x912y$1\xa6\t\xady\xa2\xbb\xb7\xa7xT\xa9y\x17K3w~\x0fA\x02\x9eK\x10\xe2\xe5\xc1Vb\xe9\xfe\xd9WIQ\xb6^\xce\xc8\x95\x1d\x06\x03E\xfa\xe0\xea\xa8\x9an\xde\x02\xd1\xceJ\xc4\xad\xc6\x0f\xdd\x85\xf6$\xae\xb3\xf4\x04\xde\xdf\x02y\x7f\x1d.\xf7Ut#\x88\xdd\xf7\xed8\x80}T\xc5\x84\x0c\xf8\xf4_\x130\xa3\xd8\x08z\xe0j\x82\xfc_\xcc\xb1u%K\x06\x8a\xa5\xf5d/\x822\'\xb4\xb4\x81:g\x84\xc0\xe5\x98\xa4\x7f\x15\xbe\x82R\x85\x9a\xf2[\x11\x00O\xe3\x1dW@{D\x14"$\x03\x84\xc1/\x04\xf1\xea\xf8m?ko\x87l+W#\x84-G\x0e\xd4DxHZ%\xbb\xb00\xf9\xed\xf2\xcd\xee\xe9\xbe\xd6p\x15\xfe\x0eeE\xea\x16\x9d\xe0\x94\x0bt&:\xd1\xef\x02\xd7\x8a\xe8\xc4yG5\xb2\xae\xda\x837\xdem\t\xcb/z\x044|p\xd7\xf8R\xae\xf3\x00\x18\xedd\x9a\xef\xb1\xe1g\xe9\x9a\x89\xa530\xce\x8f\x88\xa3\xa5\xf5\x91t/R\xf5\xc2\x97\xe4K\x1ekQ\xa4M\xa3;\xb9\x0eZ\x0cm&\xa2o\t\x9d\xf2;\xe8\xfe\xd0j\\\x0e\x17\x9ea^\xab\'U\xad\x96\xaf\x19\xd7\xca\x8f\xa9\xb8\xd6\x9bk\xff\x97[\x1dD\x86\xdb\x03\xa8\x1f3\xb3\xe5]\xe5K\xb8\xa5$H\xd4\x02\xa7\x0e\xb7\xda\'\x0f,V\xa3\x9e\xe8z\x1f?X2\xb8\xab \xa2\xf5\xf0\xc25\xe1\xfa\x14X\xfa\x06\xe4J\x17\x1dK\x10\xe9T\xaf\xe6\x1dI\x13xP\xcfh<\x14\xa9\n\x1e!>\xa0k\xa6M\xeev;\xce?\x17\x92\x1c\xc6\x00\xbdw\xaba\xc1\xa5$,\xd8X\xf1\xa0\xa1\xc1\x893(\xa8Y\xba29\xe8\xda\x00H\x0c"`#\xcci\xd5C\xd7}!\xe3C\xe3\x0c0\x88*\x81V`\xecM\x114\x8e\xben\xa3\xe1\x1a\xf5\x96\x80\xa0\xe7_\xf3\xdfg\t\xea2\x90\xffI\xec\x07\x81\x96g\xd4\r\xef\xaa6\xa4\xc5\x1b\xf3^F\xee/>\xc8\x03\xc3\xe9\x9fY\xca\xb3\xbaj4\xe7?\xefA\xa8\xecx\xa0a_\xf1\xdd\xa4\x8dF\xfc\xfd\xfbh\xb1\xda\x9c\x0b\xed\x114f\'\xcc:\xdc\x1b\x00\'\xde\x18*\x99\xa0"\xad\xd8\x85\x7f6%W\x9f\xf6\x8c\xfdv\xcc\x0bO\xcc\xec<\x9a\x92f\x18\x99<\xdb\x18`v[\x01\xa6\x10\xaa%^\x18\x15\xeay\xdd\xd2\x87\xa7\xf7\xc2~\x13\x1c\xebA\x1d\xd42z\xf3\xeb\tu\xe0\xfe\x0b[\xea@\x08\xbf\xfd\xee\xf2\x99\xa8Zt{{\xab\x92\xa9\xf4m\xe0\xe9\x92\xb7\xbe\xd9A\xdc<{\x9d\x88\x82\x96\x1aU8HGwr>&E(]\xb8\xe2\xc0\xda&i\x9d\x9b2\x86\xd8\xe7%\xf0{-\x00A(\xed\xea0\x1b?2\xa2\xce\x1d\x94#\xb4\xd8\x0c\xd2\xc1A|\xed\xe1W\xb4\xbd\x01\xf8\x04\x85\\\xed\x8e!lF\xcc\xfc_\x7f\xdfuq\xc0\x11\x82\xf6\xd5R\x04`\xc8\xd8\x87\xcb\x9e\xd8\x9aXlN\xbe\xcb\x15\xa5v!\x0f\xa8\xe9\x98Q\xc9\xe6\x87\xce\xae\xf0\xa5\x0f\x80\xa0\x16*#\x82B\xd0)\x9b\xdc\x1e=\xf2\xc7\xb9,RDG\x0e\xe3\xaf\xbc\xb4\xd9\xcbR\xbd\x84A\x1ci\xa8Tn\x87A[\xb9\xd1\xc9\x93\xe1\xdf\x9f\xcf\xde\x07\\\x8at\x9aG\xce\xc6\xf3\xf8\xfc\xd5\x9d\xa9\xda\x08\xaa6k\x82\xb5R\x81\x16\xedoV-\xf6<\x93\xda\x83\xe0\x06\xb7\xa3\x08\x98\x9ct__B\xa8\xfb\xfa\xb6y\xa5,\xadk\x96\xf5\x87\xf1\x04\x12\xdf\x14%u\xc6\x9b\xbca\xb1\xed\xc8hB\xd3\xb3\x98\xb6RD\xf1\x98p\xd0\x10\x8bv\xbc\xbe\xc2t\xbe\xbe\x91\xb5(<Z\x05\xf8Tq\xe7\t\xf2i\xd7x\x80\xbd\xc9,#}B\x878\xc8t\x0e\x87\x92BzPz\xa4\x7f[\x80\xb3G\xe4\xcc\xd4\x91\xf6\xf5&\x11s\xf9_\xf0\x90\xa4\x1b\xc0\xe7\xc6\xa3\xa4\xa4\xe8\xbe\x01\xd6\xa2\xda\xf7M"b;\x8d\xfb\x1d_o\x03uP\x1e\x11h\xd3t\x1d}&&&\x18\xc9&\xad\x0e\x808~N\xb4\x10\xd4\xef\xd1WO]\x13\x1a>\xe3\x19\xbf\x08B\xcb\xb3\xcb\x08\xc4\xc5\x08\xe4\xf0\xa7\x101\x1c\xc4\xf2\xe6!\xc7hV\xa8o\xf5N\xc3\xd2\xe3\xc2V:\x86zv\x06\x9a\xe2\x1fp\x9a\xa2|\xb9\x9fM\x04d\x07\xcc\x948\xaaU\xc8\xd4\xf9\xf1Vk\x0f]NT%\xdf\xbc\xc1c\x07\xc5NAD\xad\x10`\xa2+g\x04\x92\x16\x13\xecI\x18t#\xcb\xef\x1a\x8d\xa3\xf9^i\x97"\x93"\x0c\xffx\x834\xae\xe3=\x19*xt\xcd\x92\xa3!8\xbc\t\xf8\xbd\x82\xed\xd3rJ`\xe2~\xe7\xae\xe4 \xecAE\xb1m8\x91[\x93\x99\x1e\xffg\xc1\x918\x7f\xc5\x0cJ\x8d1B\xd0\xc6\x99\xba\x1a\x13&_\xae\xaa\xe3\xe184\x834H\xf5\xd6\xbb\r\xad\xf5\xeb-\xab\xdfGt\xe3J\x94\x94\x805\x9e\xc9P\xb2\x14\x8a\x9a\xc9#\xe0\x87 +"\'zT%\x97)\xe0\xbf1{`E#[\xe7g\x9e+\x19k\x80\xeb\x81{p\xf0\xb1*\x97I\x82W\xab%\xfb\xe1\xa8g*\x94Q\x9cF\x8e\x1by\x9a\xdc[\x9e+\x97\x8c\x95Q\xb3\xe4J\x1f\x9eu\x13\xe3\x1fs\xfav\x1f\xeafYT\x1fA\x11\xff(Z\\\xe1\xac\xcb\xb8\xad"M\xe4>&\x1a\x80=\xa8\x98\x03"\xfd\xcb\xdf$`^%L\x16\xb2[.\x92\xe5\xd3\xb18^.\xa1\xb4\x05\xb4\x9c\xc9V\xe8lK\xf5yc\x1c>\xca\xccy\x07\x19\xb6Nm\x13\t\xcf\xe9\x8d\xb3\x13\x10\xfb\xee]\x8e\x16\xb35\x03\xd2\xfa\x0fje\xd8\xb3\x156C\x8c\xb7Z\xce\x92\xe5k\xeek\xe29\xd8e\x0e\x01\t\xd5\xce\xf4B\x9d\xfb5\xc5\xfc\xe9\x94]\x83IO\xfc\xd9\xabl\xdd\x06\xd7n\x94\xc1\x8b\xc5\xbb\x90\xe4\xbf\xd2\x0b\x8a\xe2\xca.J\xe2\x1e\xcf\'\x04%V\xe9&\xce\xfcDC\xeed\xc8\xfe\x03Y\xe4j\xcf`\xe7%\xa2\xe0+[\xa2\x11e\x84\xc4\x08ne\x1c\xa5^\xdf\xf0\xa5\xe5\xbc%\xa1\xa9\xaa\xaaO9\x90rP\xe5\xe4\xa9\xe1R$\t=\xdd(\x87\xd7K\x8de\x8d\x03\'\x05@e\x067(\x9b\x9d0\xd5\x91\xb5\x11\x7f\x11\'\t\x91\x0e\xdd\xaf.\xc47S\x0f\xf5\xf0\x80\xf9\x05\xdd\xcd\xea\xd0k\xc1\xd6\x0b\x14\xae4S:\xa8o)f\x83d\xaa6\xaf/\xaf\x94\x1d\x14\x89qX\xa4\x82\xc9\xa8,\xcd\xb0VI\x05\xf9\xb5\x1c1=\r\xbf\xd7RD\x1bH\xe8\xc5\x00\\\xed\xf0\xbe\xc8\xb7\xf0\xb6\x16\xb2\x07\xfc\x07M&R3\xe3\xa0XQ\xd2\x0e\'\xb9I\x00\xf9\x1d\xfd\x7f\xf3\x00>\xffOb\x83\x10\xa8\x83\xb7t\xa0\x84\xa3RO\xf5\x98\xa7\xf9\xa2\x1d+\x05\x1bu|\xa3,\xf3U%\xdf\xfe\xeb\x941\xbaP\x1e\xa1`\xa0\xab\xe1\x97\xf6\xbf\x12\x1bE\xecE:?\xc1\xbes\x08F\xcb8\xc4\xa1\x02j?e\xe3-\x03\x10\xa6\x1f\x7f\x109\x1d\x1e\xc2&}\xce\x07\xf4\x10\xe7\xf7X|\xcc\xf5\x17\x86\xa6\xa9\xd5>\xba\x12\xa1\xa8\x14\x82l.\x0f\xd4\xae\xeay\xe1Zl\x9aC\xde)\xde\x98\xb7QYG.\xd4\xbc\xc8\x1b`\xabk\xc5\xd19\x8aW\xe9\xb42\xc3\xb0\xd6t\xdcJU2\xb6\xe5\xd2\x1d\x1f\xe7\xa4\x7f\xef\xbbC\xfc\xd3\xe6\xd8n\x93\x00\x99\xe2\xc0i\xf2o0\x81\xfc\x17r\x9b\xd9\x9b\xa6\x99\xb4\x963n\xa2\xd5\xe6Z\xf7aN\xae{\xdf\t\x9d\x88JW\\[\xd0c\n\x84\x13\xb7p\xa5f\xe3"t>\xcdbF\x88,]\xce\xe2 \xc1\x80\x8a:\xfd\x13\xd0\x9b\xc2G\xbe\xe6\x93w\xbbO\x0b\xac\x1dF\xd7\xeb\',P\x8fV\xf7j Dl]\xee\xe4c\xd2\x1c%\x0c`\x84\x89\x10\xc7\xac\xe4\xe7o\x8c;TW\xdaw\xb6\xe2\xa3\x85\'\xfe\x91N\x99\xe6d\x9e\x94P\xa9|\x93\x92\xde\x15dY\xf5\x19C\x96\xe1\x13\xe1\xb6\x01&\n\xd8ri\xcb\xc4+\xdb.\x01\xb2\xfa\xa0\xd5\xb0U\xe6\xac\xa8\xa3\xedx\x1fb\x0e\xe0\xd0~|\xa9|\x00\x1e\xddU]\x9c\xaf\xd9\x06N\xa4H\xd9\xc0\x0bW\x9a\x83\x13!\xab\xd5\xddh\x8c\x83\xdak\x15\xb6&\x83\xe4\x8f\x15\x18gc\x86P\xe7`)\x19\xe7\\R\xc8\xdf\x9a>\x9c\xf1\xb9\x8fi\xd9\xa11\xedNR\xba\x1b>\xda\xba\x9as\xe4\xc6\x9d\x90~\xa8\x04\x88\x03\x1e\xb81zE/L\x10\x86\x10\x7f[\x7f0\xf6K\x18\x1b\xbf\xc0\xfe\x17\x1d\x12_\xb7j< \x84\xe8\x03\xa8\xe8\x0f)L\xb7\xa5\x94\x9b\xb0\xd1\xdcJpcqt\xd0\xdaa\xcd\x11Y+\x1d\x8c\x1ceg\x10\xbd\x0f\xe5\x80b8d\xc2]\xd2\xd8v\x0c6\xa3\x14\x80\x99R\xa6,\x87si\xecA\xc4-c\x803\xdaO\x0b\x18/\xa7\xd3\xac\x85\xd9\x86\x1d\x14\xb1\x15\xd8\x8f\xe7\xd8\x8e\xe3\x04_\xb7\x82M\xef\xf1\xc7\xe8Y\xfd\xcc!\x89\xf0\xe8\xc1\xcebP{\x93\xf85\xe3\x0e\x8as\x9e\xe7*\xad\xea\xb9\x17\x84\x8e\xf4\xb8\x84\x0e\x01\xc7=\x0c\x85\xd5\x87&h\x0ch7\xda\xd0\x0e\xc1\xcdo\xa0\x91\x1fEf\n\x0b\xe9!fV:\x86\xac\xba\xe8w\xeb\x13\xf4\xb5\xa8N\x17\xb7\x94&\xfe\x1d\xe2\x9d\xa8\x8ep^g\x02\xf8%x|\xc0\xb7\x05\xf2^p\xe4\x06>q\xe7\xeeI\x06?(\xec\x8f\xa1A<c\x90\xb5\xae\xdb\xf5\x13`\xd8\x1f\x04\xa9\xd2\xdd\xff\x84\xf3\x84\x9a\xf8\xdd\x14\xb8\x0cb/\xdfs\xdc\xaa\x9a\xc1\x19W\x8d\x0b\x1e\x86\x10\xcb\xe9(=\xd3\xf7d\x1f\x99\r\xc0\x03i\xcd`\x01\x124\x1c\xfb\xa1\xb5k$280\x99xe\xcb\x02\x9b\x97\xa0.\xf9\xab~\x853\xc9?|\xe1\x1d\xfe^\x0e\x1a\xe8>^+:i0\xa7\xd5u\xa2\x1a\x89\x1c\xb0r\xe0\xa9\xec\xac\xcc8K\xda[n\xbe\x00(\x85\xec\xf0u\xe1\xe4\x8ep\xbc"\x9d I\x19MgN\xbc\xcdG\xe4i\x96\x8f++.\x9bL\xb1\x91\xc9iu\xc6\x93;De\xf8C\xcdC=Pf\x03]\xdeH>\x8c\x8cD\xae\x06\x00N\xbe\rt\x8c\xf2\x0b\n\xb6*Qrv\x1d\xa7@\x06\xf0R\x91I\xed$/\xeb\xc1\xae[\x912\x02*\xab\xa3\x00sa\xe5Y\xd7\xc4g\xe8\x01\x9e\xcec]Cz\xc0\x02\x0b\x97\t\xd1;\xec\x1c\xb3\x04!l\xee\xedx\xbb\\\xd6\xd9\xf7\\\x11?\xc2\xba\xd6\xa6\xc2\x85\xe4\xfa\x10\xfa\x8d1\x0fe\x9az\xcc|\xe10Z\xf6\x05\xc2\xbd\x01\x19\xbf\xe1\t\x91#T\xfcq\x07')
|
1
|
+
import time
|
2
|
+
import telebot
|
3
|
+
from flask import abort, request
|
4
|
+
from flask_restful import Resource
|
5
|
+
|
6
|
+
from hiddifypanel.models import *
|
7
|
+
|
8
|
+
logger = telebot.logger
|
9
|
+
|
10
|
+
|
11
|
+
class ExceptionHandler(telebot.ExceptionHandler):
|
12
|
+
def handle(self, exception):
|
13
|
+
logger.error(exception)
|
14
|
+
|
15
|
+
|
16
|
+
bot = telebot.TeleBot("", parse_mode="HTML", threaded=False, exception_handler=ExceptionHandler())
|
17
|
+
bot.username=''
|
18
|
+
|
19
|
+
def register_bot():
|
20
|
+
try:
|
21
|
+
global bot
|
22
|
+
token = hconfig(ConfigEnum.telegram_bot_token)
|
23
|
+
if token:
|
24
|
+
bot.token = hconfig(ConfigEnum.telegram_bot_token)
|
25
|
+
try:
|
26
|
+
bot.username=bot.get_me().username
|
27
|
+
except:
|
28
|
+
pass
|
29
|
+
bot.remove_webhook()
|
30
|
+
time.sleep(0.1)
|
31
|
+
domain = (ParentDomain if hconfig(ConfigEnum.is_parent) else Domain).query.first().domain
|
32
|
+
proxy_path = hconfig(ConfigEnum.proxy_path)
|
33
|
+
user_secret = hconfig(ConfigEnum.admin_secret)
|
34
|
+
bot.set_webhook(url=f"https://{domain}/{proxy_path}/{user_secret}/api/v1/tgbot/")
|
35
|
+
except Exception as e:
|
36
|
+
print(e)
|
37
|
+
import traceback
|
38
|
+
traceback.print_stack()
|
39
|
+
|
40
|
+
|
41
|
+
|
42
|
+
|
43
|
+
class TGBotResource(Resource):
|
44
|
+
def post(self):
|
45
|
+
try:
|
46
|
+
if request.headers.get('content-type') == 'application/json':
|
47
|
+
json_string = request.get_data().decode('utf-8')
|
48
|
+
update = telebot.types.Update.de_json(json_string)
|
49
|
+
bot.process_new_updates([update])
|
50
|
+
return ''
|
51
|
+
else:
|
52
|
+
abort(403)
|
53
|
+
except Exception as e:
|
54
|
+
print("Error", e)
|
55
|
+
import traceback
|
56
|
+
traceback.print_exc()
|
57
|
+
return "", 500
|
4
58
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
59
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
@@ -1,5 +1,13 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
from . import bot
|
2
|
+
|
3
|
+
|
4
|
+
@bot.message_handler(func=lambda message: True)
|
5
|
+
def not_handled(message):
|
6
|
+
bot.reply_to(message, "We can not understand your request")
|
7
|
+
|
8
|
+
|
9
|
+
@bot.callback_query_handler(func=lambda call: True)
|
10
|
+
def update_usage_callback(call): # <- passes a CallbackQuery type object to your function
|
11
|
+
bot.answer_callback_query(call.id, "Incorrect callback", cache_time=1)
|
4
12
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
13
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|