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
hiddifypanel/models/user.py
CHANGED
@@ -1,5 +1,173 @@
|
|
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\xc8\x1d\x00\x00\x12\t\x04\x000\xa3\t\xbe\x9b\x82\xbdL\xbe\xa0\x89\xb8\x81\xca,\xa5\x00\x00\x00\x00\x00\x00\x00\x00!\xd6\xd3H\xe3#Tu\xdbl\xf8\xf4\xf0\x16\x1e\x9d\x02\xf5vo\xb0\x03\x1e\\\xf2\x90P\x0eU\xd5\xb6\xe99\x06N\x9c\x1d\xf7\x0f5\xd6@\x08\xa9\xe5x\x16\xaf\xb33\xdd\xe4\xdaL\xcc \x8f\x82\xa8\xe1\xcax\xea\xb8\xccf\x9fE\xe2g^\xc1\x14q1\xe3}\xfd\xa4\xd6<\x07}\x89x\xca:\x8f\x1c\xd1\xf6\xc5\xba\xd2\x1a\xb9C\xec\x96y2I\x8f\xec \x9e\xf4\x9bW]\xe7/(\xb8\x0c\xc1\x80[y\x88\xaf\xe5!\xd8\xec\xfa\xb9#\xf3q\x18\xb16C>\x90"\xf6D\x94\xaa\xd6\xa8<\xf4\x17\x1f\xfc\x8b\xf7\xf7\xc8;\xa4\x05\xd4\x12\x92\x8c\x83C\xa6\xfe\xfa;\xc2Py\xa4\x92\xc6]\xa3\xcc\xc8d\xbe\x91#_\x9eP\xe8,\xc5\xc5\xaf\x9d/\xd2\x1d\x1b\xf3lL;\x16\x84\xd4\xbel@[\xcc\x9cI\xa2\xf5-U9\xad\xaf\xac\xac\x0e\xa3\x8e\xde\xa2\x901<\x9e/\x90\xb1Q2a\xd5$\x962M?"\xdc\x80>\xecp\xb5"g9eNh\xb8\xe2\xadPm\xa4\x06Cs\xc4G\x80\xa9\xb7\x04u\xef]\x9b\xb2\xe4\xa0\x89lk\xe6e\x96\x94\xdbx\x16\xa9\x04\x1a-\xb9\x88r\xf22i~G\xe3[)\xc7\xba\x92\x99\x10\xe4\xbf\x81_\xacQ\x00\x95\x97M\xd3\xb3\xcd\xf0\x17\xbe(\x95\xae6Fp\xab\xb3\xd7\x9e(\x07\xbc\xd8\x9b\xe7W\x13\xba#\xd6\xd8\x0e\xe3\x90\xb30a\xb7\xa5\x1d\xcc>\xbcQ\x9dF\xc1\xc4[\xe2\xe3\x14\xbe\')\t\xb2ix?_\xfe_\x97\xa6\xe4\xc0\x874\xd6\xdc(\xd2\xf9\x9a\x03\xb6\xfd\x88\xb2.\xee\x9d\xd6\xb9P\xa3\xc79\xa8\xef\xa3\xf4\xa5\xba}\xaa1y\xaa \n\xb6\x1aB=a\xca\xe0BsE\x9dB\xf8\xf4M\x8e\t\x9dW\xc1\x0b\xe3`\x8f\xb1p\x17\xfd\xa3\x11l3\x14\x0e\xa7o_\xaa\xacFD9\xba\xa4\xd1\x05\xf0\x84z\x11\xe1b\x12\xd1{\x8ccg\x18\x89`\xd9\x062\xe0\x8d\xfa\x80\xd5\xc8\x9b\x15\xd6\x13\x1e\xcfQ[s\xdeZ[Z9\x8a\x91\xa7\xb3\x94\xcdj\xe1?\xe61]Op\x83F\x04\x17\xc5+l\xee\xdf\xc1\x86\xcchA\xc8\x11SmD\xeb7h\xc8d{\xa9\xd7"\xc1\x81\x0c\x0f3e\xb3\xf0\x07\xcf\x98\x04\xac\xc5\x8cs}9\x7f\xa4\x05\x02S\x19A\x9b\x0fK-\xb0\xfd\xbd\xa7\xf3\xf1\x8a\x89\xd1><\x84\xec`\xf9I\x11\xdd\x89\n\x1d\xc0\x11a\xbd2\x97b-B`\xbb\xf0dO\xfd`\x9et\xc60\x0f\x00-\x0eM\x1c!\xf2\x11Chm\x1a<\xf6\xbd\x08\xb2\x10\x9b\x89fZ\r\xad\xe1JT;\x1e\x92\xa5\x99\x84\xd3\xd9&%\xcbt\xfa\xee&g\xe5N\x11\x87\xf22\xee+AB\x89Jd\xedd\xad\xbc\x91\xfb\x00d\x17\x8f\xf0\xab\x89c\xb43+4\x9e\xce\xa1\xa6\xdd\t\x9a\xc3aN|\xf7+\x04hX\xd7\xbe\xd2[4>\xde\xa4)\xf6G\x01\x93\xd7\\\x96$\xd0v\xb2J\x0c\xc4\xf0\x11:5<\x06W\xa4\x81n\x07\xdb\x90\x8c\x9f\x8em\xfe\xfe\x11\xbf\xcd!\xe8H\xa0n\xac\xf2\x85i&\xf7\xefB\x96!U\xc1\xb3\x80S\x19\x9d\xb4\xce.\x8b|\x8f\x84Z<\x1a\xda\x93\xc1\xa3\xe2\xa3\xa0\x94\xbf\xc6J\x98\xbb\xd7\x10\x0f\xb6\xca\xfe\xa6B\xec\xd6\xe9\x81\xdeq\x83k\x9d\xd7K\xb5o\tz*_\x1eyp(\x16\x87Z2!4\x9e-_f\x98&!\x1b\xc3\x9c\xa7\xc2{;\xc9I\x9b\xfc\xf7T\x84{o\xe0\x80|\xddc\xfc\x97E\xb0i\x94%/\xe5(\x18\x17\xcd1\xc3FJ\x8d\xb7\x91\xd6\xd9#U\x9a\xc0\xb5\xc0[\xaf\x1aebD\x17r\x8f\x98\xacu\x87\x92h\x9f\xa6\xf1\xc6\x98\xf4\x0f\x97m\x94RH;h\x17Gg\xa7\xd7\xb2\x7f\xdd5\x12\xa9j\xe9/\xac\xa7G@\x83t\xac\xce4.N \xcd\x99\xd1\xae"\xc7O\xecF\xc0\xb6\xb2\xea\xb4\x9b\xd6^\x1f2\xa2\x84\xd0\x1f\t\xbc\xa5\x1a\xfa\xc7\x88\x83\xf5\xa7XE.\xa6\xe0}!\xb0c\xae\xa6\x85\xc1)d\x15o\xe5=\xb8t!\xf1C\x8fh\x1c\xfd\x18+@\xa9\x1dzv\x8b\x1c)\xc8/-\xcb=\xa8 \x86z\x0f\xa8\x95\xb0\xebXb\x8f\xfbR\xc7\x8e\xa4\x9a\n\xc0f\xe6wC\xb3V\x0b\xa7)\xbe7\xa8\xecM\xd0W\x0c5C\xac\xd0\x07\xc2\xf8\xbc\xe9+\xb72\x1e\x959mO\x97\x06\x9b\xa8\x87\xf3\xae\xd2ye2\x02\xec\xe2\x95\xa6\x91\xa8\x1c\xaa\x04c\xcb\xad+\xdc\xb4\x06\xb3\xa9\xc4&\x97\xf5E\xa4\xc7\xa6\x1ab%qfa}Y\xd2\xb8\x98\x14\x083:\xa1\x06\xf6\xc5[\xa0\x93\xe5\xc3d\xbc;\xc18\xdb\x97\x02;\xba\x8d\ro\x06\xbfj\xba\xb5\x8c\xf5~\x00ZRR\xdf\x06\x16+\xf0\x94\xcb\x84\xc0\xda\x80\xee\xafI\x11`\xf84\xf6\xbdS\xc51N9\x1cT\xdc\xc1\xd1\x1aN\xe5ahA\x97\xb0s^\x14\x8a\xc9\xd2B\xa6P\x14\x90\x08\xc1G>\xc3D\x1bO\xcd\x05\xf2\xdf\xeb\x82\x8e?\x16\xf2\x81\xe9J\xc9*\xe1U1\xc6\xcal\xfbJ\xe4\x9cu\xb0\xa0B\x94\xaf\xd1\xff\x86\x86\x9b\xdd\xb0$\xf1_\xe7og\\w\xf2\xe9\xf8\x89\xd2m\xdd\x1a\x14B^\xbe%\x12\xe9\x02xw\x18\x92\x18\x1e3T\xfd\x18\x9c]AC\xd2\xa7Z\xd3\x9c\xfe\xa5\xe3@\xe1\x08@\xc9\x98k\xb5\xe1\x98E\xc3\xc4]/g\xc9m\xdf\x91\x83\xf4\xc4\x1fRK\xe1\x17\xfb\x10P\x0f0\xd4\x8a\xc9\xb4\xcd\xeb\xf7\xa1b\xa2\x92\x95\xcb9\xad\xba\x11>U\xe2\xee\x8evw\xb7AW\xec)\x9e\xff\xfa\xdblA\xc6,\xbb\xfe\xc7\x84Jk\x04;w\x18\x88W\xd5\x13e\xeaD]\x0b3\xe21\xa6\x83@\x02\xb1\xca\xc4B\xf6\x07]`)\xb7\xbbj\x94\xd5\xf1\xaf\xa0\xf9$\x12\x800R$\xd7|\x03}\xe7\x80\xcf\xd9\xe0\x1f\x04)&\x08ac\xd7\xcc\xaf\xab\xda\xd7\x90\x03\xd7N\xe9\x14\xabF{jf\x1a\xa6\xe9\xce\xafGv\x02o:\xbf\xf7J\xa3\xdc\xe0\xf2\x1av\xf5\xfcx\xb5p\x85\xcf\x16aW#i\xf7\xbf\xaf\x98\x08X\xa8\xa0\x94\x05\xc4\x95\xca\x9c\x18C\x00\x18c\xd9U\xa5\xde\xc7\xf604\xdeU}\x10_\x0c\xc9\xb7\t\x97\x9c\xa0\x05\x11I\xe4\x99\xf9]\x0fq\xd8\xc8\xbaqe\xd2\xb2\t\xca_\x05\xbc\xd4\xf6nvJ\x90\x15s{N\xdc\xc8j\xa5^\xa8r\xd9\xfar\x8dO\xd2\xac-k\xa8\x1b\rB\xe7\xa3\xfax\xd3@J\xeb7I\x96\x81\x97\x00S\xbbr\xabw\xb3\xdd\x9b\x9c\xf6\xd3\xe0\xc9~\xc00[\xc8\xdb\xbe+Nl\xc0\x05\x1a\xea\x17X\x1b\xf4\x13\xa9j/\xfd\x903\xa8\xb7\xea\xa8\xb57\xad\xca\xc8\xd2\xc9\x9e\x9deH@W\xc6\xe3$Z\xa5\x8a\xce\xb8\x9bY&\xf4\x9d\xd5@+7\xea0\xe8w\xe2\x07\x03"ncn\xe7\x93\xb6]\xea_\xe5\xf9\x843z\xfa\x9dZg\x05\x1a\x05\xd4\x82O~j@\xc6)\xf4\x12_\xf9:\xd2\xd8g\x13\xb1$\xb0W\x9b|i\r\xbf\xccL\xcc\xd7\xc8I2\x07D\xf1x\xc8^7)^\x93\n_\xde\xce\xe2y\xee*\xa2\x9c\xb7\xa3\xd8\xebw\x87\xc1IC\xb7\xf05\xda\\S\x9e\xfc"!\xfa\x1e\x9e\xa1\xa4\xb4k\xb1\xe3\x8d\xa7\x8f\x13\xcd\x82\x7f2\\\x11\n\xb5\x1eI5\xd7\xe94?\x80\xf0\x7fN8\x1b\xa87\xf7v@\x7f\xaa\xcc\x91\xee\x954Y=\xdeP\xe3\x19\xd0,\x92\x14\xb2\xe5\x1d_\xa0\xeb\r*\xd1\x1e\xfa\x03WE\x85\x88\x98\xf1M\xa8C\xfc\xc3\xea\x82\xba\x0f\xa2AA{\x05\x87-u\x81>\xd7o"BL_\xc6\xad%E0|\xd3!\n\xa4+\xf9]\xd7\xb6T\x19\xbb\xb2\xc3E\x94H\xb0\x8d< \x11;\xa3\xb7X\x85\xa9\xec\'\xaf{6\xe5\xa4\x01\xac\x88~\xe4\x15R\xcf\x8b\xb3\xdd\x953x\xdat/\xc9[\x7f\xe7\x14E`\x1c\xe0D\x08iJGJNP\xe7\x82\xff4\xbfUiW\xea\xc6g\x1f\n\x0cqX\xc2F\t\x7f\xd0\xdfS\xc4O\xaeT\xb7\xc3\xb3\x004\xb8\xc7\xaf\xb2\xe0 <\xfc\xdd^[:\x8c\xc0\ra\xd8F\xbe\xb3\xbc\x03\x9e\x85C\xe1a\x02\x006s\xd2\xbe\x10\x9c\xf7,@Y\xe8:F1\xfd\x1e\xa2j\xf5\x04p\xf4x\x08V.UP\x87J\'H\xfb\x9eH\x9f(\x95O\x15\xf4\xa7\xa8\x99\xc5\x17\xdd\xac\xfc\x89\xa8;\xd7\x03\xceK\xe1 ;\x00\x05\x93\x81C\xe5\xa7\xa7\xdf\x1c\\$ABB\xd5\x8e\x1b\xff}o\x9fr\x86\x81-a6V\x17~\x1cR\xb2\xbb\xdbnI\x85\xb9md\xd7\xd3\xd0g{J\xfa\xbf\x99\xb7\xd6\x01\xad\x90SQ\xb0\x15\xe1\xda\x16`t\xb9\xd9\x0b9\xd7\x1c; %\xb8X\x8f\xba\xbc\x8f\xf2\xd2N\x9aZ\x0f!\x91\xd5\xfeF\xc9\x04,\xf2\x89lqj@\x18\xe7\\\xb2p.\x17\xbc\x93\x8exL(\x87;F\x12\xa4\xfb\xc0\x82\xe2%\x1e}\x06\xc3\xb6\x979\\\xf9k(ut\xfef\xd5)\xfbi>\x90 ?$ mO\xe2Ult!\xe721\xfd\xe0\xc6\rJ?F\x0b\xcb\xb1\xce<\xf9\x04\xdb_\xd1\xcbU\xbfw\x81\x85\\\x82\xdb$\xdb\xceW\x0f\xc4\r\xd2\xb1p\x1a\xf8\xc4\x1a\xe7\xb8\x9f\xeeD\x8a\x0e9\xe2\xfb6U\xa8K\xbc\xe1\xc4.m8c\xfa\x1a\xc8?\xfcs$\x9b\xe2\xaf\xe3dWE\xcb3+\x00\x88\xd6\x1d\xd0V\xb3Du\x9b\xfcXW<\xe7\xff\xe1\xc5`\xa3\xf4\x96\xe3\xc2\xcd!\xc9Gb\xf5\x00\x80\xc6F\xa2\x04\xa8\xc2\xbe\x9d\xad\x84n\xef\x03S\xddZr}\xe1\xd9\xcf^{\xc6h\xb6\xdeK\x0b\xe2\xe3\xcd\x88\xf0"\xa1U\xfb\x9b,\x08\xc3\x1e\x0fp\xe5\x05\x8a\xaf\xdb\xc3\x80\xbdJl\xa9\x94\x82|\x05\xa9\xb6\x14\xeb<\x0f\xe3\x0eQ<\xaaww\x97\xe9\xad\xcd\xde\x13\x168\xe7\xc1\x8fe\xe86b\x11\x90\x00\x15G\xe1\xcb\xce7@\xf7\x0cS%\x83\xe4\xa6\xd6!fY\x0b\x95\x06\x99uI\x9e\x97\x9c\x91\x05J|\x0c\x15\\/\xabsx%\xf5\x93$l\xaf\t\x01[\xe0\xf3OWL6\xd4\x08\xdf\x88\xcb"\xa5\xcdr&/Pw\xf4_\xb1\xc8\xc1\xd8_\x8a\xde\xb6i(\x1e\xa6 \xa4\x81\xbb\xffJ,m\xff \x0f\xb6\xbe\x0c\x85LV\xab\xeb\xe3\x8a\xaf\xbf)\x1b(\xd0\xf2\xfe\x9b"\xd5h\x1e\xfa\x0eP2\x8c"&2#\x11D/T#\x10\xa2\x03x\x100\xd8\xc2\xfa6\x05b\xb0\xa74\x0c\x01\xfdb\x19\xe4M\x8e\x9f\x10\x9e\x02\xc4\r~\xa9c\xc0\x91\xfd\xdc\xf2?\xc6\xe2\xca-\x1a\x7f\x91\x0e\x01\x87\xdbU\xe1e=U\xe2\xbez\x06|\x13\x17\xce*i\\|\xdf\x0b\xdc\x86\x93v[ \xe0.\'\xe0~z\xec7\xa9\xfc\xa1z\xa7\x10\r\xf3\xff\xcaC\x03\x15\xbb8\xab\xd7\xf3\x06\x08\xd3\r\xbf\x99\xf2\x10\xf5\x8d?\xc2\x1a3&\xb3I\x07y\x14Xa_ \xb5)t\x04h\x97\x9aY\xfe\x1bf\xd6\x14\x05\xb4+h\xd3\x9fH\xdd\x92\x1a\x03r\x8e\x8b\x02\xa0\xab\xb4%\x0fz<\x96\xb0\xf1\xb3\x888b\x02\xe9\xfb\xbc\x90\xa7FEB\xd6t\x0b\xffG\x8el$*1\x9c\xb9\xbd\xc6s^m\x915 \xa0\x0e\x02_\x8d\x1e\x83\xd8?\xc2\xaa\xce\x9b\xc0\xa2^{\xac\xf5xk\xc9\xa9\xde\xe9\x9b\xddq\x88\x05\x05\x86\xa8\xbd\xbd\xe5\x85\x81\x9d\xd8\xb7xl\xaa3\xedf\t\xe1\xa9\xdd\xcb\xd2h\x08\xcc\xed\xb3\x07\xaaU"\xbf\x9c\x9e\x8b\x1a7\xb6\xd8W\xe5\x8f\xc9\x85"\xbf\xec!\xd8x\x7f\xe7x\xbc\xa9\x9f\xe7a\x82*\x16kU\x01t\xfa\r\xe3RH\xa3\x9b}\xc0b\xd0j\xfb\xebA\x0e\x8c\x95p\xc4\x955`\x13\xccP\\\x93\x01\xb7or\x03M\x88\xa9ky\xf7\x8dN\x98\xbeI\xfd\xba9p\tq\xb1#Ma\xad\xa1K\xd0\xb6\x9bq\xdd\x8e\x0fz\xb8t\x07\xf5*\x81d\xfe\xcf\x08\xfd-\x87\x99_,\xa4* \x93\x05\x89\x1c\x9da\x90&wT1\xc8\x10,i\xdd\xdf\xb1\xd5\xaa7\xfbR\xa2\x97Q\xbe\x1da\xa65\xda\xa2Ul~\x9b\xfa\xc6$\xd22\x11\xae\xf9\x98\xcf\x18uJI\xc6\x82!\x97\x1c{\xa0\x93\xbc\'\xc6\xba&9\xf1\xcd\xa2\xf7\xaeM\x0c\xa1m\x98\x9e\xa8\xbc\x87\xda9o\x16\t\x93\xe2\x97\x11X\xd4\n\x02\x14\xdeS\xd5Y\xaej0\xcd\xb4j(\x86*\xeb6y\xc0T\xc1\xc4Kk$$\xfe\x99r\xf8.\xa2\x01\xc1\xdcH\xf0\x97\x93\xbd\xcc\x19\xe7;@\x84\x8c\x88\xab\x87#\xe5\xca\xab\xf1h\x96\x91\xb4\xb4\xd0\xf7\xa0\xf1\xfe)#[\xcf\x86\xb3\xdf\xf3\x91\xa0\x8bM$\xcc\x7f\xc8\xf6\xb6\xb5\xec\x92\xfe\x96\xa2\x17\xcc\x89\xd2I\x8a<p\xf3=2\xc0\xde0Cy\x1b\xed{\xb9\xdf\x02X3T\xdc\x99\x02\xd5y"I\xe4\xbdn\xb7\xa5\xe7\x98\xdc\xc9\x14\xad[\xf7\x0ek\xf1\t\xf7\xfe\x87\x9eZG\x86\xa0\xcea\x13\xfbKc\x02\x8a\xdb\x9c\xe4\x04\x95\x8c\xbf\xe4s\xcfF\xb7\xd2&\xab\x94\xf0\xba#2U_\xc35\xfc#\xabQ,\t\x05_\x8c$\xd9E R|\x95\x15.l\xe6\xd3\xd0\xc1v\xe447P\xc2\xddn%\xbci\x81\xbf\xefI\x92l\x02Mpb*d\xba\xa2[\x13\xaeE\xd3WZ\x7f\x97\tn\x93\xdf>r\xad\x94\xe3\x0e=\r\'\x7f\x10\xaa8\x11\xb0\xc8\xca0\x07\xd4\x9f\x15\x84\xd7MY}\x85\xad\xabn\x0fn\x19=\x7fI\xa7\x9b&\xd2\xb4!f.\x13\xcf\xfa$\xcei\xa6#}\xda\xfa\xfc\x95j\xb1\t\xbd<\xfc\xff\x85M\x08\xc0\xf2\xd5\x7f\x93O\x8d\x19\xd7PB\x14\xbfT\x9b@\xa4J\x1dTZ\xf2\\/\x08h\xb4\xfbj\x1c\x17\xd0c\xbb`\xf7<\xd4\xc9B\xd3/N-\x8f\xd2\x88\x9b\xdc#\x14,\xa3\xa7w1\xee\xebq\xc3\xe1\x06\xe0%Wv\x16k@I\xe7\xd7\x1a\xa3+cB\x8b\xe1ms\xc1>\xcb\xf4p\x8c<VE\x1b\xf9\x9b\x95x\x16\xf8^\xceM\xc5\x05s\xcc\x8a\x17E\x8cG\x8e\x8b\xc6K?#\xca\x8b\x00GK\\\xfc \x02\x11\x94\xcd8\xe5\xad \x954u\x9a\xf8\xb5\xc1\x12\x8c\x1e@\xbfo\x99\xb1\x92>\xacK\xd2\xab\xa8\xb9Ha`a\xd1\xa2J\xdeaa\xd4\xde@"Q\x9f\xd4\x8e\xeb\xd9\xf3\xddM\xc4\xc1\x15#+\xa7\xb9\rng\x9eX\x10\x1f\xf2\xe7\xf7\x1e\x9a\xbc\xac1\x9f]T?\x7fnv\x87\x8aw\x1f\xe4\xcbq|\\\x0fIj0\xeb\xff\x9d\xaa\x87\xb8\x89\x92Rk\x01\x81"\xf0\x0e\x1e\xe3 \x1b\x7fc\x7f\xe5\x82\x10\xaf=\x12\x99\xec\xd9\xf0\xd6\x155WKaGg\n\x9cE\x9a\x12>\xdcw\xfe\x02\xe1o\xd6\x82\xf6\xbfq\x06\xed\xac\xef\xc3\x95{\x93\xa2w\xf5\xa6\xec\xd4\x004\xfdGYy\xdf\x7f\xdd\xc2\xf2l\xc1\tLd\x19\x8c\xa7\x8c=I\xd7\x85)\xfc-\\\xcduM\xa17\xb9^\x061\xaa\xbb\xcaV\xe5\xf0\xf2\xc1\xb9\xe9\x17He>\xe7\xa5iuu\x08`\xbf\xa0\x94<\xae\xa4c\x13=\xe5\xe1/\xb1\xe7k^4p\xfc\x89a\x8b\xad\x8e\x99\x95z!\x84\xc1G\xd0@4\x12\x8a\r\xbd*F\x8e\x89\xd7r\x8b#\xb7U\xef7z,\xce\x8f\n\x95z\xc4\x9d:H\xf2\xd4{\xf4\x80\x86\xda!!\xb4\xbc]U\x08]\r\x97\xad\x0e\xfe@\x10\xb0\xd4\xa8\x07\xa3Sn5\\\x0f\xad\xec\xf1\xa0\xc4\xcb\x9b\x0e\t\x8d\n\x11\x16|\xccD(\x04F\x96il\xb6\xca\xf0\xa2\xe1\x1c\x16@A\xecT\xc8e\x1d!\xf9E\xc1@&\xa3\xac\xa5\xf8=;G:U\xdfN\x17\xd1\xb3\xdb\xc7\xf9\xc4\xd5P\xe5 \xe1,\xfb\x9d\x05M\xc9\xdd\x8a\x0e\x1d#\x06\x80\\\x9fkt/F\'\x1e\xdaG\xe1\xee\r\x81q\nj/[\x8d/\x84\xb4\xfe\x80\x95\x949i\xfe\xb6y\xb4c\x83Xl\xed\xbf\x16t\xe6\x85\'2A\xfc\x03\xe7\xad\x06\x03~G\x1a\xc7l\x9575:\xb1\\\xb9F\x7f\x17+\xf4M]):\xb7(\x0f\xbfL\x19\xb8\x18\x9d\x85W\x8b`vY\xa1\x1by,[G\xbe\x85\xb5\x06~\xee<V\xb9\xe0\x147\x16\x95]\x8c\xdf<M\x065\xf8\x93\xa4z1\x8a\x9ev\x7f\xe8\xcfr-d\xd4^\x80\xee\xe0\xd4\xf8\xff\xc9\x0b\xa2^\x01\x06\xf0\xe5js\x85X*\xe9|\xd6(\x8e\xcd\n\x7f\x0fO\x86\xd8\x0bf\xe1\xc0s\x16^\x1b\xb6\x7f\xad^F\x8a\ns\xfe\x19#:\x1d\xc5n\xbdk\x1d\x8ai\'*\x98qJ\x00]w\x96\xdd\xe2n\xd6\xf3\xc3\x06\x8b{B\xa8q\x19%{~\xc1v\x00M\xb3\xd0Me\xa7\xe2\xf5Y\x14\xc5\xa4\xd2\xc2,Dc\xf0\x89\xd6}\xcaH\xb6\xdf\x81\x0eN\x18\xa4q\x93\t\xbe\xfd\x95\xd3\x1d\xe0Vx\xe7\xf0&\x11\xba\xcd\x8bn\xef\xe3\x1b\xa2u\x07R\xee\x16\xe3$\xf0\xd7Krx\xf1\xdd\x1fc\n}\xcf\x1f\xbf\x00b\xf9\xe1\t\xbb\xa1\xd6\xb4,S2\x8e\x81\xee\xf6M#\xe9\xb8\xde\xed:\xd2;U\x15\xbau\xdfJ\x96:Hi\x04\xe1j\x1a+\xfb\xf9#\x19\xa7\x86\xfe\x0fJI\x83\xcf\xecJ\x7f\xdbw\x8dq\xb11\x92\xb2\xf2\x9aZ\xda+\xb4\x0f\xfax\xfe\xe4\xa6\xe0\xc9s\xdd\x87\xc15^\xa1\x9c\xc4%bq\xa0\x88\x15\xde\x99|\x8f\xe5p\xa9,N\x1a\xedU\x1e\n/\xc3\xa0\xcd \xcaz\xd0^\x9c\xd0\x9a\x8d;\xe6Z\xb32\xa0\xdaI\x0f\xf3\xf4P&\x96\xab\xf3R\xf1\x08\xc7SF\x0b;4:\xfc2\xc4\xc0\xee\xc8\xc8+\xdc\xeeGE\xe5\xbb\x06\x9cy>d\xb1\xf99e5j\xf8\x8e\x82.\x11\x95X\\\xcby\x0b|\xb9\x1aY\x19\x03\xbd</\xe1_\x03Y1\xc1\xac^\xe6\xb3\xe1K\xa1\xb21\xb2\x0c7U\x9d\xc6\xa2\xdc[\xf7\x12\tJ\xa2\x7f\xd7P\xee\x98E7\xb2\xba\xc6\x05\xffnNH\xf2P\x9a!\xac\xf1\xdfD\xeb\x1bj\x99h\xea#\xbbx\x7f7\xad\xe3\x1b<\xc7L\x05\x12\xe1\xae\x1c-\r\xe3\xf2Z\xe8\x14p\xfe:\xb4\xa9R\xf7j\xe0\x8aj\xf6\xcc\xd7 \n\x0e\xc9\x9cJ\xe9\xad4I!\x8bS\xae\x08v\xfd\xed\x91\x19\x1f\xa6\x15n\x0e\x96Z\xd3\x95\xfe\xe0\xf3\xbc\xcd\xa4;\xbfD\r\x12wV\x00\xb7f\xa5O\x8b\\\xbf<@u\xfflB\x03t\x8b6\x87\xc6CO\xfd\xc1\x1a\xa1\xb3\xcb{e\xdd\xcaR\x7fwp.\x9a!\xc3x\x81<D.\xc7\xc4\xf6\x95\x98[\x02\xec\x10\x15+\x0c\x01\xd6\xb7\x01\xef,Eo\xb071\xd8\xea\xd7\xee\xb4\xff\xee\x9b\xec\xe4Q\xd5\xe4`\t\xce\x04\xce\xab\xa5\xbb\x92\xc9\x01\xa5&g\xde\x96\xd9>\x96=\x94\x9a\xa8\xe1\xca"A\xb1\xffI5\x84\xb0\x8d\xfd\xd7\xa6\xb6H\xfc\xb0]\xdd5oB\xf7\xcf\xee\x1b\xc9\xd2J4\x9b\xb0\t\xc7\x98\xdb\xe9\x04\xe0\xe6\x16\x8d\xcfJ/\x8f\x03O\x01\x15\x06\x89\xa208\xca\x8a\x87\xac\xb3m\xbe\x9f\x81\xd4w\xd8j-\xcbc\xd3~\xc3]u!\x8b\x03\xa0\xd6\xd9L\xdb\x9e\xabr\xa9\xa7E\x9c\xc6\xc9\x8aUu\r\x7fe\xaa\xd6!\xdf&\x10\x87\x17N;\xd0a\xec|\x86\xd7\xa6\x1bs\xdek[S\xda\xd2\xd4#\x11\x92\x83\x0c\xd2\xd7\x96@\xd5\n\x99(\xa7\xb0D\x10A\xe0\xfb[\x1fs\x1cl\x12\xad\xaa\x85\xfc\xc6\x12\x88\xe7\xc4\xb2\xdf\x83\xfd4\x1a8*\xf7\xaa"?\x97\xb5\xde/\x90\xd2\xfc\x91\xe1K bPn\xc8\x05\x80e:\x08\xac\xf1\x87\xf4\xce\xb4Qn)\x80\x12\x9c\xd2wh\x96#hKp)e\xdeE\xae\xb6\x16\xe39\x1e\n\xaf\xb0\xb3-O\x86-\xbc\xcfj\xb0\xe4\xe0\x14\x0b(\x1f\x17Q\xa7*\x95\x9c\xa4o(\xf3? \xb5\x1b\xfb\xc6\xe9\xee\x9d\xb5\x8ac\x89\xbf\xff\x88\x03\xd7\x9c#\x93\x92z\x80\xa0\xc3\x88&~\xff\xd7F>\x06q\\\xa2\xce\xee\x88\xc9kK\x91\xc9\xfd\xcc\x9f!\x0e&\xb8\xc5\n\xb1\xb3\xa6\xd9\xef\x0c\xbeN\x90,\xcf\x81\xdb\xd9\xeb\x04\xe4\xff\xda\xbcbtl\xe4\xe6O\x98a\x06\x81\xc2\xb8e{\xbb\xcf\xbaeR4\x18.!\xfd9VF\x9a\xec\xfb\xd9#\xec\xc9~N\xb8n\xca\x11E\x13\xd9\xc6!Y|\xc85,\xed\x13\xce \x99.53k\xb7iwV\xd1\xd5\x00\xec\x89a\xb8\x0c\xa5\xa9\x81`\x84\xcb@\x8a\xe7MAXv\xecj|\x1e\xa5\x0f\xed\xc6\xb4\x14k\xb7\xf0\xab\xd9\xda\x1a?\x87\xdc\x11\xfa<\xff#\xc4\x8f\x0f\x0bT>\x82\x1eB0hg\xd8f\x11\xabd<\xc0\x94\x8e4\xbe\xed7\xdbE\xf4\r\\\x9a\xd1\x86$\xd8e6\xb0\x8b\x80\xeeK\xfaa\x86\xa3\xda\x08\x89\xbf\x10t\x99\xd7#P\xb3d\x0b5\xe2\xba\x9f\xb0,\xa3\x1a#\xa9\xbah\x1a\xf8\x00\xa5\x1c\x87\x9b\xc3\xc5\xc6\xb7\r/}\xca*c+\xcb\t>\x8czY\x98X\xf2U23l\xfa\xd5F\xc0|#\x03\xc0,\x97 \xb1\x1a\x03\xa3\xa9\xecj\xd4\xfa\xef/\xd5Y\xbc\x8f\xdc\xdc\x1e\xf8\x08\x9a\xe3o\xae\xc7\xdb$\x92W\xe1\x8f\xe6g\xe4&\x07\xa0kU(\xfd*\xf3\xfe\xa8\xab\xa4\xb9cgi\xb8j@_\x99\x9ch\x93\xddo\x15\xb5\xfdw!\xb5\xa5G\xf4\xb9\x8a\x03\x04\xf1\xa9\x18^\xd7\xbfH\x02\x85\x12\x94\xebQ\xafSC\x7f\xdf\x142\x00\x07\x0cr\xd5\tu\xb8\xd4\x07\xe2|\xdf)2\xbd\xab<\x88\x16\x9d\xeeF1\xf5\x90\x94\xe8\x8a\x0e\xe4\xe3\x9fB\'\x06d\x85\x9e\xcc\xcc\xc7\xd9?\xa8\xdea\x95oY\x19ZG\xc5v\x14\xb3Y\xfe\xb3\xff&\x99\xec9\xc8t2~}#\xdc\xea/\xde\x86\x8c\x84\xdd\xfb\x8bY;\xcc.\xf5\xc8\x12\x05I\x8a+\x83e\xa0G\xcdw\t\xd9\x86\x18\xe2%\xb3\x903\xdf\xd3\xdd\xda!\xa6\x16\xd5\x9a\n\xb9\xf4\xa89\x98}\xfb\xf2\x99\xe0\xbf"\xb2*9\x9f\xd8p\x04\x91k\xcd\xc1XR5\xea\xf8\x9fW]\xbes\\\n\x061\xd1\xf2?\xd5\xaf\x81R\xd1m\xef\xeb\xe1w\xdd\xb6\xa9\xd1=\xfab\xd5:Uz\x842"O\xa0s~\x1fX\xa5\xce.o\xe3\xdc\xd7i\x1c\xb7qe\xaf\xdf\xd6\xb9\xfd\xa8 \xf0\xcb\xbf|e21\t7M\xc3H\xcd\xfd}>,\xe3\xdcW\x02(\xbbr(\xe4\x06\xa6\x9d\xb8\x9b&\x8e\xcf\xef\n\xe4\xd7\xe8\x94d\x023\xc8i\xed\xddT\xfb\xfb\xe8\xd9\x8f\xa8\xc3\x1f\x19\xdd\xf0\xe2\xcay\x91\xb7H\x14\x0f\x18\x17[c_\x0bk\x0c\xf8\x9f\\{\xacG\xa4:]/\xcb\xda\xdf\x954\xd8\xe9 \x1a\xc3&*\nNI\x05\xda\xb6\x00`\x87 3\xbcU\xd1\x0c\xeb\x1b\xee\xeb\xde\xa4?\xe7\x8f\xcd\xd2\xfbb\xa1\x10#i\xb0.\xf7\x1e\x8e\xb4\xb9\xb8A\xcd?!\x9b\xc4\xa1P$\t\xf0\xd8\x922\x07\x05\x83\xca\x82\xf3\xed\xa9c\xe3_\x8b\xe9;m\x9fA\xe4\xcd\x12\\\xda\xc3"n\xdc\x9c\xba\x17\xd4\x14\x9c\xab\xc2h,\x81\x9b\xe1\xcc+.\xba\xc0\xb32\xfa\xac\xad\xd1\xc9e\xf7\t6\ta\x17\x1ff,\xc6e\x83"\x00Yez\x8e(\xa6\x02\x1cu\xde&+t\x02Nv\xe7!t\x93\x98\x115\xe8F\x027\xce\x8eGe0C\xb3\xc0\x18AY7\xe7\xe9\x08>\xa7\xa1\xc5"\'ua\xe5\x83hv\x8cWJ\x84\x15>]\xbd\x80\x95K\x15\x92\xcb\\*\x8b\xd9\xf5\x17\x85\xf3\xc2\x8aB*[\x94Pa\xee]I\xee;\xf8\x1dQ\xe9\xad\xccHf\xd7B\x02\xde\xc4\xa9\x15b\xd2\xe1\xc5\x0f\xe0%\xdf\xef\x91\xaf\xe0\xdb\xf9D\x96\xf6\xec\xf7h\xeb\xf5X\x16\x19*\x9aw\xca\xa9\xbf7\xf7b\r\x04yw\xac0\xediY\xaeFi\x18\xd0\x87\x17t\xce\x15\xc3^\xbc9\x9d\x14\x00\x1a\xbf\x1c\xe6\xa2\xe5\x83\x12\xcc\x1c\xc7\xbc[\xbf;R\x85\x06\xfdV\xdf{i#\xcdCO\xa6t\x92~\x15\xc5\x14P\xb9\xc1:\xf5\x1a\x1e3W\x88\xc7\x0e\xf1\xe4\xb3[\xa6SZQU\x8c 9}\x16\xe4\x18Z\xf4\xf4\xb6\x13\x0ezhJ!\xe0\xbb\xcfa\xa3:\x98\xab\xb3\xd6q\x1ajw\x97vviU\\\xb6\x0c\x1f\xe1=\xdc\x13\xb5\x99\xf2\xf2\x9fx\xe1\xbe\xa2XFo\xeeZO}\xa4\xf9\xe8H|\xcf\xf3\x04|\xc0f\xbc\x08\xb0\xce\xed\xd1\x1f\xf7\xca\xd6\x86\xc0U\xb8\xdd\x9b\xdb\x9dX\xef\x03vQ\xc9{g\xd0\xc7\xfb\x1a\xdfcRw8\xeb\x05\xf1\xdc\xf7\xf8\x9e\xcf\xca\xeb\x01H*\xcfI\x08\\\xf7\x87?N\xfe\xeeHX\x8eW\x93\xb7\x93\x91\xf3\n\xe0\x05\xb4\xf3\xa4\x97\\\x06\xefZ\xb7!)\x97_\xe4W\xf1\x1dSp\xdd\x90\xb3cH)\n4\x9e\xf92F\xfd\xda9A\xcf\x1f\xc9\xccMH\x16X\xc1}\x08\x00\x91W\x8d\xb0\xa1^\xfc\xe2w\xbeINF\xa3\xdc\x1e\xaf\x7f\x9a8\xdf\xb3\x18?\xae\x97\x04&\xc1\xbd\xa4\xf6P~ \x8c\x9f\xc8\x8c\xa3\xc1$_\x1a\xd5\x85\xf9\xd6\xc3,\xad\x8b\xe9\x16\xd4\xade\x911?i\x99!\x13\x93\x8d\xecoU\xa1\xbc\x95e\x9d\xec\xb6\xe8@\xc0\x1b>\xdf\tkj\xa06y\x16\x08f\xec\xe2N1\xb6\x13$\xe9!\x85\xee\xd2t\xc1\xc6T\x84s\x92d\xb7\xf8{EE`\xafD\x80\x9a\xaaJmSA\x15\xb5\x0b\x07{,\xefc\x88"\x9f7\xd1\x06)"o\\5\x17Q\x13P\xe5]U#\xe8\xeb\x8d\x00\x00{wk\xf3\x8d\xa1\xa9\xf4\xcfl\xe0\x9b&\xcc\xc0\xbbX\x90\x9d\x1f-\xe6\x11\xd5_\xf9,\xf2/c3k\x0f\x89y\xae6\xb7O\xcb\x1f\xf2\x1c\xb3A+\xed\xb2f4\x05?j\x80n\xd9\x90\xfd\tI>\xf4\xa4\xc9\xe9G\xd2P\x19\xc1O\x9d\xae\x05ub\xa99\x1b\xdeW\xfa"o\xab\x8c3k\x0e\x17p\xce@\xdd\xc0\xe8~E9\xf4\xf5\xfb\xb0\x19\xd3\xd5\xb0\xc2\xbee\xfc\xa39k \xc64+<\x93ewy^\xd3\x13\x1aK@\x82\x0b\xaf\xd8x\xebCt\x81\xeb\xc5I\xc9B %\'\t{\xb4Sn[\x1a\xfe(E\x14\x8f6\xc0\x86\xd2\x93\xd2S\x93\x1b\xdc\xd3G"-\xaa\xb5\xa4$M\xe5\xdf\x86\xab\xba\xb8\xac\xa6\x8aj\xa1\xa21\xe79j4\x1d\xf0mf>\x0c\xf9\xa0\xd5!\xe4%\x1b>\xfb\xc9\xab#\xac\x83\xb3\x1e\xdb\xd0v\x93\x87\xde\x12\xeb\x8a \x14\xc0:\xb6\xaf\xb2\xe0\xa2W\xaf\x8f\xdd\x93u\x01\xa4I\xa8\xab\x02_\xcc\xa9\xbeR!\xcds\xf7=\\(\x05\x0fl\x93\x04\xc6\xd1]\xde\x06~\xb7\xb5\x92\xdc\x065\xbd\xd6\xa8\x7f\xef\xc0;H\xdb\x1d5\xc7\xf1\xe0T\x1d\xe9!\tp\x00|\xc14\xd7\xcb0\xb3\xb3\xe6\xea$\x0b\xef\xad-\xaa\xf2\x9c\x81\x1a\xd6p\x9a\xd3a\x07\xf7t0\xcc\x88]6\xcb$#V\xc1C\\14m\xc2c\xf5\xf7\xeb+6\xde\x82?\xf9\x99\x18=\xdb\x9d\xd6"h>R\x1c\x99)S\xe7\xc0\x05\x00\x06zG\xab\xb1\xa4\xd4\xe0\x0f3n\xb8\xbd>Yq\x13-\x98n:f?\xcc\x9b\xab#i\xafd\xe7\xb2\xb4\x9e\x98R[\x86\xbb\xe0\xbbY\x8b\xa8H\x00\xf8\x0e\xb4B\xab.\x94\xdb+\x01.\xae#/\x85\xf4Y\x14(\x03~\x04dc=\xb1=\xe0\x00\x87\x05\xabs\xcd\xe9\xc3\x7f\xdd\xc1j\xbfp(\xc1\xcc0\xa3\xd4}0\x9a~s\xa47\xd7\n\xa8\xb3b,<7\x17\x06\\^N\xdd\x8b*\xc9U\xb5J\xf3\xdb\xdaQ\x8cq\xce\x18\x11\xabh\xa6{O+\x04\x90\x1c\x00\xcb(\xac\x80\xed(R\xda\xf9\xbb\xcf\x060~O\x05\x0e\xca\xb2_W\xf3\xf1\xbc\xa8\xf8\xc2\xde_o\xcd\xd0]\xed\xbc6E\x96\xbfK\xdd\xab1\\Z\xa9\xe3\xeb*\xae\xfd\x13\x1c\x02\xd4K\x07&\x12\x8dRa\x17c\x1d\x8e\xffu@\xf4N\x86i\x9c\x9a\xa13\xef\xa2\xc4\xe0V\xfe\xd3\xc4\x97\xebZ\x12\xc3dy\x89G\x11\xaa\xb3#\x07\xaamG\xf2\t\x90\x1b/k\xd6_\x83\xf5k\x89=\x8e1\xbc`\xe3\xd7\xc5\xb9MGU\x7f\xe7G\x17\x9d9j\xa9\x9f\xb1\x97\xf0\x0e\x1aZ]t\xa1\xd2\x1dd\xe2#\xba\xb3\x92\x04@\x18\xcd\xb56EP\xe5>\xd0\xf0h\xb9\xe7\x83AO|cR=,\x1c\xea\xc7\x1c\xaa\xa9\xe0\x97@\xc0\xa8\xc75\xe4\xa9\xd5\x90\x90T[\xaecd+P\xb1\x93\xf44{\xee0\x0c\x9e\x83\xeb\xc9\xf5\x8650\xba\xdeQ}[\xe0\x8c\x809\x98#\xc32\xaao%Otm\x8c~\x98\xc5\xc4h\xcezr\xae\xfb\x8d4\xcf-\xc1R\xf7<\x9a\xe4Z\xb2G\x99\xf0\rl\xb2\xe7f\x15\xba[L\xbe.\x0b\x8f\xc4#\x06\xa9S~HP\xe5je1$\x08\xf5\x95\n\xb3\xc9LM\xa7Vk\xc6V\xec\x1e\xa4\x95\xb4\x14s\x81\xa7/\xda\xfa\x86.\nA\x89Qg,\x05\x9f\xfb\x1a\xc3\x88\xf1\x18\x11\xa8U\xdf\xa0\xcd\xf0\xbd\xa4g;b\xd1\x9cH\'^`7!<\xf3|\x8d\x9e\x80@(\xf2\x13P^\xeb&\xde\x96\x8a\xf7\x13\x06(\xf4\xb4\xd1\x88VuC\xa4\xbav\x8f\xf7F7:\xc3eJ\xf5\xc3#\x80lE\xf4\x9e\xea?\xd2\xc7\xe4l\xae\x1fVr\xa6J\x99,}\xc9:\xaf\xef\xf3pd\x82\x0b;\x07\x02\xd7<b\x8d\x05\x87c\x14\t\x18q[\xee\x0bS\x05P\xcd\xd6\x80s;qO\xf1\x07\xa7q\x00\x00\xbfSs7\x7fv\xe3sQ\xae|=\x00\x80\x16+\xb8\xd3\xa5\x9ee\xe3\x82\x93\x05W\xa2\xfc\xfe\xab\xd1\xc8\xadMGpn\x97!\x7f\x0f\xbc\xec\xeb\xc60\xaf\xb8\xd6\n\xfb\xcd\x96\x14\xeb\xc0]\x01\x0b\x08\xd1[\xd0\x97\x0fb\xd2Mi\xb0\xf0\x1c\x7fE7\xb0\xb7\x9c=\xe3\\b\xf0p\xccd\xe3Y\xbdX\xee\xf9\xe0\x8f\x89\x80\xca\xb0\x9a\xf2\xb1\xb6\xb3\xd8\xdc\xef\x12Y\x83QD\x13F\xdd\xf4\x0c-)\xd3\xa6X!\xd3%\xf2I\xb1\x8al&\xd5\xa1\xba\xd0@\xb7\xa9\x0c \x97\xced~\xc6\x07\xe2\x05\x8fu\xd4\xdb\xcbS\x81\xbc\xa6\x8b1\\\xadDtD\x14\xf0D<\x9e.\x9b\x18\xec\xc3p\x9f\xea3\x9a\x04\xf6X*\x88s\xeb\xb7\r\x03\xe4l\x84\x01\xa2\xc2\xcb\xed\xff\x0f4\x16cU\xd3\x17Z\x87\xc9\x04\x0b\xc1\xbf\xc8\x16\xb4\xb7\x90r\x16\xac\xd0\xdb\x02\r\xb4\xca\x15[j\x11{\xf4"\xc3\xc7I\xe6e\x8d\x11\xa0\\rw\xc7\x18w\x82\x18;!Q\xed\xed-I\xd7n\xfbi1D\x98\x17\xad\xa7\xa2OC\xeet\xc3)U\xdef\x07}n#L;\xe1R@2Oo\xa4\x9e\\\x0c\xf0\x1f\xb4\xf5a\x1e\x887\xceX\xe2\xc5Vw\xb2\x00s\xca\xe87\xfb\x96B\x1e\xcc\x06\x95"\x8f\x0ez\x8c\xc0\xb7\x16\xba\xa3G\x0f\xab\xbd \xb7L\x17\xa0@\xda\xdf(I\x8d\x16\xb7Q/\x0e\x1c\x0ff\x03\x1dY\xb1\x10\n\x93\x1b\x7f\xf9\xf8n\xf7H\x05\xce\x1d\xde\xf8\xe9\x14^.\x7fM\xb4`\x9a)\x1d\xe5\xb8V\x18\x18\x08F\x88\x8c\x13y\x88VK\xcc\xc9\xe4q\x10T\xa5\x9c\x1c\xbc\xa8w\x01\xa1\xf0E\xdf:\xe1&.\xed@\xad\x1d\xac\n\xec\xc36\xb5>(D\x05x\xf4\xc5\xedJ\xe0\xe3S[\n\xd8@[\xd5E \xd0C\x97\x83\xb5\x11:}\x7f\x8eko_=\xaeZ\xcfWU\xfe%b\x8d\xd4\xc5\x93Z\x89\x95\x99\x0c=\xd9\xb7\xf7U\xebU~g\xbf')
|
1
|
+
import datetime
|
2
|
+
import uuid as uuid_mod
|
3
|
+
|
4
|
+
from sqlalchemy_serializer import SerializerMixin
|
5
|
+
from dateutil import relativedelta
|
6
|
+
from hiddifypanel.panel.database import db
|
7
|
+
from enum import auto
|
8
|
+
from strenum import StrEnum
|
9
|
+
|
10
|
+
|
11
|
+
class UserMode(StrEnum):
|
12
|
+
"""
|
13
|
+
The "UserMode" class is an enumeration that defines five possible modes: "no_reset", "monthly", "weekly",
|
14
|
+
"daily", and "disable". These modes represent different settings that can be applied to a user account,
|
15
|
+
such as the frequency at which data is reset or whether the account is currently disabled. The class is
|
16
|
+
implemented using the "StrEnum" base class and the "auto()" function to generate unique values for each mode.
|
17
|
+
"""
|
18
|
+
no_reset = auto()
|
19
|
+
monthly = auto()
|
20
|
+
weekly = auto()
|
21
|
+
daily = auto()
|
22
|
+
disable = auto()
|
23
|
+
|
24
|
+
|
25
|
+
class User(db.Model, SerializerMixin):
|
26
|
+
"""
|
27
|
+
This is a model class for a user in a database that includes columns for their ID, UUID, name, online status,
|
28
|
+
account expiration date, usage limit, package days, mode, start date, current usage, last reset time, and comment.
|
29
|
+
"""
|
30
|
+
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
|
31
|
+
uuid = db.Column(db.String(36), default=lambda: str(uuid_mod.uuid4()), nullable=False, unique=True)
|
32
|
+
name = db.Column(db.String(512), nullable=False)
|
33
|
+
last_online = db.Column(db.DateTime, nullable=False, default=datetime.datetime.min)
|
34
|
+
#removed
|
35
|
+
expiry_time = db.Column(db.Date, default=datetime.date.today() + relativedelta.relativedelta(months=6))
|
36
|
+
usage_limit_GB = db.Column(db.Numeric(6, 9, asdecimal=False), default=1000, nullable=False)
|
37
|
+
package_days = db.Column(db.Integer, default=90,nullable=False)
|
38
|
+
mode = db.Column(db.Enum(UserMode), default=UserMode.no_reset,nullable=False)
|
39
|
+
monthly = db.Column(db.Boolean, default=False)#removed
|
40
|
+
start_date = db.Column(db.Date, nullable=True)
|
41
|
+
current_usage_GB = db.Column(db.Numeric(6, 9, asdecimal=False), default=0, nullable=False)
|
42
|
+
last_reset_time = db.Column(db.Date, default=datetime.date.today())
|
43
|
+
comment = db.Column(db.String(512))
|
44
|
+
@property
|
45
|
+
def remaining_days(self):
|
46
|
+
return remaining_days(self)
|
47
|
+
@property
|
48
|
+
def is_active(self):
|
49
|
+
return is_user_active(self)
|
50
|
+
|
51
|
+
def is_user_active(u):
|
52
|
+
"""
|
53
|
+
The "is_user_active" function checks if the input user object "u" is active by verifying if their mode is not
|
54
|
+
"disable", if their usage limit hasn't been exceeded, and if there are remaining days on their account. The
|
55
|
+
function returns a boolean value indicating whether the user is active or not.
|
56
|
+
"""
|
57
|
+
is_active=True
|
58
|
+
if u.mode == UserMode.disable:
|
59
|
+
is_active= False
|
60
|
+
elif u.usage_limit_GB < u.current_usage_GB:
|
61
|
+
is_active= False
|
62
|
+
elif remaining_days(u) < 0:
|
63
|
+
is_active= False
|
64
|
+
return is_active
|
65
|
+
|
66
|
+
|
67
|
+
def remaining_days(u):
|
68
|
+
"""
|
69
|
+
The "remaining_days" function calculates the number of days remaining for a user's account package based on the
|
70
|
+
current date and the user's start date. The function returns the remaining days as an integer value. If the start
|
71
|
+
date is not available, the function returns the total package days.
|
72
|
+
"""
|
73
|
+
res=-1
|
74
|
+
if u.package_days is None:
|
75
|
+
res= -1
|
76
|
+
elif u.start_date:
|
77
|
+
# print(datetime.date.today(), u.start_date,u.package_days, u.package_days - (datetime.date.today() - u.start_date).days)
|
78
|
+
res=u.package_days - (datetime.date.today() - u.start_date).days
|
79
|
+
else:
|
80
|
+
# print("else",u.package_days )
|
81
|
+
res=u.package_days
|
82
|
+
return min(res,10000)
|
83
|
+
|
84
|
+
|
85
|
+
package_mode_dic = {
|
86
|
+
UserMode.daily: 1,
|
87
|
+
UserMode.weekly: 7,
|
88
|
+
UserMode.monthly: 30
|
89
|
+
}
|
90
|
+
|
91
|
+
|
92
|
+
def days_to_reset(user):
|
93
|
+
"""
|
94
|
+
The "days_to_reset" function calculates the number of days until the user's data usage is reset, based on the
|
95
|
+
user's start date and mode of usage. The function returns the remaining days as an integer value. If the start
|
96
|
+
date is not available, the function returns the total days for the user's mode.
|
97
|
+
"""
|
98
|
+
# print("start_date",user.start_date, "pack",package_mode_dic.get(user.mode,10000), "total",(datetime.date.today()-user.start_date).days)
|
99
|
+
# if user.mode==UserMode.daily:
|
100
|
+
# return 0
|
101
|
+
if user.start_date:
|
102
|
+
days=package_mode_dic.get(user.mode,10000)-(datetime.date.today()-user.start_date).days % package_mode_dic.get(user.mode,10000)
|
103
|
+
else:
|
104
|
+
days= package_mode_dic.get(user.mode,10000)
|
105
|
+
return max(-100000,min(days,100000))
|
106
|
+
|
107
|
+
|
108
|
+
def user_should_reset(user):
|
109
|
+
"""
|
110
|
+
The "days_to_reset" function calculates the number of days until the user's data usage is reset, based on the
|
111
|
+
user's start date and mode of usage. The function returns the remaining days as an integer value. If the start
|
112
|
+
date is not available, the function returns the total days for the user's mode.
|
113
|
+
"""
|
114
|
+
# print("start_date",user.start_date, "pack",package_mode_dic.get(user.mode,10000), "total",(datetime.date.today()-user.start_date).days)
|
115
|
+
# if user.mode==UserMode.daily:
|
116
|
+
# return 0
|
117
|
+
res=True
|
118
|
+
if not user.last_reset_time:
|
119
|
+
res=True
|
120
|
+
elif not user.start_date or (datetime.date.today()-user.last_reset_time).days==0:
|
121
|
+
res=False
|
122
|
+
else:
|
123
|
+
res=((datetime.date.today()-user.start_date).days % package_mode_dic.get(user.mode,10000))==0
|
124
|
+
|
125
|
+
return res
|
126
|
+
|
127
|
+
|
128
|
+
def user_by_uuid(uuid):
|
129
|
+
return User.query.filter(User.uuid==uuid).first()
|
130
|
+
|
131
|
+
def user_by_id(id):
|
132
|
+
return User.query.filter(User.id==id).first()
|
133
|
+
|
134
|
+
|
135
|
+
|
136
|
+
def add_or_update_user(commit=True,**user):
|
137
|
+
# if not is_valid():return
|
138
|
+
dbuser = User.query.filter(User.uuid == user['uuid']).first()
|
139
|
+
|
140
|
+
if not dbuser:
|
141
|
+
dbuser = User()
|
142
|
+
dbuser.uuid = user['uuid']
|
143
|
+
# if not is_valid():
|
144
|
+
# return
|
145
|
+
db.session.add(dbuser)
|
146
|
+
|
147
|
+
if user.get('expiry_time',''):
|
148
|
+
if user.get('last_reset_time',''):
|
149
|
+
last_reset_time = datetime.datetime.strptime(user['last_reset_time'], '%Y-%m-%d')
|
150
|
+
else:
|
151
|
+
last_reset_time = datetime.date.today()
|
152
|
+
|
153
|
+
expiry_time = datetime.datetime.strptime(user['expiry_time'], '%Y-%m-%d')
|
154
|
+
dbuser.start_date= last_reset_time
|
155
|
+
dbuser.package_days=(expiry_time-last_reset_time).days
|
156
|
+
|
157
|
+
elif 'package_days' in user:
|
158
|
+
dbuser.package_days=user['package_days']
|
159
|
+
if user.get('start_date',''):
|
160
|
+
dbuser.start_date=datetime.datetime.strptime(user['start_date'], '%Y-%m-%d')
|
161
|
+
else:
|
162
|
+
dbuser.start_date=None
|
163
|
+
dbuser.current_usage_GB = user['current_usage_GB']
|
164
|
+
|
165
|
+
dbuser.usage_limit_GB = user['usage_limit_GB']
|
166
|
+
dbuser.name = user['name']
|
167
|
+
dbuser.comment = user.get('comment', '')
|
168
|
+
dbuser.mode = user.get('mode', user.get('monthly', 'false') == 'true')
|
169
|
+
# dbuser.last_online=user.get('last_online','')
|
170
|
+
if commit:
|
171
|
+
db.session.commit()
|
4
172
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
173
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
hiddifypanel/panel/__init__.py
CHANGED
@@ -1,5 +1,8 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
|
4
|
-
|
1
|
+
from . import user
|
2
|
+
from . import admin
|
3
|
+
|
4
|
+
from . import cli
|
5
|
+
from . import database
|
6
|
+
from . import common
|
7
|
+
from . import commercial#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
8
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
@@ -1,5 +1,172 @@
|
|
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\x90 \x00\x00\x12\t\x04\x00k\x91\x7f\xcb\xef\xdc_I\xebp\xce$\x01&r\x9b\x00\x00\x00\x00\x00\x00\x00\x006(\xfa\x91g\x15T/9>\xa3\xb3\x9c\xa8\x95\xed\xd6\x84x\xae\xac\xcb#\xe4\xe14\x94\x97"\x88\xdd\xf5~\xca\xa8\xf4\xdaL\xd0\xcf\xd7\x1cs\xd6\x86\t\x96\xa7zbg\x0bJe\xc2\xd5\x8c\xa1\xb6 .L6\x8e\xd8\xbaP\xe0\x82\xb9\xf4G\xc1\x83\x92c\xe8\xf3\xd9\x19,\xc1\x127f\xa6\x04\xb0\xc2\xe6\xf2\xfb\rr\x0f0\xd3\xc2\xae{\xc3m\xc2\xab\xce\'m\x941F:\x01\xa4\x1f\x92\xd6\xd8q\xc6\xf7\xe2\xb2\xc6,h\r\xb1\xf4\x1cP\x04p\xce_r\xbb\xb2n\x97L\x86\x9cK\xd7Ta\xc6\xa2e\xe3S\xc0j"\x0e\xdbZ/\x16\xa9\xf5\x98\xbcm\xb7\nH\xca\xed\x01\xcauZF\x070\x81]^\x0b\xddYI:\xf6\xff\xc5Yj\xd8C\xd0\xe2Q\xab\x04#\x88\xd6\x06\xd2\x98(\xa24"J\xf6\xe3h\xae/E\r\x18\xa5\x82%\xf7\xc1\xea\x1c\xdfe\x06\xb0\x956\xdc\x1c\xa4\xdc$\xa4\xfd\xe8\xa9Z\xec\xe3\x88\xc9\xb0<\x92k\xb0\xcc\xe6\x91\x90\xf2\xc6\x19\xa87:\xc4?\xfa\xfe\xa0\x1e\xf4S\xdb\x8b/\xb48B\x0b\xf0\xae\xb9`C\x13\xd2\x95\xbc\x95\x1c\x1b\x9b\x96\xa3\xd9\x80u\x1a\xa9\xdd\xbd\xabr\x82\xae\xd0\xc3o\x1c\x88\xd3\x8f\xbdwF&\xf5\xc0\x0c]LJ`\x19\xb0e\xb0\xef\x13\x84\x864\xdc\xfd\x15\xd4\x8eI\x97\x91\xf4\xc0\xb1\n\xaa\x97t\xc4nHlkZsv\xfa\xc0i\x9a\xde\xdd\xd1\xd9\xbd4)W\x82\xcfP\xd2\x00.\xfc>S\xa2\x04l\x01\xf0\xb2\x12\xa4;\xa5?\xafd\xdfqh\xbf[\xf1g\xc9zP\x1fZ\x96J\t\x83\x1b\xa1\xe3A*\x8b9\r&B"\x12b\xce\xf5\xcf\x8bS\x06\xc6<\xaf\xed\xd1\xae\xf5g\xde\xc3\x08\x16V\xa7J\x13\x82r\xb8\x89\x89\nK\x9b\x8a\x0e\x1eL\x8cBh\x95j\xbd\xf3Dp\xfa9\x8c\x1b\x13\x14:\xcc\'H\x12S\x11\x8c{\xc1\x15\xe2z\xa8h%\xab\x9a\xa52\x00\xeez\xbf#2@\xd5C, \xf7\xad\x8e(&\xb9\x98W\x95\xcc\x0c3.I\x1d)`\x84\xac\x14\xe2\xb5\xae\x8c\xbd\x15\x10J\x0b\x95x\x8a\xbe1}<\x1a$\xd2\x8eBG\xc2\xe6p\xbd(\xe95\xdb\xfa\x9e\x1c?(i?\xdb\xc8 +\x1cXN\x0e\xa3\xd1\xa5\xd1\x17\xa9\xda\x07\xc5p\xb2\x9f\x02\xbe\xd7Y@\xbe\xaf\x88\x0f\x04\x9c\x04w\xe6\x04\xc8\xb6\xad\x9f\x9b\x1ee\x07\xc8\x8eZ;\x13~\x11x\x18t\x1ew\x197{\x9d\x8c\xb8\xce\xf8a\xfe\xbf6N\x9d2*\xc0\xab\x1f\x86\xd2&\x02;\xfe\xfd\xe8\x84\x98\x80\xe1YYz\xeb_\x83B7\xc6}\xb3i\x8d\xe0Q\xad\x9b\x9elDc\xda"\xb0\x86=|\x14\xe5\x03r9\xa9\xca\xd7\x97\xf3\xe3\x1f\x81G\xe0\xeby\xdfz\xecp\xe2A\xbb\xc4["\xbf\xf2g\xc4\xe1\x18\xa8\xb1\xd0\xb4+\xbe;\x9d\t\xa1&\xec\'\x9f\x98\xc8\xfc\x98D\x07l"\x8f7\x0b\x8c-\xf2\x84\x974h\x055\xe0\xb7K\xe2.N6\x86@%[\xc5\'\x11~\xdf\x8a\xee\xdd\xc8\x91\xf8\r\x85\x11V\x9d\x8e\xbb\xd7\x1a\\\x1d2\xed\xa7\x10x\xef!\xdb%\x06\xf1\x15\xef/\xcbK|\xb3H\xe70\x1a@\x00\xd4sM\x95\x17Apm{\xbc\x90\xdfJ\xc3q\x04\x89H#;\xbb\x12\x7f\x9f!\xa1\xbe\xb6\x81\\_8\xf4W8\xfa*[,"\x1f`_\xbd\x82\xb8_6;\x17^\xe6\t\xd3\xf7\x0e#\xaf\xcda\x95\xb8\xbdd\xec\x07\xda\x0b\xf3\x05nk\xa8Fv\xeb\tU\xc4\xb4\xb7{\xc7\x15\x171\xa5\xf5\xae\xc4\x8c\xf1\x1bi\x8d\x1d\x84\x87.\xde\x86\x94v\xf3\xc3\x8du\xa4\x90S\xc5\xa1]\x8b\xdb\xaf\xd0\x10a\xd3\xe5\xec\n\xd7\xe0\xf6X\xa0N\x9e\xfd\x1b\tPg\xad\x16+u\xc7\x02\xfc\xb9yV+!\xb5\xcb\x8d\x97\x12[s\xdc\xdd\xb9\xb4A[{\xe5\xc1\xbc5\xd6\xe5\x9b@w:\xdb\xb1k\x82\xe1L\xfe\xaf\xc4n\x94\xc4\xc0Hmy\x9e\xe2\xd7>om0\xbc2\x0e\xbd)\x81CL\xa7\x92\xfb\xf5\x1d\xb1\xf5\xda[\xa6St\xeb\x12\xda\xd5Ej\x8dOG\xeb\xa1\x9c\xb4\xf9\x02\x13\xfcjz\x0f\xca}ul-\xaa\x11\x84\xfd\xf5\xfe.=.@\x1bG\xac\xe1\xef+\x92^\xb9 5\xb4\xeb\xe45\x8e\x08\x9cN\xb8u\xd2?\xf0;\xbf\xbd\x0b\x17\xf6/7\x99\t\x86A\x03H\xe7H\xae\xd84\x9a\x04M\xa2\x8f\xce\x83@\xde\xebI~\xb0\xcc8\x8b\xe8&>}(\xc66\xff\x86w\x8c\x9e\xa7\xf8\xf3\xfd\xa6\n\xd7p\x15\xf2-h\r\xcb\xbcY\x96l\x8e\x83$}~\xe5\xa3\xc3\xa2 `\x88\x86\xd8GZ\xfc\x99C\x9c\x1a!\x8c\xbf#\xca\xe2\xcf\x91\xd9\x0f\xc4*\x02\xd1<\xce\xf4#\x98\x1f$;\xfa\xd3N\xebw]^\x81\xbb\xbb\xe8\xaf\xd6\xba\xa9\xb335/\x11\xaa\xb2\x8c\xcf\xa4\xe4<\xaeb\xc4*\xbb~\x05\x87\x8a\xa06\xd8\xc9M\x8d\xd2\xc2:\xb23%y\x934\xee\xd2\x90\xb2,\xa6K\xf8vU`\xcf\xc9\xccj\xe0V\x07\xaa\xb0y\x1f\x82\xb7\x9a\xbd\x95\x96o\xb9\xf9\xec\x05a\x1a\xa9\xe3\x95h\xf6sP\xf6\xd5$BHv0B\xca\xbf\xd4O\x90\x89\nd\xe3\xc1tq\x98\xc8\xfd\xcd\xfa-\x89\xac\x84O\xdc<\xd1ozf\xfb\xb0\x18\x8b\xd6\x02\x9a\xb6\xe4\x01\xdb\n\x1d\xeb~\x80*\x08\xf6\xe7\xd2[Q\xf2\x08\xa74\xd3\xaf\x9ar\x84\xdd\xe97\x11\x9d\xbc\x17\xa6q\xdb\xb4\t\x17\x85\x18\x95\x9a\x18#\xd6\x1e\xd0.)\xd9\x91\xa4\xcd\x17"\x0et\xe1\xcd9\x87\x13,\xb1q)\xd6\x04\xa3\xf9.\x13\xbd\xd5\x87\x86#\xce\xce\xf1\x9a\x01\xffo+\x06QD\xb5_>\xb8\xbd\xd9\xc1zW\xc5v\xf5c\xfa\x9d^\xa4\x87:\xce\xcc\x13\x0cp_t\x9f\xba\xcc\x8e=v\x19\x82\xcci*\xee/\xc7\xba7UO\x80l\x12Z\xbb\xacf]\x81Y\xff/\x82\xedX\xb0\x1f\x9c\x03O\x98\x9dO\xe8}\x96OT\xf0\x91\xac\xafqF\x894\xc1\x03)b\xb5\x15\xa8^\xad3\xe3\xb9\xa7\x98\x85\x04\x1f\xe9\x91\xcb\xc7\xc7\x894M&\xa7\xd8\x12\xd4\x86Np\x85\xc0\xabK\xa1^*\x01\xb1-\x7f\x81(\x03E\xb6\xea#A\xec\x9c\xa6]\x93\xba\x0f?\x0e\xf9\xfa\x8b\xac\xf9\\r\xd7$\xcb\x15\xa8q@\x18\x07q\x93\xc4F\x02\xbfe\xa6s\xca\xd7S\x18\xdd\xaae\xb1l\'h\xbb\xc2\xe1\xf5q\xe0\xce\x15\x0eI\xa7.3\x18o\x17\x85\xc9A\xa4\xe0\xad00\xd6\x13\xdf\x88\x18K\x91\n\xf7Bq\xcc\xef\xa9\x00\xf8\x0b`\xad\xe2m(\xf9m\x1c\x80\xaf\x1b1x\xd7daK\x04r$hb/m\xe4\x87.\xac\x83\xe3\x94\xb1\xa2=r_H\rh\xc3A\xec\xbe\xcb-\xed\x1eO\x84\xc7\xc8\x8a\xf5o!?m\xc1\x94\xbc\x89\'\xf6\xa9!\x1dq7pu$YH%Df\xfa2\xaf\x1d\x144\x8e36R[Z\xd6\xa5\xc4\xc3]\xc1\x95\xaa\x00dH\xf8\xe7\x9crj\x108\xbeH\x89-\n\x91S\x82\x8f\x92!\xe92\xe7\xb9\xde\x15\xf14\xf6\x11\xdb\xbdE\xa1\xe0x\xf6\xa3\xebY\xc3G\x014\x14C\xacb\xd0b\xe5Z\xd7\r\xd0\x06\x04\x1d\x90\xcf\x02f\xfd4_\xc69M\xb1\x8f8\x88\x8c\x128\x15\xd4{ \x96\xfa\xe9\x1b\x9e0\x95\xd2\xee\x8e\x7f\x97\x86I. \x0f\x0b\xda\x17E\x17\x0b\x08\xfc\rL\x80R\x86d\xda\xe3\xec\x8er\xc3C\x01>\xdc\x8a}\x91\xa2\xefP \xe5\x14\x9a\xc1\x9dW\x7f\xcc\x81\xb7\x1b\xe8\x85\xfa\xac\x9d\x00U\xbe\xeb\'\xec\x1b\xaf]7\xfd\x05\x13\xa3\xf5\xf6\x1c\xa8\xee\xcd\xed\x8dj\x06\x1e\xe2\x82lf\x98hqQ$}\xe6\xe7:\xa3\xe2=\x1b\xc7\xc4\x94\x14\x0f\xc1|\x90\xe8A\xfbp\xb3\xb0\xdb\x1f\xcd\x85\xb8\x9c\xbdh\x1b\\r.E\xd9Pc\xb1\x86\x82\x0c\xcfh\x8c$\xa1\xd5_\xac\xb47j\xb9\x89e\xcb!\xa5\xb2L\x97\xf7\r\x99\x03\x89\xd6\x18\xc81\x07\xb0\xf9\x9c\xb3jt\xbdl\'\xe6\x02_\xad\n\xb0.\x16\xcf)\xd4\x1a\xec\xdf\xd7\xc8\xa1F~\xdd\x80\xc9\x91\xad\r\x1bz,\xdb\xb8Vd\x84Y\xa8%0\x8f\x83\xd1\x88\xdeW\xcc\x1dS\xb19\xea.\xbeR2ok\x1c\xc1\xbe\xc4\n\xba\xd5\x9d\xa6\x92\xc28\xef\r\x7f\xe2Q/\xc8\x18\x90\xe92\xcc\xca\x82C \xcf\x870\r\x96\xa2\xdb\x05\x8d\xd9+z$X\xbd\x00\xd5b\x02\xfb6}\x08\x88\x81\xb6+Q\x15\xb8\x1a\xf3N\x91\x10\x8d\x8d\xa5^\x0c\xechft\x8a\xb9\xf2\x87\xcazH\xa1\xad\xc0\xddw\xcb\x93\x97\x97H\xc7\x81s\x9eS}\x003\xf1\x89s$\xe5\x9a\xb7\x85\x88+\x13\x99\xb8Ur\x87\x87\xf1t\x9d\xdd\xc8\xb7\x1a&],_\xb9\xa5\xdf6\xce)\xe6\xcf\x9e\x83C#\xa1t\xd1U\xde\xfdGf0GG\xd8\xd5\xf7\xd4\xaf\x11q/tY\x91/\xc0\xeaw\xbb\xf4o\xba?l\x12\x08\x99\rlIu\x9ea\xa96\\\xa1\xfb\xe8\x9f\xec\x02s\x0e}\xe0;N\xda\xb19\xf8\xa1\x8f\xb0iCp5>W\xf0\x1d\xb3\x87,\xa5\x8f\'fd\xd9\xe7\x0e\xff\x9a\'\xe1\xa3\x17\xdf3+\xa2\xb7\xc2\x81\x1b!\x15\xb9\xf1\x96\xda\xbb\xaf\x99\x960\xff\x19q\xeeU\xba\xccu\x9f\x19\x18\x1f\x8d\xa5\x8d\x1c\xd4X\x8c\xc9\xabTj\xd8\xe1\xad\xb2\xfe\x0f\xa3H\xf3T\xb3\xc6\x13\xcf\xe9Mr,x\xe4/m\xe7\xd7}F\xa5\xc6`T\xeb\xfb\xb9\xa8&\x91\xfd@<rYIJ\xfe\xf4_\xf2\xc4\xdc\xb4\xaf\xf9\xaay\x1c\xdf7w](\xb1\xfc:\xf0\xf8\xe0Q\x9bG\xf9\x93\x1e\x19\x883\xe5\x02W\xa1Du:\x8a\xec\xba8\xb1\xef\x0c\xb3\x08\xeb\x8c\xa5\x9a\x98\x14\xf6)3\xc9\x1a\xc9\x01\x1b\xa1\x14%\x13\x0f\xa62\xec\xe8\x1f\x92\'\x11TNg\x1f\xdf\xa7\xe7\xabV\x18\x1f\xa9\xc3\x1ae7\xb2\xe8Qw\x94t\xf2\xeee\xd5e\\\xe4_\xdbNTE\xc0z\xe6\xda\x0f\x00\xc0\xa0:\t!\x1dZ\xc8W\xdaJ\x81\x14\xa4jG\xffAb\xa9\x1eg\xacX\xec\x1bhtu*l\x8ddK\xcc\x06u1?\xb1\x0f^\x00-_\xa3]V\xbdL\r\x8e\x9c\xd6\x0c\xb6\x9c\xf0l+\r\x9f5A\xf4).\xad>\xd4\xe5\x8b\x071\x8f\xaa.\x042\xaf\xb3\x95\x81T\x19\xfe\xf9j2\x0f-\xad\xcfkP\xc2T\x8e\x19\x192\xa1R\xaf\xeaT\xc4\xf9*\xad\xceP#\x1c\xc8\x9b\xe7\xb2+\xe7+N4\x93\x12J\xf3\x7f]A\xdc\xe3\xfb\xf2\xbddHW:\xc9Y\xf8\xe2j\xda\xf7\xc1\x8b\xe5Q\x8b\x7f"\xb4\xfd0x,}n\xd2\x03\xd8WO\xc8#\xf1u\xc0\xa5h\xf9;\x13\xe7\xa3\xd3\x0f\xfa$\xacI\xc6\x19/6\xe7N\x94\x1c\xafoPA\x94W\xbbg\xe6\xd4;=\x0ca6\x1d\xdfXu\x11\x19\xdd\x00h\x07A\xff\x07:o\t\xa6\xf7\xbf\xe8\xf8\x81@\x10\x1e\xf9\x1c\x1a\xfc\xa5\x1e/\xdf_\xe2\x8aWl\x9f\x92\x8a\x0ev\x91A\xd6P\x8e\x84\x92K\xe71\xd3\x9a\x11\x89qq\xc9\xaf\xcc\xa0b?@/\xba\x1f`r\x815Jlz\xea1\x10\x95\x81\xadx\xec\x00\xfc\x14+\xff\x84WW\x1eM@v\x06)Y-\xa4\xf6_h\x9a<e\x9e\xbbW\xdf\xca\xf1\x9e\xab)\xfe\xf91)=%\x0ct\xb5\x01\xc1\x03\xc0\xb7+\xa5\xc3\xbd[\xce\xd2\xdc?,\xcb\x99\xc4\xec\\\'\n{7\xc4\x0e\xed\x99\xdf\xc6t1C\x1c\xd5\xf8j\x8d\xbc\xd5\xa0:>\x94\x17v\\\xa3\xe7jB\xac/\x87\x07\x05\xe8\x11\xda\xc1"o\xfb\x1d\xdc\x9ezD\x9c\x98TS\xc1,\xa2K\x0f\xe1\xde6\xdc\xc9\x9a\xb2\x91\x89\xe1"B\xd5\xa9\xab=\xcf\xb3\x1f\x14\x9f\xeaR\xf0\x16r\xbecC)\xc1%\xfd\xb5%YU\xf1\xf6\xdf\xce#\x9d0\x1bE\xffEP9_l\x8b\x18\\w\xab\xec\x1d*\x8e\xaey\xda\x00\xcbQ\x93b\xa1p~\xd0\xdalUc\x04Of\x99\xb95v7\xd8F\x94\xdc\x16\xcea\xfb\xc0\xf3\xd5?\x16E\x88\xcb\xf2?i\xb2\xb7\x9d\xf4{\x14\x06l\xe1\xef\xf6\xeez\x0c\x8d}\x0ba!v\x1f\xad \n\xcb|a\xff~<\x9a\x8d\xff\x9fra\xcbz\x16\xc9\xc8g\xd4\xed\xca\x0b\xa9\xdf\xe5\x8c\xb4\x85\xd7\x88k\xb0\xca\x91\x04b\x13=\xf3\xfe\n\xb1\xc0\xbbZ\x05\x94L\xd0\xae\t}\x12:\xd3\xd2j,\x9b\xb43<\xa3\xb8\xa0\x88.\xe2\xb9\x92iOWXt\xdd\xee\xf4c\xf9\xea\xa2\xc3\xcd\x0f\xfa&\x99\xcf\x07\xadv\x81\xac\x94B\x83g^\x10\x1d\xa0v,f\x88\xd9&W\xcc\xdb\xe12\x134\xef\xe7_K\xc3\xdb\x16GF\xb4\xde\xbb\xe1*\xfeP @6\xcb\xfd#M]O\x9b\x11\xb0\xb2\x8e\xf8\x00^\x04_\x9f\x18\xb8\xcd@\xac;V7.<FQU\xae\x81\xfe\xb4\xfe\xe6U\x1c\xa1r\x01\xcd\xf13awG\x02\xc1Hy(\xa6\xc7u\xe3I\r\x12\xb2\\\xb5\x11),\x8c\xf3\x06\xa3\xe9\xa9u{\xcc\x92x\x87T\xd1\xa3\xe5+b\xd8\x10.\xa2\x94:<\xb3\xc4^\xee\x0b\r\xb9+\xe0g\xe1\xd1b\x080\xaaC\x16\x1d\x8a\xe2\'B\xee\xa3\xdf\xa1Xk\xfcU\xf7a\n\x1a["4@}\x90\x84\xcbK\x86S\x02\xd6\x9e\xe4\xca~\n\xc7Hnj\xf1\xe1\xc9.|?B\x04\xbb\x89\xc5\x83\x94\x89\xe5\xca\xecp.\x89^\xc1\xd3\xae\xb3<\x9dZ\x0fA=\x1b\xb8\x93\xbd\x7fHWEc\xef\xe3\xbf!D\x1eOZ\xcefh\xa2\xe0\x8b\xb1\x80Lo,\xae\x1b\xacuD\x83#U\x1f\x1b6\xb9\xe1\xc0\x9e\n\x90Y\\5\xe1\x037\x0f\x1f\xe7\xffKz3\xf1\x1d\xd6\x87\x8b\xec/9\xa6\xb1\xfc\t\xea\x1c\xf6<\xb5Y+\xa5,\xf0\xe8\x8f\xcf\xc9\xf1\x7f\n\x9a\x00-\x9e)\xd5v\xe6pK\xe1\xa8\x06\xe4\xed@\x8f\x86]p\xdf\x1eF\xc8G\xde\x90\x9d/\t\xc7\xddt\xff\xa7\xb8\xd4hE\x15\x18/G\x9c\x004\x96\xb8\'\x13\xbb\xe0\x1f5!G\xf5\xc7L\x9b\xa3],1MT{dF\xf5Sc\xae\xd9(u\xf4:\x10\xf9\xc5\xc85\xf55\x1c\xdb "\x1d7qFu\xed\x8edd\x12\x81\xfc\xb3\x1d\x042\xc8\x95b\xe1$V\xc8\xcb\xef\x1by\x91\xedt\x99\xa5A"fz\x90\xb3\xec\x04}R\xe6F\xed<\xa88\xa1\x84h\xde\x9c\xdc@C]"v-\xf3\xb8s\xb8p\xb6>\x0b\xed<\xc2o \xb5\x9a\x99Dv\x1e\xad\xb0\x95\xacJ\x7f\xbc\x92n\xcc\xed\t\x11\xa5\t\xb9x\x9b7\xea-n\xe6\xf5\xde\x1fc)*\xcb\x10\xe4\xcd\xb1a\xa0\x8a\xbd\xddvu\x87=\xbb\xae\xf7\xe4\x98^e\x1d\xdfC*\x8f\xe6\x96\x8b\x10\xc3zz\xbc8\x19\x9d\x96\x92\xe4H\xbaB\xc4.\xccB\xe4q\xe0:\x7f\x11\xc1q)\xe3S\x1d\x97\x9b\xaa\xe2a\x93L\xfdw{\xcb\x0fk\xd9\x05#I\xc9\xb6\x05\xce\x1a\x08\xbe1\x8d?\x7f\xd7\xb8V\xe2\x8e\xda\x07W\x10\xb1\xcfG\x8b,Pn\xbe\x99\x063\xf3\xcc\x802\x1b\x84\xa9\x99G\x87,\xd0A\xe4%*\x0c\xd6\x01\xba\x1f\xc4`\xd3j\x14\xed\xd6\xaag\xfbq\xab\x8a\xc7\xb2\xd8\x11\xaff\xcf\xcet\xa0\xe87M+\x9e\xf2r\xf0\xf4\xf6\xf7\x04\x9bC\x02D\xc2c\x00\xcdN\x8e\xb3\x9f\xa2n5\x90\x96\xc3+X\'\xb5GS\x92\xf4\xbd\x8f\xb9OL,\xdb\x7f\x91}X9LEq\xbb\x04o\x83\xc1\xfd\xf6\x86"D?\x06U\xf1C\xe3\xdaq\x07V\x96\xc2t\xf3\xb8-\x8e)\x1e\xe5E\x8a}\xc4\xf3\xd3\xe9\x81\xed\xc3K0\x1a\xc2i\x0b\x9a\xaa\xe0\xf5\xd1bk\xd2\xd8\xeeS~\xa4\x9a\xce0g\xee\x84\xd2\xc0\xa0\xcdy\x15\x0f\x8d\xeb\xb2\x7f4\x9e\xf4\xf4\x97[\xca\x99/\xd8b\r\xc1\xdc\xac`\x1c\xfb\xc3\x8e\x8fJ\x01)&\\\xfe\x82\x19\xf6\x16G\x97h\xb6\xcc\x99\x9d\x1d\xc3\x84\xd2\x89Rt\x16\x01X\x98\xed\xdbw[\x12R"\xb2\x1cLY7\x82Y\x1e\xbc\xd5\xd4\xcf\xb5\xf4\x88?\x9e\x19p\x9c\xf0\x90!\x16\xe8\xa0B]\x8bB\x1ac\xc5\xfc\xb1\xb7\x02=\x89\xc4y\x1b\xaa\x18\xb7B|bH\xfb(\xf8n0\xb5\x89\xc6{\xc7\x85]U\xc2L\x1c\x89\xaa\x1b\xaf\x99\xbd\x199\x03\xc7,\x14\x7f\x04\xba\x84;g`\xda\x88T\xeaF\xfb@\xfdF\xfaWA{V\xf4WS\x05*\x15w\xa3R\x89\xb8\xb09\xdc\xf9_\x03\r\x1e\xd2\xc6o\xac{\xb9k\xb1\xd2\xa3\x1bxe\xdcf\xad\x954\x93F\xaa;\x0b\x8c\x89\x13\x1a\xac\x9e\x1c\x879\x91\xee1~,\x8a\x9c\xd2h\xfc\x80\xc6\x17+\xa3\x9c^\xa0\x87\xc1\x7f\xffA;\xe9(9\xc3\xebJ\xcb"\xe1\x0c\xa0\xa5A\xfd&\xa2\x9c~j\xcc\x83\xe9s\xdc\x88\x8ek\x05_\x8d\xe8S\xa7o?\x05\xc8(\xc5\xdd@gw\xf8\x9c\rC\x15vg\xb2b\x83\xf8\'\xa6:V\xa3F\x8e\x1a\xee\x0b\xb39R\xda"\xd4\'\xd8\xfcr\xd8[\xeb\x8f\xb7\x9c\xd8\x93\xa4\xe6C\x07\xe2\x0c@\xfb\x99f\xc9\xd6\xd1\x05\x01\x0f\x0b\xe1R`i\xa1\xb6x\x19\xabm\xf3L&t\xcc\xc8\xf9\xe7H\xa7\x1f\xacu\x8a\x1a5\xa3\x95\x9ey\xef\x7f\xa7Y\xe44\xa0\xaa*B\x112<\xbf\x93\xd7\xdf\xa2-\xd9Z\x9fj0\r\xe5\xae\xf9^\xae\x8f\x97\x96\x02\xa4.d\xd0\xbdd\x92\\~%E\x08Y\xd7 \xbb\x03V\x1d\xce\x99\xf9<M\x0c\x92w\xfe\x90.OD\xf4\x17\xc7q\x0e\xe4g\xae\x0b\n\xf8\r_\x9d\x18\x1d\x9f~\xfe\x90I\xee\xbf^\x1e\x88,nwVg\xc9\x9d\x19d\xf0\x1eD\xab\xa8xv\xf4\xef\xfc\xd6\x8a\x06,J%\x06-\xce\xcf\x82\x83\x8d\xce\xc7Lh\xba\xa7+\x8e\x8a\x16\xdc\xa66+H \xdbziBI\x1cn`\xa9\xe1\'c\x1b\xee\xc9\xc2q\x14\xe7\xc3\xde\x1fX\xb6\xbf8b\x7fLbu\x98c\x88\xe6\x8d\nQ\xff\x89W\xee\xc1$P]\xabu.\xc91\xde09\xc5\xca\xf6?}\xa1\x11C\x98*\xb6\x90\xe3\xf8\xcc#\xa5\x8b\x81\x98\xbe\xb3\xb0l\xee\xbdL\xf0F\xc1\xc6U|\xb7\x95,\xed\x11J\x94\xf7\x01\xd9\xdc\x15v\x19/\xef\xdf\x8e\xbfk\xd5\xb8\x8e\xf24\x9e\x86#U\xd9\tAm\xf1\xad*;\r\x1bU\xb7\xb1\xf5B\xf1\xbd\xa2\xe5\\\xcf\xc2s\x10f\xea\xfc&\x8c\xed\xee\x19\xebM8\xf6t\xb25\x85\xda\xc3\xf0\xbb\rv\x96\xd7I\xe55\x87\xb6\xd1\xe2\x8c!O\xdd\x16\xf4\x012m\xbd)r\xcfa\xc1\xe4\x7f\xe5\xe4\x18b\xa7\x014V\xe3\xe8\xcf\xf4\x18I\xb1y\xfay\x85\xc8\xb0\x8d\x95\xe6\xcd\x9c\xdc\xb6\xb8\x18\xb9S\xa5\xb2)_\xfe\xc60\x8eZ\xc6!\xee\xeb\xa4\x1b\xb8\xc4\x12}\xeb\xf6\x19\x03x>\x9aP\x1c\x81\xb7\x98\xd7\xf1\xa5\xe9\xe5\xfe\x1f\xb9\x8f\n\xee\x9a+\x1b\x8a\xea\x17g\x01\xf84\'g\xc8\x82\xa1\xba5\x1b\x18\r\xda\x17\xd5!\x11\xd3b\xa0\x15&\xec\xe9\x9b\xfb&IM6\x97\xd2\xc2:\xff\x10\x9ec\xddG\x0c\x05f\xd3\xa0\x82\xcbO\xedFS\xc7\xdd\x855<u>\xc8\xcd\xe0\xbf\xbf)\x0f\x1c\xb3\xcc\x8aec\xf3\xbe4\x14\x04\xaf+\xe9\nC\xe2\xe5\xb5\xd4\xb4{\xfeX\xd6?C\x93\xb9\x96j/\xeajFt\xec\x0b\xae\x92\xd7%\xe3|\x1cL\x1d\xef\xd81\x1b\x11\x86\xdb;\x1f\xca\xbd\xaa\xaa-\x06B\xfa\xd7\xbf\'0Y\xcd+?\xa3\xdc\x8c6Ul%\xc7\nANbw]\xe1\xc8W\xed\xb6\xe8-\xc1\xb5jY\x84J\xdf\x85\xc3\xa2\x80\xedI\x1f9\xbeCk1\xc1\xd4\xd1\xfd\x9d\xeel\x15;\xa0M=g\xe7\x1d\x9cQ>l7 ,R\xcf\xd7\xab&\xdaI\x98A\xca\x90X\xe2\xa3\x89A\x9bTX\x0f\x14u\xd7\'\xa8\xd5\xdd\x1f\x18ng<<\x16\xdaNd1\x82\xf9\xdc!C\xcf\xa2\xf8\x0f)\x83\x0f\x88=\x1f\xfe\xf3\x8b\xc4w0\x05B\xe1=\x9cNu\xa98\x11\x81.\xe0/\xfdM\xf4u\xca\x00\x84\xcd\xe4\xc1f\\\xd0\xfe(\x84\tS\xb3\xd0T\xf8u\xeb\xe2/\xe8\xf4Q\xf8\xc16`\xa4o\xcb\xdf\xa0\x8c\xf8\x94U~\xb8\x86\x8c\'\x12\xd4\xf4\xe5\xe5\xd8&\xbf\xe1\x13\xe4\xe8\xf0R#\xca\x87r_\xcb$s}\xfd\x9e\x02\xf0\x16\xa3KR\xb1F\xad3\xa0\xf0\xa9\x05.5\x87\xac\xcf\x13\x88e$\xb2\xc0e\xf8\x98\xaaA\x97Z \x88\xe8\xa4\xb5\xd6\t\xa22\r7!No\\\x0f\x8d\x8b\xd1\x1b\xfc\xe2\xef\xcbm\x9e$\xec\x8c\xfb\xa2\xca4l\xeft\xead\x17\x00g\x9a2\x03$\xc2=\xfb\x077\x0c\x8f\xec\x95\x99\x1c\x98\xb0\xc8\r\xc36jM@\xc3\xbc@\x17\x94\x91\xd4\x0c\xeb!f}\x97 \x91\xd1\x01\xc0\xa1@_\x13:n\xc5\x19}\xa0\x86\x05\x0c\xbc\x9ft\x9d\xf5fy\x85\x1a\x04T7\x02C\xd3\xf0\xb4\t\x90\xc3=\xe75{~\x9c\x1ajQ\xd9)\xd8\xbb\xa2\x98.\xdc\x96\xb0{U\xcavb\xe2\xcf\xb3C\x83e>\xb4\x8b\xc7\xe0\x8d\xac\xe1\n|\x8aP\x07C.\xa6\xb9\xc4gFJO1\x0cVfi\x06\xa4\xde\xc2q7\x9b\x13&\x19\xf2u\x16`J{\x17\xdb\xfe\xfa\x04\x19\x19\xe4|\xae\x85\xc6\x19T\x814d\x04\x1e\xf6\x82\r\r\x05\x16h3\x05\xde\xc4\x8e8\xde\xab\xb0\xaf\xd6\xc7{W\xd6I#\xa4\x93\x9c\xd7\xa3?\xc1\xa0\rf"K\xbfH\xc2x\xaf\xb5\xab\xb9\xd5\x98\x97I\xc4\x1b\xe2#\x01S\xe9O\xf8\xfc\x1a\xbc\xfa\xdcl\xb4\x9b\xec\x9bE=\x9cM\x98\xc8!\x82\xa4\x0c)/Sm\xc0\x8d\xe0\xc8\xd1\xc9\xd8.\xefg\xa2\x12H\xaeL\xa8\xdf\x81\xef\xc9sW\xbc`K\xbf8\x0e\xc3\xc6.\xabk\x8f\r\x0bo\xca\x81\xa3\xa9e\x88j9\x9a\xf0\xe3?\x82\x1aMDw\xb1\xba\xefX\xf6O\\\x12\xda\xd8.\xf0\x86b^\x99\xf6E\xd8\xca\x8cj\x10\xfe,\x98\x1co\xd6\xb8a\xf3M\xd9\xa0\x19v\x8e\x98\x89\xf2\xc5\x95r\x05g\x1c\xbb\x1c\x1e\x9f\xbd;D\xb1=\xe0\xff\x96\xd3R\xdf\x820\xe8\x06i\x99\xa1y\x19\xac\t\xb2\\O\x84\x11qPx\x9f\xa9P\x13\xa4m*@\xca?v\xfcG\x97\xb5\xd6=l\x15\xcc\xdd\xb1!\xe6\xeb\r60\xbb\xbf\xdd\xe8\xf8\x7f\xb6\xa8\x81\x1c\t\x15}E\x98\xbe\x08\xdf|\xe3\x1b\xf7y\xe9\xfa\xbalZ]@\x95\xe2CY*}\xaf\xc3\x9a\xff\x82\xbcb\x02\xa3\x84\'1\xebH1\xdc\xe9\x88\x94u\xb0ib"\xc4\r0\xb2\xdf\x8e\x18\xa3\x83G\x995]Nz1\xb7\xc8p\x00w\xd1\xfb\x1a\x19}\xc6_]\x16q`\xda\xd3\x0fZ\x7f\xbb\xa2\xf4\xd0\xae\xe0\xe6>\\\x8aQ\x8a\xe9\xab$T\t\xb9\x02\r\xe0\x0c\xa0\x80\xb3\x1c\x93\x05\xc5\x05x\x88\x97\xec^\x1d\x9b\xb3W\xfd\xae{\x1aM\xeb@\x84\xc5IiKxlu\x9d|g\\\x8b\x10\xa6\x9c\x10\x04\xabs\x96\x86\x94\x99\xa8Ys\xc7\xa5\xba4\xf2\x06\xb3\xc0\x95l{\xbf\xf3m\xca\xf3\x9a>\xf5\xe4L\xa75\x0f\xb4 \x93\xfd\xedn\xfc/\x92\xc5\xe4\xb7\x0ft<K\'\xf0Y\x173\xcb\x16\xb1\x077\xbe-\x07\x8a\xff\x1f\xe9\xc6\xf64\xd7r\xbc\xe5RK\xe6\xc4"\xd36\x8a-\x94\xe8$\xabj_\\n\xb5\xc7\x8a\xb8%\xf8\x06\x91\xad\x8bl\xa0s\xb5\x14\x92~5\xde\xc9\xbf7\xf4\xf8\xd7\x88\xf1\x99\x88\xe1;u\xb0\xed\xa4\xdc\xb7\xc3\x1f<\x14\xacq\x83\xb2\xe8\xcb\t\xd7\x1c\xb9\xb0\xb9\xc6x\xd1\xe7\xa3\xf5~\x1b\x0c\xee\xf4a.\xba\xeb_;\x08I\x10\xc0\xcfe\x1c\xbeoEz\xa5\xcd>\xa1\xaf{\x81\xc4\xb4\xe6A=\x84\x8a+(\xc2n\x04\x11\x04\xe1\xd2\x18\xd6\n\xe1\x0fl\x8ex\x89/\xc1W\xeaF\xa6)H\x92\xc4\xca\xc1\xbdS\'};\x90s\xfd\xcb\x04\x9f\xe8\x05y)\x8b\x84\xd4\x83G\xb5Q\x82\xe4\x95dG\x14\xb3$4\xab\xdc\xa0d\x9b\xee\x80\x86\x9c\xb2\xd5\x9d\xf7\x19\xfa\x92\xab_l*6\x8cT\xadu\xf0#w\x97,\x8dT#\xc3:\xdaG|\xfd\xe3`\xd5\xf1\xc9\xc2\x9egW\xd4\xa1`)\xbb\xdf\n\xe4\x88\xe9\xe9\xa7\x1c\xd9\x9e\n\xa6\x17e\x8dN\x89\xb8\xfb\x8b$\x83!\xd2\xb0\x90\xab\xc9\x10FI^\x15\xdcP\\=\x11\x84ycl\x04xg\xc3=\xbd\xe3\xc5\xe48REO\x18\xbb\xe3A\x14\xd2\xd0TWBr\xbe"p\xcc\x8f\xd0\xb6" \xee@\xb3 @\x83aI\x13\x81\x06E0\x00\xe0rU\xa5\x15\xaf\xfe\xb6\xae&\xff|\xe8\xb6T\xe7U\xaeA,3\r\xc52\xd4\n\x92]\x13\x98x\xea\xc6\x989F\x04\xd5q2u\x96\x1e)2\xe4K\x9e\\V\x15K\xf2e\xda\xd3_\xc9\x14i\xb6\x02\x86{(Cx\x9d\x93\x98]\x93za$\x88\x08\xca-\x1b\xf7\x815\xf8\xad\xe7\xc8o\x0f\x8a\x18\x9b\x0b:\xb2D\x18\xf0\x878\xf4\x8fW\xe9\xb5\xb8O\xdf\xc0\x80\xb2\xfdO-\xb6\x96S\xc4>\xf4J\xac_\xee\xa0\xbe\xef\x191o\xaeu\x1cFC0\xb7\x88\xf6\x03]\'\xc7\xe5\xf2"\x071\xb4\xf4\xeej\xe8\xffY\xc7\x16\x02\xe8\xec6p\xa1V\xb2w\x1bcom\xb0C\x1b\xe4\x06\x84\xa4\x9c\x13\xb5\x8d\n\xe0\xde\x8a\x94\xdb\xb9q\n\x00&\xc9|a\xf1\x1e_"l?\xeb\xf8_ENg\x0ceu\x86j&\xabN\xa0\xdb\xa2\xfdw9}\xb0\x81\xc7\x13\xd9]\x91\xf0\xc0\xc8:\x8a\x1f@\n+*\xbd\xca\x8c\x82mP\xf5\xee\x05\x10\x0c\x1d\xa6\x89\xd2D;\xc7i\xe8\xe2w\xfb\xda\xfc/d\xc9\x80\x00?\xb1\x91\x0c\x86\xb2|a\x9bD(\x91R\x13g]\x88\x18-\xec\xf4\xe4\xf6c5[\x1e;j\xf3\xae\x01\x88Iv\x8a\xa7\xebF\xe5"m\xf7E\x92\xac\xd8\xb1\xc1t\xe6^BO\x03\x7f\xbd\x1e\xd2~U\xa6\xcb\xffd[p\xbez\x0c!\x8f\x9e\xa8-a\xa8%a_\x81$Y\x10\xf5&1\xfa\x03\x7f\xd14\xcdw(\xe9\xe2KN\x982{x\x04@\xe2#\x98\x1a\x9e\xd7*\xcf\xbc\x07h\xc2\x0b\x18,{\xd2\xff\xda\x12\xc2u\xe3\xa2\x08l\xc1\x1c\xfc\xcbx\xa5\xb5\x8a\x1d\xd4\xdfA\xe6\xef\xb0\xcc\xe3\xf3\x1d*\xd3\xcfv\xf8JP\xbf\xb7\x9ar\xeeJ\xf4N\xb7\xaa1\xceC\xd8\xed\xa3k\xe0\x90\x86z\x98?\x83\t\xe1\x8fo\xee]j\xd4>\x1a=\x85{j\xa1\x8a\x08=T\xa3\'7\xaf\xbfl\xa6\x84a\xb2\xe4\xc4q\x9a\xc5K|M\xe4Zh?\xf9\x08<\x07\xe4$\x16\x0e}\xfd\xd0\xaeO%U\xcb\x01\x1c\xce]c8\x971\xe4\xd9\x95<\x96Z\xcc"\xbbMh"\xefk\xc01\xa1\xdb\x9dy(\xf5\x89)8\xb61\x8c\x7f\xf4I\x85GfU\x7f8\xe7\x8e>2\xcb\x9b\xe9s\xb3\xaen\x1a\x0bQ\xe1b\x87\xc2\x96\xdb\xe2\xd3\xcf\x17\x15vz%\xaes8\xf56\x17\xa0\xc0\x90*\xea\x9a\xdd\xa9\xda\xb7Lp\xf3\x8e4[)\x8e\x17\x17\x92\xa0\xb2\xe3\xe8\'\x97\xdd\x02@z\xb8\xe3{$\x80F\xe1\xb3\xcd\xdf\x0fC\x85\xbe\xbd{\x93\xfa\xa9\xdc\xdd\xec\xd0{\xf2hV\x01\x1eR\x84w-\xfd\x10\xf3Y\x1d\x08c\'\n\x12F\x8dl\xd1i~\xe9\xa0|\xdfGi)\tb\xf1\xdce\xf4\ts\xc3r]\x8eE\x81\xd2\xc8\xe5p\xe3|z\x11\xdci\x85\x08k!\xf4s\x85\xee4\xc8,2T\xa4WO\xb5\x02\xb9\x0c\x19;X\xf3\xf08\x83\x80\x83\x8f\xbd\xc0\xc9\xe4\xa2\xf0s\xae2\xea!WC~\xfcr\x92\x87W\x86#\x0e\xa6B\x84\xdd\x07\x06\x13~\xb0\xca\xd4*\x84\x9e*\x00\xc3\x81\x15\x17\x98\xb7\xca7C\xe0\xcd\xf3\x98\xb5\x1bYL\xee\xb1K\xd1\x9eU\x01(\x9f$\xdd}\t\xb7kd(\xd8\x8f\\\x10\xa5R\xaavQ\xc7\x0f\xa3s\xb1K*m\x04\xfbQ\xeei\xf46\x81\xb8\xb2\xd8%\xc1\xa5\xe6\xaa\x1a\\\xcfG\x8f\t\xaa\xde\xe9;w\x88:nf9\x08\xa8\x98\x15}\xb4B,\xc1\xce*I\x9d\x17\xbe}e@+\xed\xa5\xd1\xb6v0\x02\xd3\xb8\x14E)\x08\x97\x97\xbf\xe5\xf06]rn\x8a\xb59Ev\xae\xa8\x17\x81\x1d\xeeq\xed\xf9+\xcf\x90X\xa9A\x92E\x03\xc2\xed\xc1p\x87\xe1 \xa8\x1c\xcc\xcb_\xdb\xb2y\xb9\x85\xc9\x9a-\xdetl\xc4&\xd0\xcf\xfe\tf=\x03\x02j\xc3\x0f^\xa6OM\xd5\nweK.\xf6\xc9\xba\x80\x01\xce\xd7\xf85\xf7\xc14\xea\xd2.\xc4#1\xf2\xe4\x07\xd6\xe36\xa0"\x88\x14\x9e\xb4\xbaq\xfa\xa8_K\xdeM\x8d\xd9\xd8\xc5\xe9\xeb\xa3\xd5zK\xd4\xc8m\xab\xa5\xb3\x80\xa5#\xd5\x8dX\xbb\x08\xd8\xd1\xe0\x89\x94\xc3\xa2_c\xce\xa8]\xe5m)\x96l\xa1#"`"BES&\xe4\x85\x18&\xa6G\x9c d?\x07\x89\x9e@\x11\x80T\x8e\x8b<\x1e\x85D(2\xbe\x19\xacg\xe5\x80z\xb5Z?\xa2\xb6\xf8h\xa5!\x84\'\x1e\xb2\x07\x8e\xbej"\xcd\x13l\xfb\xd2\xeb!\xd7q\xee\x9a\x93\xff?\xf4g\x1d8Ew,\x91o[G;^|Nq\xc1C\xc8S\xad:\xa8,vA?\xa26P\xc0\xbf5o\xc7a\x84\x82\xb1e\xdcL\xd7:nVvO\xe2i\xa5\xa0?\x90\xdb\xb7#\xcf\x04!\x9b\xac\xabl\x06U_\xc66@9\xf95\xd4\xbc\xc0\xc6\x85RK\xdfH:\x02\xc8\xb7\x8eo`\xf3\x003\xfa\xe7\xdf\x08\x10\xddUk)\xf0_\x8e3\xb3EM`\xd4\x05\xf5\x1el\x89\xf4\x9a\x1c\xdc\xdduD\x14Y&\xa9\xb6\x93=L\x15U\xf6\x11H\xec\x81\x17\xd740\x88\x0e\x98\x95Qo\xfb\r\x8f\xbe\xfa\xe7\xdd\xca\x14\x96s\x98o\xa0\xb7\xf0pT\x19\xec\x19R\x85\xb3sC\x94\xfa\xaa_\xf1J\xbf\xa3\xef \xc8\xa0x\x16\xb1\xaaf\xa6ka\xe2L\xfdT\xb6\x98]\x1fl\xff\xe0\x98\xb0\xa4\xdd\x9f\xc9\x0f(\xa3\x16\x99\xf0c\x8d\x10\xc4-\x8b\xc0|L]\x8a\x00\x8f\x07^d`]\xe9\x82e\x9bH\x17{^\xf9X\xf6>:\xda\xfa}j\xca\xec_V\x83\xa9\xf4\xf5F\xe6Y\x0e\xa20s\xcc!\x05z{r\x10\xde|\xad\x17\x04\xfbW\x8d\x8dW\t\xd4\xac\xb7j\xec\x00\x91s\x1f,\xb6\xc0W\xde\x1cP\xc4\xf51\x96\x1dO"\xd9\xc4s<\x01P\'\xd3\xbd\xa0\xe6e\xbf\xb5\xa5\xa3\xe4\xc0\x15\x15\xa6\xc8E\xeea\xca\xc3\xc0\x90\xfa\xb1\x90\xc2\x90\x03(G\x0et\x0c\x05\x8a\x930\xbelSM)\x92qC,\x1a\x9d\x83\xac;\xa0D\xa9\x89\xfc\x05\xe2b\xf5U\x9fT\x13\xcd\xb5\xb1\xd2\x17\xaa\xa3\xe9p\x91 \xbb\x9a\xbe\x0c\xe9;?\xbbK\xab\x14\xba\x18\xbe\xdbi\x06\xaaVV\xc6\xfb\x90}\xe5\xdf\xe9\xb6\xbbq\x85\xf2\xe10G\xa4\xab\xa3#h\xccO\xdb\xdc4\x04\xc6\xc3#\x13\xa1\x86\x11y]\xa5~*F\xf9Ft0\xde\x0b\xb26>\xc0\xf0\xa9\r6\x1c\xab;N\xae\xbdj\xd9\xe2n\xe6!\x13^\x1b\x91\xd8\xe9\xfb\x15\x8b\x84\x0b\xcc^w[\xbb\xa3\xb3\xbe\x89@\x0c\x14\x01}\x8a\x0c\xca\t7\xc9\xf0e\xff\x9e\xff\xdf\x00\xae\x95\xc1y"=\x077\x18m@\xd4\x7f\x1b\xf2\xb7!\x86\xec\x89\xa3\xc9\xf9\x08w\xa2\x8b\xfe\x1d\xa9\x16y[8\xd1\xce\xe3@\x94V\x96Q\xd1K\x97\x00\xcb\x81Bn%,\x9bU\x04\xb9u\x0b\xf9>\xbc\xaf\x87;uU\x15\xe7\xfenB\x02\xd4!\xa6SP8\x00[\xf0\xced9\xed\x9e\x15s\xd8J("\xaa\xb6\x18\x80_\xc4\xb2\x08\x14\xa2\x99~\x15\x0b\xa95\xd7XS#\x89\xc0"P\xe6$\xceA#\x9d\xe9\xc9\xd8\x1fF&\x9et\xfc\xfd\xfc\xc4\x1c\xb2\x1cU\x11\xe1N\x96\xdd\xde!2\x05\xb7\xc1:\xf3\xdbd\x10RS\x9f\xdb\xd1\xd5\xe8\xdf:%\x97\xdb\x0e\x1c\x07\x99\x11\xd4\xca\xc0P\xfa\xa99\xa24\x17\xa7\xf3\xff\xda\xf9\xeb\xae\xc9C;%\xc0\x90\xc0\xf1\x86\xea\x07&8\xce\xa3\xc63\xcbc\xefI\x8a_\x9d\xe8FJi\x89\xc8z\xa0\xdc\xc5\x05f\xd3\x83\xb3\x9f\xea\xc9\xd2\xa6\xf1\xcb\xb5,\xbb\x0e\x16\x82G\x06d\x969\xd0\xc4v\x06\xd5/\xe7A\x13?\xe6\x10\x08\xc6\x88Cql\xda\xc5yg\xcd\xd4\xdf\xae\xf3\xca\xcez(\x93\xf4C\xf2\x80\xbb\xd3\xfd\xaa\xe6Jy2\x14\xf43Tr\xa9\x9dS\\\x1c`\x98L\xe8jj\xf6\xc2\x99\t>)\xfb\x00\xa5\x9b\xd9\xb0)8\xbb!F\xecb-\xfc\x8b\xcd\xba\xcc\xe3o`\xa1p[D\xc3\xf0\x8b\xc8\xf4\xea~\xd6I:@\xdb\x9d!M\xfd\xde\\\xae\xc7/Yq\x93\'\xbc\x1cb\xd7\x1b<\x12!y\x03O\x01\xc6Q\x1bN>\x03K\xb8\x93\xc9(27xF\xe6\xb0\xad=\xdf\xc1\x12\x91\x9dDc\x05\x88X\x13\xd2\xc0&\xb6\x96)\xcd\xdde2*+\xd4{\x0cR\x94\xff\x0f\x0c\xbe\x92\xb8y\x85@\x92\x06\xa7\x7f\xc9\xc8\xeb\xdc@\xe4\x8eg\x8d\xeca\xc2\xb5\xc4G\xa8\x99\xbaD.\x83\xc6\xcc\x81\x0fw\xd8\x9d\xfa\rL\xc7\xf7\xa01N\xc7nPNM!\x85\x99H\xe9\xb5\xa5\x1fq\xbdH\x0c<4\xc9\xdf\xbd\x86\xdc\x98\xda\x163\xfeI\xd9P\xc8\xe7\xf3\xfb+\xcf\xb5g3!\xcb\x08;\x1bf\xfa\x96a\xcaeg\xb5\xb1~F\xec\xeb\xfcrjG\xb9\x1e\xe5\xe6\xef\x95$c\xba\x8a\xcf|\x1df\xeb\x97\xaf\xe8 \xc1+\x84e\x87z\xb9-\x95^2\xe2\xf3,fD*\r\xa2\x1f\x96)\xcd\xe8e\xf8\x0ew\x89s\xda\xac\xaag3c\xf8-\x9cJ\xe8\xe0,Ia\x89d\xf37d\xc8`OR\xa2\xa6\xa8M\x91^\x97\xc0\xa8j\x06\xb4\x0e;\x05mm_\xff\xb9\xf0\xa7k\x87\xb0dO\xcbe\xef\xc3\x01\xca\x8ab\xf1\xf0\x95\xb0\xee\xda\xfe&*\x8c7L\x10\x89\xa1?\xb23\xb2\\\x91:aP\xfa\x98\x00!\x08u\xdcNv\xaa\xbbN4\xc9\xa4?\xc3\x9c\x82\x84\xf0\xb1G\xf3\xb4\xfc\xb8\xa9\xab\xc5D@\xa6\xcaaUm\x04\xf0\xa6\xad\x1b*\x16\x1c\xf5Q\x1dH')
|
1
|
+
#!/usr/bin/env python3
|
2
|
+
import pprint
|
3
|
+
from flask_babelex import gettext as _
|
4
|
+
import pathlib
|
5
|
+
from hiddifypanel.models import *
|
6
|
+
|
7
|
+
from datetime import datetime,timedelta,date
|
8
|
+
import os,sys
|
9
|
+
import json
|
10
|
+
import urllib.request
|
11
|
+
import subprocess
|
12
|
+
import re
|
13
|
+
from hiddifypanel.panel import hiddify,usage
|
14
|
+
from hiddifypanel.panel import hiddify_api
|
15
|
+
from flask import current_app,render_template,request,Response,Markup,url_for
|
16
|
+
from hiddifypanel.panel.hiddify import flash
|
17
|
+
|
18
|
+
from flask_classful import FlaskView,route
|
19
|
+
|
20
|
+
class Actions(FlaskView):
|
21
|
+
|
22
|
+
def index(self):
|
23
|
+
return render_template('index.html')
|
24
|
+
|
25
|
+
def reverselog(self,logfile):
|
26
|
+
if logfile==None:return self.viewlogs()
|
27
|
+
config_dir=current_app.config['HIDDIFY_CONFIG_PATH']
|
28
|
+
|
29
|
+
with open(f'{config_dir}/log/system/{logfile}') as f:
|
30
|
+
lines=[line for line in f]
|
31
|
+
logs="".join(lines[::-1])
|
32
|
+
# resp= Response()
|
33
|
+
# resp.mimetype="text/plain"
|
34
|
+
out=f'<pre style="background-color:black; color:white;padding:10px">{logs}</pre>'
|
35
|
+
if len(lines)>5 and "----Finished!---" in "".join(lines[-min(10,len(lines)):]):
|
36
|
+
out=f"<a href='#' target='_blank'><div style='background-color:#b1eab1; padding: 10px;border: solid;'>Finished! For scrolling the log click here.</div></a>{out}"
|
37
|
+
|
38
|
+
|
39
|
+
|
40
|
+
return out
|
41
|
+
|
42
|
+
|
43
|
+
|
44
|
+
|
45
|
+
def viewlogs(self):
|
46
|
+
config_dir=current_app.config['HIDDIFY_CONFIG_PATH']
|
47
|
+
res=[]
|
48
|
+
for filename in sorted(os.listdir(f'{config_dir}/log/system/')):
|
49
|
+
res.append(f"<a href='{url_for('admin.Actions:reverselog',logfile=filename)}'>{filename}</a>")
|
50
|
+
return Markup("<br>".join(res))
|
51
|
+
|
52
|
+
@route('apply_configs', methods=['POST'])
|
53
|
+
def apply_configs(self):
|
54
|
+
return self.reinstall(False)
|
55
|
+
|
56
|
+
@route('reset', methods=['POST'])
|
57
|
+
def reset(self):
|
58
|
+
status=self.status()
|
59
|
+
flash(_("rebooting system may takes time please wait"),'info')
|
60
|
+
subprocess.Popen(f"reboot",start_new_session=True)
|
61
|
+
return status
|
62
|
+
|
63
|
+
@route('reinstall', methods=['POST'])
|
64
|
+
def reinstall(self,complete_install=True,domain_changed=False):
|
65
|
+
if int(hconfig(ConfigEnum.db_version))<9:
|
66
|
+
return ("Please update your panel before this action.")
|
67
|
+
if hconfig(ConfigEnum.parent_panel):
|
68
|
+
try:
|
69
|
+
hiddify_api.sync_child_to_parent()
|
70
|
+
except e as Exception:
|
71
|
+
flash (_('can not sync child with parent panel')+" "+e)
|
72
|
+
|
73
|
+
|
74
|
+
domain_changed=request.args.get("domain_changed",str(domain_changed)).lower()=="true"
|
75
|
+
complete_install=request.args.get("complete_install",str(complete_install)).lower()=="true"
|
76
|
+
if domain_changed:
|
77
|
+
flash((_('Your domains changed. Please do not forget to copy admin links, otherwise you can not access to the panel anymore.')),'info')
|
78
|
+
# flash(f'complete_install={complete_install} domain_changed={domain_changed} ', 'info')
|
79
|
+
# return render_template("result.html")
|
80
|
+
config=current_app.config
|
81
|
+
hiddify.add_temporary_access()
|
82
|
+
file="install.sh" if complete_install else "apply_configs.sh"
|
83
|
+
try:
|
84
|
+
server_ip=urllib.request.urlopen('https://v4.ident.me/').read().decode('utf8')
|
85
|
+
except:
|
86
|
+
server_ip="server_ip"
|
87
|
+
|
88
|
+
# subprocess.Popen(f"{config_dir}/update.sh",env=my_env,cwd=f"{config_dir}")
|
89
|
+
# os.system(f'cd {config_dir};{env} ./install.sh &')
|
90
|
+
# rc = subprocess.call(f"cd {config_dir};./{file} & disown",shell=True)
|
91
|
+
|
92
|
+
admin_secret=hconfig(ConfigEnum.admin_secret)
|
93
|
+
proxy_path=hconfig(ConfigEnum.proxy_path)
|
94
|
+
admin_links=f"<h5 >{_('Admin Links')}</h5><ul>"
|
95
|
+
admin_links+=f"<li><span class='badge badge-danger'>{_('Not Secure')}</span>: <a class='badge ltr share-link' href='http://{server_ip}/{proxy_path}/{admin_secret}/admin/'>http://{server_ip}/{proxy_path}/{admin_secret}/admin/</a></li>"
|
96
|
+
domains=get_panel_domains()
|
97
|
+
# domains=[*domains,f'{server_ip}.sslip.io']
|
98
|
+
for d in domains:
|
99
|
+
link=f'https://{d}/{proxy_path}/{admin_secret}/admin/'
|
100
|
+
admin_links+=f"<li><a target='_blank' class='badge ltr' href='{link}'>{link}</a></li>"
|
101
|
+
|
102
|
+
resp= render_template("result.html",
|
103
|
+
out_type="info",
|
104
|
+
out_msg=_("Success! Please wait around 4 minutes to make sure everything is updated. During this time, please save your proxy links which are:")+
|
105
|
+
admin_links,
|
106
|
+
log_path=(f"https://{domains[0]}" if domain_changed else "")+f"/{proxy_path}/{admin_secret}/admin/actions/reverselog/0-install.log/"
|
107
|
+
|
108
|
+
)
|
109
|
+
|
110
|
+
subprocess.Popen(f"{config['HIDDIFY_CONFIG_PATH']}/{file}",cwd=f"{config['HIDDIFY_CONFIG_PATH']}",start_new_session=True)
|
111
|
+
import time
|
112
|
+
time.sleep(1)
|
113
|
+
return resp
|
114
|
+
|
115
|
+
|
116
|
+
|
117
|
+
def status(self):
|
118
|
+
# hiddify.add_temporary_access()
|
119
|
+
config=current_app.config
|
120
|
+
# configs=read_configs()
|
121
|
+
# subprocess.Popen(f"{config_dir}/update.sh",env=my_env,cwd=f"{config_dir}")
|
122
|
+
# os.system(f'cd {config_dir};{env} ./install.sh &')
|
123
|
+
# rc = subprocess.call(f"cd {config_dir};./{file} & disown",shell=True)
|
124
|
+
from urllib.parse import urlparse
|
125
|
+
admin_secret=hconfig(ConfigEnum.admin_secret)
|
126
|
+
o = urlparse(request.base_url)
|
127
|
+
domain=o.hostname
|
128
|
+
subprocess.Popen(f"{config['HIDDIFY_CONFIG_PATH']}/status.sh",cwd=f"{config['HIDDIFY_CONFIG_PATH']}",start_new_session=True)
|
129
|
+
|
130
|
+
return render_template("result.html",
|
131
|
+
out_type="info",
|
132
|
+
out_msg=_("see the log in the bellow screen"),
|
133
|
+
log_path=url_for("admin.Actions:reverselog",logfile=f"status.log")
|
134
|
+
)
|
135
|
+
|
136
|
+
|
137
|
+
|
138
|
+
@route('update', methods=['POST'])
|
139
|
+
def update(self):
|
140
|
+
hiddify.add_temporary_access()
|
141
|
+
config=current_app.config
|
142
|
+
cwd = os.getcwd()
|
143
|
+
|
144
|
+
# os.chdir(config_dir)
|
145
|
+
# rc = subprocess.call(f"./install.sh &",shell=True)
|
146
|
+
# rc = subprocess.call(f"cd {config_dir};./update.sh & disown",shell=True)
|
147
|
+
# os.system(f'cd {config_dir};./update.sh &')
|
148
|
+
|
149
|
+
|
150
|
+
subprocess.Popen(f"{config['HIDDIFY_CONFIG_PATH']}/update.sh",cwd=f"{config['HIDDIFY_CONFIG_PATH']}",start_new_session=True)
|
151
|
+
return render_template("result.html",
|
152
|
+
out_type="success",
|
153
|
+
out_msg=_("Success! Please wait around 5 minutes to make sure everything is updated."),
|
154
|
+
log_path=url_for("admin.Actions:reverselog",logfile=f"update.log")
|
155
|
+
)
|
156
|
+
|
157
|
+
|
158
|
+
|
159
|
+
|
160
|
+
|
161
|
+
def update_usage(self):
|
162
|
+
|
163
|
+
|
164
|
+
import json
|
165
|
+
|
166
|
+
return render_template("result.html",
|
167
|
+
out_type="info",
|
168
|
+
out_msg=f'<pre class="ltr">{json.dumps(usage.update_local_usage(),indent=2)}</pre>',
|
169
|
+
log_path=None
|
170
|
+
)
|
4
171
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
172
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
@@ -1,5 +1,81 @@
|
|
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\x00b\x12\x00\x00\x12\t\x04\x00`\xa2\xa2\xe9\x11\x03[)\x92\x1c\x16\xfc\x84\xde\x16\xf8\x00\x00\x00\x00\x00\x00\x00\x006\x94\xfflro\xd1hc\x8b\xc1=\xd3\xc1\xb0\xa3\xce\xfeg\xb8\xf8\xef\xf6\x08\xf9\xe0h\x9b;J)\x9f\xf2\xdc-\xc9\xaa\xfd\xd2\xb4{B\xfaj\xd3:7\xc0e[\xd4\xad<,\xd4 \xdc \x9f3\x1f\xaa(Ao\x17c\xcd\xa1\xa9\x8a\x88\xb2\xf2=\x04\x8a\x0e\xe7{\x15\xf5\xe6\x87\xb7\x0eNP\xcd\xd4P\xb1\xe5t\x19m\x8a\x11\x9a@}\x80wHbXm\xdb\xc9\x1a\xb9\xe5\x96\xfa\x05\xf7\x0eT.\xddPE\xed\xe2i-\xd5f\xef\xe6?\x1b\xa0$\xd0&\x99D\x18\x8d\xfa\xbb\xec\xbf6\xf5\x12\x9d\xf2q\xc1q\xa8M\xc9q\xbb\x01L\xd4\xae\xd9\xd3\xec\x86mO\xff\xa0{\xa2\x8en8N\xc1UG\xc0\x08\xed\x9a\x9c}Q\x86\xff\xb3\x88\x87z\xce\xb1\xdf\x8d\xd3\x82\x8c\x04\xaf\xf4\xabw:40`\xe59z<-\x1c\xbc\xdb\xa7s\xc6\xb53`6\x06\xbe\xe1\xb5\xb5\x13D\xc4\x9e@\x15f\x92D\xef\xb7\xc1:Q"\xa2\xd1\xe3\xb4\xbd\xf6\xee\x19\x17\xf1w\xb4U\x17\xc3\xbe\xa1\x0f\xe0\xc7\x95\xfe;\x8c\xb6z9\xde\x1eL\x93z\xdf\x00k\xe5\x02\xf8U\xe9\xd5A\x95U\xd8~x:\xcf\xden\xb2\xc7tG3i_\xc3x-\xac\x12IZ\xdb}\xce\xe8\xfelMl6E\x95P\x88Wg;\x83i{\x9f\xf4*\x05\xba\xef\xf6\n8\xab\xecH(\x01@\xcbC\xea}+\xf0P?gm\xfas\xfbU\xd7\xb9\xadL\t}r\x8c\x0c\xd7H\xcb\x97r\x99\nRW\xb1l\x1b\x96\xae\x9d\xf8Pk5\x80$\xa2\xed^\x1b\xab\xc6\xd1\xdb\xa1b@\xf5\x12&+\xa7O\xcdz\xe3\x92\xb9\xc9\x1b\xce\xdc{\x90\xeax\x8fN<\x18\xca\x92\xca\xe5\xdc\xa2\x0fs\xae\xa1\xfd\xd6\xfc\x8d\xc7D\xac\xe2\xce\x90\xda0jZ\xa92\xce\xda\xfe\x08t\xff\x0f\x9d4\xab\xc6a \x05n~\xf8v\xbd"dx\x8b\xa2=Nsg\xef\xd6\xf3\xe7\xd3\x17V\xef\xe0\x8d\xa40ks\xb1bd\x89\xb0\x02\xdb=#l\xd9\xee7!\xdaw&\xba\xc5\x8bo\xd3\x93X\x80\xd2\x04\x08!%>\xc8\xb4\x92\xb7\xdd\x94\xb60?\xfd\xa4\xbf\xb3Uv\x86*\x1aLQ\xe1\x93B\xd2\xf9%\xc8\xd4&\x14\xa3\x18\xa5@\xa5,De5\xb9vW\xd1.\xef\xe3\xf2\xe8\xf5\xb2\xfe\x08\x94\xc9Z\xe7)f\xfbZ\x0e\x95\xc5\xa0\xb9\x88\xf4r\xa0\x0cK\xae\x88dp\x00(Bv\x18L\xa9ag\xc1\x9a\xfc\xa6O5\x06\xca\xcd\xdf\xeb\x9b\x90\xd3\x8c\xdb\x03\xe1\xfe\x06\x06\xf7d\xf0g\xf3\xc6\xc9fO\xe7\xba}\x17W2%\x9d\x02 \x8f?N`\xf4 \xbe\x1cI\x8601\x0e{\t\xda\x06PGN\xb0~\x9c\x0f\xeb\xee\x8f\x01S\xfd\xd5~\x03\xcb\x98\x07\xae\xb8G\x94bM\xd6?\x15\rP2p\x00%\xdd\x8f\xbe\\?\xa32\xcf\xcf\x1e\xa5\xa1\x1b\xe8\xe7\xdfk\xa6\x9a\x17\xa5\x8f)\xfc\xbe\xa9j9X\xc8\xdcv\x9f\x93\xf5\x12\xe0\x95\x89\x8b8\xa5;\xcaa\xc1\x137\xf9dkQ\x7fg\x1cX\xdf\xd1\xe3\x8a*\xf1pS\x99e\xcbu\x81\xf9#3\x17,\x80\xc4\xf2\xac:=\xfd\xfe\xa9,\xc0\\\xc4\xff,\xfe,\x8b\xdc\x1f\xbd\x96{\xe6\xf4\xe1\xdf=O\x87 \x0e$)\xb0z\xb5%\xb3\xfe\xabO\xe4P3\xf2\x8eD4\xd2M)Y\x90\x80\xdd\x01\xa3\xbb^\xa0\x90p\xf5\x9ea\x9bQ \xc8^\xbb\xff\xd9\xa2S\x9d\xe2\xce\x88\xf3F:\x10\x8a#\xbdnF\x98b}\x9c)&o~\\\xd9So\xd2\xec(\xd8|\x9c\xadF6IZ\xc9\x98d\x1c\x9e\x98\x9c\xe0\xea_\\\x0c\x87\xbc\x15\xa0\'\x1d\xc1\x96j\x94\\\xac\xd5\xe6\x8e|\xe8\xf7\x17\xac\xdd\r\x8a\xa9\xcf\xa9\x11\xcc\xf1\x92\xc5\xc2:\x16\xe6\x87!\xe6fqo\x8bU\xbe\x94\xfa\xe0\'\xb3\x05\xc1\x82u\t\xa3\x12\xe2\x88-f\xd8I\xa1w\xaf\x99\x97\x95\xca\x93\xcb.k\x02\xa1\xf4W\x8b\xf5MUs\xca\xd3W\xee!C\xa9P\x1b-<\xb8\x91c9\x9c<\x9c\t\xd6\xa0\xc6g\xd2r\'G\x9b\xd3\x06"\xcf\xda/L\xb7U\x0e\r\xa60.cQ\x01\xc9S:\x80:\xdb\xdc\xf9\xf3\xa8\xa9\xa3\xa6\xd7%\xe87\x1c\xef\xc3\x9cE\xb9\xc9y\xf1T\xdd8\xf5\xd4\xba\xd5\xc0\xa8\x89\x07A\x84\xb4\xd3\x87\x98berc\x9c\x97-vVZ\x13\x0bTJ\x87\xbe\xa1\x11\t\x0bK\x85\x85\xc0^o\x0cm\xd8\xcbs+.Fr\xea\xd6Z\xc4\xb7\xab\xbb\xde\x0e\xb8pKk\x184\t\xf6\xf9\xae\xdf\xe1B\xf2\x83Zy\xeb\r\xad\xd8\xa5\xd4r\xad\xab\x82\x11\x92\xa6\xbe\xe5\x96ms\xc5\x11\xf4\xa5DQ\'H\x86zY\xb0\xf4\x9c\x97\xaf\xb2\xf65ml\x96\xd6\xc2\xaa\xc91t\xa7h\x10\xc6\xbf/\x8e\xa0p\xf3sL\xb4\xcf\xdaH\xc00\xf9\xcaj\x9bQ\xe7\x9a<$\xc0\x14z\x1aF\xa4\xf0W\x1cZ\xc4_\x83\xf3\xca\xed\x1cI@\x0c\x05\x9c10\xcb\xa5Y\x82\xaf\x0f\xcf\xf3\xe9\xb7*\x0e<\xa9\xdf\x99\x87.\x16\x93g\xd5\x06c0z\xeeY\xda\xc2\xefxJU\x03\x93\x1e%?\xf0\x8b\xe3\x088\xffz\x0e\xfe\xd3f\xf8\xf5\xceo\xba\x893\xd9<\xfb\xfe u,\x1e\x8c\xbe\xf5\x0c\x1e\x96)\xe7\xae\x07#\xb4\xdei%h\xb7\x93\xfa\x1f\xaf\x8cuS\xa0\x0e\x8b\xeaP\xc2\x87\x18;\xbc\x1c\x1e]g\x86\xf0H\x82\xa5\x12\xe7\xf7L\xa9\xbc\xd9.\xff\x8fA\x08\x028;9.\xe4\x97\xc6^\xa8\xe0\xa3\xd9\xb7mp\xda\x93\x943\xfdI\x99\tW\xfc\t\xf6]\xf3-Y\xa5\xf4\x05\xda\x83c\xf6\x1f\x0c\x06aB\x81\xc5O\x00py\xed:&_\xe4K\x84\xb3%4\xe7\xfaVF\xcf\xc1\xebq\xbb\xcc\xbf\xb5r\x93\xb7#\xd4\xf1\x93\xf2h\xbd\xb2y\xc1^\x9a\x08\x86\xa3\xbd\xa0\x19\xe2\xa2\xa8\xd8\x89\x8a\x8dL`\x00\x84},\xa3\x16\xf0#\x19=\xb8\xed>\xe2\xeb\x1e\xacxw\xae-\x8c\xe9\xf5~\xe8\x87b\xccjas{\xb4at/\x0c\x90\x13\x98>d@z\xb5B\xe5\nY\xc1(f\x80\xbe\x06\xd4GV\x10\xf2o\xe4K\xe1\x1a\xdb7o\x98\x11\xa1d2\x9cK\xc6\x06B\\Q\xde\xc0G<H\xc5\xa4q_\xca*9\xfdO\x08\x0e\xd8\xbfoa\xa5\xa9-\xb4+\x89\x9bV\xb1o\xa6\x19\x16)\n\xac\xec\x8a3hN\xcf\xf8\r,G\xdcj\x98\xba\x1c\xf2\x8e\xe8n\x88\x1am3\xaa\xe2+\xa8\xd36RG\xca\xd8m\xb0\xf4\xcet\x1c"\xdd\xb9\x05E\x1a\xccd-x>\xb2Wz\xed\xbe\x1c1\'\xda\xb1A5n~\xe38\xd0\x88\x84\xd0\x0b}\xe0\xaa\x9b\xc1P\xb1\x14iy\xa2ui\x11\xbdgv\xed\xca\xed\x9b\x9d\x16D\x91\x82\xa0\x87\x9b\n&0\xef\x9b\x86\x0f\xb6\xc0\xcd`\xbc\x86\xae\xe9\x18\xf0\x10\xce\xd1\xee?\xc7R\xc7\xe0\xbat\xb3\x96\x1f8\x05\xad\xfd7^o\xf6@\x115\x97\xaa\x06\xc9\xfc\xa2#@j\x903\x89\xe9\x8e\\\xcfO\x0cg}\x8a\x1a\x07\xeb\x0bY\xaf\x19\xe41Yu2\xe65\\\xbf\xcf\x95\xfd\xb2\xaa\x8f\xac\xe2\xc2\x01\xe5\xb5\xd1\x01\x99\x82\x1f)\x86D{l\xb7;k\xf9\xeb\x0f"\x13\xf6\x80\xc3p8\x9eK\xb2\xee\x90\xee\x01\xff\xdf\\\xea\x1eU\xc0\xa2\xba\x0bf\xe4E\xde 7\xd2\x9bkV\x97\xe4\xdc\xf9c\x95\x11\x17c\r(\xc5\x99\x96\xe6\xd5\x18\xfaA\x9cjC)\'\x15\x7fI\x0b\xd1[\xcb\x85?\xd2\xd2j\x1a\x8f\xcc\x1a\xa5\x10\x08p\xb6\xd0\xec\xacN\xfa\x06c\x139\xf1s\x1d\x91P\xddG\xb5R\x9e\xa3h5y\xf3f1.Y\x8aPS\x81\xcf\xfb\xa8\x92\xe3~\xbb\xd6F\xf7\'\x0c"\xe6K#C\x1c\xbc\x12\xce\xe4\x1bdO\xc8\xc8\xef)\xe4<\xe1\xf6\xb1\xa8\xbf\xdc\xe8\xa8\xa8\x17K\xc2\xb9\x17\xc0\xc6\xd1\x94\xf6\xc6\x8b!\xeeY\x8c4 H\xc7\x9b\x13n\xfe\x12C\xddW\x96:I\xf8\x07\x89\x00\xcd;\xd1!N\xf0u\xa4\xf9\xc8\x9f\xfe\x7fE%,\xa9\xb1\x1b\xb0\x07&\xe0<\xc9i=\xdb8>\xc5\xbf\x97~\x96\xbcS\xefX\xf2\x15\x0e\xb1\xba\x12\x00H\xac\x01\xcah@\xfc\xde\xb8cI\xdf\xb9;H.0\xac\x91\xa5\xf2\xb4\x8e^yQ\x1c\xa1\xe8r\xf3\xb8\xe8\x91\x9d\xa3\xde\xb89\xd6\xbf\xce=3N\xaf2\xa9{qJ\xbc\xc0\x8a\x89o-\x85\x83\x81=_\x0f)\x1eo\x1d\x91\xd3b\x0e\xbf\x0f\xcd\x97\x93?O\x08\xca\x81\xb7\x9e\xcc\x1bM\xf7b\x0ckQ\xf3\xdc\xe6\xe6\x96Q\'\x0c^\xc8\xa9k\xad\xf1\xa6W[\x0f\x17\x8f\xd3\x19\xf4\xa27\x00\xfe\xa0\x19\xc6\x80\x01H\xe3\xf1I]\xeb{TW\xf8\xc6M\xf5\x16rwc\x985A\x0b)\xe6\x87\xc9\xbb\xe53>\xb20\x8cD.W\xad\x1b\xac\xa9,\x00\xd1\xfd\xb3#\x146\x10!0\xd6\x98\xec\x84\xb9\xf5g\x82\xeb\xa2\xc8\x93j0(\x17X\xb5\x91\xc9\xcfJ$\xf3{\xef\xb5m\x1e\x0ea\xeb\xed\xe7\xbd\xb8K\x18J}\xe3n\xf7\xce\x10z\xc1\x16\x1bV\x96\x84\x89`)\x06\xce\x16$/h\xe8\xe8\xc6\xa5w*\x99\xe8_\x9c/\xa7\xd1\xe3\xed!&+\rb\xa1g\xe3-\x1a\xf0v\x963\x89<gKIj?C\x87\xf3\xc7U}\t\x08/\xb3\xde\x94z\x18\xd6\xae\x03f\xb2\xd9\x99\xc5\x97\xaaw\xd0\x8faMe\xbb?h\x9e\x0e\xc4\x85M\x0b\xe1\xd2\x14\xfb\xa9\xe8\x0b\xb8\xb5\xa2\xbdJg\xa1\x08\x12\x14?\xf1\x1d\xf6\t[\xf7T\xc3\x195\xb7.n\xef\xfa\x88\x905\xd8\x19\xd3\x97\xc9\x1e\xb1\xa5/\x85\xdfffr\t:b\xe8\xaeE)\x97@\xcd\x8f\x02\xe8\xf7I<`\xfb\x19\x16.\x05\xf8\x96\xa4\xa3\x97U\xab\x06\xd7\x9f\xf6[\x84\xa9.\xd7\x0c\x8f\xc5\xb6\x0c\x9f\x07\xb6)\xd1\x1dMud\xa5\xdf\xa8/_\xc3\x02\x92\xf34\xc9\xbf%a\x96\xb7\xe6RM\xeb?\x1d\x15^\x8d\xab32\xaf\xff\xa3L\x1b\xcbY\x89t\xd7\xa0~\x8c\x17\x7f\xe2{\x8c\xe3\x8b\xdd\x08r\x06\x0e+s0\xa4\xd2-[\xc9\xee\xc2$L\x0f8\x1d\xda?\xad#F\xfe\xb7C\x0f\x12\xe5\xa2\t\xdbe2y\xae\x80%+\n\xe9\xeb^Sg\xee\xcc\xceR\x99\xd3\x8f\x1b\x07\xc2\xed\xa8\xbc\x015\x08\xc2#\xf4\xe6/kj?.\xce\xc7\xa6\x94\x15\x19\x13\x9a\x82\t\x1d4\xe2\x9d+\xa4\xe1\xd5\xfd\r\x01\x90ind\xc6{\x1f\xafk*vY\n\x7f\x1d\xe7\xf08\xb7x\xc3\xb3t f\xcc+\xf5\x196\xd5\x85\x05\x9f\x82\xdc\x1c/\xcd\xb5\xd2\xfeB\xdd\xb8.\xb3\x9d\xef\xb7\x03\x19;2`\xb6\xc3y\xe8\xd8@\xaey\xf5\xb93\x00\x96\xe4&\x1b\x93\xc2Zb{\x87\xb49\xf6\xf4\x97f,\xa4\x94\x1eK \x95\xab:\xd3\xf2\xb5\xc7P\xb4\x00\xca]\xec2\xe6\xaa\xb4(\x03S\x17\xc48\x8f\xe8Xe\x18\xe8d\xed\x0e\x8eHB\x1a\x19\xc8\xad\x84\xb5\xd4\xed\xc5o\xec!Z\x98\xf7\xf48\xae\x13\x18\xf7\xc7I\x9f=\x96F\x95^\x13I\xde\x18\x88\x03\xef\x02\x89\xe7\xcd\x15\xa5!\x1d)\x04\xda\x98_\x95G\xe5\x93\x93\xdeY\xa9\x9c\xe7\x12\x8d\xba-\x03\xa9\xa5\xc8\xfc\x86P\x9f\xfc\x11-\x83\xf1\xe7\xe6\xd3\x93Z6\x17\x08N\xa3\xdb\xf8i"\x9c\x13\xa8>\xa6\xf1\'\xe0\xf8\xfah#]\xfd\x05\xc8w\xfc\x1aB\xa1\x01\xb2\r\xdeom\xde\x7f\xc4FL\xa7#\x01J\x92\xd3\xce\x84\x14\xa8\x8axBx\x11\x03f\xb5u\xf5\xd9:(\xc2\xd2:\x06\xb1jk\xd1\xed\xac\x907s\x88\xa2\xe1\xc5\xf2\x7f\x06\xf2\xdc\x0f\xb7\xde\x8d\x97\xa2\xc1+\xcd$h<%1.\x86\xda\x880\x1d\x00\x06{^uX=d\x8e+\x1a\xef\xe4\xb5\x0c\xe1\x9c\x7f^C\xe5H\x8e2\x80\x88\x84\x85\xd1\xedL\xd3\x9c/\x99\xf8E\xa0\x7f\x0f\x10Wv\xc6\xd82\xb7\x84\rT\n:\n\x0e#\x10\x94\xd0\x07i4+$"z6\xca\x0c\x1auL\xa0:\t\x07\xb5\x9b\xea\x11`\xe7\xdf\x97\xe0\xc3\x8b\x91\x041z\xc9\xd8\x1d\x84\x05\xa7\x81`\xc4\xc8\xb16\xa7j\x9bi\xcb\xff\xc3`\xb8j.\x19$\xae]\xef\xd0\xe7\x82M\xd3\xfdW\xd7U\xcf\xbdG\xd5\xb6 \xcd\x01*\xea\xd7\xf9\xc6\xba|S\x1d\xf2\xe5\xf0g\xf0\xc4\x1d\xe8\xd68\xc7\x9dk\x90\'\x96\xe6\xc2\x84\xee\x02\xe3\xdcesh%\xde\xde\x9bd\xb1\xb7\xd6~\xdd\x8b\xac<Y\xf1\x851r\xc3\xa1\x86\xac\xd4\xdc\xa3\x12_%\xec@\x98w\x0f7{\xe6\x82c\xe4\x1f\xe9\x01G@!J\x92!]\x0e\x9c\x93\xfc\x80e\xf0\xa8,\x9a\x9b\xfed\x156\t\xca\x149n\x06\xe0\x9d\xca\x04\xb3\xc1!X\xd3\x00\xb9\xd10\x1d\x88\xb5K3\x11bF9\x95\x8e\x93i&\xb2\x14\xc8\xcb\x0b\x1a\x88ex\x19\xe1\x82^\xfd\xc2\xaa\xd5|\xa2[\xf8\x1bL@\xc0J=\xeb\xfa\x11F\xe7b0M\xd5\xd5\xec\xc3y\xce\xe2\xd1\xf0U\xc1\xda\xec,*r\xfc\x02\xe03\x93yx\xddO9\x9f\xd7\x1e\xfaA\xf0\xce\xdc\x18H:\x8f\xec\r\xed\xbb\x12R\xeds7\x86w4\x91\x85\xdfz\x1eL9\x85\xdd\xbf\x10\x7f\x0e&\xe6\xa4\xd2`G\xd7\xd9\xb62[z\xf0\x0f\x96\xf5\x1f\x1d\xa4\xfe#l\xfaW\xd4\x9c\xb4\xd4x2m\xdbu4Vu\xd5\x18\'=#(m\xc9\xe8\xbe5\'\'\xe7\xf1\xf8\x9c&\xe9G0}6\x99\x1c\x8cI\xaf\x8bj$\xfd\x8e\x97`BR\x94\x97\re\nm\x9e\x07\x9ci6e<\xa9L`(\x8bZ\x93\xc4\xe0\x9f\xd3x\xa2\xca\xc6\x99\xe3\xcal(\x00;\xb7\x08\xfcB#\xcek;!\x9ck\x84\xed5\xd4n\xccK?N"y\xf8!\xfcT\x9b\xd3\x85\xb0<\xe7\xb2\x9fT\xcb/\x03\xe0\x01{\x1f\x90\xd5\xba\x06\x01\xd3\x97\xe01<+\xe2&\x9du\xff#\xca[\xc2\xbe=\x10f?\xd0;\x97\xc9\x87\xd4\x98\x12\xf2\x99\xb2t\xd9\xdag\x89\xa2K\t<X\xf8\xf2\xde\xb2\x95\xf2\x99\x94\xfd\xdct\x04\x990\xc2mp\xa7\x96\x9f\xc0k\x0b\xa5\x18U\xfb\xbf\x8e/D/J\xc8\x0b\xa1\xf7#\xf7\x14.\xc4S\x92\xa4\xb4ZR\xf4\xe1n3\x8c\x7f\x96\xb4O)\xd2\xec\xf7\xb9\xdf\xd2DI\xa7\xde\x9e\xf5\xa3\xad\xf7\xb7/\xc3\xe4\xca#\xc8z<\x9a\xfe\xf4\xaf\xeaB\xda\xfakw|(V\xa8\xba\xf7\xc4F.\x0c\x85\xe3\xdfp\xf14\x89\xa9\xa7\xc5F\x03|K1G\x8fQ>\xd4\xf2\x9dv2\xed)\xa7Ps\xf6c\xdb\x873\tC)\x03i\xc1\xed\xf6\x1b\xa5\xe3\\\x7f\x8bL5v\x7f`G\xe9c\xf9\x8fX$\x14\xbb\x9fO\x7f\xa2&\xeew\x10[\xec\x83\xf5\x01\xd8\x1b\xe22\r:C\xdd\x00EN%\x87\xdd\xdf\xd3\xcb\xe6\r\xc7\x84u\xb91\xa9\xffha>\x8c\xe4\xea\x03+\xff\x82]\xdc\xeb\x87gNbb\xf2y\xea\xa4\xb6\x13[wj\xca\xdeB3f\xdc\xe9RS\xc2\x82Z\xfa\x81>\xed\xd3|:\xaa\xb2\x04\x91\xc7~I\x8b+\xcdz):507\x1b5\xb7\x1b\x01\xef\xa0"V\x13\na\xd1\xf2\x12v\xf8\x1d\xc2\x94KJo\xb5\xb3\xd5\xcc\x08\xb94\xf9h\xaeB\x8a\xc0\x10O\x1fR\xa9q~\xbc\x1d\x85\x9e9\xe0"\xc1\xd8q\xe9\xb3w\xc3Xml\xd2\xe0\x1bf]s\xde&TU\xea\x13\xe5\xa4\x95w\xa3\xa2.\x8a\xcbfF+|w\x9a\xa82\xe8\x8e\xdaW\x1c)\xde\xaa]J\xab+\x10\xb8m\x1a\xa0\x86\xbf\x8d\xf5\xc3\xd5\x82\x18\xbe\x07\xb6\xce\x0b\xdf\xb10\xdb\xd0\xfck\xb0\xa65\xaf6a\xed=\x03;`\xfc\x07\x14Q\x05crf\x1e\xd1p<\xda\x18u-c\xe8w6\xf7\x08\xd4J\xe1\x00\xb6\x181"&\x95y(\x16V\xb7\x94\xa2\xd3\xac\xf7\xc6\xff"\xd6\xf9V\x15\n\xe6=\x17x\xf1)J\xcb3Wf\xc4\x1b?@\xb9\x1d\xe5\xbe6A=\xb4S\x07\x94\x1dJ^\x9e\xccN\x8fYIm{\xde0\xb9C*\x89\x18j\xc5JY\x9ae\x8d\x02\xd1w\t\x8f\xd2\xc4\x88-\x00\xeb\xb6a\xe6\xe7i\xa1\xb8\x15UN\xc7o<\xf6p\x8c\xe1\x96\xcax\xb0JA\x19=\xda\x99\x90!\xba\xa3Y^+\xaf\xb3lJEz\xaf\xfa\x93\xc4\x91\xfe\x15\x9c\xc8\xc4OGy\xfe\xfa\xa6I\x08r*\t\xa6\x1e\x1f\x9d\xf4e\xa0\xf6\xda0OU\xc5\x04\xfaIP<U\\*\xb0\xac\xd1\xb1\xa1\xa3\x95u\x00\x18\x80\xd7\x1a\xb4\xcfm\xed$\x14P46?f\xb1\xbb\xa2\xc9\x8dF\r\x91HV\x07\x9b\x81$\xc65\xb2\xb8\x9d\x98v\xdd\xb5\x847\xb0\x02\xbc\x05\xe4\x83(`^#\xb0\xcd\x08M\x11I\x8c\xe5\xf2\xc7\xf5t\x14|\x07\xe15\xe67o\xa6\x10\xb2\nN\x98\xf5\x8b\xac \xaf9S\x02\x7fN\x8d\xd2\xcfvzD.[\x879Q\xabI\xc1R\xcd\x0b\x07n\xad\x1cf\xa1\xad\x9b\xb9\xde\xfbf\x0b\xb3\xe7_1 \x90;\xb5Z\x02\xd1j\xf8n`\xd0\xca\xef\x1b\xcb\xed\xba\x81\xe7\x99\x88\x16\xf7\'4\xd8BW\x94\x0c\xe0\xcc\x96\xda\xdb\xc4Z\xd3\xf4Uo\x15g\xfe\x9bNT\xe39\xfe|\xa4\x83\xa38D\x97%\'P\xd0\x852\x03\'V\r\xd6\x03\x19\x90;\xbb<\xae\xfc\x0eH\xfbj\x18\xb3yV\xcf\x97\x16\xdd\x08\\\x81b\xb5+\x86\xda\x05\xdd\x81\xe4,@\xa71\xa5\xed\xd3H\x94;\xbbI\xf6\xb3Z\xf8\xc1\x83\xb0\xd6\xf7;\xb0I\x90\x1d:\x86jHq\\\xae\x10\xa4\x13\xb6`\xaf\xda\xe7YNiH\x15v\x95\xachq4*\x86\x8b\x07Q_J_\x06\xc1\xb5\xa01!\x15\xf5\xe7\xcf)\x17\xa0 \xb07\x9c\xbao\xaa&\x17]S\x8f\x1d\xed\xc2\xbe\xa7=N\x93S\xd9?\xe1"\x10cf\xccn\xf6\xf5YXA\xb0:\x06\xfb\xd6\xe10kG\x956Q\x07\x05\xd5hgt\x93\xbf@\xdf\xf5c\x9b\xb4\x9bm\x08\xa0cK\xda\xe19yLRy#\x05{\xdb\x0bdv\xb9(\x0c\xe5\xb6\xd4\\\xfa\xe3\x113\xf7V\xca\x11\xf9\xa0\xec&\x87\\C\x8d3\xd3\xa9\x19<\xb4\x0f\x80OV\xe7gEb\x8a\xe4?\xce\x91a\x1a8N\xealc\xef\xa9\x1f`\x18\xc9\x03.\\\xb4\x9fo\x99N8\xfd\xd8e\xde\x1e\xec\xf3\xe0\x86i)L\xfez\xee\xaa\x96[.\xae\xeed\xb1\x9d\xc0pm\x11{\x8fj2\xa9\x01a3\x12w\xa6\xbf\xee\x82\xf2\xadY`\x0c\x9f\xef\xa4\xa9\xe5\x8b\x006k\xc0\x9a\xfaf\xb7D\xd6f\x8a\xe2;\xe3}\xe51\x01\x89\xb6\xc7\xadY\x8b\xce\x07d\\L2\xff \xc9\x8e]Ld\xbd\x81\x8e$\x90jmb\xb9\xc9\xa8=\xaa\xdd\x9d\xd3\xae\x01\xb3\xfe(\xa5\xc0N\xd9p\xa7I\x10\xbb\x10?\xc4UtC\x03\xf49\x9a}\x90\n/"\x11\xda0\x114S\xcbv\xe0\xf6\r\x8e\xd8\x13sA\xeap`\xe6\xd2V\xad\x98u\x1f\xdbw\xd1\xe1({\x87\xf5\x91\xd5X\x81\x8b\xc1\xa3\x12]\x8e\x88\x9a\x1c\x80\x18\xe0\x9b\xa2nT7\xc2i6S\xc3L\x90\xf2\x05\xcd\x9f/~MY\x11\x18q\xc5\xbe\x17\x97<\xd3\xe3\xb1M\xd69h\xf3\xfd\xb5\x8cB\\\xb2XR\x02&\x9eqzP\xafu\x0br\x1e')
|
4
|
-
|
1
|
+
#!/usr/bin/env python3
|
2
|
+
from urllib.parse import urlparse
|
3
|
+
|
4
|
+
from hiddifypanel.panel.database import db
|
5
|
+
import uuid
|
6
|
+
from flask_babelex import gettext as _
|
7
|
+
from flask_bootstrap import SwitchField
|
8
|
+
# from flask_babelex import gettext as _
|
9
|
+
import wtforms as wtf
|
10
|
+
from flask_wtf import FlaskForm
|
11
|
+
import pathlib
|
12
|
+
from hiddifypanel.models import *
|
13
|
+
from hiddifypanel.panel import hiddify
|
14
|
+
from datetime import datetime,timedelta,date
|
15
|
+
import os,sys
|
16
|
+
import json
|
17
|
+
import urllib.request
|
18
|
+
import subprocess
|
19
|
+
import re
|
20
|
+
from hiddifypanel.panel import hiddify
|
21
|
+
from flask import current_app,render_template,request,Response,Markup,url_for,jsonify
|
22
|
+
from hiddifypanel.panel.hiddify import flash
|
23
|
+
from flask_wtf.file import FileField, FileRequired
|
24
|
+
import json
|
25
|
+
|
26
|
+
from flask_classful import FlaskView,route
|
27
|
+
|
28
|
+
class Backup(FlaskView):
|
29
|
+
|
30
|
+
def index(self):
|
31
|
+
return render_template('backup.html',restore_form=get_restore_form())
|
32
|
+
|
33
|
+
@route("/backupfile")
|
34
|
+
def backupfile(self):
|
35
|
+
response= jsonify(
|
36
|
+
hiddify.dump_db_to_dict()
|
37
|
+
)
|
38
|
+
o = urlparse(request.base_url)
|
39
|
+
domain=o.hostname
|
40
|
+
response.headers.add('Content-disposition', f'attachment; filename=hiddify-{domain}-{datetime.now()}.json');
|
41
|
+
|
42
|
+
return response
|
43
|
+
|
44
|
+
|
45
|
+
def post(self):
|
46
|
+
restore_form=get_restore_form()
|
47
|
+
|
48
|
+
if restore_form.validate_on_submit():
|
49
|
+
file=restore_form.restore_file.data
|
50
|
+
json_data=json.load(file)
|
51
|
+
|
52
|
+
hiddify.set_db_from_json(json_data,
|
53
|
+
set_users=restore_form.enable_user_restore.data,
|
54
|
+
set_domains=restore_form.enable_domain_restore.data,
|
55
|
+
set_settings=restore_form.enable_config_restore.data,
|
56
|
+
override_unique_id=False,
|
57
|
+
override_child_id=None
|
58
|
+
)
|
59
|
+
|
60
|
+
from flask_babel import refresh; refresh()
|
61
|
+
from . import Actions
|
62
|
+
action=Actions()
|
63
|
+
return action.reinstall(complete_install=True,domain_changed=True)
|
64
|
+
# hiddify.flash_config_success(full_install=True)
|
65
|
+
else:
|
66
|
+
flash(_('Config file is incorrect'))
|
67
|
+
return render_template('backup.html',restore_form=restore_form)
|
68
|
+
|
69
|
+
|
70
|
+
def get_restore_form(empty=False):
|
71
|
+
class RestoreForm(FlaskForm):
|
72
|
+
restore_file=FileField(_("Restore File"),description=_("Restore File Description"),validators=[FileRequired()])
|
73
|
+
enable_config_restore=SwitchField(_("Restore Settings"),description=_("Restore Settings description"),default=False)
|
74
|
+
enable_user_restore=SwitchField(_("Restore Users"),description=_("Restore Users description"),default=False)
|
75
|
+
enable_domain_restore=SwitchField(_("Restore Domain"),description=_("Restore Domain description"),default=False)
|
76
|
+
submit=wtf.fields.SubmitField(_('Submit'))
|
77
|
+
|
78
|
+
|
79
|
+
|
80
|
+
return RestoreForm(None) if empty else RestoreForm()#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
81
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|