hiddifypanel 3.0.0.dev63__cp38-cp38-manylinux2014_x86_64.whl → 3.0.0.dev65__cp38-cp38-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.
Files changed (72) hide show
  1. hiddifypanel/Events.py +27 -4
  2. hiddifypanel/VERSION +1 -1
  3. hiddifypanel/VERSION.py +1 -3
  4. hiddifypanel/__init__.py +7 -3
  5. hiddifypanel/__main__.py +13 -3
  6. hiddifypanel/base.py +88 -3
  7. hiddifypanel/base2.py +40 -3
  8. hiddifypanel/models/__init__.py +10 -3
  9. hiddifypanel/models/child.py +26 -4
  10. hiddifypanel/models/config.py +105 -4
  11. hiddifypanel/models/config_enum.py +207 -4
  12. hiddifypanel/models/domain.py +106 -4
  13. hiddifypanel/models/proxy.py +55 -3
  14. hiddifypanel/models/usage.py +58 -3
  15. hiddifypanel/models/user.py +171 -3
  16. hiddifypanel/panel/__init__.py +7 -4
  17. hiddifypanel/panel/admin/Actions.py +170 -3
  18. hiddifypanel/panel/admin/Backup.py +80 -4
  19. hiddifypanel/panel/admin/ChildAdmin.py +122 -3
  20. hiddifypanel/panel/admin/ConfigAdmin.py +54 -4
  21. hiddifypanel/panel/admin/Dashboard.py +70 -4
  22. hiddifypanel/panel/admin/DomainAdmin.py +195 -4
  23. hiddifypanel/panel/admin/ProxyAdmin.py +128 -3
  24. hiddifypanel/panel/admin/QuickSetup.py +127 -4
  25. hiddifypanel/panel/admin/SettingAdmin.py +224 -3
  26. hiddifypanel/panel/admin/Terminal.py +51 -4
  27. hiddifypanel/panel/admin/UserAdmin.py +277 -4
  28. hiddifypanel/panel/admin/__init__.py +82 -4
  29. hiddifypanel/panel/admin/adminlte.py +13 -4
  30. hiddifypanel/panel/admin/commercial_info.py +23 -3
  31. hiddifypanel/panel/admin/templates/config.html +1 -1
  32. hiddifypanel/panel/admin/templates/proxy.html +2 -2
  33. hiddifypanel/panel/admin/websocket.py +9 -3
  34. hiddifypanel/panel/admin_2.py +33 -3
  35. hiddifypanel/panel/asset.py +17 -3
  36. hiddifypanel/panel/cf_api.py +35 -4
  37. hiddifypanel/panel/clean_ip.py +125 -3
  38. hiddifypanel/panel/cli.py +172 -3
  39. hiddifypanel/panel/commercial/CommercialDashboard.py +59 -4
  40. hiddifypanel/panel/commercial/CommercialSettings.py +224 -3
  41. hiddifypanel/panel/commercial/ProxyDetailsAdmin.py +38 -4
  42. hiddifypanel/panel/commercial/__init__.py +50 -4
  43. hiddifypanel/panel/commercial/restapi/__init__.py +14 -3
  44. hiddifypanel/panel/commercial/restapi/tgbot.py +57 -3
  45. hiddifypanel/panel/commercial/telegrambot/DefaultResponse.py +11 -3
  46. hiddifypanel/panel/commercial/telegrambot/Usage.py +71 -3
  47. hiddifypanel/panel/commercial/telegrambot/__init__.py +6 -4
  48. hiddifypanel/panel/commercial/telegrambot/admin.py +120 -3
  49. hiddifypanel/panel/commercial/telegrambot/information.py +123 -3
  50. hiddifypanel/panel/common.py +98 -3
  51. hiddifypanel/panel/custom_widgets.py +71 -4
  52. hiddifypanel/panel/database.py +18 -3
  53. hiddifypanel/panel/hiddify.py +655 -4
  54. hiddifypanel/panel/hiddify_api.py +70 -3
  55. hiddifypanel/panel/init_db.py +393 -3
  56. hiddifypanel/panel/usage.py +85 -3
  57. hiddifypanel/panel/user/__init__.py +25 -4
  58. hiddifypanel/panel/user/link_maker.py +416 -3
  59. hiddifypanel/panel/user/templates/home/multi.html +1 -1
  60. hiddifypanel/panel/user/user.py +233 -3
  61. hiddifypanel/static/css/custom.css +11 -0
  62. hiddifypanel/templates/500.html +1 -1
  63. hiddifypanel/xray_api.py +109 -3
  64. {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/METADATA +1 -1
  65. {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/RECORD +69 -71
  66. hiddifypanel-3.0.0.dev65.dist-info/top_level.txt +1 -0
  67. hiddifypanel-3.0.0.dev63.dist-info/top_level.txt +0 -2
  68. pyarmor_runtime_000000/__init__.py +0 -4
  69. pyarmor_runtime_000000/pyarmor_runtime.so +0 -0
  70. {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/LICENSE +0 -0
  71. {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/WHEEL +0 -0
  72. {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/entry_points.txt +0 -0
@@ -1,5 +1,124 @@
1
- # 2023-04-08T15:11:14.248211
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\x08\x00U\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\xba\x16\x00\x00\x12\t\x04\x00\x8a\xd3q[y\x1c\xcf\x99\xf6\xe0\xbdZ\xe5JS6\x00\x00\x00\x00\x00\x00\x00\x00\x050\x9e\xf05\xe7\xd9\xb4V\xfb\xa8\xa5\x16\xb6\xcdE\x90\xde\xc5\xde\x14\x11@\x9a\xca.\x8d\xa4(\xa3\xc6tC\xef`\x89\xc7\xd7\xc1\x85\xc3b2!d\x96<\x1c\xce\xe5\xfe7\x0f\xee\xcd\xdc\xce\xe8\xb6l\xad\xbf\x94]g(/\xee\x0b\x98*.\xeb\xd1\x94X\x9c\xe5\xae\xc5\x1c\x86\x99\xb7\xa7dB\x94]\xc5\xdc\xb1\xba"\xdd\xd6\xe5_B\xdb\xfd#\xf4\xd0\xee\xad\xcb\xbd\x11\xf9\\\x0b!\x13\xd4\x8e\x84D7r\xbe\x0f\x13\xc2\xd3t4l\xe1\xdci@^6v\xa6\xef\xe8\x9c#\x9c\xde\xc2\r\x1b\xcf\x1c\xe2\xf3\x06e\xa3/o\xc5\xbb\xe3\x90\xca\x15Y\x99kQO\xd8\x8f\xa7s\x11\xf1kN/\xec\x04\x1e\xc0x\x12\xbf\x9dV\xdb\xd0L\\6\xd5R0:R\xe1~]s\xba\xd2\xe5\x06\x9b\xe2\'\x1aS\xe3\x8cp\x84\xca\xce\xa4\x8f\xf9d\xc9\xdd\xe9\x9fu\xd7[\xd94\xaaC\xe7\xdd\te\x0b\x91#\x91h)\xe6\xea\x0c\x86\xb5\x1d\x13\xb1\xcc\x9d\xb7\xc8\x9f\xab\xe3\x00S\\O\x8e\x8b\x06\xda\xf8gDc\xd5\xfa\x82\x0f\xb28s\x96\xf5LIM*7\xf3y\xf5\xac\xf5\xe1\xba\x83S\x89\xbe\xfd]\xb0\x0f\xd5#\x08\x03p\xd8\xc6\x91Wo)}\xbb\xb2\x06*s\xdfk)i\xdb\xd2/\x1cq\x17\xb2\xa7\x81\x87B\x03\x1fV\x95\x91\xb7\x03\xc8\xe3\x81p/\xe6\xd8\xc5p\xe3\xca@\x8c*\xb9\xf5\x97&\xee\x05\xf1\x9br\xaf\x1e\x82\xc5\x05\xda\xc6\x07\x80\xf2`\x12\x89v\xec\'\xfc\x8b\x04Ep\x7f\xf1\xf1\xb8\xe3\xe1\x06\xb9\xca\xaas\xc3\x963\x18*K\x93\x00X-\xc0<\x1e=\xe083F\xccQ\xc0\x87s\xcb\xec\x7f\x88\xbe\xa2\xdf\xe1\x9f\x07\x88\x0f\x18Ma+\xaf}ry\xd3\xd7\x14\xf5\xd2K\xfe\xf8\xa7\xed6\xb6]r>u;\xd7\xe3w&\x8d\x15{\x92\x03\xb7\x00\xef\x17\xbb\xb5\xf0\xf7\xc8+K\x1ec\xb5{\x91\xe1$\x8d\xd1\xcf&~\xe3`N\xc1\xdb\xed\x91,M#\x9b\xd3\xa7_\xa1\xa5\x95\x85F\xf4\x9d\x056\x8e\x8b\x0c;\xcc\x15|%\xc0\xce\xf2\xe6\x17sL\x0e\x19\x1c\x82aUQ \xb6\xee\xedH\x16\x7f\xf2oU^"\xe8"\xf2\x04\x0f\xb6\xa2\xec\xe5\xceIo\x0c\xa9*\xc4\x11\xe8.\xe7-\xa8\x93\xa2\xae\xf5\x8b\xd2[\x88\xb3\xec\xa4)\xf7a\x98\x0f\xb7\x04\xd4d\x8eC\xc6]%\xf3\x16\xe9\xf8\xf7\xf6BQ\xbcX0\x10\xcb\xb5 \x1c\xfc\xb0\xb4\xaa3\xa9\xfcH\x8bI\x15l\xeak\r5\xc1\r\xba\xc1\xaf98\x9eI\x93\xcd\xb7WvE\x7f\x9e\xa6[B\xa8\x85D!\xe7\x91\xa7?/$\xa5_1\xb2\x0b\xf7&gC\x8e\xfc\x81\xbca]@\x93\xd1\xe3\xd3\x0cl|\xcd\x7f\xb5\xdc\xd2\xecn\xd5\x86\xc8\xa99\x18\xb73\x0f\xb7*T\xdc#?\x82Ct^\x8c\xc9M\xb2\xcc*l\x0f\xb7\xb5\xa1;\xb2\xf7Y\xd9\xac\xa1\xe1\xad\'\x8a\x18\x90X\x0fL\xdf\xdeD\x8b;\xfeS\x97\x9bpE#\r\xf4d\xba\xfb\x0bz\xb1\xa3H\x8c\x1c\t\xd6\xe1\xadA\xaf\x03\xffHJ\xd0n\x00\xaah\xa2N\x83\x14\x00\x0b\xed\xf2u\xcf\xafT\xa4B\xa9\xd2\x8dGR7\xde\x8d\r\x9c\xcc\x9b\xd7\xc7\x10\xd8\\\xc5\xc7P8\xc0h\x04\x90\xf4>\x88y\x9a\x1euK\x06x\x06\xc8.\x01=\x1fP\t-,_\x18\x98\x858\t\xa7\xc57\xde\x16-\n\x04\xdc\x10\x80\x8e\xf5?r\xeb\xd2\x0f\xb6\xbfa\xedM\xf5\x9d\xdc\xf0j\xc4u\x11D\xc7\xd9\xa8\xf5\x14\x93#\xd5\xc0eu8\x03\x81\xe7\x1f1\x8bY\xea\xa6\x80\x82$\x05ek\xf3\xc3\nH\xf4A\xcc\xe5\xac\xbf\xfes\xbb<\xc8\x06\x89,1\x90\xf1\xc0\xc8m\xf8>S-\xd8T\x19\x98W\xc0*V\xd1\xeb\x86\xf6\x07U\x8f\xe8\xc9\x8aD\x1c\xf3:t\x0cEb\x95J\xa0o\xa4`\x8a\xf5\xae\xef\xd8\x06\xe5\x94\xbe\xcc;B\x8e\x1fz\x14\xa8\xe5d\xd8\xfb\xee\xd7\x91\xe9\x94d\x8c\x84\xaa\xf8\x7f?\r\x04\x91\xfb\'\xa2\x8aj\xb6<\xaes5\xdd\x0f)\xe7\xaa\xca\x89\xe7Nq\x9d\x9ct\x9az0\x1c\x1e\xfe\'\x1f\x13\x82\x06 \xe18;\xc9\xc7\xd6\xa7\xfe\xc2\xc0}\xebN\xcd\x1a\x01~\x19\xcb\x93\xb9\xa2N\x14\xfa\xaa\x1e{\x87Q\x85\x17\x014\xff\x1fV\xce\xfbz* \x86\xc1\xa8c2\xc8,\xef\x89\x18\xa9\xec\x0f\xb9\x1d\x1aQ\xec\x82\x8e\x8cdak\x1c\x1e\x9ei\xbazy\xb5z*\x14\xe8\xfa\xa4\xfb\x11}\x89$\xa5\xb3\xcd\x85UvQ\xc4\xd1\x1e\x1a\xdf\x02\\\r\xc3t\x03\xe5\x85\x8c\x1d\xa8.\xf6\xfc\x8a(H\xfd\xc1\xec\xc2\xe5\x942\xcb\xe8\x10p\x00\xe7\x94\x0c\xe3\xe2.o9\xfcM\x8a\x90\xf4wu\xe4\xd4\xf0N\\\xc1\xa7C\xec\xb6>\x029\xd4\xbf\x03\'\x01\x03\xbeb\xfaFi\x04Fvy\x14\xd27\xccj\x14\n4\x84t\xf7i\x7f\xb5oJ\xbc\x92\'^&\x06\x8c\xaafB\xb7\xd5\xce.\xa5vk\xe13\x92i\xd2D\xe5ww\x88s;\xe1\x9c\xe4Y\xbeU\xcfJ?R\xb1N\xeaW\xb2\x1cL3\xb2\xc2\x8e\x8f\x96[\xdc!\x19\xf6\x9e\xc1~\x08\x8b\xd0\xcc\xe8\xf36\xf2`Fi\x9c@\t1 \xd4U\x86lS\xa4\xd9\xcc\x96~\x9c\xda7\xd5\xd8K\x0b\xc9t4{\xb8\n\x9f\n\xbaDt9\x0cFMza\xef\xa7\x1b\xd0o\xa3\\\xb8\xfa\x81;\xfc\xe4Vi\xf7\xe8\xf5\x04\xf1\xdc \xb1\xb2T\x83\xf2RHm\xe6\xb6\x8e\xbf3\xd6\xfb\x15(Nk\xec4\xac\x08{Ib\x08\x95\xde\xd93\x05w\xcd\x07\xa1\x99?q8\x1dz\xd5\xc9\x80\x03\xd6\'\t\x85;-K\xf8\xf9{\xa8\x95`\x14\xd0_\x834\xde\x01\xb66\xd4e\xbb\xf6V6zP\x87\xc4\xf3R2T\xabp" =\xac\x84\xcc\x04*\xa4E\xe2jI\xf3]\xff\xd7\x02T\x94\x0e\xd3\xc0Z \x8a_\x94Y\xec?\x98\x87\xc5\xd0j4\xc53\xba\x05}\x9a;-=\x08\xa4\x87\x1cA\xe5\xfa\x947`\xf7\x18\xb3\x92P\t\x0b\x1f\xbb\xf2\xf8>\xfd\x9b\x18T\xb9?(\xcc;A\xd2\x97v\xd3]M\x11nX\x8c3\xe2\x08\xae!\xf0\xc9\xc6\xc7K\x13\x9c\x07\x9ek\xb1\xa6}m\xa5\x03*\x80$\n\x1b\xdbN\xa3d\xb6N\x9dY\xc8l\'\xab\xde\xba\x98\xb8\xa7\xd4<)\x83\xac\xab\xed=\xc2\x1b\xb4n\r\xcc\xcb\xeb\xfe\x01\xa8j\x8a\xbb\x8b/L\xa1\\j|\xadm\xcf\xdb+\x95\x891\xbf\xf5]\x92N\xd2\x15*\x1e\xb7\xc9K\xf8\xba\xfeW"\xdcl\xb1\xf1g\xb8x\xcd/\xe9<\xa5\xdd\x13\x16Brd\x14,\x82\xc4l?\xae\x7f (4g-\xf7IL\xbe3\xad\xfc\xaa\xc6H4\x1eu7\xb0zV\xb6Ts2\x9dm\xdb\x06\xc8@U\x05\x99\x8d4gp1\xd8\x14\te\x87\xd30j\rwK\xda\xd9\xdf\x93\x16\xa0e\xcc\xa7\xc6{\xe6\xd7\x8c\x7fQ\xd5\xe8\xcc~b4\x0e\x03G>\'nJ,\x83\xdd\x9f(\xab\n\x14\xb4\x8d\x06 y\xe2\xe2&\xe10i\xedE\xeb"\xe2\x17\x9a\xa9\x92\xd8s\x0flU\xdfk]\x8c\x01\xf1\xbb+\r\xd8Z\x166\x13!\xb9\xd1X\xech2\xabq\x08\x98.\x15\xdbu\x92\x12\x8b\xac:8\x85+\xd7\xf5k\xaeS\xa5\xb7\x92\xd9G\x9aDl\xa4\x06\xc2\x84\x16y\x9d@\xddv\xa9\xa5\x02\xa8\xc1\xf7X\x9dQ\xd2g&v+pI\xd8&Q92\xa4\xf2\xb6\xad\x11\xb0\x81\xbb\xb5\x10\x91\x80!\xa9r\xce\x0b\x1c\x10\x02\xd0&5\xff\x98!\xabmr\xca\x8cE/\x9a\x86\xe68\xfc\xb7\xb9r}\xb8\x9cA\xe8p\x8f\x1bh\xfb\xb1In\x90\xf7\xd0\xacJ\xcc\x0b\xfe\xd0\x1d\x91\x01\x97\x87`\xac\xa0\x81\x89-\x14\x9ay\x9e\x12\xd8\xa9_l\x06\xf3j\x08O;\xe9\xeeDl\xcd\xe7\x10\xb3\x05\n/\xe4\xd0c\xfdP\xe3\x94\x18\xa3\xf6\x15\xda%\x81Dg\x8atb0JK!#\x16U\xf4\xcf\xd1@B\xa6\xba\x81\x91\x81\x90\x85\x05\x9d[:rw`g\x0c1F\xed3\xa6&\xa8!\x9e.\xc71H\xb3R\xeb\x16\x10\x02W\xb3J\xf2\x86\xaet\xc1\xc3\xa4<\xa0v\xe7\'\xe9#\xe8\x01`\x0f\xd4\x8eR.\x03\xa3T\xf6\xba\xdb\xd5\xf9\xf0\x1e\xdfnu\xa9H/\xd1\x8d\x0b5\xdc\xd0\xc5\xd8\xd5V1l+\x17d\x04\xad\xe7coW{\xbf\xd7\xde\xfag\x1c\x9f\x04\xb3\x81\xbc\xe6H>4R\x92\x19y\xb8\xdc\x07CS\x0eE\xc0\xf5J\xdd\rf\xb4\x97\x88\ru\x06R\x13\x9dD\x1c-\t\x04\x84]\t&s\xbc2\xa0\xd44D\xbf\xbb\x8e\xe2\xae<\xa6\xe3\x14\xdc\x88\x02x\xd0\xc2f\xab\xdd\x95?\xc1>(\x17\xbb\xd0\xae0^$\xe1\x1b\x1e\xbc+d\x00\xdecAu\xde\x1f\xcb\xc4\xc8\x17\x87\xa3\xa7\xdd\n\x17/\x91\xa0vq\xdb\x83B\xc2bJfr\x9d\x03\xfcjK\x94\xc4\x91s\x8f\xe6\x01\xf2\x14l\x1f\xac\xa3\xda\x92\xc8\xf5\r\x0e=\x1a;\xf3\xdd\xbc\x13\x08!\xa6\xe0`\xa4\xfe\xf92w\xc4\xa43\xc1\xa6\xac9\xb7,\xc0H\xca\xf7\xffJ\x0f\xb5k\x1b\xb8p\x06\xe8P?\xc8F\xc8\x9af\r\x1a\x96f\x1b\xf7\x9euA\x0e\x14\xa3\x9d\x15\x92\xbd\xa8\x15\xa5\x0f\xb93\x83\xbd\xe0\x91\'(\x0b\xbb\xc3m\xdaw\x03\xe8\x9f\xf4\x9c)K\xc0\x1f\xd1X\xc7\x9c(s\x94IRR\x08\x1f\x01\xbe\xdb\xcc\xe0\x9a\x7f#\xb6\xba\xca\xfd*\x80p&\x7f\x97q\xe69Po\xcf\x93\xdf\xdcm\xf5\x899\xc4P\x14\xcdY\x8f2\xee\xa3\x85[/\x859L\x98\x02t3\xad\xa5F\xf8\r\x10\x1a\x1d\xdd\xc2\'\xf0\xec\xa7\xd9\x00\x15]#R\xc8\xb8G%N\x11bH{\xa6&\xad\x07\x03\xe6g\xf4\x18\xf0\xca\xa6\x0c\x0b\xd9}a\xea\x98\xcb=\xd9\xacn\xbf@\x08\x811\xa2\xc5?\xa5l\xb1\x15<\xd5\xc1&\xba.&E$\x0b\x0c[\xa2\xa0\xe2\x1a@\x8d\x85\xdd\x84%K\xe2\xa4\xc9x]\xd1\xe0\xb9\xb2e\x17\xe6\xf2\x80\xce\xa4\xd1\xdcFp\xfc\x02:\x0c\xeb{i\x1c\xb5`K(\xb6\x8b\x96lEHt\xb2#\x8f\x90\xcc\\Z\x91\xcfU\x18\x0f\xf5\xcb5@m\xeb\xd2l\t\xff#\x14s\xff\xc0~\x9e\xef\x98\xf9\xed\x81xv3\x90\xe4K83\x9a_\x91H\xbb\xaeL\xc2-\x909#\xc48#\xc5n\xe7M\xc8\x9a@\x9e>\nh\xd2\xf3\x07\x03\xfe\x9a\x18\xa7k\xd1\xdd\xbb\xe9\x9a\xc60\xafW\xca\xaf\x80\x98(\xb7^\\\xed\x07\xd9`\xa9L\xbd\xccd\x80\xc9\xdb\x91\x1c\x05\xd9\x1a\x89\xc5\xd4\x9e\xbd\xff\xf1U\xb1\xd8\xf1\xa3\xf5\xfb\x7f}\xac:\x92\xa9\xa7\x08\x8b\xae\xfa\x1e1\x02\xee\x85\x11j\xa9\xa5\x1d\xbe)\xa9p0\xba\xd6\xf2\x8f\x13-q\x7f_*\x10\x8b\xe8\x07\x9e\xd9e\xee\x1as\xddj\xaa\xe9\xe5}_\x8d~\xdf\x96:]\xdb\xb3\xd8\xf48`y6\xf9_\x97\xe9b\xa2\xb5\x97\x00\xa8\xe1\x8aU\x13\x90>]\xfd\xc5\x0b\x8c\xac\xceX\xbaQ\x9a]u\xfe\x04\x99\x18\xe6\xe8s\xbbq\xf0J\x8a\xb7\xb2&\xe6\x17\x0c\xac$:z\xfa_r\x18q\xa3jZQQ\x01\xc2-\x0fc\x1f\x9c\xa79\xe9:*\x8f\xe0&t+\xcay\xbe@\x0f\x19\x8f1\xe2\xf9I\xed\x8c\x17\xc9d\xd7\xbdw\x0f\x968O(c\xd0\xe4\xb9\xda\xec\x8c\xffOJ\xfbP\xbb8sq(\x12\xe0\xc5I\xcb-\x8b\xe3\xf8\'\xcc5\x9b\xca\xa5\xd5`\xb8\x04\x83\xeb\xbcyM\xd7]\xa17<\xe1\xf6\xfc\x81\xa0\xefM\xc1&h\x0f\x11\x88\xdfj\x9b\x98\xbd\xeb\xdeZi\xe6e\xd4Q\x01\xfc\xa7\xa1\n\xf6\x05~Z\x01\x84\x05VNL\xedm#O\xf44\r\xf9P\xaf\x02j\x96\xd9\x94\x12Pxr1\x9e\x10g\x8e\xa8\xf8\x0c\xa8/\xd9\x88\xca\xb0?\xfb\x95\xd4\x8a{Uqy\x8c"\x941\xb0\xde;2\xa7\xf7\xf0\xfe\xf1\xbe\xdft\x1bj$W)\xcaL\xe6\xee\xa5\x15\x8e\x05\x96\x05]\xbf\x8dSzA&\x1c\x16Kz\x1e#\xd5Hmm\r%i\xc9\xdd\xc8\\\xd3p!+I0\xb6\x84\xa2\xa5\xa4W]P\xdbT\x94(^\x9b%\xe5M2\xf9 \x07w\xbf\x14"D9\xa7!\xfcM\r\x05\x0fZ^R\x8e3\x01K|\x89\x05\xd7U\x87\xcc\xb5\xf0\xf4\xfd&\x19\x0cd+~\x9a4\xca\x8c\x06\xd2\x1e\x02o\xa1H\x8f \x17\xd5o\x91Q\x05H\xac\xa7\xc0E\xf7\xf1\xa8\xc7\x9cL\xc7q\xeb\x17%6\x00\xaeaA\xc2bF\n\x80\xbd\xd2\x89&\xc0\x9d\xbc\xb9*\xd1\x0b\xdfG@\xa7\x83<\xd30d#q\xd6zWV\xe3\xce\x89AI\x06[\x01%\xf6\xbb\xe4\xe2\r*\x94!\x913\x88\xf3\xa4\xe3\xd7\x19#\x94\x06\x14a\x9b\xc0ZY\xc5\xeda\xf8z@[\n\x99\xe8&\xb9_\xe95\xa3r;Nf7\xc9g\xce:8\x9c\x94:\x91`r\xd7\xc1\xc5]\t[\xc0>\xd9\x84u\xc0\r\xa6\xec\xb7\x1d\xaaP\xab\xaa\xc5\xad\xf5@>$2\x08\x00\x0fou\x12\xc5t\xad\x81\r9\x19\xf8\x96\xc6\x8f\x97/Q\xa67X4\xea\xba\x00\xac\x11\x95=\xeb\x18\xfdL&\xbf\xad\x08\xe7\x90FB!=\x99\x1b\xad\r2:\xe2\xfdV\xa3V0\x02#\xa3x\xdb\xae~8\x16\x84\xafho\x80\x15\xec\x8c7\x8e\xd1\x02\xb7\xa1M\x10\xa1W\xdf\xdf\xbe\xc9\x8e\x946\x87Y\xd3\x811\xc9\xed\x8en\x0fg(\x8c\tE\x12\xa1\xd3\x80o\xa6\xea2"\xbd\xfb\x12\xd9\xder\x11\xd3k\xb6\x14\'\xe5=[H\xe7u\xe1t\xd2\xd0\\\xa4e1\xb3\xf6U\x9b\xe1\x1f\t\x924\x8d\x84\x0cb\x04\x11\xd6\xdc\x06\xea\xfd\x9c&K#\xc8\x87\xf1\x1e}\x94\xe11\xfcX\x01\xd2\xb4\\\xc4\x88\xafi\xcd~\xb8\xd1\xff\xd8!\x9d\xbf\n\xc9$\x1a\x18"\xb3\xc4\xde\xfer\xf9\xae\xe76Z\x8aR\xd2e\x92F\x87 \x7fPlB\x0f\xe1\xff\xc9%\x86Zp\x96\xebA\xd1\x91K\xf9\x15\x95\xaf\x13\x9e\\\x18\xcbMS\'vx\x08\xbd\xbcT\xb7\xea\x9f\x8b/n\xd0\xb0\x95p,\x88\xba\xe5w\xb2XK!\xb0\xe6\x1bW\x1e\xf8|L\xd1\x9d\x97\x0bN}\xf7\xe6\xea\n\xaa\xb5\xb7g\x9ezZq\xc2\x19\xf6\x88\x95|\xe1\xbe\x91Hi6@4\xce\xd1\x96\xf7\x9c\xfb\xef\xba:\x99\xc3\xd8[\x84\xde3Q\xea\xc1#\xd9\xfc\x078\x82^\x128\xde$7K\x82\x7f\x9bY^\xe8\xae\xea\xee\x13A"x\xe1sR\xc7j\xa4\x13\x19a\xf3T\xd8\xea\x00\xcf\xb8Q\xc2oB/A\xe1\xealP\xe2\xa0\xbe\xef\xa6-\xdc\x98\xa0\xdb8X\x8c\ts\xf5l5\x97\x1b\xe2\xc1\xfb\xc9\x8a\x02#\xe9\t8!\xffn\xe3\xd6\x90vha\xae\xbc\x0b~\x90\xac&6\xaad\x9b\xe7\xf69e\xa3\xcf\xdd\xd2G\xc5\xabH\xbb\xa7\xf5t\x14\x0c\xb2\xabbe\x07\x01\x92\x84\xd2\xec\xe5\x10[\xd6\xb6T\xf2X\x0c\x84F\xd1\xe4)\xaa\xd3\xe5\x1e\x1f\x8e\xfa\xe9\x9f\x89\x08\x86Q\xd4\xb4+\xde\xe1\xe7\xa0\x95\x08A\x8cb\xaeQ\xc0\xcay{mV\xff\xcf\xb2\xd7\x13\xb5\xb0SX\x0e\\\xd8fc\xbd\xc6\x80\x1c\x0bhp\\\x87\xb7,\xfe\x91\x0f\xf9\xdc\xfb\x02\x03\xf7<\xb7\xc6N\xc0\xc4e\x87\xe4\xa2~}&\x15\xd6\xc5\x04\xda"jj\xb5k#u\xb4.\x18\xd3\x0c\xcc\xa2\xf4x\x1c\xbex\x8e\x8eV\x19g}_R#\x9el\xda\xdc\r>+\xc9\\n\x00\xd4\xe5\xfb\xa6\xb7\x80#\xe2lD+\x9f\x96\xbbM\xd8\xbbj\xcc\x84B)\xd1\xbc\x03 \x93\xdcA\x7fW\xc7\x93\x0f\x8f9K\xb8\xdd\x93i\xc4)ZB>\x0b\xd5\x13%\xcdH\xc0.\xb8\x9c\xa5\xdcju\x971\xe0\xcea\xecNVk\xb0\x85Y\xc7\xca\x90\x7f\x9a\xaeu\xa0\x82{\xce\xc9\x1e\xa5\x80\x96b\xf4\xb4\x08g\xc3\xba$\x87B\xf7\xe0\xff|]\xae\xd2\x07\x01\x16n\xe7\xcd%\x7fX\x83K\x1b\xfb\xcd\xd4r\x1b\x1b\xae[\xab\xa0\x16S\x92\xb1n\x8a\xe3\xd5\x10W\xb1\xb1\xea\xfa\xdd5\xbf\x96\xa9\xb8nb>ZL\x99\x9b\xf4\xbd/n\x07F:\x16#\x96\xae\x9d\xc6H\xdbA \xe0Q\xba"\x9c\x1c\xe9\x07\x87\xe7^\x89$bK\xc5\xa8\xc7\xc4\x17}\x99\x9e\x10J\xe6\x02\xc9\xf9qCp\x90I\xac\xe0\x13]\x02\xb2\xca\x03\xceI\xa5O\xd9\xc9\x90"\xe5,{\xfb\x9ckQ;\xfe\x80%\x8aU\x86\x91\xf8\xa0S\x8f\xde\x13\x02c\xf0n\xc2\xeei\xe8h\xe8\xe0RO@\x12\n\xf3\x8epA\xb4\xf8\xc3\x8b\xbf\x05|L2\xb6\x01\x91"\xb5D\xb8 \xed:1\xadw\xf4\xda\xf7=\x91Tu\xb4\xf8\xdf3\x91\x9b\xa9\xf0N\x8d\xc9\xf0\xc8v\xd1\x83\x92\xe5{\x97\xebC\xad<F\xa5\xd8I\x19V\xd4\xbc\r\x10\x90\xd3\x11\xbf\xc2\xb7}\\\x925\xa4\x87\xc1\xf7\xcbbdY\xf7\x0c\xea\x92\xdf\xf2]\x17\xc8\x82\x98\xf2\x97\x0c~\xc1\xccw\xd2It\x06\x0eR\xfe\x1cSo\x8e\n\x13\x93P\x8d|QZ\xf3%\x1f\xcdvS\x0cQ\x13Q\x99\xad\xf2\xb9\x95\x7f@\r1\x18\x18jtB\xbf\xb7T\x9f\x99\xd3\x1c}>\x95\x81\xf3)5\xb5&\x11\x7f\x9e\xca\xabf\xe1\xee\x88\x8e{Ft]\x94\xb4c\x19%%\xed\xef#3P3f\x94\xfe\x97\xac6\x14R\x13\xdf\xb3H\xeb}pys\x0c\x95\x05)\x8d\x183\xd2\xea\xbdu\xbd\x16\x10\xbb\x8d\x08\xff\xd7\xf7\xaf#o\x97o\xe6;\xc5E\xc5\x9b\xa3\xc5\x9e)\xc9\xf2\xdf\xf9Hw\x1c\x9e!\x98\xf8E\x8fv\xc0\xd7~Vzp\x1b\x9e\xeb\xa7]\xb2\xc6\x99\xdb\x8cj\xef\xa4U\xe8h\xf1f\xbe\xe8Ft\xc5\xa0\xdd\xae\x82\xe5l<\xfc\xd5E\x87\xbd\x81\x89+\xa5\x04C\x17?ux\x95\n\x8d\xef\xcf\xc0m\xa0%Bp\x9cJ\xcf\xf2;\x80\xe0\x18\x19\xaf8\x1b\xd9\xcd\xc1\xb7\x01s\xca\\\xf3\xcd(\xa0\xe9PLX\xf1/u&\xefa\x80\x8dr\xe04~\xe2\x17\xafC\x7fM\xcf\x9f\'\xc1L\xc9\xe1\x01s\xfbf\xceomv\\d\xbbv\xd3a\xd6F)\xed7\xae\xa7 \xf7\x1a\x07\xcf4\xcar\xddh\x82\xcf\xb8O\x9b\xa5Z\x1c\xa6\xe1\xabS\x08}\x96{\xae\xffa\xe6.\xfe\xe6\x86f\x04\x9f\xbccFR\xf1<\xdel\xd4\xc4\x86\x8d\xb6RU\xb0\x8d\x8b\x88\xd3\xa1s\xb2)\x1ajb\xc7d\xe1\xe0 \x1f\x15}p\x00\xa5\x13ev\x858\xaaDB\xa4\x0e\xd6-\xfc\xb3\x95\x07,+\x8ar\x07\x87M>\xca\x18\xbd\xb5\xc2e\xee0 \xbd!(%\xa4z\xea\xe5\x86\xfd\x9d\x1a7*l\x81\xea\x10\x1c\xb6\xd22m:\x06\n\x16\x1c\xc6bx\x0b\x1c\x91\x80\x9b\xc9\xbd\x08\xab\xfc0-O\x85q8\xa3\x99\xe36\xdb\x02d\x16ZDs\x9b\x95&&\xccz*1\xedaR"WI\xecd"\x11\x8b\xfc\xd9z\xa8(^4h\xe2\x10)\xee..[\xb39\x97\xbcs~AW\x1a\x0f4\xc1\xf9\xb8\x831\xf4\x88uR\x8aO\x1f\xba\xab\xfd\x98\x9f\xae/\x105-\xe2\xbeR\x1c^p\xd6\xa2s{\xd3<_\x93\xa9\x94\x132\x92$pz\xab\x1eF\xa4\x1a\x9e\xbf\x07\x8d\xe0\x8b\xb7?\xd0\xbaIk\xa32c\xa3\x18Ty\x8a\xee>wT\xa0pd \xc4\xf3\x03\xe2\x8c\xed\xfb\xd6\x90)\xa5\xa1\xd6lk\x87\x1f]i\xdc\xe9\xde\xd31v\x9ax\xd1\xfb\x83\x90@&\xe7-FT\xcc\xf8\xd1\x16\x1b\xf6/N\x02\x03a\xd0|\x97\xf7Gwj\xd4\xb6\x00y[\xce>\xeae\x16\x01\xce\xc6\xd1\x89m\x00\x1a\xac\n\x1f`\x80\x99\xbb\xb1Am\x10>\x85\x91\xfbN\x06!\xa2\xd6Hr\xac\xcae\xd5\xbb\x0b1\xc1\xb7\xb75\x8b\xa9\x9c\xf4\x87\x83\x97s\xa2\xa0\xdb\x81pBy\x04\x05*\xa9\x03[?qN\xb7\x14\xccr"\xc8\x0bO\x93\x7f\xd8\xdc\x0f\x8f\xc7\xd4\xff0\xc2\x1b\xa9y\xcas\xfcx\xe5a4\x80\x96#\'Mt\x0e\x87c\x9a\xcd:\xcd\\\x1e\x03Q\xe8\x1b3N\xb0\xf5d>LS\x7f,\x8f\xf4\x08*\x8a\xb7\xa9\x82f\xb9\x1e\x82\xfa\xdd\x8ei7\xe2:\xfe\x0f\xfe)\xb1\x1f\xd2\xe2\xb1\x88Ty}M\xb1p\x87\x8e\xf3\xf2\xcf\xe5\xab\xaf\x81G\xdf\x94 F\x7fa\xadkg\x8d\xb3\xcf\xec,\x18\xcb\xf1\x8c\xe4\xd9\x0e(\x81(\xee\xd2\x98\xb5\x89\x04\xb4\xcb\xff\x1fx\xec\x8cu}\x00\xf9I2\x8a\xe5\x17\xf3i6\xf1\'7]V\xeb\x03*\xb2\xba\x18\xd4\x80\xab\'s!\xf9\xe7\xc8\xea\x8d_c\x0c\xbe\xc9\x89\x1d\x00\xc1)\xb4\x06\xff5-\xe8\xf7\x97\')J\x9a&\x9ae\x82\xad/\x95{\x9f\xfeW\x1a7\xf4NS\x03\x99O\x85bNQ\xa3\x9a=\xe5\x9f\xde\xa2\xd7\x03\x98.\xc3*\xcaQz\x88\xd4yvo\x95\\8\xcdM\xafq/\x95\xd5\xdc \xf0nGZ\x87\xaa\xaar\x91\xe38\x97\xfc<\xe3 \xd3\xab\x1eMy\xc8\x84^\xb7\xac\x0c\xde?\xe6s\xc0\x0e\xab"\xd5\xc4\xe4\xef\x8e\\\xbd\xf9\xbbS\xbe\xec\x13q\xd6!\xdf\x16\x007\x06\xdf\r\xfd\xcaG\x0cK\x10\x0b\xfa\xd2\xb9#\xdf\xd3\xd2P\x94\xa2\xd9H\x02\x1d\xdb\xf1\x9b;\x86\x7f\xd8\x15?\xff\xcd\\V|(]^\xde1\xa9/\x0f\x87\xe7\xcaE\x91\xac\x91\xf4|TN\xa3\xd6B\x90\xe1\xad\xceXbk\xf8\xee\x19\xba\xe0L_\xf1\x96\xe7\xe6&\x9c\xf7Z\xac\xaf\x960"\xbb\xe6m6\x8f\xc9\xa41\xc9\xe3\x97U\xcd\xb5e\x8f\x11\x81\x85\xb9\xc2 \xbf\xcc\xc9md[:\xff\xee\x8fk\x06\xfb<\x84RE\x98u\xc6\xee3\xe6\\=\xae6\xbc\xea\xecb\x811\xad\x14\xb9)a\x07|CDe\xd98\xbfgkH;\xe8 \xc3R\xd4\xcd\x97\xad|Bg$\n\xc62\x81chz \x95\xfc\x97}\xdf\xab^L\xfb\xc1\xfc\x8di\xba\xaa5OyM\xfbsr\x98@\x0b\xe2\x1bP\x7f\x1d\xf7o\xf3L\xfb\x82e\x86\x89k\xb2<\xd9\xea\xf3\xfe\xb7\xef\xf9.\xae\x83(\x99w\xa3\xa6&H:\xcb\xac0\xd7/\x04E\xe5\x904\xbf\xdcMF\x06U\xe1\x92\r\xba\xb1\x8fB\xeb\x83\x971\x13\xf1\xa7\xed\xf12\xcd\\\x0bS\xe7r\x17e:z\x7f\x13\xb9#Y\x97\xfb\x18\xcc)\xed\x94\xd7\x126j\x15\xe3\xf8\xddRmA\x1f\xc1\xa7\xd2\x0e\xf0\xe2\x7f\x1b\xa5\x9esB~\xc8\x19U\xe2\x92w\xe8\xc4\x9a\xa2\xd5\x0c\x00\xcc\x84M\x04\x88\xa4\xe2oG\xec\xb6\xf4\xc95:\x00\x84\xa4k\x85%\x04\xae\xdc\xc4^[&\xda\x84G4nX\x0f"A\xa7\xe4\xcabq\xb0:\x84\x13x\x8a\x15\xf8)\xbf;hr\xd0L\x95\xa0\xf7\'6\xcf\x0c\xa6L\xe8\x8efK\x00$]D\x08\xb5w\xa5\xc7)U\xc6\xa0\x03\xc0i\xfb\xeb\xbf\x04\xe7W3\'\x1d\xa7\x05\xaf\\\xfd1#\xbab {\xf1\xca\xf7Vs\x0f\xae\x12\x07*4\x8b\xd5\x99YI>\xee\xc0\x04Y\x12\xcc\xe3\x97~\xbf\x95-I\xdc\t \x81\xf8\xc9\x15\xfer#\x18W\xb6t\xbb\xa6"\x8fB\xfc\xb3AU`\x8aI5\xcd\xadS\x10\x965~\xcav\xb2_D!\xdb\xcd\xb2\x90q\x9a\x12NxT*\xa5\xb0+,\xac3\xee\xf6Th\x95\xc7a.\x8c\xd7\xee\xcaKx\x91\x9d\x06\xc0\x16\xf3\xb5\xf3\x94\x95\xb0\xd4F\xbc0:\x8d\xef*[g\xb1[h1\x1f\xec\xdaC\xd9\x86\xfb\xff\xfc\x05N\xabB\xd7\'\x81EZx\x1c\r\x07\xeby\xdbW/\xd0m\xf2\x87\xf8\xc9x\xd6N\xaf.\xf2\xe8s\xce\x95\x99\xfc\xd4m7\x91w\x94\\\x80\x1eRR\xc6\x0f7 \x8cr\xdd99\xb0\xa72|\xdd@\xe7i\x00\x8e\x9bs\xec\xbe\xe9\xae\xad\xc6$\xe3\x8b\x04\x12\tr\xb8&\xa3%M\x04\x0eti\x93')
1
+ from flask_admin.contrib import sqla
2
+ from hiddifypanel.panel.database import db
3
+ from wtforms.validators import Regexp
4
+ from hiddifypanel.models import *
5
+ from wtforms.validators import Regexp, ValidationError
6
+ from .adminlte import AdminLTEModelView
7
+ from flask_babelex import gettext as __
8
+ from flask_babelex import lazy_gettext as _
9
+ from hiddifypanel.panel import hiddify
10
+ from flask import Markup
11
+ from flask import Flask
12
+ from flask_sqlalchemy import SQLAlchemy
13
+ from flask_admin import Admin
14
+ from flask_admin.contrib.sqla import ModelView
15
+ from wtforms import SelectMultipleField
16
+
17
+
18
+ from wtforms.widgets import ListWidget, CheckboxInput
19
+ from sqlalchemy.orm import backref
20
+ # Define a custom field type for the related domains
21
+ from flask_admin.form.fields import Select2TagsField,Select2Field
22
+
23
+
24
+
25
+ class ChildAdmin(AdminLTEModelView):
26
+ column_hide_backrefs = False
27
+
28
+ list_template = 'model/domain_list.html'
29
+ # edit_modal = True
30
+ # form_overrides = {'work_with': Select2Field}
31
+
32
+ column_descriptions = dict(
33
+ domain=_("domain.description"),
34
+ show_domains=_('You can select the configs with which domains show be shown in the user area. If you select all, automatically, all the new domains will be added for each users.')
35
+ # current_usage_GB="in GB"
36
+ )
37
+
38
+ # create_modal = True
39
+ can_export = False
40
+ form_widget_args={'show_domains':{'class':'form-control ltr'}}
41
+ form_args = {
42
+
43
+ 'domain': {
44
+ 'validators': [Regexp(r'^([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,})$', message=__("Should be a valid domain"))]
45
+ },
46
+
47
+ }
48
+ column_list = ["domain","show_domains_list"]
49
+ # column_editable_list=["domain"]
50
+ # column_filters=["domain","mode"]
51
+ # form_excluded_columns=['work_with']
52
+ column_searchable_list = ["domain"]
53
+ column_labels = {
54
+ "domain": _("domain.domain"),
55
+ # "mode": _("domain.mode"),
56
+
57
+ 'show_domains':_('Show Domains'),
58
+ 'show_domains_list':_('Show Domains')
59
+ }
60
+
61
+ form_columns=['domain','show_domains']
62
+
63
+ def _domain_admin_link(view, context, model, name):
64
+ admin_link = f'https://{model.domain}{hiddify.get_admin_path()}'
65
+ return Markup(f'<div class="btn-group"><a href="{admin_link}" class="btn btn-xs btn-secondary">'+_("admin link")+f'</a><a href="{admin_link}" class="btn btn-xs btn-info ltr" target="_blank">{model.domain}</a></div>')
66
+
67
+ def _domain_ip(view, context, model, name):
68
+ dip = hiddify.get_domain_ip(model.domain)
69
+ myip = hiddify.get_ip(4)
70
+ if myip == dip and model.mode == DomainType.direct:
71
+ badge_type = ''
72
+ elif dip and model.mode != DomainType.direct and myip != dip:
73
+ badge_type = 'warning'
74
+ else:
75
+ badge_type = 'danger'
76
+ return Markup(f'<span class="badge badge-{badge_type}">{dip}</span>')
77
+ def _show_domains(view, context, model, name):
78
+ # return Markup(f'<span class="badge badge-{badge_type}">{dip}</span>')
79
+ res=""
80
+ for d in model.show_domains:
81
+ res+=f'<span class="badge">{d.domain}</span>'
82
+ return Markup(res)
83
+
84
+ column_formatters = {
85
+ # 'domain_ip': _domain_ip,
86
+ 'domain': _domain_admin_link,
87
+ 'show_domains_list': _show_domains
88
+ }
89
+
90
+ def search_placeholder(self):
91
+ return f"{_('search')} {_('domain.domain')}"
92
+
93
+ # def on_form_prefill(self, form, id):
94
+ # Get the Domain object being edited
95
+ # domain = self.session.query(Domain).get(id)
96
+
97
+ # Pre-select the related domains in the checkbox list
98
+ # form.show_domains = [d.id for d in Domain.query.all()]
99
+
100
+
101
+ def on_model_change(self, form, model, is_created):
102
+ model.domain = model.domain.lower()
103
+
104
+
105
+ dip = hiddify.get_domain_ip(model.domain)
106
+ if dip == None:
107
+ raise ValidationError(
108
+ _("Domain can not be resolved! there is a problem in your domain"))
109
+ if not hiddify.check_connection_for_domain(model.domain):
110
+ raise ValidationError(
111
+ _("Domain is not correctly mapped to this server!"))
112
+ print(model.show_domains)
113
+ if len(model.show_domains)==Domain.query.count():
114
+ model.show_domains=[]
115
+
116
+ hiddify.flash_config_success(restart_mode='apply', domain_changed=True)
117
+
118
+
119
+ def on_model_delete(self, model):
120
+ if len(ParentDomain.query.all()) <= 1:
121
+ raise ValidationError(f"at least one domain should exist")
122
+ hiddify.flash_config_success(restart_mode='apply', domain_changed=True)
4
123
  #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
124
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -1,5 +1,55 @@
1
- # 2023-04-08T15:11:14.141629
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\x08\x00U\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\xca\n\x00\x00\x12\t\x04\x00\x17\xcf\xf891 Lw\xf9\xf8Ze\xbf\t5Q\x00\x00\x00\x00\x00\x00\x00\x00E\xf2y\xe5\xf3\xf5\xbd#\x07d\xc9N\x08\xc1\xb1\xb7\xf1\xf5\xf4\x1f\x80\xf5\xf6\xcf\x89\xcfK\xce\r\r\x8c\xa5\x11|\xd7\xa3\xdd\xa7\x82\x19g \x1c\x8e\xe63\x84\x940\xb6\x10\xda\xb5@\xc3B\xa0\x90d\xe1\xabr v\x86\xca\x92\xba\xc55z\xddS\x06G\xb1\xbc\xfaPW\x9f"\r`XV\xd2jr\xd3N\x9a\xd1\xd7\xd7\xd5\xe93)[\x9cQ\x1a\xfe\xeb\xd3.\xdf\xba\xc6$NV\xa9;>\xf0\x12\xd7\x97\xd7\x1e\xa0\x00eK^\xd9\xe7 \x88\xed\xee\xb7rxU\xf9f\xabWT\x8e\x00\xb8{l\xef!\xf8\xddg>M&\x84$\xb9g\n\xd1\x03\x8fK\xe8\xfd\xb3\x7f\xdd\xa3\x7f\xdc\xe8a\x03\xf9\x0b\xde\\\xbc-\x1e\xd06}-\xe5\xad@\xae\x05t\x81w\xbf\xc9St*\xddC\xe1b \x1bE\xf4\xbd\x9c4\xff\xa1,\xcd\x96 \xfa\x12/\xe7Uu\xcez=\x99\xcf\xc9\xacH\xce\xec\xbcQ\xd0\xd0\xaai\xed\xda\xae\xf3\xea\x0e>\xd3\xb7\xd9\x86\xc7+\xb1\x18\xa5A9\xf6!$\x95*\x83\xdf\x98>\x81\x18t\x93\x8c\xce\x08\xe0Y\n\xff9\xba_\xfcztY\xa1\xfb\xfe\xc4\xd3\x88\xa9\x9fA\xc9;\x0c\xc6=\x80\xf1\x16\x86\x85\\t}3\xc7h]\xab\xfb\xfc\xc3\\\xd6\x0b\x84\x0b\x85\\j\xa4e\xa9\n\x12~\xaa\xaa\xe67\xa4\xb0\x86i\x01\xa5\x95e\x81,\xa3\xfe00\x99\xeb;E\xc3\x12\xd9.\x11\x1fn\xb3\x05P\xff\xa9\xb1\xf5\xfd\xa7\xd4\x96\xefcAFd<\xf61w\x0e7a\x18W\xc3\xdb/\xce\xab\xcc\x9a\x03\xcaZ\xf2\xfd\x01\x18}\xd5\x01Sx?\x18\x02\xa6\xb3\x89\xd2\xc3i\xf8\x14~\xd3\x0e9\xa4\xf7(\xca\xfa\x8cy\xcd\x11\x96\x1bN7o\xbc\xe2\xf4j\x8ey\xf5\x887\xaa\xf6\x0eq\xadG\xb3\x9b\x92\xb4x\xc2\x94\x1a\x1a\x9fN\xfb\xcbwd\xb3\x971>\'\xc9z\x1d4\xd9\xd8\xf6hi\xd8\xe0%\x01\xe1\xe27\x1dp\x89O\x8c\xe9\xd4\x85EF\xac\x8d<E\xc1\xf3\xbe\xb9\xa7\xda\xf7\xcd\xb0T\x8b\xb9\xa4\x8eO~\xd4Y\xc1\xe3\xd7e\xf8\xab=\x85\xd4b\'\xdf\x8fUj\xf1*\x03\xb2\xfa\x19\xe6\xe4\x01&\xa3\xc3!\x81\xfe\xec\xc91\xa7\xe0K$:\r\x0f`\xecmkM\xa2\xf7\xa7\xbd1e\x10Y\xe9\x0bc\xca\xf0\xa0\x8a\x9e\xf8\x1a|h\xc1\xb5\x88\x8e5\x16\x8c3\xe4\x05\xb3\x12\xe6\xc4\xda*\xf0\xb5\r\x9f\x98\x01\xe4\xabx%E\x9f\xb2\xb2,;3yg\xf8\xff+\xcc\x12\xa3]\xdd\'9\xa7\xf8\x85c%dq\xfc\x18&\x0c6w\xf8p\x01\xcc\xa9r\xff\xf3QHc\x9f\xb9\xbf\x184\x9f\xd7A\x9eX\x9f \xd3T\xc3\xeb\xb0\xdf\xb6\x86\xf6\xa4\x15{\xc8\x96\xc5\xde\x80\xcf\xf5"U\xc5\x93w\x12\xc9\xa4\xe7\xc2\x88O2/W/\xd6\x9dL\x8by\x00> ~\xff\x81\xe4\xb0c\x1a\xcc\xbc\xd8\x11L\xd2\xee\x91`\x7f\xea+\xa0\x15\x1d\xb5V\\O\x8c\xcd\xbd\xbd\xc2\x8aT\xa02Y"\x8d\x1e\xd9%\xd5\xd7\xe0\xac\xcf\xb5\xfb\x83\x01\xe0\x12\x9aA6+\x1a\x1f\xadFuch\x920p3\x05\xed\x02\xc9n\xca\xc2\xc5qPx\xbc]\x1ch\xb1\x97\x1c\x1bgF\xf0^_\x81\t\x03\x7f\x1dJwz~u\x92\xfc\x89\xc64r\xb9\xe1<[\xb6.\xc8}\xf6\x80M\xcf@\x91\xca\xb6}\x85\xde\xcf\xf3>U@\xbe\xf7\xf0\xb8\xde\r&\x9fhPf\xa5\xb7\xad}`\xb1\x7f\xd0\x01\x82Q|\xb6\xa2\xb5\xd8\xc9\x84\xe7~\x99\xbb7$R-e\x9b:U\xfft\xd3[\xa5\x986\x87e\xeb\xf3km53\xf2\xc7\x17\xa34$b\xa2?Rm\xdb\x94\x9b^\x00\xa4lK\x13\xfc\x03\xc3\r\xd4\xe6\x07\xb0\xa7\x84\xe4\x1c\xf7;\x8b\xb7Xb)\xc1\xc1nUg\x8b\xe6\xe6\x06\n\xd2\xe6?\x04?e` Cd;0\x9e`}\xe0\xd8\x87\x13\x94\x97\x03\x9c.\xfb\'\xae\x8d\x9bS\x1a\xf3"\xca\x8e\xdb\x95gq\x88\x16\x1e\xcaR\x83\xd0\x022p\xeb\x1bxs\x0c\x99\x82\x95\x15l\x86\xa6\xf96\xb7\xf0\x1d!\xe8s\xa9f\xc7\xed\x03.T\xee\xdfVZSB\xca/s&S\xad\xe0\xb6\x1f\xcb\x11\xc6P\xc9o)H\x01\xd4\xbeO\xab"\x16I\x92\xd6\xa4\x16c\xef\x8f\xb0\xa0\x00\xea\x8a\xe5\xe1S\x1cR\xe8\xbb\x7f\xa1\xb2\x17\x93(\xaeo4\xc3\xd9P=\xe2{\xe9\x94\xd6\xb7V\xaf\x1c\xbb\xc1\xe2\xc6\xd7\xb2}\x9f\x87\x98\xab\x9cb\x06\x99/F{\x91\xe0\x0f\x86\xdd\x9bKag\x1e\x8a<\xc8Oi2\n=\xb4UU\xded\xff\xfd\xc7\x08)\xbf\x98\xce\xa9Y\x86\x0cc\xbd\xe1\xdba\xcc\xc9\x86\xf2\xd3+\xc4px\x04\x0b\x19\xa5\x8bI\x13Pv\x08\xf6\xe0\x1aTX\x0cP\x0b\x85\x97\\\x99F4\x0e\xbd]\x07Q\xd9\x92\xb0\xca\x81:\xc89\x1cg\xa1!\xe4\x11\xd4DyZ\xef\xb6\\\xf2\x90\xa0Y\x08\xe9`\x86\xf9jGhw\x84\x97\n\xa9\xcd\xc9\xe2;\xf9$I\x1e\xf6->MY\x0cZ\x07\xcb\xbcI\xba\xdc\x86-b\x88`\xfaQ\xf8\xca\xe0,;\x06\xc1M0\xfeo=\x08\x9c9\x06 \xff\xcd:\xb7N\x1d\xe7\xf1x0C\n\xda\x85\x9d\xe5\xbf\xee\xba\xf2\x83.\xe6*?\x0b\x01\xc6^\xbd\xea\xe6:\xcc~\x1e\'\x8a/\xcd\xc4^lo\n3ANH\x08X\\R\x85\xb5\x1br\x7f\xf2\xbbG\xde\x87F\xad\x16[\xb5=\x98\xa03^!#\xb35@\xb8\x8b\xd73\x8a\x03L2\xba\xf6\xbf\x88\x8dS\xcb\x9b\x03\xc4\r\xe5\xecM\xe4\x9b\x9f\x1a1\x12\x13\xdam\x91\xc7O\x1f\x01a\x01cKg\xa6U\xaa}\xf0Uh]\xc0w\xf4\x8a5\xc7\xef\x98\x07\x93-\x99\xbf\xa19O\xc9\xc8\x1dbJ\xc0\xbe\x02\x1f\x8f\xca\xce\xb8\xe4\xa5\xc8\x83\x899\xe0zl\xffn\x83\xda\x16\xefC\x0e\x114\x1a\xd3\xb0}PQ3\xc9\xa6i\x00(e\xa00\x87<|_\xe0\xbdx\x84L\xde\x07s\x15\xd3\x82\xb8dOW\xce\x10\x1b\xdb\xb3\x12\x97\xfaa<\\\x8e\x938\x95\xabzz\xe9\xd3t\xafk\'\xc4\x8c,T\x98G\xe6%\\u\x04qo\xe1\xd1\xdd\xeaM\xac\xb2\x8d\x1e\xc0\xe3\x18\x08\xd2h{\x8d\x07+`.-"\xe2,\xe0\xad\x93\xe0\xf9A\xe7N\xfaA\xfd_\xc2\xe4\xc1\x14|\x0e\x96\xa1\n\xcd<\x9f\xe6\xd4E}/\xae\x87\x02U\xb8\xf7\xa5\xf6Q\xb3\x05uZHr\x17\xcd\x82X\x8e\x9d\xbf"\xaav"ZLa\xd86\xec\xd6\xaa-H\xcb\xfc\xd7\x86\xb3\xe9u\xb4\x9cj\t\x0c\xe0\x9d\x92\xd0\x12\xbal\xd7@[H\xd6\x8b\x85I\xf04\x89\x8e2aj\xcd\xe6eX@\xd4\xc6)Zia\xc7\x83\x80\x899\xb0\xa8\xcfW\x82)\xd7\xf7M\x91n\xf9\xcf\xd6fP\xd5`\x8c\xabk\xab\xa3\xf8~\xe5?\xe8r\x05\xd2\x85\x98\xc8lo\xc8\xea\xd7tB\xab\xec\x08\xe4\xc5\xadv\xc9\xe7\x92\xa0{\xc5\xb6\x1d\x0c\xe7\xf2$&\xdd\xa3\x1e\x9dS?\xa41\x18\x17<\x1dR\xc4i\x14\x9b\xee\xe5\xe1\xa2\x95\x9aXx\xcd\xd8r\xd5\x05$wj\xa0X@\x8d\x0e\xc5\xfe;\x90\x9e\x05T\x10\xa7\xaf\xb6\xca\xabR\xba\xc3\x80\xf8\x81\x86\xdcI}\x8b\x10*0S\x17\xef\xa1^o\xeb\x0cZj\xb2\x95\xde\xb4_\xc3\xa2\x1b\xfe\x96^\x96\xf3\xa2J\xa5D>nA\xc1:y\xbb\xcc\x8eT\rI\xa7\xd6l\xcb/!8Ea\xa2\xa0\xd4\xe3[\xf4\xe7\x16$\xc9\x1a30\xb2\xc31<XTP\xc9\x88r3\xa2!\xa6ZNm#\xc2\xed\xe3X\xce!\xa0\x97\xec\\h\r\x97\x08r\xa3\x0b\xbb\x93\xa9\x1c\xf4\xe5\x0c\xe9\x9a\xb8U\xa8H\x952\xe8}\x86\x00\x18\xfa\xa8\x940\n\xc6\x93:\xce\xcd\x8b9\x9a\xbd-\x80\xdd\x9a(\x13\x99g\x1bh\xefx;\xa1d;\x17\x8c\xde\xd9.\xbe\xbc\xb2"^S\x0b\xdcR\x11\xc9Cj\xe5\x99\xe4\xb6i\x94\xd5$1Q\xb9\x81MT\xe9\x84x\xf4^\x94\xb1\xe9\xf4\x16%n&\xff\xe3\x03N(\x99\x1bu\xe4\xd1\x94\x96^\xb2V\x07n\xbb\xf9nA\x9b:\x91u\xda\xfa\x9b\xcaSt\xee\xd3\x00`\x00.\x12\x07\xe8\xb9FdG\x81\xebR\x1d\x9c\x11\xab\x87\xda\xdc\xe1\xfaK\xd5\xb8\x08F7h\x14\xb4\xbc\x84\xee"\x00\x94QBJ\xf6\xedvx4A\xc3\xbe\xb7X\xdc\x8f\xb7\xda\xe9\xeb7\x91\xac\xb6j\x93\x98\x0cV\xe3\x00\xe4p\xa6\xbf\xec\xa4h\xeb\xcf\xd1n>\xa8\xe7X\xf9%\xf7\xa9T\xf0i\xa6\x95\xbe6x\xe6\xfa\xa2\xaa\x96}\x1daRw\xc6\xac\x809z\xdfP/|\x86\xc7\xc4\x18\x83\xb4{@_\xd45\xc8\xdc\xcc\xef*iD\xd1\xa3\xe9\xa5\xbd\xdf\'\xa3H7DdI\x8b\xea\xa4\x10\xc0\xb2\x17\xa6\x9fkU/$48\x9fHY\xd3\x18\x13idB\x91\xd5UrY\xb9\x90\xb0\xf0\x02\x9dk\x05\xbc[\xf9ehSz\x7f!\xc9\nu\xa3\xc04\x16\x0f5Y-\xad>\x95t\x90\xa5&\xed\xd6M\xedP\x95\xffh\xd2426a>\xd9}\x03f4\xff\xac.\x13\x7f\x19\xdf\xe0\x1c\xed\xa1\x9b\xa9\rzF\x13[e.\x94\xaf\xac\xbe\xe3H\xe2\xa3r\'p9\xd4\x99\xfeR\x9f\xe1\xdb\xca(\x00_=\xaa~\xf8\x1f\x88L\xc3^\xbe)|\xc2\x18\xe1\xa2\x11,\xf8y\xf0w\xa8\x1890r\'\x17\xf9\xf7r\xd3U\x8bf\xa9s\x04\xe6\xac\xf0\x98\x05\x01\xc9\x8c\xd6E\x8c\x98E\xdcGC\xa7[1t\x15\x87\x04\xcb\t3u\xb4\x9et"[B\xb4\x1e\xa3\xc5{\xc3\x8d\xfc\x1e\xf7\xbf\xbb7|H+H\x8f\xc3\x0c\xe46N\xf5=\x13\t/\xc1^y\x00[\xa0\xf64\xd2\xceA\xfdRXA3*\xbd\xa5##\xcd:\xfd1\x85\xfc\x80\xa14>\xbc\xbcs66i\x1f\x8cCf|\x99-\xf2\xdc{u\x0f\xcf\x1f\x9e\xd7\xb0k\xb9p\x1cp#\x1a9\xcd^(\x15\x84\xc6\xb1\x87\x97F\x02\x00\x95\x9f6\xb5t\xa3\x85\xfd%\xe2\xcf\xd2\xd0\xf8L\xbc\x13\x0f\x0fK\xad\xcf\xb4{E\xc9\x8fqI\x18X\x9cV\x1b\xa3\xcf%\xe6\xd1\xed#\xce\xb6\xad\xc9\xb6j\x8b\xf1\xbd`\xf5xy\x10\xc4\xe14n\x9a%\xbcf\x9c\xbciP=%\x06z8\x98\t\x14\xba\xcc\xb9\xee\xdb-p6\xf4~\xdc\xbd\xf2\xa6\x98\x90\x01\xb6)@\xd2!]\xbf\xca\xc9\x9a\nDXo\xa9\x1ez\x8e\xb7\xd5\xc9o\xbch\x01o\xa6\xf2\x07\x8cX\xad\xa1\xf3\x10{ya\xc4\\p\x83!\x0b\xb9U\xcb\x03\x8ezK|\x83\x8e;\x04\x05\xd7</\xef\xb6\x141:RH\xdc!\xd4\xd8W\x8d\x97\x94\xfd\x0cU\x82V\x9e\xa1\xd5!\xdd\xb0U\xad\xaf\\\x08\xbe\xfb\x91a\xc2\xd4\xc4$?\xe3\x90\xa1\x92\xfbH\xc5\x1ce0\xad\xf9\x96ld{\x1br./\x150\xf9\xdeJ\xd4\x069\x8a?\xc2=\x1e>\x14\x19\x07\xb2\xefe\xeb\xe1\ruV\xe9%\x13\xf2\x99y\xe2\x8a[\xcf]\xaa\x7f\x13\xca\n\x9fW\xabkc\xed\xe0\xec\x0e,W\xfd\x06|\xa8\xa1)\xedn\x0b\xf04\x1f}\x84\x99ZW\xa03Z3\xed`P\xe2m\xa8u]\xbc\xae[/\x84tI\x7f\x8c\xde\x05\x92[y\xb1\xcf\x91\xd7\x1b\xcf\xa7\xfc\xdeN')
4
- #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
1
+ from flask_admin.contrib import sqla
2
+ from hiddifypanel.panel.database import db
3
+ from hiddifypanel.models import ConfigEnum
4
+ from wtforms.validators import Regexp,ValidationError
5
+ import re
6
+ import uuid
7
+ from .adminlte import AdminLTEModelView
8
+ class ConfigAdmin(AdminLTEModelView):
9
+ can_export = True
10
+ column_default_sort=('category',False)
11
+ column_display_pk = True
12
+ can_delete = False
13
+ can_create = False
14
+ column_editable_list=["value"]
15
+ column_searchable_list=["key","value"]
16
+ form_widget_args = {
17
+ 'description': {
18
+ 'readonly': True
19
+ },
20
+ }
21
+ def on_model_change(self, form, model, is_created):
22
+ if model.key==ConfigEnum.db_version:
23
+ raise ValidationError('DB version can not be changed')
24
+ # if model.key==ConfigEnum.decoy_domain:
25
+ # if not re.match("http(s|)://([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,})/?", model.value):
26
+ # raise ValidationError('Invalid address: e.g., https://www.wikipedia.org/')
27
+ if model.key in [ConfigEnum.admin_secret,ConfigEnum.ssfaketls_secret]:
28
+ if not re.match("^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$", model.value):
29
+ raise ValidationError('Invalid UUID e.g.,'+ str(uuid.uuid4()))
30
+
31
+ if model.key in [ConfigEnum.telegram_secret]:
32
+ if not re.match("^[0-9a-fA-F]{32}$", model.value):
33
+ raise ValidationError('Invalid UUID e.g.,'+ uuid.uuid4().hex)
34
+
35
+ if model.key==ConfigEnum.proxy_path:
36
+ if not re.match("^[a-zA-Z0-9]*$", model.value):
37
+ raise ValidationError('Invalid path. should be asci string')
38
+
39
+ if model.key in [ConfigEnum.tls_ports,ConfigEnum.kcp_ports,ConfigEnum.http_ports]:
40
+ if not re.match("^(\d,?)*$", model.value):
41
+ raise ValidationError('Invalid path. should be comma seperated integer e.g., 80,81')
42
+
43
+ if model.key==ConfigEnum.http_ports:
44
+ if "80" not in model.value.split(","):
45
+ raise ValidationError('Port 80 should always be presented')
46
+ if model.key==ConfigEnum.tls_ports:
47
+ if "443" not in model.value.split(","):
48
+ raise ValidationError('Port 443 should always be presented')
49
+
50
+ if "domain" in model.key:
51
+ if not re.match("^([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,})$", model.value):
52
+ raise ValidationError('Invalid domain: e.g., www.google.com')
53
+ if len(Domain.query.filter(Domain.domain==model.value).all())>0:
54
+ raise ValidationError(f"Domain model.value is exist in domains section. Use a fake domain")#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
55
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -1,5 +1,71 @@
1
- # 2023-04-08T15:11:14.231567
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\x08\x00U\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\x98\x11\x00\x00\x12\t\x04\x00\xc6\xd6\xf9\xbf\xd3/o\x1f4\x9c\xde\x8d\xc5\x7f\x9d%\x00\x00\x00\x00\x00\x00\x00\x00u\x12V\xa9\xfe\x11\xb4\xe3\xabw\xean\xab\x90H\xc0\xf4\x06\xbc\x97\x8f\x0fv\'\xae\xb4\xe4\xd7\xbd\x80\xf7&\x98H\x9a6o\xa2\xf7UD\xf0!59\xee\xebcla\xf3\xcc\x8b\x84gh-\xd8\x95\xe6\xe9"\xcd\'\xe1d\xadd\xf5\xee\xf6j\x17\xee\xe2\xe7\xdb\x96ps\x0c\x02>\xfb\x024\xbf\xaf<*\xab\xf1\x0c\xd4!*\x02\xfd\x0e}\xc7\x7f\x15\x03\xce\xa2m$\t\xe2\xd1x\x8c\x1d_\x80\xca\x8a^O\xfb\xec\xe3\x94\x90\xa0\xdc\xb1\x1b\xfe\xff\xdc\x12\x1f\xcd\x8c_\xafG\x0e\x18\xb6\xd6C\x97\x885\xea\x80\\\x18{\xa9\xe8\xeb\xf6\x06\x00S\x94\x8e\r\xfa\x19\xf4]\xa7C!\xd2\xf4\x9f\x91kA`\xc3\xe5\xa4\x89M[\xddc\xe4\x12q\x9c\x9e\xb8<U\xf2\xb3\xec\xd8F\xbd3\x85\xfc7Gnq\xbf$\x06"&\x07\xd3\t\xcbPHL\x84\xb6\xfauP\xd9\x9d\x02]]\xc7\xe5i\xb1u\xe4\x1eJ\x92\xe3\'\xc6N\xb4\x01\xbc\xcb\n\x12\x83\xb6\xdb\xf5\x8c\xca\x97\xea\x1b\xda\\\xbf\xcd\xe9\x1f\xc9\x1f\x02\x0e\xa6\t\xa7\x86\'\xad\x8e\xf8x\xbc\xcd\xc9`\xa9\\\x86$\xb8\x16\x19\x8dqk\x0b\xcc\xc4Q\x15\x18\xdfg\x1d\xac\xef&\x02p\x9e\xd4-\xbb\x9f,\x0e^\xb4SKpc.~f\r\xf4\x0e\xfe\xdc\x89\x98\xb2\x1c2\xb6t\x1c!\xd6UU\x04\xde\xb9\xe5\x13\x89m\xcdj/\x00\xb0\xc4\xc1\x17\xc6{\x9c*Kq\x88\xbe\xa5@\x81\xef\xc2A\x02\x01\xfd\xd9\x0e\xab\xa1R\xbb\xfd2\xf5\xf3\x18\xb91Kc\xbb\x0b\xf7\x10\x18@d\xd8(\x8d\xe1\nyTB\x9f\xbf\xdf\xf7\x7f@\xf4X\xa3l<+\xe7K\xe2\xab~in\xa9\xf7\xdd\xca\xa9\xb5\x90\x94\x10\xeb\xa0j\xe6WlD\xe4\xf5\xd6\xf2X*\x05\tU\xce\xe9\xb7~\x88\x19T\x80\x19f\xfd\t,N\xb5,{y4J\x1b1j\x06\x93Qw\xb9c\xf2\xcf\xe3\xd9~K\xd8\xa2k\xe1\x9c\x9f\x9b\xf3\xd0\xc8^\xdf\xd1\xb5\xc1xUN\xbc\xbfD\x89A\x8b/\x17\xe8\xb8\xbe\x919H+\xb3\x8d\xfb\x0b |q\x86E\xdf\xb1:\xe6\xf8\xc7\n#\x9bl\x0f\xe4\xc3\x83\xc0W#XG\x00\x0e-\x03\x17\x85\x90&\xf9c\xc9\xe0\xa0\xdcf\xb5\x19\x85\xde\xdf\xdd\xd9g)\xf7\xad\xc2\xf6\xfa\x02\x92@\xa2\xce\x00^s\x9dV\x06\xb9\xf5\x9aN\xda\xa9V\xba\x99\x9f\x03\xc8\x03\xbds9\x9a\x81C$\xc0\x9c`L\xe1\x19\xb6`\xaaL\x87n\x86\xaf\x16\xfc\xc9O\xcc\xbf\xfeD\xc9\xd1\x933=t\xdb\xeb\xc1\x0eb\x0ed\x9f\xb0\xd2\x0b\xdd\x1a\xda8\x18\x99\xb1\xe0\xc1\xa1\xa2\x03f\xf1\x93\xbf[\x11`"\xba0\x97*v\xf0\xe6\x08A\x1a\x98\xee\x8f\xc4\xeb\x8d\xc0,\xb0F\xb8B`8\x08\xc7%\xab\x0f\x87Z\xbfG\x94\x7f\x16\xbb\xe3\xff\xee)\x18\xf4\xc2\xc1\xc7\x1eT7\x1e6\x9c\xb5\xd0\x13\xady\xd6\x16\x9d\xa4JL\xaaVQ\'\x84\xe7?\x90\x8f\xdb\xad\xae\xd5\x87be\x0cq\xef\xcf\xfd\xd0[l\xc9\xc8\xb5\xd2\x83\x95C\x89\x9b\xa6\x03\x86q4\'\xcb\xd1\x98M\xb4\xbcv\x91n7\x00\xcb\x9e\xf5\x88%\xdd/D\x9d\xf1\r\xea\xab\xf0\x8e\xfe\xeaP\x1b^X\xbd\x1c-\x81(\x0b\xaa\x1a\xb0:!PZZN\x1eo\xea\xf3\x0e\xf5\xf30\xe3\xfdq\x81\x8c\x8e\xf2F\xaa\x9cC\x0eK!h\x03\xc9\x87\xae\x83\xe9\xf8x\xbfYkA\xe8\xca\xc6\xe3I\xae\xee\xbf\x94B8\xcd\xd7v\x9d]i\\\xdd]\xacE[\x88\x8c\x9e^#Y\xc7F\xe8\xf7\x04\x17%\xf9\x12\x1b_\x0c\x17A\t-\xfe\xc3\x8c%H\xd5)\x19I\xde\xadb\x1c+~\xb9\xe3\xa0\xa2\xc6\x0fe\xa7?\xa31\x88]\xf5L\x07\x85\xcf\xb2x\xe2\x8d\x1d\xfd\x1d\x1e\xcdM\xc8\xc1\xc7\xff\x8e[,\xa1\xaf\xd5\x08g\xdd\x8cu\x87j\xfa`\xa0)!\xb4\xd5\xa0f\x1bqp\x8au\xf9\xc6jj\xd9\xc7\xdc\x8f%\xcf5\xee\xa5\xfe\x9bS\x12\xa1\x19\xe8l?c\xd9\xe5\xe7\xd4\xeb\xe7\xa5\xec\x85\x9aA0?\xbc\xaf2\xde/\xce|A\x89\xf57\x98\xd8\xe1\x8et\x89s\xf0\x92\x9c.\xda\xddzNe\xba\x80\x1e\xe33\x8c\x02pqk(zZ%%G\xb1\xdd;\xdb\xb4\xa1,V\x12a\xac\xcfG\xb9\xe8:\x9a\xcff5\xd4\x84\xf4\xd4\x14\xf6\xc2\x8f}<t0e\x16$\xab\x0e\x81\x05(\xfe\xe8\xa3n\xc3/J\x7f\xa4\'v\x0c\x83\xb7\x95\xde\xb2\xb51\x9f\xe2\xdd\xd9\xd7?MC%\x90\'|\x9f\xba \xd6\x89\x18\x8e\xbabQ{\xf8\xe4r\xae6\x83\x1a^Z\x19w\x809\\\x96\xbaP\xe6\xb2)\x9e\xeeW\xea\xffc\xbd\x10fb\xb4Ea\x80\xf4`\xf4\x08\xc9\x92"7\\\x81qR\x9f\x9fzS\xff+\xdbE\xac.L!\x00?\x85\x83\xef\xd1-\x9f\xd6\x1e\xa0S;8\xf3#A\xd6(6\xb1,\x82\xa7g\xd8\x83\xc90@\x19k\x02\x80\x05Yf\xc0\xdc>\xcb\xc5W\xfc{P]^\xa2\x10dQ\x1b\\k\xda;\xb1\xb8\x03o\x03\xce\xcb\x1a_\xd5g\xdf\xb5\xda\xe4YF\x05\x95\xea\xaf>\xf4\xed\xa6A\x14\xa7\x98\xd8\xa0Xo\xd4\xcb\x9e\xf7\x97\xc4~}1\xe7\r\xff\x874_]\x95z\x96\xd0j\x14|\xa8\xde\x18x\x87\xa9\xb3\x95g\xaf\x82 a\xe24\xde\x99zX\xa4,_V\x83\x8a\xad@\xab\xad;}\xa3R\x9a\xf1u#\xc7T\x05\xe48"\xdb\xdf\x03\xe6B[3\x0eZa\xa7\\Z\xa4UW\x8f\xad/\x94\x10\xd3bu\xb7E>\x06\x1a\x91\x9c\xef\xaf\xfc\x1f\xf8K\xb7\xa2\xbc\x9a\xb9P\xb0\x05\xa7\xef\xf1\x87\x8cjy\xbe^\xb4\x9bu\x89\xd4\xdc\xec\xf5\x97\xfd3\xee\x16\xb1L=\xad\xffD\xa8T5EHV\x18\xb5_\x97\xe5\xd4\x08\xa5\xedo\xbcM\xf4\x10\x96\x99k\xd1\xd8\xf0J\x9f\x08\x12\x9d\xd7\x00\xf5)\xad\xef\x9f\xec\xf5\x9f&\xdb \xad\x0cH\x8e\xe7\xfd{G|\xbe\xe2\x84\xe6\xf4\xf6_?\x96\xd1\x80W\x7fFJ\xf7\xf4j\x92\x14\xa5\x83\xb4\x96YO\x14\xe4\xdd\xbc\xbcP\xbc\xcf\x8e\x81\xce\xda\x82\x07\x85\x81/\xbb\n\xb1\xffs\xcd\x07\xe5\xab\x7f\xdb\xf1X\x17\xccS\xa2\x9e\x1a\xdaU%\xe9\xaa#[\x12\xb4D\xdf\xe9\x1c\x01\xcf\xa9M\xee\x90GiZ _\xf7\xcec>\x92{\xa3\x03m[\xca\xf66\xd8\xf3\xf4\x0c\x02h\x0e\xcc\\\xee\xe0\x18\xaf\xcc\xf2\xc9\x12,9\x7f\x1bqK\xc1\x8f\xee\xaf\xec9\xfb\xa2#r\xda\xff\xfbG\xe8\x1a\x84\x01\xd1Cx\x08v\xd0>=\xd5\x8d;\xe3\x86\xe3\x071\x1c\xbc\x18\x8f\xd25\x80M\xc7\xa6\x87\x04\xe0\x01v{\xc5\x966:\xf7v \xe1\x83\x1eR\n\xa7L5\xa9!\xadnO\xa9\x13\x9e-\xaa\xf5\xdce\xd1d:\xa60\xb8\xde\x96kf\xba\'\xed\x9a\xb3]\x05\xbb\xa8\x83\x94\x89=\xa6U+*\x8a\xc6\x83\xf9Rt\x91\xf2y-:\xed\xceK\xe5\xd8\x05g\xc4x6_?\x94R\x8d\x9e\xdfI\xdehF\x88\xcb\xa9\\\xd8\x99\x8e~\xec\x85\x0b\xe6\xe4W \x9a\x8b\'\xe8;\x19\x83ih\xaa]\xbb0\xc7S\xba\xaf\xc7f\x18-K\xa8\x08G\xc92\x8d\xf0\x14d\x9dK\x1b\xc9\xcc\xbdl4\xb8\x1e\x87\x10\xad\xc9K\xc8\x17\x98^\xb5\x1a\'\x9a\x04\xb0s#\xc0p\xc2\xc9j\xed\xe1\x9f\xac\xec\xfa\xce\x93\xdc\x92\xd7\x818_\xaf\x0f\xdb\xd9\xf8\xb5\xfa\xa3\x1a*\xd8\x8d4\xc4m\x9e\\\x81\t\xaf.qk>>\xac#|\x13\xaa\xaeOS\xf7\xcc[V\xb1\x03\x18\xab?B\xab\xd0\x12\x07\x9c\x08\x93\xf3\x89\xdd-\xa4 \xc7\x17i\x01\xfd\xdc\x13\xcd2L3\x84\xd5n\x8a\x19\xf9`\x94\x91\xef(\xcb\'\xad`\xe9]?\xe3E\xc4\xaa-\x81\x0eY\x8aiI3I(t\x06\xc0\x85\xcb\xd5\xfd_\x89,\x94/M:J\xf5\x90\x1c\x84\x06\xdc\xa0\xa2\xfdKX\xd6Z\\\x01-\xf6\xb4\xff\xb4i\x14k\x8f\xeb\x1f9_hv1\xd3P\xb2Q%iN\r\xb0\x98%\xc4\xb1\xa2U\xa0\x88\x8c\xd1x\x92\xd6\xf0\x93\x1a\x1a\x81i\xc8\xe2\xf9\x19\xd3\x1b\xcbU\x1e\xf0\xcdDw\xf1\xa3\xef\x81\x8fl\xce\x9f\xfe\xec\xa0\xdc\xc7*yku\x9f\xe5\x00\xd2#\x8e\xd8P\x8fG?\xb6\xe5\xe2\xe2\xc8\x06v\x04\x1a\x1cf0\x04]\xe1\x14\n\xb4\xd8[67z\x00c7\xc6\xdbh\xc9i\xed\x93E\xd3\xb4\tQ\x1a.\x92~\xc9jC2\x14\xaa\xf3k\xf7*Q\x1e\r\x94\x18UK\x96\xde?\xe5\x0cz8\x0e?\xff\x15\x8f\xb8,D\xef4\xdd\xbd\xca\xbf\x03WNuY\x02\x1e\x99\xfa\xa9\x10\xdds\xf8\xd0_\x91~@^m\xfbE\xf5\xfa\x9a\x9aK}\r{I\xcc\xc7\x97\x8c\x8d\xc7\x7f\xfe\x08rT\\\xad\x1e\xcf\xb9\x1c\xe8\x18\x9c\x00\x91\x14\xca\xf6\x0b\xaa-\xeb\xd1\x0c^\xc1\xe7\xa9\xbb \xb9\xd2Ft\xa9\x02\xfc#\xef\x01\xb5\xf3MM\xeb\xfd\xf7>\x9b\xb03W\x19\xb1\xe5I\x8bO\xf9\x00\x1e*\xa4\x13\x19\xc1\xc1\xd1I\x04"\xa4\x8c&)\x96\xee\xf9+\x9d\x8c\xaf\x065\r\x84\x1f_\x83A\x04\xbe \xde\x04\xcc\xdc\xdd\xac\xc0\n\xb9\x03)\xb3\x7f\xf0\x14\xcf/\x0eX\x8d@\x05\xfd\x13\x8ak\x0f\x94\xf4\xbekK\xda?!\xd2\xd3e+\xdc\'\xb7\xa3\xe4:\xe7\xd5\x19\xdf\xd4\xe2\xab\r\xcatS\xcd\xe4\xa9\xc8\xa8?T\xfe\xe5\xa2I\xce$\xa9\xdd\xa4Z\xa1H\x14\x82\x0c7\x92\x0f\xae0S\xca\xeb\xd5\x1b\xce~\x12\x8dD\xb2.;|Qq#\xeb\x91\xf6_\xd3\xb7\x1b\xdb\n\x14\xed\x1f\xdb\x81\xa8\xeb\xe9X\xc6/\r\x07sv\x8bw\x13\x93;G]\xfdS\xc5$\x85\xc0\x08\raQ\x12TE\xaa\x8b(\xcc\xdf,\x7f\xcbc\xc11\xeb\xd9\xbc-\x8a\x80&\xedDO\xb0}PV\xda/X\xd5\xb4\xd6\xf8\xa3v0%\x81x\x8bsp\xff\xbc\xc9\xfc\x06\x02\'\xa5\xbe=QV\x1d\x04g~\x1e\x86n\xafv\x1b\xd2\xb1\xa9\xce\x0e\x99\xb6\xd3\xf6Y\xdd\x8f\xceF@\x83N\x95\xeb\xa2a\x17r\x88\xb6:\xcb\x90(\xd4\xe3\x0e\xfdH\xbf\xcb\x9a\xa7>(\xb1\xc1\xe8e\x8ax\x82\xa1\xde\x98n\xd8j\x05\x81\x88\xf4\x08\xcb\xe5\x18\xf4=\x93\x00P\x9dv\xdd,\x85$\x9d\xd7\xf6\xe6l]N\xcb;\x96?\xea\x1dHs\x9d|>Oc\x18\'\xea\xfd\xbc\xe1j,\x89O\xe8_\\\xc2\x05a(\x15\xbc\xb1\xc1-\x10\x9c[L@\xc6!r\x1a\xac\x92\xa6 \x04 \xa0\xccN\x9f\x93\xd2\xb8\x16\xe6\xadi4\x1a2>\x98Y\x07=\x8b\x9d\xca\x0c\xd1bFw\x9b\xfe\xcf\xa7\x07@&\x9f\xa6"\xf8\x91@\xc5\xa7\x1a5\x8a\xa2\xa0"\xeb\x89\xec\xa2\x9b\xf7\x95\xdf\x89\xc9\'\x19\xd3QMN\xd7i!\xa0\x0eEN{\x8c4\x99#\xff\xf6\xcb\xaf\xf2\xe1\xf6*\xdb\xd0\x07i\x04:8\xd5n\xc9sn\xd1%[`\xd9Bl\xc4\x9d?\xe3\xf6Y\xae\xc2\xa1\xccU\xfb"\x9f+\x9f\xd1\xb1\xf04\xbe4\xa7\x9d9\x9b=l\xea\x19\x1ca\xc8\xe9:\xae\x05eC1K\x8b\xde\xd2CH\xe1\x02\x16o<)\xd50S\x1c\xe8\xe0j\xe8g\xfc\xba\xb8(\x12\x84\x92\xe4{|+/\xed\x80u\x0c\x94\x1e\xe7f\x1a\x87\xd1\x0el\x92\xb7;^y\xc0\xdc\xfa\nBJ=\xa1\xd6\xbd\xc51\x1c[e\xcb\xc5\xbc\x15[\x18\x8aH\x9d_\xd2\xa3 \x96\x94s\x9b\xcb>\x17\x0ewF\t\x85\xe5h\x05\xde\xca\x98-\xb8\xbb\x1e\x0c\x86U\x10\xbf\x02\x88\x1c\xdd\x9ay\xb3\x156w\xf2\xff\xd6\xc3\x8b\xef\x8b\xe4\xf6Dk\xd1\x85\xe4\xda\xc0\x8a\xd4Q\x14\xb5\x06\x9dI\xcd\x88\x07\xc1\xaf\xb7\xa0\x8c\xcd\x15\x9f\x89\x0b\xf7\x9a~0d\x80\xeenU\xfc\xba\xbc,\xe1eV\x17\x94\xffy\xc8-\x0f\x04\xb6\xe3\x074k\xa7\x12\x90\xf7#\x18y\x9a\x8d\x01\x1eM\x88O_\xa4X\xeeB\xb7-\xacY\xfbg\x1fU\x86r\xe8:\xec\xd9\xad\xb6\xdc\xa3\x01-\xa2\xcf\x03\xdd\x833\xcc\x08\x81\xdf}\xd6\x87\x0b\x14\x90]\x01\xaeIn\xfc\x8b\x99\xfb\xb3\x89\xf4\xa4:\xfeV\x81\x95,\x18\xc43\xf5\x16\\\x0e\x05I\xc9\xbe\x13\'\xb6g\xb1\x94\t\x04\x1bg!\x93\xcf\xe4i\x1f\x10\x8e\xf2@Q\xdd\xcb\xf1\xfd(\xee\xf17\x13\xf2Ly/\xbb\x00^\x0c\xb6K\x8bv\xaa\xb9\xcb\x1a\xe5Mn\xe1\x19J\xb5\xebS\xc2S\x95\xdau\x89\x1fl\xaa{\xc6\xf7uT\x92U\x99\x11\xd0\r\xb1\x9b\xf3\x81\xf3\x08W\xbe\xdf\x9c\x8a&T7M&av3Y@\x97\x8d\x9a\xe2\x82\x8d\'>\xa1\x1e\xbcos\xf8\xdbN\xffi/f\xa6\xfe|j?\xc2g\x15\xf4\xe0R\xca}xL&1\x97\xed{\x13\x1a2\x031\x91$\x03\xba\x07\xad\xacru)\x97\x9fLJ\x97\x18\xd2\xdb\xfc\t\xf8d\x83\x00$\xa2_\xfe\x10\x14\xbck\xd3\xbb\x8d^\xd4\xcf,\xc6)\x97\xack\x1c\x1cg\xe0l\xdfM\xfd\xd2\xb6\x97\xd91\x02q\xd5K\x04\x8c_\x0b\x9dDOC\x8d\xf2u\xb4\xd9\xe0\xf8\x92\xe79`\xfb\x01\t>\xab\x7f{\xd5\xb9\xee\x9d\xa5\xd1\x14\xd1\xd8\xa5C\xd6\xdf\xcc\xc1\xba\xf6\xc3/\xbbT\xcd\xd2\x83\n\xe78}\xa7\x11\xae5]7\x81\xa4\xf3\xe8\xb1\x03?\x1b\xa9\xf8\xc9\x03*\xd5\x178{\x8c\xd5\xc2\xd2\x8en~\xbf]\xbe\x0f\x14ioQ\x10\x0f\xdc\x12\xd9\xc9];\xde\xd8\xa4v\x89l\xd4\xfb;\x05\x9c:\xbb\xc8z\x90\xa1\xd0\x14\x88(q\xae\xa6\x85k\\\xca\xb0\xb9\xa1\xc7;rj\xc4M3q\x9cx\xc4w\xc3\x86\x95\x0c\xb6m|\xdbp}b\xa9\n\xab\xecp$\xdb\xa6AMu7\x8b\xaa\xe7vV\xfa\x7fP\xdb\x08\xb4\x8f\xb0\x9c.^\x80\x0c\xf5,\x90\xe9.\x14Z\x8f}b\xf2\xd3\x1c\xfd)\xc0;m\r\xb4H\xe3\xd0\x83\x97K\x18)\xd9\x11\xeey\xf2\xa3\xf0[\x7fQc\xa9\x9aJP\x9a\t\xcb\x15\x85M\x8b,\xfaC)\xcc\r@\xbb@\xe4\xba:%\xda\xacF\xe0\xb9\xe4zv\x17\xd6lq\xfd\x9c@r\x8c\xb2j\x82\x82J\x14\x13\x18\x80\x0b\x0bF\x00\xdf\xd5\x98\x18}|\xc2\xe9B\x1bsa\x90\x1c\xde\xdf\x90\x96\r\x84r\xf4\xba\xde\xccR\xf2\n\xf8$\xb2\xef\x10\x1c\x18\x8c\xab\xd5\xc3\x07\x9b80\xab\xdc|s+\xdd\xadK89\x98]\x15\xed\xfe\xee\x0e\xf1*\xc95J\xfa\x90\xbf#\xe1N\x1e\xa2-\x0e\xb3\xbc\r3\xb5\xf3\xbb$t\xa5Z\x01rm\xa9\xafa\x88\xd5Q\x07\xcb\xc4>\x8b\x05\x8c"\xbf\xd0\x80"\x8a\xdf\x05\xd8Z)\xa2o\xa5\xfe\xc7d\xde\x1e\x83\xa47\x97c\xdd\x02\xa2\xb9Tp\xdb\x8b\x140\xfa=\xa4@\x96\xef\xdc\xe4\x8d\xfc\r)\xaa\x97\x10\xb9y\x80\xd2\x87\xd9\xca\xcc\x18e\x8e\xcdF|\x8d\x1c\xa9\xbb\xe2~l\x95l\xba\xd4\xfb\xcd\xbc\xf3\'\x02\xe7\xff\x8a\xe6\xa3\xcd\r\xabJ]Z\xa8\xccB\n\x8a\xa2$&\xab\xe2\xac*\xe1\xb6*K\xda\xe0^\x17"\xe0\xa7\x11\xf9\xe4\xf5\xad\x9f\xba\xc1\xfcl\xd3R\x99\xe3b\xa9\xd1\xc1\xda\'\x18\xbcJ\xd9\xa8D\xcfG\xf8\x06\xcbaP<\xc6o\xa9\xfe&7\xd0\x9a\x00YF\xf7E\x95\xd5\xc8\x07K\x96~\xa2W\xbe\n\x93\x90\xcf&T%\xa0\xe8\xdd\x18@\x92\xf9v\xb6_]\xa1\xbbu\xb4\x9b\x9a\xfd*\t\x1b/7\xc1\xd8\xdcwS,c\x90\x1f\xe8\xabM\x1e\xbe\x19{\x14?\xa1\xc5\n\xdc\xe5\x8d]\x92\x80\x979\xf7\xae\x98\x16\xf5\xda!\x8e5\xbc@\r\xb7\xe4\x1bj\xa8\x90\x0b\x18\xcd\xa5\xec\xe8Z\x8eZ\x06\xda\x03v\xa6\x9a; \x1a\xe6\x8b\xad^\xf8\xe8\x14\xf9\xf8\'\xbc\x9f\x07\xc4\x1d\\\xad\x08\xa5\x04\x04\x81\xef\xf3o\xdf\x92\xfb\xb8\xe7\x95J\xd5C\x9d\xf2^\xd2o\xc3\xf1\xc8\xf5\xbb\x10\xcc!\x1a\xd7\xda\x18\xbd\x1c\xf4}\x946\xd6av\xd0\xe7r\xaa\xd4\xf6\x8b\x9b\x1c\xb9\x8a\x01\xdcv\x0c"\xf0\xd5L\xf6~\xc7\t\x88\xe7^WC\xb9C\x8e\x17\x83R,\xabA:\xef>\x0ch\x96\x01\xcd=\x94Z8\xd6\xc1\x87\x0e7-\xb1\xc3\xa4H\xaa"\x9f\xd3\xe5C\xd5;\xbae\xc4\xea\xa3\x90\xc6p\x8a\x81\xcc\x01\xdb\xb2\xd7\xe6*\x9c\\\x82\x8dnQ\xc9\x94\xf3\xaekgCD\x91\xea\x0e\xc88`\xecyXm\xbfo\xcf1\xfeF\xf5\xb3\xce\xf6\xc6+^\x7f\xf8AK\xb5\xc7K\x7f\x96\xb7g\xb1\x8e \x84\xae\x81 2\x16\x1a\xd3\xd7u\xbd\xad\x8b|\xd0\x84Z\xb1C\xbe-\xd2i\xf3\xb4\xd0\x1f\x03\x98_\x82\xa7\xbd\xe6\xdf\x92 \x12\x80\xd7cl\xf7x}v\x9a\x9cS\xba{\xeckq\xf8\x8dN\x0b\xc3\xe0m\xb9v$O\x80`\xbfF\xdd"\x1eC[\xca\xad\x82\xa7\x0b(\x84\xb4\x93\x0e-\x9c:\x92\x18\xcb\x05\x14>\x93x\xa8\xbc]xAD\x9b\x10>b\xbc\x82\xf2"&$f-\xb1>!g\xa4\xf3\x0b\x9d{L5K\x9cf#\xc3A^\x1b.\x94PTN;[\x92?\xb0\xf8\x05\x83\x83L\x18\x1c/L\xbf\xba\xca\xc7e\x15j\xdc3U!,\xc0Ng\xf1}hWbs\xdb\x05\xb6\x83&\xf1?\x03odK\xc3\xa7\x84\xb5{wQ\n\xea\xc9&E\xf4\xad\xf6\x9e\xbc\x86cg\x81\x8d\x16\xd2\xe9&]jR\x11\x7fKx\xefR\x9cv\x8aMJ\x7fA\x1e*+\xee\x8c\xe5\x83o\xa9\xf3q\xc32`\\DS\x90\xca\xba\xf4j\x82,\xa2\xfd\x83\xeb|)g\xa7\xaf\x8a\x07 \xea\x93s1\xe0\x05k\x12:\xac\x98K\xcf\xe2\xf2\xe9\xa9\xda}<rA\xce\xae\xc9\xfc\x97[\xd7\xe7\xf99\xc2\xf7\xba0\xb4\x93\xbcS\xf1\rf\x03\x18\xaf\xa1\xeax\x02\x12>\x0b\xa6vo\x8cwn=\xfcC8y\xd2\x07\x90\x85~q\x18/\xf1\xb7\xf1QYt\xc6cvL`R\xbf\x1fm#`\xbbe{`R\x95o< \xb9\xa7\x05/\x8c\x14m\x9a\x12\xbfa\x80\xbd\xeeN\xef\x8e\xd8\xad\xd5W\xd2\'\xaf\\\xb3m\x92\x98\x16\x92\x80\x8c\x8a\x02\xe6\x15\x1e\xf9\x99kE\x96p{\\\x86\xa3\x91\xae\x1cA\xad-qe\xb4\x11\\.7\x80\xc4\tC\x95\xfe\x0f9\xed\x9bb\xff9jpU\x03\x80\x84\x97|\xe8\xf6k"\x85J~\x07&\xcf\x9fSf\xca\x98\xacJT48+u\xbb\n.\x8e$\x9f\x7f\xa2ar\x96|\xe5\xad\xb9L')
4
- #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
1
+ from flask_admin.base import AdminIndexView,expose
2
+ from hiddifypanel.panel.hiddify import admin
3
+ from flask import render_template,url_for,Markup,request,jsonify
4
+ from flask_babelex import lazy_gettext as _
5
+ from hiddifypanel.panel import hiddify
6
+ import datetime
7
+ from flask_classful import FlaskView,route
8
+ from hiddifypanel.models import *
9
+ from hiddifypanel.panel.database import db
10
+ from hiddifypanel.panel.hiddify import flash
11
+ class Dashboard(FlaskView):
12
+ def get_data(self):
13
+ h24=datetime.datetime.now()-datetime.timedelta(days=1)
14
+ return jsonify(dict(
15
+ onlines=User.query.filter(User.last_online>h24).count(),
16
+ total_users=User.query.count(),
17
+ stats={'system':hiddify.system_stats(), 'top5':hiddify.top_processes()},
18
+ usage_history=get_daily_usage_stats()
19
+ ))
20
+
21
+ def index(self):
22
+
23
+ bot=None
24
+ # if hconfig(ConfigEnum.license):
25
+ from hiddifypanel.panel.commercial.telegrambot import bot
26
+
27
+ if hconfig(ConfigEnum.is_parent):
28
+ childs=Child.query.filter(Child.id!=0).all()
29
+ for c in childs:
30
+ c.is_active=False
31
+ for d in c.domains:
32
+ if d.mode==DomainType.fake:continue
33
+ remote=f"https://{d.domain}/{hconfig(ConfigEnum.proxy_path,c.id)}/{hconfig(ConfigEnum.admin_secret,c.id)}"
34
+ d.is_active= hiddify.check_connection_to_remote(remote)
35
+ if d.is_active:
36
+ c.is_active=True
37
+
38
+ return render_template('parent_dash.html',childs=childs,bot=bot)
39
+ # try:
40
+ def_user=None if len(User.query.all())>1 else User.query.filter(User.name=='default').first()
41
+ domains=get_panel_domains()
42
+ sslip_domains=[d.domain for d in domains if "sslip.io" in d.domain]
43
+
44
+ if def_user and sslip_domains:
45
+ quick_setup=url_for("admin.QuickSetup:index")
46
+ flash((_('It seems that you have not setup the system completely. <a class="btn btn-success" href="%(quick_setup)s">Click here</a> to complete setup.',quick_setup=quick_setup)),'warning')
47
+ elif len(sslip_domains):
48
+ flash((_('It seems that you are using default domain (%(domain)s) which is not recommended.',domain=sslip_domains[0])),'warning')
49
+ elif def_user:
50
+ d=domains[0]
51
+ u=def_user.uuid
52
+ flash((_('It seems that you have not created any users yet. Default user link: %(default_link)s',default_link=hiddify.get_user_link(u,d))),'secondary')
53
+
54
+ # except:
55
+ # flash((_('Error!!!')),'info')
56
+ h24=datetime.datetime.now()-datetime.timedelta(days=1)
57
+ onlines=User.query.filter(User.last_online>h24).count()
58
+ total=User.query.count()
59
+
60
+ stats={'system':hiddify.system_stats(), 'top5':hiddify.top_processes()}
61
+ return render_template('index.html',onlines=onlines,total_users=total,bot=bot,stats=stats,usage_history=get_daily_usage_stats())
62
+
63
+ @route('remove_child', methods=['POST'])
64
+ def remove_child(self):
65
+ child_id=request.form['child_id']
66
+ child=Child.query.filter(Child.id==child_id).first()
67
+ db.session.delete(child)
68
+ db.session.commit()
69
+ flash(_("child has been removed!"), "success")
70
+ return self.index()#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
71
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -1,5 +1,196 @@
1
- # 2023-04-08T15:11:14.218289
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\x08\x00U\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\x82\x1f\x00\x00\x12\t\x04\x00#7`\x08\xca\xde\xa9N\xe520\xf4e\x93\x05\x12\x00\x00\x00\x00\x00\x00\x00\x00\xc8b$\xc6\xa1\xe6\xa8\xa8f\xd5\xcaf\xcayy\xfb\xec\xe1\xd5M3\x93\x96\x08\xca\xdeE\xea\xce%b\x81Z4\x96H7\xeb\xbf`\xd6\xcdU\xa7\xfd\x99\xf4\xd3\x9b.WN\x16\xe7\xad\xba\xef\x99\x8f&\xa3\xe9DN\xeb\xb0\xd9\xac\xba\x1ds\x90\xb4)v\x8fp~\xe8\xbd\x1c\x13X\x8bFA\xccu\xea\xac\xbeR\x96G{5\x1e{?\xc5\xdf\x1c\x96\xa9u\xa0\xae\x81\x18% \xc686\x165G\xc8\xab\x8e\xac\xf2A\'\xb6I\x8b\xd3\\\xb8\x88=\xa9\xf6\x05\x05\xba\xfd\x0f\xc9\xe5\xb8[\xa7\xdc\x8f\xd1\\a\\"4N\xff\x1b\xa5\x8f\xa7\x1c\xc0\xd0\xee\xa9\x89\x03"\xa1\xb4\xbc\x07\x99\x00\xc3\xf41\xa3A;\xce#K~\x1f\x8f\xffDA\xb3\x1d)\x01E%\xd2\xa8:F\xf4\xbd\xef\x04[\x04lK\x1a)\xc3x\x80d\xc8h(\xe2M\xe2\x8ex\xa5\xc8\x03cw\xdc\xe2\xac}\x87Tz\xfa\xb3\xb3\xe2\x18\\\xed\x83\x98\xc4/U,\x08\xc3\xccO\xab\x0f\x11CV\xbc\x06\xb7\xbe\x80\x931\xca\x92\x0fM\x962u.!\x89676\x91\\\x89{\x01\xacN\xb3\xa1\x12\xbeJ\xd5+\xd1G}\x8f\x81\x07&\xc4\xac\x08\xe3\xbce\x80g\xe7R\xde|\xb8\xf6\x9fTs\xd8\x07\x12$]\xf2\x99\x04\xc7\xdaW\xcc\x1e"e\x08\x1e\x8fy=\xde\t\x1f\xa8[I\x8e\xf1\x9c\xb8RZ\xef\xf4\xa1~$\x8f\xcf\xb1\xfci7a\xb3z\n\x8d\xeb4+\xb5\x92}\x9cV\x1f\n\xfe\x1d\xa4\xce6\xe7\xa6\x8f\x18\x87i\xac\xaac\xc3\xb9\xab\xe8\xdb\xa2xX\xda\x9c\x10\x97_J\x8a\x93\xe8\x1c&\xd8\x05\xd8\xf7\xd8}\x19\xf3G(\xc3\x1cQ\xa0\xfb\xe3\xc8z0\xbc^P1+#>\x85,T\xfa\xb0\xf5V:\xf0_\xda\x92\xf9\xca\x86\xa1\x9d\x14\xe2g?ih\x164J\x05n\x9a\xe9\xabv\x90\xd4\x7fp\xa51U\x94\xc77\xd5\xa3\x19\x88\xf4\xd0\x1a\xf4I]\x1fD\xbc\xb5\xc7\to\xcd\x1d\xe9U\xbf8\x96\xbb\x19\xad\xd7\xb4\xf6\xc7\xd6j%\xe1G0+\n\xd4\xb0\xadr\xcd\x94\xb0\xdd=\x98o\xd9\xcb\xd0Z\xf2\xad\x11Y\xd4\x14\xefq\xff\x138\xb6\x10\xb0\xeeM\xf5V\x0c\x04\x86\xdfd^\xae\x9d\x87\xb3E\xbbj\xb1v\x81\xc6\x81\xde\x19\xf0VI`N\x95@%Z\xe8\xb3\x06\x1an\xf5|H\xb6\x83\xca_L\xa5\xea\xa3\x97z\x86,{\'\x9e\xf2\x93A\x03s\xfe\xa4d#\xeb\x8c\xb6kk\x82\xc9\xedC\x814\x15\xef\x94w\xf1\xd7|\xc5>n\xec\xb7\xea{\xdc\xbd\xd3@q\xf3\xf0\xc3\x9c\xa6\xc7`M"\x1a\x0e\x17Y\x88\x8d\xf0\xc6\xd3%\xd7\xcfM\xdfP\xa6\xba\x9d\xad\x08\xe69\x1cC\xbdo\xca\x04\x87\x83\x11\xed7\xc3\xb8\x99*\xe9z\xe6p\xc3Q\xbf\x85\xf42z\'i\xae\xbe\x80\x8a\xfd\x11\xc1\xe5\x87\x04.l\xeeI\xdc\x00wylR3B\x06yW\xfa\x96\x9aS\xfa\x96\xa8\xac\xb2\x19sf\x7f\xb5\x8b\x9c\xd7\xafi8\x1a\x0f\r\xbe\xca\xf5\x8f\x19\xaf\xe7\xef\xd1 \xae:\xdb\xa6\x03d\xb0\xd8\xddw\x02\x01\xcc\x86\x01\xde\xa4\xb2\x10\xc8\xa4\xcb\xa8\xa2Z\xcd\xbb\n\xa0\x8e\x83\x193=\xfc\xf55|\xdd\xb3Bu\xe8D,l\x07\xfb*\xcc,2/\xf9\x84\x052HL\\\xc3/t\xe4\xf2\x9frT~\x1a,E\xd0\xde\x17\xc7l4\xb5~d\xcei\x94\xf5\xe39\xb9\x01Im;\xd7G\xb3\xd4\xa9\x14\x84\x03S\xad\x06J}\x1a\xd8<\x97]y6]\xf2\xc8\xa0\x9d\xa4\xa1\xc6\x85\x0e#GL\xa29\xb2\x19i\x80\x04Z@\xba/0\xc8]~\xa4L+\xa6\xa9\x97\xe2W\xd1\x87\xa0`\xc1\xadh\x8d\xc1\r\xf8\x9b|\x98\xe0\xb6\xca=\xf7d3\xea\xfdb,\x8d\xb7\xc2)s|\x01\x8e\xab>\xef\x81\xc0\x96E\x8a[\xb8LR!\xcdd^\xa7\xcb\x833\x8dAm{\x14 \x85N\xd7VX\x8f\xecm\xf6\xf6\xd6\xd0\xc7\xb76\xc2\xba\x1d(w\x86(e\x8d\x9e\x81\xea\x0b\xa0w\xa4\x1d\x02w\xf2\xfd\x9c\xe0\xde\xcf\xdco\xac\xe6\xee\xce\x12\xa0>w\x19\x8ed\x8d\xe0\x0e-l\xae\x0bWX\xb0\xf2\xab&\x98\xc28\xfa\xa6\xd3\xa3\xb8B\x16}Ow \x83\xf1\x83\'\x0c\xdd\xe9\x9c\xc8\x82\x82\x18\xf9\xcc\x0e)\xad3\xf9lM\x0f(\x1bT\xd0\xfcf\x97\x0ef\x918k\xc1\xda\x15\xe3\x0e;\xa2\x16\xab\x1eW\xeeA\x90\'\x12\x0b\x07K*\xb8\x90\x99Y\x81\xbe8\xd8"Q\xebL\x99P\x19\x95\x0c\xe7\rI-P\xfd|(\xe9\xee\xe1\x87\x1bS\\\xb5\x83\xe4E\x9bm\xefwv\xa2x\x93\x81y\x90\xfaM\xd9\x93nE\x19\xf8|8\xba\xb40\xd3\x8b\xf8^\xf3l\x7f\xe0\xc1T\xc3\x07\xc9\xa9E\x81\x80\xca\xd1\xc4\xfdk\x89w\xe2\xc7\x92F$\xaf\xd9Y\xc3\xee>\xd9M\x03\xd3c\xc4ak\xf1\xe9\xb7\xc3D\xa6\xeb^d\xa9s\x0b\xca\x1b~"\xf1.Q\xd1\x87\xf6HeWW\x97U\x97<\xb0\xee\xbbU\x8d\x08\x1e\x11J\xa7\xb7\xbb\xa4B\xa1\x10\x19\xa8\x90RF\x00\xfd\xc3\xad{COV[\x9c\xb4\t\xaa\xc1O^T\xb70Yv\xa9\x93QJ\t\xa9\xd6\r\xee\xc8\xad\xde\xd5\x86on\xd7\xc3\xa2\x10C\x03"\xdb\xe2\x11\xe5CR\'\xe2\xceOQ(\xec\xfe\x0e\x9e3\x94t\x10\xb7Z\x81\xc8\xfa\x92\x1d\x1c\xd7\xa3J\xfbW\x99\xf2\xdf\x08A\x84WS|\xd1\xf4\xa4`hs\x9eo\xea\xb1\xe6(y\xa2\xa6\x805\x92\xc4&85\xc9\x0f\xb21\xa7\x13\xf2\x14\xea[\x0fx\x18\x86"\xc1\xe8\x92\xfc\x07\x8acmT\xf3,z)\xad\xc0\xb6\xddu\x15\x82\x81\xf5&\xb8)\xe2\x8f\xd0\xdf\xe7\x81~\xb9\x9a\xa0\x80\xef\xa7O\xa2s\x04\x1a\xd4\'\x85\xe4\xd1 8\x9e\'\xe1\x83\xb7\xac\x80\n\xc1,<hi\xa7\tK?\x0b4aaJ\xe0\xfa2\xcf\xc3wc0=L\xd1\x8c\xd4i\xaaK\xeb\x82;\xcd)\x9e??\xbeL\t]*\x02\xea\x81\xfafP\xd2\xf7\x89\xac)\xa5\x91&\xb5SYK\xfd\x02\x0c\'\x92;\xc5\xc4\x12j,\xc5\x86\xd2\xb5\x11 \x11\xf2\xbc\xd5\xa72_|,t\xca<\xf2\xcc#\x81\xad\xfe\xcd\xbe\x08\xeamq\x93N\xa1\x7f#v\xff\xde;d\xab \xad\xd2K\xac\xad1n\xe0\xcb\xdf\x0f\xaf9s\xc3\x04">!\xba\xb4\xf5l\xa9/\xdb\x9f\x9c\xdf\x8f\x9c\x1f\x1a\x14\x9dl\xf8]lC\xea\x8ad\xe3\xf6|\xf1[>\xe8\x06\xcf\xc6\x9b\x96`\xd3\xd3!\xe3\xa1\xe47\x988\x8c\xc1\n\xcb\xa5\xd159\xcc\xff\xa3\xe0\xc5\xedo\x13\x87\\h\x1a\x1d\x91\xd2{\x90};\x06\xb5\xb6\x9f=\xd9)\xec+\x16\xba\x07\xd6x\xe8\x8fV%\xa6\xee\x0c\xef\x85\x17\x1c\x8fv&\xc5\x07\x16URF\xe2\xde\xc7\x1f\xc1\xa2\xf5\x10\x84f\xf7L,<\xe2\x00a;q\x11\x8c\x7f7\xfaLP8.\xa75y\x17E\xf9\xb2/\x832\x8bH\xb5\x01\x8d\n\xe8\xd9\xdaX\x05\xc4\xeaW)\x0fZ\xab\xf3\x12\xdf\x84\xb3\x05G=z+\xa3\xa6X\x1f`\xe3\xda>\x90\xbd\x9d\xd4,\x9cY\xeeuF\xae\xe6\xd2\x12\xec\x86\x94\x8e\xb4,\x9c\xd6\xedh\x16#\r9"\xfb\x1a\x889\xba\x1e\x86E\xe7[ry\xf2\x80\x9a\xb4\x1e\x92\x8e\x16\x908\xf1<\xc1\x17F\xeb\xf3p\xb7\xc5\x07_l\xd9\x13.\xfe\xa4\x1ae\x13\xff!f\x07\xae5\xc5\x15[\xdb\x1e\x9eSkCq\x06|\xd5\x83\xc7&\xbb\xb9\xa0\xa0\xeeU\x91T\x12\x12\xf14\xfeS#q\xc9\x9a\x93\x8f\xe9|2\x05\xd6\xa7\x1e\x86\xfe\x99\x87\xc0@t\xb7 \x00\xff\xab\xed\xcd\xd2\xff\xd9\x80\xc2\x8c\x87\xc0O\xcd<\xfdl\xa2\xfe\x98|2\x1d<}\xb4\x94\x01\x98\x05C\xa5\n\xc7t{\xe3\xa1\xf3&\xf0\xa214f\xfd\x8e\xb8]{]\xd6\xb8W\xd8\x18\x90P\x82\x86\x19\xa2"\xe4\xef\x9diK\x18\xd2\x8bH\xef>\xe4\xcd\x81\xc2xc|\xd9\xb2*_0?\x9fd\x1f~\t\xfe\xa5\x04(\x93/\x0f\xe8\xcd\x15)\x0ft:\xa2L\x89\xdd\x1c\xee\x90\xaa\xef\x92C\xbdAou!\xee\x874\x9d\x98\x98\xb4\xff\xbe\xdfY\x17]2\x05\x8e\x80\t\xba&7\xd2N\xef\xe8\xe2\x16\x00@\x87\xea\xa5k\xd3}$\xb6\xb2\x01\x9a\x9c#Rcml2\xda^\x91.\xba&\xb7\xb7\x1b\x8a\x86\xd7]_\x08Od\xb6\xd1\xc4\x19g\xf9W\xc1}\x1eq\\t\xafp\x16\x0b.\r\x0c\xe1\xe8}43\x1c\r\xaa\xf5\x8d[\xeb\xb8\xe1m`|x-\x1a\xdc\xb7e\x85\xae\xaf\xb2\x9c\xacF\xec\xa8F\xc8%\xab\xf4\xb5\xbc\x94z\r\xb6(C\x02\x13\xa9\r\xe30b\x92\x18\ru\xe4F\xd7\x19\x1b]+\x8d\xd5\\"\xd2\x93\x1b=\x92\xb47s\xdb\xd8;\xe9WB\xd1\xbc\x03\x01u0\x9c\x9a\xa4\x00\x10io\x12\xb2\xe7n\xa7Odz[\xdf\xcd\xfa\x1e\xc9\x1d\x7f\xbe\xd2\x1e\xb0a\xe8\xe8Du\x9c\xefu/\xf8Y\xee\xfc0\x7fT\xbf\xb1\xeb3Zj\xb8\x81\x98\xad\xbb\xa8\xb0e9\xa5F\x81\x80\x11\xe0\xd0U\n\xc8\xcd\xe3\xf7T:\x87\xf5\xba\xab \x84\x1dv\xda\x8b\xd6#\xabn(\xcdX\xeb\xc00\x92\xefU\xa7\xa1O8\x04\xb6\x02\x98L~\x929\xab?\r\xa5i\xc5\x01\xe9\xfe\x02\x19t~\xa1\xc3d\xd1\x07\xad\x844\x9a\xbc>\x04pY\xe4\xad\xef\xd8%\x04\x0c\xf4F\xd5\xb2\x84\x1d\x1dsT]h\x88\xd1\x1d\x13\t+\xce\xf06\x93\xa1\xb9\xa9d+\x94\xf9\xcf\x8cC\xf3M:Vy\x04-1\x8c\x99U\x16\xee\x14\xf5\xc1\xbf\xde\xeb\x96\x07\xfahR\xda\xa81\xc6\xbd\xacAZ\xee\x8e\xbf?\x8e\xb6\x08\x94\xffv\x8b]|\x80\x08\x8ae)\x94\x93F\x03\x86\x80\xb9f\xd3\x81\xca\xf3\xacpW\xb79\xb2:%\x85(\x1c\xac\xaa\x0b[\xe5\xb7\xea\xb3\xae1?\xdf|\x1f\xaeo\x1b\x01\xef\x9f\xa4\x99\xdc=/\xbc\xa0\xf7w\xc6\x97\x85`58D\x89&\r\xf1\xf6\xcd\xf35\x8dU\\\x16\xe1\x98jc\x96+"\x15\xd3\xca\x8c_\xa4^Y}^\xfd\x0f\xd2b\x18\xfc\xd1\xd4\xe25_\x0e\xf0\x92.#d\xb6\x96R\xf5\xe44A\xc0\xfb\xf8B=\xeb\xca\r\x01\x89K\xff\xb8\xd2\xbd\x8e[\xf9\xd7\xc7\n1~7\xb80\x82q\x95Js\n\xbf\xc1\xa6\t\xb7\x07_\xcf\xe0\x1eD\xd2\x15xA3\xce\xc9\x08\xa1\x92\xe1\xe6~\xf3*\xa9gS\xde\xec\xed\xafP\x07\xcd\xd3\xac\x92\xdd\xe0\x0c\xfb\xd9\xa8\xcc\x19\xb8\xd3\x01Z\xee\xac\x86\xe4\xfc\x85\x05E\x05\x82\x1fe\x80\x87\xa4\x7f?\x9e12h4\xed\xc3\xe1s_:Lu\x03?\xe3\xb6\xaa\xea\x8a\xcf\xa5\xa2d\xd8vbaT\xf5tU^\xde\xf8\xe0\xfe \xc6\x9d\xb0Ij4:\x05S\x915\x8bf[\xf1\xa5\xce8\x9f\x8d\x9eQT\xe7\r\x7fj\xfe53\xa8\xf2t,~p\xa8\x1a>\xbdaj\xf7\xa1Fo\x1e\x8ayn\x98\x1c\xe4,K\xf7\x11M\x9c\xa0\xf2\x87*\x7fm\xa6$\xa7\xad\xa2\xba\xf1\x0c\xd8\xbfFAtN\x98\r\x05\xcc\x01\xed\xc1\x84\xcf\x90\x8d\ng\xbf\x9e\xb83\x00h\xc0P}\xd9\xe2\xfcP\x1c\xde\xec\x1bn\x0f5\xe9\x9ab\xd7H;N\x1f\x06\xeaz\xed\xbd}\x1fp\x851\xf2\x0e\xb6q\xe4^\x0e\xe8pQ\xc1(8\'\xa8\xf3\x06_G\xbd\xed\xfdP\xe1\xcaU\\o\xf2UEL\\\'\xad~\x8dT\xe2\x9e\xff\x94\xccN\x1a\rD\x91\xe1\x867\x11L\xf1P\xb85O\xa8\xca\xda\x06\xdc\xcc\'\x95\xcf\x9b\x94H\xdasL\xfc\x04!\xf1\x92\xea\xc3~\xe5%\xd6\x05\x17\x16\xaf]O2\xfbq9LQ\x9b\xc0\x1c#\x85\xbd\xdcB\xba\xc1\x84<s\xe7]*\x1a\x02Y<\x99 \x9aJ\x01N\xdfA\xe54\xd3\xd5U\x98\xae\x1eN\xf5c\xf4T\xa3&MDG\x9a\x96Ia\xfcN\xb5\x81\xb1^>\x96!q\xbe Z\xbe\x0c3\xcd\xd0\x83\x8fZV\x1e\xe9\xa7\xb8Y\x8f$L\xfc+\xdc\xc4\xb7N3\x93\xf8@\x15\x99c\xb2\x11B#$\xbd\xb6\xf1\x94\xb4\'\xeb@\x0b/{3\xe9)\x97\x10\x97S\x8b\x07\xc4\x18\xa4<\xfb\xe1\xa2\xbeEL\xdcr\x01\x9c\xcce\x18\xd5\x7f\x9b\xf3S\xba}\xae\xec/\xd7\xd0\xb1P\xb3\xce\x7f\x10\xcc&:\x95I\x88\x1a\xac\xe0\xf7~\\\xc4\x9c\x85$&@\x10 3\xa2\xb8\xe9\xab|Ui|q\t\x9f$\xba_HV\x9c\xb6\xf8V\xfe\xb7?\xedx4H\xc3@\xca%*t\xf1\xed\\\xfe\xb9\xb0A\xfa\xdb\xccm\xc9g\xfa\x1a\xd3.-J\xe3\x11\x8ccI2\xb2\xb0\x85q\x14\xaa\xe9\xb7\x14f[f\xda\xb5\xf7\x86t\x85\x10\xa9I\x8b\x86\x137\x8b\x00\xf9\x97}\xc4\xd4\x95Q\xe8\xc0\x8c\x10\x9e\x9f\x94C\xad\xa3\x9dA\x11\x9d\xe2h\xf2\x0fPu\xd5\xb8v\x171\xc73\x01\x9e?mVr\xc5ELG\'i.\x87\x9cd\xae\x1f\x15\xb3Q\xd0lq2QKd\xe8$y\'\x1ax3?5\xf4\x80\x11\x98\xac1<\xb0\xa2;K\xbb\x9d\xf1-DP\x81\xf2E\x88;!\xf6\x0e\xd2\xf7f\xf9\xc4\xae\x17\x10\'\xde~\x8d\xd4\xe3:.mS{W\xa2\x8d\xf3>\x00\xf7\xd8\x86c\x85O\xa8\xb7\xa8\x01X\x18\x80\x8d\xd4\xa7\nT\xda\xc3]\xf86\x97\x81&\\)$\xaf\xd1\x9f|/$!\xa0\xadJ\x80\xc2\xdd\xde{\xbd\xd6\n\x18!=@\xc2\x0b(\xe9KM\x1e@*\x86?r\xbb\xf8\r\x9b\xa3\xf1Y;4\x03Q?\xa3\xdeuR\x95nC\xc9\xaa1\x92\x9dnK\xd0\xeaO\xa1B\x04\x1c\r\xe9F\xffd\x16\xc8J\xb1\xcf\x9a2\xf5R\x8c\xaf\xaa>g\xa2\x1da\xdc\xc48k\xea}\xab\x02\xd4\x08e\x92U\x9d\x85\xafTx\xae}3\x02\xa5!\x11\x00\xea\x96h\r\xf9"5u\xd9\xb9\xc74G@\xea\x86\xfc\xceZR\xa9\x82X\xd5\x8fT\x94\x0e\xda>\xf2\x069y\x98\x9e\xa3\xe0C5\xeaX>\xc1\x18\x08k\xad\x03\x01\x0cj,\xf7\x1f\x05\x04\x14Y\xa4d(z3Y\xf3OxZ\x17E\x9e>\xf0].L-\xc6\xbf\xb4*f\x1d/\xa4\xde\x16q"\xd1,)\n\x8atQ\x16\xf1\xe11\xca\xdf\x84\x03/\x05\x87\xaf(\xadF\xfe2\xdc\xb2\xd5>\xc8g0\xf3\xf7G9Q\x8aw\xc2X\xac\x03{\xdb\x16\x01\x9a\x05\xc6o\xee\xdd\x9f\xed\xd0\x95\xea\x0e\x06E\x08!\x99\x112Ni\xb5\x9c3\x1c\x19\xe8H=\xef\x7f\x04\xe1\x93@2\xd6\xba\x08)\x03B\xf8\xd1``j\xb9\xc7\x9e>\x8a\xba\xdb\x93\xf1\xb8\xd5\x8f]d\xc4&8\x1c\xa9\xf5\x85\xaaX\x98!u\x1d\xdd:\xcd\xbcK\x94\xed\xae\x8b\xcb\x1d-c\xb4\x84\xde\xf4\x1d\xc9\x7fKkp43\xe6A\xc70\x0b\x06\xda\xbe\xc7\xf1l\xd7/&\xf9\xec\x98\xc8\xfe\xe4\x91@\x07T\x86\x16A\xaf\xc9`Z\xb4q\xb0\xe3\x07\x1a~dk\x18\x94\xb6\x1db\x98\x0f\x82\x01\n\x86H\xa3\xdf\xab1\xfe_I\x8e1\x1f\x1e\x93W\x8c\xe7T\xbfv\xa6"\xcc\xca\xb8\x15V\xb8\xf3\xe1\xa8\xed8\xf4\x93\x96 \x02\x89\xa4l\x94\xbaK\x9b\xb63\xb0\xdbN\xfc\x0c\xbe\x19K\xa5\xe3DZ\xca\x92\xf0Ez|$\xd46\xad~\nl\xcbo\xe1z2\xf1\xd5]\x17\x08\xb6\x86/E\xda\xb7\x0c\xc2\x0c\x14\xe8\xde\x08$Z4]Z\xcfN\xab\xbe\xdbG\xd5\x85H\xb4}\t0\x96\x93\xcf\xcd\x0c\xd0\x89\xac\xda%;2\x1ej\xc3[T\xac\xc0\xc0\xe1>\xc7Z\t\xae\xc2C\xdf\x97\x908\x83\xf1\'\x840\x17\xbbu\x1d\x15\x939\xac\\o\x15c\xa2\x84\xd7\xbe\xa1\xb5\x1d\xfeL}\x90\xfex*?Q\xc2\xb0\\Su\xa3\x93f\xc1&+\xc6E\x13Q?\xd8\x18oZ\xca\xc5\x00\xf5\xf0TI\xf9\xf5\x87\xfd\xebZ8A\x92k{\x07\xad\xbd\xe2\x0eN\x8d\\S2\x80\x00Ez\xa5\xc3\xaf\xb3\x0b\xb033\xa5\xba\xdeLC\x81\xbdL\x05\xc5:\xb9\xac\x85\xd9\xcd\x03\xe4F\xf0\x8b\xa2TR\r\xff4\xe1\xf4x\x9f\x87\x8a\xa3=\xf8\x1d\xe8\xb0g\xc1;\xba\x19"f\x08\xa9\xadA\x03\x07\xa1\xfc>z\xaf!\x840Bq\xc1\x1d\xd4\xee\x0e\xf3\x8b\x10\xee\xe0nC\xc7\x94#Gg\x93\xe8\xedx\xd1\xd9\xd9b\xe9\x9b\x9eRh\xb8y\xe3>\x8b9N\xc7d:\x94X\xd6A\x19\xbd\x0e[M\xa0\xb4\x05m\xd2\xcd:_\x05c\xe4\xc1og"\x8e\x81!\x15L\xf6&\x94\xe6\xc5\x83\x11K 2x\x9f\n\xf4{-\x01\xadU\xe6\xa6\xec0i\x00\x12{\xbe\xf5&W=\xde\x19\x0c+4D\x96f\x9a\x8c*\xed\xb5`\xe6\x9cC(&\xe6\xfa\xba\xac\xf8\xc4\x1c\xe0\x14\x9fk\x94\xbcF \x13\xc0t\xe6\xf0\x90]\xc1\x9c<R\x996\xd46\x15\xfe\xf4U9\xc3\x9f\x85/\xde\x88\x8e\x07k\x99\xc0\x85\xaf>j\xb4\x8f\xf4\xb7B\x9bL\xc1S\xc9\xd8\x15I\xa4\x88\xef\xc5\x1f=\xde\xf2I{K\x8517\x13 \xe8\xd09qS9\xb1\x0f\xfe\xd4\t\xf1\xf8\xb5\xa27\xa7\x063\n;\xb6m\xe8U\x93\xe0\xab\xeb!Q\xe6\xb1\xdf\x8e\x9c\xb4\x9d/*\x0f)>x\x19\xeb 0\x90\x01\xdcp\xcd\xb6W6\xae%~\x93\x90\xd0\xf5\x07\xe3\xfa\xd6&\xb5\x07\xa5\xb8\xb2\x1f\xae|\x1a\xe8\xb8\x96\x1d\xb6\xd2q\xd9\x84a7\x00t\xb8\x1f\xdb\x7f\x85q\xe6\xe1J\x19\x13xt\xb5\xc4\n\xae:\xb1<Z!\x88Xf\t\xe6xTk)sL&"r\x9e\xa2\xa1t\x04L6\x10\x97+\x1c\xed\xaa\'\xe3\xa4b\xed\x9b\xef\xf1PH*\xc8\x02%T\xcc\xca\x9dgG\xe2\xf5d\x19\xf0i?$g\x99%9\xfe~\x12\xc2p\x9e:\x13\x90\x07\x8d\x0c.\xb5R\xc5D\xc5\xe5\xfdF5\xbc\xe56}\xca\xff\x1c\x1e\xfc@8\xb1d}\xeb/\x0b\xaa\xf2\x0c\x90B\xce\x97\x0b\xaf\xc0\x8f\xb1\xeb\xb4\xb4\xbe\xf5\x0c\xd51\xe4\x19\xf4\x95\x91^\x8e7\x8e\xf4&\xcf\x13\x0c\x8f*\xc1\x1c4\x13\x96\xcfW\x91\xe3><\xfb%\xc1V\xd1/\xc3\xb0\xcc9^N\rp\xda\xa1\xa1<\x17\xd67\xe8\x0bF\xdb\xe65Yiz\x05*\x03\xe3\xe7Y\xf4K\xc0\x11\xb9\xc7\xed\xec\x91\xee\xee\x12\x06\x84\'\x97]\x17\xcd\xb3\t\xa5N\xfc\xf7\x1eRu3\xdc\xa5w\xf6\xdc\x95\x0ce\xa6\n\r~\x05\x0c\xf2\xb2{\x03\xe8\xa8\x85\x15v\xe0\xa5\\\x9erU\xbf\xde\x86\x9a>\xf9\xe8\xba\xfc\xd9G\xa9\x07wm\x975?\xe4`\xfa\xf1\x04\xa6\xfdE\xf4NV\xa2\xd6\x99\xea\xd8\x0f\xcd\xd0\xf2\x883\x0eRX\x12\xc5nQm\x80G3h\xf7\xd9\xbb\x8d\xed\x0fmWq\xabL+*\xb7\xc5\xc2\x873&\r\xfe_\xee\xe5p\xd2M\x8a\xa3\xdb\xa9\xe5\x98&B\xfe\xfa\x1a\xc0\xdex\xec\x1a\x19-\xa8\xaeV\xfd\xad\xdd*\x05a\xedc\x82\xe3G\xcb;\x15\x9e\xf8\xe4(L&\xc3\x1f\x96\xa6@?V\xe9V\x801\r\x8b\xd0\xc3\x9dnG\xd7L\xcc\x1a3B\xa7\x05H\xe4e\t\xcdX\\uJ\xe0\xad\xc1\xcbb|\xe8\xd1`\xd3\xbc\xf3\x01\xf0@\xf7\x06P\xcd\x98E\xcar\xbb\xfdf\xd0v\\0]m\x0bM\x82^4D\xb0Y$\xa5_s\t\xb7\xdc\x08>H\xfe\xd7\x0bp};\x94\xc3\xfbY."\xf7:OM\x15K\xdb$\xab\x124P\x18\xacS\\`\xf5\x1a\xb6\xc02\xac\xac\xe2\xae\x81}\x99J\x1ei\xfe//\'\xd6$]4\xde`\xef\xed\xce\x03%,\xa8N\x84\x891\n]\xe63\xdb\xc0\xb8Iqr\xbf?/7\x86\xae2\x16\xfd\xd6\xb0\xafE\x9a\xf8*\xd4\x8d9M\x96P\xfd\xb4\x9d@\x18cG\xc0\xae\x0f\xda\x82\xea\xb9\x84OX\xb69\x06\xd7%~XP!9\\@\x81F\xf4\x12\x1f\xf8\x0bl\xe7(\xc6n\xbc\x0by"\xc8T\x17\x13;\x05\xa4\xa8\x9a"h\xb2\xef,*5U\xb2\xf7\xf1\xf1\x18\x04\xb0Z\xa0\xc1{\xe6\xf6U}?\xf7\x16Z\x95.\x07\xfd\x1e\x15\x8d\x9f#\x0f\x97\xd1\x02\xfa;X\xc2\xec\xb5}r~?\xd2\xd5k\x0c\xbf\x1e\x7f\xccex\xaf\x0c\xb9]sW\xdd\xff\xd0\xa2\xa3\xd1\xa3n^\xec\xb0m\xa2\xdc\t>\xf5\xce\xec\xa8\xea\x89\xae\x90\x13\xab\xff\xb4)\xe60\xe6\xb6\xfb\xabc\x0e\x9dp\x91\x08av\xe3\xc3U\xb9\xe9\x94&\xf1]\xf2\x80+S\x05*Q\xe0\x1a\xcd\xf3 Y\'\x0eY\xcd+"\x93M\xc8\xeb`\xca\xd4\xb0\x87C\xf5\xe35\xf6w~\xf9\xc0\x18g\xc6\xd0\xc4\xed\xe3G\xa6>\xef)h\xda\x94\xd8*4O\x182\na\xb4\x94\x82f\xa4\n\x9e@`\xd6\x84\x89\xbaJ\xb7i\xde\xcc\xdf/w\x82u\n\x16\xcb)\x17T\x18\xfb#;\x8e\x9d=\xcf\xbc\xa08\x80\xc6\x0f\xc6\xe3\xd5F\xf1\n@\x9f\x97n]M\xf8h\xd3\xe1B+TW\xa5X\x16\x14\xde\xff\x0e\x96\xc6\xa5j\x8e\xb0\xe2OE&sg\x03\x90\x10i\x12\xdc\xb7\xfeW\xc3\xbf\xe5\x18hTH\xae&B\x9c\x00R\x91?\xff\x0f\xcb\xdb[G\xe3LoI{G\xa0T\xfaaU\xf8\xacQ\xfd\x99\xf6E=\xa1\xa80Ds\xb1)2\xa3uCD\xc7E\xf7\x1f\x90\xa5\n\xf2\xa0j\x83\xd9\x0b\x18\x00\xcf\xfe\xcd\xceKj\xf7\xd7\xf35d\xde9\x83=\x8dOV\xbe\xcb\xb1/\x02>\x05\x17_\xe7_tLE\xab\xf2\xe3E~V\xd9\xd7\xed\xdd/\x82\xc9\xa0\x9e+M[\xae\x07j\x95\x90V\xa6]\x9a\xbf\x01}k\xab\x9d\xdb\xa3\xa8\xfe8\x06\x99\x01\x96\x8d\xe42G\xe7\xde\xd8\xb5\x10\xc1=Uw\x12M\n\x19+x\xc1\xa39\xabX\xd9\x07\xe4\xdf\xd3\xa22\xd5\x9f\xba\xcdd\xbaf(\x8bN\x86\xb5\x9f\r\x87h\x11W\x8a[wV\xcd\x8a\xca\xd7g\xf2\x1e\x9a\xf8B\xdd?\xde\xc6wI0\xa7L\x8f\t\x91\xaaIu\xb1\xd7\xd4\x84q^\xb7\x94#Ug\xcf\xf4-\xc99\xeaN9\xebonM\x14\x07\xb9\xbcG\x13\x08\x07\xf2\xe6\n"1w\xc9~\x12z\n\xe1wR\xdb6\xb2\x98\xed6\xc3GT\xc1\xf26cp\xe1b\xa2\x9d\x99y\x1b\xca\xbe\x16\xf2\x17\xe1v\x8b\xb9\xb0Pv\xed\x1b4\x8a\xed\xe0e\xf9\x150\xb1\t#z\xe0\xc8.\xd7\n\xbe\xa0h\x8c\xd58\xbfFhg\x82;\x96D\xf6\xaa\xaeT"\x0f\xd7\x88\xb5(\x0bDG\x06qA\xd8\xd9\xe8\x97\xe5\xd1\xe1\x8d\xcd!t\xbf\xc9\xb2<\xaa\xa9PsR\x82\xd2\x85\xc5\xe3\xbb\x9eE\x18)\xa99I\xd1C\x92i"\xe2\xd7\xf1\xef%\x83\xde\xc6[6y\x0b\x9aB\xc1\xa2C\x96\x03\x08@\xf2\x0f}\xd3+\x16\xe4\xebh-r\x18\xd8>~QOOx\x83\x0e\xa2\xd4\x81V\x04\r%\xf3\xeb\x9a\x85\xdc\xcc\xe5"xb\x8f\xaf\xe0\x17\xc0\x94\xe7\xaaOl80\x82]\x1ah\xf7\xfe\xbe[\x89\x11Z}\x0c\xf8\xbav\xfa\xde\xc6OP*\xe49Ddeg\xe5\xda\x9e\x9fS\xfd\xf0\x80\x99{\x02\x14\x05\xe6\xc5a9X\xdb\xbd\x11\xbf\xfc\x8cM\x102\xd4\xc7\xfe\xa9\xec>\x9a$\xfe\x84X\xe8\\GU@\xc4\x17\x95\xb5\xd8\xb6\xb7S\x94n\x8cq\x98\xe7\xc7jz\xfc.ktE\xbc\x8f#\x97*\x88g\xeb\xc61\xf5d\xf9\xc4a\xe4\xdc\xb8\x98k\xfbe\xbb\xa3\x80^\xfch\xefD\x14\xed\xee\xc8\t\x8d\xef\xdc\x8d \x90\xe0\xd3\x0e_\x8b\x16A\x98\n\xcf\'\xe5\xedo\x11%;\xfdI\x95s\x94.U\x9b\xf6\x15\xc3\xdb\x04\x9f*U\xab$\x15|\xc9z\x0b\xfd\xcb\xdc\xe0_ \x05\xc42\x94\xe5\x92\xcd\xab\xd8\xf5%\xd7J\xe7\x95\xc0\x99\x9f\xed^v\xb1\x97{$\xc2\x18t\xe3\xc4\x8a\x82\x1a}\xf1q\xbf\xb0\xe1\t\xa7\xd0\xbe\x00\xa3\x7fF\xe6\x1e|\x80x\x97zL\xc2\xa5\xab2\x91\x8e\x0e\xfb\xe1\x1f\xb3b\xd1\x1b\xed\x82\xd21FI\xd3\xd4%8r\xe8b\x9b\xdb\xac\xa2\x11%\xa5\xb6\x83\x8c\x9dh\xcd\xa5# !\x1d\x8a\x10\xb7\x19\xb6\xb9L\x15#+;1\x06\x08\'\xf6\x9aV\x02\xd2\xa2\xb5\x1dQV\xcc\x10Y_\x8d\x16d\\RM\xb0}\xdd\xf3\xbaE,\xf6\xf9\x04\xdab"\\\xb7\xd1\x01H&C\xca\x0e\x89\xa6hImNV\xfc\x08\xc0;\xc6P\xe2\x96\xe0\xbe\xd4\xd2\x8a\xbb\xed\xb1C\xce\x8e\x9as\xd0\x89\xb6}\xf1I0\xba7\x80\xbe\xdb\xf7T1\xcd\x7f\xd2\x13H\x03\x96\x08\xe6\x08\xbf\xed2\xfc\x8a7\xef\xc9X\xab\x19\x17\x90\x05\x99\x01\xb7\xde\xfd\xbc\x17\x16\x1c1#\xdcQ\x8f\xc4(6\x1f|\xcb@b\xccK\xc9\x1f\xafw\x92\xd7\'4\xf7{f\xc3`\xd8uXc\xbf\x8bx\xb8\xae\xf1\xc3\xce\x11$P\xdb\x0fp\xd2\xef\x94r\x0c\xac\xcd\x98\x99I\xae!\xb0\t(\x9bHP[3r\\\xe4\x8bk\x1a\xa5@VV\x12~X8 \xbbk\xa1v\xe5\x15\x1b\xbd\x945\x08\xc4P\xf4\xa8et\xb1}]X\x8cG\xf5\x0e\xa0-\xad/\xa0C\xe3Q\xc1\xf7\xb5w:m\xf1\x8a\xe1\xe5\xe3\x10>\xa7\xa6\x16\xb8\x0e\xf8\xcct\xf6\xf3#\xfe\x01\xdf\x8c\xca\x8d\xb2\xdf\xa2\x9e\x13O\xc6 \xb4\n\x83\xb0|3V\xcaq[b^/O2\xbc\x16\x99\x00\xb2\'\xff\xf0\xffsv\x13M\xbaO\xbd\x7f\x13\xce#\xe4\xe7\xb3j\xa1|%\xcemh\xc0\xb950Y!\x97&8}\xd9\xbaFa\x07\x8a"\xb0\x13\xfa\x0e\xc9)\\\xa28\xa5\xe5\xc3\x8d\x13\xd4@\xe2F\x84(\xd9\xe4\xb1\xac\x89\xc0157\xd3\xd1z@*\x86\xe58dX}\xffFyn|\x14\x05ss\xdfwiJw\x9a\xeb\xac\x87\xbc`\xd5\xb7\xdfr\xc1a\xf7\xed\x8e\xdb\xafS\x84\xc8$\xa5\xcd\x83\xf8\x8fO4"\x16\xac\xb3\xf2B\xd7\x13\xf9\x9e\x03\xe2\xd3L\xddYw\xae\xb3[\xce\xd5B\x8a\xd0\x1fk\x8b\xc3[oC\xd6De\xa9\xcf\xf7\r<\xc6"\xf6\xcb\xe1\x9dd\xa7Z\xc6\xb9l\xe4\xe5\re\'G\x9e\xc0\x83\xb5AP\xec\xefq/\x14*\xc4|\xa1\xb2P]\xc5xH\x8e;"&\xe9\xd0|h\\\x89c\xfd\xca\xab\x12S\xdc8\xbb\xdd\xfaM\xb9\xf2f4D)\xb8\xc2\x9f\x04\x99\xbd\x12\x17\xad]\xb1_\x9ca\xd9\xdf\x0e\xec\xd0\xa7\xad\xd9\xe2\xec\x0c\xb5[\xb7\xea\xe7y\x892m\xf4d\xe1\xfe>\xfe\xbe\xe8\xb1\x87)h\xca\x17y\x87\x83\xc7[/\x8c\xc3\x9eY*\xdf\xc7\xbc#\xe3O:\xff\x88\x94\x93\xfc\xce\xb9;O\xacC\xc8\x12\xf84z-\x90V\x14\x17\xec=\xff\x10\xdc\xad\xb1\x04c\xea\xb9\xa8\x8b\xa8=\x16\x98\x15\x9bri\xed\xc6\x8aVn\xc8\x18\x8c\x9dr4gA\xb4\x1e\xb6/i\x7f\xb5\xa7Nw\xd8\x1bi)\xfd\xc0\xd8\xb0\x13\x1a\xfc\xc6\xda\x01\xda\x83\xb7\x80\xf1\xa6\xc1\x0eM\x17\x19\x918\x96_\xb0\xfc\xbc\xa8%\xfe\x90%}\xab\xad\x8a\x1c\xf7\xf4\xf9.\xf4\x99\xc3\x05\x9dG\x00\xee\xf7\xfe\x1eR\x8f\xe8\xa7\x8dQ\xf1\xea%a\xf1u\xbc\xdf\x94$\xc6\xf8\x80\xb6\xd9Q\x85\xa3\xd0\x9cAz\x1a\xfd\xe0\xc3\xf8\x15m\xca\x06\xbe2EQ\x94{\xc2\x89TC\x9e\xb1[\xe4\xd2\xa1\x88|j\xc6\xbc\x1cn\x9e\x137)\xba\x03\xfc_\ng O\tGc\xc7\xa98\xa2m|\x91\xca\x14\x9c#\xc1>D\x0c\x87qW\x92@\xaa}\xd0K\xb0\x05S\xca\xfd%\xb2$\x1d\x9a\xbe\xd3\xb1\xb9\x12x4W\xfd\x1cJ\xd2\xbc\x83@\xd3\x83\xdf4?i\xf4\x17\xe5\xdf\xf9\xafo\xfbB\x9e:\xe8\xca\xd0\x9e\x8f\x82\x16\x0c\'\xf9w\x14\x1a;\x93c\xd620\x94e\xdf\xe5+&\xfa\xcar\xe5\xfc\x00\xcbR&\xd7/A\xcd\xfd|\xff\x88Y\x85\x9b\xd7\xb2ID\xb8\x1fT\x18L5\xe5\x9e\x85U\xc8\x97\x85A\\\x08\xa1[eP \xe5\r\xf0\xd5\xd3Q1\xb1\x04\x9ag\x8d)\x91cO\x1e\xb9\xb8D\xe0\xa7\x86z~\x05A\xb4\xbaa\x88\x83\xb66K\x91]Zw \x9d4\x1d\xbd$\xe2\xd2\x0b\x02g@\x7f\x1f\xde\x82\xa9K\x9af\xe1\xbf\xd2\xdc\xb7\x86\xa2\xf3C\x84\xd3v\xb29u\xab\x7f\xc2\xc1\xe2\xb2\xf1\x7f\t\x9b\xde,\x04\xc8\xc6\xa2\x94"\x88\xbaf\xaa\xca\x9d!\xad\xdb\x80u\xac\xfdC|\xd0\x8c\x9a\xcd\xc9#u\xb7\xbd\x99)\x8afFH\xbcN\x9d\xb7\r\xd0\x12\x18\xe0\x95\xc5\x81\xecB3`\xc54Z\xe6\xb1\xc6\xb7;\r\x8c7\xa5\x85(\xfa\xe4\x9c\xb4\x08J\x14\xb4n\xb9\xb2\xc7\xbd</\xb5\x1a\x982\xad\xd6\xcc\xe3Mh\xfaJ\x08\x95o\xbc\\\xd6\xe1C%\xc6G"N\xaal\xa2)\xf4d\xadRKw\xa2Sm\xa1\x0b\x11\xeaG\xb9\xf3\xba\x1bc\xc5\xe0e\x80U\xf6\x16`\xe2\xbda\xae\x9a\xb9\x9dds\xff`\x98\xfb\xa0\x86\x89\x8f\xd7g\x15\x1f\x84oe\xc8"\x03\xd9OpS\x88\xe7(\x9dA\x08\xf6M\xbafc\xa4\x8eDf\xb1b\x9a&\x13(\xc4\x8e\xf1\x07\xcb\xc4\xcb@~\xf0W\x8f\x837v`\x0b\x97\x9c\xbf\x1fC\xd1J\x9d\xc8\x86 \xadf\x99\xba\x01\x0cx\x81\xc7\x1d\x0cP\xd2\x16\x7f\x1b\x88M\x1a\xc4Q\xceg#g\xd8\x1e\x9f\x88h5\x86\x12\x8e\x87B\x957\xb9\x15j\x85\x8a\xbf\xbbF8\x10\xac\x98\x16\x1d2\xcd^\t3\x90~>F\x08)AUW[\x03E\xf6\x15\xe4\xd1{H\xadH\x1am\xf0\xb4\x9e\xc0\xecG\x07\x8b\x9eV9\xb3\xb5\x06\xad\xb6\x8d\x03B\x1aS\xa3\x15\xb1\x00K^%=\xd2\x11\x8e\x03@\x98\xb8k|Z\x01\xd9i\xff\xfc!\xa6\xeeE*\x01\xad\x17#\x18R\x08\xd5\xfa\xb3\xcc\x91|\x93\x01\xf4\xda\xf9\xed\xe8&\x95E\x9c\xd2\x9es\xbf\x9e\xebs\xa4`\xda\x8e\x0b\xc8\x8f\xab\xc6\xb6\xd3\x08\xefW\xc8\x18_\x08\x90\xaeD\xd3u\xbb\xc2=\xe2\xf6\xebJ(\xa5\xb1J\x9f1\x9ca\xb4{\x13\xc7\xf1\xa9\xb5\xefQ7\x8a\xccBGR\x01\xe9<"\xe3\xdd\x98R\xae\xe7\xdfk\xc4\x922\xc7\x8d\xb5\x88\x8f)\x9b\xe1\x9d?7\xd5\xc6\n\xcb%\x10\xd2\x9e\x0b\n\x1e\x8f\n\xdc\xc6\xaf\xa7\xd2\xfa\x99\xa1]Z\xb8\xdb&E9\xc74\xeah\x91\x8a\n3\x0b\nT\xa6\xb8\xf2Z\xfe\xbb1\x05{n9%m\xbfJ\xb1\x16\x01~\x83K\xf6\xaa\xb4!+\xde\x85Ch\x13\x99\xea\xf8H\x83\xfa\x04\xb0\x81y\x8e$\x8f\'\xac\xbe\xf9A\x16\x0fhqx\x04\x96\xd9\xf1:\xd6\xa7\x06\xc8R\x90\xfc\xab&10\x1eU\n~ep|\x8b\x1d\xe1\xc1YK\xc7\xe6-NW\xf9\xfd\x01n\x82\x84\xe1\x1e\x05c\xeb\x98\xc6\xdf\xc5W\'1\x07=1\x85\xd3*\x9a\x90h\xa4\xfc\xa2\x9a\x81\xdd6\x90\xa9\x06CE\x04\x8e\x19\x06\x14h\x98\xae\xd0\xed\x80\xde\xf3T6\x068\xfcT\x8d\xba\xde\xc1\xab^\xcb\x02\x84\xdc\xf0\xf1\xc0C\xe2\x93\xfa\x98<\xe8\xc5\x13\xa5TelDH>\x13\xdc(\xbe\xaa[P\x85\x9d\x1f\xd8\x83\x94;\xd5v\x10i5\xb0\xfb\xa6u\xd4G\x86~4\\+d\xc9\xdf\xc6\xdf\x07\xff\xd2\xbdP\xba\xa0\xc3\xdd\x95\x90\x9f\x1aN84\x7ft\xbb\xc1\xfa\xb9\xc6\x92\xd3g\'N\xd2;\xfd\x1b\xcf\x96\xd8\xca%%K\\\xff;\xbf\x19\xe5o\x1b\xbf\xdf\xcf)%\x06Q!H\xd5\xe7\x02\xd9\x80\x14\xc1E\xc8\xdfzt\xfe\x06\x176\xd8mK-\xaeP\xe9O\xaa\x9d=\xech9\x9e\x1d\xeb\xc3\x92i\xd7\xfe\xd3\xfa\xa3\xbd\x1c6\x08\xdbx{\xe4M\xc8\xda#*\xee\x96\x1fRV\x10\xf4\xc0\x8d\xac\x870\x00?\xe7\x8b\xb4L\x80\xfa\x81\xd9\x1e\xaf\xb6i\xdd\x13\xc6zk s\x8c\n\x9cm!\n\xb1\xee\xb3\xa6Y\xeav\xe6\xb38\x11\x1d\xa5<\xf6\xb5\xe0\xb5\r\x9a\xd6qM$#m\xdc\x87\x18\xf7\xd5\xb8\x14\x97\x89\x18\\!,4\xf79\xe8x\x1f\xb7\xb3ycw\xeer\x1c\xed\xea\xd8*\xeb%\xb8\xef\xf1\xf1\xfe\xdc\xb2\xad\xf5\x10(\x83\xf4\x8b\xf5\xa7~\x7f\xd8\xc0F(`\xb9\xae\xdbs\xbdj\x8b\xc9\x154\xf4e\xfc\xab\xcd\xddD\x86\xcd\xce(\xc8t\xb7g\xec\xf3J\xb2\xa2\xc7(\x8f\xfbp^\\;0\x16m\xe3\xd7\xc9\t\x1dM\xe6\xb5\xc4\xf7t\xa8\xd0\x0c\xfe:\xe2\x14DO\x9c\xce\xe7\xc1\x03SZ\xc9\xf4~\x94y}2\n\xed\x04\xfa\x16\x96\x87\x80p\xd3/#\x82\xe9\x93\x0e|&\x9c\xbdR\x1e\xc3h\xf9K-ui\xde%\xba\x11\xc1D\xe5DR\x1e^\x02\xa1\x1c~\x07\x04\t\xd1p\x95\xf9\xcfO\xd3\x15A\x16\x07\xa84\xf3\x9fqv\x0f\xf6u\xa1\xd9\x82G\x1dCC\x1bt$\x04\xa9\xd0\xe2>c\xd7\x9b\x968\xbeAF\xe4\xf1<\xba\x84\x9bE\xcaFd9/\xb5W\x8b\xdeM\x16\r\x0bfb\x01\xb8A\x11)\xfc\xd6t\x96\x18\xe62\x8f\xfb\x8eJ\xf0Y\xae\xf4\xb1\xfa\xbc\x96\x02\x8a\x88\xaa\xb1\xee*\xf8q\x86\x8bg\xd4\xfc;\xf7\x1b')
4
- #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
1
+ from flask_admin.contrib import sqla
2
+ from hiddifypanel.panel.database import db
3
+ from wtforms.validators import Regexp
4
+ from hiddifypanel.models import *
5
+ from wtforms.validators import Regexp, ValidationError
6
+ from .adminlte import AdminLTEModelView
7
+ from flask_babelex import gettext as __
8
+ from flask_babelex import lazy_gettext as _
9
+ from hiddifypanel.panel import hiddify,hiddify_api,cf_api
10
+ from flask import Markup
11
+ from flask import Flask,g
12
+ from flask_sqlalchemy import SQLAlchemy
13
+ from flask_admin import Admin
14
+ from flask_admin.contrib.sqla import ModelView
15
+ from wtforms import SelectMultipleField
16
+
17
+
18
+ from wtforms.widgets import ListWidget, CheckboxInput
19
+ from sqlalchemy.orm import backref
20
+ # Define a custom field type for the related domains
21
+ from flask_admin.form.fields import Select2TagsField,Select2Field
22
+
23
+
24
+
25
+ class DomainAdmin(AdminLTEModelView):
26
+ column_hide_backrefs = False
27
+
28
+ list_template = 'model/domain_list.html'
29
+ # edit_modal = True
30
+ # form_overrides = {'work_with': Select2Field}
31
+ form_widget_args = {
32
+ 'description': {
33
+ 'rows': 100,
34
+ 'style': 'font-family: monospace; direction:ltr'
35
+ }
36
+ }
37
+ column_descriptions = dict(
38
+ domain=_("domain.description"),
39
+ mode=_("Direct mode means you want to use your server directly (for usual use), CDN means that you use your server on behind of a CDN provider."),
40
+ cdn_ip=_("config.cdn_forced_host.description"),
41
+ show_domains=_('You can select the configs with which domains show be shown in the user area. If you select all, automatically, all the new domains will be added for each users.'),
42
+ alias=_('The name shown in the configs for this domain.')
43
+ )
44
+
45
+ # create_modal = True
46
+ can_export = False
47
+ form_widget_args={'show_domains':{'class':'form-control ltr'}}
48
+ form_args = {
49
+
50
+ 'domain': {
51
+ 'validators': [Regexp(r'^(\*\.)?([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,})$', message=__("Should be a valid domain"))]
52
+ },
53
+ "cdn_ip": {
54
+ 'validators': [Regexp(r"(((((25[0-5]|(2[0-4]|1\d|[1-9]|)\d).){3}(25[0-5]|(2[0-4]|1\d|[1-9]|)\d))|^([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,}))[ \t\n,;]*\w{3}[ \t\n,;]*)*", message=__("Invalid IP or domain"))]
55
+ }
56
+ }
57
+ column_list = ["domain", "mode","alias", "domain_ip", "cdn_ip"]
58
+ # column_editable_list=["domain"]
59
+ # column_filters=["domain","mode"]
60
+ # form_excluded_columns=['work_with']
61
+ column_searchable_list = ["domain", "mode"]
62
+ column_labels = {
63
+ "domain": _("domain.domain"),
64
+ "mode": _("domain.mode"),
65
+ "cdn_ip": _("config.cdn_forced_host.label"),
66
+ 'domain_ip': _('domain.ip'),
67
+ 'show_domains':_('Show Domains'),
68
+ 'alias':_('Alias')
69
+ }
70
+
71
+ form_columns=['domain','alias','mode','cdn_ip','show_domains']
72
+
73
+ def _domain_admin_link(view, context, model, name):
74
+ if model.mode==DomainType.fake:
75
+ return Markup(f"<span class='badge'>{model.domain}</span>")
76
+ admin_link = f'https://{model.domain}{hiddify.get_admin_path()}'
77
+ return Markup(f'<div class="btn-group"><a href="{admin_link}" class="btn btn-xs btn-secondary">'+_("admin link")+f'</a><a href="{admin_link}" class="btn btn-xs btn-info ltr" target="_blank">{model.domain}</a></div>')
78
+
79
+ def _domain_ip(view, context, model, name):
80
+ dip = hiddify.get_domain_ip(model.domain)
81
+ myip = hiddify.get_ip(4)
82
+ if myip == dip and model.mode == DomainType.direct:
83
+ badge_type = ''
84
+ elif dip and model.mode != DomainType.direct and myip != dip:
85
+ badge_type = 'warning'
86
+ else:
87
+ badge_type = 'danger'
88
+ return Markup(f'<span class="badge badge-{badge_type}">{dip}</span>')
89
+ column_formatters = {
90
+ 'domain_ip': _domain_ip,
91
+ 'domain': _domain_admin_link
92
+ }
93
+
94
+ def search_placeholder(self):
95
+ return f"{_('search')} {_('domain.domain')} {_('domain.mode')}"
96
+
97
+ # def on_form_prefill(self, form, id):
98
+ # Get the Domain object being edited
99
+ # domain = self.session.query(Domain).get(id)
100
+
101
+ # Pre-select the related domains in the checkbox list
102
+ # form.show_domains = [d.id for d in Domain.query.all()]
103
+
104
+
105
+ def on_model_change(self, form, model, is_created):
106
+ model.domain = model.domain.lower()
107
+ configs = get_hconfigs()
108
+ for c in configs:
109
+ if "domain" in c and ConfigEnum.decoy_domain != c:
110
+ if model.domain == configs[c]:
111
+ raise ValidationError(
112
+ _("You have used this domain in: ")+_(f"config.{c}.label"))
113
+ myip = hiddify.get_ip(4)
114
+
115
+ if "*" in model.domain and model.mode not in [DomainType.cdn,DomainType.auto_cdn_ip]:
116
+ raise ValidationError(
117
+ _("Domain can not be resolved! there is a problem in your domain"))
118
+
119
+
120
+ skip_check="*" in model.domain
121
+ if hconfig(ConfigEnum.cloudflare):
122
+ try:
123
+ if model.mode==DomainType.direct:
124
+ cf_api.add_or_update_domain(model.domain, myip,"A",proxied=False)
125
+ elif model.mode==DomainType.cdn or model.mode==DomainType.auto_cdn_ip:
126
+ cf_api.add_or_update_domain(model.domain, myip,"A",proxied=True)
127
+ skip_check=True
128
+ except Exception as e:
129
+ raise e
130
+ raise ValidationError(_("Can not connect to Cloudflare.")+f' {e}')
131
+ # elif model.mode==DomainType.auto_cdn_ip:
132
+
133
+ # raise ValidationError(_("You have to add your cloudflare api key to use this feature: "))
134
+
135
+
136
+
137
+
138
+ dip = hiddify.get_domain_ip(model.domain)
139
+ if not skip_check:
140
+ if dip == None :
141
+ raise ValidationError(
142
+ _("Domain can not be resolved! there is a problem in your domain"))
143
+
144
+
145
+ if model.mode == DomainType.direct and (myip != dip and dip != hiddify.get_ip(6)):
146
+ raise ValidationError(
147
+ _("Domain 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))
148
+
149
+ if dip == myip and model.mode in [DomainType.cdn, DomainType.relay, DomainType.fake,DomainType.auto_cdn_ip]:
150
+ raise ValidationError(
151
+ _("In CDN mode, Domain IP=%(domain_ip)s should be different to your ip=%(server_ip)s", server_ip=myip, domain_ip=dip))
152
+
153
+ # if model.mode in [DomainType.ss_faketls, DomainType.telegram_faketls]:
154
+ # if len(Domain.query.filter(Domain.mode==model.mode and Domain.id!=model.id).all())>0:
155
+ # ValidationError(f"another {model.mode} is exist")
156
+ model.domain = model.domain.lower()
157
+ if model.mode == DomainType.direct and model.cdn_ip:
158
+ raise ValidationError(
159
+ f"Specifying CDN IP is only valid for CDN mode")
160
+
161
+
162
+
163
+ if model.mode == DomainType.fake and not model.cdn_ip:
164
+ model.cdn_ip = myip
165
+
166
+ # if model.mode==DomainType.fake and model.cdn_ip!=myip:
167
+ # raise ValidationError(f"Specifying CDN IP is only valid for CDN mode")
168
+
169
+ # work_with_ids = form.work_with.data
170
+ # print(work_with_ids)
171
+ # # Update the many-to-many relationship
172
+ if len(model.show_domains)==Domain.query.count():
173
+ model.show_domains=[]
174
+ # if model.alias and not g.is_commercial:
175
+ # model.alias= "@hiddify "+model.alias
176
+ # model.work_with = self.session.query(Domain).filter(
177
+ # Domain.id.in_(work_with_ids)).all()
178
+ if is_created or not get_domain(model.domain) :
179
+ # return hiddify.reinstall_action(complete_install=False, domain_changed=True)
180
+ hiddify.flash_config_success(restart_mode='apply', domain_changed=True)
181
+
182
+ # def after_model_change(self,form, model, is_created):
183
+ # if model.show_domains.count==0:
184
+ # db.session.bulk_save_objects(ShowDomain(model.id,model.id))
185
+
186
+ def on_model_delete(self, model):
187
+ if len(Domain.query.all()) <= 1:
188
+ raise ValidationError(f"at least one domain should exist")
189
+ hiddify.flash_config_success(restart_mode='apply', domain_changed=True)
190
+ def after_model_delete(self, model):
191
+ if hconfig(ConfigEnum.parent_panel):
192
+ hiddify_api.sync_child_to_parent()
193
+ def after_model_change(self, form, model, is_created):
194
+ if hconfig(ConfigEnum.parent_panel):
195
+ hiddify_api.sync_child_to_parent()#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
196
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product