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,226 @@
1
- # 2023-04-08T15:11:14.279655
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\xc9)\x00\x00\x12\t\x04\x00\x0c2w\x8f\xd9c(\xab;M\xc6\x85>\xf7(0\x00\x00\x00\x00\x00\x00\x00\x00H\xf6\xf2\x8b\xbb\x13h\xad\xc3\xfd\xec\x94\xe8\x92\xa3e0"\x16\xae^y\xed\xfe|h+s7\x7f\x88hq\xc1\x10WD\xd1K\xf0\x1f\xc1\x86\xc7,\x00\x9f\x12_\xbb~\xfd\x06\xb6>c\xd3v:\xfe\x07\x9a|\x04\xb2\xd6vV&[--\x97Jc)\xcf\x86\x8c\x8d\x10-\xbc%\x16g\xc2\x181\xb9\x1f/y\xd0\xa6{r\xe3\x01\x12\x03w_qg\xd6\xb2\x897\xae\x1e\xed\xf4\x16\xdcoU\x1b\x89\xeaad?\x94\\$~\x8bK\xf4\xb6\x15s\xa4*\xa9S\xf9\x8d\x1d\x8bX3\x12O\n\xbd/\xe6\xc7$\xbe\x95\xa3OSF\x14\xa7\xb6T3\xc1\x8b\x12S\x1f6\x91Y\tbrlg\xeeaJ2\'DEI\xebk\xed&\xa8\x1c\xb6\xc8&\xa0D\xa9\x10\xd7\x86o\x01\xcc\xee`\xc6\xd5$k\x13e\xdaN\xb1G\xd6\xd6\xb5\xf5\x19\x84\x0f\t%!W\xdb{y\xa1\xa6\xa8\x03\xd2*\xcac\xb5\xdao\x8a\xcf\xfe\xa0\x8bE8\xb3ZI\xfe\xe1\xdbh\x87\x0c\x1e\xc9\x13Q\xef\x115\xc0H\xb1\x14\x1b\x99/\x08\xac\xe3\x1fu\xdaSj\xf4\xa9ri#y,\xa5\xad\xf5\x8ex\xeb\x0b\xcf=zc\x00?#\xb1\xffX\xda\xab\xbc&\x06\x16\xfd@9g;\xad\xa5\xd1\xf3n9\x8d\xe3\xe4\'\x92\x02LB\xfd\xe8\xbd\xa8m\xef\xe71\xb1\x01\x84\xaeVb/\xa0\x1f&4"\x06\xad\xa8\xa2\xd0\x0b\xf9C\xf3\xbb\xdd\x9b\xc7\x8e\x0b\x00\xca\xc6)\x9d\xc4\xf0a\xa7z\xf3\x8f\xf4\xbb6\xb9k \x93\x813\xa3\xd4\x9b\xcd\xba\x90\xb3o\x9c\xb4\xfb\x86^;\x85H1\x0b\xf5\xdc)\x98p\xfa\xd7]\x89\xec\x80\xb5j\xe0\xac\x03\xf5\xfd\x97a\xd0m\xa7JY\xf7\xbc\xe3\xd5\xaa\x8aS\xa1[m\xef\x14F\x11\x0f\x04c\xcd\n=ra?\x88\xa7\x05<\xe2\xebO\xde`\x99O\xefZ\x99j\xd2\xf0~\xc2\x9b\xdb\xc4\x14I\xd9\xb5\xce\xf2!t\xa4\xc8\x82\xf3\x96\x19\xcc\xb3>p(H\xdb\xb56\x9b\xa3y\xd6\x8a#\xe1+\xcc\x05\x9f\xcb\xd2\xc9\xc9X\x92\x0b<\xdd\x88\x8e2\xb7\xcc\xe5\xb2,\xf2\x10\xed\xc6\xe0|,h|)\x02\xf6\xebv<m\xe9V\xc2\x08\xa3\xf5\x03a\xea<\xcdX\xe1\xa2\xc0kA\xe9\x19r\xb8\x16\x94\xb6\x9b4\x915\x11#\x19\xf1cR\x95\xbf\x9e\xb9\xb9;\xcan~p\xd8aDZ\x94\xb3\xd1aF\x85\x8e)\x8ab&\xf1T\x07\xb0\x10\xac\x08\x92mZ\xc0\xcdh_,:\xb3\x19\xaa\xd5\x83@\x17?\xaa\x02\xbb\x9aH\xf3\xf8\xb9\xa6^\x85-\x82,C\xce\x0bp\xd9\xd0\x0b\xcf\x01Z\xba\xe1=\xf3Q\x14k\xd9\xdd\x1d\xa5_\x18\xef\x07\x96z\xb8\x81@c\x8fI?\xb0\x98\xbb\xd8#\xad\xb5\xe3J\x9d\xda5\x02\xc1\xedF&\x83\xf3\xf2Q\xadK@\xfb\x9d\x8a2,\x14\x13\\\xa2^\r\xc2\x97\xefY=\xfb\xb9\xda\t\xf9-.\xafq\xe0\xa8\xfb1\x02\xfa%@t\x07g\xc2;\xe5\x98d\xc5\x8ah\xe5\xd7#\xc7\xfat\x12g\xad\xa4\xa0;\xcb\xa3\xcci\xa4\xd8\xe8\xb4\x07\xd9\x0c@\xadL\x8e\x03\x07\x98!\x11=~\x8e\xb6\xc92\x83\xd2\xdd4\xc7\x18b\x03+\xf5\x1f\x86s[\x83\xe4\x9aB=\x7ft\xa4(\xa6\xd4\x06\x8fl\x80c\x9e\x00\xc9HrF%32"F-\xe7b\n(\xd5c.)\x84y\xa5\x079\xe7g:\xf1w\x8aS\x19\xaa(\xdaa\xd8\x9f36\x9b\x1a\x9cj\xb9\t[B\x06X\r\xdfn\xf5)\x1c\x8f\x88\rP\xac\x0f\xbb%k\x8f@\x89\x18P,\xafr|\xe3\xd3gs\x82\xa9u\x9d{z2&\xb0O\xb6\x14\x9f\xc7s\x87\x91\xf2Xf\xe3K~;\x88\xa9\x8b\x1f\x02\\^\xe9e\xea!\x1b\xe8\x94\x15@\xbc\x84\xfe\x86\xe0}\xbd\x16s\x1a\xe8\xb1\xb8(\xf6U0\x84M\xac\xe0uj\x82\x0e\xdc\x1f\x96\x95\xa8\x03\xf3k\xe6\xdd\xda.\x0cJ\x9f\xdc\x0b\xfa\xa1\x04\x89\xbc\xdd\x0f\x02\t\x9c\xf8W\xb8\x84\xd3\x99\xfe\x14\xbe\xee=\xbbo\x03\xe2\x9f6\xf6~k\xdbc\xaaf\xafg\xe6\xddY\xd1V=\xcc\x8fc\xe1\xf7\xa0\xe77-\xb1>"p\xb0$:[\xa6\xaa9\x01\x05\xadM\xcf\x9b\xbdTW\x1a\x96\xd6\xbf\xfd\x9cR\xd6\xe2\xfe\xc6\xa1\xdb(\xc2\xcb\xcbk\x8dF>\xe0\xc9\xc8Sp\xecr\xd0\xf0\xdd0\xbf\x0c\xd4@s\xf3p\xacfDV\x9dYR\x1fd\t+\xc2\xd1\xde\xd1U\x8f\x8d\x89\xb3\xcfTUA\x18{.w\xfe\x19\xcd\x01\x14qTh\x1c\x9e\xb1i\xef\xbdt\xe25\xe0\xc6\xa6=\xf6O/\xfc\x08\x08\x05\xca\xfcj\xe2\xa3\xaf\xb6\xea\xed\xfa\xe9\x04\xcb\xa2\xe8\xd3d\xdf|\xb1\xfa\xe8\xa7!s\xe1\xf8E\x83\xa6xC\xa4\xed\xeb\xb2%\x96\xf8\xac\xf4Vu\x16\xa4\xee\xc4@\xcc\xac\xc9n_\x0e\x16\x03\xb3\xffP\x7f\xa8\xc3\xc0<\xb4iOk\x1f\xedg\xbd\x02\xa6\xe2\x89\xeb%\xd9U\xc0\x05\n\x1cU\xb5\xd2\x08\xa34~\x18\x8d\x9c`p\xa7T\xe0\xab\x1c,+\xe3\xe4\xa6RV\x9c\x17\x17\x82F\xa1\xe2\xdd\x05\xbf\x1a"\x19\x98\xbc`<t\xdcBt\x1c\x17<\xeeqf\xf0F\x1dn\xb7C-nTo\xe7\xf2G\xb3\xd0\xc0h3\xfd\xba\xd04\xc5\xe1\xf5%@@\xea\xe3\x0f\x05v\xfd\xdb\x9e\xa6yU\xc1\x00\x96\xbdo(\x80Z\xdd\xe7\x12\xa4\xa1@\x8b\xca,,\x1e\xa4\n\xdb)\xab\xbb\xa42\xde.\x13n\x9a\x1cVVw\xeck\x7f\x9e\xc9g\xa8\xad$\xa7")\x19\xad\xc3(\x88\xf3\xfc\xaf&j\xfcd\x98\xe0\xbd\xbc4\x0c"\xb0\xb3\xa9@\x81\xf9o,\xc8Y\x85\n\xe7:\xe8;\x80os\xc4S\xf1<-9\x0ew%g\xa7\xd6K\r\x80\x95\xbd\x04\xf3\x18^\xbc\xffu\xbc\xc8,3\xec\xff\xb3\xbefV9j\x10\xafQL\x1e\xb37\xb6u$\x83\xef\xdfP\x0c\xa8\x81\x9f\xcf)\x03\xb0\x10I|\x7f>7\x1f\xd6)\xdcF\xb9W\xe6\xe7\xc9\xa7R/{\x8e-\xf6\x1c\x14C\xba\xce\xf4\xc8b\x7f\x16\xa9.\x85\xfbI\x10kc2\xa4\xed\x00,\xaa\x833b\x9f\xe8\x96\xde"|\x91|M\x11h-A\x95`\xa5\x92V\x0b\x03\xbb\xdf7T\xba\xc3\x93\xc9\r\x18VP\x10*\xea`\x8b\x80\xe7\xa9\x90\xa5S=\x91$\xf5\xe8\x9c\xd8\xd4q\xdd=i"\xceI\x88\x18\xc8\xe4\x0e\xc7`\x16\xbc\xa6\xda26\xfe\x9e\xce\x97_\x07\xfa\xa0\xc6\x04\x8f"\xe1\xe5\x1e\xdft\x87&H\x1eMS:DO\xb9\xad\xbf\x9c\xb2\x1a\x12\xd7\x89%\n\x15=&\x10\xc3\xdd`d\x1f\xd6\x84\xd8o\x0fV\xd4a:k\x96RZ%\x16s\xbek\rmn\xca\x97\x82\xb2OU)\xea\r\x97\'\xf0\xb25@"\xdfI\xd9\xb5}\xd5\xc6uH\x92\x84\xe3\x9b\xf6*t;\xed\xbf\x8f\x01\x16|\x9c\xfe0`\xef\xf6\x087\xce\x81ax\xcf\xee|\xba=\x8ax\xb8\x84Q\x84E\x97\xb5\x87\xa7\x9f\xc0\x10\xbd\xa8\x15x\x08\x93@\xb0mO\x89\xab\xd2U\xea{D\xe7L^%\x8c|em\x8bs\x1b\xb0\x13\xf5\xcf)\xac\xc2?\x9bC\xa6\x13\xa1\xd1\xafR\xd9\x9ap_d\xbe[\x10`\x84\x9a\xdcl\xd4\x81\n\x8b\x07A\x1b^O-m\xc8\xf8oQg\x009\x803\x95awv^\xd1\xdc#\x1c\xd4zK\n\xce\xca\x0e\xc4\xf0&\xc0\xf6pfP&\x80\xff\xac\xab4n\xf0\xc7\xe3\x0cV\xa9\xf4T\xb8\xca\x149\x1fU\xcf\xf5\x01\xfd\xfaN\xc5\xbcoi\xa3cO\xf0X\xa6\xb2\xb2\x11\x89\xf96x\xff\xcf\xed\x86\tx\xb6\xea-,\xd4e\x83\x9a\xf5\xef\x9f\xaa\x08\x0f\xa45\xe1\xc5\x1e\xddO\xca\xef\xba\xac\xe4\xce\xa3n\xa6\x9b#\xbfY\x9b7aV\xb0\x1c\xcb\xd5\xf1\xf1\x021\xfd\xb2}=\x1an\xff\xdaX\xf6kL\x96\xc9\xd1\xe7\xe2\x92\xfb/\n\xd4\x83~\'\x01\xd9\xfb\x9e\xc0\xbf\xc0kg\xc7J\xf0\x0b\xfbs\xf5\x17\xce^\xde\xf8G{b;\xbb4\xe7\x12:\xce\x00\x0b\x14\x86\x00\x9e\xa5\x90\x970\xbdU\xaf\xcf\x14 t\x0e{\xa9\x92C=\xd3\xbe\xff\x8a\x80\x04*\xce\x16!R\xf5\x1a\xf1\xce\t\xf0o:\xc18\x9e\xe1\xa1h\x0eI\x92l\xc1\xdb\xb49\x9c\xf2\r\xfb\xf1\xe1\xbf\xed\xb0\xefj\'\xe6=M\x9b\xaa^\x84&\xff[\xecFL\xbd\\3\xc0CI\xbd\xb7"a.A\x9b"\xb6\x82\xfdN\x82\x96!;\x94\xea\xb6\xb1\xdaib\xf0"T\xe1\xabN\x95\xe8\xc1\xb7v\xc0\x18>J\x92\xc0j\xe5\t@\xb8[\x18\x00\xba\xaa\x08&dn\xa2q\xca\xa97\x08\xd2\xd8G\x0b\xad\xe9`\xe9\t\xee<>27\xb7\x8a\x8dP\xbc\xde\x8d\xce\x01\xa9\xf4\xcdx\xbf\x8fj\x9b\xc0\x80\xdc\x9d\x0b\xa1\x08\x8f\xa6?\x0b\xde\xb3N\xe8\xef\xaa\xc9\xd2\xb40\xd9\xc3\x1e\xc0)\x17\x13\xd7g\x8b<5s\xf79\xcc8\xdd\x8b\xc9\x97\xa98\xee\xf6\x99\x19\xb0G\x1dH3C\xde\x1f%\xd1N0M\xa2)\x02sPda\x98~\x06\x19a\x00v\x12\xbcP\xe4\xefB\xc2\x96\xfbB\xaa\x9e\xd5\xeb\xa5\xa84c\xb8I\xbb\x13\x02\xe5\xd2\xd9\xeey\x0c\xc0x\x97^o\x9eFie1\x80k\x9f\xe2\xd5k\x06\xd7g!\xd6\xe5\xbek\xf5\xf0\xe2E\x15\xc2\xaf:Q\x9a\x9f\xb9\x92\xc2s&~p\xadN\xc6F-\x8f4\x00\xf1l\xfa\x87<\x1cUT\xb1)7\xe0\xa4}\xd8\x9d\x17j\xe2\xb94\x05\xb1\xd2\x04\xb0y\xd2\xd3\x9d\xcdD\r\xf0\x9c\xb4.\x0c-\xfe\x02J\x7f2\xca\xa8V\xa2\xa5\xd1\xfc\x08a\x7f\xc6\xd8\xb3=\xc8\xac=\xb7A\x94r3\xbdu\x11\xaf\xf8\xb3\xa7\xf6\x9f\x12\xa5\xe0\x9a\xf8\x88\x96`\xb3\x83\x1f\x1f\xa0\xe3#\xe4\xd5\x8e\xc5\x95\x83\x14\x8e\xd8@\x86\xf7]\xde\x83\xbb\xcb\xa1l\x87\x15\xd7F\xdd\xd5\xe9\x85\xb4\xde\x9bje/%\xc9\xe6\xc5\xca\x19\xa4\xb1\xa1\x1c\x06\xd0\x8cbZ\xfa\xf9\x0fRh]\xb8C\x1d\xdc._\xab{\xbc4!\xd4\x06>Fv\x82\xb0\x15\xc7@\x15m+73\xcf*d\x9f)\x97\x1b\xf6\xb1\x90\n\x83\xb1\xb6\xb9\x7f-\x1f\x84I\xc4[O\x0c\xef\x93\xdd\x1a*\xdf\\\x1f\x9b\x04\xcc\x00\xbc\x1b\x80\x87"_o\xff*\xcde\xfe\xaf\xe9\xbaG\x1c\x8eR9\x12X\xe6\xa5\xce[h\x01\xc2\x11g\xb0/\xe3\xe3\'\xa8\xb7\xe4\xd5\x8f\x16Ec\xf4o\xac\xa9\xb3\xb7\xd3\x1em\x88\x06p]\xef<\xd7N\xf5\xa8\x8d\xce\xf3\xe2\x10\x14\xa1\xd8\xc6\x0e\xd2\n\x8dR\xa6a\x03\x07\xe7K\xf9D\x03\xb5Wo\x1d\xa8z\x0bB\xce\xad\xaf\x81i\xc8bq\xea\xf6W\xb4\x82\xb7ZLo\x9f\xa3\xdb\xd4j\x06\x9f\xffz\xd6A\xf77\xaf\r\x17\xb4\xed\xd6f\x19W\xf81\xab\x88"\xff<\xbf;j\xad\xf3\x10.\xc1\xd9\xd4x\x07\x85z\xa4\xbbY\xa6)\xd4t\xe4\xe8\xb9\x1f\x90 \xc1~\x10\ta[Q\x0b\x9b\x95W\xfebkT\xeb\x04\xe4um\xf1\xfbX}\xa5\x816|\xc9\xeb\xcb\x12|\x19\xaf\xd8\xe7\xc9\xd4\x86\x19\xc6\x05\xfd\xf3H\xad\xe0J\x88\x9d\x97\\@\xc5]\xe8\x82z^\'\x88J\'\x97\x98\x19\xd7\x9e+\x82j\xc5\x9d5\x04-\xb1(\x15\x8dR&\xdc!\x89\xc6uW\xa8P\x92\x1a\x9b\xa26\xc2M>\xde\xb9\xb5\xe7*.\xcd\xf5\xd8\xa2!?-\xcb\x07\x98b\xfae\xf5\xa0\xfc\xb8\xc4>y3[}\xffp\xcb\xa9\xb8\x9f|\xde3\xb0\xaf\x15\xff\x87\x1b\x88\xa3bwlgFi4\xb3\xe5\xafW\xae\xca\xccOW\x7f&u\x8d7"4\xe6#\x9d\xb41+\xb3z\x7f\xe3@\xcb\xac\x9c\xd5\xe1\xbd\x1fu\xb8\xcc\x98.B\xfb\x14\x93\x1d\xd9\n\xca~)\x1aU\x82\xa5\xb1\xcbdW\xbdKH\x8a\x94\x82\xc7X\x8f\x83\x93p\xfe\xee\x9b\xd0\xc4\x9f\xac~[\xb8\x8e\xc6\xdf\x8f\xa8\xba\xd8;\xc0oq\xb7\x1f\'F\x99\x8d\x0c\x13\xa8\xf9\xf3*H6R1\xdbJ\x081\x13\x04\x8e?\xf1E\x19\x82Q\x9d\xf7\xf8S\xf2\r\xb0\x1b\xde\xfc^\x7fJ\x8e\xbf3@\xf0K0;\xd9\xe6\xbb\xa0\xb8\xf1\x1bc"\xc0\x1e\xd5u\x83 \xe0\x85\x12\x99\xc2X\x07\xd7\x0c\x17b\x0e\xfaHR\xeb\xa4\x01C(\xbfVv\xa3O\x97y+\xad4\xf4_\xb3\xf8!\x89*\xe9ok\x17\xee\xbaCL\xa4\x0fm\xdf\xcf\x8b\xad\x89\x14}r\x97\xee\x96\x8e"\x8b"U\xa0XH5=\x047\xdb2\x9cWR\x9d\xc9\xb1\xa4\xb0\xbaJ}\x94\xd3t\xdb\xfe\xcf;\xff\xeb\xfe\x16\xa7\x96\xb0<\x9fR$\xc9\x191.X9\xa0}\xff\x1e(23\xd5Qc&*\xc54s\xad\xc9\xb4\'!\x9a\xf3\x8bO\\\x1a\xfc\xe3\xa1\x92\x92\xda\x02\xd0#\x9fn\x85\x8c\x84\x89\xae\x8a\xd8\x0e`N\x92\t,\x02y\xc1\xc8w\xd2\x8e\xa1\x84\xe0e\xe5\xb8Y4\xd5b\x9f\xd7B\xb3\xb5\xda:\xfd\x05\xa3\x0e\x8c?\x88\x95\xd5\x03\x1d\xe3\xfb\x89\xca\xb7\xed\x82W\xa5\xfe\xa3+\xab\xd28\xefy\xf4uq\x9e9\xf74\x94\x1f\x9f\xdbs\x15\xc4\r\x91*BG\xad\x98:\xef\x92\xbd\xb8\xe9t\x83\xac\x8cZU\xd2T\x9bG\xde|\xd6\x87\xab\x8d[\x9b\xe7\xb6\x01\xbb\x07\x80\x03\xcd\xe7\xf8\x01J\xd7a\xd1\x84\x04\x80\xe1\x0b\xfe_@\xcfK[\xc11=x\xbew\xf7-\x17\xc4x\xf31\xc75\xa0N\xe46S\x8a\x02(\x17\xf40N-%\xd3\x8eZ\x95\x03`l\xd4WU\xdd\xfd*\x13Uf\xfb\x19\x8a\xf7#\xda\x00\xca\x85\xce\xa8~\xbf\x11\x8b8\x04\x11\x82\x02\x8f\xf3\x83\xc2:o\x9f&\xd5\xb2\xa4\xac\x16\x81f[Z\xaa\xa4\xe8k\x10\x835\x90\x13p\xd6q\xea\x00\xd7\x90\xaf\xbf\xb21\x1bsv\x16z\xcd\x96,0\xfb\xb8;\xe8\xfa\xe8.c`\x0bA\x89yL\xc2\x8c\x1a",\n\xb7\xb7;\xff[\xfeo\xbe\x88L\xf0Ca\x12\'D\xf61se\xbf\x7f\xf1v\xaeaI(rY\xc0\x98d\xf0\xb8B\x8a\xff\xaa\xa8\x0b$H\xfc%p\xb5\xa1\xfcM\x85\xa3\x80?+\x07\x9b\xe3a\x16\xb7HF\xb2\xa8aQ\x00U\xe58i\xed\xf3\'\xd9\xb3\xe2)\xe8\xefL\xfe\xdc\xa9\xc9\xba\xdd\xc8-\x17\x88\xa5J\x88G#\xcc\xef\x1b\x14\xfe\xc9\nIy:D\x8a\x8bcHh\x9d\xc9A\xda\x07\xfc\xd0\x96\x96\xd1\x81\x81c\xd8(\xcc\xb8W\xceP\r8o\x87\xf1\x80\xab\x05\x97)\xb8!c\x13\x8d\xbd\x12g\xe6\xf7\x81\xda\x9b.!k\xc4\x99\x97n\x9a\x1f\x8fC\xf4\xb5\x86\xbd\xa6\xa3X\x92}\x8d)\xcd\xf33*\xb1A\x86\x0b\xfc\xa2-\xc4\xb2\xf3\xe8\xf9\xd5\xc8\x9e\xf0\xfe\xd0\xa0gv>\xb3\x19\xac\x0e5\x13\x83\xc4\x86\xd8*\xceb\xd1\x846\x8b\xca\xb4>\xfeN\x90vx\xdbL\xb1\x7f\xf1\rDC6}\x80\xd6\x96~tf\x94\xb5r\x92\xfd\xe0\x90\xf2`\xc7\xf0\xec\xe6\xe2\xe3h#\x16"\x9at\x10\xbd3i\xddM\x14\x8aym\xbb(\xaa\xc0\xd5\xd4\x00\x1bf0\xf5\xfa\xf0D\x05\x14\xad\xfb.\x9c\x00\xa3M\x96&9\xffJ\xb76\xd7\xc9\x89\xa7\x15\xa7M\x13 \xcb^q\xa72\xa8\xe8^\\\x12\x93k\x18>\x05r\xfeQ>\x8eB&fU"N.\xce\xcfe]=\xdaV\xe5\xaa\xfb\xb3<\xa9\x9f\x89\xe9\x93\xbc\x1f\xf63\xfbK\xf6\x1c\x17wDb\xb1g\xbf\xe4$\xd8S=^H\xac\xcd\x9c\x90\xce\xc6p}\x0e\xbe\x18\xaa\xaev\x14\x0c]\xf4S)9\x93v\xdf\xa8\xa5\x91?\xf1\x94`\x03\xc6\x0b\xef\x92*\xb6{ \xc7\xfa\x11\'\xaa\xe2\xd5a\x9f\x19Q\xa2 eg\xfe\x99C\xfc\x8ag\x87\x9eJ\x9f\xd6\xa60X\xdc\x87\xf2\xdb"\xe6\xd4[y\xda\xaf<\xe5 \x9e(g)\x9d\x97\xb3\x9c\x0e\x19\xa9q\xc9?4\'Q\x92\xdf\xa0\x92\'\xd4 \x1b\xfd%3\xbd\xe6A\x89\x86\x96\x98\x916\xedEC\xa4\x8b\x16\xfd\x8e\xf8\xda5\x9dj\x1a0E/\x91R[\x9f\x84\xa3\x0c\x16\x81\xad\xcc0*Wl\x06\x10(\x92\xfc\x03=hX\x1dk\xbd~M\xac\x06T\x87!\x88\xec\xb6\xf7\xf3\x07\x87R\xc4\xc4\xd3\x98\xb0%\xcc#\xd3\x12\xc4\x08\xde\x9fT\xa2\xc0\x85F\xbby\xe4\xc6\xf8<\x86\xe8\x05P\x1dS\x93K\xf2]\xc1w\xf2\xc7\xefFo\x80\x85\xe2\xe6\x06\xa7^\xa6>\xf9 \x99}\x9a5py\xbawg\x0c\xf2\xaf\xb4\x9e[xS\xde\x96\x181#Mr\xa4M\xd3M\t\x16\x88\xe9\x1d\xfa%\x85"Bx\xdf\xcd\xc3C\xda\x9998\r>\xa8^\x83\xab\xbf<\x90a\xfd\x9a\x7f\xa6\xc7N$\xe0u\xf6v\xd7\xf1\xad\xc5\x8d\x0e`\xa4\x05\xd3\xf6\x15\x8f\xf5%\x83m\x9bG"\t\xf1^!@\x994\x87\x1by\xbc\x05\x84\xfcx7\xc9\xfanx\xb3\r\xd1\x0c\x1a\xe9\xc81wAu\x96\x13\xaa\xc0h\x1f|\xfa\x85\x1e\xb0\x87h\x01\x118$\x8d\xdb8\xd1^\x01\xd9+\xa9-\xfa\xd5\xe7\xaeL;m\x08\xc1\'O\n\x80\xee\x8c,s\xf8\xd8\xed&\xc7\xbd\x83\x95cyR\xf3O\x0f\x866\xf9\xdfA\xf5\xb9\x90w\xf1\xcb}$\xee@\xb0\xf4\x14\x85\xa2\xcf\xa9Q\xc2\xa4\xbar\xc6\xbf.\xb2\xd4\xe9mn\x9fG\xa9\xab8\xb9T\xbc\xf90O\x94<\xef\x0fo\xcfY\xe4\xa0\xa9\xa9\xa0\xf7r\x9bp\x0cY\xbe\xb1\xc3k/m\xa8\xd9\x81\x99\x95\xbdK\xa7L\x1a\xe2\x04\xdc8Oj\xa2\xfd0\x88n\x80\xd6\xda#\x89Tq\x89\x08\x92\xdbX\xad\xb3v\xa1\x04\x0b)\x01\xb8\xe7\xea\xf9:</Q\xe8\xb7\ttK?\xb7\xae.\x12\xc0P\x03*\xe2\x03\xcb\x12#\xf0\x81\xd1h5\x8aA\xb8\x93\xeb\x9c\x91\xc9\xf6\xa7\xbe\xcbm\x087\xd4\xb0\x86lE\x99\xb4\x1c\xacC\x98\x18\xde\x97\x15\x17\xb63[\xed\xd81~XZ\x05\x88\xf1\x12\xf0\x92\x13Q\xde\xc3\xae\x86\x1fb[\xf9\xf9\x84\x88\x86\xef\xd1(:\x96\x1d\x8b\xaa\xdf<<\xbc\x90\xb3\x98\xb4\xe8\xc1\xe1\xdaI\xd5\x9dv\x84\xb7\xf3\xec\x8f\xdc\xa4Xs\xc7\x04K\xc3Y\xe8\x15\x01\x1c\xf7\xae\x15\xb3!q*\xb0\xe7\x89\xe6\x01d\x17\xf8\xbf\xc20zs\x02\xa7\xee\x8c&{\xeb\x1f\x964\x875"M\xda]\xaa\xc7\nN\xfcDI\rD\x1d\xe7\xda\xb7\xacQ\xd0\x82\x01p\xc9\xcc~\x19U\xf64[\xd7\xb4\xcd\x848\xd3\xb0\xa8\x87\x86\x9b~a\xa7\x1e\x93\xd5w\x87\xdas\xb3\xcb\x97\xae\xbe\xd3\xcf\xb0]x\xda\xd5\xc8\xb7\x17J}Um\'\x1c\x1e|\x00\xb8\xb8u\x1bN\xf8\x99\xf9\x17\xa0X\x80\x10\x86#\xc3\xe0)\xad\xed6\x93\x91.R\x1b+\xaa\x9f\xd7\xdb\xe1N\x92\xa8\xe9&\x05\xaa \xc3a\xb8\xe0\xa4\xa7<\xf7N\xa9\xdf\xd5\x0cxk\xdd2\x07\x16\xd9e\x8eV_,\x9eO\xf4\t\xd5\x8c<|Ck\xccw\t\x86\x18&Q\x8c\x96w\xf2t\x12\x94d\x1ec[&\xf1wX}\x8d{\xa4t\x0b\\W\xab\xbd\xdf\x00\x8b\x80L(\'\x93\x01\xe5\xfe\xef\xcc+2\'\x97*\x18\xfc\xde\n\n\xad7\xf1\xeb\xb1\xdfb\xfd\x9d\xc4D`FL\\X\x9d?R\xfc\xcf\xf7\xfe\xb0v\xc5\xc4\xcd\xefY\xc4\x84\xb2 \xdb\xbe-\xacx\xed\xef\x9e\xe5\x14\xb0\x02\'\x0f\x8b\xc80\x1c\xebZ6\r\\3\x91V\xf6\xbe\xb4B>\xc1!\xf6x\xa1lZ\xc9OL\x88\xd1\xc7\x0f\xbf\x95\x87\x98\x98\xda\xa37\x8e\xa4k\x82]ak\xb5R\xcb\x0cA\xf7z<vmb\x08\x10\xe9k@\x89\xfa9v\x17}\xb1\x8d\x14\x92\x04\x11\xfa\x00\xc11\xd1\xa5\xcf\x99v6\x84\xea\x02o\xe5_\x8bW\xd5D\xcf\x92\xbc\xdd\x1c\xbd*+\xf8\x12E\x95\xf9\x1fK\xc0\xc9%\x0c\xf4\xb6\xc1\x90{\xd6\x84"\x92\x83N\xc0\xc3e\x97\x0b\xc4y\x1c\x1e\x1f3\x08\x08\xe1\xa3G\xf4\xa2\xe94\x0e\xfehvt\x81\xb7\x13z\xe1\xa0w\xa7\xb7\x92,\xe9B\xabX\xd5\xb1\x07G,\x81\xa8\x00,\xd40\xc3%{\xa7\n\x92\xeaX\xf5=\x9a\x16\xd2Z-<\xf1+\xf0\xf2\x06W\x0e9}\xe7JM"\xadj\xab\xaf\xe9\x83X\x19?\\\xc3\xe94\x16\xdb\'\x92~C\xf3\xe3\xc8\x83<GZJ}\x15\xabx\xa9\xab\x9a\xc1\x81\xa6\x04\x03\x9f\'\xe8T\xac\xc7\xdb\xcc\xa5\xcf\x1f\x7f\xcfN\x1e-\xe7NL0HfW\xcez\xad\xa5wa\xd3\x96*LO\xb7\x1bcBm%9Tk_\x0b\xd22\xfdQ%\x80\xb0\xae\x0en\xbc\xb4\x8a\xd9\xb82\x1c\x17\xefN(\x0b0`Y|\x11\x9e\xac\x882\x19\xa1\xad\xa9\xb9\xe2\x88\xa2EZ\x93Ok\xcd\x96e\xbc\xae\xfa\xd2\x85\x92\xa3\xecw\x8f<ovq\xbb\xc8$\xf2X\xb4{fF\xaa\xe6o\x98)\xa1\xc78\x1c\xc9\r\xb8b\x8c\x8f\x93\xdc\xa4R9\xe4K\xfd\xf5\x01\x17\xf4\xdc4\xceQG\xfaK]\x9fQ\xe8\x13\x9c\xcd\xd6\xe9\x80\xefo>\xa4k\xa9G\xbf\xfa\x0e+\xf3Y\x1cbw\xf5f\xbb\xdd1\xf6\xbd\x93[\x17\x82P|/dU1Y\x8c\xb4S\x9f\x9e\xc6TL\xb6\xde\x9c\x0e\xb8\xb2\xcbo\xec\xbb\xdc}\xed\xccB\xda\xeaT\x1e\xaa\x82\',\x0e\xebG8\xdez\xb7\x13\xe6\xf1\x81\xa0\'\xf6\xb5\xb1\x8d\xe3\xef\xfe\xaf\xcb\x11=\xe0\xa5\xe9sL\x95\xa0FP\xfcw\x1b\xa9\xb4K\x88\xd6\xab\x12N\x19\xbb\x94\x1c\x7f\xa7b7\x89\\\xf9\x97\x97\x87\r\xfbh+\xe2\x08|\xf8<\x14h\xae\xdaG)\xcd\xfe\xbb\x08 \x97\xa8I~\xe8\xf1C[\x96/[\xf3(\x17;\xfc\xe1\t\x8b^\xfd\xd2!\x9f\x8cEV\x9e\xc0\xa6O$&\xbd\xd0\xbe\x11Yjg*\xe9\xbe(7[\x91\xab\xb8\xe3T\x94\x11+&\x824\xccDe\xfa\x03)\x11)r\xdb\xfefR\xca\x0b\xb3\xc7H\x98\x89\xf3\xb8\xcf\xc9Nl\xf0[%\xc0\x89\xb7~\xc9\r\x1c\x94-\xe6\xe3I`\xd1\x88DQn\x0b:\x9f\xb4\xad\xed\xdf \t\xee\xce\xfe\xf6\xeb\x15]\x0b(+^\t}lNO\x08\xb5w7\xe8\xf1\xd82\x10\xd2\x9d\x12\xf9E\x87\xf4\x17\x84\xd8Ul\xe1\xad\xf9W\xd9\x05\xad\x9d\xde\xe9\xbdw\xa77)~^O\n&\xf2\x93\xbb\xefm\xb4\xc0e\xcf\xfb\'\xf1\x81?\xa3\xd5\x02\x0f\x83\x16\xd9\x04/\xdei\xc1\x83\t\xee\xa8I5<\xbe\xb1\xbc\x01Y\xa1\xb6p\xc0\t\xf0\xaeg70\x94\xb2Y:Kgx\x8e\xbb\xecrN:\xd8W\xb7\xb83\x7f\x93D\xfd,_J\x81\x8b_\xae\xc5\xaa\xbeD\xfa\x03\xc6\xd3\xda\x86\xbdq\xb1\xc5\xadrf\x81\x00\xf8\x14\t\nu\xb6pu\xab9Q\x9a.\x0cV7\xc9F\x94.\x7fsd\x16\xa9\xb7j\x95i\xb8\xcd]\xb5+\xc8\x91\xd8\xe5S\x9dl\x93\tK7\x06\xecZ0\xa5\xd4o\x83\x02\x1ba\x96\x1a\xd1eY\x05F1\xc5rk\xee\xef\xf24d\x8d\x987\xf5\xd4\xfd*1\xd1\x1b\xce\x08\xdb\n\xec0\x15\xe5\x81\t\xc7F}\xe0[\xd1<.\xaa\xcf\xd5f"D\x07I\xd5bc\xabr.\x13\x1f\x8f,\x02\x9a~\xbdmW-\xa2V7\xfd\x81\xf0\xe4\xb8\x89\xc45\x89\\fG\xf2\xd9d\xb9E&\xe9\xb5h\t\x18p\xb5\xaa\xad\x9er\xc0\xdf\x92C\x15\x05\xf7\xcb\x00I\xe5f\xaf\xa4j\xb9\'\xd1n\x94\xf3j\xf0;l\\g\x84\xb9\r\x07\x7f>\\\x8a\xfe\x12cQ\xce\xdd\xcb\x91\x08\xa0;)4\x8f\x1b\xc3\xe9\xa11\xbcO\x937\xd0\x13\x12\xbcS\xb67\xd5+Q\x9c\xb6\x08\xf0/\xbf\xae\xd7\x1cF\x94\xd2\xda\xbb\xd7Jh\xf3M \xf3-\xd0\xfd\xf4\x96\t\xb4kg\x00\xa7\x1d\xe0\xc8\xb6^\xf8`\xd6x\xf1*\xc2\xe6\x02\xa7\xd4BJy\xd3"\xf6?\x89d\x8d@\xabB\xcb]\xb5\\\x18G\xf7K\xc6\xd3$\xcd\x03\x12~\x12\xc8\xec\x07\xd5Y\x82\xc1\xa2\n\xb0\xd2\xf6\x93\x9b\xe6mWY\xf0\xa9B\x8e#\xbdj\xa8\x88\x91$\xddy\x1f\x9a\x1ba\x97/\xade\xee\xca\x11O\xf1\xe2\xab\x1f\xa9-*#\xd1_\xc9\xd9\xe8K\xce7\x04\x89;v\xfa\x8b\x95J\xc5=Z\xa8(\xcdOD\xfc\xfd1\xf4^\x18PF\x13\xd3I\xfc\xcd\xbd\xac\xe4-\x89\xf4\x81<P\xf0>\xfa\x04.\xd1E\xb8\x19\xa6\\\xf0\xbd6I\xf9\xc4ZG\\\xa6\xe8\x08\xdc\x14V\xc0\x02x\xa6\xbf\x96u\x98\xe7\xbe#\xc8G\xff\x7f\x0c\x94\x08\xec\x90\x1f;\xa0\x08\xdb\xf5\x9e\x88\xce\x17\xa9\xbb\xa9Hn7\x19\x91\x83\xe2\x03\xf8\xd1)*"\x0c,@\xfd-\x03d\xc1\xd8}\xd2\x05l\xfd\x0e\xe5\x96B\x1f\x84P\xe2\xe1\x7f\xd9E\xaca\xb2s\xae\xf6\x0cx\xf6\x0fI\xe15\x0f\x9cl<\xfb5\xc9Y\\a-\xcd\xd5J\xbdc\\\x8f\xb1\x87\xd6!\xe8\xe3\x9ba\x92E\xf2EQ7\xc4\xfcJ\xdc\xcc\xda\x0b\xa2\x0b)\nu\x16!q\xebe\xd6v\x16Z\xd4\xa4k\xc3\x9eak\xbf\x10xCo\xe2:\xd9\xff\xe0\x1c\x9d&\x9b\x81H\xef\x99\x12\xb21\x06\x9d\xf9\xf8$\x9cp\x94P+\xa2\xa9p\x1f\xf0%\xafF\xa6N\xb26\xbf\xe3h\xa2~\x91]r\xb4\xc5\xd2%!f\xb4\x1dc\xb1\x93\xb1\xab\xe5\x9c2\xb24\x8e+=\xcb\x8e\x96`o\xd6N\xf5\x0f\xf3\xbfj\x9e\xb3|\x84\xd6qi\xdc\x0f\\2\xf9\xea)6#B\xf1\x13&\x0c\x1ar97P\xf44\xcd7\xd1\x96\xd8,\xfe\x98x\x99\x0f\x95\xb4T\xd0\x05\xc9\x13\xbf\x85\x1fy8Y0\x05:\xaa,\xd8*\'H\x92(\xfc=&\xd5\xe5\x9f\r.\x9a\x93\x19\xbb\xd8p\x0cO\x00l\x92\xfd\xc4iG!\xe9\x9b;:\x92\xd7@\xb4\xad\xd7\xc6\xd9\xbbF\x17|mDafW\xfe\xa2\xad\x91M\xc2\xc6E\x1dt\t\x01n\xdf<\x03\xfb\x89&^\x08_\xc1\xd5\xa5\xc5\xe0\xd54\x92\x0cY\xa4\xe1\xc0\xd5\x89\xf3\xd1\xf3\xa2L\x00\xf7\x11l\xa1\xf6\x9c\xc9\x9c\xc5\xb6\xf1j8\x10\xd3\xa5$\xdeb\x1d\xd8\xc3wG\xf4\xc1\xa3V\xc65\xa5tiK\x8d\xa9Ia\x10\xa6D\xab\xba\xb4\x9coz\x00O=[\x15\xb1\xc4\x98\x10\x9e\xf6\xe2e\x9d\x8f\x02wF\x1b\x1d_\xcc\x1c\xfd\xea\n\x8aA\x07R\xe5\xe3\xeb\xc5W5\x11z:\x17\xecN\xe3\xd2V\xf11\xa9p2\xd1F9rb\xb1\x9b/\x88IH;\xac\x19\xabH\xa8\xe2\x1f0\xcd\x9c\xdf\x97\x83\xb8\x9b\x84\xcb\x00\xa8\x8d\xd8\xe5\xc2*\x9fY\x03WS\xeb\x1e\x84\xefOi\x01\r\x1eaJd\xbd\xfcpd\x8c\x04W\xfb\x88\x92\x9b\x1b]\xe7=\xf2I\'0\x0f\xce\xf9X\xe3\x95\xa6\xd3*\xa0\x01C\x16>_U\xeb\xa9b\xb9s\x11\xba2}\xd29\x07\x84\x1b\x1e\xa6Z\xf2jfB\x92\xf5\n\xedsx\x12\x9e\xfd\x85\xf1\x03\x0c\x87\xe3\xbc\x03t\xa5\x12\x9f\x9f\x83c\x9a\x9cv\x98\xcf\x1c\x11Q\x0bN\x88\x90\xd6\x83@\xb8/\xf7gX\xcd+\x7f\x9dK\xb5\x9e\xa3\xaa\xe2\xccZ\xba4|\x01\xb0\xf5i\xaf\xd0\xbcU\x94lJA?\x96\x1b\x1d\xde\xe2\xbef\xf6Y-\xdaU\xb2a\x04\xe0\xe7\x15L\x9b\xa2\x18\xb0G0\x9b\'_\x00\x15\xb82|\n;\xf4\xee\xfd\x93\xa2\xd6\xe7\x12\x9d1e\xa4\x1aV\xfe\xcd@\xa8,\xf3jA\xab7!\x8f\'>e=\xeet\x86\xec\xf8\x124\xa4M\xb4`\x03\xdc\x87\x89R\xcc\x85\x80\xe8\xd4\xb0W\x03\x08\x07\xe7\xc3\xd5\x99\xa7kT\xfc_\x84A\x86\xaa\xd3\x0bq\x10)dWG\xe3\x1f\x107\xcf\xb0w\xc71\xedst\xbf\x99i\xdbW\'\x02\x93\xad=a\x1b\x16\xde?\n\x00\x7fa\xba@\xeb\x938\x036\xf6Zv\xef\xfc\x87v\xdc4\xf9\x16\xa7\x93\xafKR6\xd5\x86\xf6\x01\xd2\xbb\x04y\xde\x89T\xb9a\xc1v\xf4Q<\tUa\xfcq\x84\xc46_E\xb2\xd7]J\x03.\xeez\x1a\x8b\x86C\n\x0f\xf4n\xe7\x0b}\x98K\x9c+F\xcf\xc3\xd1\x85L\xc2\xac\x80*\x0c\x0f\xa3\x07\xbbY\x13\xadV\x00 \xb1D\x97\xcb\x1c\xe0q\xcdG\xd5-\xfb\xe5\x08H+\xd0\xb2\xc6\xa8"\x13\x11\xf0~?\xb6\x17N\t\x9a\xf0\x1am\xa2Q$\x81U~=\xd8~&t\xd0\xf8\xd1\xd0G\xcb\xf4=\rJ\x15\x90+\x02\nd\x0c7"\xf1^\xd1l\x11e*u\xd4~\xa3\xa2\xea\x8a\x96\xfa\xe2A\x9cR\x19rgJ\xc7\xc2R\xb4\xf0\x8a\xbb\xc2\xf1G\x16*t\xde\xb7[x\x9aj\xbe\x81\x80{\xde\xba\xc6n\x8f\xeaL\x8f\xf5h\xff\xa6\xa1\xa6\xe9\xd4U\xc13\xac\x93T\x9b}K\xa9\xca\x8b\x8a\x9dZ\xf2\xb6\xf3\xff\xe1\xac\xc9\xcbu%?-\xdeAra\xdei!\xea1eeSfK\xc6[\xf0\xeb\xa0\xb1\xa2w^\xe4p_\x13\x94O\xbb>\xdc\x8e\xeb\x1a\x84\xd0\x1cI\xfeJ[r\xc1\x158\x13\x80 \x04j\xd0\x7f{U\xe7Z\xef|\xd1\x00\x9e\x1f\xc7?Ap\xe6\x13\xe0A\x11\xc5\xc7E\xcc\xecF\n}1m\x83+\x1f\x006u\xa1\xb6\x8f\x1e\x87\x0e1\xc4i\xff\xc96#\x0f\x92\xb8\x1co\xae\xb9\xc2\xbd\x92\x82K\xec\x01m\x11\xd8\x12\x8a\xf59\xccl8)\xc8,N[\x9fL\x8b\xb7\x82\xbb\xc7Yn\x1b\xa1\x16 \x83\xe5\x10\xf8\xbd\xfd\xdeu:\xa04\x12\'5\x86M\x08\xbc\xea\x95J\xecB\xc9\x0e\x97\x12.\xb3\xc1\x08\x18\'\xf8F\xb3S\x0e\x92\x08w\xa2\xec\xb57\t\xfb\xb7[\xa9\\\xfeH\x18\xb0\xb9\xf3\xeb\xe1\xc6]Ei\xfb`\xa3$&\xe6T/P{ \xeb\x03\xab\r\xc6B\xa0Z\x00:O\x12\xfd\xe2\x1b\xff\xccwW\x89\x12\xf0bo\xd4;\x045\x854\x00\xf5LX9\xc7\xe7\xe5_\xd78\xf9X\x9f\x8c\xce\xd2*\x84nk6B1"\xbd\xfe\xa7\xdd\xac\xb0\x8b\xbf\x8e\xd7H&\xf7\xbb\xea\x11R\xff.)0\xed\x05\x08\x80(7\xb3"r[\xff7\x08)\x8dfM\xc7x\xe01^\x1aZ&:\xcfF6\x89\xd2S\x9f\x9c\xe7P\xbb\x8b\x11\x83[rh\xdf[H~\t4\\\xfa@\xaa@>\x9a\x96\xd0X\x0f\x82\x91\x80\xda\xe2\xcf".M$\xb4\xae\x80\r\xe7\xd6\x17&\x03~\xa4\xb2\xd3>\xf6\xd1`\xb1k\xe1\xb9\x98A\xf9\xb9\xa1\x9b-\x16\xc3b<\x08d\xa5o\x7f\x0c\xa6\xad \xe4\xb6\xa6W\xc3\x11\x93\x92#\xefsX\xc8\xd4)\xa5p\x86\xba\x97\x17u1\x08\xe0\xff\xcc\xc6\xbf\x14^\xf1\xe4\xe5\xc7\xa0\xb6\xa9\xc9O\x81\x02|*\xbdh\xab\x08\x81\xf9\xd6s\xden\xcc(U\x80\xc2D\xda\x8eQ6\xaf\xa2\xdbZA\x9a\xf9\xb3\x17\x08\xd9\xe8D\xa3\xedq\xab\t\xb4|\x84\xc5\xc0\xac\xc3\x96\xf1\xd5\xddo\x90\x1c\xdd+\xed\x90]\xcf\xf5-\xef\x07{\x0b\x9d-\x9d7\x06\x90F.\x95\xa9\xab\xed\xe5\x1d\xc8(`O\x16\xb3\xbb@Km\xf8\xb3\xea\x81\x00\xf6\xfc\xfcS)1\xf2\xa3\x94\x81\xa6JV&<\x0e_0#\xfe\xa0\x1c\xc8\xde\x10\x04fH\xe9+\x14\x8c\xa710y\x8dB\t?#\x11\xff\xb4\x1eO\xda\xfd\xce\xacR-\xde~\xd8\x01D\xb6\x9e30q\x86\x02^6?\xdak\xb5\xa4\x15\x8d?\xd6\xc0\x96\xa7\x06\xe0o\x84\x88\x0c*\xa8\xc1\xab?\x94\x84\xfe\xeb:G\x1a\x9f\x1c\x0e\xf9l\xfel\xe2F\'\xe5\x12ix6\xc5C\xd8`\xc2P\xe2\xa7k:\t=:\x16!%\xc8\x0eD}I\xc8\xe9\xaaz\x0c\xb6\x9f\xf8:.\xdf3\x9al\xb4F\x01\xe1\x7f$y\xbc\x1e\x15\x9a\x9a"\t\xc4Y\xa1\xfe\xbe\xbb\x88\xbb\x00\xde\xb3S!E\x0e8\x1f\xbd\xf6\xdb\x8c\x9bL\xa0\xe8\xca\x891U\xf3\xb5q\x91\xf0\x81S\xf3\x93`\x81<X\xa3pM\xc7\xb1\xb1\xa7E">\xb7Y\x90<$\x81\xa4j\x8dyXV\x81K\xcc\xda\xb3\x01\x86\x91g\x0cZ(\x12/|Bn\xad\x81Pfo\xc1\xa0wo\x13 \xabN\xd2\x13PPmAl\xaba\x9aJ\xd0\xde}\xd9\xcet\xc2\xd1\xf9\x95\xf3\xa1\xb0\x1b\x9c\xcb\x81\xea\x10|\x80\xa0Y\xb3\xc7\xfe\xc4\xfa\xd5\xbc\xf5\x94k\xc9\xab\xb7\xf7\xc2\x97S\x9c/\x9ba\xea\xe20\xffPq\x08RHtWv\x12\xd3j\x80J,\x8d\xa3M\x94\x90C\x9a\xa0\x19W\xe2\x1e\x04T\xf6\x19\x85y\x8a\xed: \x95\xca{\xe4\x9ei\xaa\\\n@\x9aK\x95V\xa2\xe2\x97\xf5%\r\xc6\xfbs\xd5^Q<]&\x0c\xa1}\x0e\xa5\x9fd*Wa\x98^\x1f+A#\xb9\x0c\xfc\xd1\rhu\xd4\xf1\xda\xd41S\xc2\x81o\x95\xcdwS\x8e %:\x08\xbb@\x84=\xd5yv\x9d(\xf2~\xa84\xa8`\xef\x93j\xc7x\x16\x8a\x9a\x87\x0b\xd7\xd4^Yp\x8e\xfbE\x13GU\xe7\xb0\xa8\x85\xc3\x02h>Qp$\xca\x81f<\x8c_\x0f\x99".\xa9\x13n@\xd1W\xda\xa4\xd2\x92\xdb\xba\xceP"\x02\xe1\xecuI\xcd\x0c\x86e\xfa\xd9H%\xe1\x95\x184mx\x8c\xd6\x19\xf4{:\x91\x97@\x88\x16\x06\x1e\x95"\xb1\x0c\x11\xd1oz45tK\x06\xcd\x01\xcdV\xa8\x1b:\x1az\xbae\x9dOE\xd6#\x84\x9f\'\xb5\xa1*\x0f{\x1f\x8e\xd7\xed;\x0b\x97\xc8,\x1e\xec\xe6\x89A\x00\xc5;\xda\xf6Y\xf6\xbc<\n\xc5\x84j\xf3\x1d\xa5_<\x7f6\xab\x1d\xc1\x0c\x9e\xa7\x08\xae\x85|\x1b\xb2\x13\r\xfe0v`\xd9>\tXJBu\xec\x01\xec\x00\x9d\xb9:\x9e\xb6\xf1n\xa8\xfa\x93\xb1\rgx\xce\x86!m\x08\x831\xa7</\xd8\xf6`v\x01\xf0D\x9fW\xf4@}$\x15I\xe0z\x91\x8f{\x08\x9ad\x1d\x15\x1e\xbf?\x1bO\x80\xd5\xb1\x94\xc1%\tM\xa9*B\xabo\x14\x91\x98U1\xef\x17\x02\x9c>uL8\x9f\xbbv\xae\x14\x11\xf9x\xd9\x93\xe4\x8a~\x1b\x14\x98\xac\x92\x01\xb1(\xb0di\xd9\x818\xaf\xc03g\xb4\xdf\xd8\x00\x9b\x05\xc3;\x81B\x93\xd4\xaf\x06\x1a\x12|(\xc6p\xe2\xcd4u\xf5hY\xa6\x0b\xfeq\xe7\xb1&g,\x07I=V=\x99\xf2\xb0\xfe\x8f\xd7IE\xf5\xf8\xdf\xc4\xc5\x9d)\xc7\xe6&g\x07\xd6\x91\xf6.\x85\x915e\x85X\xea\x93\x19M\x1c\x17\x836\x10\xb9+ 1\xf1\xe2om\x8e\t\x83\nn\xd6Do\x96^\xfe\x9e\xb2\xee$\xd9\x8b\xd3\x04\xd9\xd1\x12\x1b\xbc\xd3M\xf1~GMB\xa0z#\xd4.\nx3OY\xa8\xdeM"\xd1\xbf\xc3S\x03\'W\xca\xd3\x86E>U\x1c\xfd\xad[+\xad\x99\x85d\x9a\xabW\xf7\xb0\xf7\xcc\x88\xe7\x9e{rU\xbc\xc7\xbeN\x93\xef3\xc8\xd6\x865\xed\xbctm\x13\xec\xf2\x19p\xd6\x18\x92M\xa1\x17-\n\xdf\xe8K\xaeP\xdbN\xbb"\xf4\xaa\xfa\x15I\x08\xe7\x81j\x1bC\xc0\xfd\xc7ZuE%j\x9d\x9b\xb8w\x11Q\x1f\x96\x8b1\xb2\xb9\xc1D\xf7n}@\xe8\xb8\xba\xc4\xa2r\x0f\x80!w\x8c\x1e\xff\x95a\xac\xc9\xacb\xa3\xd2X\xa3!|g\xab\x06\x97\x1c\xfdgK\'\x08\xcfW\xe2\x08\xa8\xd2\x02j~l\xb0k\xb2x\xfc\xec\x86\xd28\xaa*\xc3\xb9\xea\xcd\x9a\x10\xb9Ar\x19\xcd6\xb5\x0f[\xbf\xdb\x7f\xb2\xfax\x9bp\x8co\r\x112\xf8\xcd\xad\xe9\xd7\x1a\xb9\xff\x8b\x17\xf2Y\xfb^\x05V\xcf\xeb\xcb\x88%\x82\xa0c\x07\xdf\xcc\x11\xbf\xbac\xd1\xa7\xfb{\x9a\x81^\x91\xda\xf25D\xf3\xeb\xc0\xc4\x95\xa0\x825\xb8nce4\x8a\xee\nO\xe1kGc\x0c\x91\xf7\xbf\x16\\\x80\x13\xa8j!\xae\xf6\xe8\xe8\x82\xb9\xd5\xba\xae^\x1dU\x89\xc4\xdb\x07\xf9\xa48%\x94\xd2\xbfd\xaeW|=\xee\xb2\xde\x8e\xac\xd3\x1fA\xe6\xc1\xd1\x99\xb2\x02.\xe2\x0c"\x1aRJ\x8a\x11\xd69\xb9\xf3\xad\x0c\xc2v\x8eOf\xd2G\x17*\xf1\xda\xd1\xf5:\xeb\xad\xa4\x9a\x9eI\xfb\x08\x9c\xe5\xe9m\x83\xb9\xfc\xd6-\x8fE\xe8:\xe4\x1aK\xb7\x18[S5\x8e\xa9/K]\xf4\xb7\x1fx"\x02\xf6\xcb6\xbaBvt\xee\xc8L\xe7\xc9?Fzu\x89XI\xc7E\x82\xf0\xda\xd1\xc0yp\x13\x86\x8a\xaf\xf3l\xa4\x97(\'+\xd6B\x10\x12t\xf9\x0fh\x1fy\xf1X\x85\xee\xfd\xbd\xa3~\xc85d\xed\xac\xc7G\x86\x08%[\x8d\x17\x86\xcb\x8en\x9a\x169\xda\xf4r\x0b`\xdeM\x95O\xfb\x95\x1d}\x04#p\xfc\xb4=\x95%\xe6]Z\xc9^<\xfa\x9d\x12tf\x93\x87\xf6\xe9\x8c\x7f\xeb*\xdcyL\x98\xa3f\xad:8W]f\x827\xfc\xebB\xb4\x90\x98\xa3\x9b\xd3-\xc4Xw\xc2a\'&/\x08\xd5\x1b\xa9k*\xa9Eu\xf2|\xa3=u\x07I\x8a\x14\x1a\xa83\x86c\xf3\x922E\xa8\xd4)\xb4\x1f\xbb\x03F\xc0\xd1$\xde\x00\xe8\x10\xeb\x86\xf6\xff\xfa\rD\xe4\xacv\x92\x8c\xb4\xde\x92\x89\xe0\n_\xf5\xb4\xed\x889\x9c\xdeEfK\x96\xbf+\x954\xdd5\xe3\xfeh\xb1\xf2\xef\xb1&\xa9\x02\xab$~\x046\xb1\xe2$@\xe10\xc4\xefl\xc2U\x94\xd5\xd8\x9f\x0c\xd2\x14$\xf9G\xa3\xa3\x0cU\xbe\r\xa7\x95p\xbc\xa5f\x0c\xc4\x87N3i\xb8\xe7\t\xc3\x18\x07{lVX\x16\xae\x9c\xdd/]_\xb3_\xa5/\xe0\xd8\xd1b\xce\xc8\xf0\x15\xfd\xf8bA\xa3\xec\xda\xb5\xa5a?\r\xcfK\xd0\x18\x18\x07giv-\xfd!\x96\xae\xb6d\x9f*\xe9(EY\xd8\xf9\x91\x17\x1d\x8c\x9aPW\x99&\rP=\xe4=\x86\xfe}\xbad\xe8\xdd\x1aWg\xe5f\'\xf7-\xb9\xab#\x97wb\xa0\x8a\xc2f\xc96\x89\x1e\xc5d\xe6\xec\xde\xa8Ax\xa4\x99P1p\xcd\xcaN(\xe9\xae\xaf\x9a-n\xb1q\x19i\x11G\xd05\xbeh\xb2R\x1b\xe4\xfc4p\x9cX\xd4q\x9a,\x0b\xf7\\\x94\x93\x84\x83&/@.0\x1aZ\xbf\xe6\x06\xeb\x16j\xb3\xf0\x99;Fcr\x1dq\xf6\x00\xb48\x0f\xd2Zg\xc1\xe5\xa0\x93\x86\x06T\xce3\x16\xf7\x88\xb0\x03_\x9bp\xb2\xfe\r\xff\x92?3\xa7dX\x17\xc0I\x10\xdb\xea\x0e\x80\x83P|\xc1\x82\xf1\xa5|\x8b\x8fH\xd3\x88\xbe\x93\x97\x91R\xeb\xfe1.\xb4n\xec\x1e\xd0\xd5\x04l\xf1<\xa4\xfa\x82\x07\x0b\xbc\xc6\xcf\xfd\xaf`\x84O0i\xe03\xe8\xe4\x0bl\xa3\xc7\x8a<\x88\xec`y\xb9\x9f\xcc\x88\xe3Kw19\n\xfa\x9bo\x91,\xb0!\xcc\xb9\xf6\xadk\xcc\xb2\x80\xf5]\xab\xb5Xh\x7f\xa4nU\x0f\x04\x05>i\xf77\xd7\x19;\t!\xb8\xc2\xc8\xee\xe7\xc5\x02\xd30\xd0\x13w\xdf\xd4\xdc\x1cO\'9\xea\xb3c\x1f\x00\x1cU\xf3\x0eR\x1c<\xc7\xb8\x83\xa3\xc6\xf6kB\xa3\xb0\xa0\xe5\xda\xd6\x90\x8a\xf7JW\x00Q\xd8\xdao\xe7\xf62\xf2\x91U\x16\x97\x824ee*\xdc\x19!\xbfnX\xb1\x85\xb3\xba\xb7\x1f*m\x1d\xe5\xaf\x07\x9e\xd4Fdc\x0c\xb7\xf5~\xf20\xf1\xe78\x01|\x07x2\x176\xd7[\x92hA\xf7\xebD\t\xfa\xb3O\x0b\x81$?|\nA\xba\xe9\xea\x08\x80Ex\x94M#\xbby\xfc\xa0\xfb\xd1\xf7\x00\x0b\x01A\xcd-L\xab_2T0\xc7u\xb7\xff\x8c\x0b4\xac\xd6F+,U\xa3\x85x<Ob\x13\xce~\xcf\x1b\x9f\x88\xfaP{\xd8\x883\x93\xf6!2\xc3\xd2J\x1fKp\x03Q\xbaPb\x9a\x00\t\x00y\xa6\xf4K\xbe\x99Y\x03\x0f\xbd\xab\xd9\xabu\xad\xbb\rX2K\xcd\x91\xf7\xe4\x80`\x14\x9d\x16\x13\xdd\x7fe\xc0\x07\xfbF\x1c\xffY \xf6\t\x18dq\xfeEY\xb59RDwm9\xb2I\xdc\x13\x80T\x9eh.\x1e!\xd0\x14\xa9J\xe4\xf1\xa0\xe4!$T\xd3,G\xa5d?`n^\x9a\xe0\x81\x0f\xd8\xf2f\xe1\xba\x88iY\x0fh\x83\x85l\x05\xc6\x02\xc4w\x8b\x8f\x9d\xb3\xb8\xdc\xf6\xd7\x89\xdbb0\\8\x8f\xdc\xe9/\x94\x99"\xd0\xd4=\xe9\xe3\x18y\xa8\xfdx\xa9\x1f\xe0#\xa49\xd0E3{Y\xb9C\xe2\xf6d])\x89\xb2\x18\xf6\x07;\t\xd4\xd5\x8f\xcc\xc2\x9f\x7f\xe9d\x8c\xc0\xda)x\x06\xf5\xf8\xbcX+\xd1A\xc3\xbc\xae\xed&\x96\xf7 %\xa2\xa4\x9b{,\xf0=Q&k\xa7\x98\xa1\xb5r\xdd>\xf85\xe5\xd1i*\xf70a\xc9\xc2\xe2m\x0eI\xf82\x14\x9b\x93\'\xd8\x98\xb4\x05\x99\xe5\x93\xe9\xb8]\xff\x98\xdd\xc0Q\xee\xb7@\xcd\xe0\xa6 ~\x07\x95\x0e\xa6\x96\x16r\x97\xc4;>:!\x86\xa7\x04\x8a9b\x1a7\x9a\x8b\r\xde\x18f\x07\x96\x83\xab\x1a\xfd\xb8\xe3H\xd9!/l{\xbf~$Z\xeb&tu\xf1b@\xfc\xf6\xcd\x07*,84\x8f\xa7B(1\xc0\x1e_\xe3|90\x17\x82\xa31\x9f\xb1\xa0\xcf\x94\x9e2\xf3\x9c\x0b_F\xc5D\xd4\xf6\xdb\xba\x9fA\x9ab\xdb`\x95\x00\r\x8a\x97Kr\xfa\xe0\xbdFK\x85F\xaf\xd9\x9ae\x87%\xd2\x8dl\x95\x86\xf5#u\xc2\xef\xda\n\x83\x04\xf5\xd6\xd3{\xb3U\xd8*^f\t\xff\xc3\x86\xc6j+\x9c\xe2\xf0g\xd8\x9f>\x01\x02\xd4 \x80\x05N\x02M\xe2\xe2\rY\xb5!\xf0q\xc8Ycp\x9b\x8f\xfc\xe9\xf0Q\x1e~!\x10h\x8b\xd3\x0e\x93\xc4/\x8e\xfd\x8db\xe3\x14\x06N\xf2\xad,an\xcd\x8c\xb0Hv\xc5\x046\xffn(\xb1]\x0c\x8b\x97\x7f\xd1\xdac,\xd5\xc7\xeb\xfc\xf0\x87\xdf\x06\x111\xb9\xabC\xe4(\xaa\xfb\xecLqY\xa9n!x\x98\xf3\xe5y\xf5\x80\x0fsT\xab(R\xaf\x7f\xf7\xf2\xdf\x0b\x86\xe2<5\x03\x12\xce6\tZV\xf4\x84Qs\x1b-\xca]{\xaa\x168:\xbc_\xb5;\xb8\x1a\xb3\x12WO\xda\n\xe6\xd3WE\x83\xe0\x08\xf5yS\x11\x1e\x9c>p\x92G\x7f`\x8b\xb9\x00\x11e\xfeB\xaa\xbf\xd7\x1a\xa0\x06}\tF\xa1.]78\xede(\xf8\x94\x19j\xe0\x97L\x8e\x12\x12\xf7\xe7\x90\xd8}Tb\x81\x0c\xa9 \x89\x05\x07\xdd\xbe\t\xc7-b=\xfa\xb5\xd1\x01\xe3@\x10\xcf[\x8a\'\x93oC\xa9\xda]\x1d0\x0b\xc0\xeb\x9f3\xc1m\x8e\x14\x19\xd6h\xa8X&G\xd1\x0e\xfdi\xb6\xb9\xa8\xe6\xef\xa6\x91\xa8&\xddT:\x189\xb4\xbd\xb1\xeb\x95\xb5\xa5\xf9V\xfb\x0f\xa0<\x16w\xc6\xdc\x82\x1e^\xed5A~\xc7\xe0\x8a\xd1(W\xec\x9cz\x07yc\xec\rGM\x13O\x14~\xb4\xc2\x1c\x19\x13e\xde\x8eG\xa91\xe5\x80\xf5\xfd:\x81m^\xbf\xce\xccC\x04\xf3+\x07\x00\xb4(\xbfu\x10\x8bz\xab\n\'OX\x94\xde\x8e\xcb\xa5|\xab\x13\xd2\xd8\x94O\xc5\xe5\'DO\x87\nb\x1d\xe8\xad\xcd\xd5\xb9\xe5\xed\xf0\xe4\x97\xb4i\xa9\xc0\xca=\x8dR\xf4x\xff\xf9\xdc6\x99\xef\x1cD\x0b\xb3v\xc2\xb1E\x18H\xe1\xecrj[k\xbe\xd7>\xff\xbb}+\x13\x92\x86Uo\xe4\x02\x9fq{\x80c/\xcdb\x04J"\xa0\x03\xad\x1b\x90tR\xb1\xf24\xf6\xf7\x96\x86z\xae\xcaW\xd7\x8b\x823\x8axP_\x11\xcal\x9eA\xb0\xba\xc3\xee\x1e\x17\xac(m\xfc\x0c)"\xf7~\x03\x04\x1aM\x08\x19\x1e\x8f\xa2x\x84\xd3\x89uWK\xb4\xd7\xff\xe9N\xc5\xadJx6\x82{\xe6\x98\xf2\x833ZH$\xc2\xfd\x9e\xe1\x8d\xbb\xdb\x9f0\xf3uX\xf8U\xc3\x9aT\xec\xf1n?G\x0f\xcbp{:\xeb\xb1k\\\xbb\x87\xdf\x82\x89X>\xe24\xa5\xd6\x92\x98\x1e\xa4\xd3F\xe3K%Q\xb2\xd2\xbbj\xbf\xb5\x8dx\x9b\x87>\xd4_oy}x\xd1\x1b\x84\xb2\x9b\xe1\xdf\xb9=\x93q\xfc\x13\x10\xf8\xe6%\xe7~\x8d\x17\xc9\xc3\x91\xca\xbe\x8e\x95\x9f^\xce5\xba\xcfY\x8c\x88\xf5\'\xaf\'\xf56\t\xa9\x87\xda\x8f\x10\xf0\xc8\xb5$\xf7\xfd\x92\xe5FB\r\xcf\xab\x1c\xf0\xe3%\xdf\xec\xcd+\x05VEa\x9b\xbf\x9eTe;>\x0e')
1
+ import flask_babel,flask_babelex
2
+ from hiddifypanel.models import BoolConfig,StrConfig,ConfigEnum,hconfig,ConfigCategory
3
+ from wtforms.validators import Regexp, ValidationError
4
+ from flask_babelex import lazy_gettext as _
5
+ # from flask_babelex import gettext as _
6
+ import wtforms as wtf
7
+ from flask_wtf import FlaskForm, CSRFProtect
8
+ from flask_bootstrap import SwitchField
9
+
10
+ from flask_admin.base import expose
11
+ # from gettext import gettext as _
12
+
13
+
14
+ import re
15
+ from flask import render_template,current_app, Markup,url_for
16
+ from hiddifypanel.panel.hiddify import flash
17
+ from hiddifypanel.models import *
18
+ from hiddifypanel.panel.database import db
19
+ from wtforms.fields import *
20
+ from flask_classful import FlaskView
21
+ from hiddifypanel.panel import hiddify,hiddify_api,custom_widgets
22
+
23
+ class SettingAdmin(FlaskView):
24
+
25
+
26
+
27
+ def index(self):
28
+ form=get_config_form()
29
+ return render_template('config.html',form=form)
30
+
31
+
32
+ def post(self):
33
+ form=get_config_form()
34
+ if form.validate_on_submit():
35
+
36
+
37
+ boolconfigs=BoolConfig.query.filter(BoolConfig.child_id==0).all()
38
+ bool_types={c.key:'bool' for c in boolconfigs}
39
+ old_configs=get_hconfigs()
40
+ for cat,vs in form.data.items():#[c for c in ConfigEnum]:
41
+
42
+ if type(vs) is dict:
43
+ for k,v in vs.items():
44
+
45
+ if k in [c for c in ConfigEnum]:
46
+ #if not k.commercial():continue
47
+ if k in bool_types:
48
+ BoolConfig.query.filter(BoolConfig.key==k,BoolConfig.child_id==0).first().value=v
49
+ else:
50
+ if "_domain" in k or k in [ConfigEnum.admin_secret]:
51
+ v=v.lower()
52
+ if "port" in k:
53
+ for p in v.split(","):
54
+ for k2,v2 in vs.items():
55
+ if "port" in k2 and k!=k2 and p in v2:
56
+ flash(_("Port is already used! in")+f" {k2} {k}",'error')
57
+ return render_template('config.html', form=form)
58
+ if k == ConfigEnum.parent_panel and v!='':
59
+ # v=(v+"/").replace("/admin",'')
60
+ v=re.sub("(/admin/.*)","/",v)
61
+
62
+ try:
63
+ if hiddify_api.sync_child_to_parent(v)['status']!=200:
64
+ flash(_("Can not connect to parent panel!"),'error')
65
+ return render_template('config.html', form=form)
66
+ except:
67
+ flash(_("Can not connect to parent panel!"),'error')
68
+ return render_template('config.html', form=form)
69
+ StrConfig.query.filter(StrConfig.key==k,StrConfig.child_id==0).first().value=v
70
+
71
+ # print(cat,vs)
72
+
73
+ db.session.commit()
74
+ flask_babel.refresh()
75
+ flask_babelex.refresh()
76
+
77
+
78
+ from hiddifypanel.panel.commercial.telegrambot import register_bot
79
+ register_bot()
80
+ if hconfig(ConfigEnum.parent_panel):
81
+ hiddify_api.sync_child_to_parent()
82
+ reset_action=hiddify.check_need_reset(old_configs)
83
+ if reset_action:
84
+ return reset_action
85
+
86
+ if old_configs[ConfigEnum.admin_lang]!=hconfig(ConfigEnum.admin_lang):
87
+ form=get_config_form()
88
+ return render_template('config.html', form=form)
89
+ flash(_('config.validation-error'), 'danger')
90
+ return render_template('config.html', form=form)
91
+
92
+
93
+
94
+
95
+
96
+ # form=HelloForm()
97
+ # # return render('config.html',form=form)
98
+ # return render_template('config.html',form=HelloForm())
99
+ form=get_config_form()
100
+ return render_template('config.html',form=form)
101
+
102
+ def get_babel_string(self):
103
+ res=""
104
+ strconfigs=StrConfig.query.all()
105
+ boolconfigs=BoolConfig.query.all()
106
+ bool_types={c.key:'bool' for c in boolconfigs}
107
+
108
+ configs=[*boolconfigs,*strconfigs]
109
+ for cat in ConfigCategory:
110
+ if cat=='hidden':continue
111
+
112
+ cat_configs=[c for c in configs if c.key.category()==cat]
113
+
114
+ for c in cat_configs:
115
+ res+=f'{{{{_("config.{c.key}.label")}}}} {{{{_("config.{c.key}.description")}}}}'
116
+
117
+
118
+ res+=f'{{{{_("config.{cat}.label")}}}}{{{{_("config.{cat}.description")}}}}'
119
+ for c in ConfigEnum:
120
+ res+=f'{{{{_("config.{c}.label")}}}} {{{{_("config.{c}.description")}}}}'
121
+ return res
122
+
123
+
124
+ def get_config_form():
125
+
126
+
127
+ strconfigs=StrConfig.query.filter(StrConfig.child_id==0).all()
128
+ boolconfigs=BoolConfig.query.filter(BoolConfig.child_id==0).all()
129
+ bool_types={c.key:'bool' for c in boolconfigs}
130
+
131
+ configs=[*boolconfigs,*strconfigs]
132
+ # categories=sorted([ c for c in {c.key.category():1 for c in configs}])
133
+ # dict_configs={cat:[c for c in configs if c.category==cat] for cat in categories}
134
+ class DynamicForm(FlaskForm):
135
+ pass
136
+ is_parent=hconfig(ConfigEnum.is_parent)
137
+ for cat in ConfigCategory:
138
+ if cat=='hidden':continue
139
+
140
+ cat_configs=[c for c in configs if c.key.category()==cat and (not is_parent or c.key.show_in_parent()) ]
141
+
142
+ if len(cat_configs)==0:continue
143
+
144
+ class CategoryForm(FlaskForm):
145
+ description_for_fieldset=wtf.fields.TextAreaField("",description=_(f'config.{cat}.description'),render_kw={"class":"d-none"})
146
+ for c in cat_configs:
147
+ if c.key in bool_types:
148
+ field= SwitchField(_(f'config.{c.key}.label'), default=c.value,description=_(f'config.{c.key}.description'))
149
+ elif c.key==ConfigEnum.lang or c.key==ConfigEnum.admin_lang:
150
+ field=wtf.fields.SelectField(_(f"config.{c.key}.label"),choices=[("en",_("lang.en")),("fa",_("lang.fa")),("zh",_("lang.zh"))],description=_(f"config.{c.key}.description"),default=hconfig(c.key))
151
+ elif c.key==ConfigEnum.country :
152
+ field=wtf.fields.SelectField(_(f"config.{c.key}.label"),choices=[("ir",_("Iran")),("zh",_("China")),("other",_("Others"))],description=_(f"config.{c.key}.description"),default=hconfig(c.key))
153
+ elif c.key==ConfigEnum.package_mode:
154
+ field=wtf.fields.SelectField(_(f"config.{c.key}.label"),choices=[("release",_("Release")),("develop",_("Develop"))],description=_(f"config.{c.key}.description"),default=hconfig(c.key))
155
+ elif c.key==ConfigEnum.utls:
156
+ field=wtf.fields.SelectField(_(f"config.{c.key}.label"),choices=[("none","None"),("chrome","Chrome"),("edge","Edge"),("ios","iOS"),("android","Android"),("safari","Safari"),("firefox","Firefox"),('random','random'),('randomized','randomized')],description=_(f"config.{c.key}.description"),default=hconfig(c.key))
157
+ elif c.key==ConfigEnum.telegram_lib:
158
+ # if hconfig(ConfigEnum.telegram_lib)=='python':
159
+ # continue6
160
+ libs=[("python",_("lib.telegram.python")),("tgo",_("lib.telegram.go")),("orig",_("lib.telegram.orignal")),("erlang",_("lib.telegram.erlang"))]
161
+ field=wtf.fields.SelectField(_("config.telegram_lib.label"),choices=libs,description=_("config.telegram_lib.description"),default=hconfig(ConfigEnum.telegram_lib))
162
+ elif c.key==ConfigEnum.branding_freetext:
163
+ validators=[wtf.validators.Length(max=2048)]
164
+ render_kw={'class':"ltr",'maxlength':2048}
165
+ field= custom_widgets.CKTextAreaField(_(f'config.{c.key}.label'), validators, default=c.value, description=_(f'config.{c.key}.description'),render_kw=render_kw)
166
+ else:
167
+ render_kw={'class':"ltr"}
168
+ validators=[]
169
+ if c.key==ConfigEnum.domain_fronting_domain:
170
+ validators.append(wtf.validators.Regexp("^([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,})|$",re.IGNORECASE,_("config.Invalid domain")))
171
+ validators.append(hiddify.validate_domain_exist)
172
+ elif '_domain' in c.key:
173
+ validators.append(wtf.validators.Regexp("^([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,})$",re.IGNORECASE,_("config.Invalid domain")))
174
+ validators.append(hiddify.validate_domain_exist)
175
+
176
+ if c.key!=ConfigEnum.decoy_domain:
177
+ validators.append(wtf.validators.NoneOf([d.domain.lower() for d in Domain.query.all()],_("config.Domain already used")))
178
+ validators.append(wtf.validators.NoneOf([cc.value.lower() for cc in StrConfig.query.filter(StrConfig.child_id==0).all() if cc.key!=c.key and "fakedomain" in cc.key and cc.key!=ConfigEnum.decoy_domain],_("config.Domain already used")))
179
+ render_kw['required']=""
180
+
181
+ if c.key ==ConfigEnum.parent_panel:
182
+ validators.append(wtf.validators.Regexp("()|(http(s|)://([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,})/.*)",re.IGNORECASE,_("Invalid admin link")))
183
+ if c.key == ConfigEnum.telegram_bot_token:
184
+ validators.append(wtf.validators.Regexp("()|^([0-9]{8,12}:[a-zA-Z0-9_-]{30,40})|$",re.IGNORECASE,_("config.Invalid telegram bot token")))
185
+ if c.key==ConfigEnum.branding_site :
186
+ validators.append(wtf.validators.Regexp("()|(http(s|)://([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,})/?.*)",re.IGNORECASE,_("config.Invalid brand link")))
187
+ # render_kw['required']=""
188
+
189
+ if 'secret' in c.key:
190
+ validators.append(wtf.validators.Regexp("^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",re.IGNORECASE,_('config.invalid uuid')))
191
+ render_kw['required']=""
192
+
193
+ if c.key==ConfigEnum.proxy_path:
194
+ validators.append(wtf.validators.Regexp("^[a-zA-Z0-9]*$",re.IGNORECASE,_("config.Invalid proxy path")))
195
+ render_kw['required']=""
196
+
197
+ if 'port' in c.key:
198
+ if c.key in [ConfigEnum.http_ports,ConfigEnum.tls_ports]:
199
+ validators.append(wtf.validators.Regexp("^(\d+)(,\d+)*$",re.IGNORECASE,_("config.Invalid port")))
200
+ render_kw['required']=""
201
+ else:
202
+ validators.append(wtf.validators.Regexp("^(\d+)(,\d+)*$|^$",re.IGNORECASE,_("config.Invalid port")))
203
+
204
+
205
+ # validators.append(wtf.validators.Regexp("^(\d+)(,\d+)*$",re.IGNORECASE,_("config.port is required")))
206
+
207
+ for val in validators:
208
+ if hasattr(val,"regex"):
209
+ render_kw['pattern']=val.regex.pattern
210
+ render_kw['title']=val.message
211
+ field= wtf.fields.StringField(_(f'config.{c.key}.label'), validators, default=c.value, description=_(f'config.{c.key}.description'),render_kw=render_kw)
212
+ setattr(CategoryForm,c.key , field)
213
+
214
+ multifield=wtf.fields.FormField(CategoryForm,Markup('<i class="fa-solid fa-plus"></i>&nbsp'+_(f'config.{cat}.label')))
215
+
216
+ setattr(DynamicForm, cat, multifield)
217
+
218
+ setattr(DynamicForm,"submit",wtf.fields.SubmitField(_('Submit')))
219
+
220
+
221
+ return DynamicForm()
222
+
223
+
224
+
4
225
  #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
226
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -1,5 +1,52 @@
1
- # 2023-04-08T15:11:14.160610
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\x95\x00\x00\x00\x12\t\x04\x00\x84\xcb\xef\xbd\x8f\x89\x1c\x12\x8a\x98G:\xb0\xb3\x15\xa4\x00\x00\x00\x00\x00\x00\x00\x00\xa2\xe6+}\xb36/\xce^\xa0\x88\x96\xa3\x86\xc7J\xd6\xb3\x952\xa2$\x08\x87\xbfo;\xa2\xafLF1s\xc7?\x8c\x00Pm\x8e\xa7z\x04[\xb1\xf3;;T\x86\x80*\xd8\xb8S\xddos\xeb|f\xde/\x85\xa0 \'\x87\xe7\x83T\xc0\x96.\xe8X\xd6I\xd7]\x94\xfea\xc1i\xe2\x19\x1f\x16\xd6\'\xd6\x92"\xbdq\xb9B\xaf8.\xc3\x8a\xe9\xd4\x06n\xe1c\x0ciu\xb4\x98?%"\xbbW\xcc~\xe5\xbcw7@6\x84@3\xf9\xce\x14gF_g&\x01S\x8f\xf7!\xd9\xa6\x18\xac\xec\xbb')
4
- #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
1
+ # #!/usr/bin/env python3
2
+ # from hiddifypanel.panel.database import db
3
+ # import uuid
4
+ # from flask_babelex import gettext as _
5
+ # from flask_bootstrap import SwitchField
6
+ # # from flask_babelex import gettext as _
7
+ # import wtforms as wtf
8
+ # from flask_wtf import FlaskForm
9
+ # import pathlib
10
+ # from hiddifypanel.models import BoolConfig,StrConfig,ConfigEnum,hconfig,Proxy,User,Domain,DomainType
11
+
12
+ # from datetime import datetime,timedelta,date
13
+ # import os,sys
14
+ # import json
15
+ # import urllib.request
16
+ # import subprocess
17
+ # import re
18
+ # from hiddifypanel.panel import hiddify
19
+ # from flask import current_app,render_template,request,Response,Markup,url_for
20
+ # from hiddifypanel.panel.hiddify import flash
21
+ # from flask_wtf.file import FileField, FileRequired
22
+ # import json
23
+
24
+ # from flask_classful import FlaskView
25
+ # from flask import Flask, render_template
26
+ # from flask_socketio import SocketIO, send, emit
27
+ # from flask_socketio import Namespace, disconnect
28
+ # from flask import current_app as app
29
+
30
+ # class Terminal(Namespace):
31
+
32
+ # def on_connect(self):
33
+ # pass
34
+
35
+ # def on_disconnect(self):
36
+ # disconnect()
37
+ # app.logger.info("socket disconnected")
38
+ # db.session.remove() # this is important
39
+
40
+ # def on_get_foo_details(self, **kwargs):
41
+ # try:
42
+ # # Do something useful like print statement
43
+ # print("Hello! Awesome world")
44
+ # # Then send a event back to the world
45
+ # emit("event_name", dict(random_key="random_value"), namespace=self.namespace)
46
+ # # or
47
+ # emit("event_name", dict(random_key="random_value"))
48
+ # except Exception as e:
49
+ # print("Catch the exception")
50
+ # # Db session remove is important
51
+ # db.session.remove()#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
52
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product