纯Python活动页TAF服务端验证登录态: webActUI WS通道 + 金样本对拍

- tools/huya_activity_verify.py: 认证帧+getActUserTaskDetail两帧即验证
  (200请求成功+6任务项=已登录; 无cookie对照905=未登录)
- 信封格式定论: L2=len(value), L1=L2+14, 身份一致性要求, actId尾字段=11 62 2f
- HTTP cdnws端点被volc-dcdn封锁非浏览器TLS, WS wsapi可纯Python直连
- evidence: 金样本(逐字节)+ 浏览器当前会话帧 + 验证结果
This commit is contained in:
yml2213
2026-08-26 02:35:42 +08:00
parent 97e6d14139
commit 8efd3b8d02
10 changed files with 449 additions and 0 deletions
+52
View File
@@ -406,3 +406,55 @@ X2(换uid+换cred+复用旧nonce)→40020 的真正原因:
- tools/nonce_forge.py: 本地nonce生成器(XXTEA+MD5, 自检对设备实采)
- scripts/probe_nonce_bind.py: 本地nonce bind验证脚本(同/跨账号)
- evidence/nonce_k1.json: k1设备常量证据
---
## 附录: 网页 cookie 登录态的服务端验证 (活动页 webActUI TAF, 2026-08-26 深夜新增)
### 目标
纯 Python 直连活动页 TAF 接口, 确认"注入/复刻的网页 cookie"在服务端是**已登录**状态,
而不只是浏览器页面自说自话(document.cookie/localStorage 可伪造)。
### 两条通道与结论
| 通道 | 结果 |
|---|---|
| HTTP POST `cdnws.api.huya.com/?baseinfo=<b64>&timestamp=<ms>` | ❌ **volc-dcdn CDN 封锁非浏览器 TLS**: requests/curl/curl_cffi(chrome131等) 全部超时或 502, 仅真实浏览器可过 |
| WebSocket `wss://wsapi.huya.com/?baseinfo=<b64>` | ✅ **纯 Python(websocket-client) 可直连**, 本验证走此通道 |
### webActUI TAF 信封格式 (逐字节逆向, 与仓库 _Writer JCE 编码一致)
```
[4B len] 10 03 2c 3c 40 <reqid> 56 08 <service> 66 <len> <func> 7d
00 01 <L1 2B> 08 00 01 06 04 tReq 1d 00 01 <L2 2B> <value>
8c 98 0c a8 0c [2c 36 <len> <trace> 4c 5c 66 00]
value = JCE: 0a 0a t0 uid(INT64大端) t1"" t2"" t3 UA t4 cookie(STR4) t5 ZERO t6"" 0b <func尾> 0b
L2 = len(value); L1 = L2 + 14 (两样本一致)
baseinfo(URL参数,b64) = JCE: t0 uid t1"" t2 UA t3 "HUYA&ZH&2052" t4..t7 空 t8 cookie(STR4) t9 trace t10 空MAP
认证帧(WS, 裸JCE无信封) = t0 uid t1 UA t2 cookie(STR4) t3"" t4 1 t5 "HUYA&ZH&2052" t2..t6 空尾
WS帧包装 = 00 03 1d 00 01 [2B len][4B len] + 信封(去4B前缀), len = inner - (12+svc+func)
```
- getActUserTaskDetail 的 func 尾 = `11 62 2f` = JCE **t1/INT16 标签+actId**(0x622F=25135, 活动"精英宝典福利季Q3"的 actId, 与 getActInfo 响应一致)。
- HTTP 响应体 = **base64(TAF信封)**; WS 响应 = 包装头 + 信封。
### 三个致命坑 (全部实测定位)
1. **身份一致性**: baseinfo / 认证帧 / task 帧的 uid+cookie 必须**全部同一账号**,
否则服务端回 `wup request biz execption:-1`(tars iErrorCode 5000, status 255)。
早先失败原因 = 预热帧是旧账号捕获, task 帧是新账号 → 身份冲突。
2. **actId 尾字段**: `11 62 2f` 是 3 字节(标签1字节+INT16值2字节), 只发 `62 2f` 会被服务端解析失败(-1)。
3. **最小序列**: 只需【认证帧 + getActUserTaskDetail 两帧】; launch/getConfig/等非必需。
无 cookie 对照 → 905(未登录), 带 cookie → 200 请求成功 + 6 任务项(服务端确认)。
### 验证结果 (2026-08-26 02:31, 新账号 hy_300026595 / uid 1199666913640)
```
[self_check] 通过: baseinfo/body/auth 与捕获金样本逐字节一致
[A] 带 cookie: 249B status=200 msg=请求成功 任务项=6 => ✅ 服务端确认已登录
[B] 无 cookie: 96B status=905 => ❌ 未登录 (对照成立)
```
结论: 纯Python产出的网页 cookie 在活动服务端确认为**已登录**, 无需浏览器。
### 资产
- tools/huya_activity_verify.py: 纯Python WS 验证工具 (自检金样本 + A/B 对照)
- evidence/activity_taf_golden.json: baseinfo/body/auth 金样本(逐字节)
- evidence/ws_warmup_frames.json: 8.26 浏览器预热帧(旧会话, 参考)
- evidence/ws_current_session_frames.json: 浏览器当前会话帧(新账号, 证明格式)
- evidence/activity_verify_result.txt: 最终验证输出
- /tmp/cdp_now*.py: CDP 抓当前浏览器帧的脚本(浏览器 200 对照)
+14
View File
@@ -0,0 +1,14 @@
{
"uid": 1199666911746,
"ua": "webh5&0.0.1&websocket&&diypc_52775",
"cookie_spaced": "huya_ua=webh5&0.0.1&websocket&&diypc_52775; web_qrlogin_confirm_id=f4fc0532-6b23-4ad2-973a-f3ee9b6a8bfe; udb_cred=CnC8njCnuw0aYtHxt59no_-LlhNxOYl1lSkUaxJbPHn4htOSlnOvS9_29BscOyI384Jp0B8A-ePHLDgpIznm76nHH9vFoJ0gzbQNjgVwPyMBULBDEjWsWCeYmpIr1CiB0HpC_nqa5KxI_GrXrB_Wa2RF; udb_uid=1199666911746; yyuid=1199666911746; udb_passport=hy_300024708; username=hy_300024708; udb_version=1.0; udb_biztoken=AQBY2017dyTd0W_SZD19bd9UT_Lkqzup5yOggzlZXrmxx7q3YofMCivhcL3xN0vYwQHw8gdHwqsYUAaUrOZnE9Ik_L9_exOiqradBRPmvxy8f5YjqL1PmbZfB-BkiW8wiXJBRqG9dSKngHHgaRxCO0g3JQBwLov44IB9r8MKPukNUvaR47FMSGvXhspurOL3gaHs5wGMoZn3p9iHcHfCwiOhQuwQ3vx_ib62NPRP6Q2qspvzNoZHodMOosyqHJ3Nd_AqgS_8JeUUrarccfhFZd6nYZ44FGnJPhxKJW4BWREYR4wDy-RdpjZcjflJ9XP_noBnCIFIAzrflcIt80ZIroQt; udb_origin=0; udb_status=1; udb_other=%7B%22lt%22%3A%221787628882646%22%2C%22isRem%22%3A%221%22%7D----13059903110; __yasmid=0.04376401031386312; __yamid_tt1=0.04376401031386312; __yamid_new=CBCA2A4A3C6000016A3F11CF13B016EA; huya_hd_rep_cnt=2; __yaoldyyuid=1199666911746; _yasids=__rootsid%3DCBCA2A4A3DB00001C653D2D0B2F014C3; huya_web_rep_cnt=7",
"cookie_tight": "huya_ua=webh5&0.0.1&websocket&&diypc_52775;web_qrlogin_confirm_id=f4fc0532-6b23-4ad2-973a-f3ee9b6a8bfe;udb_cred=CnC8njCnuw0aYtHxt59no_-LlhNxOYl1lSkUaxJbPHn4htOSlnOvS9_29BscOyI384Jp0B8A-ePHLDgpIznm76nHH9vFoJ0gzbQNjgVwPyMBULBDEjWsWCeYmpIr1CiB0HpC_nqa5KxI_GrXrB_Wa2RF;udb_uid=1199666911746;yyuid=1199666911746;udb_passport=hy_300024708;username=hy_300024708;udb_version=1.0;udb_biztoken=AQBY2017dyTd0W_SZD19bd9UT_Lkqzup5yOggzlZXrmxx7q3YofMCivhcL3xN0vYwQHw8gdHwqsYUAaUrOZnE9Ik_L9_exOiqradBRPmvxy8f5YjqL1PmbZfB-BkiW8wiXJBRqG9dSKngHHgaRxCO0g3JQBwLov44IB9r8MKPukNUvaR47FMSGvXhspurOL3gaHs5wGMoZn3p9iHcHfCwiOhQuwQ3vx_ib62NPRP6Q2qspvzNoZHodMOosyqHJ3Nd_AqgS_8JeUUrarccfhFZd6nYZ44FGnJPhxKJW4BWREYR4wDy-RdpjZcjflJ9XP_noBnCIFIAzrflcIt80ZIroQt;udb_origin=0;udb_status=1;udb_other=%7B%22lt%22%3A%221787628882646%22%2C%22isRem%22%3A%221%22%7D----13059903110;__yasmid=0.04376401031386312;__yamid_tt1=0.04376401031386312;__yamid_new=CBCA2A4A3C6000016A3F11CF13B016EA;huya_hd_rep_cnt=2;__yaoldyyuid=1199666911746;_yasids=__rootsid%3DCBCA2A4A3DB00001C653D2D0B2F014C3;guid=0a89c7f84ccf8d6a35014ec44fc48a4b;Hm_lvt_51700b6c722f5bb4cf39906a596ea41f=1787678541;Hm_lpvt_51700b6c722f5bb4cf39906a596ea41f=1787678541;HMACCOUNT=B2C9EFDC9345FD76;huya_web_rep_cnt=20",
"trace": "aa712e291575bd13:aa712e291575bd13:0:0",
"reqid": 12,
"baseinfo_hex": "030000011751b85a0216002622776562683526302e302e3126776562736f636b6574262664697970635f3532373735360c48555941265a482632303532460056006c76008700000439687579615f75613d776562683526302e302e3126776562736f636b6574262664697970635f35323737353b207765625f71726c6f67696e5f636f6e6669726d5f69643d66346663303533322d366232332d346164322d393733612d6633656539623661386266653b207564625f637265643d436e43386e6a436e75773061597448787435396e6f5f2d4c6c684e784f596c316c536b5561784a6250486e3468744f536c6e4f7653395f32394273634f79493338344a70304238412d6550484c446770497a6e6d37366e48483976466f4a30677a62514e6a67567750794d42554c4244456a5773574365596d70497231436942304870435f6e7161354b78495f47725872425f57613252463b207564625f7569643d313139393636363931313734363b2079797569643d313139393636363931313734363b207564625f70617373706f72743d68795f3330303032343730383b20757365726e616d653d68795f3330303032343730383b207564625f76657273696f6e3d312e303b207564625f62697a746f6b656e3d41514259323031376479546430575f535a44313962643955545f4c6b717a757035794f67677a6c5a58726d7878377133596f664d43697668634c33784e30765977514877386764487771735955416155724f5a6e4539496b5f4c395f65784f69717261644252506d767879386635596a714c31506d625a66422d426b6957387769584a425271473964534b6e67484867615278434f3067334a5142774c6f76343449423972384d4b50756b4e557661523437464d5347765868737075724f4c33676148733577474d6f5a6e33703969486348664377694f68517577513376785f696236324e505250365132717370767a4e6f5a486f644d4f6f737971484a334e645f417167535f384a65555572617263636668465a64366e595a343446476e4a5068784b4a5734425752455952347744792d5264706a5a636a666c4a3958505f6e6f426e43494649417a72666c63497438305a49726f51743b207564625f6f726967696e3d303b207564625f7374617475733d313b207564625f6f746865723d2537422532326c7425323225334125323231373837363238383832363436253232253243253232697352656d253232253341253232312532322537442d2d2d2d31333035393930333131303b205f5f7961736d69643d302e30343337363430313033313338363331323b205f5f79616d69645f7474313d302e30343337363430313033313338363331323b205f5f79616d69645f6e65773d43424341324134413343363030303031364133463131434631334230313645413b20687579615f68645f7265705f636e743d323b205f5f79616f6c6479797569643d313139393636363931313734363b205f7961736964733d5f5f726f6f7473696425334443424341324134413344423030303031433635334432443042324630313443333b20687579615f7765625f7265705f636e743d379625613935613733373933363762643566643a613935613733373933363762643566643a303a30a80c",
"body_hex": "0000057a10032c3c400c560877656241637455496614676574416374557365725461736b44657461696c7d0001051e0800010604745265711d000105100a0a030000011751b85a02160026003622776562683526302e302e3126776562736f636b6574262664697970635f353237373547000004d0687579615f75613d776562683526302e302e3126776562736f636b6574262664697970635f35323737353b7765625f71726c6f67696e5f636f6e6669726d5f69643d66346663303533322d366232332d346164322d393733612d6633656539623661386266653b7564625f637265643d436e43386e6a436e75773061597448787435396e6f5f2d4c6c684e784f596c316c536b5561784a6250486e3468744f536c6e4f7653395f32394273634f79493338344a70304238412d6550484c446770497a6e6d37366e48483976466f4a30677a62514e6a67567750794d42554c4244456a5773574365596d70497231436942304870435f6e7161354b78495f47725872425f57613252463b7564625f7569643d313139393636363931313734363b79797569643d313139393636363931313734363b7564625f70617373706f72743d68795f3330303032343730383b757365726e616d653d68795f3330303032343730383b7564625f76657273696f6e3d312e303b7564625f62697a746f6b656e3d41514259323031376479546430575f535a44313962643955545f4c6b717a757035794f67677a6c5a58726d7878377133596f664d43697668634c33784e30765977514877386764487771735955416155724f5a6e4539496b5f4c395f65784f69717261644252506d767879386635596a714c31506d625a66422d426b6957387769584a425271473964534b6e67484867615278434f3067334a5142774c6f76343449423972384d4b50756b4e557661523437464d5347765868737075724f4c33676148733577474d6f5a6e33703969486348664377694f68517577513376785f696236324e505250365132717370767a4e6f5a486f644d4f6f737971484a334e645f417167535f384a65555572617263636668465a64366e595a343446476e4a5068784b4a5734425752455952347744792d5264706a5a636a666c4a3958505f6e6f426e43494649417a72666c63497438305a49726f51743b7564625f6f726967696e3d303b7564625f7374617475733d313b7564625f6f746865723d2537422532326c7425323225334125323231373837363238383832363436253232253243253232697352656d253232253341253232312532322537442d2d2d2d31333035393930333131303b5f5f7961736d69643d302e30343337363430313033313338363331323b5f5f79616d69645f7474313d302e30343337363430313033313338363331323b5f5f79616d69645f6e65773d43424341324134413343363030303031364133463131434631334230313645413b687579615f68645f7265705f636e743d323b5f5f79616f6c6479797569643d313139393636363931313734363b5f7961736964733d5f5f726f6f7473696425334443424341324134413344423030303031433635334432443042324630313443333b677569643d30613839633766383463636638643661333530313465633434666334386134623b486d5f6c76745f35313730306236633732326635626234636633393930366135393665613431663d313738373637383534313b486d5f6c7076745f35313730306236633732326635626234636633393930366135393665613431663d313738373637383534313b484d4143434f554e543d423243394546444339333435464437363b687579615f7765625f7265705f636e743d32305c66000b11622f0b8c980ca80c2c3625616137313265323931353735626431333a616137313265323931353735626431333a303a304c5c6600",
"func_tail_hex": "11622f",
"baseinfo_trace": "a95a7379367bd5fd:a95a7379367bd5fd:0:0",
"auth_hex": "030000011751b85a021622776562683526302e302e3126776562736f636b6574262664697970635f3532373735270000043a687579615f75613d776562683526302e302e3126776562736f636b6574262664697970635f35323737353b207765625f71726c6f67696e5f636f6e6669726d5f69643d66346663303533322d366232332d346164322d393733612d6633656539623661386266653b207564625f637265643d436e43386e6a436e75773061597448787435396e6f5f2d4c6c684e784f596c316c536b5561784a6250486e3468744f536c6e4f7653395f32394273634f79493338344a70304238412d6550484c446770497a6e6d37366e48483976466f4a30677a62514e6a67567750794d42554c4244456a5773574365596d70497231436942304870435f6e7161354b78495f47725872425f57613252463b207564625f7569643d313139393636363931313734363b2079797569643d313139393636363931313734363b207564625f70617373706f72743d68795f3330303032343730383b20757365726e616d653d68795f3330303032343730383b207564625f76657273696f6e3d312e303b207564625f62697a746f6b656e3d41514259323031376479546430575f535a44313962643955545f4c6b717a757035794f67677a6c5a58726d7878377133596f664d43697668634c33784e30765977514877386764487771735955416155724f5a6e4539496b5f4c395f65784f69717261644252506d767879386635596a714c31506d625a66422d426b6957387769584a425271473964534b6e67484867615278434f3067334a5142774c6f76343449423972384d4b50756b4e557661523437464d5347765868737075724f4c33676148733577474d6f5a6e33703969486348664377694f68517577513376785f696236324e505250365132717370767a4e6f5a486f644d4f6f737971484a334e645f417167535f384a65555572617263636668465a64366e595a343446476e4a5068784b4a5734425752455952347744792d5264706a5a636a666c4a3958505f6e6f426e43494649417a72666c63497438305a49726f51743b207564625f6f726967696e3d303b207564625f7374617475733d313b207564625f6f746865723d2537422532326c7425323225334125323231373837363238383832363436253232253243253232697352656d253232253341253232312532322537442d2d2d2d31333035393930333131303b205f5f7961736d69643d302e30343337363430313033313338363331323b205f5f79616d69645f7474313d302e30343337363430313033313338363331323b205f5f79616d69645f6e65773d43424341324134413343363030303031364133463131434631334230313645413b20687579615f68645f7265705f636e743d323b205f5f79616f6c6479797569643d313139393636363931313734363b205f7961736964733d5f5f726f6f7473696425334443424341324134413344423030303031433635334432443042324630313443333b20687579615f7765625f7265705f636e743d313036004001560c48555941265a4826323035322c36004c5c6600",
"auth_cookie_spaced": "huya_ua=webh5&0.0.1&websocket&&diypc_52775; web_qrlogin_confirm_id=f4fc0532-6b23-4ad2-973a-f3ee9b6a8bfe; udb_cred=CnC8njCnuw0aYtHxt59no_-LlhNxOYl1lSkUaxJbPHn4htOSlnOvS9_29BscOyI384Jp0B8A-ePHLDgpIznm76nHH9vFoJ0gzbQNjgVwPyMBULBDEjWsWCeYmpIr1CiB0HpC_nqa5KxI_GrXrB_Wa2RF; udb_uid=1199666911746; yyuid=1199666911746; udb_passport=hy_300024708; username=hy_300024708; udb_version=1.0; udb_biztoken=AQBY2017dyTd0W_SZD19bd9UT_Lkqzup5yOggzlZXrmxx7q3YofMCivhcL3xN0vYwQHw8gdHwqsYUAaUrOZnE9Ik_L9_exOiqradBRPmvxy8f5YjqL1PmbZfB-BkiW8wiXJBRqG9dSKngHHgaRxCO0g3JQBwLov44IB9r8MKPukNUvaR47FMSGvXhspurOL3gaHs5wGMoZn3p9iHcHfCwiOhQuwQ3vx_ib62NPRP6Q2qspvzNoZHodMOosyqHJ3Nd_AqgS_8JeUUrarccfhFZd6nYZ44FGnJPhxKJW4BWREYR4wDy-RdpjZcjflJ9XP_noBnCIFIAzrflcIt80ZIroQt; udb_origin=0; udb_status=1; udb_other=%7B%22lt%22%3A%221787628882646%22%2C%22isRem%22%3A%221%22%7D----13059903110; __yasmid=0.04376401031386312; __yamid_tt1=0.04376401031386312; __yamid_new=CBCA2A4A3C6000016A3F11CF13B016EA; huya_hd_rep_cnt=2; __yaoldyyuid=1199666911746; _yasids=__rootsid%3DCBCA2A4A3DB00001C653D2D0B2F014C3; huya_web_rep_cnt=10"
}
+11
View File
@@ -0,0 +1,11 @@
[self_check] 通过: baseinfo/body/auth 与捕获金样本逐字节一致
== 账号 [0] account: hy_300026595 uid=1199666913640 cookies=10 ==
-- [A] 带 cookie 调 getActUserTaskDetail (复刻浏览器序列) --
响应 249B | status=200 msg=请求成功 任务项=6
=> ✅ 已登录 (服务端确认: 请求成功 + 用户任务数据)
-- [B] 无 cookie 对照 (应失败/错误) --
响应 96B | status=905 msg=None
结论: ✅ cookie 登录态服务端验证通过
Binary file not shown.
Binary file not shown.
+11
View File
@@ -0,0 +1,11 @@
# account: hy_300026595
web_qrlogin_confirm_id=41457fe1-8296-482b-b274-f3d7653adeb7
udb_cred=ChAgFf4SfcAnDyl5ujW3vO21-t1a7wC4tNqcX8DIMTN2SM6AqJ-_TSLo4pDnjfaEcXgYYevEYtufcSnRWZ2kPDVQczshoLXLSS6I-5NQCmCuUC-eQOT3cWHfRsDGPVF0iYQCSmIhkW0PbbJYa1aXkrCq
udb_uid=1199666913640
yyuid=1199666913640
udb_passport=hy_300026595
username=hy_300026595
udb_version=1.0
udb_biztoken=AQBKhawIP7YIaR6zGjd7zRodGzzmnHBZw5-3Am1SfabWP-IBgRn4b_KL5e7ow9k8GOlN7LhW21Rb6C0z8lA3xSyJ8QEWz65QSdfYjfkoyRcWWbHxbcJxQJ057_4W6kv1Y47d3lqxHnAS_yc3rbzun9ODDb5VfIbN-dmDRWruJ8VMU4BTm5DIKdAt6QM8T7H-dDG6k5-mnjuxqTT3UMaCCOnrC4rJ_Jbag-VnLjijr_4_QJjAxw2pJAqK5K5Ht-JVJ50Vz7G0IvUQoiLmggPSzevNfrPIQgmLT0ZBJdRZxvSSX19VuV6FfdgbPVC5fjsnxO0Op3yQH87ImehkxwnKKn9C
udb_origin=0
udb_status=1
+30
View File
@@ -0,0 +1,30 @@
[
"ABAdAAANCQABBgZsaXZlOjAWACw2AExcZgA=",
"AAMdAAB9AAAAfRADLDxA/1YGbGF1bmNoZgh3c0xhdW5jaH0AAFgIAAEGBHRSZXEdAABLCgMAAAEXUbhhaBYAJiJ3ZWJoNSYwLjAuMSZ3ZWJzb2NrZXQmJmRpeXBjXzUyNzc1NgxIVVlBJlpIJjIwNTJKBgAWACYANgBGAAsLjJgMqAwsNgBMXGYA",
"AAodAAEEJwMAAAEXUbhhaBYid2ViaDUmMC4wLjEmd2Vic29ja2V0JiZkaXlwY181Mjc3NScAAAPjaHV5YV91YT13ZWJoNSYwLjAuMSZ3ZWJzb2NrZXQmJmRpeXBjXzUyNzc1OyB3ZWJfcXJsb2dpbl9jb25maXJtX2lkPTQxNDU3ZmUxLTgyOTYtNDgyYi1iMjc0LWYzZDc2NTNhZGViNzsgdWRiX2NyZWQ9Q2hBZ0ZmNFNmY0FuRHlsNXVqVzN2TzIxLXQxYTd3QzR0TnFjWDhESU1UTjJTTTZBcUotX1RTTG80cERuamZhRWNYZ1lZZXZFWXR1ZmNTblJXWjJrUERWUWN6c2hvTFhMU1M2SS01TlFDbUN1VUMtZVFPVDNjV0hmUnNER1BWRjBpWVFDU21JaGtXMFBiYkpZYTFhWGtyQ3E7IHVkYl91aWQ9MTE5OTY2NjkxMzY0MDsgeXl1aWQ9MTE5OTY2NjkxMzY0MDsgdWRiX3Bhc3Nwb3J0PWh5XzMwMDAyNjU5NTsgdXNlcm5hbWU9aHlfMzAwMDI2NTk1OyB1ZGJfdmVyc2lvbj0xLjA7IHVkYl9iaXp0b2tlbj1BUUJLaGF3SVA3WUlhUjZ6R2pkN3pSb2RHenptbkhCWnc1LTNBbTFTZmFiV1AtSUJnUm40Yl9LTDVlN293OWs4R09sTjdMaFcyMVJiNkMwejhsQTN4U3lKOFFFV3o2NVFTZGZZamZrb3lSY1dXYkh4YmNKeFFKMDU3XzRXNmt2MVk0N2QzbHF4SG5BU195YzNyYnp1bjlPRERiNVZmSWJOLWRtRFJXcnVKOFZNVTRCVG01RElLZEF0NlFNOFQ3SC1kREc2azUtbW5qdXhxVFQzVU1hQ0NPbnJDNHJKX0piYWctVm5Mamlqcl80X1FKakF4dzJwSkFxSzVLNUh0LUpWSjUwVno3RzBJdlVRb2lMbWdnUFN6ZXZOZnJQSVFnbUxUMFpCSmRSWnh2U1NYMTlWdVY2RmZkZ2JQVkM1ZmpzbnhPME9wM3lRSDg3SW1laGt4d25LS245QzsgdWRiX29yaWdpbj0wOyB1ZGJfc3RhdHVzPTE7IF9feWFzbWlkPTAuMTQ2ODk3NTk5MjE1OTk2NjU7IF9feWFtaWRfdHQxPTAuMTQ2ODk3NTk5MjE1OTk2NjU7IF9feWFtaWRfbmV3PUNCQ0EyREM5MjNFMDAwMDFEQjE1MUY2MDRDMjVFNUEwOyBodXlhX2hkX3JlcF9jbnQ9MjsgX195YW9sZHl5dWlkPTExOTk2NjY5MTM2NDA7IF95YXNpZHM9X19yb290c2lkJTNEQ0JDQTJEQzkyNTAwMDAwMTU1QjAxMTIwMUYwMEM2OTA7IGh1eWFfd2ViX3JlcF9jbnQ9MTA2AEABVgxIVVlBJlpIJjIwNTIsNgBMXGYA",
"AAMdAAEEMgAABDIQAyw8QARWCG1vYmlsZXVpZglnZXRDb25maWd9AAEECQgAAQYEdFJlcR0AAQP7CgoDAAABF1G4YWgWACYANiJ3ZWJoNSYwLjAuMSZ3ZWJzb2NrZXQmJmRpeXBjXzUyNzc1RwAAA7JodXlhX3VhPXdlYmg1JjAuMC4xJndlYnNvY2tldCYmZGl5cGNfNTI3NzU7IHdlYl9xcmxvZ2luX2NvbmZpcm1faWQ9NDE0NTdmZTEtODI5Ni00ODJiLWIyNzQtZjNkNzY1M2FkZWI3OyB1ZGJfY3JlZD1DaEFnRmY0U2ZjQW5EeWw1dWpXM3ZPMjEtdDFhN3dDNHROcWNYOERJTVROMlNNNkFxSi1fVFNMbzRwRG5qZmFFY1hnWVlldkVZdHVmY1NuUldaMmtQRFZRY3pzaG9MWExTUzZJLTVOUUNtQ3VVQy1lUU9UM2NXSGZSc0RHUFZGMGlZUUNTbUloa1cwUGJiSllhMWFYa3JDcTsgdWRiX3VpZD0xMTk5NjY2OTEzNjQwOyB5eXVpZD0xMTk5NjY2OTEzNjQwOyB1ZGJfcGFzc3BvcnQ9aHlfMzAwMDI2NTk1OyB1c2VybmFtZT1oeV8zMDAwMjY1OTU7IHVkYl92ZXJzaW9uPTEuMDsgdWRiX2JpenRva2VuPUFRQktoYXdJUDdZSWFSNnpHamQ3elJvZEd6em1uSEJadzUtM0FtMVNmYWJXUC1JQmdSbjRiX0tMNWU3b3c5azhHT2xON0xoVzIxUmI2QzB6OGxBM3hTeUo4UUVXejY1UVNkZllqZmtveVJjV1diSHhiY0p4UUowNTdfNFc2a3YxWTQ3ZDNscXhIbkFTX3ljM3JienVuOU9ERGI1VmZJYk4tZG1EUldydUo4Vk1VNEJUbTVESUtkQXQ2UU04VDdILWRERzZrNS1tbmp1eHFUVDNVTWFDQ09uckM0ckpfSmJhZy1WbkxqaWpyXzRfUUpqQXh3MnBKQXFLNUs1SHQtSlZKNTBWejdHMEl2VVFvaUxtZ2dQU3pldk5mclBJUWdtTFQwWkJKZFJaeHZTU1gxOVZ1VjZGZmRnYlBWQzVmanNueE8wT3AzeVFIODdJbWVoa3h3bktLbjlDOyB1ZGJfb3JpZ2luPTA7IHVkYl9zdGF0dXM9MTsgX195YXNtaWQ9MC4xNDY4OTc1OTkyMTU5OTY2NTsgX195YW1pZF90dDE9MC4xNDY4OTc1OTkyMTU5OTY2NTsgX195YW1pZF9uZXc9Q0JDQTJEQzkyM0UwMDAwMURCMTUxRjYwNEMyNUU1QTA7IF95YXNpZHM9X19yb290c2lkJTNEQ0JDQTJEQzkyM0YwMDAwMTI2MTExODEyMUM4QjE2QUU7IGh1eWFfaGRfcmVwX2NudD0yXGYAdgALGAwmBGh1eWE5DAuMmAyoDCw2JTUwOGUyNGIyNmQ0Y2M4NTU6NTA4ZTI0YjI2ZDRjYzg1NTowOjBMXGYA",
"ABAdAAANCQABBgZsaXZlOjAWACw2AExcZgA=",
"AAMdAAB9AAAAfRADLDxA/1YGbGF1bmNoZgh3c0xhdW5jaH0AAFgIAAEGBHRSZXEdAABLCgMAAAEXUbhhaBYAJiJ3ZWJoNSYwLjAuMSZ3ZWJzb2NrZXQmJmRpeXBjXzUyNzc1NgxIVVlBJlpIJjIwNTJKBgAWACYANgBGAAsLjJgMqAwsNgBMXGYA",
"AAodAAEEJwMAAAEXUbhhaBYid2ViaDUmMC4wLjEmd2Vic29ja2V0JiZkaXlwY181Mjc3NScAAAPjaHV5YV91YT13ZWJoNSYwLjAuMSZ3ZWJzb2NrZXQmJmRpeXBjXzUyNzc1OyB3ZWJfcXJsb2dpbl9jb25maXJtX2lkPTQxNDU3ZmUxLTgyOTYtNDgyYi1iMjc0LWYzZDc2NTNhZGViNzsgdWRiX2NyZWQ9Q2hBZ0ZmNFNmY0FuRHlsNXVqVzN2TzIxLXQxYTd3QzR0TnFjWDhESU1UTjJTTTZBcUotX1RTTG80cERuamZhRWNYZ1lZZXZFWXR1ZmNTblJXWjJrUERWUWN6c2hvTFhMU1M2SS01TlFDbUN1VUMtZVFPVDNjV0hmUnNER1BWRjBpWVFDU21JaGtXMFBiYkpZYTFhWGtyQ3E7IHVkYl91aWQ9MTE5OTY2NjkxMzY0MDsgeXl1aWQ9MTE5OTY2NjkxMzY0MDsgdWRiX3Bhc3Nwb3J0PWh5XzMwMDAyNjU5NTsgdXNlcm5hbWU9aHlfMzAwMDI2NTk1OyB1ZGJfdmVyc2lvbj0xLjA7IHVkYl9iaXp0b2tlbj1BUUJLaGF3SVA3WUlhUjZ6R2pkN3pSb2RHenptbkhCWnc1LTNBbTFTZmFiV1AtSUJnUm40Yl9LTDVlN293OWs4R09sTjdMaFcyMVJiNkMwejhsQTN4U3lKOFFFV3o2NVFTZGZZamZrb3lSY1dXYkh4YmNKeFFKMDU3XzRXNmt2MVk0N2QzbHF4SG5BU195YzNyYnp1bjlPRERiNVZmSWJOLWRtRFJXcnVKOFZNVTRCVG01RElLZEF0NlFNOFQ3SC1kREc2azUtbW5qdXhxVFQzVU1hQ0NPbnJDNHJKX0piYWctVm5Mamlqcl80X1FKakF4dzJwSkFxSzVLNUh0LUpWSjUwVno3RzBJdlVRb2lMbWdnUFN6ZXZOZnJQSVFnbUxUMFpCSmRSWnh2U1NYMTlWdVY2RmZkZ2JQVkM1ZmpzbnhPME9wM3lRSDg3SW1laGt4d25LS245QzsgdWRiX29yaWdpbj0wOyB1ZGJfc3RhdHVzPTE7IF9feWFzbWlkPTAuMTQ2ODk3NTk5MjE1OTk2NjU7IF9feWFtaWRfdHQxPTAuMTQ2ODk3NTk5MjE1OTk2NjU7IF9feWFtaWRfbmV3PUNCQ0EyREM5MjNFMDAwMDFEQjE1MUY2MDRDMjVFNUEwOyBodXlhX2hkX3JlcF9jbnQ9MjsgX195YW9sZHl5dWlkPTExOTk2NjY5MTM2NDA7IF95YXNpZHM9X19yb290c2lkJTNEQ0JDQTJEQzkyNTAwMDAwMTU1QjAxMTIwMUYwMEM2OTA7IGh1eWFfd2ViX3JlcF9jbnQ9MTQ2AEABVgxIVVlBJlpIJjIwNTIsNgBMXGYA",
"AAMdAAEEMgAABDIQAyw8QAZWCG1vYmlsZXVpZglnZXRDb25maWd9AAEECQgAAQYEdFJlcR0AAQP7CgoDAAABF1G4YWgWACYANiJ3ZWJoNSYwLjAuMSZ3ZWJzb2NrZXQmJmRpeXBjXzUyNzc1RwAAA7JodXlhX3VhPXdlYmg1JjAuMC4xJndlYnNvY2tldCYmZGl5cGNfNTI3NzU7IHdlYl9xcmxvZ2luX2NvbmZpcm1faWQ9NDE0NTdmZTEtODI5Ni00ODJiLWIyNzQtZjNkNzY1M2FkZWI3OyB1ZGJfY3JlZD1DaEFnRmY0U2ZjQW5EeWw1dWpXM3ZPMjEtdDFhN3dDNHROcWNYOERJTVROMlNNNkFxSi1fVFNMbzRwRG5qZmFFY1hnWVlldkVZdHVmY1NuUldaMmtQRFZRY3pzaG9MWExTUzZJLTVOUUNtQ3VVQy1lUU9UM2NXSGZSc0RHUFZGMGlZUUNTbUloa1cwUGJiSllhMWFYa3JDcTsgdWRiX3VpZD0xMTk5NjY2OTEzNjQwOyB5eXVpZD0xMTk5NjY2OTEzNjQwOyB1ZGJfcGFzc3BvcnQ9aHlfMzAwMDI2NTk1OyB1c2VybmFtZT1oeV8zMDAwMjY1OTU7IHVkYl92ZXJzaW9uPTEuMDsgdWRiX2JpenRva2VuPUFRQktoYXdJUDdZSWFSNnpHamQ3elJvZEd6em1uSEJadzUtM0FtMVNmYWJXUC1JQmdSbjRiX0tMNWU3b3c5azhHT2xON0xoVzIxUmI2QzB6OGxBM3hTeUo4UUVXejY1UVNkZllqZmtveVJjV1diSHhiY0p4UUowNTdfNFc2a3YxWTQ3ZDNscXhIbkFTX3ljM3JienVuOU9ERGI1VmZJYk4tZG1EUldydUo4Vk1VNEJUbTVESUtkQXQ2UU04VDdILWRERzZrNS1tbmp1eHFUVDNVTWFDQ09uckM0ckpfSmJhZy1WbkxqaWpyXzRfUUpqQXh3MnBKQXFLNUs1SHQtSlZKNTBWejdHMEl2VVFvaUxtZ2dQU3pldk5mclBJUWdtTFQwWkJKZFJaeHZTU1gxOVZ1VjZGZmRnYlBWQzVmanNueE8wT3AzeVFIODdJbWVoa3h3bktLbjlDOyB1ZGJfb3JpZ2luPTA7IHVkYl9zdGF0dXM9MTsgX195YXNtaWQ9MC4xNDY4OTc1OTkyMTU5OTY2NTsgX195YW1pZF90dDE9MC4xNDY4OTc1OTkyMTU5OTY2NTsgX195YW1pZF9uZXc9Q0JDQTJEQzkyM0UwMDAwMURCMTUxRjYwNEMyNUU1QTA7IF95YXNpZHM9X19yb290c2lkJTNEQ0JDQTJEQzkyM0YwMDAwMTI2MTExODEyMUM4QjE2QUU7IGh1eWFfaGRfcmVwX2NudD0yXGYAdgALGAwmBGh1eWE5DAuMmAyoDCw2JTU1MDE5NjNjYzE2Y2NiNTY6NTUwMTk2M2NjMTZjY2I1NjowOjBMXGYA",
"AAMdAAEEVQAABFUQAyw8QAdWCUdhbWVCaXpVSWYVZ2V0UWlXZWlSZWxhdGlvbkJ5VWlkfQABBB8IAAEGBHRSZXEdAAEEEQoKAwAAARdRuGFoFgAmADYid2ViaDUmMC4wLjEmd2Vic29ja2V0JiZkaXlwY181Mjc3NUcAAAPSaHV5YV91YT13ZWJoNSYwLjAuMSZ3ZWJzb2NrZXQmJmRpeXBjXzUyNzc1O3dlYl9xcmxvZ2luX2NvbmZpcm1faWQ9NDE0NTdmZTEtODI5Ni00ODJiLWIyNzQtZjNkNzY1M2FkZWI3O3VkYl9jcmVkPUNoQWdGZjRTZmNBbkR5bDV1alczdk8yMS10MWE3d0M0dE5xY1g4RElNVE4yU002QXFKLV9UU0xvNHBEbmpmYUVjWGdZWWV2RVl0dWZjU25SV1oya1BEVlFjenNob0xYTFNTNkktNU5RQ21DdVVDLWVRT1QzY1dIZlJzREdQVkYwaVlRQ1NtSWhrVzBQYmJKWWExYVhrckNxO3VkYl91aWQ9MTE5OTY2NjkxMzY0MDt5eXVpZD0xMTk5NjY2OTEzNjQwO3VkYl9wYXNzcG9ydD1oeV8zMDAwMjY1OTU7dXNlcm5hbWU9aHlfMzAwMDI2NTk1O3VkYl92ZXJzaW9uPTEuMDt1ZGJfYml6dG9rZW49QVFCS2hhd0lQN1lJYVI2ekdqZDd6Um9kR3p6bW5IQlp3NS0zQW0xU2ZhYldQLUlCZ1JuNGJfS0w1ZTdvdzlrOEdPbE43TGhXMjFSYjZDMHo4bEEzeFN5SjhRRVd6NjVRU2RmWWpma295UmNXV2JIeGJjSnhRSjA1N180VzZrdjFZNDdkM2xxeEhuQVNfeWMzcmJ6dW45T0REYjVWZkliTi1kbURSV3J1SjhWTVU0QlRtNURJS2RBdDZRTThUN0gtZERHNms1LW1uanV4cVRUM1VNYUNDT25yQzRySl9KYmFnLVZuTGppanJfNF9RSmpBeHcycEpBcUs1SzVIdC1KVko1MFZ6N0cwSXZVUW9pTG1nZ1BTemV2TmZyUElRZ21MVDBaQkpkUlp4dlNTWDE5VnVWNkZmZGdiUFZDNWZqc254TzBPcDN5UUg4N0ltZWhreHduS0tuOUM7dWRiX29yaWdpbj0wO3VkYl9zdGF0dXM9MTtfX3lhc21pZD0wLjE0Njg5NzU5OTIxNTk5NjY1O19feWFtaWRfdHQxPTAuMTQ2ODk3NTk5MjE1OTk2NjU7X195YW1pZF9uZXc9Q0JDQTJEQzkyM0UwMDAwMURCMTUxRjYwNEMyNUU1QTA7aHV5YV9oZF9yZXBfY250PTI7X195YW9sZHl5dWlkPTExOTk2NjY5MTM2NDA7X3lhc2lkcz1fX3Jvb3RzaWQlM0RDQkNBMkRDOTI1MDAwMDAxNTVCMDExMjAxRjAwQzY5MDtodXlhX3dlYl9yZXBfY250PTEzXGYAdgALC4yYDKgMLDYlNjRmMDM3ZWNhYjNhNTNhMDo2NGYwMzdlY2FiM2E1M2EwOjA6MExcZgA=",
"ACEdAAA8BgxIVVlBJlpIJjIwNTIWIDBhODljN2Y4OWVkZDhkNmEzYTAxNzYwYjc3MGI2MzIyLDxqCAwYDDwLeAyMLDYATFxmAA==",
"ABcdAAACCAwsNgBMXGYA",
"ABAdAAANCQABBgZsaXZlOjAWACw2AExcZgA=",
"AAMdAAB9AAAAfRADLDxA/1YGbGF1bmNoZgh3c0xhdW5jaH0AAFgIAAEGBHRSZXEdAABLCgMAAAEXUbhhaBYAJiJ3ZWJoNSYwLjAuMSZ3ZWJzb2NrZXQmJmRpeXBjXzUyNzc1NgxIVVlBJlpIJjIwNTJKBgAWACYANgBGAAsLjJgMqAwsNgBMXGYA",
"AAodAAEETgMAAAEXUbhhaBYid2ViaDUmMC4wLjEmd2Vic29ja2V0JiZkaXlwY181Mjc3NScAAAQKaHV5YV91YT13ZWJoNSYwLjAuMSZ3ZWJzb2NrZXQmJmRpeXBjXzUyNzc1OyB3ZWJfcXJsb2dpbl9jb25maXJtX2lkPTQxNDU3ZmUxLTgyOTYtNDgyYi1iMjc0LWYzZDc2NTNhZGViNzsgdWRiX2NyZWQ9Q2hBZ0ZmNFNmY0FuRHlsNXVqVzN2TzIxLXQxYTd3QzR0TnFjWDhESU1UTjJTTTZBcUotX1RTTG80cERuamZhRWNYZ1lZZXZFWXR1ZmNTblJXWjJrUERWUWN6c2hvTFhMU1M2SS01TlFDbUN1VUMtZVFPVDNjV0hmUnNER1BWRjBpWVFDU21JaGtXMFBiYkpZYTFhWGtyQ3E7IHVkYl91aWQ9MTE5OTY2NjkxMzY0MDsgeXl1aWQ9MTE5OTY2NjkxMzY0MDsgdWRiX3Bhc3Nwb3J0PWh5XzMwMDAyNjU5NTsgdXNlcm5hbWU9aHlfMzAwMDI2NTk1OyB1ZGJfdmVyc2lvbj0xLjA7IHVkYl9iaXp0b2tlbj1BUUJLaGF3SVA3WUlhUjZ6R2pkN3pSb2RHenptbkhCWnc1LTNBbTFTZmFiV1AtSUJnUm40Yl9LTDVlN293OWs4R09sTjdMaFcyMVJiNkMwejhsQTN4U3lKOFFFV3o2NVFTZGZZamZrb3lSY1dXYkh4YmNKeFFKMDU3XzRXNmt2MVk0N2QzbHF4SG5BU195YzNyYnp1bjlPRERiNVZmSWJOLWRtRFJXcnVKOFZNVTRCVG01RElLZEF0NlFNOFQ3SC1kREc2azUtbW5qdXhxVFQzVU1hQ0NPbnJDNHJKX0piYWctVm5Mamlqcl80X1FKakF4dzJwSkFxSzVLNUh0LUpWSjUwVno3RzBJdlVRb2lMbWdnUFN6ZXZOZnJQSVFnbUxUMFpCSmRSWnh2U1NYMTlWdVY2RmZkZ2JQVkM1ZmpzbnhPME9wM3lRSDg3SW1laGt4d25LS245QzsgdWRiX29yaWdpbj0wOyB1ZGJfc3RhdHVzPTE7IF9feWFzbWlkPTAuMTQ2ODk3NTk5MjE1OTk2NjU7IF9feWFtaWRfdHQxPTAuMTQ2ODk3NTk5MjE1OTk2NjU7IF9feWFtaWRfbmV3PUNCQ0EyREM5MjNFMDAwMDFEQjE1MUY2MDRDMjVFNUEwOyBodXlhX2hkX3JlcF9jbnQ9MjsgX195YW9sZHl5dWlkPTExOTk2NjY5MTM2NDA7IF95YXNpZHM9X19yb290c2lkJTNEQ0JDQTJEQzkyNTAwMDAwMTU1QjAxMTIwMUYwMEM2OTA7IGh1eWFfd2ViX3JlcF9jbnQ9MTk7IGd1aWQ9MGE4OWM3Zjg5ZWRkOGQ2YTNhMDE3NjBiNzcwYjYzMjI2AEABVgxIVVlBJlpIJjIwNTIsNgBMXGYA",
"AAMdAAEEYwAABGMQAyw8QANWCG1vYmlsZXVpZglnZXRDb25maWd9AAEEOggAAQYEdFJlcR0AAQQsCgoDAAABF1G4YWgWACYANiJ3ZWJoNSYwLjAuMSZ3ZWJzb2NrZXQmJmRpeXBjXzUyNzc1RwAAA+NodXlhX3VhPXdlYmg1JjAuMC4xJndlYnNvY2tldCYmZGl5cGNfNTI3NzU7IHdlYl9xcmxvZ2luX2NvbmZpcm1faWQ9NDE0NTdmZTEtODI5Ni00ODJiLWIyNzQtZjNkNzY1M2FkZWI3OyB1ZGJfY3JlZD1DaEFnRmY0U2ZjQW5EeWw1dWpXM3ZPMjEtdDFhN3dDNHROcWNYOERJTVROMlNNNkFxSi1fVFNMbzRwRG5qZmFFY1hnWVlldkVZdHVmY1NuUldaMmtQRFZRY3pzaG9MWExTUzZJLTVOUUNtQ3VVQy1lUU9UM2NXSGZSc0RHUFZGMGlZUUNTbUloa1cwUGJiSllhMWFYa3JDcTsgdWRiX3VpZD0xMTk5NjY2OTEzNjQwOyB5eXVpZD0xMTk5NjY2OTEzNjQwOyB1ZGJfcGFzc3BvcnQ9aHlfMzAwMDI2NTk1OyB1c2VybmFtZT1oeV8zMDAwMjY1OTU7IHVkYl92ZXJzaW9uPTEuMDsgdWRiX2JpenRva2VuPUFRQktoYXdJUDdZSWFSNnpHamQ3elJvZEd6em1uSEJadzUtM0FtMVNmYWJXUC1JQmdSbjRiX0tMNWU3b3c5azhHT2xON0xoVzIxUmI2QzB6OGxBM3hTeUo4UUVXejY1UVNkZllqZmtveVJjV1diSHhiY0p4UUowNTdfNFc2a3YxWTQ3ZDNscXhIbkFTX3ljM3JienVuOU9ERGI1VmZJYk4tZG1EUldydUo4Vk1VNEJUbTVESUtkQXQ2UU04VDdILWRERzZrNS1tbmp1eHFUVDNVTWFDQ09uckM0ckpfSmJhZy1WbkxqaWpyXzRfUUpqQXh3MnBKQXFLNUs1SHQtSlZKNTBWejdHMEl2VVFvaUxtZ2dQU3pldk5mclBJUWdtTFQwWkJKZFJaeHZTU1gxOVZ1VjZGZmRnYlBWQzVmanNueE8wT3AzeVFIODdJbWVoa3h3bktLbjlDOyB1ZGJfb3JpZ2luPTA7IHVkYl9zdGF0dXM9MTsgX195YXNtaWQ9MC4xNDY4OTc1OTkyMTU5OTY2NTsgX195YW1pZF90dDE9MC4xNDY4OTc1OTkyMTU5OTY2NTsgX195YW1pZF9uZXc9Q0JDQTJEQzkyM0UwMDAwMURCMTUxRjYwNEMyNUU1QTA7IGh1eWFfaGRfcmVwX2NudD0yOyBfX3lhb2xkeXl1aWQ9MTE5OTY2NjkxMzY0MDsgX3lhc2lkcz1fX3Jvb3RzaWQlM0RDQkNBMkRDOTI1MDAwMDAxNTVCMDExMjAxRjAwQzY5MDsgaHV5YV93ZWJfcmVwX2NudD0xMFxmAHYACxgMJgRodXlhOQwLjJgMqAwsNiUwMmQ3OTczNGY2MWQ3NWI3OjAyZDc5NzM0ZjYxZDc1Yjc6MDowTFxmAA==",
"ABcdAAACCAwsNgBMXGYA",
"ACEdAAA8BgxIVVlBJlpIJjIwNTIWIDBhN2Q5MzFiOWVkZDhkNmEyODAxMWY4MzIwODM5OWQ5LDxqCAwYDDwLeAyMLDYATFxmAA==",
"ACEdAAA8BgxIVVlBJlpIJjIwNTIWIDBhODk1ZmNhOWVkZDhkNmEzMjAxNDAwMTQxMDFjM2Y0LDxqCAwYDDwLeAyMLDYATFxmAA==",
"ABcdAAACCAwsNgBMXGYA",
"AAMdAAEEhwAABIcQAyw8QAhWCHdlYkFjdFVJZhhjaGVja1VzZXJCaW5kR2FtZUFjY291bnR9AAEETwgAAQYEdFJlcR0AAQRBCgoDAAABF1G4YWgWACYANiJ3ZWJoNSYwLjAuMSZ3ZWJzb2NrZXQmJmRpeXBjXzUyNzc1RwAAA/hodXlhX3VhPXdlYmg1JjAuMC4xJndlYnNvY2tldCYmZGl5cGNfNTI3NzU7d2ViX3FybG9naW5fY29uZmlybV9pZD00MTQ1N2ZlMS04Mjk2LTQ4MmItYjI3NC1mM2Q3NjUzYWRlYjc7dWRiX2NyZWQ9Q2hBZ0ZmNFNmY0FuRHlsNXVqVzN2TzIxLXQxYTd3QzR0TnFjWDhESU1UTjJTTTZBcUotX1RTTG80cERuamZhRWNYZ1lZZXZFWXR1ZmNTblJXWjJrUERWUWN6c2hvTFhMU1M2SS01TlFDbUN1VUMtZVFPVDNjV0hmUnNER1BWRjBpWVFDU21JaGtXMFBiYkpZYTFhWGtyQ3E7dWRiX3VpZD0xMTk5NjY2OTEzNjQwO3l5dWlkPTExOTk2NjY5MTM2NDA7dWRiX3Bhc3Nwb3J0PWh5XzMwMDAyNjU5NTt1c2VybmFtZT1oeV8zMDAwMjY1OTU7dWRiX3ZlcnNpb249MS4wO3VkYl9iaXp0b2tlbj1BUUJLaGF3SVA3WUlhUjZ6R2pkN3pSb2RHenptbkhCWnc1LTNBbTFTZmFiV1AtSUJnUm40Yl9LTDVlN293OWs4R09sTjdMaFcyMVJiNkMwejhsQTN4U3lKOFFFV3o2NVFTZGZZamZrb3lSY1dXYkh4YmNKeFFKMDU3XzRXNmt2MVk0N2QzbHF4SG5BU195YzNyYnp1bjlPRERiNVZmSWJOLWRtRFJXcnVKOFZNVTRCVG01RElLZEF0NlFNOFQ3SC1kREc2azUtbW5qdXhxVFQzVU1hQ0NPbnJDNHJKX0piYWctVm5Mamlqcl80X1FKakF4dzJwSkFxSzVLNUh0LUpWSjUwVno3RzBJdlVRb2lMbWdnUFN6ZXZOZnJQSVFnbUxUMFpCSmRSWnh2U1NYMTlWdVY2RmZkZ2JQVkM1ZmpzbnhPME9wM3lRSDg3SW1laGt4d25LS245Qzt1ZGJfb3JpZ2luPTA7dWRiX3N0YXR1cz0xO19feWFzbWlkPTAuMTQ2ODk3NTk5MjE1OTk2NjU7X195YW1pZF90dDE9MC4xNDY4OTc1OTkyMTU5OTY2NTtfX3lhbWlkX25ldz1DQkNBMkRDOTIzRTAwMDAxREIxNTFGNjA0QzI1RTVBMDtodXlhX2hkX3JlcF9jbnQ9MjtfX3lhb2xkeXl1aWQ9MTE5OTY2NjkxMzY0MDtfeWFzaWRzPV9fcm9vdHNpZCUzRENCQ0EyREM5MjUwMDAwMDE1NUIwMTEyMDFGMDBDNjkwO2h1eWFfd2ViX3JlcF9jbnQ9MTk7Z3VpZD0wYTg5NWZjYTllZGQ4ZDZhMzIwMTQwMDE0MTAxYzNmNFxmAHYACxwmADxGAFEkN2wLjJgMqAwsNiVmZjVlOWVjODU3MmZlOTcwOmZmNWU5ZWM4NTcyZmU5NzA6MDowTFxmAA==",
"AAMdAAEFDAAABQwQAyw8QAlWCHdlYkFjdFVJZg9nZXRBY3RQcml6ZUxpc3R9AAEE3QgAAQYEdFJlcR0AAQTPCgoDAAABF1G4YWgWACYANiJ3ZWJoNSYwLjAuMSZ3ZWJzb2NrZXQmJmRpeXBjXzUyNzc1RwAABI9odXlhX3VhPXdlYmg1JjAuMC4xJndlYnNvY2tldCYmZGl5cGNfNTI3NzU7IHdlYl9xcmxvZ2luX2NvbmZpcm1faWQ9NDE0NTdmZTEtODI5Ni00ODJiLWIyNzQtZjNkNzY1M2FkZWI3OyB1ZGJfY3JlZD1DaEFnRmY0U2ZjQW5EeWw1dWpXM3ZPMjEtdDFhN3dDNHROcWNYOERJTVROMlNNNkFxSi1fVFNMbzRwRG5qZmFFY1hnWVlldkVZdHVmY1NuUldaMmtQRFZRY3pzaG9MWExTUzZJLTVOUUNtQ3VVQy1lUU9UM2NXSGZSc0RHUFZGMGlZUUNTbUloa1cwUGJiSllhMWFYa3JDcTsgdWRiX3VpZD0xMTk5NjY2OTEzNjQwOyB5eXVpZD0xMTk5NjY2OTEzNjQwOyB1ZGJfcGFzc3BvcnQ9aHlfMzAwMDI2NTk1OyB1c2VybmFtZT1oeV8zMDAwMjY1OTU7IHVkYl92ZXJzaW9uPTEuMDsgdWRiX2JpenRva2VuPUFRQktoYXdJUDdZSWFSNnpHamQ3elJvZEd6em1uSEJadzUtM0FtMVNmYWJXUC1JQmdSbjRiX0tMNWU3b3c5azhHT2xON0xoVzIxUmI2QzB6OGxBM3hTeUo4UUVXejY1UVNkZllqZmtveVJjV1diSHhiY0p4UUowNTdfNFc2a3YxWTQ3ZDNscXhIbkFTX3ljM3JienVuOU9ERGI1VmZJYk4tZG1EUldydUo4Vk1VNEJUbTVESUtkQXQ2UU04VDdILWRERzZrNS1tbmp1eHFUVDNVTWFDQ09uckM0ckpfSmJhZy1WbkxqaWpyXzRfUUpqQXh3MnBKQXFLNUs1SHQtSlZKNTBWejdHMEl2VVFvaUxtZ2dQU3pldk5mclBJUWdtTFQwWkJKZFJaeHZTU1gxOVZ1VjZGZmRnYlBWQzVmanNueE8wT3AzeVFIODdJbWVoa3h3bktLbjlDOyB1ZGJfb3JpZ2luPTA7IHVkYl9zdGF0dXM9MTsgX195YXNtaWQ9MC4xNDY4OTc1OTkyMTU5OTY2NTsgX195YW1pZF90dDE9MC4xNDY4OTc1OTkyMTU5OTY2NTsgX195YW1pZF9uZXc9Q0JDQTJEQzkyM0UwMDAwMURCMTUxRjYwNEMyNUU1QTA7IGh1eWFfaGRfcmVwX2NudD0yOyBfX3lhb2xkeXl1aWQ9MTE5OTY2NjkxMzY0MDsgX3lhc2lkcz1fX3Jvb3RzaWQlM0RDQkNBMkRDOTI1MDAwMDAxNTVCMDExMjAxRjAwQzY5MDsgZ3VpZD0wYTg5NWZjYTllZGQ4ZDZhMzIwMTQwMDE0MTAxYzNmNDsgaHV5YV93ZWJfcmVwX2NudD0yMDsgSG1fbHZ0XzUxNzAwYjZjNzIyZjViYjRjZjM5OTA2YTU5NmVhNDFmPTE3ODc2ODIyMDc7IEhtX2xwdnRfNTE3MDBiNmM3MjJmNWJiNGNmMzk5MDZhNTk2ZWE0MWY9MTc4NzY4MjIwNzsgSE1BQ0NPVU5UPTg1NzI2QkIwMTE0NkM2NzdcZgALEQibC4yYDKgMLDYlMTdkMTRiNTQ2OGY5NGZlZToxN2QxNGI1NDY4Zjk0ZmVlOjA6MExcZgA=",
"AAMdAAA/AAAAPxADLDxAClYId2ViQWN0VUlmCmdldEFjdEluZm99AAAWCAABBgR0UmVxHQAACQoBYi8WACYAC4yYDKgMLDYlYzRhODA4NTkzMWNlNDFjMDpjNGE4MDg1OTMxY2U0MWMwOjA6MExcZgA=",
"AAMdAAEE+AAABPgQAyw8QAtWCHdlYkFjdFVJZhBnZXRBY3RUYXNrRGV0YWlsfQABBMgIAAEGBHRSZXEdAAEEugoKAwAAARdRuGFoFgAmADYid2ViaDUmMC4wLjEmd2Vic29ja2V0JiZkaXlwY181Mjc3NUcAAAR6aHV5YV91YT13ZWJoNSYwLjAuMSZ3ZWJzb2NrZXQmJmRpeXBjXzUyNzc1O3dlYl9xcmxvZ2luX2NvbmZpcm1faWQ9NDE0NTdmZTEtODI5Ni00ODJiLWIyNzQtZjNkNzY1M2FkZWI3O3VkYl9jcmVkPUNoQWdGZjRTZmNBbkR5bDV1alczdk8yMS10MWE3d0M0dE5xY1g4RElNVE4yU002QXFKLV9UU0xvNHBEbmpmYUVjWGdZWWV2RVl0dWZjU25SV1oya1BEVlFjenNob0xYTFNTNkktNU5RQ21DdVVDLWVRT1QzY1dIZlJzREdQVkYwaVlRQ1NtSWhrVzBQYmJKWWExYVhrckNxO3VkYl91aWQ9MTE5OTY2NjkxMzY0MDt5eXVpZD0xMTk5NjY2OTEzNjQwO3VkYl9wYXNzcG9ydD1oeV8zMDAwMjY1OTU7dXNlcm5hbWU9aHlfMzAwMDI2NTk1O3VkYl92ZXJzaW9uPTEuMDt1ZGJfYml6dG9rZW49QVFCS2hhd0lQN1lJYVI2ekdqZDd6Um9kR3p6bW5IQlp3NS0zQW0xU2ZhYldQLUlCZ1JuNGJfS0w1ZTdvdzlrOEdPbE43TGhXMjFSYjZDMHo4bEEzeFN5SjhRRVd6NjVRU2RmWWpma295UmNXV2JIeGJjSnhRSjA1N180VzZrdjFZNDdkM2xxeEhuQVNfeWMzcmJ6dW45T0REYjVWZkliTi1kbURSV3J1SjhWTVU0QlRtNURJS2RBdDZRTThUN0gtZERHNms1LW1uanV4cVRUM1VNYUNDT25yQzRySl9KYmFnLVZuTGppanJfNF9RSmpBeHcycEpBcUs1SzVIdC1KVko1MFZ6N0cwSXZVUW9pTG1nZ1BTemV2TmZyUElRZ21MVDBaQkpkUlp4dlNTWDE5VnVWNkZmZGdiUFZDNWZqc254TzBPcDN5UUg4N0ltZWhreHduS0tuOUM7dWRiX29yaWdpbj0wO3VkYl9zdGF0dXM9MTtfX3lhc21pZD0wLjE0Njg5NzU5OTIxNTk5NjY1O19feWFtaWRfdHQxPTAuMTQ2ODk3NTk5MjE1OTk2NjU7X195YW1pZF9uZXc9Q0JDQTJEQzkyM0UwMDAwMURCMTUxRjYwNEMyNUU1QTA7aHV5YV9oZF9yZXBfY250PTI7X195YW9sZHl5dWlkPTExOTk2NjY5MTM2NDA7X3lhc2lkcz1fX3Jvb3RzaWQlM0RDQkNBMkRDOTI1MDAwMDAxNTVCMDExMjAxRjAwQzY5MDtndWlkPTBhODk1ZmNhOWVkZDhkNmEzMjAxNDAwMTQxMDFjM2Y0O2h1eWFfd2ViX3JlcF9jbnQ9MjA7SG1fbHZ0XzUxNzAwYjZjNzIyZjViYjRjZjM5OTA2YTU5NmVhNDFmPTE3ODc2ODIyMDc7SG1fbHB2dF81MTcwMGI2YzcyMmY1YmI0Y2YzOTkwNmE1OTZlYTQxZj0xNzg3NjgyMjA3O0hNQUNDT1VOVD04NTcyNkJCMDExNDZDNjc3XGYACxFiLwuMmAyoDCw2JWQwZWI3MDE3MDlhZDgwMTE6ZDBlYjcwMTcwOWFkODAxMTowOjBMXGYA",
"AAMdAAEFBQAABQUQAyw8QAxWBXd1cHVpZiFnZXRVc2VyRm9sbG93V2VDaGF0T2ZmaWNpYWxTdGF0dXN9AAEExwgAAQYEdFJlcR0AAQS5CgoDAAABF1G4YWgWACYANiJ3ZWJoNSYwLjAuMSZ3ZWJzb2NrZXQmJmRpeXBjXzUyNzc1RwAABHpodXlhX3VhPXdlYmg1JjAuMC4xJndlYnNvY2tldCYmZGl5cGNfNTI3NzU7d2ViX3FybG9naW5fY29uZmlybV9pZD00MTQ1N2ZlMS04Mjk2LTQ4MmItYjI3NC1mM2Q3NjUzYWRlYjc7dWRiX2NyZWQ9Q2hBZ0ZmNFNmY0FuRHlsNXVqVzN2TzIxLXQxYTd3QzR0TnFjWDhESU1UTjJTTTZBcUotX1RTTG80cERuamZhRWNYZ1lZZXZFWXR1ZmNTblJXWjJrUERWUWN6c2hvTFhMU1M2SS01TlFDbUN1VUMtZVFPVDNjV0hmUnNER1BWRjBpWVFDU21JaGtXMFBiYkpZYTFhWGtyQ3E7dWRiX3VpZD0xMTk5NjY2OTEzNjQwO3l5dWlkPTExOTk2NjY5MTM2NDA7dWRiX3Bhc3Nwb3J0PWh5XzMwMDAyNjU5NTt1c2VybmFtZT1oeV8zMDAwMjY1OTU7dWRiX3ZlcnNpb249MS4wO3VkYl9iaXp0b2tlbj1BUUJLaGF3SVA3WUlhUjZ6R2pkN3pSb2RHenptbkhCWnc1LTNBbTFTZmFiV1AtSUJnUm40Yl9LTDVlN293OWs4R09sTjdMaFcyMVJiNkMwejhsQTN4U3lKOFFFV3o2NVFTZGZZamZrb3lSY1dXYkh4YmNKeFFKMDU3XzRXNmt2MVk0N2QzbHF4SG5BU195YzNyYnp1bjlPRERiNVZmSWJOLWRtRFJXcnVKOFZNVTRCVG01RElLZEF0NlFNOFQ3SC1kREc2azUtbW5qdXhxVFQzVU1hQ0NPbnJDNHJKX0piYWctVm5Mamlqcl80X1FKakF4dzJwSkFxSzVLNUh0LUpWSjUwVno3RzBJdlVRb2lMbWdnUFN6ZXZOZnJQSVFnbUxUMFpCSmRSWnh2U1NYMTlWdVY2RmZkZ2JQVkM1ZmpzbnhPME9wM3lRSDg3SW1laGt4d25LS245Qzt1ZGJfb3JpZ2luPTA7dWRiX3N0YXR1cz0xO19feWFzbWlkPTAuMTQ2ODk3NTk5MjE1OTk2NjU7X195YW1pZF90dDE9MC4xNDY4OTc1OTkyMTU5OTY2NTtfX3lhbWlkX25ldz1DQkNBMkRDOTIzRTAwMDAxREIxNTFGNjA0QzI1RTVBMDtodXlhX2hkX3JlcF9jbnQ9MjtfX3lhb2xkeXl1aWQ9MTE5OTY2NjkxMzY0MDtfeWFzaWRzPV9fcm9vdHNpZCUzRENCQ0EyREM5MjUwMDAwMDE1NUIwMTEyMDFGMDBDNjkwO2d1aWQ9MGE4OTVmY2E5ZWRkOGQ2YTMyMDE0MDAxNDEwMWMzZjQ7SG1fbHZ0XzUxNzAwYjZjNzIyZjViYjRjZjM5OTA2YTU5NmVhNDFmPTE3ODc2ODIyMDc7SG1fbHB2dF81MTcwMGI2YzcyMmY1YmI0Y2YzOTkwNmE1OTZlYTQxZj0xNzg3NjgyMjA3O0hNQUNDT1VOVD04NTcyNkJCMDExNDZDNjc3O2h1eWFfd2ViX3JlcF9jbnQ9MjFcZgALEAELjJgMqAwsNiVkMzQ0NWYzMTFmMDg5NDdjOmQzNDQ1ZjMxMWYwODk0N2M6MDowTFxmAA==",
"AAMdAAEE/AAABPwQAyw8QA1WCHdlYkFjdFVJZhRnZXRBY3RVc2VyVGFza0RldGFpbH0AAQTICAABBgR0UmVxHQABBLoKCgMAAAEXUbhhaBYAJgA2IndlYmg1JjAuMC4xJndlYnNvY2tldCYmZGl5cGNfNTI3NzVHAAAEemh1eWFfdWE9d2ViaDUmMC4wLjEmd2Vic29ja2V0JiZkaXlwY181Mjc3NTt3ZWJfcXJsb2dpbl9jb25maXJtX2lkPTQxNDU3ZmUxLTgyOTYtNDgyYi1iMjc0LWYzZDc2NTNhZGViNzt1ZGJfY3JlZD1DaEFnRmY0U2ZjQW5EeWw1dWpXM3ZPMjEtdDFhN3dDNHROcWNYOERJTVROMlNNNkFxSi1fVFNMbzRwRG5qZmFFY1hnWVlldkVZdHVmY1NuUldaMmtQRFZRY3pzaG9MWExTUzZJLTVOUUNtQ3VVQy1lUU9UM2NXSGZSc0RHUFZGMGlZUUNTbUloa1cwUGJiSllhMWFYa3JDcTt1ZGJfdWlkPTExOTk2NjY5MTM2NDA7eXl1aWQ9MTE5OTY2NjkxMzY0MDt1ZGJfcGFzc3BvcnQ9aHlfMzAwMDI2NTk1O3VzZXJuYW1lPWh5XzMwMDAyNjU5NTt1ZGJfdmVyc2lvbj0xLjA7dWRiX2JpenRva2VuPUFRQktoYXdJUDdZSWFSNnpHamQ3elJvZEd6em1uSEJadzUtM0FtMVNmYWJXUC1JQmdSbjRiX0tMNWU3b3c5azhHT2xON0xoVzIxUmI2QzB6OGxBM3hTeUo4UUVXejY1UVNkZllqZmtveVJjV1diSHhiY0p4UUowNTdfNFc2a3YxWTQ3ZDNscXhIbkFTX3ljM3JienVuOU9ERGI1VmZJYk4tZG1EUldydUo4Vk1VNEJUbTVESUtkQXQ2UU04VDdILWRERzZrNS1tbmp1eHFUVDNVTWFDQ09uckM0ckpfSmJhZy1WbkxqaWpyXzRfUUpqQXh3MnBKQXFLNUs1SHQtSlZKNTBWejdHMEl2VVFvaUxtZ2dQU3pldk5mclBJUWdtTFQwWkJKZFJaeHZTU1gxOVZ1VjZGZmRnYlBWQzVmanNueE8wT3AzeVFIODdJbWVoa3h3bktLbjlDO3VkYl9vcmlnaW49MDt1ZGJfc3RhdHVzPTE7X195YXNtaWQ9MC4xNDY4OTc1OTkyMTU5OTY2NTtfX3lhbWlkX3R0MT0wLjE0Njg5NzU5OTIxNTk5NjY1O19feWFtaWRfbmV3PUNCQ0EyREM5MjNFMDAwMDFEQjE1MUY2MDRDMjVFNUEwO2h1eWFfaGRfcmVwX2NudD0yO19feWFvbGR5eXVpZD0xMTk5NjY2OTEzNjQwO195YXNpZHM9X19yb290c2lkJTNEQ0JDQTJEQzkyNTAwMDAwMTU1QjAxMTIwMUYwMEM2OTA7Z3VpZD0wYTg5NWZjYTllZGQ4ZDZhMzIwMTQwMDE0MTAxYzNmNDtodXlhX3dlYl9yZXBfY250PTIwO0htX2x2dF81MTcwMGI2YzcyMmY1YmI0Y2YzOTkwNmE1OTZlYTQxZj0xNzg3NjgyMjA3O0htX2xwdnRfNTE3MDBiNmM3MjJmNWJiNGNmMzk5MDZhNTk2ZWE0MWY9MTc4NzY4MjIwNztITUFDQ09VTlQ9ODU3MjZCQjAxMTQ2QzY3N1xmAAsRYi8LjJgMqAwsNiVhNzY2ZTE0NjgxN2Y2YjVlOmE3NjZlMTQ2ODE3ZjZiNWU6MDowTFxmAA==",
"ABAdAAANCQABBgZsaXZlOjAWACw2AExcZgA=",
"ABAdAAANCQABBgZsaXZlOjAWACw2AExcZgA=",
"ABAdAAANCQABBgZsaXZlOjAWACw2AExcZgA="
]
Binary file not shown.
+18
View File
@@ -0,0 +1,18 @@
[
"AAMdAAB9AAAAfRADLDxA/1YGbGF1bmNoZgh3c0xhdW5jaH0AAFgIAAEGBHRSZXEdAABLCgMAAAEXUbhaAhYAJiJ3ZWJoNSYwLjAuMSZ3ZWJzb2NrZXQmJmRpeXBjXzUyNzc1NgxIVVlBJlpIJjIwNTJKBgAWACYANgBGAAsLjJgMqAwsNgBMXGYA",
"AAodAAEEfgMAAAEXUbhaAhYid2ViaDUmMC4wLjEmd2Vic29ja2V0JiZkaXlwY181Mjc3NScAAAQ6aHV5YV91YT13ZWJoNSYwLjAuMSZ3ZWJzb2NrZXQmJmRpeXBjXzUyNzc1OyB3ZWJfcXJsb2dpbl9jb25maXJtX2lkPWY0ZmMwNTMyLTZiMjMtNGFkMi05NzNhLWYzZWU5YjZhOGJmZTsgdWRiX2NyZWQ9Q25DOG5qQ251dzBhWXRIeHQ1OW5vXy1MbGhOeE9ZbDFsU2tVYXhKYlBIbjRodE9TbG5PdlM5XzI5QnNjT3lJMzg0SnAwQjhBLWVQSExEZ3BJem5tNzZuSEg5dkZvSjBnemJRTmpnVndQeU1CVUxCREVqV3NXQ2VZbXBJcjFDaUIwSHBDX25xYTVLeElfR3JYckJfV2EyUkY7IHVkYl91aWQ9MTE5OTY2NjkxMTc0NjsgeXl1aWQ9MTE5OTY2NjkxMTc0NjsgdWRiX3Bhc3Nwb3J0PWh5XzMwMDAyNDcwODsgdXNlcm5hbWU9aHlfMzAwMDI0NzA4OyB1ZGJfdmVyc2lvbj0xLjA7IHVkYl9iaXp0b2tlbj1BUUJZMjAxN2R5VGQwV19TWkQxOWJkOVVUX0xrcXp1cDV5T2dnemxaWHJteHg3cTNZb2ZNQ2l2aGNMM3hOMHZZd1FIdzhnZEh3cXNZVUFhVXJPWm5FOUlrX0w5X2V4T2lxcmFkQlJQbXZ4eThmNVlqcUwxUG1iWmZCLUJraVc4d2lYSkJScUc5ZFNLbmdISGdhUnhDTzBnM0pRQndMb3Y0NElCOXI4TUtQdWtOVXZhUjQ3Rk1TR3ZYaHNwdXJPTDNnYUhzNXdHTW9abjNwOWlIY0hmQ3dpT2hRdXdRM3Z4X2liNjJOUFJQNlEycXNwdnpOb1pIb2RNT29zeXFISjNOZF9BcWdTXzhKZVVVcmFyY2NmaEZaZDZuWVo0NEZHbkpQaHhLSlc0QldSRVlSNHdEeS1SZHBqWmNqZmxKOVhQX25vQm5DSUZJQXpyZmxjSXQ4MFpJcm9RdDsgdWRiX29yaWdpbj0wOyB1ZGJfc3RhdHVzPTE7IHVkYl9vdGhlcj0lN0IlMjJsdCUyMiUzQSUyMjE3ODc2Mjg4ODI2NDYlMjIlMkMlMjJpc1JlbSUyMiUzQSUyMjElMjIlN0QtLS0tMTMwNTk5MDMxMTA7IF9feWFzbWlkPTAuMDQzNzY0MDEwMzEzODYzMTI7IF9feWFtaWRfdHQxPTAuMDQzNzY0MDEwMzEzODYzMTI7IF9feWFtaWRfbmV3PUNCQ0EyQTRBM0M2MDAwMDE2QTNGMTFDRjEzQjAxNkVBOyBodXlhX2hkX3JlcF9jbnQ9MjsgX195YW9sZHl5dWlkPTExOTk2NjY5MTE3NDY7IF95YXNpZHM9X19yb290c2lkJTNEQ0JDQTJBNEEzREIwMDAwMUM2NTNEMkQwQjJGMDE0QzM7IGh1eWFfd2ViX3JlcF9jbnQ9MTA2AEABVgxIVVlBJlpIJjIwNTIsNgBMXGYA",
"AAMdAAEEiQAABIkQAyw8QARWCG1vYmlsZXVpZglnZXRDb25maWd9AAEEYAgAAQYEdFJlcR0AAQRSCgoDAAABF1G4WgIWACYANiJ3ZWJoNSYwLjAuMSZ3ZWJzb2NrZXQmJmRpeXBjXzUyNzc1RwAABAlodXlhX3VhPXdlYmg1JjAuMC4xJndlYnNvY2tldCYmZGl5cGNfNTI3NzU7IHdlYl9xcmxvZ2luX2NvbmZpcm1faWQ9ZjRmYzA1MzItNmIyMy00YWQyLTk3M2EtZjNlZTliNmE4YmZlOyB1ZGJfY3JlZD1DbkM4bmpDbnV3MGFZdEh4dDU5bm9fLUxsaE54T1lsMWxTa1VheEpiUEhuNGh0T1Nsbk92UzlfMjlCc2NPeUkzODRKcDBCOEEtZVBITERncEl6bm03Nm5ISDl2Rm9KMGd6YlFOamdWd1B5TUJVTEJERWpXc1dDZVltcElyMUNpQjBIcENfbnFhNUt4SV9HclhyQl9XYTJSRjsgdWRiX3VpZD0xMTk5NjY2OTExNzQ2OyB5eXVpZD0xMTk5NjY2OTExNzQ2OyB1ZGJfcGFzc3BvcnQ9aHlfMzAwMDI0NzA4OyB1c2VybmFtZT1oeV8zMDAwMjQ3MDg7IHVkYl92ZXJzaW9uPTEuMDsgdWRiX2JpenRva2VuPUFRQlkyMDE3ZHlUZDBXX1NaRDE5YmQ5VVRfTGtxenVwNXlPZ2d6bFpYcm14eDdxM1lvZk1DaXZoY0wzeE4wdll3UUh3OGdkSHdxc1lVQWFVck9abkU5SWtfTDlfZXhPaXFyYWRCUlBtdnh5OGY1WWpxTDFQbWJaZkItQmtpVzh3aVhKQlJxRzlkU0tuZ0hIZ2FSeENPMGczSlFCd0xvdjQ0SUI5cjhNS1B1a05VdmFSNDdGTVNHdlhoc3B1ck9MM2dhSHM1d0dNb1puM3A5aUhjSGZDd2lPaFF1d1EzdnhfaWI2Mk5QUlA2UTJxc3B2ek5vWkhvZE1Pb3N5cUhKM05kX0FxZ1NfOEplVVVyYXJjY2ZoRlpkNm5ZWjQ0RkduSlBoeEtKVzRCV1JFWVI0d0R5LVJkcGpaY2pmbEo5WFBfbm9CbkNJRklBenJmbGNJdDgwWklyb1F0OyB1ZGJfb3JpZ2luPTA7IHVkYl9zdGF0dXM9MTsgdWRiX290aGVyPSU3QiUyMmx0JTIyJTNBJTIyMTc4NzYyODg4MjY0NiUyMiUyQyUyMmlzUmVtJTIyJTNBJTIyMSUyMiU3RC0tLS0xMzA1OTkwMzExMDsgX195YXNtaWQ9MC4wNDM3NjQwMTAzMTM4NjMxMjsgX195YW1pZF90dDE9MC4wNDM3NjQwMTAzMTM4NjMxMjsgX195YW1pZF9uZXc9Q0JDQTJBNEEzQzYwMDAwMTZBM0YxMUNGMTNCMDE2RUE7IF95YXNpZHM9X19yb290c2lkJTNEQ0JDQTJBNEEzQzcwMDAwMUU3QTZFMzY5QzNGMDc3ODA7IGh1eWFfaGRfcmVwX2NudD0yXGYAdgALGAwmBGh1eWE5DAuMmAyoDCw2JWM0ZWRkZDc1YmQ5ZmYwN2Y6YzRlZGRkNzViZDlmZjA3ZjowOjBMXGYA",
"AAMdAAB9AAAAfRADLDxA/1YGbGF1bmNoZgh3c0xhdW5jaH0AAFgIAAEGBHRSZXEdAABLCgMAAAEXUbhaAhYAJiJ3ZWJoNSYwLjAuMSZ3ZWJzb2NrZXQmJmRpeXBjXzUyNzc1NgxIVVlBJlpIJjIwNTJKBgAWACYANgBGAAsLjJgMqAwsNgBMXGYA",
"AAodAAEEfgMAAAEXUbhaAhYid2ViaDUmMC4wLjEmd2Vic29ja2V0JiZkaXlwY181Mjc3NScAAAQ6aHV5YV91YT13ZWJoNSYwLjAuMSZ3ZWJzb2NrZXQmJmRpeXBjXzUyNzc1OyB3ZWJfcXJsb2dpbl9jb25maXJtX2lkPWY0ZmMwNTMyLTZiMjMtNGFkMi05NzNhLWYzZWU5YjZhOGJmZTsgdWRiX2NyZWQ9Q25DOG5qQ251dzBhWXRIeHQ1OW5vXy1MbGhOeE9ZbDFsU2tVYXhKYlBIbjRodE9TbG5PdlM5XzI5QnNjT3lJMzg0SnAwQjhBLWVQSExEZ3BJem5tNzZuSEg5dkZvSjBnemJRTmpnVndQeU1CVUxCREVqV3NXQ2VZbXBJcjFDaUIwSHBDX25xYTVLeElfR3JYckJfV2EyUkY7IHVkYl91aWQ9MTE5OTY2NjkxMTc0NjsgeXl1aWQ9MTE5OTY2NjkxMTc0NjsgdWRiX3Bhc3Nwb3J0PWh5XzMwMDAyNDcwODsgdXNlcm5hbWU9aHlfMzAwMDI0NzA4OyB1ZGJfdmVyc2lvbj0xLjA7IHVkYl9iaXp0b2tlbj1BUUJZMjAxN2R5VGQwV19TWkQxOWJkOVVUX0xrcXp1cDV5T2dnemxaWHJteHg3cTNZb2ZNQ2l2aGNMM3hOMHZZd1FIdzhnZEh3cXNZVUFhVXJPWm5FOUlrX0w5X2V4T2lxcmFkQlJQbXZ4eThmNVlqcUwxUG1iWmZCLUJraVc4d2lYSkJScUc5ZFNLbmdISGdhUnhDTzBnM0pRQndMb3Y0NElCOXI4TUtQdWtOVXZhUjQ3Rk1TR3ZYaHNwdXJPTDNnYUhzNXdHTW9abjNwOWlIY0hmQ3dpT2hRdXdRM3Z4X2liNjJOUFJQNlEycXNwdnpOb1pIb2RNT29zeXFISjNOZF9BcWdTXzhKZVVVcmFyY2NmaEZaZDZuWVo0NEZHbkpQaHhLSlc0QldSRVlSNHdEeS1SZHBqWmNqZmxKOVhQX25vQm5DSUZJQXpyZmxjSXQ4MFpJcm9RdDsgdWRiX29yaWdpbj0wOyB1ZGJfc3RhdHVzPTE7IHVkYl9vdGhlcj0lN0IlMjJsdCUyMiUzQSUyMjE3ODc2Mjg4ODI2NDYlMjIlMkMlMjJpc1JlbSUyMiUzQSUyMjElMjIlN0QtLS0tMTMwNTk5MDMxMTA7IF9feWFzbWlkPTAuMDQzNzY0MDEwMzEzODYzMTI7IF9feWFtaWRfdHQxPTAuMDQzNzY0MDEwMzEzODYzMTI7IF9feWFtaWRfbmV3PUNCQ0EyQTRBM0M2MDAwMDE2QTNGMTFDRjEzQjAxNkVBOyBodXlhX2hkX3JlcF9jbnQ9MjsgX195YW9sZHl5dWlkPTExOTk2NjY5MTE3NDY7IF95YXNpZHM9X19yb290c2lkJTNEQ0JDQTJBNEEzREIwMDAwMUM2NTNEMkQwQjJGMDE0QzM7IGh1eWFfd2ViX3JlcF9jbnQ9MTM2AEABVgxIVVlBJlpIJjIwNTIsNgBMXGYA",
"AAMdAAEEiQAABIkQAyw8QAVWCG1vYmlsZXVpZglnZXRDb25maWd9AAEEYAgAAQYEdFJlcR0AAQRSCgoDAAABF1G4WgIWACYANiJ3ZWJoNSYwLjAuMSZ3ZWJzb2NrZXQmJmRpeXBjXzUyNzc1RwAABAlodXlhX3VhPXdlYmg1JjAuMC4xJndlYnNvY2tldCYmZGl5cGNfNTI3NzU7IHdlYl9xcmxvZ2luX2NvbmZpcm1faWQ9ZjRmYzA1MzItNmIyMy00YWQyLTk3M2EtZjNlZTliNmE4YmZlOyB1ZGJfY3JlZD1DbkM4bmpDbnV3MGFZdEh4dDU5bm9fLUxsaE54T1lsMWxTa1VheEpiUEhuNGh0T1Nsbk92UzlfMjlCc2NPeUkzODRKcDBCOEEtZVBITERncEl6bm03Nm5ISDl2Rm9KMGd6YlFOamdWd1B5TUJVTEJERWpXc1dDZVltcElyMUNpQjBIcENfbnFhNUt4SV9HclhyQl9XYTJSRjsgdWRiX3VpZD0xMTk5NjY2OTExNzQ2OyB5eXVpZD0xMTk5NjY2OTExNzQ2OyB1ZGJfcGFzc3BvcnQ9aHlfMzAwMDI0NzA4OyB1c2VybmFtZT1oeV8zMDAwMjQ3MDg7IHVkYl92ZXJzaW9uPTEuMDsgdWRiX2JpenRva2VuPUFRQlkyMDE3ZHlUZDBXX1NaRDE5YmQ5VVRfTGtxenVwNXlPZ2d6bFpYcm14eDdxM1lvZk1DaXZoY0wzeE4wdll3UUh3OGdkSHdxc1lVQWFVck9abkU5SWtfTDlfZXhPaXFyYWRCUlBtdnh5OGY1WWpxTDFQbWJaZkItQmtpVzh3aVhKQlJxRzlkU0tuZ0hIZ2FSeENPMGczSlFCd0xvdjQ0SUI5cjhNS1B1a05VdmFSNDdGTVNHdlhoc3B1ck9MM2dhSHM1d0dNb1puM3A5aUhjSGZDd2lPaFF1d1EzdnhfaWI2Mk5QUlA2UTJxc3B2ek5vWkhvZE1Pb3N5cUhKM05kX0FxZ1NfOEplVVVyYXJjY2ZoRlpkNm5ZWjQ0RkduSlBoeEtKVzRCV1JFWVI0d0R5LVJkcGpaY2pmbEo5WFBfbm9CbkNJRklBenJmbGNJdDgwWklyb1F0OyB1ZGJfb3JpZ2luPTA7IHVkYl9zdGF0dXM9MTsgdWRiX290aGVyPSU3QiUyMmx0JTIyJTNBJTIyMTc4NzYyODg4MjY0NiUyMiUyQyUyMmlzUmVtJTIyJTNBJTIyMSUyMiU3RC0tLS0xMzA1OTkwMzExMDsgX195YXNtaWQ9MC4wNDM3NjQwMTAzMTM4NjMxMjsgX195YW1pZF90dDE9MC4wNDM3NjQwMTAzMTM4NjMxMjsgX195YW1pZF9uZXc9Q0JDQTJBNEEzQzYwMDAwMTZBM0YxMUNGMTNCMDE2RUE7IF95YXNpZHM9X19yb290c2lkJTNEQ0JDQTJBNEEzQzcwMDAwMUU3QTZFMzY5QzNGMDc3ODA7IGh1eWFfaGRfcmVwX2NudD0yXGYAdgALGAwmBGh1eWE5DAuMmAyoDCw2JWUxYzA0ZWY0ODg4YjQ3NTg6ZTFjMDRlZjQ4ODhiNDc1ODowOjBMXGYA",
"AAMdAAEEqwAABKsQAyw8QAZWCUdhbWVCaXpVSWYVZ2V0UWlXZWlSZWxhdGlvbkJ5VWlkfQABBHUIAAEGBHRSZXEdAAEEZwoKAwAAARdRuFoCFgAmADYid2ViaDUmMC4wLjEmd2Vic29ja2V0JiZkaXlwY181Mjc3NUcAAAQoaHV5YV91YT13ZWJoNSYwLjAuMSZ3ZWJzb2NrZXQmJmRpeXBjXzUyNzc1O3dlYl9xcmxvZ2luX2NvbmZpcm1faWQ9ZjRmYzA1MzItNmIyMy00YWQyLTk3M2EtZjNlZTliNmE4YmZlO3VkYl9jcmVkPUNuQzhuakNudXcwYVl0SHh0NTlub18tTGxoTnhPWWwxbFNrVWF4SmJQSG40aHRPU2xuT3ZTOV8yOUJzY095STM4NEpwMEI4QS1lUEhMRGdwSXpubTc2bkhIOXZGb0owZ3piUU5qZ1Z3UHlNQlVMQkRFaldzV0NlWW1wSXIxQ2lCMEhwQ19ucWE1S3hJX0dyWHJCX1dhMlJGO3VkYl91aWQ9MTE5OTY2NjkxMTc0Njt5eXVpZD0xMTk5NjY2OTExNzQ2O3VkYl9wYXNzcG9ydD1oeV8zMDAwMjQ3MDg7dXNlcm5hbWU9aHlfMzAwMDI0NzA4O3VkYl92ZXJzaW9uPTEuMDt1ZGJfYml6dG9rZW49QVFCWTIwMTdkeVRkMFdfU1pEMTliZDlVVF9Ma3F6dXA1eU9nZ3psWlhybXh4N3EzWW9mTUNpdmhjTDN4TjB2WXdRSHc4Z2RId3FzWVVBYVVyT1puRTlJa19MOV9leE9pcXJhZEJSUG12eHk4ZjVZanFMMVBtYlpmQi1Ca2lXOHdpWEpCUnFHOWRTS25nSEhnYVJ4Q08wZzNKUUJ3TG92NDRJQjlyOE1LUHVrTlV2YVI0N0ZNU0d2WGhzcHVyT0wzZ2FIczV3R01vWm4zcDlpSGNIZkN3aU9oUXV3UTN2eF9pYjYyTlBSUDZRMnFzcHZ6Tm9aSG9kTU9vc3lxSEozTmRfQXFnU184SmVVVXJhcmNjZmhGWmQ2bllaNDRGR25KUGh4S0pXNEJXUkVZUjR3RHktUmRwalpjamZsSjlYUF9ub0JuQ0lGSUF6cmZsY0l0ODBaSXJvUXQ7dWRiX29yaWdpbj0wO3VkYl9zdGF0dXM9MTt1ZGJfb3RoZXI9JTdCJTIybHQlMjIlM0ElMjIxNzg3NjI4ODgyNjQ2JTIyJTJDJTIyaXNSZW0lMjIlM0ElMjIxJTIyJTdELS0tLTEzMDU5OTAzMTEwO19feWFzbWlkPTAuMDQzNzY0MDEwMzEzODYzMTI7X195YW1pZF90dDE9MC4wNDM3NjQwMTAzMTM4NjMxMjtfX3lhbWlkX25ldz1DQkNBMkE0QTNDNjAwMDAxNkEzRjExQ0YxM0IwMTZFQTtodXlhX2hkX3JlcF9jbnQ9MjtfX3lhb2xkeXl1aWQ9MTE5OTY2NjkxMTc0NjtfeWFzaWRzPV9fcm9vdHNpZCUzRENCQ0EyQTRBM0RCMDAwMDFDNjUzRDJEMEIyRjAxNEMzO2h1eWFfd2ViX3JlcF9jbnQ9MTNcZgB2AAsLjJgMqAwsNiU4ZmEzMzc2YzIzYTZhOWMxOjhmYTMzNzZjMjNhNmE5YzE6MDowTFxmAA==",
"AAMdAAB9AAAAfRADLDxA/1YGbGF1bmNoZgh3c0xhdW5jaH0AAFgIAAEGBHRSZXEdAABLCgMAAAEXUbhaAhYAJiJ3ZWJoNSYwLjAuMSZ3ZWJzb2NrZXQmJmRpeXBjXzUyNzc1NgxIVVlBJlpIJjIwNTJKBgAWACYANgBGAAsLjJgMqAwsNgBMXGYA",
"AAodAAEEfgMAAAEXUbhaAhYid2ViaDUmMC4wLjEmd2Vic29ja2V0JiZkaXlwY181Mjc3NScAAAQ6aHV5YV91YT13ZWJoNSYwLjAuMSZ3ZWJzb2NrZXQmJmRpeXBjXzUyNzc1OyB3ZWJfcXJsb2dpbl9jb25maXJtX2lkPWY0ZmMwNTMyLTZiMjMtNGFkMi05NzNhLWYzZWU5YjZhOGJmZTsgdWRiX2NyZWQ9Q25DOG5qQ251dzBhWXRIeHQ1OW5vXy1MbGhOeE9ZbDFsU2tVYXhKYlBIbjRodE9TbG5PdlM5XzI5QnNjT3lJMzg0SnAwQjhBLWVQSExEZ3BJem5tNzZuSEg5dkZvSjBnemJRTmpnVndQeU1CVUxCREVqV3NXQ2VZbXBJcjFDaUIwSHBDX25xYTVLeElfR3JYckJfV2EyUkY7IHVkYl91aWQ9MTE5OTY2NjkxMTc0NjsgeXl1aWQ9MTE5OTY2NjkxMTc0NjsgdWRiX3Bhc3Nwb3J0PWh5XzMwMDAyNDcwODsgdXNlcm5hbWU9aHlfMzAwMDI0NzA4OyB1ZGJfdmVyc2lvbj0xLjA7IHVkYl9iaXp0b2tlbj1BUUJZMjAxN2R5VGQwV19TWkQxOWJkOVVUX0xrcXp1cDV5T2dnemxaWHJteHg3cTNZb2ZNQ2l2aGNMM3hOMHZZd1FIdzhnZEh3cXNZVUFhVXJPWm5FOUlrX0w5X2V4T2lxcmFkQlJQbXZ4eThmNVlqcUwxUG1iWmZCLUJraVc4d2lYSkJScUc5ZFNLbmdISGdhUnhDTzBnM0pRQndMb3Y0NElCOXI4TUtQdWtOVXZhUjQ3Rk1TR3ZYaHNwdXJPTDNnYUhzNXdHTW9abjNwOWlIY0hmQ3dpT2hRdXdRM3Z4X2liNjJOUFJQNlEycXNwdnpOb1pIb2RNT29zeXFISjNOZF9BcWdTXzhKZVVVcmFyY2NmaEZaZDZuWVo0NEZHbkpQaHhLSlc0QldSRVlSNHdEeS1SZHBqWmNqZmxKOVhQX25vQm5DSUZJQXpyZmxjSXQ4MFpJcm9RdDsgdWRiX29yaWdpbj0wOyB1ZGJfc3RhdHVzPTE7IHVkYl9vdGhlcj0lN0IlMjJsdCUyMiUzQSUyMjE3ODc2Mjg4ODI2NDYlMjIlMkMlMjJpc1JlbSUyMiUzQSUyMjElMjIlN0QtLS0tMTMwNTk5MDMxMTA7IF9feWFzbWlkPTAuMDQzNzY0MDEwMzEzODYzMTI7IF9feWFtaWRfdHQxPTAuMDQzNzY0MDEwMzEzODYzMTI7IF9feWFtaWRfbmV3PUNCQ0EyQTRBM0M2MDAwMDE2QTNGMTFDRjEzQjAxNkVBOyBodXlhX2hkX3JlcF9jbnQ9MjsgX195YW9sZHl5dWlkPTExOTk2NjY5MTE3NDY7IF95YXNpZHM9X19yb290c2lkJTNEQ0JDQTJBNEEzREIwMDAwMUM2NTNEMkQwQjJGMDE0QzM7IGh1eWFfd2ViX3JlcF9jbnQ9MTQ2AEABVgxIVVlBJlpIJjIwNTIsNgBMXGYA",
"AAMdAAEEugAABLoQAyw8QANWCG1vYmlsZXVpZglnZXRDb25maWd9AAEEkQgAAQYEdFJlcR0AAQSDCgoDAAABF1G4WgIWACYANiJ3ZWJoNSYwLjAuMSZ3ZWJzb2NrZXQmJmRpeXBjXzUyNzc1RwAABDpodXlhX3VhPXdlYmg1JjAuMC4xJndlYnNvY2tldCYmZGl5cGNfNTI3NzU7IHdlYl9xcmxvZ2luX2NvbmZpcm1faWQ9ZjRmYzA1MzItNmIyMy00YWQyLTk3M2EtZjNlZTliNmE4YmZlOyB1ZGJfY3JlZD1DbkM4bmpDbnV3MGFZdEh4dDU5bm9fLUxsaE54T1lsMWxTa1VheEpiUEhuNGh0T1Nsbk92UzlfMjlCc2NPeUkzODRKcDBCOEEtZVBITERncEl6bm03Nm5ISDl2Rm9KMGd6YlFOamdWd1B5TUJVTEJERWpXc1dDZVltcElyMUNpQjBIcENfbnFhNUt4SV9HclhyQl9XYTJSRjsgdWRiX3VpZD0xMTk5NjY2OTExNzQ2OyB5eXVpZD0xMTk5NjY2OTExNzQ2OyB1ZGJfcGFzc3BvcnQ9aHlfMzAwMDI0NzA4OyB1c2VybmFtZT1oeV8zMDAwMjQ3MDg7IHVkYl92ZXJzaW9uPTEuMDsgdWRiX2JpenRva2VuPUFRQlkyMDE3ZHlUZDBXX1NaRDE5YmQ5VVRfTGtxenVwNXlPZ2d6bFpYcm14eDdxM1lvZk1DaXZoY0wzeE4wdll3UUh3OGdkSHdxc1lVQWFVck9abkU5SWtfTDlfZXhPaXFyYWRCUlBtdnh5OGY1WWpxTDFQbWJaZkItQmtpVzh3aVhKQlJxRzlkU0tuZ0hIZ2FSeENPMGczSlFCd0xvdjQ0SUI5cjhNS1B1a05VdmFSNDdGTVNHdlhoc3B1ck9MM2dhSHM1d0dNb1puM3A5aUhjSGZDd2lPaFF1d1EzdnhfaWI2Mk5QUlA2UTJxc3B2ek5vWkhvZE1Pb3N5cUhKM05kX0FxZ1NfOEplVVVyYXJjY2ZoRlpkNm5ZWjQ0RkduSlBoeEtKVzRCV1JFWVI0d0R5LVJkcGpaY2pmbEo5WFBfbm9CbkNJRklBenJmbGNJdDgwWklyb1F0OyB1ZGJfb3JpZ2luPTA7IHVkYl9zdGF0dXM9MTsgdWRiX290aGVyPSU3QiUyMmx0JTIyJTNBJTIyMTc4NzYyODg4MjY0NiUyMiUyQyUyMmlzUmVtJTIyJTNBJTIyMSUyMiU3RC0tLS0xMzA1OTkwMzExMDsgX195YXNtaWQ9MC4wNDM3NjQwMTAzMTM4NjMxMjsgX195YW1pZF90dDE9MC4wNDM3NjQwMTAzMTM4NjMxMjsgX195YW1pZF9uZXc9Q0JDQTJBNEEzQzYwMDAwMTZBM0YxMUNGMTNCMDE2RUE7IGh1eWFfaGRfcmVwX2NudD0yOyBfX3lhb2xkeXl1aWQ9MTE5OTY2NjkxMTc0NjsgX3lhc2lkcz1fX3Jvb3RzaWQlM0RDQkNBMkE0QTNEQjAwMDAxQzY1M0QyRDBCMkYwMTRDMzsgaHV5YV93ZWJfcmVwX2NudD0xMFxmAHYACxgMJgRodXlhOQwLjJgMqAwsNiU4OTFjZDNkMDYwMWY4YjYzOjg5MWNkM2QwNjAxZjhiNjM6MDowTFxmAA==",
"AAMdAAEEqwAABKsQAyw8QAdWCUdhbWVCaXpVSWYVZ2V0UWlXZWlSZWxhdGlvbkJ5VWlkfQABBHUIAAEGBHRSZXEdAAEEZwoKAwAAARdRuFoCFgAmADYid2ViaDUmMC4wLjEmd2Vic29ja2V0JiZkaXlwY181Mjc3NUcAAAQoaHV5YV91YT13ZWJoNSYwLjAuMSZ3ZWJzb2NrZXQmJmRpeXBjXzUyNzc1O3dlYl9xcmxvZ2luX2NvbmZpcm1faWQ9ZjRmYzA1MzItNmIyMy00YWQyLTk3M2EtZjNlZTliNmE4YmZlO3VkYl9jcmVkPUNuQzhuakNudXcwYVl0SHh0NTlub18tTGxoTnhPWWwxbFNrVWF4SmJQSG40aHRPU2xuT3ZTOV8yOUJzY095STM4NEpwMEI4QS1lUEhMRGdwSXpubTc2bkhIOXZGb0owZ3piUU5qZ1Z3UHlNQlVMQkRFaldzV0NlWW1wSXIxQ2lCMEhwQ19ucWE1S3hJX0dyWHJCX1dhMlJGO3VkYl91aWQ9MTE5OTY2NjkxMTc0Njt5eXVpZD0xMTk5NjY2OTExNzQ2O3VkYl9wYXNzcG9ydD1oeV8zMDAwMjQ3MDg7dXNlcm5hbWU9aHlfMzAwMDI0NzA4O3VkYl92ZXJzaW9uPTEuMDt1ZGJfYml6dG9rZW49QVFCWTIwMTdkeVRkMFdfU1pEMTliZDlVVF9Ma3F6dXA1eU9nZ3psWlhybXh4N3EzWW9mTUNpdmhjTDN4TjB2WXdRSHc4Z2RId3FzWVVBYVVyT1puRTlJa19MOV9leE9pcXJhZEJSUG12eHk4ZjVZanFMMVBtYlpmQi1Ca2lXOHdpWEpCUnFHOWRTS25nSEhnYVJ4Q08wZzNKUUJ3TG92NDRJQjlyOE1LUHVrTlV2YVI0N0ZNU0d2WGhzcHVyT0wzZ2FIczV3R01vWm4zcDlpSGNIZkN3aU9oUXV3UTN2eF9pYjYyTlBSUDZRMnFzcHZ6Tm9aSG9kTU9vc3lxSEozTmRfQXFnU184SmVVVXJhcmNjZmhGWmQ2bllaNDRGR25KUGh4S0pXNEJXUkVZUjR3RHktUmRwalpjamZsSjlYUF9ub0JuQ0lGSUF6cmZsY0l0ODBaSXJvUXQ7dWRiX29yaWdpbj0wO3VkYl9zdGF0dXM9MTt1ZGJfb3RoZXI9JTdCJTIybHQlMjIlM0ElMjIxNzg3NjI4ODgyNjQ2JTIyJTJDJTIyaXNSZW0lMjIlM0ElMjIxJTIyJTdELS0tLTEzMDU5OTAzMTEwO19feWFzbWlkPTAuMDQzNzY0MDEwMzEzODYzMTI7X195YW1pZF90dDE9MC4wNDM3NjQwMTAzMTM4NjMxMjtfX3lhbWlkX25ldz1DQkNBMkE0QTNDNjAwMDAxNkEzRjExQ0YxM0IwMTZFQTtodXlhX2hkX3JlcF9jbnQ9MjtfX3lhb2xkeXl1aWQ9MTE5OTY2NjkxMTc0NjtfeWFzaWRzPV9fcm9vdHNpZCUzRENCQ0EyQTRBM0RCMDAwMDFDNjUzRDJEMEIyRjAxNEMzO2h1eWFfd2ViX3JlcF9jbnQ9MTNcZgB2AAsLjJgMqAwsNiVlODc4NGM1YmM2ODdhYjM2OmU4Nzg0YzViYzY4N2FiMzY6MDowTFxmAA==",
"AAMdAAEE3QAABN0QAyw8QAhWCHdlYkFjdFVJZhhjaGVja1VzZXJCaW5kR2FtZUFjY291bnR9AAEEpQgAAQYEdFJlcR0AAQSXCgoDAAABF1G4WgIWACYANiJ3ZWJoNSYwLjAuMSZ3ZWJzb2NrZXQmJmRpeXBjXzUyNzc1RwAABE5odXlhX3VhPXdlYmg1JjAuMC4xJndlYnNvY2tldCYmZGl5cGNfNTI3NzU7d2ViX3FybG9naW5fY29uZmlybV9pZD1mNGZjMDUzMi02YjIzLTRhZDItOTczYS1mM2VlOWI2YThiZmU7dWRiX2NyZWQ9Q25DOG5qQ251dzBhWXRIeHQ1OW5vXy1MbGhOeE9ZbDFsU2tVYXhKYlBIbjRodE9TbG5PdlM5XzI5QnNjT3lJMzg0SnAwQjhBLWVQSExEZ3BJem5tNzZuSEg5dkZvSjBnemJRTmpnVndQeU1CVUxCREVqV3NXQ2VZbXBJcjFDaUIwSHBDX25xYTVLeElfR3JYckJfV2EyUkY7dWRiX3VpZD0xMTk5NjY2OTExNzQ2O3l5dWlkPTExOTk2NjY5MTE3NDY7dWRiX3Bhc3Nwb3J0PWh5XzMwMDAyNDcwODt1c2VybmFtZT1oeV8zMDAwMjQ3MDg7dWRiX3ZlcnNpb249MS4wO3VkYl9iaXp0b2tlbj1BUUJZMjAxN2R5VGQwV19TWkQxOWJkOVVUX0xrcXp1cDV5T2dnemxaWHJteHg3cTNZb2ZNQ2l2aGNMM3hOMHZZd1FIdzhnZEh3cXNZVUFhVXJPWm5FOUlrX0w5X2V4T2lxcmFkQlJQbXZ4eThmNVlqcUwxUG1iWmZCLUJraVc4d2lYSkJScUc5ZFNLbmdISGdhUnhDTzBnM0pRQndMb3Y0NElCOXI4TUtQdWtOVXZhUjQ3Rk1TR3ZYaHNwdXJPTDNnYUhzNXdHTW9abjNwOWlIY0hmQ3dpT2hRdXdRM3Z4X2liNjJOUFJQNlEycXNwdnpOb1pIb2RNT29zeXFISjNOZF9BcWdTXzhKZVVVcmFyY2NmaEZaZDZuWVo0NEZHbkpQaHhLSlc0QldSRVlSNHdEeS1SZHBqWmNqZmxKOVhQX25vQm5DSUZJQXpyZmxjSXQ4MFpJcm9RdDt1ZGJfb3JpZ2luPTA7dWRiX3N0YXR1cz0xO3VkYl9vdGhlcj0lN0IlMjJsdCUyMiUzQSUyMjE3ODc2Mjg4ODI2NDYlMjIlMkMlMjJpc1JlbSUyMiUzQSUyMjElMjIlN0QtLS0tMTMwNTk5MDMxMTA7X195YXNtaWQ9MC4wNDM3NjQwMTAzMTM4NjMxMjtfX3lhbWlkX3R0MT0wLjA0Mzc2NDAxMDMxMzg2MzEyO19feWFtaWRfbmV3PUNCQ0EyQTRBM0M2MDAwMDE2QTNGMTFDRjEzQjAxNkVBO2h1eWFfaGRfcmVwX2NudD0yO19feWFvbGR5eXVpZD0xMTk5NjY2OTExNzQ2O195YXNpZHM9X19yb290c2lkJTNEQ0JDQTJBNEEzREIwMDAwMUM2NTNEMkQwQjJGMDE0QzM7aHV5YV93ZWJfcmVwX2NudD0xOTtndWlkPTBhODljN2Y4NGNjZjhkNmEzNTAxNGVjNDRmYzQ4YTRiXGYAdgALHCYAPEYAUSQ3bAuMmAyoDCw2JTE2NjZiNDEyMWI1MDQyMjE6MTY2NmI0MTIxYjUwNDIyMTowOjBMXGYA",
"AAMdAAA/AAAAPxADLDxACVYId2ViQWN0VUlmCmdldEFjdEluZm99AAAWCAABBgR0UmVxHQAACQoBYi8WACYAC4yYDKgMLDYlZjFlN2VlZTk1MzM5NjkwYjpmMWU3ZWVlOTUzMzk2OTBiOjA6MExcZgA=",
"AAMdAAEFTgAABU4QAyw8QApWCHdlYkFjdFVJZhBnZXRBY3RUYXNrRGV0YWlsfQABBR4IAAEGBHRSZXEdAAEFEAoKAwAAARdRuFoCFgAmADYid2ViaDUmMC4wLjEmd2Vic29ja2V0JiZkaXlwY181Mjc3NUcAAATQaHV5YV91YT13ZWJoNSYwLjAuMSZ3ZWJzb2NrZXQmJmRpeXBjXzUyNzc1O3dlYl9xcmxvZ2luX2NvbmZpcm1faWQ9ZjRmYzA1MzItNmIyMy00YWQyLTk3M2EtZjNlZTliNmE4YmZlO3VkYl9jcmVkPUNuQzhuakNudXcwYVl0SHh0NTlub18tTGxoTnhPWWwxbFNrVWF4SmJQSG40aHRPU2xuT3ZTOV8yOUJzY095STM4NEpwMEI4QS1lUEhMRGdwSXpubTc2bkhIOXZGb0owZ3piUU5qZ1Z3UHlNQlVMQkRFaldzV0NlWW1wSXIxQ2lCMEhwQ19ucWE1S3hJX0dyWHJCX1dhMlJGO3VkYl91aWQ9MTE5OTY2NjkxMTc0Njt5eXVpZD0xMTk5NjY2OTExNzQ2O3VkYl9wYXNzcG9ydD1oeV8zMDAwMjQ3MDg7dXNlcm5hbWU9aHlfMzAwMDI0NzA4O3VkYl92ZXJzaW9uPTEuMDt1ZGJfYml6dG9rZW49QVFCWTIwMTdkeVRkMFdfU1pEMTliZDlVVF9Ma3F6dXA1eU9nZ3psWlhybXh4N3EzWW9mTUNpdmhjTDN4TjB2WXdRSHc4Z2RId3FzWVVBYVVyT1puRTlJa19MOV9leE9pcXJhZEJSUG12eHk4ZjVZanFMMVBtYlpmQi1Ca2lXOHdpWEpCUnFHOWRTS25nSEhnYVJ4Q08wZzNKUUJ3TG92NDRJQjlyOE1LUHVrTlV2YVI0N0ZNU0d2WGhzcHVyT0wzZ2FIczV3R01vWm4zcDlpSGNIZkN3aU9oUXV3UTN2eF9pYjYyTlBSUDZRMnFzcHZ6Tm9aSG9kTU9vc3lxSEozTmRfQXFnU184SmVVVXJhcmNjZmhGWmQ2bllaNDRGR25KUGh4S0pXNEJXUkVZUjR3RHktUmRwalpjamZsSjlYUF9ub0JuQ0lGSUF6cmZsY0l0ODBaSXJvUXQ7dWRiX29yaWdpbj0wO3VkYl9zdGF0dXM9MTt1ZGJfb3RoZXI9JTdCJTIybHQlMjIlM0ElMjIxNzg3NjI4ODgyNjQ2JTIyJTJDJTIyaXNSZW0lMjIlM0ElMjIxJTIyJTdELS0tLTEzMDU5OTAzMTEwO19feWFzbWlkPTAuMDQzNzY0MDEwMzEzODYzMTI7X195YW1pZF90dDE9MC4wNDM3NjQwMTAzMTM4NjMxMjtfX3lhbWlkX25ldz1DQkNBMkE0QTNDNjAwMDAxNkEzRjExQ0YxM0IwMTZFQTtodXlhX2hkX3JlcF9jbnQ9MjtfX3lhb2xkeXl1aWQ9MTE5OTY2NjkxMTc0NjtfeWFzaWRzPV9fcm9vdHNpZCUzRENCQ0EyQTRBM0RCMDAwMDFDNjUzRDJEMEIyRjAxNEMzO2d1aWQ9MGE4OWM3Zjg0Y2NmOGQ2YTM1MDE0ZWM0NGZjNDhhNGI7SG1fbHZ0XzUxNzAwYjZjNzIyZjViYjRjZjM5OTA2YTU5NmVhNDFmPTE3ODc2Nzg1NDE7SG1fbHB2dF81MTcwMGI2YzcyMmY1YmI0Y2YzOTkwNmE1OTZlYTQxZj0xNzg3Njc4NTQxO0hNQUNDT1VOVD1CMkM5RUZEQzkzNDVGRDc2O2h1eWFfd2ViX3JlcF9jbnQ9MjBcZgALEWIvC4yYDKgMLDYlNmFmYWEzZDJhMThhOGIzOTo2YWZhYTNkMmExOGE4YjM5OjA6MExcZgA=",
"AAMdAAEFWwAABVsQAyw8QAtWBXd1cHVpZiFnZXRVc2VyRm9sbG93V2VDaGF0T2ZmaWNpYWxTdGF0dXN9AAEFHQgAAQYEdFJlcR0AAQUPCgoDAAABF1G4WgIWACYANiJ3ZWJoNSYwLjAuMSZ3ZWJzb2NrZXQmJmRpeXBjXzUyNzc1RwAABNBodXlhX3VhPXdlYmg1JjAuMC4xJndlYnNvY2tldCYmZGl5cGNfNTI3NzU7d2ViX3FybG9naW5fY29uZmlybV9pZD1mNGZjMDUzMi02YjIzLTRhZDItOTczYS1mM2VlOWI2YThiZmU7dWRiX2NyZWQ9Q25DOG5qQ251dzBhWXRIeHQ1OW5vXy1MbGhOeE9ZbDFsU2tVYXhKYlBIbjRodE9TbG5PdlM5XzI5QnNjT3lJMzg0SnAwQjhBLWVQSExEZ3BJem5tNzZuSEg5dkZvSjBnemJRTmpnVndQeU1CVUxCREVqV3NXQ2VZbXBJcjFDaUIwSHBDX25xYTVLeElfR3JYckJfV2EyUkY7dWRiX3VpZD0xMTk5NjY2OTExNzQ2O3l5dWlkPTExOTk2NjY5MTE3NDY7dWRiX3Bhc3Nwb3J0PWh5XzMwMDAyNDcwODt1c2VybmFtZT1oeV8zMDAwMjQ3MDg7dWRiX3ZlcnNpb249MS4wO3VkYl9iaXp0b2tlbj1BUUJZMjAxN2R5VGQwV19TWkQxOWJkOVVUX0xrcXp1cDV5T2dnemxaWHJteHg3cTNZb2ZNQ2l2aGNMM3hOMHZZd1FIdzhnZEh3cXNZVUFhVXJPWm5FOUlrX0w5X2V4T2lxcmFkQlJQbXZ4eThmNVlqcUwxUG1iWmZCLUJraVc4d2lYSkJScUc5ZFNLbmdISGdhUnhDTzBnM0pRQndMb3Y0NElCOXI4TUtQdWtOVXZhUjQ3Rk1TR3ZYaHNwdXJPTDNnYUhzNXdHTW9abjNwOWlIY0hmQ3dpT2hRdXdRM3Z4X2liNjJOUFJQNlEycXNwdnpOb1pIb2RNT29zeXFISjNOZF9BcWdTXzhKZVVVcmFyY2NmaEZaZDZuWVo0NEZHbkpQaHhLSlc0QldSRVlSNHdEeS1SZHBqWmNqZmxKOVhQX25vQm5DSUZJQXpyZmxjSXQ4MFpJcm9RdDt1ZGJfb3JpZ2luPTA7dWRiX3N0YXR1cz0xO3VkYl9vdGhlcj0lN0IlMjJsdCUyMiUzQSUyMjE3ODc2Mjg4ODI2NDYlMjIlMkMlMjJpc1JlbSUyMiUzQSUyMjElMjIlN0QtLS0tMTMwNTk5MDMxMTA7X195YXNtaWQ9MC4wNDM3NjQwMTAzMTM4NjMxMjtfX3lhbWlkX3R0MT0wLjA0Mzc2NDAxMDMxMzg2MzEyO19feWFtaWRfbmV3PUNCQ0EyQTRBM0M2MDAwMDE2QTNGMTFDRjEzQjAxNkVBO2h1eWFfaGRfcmVwX2NudD0yO19feWFvbGR5eXVpZD0xMTk5NjY2OTExNzQ2O195YXNpZHM9X19yb290c2lkJTNEQ0JDQTJBNEEzREIwMDAwMUM2NTNEMkQwQjJGMDE0QzM7Z3VpZD0wYTg5YzdmODRjY2Y4ZDZhMzUwMTRlYzQ0ZmM0OGE0YjtIbV9sdnRfNTE3MDBiNmM3MjJmNWJiNGNmMzk5MDZhNTk2ZWE0MWY9MTc4NzY3ODU0MTtIbV9scHZ0XzUxNzAwYjZjNzIyZjViYjRjZjM5OTA2YTU5NmVhNDFmPTE3ODc2Nzg1NDE7SE1BQ0NPVU5UPUIyQzlFRkRDOTM0NUZENzY7aHV5YV93ZWJfcmVwX2NudD0yMVxmAAsQAQuMmAyoDCw2JTIzODUwYmFhOGI4Y2YwYjQ6MjM4NTBiYWE4YjhjZjBiNDowOjBMXGYA",
"AAMdAAEFYwAABWMQAyw8QA1WCHdlYkFjdFVJZg9nZXRBY3RQcml6ZUxpc3R9AAEFNAgAAQYEdFJlcR0AAQUmCgoDAAABF1G4WgIWACYANiJ3ZWJoNSYwLjAuMSZ3ZWJzb2NrZXQmJmRpeXBjXzUyNzc1RwAABOZodXlhX3VhPXdlYmg1JjAuMC4xJndlYnNvY2tldCYmZGl5cGNfNTI3NzU7IHdlYl9xcmxvZ2luX2NvbmZpcm1faWQ9ZjRmYzA1MzItNmIyMy00YWQyLTk3M2EtZjNlZTliNmE4YmZlOyB1ZGJfY3JlZD1DbkM4bmpDbnV3MGFZdEh4dDU5bm9fLUxsaE54T1lsMWxTa1VheEpiUEhuNGh0T1Nsbk92UzlfMjlCc2NPeUkzODRKcDBCOEEtZVBITERncEl6bm03Nm5ISDl2Rm9KMGd6YlFOamdWd1B5TUJVTEJERWpXc1dDZVltcElyMUNpQjBIcENfbnFhNUt4SV9HclhyQl9XYTJSRjsgdWRiX3VpZD0xMTk5NjY2OTExNzQ2OyB5eXVpZD0xMTk5NjY2OTExNzQ2OyB1ZGJfcGFzc3BvcnQ9aHlfMzAwMDI0NzA4OyB1c2VybmFtZT1oeV8zMDAwMjQ3MDg7IHVkYl92ZXJzaW9uPTEuMDsgdWRiX2JpenRva2VuPUFRQlkyMDE3ZHlUZDBXX1NaRDE5YmQ5VVRfTGtxenVwNXlPZ2d6bFpYcm14eDdxM1lvZk1DaXZoY0wzeE4wdll3UUh3OGdkSHdxc1lVQWFVck9abkU5SWtfTDlfZXhPaXFyYWRCUlBtdnh5OGY1WWpxTDFQbWJaZkItQmtpVzh3aVhKQlJxRzlkU0tuZ0hIZ2FSeENPMGczSlFCd0xvdjQ0SUI5cjhNS1B1a05VdmFSNDdGTVNHdlhoc3B1ck9MM2dhSHM1d0dNb1puM3A5aUhjSGZDd2lPaFF1d1EzdnhfaWI2Mk5QUlA2UTJxc3B2ek5vWkhvZE1Pb3N5cUhKM05kX0FxZ1NfOEplVVVyYXJjY2ZoRlpkNm5ZWjQ0RkduSlBoeEtKVzRCV1JFWVI0d0R5LVJkcGpaY2pmbEo5WFBfbm9CbkNJRklBenJmbGNJdDgwWklyb1F0OyB1ZGJfb3JpZ2luPTA7IHVkYl9zdGF0dXM9MTsgdWRiX290aGVyPSU3QiUyMmx0JTIyJTNBJTIyMTc4NzYyODg4MjY0NiUyMiUyQyUyMmlzUmVtJTIyJTNBJTIyMSUyMiU3RC0tLS0xMzA1OTkwMzExMDsgX195YXNtaWQ9MC4wNDM3NjQwMTAzMTM4NjMxMjsgX195YW1pZF90dDE9MC4wNDM3NjQwMTAzMTM4NjMxMjsgX195YW1pZF9uZXc9Q0JDQTJBNEEzQzYwMDAwMTZBM0YxMUNGMTNCMDE2RUE7IGh1eWFfaGRfcmVwX2NudD0yOyBfX3lhb2xkeXl1aWQ9MTE5OTY2NjkxMTc0NjsgX3lhc2lkcz1fX3Jvb3RzaWQlM0RDQkNBMkE0QTNEQjAwMDAxQzY1M0QyRDBCMkYwMTRDMzsgZ3VpZD0wYTg5YzdmODRjY2Y4ZDZhMzUwMTRlYzQ0ZmM0OGE0YjsgSG1fbHZ0XzUxNzAwYjZjNzIyZjViYjRjZjM5OTA2YTU5NmVhNDFmPTE3ODc2Nzg1NDE7IEhtX2xwdnRfNTE3MDBiNmM3MjJmNWJiNGNmMzk5MDZhNTk2ZWE0MWY9MTc4NzY3ODU0MTsgSE1BQ0NPVU5UPUIyQzlFRkRDOTM0NUZENzY7IGh1eWFfd2ViX3JlcF9jbnQ9MjFcZgALEQibC4yYDKgMLDYlZmQ0ZmJjYmRlYzdmNzQxNTpmZDRmYmNiZGVjN2Y3NDE1OjA6MExcZgA="
]
+313
View File
@@ -0,0 +1,313 @@
#!/usr/bin/env python3
"""虎牙活动页 webActUI TAF 服务端登录态验证 (纯Python, WS 通道)。
背景 (2026-08-26 实测):
- 活动页 zt.huya.com 的 webActUI 服务走 TAF 信封, 认证 = 信封内嵌完整 cookie 串。
- 两条通道:
* HTTP POST https://cdnws.api.huya.com/?baseinfo=<b64>&timestamp=<ms>
响应 = base64(TAF信封)。**该端点被 volc-dcdn CDN 封锁非浏览器 TLS
(requests/curl/curl_cffi 均超时/502), 仅真实浏览器可直连。**
* WebSocket wss://wsapi.huya.com/?baseinfo=<b64> —— **纯 Python 可直连**,
本工具走这条通道。
- 认证/验证序列 (最小两帧, 已实测 200 请求成功):
* 认证帧 (裸 JCE struct): uid + UA + cookie(STR4), 向连接注册账号身份
* getActUserTaskDetail (webActUI TAF 信封, 按目标账号重建)
getActUserTaskDetail 返回 200 请求成功 + 用户任务列表
=> 服务端确认该 cookie 已登录; 无 cookie 对照 => 905 错误。
- 关键坑 (2026-08-26 逆向定位):
* baseinfo/认证帧/task 帧的 uid+cookie 必须全部一致, 否则服务端回
"wup request biz execption:-1" (iErrorCode 5000)。
* task 帧尾部 actId 字段 = JCE t1/INT16 标签+值 `11 62 2f` (3字节),
缺标签字节会解析失败。
* 活动页会自行补充页面级 cookie (guid/huya_ua/__yasmid/__yamid_* 等),
纯 Python 产出的 10 个登录 cookie 已足够, 无需页面 cookie。
用法:
python tools/huya_activity_verify.py [cookie文件] [账号块索引]
默认 cookie 文件: evidence/web_cookies_full.txt, 账号块 0。
"""
import base64
import json
import os
import random
import re
import struct
import sys
import time
import urllib.parse
sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), ".."))
try:
from websocket import create_connection
except ImportError:
print("缺少依赖: pip install websocket-client")
sys.exit(1)
from tools.huya_wup_encoder import _Writer # noqa: E402
HERE = os.path.dirname(os.path.abspath(__file__))
UA_ACT = "webh5&0.0.1&websocket&&diypc_52775"
UA_BROWSER = ("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36")
# ---------------------------------------------------------------------------
# cookie 解析
# ---------------------------------------------------------------------------
def parse_cookie_blocks(path):
"""evidence/web_cookies_full.txt 多账号分块解析 (按空行分块, 行内以;分隔)。"""
blocks = []
cur = None
with open(path) as f:
for raw in f:
line = raw.strip()
if not line:
cur = None
continue
if line.startswith('#'):
cur = {'account': line.lstrip('#').strip(), 'cookies': {}}
blocks.append(cur)
continue
if cur is None:
cur = {'account': 'unknown', 'cookies': {}}
blocks.append(cur)
for pair in line.split(';'):
pair = pair.strip()
if not pair or '=' not in pair:
continue
k, v = pair.split('=', 1)
cur['cookies'][k.strip()] = v.strip()
return blocks
# ---------------------------------------------------------------------------
# TAF 组包 (webActUI 活动接口, 与浏览器字节一致, 金样本对拍通过)
# ---------------------------------------------------------------------------
def make_trace_id() -> str:
return f"{random.getrandbits(64):016x}:{random.getrandbits(64):016x}:0:0"
def build_baseinfo(uid: int, ua: str, cookie_str: str, trace: str) -> bytes:
"""cdnws/wsapi 的 baseinfo 原始字节 (JCE struct, b64进URL)。"""
w = _Writer()
w.int64(0, uid)
w.string(1, "")
w.string(2, ua)
w.string(3, "HUYA&ZH&2052")
w.string(4, "")
w.string(5, "")
w.int8(6, 0)
w.string(7, "")
w.string(8, cookie_str) # cookie (len>255 -> STR4)
w.string(9, trace)
w.map_begin(10, 0)
return w.get()
def build_body(servant: str, func: str, uid: int, ua: str, cookie_str: str,
trace: str, reqid: int = 1, func_tail: bytes = b"",
with_trace: bool = True) -> bytes:
"""构造 webActUI TAF 信封 (含4B长度前缀)。已与捕获金样本逐字节一致。"""
w = _Writer()
w.struct_begin(0)
w.struct_begin(0)
w.int64(0, uid)
w.string(1, "")
w.string(2, "")
w.string(3, ua)
w.string(4, cookie_str) # cookie (STR4)
w.int8(5, 0)
w.string(6, "")
w.struct_end()
w.buf += func_tail # func 特有尾部 (value 内, 如 actId)
w.struct_end()
value = w.get()
body = bytearray()
body += b"\x10\x03\x2c\x3c\x40" + bytes([reqid]) + b"\x56"
body += b"\x08" + servant.encode()
body += b"\x66" + bytes([len(func)]) + func.encode() + b"\x7d"
body += b"\x00\x01" + struct.pack(">H", len(value) + 14)
body += b"\x08\x00\x01\x06\x04tReq\x1d\x00\x01" + struct.pack(">H", len(value))
body += value
body += b"\x8c\x98\x0c\xa8\x0c"
if with_trace:
tr = trace.encode()
body += b"\x2c\x36" + bytes([len(tr)]) + tr + b"\x4c\x5c\x66\x00"
return struct.pack(">I", len(body)) + bytes(body)
def wrap_ws(inner: bytes) -> bytes:
"""4B前缀信封 -> WS 帧 (00 03 1d 00 01 [2B len][4B len][inner])。
len = 信封(去4B长度前缀) - 固定头(12 + svc长 + func长), 与捕获帧一致。
"""
e = inner[4:]
svc_len = e[7] # 56 <svc_len> <svc>
func_len = e[9 + svc_len] # 66 <flen> <func>
hdr = 12 + svc_len + func_len
ln = len(e) - hdr
return b"\x00\x03\x1d\x00\x01" + ln.to_bytes(2, "big") + ln.to_bytes(4, "big") + e
ACT_ID = 0x622F # 25135, 金样本 task 帧尾部 11 62 2f
ACT_ID_TAIL = b"\x11" + struct.pack(">H", ACT_ID) # JCE: t1/INT16 标签 + 值
def build_auth_frame(uid: int, ua: str, cookie_spaced: str) -> bytes:
"""认证帧 (裸 JCE struct, 无 TAF 信封; 注册连接的账号身份)。
结构 (与实抓逐字节一致): t0 uid + t1 UA + t2 cookie(STR4) + t3 空
+ t4 1 + t5 版本 + t2..t6 空尾字段。包装头 00 0a 1d 00 01 [2B len]。
"""
w = _Writer()
w.int64(0, uid)
w.string(1, ua)
w.string(2, cookie_spaced)
w.string(3, "")
w.int8(4, 1)
w.string(5, "HUYA&ZH&2052")
w.int8(2, 0)
w.string(3, "")
w.int8(4, 0)
w.int8(5, 0)
w.string(6, "")
body = w.get()
return b"\x00\x0a\x1d\x00\x01" + (len(body) - 7).to_bytes(2, "big") + body
def build_task_frame(uid: int, cookie_tight: str, reqid: int = 5) -> bytes:
inner = build_body("webActUI", "getActUserTaskDetail", uid, UA_ACT,
cookie_tight, make_trace_id(), reqid=reqid,
func_tail=ACT_ID_TAIL)
return wrap_ws(inner)
# ---------------------------------------------------------------------------
# 响应解析 (验证只需状态/消息/条目)
# ---------------------------------------------------------------------------
def extract_msg(resp: bytes):
"""从 TAF 响应中提取消息串 (JCE t1 STR1, 常见: 请求成功/活动已下线/…)。"""
msgs = re.findall(rb"[\xe4-\xe9][\x80-\xbf][\x80-\xbf]", resp)
txt = "".join(m.decode() for m in msgs)
if not txt:
m = re.search(rb"STATUS_RESULT_DESC[\x16]\x1c([\x20-\x7e]+)", resp)
if m:
txt = m.group(1).decode(errors="replace")
return txt or None
def task_ok(resp: bytes) -> tuple:
"""返回 (is_ok, msg, item_count)。"""
msg = extract_msg(resp)
# 状态码: 成功 0a 01 0x00c8=200 / 活动下线 0a 01 0x0259 / 错误 01 0x0389=905 等
st = None
m = re.search(rb"\x0a\x01(..)", resp)
if m:
st = int.from_bytes(m.group(1), "big")
else:
m = re.search(rb"\x01(..)\x81\x13\x88", resp) # tars 错误: 业务码 + iErrorCode5000
if m:
st = int.from_bytes(m.group(1), "big")
# 任务条目 = value 内任务 STRUCT 头 (每任务以 0a 01 62 开头)
items = 0
if st == 200:
items = len(re.findall(rb"\x0a\x01\x62\x2f\x12\x00", resp)) or len(re.findall(rb"\x0a\x01\x62", resp))
return (st == 200 and "请求成功" in msg, st, msg, items)
# ---------------------------------------------------------------------------
# 验证主流程
# ---------------------------------------------------------------------------
def verify_ws(uid: int, cookie_tight: str, with_cookie: bool = True,
timeout: float = 30) -> dict:
"""WS 通道验证登录态: 认证帧(注册连接身份) + getActUserTaskDetail。
经验 (2026-08-26 实测): 帧身份必须与连接 baseinfo 一致 ——
baseinfo/认证帧/task 帧必须同一 uid+cookie, 否则服务端回
"wup request biz execption:-1"。认证帧 + task 帧两帧即足够。
"""
cookie_spaced = "; ".join(p.strip() for p in cookie_tight.split(";") if "=" in p)
if not with_cookie:
cookie_spaced, cookie_tight = "", ""
bi = build_baseinfo(uid, UA_ACT, cookie_spaced, make_trace_id())
url = "wss://wsapi.huya.com/?" + urllib.parse.urlencode(
{"baseinfo": base64.b64encode(bi).decode()})
ws = create_connection(url, timeout=15, header={
"User-Agent": UA_BROWSER, "Origin": "https://zt.huya.com"})
out = {}
try:
ws.send(build_auth_frame(uid, UA_ACT, cookie_spaced), opcode=2)
time.sleep(0.3)
ws.send(build_task_frame(uid, cookie_tight, reqid=5), opcode=2)
time.sleep(0.5)
ws.settimeout(timeout)
deadline = time.time() + timeout
task_resp = None
while time.time() < deadline:
try:
r = ws.recv()
except Exception:
break
rp = r.encode("latin1") if isinstance(r, str) else r
if b"getActUserTaskDetail" in rp[:90]:
task_resp = rp
break
out["task_resp_len"] = len(task_resp) if task_resp else 0
if task_resp:
ok, st, msg, items = task_ok(task_resp)
out.update(ok=ok, status=st, msg=msg, items=items)
else:
out.update(ok=False, msg="无 getActUserTaskDetail 响应")
finally:
ws.close()
return out
def self_check() -> bool:
"""金样本回归: 与捕获 baseinfo/body 逐字节比对, 防 builder 漂移。"""
golden_path = os.path.join(HERE, "..", "evidence", "activity_taf_golden.json")
if not os.path.exists(golden_path):
print("[self_check] 无金样本 evidence/activity_taf_golden.json, 跳过")
return True
g = json.load(open(golden_path))
bi = build_baseinfo(g["uid"], g["ua"], g["cookie_spaced"], g["baseinfo_trace"])
assert bi == bytes.fromhex(g["baseinfo_hex"]), "baseinfo 与金样本不一致!"
body = build_body("webActUI", "getActUserTaskDetail", g["uid"], g["ua"],
g["cookie_tight"], g["trace"], reqid=g["reqid"],
func_tail=bytes.fromhex(g["func_tail_hex"]))
assert body == bytes.fromhex(g["body_hex"]), "body 与金样本不一致!"
auth = build_auth_frame(g["uid"], g["ua"], g.get("auth_cookie_spaced", g["cookie_spaced"]))
assert auth[7:] == bytes.fromhex(g.get("auth_hex", "")), "auth 帧与金样本不一致!"
print("[self_check] 通过: baseinfo/body/auth 与捕获金样本逐字节一致")
return True
def main():
self_check()
path = sys.argv[1] if len(sys.argv) > 1 else os.path.join(
HERE, "..", "evidence", "web_cookies_full.txt")
idx = int(sys.argv[2]) if len(sys.argv) > 2 else 0
blocks = parse_cookie_blocks(path)
blk = blocks[idx]
ck = blk["cookies"]
uid = int(ck.get("udb_uid") or ck.get("yyuid") or 0)
cookie_tight = ";".join(f"{k}={v}" for k, v in ck.items())
print(f"== 账号 [{idx}] {blk['account']} uid={uid} cookies={len(ck)} ==")
print(f"\n-- [A] 带 cookie 调 getActUserTaskDetail (复刻浏览器序列) --")
ra = verify_ws(uid, cookie_tight)
print(f" 响应 {ra['task_resp_len']}B | status={ra.get('status')} msg={ra.get('msg')} "
f"任务项={ra.get('items')}")
print(" =>", "✅ 已登录 (服务端确认: 请求成功 + 用户任务数据)"
if ra.get("ok") else "❌ 未确认")
print(f"\n-- [B] 无 cookie 对照 (应失败/错误) --")
rb = verify_ws(uid, cookie_tight, with_cookie=False)
print(f" 响应 {rb['task_resp_len']}B | status={rb.get('status')} msg={rb.get('msg')}")
print("\n结论:", "✅ cookie 登录态服务端验证通过"
if ra.get("ok") else "❌ 未通过 (cookie 可能过期或活动已结束)")
if __name__ == "__main__":
main()