Sync all projects

This commit is contained in:
github-actions[bot]
2026-06-29 03:41:14 +00:00
parent 529cd7c625
commit 8b025e0766
11717 changed files with 6370622 additions and 0 deletions
+1
View File
@@ -0,0 +1 @@
LyoqCiAqIOW9seinhlRWIOW8ueW5leaUr+aMgQogKiBodHRwczovL3QubWUvZm9uZ21pX29mZmljYWwvCiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9Gb25nTWkvUmVsZWFzZS90cmVlL21haW4vYXBrCiAqIOearuearuiZvkRNQm94IOW8ueW5leaUr+aMgQogKiDorr7nva4gPiDnqpflj6PpooTop4ggPiDlvIDlkK8KICogaHR0cHM6Ly90Lm1lL3BpcGl4aWF3ZXJ1bgogKiB2b2RfYXJlYTonYmlsaWxpdmVkYW5tdScKICogQ29va2ll6K6+572uCiAqIENvb2tpZeiOt+WPluaWueazlSBodHRwczovL2docHJveHkubmV0L2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9VbmRDb3Zlci9QeXJhbWlkU3RvcmUvbWFpbi9saXN0Lm1kCiAqIENvb2tpZeiuvue9ruaWueazlTE6IERSLVBZIOWQjuWPsOeuoeeQhueVjOmdogogKiBDTVPlkI7lj7DnrqHnkIYgPiDorr7nva7kuK3lv4MgPiDnjq/looPlj5jph48gPiB7ImJpbGlfY29va2llIjoiWFhYWFhYWCIsInZtaWQiOiJYWFhYWFgifSA+IOS/neWtmAogKiBDb29raWXorr7nva7mlrnms5UyOiDmiYvliqjmm7/mjaJDb29raWUKICog5bqV5LiL5Luj56CBIGhlYWRlcnPnmoQKICogIkNvb2tpZSI6IiRiaWxpX2Nvb2tpZSIKICog5omL5Yqo5pu/5o2i5Li6CiAqICJDb29raWUiOiLlsIbojrflj5bnmoRDb29raWXpu4/otLTlnKjov5kiCiAqLwoKdmFyIHJ1bGUgPSB7CiAgICB0aXRsZTogJ+WTlOWTqeebtOaSrScsCiAgICBob3N0OiAnaHR0cHM6Ly9hcGkubGl2ZS5iaWxpYmlsaS5jb20nLAogICAgaG9tZVVybDogJy94bGl2ZS93ZWItaW50ZXJmYWNlL3YxL3NlY29uZC9nZXRVc2VyUmVjb21tZW5kP3BhZ2U9MSZwYWdlX3NpemU9MzAmcGxhdGZvcm09d2ViJywgLy/nlKjkuo4i5YiG57G76I635Y+WIuWSjCLmjqjojZDojrflj5YiCiAgICB1cmw6ICcveGxpdmUvd2ViLWludGVyZmFjZS92MS9zZWNvbmQvZ2V0TGlzdD9wbGF0Zm9ybT13ZWImcGFyZW50X2FyZWFfaWQ9ZnljbGFzcyZhcmVhX2lkPWZ5ZmlsdGVyJnNvcnRfdHlwZT1vbmxpbmUmcGFnZT1meXBhZ2UnLAogICAgY2xhc3NfbmFtZTogJ+eUn+a0uybnvZHmuLgm5omL5ri4JuWNleacuua4uOaIjyblqLHkuZAm55S15Y+wJuiZmuaLn+S4u+aSrSbogYrlpKnlrqQm55+l6K+GJui1m+S6iybluK7miJHnjqkm5LqS5Yqo546p5rOVJui0reeJqScsCiAgICBjbGFzc191cmw6ICcxMCYyJjMmNiYxJjUmOSYxNCYxMSYxMyYzMDEmMTUmMzAwJywKICAgIGZpbHRlcmFibGU6IDEsCiAgICBmaWx0ZXJfdXJsOiAne3tmbC5hcmVhfX0nLAogICAgZmlsdGVyX2RlZjogewogICAgICAgIDEwOiB7CiAgICAgICAgICAgIGFyZWE6ICc2MjQnCiAgICAgICAgfSwKICAgICAgICAyOiB7CiAgICAgICAgICAgIGFyZWE6ICc4NicKICAgICAgICB9LAogICAgICAgIDM6IHsKICAgICAgICAgICAgYXJlYTogJzM1JwogICAgICAgIH0sCiAgICAgICAgNjogewogICAgICAgICAgICBhcmVhOiAnMjM2JwogICAgICAgIH0sCiAgICAgICAgMTogewogICAgICAgICAgICBhcmVhOiAnMjEnCiAgICAgICAgfSwKICAgICAgICA1OiB7CiAgICAgICAgICAgIGFyZWE6ICcxOTAnCiAgICAgICAgfSwKICAgICAgICA5OiB7CiAgICAgICAgICAgIGFyZWE6ICc3NDQnCiAgICAgICAgfSwKICAgICAgICAxNDogewogICAgICAgICAgICBhcmVhOiAnODE4JwogICAgICAgIH0sCiAgICAgICAgMTE6IHsKICAgICAgICAgICAgYXJlYTogJzM3NicKICAgICAgICB9LAogICAgICAgIDEzOiB7CiAgICAgICAgICAgIGFyZWE6ICc1NjInCiAgICAgICAgfSwKICAgICAgICAzMDE6IHsKICAgICAgICAgICAgYXJlYTogJzMwMTAwMCcKICAgICAgICB9LAogICAgICAgIDE1OiB7CiAgICAgICAgICAgIGFyZWE6ICcnCiAgICAgICAgfSwKICAgICAgICAzMDA6IHsKICAgICAgICAgICAgYXJlYTogJzMwMDAwMCcKICAgICAgICB9CiAgICB9LAogICAgZmlsdGVyOiB7CiAgICAgICAgIjEiOiBbewogICAgICAgICAgICAia2V5IjogImFyZWEiLAogICAgICAgICAgICAibmFtZSI6ICLliIbljLoiLAogICAgICAgICAgICAidmFsdWUiOiBbewogICAgICAgICAgICAgICAgIm4iOiAi5YWo6YOoIiwKICAgICAgICAgICAgICAgICJ2IjogIiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi6JCM5a6F6aKG5Z+fIiwKICAgICAgICAgICAgICAgICJ2IjogIjUzMCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi6KeG6aKR5ZSx6KeBIiwKICAgICAgICAgICAgICAgICJ2IjogIjIxIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLoiJ7op4EiLAogICAgICAgICAgICAgICAgInYiOiAiMjA3IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLpopzlgLwiLAogICAgICAgICAgICAgICAgInYiOiAiMTQ1IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLohLHlj6Pnp4AiLAogICAgICAgICAgICAgICAgInYiOiAiODY4IgogICAgICAgICAgICB9XQogICAgICAgIH1dLAogICAgICAgICIyIjogW3sKICAgICAgICAgICAgImtleSI6ICJhcmVhIiwKICAgICAgICAgICAgIm5hbWUiOiAi5YiG5Yy6IiwKICAgICAgICAgICAgInZhbHVlIjogW3sKICAgICAgICAgICAgICAgICJuIjogIuWFqOmDqCIsCiAgICAgICAgICAgICAgICAidiI6ICIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuiLsembhOiBlOebnyIsCiAgICAgICAgICAgICAgICAidiI6ICI4NiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5peg55WP5aWR57qmIiwKICAgICAgICAgICAgICAgICJ2IjogIjMyOSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAiQ1M6R08iLAogICAgICAgICAgICAgICAgInYiOiAiODkiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIkFQRVjoi7Hpm4QiLAogICAgICAgICAgICAgICAgInYiOiAiMjQwIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLmsLjliqvml6Dpl7QiLAogICAgICAgICAgICAgICAgInYiOiAiNjY2IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLnqb/otorngavnur8iLAogICAgICAgICAgICAgICAgInYiOiAiODgiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuWRvei/kOaWueiInyIsCiAgICAgICAgICAgICAgICAidiI6ICI1OTAiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIkRPVEEyIiwKICAgICAgICAgICAgICAgICJ2IjogIjkyIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLlkIPpuKHooYzliqgiLAogICAgICAgICAgICAgICAgInYiOiAiODAiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIumAg+emu+WhlOenkeWkqyIsCiAgICAgICAgICAgICAgICAidiI6ICIyNTIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuS8oOWlhyIsCiAgICAgICAgICAgICAgICAidiI6ICI2OTUiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIkRORiIsCiAgICAgICAgICAgICAgICAidiI6ICI3OCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5Y2h5ouJ5b285LiYIiwKICAgICAgICAgICAgICAgICJ2IjogIjc4MiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5bmV5ZCO6auY5omLIiwKICAgICAgICAgICAgICAgICJ2IjogIjc3NCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi55Sf5q2754uZ5Ye7MiIsCiAgICAgICAgICAgICAgICAidiI6ICI1NzUiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIua0m+Wlh+iLsembhOS8oCIsCiAgICAgICAgICAgICAgICAidiI6ICI1OTkiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuS4g+aXpeS4lueVjCIsCiAgICAgICAgICAgICAgICAidiI6ICI4NTciCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuacgOe7iOW5u+aDszE0IiwKICAgICAgICAgICAgICAgICJ2IjogIjEwMiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi6YeN55Sf6L6557yYIiwKICAgICAgICAgICAgICAgICJ2IjogIjgwOSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5pif6ZmF5oiY55SyIiwKICAgICAgICAgICAgICAgICJ2IjogIjI0OSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5qKm5LiJ5Zu9IiwKICAgICAgICAgICAgICAgICJ2IjogIjcxMCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi6Iux6a2C5LmL5YiDIiwKICAgICAgICAgICAgICAgICJ2IjogIjY5MCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5YmR572RMyIsCiAgICAgICAgICAgICAgICAidiI6ICI4MiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5LuO5YabIiwKICAgICAgICAgICAgICAgICJ2IjogIjgyOSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5YWo5rCR6KGX56+uIiwKICAgICAgICAgICAgICAgICJ2IjogIjg0NSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi6ZOB55Sy6ZuE5YW1IiwKICAgICAgICAgICAgICAgICJ2IjogIjY5MSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5paw5aSp6b6Z5YWr6YOoIiwKICAgICAgICAgICAgICAgICJ2IjogIjY1MyIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi6LWb5bCU5Y+3IiwKICAgICAgICAgICAgICAgICJ2IjogIjY2NyIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi6YCg5qKm6KW/5ri4IiwKICAgICAgICAgICAgICAgICJ2IjogIjY2OCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5rSb5YWL546L5Zu9IiwKICAgICAgICAgICAgICAgICJ2IjogIjY2OSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi6Zeu6YGTIiwKICAgICAgICAgICAgICAgICJ2IjogIjY3MCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi6K+b5LuZ5LiW55WMIiwKICAgICAgICAgICAgICAgICJ2IjogIjY1NCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5aSn6K+d6KW/5ri4IiwKICAgICAgICAgICAgICAgICJ2IjogIjY1MiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5aWH6L+5TVUiLAogICAgICAgICAgICAgICAgInYiOiAiNjgzIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLmsLjmgZLkuYvloZQiLAogICAgICAgICAgICAgICAgInYiOiAiNjg0IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICJRUeS4ieWbvSIsCiAgICAgICAgICAgICAgICAidiI6ICI2ODUiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuS6uumXtOWcsOeLsSIsCiAgICAgICAgICAgICAgICAidiI6ICI2NzciCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuW9qeiZueWymyIsCiAgICAgICAgICAgICAgICAidiI6ICI2ODYiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIua0m+WlhyIsCiAgICAgICAgICAgICAgICAidiI6ICI2NjMiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIui3kei3keWNoeS4gei9piIsCiAgICAgICAgICAgICAgICAidiI6ICI2NjQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuaYn+mZheWFrOawkSIsCiAgICAgICAgICAgICAgICAidiI6ICI2NTgiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIlNxdWFk5oiY5pyv5bCP6ZifIiwKICAgICAgICAgICAgICAgICJ2IjogIjY1OSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5Y+N5oGQ57K+6IuxT25saW5lIiwKICAgICAgICAgICAgICAgICJ2IjogIjYyOSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5Yib5LiW5oiY6L2mIiwKICAgICAgICAgICAgICAgICJ2IjogIjcwNSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi6KOF55Sy5oiY5LqJIiwKICAgICAgICAgICAgICAgICJ2IjogIjY0MiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5a6I5pyb5YWI6ZSLIiwKICAgICAgICAgICAgICAgICJ2IjogIjg3IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLpmL/lsJTmr5TmgakiLAogICAgICAgICAgICAgICAgInYiOiAiNjM5IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLnjI7mnYDlr7nlhrMiLAogICAgICAgICAgICAgICAgInYiOiAiNjAwIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICJDRkhEIiwKICAgICAgICAgICAgICAgICJ2IjogIjQ3MiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5q2m6KOF56qB6KKtIiwKICAgICAgICAgICAgICAgICJ2IjogIjYzNCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAiMzAw6Iux6ZuEIiwKICAgICAgICAgICAgICAgICJ2IjogIjg0IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLngonnn7PkvKDor7QiLAogICAgICAgICAgICAgICAgInYiOiAiOTEiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuWJkee9kTPnvJjotbciLAogICAgICAgICAgICAgICAgInYiOiAiNDk5IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLooZflpLTnr67nkIMiLAogICAgICAgICAgICAgICAgInYiOiAiNjQ5IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLnu7zlkIjlsITlh7siLAogICAgICAgICAgICAgICAgInYiOiAiNjAxIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLliZHngbUiLAogICAgICAgICAgICAgICAgInYiOiAiNTA1IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLpu5HoibLmspnmvKAiLAogICAgICAgICAgICAgICAgInYiOiAiNjMyIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLlpKnmtq/mmI7mnIjliIAiLAogICAgICAgICAgICAgICAgInYiOiAiNTk2IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLlhpLpmanlspsiLAogICAgICAgICAgICAgICAgInYiOiAiNTc0IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLpgIbmiJgiLAogICAgICAgICAgICAgICAgInYiOiAiNDg3IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLprZTlhb3kuonpnLgzIiwKICAgICAgICAgICAgICAgICJ2IjogIjE4MSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAiUVHpo57ovaYiLAogICAgICAgICAgICAgICAgInYiOiAiNjEwIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLprZTlhb3kuJbnlYwiLAogICAgICAgICAgICAgICAgInYiOiAiODMiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIk5CQTJLT0wyIiwKICAgICAgICAgICAgICAgICJ2IjogIjU4MSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5L2/5ZG95Y+s5ZSkOuaImOWMuiIsCiAgICAgICAgICAgICAgICAidiI6ICIzMTgiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuWdpuWFi+S4lueVjCIsCiAgICAgICAgICAgICAgICAidiI6ICIxMTUiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuaImOiIsOS4lueVjCIsCiAgICAgICAgICAgICAgICAidiI6ICIyNDgiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuaImOS6iembt+mchiIsCiAgICAgICAgICAgICAgICAidiI6ICIzMTYiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuaImOaEjyIsCiAgICAgICAgICAgICAgICAidiI6ICIzODMiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIumjjuaatOiLsembhCIsCiAgICAgICAgICAgICAgICAidiI6ICIxMTQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuaYn+mZheS6iemcuDIiLAogICAgICAgICAgICAgICAgInYiOiAiOTMiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuWIgOWhlOiHqui1sOajiyIsCiAgICAgICAgICAgICAgICAidiI6ICIyMzkiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuWgoeWekuS5i+WknCIsCiAgICAgICAgICAgICAgICAidiI6ICIxNjQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuaequelnue6qiIsCiAgICAgICAgICAgICAgICAidiI6ICIyNTEiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuS4ieWbveadgCIsCiAgICAgICAgICAgICAgICAidiI6ICI4MSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi6b6Z5LmL6LC3IiwKICAgICAgICAgICAgICAgICJ2IjogIjExMiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5bm75oOz5YWo5piO5pifIiwKICAgICAgICAgICAgICAgICJ2IjogIjE3NiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5oCA5pen572R5ri4IiwKICAgICAgICAgICAgICAgICJ2IjogIjI4OCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5paw5ri45YmN5567IiwKICAgICAgICAgICAgICAgICJ2IjogIjI5OCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5pif5oiY5YmN5aSc77ya5pmo5pumIiwKICAgICAgICAgICAgICAgICJ2IjogIjMzMSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5rWB5pS+5LmL6LevIiwKICAgICAgICAgICAgICAgICJ2IjogIjU1MSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAiRlBT5rKZ55uSIiwKICAgICAgICAgICAgICAgICJ2IjogIjYzMyIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5rC45oGS6L2u5ZueIiwKICAgICAgICAgICAgICAgICJ2IjogIjQ1OSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5r+A5oiYMiIsCiAgICAgICAgICAgICAgICAidiI6ICI2MDciCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuWFtuS7lue9kea4uCIsCiAgICAgICAgICAgICAgICAidiI6ICIxMDciCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuiTneiJsuWNj+iuriIsCiAgICAgICAgICAgICAgICAidiI6ICI3NjAiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIlRoZSBGaW5hbHMiLAogICAgICAgICAgICAgICAgInYiOiAiODQ2IgogICAgICAgICAgICB9XQogICAgICAgIH1dLAogICAgICAgICIzIjogW3sKICAgICAgICAgICAgImtleSI6ICJhcmVhIiwKICAgICAgICAgICAgIm5hbWUiOiAi5YiG5Yy6IiwKICAgICAgICAgICAgInZhbHVlIjogW3sKICAgICAgICAgICAgICAgICJuIjogIuWFqOmDqCIsCiAgICAgICAgICAgICAgICAidiI6ICIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIueOi+iAheiNo+iAgCIsCiAgICAgICAgICAgICAgICAidiI6ICIzNSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5ZKM5bmz57K+6IuxIiwKICAgICAgICAgICAgICAgICJ2IjogIjI1NiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5Y6f56WeIiwKICAgICAgICAgICAgICAgICJ2IjogIjMyMSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5bSp5Z2P77ya5pif56m56ZOB6YGTIiwKICAgICAgICAgICAgICAgICJ2IjogIjU0OSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi56ys5LqU5Lq65qC8IiwKICAgICAgICAgICAgICAgICJ2IjogIjE2MyIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi57ud5Yy66Zu2IiwKICAgICAgICAgICAgICAgICJ2IjogIjY2MiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAiTE9M5omL5ri4IiwKICAgICAgICAgICAgICAgICJ2IjogIjM5NSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5piO5pel5pa56IifIiwKICAgICAgICAgICAgICAgICJ2IjogIjI1NSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi6buO5piO6KeJ6YaS77ya55Sf5py6IiwKICAgICAgICAgICAgICAgICJ2IjogIjQ3OSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi6JuL5LuU5rS+5a+5IiwKICAgICAgICAgICAgICAgICJ2IjogIjU3MSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5YWD5qKm5LmL5pifIiwKICAgICAgICAgICAgICAgICJ2IjogIjgyMiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi6Zeq6ICA77yB5LyY5L+K5bCR5aWzIiwKICAgICAgICAgICAgICAgICJ2IjogIjgwNSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi55m96I2G5Zue5buKIiwKICAgICAgICAgICAgICAgICJ2IjogIjg0OSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5YWD5rCU6aqR5aOr5YmN5LygIiwKICAgICAgICAgICAgICAgICJ2IjogIjg1MCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5YWJ6ZqZ6Kej6K+tIiwKICAgICAgICAgICAgICAgICJ2IjogIjg1MyIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi6ZKi5bKaIiwKICAgICAgICAgICAgICAgICJ2IjogIjg1NiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5LyX56We5rS+5a+5IiwKICAgICAgICAgICAgICAgICJ2IjogIjg2MSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5p6B5ZOB6aOe6L2m5Zyo57q/56e75Yqo54mIIiwKICAgICAgICAgICAgICAgICJ2IjogIjg1MiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5aWz56We5byC6Ze75b2V77ya5aSc5bmV6a2F5b2xIiwKICAgICAgICAgICAgICAgICJ2IjogIjgwMiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5L6d6Zyy5biM5bCU77ya5pif5pmTIiwKICAgICAgICAgICAgICAgICJ2IjogIjgzOCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5pav6Zyy5b63IiwKICAgICAgICAgICAgICAgICJ2IjogIjc5NyIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5Y2D5bm05LmL5peFIiwKICAgICAgICAgICAgICAgICJ2IjogIjgwNiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi55m95aSc5p6B5YWJIiwKICAgICAgICAgICAgICAgICJ2IjogIjc4MSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi6YCG5rC05a+S5omL5ri4IiwKICAgICAgICAgICAgICAgICJ2IjogIjc3MSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi546H5Zyf5LmL5ruoIiwKICAgICAgICAgICAgICAgICJ2IjogIjgwNyIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi6JCk54Gr56qB5Ye7IiwKICAgICAgICAgICAgICAgICJ2IjogIjg3MCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi57uv6Imy5Zue5ZONIiwKICAgICAgICAgICAgICAgICJ2IjogIjgzNyIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5pyI5ZyG5LmL5aScIiwKICAgICAgICAgICAgICAgICJ2IjogIjIxNSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5ZOI5Yip5rOi54m577ya6a2U5rOV6KeJ6YaSIiwKICAgICAgICAgICAgICAgICJ2IjogIjQ3NCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5LiD5Lq65Lyg5aWHIiwKICAgICAgICAgICAgICAgICJ2IjogIjgyMyIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5bm75aGUIiwKICAgICAgICAgICAgICAgICJ2IjogIjU1MCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5pif5LmL56C05pmTIiwKICAgICAgICAgICAgICAgICJ2IjogIjc5OSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi6YeR6ZOy6ZOy5LmL5oiYIiwKICAgICAgICAgICAgICAgICJ2IjogIjUxNCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5bCR5aWz5YmN57q/Mu+8mui/veaUviIsCiAgICAgICAgICAgICAgICAidiI6ICI4MzIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIua3seepuuS5i+ecvCIsCiAgICAgICAgICAgICAgICAidiI6ICI1OTgiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuS6pOmUmeaImOe6vyIsCiAgICAgICAgICAgICAgICAidiI6ICI4NjQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuaXoOacn+i/t+mAlCIsCiAgICAgICAgICAgICAgICAidiI6ICI2NzUiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIui2hei/m+WMlueJqeivrTIiLAogICAgICAgICAgICAgICAgInYiOiAiODYyIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLmmbbmoLgiLAogICAgICAgICAgICAgICAgInYiOiAiNzc3IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLmmJ/nkIPph43lkK8iLAogICAgICAgICAgICAgICAgInYiOiAiODI4IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLlhYnpgYciLAogICAgICAgICAgICAgICAgInYiOiAiNjg3IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLmoYPmupDmt7HlpITmnInkurrlrrYiLAogICAgICAgICAgICAgICAgInYiOiAiNzkyIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLkuInlm73lv5fmiJjmo4vniYgiLAogICAgICAgICAgICAgICAgInYiOiAiNzU2IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLku6Xpl6rkuq7kuYvlkI0iLAogICAgICAgICAgICAgICAgInYiOiAiNzU1IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLlsJjnmb3npoHljLoiLAogICAgICAgICAgICAgICAgInYiOiAiNzc4IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLprLzms6Mt5beF5bOw5LmL5oiYIiwKICAgICAgICAgICAgICAgICJ2IjogIjQ3MCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi6aaZ6IKg5rS+5a+5IiwKICAgICAgICAgICAgICAgICJ2IjogIjY4OSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi6auY6IO96Iux6ZuEIiwKICAgICAgICAgICAgICAgICJ2IjogIjc4MyIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5L2/5ZG95Y+s5ZSk5omL5ri4IiwKICAgICAgICAgICAgICAgICJ2IjogIjM4NiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5bSp5Z2PMyIsCiAgICAgICAgICAgICAgICAidiI6ICI0MCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi6JSa6JOd5qGj5qGIIiwKICAgICAgICAgICAgICAgICJ2IjogIjc4NyIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi56ys5LiD5Y+y6K+XIiwKICAgICAgICAgICAgICAgICJ2IjogIjc4NCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5ri45oiP546L77ya5Yaz5paX6ZO+5o6lIiwKICAgICAgICAgICAgICAgICJ2IjogIjQwNyIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5ri45oiP546LIiwKICAgICAgICAgICAgICAgICJ2IjogIjMwMyIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAiSkrmlpflnLDkuLsiLAogICAgICAgICAgICAgICAgInYiOiAiNzI0IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLpmLTpmLPluIgiLAogICAgICAgICAgICAgICAgInYiOiAiMzYiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuasouS5kOaWl+WcsOS4uyIsCiAgICAgICAgICAgICAgICAidiI6ICI3MTkiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuWkquepuuadgCIsCiAgICAgICAgICAgICAgICAidiI6ICI3OTEiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIumVv+WuieW5u+aDsyIsCiAgICAgICAgICAgICAgICAidiI6ICI3MzgiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIueBq+W9seW/jeiAheaJi+a4uCIsCiAgICAgICAgICAgICAgICAidiI6ICIyOTIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIkZhdGUvR08iLAogICAgICAgICAgICAgICAgInYiOiAiMzciCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIue7vOWQiOaji+eJjCIsCiAgICAgICAgICAgICAgICAidiI6ICIzNTQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIlFR6aOe6L2m5omL5ri4IiwKICAgICAgICAgICAgICAgICJ2IjogIjE1NCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5Yaz5oiY77yB5bmz5a6J5LqsIiwKICAgICAgICAgICAgICAgICJ2IjogIjE0MCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi54u85Lq65p2AIiwKICAgICAgICAgICAgICAgICJ2IjogIjQxIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLkuInlm73mnYDnp7vliqjniYgiLAogICAgICAgICAgICAgICAgInYiOiAiMzUyIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLnoqfok53oiKrnur8iLAogICAgICAgICAgICAgICAgInYiOiAiMTEzIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLlvbHkuYvor5ciLAogICAgICAgICAgICAgICAgInYiOiAiMTU2IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLmmI7ml6XkuYvlkI4iLAogICAgICAgICAgICAgICAgInYiOiAiMTg5IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLph43ov5TmnKrmnaXvvJoxOTk5IiwKICAgICAgICAgICAgICAgICJ2IjogIjc2MSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi546v6KGM5peF6IiNIiwKICAgICAgICAgICAgICAgICJ2IjogIjc4NiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5bm75LiW5LiO5YaS6ZmpIiwKICAgICAgICAgICAgICAgICJ2IjogIjgxMyIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi6YOo6JC95Yay56qBOueah+WupOaImOS6iSIsCiAgICAgICAgICAgICAgICAidiI6ICI1MCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5aWl5q+U5bKb5omL5ri4IiwKICAgICAgICAgICAgICAgICJ2IjogIjY2MSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5by55by55aCCIiwKICAgICAgICAgICAgICAgICJ2IjogIjczNCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi6ZuA5aesIiwKICAgICAgICAgICAgICAgICJ2IjogIjIxNCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5YWs5Li76L+e57uTUmU6RGl2ZSIsCiAgICAgICAgICAgICAgICAidiI6ICIzMzAiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIkRORuaJi+a4uCIsCiAgICAgICAgICAgICAgICAidiI6ICIzNDMiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIkZJRkHotrPnkIPkuJbnlYwiLAogICAgICAgICAgICAgICAgInYiOiAiNjQxIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICJCYW5HIERyZWFtIiwKICAgICAgICAgICAgICAgICJ2IjogIjI1OCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi6I2S6YeO5Lmx5paXIiwKICAgICAgICAgICAgICAgICJ2IjogIjQ2OSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAiQ0bmiYvmuLgiLAogICAgICAgICAgICAgICAgInYiOiAiMzMzIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLmiJjlj4zluJXlvKXku4AiLAogICAgICAgICAgICAgICAgInYiOiAiMjkzIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLlpKnmtq/mmI7mnIjliIDmiYvmuLgiLAogICAgICAgICAgICAgICAgInYiOiAiMzg5IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLop6Plr4bmuLjmiI8iLAogICAgICAgICAgICAgICAgInYiOiAiNDIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuaBi+eIseWFu+aIkOa4uOaIjyIsCiAgICAgICAgICAgICAgICAidiI6ICI1NzYiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuaal+m7keegtOWdj+elnu+8muS4jeacvSIsCiAgICAgICAgICAgICAgICAidiI6ICI0OTIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuaal+WMuueqgeWbtCIsCiAgICAgICAgICAgICAgICAidiI6ICI1MDIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIui3kei3keWNoeS4gei9puaJi+a4uCIsCiAgICAgICAgICAgICAgICAidiI6ICIyNjUiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIumdnuS6uuWtpuWbrSIsCiAgICAgICAgICAgICAgICAidiI6ICIyMTIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIueZvumXu+eJjCIsCiAgICAgICAgICAgICAgICAidiI6ICIyODYiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIueMq+WSjOiAgem8oOaJi+a4uCIsCiAgICAgICAgICAgICAgICAidiI6ICIyNjkiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuWdjuWFrOmqkeWGoOWJkSIsCiAgICAgICAgICAgICAgICAidiI6ICI0NDIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuW/jeiAheW/hemhu+atuzMiLAogICAgICAgICAgICAgICAgInYiOiAiMjAzIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLmoqblubvopb/muLjmiYvmuLgiLAogICAgICAgICAgICAgICAgInYiOiAiMzQyIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLoiKrmtbfnjovng63ooYDoiKrnur8iLAogICAgICAgICAgICAgICAgInYiOiAiNTA0IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLlsJHlpbPliY3nur8iLAogICAgICAgICAgICAgICAgInYiOiAiMzkiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIjMwMOWkp+S9nOaImCIsCiAgICAgICAgICAgICAgICAidiI6ICI2ODgiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuWwkeWls+WJjee6v++8muS6keWbvuiuoeWIkiIsCiAgICAgICAgICAgICAgICAidiI6ICI1MjUiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIua8q+Wogei2hee6p+aImOS6iSIsCiAgICAgICAgICAgICAgICAidiI6ICI0NzgiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuaRqeWwlOW6hOWbreaJi+a4uCIsCiAgICAgICAgICAgICAgICAidiI6ICI0NjQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuWuneWPr+aipuWkp+mbhue7kyIsCiAgICAgICAgICAgICAgICAidiI6ICI0OTMiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuWwj+WKqOeJqeS5i+aYnyIsCiAgICAgICAgICAgICAgICAidiI6ICI0NzMiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuWkqeWcsOWKq++8muW5veWfjuWGjeS4tCIsCiAgICAgICAgICAgICAgICAidiI6ICI0NDgiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIua8q+WogeWvueWGsyIsCiAgICAgICAgICAgICAgICAidiI6ICI1MTEiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuS4nOaWueW9kuiogOW9lSIsCiAgICAgICAgICAgICAgICAidiI6ICI1MzgiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuaipuW5u+aooeaLn+aImCIsCiAgICAgICAgICAgICAgICAidiI6ICIxNzgiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuaXtuepuueMjuS6ujMiLAogICAgICAgICAgICAgICAgInYiOiAiNjQzIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLkuInlm73vvJrosIvlrprlpKnkuIsiLAogICAgICAgICAgICAgICAgInYiOiAiODcxIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLph43ov5TluJ3lm70iLAogICAgICAgICAgICAgICAgInYiOiAiNjEzIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLkvJHpl7LlsI/muLjmiI8iLAogICAgICAgICAgICAgICAgInYiOiAiNjc5IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLlhbbku5bmiYvmuLgiLAogICAgICAgICAgICAgICAgInYiOiAiOTgiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuWxsea1t+mVnOiKsSIsCiAgICAgICAgICAgICAgICAidiI6ICI4MjEiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuWwj+WGsOWGsOS8oOWlhyIsCiAgICAgICAgICAgICAgICAidiI6ICI4MjQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuWGkumZqeWym+aJi+a4uCIsCiAgICAgICAgICAgICAgICAidiI6ICI3OTYiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuaWsOa4uOivhOa1iyIsCiAgICAgICAgICAgICAgICAidiI6ICIyNzQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuWvueWzmTIiLAogICAgICAgICAgICAgICAgInYiOiAiODYzIgogICAgICAgICAgICB9XQogICAgICAgIH1dLAogICAgICAgICI1IjogW3sKICAgICAgICAgICAgImtleSI6ICJhcmVhIiwKICAgICAgICAgICAgIm5hbWUiOiAi5YiG5Yy6IiwKICAgICAgICAgICAgInZhbHVlIjogW3sKICAgICAgICAgICAgICAgICJuIjogIuWFqOmDqCIsCiAgICAgICAgICAgICAgICAidiI6ICIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuWUseingeeUteWPsCIsCiAgICAgICAgICAgICAgICAidiI6ICIxOTAiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuiBiuWkqeeUteWPsCIsCiAgICAgICAgICAgICAgICAidiI6ICIxOTIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIueUt+WjsOeUteWPsCIsCiAgICAgICAgICAgICAgICAidiI6ICI4MTciCiAgICAgICAgICAgIH1dCiAgICAgICAgfV0sCiAgICAgICAgIjYiOiBbewogICAgICAgICAgICAia2V5IjogImFyZWEiLAogICAgICAgICAgICAibmFtZSI6ICLliIbljLoiLAogICAgICAgICAgICAidmFsdWUiOiBbewogICAgICAgICAgICAgICAgIm4iOiAi5YWo6YOoIiwKICAgICAgICAgICAgICAgICJ2IjogIiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5Li75py65ri45oiPIiwKICAgICAgICAgICAgICAgICJ2IjogIjIzNiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5YW25LuW5Y2V5py6IiwKICAgICAgICAgICAgICAgICJ2IjogIjIzNSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi54us56uL5ri45oiPIiwKICAgICAgICAgICAgICAgICJ2IjogIjI4MyIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5oCA5pen5ri45oiPIiwKICAgICAgICAgICAgICAgICJ2IjogIjIzNyIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5oGQ5oCW5ri45oiPIiwKICAgICAgICAgICAgICAgICJ2IjogIjI3NiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5bm75YW95biV6bKBIiwKICAgICAgICAgICAgICAgICJ2IjogIjg2NiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi54yb5YW95rS+5a+5IiwKICAgICAgICAgICAgICAgICJ2IjogIjM4NCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5ZG96L+QMiIsCiAgICAgICAgICAgICAgICAidiI6ICIyNzciCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIkZPUlpBIOaegemZkOernumAnyIsCiAgICAgICAgICAgICAgICAidiI6ICIzMDIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuWNoeeJjOa9rueOqSIsCiAgICAgICAgICAgICAgICAidiI6ICI4NTQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuaIkeeahOS4lueVjCIsCiAgICAgICAgICAgICAgICAidiI6ICIyMTYiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIumTgeaLszgiLAogICAgICAgICAgICAgICAgInYiOiAiODY3IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLlhajlooPlsIHplIEyIiwKICAgICAgICAgICAgICAgICJ2IjogIjI0MyIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi6Zu+6ZSB546L5Zu9IiwKICAgICAgICAgICAgICAgICJ2IjogIjg2OSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5qSN54mp5aSn5oiY5YO15bC4IiwKICAgICAgICAgICAgICAgICJ2IjogIjMwOSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5pqW6ZuqIiwKICAgICAgICAgICAgICAgICJ2IjogIjU4MiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi6ZuA6a2C6bq75bCGIiwKICAgICAgICAgICAgICAgICJ2IjogIjgwMyIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5oCq54mp54yO5Lq6IiwKICAgICAgICAgICAgICAgICJ2IjogIjU3OCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5L2/5ZG95Y+s5ZSkMjAiLAogICAgICAgICAgICAgICAgInYiOiAiMjgyIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLnlJ/ljJbljbHmnLoiLAogICAgICAgICAgICAgICAgInYiOiAiNzIxIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLmiJjlnLDpo47kupEiLAogICAgICAgICAgICAgICAgInYiOiAiNTk3IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLmoLzmlpfmuLjmiI8iLAogICAgICAgICAgICAgICAgInYiOiAiNDMzIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLnsr7ngbXlrp3lj6/moqYiLAogICAgICAgICAgICAgICAgInYiOiAiMjI4IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLnoqfok53lubvmg7NHQlIiLAogICAgICAgICAgICAgICAgInYiOiAiODU5IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLnuqLoibLorabmiJIyIiwKICAgICAgICAgICAgICAgICJ2IjogIjY5MyIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi562W55Wl5ri45oiPIiwKICAgICAgICAgICAgICAgICJ2IjogIjU3MCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi6Im+5bCU55m75rOV546vIiwKICAgICAgICAgICAgICAgICJ2IjogIjU1NSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5pqX6buR56C05Z2P56We4oWjIiwKICAgICAgICAgICAgICAgICJ2IjogIjc4MCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5Li65LqG5ZC+546LSUkiLAogICAgICAgICAgICAgICAgInYiOiAiNzY5IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLlrp3lj6/moqbpm4bmjaLlvI/ljaHniYzmuLjmiI8iLAogICAgICAgICAgICAgICAgInYiOiAiNzIwIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLppaXojZIiLAogICAgICAgICAgICAgICAgInYiOiAiMjE4IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLojZLph47lpKfplZblrqIyIiwKICAgICAgICAgICAgICAgICJ2IjogIjIyNiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5aGe5bCU6L6+5Lyg6K+0IiwKICAgICAgICAgICAgICAgICJ2IjogIjMwOCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5pa56IifIiwKICAgICAgICAgICAgICAgICJ2IjogIjI5NSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5bid5Zu95pe25LujNCIsCiAgICAgICAgICAgICAgICAidiI6ICI1NDgiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuS9k+iCsua4uOaIjyIsCiAgICAgICAgICAgICAgICAidiI6ICI1MDAiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIkRhcmsgYW5kIERhcmtlciIsCiAgICAgICAgICAgICAgICAidiI6ICI3OTUiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuS7geeOizIiLAogICAgICAgICAgICAgICAgInYiOiAiMzEzIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLlj6rni7wiLAogICAgICAgICAgICAgICAgInYiOiAiMjQ1IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLmmpfpu5HnoLTlnY/npZ4iLAogICAgICAgICAgICAgICAgInYiOiAiNTM1IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICJGQzI0IiwKICAgICAgICAgICAgICAgICJ2IjogIjgzMCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5Lul5pKSIiwKICAgICAgICAgICAgICAgICJ2IjogIjIxOSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5rOw5ouJ55Ge5LqaIiwKICAgICAgICAgICAgICAgICJ2IjogIjU5MyIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi6aqR6ams5LiO56CN5p2AIiwKICAgICAgICAgICAgICAgICJ2IjogIjMyNiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5pav5pmu5ouJ6YGBMyIsCiAgICAgICAgICAgICAgICAidiI6ICI2OTQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuWIuuWuouS/oeadoSIsCiAgICAgICAgICAgICAgICAidiI6ICIyMjciCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIkRyZWFkIEh1bmdlciIsCiAgICAgICAgICAgICAgICAidiI6ICI1OTEiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuaBi+eIseaooeaLn+a4uOaIjyIsCiAgICAgICAgICAgICAgICAidiI6ICI1OTIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIk5CQTJLIiwKICAgICAgICAgICAgICAgICJ2IjogIjM2MiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5ri45oiP6YCf6YCaIiwKICAgICAgICAgICAgICAgICJ2IjogIjY3OCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5Y2a5b635LmL6ZeoMyIsCiAgICAgICAgICAgICAgICAidiI6ICIzODUiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuWFqOmdouaImOS6ie+8muaImOmUpDMiLAogICAgICAgICAgICAgICAgInYiOiAiNTk0IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLlj4zkurrmiJDooYwiLAogICAgICAgICAgICAgICAgInYiOiAiNDQ2IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLotZvljZrmnIvlhYsyMDc3IiwKICAgICAgICAgICAgICAgICJ2IjogIjQwMiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi57OW6LGG5Lq6IiwKICAgICAgICAgICAgICAgICJ2IjogIjM1NyIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi6IGa5Lya5ri45oiPIiwKICAgICAgICAgICAgICAgICJ2IjogIjYzNiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5YWo6Z2i5oiY5LqJIiwKICAgICAgICAgICAgICAgICJ2IjogIjI1NyIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5b635bee55S16ZSvIiwKICAgICAgICAgICAgICAgICJ2IjogIjgzNCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi6YeN55Sf57uG6IOeIiwKICAgICAgICAgICAgICAgICJ2IjogIjQyNiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi6L6Q5bCENzYiLAogICAgICAgICAgICAgICAgInYiOiAiMjIwIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLmiJjnpZ4iLAogICAgICAgICAgICAgICAgInYiOiAiNTc5IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLljLnor7rmm7nnmoTosI7oqIAiLAogICAgICAgICAgICAgICAgInYiOiAiODEyIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLprLzms6M1IiwKICAgICAgICAgICAgICAgICJ2IjogIjI0NCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5oGQ6ay855eHIiwKICAgICAgICAgICAgICAgICJ2IjogIjM4NyIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5raI6YCd55qE5YWJ6IqSMiIsCiAgICAgICAgICAgICAgICAidiI6ICI1ODYiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIlJvYmxveCIsCiAgICAgICAgICAgICAgICAidiI6ICI3NTMiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuaXoOS4u+S5i+WcsDMiLAogICAgICAgICAgICAgICAgInYiOiAiMjczIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLovrnlooMiLAogICAgICAgICAgICAgICAgInYiOiAiNzYzIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLntKLlsLzlhYtTdXBlclN0YXIiLAogICAgICAgICAgICAgICAgInYiOiAiODQ0IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLog6Hpl7nljqjmiL8iLAogICAgICAgICAgICAgICAgInYiOiAiNTA3IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLnm5fotLzkuYvmtbciLAogICAgICAgICAgICAgICAgInYiOiAiMzQxIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICJLQVJEUyIsCiAgICAgICAgICAgICAgICAidiI6ICI4MzUiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuaUtuiOt+aXpTMiLAogICAgICAgICAgICAgICAgInYiOiAiODExIgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLoh7Tlkb3lhazlj7giLAogICAgICAgICAgICAgICAgInYiOiAiODU4IgogICAgICAgICAgICB9XQogICAgICAgIH1dLAogICAgICAgICI5IjogW3sKICAgICAgICAgICAgImtleSI6ICJhcmVhIiwKICAgICAgICAgICAgIm5hbWUiOiAi5YiG5Yy6IiwKICAgICAgICAgICAgInZhbHVlIjogW3sKICAgICAgICAgICAgICAgICJuIjogIuWFqOmDqCIsCiAgICAgICAgICAgICAgICAidiI6ICIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuiZmuaLn1NpbmdlciIsCiAgICAgICAgICAgICAgICAidiI6ICI3NDQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuiZmuaLn0dhbWVyIiwKICAgICAgICAgICAgICAgICJ2IjogIjc0NSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi6Jma5ouf5aOw5LyYIiwKICAgICAgICAgICAgICAgICJ2IjogIjc0NiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi6Jma5ouf55S3ViIsCiAgICAgICAgICAgICAgICAidiI6ICI4NTEiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuiZmuaLn+aXpeW4uCIsCiAgICAgICAgICAgICAgICAidiI6ICIzNzEiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuiZmuaLn0FQRVgiLAogICAgICAgICAgICAgICAgInYiOiAiNzg5IgogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAibiI6ICLomZrmi59QSyIsCiAgICAgICAgICAgICAgICAidiI6ICI3NzUiCiAgICAgICAgICAgIH1dCiAgICAgICAgfV0sCiAgICAgICAgIjEwIjogW3sKICAgICAgICAgICAgImtleSI6ICJhcmVhIiwKICAgICAgICAgICAgIm5hbWUiOiAi5YiG5Yy6IiwKICAgICAgICAgICAgInZhbHVlIjogW3sKICAgICAgICAgICAgICAgICJuIjogIuWFqOmDqCIsCiAgICAgICAgICAgICAgICAidiI6ICIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIueUteWtkOamqOiPnCIsCiAgICAgICAgICAgICAgICAidiI6ICI2MjQiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIueUn+a0u+WIhuS6qyIsCiAgICAgICAgICAgICAgICAidiI6ICI2NDYiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuiBiuWkqeS6pOWPiyIsCiAgICAgICAgICAgICAgICAidiI6ICI4MjUiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuaJi+W3pee7mOeUuyIsCiAgICAgICAgICAgICAgICAidiI6ICI2MjciCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuaDheaEnyIsCiAgICAgICAgICAgICAgICAidiI6ICI2MjMiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuaIt+WkliIsCiAgICAgICAgICAgICAgICAidiI6ICIzNjgiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuiQjOWuoCIsCiAgICAgICAgICAgICAgICAidiI6ICIzNjkiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIui/kOWKqCIsCiAgICAgICAgICAgICAgICAidiI6ICI2MjgiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIue+jumjnyIsCiAgICAgICAgICAgICAgICAidiI6ICIzNjciCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuaXtuWwmiIsCiAgICAgICAgICAgICAgICAidiI6ICIzNzgiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuayiea1uOS9k+mqjCIsCiAgICAgICAgICAgICAgICAidiI6ICI4MjciCiAgICAgICAgICAgIH1dCiAgICAgICAgfV0sCiAgICAgICAgIjExIjogW3sKICAgICAgICAgICAgImtleSI6ICJhcmVhIiwKICAgICAgICAgICAgIm5hbWUiOiAi5YiG5Yy6IiwKICAgICAgICAgICAgInZhbHVlIjogW3sKICAgICAgICAgICAgICAgICJuIjogIuWFqOmDqCIsCiAgICAgICAgICAgICAgICAidiI6ICIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuekvuenkeazleW+i+W/g+eQhiIsCiAgICAgICAgICAgICAgICAidiI6ICIzNzYiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuS6uuaWh+WOhuWPsiIsCiAgICAgICAgICAgICAgICAidiI6ICI3MDIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuagoeWbreWtpuS5oCIsCiAgICAgICAgICAgICAgICAidiI6ICIzNzIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuiBjOWcusK35oqA6IO9IiwKICAgICAgICAgICAgICAgICJ2IjogIjM3NyIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi56eR5oqAIiwKICAgICAgICAgICAgICAgICJ2IjogIjM3NSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi56eR5a2m56eR5pmuIiwKICAgICAgICAgICAgICAgICJ2IjogIjcwMSIKICAgICAgICAgICAgfV0KICAgICAgICB9XSwKICAgICAgICAiMTMiOiBbewogICAgICAgICAgICAia2V5IjogImFyZWEiLAogICAgICAgICAgICAibmFtZSI6ICLliIbljLoiLAogICAgICAgICAgICAidmFsdWUiOiBbewogICAgICAgICAgICAgICAgIm4iOiAi5YWo6YOoIiwKICAgICAgICAgICAgICAgICJ2IjogIiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5ri45oiP6LWb5LqLIiwKICAgICAgICAgICAgICAgICJ2IjogIjU2MSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5L2T6IKy6LWb5LqLIiwKICAgICAgICAgICAgICAgICJ2IjogIjU2MiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi6LWb5LqL57u85ZCIIiwKICAgICAgICAgICAgICAgICJ2IjogIjU2MyIKICAgICAgICAgICAgfV0KICAgICAgICB9XSwKICAgICAgICAiMTQiOiBbewogICAgICAgICAgICAia2V5IjogImFyZWEiLAogICAgICAgICAgICAibmFtZSI6ICLliIbljLoiLAogICAgICAgICAgICAidmFsdWUiOiBbewogICAgICAgICAgICAgICAgIm4iOiAi5YWo6YOoIiwKICAgICAgICAgICAgICAgICJ2IjogIiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5Lqk5Y+LIiwKICAgICAgICAgICAgICAgICJ2IjogIjgxOCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi54K55ZSxIiwKICAgICAgICAgICAgICAgICJ2IjogIjgxOSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5YW06LajIiwKICAgICAgICAgICAgICAgICJ2IjogIjgyMCIKICAgICAgICAgICAgfV0KICAgICAgICB9XSwKICAgICAgICAiMTUiOiBbewogICAgICAgICAgICAia2V5IjogImFyZWEiLAogICAgICAgICAgICAibmFtZSI6ICLliIbljLoiLAogICAgICAgICAgICAidmFsdWUiOiBbewogICAgICAgICAgICAgICAgIm4iOiAi5YWo6YOoIiwKICAgICAgICAgICAgICAgICJ2IjogIiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi56ue5oqA546p5rOVIiwKICAgICAgICAgICAgICAgICJ2IjogIjgxNSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5YW75oiQ546p5rOVIiwKICAgICAgICAgICAgICAgICJ2IjogIjg0MCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5qOL54mM546p5rOVIiwKICAgICAgICAgICAgICAgICJ2IjogIjg0MSIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5LyR6Zey546p5rOVIiwKICAgICAgICAgICAgICAgICJ2IjogIjgxNiIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgIm4iOiAi5pCe56yR5pW06JuKIiwKICAgICAgICAgICAgICAgICJ2IjogIjg0MiIKICAgICAgICAgICAgfV0KICAgICAgICB9XSwKICAgICAgICAiMzAxIjogW3sKICAgICAgICAgICAgImtleSI6ICJhcmVhIiwKICAgICAgICAgICAgIm5hbWUiOiAi5YiG5Yy6IiwKICAgICAgICAgICAgInZhbHVlIjogW3sKICAgICAgICAgICAgICAgICJuIjogIuWFqOmDqCIsCiAgICAgICAgICAgICAgICAidiI6ICIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIueDremXqOW4rueOqSIsCiAgICAgICAgICAgICAgICAidiI6ICIzMDEwMDAiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuaJi+a4uOW4rueOqSIsCiAgICAgICAgICAgICAgICAidiI6ICIzMDEwMDIiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIue9kea4uOW4rueOqSIsCiAgICAgICAgICAgICAgICAidiI6ICIzMDEwMDMiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICJuIjogIuWNleacuuW4rueOqSIsCiAgICAgICAgICAgICAgICAidiI6ICIzMDEwMDQiCiAgICAgICAgICAgIH1dCiAgICAgICAgfV0KICAgIH0sCiAgICBkZXRhaWxVcmw6ICdodHRwczovL2xpdmUuYmlsaWJpbGkuY29tL2Z5aWQnLCAvL+S6jOe6p+ivpuaDheaLvOaOpemTvuaOpShqc29u5qC85byP55SoKQogICAgLy8gZGV0YWlsVXJsOidodHRwczovL2FwaS5saXZlLmJpbGliaWxpLmNvbS94bGl2ZS93ZWItcm9vbS92MS9wbGF5VXJsL3BsYXlVcmw/Y2lkPWZ5aWQmcGxhdGZvcm09aDUmb3R5cGU9anNvbiZxdWFsaXR5PTAnLC8v5LqM57qn6K+m5oOF5ou85o6l6ZO+5o6lKGpzb27moLzlvI/nlKgpCiAgICAvLyBzZWFyY2hVcmw6Jy94L3dlYi1pbnRlcmZhY2Uvc2VhcmNoL3R5cGU/X19yZWZyZXNoX189dHJ1ZSZwYWdlPWZ5cGFnZSZwYWdlX3NpemU9NDImb3JkZXI9b25saW5lJnBsYXRmb3JtPXBjJmhpZ2hsaWdodD0xJnNpbmdsZV9jb2x1bW49MCZrZXl3b3JkPSoqJnNlYXJjaF90eXBlPWxpdmUmZHluYW1pY19vZmZzZXQ9MCZwcmVsb2FkPXRydWUnLAogICAgc2VhcmNoVXJsOiAnaHR0cHM6Ly9hcGkuYmlsaWJpbGkuY29tL3gvd2ViLWludGVyZmFjZS9zZWFyY2gvdHlwZT9zZWFyY2hfdHlwZT1saXZlJmtleXdvcmQ9KiomcGFnZT1meXBhZ2UnLAogICAgc2VhcmNoYWJsZTogMiwKICAgIHF1aWNrU2VhcmNoOiAwLAogICAgaGVhZGVyczogewogICAgICAgICJVc2VyLUFnZW50IjogIlBDX1VBIiwKICAgICAgICAiUmVmZXJlciI6ICJodHRwczovL3d3dy5iaWxpYmlsaS5jb20iLAogICAgICAgIC8vICJDb29raWUiOiIkYmlsaV9jb29raWUiCiAgICAgICAgIkNvb2tpZSI6ICJodHRwOi8vMTI3LjAuMC4xOjk5NzgvZmlsZS9UVkJveC9iaWxpYmlsaS50eHQiCiAgICB9LAogICAgdGltZW91dDogNTAwMCwKICAgIGxpbWl0OiA4LAogICAgcGxheV9wYXJzZTogdHJ1ZSwKICAgIC8vIHBsYXlfanNvbjpbe3JlOicqJywganNvbjp7ang6MCwgcGFyc2U6MSxoZWFkZXI6SlNPTi5zdHJpbmdpZnkoeyJ1c2VyLWFnZW50IjoiTW96aWxsYS81LjAgKExpbnV4OyBVOyBBbmRyb2lkIDk7IHpoLUNOOyBNSSA5IEJ1aWxkL1BLUTEuMTgxMTIxLjAwMSkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAgQ2hyb21lLzU3LjAuMjk4Ny4xMDggVUNCcm93c2VyLzEyLjUuNS4xMDM1IE1vYmlsZSBTYWZhcmkvNTM3LjM2In0pfX1dLAogICAgLy8gcGxheV9qc29uOlt7cmU6JyonLCBqc29uOntqeDowLCBwYXJzZToxLGhlYWRlcjpKU09OLnN0cmluZ2lmeSh7InVzZXItYWdlbnQiOiJ1Y191YSJ9KX19XSwKICAgIC8vIHBsYXlfanNvbjowLAogICAgbGF6eTogYGpzOgogICAgICAgIGxldCBpZHMgPSBpbnB1dC5zcGxpdCgnXycpOwogICAgICAgIGxldCBkYW4gPSAnaHR0cHM6Ly9hcGkuYmlsaWJpbGkuY29tL3gvdjEvZG0vbGlzdC5zbz9vaWQ9JyArIGlkc1sxXTsKICAgICAgICBsZXQgcmVzdWx0ID0ge307CiAgICAgICAgbGV0IGl1cmwgPSAnaHR0cHM6Ly9hcGkubGl2ZS5iaWxpYmlsaS5jb20vcm9vbS92MS9Sb29tL3BsYXlVcmw/Y2lkPScgKyBpZHNbMV0gKyAnJicgKyBpZHNbMF07CiAgICAgICAgbGV0IGh0bWwgPSByZXF1ZXN0KGl1cmwpOwogICAgICAgIGxldCBqUm9vdCA9IEpTT04ucGFyc2UoaHRtbCk7CiAgICAgICAgbGV0IGpvID0galJvb3RbJ2RhdGEnXTsKICAgICAgICBsZXQgamEgPSBqb1snZHVybCddOwogICAgICAgIGxldCBwdXJsID0gJyc7CiAgICAgICAgaWYgKGphLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgcHVybCA9IGphWzBdWyd1cmwnXQogICAgICAgIH0KICAgICAgICByZXN1bHRbJ3BhcnNlJ10gPSAwOwogICAgICAgIHJlc3VsdFsncGxheVVybCddID0gJyc7CiAgICAgICAgcmVzdWx0Wyd1cmwnXSA9IHVuZXNjYXBlKHB1cmwpOwogICAgICAgIHJlc3VsdFsnaGVhZGVyJ10gPSB7CiAgICAgICAgICAgIFJlZmVyZXI6ICdodHRwczovL2xpdmUuYmlsaWJpbGkuY29tJywKICAgICAgICAgICAgJ1VzZXItQWdlbnQnOiAnTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzg2LjAuNDI0MC4xOTggU2FmYXJpLzUzNy4zNicKICAgICAgICB9OwogICAgICAgIHJlc3VsdFsnZGFubWFrdSddID0gZGFuOwogICAgICAgIGlmICgvaDUvLnRlc3QoaWRzWzBdKSkgewogICAgICAgICAgICByZXN1bHRbJ2NvbnRlbnRUeXBlJ10gPSAnJzsKICAgICAgICAgICAgaW5wdXQgPSByZXN1bHQKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXN1bHRbJ2NvbnRlbnRUeXBlJ10gPSAndmlkZW8veC1mbHYnOwogICAgICAgICAgICBpbnB1dCA9IHJlc3VsdAogICAgICAgIH0KICAgIGAsCiAgICBkb3VibGU6IGZhbHNlLAogICAg5o6o6I2QOiAnKicsCiAgICAvLyDkuIDnuqc6J2pzb246ZGF0YS5saXN0O3RpdGxlO3N5c3RlbV9jb3Zlcjt1bmFtZTtyb29taWQnLAogICAg5LiA57qnOiBganM6CiAgICAgICAgdmFyIGQgPSBbXTsKICAgICAgICBsZXQgaHRtbCA9IHJlcXVlc3QoaW5wdXQpOwogICAgICAgIGh0bWwgPSBKU09OLnBhcnNlKGh0bWwpLmRhdGEubGlzdDsKICAgICAgICBodG1sLmZvckVhY2goaXQgPT4gewogICAgICAgICAgICBsZXQgcGljID0gaXQuc3lzdGVtX2NvdmVyOwogICAgICAgICAgICBpZiAocGljLnN0YXJ0c1dpdGgoJy8nKSkgewogICAgICAgICAgICAgICAgcGljID0gdXJsam9pbjIoaW5wdXQsIHBpYykKICAgICAgICAgICAgfQogICAgICAgICAgICBkLnB1c2goewogICAgICAgICAgICAgICAgdGl0bGU6IGl0LnRpdGxlLAogICAgICAgICAgICAgICAgaW1nOiBwaWMsCiAgICAgICAgICAgICAgICBkZXNjOiAn8J+RgScgKyBpdC53YXRjaGVkX3Nob3cudGV4dF9zbWFsbCArICcgIPCfhpknICsgaXQudW5hbWUsCiAgICAgICAgICAgICAgICB1cmw6IGl0LnJvb21pZAogICAgICAgICAgICB9KQogICAgICAgIH0pOwogICAgICAgIHNldFJlc3VsdChkKTsKICAgIGAsCiAgICAvLyDkuoznuqc6JyonLAogICAg5LqM57qnOiAianM6bGV0IGFpZD1pbnB1dC5tYXRjaCgvXFwvKFxcZCspLylbMV07bG9nKGFpZCk7bGV0IGh0bWw9cmVxdWVzdCgnaHR0cHM6Ly9hcGkubGl2ZS5iaWxpYmlsaS5jb20vcm9vbS92MS9Sb29tL2dldF9pbmZvP3Jvb21faWQ9JythaWQpO2xldCBqbz1KU09OLnBhcnNlKGh0bWwpLmRhdGE7bGV0IHRpdGxlPWpvWyd0aXRsZSddO2xldCBwaWM9am9bJ2tleWZyYW1lJ107bGV0IGRlc2M9am9bJ2Rlc2NyaXB0aW9uJ107bGV0IGRpcmU9am9bJ3VpZCddO2xldCB0eXBlTmFtZT1qb1snYXJlYV9uYW1lJ107bGV0IHJlbWFyaz0n5Zyo57q/5Lq65pWwOicram9bJ29ubGluZSddO2xldCB2b2Q9e3ZvZF9pZDphaWQsdm9kX25hbWU6dGl0bGUsdm9kX3BpYzpwaWMsdHlwZV9uYW1lOnR5cGVOYW1lLHZvZF9hcmVhOidiaWxpbGl2ZWRhbm11Jyx2b2RfcmVtYXJrczpyZW1hcmssdm9kX2FjdG9yOifnm7Tmkq3pl7RpZC0nK2FpZCx2b2RfZGlyZWN0b3I6ZGlyZSx2b2RfY29udGVudDpkZXNjfTt2b2RbJ3ZvZF9wbGF5X2Zyb20nXT0nQuermSc7dm9kWyd2b2RfcGxheV91cmwnXT0nZmx257q/6Lev5Y6f55S7JHBsYXRmb3JtPXdlYiZxdWFsaXR5PTRfJythaWQrJyNmbHbnur/ot6/pq5jmuIUkcGxhdGZvcm09d2ViJnF1YWxpdHk9M18nK2FpZCsnI2g157q/6Lev5Y6f55S7JHBsYXRmb3JtPWg1JnF1YWxpdHk9NF8nK2FpZCsnI2g157q/6Lev6auY5riFJHBsYXRmb3JtPWg1JnF1YWxpdHk9M18nK2FpZDtWT0Q9dm9kOyIsCiAgICAvLyDmkJzntKI6J2pzb246ZGF0YS5yZXN1bHQubGl2ZV9yb29tO3RpdGxlO2NvdmVyO3VuYW1lO3Jvb21pZCcsCiAgICDmkJzntKI6IGBqczpsZXQgaHRtbD1yZXF1ZXN0KGlucHV0KTtsZXQgbXNnPUpTT04ucGFyc2UoaHRtbCkubWVzc2FnZTtpZihtc2chPT0iMCIpe1ZPRFM9W3t2b2RfbmFtZTpLRVkrIuKeoiIrbXNnLHZvZF9pZDoibm9fZGF0YSIsdm9kX3JlbWFya3M6IuWIq+eCuSznvLrlsJFiaWxpX2Nvb2tpZSIsdm9kX3BpYzoiaHR0cHM6Ly9naHByb3h5Lm5ldC9odHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vaGpkaG54L2RyX3B5L21haW4vNDA0LmpwZyJ9XX1lbHNle2xldCB2aWRlb3M9W107bGV0IHZvZExpc3Q9SlNPTi5wYXJzZShodG1sKS5kYXRhLnJlc3VsdC5saXZlX3Jvb207dm9kTGlzdC5mb3JFYWNoKGZ1bmN0aW9uKHZvZCl7bGV0IGFpZD12b2RbInJvb21pZCJdO2xldCB0aXRsZT0i55u05pKt6Ze077yaIit2b2RbInRpdGxlIl0ucmVwbGFjZShcJzxlbSBjbGFzcz0ia2V5d29yZCI+XCcsIiIpLnJlcGxhY2UoIjwvZW0+IiwiIik7bGV0IGltZz0iaHR0cHM6Iit2b2RbInVzZXJfY292ZXIiXTtsZXQgcmVtYXJrPXZvZFsid2F0Y2hlZF9zaG93Il1bInRleHRfc21hbGwiXSsiICAiK3ZvZFsidW5hbWUiXTt2aWRlb3MucHVzaCh7dm9kX2lkOmFpZCx2b2RfbmFtZTp0aXRsZSx2b2RfcGljOmltZyx2b2RfcmVtYXJrczpyZW1hcmt9KX0pO1ZPRFM9dmlkZW9zfWAsCiAgICAvLyDpooTlpITnkIY6J2lmKHJ1bGVfZmV0Y2hfcGFyYW1zLmhlYWRlcnMuQ29va2llLnN0YXJ0c1dpdGgoImh0dHAiKSl7cnVsZV9mZXRjaF9wYXJhbXMuaGVhZGVycy5Db29raWU9ZmV0Y2gocnVsZV9mZXRjaF9wYXJhbXMuaGVhZGVycy5Db29raWUpO3NldEl0ZW0oUlVMRV9DSyxjb29raWUpfTtsb2cocnVsZV9mZXRjaF9wYXJhbXMuaGVhZGVycy5Db29raWUpJywKfQ==
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1
View File
@@ -0,0 +1 @@
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
+1
View File
@@ -0,0 +1 @@
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
+314
View File
@@ -0,0 +1,314 @@
# coding=utf-8
# !/usr/bin/python
"""
作者 丢丢喵 🚓 内容均从互联网收集而来 仅供交流学习使用 版权归原创者所有 如侵犯了您的权益 请通知作者 将及时删除侵权内容
====================Diudiumiao====================
"""
from Crypto.Util.Padding import unpad
from Crypto.Util.Padding import pad
from urllib.parse import unquote
from Crypto.Cipher import ARC4
from urllib.parse import quote
from base.spider import Spider
from Crypto.Cipher import AES
from datetime import datetime
from bs4 import BeautifulSoup
from base64 import b64decode
import urllib.request
import urllib.parse
import datetime
import binascii
import requests
import base64
import json
import time
import sys
import re
import os
sys.path.append('..')
xurl = "https://search.bilibili.com"
xurl1 = "https://api.live.bilibili.com"
headerx = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0'
}
class Spider(Spider):
global xurl
global xurl1
global headerx
def getName(self):
return "首页"
def init(self, extend):
pass
def isVideoFormat(self, url):
pass
def manualVideoCheck(self):
pass
def extract_middle_text(self, text, start_str, end_str, pl, start_index1: str = '', end_index2: str = ''):
if pl == 3:
plx = []
while True:
start_index = text.find(start_str)
if start_index == -1:
break
end_index = text.find(end_str, start_index + len(start_str))
if end_index == -1:
break
middle_text = text[start_index + len(start_str):end_index]
plx.append(middle_text)
text = text.replace(start_str + middle_text + end_str, '')
if len(plx) > 0:
purl = ''
for i in range(len(plx)):
matches = re.findall(start_index1, plx[i])
output = ""
for match in matches:
match3 = re.search(r'(?:^|[^0-9])(\d+)(?:[^0-9]|$)', match[1])
if match3:
number = match3.group(1)
else:
number = 0
if 'http' not in match[0]:
output += f"#{match[1]}${number}{xurl}{match[0]}"
else:
output += f"#{match[1]}${number}{match[0]}"
output = output[1:]
purl = purl + output + "$$$"
purl = purl[:-3]
return purl
else:
return ""
else:
start_index = text.find(start_str)
if start_index == -1:
return ""
end_index = text.find(end_str, start_index + len(start_str))
if end_index == -1:
return ""
if pl == 0:
middle_text = text[start_index + len(start_str):end_index]
return middle_text.replace("\\", "")
if pl == 1:
middle_text = text[start_index + len(start_str):end_index]
matches = re.findall(start_index1, middle_text)
if matches:
jg = ' '.join(matches)
return jg
if pl == 2:
middle_text = text[start_index + len(start_str):end_index]
matches = re.findall(start_index1, middle_text)
if matches:
new_list = [f'{item}' for item in matches]
jg = '$$$'.join(new_list)
return jg
def homeContent(self, filter):
result = {}
result = {"class": [{"type_id": "", "type_name": "舞蹈"},
{"type_id": "音乐", "type_name": "音乐"},
{"type_id": "手游", "type_name": "手游"},
{"type_id": "网游", "type_name": "网游"},
{"type_id": "单机游戏", "type_name": "单机游戏"},
{"type_id": "虚拟主播", "type_name": "虚拟主播"},
{"type_id": "电台", "type_name": "电台"},
{"type_id": "体育", "type_name": "体育"},
{"type_id": "聊天", "type_name": "聊天"},
{"type_id": "娱乐", "type_name": "娱乐"},
{"type_id": "电影", "type_name": "影视"},
{"type_id": "新闻", "type_name": "新闻"}]
}
return result
def homeVideoContent(self):
pass
def categoryContent(self, cid, pg, filter, ext):
result = {}
videos = []
if pg:
page = int(pg)
else:
page = 1
url = f'{xurl}/live?keyword={cid}&page={str(page)}'
detail = requests.get(url=url, headers=headerx)
detail.encoding = "utf-8"
res = detail.text
doc = BeautifulSoup(res, "lxml")
soups = doc.find_all('div', class_="video-list-item")
for vod in soups:
names = vod.find('h3', class_="bili-live-card__info--tit")
name = names.text.strip().replace('直播中', '')
id = names.find('a')['href']
id = self.extract_middle_text(id, 'bilibili.com/', '?', 0)
pic = vod.find('img')['src']
if 'http' not in pic:
pic = "https:" + pic
remarks = vod.find('a', class_="bili-live-card__info--uname")
remark = remarks.text.strip()
video = {
"vod_id": id,
"vod_name": name,
"vod_pic": pic,
"vod_remarks": remark
}
videos.append(video)
result = {'list': videos}
result['page'] = pg
result['pagecount'] = 9999
result['limit'] = 90
result['total'] = 999999
return result
def detailContent(self, ids):
did = ids[0]
result = {}
videos = []
xianlu = ''
bofang = ''
url = f'{xurl1}/xlive/web-room/v2/index/getRoomPlayInfo?room_id={did}&platform=web&protocol=0,1&format=0,1,2&codec=0,1'
detail = requests.get(url=url, headers=headerx)
detail.encoding = "utf-8"
data = detail.json()
content = '欢迎观看哔哩直播'
setup = data['data']['playurl_info']['playurl']['stream']
nam = 0
for vod in setup:
try:
host = vod['format'][nam]['codec'][0]['url_info'][1]['host']
except (KeyError, IndexError):
continue
base = vod['format'][nam]['codec'][0]['base_url']
extra = vod['format'][nam]['codec'][0]['url_info'][1]['extra']
id = host + base + extra
nam = nam + 1
namc = f"{nam}号线路"
bofang = bofang + namc + '$' + id + '#'
bofang = bofang[:-1]
xianlu = '哔哩专线'
videos.append({
"vod_id": did,
"vod_content": content,
"vod_play_from": xianlu,
"vod_play_url": bofang
})
result['list'] = videos
return result
def playerContent(self, flag, id, vipFlags):
result = {}
result["parse"] = 0
result["playUrl"] = ''
result["url"] = id
result["header"] = headerx
return result
def searchContentPage(self, key, quick, pg):
result = {}
videos = []
if pg:
page = int(pg)
else:
page = 1
url = f'{xurl}/live?keyword={key}&page={str(page)}'
detail = requests.get(url=url, headers=headerx)
detail.encoding = "utf-8"
res = detail.text
doc = BeautifulSoup(res, "lxml")
soups = doc.find_all('div', class_="video-list-item")
for vod in soups:
names = vod.find('h3', class_="bili-live-card__info--tit")
name = names.text.strip().replace('直播中', '')
id = names.find('a')['href']
id = self.extract_middle_text(id, 'bilibili.com/', '?', 0)
pic = vod.find('img')['src']
if 'http' not in pic:
pic = "https:" + pic
remarks = vod.find('a', class_="bili-live-card__info--uname")
remark = remarks.text.strip()
video = {
"vod_id": id,
"vod_name": name,
"vod_pic": pic,
"vod_remarks": remark
}
videos.append(video)
result['list'] = videos
result['page'] = pg
result['pagecount'] = 9999
result['limit'] = 90
result['total'] = 999999
return result
def searchContent(self, key, quick, pg="1"):
return self.searchContentPage(key, quick, '1')
def localProxy(self, params):
if params['type'] == "m3u8":
return self.proxyM3u8(params)
elif params['type'] == "media":
return self.proxyMedia(params)
elif params['type'] == "ts":
return self.proxyTs(params)
return None
+1260
View File
@@ -0,0 +1,1260 @@
# -*- coding: utf-8 -*-
# by @星河
# 修复版本 - 参考最新三合一.js重构虎牙、斗鱼、B站直播逻辑
# 修复:虎牙清晰度选择,确保ratio参数正确传递码率值
# 修复:斗鱼切换分辨率只能播放1秒的问题(每次重新获取安全密钥和签名)
# 修复:B站使用特殊UA和WBI签名绕过-352风控 [^90^][^30^]
import json
import re
import sys
import time
import hashlib
import random
import urllib.parse
from base64 import b64decode, b64encode
from urllib.parse import parse_qs
import requests
from pyquery import PyQuery as pq
sys.path.append('..')
from base.spider import Spider
from concurrent.futures import ThreadPoolExecutor
class Spider(Spider):
def init(self, extend=""):
# 初始化B站WBI密钥
self.bili_wbi_keys = None
self.bili_wbi_expire = 0
pass
def getName(self):
return "直播"
def isVideoFormat(self, url):
pass
def manualVideoCheck(self):
pass
def destroy(self):
pass
headers = [
{
# 特殊UA绕过B站风控 [^90^]
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0"
},
{
"User-Agent": "Dart/3.4 (dart:io)"
}
]
excepturl = 'https://www.baidu.com'
hosts = {
"huya": ["https://www.huya.com", "https://mp.huya.com"],
"douyu": "https://www.douyu.com",
"wangyi": "https://cc.163.com",
"bili": ["https://api.live.bilibili.com", "https://api.bilibili.com"]
}
referers = {
"huya": "https://live.cdn.huya.com",
"douyu": "https://m.douyu.com",
"bili": "https://live.bilibili.com"
}
playheaders = {
"wangyi": {
"User-Agent": "ExoPlayer",
"Connection": "Keep-Alive",
"Icy-MetaData": "1"
},
"bili": {
'Accept': '*/*',
'Icy-MetaData': '1',
'referer': 'https://live.bilibili.com',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36'
},
'huya': {
'User-Agent': 'ExoPlayer',
'Connection': 'Keep-Alive',
'Icy-MetaData': '1'
},
'douyu': {
'User-Agent': 'libmpv',
'Icy-MetaData': '1'
}
}
# WBI签名相关常量 [^30^]
MIXIN_KEY_ENC_TAB = [
46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49,
33, 9, 42, 19, 29, 28, 14, 39, 12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40,
61, 26, 17, 0, 1, 60, 51, 30, 4, 22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11,
36, 20, 34, 44, 52
]
def _get_bili_wbi_keys(self):
"""获取B站WBI密钥 [^30^]"""
try:
# 检查缓存
if self.bili_wbi_keys and time.time() < self.bili_wbi_expire:
return self.bili_wbi_keys
# 从导航接口获取 - 使用特殊UA [^90^]
resp = self.fetch(
'https://api.bilibili.com/x/web-interface/nav',
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36',
'Referer': 'https://www.bilibili.com/'
}
).json()
if resp.get('code') != 0:
return None
img_url = resp['data']['wbi_img']['img_url']
sub_url = resp['data']['wbi_img']['sub_url']
# 提取文件名作为key
img_key = img_url.rsplit('/', 1)[1].split('.')[0]
sub_key = sub_url.rsplit('/', 1)[1].split('.')[0]
self.bili_wbi_keys = (img_key, sub_key)
self.bili_wbi_expire = time.time() + 86400 # 24小时过期
return self.bili_wbi_keys
except Exception as e:
print(f"获取B站WBI密钥失败: {e}")
return None
def _get_mixin_key(self, orig: str):
"""生成mixin_key [^30^]"""
return ''.join([orig[i] for i in self.MIXIN_KEY_ENC_TAB])[:32]
def _enc_wbi(self, params: dict):
"""WBI签名 [^30^]"""
keys = self._get_bili_wbi_keys()
if not keys:
return params
img_key, sub_key = keys
mixin_key = self._get_mixin_key(img_key + sub_key)
# 添加时间戳
params['wts'] = round(time.time())
# 排序参数
params = dict(sorted(params.items()))
# 过滤特殊字符
params = {
k: ''.join(filter(lambda c: c not in "!'()*", str(v)))
for k, v in params.items()
}
# 计算签名
query = urllib.parse.urlencode(params)
w_rid = hashlib.md5((query + mixin_key).encode()).hexdigest()
params['w_rid'] = w_rid
return params
def process_bili(self):
"""获取B站分类列表 - 使用WBI签名 [^30^]"""
try:
# 尝试获取分类列表 - 使用特殊UA和WBI签名
params = {'need_entrance': 1, 'parent_id': 0}
signed_params = self._enc_wbi(params)
data = self.fetch(
f'{self.hosts["bili"][0]}/room/v1/Area/getList',
params=signed_params,
headers=self.headers[0]
).json()
if data.get('code') == 0 and data.get('data'):
# 保存分类数据供后续使用
self.bili_areas = data['data']
return ('bili', [{'key': 'cate', 'name': '分类',
'value': [{'n': i['name'], 'v': str(i['id'])}
for i in data['data']]}])
return 'bili', None
except Exception as e:
print(f"bili处理错误: {e}")
# 使用默认分类
return 'bili', [{'key': 'cate', 'name': '分类',
'value': [{'n': '网游', 'v': '2'}, {'n': '手游', 'v': '3'},
{'n': '单机', 'v': '6'}, {'n': '娱乐', 'v': '1'},
{'n': '电台', 'v': '5'}, {'n': '虚拟主播', 'v': '9'},
{'n': '生活', 'v': '10'}, {'n': '知识', 'v': '11'},
{'n': '赛事', 'v': '13'}]}]
def process_douyu(self):
try:
self.dyufdata = self.fetch(
f'{self.referers["douyu"]}/api/cate/list',
headers=self.headers[1]
).json()
return ('douyu', [{'key': 'cate', 'name': '分类',
'value': [{'n': i['cate1Name'], 'v': str(i['cate1Id'])}
for i in self.dyufdata['data']['cate1Info']]}])
except Exception as e:
print(f"douyu错误: {e}")
return 'douyu', None
def homeContent(self, filter):
result = {}
cateManual = {
"虎牙": "huya",
"斗鱼": "douyu",
"网易": "wangyi",
"B站": "bili"
}
classes = []
filters = {
'huya': [{'key': 'cate', 'name': '分类',
'value': [{'n': '网游', 'v': '1'}, {'n': '单机', 'v': '2'},
{'n': '娱乐', 'v': '8'}, {'n': '手游', 'v': '3'}]}]
}
with ThreadPoolExecutor(max_workers=2) as executor:
futures = {
executor.submit(self.process_bili): 'bili',
executor.submit(self.process_douyu): 'douyu'
}
for future in futures:
platform, filter_data = future.result()
if filter_data:
filters[platform] = filter_data
for k in cateManual:
classes.append({
'type_name': k,
'type_id': cateManual[k]
})
result['class'] = classes
result['filters'] = filters
return result
def homeVideoContent(self):
pass
def categoryContent(self, tid, pg, filter, extend):
vdata = []
result = {}
pagecount = 9999
result['page'] = pg
result['limit'] = 90
result['total'] = 999999
if tid == 'wangyi':
vdata, pagecount = self.wyccContent(tid, pg, filter, extend, vdata)
elif 'bili' in tid:
vdata, pagecount = self.biliContent(tid, pg, filter, extend, vdata)
elif 'huya' in tid:
vdata, pagecount = self.huyaContent(tid, pg, filter, extend, vdata)
elif 'douyu' in tid:
vdata, pagecount = self.douyuContent(tid, pg, filter, extend, vdata)
result['list'] = vdata
result['pagecount'] = pagecount
return result
def wyccContent(self, tid, pg, filter, extend, vdata):
params = {
'format': 'json',
'start': (int(pg) - 1) * 20,
'size': '20',
}
response = self.fetch(f'{self.hosts[tid]}/api/category/live/', params=params, headers=self.headers[0]).json()
for i in response['lives']:
if i.get('cuteid'):
bvdata = self.buildvod(
vod_id=f"{tid}@@{i['cuteid']}",
vod_name=i.get('title'),
vod_pic=i.get('cover'),
vod_remarks=i.get('nickname'),
style={"type": "rect", "ratio": 1.33}
)
vdata.append(bvdata)
return vdata, 9999
def biliContent(self, tid, pg, filter, extend, vdata):
"""B站分类内容 - 使用WBI签名绕过风控 [^30^][^90^]"""
try:
# 分类列表 - 显示子分类
if extend.get('cate') and pg == '1' and 'click' not in tid:
# 从已保存的分类数据中找到对应分类的子分类
if hasattr(self, 'bili_areas'):
for area in self.bili_areas:
if str(area['id']) == extend['cate']:
for sub_area in area.get('list', []):
v = self.buildvod(
vod_id=f"click_{tid}@@{extend['cate']}@@{sub_area['id']}",
vod_name=sub_area.get('name'),
vod_pic=sub_area.get('pic'),
vod_tag=1,
style={"type": "oval", "ratio": 1}
)
vdata.append(v)
return vdata, 1
# 如果没有找到子分类,直接返回空,让用户进入房间列表
return vdata, 1
# 房间列表 - 使用getList接口并添加WBI签名 [^30^]
if 'click' in tid:
# 子分类房间
ids = tid.split('_')[1].split('@@')
tid = ids[0]
parent_area_id = ids[1]
area_id = ids[2]
else:
# 默认使用分类ID作为parent_area_idarea_id为0表示该分类下所有
parent_area_id = extend.get('cate', '2') # 默认网游
area_id = 0
# 构建请求参数并添加WBI签名 [^30^]
params = {
'parent_area_id': parent_area_id,
'area_id': area_id,
'page': pg,
'platform': 'web',
'sort_type': 'online' # 按热度排序
}
signed_params = self._enc_wbi(params)
# 调用getList接口
api_url = f'{self.hosts[tid][0]}/xlive/web-interface/v1/second/getList'
data = self.fetch(api_url, params=signed_params, headers=self.headers[0]).json()
# 如果WBI签名失败,尝试不带签名
if data.get('code') == -352:
print("WBI签名失败,尝试无签名请求...")
params = {
'parent_area_id': parent_area_id,
'area_id': area_id,
'page': pg,
'platform': 'web',
'sort_type': 'online'
}
data = self.fetch(api_url, params=params, headers=self.headers[0]).json()
if data.get('code') == 0:
room_list = data.get('data', {}).get('list', [])
for room in room_list:
if room.get('roomid'):
# 处理在线人数显示
online = room.get('online', 0)
if online > 10000:
online_str = f"{online / 10000:.1f}"
else:
online_str = str(online)
v = self.buildvod(
f"{tid}@@{room['roomid']}",
room.get('title', '未知标题'),
room.get('cover') or room.get('system_cover'),
f"{online_str}",
0,
room.get('uname', ''),
style={"type": "rect", "ratio": 1.33}
)
vdata.append(v)
# 检查是否有更多数据
has_more = data.get('data', {}).get('has_more', 0)
if not has_more:
pagecount = int(pg)
else:
pagecount = 9999
else:
print(f"B站API返回错误: {data.get('message', '未知错误')} (code: {data.get('code')})")
pagecount = 1
return vdata, pagecount
except Exception as e:
print(f"B站内容获取错误: {e}")
return vdata, 1
def huyaContent(self, tid, pg, filter, extend, vdata):
if extend.get('cate') and pg == '1' and 'click' not in tid:
id = extend.get('cate')
data = self.fetch(f'{self.referers[tid]}/liveconfig/game/bussLive?bussType={id}',
headers=self.headers[1]).json()
for i in data['data']:
v = self.buildvod(
vod_id=f"click_{tid}@@{int(i['gid'])}",
vod_name=i.get('gameFullName'),
vod_pic=f'https://huyaimg.msstatic.com/cdnimage/game/{int(i["gid"])}-MS.jpg',
vod_tag=1,
style={"type": "oval", "ratio": 1}
)
vdata.append(v)
return vdata, 1
else:
gid = ''
if 'click' in tid:
ids = tid.split('_')[1].split('@@')
tid = ids[0]
gid = f'&gameId={ids[1]}'
data = self.fetch(f'{self.hosts[tid][0]}/cache.php?m=LiveList&do=getLiveListByPage&tagAll=0{gid}&page={pg}',
headers=self.headers[1]).json()
for i in data['data']['datas']:
if i.get('profileRoom'):
v = self.buildvod(
f"{tid}@@{i['profileRoom']}",
i.get('introduction'),
i.get('screenshot'),
str(int(i.get('totalCount', '1')) / 10000) + '',
0,
i.get('nick'),
style={"type": "rect", "ratio": 1.33}
)
vdata.append(v)
return vdata, 9999
def douyuContent(self, tid, pg, filter, extend, vdata):
if extend.get('cate') and pg == '1' and 'click' not in tid:
for i in self.dyufdata['data']['cate2Info']:
if str(i['cate1Id']) == extend['cate']:
v = self.buildvod(
vod_id=f"click_{tid}@@{i['cate2Id']}",
vod_name=i.get('cate2Name'),
vod_pic=i.get('icon'),
vod_remarks=i.get('count'),
vod_tag=1,
style={"type": "oval", "ratio": 1}
)
vdata.append(v)
return vdata, 1
else:
path = f'/japi/weblist/apinc/allpage/6/{pg}'
if 'click' in tid:
ids = tid.split('_')[1].split('@@')
tid = ids[0]
path = f'/gapi/rkc/directory/mixList/2_{ids[1]}/{pg}'
url = f'{self.hosts[tid]}{path}'
data = self.fetch(url, headers=self.headers[1]).json()
for i in data['data']['rl']:
v = self.buildvod(
vod_id=f"{tid}@@{i['rid']}",
vod_name=i.get('rn'),
vod_pic=i.get('rs16'),
vod_year=str(int(i.get('ol', 1)) / 10000) + '',
vod_remarks=i.get('nn'),
style={"type": "rect", "ratio": 1.33}
)
vdata.append(v)
return vdata, 9999
def detailContent(self, ids):
ids = ids[0].split('@@')
if ids[0] == 'wangyi':
vod = self.wyccDetail(ids)
elif ids[0] == 'bili':
vod = self.biliDetail(ids)
elif ids[0] == 'huya':
vod = self.huyaDetail(ids)
elif ids[0] == 'douyu':
vod = self.douyuDetail(ids)
return {'list': [vod]}
def wyccDetail(self, ids):
try:
vdata = self.getpq(f'{self.hosts[ids[0]]}/{ids[1]}', self.headers[0])('script').eq(-1).text()
def get_quality_name(vbr):
if vbr <= 600:
return "标清"
elif vbr <= 1000:
return "高清"
elif vbr <= 2000:
return "超清"
else:
return "蓝光"
data = json.loads(vdata)['props']['pageProps']['roomInfoInitData']
name = data['live'].get('title', ids[0])
vod = self.buildvod(vod_name=data.get('keywords_suffix'), vod_remarks=data['live'].get('title'),
vod_content=data.get('description_suffix'))
resolution_data = data['live']['quickplay']['resolution']
all_streams = {}
sorted_qualities = sorted(resolution_data.items(),
key=lambda x: x[1]['vbr'],
reverse=True)
for quality, data in sorted_qualities:
vbr = data['vbr']
quality_name = get_quality_name(vbr)
for cdn_name, url in data['cdn'].items():
if cdn_name not in all_streams and type(url) == str and url.startswith('http'):
all_streams[cdn_name] = []
if isinstance(url, str) and url.startswith('http'):
all_streams[cdn_name].extend([quality_name, url])
plists = []
names = []
for i, (cdn_name, stream_list) in enumerate(all_streams.items(), 1):
names.append(f'线路{i}')
pstr = f"{name}${ids[0]}@@{self.e64(json.dumps(stream_list))}"
plists.append(pstr)
vod['vod_play_from'] = "$$$".join(names)
vod['vod_play_url'] = "$$$".join(plists)
return vod
except Exception as e:
return self.handle_exception(e)
def biliDetail(self, ids):
"""
B站直播详情 - 使用playUrl接口获取多清晰度
"""
try:
room_id = ids[1]
# 获取房间信息
info_res = self.fetch(
f'{self.hosts["bili"][0]}/room/v1/Room/get_info?room_id={room_id}',
headers=self.headers[0]
).json()
if info_res.get('code') != 0:
return self.handle_exception(Exception("获取房间信息失败"))
room_info = info_res['data']
title = room_info.get('title', 'B站直播')
vod = self.buildvod(
vod_name=title,
type_name=f"{room_info.get('parent_area_name', '')}/{room_info.get('area_name', '')}",
vod_director=room_info.get('uname', ''),
vod_remarks=f"在线{room_info.get('online', 0)}"
)
# 获取播放地址信息
play_res = self.fetch(
f'{self.hosts["bili"][0]}/room/v1/Room/playUrl?cid={room_id}&qn=10000&platform=web',
headers={
**self.headers[0],
'Referer': 'https://live.bilibili.com/',
'Origin': 'https://live.bilibili.com'
}
).json()
if play_res.get('code') != 0:
return self.handle_exception(Exception("获取播放地址失败"))
play_data = play_res['data']
accept_quality = play_data.get('accept_quality', ['10000', '400', '250', '150'])
quality_desc = {item['qn']: item['desc'] for item in play_data.get('quality_description', [])}
# 构建清晰度列表
qualities = []
for qn in sorted([int(q) for q in accept_quality], reverse=True):
desc = quality_desc.get(qn, f'清晰度{qn}')
qualities.append(f"{desc}$bili@@{room_id}@@{qn}")
vod['vod_play_from'] = 'B站直播'
vod['vod_play_url'] = '#'.join(qualities)
return vod
except Exception as e:
print(f"B站详情错误: {e}")
return self.handle_exception(e)
def huyaDetail(self, ids):
"""
虎牙播放详情 - 参考最新三合一.js重构
支持多线路多清晰度选择
核心算法:通过房间信息API获取uid、streamName和rateArray,为每个清晰度生成签名URL
清晰度说明:
- 蓝光8M/6M/4M/10M = 8000/6000/4000/10000 kbps = 1080P+
- 蓝光 = 3000 kbps = 1080P
- 超清 = 2000 kbps = 1080P (官方标准)
- 高清 = 1200 kbps = 720P
- 标清/流畅 = 500-800 kbps = 480P/540P
"""
try:
room_id = ids[1]
# 1. 获取房间信息
api_url = f'{self.hosts[ids[0]][1]}/cache.php?m=Live&do=profileRoom&roomid={room_id}'
res = self.fetch(api_url, headers=self.headers[0])
if res.status_code != 200:
return self.handle_exception(Exception(f"API请求失败: {res.status_code}"))
data = res.json()
if not data or not data.get('data'):
return self.handle_exception(Exception("房间数据为空"))
room_data = data['data']
# 2. 提取关键信息
uid = room_data.get('profileInfo', {}).get('uid')
stream_info = room_data.get('stream', {})
live_data = room_data.get('liveData', {})
if not uid:
return self.handle_exception(Exception("缺少uid"))
# 3. 获取streamName和码率信息
base_stream_list = stream_info.get('baseSteamInfoList', [])
if not base_stream_list:
return self.handle_exception(Exception("无直播流信息"))
# 获取第一个CDN的streamName作为基准
base_stream = base_stream_list[0]
stream_name = base_stream.get('sStreamName')
if not stream_name:
return self.handle_exception(Exception("无法获取streamName"))
# 4. 构建VOD对象
vod = self.buildvod(
vod_name=live_data.get('introduction', '虎牙直播'),
type_name=live_data.get('gameFullName', ''),
vod_director=live_data.get('nick', ''),
vod_remarks=live_data.get('contentIntro', ''),
)
# 5. 获取所有CDN线路
cdn_list = []
for stream in base_stream_list:
cdn_type = stream.get('sCdnType', 'AL')
flv_url = stream.get('sFlvUrl', '')
hls_url = stream.get('sHlsUrl', '')
stream_name_cdn = stream.get('sStreamName', stream_name)
if flv_url:
cdn_list.append({
'cdn': cdn_type,
'flv_base': flv_url,
'hls_base': hls_url,
'stream_name': stream_name_cdn,
'priority': stream.get('iWebPriorityRate', 0)
})
# 按优先级排序
cdn_list.sort(key=lambda x: x['priority'], reverse=True)
# 6. 获取清晰度列表 (rateArray)
rate_array = stream_info.get('rateArray', [])
# 如果没有rateArray,尝试从vMultiStreamInfo获取
if not rate_array and 'vMultiStreamInfo' in room_data:
rate_array = room_data['vMultiStreamInfo']
# 如果仍然没有,使用默认清晰度(按虎牙官方标准)
if not rate_array:
rate_array = [
{'sDisplayName': '蓝光4M', 'iBitRate': 4000},
{'sDisplayName': '蓝光', 'iBitRate': 3000},
{'sDisplayName': '超清', 'iBitRate': 2000}, # 2000kbps = 1080P
{'sDisplayName': '高清', 'iBitRate': 1200}, # 1200kbps = 720P
{'sDisplayName': '流畅', 'iBitRate': 500}
]
# 过滤和排序清晰度
# 虎牙的rateArray中,iBitRate就是码率值,sDisplayName是显示名称
# 需要确保:超清=2000kbps(1080P),高清=1200kbps(720P)
filtered_rates = []
seen_bitrates = set()
for rate in rate_array:
bit_rate = rate.get('iBitRate', 0)
name = rate.get('sDisplayName', '')
# 跳过重复的码率
if bit_rate in seen_bitrates:
continue
# 修正清晰度名称,确保符合虎牙标准
# 2000kbps应该是超清(1080P),不是高清
if bit_rate == 2000 and ('高清' in name or '720' in name):
name = '超清' # 强制修正为超清
elif bit_rate == 1200 and ('标清' in name or '480' in name):
name = '高清' # 1200kbps对应高清
elif bit_rate == 2000 and name == '原画':
name = '超清' # 修正原画为超清
seen_bitrates.add(bit_rate)
filtered_rates.append({
'sDisplayName': name,
'iBitRate': bit_rate
})
# 按码率从高到低排序
sorted_rates = sorted(filtered_rates, key=lambda x: x['iBitRate'], reverse=True)
# 7. 为每个CDN生成各清晰度的播放URL
play_lines = []
line_names = []
for cdn_idx, cdn in enumerate(cdn_list[:3]): # 最多取3个CDN
cdn_name = cdn['cdn']
line_names.append(f"线路{cdn_idx + 1}({cdn_name})")
qualities = []
for rate in sorted_rates:
quality_name = rate['sDisplayName']
bit_rate = rate['iBitRate']
# 生成该清晰度的URL
quality_url = self._generate_huya_play_url(
cdn, uid, stream_name, bit_rate
)
qualities.extend([quality_name, quality_url])
# 编码该线路的所有清晰度
encoded_qualities = self.e64(json.dumps(qualities))
play_lines.append(f"{live_data.get('introduction', '直播')}${ids[0]}@@{encoded_qualities}")
# 8. 构建播放数据
vod['vod_play_from'] = "$$$".join(line_names)
vod['vod_play_url'] = "$$$".join(play_lines)
return vod
except Exception as e:
return self.handle_exception(e)
def _generate_huya_play_url(self, cdn, uid, stream_name, bit_rate):
"""
生成虎牙播放URL,参考最新三合一.js算法
关键:ratio参数必须正确设置为iBitRate值(如2000、4000等)
"""
# 基础URL构建
flv_base = cdn['flv_base']
stream = cdn['stream_name']
# 生成时间戳和签名参数
timestamp = int(time.time())
seqid = f"{uid}{timestamp}"
ss = hashlib.md5(f"{seqid}|huya_adr|102".encode()).hexdigest()
ws_time = hex(timestamp + 21600)[2:] # 16进制,有效期6小时
# 计算wsSecret
ws_secret = hashlib.md5(
f"DWq8BcJ3h6DJt6TY_{uid}_{stream_name}_{ss}_{ws_time}".encode()
).hexdigest()
# 构建基础URL
base_url = f"{flv_base}/{stream}.flv"
# 关键修复:ratio参数直接使用iBitRate值
# 超清=2000,高清=1200,蓝光=3000/4000/6000/8000
if bit_rate > 0:
ratio_param = f"ratio={bit_rate}"
else:
# 原画/0码率时,使用默认2000或从URL推断
ratio_param = "ratio=2000"
# 构建完整URL
play_url = (
f"{base_url}?{ratio_param}&wsSecret={ws_secret}&wsTime={ws_time}"
f"&ctype=huya_adr&seqid={seqid}&uid={uid}"
f"&fs=bgct&ver=1&t=102"
)
return play_url
def douyuDetail(self, ids):
"""
斗鱼播放详情 - 参考最新三合一.js重构
核心算法:设备ID生成 -> 获取加密密钥 -> 计算签名 -> 获取播放地址
修复:切换分辨率只能播放1秒的问题
方案:存储房间号和码率信息,在playerContent中实时获取对应码率的URL
"""
try:
channel = ids[1]
headers = self.gethr(0, zr=f'{self.hosts[ids[0]]}/{channel}')
# 1. 初始化会话和设备ID (参考JS中的initialize和setupDeviceId)
session = {}
# 请求首页获取Cookie
try:
home_res = self.fetch(f'{self.hosts[ids[0]]}/{channel}', headers=headers)
if home_res.headers.get('Set-Cookie'):
cookie_str = home_res.headers.get('Set-Cookie')
# 解析dy_did
did_match = re.search(r'dy_did=([a-f0-9]{32})', cookie_str)
if did_match:
device_id = did_match.group(1)
else:
device_id = self._generate_random_hex(32)
else:
device_id = self._generate_random_hex(32)
except:
device_id = self._generate_random_hex(32)
session['dy_did'] = device_id
session['mantine-color-scheme-value'] = 'light'
# 2. 获取房间基本信息
betard_res = self.fetch(f'{self.hosts[ids[0]]}/betard/{channel}', headers=headers).json()
if not betard_res or not betard_res.get('room'):
return self.handle_exception(Exception("获取房间信息失败"))
room_info = betard_res['room']
vname = room_info.get('room_name', '斗鱼直播')
vod = self.buildvod(
vod_name=vname,
vod_remarks=room_info.get('second_lvl_name', ''),
vod_director=room_info.get('nickname', ''),
)
# 3. 获取安全密钥 (参考JS中的getSecurityKey)
sec_url = f"{self.hosts[ids[0]]}/wgapi/livenc/liveweb/websec/getEncryption?did={device_id}"
sec_res = self.fetch(sec_url, headers=headers).json()
if not sec_res or sec_res.get('error') != 0:
return self.handle_exception(Exception("获取加密密钥失败"))
security_data = sec_res['data']
secret_key = security_data.get('key')
random_str = security_data.get('rand_str')
enc_time = security_data.get('enc_time', 1)
enc_data = security_data.get('enc_data')
# 4. 计算签名 (参考JS中的computeSignature)
current_time = int(time.time())
# 迭代计算MD5
current = random_str
for _ in range(enc_time):
current = hashlib.md5(f"{current}{secret_key}".encode()).hexdigest()
signature = hashlib.md5(f"{current}{secret_key}{channel}{current_time}".encode()).hexdigest()
# 5. 请求播放地址 (参考JS中的requestStreamData)
play_payload = {
'enc_data': enc_data,
'tt': str(current_time),
'did': device_id,
'auth': signature,
'cdn': '',
'rate': '',
'hevc': '0',
'fa': '0',
'ive': '0'
}
play_api = f"{self.hosts[ids[0]]}/lapi/live/getH5PlayV1/{channel}"
# 构建请求头带Cookie
play_headers = headers.copy()
cookie_str = '; '.join([f"{k}={v}" for k, v in session.items()])
play_headers['Cookie'] = cookie_str
play_headers['Content-Type'] = 'application/x-www-form-urlencoded'
play_res = requests.post(play_api, data=play_payload, headers=play_headers, timeout=10).json()
if not play_res or play_res.get('error') != 0:
# 尝试旧版API
play_res = self._try_legacy_douyu_api(channel, device_id, signature, current_time, play_headers)
if not play_res:
return self.handle_exception(Exception("获取播放地址失败"))
stream_info = play_res.get('data', {})
# 6. 检查并更新设备ID (参考JS中的checkAndUpdateDeviceId)
rtmp_live = stream_info.get('rtmp_live', '')
if rtmp_live:
did_match = re.search(r'did=([a-f0-9]{32})', rtmp_live)
if did_match and did_match.group(1) != device_id:
device_id = did_match.group(1)
session['dy_did'] = device_id
# 重新请求
play_payload['did'] = device_id
play_res = requests.post(play_api, data=play_payload, headers=play_headers, timeout=10).json()
if play_res and play_res.get('error') == 0:
stream_info = play_res.get('data', {})
# 7. 提取播放URL和多码率信息
stream_url = None
if stream_info.get('rtmp_url') and stream_info.get('rtmp_live'):
stream_url = f"{stream_info['rtmp_url']}/{stream_info['rtmp_live']}"
elif stream_info.get('hls_url'):
stream_url = stream_info['hls_url']
if not stream_url:
return self.handle_exception(Exception("无法获取播放地址"))
# 8. 构建多码率选项
multirates = stream_info.get('multirates', [])
# 关键修复:存储房间号和码率信息,而不是直接存储URL
# 这样在切换清晰度时可以重新获取对应码率的签名URL
qualities = []
if multirates:
# 按码率排序
sorted_rates = sorted(multirates, key=lambda x: x.get('bit', 0), reverse=True)
for rate in sorted_rates:
bit_rate = rate.get('rate', -1)
name = rate.get('name', f"{bit_rate}P")
# 存储格式:码率值,用于playerContent中重新获取URL
# 使用特殊标记#来区分这是码率值而不是URL
qualities.extend([name, f"#{bit_rate}"])
else:
# 只有原画
qualities = ['原画', '#-1']
# 同时存储房间号和设备信息,用于重新获取URL
# 格式:房间号|设备ID|签名信息(base64编码)
session_info = {
'channel': channel,
'device_id': device_id,
'secret_key': secret_key,
'random_str': random_str,
'enc_time': enc_time,
'enc_data': enc_data
}
encoded_session = self.e64(json.dumps(session_info))
# 9. 构建播放数据
# vod_play_url格式:房间名$平台@@base64(清晰度列表)@@base64(会话信息)
encoded_qualities = self.e64(json.dumps(qualities))
vod['vod_play_from'] = '斗鱼直播'
vod['vod_play_url'] = f"{vname}${ids[0]}@@{encoded_qualities}@@{encoded_session}"
return vod
except Exception as e:
return self.handle_exception(e)
def _generate_random_hex(self, length):
"""生成随机十六进制字符串"""
hex_chars = '0123456789abcdef'
return ''.join(random.choice(hex_chars) for _ in range(length))
def _try_legacy_douyu_api(self, channel, device_id, signature, timestamp, headers):
"""尝试使用旧版API获取播放地址"""
try:
legacy_payload = {
'did': device_id,
'tt': str(timestamp),
'sign': signature,
'cdn': '',
'rate': '-1',
'ver': 'Douyu_223061205',
'iar': '1',
'ive': '1',
'hevc': '0',
'fa': '0'
}
legacy_api = f"https://www.douyu.com/lapi/live/getH5Play/{channel}"
res = requests.post(legacy_api, data=legacy_payload, headers=headers, timeout=10)
return res.json() if res.status_code == 200 else None
except:
return None
def _get_douyu_play_url(self, channel, device_id, secret_key, random_str, enc_time, enc_data, rate):
"""
获取斗鱼指定码率的播放URL(带签名)
用于切换清晰度时重新获取URL
"""
try:
current_time = int(time.time())
# 重新计算签名
current = random_str
for _ in range(enc_time):
current = hashlib.md5(f"{current}{secret_key}".encode()).hexdigest()
signature = hashlib.md5(f"{current}{secret_key}{channel}{current_time}".encode()).hexdigest()
# 构建请求
play_payload = {
'enc_data': enc_data,
'tt': str(current_time),
'did': device_id,
'auth': signature,
'cdn': '',
'rate': str(rate) if rate > 0 else '',
'hevc': '0',
'fa': '0',
'ive': '0'
}
play_api = f"https://www.douyu.com/lapi/live/getH5PlayV1/{channel}"
headers = {
'User-Agent': self.headers[0]['User-Agent'],
'Referer': f'https://www.douyu.com/{channel}',
'Origin': 'https://www.douyu.com',
'Cookie': f'dy_did={device_id}; mantine-color-scheme-value=light',
'Content-Type': 'application/x-www-form-urlencoded'
}
play_res = requests.post(play_api, data=play_payload, headers=headers, timeout=10).json()
if not play_res or play_res.get('error') != 0:
# 尝试旧版API
return self._get_douyu_play_url_legacy(channel, device_id, signature, current_time, rate)
stream_info = play_res.get('data', {})
# 检查设备ID是否匹配
if stream_info.get('rtmp_live'):
did_match = re.search(r'did=([a-f0-9]{32})', stream_info['rtmp_live'])
if did_match and did_match.group(1) != device_id:
# 设备ID不匹配,使用新设备ID重新获取
return self._get_douyu_play_url(channel, did_match.group(1), secret_key, random_str, enc_time, enc_data, rate)
if stream_info.get('rtmp_url') and stream_info.get('rtmp_live'):
return f"{stream_info['rtmp_url']}/{stream_info['rtmp_live']}"
elif stream_info.get('hls_url'):
return stream_info['hls_url']
return None
except Exception as e:
print(f"获取斗鱼播放URL失败: {e}")
return None
def _get_douyu_play_url_legacy(self, channel, device_id, signature, timestamp, rate):
"""使用旧版API获取斗鱼播放URL"""
try:
legacy_payload = {
'did': device_id,
'tt': str(timestamp),
'sign': signature,
'cdn': '',
'rate': str(rate) if rate > 0 else '-1',
'ver': 'Douyu_223061205',
'iar': '1',
'ive': '1',
'hevc': '0',
'fa': '0'
}
legacy_api = f"https://www.douyu.com/lapi/live/getH5Play/{channel}"
headers = {
'User-Agent': self.headers[0]['User-Agent'],
'Referer': f'https://www.douyu.com/{channel}',
'Cookie': f'dy_did={device_id}',
'Content-Type': 'application/x-www-form-urlencoded'
}
res = requests.post(legacy_api, data=legacy_payload, headers=headers, timeout=10)
if res.status_code == 200:
data = res.json()
if data.get('error') == 0:
stream_info = data.get('data', {})
if stream_info.get('rtmp_url') and stream_info.get('rtmp_live'):
return f"{stream_info['rtmp_url']}/{stream_info['rtmp_live']}"
return None
except:
return None
def searchContent(self, key, quick, pg="1"):
pass
def playerContent(self, flag, id, vipFlags):
try:
ids = id.split('@@')
p = 1
if ids[0] in ['wangyi']:
p, url = 0, json.loads(self.d64(ids[1]))
elif ids[0] == 'bili':
p, url = self.biliplay(ids)
elif ids[0] == 'huya':
p, url = self.huyaplay(ids)
elif ids[0] == 'douyu':
p, url = self.douyuplay(ids)
return {'parse': p, 'url': url, 'header': self.playheaders[ids[0]]}
except Exception as e:
return {'parse': 1, 'url': self.excepturl, 'header': self.headers[0]}
def biliplay(self, ids):
"""
B站播放解析 - 使用playUrl接口获取指定清晰度直播流
ids: [平台, 房间号, 清晰度qn]
支持多线路返回
"""
try:
room_id = ids[1]
qn = ids[2] if len(ids) > 2 else '10000'
# 使用playUrl接口获取直播流
play_url = f'{self.hosts["bili"][0]}/room/v1/Room/playUrl?cid={room_id}&qn={qn}&platform=web'
data = self.fetch(play_url, headers={
**self.headers[0],
'Referer': 'https://live.bilibili.com/',
'Origin': 'https://live.bilibili.com'
}).json()
if data.get('code') != 0:
return 1, self.excepturl
play_data = data['data']
durl_list = play_data.get('durl', [])
if not durl_list:
return 1, self.excepturl
# 构建多线路结果 [线路1, URL1, 线路2, URL2, ...]
urls = []
for idx, item in enumerate(durl_list, 1):
url = item.get('url')
if url:
urls.extend([f'线路{idx}', url])
# 如果只有一条线路,直接返回URL
if len(urls) == 2:
return 0, urls[1] # 直接返回URL字符串
return 0, urls
except Exception as e:
print(f"B站播放错误: {e}")
return 1, self.excepturl
def huyaplay(self, ids):
"""
虎牙播放解析 - 返回所有清晰度选项供用户选择
ids[1] 格式: base64编码的 [清晰度名称1, URL1, 清晰度名称2, URL2, ...]
"""
try:
# ids[1] 是编码后的播放地址列表 [名称1, URL1, 名称2, URL2, ...]
decoded = json.loads(self.d64(ids[1]))
# decoded 是一个列表,奇数索引是名称,偶数索引是URL
return 0, decoded
except Exception as e:
print(f"虎牙播放解析错误: {e}")
return 1, self.excepturl
def douyuplay(self, ids):
"""
斗鱼播放解析 - 实时获取对应码率的播放URL
ids格式: [平台, base64(清晰度列表), base64(会话信息)]
清晰度列表: [名称1, #码率1, 名称2, #码率2, ...]
#表示这是码率值,需要重新获取URL
"""
try:
if len(ids) < 3:
# 兼容旧格式
decoded = json.loads(self.d64(ids[1]))
return 0, decoded
# 解析清晰度列表和会话信息
qualities = json.loads(self.d64(ids[1]))
session_info = json.loads(self.d64(ids[2]))
channel = session_info['channel']
device_id = session_info['device_id']
secret_key = session_info['secret_key']
random_str = session_info['random_str']
enc_time = session_info['enc_time']
enc_data = session_info['enc_data']
# 为每个清晰度实时获取播放URL
result = []
for i in range(0, len(qualities), 2):
name = qualities[i]
rate_marker = qualities[i + 1]
# 解析码率值(去掉#前缀)
if rate_marker.startswith('#'):
rate = int(rate_marker[1:])
else:
rate = -1
# 实时获取对应码率的URL
play_url = self._get_douyu_play_url(
channel, device_id, secret_key, random_str,
enc_time, enc_data, rate
)
if play_url:
result.extend([name, play_url])
if not result:
return 1, self.excepturl
return 0, result
except Exception as e:
print(f"斗鱼播放解析错误: {e}")
return 1, self.excepturl
def localProxy(self, param):
pass
def e64(self, text):
try:
text_bytes = text.encode('utf-8')
encoded_bytes = b64encode(text_bytes)
return encoded_bytes.decode('utf-8')
except Exception as e:
print(f"Base64编码错误: {str(e)}")
return ""
def d64(self, encoded_text):
try:
encoded_bytes = encoded_text.encode('utf-8')
decoded_bytes = b64decode(encoded_bytes)
return decoded_bytes.decode('utf-8')
except Exception as e:
print(f"Base64解码错误: {str(e)}")
return ""
def josn_to_params(self, params, skip_empty=False):
query = []
for k, v in params.items():
if skip_empty and not v:
continue
query.append(f"{k}={v}")
return "&".join(query)
def params_to_json(self, query_string):
parsed_data = parse_qs(query_string)
result = {key: value[0] for key, value in parsed_data.items()}
return result
def buildvod(self, vod_id='', vod_name='', vod_pic='', vod_year='', vod_tag='', vod_remarks='', style='',
type_name='', vod_area='', vod_actor='', vod_director='',
vod_content='', vod_play_from='', vod_play_url=''):
vod = {
'vod_id': vod_id,
'vod_name': vod_name,
'vod_pic': vod_pic,
'vod_year': vod_year,
'vod_tag': 'folder' if vod_tag else '',
'vod_remarks': vod_remarks,
'style': style,
'type_name': type_name,
'vod_area': vod_area,
'vod_actor': vod_actor,
'vod_director': vod_director,
'vod_content': vod_content,
'vod_play_from': vod_play_from,
'vod_play_url': vod_play_url
}
vod = {key: value for key, value in vod.items() if value}
return vod
def getpq(self, url, headers=None, cookies=None):
data = self.fetch(url, headers=headers, cookies=cookies).text
try:
return pq(data)
except Exception as e:
print(f"解析页面错误: {str(e)}")
return pq(data.encode('utf-8'))
def gethr(self, index, rf='', zr=''):
headers = self.headers[index]
if zr:
headers['referer'] = zr
else:
headers['referer'] = f"{self.referers[rf]}/"
return headers
def handle_exception(self, e):
print(f"报错: {str(e)}")
return {'vod_play_from': '哎呀翻车啦', 'vod_play_url': f'翻车啦${self.excepturl}'}