hiddifypanel 3.0.0.dev64__cp310-cp310-manylinux2014_x86_64.whl → 3.0.0.dev66__cp310-cp310-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\n\x00o\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x004*\x00\x00\x12\t\x04\x00\xf3C\x88[\xf1\n\xc3\x92\x1d3\xc4\xa8\xd7F\xb43\x00\x00\x00\x00\x00\x00\x00\x00\x802\x9b\x13E\'\xf3\xca\x99\xd6%x\xc1\x05\x97\xc6\xbfud\xb0\x8bR\xe7(?Z\xfe\xe9\x1e\x0e\xa3\xa7=\xf1\x90\x96\xde\xc3\x8d{1\xc9\xae\t\x14\x17\xb1\x88n\xe0{R\x1b\xe1\xb6|\xc7\xb7\x9f0 \x8d\x84\xdf\xadQS\xaf^o\xdbr\xd6\xcc"\xa3\xe0R\xa0\x92Q\xce\x17\xfa\xb5\x1d\x8a%\t:,\xc6\xe5\x00\xc8q\x8e\t\xc3\x96\xdc,j\x87\x80-_\x96/\xa6\t.\x1eb\xd4\xbb\xa4R\xf3#G\xe3\xc9\xf5\xa8\x0e\x9e\xfa\xd7\x05o\xce\xb0\xa3\x8d\x14\xdf\xc0\x97d\nx\x0b\xc1\xb3\xe6Q\xf6>\xad*S\x18OL\x1e\x94B\xfat\xc9\xc4\x1a8\x89\xde\xd3Q\x03^<\x02\xc9W\xb6p\xb6\x9f1\x1d\x8e\xb1\xae&b\xac\x16O,\xba\xd5\x1e\\\x1fu\x8b\x9f\xda\xd3\xd3\xb9\x8b\xfb\xe8;\x13\x8fN\x84N\xd8\xbd\x05ka&\xf2\xee\xa7\x85\xa1\x87V4B%mh\x85K\r\xd0\x14\xb93\x07\x1e\xef\x17\x0f\xdf\xe0\xcaC?q\xfd\xd3\x11\xc8c\xe5\xbb\xfcY\xb4K\xd8\xeaU\xb5w\x10C\x0f\xee&\x8er\xfb\xdd\xbc\x94\x89\x8d\xd2\xba\xc0e;\x08=}\xf8~\xc9d\x000\xd8O\xc5\xe7\x83\x86?o\x00\xd4\xcc\xc0\x83\x96\xe6O+\x1f\xce\x83+\x8ev0y\xb0\xcd\xde\x96C3\x10\xdc\x9f\xc2y\x96\xc5\xf6Xzy\xa7\xa5\xc8\n\xa3\xf4x\x14\xf0\xf7]e\xe7S\xf2\x89\x01WQ\xf6\x9ch\xadj+j\xd9?\xaa\x01\xb5\xc9A\x11\x19\x95\x8fpq!\xb8\xe9\xe7u\xe1.AK\x01\xfca\xddW\x86\xcb\xddc\xc0\xb9^\x8b\xaflI\xf0\x90\x9e{\xb2\xdbm\xef\x8ff\xf7@\xad\xff3\xc9F\x94\x1de\x907h:\x9d\xd6\xc1c\xa8\x0e\xc6&\xe3\x9eQ\xe6\xc3~\x16C\xb0\r\x9b\xfb\xf5\xe2\xfd\x89\xa9\xe7\x05\xa0\x19\x11&J.\xc5\xf17@\xefLO~s\xaa\x00\xb3\x1aFt\x1c\x84d\xd9\xdc*\xc79h~\xde~\xbd\xfab:\xf6\x94\xcf\x1f\x05^{\x05-`"H\xdfd\xe7hs\xce\x9e\x02\x08\xbd|\xe2\x85`\xb4\'G\xe6\x98\\%H\xa4l\x12\x109:cj\\\xfc\x17]9\xfeo\x16@%\xbcPwhI\x19\x9eK\x0b+\x13\xee\x08\xc9\x80\xe9\xfc\x9f\x10,q\xfd\xd9A\x85TA\xa7\x7fW\x10rO\xba\x85\x9bdg\xef\xe6d\xe5\x14L\xfcn\xaa\xa3\x8a\xca\xaa\xca\xa3\xdf\xa4\xce\x10\x81\xb4\xd6\xf2\xab\xd7\xfc"u\xd6\xc6-\xde\xc703\xc3\xf7\r\xd0\'\x96\xe2A@\xd98\xa2\x0b\x01po\xdf\xa48+0\xa2\x05\x85\x94\x91\xa61\x00\xa1^\x90}\x98\xd1\x8e\xffD^\xc1\x9cD\xa8\xaa\xb0\xf2b8\xf0\xf0B\xef\xe1M4\xd8&\x82\xb8\xb0\x05\xdeD\x1c:\x05\x92\xd4#aP\xeb1t\xe2\xbb\x83\xa3\xa4tz\xd2\x90\xb6=\x8a\xba\x99\xd1\xea>\xd4\x11\x11u~\x98\x1b\xa0z\xcb\xa1\x8c\x8f\x9b\xd3\xdbd[\xc8\xfdd\xf6\xc3L\xc2\xe0\xe8\x94\xf6\x9d\xb2\x98\x00\x81b3M\xe8\xd2\xfdG&\x80\xe2De\x7f\x0e[\xc6C\x97q\ti\\\xecp\x1f\xc8B\x9a\x9a\xe9\x00\xc2n\x83<\xb3\xf8\x92\x00\xd29A|5\x8c\xf0fZ\xee/\x07jN\xc0^D\x8e\xb4\xfe\xfbS\xb0u\xaa\xe0\x9f\xc7^n\x1a\x83\x01\x80\xeaA.\x00,\xe4\xb79\xec\xc9\xb66\xe6<\xee\xf0\x8a\xff\xe2\x99~M{<\xef\xe3\xaf\x88\xb2\xf1_`\x86\xab\x1b\xdd\x0cZ\xfe\xb4\xd0\xe1\x8eir\xef\xbc\x1bg\x96\x94\x06\\\xb3\xc6\xce\xac\xbc\x835c\x18\xfd\xdb\x89\xae\xa0\xe5\x98W\'X\xe8\xe0\x88-!\x05\x12\xd6"\xcfD\xfdC\xe85\x0eq\xea\xaf\x1f\xfa\xa8\xc2\xd4\xa0T\x80}\xd4\t\x11\xe7}l\x99\x8fkW\xbfJ:x\xe7\xf3k\x82\x07\x9d\xb9~\r\xe3\xad|\xcdt\x7f\xc2Z\x00Qw\xb9\x0b\xd7j?\x0f\x16\xd8\xd7\x18\xa8\xb55r\xca\xd7\x13\xe0?\x1f\x0f$\xadE@m#\xbe3\xb9\xba\\\x9a\x84\xb9\xfc\x07\x11\x8f)\xfb0Y|sP"\x8e\x9d\x1a\x8c\xb6\xac\xe5\xc1\xea\xfd\xcb\x18\xe8\xad\xc4\r\xb0\x94\x84\r&W\x8d\x0e\xe1\x03\x89Ub\x9aAX\xa1"#3\xd2:\xdf\xe8\xdf~\x971\xfcnX\xdb\x94\x18\xea/N\xc7\xbb.\x80i\xaajQ\x95,\xc7r\xfd-\xea\xe2!\xda0\x91m\x91\xec\x1b\xd6\xdaA\xefl\x04\xa1Oy\x0c\xa8\xfc\xa3\xc3\x15q\xcd\xb3\x85`I\x1a\xd0u\x83\xb0\xfaQ\xf8\xcc\xa4\x9b\xa1\x13\xef\x14\xc1f\xb8t\x89>\xd0`A\xf0\xf9J\x03\xc4\x11G\x87\xe7=\xa6a\x83!(\r\xbf\xf1\xc6\x11\xd4\xee\x89\x1f\x15\x0c??H\x10n\xb0\xae\xd6\xf8.>Pz\xd0\x1b\xd5\x99\xd0\xccQS\x98\xf1W\xc1\xcet\xff#\xd6\x83\xb0\xca\xf6\x0c\xa5\xe9z\xed\xa5\xfc\xc8\x8bn%6\xe1\x9e\x0e\xb8\x8fj\x04\xf4?\xa2\x95=\x95\xde\xc8}]\x8aD\x90XZv\xc9\xfb\xce\xe4\xe0\xe1J\x90\n*\ti\xa4\x19]\x075x\xe1\xb4&:\xac&\x17\xb1W\x83!\xafs\x8b\xaa\xfb\x82U\x042\x03\xa7\x02uR\x1a\xc7$\xf4\x05\xc4\xb4-\xd3\xc2\x90\xd0\x80\x88J\xa8.\xc6p\xa2\xe5\xc7j8_GF?\xe3\xf9~r\x1cfSh-\xb3\xcbY\xbf\xf3f\xc1\x8a\x1a.\xc5\x8f\x9f\x81\xdc\xcc\\\xce\xae\xad\x96JM\x0cc:l\x12\xb0?U\xf5l\xaeB{@\x1a\xc7N\xcf3c\x89^\x848\xb9\xb5LB\x9a\xb8\xa3$\xafDm\'"\xd4\xebn\xca\xb0(\xb1\xf42\x17\xcb\x98\xba\x0f\xdc\xe2\xc6\xc4\x02\xa5\x8a3~\xcf\x81\xea8;\xb4\xb6E\xfd\xe7f9r\xfc\x04\x1a\x08\x10\xf6\x94\x9f\x8a\x04\x11\xd00\\\x99\xc9\\\xf7\xb2\xd0\xb9\x95\xbb\xbb\xbf\xd4\x89\t\xf6\xec\xd6\x84\x8f\x94\x97\xc9\xd4\xb63~\xe8rl\x0ef\x0f\x99\xc8P\xa7bP\n\x10\xf5AO\x03#L\xbcF:\x94\x9d\xfb\x12\xfe\xf5\x1bq\x1c\xfb\x01\x0f\xbb`Z\x7f\x18\x12<\x0c\xcf`\xe6f-G\x80P\na\xcd"\xf1r_\xd3\xc2\x08\xc3\x94\x8d\xd8L\xae \xb9e\x19>\xb6\x17\x98\x82@L\x1c[\x11w\xf7\xf1\x08t\x7fr\x80r\xa7\x15\xb6\x7f\x15F\xf6\x11o&\x16L[\xd4\xc9\x1c2\xd8\xea1\xd9\x08\xbf\xcd\xba\xa2\x9c\xbf\xbd4p\xb12\xdaJ\xba}}c\xd0Cn\xc3\xcaq\xfe\x11\xa81\x02\xf2\xf4f[q\x90\xdb\xb5\x98\xef\xee\xa1bh\xa2\x04\xe4]Sn\xe3\xf5\t\xe2\x1bx\xc7\xbf@\x01\xbf.$\xfb\xbe\x02\'\xe8\x84\xa7\xcb~\x84\xe47\xe11\xa2\xc9x\xe2\x1f\xbd\x11E.\r\x1fK\xe1A\rH\x02\xc9\xe8%\x9cO\xa2.\xb2\xac\x99zgE\x9e\xee\xfa\x97]A9\xbc\xd6\x8b\x82@M\xae\x089\xa7\xd1f1\xcf\xa0\x12\xf1_\xe523\xf1\xf7\xa7\x83\xee\xd7\xf5\xf6K\xcb\xa5\x8e;\x11\x85\x8bM\xba\x14\x07\xc5\x1d\xa1L\xee\xaa\x97\xe2\x84\x9b\xb7\xd7N\x1e\x07\x91\xce\xa3\x81\x14}\xea\x14G\xebN\xa3`\xf3}\xbb\xc2\x0bn\xaf|\xaaR\xf6\xfd!\xa2l*\x1d \xb5\xa5\xba\xa2n\\\xa3\xe0\xd2T\x82[\xc1=Lu\xcfj \xc1\xdd\x10\xa11[]\x1co\x93#\x96\xc9\xd6A|\x06#\x8f\x1a\xd8h\xdfl\xe6\xf0N/\x08\x7f%F\xc28&\x85\x18w/8O\x7f9\xcb\xa6\xc5\xa0\x15\xc8\x85Hs\x1c\xae\x1e!\x16\x0bs0\xeaA>\x0e\x81&\x9e\xec%\x00\x7f`^g\xa3\x19\xef\x19r\x1d\xcaP\xc3+3\x1d\x996\xee\x8e\x0c\xdas7B\xe3\x9f\xc6\xf2\xa1\xc7\xae\xffG\xd2c\x00\xd6HU\xe3\x88x)Vd\x81\n\xe7\xbd\xf9\xb76L\xf1\x15!\x15\xc7#\x81\x10h\x15-\xedN+\xc167y\xa4\xed]C\x14\xbc\xe1_3\x91\x17\x91\xdc\x17\xfcmoG\xfb\xbb\xab\xce\xba\xa97I\xd1\xd5k\x8dp\xe8\x06\xf0\xc4\xe8Y\x14;3\xde\xd2\xbeU\xab\x8f\x96\x1fM\x835\xaf\x82\x8a&gz\xdf\xf647\xec\x92\xd4\x0c\xa2Y\xaa\xce\xf55Tw2\xc8AeC/\xf0\xc7ha\xc8l*\x11\\||`\x13@I\xa4\x11>\xf0JTIh/\xdd[ig9\x9c\xd0f\x9f\xad>\xc2Q\xb3\xf7\n\x07B+\x01\xa4\x87\xd7(\xde\'\x0c\xb7\xe2\x10\x05\x01!\xd8\x836\xdf\xc1\xd2\x0b\x89\xc8\x91\n\x8c\x8a\x12\'\xa6t\x98\x93\x06\xafJ\xbe\x12nF\x13\x9f\xbe\x06\x1e,\x8a\x97\x19\xeemop\xebG\x85-r\xe4J\xa9\x1b\x88\xe5`p%\xc9*W\xd6\x0f@\xd3\xfd\x9fj.eJ\xd1D\xb6\xf3\x1drL"\xed\xc8d\x9a\xa8qf\xf3g\x80\xe4\xe3\x8ba\xef\xe7#%3\x1e\xe7h\xbaU\xe4X\x0eA\x8d\xec\xf9@76n6\xba\xad\xd4\xe9W$\x8ftd\xf4\x989\xc6OJ\xff\xa1\x0f\x1a\xe0`\xeb\xf4D5-\x01\x11\x8dx\xebt\x1a\xdd\xbc\x02~^\xd2\x17\xab\xc0\xbal\xb9l\x01\x8a\x9d\x82\x13\xf0\x96\'\xc4\x15Ep\x82\xf8\x05Z?\x0f\xad\xe2\xe0s\xc77G\xca\xcc\x16]z^\xb2\xc0j\x00S\x0f\x83oH2;\x82\xea\xec\xbc\xc1\xac\x8f9\xf4\x16 \x9b\x0c\xcf\xf2\x00\xc9\x0c\xae\xf2$#\x9f\xf74\xaaN\x91\x18n\x18\xfb\x18\xaf\x14\x1fJ\xc1n8\x18\x11\xca\xa3\x99P5@\xdc)\xd7R&\xfcMks.U\xf2\xa6DwiA8\xbd\x8d0\x0f\x9c\xc1\xf6\xda\xf6\x0e\xfb\xe5F\xd0\xc2\xc1b\xf4\xb9\x03\xb4\xb3=\x8a\xf8-\xdfZ\x1eU\x07\xa1-\xdc\xec fN\xf5\x07\x18\xcd\xc8D\xad\xb0\xc7\xfcW\x0b\x0c\x86\xf4\xfao\r\x93;\x97\x1b\xdf\x92@X\xee\xedd\xb2x8mY\xb5\x83z`\x03B\xd8\xf4;\x8f+\xd76\x19\xd8\x84\x07 \xc1h\xd6]m\x97\xbdw\xec\xc9\xf5\x9f\xb2B\x8e\xef\xa5\xa4\x13H\xc8\xf8\x8b\xaa\x99\x81\xa7#\xef\xcdL\xbe\x11\xba\x9d}\x95\xa20\x86\xfd\x94\xcd\xa5\x1d\x13g\x00d\no\x80P\xc0\xe7\x17\'\xa8\xc2<g\xcd\xb0\xee\x8e\xdb[!\x07\xbfP\xefU\tz\xd8(^\xcd\xce$~x3\x98,\xc9gG{\xe1(\xb2)\x0et\x95\xa9\xa2D\xf0\x17\x88\xde5)\xa2\x9c3\xd8X\xaa\t\x04\xae\x8d\xc3\nk\x02~\x8c\x88l>\x94\xd1|;0\x8ae 0\x0f\x12\x00\xc5\'w%72\xf9k\xd5-\x95\x8f\x7f\xad\x10\xca\xa4}q\xd8;\xfca&|7AL#\xe6\x07i\xc3@\xbf\xb6y\xb0F\x83]\xb7\x19Z.\x95"\x99)\x9cS\xf2C\xe9UM l\xb8\x90\x11\xe0\xd6\x8c\xce\xeb\x1a\xb6\x1f\xe3\xda\xc5\xccs\xf3\xc5T\x152p\xfc\x18+\x17G<\xc8\xc5\x8f\xac\\\x84\x84{\xab\xa2<\xf7\xa5\xf8(@n\xa2\x07\xe3Q\x10\xed\xd0\xc7w\xd2\xfd\xdb:\xb8\xdf\x12\xac\x91ab\xc3Vm\xfb\xcaR9Z\xc2]\xdaW<Hjg\xdc\x16\xc4\x12\xbd\xae\xa1~\xfe\x1av\xd5/\xfex\x15\xc1\x85\x1f\xb0\xcd\xf7\xb3\xdd8\x933\x12\xcdc>\xb9S?+TaO\x0c\xc1\xf5\xa1\x03\xba\x97\xcdw\xeeJ\x90\xb8Y\x17\xe1\x1ae\x06\x1c\x80.\x12j\x196\xbf\xac\xdbd\xce\x9bB\xd5io7\x1e)Ms\x11\xf8\x97\xe2*\xfb@8K-\x05\xb0\xd5\xc1\xf4\xf85w\xd6\xe7\x98gV\xba/Ff\x0f\x11\x1d)P\xf1\xdf\xad\x16\xdfy\xf0\t\xd7/\xb2\x0e\xe9\xcb(m\x88N\xbc\xb8\t\xd0\x18\xf4?\xfd\x0c\xd3\x9f\xc2\xe0V4qg\xa5f\x80\x1e[\x90 _\x00\xb3\xb9!\xf7n\xb6\xffg:u\x80AB\xbe@\x80\x17S\x1d\xee\x00\x9et@\xb7\xb2\xd5\x0e\xdaQ\xf56\x1cE%?\xb4l{\x1e\xe9\xb8\xc0@u\xd6\x9b\xc7}\xe9\x9aL\xca9\x04\xdf\\\x08|G5\xef\xd5\xfc\xa9\x0b\xb3z5\xe3Q\x97J\xb5\xa7\x03\xfd@\x86y\xf3qe\xe9\xc9\xf8\xd7\xea\x85B\xd0\xd6M\x8a+\xe6`.cA\xa4\x05\x14\xcc\xc0\xab\x0b2D\xf45z\x14\xec\xf3 \x91yG\x10\xd7\xbbL\xdb\x1b\x9c\x0f\x12q-\x01i\x0e\xd0:v}\x8f\xe1{\xc4~\x96\x80d\xe8\x01(\xff#?HI]2\xdbu\xf4\x1bZ[\xecR\xbfi\xdc\xa7\x92>a_\xbd\x99\xcdl\x9aG^\xe1\xdb\xbe\x98R\xf0r\x8e;\xb0=zmt\xb7\x8a\xfeY\xf0\x05$\xdb\x91\xbfs?\x9f1\xf9{6\xc5\xc40\x8a\xbd\x83\x84H\xbb+\xd49\xf0>\x11-\x9b\x9f\xdb%\x91A\x0ezWN\xce5\xb5\xfa\xcb\x149\x0eu\xff\xdd\xf1\x19\xdb\xf1[\x8c+\x88\xa9\x9fL\x89k<@m#;\x9e3\xb1\xfeN\r\xbd&\xaa\xcb\\S\x06\x9e\xba\xa9\x12_yWQf\x12\xb82\x9c\x86\xdd"\xc6l^\xb47ov\xd6\x90\x03N\xa8\x99\xff\x950\xe4d\x95;\xfe\x03#F\xa1Fd\xfb\xf7\xb9\xf2\x1b\xb3PL\xb5J>SA\xf5\x99\xe8\xea\xd9\xdcM\xb6\xda\xdd\xb5\xc6\x8a=V\xe8z\x93\xac\x0b\x00t!.\x1aK\x889\x95!\x10\xa4\xfd\xf7\xb7\x90\xb9P\xea\xc7\x83\xa7\xf8\xb9\xf23w\x963N6}\x1bj#\xb4ZJ\xd0\xfe\xae\xc7`yh\xa9\xb7G\x17\xd2\xae\xc7:\xf1\x99ioa\xa1n\xf2\x1ew\x0f\xa3\x80K{\x13\x1a^J\xc2\xef\xf5\xad\x8e\'V\xa6\x80\x99F\x98G\x14I%\x8d\xed(\x96\xcd\xd9\xbd\xcdQ\xeb\xdf-\xbf\xf7\xea\xa41!\xc9&\xe6\x95\xb45\x16.-\x1ex\xb9\xd6h\xa7\x9ax]\xcd\xcc\x91\xa7\xa9\x9e4\xf0_\nr2\x99\xa2\x0e\x98\xb0m\xd6i%\x97(s\x98B\xad\xa5\xbf|\xf7\xa6P\xbc\x0c\x91na{A\xddb\xcd\x95\xa70U\xdfMFT\x84\xda\x85d\x87\xd7J\x07\xf9\x91\x16-\xd5\x0bJ$x\x93x\xc5P\xda\xd5\x1d\x13\x97j\xceW\xbc`\xef\xffsN\xac\xb5\x16\x905\x87U\\9\xd3\xd2\x15\xad\x9b\x11C}\xb1\xc9\xe3\xda\xd3\xe0\xd4\x11\xd3\x1d\xf0\x89%\x89\xff\xefr\xff(I\'W\xa7|\xed\x9f7\xae_\x0e\xbf\x94\xee\xf2\x82\x8cy\xd7&I\xd9\xd23\xde\xa6\xce\xac\xd9P?8\x7f\xf0\xdcI\xec(\xff\xfe\xef\xf4>Z\xf1\xe1\xb2\xd7\x8c\x8c\xce\xf7dn\x0e\'CEEw*\xe5\xe2~C\x933A\xc2\xb5\x14\\!T\xceq6\x9cZ\x86&\xb6\\\x12W\xc5\xff\xc8Gx(\np2\xf8\x97\x03\xc58\x11\n%\x01j\xff)s\xb9\x03\xed\xe3\xccU\xa3\xac\xe3\xd3nKX.\xa7\xf6o\x10t\x18F0t\xa4:.\x02\xf7\xc4\xa2)\xe21\xc6\xb8\x11\x8a\xbb\xf2(\x05*\x92\x0f5\x9a\x99\xba\xd7\x1c?^\xa6\xb2\x13s\xa2\xae\xa4D\xca\xado\x94\x8f6-\x1ej\x91^\xcd\x1c\x1d"\x8f\xf7\xc1\xa7\xbcG\xa8\xac\x00\xa3\xfa\xb6\xc9FA\xd8D\x8a\xc7,\xf0\x14#\xae\x8ck\xc8~o\x8b\xd4F\xc5\x03\x92\xaa)(\x81\xc3\x11&\x00\x82\xc7\xc0\x8d>\xf1\x82L\xc2\x869\x91\x90H\x9b|\x11\x95\xc9I\xff\xe8b\xdeZ)\x90.\xd4i\xaa\xde\x8ff\x946\xb1s\x00\xbd\x0c%q\x0e\xfc\xd8\xdc\xb3\xd3\x8a\x8d\x1aK]\xf0\xa0\xc9\xfe\xd4\xff\x12\x9a\xce\xb3\x1b`\xdc\xe5\xd3(\xa2\xe6\r\xa5d\x8a\xc2\x1c\xf0\xda\xbb:\x10\x1e\x85O!\\\x00\xdd\x19\x185\xdb\xfe\xcc\x12L2\xa8\x8b>\x1b\x12\xf3k\x94\x02\x9dx\xa4\x06<$\xbc9\x04\xfd\x1d\x8c\xe2\x07q;\x9c\xd0\x13K\x94K-@\xfce\x95\x05\x17P\xe8)\xf1\xcc\xfe\x981\x04\xb2+\xf8\xd2\xe1\xea]H\x9f\x0c\x10\x01\xdc1\xd2&,\x89]M\x85\xbe\x19\x7f\xd9\xc3)N1X:\xa2\xde.\xec\xaf\xa8\x9f\x19\xaa%\xb8\xa8\x1bk;\x19\xf3\x99\x80\xae\xc6\xc1\xd8\x17\xe4\t\x13[U\xc1\xb1\x06|\x1b\xeb\xccWv\xc6\xea{\xe1\xb2\x01g\xb7o,\xcdX\xbeJ\x86\x8a\x83I\xe4j\x941Th\xd9B\x19\xa9\xdf\xe1=19\\\xd2i\xc6)d\xf1k\xdf\xecq\xb2G4\xd9>M\xf2\xa26K\xf4\x7fm$i\n\x0c\xb6\xcbNJV\x17\xfca\x15`\xa0u\x1e\x9b\xca\xba\x16\x9e\xc0\xaf\xe4\x9a\xa0\xbd\xa3o\xb0\xda\x89\xe94\xca\xd9&\xe5\xcep\xe6|\x86a*\x8f\xb6\xf4\x15E\xb9\xfc\x93\xd1P\x02\x02W\xbd\xaa\xbcr@\xce\xd2\xfe<+$\x8f?|\x9b\x05\x03\xa4\xbeS\xc8\xd4u)f\xdd\x04\xe0\xb1\'\xbf\xea\xb1\x8e\xc4\xfa\xdcj3]\x1aW\x043\xde\x84W\xe1\x05\xf8/\x10\x8a\x10C\xc4\x9d\x16\xb3"\x9eF\xea\xe0*\xb7$\x10h\xc2\t9~\xee\x16C\xf7\xefl\xe1\xc0\xbc\xa0?c\xa6\x05T\xb4#\xbb\x8a\xde\x1d7\xc8\xb4p\xe1\x81`5~\x08X\xd2\xf3%\x0cI-`\x99`r\xe4\xa2\xf0\x04X\x91\xd3\xb1!\xa0R\xa8e\xcd_T\x93\x15\xc4\xf5\xfdKB-D;\xf4X\x7f#\x84\x19\xf8\x83\xee\x1d\x91\xbd\x93\x1d\xc1\xdb&\x84\xdb\x1b\x8eX\xc1\x98\xd6\xe3\\\xe6\x89\xa5~\xf9/7.E\xca\xf8\xdcg\xe4\xf4\xb9}\xd1\xc3l\x00\x843\x99\x83;>>\x81@\x96%\xbe3\xca{\xd9\x1a\\#\xb7\xc0\xe7\x88\x19\xaeU\xc5xR8\xc4\x89:\x88\x16\x17\xbfC=\x1d}%F4\x00\x82C\x81%_\x02\xce\x8c\xf1+gS\x1bsw\x1bX\x17^4{\xb2a\x08\x83\\\xe9\xb1\xd7+\x1b=3\x0b(\xc6V\xb5`\xd3a\xc1\x85\xc4t\xbeuM\xafT\xf6\xba\xb4\t\x93\xba\xe8\xbe\x8bT\x7f=\x88)\xb6\xac\x9d\xfd\xc9\xa9\x19\xd9\x1c\x98\x80\xec\x97\xc00\x8d\xf5\xe6\xa8\xa3\xdd\xf7C4\xf3\xf0\xf3\xafo\xb2\x10\xb3\x99\x84\x07T\xb49\x01\x8a\x13\x7f\x9d\x1c$\xa1\xb8\xd1\x1eI"#f\x9c\x12\x92dp\x8d\x8e3p\xa0\xbb\xca\xd9\xa3\xd2)\xebo\xf1Sh\x13\xe6\x8b\x94\x89\xf3\xf4\xca7{\x99\x8f<9\xc1;\x82y\xda\xa9\r\xa3\xaf\x96\x0f\x18\x19:>L\xf2\xafP\xa9\x9f\xc8\x8af({\x1e\xbc\xd9\x94\x86!@\x87\x01#oU\x93\x07\x07\x12\x03\xc5\x00\xf3e\xa9\xd2\x1c\x99\xef$l\x87\xdcPJ\xc0\x04\xc7\x1bM\x9e#\rop\xd7eM\nf\x9dbg8\x00\xc5\xc6d\xdf\xbe;\x08\xc1\xca\xa8\xcc\xd4>Q\x17\x91\xf30i\xb3\'\xfd\x15\xc9\x8b\xc97\x01\xb0!\xa2Z\x96\xf8\xa6\x06\x1e\x7f\x8bS\xc75 r\x94\xe7\x928\xeb\x04\x1b\xdb\r\x8cH\x10\xce\xd2\xb4o\xfd\xe2\xb0~s\xa8}\xda\n\x1a\x1f\x067\x938\xfc\x8e\xc5\nO\xd9\xd2\xa6\xb6\x04\x7fn\xe3GVG\x94\x13xY\xdb\xad\xd6\tlh\xbad"\xf8z\xf8\xc7H\xa6\xd8\x10p\xb1\xce\xd2\xb6M\xb9\xd7]\xdf\x01e\x88\x1c{L\xb3ru\xe7\xa5\xcdfr\xc0l\xdc<\x8a\xb6\x9b\xff\x07\xf7\xf4\xe8=\xbb\xe8\x16Q\x83\x9f\xe8\xff\x0ex\x1e\xcb\x8b\x14e\xec9\x91w\x98\x9b\xe9\xba\xef\x81(\xe7\xd2\xf9\xbc\x00\x1c\x1d\xf6\x11\xf2M\xb8\xa8HO8\xf4\x19\xa7A,\xfc\xc4\x05\x1b\x11\x84z\xb9Y\x1b\xc3\xed\x18\xe4x\xeb\xd0\x04D)X\xd5\xacr\x0b\xd2\xd2M\xd7\x9bN\xc1\x82L2\xe5"\x0e\xeb\xe6n\xe7\xb3\xd4\xaa\xcb\xd4\x87\x93\xd4+\x85\xd7\x08\xa7\xf3\xd1\x9a\x85\x93H\xe3\xd7\x88(\'6\x00\xb5\xc8\x00\xf9\x1d-\x8a\x82\x11\x89\x82\xac\xb3\xb0\x95\x9d\xa4\xfcus\x02\xc2dSe\x00\xd1~u\x7fZ\xacY\xd5\x83\xcf\xbb\xd8@&\xfao\xdb\xc1\'3\x8d\xcfEr_\xb4\x14hGX\xe8\xac\xc9\x96\xb3v~[\xa0U\xee\x89\x86I\xb1\t\xcf,\x84\x04\xff\xa6\xb0\xaf`\x0f\xf2O\x1d~\x8dn\xcb\xf6\x03\xff\xc8\xe4a\x07\xd6\x19`\x87\xcf\x87%\xdd\xd7\xe2/\xc5KS\xad5c\xc3I\xf2@\x84\x08\x0bi\x81\xc7\x1e]\x186\t\xc1\xc0\xb1\xb2u\x05\x03\xd6\xa6\xb3\xe5!\xec(&v\x8e,\xb7u\x98Tbl{\xf1-@\x8b\xfa\xb4\xf0\x93C\xf1\xe0\x03:\x9cX\xeep}o\xab<\x87\xc9\xd0\xee@\xf4\xc6Q\x8c\xa2\x93#\x02\x99\x164\x95\xc6\x14\xfe\xb2RB1\xb7N\xea\xf4\xcb\x8fa\xb6)\x91\xf6\xa0\xc5\xf1O,U\xee\xdbC\\\xda\x94\x0e\xcb\xaa\n\x9e\xdc\xa3\xf3\x85G\x90)6\x0014\x1eUEg\xa6\xa9%\xcd\x9b\x93\x02.S\x19\x16\xd2\xc4\xca-\xd3/\xa2\x9b\xe7R\xfc^;p|\t\xc4zwq\xe79\xd8Tr\xe6>\xcb\xc8\x91\xe7j\xc7\x00\x97\xa6Jh1\x0c\xb1\xc6i\x14\x00\x1c\xf4`%\xca3\x90KK?\x1b\x97\x1f\xedt\xfa@\x92 J`\x98:\'\xaeB/\x9f.\x8c\xea\xfeX\x85\x0f\xc8\xff\xbfE7{v\x94i\xa1\x8ct^\xfed\x91\x1bAe\x97\xe3dU[@(\x01GZ#\xf692F\x95!\xc6\xae\r\x90\n\xd3\x86}KiZ^\xcbJ\xa5\xbeK\xfeN\xd4\xc9\xebbvZ\x85\xc2\x11\x10\x99F7\xf2\x07z\x9a6=[\x10>\x03\x19\xd9\x0cbnP\x08\xf6C\xeb\x8c\x1c\x91&\xee\x11\x89\xb0j\xd5\xccm\x85)o\x05\xb2\r\xc0$a\xd9A\xe1[\xcd\xc0\x08S\xd2\xec\xd7K\x12\x00c\x16|\xba\xdf*\x89\xe8\xec\xd8\x0f2\xc7\x94+f\x03\xbdc\xa4*o6v\x8bN\xa6q\xcf\xa3\xcb(|\x8f\x05\x0e\xccT\xad\xc8 \r\x10uO\xdc\xce\xfc\xd9\x85]A:$\xd1\xb5.z%\xa2\xbaO\x1a\x98ZAV\xfe\xfe\xea\xf5 \xe6\xb3\x95\x8f\x13\xb1X<C\x80\x14\xfc\xe1\x84\x93\x7fg \x0ej.\xdb=\xab\xeeX\xa7\x94\xd2\xac\x8e4u\xc5\xf1zr\xd2\xf8q\xe4\x18\x06%\xaf}p\xe0=3\x15\x9e\x04\x1f\x82v\x1ak\xfa\xcc\xff\x80\xf5_\x1f\x9fi\x1c \x9aa\xffue\x07r\x1f\x1d\x16\xec\x89\x01\xf2S\xc7Q\x04\x88z\xb3o\xfb\x96C\x0b\x7fb\xb1\xa4\xb5F\xa1}O\xac\xd2\x10;\x8d\xc4\xdc\xef M\x85\x99\x850\x87\x93c;/*\x15\xbc\x06\x88$>\x86m\x13\xc8\x11I\x18\xa7jJ\xbc!\xc9\x06Gy\xc1\xde:(\x1b\xb9k=\xab\xb1%\x87D\xcd\xbc:\xbf\xc5\xe5$7\xfc\x11\xe8\xf8\x1dK\xfa.\x16\xf0\xebv\xa3k^\xd0\x1b\xed\xc1\x02\xdfj\xb2C4\xa1\x02\xfa\xf8\x95\x1d\x07\xc7\xac\x8a\xc6S\xc3\n\xaf\x11\xc9\x84\xf9\xb0\x01qBJ\xd1\xaa\xc5\x96\x11CS9"\x87\x92\xb6e\xb88qr\xa1\xaac\x0c\xe1\xa8\x05\x1c\x82B\x15\x81\xc7\xfa\xb6^Y@8g\xf4N-\xbc3_)\x08\x11<\xbd\xf8\x9c\xbb\x92\xc0F)4\xf3m\x9e\xeb\xd4<Am\xab\xf1/\xd8uU$o\x86|j\x97\xc3Vb\xa2\xe4L\x9f,\x1cq\xf0\x12ek\xa5|fJ\x08\xf1jRi<\xc4\xc7\x1a/\x82\xe2\xf3\x8b-v\xb7\xa1\xaf \xbbk1t\xbd^\x1b\xc7\xecD?7E\x8a\xa70T\'\x00\xd4\x85\\O\xea,\xdbJ\x1b.,\xf3=^\x96\x99~\xaa}\xc9\x07\xcc\xd2\xb0\x98\xe8\x16\xf4\xa5-\xe0\xcf\xd4\x986\x08/\xdb\xa4\xe2\x0e\xc2:\x91\x05\x95\x01\x1d\x8fe\x94\xd9\xb7\x91\x88\r\x17\xcc[\xe8!]\xd4\xaar\xc1\\AbY\x11Tp\xc7\xac\xb1~\x9e\xcd{\xb1\x07\xed\xe8[\x9d\xf9\n-&sL>3\x8fA\xa2\xa9\xf3\xe6\xe7-\xe9\xc7m.hn\xf7z\xe7I\xee\xbdL@\xa3\xad>\xff-RK\x1e6\xc3f\xad\xa1%KZ\xcb:d\x03d\xcb\xc0\xfb\x98\xd8r\n\xa8Yd"H\x0e\x0ck*K\xf3w\x99\xac/\xc2\xa0\x17\xe6\xecT\xa0\x1b\x1c\xa4X\x1f\x98\x87\x0b:\xfa\xbf\x19\xc0\x83U\x08(\xd5\xb1\x89\xaff\x9e\xf4\xa4T\xc1\xaa~o#\x1adM\x15U\xc9\xbaDO\x91\xb0(\xdb\xe3o&\x12J>\xc0\x8cg\xc9\r\xa0\xba\xc0eW\xc3\xef\x1c\x97\xdf\xa7\xe3\xa1Fx\xe61\xd93\x8dr\x9e\x1f\xab5{V\xd5\xcb;\x18c\xbd\x16\xdb\x07VD\xf5\x85\x87ODG\xf7\xca\xad\x984\x9e\xacq \xf9\xcb\xf8@\x10\xfe\x07\xd4\x81A\x03\xed*\x95\n\xf7h{ O\xc3L\xe5\xa5\xad;\x8eY\xd0\x96\x8bVi\xfeq\xbd\x17\xd7\xa3tv\xee\xf8\xd0\x80Y,\x1a_\xc7\x8e\xb5\x81\xd7\x91\xb9\x9d\x17\x0f^\x04D\x08Tug\xcbcF\x80\xd9\xae\x89\r\xd4\xec\x826\x81D\xb0\x8c\xb9v=/\xed\x848\x94\x18@:\x92\xe9N\xcdz\xf9\xa6_\t\x88b~\x14\xa1[\xadO\xc6\x81\xb1\x9f\x8e\x1d\xc5>\xd0\x10d\xfa\xc2\xda\xae\xfdm\xfal\x12e\xf6~$\xb9\xb1\x1e\xf9\x02F\xbed\xc7f\xa7\xc4\x10l\x98&Z\xe1\xefx\x88\x1a\x9c=6-#\xbb=\xec\xde\n\xd1$\x04\xe6\x04\xbb\x19\x05#}\x8f\x9e\x04\xb6x\xc2\xf2\xff\x83\xa5\x1b\xb8nB\xeb\x1ft\x8b\x82\xfd\xc28:\x12*\x1e\x8c\xb1u\xd6\xfe\x9f\x9c<\xa7R\xd2)U\x8c7m\xb5\x9b4\xdb\x81V\x81\xf4\xddhe\xcdW\x8b\xfc\x06\xf8\x93\x87\xf5\xc6Ba{\x88\x1a\xd4U\x8db%3eM\x86\xc8\xa2\xe4\x8f\xdcG\xce\x10o8dv\x8dC6r\xc1=4\xd1\x92]\xee\xd2XO}\xba\xc2p\xe5\x1f\xed\x96\x1f\xa8\x8c$\xed\x99\x9f\xf3w\xd1I\x8c@\x11\x10k\xdd\xb4L?\x02~\xc0\xf4\x8e\xde\x93\x8d,\x0b\xb1=\xb9\x0e\x10\x1d\xc4I\xec\x91\xa9\x88.\xfa\x84\xd9p\x98\xd77s"\xc36\xfc\x07[\xec\xbaw\xa6_\x186KoN<6t4\xa2t\x1cJ4.\xa5QK\xed\xfc\xa4J\xeac`\x81\xd3\x00\x1a-Y5\xfe6\xb6\xe0W\xe5\xc5\xf6/\xa3\xa7M\xe4\xf7\xd0{4\xba\x85\xeb\x1bn\x8b\x97\x7f6?\x84~\xe0\x04In\xd1F\x95ijj\x1eW\xd1 \xb1\xd8\xdb\x13\xf6\x05)h\x17\x0bSN\xd0\xd4l|1W\x9d\xa3m,\xd8\x89\xa9\x0c\xad\xa6`P\xef\xcc3\xcf\xb2\xa1\xe8~\xe1\x7f\xbd\xa2\xd6\xe8cJ\xacs\xd1\xdf\x11\xe6Pc\x02\xbd\x92f\x9b\x95\xc5\xa9\xc3\xce.\xd9e\xaeI\x94r\xdfI\x82\xd0\xe1\xdc@\xd0c\xd8S~\x19\x1b[\xfcQtJ\xe1\t\x86\x85?\xf6\xc1w\xd9Q\xfb\\\x1b\x06\xbd\xa9Ih\x05+LO\xa6\x8f\x082\xb1p\x1f\xb1\xf5\x8aF\xcc\x1f\xf9\x07\xbfG\xa6\xa8<8@\x9f\x92l\xbb8#\xd3U\xdfAf\x0f\x08\n\xfbf\xe2\xb0\xfc\x9fTbq\xeb\x05\xa0n\x967A\x99\xff\n\xf3\xd6#]6\xa0y\x84\xc80\xc9\xd9V?\xbf\xfao\x0bNK\xd5\xc9gB\xf4\xfa\xb3F|<>A\xb9\xcbHb\x06\xbe\xd6\x99b8\x97\x14\xa2\x9c\x12\xa5\xfdf\x9c\x06\x90\x01\x03\xcd\xde\x88\x93\xbb\xaak\x0c,\x06N\xaa\xdf\x90.\xff\xb5{=\x17(\x80\xc3\x9a!/\x96\x10CQ\x1e\xb7\xef\xb2}v\x0eV\xafR\xd4\xb7\xf3.!\xdd\xcb3\xafE\xee\xf46#\x1e\x11\xb11t\xcc[G\x81\xbf\xc2\xd2\x01?p\x87:\x0e\xc3\xbb\xce\x83B\xfc5\x90\x05\x9cVMc\xc3\xf6Ew4@\x84\x90\x9eob\x17\xa7\x19\xa8\xe1\xd5\x89\xa8\xa7\x08^\xda\xb8yi\xe29\xd8\xc3\xfec\xa1\xc9\xda\x83\x8e\x93\xcd\x1c\x06O\x9cb{\x84a\xb9y\x93\xaa0%b\xaag;\xb3\xd6\xbb\xb4(\xdbfG@/\x14\xc52\x93-\xde\xbe\x84]%@\xb7M\xf3\xce\xa6\x8597\xdb\xb5\xf6m\x05\x98\xa0\xfeo/\xb0\xeaZ\x83h\x03\xccTB\xce)\x0b\x90\xbf-\x87\xfeG$\x87\x94\x1c[\xf6,\x83\x952\xc6dx\x9as\xefK\xcb\x03\xd6\x9e\xcc\xa8\xf8A]\xb1\xfb\xc5\xbfV\xe6j\n\xe0eW\x88\x82\x92\xde\xff\x1b\xc9\x82`\x1f\xad\x7f\xd9 _2\xd6\xd6\x16\xed\xa4\xe2\xfb\xd2\xefm\x8ea\x91\xc1\x8d\xfeFz\xe6\tsO\xef\x83\x03\xeaW\x03w\xc6\xf3h\x07\x14\x88\xc9|8\xdbK\x1b\x81@\xf4\xc8W+.T\x1c\ta\xb4\x8bL\x81\xb0\x8b&\xedk\xdcX2*\x96Gr\x11\x8f\x16D\xa3~\xe7B4\x92P\x9a\xc4\xc0 \xfb\xf4\xc9\xaf\xc1\xe4U\xc3\xac"Z4\xc8\x1c V#;\x00\xc9!2\xe8PP1\x90\x83N\xcd\xbf\x83\xe9\x84V\xff\xd3\xae;+\xed,f\x0f)\xf0\x0b\x17\xdc\xdf\x13J\xf0E\xd1\x8fY\xa9\xcdZ\xdc\x01\xf0\x1a\t\t\xbd\\\xd0\x0c\x95Ecq\x06\xa7U31\xf1\xa4\n,\xf9\x80\xe9\xe9\x86\xe4\xdc\xc7\x04\x12V[\xdaw\x91\xc0W\xe1\x11\'\xd1\xb1\xec\x94t\x89W\xc73\x1d\x18\x82\x82yR\xacX\xd5\xd5\xd8\x82k\xbcDy\xb8\x14\xa8\xe1\xd9\xbeh\xb4\xf6\x80\xfc6_\xe6\xdeeL\x94\x86{\r*HWC]\xb8\xa1%\x9e\xafQ7\x93M\x84\x05OT`\xbe\x10%&\xa2K\x029\xfeI\xcew\xf0\xb01\xf6\x17i\x95\xb0\xb1\xbc;\x9a\xdb\xed\xd3Q\x08\x1d\x87\xa0\x8d\\\x04\xb5\x02\x85\xb4\x01\x8e\xf6Z\x19QD\'\x97a\x00\x0f\xd2\xa7\xc9\x99\xa8E\x12\xd7\n\x16\x0f\xcc\xce\x0cn\xd6\xb2\xceXx\x90\x0f1\xf3\xf1\x97\x9cf2w\x97\xf2_\x80m6i\x0c\xab\xbf\xcb\x85\xb3(\xd8\xe1\xc6\xc9\x8e\xc2gq\x1a\xaa\xe7\x90\xbf\xcb#a\xdc\xc8\xabO\x90)D\t\xca\x02mUr\x08\xbb\xceFg\xcb\x13\xfb\xf1\xd7\x86\xac\x1c\xd9`[\x123\xe4K\x9e\xff\x85\x89\x01\xca\x17\x88!rR\xee 7t\xd9\xe7\xd0(\xd9\x1e&\xffh\xe5\r4\xc2Wmo\x83]\xbe\x9cF\x07k\xb9_\x8c\x83,"=\xd8\xc9\xca\xa3\xd1\xe7\x0be\xb9P\xb7\x8f\xe4TU\xdd\xc6\xefW\xe3q`\xdf\x91\xe8w\xbf\xef)\xd1\xf3\xe7M\x93\x1b\xea8p\x1b\x9a<H\xa4\xf9^\x96\x8e\xf6y\x8b\xc3R\x90\x8c\xf5\xfe\xd3\x0e\x7f\x12\x05_\x14w\x80\n\xcfg\xf8\xf9d\xd2\xbf:a\n\xc5\xcfX{\xae\x1e^\x01p\x9c\xf5\xf7\xf1\xd8\x82|m\x97\x87[\x02\xab\xa5%\x10\xf655\xc6kU\xc7x:\xb0B\xeeA@&\xf6\x9f0}\xf8OFP\xa4b\xcd/xB\x93_\x80\x19\x08=\x06\xa7%\x98p\xb8\x03\x95w\x1b*ji%\x92\xb9g\xfd\xc1\xceX5iei\xac(k024[\x10a\xb7\xeb\xd42m9\xb5je\x1b\xc4fl\x1d\xf9\x07O\xb6\xa0\x1b\xf1u=\n\x14$\x82P\x9d\xaft<H\x9e#+B\x1b\xe7\x01\x8c\xaaR r\xe7\xc6\xe1\x82P?i\xd7\x1d`\xea\x8a\xc2\x0cnP\xbe\x8bY\xd1\x8fhW\xef\x12(\x87\xa3/\xa1\xba\xc2\xee{Ra\x81\x0e\xe17\t\\\')d\xbb;\xbaY\x08\xc0\xca\xdcu\x152;Yi\x8f}%\xfe\xe5\x1f5\xec\xf4!\x13\xfd\x16`y\x86fF\xb2\x90\xd0\x99\xf9\x10\xd3\x82\xd5H\x85\xf3x,0\r\xc4n\xad\xe7\xf6@\n\x1ds@\xfbA\xe7\x8a\xc7\x7fA\xb4\x94\xed~\xfei\xd2"\xb2g\x83\xfcW\x89\x06\xf0\xb3:w"\xa7\x8e \xf4Nh\xa3\x89\xa5q\xfc\xeb\xcan\xcf\xe7\xc0\xd4f\xac\xea\x05\xa7\x8c;X\xe8\t\xc2\x17\x0f\xcd\xe3\xf5G?\xff:\xd8\x03&4\xc4D\xc0\xaa>\x0c\xb3M\xb8^\x0cC\xec\xa2X\x06\xf1(UJ\x1bp\xc6 \xdaC\x8f\xcb\x8eq\x0b\x1b\x0c\x1a\xbb\xdeiw\xd515{u\xd5V\xe9\x97\xd1\xc1\xdb\x95\xa4\xbf\xc4|\xa0q@\xc8\xac$\x96\x8f\xdfF\xe62\x96\xe5{\x9dgis\x1a\xa6\xd6\xa3\x81N\xc7\xda\x8bL\x87\xbf\x13\x1a\xcd\x9f\xab\xdbjW\x06\xfd.\x12\x8b\x8d\xa8\x95Zc\xa3\x17Y\x03\x85\xcc_\xa2\x1e\x96\xcbq\x85\x98;\xe9\xd3\xb1\xa1\xc4\xfe\x06\x7fG\xce%\x0eo\x01\x8d\xbc\xf4c\xbb\xdfe\xf4\xebo\x16\xd4\xdbXE\xdf+R\x80\xf9\x1c\xecO\x11\xbd\xd8\xa8\xc4\xf1~R\x93\xeb\x99\xba\x15\xa2\xe9\r\xe8\xe2\x91\xb4\xa9\xb5\xfd\xfa\xc8\xf9\xd2l|RJH0\xc5\x07H\x07\xba-\x1c\xd0z\xf3\x9bi\x15-\xfd\xac\xa7\xbc\x87 \xe1\xe3\xeb\x19\xa4\xa1\xad\xee%\xa0\xcf1ezt\xb7\xb1\x16\x97u\r\xe1\xc5\xe3\x97\x13\xe5\xf6\x08\x88\\\xc2]\xa2\t\xd4\xac\xbfx7\xec\x83\xf5\x83\xfe\xd9V\x84\x86\x9e0\x180\x9dr\x97\xc6\xf2\xf2?<\x8c\xaa\xf3\x07\x16jcMo]V\xcd\x19\'\x8a\xd2\xf8i\x84\xb6\x1a0\xcf\xa2\x87Hi\xab\x93\x9b\xac\xc0cw\x98\x9c\xc3\xc9/i\xae\xb1\x82\t\xa0\x8f\xee\x8e\xeb^T\xb3\xcf\x1b\x03\xf0\xd5K\x8d\xeb}2\x80\xc5\x8a\x91,\x8b\xcd\xc93t\xf7*\xfc\x08\xf8G\x01\x8e$\x89}\xb6F?\x94y\x17\xd8\x869\xe3\xaf\x02\xae\xd9\x00\x0fl\xd0\\\xe9vC\x1f\x1d|\xb7\xae_nI\xd0\x9b\x19\xab\xb4\n\xeb\xc5*\xb3\xefk\xe0/\x1b\x9d3\xf2\x14\xfa\xdf(\xc9\xe1\x11Y\x86:\xf9\xbc\x0fJ<U\x05Hd\x93\x03\xb3\x83\xc1d\xa2\x12\'\xc1\xe8B\x8aq\xfa\xa8y\xe7\x9f\x1c>Or\xda\xcf\x1c6^\xe4\x04\x07\x82\xfb\xcb]`6;\xe7\xdfMBm\x91\x92\xec\xd0\xa3\xdd\xb1Cu`\xe1 \x8b\xdc\xc4\x1c\xe7\xf4\xb0\xef\xba\x9b\xc0%\x0c\xad\xbf\xae\\O7\x84\xf5\xb0\xcad\x7fq\xa0\xfa\xce\x18\x0c\\+\x96C\x9b\xd3B\xa7\xff\x84\x87\x04K\xaf?\xe1\xf6<\x92\xc5\xc8\x1d\x9eeMB\xa9\x1b\x05@ja\xd1GAC:)}\xa0Zb\x97Z\xa1\xb0\xa3Y#\xbbP\xd7C\xeaB\xd0\xfeyg\xed\xa3\xf5d\xc6\xe4\xff#K%\x9e#\xc1\xf2\xe7\x163\x04k\x12\xac\xe8\x16\xd4\nz\'c*\xa8\x19\xde@\xb8o7\xb4\xb1\xd3\x9c\x98\x9f\x00v\xbb.\x12\x1b\'\x92\x90Z\xc93M\xb1\xa7?\xc1;\x906\xe7\xba\xfb\x87|&\xc0\x8d\xfcw\x95\xcd\xd3\xad\xa6bDCn\xaa.Qn\x18\xa2H\xd7\xab\nF:N\x0c\x00\x96\xde\xa8\x92\x04\xdffw\x86\xf4\xd7\xf4\x08j\xcc\xc2\xc2\xfe\x85\x8c\xbd\\_\xea\xd2\x14\xc1\x0bk\x8epm\x8d+\x12\xce\xc3\xab\xa4A\x85\x923\x03\x84yT\xeb;\xba$\xde\xa5\xd95\xbanN\xbe\xe9\x16uU\xbe\x86\xa1\xca\xf4\xb7\xe9\x99\xda\x9dK,\xfc]\xa8\xcf\x94\xad\x8a\x80\x14\x01\x16U\x0e\xe7\xf4\xa3\x82zP\x1f\xbe\x19I@\x12\tN\xa2\x17\'\xe4\xfb\xe9\\&8\xb0(\xbd\xed@\xa0D\xaaw\xe3z8\xe1Sy\xadO\xbf\xb0g*\x04%f\xa2W\xb5L$\xf9\x8f\xf8\x0b)Q(gt\x87\x94{\x84l\xf5\xdb\x841\x1e?\xa5\x1bmv}\x8e\xdb\x06\xe6\xd7\x1d#\xe9\xa6j\xb7"oUQ\xd7\x8d\xf1o\xb8\xea\xd1\xfaJ\x0c\xd0l-9m\\\xba2\x13\xfb\x8fs\x9f-\xf3p\x11\xa4\xed\x9d\x11\xd0\xd8I\x93%j\xb0\x93\xd8\xb6x\xf8B\xb3\x94C\x1fr|%0\xa2\xcaV\xc4\x90\xfa\xd9c\xc4\x9b\xc1\xa8\xbf\xf2\xd6\xec\xb5t)$a\xf7\x9b\x1d]H!\xc5\xf8\xa3\xc4q3\xefZ\xb7\xdbT3\xa4\x94%\x1a\xd5\x8a\xae\xef\xa7\rd\xc7\x0f`\x19B"\xbc\x8bP\x9dL_/Fn\xd5\xee1\xaf\x82\xb5\xc9\xb2\x17\xaa3zW\xdbn\x03b:\xd1T\x96\xe3\x0cw=\x1c\x98\x92\xe9\xb9\xeai\x10\x07\x0fUv\xbb\t\xedH\'\x7f\x13^\x1b\xef\x96\x04\xa1\x0c\x98P1\xb4hZ\'\x1e\xde\x1c\xf1hHd*C\x82\xc6<9\xcbF!\xc1\xb4\n\xabf\x84\xdbj\x13\x9d\x9c\x1a\x9c\xea\x13\xec\xcf\xa6\xe2\xb8L\xf5\xdf\xdc\xb0\xeby\x10u\xa8\xaa\xa7\xbf\x87i\xb9\x8a\x9e\xbf\xd60\xfaBx\x86\x93\xba\xedl>V\x0c\xec\xe1\x1cv\xf52\xa9A<\xf0\xcdn\xe9\xbd\x8a\x17\xe9@uKijJ\xf1\xc3\x9a\xbc\xb81FN9\xddl\xc0\xf1\xda\x9c\x0b\xc4\xdf\xf2ch\xe7\xf7?i\x92\xffz.\xf5\xa3~\xdc$\x8e\x15oc\x0f\x10\xdf\xdc#Z\xb4\x16P\xe3K\xfc\xff$\xca!\xafor\x96\xc8\x10\xbe\x92\xb5=\x98&{(\xba\x1c\x98\xb9\x9f\x86\xf3I\xa1\x838m\t6-\x10\x94W\xaf}\xdbIwOD\xb3\xa4\xc0\xc5T\xcf\xdf\xf1\x94\x83K/\xe9@\xd6\x02\x91\xa5\x05[\\<N\x0b\xaf\xb3\xd6\x8a\x99]\xa8\xe4\xd9\x93_\xb5No\xad\x88a\x03hC\xe6\xa0!]8\xddfXv\xf2l\xf6A\x9eX% \xc2\xe4\xe6\xd1\xe1JI\xd0\xceo\xf5\x05\xd1\x1d\x14\xb3\x1d\xac\xe5\x91\xa5\xf6\x13\xe0\x9a\xa2\xa9b\xf3\xb8\x88\x82\xdda\x86B\x95\xc6\xb3\xd2\xa4\x8f\xbb\x17\x89b\x9c\x0c3i\x82\xa6\xc8\x18\x93\x99~Y<r\x9c4\x12\xdcA\x0fuU\x02\x89\xd4\rp\xa9\xfex,\x8a\xd0\x02$\xb8hYvV\xa2D\xbb<\xd9\x16\xb6O\xae\xb9E\x1e\xbc#\xcf?\xb4[bm%\xf1\x84O\xba\rV?\xc3\xe7P\xe6F\xffI\xce\x1f\x952Z"\x1dy\xecI]\x1c\xf9\x0c}\xc4cL\xf4\xb4[\xfb$x\x1c6\xd3\xfa\x18\x0b\xe0\xcc\'\x16r\xd3e\xef\xcd\xf3\x9e\xa0R\xf7\xcf\xfd /\xf5\xa9n1\x19\xa0\xaa\x9f\xca\xf3\xd2\xb0EpmC;c\xf3\xab@.\n=j\x97\xef\x01\x03\x12\xef-\x93\xee\xf1l\xd3\xdb\xe5t\xc5*\xa4\x84\x02=\xb3\xb83w\xf0\x8c\x82\xd9\xac\xcarV\xd2n\xe1\xe6s\\X\x8fRc\xe0\x08~\xfa,}%\xc9\x81(vw#$\xc1\x93tL\xfc)\x08\xdbo\xd3\xd8\xcb\xcf\xf3\xfe\xc0\t^tY\xaf.\xe7?\x0f\xf8\x81@\xa9\x89\x85K\xd9\xc0\x08\xef\x92\x83XW\xc3\xcfKW/\xe1\x8e\x98&\xa2\xfd\xd6K\xb7\x0brU\x1d)\x1b^u\xfe\xaf\x85?s&j\xb8p\xc3\xe4\xb5\xf5\x17\xc4\x1fp4\x01\xf9~\xed\xdf\x94c\xba\xe8\x8aQ\xc8\x0c\xa2gL\x8fh\x15/{$\t\xa2\xf2\xf3\xd5\xe2l~\xfc<sJ\x0eQ\xaf\xd6\x04\x8d^\x93\x9b\xdf\x9c\xc4\xad\xd2IP\x0c\xce\xe7\xe0 \xd0m\xc17D\x82k\xf6*\xba\x9a\x1a\x0b`;\xc10\xf7\x86\xb6\x1a\x9c0\xf0\x88O\x82C\x17\x90#\xc8\xcb\x06\x13\xc3\xbf.\xf8\xb1z\x15=\x16\xcf0\xad\n\x8cZ\xa6\xcd\x9bV((\x88v\x7f\x10G\x06(\x11n\x19\xb4\x1c\x98\xef\xe8[\x8b\x06\xeb\xa4\xdc\x89\xfd\x14LE\xb8\x02{%\xf5\xddU\x96\xb7t_\xc6\xa0\xab\x80\xbe\x9d\xcd\xd4\x03_\x95~J\xb0vy\xc3\x94_\xc8\xd5Z~\x10N\xa1Jm)Y\xca\x8b\x98\x99\xbfUL\x10*@9j\x997\x9dCu@\xf6\xb6\xa6\xda\xf2\xb4_\xe3\xd0\x99\x85hp\x81W\xbbaXG(km#\xa2\xa9I"\x81H\xd3\x846\x1d\x1e\n,\xe6\x04\xa7\xe3\xbbl\xad\x1b\xf0.39\xffpHZ\xa1bO"_\x12\xc4\xcb\xb5\xca\x1f\xdf\xdby\x96$\xef+\x86\xf0\xa5\xb2\x04a\xba\x1b\xfcj\xf2\x95i?\xf5L\x02\xf8\xe1\xd9k\xe0\xe3<\x8a6\xe4-Z\xb0\xe1&1\x8f\x8e\xf6\x08\xdfG\xc4D~}\x80u\x93h\x1cEc\xae>uUa\xe9s+C \xd3\x93)t\x88R\x9e\tU\xc5C\xd0\xfa\xa3l\xd7\x06sR\x10\r\xae\xa5N\x80\xb4\xdd\x88\xa2D\xda\tcJ\x08\x12\xf4\xa1\xf4\x11\xd2\xa9;Q\xfd\xac:T)l"\x96\xe9?\xbb\xad\xdd\x1bx\xf6\xde\xa3\xd0\x95\xebBr\xbd<\xb1\xef\xad\xa1\xb6\xfaK\x13D\r\xd2\x87E\xb5\x11I\xc0\x16\xfc\xb6\xfb\xd9%\'\xb1\xc3\xc9\x88\x93#\xb6\xb7\xebt\x08\xc1\xe9%\xa4yN&G\xc8\xcd\x18,@\xd3RFX\xbaz\x8f|\xcb\x91+\x0c\xb3Y\xa0\xbc&jn\xe6D\xac\x8fPR\xa2\x9e\xc1\xceP{N{\xcf\xb7\x8e\xe4\xec\x84\x01u\xbb4\xe7\r?\xc7\xbd\xa3S\x11#\x884\xf0d\xdb\x1e\x95~\xbc\x87\x98\xff\x9f\x95\xba\xec\xe3\xf3\x15\xf6\x18\x19-\xe6\xfd\xb8I\xf63\xe6\xb3\x02\xd2HJ\xcc\x16\xbb\\d\xf6R\xeaG\xa1M\x99\x88\x8e\xc2\xefi\xd4\xd6X\n\x92~Qv\xfd\xe0e\xe8\x1c\xabj\xe2\xd3?\x88\x1e)\xc0\xcf/9\x89\xc7\xdc\x12\xec_\xf3\xd7*\x9d\xfd\xaa/\xe8|\x07I\x126\xb0\xe0\x06\x1b0uD\x9a\x89,\xa3b\xe0S\xd1\x04\x9b\x0c\x91p\xdd\x0e\x01f\x8c>]\xef)!wE!\x07 C\xbb\xda\'\xfa{J`|"\xeb\xf7\x05\xc8x\x9b\'(\xd0X"\xa0\x87\x81\xca\xb8h"c\xa6}&\xc0\x94y\x0c\xa3\xb2\xb9\x8a\xdc\x9cf\x1c\xe4\xb1\xd1\x9f)\x08\x98\xe6\xd2\xf52k\x07\xd5\xdd\xb7_\xfd\xc6\x01\xc7cc\xe52\xe7H\xed\x939\xc7B\x84\xc30\x89a\xa7\x94\xa73\xfeY%h\x10\x8fe>=K\xab\\S7\xcf\xbf\x83\x7f9\xc5"\xc9\x9e\xe03\x19{Wd\t&t\xf0\xaf\x01\xd0*PA\x94mP\xeecu\xf9>\x11;\xb5j\xc6J\xac\xa6 \xf7\xdf\x0bk\xb3@{\x18{[\xdbr|\xd9U\x05j>!9\xc5\x07M=\xca\xbc\xea\x15\x9d\x90u\xa56s\xbc\x9a8\xcd\xbdk\xfb\x109\xbe7\xca\xc2\x93\x9c"!\xbe\x06-d\x9e3N\xa4\xf3\xbe(g\xd3\xf4"\x1d/;b\xf2F\xb6\xe7\x95*\xf9\x1e\x90\x18\x0c\x8co \x14o9*c\x05s\x81\x90\xf4\xfbaG\xcb\xde\xe4\x90\xd5\xae\xbc\x8al\xd4C0\x94\x1e\xdc\xf4&\x8d\x9f\xc0,\xa6P\xad\xf2\x85X\x11\x84)\xf4\xea\xc0\xd18\x82\x17\xa4Y\xe2\x08\np\x9e\x1eX\xf1\x7f\x1d\x9c\xa6\x0e9Y<\xe5ETp#\xd7\x05\xf0\x0f\xbd\x14\x00\xf1p\xfdi\xf6,\x1e\xc1\xd9\xb3\x1c\xd4\xda"h\xb7\x89Tp\x07\xe5\xeb\xe0%\x9b\x1e\xb2+\xc6\xdbV\xb3\xbc\xd5\x81\xf4\xcd(\x90\xbb}H\xa7A\xddu\xdc\xb4\xee\xd0\xccm$\x0f\x07\xfa\x9c\x9bf\xbf\xa9\x06:\xd50\n\xed6\x16K\xc4\x8en\x89\xf1\x0b\xeb\xac\x1f8\xc4(\x06\xd6K\xbb\x00a5x\xa2\x11\xa30\x11\xb1+\x8b\xb2zaL\xadP\x16D\x9a\x8f\xf3\xc5\x05\xba\xfc\x85n\\Pc<#R\xd3A\xb3,\x92<\xac\xedN\x12\x8c+\x144\x87^\x8c\xeb~/^\xee\xafpj\xf3m\x8eA\xa4A\x1a}\xffEj\xd3\xc7\xa9\xb2\xea\xba\xe1\xf0#\x93\x9c\xf0\x86w\xbf\xed\xdf:\xdc\x92\xb0\x8b\x06\xa8zb\xb8\x10\xe2\xea>\xbe,\xec\x83\x85\xa2\x95r\xbd\xa6A\x1fh-a\xb73\x86\x80!]\xd4\xa6\xd5Dd\xb7\x02\xf5\x05\xa7~\xe4\xe0\xbf\xdd]\xf9^\rpK\x03\xc9I\xa9\n:\x9e\xafSTO\x93\xe86\xd8\x1f\xad\xc6I\xf1\x03*\xf1\x1eZ9l\xe7\xdfB\xe9\x8db\x92[\xc6\x10\xb0\xcb\xe4EL\'t4,\xe3\xc5q\xb0v+\x84Z\xca?\xaf\x92\x90\n\xecS\xff]&\x10o\x10\x92F_\xa9\xbf\xdfBE\x1bW\r\xae\xad\xf7\\>\x1f\x12\xccG\x893\x178E\xfdu\xd0\x02\\V\xddo\x87\x11M/\x94\x83\xae\xd5\n\xd5\xd6=v\xf8\xb0\xe0z\x98\xf7\x97\x8f\x18w\x06\xe7\xec\xfe\x17\x16;\x0e\xca75d\x17\xaf\xa6\xef#=\xde\xb9\x85\xf3\xa7\xcauj_\xb5\xab\xa5j\xef\x17\x1e\xfa\xbb\xed2#\x0ej@[\xe5\x1b\x98*\t\xf9\xa4M\x11\xfb\x1c\xe1\xf7\x82\x1a\x8en_v\xae\xc2\xbeH\xb38\xde\xca\xae\xb4\xddj\xf5bu\x9e3$\xba\xb3\x9d9\x7f\x17\xe6|\x12\xf5\x87\xf2\x04\x8bE\xfbu\xa7pm\xa7i\xdc|\x03\xfc\xad\xacFK\xf1\xb0\xfb<u\xc4\xbe\x9d\xc54\xfa\xff\xea\xb8W\x03mP\xd41\xdb\x8a\xe3\x0f\xcb\xc7\x1c\xf7\xd2K\xc6\x03Ikn\x80\x000\x9ce\xf3s\x80,\x7f\xc6\x16\xdc\x89\x08\x1a\xb4\xa2\xff\x0c\xef\t)\xff\x16\x06.m\x92\x06\x1a\xc8\x9e\xe7>\xe2\xeb?tX\xef9>\x95[\x06,<n\x81\xbf\x0c\xb94\x86\x9e\x13\xee\x07\xf6\xcd\xba\xbd#\x9a\xbc\xb2\x85\x14\x95\xb6B\xe4X`\x0e\x9c\xd0H\x0ft\x1a=\xfa\xe5R\x96j\xd6s\xf3\xf4\x01 \xfe\x8e(\xad\xed\'Dn(C\xcb\x1b\xe9\xa9y\xd9\x93\x92\xe5\xa4>\xc0\xa2:\r\x9d\x15\xe0\\0\xa7(\x96\x82\xb0\x9d$6j\x1dM\xd5\x851l\xae\xb8\x0c\x1c\xa6\x9a\xbdPk\xd5ok\x8dB7\x9b\xbc\xee\xee\xce\xef\xd14\'@\xedEO\x07?\'\x1e\x98\'\x0b\t\xb5\xd7\xb8\xcfD\xa4/\xd6\xe1ht\xea\xadB\xcf\xf5\xdc\xc3\xc7F1En\xc8$\xdf\xb4nNJe\xccg\xe3\xb3\xb1')
|
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\n\x00o\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00b\r\x00\x00\x12\t\x04\x00\xd1\xf8\xacRr\xe3\x9d\xcb\x82^\xe0\x16\xcf\x0f\xc2P\x00\x00\x00\x00\x00\x00\x00\x008n\x168;\x17\x04\x93\x94\xfc\xaf\xe8+q\xfer\xe7\x08_\xd9k\xddW\xa3V\xe0\x17x\x85\xdfZ\x8f\xa3BP\x01\xd9\xb5\x18\x0e\xbc/-\xeb\x0e\xbfV\x93U\x0e/\xa7\xab\x8c\xc6\x94\r\x1fj\x820\xf6\xa2\x86wa0\x13\x1a\xf4y\x19&\xb9\xec\xa3\x19\x84\xd0\xca\x9d{\xb84\xe9\xbb\xe3{\x7f\x0c\x99/\xf7\xfdkb\xad\xae:\xf5/@4\xdb`\x11\x9a\xc8\xb3L\xed%\x8e\x979\xd6T\x069Rwx}\x8b^\xd0\xe3\xa3\xcb\x92\xaa\xe5\xa5\xc2]\xa9}X\x96\xeb|Z\x07\r\x95\xd5Op\xa1\xdd\xcb\xed\xe9\x1b\xefH\xdf\xa8(K\xb8iV\x83.$\xfatg7\x9a\\\xcb\xd6\xc9\xbd_!\x921\xae\x84\xe1)\xaa\xe5\xe1FP -V\xd68\xcfjV\x08\x97\xb0\xb1\xc0\\\xfcj\x9d>\x93\x0e,\xec\x9c?\x01\n\x1c\xcd\x19\x11\x04\xdc\xcf!\x97\x9c\xec\xae/T\x9f\xcd+smv\xb2\xf1\xca\x16\xef\x02\x90\r/\x0b\xa2\x1d\xe1\x89:\x8b\x8dZ\xee\x10\xcc6\x91\xbb\xb8\x86}\xeb\xd9\xbb\xb0\x1e\x9c\x7f\xc0\xcfU\xda\xe3]CT\xdb\xa9\xd3D\xe3\xf7.L\x82\x84\x98\x89\t\x9c \x9e\xe8R\xe6\x94fB\xfa\xf0\r!\x9cY\xf0>\xe5\x9b_\x0e\xb67`\x95\xb6b"\xc3Ox\xde\xde\xc24\x90\xae\x90r\xe2\x90P#\xae\xaa\xc1(\xa2V\xda\xec\xd2L\t\x95\xb3\xbb\xd1\xb0\xbekPS\xec\x8a5,f\xea\xde\xd1\xc6\x17\taX,\xd3r\x1d\xd0\x0c\x01x\xd3\x01\t}\'/\xc3H:\xef\xb6\xba\x8b\x11\xb8\x1d\xdd\x96\xd6\x14\x1d\'\x81i\xb0*\xb8\xb3M\xddP\xe7 \x9e;\x8cS\x08$\x9ay\xa3lY1&|\xcd\x91Y\xe7g\x0fi\xb8\xa60l\x8a\xb8yP\xf7\x99\n\x1bD0\r\xfa\x10A\xa6\x11X\xbe\xc0\xcbj\xd7\xce\xca~\xca2,\x98\x16N\xa9\x92\x90l!\x8f\xf5\x9c\x99#\nq\xab\xf0\xac\x19\xf1DEc\xef\x8c\xa1\x91A\x97 \xdd\xb7\x8c)\xbe~\xb9\xda\x92\xddU4\xaf\x94\xd2\x8b>(s\x9c\xdd\x88\xfa\xa7)\x81\xc3\xa1\xc9N\xf59J\x92\xc3\x89<\x89]\xbc@}\x94\xb0\xed\xf3\x99b\xbe\xab\x123\x9dkGVB0\x01;\xe1\xdeG\x0e\x07\xd25\xdbL\xe9\x85\x9fJ\xb0ng\x92?\xfd\x108\xdc\xa6\xb3\xc1\xaf\xa4r\xc9\xd8.b@+qI\xb0\xd8\xff!\xf6\xf2\xc5\xdc[\xc9\xa7\x08\xc7\xc6\xf2\xcf6\xb5\xa9nzrd\xef1\n\xa1j\xfa\x931\xc0\x0f\x9c^\xca\x93U\x939\x04\x1b\x11jo\x92\xf7@\x07\x98<\x15\xd1\xc66\x99\xd1\x17\x9c\xeb\xf2\xfa.q\x12\x9b3\x01-\xb3\xf7\xf0\x7f+\xdc\xe2\xe80\xd2i\x88\x9a\x1eZ\x016\xf7?\xe4\xcfA\x93\x89\x13 \xcaV\xb8\xcc\xff\xd2\x833;\xab:\xa8\xc7}\tg\xbc\x14\x01\xf4\xb3\xad\xf5\xb4\xb0_\x18\x9a\xff\xc2\xfawh\xc3\x84\xb9\x0f\x8a\xfc\xc77<\xe6\xc1\xe0\xc2.\x15Q\xed\x9bN\xd59\xb2}\xa0u\x1e\xcd_:),\x18\xee\r\xf6\x11\xdcc\xc0\xb4\x1f(,ws6c\x8c\x01\x03:D\xaa\t *\x19n\x1a5\xa6\n\xdb\x98gq\xfc\x1e\x82\xe7\x0c\xe1\xfd\xc9\xda\x11w03\xbdp(Q\xcb\x1f\xb4\xc9\x10\xffNm\xe8\x9e\xa2I\xe7D\xc72\xe8\xa3\xb7Yo\xe9\xbf\xa0!\xbcW\xf8\xdb\xc7\xce\xfd&\x0c"\xfa\x18+\x0c-MkC\xfa\n\xe8\xf6\xfe\xb0\x03y\xfb\x81\x9a\xd3\x15\x87{^\x83\xc5\xc4\x9f\xf7\x85\xd6\xe07\x1e\xf1\x0fZMP\x85\xf2\xf7>p\xb4Kys\x8c\xbb\xb9\xd6\xd0%hw\xe7Q\x80\xbc\xfa\xa4\xac&,z\xfe^\xef\xc4\xe6\xa7WV!\xfa\xc1\x8f\xf1\x9d\xe0\x9e\\\xcbT\xd9\x8dP7G\x04d\xcdLR\x8f&x+EV\xbd\xfb\xfd\x95\r#\xa0l9VZ7G\xeb\xcaL\xc7]\xac\xdb1\x1a7\x11\xf1;^\xa2CoO\xe6k\xbc\xc9\xc2\xe4^\xd6iE`?\xdb\xd5\xf9dl\xa3a\x954\xe9\xcc\x9c\xea\\\xf3L\x1f\xb6\x8b\xf9f\xf2\x9b\xdd\xe0\xb7(kV\xb2G, \xd3I\xb0\xde\x1a(\x96\xfa\x8cOc\xd7\x8d\x18\x14\x8f\x08\xec\xdd\xcd\x9d\xe4\x8bg\xab\xa6\xdbu\x14\x10\xa7\xbc\x90~\xd0OCM\x837p\xc0\x85I\x006\xc3&\x84\t\xb9g\xda\xfb\xd7P\xe6\xf3\x9er\xc9d\xa6\xb2k\x88\xe3\x91e\x18\x92MO\x829\'\x82k\x9eHl\xf0\xa5L\xc31\xba8CO\xf9\x82b=\xc4s\xd5\x88b\xf4\x15(\x18`H\xeeV\xd1~\x1e\x19\xcb\xed8\xfdBe\xa26\xec\x04#_k\x05d\xddp\x01\xce\'\x13\xff@\xfa\\\x19\xb1{\x89NsA\x06\x03\xa4.\x96?\xab\xd4\xc4\x8c\xa0\x9e\'\x1b\\0\x8b\x87\x9fE\xcc\xb6\x8c.\x08\xe4tQ\xbc\x15\xdcYn0\xe4\xa2Ij\xd9L]\x85\x11\x9f\xc8\x17\x86\xf9>\xd0\xe4\xcf\x86\x9a\xe7\xcff\xa1j\x9ad\xdc\xfa:\x98\x07R@\xb3\xc1\xa0\x9a\x8c\xb3\xcc\x03\xa1`\xd9\x18\xed\xb0\x00\x08\xbaq\x83n>*9\xd6K\x04k\xe7\x9fN\x13uQ\x0e)7Z]\xe5\xea\x85\xd1B\x1b3\xdc\xbd\'I\x16\xeb\xc1x\xa3\xf9\xe09\x93jA\xbe\xac\xffy\xf6Id\x9f\x19\xd2n\x1dQ\t\xcd\xc0B-\n\x98Pk\x1b\xb8!\x07i\xac\x1aN\xad\x7f\xd2\xb5K\xcen\xd1\xedW7\x05#\x12\x8f\xd9\xec\xaae\xdac\xa3\xe7\xc3kP^E\xb1\xb7F\x9e\x9b\x1cq!\xb3_\xd4eMl\x8d\x9eVhy&\x19\x15 \x8a\xc7x\xef(\xab\x97\t;u\xe3\x0c\xb21\x13\xda\t\x9d\x81\xbc\'\x949\xff\x16s\xe7rl\xeb\xa0\xeb\xb9\xe3d\x1d\x08\xee6V\x18}\xff\x9e\x1f\xf4\xa5u5\xaf\x9clK\xe6\x0b\xe0,\xadU{\xdf\xdf*{\x7f\xf2\xd12\xdf\x9e\x9f?\x9f{\xefM\x01\xd6\xe6\x99\x98 #\x9b\x06|\xf9\xedk\xe5\xa4[z\x96\x86\x8a\xbe\x94m\xc6\xf8\xee\x0b\x96W\xdb\xfam\xff\x87p<\xc3\x14\xd7\x96.\xac\xe5\xfeL\xcb\xbf\x00D\xd0\xaa\x18|_=\x91\xcaD\xfd\x80\xe0A-\xc7i\x9f\xaf\xc6\x8c1\xb4\xd2\xfbU\x8b\xb0\x95\x84\x92\x06\xb8\xb0p\xcf\x01\x9bBI\xdc]\x81\xb0\x94f_^]D\xf3"\x98\x91TU\x92\xceP=\x00^[!8h\xb7.^\xec\x90G\x977lg\nk<\n$\x12\x9ea\xba\x16\x9f@\xfbe$&u\xe1,\xcf\x0f}b\xc9\xf1AY\x1e\xbb1\xa62?Gj\xbc54A\x89\x00C\xa0\xd2Iw\x80\x1e\x00\nk\xe26J\xc4\xaa\xc2\x9c\xf8R\xe0\xb2\xecU*\x93@\xfc.5f\x00@S\xf9\x8eg!\xddHX\x99\xd6;=\x11\x11\xff\xad\x1a\x9c@\xaa\xbci\xb7\xfd\x8bQ_\xc7\x86[h\x1e\xedn\xab\xd4\xe3B\xaf\xe8_\xc9-7\x8c\x04+Yr\xc8\x83\x92&G\xdf\x05\xfc:\xa5\xbcL>\xa6\xb9\xe6\xb2\xab\xda\x8ed\x8e\x83\xa3\xd6\x9fj\x87D\xca\x81\xdf\x00\xea\x9a\xdf\x1bT\xa6\xd7\xe6^\x19]\xdb\xf07\x8b\xbfj:\xa0\xba\x05%\xe3D\xd6\xb8A\xd3\xeb&Te\xc4\x04V\xc3\x07\x85\xf3\xce[?\xff\x0b\xf9\xedA\xde\x01\x1b\x05\x0b\xd6\x14\xfaJ#\x8a\x08pOS\x90\xbe\xb5\xc1\x81Y;\xbeE/ \xb1&[\xee\xd7\x05\x1a \xe9\xa6i\xaf\x93\xc6&)\xf0j\xcc>6\xbc\x1b\x0fI\xb6:\x7f\x9d\xd4X\x91\xfa)\x1c\xbf-\xb8\x94\xb4\x14\xe8\xabC\xb2\xaePg\x1d\xb0\xb9\x04K\xe2\xf1\xe7W\x18\xef\x1e\xb6;\xb9\xf0\x82\xb0j<4TuN\xd5\xb1\xa4\x08\xf5\xee\xd2&LI\x90>\xa4n\x1cp\xb9\xcaJ\xedN\xb08\xbc\xae7\xfe-\xd1\xf4 \x93qR:\xac\xa7F\xe2\x8a\x9fu\xafU\xebr\x9er\x03I\x97\x8bk)[\x99UA\xb6\xc9\xa8\x8c;\xef\x98\x1b\xfa\xb2a\xaetsV\x05,\xfc\x83\xd5\x16\x1e\x18\x15\xe4\xc0\xf8\xa5a\tFh\xcd\x04\xc8\xd0#=\t\x92\xb8\xf4\xe9\xaa\x8f\xda\x06\xacb\x8a\x93\xe8\xeb!A \x1f\xbbw/\xf2R\x85\xecw(^\xcb\xe8\x15\x07\x16\xd9\xa2\xcbX2^h\x05taW\xd4\x88\x90a8\xeb&4\xbcn\r\xad\xba\x8eu_Y\xd3B\xa3\x91E1\x98\xb1\x93\xd7ZZ\xb9Aq\xbb\x85\xa7\x84b{c\xce\xc3\xd2K\x14$9\xa2\xb4\xc69\x06\xec\x9c\x96\xbdz\xe5\x08~\xaa\x9bv\xb7\xbe\x8f\x9e\x97\x97\xda\x07"c\r;\xa3m))\xe0\xf9#f\xef\xd5\x93"%C\x18O\xff\xf2"U\xd6ky\x160\xa7\xbaX\x0e~\xf9\x0e\x99\x1d\xcf\xa2\xb2\x98\xe9C\xad\xc7\x93\x07\x14\xf8\x87n\xcb\xe5\xe7\xfd\r\x95]hAc\xaa<5\x8eq\x04\x1b\xf0\xf1t>o\xadRW\xe2\x7fr\xe1\xf53\xc1L\xfe\x97NNq\xc5\x1cP\x1b\xc2\x94\x84\x15\xfa\xf4\x19\xfe\xe9\r\xce\xac\xe7\xca\x15\xbd\xcd\x02\x8a\xe8\x84\x0ec\x96PI@"\xf7\xdd\xd5\xeb\n\xd9\xe7\xcc\x0768\xd2\xd1\xbfs\x08(_\xf5\x00\xe7\x9d\xaf\x98\x8av^\xa1\x94\x82\r\xd9Bb\xda\x12\x01\x86Zo\xa1\xc3=S\xb9\x8c\xa0\xd0\'\'\xd8T\xf8\xa1\x9c\xfa\xf4\x9b\x15\xfd\xef\x01x\x8bw\xfb\x9au\xd4\xb5\xe3\xefRx"T\xed)243b[\x13D\xdd\xa4\x06\x98\x1c\x94\x06\x99\x17\x973.\x19\x10\x8f_\xf2H\xa2\x1a\x08mi\xe6\'\xbd`\x7f\x12k\xc4\xfe\xfd\x06\xcd\xa5f\xa0\x11\rC\x00\xad&\x1c\xcf\xed\x18J\x9e{W\x83.o2\xb4\xbd\x87\x93\x18\xb5\xe7\xc8e\x06`\x82$\x19Vy\xa21\xe5\xdd\x01\xc4\xd4\x9f=\x168[\x9d\xba\xfe#\x84\x8a\xc6\xbd2\xda\xe3^;\xc2\x9b\xcff-\xeb\xf6\x03]\xb3\x9bcA\xfa\x82\x88\xab\xe2 \xfeP\xab\xa1\x8c)m\xe0,\xd5j\xc8\xdbbT+\xd5\x9c\x14\xf1\xec\xa3\xd7\xde\x04S\\+\xea\x8a077\x08\xb2Q\xbc8\xb1=\xcd\xa1\xef\xad\xae%\xb9\xd8\xf8?,\x9c=\x9f\xf6Q:\n\x9bT\x8f\xf3}a\x90\x9c\x03h)*\xb8\x1c\xc9\x9f\n\x84[\x924Tt\t\xa03\xf7\xba\x8e\xeb``:\x83\x9dd\x91E`\xc2\xc6\x1e\x03\x1c\x89nn#\x97\r\xd3\xe0Vm\x150\xab9\x0f\xa3\x1b\x7fZ\xe7\xd1:\xe9\x1c\xf3\xd5<\x0e#:I\x93%\x08\xef\x17J\x96\xc9\xe7\xc1N\x93w\x83M\x1e!\xc8\xbc\x12\xc5MP(6\x08C}\x06\xccGW\xfb-\x14\xc1\xd64\x99\xddnt\xc8p\xde\xea\xe9\xc2.\x02\'\xd1=D\xc9\xc5y\xbeX\xd5\x95s)\xd2\x99\x13\xdb\x1f\xcf\xa8#\xb3\xf6a\x0f\x84\xf6\xbb\xd4\xef\xa0\x17f\xa2\xcb\xec:o 4M\xb0w\\\xa48|\xd1EdYN\xa1\x1f\x1aR\xd3\xb5\x9a\n\xc2e\xc3\xb0t\xad~w\x90\n\xcc\x06\xea\x83\xe2$\xbeR\x0c\xfe\xb24\xaf;\x96g\xa9A\xc5:\xf0r\x1c\x05\xd6\x95\x04\x16\xd3u\x08\xd9\x87`h\x9b\x94\xd4)\x14\x1e\xc0T\x15\xacB~\xc7\x0c\xdb7\x12\x04\x1a!c{\xc6\xe9\xd5=.\xa0\xaf\xf9\xc6\xed\x92~\x9b\x8f"\xc1\xc4<\x00\xf0\xbf\xe99\x08\xc6\xa2\x91V\xc5\xaa\x0b\xa90\xef%\xd6\x9b*\x03IjK\x11xq\xc6\xeaF\xd4O6\xa3\xc5\'\xa5\xb1\xe7\xcc\x0e\xc2\xad\xd7lp\xa8\xc0\x8al9PpX\xbb\xb2\xa8`\t\xbc>\xf83\xa7\xadl.jA\x95\x13\xca\x8c\x8e\xcaW\xe0\xa9\x82o\xf3fb\x15\x13\xda\xc6\x81\xca=\x05\xe5\r\xaewI\xd5\xe4\x1a<\xc5Pu\x9b\x13\xd1\xea\xd6l\x0e\xe4\xd4\x84\x12\x90\xff_\'\x8b\x01y\xd2/x&%\x0f\xe9q\xa6;*\xdbO\xb2\x12\x1c\x8c"j\x08\xf7G\xd4\xb8\x0e\x93\x8e\xfb\xd7\xb5aX\xe29\xb9\xb6s\xe7\xf1\xe1\xc4\xddI\xa3!\xcf\xe6B\xaa3\xfb\xe9J\xe0\'H\xaan\xdf\xdb\xb7\x007\xcf,\xd8\x14\x9fiq]S\x07\xec\xe8\t\xde\x90dl\xda\x02\xf7Hf\xde^\xbc\x88\xabA\x13\xec)\xd9\xfe\xe3\xc6\xff\xbd#\r\x9d\r\xf4\x9eD\x11gXT\xeb\x1e\xbe\x03z\xcc\x84\x06q\xc1N\xa6\xff%\xdf\xc6\xd6\xc0\xd5\x0e\x03\xdbnm\xd9`P\xfa\x8e|\xce\x96\x87}R\x8d\xfd\xbb\x04\xee\x89M\xcc2\x81\xd4.\x01\xf8\x86\xe2\x14\x04}_\xbd&\xd0W\xb5\x00^=\x19Z\xa2\xb8\xa3XWb\x01{\xfe\xc6\x1e\xc8q\xa1\xef\xad^a\xddW\xf4\x84\x8cy\xc0\xaaFC\xa1\xc6\xf3\xb7\xd6\x94\xe6\xa7v\x11*w\xff&!\xbf\x82s\xc1\xaa\xb4\x8b&\xd1K\xa7\t\xefLB\x01\xdc\x1b\xac\xdf\xa8}J\x88\xf0\xc4\x10\xc2h\xa2\x9f=<\xae\xc7\xe44\xc1\xb9\x7f8\x9d\xff^_\xe3\xa55B\x8f@\xbf{\x93\xfc\xef\x14\xa0\x90\x97\x1e\x7f\xca\x10\x18\x88\xea0U\xd4\x1d\xbc\xd2\x99\x7f\x08\xd6\xa5\xd2\x0c\xdam\xb0-\xa7N_^o$\xd2]\xe3\x81\x1aO\xc3\xcf\xaa\xef\rL\x1a\r<\xba\xe6\xd8\xc1+\xf5$\x1e!\xd4\xdd\xd1\x91\x93,\xa1L\x9e\xa7=\x15\xb0\xc4\xc2rj\x80\x0c\x10P\x9b\x92\x07\xe0\x93\xa0\x8cH\x7f\xc0G\xc8\x1f\xe3\x89[\x91\xfe\xb6\xb1\xd8\xedI\xc65\x92\xc1d\x84\x16\x9c\x11D\x01\x94\x0f+\xd4\xbf\xf1\x91@\xfa[*\xbby\xd9Z\xfd1\xa7\xc7H\xbbX\xec\x9b&&j\x8d\xf2\xf6x\n\xe5\x05\xd32\x91\xfd\xb5\xc3\xea\xe3\xc0Q\t]y<\x01\xa5\xfe\x08%\x1a\xd29\xf9L\xf4\xdd\xf0\xc4\xd1\xce\xdfD\xbaZ<)\x14\xf0Qb\x0fd&s\x94Z,\xd3\x95E\xc8\x0c\x85\x8c\x98\x8a\xa2\xcek\t\xb8\xd0o$\xd0]~\xd5\x84\xec\x1a\xf7\xb9Uq{\x12\xe2\x14\x91\x9d\xa1\xbf\xca\x9a\xe2\xfa\xcf\xcc\xd5\x91\xdbZV\xc0@%G\xed\xa4\x81,v\xa1B \x1a\x88im\xdd\x1daQ\xa1\x1d~\x976\n\xa5pz\x8e\xa0\xce\x80\x90\xd9\xfa"V\xe5~fI\x810\xb3\xd8(\x95\x8e4\xac\t\x1f\x9e\xa2\x99=\xac\x93L\xe6\xedZ\x00>\xc0')
|
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
|