hiddifypanel 3.0.0.dev64__cp39-cp39-manylinux2014_x86_64.whl → 3.0.0.dev66__cp39-cp39-manylinux2014_x86_64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) 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/websocket.py +9 -3
  32. hiddifypanel/panel/admin_2.py +33 -3
  33. hiddifypanel/panel/asset.py +17 -3
  34. hiddifypanel/panel/cf_api.py +35 -4
  35. hiddifypanel/panel/clean_ip.py +125 -3
  36. hiddifypanel/panel/cli.py +172 -3
  37. hiddifypanel/panel/commercial/CommercialDashboard.py +59 -4
  38. hiddifypanel/panel/commercial/CommercialSettings.py +224 -3
  39. hiddifypanel/panel/commercial/ProxyDetailsAdmin.py +38 -4
  40. hiddifypanel/panel/commercial/__init__.py +50 -4
  41. hiddifypanel/panel/commercial/restapi/__init__.py +14 -3
  42. hiddifypanel/panel/commercial/restapi/tgbot.py +57 -3
  43. hiddifypanel/panel/commercial/telegrambot/DefaultResponse.py +11 -3
  44. hiddifypanel/panel/commercial/telegrambot/Usage.py +71 -3
  45. hiddifypanel/panel/commercial/telegrambot/__init__.py +6 -4
  46. hiddifypanel/panel/commercial/telegrambot/admin.py +120 -3
  47. hiddifypanel/panel/commercial/telegrambot/information.py +123 -3
  48. hiddifypanel/panel/common.py +98 -3
  49. hiddifypanel/panel/custom_widgets.py +71 -4
  50. hiddifypanel/panel/database.py +18 -3
  51. hiddifypanel/panel/hiddify.py +655 -4
  52. hiddifypanel/panel/hiddify_api.py +70 -3
  53. hiddifypanel/panel/init_db.py +393 -3
  54. hiddifypanel/panel/usage.py +85 -3
  55. hiddifypanel/panel/user/__init__.py +25 -4
  56. hiddifypanel/panel/user/link_maker.py +416 -3
  57. hiddifypanel/panel/user/templates/clash_config.yml +1 -0
  58. hiddifypanel/panel/user/templates/home/multi.html +1 -1
  59. hiddifypanel/panel/user/user.py +233 -3
  60. hiddifypanel/static/css/custom.css +6 -0
  61. hiddifypanel/templates/500.html +1 -1
  62. hiddifypanel/translations/en/LC_MESSAGES/messages.mo +0 -0
  63. hiddifypanel/translations/en/LC_MESSAGES/messages.po +194 -190
  64. hiddifypanel/translations/fa/LC_MESSAGES/messages.mo +0 -0
  65. hiddifypanel/translations/fa/LC_MESSAGES/messages.po +123 -120
  66. hiddifypanel/translations/zh/LC_MESSAGES/messages.mo +0 -0
  67. hiddifypanel/translations/zh/LC_MESSAGES/messages.po +123 -121
  68. hiddifypanel/xray_api.py +109 -3
  69. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/METADATA +1 -1
  70. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/RECORD +74 -76
  71. hiddifypanel-3.0.0.dev66.dist-info/top_level.txt +1 -0
  72. hiddifypanel-3.0.0.dev64.dist-info/top_level.txt +0 -2
  73. pyarmor_runtime_000000/__init__.py +0 -4
  74. pyarmor_runtime_000000/pyarmor_runtime.so +0 -0
  75. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/LICENSE +0 -0
  76. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/WHEEL +0 -0
  77. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/entry_points.txt +0 -0
@@ -1,5 +1,208 @@
1
- # 2023-04-08T16:23:20.306786
2
- from pyarmor_runtime_000000 import __pyarmor__
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\x00M\x1c\x00\x00\x12\t\x04\x00\x02\x157\xda\x8c6\xad\x7f:\xa6\xa8\xd3{\\\x87\xa7\x00\x00\x00\x00\x00\x00\x00\x00\xe0\xc9!\x9d\xbdHxI\xf775\x96\xba\xff,^\x8eN\x81\r\xbe\xb80\xdc\xf4\x93\xc9\x9f\x1cM\x1eC\n\xde_\xfaR\x127C\x90\xfe\xe6\xd6\xf4\xdc*\xd2\x83\xc4 \xd0\xfc\xb9\xe8\x1d\x0f\x84\x00EXA\x98r\x07Ah{\xd9\xd6\x07f/\xfa\xd6J\x9e\xa1o\x0c\xa6\xdd\xa6<\x93H\xce\xc0\xd7%`$C\x17\x05\xcd\xda\x19\xb2\xba\xdc\xbd\x97v\xd7\xf2\n~\xffQu\xd7\xf5\x93\xbeAyS8\xba\xae\xe7vQ\xa3\x1f)\x18\r.\'\x10\x10$\xe0\xa7\xf1Q\xc6T\x1e\x8c\x85\xf8\xff@?8\x95\x8e\x06\x19\xf6f\xb9`@\x985\x9b\x9eQ\xd7\xb3\x1fM\x89:o\x8f\x03\x180\xf4\xd6\x02\xfe`o\x84\xe2rZ\x9f\xc3\xe6a)\xe5\xceq\x893\x9a\x80t\x80\xf0\xa4t\xff\xe4\x94J\xc9\xfc\x9a\xad9I=\x18\\O"\x07\x11\x7fS&\xb1\x93*MN\x876\xba\x04\xdf\x9dj|\x9d\x93\x84\xd2\xe8%+\x12P\x9fi`\x01\x82\x1etwZ@\xb3\xc6\x05\xf9\xd8\x1d-\xbc\x06Z\xb3"&\'\xc5\x9b\xe1\x07E\\\x0cs\xed\xae$1\xaaU\x9b\xfdr\x1cL].h\xe0\xff\xb3\xba@|\xc7\x9d\x05\x956\xb3C\xdei\x12w\x98!\xfa\xbd\xda\x7f\x8b\x81t6\xef\xc1?q^\xe4J\xdf\xee|\\\x87?\xc8\x03\',\xd5#\x1e\xaa,&\xfe\x16%SJd\xca\xed\xd3\x8a\x84\xd5\x17R\x8e\xff\xbf\xdb\xf8\xc6I\x18}g\xbe7\x98\xeb\x05\xda<\xe9H<\x19\xf81\xec+\xd3?\xb1\xf1\x89\xc9{\x7fAt\xb5v\x84\xd0c\x83\xf8=N\xf0\xd2s\x15\xc5 O\x08\xc8\xb8K\xd4\xc4\x0bbQ\x1a\xe1\xb9\\0\xdbp,;2\x00\xe6\x89\xc2\xbd\x9d$\x05\x0fX\xb23\xfd\xc6\x89\x03\xbf\xe0V\xd6\x9f[\x8a\x08\xd1\xbb\x8e\x87\xcd\xc1\xb9\xf1\xde\xee\x0e;gs\xd9\x00nQ\x9e\x17\x99\xe13;\x92!_\'7\xac\x93\xeb\x8f\x87\xa7!\xb8\x1a5f\x8f*\x0eo\x14\xf9o\xab\x19\xb6$\xda\xcb\xc1\x8a\x98\xac>\x83\xfa|\x17o\xc5\xb6\x8b?\x8a\r\x7f$?eu\x07m\xef\xf3\xc3\xc7\xdb\x88V[p\x1d?*\xe5\xfc\x07\xdd\rS\xc0\x8f\x90\xf8L3\x85\x1b\xb8\xbfY#\x99\x04\xa8\x9eJp\x96\x0f\x9bC9_\xad?0\x8f\xce.\x8f7\x88\x1cu\x07\xb9\x80A\xfbg\x07\xf8\xb7h\xe9\x19N0}\x90\xf1^v2[\xf5UGQ<\xf6\xd1\x97U\xf6\xb7\xeaE\x0c\xed;\xafN\xacQ\xfc\xed\xc7\xe4$\xed_2hS\xa4\xa8\xdd\x0e\xdd\xc8\xfc*\xa5\x0f\xec{,}1dD\x9a\xb1\xf4\x1f\xa3\xf9\xd08emS\xbb\xca&\xaam\xa4tG:\xca\x052\xf7Jj\xd6Jhs}b\x13\xa7\xd0*u\xceY\xfd\x0c\xbbg\xe2\x85\x17\xed\n\xb5\xf6\x97\xb4\x15\x9e\xc1k\x86\x03\xf6\x80\x8987a\xb1J\xee7taMt\x0c\xbb\xda\xd36\x9aT-}q\xc9V_&\xf2\xa4p\xef&\x01\xbe\x1c\xf3CquS\x19t\x7f\xc8\xb3|H\xeb\xf3\xa8Z\xb3/\xd9\xbe\xd3\xa9\xcf\xe0Q\xe9\x99\xe3\x88n\xe2\xe4\x0eF>y\x966K<\x1c\x07_\xc6l\xba\xbb\xdf\xc7#|\xac\x97\x17j\xca\x18 \xc8E\xfd\x84*J\xc9(\xc9\xb2e\x93S\x16\xd7\xe6e\xd4p\'7\xdc\xaa\xe2 \xb5\xa6\xba\xdfE\xd4E\x14>\x1d\xac[\x01\xa3\xc2\xf4\xe9\xf8\xfc\x01\xb2\x94\xd5\xe3\xca\x96\xa6S\xc4=\xf2\xd8\x14\x80\xf4\x08\x00I\xef\x9a_keC\x836\xbb\xb9\xf4\x8c\xee\xc56\x82\xda\xbeL=01\xb2\\^\xcb\xe7\x16\x80K\x11\xa8%aJIR\x1e\xf1}\xb2\xdb\xf8\xc2I\x83\x8a\xd3\x18\x13\xe6U\x05m\x82V\xcc\xe27\xf1\xaaiBM;#W\x91\x93\x14\x00\xad\x979b\xa8\x87\x1cAC\xac\x84\xe9,\xd9K\xfdN\x91)y\xd9\x83"\xbe\xb9A\xc1\xe3\xa8\\\x8f\xc4\xa9\xf8\xe8G*\xa4\xb1\x92G\xc6ry/~q\xedT\xa1\xf2\xfbRVw\xb3A\xf0MOuCuIp~\xb5\x126\xdf\xdaz\xa7\x90X^\x91\x8a\x8fHu"aK\r-\x9e\xa9\x896]\x9c\xa43p\x8eF\xab\xd0\x0e\xa4|?\xc2\x86f\x81\xd8\xe2\x1d\x0f|WY\x00y\x96\xfc\xa7E$\'\xac\xda8\xd4\x190\x13\xc0\xca\x98N6\xca~lg\x85\x1e\xe6yr\xcd\xa1\x94\xd4x\xf66\xa3Pa\xc1\x0b\xd9\x04R\xf4\xa9\x12\x81\x16\xc9\xd62\xe5\xf1\xd5\xd3\x0b\xd3\xe6"\x1f\xaf#\xa3\xc0\xa1\x81\xd7m\x8f\x1b\xfc#\x1eI\xe0\xb8\xac\xc2e\x19\xee\xee\x9b\x8f&\xf0!\x14\xb4\xaf\xf8gk\x06C\x80\x17w\xfe\xc0\x0bX\x8a\xcd\xa7\xfam\xa7S\xc7\xf7\x1am\x95\x1d\xe1\x8f\xf4i\x12\xe32\x15Zi\x04Ll\xbaL\x06\x06W\x07;9\xae\xbd;b\xe8\xf2\xf9\x14\xef\x8eSw\xa8\x9f\xd6\xe9\x1f\xaa\xa1&\xcd\xdbg\xdf\x83\r\x1e!\xfbA\xd14\xf0&\xcb\xb1\x7f\xd8B\x14\x16jq\xcbU\x11`\xe3j\xaa\xae(|\xa1\xdf\x9bE\x17~\x9e\xce"Z{\x17\x8fc\xa4\x04<\t\x9e\xe7\x05\xfc\x03\xfc\xe5(\x8e\x1a_\xce\xf0x\xe2\xf8\x98\xffK5\x15\xf4\xac@\xc58?2\x16#L\xdf\x1c\'\x9a\x1d!\xd9\xaf\xed\x19(X\x8f\x18\nF\x16se\x05b7\xd0\xbc\x9a<\x13\xfb\xbb\xc0f\xf9T-S-\xfa\xd4\x0b\x0c\xba\xfd\xde/\x83\xd2;\xae\x7fn8\x03\x07L\xc1\xba4`m<\xd0\xf9\x16\\\xa2\xcd\xb5\x9d_\xfb\xea\xf2|\xc7\xaa\xc5\xb3\xae\x81>e\x19\xdc\n\x88,>)\x85\xb0\x89\xff\x82\xd5\xb7_\xc1_\x0b\x80{\xf6R\xe3\tut:\xdfip\xfc{b_]9\x0f\n\xa8\xf3m2B\xeeP\x08Y\xee\x92gk\x05\xe4\x14A\xf7\x088\x03\x94/\xbd\t\xb5\x86>\xb9\xb9\xd2\xe6H\xc7TN\x8b;\\=\x81x\xa2\x92dk\x9b\xa6UM3\xdbq\xcf\xcfS\xe5s\xc7\x1d\xf7\x1a\x82g\xd3\t\xc8\xa7\xcc\xdd\xc9\x06\t\xee\xcd\x059\xf9\xc0\xb6\x7f\x94\xf1{\x9bf\x84g\xaah\xd5\xbc\x9du\xa5\x90\x11yQ(I\xf0\xb44\x12M2+\xdeEU\xb3=\xdc\xb3=\x8ey\xc7\xdc#i\xecK\x94\x95\xae#H\xc1m\xcc(L^\xe0\\\xe9\n@\x18\xa9m\x08\xd2M\xac\x16\x1b\xf8\x00\xb7\x81Z\x7f\x92\x92\xb6\x00\x1f\x1d\xf5!V\x0e\xf8z\x06\xa7\x99\x81>\x8a\x93\x0c\xef\xc9\x85\xac\xa2!\x16\x9ab\xdcx\xffxA\xb6\xf4\x19\x10\xfe\xc6U\x12\xd3\x92.\x18\xb1=\xc9i"\xce\x14F\xb5t\x98\xc2KB\x8d\x17\xa3\x06~\'\x1c\x9b\xad\x1b&\xc5`\x82b\xa2by\xeb\xe4\x97_\xee\x85\xfa\xb1\xbb\xdc\xafOj\t\x9a*\x80\'I\xe0~\x16e\x87\xa1\x97s \xdd\x8d\n\xd8\x84\xdf\xf1\x04\xe6\x06\x8b\xa1@\xdd!mp\x1fX\xf9\xf0U7\x80\x9d\xaa\x08\x18\x17\x15{"\xeb\xfe;\x1f\xc5\rxJtM{^\x17,\x9b\xb3\xab2QrZ\x0b\xc5(\xdc\xb8\x11\xcb\x9c\x0e?\x9cB\x8df\xcaW\xb8\xebz\xec\xc5\xb0A0\x1f\xc3\x93\x9cZ*\r\x81\xd6\xce\xdd]gr0B\x14\x0e\n\xc1sW\x91\x14Pa-\xf8\x8f1gb\x0bz\xf1\xad\x083%\x93j\x18\xd8^yUX\x86oC\xd2\xfdq\x07\x14\xac\x1d\x89\xd3f\xe74\xab\x04\xfb\x8a\xf0Aa\xcb\x1eO\x16\xa9\x07^\xd3\x06d\x86\xaa\xaa\x89\x84\t\xdc\xefOv\x16+\x04\xb5@\x10\x00.\xc3\xdeZ\xd3\xb7=Z\xb4\xeaW`\x08\xf3\x886T\xd7^\xc2?(\x81\xc7\xc4-\xd2#\xe4\x16 \xe8?DwX/\xc9w,\x19\x0bs]\xa7\xaa\x8c\xb8\x8b\x84k\xa8\xc5\x19\x081\x92\xe5\xbfj\xadvs\xfd\xa6tO\xa1\x9fK/`\x1d\x9c \xab\x1a\xe3\xb2\xfe\x1d\xb2\xae\xd6\xf4\x14N\x07\t\x96\xd3NV=A\xfc\xb3:\xf44/\xac\xee\xf3\x0c\xf2\x05\xc4\xc7\xeb\x94\r\'V\xf9\xc5\xffK?\x92s\x03\xb8Q\xa3\xefs\xda\x03\x81\xdb\x98t=P\xcf\x98\xa0f\xf5{0\x90\xccM6\x87g\xec\x81\xfdFc\x9d\x1e\x0fH{\x91@\xfc\xf8\xd2\x90\x18Oc\x94\x02\xbc\xa4\xa5\xe3\xc0|\xc5\xed\x9b\x18\x14\xa0?\x8e\x10"Img+\xd1\xc7\r\x04\x11\xc0\xcb\xb6\xfe\xae\xd3\xdcJd\xccHv\xfd\xd4?\x1a\xf5.\xd2\xe5\xb7\x01&v\xce\xd5t\x963\xeeS\x068\xf1l\xb3\xc5m\'\x03\xda}h\x0c\xfe5"\xd2$\xaa\t\xb1\xca\'\x8e?\xee\xac\xb3\xe6\x81N\xd8a\x13\xe0b\xedy\x07\x9f\xf9\x1a\x12\xc4<4\x91\xb7\xbb#<\x13\xf2+\xeb\x88\xc9\xe2a\x91p\\\xff\x91\n_\x00\x0c]\x9684[\xf0\xfa,\xf6\x93\xe3\xe6\x84m\xf5\xa0\xfb\x8c\xc4\x10\xc1z\r\x1d\x12\x1aY\xe9X\x18f\xb7\xfaurJ\x0c\x9d&\xe7\xe3\x85\x82\x18\x157\x0ew\xbf\xb4vp\x18\xfc\xd1\xbd?\x0e\xc2\xcb\xc6Wd\x96\xb8<X\xccyy\x0bY\xf5\x9b\xdbg\x8c\x92Q\x93\xda4\xddw\xe3S\xcd8\x90\xaf\x8b\xfaX\xc6\xed\x91O\xcc\x82\xb1G\xe4o\xe2\xa88\x13h,\xcd\xc4{g\x87\xf7\xfe7\xe5/|q\xf1u:X\x93b\xdfIS\xcfT^\xb5,3\x93@%,\xafgF?\x92\x97\xdd\xd5\xd9\x98R\xe1\xf0+j\xc9\x8c\x99u\xde\x08\xc2\x045\xfd\xfbf\x82\x11\xa7$\x96(:\xc0#\x0e\x15\xbe\xfe\xe6\xe0\x95:>\x8c\x9b}\xc6u\x17\x80\x16%;CJ9\x82\xdc\xf0?\xae\xd0\x89\x82\xa2\x90\x92\x9b\x14K\xe7\xe0Q\x7f\xc0\x87D5\x06\xce\xb80VS\x98\x8aM4\x88\xdc\xf0\xbfh\xd4\xfd\xdd;\xe6U\x9e\xc8D\\\xa02\x90\x07z>\'\xbe\xf7\x00\xa8\xbdc9\xc8\x19\x95\x96\x9f\x08\x064\x91;\xb3\x12\x00\xbd\x8c\x81\xeb\xad\xf0\x91\xab\xa1\x1e\x1a\xcb\x9e\xa1\xba\x11`\x8f$w\xc7KN\x8f\xcd\xd7ewB\x8b\xf7G7w\xf2aO\x14\x07o{\xd2]\x1a\x89\x92\\!\xe3\xe5\x08\x0b\xd4\x9d\n>\x17\xee\xd6\xe1\xcf\xe7\x9c\x867\x16\xf77\x0e*\xaa\x840\xd6\xd0\xd5~!\x94dt"{+\x05\t\n\xc0\xeb\x96,\xe2\xde\xe1)\xedGJ\xfc\xfeN@Q\xfb\x02?\xdc\x1c)\x86p\xfc$\x90\xc6"<\xaf\x99\xf7\xf3b\xf7\x83H\xf9JY\xe6\x87\xf2\x97\xedG\xac\x9f\x84F\x91\x98\x9dH\x90q\xcf\xcf8\x0b\x82\xbf\x9b \xcc\xb1:\xf3\xe2\xdb\xec\xd5\x85\xe6)\x07\xdc\xb0_:z\xf1#\x18k\xf5\x84\xa9\x04\x86\x94\xaev\xfc,\xd47W\xee\xb2%+4\x18\x9c\xc2!\x87\x0eW\xf4]\xd7}p\x0fY\xbdc\xea\xbe\x0cf\xb3\x9a\x8fc\xbe\x8c\xb2\xfa\x8d1W\x17,%\\<\x077\xb6\x8f(\xac\xd13Z\x03\'\xaa\xe7\x91\xb4j\x1d\x03O\xc1\xc3i\xd0Y\xe7D!\xae\xb9=\x98^^\xe2\x9c\xe6\xdc\xec\xa5<\xd2\xb7}I\xa58\x98HY\xd7g#\xd9\xd3\x1d)S0Y\xa31\xbd\x18\x7f\x82\xa6\xac\x83\xb8]\r\x05\xb9\xae\x02\xab/\x86\xdb\xd8\xef|\x8d\x1a\x84\x861[\x10\xa0\x08\x00\x9d\x0f\x88+\x87%\xda\xa6\xa2\xd3\xf1\xa5\xed\x83\xc5\xbe\xf7\xa2M\xea\x1f\xdb&&f2i\x1cO\xbb\xcc\xa7q\x0f\x02\xb9d\xe9\xa3?[\xf5\xd8E\x85%\tm\xdeR8\xe4\xcb\xadn~\x07(\x021\x99w\xb1E\xcbQ\x19\x10\x12\xc4\x11e\xa5|\x9cl>\x0f\x07z<\x05\xe6\xbc\xac\x90}\xa4\xcf\xafn\x05\x19\xed\x88\xc4\x97r\xd7\xb64)\xc1\x00\xc4\xfcD\x0b\xc5\xf2\xd2\xa9\xac\xd2\xce\xcd\x82\x90\x9e"\xe2C\x9b\x12\xcc|J3\x8d9\x13\x07AO\xf4\xd2x\xec\xdc\x07\x14\x85\xe7\xba\x17\xec/[;\xe89\xa0\xc5\xb2*eO1\xcb\xba\xf0\xfc\xb1Z\xd9\xce\x99)\xd77\xab\x12\xdf\x7f1\xd4\xd4\x8a\xbf\xf1\xce{\x1f$\xbb\x80\xc4\x8c\xa3M\x1f\xab\x9c\xa2fOcL\x1d\x1c\x14\x8b\xd9\xc4\xe6[H\xec\xed0^!\x82\x91\xe1W+\xef\x00\xff?c4@\xf2\xbf7]\xec~\xccW\x1dm\xbe\x8b\xba6\xaf\xe9\x19u,\xd0:;r\xc0\x82\xa3\xfb\xce\x9b\xd0r\x9d\x1e\xf3\xadRF\xf0#\x15\xe78\xad\xcb4f\xa3& (^\x96L\xb0\x05*\xab\xbbb\xec\xabZ\xfd\xb5\xa0\x8c\x86:3\x02\xba\xfd\xe1\xeb\xb6\xeb\x97\xb9\xcc\xce6\x1f\xe6\xaf)ry\xc0G\xee\x82\xb9\xc3\xf0\xe6\x03\xa0\xa8G\x9d!\xda\xc6G\xe2\xb3\x1d\xd7\x87\xd2\xfb\x87hc\x02\n\x97\xcec\x9epD8\x1b\x1bc\x95Q\x92\x9b\xf0-\xed\xebN2\x11\xa7A\xd7\xa33\xc2\x14\nI\r\x10\xe3\xf8iT\x1e\x1e\x87\xed\x9e\xbdi;\xc7I!\x88\x08"+7\x8f=\xaa\x1a-\x03?\xf8H\xe8\xe2\x0b\xf5}(\x90 o\xae\x98\xab\x0b\xbe<2\xe2"\x96<\x8a\xa8\x89c\xb2\xb3\x06/*t\x86\xa1-%\x03\x04\xe8\xd8.\x99\xdf\xa8\xc09\xcfD\xb7/\xed]\x11O\x0b\xca\x0c\xcf\x80%\xa3u8\x83\x10\x1d\x07\xca\x8e0%O\x9c\x1a\n1\xb3\xb16?\xba\xf2\x8b=R4_,\xd7\x9a\x99\x91\xdf\xd3e]5\xfd\xb7 \xfb^\x1e,\x05\x9f\xc6=l\x1e\xc4\xbc\xed02\xf710\x91\x10\xde\xd0\xdb\'\x90\x116\xf0\xd5\xfd\x18\xf5\x0b\xc3\xffF\xe2{&\xfaP\xc3\x11\x84\x94\x0c\xf6\x98=\xb6/\xec1\xff,\xe9\xfc\x9f y\x8d@J\xc5[\x00\xde}E\x18<R-|\xf4\x1b=GH\xf5\x91a\xae1\xca<J@\xc0;v\xcem\xf4P\xe4J\x0b\x05>\x1a\xe3v\x96\xd0\x9b+\xc5\xbeADx\x89\xc9\xc4\xda\xa7\xc5r\x01n\xcdS\xbc\xa9x\x1e\x97\xc8\xd3 &\xc7\xeah\xe7P\xff\xdf\xe7U\xa2\xc8\x06|-8\xb6\x10e4&\xef\xb2\x92\xf5\xfdy\xfa\xa0Tq|\x88y{\xa2\xd4\xd7oQU(mT\xa8\xc2]xr-\xd4u%\xccHs\xeaS\x94\xe1\x17\x0b^X\xe4\xd4\xbas\xae\xadH\r\x99\xbb~\xc4u\x8d_3\xdc\xd2\x9c>\xc1L4 \xf5\xb6[\x07\x88(\x973\x11\xe2y\x91\x85\xcc0s[\x1f\x9a\xd5\xbe\xbd\xe1w\x9d\x01\x13\x81\xf1\xfe\x87\xbbI;\x18\xf4\x9f7\xebUP\x81\x89$\xff=c|\xd4Y\xec\x0c\x8c6\xa0\xd5\'\x0c\xa2\xcbL!;\xda\x14\x9f\x85\x8e\xb8\x16\xfe\xc2\'P\x08!)S6\x90\xc1\xaa}R<\x18Hf\xac\xe4\x02V\xbb}%\x94\xebp\x86\x9c\xe1\xc88Oa{\xa1h\xad\xd8@Y]\x13Pl8\r8\xd2\xe8\xe1C\xd8\xdc\xf2\x80y\x16\x7f\xfdB\x94\xdeeL\x90C\x0ev\x9b\xd81{z8\xafq\xba\xc2\x9b\x9f\xe2\n)\xad\x9f]["\xf3Z\xb4\xde\xc5\x9c\x08\x1b\xa9/?h\x1b\xdf\xb5t5H+\xbe\xc0i\x95e\xfd\xdb\x8d\xbf\x7f\x1d\xef.p\xd9zu\xd0\xbd8\x0c8l8\xe0\xa5[\xa1\xeby\xc3/\xc0\xfb1B\xefC{\xf7\xe0V\x17u\xd6DUh]@\xebk\xf8\x8f\xe1E\xfd\xe8\xcf\x06\xd19a\x07\xf0\xcaz.\xa6%t)Z\x9e\x89\x9fJ\xb5N%L\xfc72\xb5\xd8\xbdq\rY\x91}\x8a\t%\x8aN\xceT|\xf3\\\xf0~\xa63\xd2\xb4\x8f\xe2A\xecH\xcb\x98\xb7\x03\xca\x87\xcb\xa5\xba\x9da\xe9m(\xbb\x03\xa6\xb1\xff\xf0\x13\x0c\xf0\xe0\xb4M\x06\x94\xe6\xf6l\x15\x8f\x18\x1f\x98\xb5*\x0b\x85(\x1f\x05\xd3\x19(-|\x86\xe8\xff\xdf\xeb\xed}.\x1a5\x07F\x04$j\xe6\xb9\xb1\xb8o}\xb3\x0e$\xf7z\xab\xd6(`\xad\xb1mA\x84ES4\xd2\x90\xca\xca\x00\x086\xaa\xefb\xa6\xdbf\xbd\xb9\xdd\xe5\xc5\x16\xf9\x90\xb3a\x9ff\x90z\xf1\xfb\xdc\x9cm\x1f\xd1\x88NU\x9aF\xe8\xedy\x84\xe9 \xd1S\xd1\xbe+~y*\xed\xb7\xf6\x14\xc9\xa7^[u\x1d \xa2\x9a:c)t\x10\x978\xb7\xfd\x8c\xb2C\x02\xa1\x92\xe4\xdckdS\xa6\xadS[ff\xff\x97A\xa2\x19\x80QX\xdc)\xf2\x9c\xa0\x0e\xc9e\x1a\x86\xc9`\x14\xd7\x99\xe4\xda\x94\x96\x87\xfa\x05i\x17\x1b\xf7@M8\xdaI\\\xf7C\xc3N_\x91\xb2y\x02\xbeF\nHKw\xb5\xf7*mHb@\xcbM\x7f\xc1i\x88\x84^\x12\x95#\xdb\xdd\xd0b\xc4\x8b+n"\x15\xb96\xd3\x11\x99\x94\xb79HI\r\xf3\xff\x9f^\x1d\t\xff\xb7y\xb8[\x9d\x7f\xe7\xa5\xcf`\xd0N!\xfd\xb81\xf0\x01\xc6u\xbda \nLU\x1f\xd6\xbehYn\xd1\x03L\t\xd8\xf9\x03\xbd\x96\xcf\x93\xc8\x880\xcc\xc3\xa6\x08l\xf98j\xbaQ6\xa5\xd1;$/\x1a\xf8\xd5P\xa6\x15\xaeWkPjFDJF\x88wm\x0c6b\xd5\x07\xfeI\xc4\x90\xed\xbd\xc9t\x03\xbc\xf8+<Z\xbb\xd4\x9ekPvh\xa3o\xe8\xdf\x1b9\xbe\xaf*R\x03\xad(\x81\x8d}+w\x02\xa9 \xd9K\x7f\xcc\xc5\x8a\xd2yCU\xe8\xc8\x13E\xb9\x85\x04\xa7\x03\xe9\x13\xcbk\x80o\rF-W\xb6j\xb5~Nj\xeb\xd3\x96\xc7\xf5\x05\xca6\xb7\x18\xe3M\x0c\xccGW\xcf\xd3\xd4\x06s\x15\x059\x02\x8d\x05p\xd6\xf7\xa4\x8eK\xdf\xfc\x96n\x01\xaa\xfd\x9c\xbe:\xce\x8e\xb5\xa8\xdbx\x8b\xd9<\x9eR\xf5\x9b=\x01\x9e#\xad\x0e\x1f\xcb\x0ft\xcb\x05_j\xc6u\xd3\xa3E)\x05\xc7\xaf\xa0\x01\xcb\\\x1d\x9f\x8b\xb73\xa4\x93\xc2\xf3|\xb6q!\xdcOcU{q_\xe1\x06Z\xc3\xbdiY\xa7\xbc\xe7\xb2\xa7?O\xe6\xa5\x93\x16)\x05\xb8$\xdaz\x03p\x83]y\x9bK\xde\xdbT\xbf\xce\xc3=\xdf\x0e\xb0\x04\xc7\xc9\xd4\xe6\xca\xe2\xd5\xe3Z\xce\x81\xb8\xd4p\x86\x17\x89\xc3\x12\xf3z\xa4\xa8%\xa7:Z>\xfd\xe50\xbf\x1e\xd4X\x0cJl\xf0\xeb\x9c\x8c\x88\xd7\xd0\xa6?b\xfc\xc7\x0b\xc1g\x8fKh\xcao\xd6K\xa9O9\xfa \x85\xd0MZn\x85\xbeD\xaa"\xa9\xa2\xe2\x00,f\xd8C\x0cq\x14%\x96zp\xac\xe0\x11O-\xe9C\x00\x11t\x9fm\x8c\x93\x87\x0e\'\xf4QEb\x94\xacg\t\xd5s\xf5\x18\xf8\xfc\x1e/\xe1\xdb{\xe7\x8d\x8bZ\xb6\x93\x83M\xf7\x93h\xa1]\x16\x839\xb7CS[\xf8R\x18\xb1\xe2F\x7f\xec\xde\xa6\x03\x92|\xd5\xed\xf4,\xff-P \x89~\xfe\x8ay\xe2\x1f\x08`\x04\x9ceh9gh\xc7\xcb\x04\xa1\x08s\xa8>\xd5UB`\xf8AR\xa9\xa2\xf4R\x91\xa4\xfa\x92\xe4rE\xad\xe0\x1c\xbc\x0fs\xceA\xe30\xd2[\x0eY\xb9\x98J\x80\xb1_\xdd?\x8c\x1b\x8f\xf6>}\xf3\xa4\x04\x80\x12\xc2\x8b\xb6[B \xee^\x11Z\xa6P\xdb\x02D\xbd\x13Re\xbb\xcf\xc8\xe5\x98I\xe0\xac{\x89\xfe\xd9FxKm\xcd\xb5\x8f\x9b\xab\xd9\x98\xc4zL\xaa\x9f_m\xf4\x97\xd7\xde\xcf\xe9\xd2\xa9\x93\xa1\x16\t\x88%]"\x84\xa0`z\xcb\r[W|\xcc\xeex|X\xd6\xeb\x92+\xa1\xa4 \xab\x12\xf3\x15\\\xd2\x89\xbdmZ\x97I\xa5\xf2\xd0\x1e\x9eV_\xf5\xb0c\xccY\xa2\xdb\xb8\x18\xcc-\xcf\x881\x8e\xcaP\xe7i#\x9a_Cts:\xb0!\xc5\xcdw\xb1\x10\xab\xac\x81\xe8\xf2_\xe5\xc2\x9a\xd5\x7f.[\xfel\x1a\xdc\xb2\xe9\x00 \\K\xad`*\xdbK\x9e}\xe2\xa7W\xab\xda\xf9\xaa\x99W\xf2j\xfb\x1a\xb2\xcdDe\x01+\xe7YuI\x06\xc9\xd4r\xef\xd1g\t)\x86\xa2\x87\xfe\r\xb7\xbd\x9cy\x89\xa9\xdb\xa5g\xf3ZpKJ\x82\xbe6\x1ebUj\xdaw\r\xf7Cj-\xd9EL\xa0\x88\xfc\x17[e~c\x93\x96f\x03\xe9(y\x04>\x1b\xce\xa6\xb2\xc6hV\xb021\xe2; z\xe1\xe5o\x93\xb9\xb2`\xee\xa9c\x18\xc5\xe3\xb0\x07\x7f\x15\x86$4\xfb\x8e\\\xa4\x92\xe8\x9f9g\xaf)\xf5K\'\x8b\xb7\xb6\x06|w`\xafG\x96R\x0es5\x1f\xb38I\xearmyian\x8f\x0f\xdd\xf8\x03\xec\x13\x8c\xd5\xe6^\x1dx\xb9\xe2J>\x9f\x0c\xe9o\x0eh\xea\xe7t\xfb\xf1\xc2S-\xe99^n\xbb0\xb9\x04\xbf_\xf9\xad\xcf+\xac\x01p\xad\x08\x94\x17\xc5\xb1+\xb2b\xeagY\x9el\x81\xd7\xc7YK\x82\xf4\xf4Ax\xd4\xbf\x9aa\xad\x82\t\xb8F\x0f\x8a\x94\xde\x04\\\xdb03j\xdb\xcew\xf6\xd4?\xfd\xf7\xfa\xf7\xa6\x13h\x89\xf9\x99\xeb\xbf=X\xb7o\x0bc\xb8&\x8e\x83F\xdd^K\xcc\xd4\x9f\x90w\xc5t\x83\xfcaZzj#\xe7/!\x97\x0b\xf7\xcew\x7f\xd4i\xf6C\xc3\x8d\xa7\xe89\xb7\\\xac(\xf2\x02\xe3\xf7D\xdb\xcb\x98+\x8dO\x19\x93\x93\xdb\xd4\x99/\xfc\xa2\x15h\xd7\xa2\xb6iV\xfb\xaf\xe3\xfax\xc6Y\xe1\xe3\xe0\x11\xed@\xe8\xd8\x1e4\x1a\xd2\t\xe6E\x9f\xa0\xd6\x16\xe74q\xeb\xdf\x10\x90\x99-\xcbV\xcc\x0e\x96?c\xa9L9\xc5!\xc0\x00\x15]\xd5v\xce0,\t\xfc\x84\x91\xa3\xb7\xd5\xe1\x0b\x88\xd74\xa2\xc7\xfe\x8e\x19\x95\x83\xa0\x8f(P\xaa\x92\x08\xfd|[\x96\x9c\xd9\xb6\x82o\xe6?H\xdf\x1b\x97\x98\x10z\xda\xcf\x10\x9dow\xe3\xe8\xe5yQ?\x90\xee\x15\xca\x18\x0cii\xd2`\x98\x0b\x02\xc6\x89 5\x7f"\xc1\x8f\n\xa1\x90\xb9\xcc\xf8\xf3\x9b\xb3\xc7N\\\x9f\xcd\xf1\t[\x83W-\xd3\x9f\x12\x8e4\xc0\xf5\xa8\x97\xfb\xee\x15)\xcf\xfc\xd6\x11\xb5iZ#?\x7f^\x135\xf7\x8a\xc8\xaf\xdb\xeb`\x85\xae\xe4\x86\x1bf\x05\x84\x17\xca@\x95\xda\xbb\n\x19\x15k\x9f\x85\xd7\x9fo\x9akH\x92\xea2\xc8)\x0ep\xbc\xeb\xd3(F\xd3\xaa+ x\r\xce\xdc\x86\x0e\xbb \xd9\xb2\xa71"\x84.\xcdGF\xcbue\x1c\xc1\xae>\x18\x0c\xaf\xe5\xe49$\x97\x99K\xe9\x1a\xb3\xe6\xd54\x15(U;m\xde\n\xa4s\xca\x95\x13\x82_\xf8\x1d\xb4\x92\xff\xe9\xcaK\x94\xfe8YYv\xd8m\x11\xdb&\x95T\xddBB\xe52\xb8\xe5eZv\x9duq\xd7\xde\x0c\xcf\xdc!\x81\xdbr\x7fm\xb5\x8b\x01\xc5\xdaw\\\xfboB8\x10"\x06\xb6\x91\xb7\xd9-Id(\x16t*\xb9\xfe\x9ds\xb8\xd4l\xc6iD\xef\xd5g\xd7\x9e\xb0\x9d\xfaW\x8d\xddA$\xba\xed\x11\x8d;\xc4r\xa7\x8c.r\x89 k&ns\x0bY\xe9\t<\x02ia\xea\x8f\xca\x19\x12\xbc\xc2d\x92\xb2\x90\x9cB$\x9c\xfb\x03\xd7\xcd\x9f\x83\x0c\x88\x8e\xf0\xc2\xc4\x01\xbdj\xa7\xf6\xa6\xf6V\xbbR\xbf.\x158\xbe\x12x\xef8\xc8\xc1\xc3\xde\xb4f\x91\xab\x1f\xd8\xb0Va\x0b/\x12q\xe4\x81\xa6`\xaa\x08\x7f\x9d5n\xc20\xbb\x05\xca?&\tKFJ\x83c\xf8Y\x14A|\xb3V\xb3 \xb4>V\xd4\xa1\x8c\xac\xd3\xd8\xa7\xd3\x9f\xb0\x0e0\xfd0,\x1e\x7f\xf2e\xc0M\xbb\'\xd6\x12\x82^"\xd1\xad\x95\x13sc\xa7\xaa\x96\xe9\x9beP\xa9\x9dY\xf4\x84\xa8!~\x8e\x03]\xed\xc1lo\x87%\xfe\x15ct\x9f\x8c\xe0\xaa\xcf\xaf\xdc\xfcM\xc5\xbeY*\x94\xd6\xa2\xa0\x0f\x03\x15\xfa\x1bpv\xbd\xde\xb6\xf5\xc1Y\x07O\xa2\x1c\xa5a\n\x0f\xd2\xadO\xe0\xad\xfe\xc7<\xc4\xd0\xd2\x07`G\xeeM\x1eML \x03\x80\x8a\xe5\xc0\x95b\x01\x92*\x08\x8b\xb3t}s\x87\xd9g|\x10\x8c\x1a\'\x830\x80\xe0\xf3ql\xf0\xe3A\x88\x92\x91\xf1B-\x05\xa9\xc0\x94\xe1\xda\xeex\xf4\xa2{H\xf03\\"C\x94\xe9g\x88\x9c\xe5\xd1\x13\xf49\xc6l\xd7b\xa1\x18\x04\x9c\xd6\x96B\x9a5\xd4\x96v\x86\xb0\x86\x1e\xa8s\xd7\x8f,EK\xa6L\xa6\xb8\x19\xbcW\xfe\xc4\xdce\xcbj\xb0\x00K\xcd\x86\t$u\xf9\xf3k5\x10\xe2?\x9dnp$\xa0\x93\xbe\xe6}\xab\x82\xab\xcf\xa4\x02p\xef\xa0j4$\x12S\xd9\x1a\x02 \xa9\x15\xb2\xd3\xfcX\xb0\x00\xea\xbb\xb1\xba\x9a\x91\xf25Eb*:"{\xdb\x88\x9e\xeb=\xf0\x88\x95\xd4\xc0l\xa6\x99O\xb1\xdbO\x8a(\xdb\x8d\xae,\xfe\xb0V\xb6\xa2g\xea\xdd\xb0\x88\xd6/\x96<\x16\x02!\x07\x86\x9f\xb7\x17\xc2^\xb2|\x96\x93\xc8p*\x83L;\x17\xd7\xd9\xdc\x03\\\x18a\xbc\x17x\x15\xe2i\x15\xc8A\xa6\xc1\x03\xee7\xe6\xa6\x08\xba\xaa\xbb\xf1"\xe1E;\xca\x05\xa0}\xcf&\x06\xbb\xb1V\x1d\xb4\xe4d\xee\xb9\x86\xccQ\xe9\xeb\xfb\x8cV2O\x7f\xfe\xea\xfd{\xa4\xf0e\xc4\xd07\xb2\xb2/\x8b\xd7"\xa9\x1d8\x1f\xf9dxG\'\xe6n]\xa0\x9c[{\x87\xf5[\x1c\\a\xb3\x8ep\xf9\xf3\x18\xc7\xa0\x85\xd9\xbc\xcf\x99\xb2E\xeeO\xcc&\x84X\xe7nn5\xf0\xb8=\x93\x97\x14\x0ba\xf0lYW\xa2\xd7H\xdd*\xb4w\xea*b\xdd\xf4\x9d\xbbPb\xdcH\x04\xbf\xfb[\x90*\xbf\xd1r\xef\xf5\xef\x90\x8d\xdc\x056^\x87t\x80\x10\xa2\x1a\x18E}\xc6\xd2\xa2\xfc\x8b\x18\xf6\xd5\xf76\xd7)\x9a\xbb\xc9\x9c\xaeHT\x82\x95\xba\xa3\xcf\x03X\xbc\xa1\x87q\xbf\xaf[\xd4\xe4@\\\xb7\xafH;0\x99\xaa*\x07\x17\xb3\xcb\x98\xf4\'Bai\xb0@f\xb6\xad\xe9\x0cS.\xedtv\xd1\xac\x96y\xe4\xc8\xc6c]\x17x\x01_\x0cBR\x93\xa5zr\xc7\x0f\xe8\x8d\xb4\xd5\x04f\xb3\x9b\x01Y\xe4\x9c(\x04t#q\xdbS\xe6\xbb\x96\xa0\xed\x82\xcb\x9cl\xc8\x84\x1aS\xcb\xd5C\xbd\x89\xeb\x98\xc2\xc58\xd3[\xbb\xb8\x01\xc5\x94\x1dRM8\xd7y\xc0]\xe0O&1\x16\xa5\x9fI\xc0\xf6\xb3\x0f\xdbv\x8e,\xebl\xb1T\xdd<\xbcv\x97\xcf\xd7\xd1\xd7o\xb0Nb\x0fK\xe02\xeb\xd7%d\xc2\x87\xf5"\xcf\xc0\xf8\xc3\x16\x97\xfe\x9b\x18\x0f\x98\xb6(m\xcb\xbb\x0c9\xdd\xe9\xe2*0\xf4\xa6\x9cK\xc2\xf7\x12\xcd\x03\x10\x7f\xb8)V\x1c\xdd~\x83}\xb2\xbaQ\x06\xd4\x85Y\x80\xdd\xab\xea\x10\xdaM\xf2NJ\\#\xf8\xefh\x91\x06\x1d*\xf9\nAg\x05z\x91\xc9V\xba\xe6\x00\xa7\x83\x1c\xbeIvq-|\xceC\x8d7\xe8\xee\xca\x87\xc3\xc5\xad\xa8\xdb\xba\xe9\xd4\x9f6%T\xd3`\x02\xc9\xf4\xbd\xce\xe8t\xf4\xdc\xdc;@E\x81\xc8\xefw\xe6\x88C\x8b\x9c\xe2b\x9f"\x1c\xaf\xff\xa5\xe3\xbc\xc9\xfe\xc0\xbd\x1e\x89S\xdc\xbc\x1dO4\xe4O\x05M\xf9,d\xf2{\x86\xee\x83\xaf\x01\xb3\xfd\xaa\xdb2<LL%X\x1c\xe9C\xf48:\xcf#c\xd0\'\xddX&\xf0\xc5\x9e\xa9k)\x07b\x8e\x15\xce\x12oh\x85\x93.\xb8\x81T\xcev9\x124\xa2\xf5f\xbb\xafs\xb5\xa1T\x92%YX\xd5\x7fi\xfd\x84\x0e\xd6^?/\xc9\x9e,\xe0RMo1\xd1-\xfa\x97\x17\xfa\xd5n}\xbc+\xdc;V\xe1<\xac3M\x12\xec\x0fM\xa1\x9a\x8eJ\xa8(m\\\xec\xbb\x00\xf2\xb6\x16\xfeb5\xe8J\x1e\xecS:\xc5\xaa\x06\xb8\xcd5\xa98\xa8\x90\xc7u\x8e\x9d\xee\xbf7\x14S\xcb\x1e\x07\x93\t\x94R\x08_\xd7\x0e\x1b\x8f\xe9\xb9\xb7\xb8\xa7#\xe3k<\xf0\x12oj\xa2\xe4\x11uL\xf12|\x1f\xdb=#\xaecR\xf9P\xd3\xb6\xbf\x98\xe1\xf5\x8d\x8fZ\x96Ca\x02\x91\x0e\x97\x1f\x94%\xeeO\x1c\xa7\x94 =\x1d\x1e\x85j8\xe7\xdbR\xe8\x96\xc3R\x8d\x1c\xc8c\x04\xaa\x13\x84\xae4\x8c\xde\xc8q\x06z\xe4\xd8y\x0f\xdc]lp\xd9|\x8e?\xb3\x944\xfe\x0cq\xb43B\xca\x0f\x88\x1d\'\xd9\n\x14\xdf&\xf2\\\xe0\xea\xaf\xf7HC\x08\xa3\xa2FKJ\xbc,\x94\xca\xd9\x07\'u<\xaf\x86\x98.\xbc6\xed>\xbc\x81}\x9b\xcc\r0gI*\xb9\xc2E\x9b\xec\xfd\xdfY.\xbc\xc54\xf8V8^z\x1fd~v\x84j\x87\x11\x0c\xf9\x91L\x80cT\xdb\x9b3\x87\x93Pm\xc1w)\xb0\xc7\xda\x0f\x94Zi\xdb\xcb\x12\xa5\xb7\xfe\xea\x12\x15\xab\x00\xb8\xb3a\x96\x8a\x14\xbf\xb5\x8e\xb7U}/\xd0\xc40{\n\x02\xb8\x8b\xd9\xf7\x18\xc8\x94)\x95\x08qI\xcb\xc9b\xb3\xb9zO.\x0f\xda6\x8d\xf9\x0e.\xe4\x7f\x94\xe9\ro\xd902\x8a\xc8Pr\xe4*\xf5\xbf3\x0c\xd8\x0c\x04\x9c_\xc0d\x1d}R\x85\x95\x82\xe9+ 2R\xd5\x9c\x02\x92\x1d\xcb\xff&\xd1K\x8d/\xaf\t\xff\x12\xc1j"\x0b\xa9K<k\xd2\x92\xaap\xd0\xa4\xd1\x7f\x9dM\x1b\xf1\xfbX\x1e-\xa1\x94\xa9y\xa0\x90t\xb9f\x91\x8e8P\xf1GX\x00\x90-\xa2J\x91\xa7\x0e\x7f\xa2\xb2\x9eX\xf5\x96\x8f<q\xbb\xe0\x9dz\x99\xd6\xe7Y\xf3\xdbl\x19\x0c\xa3\xb8i\x1b\xd0\x85\x17\xca\xf7X*\x83:)\x0e;w\x0f\x97\xaa\x00\x9d0\xb3\x8cc\x0e\x93\x19+\x94\xb8\x9d\xe8\x8ae\x15\x013\x17\xd0MwM\x0b.e\x8a\x14\x9aG\x9c\x87\xeb\xc7\xe4\x0b\xb6?\x8e\x17\xd7\xf5\xf6\xd1\xd7\xa9\xe3Rsir\xe0\xe1F\xa5&\xfe\xb3\x9c\x86\xfeI\xc1\x82*\x9e"\xf1\xe3\xe8\x03/8VZ8\xe9\xbb\xd9?\xc5\xef0X\xfb\x0cMV4\xa6\x01\xd2\xe8\xe7\xa7F\x03zO\xe9\xba\xcb\x04(q\xef\xcf\xdd\'b\xce\x10|\xean\xc8\xe6me\'\x06LH\x83Z\xb8O\x85\xdba\x11A\x0bc\xd1\xcd\xe5f\x8cHl#\x01\xe9\xadM\x13\xd8\xe7\x0b\xf6!I\xde\xa4\xb3\x17\xf9\x9d\x9fQ\xeb\xf5\x84\x18_\xc9db. \xe9=\xbf<P\x02\xdet\xe9\xa7\xf0\xdb\xab3B\xc0\x18h\xeb\xe0\xfd\xcd\x0e\x87\xe6\xee\xe0(\xd0\x1d60\xcfl\xf1rJ}\x95\x1e\x12\x80dr\x9a\xac\x9a\xaf\x8e\x8ea\x9f')
4
- #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
1
+ from sqlalchemy_serializer import SerializerMixin
2
+ from flask import Flask
3
+ from flask_sqlalchemy import SQLAlchemy
4
+ from flask_admin import Admin
5
+ from flask_admin.contrib.sqla import ModelView
6
+ from wtforms import SelectMultipleField
7
+
8
+ from sqlalchemy.orm import backref
9
+
10
+ from flask import Markup
11
+ from dateutil import relativedelta
12
+ from hiddifypanel.panel.database import db
13
+ import enum
14
+ import datetime
15
+ import uuid as uuid_mod
16
+ from enum import auto
17
+ from strenum import StrEnum
18
+
19
+ class ConfigCategory(StrEnum):
20
+ admin=auto()
21
+ branding=auto()
22
+ general=auto()
23
+ proxies=auto()
24
+ domain_fronting=auto()
25
+ telegram=auto()
26
+ http=auto()
27
+ tls=auto()
28
+ ssfaketls=auto()
29
+ shadowtls=auto()
30
+ tuic=auto()
31
+ ssr=auto()
32
+ kcp=auto()
33
+ hidden=auto()
34
+ advanced=auto()
35
+ too_advanced=auto()
36
+
37
+ class ConfigEnum(StrEnum):
38
+ cloudflare=auto()
39
+ license=auto()
40
+ country=auto()
41
+ package_mode=auto()
42
+ utls=auto()
43
+ telegram_bot_token=auto()
44
+ is_parent=auto()
45
+ parent_panel=auto()
46
+ unique_id=auto()
47
+ last_hash=auto()
48
+ cdn_forced_host=auto() # removed
49
+ lang = auto()
50
+ admin_lang = auto()
51
+ admin_secret = auto()
52
+ tls_ports = auto()
53
+ http_ports = auto()
54
+ kcp_ports = auto()
55
+ kcp_enable = auto()
56
+ decoy_domain = auto()
57
+ proxy_path = auto()
58
+ firewall = auto()
59
+ netdata = auto()
60
+ http_proxy_enable = auto()
61
+ block_iran_sites = auto()
62
+ allow_invalid_sni = auto()
63
+ auto_update = auto()
64
+ speed_test = auto()
65
+ only_ipv4 = auto()
66
+
67
+ shared_secret = auto()
68
+
69
+ telegram_enable = auto()
70
+ # telegram_secret=auto()
71
+ telegram_adtag = auto()
72
+ telegram_lib = auto()
73
+ telegram_fakedomain = auto()
74
+
75
+ v2ray_enable = auto()
76
+ torrent_block = auto()
77
+
78
+ ssfaketls_enable = auto()
79
+ # ssfaketls_secret="ssfaketls_secret"
80
+ ssfaketls_fakedomain = auto()
81
+
82
+ shadowtls_enable = auto()
83
+ # shadowtls_secret=auto()
84
+ shadowtls_fakedomain = auto()
85
+
86
+ tuic_enable = auto()
87
+ tuic_port = auto()
88
+
89
+ ssr_enable = auto()
90
+ # ssr_secret="ssr_secret"
91
+ ssr_fakedomain = auto()
92
+
93
+ vmess_enable = auto()
94
+ domain_fronting_domain = auto()
95
+ domain_fronting_http_enable = auto()
96
+ domain_fronting_tls_enable = auto()
97
+
98
+ db_version = auto()
99
+
100
+ branding_title=auto()
101
+ branding_site=auto()
102
+ branding_freetext=auto()
103
+ not_found=auto()
104
+ path_vmess=auto()
105
+ path_vless=auto()
106
+ path_trojan=auto()
107
+ path_v2ray=auto()#deprecated
108
+ path_ss=auto()
109
+
110
+ path_ws=auto()
111
+ path_tcp=auto()
112
+ path_grpc=auto()
113
+
114
+ # cdn_forced_host=auto()
115
+ @classmethod
116
+ def _missing_(cls, value):
117
+ return cls.not_found #"key not found"
118
+ def info(self):
119
+ map = {
120
+ self.lang: {'category': ConfigCategory.branding,'show_in_parent':True, 'commercial':True},
121
+ self.admin_lang: {'category': ConfigCategory.admin,'show_in_parent':True,'commercial':True},
122
+ self.cloudflare:{'category': ConfigCategory.advanced , 'commercial':True},
123
+ self.license:{'category': ConfigCategory.hidden, 'commercial':True},
124
+ self.proxy_path: {'category': ConfigCategory.too_advanced,'apply_mode':'apply','show_in_parent':True},
125
+ self.path_vmess:{'category': ConfigCategory.too_advanced},
126
+ self.path_vless:{'category': ConfigCategory.too_advanced},
127
+ self.path_trojan:{'category': ConfigCategory.too_advanced},
128
+ self.path_ss:{'category': ConfigCategory.hidden},
129
+ self.path_tcp:{'category': ConfigCategory.too_advanced},
130
+ self.path_ws:{'category': ConfigCategory.too_advanced},
131
+ self.path_grpc:{'category': ConfigCategory.too_advanced},
132
+ self.path_v2ray:{'category': ConfigCategory.hidden},
133
+ self.last_hash:{'category': ConfigCategory.hidden},
134
+
135
+ self.utls: {'category': ConfigCategory.advanced,'commercial':True},
136
+ self.package_mode: {'category': ConfigCategory.advanced,'show_in_parent':True,'commercial':True},
137
+ self.telegram_bot_token: {'category': ConfigCategory.advanced,'show_in_parent':True,'commercial':True},
138
+ self.is_parent:{'category': ConfigCategory.hidden,'type':bool},
139
+ self.parent_panel:{'category': ConfigCategory.hidden, 'commercial':True},
140
+ self.unique_id:{'category': ConfigCategory.hidden,},
141
+ self.cdn_forced_host:{'category': ConfigCategory.hidden,},
142
+ self.branding_title:{'category': ConfigCategory.branding,'show_in_parent':True,'commercial':True},
143
+ self.branding_site:{'category': ConfigCategory.branding,'show_in_parent':True,'commercial':True},
144
+ self.branding_freetext:{'category': ConfigCategory.branding,'show_in_parent':True,'commercial':True},
145
+ self.not_found:{'category': ConfigCategory.hidden},
146
+ self.admin_secret: {'category': ConfigCategory.admin,'show_in_parent':True,'commercial':True},
147
+
148
+ self.tls_ports: {'category': ConfigCategory.tls,'apply_mode':'apply'},#tls
149
+ self.http_ports: {'category': ConfigCategory.http,'apply_mode':'apply'},#http
150
+ self.kcp_ports: {'category': ConfigCategory.hidden,'apply_mode':'apply'},
151
+ self.kcp_enable: {'category': ConfigCategory.hidden,'type':bool,'apply_mode':'apply'},
152
+ self.decoy_domain: {'category': ConfigCategory.general,'apply_mode':'apply'},
153
+ self.country: {'category': ConfigCategory.general,'apply_mode':'restart'},
154
+ self.firewall: {'category': ConfigCategory.general,'type':bool,'apply_mode':'apply'},
155
+ self.netdata: {'category': ConfigCategory.hidden,'type':bool,'apply_mode':'apply'},
156
+ self.http_proxy_enable: {'category': ConfigCategory.http,'type':bool},
157
+ self.block_iran_sites: {'category': ConfigCategory.proxies,'type':bool,'apply_mode':'apply'},
158
+ self.allow_invalid_sni: {'category': ConfigCategory.tls,'type':bool,'apply_mode':'apply'},
159
+ self.auto_update: {'category': ConfigCategory.general,'type':bool,'apply_mode':'apply','show_in_parent':True},
160
+ self.speed_test: {'category': ConfigCategory.general,'type':bool,'apply_mode':'apply'},
161
+ self.only_ipv4: {'category': ConfigCategory.general,'type':bool,'apply_mode':'apply'},
162
+ self.torrent_block: {'category': ConfigCategory.general,'type':bool,'apply_mode':'apply'},
163
+
164
+ self.shared_secret: {'category': ConfigCategory.proxies,'apply_mode':'apply'},
165
+
166
+ self.telegram_enable: {'category': ConfigCategory.telegram,'type':bool,'apply_mode':'apply'},
167
+ # telegram_secret:{'category':'general'},
168
+ self.telegram_adtag: {'category': ConfigCategory.telegram,'apply_mode':'apply'},
169
+ self.telegram_fakedomain: {'category': ConfigCategory.telegram,'apply_mode':'apply'},
170
+ self.telegram_lib: {'category': ConfigCategory.telegram,'apply_mode':'reinstall'},
171
+
172
+ self.v2ray_enable: {'category': ConfigCategory.proxies,'type':bool,'apply_mode':'apply'},
173
+
174
+ self.ssfaketls_enable: {'category': ConfigCategory.ssfaketls,'type':bool,'apply_mode':'apply'},
175
+ # ssfaketls_secret:{'category':'ssfaketls'},
176
+ self.ssfaketls_fakedomain: {'category': ConfigCategory.ssfaketls,'apply_mode':'apply'},
177
+
178
+ self.shadowtls_enable: {'category': ConfigCategory.shadowtls,'type':bool,'apply_mode':'apply'},
179
+ # shadowtls_secret:{'category':'shadowtls'},
180
+ self.shadowtls_fakedomain: {'category': ConfigCategory.shadowtls,'apply_mode':'apply'},
181
+
182
+ self.tuic_enable: {'category': ConfigCategory.hidden,'type':bool,'apply_mode':'apply'},
183
+ self.tuic_port: {'category': ConfigCategory.hidden,'apply_mode':'apply'},
184
+
185
+ self.ssr_enable: {'category': ConfigCategory.hidden,'type':bool,'apply_mode':'apply'},
186
+ # ssr_secret:{'category':'ssr'},
187
+ self.ssr_fakedomain: {'category': ConfigCategory.hidden,'apply_mode':'apply'},
188
+
189
+ self.vmess_enable: {'category': ConfigCategory.proxies,'type':bool},
190
+ self.domain_fronting_domain: {'category': ConfigCategory.domain_fronting},
191
+ self.domain_fronting_http_enable: {'category': ConfigCategory.hidden,'type':bool},
192
+ self.domain_fronting_tls_enable: {'category': ConfigCategory.domain_fronting,'type':bool},
193
+
194
+ self.db_version: {'category': ConfigCategory.hidden},
195
+ }
196
+ return map[self]
197
+ def commercial(self):
198
+ # print(self,self.info().get('commercial',False))
199
+ return self.info().get('commercial',False)
200
+ def category(self):
201
+ return self.info()['category']
202
+ def type(self):
203
+ return self.info().get('type',str)
204
+ def apply_mode(self):
205
+ return self.info().get('apply_mode','')
206
+ def show_in_parent(self):
207
+ return self.info().get('show_in_parent', False)#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
208
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -1,5 +1,107 @@
1
- # 2023-04-08T16:23:20.283325
2
- from pyarmor_runtime_000000 import __pyarmor__
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\xfd\x19\x00\x00\x12\t\x04\x006t\x1c\xd1g\x11\xf1\x1ec\rIm\x1f\xe9R$\x00\x00\x00\x00\x00\x00\x00\x00J\x84\x7f{\xfaH\xfb\x85\x88N\xce\x18\xf7\xd2G&\x81\xde\xfa\x80mz\x1d\xa5\xcd!\xc3\xccHJ\x8fd\xd9D\xa7[\x91\x94\xe6;\xca\x8fl\xcb9\x14\xf6WH\xd0\xfbm+\xfc\xe9\xed\xe7\xc7\xff0\xea\xfe\xfd\xd2\x1b0\x12\xa2\xca\xac\xb4X-O\x06\\=\xdb\x04\\\xe1_\x98\xfe\x17O\x18\xaawu#g#9\xf6J\x8bJ\xbf\x81\x82[\x14\x90!+\xddL\'\xfb|\x15\xc8\x11a\xa7M\x91\x9f\xa9\x1e\xa1~2Di\x0f\xdf;\xc0\x91\xab\xbb\xb2s=ENN\x1d\xe8\x16m\x03\x83\x9b>\xc2\xf3\x8fuFw\xe9P\x1f\xca\x8f\x03$O<x\xb9\xe6\n\x1e\x02<\x86s>D\xef\x0f1\x12L\x0e[e)\x8d}\xb1\xce\x94d\xd8\xc5\xa4\x86N\xe8ac\x15oL6\xa8*\x19QB]1\xfa\xbe\x1c\xdaCR\x8a=\xa2\xad\x92\xfc\xe8\xdeA\xa8\xc9xn\xa1)\xdcEX]^\'\x07\xd4\x19ea\x96\xed]\x97\x0b\xf4\x133`\xc6\xabSg4;\xcb\xca_\x80\x80\xfcS\xc1\x81\x82\xbb{\xb8\xaaP\xbc\x1b\x13\x80 \xe7\x9fp\xe7k\xb0\x87cbAB\x96\xff9\xdc\xa6\xd1X\x18\x16P\xe7H\xfe\x0b>\x10C\x88\x83\x866\xb8\xcd\xbeSJ~\xdb}\x04\xf2Z\x84\x9c\x8aRSh\xdd\x0bn\x16\xca\xde\xaf\x88\xd0\x1ce\x87\x91\xdc\xb4\x99/z{"\x98uJ\x0b\xebo\xa3\xc9\xbf\x1c\xff\xce\xe97\xb7\xd5F5\xda7Ck\xee\x88\xdb\x8f\xadP\xe1w\xd6\x87\x81\x9b\xe0\xdc\x13\xbb\xf8\x0f\xee\xb3\xb2\xa1~_\x84:\xe6\xc2;\xc5\x0c\xbc\xc8\xa8.\xae\x94q\xae\xc9\x1b\x10~|\xb4\xb1C\xe4\xf4\xcb\x88:D\x00\xfe"\xdc6\x864&\xbb\x93$\x87\xef\xe4\xbf\xa9\xa6N\x00:HE\x12`\x00\x1c\xe2m\xab\xc8\x9d\xea\x08)\xa3o\x8f\xb9\xc8\x9b\xca\x98\xc50v\xe5Iq@\xd7\xa1\x98|I\x1cv$h\x10\xd4L\x8d`\x822=\xf0\xd4\x0b\x99\x07\xbeb\xc00\xe8\xed9F\xc7HIO\xc2O\x10m,\x18\xd5\xbd\xb2W\xe9\x1d\xb6M\x8dP\xca8\xb9\xba/[p\x81\x80\x1e\xd6W\xd8\xff\\\\\xf5\xcaa\x8b\x9bl\x9er-Z\xab|\xb0\x9c\xa6\x1e\x1f?=U\xccj^\xd9\x84>\xb3\xcb\x11\x0br!\xbb\xaa\xb6\xd1g\x97\xe4\xf3\x8a\xb9O9\xf4\x07D\xef\x18\xf7K\xe9G1/\xe4\x08\xc8{\xbf\x9e\xfb<M\xc7\xc6\xb1\xffi\x97\xad\xe1|\xf3\xb9.Z\xd9S\x1d\xa2S\xd9\x8bi\x94\xcf\x86\xbe|\x81\rVjw\x11\xb7\x93\x1a\x9a\xe9\xd1\x88&E\x18\xc9\x94a\xb5\x11-\xc8\x89\x97Y4/\xe8\xcf\x9e\x8d\xe5b7\x98m\xd4FPw\xc8\r\xbf1`\xb2=N\x05L\xbe\xc8%\x99\xf7\xac\xc6b5\xec\xe9\x9f\xc4\xa6;2\xd3Y\xd3\xf4{\xb4\xca\xb9\x8c\xd2\x12\xd64[L\xae\x9c\xe3d]\xd1\x9d\xbd\xdd\xfc|i\xb4\x98\x07h\xf8\xb3\x94_#\xa2;[\xc2\xa9\x9f\xe5?k\x16\x1e\xd40\xa4\xa3\x07\xab\xa3\xb2Q8Ab.\xe6mB\x00 \xe5\x88\xcd^t\xd6\xb8N\x9dr9{\xd62\xeb\x16\xf1fzg\xca6|?5Oek\x07}mi\xa2\x9a\x8d\xa6\xce"\xc0\xe65Sh\x8axh\xa6o\x83\xeb\xc8\xa3\xe1\xd0\xa68\xd2\xb4 \xe5\r\xff\x91\xf6\xaa*9\xc4\xc3\x0e\xc2\x9a&\xf4!7\x87\xb7\xd4\x0b\x02\xed\xd7o^\xf4!]\xdb\x87\xa0\x1b\x1a\xcc\x84\x05R.\xc6\x1c\x86\xfc\x1a\x19\x0bb}\xa3z\xab\'\xe8\xe2\xe0\xd3\xec[\xb3 \xaeb\xeff\xf2\xd8\x81\xb7\xacd\\\xd9G\xcc\xa7\xb8\xcf\x05N\xe6\xbe\xd1\x9a\xa39hK\x12\x13\xd8M\x8eq\xc4\x9c\xccf4jQk(>g\x86\x08\x12\xa7\xdbe\t\xc7su~\x86\xf6\xaeb\xe8\xa2\xdd\xea\xbd\xd3\xb0n-\xe8\xed+t\x12t\x14\xeb\x8dL\xf6\xc2\x8d\xd9\xda\xd21\x83\xb8\x86\x1ck\x96\x85\xe5\xcf\x9f\xcd\xa5n\xfc\xbc\xfd?\xf4\xb1\x1a\xd5\x99\x12Ql\x02\x86\xdb\xfb:6z\x01V\xae?\x87\xca\xe4#\'\x8ec\xd7\xcf\x12\x99\x18\xba|\xfb\x97\xe2y\xe0ll5\xee\x9dd\x15Y{\xb8\xf8\xba\xde\x8dy\xa3\xb6\x03S\x8eg\xe7\xb7\xbb\xa9\x91\x04R\xeb\x80\xb57\xd8b\x1d%]]\x00q\xf6*H\xb0\x0c\xf4\x85\x83\xba\xa7\x19\x96qf2\t:J\xd0\xd1\xe4\xe5\xe1h!\x05\xd4\xdaN\x1ff\x05Uf\xba\xb5\x91\x91\xb0U]\xca\xa6h\x06\xa3\x88r\xbb\xbd\x1c\x94\xa2\x88\x1c\x00m#\xcbI\xa4\xbag\x17(>\x9drY\xb8K\x1b\xcc\xa3$L\xfb5\x99qhs&\x98\x17\x7f\xceK\x13\xc3\x97\xfa\x81\xed\x96\xde\x0c\x9e\x16n\xbe\xbf\xdf_\x0e\xfd\xa26\xd9l3t\x8fbf-G\xc9\xcf\xfe\x0ea\xb5\x085\x8e\x85\\\xd8\x04-k\xabV\x8c\x1b\x9b\x8a\x96d\xa8q\x03\xa8\xba\xbb\xc6\x9f\xa5\x04\x94\x0c\x1eq\xcb@\xe4\xdb\xe2w\x9d&m:\x17{E%\x9e\xde$\xab96n`5T\xf7\xe3\xe3p\xde\x89\xe0\xfcxN\xacQ5[\x03\x7f\xd2\x03\x1d\xf8\x81;\xe2\xdc\x11\xf2\x91\x9e\x8b5Rv\xa6\x8d\xc3j1\xbe\x19[\x87\xbf\t|+\r\x9b\xe6\x1c\xfd\xe9\x93\xe8?\xefeBi\x96=\x81\xa6\xb4\xcd\xacA\x93\xfe\x8f$\x11a\x94U\x8eHd\x13\xec\xc0E$&%N6rW\x81[\x87\xealm\xa7\xff3\x8c\xccp\x9d1\x98"\xfa\x8b\xb1\xf2\x81\x0c\xca\xf2f\x1e\xcbe\x89@\x9fx\x941-Q\x92\xf7\xc7{\xe5\xd2\x16\x15.8\xaa\xf6\xf6}\x83p\x1eT(U\xa7|6\x17\xa2\xd8\xf3;\x98\xc7\xb4\xc44\x07Q\xfc\rW\xe4\x19\x14\x0f\x9af\xd5\xf8\xea\xea\xa0.\x15\xaa\xbf\x17B\x08\xab\x1b\xdb\xd6>\t-\xa2\xce\x9e\xe0rVJ8\xa7\x1d\x0cE\x94Y\xdb\x88\x19\x8b\x8a\xb9\xb9\x98\xc8Q\xcc\x04\xd4\xb3i*\x8fN\x90)\xab\xe1\x92g\xd2\xda\x8aC\xbe\xe0C=\x86\x8a\xac\xce;\xd4(\x90\xd1\x9etVN\x02\xb8\xcb\x1dD\xf9\xe0:Y\xa5\x8b\xde$\x19\xbb\xc9\x94\xc8-\x7fi<\xd6\\7\xb1<\\\xf2\xea\x87\x14\xe0\xea\xe7\xa7\x0e\x94\x19-\x0fP\xd7\xb6??\xe1\x18Jh1\xb7@\xd5^\xe0\xbe\x92\x11k\xd7\x1b1\x90\xb4\x9dEuk\xf2\x7fcgs\x82wv.\x7f\t\xd7\xe7\x83\x9b\xf57\xf8\xff\xc3\x17\xe7\x8d\xd6\xa0\xad3\x9fs\xcf%:+\xde\xc8\x91\x1f\x87\xfa\xc0\xda\x05y\xe5\xcb\x9d\xaf\xc6\xfb>Na\x834\x1c\x16\x18\x83\x89X\xf0\xe8_ZB!j\x12\xf7\xe9u\x07\x16D\xcbq\x12\xe3\x94</\x12\xa5\xcf\x15`]\xd7^\xd9\x15\xa4\xe9\xfb\x02\x17X\xa4R\xf0\x16m|}\xfb=\x08\xe3\xf2P*\x90\xf1P\xe6#\xa5s\xa4\x08lL\xd9\xbe\xcbm\xf8\xfd\x9a\xb91s\xf1=\xd2\'\x08\x8a\xe2Tv\x81\\\x9b\x9d\x1b2VV\xfd}[\x10\xf1\xbc\x98\xfd\x06\xc8m\xe2\x14lY\xb2\x993\x87\x98\x0fKC\x9b\xe9g\rh&\xdc{\xec`\x1b\\\xeac\xd0x\xe9\x1auU\xac\xfe\x1a\xe7\x87\xabv\x9e\xe6\x1c9w\xa2\xa1\xd1\xc3\xd4\xd0b\x9b.\xd2\xc3]\xe9~I\x8dS/\xc9\xaa\xa0\x95#G\xbeK\x1a\xe3\xf0\x18\xaeqv \x10H\xd2\x85\x01\xf9\xd7<i\xd3Q\xe7\x8e\xcf\xea\x0f1\xe1yG\xc05\xaf\xef\nB\xde\xbe\xd6\xf0\x1a\xe2\xc0\x19\xc2a/\x01*Q\xa5\xed#_e\xe7\xa8\x833\x8b\x0b/\xffg\xab\x8a\x8e$BX\xdb\xa2u\xbf+\xeco\x12i\x0coU_)e\xf8D}\xaa\x87\x93,Bk\xeb\xf7\x9e\xe9\xcc\xa1\xd4\x06-$\x11\xf8\xee\xb8\x05\xd81\x97\x01w\x91$~Ya\xe4\xf2\xf5b\x894\x1e\x8eI\x85\x8fM\xd0h\x8e\\""j6\xa8\xe1\xfd\xfd;\x88\xf1\x0cg\'\xf8\xaa\x91\r\xb7O\r\x1f*py\xe8\xee\xd4!\x8e\xc4<]\x84\x94}\x0c]2\x85\xa9\x0e\x1b\xa9\xa4\xa0\\\xef\xfe\x9c\xc8J\xdf\xcf\x1c\xee\xa8$\x18q\x18\xcb\r\x96{\xba|\xad\xd0\xe9\x03=\xd0\x03MJ\x0e\xf7E\xf0d\x83e\x1e*\x9a\x15\xcb\x84~\xcf+\xb8\xfb"!\xda\xf2f\\z@xnB\xefh>\xaa\xce>\xd6\xae\xb9\x8a\xcb\x96C\xa6\xae2\xbf\xcbF\xf0\x98\x9b\xdb\x1eeRZ8\xf1g\xf3x\xba\xca;-\xd5\xf7P1e\x9bn\x10./\xd4\x0b?\xe3\x0e\x92\xe89\x1eQ\xe5\xb8I1M\xc2\x1f\x9a\x7f\xa7,\xd0\x99@1U\x93W\xe4\x02\x109\xd0\xd7k\xeel\xd9\xd4,\xba\x98\x1aq\xa3A\xeatr%\x8e}\x9a\xd2bd\x90\x81^\x99\xfbdG+\x1c\x1a\x7f\xdd\x97\xa8\xa2\x14\xb3:\x08a|<\xa8\xc4\xff$\xf3\x9f\xfbR[4\x0b\xa4\xb7\x0c.\xdf\x84\xfal%\xc2t\xd3\x14Ir\xa8\xf24\xfd\xc727\xe2\xbc\x7f\xf2\xe1ja\x16\xf9\x826\x19\xe6\xe5\x0c\x9dpl\xc7?\xe6Fl\x84\xb5\xa2\xe3\xd2\xa9\xa0\x88\xcc\xcc\xcc\x8e|\xf7\xb0\xcd(\x0b\xc5\xcc\x06"\xa5\x81\xd1\xfe\x0bw\xca\xd4\x1aTR\xdb\x0e\xe9\xf9z\xba\xb0\xa9\x85C\x85\x9c^\x9a`\x88\x96\x0f/\xb9\x15l\xef\xe6t\xefy\xf0Q\xfe\xe6P\xa9\xb6?\xa6\xad\xb4q\xa2=F\t\x91\x83\x1a]y\xd5,\xf8\nA\x1b\x9b\xf7\xb2J\xbfU\x00\xd0X\xe9\x92:\x9f"yz\x0c\x11}\xb8\x08C\xbf\xb8^\xf1s\xb7\x84\xb8\x9b\x9e)\x16\xceJ\xa7z]"`\xc0\xde\xbf\xf0Q\x95\x82E\x9b\xa6\'\xe4w\x9b\x85X\xe4\xd9\x014\xe4e\xd7\x7f\xdf\xe4\x12\xf1\xaa7\x8e\xfflU\x1ddc\xf9f\xfb,\x93:\x8bl\x03(\xba\xbb\xdd\xc3\\[\xe4\xc5`\xaf(\x9d\xd8\xe0+\x149\xca3\x8a\xe4\x87s\xf6\xf3$~?\xf1\x1b\xabC\xcc\x8e\xa9\xb3\xb4\xb4X\x12\xad\xae^)\xc7 \xc9\x0ea1\xee\xeaGi\xc9\x94_\xc9\xb5\xd0\x9a\x15}\xb5\xbc\x90\x86\xebrt\xd3]BP\x1d\\.\xe5\\+m\x0fa\x7f\xc1\x18\xf3\xda\x1fw\x99\xe7\x1e\xac\xd1\xd2\xc2\xafu\\$\xd3$\xfa\x0fs\xf9\x11!\xa0\x02V\x81\xa8Z\xdc\xa9A\x94\x9eZ/Q\xd7\x8b\xa0\xf0\xa5|\x02F\xa1\x93x`\xcb\xef\xc3ZS\x18}H\xeb\xc82&e\xc0\xd8n\xd7S\x1a\xad\xf3@\x02x\xd3\x10l\'\xcd\xff\xee~3\x90\xd3\x04o\xb828\xfch]\xc7\'"\x15\xfa\xd5\xac\xc0\xeb\xb5lW/\xd2\x90\x92\x1a3\xabh\x0e\xd8\x8fE\x87\xfc\xd0\x83\xb9\xcf\xd5ryC59\xe6\x8b@\x97JQ\xf5\xb3\xdb(\x97$w\xa6pa8q\xa6\xcc\xc9w6\x0c\xe7-\x8d\x8a\xff\xf9\xe7\xa5\x04\xec\xc0\x85\xc4\x00\xb3z\x8d\x13\xf8\x9c\xd2\x89\xd9\xab\xa2Q\xf1P\x86\xee\x1a\x8e\x0eg;\xda\xc8\xf9\xce\x07CE\x11\xf7\xc1\x8f\xe7rJ["t/\x84h(\xa5hhh\\\xb5\xbe\x06v\xe2\xe7\x81\xc3\x1fs+k\xfc\x94\xd9\xcd\x08\x1f]l\xbc\xf0F{\x1c\xa6*|f\xc0T\xde\x07\x00\xab\xab\xdb\xfc\x18\xd8\xc0fw\x04\x04&\x08\x13\xb7\x19\x8bm\xdeS<\xe7\x1en\x01\xa5l\x97\xd4\xfbm\xd8\xfaG\x8b\xd5v\xdce\xf2\x85\xf3g\x00\xb4\xf6\xa6\x9a\xda\x9b\xfc\xd8\x9b\x1a^\x15\xc9\xa3\xf3\\\xad\x85:\xb0=\xfd*\xd2\xce\xb3 \xd9\x9e\xc6h\xdc\xaa;I\xad\x96\x89Z\xe1M>Qe\xf7h\x81\x12\x8an$/\x1f\x80\xf6\x16\xcb\x0e\xb4W\xe3G\xf2(\xd5\x07\xe3r\x93\xbbq\x90\xcd/\x88\xd9\x05\xa6,\x99\'\x8a\x1c\xdbD\x17\xd0\x06\xfb\x1c\x00m\xe7\x05v\xb7P!,.\xaf\xc6\xa2RE\xe6\xc4CLSx0\xdd\xb2\x8b\x94\xc5\xd3:\xb7\xf0\x9aS\xd8\xbfih{.#c\x806j\x89)\xc6\xb5\xefn\xd1N\x1ca3\xba\xc1\x01\x11#\x8aU\xa2"EU\xc7\xe5\x05\x94a\x93\xbc\x11Y\xfb\xe9\xc60\x8f\xc2\x84\xaf\x8f\x0b\x81\x9f\xad\x8e,vt\xb5/\xf3\x93\xa3\x12\x86\xd5\x9ci\xd9\xaf\xf3\xae\xf9b\x0c\xee\x80\x8e:a\xe5\xa7C\x11\xfby\xd1\xe5\xdd\xa0/\xb0\xd0\xf3\xd6\x0e\x8f\xa0\x84$q\xd3XK\xff\xde\x1aq\xd1G\x1c\xa9=\x90\xa0`|\xe1\xdc\xdc\xdfq@EZ#\xd8\x86e\xa3LK^\x1c\x9f\xc9\x98\xaf\xb7\x83\xb7>h\xa9g\xbd\x11=r|Z\x88p\xc0Wr\xac\xa8\xbb\xd8\xc4Y\r\xda!\xb5\x82\')`\x0c\xbb\xf3\xb9\xeaK\xe6+\xaf\xc0/\xe6;p\xb2#\x8e!\xca\xd3\x01\xf1$d\xf5n\xe4\xd1`BT \xfb5wTL\xfeb\xc9\xd0Dcs\xe8\x94\x0f\xcb\x93j\xdd1\r d6\x80.g\x13\xd5\x0c\xa6\xbd\xb2./13\x8bj\xef\xb0\x90\\\xd7\x17o\xd3\x00\xf5OW^\xf0\xdc7]\xb3s\xff9\xbfN\x9c=\x08C.\x16\xa3\xec\x7fb2_ \xc0\xfe\xb4\xe0\x9d\xd5\xaf@@\x07\xb8\x05\xa6\x1e6[\xe0\xff\xe76\x94\x1e\xe6#o\xc0o\x96UYs\xacjM~-\xda\xab\xa0Y\x9c\x9a,0\xcb\x04_H\xe2z\x95\x8c\x95\x8bd\xe3\xd7\xae\xb2\x1d{PBG0\x8cow\x9c\xaf\x0b\xfc\x95\xe7B[F\xe6\xa3\x80+\xc0\x9cZL\xa8\x8f\xe1A\xa0\x9b\xf1\x89\x8f\xcb)\xdb\x08#\xe7\xd1\xd7\x86.jm\xa5\x01E5Y\x01\x95\xed\x9c\n\xe5R\x9f\x18\x81|\xf9\xfch\xb0E\x9f\xbeY^\x92\xa4Y?SQ\x19\xce_\xc1H\xe3\xb0\xdd\x91\xaa\x9f\xf3\x0e)v\xb0f\xbad\x97\xb3|f36\xdfL\x98u\x87\xa9\x00\xf2\x8f\xf0w\xcc\x99\xc2F\x13\xfd\x9d\x97\x8f>\x80\xda\x10\xcd%\xf5\xd6\xb4\xbc\x07\xd4m\xeb\xb7\x9f\x85\xa0l\xef \xc2v\x96Q\x81I\xf0\xadJ\xd4\xca\xe8P\xa1\xea\xff\xbc\x00\xa2A;\xd7\xcf\x99\xa6\xcc[\xfb\xc80q#X\xd1\xa5b\xdb\xe4<\xa1\xcf\xe9:#\x81\xa0\xbb\x00jE>y\x96\x9e\xc8\xa8\x90D\x94<M\xcf\xf5\x1d\n\x1d\x85\xdb\xb2\x7f\x7f\xb3\xa4\xa2\x17\xdb|\xd1?\x80i\x08m`\xcax^"\xbd\x81\xae \x01_T\xd2\xbe\xf3\x8d\xd4V\x87\xdd\x05(v\x9d\xc3\xdb]V\xec\x9a\x15\xfd\xb6\xd3\xef\xdd\x14\\\x01d\x87\x90R\x8cj+b\x19=\xf5:\xb8\x9cB<\xf7\xf9\x1f,\x96f\xd4\xac\xa3spL\xfb\x1ewO\'\xa14\x91\xb2u\x91\xdfe\xa6f\xc2\xae\xa9Q\xc0\xb5\xd1\xf1\xe57\xda\x02\x14\x197\xaa\x81f\xe7N\xdd\x8e\xf87N#_\x9ekk\xe9\xec\xad\xb2\xb2\xcaT\xe6\xaf\xf0\xcc9\xc5\xaaX\x9aH&\x87\xf2\xc2\xb8\x9b\xca(\x82\x84\x12\x0e{~\x1b\xff4,\x08]D\xca\rz\\\x10\x1a\x94d\x04\xa7\xe9(f\xf4\xb1]9\x84o\xcdz\x05\xab\x1f{\xb5>& \x19\xf2\xc2"\x8ac\x96\xc7\x87<\xe1\xee\x16\xdc\xca\x94\x8f\xc2@\xdc=B\xe1\x1b\xb91\xde\x89\xea\x18:\x8aae[\x13(\xfcz\\W\n\xca\x91\x06\xe9\xb4\x15qh\xa7\x0b\xff\xbeG\x18F\xa3\xfbr\x07^1\xed\x98#NuW\xc5\x03\x14\xef2\xf0\xc6+<\x99l\xba\x10l\xc6\x18\xd4\xb5S\x88\xe7?\xcd\xe73=&\xcfP+n\xcb\xc15W\xda3\xfd\xe4E\xac$\xa8\x0fE\x83\xc1\xc7\x8fZ\xb3\xef\x94\xb7/qU\xb8\x05\xec$\xcc\x89\xb04n\xf7\x93\x05\x94\xe2\xd3ve\xd4\x86BD\x81\x0bk\x0b)\xb5kGU$\xb9`\x9ax\x9a\x87\x1d_\xda\xf9\x86\xfeEx\r\xd6\xef\x97\xd0\xa0~\x9cT\x95\x19"\x93\x98\xc6\x9a\xd9\x1a|\xab\xdbE\x14\x8a\xcb>\xe2\x84\xc8\xddk\xfb+\xaa\xdf\xc7]-\xcc\x07\xea^\xe6@\x8f\xb4/\x94\xdbZ\x1a.%C\xcb(\xee\x1e)\xb8~\x9a\xe6)\xa5\x0c\t\x81B\xad\xb1m\xcf\xf6\xde,\xc9\x0b\x03\xadG1\xb7\x83\x08\x95\xdfr\x9bb\x00\x80\xd3\xb8\xc7\xc8\x13\xfe/\x8e\xef\xc9\xd2\xb4\xdb\xfcc\xfc\xf4\xcc\xe9\xac\xdf\xf5\xd3rM\xad\x9a\xb2\xbf\xeb\xd0\xea\xd0\xe85O\xe7\xee\x83*\n\xb5\xfe\xf9\x84y\'K\xd1\xee\xe9\x94\xdb\xde\x0b\'\x97\xb0\xdf}\x85\xc7\xfe\x85\xc0t\xa9\xc2\x15o\xb4%\xd3\x90\xfd\xc3xv\x0b(\xe8\xf4\xd5\x0e\x13IyA\xb1\xf027\x82\xa2\xf5\xc2\xdb\xb0\xec\x17\xee$/\xb4?\xad\xdf9Cb\x82\xeb\xcby\xec\x06\xba\x884\xbb\x97e\xb1O\xa1G+Q`S(\x88#\x83&^\xa0\xdb\x8f\xe6\xe0;_;\xc2\x1c\xeb \x14\x05JS\xde\xbe\xab\x03#\x0cr\x85\xa2X\xe2$\xf7\xce\xa6\x90\x16A)\xda/&C\xc5\x03\xe0\x87-\xae~\xa4\x05\x04\xd6i\xd6V\xd6\xe4\x975\x17\x8b\\;\xff\x02\x91K\x1aA\xd6\xffH\x07\xdf\x82Y\xb3\xde\xec\xf1\xf6\x84\x9eM\xcdx\x95\x1a<7\xb5\x8b\xd3\x1c\xba.\xda\x9cj\xb8\x10V\xae\x9fl\xeep\xdeMm\x9a>\xb1?n\xdb\x80B$i\xd2\xfd\xb8h\xd8\x0f\xd7\xc2[\xa9q\xb0\x9b\x83\xd0\x82t\x10\xf9^U\xdc\xf8\x18\xa8]\xad\xc9\x94\x1and\n\xe7\x0f\x84\xd0\xafz\xe2~u\xe1\xbajr\xa3\x89]\',#\xc3m|)\x06\xce\x12()\xba\x02\x04\x83\xe3\xdd\xf46\xc0\x9a\xf6\xc3\xa8\x91\xc9\xa3\xa5\xc4\xd9\x81{S\xe33\xb6\x7f\xc0x\x97\x12\x95\x92m\x0c\x0eW\t\x10\xb2Csv\x13\xeb3\x1ej\xab\xea\xa4D\xb5\xf3\xd6\x1d\x12\xd3\x8f1\xdc\x9c\x98\x08/\xba\xba\xa9z\xb1\x05\x18~\xb5\xb2\x18hw\x98\x16\xaf\xf8\xb3\x96D\x8dvL2&ie\x1c\xb41\x11 \x95\x1a\x01\x08QF\x07\xb5\xa4\xb8\xde\xce\x89t\xb0\x81}\r\x99\x07\xea\xef\xddi\\\xd6f\x03\xe6M#C\x06\x9f\\a>?\x13\xb4\xcf\x15\x1c\xca\xe5\xffW\x8ag\xe3.\x14^F\xb8V}\x9c\x90\xcb[9\xf0j\xfd\xdcs\xa8\xa3\x0e\xb4\xa08\x13\xd9\xf2\xc6\xee\x08\x16\xa4`P\xc7\xd4Q\x16z+}\xec\xe4|=\x05`\xa0@\x0bB\xb9\xd7\x16\xe1Q,\xb8;\xbc\xd5\xcbj\xc9\xce\x1f\xf6x\x07H\xe9\xf6g\x0cDmD\x81y\xb7?)\xa0\x07\xd3\xc2+\xdb+Z\xd6^=\xc5\xc7\x05\xdd,\x89\xf1\xf4;\xb4\x8eq+\'\xa24\xf8~\xf9\r\xdf\x90\xd5}\x10_-N\xe2\xe0Q\x90\xea5m}\xbe\xbc\xb5\x0f\xe1\xfd3s\xe8B[\x86\xa7R\xbenL\xe08\x12"\x16\xd1\x8e\xfd/<\xc9\xca$v \xd7w\xd4\x7fZ1\x92\xd2\xea\xb0D\x1a\xd2\xed\x1a1n\xbfJM\x02\x00?\x0e\x98\x13\x00}\x86\xbbP%\xcd\xeb\x1f]~\xcbj\x97+V\xe1 t\x07\x04v\x895\x806\xcb@\xff\xb6\x86\x8b\x8eW}4\xb0^\x9e8&\x06\xea\xdd`\x16R\xd3\xde}\x9d\x99^H\xca\xc6j?\xf9\x89\x90\xeb\xd6\x8d\xec\x1c\xf4Sb\x0b\xf7W2\x93\x0f\xb8&\xcb\x9d\xdd58\x07\xfd\x02\xfe\xca\x02\xf6\xb1\x8bqK\xf5\x87\xc3\xb0\x0e\xcd\xad3\xceP\xcf\xe0\x05\xf7G\x0es\xc1\xc2\xfa\xb0bW\xa8\xdfi\x89\xb4g\xeb\xcdLq\x0e\x16j\'\xd9\xc1m\xce\x91\x14\xce\xe7\xd1\xcc^x\xe4\xc3o\xa0\xb1m\r,\xac5\x8b4\xa7<\xeaKP*\xc8\x98M\xc2\xab\xcd2\x89\xd4b\xd9\x88\xb0\xbb%\x16Lv\x05\xe5NQ*DX\xe2\xba\xeb\x17\x86\x9e#\xb6\xdfb56\x7f\xc5N`\xe6\x12\xd0\x9c\x81\x81h\xf9y-\xb2\xff\x1fi\xac\xd8\x92/\xcd\xc2\xccS\xcd\xce\x98\xde\xdf@\xb1Y\xf9i\xda~~\xc6q\x91W\x93<\x15d\x8d\xecT\xfb#\r\xfcg\x88,\x1c~\x10\x04\x19\x93\xc4\xac\x9c\xab\xa3\xeb\xc0\x03J}\xacg\'\x8e\xba\xc8\xe7}\x8e\x9f\x19\xffDbW\xa4\xad\xd3\xbb\x85;/T\xde\xd6\x9b\xd19\x16\xb2-\xa7\xed\x16\x94jR\xeb\xe8A5TL<\xdf\xab\xf7kV\xab\x8e\xbb\x90\x8eU\x1a\xd94\xff\x0c\xb2\xe5\xa3\x01\xe2]\x87gE\xd1}\x82\xdaY\xb1\xe8w\\\xfd&\xb9\xb5\x9d-\xf1\xd4\x02\xd5\xddPo;\xc8\xd6U\xe5\xbd\x82\xa6\xd2k\x83\x83;>{\xc0D\x93\xbd\xeb\xe6\xdc^\x9b\xfb\xc4\xd8\xb4\x95\xde\xb8S/!\x13\xcc\x19\xc0Qb\xfc\x11\xcf\x11\xfe~E\x13,\x1a<\xf3\xc2\xdb\x9e\xdd.\x9c\x98\x89a\xcd6\xa2\x193\xd8\x05\xea\xc3o\x17\x83F\xfdb\xe4aB\x89E\x80>v\x11\xdbH\xdaj`|O\xa6\xd18\xc3,\x86L\xb5b\xach\xac/\xcf\xa6\xfa\xe7"\x1fU\x1a\x87\xfa\x830\xcd\x12u;\xfe\x18\xff\x10\xec\xff\x02\xa1\xd5_i\xf6\xa9z\x19\xf2\'(\xef\x8b\xed:U0m\xd2\t\xc6\x98\xed\xe7\xd5\x93\x0bx\xa15\x13\xf3\x97\x85\xb3.\xe3\xffb\x80\x12\xcb\x8a$\xa6\x1a\x89\xd7\xff\x90\xe5\x1a\x1a\t0s\x16U\x1d_\x93\xe2\x15ic\xfb\xa7\xc4)G\x18\xf5V\xb4\xd4\xe9\xaeg3\x019\xb7\xbfN\xcav,\xc5\x16\xb0X\xe6@\x95i\xf5\x92\x86V\xee\xf3%.\xbc\xe4C=P\xfc\xe9-\x887=\xa1\x0c\xe1\x85\xfa\xa0\xa2\xc74\x8eC\xc6\x11\x8b\xcf:\xf5\x94\xe1\x89-D\x14j\x87k.,\xb0\x00\xf5\xfcj\x9e$\x97\xdf\xa3\x15\x10\xd0\xf3:\x99\xc8\xc6\xe3\x87`y\x98K\xc1\x82!d\x1c\xbcJ\x85p4\xe8,8\xa9{\xbf\x98\x81\xc6\x93\x90\xd4\xda\xbc\x06\xc7\xfazp\xc1\xd0]\x10\x125b3g\xe0\xad\x8a,\x9f\xcd1*\xfa\x81zt1\xdeR\x1dOH\xf1\x06\xfee\xa1\x9f\x03\xad\tFt\x15u~22T\x87\xce6\xd4\x94)\xc4q\x9a\xc3\xce\x9bHTQ\xf1M\x19\xf7\xb3\x98`\x13\xb7S~\xa9$\x90\\O\x12\xe2;\xc1%J\r&\xc0\nN\xbcz\xa9\xd5\xe6n\x0c\x01\x1f.\xd1\xedU\x88\xb9\xd3tT\xa7KSf\x00\xf8\x05\x16_\x0c\xdax\xd2\xa7R\xd2:\xc0\xfe\x90\xa8\xa3\xee\x1c\x89\xc7\xa2\x94m\x84\x92\xa0b\xbd\'\xf6\x00\x86Br\xadW\xc2\xa1d\xa3\xf6\xc9\xdb\x0f\xae\xe1^K\x9e\x10\x89\xbc\xc9\xc1T\xad \x1e\x02\xbdN\\\xe7N\xf8\x1b\x06\x84\xb0\x9a\xc2\xe4\x92\x9b\xcc\xbe\x0f \xc9\xac\x18<\x81v\xcc\xa8\xdc\xcc/\x03+\xec\xb4\xb1<q\x80\x14\x8dI\xf2\xb0\xe0\xf9\x18\x9b3\x18>0\xea\xba\x12\x8b\xa4`\xee\xf8>x\xa0\xaeW\x9f\xf6\xba\x17@\\\x14\x02\xdd\x8e/O\xb79L\xdf\xca\x19\xa2\x1cu\xdf\xdf1\xb24"\x97>k\xffc\x80\x03\n\xfae \xab\x82/\xa6\x8bE\x14\x84\xdb\x84\x11]n\xb6\xf0\x1b\x12Q\xc8s\x82j\xb5\xae\xfa\x06\xd9\xaa\x8e\x15au_l\xcd\xcd\xf3\x9ar\xc0\xbd\x02\xedC\xd2%\x05\xa89yL*$[\x9f\xfb\xc3\xd4\xe2\xb2\xab\xc8\xa0\xb5rH\x11\x9c\xce\xb4\x96\xfc\x85\xb5\xb1\xd5\xfa\xbe`\xb7\x1c\xf9\xdb]X\xe4\x84\x89\x18\x12\x0e/\xe23@\r\xb3\xaeoR\x86\x16\x1b\xb1\xd2\x8a\x19\x163\xees\x81\x1d\x96\r\x8f1\\`h\xbd%Q\x10\xa56\xa7\xc0U\xb1\x926O\xaag\xd1&$/9\x04[" \xf6M\x85\x9f3\x8b!\xca\xa6_m\xe6\x81l\xe1\xc8\x99\xa4\xa1>3\x18x\xf3l\xbeo\x18W\xe0N\x8e\x04\x8a7\xb34\xfc\xfaa\xab\xed\x7fl\xb9\x9c\x87\x9d;\xee\xf5y\x8d\xf9\x00\x03N\xa5\x15\xb0\x01B\x02k\xb1V(\xc3M|\xb3\xbd\xc1^F\xccc\x9c\xa5/\xb4`\x8a\x01#[\xe3\xcd\xdc\xdd\xf9\x90e9-#\xf2b\xd3\xe2\\s\xf4=ZU\xaa\xb9\xae[\x99\xb9(BI\xebnb\x9dI.\xb6(B\x06u\x11\xdf\x9d\xbf\xb8V\xcf\x15\xb2K8\xc7{\xb2*\xb0\xe4\xf0\'C\x9b5\xeb\xf0E\x12\x92\xce\tu\xc2>+\xb7\xad\xb3\xf6|\',\xfe~\xa4o6r\x94\xd1\x16\xdf\x0b\xcd\xec\xacv\xda\r\x0eE\xdd\x19\x1d\xae3\x13F\x84\x1fy\xb0\xb4\xcer\x16\xb5\xd1\xc0\n\xb7@\xca\xcb\xc28\xd3\x9b\xfbn\x13O\xf3\xe3\xf3\\\x99\x1b$\xdaqbs\xd9\x11\x1c\xda\x82\xdd\xfduN\xc4w!Q}E\x8a\x07r\xfa|\xd55\xdbI\x14pm+\xf0`\x89\xe8]`8\x99\x02o\x10\xf59\x8b\xf0\xf2\xb2\xab\x05\xcb7\x19\x8f\x0b\xb2\xb95\x08\xff\xa5\xc6\x9e\xae\x95\xf24\xf6q\xd00\xaa\x0b\xb7\xc8\xee\x92\xfbB\xcc\x95x\x0f\x87\xd03\xb2\xacK\xe8j\x92\xb9\x1c\x98d5\x1bX\xc0OT\xc5\xe1\x91\xc6\xc9\x1ep\x16\x17\xd2,.\x16\x07\xc4\xbd\xd8\xfc\xfeH\xfe/)h\xca\x0c8\x12\xdd\'C\xd35K\x01\xe4l\x83\x84\xdb\x8a\xfb\na\x06\xdf\xa3\xec\xe6X_\xdf\xfc\x1cB\x08\x1be3 \x94\xda\xa2T\xf2?#d\xa5\x01TV\xaa-\xe7\x01\xc3\xa0\x11d\xff\xf9\xc3\x97\xd2o[\x85\xc4\x97\xab\x0c\'\xd4\xe2\xe5\x8e\x027\xfaL\xdb\x96w\xd3\xde>\xad$\xfc2pt\xb1O%\x81\'\x19\xdb\xac\xce6\x11)\xac\xe2\xef\x02\x9a\xfd\x82\x11wh%y\xa5\x9e\xb7\xd2\x96\x89\x01)l\x9f\x8bn\x9fpJ\xf3u\x802G2\xc6\x82Q\xba\xc3\x99\x83\xfc&\xd5\xa6\xcb\x91\xd2\xba\x93\xb4\x97G\x1f\xce-=5\x13\x92$ \xd6\xf3\x0cC<\x87\x97f\xd1n\t\xa2\x07\xd7YV\xc2J\r\xd9\xe2\x92{\xc4\x05\xf3\x86]\xabzH^\xad\x05\xb6l\t\x0f1\x84\xffu\x17\xd8i66Fk,\xe6zj\x12o\nR \x94u\xa9A\xbf\xcf9)N\'\x1a\xce\x7f\x1bw\x1f\xd7Q\x8ce\xe3\xbdr\x1a\n\xbd\x164J\xd8)\xaaV\x85c\x12\x9a\xeb\xb5v\x91\xb4b\xdf\x1f:\xff\xc3\x98/l\xcb\xbe\xbaC\xea\xb0ji:\x17\x03\xb0\xbf\x15FC\xfdk]3\x93B4X\xde:@\xe1F\x894\x1d}!\x93\x0b\x92\xca\x9e\xc4\xf8\xf3\xd3z\xc3\xa4\xac\xef\xa6]\xd9\xa5Bf\x07E\x94\xe7.w\xaf\xaf\xb7\xe3r\xc2\xf7\x979\xd9\xc2\xe9u55\xd6\x84!vb\x19f/\x82\xb9\xe3\xb9qN\x7f\x88t\x1b\xe1\x13\xb8\xb3\nmL\xd7\x8fo\xa1\xc5\xd4\x87\xde\xd3\xe9\x8b:\xb6\x82+\xcf7Q\x07b\xe5\x16#\xed;\\\xdb\x88\xd8h%\x0f7Z\x89Oq\xf1\x0f\x15\xff\xa3wK\xfe\xbe\x1c=\x85\x00ni\xf2*\n*O\x98H\xfe\x89\xa9e\rV\x18\x9e\xa4\xae+\xdbHn\x00\x9b\xaf=X\xcc\xd5=\x96F7E\xa0\x14\xc4\x00\xb1\\\xc3\xf2\xacW\xcaL\xde\xcf\xa9\xb1B-3\xa7\xd5w$\x13\x8a5\x97\x9b0\x877n\xd7\xe0p\xd8(\xb6\xef#\xf6Qn\x98\x97\x91m\x9d\x0c\x87\xbf\x18\nM\xfd\t\x85\x9eHp\xf3\x1a\xef+R\xe1\xd5\x90\xfbe\x8f\x89\nM\xd14}\x9aE\xeb\xc4Y\x89\xac\xbb\xee9\x01!O\x98\x12\xac\xce\xa6\xab"]s^\t\x11\xd4\x0b~\x88Z\x15?At\xc8\x80\xc0\xe4Z\x12\xe18,c\x1c\xe2\x8a\xe4\x8d\x1ek(\x94R\xd4\x84\xe3f\x0e,\x81\tjb\x7f\x1a\xac;\xec\'\xb8\xb0\xa6~\xc0\xe6[\x80\xac\xd1\x0c\xc9\xb2Ot\xa8\xfb\xd7A\x02\xffX\xa6G\x84\x84\x0bF\x8eH\x03\xea\xa5\xec\xdc*\xdb\xac\x89\xa6;e4\x95\x93u6\xf9\xc0\x87\x8d\xf8\x8e\x9a+\xd1^\xcc5\xe6,+L\xbb\xa4\xb0\xb82\xa7Z\xc3T\x9e\xa8\xdc\xe7\xdcJ')
4
- #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
1
+ from sqlalchemy_serializer import SerializerMixin
2
+ from flask import Flask,flash,request
3
+ from flask_sqlalchemy import SQLAlchemy
4
+ from flask_admin import Admin
5
+ from flask_admin.contrib.sqla import ModelView
6
+ from wtforms import SelectMultipleField
7
+ from urllib.parse import urlparse
8
+ from .config_enum import ConfigEnum,ConfigCategory
9
+ from .config import hconfig
10
+
11
+ from sqlalchemy.orm import backref
12
+
13
+ from flask import Markup
14
+ from dateutil import relativedelta
15
+ from hiddifypanel.panel.database import db
16
+ import enum
17
+ import datetime
18
+ import uuid as uuid_mod
19
+ from enum import auto
20
+ from strenum import StrEnum
21
+
22
+ class DomainType(StrEnum):
23
+ direct = auto()
24
+ cdn = auto()
25
+ auto_cdn_ip = auto()
26
+ relay = auto()
27
+ fake = auto()
28
+
29
+ # fake_cdn = "fake_cdn"
30
+ # telegram_faketls = "telegram_faketls"
31
+ # ss_faketls = "ss_faketls"
32
+
33
+
34
+ ShowDomain = db.Table('show_domain',
35
+ db.Column('domain_id', db.Integer, db.ForeignKey('domain.id'), primary_key=True),
36
+ db.Column('related_id', db.Integer, db.ForeignKey('domain.id'), primary_key=True)
37
+ )
38
+
39
+ class Domain(db.Model, SerializerMixin):
40
+ id = db.Column(db.Integer, primary_key=True, autoincrement=True)
41
+ child_id= db.Column(db.Integer, db.ForeignKey('child.id'),default=0)
42
+ domain = db.Column(db.String(200), nullable=False, unique=True)
43
+ alias = db.Column(db.String(200))
44
+ mode = db.Column(db.Enum(DomainType), nullable=False)
45
+ cdn_ip = db.Column(db.Text(2000), nullable=True)
46
+ # show_all=db.Column(db.Boolean, nullable=True)
47
+ show_domains = db.relationship('Domain', secondary=ShowDomain,
48
+ primaryjoin=id==ShowDomain.c.domain_id,
49
+ secondaryjoin=id==ShowDomain.c.related_id,
50
+ # backref=backref('show_domains', lazy='dynamic')
51
+ )
52
+ def __repr__(self):
53
+ return f'{self.domain}'
54
+
55
+
56
+ def hdomains(mode):
57
+ domains = Domain.query.filter(Domain.mode == mode).all()
58
+ if domains:
59
+ return [d.domain for d in domains]
60
+ return []
61
+
62
+
63
+ def hdomain(mode):
64
+ domains = hdomains(mode)
65
+ if domains:
66
+ return domains[0]
67
+ return None
68
+
69
+
70
+ def get_hdomains():
71
+ return {mode: hdomains(mode) for mode in DomainType}
72
+
73
+
74
+
75
+ def get_domain(domain):
76
+ return Domain.query.filter(Domain.domain==domain).first()
77
+
78
+ def get_panel_domains():
79
+ if hconfig(ConfigEnum.is_parent):
80
+ from hiddifypanel.commercial.parent_domain import ParentDomain
81
+ return ParentDomain.query.all()
82
+ return Domain.query.filter(Domain.mode!=DomainType.fake).all()
83
+
84
+ def get_proxy_domains(domain):
85
+ if hconfig(ConfigEnum.is_parent):
86
+ from hiddifypanel.commercial.parent_domain import ParentDomain
87
+ db_domain=ParentDomain.query.filter(ParentDomain.domain==domain).first() or ParentDomain(domain=domain,show_domains=[])
88
+ else:
89
+ db_domain=Domain.query.filter(Domain.domain==domain).first() or Domain(domain=domain,mode=DomainType.direct,cdn_ip='',show_domains=[])
90
+ return get_proxy_domains_db(db_domain)
91
+
92
+ def get_proxy_domains_db(db_domain):
93
+ if not db_domain:
94
+ domain=urlparse(request.base_url).hostname
95
+ db_domain=Domain(domain=domain,mode=DomainType.direct,show_domains=[])
96
+ print("no domain")
97
+ flash(_("This domain does not exist in the panel!" + domain))
98
+
99
+ return db_domain.show_domains or Domain.query.all()
100
+
101
+
102
+
103
+
104
+ def get_current_proxy_domains(force_domain=None):
105
+ domain=force_domain or urlparse(request.base_url).hostname
106
+ return get_proxy_domains(domain)#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
107
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -1,5 +1,57 @@
1
- # 2023-04-08T16:23:20.316121
2
- from pyarmor_runtime_000000 import __pyarmor__
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\xee\x0c\x00\x00\x12\t\x04\x00\xc7&6\xd1\x803\x97\xdb\xe0#\xd9\x83\x11-\xb4A\x00\x00\x00\x00\x00\x00\x00\x00KF\xbc\x87\x83\xea+3\xa1\x8bd\xfcK\r\x92y\x13(&m\xc4,\x94\xda\xae\x8f\x0b\xc3\xef\x84\xf7\x07&<\x1f\xa1<4\xedW\xc5!\x8c\xcc\xe0\xe8\x8e\xbf\x92\x18J\xd2\xb7\x8ey\xb2D8\x17\x8b\x8c\xe8lv\x0b\x1a\xc3\x83\x08\xbe\xeeu&\xa2/\xbc9\x97[i\xb6\xfa-\x98u\xc9\xd5\x815\x1e\xa8\xf3|w\xc0\x91\xd8N5`\x17\xbe4_IL\xc5\x06\xf3\xe8$\xfd\xa8\xa8\'\xe8\x17%J\xd9\xd7t\xd3\xc2\x19\xb35\xee`\xa5\x98O\xf0I\x17X\x9b\x89\xa6\xf0J\xad\xed\xa4\x86\xe2f{Q\x0f{-\x9a\xe4\xe7ww\xf4B\xf1\x8d\x90\x98\xb6\x8a\xf8\x9f\x18\xc1\x8a!\x99\x06&\x80\x99\xac47\xf8\xcc\xde\xfb}\xc4<?\x91\xbc\xc3_\xb7\xbc\xc5T\xde\x9f\xac\xb1&\xf9\xd9W\xc5\xdb\xd7\xc8\xe6\xe3\xb4\xce:E\xdaZm\x84\x0bF\xfd&\xde\x0e\xc6\x86|h\xde\xa7\xaaI:%\xdd?#\xcf9\x1a\rp\xea?\xaaL\xe5?\x1d\x7f\xe2\x0b\xaf\t\x0eD\xe8\x1f\x05g\xe0\xe4\xef\x886\x0cG\xc0zx6\xe8]Fr%gD\xfe\xf2\r\xd0\xdc[\xa9}\xc7\x0b\xbe\x16\x8f\xc4\x8c\xe2\'\xb1\xb5b\x91I\xdff\xa5\xaaM\xf8\x13\x936\xa7-t\x9aN\x9a\xf4\xe8\xc7\xed\xa2\xdc\xca\x88U\xa9\x8d6\r\xac*O\xc3\x0c\xa9\x88E\xd5\x86\xc6\xae,8\xaa\xc2\xd0\xc0f\xc9\xca\xfe*\x8d\x8cR\x0e\xd8\x84A\xd8\xc3\xc1\x8a\xd9\x19\xd3\xeb\xc1>\x97F\x99\xc7o\xa4\xe9\xa7\x90\xe4\x88\x14\x81y\x17\xa4&\xaf\x0f\x85\xa1\xbb\xa5\x04\xba\xf4\xe4\xcb\xd5\xd1\x93u(\xbb\x1b\xa9\xe6\x8b\xf2"\xe8\x1e\xae\r\xa4\x99\xed\xb4\xb8(\x01t\xc5\xa5\x16i\x9a\xe10+\xe8\xbc-\x12\xbcn\x10\xd7\x1c(j\xef\xc1P&\xc5p\xf5\xe3\xe4j\xf2\r\xc4y\xde\xa0\xff\xbeN\xa4\xb9OV/\x9dO\xa7\xf5\xcbv\xc0t}\xad\xa2R\x98]\xbb8oF\xe9\xf2\xfe\xd8\xfd_\xefn\xc3\xae\x9eF\x0ba\xb6\xb1\x12\xc9\xef\xca\x14z\x10t\xa4yn\xa9}\x83\x1b:X\xdbhTa\xe3\xf6\x9c\xa26\x89\x1d\x91\xd1\xc76?\xc3\x96\x7f\xb8\x82M\xc8\xaa>\xab\x19\xba\x1d\xbf\xc71\xaf*\xbc\xd2\xa4\xd7\x8cb\xc5\x12"\xdb\x04x\xb9Oc\x06E\x8d\xed\xb1V\xe9\x0b\x0b>\xf2\x15\xcd"\x88\x071e\x8c]\xc1\xb3D\x96\x8a\x19\x86\x89x\x11}\x00,?\xff\xcd\xbd-\x01\x03\xe0\x86\xebep\x1c0A\xa8\xae\x07\xe8\x0c"\xf3\x07z\x1a\xe3\x03\x1d\xa9\xc1`T\x85\x07\xd9\xf2\xbc \xe4\xaf\xb3\xe6m\xbe\x8d\xbf\x026\xc7\xf0\xef<N\xc6\xf0\xa0\x07\x9a|\x1a\xf7\x08\xe3H\x8a\xb7!\x9b\xb3\xb8\'\x06\xef\x1dO\xd2\xf4x\x1a\xdd\xd5}\xf5\xd8wd\x038\xe7\xc0\x8c\x1ey\xbd\xc4\x11\xea\xed\n3\xb9\xa3\xff\x906\xeb\xc7. ,5\xe2b\x8d\xc07VH\xfdU\xbf`\xf6\x14\x14\x1e\xe4\xebe\xb8\x87\xe2\xdc\xd12\x05A\xd3[\x10\xc3\x00\x98\x80\xael\xc9\x89\xd6@%>\x80E\xcc \x9c\x8b\xf7\xf0\xf0m\xf9\xfd\xe1\x92\x1f\xea\xbd2\xd7\xb1\x91#\xd7\xfb\xa0\xb02\x1f\x98\xad\xb9\x898!\xcf\xaf{\x15v\xdb\x8e\xc1h\x98[u\xb6\xd6\x80\x8cW\xc9\xff\x1e^\x93\xb4\xaf|\xa1\xc3\'\x18\xb3D\xbb\x14\x01\xb5\xde\xa8\x14\xf6F\xe8Lc{\xb3\xee\xaaH\x04T1\xed4\xe6 l\xacH\x97\xd9\xd0\x9c\x1dR{S\xb4\x89\x1c5b]\xfa\xa9\x8f\x18\x10\x0f;WP\xe2\xef\xd4\x18\xf5jh0\xce$;\xf1=\xb2\xa2\x04<\xcdm\x86X\x81NW\xf8x#\x89\xbd\xad\x05\x88\x15,b\x89B\xd5\xa5\xc1\n<\x1by\xa3\xa1\xc8z\x87}\x06\'\x07\xc4\xd9\x99\xf1\xe8\xedO\r\xb7\xb4a\x89i\xf3d\xf3\x8d\xc9U\xdbz\xcdq\xb4\x95\x06\xaa\x1c\xf1\x97\xa3\x8b\xa5u\xba\xf3\xf9\xdf\xeb\xdb\x7f0\xc6\x1b\xc9-\xe8!R\xf3\x17z3$?cB\x05\x11\xb5\xc3%\xe6\x02?\xc9\xd7\x9e9\x08\x7f\xae\x88\xf2\xb7\x9f@\x90\x81\rn\x8f\x1b\xf5@\xca\xbb\x95\xa8\xa5\x1d\xc7\x19\xa6\xa0\xa0i\xf8\xa79\xee\xfc\xcf\x9fm0>\x0bc7\xdaS\xb1\x8d}\x94 \x93\xdf\xda\x13$\xday\xb7\x8d\x03\\\x93\xa9\xd1\x0c\xe5\x80\xb0\xe4\xf4L\xf1\x81b\x8ag\xc9\xd8^lj\xd5~$\xddE\x8d\xc7\xe1\x896\x8bs6\x88hd\x065Q\xbd\xfb\x1fj\x02vN\x94\xfaiY\xce\x9e37{_\xfc\xfe\xe6d\x04gn\x9c\xb5U\xe1\xc4\x00\xa6"e>\xef@\xcc7mt_\xb2\xe5 #\x9aq\xba\xec\xf4\x8a<}\xd8\xe9p\xf2\xb6\xb4\x9f\xfbA~\xb5\x9b\xd9\x07\x11\x0f\x1b\xddyI\xee\xbc\xd36\xba\xdb\xbf\xf7\xa5Hp\xa0w]\xa6i\x8f,\x97T\xef?\x91C\xd9.C\x0e\xa4\x08\xaafv\xd6\xc3\xf5\xe1\xcc\x94q\xc2qK`\xc2"W\x9f: \x9ep\xfaq\'!\xb1\x05\xd2\xbb\xcbT\x1df7]\xbd4\xb3\x02\xf7I\xb7o\xd5E\xe6\xc7\xab\xb8&\x8fVX\xd2\x087\x9b\xed\x12W\x99k\xdew\x8c\x9e\xf9\xc0)\xf5\nil\xb1d\x9c*X\xeaF\xe6[e\xaez\x11@\xf6\x97\x16\xa1\x8bz,\x10\x1fB,l\x05M\\_1R\x08\xb8g\xe9c\x83\xa0|\xef\xcb\xb7[of0\x05H*\nh\x08\x1a\x15\xf81\xb7\xe5\x0b\xab\x0e\xdb\xa61\x17C\xf8\xe9S[4\x8d\x83\xdfx\x0e\x84f\x95k\x9c\xd5-I\xe6\x1fA\x80(c2E(\xad\x9a\xe0\xe7\xe0\x92Q\xad\x95QsjV\xf3\xb8\xbe\xae\xc9\xa9\xd7a\xe2?@b]j\xb5N\xe6ZG\x0b\xed\xd7\xee!\xf7\xf4\xdd\xad\x94\xad\x9d\x1f\xcaE\x7f\x9e\xffhj\xe2\x9d\x10\x10Zx|\xa1\x9e\xccc d\xc9o\xcb\xf8\\\x8a\xab\xb3\x8bT\xbc\xc696\xb8\xb9J\xcf\x1eZ\xbf\x18\x1d\x9czE\xdc\x15\xed\x88$\x84\x00\xdb\xf3o@\xd7\x94\x98\xa7>\xb2\x1a:<v\xc0\x84\xb3A%\x85}\xdbM\xd3\xc3\xc6\xf5\x19p\xf4D\xe9\xc2\xcei\x11xr\x14\xe7Z\x9c\x8d\xb2\x04rl\xa2\x97w~p\xf8\xe2\xde+l\xab\xdd\xeb\xff\xbc\x9e\xfc\xf7\xeb\x95].\x97\xde\xb2X!\xec\xe8\xda\x80\x9b]Z\xd8\xd3\x80\x1f\xfd\xdf\x1c$p\xff\xd5[\xac\xd0\xa98\xc4\xb6\xb6G\x8b\xdd)\xc5\xd4w\x1eE\xdcf\x80Z\xb1\xd9"\tfK\xf7\x1d\x8b\xc1\x891I\xa8c\x13\x18\tg\xe4]\xce\xc9\x95\x96c\x1d\x14\xa3m\x14\xc9\xfe5\xf7:\xa5s\x9d\xb0t\xf4\xaa\xcd\xf5\xc0\x14C\x0e\x1e\xb0\xb7(\x7f\xaa\xecJq\xbc\xb4\xafd\x08\xbc\xa9\xf9\x10S\xc4(u\xbd\xb2\xb4\xa7\x1d\x9e\xa9\x1d^\xbf\xb6\xe2AD\x94OS\xef2B\xbc\xf7JD\xaa\xf5\xb2\xc7\xb1\n\x88\x02\xac&\x0b\xd4\xa3\x14=\xa3\xad\xc5\xaf\xc6\x97\xb0\x91`\xb6:\x06nk\x90uE\xa1\xa4\x97e\x7f>\x9e1\xef\xcb\x13\xbe\xf8\xd2\x07V\x98\x9f\xf4\xb1\x06\xb7$\x91\xb4m\xa78\xfd\xb7\x88~3\xbf\xe9\xbe\x04f\xff|\xc9\x16\xda\xe3\x93\xd8\r\xa6eS5\xf7,Q\x0eX\xf2o\xc29\x9c+h\x80/\xafe0\xdc\x1aZ.i\xc8\x18\xc5\xf8\xb0@\xd5u\xbb\xcf-\xb8"6\xc3a\xc6Q\x13\xea\x9c\x12\x9f@\xdc\xe3F\xf4\x83\xb6\'5s\xa9\xde\x08\xb1\x93\x7f\x9ck\t\xfa\x82\xf5\xdcj\xd8\xd1\xa8\x9b\x94\xb1_\x0f\x06w\x8fq3QH\xf3\xaa\xe6d\nQ\x10\x9e~\xb8\xfeL7\x08\xcd\xa0\x8f\xb0_\x82\xbb~^\x1c/+\xe4/\xd0\xbf?t\x9f}\x8b\xe8<7\x1c\xcdxr$\x99\xd9\xb1\x05\x85\x80\x8c%\x01\xed\x05\xb6\x91"\xe3\n9GZu\xb3\x1e\xbb\xf6H\xfd\xb8gvjw\xebm\xa0"~\x8dt\xab\xf1r\x0e\x8d0\r\xa6\xb7}\xeb \x80\xb0&\x05w\x16x\xce."\t\xb0E\x0cR?\x8c\xb3\xf4\x95\xcd\x05RS\x08\xf5M\rt\xd2\xba$\x88<\xa2@\xec\x9d\xc4\xef\xbb\x99\x03\xfa\x1e<\xd9<\x85\x17\xa7\x98V\x06\x9d\x14m\xfd\x0b\xc3\x8eOD\xa3s\x11tt\x8a\x98N2\xa9\xc7\xf5\x8c5\xae\xe9\xef\xf3\x158%\x96\x8d\x8alr\\\x83B\xd8\xa2i\xad\xc9u\x1a\x1d*O^\xa9EY\x00M\x86\xc5(l\xfc\xfe~\x8f\xfc}w\x015\xd4\xdcARK#\x05K\xd8\x7f\x1e\xd9\x97c\x8c_-\x03\xe3\xd6\xce\x80hq\xd0\'"\xef\xda\xf1e\xc9=\xef\xfeY\x9b\xfa\x14\xff)\xf7\x1df\x92\xd6\xad\xc39;\xe4\x11\xcb\xb2\xbeb\xbb\xfbU\x87GQ\xe6\xba\xf9\x8b\xec\x1e\x07\xe7\xd2 \x80\xbd\xde>\x9e\xc7\x90[^u\xf6\x9daC\xbc\x08\xf2|\xed\x8e\x1c\x9a\xc4\xd35\xbf}\xca\xf8\xe4TYe\x87>\xaa\xde\x17\xd6\x06\x0f\xb2\xf2\xc1\x04n;\x9a\xf9x\xab\xcb\x0bN\xfe\xa8\xd6\xe2\xf4ZYP\xcd\x058\xc7H\xfa\xa1*D\x0fm\xab<\xd8\xc0\xda\xd5\xa1\xd7\xd1\xa8\x1f\xcb\x12\xe5\xa7\xbc\xc5\xe2\xd9\x1e:r!\x01\xac\x01W\x12\xbd\x8eF`bf\x15\xf8\x07\x9c\xf4\x86\x7f&\x9c\xcf+\xc3\x85z<\xfdvXP.\x06\xeb\xb6\x0e\x9a\x14\xc6\x9a\xe7mb\xb5\xf2\x92\x11\xb1F\xfd\t\x80\xfca\x9b-\xba\xa6\xcc\x06:<\n/\x98\x80\x8b\xda\x87\xbb\xbd\xf9|\xf9BC\xe0\x19\xb7TI\xa6l\xb2\x8b\xb6pE\x88\xb0\xaf\xe5\x18\x11{\xd8R\xae&[v\x80v\x0fp\xfcj\xc5\x0c"=\x96\xb2\x88\x8d\xf1\xbc\x87\xa2\xf9#\xb5))5f\x9d\x03\xa5\xf0\x07\x0c\xe2W\xdd\x8f\x9f\xba\xef3\xcf\xa0\xbf)\xc8c\x9d\x87\xb6\x16\xeb\x92\xac\xeer\xca\x1b\x1ay\xad\xef\xea\xc2\xed9j\xf2{\x8b\x88!\x99b\x99\x1c\xc49\xb1\xac\x1d\r@\xec\xf8\xce\x12\xab\x87\xad\\\xdbC\x93\xab\xa0b]\x97\xa4\xb8\xb8\x91\x97\xf6\x80\xde\x9a\xe0fG\xf9(^o\xeb\x85\x03G\xbcXA\xd54\x9c{\x0c\x8b2\x14\xd5\xc0J\xd6\xa5\x14\xfbW\x96\x91\x95`\x0c\xbf~\xe4\x9e\x7fH\xaa\xaf\xd6\x16j\xea\xcbhC\xa4\x03\xd4\xee\xa6\xc1\xd9\x9c\xc9>\xa5\xf7 jf\x05\x91\xc85x\xf2\xd3+\xfd\xb1\xe2"{\xaf\xabA.W|\x81d\xd6m6\x9f\xec\xc7\xf2>3\x1d\xe2G\xb58\x16?\xac\x0e\xb0\x07Pd\xe3}23\x18A`\x921O\xfa\xcf2+S\xee\x88\xc8\xb6\x1eO\xa9\xcb\xc2\xfd\xb2\x81\xc7\xb2\xe8\xady^\x04I^\x82\xcb\x8f\xd1d\xae9\xaa6\xbb\n]bh\xbbN\xe4_\x0b\x99~acZ\xc0\x0c\x9d\x13\xed#m\xdaG\x0b)\xf4)"\xfau,\x12\x1d\xeaO\x99}\x0b\xdf\rN\x04\x82\x92\xebc\xe2\xa3\\uux\x80\x863\xacR1\xca\xf6zZ[$\x05\xc5\x7fw\xffZ\x9a\x7f=Z\x9bJ\x1a\xed%\xad\xb8\xab8\xe1\x0f\xe8\xed\'\xe7;\x12\xf8\xf4\x8f\x88.\xb4\x9a\x9dH\xd9oEV\x97\xe7>08\xccB\xa0:S^\x03\xf1\x14T\n"%\xf4\xb3e\xa5\x1e\xa3\x13\xda\xc3!\xf0\x87rFk!;R\x95t+\x94\xe7\xc8:\xb7\x19\xdc\xca\x04\xac\xb0\x11\xa6k\x87\xf5\xf6w\xf2iY\x07\xd7\x1d\x0e\xc8\xd6\xaaF\x009&\x1f\\I\x94\x91+o\xdb\\\xa0\x8d&Rx\xd8\x05\x03\xce-k\xfd(\xda\xaf\x87\xef\xd2\x08`\xa8[f\xd8Q$\xa0k\x8em\xfd\xf1[\x18Qy\x99\x1e"J+\xa0+!U\x1cR\t\x9b\x9bm\xc7"E\x98\xdf\xee\x8d\xd0\xcf\xf5\x12F=Y\xf6q\x05%\xefl\xa2K`\xd8\xee\xd5R\xce<S5\xbc*V1\xf6E\x97<\x93\xe3\xad\xe9\x86\xd5\xb8\xb0J;\x1f\xee=f\x18\xfbA\x06u\xecA\xdc[o\x08b\xa5+e\x0b<\xa3\x7f\xa4S/\xe9\xaf\xf79\x17d\xb0Y\xcd\xe3\xbb\xa3\'\xa3\xa3\x19\x92\x00{IqP\xe9&\xff\xf8v\xaa\x1c\xbbu\xd3W\x07\xe1v\nS\xbaS\xe4\x99+\xa0@\xf1\xce\xa0\xc5\xbb\xd93\x14\x8ft\x98\xaen\xf9d0\xdaFa\xb5qj8\xe6\xa6\'v^\x98Gc\x19\xbdK\xca\xfe\xa0?~\xf2l\xfdI\xd7\x0f8:\x11\x81\xa3,\x0fY\x8f^Y\xdd\n\xca\x11F$\xbcY\xbb?\x1b\xce\xa4UY\xb6L\x99\xebNy\x17r>J\xd46z\xb09\xaeR\x9f\xec\xe6\xeb\xb9\xd5\x90>{4&]8\x87u\x1eUB\x02+\xfb\xfe\x91\xe4\x16\x02\xa8?\x14!V\xcf\x1b\xcfy)q-\x0b\xa4w\xa1\x00\xaaI\x97x@\xe9\x10\xf1:t\xb5\x15\xf8\xde5/\x92\xec= i\xd0\x06M\x10?\x86l\x9e\xa5\x7f\xf5\n\xf6[\xe8O\x18\xc3u\xba\x8b\x9a\xeb\x08O\x10\xc1%\'\xaf6Q3"\xd0y\xcd\x97\x94\x1e\xb4\xa1\xfa\xa8\xc3\xc3\xe3\x0e\xa3B\xd7#mKE\n\xea\xb1Q\xbc\xb6\x82\x10\xbf\xb7\x19\xc2\x81x\x97\x05\xedO\xc4\xc4\x14{\xf8\xe7\xf0*\xac\xbb\xb4\xbaQs\x8b\x195\x90\x84\xd45*\x12\xf6\x82\\\xe4\xd7z\xea\xce\x0b\xe2\xc6\xe1A\xb0\xc0\x85hm/8\xecc\x03w\x88\xa9\x1a\x0c\xf5\xae{\xce\tc\xcd\x1f\xa6\x9eS\xe2P\xe4\x17\xdc\x97H=s\x05}A\x0e\xd4j\xd3\xad@\xf8\xc3\xf68\xe4\xf1\x97\xb5\xf1\x06\xd1\xf2\xd9\x8a\xc8r\xd5\x11\x9a:\x02\x1f\x17-\x01\xca+br\xb0\xe1\x8d\xaehF\xff\xb7!\xad\xa9]\r\xbd\xfb$\xdb\xcc\xa9\xa8u\xca\xc7M~_\xcb\xa4\x18\xa4v\xee\xb2q\x0e\xfe\xf0\x83\x81\xedy\xf9!<\xb1{PQ\xcf\x10ErX')
1
+ from sqlalchemy_serializer import SerializerMixin
2
+ from flask import Flask
3
+ from flask_sqlalchemy import SQLAlchemy
4
+ from flask_admin import Admin
5
+ from flask_admin.contrib.sqla import ModelView
6
+ from wtforms import SelectMultipleField
7
+
8
+ from sqlalchemy.orm import backref
9
+
10
+ from flask import Markup
11
+ from dateutil import relativedelta
12
+ from hiddifypanel.panel.database import db
13
+ import enum
14
+ import datetime
15
+ import uuid as uuid_mod
16
+ from enum import auto
17
+ from strenum import StrEnum
18
+
19
+
20
+ class ProxyTransport(StrEnum):
21
+ grpc=auto()
22
+ XTLS=auto()
23
+ faketls=auto()
24
+ shadowtls=auto()
25
+ # h1=auto()
26
+ WS=auto()
27
+ tcp=auto()
28
+
29
+ class ProxyCDN(StrEnum):
30
+ CDN=auto()
31
+ direct=auto()
32
+ Fake=auto()
33
+ class ProxyProto(StrEnum):
34
+ vless=auto()
35
+ trojan=auto()
36
+ vmess=auto()
37
+ ss=auto()
38
+ v2ray=auto()
39
+ ssr=auto()
40
+ class ProxyL3(StrEnum):
41
+ tls=auto()
42
+ tls_h2=auto()
43
+ tls_h2_h1=auto()
44
+ http=auto()
45
+ kcp=auto()
46
+
47
+ class Proxy(db.Model, SerializerMixin):
48
+ id = db.Column(db.Integer, primary_key=True, autoincrement=True)
49
+ child_id = db.Column(db.Integer, db.ForeignKey('child.id'),default=0)
50
+ name = db.Column(db.String(200), nullable=False, unique=True)
51
+ enable = db.Column(db.Boolean, nullable=False)
52
+ proto = db.Column(db.Enum(ProxyProto), nullable=False)
53
+ l3 = db.Column(db.Enum(ProxyL3), nullable=False)
54
+ transport = db.Column(db.Enum(ProxyTransport), nullable=False)
55
+ cdn = db.Column(db.Enum(ProxyCDN), nullable=False)
4
56
  #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
57
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -1,5 +1,60 @@
1
- # 2023-04-08T16:23:20.342544
2
- from pyarmor_runtime_000000 import __pyarmor__
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\xae\t\x00\x00\x12\t\x04\x00^\x8a\xdd\x17\xef\x16\x07\xa1\xdb?\x15\x10U\xc9B\xa2\x00\x00\x00\x00\x00\x00\x00\x00BR\xb0\xfae??c\x0bE=\xfb\xcaUj\xb6]\xef%\xdf]\x88\xb7!\x18s\xe6\x9fGM\xf5\xf9\xda\xf0\xf3\xac\x94\x08\x83\xf6\xd8\xea\xc1\x84zrRM\x9f\x04X\x92\xa7MQh_>\x7f\x8c@TN\xd1\xbc\xf6}\x17P\xb1\x9a\xc4\xf7\xbf\xd9\xbd\x9c\xbbK\x8a\xbcb\xa7\x0b\xfa\x1c9Cl\x90\xd9\x86jU\xea\x9cs<\x08\xa2\xde~]@\'\xd7o\xdc\x8d\x14\xa5\xe2\xba,\xc7\xff8\x05\x0c\xb7^\xcf\xec\xb5\xf1^\xa7j\xcc`=\xf2Ik\x18/\x1diF\xf5+#YZU\x86\xe5\xdb^O<\x8dm\x1d\xfe]\xcf\xbcd\xcf\xb8g\x96Mh*X\xbfs_oH\x15\xb3U\x82i0?\xab\x94\xcd\xaeij\xd6\xfd\x9dd\xad\xf1\xd8eJn\x7f/p\te\x9b\xf0U\x93\x81\x13P\xc4fqQ\x0ba\x08\x8f>\r2\x16M\x14\xa1\x06\xc3j\xe5v\x80,\x1cfk\xff\x96\x87.\x96]\xf0\x14Z2\x13\xd7&\x9f\x86\xf2/d\xc4\xeak\xe0@\xda\xab\xcf\xd0=<>\x05\xcb\x98\x12m!\xafz\xae\x875\xd2\xe6U\xd6\x9c\x93\xc1}\x8d\xa1<a\xbd*\xd4\xbbe$\xbd\x02\x85\xc5\x91\x1ee\x85\x82cX\xb9\x81\xa1ZA\x99v\x03\x98\xec\xb0\x9bP\x1f\x84\xe7\x9fSt\xf4[Vu+\x94\xfa\xc8\r\x894\x0cn\x99o\x03SGx\x9e\x13\xf8E\xd4g\xeb\x03n\xa0\xbeI\xd1?\x8bT\xd5\x1ec\x8c\xac\x8c\xec\xf2\x0e\xe6\x17L\xb8$s\x92R\x06\x00\xc5\xd18\x86\xa0\xb3\xab<\xb3%@m\xf8o\xd9\xe4z_\x8f\xeb\xf93\xe7QuYG\xf6-\x93#B\xc7\xfb\xc5e\xa9\x1b\x1d\x01a\xbf\xe6\xa9J\xa9\xe3k\x07\x16\xdb\xfe\xeal\x03\x9eN\x86\xa2\xcd\n\x18\xc8\x99\xaci\x8a~\xe5/\xfc\x13\xe8-,K\xab\xf4-\x02<k\xf4W\xf7\x02\xaa\xe0\x1a\xec\x9dZ}\xb1\rv\x06\xd6\xb2\xc0\x06\xd9\x97\xa9\xc5\xec\xf1\xaa\xe1\x15*\x12}\x18J^\x00\xa7\x99\xcbV\xa3}\xf8\xde,t`pk\xd5\xc03\x83\xdc\xc8\x8fC\xc9\xfb\xc55\xf213C)<\xac}\x95-|M\x03[=\xb0\x1c-+u\x02\x9d\x9a\x88\xa4\xcf\x95d\xadJ:\xeb3\xf8\xb6\x86\x98\xd2\x10Em~p-\xbe\xc1\xbe\xfc\xd9v\x1a\x075\xd6H\xdc\xa1\xde\xfa\x18\x9bm\xd7\xb7\x89x;\x7f\xca\xa2\\\xa1`F\x10\x9c \x8c?\x04B\x82\x90A\xcd\xe8O\xc5\xf3\t\xdd\xaf\xb14\x86\xc0Gj\xcb\xb3\x7ff\x1a\xbfy\x17G9\xd5\x93h\xdb\xfc>~\xec\xe52\x19&\x88^\xdb\xa7\x1f~W\xcaS\xf7*ojl\x87\x00"~,\xb8j\x80U\x19n\x91S\xe36b\x1f\x91\xd6]\x83\xb5\x11\xc2\xab\xd2\xb0\x06zL\xa8\xb9l\x10O\rs\xb3F\xbc\xcei\x87\xd7r\x1c\x82rU\\\xc5\xe8\x07\xd7x\x06T\xd76\xe7\xf7W$\x9ab\xc3O\xf1\x84\x86\xf6\x7fFU\r?.\xf6\xfc\x90G3\x1f\x08"\xdd\xa8\xd5L\x889\xb6\x17\xea\x15\xa8\x18\x1bH\x9c-\x83\xeb\xd6\xe3\x00\x101XR\xd3\xf6\x97\xe4\x91e+\x90\xfcs\xbf\xcc\xec\xe4\x9c\xbb\xfd\x08\xac\xe8\xb3\xa5\xe0\x18z\xc7\xfd\x8e6\xf0\x9c\xf8\x03q\xdd\x85L\xb85\xdb^W\x82{\n!\x1bf\x1c\x1a&\xd5\x91\xbd\xa1"\xec\xe6\x90\x9b\xb6vm\x9b\xd4\xcd\xbf\xd4\xb4\x11Q\xb1\xec\xb9\x19\x8b\xc1\rUe\xefg\xae\xaactez$h\xf7\xebE,\xff\xb6\xb2\x8aR\xbb%Z\xadvu:<[\xbd&\x1f}\xacqT\xb2\x0b\\Gh\xe8C\xb1\xcdY\xbfA\x93\x08\x9e\x0fI%>\x7f\x9c\x8d\x00\xffo\xb2t\x157\x1eID!&;\xb0\xa4\xf9\x12P\x98\xb6\xa9+\xb5\x11Vn\t\xe7\x01\xf4\xf9w\xbe\x89\xa2o\x95\x9d\xbd\x07\xdf\xe5\xf8z\xdbC\x9c\x1fR\xc0$\xd2[\xd1 <\xac\xd3\x05\xb0\xac\xfcxS\x88\xcd\xc6\xc0K9\x0b\xc1g\x15\x13<\x11\'>>o\x1a\xf5\x0c\xc2\xccb\xd4\xa3\x85\x9d\x9a\x0b8CDs?\x90\x89\x84\x91\x93\x83\xb4t2\xddUCU\x85\x04c\x15\xe3\xc8n\xfb\xf5H!\xd4\'j\xe9C\x89\x0e\xa5\xc6b\xb1\xda.t\x9e9\xe9\x9eL/\xc0e\x13\xf0\xa6\xd4\x89\xaa\x92Z\n\x06H\xd0\xa9\xe9\x83\x84\x80\xfcC\xf2\xfa\x9e\xcf$!\xcb\x05\x85\x15\x1d \xe5\x08\x8c8\xd1\t{jZ\xc6\x08\xb3)\x884\xb6S\xcdG\x18l\x8bs1\x8e\xcf\r8\x98\xd1\x0e\x9a\xdb\x0bA\x02\xef\xad\x8a;I\xa0\x1fB\xf7\xf4X\xcfv\xaf&\x18o\\\\\xb3\\#Z\x00\xcf`\xa4J\x08\x8bL6\x07o\xb8`\x9d\xc2X\xea\xb5\xdaG\xb7\x0c\x91\x94C]\xb3H\x890\x9d\x87\xe7\xb8\r\xa5Q\xc6\x90\x9a\xc7j\x97\x85\x17]\x8eZ\xc8\x8b\x9d\xe5\xd0\xf5\xbd0\xb9\xfaK\x11\xd9\xe4\xca\xe0H\x15\x85\xea\xd1D\x0b\x85\xc17nv-}\x05l\x01Z\x815\xb6#\xaaB8\x19\xa7\x97M\x1f\x91/\xb0`\xc6\xe4}\th\x94\x96F\x02\xd1\x9c\x9d\x97\x97\xa7Z\x93[\x1cBW\xf81\x81\xa1_\xdc\xd5\xc6\nKi\xaf0\xa1c\xd3aM)JS8\xb77\x08OY\xb8\xac*\x04\x82\x1a$\x16\tn\xba\xa7V\xf1M\xce>I\xa2\xe2\xf6\xa9\xb8\xd0\xd9\xebs\xc0f\xc0\xb9\x1b\x1c\x8apQ\xa2\xa3c\xd0\xd1\xd1\xffc\x91\xc4\'\x02\x18\x06\xaf?Z\xf6\x9dG\x9b\xec\xa16C\xb6\xf4\xa3\x00\xaa\xe0\xda\x9d\xc2d|\xc6\x02(\x0c\xbb\xab\xca\x13\x94_\xe2\xdb\x91p\xd7\xf7\xc8k\x07\xd8d\xc0}\xeb\xb0\xd9\x81\x7f]\x87\x06I\x88=\x05\xd9i\x00y\x80H\x833\xce\\\xe4\x1a\xe5\xaai)\xb9\x0c\xc3\xbc\xe0\x11E\x85\xa2H\xaa}\xff\x86\xb1(\xcas\x7f!\r\xd9\xb5\xc4\xf2\x98\xee\x18\xe6\xbd\x14\xa6\x11b]\x10p\xd3?\xe9\xe7o j;O\xb5\xab\x19J\x80Z0\xeb\x90\x9cK\x96g\x10`M\xf4w\xa0#\x93\xaa\xaca\x08M\xd4\x07\xa8^[|\x9au\xdf\xe2\xbeb\x00d\xa2b\xaf\xcf\x96\x96[z\x9f-\xe5\xd2!\xbc\xd4wT\xadh\xe8Af\xee\xfa\xe1\xb5V\x17\xfbC\x1a\xef\x02\xb8\xd3%[\x1b\x99mv\xf7\xf1qRw/\xce\x80\xf6\x8c\xb5V5\x9b\xfe\xba\xf2\xe4l\xe0r\xce\x8dc\xd1y\xb6iI\x8b\x13k[\xfa\tjk\xaf\xe5F\xf9\xf3+\xf5\x7f\xdf\x89|\xc6\xa0\xd2\xcc\xa4\xc7\xbc\x81h2/A!l\x13\x07\xe4G\x7f\xe2\xac\xb3\xc7E\xaa\x98_\xdco\x90\xe1n\x86|\x03<\xb3[\x10\xc6\x90\xc8Lq<\x01\xe0A\xd3\x8f\t\xeb\x1d\x8f\x86\x8b<\xa6;\xcc\xc6\xe2\xa3~\x9fG\x94u\x89\xdaP\x84\xef\xb6V6R~\x9cM\xe2\xe9b\x07_c"\xc4r\xdcs\r\x81U\x86\xc4f\xf3z\x7f\xf2!\xec\xa7~\x96=\xa4\xe5\x0cT\x06\x0b\xb2\xdc\xc2$\x88a-\x00\xc9\xd8)\xe1L1\x89*\xc2\xf0\x03\x1e\xd8\xccr\x89\r9\xb5\xf0\x1b\xc4\xc7\x8d4\xe4l\x13\x8e\xb7\xa2\xf3d\xb14\xc7\x1eU\x05C?.\xab\x94\xa6RX\xf9\xe8\x01\xaf\xd5\xd69\xbf\xea\xca&-\xf5{t\x1dQ\xddZ\x86\x1b\x05\x7f\x81di\xec\xa7\x9d\x7f\xd7\xa8\x12\xc8\xda\x05\xcb\x17,ln\x8d.\xd6\xdd\x10\xcd,s\xe4\xfc\x97\xd1I\x82A7a\'Vc\xb8\x92lG\x1e\xfd\x96*\xbe\xcf#\xde2\xe6"\xae\xcc\x1b\xb4\x0f\xe6\xb0{\xcc\x98ya\xd6!D\x9b\x1e\x8e&\xb1S\x90\xf8\xa9\xe26\xbd\xdaH\x9f\xdb\xda\xa6\xda\x01h\x95\'[_F\x1a\xe2T\x08l\xc9gV\x86\x10\x96\x05\x1c\x97\xf0R\x86jOR\xc4/\x9f\xd5\x97\xde\xbfR;O0t{C\xcbj\xbc\x9dq\xabT;QA\x14I;\xf3\xbc\xd3\x00=\xdb\xb6s\xc2\xb5N\xb3\xc0{\x9fJ&I\x0c?\x1c\xc8:\x85\xac+O\xe5\xb4\x08\xe2\xe4\xc7\xf1\x0cM\xaa\n\x9b\xe7\xaat\xff\x9a\x86G6\xc6UV\x8a\xe7\xfa`\xcdU;N\xd4\x19\xd5\x87\xc4\x02\x07\x82g\x94\xf8\xe5\x84\xad\xc0\xb0*\xab$)fJ\xad]\x9c\xe6xF\x90;\xe2\x8b\xa5\x08(\x96pU\xf9;\xe3\xec\x0e\xae\xc6\xd4\x9c\xfd\x12y\xf14,zk\xbd\xfbc\x8d\xa6{l*\xa4\xe6o\xce\x84c\xb4r\x07h*M\xd1\x0c\xf7I\xfc\xb8,cA\xcb\xa9\xee\x90@\x01Ah\xfe\xca\xbc\x80\xc2\xc0m\xf8\x9cv\xbe\xe4\xb6\xc4@<\xa5tZkC\xa6\x16\x9ba\xf1\xfb\xa7\x80\xb0\xa1\xc0\xeb\xac\xb4=)-n\xc50\xd8\x92\xd4)\xb6\x05K\x90\xc4\xa7g\xabk\xd4\xb6\xc8\xb5k\xf1\xae\xc1[\\\xf4\x15c\xf9\x8fl\xf5\xd5\x80b\x84R\x06\xb4\x06v\x91\xb9\xf8\x17v\xa9\x02I]\xc6k\'\x18\x94%\xc7{2\xbc\x8f\x17\x94\xa6\xa3R\xb8X\xf0r\xeb\xc1n\x17{<U\xcc\xb0\xe42O\x9ec\xa4\xfc5Ae|\x10\xa8\x82-x\xcd\xb4\x1e\x9e=q\x9a\xc3\x88\xcd<Sm\t^\x04x\xe3\xec\xf4*x\x02\x86d\x163_\xed\xa7453\x05\x0b \x99\xab\xe7\x88`\x8a6k\xab\x9e\xae\xd1uP\xc8\xaa\xca\xc6\x99\xe6\xc2\x1eJW\xc7=\xb2\xf8\x0f\x88/\x15K\xe9\xa5\x8e\xf9\xc5\xb2\xa3C%\xc1/\xcd\xd5\xd7J\x9e~\xd1\xad\x88\x149\x9bK=e\x85\xf7\xcf\xdcrD\xf2H@\x19\x82<X\x9fQ\x04e\xb7w\x90\x04\x18\xf0\n\x12X|\xba~\x94Z\x08% \xaa\r5T\xda\x18\x90\xb0x[\xc2\xc1a\x0by\xd2\xe4\xa1\x12\x19\xfdgU>9\xd29\xf6C\xcb@\'\xcc\x1f\xd5\x8d\xec\x18\xa3\xfa%\x94o\xb4F\xaf\xab\xe1\x9c\xfb\xf4\xc2\xe6\xefq\xe3a\xc3\x1aiA\x88\xe8\xcf\xc9\x94\xb6\xb5\x91g\x8c\t\xa3>n\x83!\xea\x93\x0e({\xe6\x1a\x98\xab\xff}\x96\xf20\x82gm\xf74\x8f\x9eg\xdc\xeb2B\\\xfe\x8f\x8eK8Ct\x96\\\xa1\x90N\xae)\'VT`\xe3*\xe6-\x90d\xa8:\xb4\xea\xf4\x1a\x86Q\x8d~\x0f\xcd\xcd\xfa\xc8F\xad\x01\x89\xee]x\xa6:er[\x1b\xd1')
1
+ from flask_sqlalchemy import SQLAlchemy
2
+ from sqlalchemy import func, column
3
+
4
+ import datetime
5
+ from flask import Flask
6
+ from datetime import timedelta, date
7
+ from hiddifypanel.panel.database import db
8
+ from sqlalchemy_serializer import SerializerMixin
9
+
10
+ class DailyUsage(db.Model, SerializerMixin):
11
+ id = db.Column(db.Integer, primary_key=True, autoincrement=True)
12
+ date = db.Column(db.Date, default=datetime.date.today())
13
+ usage = db.Column(db.BigInteger, default=0, nullable=False)
14
+ online = db.Column(db.Integer, default=0, nullable=False)
15
+
16
+ from sqlalchemy import column
17
+
18
+ def get_daily_usage_stats():
19
+ from .user import User
20
+ # Today's usage and online count
21
+ today=date.today()
22
+ today_stats = db.session.query(
23
+ func.coalesce(func.sum(DailyUsage.usage), 0),
24
+ func.coalesce(func.sum(DailyUsage.online), 0)
25
+ ).filter(DailyUsage.date == today).first()
26
+ users_online_today = User.query.filter(User.last_online >= today).count()
27
+
28
+
29
+ # Yesterday's usage and online count
30
+ yesterday = date.today() - timedelta(days=1)
31
+ yesterday_stats = db.session.query(
32
+ func.coalesce(func.sum(DailyUsage.usage), 0),
33
+ func.coalesce(func.sum(DailyUsage.online), 0)
34
+ ).filter(DailyUsage.date == yesterday).first()
35
+ users_online_yesterday = User.query.filter(User.last_online >= yesterday, User.last_online < today).count()
36
+ # Last 30 days' usage and online count
37
+ last_30_days_start = date.today() - timedelta(days=30)
38
+ last_30_days_stats = db.session.query(
39
+ func.coalesce(func.sum(DailyUsage.usage), 0),
40
+ func.coalesce(func.sum(DailyUsage.online), 0)
41
+ ).filter(DailyUsage.date >= last_30_days_start).first()
42
+ users_online_last_month = User.query.filter(User.last_online >= last_30_days_start).count()
43
+
44
+ # Total usage and online count
45
+ total_stats = db.session.query(
46
+ func.coalesce(func.sum(DailyUsage.usage), 0),
47
+ func.coalesce(func.sum(DailyUsage.online), 0)
48
+ ).first()
49
+ ten_years_ago = today - timedelta(days=365*10)
50
+ users_online_last_10_years = User.query.filter(User.last_online >= ten_years_ago).count()
51
+
52
+ # Return the usage stats as a dictionary
53
+ return {
54
+ "today": {"usage": today_stats[0], "online": users_online_today},
55
+ "yesterday": {"usage": yesterday_stats[0], "online": users_online_yesterday},
56
+ "last_30_days": {"usage": last_30_days_stats[0], "online": users_online_last_month},
57
+ "total": {"usage": total_stats[0], "online": users_online_last_10_years}
58
+ }
4
59
  #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
60
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product