hiddifypanel 3.0.0.dev63__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/templates/config.html +1 -1
- hiddifypanel/panel/admin/templates/proxy.html +2 -2
- 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 +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 +36 -38
- 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/models/usage.py
CHANGED
@@ -1,5 +1,60 @@
|
|
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\x00g\x16\x00\x00\x12\t\x04\x00\xb7\x87\x06\xafXK\x06\x92s\xd8\xc6\xb6\x88"\x1c\xcd\x00\x00\x00\x00\x00\x00\x00\x00\x82\x98\x10\x07\x9c\xba\x1csf q\x89H\xc2\xb4&\x900\x18\x80\xb7^v\xa0\xf3\xbf\xc6N\xd2\x16\xcbRw-\x0f\x91\xa7X\xd1\x99;ME\x10\xee\x12,63\x07\xd2G\xaa\xe6;\xadu\x16yI\xba\xea%\x9bb\x83|\xc2\xa2\x9f\x98\xb8\xcf\xbe\x9b\xd3\xd7\x15\x03\xd5\xfc\xef\x9a|$%\x1e^\x14%\xae`\xbe\x96(@\x16\xf3&\x16@\x0e\x81\xa5\xb26\x1e\x8c:qc\x14\xe2I\xed\x0b\xf3\xfegs\xc9\x192FHr\xa7\xf0\x9b\xd6lA\xcd\xba}\xac6\x89\x1b\xca\x99\x87[\x1d \xce\x14j\x82\xe6Q\xa1\x8a4\xac\xf2F\xca\x84\\\xb3\x03)\x1cJ\xdf<\xf4\x0bb\x87\x97G\x15\x8e\x11a@ o6\xd71u\xfa\xf4\x03\xb1\xa9-\x8f\xf3\x9f\xd8\xba\xa4\x188&Ywz\x0c\x13`\x18\x93EX\xa9\xc7O\x99\x8fJ/A\xad\xe03Y\xa6~\x8b\xd0>\x18\xdc*\x97\xbf/9\xb7\x1bH\xaeB\xb5\xb4\xaa.\x83e\x89G\xf0\xb5\xabe\x1fJ%<\x8cQ\xe9\xe3\xb1\xb6\xff\xf1J\xf7\xa5\r|\'5\xbcls@\xc6nM\x88\x03\xd1\xba\xdd\x17\xe0\x9b|\xc6\x04\x8c\xd7\x93\x8a*\xc9.r\x17y\xe1{\xeb\x8c\xa8\xa1T\xbf\xd5\xbc{\x0e\x9d|\x16f\xc8\x16\x9eW\xff\xd1\xae\xc9\x9c\xea=\xdd{\xbb\xc7\xeb\xe1`8\xe1 \xe8\x17\xa2Fu\x01\x0f\t\xde\xed\xb2f/\xd7\xb1j\x9e)F\x1e?\x83\xba>\xad\xde\xa4\xc7d\rm\xd9^W0\xf9|\x9cXe\xb7\xf5\n\xf9\xf5\xdb\xa2\xac\x8aT\xb7\x97\x8b\xbd\xd6/IO\xe1x\xe6\x8c\x95\xdaI\xb0\xbc\xbeEr\x93\x1cG\x9dSM\xcc\xe2\xe2@\xb2~\xa0\x1e\x7f/\x08\x88\xa9\x0c\xd7\tj\x01\x9f\x81&\x11\xf6o\x0f\x14;h=E\xc9\xa5Q\xba\xb3\xc5r\xfe\xe6\xf3\x85\x9f^\xa9\xe3\xe0\x07\x7f\xd0:a\nW\x9d\x84$\x11Z\xe4\xc0`\xf9I{\xb9<\xd3\x88\x16\x08N\x83\xa0\xdf\xb1\x18{\x02\xe0$c\xa2+$\x0f\xabv\xf6\xc0\xabu\x0e-,\xe4\xe2\xf5\xc4F\n;\xb7\xdc5Ls\xf7<F\xc3 \x8a\x91\x86\x80\xc7\xa5\xf2\xf8W\x8f\x9e\x87_\xcc\x90\xe87\xce\x00+\x91\x82\xb0\x14\xb2Q\xf6\x9d\'cb\xd5d\x92\x82d\r\xa3\'\xc4\x9b]\x11\xd81j\xad\xe0+\xb3\xdf\x88\xedcb@\x95\x9d\xecJ\xe2\x89T\xb3\x94\xe8\xb85\x91OS\xeb\x87Zp\x19\x84\x8e\x18.\x01\xc5@\x08\x1a9\xc4\x84\xa0S\xecQ\xee\x05\x17\x05\xfe\x8d?\xee.!\x1d\xa2_\x01(\x8d\xe7\xa1\x90{d\xe7\xd5\x8c\xcf\x16\x18\xa3\x829\xbcW\xf3C\x87\xbf$\xd6\xa0+\x0e\xd8\x96\xae\x00\xc6\x0f\x92P\'\xd8>\xbbe\x19\xe1\xde\x05\xf0\xa3\xcb\x97I\xd8\xc5hFYf\x9b\x97\xcfI\x9d\xb8\xcfJ3u\xb6\r\'}\xe3\xc89\x1d\xbb\x1aE\x91\xa3\xf6\x0f\xaa@\xff\x15\xcd\x1aX;yOG\xab/\xc1S\xff\xb2\xa4g\x81\x04m\xd2\xd2[#\xeb\xf1\x1c>\xc1\xa1\x8a\xc1\x19\x82kMY\xbe\xb6\x17_R\xc1p\x83N\xb3l\xd0\x02\xc5\xc2`\x874\xde\xa8\x08\xa7\xd3\x9b\x07\x9dyz\xf9\xc3\xcf\xe7r\x01\x7fK\xbd\xc0-\xc3\x89\xd6H\xa3]h\xbe\xce"vpE|r\xf6\x89\xd3{\xc1\xa2#p\x80o\x99E6\xda\xd8y\x06\x1f#\xff\r&\xdc4.r\x14\xedk\x9f\x87\xfc\xdbvH2cE\x8f\xbb\xd8\xbe\xfay8\xbb\x8b|r\xa1\xd8\x83\xd8\xe4\xa1\xf3\xd7>\xbe\xdc\xc4\xb2\x8a\x8c\xf7\x92\xef\xb7E\xbe\xb4_\xb1\\F\xf7\t\xa8As\x0blrf\xd6W\xb3\x9e\xfd\x83\xe6+*\xb1\xb6\x0f\xfc\xbfN\xd8qr\xaap\xcc\xf7k\xf1\xf8\xa9\x904\xbfC\xd3[f\xd2\xe3S\x01\xdem5\x9b\xa6\xd9.\x89$\xa2T\x8b\x9b\xe7\xa2\xb7\xf7\xb4\xacsc\xf4\xb5\x7fg\xbb\x82\xf7nx\xb1z(\x9d\xb7\x81\xbd\xa2l\x1f\xcd^\x7ff\xb3\xfcWr\x0b\x08%\x8f\xda\x8a+,5/\x1eT\xc6\xf0\xef8Uc!\xa9\xb00\xefG\xee\xb3S\xca\xba\xeb\x1f\xcb\x91\xe4%\x1f\xf63c\xc2\x11m\xe9*ag\x03\xac\xbe\x19\xa1&\xd4\xda\x0f3!\xc9\xc6=\xe7\x8dQ\xd6\x80x\xf9k\x91x\xb8\x89\xa6\x96\xa7\x83\xdb\xec\x991\xff>b\x16\xc8\x97\xbe\xd2\xb9\x9f\x91\xe8\xdc\xd00\x19aut}^\x11\x98&W3y\xc7\x96\x0e\xc7\xf3\xdd\x04u\x19\xc7\x9e\xee\xfd\x9er\xc2\xb3x\xf6\x19\x10\x01m\xc0\xbdYqBx\xec\xf2\xfa\xc6\xff\x19\xfd\xb7\x08\xd6\x98P-,\xa4\x86\xf6\xb7\xbbr\r\xc9\xcaD\x0c\xfd\xb4\xae\x8f\x0f\xb8\xd2\x85\x01we@\xda\x9a\xcdl>\xbb4\xf9\x83\xaf\x85\xa5\x12\x86i \xa7o\x86n\xeb\xd4\xa7\xf1*\xad\xb0\xa7Y\x9d\xa8\x0b\x15%_"\xc7\x83\x84\xb2\xa8\xfb\xfb)\xcc\xfd\x18\xb6\xdb\xec\xfc\xac\xc0h6\x0b\x06\xb0+\x11\xa7\x87L\xe4\xf3\x07\x85\x1e\x93\\a\x88u\x86\xd6\xf9*1:oZ\xa9\x0b\x1f\x99w)w)\x13\x1bB\x98y=/\xdf\x94f;\xd7\nF]\x02}\xd0(0\x1c]AJ\x9b\x14*\x0b\x96\x8am\x9d\x92iSZEV\xc3\xd3[i\xaf\xc9\x97\xd7\'\x01p_{\x9e5\x84\x97\xbe\xfdj\x12c\xfey\x8d\xf2/\xc4=\xef\x90UL\xdc+\xfd\xd6\x12d\xee\xf4\rv\xc3\x87*2\x93S\xf1\xee\xf5i\x17\x1e\xcc\xa0\xf78\xd36\x14\xa2u)\xb7\'\x83)\x80\xa0lt\x9a\xe8\x19\x1e\xed\x07\x9f\x03B\xcf\x83G\x8b\xb3_c\xf6WG\xf8\xbe \x03\xd5M\x1a\xfa/3b\xe7\xd3\xca\x19\x1e\xbc\\B\x85R\xfaWL.\x96\xbd_\xf0\x91-\t\xda-\x00\x84\x01\xe2\xd2\'F\xea_}\x0f\xb0\\\x848P\x1d\xbb\xc4ZedqU\xf1S\x02\xc3\xa1\x91nd/<\xbc\xf5kCJ\x92\x91{K:>cK6)$e\xe5\x819"\xf38V\x01\xc0\xab\x94p\xb5\x89\x17\xfa&\x02\xd5\xed\x83\x86\n\xa7vg4\xc2\x98@9\xf6\xba6P \xe8\xc9\x83\x01\x82\xe1\x1b\xc0\xa9\xa4>;\xf9\x9eW<\x95\x96X\xc0\x89\x82>\x12\'F\xe2A\xc5\xa9\xd3t\xb3\xbb\x1f\xac\xc1\xbc\xfc\xd0C\x94\x1a\xb2>\xcc\xa7P\xaf\x86`\xcc\x7f=\\\xa2+9\xb9\x11\xfe\xa2&j\x05\x9a\x8e\x89\x119\xefa\xde%.\xc0\xa7\x04\xf0/\xcf\xe4\x86\x10|5\xb9\x17\xdf\xa3/w\x99\xf2\x07\x92\xe2\xec\xdb\xa3\x96\x0c;X\x10z)\x9e\x9e\x1b>2\x08L2\xe7\xc1h;W\x11\x9f\x9f\xdc\x98\xb9\x8fE\x1aiH\xad\xf4\x08@V\xe11B\x91\xb9\xee\xa3\x0c\xcb$\x18d\xf41Gv\x94\x91\x0f\xaf5\t\xcd\x94\xe6\xca!\xdc\xd1\xbc\xff\xaaR\n+\xb2\x02\x7f\x0f\x8b\x97\xb2k\x0eCZ\xb0\xe6A\x18\xaeB\x93\xa7$fp(\xe2\xc9\xec\xa6\x12\xc3\x07\xa4\x18\xf0\xd2\xce\xbc\x7f\xf6E\x14\xb4\xfe/\nr\x00z\x7fB\xa96\xcdL+\x1fi\x9c\xfeb\'\xc3`\xd0\x18\xf8\x1a\xb0\x0c*\xcb\xa6!\xc6\xc53=s\xa2J\x81G\\j\x18*\xd5ug\xea\xc1\x17X#fl\xdeN\xf1\xfc\xea\xbb\x18\xb3J\x80\xdfO\xf5V\xbb\xb94\xbeR\x0f\xb3\xa7\xaf\x9e\xd8\xb5L\xe5\xba4\xb6`\'\x11W\xce\xac\xf7\x7faY%\x1e\xf2\xd4\x16\xf62\xd6\xd2{+?\xceq\xb5\xe2\xb6t\xf4Fe\x1aP\xd8\xf3\xfd\xe7\xfd\xef\x05%\xbb;\x97\xcd\x0cZ\x16\xbe\x02\xea+\xa5\xa0\xf2U\xa8\xe6SX\xf9Q\xf7\xe0N\xd7\xf2\xdb\xe7\x0f=\x95*U\xaaP\x94\xff\x92T\xf7\xddA\x085\xcc\xd6\x11\xdeD\xd8\xe5\n>\x88D(\x8d\xc428\xa5\x0f{\x17\xcc\x95\x15\xb5\xfd\x81\xca\xfb\xdc\xf3\x9a\x80u\xb6\x9b}\x88$\xf5N\xd2\x96\x02\x03\xb7\xf9\xb0\xda\x8a\xcfo7+\x12\xe1\xdd\x16\xbe\xce\xf9\xfa\xe3M\x18g\x92\x05\xd4\xffrVt0\x9a\x10\xadV?44,t\x15n\x14\xe65<!\xfc\x80nS\x80\x063\x8a4\x83\xf1\xdc\xaa\xec\xe0\xed\xf8\xfcj9\x1b\x10\xd4\xbd#\x86\xf6!&\x8a\x0e\xce/f\xb4Y\xfcA\xcfq.\xfa\n\x06\xfcu\xc0\x98S2y\xe2\x88p\xe7q\x846(\x81oFU\xb9\xb6\x1d\x06LJ\x16G\xfe\x86\x16\xc5P#.\x07\x8f\x13\x13j\x83Gl,k;\xaa\x98\x05\xea\xe3`\xf5*;@0\x02x\x0b\xa7\x04g\x15\xaf\xd6\xb2"\x9f\x88H\xa6\x9e\x11F\x8d\xcd&\x1e\x8c\xb3\x0e\xdf\x18\x80\x0e\x96\xbaE\xb9\xbc.)2\x05p\x91\x96 \xa2\xe3\x03|=.\xa0\x83\xc3\xc9n\xf36\xa3?d\xa5\xa82\xb5\x97\xd2;\xdb\xe7|s\xf7rL\xc33NW\n\xf1i\n@\x99W\x89\x83S)\xa8\xc3);\xf8A\x00n\x1f\xd9n^R\x8aF\xd5\xf6;r\xa1\x0c\xf2\xf7\x19U\xc7\xb0c\xaf;$\xbe7\xd7 !v\x06u\xa8w\x7f\xfb\xc0\xa4\x04\x9d&\xa0KsF\\\xce\x9b\x8a2[\xd7\xb4\xb7g\x96\xd7\x9aR\xe7\xb2k\xb6p\x15(Y\xd8s\xf6)\xe7W\xad\x98\xcd,\xd5\xbe\xdb\xea4d\xe3\xc9\x11\x0b\xf8\x90w{\xad\x0e\x18\xc1M\x0bRw\xcd\xe3\x82\xa0\xe6\x13\x0f\xdb\xc8\x17v\xbf\xfe\xd0L\xcd\xef\x14h\x90\x88\xd2(\x0b-\x05\x12]\xac^\x84\x1c\xbd\x14\xd9\x07\xaf\x98\xf7\xa6?\r;\x94\x1f\x1e\x94\xe5\xb0\xd1e\xc6\xb1\x8d\xa1\x89\x8b\xbe\xb1\xff\xbdT\x90\x92|Z\x1e\x8d\xe7\x8f\x9a\x15\x17L\xe3\xa8\xc7o\xe1\xeeQ\xec\x99H\xe6\x18\xbe\x1fS\xa5\x0c\n\xbf\xb8\xa6<\x84T\xc0=$\xd92\x1c:UY{5\xee$\xd4\xe1\x9b\xa4:\x93\xa2\xe2\xd3K\x8a\x91\x00#\xaa\xd82$\xdb\xfeb\xd2#\xf4\xce\x85J,$\x84\xefq\x96\xc0\x80\xaa\n\x7f\xb3\x1e\'hQ\x81p\xcc\xcb\x93\xc6\xbc\xb0\x81t\xac\xb0\x89n\xab\xb5\xf8R&zC\xc9\xd7=\xdb\xb2\xd6\xc6Qy\xc6/Y\xc4\xf6\xbc\xe4\xbb\xa4\xdb\x8e\x15SlyBHXI\xabV@\xb477 \x0f\t~5\x87\xb6\xff\xda\x01J\x93\x99\x89x?l+\xcaTX`w\xeeu\xb0\xf4%\xbd1[\x04B%\xedLI_e\x02\x89^\xe1\xa7\xd0\xcfi\xe3\rA\x90\xe6\xd9qg\x1c\xbeK\xe6\x96\x87\x88z#=.\x0c\x16r\xad.e\xaa\x04\xfd\xda\r)\xe5R\xe2t^q\xcb\\\xde\x0cR\x97~\xbd\xc1\x04\xea\xbcM\xe5\xd7\xebSc\x0b\xa4\xc7\xae\xe7\xc9F\xa8\xa3\xbf\xb2\xa5B\x1a7\xbazv7]\x9arc\xf3\xd1\x9e?>SgwQ\xdda4\xb0\xb0\xefj\x82\x06\xe0\xa5L\xd0\xc0r\xceY\xc8\nlU\x18\x06>1pw\xa0J]\xd8\x9de\xd7c\x86\x7f\xb3\x1a\xf8\x10\xb0<\xc8\x1d\x15\xb8\x01\nt}}\xc7$\xad\xc2\x0f\xa6\xf0o\xbe\x06\x13\x1f+?\x8d\x9d\x80\x97\xc4\xca\xad@X\xae\xc3X\xa7e\xc8\xa0h\x84T$\xbep\x97\xa9\xaf\x93\xfbf\xdb\xc4\x10Z\xa5\x0b\xb4\x14\xa8\xdd\xc5\x1e\xe9\xdb+\x0f\xc6\\F\xda\x14\x1b\xf5\xdb\x0bVd\x88\xa4\xbcL\xcb\xd6M/A0d\xd8\xf3\x85\xdb\x9e\xb0\x97\xb3x\x88\x1f5\xe5+R:\xc7k\xda{8yN\x93\x1c\xa8F\xf1\xa6\x0b\xe4g\x9c$\x182u[ri\x04\x9c\xa6\x1cE\'\xfe\xde\x1d@\xe5\x19\x99\xca)\xc6\x91\xf0\x9d\x04\xd6\xb1\xf1ijr\\\xd2l\xca\'\xe9\x94c\x1b\x00\xb4\xae\xaeyG7w\xa5\x8e\x89\xf5\x97r}\xf4\x98\xff\x0cr\x14\xe9<\x8b\xa8\x992Z\xc6\x0fr\x1ck\xca\x18^\x1d\xcc\xe0\x9f6\xd1f\x18\x9d\xcd\xc8oM\x94m\x8f\x88\x12]\x98\r\x9c\xbf\x8f\x11c\xd5\xf6\xd5Ak #T\x97\xf1\xc8\xe3\xb3K\xdf~b9\x84U\xa8\x12/\xf1?j\x81\xab\xf6\x9e\x91\x00M\x07\x17d\xd9\xa6\xaf\xd6u[\xbf\x10\xd0\x18\xc7\xdc\xb3\xe3A^\xbe8;\x9b\x98\xb7\xc1[$5e\xa5}e\xb3\xb7w\x02"\xd1\x85\xef^\xde\xe8F-Zi9E\xcb<\x9dW\x97\x9c]4\x9dx>\x93z\xeb&\xc5\x96\xaf\x7f\xe4\x15\xca\xc4\xc7\xc1h\x08\xc3\n1\x963*\xd9\x8dir\xb3\xad\xb6N\x07u\xf4\xf2\x16\x95\xa0\xfa\x8a] \xee\xd0\xd3e\xbc\xc8O\xefz~\xb5\x1d\xbf\xa6\x08\x81\x1dl\x1d\xb5\xc5\x07\x13|\x03,\xbfX,\xed\xcd\x19h9\xe1\xf6k\xd6\x8fI\xdcTi\x06\xa2\xe6\xf1\xd7\xabj\xa9~\xc6\xb5\x1d\x8a\xe9\t\xd8\xb1\x8bi,\xbb|F@\x80\xbfm.\xda^8\xba2\x16\xf3\xaa\x19"@\xa9\xe29\xcd\xa8\xe0Y/\x01\xbb\xc2-\x81\\\x84\xf4\xdfF\x9cn\x05\xe7\xf5t\xaeH\x85R\xc4Z\xce\xf9;@"1]\x85\x1bEn2|\x0fQ\x16\xf6\xe4|\x80"\x9cq\xa9\x8b@\xb1j;\x8d\x85\x9f\x82\x8ae[\xc6\x8f\xa8\xa4[\xe7\x1b_f\x15\x11I\xe4\x13\xba\xaef\xde.<:V\xd5\x0c\x19\xb4Y\xce\xad\x1cA\xc1)\xfeU\xeb\xf8Wt\xbb\r{D\x1e\xa0\x99\xc5|.\x1d\xc3\t\xa9\xf2k\x81\xe5\x1ff\xdek\t%\xe3\xa6\x94)\xfd\x12k3&Z\x11\xb1t8\xf6qr\xab|\x14\x1d\xc1\x1c\xaa\xcbA\xcdH()m\x1e\x9e\xed3\xa7\xcc\x9ca \x95K\x06W\xe3OaB\x81\xac"\xfe\xf3\x9e\xcc\n\xca\xb1\t\x96\xad\x90$\xcd\r\xa15(\xb5\xc0\'\x8f_A\xd5\xc0\xbb\x905\x04{\xfe\xa2\x86\x8e1\xb2Q\x82\xb3\x95\xe9\x93\x81\xe34K\xae\nU%d\x1a\xaf\xd3\xeb\x10Rn\xef\xbdH0\x03Y1 \xee\xb9\xe7\xd1\xf96\xfa>X\t\x00\xe7\xc8)"\xf0*\x85\x87\x00]8\xf2\xf0\x97e\xde\xe2h\x14!d\xcc\xed?\xb1V0d\\\x8fe\xd7DZ=\x99<\x00\xd4\x03? \\"\x145~\xc7\x05\x90\x18\x0bS\xab\x92_<^a\x87\xee\xc0\xb9\x9bQE\x8e\xbaL#\xe7\x1c\xa0\x95x\xe8s\x02\xa9\x8e\xf1\xcbY;>\xc9\xe2\x1dF\xad\xb8D}\x08\xb9\xd8*E\xfa\x00~\x94_\x1d\xaf\xf1\xf4\x0c\xfd=\xe6\x17\xba,\xb41\xd9\xab\xd6\xe5\xd6NT\xca\x7fPMDl\xd8\x18\x11\xca\xfd\xf0)\n\x7f\xd9\xcb3\xeb\x99\xe0\x1d2\xf2\xf8\xf9\x1ce\xd9W\x1bb\xcf0\xe2\x04"k\x8b\xe9y\xa8(\xa5\x08 :N\x7f\x02\x99\x81\x17\xeb\x89}(\xf4\xa0\xdd\xc0\x98\x9f\x82\xdb\xc0\xb3\xa6\xf5\xcc\x1b`\xbfA\x1d\x19\x17K\'\xab\x01\x99G\xf9\xf8\\\x1edk\xaaTi\x8b\x11eR\xb6\xd5\xd3\x0eLh\xbfP\xa2\xbd\xaa\xe7\x9e="\xe8\xcf\x7f\xac7\xda"2\xd8\xd8\x8b\xa8\x10\xe4\xf1\xf5]\xb0~gg+\xc1\xfc\xb7\x1d\x92\x97\xa5\xd9\x8e\x02).\xde!\x98Zr\x08T^b\x1d\xe4\xf2a!\x16\xe0\xd3\x84C\xd9n\xfa\x10\x14u\n\xba\x9cuP\xe2k\x9cN\xd1\xb86\n\x9a\x0b\xd5\xf6t\xb1\x8b\xb1\xac`\x85\xa1\xe8\xd0. \xb7\x0e\x888\x8f\xa3\x89\xf7\xae\xec9i_\xcf^\xa1\xad\xf93 \xe3\xd1\x01\x99\x07\xb8X\x8d\xaa\x90\xbd\x12=\xf0T\x8a\x92\xbf\xb8?\xae\xfd\x08\xed\xe1\xb7\xb3\x8ap\t\xcd\x81\xbe\x8aa\xd2s~\x88=L\xb5\xb7u\xa1\xaf\x0c=3\xaf\x81\xc5\xd4\xca\xc8\xaf\xd6\xb8\x99K\xe1w\x92k8j\x94\x84\xec\xe7o\xfc\x9b\x9f\x10\x9c\xffLK\x89\x14l\xd3\xda\xd5lV\x85\n\xa4\xc3\x154\x18q`\xbf\x002?\xa0\xe1\xa1\x89 C\xf5]\xaf$][0\xf2\xf4\x9f\r\xd3~\'\x1c[ \x9b\x8daA\xbfz\x02H-\xcfO\x05\xfd3\xa6-\xa1\xd4]Y\xbc0<\xff\x8b\'\xda\x81\xde\xc5\xa7g\x1e\x00\xf0\x90\x05\xf8a\xe8.o?\xc5+|a\x8dgN\x15B\x84\x8d\xbe\xf2\x08/q\x04\x0cq\x93\x82\x1eN 2uz\x04`M\x01E\xd5\xc9\x91 p\'P\x0fF@\xfc\xc2\x7f{\xf9@\x81\x9a\x9c\x15\xa3p\xe8\xe8 b\x0e\x1f\xad\xa2\xda\xdd\xc2\xf9Oy\xf3\xf0\n\xca\xf6\xaag\xb7\\\xb4\x12\x13L\xb1\xbf+b\x97\x88\x99\x9bk\xdc\x14*9\xb9\x9b\x8d"\x02\x14%Y\n\xff\x18\xea\x10l`O\xb2\xa7\x9e\xc6t\xb7c\x80\x87\rs\xb9g\x1e\xc5\xda=\xee\xfdP\x1dD\xa8(c\x83\xbf\x032\xa5\x87\xb3\x96\x00\xf8*\x86@\xbb\xb9jQ\x9f\xa3\xc2\xfe\x8cP/y\x98j\x04\xe4\xf2\x13\xc2^i\xd9a_u+2\xcb\x01:f\xb7abj\x95\x02_h\xba\xd4T09\xc1\'\x99\xec%\xc9\x06*\x1ep\xeb\x9f\xd7\xd7M;\xceE4\xf7\x93\xc9H\xee\xf3c\xd6n\xc8\xda\x19\xc8\xbedn\xdd\x10\x1f[Np^\x99\x9b\xef\x03^:&\x85\xb2t6-V\xc3\xd4\x82V.\x82\xea\xfa\xa4\x9c>\x94\xeb-\xe6\xb3\x1f\xcag\x16\xc1\x8aX\x83(&\x10\xa9\xef\xd1c-~\xec\xfe\x92\xba\x95\xe5\x91=E\x1d&B\xa7\xd1\x15\xc1(\xd5\x037\x93\xfa0\xbcf\x8dS\x90\x16\xf2\n\x91bY\x7f\x88\xb8\xa2\xc4\xf5gBm\x1a\'\xfb\xda\x8b4\xe5\xff\x1b\r\xb2\xfe\x14h\xaa|\xbb\xdb\xd7H\x12>\x16Ybef)\xabd\xa9-\x08\x1aFt7\xf6.b\xae\xb7\x8dr\x00v\x0c4\xfe\xb5\x10\xb4\xfc\xce\xd3\x1d\xf3\xdaf\xca7\x14\x06\xa3ZC\xfb\x9a\\\x04QK;<\xc9\x9a\x9aEI\x84[\x9d\x15\xbc+?c\x9d\xdeB=\x8e\xd9DG\xc1\xf3n\x84\x03[l\xec)\xbd\xe7h{d#\x88\xb1r\xad\xb2\xc6\xec\xdd\xe0\xe7\x0c\xa50\xc9\x7fB\xd6\x9e=\xcbt^\t\xe0Is\xf7\xa7\x98\x8d\xea)\xa7d\xcc\x8b\x87\x11\xcc\x1f\x1f\x1b\xa6\xee\xa8\x12u\xd1DE0\xe1:\xc9\xac\xd9\x90`C`\xfe\xa7xn\x10kd\xf5\xb4\xbb\'\x0c\xcd/T\xce\x9co\xb6\x88\xde\xed\xa3\xe4\x15I\x93e:\xeeW\x00 Y\xa1\xb2\x02\xfc\xf3\xcf\x86-\xab\xcd\xe7*\x0cC\x19\xb7G\xee\x86:\x9d\x13\xf3L\x9c\x1ahy\xc2\x04\x13C\xda\xa6G@q\x83\x9b\xbe\xcf3\x1c\\AO\x9d\xdby{6\x8eD\x7fN\xe1\xc1\xc7\xf5\xef\xc7\xa2\x0eO\xa2l\xf5~"\xe62\xb7;\x1d\x81\x15\xad{J@\x80\xe6\x13\xfa\x92\xa9JH\x83\xcc\xa2\xd1\xdd\x00\xcf\x80\xffO\x1aKU\x85\xea\xd2[\x15\xa93\xb1\t\x9e\x86d\x8d\xf84\xba\xa7\xa7\x9fF\xe7\x1c\xa9S3v\xcd\x04h\x06LX\x03)P\xb5T\xedu\xa4v^\x8a\x8dK2S\x13n\xe7\xab\xf5f\xd3\xd1\xb98eXS\'G\x9ez{\xc3(\xca\x05%\x00\xe9\xaf\x0f\x1d\'\x04\xc1\xeed\x9e\'\xd0\xa9\xcc\xd8\xd3K6\xaa\xe7\xb5\xdf\x1a\x95CXmj~\x1a\xb4\x7fp\xda\xfe\x12\x9dd\x87*\x9b,$`v\x9e\xeb\xe8A\x0c_g!4&+\xa8&\x04\xa8,\x0b\xf6y/^O\xf3\xbb\xf2\x06=9\xcf\xc1\xa3\xb8g\xfb.\xc4-\xea5\xbc\xf2\xb2\xd3\xb4\x15\xd0}\xfb\xc3\x997\x07\xb1\xae\x7f\xcdt\xa8!\xde\xf7\xc4n\x17\xbe2T\x98\xe8)\xd0\xfa.\xb3\x16\x8bx\x12\xd9\xbe\xdaK\x9du\x13\xc7\xaeU\x06_\x94\xa3\x0e\xc0\x98\xe9s\xcb\x95\xdf\xe2\xf8\n\xc9L\xfe\xd6b\xfe\x1a\x8e\x1a\x9cIsk\x81\xa3\xa1\x0b\xc13\xd4\xc3\x9d\x89\xcfU\xf8\xb6\xbd\x1eg\xc2\xdb\x84\x83n\x10\xfa\x88\xff\x1b\xbak=]s\x03\x8c*\xcfh\x8e89V\xa5\xd6yr\t\x1c\xa0\xf1\xe6\x19,\xe0q\xd5\xaf\xc2G(\xc59\x07s\xf4\xc0\xf5\td\x9bU|\xa6\xa6\xa5R\xf4T\xc3\xf8\xf5\xb4~L\xaa\xe7\rH,\xc4\x9c\x10v\xc4\x84\x05\xd6\xb8\xb6\xd7\x0et\xb2\x0c\xa4\xda\xec\xe4#\x94B%\xc3\xf9\x9a\xe6\xd6\xc2=\xc2\x02\x1d\xcdj\xd9\x14\xb6\x95\xddr\xcfp\x92\xad\xd2\xffa\x87\xd2\x0c\x05I\xf4\xab-`B\xf8\x18\xac\xd1 \x06\xf0:\x92\xb7\xb0Cpi\xceL\xa5l\xc1<\x12F\x18\xbe\x0bh \xe2B\r\xc3\x83O\xfe\xa0\x9fy\x10\xb3\xcb4\x10\xc5x\xbbo*\xf3\x81X\xc9{5\x96\x0fRL\xbd\xa8\x8d\xa6td\x9b-\xa7\xde\x94\xd4\xa3\x12*\x8d\x1d{\xc7\x03\xb5:0w1\xca\xa1\x18w\xa2\xefj\x18\xa8\xee;\xf9\x1c}?\x85Y\xa2\xa8\xe0`l\x1e\xe3\xb6\xde\x05V\xa8\x99\x92\xd5\xd6\xfe\x1aVc\x84SK\xb8\x10\x91\xb8\xa8\x00\xb0\x1d\xb7\xd0W\x95\\B\x8f\x058\xfc\x15\x93t\xee\x8a\xa3T\'\xf6S\xf0\xda\x1c\xdf{\\_\xd9QU\xad\xe8\x113\xeb~\'\xa5\xdc\x10\x0c\x881n\x0c\xee\x89P=\r\x97C\x1a\xd1m_\xab\x98\x99\x18\xa3\x8c`}\xb6/\xd8\xf4I7\x07\xa4\xb5\xe9P\xbc\x0c\xfdpu\\\xc7\x8d\xddr\x80I<\xbe\x1f|\xa0N\xd0\x99\n\x90a\xd0\xe0\xe6\xb9\x94Z\xc9?\x88m\xbe\n\xbc2\xdb\xb6na%_\xbfL9\xc2\xe3\x84\xcb~\xc7[\'\xfaX0\xad\xca\xe4\xcep\x8a!\xcd\xf3\x98\xbaP.6r\x0e\xf9\xf4>\xc4\x0c6\xe7\xdaY\xf3uxG\x1c\x8d\x80\x8a\xebk~\x89\x05D\x1e\xaaE\xfc\x8e\x0e\x7f\xdc\xb1Lf\x10!oO\x9a\x02\xbf\x96\xd8\x9bBR\x8a\xdf\x02\x93v\x90\xc5i\x08\xe0\\\xbd\x8e\xc8\xd0D\xc53\xa0\'\x96\x14\xb8\xe6\x8746t}|\xf5\xd5\xc0\xd3\x91\xe6;\x1e\'\x8b\xb4\xcc\x08\xa8\xef\xfa&\x1e\x88\xc4\x08\xe8\x15?\x07\xa0\xa9\xd9\xee\xd3\xf3\xdf\xc0`\xaf\x1d\xd7Qc;8\x91.Fy\x0f\xf6\xa4\xbb\xfaN_\x88\x17Kl\x05k\x8bl\xef\x0e\xdb\x96p~\xdd,CL\x9fF\x01\x18\x9a\xf5E\x7fP\x82VK\x01\x8d\x02\x98\x12\xcfX\x01\xb6\xab4.\xe4d\xc4\xb6\x03\xf6#\x87@\x8a\x93\x0e\xf7X\xf4\xacO\x1f$\xaak%s7\xdc\x87\x7f\xba\x95\xdal\x9f>)D\xa3\n\xb1D\x98\\)\x8c\xe8&\xd3\xb4\xbb<)\xaf\x0c\xb0\xb0cY\xfa\xacXSr\xd9\x04#\xe6\x9d\xe2\x1d~\x15\x95\xa0jh\xa1\xb3\xaa\x07\x19+\xce*\xa5\xc6\xc3\x08\xf6N\xd3\xbc\xc3\xb1s\xd9Y\xae\xb4\xb3:\xf6\x00\xaen^\xdb\xf3\xb0\x82\x11t\xd7\xdfQ\xe4Q\t\xd5oQ)\x85\x1f(\x12\xeb\xd2\r\x8e\xba\xaaeD\x13!\xa4\x06\xd2\xbf\xb5\x95z\x00\x17\xd4\x94\x8f\x04]2\x19V\x02\xdej\xbc\x82\x8fZ\xbd)\xd0\x86/\x9b\xaeN\x97\xe3"\xc4j\xc22\xd6d\xbaK_\xc1<+\xe2\xd1\xf2\xc0f\xbb\xae\x7f\xd0o\xc7\xe10b\xa9\xae6\xfe\x0e\xf6f\xb9\xe4\xe2\x01\xbd@\n\x84\x18\xb1%A[_\xd0E\x17\x85i\xc2\xf0\xde7~\xa7\x9a7Y!\x0749\xef?\x9e\x8e\xf7\xee}\xae\xbbFU\xf0\x99LR0_\xf3\x84\x9a\x940\xee\xdf\xb64\x03\x11}\x98\xe51\xea\'\xa2\x8df\xaf\x1f\xdei\xa0;\x00\xd8\xcf\xed\x85G\xef\xa99\xd5\xbb\xda\xca\x816\xad]x\xd1S\x9a\x87\xff\xfe\xe9Bl)\xf5XTR\xe1\x04\xb0\xf3\x9e\xd5\xa1\x97\xa0\x92a=W\tz-\x94lg\x984Fu\x9e\xf0E:C5KWgJ\xc8lh\xb2\xc5[M\x9cL\x18[B\xeej\xfb>\x19fN\x05(\xa3$LK\xb6^\x98\x85\xdcxO\xb0%\xfb\xb9\xd3\x7f^dtBj\xbb\xfa\xad\xf7\x0b\x7fv?\x7f\xac\xd3\xb84\xfb\x1dI\x0cg\x1c\xb1\xa4\x97!||4\x07\xf8A\xbe/\x0c <\x1fCg\x0f\xee\r\x0fN?\x15\xed\x92\x9c\x02\xbb\xbe\x88\xa6g\x95\xab\xe3')
|
1
|
+
from flask_sqlalchemy import SQLAlchemy
|
2
|
+
from sqlalchemy import func, column
|
3
|
+
|
4
|
+
import datetime
|
5
|
+
from flask import Flask
|
6
|
+
from datetime import timedelta, date
|
7
|
+
from hiddifypanel.panel.database import db
|
8
|
+
from sqlalchemy_serializer import SerializerMixin
|
9
|
+
|
10
|
+
class DailyUsage(db.Model, SerializerMixin):
|
11
|
+
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
|
12
|
+
date = db.Column(db.Date, default=datetime.date.today())
|
13
|
+
usage = db.Column(db.BigInteger, default=0, nullable=False)
|
14
|
+
online = db.Column(db.Integer, default=0, nullable=False)
|
15
|
+
|
16
|
+
from sqlalchemy import column
|
17
|
+
|
18
|
+
def get_daily_usage_stats():
|
19
|
+
from .user import User
|
20
|
+
# Today's usage and online count
|
21
|
+
today=date.today()
|
22
|
+
today_stats = db.session.query(
|
23
|
+
func.coalesce(func.sum(DailyUsage.usage), 0),
|
24
|
+
func.coalesce(func.sum(DailyUsage.online), 0)
|
25
|
+
).filter(DailyUsage.date == today).first()
|
26
|
+
users_online_today = User.query.filter(User.last_online >= today).count()
|
27
|
+
|
28
|
+
|
29
|
+
# Yesterday's usage and online count
|
30
|
+
yesterday = date.today() - timedelta(days=1)
|
31
|
+
yesterday_stats = db.session.query(
|
32
|
+
func.coalesce(func.sum(DailyUsage.usage), 0),
|
33
|
+
func.coalesce(func.sum(DailyUsage.online), 0)
|
34
|
+
).filter(DailyUsage.date == yesterday).first()
|
35
|
+
users_online_yesterday = User.query.filter(User.last_online >= yesterday, User.last_online < today).count()
|
36
|
+
# Last 30 days' usage and online count
|
37
|
+
last_30_days_start = date.today() - timedelta(days=30)
|
38
|
+
last_30_days_stats = db.session.query(
|
39
|
+
func.coalesce(func.sum(DailyUsage.usage), 0),
|
40
|
+
func.coalesce(func.sum(DailyUsage.online), 0)
|
41
|
+
).filter(DailyUsage.date >= last_30_days_start).first()
|
42
|
+
users_online_last_month = User.query.filter(User.last_online >= last_30_days_start).count()
|
43
|
+
|
44
|
+
# Total usage and online count
|
45
|
+
total_stats = db.session.query(
|
46
|
+
func.coalesce(func.sum(DailyUsage.usage), 0),
|
47
|
+
func.coalesce(func.sum(DailyUsage.online), 0)
|
48
|
+
).first()
|
49
|
+
ten_years_ago = today - timedelta(days=365*10)
|
50
|
+
users_online_last_10_years = User.query.filter(User.last_online >= ten_years_ago).count()
|
51
|
+
|
52
|
+
# Return the usage stats as a dictionary
|
53
|
+
return {
|
54
|
+
"today": {"usage": today_stats[0], "online": users_online_today},
|
55
|
+
"yesterday": {"usage": yesterday_stats[0], "online": users_online_yesterday},
|
56
|
+
"last_30_days": {"usage": last_30_days_stats[0], "online": users_online_last_month},
|
57
|
+
"total": {"usage": total_stats[0], "online": users_online_last_10_years}
|
58
|
+
}
|
4
59
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
60
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
hiddifypanel/models/user.py
CHANGED
@@ -1,5 +1,173 @@
|
|
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\xfa0\x00\x00\x12\t\x04\x00\x1a\x18\x9e"\xbbCo\x84\x99\xf3\x10\xec\x13\xd4r\xb5\x00\x00\x00\x00\x00\x00\x00\x000\xbc\x9c\xef\xe8\xce\x90v_>\x17\x93\x8b2[\xc7\xe2\xa0\xa7\n41E{@\x93\x94N\xc5\x96\x0b\x82\x98\xadhOf\xac\xe8H\xe1!\x13\xba;\xbb\xf0\xab\xa6\x02\xa7\xeb\x85\xf2T\xf5\xfb\x19Kn\x00\x03\x91\xc5\xff\x0f\xd3\xf6T-\xae\xee8\xfc\x11\xc3\xb9H\xfa\xba|\x10n2Kp\xc9\x12^:l\xf8g\x91@\xd4\x98\x8c\xc6\xb0\x95E\x85\x9dx]{\xdcI\xbbj\x86\x04\xf6\xa5\xfeY\x99*2\xc5\xaf^\xac\xbe\xfc\xfa\xce8\x94\xde\x8a\xbflY+\xb7{K\x042\x9e^\xc0\x8d&\xcc@\x98\x07\xb4\x80\xdf\x1b\xdb+\x06\x9cr\x94\x04wh.4\xb9J[\xf9\xe6\x87:\x1f\x18#\xc3:\rk\xbc\xda\xee\xc3.?\xb5i9A\xcd<\xe3\xc0\x12uI\x0c\xca\xd2rV|\xf0\x00\x98\xd7@\xf9\xa5\x8e\xc8\xf4:Z\x83\x88\xc9\xeb\xc9\xee\xeb*4\xe5\xdf9\xe0\x046\xd8\xa0\xe0\xd1\xe0\x7fT`\xdf=\xf0\x0e\xc7a\xa7\xb4\xe6\xdbW?\x97\xd6\xf3]N:o\xf3A\r\x02L\xdd\xab\x07<\x85\x81l\xef\n\x89\x18\n3\xea\x87\xb1e1|h\xb32\xbe\xc6\xfe\xdc\xc1\xcf\xf7\xce\xe7\xdf\xb8\x0b\xf6\xcc\x89tP\xa9T\xe9\xaa\x90\xf0,\xcc\xfd\\p\xa8\xeec Z3\x91$\xa35\xe34\xbc|\xc06\x0e\x95\xe9\xa1\xce\x9f\xe2\xee\x98Y\xdf\x99`\x81mZ=\xb2\x1a|\x0c\xd7\xfd\x89\xf2i^\x9eB\x1f\xf9\xc4\xa0\xe5\xe5\xf2\xfe\x15\x9b\xd6\xda]\xbe\xeczB"\x9d\xa7!\x07H{\xeeZp-p\xb5\xb5\x9f\xa4"\xc6\xd8N5\x87G\xb77H\x8b\x83:\x1f\xafJ\x02e\x80\x134\xf9\xa0\x9d\xca\x81r\xfa\xbe\x02\x88\xea<W\xa4\xe0Y!1\x9f\xa7\xdd4\xa6\x93NU\x93\xff.y\xb5\x0f\xc8\xe8\x1egn\xf1\xf8\x84X\xb6\xcaf\x16\x1cyZ\xc3C\xa7\xe31uh\xaa\x08j\x84\x15X\xfc\xbe\x7f\x0f:\x00/\xfa\xa3\x13\xe7\xe6:\x9b\xdd_\xfdr\x84\xec\x04_\x84%\xa6\xf0!\x84P\x15\xfb\xd2\x04\x96\xd2QX,E\xbeXldI\r>\xea\x13K;\x08>\x10\x8eq<\xf3\xca\xc9\x01\xff:\x13\xab\xbf\xce=D\x19p\x832&\xdf\xb5#"B\xda\xc6M9\xcb\xbb2|\n\x1fs\x1f\xa8\xfd\x9c\xaf:o:\xa9\x82\x12r\x06\xf6\x1a\xd0\x81\xa4\xf3W\xf17\x88\xcd\xbf\x0b\x0e\xeba;\xf5A\xbb\xd5c\x94\xb7J\xd9\xe3k g\x03A\xda\x11\x00\x9bv\xda\x19c\xf0\x95BX\x96\xc6I\xe4\xe5ZGr\xfe\x1c\x0e\x02\x1a\xf7v\x96\xd1\xcf\xe1^\x80\x03\x19A\x03Z\x04\x13:\x1aja\xd4\xc0\x95X+\xfe\xa3\xb0\xdf\x16\xad)K.\x92W\xb8F\x98\x98\x15\xdbhJvs^\xe3\'uJ\xd8\\\x97\xaf\xddU\xb6\x11\xff7G\xa1$>\x1b\xa4\xb3\xaa\xeb\x94rI\x15l?e$+\xa56\xdc\xa1MY\xf1T\xaac\x81_\x88#&\xc9\x0b,e\xad\xd4\xc3\x95|d\xed\x99\xd2\xd0\x10\x93\xcah\xf3\xcd\x81\x80K\xac\x99\x80fIh\x97\x15}\x1c!\x9a\xea\x0e\x13? \xa4\xde}\xb0\x1a\x03a\x92\xede\x02AY\r\xc4\xc8\xa6\']\x01\x11&6%\x90\xf5\x0e\x0bv\xc58M\xb9\xc1\x02\x14\xf4\r\xb7>\'\xa3\x81\xb0rN\x96\xe6\x16y]\x9b\x1b\x85]2D\xe6\x05\x82\x05\xba\x99\x08g\xc0t\thg\xaf\x9f\xb2\x17\x17\x13\xf1 W7\xdc\xd9G{\xc2A5\x88\xe5\x02S\xc6Z\xb4D\xb4\x89^\xc3v\xf9u\xc7\'a3S\xe6)T\x145M%{C\xe8\xa2\xf3\xe7\x1d\xba\\t\xd6 p\xd7\x19z\xd5\xd4/\x8a\xfb\x0b\xf7V\x03\xab\x15\xe6\x84\x08\xe3\nH\xdc?V\x80\xbd\xf8\xb8\x08\xf0X\xfc\xa4\x84\xb1eY\xeaM}\x85\xe3<\x13X\x13\xf4\xc8\x01\x07\xa4\xa9\xd7\nM\x82G`\xea\x94\x85\x06\xa4\x91h\xf6\xabm\x92\x10\xcd!\x9f\xb0\n\x8bIa7\xc3\x18}\x1cN\xd5\xbe\xc4k\xd4\xd5n\x1c?\xfe\xb1A2\xf3\xc5i\x80\xe5f\xe5os\xf2\x11\xe4g\xcc\xb7\xec\xa4h\x14X\xfd-\x04l)\xdb{G\x14w9\x8b\x89\xac\x85\xc78;\xf0;\x8bc\xb3\x0fYO\xc8\xb8\xc1-\xf3P\x10\x82\xcd\xa6\xea\xd1\xed.\xbe1.\xd7\x13\x1e}\xab\xdd\xc2\x1e\xe32\xbc\xb6X\xc0\xdd\xfc=ro2=F`r9\x94\x87}\xbej\x10\xefT\x8aG\x06\xb1.\xc9\x90f\xa6\x9e\x1b\xe9\xd2\xc9\xdda\xba\xca\x923\xdd\xd0Q\xa1\xcd$\x84KdSJ\xa9{\x9b\xc4\xd9\x9d\xe2\xa5\x04f\xf8\x92\xaf^\xef\x19\xc1\xafR\xa7;\x03\xda\x01\xdff\x8d\xbe\xbd\x81U\xa4\x9eT@\xdd\xd5"\xd1f\xc5C \\X\xf4oi\x7f\xa7@\xc1\xcd \x01F:\x1f\xd3U)\x83_\\\xd0\xc4\x10 \xc6\xff3\xbb\xa7\xe6(W\x99cQ\xbc~\x05\xfd\x97>L\x07\xbe/\x8b\xffP\xecS\x81Z5\xe7\x89\x9b\xbeHx\x94\x88\x86P(u\xf00<\xe8}\x8e\xd3\xefx\x1e^\xf0\xbb\x02\\\x9c\\S\xd5Z\xbcg&\x18\xa2y\xf3\xbc\x8e9\x15dq\xcc1\xfc\xb9wx5\xcd\x07hi\xa0\xd9<\xe7\xd3\xa7\x05\x07\x062g\'\xbc\xf7e*g\xeaa\\\xe2#\x92\xff=*\xf8-Y\x14\xdf\x884\xd1\xf3\x94r\x8a\x9d-7k\xe4l\x93t\xb12\xb8qD\x17\x8ch<\x8e\x07\t\x07\xe8\xaf\x9c\x00\xaf\x97\xfe\xcf\'@S\x11q\x03\x8d\xcd\xf3q\x1fb\x19\xc4\xaaNj[\xd3R\xe1\xaf\xb8\xf5s\xd5\xf7s\x92]\x87\xe1\x8b\x95\xb7\xdd\x8a\xea\xeeS\x86{\xa1\xfd%\xcc\x8fy[\xdb\x01\xafw\x1d\x18\x04\x8fqI\xe2\x8f\xb2n\xb0tT\x1f\xc9\xa3\xb6\x8e\xc5\xe4\xcer!:{rJ\xc6V\x83z;\xbd=\x95\xf8\x08\xee\xda5\x19\xdd\x8f\xe1\xdb\n\xca\xce\x01s\x8f\x12s\xb8P6W_"\xb6\x9bP|`\xd8a\xc5\x95\xb6\xc2-\xb0\xef\x98\xffe\xebF,p9>\x8a\xe8 \xe2\xab\xa7"\xe7\x18Y\xb6\x87HT\x82\x8c\xfe\xe45[\xb4\x0cE\x1eM\xa1\x11\xfb\x0bsP-\x1d\xca\xc5\x96\xc7\xf6QS\x87\xaa\x8d\xe2\xf4B\xca}\xa65b?\xc8X\xf3\xa0\xc6\xeaP\x9e\xadW\t5\xce\x13s\xd3\xb2+\x94P\xce\xcb\x81\x1b\xca\xd3\xf4\xcbv\xe3\xb8\xb1\xfb\xc1\x89\xf3\xae\x99\xfd\xa66l~\xea\x93\xb2\xbaY\xfe\x96\x8aH\x13\xaeiMeJ\xca\x0cqK\xfa\xa7\xda\xbf^\x11\x01\x80K\x15\x8c\x0cZ\x96\x8b\xbeos2\xcd_\x86J@\xe8J\x93\r\xa1\xa6D\x98A\xf3\x98/ \xc6S\rRE\xcf\xdb\xcd\xe1R\xf1D\x048t6h\xb8r0\x18\x8a\xa4,\x8d\xf2\xebOK\x00\xa4\xd9\xf4\x00.\x0e/\xdaF*\'\xea\xdf~\x06>\x00\xe2b\x94\xa5CI\x04|vA|f\xa7\x81R\x14\x16\xc7K~\xd5\xfe\x02\xeeA;\xedL1\xb9\x84\x8e\x1e\x1a\xe8\xd43TP/o\x82\x96\xd1\xf1\x97\xb7U\x06X\x9b\xc9Y0\xd9\xb4\xfa\xfb\x92r\xff\xd3\xb4\x19\xe1<\x89\xa0\xcc\xe4l\xb3`\xd7\xb0\xb5\x89qxDM\x00\xf7\xf6_8\x9f\xaa\xc8M\xb7\xb6\xdc\xa1\x1a\xe3j\x05\xcb0\xa1\xd2\xccp6\x1bB\x17\xc6A#1P~l4\x06w\x8dJ\xfdA]46\xbf\xddqf\xbcP\rm]\xa0pk\x97\xe2d\xab\xc6\xd5\xc5\xf1\x8f\xb6\x08$\xde\x1d\xf3\x18\xf6\xdc\xb2\xa4\xd3\xc0\xac\xc3<i\rz\n\x1b\xa6\\\xff\x0b\xb3\xc7\xa4~\x99\xa5z\x80\x1b*D\xe0\xdf\xd1\xb1\x11\x93\xb1\xde%m\xc1\x04\xe5q\xa8\x9d\xa6\x1c\x03\xdd\xa4\xa4c\x07h\xf5qy_\xf7\xf5\nVC\xc3\x1c|g\x04\tS8\xe4\xf2=a\xb4e\xa7_t\x81\xa2\xbc\x8eW\xccX:%V-&h\xf8\x89\xde\xe9\xc9\xd3h\xd8{a\x9eBTNi\xadUU\x0c\xd5\xfc\x96<"\x8d\x9b\x17<\xee\x1d\x80\xe5K\xbb\xdd\xace\xb0r\x95\xaf\x82\xc1\xb9\xa3$\xf5\x13\x9aG\xf0\xcaD\x14\xad\xa5\xdf\x93\x11\xf9[\xb3\x13Q\x1fV\x04\x9cH^NHD\xad\x19\x14\xdfc\x96 gv\xa3N\xf6\xef\xdb\xba\xd1i\x1e\x1bSr\x8d\x0fk\x9944%\xf5\x19|\xbc\x10\x07v\x9d\xe0k\xf3\tP\n\xfc\xdc7\xd9\x88AS\xbf\x10S9\xac\x07\xad<\xb2\xb3\xd2\xae:sV\x18\xe1\xea-3]\x0c\xa7\x00W\xc1\x13\xa4S\xca\\\xd9\xa8\xfd\r\xfc\xe0\xd5f\x079n{\xa9{\xef!\xecH6\xa8*\xdf\xbe\'\xae\xc8\xbd\x17\xc0\xd1A\xc4\xbfT\x08\xe0\xe1F\xd2X\xa8V\xfdK.\xe2\x9d\x93\x0b\xb4\xf9\x100\x8aWl\xce\xcc7\x077\x91\xe4\x19\x17\x80\xcd\xa0\xd1E\xffT\xda\xe8\xf4\xe4\xfez\xaao9\xbe\xce&^\x97\x9f@\x7f.\x7fqw\xde\x16\x81\x0e\x9f\xca\xbbO:\xbc\xfa\x18\x8d\xbet\xba\x96\x9fc\xef\xa0F\x10\x95\xea\x8f_\x94\xaf\xb2u\x99\x81k\x1e\xaf\xe9){\xed\x92_v4\xe8X\xa6=\x0b\xb7\xaf\xca\xf1t\x979}\xbb?=H\xf7\xba\x94A\xb5\xfdE\xbeO\x86\x9e\xacU?\x93\xf9\xcb\xf9\xc4\xad7{\xbb\x80\t\xea\xedoA7*<\n\x13)\x1a@\x195\x963\xd6\xc6d\x1f\xeb\x14#z\x01\x15`?\x07\xb4\xab\xf4Td\xd6\x84\x9e\x1d1\x99-\xb2@\xa9<\xbf\x81*\x16\xe9\tR\xc7\xa4\xee\x0c\xd7F\xf45d\xc6\x81\x95\'\xfao\x91\xbe\xe5\xf6\xcf\x1c\xfb]\x8e\xf0\xab9\nb\x1ex\x8dV\xc1\x15\x7f\x10\xdfH\x8d\xedx\xcd\nN\xf7\xdb\xc3\xbe\x8e\xdf\xdf9O\x96\xe3M\xce5\x13\xecs*\x97r}\xed\xef\xaf\xdc\xf6e%\xd1m6\xd2g|P\x96(\x16\x12{0\xb4~\x81\xac\xf6\xf6\x19\\\xfb\xa7\xc96\xa7\xe1\xa6fw\xd8\x98\xb8o_\x05\xe6\x1e\xee[\x99u\xd3\xc5\\\x03\xf0\x08\xd7\x8c\x18\xc3\x8bD\x12\x91\xb1j\xael\x81\x08O\xff\'\xec)\x81\x0bg\x7f\xffZ\xf3\xbc7]\xf8m\x03\x13\x96\xb6B\xee\xa9<\xca\xbdy\'\xe0s\xf2^\x0f\x918\x88\x0b\xad\xab\xa0VZ\xafB\x05"w0\xfdI\xb5\xdd\xe4\x1c\xe1\x1b\xaf\x7f\xf6\x9dt\xb5K\r\x10\xb7\x85\x96\xd3\xaa\'5\xda\xd3\xb9\xf1\xbf\xe6\xb3\x16\x0f\xc8\xe3\xa9\xee\x8f\x8c\x8eJ\x97]\xe8\xe8\xe7\x15\xc1\x15(\x12w\r\xf4b\xc5\xc1)\xf9\xc4\x0e=\x94\x0b\x95d_\xe7\xec\xf0F-\x13\xf5l|\xb4\\ld\xc9\x80\x9a!\xca|\xcaR\xcej\x88X\x15\x02\xf0\x15\xdf\xd8.!<\xb6\xd5\xd8\xaf+\xa1\x88a\x8b\xdb\xdb\xb5\n\xf4\xac\xb9\xed[\xef|\xb75\xd1\'\xd0\xb1`d\xafr\xfai\x9eD\x08\x9cR\x04\x13\xfa#\xaa\xc4\xeefJ\xe9v\x11-0[\xbf\xb6\x05E\x7fl3\xec\x9a\xb9Y\xa7%\x92\xd0\x90\x82>\x9c\xcf\xcek\xed\x03&l \xb4v\xcd\xf4\x11\xe3\xf3u\xb7\x1bX&\xc7\x7f\xfc\rtq\x14\xb0}\x03\xd4\x15\xb2\xca\xe3\x19 \x9dZ\x94\x04G{t\xab\xd3\xc6@TN\xc8D\xfb\xdc\x18~0\xa3kl\xf4\xbc\xaf\x86\x8e\xc2\xdb\xb1\xa4ig\xdaLf)SM\x92\x865\x89\x91\xb7\xf3 K\xb1nE\xa7\xe1\tp\x17\xca\xdd\xbeg\xd8\xe5MC\x7f#\x0b\x024\xef\xca\x18ny\x91\xca1\xbbg\t\xd1=\xc7R\x7f\x9e#Q\x95qR+u\x82\x15\x9fU/>\x14\x82\xbb\x90\xa5\xd7\x00\xb6\xca\xf6\x9c\xf5\x10&p\x7f\xc4S\xd4\xd3\x1f?\xe7t\x14/|u\x9f\xd3\x1c\xf9\xa0\xf8\xb2\'\xb5x\xa3\x0f\x9enH\xfe\xa2\xdd\x1eb\x82Z\xe4\xe4\xad#\xdaG\xcd1\xd2\xca([rG\xf6-\xc7G\x02\xc8\xd2m\xa27\xca;AZ\x14*:\xecu\x80\x8a\x7f\x17\xa7H5\xa8q\x9c\x88\xfd%Ph\n\x82\x01\xee\x8c\xfcdN"R~\xbc=\xc2\x1c\r\x84\x8a\xdd-Pu#_\xf5\x80\xe1\xde\x94\x1bPP\x9e\xc9A-\x1av\x19\xb3i\xbf-\x92\x0f\xee\t\x9f\x06R\xb9w\x97\xc4\x84\xcc\xc5pQT\xe3\xb1a\xe0\xca65\xe5\x94\xb6\xe3Hz\x0b\xccx\xe6\xe7\x94@&\xcf\xd2\x0f\nY\xb7q\xb1\x96\x04\xef\x90\xe0\xb5H\x165\xd1\x05\xfb~\xc8\xb7~\xeb\x85\xc2\x1c\x95\x1d\xf8\xec%{\x9b\xc5|\xcb\x8b\xa5\x8c\xcbgR\x85\xe2>\na\xdf\rW\xb9\x12B\xbb\xa6\x9d\xd2\xbfb5h\xf0\x9c\x18\xfb\x08\x95F<\x04\x05v\x9d\xea\x1cA\x89}\x870iG\xf4]Mm\xbcAl\xaa$\xdd\x96=##X\xbd\x16\x0f\xd2\x98 \x1ds\x1a\x10z\xe5\xcdp\xe1\xd4q\xe0j\xce{\xc57\xc1\x1c\xd2IM\x8e\xac\xb4\xf4\x8d\x156\xf1\xc0\t\x10A/1\xb8\x0bJ\x84\x8dr3\x86K\xb2\xf5\xf0\xa93L\x8b3\x95ZJi\xdf\x15%\xb3\xff,C\xc3\x0c/1\xc7\xc2\xfd\x11W\x8c\x13[.`\xde\x94\xe7\x8fR\x15\xc7m?F\xe4E\xe8\'\xd2\xba\xc7\xe7N\xbfc_9\xb8\xd8H\x19\xae\xd4S\xa5\xae\x11\xedn\xa2\xa2\xf2\xa0\x94\xeb\xac\x8f\xd22\xc4\xd6\xd1\xa9vK\xcf\xe8\x0f,\x8a"\xd1\r.n%\x98\xc3\xf4\x8d\x89\xe9\xb7b\xcdA\xc2\xa1\xf2n\xbe\x0fq~\n\xca\x93\x0b\x13\xe6\xea:\xaa\x1a\x1e"\xabW\xdc\xe3\x1a\x81T\x8dRa\xf9\xcc\xb6\xbcQM\x15,\t\x9e\xb2\x86^<\x91\x92L\x02\x8f\xb3\x9b\x01\xec\xb6\x0b\x1cq\xb230\x007\x1b(\xd3X\xb99\xcf\xe9\xe1\']u\xfb\xdca\x9bB\r\xaf\xc9\xb0=\x18\xa78=\xfc(T\x14\xa9rq\xfagH\xb2C\xc7\xa8\xdb\x99\xe8\x0cZ\nn%\xc2D\x81:\x90~Pr\xf4\x12\xaaS\xc3\xde\x8c,OjM-\xec\xec\xe6\xf8:l\xe5KF~}\xf3\xfd\x83\xcf\xd2dP\xa6{^u\x1d\xf5\x10v\x1e\x18y\xe8\xe2\xc0\x89\xd0\xaf\r\x94@\xf4\xe2\xda[H\x00\xf2}\xda\xed\x8bF\xe8c\xc4\xac\x97\x01\nM\xa3\xbe\xac\xc9!!\x04$[v\x1aCB\xb0\xad?S3\xf0\x1c\x80\x11aL\xf7\xe0Rj\x05\xb5\xa7\xc0?k_\xc5\x1a\xbb\x9b$\x04\xc80k\x08\xe9c:\xe7\x89,mhd\x80\xad\x91"Br^\x05\xb3y\x1e\xee\xa4\x16\xe4;\xc8\xd1\xeekl\xeb\xca\xeb\xb2\xf7(\xcbk\x99\xdd\xb6\xc5\x8cp\xd7 Rj\xe3EF\xbbg\xce\xb8gwhc\xa5\x13\xa7\xe2\xfa[T\xd6l\x9e\xd2+w\x98%#\x8a1\xb4\x80\xd4\x8e4md\xc7\xf6\xe9\xde\x88\xdd\xd5\xe5\xda\rTh0\xc8\xcc\x9cW\xef:\xd0Pr\x94\xe6\xbdS7\x14,f\x04\xa1\xbfTUlBn\x80\x99ej\xb5_\xb3u\x80\xf1d\x98v\xbe\xc6\x1b\xc8\xc6\xc9\x87\x120\x82\xc7\xa5\x13g]>\xbe\xc5h\x15fSl\x8e\xc2,\x91\xf3\xc3\x88\xf7\xbdg\x1c\xe6 \xd4\xd4\xbb\xf7\x90\x87\x1f\x99~\x84\xd3\x04\xe7c\xf5\xed\n\x8b\x10\xd2\xfe]X\xb8\x86\\;\xc4\xd1\xe6e6\x05\x18\xfd\xd4Ox\x9fX\x03\x8e\xbf\xd0\x14\x0c9-\xe4\xaa\xbcM\xab\x19\xb5\xaeJK\xd3\x1dB\x89]\xef\'\xa4\x13\xd561u\xfd\xd9\xd6\x0b\xb8v;7\xbb\xb5\tR\xc9\x11\xa5\xe2u\xc8\x02\xa2r\xe7a\x9c\xbe\xd0S6H\xa1fc\xf5\x16\xd6\x03\x82(2\xa8c1\xe4\xc9\x8d\xfeN\xcb K\x11\xab\x8c\xe8\xb9\xa7`S(\xf2\xa6\xf3\\\x17i\xd9\xfa\x95-\x80\xbc\x0bel\xaf\xa0\xec\xe3\xd6\x8dhX\x17\xf8\x9d\xe2\x94I\xfb9\x7f\x1c\xa7\xc6\x1e\xe0\xb9\x8e\x08\x10B\xd0\x9fO\x94\xb1r\x896YN\xa9\x03\xf0 Vm=d)\xfa\xd2\xcf\xb3\xe3\x19\x95\xc34(W\xf2\xf9\x819\x0b\x92\xbe\xdc\xf5m\xea\xa81\'\xbe\x0b.\x8b\xbf@\x0c7z\xfb\x12\xcf\x00\xdd&\xcc\x05\xed\xdb\xf0\x07\x14\x9c\\\x8a\x86\xf2<(\x0e\x123w\xb8O\xb0\x1dOe\x14\x01S0+\xd0S\x0b\xa7\xe5\xa8/\x19\x05g\xdf\xcdf\xa7\xf4q\xae\xae\x0c RU\x90\xaf\x1c\xdf>\xa5\xb7kVN\x93&\xff\xb5X\x14#\x9f\xb4"E\xb0i\xed\x8c\xde\xe0\xb3R\xfd\xd7\xd1,\xaf\xe5\x9b\x9b-\xb1R\xafc\xe6(\x12\x9d\xd0\xea\x83\x0c5#\xd8\xf7\x08\x00=\x80w\x08 \x85r\xa0U\xf9\xbb\xc3\xe5\xb9\xd2\x8a\xb6*s\x10\xa7\xaf2(\xf3\xe1p\xc9\x04\xdf7\x9c\xc1:\xee\xd5\xc6\xce\xbdh\x11}\x8bb\xbf\xcd\xa9O\xcf\x07\xa7uK`\x93\xf4i\x11\x92\xc1\x1d\xb9\x8bMpec\x88M*7\x85;}\xb6i4r\xa9\x07\xef?\xfe\x04B\x84\xbd\x1f\xe4\x9e6\x11TC\x00\xe9\x80\xe9Y\xf6\xd1(\x01+\xed\xcdk\xa2\xd1n\x80\xf9\x98\xd1(z\x919C \x7f\xb3iE\x18\\\xdfMM\x90\x8b\x08%\x08\x90)\'\xf2\x87\xa1Z\x0b>0\xb2\xe4\x02\x88\xcd\xe5s\xfe\xaf\xf6\xd3\xa5\xf8\xd0I\x8e\xd0\xe6\xf0\x04\x8e\x87\x89Q\xe3H\x0fh\x98E\xbf\xb1Zu\xf6@\xeb\x80R\xfc4U\x91\x08\xf0\xff"\xdc\xbc\xbb^\xa1\'\xfcO\x00\x8a\xad\xf2KG\x84\xbf\x93V\xfb!]r5\x87\x0b\x96\xf7\r\xa4\x11\xbd\x01\x91\xa0\xc2\xc3\xe4m6\xcc7I\x9e_g:%8-\xcaS\xbc\x01r\xee\xd0\x0fd\x97\x10\x10\x1f\xf1\xf7\xbc\n\xd1\xee\xf6\xc2xk\x9eI\xe03\xb4\xe2\xa0\xec\xf7\x13\xa2\x9a#7\xae\x06(uB\xd1\x9a\xa6\xe7D?\xed\xc0C\xc5\xbc\\\xa2!\x005X\xa2\n\xdd\xcb\xb2\xf0\xa0[I\x9ef\x16\xfd<f\xaa\xf3:\xb1C\x98\x95/~\x97\xf9<JJ\r\xfe\xef\xf1x\xd9\x17F\xabv\xe4\xb5A\xb2\x02Y\x0e\xeb%\xb6\xf70\xc9\x9b\x95\x8d]\x80LB\xb5bU\x06\x10p\xdcc\x8bFi\xb9]\xc3%wX\xb8#\xe9\x0b\x19\xd9\xb3Kl\xc9\xcc\xba\xaeK\x94\x11\xca\x1f\xb1\x15\xd1\x88\xf5\xe33\x1d\x7f6\xe7(\x84\xdc\x00\xcb\xacf\x80\xfb\x1b\x83\xa3:\x84,\xa3\xb9J\xea+\xb5Z\x9a\x92\xbbH\x96v\x073\x03\xa1\xe2N\xc5\xbe\x9d"\xa6\x15\x841\x94\xfd\xce?\x11\x03\xa7\x01\xc2z\xa8\x8bj\xa57\'\xa8g\xffk\xb7t\\\x8e0\xa2\xd0\xf3\' \xda\xb9\xe2\xb0\xa6d0r\xf5\xcdf\xbbxv#p\xaf\xb5\x99Y~9\x97J\x1fN\x89lQq\xf1\xa5f\xf2\x10\x01\xcd\x14\xe5\t\xacA<!\xf6w"\xcaR\xd2H\xcc\xc7\x0fC\xcefw\xb3\x9f\xebp]u7P\xb4R\xf6\x08\xe1\xa7\xa6e\x08\xda.M\x86\xe7\xee\x12\x139?\\e\xf7\xc4\x83\xb7\xfe\x9e\xfe\x96 \xb7\xbbTj\xfdyP8^\x1bA\xba\x94\xd42\xbe\x9a`\xe5\x94\xb4Q\xb3\xa1\xa2\x16\xc0\'\t\xaa\xc35\x14\xd9\xfe\xfe~\xd2\x95\xfb\xe9\x95:\xe8!DnI\x12q\x1cW\xb1x\xfa\xdc\xf7r\xe0\x84\xa5o\xb2\xa3#\xd7\x0c-Y\x91\xa1&\xce\xd8\x02\xc4\x8a%!\x8f\xa7\xcc\x0b\x17\x9d8\x9c\x950\x97\xad\nY\xed\xc8Z\x93\xecm\xca\r\x85$\x04\xc7\x965=UP-\xc4\x94\xf9\xf6\xd4r\x9f\xd5\x11m\x8e\xb1i\x84\x0fh\x86>8\x9c\xc7\xec\x86\xdf"\xb3\xb6\x97\xe9y}\xe1o9\xc0G\x96\xdbiK\xde\xb2\x19\xd5\x88|\x08\xdb\xbc\xc642Q?Z\xa8\x04s\x8b\xe2.\xc0u\xc8\x987\xdc\x91\xe5M2\xf9\xa8;r\x0fi\xb1\xed \x1a\x04\x93\x99n\xbcj\xaaq\x92\xd5\x07\xfe\x80\xee"(ssb\xac%\xb2\xc4~\xa1\xc7Q\x0e\xb7\xffI\x10\x88^N\x81\xb5+}\xc0l@\xaet\xb3\x19k;C_s_\xfc`\xebd\xd5\x1e\xdf:\xf8\xaa\x16\xe18\xec\xf3\x80{SO\x15\x9a\xbfP\xcd\xb2\xf0!|5\xa3\xfd\x00\x84\x1eT\xd5@\x93jN\x12Oo\xfbw\xc6t\x16&~\x9ci/\x12\x8b5V\\\xd3\xe2Tw\xf1\xb5v\x93\x9d\xc7+7\xc2\xc5\x9a\x96\xcb\xd8\x19DZ\xbe\x9eH\x1f:7\xf0\x03\x8e2\xbd\x1fUo\xb9kd\xcd0\x89y/\x14\xf5\xcb\xa8\x89\xa0\xe1\xcfm\xb7\xe3\xbc1\x11\x98\xd2\x0c~\x05\xa1\xcc\xab\x1b\x14\xc9\xa8\xc8K6I\xbcJ \xbe\xea\xe15\xa4o?\xda\x16\x83]\x8c\x8a.i\xae\xff5\x9e\x96\'oUy\xf5V\x03d\x14\xcf\xf8\xb5\xd1\xde\x13^\xea\x13\x82\xbf\xcb\x1701P\xad\x07e\x1d\xe7x[\xa2t\x91\xebnt\x13\xefW\xbc\xeeQ\xa3\xdb=\x8b\x143\xad\xc7_\xc7\xeba\xe3\x16\xba\x8a\xc4\x1e\xf4\xb8\xc0\x02Q\x8b\x93+\t{\xf3p\xf4\xb1h\xe4\x13\x13\xa7+7\xb8\xe9=\xba\xa5\xa0\x8b\xfd\x92$U\x98\xcb\x90\xac\x07A\xeeY8B\xa5\xca\x91s1"\x87\xaa\xba\xf1\xac\x9dQ\xf3\xa7\x8bM\xfa\xb48\x10\x8b\xe2X\'\x94\xf1\x81\xb6\xfb\xa0\x1e$\x17_\xf0O\xfb\xc4@#*\x01\xe4p(W67\x92\xb0\xb7\xc8\x8a\x8f\xc7\xb6\x94\x7f\x07.\xb3\xbd"C\x07\r)g\xc9\x84\xb2x>\x96\xc8\xb1\xf0\xc1\x14\xbb_\x94L-\xdbe\x95@\x1a\x80\xd5\xe8\xf6f\xa734\x85\xff\x1cx?\xa0\xc0Qe\x1dU\x8e\xec\x18\x079\xdaD\xddD\xc9\x89\xac\xcd\xf2\xb2\xb2\xf6\xca\xf9P\x91\xb4ha\x18\xaew\xe5U\x00V\xa6t\x03\x0c\x03H\xfe\x11Zhv\xf2Y\xd2\xab\xfe\xe1\xda\xac\x92\xb1\xe9=M\x9e\xcd\xa3juM/R\xb0\xf6\x8d\xd6\xe5m\x10\x07\x994+xu\\\xa8\x84\xbb`a\xb1\x90r?J5t\xf4\x15\xa5\xb1\x98\x15\x91\x9d4\xb8M\x10\xdd\x85l\xf9\xce\xe9\xc6TI\xe2\x8d\x198\xd7\xfc0\x83\xcc\xd6T2o+i|\xe9\x89}\xfe\xdb\x91\n\x96\xaa\xd1Po\xf6\xa4\xc2\x12\xa4\x85X\x92\xfeyZQ\xf6[\xd1\xcb\xe7"\x08\xbc\xac\x8aF\xd3\xf1\xbf\x90U\x9c\x98\xb0\x1d<7\x82\xb7\xf3\xbcT\tl\xee\xed\x12\xb5kP\x11\x99B\xe1\xae\x9c\xf9qi?n\x05;\xd35\xef\xedcj\x0f\xd3\xe11\xd8\xcck+ \xfb\'\xda\xa7:MR\xa4RC\xe6oVH\x10\x1c\xe8\xd7\xaal\xe0\x01\x986%_\x16\x0e|T~i\xc0g1\x07"\x8f\xb9+\x15*\x1ft\xcbF=\x19\x81:\x8d\xdfy\xef\xf41y\x91J%\xaa~\x98H\xbb\t\xdf\xfb\xf0!\xa8\x02\xb4\r\x9e*\xe2\xf5\xbb,\xd2\x0eD\x11\x1e[\xa28\'U\\+pcsA\xe0\x08\x8b\xa2E\xf5)\xf1\xd3\xc7B\x96\x92\x10\xb2\x9c\xd6\xb7f\xbf\xcfx\xfa{u\xcfek\xf5k\xa4\xf9)\x8a\xd0MH\xbb\xa5\xd2\xe2d\xb9\xac\x8c[K\xc5\xd0`\x9f\xe1\xbc\xf0<\xa7\x90BA\x0f\xdd}\x9f\x18\xae;{\x9d\x94\xbc\x10\xcc\xaa\xa8\x9c\xa2\xf7\xacD\x16\xc4\x86\xd4\x9c\xaeO\xf6\xe0\x1c;V\xd0\x160\xf6\xc00;\xf2\xe7N~\xa25\xe3\x01\xa4\xd7\xc9X\x93\xa9\xc6c:\x0f\x96\xe9\x0e\xf2\x95\xb3\xd1\xf3)\xe7!\xd7\xe3\xdf\x9d\xc4;\x94\x8f\xa8\xe6T\xb4\xa78\xeb\x8e\xf6\t\xb7Z\xc7N\xc8\xe8\x93\x9aH\xc4\x8d\x82\x93\t\x98\xb0R\xaa\x1d<\x8avp\xe2\xa1/\x1f\xe8\xa6\xc59B\x99}c%\x1d\xc1\x8bs\xc6\x136\xce"\xfc\x98\x87\xaf*j\xbf\xb5\xf4\xbb\xc9\x0e\xd5aw\xd4\xc5\xec-WE\r\x9f<Eq\xc4\x99\xdeh\xb5\x98\xa3v9\xd8Ar\'9\xe3C\x9ej6\x16\xae.\x01\xbd\x9e\x8d\x0e8\xdbNe\xa9\'\xa5\xdd\x81/\xeb\x12m\xf8X\x04%!\xe4z\x88c\x8fp \xf8\xde\x80pA\xd9,x\xa0\xa4\xfe/\x08\xc7\xb1o\x87od~\xaf\x80)\x86\x9f\xcd5\x8f\xfa\xfb8\xe7\xce,\xbd\x94P\xdcj\xcf!\xf0\xa4\x02\x01\xe5\t\xd0\xb0\x16\x17\x12`S#S\xf7\xdbE\xe5\xb0X\x80\x81\xce\'\xf2\xcc\xb5y\xf6\x05\xfe6\xd5\xff\x86\xa6\xde\xf3my\x13\xc5P,\x9f\x18\x90\xaaL\xcb\xa8\x7fh\x7f\xfc-d]\xcd\xa5\xb1\xd7V!\x8f\x03\xf1\xc9\x7f$>\x0c\xb3\xbeC\xbb\x12\xa1f\x18\xff\x93G\xee\x0c\xe37J\x0f\x8f\xe3W\xad\xbe\xf6q\\\xb6\x1b5\xec\x0e\xb8\x1a \x1a~Ii\xb6i\x82\xbd\xb6\x0e\x8d\x10(\xb3v@\xdcY\xe7\xa1\xdb\xb9\xef\x11\xc0\x8e\xac\x03\xdc\xc8\xc3\xe4\xf5\xe8\xe2\x82J\xd0.]z\xb0\xc36\xe6\xb0\x9dQ\x89?\xbai\x84\xd5)\xca\xb1J&\xc9v\xb4\xfe\xf4\xbb\x7f&f\x9d\x87D\x93H\xb0%\x91\xce\x02R\xe77\xb3\xe3y\xc8)-\xd0\xf3\x89\xdc\xcc\x12:O\xcc\xcb\xba\x95\x0c\x0c\xc20\x0fB\x14e\'\xbeN\x06\x0f\xbb\xab\xe0\xf1\xc0\xc1\xb5s\xe7\x11\xcb\x87V\xc8\xf4\x1b\xcb#*p<`F\xed\x97R\xa5\x1f_z\x89\xc5\x1e\x0b9VVG\x99\xf8\x8a\xdc\x87\x14\x12\x8e\xa2Y\x89"*\'\xcb\x96\xed\xdbs\xa6c4\xd2c\xf4\xa7F\xb2;\x85\xc3g\x14\x97\x0f\xd9g\xab\xbb\xa6s\x1a\xb9\x11\xc7\x089r\xfa\xdd\xea\x11\xd7t\t\x83\\X/\xe6[\xb6\x9a+\xcc\xa5\xc2kG\xb1\x07.\xd2\x1du\xda\x1e\xf4\xed\x9fx\xea\xa9\x7f\x9b\xa5\xc8\x9ah\xb2\xe4>"?\xf6D\x86\xacYO,P;\xf2\x00\x87\x14z\xa81\x95\xf4H!P\x1f\x12\xb5\x84\xfb\x0f\xdc*\xfd+c\x0e\xa4E\xaa\xc1r\x9f\x1f\x937\xc6\xd4\xdd\xeeK<\x9cvG\xb0\xb2~\xceC|\xbb\x05\x9daL\\\x88\x97d\x9e{\x84\xeb\xb9^\t\xf7h\xa9\xc4\xbf\xacu&\xcb\x0b\xb7\x83\xd6\x05:\xc2\xb3d=\xa5\xfe\xf5GU\x07\x08\xee\xcf\xf3rV\x00\xe7\xeah\x9e\xd6\xa3\x8b\x7f\xf3\xb3e@\x1e\x08\x04\xfe\x11\x89\xc5M\x19\xa0(\xda_]H\x82I\x10\xde\xa2@d\xfeX\xe8\xaf\x16C!\t\xf5\xea\x89W7\x05\xcb\x13\x13\xd0\xc3\x14\xddTK\xeaVt\xdd5\x9b\x9b\xbbBw\xf4E6g\xe1/^\xbf\xe6\xac\xdf?\x05\xd3\xa30\x94\x84\xdcF6\xe0N\x9e\xce|&~en\xa9i\xa2\xdc*e\xd4\\C\xdb0\xbe\xf7:\x1f\xbc\xe1A\xbdZ\x97\xcf\xf0/\xdc\xda\xd0KE0\xc5|\xccFR\xc1\x7f\xae{\x95h^\xd9\xcd\xe2\x98\xe0\xee\x19\x9c\xd2\x08\xec\x14\xdc\x1b\x0b\x13\x8bv\x00\x8d\xeb\xb5\xc04I(\xd9\x16X\x9d5\xa3v@\xb3\x1f\xaf3\xee8`O\xdb\xfd\x06\x95\xcc\xe3\xe8B)\xa7\xca?%\xb9\x96{|\xb6\x04\x90\x11"\xa1\xf8"!\xec9\x94\x13\xde\x08\xf2\x93W\xc2x\x1ax\x90\x83#\x0c\xce\x93\xf2"\xcae\xdfN\xb2\xbb\xb9\x1a\x06\xe2\xf9)\xf8b\xbf\xfe`{\xf6\xd8\xd7\xa2\xe1K\x1d."T\xf3\x13\x82FT\x9f\x82\x84\xa5\xe3\xd3?\x9d_PD\xe8\xd3\xfb\xa8\xedxVis\x9c\xe8\xfb\x92\x8a\x9d\xf0\x8e\x03\xb5\x01\xbf/%\xa1\x8c\xd9\xcbb\xf7\xaeiK\xf73\xefp\xab|\xd8\x1c\x0e\xd9\xa2:n\x06\xa3\x19\x90\xad\xc4\xc4\xe9\xf0\'>\xa2\xd5\x98n\xf4\xd1\x81\xec\x87\xe9q+\x04\xe5\x96q\x94\x19\xf8\xb5\x98N\x8b\x8e\x87_\xf4"\x00\xfb\xdem9n\xde\xf7==\x86.\xc6\x98\x079k\x81\xd8m\xc3l\x06\x93\xee`3~\x04\xd2\x96\xf9\xc8\xe7t\x1b[\xa9\x01\x1e\xc2hNY^\xd2\xf5\x945\x91V_\xbbr\x99\xd1\r5\xd0\x85s\x12*qT\xec\xf8\xaf%\xad\xad\x14F\xec9\xab\x9a@\x91g\xb2{(\xe7$\xec\xcdL\x9b\xb2\xa0\xef@\x93\xd2v\x19\xbe\x1d\r\x11\xff{\xab\xb3\xe4z3\x907g\xe5\n\x16s\\\xbe\x1cRc\xf0\xd8~\xf4.\xd1\xd82`\xcd\xc2\xb7\xf6bC\x14\x19\xdd\x95\xc2bnD\xd4\xcb\xc2\xaf\xef\x1f&#\x15\x06\xa2\xd8\xc3\rE\xe4\x17\x952\x93\xfe\x04(\x83M\xb3\x0e\xa4<?b\x03P\xf77R\x8c\xc5s\xbe\x0b\x82\\\xac\\DB2\xc6\xc9gH\xec\x03\xac\xf0\xc7nl}\xf0\xb8K5\x9ez\xc4\xf3\xfd\xa2\n@B\x86\x8c"\xe7\x89\r\xc4/\x8dI\x90\x80\x12E\x85L\x9aXj\xfc\x881\xddM\xbe\x04\x19\x0b\xec\x89\xe5f\xb7Y\x95\xfdN\x8f\x87[\xe8\xbf_\xd0\x9d/E\xda|.\x9a\xa7=\xf3?\xa8M;\x0e;\xeerkz\xd7T\xbe\x94T\xe5\xca\x11\xd4\x90\xc9\xddU\x05\x90\xec\xb13$\x08\xd4is\xe2b\xddWd\xeffi\xdb\xecp0uc\xa7x\x81\xb0U\x9bw\xe6\xc7h\x0f\x14C\xebQ;_\xaa\xf1\xd1\xbe\x1f\xe9\xceo|\xf4T\'2\xa5a\xc5!\xfc\x89a\x94\x04\x89><\xeb\xc4\n-@\xa2hL\x8b?\xca\x8d\x0f\x86\x94\xd7\x99\xa5p\x1a]!\xfb\xf6\xfct\xb9\x93_\xfe\x04\xad \xce\xc0?\xb1o\xd0{\xc7\xfaw\xd1\x18\xab=\xdc^a\xd47\xfd\xdc\xbdr\xd5l\xd2\xb9\xfa\x85y\xc5f\xfd;\rD0\xd3c\x96hYl\xf5\n\xa55\xeb5\xb4\x9d\xbe\xaa\x80\xd60;\x07R\xac\xc0\x117#\x1f\x0b\xcd\xdc\xbb#\x8e\xd3Ny\xfc\xe6\xe0\xabv\x08F\x10\x18\x9eG\xf9\x10\x91L\xdb\x00s\xd8\x01\xfa\x9f\xfc\'w\x88\x0e\xbe,\x95\xdc\x8f\x17}\\\x85g\xebR\'\x86\xb0\xe6x\xd9\xfd#\xfb\x8d\xc4X\xc4.\xd9J\xef\xd4\xc0q\xdf;xm\xd3\x03\xbd\xf97\r3J\xb0Kk\xa6\xd9\xdf}bW\x0e\xb2\x82\xc5B\xe6\x88\x04@\xf1vD>\xc2\t]\xc5\xd6\xe2\xfb\x86O\x1cF\x8e\x04-fq\xee\xc1\xdc\xa9\xf5\xc4\xc3M\x83\xb1\x00\xf6@\xd8:\xab\x16\xc39jy\'z\x1a"\x98\xc8k*\xf2\xd2z\x17\x17\x8d\xda\xdbd\xfatB8c\x01\x13\xdaZp\x96\xaf*\x1dPZ\x8f\x11A\x13O*\x97\xc16\x14\xb9\xcc\xa6\xd2\xbb\xfd\xeeD\xc9e\x88\xd2u\xb2#y\xe7\xff\x1dz^\xfb\x11>\xb72\xa9\x17\xefz;.*i\xfb\xcf\xa9\x13\xc0\xc4\x91\xdc\xad\xa6w\x19T68\x0e\xa0\xdc\xa3\x9bE*\xde\x9aO\xe7\xd5\xb8\xb0\x00P\x92a\t\xbb\x86\x1fN\x0b\xfa\xdf$\x1es-\xdb`V\xbb8\x82\x15\x03JK\xd8\x99\xf0\x1e XB\xe4\x8e\\\xec7\xf0\xd23^\xc4p\xd9d{\xda%\x96\xaa\x1cp\xf4\x1e\xa3\x9cY\xd7P\xddKg\x8aWG-&\x19\xaa\x15H\xf7\xf4\x9d\xa4\xf7\xe2\xbd\xcc\xd1\x8c\xbf\xa6m\x16\x1b.A\x8aw\x19M\x92\xf9\xb1\tO\xa5\xde)k}\x0b\x1cH\xb7\xde5\xe5\xe6U\x90.\t/\r\x13\xe96YT\x00\xd3\x84\xeb:\x8ed\xef\xa1\x05|$\xed\x88<\x8bK!\xee\xb4\xa23\xec6W\xd9\xe8&\xb2\xc1\xe1k\x96\xa0\x07\x04s\t:\xda[\xbfV3\x90\x17(\x95\x08j\xf8~"5o\xc3\xe0\xf6\xb8\xfa\xe7\xf6\x13\x12\xef!2\xba\xbcdo\xec\xd4\x1aD.-\xd6\xf3%\xbf\xce\xa7\xd4P\xe9\x1bh\xa8\xc6zFV\xf8\x99\x1f\'V"\xf8\x92\x1f\xea6\xda\xd1\x01SEu\x1d!\x07`\xb2&\x82\x1f\x89Q\xe1\xa7\xd9oNZ\xbc(\xaf89\x95$+X\xfe\x81*#b\x1a\xf8H.\xca\xb6\xa1\xe7\xa6\x05{\x8f\xc3\xd46\\\x93;\xa4\xab\x149\xf2\x14\xa9\xf5\x9b\x149\xf8\x11:A\xaf\xdax\xbdQ\x88\xe2L/\xc8\xda\xa2\xb7\x92@Xk\xe0~\xa8+\x8f\xbf\x9c=\xd5\xe0\xf7O\xcftF\xd9\x05t\xaf\x81|A\r\xc3\x10\xc9\x9b\xb8\xe7\xb9!qg\x8a\xcb)Y\x90\xd8m\xc3\x98v{\x7f.\x98\xad0\x08\x1d\xf6\xd9m\x19A\xf0y\xba\xbbt0\xb5\ne\xff\xc32)\'{\xd2fm#\xb8.\n\x82\x08\x86&\xd4\\\x08\xe1\xa4.\x04\x8c\x00\x93^.K\xe0ZA\xb1?5\\\x06\x9c\xaf\x01Ofi\xec\x1e\xdf?L\x14Y\x14E\xa65\x9d\xb4C\xc3\t0?\xc2\xf3\xc7\xf0B\x8f\x91\xad\xaf\xe2\xa3\x95|u\x98"\xe7\xd9\xe5\x9e\xbea\x07f\xc3\xcaZ\x17\xee2\xf2\xbb>}\xc1\x9aZpEe\xff\x1f\x15\xa5\xff<\x82\x8ej\xb1\x01\xffv\x05\xa7\xdf\xc1\xea\xa3\xe3u\x94\x10\xe7j\x19%\xec\n\xef#\xd6\x9dV\xba\xaf\x987Y\xce\x90\x14\xb0\xeci\x8d\x96\x14\xfd@\xf6Qgp\x86\x07\xde\r\x185\xf8\xe7\xabo\x11T\xf6\xe6\xbcD[>Jw\xcfB)\xd1\xcd\x00Q\xa3\xb1\x9e\x12\x1b3\xa4\t\xc2?)F\xe3\x90\xb8\xc9\x17\x92<\xbf\x85\xf7G\x98b\xd2V\x83\x1c\xe6\x04\x9d\xd5?s\xc8\xd4\x00\x04\xa3al\xa7W\x0b\xf2:N\xf5\xf1l\x0f\xef\xa0\xca$G\x85m\xe9\x97RA\xedEa\x8f\x1d\xac\xe2\xd4\xf2?,\xf7\xd6\xa7\x1at\xa4\xc0\x9edMx\xac\xaf\xf5\x17\xa4#\x8e\xf55\x95=\xd5K\xe9\xce\x03\x1b8\xab\x03\x19\xf1@\xd8\xa4d_7\xa0uQ\x8f\xbau9\xf6chH\xccc\x0ez\x82\x96Z\x978\xe9\x9d\x00\x08\x18\x18\x9e\xa1\xdf\x82F\x15V\xa3\x94T/\x05g\xa1\x80LV\x0e\xea\xbc0S\xf5n\xb30\x90!\xa2%S\x8e;Rh\x15\xe88\xc6\xc9\n$\xdf`6\xcfH\x1bH\xc2\xf9DC\xc5\x15\xcb\xe7\x9b~\xe7\\\x97\xab\x9b^Z\xacX\xba\x08\xd5\xde\xb9\xf0\x81w\t\xee\xde\x1a\xec\xa08\x01D\xf3\xc2M\xf6+:\xb5"9{\xb7\x17\xa9\x9c+\xcc\xf1]\xda\x1f\x06e\x7fH\x80\xf4T\xa6\x1eom\xb1\x1c=\xd8\xb6z\x15q\xfa]\x0f\xcfV\\xl\xaa\x11\x8e\x8cV\x15\xf1\x1a\xa1\x10\x873\xc7\x15DM\x84\x90\xd3N^4\x01\x87[]o\xda\x87\xf9\x95\xa1\xd1\xd2\xbbn\x1e\xd1\xa4c\x80Z7\x90~\xef"\x9e\x94\xc5)\xbbD\x7f\xde\x14K.\xed\x88\xd4s\xcd|\xdd\xb2\x8e[\xb9\x91\x9cB^\xe5\xe7\xb8\x9f~\x1f@T\x9c\xfe\xbe\xd3\x8eM\x05\xcdX!\xc8\xdfR=\x99\xc6\x0b?qp\xef?\x1c\xcb\xfa\x9a{\xce\xb1t\xdb\xe6\xf6\xdf_\x8f\x1c\x04 \x89?\xd5\xe7[~\xc0\xe6\xb5ni\x93FM\xf9\x92\x90\xde_u\xa3\xe6WWw\xc4\xdaT\xf2d\x90\xee\xd6*n\x88{;\xdb\x96\x1f\xe1\x84t\x95I\x1f\xfd\x12\xa0\xd9\xc4\x9e\xfa\xcc\xa8 Wp^\x13\x98\x84\x8b,\xbe\xd3\xab\x05#\x0f@_\xb7T(i\xba\x1c\x92\xb9\xcb\xd2\xe5\x1cd^\x17]\xee\x8e\x00#\xc7]u\x8a:\x01\xd4\xb4\xd1@\xe8\xb3a/\xd7\x85\xf4-\xd2\xd7\x1c\x82\xbd\xb8:\xe2\xca\x7f\xc9y\x83\x88\xc5\xcbRQ\x15\xe6\x07\xd8\xc3\xa6\xc4\x9a\x1e\xedjz\xc3\xb1\xb4\xccH\x18u6\xe0\x81S5X\xe3y\xcd>U2\xf4,m\x93\xa7(\xaa\xd7\x14\xe5\xc0\x93\xa6pm\xdf)!\xc8\xbe\xbes<\x99\xf6\x8a\xcbOYY\x8d!j\xfb\xfd\x08\x0f\xc1\x02*\x8d\xc4\xc6\x05%\xef@\xb9+\x1cy\\@0i\xa0\x97\xfb\x1d\xd4\x16}\x1bX\xf4\x91j\x15\xc7\xe7ds\xc1\x9d\x03\xadK\x1d`\x82\xce7\x1b\xd4;\x14\'\x97m\x8dR\xb0\x05@\x00J\xe6k\x08\x91\x14\xf4\x85\xec\xf2E\x7f7$w\xa4E\x81U:S"\xf37\x0c-_\x0c\xae\x8cS\x8c\x8a>\x8f\xb6v\x03\x91\xd6\xd4\x08\xad\x8d\xb9\xca\xef\xc2\x11\x97\x15\xf1\x84\x18\x02\xd6\xdd\xfb\xf1\xc8D\x15\xeb\x18A\xb4\x87\xe0"\x8d^\xe9\x1e{\x17\x82\xe7\xab\xfb\x15\xa0\x87d\xef\xd0S\xd5\r\x7fu_`8NM(D\xf3L\x035\x12\xc1**\xee\x11+\x9c\xbd\xa5\x92\xe9\xceV\x0ft\x01\x8d\x96\xbdc\x1c\xae6Pc0I\x99La\xeb\xa5\x8bN.\xc7\x16~\x80+\x07b\xbdFkc&s2\x12\xfd]>\x96\xcb\x04C\x97hek\x9f$\xdb\x92v&\x18V\xa0\xfbY\xc1k\xd8\xaf\xb7\xd4Y\xc6.[\x97\x99\x9e\x1e\x1fF\x18\xf0\xa1fI\x8b\x9073K?V\xfe\xf1\xb6\x85\xebl\xec\xae,\xb1\xfb\xfbv#\xaa\x17\x8akk\xff\x0c\xdd\xb7\xd1C\xe8\x99e\x1c\x0fX&N\xed\xea\x86\xb7kA\xf9r/\xae\xc5\xec\xa8^\x96\xf6\niE\rQ\x91\x9ap\xd0~W\x16\x8e\x98\xefu\xad8\xd7$\x16\x9b\x83\x80\xd0{\xc9\x08\x14\xfcrop\xb5\x99\xdc\xeb\xde\xcb4\xcc\xb8Lo\x91\xca\xbdD\x93H\x7f\x95\xc4\xa0\xd8\x1c-\x82kJ\xcb\x91\xf4\xd7ba1\xf5L\xd93\xa60\xd3.\xd02)*\xa4\xea% \t\xf3\x83\xe7|\xc4L\xe6\xc8\x9e\xdd\x97\xfb\x9d\xd0\xbe\xaeC\xa3p 4\xff@\xd51\xfc\xbc\x1ey\xa8\x9b\xae\xacm\x0f\xaa\x1c\xd2\x82\xb1\xda(\xd1u\n\x98\xf4\xa3\x90K\xf8\xf8\xba1\xcd=\x89G\x0f6\xc27\xcf\xa4\x81\xd9\x81\x10\x101\xb3+2\x7f\x01\xea\xcd\t%9\xb1\x04N<}\xdd\xe6\xbf\xde\xf8\x11\x95\xe8\xc5\x99\xa6h]\x02a\x8d#\xad\x9ae\xbd\xfa\xd8Ll0\xb8z\x96\x8e\xab>z\xa5\xe7\xfeA\x03\x99]\xa5q\xbc\x7f\xf1T"DG\x8a\x0e\xbbh#\x98N$(<\x8b\x05\xa8Lf\xf7\x0f\xed\x16|=Z\x0b\x1a>\x98,\x844\xaa\xfd\xb2x@O\xbd\xc4\x80U\x82q:\x83\x96,\xde2\xc5b\xfaO.m\x1b\xf2\x86\x1f\xadJL\xa3z\xf9}\xfc\xa1\x1b\xa1\'\xc3x\x0f_NI\x03\xbfu\x03`\xac<6&/J\x8e!o%5\xbf&\xc8\xd2]\xc2\xa5\x9b\x07\xb8\x9e\rR\x13\x1a\xd2a\xdf\xffM\x01P\x99Q\xea\xda\xe5n?3\x16\xe2\x9fd?\xad6\x7f"\xb8r*]\xd2\xfaL\xaf\xa89j\xa9\xf0`\x8c\xcei\xc1y1:\x97\xfa\x9e\xb1\xac\x89\xcbk\xfa\x8f]\xd7)\xc3l\xe7\x01m\xbb?\x82f\xff\x87\xfdi\x8f\xa7`o*\x8c\xf7G\xc3v4\xe5\x04a\xee\xa5\xf3\x01E@6\x93\xebO\x08\xaa\xf8\x9b\r;Ul\xcc%\x10\x14\x82T\x00\x12\xba\xac\x8eO\xd4=\xb2\xbd\x07\x1d\x0er\xf1\xd1\xf8+\x06\x1dT\x1c\x19\x1f\xc5\xdd6\x91\xe5Z\xc5\x07\xd2j\xad\xb5\x92a7=\x8c\x87\xd2o\x14\x88J%6\xd8\xd9iTXWi\xa7\xb7\xcf&\xb2\xaf\xe7bD\xc9hL\xdb)\xcc\x14\xd1\xfe\xd1\x7fit\xa6\xdc\xcb\xe1T\x91f\xa4\xba\xab\x8b\x0b\x1f\x188\x12A\x17\xe2|\x98\xad\xbe3{0\x13\x85%\xb4;\x1a\xea{\xe6\xfc\xdb\x9b|I(-\x05y\x85\xcaPMs\x98\xd3>]\x90<\x9d|\r;\xdd\x93\x84R\x0cl\x17<\xde\x98\xff\xbe\xda\xe5]\xdc\xf6w\xba\x07\xa6\xf19R\xe3]\xef\x95[FB\x82\xe1\xeb\x07\xd8Ta$\xae\xfb\x11\x18\x1fG\xca \xc4g\x91\xd0\x1c\xc4\x82c\x92\xdds\xa9+\xbe\xe8<O{\x98w\x03}\x9bl]O\xfe\xc8\x8e\xbe\xccB\xe2m\xd4*A~\xbf`X\x01z\xb0=\x19\xb8j\xdc\xe3\x06\x0eZ\x90\xe8\x98Y\xeal[\x19Vz\x0eM\x94+@\xf2\xfc\x1bi-\x03\x97L\x7fru\xe2\x7f\xa4\xbd/1Xx\x18\xe7\x08[\xed\xb2\xa2\xc0\xa0Nq\xb99\xb6\x1a\x02\x134\xe5J\x0b\x86\\}\x8e2`]\xec\x86\x14\xbb\xe5\xe8w\xf0\xad\xc9d\xedze\x0b\xd1\xec\x80m\x94\xbc=\xa0\n\\\xc7\x93\x06\xfbU\x97\xa6\xadj)\x954\xca\xdc\xc6\xbbL\x9b{\xf7w\xb6\x0b\xab\xef\x92\xb7m@\xa5\xb4\x95\x87u\x98\x12\xbc\xcf\x00l\xbb\x94~/=K\x03\xa5%\xab\x17z\xd0\xd28\x83b\xb7\xd3\x91J\x81Y\xb7`\x91\xce\xd5x"A\xbf\x90\xcc\xc7\x0c!\xb0Ty`BLht\xb7\x01R2\xb21\x85\xad\xb0jJ\x1b}\xb0\xd1\xb5\xba\x1e\xdd\xf0c4\xb8x$\x86\xa9z{\xc8Z\xef\xb6p\xfa\xa0\xd7\xf2.\xd60\x0c\xbf!\x1e%Y\x11%Djf\xc3iU\x0f\xf5\xabIXN\xeb\xf20h\t,\xde\x90\xa0\x8eQ\x98>\x17\x7f\xca\xfb\xcb\xd1RX\xfd\x9b\xcd1w\xde\x9a\xdc\xc6\x0b\x8f0\x12\x8fJTh\x10\x97\x96<r\xce~\x148\xca\xa2TG\x8d\xc2\xca\x9e\xc7z~\xdc\x1a\xebGjE\xb5\xe3U\x99%\x9f\x00\x1d\x95-F\xd3E\xd9\x98\xc0\xc3\x95\x8c\xbe\xfb\xee\x95\x1a\x11\x98\xb7x\xea\x94\x04\x83\xcf\xf9\x19\xea\xb1\xdc|\xb2\x1a\xaf\x99)\x11O-\x87`\x87\x0f\x85\xaa\x93\x97\xf7laW\xb2tO\x83\xe9\x90x\x8e\x87\xfa\x12%.\xc3\x92\xf9\xc0l$,M\xfc\xf1\xcf\x1b\xd9@t\x91<\xc4v\x8d\x95.I\xaf\x99\xf9\xc6\xee.\xdaP\x1d\x143^\xee0k\xa6\xe5\xc0\x8d&\xa6\xccG/;Z\xe5\xb8U1\xff\x0c\xe7\xf4\xaa68\x87\x15\xb2\xe0\xe3\x94\x8c\x12J3\xc6\xcbR\xb4\xbf\xedOJ\xcfbO\x89\xdfM\xa2\xe91!O\xc0\xb9odm\xb3\x9a\xd5g\x8eC5\xfa\xa7\xc5l\xcc\x87\x0bx\xcf\xdfM\x9e\x0b\x8d%\xb7\x17\xd0\xb1\xae\xbe\x92\\4\xc8\x1a\xd8V\x9fF{\xd3\x97\x94\x19\x06\x87\xf9\x96r\xecN\xf8A\x004"apAvKGHE\xcad@C|\xeeG6v\xe5Q\xa7k\xb5\xa8V\xb0\x9f\xe7\x1d\xd9\xb0\x9c\x8b\xfcy\x0fk\xa9\xfa>Q\x8e0\xe0\xb2\xd3\xee\x9e\x9b\r!Q\xc0\x90\x86\xc6R\xef\x94\xa6\xfe\xc7\x1f\x8b\x12[\xaf\x08yN\xe8\x0fLIM\x0f\xc2\xcd&\xe7\xb0\xc3\xebg\x06\x111\xcc\xe6\xfcd\x89\x8b\xad\x9c\x97\xb6f\xdb\x0cx\x9bT\xe6\x01Q\x10jB\xeeX\xe3\xaf\xe63\xaa0\x93;\xe3\xb8B\x84\xa0I\xcb\x0738\x9e\xfe7\xd5\xa3f\x9e\xf9\tGM\x7f_\xb1[D\x84&bf\xffCk\x8b!3\x97\xaba\x99\xf6\x81C\xb4\x9c\xff\xd5\x00\xc6\x89V\x9eC\xffq\xffTp\xd6\x00\xf5\xdfl\xb6\xb4/u\xe7;X\xea\xd98d(\xd8e\x1a\n@\xc0\x89\xd8\x15\x0e\x98\x9d:\xccx\xbbtn\xee\'\xf9y\x01rp+\x01/\x94\xbbm\xd1\xa9H\xbb,\xf4T\xcck\xed\xc15\xad\xf7\r\x85R{b\x9c\xd1\x03\xe15M\xe2\xa3}B2c\x1a\xd6\xc1\x19\'\xab\xc8\x1d\x826L\xa5\x00T\xe8{\x8bg\n\x0fGS\xc0\xa4\x8a\xb3\x0bL%*\x12\xb5r\x03\xac\x8fKI\x82^\x00w\xf0\xf8\x86\x96\xcb+\x02\xbc2\xd0F\xca\xd6( x\xad\x00t$\xd9\xf3\r\xa0\xc8\xecs\x13\x04\xc3\xe1\xb2]\xd3\x83Z\xd8\xd7\xdc\xf1|\x819\xf0\xb6.\xc1\xe4 \x02\x9bl\xf6T\xcc\xea\xd7\xaa\x85\r\xeat\xe2\xd5E\x8d\xabiZ\xa4$\xfa\x90\x90\x17\x11\x08\xf8[\x8ac$\xdd%\x9d-F\x115~\x0ct\x99\xc2\x18\x13\xad\x8f\xa0Y\xd2\xa4"_J\x03M.\xa2c\\y=\xe6\x01\xc9\xfd\x1eP\xf0\xf3\xf9\xde7\xc8Q\xd3\xd3<;@\x9c\xae\xd8h-\xf3)^\xcd\xa9H\x93\xbc\xb5\x16\xacA\xd8\x8e\xd1\xd4M\x17\xf6"\xcc\xe0\xfa\x11\xccw\xb9\x03\x94\x04\xed\x0b7\x9c\xce\xc1JK\x82}\xd95A\xf9\xeb*\xda@\x18\xbb"P)\xb5\xc6\x90\xc3\x03\x08%\xfc\xde%s\x9f\xd13z\x07\xc7\xb2Y\xe6,\x8d\xee25\x9b\xb0\xd0F\n\t\xb7 "\xfbur\xc5\xd1\xe9\x93h\x01\x97N\xf3\xc3L\xaa\x00\x1bf>\x85{\t\xa1\xdf\xccj\xf2\xb1\xe9J[\xff\xb6\x8a\xbf\xeb\x8f\xf84v|\xdf\xb7\xf19_\xec\x9f\x9a\x0e\xe6\xe1Ih\xda\x05\x18<\xc1W\xf2\xda\x1c@\x85\x87\xc0\xcb<\xfco<O\xd2\xee\x89\x92n\xbb\x029\xf2\xbeWD}\xb8\xe8\x82\xa4\xd8B\xe4v\xeb\xc5\x95\x9f\x0f\xe2FB\\\xa3\x9b\x8a>\xb8\xfa\xba\xee\x076\x0fv\xa4\'=[;\xbf\xcaPb\xcd\xab\xad\xfbx~\xb6\xae\xb5\x8a\xb5`\xaa2n/r\x97\x83\xf3\xf4\xa5\x91v\x1a\xeeN\xb9\xa8\xa6=\xe1m\xdb\xf4\xd8\xa2@\xe3\xbf\xc3\xed\x01\xb6\xc6\x08,3\xec\x83\x8eJ;6n\xd90\x81p\x0c\x16\xd02\x8d\xed\xde\x80\xc5\x89)\xb3\xfb\xdcg\x9bm\xe2h\xadS\x9d\xa9#\x1b\xd3\xff\x93\xbe$k\xddS\xfd\x97\x18_\x8fN\xb6\xb4\x8d\xa9\xeb\x16\xf5\x1e\xb0\xca\xfeQ\xc23r7\x00\x16\xa77\xf0\xb3m\x8eC\xa7q\xec\xaa\'P{\x8a\x7f\xc0\xde\xc5\xbfs\x99?\xcc!+\xa1\x8f\xd0\xccT)\xfe\x13s\x1e\xd1\xd54\xe86\xa0/\x99\x1c\x0f\xb5e6xZN\xe8\x07\xee\xee"P,\x9e\xd8`\xd1\xeb\x8cO\x98\xce\x0fJ]^\x14\x1a%\xa2\xe2\xb7@"\\\x00O\x9f\x96\x03\x1b\xdd)\xcb6<Th\xaaf\xf2\xf7\x1a\xae\xc7\xf4-\xebf\x86&\x0c\x02S\x16\xcd\x9d\x9d\x9d\x82\xbb{\xd8\xebU>\x18\xa3IWW\xe4F\x12\x19\xf9\xb50\x81\x8e\xf7\xf5\x8a\xca\xb3\xdf\x8b\xc8h4\xcf\xf7\xd7\xa0\x1eK-T\x968\n\xb6(\xa6\xffI\xc0\xef\x93i\x98\xbd\xb7\xa8\x0c\xb9\x87\xcb\xc3\xa5\x07\x15\x01e\x87x)T{\xab\x18\xfc\x19_x\xc4\xde1H|:\x01$J\xaf\xeeec\xdf9\xe9\xbc\xfe(\xceR\x0b\x1f\xe3v\xcaxXN\'\x89j7LR\xd0\x90\xc2H\xbb3:J\xf6\x18E\xd1\xb5\x1b\x12\xf1\xdf\xfa\x7f\xeb\xd3\x06c\xec\xd7`b\xfc\x8fir)\xd3`\xb1UoY[\xd7\x94\xaf\x95\x07P\xff\xf2=U\xd2\xd0\xe3wr:<\xd7P\x0c\xb8L\nJ\xb2@:)Y\xfao\xecK,\x87\xe0\xdf\x90\xacb\xa3\xb4\xb2\xb7\x7fA\xc3x\xb6\xc5\xeb\xa68\xf0\xf6\'\xc1g\xad\x7f\x14\xfb\xc8\xad\x1e\xf7$\xa1\x8br \x8d\x901\x10\xf8G\xc9\x88\xcf\xcf/gj>\x0f\xc2\x82\xe4\xc4\x03I\xa3\xb4<\xcd\x86\xd5\x99Z\xb5Xr\xb9\x13\xcc+\xa3W\x13\xbf=h\xfa\xfc\xe1\x03\x04\x97-(Xu\x06\x17#\x99\xd8\x9b\xeae\xd61\xb3P\xbdnY\xfa\xb6\x16\x8c\xe3\xde\x85\x0ehs,\x10S\x9dV\x97\xa6\x9cgR t&\xf3V(\xd8\xf9F\x94\x05R\xfcH\xe3\xa3\x89\xfa?m\x83\xff\xf1\x99\xddVvo\xfa69\xb6E\x1f\x96,\x98\xbe\xe1\x1bD~\xa7\x99/\xd1\x19\xd7\x99\xd4 \xd8#\xd4\xf8\xef\xa0\xc0IR\xa1w1 \xde\x93c\x0c\xa7\xac\xb9\xb8\x97\xb8^\x8b\x147\x99\xcdc\xc5F\xdf\x03#\xe5q\xf3\xc5K\x88\xec\xa6\xb1\xe6z\r\x00\xe8S\x83\xa7D\xfa\xe6"\x93\x98\x8e3\x12\xf3\x08h\xedZ\xdci\xe1\x1e\xc5\xc0\xe7D\xc8\x91\x05qp\x1bq%\x8f\x172X\xf0\xcf\x8c6Em\xd1~\x07\xa0\xd4\x055\x1f#\x98\x9e\xff\xc7\x1d\x94\xae\x13\x8a%4\xc4T\xce\xb5\xd1\xf3\xf2\x8e\\\xeb\x81\x89Q\x08\xb1N\xacq\xe9\x91\x1e\x93u\xffx\xd9\xe8{n\xf5\xfd\xaf\x0b2)T\x92\x15\xc5\x1clix\x11\xb2\xb6\x8a\xef\xe0\xb8\x7f\xd3\x089\xef\xb1\xf8\xc2\xb8\x1a\xe4\t\xde3\xa8\xf5[\xed\xc193\xc8\xee3\x91\x1f\x08\x03\xd5\x94\'\x8b\xa2;\\\xb6\x87P7.\x0f\x071\n\x1b\x11#8Gc2\xa5\xb2\x98\xcc[X\'\xde?!\x17F\xfc-,\x01\x8e\xd2\xf0\xf0\n\x9b\xb1\x8fVJ4\xa7@Y\xca\xa0^\xd1\xb5E\x91\x82\x07\x1a\xcc\xe09%\xacA\x81\xce\xe0\x821\xc8\xe7\xe0\xd1Y\x14sG[[\xeb\x0f\x81\xc1\xeeJ\xab\xdf\xb1\xed\xaf\xf1\x1bVrXd\x18n\x82\xf0\xc4\xd2\xf6\x0f\xf9\xd6$\x82+\xe5[\xd4\xb1\x12\x9cE\xce\x0c.\xb8\xe7\x8co6\x96.\x81\xcc\x83\xea\x85lx\xde\xb8\x9a\xc7\x84>=\xfa\x8fT\x08\x00\x12\x01x\xe9\x96\xdd\xd3O\xa9\x1f\xbd1D\xb1\x8a\x8fTe\x015\xd35\rC~\xfd\x890q\x84hI2r\xb2\xdb\xdc\xc5>a\x84\xd7\xff\xd3\xbf\xf9M\x92G\xd1\x00<\x1c\xff\xd6\xddw\xb09\x16\x18\xde@\xf2\xe3!e\x13>\xd7\t\xc6{1+\xf1\xbd\xc3w\xa9\xb6\x81\x9c\x8d\xbf\xfeB\xcb\x7f\x16F\xbd\xdc+b\x17\xf6\xe8\x14\xf7\x8eR\xd5\x84\x91(\xa9\xc2\x1b"?5\xaeHw\xdf5\x1b8\\\xf7\xafk\x0b\x97\x03\xb9*.Q\xbc\x07|\x0f\x04\x93\x10D10J5\x06GPA\xfbT\x8d\xe3\xba\x01\xa3\xa9!e\x83:\xae\xf2L\xfd\xd4>\x1dQ*=a(g\xeb\x01\x8ep\xc0\x02D)\xac\x02\x9f\xd8\x88 a\x88\x95#\xdd\xf0\xea}H\xe8j\x7f\xd8Ob\xadE)\xd7\x82\x0c-:\'\x01\x13\xfe{\x0eK\xbd\xd8\x00\xec\x97\xf7\xe8:\x07tjp\x06mF\xc6D\xa8\xfe\xfa\xd1\x9c\x91\xb6\x98[~\xc9%\xa5\xf4\x8d`\xfcP\x92\x9a6\x08\xff\x0en\xbc\xa5\xf5m\x17\xb4\xe6\x16Fr\x1c\xe7\xdb\xe8\x82\xf35\x00pO\x84\x0b\x13\xec\xe2\xdcV\xe6 A\x96M\x9b\xc70W\xac#\xa5f\xd17\x11\xe04\xcd\xfb4-\x1d\xdfJH\xdb\xa5\x14z\xe5\xd8I\xf3F|\x7f\xde\xb1\xac\xfb\x91\xfb\xc3Ta\xed\xd9\xd7\xcf\xcb\xb9\xc2\x0e\x8d\tqtc\xa3\xa9}?nV\xdf\x0ee\xe1\x05\x93pc_!V\t\xa8\xea\xf4uU\xeb\xe2\x96SJ\xf2=\xfd\xc9l\x9d9\xad\xad\xba\xf6CE\xf5\xe9*\x87\n\xbb\x08\x1a]z;_\x87\xa1\xa8\xa7\x7f\xfa\x9a\xd1\rHb\xe5A\xf8T\x1d\xf5\xff\x8c\x18\xdd]\xb7Iq\xc7\xec\xc5\xe4\xa5\xf1\x7fl\xda\xa3\xc1\x95\xaa*\xc5r*D\xca\x83\xf5l4\x824\xd5Y\x94\x1fK\x0c0G\x11\xfb\x963a\xa7\x906\x13\xf5\x8c\x92)\x91\x02`\xfa\xde}\xecH\xfe\r\x04\x1dpe.\xb9\xb8wrh\x81\xbf\xdc~O\xa3\x07/w6B\xab=\xca\x05\x04E\xddgP\x05\xc0%}\xd2\xcc\x9f\xf4\x7f-\'\x00\n\xad\x1d}Fl\x95\xee\xbe\xdaIN\xf0\x9b\x06\x04\x1dj\xc6j\xd5\xec^\x96\x8b\xe4]\xc8\xdai\x82\xf1cl\xd6\x98\xd0\xac\xee\x10\xd8\x8bx\xd6bc\xbe\xbf\xf7=\xe3,k=\xc1\xe2\xfc\xb7\xe9N0\x16\r\xf1\xb2\x9b\x81#1p\xfc\xcbJ\x8b\xdcw\xc4\xd7\xcc@\x12\xf3\xbb\x04\x8d\xc9\xca\x0e\x1cU\xfa<[\x83\xa5cf\xb1\xb01\x81_]3\x06\x9exJ\xb4\x9c\xbb"\x10c._W\x1c=\xdc\xb95a\xde\x84\xd8\x86=^\x9d\xde\xa5e7\xbb\xd9N0\xfd>\xc4\x10\xd9j\'\xa7O\x8a\x7f\xb7\xd9 \x10\xbc\xab\xd5\xcd\xab:\xc9"\x04\xdb\xec\x16\xf3\xf8\xe1\r\\V\xb9\x12\x9e\xe4S\xa3g\xa36\x93\xea@6\xa8#\xd5\x07i\xde\xe1-\xc8\xe8pb\xbd\xc8R\xf0\xee\xe6\x95\xaa\x141[\x8e\xe5\xcbNc\xbb\x92\x9d\xea\x92\x02\xa7\x83\x84d\x83\xd5`\x11\xc2\x88\x80)\xc4\xf0\x08\xd0-\x89\x187\x84%\xb8\x85\x03LSH\xa9\xeb5\xbe\xe9Rq\x1a\x10\x0c\xb1\xef\xca\x07r\xafwUs#\x81\xa1\x94\x99\x96\x8c\xe9u\xf3\xe7\xee\x01\xb5j\x11\x95\xac;\x1dB9\x1bF\xd0\x9c\xd6\x1c~\xaf\xbf\xa1\xa7b\xa1\xef&\xb9^\x92V*\xa6Hg>\x8b\x85\t\x00\xe0\t\x95\xcd\xb9\xbeI\x0e!\xa2\x9b18\xd2ap\x14\x00\xa8\x02\xa7\xf8\xdf$\xf5\x8cS\x97\xd1a(w\xfa\xfb\xc4\xf5\xda\x16<\xe8\xde\x9f(\x16\x13U\x18\xd8\xf3m\xa4L\xb5\xa8\xd3\x9bOV,\x90\x18\xdf\xab\xcb\x97\xdd\xf2\xf3\xe1\xfaX*\x86\x0c\xa4\xdcx\x0f;\xa8\xb2H\x88\xd3\xc2\x17U\x06&\xfb;>\xf4\x06RJHL\xafmb\x03/\x05\xc7\xa8P1\nZ\xbe\xd3v\x10\xab6\xa3\xe1\xe7=\xb8\x01\xddO\x8f\x85\xc2\xd0\x80\xe7\xd7|\xcb\x9c\xf8\x19L\xa7@\xca\xa6\x83\xe2sJe\x14&\x19\x8b\x7f-\xab\t\xf2)K\xa9\xf3\xfaJ\xcd\xeb\xd4\xed\x87w0\x9eg\x04\xa3\xd3y\xdc\x07\x92$\x0f\nO\xc5\x16)<\xce\x8ay&\x05\xc9l\xa3\x18\x91\r\x04\x89\xd4\x10\xc6\x08C\x0bB\xc4\xd2')
|
1
|
+
import datetime
|
2
|
+
import uuid as uuid_mod
|
3
|
+
|
4
|
+
from sqlalchemy_serializer import SerializerMixin
|
5
|
+
from dateutil import relativedelta
|
6
|
+
from hiddifypanel.panel.database import db
|
7
|
+
from enum import auto
|
8
|
+
from strenum import StrEnum
|
9
|
+
|
10
|
+
|
11
|
+
class UserMode(StrEnum):
|
12
|
+
"""
|
13
|
+
The "UserMode" class is an enumeration that defines five possible modes: "no_reset", "monthly", "weekly",
|
14
|
+
"daily", and "disable". These modes represent different settings that can be applied to a user account,
|
15
|
+
such as the frequency at which data is reset or whether the account is currently disabled. The class is
|
16
|
+
implemented using the "StrEnum" base class and the "auto()" function to generate unique values for each mode.
|
17
|
+
"""
|
18
|
+
no_reset = auto()
|
19
|
+
monthly = auto()
|
20
|
+
weekly = auto()
|
21
|
+
daily = auto()
|
22
|
+
disable = auto()
|
23
|
+
|
24
|
+
|
25
|
+
class User(db.Model, SerializerMixin):
|
26
|
+
"""
|
27
|
+
This is a model class for a user in a database that includes columns for their ID, UUID, name, online status,
|
28
|
+
account expiration date, usage limit, package days, mode, start date, current usage, last reset time, and comment.
|
29
|
+
"""
|
30
|
+
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
|
31
|
+
uuid = db.Column(db.String(36), default=lambda: str(uuid_mod.uuid4()), nullable=False, unique=True)
|
32
|
+
name = db.Column(db.String(512), nullable=False)
|
33
|
+
last_online = db.Column(db.DateTime, nullable=False, default=datetime.datetime.min)
|
34
|
+
#removed
|
35
|
+
expiry_time = db.Column(db.Date, default=datetime.date.today() + relativedelta.relativedelta(months=6))
|
36
|
+
usage_limit_GB = db.Column(db.Numeric(6, 9, asdecimal=False), default=1000, nullable=False)
|
37
|
+
package_days = db.Column(db.Integer, default=90,nullable=False)
|
38
|
+
mode = db.Column(db.Enum(UserMode), default=UserMode.no_reset,nullable=False)
|
39
|
+
monthly = db.Column(db.Boolean, default=False)#removed
|
40
|
+
start_date = db.Column(db.Date, nullable=True)
|
41
|
+
current_usage_GB = db.Column(db.Numeric(6, 9, asdecimal=False), default=0, nullable=False)
|
42
|
+
last_reset_time = db.Column(db.Date, default=datetime.date.today())
|
43
|
+
comment = db.Column(db.String(512))
|
44
|
+
@property
|
45
|
+
def remaining_days(self):
|
46
|
+
return remaining_days(self)
|
47
|
+
@property
|
48
|
+
def is_active(self):
|
49
|
+
return is_user_active(self)
|
50
|
+
|
51
|
+
def is_user_active(u):
|
52
|
+
"""
|
53
|
+
The "is_user_active" function checks if the input user object "u" is active by verifying if their mode is not
|
54
|
+
"disable", if their usage limit hasn't been exceeded, and if there are remaining days on their account. The
|
55
|
+
function returns a boolean value indicating whether the user is active or not.
|
56
|
+
"""
|
57
|
+
is_active=True
|
58
|
+
if u.mode == UserMode.disable:
|
59
|
+
is_active= False
|
60
|
+
elif u.usage_limit_GB < u.current_usage_GB:
|
61
|
+
is_active= False
|
62
|
+
elif remaining_days(u) < 0:
|
63
|
+
is_active= False
|
64
|
+
return is_active
|
65
|
+
|
66
|
+
|
67
|
+
def remaining_days(u):
|
68
|
+
"""
|
69
|
+
The "remaining_days" function calculates the number of days remaining for a user's account package based on the
|
70
|
+
current date and the user's start date. The function returns the remaining days as an integer value. If the start
|
71
|
+
date is not available, the function returns the total package days.
|
72
|
+
"""
|
73
|
+
res=-1
|
74
|
+
if u.package_days is None:
|
75
|
+
res= -1
|
76
|
+
elif u.start_date:
|
77
|
+
# print(datetime.date.today(), u.start_date,u.package_days, u.package_days - (datetime.date.today() - u.start_date).days)
|
78
|
+
res=u.package_days - (datetime.date.today() - u.start_date).days
|
79
|
+
else:
|
80
|
+
# print("else",u.package_days )
|
81
|
+
res=u.package_days
|
82
|
+
return min(res,10000)
|
83
|
+
|
84
|
+
|
85
|
+
package_mode_dic = {
|
86
|
+
UserMode.daily: 1,
|
87
|
+
UserMode.weekly: 7,
|
88
|
+
UserMode.monthly: 30
|
89
|
+
}
|
90
|
+
|
91
|
+
|
92
|
+
def days_to_reset(user):
|
93
|
+
"""
|
94
|
+
The "days_to_reset" function calculates the number of days until the user's data usage is reset, based on the
|
95
|
+
user's start date and mode of usage. The function returns the remaining days as an integer value. If the start
|
96
|
+
date is not available, the function returns the total days for the user's mode.
|
97
|
+
"""
|
98
|
+
# print("start_date",user.start_date, "pack",package_mode_dic.get(user.mode,10000), "total",(datetime.date.today()-user.start_date).days)
|
99
|
+
# if user.mode==UserMode.daily:
|
100
|
+
# return 0
|
101
|
+
if user.start_date:
|
102
|
+
days=package_mode_dic.get(user.mode,10000)-(datetime.date.today()-user.start_date).days % package_mode_dic.get(user.mode,10000)
|
103
|
+
else:
|
104
|
+
days= package_mode_dic.get(user.mode,10000)
|
105
|
+
return max(-100000,min(days,100000))
|
106
|
+
|
107
|
+
|
108
|
+
def user_should_reset(user):
|
109
|
+
"""
|
110
|
+
The "days_to_reset" function calculates the number of days until the user's data usage is reset, based on the
|
111
|
+
user's start date and mode of usage. The function returns the remaining days as an integer value. If the start
|
112
|
+
date is not available, the function returns the total days for the user's mode.
|
113
|
+
"""
|
114
|
+
# print("start_date",user.start_date, "pack",package_mode_dic.get(user.mode,10000), "total",(datetime.date.today()-user.start_date).days)
|
115
|
+
# if user.mode==UserMode.daily:
|
116
|
+
# return 0
|
117
|
+
res=True
|
118
|
+
if not user.last_reset_time:
|
119
|
+
res=True
|
120
|
+
elif not user.start_date or (datetime.date.today()-user.last_reset_time).days==0:
|
121
|
+
res=False
|
122
|
+
else:
|
123
|
+
res=((datetime.date.today()-user.start_date).days % package_mode_dic.get(user.mode,10000))==0
|
124
|
+
|
125
|
+
return res
|
126
|
+
|
127
|
+
|
128
|
+
def user_by_uuid(uuid):
|
129
|
+
return User.query.filter(User.uuid==uuid).first()
|
130
|
+
|
131
|
+
def user_by_id(id):
|
132
|
+
return User.query.filter(User.id==id).first()
|
133
|
+
|
134
|
+
|
135
|
+
|
136
|
+
def add_or_update_user(commit=True,**user):
|
137
|
+
# if not is_valid():return
|
138
|
+
dbuser = User.query.filter(User.uuid == user['uuid']).first()
|
139
|
+
|
140
|
+
if not dbuser:
|
141
|
+
dbuser = User()
|
142
|
+
dbuser.uuid = user['uuid']
|
143
|
+
# if not is_valid():
|
144
|
+
# return
|
145
|
+
db.session.add(dbuser)
|
146
|
+
|
147
|
+
if user.get('expiry_time',''):
|
148
|
+
if user.get('last_reset_time',''):
|
149
|
+
last_reset_time = datetime.datetime.strptime(user['last_reset_time'], '%Y-%m-%d')
|
150
|
+
else:
|
151
|
+
last_reset_time = datetime.date.today()
|
152
|
+
|
153
|
+
expiry_time = datetime.datetime.strptime(user['expiry_time'], '%Y-%m-%d')
|
154
|
+
dbuser.start_date= last_reset_time
|
155
|
+
dbuser.package_days=(expiry_time-last_reset_time).days
|
156
|
+
|
157
|
+
elif 'package_days' in user:
|
158
|
+
dbuser.package_days=user['package_days']
|
159
|
+
if user.get('start_date',''):
|
160
|
+
dbuser.start_date=datetime.datetime.strptime(user['start_date'], '%Y-%m-%d')
|
161
|
+
else:
|
162
|
+
dbuser.start_date=None
|
163
|
+
dbuser.current_usage_GB = user['current_usage_GB']
|
164
|
+
|
165
|
+
dbuser.usage_limit_GB = user['usage_limit_GB']
|
166
|
+
dbuser.name = user['name']
|
167
|
+
dbuser.comment = user.get('comment', '')
|
168
|
+
dbuser.mode = user.get('mode', user.get('monthly', 'false') == 'true')
|
169
|
+
# dbuser.last_online=user.get('last_online','')
|
170
|
+
if commit:
|
171
|
+
db.session.commit()
|
4
172
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
173
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
@@ -97,7 +97,7 @@ class Actions(FlaskView):
|
|
97
97
|
# domains=[*domains,f'{server_ip}.sslip.io']
|
98
98
|
for d in domains:
|
99
99
|
link=f'https://{d}/{proxy_path}/{admin_secret}/admin/'
|
100
|
-
admin_links+=f"<li><a class='badge ltr
|
100
|
+
admin_links+=f"<li><a target='_blank' class='badge ltr' href='{link}'>{link}</a></li>"
|
101
101
|
|
102
102
|
resp= render_template("result.html",
|
103
103
|
out_type="info",
|
@@ -33,7 +33,7 @@
|
|
33
33
|
|
34
34
|
<style>
|
35
35
|
fieldset{
|
36
|
-
background-color:
|
36
|
+
background-color: initial;
|
37
37
|
background-clip: border-box;
|
38
38
|
border: 1 solid rgba(0, 0, 0, 0.125);
|
39
39
|
border-radius: 0.25rem;
|
@@ -44,7 +44,7 @@
|
|
44
44
|
width: 100%;
|
45
45
|
}
|
46
46
|
legend{
|
47
|
-
background-color:
|
47
|
+
background-color: initial;
|
48
48
|
margin: 0px;
|
49
49
|
}
|
50
50
|
/* legend+div>label {
|
hiddifypanel/panel/admin_2.py
CHANGED
@@ -1,5 +1,35 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
|
1
|
+
from flask_admin import Admin
|
2
|
+
from flask_admin.base import AdminIndexView
|
3
|
+
from flask_admin.contrib import sqla
|
4
|
+
# from flask_simplelogin import login_required
|
5
|
+
from werkzeug.security import generate_password_hash
|
6
|
+
|
7
|
+
from hiddifypanel.panel.database import db
|
8
|
+
from hiddifypanel.models import User
|
9
|
+
|
10
|
+
# Proteck admin with login / Monkey Patch
|
11
|
+
# AdminIndexView._handle_view = login_required(AdminIndexView._handle_view)
|
12
|
+
# sqla.ModelView._handle_view = login_requiredsqla.ModelView._handle_view)
|
13
|
+
admin = Admin()
|
14
|
+
|
15
|
+
|
16
|
+
class UserAdmin(sqla.ModelView):
|
17
|
+
column_list = ["username"]
|
18
|
+
can_edit = False
|
19
|
+
|
20
|
+
def on_model_change(self, form, model, is_created):
|
21
|
+
model.password = generate_password_hash(model.password)
|
22
|
+
|
23
|
+
|
24
|
+
def init_app(app):
|
25
|
+
# admin.name = app.config.HIDDIFY_CONFIG_PATH
|
26
|
+
admin.template_mode = app.config.FLASK_ADMIN_TEMPLATE_MODE
|
27
|
+
admin.init_app(app)
|
28
|
+
|
29
|
+
# Add admin page for Product
|
30
|
+
# admin.add_view(sqla.ModelView(Product, db.session))
|
31
|
+
|
32
|
+
# Add admin page for User
|
33
|
+
admin.add_view(UserAdmin(User, db.session))
|
4
34
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
35
|
#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
|
-
__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\x00B\x0e\x00\x00\x12\t\x04\x00\xaf\x166H\x9c\xc4\xdaB`\xc5\xdaB\xba\x1b\xf2\'\x00\x00\x00\x00\x00\x00\x00\x00}3\xd6\x11\xb1\x9c^Q\x90\x93AN\xbeaX\xfd_(\xde\x8a\x8c$xI\xe6$\xa9\xa1\xce\xbe_\xa6H\xdc\xad\xfc\xbeW-\xe7I3\x05\xdf\xb6C\x83\x81$)D\xca\x06\x0ee?\x1b\xe8XF\xaa\xe3|\xf5+6\x0cww\xd5\xe1U]\xf2dbU-\t\x83\xed\xa6\x8c8\xea^\xf8\xf4\xc7\x82\x14\x93/\xe8\x1c\xb9\xca2\xc9\xed\x8aQ!$D}q\xab]\x1c\x93\xc4\xc6\x94\x05#\xe6q\xf3\x1e\x03\x07\x8ej\xef\x18\xb1d\xbb\xf0\x04\xd2\x92\xd7\xb9\x0f8-\xd4\xef75_\xad\xf87\x9e\xc2\xd77n\xab\x85\xc4b\x13\x80\x13\x8c^\x0bw\xca\x8d\x14\xf5\xfd\xb2wI\xab`\xfc\xc6q\xc8m\xdb\x97\xe6\xc7L\x88\xde\xa6m\x1c\xb0\x99\xe2.\xf9[\xcc&!EF\xc6\x15\x0b\x1e*f\n\xce4\xae\xc2a*r\xc2\xfd^R8\xc0\x10D\xaaV(\x8d\x8e\xc9\x88-\xf5\x92V\xc7\x1f\xa5\x7fI\xee\xccU\xda\xcbB\x17\xf0-\xc8%\xa3\t?\xe2\x0eVA\x8a.\x9c1\x1e\xdc\xff~Ers\xd8#w\x95\x99^N\xcd_E\xcb\xc0\xact0(\x0cG\x96\x94cs\xe6(J\xa2\xc5\x96\x96\x19\xe1\x99|(\xf6|\x80\x84P\xdc\xd0\xae\x14\xaa\x7fe"\x93\xb4X\xba\xa1\xac\xa0\xc8S\xf9t\x8d\xb7W\x15\xa9\xa8@\n\x99C$)\xef\xba\xe5\xbc;\xa6\xf4\x9f\xa4\xb5\xa3\xefQ\xbe\xb7Oy\xcc\xe0H\xeb\xd63p\x8a\xbc-\x95\xec\xdd$\xb7:O:i\xd6\x94s\xa2P\x85\x15$,V\x81r\xbe\x92\x95\xbc(\x9b\xf1\x15\xd0\x0f\x14LM\t\x8c\x97:t\xf2\xab\xc3\x94x\xf6c\xdf\']\x9bs\xe8\xe7\xbb!H[\x1d\xc53\t\x10)\x17\x0c\xd3\xf6^\x81\x19\xf3\xf9d\x07]mzd\xf2q\xef\xdf\x15\xcd\x8a\xc3o\xf1\x96`8+;\x94f\xc2(\xddfB\rD!\xdc<\x9a\xa7\xa7/3:6\x85\xa2\x15\xd0\xc2\xd9z\xaf\x98D\x13l\x84\x1e}\x05\x05\xab\xaen\xc5\xe9\x19*\xd1\xe18\x14\xcb\xba\xe8\xf5522{5p\xc5\xfeG\xb0\xe8G\xb7\xf9\x9d5\x02\xfa\xd5\x03\x14I\x86?\n\xbe\x0e\x10E\x83\xad\x92\xb1\x0f\xfe\xb4=\xbf\xf7\xc8\'\xc0\xa6CV\xb5\xe3\xca\x9eR\xff\'?\x8bW\x0f\x8dJ\x1f\xaa\xa6\xe6r$\xdb\x10u@U\x07\x87\x9e\xb2\x91q5\xb6\x99\xc6\xd3U\x95^c\xef\x1b5\xb0A\x1f\xcd\x90\xab0\x9a\xdbN\xdb~\x82\xcfC\xfcC\x91D=]0y\x92\xa5\xd9;\x93\xef\xe1:\x82;\xd2\xeek\xean\x15\x1e\xa6\xec\xb5w\xe2\xc1\xe4K\x0c~_\x92\x0fW\xb4\x9f\xa2D\xe2U\xe2\xcd\xd1\x90\xf7!\xaaUp\x9dm\x01\xe3\xe3\xb8R\x07\x90q\x85<\xbafF\xefvP\xc8^\xe0\x07\xee\x13\x18\xb4Rm}T\xc3\xdb!\xd4\xf0J\xd143yC\x91i\xb6\xfb;\t\x93\x0b\xc8\xf6 \xff\x84F\x80\xd6\xc6\x06N\xae\xa4\x8e\xa0 \xcf\xcd\x8e\xe3\xe9D\xde\xb7\xcaTd\xc2|\xedJ\xc5\x05Fw(\x0b\'I\x108\xa2\xc9\t\xc5\x02eS\xca\x85\xf6#\xbb_\xd4\xb5K\x81\xd9\xca\x11?\x01\x0fP\xf2\xd6\x96\xe0\x97!\x11.\x95\xd6\x9d\x15\xc2vk\xc9\xceQ\x8dv\xa5\x1ct\xf7\xab\x0f\x99\xdb\xae\xc5\\\x0b\x82k\xe9\x05\xe1\xa4\x92\x91\xffEdtoe%\x00\xbc\xb5\x16\xfb\x86u\xf4\xf8\xc2\xb3\x16(\xc3\xc6\x16\xcb\xc5\xf5p\x1b\x05\x7fH\xe8m\xd0e\x9b\xe5\x14\xba\x15\x15\xf0\x12\xaf\xfe\xc1\xe9 \xc7\xb7+\xae\xcf\xcb\xa9{\x12!\x06\xae\xf7\x99\xe8c\xab\x02f;\xbe\x10\xd2>\xac\xea\xc1\xcfo\x9a\x8c\xb0\x14\xee\x9d\x18\x0e\r\x86\x05\xc0s\xa505\xb63{PX\x8e]\x1d\x87g\x8c\x92I\xbd\xa2+}\x13\xa9B\x9a\xf4\x92\xb0f4\xf2$r\xca\xf7\xd5cg\'\x03\x8121\xe8\xcfi\x90\xe6\xe48\xda\xae\x1cg\xa1\x97\x88qTJLA\xad3m\x1a\x01\xaeNS\xc0;\xc3\x1ap\x16\x0fG\x88b=\n\x1f\xbb\xd0{@~\n\xcc\xa0\xe6\xe11W\x96\x14\xaf\x93\xfb/\xe0\xc7}\xd8[\xe1\xb6\xea\xdb\xfd\x12V\xa7\xdb\xcf\xbbg\xcd\xb8-\xa1\xff\xc5\xa9\x0f\x93U\xcaoU$\x0c\x1e\x14\x00\xbc\xacV\'\x07\xe0w5k\xb3>5\xb7\x10\xa3\x84\xf0\xa9\x11\xf6?\x8f\x95\x89\x1b\x8c\x9d\xaa\x11\xef\xaa\xf1\x05\x13\x1d\xcb\xf4\xa7\xf5<\'\xd0\xd0q\xb9\xdcc\xd8\xca\xdb\xd8\xc00\x80!\x00\xbf&\x92\x89\x04\x8e\xf0Tz\x97i6\xdc\xd2\x16e\x00y\xbd(\xec\xf7\xf6E\x9cV\xf4\x1b-\xbc\xa5\x11\xfe!MV\x11\x85;\x1d\xfb\r\xea\x99\x8d\x06b\x90`\xd1\xae\xdc(\xb9\xcd\x9d\x9ar\x02\xeb\xc5l\xd0O\xd7\xc8\xb3@\xab\xb8\xa5\x11J\tH[d\x9b?\xa4\xc5\xf7\xc7\x14&\xbb`5\x0c\x99}D\xde\xd7.\x00\x06\xf9\xd2\x90x\xd6y\x8a<\x0b\x83n_,g\xb2\x0b\x12q\x9d5\xe2\xea.\xf0\x821\x07\xfe\xf86\xc3\x97\xcb\x14\x90\xb0W\xd8lq\xaf\x12\xeb\x9f\xc9\xa3\xb9x\x8b\xc4]\xda\xc5\xaf\xbd@=\xcf\xc3\x0b\x1a\x9e\xe0\x02\x81\x97\xef\xcaJ\xefW,\x91S\xd3\xa6\x08\xd5\xb0\xe7V8\xc9\xecn\x8d\x19?\xa2(\xcdL0\xe1\xbc\xaap\x18\x88\x98a\xdd\xb8\xce\x8c\x19_\x96E\xccPL\xd3VBY\x8el[\xff\xfb\xef\xfa\xb2\xfe\xc7\xdc,\xe0p\x13\xc8b\xf6gp!\xa40\xbe\x13\xfe\xed\x98\xc1\x02/b\x1c\n\x98*\xca)Q}U\xd4\xe3\xf7\xbes!\x04\x00\xf7\xb2\xdf\xe29,$\xfc\x03Y\xdcr\xe1p\xbc\xc8\xe4\x10\xea\r_)\xf3\xcbp\xbe\xb6m|\x08\x97P\xd5/\xed\xb3\x17\x02\xb6\xdb"o4\x08\xf1C\x02\xea\xff\x17\xdar\xd3\x10\x16vE\r\xf0y\x15\xb6,++\x04T\xc5\xd7X\xb3\x7f\x95\xd7\xc8T!\xb9\n\x92%\t\xed&?t<\x16\x18,\x8c^g-4M\xef0\xd1\x9f\x1c<`\xe4F\xf8\xfclq`\xdf\xc9-\x81\x16\x10\x89\xc4\xe1\xe4\xc3RQ\xe4!*\xbco\x8cT\x0bm\x96\x03\xa2\x9d\xbbC\xc9"\x97=.\xa3p\\\xe6.\\\xf0COu\xe8\xaf7\xc3\xf1\x12\xd8e+\x1cW\x03\xd4r2\xe6\x07\xae\xaf\xed\xff\xa6_\xe7wq\xf6c\x17\x93 \x0f\xfef\xb6f\xe1\xda\xf6=\x1e\xb0\x11(\xaf\xcf\x90\xafT\xf5\x93V\xdc\x84\xea?\x849\x02S\xac-=|\x8a\x073\xf1v\xc9 \xc9\xe4\xf6\xe2#\x88\x9c\x97\xf1\xaf\xe3\x9e2\xe3\xc9A\x0ft\xd2+\x08\x8ee\xd4!\xf56*N4o%\xad\x7fg\x84\x90+(\rs\x11d\xfe\x9e\xd6\x06\x12D!\xf3ViD\xbd\xeaD\x08\xb4U5#\xc7\x9d\xa3r\xae+\xc9\x05\xda\xc5\xf5\xa7,\xfb3\xf5\xda\x0b\x92\xdc\x92\xc8\xd1\xb8\xe2\xce\xe8T\xda\xea\xf1\r0\xe8\x80\xf2F\xdbP]\x96\x88A*\x9b\x93\x9c\xdd\xf3KS\xfcbv8h\xedW\x04\x88\x086d\x92\xffL#\xfd\x94hK"\x06\xb9,*\xb9\xd8\x84\x80\xb8`k-\x16YH\xf3\x06\x18Or\xd91\x9f&\xab\x00\xb9\xef^K4"\xc9\'%\xf78\tJZ\x82\xcd\xa8\x00\xd8\x9a\x11\rd\x8fT\xc1\xdb\xb8\xe7\x18/\xf6[\xb3\xcf\\\x1c\x0b\xcc\x1b\xb1O\x1a\n+\xbc\xdb\xee\xaa\x922\\\xc2\xe9\x01\xc8;\xf6\x87\xe0-7\x92k\x1a\x89\x19\xdb\x1fXR\xa1\xdc\x96a\x9a\xda\xf3\xd9\xf6\x91N\x83w\xf3\xbfw\x12\xe4\xe9#\xfe\n\'\xd0\x13M\xff\t\x946\xadK\x81\xc6z\xf9\xca\xae\n5\x08 \x182\x14,miT\xa5\x19\x0f\x06\x01\xfa\x1a\xc7\x0f?^\x90\x17\x17F8\n/TyTV=h\xbcPf\xd5!\xd6e\xf9gy\x05q\x06w\xfc\xb6-\x8f\xe7\xc1\xf30n\x16_\xeb\x80\x07B(+\x1e\xe7\xe0\xa9\x8a\xcb\xaaJ\x84\xcf\xa2K\xb4 L\xcc\xe8t\x8e\xa7\xdbQEW\xdc1|\x8b=\x07]B*\xc0k\x97\x92\xf7\x0b\xad\xbcF#\x16\xa4\xeee\x8d\x8bSJ\x08\xba\x80\xf8-\xa5\xa0\x1e\x98\x01\xaf\x00\x8cC\xa2v\xc2\x05\x98\xcb\x16\x04\x81*Qg\xaf\tLw\x9cw\x8c\x8e\x87\xd3*\xc3\xcc\xb1\x16U\x87W\xc7\xbeJ\xda\x82R\xa9a\xdc\x1a\x13\xc8\xe7GN\r\xb9+\xbeBi\x08\x9dR\n\xb6U\x8c~\xe0\x88\x1e\x93\x0c\xde\xa9\x8d\x93t#\xaa\x88o\x1e5\x0c\xbc<=\xaf\x91\x96\xcc\xc6\xf5\xcfgA\xd1\x05\x97\x8b+\xef\x0ch\x1e\xd2\x9e\xa8\xf5\xaa\xc8eS\x99g\xb2\xa3\xd6\xc2\x85\xf1\xdf|\'\x96\x83\xb5\xf9\xac\xce\xaf\x87\xcb\x05\xa6\xeb\xa3Ol\x08\x9d,\x8b\xccQ\xdc\xc8\x80\x02@\xaa4\xf6?\x14q\xce\\\xe4U\x17\xce\xae\xec8\x84J\x05U\xf6\x84\xa1F\xf7\xc8X\xae\x9c\x1b\xa8!\xa5\xc1;R:3\xe9\xa6\x99\tzv\xa2\xd5\x08k\xf1T\x10\x1b\xc2\x8e\xf0>p\xb5\x01\xb8\xb4\xf1\xa7\xe8\x18\xa0&\xc5\xde\xbb\x00\x9b-\xe7\x13\xe2fZ\x92&`l\xc2>\xa34\x8b\x19k\xee[\xc7\xa3\xc4;\x07yM>\t\xedM4X\x89w\x97q\x04ar\x9c\x1c\xfet`\xa7\x9b#\xc6k\xd8\x81\x1a\x1f\x8a5\xf0F\x82t:E\xe7\'\x08]\xfcX\xab\xb49\xd2C\xc03N\x0c\x932\x05~}\x04T\x8d.\x06\xfe\xf6\x0b\xb1\xc8+\xe5\x078\x91^V\x17\x1bP\xc5lNe\xa9^\x02\xe3\x86\x16\x8a} p\x96\xa5\xdc\xc6\x157\xdd\x86\xfcG\xfd\xc2\x1bQ\x18\x1b\t\x04\x13\x8b\x85\xb0\x00\xd4E\xec\x197\x1a\xe8\xb0\x9c\xf5J\x83\xcf\x90j@Q\x80\xd0\xd9\xe9\xe3\xe5\xb2\x0e\x1a32\xc9\x975\x1aV\xb77\xbd\r\xcf\x87\x17\xc5\xb9\xa9\x7f\xc5\xfa\x7f\'\xa3\'\xe3\xc4\xf27`jg\x16\xc6\x86\x1fo\x1b\r\xff:62\x1b\xee\x19;\\%\xe0\x8e\xf1\x80\x8e\x1a"\x9e\x89R\x92o\x06\xdc\xe6\xa4\xdb\xcb\xab8\xd1\xecnX\xc0\xe8\xfa\x81\xb0\xc8\x08M#\xba\xb7\x17$%@\xa2:\x1e\xa0\xcag\xad\xd1\x90e\x96c\xa0@\x0ch5A}x\x02\xcd\xa6\xce\x85\rc&nb(2Mw\x94p\x9b\xcd\xed}/?\x18\xa4\xf6;\xf0x8\x8e\xfe\x18#\xd9\x1e\xc1\xf1o\xfe"\x18\xe0w;\x10\xcf\x8cA\xff\xa3nI\xbcob\xcc\x8a\xd0bV\x8d\x04g]9\xfb*\x916\x81\xfa\xect/\x9f\xed\x85\x0b\xc6\x90\x88\x8b\xf4n\xb2\xeb\xac$\x1eBw,\x8d\xe9EM\x05Jv\xf9\x1a> \x19*1\xf6\x00\x98C\x19\xe3\xf8\x1d)\xe8\x0b[1[\xe7\x94\xe7W\xba\xe4\x06\xc1 dLit\x1a[\x07>\x18\xbb\xe3\xc9\x17~\x01\x92\x9e\x9d\x80\x19\xfbN(dZ\xccJ^\xb8\x94,(\xa18kg \xe1\xc3\x12;\xb4\xce\x84+\xabOy\xf7\xbdZ\x8e8\x04/\xa3V\x9e\xf7=\t\xf7\xb7h\xe7<1\xd1>\x8a<\xd5\x97\xe0\xa1\xa1x\xc1#\x8d\xca\x91\xd5\x06^\x8br\xa5\xe3bB\x1a,I\xdf\xa71|\xf9\xb7e\xe0\xde\xf8\xb9_\xa1\xb8\xc6b\xac\'\x1eO\xb3\xa1P\x003\x15\x14\xff\xb4=A4\x9f\xe4\x1bD}\xda\xe8T\x04\x9d\r>\x1c\xccS\x0c\x8d\x88)\x19xi?Us\xf3?Y\xa1\x16p\xfe\x00\x82\x1d\x04\x93\xd1|\x8e\x02%\x94\xb2\n\xcc~\xe56\x8fY\xbe\xdcl%vNf\x9f\xa8\xf6\x1b\xa6\x1f?\n\xbb\x84\xd3\x11\xf8\x11[T\x97\nf\x03\x97\xd1\x9d;\xbf<{1\xfe\xf4\xeb.2\x9e\xd58&\xd2J\xe0\x9d\x9b\xc5\xc8\xa37\xc6\xa6\x85\xa5\xfe\xa4\xb4\xd6\xd8\x19\x7f\x98\x82%5X!m<\x0e\x80\xbbMe\x80\x93m\xcf\xea\xd6\xb3\x8f\x9a\x83\x1c\xd1\xe4\xb67\x88l\xcd\xd6&d;\xcc\xcdX5iAI\x00\xad\xcaZ]\xdb<\xb7Y\x0e\x053l\xb2\x84\xac\x8e\xb6$7X\xa3\xb9Z\xd3\x11\xe2F\xf9+CYVp\xd9&\xac\xa6\xf7\xe0a\x1b\x7f\xba<H.\xc2\xc7D\xef\x01&\x1a\xb5\xa3\x0e\xf0\x88\xa8\x89\x98\x82\x87\xf9\x9c\xf2\xaf\xe354\xa4\xb2\x81\xaf\xa1r\xc96=_~If\xf3}[\xeeH\x00\xc3:\x15\xf21Z:JQs\x10\x83qP(\n\xcaC\xa3\xac<G_\x98r\xca\xb0\x8f\x01\x95Q\x94Sl\x17\xc8\x848#\xce\x10\x17\xe9/bK,\'\xf7m\xe3\xc5\xa53Y*\xc3\x0c\x1a\x00\x04>\x87n\xe4-\xbbn\x0c\xff\xf8q\xfe\x97D\x1c\xbah\x10\x9cr\xbd\xbe8\xa6\x89A6\xf4J\xe7\x84\xfb\xd9\xf6\x0e\xc3\xf3\xbf\xeb\x90f\xdd\xc8D\xf6\x15i\xabmR\x94\xfe\x16\x1c*\x1f``\x9c\x19\x83\xe1\xc1f\xc3h)\xf9\x85\xce_\x96\x7f6h\x8a\x95\xbeD\xa2\x10t\xaa[\xa9\x9b\x86\x00/\xbf\x8b\x88\xad\x97\x02 D\xda\x1e\x1e\xe6\xb5\xcc\x96\xaf8\xc1\x91\xb5_\xc2V\xec\xf4\x03<\xa6<\x0b\xbb&\x1122Z&\x9b\x98\x03\xfd\xdc\xecc\x00\xb5\x9a\x01z\x9d@\x87\xd6\xf8\xcb\xa0\x8f\xb3\xf6\x15\xddO/e\x15\xd4\x03\x88\xa0\x11ka\x0e\xbd\t\xa3\xb2\x06_\x9c0TEo\xf4\xa6%\xad\x86\xea\x1b\xec\x99\x9d\xba\xa6\xfd\xd3\x80\x1a\xa8x\xf3\xb5A\xa0\xd0I\xb4\xe1\x978\x19\xa3\xfd\xe3\xe8\xdeu\x8f\x1e\xa4\x07i\x9f/\xc9\x10\x97(}\xbe\xaf\xde\x1a\xbd\xc6\xd5\xad!\x95\xf6\xc4\x9e\xdc\xfb\xb3\xc7~O\x0eE\x92DNr\xf8\n\xd9\xda\x1e*\x0e\xedR\xbc\x85\t\x06Q\xe3\xdd\xe6\xbe\xaa.\xf1\xd6\xd4\x92\x18\xf2\xa3~\xd6\xf7\x19*\x94\x814\xa9\xcei?\xde\xff(\t\xec!\x94\x89\xfb\xd2\xc4\xde\xdb\xb1\xd14\xc6\x11\xd9\xf0\x15\x8c\xc7+\xaaJ"\xc4\x0e\x15~f\xbb\xed\n\xee%f\xb7\xedgw\x81>5\xbaX\x82\xa6\xf0\xd6\xc8\x07\x9c\x1f\x9b\xfb\x16p\xc0\xd12\xd2*\xc6\xecX\xbd\xb76\xf7;\xc9\xa3\xb7,w~\xf5$\xa9\x14*\xfa\xde\xcc@ [\xab\xa70\x08M~\xf1\x00\x02\x14\xb0j}\xc9Z3\xa6\xe1J)\xa9\x85\x95W\x01\xc3\xe1H\xa5;\x9c\x96\xd5\xb8\x89\xa84\xc3\xb1\xa8\x1f\x89l\xea\x13VoB\xff]\xff\x8c~}\xdd\xa1\xf8p\xd1\xce\xf6\x1dF\x89\xa3\x13\xfb{s\x0c\x7fJ\r\xe1\x83\x97\x9d\xee@r\x93\xad\xe2\xf7\x0b\xc1\xe59u\xbc(6A\xffc@n\x02i\n\xca\xbb3\\>\x064\x05\x1e\x16\xca>B\x93+\n\xe0?\xbd\x03U\xfc\xc8\xcfG\xe9\xb2\xce\xb6\xfe`\xec\x11&~G\x86\xec\xb0$9HZ\x10K\xd4T\x9fsz\x8b~_kTdwt\xb0J\x92\xd7\xeb\xf4\r\xf8\xc9\xc9\x9f\xbf\xef\xee3N\xd6]\xa2\x11aV\xe7\xcb\xffS\xe9\x1d\xb3\x0f\x87\xeeE\xa8jm\xa4p\x07Y\xa2\x0e/*C\x7f\xa8!\x15\x06W2\xa7W\xfe\x97RH\xb8@I|\xdb\xf67[@\x1eD\x9b\xc4\xad\xf7\x14u\xf9NV*\\Go%\x91\xfe\xaa`(\x8f')
|
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
|