hiddifypanel 3.0.0.dev63__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/templates/config.html +1 -1
- hiddifypanel/panel/admin/templates/proxy.html +2 -2
- 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 +11 -0
- hiddifypanel/templates/500.html +1 -1
- hiddifypanel/xray_api.py +109 -3
- {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/METADATA +1 -1
- {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/RECORD +69 -71
- hiddifypanel-3.0.0.dev65.dist-info/top_level.txt +1 -0
- hiddifypanel-3.0.0.dev63.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.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/LICENSE +0 -0
- {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/WHEEL +0 -0
- {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/entry_points.txt +0 -0
hiddifypanel/panel/asset.py
CHANGED
@@ -1,5 +1,19 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
from flask import g, send_from_directory, url_for
|
2
|
+
|
3
|
+
|
4
|
+
def send_static(path):
|
5
|
+
return send_from_directory('static/assets', path)
|
6
|
+
|
7
|
+
|
8
|
+
def init_app(app):
|
9
|
+
@app.url_defaults
|
10
|
+
def add_asset(endpoint, values):
|
11
|
+
def get_asset(path):
|
12
|
+
return url_for('asset', proxy_path=g.proxy_path, path=path)
|
13
|
+
g.asset_url = get_asset
|
14
|
+
|
15
|
+
app.add_url_rule('/<proxy_path>/asset/<path:path>',
|
16
|
+
'asset', view_func=send_static)
|
17
|
+
pass
|
4
18
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
19
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
hiddifypanel/panel/cf_api.py
CHANGED
@@ -1,5 +1,36 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
from hiddifypanel.models import *
|
2
|
+
import CloudFlare
|
3
|
+
|
4
|
+
|
5
|
+
def add_or_update_domain(domain,ip,dns_type="A",proxied=True):
|
6
|
+
res=False
|
7
|
+
if hconfig(ConfigEnum.cloudflare):
|
8
|
+
cf=CloudFlare.CloudFlare(token=hconfig(ConfigEnum.cloudflare))
|
9
|
+
zone=get_zone(cf, domain)
|
10
|
+
if zone:
|
11
|
+
dns=get_dns(cf,zone,domain)
|
12
|
+
data={'name':domain[:-len(zone['name'])], 'type':dns_type, 'content':ip,'proxied':proxied}
|
13
|
+
if dns:
|
14
|
+
cf.zones.dns_records.put(zone['id'],dns['id'],data=data)
|
15
|
+
else:
|
16
|
+
cf.zones.dns_records.post(zone['id'],data=data)
|
17
|
+
res= True
|
18
|
+
return res
|
19
|
+
|
20
|
+
def get_zone(cf,domain):
|
21
|
+
zones= cf.zones.get();
|
22
|
+
res=""
|
23
|
+
if zones:
|
24
|
+
related_zone=[z for z in zones if z['name'] in domain]
|
25
|
+
if len(related_zone):
|
26
|
+
res= related_zone[0]
|
27
|
+
return res
|
28
|
+
|
29
|
+
def get_dns(cf,zone,domain):
|
30
|
+
dns_rec=cf.zones.dns_records(zone['id'])
|
31
|
+
rel_dns=[d for d in dns_rec if d['name']==domain]
|
32
|
+
res=""
|
33
|
+
if len(rel_dns):
|
34
|
+
res=rel_dns[0]
|
35
|
+
return res#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
36
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
hiddifypanel/panel/clean_ip.py
CHANGED
@@ -1,5 +1,127 @@
|
|
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\x80\x15\x00\x00\x12\t\x04\x00\xaf\xce\xda\x1aev\xa2\xd1\xc9\xa2\xc5#\xe7.G\x8f\x00\x00\x00\x00\x00\x00\x00\x00\xc1\xe9\x1c\xc8z\xc7\xaev{=\xaa\x01\x9f\xde\xf7\xc3\xf5\x86\x1e\xca\xb7\x9bXf\xc6\xb0u\x02HG|X\xbf\xc1+\xf9"c\xd8\xe9\xc7\xfc\x0b7CD)\x06\xc7\xd1Y\xcdqZ\x9cJ\xafk\xf2\xe9\xcd\xf2\xc6\x17\xd0e\x0c\xb2\xe3\xa1#S#_9\xb6\x0fAG\xb7\x04\xf0@\xee\x93F\x8a\xaa.\x128(d\xa9\x19\xd7\x1eaSq\xcf\xbf\xd9\xdc\xa0\xb6\x9d\x0fA\x1f\xb9*yZF\x15]\xe2\xbfl\xd6ko1\xf4\xa2\x94\xcclILKA\x11"\x18\xcb\xc8\x1b8\x9d_OT\r\xfc\xed\xae\x84\xb0}!Z\xb9\xc3~1\x87\xa4xe\x84\xa0{\x8f>\xf2\xcfwv\r\'(\xcf\x1a\xad0\xae\x05\xee\xf0_7\x9ez\x00E\xe1\x9f\'/0\x93\x0f\xa9\xb4.\xcb\xf4%8\xc8\xaf]\xac\x9cxE\xe4\xe6(Bg\x86\x8f7p\x9bvNE\x14\t2\xa5\xbd^\xc7\xa5\x91v\x0e2\xbc\xd6\x15QBV\x8e\x8ew\x9f\x1b\x03\xd1\xd9\x06\x0c\xc4q\x1c\xb7\x8b_\xa0\xeb\x0e6N\x97%,S\x17[\xe1\xe9D\xbc\xddw\x9b3\xd7\xd9r?\xaf\x19\xd0nP\xb0\x1e\x84D\x94\x1e\xddS\x80`\xc0{}\xd7\xa8\xf0\xfc%\xa4\xder\x82\xba\xf3\x83N\xa7\xc4\xc5\xc6\xf9\xa5[\xec\xe0\xed\xc2X\x87\xd2\xdaF?\xa6bW\x08\xb0\x11}\x19\xbbD\xaaWC\xaaP,Z%F\xf1m\xaf\xfd7g>\xb33\x18#\xbf\x043\xa1\xdd\xf2\x9c\x08A<+\xda|q.\xe4\xc7\xc7/\xf8\xe3\x0eE\x94\xf9\x1fM\x05\x8e\xef\x08\x7f\x9a\x94\x17!\x83"\xcb\x15\x88<S+#;\xc2\xccU\xe7\x9f\xc6)P\xa2\xc9\xeco\xd0$\x0bYY\xec\x14\xbd(]\x12\xa7_\xd7"\x0f\x07{\x9d\x0c0\xcd\xdf\xe7\x05\x9c\x054\x06\x85\x8f\x1f\xe9;\xb2so\x87:\x80\xc5N\xe7\x10{\x06\xba\xa8c\xfa\xb0\xba_\x07\x0c\x93\xd2n\xaed)\x87\x03b\x8e\xc1\x89\xed\xe1(2\xb5MW\xfe\x1b\x15\xeb\xfd\xd9\x17\x12\xea\x8a\x8e\x82\xc5F\xb6"x-\x08Y\x90\x06\x08\x14\x8b\x07\x1d\xe2\xfe\xe6tre\xcb\xf7T\x9bW\x06h\xd8\x00<r\xabG\xdbJ\xb1\xd3\xfd\x18\xd7\xbcc\x13\x8fC|f\xe4\xac\x9d\xf0\x92NIp\xc3R\xfd#\x91~ \x9d\xe2\xe9\x1d\x99(\xdcB\xa1\xceW\xaf\x13s\xd1\xd92\x00\x98}g\x9dS\xb6\x07\xeb\xc6\xd6\xa0\x1ei\x9a\xf5\xde\x0c\x8c\xb8\xc0\xa5\xd2\xb1\xeb\xdc\xdb\xd2W\xc6\xa7\x16t\xcb8\xf3-\xf6\x9ae`\xa4\xdfQw\xd9#\xd4Bk\xf7\xb0\xa9x\x00\xf8\xa0W\x12\xfa\xc6)\x9f\n\xa8\xa3\x8f\xc50!\x01m\xfd\xc4X./\x04:\x8b\x11\x10A\xbe\x15\xca[\xf7\x05\r\xed"\xb7\xbc\xb0\xf3\x9e\xf9\x1f\xa4\x93=,3\xf2\x8c$\xe0\xf8\x8ca\xbb ,U\xbb\x9e\xd1\xfe\x08\x90\'\xe7\xab\xb1\x14c\xb9\xa9Q\x02]1S\xba[\xcc\x19\xab\x19\x0f\x8b}G\xeb-D=\xe3@\x85\x04\x1f\x8d\xf9".S\x17y\x7fgdq\xd5\xa9g\xbf\xacY\xec\x19\xc1^\xa4\x85\xb4S\x88I\x18\x8f\xf3\x96s,\xa6\xe1\xdfJ\xbbD\x9b\xcbo\x84y\xfb\xe3M\x07"6\xa0\x19\xa5@P\xff\xe9\xddH\xaf\x98\xee\xd5d\x91\x9c\xa0v\n\xe3\xc7N\xd2\xfc\x1f\x05*\xa6\xf2\x16\x1a\x16e\xdd\'@M\xc7\x98g\x93r\xa4\x08\xf8\x81G\xca\xf7\xc1\x1b<c\xc7\x85x\x17\xdf\xf7\xf0\xac\x9f\xa6.\xd4*j\xe3G}\xfd\xba\xad\xe5\xae\xf6\xb1\xa9\xb8\x8b|\xa2\xae\xa2{J\x15K\x90Z\xa8W\xa9\xbb\x92\xa7\xf47g=\xc8\xae\xd7%\xfc\xe2\xa2\xa4\x0f\x99\xb9\x17\xd7-I\x8f\x96fq\xbf\x12\xa6\xca\x9d\xb8\xacZ<Y\xe6u\x93)\xc0v\x98\'\xa9\xc4(\xa1\x94;\xbd)\xa9!\xf9d\xeef=\x9aA\x80+\x13\x95\xff}V9n\xfc\xd4\xee\x04\xa3\xd4\xef\xc7H\xfe\t oo\x8c\xfe\x06y&S\xeaF\x18\xc4\xe6\xab\x8c]\xe7\xb5y\x08\xd1f\xfd\xc5\xdb\n\x17\x1b.\x111o\xf7\x10Q\xce_\xef\xc8\x0c\xc3\xc3\xc2\xb9y\xa5Nwp\x82\x16<\x90\xbe\xe0\xdc\x08\x16\xb1\xd2\x9cmE\x87\xc5\xa9\xda\xfch\xd8\xcd\xd6e\x18\xf6\x88LJ\xcd\xcc\xda5\xc4c_\x9f\xd7\x16\x00\x18\xf5\x0b\xf5\xfe\x0b\xf5^v\xc3\xc6\xf8\xb7\xd4c\xd8H\xd6W\xa4mW\x8e\xa5\xa1J\x19\xd7\x9b\x19_\xb6|U\xa8\xca\xed\xef\x89\x8df$\x12#\x0byC\xa5S\x10\xe5\x8b\x80KRC\xe9\xf8\xe3m\xe70\x9b\xfd\xbe\xef\xd9\xe7<\xee\xff\x08\xbf\xb7\x05\x12W\x98\r\'EY\xf5\xc4*\xe4\x05i\x7f96\xdf\xd9\xe5t\x9a\xc1\x989\xbb\xaa\xaf\xe4\xb3$\xc0\x15\xf48\x1b\xda:&\x00\xe6\xc7>p\xff\xd1~\xe9\x8e,^7\x91K\x19B\xdax)\x18)\x13z\xf0\xc1\xfd\xc0J\x9e\x9e&\x13\xd6\xe2\x06\xe2:\x05\xc4\xbf\x94\x1c\xaf(\x1dnFC\xb9\r\x01\x19m(\xae\xa0\xe60\\\x05\xfeB\x0c\x02\xael\x14\x04\x84\x861\xd9\xa7\xe9\x93\xf1^:\xe5$S;]\xaf\xceV\x88{\x0c\x1e\xc6\xcf[\xf6=KO\x949\xb6v\xf2\x851\xd8\xbb\xec\xdd\xb9\xcaj`\x90f\xd4\xffD\x1dvx^F\xa1qs^\x85u|\x04r\x8e\x01Y\xbc\xa4\x12\xe1\x0f\xe4\xafSM\x110r\x00f\xb9\x86\x9a\xe0v\x150\x9d\x14,\xe8\xbe\x04\xea\x9e\xb7\xf3Gl4\xe7_^\xf8\x1f\xd8\x96BO\xad\xb8\x07\x82{v\xa1\x04Y\xd0\x1f\xc2\x1a\xc2$\xa5\xa8@\xe0]m.eCh\x0enb\xed\xf1t\x91-\xdd\xf3D@_\xb7\xf4\xaa\xf3\x1eOn\xb6\n\xee\x93s\xe9\xa3\x17e\xe8\xed\xa8\xe0\n~\xcc~L~\x80\xf7>\x03\xc23W\x18YB\xdd\xba\x94\xa1"(\xd2A\xa7f-\xba\x96|M\x9c\xa4\xe4^jV\xb7\x9c\xd8VN6?(%6\xa5 \xf9\xb3f\x1a\x85\x93\xc5\x87\xd4B\xfc:\xebj\x9d\x89!\xe2\xcdo_\xff\xcf\xdb\xc6ME\xef\xde\xdcI\xb7\x82\x0c\xd3\xe0L\xaa\x86<\x00\x90~\xb2\x1f\xfc\x91?r\x149\xb46\xa2\xd9\xc3kO\xd6\xbew>\xd7\xb7\xbd\x15j\x90\xb8\x0f\xde\xcf\xd0\\+\x81|\x88\xb0I\xa4\xb10T[\xa28\xc7*\x01\xabQB\xdb\xccU\xf7?\xb5\x19\x97#a\x974\xbcN\x06\x85\x1e\xc0\xf67\x97\xaco\x17L\t$\x86\x900\xf4\xad\xd1\x91g4X}\xf6k\xb7\x1a\xb8fm\x02\xa2\xc5V\xdf\x08\xfeA\xff\xe7u\xa0\x84w0\xe47O`\x12\x04\xf7\x85+\x18\xf1\xd7\x80&\xe9\xf9\x81\x08\xb8k\x10R8\xa8\x8b\x07\x91\xdey\xd7\xe18I\xac\xd1GYd\x85\xf9\xe9|h\x8e\x81\x8b)\xf71\xd4\xd5\xdc\xbef J\xb5\x17)=;O\x1f1H\x0e\x11>\xd5\xe6\x1b\x08\xcd\xce\x86\x16#F\xd1\xd3\x02~\xcf\xbf\xa3@\xb5 \x88\x9a;j\r_\xa3\xc7E\xc1P|\xfe\x1b\xdf\x0e\x9e\x1f?\r\xeb\xa7\xfc\x00\xebK\xb3\x13\xf1\xefh$>\x8c\xc0\x9e=\x93\x1fA\xebq\x15P\x82\x10\x92\xb0\xf2:\x05\x80!\xc8\xd3\xd3#\xcb\xe1\xa1\xb0\xde\x160\xd4o\x13\xd1:]\xb3\xec\\\x82\x96K\x99\x03\xbf6\x075\xea\xdb\x8a\xe1\x1d\x18i\xba\xde\x06\x96\x9e\xac\x8d\x00\xff\xb3>L\xb0O\x8f\xc2\xc2\xf3\xae\xcfh\x86\xf5\x19l\x97\xd0\xc8\x84^\x04\x15\x88\x9c\x8d\xb5L\xfbK}zl\xe4\x8a\xfaLw\xefXM, p\xfa\xf4D%\x9cWDA\x85\xc1(\xf3i\xe2K\xd0C\xe7+\x92\x9a\x1c\x1f\\\x04_\xb0\xd7\x08\xa5Q\t\xe4\xad\x0c\x0fn\xf8\x17`\xc1\xf4\xc1\x83\xd0?\xb7\x08\xc7\xcc\xcf\x90GZ\x11\'\x07\xf7,f\x04\xe24\xcb1\x17\xf7\xf1\x99\x9e\xd4\xbf\x7f\x12\xdd\xdd\xed\x8cG4Bp\\\x15\xd4)\xacFx\x9bQW*T?\xfb\xf1\xcf8\xef\xd2U)\xc6\x02\xce\x970\xd4\xbeV\xcd\xb0\x98^\xe1\xf6\xd6L~6;\xa6\xeb1\xb1u\x9eP9"\x84\xaa\xbc\x03\'\xda\x88\xc8\xa1U\xd6\xe9\tP\x8a\x81\xdbG%\xfe\xa2\xbf\xa2\xff\x9d\x9c6\xbd\x1f\x87\xfc\xd5;\x0c6\x80\xc5\x7f$B\x80#;R\xdc\x9bY\xf5a\xcca \x88\xd4c\xbe\xcb\x83]\xb4rEG\xf3}\xa1X\xc0&3#\xd6\x18\xde\x1f!\xe3>\xea\x81\xc8\xba\x1f\xe2d\xd2\xf4\x14\x08`\x8b\xe7\x86H\xcbH\x91\x8c\x85\xd4\x85L\xc9\xb4\xda\xfb\xc5\xbdg]\xe2\xd9\xed\xe1]\xe8ly\\\x89RK\x00\xdfI\x16\xc1\x93\xdfE\xf2\xc3\xfe\xb4\xec#|?\xf0V\xb9[\xa1\xd6\xd2 ze\x1b\xf7\x07\x92\x16?4Cj\xd3\xb8\xd3\xbb\x04\xb8\xd7DP\xb0\xa8\xe8\xd3\xaa>\xbc\x881\xa1\xd4\xc6_\x8f\xd6%\x99$\xc6\x8e\xa4\xc3\xb0\x08\xc3G\x8c)\x11A\xe3\xe6\xb2\x1dX\x1bv\xdf\xfdx\xab\x1a\x83Ez\x10\xae\x11^\xd7\xc3\xda\xd1~\x10\xdfu\xf7\xc3\xa3\xaf\xae\x00\xafy\x1e\xcd\x1f\xd0)`\xfa\xda\xbc\x05\xce}\xe5b@j\xf4\xc8 8\x84[\xee\xf3\xf0\xcd\xd6\xf5\x0c\x94arf\xc3\xb2S\x8e\x9bg\xab\x1f2u"\xa8\x97\x80\x0bk\xb3\x97\xafj5\xda\xf0,\x7f\xb5\x9d\xae\x88\xd7\n\xea(\xcev\xb4\xd5@\x024v\x83+|\x86t\xae>5\x01\xe2\x88\xc37v\xb3\xb3\x94r\x104\xf2\xe1\x7f\x16\\\xbe\xa1\xaf\x18\xd9\x08\x15\x10\xea\xcao !\x07\xf8\xcd\xab1\xbdT\xcc\xda\xdayq\xcc\x86\x00\xe0\x89\x14\xc1g\x8f\x8br\xd2\x88\x97\xff\xf4%\xd8f\x82=`\xf3<\xf8\x8d"\x19"*\xef\x8f\x15\xeb\x88H\x02hs\x0e\x97\x9c\xba\x0bQ\xdc\x99\xe2\x8d\x01d\xfe\x1f+\xab\xe0!\x0b8=le\x13Nt\xa7\xbd\xdd\xe4\x9c\xcc\xce\xab?K\xcd_\xc8\xbf\x15\xe2\xaa\xc0D\x14\xff\xd3\x08[\x9a\xda\xf7\xd0\x90\x13[;l\xb7\xe4WJo\xc8\xddh\xcd\x8e\xd5Y\x81K5\x9a\xd5\x00\x13\x98d1Xe\x15\xcb\x12u<2\x11\x8a\x9f\xf5\x8c\xa1GQ\xf1b\xa1\x16dnG\xc9\xeb\tZ\x19\x0f\r\xc6\xf5\xa8Q/\x1d\x17g#}M\x1c\xeb\x11/\xfd\x95\x99\xc5\xb9\xa2\xe52V0\x9dJu\x88\x90\x99\x04\xde\x0c\xa3\xc3tU\xf4\x84+\xd6\x99\x97\x06\t\xfb\xc4\xba\xea\x06\r\xd4S\xab\x963\xd9\xcc\xae\x11\xf1\x82\x92\x11l\x9fU\xaa\xfa\xe8\xba\x03|\xefR\x16`jS\xc2`\x8fyRS\xd0\x1c\xe78JO\x17\x96\x08\xfdZQ\xa9\x12\xbc{\\~\x03\xdeF\xb3\xd1\x10\xa0\x85\xe36q\xc6\xa5\x84v0\x84\x8d\xe3n\xbe6\x11ym\x1b#\x05\x97AP+C\xa1\xfaDg\xca\xf7L8/[\xb2\x80\xb92\xedv\x84\xfcJY\xb8\xac\xc9R\xa9N\x99\xad\xde\x1f\xf0\x19\xec\xed\xd7\xa9w\xd6\xdcSq{\xb2r\x1c\x0c\x05\x0b\xdd\x15\xef4\xd5\xaa\x02\xbfM\x96\xb4j\x86\x102\x10V\xdf\xe0\x99~\xbc\x7f\x89\x16\x9b\x95\x03\\\xda-3\xa6~\xb4\xf7_\x05\niJ\x12|\xf72u\xe6\x14\x1d7\xf5\xfcO\x16\x84\xc7u\x89\xb5l\xd8V\')\xfd=\x99\x8a\x01dsh6\x99H\xb8\x8eO\x0b2W\xd5\xdc\x17\xfa\xf1\xec&\xcb\x9c\xe4\x134T\xf9\xbcQ_\x01>[=\x0f\xfe~f\x91W\x1eH\xee\x85"t)U@\x9bJ\xe5\xa2_\xbb\\M\xeab\xe2Q\xd6\xab\x0f\x94\xf5h\x19 y\xda_\x07\xb7\xe7,\x8a\xeb\x9d\xa1\xc6}Y\xc2\x04\xe3:\x18\xb3\x9ev\x17\xce\x82 \x94\x11\xa5\xf7\xfdH\x96\xf4&\x96z\xc0l$\xa1\xa9?\x10\xfe\xffc\xd9\xedGo\xe8y\x19:b(\xd9W\xc4\xbd3%c\x9eK^\xf6e%f\xfbL#j\x81G\xfa\x98\r\xdb\xb1\xc3\x16W\xacJ\xcb~N\xectrE\x94\x96\x01\t\xa7E\xa6<p\n\x8b!\xb5\xea\x10\x1b\xecZQ\xbf\xcb\x9c\xbf\xba\xa9\x8b[^\x8ah~\xbb\x89\xd16\x9a\x05]\xc3w:O\x8f\xfc-:\xcf\xf4K\xd6c\xdf\x96q-=D,61\xae\x1b\x04W\xb8\xd4\x95\x80\xedM\xe5\x98@gsM\x8f\xb3h{~\x93\xb0\xa4#\xd2\xc2\xb3x-<%\x12T\x8bg\x0bJ\x0bSC(\x94\x00P\xb1\xbc,\xf8\xef\xb1z\x05\x1bhL\xf0\xa3\xcfy\x9b\x12\x14|b\x9a#p\xa4\xe7\xcf\x84w\xdc\x850\xeb\x8d\x84(\x08\xd2\x8c\xf5\xd8\xdb\x04\x1d-\xbb_m\x9b\x91\x830\xd73\x92\x0b\x1aX\xff\xbe\x84\xc08\x17\x1a%\x82\xcb\x85\xbcI\xda\xbe\xc6\xe1K\xe3h\xb6p\xdfN\x1b\x86c\xe8\x1c\x1d&N\x87$W\x03\x91\x03\xdeTr@\x81\x8c8\x9b[j\xe3\x8e\xe6`\x01\xe99\xbbfD\x98\xc1d&\x8cX\x81\xbb\x99\xff\xde\xf2\xe5\xac\xc9\x80\xb6K\x04"H\x01\xc5\x92\x0e\x11\xfa\x99 \xeb\x1fH\x1d\xf80\xee7\xe8\x9f\xe9\x92\xf3B\x90\x0b\x81\x1d\x80\xb3\xbf\xbd\xb4?\x13\x11\xe3E\x85\xa2\xe7\xf5\xb6\x8e\xddu\xefN\x9f\xd1\xb9p!\xf2\xe3\x10\xbd\x8dti6\xf8\xa0\xe6\xac\xf5\x04\x93\xdc\xb3\xa0\x14\xec\xe8\x92\xdb\xe7\xafi\xf3_\x04\x9f\xb6\x93E\x13\xb9\xfe\xf1\xed}h\xb09\xbe\x8d&\xe1\xc5\xcb\xba\xad%a\xadzP\xc3"\xdca\x17\xf0\x04\x00\x0e\x02{M\xbe-\xce\n\xbd\xae\t\xee\xdd\x92\x08\x03\x8d\x85yX\xf8@\xff\xa8\x03\xb53\x95\xda\x00l\xe1\xfe\xec\x16S\xc4R\xbc\x01\x90\x06!_\xb4\xe9R\x0e(\xcd\x8d\xbf\xf2o\xae\x9d\xfa/\x1c\xd1\x876\xaa\xf7\x90\xfc\xd9T\xf7\xf2hy\xee\xc2\xddTE6=\xbec\xb4\\\xfbc\xc9\x9fT!\xfa\xd5\x9f\xf66\xda\xbfe6\x8f\xd2\x95\x86N\x15\xfcS_\xb3\x82\x06\x80I\xc9\x01\xe7\xe0\xfa\xc5\xa0e3E!\x86\xb8i.\x86N"\xdd\xfaI\x8d\xdfS\xf3\xb3h\xd9R\x1aN\xcf\x0cf\x93\xf2\xc5\xcd \xe8G\xc0\xb0KC)z-\xd8\xd6\xfc\xdbSs\xb0\xb4\xdb8\xa1F,4"\x14\xb2k\xe6r\x16a\\\x91"9"\xb0\x0b\x9f\x11[\xcc9Y\xc0=%m\xa6\xda]\xd0\x19\xce\xf5\xber\xde\x19\xb3\x16&\\~\xf9\xed\x1a\r\xdb\xb8\t\xa2\x17\x04\xa7\x05\x98\x83\xd6\xc7\t\xc5}\xdd7Z\xf7q\xb9B*!\x8b=q!\x15\xd2\x1d\xc1\xe8y\x14\xa9S\xe3\x03\x8c\xd2\x17\x84\x03\x18t\xe40Sum\xc7w\x8b\x1b\x85/h4\xf1;\x12F*5\x05H\xb9\xcf\x16e*@\x94\xe8I\xac0/Q|\xbc\x1a\x83\x1c#\xa9\x14\t\xa8\x14\x82`\xdd\xe5\xaeMBd\x88\x90\x06\xd2|6ZN\x95!\x11\x15\xf9O\xac\xbeZ\xf3\xb3.i7\x1f<\x10\x7fl\x0b}C\xdaU\xef\xc7\x804\x16M\x8b\xa2\xd2H\xfcj\xc84{\x0b#\xd2T\x7f@\xc6>\r#\xc7\x1b\xd6\xa8\xd1+\x95\x98\x0f^\x1aYE\xce\xae2\x14\xde\xa7\xb1\x19\x854 <\x03@~\xf0m\xd6A;\xb3\xaf\xfc\xf3}\xf7\xc1\xb8Nm\x906x\xa6\xf9\xa1\xe1`UY,\x96%\x0e\'\x03Zs\xbaZ\xaaw \xefqV\xee_6\xfb\x94\xee\xfb\'\x074[e)z\xa8\xb65U\xef2\x1f\x93H\x9b~\x91\xb2\xf1ztX\x01\x18\x92\xe7\xae\x8a\x81\xb4\xbf\xa7q<\x99i\x9ek\xe26\x80\n\xab\x17\x86\xd2J\x7f\x0b."\xc3\x97\xa8J$\xed\x923!s\xba\xfbf\xd8\x05\xa3\xf2\xcf~\x03a@\xf8\x13\x16\xa9Rx\xae<\xf5\xa3\xbbL\x0e\xcezW\xd4\xe5y\x9f\x02N\xa6T\xcc3j\xf5\xa6\x90\xb3I\xa3\xa3\xfc\x9d\x7fx\xe5\x08VPb\\\xd38\xb0K\x1c\xa6\xbfB\xbd\x15\xedo\x07/\x9f\x86\xb6\x97\x86\xcb\xe2\xf2\xaa\x0fe(\xf4\xab\xdc#\xa8\xf2\xf5P\xb9z\xd7\xd8\x8eJ\\\xb5\xdev8\xed\x00\xf4j\xec\x02`\xe5YS{\xd4\xf5\xae\xfe\x83?OP\xa4\'\x00)Q\xdfD>!\xc4\x8c\x0b\x94\xb9\x1a\'\xe5\xcc\x1ct\xf5?\xf4\x83\xbb\x06>\x87\xaeP\xcc\x95\x02p\x84?\x14\xfa\x1a\x1d\xc0\xf3;\x83~\xa8[\xac\xad\x8e\x01\x15\x9f\xbc/\xee\xdd8}L\x9c$\xa4\xbfe\xe4Ec%\xc3\x05KN\xef\xcc\xa2\\\x0c\x14\x9f\xec\xf6\x1d\xe0\xbea\x00\xc7k\x11:tO\x11 \xa3G\xde\xaef\x00!\xbe\xaeB\x04\xe0\x17\xb9\xceM\xcb;!\xc9\xfb\x99O\xd9\xab\xe9\xb9\x99\xf2\xe4\xa1w\xbc8%\x02z\x99\x90\xdf\x1e\xe1\x08\x99\x110\x85`UN\xce\xfc]\xeb\x9b_i\x92x\xaf\x82\xbfA\n\t\xe7\xd2\xa8\x7f\xb9\xab\xed5\xec\xcb?\xa2\xaa)\xbe\xc2\x06\xb5\xfb\x17M\xa5\xc5\xc8\x07Z\x9a\x85]/j-\xbb\x99\xcc\xf0\x04\x12\xb4\xdd\xf5Q\xfd\n\x06\xdc`I\x96\xbe\x88\x84{\x89\xaa\xb4\xd2\xa9\xae\xf4\x04]\x96\x86\x1c\xd5\x1dWc\x1e\xc2\xf3G:\xf6\x95&\xf3\xb5\x8f\xdc#&\xca\xe1\x0f\x91\x9f\x15\xb6\x07\xc7k\xceo\xdf{L(\x10\x0b\x06w\xd85\xf8{\x1b\x08\xbc\xa4\x1f\xb2\x7f\xb4<\xf9\xbbZ|J"<7<N?Q\x98\xc3\t\xbc\x1a\xdao\xb7,\x9dO^m\xd4\x8fn\xdb\'\xe3z\xd56\xae!Y\xa6\x91\xdex\x02\xe9Y\xc3nS\xc7\x0e,!<\x87~\x994\x15\xd8\x86E\x93c\x95\x8c\x94O\xccg%\xfd\xa6\x02w!:\x8e\x98\xfdk\x9a\xbd\x95\xf3\x91(c\r\xf8\xe0\xc7\x84\x98\xeda\xc1\xc9/%dST4"/\x904j~Z(\xd0X\xa4"\xa7\xbc~\xf2a\x95\xd0\xdd\x18\xf4\x96WI\x90\x88\x96\xc6\xed\x08\xaf)+\x8b\x95M\xf7$\xaeU\xc1\xe4\x06={\xdfk\x0e\xca\xa6\xbc\n\xd8\x9dc3\x87\x98\xf1\x9b\xfa\xc5\x05\xb8\x07\xf8\xe6\tN\x08\xa5o\x16\x05\xc8\xd3\xec\x8f\x04l\xf2\x8a[!\x8c\xae\x91\xca\x8b\x96\xe8\x83\x96\x03`\x93q\xd2\xb4\xd5\xbd\xe8u>\xd0\xc8\xf6\xdf\x14:\xaf\xff\xc8m\x0c\x90\x05\x9b^B\xe4\x16\xdd\x17RQ\x07\xf0Iu?\xce"\xd9m_\xdd\xd9\xbd\'\x91\xff\xc55H\x80\xaf\x01\x9c\xff"\x03\xfd\xd0?jg\x1ac\xe5\x1c\\ai*\xa7yX\x8f{\xa2\xef\x0e\x19\x0e\xfff^\x8eA&\x92\xc7\xa0\xd8\xfbMD\x1c\xa7\xd9\x96\xf0,\x14\x81\xf0t~\x91\xb0\xf2\xe1\x9cc[\xcb\xdea\xd9.\xac\xa4B\x18\xbc\x19\xdb\xca~\x8e\xabM|\xcc\x1d)\xffHJ\x022\xae\x8a\xbeN\xf2\x8b\xdcX[\rV\xcf\x9b}\x04.\xdc\xadJ\x9am\x80P^G\xfb#-\xcb\xfa\xda\xb04s\x88\xd5\xd2\x0e\x94r4\xc0\xf5\x149\xf5\x10\xc8\x85RK\xd2_\x8a\n\x1fy!\xe2\x80mCh\xae7W\xdf.\x07t/\xfe[S\xfd\xe6\x1fh@\xe5\xa5A\xf1\xf8:t\n\xd4\xcf#G\x9d\xaa\x13\xc18\x8a\xfe\x1e\xcd}\xd6\xf4\xe9\x14\xb8\x87\x14\xf6p\x95\x10h\x1dE\xe1/\x17rr.\xb0\xdf\x0e|\xbe%w\x9a0T}z<\x94i\x99=\x89\xbayK\x81\xcf\x88\xbe\xdc\x91m\xe4,\x91\xbe|\xb1\xb0\x07\x1cs\x1d\x7f\xbc\xd4\xec\x16\xbdxy\xdf\x9e\x84\xc1N\x8a\x18\x0b\xc21\xefd\xd1]"\x1f\xd3\xda*,l\xf8\x08n\xde_N\x0b\xfe\r\xa1\x8at\x89\xbf\x82\xc7\xea\xa7<\x1f\x17\xa2\xbbS\x83!\xde\x9c\xc6<\x12\x15\xdc\xb1,\xddl0\x96\x1f[\x86\x04\xaa<\x15#\xdbN\xeeq\xb3>G\xd2=Gq\x1cA\x7fN00A\x80\xf2g\x88d\x15\xb9\xdf\x19\n)[\'K\x98o\xddm\xd9~\x99\x1c\xc3t\xb3\xc0\x07b\xd8\xed\x1e\xdc\x05k|\xd3T\xc6\x81\xd1d\xf3\xf2\xf1?\xd7\xbc\x8a\xb5v\xbf@\x92(t"\xa1\x96M\xb57\x1eA:\xab-z\xe6\xbe\xa5%`\x86aC\xf5\x9fKp\x9cQ\x91Q\x07\xd9)\t\xa8\xefE\x8d\xeaF\xa2F\x89\x8f \x15\xb2\xf3\xb2d\x16\x1d\xcdz\xedR(/Q\xec\xc9m\xa0<\x17T\x12\xbc\x1eEL~{4Yt\xfa6\x02r\xc1\xa5\x94=\xcc\x96\xd5\x02\x84\x13K\x8b\xe9\xdd\xe3\x08\x17<\xc6\xae\x18\x06/\xc6\x9c\x89h\xc1\x9c\x14d\x88\xe0\xb9;46\x93\xa6\xb73\x11\x9aXp]\xf5=\xe3\xcf\xad\x80-\x89\x93W\x8c\xebk\xc7\xd8\xe1\x1c\x01,\xfb\xdbb\xfb\xcb\xae2\xb7\xce\x90\xda\x97\xd7\x8e\x9b\x8b8\x89\x08\x9e\xf4\x10"v\xe2:J\xcd\'\xa7\xebDX\xc4\x9d\x0b\x8c\xe2Q\r"\xb9\xbc\x1b\xdb\x88\xd8\xef\xfb\xe6\xda\xd2c\x1dg(\xcf\x1d\xc1\xef\xb5R\xaa\xbcu\x1bZ\x07\xb8\x84\xcbc)\xe8\xe9\xf2\x1f;\x84\xc3.\xf8\xf7H\\\xa8\xc4/\xfb\xa6\xfa\xd9\x1c2\x9b\x03Y\xf1\x07\xedr,\xf6\x90X\x9awHG\xcd\x08S\xe9Y:Q\xbck\x10\x9c%\x08\x9b\x86l\xb1\xf3\xa9\xf1:\'X\x08\xe4j\x7f\xc0\xf1\x01\xe8\xf9R\x8c\xe3\x1e\xeb\xe4TN\xb44\xbd;\xfa\x96\x8f\xcc?\xfa* \xb4\x12\xc1\x0b~\xa0\x8e\xcd\xebp\x0b\xe9\xff\x7f\x04~\xe1\xdc\xb1Q\xb4W\xde\x8c\xf4q\xc0\xc0\x96gB\xa6#\xf2 Z\x81Y\x1fU\xb6\xe3o\xae\x8e\xe0\xfc\x18#=7c\xf4eX6\xf2\xbb}\xe3d\xc7d\x02\xb6\xee\xdc/\x9a\x92\xf0\x00\x84\xe0\xcd\x15\xaf*N"\x8eojPV[y\x9f\x90W\xbeW5\x7f\x01\xfc\r\xef9zQGG\x00,K\xca\xbd7\x04\xf5\x85$\xa0\xed\xe3\xb3\x1d\x1d\xa3\x07\\\xc1u[\xa7<\x91F\x0f\xe8\x88\x8b=a,\xc5\xa9\xd3\xeb\xf2\xffT\xc0(^(\x10}\xc0&H\xa9\xc0\x7f \xc7\xda\xc33\x1a\xdcP\xdaQ\x02\xf2\xc7=\x7fix\xe0\x80\xff\xdc\xb2q\xee\xb8\xc4\x89XCG\xe4\xf8v4R^.q^\x8b/\x0f\xeeZtW"\xadC\x9a(\xf3\xfb\x8b\x85\x11\x1b\xd8\x9e\xc5\xa52\xb7s\xffv\x1fG\x04\xe8\xed\xc1\xb8N\xd8h\xb7e\x87\xf80GK\x7f\xed\xe3\x07\xe4\xdcZ\x99\x08\xb9\xf6\xc2\t:\xb5(\x90\xa1\xc2E]\x04\xd5\xa0\xe5K\xc3VT\xcb+\xd4\x96\xc0\'\x01/\xd3\xba\xf7"p\xf6\xdae\x92^P\xf8\xef\xae\xf8\xe7\xf6$\x0ey\x1d\x92y\x11\xf8\xe0Yr:\xfdq\xe9i\xf1\xe38\xaa[\x8d\xbcjH\xedX\xa6\xb6\x89\xc1\\\xdc\xa6>|\xfe\x19p\xbe\xa65h[^\xd5Dk[\xcc\x1b\xfd[\xadQ\xcc\xee\xcd\xa9\xb2\x0b\x8a/\xa1;`\x80)3\xaf\xfc\xca\xe2\xab\x914\x88\x86\xee\xe5#\xa7\xec\x03=yi\xbd\xe2\x95\xba\xc8+A^y\xdbf\xcdE\xc0\xd8\xce\x07\x16>M\xfbNX\x88\x94y\x8c\x06\x8d\xa3I?')
|
1
|
+
from hiddifypanel.models import *
|
2
|
+
from flask_babelex import gettext as _
|
3
|
+
default_ips="""
|
4
|
+
mcix.ircf.space MCI
|
5
|
+
mci.ircf.space MCI
|
6
|
+
mtn.ircf.space MTN
|
7
|
+
mtnx.ircf.space MTN
|
8
|
+
rtl.ircf.space RTL
|
9
|
+
mkh.ircf.space MKH
|
10
|
+
hwb.ircf.space HWB
|
11
|
+
ast.ircf.space AST
|
12
|
+
sht.ircf.space SHT
|
13
|
+
prs.ircf.space PRS
|
14
|
+
mbt.ircf.space MBT
|
15
|
+
ask.ircf.space ASK
|
16
|
+
rsp.ircf.space RSP
|
17
|
+
afn.ircf.space AFN
|
18
|
+
ztl.ircf.space ZTL
|
19
|
+
psm.ircf.space PSM
|
20
|
+
"""
|
21
|
+
from flask import request,flash
|
22
|
+
import maxminddb
|
23
|
+
import os
|
24
|
+
import re
|
25
|
+
import random
|
26
|
+
|
27
|
+
try:
|
28
|
+
ipasn = maxminddb.open_database('GeoLite2-ASN.mmdb') if os.path.exists('GeoLite2-ASN.mmdb') else {}
|
29
|
+
ipcountry = maxminddb.open_database('GeoLite2-Country.mmdb') if os.path.exists('GeoLite2-Country.mmdb') else {}
|
30
|
+
except Exception as e:
|
31
|
+
print("Error can not load maxminddb")
|
32
|
+
|
33
|
+
|
34
|
+
asn_map={
|
35
|
+
'58224':'MKH',
|
36
|
+
'197207':'MCI',
|
37
|
+
'12880':'ITC',
|
38
|
+
'44244':'MTN',
|
39
|
+
'57218':'RTL',
|
40
|
+
'16322':'PRS',
|
41
|
+
'56402':'HWB',
|
42
|
+
'41689':'AST',
|
43
|
+
'43754':'AST',
|
44
|
+
'31549':'SHT',
|
45
|
+
'205647':'SHT',
|
46
|
+
'50810':'MBT',
|
47
|
+
'39308':'ASK',
|
48
|
+
'205207':'RSP',
|
49
|
+
'25184':'AFR',
|
50
|
+
'394510':'ZTL',
|
51
|
+
'206065':'ZTL',
|
52
|
+
'49100':'PSM'
|
53
|
+
}
|
54
|
+
|
55
|
+
def get_asn_short_name(user_ip=None):
|
56
|
+
user_ip=user_ip or get_real_user_ip()
|
57
|
+
asnres = ipasn.get(user_ip) if ipasn else {'autonomous_system_number':'unknown'}
|
58
|
+
asn = f"{asnres.get('autonomous_system_number','unknown')}" if asnres else "unknown"
|
59
|
+
return asn_map.get(asn,"unknown")
|
60
|
+
def get_country(user_ip=None):
|
61
|
+
user_ip=user_ip or get_real_user_ip()
|
62
|
+
return (ipcountry.get(user_ip) or {}).get('country',{}).get('iso_code','unknown')
|
63
|
+
def get_real_user_ip_debug(user_ip=None):
|
64
|
+
user_ip=user_ip or get_real_user_ip()
|
65
|
+
asnres = ipasn.get(user_ip) or {}
|
66
|
+
asn = f"{asnres.get('autonomous_system_number','unknown')}" if asnres else "unknown"
|
67
|
+
asn_dscr = f"{asnres.get('autonomous_system_organization','unknown')}" if asnres else "unknown"
|
68
|
+
asn_short=get_asn_short_name(user_ip)
|
69
|
+
country=get_country(user_ip)
|
70
|
+
default=get_host_base_on_asn(default_ips,asn_short).replace(".ircf.space","")
|
71
|
+
return f'{user_ip} {country} {asn} {asn_short} {"ERROR" if asn_short=="unknown" else ""} fullname={asn_dscr} default:{default}'
|
72
|
+
|
73
|
+
def get_real_user_ip():
|
74
|
+
user_ip=request.remote_addr
|
75
|
+
for header in ['CF-Connecting-IP','ar-real-ip','X-Forwarded-For']:
|
76
|
+
if header in request.headers:
|
77
|
+
user_ip= request.headers.get(header)
|
78
|
+
break
|
79
|
+
|
80
|
+
return user_ip
|
81
|
+
|
82
|
+
def get_host_base_on_asn(ips,asn_short):
|
83
|
+
if type(ips)==str:
|
84
|
+
ips=re.split('[ \t\r\n;,]+',ips.strip())
|
85
|
+
valid_hosts=[ip for ip in ips if len(ip)>5]
|
86
|
+
|
87
|
+
if len(ips)%2 !=0 or len(valid_hosts)==0:
|
88
|
+
flash(_("Error! auto cdn ip can not be find, please contact admin."))
|
89
|
+
if len(valid_hosts)==0:return
|
90
|
+
|
91
|
+
all_hosts=[]
|
92
|
+
for i in range(0,len(ips),2):
|
93
|
+
if asn_short == ips[i+1]:
|
94
|
+
print("selected ",ips[i],ips[i+1])
|
95
|
+
all_hosts.append(ips[i])
|
96
|
+
|
97
|
+
selected= random.sample(valid_hosts,1)[0]
|
98
|
+
if len(all_hosts):
|
99
|
+
selected= random.sample(all_hosts, 1)[0]
|
100
|
+
|
101
|
+
return selected
|
102
|
+
|
103
|
+
def get_clean_ip(ips,resolve=False,default_asn=None):
|
104
|
+
if not ips:
|
105
|
+
ips=default_ips
|
106
|
+
|
107
|
+
ips=re.split('[ \t\r\n;,]+',ips.strip())
|
108
|
+
user_ip=get_real_user_ip()
|
109
|
+
asn_short = get_asn_short_name(user_ip)
|
110
|
+
country=get_country(user_ip)
|
111
|
+
print("Real user ip",get_real_user_ip_debug(), user_ip,asn_short,country)
|
112
|
+
is_morteza_format=any([format for format in asn_map.values() if format in ips])
|
113
|
+
print("IPs",ips)
|
114
|
+
if is_morteza_format:
|
115
|
+
if country.lower()!=hconfig(ConfigEnum.country) and default_asn:
|
116
|
+
asn_short=default_asn
|
117
|
+
selected_server=get_host_base_on_asn(ips, asn_short)
|
118
|
+
else:
|
119
|
+
selected_server=random.sample(ips, 1)[0]
|
120
|
+
print("selected_server",selected_server)
|
121
|
+
if resolve:
|
122
|
+
from hiddifypanel.panel import hiddify
|
123
|
+
selected_server=hiddify.get_domain_ip(selected_server) or selected_server
|
124
|
+
return selected_server
|
125
|
+
|
4
126
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
127
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
hiddifypanel/panel/cli.py
CHANGED
@@ -1,5 +1,174 @@
|
|
1
|
-
|
2
|
-
|
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\xc4"\x00\x00\x12\t\x04\x00\xc4\x03\x1c\xa3y;\xf2\nhO\xda\xa2\xe6\x98\xca@\x00\x00\x00\x00\x00\x00\x00\x00\xc7s@\xe0\x8dih\xae\xe3\xee\x17\xc3i\x16b\x1c\x1c\xec\xc3QD\xd9\xbe\x17\x88\t\xbe\x19\xff*\xebP\xdeQG\x9b\xfa\xeeB\x03\xfd0\xb0\x8d\xa4-\x83`B\xc0\xc3$\x1b\xcf\xaf\xd8bK\xc9\xf3\xaeE\x10\xcd\xe0\xa6\x1e\xe3\xde\x8a\xce\xc37\xbfb$\xf9\xc869w\xda\x85*^J\xa8\x1evj\xf4T!\xaad=\xa2W\xe6)\xdc^~\xe2\xa8~\xe1\x98\x9c\x89\xac\x07\x1e\x02\xb3\xa1XR`\xe1,s,\xfb\xe30z\x88d\xc23/\n\xc3\xac"`\xea[00h4A\x83QPn\xb9\x0c\xff^\x17 \xfa\xa1+\xce\x9f\xe8s-\x15BAJ\xa57pq{\xfb\x89\xb9\x11{~a.D%\xb9\x00\xd1\x9d\x86#\xa5\xf7\x9a\x84y\x12\xd4\xb8\x9b&\x82:vlK\xd9\xffwN+\x81%\x013\xb4#RY+}|\x89,\xa6f\xcbN\x1a\xe7\x96\x9a\xc8\x0c\xa6\xe2\xc5\xf1\xe3\xa4\xa2r\xe7\xb8\xb1\xb3\xdf\xc9\xa6\xd3y)\xc1\x8b\xfc\x14\xa4\x0fm\x07\x98|\x07\x07\xe9\x1a\xcd\xd7\x97\x0c\xe8\xd7\xdc\x86\xff\x87/\x1d\xa9\x17\x16Ft\xf8<l\xa7\xc8\xb4\t~\xa5\xb6*N_\xfbDdV\xf0\xe1\xb5?\xba\xdd\xa4\xf8s\xef\xcb\xd5\xfc\x1e\x07\x0c\x05\xb1\xe7NC\xcc\xaf\x02|\xfb\xec\xed\xf2IBw\xed\x8b\xd26\xdf\xce\xb9\x08\xb9\x9d\x80g\xa9\x98=\x19\xcb\xc8\xb0C\xd6ge\xa0\xe6\x94`\xac\xdd.\xb0}\xb4\\\x10l\x99c]\xe7!\xf6j\xca\xda\x05\xb9\x0c\xb8\xd9\xb9\x15\x06\x11W\x80\xaa\xff\xd0DY\x9c+\xad\xbc\x0e\xaaH\x1b\xcfs\xd6\xad\x89\x99\xb8\xc2\xf31\x9f\xb6\xe6\x87\xeb\x1eP\xf6\xca\xee\xb2-\x93_\xd5\xd7\x7fK!\xa5>C\xa4=\xf0\x9f\xf5\x8e\x003\xbaA1aj}\xf5R\xcdn\xf7\xb8\x1c\xe9fIE\xb7R\xab\x05\xb3`\xaec\x99\tWd\x1b\xe3\x0b\x98\x0e\x1c\xc0\xd0v\x7f\xe6jD\xeaa\xa3\xce\x86\xf2\xab\xe9=\x92\xcf\x99?\x8a\x8b\x08B]\xfd\xbc\xc4\xfcDe\xf6\xe2\xd8-Vck\xfb\x00\x15s2A$\xd9Iqhr\xf3\x1d\xec\x08\x8d\x99\xc3\xfd\xa5\x9cf\x14\x93D\x91\xc1\x95\xc9*|\x0cj\xbawS\x9f\x01\xd3\x05*j5\x12\xbdK\xddvd\xe4\x82[\xc7J\xc0\xb2\xc2\r\x92\xf2r\x85m\xb6\x8a)\xcf_4\xd9\x98\x93\xea\xb3!\x16\xa3\xb1\\\xcd\x9a\xe3u\xf05\x1b\xd5\x1cP\xde\xef%\t\x81\xd8\xb1\x8d\xc2\xa4\x851;v\xaa\xa2\x80\xd18b}\xe5\xc6\xa7\x00\x9b#\x0e\xe0\x8b\x19\xc1*/3\x1a+\x84\x84\xeaEy:\xae\xc7\xa1^\xc8\xc3\xf7\xc6+\xc5uNw\x04\x95\x1c\xc1\'\xfd\xb2\xfb\xeb\xf5\xdbT:\xee\xc3q\xcd\x1d\xbe\x8f)\xd0\x01\x1aU\xbe%\\\x0e\xa7\xd9y\x91\x8d\xbf\xb7\xe6\x9d7\x06\x8bX\xdb\x023\xf26\xf3\xef=q\x08\x8d\xc8x\xb7\x017\xe9\x04\xec\x12\xc2\x92)2{<\x10<pa\x12S\x1f\x9cDY\xa9C_\xdc\xf8\x98[\x93\xc1a\x02K\xfcC\x07.I\x13\xf3\xb3\xe7j6E\xf1\xfc\x14\xc7\xec23\t+2@\x00k\x8esns\xb5<\xa8\xb9\xb8\xc7\xd6\x98\xfe\xf3\xbe\xb3\x0e\n\xc3\xed\xae\xd3\x8d\xf7\xe5Jx\xe4\x9d\x86r\x92Oq\x8b\x8b\x03\xd3){R\x9a\xac\xb6C\xd4\xa8,\x179\x9e&z\x85\xde\xbd\xa7\xfb\x03\xbd\xe5\x10\xcc\x94\xe5lq\xef?D#\x1d=\xefw\x97\xb7\x9a\xee)\xe9\xb8,\x83D\x98\x10&;\xf6\xad\xc2\x19\xb8Y\xbfQt\x18\xe8Q\xac%\xa6P\xba\x05\xa3\xc9\xa1\x17\x0c\x9e\xc9"\xd4&SJ\x1f&\x1c;\x8bt\x98$\x02\x95\xa3\xfb\x8e\xa6\x81-[&*]\x1e\xa5\xbav)\x93*\x96\xb8\xc6g\x1f\xddY\x80\x8a\x0bz\xf5(\xce\x83\x8f\xc1+&\x94\xd77\xc1;\xd3\xc8\x03w\xd6\xa8\xf4\xcf\xd7\x0f\x9a\xfe\x98\xf4\xe5\xffdY|5=\xee7\x14}\x8b6a\xbf^K]"};\x0c:O_\x05\x15w\xd9\xed\xdck\xe9\xc9\xdeiBs\xfc7\x08q\xfb\xd8|h\xe1\x05<2\xb7\xf53\x83v\xe9\x12~+\xa68\xcf=\x1aD\xa8B\xb2U0\x96\xb6\xc8\x96\xbb\xf2\xe2\x06\xde\x1d8+?$\x8b^\xd8\x00\x19\'\x14\xcb \xe5\xd8\t\x06\xcbBL\x8d\xa5\x072\xf1\x1b\xd8t\xd1\xc3w\x98\xe2\x05MJT\x12\x0cG09\xe9S\x18\x90\x01\xca\xd0A\xbf\x15\x00\xa8?]\xe3\xb1\x0e+0\rx\xb7\xa8\xc4\x1c\x9a\xd1\xd9\xefW\x0f\xb9L]\xbe\x98\xa2\x1eM/\xf6\xb8\xf3\xffSY_>\xcfb\xbcU\xb5\xcb\x89\xcd\n\xe4;\xdb;\x89\xfd\xd8\x87\xbfB\x8d\xfb)\x9b\xef\xa4OL\x17g\xe1\x07\x82\x98\x16\xbctS\xc9\xbbn\xe2Y\xf6*\x96z~14T\xe9\xc3\xa2\x81&i\xaa=I\xf2\xc2\x8a\x11\xdf\xcb1\xcd\xc6\xe9\xf3\x91W\xb5\xa5y\x02\x9f\xae\x86\x9f\x00\xc3\xf7\xf20\xd8\x8c\x9e\xef\xad\x93\xb80\x89\xc99f&\xdf\x17E\x90t.\x9bZ\x91\xd1\xd6\xb1\xbf\x92\xb8\xfd(\xe8\xd4\xbbJ\x81\x94\xff\xa0?\x90\xfe\xf9\x07\x86Y\xc5\xb8\x1aZ`\xf1>5\xbe\x9b\xf71f)"f\'#\xdd\xa7\xe5x\xc7\x84\xfa\x8d\xfc\x86\xed\xc6F\x03\x8a\x08\x1b\xc4\x8f\x11\xe4(\x8e\xe7\x9ay\x93/\t\xba.\x83\x96d\x19/\x0f\xcb\x15\xe1\xcb\xfan\x9c\x18\npJ\xa9\x89)\x81\xb5\xed\xcat\xb0\x1bN\xf8\xbdz\xa6\x0e\xb0\xa9O\xc7|\xa1`\xf1\xa4\xfd\x01\x11 \xc6\xa6gDt\xe23\x90\xc6\x92$\xd5\x98\xccm1\xec\xa3u\xc9xv\x0e5S~?\x90\x1a\xce!\xd7\xa4\xe6r\x0e\xd5\xf0\'\x9d\xd9\xe9\xae%d\xcd4`m\x9d\x08\x1b\x1c\xdb\x1be\x04\x81j\xec\xe0\'Q\x85\xf0\\\x9f9\x16.N3?\x03\xf8\xab\xfe8;\xc5\x9a\xcc\x00 \xac\xd04`Gd\xe7NR\x1e\xed\xd95\xdaM}\x0b\xb1\xd8\x05\xe3*\xf6Z\xbf\xd4hvx|\xf9M\xcb<\xd0\xa1\x1d\x9e\xf5\x087\xaed\x19O\xaf\xb4<\xd4\x06\x99T\xc5(\xf0+\x19CD>\x18\x14\x9a\xce\x1c\x8e\x9e\xf7\xe3\xfa\x00\xaa\x8e\xb4\x1a\x9d\x90p\xa8\x97\x9b\xec\xda}u\x0cnnj\x8fO\xa5\x0c\x9c\x83\xd8\xca\xcb\x80\x9bo\x8b@!\x9b7\xe4\x19\x8d8\x81\xd8\x12\x1d&\xb5\xaaO_\x11\x80\xa9\xb5w\x96t\xb4\xda\xa7\x96Fg9\t\xcf]\xb1\xee\x16\\\xe6\x8c0\xc6\xca\x17\xb7!\xed\xd8\xda]"d\xc6\xce\x96BM\x1f\xec\x81\x92\x80\xcc\xf1\x06`L7\x91\x10\x81[\xf1] \x8c\t\x81\xa3\x1czWSi\x83\xb9#\x95\x96\\\xf1$:_\xa4\x02\xf4GJ\xfb\xd2\xa5\x86\x17\xae\xcf\xda\xd2\x95,nd7\xd2h\x13\xf8R\xa1\xe6\t\xf8\xaf\x84\xdd\x0eW\xfa\xe6*y\xbage\x99t\xa0O\xbcp\xdf1\x05\xe3\xce\xac\x1a\xae\x03%LF/AZ\x81\xc4\xfb\x120\x91@\xcc\xb6*\x7f\xb8\x02\xef\x1f\xbc\xdf\x08\xb9Z_$\x05\x9aR</\x82\x81q\x90\xc5\xede\xf8&w\x95\xb8\x1d\xd1>\xf5|k\x0e\xada\x0b\x7f[ \x0c\xdc\x11ZX1\xa0\x97\xde\xdcy^\x12\x90\x9c\xf8\xce\xe1\x85\xd7\xb5\x98\xb3*\xa1\xd4\xf4u\x8eA\x80k\xb5\xbcg\x93\xc5\x7f\xa4\xe2\xac\x1bpQ\xba\xf8\xb3\xcf\xf7Zj+\x1c\xe3R\x05\xdbS\xddc\xd7;l\x87Ro\x18AJ\x1f\xf2\xaa\xe9\x8aK\xc9\x83\xe1ah\x94\x81\x8bh2\xda\xa5A\xc9\xeeR}\x8f\x83$$\xb3\xd0\x05\xa6\xa8\xb43V!\xae\x91f\x07\x95\x0f\x96g\x91\x08\x1f\xfa\x1e\xc7\x8f\xe7\x91p\x93\xb3/\x90J\x99\xe9\xfe\x03\x9cC\x01<\x9c1\xb3\xb5\x9eQ\x9d\xdf;\x99\xf6\xf6pv\xe8[\x88\xc2o&K\x9c\xd5T\xd0\xccX|\x8a\xa1z|\xb3\'U\x82s\\\x83Z\xaap{~\\\xd4A\x95\\\xb8\x94\xc1\xd0n\x952\xf4\x82\xa7V\xf0K\xc2c\xeb\xdc\x02\xc1\x83\xf2\x99\x9f9co\xd8p\xc6\xdc\x00\x1e/g\xc2!\xc9\xba\xecX{\xfbB\x92\xe8\xc1Yp#\xe2)\xc8\xa0\x9f\x9b\x95H\x99\xba\xaeO\xca\xb21\x1f\xb1\x10\x84"\xba\x89\x9a\xd0N\xfd5\xdd\x85&,\x15\xb8\xa1\xad\xda\xd7\xa8\x83<\x02\xb8\x8b\xe9C\x81\xb066\x82\x97\xb0\xe1\xb2\xc3)9\x1b\xa6\xf1\xa1\x8a.\xd3#y\xbe\xe4\x9e\xfc\xa4\xe6\xbe\xf1Y\x94\'\xeb]<\xd8m\x8f\xd3\xcf\x04\n\xa9\xf1\x14\x90~\x1a\xd5\x8a\xf6k{de\x98\xee\xf9\xf6J\rQK\x99\xd2\xe8\x07a`.\xc7\x0e\x82\xbbl\xaa\xa5\xf9zv.f\xf3$&H\xb1\xae>|\xfd1\xce|\x05\tw\xdfa\x90c%A\xdep$K]\xbf\x1aE,AOu\x86\xfa{\x1c\xe7d\xab\xc3\xb5c\x1ce\xc8\xebO\xa5^\x10:\xa5\x8a\',\xa5\xf6T\xf7\xd71"O%\x13H ";&!\x8d2PVs\x89\xdfc\xbb[\xbfT\xb3\x9a%Y\x9f\xf6g?\x92\x90~\xe4\xcb\xc4\xdb\x9c\xda\xa7P\xefc\xc3\xef\x87\xb9x_\x82_\xb4\xe3=\x1f\xa3\x9e\xf7\xbf\xc9qh\x84\x8dU\xfcl\xe3\xeb\x19Bt\xebe\xf2\xd4R1\xf5\x9a\xb0\xb4\xfdU\xb8kRl\xfe\x8c!\x7f\xc5\xa3\x82\xdcn\xdb\t\x82\x01s\xab\xd5\xbae0"\x130x\xa6\xe0\xb5dg(\xd1\x99r\xc3n\x1c\xc6\\\x92{\xb8v\xbc\x1e\xe1\xeaU\xc4\xe7\xce\x11\xe6\ny\xa1!\xe6\xb7\xb9`\xc7Pd\x06m\x90\xb4\xaeE\x87\x15\x0c\xe0P\xfc\xb3\xe2\x99T\xa6\x1d\xb3\xa0\xaa"y\xadp\x93\xba:\xeb#\xf76\x8d)\x1a\x93\x83\xcb\xee\x08 )-\xd0\xb5x\xb3\x05\xa9\x08\xbc\xf1+%\xbdG<\xe1\x1a\xf0\xe0\xd3Z\xfa\x1cJ\xc9\x141\xce"(X\x13o\xdeE\x7f\xf9\xdcx\xc3\xa1j1\xcam]-Z\x1e\xaa\xb6l\xdd?\x12\x00\xacxU%\xdf\x9cbRE\xde>\xec\xf5E\xde\x14\xbb\xb7P\x00\x9dl\xf8\x10\x7f(\xb7Y\xddQ\xb0\xa1\x7f\x80\xc3\xfe\xda\x94c\xbe\xb5\x8a\xd5\x11\xba$\x9c\xb6Ysq\x1dpq\x08d\xd6\xa4\xf0\xf2\xb9\xbc5\x99+\xab\xaf\xbde\x08\x8b\xd5\xa2\xe5O-L|\xd3e;(\x8c8\x14\xce0S.\xbeV\xdbV%\xc5\x92\xa3)\xeaK\x96~\xe6\xe0\xa6\t~%\x97R\x0ba%k\xd14\x8f\x97l\n\xf0BWL\t\xc5\x9c\x04\xaam\xf7\xe7\xb2\xb0D\xd8l*\xd4\x80:\t\x06\xd77\x8c-^>\xe5\xb1\xe4\x8e\x0f\x036\xb7hT\xcb\x88\xf0\xbc\xb5\xa8=\x1d\x8e\xaci\x1d\x06\xa8uAN=>T\xf8\xf0\xbc\xfb"\x11\xd7\x97$\xef`N\xad\x9c]-\x03yy\xd2f0\xff\xb4E&\x16CZ\xf03\xdc0\xe4VQ1q7\xba\xf6\x1eg\xbd\xb2\xe3\xc69\x9f\xbf\x0f\xc6\xf3J$\xb2\xbcn\x1e\xae\xc6\x1a\x9b\xed\xfe\x18\xb8\x97\x9f\x05Ys\xa1Z\xe7\xa4\xd1\x8a\xd3Y+G<\xeb\xf5Y\x07\x86\r\x00\r9\xd1\x86~\x18$\x1a\xb7\xcd\x8b\x8c\xc7\x1a\xd5\xde\x92\x0c9ZT\x17\x1f\xada\t"K\xec\xc1\xeb\xca,\x84\xc5\xf1K\xe7\xd7\x1f\x94z\xb8\xce\xca\xc6r\xc7\xec}\xb7W\xc5\xd6w\x08\xb6=\x02\x05\xf1h)\xdb\xf0\xbcg\x9e$\xf2r\xf4XY\x0b\x91:\xbd\'>\xd1\x80u\xc9\xf9tB\xfd\x0fn4\xd4\\\xb4\xe8M\xf9@dk\x10\x1c\x8e]\x88\x8f\xa9\xd5\xf5\x8e\x08+\xefV\xc7\xa1\xc7\x1b\xb42.\xb2\xe04t\t\x94\x10p\xc2\xdd\x1d\xa6@9\x96\xd1\x02\xc2\xbb\xb0\x18\xe411z\xd2\xa2`\xbc|\x08\x93a\x13\x14\x7f\xe8)\xbb:\xa3\x0c\xed\xcb\x90LJ\x82z\xda\xb4\xf4DM\xe1L\xab\xf1\r\xffqJ4/\xac\xc9\xab\xa7%cI\x08\xe9?x}d\x90\xe9]oM\x1b\x94\xfd\xa7\x05v\xb0pSZ\rM[\xbfV\'\xadh\x01\x12\xaf\x10\x1d\xe2\x16\x86\xb8\xf9\x9b\x90\xc6\x8eM\xf8\xa1),eP\xbf\x99\x14d[\x81\xe41\xe3xv\xcf\xe4\xe6\x02g\x88\x8c\xa6UzG\x83\xca\xa5z&t.\xcd\xf7\xfa\xdb\xfd)r\xfeS]Y6\xc3\xfec\xddg\xb1\xba\x8b\xe0(\xb0\xff\xa0b\x1e.5\xa54\xcd\xc4i\xec(T\x1c/\x15\xef\xe2\x9f\xd6\xa3\xabc\x02\xe1\x8e\x02i\x82\xf3\xbb\xb9]\x93\xaf\xa5\xbb\x0bX\xa0\xc8\xad\xbe\xb4=\x99\x9em\x80l\xcd\x9b\xe8BJ\x95\xbd\x1a4X\xf3\'f\xa6\x13\x8b\x06\x12\xc6\xf2?\x93\xfc\xe2ucs\xda]\x07@W\x9a\x93\n\x8849\xda\xaa5\t\xbb<\xb1\x178y\xe6\xc9\xa9\xe4\xf7\x02\xd4\xf2Q#\xec\x96\x9b\xaeB\x03\x04\x17\x8a$\x0e\xf8\x1d%\x87cep\xf4>BK\xf9zO\x1b\xba\xec\x98\xba\xca\xcb\xff`n\x86\n\xf5=\xae\xae\xcfM$\x85\x99n\xb1\xecK_l?\xbaK\xbe.\xc5\xede\x94\xb6\xec\xf7.e\x9e\x8e\xbc@*\xcf[\x94\xbc\\\xfej\xd9\xa3\x88\x97}\xdco\x92\xe9\xbe\xecVgB\xb2\r\xed>\xe27\xfb\xb2\xdd\xa3\x14t\xdd j\xb5+\x01d\xcd\xef\\\x13\x15i\xcb\xb5\xa7\xe2\x08q\x12\x91Yq\x8d\x90\xa2\xc0zu\xc0%\xcf2\xd4H\xb4\xb9\x06\x06K%tyB2\x8d=\xdd\x95\xc4"\x0bZ\xf2#\xd0\xc6\x95U\x84>\xa5\x84\xdc"\xe1\xf0\x95m\x06\x9c\xbbR\xe0TM\x11M\xfc\xabV\xd1\xef\xcaD*\x9b7\xefE\x9f\xff.\xa2(\xc5<@\xdb/\x9dv&\x12<=\xd8S\xb4\xad{6\xc3\xec\xb8\xa9\x17\xa9.F\x1d\xf6Q\x9ff\x8b)/\x89\x027\xf2zz\xbbB~\x86\xcc\x8f\x1e\x92P\xfe\x06.\x94 \x1b(\x90\xfe\xdf\xb6\x02\xeePW\x07{\x852nq5\xd7\x94\x88\xf9JV\xb1)\xac\xc3\x91\xe9\xedd\xaf\xe8H \xdb<!\x94N#\x0f\xf0\xbb\x82\x97\x8f\xbc;\xfdvoo\x98f\xfa\x17\xe0#s@\xbd\xb92\x0f\x99\x86\xcb\xf6\xa8T\x9c:\x88O\x8c\x0b`\xc6\x99\x18k\xf4\x08\x9d0\xc0\x98U\x15@\xc2f_\xb3\xf5\xb9\xc2\xa7P\x9b\xb6\x96\xea\xb5)\x94\xc0J\x87\xe3\x19\xe1\xf5\x8d8\x0eW&@\xf4\x92Q\x1a\x0b\xb0\x8a=\x81q\x8f\xb8\x0cN\xc0\xf4\xac\x03\xf6\xd4\'\xb0\xc9)\xf7\xa8\xe9N\xbb\x01\xd4\x15n\x1c\xf3L,,\xab\xd1\xe0\x7fQ\xa5\xca\xc8!\xadA-\xb4we\xe3\xb7\xce\xe24\x8a\x0e\x9a\xc15|w\xc42\x0c\x80b\x90\xc6\xf7S\'>\xc5\x85@m\xbc\xf2&f\xe2X\xa5\x8a\xc6\x0b\xa2\x96\x036\x95g5Q\xda\x07}\xb1\xb4)\xde\x1c\xd6L\xb5\xa1q\xedMEt\xc1\xbd\xc8r.\xafF\x00\x99\x16\xf2\'\nQ\xa8K\xec\x12\xb72\x08\x88\xda\xc0\x04\xece\x92\x15\x04\x8ca\xf6\xb2\xcd\x19?`gg\xfa\x8dg\xd9UH\xe8\xcc\xd7rqy\x8f\xcc\xa0\xdf9C\xf2\xc8\xe3\x18\xce?\xe88b\\!\x8fIO\xca5\x140\x08\xfe8\xac\x8a\xb5\xbb\x06\x19\x0c{\x9a~\xa5\xd7\xf7W\xd1w\xd0\x8f\xdf2\x8d\x01\x95~\xcc\x1f\xbe\x10~hA\x07z\xb9\xcd\x8f;\xee\xe9\xb0PL\xb7\xb9\xf3\x81\x99\xe4\x86\xb5\tE\xef\x9a\x80\xaa\xd8\xd2\x94\x0f\x95hR2\x16/\x08\xf2`t\x1b\xb4\xcb\x03\x10\xe6koA\xffk\xc2EV\xd2\x1ca\xef\xa6i\x05`k\x1e\x85"\x92\xa4Qaf\x1f\x8a\xd2I\x8d\xea:9\x13\xc0\x9e\x15z6\x1b\xea+\x9c\x81\x9dW\xa9\xcc\xd9g\x8d\x08\xa7\xb7\xec \xce\x9c \xf0L$O\xea\xe6\x01\x93zQ\xff=\x86\x9a\xc6\xd7GWHI\xde\x97\xa0\xcfk\xbc\x17\x98t\xb2<<\x93\x1bXF\xb6\x98\x84\xfb\xa2]YWd\xf3\xfd\x02K\x1a\x14^\xba\x0f\xd4p\xf7\xb4\xa7!\x14\xe9\x9d\xb5\x88VA~4\x12R\xd5\xfe/\x9fi\xd6\xc6\x89\xdb\xbffg\xbd\x96\xd5,O\x18q\xdc\x85\x12s/F\xd1\x80\x0f\xcf\x070\xd2_\x00\xf1\xe9g2\xd0\xfe\x89\x92_\x7fz\xcb\xb98\xf2\x05C\x97M\xbc\x95\xd1\xe3\x97\x1eC\xd5T\xc4\'+1\xce\xb7\xf5\xbf\xd2\xa8\xbe\x07\xad\x12\xa7\x11\xb3\x8dAN\x1e$7f\xf5\x1d\xb7\xc9j\xac\xabA\xd5\x16\x12$4\x8c\xac\x99\x08r\xd0\xd0\x94W\xff\xa4\xd4\xe0\x1a\xaf\xf5\xfb\xa3\xafo\xb2+\x96\xc4\r\x96{7\xda\xa2\x10\xd9;^w\xd18nn\xdf\x185Z{\xeb\xf17\xc6\x8b\xf4q\xb79\x85\xe5\x19\xab\x00H\x1d\x00\xec\x0ea\xeaq\xd8\x1c\x85\xf8\x0c\xbdE<:\x8d\xf3\xb6\xaf\xe7\x9d\xd1\xdc\xf8\x82Bk}\xcfb\xfbCM\x01&d\x8c\xfa\x9c>\xa9\x01\x8e\x17\xa2tj\x1e\xda\xe1\xafi\xbd~\xf5B\xca\xa5\xc5\xd3?\x8f\xe3f\xf7\x07\xb5\x89<\xc5\xe4\x9a\xec\xb3E\xcd\xa2\xa3\xb8R\xd8&\xd9\x9e\n-G\x14o~\x82\x12$z \xe81B\xb2E\xc3y\x1e\x10\x82\xb9"O|\x05zB\xb5\x91\xb1\xbb\xdc\x81\x8c\x88rS\x87\xb5\xba\xed\x19\xf6\x1d\xee\x15Qut|\xec\xc2\xfbi~\x1bX0\x1aF\xfe\x8b\t\x06\xfeCd\xe3t\xee\xc8J\xfbch\x0c\x93\xd7\x89\xce\xb7\xef\x98\x86\x93=\xc1ROc\x0b\x9ac\xae\x02\x8f\x97\x92\xae_9R\xc3\x02\xb9\x808\x9b\xeay\xbbR\x85\xbe\xfa\x81\xdeu\xf3e\x0f\xe5\xdft\x14\x8aa\xbf|\xd1\xd12\xa8~Nn\x19\xa2\xdaJCO=z\xdd \x08\xad)\x16\xb4\xe8\x08)\xbae\xc3\xd7\xad\xa8m\xcd\x9d\x8f\xa2\xe5\x08|\x0fV\xe5\xb8\x1a\t!\x04\x90\x8e\xd1\xb1\x14\x97\x1c\xecO mb\xfe\x01$\x84\x89\xa5\xe9\xa5\xea\x88\xbe\xbe\xbd\xdeiP\x10[|\xac[\\\xeeS\xe8\xa5\xde\x91\x0b[\x9c\x1c\xbb\x10\x8a\x1f\x9f3\xb5 \x812`zx\r\x8c\xe7A\xb7B /@\xa5\xb4\x879\xcd\x81\xf8\x15\xc2q\x9b\xa9gG\'\xe9\x89w\xebU]\xd4\xd5\xb3t\'~\x14x\xa9\xee|\x01s\xfd\xb3S\xf7\xff\xa6\xe5V\xc4\x0e\xe2\xf22\x07\x13\xf3+\x1b}D?+5\xe3\x7f(\x84y\x93\xe5\xdb<\xb2\x83\xe6\n\xff\xb2\xbb\x1b\x9c!k\x9c\xc2\x97\x90\xee\x88\xb60\x13\xb1\xfbq\xfc\x92\xb0-8E~q\xadHCY7\xd3\xec\xea\xca\xdf!#\';\xae9*\xb2\xb0F6\xc4\xd5\t/\x13b\x9e!7\xa8\x86\xef}\xd8;\t\xc4@\x8a^\xeae~\x83q\xf8}\x02\xb1W\x16\x14(,\x9e\x1e\xc4\xcb\xa8\xea+0-\x18\xee9\xe9O\xbc\x95\x0b\x0e\'?J\xd1\x00\x06\x8f\x89\xa7\x0c\xd0\x1f\x82\xf5\xd0\x0e\xdcN?\xdd\xef\x14|Ws\x0eu\x99\xe5\xd0\xc2E\xc9\xbcH\xf5\x9c\x94\xca\xfe!\x1f|j\xf0\x1d\t\x15\xd8\xa5t\x05*r\xf6\xce\xe3\x0c;\x82\xf6\xe3\n\x05\xa5\x7f\xcf\x87k\xe9P\x95\x18\xa18\xde\xab\x8an\xf8\xc6\xa5g\x8d\xeb\xda{&A[\xd6\xc7\xd3\xae\x9dk\x11K\xfb\x7f\xb6,\xa2\xb1\xac1\x8bEn*v\\\xf8\xd1\xf7m\xbb*7\xdd&\x1b\x96\xc2J\xb1[\x91\xee_\x901\xea\x98\x03\xf7\xdb\xaf5I}\\\xc2*;\x93\x1f<\x13\xaf\x8e\xf6\x02\xbe\\\xfd\xc0\xcf\xc9[\xfck\xb0\x1b\xde\x14pS\xff\x93;N\xce4B%\xb0m\xc0\xb5\x0cdn\x84N\xa6\x8a\x9b\xcd\xc9\x12\xf8g\x9bil\xf83Z\x0c\x96\xa6xNy7\xc3\xf0\x94\x94\x11h\xc7s\x06\xa0[\xb9\xaf\x86 Xx\x9feWD\xfc\xf5\'\xdedj\x9b\xfa\xbchF\xaaC\xe3w\xb0\x11\xd5n\x97\xfb\x1e\xd5\x08\x9e"\xe8y\x16I\x16L\x19A.\xbd\xf4I\xcf\xd9\xf6:(\xb0\x97\x81\x1e_?\xe1\x92\xe6\xb1\x8c\x9f\xa2\xa1\x15\xa4\x8a\xb5G\xd0\xfd\x1637\x04\x1f\xf1zM\xa7\xac\x0c\xad\x00\x81\x80>h:\n\xbf\xfa\xa5q\x9fW6\xbf\xbc\xc2$[\xd5\x0e\xc0\x1bbW\xc2\xe6\xe3J\x14(\xc6\xe4\xcd\x1a\xb5\xbbl\xbc Q\xd3\xf6\xf1\xd2\xe5\xb2\xbc\x01\xd5\x8d]0EtX \xb3+&\xf7`g\x18U\x83\xe5\xc0\x89_\xad2\xe9\xd5\x85\xdf-\xca)%\xfa\x1a\x1d\x9d\xa3\xd9O\x03>\xd8\xf9\x06%\xd2\xdf\xa9\xb0\x19\xd5\xec\xa8s\x8a\x84\x85\x8f\xd0"\x10@\xaf\xbf\xb5\x98\xcbq\x7f\xc8\x8e7\xac\xb7F\x8e\xa7\xa1SO\x91D\xee\xf0\xd6<\'[\x87H\\\xdb\xdc\xc0\xca\'\xca\xe3L\x85e\xe2\xf0\x98_c\xaa\x1f\x00\x0bK(@\xc3\x82^\x10\x05\xf0\xad\x98\xe7Q\x80\x0b))\x10\r\x83\xe72/\x12\x02\xda\x9c5\xcb\x87\xc0(\xab9\xdb3,\xda\xe0\'YK\x85\xf4\xc8\xfe\xf8\xa2*\xbe$-\xdfNH&)h\xd7\x1e\xc2i4\x95ubg\xfa\x12\xbf\xee\xdfyz\x9c\x9a\xf7\x16D\x93S\xea"\x1eM\x83\xb1uj\xd6Y\xd6o\xcc\xa3\x16\xc6#p\x14A\xbc\xee\xad+\xe2\x82\x9c\xb9=R\x82/#f\xae\xd0\x89!.X\xb0ET\xf3\x1eM\xb2\xca\x17H\xb6G?u\\\x13\xa4\x89#\x92\x06\x1bG\x95\x06;\xe9P\x9d\xa1(\xd6\x94\xcf\xad\x03\x99P\x16}n\xbd\x05MNHoU\xd9\xcf&\xa3\x8fq\xe5\xf3\xde\xd5\xde+#\xfc\xa1\x80\xa3CZ\xbb\x94\xdc\xec\x99\xf9J\x89H\xbf\\{\x01\xd5\x05\x08\xd0\x9b)\xc5\xda\x1e\xdf@\xef\x90\xd7q\xca\xe0/\xd8Z\xe02?\xc1\x7f=\x87|\x19\xce\xd67\x19\xa2mO\xbe1#\x1aJW\xa8[\xe1\xa7\xc0,\x04\xd0\xd8\xf9\xcfB$V\x81j\x1e\x10WPZ\xf1\xb5A\x10\x1a\xc6\xa0a\xdf\x99\xf6sA\x03\xd6\xff:SH\x8e\xe8\xb9\xbc\x06\xd1p+\x1e+\xc2\x18\xd9P\x8a\xf2\x08\xa2\x83\xae\xabs|2\x85RZ\x19~`\xdd\xef+oaQ\xa8`\x99F\'>\x01\x0f\x05\xd8\x0b\xe8\tt\xa5c\x84\x1b\x93\x82\x93h\xaa3\x08\x18n\x86\x05\xc1\xee\x90\x1b\x1c\xc8H\xdd\xdfj[\xfeq\x0bW\x0fe3m\x9c\xf9Y\xd2\xc5(W\x148\xfe\x015c\xa1\x07\x94E\xb6\xd1\x10\xca\xdd\x18P-;\xdf\x16J\xff\xe8\xab"\xfc\xb8\xd3\x03\x8e\x05(\x1643\'\xaf`\x9e\xd3\tt,B\xcd\xcb\x07\xab\xf8\r\xd5>d\r*\x89\xdb\x172\xe0~\xfc\xa6\x99`\xc5-\xac.\xe2\x82\xa4\xd4\xde\xc0\xce\x9f,B\xbc\xce\x1d\xacX\xf2,SX\xb3\x86\xc1{\xdb\xf2awfT\x88\x8a\xbd\x9e\x17\xc5\xdc\xa2\xcb8\xf5\xfa\x1ah\x91P\x86\xb0Jh\x92,\xb4wB\xe8\xe6\xfc\xf6I\x1d\xb1|C\xd0\xc2(/\n\xd6_\xa68\xbd\xf0\x9d\xaeg\xfd\xd7\x93\xcbD\x9a.\x16\xe0H\x1ds5\xe2\xf0\xb4\x83y\xe4\xf6\x8c\xbaP\xfd\t\xd4\xad5@\xe2\xcd9s\x85\xfd\xeakE]Yl\x80\xa8t]<\x97\x9e\xb1\x91\x1fB{qz\r\x96\xf2?n\x11\x9a\x81\xe1\'\x8bJM\xf8\x87\xe5X4N\x04\xc1\xa2\xad\xd4$K\xbd\xd5\x0e\x94`\xd8\x91O\xcf\xee\x01\x10;\x85\xe2\xe4vl\xd7}\x89\xe2\x19\xa3q\x04\xf4\xef\x7fi\xe6\xa8\xb4U\x0bpF\xa4\x98r1=\xc3\x9aZ=\x85\xdc\xa7qv\x18\xf1\xd8^\n\xe7\t\x0c\xf401\x93\x88\xa5\xfe\xc5^\x8bJn8\x1b\xd7Q\xbfE\xaf\x91O+\x03N,3\xfb6Y\xfb\xad.\xda\xd0=Uh\xad\xa9\x07\x1e\xd7\xa2\xce\x8b`\xd1\xd6\x00I\xd8\x9d\x07\xe0\x8a\x85\x0ew\x83\x8eC/A\\i\xee\x97\xb5\xb4\xc0k\xf4\x88\xd0B\xc4\x9b\xe3\xdf\x17\xdf\x85.\x04\xf5c\x96>\x0c\x17c\x1fs}&\x90\xab\x9d\x8f\x10L*\xc1\xce\x03\xda@B\xa2ML\xd6\xdc\x05\xf6\xff\x95\x15\x00\n%\x88\x1a\xfa]\x1e\xc5^;\x913V\x88\r\xa2\x0f\x9aKU\xa3\xf0=\xac\xad\xd4t\x0c\xc2_\x8d\xe9j\x0c\xda\xaf\x9b\xa0C\xdc\x90\x9a\xc1U!\xfd\'3\xae.\xfcf,5w%\x82/b\x0f\x03\xcb+\xc2\xd6\xe2a\x93pSx\xe7~qH\tM\xdf\x8b\xbcb\nd)\xf7\x007)K\xe8\x00f\x06\xd5\xb8P:\xfaO\x17\x1e\xfb\xcel`3&\xd77/\x14`$w\xfan\x84\xba\xf5$p^\xfd\x93M\xd5\x1a\x92\xbe\x9fQ\xe4:G\xb9\x93V\xb4")\xc1\xa7\xc5\x91\xdcY\x14f\xa5\x1e5\xb3\xddb\xab\x11\x16gN\xea\x0e;\x1a\x06T\x93g\t8"\x11SOj\x1f\x9cw8~\xfd|\xe4\xa3\x01\x1bB\xfd$\x96\xaa\x19\x87-\x87uf@\x9fj\x0c\xad\x99%z\x9b\xdb\xe8*\xb3\x8c\xe7\xc4\x87V\x83el\x10`\xf5\xea\xd9\xf0f/E\xc8$Y\xd1I\xd2W\x170\x086\xca\xa3xK\x17\x0bC\xf4\x86\x9f\r`\xd6\xae\xa0\x8ak\x04\x96:<\xc1\x94\x96\xc8#`\xdd\xf9\x8fG\xfa_\xc8\xf6\xf1\xa7\x1fE\x88te\xe1{/\xbd\xb4[\xd9\xed\x8e\x86\xb23-\x03\xb3K\xf4\xf0\xd4(\r\x9bk\xc17\xb8(P\xb0\xee\x8e\xe4\xf5\xc1\x99@\r(\xf6\x93\xb4\x041%3\xac%!\x11\xb8\xcd\xdc\xb1\x8b)%E\xed\xd4)\x88\x83@\x18\xc0ko\x8d\x14\x89uV\xed^\xc9\xd1\xa1\x165\xb1\x89@\xcb\xd4s\xd0\xfdQ\x05\xde\xd3z\x085v\xe8ND\xc3[},\x17\xe2\xc0\x81r\xa0\xb5\xc8\xd8\xcd\xf3o\xa9\xf1\xa6T\xa0\x90[7\xb9\x97\x98_\xc5-.Z\xb1\xae\x95d[\x9a\xad\xd7\x16\xa7V^\xd5\xd5\xe5vH\xc3\xa5\xd7\xb3)\xee\xe5\xa4\xaa\x8d\xdb\x1aR\xde\xc4%J\xeeU\xe1\x07\x81\xff\xc3\x90\xba\x80I,R\x94`|E\xadz\xc0\xe5\xa2\x8du\xac{\x08\x92\x129\x96\x97\xbeo\x1d;\x1a\xf1\x83\xbb\x93\xfb\x95\xaem\x8d\x86,\xbb\x88I\xf0\x17\xff\xaf\x8atr\xb1B`\x7f\xc5\xc8\x8cr\xe2\x08\xff\xf1PY\xffc\xfa\x9f\xe1\xcc\xab\xfa\xb6\xa0\x15O\xdf\xa4>\x94\x10\x15)\x15eDE\xe7`G5$\xe4\xf7\xad\xd5\x9aTc#\x90\x022J\xd6\xd1\xa0R4\xde\x18e\xe4\xb3Mn\xf9\xae\xdd\xeb\xa0\xa09\x14i\xac\xeem\x8e\xbb\xc8\xc0D\x08h\xe5\xd7@e\x9a\xfc\xc3\x806\xcd"\xb9T_\xf7\xf6\xe4\xbfa]\xe5\x1cJ\xbep\x13\\\xca\xd0\x7fP\x89N\xfa\xf7IS\xdfR*"\x9e\x8c\xbc\x99\x10\xfc\x8f\x02\x1a\xc1\xa1\x82\xb7\xe1->Or\xc7\xf1\xd0\x91F\xb6\xf7\xa3^$k\xf9\xd7\xf8\xfd(k\xf7-\xb5p\xc0\xac9\xa2\x0e\xde\x80\x86P\xbd\\\x11\x9a\xd5\xee+\xf7@g_\xf6y\xd9b.-\x02\xf4V\xed\x91\x8c\x0b\xba\xbbl\xd7A.\xf6\xf5\xc3\x9c\x01;=\x19\xbf\x87\xdc\xc3\x89\xfb^B>\x93\xa7\x9b\x82g\x98\x9e\xc7\xa4nO2\xd0\x99\xd2ON\xbfK\x03]\xe5$a\x07\xecv7\xf5\xbc/\xa8\x9b\x8a6q\xbeu\xe5\xc4;\xe1\xfb|\xe2\xd5\x11hX6~*\x9a\xca\xec\xc1\xa9\x07\x1eqd\xa2&x\x00\xd3a\x11\xf2\xeb)^\x03\xba\x11\x11\x91\x94\xcd@\xc7\xd9\xaf\xdb1\xd4\xd0\xcd\xa1P\xb1\x0b\x1e6]\xf7\xf5oE\xecI\x11\xcd\xafdh\xfb\x19\x9a\xcc6\x03e\xea\xe3\xf8\xcdxM\xce\x10\xf8\x85\'P1\x8e\xb6\xb0\xf4\xc9\x05\x928M\xa5\x87\x80Yq\xc7\xc8\xf3\xe3j\xc6\xd4\x84\x8e,ii\x1d\x1f\xc0*\x83:t\xf8=\x1esh\x01\xbbM\xb4\xe27\xda|\xde\xa1*61\xae\xf7\x9c\x8a\xd19\xa4\xe1\xf6\xd5l!\xa8?w\x97/\xf1\xfbO\x04\x84q\x16\xf0\x92\xe9\x17\xd5A\xec\x162\xfdL\x11\xdf\xe4\xec\xbel\xeb\x98Di\xb8\x1f\x1a\xc9\xdda\xdf\xf5\xda\x9f\x8b\x17\x01\xd1\xf5B0\\\xe5\xb7\xa6\xd8\x15{\x91\xf3\x10\x1c\x98O\xdd\x84\x8b\xb4\xa0\xbe\xdaAG\x997\xbc\x10\xb5\xf2\x81\xccj>\xeb \xde\xafv\xf9\x1b\x8a\x86\xe7\x1d|\x00x\x05\xdf\x19\r\xbb\xf1\xa9\xd6B\xbem\x08\x1c&\xce:z)\xdbAW\x9a\x886W\xb7^\x19^\xe2\xbc\xed\x05\x1f\xaa\xfaz\x18\r\xdaz\x81\xd2$\x1a\x9a\n\'p9`\xfb\xfe*X/\xf79\xb2\x82\x12K\x89\x99_\x8e\xd1\x83\x86\x83X\x16\x14\xd8\xb2\xc5\r+{\xe8\x97\xc7\xe9\xc1"L|^\x14 r+B\xf9}\xff>v\xdf\xdbm\x92\x9d\xea\x12\xed<D\xd3[E\xc9\xc1W\xc3\x1e\x16J\x922\xc4 \x81D\x0cY\xe6I\xe0\x84lf\x07\xa1R+\xce\x9dC\xe1\x8d\x1b\xcdk\x1f\x1c%HM\xaf\x7f\xb4v-\xf1\xaf]\x83%\x8f\xb5\xc3\xcf\xc9A\xd1}\x13\xb5\xe8C|\xfc`\x94\xaf4/\xf9\x9eS\x914 \xf6}u\x9c\xd7\xbe\xea\x9bq\x8f\xec\x8c\xb2\x98d\x03L\xa5u$&p\x82r\xb3\xac\x16#\x1b\x17\xe6\x1a5\xe2T\xa4\xc1n\xc1\x9a\xc3\xfbB\xfdb\xf2T&\xcd\x1d\xbb\xf9g\xe9ue/>\xfd\xab\x16\xa1t\xb0o0o\xdbhB9\xad\x0e9\xc5M\xbf\xb6F<-o\x8a\xfbe\xea\xc8\x03\xf4N\xa2\xa4l\xce&\xd9\x1c:D\x9a\xd4jw\xcatc\x89L\x89\xaeO\x03U\xa3g\xc2\x8a0\x8b5\xcfP\xce\xd6z\xd2\x86\x81\x19x\xef\x9a\xc0\x93.A\xe7=\xc7$\xd3\xe1\x88\x0e\xad\'\xc0|!\x8cJ7\xf9\x01i\x14\xb7q\n\xcd\xd82\x84\xc5\xccU\x92\x10!\xcf^\x1c\xb4x\x10\x91lE\x82\xad\x83\x08(\xe7\xb3\x0c\x92\xcc\xb4\x93$A\xb6C\x0cZA[\x84\x84\x9b\xc3\xf9\xdcb\xeb\xc0\xe63\xb0\xd1\xbcH\xbb\x8c\xd8\x91\xbe\xbel\x06\xf5\x9c\xceJ#1r3\xc2i\xf5\xff\xf6\x98\xebp`%\xb4\xd2E\xcbw\xfc\x95\xc3\xefH\xf1\x97\xc98\x17\x8f\xde\x13Q\xfdB\xff\xd9\x7f\xcb(W\x8b\x93\xd7\xa9\xb0\x91\xea\xe8,\x14\x07\xc2{\x08\x92! \xd67\x9f!\xaf\xeac\xba\xff\xb3\xba\xae\xea\xc5\xda\xd2\xe7\x9d\x81\x189[\xd2l3-\xfc\x16\xaa\xfc\t\xbb\x9c\x13\x98\xb8\x8c[\x00\xc5\x87\xdd\xa1\\;3\x87]\x12\xb2p\x17W\xeb\xb37\rX\xad\xd4F\x1e\x84\xba\xeb0\x94\xf0\xbc9/4\x10)q\r\x08\x12\x89\x0eG.H\xbd\x07>+\xcfz\xb5X)6\t\x9d\x8f\xce\xda\x93.\x98\xf2\xa0\x81^M\x1e\xd9\x89F#\xf4B\xd2A9y^\x7f\x14\xac\xda%|\xdfz\xea\xeb[\x0f#\x16\xbd\xcff\xceQ\x02R\xa5\xc3\xf0\x0c\xda\xaeM|!4]j\xd7v7\x92\xc6b\xcf2r\xacE\x14\xacV\x00\x14\x0b\xa2h6\xd2m\xc8\xf5Q\xe2\x04\x03q\x92x\xdaA\xbcs\x19Q\xac\xf0RH\xe8B\xe9%/\xa0\xe9\x15\xf1\xe7\\.\xd7\xf7\xfe^Z&Ut\xb5\x1a\x05V,s?\x9b{\'9O\xb3\xbb\xde\x893,\xe8\xf3\xbb\x9a/\x14]W&#\xbe\xc7\xb8B\xf3\x9b\xdf\xeb\x00\x13\xf5Y\xb3\xce\xc91O6\x98 \xbbJ\x1e\x96}p\x18\xe9hd\x020\x9e\xe9\x02,\n\xcb&\xda\x96U\xc3C\n\xf6\xde*\xfa\n\x90\xbc\\\xaf&>\xa5zvD[\r\xc7\xe80\xa0D\x15\x90\x04\xba"\xd8_\x91\x87i\xe8\xb1(K\xee\x95s_0\xccC\xdd{\x1fa\x1f\x00\xbe\xae1`u\xf9\xea\x9a\x83\xec\x95M\xc77\x07;\xf1;\xf7"\xf3\xa2n\x8c\x146^\xa6~\xbd0\x99\xd7\xeb=k\x87\xaa\x981\x882\x8eh\x13\xee\xd0\x01[\xb1\x854\xfciw\x87\x8b\xbb\xf1\x82~k`\xcb\x9f\xd6L\x08t\x03,\x00\xcf\xd5\n\x1e\xb3\xd9\x82\xf5\x95x\x01\xcfY\xc8\xe2\xd9\xf0\xe8\x8bX\xd4\x07T\xd6!\xebE\xef\n\x1b\xff\x1c\x83\xc9s\xccY2\xcak\xc1\x9f\'\xc8\xbc8\x85\x8b\xdf\xb6\xf6\xbf\xc3(\x13\x07\xa7\xfdS\xee,\xbf4\xd7\x8eAZvv\x13\x7f\xe54q\x18\xa3R8\\\xbd\x1e\xcd;\x8b\xf1c\xac0\r\x1c\x04\x1c\x94\x98\xce\x06+\xaf\xb3\xeb9\xea\xa5\xaa\xc6<\x81Of\xf49\x9e\x87K2V+\xa0\xa8C>\xf2|OM0?\xfe"\x04\xf0\xae\xede\xef>M\xa3\xb5P:\xed\xcc\xb5^\xae\x8f$\xf8FD}\xb1*\x9a"X\x8a\x08\xba_\xa6Xd\x96\xfb\xf2\xcf?1\x9b|\x90^+\xb9\xdc\x11\x8bI\xcc\xe9\x7fn!\x0bQ)\x9cE\x9d\xe5@L\xe6\x9cZ\x91%\xc1\xb0\xf2w\xa2\xca")I#\xd8\xcf\xb4<1\xde\xb9\xf6\xca<-\x19,\xe7\x8f\x17\xe3*[FE\xb9\xb15-\x9eM\xc5\xa1u\xa5\xd7\xf9\x1c\xab\x0c^K\x95\x9a\x1ep5O!\x1e\xfc\x86\xa7\xdeIa/5+\x1c\xd1F\x14\x92\x84\xaa\xa9\xe0\x9d\xd8\x9bx\x9e\x0eg\xdb\xbf\x82/\xc9P\xacn\x0cV\xb5qCgQ\x9bY(4w\xc6\x86\x7f\xb5\xe21\x86\x0c\xfd)\x95\x08\x886\xf5\x15V|\x07\x9a\x7f\x974\'\x11\x15\xb9@\x9c\x1a\x85\xb4\x95>\xe5\xe2\x0b\x08$\x958;[\xf7\xa6\xc22S\xa4A\xd7O\xd4~]\x0f8\r\xd9\xde\xbc\xe6\xb5z\xfc\x8f\x0c XQ\x9d\xf4\x01\xf1P,oZ\xbd\xca\x08(\x8c\xae3\x8d\xfe\xb17\x93\xc5\xaaL\xdc\xa1\xa1\x94\xf8\x93\xf8r/\x8e\x10\xe8\xff\xa5-\x80\x8a?m\xf8\x192\xc0s\x83V\xb6\xca\xec\xb7\x94\xd3-f\xc9\xdb\x1fFx\xc2\xc7\xae\r\xfa\x14\x8e}\xb4\x9e\xe8\xef\x1a\xf4\xc0\xbd\xc1\x80W\xd7Q\xec\xeb\x9f~{\xe5e1\xa2\xa0,\xf5\x03{\xedY~:\x94\x99XR\xb7p\xcbhmY/\xf0v\xcdE_\x8e?\x87\x11\xd4\xa1a+~\xd6q\xc6N\xc0\xfa\xb2\xea\xeb)\xb4Qp\xae\x91\xefae\xe6\xbb{\x9a\xe9\x93\xec!\xbd\x9d\xc5\xfc\xb5\x00\x13\xef\x06\xb3\xa4j\xca%\x01\x8e\xd1\xf1\xd8vC\xff\x14\xf3NI\xc1\xbb\x19\xeao\xed\x9d\xce\xcf:\xb8F]\x8f\x03\x0e@\x9a\x12X4\x9e\xcd\xb7w\xf2\xeb\xbb-j\x80\xc3\xe0\xa0\xa9\xaf\xa2\x10%p\xc0\xf96\xcd\xd5\xb2\x06\x8f\xa7\xb3\x92\x8e\x85\xa9\xe8\xfb\x08\xdf\x9du\xf6&ih\xbc\xcak\xb8.\x87\x04\xc9g\xad|\x88#1W@\x99ae\x92N\xa1\x1d\xd0N1Ie\xa3\xa8\xcf\x01\xdck[\\\xd8\xd4B\x0b\xf4\xd5-\xca\xd1>+;\x85M\xe0bm\x18\x19\xd5\xaf\x83rT}|\x81\x1fT1\xd8\xc3S\xf9q.\xc0\xea\xf0\x89\x08$w\xad\x0c#\xf00\x969\xb1`\x92\xb7\x9e\xdc\xcb\x8e\x9c\xe9\xe3\x94$X\xa3\xc2~\x1aU\n\xb0|\x18\xae\xfa\x8b\xab\r\xae\x80\x13\x03\x89\xe1\x91\xcb\xed\xea\xf3@\xbfL\x84\xb6\xcfW\xb5X\xc1\x07\xd6\xe6\xc2m\xb0\tL\xee\x84\x95\xa4\x1a\xdcWCr\x11@\xf1\xf3\x9fd\x99k\x10mX\xd39(GL\xc1\x86Pg\x00Y\xe9\x81\x81\x81\x15\xd6\xc6U\xf4\xb0\x9ca\x8c\x1dc\x04K\xda\xfa\xca\x8f\x08{1\xab\xf5z\x1a\xe9\xb7}\xe2\x16;\xdd\x1c\xc7@\x9a\xa8W \xa8h\x99s\xa1\xb0i2;V\xc3\x8aJ~\xcb\xe9\xb3I\x07\xe1\xd6\xe1\xeb ]+\xc3Af(\xb6!O(\x88\xccI\xfet\x91S\xe8\xdf\x1f:\x0f\x81qAm\x1d\x1d\x9c\xc1\x83\xb3\xef/>;\xab\x87\xdd\xef\x9er\x1e\x02\x0f\xd1\x94B@\xddK\x9e\xc6\x15H\xb8N\xfb\x06\xc3wpC\xa2(\xc8\xde\x1e\x8cV\xb9\xc1\xe0\xa7\xa1\xebO\x03\xe2\xec`\xe5\x87*\xbd\xc0\x9f\xea\xdd\xc4.e\xf83)\xb5\x1b\xe3\xb8\xc8c\x06\xfa}R\x8d\xae\xcdT\xd57\xba\xf4\x97\xcf\xc7\xe5\x0e/\x0b\xfc\x18CC:\xdc\xd2\xaf\xc4\xd7M\xd1\xdf\xe8*\xeeP\xff\xf0\xdc5\xc4[K(a!5\xbfZ\x87\xc0\xdfn`k\xf7\x1e\x93x\xac\xfd\x14\xf7\x94\xf1\x9d\x01n\xff\xf8\x8e\xc8\xa2jD\xc0\xf3^\xd9 \x92\xf7\xa2\x82O\xd9\x1f\xa0\x1a\xa3\xeev^*)\xdd^\x0eL:\x04 ~\xa8b*\x8b\x96\x90 p\x7fgx`\x9f\xf9R\t\xe5\xaa\x96\xef\xbf\xb1%t\x14\xa1r\xe0+5W\x96~\xa5\xc3\x84pO\xceq\xfaF\\\xe8\x9f\xc0#2D\xc0K\xb5\xa7,4\x96{}vW\xb0\x8a?\x14\xf0\xc1d\x9e\xc8\xed\x9d\xcd}\xb3\x8f!\xb9(\xe4*H\xf8\xff\x19h\x99c\x90\x14}\xe6\xd4-\xfb\x18\x98\x90\x83Xa_\xc9\x10\xcc\x96\x88,\xb1\x7f`93v\'\xf7\x8b\xf7\xa1mb\xf2F\xfe\x14<Gs\xf2\x90@U\xd3=\xe41\xa7\xc2Nc4\xae{[\xbd\xdd\xcc\x0b\x93]0)\xf2\x11|1\xde$\x0c\xadK4\xac\xd2L\xdb\x9fu\xfc\xbd\xfdk\xde\xacw\xb0\xaa\x88\xb9\x04\x9c\xb1?\xd6\x9b\x83>{\xd4@\x0fy\xd6\xba\xb4\x9ci\xf0,3\x04\xc3\x9f\xdf%\x85\xb6\x0b\xc7m')
|
1
|
+
import click
|
2
|
+
|
3
|
+
|
4
|
+
from hiddifypanel.panel.database import db
|
5
|
+
from hiddifypanel.panel.init_db import init_db
|
6
|
+
from hiddifypanel.models import *
|
7
|
+
|
8
|
+
from hiddifypanel.panel import hiddify,usage
|
9
|
+
import random
|
10
|
+
import uuid
|
11
|
+
import urllib
|
12
|
+
import string
|
13
|
+
from dateutil import relativedelta
|
14
|
+
import datetime
|
15
|
+
|
16
|
+
def drop_db():
|
17
|
+
"""Cleans database"""
|
18
|
+
db.drop_all()
|
19
|
+
|
20
|
+
|
21
|
+
|
22
|
+
|
23
|
+
def backup():
|
24
|
+
dbdict=hiddify.dump_db_to_dict()
|
25
|
+
import json,os
|
26
|
+
os.makedirs('backup',exist_ok=True)
|
27
|
+
with open(f'backup/{datetime.datetime.now().strftime("%Y_%m_%d__%H_%M_%S")}.json','w') as fp:
|
28
|
+
json.dump(dbdict, fp,indent=4, sort_keys=True, default=str)
|
29
|
+
|
30
|
+
|
31
|
+
|
32
|
+
def all_configs():
|
33
|
+
import json
|
34
|
+
valid_users=[u.to_dict() for u in User.query.filter((User.usage_limit_GB>User.current_usage_GB)).all() if is_user_active(u)]
|
35
|
+
|
36
|
+
configs={
|
37
|
+
"users": valid_users,
|
38
|
+
"domains": [hiddify.domain_dict(u) for u in Domain.query.all() if "*" not in u.domain],
|
39
|
+
# "parent_domains": [hiddify.parent_domain_dict(u) for u in ParentDomain.query.all()],
|
40
|
+
"hconfigs": get_hconfigs()
|
41
|
+
}
|
42
|
+
for d in configs['domains']:
|
43
|
+
d['domain']=d['domain'].lower()
|
44
|
+
# del d['domain']['show_domains']
|
45
|
+
|
46
|
+
def_user=None if len(User.query.all())>1 else User.query.filter(User.name=='default').first()
|
47
|
+
domains=Domain.query.all()
|
48
|
+
sslip_domains=[d.domain for d in domains if "sslip.io" in d.domain]
|
49
|
+
|
50
|
+
configs['hconfigs']['first_setup']=def_user !=None and len(sslip_domains)>0
|
51
|
+
# configs
|
52
|
+
|
53
|
+
print(json.dumps(configs))
|
54
|
+
|
55
|
+
def update_usage():
|
56
|
+
print(usage.update_local_usage())
|
57
|
+
|
58
|
+
def test():
|
59
|
+
print(ConfigEnum("auto_update1"))
|
60
|
+
|
61
|
+
def admin_links():
|
62
|
+
proxy_path=hconfig(ConfigEnum.proxy_path)
|
63
|
+
admin_secret=hconfig(ConfigEnum.admin_secret)
|
64
|
+
server_ip=hiddify.get_ip(4)
|
65
|
+
admin_links=f"Not Secure:\n http://{server_ip}/{proxy_path}/{admin_secret}/admin/\n"
|
66
|
+
domains=get_panel_domains()
|
67
|
+
admin_links+=f"Secure:\n"
|
68
|
+
# domains=[*domains,f'{server_ip}.sslip.io']
|
69
|
+
for d in domains:
|
70
|
+
admin_links+=f" https://{d.domain}/{proxy_path}/{admin_secret}/admin/\n"
|
71
|
+
|
72
|
+
print(admin_links)
|
73
|
+
def admin_path():
|
74
|
+
proxy_path=hconfig(ConfigEnum.proxy_path)
|
75
|
+
admin_secret=hconfig(ConfigEnum.admin_secret)
|
76
|
+
print(f"/{proxy_path}/{admin_secret}/admin/")
|
77
|
+
|
78
|
+
def init_app(app):
|
79
|
+
# add multiple commands in a bulk
|
80
|
+
#print(app.config['SQLALCHEMY_DATABASE_URI'] )
|
81
|
+
for command in [init_db, drop_db, all_configs,update_usage,test,admin_links,admin_path,backup]:
|
82
|
+
app.cli.add_command(app.cli.command()(command))
|
83
|
+
|
84
|
+
@app.cli.command()
|
85
|
+
@click.option("--domain", "-d")
|
86
|
+
def add_domain(domain):
|
87
|
+
table= ParentDomain if hconfig(ConfigEnum.is_parent) else Domain
|
88
|
+
|
89
|
+
if table.query.filter(table.domain==domain).first():
|
90
|
+
return "Domain already exist."
|
91
|
+
d=table(domain=domain)
|
92
|
+
if not hconfig(ConfigEnum.is_parent):
|
93
|
+
d.mode=DomainType.direct
|
94
|
+
db.session.add(d)
|
95
|
+
db.session.commit()
|
96
|
+
return "success"
|
97
|
+
|
98
|
+
@app.cli.command()
|
99
|
+
@click.option("--admin_secret", "-a")
|
100
|
+
def set_admin_secret(admin_secret):
|
101
|
+
StrConfig.query.filter(StrConfig.key == ConfigEnum.admin_secret).update({'value': admin_secret})
|
102
|
+
db.session.commit()
|
103
|
+
return "success"
|
104
|
+
|
105
|
+
@app.cli.command()
|
106
|
+
@click.option("--key", "-k")
|
107
|
+
@click.option("--val", "-v")
|
108
|
+
def set_setting(key,val):
|
109
|
+
old_hconfigs=get_hconfigs()
|
110
|
+
hiddify.add_or_update_config(key=key,value=val)
|
111
|
+
|
112
|
+
return "success"
|
113
|
+
|
114
|
+
@app.cli.command()
|
115
|
+
@click.option("--config", "-c")
|
116
|
+
def import_config(config):
|
117
|
+
next10year = datetime.date.today() + relativedelta.relativedelta(years=10)
|
118
|
+
data=[]
|
119
|
+
if "USER_SECRET" in config:
|
120
|
+
secrets=config["USER_SECRET"].split(";")
|
121
|
+
for i,s in enumerate(secrets):
|
122
|
+
data.append(User(name=f"default {i}",uuid=uuid.UUID(s),usage_limit_GB=9000,package_days=3650))
|
123
|
+
|
124
|
+
if "MAIN_DOMAIN" in config:
|
125
|
+
domains=config["MAIN_DOMAIN"].split(";")
|
126
|
+
for i,d in enumerate(domains):
|
127
|
+
if not Domain.query.filter(Domain.domain==d).first():
|
128
|
+
data.append(Domain(domain=d,mode=DomainType.direct),)
|
129
|
+
|
130
|
+
strmap={
|
131
|
+
"TELEGRAM_FAKE_TLS_DOMAIN": ConfigEnum.telegram_fakedomain,
|
132
|
+
"TELEGRAM_SECRET":ConfigEnum.shared_secret,
|
133
|
+
"SS_FAKE_TLS_DOMAIN":ConfigEnum.ssfaketls_fakedomain,
|
134
|
+
"FAKE_CDN_DOMAIN":ConfigEnum.domain_fronting_domain,
|
135
|
+
"BASE_PROXY_PATH":ConfigEnum.proxy_path,
|
136
|
+
"ADMIN_SECRET":ConfigEnum.admin_secret,
|
137
|
+
"TELEGRAM_AD_TAG":ConfigEnum.telegram_adtag
|
138
|
+
}
|
139
|
+
boolmap={
|
140
|
+
"ENABLE_SS":ConfigEnum.ssfaketls_enable,
|
141
|
+
"ENABLE_TELEGRAM":ConfigEnum.telegram_enable,
|
142
|
+
"ENABLE_VMESS":ConfigEnum.vmess_enable,
|
143
|
+
# "ENABLE_MONITORING":ConfigEnum.ssfaketls_enable,
|
144
|
+
"ENABLE_FIREWALL":ConfigEnum.firewall,
|
145
|
+
"ENABLE_NETDATA":ConfigEnum.netdata,
|
146
|
+
"ENABLE_HTTP_PROXY":ConfigEnum.http_proxy_enable,
|
147
|
+
"ALLOW_ALL_SNI_TO_USE_PROXY":ConfigEnum.allow_invalid_sni,
|
148
|
+
"ENABLE_AUTO_UPDATE":ConfigEnum.auto_update,
|
149
|
+
"ENABLE_SPEED_TEST":ConfigEnum.speed_test,
|
150
|
+
"BLOCK_IR_SITES":ConfigEnum.block_iran_sites,
|
151
|
+
"ONLY_IPV4":ConfigEnum.only_ipv4
|
152
|
+
}
|
153
|
+
|
154
|
+
for k in config:
|
155
|
+
if k in strmap:
|
156
|
+
if hconfig(strmap[k]) is None:
|
157
|
+
data.append(StrConfig(key=strmap[k],value=config[k]))
|
158
|
+
else:
|
159
|
+
StrConfig.query.filter(StrConfig.key==strmap[k]).update({
|
160
|
+
'value':config[k]
|
161
|
+
})
|
162
|
+
if k in boolmap:
|
163
|
+
if hconfig(boolmap[k]) is None:
|
164
|
+
data.append(BoolConfig(key=boolmap[k],value=config[k]))
|
165
|
+
else:
|
166
|
+
BoolConfig.query.filter(BoolConfig.key==strmap[k]).update({
|
167
|
+
'value':config[k]
|
168
|
+
})
|
169
|
+
if len(data):
|
170
|
+
db.session.bulk_save_objects(data)
|
171
|
+
db.session.commit()
|
172
|
+
|
4
173
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
174
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
@@ -1,5 +1,60 @@
|
|
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\x008\x0f\x00\x00\x12\t\x04\x00\xc8R\xc0\x1ba\x84\xfaW\x0f\xdd\xc0\x9eM2\x03\xeb\x00\x00\x00\x00\x00\x00\x00\x00\xcf\xd8/\x93\xae=\xba\xb1\x8b\xd1\x08\xc0\xb1\x17,\xee,%\x8ch\xc5\xbe\x8f-\x0e\xf4\x1f\xf6z\r\xd7\x93p(7\xd7\xba\xa2H\x8c\x9a\xa5\x83\xa9\x0f\xbf\xb3\xcd[\x0eE\xd6\x80\x1b<\xe4\x95\xcc\xbb\xe9\nP*\xea\xb1]\xeb\x87\xe8\xec\xad\x15`g\x1c\xf3 \xa8\xeb\xaa\xe9.I\xc7\xe7qr\x01\xee\xa3\xae\xcd\xeb&\xfd\xafT\x04.m\xd1>R\xc2\x16B\xc0HN\xa6\xe5\x82a$\x08\xe1zz=\x93\x85g\xb1\xd6\x12<\xd0\xb6w\x0f\xf3\xd9\xfa\x11\x82\xd5\x10:}\xe8\xe4\xf6V\xd0P:\xe4:K\xe4p\xcd\x14\xbfz\x1a>\x8fUnP\xc7!\xcfGh\x8d\xb7 \xd1\xc6u\xd9+\x85\xee\xfb\xd8\xe7V\xa92+@\x02zsH\xb3\xb8\xdbt\xed^[\xe3\t\x9d\xdc\xfc\xffU\xeb\x00.\x923\xe4\x13\x10!\x81\xa3 ?\x81\xec\xf26\x03\xb9\x18A\xefx]\x7fd@/\xdc\x95\x93\xbb23\xf3\xba\xa5\xf2\xe1\xe9\x8c\xcc\xd3o\xe7s\xb7\xdc\x18\xe5sx\xc7\x18=\xb8\xa96\xe4X\xfe\xc8K\xee\x07M\xf8\x1a\xaf\xeb()w\xa6\x91\x02v\x8a\xb4\xcf\x92\xa94\x8a\xf7\xa35\xca\xc5\xd7\x10\x8c|\xa1\xda\xca\x1b\x8e\xf6\x85y\x9c\xd9\xd95G9z\xa52\xbe\xaf{^\x18*\xcc7\xc6\xab\xd4\xf7\xfe}\x86\x10\x9a\xec\xaa\xd1\x04\xa1/p)\xdc%\x03\xf2\xe6\xee\x8e\xa1Y\xd1\xc7#\x89#\x98\xdd\xd3H=\x93\x89\xc3\xb9S\xb4\xa0\x8d\xfcd\xe0\xfcq\t\x13\x8c\xcd^\x17\xc84\x9a\xaa\xc5a$\xa8_B\xf8\xf1=e\x8f\x8b\xe5\xc0\xf9\xb5.\x10\xc3\xeb\x9e\x8b\x01\xed\xea\x08\x10\x02%\xc3\xf1\xda\x12{\x14,\xf5\xed#W&\x04R\xf0h\xd1e\xe7\xe9\xf2\xee\x1e\xe0\x03\x93K\xd8u>4\x84&u\xe0l\x85[\x96\x17\x8dw^{\xc8\x8a\x0c%\xca\xce\xb8\xa1\x02\x9aV\xd4\xc4y\xc2_\x917\x8b\x98M\x9f\x81\x19\x0bct\x132\xe3\x91\xa4q\xacj\x8d\xc5\xa3\x98\xdb\x18\xf01\xf0\xae\xcb\x0e\xd9\x14\x8a+I\xc3\x12\x92\x1e\xb8~V\x9a\x8e\xb6\x94>\xe6\xbb\xbac\xbc\xaf\x0c\x16,\x87\x7f\x0c\xf7\xba\xba\xceb\xee 4\xc8\xf7\xaa\x84\xda(\xea\x03\x0f(z\x8aS\xb9vZ\xcdpMo+\xeey/\x133\xd0\x05~\xb61[\xdc\xca\xb9PY\x1an\xba\xd9\x87\xf0\xbb\xbb\xa2\xa6\xb0X\xc0\x1fZ1i\xe5\xa38\x90\xeb\xa4\x92\xdcB\x9e\x8c\xf1L,\xc9\x10\x96\xb9f\x9e\xe6\xfcW\x18N<\xf8\x85\x97`\xbe\xfb:P\x9d\x08\x16\xf6\x811\xe0\xf9\x16\x02\xc9\x13\x90\xd2\x8d\xf8d\xc73V\x03\x1f\x03/\x837!6w\x10^g=\x96q\xb2\x17)2\xc0\xcb\xb8\xdb\x0c\xf3\x0c\xb2qv\x10^\xedE\x1e\xf3\x90^H\xe6\xe4\x1a\xa1\xd6\xe6?\xf1\xe2\x82\xdd\xc0\xb8\xa6\x8a\xa5\xfe\xa6G\x87\xf7!-\x95U\xb73\x83\x85\x02+(A\xd4\x8f\xef\xbdrw\xa9\x9dFa\xa3\xb5\xd0\xabj\x87\x04\x05\x00U1\xca\xf2\xa5(\xf8\xac\x98>\xd7\x05\xbe\x1ci\xfd\xf6B\x7f\x9f\x07a\xf9\xc3\xa6\xc3\x05\xe7\x15\xa0\xb2\xad&\xb6Z\x117o \xcd\xe9R\xde\xbc3\xfajb\xff\xda\xb60\xa6<F\x1c;\xa7\xc5Hf^\x8b\xe7h\x19\xa8\xaa\xf7\xf6>&\x98P\xa7\n\x94\xaa\xdap\x1d.\xd9\x88\xda\x85s\x1d2\xef\xdd\x11-\xdb\xbe!O\xa8\xb0\xb7\xaaXoO\xcf\xa6T\x01\x9f\xdb\xf7\xcf\xfd\x91\x1a\x14**_O\xfaw\xdd\xe2\xa5K\xf5P\xd1!\xeb8+\xbb\xf93|C p\x9dcKUr\xfe\xb3*\xb8\x9cl\x9d"\xce\xab\x00\x90\xfe-\xdcT\x07\x80\xa6\x96\xab\xd4i\xd01\xa2W\x98\xe1|C\xfcrx\xbbF#*F\xfd\xf3\x97=o\x17\xa6\xc7a@]\xcb\xbe\x02\xe7\xda\xb8\xb1\xb9\x1e\xef0N\xb50\x7f>\'R\x02\n\x83\xd6E\x85\xad\xfez\x95zk\x9ePJ\'\xee,\xcb\xf4\xe3\xa6a\xd6\xfe\x1a\xc9\x8e\x1cG\x08j\xca\x05hQ\xb3~\x94Q\x01\x04@\x96\x19\xadG\x04@\x81\xd7\xb5e\x10\xc8\xd3%O\xd8^\x8b\x08\xf4\xa7\xf0-Wv*\xe1\x1c\xf0\xc3"f\x03\x1e&\xa9\xd0dM\xa6\x9d\\k\xae\xdd\xef@|\xd6\x05&o\x92\x91\n]\x0c-\x88\x17\xf9\x8c\x87\xa6&\x05l\xc2I\xcd\x17I\xc9\xcc+\xc9v\x07\x1c\x9a]\x9ed\x0f\xf8\x0b\x9d\xcdj\xba:\xb5r\xfe\xa4\xbf\xfb\x00\x00\x06*\xa9\xff\x9d\x13\xa7\x10]\xe8\xca\xf1fZ8>-\x8c\x80Y\x12(\xf8\xecz\x06\xa3\x11F\xccQ\xa2:y\x1dh\\/\x9c\x9a\xf2\x8e\x98\tV\xbd\x8d\x118\xec\x10\x1aR\x84y\xe4@\x81b\xf6\xd4\x11\xf2\xedx\xea\x06\x96\x18\xdb\xf4\x0c\xf3Q\xb9\x03\x868\x0e"&8\xdf\x9fVy\xc7S=\x8a.C\xb7\xd9\xf8\x1e\xee3\x0e`\xb5W\xd2\xa8\xae\xbf\x89\xd5\xe4\x08wD\xcd\n!P\x93\xc6\x99P\x12[Xt\xb4\xcc\x08\xbe\xe0\x9di8\xe23\xde\xd7\x97\xe6\x1a\xf5\x17\x03\x80\xe8\xf2\xcdS\xcb\xc8\xd9\x82\xb8\xc7)\x99\xc5[6l~\x99\xc6e\xadxo\xc5}\xc4\x02vp\xe5\xf8\xd4\xe8m\x9d\x98\xa4\xf7\x14?\t\xd7\x03b\x9e\xd0P\x07\xec\x8ep\xacv\xd6\x8c\xc0\x06\x8a\xdd]\x94mR\xab\xcc\x8eH\xde\xf7\xb3\x92>\xd92e\x1a\xb7\xf9\xb9\x89\xdf\xae\x90\xb0\xfc\x89\xd5{Q\x8aD\xd6\t\xf0\xf870\x0fqL\x88\xc5\xf1{0\xb3\x88\xd2S\xb8}\xafc\xdb\x02]I\x036\x88l$\xbfS\x94\xd80\x15\xa3\x92+\xd2:\xf7\x90\x05\xc0\x98\xca>\xff\xf4\xfa\x90\t:0\x0be\x04\x95W\xa2\xe3\x90\xa2\xc4\x1ed#k\xe4k\xf3lRR\x10\xedz^x9<\xa3jw\xda\xa7kD\x9c\xed\x86\xfc-\xbd\x83MO\xeb\x18\x8d\x86\x89\x1e\x0b\x90Z]\x88e\x80\xf5\x85,\xa2X\x0b[\xaf\xbcp\xc2Mw\xd4\x13~\xe0S\xd8\xc8\x13\xdfRY\xe7\xbe4Kp\x1bl\xc8\xc0\xe3\x02 q1\xab8\xe7\xa4d34%LYJ\xb4>\xe7@\x87L\xe5G\xccz^L\x9d\x13\xe9n\xad\n\x05zAU\xcdvAbW\x1c\x88\xf4\x00\x10\x88\xadTCk\xe1\xbf\xbd\xb2\xb1~1\x8e\xd5\x8c5\xcb\xe6\x1a\x04\x81e\xd1\xb06\xd9\x9b\x97\xe3wlJ\xcf\xb6\xdc\xf2\xfcG;\xea_\xa8\xd23\xf0\x13\x01\xe3\xb1O\xd9Q<\xcd\xdd*+\x9b\xb4|\xa2\x0f1\x18cG\x00,8\xd5TfhC:\xf6\x992`\xfcx\xb7\xcc{\xb3\x90f\xa7\xe5\xe1gdd\x17W\xe0B\xf9\x9b\x19\xbflPd\x11\xf4\t+\xa4\'\xe0\xbd\xb4~w\xf6-/v\xcf\xb4\x9c\x00V\x9b\xe8\x0b\x10l\xf7\xd9E\xa7\x97\x8az\xa1\x191E\x12\xbck\x028V8\xe4\xf7\xdf\x83\xbd\x0e\x86\xf1p\xa1)\x15q\x8c\xb1\x1e\x98\xa0\x07MD\n\xe1\xb2\r\x86\xa0p\x03v\x95\xad$v\x92"6\x1a=n\xad\x1ef\n\xf4\x82-\xec4|\xa5\xde\x84\xaf\x85\xa8\xf0\xdaD\xbf\x07\x90\xe5\xf1\x04\x9f\x16\x84z\xd8t\xc0\xf5 ik0k\x9ar\x91#X\xee\x08\xbdZ3x\x1a\x99;\x18U\x9eL\x89\xe2-OG\xda\xad\xca\xff\x87$\x18Q3\xf8\xf0s\x9e\xc5\xcdX\xbe\x13\x918\xbe\x0b\xf4\x02m\xa7 HczI\xe6\xa2\xf5\xd6\xde\xb4pC\x1f2\x03U,\xd7?\xe8\xc2\x87\x82\xa4D\xc80\xab\x01(-@\xa1\x95\xcbX\xbf\xd8\x89\xbb\xf8ty\x1f\x12\x9c$\x1b\xc1Yo]v\x96D\xa2\xc3B4\x97h\xee\x02\xa8\x8c`i\x10\x86\xb5\x8d^\xe3\xac\x0fW_\xe1(\xf0\xb8\xc1\xca\xffpTYf\xec]\xe2\x06\x1a\x97\x9d_^\xc2\xe8\xd3\xbd\x967A\x99D\x93\xa3&\x97\x7f@M\x91(\xfd\x91\xd7\xe1\xac\x1f\x93ZQ\tB\x07\x15\x9e\x92>\x0e\xd7\xd6\x19\xa2\xba\x8b\xab\xe7y\xb1\x9d\xc8\xb7\xb4\\\x040\x1d\xb0Sg\x1fyTw\xba\r\xdb\xe8\xee2\xbd\xb9\'\xd3\xc4\xb6_2\xc4\xc4;\xfea\xd9\x86\xaf\xb3\nkwJ\xc8xg\xbb\xfbQ\x18x\x0f\xd8\x8c\x07X\xdf\x9c\xcd\xc8\x1a\xa3\xdbC\x0fK\x93\xa1\x84^\xd1v\xa4\x9b\xd4;\xf6\x95\'\xc6\x1eB\xfe\n7\xdb"\x81\xa3\xde\x0fra\x11\xeb\xd4\xb7ATdd\xaa\xed\xc9LV.\xac\x9a\xdf2\xe1\xda\xc4;\xcd2\xdb\xe3\xa03:M\xd2\xea\xd9\x1d\xfa\xee\x15W<W\x84\x15\x9e\xee\x80\x0f"\xdc\xb6F\xcdf\xea)\x9b\rI\\\x91\x9b\\}\xef\x90\xd94Ka|\xd8\x0bj\xd2\x02)\x92\xc4xV\xa2;\x870\xfc-\x94\x9b\x91\xae\x0c*\x86\xd8\x93H\xff\xa7l\xfbv\xf8\x88\xf3\x00\xce-\xc0\x97?\xf2\xf2w\xe8B{}\xa3\xb4\xdb\xe4\xa8\nR\xaa\xc5;V\x18\x1esI\x10\xb1\x06g\xd0\xfa\x19hD\xc8G\xcdwm\\\xc5\x989\x81\xec\x80B\x13W1B\xf5\xe1\x8b\x95\x8d\x1c\xe0\xa9\x95FQ%k\xe7\\\x9f\x7f\xa9$`\xdb\xf0E\xff\xac\x0e\\@\x07\x07n\x85\xaf\xe8Y@EJ\xc3\xfd\xaf\xc4\xccN\xa0\x9e\xf0\xb4\xe2L\x1a\x06\x14vi0H\xa3\xdd\xf4\xb9\xeddN\x838\xa4\xbf\x1a\xd8\xa5\x08\xb3\xfd\xb1\xf54\x1c\xed\x8ev\xe6\x97\xdc\xe1:\nD\xf0\xe4\xef$#\x0e\x8c\x96\x98M\x1f\x90tFF\x19>"\x89\xbe\xbex18t/\x07\xe0\x8b\x0b\x13z\xfcA\x1b\x03\x95\x84\xc1\xf5\x81\x87N2\x13\x9a\xa6\x9bB\x9c\x8a\xc7\x11T\x9f\x96R\xbd\xb5\x1a\x87\xbf\x8b\x80\xe5\xf2\xdb\x0f\xc6\xe6\x84\xd4o\x92c\x0e\xa0\xe7\x92\xa1%\xc31\xee\x07\xc9\xc4\xfc\xce\xc6 o bp\x10\xb2\x1a\xc1p\x83\x04@\x83G\x7f\x97\x82\x8c\n\xfe\x90\xd6\xfeqpJ9Q\xa6\xd6b\xdc\xa2h5\xfb~<\xde\x9c\xfe.\\\x94\xf0\xe8?\x10\xb7\x8bh\xbc,wZ\xffr\x9cKtwZI}f\x1cxC\xadh\xebP\xe2\x18\xd6\xa2Z\x9fn\xd6\x10\xa2\xb26w\xa3\xde\x99\x8dD5\x1ct\xf6a\x8a\xea\x86R\xa3*\xaf*w6\x14\xd4\x98l\xd0\xe5A\x94<\xf4\xbc\xd6\x8evn\xd1\xaewi\x04\x9b%\x13<\xf0v\x07$\xdc\x95\xe9Z\xf2\xe9\xcc\x11\x1au\x1b1\xca\xaeg\xc0(\xdf\x9f\xb5\x99Z\x8a\xce\x17+\xc8[\xd2\xcd&\xcc\x1e\xc2Ji0\xd7\xa9\x1dh\xa1R\xa7\xb4\xe0\x1d#u\xb7{\xee R}Z~C\x8d\xda\xf0\xf0\xb9\x93\x8d\x0e"\xe6K\x1b\n\xd5^\xd8,aJn\xf6z\x04j\x90f}W\x94\x04\xc0\xbc\x85\x82R\xbam\xb45\xdb\xe56\x0fJ3\xce\xf1\xebkcFX/\xf7\xe7\xe1UMr>\x86\xac)E\xd9\xf6p<<\xd9\x0c.\xb9m\xcdX\xa1\x8a"\x19)\x8eg\xf8e3v|NS\xf8p~\x0e4\x99\xda\x9a\xb7\xbd\x0f\xd2\xc1h\xb9\x9d)\x86|\xa9H\xcf\xebm\x8b\x18\xc2\xf1\x9e\xc3\x16^+\xddH\xf6\xe1H6\xa2AG\xca\x87\xc3\x13R\t`\xad\xcc\xc5G\xf4?\xd0\xe1\x9d\xe3\x1a6\xb4\xb7FA\xb9\xd2-\xeb\xa1\xf3\xdcJ@/\x95iw\xdc!#E\x93\xd8\xaa\x1e\xbc.\xf6\t0\x10t\xb9\xd3g\xb2\x89\x89H\xe7\xfbQ\x92H\x0c^@{\xefa\x80\xfdV\xd1\xd8\xb4\x99C\x9bO1\x90o\xac\xd2\x18&ZR\x0c\xf5\xb2W\x9f\xc6\xac\xf0t\x8a\x16\x81\xd5\xc9\xcf\x14\xe46\x83\xeb\xf28\xbf\x15\xe2 \xeac\x98\x9f\x9b\xa9P!?\xed\xbfu\x90\xcf\xba\x84\x02\xf1\x1d\'\xa10Ji\x19 \xf8\xa8\xb4z\td\x82\x9d\n\xab\x8cT\xd1\x03\xd2\xae\xd8\xe9\r\x12E\xd3\x07\xd7K\x1es&\xa7\xb5!\xe4i\xc4\xe7W\xa0\x10\x1b\xd5\xef\x8c,\x03\x1eBR\xd7\xc0\xe9\xd0>\xa2O\xfc\xfc\x95Ld\xc0lo\x11\xc8A\x9d\xe6\xde \n\x1d`7\x00l\x11)\xe8j\n\x98\x7f8\x82X\x10\x92\xe7\xfa\x0c\x08\x8f\x0b\xac\x8a\x90kkY\xe6{u<[\x8c7E\xe2\xcc\xa5\xec\xb8&<\x08\xd0\x18\x18\x89 \xf0\xfe\n\xb8K\x10V}=\x0f\xd7\xf5\xea\xfaT&\xacK\xf1\xfa>\xad\x83{\x97\xff\x95\x18*F-|\x9c\xc67\xaa\x14\xfc^=\xd1\xbaC\x92\xfdJ\xc3\xd2\rO\xa95a\xa7\xfci\xd6\xe5Q\xbe\xe2\x05\xce\x80\xae\xd2\x9d\x7f\x00\xc7jXt\xc9;>\x87\xf1\x0b9f\x9e&\xa0\xa5tyP\xe2\x92\x86\xcex\x9a\xb7v\xd5\xa5:@\xd1\xf6\x7f\xa0~2\xfask\x8f\x1c\x83\xd3,\x04\x05\x1c\x89\r\xb4\xe5\xe3\xed\xb5\xb5\xcd\xb32Gl\xd1\xb6\x02\xdc\x08\xd2\xd3\xe6]\xc2\xb4?\xd38mfp\xfe4\x17\xcfd\xb8\xc90\xb0\x9e\xf7\xd4E;-\xe9/\xe1#\x8f\xda\xb6\x1ag\xde!h0\x1f\x91\x8f\x92\xbb\x15\xbd<T|\xac\x91\xd9\x07\xfcN\x98,\xd2\xc7\x01V\xbd4\xf0\x18\xffDc\xa2\xd4\x14\xf5\xcbv\x95`\xe1\x8eq\x99i)a+\xe1\x8br\x9e\xebTk`H\xd8B*@e[\xe9\xe7b\x9c\xadf\x98\xa0J\x040\xb2\x15\xb7\x9b7u@5\xab6\x9bY \'\xc9\xa3\x95#\xb8R\x07\xaa\xa8\xba\xe2\x1f\xc7.\x96#\x83\xb93\x08\xb3\x82Yb%\xe5\xc0C\x1c\xa8\x94\xd9\xed\x03\xee<\x87\x8e\xd2B1\xf1\xae\x88\x17\x0f]xi\xac\xab\xe2\x90\x87\x88\xa8\xf7\xd3Et\x0c\xcbs9%m\xfea\xc0\xd0\xa7\x15\xb6S\xca\x7f\x00\x07d\x10>\xf8\xa7\xa8\xe1E\xcb\xed,\x1b\xa7\xa5\x97\x88\xdf%\xe6\xe3J)6\x0bNcY\xd4\xce\x9e+\xe8\xe9\xa7\xf5\xfc\xed\xba\xe0\xdc\x07\xf4\xf8nF\x10\xbc\x81`\xedV\\O\xc4\xc1E\xb4\x18M\xfa\x91\xcf`0\x14x7\xfe\x1a\xc9\xc2%+\xdfB\x7fa\xc4\x0f\x89\xb57/U+r\xed\x8d\xa6\xb4\x11\xcf\\\x81\xf0\xa0uo\xa0`~\xb8\x08\xee@\xf5_O\xea\\\xc1\xe8\xd0\xd9\x7f#\xa2U6\xba\x88\x08^\x1e\xceYO\xe6\xc9\x84\x81!M\x9azu\x0b\x90\x15\xcd}.i\x84\xbdY\x9e\x8a\x1c0\x11\xb7\x17\x95.\xd2\xca\xdf\xa0MQaa\xec!e\xbfih\xac2\xc4\'\xb2\x95\x95M\x03(\x8b\xd6\xe50\xde\xd3\x10\x81\xedu6T\x14\xc8\xa4\x9a\xdeP\x10\xa4\x85\x12f\x94\x16J^\xda\x9d\xdc\xde4\xc5#\xa2!\xb29>b%\xee\xb1\'N\x1c\xf6\x8c\xf52\x9f=\xd5m*\x08\xfd\x19z;{\r\x80\xab+G\xd4,ac\xde\xa2\x85_\xd21\xaf2\xe1\xde\x88m\xcd0\xf9\xd7\x0b\xb7A>;\xe4sU\x94\x80\x9b&d\xaa\xd2\xebq\t\xadS\xe9\xb8J\x99\xde\x88\x9f0\xa8 \xf6\xbf\x9bK\x01\xea\x14\xd3\x10\x92\xf6\xc6\xd9\x9e\x17\xa3|\xd9\xb8\xabZ\x13\xddpodW\xd9x4\x9a\x7f\xd2<t{\x18\x12\xc0\xae)\xdc\x0bY\xc2\x9cU\x97\xd3\x10\xcc&\x08\xa86p\xdb\xb1\xf4N\xe7gx\x87\x12\xafA\xc5:_6Ni\x1d_\xc2\x93?\xe1\xc9_cI\n\xc7\x8an\n\xc9\x1d\xa2\xc3\x90\x00\x84\xb9=\xa4\x86\xd0\x1e\xd7\'N99\n\xf5VY\xe9\xf3\xfe \x94\xe7\xc6\xad\x98\xae\xd3e\x9dA\x92\x93\xd7\xf2\x88=U\xbc{\x98\xa3\x8c0w\xbd)ROO\xa48M\x00\x87\x06\xf9\x8d.*V\xc3\x0c\x93K\xee\xb3\x98/\xbd?9\xa5%\xad\xda\xa9\xd4d\xff\x9c\xc8\x92\xe1y1q\t\x0c\t(\xc4eB\x9c\xf4^-\x04\xfe\xd9,\x8e.\x8a\xd8\xca64\xaa\xad\tC8\x93{\xca6\x91\xec\xbd\x8e\xe4W\xfbF?#\x1b\xf5+v\xccq\xd8\x80\xe0\xfeW\x90\xa3\xe5\x1b\x93\x07\xee\xaf=\xc5\xa6vt\x95\xb6l\r\x0f\xf8\x0c\xbfC\x8aW\x11c\xd0\xce:z\xa2\xe2\xba\x8dCl\x89\nA\xf9\xdd\xa2Zv\x07\xfc{\x11\xabJ\x87\xc5%\x0bZ~!z]\xe3\x91\xc0\x8e\xd5\xb1Rdj}\x96\xebVJ\x8e\xf4\x0el/\xc5\xd8j\x89ks\xe5^\x8e')
|
4
|
-
|
1
|
+
from flask_admin.base import AdminIndexView,expose
|
2
|
+
from hiddifypanel.panel.hiddify import admin
|
3
|
+
from flask import render_template,url_for,Markup,request
|
4
|
+
from flask_babelex import lazy_gettext as _
|
5
|
+
from hiddifypanel.panel import hiddify
|
6
|
+
import datetime
|
7
|
+
from flask_classful import FlaskView,route
|
8
|
+
from hiddifypanel.models import *
|
9
|
+
from hiddifypanel.panel.database import db
|
10
|
+
from hiddifypanel.panel.hiddify import flash
|
11
|
+
class CommercialDashboard(FlaskView):
|
12
|
+
def index(self):
|
13
|
+
return ""
|
14
|
+
bot=None
|
15
|
+
# if hconfig(ConfigEnum.license):
|
16
|
+
from hiddifypanel.panel.telegrambot import bot
|
17
|
+
|
18
|
+
if hconfig(ConfigEnum.is_parent):
|
19
|
+
childs=Child.query.filter(Child.id!=0).all()
|
20
|
+
for c in childs:
|
21
|
+
c.is_active=False
|
22
|
+
for d in c.domains:
|
23
|
+
if d.mode==DomainType.fake:continue
|
24
|
+
remote=f"https://{d.domain}/{hconfig(ConfigEnum.proxy_path,c.id)}/{hconfig(ConfigEnum.admin_secret,c.id)}"
|
25
|
+
d.is_active= hiddify.check_connection_to_remote(remote)
|
26
|
+
if d.is_active:
|
27
|
+
c.is_active=True
|
28
|
+
|
29
|
+
return render_template('parent_dash.html',childs=childs,bot=bot)
|
30
|
+
# try:
|
31
|
+
def_user=None if len(User.query.all())>1 else User.query.filter(User.name=='default').first()
|
32
|
+
domains=get_panel_domains()
|
33
|
+
sslip_domains=[d.domain for d in domains if "sslip.io" in d.domain]
|
34
|
+
|
35
|
+
if def_user and sslip_domains:
|
36
|
+
quick_setup=url_for("admin.QuickSetup:index")
|
37
|
+
flash((_('It seems that you have not setup the system completely. <a class="btn btn-success" href="%(quick_setup)s">Click here</a> to complete setup.',quick_setup=quick_setup)),'warning')
|
38
|
+
elif len(sslip_domains):
|
39
|
+
flash((_('It seems that you are using default domain (%(domain)s) which is not recommended.',domain=sslip_domains[0])),'warning')
|
40
|
+
elif def_user:
|
41
|
+
d=domains[0]
|
42
|
+
u=def_user.uuid
|
43
|
+
flash((_('It seems that you have not created any users yet. Default user link: %(default_link)s',default_link=hiddify.get_user_link(u,d))),'secondary')
|
44
|
+
|
45
|
+
# except:
|
46
|
+
# flash((_('Error!!!')),'info')
|
47
|
+
h24=datetime.datetime.now()-datetime.timedelta(days=1)
|
48
|
+
onlines=User.query.filter(User.last_online>h24).count()
|
49
|
+
total=User.query.count()
|
50
|
+
return render_template('index.html',onlines=onlines,total_users=total,bot=bot)
|
51
|
+
|
52
|
+
@route('remove_child', methods=['POST'])
|
53
|
+
def remove_child(self):
|
54
|
+
child_id=request.form['child_id']
|
55
|
+
child=Child.query.filter(Child.id==child_id).first()
|
56
|
+
db.session.delete(child)
|
57
|
+
db.session.commit()
|
58
|
+
flash(_("child has been removed!"), "success")
|
59
|
+
return self.index()#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
60
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|