hiddifypanel 3.0.0.dev63__cp39-cp39-manylinux2014_x86_64.whl → 3.0.0.dev65__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/templates/config.html +1 -1
- hiddifypanel/panel/admin/templates/proxy.html +2 -2
- 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/home/multi.html +1 -1
- hiddifypanel/panel/user/user.py +233 -3
- hiddifypanel/static/css/custom.css +11 -0
- hiddifypanel/templates/500.html +1 -1
- hiddifypanel/xray_api.py +109 -3
- {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/METADATA +1 -1
- {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/RECORD +69 -71
- hiddifypanel-3.0.0.dev65.dist-info/top_level.txt +1 -0
- hiddifypanel-3.0.0.dev63.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.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/LICENSE +0 -0
- {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/WHEEL +0 -0
- {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/entry_points.txt +0 -0
@@ -1,5 +1,130 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\t\x00a\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\x1b\x1e\x00\x00\x12\t\x04\x009\x0fl-\xf6l\xf7\x9a\xc7\xef\x84\xd8\x0eE\xcc4\x00\x00\x00\x00\x00\x00\x00\x00\xdc2\xe6\xd0\xc3st\x8a\xa4\x83\xa7M\x9c\x01\xa2\xe52\x0b\x89\xb1\xca\x9e\xf5\xdd4\x15\xfa\xdbm`\xd4\xf0\xa5v\xef7\x1d\xc6\xb9\xdcq\x19\xf1\xf1\xa8\xe3\\\x9f\xd4\x8f}\xc6Rr\xd4\xe8ml\x11m\xfb\xd8\xf4\x973\x01\xde+~S\xbfuj\xc73\xf2n\xab\xfe\x16A\xa7\x1a0\xee\xf4\xa70!3\xcd18\x9d\xdd\xae\x06t\x14\xf8\xfa\nC\x81\xfc\xd8\x84%\x99\xd66\xc2\x90\x08,\xe3zC}\xec\x83o\x8c\xcaYK\x87\x98\xd0\xc6/\xc4\xa7\xa0\xae\xce,\xdb\x05\xcc\xc9\xd06 \x8a\xa5\xf8\x14f\xdd\x05v\xab\xa5\\\x00\x8a\xde|{NLJ\xc6\x80\xf4Z\xfaG\xf0p\x82\xcfk\xa9\xd5\x02\x02\x8b!\xe1\xdc\x18\x12 G[\n\xc8\xbf\xc3Q\xbdPU\xfcYUQ\xd2\x1e)k\xae\xd9\x8e\xa6\\m\x04t\xc0\x7fw\xab$s\xb9\xd8s\x8cj\xdeZa";\x7f\xb1\xf7q\r\xbc\xbe\xf4\xbdI\xb5\xd8P\xbbob\x81/\x91AE\x0c>)\xfc\xaf#.\xac\x92\x96\xbf0#QB\x7f\xb1\xcfb{\x14\xea\x99Q\x14\xe8\xa4+\xde--\xaa\x9a\xac\xd0\xd4\x8d\xf1O\x12\xce\x91J\x06Z\xd82\xaf\x89\xee\xe4,\xbf\xfbtj\xaa\xae*\xae\xb07\xc1\xd40r\x03\x85\x8c-\x8cm\xe0\xc7[\xc6j\x91\x1a\xabi\x9c P\x84\xcf\xe8\x92\x7f>`\x12B.E\x8f\x97F\x04\'\x9f\xb1j\x07[W\xd3a]\x8d\xf4cJ\r\xca\xa5\xe0\xce\xef\xf1\x91\x9e\xef\xa6\x87\x14\xe7\xf0t\x0c\x08\xc1_\xd5\x13\xee\xf6\xfe\xc0"D\xd6\xa7{\xbb5\xabh\x08Q\xc6\x98\xc6\x17\x8ft\xe7\xf0;\xe1\xb4\x19\x80\x062o\'s\xbfLG\xbe}+\xa5!\x0b;\xac\x013\x89o\xe7\x84\xc8yu\x8c0\x0c^\xb91\x1f\x1b\x18\xb0h\xdbY\x18\x01\x0f\x86\xc31\xd3\xb0\xd4\x11Gp\xed?\xc1\xa5BS\x9c\x02\x87\xc2\xa7\x96\xac\x162\xe5\xbf\r?\x1c\xb6w"\x16=\x96\x87\x98~\xce\xfe"\xee\x9dN DU\xa3\x05\x1e\xe8\x818\x04{\x14\x9e\'\x1abf\x9e\x99e>\xcf$\xc7Z\x91\xb2x\xbe\x95\xd7Z\xc2\xc6\xc7\x97}\x8d+\x9e\x90\x1e15\x87\x83\xb6:\xdd\xe0\x9a\x11\xbd\xa6N2\x89\xd8\xa8\x0c\xe1\xff\x05UC\xe3y)\xf1\x8fsz\xa5_\xe2\xa7z\x1dx\x02\x19\x88YI]\nf\x8d\xa16\xd2\x14\x9c\xbc*QM\xe6\xaf\x0ckZ-\t\xd0{?hg\xa2j?\xd6\xfdYGxS\x95\xf7\x88\x94\xb4eT#b\xca4\xa3\x05Q\xc6&.\x14O\xd9\x98Q9J\xdc2\xe0\xe9f\xf3\xefb\xda,I\xb5s\x86\r4\xd6_\xc0\xc6\r[\xffi\x13t\xdd\x10oL\xa1!r-\xe80\r\x8e!zB*\x04\x0f\xd03\xd1\xcag\xd8\xe5[#\x11Cd\xe3\xbfM\x1c\xdff:\x11\xb6\x83\xc4\x16\xb9\xa5\xb6\x9e\x8b\xefG\xe3\xb9wmW\x0b\x97\n=\x8c\xbe\xc0\xc1\r\xd9\xa5\\N\x9b\x92\x83K|\x9bN\xf6U6ipEL\x920\x99\xb4\xf5t\x7f\xc8\xccu\x1d\xd5\xa6\x8c\x1f\xae\x88{\xd2\xa82\xcb\x81cSp\xbdr\x15\xd7\xfa2Q&\xd7\xb3\x93\xbd\xa3\x97\x08\x12nX\x84\nK\xfc\xceG\n\t}$\xd17\xeb\xdb\xc5\xfd2\t\xb6T\x84g\xa0\xd9\x92So\xd7~*\x82|\xc0Z\x01\xd7\x8d\xa0b\xc6\xc2\xde\x8e\xe9\xcd\xe2\xac\x86\x87T\x86\x9d~\x07+}c\xc1\x86\x85\xec7\xa1\xdb\x8b\xa2*\xba\xd6\xe9W\x12\xe3\x81\xaf\x07\xe1\xab$\x91\xc1\x94\x01\xb3\xd6!\xc6a;\xa7\x9c\xba\x18\xb1&\x14\x8d\x81\x8a1/\xd34\x01X\xbe\xa0\xc7\xb4iI6\xb2\xd7\xf0Q\x9e^\xc1\\\x02\xfaJ\xf1T\xb2b\x9f\xd2\x87J\x7fg\xc0\x199\xd0\x84\x18\x80\x08Q\xf2\xe3_\x94^G\x80\xf97\x85\xe3j3\xbelp\xa4DG\x05P\xb7\x87c)P\xdd\xdd\xcdx\xbf\xe7+\xb0G\xc9\xc1`H5\x01\xc1\x850\x07\rzk\xb9M\xf4\x8b\x85G8\xe1\x03\xc1\xd7\x8f\t\xf1\x9c\xa1[\xbd\x98F\x93\xb0<\xe0>\xbc\xe1\xc3\xaeQ\x1f<8\x1e f\xf40(Q\xebY\xe0Nk\xfec\xe4,\x8f\x8a(\xcd^o\xf9\xaf\x8f\xa7\xfds5O2v\x0e+\xd7\xf1\xb3\x82-\xf5\xe2bO}F9*\x11o\xb8XML\x16\xb2n\x9c\x04\xa0\xcfB\xfb[$\x8a\xc9&\xaa\x82\xeb\x93\xae\xc3\x17\x87Am\xf9\xb2ZD)y\xa9v\x93Y\xd4\xc4L\xa2\x07E\xe5jmH\x9b\xc6\xd1\xb1\xcd\x06\x10;\t\xda="\xeaX\x05\x151\xe5\xa3\x945\x15A\xe6),\xc6/\xef\x00\x18\x05\x13x\xfa]\xc2m3\xbf\x86\xc0\xdd\xc76\x19f?jR\x8dLw\xa6\xb0=\xc3\xf4]\xec\xe8\xa0\xd0\xff#S\xc5\x880\xf4\x11^\xd5\xc4\xf1/\xbaH\x9b`?\x9fx\xb2\x80\x18%\xdd>\xeb\x84\x92\x14^\xe9\xd2\xc6\xc7\x0c\'\xf0{7\x81\xd3"{\x8a\xd9\xb15\xb0ok\xf2\xb9#v\xb4\xd1\xbe\xb6/\x98&V\xf0q\xcf\x83\xbc!\x84\x1ed;\xe4\xde\x0c\xe7x\xa4\x02\x93kH\xad\x1e\xeb\xad\xc2\xaa\xf8\xa4 \xb7\xf7\xa5\xb0r\x19\xcc\xcch\xb0mv\x00@\xa2J\x05\xafc\xfb,\xf7X\x1dZ\xe0\xb1\xe1\xcfIy\x00>P\x9d#\xd2#*rbm\x86Y\xdcZ\xad\x18\xaa\x87?\xefb\xcc\xfe \xaa9\x15\xd8\x95`{n@\x11\x90P\xdd\xcb3\xa0\xc6\xe1\xa9\x0e9lMv\x18\xf1O\xbcz0\xf9\xa5\xffg\x08\x8b)\x8b\xfb\x08\xab\x1fX\x81\xae:\xeb[\xb6\xb1\xe5\x97\x91\x97+T@\xc7xS\xdeA\xd5\x1e\xc6\xb1l4Sy\x89DXRp*h\xd3\xa2\xe1\xb7\xfa\xbbS<\xe2g\xcd\xcc\x84"$\x84\x97FnRU+\xff\xb0\xfbF\xed\x99\xb6\x08|\xd6!r\xf3\x1e\xeaRO\x11zZ$x\xe0\xd6paV\xe4\xb2\xd1|&\xf1\xabD\\t3\xe9\x1e\xba\x91\xa2t\x91n\xc7\xa7\x87\xff\xdc\xe3\xb8\x06\xb2\xb7\xa4R\xad\x0c\xd8+\x11\xf3\\\x8d\xc7\xc1\x07\x9e\xa0#\x9f|\x1c\xc9\xe5*\x90E\xa7\xd8E\x0c\x9e\xcb\x01\xce\xde\xb4c5B{\n\xcd\x0c\rk5}SXt\x0c\xb4@4\xe4Y]\x90|8<\x8dco\xcb\x08m\x1a\xbb\xdb\x0b\xf0\xe7\xd4\xc0L+#\x7f\x9d\xf9\xf8=\x07\xd6|\r\x83\xd5\x04\xdc\xb9\xb2L\x9b\xd2\xc3q?wlK\xce\tK\xd8\xb7\x01\x8c\xa7\xe0\xcd\xab\xe0\xa8!\xc1 \x94U+s\xf0g\r\x9eb5\xc0\xb7\xce\x00\xbb\x1b\x9f\x1eW\xcc\xd9+\x92\xc0tY\x83\x98\x8bb\xfaL\x00#:]s\xaa\xf39\xf9\x7f\xde=_\x08+!\xd3vk\x8d\x13\x07L\xf2\x9e\xb5q\x9a\x10\xc2MJ\x82\x9e\x8f\xbf\xd2B\x9e\x12\xbf\xd54\xff\xc1X\xdb\xe0$T\xd3\x90\xd0\x1d\xbe\xf9\xf6Y\xd0\x9cD\xf8u\x80 \xe0\xd5\x95\xd6\xd4;\xce\xf3\xf5d\xdf\xdd\x133\x06!\x05s{r\xe4S\xb4\xeax\xa5\xb9:\xe0\xfa\x1f\xf3\xaa\xcc\x07\xb8\xa7 \r\x8d.v\xf6\x9c\xd74_*1\xce//\xaa\xe0y\x17\x9c\xb8\xa54\xb8\xd9Cy@\x00\xe5\xd2\x93[\xf6@\x1c\xab\x96\xbdC\x80]\xd5W\xf6\x84p\xd4o\x144\x9e?\x81\x0eg\xb9\x8a\x8a\xe1i\x10\xd9\xbf\xa0\xbf\xe8Z\xaeH\xdc\xe6\xe7o\xb2\xe5\xb5!\xc4\x10I\xae\x9b\x17Yf\xa0\x150\xcd\\\xf6\x8c[7\xd3\xc8mT^7\xd99/\xf8\xbc\x15\x8d\xeb\xdb\xc3\x07&$\xe6n\xf3s\x1c\xba\'\x93\xf7\xc1\xb2y1\xae\xd7B\x93\xadH\x80\x1d\xc4\xcc\xccJ_\x0bmA\x05\x15\x14\x80\xab\xe4\xd7\x0b\xdb\xa9\xbco\xde\x07(T\xc5m\xe5\x96\xf9\x01#\xbf\xe2\x80\x03@\xf9f#O\xe8\xd3\x8e\xf3&\xbe[\x12\xd9c\x9f1\x9b\xcd\x86C\x14\x82\x92\x8c\x01\xf4\xd7\x15\xb3<\xf10\xcb2\xae\x1a\xc8\x8c\xd7h1\x86\xd4"L\x8b\xe2d\xe4\xac\xe1$\xc5\x9b\xeb)\xa6\xe4OH\x95\x1f\xcb\x9a\xb3\xdf/\xbb\xee\x90\x02\xba\xe3\x1c\xfd}p!\xf7\xd8Z\xb0\x87\x1d3ru#\xda\x03Q\x1a\xd9%\xd4\x83D\x17\xe4h$\xaa\xff\xac\r\x19\xfe\xb6N\x94\xc8H\xe3vY\x86\x9a2\xa3}\x81\xaf\xfb\t\xffj\x1a\xd7\xe6W\x80\xedL\xd6wE\x1b\'\x9f\xa7\xc9_1\x1d\xd6\xc1Z\xc5\x193k\x94X\xc0\xfc0^Sm\rWx6aN\x83\xca\x11\xde\xfc\x18\xf8\t\x8cj\xcf\x9f\x96-\xb96\xa9pM\xf4\xbb\x87\x99\xdf\xf0b\x17\xd5:\xb4\xe0\r\x90\xb6\x18\xa2=\xf4\xc6\x93\xad\xde\x18\xb5\xb5\x11n\xce\xe6\x00\'AO\x97\xc0Mr\xefS\x81\xfe7\xf1\x0cPAh\x87\xcd\x82R\xd6\x0b\x17\xde\x9e\xc3\xb3P\xc6\x9b%\xf7\xfb\xb2\x9c\xbb>\x16\x8d|2\xb2\x82V\xb8\x85`\xa1\xfdio\xfec\xdd\xf8\x1a\x15\x9e\t#\xe3\xa1]\xc78A\xe5U\xb3n\xcd\xf2U\xc4\xae\xa5\x9fr\xdeu\xc5\xb5\xbd\xb03g\xabZ\xee`\x8a/!\x91\x92\xce\x1f1J\x04\xe9lV\x96QY\xa1\xe8\x92\xea\x06\x9c_b\xf3r<\xc0\x1bh\xfbD$\xc2C\xbd\xd4\x8cq\x08;\xf2\xa6[\xb2\xa4r\x12\xe1\x18\xeab\xbbH\x0b>\xce\x7f\r\xb0\x100wV\xcb\x95\xb9b8X&\xa9\xac8u\xb0sb!\xa1pm\x8cd/P\x9a\x84\x1bl\xf6\x0c\xae\xf9ev5\xaa\xbe\xa2\xd0\x87\xba!)\xfc\xe4\xb2oi\xbd\x14\x08[&\x18\xe9yxR\x9eZ\x82G\xd3\x8f[\x83\xfd\x11<\xc4}7;\xfb\x8d\x9a\xe3\x93j7\xfe\xf1A\x1e\x11\xabq\xaaH\xa3\x9fk\xcd\xa7\xa4\xf3Rb\xaa\xa53\xaaD\x12\xec[\x00\x06\xc0\n\xb4\xeb\n\xed\xbd\x04|\xa7b\x8d\xd1\xe0\n0pc\xb8>\xf6\xc1\xd2r r#\xb3@X\xe5\xc07g\x12.Q\x19Zs^\xfa\xb7\'\x8e\x17\xfe\xe8\xe0Sg\x03%\xbcx4\x80\xa3\xa2\x80\x87U\xa8p\x8bRj\xdb\x08\xa7\xf5A\x8bAM\xba\x84>\xfa)\xbd\xf2\xc3\x9c\x9c\x17pe\xd2\xf7pl\xe0\xf4\xe3\x04\xbb\xa3\x14h\xfc\xd5?\xaf3a\xa5\xfa\xe3\x19\x1cS\r\xa0\x010l~Z&\x8d\x9d$ \xdb%\x08{e1\x03g\x83\x97\xdd~\x8b?\x9btQ\xe7\xdc\xee\xc2k\x08\x19\x05\nR\xfb\x1aV6#\x97\x14m\xa4\x85o?%\x86\x1d\x87\xc8p\x87\x19=F\xea\xaf\x12\x85 k\xe1d\xe6{\x1010\n\x8d|\xce\xeeh\n%\xd0\xa9\x84\xf8\r\x93\x8f\xaa\xd7\xbbdj\x04@t\x15\x063j6\xa2\x83\xa6\xcci\x9aOk\xe5\x1e\x82\xde\x12\x95\xca\x8a\x95;\'\xb8\xdd\x19\xfbSh\xd5\xb7/\xbf\x121T\xc1]\xba\x07\xc1\x1d\xc1$R0\xa2\xeb\xca\x04\xb5\xf2\xe0\x81\x83\x8b\xf4L\xd8G]b5q\x10)\xe4\xac\xd0\x910 V\xae\xc2\x80\xdfB\xa7:\xd0\x95\x88\x17\xe9\xb45\x01\x9cS\x8e\xef\xb7.C\xcd\x9f\x16\x07N}Z\xd9\xc8t\xd9gT%\xa5Y\x9dk\xce\x01\xb5\x99F\x0bK\xda\x15M\x1d\x9e}\xcb9v\x99\x1c\xcd5\xe7\xad\xf9\xc2k\xd7?61|\x7f\x92\x11\x8c\xcd_\xec}\x84\x8eF\xc0\xe9H\x99\xf5\xb8\xb0E\xda\x83V\xd0\xde\xb7@&\xb0+\xf4j\x8f3\x00#]\x8f\xb0\x15v4\xb6\xdf\x19\x12&{\xe3\xc7u\xf4%~\xa1\x19\xb2\x11\xda{m\xf3\x02\xc1%\x00\x1f\x17\xf56\xa2\x99\x02%lJ\x8fgKD\x94\xe2!\xe2\x02\\D>x\xfc(\xfb{\x14?q\xc59\xdf\xed}\xc8"\xa1\xe8,_|\xcd\x1fwYh\x9dj\x16\xdf\x19\x12v\xd1\xc9R\x08\xa1\xbe\x7fe\x16\x8d\xf0e\xd6\xfd\x11;\xc3\xcco\xfd\xc6\xbd\xded\xed\x89L\xdf\\$l6\xb0(K|-\xd6A_M\xf3\x04\x1ao\xb5w]\x85y\xdc(\xad\xcf\xc7\xfaQ\xb5\x87\xc0\xfd\x90!\xd5-\xc0\x16\xb0\xce\x11\xfcg[\x1b\x99\xbe\x93\xb3\xac\x07\x94\x84\x1b\x87G\xdd\xad\xb13\x87\xa3\xfd\xf7\x0eW^\x1d^\xb6Ik:P\x85\xec\xa7\xd9\xec\xe6"e\x8bhp\xdd$p\xb5\xf7~\xba\x1e\xf79W\x88~\x13\x19\x82\x9c\x08\x8e\x9fP\xccA\x7f\x9bh\x8a\x91\xa7,\x86\x97d\xa1\xa4\x18\xffj\xa4z\x95\x83\xf7\xb3\x7f\xa6,\xb3\xfb0>\xea\x90\xe0K\x94\xe9t\x8b4\xd8\xaa\xca\xa4|\xd87\x80\xb3\x16E`\xcf\x9a\r!\xf2\xc4ae\x81\x891\xf0R\x80\xf4E\x1e\xdc^\xbb\x07\x930\x12\xe4\xee\xed1\xc4\rI\x945Z,\x02\xde\n\x14-\xa5S\xc4\xf2\xf0Lr\xbe\x14\x8a\xfe0\xef\xc4\xcd\xe0,\xceS\xe1\x12\xda\xf4\xf6\xb9\n\xd8<\x9c\x8fOv{\x87\x8f\xc5cCX\x0cO\x92DB\x00eT~\xe4.\xf1\xcb\x18\xab\xde\xfe\xad\x0c8\x05@!\x90\xac\xa5*:\xd0\x08\xf6\xfb\x00\x8d3xJ=\xd7t7\xbb~\xd61;\x83{ \x9ej\\T\t\xf2*\xbfQ\xce\xae\xfd\xb8\x9c\xccRs<\xb8\xfb\xe6\x89\xfa\x9d\x8e\x9d\xb7p\x1d\x19`\xc7\xb0z\xcc\xd7\xbf\xd4\x0fF\xcb\xe1\xa8\x87\xdet\xddW\x8el\x81P\x89\xeegS\xc6\xaaW\xb5\xca(;^VcOB}\x94\x93L\xf1\'\xba\xeaS+(q\xd9\xba\x95\xe1(\xea\x8d\xae\xb4\xbbO\x149\x93A#(\xed\xfd\xc4F\x87\xb9`D+\'.\x107CR*f\xe2>\x0f9F[d\xcd\x0e\x04\xb9\x98\xfe\xc8$\xfd\xfe\tN\'\xfbS3\x1d\xbf\x02\x18\xd1k\xb1\x1f\xad\xb0a\xfc\x14\x08\xbf\xebij\x95\xab1\x7f\xc8\xdf?\xe1\x96A\x9bqa~\xae<\xc5&\x01J\xd3\x0cD\xcd\xa6\x139\x9f.\xbev\x17\n*\x8c&\xb4`m4\xcb\xfaj\x0b\xa1h]k\xfb\xb1=\xf5\xb5\xb8"\x8e+>\xb2o\xc5f\xa5\xeeH\x8a\x88E\'\xde\x06B2\xd7\xfeC\xa3\xa07\x07?n\xcf_XU\xa1XH^\x95\xa1\xe7!\x84\x846.\xdb\xbb\xe5E[\xa3\xcfD\x1eX \xfc\xb2\x05\x94\xe0*~\xa7\xda\x7f\x9d\x9e\xc7\xc1&\xaf\x95\x92\x19(=\xceF\xef\xe3\x8c0\xe7\x1b`^`\x0f\r%n\xfd\x9b\xf4x\x9d\xc0AO^s\xac\x8f\xc1(\xaf\x1c\xcf/,\x19<.\x1b\x1f(\xbay\xd7\xebJ\x16\x9f\x95\x84j\x0fT3\x8b\xe9F\x97:\xdf\xa4\xcf\xcf\xca\xe8\xf6\xa6\x8bJ\x17\x19QaL\x1e`Y\x19\x1a\t=\xb0T\xc7\xa8\xfd4\xc5\xbf\xc6\x97Kd\x08Mf\xb6\x16\xdb\xd3\x176\xaeW\xafW\x80%\xff\xbfbw\xbe\xacA^\x12\xb2\xf9\x96*Us\xb4j\x92\xaf\xb9\'\x81\xabG\xbd@Q\x0ey\x07\x10\xa7X.\xb8\xef\xa9\x18=%\r\xc4"\xe4\x9b\xd2?\xafF\xc8\xfa\xac\xba\x7f4>gbK\xca:\xc1\xfe\x82\xba\x8f8S\x9a =\xf2FH8\xd4yx\xeb\xabMe"C\xdc\x06\xce\x05\xe04\xf7l\xee\x18\x9b\x07\x0b\xd7`\x8a\xad\\RAX\x1aO\xd8a\xc2\x85\xccWB\xe3\x0ci\xc1\xf4b$\xad8 \xfa\xe2\xa1\xc8\x15P\xebV\x8c\xfae\xbero\\^ \x00\x83U\x14\xde$\x17\x94?R\x01P\x16\xfc\x81\xab\x7f[\xb1\x0cP\x14>4\xb9<\x8f\\:\xd3V\xa7P\xd4\x10\xe1;\xd2\x8d\x971\x10<\x19\xea\xb3\\\x89\xe0\xc9\xa3T\xc5c\x91\x1d\xc0\xf1\xe7]\x8d\x1f5c\xc7v\xe2\x9a>.\xbd\xc0\xfe\xeat\xc4\xb2\xde\x95\xc9\xec\n;\xd6\xbd\xdf\xec\x96\xfc\x83\x9ca5\xfe\xb2\x0cFe\xd5\x8eU\x1f\xc8c \xc4Y\x05\xce\x82<kK\xe0\xaa\xc3G\x03\xb0l\xa6yp\x8e\xd7]\xa4\xdf\xa0\x90~>\x06\xc2\xb3t\x0fKh@\xdd\x12@\xc8\xf3\x87\xee\xfb\xa3Vj\xdb*\x1bDQ\xaf\xcc\xb3vT\xe8\x99V7\\X\x8e\x9e1\xa1E\x14\xe3\xf3\xbf^\x9d\xcb,V\xa5\xcf[+\xec\xb3^\xe5\xa8n\x83\xdbF\xb9Q\xf2Z;V\x90\x82\x12v\x8b\x9a\xf1\x8dGM\x94>\xd9"q6I\xd7\x8f\x89l\x0f\xa83\xfe#\xf0\x91}\xdf\x0b\xbd)\x80\x0bu\x82\x89\xbe\xfd\xd4fE\x19\n \xe1%\x03\x98\xcf\xaf\x0b\xc8\x1c\xc3\x91\xc6>\xa9\xebm\x18^\xe4\xc5\xdbV\xec\x1d\x18\xf4\xd6CU\xd8\xbc\x8c(3\x02`k \xd5\xb5p\xf86\xd3\xff\x89\x9co\xe9\x14\x90P6\x11\x19{\xd1)\xb6\xb2G\xf8\xd6\xfcx\xc8\xa3\x86\x00\xa7\xad\xdd\xf6X\xab\xcaA\xb5F\xae\xf2Z\x17\x17\x96\xc0\xb5\x80)\xe5\x9f3\xe2\x16F\'\xc3\x9a\x16\xe4\x12\x02\x8bR\xf6\x05E\x96/\xb9\xb0z\x95\xcevQ${\xee\xb2\x9d\xd98R\x03\xf7\xe2\x02&\x93\xae\xa9\xcf\x82\x05\x10\xc6\xd9\xd8|`\xa4\rYr\x1b\x86\xe4\xe3C3\xed\xbe\x9dS\xb8\xa4\xdc\x12\x16>&\xf4BS\xd6K\xb2\xda\x1djx\xee\x07\x91\x84\xd1/\x1c\x98\xaa\xbc\x02\x11\x98\xc76@ R\x86\xf9\xff8\x97\xd3R\x96w\xb0X=\x17:\x86\xecw\x96\xc4\x1e\x9d\xa9\xb3\xf9\x0c\x7f\xde\x11\xf3\x87\xa2\xf0\x14l\xf7\xd4\x97>\xfc\x90\x82[\xb5\xcd (\xebvv,\xde\x97\x9b\x12\xa7\xb2\xb2\\\xc2k\xeb\xa5\xeb\x08\x84\x7f\xc8\x16\xea\x9f\x01D\xfa\x84\xb8\xe9r5\xb9a\x082)\xdf\xffGKh\x8f\x0b6G`\xf0s\x8dO\xf9@}>.\xbfQg=\xf6Z\xe5w\xd2q\xf6{B\xcb\x99g\xd7\x82\xa1\xef\xd3\xd1b\x0cX\xcdj\xff\xd1x\xb1\x0fq\xd9\x04\xe1/\x04\xd4\xf1\xf6S\x97\xd0`\xe7\xa9\x83=\xce\xd7O\x03\xbe\xc6z\xe4Y@%\xa3\x83\x18q\xd8\x88\x0c\xb4\xb0\x19\xf4\x89\x16y\xf7<fGxi\x03\x03\xa6N\x95MN\xaf\xd2/\xdb\x04\xa28\xed\x9fFG\xe4\xe2\r@\x9a?(.~\xf7\xed\xd2l\xfb\xbd\x12#%O\x01\xea\xe1\xee|P\r\xcf\x93\x0e\xf4\x88L\xb9\xd4\x94z\x86\xb0\x9e\x1a-saI\xd0\xad\xd5\x96\xb0\xad\xd7\xa6\xc6\r\xa1\xbd\xfa\x1f\x1d\xef\xe2\x86\xbfus\xa4\xa9Sx\x1a.\x80?::\xf0\xfa:_\xed\xd7\x12\x9f\x06\xab\x0b\x89\xfbI\xea,\xa6F\x80\xcb\xad@\xcc\xa2s]\xf7E\x92\x18\xe6:\xcah|\xc4I\xe2\xa1\x0bp\xd5\x869w\xbe\xe9a\xf5TU{\x89\x9f\xf0\xffb\x0f\xcc\n\xaa\xfaY\x9e\xc5B \x9ao\xe6\xeeJ,\x0c-\xd4\x02\xd31\xb12+t\x1a\x17A\x18b\xa0P\x1ce\xcf\x9bwW\x8c\xa7\x19q\x07\x18\x9d|\x9e@\x04\xe5\xfahe.\xf9\x03O\xb7@\xb4\x0ec\xcd\xc8\x95\x934\xb6\xe6\xe6\xbd\xde\x83;\xb4\x9f^\x94/\xe4Lc\xe9!\xc4\x174\xa0\xf9\x19%X&\x9e<\xf53L\xc7xY\x11C\xa6\x13r.\x1f\xd0hZ\xff(\x96\xd5\xb3\x85->\x8d37\xc8W\x1c\x14\xc6\xea\x16\x84P\xde\xca\x15:\xd9\xa58o\x9dC\xf2T\xf7\xe8\xd2\xe9\xd1\x94O\x87\xd9\xb4\xd7\x08\x0c\x92l\xc9\xd4\xba\x93\x83\xce\x9f\x94\x90H\xff\xb0w\xde\x07\xb7"\x0e\xa0_2\xef\x98\x01\xe7zcmn,\xa9U\x99\xb5:X\xc43gh\xe7Q7\xf0\x0f\x00YDBN\xb5Z\xbaj\x90\x0e\x7f\x00\xac\xc1\x83\x8f\xb6Bvj\xcf\xb6\x83O\x97\x976\x041\xc3.\xfb\xcb\x19\xc1\xf4paW:J|[\xe5\xf1p\xa0\x8cc\xd8\x9c\xb8\xc8\x10\xd4\r\x06\xd4\xd1W\x99n\xcf\x97\x7f\xe2.\x12V\xb7\xa1\xbb\xa5a\x85=;p\x0b\xfd\xe1\x05\xda\x81\xf1\xed\x1c\xf4I,\xd2\x10\xf0\xe3\x958\xfd\xf3\xc6\x9b\xee\x915\xa2\x05$f$\x08\x7f\xc7\x9e\xba\xad\xbd\xa7\x0c\x14\x9c\xe7\x98\xee@\xad\x0f{{\xda\xf6\xb3\x97\xbdp\xea\xca\xe1H\x19\xa90\x8e\xf5Rc\x81\x0f\xbc`{\x8d\xd6\xf4\x87\xfd\xa6\x19\xf9\x9cK\xa7\xdd9\xda~\xa1\xbf\xc5\xaa#\xecv64Jy4*g~\x0f\xfba\x90\x1bj\x8c_\xe3\x19Gz\xe1\xdd\xfc\xcf\\K]U\x1e\x05\xf4\'\xbe\x14[H\xa8\x81\x8d\xb9\xc6\x1a\xf0\xb7\x8aG\xd2\xcb\x1cZ&b\xe2\x9e\xc8D\xc2iy\xb4\x16\xc7\xb5W\xfb\xbfL\xfcs\xd0\xa4P\xbb\xbb\x88\xb7\xdb\xa6\x99Wu\x0f\x9e\x04%\x01\xbd\x0b\xeb\xf5 G\xf2Wp\xa3\x82\xf0\x03=\xe6*\xe0\x8b\x1b\xb0\xd5\xfa&\xa79\xac.\xd6e\x0f\xa1\xdc\xe82\x1f&\xd8\xa7\xb2.X\xea,\x87\x88\x0e\xc3K\xb3\x94\xc1\xe5\xa7\xfa\xd5\x89iC\x92\xd1$;w \xff \xa1/\x81,QRM,\x03\xb6.\x07R\xe4s\xc5l4s\x9aP(9v\xea\xfb\x99"c\x0e\x82\xd1\xacp\xdb\xf4>b\xd3[<\x11\x19\x8f\x95\x8e\xa6\x8eg\xafR\xa2\xbd\xf0\xcf\x1b\x97AB\xeb.\x8e=\x9art8D\xef\x1f\xbc\xc0\xa5K\xcc:`\xadv\x96gXE\xf8B\xc3U.\x15\x00\xc9\xe7kX\xb3\xbf\x96R\xc0\xdf\xdb\xa1g\xb8vW\x80\x126:\x98\x13\xb3\xd1\x7ft\xb3\x86\xe5dT[O&\x93/\xa1\xf5\xa1\x13,av\xd9\x96\xf7\x12\x84Sb\x0b\x0f\x05\x85\x95\x7f?}R5sV\xb5\x92\xae\x8fB\xb9b\x91\xa7f\'\x11\x82b*6m\xb0\x9eP5\x85k\x98\xf3s\xd84\x90#Y\xf5W\xf0\x05\xc3\x8f\x08G\x1aG$\x9a1V\x9f]*\xe3&\xdb><x\x8f<n\xa5e.ia\xce\xb9\xdaQ\x91f\x10\x0b\x00H\x91q\xa8\xd5\x01\x819P\xcc\xba\x0e\x7f\x13\xe0\xcd9y\x12\xf6\xab\xde\xad<\x0cg\x8bq\xc5\xc3\xedcR\xfaI\xcdhf\x1d\xa5\xd2\xf3\xd3D\x05>\x89\x14)\x8f\xec\xa0\xf3\x01\x0fU\x08\x81\x16Gg(\x7f\xb1.\xe1X\xa0cbb^\'\x14\xcb\xf6\xd0\xdb?,\x8d\xc4\xcc\x05Uf\x8c\xe8\xe1\xa5`\xc0\xdf\xc2*X{P\xb9\x01\xcb,\xbb\x0b\xbdNq0n\x0bp\xe2\x04\x15\x17~\r3oW{\xcbiof\x80\x95\x01\xab\x96bw7ro,\xc6Y?\x168\x9c1<\xe0\xeb=z\xe8/\xa1\xbf\x02\xf3$\xd0\xc8\xbeH\t\xe1\xd3_\xf4\x00\t\xb4\t\x80\x12\x1f\xf3RO\'\xf9\x8e\xa2\xd2W;\xdd\x80\x17$S\x04\x82\xe0N\xba}\xe4<\xa5Yt\xeb\xdcZM+\xe7\xae\xf1\x13e\xd7\x85\xd0\xcd\x9c#a^(ip\x81N\xc7\xaeU\xf24\x91\x01\xea\xa66\xfa\x19y\x88\xedF\r\x02\xd3\xc2S6\xc0\xd2%\xae\xcd"\xeea>\xb4\n\xb7N\xd9\x16F6(\x16\xe99\xf9\xfd;\xce-\xcfP+\xf0\x06\x87|\x02\x90,t\xb5\xecT\xe3\xe2\x15/b|\xab\x86\x15]4H\xaal5\x84o\x91\xb3je\x9b\x1a\xd2\x86S\xf5,\x12f\x05\xcc\x8d\x07\xd45\x18L\x89\xd6\xb8\x80\xb9\x93\x9dJN\x84\xb8\x8co\xd8\x97BIs\xfb\x93}{Y\xc9\x1c\xdfQ\xeb\x7f\xb0\xc4\x94\x9d\xc3\xc4\xc2\xc3\xe2]\xa6"\x8bp\x01\x16\xf8\xa2\x82C\xea$M\x01\xa8"\x84\xa3s\xe1\xb5p\x19\xbc\x90\xf2\x17\xa5Ct\x8f\xdaq\xa4=\x8d\x1e\xfa\xd5]W\xcd\xedZ\xb2\x97w\x8a\xdb\xdde\xc4\xb1\xb6\xcb3ma\xc4\x15Rrr\x9d\xd8\x02\x96C\xbc4\x97\x93\xcbJ\xe1&r\xb5\x82\xec,\xcd%\xbd\x89\xd1\xc2\x85ejx\xc7~\x192\xa2A{O\xcb\xca\xf7F\xab\xb9\xc6\xf9\x19:\x82\xe6\xcc\xc3\x7f\xbd\xbcu\xb1f\xfcR\xd8v\xcd\x93\xb2B\xc1\xe5\xf27Qv\x18p\xc6\xe1\xec\x83\xc5\n\xedAQ\xdc\xf9H\xdd\xf1s\xac\xeb\xc7\tN\x8eOq\x04\xee\x15\x94P[O\xe8\xd1\'\x1a@\xd7\xbe\x02\x1a\xe3?Tj(\x1e\x90[\x9b\x86\xf8\xc3\xd9\xd8!!Sn\xaa\xa2C\xe6@\xfe\xfe\xb9\xdf\x10\xe9E<]\xd3Yf\xb2\x13\xf5\xa1\x19(\xb3\xf6O\xcc~\x14\x13\x1e\xe6\x04\x873\x9f4\t$\xf5Y\x004\xaf}\x06\xb6\xc1\x81\x1a\x9a@\x03\xe1\xa2g\xa5\xc7\xf3\xaf\xe5\x9a\xc8#\xdf[V\x9bKsw\xbcQ\x97\x83\xf0s\x12\x1e|\xa3@\xf9\\\x85\xc4\n\xe0\x16\x11\x8f\xf1"\x86\x8a\xc4-q7\xe2\x82\xf0\xca\xc9>B\xf3/4\x83|ZT\xa5\xb7\x91\xb6\xf2\x9eeo\xb9\x90\xeb\x16\xe3\xe9\x89\x8a\xc2[ s8C\xc1\x06\xe9NrO-9\xcb\xe4|\x95\xf9[\x0b\x89\x81\xabO\xf0\xee\xd8HVY~\xc6\xc9P\x80\xa0\xf9\xdd\xae\x85b\x06\x1c\xb5\xacgI\r\xf2\xc2\xd2k;\xb3\xca.\tY\xf0V\xe8\x0f<\xa2\xbf\x89_M\x8cZ\xa8\xe8l\xf7\xabJ3\x8a\x8b2\x89dH[\x84\x00\x1a\xae\xd9\x9f\r\x9a\x08\x93\x93%N<d\xd0^}\xfe|\x1e\xaa\x04\xa9\xf1\x86\x85s\x83\x94I\xa6pA\xb6;\x10c\x19\x1f7\x94\xf89"\x82s^\x0c\xf6|.\xe3\x02\xdb!P\xee\x1b\xf92\x8f\xf2\xc4J\x93\xf3\x02\xa8\x08\x98b>l\x85\x8b\xfbxr\x13\xba\xa8t\x82\x81\xd0\xd9\xa8:\xac?\xc7G\xc9\x0e\x83\xb9F\xe0\x84\xba\xd1D\x8a\xb1\x94=d\t\xf3$\xb0-a\xb9\x82\x1f\xccf\x80Y\xbfS\xe6\xebF\x8a\xdbs\x95I\xd8\xd1\xb1\xfdX\x7f\x16-\xb1\x88\xa6\x0e\xd9\xfc\x8d\xc8w\xb7\x1d\xda\xee\xa3=G\xae\xeb\xf79\x95\xc2\xbf\xb0\'\x13^o\xfdk\x05i:V\xca\xe7\x1a\x04\xbb\xcavq\xf4@\xe3O1\xb0QZ\xc3X,\x1f\x9a\xa4\x1f\xc87\xf6G\xc7B\x08\x81\xde\xc1\xdb\xa8\xf4\x8fk#\x10\x9c\x81P\xe1\xcd"k\x19\xdfm\x80\x89\xe6-\xa2\xa3\xa1\x1au\xf3\xa3g\xd5\x01G\xfd\x8e1\x97\x8e?\'\xc1,B\\\x00jG]\x8d\x03\x03\x18\x00\xa7\xa8\xa1\xd05\tK\xd3\x9a>\x12BH\x0b\x96\xc7}\xed\xa1\x850\x87D\xe7Q\xbc`8 \xbb\xf1\xc8\xef.\xd2\x8e)\xca\xe6!es\x81E\xf5\xdf\x9e\xccJ\xbb5i\xe9\x8c\xab=\xc7\x132\xacZ\x950\x9d0\x06\x7fP\x98\x1c\xe8~\n\x8b\xa3\x054Bm\xb4`\xd3\xc7\x13F7\xb4\x9f\x85G0\xbc>I{;i\x93\xab\xdc\xdc\xe9\xae\x95\x06\x9a\xae\xc1\x8f\xb5\xce\xab\x96{\xacj+\x10\x96q\x1e&2\xa4\xd9\xd7\xce?\xf19\x85~\x1d~\xc4#\x84_\xea\xc1\xf1\t\x86\x0f\xa19\x12f\xe9\x01\x166Ew,F\x8f\x7f\x11\xac\x11\x07\xb6\xe0\xe9O(\x10\xd6\x01\xff>\x18c\xf8\xa8\x95\x13?\xea\x81\xe69\x169r\x14\xc6\x1a\xc5@\x80\xe4|\xffI\x16\xde\xa7~]\rt276t{\x13]\xcb&\x9d\xff\xfaS\x1c\xc5~\xa8\xb6B\xe4\xd5\x04` \xdf\xf3h\xf5\x82\x91mJ\x9bd\xf3\x97\xa5a\xa4*s\x83\x19\xfe\x08\xd7\xfe\xb9@\x13\xd7>\xc5\xdadY~vUT\x01\xa8\x15\xa4y\xaeT\xf5\x7f\xec)\xbe\x01H\xc1x\x08\xf9^\xa5Fm\x81\x03q\x07\xc4\x19\xc2\xd7?\xcd\xd3B\xcf\xfb\xa3\xd0d\x9db\xd4m\xf7\xa9\xdc\x9d9\x99\xfc\x0cE\xed\x96\x93\x84\xaa\x1d\xfc\xd5\xa5C;\xa4xz\x11\x07B\x01["\x8e\xe4b\xf5\xad\x1aN\x98\x1a?\xf3D\xe2lBY\xbarR\xb5\x03\xd3\x833\x7f\xcdkBQ\xc3\xddOQ8\r&\xcfy!\x8fJ\x1e8\x91\xf5\xb2\x82\xa9l\x13"\xa5#\xd5\xa3\xdby\xbf\x00\xcb\x1f]\xf7 \xc6\xab\x11\x1d\xea\xbe<k\xb02\x12#\x0f\xbb)[\xf3~+\x04\xf7\xc4\x89>\xef\x89Nbx\xb5\xb0;\x89\x92~\x1fP\xb5\x1frE\xc3\x12|\xb5\xea\x85\x1a:\xf0\xff\xd7\xbdl\xbc\xf7\x87=\xf3\x0c\t`\x1c\xc5\x90\xb0\xc0!\xea{\xf8\xbb\x87\x90\x9dZ[\x91]\x9b[\xfb\x10F\xa8N6\xcaa\n_\x8f\xa6?\xacR\xc0\xa3}F?M\xf7k\xe8\x00\x9c\x12\xbeJ\xba}\xb6\xbc\xe6m\xbdT\x9c\x16J\xa09j\x0e\xc1\xde\x9e\tb\x0c\xaa\x90c\xc9R\x93\xdd:3t\x0c\x91\x95\x95\xf7\xf2\x7f\xbb6d\xb8Z\xfc7FQ\xb7\xb2\x1d\x86\xa1\xbd\x06\x07\x93\xa0\xf8\x1f\xd4\x06k\xda\xcf\x15e\xdcg\x92\xd2\x02\xed\xb4\xac5\x98A\xe2\xd7\xfd\xd1D%t4kW\xaf\x0bYz\x85\x0f\xe6\xcdr\xd5go\xeeU\\\xa0q\x90M\xbb\x1f\x07,\xc9V#+*\t\xd5_y\x80\xedws(\x1c\xe4D\x82!&r\xf1\xd2\x05\xec\xe9\xbf\x80\x16"\xe7\x93\xf6\x1d\xbcw|\xa3\xcb\xb2\xa7E\x83\xb8\xa6i\xc3\xc3\xed\x16\xe7\x85\xcc*\xec\xec\xf4\nG\x8eoD\xff\xf3?\xb1/\x98\xa5\xe0\x1e\xd0\xd4\xc1\x96\xd8\xe4x\x97Ku\x87/S\xfak\xab\xf5*b\xaf\xda\x114I\xfcX@X\x00\xd9\n\x80_\x80\x9c\xf7\x95x\xefQNz\xc0u6y\x07\xd8\x9e\x98\xe02\xa1\xfeQp\xbd\x8b\x94\xd2\xc2?Bc]\x14\xea\x16u\xd2\xca~\x14\t[2\xd8gI^\x16\x16#+\xb8#\\\x05\x9c\xceA\xb8\xb5]\t/>\x8a\x05\xaa\x96JKp\x92\xf0\xbc\x16w\xcd\xcfN\xe1\xa7V&mH\xc4\xa7c\xc2J\xe5\xa9%\\U\xce\x99\xa2\xd0\x93\xd2S\xf0%\xa4z+\xad\x8a\xc1l\xd2\x08R\x86\xe9(\xb4\xb3p\x81y>\xce\xd7m\xc0\x1aK\x92\x8b\x1a\x0e\xa8e\x02VP\x8a\x7f@]<(}\xfa3B\xb1\xb1"\xb9\x1f\xd8\xb7\xdfp\xe2\x97E\x04\xfe\xe0\x8f \x8b\xb7\xf9\xf5\x0ff+#\xb4Nm\xdd\x81\xb7\x01\xd79\xb9l\x9b\x81\xe4Fg:\xc5S\xffs\x9aoE\x1a\x80\xe5\xc1\xac\xd2\xcf\xdc\x804;{\xa6-o\xe7V\x076\x05/:~}[\xebX#\xa5w\xa5v\xb9\xe1\xf7\x95:\xdd%\xc3\x91\xf7\xd8e\x93\x86L\x96|\x0e#\t\xd3\xe9\x7f\x8f\xb8\xb0\xf2Pb\x10\xde\x1da0\xbe2p\xda\x9c\xad~S\x82c\xbd\xe5 \x1a\nP4\xe4\xf0\x12{\xee\xadw\x1c\x95L\x08\xbb<\x11\xfc\x7f\x82\x8f\x8a\xa3\xce\xfd\x7f\x87VD\x877\xfa)V\x01\xedR\xc0\xf3\xa6\xd0\xe3b{\xfa"U\xc4c`\xd1\x9b\xb0V\x83\xbe,\x14#\x12O?\x84\xd6\x12Y`\xb8Jq5\x8f,\xe31p\x82\xae\xd4Q}\x1b\xc8\x13 \xf9\x83\xaa\xd6\xcfG7\xb8y4=\x03:\xf5P\xcbc\x1a\xf9\xe2{\xb5\xe8\x9a\xa82\x8dU\xe2GW\x96\xf9\x1aYF\x1ar\x02\x1f\x0e\xaa\xd8\xc0\'i\xde\xfe\xa9\xf3)\xb3\x94\xab\xc7;\xae\xce\xcb9Z\x80\xc3L\xd8\x8a3h`^\x94\xfd\x1d\x86h\x13\xca\n\x15\x08\x16"j\x1e\xc2O[^\x00\xdc\x06W\x9cE\xdf\xba\x9d\xa8\x9e%b\x86\xc7\xd48\xe7\x18\x80E\xd7:\xb6^o\x89|\x83;\n\x83[\xb1\x9f\xf29\x89\x9a\xcc\xb8\xd5V\x98\x12\x7fW;5\x81\xdb\xb9\xeb\x9f\xd5}\r\xb1\xd4J?\xb51\xea\x1e\xf7\xe01\x11\x8d\x9b)\xaa\x90\xb0\x82\xba\x1cH\x9f\x11\x94\xeb1\x8f\xf8\xc4\x9f\xc3m\x1f\xbc!\x80\x0f\x04#,\xca\xb2\x7f\xc4\x16\xa8\x8d\x031\xf8H\x91\xed\x1e\xcb\xd1a\x85\xfe\xfe\xf5\xd2U\x99\xf6\xc5\x9c\xfel\x10\xab\xbc\x90\xc0\xcc\xa2ho\xb8MWS)\x8b\xadq\xe5\x0c\xa2\xf1\xb2\x12\x18\xddN/\'\x1e\xa8\xc7J#\n\xde\x8d\xca\xbb\xa6\xb8\x1a{R\x16\x1f4\x84\xa4\xeb\xa42\xc4Sk\xeb\xa2\xe8\xa8\xf5\x86\xc7\xfd!\xdbk!\xea\xbf\x9bJ\xb4\xbdZ\xadt\xbf\xa6w7,\xf6q\xe0o\\d\xe1\xb7\xb6\xaf\x10\x86\xb0\t_Kno\x8d\xc5\\\xa3\x85\xce\x7f\x01\xc3i\xd3g\xa7\x97\xccU\x7f\xb0k\x8d\xdd\xd2\xbfa\x00#\xaf\xbb7\nZ\xaeX\xf2\x00\xa4\x92si\xa5\x1b,\xecXu\x1d\xc7\x9a\x89] 6:\x11\xf8k\xc2\xa1;\xb9\x01\xefE\xea\x8ad\x8aH\x05\xd5?\xde5\x9a\xc9F')
|
1
|
+
from hiddifypanel.models import BoolConfig,StrConfig,ConfigEnum,hconfig,Proxy
|
2
|
+
# from flask_babelex import lazy_gettext as __
|
3
|
+
from flask_babelex import gettext as _
|
4
|
+
import wtforms as wtf
|
5
|
+
from flask_wtf import FlaskForm
|
6
|
+
from flask_bootstrap import SwitchField
|
7
|
+
|
8
|
+
from flask_admin.base import expose
|
9
|
+
# from gettext import gettext as _
|
10
|
+
from hiddifypanel.panel import hiddify,hiddify_api
|
11
|
+
|
12
|
+
|
13
|
+
import re
|
14
|
+
from flask import render_template,current_app, Markup,url_for
|
15
|
+
from hiddifypanel.panel.hiddify import flash
|
16
|
+
from hiddifypanel.models import User,Domain,DomainType,StrConfig,ConfigEnum,get_hconfigs
|
17
|
+
from hiddifypanel.panel.database import db
|
18
|
+
from wtforms.fields import *
|
19
|
+
from hiddifypanel.panel import hiddify
|
20
|
+
from flask_classful import FlaskView
|
21
|
+
from hiddifypanel.panel.hiddify import flash
|
22
|
+
class ProxyAdmin(FlaskView):
|
23
|
+
|
24
|
+
def index(self):
|
25
|
+
|
26
|
+
return render_template('proxy.html',global_config_form=get_global_config_form(), detailed_config_form=get_all_proxy_form() )
|
27
|
+
|
28
|
+
def post(self):
|
29
|
+
global_config_form=get_global_config_form()
|
30
|
+
all_proxy_form=get_all_proxy_form()
|
31
|
+
|
32
|
+
if global_config_form.submit_global.data and global_config_form.validate_on_submit():
|
33
|
+
old_configs=get_hconfigs()
|
34
|
+
for k,vs in global_config_form.data.items():
|
35
|
+
if k in [c for c in ConfigEnum]:
|
36
|
+
BoolConfig.query.filter(BoolConfig.key==k).first().value=vs
|
37
|
+
if vs and k in [ConfigEnum.domain_fronting_http_enable, ConfigEnum.domain_fronting_tls_enable] and hconfig(ConfigEnum.domain_fronting_domain)=="":
|
38
|
+
flash((_('config.domain-fronting-notsetup-error')), 'danger')
|
39
|
+
|
40
|
+
|
41
|
+
# print(cat,vs)
|
42
|
+
db.session.commit()
|
43
|
+
hiddify.check_need_reset(old_configs)
|
44
|
+
all_proxy_form=get_all_proxy_form(True)
|
45
|
+
|
46
|
+
|
47
|
+
elif all_proxy_form.submit_detail.data and all_proxy_form.validate_on_submit():
|
48
|
+
|
49
|
+
for cdn,vs in all_proxy_form.data.items():#[c for c in ConfigEnum]:
|
50
|
+
if type(vs) is not dict:continue
|
51
|
+
for proto,v in vs.items():#[c for c in ConfigEnum]:
|
52
|
+
if type(v) is not dict:continue
|
53
|
+
for proxy_id,enable in v.items():
|
54
|
+
if not proxy_id.startswith("p_"):continue
|
55
|
+
id=int(proxy_id.split('_')[-1])
|
56
|
+
Proxy.query.filter(Proxy.id==id).first().enable=enable
|
57
|
+
|
58
|
+
|
59
|
+
# print(cat,vs)
|
60
|
+
db.session.commit()
|
61
|
+
hiddify.flash_config_success(restart_mode='apply',domain_changed=False)
|
62
|
+
if hconfig(ConfigEnum.parent_panel):
|
63
|
+
hiddify_api.sync_child_to_parent()
|
64
|
+
global_config_form= get_global_config_form(True)
|
65
|
+
else:
|
66
|
+
flash((_('config.validation-error')), 'danger')
|
67
|
+
|
68
|
+
return render_template('proxy.html', global_config_form=global_config_form, detailed_config_form=all_proxy_form)
|
69
|
+
|
70
|
+
|
71
|
+
|
72
|
+
import flask_babelex
|
73
|
+
|
74
|
+
|
75
|
+
# form=HelloForm()
|
76
|
+
# # return render('config.html',form=form)
|
77
|
+
# return render_template('config.html',form=HelloForm())
|
78
|
+
form=get_config_form()
|
79
|
+
return render_template('config.html',form=form)
|
80
|
+
|
81
|
+
|
82
|
+
|
83
|
+
def get_global_config_form(empty=False):
|
84
|
+
boolconfigs=BoolConfig.query.all()
|
85
|
+
|
86
|
+
class DynamicForm(FlaskForm):
|
87
|
+
pass
|
88
|
+
|
89
|
+
for cf in boolconfigs:
|
90
|
+
if cf.key.category()=='hidden':continue
|
91
|
+
if not cf.key.endswith("_enable"):continue
|
92
|
+
field= SwitchField(_(f'config.{cf.key}.label'), default=cf.value,description=_(f'config.{cf.key}.description'))
|
93
|
+
setattr(DynamicForm, cf.key, field)
|
94
|
+
setattr(DynamicForm,"submit_global",wtf.fields.SubmitField(_('Submit')))
|
95
|
+
if empty:
|
96
|
+
return DynamicForm(None)
|
97
|
+
return DynamicForm()
|
98
|
+
|
99
|
+
|
100
|
+
def get_all_proxy_form(empty=False):
|
101
|
+
proxies=hiddify.get_available_proxies(0)
|
102
|
+
categories1=sorted([ c for c in {c.cdn:1 for c in proxies}])
|
103
|
+
class DynamicForm(FlaskForm):
|
104
|
+
pass
|
105
|
+
|
106
|
+
for cdn in categories1:
|
107
|
+
class CDNForm(FlaskForm):
|
108
|
+
pass
|
109
|
+
cdn_proxies=[c for c in proxies if c.cdn==cdn]
|
110
|
+
protos=sorted([ c for c in {c.proto:1 for c in cdn_proxies}])
|
111
|
+
for proto in protos:
|
112
|
+
class ProtoForm(FlaskForm):
|
113
|
+
pass
|
114
|
+
proto_proxies=[c for c in cdn_proxies if c.proto==proto]
|
115
|
+
for proxy in proto_proxies:
|
116
|
+
field= SwitchField(proxy.name, default=proxy.enable,description=f"l3:{proxy.l3} transport:{proxy.transport}")
|
117
|
+
setattr(ProtoForm, f"p_{proxy.id}", field)
|
118
|
+
|
119
|
+
multifield=wtf.fields.FormField(ProtoForm,proto)
|
120
|
+
setattr(CDNForm, proto, multifield)
|
121
|
+
field_name=cdn if cdn!="Fake" else _('config.domain_fronting.label')
|
122
|
+
multifield=wtf.fields.FormField(CDNForm,field_name)
|
123
|
+
setattr(DynamicForm, cdn, multifield)
|
124
|
+
setattr(DynamicForm,"submit_detail",wtf.fields.SubmitField(_('Submit')))
|
125
|
+
if empty:
|
126
|
+
return DynamicForm(None)
|
127
|
+
return DynamicForm()
|
128
|
+
|
4
129
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
130
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
@@ -1,5 +1,128 @@
|
|
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\x9e"\x00\x00\x12\t\x04\x00\xc3dPvV\x12jJ\xbfOC\x11\x1bvfX\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x90]\xd9\x8b\xc5\x01o\xa7c:Z7\x14\x7fQP\x90\x85\xbe\x93\xd6\xeb\xe8Cu\x10j\x9e\x1c$\x88\x99NbN\x1e\xe9:\xcfuGq\x9aU/\xd4+\x96\xa3vO\xd1.&\r\x10\xfco\xf5\xacd\x83&\xfe2^\xe9V\xec<\xfb\x99\x83\xfc\xde\xb1\xdaH\xb52\xd4\xfd{\xa4K\xc5\x9d\x8c\xb5|m\xcb\xdb\x12>\x7f%\x92\x87$\x8b\xd75\x0e\x89\x07-:X\xb2\x8e\xc71\x89K\xc8\xa3\xe3\x94\xae_d\xe7\xfba4\x02v\xe5\\\x85fV\x96h\xee\x8a\xde\x83\x95-\xc5:\xba=\x88L\xc6\xd7`\xb3\xbc\x86\x0e:QQ[\x1f`\x9e\x08\xf1\xf1Md}\x7f\x8d\xe5\ti\xd3\xf2\xa4\xdf\x18cG48\x89\x98\xbb"-a.\x91\xaf\x91\x1b\xc3.\x96\xf6\xef\x88\xc6/\xa2\xed%;\xac\xc6\x04\xce\x19\x80\x96\x8c\x10\xfc\x80\x0e\xdd.\xe2J!.\x0e\x9a\x8ez\xc9\xeb\x85t\xdacP\x1e\x02\x0e\x8c5\xd5b\x18\x90\xda\xc7+%\x14\xde^\x1b*e\xca(\xaf\xad\xea\x03\xa8\xc3\x82\x04L\xf1\x0c\xc9\x8d\xe0\x9fgE\x150\x81\xdb_\xd5\xd8\x04D\x84c\xe7\x8bf\x80H\x86\xe2\x1d\xb0\x00\xbe\xda\x82\xce\x91\xac\x0b\xf5\xf6\x90\x92, YJ\xd8\x99\xc9\x19\x92\xce\xf6\xa9YC\xd4P\x9bb,\xa9\x0347\x1b<.m\x13y\xbf3\xbd:"a\x92\xe7\xbd%._\xbf}\xb5C"\xd4r1\x14\xfal\x87\xb5S\xd6\xf0~\xdaO\x99\xcdl$\x18\xabB\n\x90\x0c\x04\x14/\xb9\xf8\xf53\x07\\\x8a\x11\x10K\x90\x15\x07V\x10\x9f\xd2\xe107Pp\xa5\xd0\x1b\xa7f\x9f&3\xd5{\xfc\t\xdc\xc3t@8\x98\x7fjZ\xef.5~\xe2\xb1z$pk%\xac\x98\xc5\xd7\x84\xde\xcb\xfc=\x08\xe6\x8eze\xcbG\xa7\xcc\xef\t>\x99%\x9c\xe3\x82z\xe6W\xd6\x9a\xc2\x06t\xfb3\x98\x10\xbc\x07Y\xc1\xc4,\x1a\xda\'\x0e\xdf\xe0\tzY$\x7f\x9aY\xb8\x93\xb8L\xb1Z\xb3L\xe6M\xa5\xa3\x00+\xba\x05r\xb4\xf3\xca\x8b}\xbb\x93\x0c\xe5\xe4u\xc4%9\xb3#q#\xca\xd8\\\x1d\x940""\x9ft\x12\x01\xa4\xc1\xee\xdc\x1f/\xb9\x98\xe3K\xb9\xee\xd4\xc2\x1a\xd6\x0f^\xd1\x1b\xbd\x05\x03E\xcb\xd4\xe7Fb~_r\xdc\xde-\x96\xd7g\x91,\xbd(\xd3]!~E\xe2P\x12\xceP\xc3\x99\x15\xaaXZ\xe6\\\xcd$\x01w\x88dz\xd2\xda\xcf\x17\x06\xad\x89\xfe^c\xab\xb7-V@j]^\xdeK\xa1A\xa9\xces\xb4\'y\xf5\xf1<s\xa5]\x95.\xe6.\xa9lc&\x03\x97\xb2DH@(\x8f\xb6\x11E\x91\x8b\xf0\xc6\xbf#^\xa9\xa5sU=\x07\xac\xd8\x1b\xc3\xe6e\x14\x85)\x97\xff&\x9e\xcd\xacA\x86\xc7\xd8n\x8f\x882\xa2\xebi\xba\xfe\xcb0\xc1\xd4c\x0f\x03\xae\xd0\xcd\xa9v/\xf1\xe0\xf7\xc8\xe8\x0c\xbd\x00\xb6\x04\xf7\x90\xb4\xf0\xe1U\xb6\x8d1\xe0Gr\r\x0b\xb4\xfft\xb8\xff/\xc6\x87\xd5\x9c\x0eE\xc7\xdf\xe9\xc1\x0erCDq\xe4\xa1s\x8d\x98H\x14U*T\x1dClQ\x8d\x18\xd0~\x0c\xde\x05\r\xa9m\xa9K\x07[\xe1\x18\xc0\x1bw\xd8\x9es\x99NX\xb29&\x80T@\xb0\x03\x9dh\xec\x8fo0=\xaf+\xaa\x91h\xa7\xc9Ls\x82\x14\xf0\x92\xe1\x18[\xb6Z\xde\xd6\xfe\xf3\xf3\xa1\xe2 \x00\x0fSO5\xbc\xd63A\x01"\xc3\xec\xc6o\x03\x9by\xd3\xc0\xca\x92\xec\x80\xc3]b\xc3\xd4\x7f\xe4M\xdb\x12\xdd\x157L\xc7\xbb\x98qq\xd9K\x15\xef\xb0\xb18\x90\x05\xe6\xa2\x08o\x87\xbb!\xb8\xde\xaf\x08\xd3\nrH\xcb\x00`W\xad\t\x98\xd3\xbd\xeb\x9c\xc4#P\x86z\x05\xe0-\xa0\x97:\xe8\xb5L?<\xeb\x94U(\xbfB\xcde\x11\x06&\xd3\xd6\x80\xdf\xec\xc3SwA% \x85u\x9f\x95\xa4\xbb\xb9\x1b\xbeFb\xf0\x94\xab\xd4Y\x01\xed:\xba\xc1NR=\x172@\xa6a\xeb0\x87\xb4s&\xfaf\xa69gz\xcdJN(\xfdc&\xd2\xaf\x90W\xb3\x00\x96\x05\xbe\xd0\xcd1,\xbd\x92\x1cF\xe39\xcch\xedH|s}:|\xff\xda\xf5\x9c\x1d\xfe\x8a\x0c\xe4\x07\xe94\xf8\x1f\x03A\'\'\xfe\xf5\xec\xc1.\x95g\xbd\x86\xb8\xa1\xf8B\xd4\x9a\x8d\xcd\xd2\xf4\xb5\xbd%\xa9\xaeq\xfbM\xa4\r\x9e\xd07Fs{8\'\x00!+\x90)\xb0\xb4\x01\xd8Z\xb8\x94p\xa6\xfe-\x15\xc2\xf5\x96\xb1RJ\x8a\x13\xd1\x94\xe6\x11VS\xe5\x05bw4\x8d]\xc8\xa0\xf5\x8f\xf8\xccC\x1cD\xcc\x9bD\x10\x95&\xc2cK\xa9\xeb\xb5\xed\x96\xed\xc1\xa8\x16\x85\x1e\x94\xe0"\xcf\x180F\x83\x92d\xea\x8eI!\'\x0cR\xafg^\xe1a\xf4\x9fW\xfd#6z\xc2\xd4z\xfd\xfa\x14\xb9\xc6\xfd)\x12\xa8\x86}\xf9\xe0\x17\xec\x82\x9a\x88\xee,\xa7\xfaZ\xb2\x8dY\xd69:4\xd2\xf2\x9b\xa4\xf8X\xa4\xb0\xa3\x16\xa9f\xc3\xd0u!B\xbam\x0b\xd3\xbf\xf9\xf9=^\x13\xb6\xfdAF\x06\xe1:d>I\x84*\xcbyQ\xee\xa4\xaa[\xe7\x93KQy\x1b\xb75d\xda\xdap\xbf\xe8\xcb\xf6=Z\x8e\xb2_\x12Z\x04W\xaf8\xd7\x1a;\x12\xe5N\xaam\x11\x0c\xe9\x03\x1d\xcb\xba\xa8\x94\x96k\xd5\xcd\x82JL \xfa\xf1\x1aB\xff\xdf\xcb}\xb2\x04\xd9\xae\xa6\xc4\xc6[\xa4\x7f\xd1\x15\x1e|\xdf\xd81g2)\xb2\xe3\xa1\xbb\x19i\x1cbR\xc6\x07\xf4>\x1d\x01\xfc{\x8bk\xb2\xd0\xfd-y0V\xa0\xb7\x1b\xc6e\xf0E\xcb\x8a\xc1\x19\x0f\x0c\xcd\xab\xe1\x03\xd2\xe2sQ\xe0\xcau\x1e\xc5\xb8\xa9p7\xb6a\x0e\xfarH_\x8b\xfbA\x1d\x03\xa2\xb61\xcdsX6\xb3\xad\xae\xb0\x04\x1csL\xffT\x8c\x07$\xa2\xdfo\xfa\xcd`G4+\xa6\'\x9e\xd2\x7f}T\xdb\xe8\xe7\x9an\xe8\n$\x1dpn%\xa2\x05\x05w\xde\x9f\xa9gW\xc2\x84EG{\xa7\xe4\xca\r\x18\xb1\x05\xcc*h\xa0\xc6\xd1\xb4\xccA\xc8D\x8e_\x1a\xa0\xb3\xca\x08\xcb\xf1m\xf8\x83G\xb3\x92Wg\x1d\x19o\xeb\xf1\xfdKc\xd9\xf2p\xd5\x8e:\xb6,;e\xc3"\xbf\xbd/_\x94\x84q\xe2B\xaf\xe4\x97Z\xd5z\x05\xd9\xa05"I(q^|\xcbN\x9a!u,\\J\x85\xb8>\r\x19\xb4\xb7\x1f\x9a\x8a\xf9\xad\xf7\xb6\x1b\x80\x96u\xdd\xedA\x01\xdf$%\xa4\x12rXT\xce\xf9\x9d\x1f\xfa\xbf\xfeod\xb8<]|Q\xf9\x0b3)\t\xe7\xa0\xc8C\xbcQ7-_0&\x16\x1c\xc6\x85JP\x15Y\xa7(t\x18\xe4gr\xc0\xe1a\xfcA\xc4\x0e\xfe\xe7Q4\xab"\xe9\x06`i<+\xcc\x83\x921\xfb2\x80h\xda\x8f\x8dG\xc680\x07\xb5w\xb6\xba\x11\xee6% }\x83\xae\xd4\xc4\xaf\xda9W$\xa7\xdew\xabw\xce}Y\x15\x9a\x18D\xb84\x06G\n\xd7#\xacu\x9d\xbd\xb2;U\x0f\xfa\x8d\xf24\x02\x1bw\xe7\x89\xeb7p\xffo[\xb3\xb3\xf8I\xa2\xda\xc8m\xdc\xd8\x91\x1f;HMkS\x9bqW\x8a_\xcd\xcb\x98y~\x03\xf8\x82x3+\xbd\xb6c\xd5^WDZ|\x08\x8cr\xe9z\xba>\xc8\xfb\xe3\xd8,\xca\xad\xdb\x95l}\x18\x8eY\x1a"\xf3\x8fO&\xad\xb4\x0c\xc4\xc8,gz\r\x9f\xc8:\x8c9\xda\x16^\xbf:\x9a\xd9$\xde\xc8\xc9\xf4\x12\xc9X\x05\xd1}\x07\xd8\xa1\x9a\x94!\xce\x92T\xcfF\xb8w\x8cY\xceR\x97\xba\xcc%\xbfL\xd2\'\xdd\xf6\xe1\xb5\xa2q \xc3\x97L\xbbd\xa7(I\x93(\xf4\x1b\x95=\x8b\xe7>\xcd\xbbO\x10o\xab\x83\xf1\xe3\x80\x00)\xf5%VS\x03\xa2!\xbd\xafg\xa2YkmJ\x1f\x17\xc3\xdf~s\x01\xf5\xf5n\xc0-\xf6\x8e\xa6!\xcf\x84\xe7\xd6\xdbTa\x95O^J"\\\x1eP[\xc6\x9f\xcf\x11\xea\x11\x8c\xa8]\xd7\xcc\xc8\xa9\xe6-\xe86\xd6oM\x89q*>\xee&y{\x98#!;q\x932\xc7\xa6i\x06\x8e\x7f\xb4\xc0\x19\n1\xf1\x92#og\xf6z4yC\xc1\x13\x19H\\\x8ef\x82\x18\xd7{X\x84\xaf\x04\xb7:L\x9f\xbd\xb7\xa0\x04\xa5\xf5\x01\xff\x19\xabk\x11\x93\xdd\xd5\x9fr%\xf6\x94VE\x81\xf7M\x8d\xcc\xe2\xa8o\xff\xfd\xb5\xbc\xf4\xa64#KQ\x18\x18\x0f\x14\xdc\x8d\x03\xd4\xe8&\x99\x8fi\xdf\xd26^;\r\\\x08\xca\x8e\xa1\x9f\xf4v\xbe\xc6nY\xfa>=\xd4\x0f\xb1"\xf1\xa5\x8e\xf3\xdd\x82\x04\xfc\xfa\xbe\xc0D;\xc3?\x03\x0e:\xa8s\xd4\xf4\x89\xdd\x9e9\x07M\x07\xc0\xfd\x1d\x85\xe2\x04\xc5\x85R^\xe5\xb0\xac\xd0"\x18\x07[K\xdec p!]\\\xb8L\xb3 \xbb\xce\xb5I>\x91\xe5G^\x15\x87\xc2]6\xd9\xad\x98\xec\xcay\x9e[\xbf\xb8\xa7t{\xc8\x97\xa4$z}\xefe\xfc\xe2\xefS\xb7\x05\xc1\xea\xaas\x14~\x88\xacl\xa9y\xe2\x99\xa2\r\x15.\x11\xca\xd2\xb5\x93|v-\x16N\xe1\x8cqh\x96\xa3h4\xd0N\x01\xb67\xea\x0e/\x8c\xac\xab\xbc\xeb\xd8l.v\xfb\x8b\nQv\x9d\x01\x10\xff\x087\xd4l,?\xf7m\x19\x98\xdd\x92~4\xb9\xb8\xb5\x98\x8c\x9d\x98\x0b\xac<\x8d\xa1X\xa0\x961\xe7\xfa\x9f\xb5\x94am}k\x8e<F-?\x02y\x00>>\xae\x00\xef\x99\xd1\x1f\xefH\x96i\x06\x80qU\x14K$\x8c\xd0\x01\xea\xdb\x15\xa1\xee\x01q\xa8\x08\x13[!\xea\xc6\x08\x0b\xe8\xa6\xcd\x8ap.z\xc4F$\xe0\x1e\x9a\xafZy7\x9d=\x8c\xaaz\x90\x10a\x9au|S\xe4\xa3;qT\xfb9\x98\x90\r\xa1\xb0\x86\xfa[\x93\x87m\xc5-\xc9~A}\x9f;\x18[\x97D\xfe6\xae4\x94X0M\x10\xef\x06\x06l\xbe\xb1\xe1\xdd\x1c\x15\xfeip\xab"6\xe8mjU}\xc0\xf8\x9a/lwc\xea\x99\xe8\xe6*/\xcb\x8e\x89U.\x8e\x1cV\t\x0e\xe5\xb6\x04_\xf1\x07\xdbB\x08\x86294\x80\xa68`\x1e\x99\xdf\x1e \x10\xfe\x1b\xc3"\xd2FP\x00\x91\x975\xeb\x0e\xb7\x82\x13\xcf\x04?\xc7\xe64\xcap\xf7\x82\xa6\x03\tdsn\xde\xc7\x96X\xabB\xc5xa[\xcdJp;I\xe2y\xab_\x8cp"!\xf6\xa6\x13>X\x11\xe2\n\xfe\x85\x01\x0e\x9dt\xe42my\xeb,\xdb^ir\x01w\xf6N\x8ey\x85\xbaP\xf1\x1a\xf1\x1dk\x0bF\x12g\xc8\x15\xe24!l\xb7\xae)\xb5\xe9\x93m\x0b\xd8\x16\x8f\xb9j&\xde\xd2F\x8e\xac\x03|\xe1#\xfb\xfc\xd3\x1aSP\xdd\xb8\x7f\x04,\xae,$Ln\xe00\x8c;/\xa7l;\x82\xf1l\x02\xa6\x03\xe7\xe8m\x81\x95gm\x99\x86!\xc6\xb7GC\xbeJ;\xc6\xa7\xe9!\x1eA.\xccG\xa9\xf4\xe6,\xa6\xb9\x18\x89\\\x90\x96+\xbb\xff\x10~\xe3\x9b\xc2{0\x98\xf3\xb5\xcb$I.AW\xb6\x15\xfe\xcc\x898@\xbf\xb4J\x84C\xe1\xdc\x19Y\x9e\x8a6\x12\xc8\xd3\x11`f[\x18{\x8c\xb2\\\xb2`\x8a\xe2\xce\x85\xf9\xed\x94\xd5\x07[\xa8\xa7\xbe\x87\x11\xc4\x97R\xfc\x1d\x9fC\xf9q\xb2\xb0(\xbaE\\\xc2\x19\xbd\x10\x03*w\xd2\xa9O`zfK\xb2\xebO>\xa1E\xac\x9aB!\n\xe9\xe0F\xdd>\xf3FV\xd0\xde\xc3\x0e\xb8_\xe1\x18"{\x18\x9d\xec+O\x17G\xa0\xfes\x80\x05\x06l%\x0czgKaXV59\x18\x88\xc0\xebp\xcdX\xb1\x05\x97+\xefH\xb4i`\xa5\xfa\xdd@\xb0\x1d\xea\x01\xc3\x18\xe1e\xe3\xbe\xca\x00\xa3\xcfP\xf7l\xfb;\xee\xf6R\x12\xc3/\x97\xa1\x11\x02\x19G0\xb2E\xedKK8\xf5\x91\xe6\xf0\x0f\x9a\xe1\x85\x12W\xf0\xdd\xbd\xda\x0b\xb2*\x86\xa0KLHj\x15\xc2\x04\x03\x88\x14\x9e\x89\x015\xea\x01\xa5\x97\xb4\xa8\x8a\xf5\x067\xe8\x04A\xde*\x8cT\xde)<\xfe\xd4}UOj6%\xd1\x1e\x9e\xf0[B*\xe1\xa8\x9d}\xa2\xcf\xc8\xb7\xa2"/\x86;\xa2#\x90}\x87\xaf\xddl\x9f{\xb0e\x07\xcc2x\x0b\xaf\x8b6\x9c<\xd3\x91\x9f1\xf8 \xbb\xf7\xcab\xec\xa7\x14\xe3\x14\xd8g+[a\xc0U@\xedu5xUh\xd1\x1a\xc0$5J+\xed\x019\xa8N\x81OY\xd5\nH-N\\0\xf2\x8d\x84\x01\xd7\x1dQ\xe0\xcdb\x84\x8c\x7f\x80\x8ez\xb7\xf7\x98N\x034 \xac^\xc0\x17y\x18t\x06;,\xba\x08B\x84H\xa4*F:\xbe\x14n\xb8\xda\xb1\xcf.\x8c\x0bzu\xb3+\xbc\xac\xaav(I\x99y\x13\x12\xa7\x07z\x05CH\x86W\xbe\xc6\xa1\x04\xab\xec\xab\xdbp\xd5\x84;U\x7f\xa0DMb\xddUp|\x1f\xad\xf6\x92|\xad\x90\xb6m\x7fq\xa4\n\xa0\x07\xe1/\xd7\xd7a\xec\tt#\xbe\x10\x0b\xd3\xd07\xe3\xec1\x9e3\xf3:\x9f\x01\\\x19g\x1cz>\x07\xcf\xa3*\xe6\xa6\xa1\x9b%\xf7\xed?\xd7\xd1\xd7\x9f\xd5\xb4\xb8\xa6\x908\xe5R>\xf3\xa2q \x18\xdf\xb4]\x10\xe2\x89T\x8f\x11\x97\x85\xaa\xa7 s\xf9\xe8\xb6o|\nsG\x8c\x81[\n\x82XA\xa9x\xaa:BH\x112\xd80\xdf_\xcb\xcd+\xda\x7f\x1b\x0c\xfa&D\xf7C\x17\xdcW,3\xb2\x1d\xc5a\x92[\x00-\xe7\xca\x8d\xd2\x94\x94\xb9|\x96"Av\xfe4i\x955\x95\x06Pg:\x0fsm\xa0n\xecO.\x04\x95\x83\x89\xf1\xef6\x0e\xde\xbf\xf6\xc5\xc5]\xaa\xf4\xb6\x0e\x89]\xb4sO\x03\'\xeb\xbd\xd7[\xc1\xfd\xd1\xad\x03V\xeaJ=\x9d\xd4\xf43\x0c\x9a\xca@<\xfd\xa2Y\x81^F\x13\xc2F<\x9e\xcf\x8b\x00\xfe\xb4n\x064\xa6$\xb4g\xb4j/\x8e5A\n~\xb5\x84\x81\x14\'\xcd\xc9\xb4\x13eS\xa6\xd5;\x93x\xb3\xfd\xffi\xe3|\xd4i\xc3)\xca\x13\xb1\x97,\x93\x89M\xf3\x92\x9c\x89\xad\xd4\xb0\xb5\x96\xb5\xf0\xb2\xfaxUph\x00\xb8\x0f\xaf\xe7\x9f\x85\x0e\xf8\xa5cO2\xb1\xbe\r\xf8\xbe\xeah\xd9sk\x9d\x1b\xf0\xd1\xf9\xbf\'\xf5g\xacq\x91\xb3D\xda$V\xe0)$\x05\xec\x1b\x1f(\xddE\x8fOSb\xcf/\xa0\xb4S\xb1d\x90\xda\xfb]\xea\xfc\xbf4\xe9\x98\xe0\xbbr\xc2)}\xd5>\xe4\x12\xa05\xe89\x8eU?E\xf5\x14\xf4\xe8\xf9\xcfw5\xa1\xf6&\xf2\x90\xcbi&\x8e\xf0\tmU\x1bkF\xd6\x81#\x1e\xa8\xfc.>\x96\x05\xb1\xc7\x18\xf8\xfd\x99M\xe7\x05\xa4v\xb8\xc5\xb7\t\xfa\xc3\x1d\x07\xd6\xcf\xf8\xdfa/[prR\xb5\xe1\xd6\xceH\xda\xae\xa1\xda\xf8\x1d\xed\x16u\x8a\x17\xb8\x12\x8b\xd9\xd7\xdb\xdf*\x1e[\xfc.L\xd5[\x9e\xbcNh\xef\xe2MC\x9c\xa7\xc8\x03\xe8\xe7\x9d\xf5\xcdmq\x12\xa1P@\t\xab\xcb\x9b\x1fh\x8c\xe9\xce\x19}\xfegN\xa2!)\xd2\x86\xbdS\xef\x1b\xc9\x9fN\xf0:\xf1,*\xd0\x8a\x86\x15\x95sG-\xedsF(\x0c\xb3\xab\xea\xde\x7f\x16\xae\\!\xa3\x0e\xe9|\xc6\x9ftT\xf4\x00&).\xea\xc2h\x00\x05v[\xf7$\xe2\xec\xe56j\x96\x02\x81\x8f5r\xca?A\x0f\xcaN2\xcb\xb2\xf7\xf5L\x8c\xc5\x0b\x19\xd6\xa02\xfe\xff\'_\xf8$\xdb1\t~\x84\x9ez\xac\xcf\x14\x89\x1e\xe8\xbf\x1do-\x03Z\xbcb\xbaC\x06"E\xd9\xba\xd5\xbb\xfc\xe8\x88\xb0\xe4.\'\x08p[/\xc4gt\xcd9+\xc3\xf2|\xfe\xe7\xb1Q\xa0\xd6\xb1?\x9d\x06v\xe1)j5\xd9\x95t\'\xf7\x95\xc2\x87E\xdal\x03Bx\x86b\xe1\xdb\xec\xaf\x07\xb0\xfc\x97\xff\x05\\(\x80\xac\xc6r-\\\xe6Zi\x03S\xde{O\x08\xdd\xbe\xa2[\x1ae\xe83\xdd\x17\x01\x0b\xc3\xde\xde\x0e\x84\xe6`\xa1\xed\x84\x90\xe9\xd4\x0e\xc9\x1a\xb8k\'?3\x04[\xe1\xc8\xc0\x9e\xf9\x07\xf6\x82\xf2tn\x00\xa5O\xa9\xf5\x82\x9b\x99\xade\x90\xf8\xceV\xd8\x89\xabE\xd6\xed\xe9s\x8a\x06\x9a?\xac\xdb\xcc?\x81]\xb3%=\xf9\x82\x11\x82\xd6\xf9o\x18\r\xcd\xcb\xac\xe4\xf4\x11\xc3d{$\xb237\xee\xe6\xdd\x9eXQ\x8d\x9b\xb0\x8c~n\xb3U-\xdb\xca\xfd\xb4+\xed&\x8f\x9a\xd7n\x1b]\xbeG\xe1\xc0!\xfd\x15}Um\xc0\xbc\xd0u8\xf6a\x13\x85\xb4\xebu\xce\xe2\xf4\xe0\xf77^*<\x04G\x04\xbfex~\xb8\xbf\xadxq\xc7*\x1c\x07\xc3\x8a\xe6\xe7[\xa4\xfd!\xb4\x14\x1f0\xf9B\xc1! \xc8\xee\x8f\xcd\xe2bW\x8b\x89\x1dfv\x96T\xc5xH\x10\xfe\xa7\xcd\x8a<\xb56H\xb7%\x9d\xf7H\xb8|\xafVJ\xf2~\xc4\r"\xbe\xcd\xe3\xfaE\xcb\xdd%e-\xe9^\x93\x93\xb5\x8b?\n\x89H+6\x123\xf5\x89\xa5\xd3\xbeT\xebk}\xa0\x97\xaa\r%`\xad\xbe\x9e\xd02\xdaz\x8f\xd4\x00\x1d\xe4\x03\xc1\xcf\xae\x04z\xcf\xc9\xe1p\xd0\xac)R\xc0 \xc8\xbcI\nw\x8b\x17\xdb\xad\xe4=\x07|\xddz)\xf8S#\x14x\xad\x18\xc0\x12\x84\t4\x9f\xe9\xb6\x1f\x1c|\xd1O\x96\x0b\xd3T=F\xd1sZ\xf9Q-\xdeK\xa7;\xf2\x1a6|\x945j\xdd\x02\x84,\x0b\x1d\x9a<\xef\xdf,\x08\xc2\x96"\x06:\xf4\xf5\xf6\xfb\'\x15\xd9{\xb6\x93>v\xdd\x95%C\x98\xdd\xc6\xa2f\x05\xb7\xae=\x1f\xb0S\xc2\xfc\xf3\xa8\x94\x0e.\x9c<\xcb\xd8m\x87\xcd\x9c\x97\xf8\x9es\xbdz(X\x1bs\xf5\xef\x03\x8c\xa2\xa5\xcd\xda\xce\xb0\xef\xb2J&{\x086\x04z\xea()\x06<\xadk\xec\xead\xd4\xf2y\x94\x85\x8e\xbc\xb1\x9c\xab\xb6V\xe2\x08\x93\x1d`\xa3\xb2\x9f\xcd\xd8\x03\xc3;UJ\xcd4\xcdhf\xc0%\x96\x0eJ\x97\x93\xa7M\xbbzo\xa9s\x06+3\x12\xce\x15,2\xa7\xc85\xa4f\xe8\xb8\xa9{`\\\xf3\xa5\xd4\x9eu\x86\xfa\n\xcc\x13\x81kl\xd7\xa9&G}\xaf\x83o:\xff\xe0D\x11\x80\xf0\x86\xf3\xbbS \x8e\xa0\xbe\x8f\xeaC\x18\xf1\xd2@\xffm\x1e\xe8\xf4\xff\xc0\x94\x0e\xf4\xffi\x82w$Y\xb2\xb5W\x04\xa7n\xd9\x05i\x04\xda\\A\x7f\xab\xe6\x9e\xd6Y\x95\xfeH\xcf\x02cn\x0cA\x8a\x1b\xcc\xc5\x88z.\xbf \x1a\xf1\xebQ\x80\xba\xf0\xb2\x98m\xa0\xe3\xba\xf4;\xa7X\xe4U`\x03z\xc0N\x91\xe1\x99\xed\x0c\xb3\xd7\xdc\xd2\xf2\x06\x87\xd7\x97tS\xbfSQ0h\xbb@\xe9n$\xd2\x02h\x08\xa7Di\xd0\xf0\xd1\xa0\x92\xfe\xa9r\x14V\xb0\x9c\xf6\x81\xc3\xb6\x85\xb2\xbf$rsW\xf8\x8b8m\x81\x87\xe4J\xe9\x9d\x10wB\xeea\xfe\x9e$\xbc\x96R\xb4\xa7S\x06\xec\xcf\xe8d\xd3\x1a\xac\xf6\xeb1 \x93>\xf9\x96\x1b\xbe\xbaa\xe8a\xfa\xc5\x12\x82\xfd\x95\x9dC\x12\xb1\xba\x10\x91\x19\n\xbbX\xfe\xc6_\xd9\xf8.\xcb\x0f\x958\xdb@\xe7i\xcf9\xbf\xaeDb\xe7\x12\xe4N\x14@\xd6Q\x923lW\xfds\x9f\x8a\xc8\x94\xf1\xeb[\xd5\xab-\xd5\x7f\xdf11F$Au\x07\x1e\xf8\xe6\xfe\xda\xae\xb9#[\xbd4\xc2\x87\tC)\x12\xcc\xf9\x92\x92f\xd6\x9b\x1a\x03\x87\xc9\xc3\x81Z\xde\xda\n\xdbXK\xf1\xdf0\x0e4\\\x1e\xfd\xe0\xaftI\xdfA\x88\xf6\xb4\xd3v\xad\x17pf\x04\x90K\x95\xc1Q\xaa\xa5\x99Xz\x1b\xd5\xc4|\xc1\x1c=\x914\xf7\xb4\xff:\x99@<\x92\xce\x83\xf5\x9f\x00\xa5o7W\xf4\x80\x87\x8f\xafV\x8d\xbcIw\n\xd8\xdd\xde\xab\x9c\xdc\xefz\\\x14\xbd\x8c\t\x92\xfcS>\x8et\xce\x91\xa6>\x13Q\xfeG\xdbL\xea\xdeW;\xea\xd6r=\xe7i$\xc9<7\xc0\xa8\xd0$\x1a\xb0\xc9\x05\xed\xb0\x17\xdb\x85\x0e\xdc\xdd\x06\x83\xeeR\xc4\xae\xa0\x84,\xeb\xc2V\x9aQ\xca\xda:\xa8@\x8a\x8b\xb1\xb1|\x89\xc5t\xc6\x88\xf8\xe9\xbc!\xd5T\\\xac\xfa\x07z5\x9c\xc9q\xaa\xd6\r\xcbe\x1cfi\xc9)*1\xe8\xc0\xdbD\xe5\xd4Mi\xad\xc2\xf3\xa8\xe8/\xe4\xdb\xac\x94\xf9fB\x87\xde\xb4\xbe"\xf7\xc9\x9af\xe5\xb6./\x8f@\x98\x04\xe7\xd7\x1c\xcc\x9e\xb6FG\xfd:\xa5i\xdb\xfa\xc4\x99eyK\x9dW\x1e\x8e\x13\xcc\x08x\xa0&\xc8\xd84\\\x98.q\xfd\xa4\xe5h\x0b\xa2\xc8\x04~@\xf8\xfe!\x1e\x05\x06\xfb%\xdd\x03$\xdd\xeci4\x832\xb3\xc4\x04\x1d\x86\xb4\x17\xe5\xaa(\xbcjo\xf0\x84|\x87\x81\x8f<Pe\x9f\xc78\xb0\xdcP\xc5\xce\x8d\xc0`\x1by\xf4\xdb-R\x06\xac\xfb/\xcc#\xac\xf7\xb2E;\t\xde\xdd\x9flFm\xa3\x800\xcb\xf1\xaa\x18\xf2\x86\xd8\x0b\xbavB\x9a\xd9e\xcd\x95\xcbUm\xd4\xac\xdf\x0b\xd2O\xb4#\x1f\xcai\xca\xf3`\x0fj<\x08\x0f\x9f\x00\x11\x008\xbfC\x93hqc\xfa\x045\x18\xd8=#u\xba\xf0FVY\xc3V\x1c\xd1o\xd3\x8b\xd1\xe9\x06Q\xd1y\xf2\x02\x80\xe3\x10\xae\xc8]Y\x9bK(\x88\xc5r,\xd9\xf3\xee\x15\xa2\t\x1d/"\x8d\x0f\x13\xc7\x94\r\xe2\x99l\xd4Ot\x83D\xact\x1f\x10\x98s\x05\xb4\xd6\xbdD\xd7\xc88\xe8\x0ce+\xed\x17\xb3<,\xbb\xfcL\x94\x06\xb8\xd8(z~\xd0f=\x19\x05ggT\xf8\x96\t\xfd\xf7H\xdb\x08\x8f\xbf\xb9~\xc2\x1bSa\x16\x01w\xe7\xd0\xa9\x84\xf8\x12>3\xf6]\xcb7D\xb5lG4\xec\xb4\x02y\xd5\x19\xf0c\x13e9OOxRY\xe0\x0b\xbe\xa6\xc0I\xd5\x8bx\xcf\xaf-\x8d-\xc7\xe0\xabwgm\x7f\xc0\xf6(\xd0N\xa0\xc4\x01{\xec\x1c\xbeN\xb1\xbd\xbe\x15\xbf{\xf1\x0b\xc6\xdc\xc6\xf4I\xc8IZU0\x0f\xdb^\xaf\xe6\xbf\xd5\x80/\x04\x80Z\xa7\xd3m*\xbf\xed\xf4\xb2Z\x13y\xaf\x8f\x13\xa3tr|\x0b\xa6\x81\xcf\xd7\xf2\xa6C\xa1\xeaq\x13\x18\x07\xfe\xf3\xb4\xab\x8e=\x86\xb4\xaf\x91\xeem\x12\x9d>\xfdM$W\'\x90O\x7fYo9\xe7\xf6\xff$\t-M\xf0_\x97\xb5\xbb=\xf7\x19\x0b\\\x84}\xabe\xbc\xfb\xefJ?$\x0c\x13\xc3\x88\x17\xea\x89\xb3\xa0M\xb9\xf8\xc3\x16R\xea\x9b?\x84\xd2\x18\xb5\xd5\x14\rx>\x82\x9bG\x8a\x8aI\xb4rW1h\xe0\x1b7 \xd6c\xba\xfd#M1a\xdc)\xf7\xa5\xe2\xd1\x9b\x12M\xe2)#\xc9\xeb\x9cGq[m\xabd\x90!\x0eZ\x86C\xc3\xf16\xff\xb9\x00v\x83"\xb6\xa4&\xd0To^\x00H\xe3\xc3\xc9\x94\x8f\xcd\x8b\x7f\xf1\xd1\x05\xed\x00<\xde-\xfa\x98\x809\xc5h\xfd\x9f\t\x80 \xb5\x95\xc4\x9d\xba\xe3Fz\xc1Y\xbc\x9d\x9d\xdf\xa7\xc3Z\xba\xe7/\x81`\xb5\x9f2uUv(\xd8C[C\xc6\x82\x84\x9a\x8c\x91\xf81\xd98=\xc9\x81\x81\xc4u\xc2p;\x1f\x91*M\x0c\x8c\xec\x95\xc4@\x98*\xf0\xc5\x99\x91\x0b\x8a]T\x88j\xd2\xb0h\xfc\x90]\xd2\xe8\xe3\x00\x136\xa0q+\\\xc3+\x0bo$,m\x93\xb8\xa2d\xad\x7f\xa1\xd1c\x82j\xa5\x8exo\xf0\t6\xd6:\xf8\xe7z\xbbK\xc3\xa3\xb4\xd0P\\+\xb1\xc4\xa7g\xe4\xff@x\xd4\xbf\xbd\xcd\xd7A\xc7m,\x90\x03\xd8\xa5kI\x95/Q\xe7\xba\t\x07\x87,Q\xb4\x82\rT\xc1\xe1\xfe\x18\x84\xfc\xb7\xeaJ\x9d0\x81\x0f\x0fe6c^\\\x0b\xc3\xf0/\x95\xb5\xcdp1\xac\xf0\xfe\xf1T3\x13\xdb\x1f\x9b\x9a9\x16c\x05j\xd4L\x82\xb3\xbf.\xcb\xacm1\x1b\xba\xa0\x00\xf4\x16x#dRa\xa5\xbb\x03\x84\xddVH\x96eQ\x99b\x8d\x81\x042\xa0\xe0c\xaeR\x19\xb7\x18\x88E\x14\'1\xc9\x86\xe24y]\x98K\xce\xf4\x1a)\'\xcb\xafW\xe6\xed\xf1\n2\x95[\x16\xf73\x96\xcb\xb59\xd0\x18 v\xc9\xea\xbb\xdb\xd6\xd0oI8L\x154<-\xba\x8e\xbb\x19\xab\xf9Q\xbf@\x91\r\x97\xec%\x9d\xa0\x90`B\x9d7\xbd\xd4\xc6]\xa6#Y\xfa\\\xe6F\xf5y\x0e\x97\x03\xe00\x89C~\xd6jJ*:Kz\x8c`2\x1e\xc3{\xfa\xf6@k\xb3\xf2!\xe9\xefx\x88!\x9f\x97\xc8)\x06|\xf5+\xdb\x96\xe3\xb6\xac\xebM\xee_m\xe4\xa1T\xc6\xae\xa5.M\x00\xeb\x13\xaf%N\xf6*r\xbc\x82\x83F\xf9b\xa3\xe3WnS\x02q\x15\xe6<\xda\xe1\xc6(\xf2\x7f\x01\xbf\xd3\xfa;\x1d\x8f\xff`\xaf\xc0\x80\xf8l\xb5 \xcc\xd3\xebQ\xb9X\x8e\x08\r5n\x05\x06L@\x07\x8e\xa5\x0eV-g0\x98\x06\xe9\x16\x97\xf5\x1a<\xde:\x14\x00\xe4(\x8b\xd7\x8f\xa3Z\xd6\xf7z\x1b\xce&\x05$\xb7\xc7\xfc\xf4\x03Ac\x8d[\x0c=k\x0c\x07\xe7\xde\xc4\xe3\xa3\xe8\xd2\xbf\x86\xe0\x96\x17h\x82V\x05\xff\xa0\xae\xd4Jy\xda\x1a+\x1b\xae\x8b^\xbfUIm\x11\xbf\x1f\x91\x1ax\xb1T\xed\xe6f\xf9\xf1-;\x14\xf8\x0c\x86<4i\xb1!\x9f\xf6\xe4T\xf3l.\xa6\xfaMW\xce\x0e\x12\xf7\x1c\xa9\x8e\x87 \xe0\xfa1[Q\xc7]\xe0\x1c\x9c\x10\xa0W\xe8\'\xc0\xac\xdd\x89\xfb\xfb\xd5\xdb\x01\xed\xdd\xd4\xa2G\xed\x8d\xc1\xbe\xc5\x1a\xa8-\x1d\xd2\nf.n]\x9c\xbb\xa8\xca\x06\xb6\x06\x00\xd8=\x1bCJ\xc1hD+<Fl\x15\x81\x7f\x99\xe1\xf6#\x07.\x9by6\xa9\x05\xa5\xac\xb7Z\xad L\x80\xfaM\xbe~sVv\x7f\x1d\x8e\x99V@\xa5r\x02x\xca\xb4zY\x12r\xbdT\xfe\xdd\xdf\x85*\xd6\x0c\x88N\x93\x85\xb0\xf1=Yb\xe3\xec\xad\x18\xa5\xa1\xbce?\x80{\xcb\xefT\xfb\xac\x1f\x8e\xba>\xfd6p\xcaq\xcfgc\xe3\xaf\x04\x9ae#\x1b\xb2d\xb2\xfeZ\x9d\xed\xddE\x8e\x05xEWQF.Z\x9c\\\x9b\xd8m#\x95\x9c};\x96\x81\xcf\x96\xaf|\xf0\x81\x11LR]F1\xc3\r\x92\xcc\xe0b\xc2\x0b\x07\xb36\xe0tF^\x94Z\x0b\xbe\x0e\xbe\xc7\xe6\xb2\x87@\x1d\x1f\'j\x8ed44\xca\x1ehQ\x80|:>H\x7f\xfe\t@j\xd4|\xf7\xdf_\x06C4>%I\xde^\xc2\xbc\x8cN\xba\xb7\xe8\xe6E\x10\xc9\x196\x89\x98j\xc7<\xe1\xaf\x97\xaeJ\xc6\xd2!\xe91\xa0L\xb7:\r\xb1\x9fi\x0e\x93\xfe\xa1}\xe8\xa8\xca0EL<G\xf7a"g\n\xeb"\x01\x10\xed?\xf6\xe6;\xe6l\xb3\xc4\x19p}\x08\xa8k\xee\x08\x94\x0e\xc7Cl\xde\xd1x\xab<E?\xcb\x1fa\xaf[\x90)\nj\x03l\x13z\x04%\xefKt\x14\x07\xbef\xc4p\x1fa+A+\xae\xc3\x9bZ\x1d\xbb\x19_\x14k\x8b\xb7\xdd\xc81\xee\xb8\x9e\xde\x89 C\x80\x9f\x15\x17\xb8\xf3\xb3\n\xf6~w \xe7\xca\x11_\x9e@\xb2\xbd\x87#\xadaQ\xdc\x0f\xa8\xf8]Fy\xde\xc0W\n\xcf\xc3W\xc4N|\xb8\x15Y\xdd\x87c\xcf\xc8Q\xf3\x176u\xf4\xfbH\x17\\\x8a\x95\x92p\xaaq\xf7\xf2r\xcfO\xb8\xa7\x1d\x04\xa7\x04\xd2\xf7[4\x8a\xac\xd2NBlW\xad\x11\xe5\xb6\xb2\xd6\xdf\x9fg-\xdb\xfe\x97\xdd\xf6\xab\xbcp\x99\x19b#+\x02I\xb7\xd2\x15\t\xa5\x87\t\x8b\xd4\xcaU]\xaa3\xea\xc7:6]<\x92\xd7\x16\xde=u\xdf\xc9/\xc7 \x0e\xcc\x7f\t-\xba\xd6r_\xb3\xaar\xc8\x0bi\xec\x9e\x81,\xa5\xc5L\xc1\xc07\xa8\xa6\xab\x83b\xdc\x17\x9a\xb3\xffG{\x04\xa9\xb3]p<\xe7Y\xeb\xd5EQ\x1d\x0fG/W\x1cU\xc5\x1e\xef\xc4\x89\x9f\x08\x9a\\\xea\xc7\x97Dd,\xc8+\x8cw/\xf5\xfe\xbe\x8a\xe8\x1e\x98c\x9c\xfa\x9f\xf6L\xd9\x06"K\xaf\xf3\xb7\xcb8\xe9s\x85\x85\x11tJ\xde\xb1\xb5\xb9\xe56\x02Z b\x9dg:-\x06k\x90\x1e\xe1\xfa\xa9J\xd5\x05\xd2O\x99\xd5\n8\xdain\xbf5\xb4#\x7fR\xb1\xc7\xdd\xd0-\x1d\x03Z\x18* \xd0R=\xe6\xab\xaagk\xf6r\xffL\xe6\x7fMsR\x0e\xb0m\x98\xb0\xcc5\xdeC\x1a\x12w\x0b\xbd\xe8s\xc5V~zp\x983\x80\x8f5\xba\x81\xd4\x1d\xe7\x12\xf7jM\xc1E=93\xf64\xa2\xb3\xa9tY\xa3\x13\x8fC\xc6\xb8Q\xba>\xf3.r4\xbdm\x05\x88A\xe9\xce\xf4K\xa0\x8e\xf5"u\x06\xb5\xc5\xd1\x84^\xb0\x9c\xcf\x1d\x92\x8a\xa2=uCj\xef%+\xfa\x97\xca,\xfa`$\xd3\x84i%\x0f\x04R-\xfcj\x91\xb6\xaf\xeb\xc4\x1a\xb3\xe8\x9c\'0v\xb3\xe7\xae\x81/2\xb8dB\xfe\'\x05\xed\x0c\x7fF:z\x85\x93\xd3\xd6Z\xc2\xb1\xeau\xea\xd7n&78\\G\r\x06\xd1i\xe1Q\xd4vL\x90$\xda\xf3<@Q\xa7\x9eK\xa0\x9eeJ\t(\x99?;cY\xda\xbdB\xc0(u#\xfap\xb5\x10\xd9[X\x1ah{k\xbf6hg\xfc\xda\xdb\xcf3O\xe0\x92\x8fI\x03w\x8a\x1d\xe3\xc0F\xe0\xb4\xf0Sy\xe9\xb5\x0c\xa8\xf2\xa6\x99\xc1v\xa8\x03\x14\xd8\xc7\xc1\xbe\xb0\xd5\xc3z\xeeU\x18h\xe4\x11,\x91\x9e\xc11\xb0z\x98\\`\xa4\xb9\x1e\xdf&@I\x1f\x12\x8bTJ)7\xd3\x10>5\x99\xf5\xc3\x91\xf6\x0c\xa0\xe9\rj%\xe1\xa0\xe4\xcb}\xdd\xc7\xea\xc9\xf7\x144\x8e\x90\x17\x83Gz\xc0\xfeY\xa1O\x93\xb6\xf5\xe1`\x89\x91\xab\xc9\x08O%\xfc\xf5\xdcR\xca&\x9a\xaf\xc8\x85\xb8\xd8\xc1<R\xec\x05$\xd5H<\x1f5\x91Y\xd7\x9d\xfe\x1b\xbe(\xa2\xf8\xa6{\x94\x98\x16n\t\xf3\x1eh|\x9a\xa2G\xaf\x17\x897\x1a\xb8?\x90e\x0c\x93SM\x1a>\xff\x9a\x17\xa3\xa6\x81\xabG\x01a\x8d\xfc7\xe7Z?\xbf:\xb1\xbe\xae\xd1Y\xef\xbbed}$\x80k\x92\xfah\xa4\xc9q\xd628\x98IC\xac\xff\x81</\xed\xa8\xb0\x0c\x19\xd8i\xf0\xabeN\x1a\x01 1\xfd\x83h:\x80\xbdE\xedH\x88\xf7\xdc\xe0\xf3\xd7s6\x0f\x9d\tJ\x14.\xb5\\4\x87]\x9d\x11\xbaS\x87\xf8g\x12\x9cR\xfcL\x9b\xfe\xf4\x8bR#m\xba\xa44\xa8!\xfaEF\xdf\xc0\x98w.\xf3\x82W]+\xe1\xd9\x1a\xa2\xd9$\xc4\'\x90\x00?)Yv\x00\xaf\x7f\x97\xabd\xf0\xb66fS\xfa\xe6||\x99\xc5_\'$|W4\x80p\xc4\xc0m+\x9b\xa4VGv\x1e\xcd5\x8e\x9c-\xb4j9\\G\xd6\xe5\xca\x92b\xb4\xc8C6\x8f\xbd\xfe\xd5\xccp\xe8vV\xe3h\x0b\xd3y\x9f\xaf\x96Et\xc0cf\t\xa8C\x1c\xc9\xa7\xb0v\x8fv\xac$93\xac<\xd6r#\xff\xa0H^@<\x16x\xfb\x1b=\xcc\x08\xd5\xed\xc4\x1e\xf3\x14\x1c\x0e\xf9\xcc\x96\x89n\x18\xa1\xf0\x921\xea\xfb\xedo9\xe3\x8e\xb6\xd5\x9c\x87\x7f=\xceC\x9d\xcb\xd9Q\xff8s\x9ce\xefw\xdfq\xf5.`\x03\xcb\x10\xbc\xb7c\x95\x11\xec\xb2\xa5\x83B]e\xdc\x85\'G\xfet\ru\x1er7.o)2\xc2\x89\xef\x0b\\]\xfc\xac\x04K7]\x0f\xe2\xf5Y7\x15\x0c\x02!\xeaxY\x96:\xc1T\x8fN\x02\xe24\x89\xe2\x0e\xea\x8c\x1d\xfb9\x17\xc4\xaf\xc5e}\x01\xfc)\xff\xa9\xd5\xaf\xd2U\x14\xdb\xe0\xe7iw=zDr\x9c\x81X\x15;SZ\x9f\xcd\x01\x9c(w\xae\r\x8b\xde \xbe\xack\xdbY\xeb\xe4\xb9\x8c\x10\xe4\r+Z\x9c!\xfd~\x8b\x96}J\xc2V\tr\xc5c\xcb\xf5H\xdd?\xae2\x91\xee\x9b<\x90H\xaa\xcd\x08\xc0d\xd3\xf5|\xbam\x97m\xefTH\xa6\x8e\xbe\xe7\x0f\xfe]\xa5\x96\x96l\xe3\xf2\x1d\xc8\xc6o\xf1\xb7R\xa5\x9ac\x87+\xef\xe7\xfeK\x04\xd4ID\xca$\xc5\'\x8b\xab\xef|\xa27\x184\x7fBe\xcb|RD\x0f0\xd6\xf0\xd0\xb71\x06\x1586\x1b\xd3\xb3\x80\x02\x89\xba!\x0b\x9d\x17\x9c\xd1\xbe&_X\xd65\x91d\xd6\xef \x8a\xcc,\xf5\xabn\xb9\x87\xcf(%\xcc\xcb\xad\xb8J\xdfY\xa7gp\x9e:\xcdC\xde\xa6>\xd6\xe9r\xe4\x99\xe2\x95N\xa5;M\x8c\xe66\x83\x86a\x1f\r\x86\xd6W\x18\x19\x1cr\x0e\x9f\xe6\xcd\xeb\t# \xf6\xb1\xb90Q\xdf\x9d\xaf\xecy\x17\x9c\xb3\x14\x11C)Y\xd1\xa6\x9cVs\x19\xfe9\xcc$\xf3\xb9;\x9e\xc0\xe1\xf2\xf0\x1a9\xff\xeb\xcdL\xd1^\x17Z\xedFI_\x85\xc1\xabvB\xafW\xb4\xc4nH\x95\x1aH\xd6s\xcad\x0c\x93\x06\x04\x01\xebs.\xf5\xfcL\x1dV\xae9\xf7\xcf\xfa\xf8\xefZcx\xd0F*\xab[\xd6\xb3\xb5h\xfa\x00\x12:\xc1\x14\x99\x86\x89\xb2l<w\t\xc1\xb9\xdc\xd5U\x8e\xa6..\xf8\xab\x17\xe5;\xee\xa7\x89\x7f\xde6\x8a\x91\x1e\x84*\x0c\x84\xfe[Zh\xce\x1d\x08;\xc6_d\xea\xc6B\x98\x9bF\x91c\xea,\x97\xd9\xe1\x19X<\x98\x0b\x06Vss\xbdT\xde,\x8b[\xab\x13OW\x8eY\x9b\xaf<\x96\x0eZR\x86n)8\xcc\xac=\x96\xf3y\xd3~\xd9Fy\xc8\xa6\xfb\x9bo\xa5Pc\x11U\x07\xe0\x1dA\x95d\xd6t\x82\x18\x87H\x04lg\x18$}\xf8QG\xbe*\x95\xe3$I(X\r\xae\xea\xab\xe48\xc8q\x1b\xfcD\xb6\xba\xa2\xb5\x1e\xd0\x04uqP\xdf\x10\xaf\x105\xef\xe2\xb3@\xa9\x8ad\xbd\rlkz\xc4b\xaaVa"\xcf\xa4\x9e\xe6\x14\xe3\xfa\xf0\x05\xa3S4\x19\x12\xb5\x02\x1b\x03\x06\xc6QR\xd2\xf0\xf6`\x81\xe6\xf0\x03\x02\xbdlI-\xf49\x1fm,\x0c\xf3_\x99\xfbq0\xa2x\xc1\xfc\xc3N\x90\xcc\xfd\x8e\xca\xfe\xb4\x11V\x8a\xc6M;\xeam\xb2\xd1\x7f\x06(\x85K\xafYL\x91\xbf\xdc\xda\x90 \x91\x1e\xf6\x8b\x87\xfcP_\xd6\x12s\xfe\xe7D^\x92E\x16Lj#\x97ip\xea\xfca\x1b\x1d\xdd\x18\xd0\xa7Z\xea\x14\xd6\x10\x90q\x03\xdb\xf2\xcf\x94\xcc`\x04U\x8d\xea\x81\x7f\xb1*\x90WZx\x91\xf5i\xa3\x99\xed;!Q\x91\xac_\xc1\x1e\x03\xfe\xf3\x9d7\x12\xae\xf2\x10!\xae\xcd\x82[\xdbw\xef\xaeP]\xff\xa1\xcd\xea\xc9`}\x0e\xad(\xc1\x86\xac\x14(\xa9\xcf\xd4%\xb3\xfcoY\xcf\x80\x1d\xb7o\x9c\xb2\x14\xd0\xbaM\xfa\xba\xad/>\xa4\t(\xca\xcc\xcf_\xd9X4\xc5\xea\xf8\xfc\x93e\xcaK\xcf\x81\xea7\x7f\xc1\xff\x9csA\xe6u/\xb6\x18K*\xef\xc9\xbb\x91\x0f#\xd3_l\xae\xe6u\xa0\xa1\xce\x1c\x8fQ\xfd\xdb\xb5>\x93\xd8,\xfbem\xb4n\xdf&\x08$V\xc7\xef\x9c\xed6\x17E+\x8c\x10\xab\x13{[\xab\xa8I\xa1\x16\xaf\x07\x1f\xac\xd3\x9b*\xf6\xb8\xc4\xca\xca\xba>\xeb\x1f34\xcfE\x04G\xce\xf5\x1b9Q\x1c\xf86\x1a\xbf>\x03\x0bQG\xe7\x05\xaapj\xa4{Ip\x98\xcf!~\xfaht\xf4\xc6\x87\xf07\xc3\xf8_E5;\x0f\x9d\x83\xe6\x85\xdc%%\x86^\x1c\x1dg`\xcd\x92\x98\x1c\xd7S\xc6\x98!\xc2Z\xe4\xe4D\x91A\xfeYn\xf4\x84_\xe1\x08\t\xed\xec\xf1\x0b]K\x9f\x94\xbc*\rI\x01\xddJilM\x15a\xbc\xd9\x8b\xbb/\xf86\x90\x93\xdaj&|\xaa\x01!\xf9\xd7\x95\xb5E\x07\x8cO\x10\\\xfc\x87\xd3\xc7_\xa2\tK\xe2\xb8\x11\xe7\xce}\x05&\x14\xf4S\x010\xa1*\x87\xd0\xaa\xc8\x00\xdb\x8b\xd1eX\x82j>j\x85\xf9!Xn\xed.\xb0\x8b\xea\x8e\x03\xde\x84\x9e\x9e\xab\xf5\xb0\xb2\xe0\x85\xc6f\xe7\xcf;Z\xfc\xbe\xbbb\xaf\xa3\x03\xe7+^\x04p\xac\'\xde\x11\x97{7\xc9he?.t\x83\x8dm\xfdK\xa9IO\xac\xe3i&H\xaeB\xcd\xb7\x10\xa5\xfe\x93\xc3\xdf\xb8\xd7zG\x13\x82\n=M\xe7\xb6\x83\\e\xc9\xea"\x8a\xd0\xc2\x9d0\xc7R\x99W\x892_\x0c\xc5\xb7X\x93\xcc$\x05\xd4\xd4l\xcb\r1\xfel\x92o\x1dH\xf3\x1e\xcd\xf3Y<\xe38\xee\xeey\xefW\xdf%\xe2\xea\x16=\xe5\x1f?d\xae\x9f\xca\x87\xcc\xeb\xfbbqb~-\x13?\x01\x87yw/?\x88.\xcb\xca\xda\xd3\x94m\\\xea\xf7\xa1\xf9\x07\xfcD\x87d\xf8\xf0\xa1\x8cog)\x89\x14\xc9\xb8 X~\xbb\xf1S\xd8\xf8+\x95j4s\xac\xf97\'\nL!\xe3x\xca9\x97l\xd8\x0bu\x1c\xcc9M(\xce{\x04\x0f')
|
4
|
-
|
1
|
+
from hiddifypanel.models import *
|
2
|
+
import flask_babel,flask_babelex
|
3
|
+
|
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
|
8
|
+
from flask_bootstrap import SwitchField
|
9
|
+
from hiddifypanel.panel import hiddify
|
10
|
+
from flask_admin.base import expose
|
11
|
+
# from gettext import gettext as _
|
12
|
+
from wtforms.validators import Regexp,ValidationError
|
13
|
+
|
14
|
+
import re
|
15
|
+
from flask import render_template,current_app, Markup,redirect,url_for
|
16
|
+
from hiddifypanel.models import User,Domain,DomainType,StrConfig,ConfigEnum,get_hconfigs
|
17
|
+
from hiddifypanel.panel.database import db
|
18
|
+
from wtforms.fields import *
|
19
|
+
|
20
|
+
from hiddifypanel.panel.hiddify import flash
|
21
|
+
from flask_classful import FlaskView
|
22
|
+
|
23
|
+
class QuickSetup(FlaskView):
|
24
|
+
|
25
|
+
def index(self):
|
26
|
+
return render_template('quick_setup.html', lang_form=get_lang_form(), form=get_quick_setup_form(),ipv4=hiddify.get_ip(4),ipv6=hiddify.get_ip(6),admin_link=admin_link(),show_domain_info=True)
|
27
|
+
|
28
|
+
def post(self):
|
29
|
+
quick_form=get_quick_setup_form()
|
30
|
+
lang_form=get_lang_form()
|
31
|
+
if lang_form.lang_submit.data:
|
32
|
+
if lang_form.validate_on_submit():
|
33
|
+
StrConfig.query.filter(StrConfig.key==ConfigEnum.lang,StrConfig.child_id==0).first().value=lang_form.admin_lang.data
|
34
|
+
StrConfig.query.filter(StrConfig.key==ConfigEnum.admin_lang,StrConfig.child_id==0).first().value=lang_form.admin_lang.data
|
35
|
+
StrConfig.query.filter(StrConfig.key==ConfigEnum.country,StrConfig.child_id==0).first().value=lang_form.country.data
|
36
|
+
db.session.commit()
|
37
|
+
|
38
|
+
flask_babel.refresh()
|
39
|
+
flask_babelex.refresh()
|
40
|
+
# with flask_babel.force_locale(lang_form.admin_lang.data):
|
41
|
+
# flask_babel.refresh()
|
42
|
+
# flask_babelex.refresh()
|
43
|
+
flash((_('quicksetup.setlang.success')), 'success')
|
44
|
+
else:
|
45
|
+
flash((_('quicksetup.setlang.error')), 'danger')
|
46
|
+
|
47
|
+
return render_template('quick_setup.html', form=get_quick_setup_form(True),lang_form=get_lang_form(),admin_link=admin_link(),ipv4=hiddify.get_ip(4),ipv6=hiddify.get_ip(6),show_domain_info=False)
|
48
|
+
|
49
|
+
if quick_form.validate_on_submit():
|
50
|
+
sslip_dm=Domain.query.filter(Domain.domain==f'{hiddify.get_ip(4)}.sslip.io').delete()
|
51
|
+
db.session.add(Domain(domain=quick_form.domain.data.lower(),mode=DomainType.direct))
|
52
|
+
hiddify.bulk_register_configs([
|
53
|
+
{"key":ConfigEnum.telegram_enable,"value":quick_form.enable_telegram.data},
|
54
|
+
{"key":ConfigEnum.vmess_enable,"value":quick_form.enable_vmess.data},
|
55
|
+
{"key":ConfigEnum.firewall,"value":quick_form.enable_firewall.data},
|
56
|
+
{"key":ConfigEnum.block_iran_sites,"value":quick_form.block_iran_sites.data},
|
57
|
+
{"key":ConfigEnum.decoy_domain,"value":quick_form.decoy_domain.data}
|
58
|
+
])
|
59
|
+
|
60
|
+
|
61
|
+
db.session.commit()
|
62
|
+
# hiddify.flash_config_success()
|
63
|
+
proxy_path=hconfig(ConfigEnum.proxy_path)
|
64
|
+
# uuid=User.query.first().uuid
|
65
|
+
# userlink=f"<a class='btn btn-secondary share-link' target='_blank' href='https://{quick_form.domain.data}/{proxy_path}/{uuid}/'>{_('default user link')}</a>"
|
66
|
+
# flash((_('The default user link is %(link)s. To add or edit more users, please visit users from menu.',link=userlink)),'info')
|
67
|
+
|
68
|
+
from . import Actions
|
69
|
+
action=Actions()
|
70
|
+
return action.reinstall(domain_changed=True)
|
71
|
+
else:
|
72
|
+
flash(_('config.validation-error'), 'danger')
|
73
|
+
return render_template('quick_setup.html', form=quick_form,lang_form=get_lang_form(True),ipv4=hiddify.get_ip(4),ipv6=hiddify.get_ip(6),admin_link=admin_link() ,show_domain_info=False)
|
74
|
+
|
75
|
+
def get_lang_form(empty=False):
|
76
|
+
class LangForm(FlaskForm):
|
77
|
+
admin_lang=wtf.fields.SelectField(_("config.admin_lang.label"),choices=[("en",_("lang.en")),("fa",_("lang.fa"))],description=_("config.admin_lang.description"),default=hconfig(ConfigEnum.admin_lang))
|
78
|
+
# lang=wtf.fields.SelectField(_("config.lang.label"),choices=[("en",_("lang.en")),("fa",_("lang.fa"))],description=_("config.lang.description"),default=hconfig(ConfigEnum.lang))
|
79
|
+
country=wtf.fields.SelectField(_("config.country.label"),choices=[("ir",_("Iran")),("zh",_("China")),("other","Others")],description=_("config.country.description"),default=hconfig(ConfigEnum.country))
|
80
|
+
lang_submit=wtf.fields.SubmitField(_('Submit'))
|
81
|
+
|
82
|
+
return LangForm(None)if empty else LangForm()
|
83
|
+
def get_quick_setup_form(empty=False):
|
84
|
+
def get_used_domains():
|
85
|
+
configs=get_hconfigs()
|
86
|
+
domains=[]
|
87
|
+
for c in configs:
|
88
|
+
if "domain" in c:
|
89
|
+
domains.append(configs[c])
|
90
|
+
for d in Domain.query.all():
|
91
|
+
domains.append(d.domain)
|
92
|
+
return domains
|
93
|
+
class QuickSetupForm(FlaskForm):
|
94
|
+
domain_regex="^([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,})$"
|
95
|
+
|
96
|
+
domain_validators=[wtf.validators.Regexp(domain_regex,re.IGNORECASE,_("config.Invalid domain")),
|
97
|
+
validate_domain,
|
98
|
+
wtf.validators.NoneOf([d.domain.lower() for d in Domain.query.all()],_("config.Domain already used")),
|
99
|
+
wtf.validators.NoneOf([c.value.lower() for c in StrConfig.query.all() if "fakedomain" in c.key and c.key!=ConfigEnum.decoy_domain],_("config.Domain already used"))
|
100
|
+
]
|
101
|
+
domain=wtf.fields.StringField(_("domain.domain"),domain_validators,description=_("domain.description"),render_kw={"class":"ltr", "pattern":domain_validators[0].regex.pattern,"title":domain_validators[0].message,"required":"","placeholder":"sub.domain.com"})
|
102
|
+
enable_telegram=SwitchField(_("config.telegram_enable.label"),description=_("config.telegram_enable.description"),default=hconfig(ConfigEnum.telegram_enable))
|
103
|
+
enable_firewall=SwitchField(_("config.firewall.label"),description=_("config.firewall.description"),default=hconfig(ConfigEnum.firewall))
|
104
|
+
block_iran_sites=SwitchField(_("config.block_iran_sites.label"),description=_("config.block_iran_sites.description"),default=hconfig(ConfigEnum.block_iran_sites))
|
105
|
+
enable_vmess=SwitchField(_("config.vmess_enable.label"),description=_("config.vmess_enable.description"),default=hconfig(ConfigEnum.vmess_enable))
|
106
|
+
decoy_domain=wtf.fields.StringField(_("config.decoy_domain.label"),description=_("config.decoy_domain.description"),default=hconfig(ConfigEnum.decoy_domain),validators=[wtf.validators.Regexp(domain_regex,re.IGNORECASE,_("config.Invalid domain")),hiddify.validate_domain_exist])
|
107
|
+
submit=wtf.fields.SubmitField(_('Submit'))
|
108
|
+
|
109
|
+
|
110
|
+
|
111
|
+
return QuickSetupForm(None) if empty else QuickSetupForm()
|
112
|
+
|
113
|
+
def validate_domain(form,field):
|
114
|
+
domain=field.data
|
115
|
+
dip=hiddify.get_domain_ip(domain)
|
116
|
+
if dip==None:
|
117
|
+
raise ValidationError(_("Domain can not be resolved! there is a problem in your domain"))
|
118
|
+
|
119
|
+
myip=hiddify.get_ip(4)
|
120
|
+
if dip and myip!=dip:
|
121
|
+
raise ValidationError(_("Domain (%(domain)s)-> IP=%(domain_ip)s is not matched with your ip=%(server_ip)s which is required in direct mode",server_ip=myip,domain_ip=dip,domain=domain))
|
122
|
+
def admin_link():
|
123
|
+
domains=get_panel_domains()
|
124
|
+
if len(domains):
|
125
|
+
return "https://"+domains[0].domain+hiddify.get_admin_path()
|
126
|
+
else:
|
127
|
+
return "https://"+hiddify.get_ip(4)+hiddify.get_admin_path()#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
128
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|