hiddifypanel 3.0.0.dev64__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 (70) 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/home/multi.html +1 -1
  58. hiddifypanel/panel/user/user.py +233 -3
  59. hiddifypanel/static/css/custom.css +6 -0
  60. hiddifypanel/templates/500.html +1 -1
  61. hiddifypanel/xray_api.py +109 -3
  62. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/METADATA +1 -1
  63. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/RECORD +67 -69
  64. hiddifypanel-3.0.0.dev65.dist-info/top_level.txt +1 -0
  65. hiddifypanel-3.0.0.dev64.dist-info/top_level.txt +0 -2
  66. pyarmor_runtime_000000/__init__.py +0 -4
  67. pyarmor_runtime_000000/pyarmor_runtime.so +0 -0
  68. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/LICENSE +0 -0
  69. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/WHEEL +0 -0
  70. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/entry_points.txt +0 -0
@@ -1,5 +1,226 @@
1
- # 2023-04-08T16:23:20.582973
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\x06\xc8\x96\xf4&\r\xc1\x15\xc1\xab\xe9\xd2G!\xb2\xf8\x00\x00\x00\x00\x00\x00\x00\x009]wV)\x97\xd0\x0e\xd3\xd4b\x82\x8e\xa0i\xd2\xc4\x99S\xf9LZ\x15\xdeY\x0e\x94\x98\xc4\xb9U\xe9\x1f\x10^Z}\xe2\xc4L\xee\x91\xfc\xef\xc9)E/\x9d\xa4\xcd\x8e\xbc\x90\t\xfc\xad\xe7%\xbdJ\xc2\x18{\x10\xb5\xaf\xaa\x0b\xa1p\xb4\x84k\x1f\xe4|\nd\x0bx|\x16|C\xd2\x10\r\xa0\xa1\x8f\x82t/M\xaa\xd9\xc7#/\xcf+q<\x1d.\xbe\x19\x1c\x1c_\xa7J\x12\x04\xf0\x05\x8c\x9a:\x97r\x9dA\x96\xb4\xc7<\r\x16ZUbt\xfbC\x1c\xc0\xce%\xeb\x1d\x88\x80\x84\xdc\x9d3\x04\xa3]\xdc\xc7X7\x8e\xa7\x919$\x13\xb5\xd0N\x96\xb1x\x89\xc4Nz~]\x96\xb5q\x9d\xc2\xf8Nh\x99"\x9dB\xf2\x1d\x9d<hb}\xe0K\xa3\x84U\xa9\xb8\x97\xe3\x7f}\xc69\x8d\xdc*Ec\x03i\xe9V@\x8a&\x85\xad,\x16\x07QewWy@n~/\xeb\xb3/\xe6\xa7S\r\xe8\xde\xe3\xd2\xe6\xa2\x8f\xf5\x7f\xaa\'C\xf1\x9f\xbeM\xef\x18\xb6\x1f\xd2\x1b\xf4\xb5\xeb\x83\xed\x8b\x84Gi\x18\xb5\xb6\x0eM%\xb7\x1evdL@0.r\xff\xeb\xc0H\x026\xc9\x11\xf4\x9e\xd1\x97{\x88\xf9P\x81\xcc\xa3g2\xb8\xb5|q\xb6J\xe5\x14*\x83\xb1\xb8\xbaW<8H\xe6\xc1\x95.6\xd5&b\xd0\xca\xfd\x94\xa1\xdc`\x89\x81\xb0\x085\x87Vp\xa6\x9b\'cR\xd6Ry\x86\xcc\x14\x87<\x85i\xa3\x93\x13F\xbc]\xdd\x90o\xe8\xeer?n\xe3h\xc4\x9f\xaf\xf8(\xc0\xa53\xb7S\x1c/\xb9\xab3\xe6\xed8\x01\xd0\x1a\xa0\x8b\xb77\xfa\x98\xea($`\xab\x81\xa2\x038\xe3\xa3\x90\xa4\xd6\xcb\xcf\x9d6\xd3\xf3\xd9\x83\x04\n\xfc\xc2C\xf4\t\xe6\xc8;Z\xc0\xbd\x04\xe8;}\xbdt\x81\xf8\x0e\xa2Mwn\xd8\xa7Vc\xa2\xf5:\xf8\x13\x93\x81\xd7$\x9c\x12Rf\xef\x03\xe4&\t\xbb\xb5\xf1>*\x16\x02\xcb\x83\xf5\x0e\xb8\xe6h\x97nR\xfb\xb9d\xb4\x1f\xecy\xed\xcbu[.b\xf61U\xeb\xf3\xc7\x86\x11?\xc7\xe8rwn\xf0\xd9\xabO\x87\xea\x90\xf8\x02\xd5\xff\xd7KBt\x0e|\\\x8dP*\xf6\x95\x13\xf4O\xac{\xd1\xee\x9e\xf6{\xc5\xfb\xe9\xd9\xd6 K3l\x16\xbfA\xe4\x86\x14\x07\xfe\xad%!\xdf)[@u\x93\x894$\xfd7\xc1\xfaN\x18\x8e\x83\xa3\xce\xe82\xc0x9\x88R\xcf&\x03\x17\xed~;\r\xb8\xa2\xee\x813\x19\xbc\xe7\xa3\xd7Aj\x17\xcb\xce\xe5\xff\xfa\xf6 \xbf\x03f\t\x081&l\xc5g\xf9\n\x1d\xa3t-\x1fnc\x00\xa49L\x19A\xabl\x81\xde\xf7\x9fK\xef\x9c:\x9cZ\xed\xc6\xd4\x147\xb7\xb8\xc3\'\x83\x8f\xdf\xb32H\x08Y\xc5\xf9\xb4\x9c/\xea\x05\xf1\x96t\x1c\xa5\xcd\xef\xedE\x93\x98\xac\xab\x16\xb50\x0e;\xa6\x00\x12\x9c\xa8q\xfb_{\x81\x19\xcd\x99\xe4O+\x10\xe5N\xd6\xd3\xa3\xc8\xc2U=\xe9k\x91\xa06q\xc5\xc7\x97\xbf\x0c\x00f\x17I\xdb\x94\xed\xa9\x18\xe3r=\x9c\x84\xb9\xcd\rk;\x1dg3%!\x17\x17\x02\xfd\xd9\x8d\xe2\x8f\x9b\x02\x02\x8aB\xacgJ5\x13Q\xb9\xd5\x12\xa0\n\xb2O>\xbal\xcf\x0c\xd0i\x80\x1d\xee\x00.U\x9bgR\x13r\x96\x1c\xab\xff\x94\xa0\x1f}1G\xaf\xe8\x19\xb0!\x1fO\xa3\x9d4\xed\x15k\x18\x97bs\xb2\x93`\xe9A\xc7\xbb\x85t\x04\x19C\x8a\r\x9be\xc8^\xc3\xa4\xce\x1f\xf3\xe1\xd5(M\xaf\x80}c\x91\xc7w\xe0B \x12\xf1\x88\xba\xa2\x13\xdd\xacf\xfa>(U\x9fe\xd2\xf9\xc8L\x7f9qJ\xc2\x07\xce\xd25\xff\xbbH\x87\x1a#b\xa6\xd4J\x9b_\xf2z\x9a\xf4\xa1\xc2\xc6\xf40\x96(\xaf\x827_\x89\xd6P1\xf0%}\xa1\xac\xc5\xc2>\xa2\x7f;&\xfc[6\xd6\xce\xad\xae\xc7\xd47}\xfd\x96\xb6\xf1[\x87+\x95Ktj\xc2\xf0*\xf6\x00\xc6\xa3k\xafWa"-\x8b\x02\xb1K\xf3\xe6e\xfdh+KO\xf7\xe9\x8d\xf0)!u\xb7\x8a\xba\xfd\xbcs:\xb0\n\x1c\xb0Ns\xb3q\x10w\xd7\xbb\x1e\xa7\xbd\x02\xe0k\x00l7\xf2\xa4\xaa\xaf\x0c\xe5\xb6\xf9~\x13\xde\x9bY\xbe~\xae\x9c\x18\x81u=-\x8a))\x9aw\xe2\x82\x9f\xc3\xa4\x89\x9ey}\xaf\x9b\xd1fNg\x1a\x84r@\x03V\xd8\x8f\x98>4\xdc\xac\xc0\xb9`\x85\xe1\xc9\x93a\xc3q)eG\xaf\xf2\xb2-b\x12\xf8\x1d%\xaa\xde7\r\x82\xd9\xb2.\xd0KwS\x1c\xcd\xb9t\x03kI\xc00V\xbe\x82\xb4|\xe1\xb5&\xa4\xa0\xe3Y\x0c\xe3\xaa\x97j\x89\xda\xb6\x8c\x84\x83\xecI\x8a\xaa6\xff\xe0`Ht\xffn\xfb~,\xd6\xdf\xba\xe9\x12\xd4\xaa\x99N"\x17\x1e:!\xe8\tt\x04\xa9\xa7\xd1\x9a\x89p\xde\xf0\xbf\xd2\xba\x87,\xeb\xad\x9e\xd3\x1d\x9c)\xbd\xdc\xa7S\xb4\xfb\x88\xa5\xe9"\xa7\xf6\xa8\xe34[@\x82\x00\xa5\xbc\xef\xcb\xb5\x1c\x1d\x9b\x19\xcc\x88\xaa\x8c\x95\xa7c\x15\xc52*\xd5\x9ceC\xd6~\x16if\x98\xb8[W>\xd5\xb0\xa8\\\xf1\xd4\xc4f\xea{\xd9\x88X\x11\xf2\xc8\xa7N?\xe5<\xa5\xda\x82C\xac1K\xf9\xdb_\xb4\x9f\x01@K\xc2R^\r\xc4\x0e\x9f[\xba?"\xfc\x99.\xa3\x11\x1f\xce\x8d\xcaV\x194\x19v|\x9d\xac\x83x\x99\xbe\xa4\xbc+\x15.+\x10d\x19\x0b\xc5\xf2\xebG\xb0\xe6W\xc6\x00\xe0l\xfc}Q(\xd4=\x16\xe8[\x16{&\x03\x82\x97P\xed\x90\xd2\xe4\xaaw\xe4zzH(\xfd\x91\xbc6\x05.D\xa8R\xec\xfd\xfc\x86 \xbc\x81\x99\xd2gT\xcc\x11I\xf0e\xfb\x90\x89%\x82meSF/\n\xfc|\x02Cy\xd9+X\xaa}T0o]\xa1Fm8\xc3f\xfb\x91\xdb8f\xcdeH\xa6Q~/\xcf\xcec\xe3\xcc\xa3\xc3^\xafT\xe1\x9f\x0e\x84nE\xd3\x90\xa1\xa65i\x83\x873\x86\xee\x03\xcbg\x80\xe7\xcc\xd6S\xeca\xb7\x1e0\xe8\x9b\x8c\xa8\xe3\x11[\x92B\xfd\xc7\x9a\x85\x0b\xd4\x8d\x98\x81\xebx"\x84>I{\x9f\xfe\xe7yp\x12\xa1#\xf4MI{\xfe\xcf\xd8H\xa8\xc39(\x18\r\xc5\xc9\x196A\x94\xe7\x05\x8boP\xd7\x90\xa0\xed&\xd8\xc2\xce)+\x00@7\xf8\xd1\x9c`Z\\="D\xec\xaam\x99\xa7\x90\x9e\xc9\xe5_\x85H\x02\t\xe9\x9b_\xb5+`\x832\xdf\xa5\xa6\xa7)\x1b\xa4h\xf2\xd2q)\x86@#e\xc2\xf2tr\xa1\xd5p\xf94\x99=\x82\xc5>\x06=\x86%)\xd40E%\x03r\xe0\xcf\x10\xd8.\xa8Z\x01\xe1\x89\xc3\xdeSm\x89X\xda\xf6\xcf6\xfc&S\xef\xd0r\xea\xdf\xff\xe5W\x80\xb3\xa0\x840\xc4g\x14z\xdf\x1bH\xf5\x1bkJH\xf7\x18[\xaa\x96\x87i\xfcR$\xc9!\xf0@^\xce\xb5{\xe4\xd7\x1b\xd4n(\xb7\x02\r*r\xd8(@T\xf21\xef\xb6O\xb0,\xfd\x1c\xde.G\x1cJ8;\x94\xc0$\n\x08f\xb3\x1d\xc0\xf6\xc1x\x15|\xc6\x95\xc3t\xb8\xd1\x94\xa1|&\xe6\xcb\x8f\xab\x1e_\x7f\xcc\r\x84\x80Z\xe4\x16C\x861\x92\x86|U\xa2h\x95\xd7\x02\x17\xbf\xf7\x9f\x9d\xa5!}\xc2:\x10\x1b\xf0t\xdc\xa3\xdfFi\xdf!h3\xbf-/vg\x8ap\xb3\xd9U\' n_0-\x91#\x11\x94\xe8\xf7\x9e\xac\xeb\xf3\xf7~a\xb3\xbe\x97\xf1\xef\x8f\xf8\xb6X\x19\x126\xbd\xb2\x99|\xd2\x1b\xcd\xdf\xedx\xfd\x1cg+\x05L<#\x9bc\xfb\x8a\x83\xa2\xe5\xd8\xa6l\xc2\xe3\xbe\x84\xf6A\xb7-\xe7S"\x19c+j\xfe\xb3\xc0\xf4\xd6H\x94\xcbZC\x05\xd7\x07\'\x1c\xfd\xb2j\xdbPA)\x1fK_\xc4\xea|`JE\xf5m$u\x84\x12j,\x16\xf3d>\xb2\xf1(\xe49(+\xf5\xb6\'\x06\x86\n\x05\xf59l%\x92{\xe40\xedm\xe2>E\x13fA\xf4\xad\x1d|\xdf|\x80\x9c\xbc\xb0\xb9\x1fX\xa8\xbb$\xeaa\x9f\x8eH\xaa\xcf\xa4\x87\x90 ]v@k\x99\xb9/L\xf4]\x07b\x0b\xd9J\x9aZ\xd4tu\xed\xe2\x96\x06bzp\xb2x\xb3\xe74\xb9\xf6[\xb3q\xc2\xf1@\xfd\xc2\xed\xc2\x9d\xc4\xe1\xdd\x80\xe1\xee\xa6dMIT\n8(\xa0s(\\\xac\xc5\x1f\xc5u-\x04\x0e\xe0l\x1b\x17q\xba^\xb31\x1e\x0cO<\xd5\xfb\x998\xa4\x7f\x17\x7f\xc5\xc9\xd3{m\xb0\x1c\xe4b\xd4L\x0b"\xe0\x12\xab\xfdo\x07\xd9\x01-\xad|\xbc\x81\xd00\xfe\xc7\xa9u\xc5\xf8.\xf1\x1c\xb5\xba\xe2\x1d\xd6h\xd5-\x7ffeP\xb8\x03\x91\xa1<\x934\xa6\xef2\x03\x92$\xd2\xad6&i\xdd\x83\xd4\x96\xfe\xdcz\xdb]\x88\xd6\x03\xa9K\xba\x89+\xc6\t\xd5\xf7T\x91\xb7\x87\x85@h?3\xd8^\x1e9\x9a4\xb67EL\xe4\xccK\xb2\x96\xe9\x1b\xa9a6(\xe1\x01\xf3#\x15\x90hF*\xef\xd6H\x9f3g\xc8\xd0\xdb\x9644@7K\xa9W~q\x12~\xb06f`k\xe1\x1f\x94\xf0\xa0y\x83\x98\x02\x82\xdb\xd7\xb8\xcd\x05\xf8\xbd\x02"$z\xa3\xce\xcc\x90\xedDL\xc8i}\x82P\xba\xb5<8x^\x83hg\xf2\x90\xd9\x11Sz-O\xcbR\xafTx\xc2\xa3f\xd8\xf0\xa0G\xce\x86ea\x121^\xe1\x81b\x87\x1c\xf1\xdc@\n69[\xd4\xd1\x93\x99oA\xbd:#\xc4\xab\\\x01\xa0%nQQ\xaa\x93\x14\xa8\x03\xc8=\x80\xc7\xbf\xb2Q\xcc\x90yQ\xc3Xw\x14h5\xd1\x8e\xf8N\xcfZ8\x1a7\x15\xad\x87p\xa4L\x80X\x94o5\xbdc\x1b\x83\x1c\x05h\x84\x7f\xcc+\xbfk"\x8e\xe0\x8b\xd0&t\xfdAn\xbf\x8e\x94jP\xe2\x1b\xe2\xee\xd6\x97\x8e\xb8;6\x184X\xe2\xc7\x16?l\xdb\xe2\xc9K\xb7qin9 \x84!\x8eNX\xadRd\x96\xa6\xac\x89[P\x9c\xb1\x12\x9b_\xe7\xce\xc8i\x96\xf4\x9a7I\x04!\x8c\x86i\xb0\xaf\xe0C\xca\xcc\x86\xbeJ\xedn\xb0\xe4\xc8\x8b5\xf5\xe7\xc6\xca\xb7\xafy\xd0oYQ\xb2\xa6\xe5\x92\x96\x1aV\xba\x08\x14"C.\x10u\xed\xf6\x97\xf9 ^\xde\xab\xd1\xdb\xa0\xacT\x8fy\x8e~E\xde\xfc\xa48\xf3A\x01\xc1\x842<x8\xdd\xc9+,q\x1b8\x95:\xf17\x91\xf3\x90>\x88(\xdd\x1f\xfd\x8aF\x8c\x91\x90+\xc7\xe0\xc0!(\x1b7\x01\xb3\xfe\xc3\xd2\x13Q_|\x1c\x19\xaf\x9b\xa3\x1d\xf0\xfa\x1f\xab\xc4Q\x9cy\x95X\x8f\xe5s\x00\x03%\xcc\x07\x08\xcaq\x1e\x04\xf0i\x92_z\x81\x81\x8e\xb9i\xf4\xff\x1c\xf6\x8d\xc8\xdc\x18\x8e-\xc3\xd9\\&\xea\xb2\xc1\xa4\xb8\xd0EEZv\x95\xfd\x85!G\x17\x17\xa4\xe2*\xe5\xd8]\xf0\xcf-\xd5\xef\x14\xe1\x92\xe4\xdfr\x81onD\x1az\xd8\xe1F\xb5~\xdd\xa1\xee\xc9`\xc2\xe5\x02\x7f\'.\xe3\xdb\x81\xc8O:\x13V\t\xbe\xb4b\xbe\xcfc\xc5|\x95\xa3\x99G\xa9\xcc\xf2\xf8?{\xd4\xd8Z\xf0\x0eQ\xf1\x8d\x9b\xae\x19\xc7q\t\xec\xf85\x8bA\xaf\xfa1=H#\xb3\xb0\xe18\xf1\xf6]y\xe3\xd2%\x04K\x1e\xae\xdf\x85$\xf2\x81\x87\'\xf3\xb9\xcd\xbf^\xb8\xae\xa5z\x11?\xfe(\xc6!\x98R\x06n\xb3\xcf\x7f\x8c\x80km\xd1T\x9f\xcdK\xb6K\xab^?\xfb\x07]+\xbak5\xa8\x95\xa1\xa3ZA\xcfI=&$(\x85*\xd4\x06=;\xb6\x96s\r\xc7\x8b\xa0\xf8\xc0\xe8\x1f\xde\xa8\xf4\xb6\xe4\x1c0\x8fRg\x96,r\xc8oW\x86L\x96\xaf\xf9\xba\x0e\x05\x96I\xed\xb4)T\x0c+|\xc7\xb2\xd5\xf8\x90{p|`*\xd1\xd2]\xbe\xear\'\x00\x04+[\x03\x94p\xbd\x9c4LY\x9eX\x9c\xce\xa687O\x1e\xe3\xb7\x97\xb0\xb6KH\xe5\x9bf\xe0\xeb\xb9\xc2\nk 9\x8c`wh\xe2:bE\x96M\xb0r\x9f}\xbe\xb4\r"AU\x9c\xb7\x9d\xf1\xa74?\xc4d\xdf\xb5\xf6\xa2\x17\x03\xeb\x13\x04\xe5i\x83$N\xf0\xe0"(\x1c\xd0\r\xa2"uq\x141J\xd9\xd9\xeb\x84]\x06}\xc6\xed\xf9\x0f\x96B(%\x97\x1a\xca\xc0\xae\xcf{9<\x04\x01\xe1\x01\xe37\x0c\x0f3\xbe\xe9\x90\xbb8\xbf\x84\xdb\x03\x0f\x88e\xaf\xf6\xcbW-F\x08\xee\xbf\xf3\xec\x87\xda\xeeI\x9f\xf9\xf1P\xbbk\xfaD\xd4F\xcd\x97\xc2\xa7\x0b\xffw\xba\xecZ\n\xc1\xd3|#\x98\x97\xd3\x89\x8a\xbd\xcc\x06v@(k\xca<<\xe9\x80\xdd=\xb1\xd8T\xa9@\xb7\xc3S\xec\x07\x08\xef\xb4\xbe\xf7=q\xd1\x90j\x0er\xa7\x8b2\xc5Kt\x14\x85\x83C\xb2\xc2\x8e\xf2\x8c\x9ch\x82\xf1\xc5dC\xf7\xb3P\\\x1dFH\x9a\x0e\x81\x04\xe0 \xbd\xfc<\xe2\xe6h\xa4\x83o\xa7\x14\xa2\xab\xba\xf9H,D_L\xd0X\xf9u\xcaYV\x1e\xd2\x01\xbdH\x1e\x80j\x86o`\x7f\x9by\xb7d\xd5\xf0_]\x9eu\xc5n1\x9b\xf9\xde\x99\xca\x84\xb6\x9aF\x17\xe7\xfdQ\xa5\xbb\x9b\x12/\xc6\xc2|\x19{\xa8\x1dnM\xa6\x00\x94\xddo\x19u\xdc\x8a\xef\xe7\x08\x86z\xe9\x89\x0b\x04\x1e\x16\xe8r\x1c\x0b\xebn_t-\xc4\xf2\x03\xb7\xf86J\xb0.\xa8\xde8\nru\xee\x83Y)\x11wq\x14\xdb3\xc6j\xd6\x06\xdcfX\x9c\xd8/$}+\xa5\x02\xf4u\x00J\x0cw,u\xf2\xbb\x18&\xf5\x7f\xab\xa3\xa2c\xc5/\xd2y\xd3\xba\xf2J\xf5\x0f\\\xabP\xc4\x07D\xbe\xc4\x83\x82\x8d\xe1`\xc5:\xcb\x1fz\x88\x84\xc5\xa8N^\x9bsF\xadM\x03j\x0c\xa0\xb3_{9\x1a\x94\x9e@\xfe\x0bwE\xca\xc7l\xca\xf6\x9d\xde\xb2\\\xa3~\x1b\xd9?\x91/Uc\xbd\xecn\xb3\xf2k\xb5\xad\x17\'\xae\x08\x99\x83yN\xa9\xf5\xbf?\xe9U\x15\x0f\xe7\xbb\xe3\xef\x02\x85\x9d\xdf\xef\xb1\xc1(\xa2a*P\xbd\xc5\xf4\xcb\x17E$\xb6\xc9U\xe4\xba\xfe\x07o\x91\xf6\xa2V\x9a\x13\xfa\xa0\x18\xa6\x0b\xe3\x9b\xa1\xf7;\xe0\xa7\xc0b\x99\x8b\xddo\xf5\xac9\xbf\xe0M\x9b\x03\x1e\x8c_\x95I\xcaT\xcf\x14FJ\xe4\xda\xb0\xe1\xd6{1\xff\xc6\x88|\xc7\x9f\xd3F&7\xaf(\x1a\xba\x13\x82K\xd4\xe2\xd2\xd9\xf6\x94\xd4\xa1=[P\x08\xd5\x06\x9bT\xeb\xc1\x02\x8c|\xb7Nhq`{\xd8[\x92\xbb\xec\xd6\x97\xa9\xbe\x8a\x051\xfa\xb3\xe6\xd8\xd0AB\x81V\xbf\x80\xf1\xc8\xe0\xde\xfd\x9d\x87u\xb4v\x8d\x9f\x9a\x94d0=\xf1\xe9\x93\xd0\x98Hd\x91A\xc1\xe4\x95||\xd5\x1c\x8c(\xa9\xee\xb6(\xdf\xa5\xc5m\xc3\x9eA\x9cV\xa3\x95\x0f\xa4/\xc3+\x9c\xf4\xb9\xe2\x87 \x1b\xff\x839\xb5\xde}/C"\x19=N\xe2\xad\x85\xfbUE\x02\x03\x9b#\x05\x87=U8!0\x91\xbc6;\xf2\xc0\xa0(\xdf\x15&\xc2S\xd2\xacQ\\\x9cJF\xcd\x96(\x1bjy\x1d\n\xec\xa2\x94a\xed\xc4?\x0b\x0b\x10\x0c7\x03z\xdc\xb6\x84\xd5O\xd4\xc2\x01\x17H2\x05\xea\xcc\xc7\x89]S\xd9\x94?\\z\xf48\xea\xde\x9f,\x91\xd9e\xb8\x8f\x95_\x0c=D\xa9\x99\x04\xa1\xf9/l\x1a\xfc\xf2i\x98s\xe7]~\xe0\xae\xbb9\xd9\\+7\xe6\xd0\xb7=#Z\xd5\xc2\xcb>\xfe\xf1\xc7\x86=\xed\\\xaa\xc1\xf8]yX\xc6*e\xd5t\x02\xd5\xa4\xed\xb2S\x05\xdf\x1c\xdae\xca0\x96\x873Gf\xb3;\xf5\x86\xd0\x07\x81\x88c\xb2T\\\x07\x13\x0f\xe8\xeb:\xe9*\xbe\x00\xa8\x95\xb7\x8fN\xfd\x95|M\x1b\xbe\xe7\xd0\x05\x95?\xf6\xcf^\x84son\x07\xdd\'n\xb6\x82*\x90\xdf\x18\x01N\xc3\xc3\xe2\xea\x11\xb8>\xe8\xb4\x90^\x97\xd8\xe0RE\xba\xc8Wi3LG\xe1}Q\x9c\x8d-\xd2CT\xbc"\xc0*]\x98\x1bW\x068\x86\xd3\xd9MA\x00\xc4$\x137\xf0D\xcf\xa7\xb3\xc9\xdcKAM^\x84\xf44\\`\x9f\xf2\xd3<\xbc<\x1e;\xa32\xfc\xf5O\xdd\x972U\x87\xa1\xca\tg^\xb4\xe8\xdc\x83\x00\xc7&+\x877\xf7\xa6\x96S\x8d\x9b\x9a\xf2\x8d\x90\xa0t\x8a\xfc{\x87\x05\x83-\xdcj8\x8d^\x19s\xf5\xaaf\xfb_\xc3\x1f\xfbt>\x13M\xdb8%_\xae\x1c*\x7f\xa8\xc8xJ\xa8\x1fd\xe3C\xed\x8a\x90\xe5;\xd8\x81\x9d\xdf\xed\xf6\x1bKb\xcf\x8a\x99\xebM\xd3\xb8R\x82\xd1#c\xf8\xfe6\xd4\xdd\xe4\x17\x8e\x04\x1b\xbc\xb9\x8aE\xf6\xb7\xbc\xed\xea\xc0~C\x0c\xccv\x9e4\xd4\xb45\x88\xd1t\xbd\x08>\xa0\xaa\xc07\xbf\xc4\xc8\xc7$C\x03\x1f{v\xd3\xc5\x14\x00\xfc<\x99\x8e\xdd\xe1\xa6F\xf3\xc6\xf7\xc9I\xdb\x82\xb8\x9a^\xee9)\xfeV\xdf\x10J\x84+O)\x1f@\x05\xc5\'\x8b@\xa5\xb1\xd4J\xe8\xd9o"\x00\xd5X(\xf5\xf3\x1d;\x03\xd3s\x07go0\xf5\xb0\xad\x92\xd4\xbb\xaa\xbf\xc8\x16>q\xba\x03 \x86\x1aN&\xaa\x968\xd8\xdb\xe6\xda\xd5\x06>\xdc\xbb"\xd4\xe8DwZF6k0=!\x94\xd9Q\x9d\xd1]\xce\xd8sZ\xd1\x8a\xfe\x9f\xfcH\xf6A_\xb4\x03\xc1n\xd9\x83/\x94t\xde{\x8d\xf3\xef\xe0]5P\x111\xdb\xf2f6\xb2\xf7\x07ec\xf5\x8c\xdc\x84\x82\x08V\x1b8\xa7\x10\xd0;\'\xa5\x92\x8f\xfb\x8cv\x17S\xca\xe4\xc9\xa7\x8d\x05\xe8..dL\x12\x8d\xbcxW\xee\xfd\x0b\xe5\ne\x8a\xa2\x111\'Ao=r\x1aOQ\x9c>\xfeh_\xd2py\xc3\xb0P$\xcf\xefy\x19m\xc2\xb0\xad=\xd3W\x99cB\xba\xc5\xd1]\xe6\xd2\xa2\xab\xff6Q\xfb\x1a\x81\xf8\xf1\xc82"\x18\xe0\x18\xa5\x0f\x0c_\x05\xb7\xc2C\xe3\xeb\xadE\xc3y\xae=\x1e\xee3L\x91vNhi\xe9\xc8\xa6\x08\x10\x97\xadu1\xcf\xf5\x9b\xffu\xbb\xe8\xac\x8c\xeeQ\xdc@\xa5\x83\x99\xb9e8\xd6Q\x10\xbf\x8e\xec\n\xbb\xbd\xf1`\x05\x9d\xac}m\x91z\x85\x7fwe\xfc\xe9\x0b\x91\xa0\xaa\x01\x0c\xc3\xa3\x9f\xf3\xcaU"0\xa3zyii\xbd,\xe9pC\xbck\x0e}w\xf0\xbe\xac\x9d\xe6p\xbc(C\x99\xfa6\xaa\xe8\xabh$\xe0\xf3\x82\xf9\x8a\x0f\x1c\xfe\xfa(2a#\xf3J\xc4}\x10\x0c\xa8\xd7!\x9c\xb5=\x9a!b\xaaBy\xdd8\x1a<\x00\xd7k\x9c*\xac\xdaq\xd2\x8c\xc5\xd0\x06$ZdA\xa7\xab\x15\xe1\t\x15oMj\xa0\x1a+D\nU}\xd2%\xf0d\x99\x08\xae\xd0\xeexz\xd0$\x93\x16\x97\xec\x1e\x9c\x83~&Z!Ox\x03W\x0c\xd4_\x9a\x85\xffB\xc6\xccw7\xf4\xbby\xa7Th \x0c\xea\x14=\x90\x89\x1f\xbapMJ\x00\xc98}\xd6\xc5\x00\xaaa\xe4\xc3\xd1\x13\xf3-\xf9A\x03X\xcb\xd1\x1e\xa4H\xf4c\x97\xb4\xcfZ\xf2C\xf8M\x0f\xf5#\x08r\xd9\x99\xfb8\xb7S\x85\xa7\xa38\x95r\xd98\xb4\xb8\x07gqm\xc9\x9cBP\xab\x81\x08d\x9b\x14\xb8B\x99\xdd\x98\xe7\xeb\x9f\xaeg\xe5\xe3\xf2\x16l\xadP\xd1\xfc\n\xdd\x08\x8c-\xfd{Z>-\xd4T\x13.\xbaz\xf59\x85\x11\x82su\x96q[\x18\xd3\xd5"m?2\x1b\\\xd2G\xaa\xe73\xc9\xd1\xf8\x19\xb4\x07\xe4\x12\xad\x97\x92J\x03F\xd7eJWC\xce=\xe9\xd8\x07Lh\xf5M\x8b\xc9\x83\xaey,p\x92\xbb\xe1J\xa5Y\xbe7I\xcb\x196re\xa7\xae)\xe9\x03Q\xb9\xaf\xee\n(a\xe2\xcbI\xad_*Y\xb2\xee\xa2\xa2"\x99}5\xb3\xa4\xa0\x87(@\xeb9\xeb\xe3>\xae\xbf\xcaO\xea\xa0\x1fb\xbd\xb6\xbe\xddO\x8a8\x9a\xf8\x80\xfb\xb8=\x8c\xc1\xabE!\xae\xce\x03\xee\xf4`31H\\2\xf8\xdan\x93\xc9\x91F\x84\x89\xefI\\\xd1/\xbe\xda\x9f\xd5\\\x02e\rvY\x0f\x1dD-q\xd9\xaa\xff\x0f\xe88\xf4\x99O\xd2\x1d\xc9a,\x8b\xcf\xfd\x08@\xdda\x83\x15\x1f\xaf8\x8b\xa1~\xb7}\xa8;\x9e-\xb82\xd4\xbc\x04^ g\x81\x00q\xf7\x8fK\xdfC\xd3Ml\xfe\x12\xd9$;2\xbffH"x\x1ax`\r\xa6\x19\xfb\x08>\xbc&\x9d\xda|g3Zu\x05\x80\x1b\xd3\xe8\x8bE^\xb7\x12\xf1\x8c\xa4_\xf3\xcb\x96S\\`=&\x1cj\xa65\xff\xf0\xd3\x92\xb6l?L\xdc6C\xf0\xc6\xcfI\xd3\x88\x8d\xf6\xab\xb4\x1a\x8d9\n\x1fqZ\x1e\xe1\x80\x0fr\xf8\xec\xc2}\xb0]2\x8c\x8f\x8d\x16\x05\xa4\n\xc7\x17mB\xf3\x90`uaI\x82\xd8\x850j\x90)\x10\xf5P\xb8\x18\x93\xe2\x0b\x1f\x8b\xdc\x11\x98\x15\xd7<\xaf\x12\xd8\xf0m{\x80\xfe\x02\xce\x16\xd7\xf1]\xa7\xbcG\xc5\x9a\xe4\x16\xe0,I\x8e\x02\x08}\xe4\x18\xdc?\xa7\xfe\xe4\xb8\x8c\xf9\xea\xf0\xed?O\xd2\xf7n\xc9\xdb\x9e\x1d\xcf\xbcZ\xfdF\xb7\xee\xeb\x93\xe1\xd6~\xf1[\x1f9\xc2\x89\x80\x10(\xae\x14b\xceUwskT\x9e`\xed\x87\xe1Y\xc4\x10y\x96\x06:6N\x8c\xdf\xb6*n\x11\x7f\xf5\xea]az\xc3\xc9\xc6\xa9I\x02\x04\x9a\x80\xd2%\xca\xc93u0h\xef\xae\xa3#\xb3AN\xc7>Z\xc6\xb3o\xbf;\xc3\xd7\xe5\xa3\x1e\xfd\xd0\xc7;\xd9\xdc\xbf\x8ax\x86><v\xc4Kh:3\xfb\xc5\xbc\x1e\xa3\xedeW?\x81\x80@\x12RbO\xe0`m\xc4\x8bv\xd2\x80\xff\xb1\xa6\xb1\xc5\x1aE\x1d\x91\xf9C\xc0@T\xc3A\xd9\x11\x91bf\x9eA\x9b\xc8\x80\xe2\xe6\xb6\xa7\x9a\x85\xf2\x1b\xad\xa1\xfe\x05\xf7&{\xea\x0e\x1e\x91\t\x9a\x1eH\xab=\xdd\x9f\x19z\x8e}\x9e\rh\xd9\x8c\xaf0\xd7\xee\xa4\xdd\x92\n\xed\xec\xac)\xd6\x1c\xc5\xe1{V.\x9f\xfamD\x85\x0c\x15\xc5\x0bg\x07GZ\xaa\xa3\x81\'\x1ahj0kp\x80\x00\t\xea\xf6\xf8n\'\xe8R\xbd\n\xd1pFZ\x8d\xadb\xf4\xca1>\xdc\x14\xd7\xe6\x00\xea\x17\xf0t\x14\x02\xd1\xda\xd18\x01\x81\x13\x8c\xdff\x14\x86~\xd5U\xa3\x0e\'\xa5\x88\x7f%\xab\x90cP\x7fN\xa4\x1e\x18\xea\xa8\xf6\xdb\xd9\x9a\x99s%K\xa5\x0bf\'\xe9\x8b+\xd0]\x07%\xf1Q}1\x1d_\xf4cP\x81\x95W<\xbc\r\xe1\n\x7f71@\xb5X\xa6\x85\xe2!Jt\xf5\xfe#)\xc4\xfe\x04\xd5\xc5\xf6\x8aq\xf4:\xb0\xa4\x18\xbfH\xf8\xf0\x9a"\xa0_\x98d\xf6\xa9\xe6\x9d\x93A\x88\xe9\x08\xfe\xeev}\x08\x0e!\xe5\xcf\x92\x9fN\xe6W\xee\xd3\xc2\xda-\xcf@\xc4Ots(\xc5W\x833w\x8b@\r\x05\xbdz\xbf\xc3\xdd\xac\xdfGwO\xf0&\x89(|;\xb6\xf0\xdf\xffp7\xd5q\xa3\x9fE$3\xeeW\xd7\xdbC\xd1\xc5\xbflT\xae\x87l\xec0\xb0f\xb1x\xf9|\xd0\xd0\x905\x19\xfbA]\x85y\xc2\x94\x85\xe5\xdf\xbc\';\xdd\x17\r\n\x13^\xcc\x8caq\xfd\xe6B\xf8\xdc\xa2\x01\xdd\x1aH6\xbb\xea\xf5\x94\xef\xa72=:\xe1\x81\r\xf3D\xf1M& \xedn\x909)\xe7L(\xc8\xdb\r\xd2\xa2\x11_\xa8\x19b\x90\x1c(y\x03|\x96by\xf4X\xc3\xea\xd2\xca\xc6\xb9\xa2o\xca\x022\xf2\x05\xfa0\xfes\xa52\x89JA\xd9h\xd0 \t\x81\xdc\xa5\xa2:(\xc3\xd6\xd3:\xd2\xbam\xfc\xf8\xe9J\xcbn\xdc{>d\x8e\xd7\xe4\t\x88W4Q\xf3ds\x03\xd8R\t\x0b5\x87\x97=n3\x96&\xc0\x9c\x00\x1aE\x194\x1bO\xfbI.\xac\r\xfa1\xde\xf2V\xbf;PH\xd9\xa1\x84N\x81\xddE\x90$+~04\xeb\x812-\xd1\xac\xdd}\xe4z\xb4\xcf)\x18\xb4\xb4\x19f\\\xbd\xd1\xa6\xd6bfzIr\xc6\x97JFP\xc3\xc5r\xd3\xce\t@\x1c\xee6\x80\x8as7\xb8\x0b\x9d\xefm6wW#)\x11\t\x95\t\x8e\xcc:\xb6\x87r\x02U\x12\xc7\xb0\xf7k+"W\x80\xf49Ub\xa4\x8e\x08\xf3\xd5\xc6\xcc\x18\r2\x01\xb4\x80e\xfc\xcdzZI\x84\xe4u"?\xe6\x99\xeb\xd7D[\xd4\xad\xe8\x81,\xcc\xa5\x9aN\x00\xd2f\x0f\x9d\x93\x11\xd47\x89\xdc;K{\xca\xe9l\x0b]J;\xd4\x19;\xe2\x86I\x15\xdb\xf7]:\xb6\x14\xf2\x87\x0b!\x06o:\x97hn\xbat\xe3]\xbf\xc7?kD\xa73\x0e\x1f\xcb9\t\xfe=u\x071\x8b\xa8w\x1f\xb3=r\x98\x02\xe7\x94\x1f\xd9s\xa5\x94:+\x97D\xb8\xc9\xfe`.\xe8@}\xa2\xd2\xc9\xbc\x7fBg\x07\n^\xb2>\x0f0\x88\x11\xf6\xd8\x18\xee0\xd8#\x19\xc9\xd7%\xe7~4\x9em0\xf0i\xa5 \xf8p\x91\xf2\x8d\xe4w\x88\xd5 \x01\xa2\xe1U\xce\xbf\xf8\x86\\]_\x01\xfb.\xa1\xdf\xa1(AD\xb3\xebQH\x16|R~\xbepr\xc1Sd\xfb$b\xd4\x18-\xa5\x1a)\x8f\x9dr\xfb\x1c)A\xfb\\\xacUS\x94\xcd\x98\x9d\xc1>n\xe2 \xd0\xfd\xe2\xe0n\x17\x94\xb7)\xfe\xe5M%\x1c\xc2\x15\x86\x96\xdaW_\x1bd\x9f\xda\x0b\x14\xc0=Su\xb1:\xa5\xb1\x1f\xc3=\xe6\xf7BZ\xbe\x10t\xcck\x81\x81\xdf\x80\xd8!\xac\xee\x0f/\x15TU\xe3\x89\xf5\x87\x7f\xcc\x15\\X\xe1\xfe\x00\x1e\xb5\xf2\xb1\xae\x91\xe3?\x18S.#\xeb\xd2v\xf6\xa2\x9e\xa6\x04\xe5B*h\xba\xa0Dc\xcep9g\xa0Ge\xec\xab\x02\xe2{\xe9\x05\xae\xee[\x87\x1d\xb5\x0f9\x0e\xa6T\xb9\xe7\xdc*\x08/\x1c`\x86\xce\x91\x19@M\xf2\xac\x8c*\xd0c\x8f%\x173\x96\xb4t\xc4\xe7\xf9s\xf7QH-Y\x12o\xc0S|qg\xac\x9et\xfd*\xe0\x1b\xf5\x0br\xa5\xa0\xf7Q\xda\xee/\x80dI\xbc\xa7U\x8eo\x82\x10\xa2\xf9\xc92\xd1\xe0\xb7uG\xd4H\x11\xdc\xe5\xb2S\x15\xf8\x0f\x9d\xcc&Qq\xf6]\x14\xb5\x88M\xec\xea\xa3-\xbe \xfe\xbc{\x16\xc5\xdd\xa9\x06\x10+\x06\x8aR\x9d\x18T\xb6\xef\x02~\xec;\xbc\xc2\x1c\xb6\x99\x1b\x17\xeb\x18\x9do\xd5\xd6\xc5\xc4\x7f\xec\xe5\xc3\x93~erq\xce\x0f\xecJ\xbb\xa7\xe31\xaf#5\x9d!P1?\xd4\x82O\x84\x02\xcd\xc7p/\x95\x0cC\x97\xab3\x8aH\xaf2c\xfbqI\xb1\x80YN\xa7\xb5\x1a\x89\xcb\xb3\x97\xdf\x86\xf9\xc8\x83s\x00P%"\xffyM\x85z\xfad?\x11\x8ey\x1f\xb7\x0e\xc3\xf7\xbc\x86\x06\xb1\x0f\xedH\xa7\xdc\x9b1\xf2\xb2C\x19<\xe2\xc9u\x90=\xe1c\xd9\x90\x05\x88z;\xdfX\xe22\x18\xf4\xb6\x9a\xdd\xb3T\x97!\xb5\xd7\xbfO\xe4\xce$s\x8f\x0e\xbb\x9fy\x92\x92m\xda\xfe=\x88\xaa\xc7M(U\x83\xcb\xbd\xdc{\xc3b\xa9a\xcd\xc8d\x93\x05@\xccF\x99%\x18\xbe\x15+\x05v\xe9\x89\x99/\x89\xfc\x8b\xbd\x1c\x00\xfe\xd79f-\x15?\xec3\xd14Q\x10\xae\xed\xd5\xf9n^\xcd\xbej\xcaH\x1f\x14x\xc3\xce\xc0\x1b9[\xac~\x1aU-7W\x18\x17\xa2\xf0\x89\xeb\x835\xf9\x13\xb5\x97T\xe1\xa0\xd1\xcd\x9d\xe3\xf3\xe1\xb9I\xe0K\x14J/\xbb\x0c\xe3\xc6*\xec\'L\xd1\xc7H#\x124\x86\x9d\xc9\x0eL\xf3\xe1x\xcb\xa1&w\t\x8b\xba\r5d\x87\xd7(\x9f\xc1\x1ci\x80>u3\x9c-D\x0b~\xccU:\x1cI\xb6n\xea\xc5\x94l\r\x8cRV\x1fz\xba\xd0\xf1n\xffP\xc5%/\xd8\xc8\x1e,\xa9\xeb8{w\r\xf8#\xdaFe\x9f*\x0c\xc6\x1e\xeaZ`I\xe8\x06 Cw\xd1bJ\x8eFNY\x1a2O\x80\xca\xa4\x83L_7yPj<-f\xa2\xfa\x95\x83\xc6\xd4\t\x8a\x93\xc16-\x07d>\xbe*g\x12\x89\x0bH\x9fU\x11\xc8\xfbJ\xe0\xb7\xcb\xe0\'\xfa\xd2`\x80k\xc6(@\xb6\xe3\x80\xe7R\x02\xcf\xe7d\xcd\x8f\x93\xf9\xc9\x87\xa7\xcb\x0f\x96\xee\x02\xb0\x9a;\x8f&a\xa4\t,\x9bP\xff4z\x16\x83\xc0\x9e\x96\xab\xa7!\xae\xeeA\xd0\xa6\x96\xf2\x07\xa3\xe7\xeec\xb2\xb11\xaeS^,U\x9f<$\xae\x7f/^Ta,\n\xcez\xd8\xc9\xcd\xec=\x16\x80\x94\x93\x17\x99\x9c?@\x00\t\x92\xacF\x0b\xa6]\xad\x803VE\xe6L\x06\x127v9\xd8dc\xa0\xf0\xd2\x12\xe1w&\x93\x98d\x876\x1f\xe9\x02\xdd\xc4\xa4\xbb.\xe7\xf0\xf9N8\r\xa9G9\x81\xb2}0qG6O\x81\xc8\xf9[\x15\xe3\xf3\rM\xb9\xccI\x97+.S\xdc\x98\x1e:\x87\x0bvt\x13\xca*\x98j\xe9\x86\xa0\x97\xed\x80:\x9d\xa0\xbc\x83\x08\xd5\xbdD\xb3\xb9\xeb\x85\xc8:\x83r\x9b\xf8\xdai\x0bp(`\xdb\xddx\xfaa\xc2\\\x06Q\x12\'\xbb&\xd7n\x1c\xa3-\x0f\xda\xd4\xc3\x17\x0fd\xa2\xedn\x0f&\x88\x89&\xae$,bj\x1b\x118\x1b,\xbd\xf7\xb7\x87\x9aR\xdf\x9c\x99P\xe0\x7f\xce\xb2\x82gLd\xb5p\xc0_\xab\xcf\xe2\xe6\xbe\xfd|\xfe\xaew\xdc\xc6?\x7f8pJ\x02a;BCVZ\x84@\x8b\xaf2\xff\xe6\xed\xed\xa7\xe3n\x9fh\xfc"\x06\x85\xa5\x14\xcf\xa6\x17\x9d\xe9\x13\x85\\L\xa7\x83\xeb\xe7\xb2\x0e\x94b\x00\x01mH\x0f\xe1\xaa\xc9"\x8c\xf3\x86\xc9\r\x14-b\xd9\x87k\xd2T\xeb\x9a\xdc\xfaM\x1bX\x15SR$ZT\xa5&\xe5B\xceY{\xc8\x81/\xedPR\xa3!\xcf\x93\xc9\xd1\xd0\xb2\xd5\xe7ob\x19I\xd1\xe2\x86\xc2\x84:\x08\x8e\x96V*\x18\xacp\xbc\xca\xd4\\\xeb)O<\x1e\x9d\x8d\x18\xf4W\x86\x14C\x0b\xe9\xfe\xec\xcf\xe7~~\x13>X@\x08\x8a\xcba\x93\x9d\xfc\xbd\xa7\xd5\x03\xf2\x93\xf2\xa1\x96p\xfeJ6*\xf7\xce\x9b\x90tRgy[?u\xe7\x10\x17\xe2\x94\x145\xf7\xfe+4\x7f\x03#\xf8\xcaD\xef:\x99\xd5+H^n\x10O\xa9\x99\x9b\'\xe1\x857u\xc5\xd7\xbb\xa2rK\xaf\xbc\x1a\xd2\x10>\xec\x15\x17\xa7\xa5!\x15b\xdfe0R\x1cP\xb2g \xf3\xfbN\x8e\xba\xadH\xf8\x94\xea\x1f\xb8vD\xc9\xd7\x1c\x1du\x9d\xe1\xff\xc3\x00\x00i\x05g\xbdm\x9b2\x95E\xf6\xdb\x83M\x96a\xb7\x8b\\\x9c\xb7\xf5|\xbadS\x85\xb8`\xc0_\x814\x96"\xc5\x96+(\xac\x1dI6y\x8d\xb3\xd3w\x896\rm\xba\xac\x9e\x18*w\xc84o\x8b5+\n\xc17W\xa6\xaf\xba[w\x92\xd7\x90i\x8c\xe8\x1b\xab4\x91t\xe9\xd7\xc6\xa9\xa3\xd2\xdc\\\xd5\xb7\x94\xb1\xf0\t\xc3\x16>\x90l\xba\x13U\x19\x92\x19\x1b\x9dMn\xe4S\xfb\xd7c\'\xaf\x9d{7\xa9\xab\xa7\x1dL\x97\xfba\xe1!\xbc\xa1\xab\xa3\'Y\xa7P\x83\xbe\'W#\x9bg\xc1\xfdF\x12D\x1b9\x97\xff\x8c{\xd2\xecA\xd2\x15\xfap\xe1\xf7\x1d\tI\xae\xc9\xb1\xff\xa9s\xc4#BEa\x0f\xf4L3\xc9\xe3\xad\x9eW0\xc8\x875\x91\xf9\xc3\xdc\r\xa6\xd1\xa7\x12\xfbX<\x0c\xb6u\x07\x03{ft>1\xa4\xef6\x0e)O$%\xf1V\xed@^<\x89\xf3\xf2d=\xd7\xfaN\x96,\xf3\xc6\xaeJ\xe0\xdd\x1f\xa8\xc5C\x7fe\xfcp\xac\xe9\x19\x96u\xd9\xf1\x05Q+m\x05\xb66\xfd\x81\x18\xfd\xfb\x8e\xad)\x8eL\rl\xe6\xbd\x88H"\xf5\xf8ak"\xcb\x10R\xa1.\xe2\x80\xc2\xe6\x07\x9e/\xbeK:\x13Pc,\xcb\xc9\xec\x17s\x96\xe9Dx\xf4\xa6|\x9a&\xa2\x1d\xc6[\xd0\xa5\xaa\xaa\x07\xd4\xe2\xab\xe4\x17fv8v\x94\xe8?\'2\x1f\x93\x0e]\xb0\xc2\xb1\xe5%2`x\x9f\xb4x\xb8\x96\x92;\xe8\x06\xa3\xc7}\x07\x81\x05\x9d\xc4\xeaq\xc2OV\xa1\xcb\xb5\xe5k\xe5vp\xd9\xc72\xc9\x00(D9\xae$\n=yG\xe8\xf1\x02\xd2K\x03\x9bU>\xfc\x81\xa6{\\\xc1\x12\xbb\xa4\xf0VC\xa2\xc2\x1b\xef\x17O\xf6\x93\xe0\r\x99c\xfbc\x84\'\x01\\:\xd4\x03\x12R\xbcEO\xe8\xd40\xb1\xe7\x10\x96\xcaN\xf8uRI\xad\xfa\xc7nT\xc1\x19\x98q8@\x82\xae\x07MV;:7o\xb3_\xb1\xbe\x02\xa0B\x9b\x8d\x90\x08~\xb1\x1a\x1e\xf8\n\xaci\xf9\rL@l\xbeVt9x\x8a\xbd\xc2\x0bl\x81\xf8h\x18Z\xce^\x87\x1f\xad\x97UpL\r\xe6m\x06\x86\xcb<\x81\xbb\xd9\xf1\xc8\xb9\xda.\xef\xaf#\xa4\xaf\x97\xa5\xe1\xe7\xf0\xe1y\xcb\xc8b\xb4\x124\x0byN\x01\xfa\x0ev\xc7\x8e\x0e,{e\xb5\xf1A\xc6\x85\xd1\xc6\xd6\xec\xc3\x81\x02\xf1{\x19\x0c\xb6:U\x1c\x01s+H\xc2\x99\xe6\xdc\xc5\x8c\xdd\x9c>\x19\xab+\x0c/w\xbdf\xeb\x08\xe9\xb51\x14\xdf\x9eV\x9fZ\xca\xdd\xf9\xbeC\x19\xb0\xceg\x08\xb1\xf0\xf9\xaa\xb1\xf4\xe7#GPu\x88e\xf4\x84\x9b\xd2\x8c\xe1\xe2K2\x98\x94\xeb\xa6\xff\xb6\xfe\x81\xf4\xe6\xce\xe2\xea\x12&>^\xc1\xa08\xfa\x12:\xba\xa14\x8fNS\xbd3\x83\x05WHsM\xd5\x0e\xd8\xde\xf2yq\xb3&4\x85\x0b=\x9b]g7\x14\xdfO\x00\xeb\x0f\x91 \xa11\xe0<\x15\xfe\x05\n\x13C#i)\x8b\xcc?P\xcc\x00\xa4\xe4\x80\xfc\x8b\xee\x03\x17E\x9d\xbe\xa7(R\xd8<\xc8\xee\xfb\xff\xba\xcaA\xbe\xfa\xb1\xd5uo\xbc\x01\nfTN\xc9\x99\xfa1b_\xf1\x07\x81\xf2j\xcb\xa2\x01\xa51jj\x81T8r\xe4.\x98\x97W\xda\xc4\x94\xbc\xa4\x07\xc5\xa0\xcd_i/\x80\x90\x16\xf4\xc2\x82X\xc5=^L\xc4\x85>\xa0\xe2\x06\xba\xd6ZF4\xcbV>[:ml[>\r\xd3B\xb3\xe4\x8c\x8b\x97r\x83ad\xa5Y$o\xdf\xb7\xbb\x90|\x19\x84\x92\x866[b\xe0K\xa8]8W\xfe\xa2SXc\xc4n\xa8\xdc\x18<z$\x04f\xf8\x07\xa6\xd7\xd8\x90\xd0\x01\xfbU\xb8\xcb\x12\x03H\x07\xbf\xe4\x18\x08$\xb8\x9aK\x985tu^%\xa7\xc7A\xd7#\x84Q+\xe3\x81\x06N\xa3\x80\xed\xc0\x1bT\xa4\xaf\xe9hV\xdan0\xf7\xa4\x1e\x8d\xaa\xb4K\x9d\xdd\xd6\xdeqG\x81\x8c\xdd\xf2\x19\x9c\xb5\xe0:\x90I\xf8$\x14\xce-9\x06\xab\x14\xa31\xde\x81\xfd\xac\xcc\xb9\xcfKX\x88u~7\x04\rJX\xf1>\xad\xc1g\x12n\x93W\xbd\x0c\xb2\x15\xf1\x9d}\xf8P\x85\x923r\xb9\x07m\xd2\xf6\x04\x19\x8e\'kW\x1f\xb4\x11\x04\xa3|\x7f\xee\rb\xe3\x17\x87\x0c\xa8\x08T\xf0\x8bym\n\xaeI\xe2\x87\xf4Fy\xde\x9e\xb7\xae\x1c\x95\\q\xcc\x9e"8y\x1fU\x9eS\x08x\x8f\xabQQK\xa9S\x07p\xa6\xa6\r\x13q\x08x\x92\xd8eNn[\x15\xc4G\xd00\xd7\xec\xc6\x01\xc2\x82\xb2N\xcf+\xa5eC<\x01B\n\x81\x1f\xcd\xfe0{\xff\xed\xe1`\xb7\xfb\x08\xe6\r\xcf\xd39\x00\xa2\xc7u T\xdc\xc70\x92\xa1t9@5O\x94[\xb05"\xc7x=$\xaa\xcf\xc9\xdb\xfd\xe5\xadV\x0e\xa6\xc5\x18\x89\r\xbdC_C\xa0\t\xd5N\xd3\x0f\xd4\\\xb8\x8f>R\xf0\x84\xf8O\xb2\x1e\xc4S\xd9P\x9b\xc7\xdc0\x9e\x19x\xabIcM\x02@\x8d\x9e\xa9\xf8\xf8\x80\xc3T\x85Fe\x9fJq#{\x1cN\x8a\xd9\x9b\x93\xa7\x92\x94\xce\x87M9X\x08\xd3p\xbc\x1b\x7f*G\x0c\x01b?\xdf\xc8O\xae\xbf\xf7Sl\x0bbRm/v\xe8Y\x03 \xca\x05\xd7\xc1Ko\xa4\xa4t|\x10\xdcXL\x9a\xdc5F=\x9d\x83\x9e\t;#N\xc6\xe50 i\x8f\x87\x89\x1cc(\xc9\x8c\x0c*\x8a4\xf9\x81\x15\x07\x85w4\xfd=\xb70\x80.\x97\xee\xd3\xe6]\xa6\xc0A"i\x17\xf8V[\xda\xb4W\n\x1b\xa5?C!.f\'^\xeb\x85A\'\x01\x9d\xc6\xe3.+\xd4\x18\x1f\xd38\x89\xbf\xa7<\xbf\xf3\xd6\xb6e\xc5?\x94H\x07\xca\xd1\xbf\xdf\xd7\x0b\xb9\xf1\x8f\r\xe0s_fO\x03X\xcd\xb0+\x98\x9bU\xddQ\xf3\xbd\x8e3)\x7f\xdb\x96\xd8i\xbfb\xb9s\xc1q\xb3\xf4\xf0\xb9O\xaaP\xac\xed\xf3,KM\xaaT\x84\x0bX\xfa>e\xf0#\xb9p;9\x98\xe6\xcb\xfb\x18,1\xec\xe7qg(O\xc9\xce\x13q\xecM\x0e\x86\xe4\xb1\xfd5\xa8\xed_)\x9a\xb78q&g}\x94y\xc4\x958\xcd \xa6\xbet6\xc1\xf2\x1b\xf2T\x1atQi@\xfah1\xe4~@\xd0\xd9_i$\xac\xf4\xf4\x8f\x15p\xdf\xb2\x90\xaf2\x96\xef\xb8\x00\xddwx\xdfs\xde\x0b\xcf\n\xf9\x84\xba^hR\x94\xb7\xf7\xb4\x1e\xd6D\xeef\x0bD+}\x9f\x1bZ\x00+\x8c\xb6\x8c\xc9i\x01\x86*\x19 \x8b*\xaf\xd94\xac\x98e\nW-\xbe\xb75"2&9\x06\xe1P\xbf\xa1\xb3*\x02[\xb7G\x99\xef\x9d\xac\x17oV\xecv\xe3\x1f]\xfb\xe5\xa5.\x8cQ\x8d\xcdE\xb0\xaf\xd62\x0f\x89\xc3\x94\xca^\x0c\xdfQ\x83\x10I\xed\xab\xcd\xaa\xdd\x16\x99&\xdaFcp\x0f4\xf6\x91b\x86\x13\x1aJ\x8f\xd6\xaedp6\xe86\xfa\xa2\xfe\xd8I\x1d\xfc\xf0\xfa\x87\xc4b\xa3\xb5\xe1Yt\xa9\xa4&\x89~\x9c\x9b\xdd\xf2\x88\x10o\xb1,P\xc4\x91\xdb(\xdc\xc3\x9f\xea \x18\xf8?\xf16\xb4\x15\x7f\xe2e\xdd\\\xc2\xc2D\x92\xcce=\xfeNWH/\xbf3\x84\xc7B$e\xbfHh\xe30@RH>T\xdb\xc7^Oi\x89\xe0\xa2\xc2\xb4\xd0\x0f\x14s<\xd57\'\x8at\x8e\x8ay\x95\x1by8(\x05Yf4o\x13\xbd\xfa\x8f\x07\xb9\xf8P0\xb6q\x8e\x05_hI\xa8\xac\xb7\x92}YP\xcb0\xf2/\xbbC,\xc9e(\xa0\xc5\x18i\xf3\x95\xc6\x1aN\'$\xf9\xe8\xb2\x16\xb7\x8e\x03\x823T\xdd\xfb%\xbbsPS\x1f\xebrF\xae[\t\xcb\xf8\xb5j\x98\x96\xff\xb5\x1ec\x01\x1c\xf3Ch\x9c\xcc\x0b\x9d\x88\xdd\xf5:\t\x0c0\x8b\xebG\x80\x1a\xe9\x98\xe9\x11\x05\xe0\x10c\xc7\\\xc3N\xd2V)\xfe\x92\x9be\xfd$4\x84ac\x14\x03f\xa2\x1b,M\xc8\x91;\xecM\xb5\xe6O\x12\x90\x17\x9a>j\xd1w\x19\x1f\x0f\xcb\xa4\x06\x9b1<-\xdd(\xf3\x0e\'/\x0c6FA\x7f\x88q"e9R\xbeE\\\xb6r\xd57C\x99d\xa3\xf9\x80\xb4\x19\xde\xf2\xef^\xba\x9e\x18\xb9F\xc6d~\x16\xe6y\xe6+%Qi\x96\xffV q9L\xe5\x87\xdf\xee\xcb\xc1\xea\xab!(\x0b+\x9f\xbbMx\xa1\xbe\xff\x1c\xca\xd7W\xcf\x83-\xb1:\xd1i\xfeP\xad448\xf8\\\xe7\x11\x0c|\\\xdf\xe1\x91\xb4\x1f@\xb7\x82\x92l\x17\x089\x14\x954`\xf2D(\xd3&-\x13\x9b"\xd3\xfd\x1b\x047\x9dd\x8fF\xac]\x1d_\x82\xd5\xb8\x89\xf1\xe6\xd8F\x8a\x12]\xa0\xf4I"\x80\r\xc9\x99j\x18\xa6W\x05\xf1\xe6\xa6(hmK\x16\xfe \xcd\x14\xc4\x9a A\xeb\xa22\x1f\xe7$m\x95\x13r\xe5\xdb\x98\xbf\x9c\x99=\x99\xf2\x83\x02R\xcbC\xee7\x87\xbd\x04\xa0\x05${VmG\xc1i\xde\x8b!\xc8\x80\x97A\xc7\xba0\x9c\x81\xf24\xba5I\x14\x9d\xa1\xc8\xee#\x98\xc4\xe9\x9c\x7f\xcd\xcb\xab\xc5\xf1G~c\xe9\x90\x03/=\xff8\x15\xe0Q\x1a\xe8\x06;\x08(\xa1\xbd\xe0Lzx%\xcd\xad\x8c\xcfS\xacY\x13\xfb\x8dA\x1a\xfe\xc3\xef\x9f\xdf4\x10j2\xbeOj\xc6\x87\xd2\x95\xfbQ\xb8\x18\x15[\xb21\xa4L\xb2\xd7\xacc\xc4\x96\xd6R\x03<V\x8f\x864 \x90\x8c#*\xc0H"\xac5C6\x11C\x85\x7f7\x98\xd0\xdd\xd5p[\xd3\xefY\x8e\xec"\x85\xa7\x08\xef\x85~A\x02\xd1\xa7\xc8\xd6\x82\xc2\x91\x1e5~\x891\x82(\xed\xd7(\x01\xa9\x81\xa9\xa0\xbeP\x8d\'\x8cT\x88\xfe\nl/\x04\xfbf\xce\xfc,\xbfU\x87?\x10\xa3\x0e\xe4;\x06\x12(\xaf\xf9Z\xcb\xf0\xaa~\x02\x82\xa6/\xe9\xa0\xf3@\xe7\x93\xb41\\ <\x13\x82\x8f\xeb\x07Y\xb0=\xd3\x1c\x8c\xf9~o\xa4\x9a\x90\xd9b\x85\xaf\x8d\x95pO\x93\x99\x97[\xf5f\xda\xbfj\x90J\xd9qO\x9f\xb0\xf8L\xea\xd0\x93\x8f\x86\x0fbN\xb3\xe9rU6\xc0R \xa9\xf3\xe3\xc0d\x10\xa4\x06?\xcd\xc5\xc4\xee\xcf\xfb\xb3\x1d\x9a\x06\x086\x12u\xb6|1Im?\x84\x94\xa6\x92E\xfdJ<R=\xe0\xc6}dgvnJ\xd5~\xe6\x06\'y\xa6_\xdf\x94\x91\xd0k\xc98\x05\x90\xaa\x12\x1b\xed\x9f\t\xc6\x03f\xf4\xe2\x9f\x1b\xf5\xe9@\xbe\x96\xeel\xf1pV\xf4E {L\xc9p\x13\x89\xdd\x1a\xbe%r\xbc\xa2\xed%w\xf2\xaaH\x14\xe6\xd4\x8a\x84U\xd5\xa3t\xae+@+\x84/mDU\xa3\xac\xd1\xcf\xffz\x17@\xef\xa5\x9d(\x8ci\xb0\x1e\xf2\xa8v\x99Y=f(7D\xce\x81\xe7\xb0\xf0\xc2\xbc\x7fK\x7f\xac|\x97\x82\xb1\xa0e\xc8v\xf1e\xb0\x1da\x81O\x89\xa9\xbe\xaa\xc1\x06\xac\x98\x06\xef\xf1\x07\xf6M\x94[\xfc\x9e\x07\x10X\xc5\x01F\xc1@\x865\xdd\x88\xd3\x83o6\xa9\x0bd4\x99nhE\xd7\x97Q\x9aU\xd8\xb2\xd6\xb2\x0c\xf4\xd7\xb0\x88n"@\x80[\x00\xbe\x90\x85K\xc7L![\x1c\x8a\xdf\xd4\x10\xcc\x0f\x01\x00\x95\xda\x92\xd8K\xa5\x88\xef\xdb\x01\xdc\xa5\xdbhJ\x1b\xdf\x12`\x7f\xec\x9c\xe9V\x80vG\xd8\x9a\x06{4\x8c\xf1\x01M\xc4\xa0\x14\xcd[\xb1Y\x19o\xff\xa4\x1e\xe6lt\x1e"\xfa\xbd.Q\xb2\xd0=\x15{\x91hg$\xbf\x01r\x15_\x92\xd9m<f!\xe6\xeeC\xc8\x8aUE\x81S\xf3iy]\xc2A\xf2\xf4\x0b\x9aI\xbd\x00@\xc0U}e80u\n\x96Z\x97U\xee#\x82y\xc0\xf3/\xf7\x01\xfc}\x1e`\xbf{\x15&)\x19\n\x9b!\xb36\xda\x8b\xf6z\xaenk\x06>G\x86\xeb\x04\xf7"I\x0b\x06;lx}pUk;\x954\xd2\x85\xdd\x0b^bl\xf9\xa2<\xc9rl\xbf;\xea\xd5\xc6f\x05=\x15c*\xc8\xbd\x03\x1b\xda\xeeO[\x9c\xf9\x8c\x9e\xf4\xfbwC\x8c\xb8E\xd1\x95w\xe84\xba\xd3ww! \x0e<\xd0\x98\xcf\xbc\x04`t\xd6O\xd6\xfa\xef\xe8\xad\xfe\xb0\x18\xdc\xac\x8d\x8fI\x8c\x99\xbap@\x1cL\xf6\xc9a\xa6K~\x13\xe0\x96\x0fY\xe0\xf5\xb00o\xd0\x19\xc3\xebkS\xe0+\xef\xb8\xa6lN\xe8M\xe5\xbc\x80\xd0\x18\x05L\xf3z\xafm\x9a\xa7\xf4\x82k\\g\xb6\x87\x0e\xe4\x1c\xa0\t\xde\xd8\x913[\x1aR\xb1\xd8\x06S\x9d\xee\xd7aS\xe4^\xa6\xda\x83\x0c}i,s\x9c \xb3\xc66S8u\x0f>\x10X\x85t*\xb9\x1c\tS\xf8\r\x82\xe1\xf6\x8f\xf4\x8b\x94\x11K\x7fc\xd3\xea(\x1f^\x8d\xbd\xe1!\xcdLe\x84><\xd4\x81|\xcd\xf8\xc2J=v\x17\xaf\xa7\xd0\xba\x99\x97!(\x86\x1a\xd3#+\x0fh\x002\xaap\xae\x910\xf5/\x1d\x04\xe0\x860\xd0\t\x8d\xbe\xc6[\xac\x9fm\xd6\xd4\x01\xbbc7\x88\x91@>\x98B\xed\xcb\x00:\xcd\x07f\xd1<\xbbc\xe4Jm\xb4\x03\xe3/\xb4\xea[\xe1\xc6(\\[\t\xe2\xdb\xeba4\\ \xbd\x05\xb8\x15f\x85\xd8\xda\xca\xab\xd3\xfd\xd0?\xa5\x03\xe0\xf8=\xcb\x05*?\x95\x8b\xef\x05\t\xe8\xb37\x9f\xfcn\xcd\x86H~$\x10\xae\xa2\x1b\xec\x0f@J\x94{q\x8dt\xab\x98k\xba/\xbaW\x00x\x1c%\xd3C=*\x17\xcf\xc9\x8f\xa9N\xb1%\x03n\xdb0M\xfc\x11>\'\xf0h\xec\xed\xe6g\xd3\x08\xd8;\xa0\x88\x9d\xf0P~\x14\xd5~\xf8\xa4\xed}w\x9b\x9c\r8\x7f\x88\xb0\xb5\xfca\xb1\xd2{\x95>k|X\x97\x1fzy\xfa\x1a\xfel\x10zJb\xc5\xffq\x80\xb6\xf132e\x06t\xbe\x08\xaa\x83\xef\x03\xa2N\x17\x1bK\'B5\xc6\xc92\rQ#')
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-08T16:23:20.469023
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\x85\x8dR\xf7\xdes\xba\x9f\x93^\xb4\xd3\x1f]\x19\xa3\x00\x00\x00\x00\x00\x00\x00\x006o\xb3lm\xb11A*\xfe\xca\xfec! qD\xa3\x90Rq\xd4\xee\x83DFev\xb7\x84\x16u\x83\xda!\x1a\xc4\xf8^\x8d\x15\xc9w\x15\x96\x88K\xa10\r\x86\xe9\xd6\x98\xfbYVg\x15\xa9\xce6g-\x14?.\xbfM\xf6\x91\xdf\xb2j\x95\xc0\xd5=9\x93w-\xc2.\x7fH\xbc\x15U\xc7\xe2x4-\x9e\x7f\xde\x03<oS\n\x81\x0b>\xe9\xcey9\xae!\xcaL\xc3v\x961\xd0\xdaM\xe2m\x95\xde6$\xad\xa2\x1bv_\x1aIt\xcdG\xfa\xd3\xa38\xf4\xd8sPJI\x9b5\xbe')
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