hiddifypanel 3.0.0.dev64__cp39-cp39-manylinux2014_x86_64.whl → 3.0.0.dev65__cp39-cp39-manylinux2014_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- hiddifypanel/Events.py +27 -4
- hiddifypanel/VERSION +1 -1
- hiddifypanel/VERSION.py +1 -3
- hiddifypanel/__init__.py +7 -3
- hiddifypanel/__main__.py +13 -3
- hiddifypanel/base.py +88 -3
- hiddifypanel/base2.py +40 -3
- hiddifypanel/models/__init__.py +10 -3
- hiddifypanel/models/child.py +26 -4
- hiddifypanel/models/config.py +105 -4
- hiddifypanel/models/config_enum.py +207 -4
- hiddifypanel/models/domain.py +106 -4
- hiddifypanel/models/proxy.py +55 -3
- hiddifypanel/models/usage.py +58 -3
- hiddifypanel/models/user.py +171 -3
- hiddifypanel/panel/__init__.py +7 -4
- hiddifypanel/panel/admin/Actions.py +170 -3
- hiddifypanel/panel/admin/Backup.py +80 -4
- hiddifypanel/panel/admin/ChildAdmin.py +122 -3
- hiddifypanel/panel/admin/ConfigAdmin.py +54 -4
- hiddifypanel/panel/admin/Dashboard.py +70 -4
- hiddifypanel/panel/admin/DomainAdmin.py +195 -4
- hiddifypanel/panel/admin/ProxyAdmin.py +128 -3
- hiddifypanel/panel/admin/QuickSetup.py +127 -4
- hiddifypanel/panel/admin/SettingAdmin.py +224 -3
- hiddifypanel/panel/admin/Terminal.py +51 -4
- hiddifypanel/panel/admin/UserAdmin.py +277 -4
- hiddifypanel/panel/admin/__init__.py +82 -4
- hiddifypanel/panel/admin/adminlte.py +13 -4
- hiddifypanel/panel/admin/commercial_info.py +23 -3
- hiddifypanel/panel/admin/websocket.py +9 -3
- hiddifypanel/panel/admin_2.py +33 -3
- hiddifypanel/panel/asset.py +17 -3
- hiddifypanel/panel/cf_api.py +35 -4
- hiddifypanel/panel/clean_ip.py +125 -3
- hiddifypanel/panel/cli.py +172 -3
- hiddifypanel/panel/commercial/CommercialDashboard.py +59 -4
- hiddifypanel/panel/commercial/CommercialSettings.py +224 -3
- hiddifypanel/panel/commercial/ProxyDetailsAdmin.py +38 -4
- hiddifypanel/panel/commercial/__init__.py +50 -4
- hiddifypanel/panel/commercial/restapi/__init__.py +14 -3
- hiddifypanel/panel/commercial/restapi/tgbot.py +57 -3
- hiddifypanel/panel/commercial/telegrambot/DefaultResponse.py +11 -3
- hiddifypanel/panel/commercial/telegrambot/Usage.py +71 -3
- hiddifypanel/panel/commercial/telegrambot/__init__.py +6 -4
- hiddifypanel/panel/commercial/telegrambot/admin.py +120 -3
- hiddifypanel/panel/commercial/telegrambot/information.py +123 -3
- hiddifypanel/panel/common.py +98 -3
- hiddifypanel/panel/custom_widgets.py +71 -4
- hiddifypanel/panel/database.py +18 -3
- hiddifypanel/panel/hiddify.py +655 -4
- hiddifypanel/panel/hiddify_api.py +70 -3
- hiddifypanel/panel/init_db.py +393 -3
- hiddifypanel/panel/usage.py +85 -3
- hiddifypanel/panel/user/__init__.py +25 -4
- hiddifypanel/panel/user/link_maker.py +416 -3
- hiddifypanel/panel/user/templates/home/multi.html +1 -1
- hiddifypanel/panel/user/user.py +233 -3
- hiddifypanel/static/css/custom.css +6 -0
- hiddifypanel/templates/500.html +1 -1
- hiddifypanel/xray_api.py +109 -3
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/METADATA +1 -1
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/RECORD +67 -69
- hiddifypanel-3.0.0.dev65.dist-info/top_level.txt +1 -0
- hiddifypanel-3.0.0.dev64.dist-info/top_level.txt +0 -2
- pyarmor_runtime_000000/__init__.py +0 -4
- pyarmor_runtime_000000/pyarmor_runtime.so +0 -0
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/LICENSE +0 -0
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/WHEEL +0 -0
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/entry_points.txt +0 -0
@@ -1,5 +1,226 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\t\x00a\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\xfb)\x00\x00\x12\t\x04\x00\xf2=\xa0\x0c.\xc5k\xb0\x07\x04M\x1b\xf0\xf3\x89\xe4\x00\x00\x00\x00\x00\x00\x00\x00\xc2$^&\xf7I\x7f\x8bV7\xe6\xbc\x897\xe9@\xa2J!n*\xc5\x8cs\xa8\xf2\xe5\xddefu\x08\x10\xdf\xd8\x02\'\xd7f\xe8\x9e|\x1d\x1b,r\x1a|\xdav\xda\xf0\xe4?U\xec\xf2\xe4\x93\xd8\xf0\x98\xcb\xe0\x12tR\xac\x1fM\x1eLN\x97\x19`\x1d\xce\xf3\x99\xe7z\xb1\xc6\xd6\xb0\xec\xc0\xb9\xe8\xa7\x90 \x11\x91\x9f\xce%\xee\xeccpo\x04\xa6\xa2u\xd7\x05\xca\xd92\xd9\xe7\x1a\xd2f\x94;\x11\xda\x86\x90;\xcdB\xa6\x05B\xf9\xe3iL\xe2,\xae\xf0y\xe0\xc2\x9e\x1a\xed\x80m\x00\x91\xa5tF\x85~\xa3\x123}\xb7B=\x19U\x03\xfdF\xf6\x8d\x0b\xf2{\x07P\x13\xf8 \xa7\xbcK\xa8\xf2E\xe4\xeb\xbe6\xb0\xb4.\x0c\xc7\xe4\xd8\x80\xfeJ\x9dj\x1e\xcaw)]\x97M\x9f,\xa4\x83\xbd\xdf\x92"\xbb.FF)\x90\xe9\xbcWcuS\x02\x11@\xab\x96\x96]\x165\x1b\x18X\x8e\xcf\xa1\xf2\x84Cs\xf2\x9c\t\xea\xe96\xb9mca\xc6)3\xa2\xd4S\x1b\xe8\xf3\xb9\xde\xd5\x01M\xca\x94D1\xea\xb2\xa4\xf3v\xfc\x07\xc0\xba\xe8\xe9\x1b23\xb4\xc8\xa7\xb7E\xf4g\xfd\xd5dq\x9b7\xd6\xb9\xa3@V\x8f\xd2]\x1e\x9e\t\x98dlE\x8c\xeak\xa0\xa0\x06\xd9\x0e\x0f\x97\x0fZ+t"6\x05\xfa\xd2\x16MJO\x04x/P\xddnBK\xd9\xfb\xc4\xc5\x99z\xe7\x1f\xd9v\xa2L\xd6\xd7\x8e\xc6K=\x80\xb2\xc9\xd6i\xda\x1a\xba\xe8\xdb\xf1e[\x8aR\xdd\x93\x06\xb7\xe4\x9f2\x10\xf9\xc9\x0c)\x9b\xde{Y\xe5\xac?9\xff\x9eL\x1f\x08D\x03\xcc\xd7\x8as\xbe\xa1\x87\xac\x8ee\r\xb0\xd0\xb6\xea\x9e\xfe\xfd\xa6\xd0Nam\x87\x9d\x07\xbe\xe6T\x1f\xa8\x1f\x1e\xb0t\xebi\xc1\x83 \x99\x93\x01\xcd\xac\xb6\xca\xa9\x8a\x9c\xa5\xebzOq\xffr\x1er\x8cT\x88g\xe8f^U\xf6\xcb\xd9*\xdf\x0e5\xf2b_\xda\xdb{\xdd\x02\x1cR8\x15\xeb\xe7\x82\xc2\xe4>\xfb\xb5*\xc9\\\'\x04\xd8\xb6B\xdb\xec\xeb\xb7%\x1a d\xd1\x00uu9\xb5\x1bPX\xd2\xecbeL/\x91%\xf4E^2\x04\x93\x01\xb0J\xc9\r \xf9\xeb\xdc\x97,\x95\rS\xf4\x1a3\x10\xac5:E\xdd\x07\xd0\xd9+\xcf\xd4\xad\xc8\x16\xdf\xb1\xdf7+\n\xf7\xf7\xc9\x18w\x05\xed\x02\xbe\x90\x9f\xd3\xd3t\xc6\x10\xbe,\x0f\x8b\xc7\xcc\x1c\xd4!\xf1!\n\xf1\xab\xbc\x96nGFNW9\x08\xfb\x0f\xfc\'f\x94\x0b\x15)\xae\xb3T\xb0\xb3\xf5\x8a\x13&\xa0\x1fi+QRK\xdc6(\xbaR+\xb0\xe4f\xbdm`\xd7WM:\xed\xdb@\xc3\xd1\xb5U\xc3\xea}\x85B\xa1\x85\xcc\x82U\xad\xb7Do\x880wLo\xb36\x00\xd8k\xf1O\xb9\x9f{\xc5\xd1\x18\xcd{\xe9\x01\xb3\xd72\xdaP\xc6\x0b+\x81\x17\x04\xecp\xf3\xcd\xafT|\xa8g\xb0\xa2\xe1\x1d\xf6z\x9dA\xa0\x0b\xf5XVtphb\x99\xfe\rG_\x92\x1cC\xc6\xdd\\D\x0e\xc9J\x88\x94\x96\x93xa\xe7f\x1eB\x9c\xb7@\xeafwm{\xceL/bp?0\x12\xcd\x0b\xb9\x08PS\x1f\xc9\x03S\x9dO)YW\x13NN\x0e\x87\x1c/\xa8\xb9\xc6\x9c\xd6g\xaa\x8c\xa3j\x98\x8cC\x01\xee\xf05\xd90l\xf4\x9e\x02\xd3i\x06d\x1e\xd9\xe3\xe1\xe0H\x95,tM"tL\xfe\xa3\xdf\xcdo\x14\xfa\xdd\xd3\xde\xf2\xb6bh\xfb\xa1\xe3YTi6\xd2\x9e\xbf^(\xc7x\xa4O\xbc\x07<F-\x8bM\x19OR\xe8\xc4\xd5S\xde\t\xc6\xe1\xc6<9\x0f\xdb\xba\xea\x98\x92\xfd\xc9Z@\xb4\x07\xcaBt,\xd5\x12m\xe6\xc6\xb9\xc5^;4xv9\xc8lT\xb5\njw\'\xc0K\xc3\x1dK\x1c\xa0b\xa5_|\x86-\xdd\x83\x9b\x10\xa4S\x9a\xabB\x99\xa8\x1e\xaaZ\x04\xd9G.\xd8\x88\xc6V\x15m\xa7\x10\x05\xa4\xd4\xb3+\xb1*\xa7%\xe7\xae\x03<\xf7mT\x03A\xaf\xe7t\x9f\xf6\x07\x8f\xeeDoi_m\x86\xd8W\xbe%\xbdT{\xad\x88\xa1\xe7v\x98\x10,\x06\xd4b\xb6t\xe16\xfd\xd2\x93\xb3\x84\x11\xfe\xe8\xa6\x1d~y\x949\x85B\xba\x82K\xc4\x1b\xc5,\x04M\xd7\n\xac\r\xcc\x13#\xc4!;\xe6#\xfa\\\xdf}\xe6\x90b$2\xbb=Xs\xe8\xe8\x9b\xb8h\xcf\x88\xecQ\xc9Y~.>\xee"##\x8bl7\xe4iG\xc0\x91b\x15\xc5\x1cf\xfcrY\x81t\xb6\x0b\x10\x84\xd9\xdb\xc7\xf2\xe4\x18\xa0\x85\xbd\x954:V\t-\xdf\xc9\rZV\x05\x0c\xd03\xfa\xe6\x0c9&\xa6\x14\xb1\xee\xfd\x1f\xf8\xf7\x98,\x8dz\xc8m^\x81i\x0e\xc2\xff\xbf\xbc;\xe8\xb8|\xff\x1e\tb\x1e\xa1\xccG\xc8\xe2\xc7\xc2\x9aN?\xfagA\xf1z&T\x8bx\x01\xae\xd4{\xad\x07<\xb8Bih\xfe\xac\xa4#\xac\x92M\xd4LRy\x04UM\x80\xb0\x8e\xd9E\xc0|\xc0(\xeb\x14\xd0/\x95-\xab\xe4\x99$\x1e\x80\xbaD\xf7A\xd6b%\xa7[I\xf8\x9cO\xe5\'\xd4\xa7\x80\xe6\xc9\xc8V\xe1I\xce\x04\xff\xb0\x96\x93\x17\xea\xf4\x1fUx\x97\x8a\x88]1\xd8O\x88\x8d\xdd\xa5\x19\xc7E\x8fO\x13L\xb8sT\xde\xda\xbf\xf1\xb2\x17\x96\xa1\xdf>\xb3\xf4\xfa\xa9\xf8\x0eXA\xad\xc2\xe8G\xbb\x1d\xfe\\\xc9\xaa<Z\x116\xad~*(5\x99\x98\xa6N\xa5\xfb\x18qD\xd5\xf4\x8cfU\x82F\xf9\xd8!\xcdI\x9f\xd3\xeb<\xb0\xc7B\xde\xa4\xbc\x98\x8b\xc5\xcb\xc5\x12\xde\xdf \xa6\xe7\x8cV\x89\x93<\x7f\x05\xf7\x079\x9c\x1a\x162\x07\x8b\xa4\x85\xc2r\xd2\xde\xd3t\x16\'\x158\xe7[\x11\x93\xde\x95S\xa2N(\x8e\\\xd5\xa1[\xd2\xd1?R\xb4\xe1z\x85\x1a\x0c<xH\xba\x8ewZ\x1f\x8a!1e=\x03\xc0\xfan\xab\xd2\x1eq+\x81rA\'\x8c\x93\x18\xce\xb0\xad\xad\xab\x96\x0f\xd3\xbd\x08\xa3M"j\xed\x00\xc3i\xb5\xde\x82\xd8\x92\xcf\x16{\xf5&o\x96\x82\x93B9\xf6\x92\xa7w\xdf\x84U>/\xbc\x95^\x89\x02,\'\xdf\xb2-\xfe\x9d\xdd\xb4\x9b\x8a\xa0\xee\x9d\x11`\xef\xf9\xc7\xf0_/\x0b\xe0\x18>\x0b\xcc\xc1\\\xa1\xf3\\2\xd1\x16p:,\x85\x19\xcd3\xac\'J\xd1\xbdW\x7f\x82\x17DM\xa9\x025\xb6T"\x89\xf3\x16\xf7\xeeC.\xc3N\x012P2N;\xe6\x13\x8d\xd0\x08\xfb\xa7\xa2\xdc2\xe0\xa5\xf1\xd6h\x84\xbd\xf0\x88D$%\\\xe4]X\xd5\xcfv\xdc\xc4\xe8\xa4\xf5u\xc5\x0cF!\x1a\x94\x93\xc7\x1e\x89r\xa1tzj\xe3\x13z\x9b\x19n\xf4\xc9\xec\xdd\xd8Ge\xab\x91\xc0O\xc9,P\xf7F\xb5\xca\xe8i\xac\xd8*\xd7Q\xac\xac\xba\xf8m\x15\x89\x85\x1c\x90\xab\xf2\xfe5|\xee\n\x85|\xc5YP\x03\x06\xb9\x15\x8bv;\xc8\xb0\xd4\xd4\x98\xf9\x043\x18\x10rw\xf4\x80(-M\xe6\x81\x12>\xd9\xccm\xc6\xdao[J,Q\x802\xee\xd7\x81gX\x0f>\x9bmZ/\xdf\t\xc1y)\x9eS?\xd1c\x7f\xfe\xabtQS\xacXU\t\x8a\x82-\x81d}\xbfb\xf7\x0c\xa2\xaa\x1b\xbf\x13\x7f\x9b\x9f2\x94\x1e\xd7\x879F\xb0s\x89Z.|c a\r\xc9"\x05\x9d\xb7\xa29\x85w\x17[~.\x06S\xc8\xf6\xd6\xfeG\xb2\x9b;u`}:s\x84\x8f\x06\xaew\x81\x8e\xa1\xf6\xba\xbf\x0c\xf3\x1b\xabtJ\x04;\x92v\xc0lp\x07\xe4\x0c\x87(76\x1d\x8d\x9b\xf6\r\xb7~\xcb\x85U\xfdx\xed\xf8\xf1\x1a\x04\xadO\xb7\xff\xe4(\xb3\xe3:O\x82\xdfd\xef\xaa\x8b\xf7%\xfb\xd99\x14\x10\xe3\x8dV;p\x8f\xf7q)\x1f\x05\xe2\xb0\x88\x02\xe0\xaf\xb6\xe0\xce%\xfe\x83(\xdbm\x8a\x98\xff\x14\xf7Z\xda\x0cf\x98\x9c%e\xb9\x9a!{\xb9\x1e4\xf4\xdb\xfb\x07\xb0\xc2(55\xb6\xb64\'\x00\xc9\xcf\xf8EA\x8fC\x83s\x82\xc5\x8d\x00n)\x80\xb8\xa9&Q\x13e\x00\xf4\xd1\xac\xeb\xbe\xf4\x01\xc3\xd3,\xfa\xaa"Q\x0e2\xeb\xb2WI\xbd\xb5`\x8f5k\x9f\x1f\xd6\xae\xb7\'}i\xcdx\x10\xae\xd4!\x03\xcbqIaG]\xe3\xae\xb0\xb8\x12B(\x16\xe5\x02\x1c\xc1\xf2\x01\xaf\xf54\x7f1\xab\xb6:\xbe7\xa0E;\x89n\xad\xf7\x97M\x97\xe1k\xb2\r\x87 \xf4\x15\xcb5\xd0\xd6\x03\xb5\xa9K-\xd9\xcc\xe8\xb2\xa3O\xb9\xd9\xd5\xbf\xb3\xc9\xf2d\xed?\xe8\xe9\xe5\x0b3">}|\xa7\x05\xca)C\xeef.\xd9\x1c\xfa\xaf\xa1T\xd5@T\xaaY\xed\x8a\\;\x9d\x92&6cL.-\xfd)\xe8\x16*\x13\xbb\xd7\xed)W\xfe\xb7\xd1\xea\x9ei1\xb6\xc0\x15U\xd6\xb9\xa8\x17\xee\x1f\xb6\xdfE\x06\xaez\xd67+<\x1b\xfas\x8b\x18\xb5\xa8b\x86E39)\x05\xc7\xb6\xb3\x86\xef\xf6;\x9be\xe63\xb8\x16|dh\xd3U\x1c\n\xe5V`_\xbc\xb0\xb1\xad{\x99\x8b\x1e\xbc\xb3\xd8\x0bSm\xeb\xe0\xa2\xd9\xfc\xe8\x9dF\x1b\xf20z\xder*8\x87)\xe3-6ZT\x9d\xc7\xe3\xbc5\x83\x93%k6l\x01`D\xb9\x1ct\xc4\x0bGi\x9b\xd4\'>\xe0H\xac\r\x96(\xe7\xef"\x1f\x89\x0c\x99\x02:e\xcd\xb0S\xa0\xd5\xa5\xc1%\xf4\x8aP\xf5o7\xe4\xb7m\xad\x1bG#\xaa\x05\xdd&\xbd\x81\x007\x98\x80Q\x99\x01\x00\xe3\x87\xdeT0\xca\x9d\xf9K_\xa5\x10K\x8f\x12g\xa8\xbfG\xb6\xe1\xfbAm\x05\x8fm/\xbd\xbdi\x0f\x1d\xc5s.\xa7\x98\xde|\x18\x06j\x0c\x9b\xca\x16\xb3\xfd\x1d\xfb\xed\x08\xc9O\xd3\xe5:\xe8El\x92\x14\x87(mpZ\x90qD?\x82\xd8\x0c\xa6\xc9$\x8bF\x97\xa1\xe7aGb\x84dp\xe6*\x017\x03K\xca\x8b\xaf\xa0`\x1e\xd8c\xd8\xa7\xa0\x1f\x1d.\x10\xe7?:\xd4\xaf\xbb\xfd7\xb1J(\xbd@h\x14E,P\x18\xda\xf9\x93r\xe5\xd3\x82w?D\xf0e\xb5h\xd2qq\xe5\x8b\xa4p\x02\x01jj}hQ\x88Y\xa4di$Z\x12\n\x07\xd2\xa4\x8d\x0c\x068\xb8(\xe2v\xb2}\xb7WW\x14\xc6\x876\xbf@\x90\x90FS\x08\x04B\x99\xf9\t\xcb}\xac\xb3\t\x1d9\x0c\x04\x13j\xef\xf0)3\x07h\xc1\xcfh\xcbw\x95\x9e\xc7\xc6"z\x8b\xb8\xb3\xb3V\xfd\x83\x11\xe1\xfbd&<\xd2\x95;!V\xca#R\xb11\x9b\x16\xf6\xc6eS:\x1c\xc6N\xf0\xab\x99\x0b\xeet\x14\xeb\x98\x016\xc5A\xc6\xd9\xf8H\x1cO5h\x1f1d\x15|H[\x8a\x8f:\xd7\xe0SN\xf8\x90W\xf2\xc5mt\x05\xcep@\x0b\xc7\xab\xd9.\x97\xe9\xe0\xf6\x91\x84\xd5\x86\xb1\x86\xfb\xd1.\t\xef-gx\x92*\'\xb4%h.h7\x901}\xbe\x19\xd2Q{\x9c725Q\xfe^\x9ct\x0f\x041m\x08\xfbA-\xdb\xe5N\xe8\xfc\xc0;\xe1ua\'\xd0Z\x02g\xbe\x18s<\x11\xf2\x01\xd6\xa8$\x8ek\xfdw\xf0\xa3\xa6\xba\x03\xa6\xadq\xb5=\x11\xa0g\xc6wK;-$\x16\xbc\t\x18\xce\xbc/{\xcb\xd3\xf9\xcf\xdd\x9b\xf6\x03\x91fu\x1b\xe2C:\xff_Ta/77\xf5\x82\tK\xbe\xe7T\x08mE+\xbfc\xa4Uj\x84x\x1bU2x\x91j\n\x0f,\x80}\x98\xaf\xb6\xe5\x1f\x1c\x0c\xcf\xc2\x84s\xd7\xdf*@h\xe5\xff\xf02`tb\x05\xaa\xc5N\x86\xbf\x83L-\x8b\xd58\xeb\x83\xfcp\xe29\x80\xdd\x9e\xcc\xeb\x8f\xf6y\xf4n[t\xa0P\x15\x90\x10k\x03f\xdd\n\n\xffj\xa6+&\x93\x06\r\xd0lH\xd6(c*\x94\xb1\xab\x0e:\xden\xeekj~hPX\xa7`\x86\xc3R\xbe\xe7\xd9\x0c\xa2\xfck5\xd8\xdeQz6\x9b\xe8\xbb&_\x9c\xe8\x81\xdcvl\x8e~\x93\xdb\xdas\xc21O>\xeb\x18\x8e\x99\x91\x9e\xa0\x9a\xdc\r6\xd3\xa6p\xff\xe9\xb0\x12\x10yxy\x0fg|\xe2\xde\x8a\xcc\xf5\xba^IK\x1e\xa7\xf2q\x87\x11\x8a\x08u\xd9\xbc\x89\xa9o1\x7f\x82\xbb\xf0/\x99B\xde\xdb\x88\x98\x02\x12\xb8\x82V\xc0\xf2up\xfd\x84\x01\xce\xd9\x04%a\x89}\xe0\x8f\xe9\xca\xee\xcc\xd3\xd8\xc6\x86\x19\x13\xfc\xffh"\xe3\xcdF\xebp\x80\xfd\x9f(\xb1\xa6\xba\xe2\xea\xf9\xa1e5\x9b\xa3\x80\xf07b;\xf0\xaa\x9b\x97]F\x15\xd9\xf8f\xcf\xdd\x1dceL~\xd5\xb4\xb9\x05BqI\xad\n\r[Pk\xf6\x9eF\xb3\x07\xb78C\xb0\x8d\x89(x\x1a`\x96\x96K\ty\xc6\x83?\xd1\xa89\xfc\xe0\x96\xbe\x11\x1e\xea\x9e\x9d\xbc#!{\x83\xdb\x94\xc3k\x08\xe8\xdd\x14\xb5I\xb4Z{%\xbb!\xab\x82\x1a.\xd7\xd9\x9e\x16\x99\xb5\xaa\xe9\xed"~{\xfe\x1c\xc6\xfc\x13g\x9e\xeb&X!<L\x96x\xeb\x139\xf2\xaeN\xf4"b\x1a\x17\xb8\xdd\xfd*\x0c\xeflp\xb0\xef\x0b1\xd7\xf8\xbf\xeb\x0c\x0e\xbb-\xe3\x0e\xd6\xdb!\x18*\xdc\xd7\xb3\x03~ict\x83\xdd\x9b\xb5\xf0\xaa\xef\xfb\r\xd6\xf7e@Q\xc4\x0f ll\xff\xdf$\xe0r%\xbf\x04|\x16iF]\xfbO\x97\xfe\xe1\xde\xac7\xea\xd21\xcdte\x01\xc3\xa5\x0e;\xec\x1f\x1d\x1f>\xa8\x88\x1aF\xdf\xe0cP\xee&q`\xd3\xa7\x89$\xefD\n\x11\xff\xb8\x8d+\x03\xe4`f\x13FB(\x9f\xcc\xa5\x19}V\xa2\xf3\xda\x1f.\xd3p\xdbI\xb4\x9d\xc8\x86\xc1k\xd3R\xb4\xd5\x03\xa79\xa5\x0e\xcc\xc8\xa1\x0e/\xe0\x87\xca\xf7\xa0\xe5\x8a\x9d\x82\xa9\x17\xa7\xba4\xff\x9f\xb8\xbbK\x98 ]\x1fd\xcc\xb0g\x9fM\xd6\xe9G\xcd\xa4\x96\xe2\xc0\x19\xcb\x0bH`\xc9\x90=\xfdK/\xd6\xb5\xe0m7W\x05{\xdfP\xe6o:\xfer(t\xe6J\x0btY\xe9\t\xf9w{\xf1+I\xfet\xf7\xb4}\xc9\x1b\x88-\xe3\t\xc2\xa0F\x9fp\xbc_w\x7f\xa7fa\xf4\x1b@I\x0c"\xe9a\x1bo\x8d\xc2\xa0\xd8\xcf\xe4\xbe\xa2p.\xc8WnK\xdcS\x97\xd6\x18\x10\xe0\xe0\xa1\xcfqu\x88\xc5\x94\x8cBF\x91:\x0f\xf2\xca\x7f\xe5\x90\x13\x89\x02\x1e\xf5}\x1b\x03\xc3"_Ag\xcfrX\t\xa4J\xa9]\xbd\xab\xdd\xd2\xb9\x8d\x1f\xde\xdd,=\x13}\xb7\x01:9\xce\xb2\xaf(o\xe7O\xc8\xc1]\xc2\x1c\xb4P\x87<\xb4\xc7\xad\t;\x9d\xc0u\xb3)\xeb0A\xabj/\xa7\x16\x85`\xd5\xad3uo\x14\xf2\x7fu\xed%\xf8\xf9\x88\x00\xe5\xd2]o\x7f\xf4\x92\xf1,\xcc\xf9\xf2o\xbd\xa0)O\x9a\xda6\x12\xa71q\xe7\x9e\xcf\xba\x1f\x1b[,\r\xad\xcf\xfe\xeeWVe\xd2\xb5z\xf3\xb9\x18\xd2"\xd6\xf13K\xc5\xd5`d:l\xc0\x95Lp\x82V\x13%#\xa2\x91\xb9\xd0\x02\xfd\x07\x8c\xbc\xfd"\xaa\xc3\xff8\xc5,\x0c\xa9\x86b\xf4\x1a\xfb:@\x07Z(\x1bY\x04*\xf9(\x17\x11S\xd6\xfd\x84oS\x8a\x91\xd0\xe1F@\xf7\xb1)X\x9aL\xb7Z\x04\x8c\xab^\xd4y\x90\xb9~\xd1E\x02\xcd\x80\xe4\xdd\xcc\xec\xe8\xc4\xff\x0c\xdeX\x1aO\xb9\xe1\x13\xac=\x88\x91\x11\x8f\xf8*4\xd2\x90y^[\xa4\x95\xdd\x1d8\xbb\xa1U\xa6]\xbe\xda\x9eQ\xff*\xa0\t9\xe8\xa9\x8f-\x1d\x99\xad%|\xb1b\xbb\xc0\xc4\x1f\x15\xbc.S R\xf0\x12\x87\x19\x18\x9c\x06\xa9z~\xde\x9b$\xe9\xabN\x1a\x15\x06\xdb\xc9\xaew\x1b\x93\xcf\x11\xa4\xbeJ\x13K\x86\x1b\xd8\x95~\xb7\x17\xedm\xd2\xa6\xa6\xd0\xef@?\x7f{4\x1c\xb08\xa6v\x95WK\'tC\xee\x92X6\x84\xb1\xa3\xab`6\xd0p\x81e\xdb\x90\xb7+\xdc\xb1\xccC\x9fo\xaf\xe8\xeb`\x19K\x89<t\x96\n}\x05\x92\x0e~\x93\xba\xb2\xfcFQ\xf3TU<=\x92#&\xb2\xc0\xcbA)\x13a\xf5\xa6\xd0o\'\xfc\xe9\x1e\xd6\x1aO\x87%\xb1\xeb\x8c\xc9\x00\x1b\xcf\x93+\xbd\xbf\x9c\xdd\xe5\x9e\xc2\x84\xfa\xe4\x938\xff\xa8\xac7\x18\xf9\x13\xbd\x84m\xf4\x83\xba\xd3D\x94\xcf\xb6D\x80\'u\x99\x92\xe7\x08.\x93Kf\xfc\xc0T+\xf2\xd7]\xd9\xa4\xe4 \xb1J^ \x00\xc8\xf5JJ&\x80\xda\xa8\xb2\x1d\x89\xb5\rQ[d\xea\xc8\x86\n\xa9\xf1\xf7QO\x9ed\xa8\x10t\x06\x91T\xab\xcdD\x1b~\xa99A\xf6\xe8\xf1 \xaf\x8c\xb6\x188\xb70\xaf\x10\xa5f\x19/\xe9\xd5\x84a\xc5\xb6xJ{#\xdd\xa3\x13Y\'\xb4\xada\xd5!\xd1Q\xfb\xeaL\x9c\x0e\xcb!t\xde5\xd3b\x91\xde\xb2\x1f.w&\t\xf0\xcc\xd6v\xa3\xeaN\xd9o1\xc2\xf6\xff=J\xed\xd0\xf6\\3\xb1\xc62\xf5M\xd2ihD\x01\xf8\x96=\xff\xe5\x85D\x87\xfa\x16\xc3\xa4)\xf0Nyc\xaa\xab\xe2`\x1e\xe5\xe5\x16\x82\xab\\\xb6C\x1c\xfb\xc2\x90\xa0\x05T\xd5\xff\x9e\x9c\xa6\x12$\x85\x1f|hL\t\xeeT\xefL;\xed\xc1`W_}\xce6Ok\x1f\x190\x9ef2\xe6\xb23\xf3\xeb\xc9\xac\x8aD\xb2\x82u\x9a\xfa\x83\x1a\xe1\xcb8f\xf2\xa4\xf5\xa6\x08\x82\xcf\xc8(\xf9x\xa8\x8e\xc7\xeam!\xa4\xa1\xfcl\x06\xa8\xee\xb8q\xdf~\x84\xe4\xfd\xdb?\x00!\xbaGw\x81\x8d\x05\xa9<\x9d\xcc\xd5\xe2\x05\xbfA\xebi\xa4W\xd2*\xbf\xdc1\xba2\xe0\x956\x87j\xe0\xe6\x06\x92\xf9\xa4\xa2q\x86\x08\x96\x1e\x92N\x97G\xee\x06\xdcu\xbb\x1e\x96\xfb p\x10\xbd\xc9\xae\xc7\xb8]>\xe3\xa3\nitnL\xaa\xe4\x945)#\xa1e\xa4( L\x0ec\x99\xe2\xa9\xc7\x08\xa1\xd3\x1b\r\xd4V\xed\xd0}#*N\x18\x84\xd2\xe5\xee^\x0e\xe7Rr\xebN\\bD\x0eEF\x80\xc8\xe9?\x8c\xf2\xca\t\xb8\xb88r-\xff\xa9\xca\x95\x95\xa4+\x1c]^h\xebh\xad\xa5h\xd4\x17_\xdbV\xb6\x13\xfe\xf3I\xa3\xb9\xef\xf2\xd8\xe4\n\xc8U^\xa9\x86\x1f\xc5\x8ac/T\x84\x87k\x0b\xfe;\xc9\xd9\xce\xbfs\x14\x07\x1d\x93\x08]\xe2\xd8\x0f\xf3\xeb\x9c\x9f\xe1\xff\x9c\x03\xe8T\x02n\x9a\x7fW{\xf2#\xb3\x0f;\xc3\xa6\x8c8\xf7\x8e2\'P@g\xd7\xa7M\xbd5Gc\xf1\x1a\x13\xcd\x0eW"\xed\xeab{\x81\xdfPet\'\xf8\xfb\x19`\x82\x01\xb8\xc3\xfcJ$6\x0c \xd8\xc6\x85^\xfb\xf8\x8a\th\xb5\xc5\xf4c\x03\x91\x942\x11\x04W\xe0Z\xd3\x9a+_\x0fe\xa8\xd1\x05\xbd\x93_\xf2\xc0\xedt\x9b\'\x96\x92S\x8d\xa0l\xe1\xcc\xae\x8a1\x9bl\x83j`\x8c\x01\xa7\x93\x97\xe5z\xc0\x8d\xee\xe4\x03C`Ki5\xc9\x06\xea\x92#\xe0-\xc2\x10\xab\x07Bk\x10\x8f\x95\x88W\xb3\x88^\xe73\xa17\xe8_Py5\x15m\xd25\xf8\x90\x0f\x88\xbe\xcb\xaa\xbc\x03\xcf!\x86k\x01\x98\xbe\x8d\xf0\xe5\x15\xa1\x83\xa4G\x17Z\xe1M\r\x9a)m\x05,\x8dF\x9aN\xaa\xec\x90\xa9\x11\xf1\x80\xd2M\xae\xbb\x8a\xf9\xb1\xf3L\x984\xf4\xbe\xfd\xb7e#w\xc4\xa70\xd5\x92^\xf9\xe2\xf5\xf8\x91\x04sk:\xe0!\nN\xb4Y\xc7\x17\xe6)V\xb3@\xc3ALd\x1c3\xc0I\x93\xbd\x98\x94\x8a\xe9\xd2l,kC\n6%\x11\x13U\xac\xb2)\xa6\xd5\xddHSJ\x98\xb5\xc5/\x1e)\xc8l\xc1l\xd4p\x196\x02\xb1\\?>rf\x05\xbb\xe9W\x95@\r\xc9{\x8a\x1a\x8a\xd8\xea\xa8\xf7\xd8%\x82\x85t\xaap[\xdek\xf4\r\xae\xf8\xe4*N\xd0AK\t\xa6\xff\x18nC\n\xf2\x9d\x18OS\xafp\x98MP\x9f\xd7\x05v\xdd\xe6\x14(@/[\x94\xd7\xf5\xcby)V\x82\xb0\xab\xc0\x96)\x8c\xa8\\\xc7\xe6\x1evv\x00\xac\x13K\xba\x1e\x0c\xa0$\x1d\xff\x1b\xe6\xd8j\xd7C\xb7\x170\xca\')oH\xb3tMT\x9a\x17\xd2m\x81}\xfd\xf9\x1b"\x10\xb3\xddA\xaa\xa2L\xd4z\x8dV\xafse\t\xbe\xce&$A\x06\xdbc\xf2\x10~\xdc\xdaC\xe2\xd1\x95qN\x00\xd3\xbb\t\xe4"\xc7\x87\xec\xd1\x8a!i/\xdd\xf5\x9c\x1cv*Hp!\x9c\xe1\xf0\x93\xde$\xd4\xc2\xed\xf4\x06\xffV\xb6\x0c\xfch\xddN<5 (/!6\xbfm\x1c\xc9\xa0\xd9{\xb9\x8a\xc5\x9c=pF\x03\x1fk\xda\x88\x12_M\x1d)\xb3\xbb\xa5\x15D\x8c\xa2\xe5\x16d,\x9fX\xdd\x8e\x0e\xd2z\x88;\xb7jD\x98n(zm \\\xe6QbdA\xf80\xdc\xd4\xab\xcbb\xc9\nX\xe5\xe1U\xfb\x9a\xaf$8\xf3E\r\x83O\xd7S\x0f\x98Ls\xb9}X\x8f\x11.\xf3\xa8r\xb2d\xda\xe8\xd3\xedD\x9def\xcb\xbf\x8d\xef\xaa\x98?^\x1b\x97\xd5\x0e8\xf2\xa8\xd6\xffJ\xf2y\x7fM\xeftM/\x07\t-\xf4\xc4/\xbb\xb2\xc1H\n\x95M{u\xd8\xdal\xc1\xe7\x9e2\xec\x87\xcc\xben\xe810 | \x05<\x86q\xba(\xfd\x8d.8\xa0y\xbcfM\xa9\xe6+\x8a\xbe\xd1\xea\n\xfb\xb12\x8b-u\xef\xa3\xc5U\xe0\xdd:\xa05Z\x15\xeb\xa4\xba\xc3^\xdc\xf8\x0c\n\x0btMD- \x04b\xff\x9c@\x9b\xf8IN/\xc8s~\x07\x82Q\xbb\xc5\x06\x18\x9d;RZ\xd9\xbb\xc8\xbf\xd076e\x0c\x1e\xa6\xbf\xfa\xe2U\x99^\xac\xfbY*Zv\xc0\xa1=\xa0\xd7EI\x96k\x96&\xcb9\x03\x8e\x87-\xe0\xa1\xbf\x95\x17\xacc\xab\xcfC\x03\xfb\x12\xcfu\xd6\xd6TI[2h\xfb\x06\x92c\xe7\x16wB\x92K\x91\x8e;\xd0\x06\xfb\x13u|\xd5\x9f\xf7\xdd=\x07\x13\xf8u\xe9&}\xa8\xc8\x90\x06\xda \xa5\x14\x0e\xbe\x018\x88\xed\x98\x98\x10\xa9J\xc7\xa8\xc6\xa5U\r{b76o9\xc3\xc1nJ\xfc\xc7%\x11^+\xdf\xbc\x81rE@{\xb8\xd85L\r\xf6;\xc1\xe1\xe4\xf1\xdc\xf5\xfbX#L\xbb_l\x11J\xf5\xf6\x8f\xa3av\x8e\xf2\xa3\x85\xc9\xa4:VC\xe9\xa1\x85z\'\xe0\xe2\x91\xbe\xa5Pb\x83\x17\xd6\xf7\xf5\xe0{\xa5x(rqpp\xc5\xe2}d\xf1\xb3H\xc8\xb9hP+J\xb8.\xa4),\xf4#\x10\xccY\x9c\x08\xb12\x14\xe8NP\x1d\x13!\x00\xb0\x1f)\xac\xc9X\x05g\x86\xeb\xd2\xf4\x9dw\xac\x8f\xf8"\xee\xe3\xed\x1e\xa5\xb4\xf8^\xdd\x17\xbc\xfak\xa2\x1d\xb1s4G%\xf0\xf3\x9d\xf6\xa3\x15\x9cr\xe8\xc7\xd4\x07\xfe\x7fb;O\x04q/Yr\xd5\xb2\xae\xb6(u\xd8}\x02\xf5\xc4\xbb*d2\x89.9w%\x08\xc2\xa1\xff\x1d\xbbJ\xbabB\xac{\xe9\xc0\x81%FX-\';\xa42\x1c\xc3\xf6]>\xb8\xfa\xfd1\xd5\xb4\x8d\x838?\xa8@\x84\x93p\xf5\xa7\xde+\xa4}\x14\x98,\xda^\x11\xc5\xcd\xdb=\x88\x01\x8d\xce\xb9\xe2\x9c%\'\xdf"\xef[\xdb\x1e\x7f\xb8Xq\x0f?\x0c\x15\x91=n\x0b\xf8z\xdb)\x7f.\xdf\xf2\xdf\xefR\xb1|\xb3\x8c\x83\xe8\xc6\xad\x96\xee"lw|8\xf4\x00\xfctG\x0cg-\x04\xdb\xe2n\xdc\x03\xae\xd0\xdc\xc7\x1e\x08\x08\x00y:v\x81\rW\xcd\xee\\\xb6\xd0\xa2\x9b\x0c.\x98B\xf1Q-oh\xd4\xba\x00\x1c\x0e\x8c\xdd\xf3\xa8\xe4bs\'\xed\xaa\xf3\xdedh\x16b\x0c\xcal\xe9\xfcu\xc7\x95\xdc\xef\x13~tt\xcf\x18\x1a<\xb4\xee\x06\x8bC1M1j\x94.\xa7K\xbf\xc6\xe4\x07i[A\xbb\xae\x9aS\xc3\xea6\x8b\x10\x04\x1cp\xf1O\xaa\xd2\xb1/\x12\xcd\x16\xff\xe2\x0c\xab\x01\xae\xc3q\xd0<g\xdap\x05O<\xc6i\x94!\xfcY\xa6\x9f\xd7\\1F\xe6#\x9c\xe3\xf3i\x19\xfft\xb8\x1fL\xae\x9c\x8a\xc6\xb6gI\x82#\x83@\xaf:\x08\x99\xd0\x87\x99}\xd4\')\xe5R\xa9JjS^\x7f\xd9N&m\xe5t-J\xa8\xf2o\x8c\xc2\xcd\xb8aK\xf2\xac\xb9\xf0\x08\xf8\x03F\x81M\x15\xdbm\xac\t\x91K?\xbf\x01\x0b\xd2\x0b\xe2\x19\x82^\xe52n\xac\xad\x9c\x14\x0b\x13\xfa\xe3\xda\x89O\x1d\x95\xe1\x8bG\x03\xf3gy\x12\x8b\xbc5\x13\xdcl\xec\xb7\xd5\x865\x85\x9e\xec}s\x1b\xd4J|{\xc5\xd3\x15\x13\xb1\x1f\xd8\x8c\x11\xab\xd6|Y]k\xb4\xbfA\x9f\x14\x84XX\xcb\xd8\xa1P\xfa\x02\x0bb7}\x82\xfc\x15\xf5\x86\xc4&\x7f\x0f\xbe` \xdb\t\x19\xe1\x81\xe2t\x18Sb\x96\xe6\xabZ\x9c\xcb\xea\x11\xc2\xbd\x9d=s\xabMq\x1b`\x9d\x0c\x94%\xf73\x8d\xbf_5\xdc\xfct\xfc\xa7\xe1\xe2U\x85\x93}\xe1\xe5}\xf2\xad\x12l\xc9/\x94n\nT\x7f\xe6\xe4\xdf\x8d~\xbb>_w\xe6Q\x83\xcf%\x08\x87\xde\xc6>\x8b\x85\xc8/\xc5e\xd3\x16\x8f\x91\x93\xa5\xa6\x84\xa6\xda5x\x91\xc0\xea\x10D3\xcb\xca\xd0\x1a\x94\x17z\xc2\xbc\n\x159.\xf7\xc2]\xed\nw\xa4>\xb0O\xaa\xf9\x88\xfc\x04\xda\xe3\x80[\xce\\j\xc49\x1dZ$\x95\xb2%\xc8`*l\x11\xeb\x17\xffq\xae\x9d\xbf\xed\x02U\x08\xd0\xdcI|\xf1\xe2`\xc1uG\xf0\xb0\x17\xc9\xa1\xc05t\x0c\x04\xb7\xd9]\x9e\x19\xaa\x99\x9a\xb1\xadg.x#\x19\xba\xdf{\x9c0\xce\xdd@\x1f\xa4]0\x97\xc7=\xd3\x86\xf3\xf0\x0e\x9cR\xc3\x85\xd4\xf9\r\xae\xaf\x93\n\'\xe9\xa9m\x02\xe7\xcdeK\xb2\n"`i\x89\xac\xdf\xbac\x92PZN\xb3\xf0p\xb4\xb0\xb3\xe9\xcc\x86\x93\xf2 \x80\xc4\x1e\x1f\xfa\x15q\x17\x8b\xbd\xf3\xd4q\xbf\x90\x91\tlI\x8b|\x0bM\x9d_8\xf10\x82L\xf2\x0b1\xf3,\xfd\t2\xe4\xda\xb4\x91S\x8f\x9a\x1d\xcbg]\'k\t\xccEJ\x11}\xcaN\x02m\x13\x0f\x8ak;;\xbd\xcbH\\2z\x1b_N\xda$\xd0`\xe5\xbb\xa20\xc5\xc1\xe5\xb8#\xd4\xc3\x9e\x18O-y&\x92C\x9d\x84\xc5qR\xd2@\x02\xdd\xd3\x93\x8b\xcb\xd7\x96\x0e]|U\x16\xc889&M\x03\xa5\xd5\xda\x84\xad\xce\xbd5=O\xc9\xff=\x85]\xa0\x12\xc0_e\x80`EO\xee\xa2\x85V\xf6\x92\xdd\xbcRo-\xdf\x9b\x00\x88\x14\x130\xd2b`\\\xf6$\xba2T\x87E\xbc\xea\xe9\xf6\xc1 \x0e\xae\xb9\x13\x82\xef#D\x03\xc8\x97\x00\xb6\x99Fnj\xaa\xe1\xb5@\xb1\xfb\x0e\xae(\xfb@\x94;x,\x90\xd5\xcb\x9a\xbcK"\xf2\xa3\xf2\r\xabM\xd3\xae\x9f\x14"\xa1hf\x11r\x11.\x97=\x1c&\xba\xc5\x83\xb8[\xf05~\x0c+q\xde\xf6rD\xec\x8f\xd0\xca/\x81\xb3\xd5\x88\xb2\xad`\xd7\xe5\xd45\xff\xb4\xdc\x9fX"\xef\xd9\xb2\xa3\x8a\x1fr\x86\xd5\x95Zr\xa9\x1bJ\xf75Y\x04\xcdrAb\x85\x03\xc20c\xd5\x96V\xb7\xeev\xf8\x08m\x7f\xde\xf20\xa5yOF\xb9u\xbc}\xaa\x11\xf8\x1f>\x19ra[\xf0\xdc7\x05%L\xdd\x80\x96\x81\xc0\xd8\x1e\xd8\xb3cA\xad\xe3\xee\x1ag]sw\xb7\x90\'\xaf>\xc8}\xef\x8e\xaf\x8dv\x99\x03\xa9_\xec\xc2\x14\xe1\xd2\xec\x88\xb075\n\xb8o\xec\xabD\xb3j\x92e\xbe\xbc\x15\xe8k;\x1a\\y\xf5\xeb\x13fO\x7f\x843\xb0\x82\xe0\xd6\xad\xfc\x07\xc4\xcf9\\\x1c\xd5\x0bH\x97UT\xdc\xed\xc9\x06\xd3)3X\x9c\xe4\x95\x046NI\x9f\xb5\x9d(,\xc4\xb9\xdd\x05vZ"\xf6\x98\xfc$\xe7\xca\x9f\xa2\x01\xb9\xa8N\x12\x1b*\xfaJ3Tu0\\\x10\xc1(\xdc.\xf8 b?\x88\xa5\xef%w\x94\x82\xe8?\xcc\x04C\x96\n\x15;\x04\xa4\xc8K*\xe4\x90>]\xf0#\xd8\xb7\x91\xde_X\xca\x89\x86{AQU*,\x037T\xbf\xd3%\xdc\xed\xccD`\xfd#\x12\\\xf5\xf6\x00\x98\xe4\xa7o\xae\x9b\xe2\xf4\xb3.*\x99K\x9d#\x82\xab^\x18\x7f\xc4\x08\xe7H"\x12(k_)\x1f\xafQ\xc6qDa\xce\x18\xf0\x1e~\xe9p`/E\x8b\xa4\xdc\xa3\x93y4\x88\xfb6\xb1\x9dF\x94\xf9d\xeb\x02\xb3!\xd1\xdc\xbb|\x1e\x98b\xd1\xd4\xf6\xc9\xd9\x02\xfdae\t\x92\x97n\x8b\xb0\xa1\x1e=\xfdt\x84\xb6\xd7R\x01\xd8As\xee\x01a\x0c\xd8}\xaeP\xb5\xeayaL,\x90\\.5\x08]\xb4V\x04\x8c\x9e\xcc\x81\xd6e\x0c\xaf\xe7e\xb5\x9f\x85(Kn\x8a\xa9\xe2\xed\xefJe\xdes\xd39}\xb1\xfb\xa9u\xb2K\x93\xe3\xafi\xc1\xfb\xed\x9c\xc9\xe1:\xcb\xa5r\xc4\xfd\xa4\x9d\x1ed\xc8\xfa\xcf-\x96\xa2\x0f\xc5s#o5\xd8UWP0{\xb5\xc4\xb13\xb2\x89\xbd\xe6\xc9)\xe7\xf0\xf9Ls\xd9\xd5\xb8\xf0\xd3\xfc\xbc\x8f\xe2VB\x81e$\x90\x96>\xb8\xef\xff\x85\xcd\x1f\xfc\x8a\xd4\x90\xa7\x0b$]X\xae-\x1b=&\x8b\xca\xb7\xcco\x07\xa2iGA\x9b\xb7\xe2\x05\xf2TY\xc9{E\'\x12;\x81\x16\xa6\x19\xae\x89\xc3U\xae\xcf_h\x8dm\xcfU\xf0Fj\xfdk9\xc9K\x15}\xb1jp\t\xc0~\xc3\x07*\xcc\xde\xdb#\x82\x82\xf3Z\xdf\xf0\xf6\x17\x9f\xab\x9b-\x18\x0e\x00\xb0g\xbf]\x9cZ\xe6,W\xd4&\xfe\xf3\xdbvB\x93GV\x07\x9c\x967\x94@!\xb2\xe1\xff\xd5\xdb\x0f\xe2^\x0e\xd0\xb7\xa4-~\x81\x15w\x85\xb6\x08x\x02\x08\t\x0b\xad\x1c\xda\xb3\xb2\x93\xe9*\x0e\xbf\'\xb8\x1c]\x15\xf2\x18P2x\xc1l\xe6\xec.\x83\x18u\xa6\xfd+\x97\xbf\xfa\xfcE\x05\x96l\xa5\xff\t\xf7,_2\x8f\xed\xcb\xb4\xc9:.l\x8e\x0bf\x97\xc4\x92k\xe7\xa5\xcd\xd8`]\x1a\xab\x8b\x7f\x19g6v\xf6r\x95\xb1\x94\x05\xad\xbd\xcf\xae\x08\xac\x13\xb0\x8c\x83D\x85\x8c\x14M\x877\x8b\xcey\xd3\xc2Q\xe1y"A\x96\n\xb9\xfcL\x91\xaa\x0c[aw\xc6w\xeaP\x85\xaf\xe2\xd0s\x9evF\xa4\x8b\x85\xfb\xe4\x0e{\xef\x9b\t\xd3hUg\x8a\xcch\x84cv\x03\x03\x963\x8c\xa4\x99C\xd4\x90\xf6T<_|\x84\xa4~\x1d\x8d\x94%x\xd6\\ffY\x85\x8a6\x82rL\xf9^"TlT\x0e\xd1\xc7\xa9L\x7f\x8dMP}M\xc8j\x94h\xa5\xd5\x1aU\x18\xcc\x94{\xc9\xa9\xac\x07FZZ\x00\xc3y\xae"f\x1fN\x802\xf9$\xdfS\xf8\xf9\xeds\xdf\xbe\xd9\xe5\xee\xac\x08\x8b4\xda\xdb\xa5\xea\x0b\x15\x00\xfc\x03\xd0\x96<\xcd\xaa\xb5\xd9\x9cX,`\xd7\xf3\xc5\x1f\xa2~\xa8c\x9b{\xf6\\C\xeb8\xa2\x7f]\x0b8\xf3\n\xa5\x12\xe0\xed[\x8el\x86\xee\x85\x880\xf4\x0b\x0fm\t\x1e\xf2 \xf7\xa9 \xaa8\xd3{\x84\t+\x07\xa7lry}P\x80\x00\xa0\xa0K\xbfr\xbd\x1d33Z\xdf+\xd8\x89T\x16\xfaN\xb2\xc9\xbb<61\xa5`b\xaa\x98\xf7\x82\xc3\xc4A\x90\x01\xf8`\x96f\xa9\xef\xa995\xcf\x03q\xb1\xcaG\xa8(e hg\xb9 \xa5\xec?U\xb0"\x97\x90\xb8\x96U\x12\x8c3Zv\x8a?\xfa\xc1\x0c\xca6\xb3\x8bt|I\x14\x1a5\xe9\x01e\xcd\x89\xcd\x9c;\xa9\xaa\xc8=\x0c\xe1\xea\x87\xbfgH\xb1\x08UE\xed\xbde\r\x1c&\x82\xd1\xc4\xf1r\x9f\xe4\xdf\x9b\x89RC\x9a\xac\xaa\xcbS\xae\xbb\xa0\xf4f\x12\xd9\xd3y0p\x84\xab\xd8\xcc\x15\x82\xab\xb0c\x1b\x12\x9dg>}^\xcc\r\xa3\xdc\xf0U\x1f\xe2\xb8p\xd8\x00\xa9 \xaf+(\xac\x92\xc5\xe3l\xb0\xd5.\xc2\x87J\xa3\xd0\x18\xaf\x9ez\x82\x1c\x90\xc9\x9e.40\x95\x1c\xc44\xe0\xfbA\xde\x0bg\x1a\x87E?\xd4z\xff"\xfb\\\xe0\xa4F4\xa6i\xa7\x1e\xa6tV\xf6]G\x8a\x00c\xd7i"\x18\xc8\xd5.n\x9f\xbe\x91\x80\x004]#~a~\xfb\x9e\x98\x8c\xfb\xdbLN\xf9\xe2\xb4B\x92m\x8bW\xa5f\xd8\xab\xce\xe0\xdd\x11\x91>\xb0Z\xc3\x8d\x04\xfd<\xbb`&\xd7\xd4\x97Y)\x06\xe4cP\xc0\x1c\x1b0\x91?\x01\x9d_\xce\x0eLI\nV\xd4E\xfe\xa2\x1e^\x90G!\xeb\x92\xa1\xef\x01\xc4\xad\xd2\xba\x9e,\xb6\x1aZ\x93\x80\'\xd9\x00\xdc\xfd\x9dknW\x97]\x99\x8f;\xca\\\xe8\xb3\x17\x918\x82d\x11\xc89\xffl\xaa\xa5\x94\x85\n\x8d\x1c@\xf7e~\xba\xbf\xa1i9\x17\x94C\xf0s\x9b<\xae[\xdd\x1e\xca\xa9\x91\xc4[\x04\xe0\x18F\xf1%\xe4\x9d\xcc\x9f/\xba\x86\xe4g\x8a\x1f\xc7\xfc\xb9\xc5\x92"\xbc\xb1\xd5\x06\xaa6\xf7\x07_1-\xc4K:)I~\x80|\xab\x7fL\x84\xb2@V\x80I\x8aq\x90\xea\xa6\x06\xfa:\xf4\xebC\xcd\x1b\xcb\x06\xe0\xf0HUq\xe9\xe2\x19pVa\xaf/>\xad\xff\xa1\x02`\xf2\xf3\nh\xe6a\x1br2\xae\xc6\xa0\xbb\xe4\xf5\x97\\\x8a\x93\xea\xdc_m3\xb2e\x84I\x12\xb2\xec\x16\x11;C\xe9\x1a!\x0f\x94\xbb\x01\x0c\xa5p.\x88\xa9\xea-:\xa4~\xf9\x8dZ\xd8`\xaa/\x924\xea\xef5Df+\xcf\x1a\xa2i\xc5\xd9\xbd:;>\xf6\xb8\xdc\x93\xd5\xcd\xe5\xcd\x01"\xa9a\xf7\x04\x84\xd5`fb\xd4\xf2uR\xfa\xdf\t\x9dJ\x92\x95\x1d\xa4\x17n\x04\xa9T\xac\xa9;\\\x80\xed\x82\x0b\xc9\x0bAI\xd1\xda\xbd3Md\x98\xfcT\xb6\x80\x01\x88^h[q\x10\xa4(\x1e\xed@\xa5\x0f$4\xffO\x10\xa6\xa1]\xcb\xd9\xdc\\#\x83\x93C\xde{VX\x9dM\x1f\x1e\xaa\x00\xcf\xe4\xce\xd4\x89\xfe}\xc6\xe9X\x94\xdd\x04<}\xac.\xe8!\xf5\xd3\xb9\x97\x0e\x86I\x94T(<\x92\xf2\xef\x15\xae\x8e\xfft2\xad:\xe0j\xe67\x14c\xc4\xf9w\xe7[\xbc\xdf\xa7\xfe]\xecn\x16svk*\xd2\'\x9d\xe8\xd6^\x14\xcd\xd6\x7fn\xcb\xf7\'M\x1a\x17h+\x06\x87\x8d\xee\x11d\x13\x80U\xe5\x85\xd0\xda\x8c\xabi\\R\xd0m\x85)r+\x9e\xa5\xabj\xf5\x92k\xfcO\xf8\xe5\xbdr\xcd\x9d\xf3\x0b\xe1[\xcf\x95\xe2\x0cz\xce\xec"m\xef\x19\xb0\x0e\xd3\x8e\x80-\x83\x9c\x03\xf5\x12\x8e\x86Ag%\xb1\x0e\xff\x80`\xd5 \xc9\x81\xe4a\xfe\xd0f\x0eFM\x14\xdf\xa7\xe2\xaf\xc3\x1f4\xd3"\xb9TB>H1X\x84\xb8\xe4Z\x9a\xb0LB\xe3\xe8\nb%\xe8k\x84`\x82\xce)\xd9q2\xc8\x0b \xbe\x06\x80\x18y\x81\xad#\x03\xa6\x94\xef\x8e5\x12^\xaf\x1b\x85r\xd9\xf8\x07\xfb\x9b \x8f\x81\xa1Q\x13m$\x8fA\xa7\x7f\xd8Qh# \x05\xf8\xec\xcc\x90\xdd\'\xe9\xb0\xe7\x19\xbe1\x13\x1a\x02\xa3\xbar\x82*#\x18\x0b\xc0\x92\xdc\xd6\xb7\x97\xed\x8f\x15!s\x9c\xb5\xf9D@\xf5\xbf\xd7\x18\xb7*\x13w\x8aYm\xe8\xe7n\xca\xd4\xc6\xfd\t\xc0\x9f\x17&cU\x97d\x15\xf1\xb0\x905\x01X\xbes\x0e\xd4x{\xc0\xfb&H\x0bO\xba\x80~\x8aq\xfb#\x01<\xbb\xea\xc3\xba\x0b\xb0\x14x\x18\x91\xdbM\xe3WF\xeb\xd1\xbf\x8bw\xa9j\x9f\xa3\x8d\xf1\xe3\xd7O_u)\x14H\x93([\x04\x88\xa8\x08\xf27\xfd\x7fS\x05\xc1\xae\xf1\x15\xc4\xe9\x9c\xb3\x98\xa2\xfbL\xbb\x80mG\x9az\xd2\xad\xe2\xd0*\xd1|\xd9t[\x03\xa1\x902\x00:\t\xc6\x9b\xa9\x86\xfc\xe6\xd6\'2!ZC\x1cu\x0b!\x9a\xad\xfci\xda\xc3\xddt\x02\x06V/Wf\x10\xd9\xf7\x9f\xc1q}_\x1f{\xa1\x00\x07F\xd7\x85\xd7\x16\x00!\xf9\xf7\xfd\x16\xc4)6\xa0&s\xf9H\x9e\x93hK\xc8\x19\x07\x9e\x1f\xaa @Q\x89\xab1\x9a<\xa77\xb9\x98%\xc9y\xb6r\xec\x18g\xfb\x9e\x81\x03\xb1\x1a#\xd7\xa6Z\xce\x93\x9fCK\xe7\xcaO\xfc\xb0zh\xde\xbdEq\xf6\xd3(\xeb7\xbe\x01\xc4\xbf\x05\xa9-\x87\xd69\xc5<\xd6P\r\xd8\x98h\xaa\xd8\xab\xb2\xc5\xf8\x94u\x17\x1b\xa0\xa9\x90\xd3\xd6N\xb5\x1cJ\x1cj\x94\x98\xec\xe9\'\xac\xba,D\xddy~)\x1ft\xc6\x92\x8a\xa5\xa8$\xf4g\xba\'\xe9\xed\xc7\xe8\x94\xcb\xf7\xa8\x92!J1\x8b\xcb\xf4\'\x1eXL\xb6\xc0\x87\x9fi\xaa6X\xd3\xb2HM\x1f\x19\xc1\xd3k\x1e\xacM\x04x\xca\xceM8Wl\xda\xf0;\xcdcTb\x17G\x10\xac\x9c\xc4\x17\xdf\xc6\x15\xb5\x9a\xdc|\xfd\x18\x9d7\xa5lE\x82x\xc9\xe2\xabu\xad\x9dm\x91)\xef\x9fB\xb78%\xc2x\x9f\xa1L\x85\'\xdf\xcf\x11\x9eiX\xcf\xf2\x0f\r\xa1\x97\x16\x9a\xc4\xdaH)\x9a\xbb\x07\xd8\xdc\xb1\xd9]^X.R\xb5\xb4[-\xfe\xb8<g\x88\x8d<k\\x\xea(\xae{\xd3\x8c\xe2y\x0b\x04\xfbv\xcc\x96\x9c\xcc6b/)Ly>8\xff$t*\xb9\xc2\xdfO~\x9a\xfe.\xd5\xae\xcd1\x80g=.\xae\'\xd8\xa4\xe5\xb5\xa0\xae\x98#\xe7U\xae\xd0N\xb7I\x06\xd4r\x08\xa2t\xde\xc6O\xc7\'F\xf6R\tc\x95\xe1\x12\xf3\xa10\xc1\x1b\xbb8W\xb1\xe9\x04\xf2\x86\xb5o\xd9f\x88v\x9d\x0e\x83\xcf\xe2\xe0SU\x19\xf7\xd5\xe6\x06l\xd7yy\xda\x18\xf8\x15@\x13\x01\xad\x07\xf5\x9e\xdbS\xa5]\xffM\x04\xbc\ng\x14\x17\x0cY:%\xd3\xb2\x03T\xaa\xec\x91\'O\xea\t=\xe9\x08q\x19Q\xdaO\xb5\xc6\xab\xdd\x0c\xcf\x96\xd8\xbf\xc1,\x88|\xfbx\xb0\x8b\x86{\n\xa5U\xea\xa5\xb9W\xff\xe2yqjhX9\xe0F\xd95ru\xc4\xbb\xcd\x12\x87\xa6;\xe9\x01j\xf95PQ\xe7\x82\x04\xab\xe8\x19\xf5\xbf\xb1S\x8ck\xbe9-/\xc5+\x00\x0cI\xff\x1c\x93\xbb\xf0\x0bJ\x05\xf0\xc2V\xe4~}S\xe3&\x1b\x16\xe1\x1b\x82O\x13\x8b\xa6sgv\x8bU~\xc72hw\xe1\x14\xcb\xf1\xb7i\xf8\n$[\xcd\xa3\xca\x00\xbe\xbe\xc22\xe5I\x88\xa8\xb6\xe8\xb13\xbc\x11\x98\xee.+\xe6wn>\xa1\x08\xce\xea\xe9j\x089\xd7 \xcaQ9\x07\xe4&5\xab\xf1\xd3FNn\x8a\xf2\xe3d\x1b\xe1\x06\xbc\xee\xff~\\\xb1{Y\xff\xda\x87\xddd\xa0"\xe8]\x06\x8e5\x08i\x90V\x9c\x16\xce\x11\x1eb!\n\x11\xa4~\x04,\xd0J\xd2\x05\xdbG\xc1d\x1f\xbd>\x8b\xc7q\x94)i\xd2\x07\xf5\xea\x19\xca\xf0E\xa3\xcf\xe2t\xac2\xa8ctQ\x00l&~z\x8e\x91k\xc1e\x00d+~\x92\x02d\x8c\xa3\xc5\xf5\xee[-\xdf\x91O\xffU+\x00\xfb\x87{\xb4\r\xf5\xf0\xae\x88\xf7HL\xa6xV\x07&o\xf2\x0bJ\xb4Xa\xb2\xd9\xd0e\xe3\xa4\xc1\xc4\x92\xe1s\xf9\xde\xa5nLe\x86\xbcd8\'\x02\x04\xb9(\x9b\xf6\x0e7@Vo\x9c\x86\xfe\x13K+\'\x86\xe1\xd3\x12\xc49u\x86\xbb\xdcX\xff\x99h\xc4\'\xcc]\x9f\x87\xf4\xab\x9e$\xe1\xe8Wb\x84\xd0#^\xb1V\xbf\tJ\xc9\xe4*\xb6r:\xb9\x0c}\x9f\x94\xb3~\xd8%S\xc5K3x\xb2\xe2\x1d\xcb\x91\xb0JM\xd5\xf1\x81\xb0\n"\xd5<\xd9\xa2n3\xf9\x18\xf4\x99\xc7 Fi\xc3:\x90\xc6\xdf\xd7\xa1\xe6\x13\xb0\x1d\xf7\xdepk\xcfQ\xf6B\xa4&co\xd1\xf3\xfa\x86.\x1b#w1\x1b!\xa3hVm\xa2\x16\xcb\x956k\xfd\xcd\xbc\xb0\xf1\xf9\x96\xfa*\xd2$\x82\xa5[A\xf0\xdc\xdbq\x11\xe2\xfd\xa2m\x9az*\x1cA\xf5\x0f\xbf~8\x04ty\x99\xd0y\x117]\xc1\xe0f\x92\xd1\xf4\x7f\x9bT\xb5\n68\xd5#up\xe50\xb3-e\x0e\xd6\xbaN\xe6\xb3\x8d\x8f\xfd\x1e\xa5\xd0\xf7\xf7bKB\xd1\xd9\x1a\xb4\xe5\xc3\rS\xd4\x9c(F\x81\x13I\xed\x82\xfflj\x1a \n\xde\xe3\x0f\xd9\xdb\x033\x96\x9er\xfd\x15\x19\xdevA#\x92\x0e\x80\xf7\'\xc5\x0b3\x88$\xbd\x8d\xbc\xdc\x9c[\x1c\x97\x9c\xaa\xd2\x8a\xd3Y\xc6R\xa9]<:w}1\x1b)\xaf\xcfjG\xb1\xc2\n\xc4\xb1\xbe\x0eE$\xc9\x1c\x17\xdd\xacr\x88\xf5\xb0\x1eJ\x9e0\xc0\xe0\x17<X\xdb\x9c\xd5\xaes\x1b\x85\x18\xa6\xa1\xd9\x9b\x04\xd5\x0f\'\xa2g\xbb\xbd+\xf1p\xfd\xa3\xdd=\x0e:[Qb\xaf\xa2,\xdd\x9d\xde\\x\t\xe4\x9f\xcam\xa8\xdf\xf5`=\x97\xd5\x89\xed|&(^\x06\x9d\x80g\x82$\xcd\xf9\x1bSD\xea/\xba\xe3\x0e$\\\x8e\xa7zX\xce\xc9\x0e-NO\x8d\x95\x9e\x0b\xf64$\x8e\xe6\x8f\xc7\x9f\x15h\x93\xf0\x06z\xdeE+IJ\x90N7\x05\xce\xaa\xec\x94P\x13e\\\xc8\x8b\xc9\xfdV\x93lR\x9c\xc8G\xf7M\xe2\xfe\x12\xa2\x99ED\xa4\xc75\xb6N\x08\xa9\x04\n\xad\xbb\xcd\x8d\xc3\xe0\xddhcG]&\x0e+\x17y\xb4\xa9K\x81\t\x98\x86q8\x9d5\xc7=\xeb,\x7f3T\xe9\xea\xf1\xf0\x0fg?\x83\xd2\x0c|S7<\xae\x17\xbe\xc3\x91\x0e\xec\x9e5\xbe\xabt`\xc8M3\x0ch6\xb5@\xbc\x94\xe1Wx\xe7;\x91\xa1l\xc1\xb8\xce@f@\xcfS\xda\xc6\xea?\x84NQ\xb8\x7f\x93\xf9\x88\xea\xdf\xa9KuH:\xe9yU[\xd1\x9d[\xdb\xc2\xf9H\x8a\xf7\x06\xc1\xd3\x9a\xff\x83\xb3bY\x9c\xd8\xee\x01\xf3x\x06\x87\xe9I\x1c\x06\x01\x03\x04}\x90\xb5@:\x8a\xf9\xf1\x9d\xf4@Nh\xd8M\n\x1f\\"\xa6\x17\xcbeL\x879<&\xf0\xe0X\xde\xf5\xa9\xce\x91\xc6FIy\x06\xc1\xc6\xa3\xbf\x04\xbar2:H1\xb6\x05muK\x89MP\x93\xf2CY$\xfeN\xa5\xc0\xe0\xa9\x88\xc6E\x8c{\xe4\xd4f\xdds;\xb7vN\x95\x9b\x0b\x9cg\xa2\r@\xf5\xb3\x1d\t\xcc\xd0\xb7On\x1fq-\xa7\xf9\x01\xefJN\xb2\xc7<\xd8\xf1\xd0YY\xffe\x1f\xfcX\x8d\xab\nU\x08\xc8\xddMe\x05*gs\x94x\xbe\xb9\x88\xa9\x15\xcb\xf0\x00\x14\x1fHW\x990O.m_Oc>\xd3\xc0E\x92bu2}\xb9\xa2\x12A@bS\xce\xe2G\xd4\x8f\xcd\xf2\xea\xd2\xc1\xae\\\x13\x9dBK\xd5\xe6j\xb8\xd6\x9d\x93\xd2`\x8fM\xfa\x85\x0bQ\x869\xf2+_\xd4Z\x0b\x06\xe73/,\xbe\x1a\xe3\xa3\x82\x19\xe2\xa0\x8fg\x16\xdf\x9a\xcd\x85U\xde\xb8\t1\xd2\x1a\xd2\xd9\x9b\x83\xc5Kg&e\xe2\xb4*\xab`\xf2\xc5\xe9\xad\x16^\x13\xad\xd0\xecd\x82p\x93X\xad\x8agt\xc3\xe7\xdb\xfd\xf9L\x04\xe1\x19-\xd8\xb3\xff\xa4\xe3\xd2~[\xa2?\xf9m\xf5&\xefX\x97+\xf9\x18.\xea\xbc\xf5\xf9K\xf6\xab\xf8\x12>\x84hj\x91\x9f\x8cS\xb0\x8a\x14\xd0\x85of\xfcZ\x1e\xd2\x1a\xdc\xe3\x04M\xd0^\xa0^9B\x83\xc9\x95\xdf\x98\xeeTW\x97\x83\x9b)\x86\x16T\x1a\x8e\nr\xf9,O\x88\x8f\x06A\xa0\xc4\xba#\x82`\x0e\xa4s\xf9\x1f\x84CS\xba\xf3_\x0b\x8c-\xa9\x03%\x91\xea\xdd\x1f\x83\xda\xe8\xa9\x84\x1e\x82\x0f\xb8\t\x13\x9f\xb1]\xdca}\xa7\x15\x17\xc3\x97\x18q\x97=o\x99P\x8abJmM\xd6\x86\xb6\xad\x04Q\xb6\xa5?\x1b\x1a\xe0\x97\xaa!\x85\n#<MJ9\xe9\xf0K9\x13\x04C\x8f\x07\x80\xfc\x82f\xbf\x82+\xcc\x1d\x03"\xce\xe5\xfe\x92\xee\x8d\xd5\xbb\xb8)~\x9bp&x\x94\x17\x00\x16\xa8\xe13\x9b\xbb\x0eg\x16TX\xeb\x9e\x06\x9b\xa2\x1dh\xa5\xe8\x13\x17\x8cP\xe6\xcc\xd3D\xf3\xb1\xedp$\x987}\xd2|\xa6\x1fF\x95\xbb\xf4)Mi\xb4i\xc9\xd4S\xae\xeft\xc8\xdd\x13k,*\xb9\x06\x160\xebD\xe6x\x11\xc6A\x17\x92\x90\xae\xdbFr\xc0\xfd\x0cP<*U\xfc\xf2\xc5\x85g\xb9\xaf*\x8enY\xe4\xd0\xf5\x17e\xfc\xcf*\x9eV\x94[\r\xce\xb8\xb5\x7f^\x02\xc2?\xc9\xc4\xbf9\x8fd\xbe\xbetd\r\x15k5\x88\xe9\xe3}{\xc0\x05\x8f\x92\x13-\x11\xde5\xa2\xc5\xa5\x9b\'\x9b\xb2R>\x18\xd8\xf8F\x92\te9?\xf4q\x83i\x19\x1d"\x86%\x84\xbdj\x07c\xb3\x18\x0b\x028\x0c\x896>\xe6\xe7X(\xc3\x103\x05\xa0\xd9W\x1e\x8b\xed?\x18\xac\xc9U\xa6\xc6\x81\xc8\'+\xcd1\x10\xdaW\xd5!e\xf7\xb10\xc7\xe2\x97E\x18\xd8')
|
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> '+_(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
|
-
#
|
2
|
-
from
|
3
|
-
|
4
|
-
|
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
|