hiddifypanel 3.0.0.dev64__cp311-cp311-manylinux2014_x86_64.whl → 3.0.0.dev65__cp311-cp311-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/admin/Actions.py +1 -1
- hiddifypanel/panel/admin_2.py +33 -3
- hiddifypanel/panel/cf_api.py +35 -4
- hiddifypanel/panel/common.py +98 -3
- hiddifypanel/panel/custom_widgets.py +71 -4
- hiddifypanel/panel/database.py +18 -3
- hiddifypanel/panel/hiddify_api.py +70 -3
- hiddifypanel/panel/usage.py +4 -5
- hiddifypanel/panel/user/templates/home/multi.html +1 -1
- hiddifypanel/panel/user/user.py +2 -0
- 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 +34 -36
- 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
hiddifypanel/Events.py
CHANGED
@@ -1,5 +1,28 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
class Event:
|
2
|
+
def __init__(self, name):
|
3
|
+
self.name = name
|
4
|
+
self.callbacks = []
|
5
|
+
|
6
|
+
def subscribe(self, callback):
|
7
|
+
self.callbacks.append(callback)
|
8
|
+
|
9
|
+
def unsubscribe(self, callback):
|
10
|
+
self.callbacks.remove(callback)
|
11
|
+
|
12
|
+
def notify(self, **data):
|
13
|
+
for callback in self.callbacks:
|
14
|
+
if type(data)==dict:
|
15
|
+
callback(**data)
|
16
|
+
else:
|
17
|
+
callback(data)
|
18
|
+
|
19
|
+
|
20
|
+
config_changed=Event('config_changed')
|
21
|
+
user_changed=Event('user_changed')
|
22
|
+
domain_changed=Event('domain_changed')
|
23
|
+
parentdomain_changed=Event('parentdomain_changed')
|
24
|
+
admin_prehook=Event('admin_prehook')
|
25
|
+
|
26
|
+
|
27
|
+
db_init_event=Event('db_init')#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
28
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
hiddifypanel/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.0.0.
|
1
|
+
3.0.0.dev65
|
hiddifypanel/VERSION.py
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
|
2
|
-
from pyarmor_runtime_000000 import __pyarmor__
|
3
|
-
__pyarmor__(__name__, __file__, b"PY000000\x00\x03\x0b\x00\xa7\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\xe4\x01\x00\x00\x12\t\x04\x00\xb1\xabD\xb3\x95!\x8a\xb9\xdf\x9fJG\xc7\x1ax\xd6\x00\x00\x00\x00\x00\x00\x00\x00\xf9\x82q\xb5\x07\x03\xad\x0c>\xad\x88_*\x8cn\xc5\x17\xc4I\xf8\xedK\xe6\xb8\x84\xb3\xf6\x89g\x9d\x91tJzJ\xa8\xfaR@X\xea\xd8?\xd2(\xec\xee\x9a\x17\x15\\\xbf\xc4T\x8f\xe8`Y\xf4G\xc9\xdb\r\xfc\x02c'\xcf\xee\x16\x07\x89\xac\x97\xbb\xe4\xa6\xc3U1\xbf\x89 \xa3\xdf\x82\x195\xc7\x12[+\xac\xed\xad\x0c\xe9\xcd\x94q\x8b9J\xcf\xea\x98\xad\xf7iE\xab\x01\xdb#\xdc\xe0\x88t<\x83\xc0\x86\xb1\xa3\xb7\r\x90/\xf9Zj\x8f\xfb\xc6\xfeIx\xce@\x11w+,\xd0LR=\x1b\xd7\xf4}\x1f\xf7\xc4\xe1f\x9c \x98\xadAuVj\xae\x07\xcbj\xbbX\xde\x9d[\x04{\x83\x88\x80\xd36\xbb\x11\x14g8\xbaK\t\x80\x87\xdc\x06n\x1f&\x17\xcde\xb4\xaf\x81\xf4\xf1\xfaE\xbd\x82\x11;\xafS.\xf5l\xe15@\xbc\x82\xb9\xbc\xff\xda\x7fi\r\xe5\xb1\x97\xfdg\x19\xb6%\xd3ceC\x19\xe3O\xc0B~\xb5\xdb&\x96d\x96\xc0o\x91\xd1\xba\xa7\xe5TQ\x85Q\xcd\x80M\xde\xc2\xb4r\n\xca\xc6\xc5Q\xb5\x17{O\xd8\x18\x15R\xbb\x018\x0c\xc34O3E\x0e:\x1cJQ3\x19\xe9+\x1a\xda)\xab\xc68}\x7f\xb9\x02Q&(\xc4h\x8b\xca\x9dNP=\x03E\xfe\x9e\xa8\x03B\xfc\x0e\xb8\x03\xc1u\x8a\xd0\xea\xf0-\x0cH\xe6\xa6x\x7fI\xfa\xda\x07\x88\x92\x12\xa8\xe3W\xbf\xa1W\xfbv\x0b\xfc\xf7k\xb3\xce+\x1f\xcd3*\xbb\x98\xc0\x1b\xfemy\x12\xb9\xadD\r\xdd\xced\xa6Z\x90\x1e\x9aB\xc4\xd7\xcf\xca@\x9dn\x0f\xa5x\xccY8d\x89\x8dL4\xd4I\xbdX`\xb3\x88\xe4\x1e9\xde\xc2\xc4\x16D\x9eG\xa2\x001K\xb2\x04\xf7\xaa\x05\xeduc:j\x06\xaa\xec\xe4\xd5\xd2h\xaf\x7f\x9d\xb9`\t\xbd.\xce\xd7o\xdf\xc7\x8e\xfc\x11\x0e/\xf78\xb2?,\x0c\x14\x98jA^\x07\x96h\xfca,\x9f\xf0")
|
1
|
+
__version__='3.0.0.dev65'
|
4
2
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
3
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
hiddifypanel/__init__.py
CHANGED
@@ -1,5 +1,9 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
|
1
|
+
from .VERSION import __version__
|
2
|
+
from . import Events
|
3
|
+
from .base import create_app, create_app_wsgi
|
4
|
+
from . import panel
|
5
|
+
__all__ = ["create_app", "create_app_wsgi","create_cli_app"]
|
6
|
+
|
7
|
+
# application = create_app_wsgi()
|
4
8
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
9
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
hiddifypanel/__main__.py
CHANGED
@@ -1,5 +1,15 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
|
1
|
+
import click
|
2
|
+
from flask.cli import FlaskGroup
|
3
|
+
|
4
|
+
from . import create_app_wsgi
|
5
|
+
|
6
|
+
|
7
|
+
@click.group(cls=FlaskGroup, create_app=create_app_wsgi)
|
8
|
+
def main():
|
9
|
+
"""Management script for the hiddifypanel application."""
|
10
|
+
|
11
|
+
|
12
|
+
if __name__ == "__main__": # pragma: no cover
|
13
|
+
main()
|
4
14
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
15
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
hiddifypanel/base.py
CHANGED
@@ -1,5 +1,90 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\x0b\x00\xa7\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\x9d\x19\x00\x00\x12\t\x04\x00\xad\x8a2\xf2\xef\'\xf1wn\xc7\xf7\x8b\xaa\xca\xd3c\x00\x00\x00\x00\x00\x00\x00\x00\x89\xca(\xe3\xc1n\xb2\xd1]a&x\xabQro;\xc6`\x8e\x15\xc0\x7f\xb9\x1b\xb9{\x0fe\xc1\xd4\xde\x9b\xf2+\t\xd7\xe6\xe8\xc4RI;<\x0f\xfa\xea\xcb\x17\xf6HGr\x14\xdfr\xc6]\x7f\x1am9\x03J\xff%\xf9\xb5\xfa\xcc\x16m\x7f\x86|\xb2\xfei\xa9\xfbRn\xf6:\xe9\xaa\x19\xc3)\xf6d\x9d\xbb\x15\xc8\xb3\x95S\x85\xdf\xbd\x8c\xccJ7A\xed&\xa3\tvO8\xaae\xcfk\x82\xda\x06\xf8]\xec\x10\x1b\x1c\xac\x08\x01HB\x9e(5\xc0\x87\x02\xe4\xcf\xc3\\H\xc9\xc9I\x01\x1e\x01\xf6y\r\x9ez)\xc1\xb5\xc7{7u$\xb9\xcf:\xc3\x9e\xeb\x1f\xaa\xcewU\x1c\xf8\x1bW\xe1\x95\xefq\xe1\xc7\xf3\x0bXQ\x80\xb2\t\xd0\x8b\x0e;\xd2\xfce\xd0?_\xba\x92\x0e\xe9\xbdR\xba\x7fGL\xc1\xa2N\x892\xb9z}|>\x05T%\x99P\x07\xf7\xa2\xab\xadM\x97\xd2\x078EX&\xc8\xa5]\xe0%\x82\xa0E(-TQ]\x80\xa3\x87\x07\xad<tW\xe4\xab\xf8?R\xe2n_\x0c\xa7\xfd\xa4\xbf\x97\x01\x9a\x1a1Fn\x0e\xac\xa7,\xedD)\xfa\xc2\xf3\xc1\xd2h7\xff\xd5\xf2\x1bD\xbfc\xf8\xfe?q\xb0\xd9\xa7\xf1\x9bN\xe4k\xf46^O\x9d[$\x8b\xfcb\xf8\x1b\xc1\xed\x8f0\xac\xee@V\xa4\x99O\xbf\xce\xb9\x9am\x1f\x89\xa3\xac8\x17\xe8\x83I\xd8\x1d[\x9cU)\xe4j\x1d\xde\xce\xa3!\x9a\xe2-\xd0c\xf6\t|\x9e\xa1\x86\xac\xd9\xec\x1a\xf0\x91P\x0b\xe0\x19\x8d\xdd(\x92\xdan\x1c\x1c/\x90\xff;\x90\xc1\xea\xbe\xfd&\x8e`\xb91\xc3\x1d\x84\xf3\xb9\x95\xc0\xd1\x04\xc9g\xb4v/\xe1{ew\x93\x040\xfe\x88\xb3X\xc3\xaf\x08\xe8\x9d\xafUo\xfco!\xf1%,\xd8H\x16\n\x87\xf1\xfe}\xda\xf52\xff{b!\x88u\xa2\x8e\x86L=8;^\x1b\x05\x87\x05%/\x91j\x98\x9e6Q\xf8\x1dkK\x80~\xeb\xf5\xb4\xe9\xef\xd8\xd6\xc3\x984\x82\x9dK\xef|\xc2\xe3}\x1c\xbd\xb7\xb7\xfc\x1b-\xa5\x88\xf6\xb9\xa7l\xdf3\x85\xb9\x83\x94\x8f\xb8(\xe5\x1e*%\x9a\xcc\xee\xfb\xe5\x15#\xa6\xb7%\xb5\xa5\x81\xd5-\x9bZLh(\xac\x9c%T|\xb3wE\xb1\x87j\xa6=\xbc\xf1qDU\xb2\xdc\xa6\x06\xd84\x8f.A\x8d\x14\x19\xaa\x04\x9b\x8csB\xd6\th\xddiL\x82Q;\x82<\\ w\xb2o:\x134\xac\xdeM\xd7]\xb0l\x96\x11U\x7f\xe1\xba\xff`\xdfX\xc7\xee\x08\xe3\xf5jocA\xa6U\x8fcH\x96\xe3s\xb0\xa7\x08\xdbY\xa2~`\xb0\x8b\xd5\x94\xec\\\xcef\x18\x19\xab\t\xaf\xb1;W\xe2\xeeT\xf5\t#\x0e\x9c\xbf\xa4\x80u\xc2\xba\x9c6*\xd9\xee\x88\xae)e\xa6\x16\x1f*\xfd>d\xe79\x1eR\xa6i\xf0A\x82y\xf7w\x89\xd0\xf1\x80m\xd2\xe2\x82\xc1\x8aoI\xe7\xc8\xbf\\\xfb\xfe\xd5\x99z\x05\xc4=R7\x06\x99\x86O\xd9XJ\'\x0cq\xaf\xe9\xf40\xcaelU\xca\x19:\xf4\xa1\xbd\xb0\x8d\x87\x8f\xfa\x0bw\xdc\xc8\xfc\x08\x07\x8e\xf7\xa3Y\xec\x87\x1c\xfa\xe9\x0b%\xc4H3\xd401\xb1s\xcc\xb6h\xbe?\x14\xae\xc4\xe3\x7f\x07Z\xdfs\xd7\xfd7\t\xf6c\x84\xbe\xee\xedR\xd6\xeb\x81\xcd\xef\x1eE\x8d\xd3j\xed\xfb\x92R\xb7\xe4y \'/\xa6/q\x1ad\xcd\xf2!?\x9d\xbeD\xc1N\x1c\xba\xff\x14\xcd\x0e\x81h`I\xea\xa3\xfb\xa3V_Y\xa7zG>{\xc1.\xa6!\xad\xb95\xec\xb1/\x10\xf8\xb2\x05\x81/\xcf\\V`\x98\xba\xc6 \xc7\x81 \xd9\xb1ru\x86\x1e\x08"\x9bf\x7f\x0f|\x93F\xf7\x0b\xdf99\xd5\xba"W\t\x8e4\xa3\x1f!\x0e\xadfU\xb5\xe6\x06g\xbez%\xbf\xd0\xd1\x11w\x13a\xaf\xef\xc7\x03\xf8\xbeB\x88&\xa6\xb3)v`\xb9G\x87.3w\\\xbdy2\xb1W\x17P\x86=,\xc4\xb8w\xb7\x05\x92\xeb:\x1el\xde\xe9p\x1c\x1c.d\r\x87\xf4\x88Q\x98\xe5<\xe7!q}\xe0~\xff\xf9\x96-3\x8f\xbb\xd7MJ\xf8\x8dS\x0c&\xd03G\x9e`\xe2\t;\xb4Q>\xec\xdfyf&\xa9\x00>\xd4\x8f\xac\xafj\x92Hz;\x13\xc3W\xf0Yz\x92[So\xbf^\rD\xf4W\xeb\xc1>@\x0e0\x89\xe0i\x02\x8c2n\x07\xbe\xe5\xa7\x98i\x96\xe1\xf9lVa\r\xe49\xb2\x8bP\xf4\x0f\xe8\x93\x9bpF\xa1q\r\xa6k&\xbf\xda\x9f\xca\xcca&\x1d\x1e<bss\x94\xc0\xe1Z\xcd\x8e\'\xec\x05r\x81\xe7\x80p\x07T\x80\xae\x97\x02L\xc0\xb8\x99\xc9#\xe9\x8b\xf1\x06\xed\xa0\x81\x9a\x85D\xbd*9\xe2\x03\x81\xa9\xf6\x04#\xf4\x83R}\x90\xe9\x08\xe7r\xd1\x0crI?\xdd\xde6\xc4\xc1\x92\x8b\x1d\xb4\x13\xb3\xcb\xc4\xb59\x1f\xe6)\xf6\x06\x8c\xc1i3[\x84j\xdcp\xf6i\xa1\xdf.L\x17\x19S.\x8a\xd1\x02\xa2@\xda\xf3\x0bqn\x7f\xf5\x99P3\xf9\x01\x05\xaa\x8d\xbf\xa1c\xfe\xd05M\x8f\x88\xe7\x16"\xee\x1e\x8b\t\xa2\xde\x97\x0c\x95,P\xd4\x8b\xddg\xc7\xa2\xff\x8c\x1c\x91\x9a\xb2\xa0\x00\x11\xc3\x08\x89\xdcsM\xe9\xd4\xc8\xcc\xde\xd3\xde\xbfw\x1a]\xc9\xccz\x01\xdf\xcd^]w\xec\xc3\x120\xd6\xee:LI\xf5\x8bh\xa1\xea\x9aU\x05d\xeeWl\xd0%?\x05\x96~\xa7_\xe9\xa4\x18\xcci\xd8\ri\xc3\xf6\xe6\xd3\n\xf1\xc5\x14\xafP(\xe9N\xcd\x15H$\xf8\xdam\x93\xaeD\xd0\xde\xb4\xad?\xd3`\x1eSG\xc0\x8b|\x85(a\xbb\x8b\x8a\xe4\x03wH|\x075!\xb6\x8cth\x91\x9c\x05\xbe\x8b\x07\xdbt\x05\x10\xefQ\xc4\xbcw\xfb\xd4\x07s\xees\xad\xa16\x99\xc8\x84\xb5m\x92\xdd5\xa2A\x88\x15\xc5Qvh\x91\x8at\xc9/Mn\xfc\xff9\x1e\xe7\xad\xa8 w\x1c\x1c;\x84\xcd%\xab}\xcb\xdb\n\x17\xf6z\x1eV\xbd\xed\x154\xca~91\xbcg9!y\x01\x1b\xcf\xc2Bkkbk\xf5\x06~\xa9F\xda\xdd@\xa4Ee\\\xce\xa7\xaa\xb2\xd3\x1cl\x83\x84\xc9$\x1d8\x07\xafW2\x17\xaa{^\x12\x96\'T0o\xfd\xd6\xb2\x04\x85I\x00\x19-8a\xad\x08\x8c=\xcb\x03\xb1j{\xa0\x88\x03u\xa8\x1d\xcdE\x8b\x0e\xa0R\xb4\x97n\xf1\xdbns\x9a\x8el\xa1\xe2\xb7\x7f\x1b\xa7\xbc\xf41uSbT\x00\xda\x0b\xb5GE\xd9u\x95(VGg\x14\xe9\xef\x1eA8\xce\xf9M|I\xde\xc4\x9e\xa8\xa5\xad7DO\xb3|&t\x8f\xcbR\xdc\xd5\xfb2\xc6\xbb\xe1TZ\xa4/O9\x1e0\xd8\xd0\xb6\xd4\xde\xc4\xa8[\x0bw\x80h\xde\xb0\xfd\xc7\x86\x08\xde\x8e\xb2#\x96\x8f\xb3\x87\xc8o\xdaQQ*M\xe7\xac\xb6\xc3l(\xaf\x87Q\xf6\x0c:|\xae#\xd7\x15\x94\xd7\x0f\xcaH\xa8Ys\x00\x8fB(\x98R\xe8\x8e\xc87\xed\xdc\xb9\x97K\xf8"\x04\x8e\xfb\xb31`"\x1b\xe2\xa2O\xc9\x16)&\xecb[1z\xd5\xe2\xc7\xc9\x84\x1c\xf4\x93\x9f\x9a\xddq\xea\x8c\x0f\xf7\x03\x0c\xa6\x87\x8b\xc2s\xdfW\x96\xeb\xcd\xae\x0e\x1c?\xed\x83\xb1\x84\x1d\xc6\xa7\xc8\xcf\xe5N\xe2\xce\xe4\x80\xc99\xcf\x8f\x82\xab\xcd\xb5jn\xeb\xfc\xe6R\xc9\x83\x03\xe6[\x06c\xf6>^\x07\xf0p\x90\xad{Q\xa3\xc2\xc8\xea\tc\x0c\xc9q\x0e\xb4\x00~\xd3R\xda.\n\xbe\x1e\xf7\xd1\xab\xe3\xf8W\x96\x8a\xe2$\xf0\xa9m\xaa\x16\xaa\x90\xbcn\xb1%\x8a\x1fe\x14\xdb2a\xe7Mbz\xed\xfc\x83\xf5\xcb\x02n\x12\xe4\x18\x07\x8e\xe7\x8a6\x94\x10\xd8Wb;\xae-\xd2g\xed\xf6y\xcb,\xd5\x89\xdd\x04\x15\x0c\xfeU\x83\x8e\xb3\x9c\x97\xcb\xb7\xf3>\x87\xe4\xbe\xf8\x06LT]DD"S\xda.\xe1\xc1\x97W\xbc\x9d\x07c\xc4\xf6\x1f\xbdf7\xa0/r9\x841%\xd7\x15\xc8\xf8O\xff\x9a_L\xaa6x\xca\x95\xabO\x80lkPX\xe5w\xea\xfb\xcb{.(\xd3\x9e\xc5\xd0\xf1t\x98\xb3\'\x85i^\xe9\xeb\xdc\xe4\x89\xbc\xe1\x17\xce\xbb\x05a\xb3i\x8d\xb5\x10bD\x1b\x00|\x85\x98\x1b\xf9U\xc7F\xcf\xd0\x95\xefN|2%*\x9c\x19\xb1a\x18\x1d\xe6\xa2\xbc\xf6\xdf\xack<J\xcd\x90\x81\xe4\xc7\x89\xe5\x87\x17O\x80\x0c\xa7\x96\xd8\xeb*\xc5\x83\x07\x1a!d2\xa3\xdf\xf1c\xb5\x85UU\xf2\x07\xa1\xb0\xea\x81i\xac*\xd91\x8f\xba\xdc\x8b\xf5\xd7T\xb93n\x8d\xde\xe8E\xdd=\xd1\xcc\x036\xd4\xe9]\xa9\xba9G\xec\xe7\x05/\xec\xe2M\x85\xe6\xb1\xe4\xb7\xe3\x05\xf3\xebc\xbcB@6\xa5/E\x9c\x1d\xdb#+\x81T)\xdd\x19\xbc;5?\xf6\xf1\x8d\x9a\x9f6\xe8f\xfd\xba5\x98\xa3\xf7;\xbb\x1e\xc3\x1f\x1a/6$\xbe\x98\x9bbW9\xc5|\x9b*\x95\xe6\xe0\xdd\xa0(\xc3\xe1\x84\x19OfDZ\xb8G\xc8\xe6\xd7"?\x84\xdc\xe4_8\xcb*jN~\x95\x9f\xd2\xa1\x03\xba5\xe4\x0fC\x14q\xbc\xacm\xd3\xb57\xa4\xbf\x10\xb5\xf2\xf3\xba\xafP~\xa6x\xabM\x86\xa6a\xe8Yt\'\r\xabT\xf6\xbe\x95\xcb\xf23\xb8G\xdf\xf3j:\x9b\xf5\x9b0N\xc2\x85\xfb\x9b_\xfc\xd6o\xf2:\x06\xb7v\xceE<\xfbJ\x0f\xec\xdbR;u\xe36\x10\xa7\x19\x87\xd0;\x99\xe0\x85\x03\xbc\xf2\xb5~\x9f\xd4h\x16\xb6j[N\xd1_\x9e|\xbd\x9e\xb1\xa3!\x1d\xc7\x8fPf\xd4\xfc*\x13\x16\xa6\xe5\x05\xce\xecv\x0c\x05\x7fp\x04\x15<nz#\xfbS\x1a\x96#\x89?#\xe1\x9c\x16\x8bG\x10/\xe9P\'\xcaG\xa0\x15\xf8,\x87\xedr0\xba(\xcb5\xa8q\x80\xb8\xcc\xa6\x81\x1c\xfb p\xf9\xbf;(\x01\xcd\x0f\xf8\x19o`\xc0\xe4\xf7\xddTH`\xed>\xa6Xw\x95V\xae\x93\xb5u8ss\x15\xba\xc4\x90!\x0c=5\xb8K\x12\xd8 N\xfb\xfb}\xe4\x1c\xa9\x19\xb3L\x82\xee\x03\xc2\xab\xa1\x9a9\x18\x05\xe0\xad\xc7\xbdl>{\x94T\x925-\xac \xdb\x00Da\x9c~r\xaf\x10j\x8b\xc2\xe7D0\xa0V@\xa8a4uu,\x9f\x15\xdc\xf8]\xafL%\x1a\xda\xed\xb1\x94\x12\xaa\x9dZ\xe1P\x91\x86 \xc9\x9d}+\xcc\x94{\xb3\x99\xee\xdfb\xc3\xfb\xf4\xa4\xa8\xc8\xda\x83\x9e\xdf\xab\xf4\xf2\xb9>\x98jI\xe1\x1c\x03,#\xabO:\x9biw\xb1vS\x04mE\xdb\x18:\xa4=<ZFj[\x84\x9c\x9av\xc6?1K\xdc\xc3P\xa1\x07}\xc03k\xb5!\x8e\xc1\x8c\x8fxE\x03\xc7qQ\x0f\xde3S\xfe\xb0\xad\xc3\xb0\x80\x1c\xd1"u6+\xe8]\x13\x862\x1b}\\\x8d&\x87\xc2\xcc\x88\xda;T\x8b\x98\xc4q\xf6\xb7U\x9d\x12\xf1\xba\xa0\xc2\x91\x96\x84\x13\xe9\x19\x02V\xeb\xfa\xb0\xde\xcca\x87o\xd33\x91\xb6MK\x06\x0f\x88\x01$3\n3+\x8f\x9e\x85\xad\x9c\xc6+\r\xc15:q\xae\xaa\xf8\xac\x84^\x8f\xd4sI\x95\xd3\x08Rw3H\x1b\x0bp\xd7T\x1f0"\x13\x105\xe7qw\xbb\x87\xcb\xa9v\xfe\xdcv\xcd>\xc1\xa8\xe6]3\x8ej\x02x8,\xc2s\xa6%\xc75T\xe1\xe3\x886d\xb1(\xd5\x83\xcf\tC2\xf5~\x9f5\x8f\xb3\'H\x83\xd9`ED\x7f\xb4q\xfa\xf5\x80,r\xea\r\xfe\xee\xb3\x1a\x13\x8b\x84QW\x90\xcfF\x05\x03\x82L\xfe\x9b\x94\x81\xc6*\xcd\'\xfb\xbf\x94(,_QBN\x1f\xc1\x8a\x94\xa6\xe4\x96\xcb\xa5\x14\tT\xe7\x7f^XY\xc0\x96\x9eh\xbb \\SZG{\x17\x03\x1d!\x10\x05\x98\x03\xc3\xb0;\xac\x04\x83\xd9\x80l\x0f\t4\xcb.\xfa\xf0@\xfe\t"z\xa9D\xe8|\x83"8\xea#\xbd\xb2\\\x0c\xb4\xf4{o\xdc\xc0\x83\x8c4\xc7^\xaa0\x94\xb0\xdd\x0ek \x0f3\x93\xb0\xd4\xbe\x1f\xef\xc9\x81>\xe6\xe6\x86\x93;\xea\x94\x05+\x12U}=7!r\xf1\x80B\x86\xa3\x81S=\xd5\xf1\x15\x8ae\x03Q\x86{\xc9\x81#\x1e\xc6y\x1b\x89\xe8\xb3\x0b-\x16\xe8y\x82{\x1d\xec\xb0\x1a\xc8O\x01\xa0\x1d\xbe\xdb\x92\xe7NP.\xefw\x8b\x99Wm\x05\x97o\xda;Z\xb9jS\x98K\xff\xa9\x86\xdf\xc0\t\xda\x80\x97\xec\x1c\xa9\x7f46K7\xc2E\x8e\xfci\xac>V\xca\xfe)\xa1\xc4U\x16\xa9s\x8a\xccB\xca\xa3\x89Gh\x84E"^\xa49ZB@4\x16c\x1dc\xd9\x8avk\xe6\xd0\xc5\xdb\xa1\xeb\xf9.\xbe\x84v@E\xe2\xe1\xd8\x91-0\xdd~\x80\xe1\x1f!T\xa43\xecu\n\x9e\x9a\xa0.\r\x07\\\xcf\xbf\x9d\xf0\xc0\xa0\xb9\x03_5\x13U\xe5\xa1\xe4\xd2f\xa3\xed\xaa\xdd\x10\xd3\xbc\xe2\x81\x18\xd0\xfe\xff\x95\xcc\x91\xce\xa9<\xd0\x03\x9c^\xd1\xb3\xbd\x06\xa0a\x97\x99\xa0;\xb1\xc8\xfe0\xc2$\x07s\xd3*LlF\xd9\xa6\'\x89\xe0Z\xab\xc0V\x15\x14Tf$\x87T\xe0\xcaeV\x98\xa18H\xb43\xbbp\xf7k\xea\x86"8\xe2r\xd3AO\x95\xac\x97\xb2\xb6\xd5(\xdf4X\x14\xe2Qp\x05\x80\xe0Nn|B\xd0\xe0\xae\x9c\xf7\xf9\xa03\x06\xe7\xb2\xebJ\xd7\xd9w8\xd1\x96\xad:?\xe2\'\xb1\x12y\xeb\x9cm\xf6x\x17\xedH\x12\xede\'(\xa0s\x94)f\xc87\xdd5-F\x88\xb1a<S\x91\x0c\x80\x1b\xc4\x9f[\xf0\xf1U\x9e\xc5\xd8\x8b~r\x9c\xe1\xe3+\xc9CWkD=\xbe\x0c\x0e>\x8b^\x85:\x98ui\xad\xd9~Q3;v2\xcc\x87\xc3<4\x17\xcf\x14\xbb\x08\xc1r\xf6`\x1e\xb4\x004\xf0DWn\xd61\xcb<e\xd0C\x14\xe9\x0c]X@\x97A\xeax\xc15;\xb9\xbd\xd8\xcf&)\xe9!\xf6\x8dsO\xb3\xb6\xb6\xb8)\x91\xeb\xfd\ng\xf1OQ:\xdb\xc6\xc0\x19\xb5\r$\x1c6\xcc)\xa63\x8b\xec\xbe\xbd\xcd\xbd\x84\x97X2\xbc-\x907\x8e\x1d\xa8\x05>\x05\xb2\xad\xa8/<\xbe*\x9a\xbe\xad\xaf>\x13<\x98\xd6\xe2\xed\x8ccbQYw$.Zp\xaf\x1at\xc9&o\xe1q\xfaGl\xf1\xd9\x9c\xf8\x97Rf\xa0\xb3\x0e\xf90\xd7\xd3\x140SP\xf4\xa1\x12\xe8|\xd0J\x92\xb3Ke\xb0P\xd5\xd0\x12\x19\x9e\xe8zz\x90\xdc\x0cC\xb2,\xe4\x8fC\xcc}\x93\xdd\xfcZ\x88\xf5\x12\xd85l\x7f@\x8a\xc94\xd1\xdd\xde\x93R\xbb\xe3\xa1\xf8?\x96\xeb\x9c\xad0\xf5,\x15 $\xa20`\xa0\xdaT!\x16\xdd\x9d\xa8\xfc\xdc\xd69l\xaf\x14,\x00\x15g$\xa0h5\xc3\xb1.\xc89"]\x1dT\xf9\xe9u\x07I+\x85\x1d\xe7\xf8\xaf\xfc\x8c\x9a\xf6&K\x01\xfa/0\x0e\x0e\n\x01\x9cpG\xfeL\\{\xc0\xd9\xb3\xb6kS#\xce;\x95\xf4\x8c\x02E\xc5A\xa1&}\xfc\xf8\x89\x08\xc5\xff\xc0u\xa1\xed$W\xb3\xe8>U\xe8r\x02\xce\xcf\x01"\x1c\x9bi\xc5\xf08\xc2\xdd$\xeb>\xd7\xe5KPn\xd7CO\x11\x98\x1f\x00@\xe3}\x85y\xf1\x16V\x1aO\xf6\x9bte\xb2\x14${\x90I\xaa\x05\x96|Lw\xb1\xdcU\xc7BZ\x1cS\xd9\xef\x07\x8c\x7f.\xb5hK7\x96z\xf3\x8e\x13\xf8/\x9f\xa89j\xa1\xc1\x8d\x04\x13\x93\x05-{\xa8\x1c\x99\xdb\xf2\x0f\xe6ch\x92ix\xd4M\x9ey\xe3\xb4\xf5\x7f\xa7\x11K\x95y\x00\x0b\x9bLf\xc6f\xcf\xbe\x13\xb9\x8a\xf8\xfb\x81\xca\x0bj\x8b\x9e\xf4z\xfb\xb8\xa2\xb6\x05p(\xa3\xdc.\xa7Z8\xe4\x08\xb2\\\xfb\xa6\xfa\x95\x8aF\x97\x9c^f\x87\x93(\xe0`\xcf\xfd\xb9\xf0\xb9\xa6\xa0\xd0\xd8l0\xc9\x96\xf9^\x83S\x9a,\x92\x82.\x1ea\xd3\x1dA\xdf\x95\xce\x9c\x89d\xbe\x15\xbb\xa7\x05T\x0e\xb6!\x1fC\x8c\x03\xf7#\xc4\xca\x98\x89UJ\x16jO\x9fg:\xdb\xc5\x81\x9f\x91|\xad\xe6\x11\x16\xf2u\x13\rv\xb7lnD\x1d.\xed\xbcn\x8a\xdd$\xc9\xf6\xab\xeb\xa3\x189\xd0\x84Q\x85\xeb&YB\x8e\xaf\xd6U\xa5\x7f+23\xd3M\xddbE\x92\xc6X\xbc9\x7fd\xa2\xc4\x1e\xef\xea\xff\x89\xf3\x1c8\xdeh9\xe2~\xd46Am\xd7T\xaa\x91\x89\x9f\xa2\xa5\xf1\x81\x0f\xa8a\x83/\xf6T5\xc7\xdd.Q\xeevz\xec\xed\x17J\xfe\xea:\xeem\x19\x87\x052\xc9\x06-o\xf6\x1ah\xf8\x92\x06e\xccf%\x88\xdfl"Vx\x07Z\xd6\'YTD\xc7\x1e\xe3\xeb\xeeY\xe5\x10X\xc1@{Q\xe74\xbc\x0e\x83Z\x0b\xcfl\xe4w0sH\x06\xdd\x98\xd36_E5Q\xab\xaa\xd4\x9ep\xd1\x8e\xbd\\\xa3x\xbc\xf4\x9b~\x89Z\x06P\xf4\x16\xd84\xed\xf21\xc7\xffI\xd7\x08\xaa\x05z\x1c\x825\xc1WHC(\xca\xb16\xf8\r\xbd_=\xcb\xa6_\xb7\x919\xc8\x87\x18V\xd3\xa0\xf5\xd2\x9b\x08\xac\x8a\xcd\xf7\xce\xd4\x8eQ\x10\xad\xff\xc2\x10\xb7\xe5\xfetR#\xcbb8\x15\x83\x0f\'\x91y\xf1sa\x91:\xac\x1f\xc6>`z\xac\x0b\xaf]\xef\xf20~\xc9GK\xac\xa4\xc2\x9f\x01\xc3\x88\x92\x96\xed\x0eN\xe6\x9e\xe5\x17\x1fZ\xbb*\x7f\x07\xd8\xa2\xef\x90\x01\xab\xa8\'{\xe84\x0f\x9et/\xb8-\xeeY\xb3\xb9\x19Q\xe6\xca\xden\x018\xa5\xd0\xe7$\x95\x9d\xc3J@\n\xc5\x12\x14\x85\xb2\xad\xc1EU\xedQ\x0c\x82hi\xfa\xb6\xb2P\xc1\xe8Y\xd8\t\xd2\xe1\xec\xbfbH\xa3;\xe7\xd4\x9e\xa5\x93=\xcbv\xdd\x86b\xb7\xce\x9f\xda.\x9d\xdf\x8c\xa5$\xce\xb8>\xc2i\x91\xe9\x04\\C";\x18\xf7\x7f\xf7\xf8gUe\x1f\xed\xbf\x12\x08\x97\x10\xff\xf4\x91\xe8\xf0|\xaa\xff\xe4<\x93\xe8\x18O\x9e\xfc\xdbB\xc1\x04\xe1l/[\x16p9\xbaC\xee\x01#R\x81!\xf2\xfe\x97-W~\x02z<"\xec\xc9l\xae\x9eR\x0f-Y\xbc\xa1\xcf+\x8d\xaf;\x17c]\x85\xcc\x1d\x82\x87]\xe6\xd9\xeb\xe8g\xc9\x07\xa4Q7\x04\'T`\xd1\xa6\xe03\xd1\x04^I3\xd0/J5\xc6\x83m\xe7\xe9\xa3H*\xa2\x83W\x00\x9a|\xe7\xc5\x9d\xbf\xf9\x10Tx\xaf\xeeB\x0c\xc4\xdb\xd0\x03\xce01\xc4\x1f\xfbj5\xc9u\xdfc\xbf\xbe\xb0f\xe9\x95d\x19\x92\x16\x0c\xce\xecO\rhv\x0167\xe9\xd1\xb6\xb9\x1a\x08_\xcd~ w\xef\xa7\x089\x80\xd63\x8b\x823[\xaa\xf3\xc1\x15\xde\xfe\x83U\x17du\xb2\xe5\xe2\xd3Q^\x8fXc\x15\xe6\xcc\xf0m\t\xbdpc&\xdb\xa6^\x80^\xe9\x89\t?\xe2+\xbdb\x08\x10\xf47\t\xf1H\x067Y\x1f\xb5\xd6bE\xf9\xfc\xcdQb\x9c\xc3\xab\xd8]\xdb:\xef\xeb\xc8\xb4\x7f?\xcc\xa6\xa9\xe5k\xbb\x17\x85\xb6\x8cN\x1e\xd1f2\x9b&\x08\x12g\xe5U${f\xab\x81e\x07\x9d\xe9\xee_O\xe2~x\xf0\x05G]\xac\x94\xa4\xf1\xdd,K\xfa\xe0w2\xbf\xc70\x9b0\xe8\xa8\xffZ\xa5\xe1\xcd\xee\xc6\xe3O.\xc0\xc2\xc0G\x1a\xc6\x84\x84\x02\xa1$ \x9c\x15\x7f\x9by\n\x14[\x18^T\x80\xa9u?\xa7@/JR\xb2j1\xb2\x8fCA\x9d\xcf\xfb\x87\x98\x1bsI\x1e\xe0\xb8\xe1\xe0\xf7\x88\xa0\x12\xfc@8\x9c\x90\x86\xdblC\xe2\xb31:\xb9=\xf4\t\xa2f\xdf\x96\xf0s\xe7\xfcS0\xed+MlyxC\xa5\xe6\xbelUs\xcd\x99b\xa6\xe7\x96\x15~\xc7\t\xeac\xd39\x16\x9b\xf2\'.\xba\xaa\xa2H\x0fW\x95\xc4\xa8P\xfa\xf9\x99V\xc0\xbb\x05)\xee-\x89\x8a3!,\xd2\xcci\xbd\x89\x13}\xb4\x81\xbb\x81PI\x91]#=@\xd5\x1f|\x12\xfc\xec\x82\tB\xcbw\x8b\xdd\x9b\x85\x7f\xe0\xb5mT\x8a\x0b\x1c\x18\xb3\xab\xce \x98[\x0f!\xd3\xf0$!P\x8cx#h\xf4=\xedt\x1fJ*YuS8\xe0\x99=\xcc\x85\x95\xb8\xbcy"-lW[m\x14c@\xe9\x05\x8fdT\xe1\xc9\xb9\x13N\x8f\xb2\xb5\x8c\xb3\x8a\xf1\xd2!\xe9\x1f\xff\xe3Fm\x1e\x96\x01O\x0e\xc30l#\x19B\x8aB\xfbm>\xb02\xd7+\x1e \xc2V\x93\xfc;Y\x98Y\x96\xc4q\x8f\xe0\xab\x1aY\xf8\x8c2\xbe\xec\xdf\xdbJ\x91\x80\x16\x0f\xefs\x0b\x1b\xed\xe1\xddN\x0fny~nL\x1c\xec!,\xce\xa5W\xd3$~\x8b\x02`\xd4\x85\x93\xea#`\\\xc6a\t\x10\x1d\x0e2\x8b\x05\x00=[\xce1u\x80\xd3U\xab\x85\x1d\x8e\xe2\xd0\xa7\xc3%n\xc6\xd7\x19]\x81;\x86r\xb1\xc1\xd9Qo\xb3\xd3\xccF\x1c(zcP\xcc\xf7\xad\x93*{\xc3\x18\x11\xda4c\xb3\xef[\xdb\xbe\x0b\x13\xf4)$\xddo\xf7\xf5\xd1\x83[\xae\x9f\xdd\x1b\x81\\u\x03\xa9i\xfc&\xe5\xef6\xd2\x87a;\xf1\x9a8\xd7\x7f\x06\xc8-\r\xdb\xe3p\xe7V\x06~\xeb\xd0\xfb\x85<\xd1\xa6=,\x04AI\x1a\xf1qa^\x8b\x8eYa\xf7\xde\xce\xae\xcf\xdfp\xe0o\xfeH\x83\x16g\xf4]\xf0c{\'v\xaaD{4\xce\x02\xa3\xb820sG\xbau.\xef\x88{1\xcf\xfa#\xc6m\x14\x1e;\xd5Tg5G\xda\x8f\x8c\xeeh\xbb\xd1\xedb\xf0\xf6\x97\x1d\x06Wm\xd8\x03_\x9f\xfbD\x8f\x89\xc4\x89\xb7\xf9\xf08\']\x9dZ\xe9\x8c\x14\x02\x10\xc5\xdf\xce\xd7\xdfWh\xf6/\x1cxh\x910\x01\xbeil\xe2\xec7_*\xac\x12\xd0\xdf\x9f`\x1b\xc4(\x80P\x16\xed\x86\xda\x92,\xbd\x9a\x0b\xf7\x8b9\x7f`f\xb8\x17\xe7\xadh:e\x88\x89}\x13\xcb\xeb\x1b\xa0`9X~\xc6T\xd7\xfe@pP_I\xc9\xf5O9\xb9r\xa4\xee\xc2\x9dX\xc6\x8c\xcc\xe6\xaa\x9b\xad\xc1\x1c\x01/\xfc\x862Xf\xe7\tR\xa1\'\xcd\xb3:gy\xe1W~\xc7K5\xc8\\\xb1\xf1J\xeb1\xe9\xa0\xa1\xc5\xca\xdb\x15\xf9\r;\xed\xe5\xce@)\xa12\\\x7f\t\xe3<\xf7\x86\xd7,\xfe\x18\x1dZg@c{\xb5\x1c\x98J\xa1L\xfd\x9b\xae\x0c\xefe_$\xe3\x0b\x12t\x89+\xa56\x1b\x85\x8a*\xa2\xfb\xb2g\xd8\x7f\xad\x8e\x9c\xa3Q\x0e\n\xb0\xa2\xb33L!\x92\x0b\xa3\xc5S\x8b2\xc0\xa9\xbb0\xe9\xf8\xe7\xca\xd6\xd5\xbd\xd4\xb4m!\xcbQ|\xfc#g\xf79\xaf\\R\xe8$\x84\xb9W\'\x9d\x99T\x7f\x16\xcd\xf51\xc7\xb2;,\x17\xde\x8d\xa1u-\xe0\x99\xc6\x91gR\xe9\xa1!h\xda\x94\xdb\xef\xefy\xff\x99\x99\xe9\xff_gx\xb8\x03ph(\xde%\xa4\xad\x01\xf8\xf2\xa0b\xd8`\xd2\xcd}\x08*;\x13\xff\x1a\x83\xbd\xf4\xf6\xad\x97\x80N\xa7\x8e\x18\xf7Z\xd8]\x07_\x1d\xb9OB\x1a\x03\x15\xb2;\n\x1b\xc5\x81\'\xd1a\xda\x17\xce\x8di\xa9\xa9\xfc\xb9\x91n\x883\xb6\x94\xc8\x8e\x8f\x1f\xad\xab\x06\xc8\xa5\xfe\xa4\x0e:\x8e\xd5\xbc@\x08\xd4\x15c@l\xedN\xaa\xe2\x95\xa1\x04\xb85u\xe2\xbf\xe1\xb3g-b\xa8\xe9\xe1\x95\xbdT\x98\xe8\xeafz\x13L\x88z\xa6\xfe\xb7\xacJa\x7f\xd0\xb1cF\x92\xa8\x801S\xfd[\xf7F\xcaN\xca\x14\xbf\x06f\xd4G\xa0\xf7BY\xb5Vmy\xe7\x8e\x04\xbe\xba\xc5\xaf\xcef\xa2|\xe9P\xa9\xb8\xc7\xef\x9b\x9a\x01\x9b\x08\xbf:\xa6\x1f\xdb\xc8\xe4\xe6\xaa7\xd1\xaf\xef\xcb\x8dAk\x00\xb7\xe8\xfd\x01}\xa1\xbcR\x11\xc6\x8e\x7f\x90`L$?KBT\xf3\x82R\x807l\r\xf8\x83\xb1\xfd\x9f\xe00\xd9\xfc#\xc4\x95UrK\xaa\xffO]\x04\x8eK?\r\x12v[9Mu2\x83U\x81\xcb\x85\xf5\xe8\xc8n\xac\x96\xf4\xa08z:,Vf\xf8\xfd\x0c+\xa1zK\x97\x13\xc5\xff\x90\x122\xe3\xfc\x06v\x9c\xff\x19g\xb76\xfc~U\xe7\x10\xce\xe6\x19<B6\x94\xdd\xf7g\x08\x1b^w=\xe66\x19\xdd\xb3\x9a26\xa1&\xe7h\xb3\xce]I{i9;\xbf\xdb\xdc\xe3!\xb3\xf5g\xf5\x0e\xb8~\x01`\x87\x18\n\xff\x05\xa1+<:\x82\x0c\x0f\xa6\xbd\xc8\xfc\xc1\xe5\xc6$^/\xd5\x1e\xe9\xefBo\xfe]v4>\xcdcS\x81\xf6\x86h\xf8\xc8\xb6\xfd\xf6\x92dp\xd1\xc5\x83\x11\x9eG\xe2\x84\xad\xc3\xa7E\xfb\xdb\xae\x95\xde\xe1\xd4N\xbf\x83\x15\x06\xf2\xcd\xc9\xd4\xaa\xc5\xef\t\x1e\xaa\x07\x7f\x0c\xf4%\xd4{\xd5}L*y\x16\xa61\x15\xbcH\xb2\x07\x9e+\x02\xd6P \xb0s\x1b\xf0\x7f\xe7\x00\x8al\x80i(\xf4\x8e[\x84\x1c\xcdEY\xfa\xfc\xec\x9a\x020t\x08\xd5p\x82\xb4O\xc5\x0f>\xdb\x02\x98.\x89b0\xaf2?\x92\xcd\xea6\x14\xbc\xc0\xd0L\xb2\x9c\x86\xd5\xca\x95%\x8c\x84\x94[W\xf1\xc9\x95C\xc8\xeb\xcaK^r\x9e\x0f\xf7o/\x0f\xb3\xa3g\x19\x06\xe9\x92n\x0e\x08\x9b\x83\x7f\x87B\xc9\xc9\x108\xc4J9a\xbe\x02\n\xce\x8cK\x02\x17\xf7\xd4A\xf4H\xba\xb8"(\x9f\xa6\xd3\xfd[[Z\xa4\x03\x91\x1dj\x82\xa4\x7fJ>\x1aw\xdfS\xd9X\x16?\t8\xa4\xf4P\x10sh!\xf7}$\x8b\xf3\xc4\x10ZuO\xa5\xddU\x8f\xc7\xd5\xa5\x97\xe4\xf9\x19\xf2\x97LV<\xc6&k\xbf\xc7k\x10\xb6V\x01\x07m\xe0\xcal:\xb3\xf9W\x85*\x85\xc0Mu\xdd\xc5\xf4\x13\xef\x0b\xbb|\xd8Ze\x8a}\xf0\xca\x0c~\xbc\x14\xd1\x1d\xed\xb6\xbb\xfd3i\xb4\x8aN\x128\xff\xd5`\xb0\t$\x13\x19\xed\xf4i8\\B\xd8\x08\xe3\xecY\xdf!\x8e\x14\xce\x86[\x80\x92\xc4/q}{\xccb0<\xe9!\xf3i\xb4\x1d\n\xce\x11\x8f\x91e.\xd7+>\x9c&\xad\x15\nh\xa5\x17\x0e\x1d\xc2\xde\xc2e\x7f\xfe\x0bH\xa5\x9e%\xc2\xad\xa9\x88\xd789F\xd4T;\xc6{LM\x0e\xc68z:\x89O\xd9\xb3\xdbQ\x8e\x06\x0f\xef\x14x\x89p;\xffQ9\xa7]\xba\xe5\x1f]d{h\xae/+\xed;EH\xaeE\xadX7.\xd4\x13\x0c\xe4\xfc\xa1\xaf\xdf\x82\x17\xf6\xcfb\x81\xf0&v@\x99\x04\xbbW\xe4\x96{\xd9}#/E\xf4\x8fB^\xa2\xeb\x1e\x9a\x94rF\xe7u\xdfv\x9d"B\xe6\xc4\xe4\xca\xac\x8bv\xf2\xae^wt\x1c\xae|\xae\xa7\xc4\x15\x8c\x16\x07\x9b\xf7\x96\xb3K\x00\x18\x1d\xc4+\xe7\x167#7\x7f\xf0c\xe3>\x1fF\x996\x93\xb3sx\xaf\xed\x06\xe0\x7fx\xc9az\xbc\xb4\x8bv\xb1\xc0p\x0e\x11\xda\xbd\xa5\xdd\xednb9\xfe\xee\x9f\xb4\xc5\x16D7!\xe28A!\xe49\x9c\xfcIXv\xbb\x9f#\x94wxFb\x93\xf4\x07\xbe\xd8\x19\xff\r\xef\x1e\x0e\xddnV8)\xc8\xff\xbf\x90c\xcd\xa9\x8eiz4\xd1\xeao\x93!\xe4\xff\x83\xdc\xf1 i\xf6#\x8cw{\x1f\x1b\xd4\xadn\x00\x88\x96~\x864<\xfe')
|
1
|
+
import flask_bootstrap
|
2
|
+
import hiddifypanel
|
3
|
+
from dynaconf import FlaskDynaconf
|
4
|
+
from flask import Flask, request, g
|
5
|
+
from flask_babelex import Babel
|
6
|
+
from hiddifypanel.panel.init_db import init_db
|
7
|
+
import hiddifypanel
|
8
|
+
from hiddifypanel.models import *
|
9
|
+
from dotenv import dotenv_values
|
10
|
+
def create_app(cli=False,**config):
|
11
|
+
app = Flask(__name__, static_url_path="/<proxy_path>/static/", instance_relative_config=True)
|
12
|
+
import os
|
13
|
+
# os.environ['DOTENV_PATH']="/opt/vscode/workspace/HiddifyPanel/"
|
14
|
+
# FlaskDynaconf(app,load_dotenv=False)
|
15
|
+
for c,v in dotenv_values('app.cfg').items():
|
16
|
+
if v.isdecimal():
|
17
|
+
v= int(v)
|
18
|
+
else:
|
19
|
+
v=True if v.lower()=="true" else (False if v.lower()=="false" else v)
|
20
|
+
|
21
|
+
|
22
|
+
app.config[c]=v
|
23
|
+
|
24
|
+
|
25
|
+
app.jinja_env.line_statement_prefix = '%'
|
26
|
+
app.is_cli=cli
|
27
|
+
flask_bootstrap.Bootstrap4(app)
|
28
|
+
hiddifypanel.panel.database.init_app(app)
|
29
|
+
with app.app_context():
|
30
|
+
init_db()
|
31
|
+
|
32
|
+
|
33
|
+
hiddifypanel.panel.common.init_app(app)
|
34
|
+
hiddifypanel.panel.admin.init_app(app)
|
35
|
+
hiddifypanel.panel.user.init_app(app)
|
36
|
+
hiddifypanel.panel.cli.init_app(app)
|
37
|
+
hiddifypanel.panel.commercial.init_app(app)
|
38
|
+
|
39
|
+
app.config.update(config) # Override with passed config
|
40
|
+
app.config['WTF_CSRF_CHECK_DEFAULT'] = False
|
41
|
+
|
42
|
+
babel = Babel(app)
|
43
|
+
|
44
|
+
@babel.localeselector
|
45
|
+
def get_locale():
|
46
|
+
# Put your logic here. Application can store locale in
|
47
|
+
# user profile, cookie, session, etc.
|
48
|
+
from hiddifypanel.models import ConfigEnum, hconfig
|
49
|
+
if "admin" in request.base_url:
|
50
|
+
g.locale = hconfig(ConfigEnum.admin_lang) or hconfig(ConfigEnum.lang) or 'fa'
|
51
|
+
else:
|
52
|
+
g.locale = hconfig(ConfigEnum.lang) or "fa"
|
53
|
+
return g.locale
|
54
|
+
|
55
|
+
from flask_wtf.csrf import CSRFProtect
|
56
|
+
|
57
|
+
csrf = CSRFProtect(app)
|
58
|
+
|
59
|
+
@app.before_request
|
60
|
+
def check_csrf():
|
61
|
+
if "/admin/user/" in request.base_url: return
|
62
|
+
if "/admin/domain/" in request.base_url: return
|
63
|
+
if "/admin/actions/" in request.base_url: return
|
64
|
+
if "/api/v1/" in request.base_url: return
|
65
|
+
csrf.protect()
|
66
|
+
|
67
|
+
app.jinja_env.globals['get_locale'] = get_locale
|
68
|
+
app.jinja_env.globals['version'] = hiddifypanel.__version__
|
69
|
+
|
70
|
+
return app
|
71
|
+
|
72
|
+
|
73
|
+
def create_app_wsgi():
|
74
|
+
# workaround for Flask issue
|
75
|
+
# that doesn't allow **config
|
76
|
+
# to be passed to create_app
|
77
|
+
# https://github.com/pallets/flask/issues/4170
|
78
|
+
app = create_app()
|
79
|
+
return app
|
80
|
+
|
81
|
+
|
82
|
+
def create_cli_app():
|
83
|
+
# workaround for Flask issue
|
84
|
+
# that doesn't allow **config
|
85
|
+
# to be passed to create_app
|
86
|
+
# https://github.com/pallets/flask/issues/4170
|
87
|
+
app = create_app(cli=True)
|
88
|
+
return app
|
4
89
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
90
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
hiddifypanel/base2.py
CHANGED
@@ -1,5 +1,42 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
|
2
|
+
import os
|
3
|
+
import json
|
4
|
+
import sys
|
5
|
+
from datetime import datetime
|
6
|
+
from flask import request
|
7
|
+
from hiddifypanel.panel import hiddify,hiddify_api
|
8
|
+
from hiddifypanel.models import *
|
9
|
+
def init_app(app):
|
10
|
+
if hconfig(ConfigEnum.parent_panel):
|
11
|
+
hiddify_api.sync_child_to_parent()
|
12
|
+
@app.before_request
|
13
|
+
def test():
|
14
|
+
print(request.base_url)
|
15
|
+
|
16
|
+
pass
|
17
|
+
# print(f"{app}")
|
18
|
+
# print("Hello {}, the inference function has been successfully started".format(name))
|
19
|
+
# attribute = str(datetime.now().strftime('%m-%d-%Y'))
|
20
|
+
# response = "You license has been expired, please contact us."
|
21
|
+
# year_to_expire = int(2022)
|
22
|
+
|
23
|
+
# try:
|
24
|
+
# assert int(attribute.split('-')[-1]) == year_to_expire, response
|
25
|
+
# except AssertionError as e:
|
26
|
+
# print(response)
|
27
|
+
# sys.exit()
|
28
|
+
|
29
|
+
# # Replace your main code to operate here.
|
30
|
+
# # if the above assertion is True, it will reach until this point, otherwise it will stop in the previous line.
|
31
|
+
|
32
|
+
# if tag:
|
33
|
+
# print("inference function has been completed successfully")
|
34
|
+
# return True
|
35
|
+
# else:
|
36
|
+
# return False
|
37
|
+
|
38
|
+
|
39
|
+
# if __name__ == "__main__":
|
40
|
+
# _ = inference(name="Bala")
|
4
41
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
42
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
hiddifypanel/models/__init__.py
CHANGED
@@ -1,5 +1,12 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
|
1
|
+
from .config_enum import ConfigCategory,ConfigEnum
|
2
|
+
from .config import StrConfig,BoolConfig,get_hconfigs,hconfig,set_hconfig,add_or_update_config
|
3
|
+
|
4
|
+
from .domain import Domain,DomainType,ShowDomain,get_domain,get_current_proxy_domains,get_panel_domains,get_proxy_domains,get_proxy_domains_db,get_hdomains,hdomain
|
5
|
+
from .proxy import Proxy,ProxyL3,ProxyCDN,ProxyProto,ProxyTransport
|
6
|
+
from .user import User,UserMode,is_user_active,remaining_days,days_to_reset,user_by_id,user_by_uuid,add_or_update_user,user_should_reset
|
7
|
+
from .child import Child
|
8
|
+
from .usage import DailyUsage,get_daily_usage_stats
|
9
|
+
|
10
|
+
|
4
11
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
12
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
hiddifypanel/models/child.py
CHANGED
@@ -1,5 +1,27 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
|
4
|
-
|
1
|
+
from sqlalchemy_serializer import SerializerMixin
|
2
|
+
from flask import Flask
|
3
|
+
from flask_sqlalchemy import SQLAlchemy
|
4
|
+
from flask_admin import Admin
|
5
|
+
from flask_admin.contrib.sqla import ModelView
|
6
|
+
from wtforms import SelectMultipleField
|
7
|
+
|
8
|
+
from sqlalchemy.orm import backref
|
9
|
+
|
10
|
+
from flask import Markup
|
11
|
+
from dateutil import relativedelta
|
12
|
+
from hiddifypanel.panel.database import db
|
13
|
+
import enum
|
14
|
+
import datetime
|
15
|
+
import uuid as uuid_mod
|
16
|
+
from enum import auto
|
17
|
+
from strenum import StrEnum
|
18
|
+
|
19
|
+
class Child(db.Model, SerializerMixin):
|
20
|
+
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
|
21
|
+
# ip = db.Column(db.String(200), nullable=False, unique=True)
|
22
|
+
unique_id=db.Column(db.String(200), nullable=False, unique=True)
|
23
|
+
domains = db.relationship('Domain', cascade="all,delete",backref='child')
|
24
|
+
proxies = db.relationship('Proxy', cascade="all,delete",backref='child')
|
25
|
+
boolconfigs = db.relationship('BoolConfig', cascade="all,delete",backref='child')
|
26
|
+
strconfigs = db.relationship('StrConfig', cascade="all,delete",backref='child')#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
27
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
hiddifypanel/models/config.py
CHANGED
@@ -1,5 +1,106 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\x0b\x00\xa7\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\xb6!\x00\x00\x12\t\x04\x00c\x15\x9d\xbbQ\xf7\x86\x14]\xd3\xb5\xcd\xd4(1s\x00\x00\x00\x00\x00\x00\x00\x00\xa2]\n\x0feH\xac\x1eC\xde\xd3>\xd59\x8ez\xc1:\xb8gUO\xa6\xa84\xaf\xdc\xf1y\x10gv\x17\x95*v\xe6\xaa\xd8\x1f\xc1\xf6R\xe4\xbfF\xb2B\x94\xd4\xb8\x14\xb8\xd1\xa5\xb5w\x8a$}\xc4\xb3\x10\xb1h4\xa5\xc2\xd1Vr\xe6\xc9B\xdf7$\x16\'w\xf0L*\\\x94\x8a\xa1mM\xdf\x84O\xd3\x05"\xcd*\xe6l\xe4c\xb6\xd4\xe7\x88\xdd\xdc\xa9\xd7\x9b\x90_f\xa7\xa0\x13\x83\xd4\xc4\xf4\xd5{p\x83\xab\xc7h\xf3\x7f\xa5}u\x10\xcd\x19#\x1cZ\xd8z\xb5\x1f\xeaODN\x1ce"&\'\x8c\x7f\x859\xf6\x88eE\xbc\n\x85\xcb\x89\x00\x97\x8b\xba\x8b|pC\xad\x16MzJ\x04i\x1c\x0b\x87h\t\xd3\x82z\xf13\xd2\x1f\xec+\x1d\x93\xf4\x89\xf0\xaet\xe5\x8cp\x95\xfe\xc6Gt\x9fr?\xdcx\xc02^0\xa0>\xce7\'K"\xe5Bv\xf0\xf9\x05\xe3\xfe\xc3s\xf5\xad2\x9bPjk\x9b\x1a\xc1\x02\x9d\x02e\r\xfe8\xab58\xd7\xe6%\xdc\xbbN2\x15\x04\xc7\x08\xd6\x9d\xd7\x15\x1f\x81sR\xd9\xb3_><!\xbb\xaf6C\x1e\xa3\x1d)\xf5\x1e\x9e\xcc\x0c\x8d\xd1q\'ya\x04\xb0\xca.\x9b\x87\x1cx\xf06\xc3\xcc\x02\xb9}\x04\x8c`dH\xbd #\xbcx\xdbz \x83\xc7O\xafa=\xe9$_\xbau~\x1b%\x88\xf4?\xc16\xde\xc4\x8fabI\xc6\x89E\xab\xab\x8e>\xeb\x18Y\xff<\x04{N8bQ\xb0\xc7\xa8\x15\xd6\xc8;c\xc6tI\t\xe3\x852*z\xf3\xde\xd5\xdd\xb3\xf7\xf3\x1a\x86zB\xc1V\x88*\x1e\x96/\xc8\x9a\xbb\xfd\xc5\xef\xc0\xf1r\x14\x9aL\xd4\xdd<\xc9\xfa\xb86a\x9a\xf9\x8aA\xb6`\x0f\xb4\x1c\xfc+\xa9\xca\xbdMh\x8d\xa8\xe7\xa0\x89\x8d\x16\x10\x87\xb1\xd7\x837\x10\x8c\x83\xb3\x808x\xb5\x86\x9e5\x82\xb1*]}\x1a\xe1t\xb7R\x1d)\xe9\xa6%X\xa3\x88\x15\xa8\x93\xa3\x80\x93vR\xb0\xab\xe4T\x05R\xbc\x1e\xaa\xec\xab\xe3\xd9\x89P\x14\xa2h\r\xcd\xfa\x9bm\xd5a\x05bZRZ\x93b\x0cg\xf0\x9a:\x8dC\xde\x88\x04\xcc\xd3W\x93SS\xd2-\xb0\xf7\xdcz}\x88\x17\x0cm\xe3\x1c\xd6\xc5h\xe4 \x05\xad\x8c\xbb\xbc\t\xe3<\xdf\xcc#]\xda\x97c\xbe\x17\x9c\x05\x910\x07B\xec A\xea=@\xc3\xa6\xd7\x171\x8eez\x95yo\xaf\x9cg\x1a\xd96\xa2\xdc^\xbbK<\x18\xbc\xaaH\x08\x18$\xe0\x9c\xe8\xfc\xfc\xbb\xcb\xa5\xb3\xda\x8f\xb1\xe9\x1du\xf3\\\n\xfe\xb9\xd1\xfaNy\xf1C-;\xee\xa6|\xc1z\xa5\xbf\x1f\xe27\xbf\x15&|\xd7\xc3\xa8z\xac \xd3}<\\j\xee(@\xa2\x06Q&\xa867Z\xd6\xe4s\xa1\x92,\x1f\xe2\xb7\x1b\x01q\xf8@V\xa4\'\xcf\x9a\xb9\xe2Hq\xc7od\x9e\xf7(g\xb5\x8b\xff\xa6Y\xacP\xd4\xa8L\xae\x9b\xda\xd6\x05\x7f\xc2\x9dLJ}+X\xbc\xa2\xab\xfe\xe1x\x17Qm\x1c\xb0\x04\x11\x1f\x88\x10\x86\x919\xf6\xca.\x97\xe04\xcc\xa7\xbfZ\xd1[%\xb7\x915\xe1+x4\xc5\x1bC\xab\xb0\xd0\x89\xb0MG\xdes\xcc\xd5\xaa\xa7\x87"\n\xf3\xae\x19\xbc\xed\xa8\x00M\x80\xf4\xf9\x8b\xdb\xf9\xfb(\xc1\\-WP*\xe0o\x05\xaa\x83\x90\xc3BQ\xd9\x86\xe9\xfaz\x04\xfd\x7f\xc7\x12\xa4\xd5\xdd\xf1\xe0:\xa8T\xd3\x91\xed\xd9\xe3;\x06\xf8\x01J\xb3]`\xa8_\x8dG_? Y\xee\xd2[s\xc4\xdcb0\xe4\xed-\xd2U\xf5\n\x10\xe2\x9d\x9e9\xc7u\x03I\xdc\xf59\xef\xdc\xf2w\xd4\x80\xca,\x15\xc7/\x18\x17\xa6\xc9g\xa3\xd1\xac\x94\xacv\xd9\xc2\x04\x13\xa0\xc7(\x90\xf0\xab\xc3E\xea\n\xb7\xa9\x865m6\xc7\x9e\xc1\xb1\xcf2\xa5\xdfT;%\x15\xa5\xdd\t\xebz3\xfe\xa3VK.})gq\xfa\x07\x1e{\xff\xd8Y\xee$\x98\xe5h\x1dv\xb2~\xceA\xf1\x97\x1f\xfbyA\x17\xe4}\x0cv\xb3B\xa4\xd5\n\xaaE\x80t\x85\x9fD\x98\x82-\x86\xca\x11\'\xdeg)\xd6y*\x0es\xc79\x94\xd1\xacSs\'c\xc1\xabW\x16)9\xc4fAP\x99\x0bzW\x8e\xd7f\xa1\xc13+ \xe7\xcb\x11\xe3J\x1c?\xee\xf15\xf3}\x9cn\x8bG>\xbe\xf8/\x877p\xf5\x11\xaf\xb8\x8cM\xf5\x19S\xe8\x8dfb3\xce\x7f1\xe8\x19\x12\xf0V}a\xd6\xe2K~\xdf)o\xec\xb9\xba\x9d}>r\xda;\x9f\xfbza\xd9m\x94%\xd0\xd9}\xb0\xe2Z\x04\xc4}\xbc\xd4l\xa6\x00\xd1\xdfC\x1d\xef\x8a\x1f\x83\x8cF}\xfa\xd8\xfdB\xc3\xe5%\x97\x8aWC\x16\xea\x06\x05\'%VU*,C\xae\xed\xe4tz\xde\xfe\xba\xf3\xb3\x02v\xd3\x15J\xa3\xfazn\xc1\xcd\xa5[\x7fL[\x1e\xad\x9a\r=\x96\xe5\xc5,%p\xbaVX\xcf.Y-e\x8aXK\x00b/>$b\xbe\xfa\xa2\xd4\n\xc8:\xb1"\xad\x18D\xcfj\xef\x12\x1f\\\r\xa7\xf0\xb0\xc5\x92\x81\xf2S\xe1P m\x13\xb4\xfal\xb2\x9b\x04\x14v\xaf\x9d\x8e4\xd5S-\'B(\x0c\x9e\x8e\n\x7f\xd5\xe2\x952\x9d\xfe\x9em\xfd\xa4)\xda\xd0U\x80-\x86\xa8Mk\xfe\xa4\xf6}\x02\x12\xc5\xa6I|)\xdb\xd1\x94\xc3\xdc\xef\xa2\xd5\x9b"s|\xfd\x07\x86\x01G\x00\x9f\'\xee\x0e\xbd\xdf\x88\xd3\xbb*\xc7?~{wYy[w\x02xZ\x14\x92\xe4\xf2\xa4\xba_\xb7\xef\xf0\x1cC\x94\'\x1b\x12\xe2\xed\xfa\xec\x0b\x16!\xd0\xe7Iz\xb3\xb0\xcat\xaa\xe0\x93UB\x92\xa0\xd6\x1c4\x8d\x93`\x0e\x86\xdd\xc3\xbcZ\xc9\xe1\x03^U\xb74\xcaf\x1f]\xd6z\xb1wS\xa3\xb2\xd3\xc78wb\xb28\xf6\xa2\xa4\x1dK:\xeej\x8a\x1d\x9c#(\xb8\xba\x10\x1e\xa9\xe7\xd0I\xfc\xd4\x14\x93!Nv\x93S"\xfc\x9d\xe0\x05p\x11\x92\\\xcc\x87\xe7G\x1c\xbf\x99\x03\xce,\x84\xb9\xfc_\xbc\xbdm\xe6v\xea\xc5HFh\x01\xcal\xca1\x0b>\x90\x8cW\xedf]\x15\xe2\x86\x99\\g\xefDA\xe1 \xd0\xfb\xa9+f\xc9\x87\x9a7=\xc0(\x18"O\x1cJ\x1d\xc2\xa6%\xc9\xee\x1bGC\x07oB\x06\x1bm\xd4\xfb\xf6U\x19\xf6\x0c\x85u?~\xbe\x85\xb2\xd4\xdc\x9f\xebL\x05u5\xbd\xfd\xd5\xa7~b\xdd\xb2;\x7f\xc1k\xdd\xbb\xf7\x95\xca\xabs|\xbd\x0c\'\xb1O\xf1\xae\xfd\xd5.p\xb8\xf2\x15(\xfbG~\x86\tv\xbf+\xf8\x19\x067NP\xa7\xfez\xfb\xc2<\xb1{\x95U\xa4\xa3=A\x83\x9d\x0b\x18\xed\x06\xf3\xbajDb\xeb\xefm\x17\xdbW\\\x99\xff\x03\x0f\xcd.\xb4\xe8\x1er@\xfd\xe0\xe5T)\xabM\xcc\xfa\x07\x85+\x89\xbc\xdd\x18\xc5I\x14j\xf1_\x90r\x1e\xa3_\x96\x95\xe9\x9cBp=\x0b\xcam/L-\xa4\xf7\x08\x8a\xeb{\xe2cHT\x9b\x14*|\xacx\xd3\xb6\xdfr\xe8\xa6\x11\xef\x7f\xbfL\xeb\x14\xca\xf7\xec\x12\xc0\x8ef\xdb\x93\xb3\x16\xa1\\\xd1\x80\x1e\xc2\x14\xb8\x91\xb31w\xaf\xe9\x19\x984\xb3E\x00\xf7\xfe\x12\xdd>\x91&\t\xa8\xd2\x8e\x0b\x1f\xa9\xe6\x8e\xfb\xbb>]\x88\x1eQD\xa2\xe6\xaf\xf3\xbe\x89R\xbb\xea\x0b;\xdd\xb8\xf4Vj\xf9\x0c\xd5M\xb9?\xd1\x19\xee\xad\x87;\x87$\xf8\xbde\x87\x0e\xae\xdb\x1c\xe0\xc0)\xfc\xee\x8c\xf7\x12\x8d/<I}Zx\r\x99\xc1k\xa4&\xe7z\xf4\x8f\xf4\xa2(.[=<\xdf0\xeb\xbc\xde9\xf3\xf0\x85\xf6\xf8p\xc4\xbc"\x0bfG\xf1e\xda\xa1W\xac\xc3\xa0\xfb%f\xd5\xce`\xc1\xab\xde\xbcU\xab\x97\x94\xb7\x92\x92\xd1&\xd0\xc1\x06 n\x06e\x13E\xdf\x9f\xc1\xe75\x13\xc9\xe3Q^\x9eq\xf1\xa3\x9ay\xb4i\xf5\x8b\x0c\x18\xac\x88P\xb4&\xd5\xf7Q\x1co\x14\xef\x82,\x9f\x05\x8a\xf6\x04\xb4k\x8e\x0fc\xd0\xa8-c\x95WD\x9d\xf4\x17\x10\xabxk\xc2\x9d\x19\x97\xbf\xf6E\x18\xff0B&\xec\x8b\xf5\x12\x15\x04A\xa1\xe2\x87\xb1\x98\xdb`\r\xbd\xf2k\x17\x85\x13p\xc9\r\x02^\xaf;\x0f\x03\xd4H\xcaF7E\x99\xdf\x04r\xee\xaaJ\x1c\xc12\x98r\xd2\xee\x15L\xfc\x1f\xb6\xad\xdc\xac=\xcb\xd4\x84\xc8\xa6\xbb\xb79\xd3\xef\x1a\xd2x\xb2\xden7A\xa8\xbe\xa02\x14\x0c*\x04\xae\xf5\tY\x85y\xc35P|\x03\xa8r\x12\x85\xded\xd9\\^O\x0b\x93hQ\xe1Z\xa0wv\x8b\xd7\xc5\xac\xfe6\x95|\x7f\xaa\x16\x91\x05\xc7\xa2\x13\x02\xc2@E2\x04\xe9\x1e\t\xc0X4,O&4*\xd0\xe8\xd2T}3\x87\x1aD\xb4\x02B\x01L\xa8\x8bU$\xab\xb25b"\x15d\xee\xbc\xf3\x80Y\xff\xb2\xc4U\x81\xb2V\xdd\xa52Q\x84\xa2\x1aN\x9an\xd5\x9d\xcd\xa7\x1dv\xc2\xac\t\xcdA\x94\xf0^7k%\x85\xe8\xfd\xc7\xbb\x90\xc5\xc3\xbd\xb8M@\xb0,A<\r-^b{4\xb8\xa36\n\xec\xc6;4\x1d\x9f\xd6-\x1aY\xbf\xc1\xb6\x17\x10\xb1\xed\xa7\xe3\x97S$L\x12\x17(\xf5f\xcbX\x94\xee\x88\xe5\x15D\xb4\xe1\x00\xe9X\xed\xa4\x02L\x18\x8d5\x04\x988\x96\xc2\x88\xaf!\xc3\xe6G%\x9a|\xde\xfbk\xabL`~|W\xd6&\xc0D\xabL\x9f\xd6\xc2\x9f\x9c20H6\x12>k\x06\xe0*\xccw\x00\x18\x8e\xc7\xe1\xdb\xd6\xae\xe6O\xf1\xc7\xa9B>\x04\xff\xc5\xfaJ\x1d\n;\xf7\x86\xcc1\xe1a\x12#T\x8e\xa7;j\xc6\xeb[\x1b\x00\xcb\xdb\xc7\xafd\x93\xc2u`^\x08\xce\xcbp\x8a\xefv\xd3u>LX\xec\xd2\x9f\xc9\x82\xf1\xda\x07l\x9a\x00\x12\x10\x18\xf6\xc8\xf0}\xbdN\x1c\x10\xf3\xfd\xa4\xf5B\xc0J\xb1-\xfb\x96\x87\x98\x8e#&\x14\xe0I\xed<\xaa\x93,\xc0\x1e\x9b\xa4|D\xa4\xb2\xb4\xd6x\xb3E\xd9\xff\x1f\xd7M\x8c\xde\xbb z2b.\x8ed\x8e\xa0h\x02\xde\xf5\xee\xf0\xb6\x849\xa1\xd2\xc2&\x98U\xaaxV\x97\xe4\x1d\xcf\'|\xe6\x9e\xa5?\x93\xbc/\x05\\\x9a\xbe\x81"x\xe5\xfc\xd18N\xe0,o\xe4\x93\xadm\xffa\x99E\xe0\xabY4BE\xc2mg\x8fd\xce\xfa\xe2\xc5K\x9aN\xdb\x04_\x96\xff"q\xe7Q$]\xa9\xc9\xf6W\x88\\\xc9\xe5\x10\xc1T\x0c\x07O\xa0h?\xfe\xea!\x91T\xff\xe0\xb3\xa3~\x9a\x04\xe0\xc5\xf2#\x14\x10\xd0\x10]\xc7]\x07\x86JZC?_\x8e~\xb5p\xa0q\xb6Z\xaaZ)x\x88~\x84\x1c\n\x98\x13dt\x13\xb5yO\xd7L7(\xb2C\xa3\xb7\x0b\xfb\xb5yi8\xabS\x1a\x08\x00[8S\xccv\xa2y\x899\xad`\xc9\x87I\x90\xbby\x0f\x90\x1a\x01\xb76\xa0\xaa\x86\xe2\x98M\x0ed\xe8\xd3\xd2C2-\xcd\x18)\x93\xfe\x13y\xc0H\x80b\x8a\x924\xc9\x16"\xb9\xd9\n\x9er\xb2\x1aChN\xb0\x19\xdf\xce#\xf3n\x86\xd3\x0f\xaaH)R-\xe0\x0e\x1a\xd3\x01+\xf7\x91~r\xc5\x1c2\x9f\xebR\xef\x80\x0f\xcab\xbe\xadlX\x83{0\xff\xb1\x00mQu(_q\xf4(\x0f3\xa0J\xe7\xda\xa8\x9c\xf84\x06f\x87\xf6\x8a\xa8=k}f$\xf9\x98$\x0c\x96\xbd\x8cPL \'\xa8\xcd3\xc9K\xc5\xf2\xf3]\xae\x81\x18\xbb7D\xab\xcb\xcf\x14;\xb9R\xee\xdd\xb5h\xc3d\xbf\xd1|J\xd4A\x1fU\xa1\x8f\xa2~S\x0c\xca\xe0\xde}\x02f\x96\xd6W\xff\xf5VH\xb8oY-9\xb0D\xfd$nT\xfd\xfe\x0c?\xb6\xd9U&SNj\x8f\x9d\xaf\xc1?\x17\xb0\xeb\xf0\xe9#\xa3\x00\xa6:d\xf3y9FT\xe2F?\xae \x00A\xf4\x85\xef\xec*\xcf\x95H.]s\xb9\x8a\x8c\xdfO\x98\xb1W\xf4Y\xb2/\xea\x92\xacEW\x1b\xae\x07h\x9e\xe0L\x99\xfdS\xe7\xfd|\xa3\x0bF\n\x7f\x0e\x8e\xe7"\x11\xb6M7\x07\xc75\xe3\x10~\x8f\xaf\x9e\xd7\xda\xaf\x9c\xf6)\xbb\xe5\xa1\xa4\x1b\x13\xb9\xeeC\xe9\xccu\xfd0?^\x1d\x03\x98\xef\xac0\xc6\x11H\xc6\xa7\xa9\xf6\x94\xec\n=w\xbc\x98/\xa3[sJZ\xd3C\xb0;\xd05\xed\xe9\xbe\xc4\'\x89F\xad\xbeV|\xb1\x8dr\xd8\xd8\xceT\xc8dN\x90\x91\xf0xSK\xdd!\xa8}\xd4fO\x19\xd0\x90\t!\xfe\xf2\x85f\xe89\x86 \x97\xfbd\xc2\x8e\xfb\xd55\xa2\xdc\xea\x94\xcc\xe4Rn=<\xbf9\x8e\xf7\x06\x0c\x8cZ\x0f\xcb\rA\xc8\xf0~\xd1g0\xba\xe5\xd3\xea\x00^\xfd\xc4\xac\xc2\x15fw/\xa0\x1anU\x11(\xbe\xf7%\x93U\x16\xf1\xdd`\xd4.\xef\xd7e\x00\n\xe8\x94\x1cYI<7\xe1\xef;\xe5\xe4pw\xa2!f\xb2f-\x83b\xa9\xea\x05\x10Q\xf8\x85+\x06\x02U\xe5\x10a\xcc\x00\xef\x0b\xb1t)2\x98\xd4P\xea\x8f\x8ch\xd6N\x7f\xee\x1f\xca\x85\x91\xdf\xd5"_\xaft\x17P\xa3(]\xe1\x07\xe7n\xf6\xcf\xda\x81\xb3\xfa\xf2v\x00f8\xb22\xc6\xb2\xb5\xbb\x8fpD`\xafA\x00w*\x87\xc2\xed\xba\xbc\xed\xe2\xca\xebW*\x92\xd9G\x8f&\x1fY\xc0tE\xdd1\x8b\x1b{Y\xc2\xa3f\x0b\x87u\x92\xf9\xd2K\xb2\x1f\x06.\xbbn\xfbA\xd1Sf\xde\xc0\xf0\xaa\x92\xc9\xca4M\x06\xa9\xa7\xa6\x93L"r\xe4\xc5\x10*\xf7\x1e!\xdfyY\xf7\x18:\x82\x9fw\xae\x1b\xce\xdfdO\xf2\xad\x01\xdcY\x10O5\x04\xe2G\x0c.\xf6\x00\xcd@\xbcD\x1c\x9b\xe7\x19\x1e]\xe9\xdc\xd6V\x96\x94aA5\xfe:H\xbe\x9d\xae*\xd0\x10C\x8a\x82\xe6\x8d\x0c\xf0L\xe8\xad\x04\xcd\xc5\x992\xedza\x98$\xfb\xdc\xc4\xba\x10\xdc\x80\x91\xe9Oc\x80\xf9\xab\xf8K"\xd1\xfc[c\xe7\xda\x07\xef\xeb\x9c\x82\xfeu$\xf6\xb6\xd2\xbbR\xaa\xd6u\xa8^\xfc\xbbZ\xf4,P\xda\xcf\xd5N\x8eJA\x0b\x06u\xbb\x9bg\x9f|\xa1?7(\x9c\xcf\xfc\x86r\x93\xf5[a\x90\x18(\xe3\xda\x1d\x0e4\xbb\x83E\x0b`\x82#\xbe\x0b|x\xce6\xb8\xd6g\x80/\xe9/\x88~\x81_!g\xcfn\xbb!T\xdc5a\xe0\xa0fR(K\xcb\xc8F\xdb\x13\xe1\\\x81t?\xbf\xaf\xe2W>Y\xb55]O2\x9b%\x10{f\xdb\xc9X\xab\x9f\x83W\xcfZ\x81\x18\xf3\x91s[\x80a\xdb\x8cq\xabu\x85\xcfP\x0e\xeb\xe3\x03\xbf\x82`\x0e;\xaf\xa0 \xdf\xb1\x05#G*\xf6\x8c\xaeq*1dh\xedy|wX\xfaE5!\xd6q\x05\x8a\x1b\x9d\x11_S\x01\xe4\x90\xb5E\xf5(Y\xdbR\xfb\xf5%d\xbe\x88\x1d\xd8z\x0b}=\xa3s\xcd\x7f\xfa\x88\xe2mb\xfe!\x1c=\xcf!\xab\x10\xa3!\xf3@\x0bH\xf5\x7f.\xd5|!\t\xc2O\x9c\xc6\x85\x82\x8c\xeaM\x9fs\xeb\xdf\xa1\xb9\x82\x06\xb2\xf1Q\xf9*`\x01\xba\xabw\x0b\xd8\xc3A\xe4\x84\x81-g\x12[Cf)|\x11\x06\x1e\xb4A\x18b\xad\xdb\r\xa7\xa7\x06-\xcf\x08h\xa1\x023\xac\x07\x99\xa6\xc5\xfb ?\x9a:N\x13\x8a\xf2\xa4A\xd1\xe2\x9c\x87eaK\x18\x18\xf3\xe1\x9521W>\xc5o\xb5\xe9\x96\x9f\xc9\x92\xc4\xea6\xa0\x00)\xc7\xb6\xe5\xa60Q\x0f\x91\x93\x81\r\xc8\xe6\xb6\x86;\xe8j]m\x9b\xc7l0\xed)\xb5d\x19\xa9\xb6\x0c\xc3\x05\x1a\x08\x9bLK\xbf\x80\x9a?b\xa2\xab\xd0\xe4\xde\xd0\xa4\xe1L\xc2~\xbc\xb7\xff`_$\xe8Y\x08\xbe\x93Tv# \x02\x12oJ\x0b\x90\x0bs\xb8,\xa5\x8fU\xd0\xc7.}d\x13\xf3I\xea+\x13\x9e\x0fB\rK+\xfd&Xy.Y\xea\x8d\x19%y\xc5\xcd\xb5\x15\x95\xd5\xe9\xf8\xd5\x10\xf1%\xf7s\x07/\x87%wLj$f3|\xe6\xd1T\xcf1f\xe3\x95\x83\xd3\xaf\xa6\x17X}\xd7\x8ckk\xb6\x1d\xb5\x0b\xe8\x93\xdc5\xdb!0\x19"\xbd\xbe\x8d\x02M\xf4\xd6\x8e\x11B\'7|\x95\xca\x90\xd3H\x8f\xa9\x1eX\x18\n\xe6\xbf\xf6\xfb\xd4\xe2\xd0\n\xda-\x0e}\xd2+Dw\x9b\xbf\xa4\xc9Z\xfd\xce6\xd2\xc8Bo`\x15\xea\x87\x1aJ\x9a\x87J7\x1c\x1f\xc0\xaa\x0e\x19tM\xb2\xc7\xad\xa2r\xf2\xee\xafI(!\x9d\xefYq\xd4FX\xba\x11\xfa\xd1\x11d!\xa5p\x9a\x0b[\x1b\\\xac\x0f\xce\x9f\xd9\xf5U\xd3U\x08P\xe1\xa6\xcc\x8bK\x8e&\x14lz/\x85\x08\xdc\xa46\xebJ\xff\xe2\x14\x993\x9e7\xe4"\r\x7f$}\xab\xa8\xc9\x1f%\x08\xdac\x10~\xd4\xba\x85\xdc\x86h\xb8\xf7\xbb\xdd\x94\xa9\x0b\xf8{\x14\x0b\x7f\xb5\xd5Rta\xa4\x93\x00\x8dO\xae\xbb\x1f\xa9\xd1\xd6~\x9f\xd0$YIK]\x9fq\x0b\x1a\xfc\x87\t\xec2N+\xad\xcd\xa3\xc5Z\x01Z\xb5\x00\x9d4\xc0[\xe4;?\x18\xfc\xa2\x99N\xe5\xca\xe3E\x8d\x07\xb4\xe7O2\xd6\x988\x15\xe7\xf5\xe6\xb5\xb1^hY\x05N\xee\xe3w\x90\xecn\xc2\x95\x87bv\x17\xef\x9b0\x8d\xf2\xf3$0\xf1p\xb7\x03JzW!%\x9b=RL!>X\xf3\xb7\xda K\x9f\xd7\x9dR;=\x83O\x82\xc9\xab\xe8\x84\xdf\x8b\x9d\x82\xder\x0f\xa4\\_\xa42\xa0!tQqRvS\x93.\x84HL\xab\x86\xeb\xe9\x94J\xd9ox\x07-\xc0\x00\xc8\x9dEzz\xfc\x8d\xea\xa7\xd6\xb4\x18\x852\xc3KX\xef\xe2\xff\xd3\xfa\xbfo\xd2Fx\x1f\x8d\\\xbeO\xf1\xfe\x91W\xe8\xd8g\t9;\xb5\xd5\x0c\xa8\x16r<\xba\xfb\xf9\xb4\xe0\xbfO\xc8\xc1FS\xc1Bq\x1c\xeaR\x96 \xacg\x93\xccq\t+&\x90\x14t\x89c_\x82w8p\x9e\x89\xc5[\xfd\x93v\xe6U \xd2\xe0^\xefWq\x11\x18\xb3G.\xda\xa3\xcf\x11\xf7\xab\x08V\xa60\xcc\xbem&D\xca@z\x0e\x12\x91}\xac\xe5\xcd},\xf0\x01}^T\xb9\x0b\x05\x15;\x15\x04{\x7f\x10K)\xe3\xb9\xaa\x06\xe0i\xa4\x0eh\xe43\x8f\xa4\x99;\x88~1b\xdf\xa13[\xbe\x95\xb4\xc0\xe4;<\\\x83\xe9\x1c\x05O\xff\x9d\xbf\x08%\xc2\x9a\t\xff\xb9S:Yl}5\xa2/\xdc\xdd\xe0\x8f\xdc+|{\\\xd2GZ\xfc\xb3}\x0b\x07HA\xdd\xd8z\xb6\x90\xc5\xfc\x87\xd4\xac\x9b\xa1v\x85\xd4yc\xbf\x19\x14r\xbd\x9fh\xcb\x04\x87\x9f\xcd4\xff\x92mru\x8e\xaf{\xe7\xa1\x885\x10\xd9f\x95\xe2\xf7\xb2k\xcdj\x16C,+\xc0\xc4\xb0>\xde\x98H>L\x02I\xa0V\x94\xab\x16\x94\xeb\xa1\xb9)+l\x17\x99\x0f\x9d\x122?W\x17\xac\xc3\'\x1a\x1ck \xc5$B\xbf\xf49~+xn\xf2}\xaf\xd6\xd1-\x85\x1b\xce\xad\xce\xf0\xe0\xdb\xf5=Yz>?\xd0\x02\xb7\x0b\x01\x90\x11\xfe\xa8\x08\x8e\xe6t\x00\xa0=\xac\x9dnD\xa3\xcb\xa9\x11\xd9D\x90H\x14"\x1c\\\x8e\xb5~\x15|\xab=\xaek#\xff\xe0\xc3\x0e\xe6\xe2\xab\x91\xb6y\x1b\xcf\xee\xf2J\x0e\xf0\xa4\x85\x94\x08)\xbd\xaa\xf2\xe4R\xcf\xe2\x14\xc7_\xd8|+\x1fu\x1e\x96\'\xce\xa4\x01_\xbf\xc3\xb0\x8e\xec\x0e\x02\x81\x05?L\xe1\xaf\xba*~O\xc3aJ\xf3\\W\xd3\x9b\xa3\x14Cvp\n\\J\x16!\xabel+|\x81!\x8c\xd6\x9b\xb8KM:%\xe8}A\x97\x1fD|^\xd7\xa6Ixq\xb9{\x03A\x8e.\xff;\x92\x7f\xc1\xb2\xbe\xf0\x02\xaf"\x17\x03\x92\xaf\x14(\xc7/j\xd2\x13\xac\xdf\xe8F-\xb7BJ\xd9N92S\x18\xac}\xd1_\xf0=\xe7P\xb7\xb2\xa1\xa7\xba5\xf5B\xb8]Z\x01\xf3\xba\x9f\xa2\xdd\t\xea8/\x01C\xd0\x0f\x06;%F\x92\xfcE\x82-\x1a\\\x08\xdb\xfcx\xbf\xe9-\tr2\x0f\x8fM\xdar\x0e@\xd9(Ux\x81\x1b1\xb8\xf8\xbb\xf9#\x92M\xa4\x98j"V\xff\x938\xc8\x15\x07\\\x9b\xcd;\xdc\n\xe16>\xc0y\xd5Y\xc9\xa0^\x03\xb7\xbax1b\xdf\'q\x88\x02\x9arm\x02\xf8\xf8<7i\xdfK\x19X\x97`\xb3\xf8^\xf0\x95\x9cCs\x1aG\x9cj\x16\xb8\x11\xa7rY\xd2\xf8u\xe0\xba\xa4(\\\xb4\x9b\xb8y\x9a+\x08\xb5I\x83\xd2\x9b\x94z\xc6\xea\xd4w\x9d\xa2\xac\xdele\t}\x0c\x9bh\xebc\xd6y\x1b\xa2\x87\xb5\x9a\xddz\x82\x9c\xbb\x00\x7f\x80\\\xbeH}\xd9Q4\x1bE(\xdf\xe8lR4o\x97\x98tbY\xc2\xa93 \xb6.]6\xbf\x87\'\xeeZ\x0c\xbd\xb2\x12\x93"\xd5\xed}\x9fy\x9ex\xf4\x17\xcb\xd1\xac\x92J\x9f\xbd"\x15\x7f\x99Q\x11W\xa9\xf5\xce3\x13ve\x07\xeb5O\xab\'\xd2\xc5\x17\x81w\x13\xb5\xc7\xf3\x19\x00!\x93+\xd8\x04t/\x91\x07\'\xeeP^\x92\x81\xec\xc3\xb5{N\xbcb\xe5 :\x1f\xe8\xf4\x9e\xa8\xcd\xe1M\xde\xfb\x15u\xdf\xd0\xbe^\xf7\x08\xfc\xa7\'~\xe5\xe8\xba\xef\xe0\x8b\xcb\xe4\xf3\xe7]\x19\x8b\xa3\xd1\x82\xb1yY6\x8fT\xc5G\x9fX9\xd8\x11z\xa7\xecS\xfe\x81Ot~\xfcw\xd4N\xb7\x9a\xbc*\x1brat\xa21\x8d\xc0\xc4\xcc_2\xef\xd2\xa4u.\xf0\x17\x1b\x0b\xbc\xce\xf4r\xbd\xf6\x16\r\xa0\xad j\xa9\x947\x84\xbf\xa1\x9f\xbd\x9c\xc7\x01A\x1dc\xcb%\x17\x9dx\x02\x1a\x8aG\xa7\xf1FGy\x9b\x1c\x02\x12\xcc\xbfQ\xda\xb4L\xecS\x9e~\x07\xc5f\x86W\x05\x11b\xaci7\x0e\xcf\xf0\x16 \xa9\xd0\x91\x1c\xdf]\r1[\x03\x87|\xc2\xc1%\x88m:\xb0\x85v.G8O\xbd\x98\x8cH\xbd.\x81\xf3\x8f\x1fV\xb5\x15\xfd\x07\xc7\xd8u\xfb??\xb9O5F\xea8\x88\x1fTB\x16)\xea\xcc\xe4R\xa4H\x0f_\x1c\xa5\xe1\x89\x03\x93\xaaC\xfa14\xf2\xf3\xfa\\m\xc6(*\x87\xe6KV\x13\x98\xe7;k\xb4\xbc\xf4\xd3J8\xd8\x92\x08\xf8\x02\xd1ZJ\x8e\xf94\\-0\x8b\x1b\xf0kLS4\xa2\x86unpu\xd9\x12\xa6i)\x94\x00\xa3/\xd0\xef#\xbd+=0xn\x86\xef\xc2\xe4\xd7\x0e%N\x89b\xb8\xb1X\xc4[\xb5\x84\xc3\xb3\x1b\xf1\xdd\xc2\x9d0CB\x85\xaeW\xf7\x9f\x83G&\xd9X\x9d\xec\x86\xe8Sm\x98\x04\xd2\xcd9\xa596\xabK\xd0\xe5W\x91-\x01\xf8#\xb7g\xc9\xaf\x80\xb3\x05\x1dW\xa2\xc2\x87\xe1\x81\xd9\'\xd1\xd9\x87,\xdfA\xda\x9f\xa2\x03\x8aG\x0cg\xd61\x85\xc9\xd9\x84#\t\xb3\x93\xfem\xf5\xec\x16T\xeb\xbeF\xd1\x8a\x03%\xd8!\x80\xa1D#`n\xf8o\xa5\xf1vHkS\xd7"\xa4\xe6l\x80P<\xa3\xdf\x14\xecV\xadr\xc5\xb6\x07\xc7\'~\x0c\xfe\x86\x1c\x89\xec\xd9\x9f\x04\xf3\x87-\xabGo\xba\xac\xd6\xf1\x94z\xc0U\xfb\xf4u\xc2F\xe3\xbe\x06T\xd6aU|\xc2\xd9\xc5\x1b\xb4\xb1\x08m~v\xe4D\x82\rc\xc2\xee\xba\x8bf\xb4\xbc;\xf6e\xef\xbdMr@ZF\xa7\x9d_jk\x98\xa25\xee\x9e\xd7\xb9\x04\xd9J\xe0\xd0\xf4\'\x8bo2\x86\xb6aK\xf3\x85L\xa8\xa24\n\xaa\xf7<\xcb\r\xbe\xa9\xef\x1e\xdd\xd3\xacz\x85\x93MK\xa8\x12N\xf1y\x81J\xcb\xbbzR\x94l,z\xe3H>}\xf8{\x8b\xe4%\x98a\xb05\xf4b4I\x8br\xdc\xbcm\xde\x7fp\x1eb\x08\xf1\xc9\xfdR\x16\xad\x05\x12\xba@\x89\x19\xcdO\xb4\xafJ\x01-,\xfc\xf2A\xe0\xf8\x00\xc8:g;\xa9\x96\x19\x01W\x08b\xdd\x86QIi\x18(_\xbe\xd1\x0b\xee\x02\xb4\r\xa0w\x12\xc7\xe7Wi\x82\x06F\x1frs\x9d\xb7}\x1c\xd0\x82I\x13\x15\xad\x0f\x8c\xecZ\xdf\x83\xde\xd3?\xe58\x151v\xb8\xd0ld\xc1\xc6\x80?\x90\x83\xa6\x83/\xaeq\x07\x02\xcdK\x89\xcf\xc9;\n\x03c\x17\x01\xae\r\x0e\x88\xb9\x8e\x85\xc2UR\xb4\xe3\xcf\xd5(\x95\x88\x8dL\n\xc2\x10PL\xc9\xf5[\t)\xe4\x9a\xf5F\xf9\xc6\xd0S\xe1\xc4Z\x18\xc0\r7\x8eB\xc8\xe7(X(SHOv(\xa0\x95K\xc7\xdc\x95\xdc\xed\xd2\x05\xe4\x9a!\x120UJXa\xe7\x12\x92\xe1g\x8a\x04\xab\xdd\xcag0o\xa5H\xe0\x17\xb4(#\x87i\x81=\xfb\x8b\x1d\x0f\xd6\xf6\x1e\x9a\x8eA\xa2\xaee\xc1k\xd8\xb81\x84\xce\x9b\xa7l\x06r\xf2\x81\xc2\x8f\x9a\x0e\xea~\x11\xfd\x0e\xfd\x1eb\x15\x1d\xe2\xeb6\x87IMo\x16\xf3\x1f\x84\x7f\x92\x11At\xc2\x0bQ\xf2T\x8a\xf0\xa4\xef\xd0\xa37\xf4r\xce\xe40\x84\xb3\xe3@\xb7\x87K\x94\x9cU\xdb\xecQb\xca\xee4_\xe7Os5\xb8\x0f\r\xf2\x8d\xd8\x0f\xae\x99~\x87$\x1aB\x99\xd1\x12\xbe\x07;\x82\xb5\xcf\xc0P\xd5<`\x04)S\xf7\xc5!\xd7<-\xee\xb7K\xf7^\n`\x04\x97\xbc\xa6:\xc1\xae\x1dP\x11\xe0\x12Xo\xc49D\x10\xf2\x8dGGX\xeb\x9a\xd2\x07\xb5\xa2(\xdb\xc6G\x87S\xad6\x81E\xfe\x8b\x1a\xe4\xbe\xe4i\x04\xa3Z\xb7$@|_\xb75x\x13\xdb\xe4H\x18\xe2W\xd7\xa0\x12\x85\x03JK\xf9\x06{\xea\x8f*\xa7v|*,$\xcc\xc5\x86\xad\xa6\xe6/\x9e\xd2\xfe\x84d>3\x890\x11\x90\xc2[G\xc6\x0fn\xc9\x0ct\x97\x15T\xbbO4h\xf5\xbc\x95\x08\xc5~\xbb\xca\x05\xf5\xda\xa9\xef\xd3\xd56\xf4jg\xcdp\x86L\xf1\x901\xef\xb1\xdb\x9e\xb6A\xc0\x1c\xe8\x8e<\xb5P3\xee\xd6Csj\x8db\x00\x98skC,\xd8X\xfd.S\x15\x8e\'\xccd\xcb\x1b\x90\xe1J09d\xb967\xca"\xdd\x83\x07Q\x83\xbe\xa7\r3\x8d$r}\xdfB\x17[\xc8\x06\x95\xe5\x13j\xbc\xba\x83A\x99Z\xa0C\xd8%\x8bl/\xb1\xd0\xb6E\xfbG\xd7\xfd\xe5\xdd\x88\xb1\xe0\x9f\x8e\xe2\x94Z\xf5\xe7\xa8\xb0\x857L\xf1\x05\xd0\xac\xf6!J\x18^\xef\xcd:\x8a8\xf9\xd7\xee\xde\x06SIx\xd2\x9efW\xd3`\xda\xab\x99\xcb\x17W\x1c\x8a"\x0b\xc7Y\xa2\x81\xc2\xf9\xe4s\x91QR\x92\xf9J\xa4k\\\xa0\x1a\x8e\xf9\xb1E\xdd\xae\xb9\xd0\x9eB-\x11\x8e\xaf\xc8\x8b\tcmAg\xec\xe5\x84<\xb1x\x17\x87A\x97&\xc23\xbc\xf7\x95\xe9\xb3\x91\xfc\x80\x97%bi\x83\xaf\x82fc\xd4\xed\x15\x9cRd\xad\xb8+jo\xbf G\xd3\x08T,\xc1|\xba\xb8\xee<\xf8Ngy$\x02\xff\x85\xf8\x01Z\x8d\x05\xa2\xe5ds)\x94]-T\xd8\xfaP\xdf\x1e\xc2\xdd\xc2\x9b\x03\x07\xf5\xc0&V\xca\x93\x8d\xe3#N\x9a\xc09\x8fU\xae\xa3\xb1r\x1eM]K.\x0b\x9b\x96\xcb\x17j\xab\xff\x1b\x9c[OD\x08\xf9\x1ay|Q\xd53C\xba\x16\x9eW\xa8\xd6\xa9}\xc936{\xf0\xac\x03\x86\x1e|m\xbf\xab*\x8c\x00s\x01\x17\xa4<\xedN\xd0\xf5=\xc6\xef\x05\xe1\xc0A\xf0x\xad\xe2\xa3\x01\x18i1\x00\xdajG\xc7j\xc8\x1a\x8aB\xb0w\r\x97\xd1<\xec)/z,\x13\xddq*UK\x8d\x0b\x1d\x0bxw\x85(\xc9\x85)C\xa5\xf8\xe1\x94\xb7\xa9\xed`\x9d\x96\xcd\xf7h\x11\xf5_3\xce\x03\xb3\x04\xa8C\xb4\xce\xb6\xd9S\xb5_\xb2\xcc\x1f6\x0f\xfel\x81.\x03Wp\xc4\x92\xe3;\xad\xd0D\xc4LfuN\xbe93n\xc46jqw\xecQ9\xf9;\xea\xfd"\xc6\x08\xc2\xf5\x97\xd5\xcc\x8c\xa0\xe9\xe6?\x0b\x94\xb2\x06\xcd\xbd&\xde\xe7\xf4`\xad\x06/\xd0\x16\x00\x18\xd2\xc2\xd4\x0b\xaf8\x0b\xfc\xe0\xe8\x83\xa9w\xd1\xe3jL\rW\x81\xec\xaa\xdaQX\xef+\\\x05\x16\x06\xfcQ2\xba"\xa7p\xb9a[\xe1mm\xdd\xb3\xbfl\xb1\x10g\xfb\x01q+\xd4\xff\x11\xfb\x01EwyE\xe5\x14\xbax\xdfZ\xeel\x18JL\x04\x90\xbe\x0e\r\x0b0z\x9cw\x89`~p\x88\x18\x9b.\xccz\xca&o\xfa.\x10^C\x10\xaa\x81\xc7\xbcGs_\xb7\xfa\xb1s\x16\x8c\xd1cB\x0f\x12\x16\xa2\x923ORz\x0eR\xee\x12\nN\xe8\x06\x07#\xcc8k\x10\xce\xa1\xfb\xd4pM<\xc7\xb3\xfcx\xf5^Q\'<\xa6#=$\x0c\xc05J\x05\xe6\xed\x96\xb2 \x1b1\xd9\xc2\x9c{\xa6\x8fm\xec)j\x16\xd8\x87\x94\xa8\xfbN<\xa1\x05\xb02\t\xb3X\xe3\xec\x8c\xaf\x82\xe0\xaav\x97\x90\x98\xa3nI\x03\xf0\x81?\x1bRMm\x99\xaa\x1e\xcb\xdc\x9f!\xb4\xba)7\x18\xdc\x0c\x98\xe0^\x8f\x8b\xdd0\x9f\'efHKs\xf2f\xa9\xbbs\xdckz-\xfb\xf4\x87\xfe\xb2\xea\xe9\xcc\x15\xac\xf3\xb6\xdc\xf1\xa1\xc6D\xa7\xc1}D\xf4\xaf\x0e0|\x81\r\x03(\xbc_\xb9~\xfc\xab\xf7}\x19\xfa\xc9\xceo\x8d\xf1\xf33\xd9&`\xa9A\x00@\xc8m\xfa\xcb\x85\xd0g\x1c\x07\xd1jD\x8fx\xafPh\xad/c\xfe1\x9a%\x08\xc5\x93)\x16X\x16\x11CKf\xc9\xf6\xa1\xc7\xab\x1b\x1cG\x9aFFT\x95\x17\xfa\x13\x96\xdc\xd3P\xe7m:_FWC(\xf4\xc0>\xfcl\xfd\xf6\xfc\xc0\xf4\xe7\xc0\xa6.\x9c\x07\xca\x93\x80\xd2\xde\x7f<\xe4\xf1\x03\x99%\xe7\xae\xd3\xf7m\xf4!g\xf9\xc4>\x1f\x1f\x13,\xb7r\xc6\xb2\x9c\x0fbS\xa6M\x8e.\x87\xab\xa8\xa1\xae\x00\x06\x11\xeaeQ\xc1\x87X\xd9\\h\x00:\x03\xd9\xee6\xa4^\x8c^\x8c\x98\x83\x91\xb5)\x99\x1b7%\xdc\x83-\x18$\xd56\x81\xee\xb2\x99\x15\xd5Pj\x8a\x91\xe4\xe7\x005\xa1\xac\xd2B\x0cB\xe6!L\x9d\x80?>\xc5\xa9\x85=\x10*\x13l\x16\xa77l\x8f\xb3\x99r\xc9\xf3\xcc\xb2r`\xe5\xe6\xf8f:!\xc5\xcc&XyT\xfd\xe0\xc2X\xaf\xc7I\xee\xd5\x0c8\xda\xf5\xbd\xee\xdf7\xa6\xa4\xdc4\x9d\xa6\xcc\x99\xfeZ3k\r\xdf\xeb\xe6\x86\x91\xef\x1f\xc7\xc4\x8f-%\nrw\xbb\xec\xea"\xb9\xe6@\xa2<\xf4\'T\x89\x98`\x9f\xec\x1b\x8e\xd1\xdd\xae\x82\xd0D&\xb9B\xa2A]\xd2Q=?\x8de\x18\x04\x15\x88\xe0\x06\xe3\x8f\xc6\xd4ex5\xa5F\xa7\x07\x1d\xceX\xbc\xb7\xe7\x95\xd0\xf8\x981\xf4\xf5Gi\xd6\x06\xe2\xb6\x12\x1c\xffTg\xec\x00\x18\x83\x95Yq\x9b\xb3\x8d\xe7\x1bU\xe4\xe3X\xcb\x9f\x12\xb1\xd8\x8cV\x8b\xbb\x0euT\xa2uKs\x0cEa\x04\xd0\xdfL\xc4rB\xf9\xe0\xa8\xfd\x18\xdd\xd0[\xba\xd2,\xb6;\x92\x07U\xee\x80\x1c\xd99\xd4|\xc4\x12K\xca\x1dI\xb3\x99U\x8d\x81`0I^;\x88\xa6e\'1p=@\x92\xda\xc9\xd1b\x0e\xec\xfa\xd3\x87W\xee\x03\x82\x11{~\xd1Yt\x88\xe7w#\x07\xd4\xe6\xe5\x92S\xadq df\xa5\xfa\x9e\xde\x13\xfd\xea\xe1(\xed\xb0\xb5\xef \xb6=\x8e\x86\x8b\x9b"\x8cF\xcc\xba\xb3F\xd9\\5\xff\x0euZF\x87|\xf3=~;\xfc\x89\x11.y^\x05\xbb\xd16\xb0~\x81\xfch6\x9a2\xf2\xc6\xcc9\xfc\xef\xb6E\x9e\x851\xbf,\x1f\xe1\xf2\xb7=\xcc\xd1p\xdaK\xcah\x91\xb6a\x84\xd7\xc7\xae\x1c\x89\xa7\xc6\xe2\xbe.\xb1\x19\x92\xc5\x18\xc1\x9a)3-\xbdX\xd8?\xe1\x11\xde<{\x8as\xe7B\x9eC+\x1b\n\x11"\xba\xd82\x85\x87\xd7r\xb3O\x85C\xecO\x80M\xd4\xac\xce\xa3`\x89\x08B\xeb\x81\x11\xd8\x134\xcf\xb6\xd5\x9d9\xb8D\xca\xa0\x16S\x18\xcd;\x8e\x99\x7f\x92_Y\x0bK\x99\xa6\xd6\x83\x8ac\x18\r\x83G\x8bH\x7f\xe6\xd2\xab\xdf\xd2#\xb4\x1c*\x7f\xa1\xdd\x05\x1d\xb7Z\x1e\x8fht\x05Q_\x1b\xad\xc2p\',b\xdc\x16\x86\x04\xa5\x86\xe3b\xda\xc4\xb4\xb1R\x8f\x9a\x15\xb5W\xd4q\xcc\xd6\xc5j$ \xb7F\xfd\x81\xcc\x9a\x9d\xa6\x1e\x88\xb2J\x15\xae\x12a{\x88(\x05\x9dx\x0cS+\xaf&axa\xfb\x91t\x1a\x1d\xdd\xf6,E\xfdS\x1eJ{\xa8\xc6\x02\xba\xf9\xed\xaf\x8bi3\xa3G\x03\x98$\x92\xb7\xad\x1dh.\xbc\xddc\xe8@\xfd\xa79K\xbd\xed\xd3\x7f\r\xbe\xef62\xc7\xe4:F\x05|\x80\xdb\x9b\xa3\x1c\xbfF\x01\x1fa\xccY\x90\x1d\x13\xa9\xf8\xe2\x82u\xb9\xd0\x05\x05\xc5\xc5\t\xfc\x9ah)N\x94E\xb0\x05\xd9H_\xd5\x94v\xbf\x94[\x9f\xa6\xd6J9\x17\xc4\xe9\x89\x18\xcb\x11\x0b\xe0\xa54\xfb\xd35c\x98\x87@\x87\xc1N\xf3?t\x1ay\xf8\x82\xa5,\xafAT\xaa\xd0\xca\xb1\xdfY\x18n\xd4 \xad#\x96zc\xc8\xd4\x8br\r\xcc\xa7\x9d\'\xad\x1c_nO\x01\x8a\x11\xb6=\xdfvvuv8\xefs\x9e5pO\x83ZF\xb4U)s7\xf9mo\xfbb\xe0k\xa5kK\x80&S\xa6\x8b\n\xea\x06[\x9c\xf8\xe9\xf1\x88\xe2\x07\xa8\xb9\xc0oc\x1f\n\x07F\xc8Q\xccfGR\xb9\x9a.\xb2\xb2\xbd-\x8b\x136\x92\x1d\x9ao\xf3\x14\xed\xc0U\xd8\xd5F\xb8|=*u\xea\xaf*\n\x87\x92\x8c\xdd`\xb7\x17N\xabE\xc8\xf2\xe5Y\x89\x0cS\xe5\xd2hy:\x002\x9e\xac #v\xae<bLP \n\x92\xb4m\xf9\xf7\xfeT\xd1\x12/\xdb\xb0\xffn\xd5\xb0\xfbeY\xf2\x82\r\xdc\xa0q\xfe\xbdI\x17\xcb\xcd\x95\xb0y\x94=X\x11\x14\xcc\x89\x19\xa6\xc9M\xf0\xcbhj\x85p\x8e\xb8h`FybP\x88}\xf9\x14V#\xa2)\xf6"\x08L\x80rfZ#\xba8\xc6\xc1<e\xf9\x8bET\x92\x168LB\xaa\x81\xc8r\xde\xb1-\xde\xe8\xab\xaa\x80\xcd\x91\xb0\xe9"\xc0\x16T<I\xc8\x05\x7f\xf1o \xe5i\xe9\xde\xf6\x1de\x83\xaa\x8d&\x89\xf3?e\x16\x95\x1c4\xf7\xe0\x1b\xa9g9Hy\xc2^\xa8\xe9\xa6\xe3&\xb3@D>d\x89\xfa{\xa0\xb1\xf9;\xc9\x17\xfe\xa4\x02\xa1M\xb2\xaa0\xa66OqH}E\xa0\xd1~cuS\xd5C\x9c6\xa1\x84\xc4\xef\xdb\xd2\x85\x94u\x1f"C\xe7\'?\t\x9f\x97\xbfd\xdf\x92\xb8T\x05\t"\x93b\x1a\xe5I\xf6\xd1:\t\x06nSM\xec\x9c3\xb3\xaa{\x98\xd2\xa8\x14\x9d8J(\xda\xe8\x12\xb32\x0c\xef\x87g\xd0\xa9\xe6\xa1\xd7\xaf\xdf\xeb\xb9\x92MR\xe3\xbd"\xf5\xe18\x86\xbb\xeb\xe2\x176@\x0e\x8d\x96\xb4\x02\x0b[Eu\xf2\x07t\xae\x12 u%n\xf6\x99\xfaY\xac\x0b\xca\xb6\xb7\xea\xcd\xc3\xace\xa8\xf9|\x8f\xa0\x9e\x1a\x9d\x08\x9bU\xb3\x86\x88;\xd2\xb6s\x99\xb11\x04\xaa|"\x08\xcf\xd6\xe8\xd9f\x1eh,{\xd2T\xea\x0eG\xf5\xf7\x9d\xaa\x01b\xd8\x98aU<\xff\xach\xa6\x0c\xc2p\x12D|\xc6\xb8\xe6W\x1b\x87\x81\xe8`\x7f\xb5~\x08\xdb\x8e.aZq\xd7\xa2\xa4\x04}\xde7\xff\xd4\x8c(\x17\xdc\xc3\xdbte\xfa\xb3+\xe3.\xcb3<5\xff\xed4\xb7\xe0\x9d\xb2\xb8\xba\x87e\x86\xf8\xa6\xbc\x02up\xe3OfB4\xd3p1\xce\xd0&\xce\xe2\xfc\xbd3\xb8p\xd5\x1ev\xfc\x190n@\r!\x8c\x96mD\xad\xaf\xbf\xc5\xd1\x82\xa4\xbe$\xfb\xbb\xf0fsJ\x82s\x16\xa7B\x8e\xa1V\xe0\x96\x94=5\xde\xa0\x02\x14x\xb2Kr\xec\xec\x8b\xcd!\x1f\x0c\xa8<]\xe5\x88\xc6(\xe2\x0f\xedg\xca\xf4Qi\xf4\n\x037&\x8a\x08Q\x18\x0b\xc5\x01\xd3\xc3\xeaQ')
|
4
|
-
|
1
|
+
from sqlalchemy_serializer import SerializerMixin
|
2
|
+
from flask import Flask
|
3
|
+
from flask_sqlalchemy import SQLAlchemy
|
4
|
+
from flask_admin import Admin
|
5
|
+
from flask_admin.contrib.sqla import ModelView
|
6
|
+
from wtforms import SelectMultipleField
|
7
|
+
|
8
|
+
from sqlalchemy.orm import backref
|
9
|
+
|
10
|
+
from flask import Markup
|
11
|
+
from dateutil import relativedelta
|
12
|
+
from hiddifypanel.panel.database import db
|
13
|
+
import enum
|
14
|
+
import datetime
|
15
|
+
import uuid as uuid_mod
|
16
|
+
from enum import auto
|
17
|
+
from strenum import StrEnum
|
18
|
+
from hiddifypanel import Events
|
19
|
+
|
20
|
+
from .config_enum import ConfigEnum,ConfigCategory
|
21
|
+
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
class BoolConfig(db.Model, SerializerMixin):
|
26
|
+
child_id= db.Column(db.Integer,db.ForeignKey('child.id'), primary_key=True,default=0)
|
27
|
+
# category = db.Column(db.String(128), primary_key=True)
|
28
|
+
key = db.Column(db.Enum(ConfigEnum), primary_key=True)
|
29
|
+
value = db.Column(db.Boolean)
|
30
|
+
|
31
|
+
|
32
|
+
class StrConfig(db.Model, SerializerMixin):
|
33
|
+
child_id= db.Column(db.Integer, db.ForeignKey('child.id'), primary_key=True,default=0)
|
34
|
+
# category = db.Column(db.String(128), primary_key=True)
|
35
|
+
key = db.Column(db.Enum(ConfigEnum), primary_key=True, default=ConfigEnum.admin_secret)
|
36
|
+
value = db.Column(db.String(2048))
|
37
|
+
|
38
|
+
|
39
|
+
|
40
|
+
def hconfig(key: ConfigEnum,child_id=0):
|
41
|
+
value=None
|
42
|
+
try:
|
43
|
+
str_conf = StrConfig.query.filter(StrConfig.key == key, StrConfig.child_id==child_id).first()
|
44
|
+
if str_conf:
|
45
|
+
value= str_conf.value
|
46
|
+
else:
|
47
|
+
bool_conf = BoolConfig.query.filter(BoolConfig.key == key, BoolConfig.child_id==child_id).first()
|
48
|
+
if bool_conf:
|
49
|
+
value= bool_conf.value
|
50
|
+
else:
|
51
|
+
# if key == ConfigEnum.ssfaketls_fakedomain:
|
52
|
+
# return hdomain(DomainType.ss_faketls)
|
53
|
+
# if key == ConfigEnum.telegram_fakedomain:
|
54
|
+
# return hdomain(DomainType.telegram_faketls)
|
55
|
+
# if key == ConfigEnum.fake_cdn_domain:
|
56
|
+
# return hdomain(DomainType.fake_cdn)
|
57
|
+
print(f'{key} not found ')
|
58
|
+
except:
|
59
|
+
print(f'{key} error!')
|
60
|
+
raise
|
61
|
+
|
62
|
+
return value
|
63
|
+
|
64
|
+
|
65
|
+
def set_hconfig(key: ConfigEnum,value,child_id=0,commit=True):
|
66
|
+
|
67
|
+
if key.type()==bool:
|
68
|
+
dbconf = BoolConfig.query.filter(BoolConfig.key == key, BoolConfig.child_id==child_id).first()
|
69
|
+
if not dbconf:
|
70
|
+
dbconf=BoolConfig(key=key,value=value,child_id=child_id)
|
71
|
+
db.session.add(dbconf)
|
72
|
+
else:
|
73
|
+
dbconf = StrConfig.query.filter(StrConfig.key == key, StrConfig.child_id==child_id).first()
|
74
|
+
if not dbconf:
|
75
|
+
dbconf=StrConfig(key=key,value=value,child_id=child_id)
|
76
|
+
db.session.add(dbconf)
|
77
|
+
old_v=dbconf.value
|
78
|
+
dbconf.value=value
|
79
|
+
Events.config_changed.notify(conf=dbconf,old_value=old_v)
|
80
|
+
if commit:
|
81
|
+
db.session.commit()
|
82
|
+
|
83
|
+
|
84
|
+
def get_hconfigs(child_id=0):
|
85
|
+
return {**{u.key: u.value for u in BoolConfig.query.filter(BoolConfig.child_id==child_id).all()},
|
86
|
+
**{u.key: u.value for u in StrConfig.query.filter(StrConfig.child_id==child_id).all()},
|
87
|
+
# ConfigEnum.telegram_fakedomain:hdomain(DomainType.telegram_faketls),
|
88
|
+
# ConfigEnum.ssfaketls_fakedomain:hdomain(DomainType.ss_faketls),
|
89
|
+
# ConfigEnum.fake_cdn_domain:hdomain(DomainType.fake_cdn)
|
90
|
+
}
|
91
|
+
|
92
|
+
|
93
|
+
|
94
|
+
def add_or_update_config(commit=True,child_id=0,override_unique_id=True,**config):
|
95
|
+
print(config)
|
96
|
+
c = config['key']
|
97
|
+
ckey = ConfigEnum(c)
|
98
|
+
if c == ConfigEnum.unique_id and not override_unique_id:
|
99
|
+
return
|
100
|
+
|
101
|
+
v = str(config['value']).lower() == "true" if ckey.type()==bool else config['value']
|
102
|
+
if ckey in [ConfigEnum.db_version]:
|
103
|
+
return
|
104
|
+
set_hconfig(ckey, v,child_id,commit=commit)
|
105
|
+
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
106
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|