├── requirements.txt ├── .idea ├── .gitignore ├── vcs.xml ├── inspectionProfiles │ ├── profiles_settings.xml │ └── Project_Default.xml ├── misc.xml ├── modules.xml └── wireguard_converted_nekoray.iml ├── images ├── Screenshot.png ├── ipv4_warp.png ├── ipv6_wrap.png ├── wireguard.png ├── 支持其他服务商提供的WireGuard配置文件.png ├── android版NekoBox,wireguard的sn分享链接.png └── android版NekoBox,wireguard的sn的使用.png ├── 配置文件 └── wg-config.conf ├── README.md ├── 2.批量构建nekoray节点(txt文件).py ├── 3.批量构建nekoray节点(csv文件).py ├── ip.txt ├── 1.生成单个nekoray节点.py ├── 5.[Android]批量构建sn的wireguard节点(txt文件).py ├── 6.[Android]批量构建sn的wireguard节点(csv文件).py ├── result.csv ├── 7.转换为clash配置文件(txt文件).py ├── 8.转换为clash配置文件(csv文件).py ├── 4.[Android]生成单个sn的wireguard节点.py ├── result_IPv6.csv └── output-node.txt /requirements.txt: -------------------------------------------------------------------------------- 1 | pyperclip==1.8.2 2 | -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | -------------------------------------------------------------------------------- /images/Screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/juerson/wireguard_converted_nekoray/HEAD/images/Screenshot.png -------------------------------------------------------------------------------- /images/ipv4_warp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/juerson/wireguard_converted_nekoray/HEAD/images/ipv4_warp.png -------------------------------------------------------------------------------- /images/ipv6_wrap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/juerson/wireguard_converted_nekoray/HEAD/images/ipv6_wrap.png -------------------------------------------------------------------------------- /images/wireguard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/juerson/wireguard_converted_nekoray/HEAD/images/wireguard.png -------------------------------------------------------------------------------- /images/支持其他服务商提供的WireGuard配置文件.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/juerson/wireguard_converted_nekoray/HEAD/images/支持其他服务商提供的WireGuard配置文件.png -------------------------------------------------------------------------------- /images/android版NekoBox,wireguard的sn分享链接.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/juerson/wireguard_converted_nekoray/HEAD/images/android版NekoBox,wireguard的sn分享链接.png -------------------------------------------------------------------------------- /images/android版NekoBox,wireguard的sn的使用.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/juerson/wireguard_converted_nekoray/HEAD/images/android版NekoBox,wireguard的sn的使用.png -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /配置文件/wg-config.conf: -------------------------------------------------------------------------------- 1 | [Interface] 2 | PrivateKey = AKs7CKzbDVmfjSgCB4A1JNI5YBMclHYV2OQ7srIijW4= 3 | Address = 172.16.0.2/32, 2606:4700:110:876d:4d3c:4206:c90c:6bd0/128 4 | DNS = 1.1.1.1 5 | MTU = 1280 6 | [Peer] 7 | PublicKey = bmXOC+F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo= 8 | AllowedIPs = 0.0.0.0/0, ::/0 9 | Endpoint = 162.159.193.10:2408 10 | Reserved = tBDy -------------------------------------------------------------------------------- /.idea/wireguard_converted_nekoray.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 26 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # wireguard_converted_nekoray 2 | 3 | 该代码库主要用途:使用 Cloudfare WARP 密钥生成的 WireGuard 配置文件的参数,转换为 NekoBox 客户端的 `nekoray://` 或 `sn://` 分享链接、转换为 Clash 配置文件。 4 | 5 | 1、单个转换:按照程序傻瓜式操作,输入 WARP 的优选 IP ,生成对应的 `nekoray://` 或 `sn://` 分享链接(生成的链接,已经复制到剪切板)。 6 | 7 | 2、批量转换:支持 `ip.txt` 文件(每行一个 `IP:PORT` 格式的 WARP 优选 IP )、`result.csv` 文件的数据输入,批量转换。 8 | 9 | - 生成对应的 `nekoray://` 或 `sn://`分享链接,输出到 `output-node.txt` 文件中。 10 | 11 | - 转换为 clash 配置文件,使用最简单的方法,字符串替换大法,将 `配置文件/clash.yaml`模板中,需要替换的字符替换掉,模板文件中的内容均来自 [subconverter v0.9.0](https://github.com/tindy2013/subconverter) 程序转换而来的,没有任何删改,除了添加 `dns` 相关的字段外。 12 | 13 | ### 一、使用注意 14 | 15 | 1、建议使用前,将 `配置文件/wg-config.conf` 文件中的参数,改为自己的。 16 | 17 | 2、`Reserved` 参数的值,我暂时没有发现有什么作用,添加和不添加 `Reserved` 值都能使用。 18 | 19 | 3、想填写 `Reserved` 参数的值,不知道这个 `Reserved` 值怎么来的?之前听说过数组类型的 `Reserve`(例如:`[173,177,149]`),但是又听说 Android 版的 `NekoBox` 的 `Reserved` 只支持字符串类型的 `Reserve` (4个字符)?该怎么获取字符串类型的 `Reserve` ?网上找了一下,这个[视频](https://www.youtube.com/watch?v=FBAiyjZhNqk)可能能解答你的问题,介绍了如何将数组类型的 `Reserved` 转换为字符串类型的 `Reserved` ([附:转换平台](https://gchq.github.io/CyberChef/#recipe=From_Decimal('Comma',false)To_Base64('A-Za-z0-9%2B/%3D')&input=MTczLDE3NywxNDk))。 20 | 21 | 4、WireGuard 的 SN Link 生成,根据[这里](https://github.com/MatsuriDayo/NekoBoxForAndroid/issues/298#issuecomment-1879656040)的代码修改,目前发现 SN Link 的配置名称不能使用中文、某些特殊字符,一些国家的语言可能也不支持,应该缺少某些功能,但是能使用,编译的 EXE 程序,就不留出可以自定义配置名称的功能。 22 | 23 | 5、MTU 值修改,参考资料:[link](https://gist.github.com/nitred/f16850ca48c48c79bf422e90ee5b9d95/76c6ed28d476d8a7a2d84f7e36844989f3198864)。 24 | 25 | 6、转换为 Clash 配置文件的,代码中没有使用到 `Reserved` 值。使用过程出现问题且有精力可以排查一下:账号问题(换成自己的 WARP Plus)、MTU值问题、`配置文件/clash.yaml` 文件中的 `dns` 字段值的问题、优选的 IP 问题、Clash 客户端问题(包括 Clash 内核问题),也可能是下面这块代码出问题,特别是dns解析与其它的dns冲突(网速慢的情况,可能跟它有关),可以将 `remote-dns-resolve` 和 `dns`字段删除。 26 | 27 |
28 | 点击展开代码 29 |
{
30 |   "name": "warp-001",
31 |   "type": "wireguard",
32 |   "server": "162.159.192.1",
33 |   "port": 2408,
34 |   "ip": "172.16.0.2",
35 |   "ipv6": "",
36 |   "private-key": "",
37 |   "public-key": "bmXOC+F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo=",
38 |   "pre-shared-key": "",
39 |   "reserved": "",
40 |   "udp": true,
41 |   "mtu": 1280
42 | }
43 | 
44 |
45 | 46 | 47 | ### 二、相关截图 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 注意:有线宽带或光纤、无线 WiFi 没有公网 IPv6 地址的,无法跑出 IPv6 的 [result.csv](https://github.com/MiSaturo/CFWarp-Windows) 文件,不管您从网上哪里弄来 `reult.csv` 文件(包括这个代码库),没有 IPv6 的地址,是使用不了的,除非套一层 IPv6 的代理。本代码中的 IPv6 UDP 延迟测试,是基于 Cloudflare WARP 提供的 IPv6 地址测试出来的。 60 | 61 | 支持其他服务商提供的 WireGuard 配置文件,由于没有大量、不同服务商提供的 WireGuard 配置文件作为数据测试,不保证所有WireGuard 配置文件都能转为`nekoray://` 或 `sn://` 链接使用,建议自己测试。目前我只知道,需要如图中 `PrivateKey`、`Address `、`PublicKey`、`Endpoint` 这四个参数值,就能转换/生成 `nekoray://` 或 `sn://` 的分享链接。 62 | 63 | 64 | 65 | 66 | 67 | 68 | ### 三、使用到的工具: 69 | 70 | - NekoBox Windows版:https://github.com/MatsuriDayo/nekoray/releases 71 | - NekoBox Android版:https://github.com/MatsuriDayo/NekoBoxForAndroid -------------------------------------------------------------------------------- /2.批量构建nekoray节点(txt文件).py: -------------------------------------------------------------------------------- 1 | import base64 2 | import os 3 | import sys 4 | 5 | 6 | # 检查文件是否存在或大小为0,即文件无效 7 | def check_file_exist_or_zero_size(file): 8 | if not os.path.exists(file) or os.stat(file).st_size == 0: 9 | sys.exit() 10 | 11 | 12 | # 读取优选ip的ip.txt文件 13 | def read_ip_endpoints(txt_file): 14 | endpoints = [] 15 | with open(file=txt_file, mode='r', encoding='utf-8') as rf: 16 | for item in rf.readlines(): 17 | if item.strip() != "": 18 | endpoints.append(item.strip()) 19 | return endpoints 20 | 21 | 22 | # 读取wg-config.conf配置文件的信息 23 | def read_wireguard_key_parameters(conf_file): 24 | with open(file=conf_file, mode='r', encoding='utf-8') as f: 25 | wireguard_param = dict() 26 | for line in f: 27 | if line: 28 | if line.startswith("PrivateKey"): 29 | wireguard_param["PrivateKey"] = line.strip().replace(' ', '').replace("PrivateKey=", '') 30 | if line.startswith("PublicKey"): 31 | wireguard_param["PublicKey"] = line.strip().replace(' ', '').replace("PublicKey=", '') 32 | if line.startswith("Address"): 33 | wireguard_param["Address"] = line.strip().replace(' ', '').replace("Address=", '').split(',') 34 | if line.startswith("MTU"): 35 | wireguard_param["MTU"] = line.strip().replace(' ', '').replace("MTU=", '') 36 | return wireguard_param 37 | 38 | 39 | # 将从配置文件中读取到信息,写入到指定的JSON字符串中 40 | def update_base_info(conf_file, MTU=None): 41 | param = read_wireguard_key_parameters(conf_file) 42 | peer_public_key = param["PublicKey"].strip() 43 | private_key = param["PrivateKey"].strip() 44 | Address = param.get("Address") 45 | # if条件针对wireguard配置中,Address行的值有多个值或一个值的情况 46 | if len(Address) > 1: # 多个值(一般是IPv4 CIDR 和 IPv6 CIDR) 47 | local_address = r"[\n" + ','.join([r' \"{ip}\"'.format(ip=item) for item in Address]) + r"\n ]" 48 | else: # 只有一个值 49 | local_address = r'\"{ip}\"'.format(ip=Address[0]) 50 | MTU = param.get('MTU', 1408) if MTU is None else MTU 51 | nekoray_str_json = '{"_v":0,"addr":"127.0.0.1","cmd":[""],"core":"internal","cs":"{\\n \\"interface_name\\": ' \ 52 | '\\"WARP\\",\\n \\"local_address\\": #local_address,\\n' \ 53 | ' \\"mtu\\": #MUT值,\\n \\"peer_public_key\\": \\"#peer_public_key\\",\\n \\"private_key\\":' \ 54 | ' \\"#private_key\\",\\n \\"server\\": \\"IP地址\\",\\n \\"server_port\\": 端口,\\n ' \ 55 | '\\"system_interface\\": false,\\n \\"tag\\": \\"proxy\\",\\n \\"type\\": \\"wireguard' \ 56 | '\\"\\n}","mapping_port":0,"name":"别名","port":1080,"socks_port":0}' 57 | update_key = nekoray_str_json.replace('#peer_public_key', peer_public_key).replace('#private_key', private_key) 58 | update_address = update_key.replace('#local_address', local_address).replace('#MUT值', str(MTU)) 59 | return update_address 60 | 61 | 62 | if __name__ == '__main__': 63 | """判断文件是否存在或文件的大小为0""" 64 | files = ["配置文件/wg-config.conf", "ip.txt"] 65 | for file in files: 66 | check_file_exist_or_zero_size(file) # 检查文件是否存在 67 | """MTU值的修改""" 68 | print("是否修改MTU值?输入内容为空时,就默认为配置文件的值,配置文件中没有MTU值,就使用1408;") 69 | while True: 70 | input_mtu = input("这里输入MTU值,取值范围为1280~1500:") 71 | if (input_mtu.isdigit() and 1280 <= int(input_mtu) <= 1500) or input_mtu.strip() == '': 72 | break 73 | input_country = input('添加节点名称或别名的前缀吗?(比如,CN):').strip() 74 | country = f'{input_country.strip()}_' if input_country != '' else '' 75 | base_str = None 76 | if input_mtu.isdigit(): 77 | base_str = update_base_info(files[0], MTU=input_mtu) # 调用函数 78 | else: 79 | base_str = update_base_info(files[0]) # 调用函数 80 | endpoints = read_ip_endpoints(txt_file=files[1]) 81 | output_file = 'output-node.txt' # nekoray节点保存到这里 82 | f = open(output_file, mode='w', encoding='utf-8') 83 | for endpoint in endpoints: 84 | ip = endpoint.rsplit(':', 1)[0] 85 | ip = ip[1:-1] if ip.startswith('[') and ip.endswith(']') else ip # 针对IPv6地址,写入JSON的server中要去掉中括号 86 | port = endpoint.rsplit(':', 1)[1] 87 | remarks = f"{ip}:{port}" if ip.count(":") == 0 else f"[{ip}]:{port}" # 节点的别名、节点的名称(不重要,ipv6的加上中括号) 88 | node = base_str.replace('别名', f'{country}{remarks}').replace('IP地址', ip).replace('端口', port) 89 | encoded = base64.b64encode(node.encode('utf-8'), altchars=b'-_') 90 | encoded_str = str(encoded, encoding='utf-8') 91 | transport_protocol = "nekoray://custom#" # 在base64编码好的字符串前缀添加这个前缀(NekoBox软件专用的前缀) 92 | nekoray_node = transport_protocol + encoded_str 93 | f.write(f"{nekoray_node}\n") 94 | f.flush() 95 | print(f"已经将节点写入{output_file}文件中!\n") 96 | f.close() 97 | os.system("pause") 98 | -------------------------------------------------------------------------------- /3.批量构建nekoray节点(csv文件).py: -------------------------------------------------------------------------------- 1 | import base64 2 | import os 3 | import sys 4 | 5 | 6 | # 检查文件是否存在或大小为0,即文件无效 7 | def check_file_exist_or_zero_size(file): 8 | if not os.path.exists(file) or os.stat(file).st_size == 0: 9 | sys.exit() 10 | 11 | 12 | # 读取优选ip的result.csv文件 13 | def read_ip_endpoints(csv_file): 14 | endpoints = [] 15 | with open(file=csv_file, mode='r', encoding='utf-8') as rf: 16 | next(rf) 17 | for line in rf: 18 | delay = line.strip().split(',')[-1].replace(' ', '').replace('ms', '') 19 | if int(delay) < 500: 20 | endpoint = line.strip().split(',')[0] 21 | endpoints.append(endpoint) 22 | return endpoints 23 | 24 | 25 | # 读取wg-config.conf配置文件的信息 26 | def read_wireguard_key_parameters(conf_file): 27 | with open(file=conf_file, mode='r', encoding='utf-8') as f: 28 | wireguard_param = dict() 29 | for line in f: 30 | if line: 31 | if line.startswith("PrivateKey"): 32 | wireguard_param["PrivateKey"] = line.strip().replace(' ', '').replace("PrivateKey=", '') 33 | if line.startswith("PublicKey"): 34 | wireguard_param["PublicKey"] = line.strip().replace(' ', '').replace("PublicKey=", '') 35 | if line.startswith("Address"): 36 | wireguard_param["Address"] = line.strip().replace(' ', '').replace("Address=", '').split(',') 37 | if line.startswith("MTU"): 38 | wireguard_param["MTU"] = line.strip().replace(' ', '').replace("MTU=", '') 39 | return wireguard_param 40 | 41 | 42 | # 将从配置文件中读取到信息,写入到指定的JSON字符串中 43 | def update_base_info(conf_file, MTU=None): 44 | param = read_wireguard_key_parameters(conf_file) 45 | peer_public_key = param["PublicKey"].strip() 46 | private_key = param["PrivateKey"].strip() 47 | Address = param.get("Address") 48 | # if条件针对wireguard配置中,Address行的值有多个值或一个值的情况 49 | if len(Address) > 1: # 多个值(一般是IPv4 CIDR 和 IPv6 CIDR) 50 | local_address = r"[\n" + ','.join([r' \"{ip}\"'.format(ip=item) for item in Address]) + r"\n ]" 51 | else: # 只有一个值 52 | local_address = r'\"{ip}\"'.format(ip=Address[0]) 53 | MTU = param.get('MTU', 1408) if MTU is None else MTU 54 | nekoray_str_json = '{"_v":0,"addr":"127.0.0.1","cmd":[""],"core":"internal","cs":"{\\n \\"interface_name\\": ' \ 55 | '\\"WARP\\",\\n \\"local_address\\": #local_address,\\n' \ 56 | ' \\"mtu\\": #MUT值,\\n \\"peer_public_key\\": \\"#peer_public_key\\",\\n \\"private_key\\":' \ 57 | ' \\"#private_key\\",\\n \\"server\\": \\"IP地址\\",\\n \\"server_port\\": 端口,\\n ' \ 58 | '\\"system_interface\\": false,\\n \\"tag\\": \\"proxy\\",\\n \\"type\\": \\"wireguard' \ 59 | '\\"\\n}","mapping_port":0,"name":"别名","port":1080,"socks_port":0}' 60 | update_key = nekoray_str_json.replace('#peer_public_key', peer_public_key).replace('#private_key', private_key) 61 | update_address = update_key.replace('#local_address', local_address).replace('#MUT值', str(MTU)) 62 | return update_address 63 | 64 | 65 | if __name__ == '__main__': 66 | """判断文件是否存在或文件的大小为0""" 67 | files = ["配置文件/wg-config.conf", "result.csv"] 68 | for file in files: 69 | check_file_exist_or_zero_size(file) # 检查文件是否存在 70 | """MTU值的修改""" 71 | print("是否修改MTU值?输入内容为空时,就默认为配置文件的值,配置文件中没有MTU值,就使用1408;") 72 | while True: 73 | input_mtu = input("这里输入MTU值,取值范围为1280~1500:") 74 | if (input_mtu.isdigit() and 1280 <= int(input_mtu) <= 1500) or input_mtu.strip() == '': 75 | break 76 | input_country = input('添加节点名称或别名的前缀吗?(比如,CN):').strip() 77 | country = f'{input_country.strip()}_' if input_country != '' else '' 78 | base_str = None 79 | if input_mtu.isdigit(): 80 | base_str = update_base_info(conf_file=files[0], MTU=input_mtu) # 调用函数 81 | else: 82 | base_str = update_base_info(conf_file=files[0]) # 调用函数 83 | endpoints = read_ip_endpoints(csv_file=files[1]) 84 | output_file = 'output-node.txt' # nekoray节点保存到这里 85 | f = open(output_file, mode='w', encoding='utf-8') 86 | for endpoint in endpoints: 87 | ip = endpoint.rsplit(':', 1)[0] 88 | ip = ip[1:-1] if ip.startswith('[') and ip.endswith(']') else ip # 针对IPv6地址,写入JSON的server中要去掉中括号 89 | port = endpoint.rsplit(':', 1)[1] 90 | remarks = f"{ip}:{port}" if ip.count(":") == 0 else f"[{ip}]:{port}" # 节点的别名、节点的名称(不重要,ipv6的加上中括号) 91 | node = base_str.replace('别名', f'{country}{remarks}').replace('IP地址', ip).replace('端口', port) 92 | encoded = base64.b64encode(node.encode('utf-8'), altchars=b'-_') 93 | encoded_str = str(encoded, encoding='utf-8') 94 | transport_protocol = "nekoray://custom#" # 在base64编码好的字符串前缀添加这个前缀(NekoBox软件专用的前缀) 95 | nekoray_node = transport_protocol + encoded_str 96 | f.write(f"{nekoray_node}\n") 97 | f.flush() 98 | print(f"已经将节点写入{output_file}文件中!\n") 99 | f.close() 100 | os.system("pause") 101 | -------------------------------------------------------------------------------- /ip.txt: -------------------------------------------------------------------------------- 1 | 162.159.192.107:878 2 | 162.159.195.74:968 3 | 162.159.195.27:2371 4 | 162.159.195.242:2371 5 | 162.159.192.254:878 6 | 162.159.192.150:7281 7 | 162.159.192.238:878 8 | 162.159.195.248:968 9 | 162.159.192.220:878 10 | 162.159.192.125:878 11 | 162.159.195.58:968 12 | 162.159.192.149:7281 13 | 162.159.192.77:878 14 | 162.159.192.58:7281 15 | 162.159.195.241:2371 16 | 162.159.192.150:878 17 | 162.159.195.50:968 18 | 162.159.192.149:878 19 | 162.159.192.221:878 20 | 162.159.195.68:2371 21 | 162.159.195.26:2371 22 | 162.159.192.34:7281 23 | 162.159.192.198:7281 24 | 162.159.192.238:7281 25 | 162.159.192.65:7281 26 | 162.159.195.54:968 27 | 162.159.195.44:968 28 | 162.159.192.199:878 29 | 162.159.195.83:2371 30 | 162.159.192.53:878 31 | 162.159.192.239:7281 32 | 162.159.192.135:878 33 | 162.159.195.35:2371 34 | 162.159.192.138:878 35 | 162.159.192.53:7281 36 | 162.159.192.62:878 37 | 162.159.195.245:2371 38 | 162.159.195.59:968 39 | 162.159.192.88:7281 40 | 162.159.192.136:7281 41 | 162.159.195.222:878 42 | 162.159.192.62:7281 43 | 162.159.195.89:2371 44 | 162.159.195.49:968 45 | 162.159.195.94:2371 46 | 162.159.192.88:878 47 | 162.159.195.39:2371 48 | 162.159.195.43:968 49 | 162.159.192.236:878 50 | 162.159.192.136:878 51 | 162.159.192.157:7281 52 | 162.159.192.83:878 53 | 162.159.195.72:2371 54 | 162.159.192.250:7281 55 | 162.159.195.239:2371 56 | 162.159.195.227:968 57 | 162.159.192.215:878 58 | 162.159.195.50:2371 59 | 162.159.192.84:878 60 | 162.159.192.25:7281 61 | 162.159.195.58:2371 62 | 162.159.192.38:7281 63 | 162.159.195.220:878 64 | 162.159.195.34:968 65 | 162.159.192.58:878 66 | 162.159.195.31:2371 67 | 162.159.195.31:968 68 | 162.159.192.248:878 69 | 162.159.192.210:7281 70 | 162.159.195.242:968 71 | 162.159.192.151:7281 72 | 162.159.192.147:7281 73 | 162.159.195.30:2371 74 | 162.159.192.254:7281 75 | 162.159.192.221:7281 76 | 162.159.192.189:878 77 | 162.159.192.189:7281 78 | 162.159.195.77:968 79 | 162.159.192.30:7281 80 | 162.159.195.27:968 81 | 162.159.192.125:7281 82 | 162.159.192.215:7281 83 | 162.159.192.122:7281 84 | 162.159.195.44:2371 85 | 162.159.192.190:7281 86 | 162.159.195.5:968 87 | 162.159.195.49:2371 88 | 162.159.192.141:878 89 | 162.159.192.165:878 90 | 162.159.195.52:2371 91 | 162.159.192.116:7281 92 | 162.159.195.48:968 93 | 162.159.192.193:7281 94 | 162.159.195.229:2371 95 | 162.159.195.227:2371 96 | 162.159.195.235:2371 97 | 162.159.192.168:7281 98 | 162.159.192.234:7281 99 | 162.159.195.65:2371 100 | 162.159.195.226:2371 101 | 162.159.192.199:7281 102 | 162.159.192.79:7281 103 | 162.159.195.245:968 104 | 162.159.195.51:968 105 | 162.159.192.165:7281 106 | 162.159.192.116:878 107 | 162.159.192.196:7281 108 | 162.159.192.225:7281 109 | 162.159.192.85:878 110 | 162.159.195.53:2371 111 | 162.159.195.51:2371 112 | 162.159.192.65:878 113 | 162.159.192.117:7281 114 | 162.159.195.226:968 115 | 162.159.195.239:968 116 | 162.159.195.42:968 117 | 162.159.195.228:968 118 | 162.159.195.229:968 119 | 162.159.192.225:878 120 | 162.159.192.85:7281 121 | 162.159.195.28:2371 122 | 162.159.195.48:2371 123 | 162.159.192.196:878 124 | 162.159.192.50:878 125 | 162.159.195.228:2371 126 | 162.159.192.138:7281 127 | 162.159.192.50:7281 128 | 162.159.195.39:968 129 | 162.159.192.185:878 130 | 162.159.195.90:2371 131 | 162.159.192.192:878 132 | 162.159.195.43:2371 133 | 162.159.195.185:878 134 | 162.159.192.239:878 135 | 162.159.192.252:7281 136 | 162.159.195.246:2371 137 | 162.159.192.142:7281 138 | 162.159.192.135:7281 139 | 162.159.192.251:7281 140 | 162.159.192.222:7281 141 | 162.159.192.84:7281 142 | 162.159.195.88:2371 143 | 162.159.195.222:7281 144 | 162.159.192.83:7281 145 | 162.159.195.241:968 146 | 162.159.192.38:878 147 | 162.159.192.195:7281 148 | 162.159.192.236:7281 149 | 162.159.192.40:878 150 | 162.159.192.203:7281 151 | 162.159.192.129:878 152 | 162.159.192.148:7281 153 | 162.159.195.0:7281 154 | 162.159.192.248:7281 155 | 162.159.192.129:7281 156 | 162.159.195.246:968 157 | 162.159.192.151:878 158 | 162.159.192.123:7281 159 | 162.159.195.101:7281 160 | 162.159.192.25:878 161 | 162.159.195.17:878 162 | 162.159.192.252:878 163 | 162.159.192.154:7281 164 | 162.159.192.55:878 165 | 162.159.192.250:878 166 | 162.159.192.157:878 167 | 162.159.192.226:7281 168 | 162.159.192.203:878 169 | 162.159.192.210:878 170 | 162.159.192.61:7281 171 | 162.159.192.158:7281 172 | 162.159.192.154:878 173 | 162.159.192.168:878 174 | 162.159.192.253:7281 175 | 162.159.192.86:878 176 | 162.159.192.40:7281 177 | 162.159.192.195:878 178 | 162.159.192.226:878 179 | 162.159.192.206:7281 180 | 162.159.192.206:878 181 | 162.159.192.141:7281 182 | 162.159.192.231:7281 183 | 162.159.192.30:878 184 | 162.159.192.134:7281 185 | 162.159.192.61:878 186 | 162.159.192.108:7281 187 | 162.159.192.160:7281 188 | 162.159.192.234:878 189 | 162.159.192.123:878 190 | 162.159.192.148:878 191 | 162.159.192.86:7281 192 | 162.159.192.158:878 193 | 162.159.195.5:2371 194 | 162.159.192.107:7281 195 | 162.159.195.248:2371 196 | 162.159.192.78:878 197 | 162.159.192.108:878 198 | 162.159.192.134:878 199 | -------------------------------------------------------------------------------- /1.生成单个nekoray节点.py: -------------------------------------------------------------------------------- 1 | import pyperclip # 将指定的运行结果自动复制到剪切板 2 | import base64 3 | import os 4 | import sys 5 | import re 6 | 7 | 8 | # 检查文件是否存在或大小为0,即文件无效 9 | def check_file_exist_or_zero_size(file): 10 | if not os.path.exists(file) or os.stat(file).st_size == 0: 11 | sys.exit() 12 | 13 | 14 | # 读取配置文件的信息 15 | def read_wireguard_key_parameters(conf_file): 16 | with open(file=conf_file, mode='r', encoding='utf-8') as f: 17 | wireguard_param = dict() 18 | for line in f: 19 | if line: 20 | if line.startswith("PrivateKey"): 21 | wireguard_param["PrivateKey"] = line.strip().replace(' ', '').replace("PrivateKey=", '') 22 | if line.startswith("PublicKey"): 23 | wireguard_param["PublicKey"] = line.strip().replace(' ', '').replace("PublicKey=", '') 24 | if line.startswith("Address"): 25 | wireguard_param["Address"] = line.strip().replace(' ', '').replace("Address=", '').split(',') 26 | if line.startswith("MTU"): 27 | wireguard_param["MTU"] = line.strip().replace(' ', '').replace("MTU=", '') 28 | return wireguard_param 29 | 30 | 31 | # 将从配置文件中读取到信息,写入到指定的JSON字符串中 32 | def update_base_info(conf_file, MTU=None): 33 | param = read_wireguard_key_parameters(conf_file) 34 | peer_public_key = param["PublicKey"].strip() 35 | private_key = param["PrivateKey"].strip() 36 | Address = param.get("Address") 37 | # if条件针对wireguard配置中,Address行的值有多个值或一个值的情况 38 | if len(Address) > 1: # 多个值(一般是IPv4 CIDR 和 IPv6 CIDR) 39 | local_address = r"[\n" + ','.join([r' \"{ip}\"'.format(ip=item) for item in Address]) + r"\n ]" 40 | else: # 只有一个值 41 | local_address = r'\"{ip}\"'.format(ip=Address[0]) 42 | MTU = param.get('MTU', 1408) if MTU is None else MTU 43 | nekoray_str_json = '{"_v":0,"addr":"127.0.0.1","cmd":[""],"core":"internal","cs":"{\\n \\"interface_name\\": ' \ 44 | '\\"WARP\\",\\n \\"local_address\\": #local_address,\\n' \ 45 | ' \\"mtu\\": #MUT值,\\n \\"peer_public_key\\": \\"#peer_public_key\\",\\n \\"private_key\\":' \ 46 | ' \\"#private_key\\",\\n \\"server\\": \\"IP地址\\",\\n \\"server_port\\": 端口,\\n ' \ 47 | '\\"system_interface\\": false,\\n \\"tag\\": \\"proxy\\",\\n \\"type\\": \\"wireguard' \ 48 | '\\"\\n}","mapping_port":0,"name":"别名","port":1080,"socks_port":0}' 49 | update_key = nekoray_str_json.replace('#peer_public_key', peer_public_key).replace('#private_key', private_key) 50 | update_address = update_key.replace('#local_address', local_address).replace('#MUT值', str(MTU)) 51 | return update_address 52 | 53 | 54 | # 判断是否为IP地址(IPv4或IPv6) 55 | def is_ip_address(ip_addr): 56 | """ 匹配 IPv4 和 IPv6 地址 """ 57 | ipv4_pattern = r'^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$' 58 | ipv6_pattern = r'^(?:(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|(?:[0-9a-fA-F]{1,4}:){1,7}:|(?:[0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|(?:[0-9a-fA-F]{1,4}:){1,5}(?::[0-9a-fA-F]{1,4}){1,2}|(?:[0-9a-fA-F]{1,4}:){1,4}(?::[0-9a-fA-F]{1,4}){1,3}|(?:[0-9a-fA-F]{1,4}:){1,3}(?::[0-9a-fA-F]{1,4}){1,4}|(?:[0-9a-fA-F]{1,4}:){1,2}(?::[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:(?:(?::[0-9a-fA-F]{1,4}){1,6})|:(?:(?::[0-9a-fA-F]{1,4}){1,7}|:))$' 59 | try: 60 | addr = ip_addr.rsplit(":", 1)[0] 61 | ip = addr[1:-1] if addr.startswith('[') and addr.endswith(']') else addr 62 | port = ip_addr.rsplit(':', 1)[1] if ip_addr.count(":") == 1 or ( 63 | ip_addr.count(":") > 3 and "]:" in ip_addr) else None 64 | if re.match(ipv4_pattern, ip) and (port.isdigit() and int(port) >= 80): 65 | ipv4 = re.match(ipv4_pattern, ip).group(0) 66 | return True 67 | elif re.match(ipv6_pattern, ip) and (port.isdigit() and int(port) >= 80): 68 | ipv6 = re.match(ipv6_pattern, ip).group(0) 69 | return True 70 | except Exception as e: 71 | pass 72 | 73 | 74 | if __name__ == '__main__': 75 | """判断文件是否存在或文件的大小为0""" 76 | file = "配置文件/wg-config.conf" 77 | check_file_exist_or_zero_size(file) # 检查文件是否存在 78 | """MTU值的修改""" 79 | print("是否修改MTU值?输入内容为空时,就默认为配置文件的值,配置文件中没有MTU值,就使用1408;") 80 | while True: 81 | input_mtu = input("这里输入MTU值,取值范围为1280~1500:") 82 | if (input_mtu.isdigit() and 1280 <= int(input_mtu) <= 1500) or input_mtu.strip() == '': 83 | break 84 | base_str = None 85 | if input_mtu.isdigit(): 86 | base_str = update_base_info(file, MTU=input_mtu) # 调用函数 87 | else: 88 | base_str = update_base_info(file) # 调用函数 89 | print() 90 | while True: 91 | while True: 92 | input_endpoint = input("输入优选IP(格式:162.159.192.10:891),输入q、quit、exit退出程序:").strip() 93 | state = is_ip_address(input_endpoint) 94 | if state: 95 | break 96 | if input_endpoint.lower() in ["q", "quit", "exit"]: 97 | sys.exit() 98 | addr = input_endpoint.rsplit(":", 1)[0] 99 | ip = addr[1:-1] if addr.startswith('[') and addr.endswith(']') else addr # 去掉IPv6的中括号 100 | port = input_endpoint.rsplit(':', 1)[1] 101 | input_country = input('添加节点名称或别名的前缀吗?(比如,CN):') 102 | country = f'{input_country.strip()}_' if input_country != '' else '' # 是否添加前缀,通常使用国家或地区的的2个字母 103 | remarks = f"{ip}:{port}" if ip.count(":") == 0 else f"[{ip}]:{port}" # 节点的别名、节点的名称(不重要) 104 | node = base_str.replace('别名', f'{country}{remarks}').replace('IP地址', ip).replace('端口', port) 105 | encoded = base64.b64encode(node.encode('utf-8'), altchars=b'-_') 106 | encoded_str = str(encoded, encoding='utf-8') 107 | transport_protocol = "nekoray://custom#" # 在base64编码好的字符串的前面添加这个前缀(NekoBox软件专用的前缀) 108 | nekoray_node = transport_protocol + encoded_str 109 | pyperclip.copy(nekoray_node) 110 | print(f"{'-' * 52}NekoRAY节点如下:{'-' * 52}\n{nekoray_node}\n{'-' * 120}") 111 | print("节点已经复制到剪切板,可以黏贴到其它地方!") 112 | print(f"{'-' * 120}") 113 | -------------------------------------------------------------------------------- /5.[Android]批量构建sn的wireguard节点(txt文件).py: -------------------------------------------------------------------------------- 1 | from dataclasses import field, dataclass 2 | import base64 3 | import zlib 4 | import os 5 | import sys 6 | 7 | 8 | # 检查文件是否存在或大小为0,即文件无效 9 | def check_file_exist_or_zero_size(file): 10 | if not os.path.exists(file) or os.stat(file).st_size == 0: 11 | sys.exit() 12 | 13 | 14 | # 读取优选ip的ip.txt文件 15 | def read_ip_endpoints(txt_file): 16 | endpoints = [] 17 | with open(file=txt_file, mode='r', encoding='utf-8') as rf: 18 | for item in rf.readlines(): 19 | if item.strip() != "": 20 | endpoints.append(item.strip()) 21 | return endpoints 22 | 23 | 24 | # 读取wg-config.conf配置文件的信息 25 | def read_wireguard_key_parameters(conf_file): 26 | with open(file=conf_file, mode='r', encoding='utf-8') as f: 27 | wireguard_param = dict() 28 | for line in f: 29 | if line: 30 | if line.startswith("PrivateKey"): 31 | wireguard_param["PrivateKey"] = line.strip().replace(' ', '').replace("PrivateKey=", '') 32 | if line.startswith("PublicKey"): 33 | wireguard_param["PublicKey"] = line.strip().replace(' ', '').replace("PublicKey=", '') 34 | if line.startswith("Address"): 35 | wireguard_param["Address"] = line.strip().replace(' ', '').replace("Address=", '').split(',') 36 | if line.startswith("MTU"): 37 | wireguard_param["MTU"] = line.strip().replace(' ', '').replace("MTU=", '') 38 | if line.startswith("Reserved"): 39 | wireguard_param["Reserved"] = line.strip().replace(' ', '').replace("Reserved=", '') 40 | return wireguard_param 41 | 42 | 43 | def encode_sn_str(s: str) -> bytes: 44 | if not s: 45 | return b'\x81' 46 | if len(s) == 1: 47 | return b'\x82' + s.encode() 48 | ret = s.encode() 49 | ret = ret[:-1] + (ret[-1] | 0x80).to_bytes(1, 'little') 50 | return ret 51 | 52 | 53 | def p32(n: int): 54 | return n.to_bytes(4, 'little') 55 | 56 | 57 | def p8(n: int): 58 | return n.to_bytes(1, 'little') 59 | 60 | 61 | @dataclass(init=True, repr=True) 62 | class SnBase: 63 | def serialize(self) -> bytes: 64 | ret = b'' 65 | for _, v in self.__dict__.items(): 66 | ret += self.obj_serialize(v) 67 | return ret 68 | 69 | @classmethod 70 | def obj_serialize(cls, obj) -> bytes: 71 | ret = b'' 72 | match type(obj): 73 | case __builtins__.str: 74 | ret += encode_sn_str(obj) 75 | case __builtins__.bool: 76 | ret += p8(int(obj)) 77 | case __builtins__.int: 78 | ret += p32(obj) 79 | case _: 80 | if isinstance(obj, SnBase): 81 | ret += obj.serialize() 82 | return ret 83 | 84 | 85 | @dataclass(init=True, repr=True) 86 | class SnServer(SnBase): 87 | server_address: str = '162.159.192.10' 88 | server_port: int = 2408 89 | 90 | 91 | @dataclass(init=True, repr=True) 92 | class WireguardSerialize(SnBase): 93 | version: int = 2 94 | server: SnServer = field(default_factory=SnServer) 95 | localAddress: str = "172.16.0.2/32" 96 | privateKey: str = '' 97 | peerPublicKey: str = 'bmXOC+F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo=' 98 | peerPreSharedKey: str = '' 99 | mtu: int = 1420 100 | reserved: str = "" 101 | 102 | def serialize(self) -> bytes: 103 | ret = b'' 104 | ret += self.obj_serialize(self.version) 105 | ret += self.obj_serialize(self.server) 106 | ret += self.obj_serialize(self.localAddress) 107 | ret += self.obj_serialize(self.privateKey) 108 | ret += self.obj_serialize(self.peerPublicKey) 109 | ret += self.obj_serialize(self.peerPreSharedKey) 110 | ret += self.obj_serialize(self.mtu) 111 | ret += self.obj_serialize(self.reserved) 112 | return ret 113 | 114 | 115 | @dataclass(init=True, repr=True) 116 | class SnMeta(SnBase): 117 | extraVersion: int = 2 118 | name: str = '' 119 | customOutboundJson: str = '' 120 | customConfigJson: str = '' 121 | 122 | 123 | @dataclass(init=True, repr=True) 124 | class Wireguard(SnBase): 125 | WireguardSerialize: WireguardSerialize = field(default_factory=WireguardSerialize) 126 | sn_meta: SnMeta = field(default_factory=SnMeta) 127 | 128 | def __str__(self) -> str: 129 | # print(self.serialize()) 130 | return f'sn://wg?{base64.urlsafe_b64encode(zlib.compress(self.serialize())).decode()}' 131 | 132 | 133 | if __name__ == '__main__': 134 | """ 读取外部文件的数据 """ 135 | files = ["配置文件/wg-config.conf", "ip.txt"] 136 | for file in files: 137 | check_file_exist_or_zero_size(file) # 检查文件是否存在 138 | param = read_wireguard_key_parameters(files[0]) 139 | private_key = param.get("PrivateKey") 140 | private_key = private_key if private_key else "+HfkMSyh7obEkX4J8Qa7Xk77CLVn45AW4CdBbnFNaGc=" # 找不到就使用这个私钥 141 | public_key = param.get("PublicKey") 142 | public_key = public_key if public_key else "bmXOC+F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo=" # 找不到就使用这个公钥 143 | Reserved = param.get("Reserved") 144 | Reserved = Reserved if Reserved else "" # 找不到,就用空字符代替 145 | mtu = param.get("MTU") 146 | mtu = int(mtu) if mtu else 1280 # 找不到,就使用1280代替 147 | Address = param.get("Address") 148 | if Address is None or Address == "": 149 | local_address = "172.16.0.2/32" 150 | else: 151 | local_address = ",".join(Address) if isinstance(Address, list) else "172.16.0.2/32" 152 | 153 | """ 构建'sn://sg?'的链接 """ 154 | results = [] 155 | endpoints = read_ip_endpoints(files[1]) 156 | for ip_with_port in endpoints: 157 | try: 158 | ip = ip_with_port.rsplit(":", 1)[0].strip("[").strip("]") 159 | port = ip_with_port.rsplit(":", 1)[1] 160 | serialize_obj = WireguardSerialize(server=SnServer(ip, int(port)), 161 | localAddress=local_address, 162 | privateKey=private_key, 163 | peerPublicKey=public_key, 164 | mtu=int(mtu), reserved=Reserved) 165 | # 配置名称,不能取中文名称,也不能取一些特殊字符,具体支持哪些字符,自己测试 166 | config_name = f"warp-{ip_with_port}" 167 | sn_wireguard = Wireguard(WireguardSerialize=serialize_obj, sn_meta=SnMeta(name=config_name)) 168 | results.append(str(sn_wireguard)) 169 | print(sn_wireguard) 170 | except Exception as e: 171 | pass 172 | 173 | """ 将结果写入文件中 """ 174 | if len(results) > 0: 175 | output_file = 'output-node.txt' 176 | f = open(output_file, mode='w', encoding='utf-8') 177 | f.writelines("\n".join(results)) 178 | f.close() 179 | print(f"已经将节点写入{output_file}文件中!\n") 180 | os.system("pause") 181 | -------------------------------------------------------------------------------- /6.[Android]批量构建sn的wireguard节点(csv文件).py: -------------------------------------------------------------------------------- 1 | from dataclasses import field, dataclass 2 | import base64 3 | import zlib 4 | import os 5 | import sys 6 | 7 | 8 | # 检查文件是否存在或大小为0,即文件无效 9 | def check_file_exist_or_zero_size(file): 10 | if not os.path.exists(file) or os.stat(file).st_size == 0: 11 | sys.exit() 12 | 13 | 14 | # 读取优选ip的result.csv文件 15 | def read_ip_endpoints(csv_file): 16 | endpoints = [] 17 | with open(file=csv_file, mode='r', encoding='utf-8') as rf: 18 | next(rf) 19 | for line in rf: 20 | delay = line.strip().split(',')[-1].replace(' ', '').replace('ms', '') 21 | if int(delay) < 500: 22 | endpoint = line.strip().split(',')[0] 23 | endpoints.append(endpoint) 24 | return endpoints 25 | 26 | 27 | # 读取wg-config.conf配置文件的信息 28 | def read_wireguard_key_parameters(conf_file): 29 | with open(file=conf_file, mode='r', encoding='utf-8') as f: 30 | wireguard_param = dict() 31 | for line in f: 32 | if line: 33 | if line.startswith("PrivateKey"): 34 | wireguard_param["PrivateKey"] = line.strip().replace(' ', '').replace("PrivateKey=", '') 35 | if line.startswith("PublicKey"): 36 | wireguard_param["PublicKey"] = line.strip().replace(' ', '').replace("PublicKey=", '') 37 | if line.startswith("Address"): 38 | wireguard_param["Address"] = line.strip().replace(' ', '').replace("Address=", '').split(',') 39 | if line.startswith("MTU"): 40 | wireguard_param["MTU"] = line.strip().replace(' ', '').replace("MTU=", '') 41 | if line.startswith("Reserved"): 42 | wireguard_param["Reserved"] = line.strip().replace(' ', '').replace("Reserved=", '') 43 | return wireguard_param 44 | 45 | 46 | def encode_sn_str(s: str) -> bytes: 47 | if not s: 48 | return b'\x81' 49 | if len(s) == 1: 50 | return b'\x82' + s.encode() 51 | ret = s.encode() 52 | ret = ret[:-1] + (ret[-1] | 0x80).to_bytes(1, 'little') 53 | return ret 54 | 55 | 56 | def p32(n: int): 57 | return n.to_bytes(4, 'little') 58 | 59 | 60 | def p8(n: int): 61 | return n.to_bytes(1, 'little') 62 | 63 | 64 | @dataclass(init=True, repr=True) 65 | class SnBase: 66 | def serialize(self) -> bytes: 67 | ret = b'' 68 | for _, v in self.__dict__.items(): 69 | ret += self.obj_serialize(v) 70 | return ret 71 | 72 | @classmethod 73 | def obj_serialize(cls, obj) -> bytes: 74 | ret = b'' 75 | match type(obj): 76 | case __builtins__.str: 77 | ret += encode_sn_str(obj) 78 | case __builtins__.bool: 79 | ret += p8(int(obj)) 80 | case __builtins__.int: 81 | ret += p32(obj) 82 | case _: 83 | if isinstance(obj, SnBase): 84 | ret += obj.serialize() 85 | return ret 86 | 87 | 88 | @dataclass(init=True, repr=True) 89 | class SnServer(SnBase): 90 | server_address: str = '162.159.192.10' 91 | server_port: int = 2408 92 | 93 | 94 | @dataclass(init=True, repr=True) 95 | class WireguardSerialize(SnBase): 96 | version: int = 2 97 | server: SnServer = field(default_factory=SnServer) 98 | localAddress: str = "172.16.0.2/32" 99 | privateKey: str = '' 100 | peerPublicKey: str = 'bmXOC+F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo=' 101 | peerPreSharedKey: str = '' 102 | mtu: int = 1420 103 | reserved: str = "" 104 | 105 | def serialize(self) -> bytes: 106 | ret = b'' 107 | ret += self.obj_serialize(self.version) 108 | ret += self.obj_serialize(self.server) 109 | ret += self.obj_serialize(self.localAddress) 110 | ret += self.obj_serialize(self.privateKey) 111 | ret += self.obj_serialize(self.peerPublicKey) 112 | ret += self.obj_serialize(self.peerPreSharedKey) 113 | ret += self.obj_serialize(self.mtu) 114 | ret += self.obj_serialize(self.reserved) 115 | return ret 116 | 117 | 118 | @dataclass(init=True, repr=True) 119 | class SnMeta(SnBase): 120 | extraVersion: int = 2 121 | name: str = '' 122 | customOutboundJson: str = '' 123 | customConfigJson: str = '' 124 | 125 | 126 | @dataclass(init=True, repr=True) 127 | class Wireguard(SnBase): 128 | WireguardSerialize: WireguardSerialize = field(default_factory=WireguardSerialize) 129 | sn_meta: SnMeta = field(default_factory=SnMeta) 130 | 131 | def __str__(self) -> str: 132 | # print(self.serialize()) 133 | return f'sn://wg?{base64.urlsafe_b64encode(zlib.compress(self.serialize())).decode()}' 134 | 135 | 136 | if __name__ == '__main__': 137 | """ 读取外部文件的数据 """ 138 | files = ["配置文件/wg-config.conf", "result.csv"] 139 | for file in files: 140 | check_file_exist_or_zero_size(file) # 检查文件是否存在 141 | param = read_wireguard_key_parameters(files[0]) 142 | private_key = param.get("PrivateKey") 143 | private_key = private_key if private_key else "+HfkMSyh7obEkX4J8Qa7Xk77CLVn45AW4CdBbnFNaGc=" # 找不到就使用这个私钥 144 | public_key = param.get("PublicKey") 145 | public_key = public_key if public_key else "bmXOC+F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo=" # 找不到就使用这个公钥 146 | Reserved = param.get("Reserved") 147 | Reserved = Reserved if Reserved else "" # 找不到,就用空字符代替 148 | mtu = param.get("MTU") 149 | mtu = int(mtu) if mtu else 1280 # 找不到,就使用1280代替 150 | Address = param.get("Address") 151 | if Address is None or Address == "": 152 | local_address = "172.16.0.2/32" 153 | else: 154 | local_address = ",".join(Address) if isinstance(Address, list) else "172.16.0.2/32" 155 | 156 | """ 构建'sn://sg?'的链接 """ 157 | results = [] 158 | endpoints = read_ip_endpoints(files[1]) 159 | for ip_with_port in endpoints: 160 | try: 161 | ip = ip_with_port.rsplit(":", 1)[0].strip("[").strip("]") 162 | port = ip_with_port.rsplit(":", 1)[1] 163 | serialize_obj = WireguardSerialize(server=SnServer(ip, int(port)), 164 | localAddress=local_address, 165 | privateKey=private_key, 166 | peerPublicKey=public_key, 167 | mtu=int(mtu), reserved=Reserved) 168 | # 配置名称,不能取中文名称,也不能取一些特殊字符,具体支持哪些字符,自己测试 169 | config_name = f"warp-{ip_with_port}" 170 | sn_wireguard = Wireguard(WireguardSerialize=serialize_obj, sn_meta=SnMeta(name=config_name)) 171 | results.append(str(sn_wireguard)) 172 | print(sn_wireguard) 173 | except Exception as e: 174 | pass 175 | 176 | """ 将结果写入文件中 """ 177 | if len(results) > 0: 178 | output_file = 'output-node.txt' 179 | f = open(output_file, mode='w', encoding='utf-8') 180 | f.writelines("\n".join(results)) 181 | f.close() 182 | print(f"已经将节点写入{output_file}文件中!\n") 183 | os.system("pause") 184 | -------------------------------------------------------------------------------- /result.csv: -------------------------------------------------------------------------------- 1 | IP:PORT, LOSS, DELAY 2 | 188.114.98.38:2506,0.00%,202 ms 3 | 188.114.99.62:894,0.00%,203 ms 4 | 188.114.96.32:894,0.00%,203 ms 5 | 188.114.98.243:894,0.00%,203 ms 6 | 188.114.96.225:894,0.00%,207 ms 7 | 188.114.96.131:894,0.00%,210 ms 8 | 188.114.97.170:2506,0.00%,210 ms 9 | 188.114.98.14:894,0.00%,211 ms 10 | 188.114.97.235:894,0.00%,212 ms 11 | 188.114.96.57:894,0.00%,215 ms 12 | 188.114.96.66:2506,0.00%,215 ms 13 | 188.114.98.131:2506,0.00%,215 ms 14 | 188.114.99.86:894,0.00%,217 ms 15 | 188.114.98.243:2506,0.00%,218 ms 16 | 188.114.98.238:894,0.00%,221 ms 17 | 188.114.96.173:894,0.00%,222 ms 18 | 188.114.96.206:2506,0.00%,223 ms 19 | 188.114.98.152:2506,0.00%,224 ms 20 | 188.114.97.234:894,0.00%,224 ms 21 | 188.114.96.101:2506,0.00%,224 ms 22 | 188.114.97.145:2506,0.00%,224 ms 23 | 188.114.97.61:2506,0.00%,224 ms 24 | 188.114.97.100:2506,0.00%,225 ms 25 | 188.114.98.49:894,0.00%,225 ms 26 | 188.114.99.210:2506,0.00%,225 ms 27 | 188.114.99.149:2506,0.00%,225 ms 28 | 188.114.96.224:894,0.00%,225 ms 29 | 188.114.97.61:894,0.00%,225 ms 30 | 188.114.99.216:2506,0.00%,226 ms 31 | 188.114.97.72:2506,0.00%,227 ms 32 | 188.114.96.10:894,0.00%,227 ms 33 | 188.114.96.104:894,0.00%,227 ms 34 | 188.114.97.145:894,0.00%,228 ms 35 | 188.114.96.57:2506,0.00%,228 ms 36 | 188.114.96.104:2506,0.00%,229 ms 37 | 188.114.99.32:894,0.00%,229 ms 38 | 188.114.96.77:894,0.00%,230 ms 39 | 188.114.98.30:894,0.00%,230 ms 40 | 188.114.99.90:894,0.00%,230 ms 41 | 188.114.98.14:2506,0.00%,231 ms 42 | 188.114.96.136:894,0.00%,231 ms 43 | 188.114.98.239:894,0.00%,231 ms 44 | 188.114.97.24:894,0.00%,231 ms 45 | 188.114.98.210:2506,0.00%,231 ms 46 | 188.114.99.210:894,0.00%,231 ms 47 | 188.114.97.31:2506,0.00%,231 ms 48 | 188.114.99.214:2506,0.00%,231 ms 49 | 188.114.98.90:2506,0.00%,231 ms 50 | 188.114.96.206:894,0.00%,232 ms 51 | 188.114.99.214:894,0.00%,232 ms 52 | 188.114.97.25:894,0.00%,233 ms 53 | 188.114.96.136:2506,0.00%,233 ms 54 | 188.114.98.254:894,0.00%,233 ms 55 | 188.114.97.29:2506,0.00%,234 ms 56 | 188.114.99.83:894,0.00%,234 ms 57 | 188.114.97.141:894,0.00%,234 ms 58 | 188.114.98.131:894,0.00%,234 ms 59 | 188.114.99.241:2506,0.00%,234 ms 60 | 188.114.98.166:2506,0.00%,235 ms 61 | 188.114.97.111:894,0.00%,235 ms 62 | 188.114.96.132:2506,0.00%,235 ms 63 | 188.114.97.144:2506,0.00%,235 ms 64 | 188.114.97.64:2506,0.00%,236 ms 65 | 188.114.96.141:2506,0.00%,236 ms 66 | 188.114.98.30:2506,0.00%,236 ms 67 | 188.114.98.51:894,0.00%,236 ms 68 | 188.114.98.166:894,0.00%,237 ms 69 | 188.114.99.241:894,0.00%,237 ms 70 | 188.114.96.210:2506,0.00%,237 ms 71 | 188.114.96.186:894,0.00%,237 ms 72 | 188.114.98.162:2506,0.00%,237 ms 73 | 188.114.97.188:2506,0.00%,238 ms 74 | 188.114.96.35:2506,0.00%,238 ms 75 | 188.114.96.172:894,0.00%,238 ms 76 | 188.114.96.32:2506,0.00%,238 ms 77 | 188.114.99.32:2506,0.00%,239 ms 78 | 188.114.98.146:2506,0.00%,240 ms 79 | 188.114.99.86:2506,0.00%,240 ms 80 | 188.114.98.210:894,0.00%,242 ms 81 | 188.114.99.87:894,0.00%,242 ms 82 | 188.114.99.10:894,0.00%,242 ms 83 | 188.114.97.64:894,0.00%,243 ms 84 | 188.114.96.183:894,0.00%,243 ms 85 | 188.114.96.131:2506,0.00%,243 ms 86 | 188.114.98.152:894,0.00%,243 ms 87 | 188.114.96.10:2506,0.00%,243 ms 88 | 188.114.99.83:2506,0.00%,243 ms 89 | 188.114.96.83:2506,0.00%,243 ms 90 | 188.114.96.76:2506,0.00%,244 ms 91 | 188.114.96.192:2506,0.00%,244 ms 92 | 188.114.99.50:894,0.00%,244 ms 93 | 188.114.98.238:2506,0.00%,244 ms 94 | 188.114.97.188:894,0.00%,244 ms 95 | 188.114.99.50:2506,0.00%,244 ms 96 | 188.114.99.169:894,0.00%,245 ms 97 | 188.114.97.203:2506,0.00%,245 ms 98 | 188.114.99.15:894,0.00%,245 ms 99 | 188.114.96.101:894,0.00%,245 ms 100 | 188.114.99.81:2506,0.00%,245 ms 101 | 188.114.97.69:2506,0.00%,245 ms 102 | 188.114.98.190:894,0.00%,245 ms 103 | 188.114.97.144:894,0.00%,246 ms 104 | 188.114.96.224:2506,0.00%,246 ms 105 | 188.114.97.236:2506,0.00%,246 ms 106 | 188.114.96.144:894,0.00%,246 ms 107 | 188.114.98.3:894,0.00%,246 ms 108 | 188.114.97.29:894,0.00%,247 ms 109 | 188.114.99.174:2506,0.00%,247 ms 110 | 188.114.99.90:2506,0.00%,247 ms 111 | 188.114.97.59:894,0.00%,248 ms 112 | 188.114.99.10:2506,0.00%,248 ms 113 | 188.114.97.244:894,0.00%,248 ms 114 | 188.114.98.6:894,0.00%,248 ms 115 | 188.114.98.235:894,0.00%,248 ms 116 | 188.114.98.204:894,0.00%,248 ms 117 | 188.114.97.203:894,0.00%,249 ms 118 | 188.114.98.185:2506,0.00%,249 ms 119 | 188.114.97.8:2506,0.00%,249 ms 120 | 188.114.98.90:894,0.00%,250 ms 121 | 188.114.98.190:2506,0.00%,250 ms 122 | 188.114.99.16:894,0.00%,250 ms 123 | 188.114.99.134:2506,0.00%,250 ms 124 | 188.114.96.141:894,0.00%,250 ms 125 | 188.114.98.235:2506,0.00%,250 ms 126 | 188.114.96.40:2506,0.00%,251 ms 127 | 188.114.99.134:894,0.00%,251 ms 128 | 188.114.96.172:2506,0.00%,252 ms 129 | 188.114.99.18:894,0.00%,252 ms 130 | 188.114.96.0:2506,0.00%,254 ms 131 | 188.114.96.0:894,0.00%,255 ms 132 | 188.114.97.111:2506,0.00%,255 ms 133 | 188.114.99.174:894,0.00%,256 ms 134 | 188.114.97.236:894,0.00%,259 ms 135 | 188.114.99.149:894,10.00%,288 ms 136 | 188.114.99.139:894,10.00%,288 ms 137 | 188.114.96.210:894,10.00%,289 ms 138 | 188.114.99.46:894,10.00%,291 ms 139 | 188.114.99.216:894,10.00%,291 ms 140 | 188.114.96.66:894,10.00%,295 ms 141 | 188.114.98.38:894,10.00%,295 ms 142 | 188.114.99.62:2506,10.00%,297 ms 143 | 188.114.97.24:2506,10.00%,297 ms 144 | 188.114.97.31:894,10.00%,297 ms 145 | 188.114.96.186:2506,10.00%,299 ms 146 | 188.114.99.139:2506,10.00%,301 ms 147 | 188.114.99.60:894,10.00%,302 ms 148 | 188.114.99.15:2506,10.00%,307 ms 149 | 188.114.97.100:894,10.00%,307 ms 150 | 188.114.98.49:2506,10.00%,307 ms 151 | 188.114.98.234:2506,10.00%,308 ms 152 | 188.114.98.185:894,10.00%,308 ms 153 | 188.114.96.183:2506,10.00%,308 ms 154 | 188.114.98.146:894,10.00%,309 ms 155 | 188.114.96.77:2506,10.00%,310 ms 156 | 188.114.97.235:2506,10.00%,311 ms 157 | 188.114.99.182:894,10.00%,311 ms 158 | 188.114.98.239:2506,10.00%,312 ms 159 | 188.114.98.204:2506,10.00%,312 ms 160 | 188.114.99.58:2506,10.00%,313 ms 161 | 188.114.98.177:894,10.00%,313 ms 162 | 188.114.99.16:2506,10.00%,314 ms 163 | 188.114.99.182:2506,10.00%,315 ms 164 | 188.114.98.234:894,10.00%,316 ms 165 | 188.114.98.175:2506,10.00%,317 ms 166 | 188.114.98.3:2506,10.00%,317 ms 167 | 188.114.97.8:894,10.00%,317 ms 168 | 188.114.98.162:894,10.00%,317 ms 169 | 188.114.99.46:2506,10.00%,318 ms 170 | 188.114.99.169:2506,10.00%,318 ms 171 | 188.114.99.58:894,10.00%,319 ms 172 | 188.114.98.51:2506,10.00%,319 ms 173 | 188.114.98.6:2506,10.00%,319 ms 174 | 188.114.97.10:894,10.00%,320 ms 175 | 188.114.97.244:2506,10.00%,320 ms 176 | 188.114.96.192:894,10.00%,320 ms 177 | 188.114.96.35:894,10.00%,322 ms 178 | 188.114.99.81:894,10.00%,322 ms 179 | 188.114.97.69:894,10.00%,326 ms 180 | 188.114.97.10:2506,10.00%,328 ms 181 | 188.114.97.59:2506,10.00%,329 ms 182 | 188.114.99.18:2506,10.00%,331 ms 183 | 188.114.96.225:2506,20.00%,370 ms 184 | 188.114.96.132:894,20.00%,372 ms 185 | 188.114.96.173:2506,20.00%,375 ms 186 | 188.114.97.72:894,20.00%,382 ms 187 | 188.114.96.76:894,20.00%,383 ms 188 | 188.114.96.40:894,20.00%,383 ms 189 | 188.114.97.141:2506,20.00%,384 ms 190 | 188.114.97.234:2506,20.00%,386 ms 191 | 188.114.97.170:894,20.00%,386 ms 192 | 188.114.96.83:894,20.00%,390 ms 193 | 188.114.98.177:2506,20.00%,391 ms 194 | 188.114.98.175:894,20.00%,393 ms 195 | 188.114.98.254:2506,20.00%,399 ms 196 | 188.114.99.87:2506,20.00%,403 ms 197 | 188.114.99.60:2506,30.00%,456 ms 198 | 188.114.98.144:2506,30.00%,461 ms 199 | 188.114.97.25:2506,30.00%,463 ms 200 | 188.114.96.144:2506,30.00%,467 ms 201 | 188.114.98.144:894,30.00%,473 ms 202 | -------------------------------------------------------------------------------- /7.转换为clash配置文件(txt文件).py: -------------------------------------------------------------------------------- 1 | from collections import OrderedDict 2 | import base64 3 | import json 4 | import os 5 | import sys 6 | import re 7 | 8 | 9 | # 检查文件是否存在或大小为0,即文件无效 10 | def check_file_exist_or_zero_size(file): 11 | if not os.path.exists(file) or os.stat(file).st_size == 0: 12 | sys.exit() 13 | 14 | 15 | # 读取wg-config.conf配置文件的信息 16 | def read_wireguard_key_parameters(conf_file): 17 | with open(file=conf_file, mode='r', encoding='utf-8') as f: 18 | wireguard_param = dict() 19 | for line in f: 20 | if line: 21 | if line.startswith("PrivateKey"): 22 | wireguard_param["PrivateKey"] = line.strip().replace(' ', '').replace("PrivateKey=", '') 23 | if line.startswith("PublicKey"): 24 | wireguard_param["PublicKey"] = line.strip().replace(' ', '').replace("PublicKey=", '') 25 | if line.startswith("Address"): 26 | wireguard_param["Address"] = line.strip().replace(' ', '').replace("Address=", '').split(',') 27 | if line.startswith("MTU"): 28 | wireguard_param["MTU"] = line.strip().replace(' ', '').replace("MTU=", '') 29 | if line.startswith("Reserved"): 30 | wireguard_param["Reserved"] = line.strip().replace(' ', '').replace("Reserved=", '') 31 | return wireguard_param 32 | 33 | 34 | # 读取优选ip的ip.txt文件 35 | def read_ip_endpoints(txt_file): 36 | endpoints = [] 37 | with open(file=txt_file, mode='r', encoding='utf-8') as rf: 38 | for item in rf.readlines(): 39 | if item.strip() != "": 40 | endpoints.append(item.strip()) 41 | return endpoints 42 | 43 | 44 | # 使用正则表达检查IP的版本(IPv4、IPv6) 45 | def ip_version(ip): 46 | ipv4_pattern = re.compile(r'^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$') 47 | ipv6_pattern = re.compile(r'^(?:(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|(?:[0-9a-fA-F]{1,4}:){1,7}:|(?:[0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|(?:[0-9a-fA-F]{1,4}:){1,5}(?::[0-9a-fA-F]{1,4}){1,2}|(?:[0-9a-fA-F]{1,4}:){1,4}(?::[0-9a-fA-F]{1,4}){1,3}|(?:[0-9a-fA-F]{1,4}:){1,3}(?::[0-9a-fA-F]{1,4}){1,4}|(?:[0-9a-fA-F]{1,4}:){1,2}(?::[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:(?:(?::[0-9a-fA-F]{1,4}){1,6})|:(?:(?::[0-9a-fA-F]{1,4}){1,7}|:))$') 48 | if ipv4_pattern.match(ip): 49 | return "IPv4" 50 | elif ipv6_pattern.match(ip): 51 | return "IPv6" 52 | else: 53 | return "Invalid" 54 | 55 | 56 | if __name__ == '__main__': 57 | """ 读取外部文件的数据 """ 58 | files = ["配置文件/wg-config.conf", "ip.txt"] 59 | # 检查文件是否存在 60 | for file in files: 61 | check_file_exist_or_zero_size(file) 62 | param = read_wireguard_key_parameters(files[0]) 63 | """ 处理参数,准备给wireguard节点对应的clash配置使用 """ 64 | # 获取 private-key 的值 65 | private_key = param.get("PrivateKey") 66 | private_key = private_key if private_key else "+HfkMSyh7obEkX4J8Qa7Xk77CLVn45AW4CdBbnFNaGc=" # 找不到就使用这个私钥 67 | # 获取 public-key 的值 68 | public_key = param.get("PublicKey") 69 | public_key = public_key if public_key else "bmXOC+F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo=" # 找不到就使用这个公钥 70 | # 获取 reserved 的值,貌似不支持4个字符的reserved值 71 | """ 72 | Reserved = param.get("Reserved") 73 | reserved = "" 74 | if Reserved.startswith('[') and Reserved.endswith(']') and "," in Reserved: 75 | reserved = [int(number) for number in Reserved.strip('[').strip(']').split(',')] 76 | """ 77 | # 获取 mtu 的值 78 | mtu = param.get("MTU") 79 | mtu = int(mtu) if mtu else 1280 # 找不到,就使用1280代替 80 | # 获取clash中wireguard配置中,需要的 ipv6、ip -> ipv4 81 | ipv4_str: str = "" 82 | ipv6_str: str = "" 83 | Address = param.get("Address") 84 | if Address is None or Address == "": 85 | ipv4_str = "172.16.0.2" 86 | if isinstance(Address, list): 87 | ipv4_addr = Address[0].split("/")[0] 88 | ipv4_str = ipv4_addr if ip_version(ipv4_addr) == "IPv4" else "172.16.0.2" # 确保数据是ipv4的地址,否则使用172.16.0.2 89 | ipv6_addr = Address[1].split("/")[0] 90 | ipv6_str = ipv6_addr if ip_version(ipv6_addr) == "IPv6" else "" # 确保数据是ipv6的地址,否则为空 91 | 92 | """ 读取ip.txt的数据 """ 93 | endpoints: list[str] = read_ip_endpoints(files[1]) 94 | 95 | # 待插入clash中的wireguard配置模板 96 | wireguard_str: str = """{"name":"warp-001","type":"wireguard","server":"162.159.192.1","port":2408,"ip":"172.16.0.2","ipv6":"","private-key":"","public-key":"bmXOC+F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo=","pre-shared-key":"","reserved":"","udp":true,"mtu":1280}""" 97 | wireguard_dict: dict = json.loads(wireguard_str) 98 | wireguard_nodes: list = [] 99 | wireguard_names: list = [] 100 | # 使用OrderedDict对endpoints进行去重,并保持顺序,防止生成相同的节点 101 | deduplicated_list = OrderedDict.fromkeys(endpoints) 102 | # 只处理前面300个,防止上千、上万的数据写入一个clash配置文件中,clash能处理?不会导致软件崩溃? 103 | data_list = list(deduplicated_list)[:300] 104 | for i, ip_with_port in enumerate(data_list): 105 | [server, port] = ip_with_port.rsplit(":", 1) 106 | index = str(i + 1).zfill(len(str(len(deduplicated_list)))) 107 | proxy_name: str = f"warp{index}-{str(server).strip('[').strip(']')}" 108 | # 将数据写入wireguard_dict中 109 | wireguard_dict["name"] = proxy_name 110 | wireguard_dict["server"] = str(server).strip("[").strip("]") # 去掉ipv6的中括号 111 | wireguard_dict["port"] = int(port) 112 | wireguard_dict["ip"] = ipv4_str 113 | wireguard_dict["ipv6"] = ipv6_str 114 | wireguard_dict["private-key"] = private_key 115 | wireguard_dict["public-key"] = public_key 116 | # 添加reserved值,不管是数组类型的还是字符串类型的reserved值,会出现无法联网/网络慢 117 | # wireguard_dict["reserved"] = reserved 118 | wireguard_dict["mtu"] = int(mtu) 119 | # 将字典转换为 JSON 字符串(把字典中的True -> true) 120 | wireguard_json_str: str = json.dumps(wireguard_dict) 121 | 122 | # node_prefix: str = " - " 123 | node_prefix: str = base64.b64decode("ICAtIA==").decode("utf-8") 124 | wireguard_nodes.append(f"{node_prefix}{wireguard_json_str}") 125 | 126 | # proxy_name_prefix = " - " 127 | proxy_name_prefix: str = base64.b64decode("ICAgICAgLSA=").decode("utf-8") 128 | wireguard_names.append(f"{proxy_name_prefix}{proxy_name}") 129 | output_file = "output-clash.yaml" 130 | # 替换clash配置模板中指定的字符串 131 | with open('配置文件/clash.yaml', mode='r', encoding='utf-8') as rf, open(output_file, 'w', encoding='utf-8') as wf: 132 | clash = rf.read() 133 | 134 | # 普通的写法 135 | # replace_proxy_node = " - {name: 127.0.0.1:1080, server: 127.0.0.1, port: 1080, type: ss, cipher: aes-128-gcm, password: abc123456}" 136 | # replace_proxy_name = " - 127.0.0.1:1080" 137 | 138 | # base64的写法:使用其它工具,将字符串进行base64编码,然后解码使用,防止误删字符,同时进行数据保密,没有base64解码就不知道这个数据代表什么 139 | replace_proxy_node = base64.b64decode("ICAtIHtuYW1lOiAxMjcuMC4wLjE6MTA4MCwgc2VydmVyOiAxMjcuMC4wLjEsIHBvcnQ6IDEwODAsIHR5cGU6IHNzLCBjaXBoZXI6IGFlcy0xMjgtZ2NtLCBwYXNzd29yZDogYWJjMTIzNDU2fQ==").decode("utf-8") 140 | replace_proxy_name = base64.b64decode("ICAgICAgLSAxMjcuMC4wLjE6MTA4MA==").decode("utf-8") 141 | 142 | clash_result = clash.replace(replace_proxy_node, "\n".join(wireguard_nodes)).replace(replace_proxy_name, "\n".join(wireguard_names)) 143 | print(clash_result) 144 | wf.write(clash_result) 145 | os.system("pause") -------------------------------------------------------------------------------- /8.转换为clash配置文件(csv文件).py: -------------------------------------------------------------------------------- 1 | import json 2 | import os 3 | import sys 4 | import re 5 | import base64 6 | from collections import OrderedDict 7 | 8 | 9 | # 检查文件是否存在或大小为0,即文件无效 10 | def check_file_exist_or_zero_size(file): 11 | if not os.path.exists(file) or os.stat(file).st_size == 0: 12 | sys.exit() 13 | 14 | 15 | # 读取wg-config.conf配置文件的信息 16 | def read_wireguard_key_parameters(conf_file): 17 | with open(file=conf_file, mode='r', encoding='utf-8') as f: 18 | wireguard_param = dict() 19 | for line in f: 20 | if line: 21 | if line.startswith("PrivateKey"): 22 | wireguard_param["PrivateKey"] = line.strip().replace(' ', '').replace("PrivateKey=", '') 23 | if line.startswith("PublicKey"): 24 | wireguard_param["PublicKey"] = line.strip().replace(' ', '').replace("PublicKey=", '') 25 | if line.startswith("Address"): 26 | wireguard_param["Address"] = line.strip().replace(' ', '').replace("Address=", '').split(',') 27 | if line.startswith("MTU"): 28 | wireguard_param["MTU"] = line.strip().replace(' ', '').replace("MTU=", '') 29 | if line.startswith("Reserved"): 30 | wireguard_param["Reserved"] = line.strip().replace(' ', '').replace("Reserved=", '') 31 | return wireguard_param 32 | 33 | 34 | # 读取优选ip的result.csv文件 35 | def read_ip_endpoints(csv_file): 36 | endpoints = [] 37 | with open(file=csv_file, mode='r', encoding='utf-8') as rf: 38 | next(rf) 39 | for line in rf: 40 | delay = line.strip().split(',')[-1].replace(' ', '').replace('ms', '') 41 | if int(delay) < 500: 42 | endpoint = line.strip().split(',')[0] 43 | endpoints.append(endpoint) 44 | return endpoints 45 | 46 | 47 | # 使用正则表达检查IP的版本(IPv4、IPv6) 48 | def ip_version(ip): 49 | ipv4_pattern = re.compile(r'^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$') 50 | ipv6_pattern = re.compile(r'^(?:(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|(?:[0-9a-fA-F]{1,4}:){1,7}:|(?:[0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|(?:[0-9a-fA-F]{1,4}:){1,5}(?::[0-9a-fA-F]{1,4}){1,2}|(?:[0-9a-fA-F]{1,4}:){1,4}(?::[0-9a-fA-F]{1,4}){1,3}|(?:[0-9a-fA-F]{1,4}:){1,3}(?::[0-9a-fA-F]{1,4}){1,4}|(?:[0-9a-fA-F]{1,4}:){1,2}(?::[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:(?:(?::[0-9a-fA-F]{1,4}){1,6})|:(?:(?::[0-9a-fA-F]{1,4}){1,7}|:))$') 51 | if ipv4_pattern.match(ip): 52 | return "IPv4" 53 | elif ipv6_pattern.match(ip): 54 | return "IPv6" 55 | else: 56 | return "Invalid" 57 | 58 | 59 | if __name__ == '__main__': 60 | """ 读取外部文件的数据 """ 61 | files = ["配置文件/wg-config.conf", "result.csv"] 62 | # 检查文件是否存在 63 | for file in files: 64 | check_file_exist_or_zero_size(file) 65 | param = read_wireguard_key_parameters(files[0]) 66 | """ 处理参数,准备给wireguard节点对应的clash配置使用 """ 67 | # 获取 private-key 的值 68 | private_key = param.get("PrivateKey") 69 | private_key = private_key if private_key else "+HfkMSyh7obEkX4J8Qa7Xk77CLVn45AW4CdBbnFNaGc=" # 找不到就使用这个私钥 70 | # 获取 public-key 的值 71 | public_key = param.get("PublicKey") 72 | public_key = public_key if public_key else "bmXOC+F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo=" # 找不到就使用这个公钥 73 | # 获取 reserved 的值,貌似不支持4个字符的reserved值 74 | """ 75 | Reserved = param.get("Reserved") 76 | reserved = "" 77 | if Reserved.startswith('[') and Reserved.endswith(']') and "," in Reserved: 78 | reserved = [int(number) for number in Reserved.strip('[').strip(']').split(',')] 79 | """ 80 | # 获取 mtu 的值 81 | mtu = param.get("MTU") 82 | mtu = int(mtu) if mtu else 1280 # 找不到,就使用1280代替 83 | # 获取clash中wireguard配置中,需要的 ipv6、ip -> ipv4 84 | ipv4_str: str = "" 85 | ipv6_str: str = "" 86 | Address = param.get("Address") 87 | if Address is None or Address == "": 88 | ipv4_str = "172.16.0.2" 89 | if isinstance(Address, list): 90 | ipv4_addr = Address[0].split("/")[0] 91 | ipv4_str = ipv4_addr if ip_version(ipv4_addr) == "IPv4" else "172.16.0.2" # 确保数据是ipv4的地址,否则使用172.16.0.2 92 | ipv6_addr = Address[1].split("/")[0] 93 | ipv6_str = ipv6_addr if ip_version(ipv6_addr) == "IPv6" else "" # 确保数据是ipv6的地址,否则为空 94 | 95 | """ 读取result.csv的数据 """ 96 | endpoints: list[str] = read_ip_endpoints(files[1]) 97 | 98 | # 待插入clash中的wireguard配置模板 99 | wireguard_str: str = """{"name":"warp-001","type":"wireguard","server":"162.159.192.1","port":2408,"ip":"172.16.0.2","ipv6":"","private-key":"","public-key":"bmXOC+F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo=","pre-shared-key":"","reserved":"","udp":true,"mtu":1280}""" 100 | wireguard_dict: dict = json.loads(wireguard_str) 101 | wireguard_nodes: list = [] 102 | wireguard_names: list = [] 103 | # 使用OrderedDict对endpoints进行去重,并保持顺序,防止生成相同的节点 104 | deduplicated_list = OrderedDict.fromkeys(endpoints) 105 | # 只处理前面300个,防止上千、上万的数据写入一个clash配置文件中,clash能处理?不会导致软件崩溃? 106 | data_list = list(deduplicated_list)[:300] 107 | for i, ip_with_port in enumerate(data_list): 108 | [server, port] = ip_with_port.rsplit(":", 1) 109 | index = str(i + 1).zfill(len(str(len(deduplicated_list)))) 110 | proxy_name: str = f"warp{index}-{str(server).strip('[').strip(']')}" 111 | # 将数据写入wireguard_dict中 112 | wireguard_dict["name"] = proxy_name 113 | wireguard_dict["server"] = str(server).strip("[").strip("]") # 去掉ipv6的中括号 114 | wireguard_dict["port"] = int(port) 115 | wireguard_dict["ip"] = ipv4_str 116 | wireguard_dict["ipv6"] = ipv6_str 117 | wireguard_dict["private-key"] = private_key 118 | wireguard_dict["public-key"] = public_key 119 | # 添加reserved值,不管是数组类型的还是字符串类型的reserved值,会出现无法联网/网络慢 120 | # wireguard_dict["reserved"] = reserved 121 | wireguard_dict["mtu"] = int(mtu) 122 | # 将字典转换为 JSON 字符串(把字典中的True -> true) 123 | wireguard_json_str: str = json.dumps(wireguard_dict) 124 | 125 | # node_prefix: str = " - " 126 | node_prefix: str = base64.b64decode("ICAtIA==").decode("utf-8") 127 | wireguard_nodes.append(f"{node_prefix}{wireguard_json_str}") 128 | 129 | # proxy_name_prefix = " - " 130 | proxy_name_prefix: str = base64.b64decode("ICAgICAgLSA=").decode("utf-8") 131 | wireguard_names.append(f"{proxy_name_prefix}{proxy_name}") 132 | output_file = "output-clash.yaml" 133 | # 替换clash配置模板中指定的字符串 134 | with open('配置文件/clash.yaml', mode='r', encoding='utf-8') as rf, open(output_file, 'w', encoding='utf-8') as wf: 135 | clash = rf.read() 136 | 137 | # 普通的写法 138 | # replace_proxy_node = " - {name: 127.0.0.1:1080, server: 127.0.0.1, port: 1080, type: ss, cipher: aes-128-gcm, password: abc123456}" 139 | # replace_proxy_name = " - 127.0.0.1:1080" 140 | 141 | # base64的写法:使用其它工具,将字符串进行base64编码,然后解码使用,防止误删字符,同时进行数据保密,没有base64解码就不知道这个数据代表什么 142 | replace_proxy_node = base64.b64decode("ICAtIHtuYW1lOiAxMjcuMC4wLjE6MTA4MCwgc2VydmVyOiAxMjcuMC4wLjEsIHBvcnQ6IDEwODAsIHR5cGU6IHNzLCBjaXBoZXI6IGFlcy0xMjgtZ2NtLCBwYXNzd29yZDogYWJjMTIzNDU2fQ==").decode("utf-8") 143 | replace_proxy_name = base64.b64decode("ICAgICAgLSAxMjcuMC4wLjE6MTA4MA==").decode("utf-8") 144 | 145 | clash_result = clash.replace(replace_proxy_node, "\n".join(wireguard_nodes)).replace(replace_proxy_name, "\n".join(wireguard_names)) 146 | print(clash_result) 147 | wf.write(clash_result) 148 | os.system("pause") -------------------------------------------------------------------------------- /4.[Android]生成单个sn的wireguard节点.py: -------------------------------------------------------------------------------- 1 | from dataclasses import field, dataclass 2 | import pyperclip # 将指定的运行结果自动复制到剪切板 3 | import base64 4 | import sys 5 | import zlib 6 | import re 7 | 8 | 9 | # 读取wg-config.conf配置文件的信息 10 | def read_wireguard_key_parameters(conf_file): 11 | with open(file=conf_file, mode='r', encoding='utf-8') as f: 12 | wireguard_param = dict() 13 | for line in f: 14 | if line: 15 | if line.startswith("PrivateKey"): 16 | wireguard_param["PrivateKey"] = line.strip().replace(' ', '').replace("PrivateKey=", '') 17 | if line.startswith("PublicKey"): 18 | wireguard_param["PublicKey"] = line.strip().replace(' ', '').replace("PublicKey=", '') 19 | if line.startswith("Address"): 20 | wireguard_param["Address"] = line.strip().replace(' ', '').replace("Address=", '').split(',') 21 | if line.startswith("MTU"): 22 | wireguard_param["MTU"] = line.strip().replace(' ', '').replace("MTU=", '') 23 | if line.startswith("Reserved"): 24 | wireguard_param["Reserved"] = line.strip().replace(' ', '').replace("Reserved=", '') 25 | return wireguard_param 26 | 27 | 28 | # 判断是否为IP地址(IPv4或IPv6) 29 | def is_ip_address(ip_addr): 30 | """ 匹配 IPv4 和 IPv6 地址 """ 31 | ipv4_pattern = r'^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$' 32 | ipv6_pattern = r'^(?:(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|(?:[0-9a-fA-F]{1,4}:){1,7}:|(?:[0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|(?:[0-9a-fA-F]{1,4}:){1,5}(?::[0-9a-fA-F]{1,4}){1,2}|(?:[0-9a-fA-F]{1,4}:){1,4}(?::[0-9a-fA-F]{1,4}){1,3}|(?:[0-9a-fA-F]{1,4}:){1,3}(?::[0-9a-fA-F]{1,4}){1,4}|(?:[0-9a-fA-F]{1,4}:){1,2}(?::[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:(?:(?::[0-9a-fA-F]{1,4}){1,6})|:(?:(?::[0-9a-fA-F]{1,4}){1,7}|:))$' 33 | try: 34 | addr = ip_addr.rsplit(":", 1)[0] 35 | ip = addr[1:-1] if addr.startswith('[') and addr.endswith(']') else addr 36 | port = ip_addr.rsplit(':', 1)[1] if ip_addr.count(":") == 1 or ( 37 | ip_addr.count(":") > 3 and "]:" in ip_addr) else None 38 | if re.match(ipv4_pattern, ip) and (port.isdigit() and int(port) >= 80): 39 | ipv4 = re.match(ipv4_pattern, ip).group(0) 40 | return True 41 | elif re.match(ipv6_pattern, ip) and (port.isdigit() and int(port) >= 80): 42 | ipv6 = re.match(ipv6_pattern, ip).group(0) 43 | return True 44 | except Exception as e: 45 | pass 46 | 47 | 48 | def encode_sn_str(s: str) -> bytes: 49 | if not s: 50 | return b'\x81' 51 | if len(s) == 1: 52 | return b'\x82' + s.encode() 53 | ret = s.encode() 54 | ret = ret[:-1] + (ret[-1] | 0x80).to_bytes(1, 'little') 55 | return ret 56 | 57 | 58 | def p32(n: int): 59 | return n.to_bytes(4, 'little') 60 | 61 | 62 | def p8(n: int): 63 | return n.to_bytes(1, 'little') 64 | 65 | 66 | @dataclass(init=True, repr=True) 67 | class SnBase: 68 | def serialize(self) -> bytes: 69 | ret = b'' 70 | for _, v in self.__dict__.items(): 71 | ret += self.obj_serialize(v) 72 | return ret 73 | 74 | @classmethod 75 | def obj_serialize(cls, obj) -> bytes: 76 | ret = b'' 77 | match type(obj): 78 | case __builtins__.str: 79 | ret += encode_sn_str(obj) 80 | case __builtins__.bool: 81 | ret += p8(int(obj)) 82 | case __builtins__.int: 83 | ret += p32(obj) 84 | case _: 85 | if isinstance(obj, SnBase): 86 | ret += obj.serialize() 87 | return ret 88 | 89 | 90 | @dataclass(init=True, repr=True) 91 | class SnServer(SnBase): 92 | server_address: str = '162.159.192.10' 93 | server_port: int = 2408 94 | 95 | 96 | @dataclass(init=True, repr=True) 97 | class WireguardSerialize(SnBase): 98 | version: int = 2 99 | server: SnServer = field(default_factory=SnServer) 100 | localAddress: str = "172.16.0.2/32" 101 | privateKey: str = '' 102 | peerPublicKey: str = 'bmXOC+F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo=' 103 | peerPreSharedKey: str = '' 104 | mtu: int = 1420 105 | reserved: str = "" 106 | 107 | def serialize(self) -> bytes: 108 | ret = b'' 109 | ret += self.obj_serialize(self.version) 110 | ret += self.obj_serialize(self.server) 111 | ret += self.obj_serialize(self.localAddress) 112 | ret += self.obj_serialize(self.privateKey) 113 | ret += self.obj_serialize(self.peerPublicKey) 114 | ret += self.obj_serialize(self.peerPreSharedKey) 115 | ret += self.obj_serialize(self.mtu) 116 | ret += self.obj_serialize(self.reserved) 117 | return ret 118 | 119 | 120 | @dataclass(init=True, repr=True) 121 | class SnMeta(SnBase): 122 | extraVersion: int = 2 123 | name: str = '' 124 | customOutboundJson: str = '' 125 | customConfigJson: str = '' 126 | 127 | 128 | @dataclass(init=True, repr=True) 129 | class Wireguard(SnBase): 130 | WireguardSerialize: WireguardSerialize = field(default_factory=WireguardSerialize) 131 | sn_meta: SnMeta = field(default_factory=SnMeta) 132 | 133 | def __str__(self) -> str: 134 | # print(self.serialize()) 135 | return f'sn://wg?{base64.urlsafe_b64encode(zlib.compress(self.serialize())).decode()}' 136 | 137 | 138 | if __name__ == '__main__': 139 | param = read_wireguard_key_parameters("配置文件/wg-config.conf") 140 | private_key = param.get("PrivateKey") 141 | private_key = private_key if private_key else "+HfkMSyh7obEkX4J8Qa7Xk77CLVn45AW4CdBbnFNaGc=" # 找不到就使用这个私钥 142 | public_key = param.get("PublicKey") 143 | public_key = public_key if public_key else "bmXOC+F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo=" # 找不到就使用这个公钥 144 | Reserved = param.get("Reserved") 145 | Reserved = Reserved if Reserved else "" # 找不到,就用空字符代替 146 | mtu = param.get("MTU") 147 | mtu = int(mtu) if mtu else 1280 # 找不到,就使用1280代替 148 | Address = param.get("Address") 149 | if Address is None or Address == "": 150 | local_address = "172.16.0.2/32" 151 | else: 152 | local_address = ",".join(Address) if isinstance(Address, list) else "172.16.0.2/32" 153 | while True: 154 | while True: 155 | input_endpoint = input("输入优选IP(格式:162.159.192.10:891),输入q、quit、exit退出程序:").strip() 156 | state = is_ip_address(input_endpoint) 157 | if state: 158 | break 159 | if input_endpoint.lower() in ["q", "quit", "exit"]: 160 | sys.exit() 161 | addr = input_endpoint.rsplit(":", 1)[0] 162 | ip = addr[1:-1] if addr.startswith('[') and addr.endswith(']') else addr # 去掉IPv6的中括号 163 | port = input_endpoint.rsplit(':', 1)[1] 164 | serialize_obj = WireguardSerialize(server=SnServer(ip, int(port)), 165 | localAddress=local_address, 166 | privateKey=private_key, 167 | peerPublicKey=public_key, 168 | mtu=int(mtu), reserved=Reserved) 169 | config_name = f"warp-{input_endpoint}" 170 | sn_link = Wireguard(WireguardSerialize=serialize_obj, sn_meta=SnMeta(name=config_name)) 171 | pyperclip.copy(str(sn_link)) 172 | print(f"{'-' * 35} Android 版 NekoBox,WireGuard 的分享SN Link如下: {'-' * 35}\n{sn_link}\n{'-' * 120}") 173 | print("节点已经复制到剪切板,可以黏贴到其它地方!") 174 | print(f"{'-' * 120}") 175 | -------------------------------------------------------------------------------- /result_IPv6.csv: -------------------------------------------------------------------------------- 1 | IP:PORT, LOSS, DELAY 2 | [2606:4700:d0::0d83:30d3:dc8c:4573]:2371,0.00%,268 ms 3 | [2606:4700:d0::04f9:a0e1:421e:0a70]:2371,0.00%,271 ms 4 | [2606:4700:d0::0d83:30d3:dc8c:4573]:955,0.00%,272 ms 5 | [2606:4700:d0::4a8a:24d8:5153:73a2]:955,0.00%,272 ms 6 | [2606:4700:d1::32a3:9849:119c:e290]:955,0.00%,272 ms 7 | [2606:4700:d0::4fa3:ba5d:b717:4fef]:2371,0.00%,272 ms 8 | [2606:4700:d1::39ae:dcc7:1205:ac8e]:2371,0.00%,273 ms 9 | [2606:4700:d1::46c8:95a1:5f27:0e95]:955,0.00%,275 ms 10 | [2606:4700:d1::ac65:4f6a:7397:d3c3]:2371,0.00%,275 ms 11 | [2606:4700:d0::605b:4d9d:6d37:4caf]:955,0.00%,275 ms 12 | [2606:4700:d1::541b:b532:a425:5931]:2371,0.00%,275 ms 13 | [2606:4700:d1::930d:c8a6:a6c8:a370]:2371,0.00%,276 ms 14 | [2606:4700:d1::c0ce:7cc3:a504:b341]:955,0.00%,276 ms 15 | [2606:4700:d1::930d:c8a6:a6c8:a370]:955,0.00%,276 ms 16 | [2606:4700:d0::b623:7585:a94c:0d6e]:2371,0.00%,276 ms 17 | [2606:4700:d0::ded5:1458:ba59:363a]:955,0.00%,277 ms 18 | [2606:4700:d1::ec15:16fb:c57c:0e2e]:955,0.00%,278 ms 19 | [2606:4700:d0::e966:27aa:241f:58de]:955,0.00%,278 ms 20 | [2606:4700:d1::edfb:c89c:3c5d:ca18]:955,0.00%,279 ms 21 | [2606:4700:d1::0f1c:8d05:a27f:c434]:955,0.00%,279 ms 22 | [2606:4700:d1::7c20:707c:19b5:a52c]:2371,0.00%,280 ms 23 | [2606:4700:d0::41dd:30fe:0ce8:c4e0]:2371,10.00%,343 ms 24 | [2606:4700:d0::3437:4ec0:1795:d2cf]:2371,10.00%,344 ms 25 | [2606:4700:d1::c462:61de:e343:171f]:955,10.00%,344 ms 26 | [2606:4700:d0::53f4:623f:1029:9d75]:2371,10.00%,344 ms 27 | [2606:4700:d0::04f9:a0e1:421e:0a70]:955,10.00%,344 ms 28 | [2606:4700:d0::4a8a:24d8:5153:73a2]:2371,10.00%,344 ms 29 | [2606:4700:d1::6914:6f75:da76:316c]:955,10.00%,344 ms 30 | [2606:4700:d0::4d7b:a970:a98a:07ad]:955,10.00%,344 ms 31 | [2606:4700:d0::3bef:a208:bd27:caba]:955,10.00%,344 ms 32 | [2606:4700:d1::fb14:b403:083b:b899]:955,10.00%,344 ms 33 | [2606:4700:d0::3437:4ec0:1795:d2cf]:955,10.00%,344 ms 34 | [2606:4700:d1::0294:57c0:a677:fd04]:2371,10.00%,345 ms 35 | [2606:4700:d0::8ec2:f99c:8725:3a44]:2371,10.00%,345 ms 36 | [2606:4700:d0::605b:4d9d:6d37:4caf]:2371,10.00%,345 ms 37 | [2606:4700:d0::770b:b596:0f99:4042]:2371,10.00%,345 ms 38 | [2606:4700:d1::a359:05b3:e338:97f4]:955,10.00%,345 ms 39 | [2606:4700:d0::86c9:4f75:ba94:e15e]:2371,10.00%,345 ms 40 | [2606:4700:d0::3176:77b3:4555:63f5]:955,10.00%,345 ms 41 | [2606:4700:d1::5a1e:e5c4:2a04:5991]:955,10.00%,346 ms 42 | [2606:4700:d0::a681:8997:07b9:fa3b]:2371,10.00%,346 ms 43 | [2606:4700:d1::942d:984a:6a8c:97ab]:955,10.00%,346 ms 44 | [2606:4700:d1::97a8:a151:9c08:9a97]:2371,10.00%,346 ms 45 | [2606:4700:d0::4fa3:ba5d:b717:4fef]:955,10.00%,346 ms 46 | [2606:4700:d1::433b:9282:193f:1bcb]:2371,10.00%,347 ms 47 | [2606:4700:d1::433b:9282:193f:1bcb]:955,10.00%,347 ms 48 | [2606:4700:d0::ae88:ef6f:3a18:a144]:2371,10.00%,347 ms 49 | [2606:4700:d0::53f4:623f:1029:9d75]:955,10.00%,347 ms 50 | [2606:4700:d1::46c8:95a1:5f27:0e95]:2371,10.00%,348 ms 51 | [2606:4700:d0::9fd3:3c43:177f:71f0]:955,10.00%,348 ms 52 | [2606:4700:d1::c6a6:cf22:c176:1ee8]:2371,10.00%,348 ms 53 | [2606:4700:d0::bbdf:4763:18ba:8c5a]:955,10.00%,348 ms 54 | [2606:4700:d0::69b5:96e8:8324:0367]:955,10.00%,348 ms 55 | [2606:4700:d0::64b4:3732:fc40:13b5]:955,10.00%,348 ms 56 | [2606:4700:d0::ac5a:0359:41f3:d01f]:955,10.00%,348 ms 57 | [2606:4700:d1::f1b7:62f6:9cf4:cdd6]:955,10.00%,348 ms 58 | [2606:4700:d0::d2b8:47b3:b3ce:2ce9]:2371,10.00%,349 ms 59 | [2606:4700:d1::7f29:375b:ff6a:5ab6]:2371,10.00%,349 ms 60 | [2606:4700:d1::7f29:375b:ff6a:5ab6]:955,10.00%,349 ms 61 | [2606:4700:d0::6d55:9f99:2a97:783c]:955,10.00%,349 ms 62 | [2606:4700:d1::b77d:fd56:b2b7:c235]:2371,10.00%,349 ms 63 | [2606:4700:d0::ac88:ec0b:eb7e:7fa3]:2371,10.00%,349 ms 64 | [2606:4700:d1::201e:7b58:035b:85e5]:955,10.00%,349 ms 65 | [2606:4700:d1::d7af:6e07:9ff7:5f54]:2371,10.00%,350 ms 66 | [2606:4700:d0::652d:a702:91cf:ae74]:2371,10.00%,350 ms 67 | [2606:4700:d0::e2e4:f50b:24a3:992c]:955,10.00%,350 ms 68 | [2606:4700:d1::fba6:7896:d27d:c900]:955,10.00%,350 ms 69 | [2606:4700:d0::e086:b1e0:de2f:cbcd]:2371,10.00%,350 ms 70 | [2606:4700:d0::e086:b1e0:de2f:cbcd]:955,10.00%,350 ms 71 | [2606:4700:d1::7b6d:035b:b70d:d564]:955,10.00%,350 ms 72 | [2606:4700:d1::942d:984a:6a8c:97ab]:2371,10.00%,350 ms 73 | [2606:4700:d1::10e4:fc97:88f3:b506]:955,10.00%,352 ms 74 | [2606:4700:d0::df83:24ed:a620:6b65]:2371,10.00%,352 ms 75 | [2606:4700:d0::ded5:1458:ba59:363a]:2371,10.00%,352 ms 76 | [2606:4700:d1::2567:8805:c13f:1b04]:2371,10.00%,352 ms 77 | [2606:4700:d0::d626:1a42:49b0:fcd0]:2371,10.00%,352 ms 78 | [2606:4700:d1::fba6:7896:d27d:c900]:2371,10.00%,353 ms 79 | [2606:4700:d1::0126:33f2:338c:650a]:955,10.00%,353 ms 80 | [2606:4700:d1::7b6d:035b:b70d:d564]:2371,10.00%,353 ms 81 | [2606:4700:d0::e2a9:76f2:0676:49a9]:955,10.00%,354 ms 82 | [2606:4700:d0::3176:77b3:4555:63f5]:2371,20.00%,414 ms 83 | [2606:4700:d1::6b27:e69b:7f3e:6611]:2371,20.00%,414 ms 84 | [2606:4700:d0::c454:380d:7de1:6a8f]:955,20.00%,414 ms 85 | [2606:4700:d0::368e:c448:e60e:5dca]:955,20.00%,414 ms 86 | [2606:4700:d0::0065:765f:ec36:6eab]:2371,20.00%,415 ms 87 | [2606:4700:d1::7e3c:97cb:6eb5:9599]:2371,20.00%,415 ms 88 | [2606:4700:d1::9593:19a8:1b84:8448]:2371,20.00%,415 ms 89 | [2606:4700:d0::a681:8997:07b9:fa3b]:955,20.00%,415 ms 90 | [2606:4700:d1::172e:26bb:2a43:2f74]:2371,20.00%,415 ms 91 | [2606:4700:d1::49c3:c8ed:c5b6:1f74]:2371,20.00%,416 ms 92 | [2606:4700:d1::201e:7b58:035b:85e5]:2371,20.00%,416 ms 93 | [2606:4700:d1::c4d0:fca0:150b:4e3a]:2371,20.00%,417 ms 94 | [2606:4700:d0::b851:6cf4:51f0:1396]:2371,20.00%,417 ms 95 | [2606:4700:d1::9ad6:0e4f:ab11:97c2]:955,20.00%,417 ms 96 | [2606:4700:d1::32be:0cb6:1c71:f601]:2371,20.00%,417 ms 97 | [2606:4700:d0::bbdf:4763:18ba:8c5a]:2371,20.00%,418 ms 98 | [2606:4700:d1::4119:7b33:a226:ee93]:2371,20.00%,418 ms 99 | [2606:4700:d1::9593:19a8:1b84:8448]:955,20.00%,419 ms 100 | [2606:4700:d0::30cc:e345:6b10:0404]:2371,20.00%,419 ms 101 | [2606:4700:d1::b77d:fd56:b2b7:c235]:955,20.00%,419 ms 102 | [2606:4700:d0::368e:c448:e60e:5dca]:2371,20.00%,419 ms 103 | [2606:4700:d0::8ec2:f99c:8725:3a44]:955,20.00%,419 ms 104 | [2606:4700:d1::97a8:a151:9c08:9a97]:955,20.00%,420 ms 105 | [2606:4700:d0::4fb4:f8f4:9c95:dc33]:955,20.00%,420 ms 106 | [2606:4700:d0::5340:2d9b:322d:e2f1]:955,20.00%,420 ms 107 | [2606:4700:d1::4251:324e:b60e:2fb9]:2371,20.00%,420 ms 108 | [2606:4700:d1::32a3:9849:119c:e290]:2371,20.00%,420 ms 109 | [2606:4700:d1::5a1e:e5c4:2a04:5991]:2371,20.00%,420 ms 110 | [2606:4700:d0::b288:dbd8:569a:8f8e]:955,20.00%,420 ms 111 | [2606:4700:d1::32be:0cb6:1c71:f601]:955,20.00%,420 ms 112 | [2606:4700:d0::9fd3:3c43:177f:71f0]:2371,20.00%,421 ms 113 | [2606:4700:d1::49c3:c8ed:c5b6:1f74]:955,20.00%,421 ms 114 | [2606:4700:d1::b2e6:7879:11a1:97e5]:955,20.00%,421 ms 115 | [2606:4700:d1::541b:b532:a425:5931]:955,20.00%,421 ms 116 | [2606:4700:d1::10e4:fc97:88f3:b506]:2371,20.00%,421 ms 117 | [2606:4700:d0::e5e6:a429:2a43:076e]:2371,20.00%,422 ms 118 | [2606:4700:d1::5b61:5f49:cc5f:f860]:955,20.00%,422 ms 119 | [2606:4700:d1::c4d0:fca0:150b:4e3a]:955,20.00%,422 ms 120 | [2606:4700:d1::e8f7:4d5f:c740:70ab]:955,20.00%,422 ms 121 | [2606:4700:d1::6914:6f75:da76:316c]:2371,20.00%,423 ms 122 | [2606:4700:d0::c454:380d:7de1:6a8f]:2371,20.00%,423 ms 123 | [2606:4700:d0::69d5:16bd:6fb0:7a97]:955,20.00%,423 ms 124 | [2606:4700:d1::c462:61de:e343:171f]:2371,20.00%,423 ms 125 | [2606:4700:d1::7397:f0d7:63d0:a18d]:955,20.00%,423 ms 126 | [2606:4700:d1::eb75:89ad:5622:576a]:2371,20.00%,423 ms 127 | [2606:4700:d1::0c0a:a455:da6c:b9ee]:955,20.00%,423 ms 128 | [2606:4700:d0::e5e6:a429:2a43:076e]:955,20.00%,423 ms 129 | [2606:4700:d0::69b5:96e8:8324:0367]:2371,20.00%,423 ms 130 | [2606:4700:d1::edfb:c89c:3c5d:ca18]:2371,20.00%,423 ms 131 | [2606:4700:d1::30b1:bd9e:0a98:bf83]:955,20.00%,424 ms 132 | [2606:4700:d0::d2b8:47b3:b3ce:2ce9]:955,20.00%,424 ms 133 | [2606:4700:d0::df83:24ed:a620:6b65]:955,20.00%,424 ms 134 | [2606:4700:d0::ecea:21b9:fe0b:838d]:955,20.00%,424 ms 135 | [2606:4700:d1::7397:f0d7:63d0:a18d]:2371,20.00%,424 ms 136 | [2606:4700:d0::d626:1a42:49b0:fcd0]:955,20.00%,424 ms 137 | [2606:4700:d0::cadf:5182:4e41:c647]:955,20.00%,425 ms 138 | [2606:4700:d1::eb75:89ad:5622:576a]:955,20.00%,427 ms 139 | [2606:4700:d1::67af:5f1d:f9d8:6b12]:2371,30.00%,487 ms 140 | [2606:4700:d1::c6a6:cf22:c176:1ee8]:955,30.00%,488 ms 141 | [2606:4700:d0::b288:dbd8:569a:8f8e]:2371,30.00%,488 ms 142 | [2606:4700:d1::30b1:bd9e:0a98:bf83]:2371,30.00%,488 ms 143 | [2606:4700:d0::3bef:a208:bd27:caba]:2371,30.00%,488 ms 144 | [2606:4700:d0::30cc:e345:6b10:0404]:955,30.00%,488 ms 145 | [2606:4700:d0::6d55:9f99:2a97:783c]:2371,30.00%,489 ms 146 | [2606:4700:d1::0126:33f2:338c:650a]:2371,30.00%,489 ms 147 | [2606:4700:d0::ecea:21b9:fe0b:838d]:2371,30.00%,489 ms 148 | [2606:4700:d1::0294:57c0:a677:fd04]:955,30.00%,489 ms 149 | [2606:4700:d1::402d:d9f8:c75e:a0c0]:2371,30.00%,489 ms 150 | [2606:4700:d1::7e3c:97cb:6eb5:9599]:955,30.00%,489 ms 151 | [2606:4700:d1::402d:d9f8:c75e:a0c0]:955,30.00%,489 ms 152 | [2606:4700:d1::67af:5f1d:f9d8:6b12]:955,30.00%,490 ms 153 | [2606:4700:d1::39ae:dcc7:1205:ac8e]:955,30.00%,490 ms 154 | [2606:4700:d0::b623:7585:a94c:0d6e]:955,30.00%,491 ms 155 | [2606:4700:d0::ac5a:0359:41f3:d01f]:2371,30.00%,491 ms 156 | [2606:4700:d0::41dd:30fe:0ce8:c4e0]:955,30.00%,491 ms 157 | [2606:4700:d1::c0ce:7cc3:a504:b341]:2371,30.00%,491 ms 158 | [2606:4700:d0::86c9:4f75:ba94:e15e]:955,30.00%,492 ms 159 | [2606:4700:d0::94a3:97b0:0590:5942]:955,30.00%,492 ms 160 | [2606:4700:d1::4251:324e:b60e:2fb9]:955,30.00%,492 ms 161 | [2606:4700:d0::b851:6cf4:51f0:1396]:955,30.00%,492 ms 162 | [2606:4700:d0::e966:27aa:241f:58de]:2371,30.00%,492 ms 163 | [2606:4700:d0::64b4:3732:fc40:13b5]:2371,30.00%,492 ms 164 | [2606:4700:d1::7c20:707c:19b5:a52c]:955,30.00%,492 ms 165 | [2606:4700:d0::5340:2d9b:322d:e2f1]:2371,30.00%,492 ms 166 | [2606:4700:d1::a359:05b3:e338:97f4]:2371,30.00%,493 ms 167 | [2606:4700:d1::ac65:4f6a:7397:d3c3]:955,30.00%,493 ms 168 | [2606:4700:d0::ae88:ef6f:3a18:a144]:955,30.00%,494 ms 169 | [2606:4700:d0::da97:d74f:8f20:6789]:955,30.00%,495 ms 170 | [2606:4700:d1::e8f7:4d5f:c740:70ab]:2371,30.00%,495 ms 171 | [2606:4700:d1::2041:1ca1:cca2:ecc0]:955,30.00%,495 ms 172 | [2606:4700:d0::d1ca:1426:2402:907f]:955,30.00%,495 ms 173 | [2606:4700:d0::e2a9:76f2:0676:49a9]:2371,30.00%,495 ms 174 | [2606:4700:d1::31c9:7d79:1baa:0cfd]:2371,30.00%,496 ms 175 | [2606:4700:d1::0f1c:8d05:a27f:c434]:2371,30.00%,496 ms 176 | [2606:4700:d1::31c9:7d79:1baa:0cfd]:955,30.00%,497 ms 177 | [2606:4700:d0::e2e4:f50b:24a3:992c]:2371,30.00%,497 ms 178 | [2606:4700:d0::da97:d74f:8f20:6789]:2371,30.00%,497 ms 179 | [2606:4700:d0::69d5:16bd:6fb0:7a97]:2371,30.00%,497 ms 180 | [2606:4700:d0::94a3:97b0:0590:5942]:2371,40.00%,559 ms 181 | [2606:4700:d0::0065:765f:ec36:6eab]:955,40.00%,560 ms 182 | [2606:4700:d1::fb14:b403:083b:b899]:2371,40.00%,561 ms 183 | [2606:4700:d1::2567:8805:c13f:1b04]:955,40.00%,562 ms 184 | [2606:4700:d1::2041:1ca1:cca2:ecc0]:2371,40.00%,563 ms 185 | [2606:4700:d0::652d:a702:91cf:ae74]:955,40.00%,564 ms 186 | [2606:4700:d1::9ad6:0e4f:ab11:97c2]:2371,40.00%,565 ms 187 | [2606:4700:d0::770b:b596:0f99:4042]:955,40.00%,566 ms 188 | [2606:4700:d1::5b61:5f49:cc5f:f860]:2371,40.00%,566 ms 189 | [2606:4700:d1::f1b7:62f6:9cf4:cdd6]:2371,40.00%,566 ms 190 | [2606:4700:d0::ac88:ec0b:eb7e:7fa3]:955,40.00%,567 ms 191 | [2606:4700:d0::d1ca:1426:2402:907f]:2371,40.00%,567 ms 192 | [2606:4700:d1::172e:26bb:2a43:2f74]:955,40.00%,568 ms 193 | [2606:4700:d1::4119:7b33:a226:ee93]:955,40.00%,568 ms 194 | [2606:4700:d0::cadf:5182:4e41:c647]:2371,50.00%,633 ms 195 | [2606:4700:d0::4fb4:f8f4:9c95:dc33]:2371,50.00%,637 ms 196 | [2606:4700:d1::d7af:6e07:9ff7:5f54]:955,50.00%,639 ms 197 | [2606:4700:d1::0c0a:a455:da6c:b9ee]:2371,50.00%,641 ms 198 | [2606:4700:d1::b2e6:7879:11a1:97e5]:2371,50.00%,642 ms 199 | [2606:4700:d1::6b27:e69b:7f3e:6611]:955,50.00%,642 ms 200 | [2606:4700:d1::ec15:16fb:c57c:0e2e]:2371,50.00%,643 ms 201 | [2606:4700:d0::4d7b:a970:a98a:07ad]:2371,60.00%,707 ms 202 | -------------------------------------------------------------------------------- /output-node.txt: -------------------------------------------------------------------------------- 1 | sn://wg?eJxNzjkOgkAUANCJiYVnUYf_P8PMMJ2gBCVuMaKWAnGLRuMSl45LGRsv4I3spLR91SsxxlBrjii4q7n9-lQKUMRRcuBk2VQjCdIIBWAQwWglMyMyOzWCCk9dSI1MMrCQXo3opPzokTTj3WIzWvqeaGCn13ZmXjfdhrOY-kN1OrbXm4l4J7tp368GGNxa3cDN7uuIQsfC0fj8CKFzifcOrug6WCzv-3fOyoydvea3VGyv8-Oh_l_Whhx45vkPmPc3mA== 2 | sn://wg?eJxNzrsOgjAUANAG49eopfdaWtpNUIISXzGijFLiKxqNj_gYTPgl4-Dih7nJ6HqmYxFCwHUpAKdKUfF8lAqQSEFQRtGuYxUFE5pLxjQA064UmeZZ3WiOhRvFjBZpxmzAdyM6Sj-6p814O1-PFr7HG9DptZ3E65pNmMTYH8rjob1aT_gn3U77fiWA4NrqBiq7rSIMHRtG49M9ZJ1zvHNgiZfBfHHbfXJSJuTkNb9Wsb3MDvvafxm1q155_gMl_Tca 3 | sn://wg?eJxNzrsOgjAUANBG49eopfdSWugmIEGJojGijAIBNRqNj_gYTPgl4-Dih7nJ6HqmUyOEgGlSAE4tQfXno16BRAqCMoqaji0UTCguGVMATJlSZIpneqo4Vp5aLFUiyZgG-O4ER-kE98SNtvl6Ujg270B_2DNie5Bu_DjCcCyPh95qPeOfZDsPnaYH3rU78KzstgrQNzSYTE93n_XP0c6AJV5GeXHbfUrSIORku99atb0sDvv2fxmVab3K8gchXzcO 4 | sn://wg?eJxVzrsOgjAUANBG49eopfdS2tJNQIISXzGijAIRNRqNj_gYTPgmHVz8MDdZXc90KoQQUIoCcGorivz5qJYikYKgjKJhYgMFE5pLxjQA00qKTPPMTDXH0lObpVokGTMA363wKN3wnnjRdrEe567DW9Dtd6zY6aWbII5wMJLHQ2e1nvJPsp0N3LoP_rXd8-3stgoxsAwYT073gHXP0c6CJV6Gi_y2-xSkRsjJ8b6VsnuZH_bNv7Oplf0qih-BoDd6 5 | sn://wg?eJxVzjkOgkAUANAJxtOow_zvMAPTCUpY4hYjSikQUKPRuMSlMOFOmth4MDtpbV_1NEIImCYF4NQSFPH1qFUikYKgjKLexiYKJhSXjCkApkwpMsWzdqo4Vp5aLFUiyZgO-O6ER-mE96QbbfP1pHBs3oFg4Bux3U83XhzhcCyPB3-1nvFPsp0PnYYL7rXXd63stgrRM3SYTE93jwXnaGfAEi-jvLjtPiWpE3Kyu1-t6l4Wh33r72wo03qW5Q-ACDd2 6 | sn://wg?eJxVzrsOgjAUANBG49eopfdSWugmIEGJojGijAIBNRqNj_gYTPgkEwcXP8xNVtcznRohBEyTAnBqCQr681GvRCIFQRlFTccWCiYUl4wpAKZMKTLFMz1VHCtPLZYqkWRMA3x3gqN0gnviRtt8PSkcm3egP-wZsT1IN34cYTiWx0NvtZ7xT7Kdh07TA-_aHXhWdlsF6BsaTKanu8_652hnwBIvo7y47T4laRByst1vrepeFod9--8MyrReZfkDfP43bg== 7 | sn://wg?eJxVzjkOgkAUANCJiYVnUYf_v8MMTCcoQYlbjKilQNwiwbjEpeNGVsbGC3gjO2ltX_VKjDG0LI4ouK04qsenUogijpIDJ6NBNZIgtVAAGhG0pWSiRdKItaDCYxtiLaMEDKRXMzgqN7hHrTBdbscr1xFN7PY75tzpxTt_HtJgpI6HzmY7Fe8onQ3cqofetd3z7OS2Ccg3DRxPTncfuucwM3FNl-FydcveOSszdnJa31LRvSwO-_rfGTSZ8MzzH_JEN_A= 8 | sn://wg?eJxNzrkOgkAUQNEJxq9Rh3nPYQamY5GgxC1ElFIgbtFoXOJSmPBPFDZ8mJ2UVjc51dUIIWCaFIBTq075btQgkYKgjKLexTYKJhSXjCkApkwpcsXzbqY41p5ZLFMizZkO-LHDi3TDV-rFh9UuWrsOt2Ew6huJM8z2QRLjeCov5_52N-dVeliM3ZYP_qM39K38uQ0xMHSIZtdXwAa3-GjABu-T1fp5rArSJOTqeF-tvr0vz6fO_zJXplUWxQ8i6TcS 9 | sn://wg?eJxVzrsOgjAUANBG49eopfdSWugmIEGJojGijAIBNRqNj_gYTPgnTVz8MDdZXc90aoQQME0KwKklKeqvR70SiRQEZRQ1HVsomFBcMqYAmDKlyBTP9FRxrDy1WKpEkjEN8N0JjtIJ7okbbfP1pHBs3oH-sGfE9iDd-HGE4VgeD73VesY_yXYeOk0PvGt34FnZbRWgb2gwmZ7uPuufo50BS7yM8uK2-5SkQcjJdr-1qntZHPbtv7OhTOtZlj-Bljd6 10 | sn://wg?eJxNzjkOgkAUANAJxtOow_zvMAPTCUpY4hYjSikQUKPRuMSlMOFOJtp4MDspbV_1NEIImCYF4NQS1Hg9ahVIpCAoo6i3sYmCCcUlYwqAKVOKTPGsnSqOlacWS5VIMqYDvjvhUTrhPelG23w9KRybdyAY-EZs99ONF0c4HMvjwV-tZ_yTbOdDp-GCe-31XSu7rUL0DB0m09PdY8E52hmwxMsoL267T0nqhJzs7lertpfFYd_6L0tlWs-y_AEmqjcc 11 | sn://wg?eJxNzjkOgkAUANAJiYVnUYf_v8MMTCcoQYmiMaKUAnGLRuMSl45LGRsv4I3spLR91TMYY2jbHFFwR3L5_FRLUMRRcuBkNqlOEqQWCkAjgraVzLXIm5kWVHrmQKZlmoOJ9GqFJ-WFj7Qd7xab8dJzRQt7g66VuP1sGyQxRSN1OnbXm6l4p7tZ5NV89G-dvu_k93VIgWXieHJ-BNC7xHsLV3QdLpb3_btgFcbObvtrlNvr_Hho_JelJgueRfEDmC43lg== 12 | sn://wg?eJxVzjkOgkAUgOGJiYVnUYf3HsMMTCcoQYlbjKilQNyi0bjEpeNINsaGC3gjO2mt_uSr_hJjDG2bIwruFDGfn0ohijhKDpwMk2okQWqhADQiaFvJVIvUTLSgwhMHEi3jFAykdyM8KS98xM1ot9iMlp4rGtjpta2Z2022wSyi_lCdju31ZiLyeDfte1Uf_Vur6zvpfR1SYBk4Gp8fAXQu0d7CFV0Hi-V9n2eszNjZbX5Lxe51fjzU_55RkwWvLPsB8Lw37A== 13 | sn://wg?eJxNzssOwUAUANAJ8TWYzr2m89ppaUrjFVEstU2LEOIRj4Wk_yRi48PsdGl7VqdECAGlKACnWlP1epQLkEhBUEbRamANBROGS8YMADNKisTwpBEbjoXHmsVGRAmzAN_N4Cjd4B61wm26Hmeuw5vQ7XfsudOLN_48xMFIHg-d1XrKP9F2NnCrHnjXds_TyW0VoG9bMJ6c7j7rnsOdDUu8DNPstvvkpELIyWl9S8X2sjjs6_9lYZR-5vkPKoc3Jg== 14 | sn://wg?eJxVzjkOgkAUANCJiYVnUYf_P8MMTCcoQYlbjKilQNyi0bjEpeNMJsaGC3gjO2ltX_VKjDG0bY4ouGNzEs9PpRBFHCUHToZJNZIgtVAAGhG0rWSqRWomWlDhiQOJlnEKBtK7EZ6UFz7iZrRbbEZLzxUN7PTa1sztJttgFlF_qE7H9nozEXm8m_a9qo_-rdX1nfS-DimwDByNz48AOpdob-GKroPF8r7PM1Zm7Ow2v6Wie50fD_W_s6nJgleW_QDz0jf0 15 | sn://wg?eJxVzrsOgjAUANBG49eopfdS2tKNhwQlvmJEHQUCajQaH_ExmPBPDi5-mJusrmc6NUIIKEUBOLUVRfP9rFcikYKgjKJhYgsFE5pLxjQA00qKTPPMTDXHylObpVokGTMA3050kl70SPx4l28mhedyB3qDrrVw--k2XMQ4HMvTsbvezPgn2c2HXjOA4NbpB3Z2X0cYWgZMpudHyHqXeG_BCq-jvLjvPyVpEHJ2_W-t6l6Xx0P776y0sl9l-QOEpjeC 16 | sn://wg?eJxVzrsOgjAUANBG49eopfdSWugmIEGJojGijAIBNRqNj_gYTPgmHVz8MDdZXc90aoQQME0KwKklKMjno16JRAqCMoqaji0UTCguGVMATJlSZIpneqo4Vp5aLFUiyZgG-O4ER-kE98SNtvl6Ujg270B_2DNie5Bu_DjCcCyPh95qPeOfZDsPnaYH3rU78KzstgrQNzSYTE93n_XP0c6AJV5GeXHbfUrSIORku99a1b0sDvv231lXpvUqyx-Bkjd6 17 | sn://wg?eJxVzjkOgkAUANAJiYVnUYf_v8MMTCcoQYmiMaKUAnGLRuMSl45LGRsv4I3spLV91TMYY2jbHFFwR3KC56daiiKOkgMns0l1kiC1UAAaEbStZK5F3sy0oNIzBzIt0xxMpFcrPCkvfKTteLfYjJeeK1rYG3StxO1n2yCJKRqp07G73kzFO93NIq_mo3_r9H0nv69DCiwTx5PzI4DeJd5buKLrcLG8798FqzB2dttfo-xe58dD4-8sNVnwLIof8W437g== 18 | sn://wg?eJxVzskOwVAUgOEbiYVnwe05xx3au9PSlMYUUSy1jSmEGGLY9ZUsxMYLeCM73Vr9ybf6C4wxtG2OKLiTRz4-pVw0cVQcOFk1qpACZYQGMIhgbK1SI9JaYgTlnjiQGBWnYCG96uFRe-E9bkTb-Xq48FxRx3a3JaduJ9kE04h6A308tFbrsXjH20nPK_voX5sd30lvq5ACaeFwdLoH0D5HO4lLuvTni9vunbEiYye38S3ku5fZYV_9eyZDEp5Z9gPzDDfy 19 | sn://wg?eJxVzrsOgjAUANAG49eopfdSWugmIEGJrxBRRoGoGI3GR3wMJvyTgwsf5iar65mORggBy6IAnNqSovF-NWqRSEFQRlE3sI2CCcUlYwqAKUuKXPHcyBTH2jObZUqkOdMBP93wLN3wmXrxfrWN1q7DuzAY9c3EGWa7IIlxPJXnU7_YznmV7hdjt-WDf-8NfTt_FCEGpg7R7PIM2OAaH0zY4G2yWj8OVUmahFwc76vV3dvydOz8nbmy7HdZ_gCA1Dd4 20 | sn://wg?eJxVzjkOgkAUANCJiYVnUYf_v8MMTCcoQYlbjKilQNwiwbjEpeNINsbGC3gjO2ltX_VKjDG0LI4ouC05wuNTKUQRR8mBk9GgGkmQWigAjQjaUjLRImnEWlDhsQ2xllECBtKrGRyVG9yjVpgut-OV64gmdvsdc-704p0_D2kwUsdDZ7OdineUzgZu1UPv2u55dnLbBOSbBo4np7sP3XOYmbimy3C5umXvnJUZOzmtb6noXhaHff3vjJpMeOb5D-zSN-I= 21 | sn://wg?eJxVzskOwVAUANAXiYVvweu91xvat9PSlMYUUSy1jSmEGGLY9aOIjR_wR3a6tT2rU2CMoW1zRMEdzVE8PqVcNHFUHDhZNaqQAmWEBjCIYGytUiPSWmIE5Z44kBgVp2AhverhUXvhPW5E2_l6uPBcUcd2tyWnbifZBNOIegN9PLRW67F4x9tJzyv76F-bHd9Jb6uQAmnhcHS6B9A-RzuJS7r054vb7p2xImMnt_Et5N3L7LCv_p2lIQnPLPsB88Y39A== 22 | sn://wg?eJxNzjkOgkAUANCJiYVnUYf_v8MMTCcoQYlbjKilQNwiwbjEpeNINsbGC3gjOyltX_VKjDG0LI4ouK24fHwqBSjiKDlwMhpUIwlSCwWgEUFbSiZaJI1YCyo8tiHWMkrAQHo1g6Nyg3vUCtPldrxyHdHEbr9jzp1evPPnIQ1G6njobLZT8Y7S2cCteuhd2z3PTm6bgHzTwPHkdPehew4zE9d0GS5Xt-ydszJjJ6f1LRXby-Kwr_-XUZMJzzz_AZUoN44= 23 | sn://wg?eJxVzjkOgkAUANCJiYVnUYf_v8MMTCcoQYlbjKilQNwiwbjEpeNGVsbGC3gjO2ltX_VKjDG0LI4ouK04wuNTKUQRR8mBk9GgGkmQWigAjQjaUjLRImnEWlDhsQ2xllECBtKrGRyVG9yjVpgut-OV64gmdvsdc-704p0_D2kwUsdDZ7OdineUzgZu1UPv2u55dnLbBOSbBo4np7sP3XOYmbimy3C5umXvnJUZOzmtb6noXhaHff3vDJpMeOb5D-zaN-I= 24 | sn://wg?eJxNzssOwUAUANAJ8TWYzr2m89ppaUrjFVEstU2LEOIRj4Wk_2TBwofZ6dL2rE6JEAJKUQBOtaL8_SgXIJGCoIyi1cAaCiYMl4wZAGaUFInhSSM2HAuPNYuNiBJmAb6awVG6wT1qhdt0Pc5chzeh2-_Yc6cXb_x5iIORPB46q_WUf6LtbOBWPfCu7Z6nk9sqQN-2YDw53X3WPYc7G5Z4GabZbffJSYWQk9P6lortZXHY1__L2ij9zPMfKPc3Ig== 25 | sn://wg?eJxVzjkOgkAUANCJiYVnUYf_v8MMTCcoQYlbjKilQNwiwbjEpeNGVsbGC3gjO2ltX_VKjDG0LI4ouG1zwsenUogijpIDJ6NBNZIgtVAAGhG0pWSiRdKItaDCYxtiLaMEDKRXMzgqN7hHrTBdbscr1xFN7PY75tzpxTt_HtJgpI6HzmY7Fe8onQ3cqofetd3z7OS2Ccg3DRxPTncfuucwM3FNl-FydcveOSszdnJa31LRvSwO-_rfGTSZ8MzzH_AAN-o= 26 | sn://wg?eJxVzssOwUAUANCJxMK3YHrvNZ3pzE5LUxqviGKpbbxCiEc8dv0pYeEH_JGdbm3P6hQYY-g4HFFwrTmK16eUiyKOkgMnq0YVkiCNUAAGEYyjZGpEWkuMoNwTDYmRcQoW0rMeHpUX3uNGtJ2vhwvPFXVsd1v21O0km2AaUW-gjofWaj0W73g76XllH_1rs-Pr9LYKKbAtHI5O9wDa52hn45Iu_fnitntnrMjYyW18C3n3Mjvsq39nbciGR5b9APhuOAA= 27 | sn://wg?eJxVzjkOgkAUANAJxtOow_zvMAPTsUhQ4hYiSikQt2g0LnEpTLgThQ0Hs5PW9lVPI4SAaVIATi1BEct3oxaJFARlFPUutlEwobhkTAEwZUqRK553M8Wx9sximRJpznTAjx1epBu-Ui8-rHbR2nW4DYNR30icYbYPkhjHU3k597e7Oa_Sw2LstnzwH72hb-XPbYiBoUM0u74CNrjFRwM2eJ-s1s9jVZAmIVfH-2p19748nzp_Z65MqyyKH39GN3Q= 28 | sn://wg?eJxNzj0PwUAYAOAL8Wtwvfd1vWtv09KUpj4iilHbtAghWkEHSX-SxGDxw2w6Wp_pqRFCwDAoAKempOL5qFcgkYKgjKLWwRYKJhSXjCkApgwpYsXjTqQ4Vh6ZLFIijJkG-O56mbS9IuwFh2Q3S22Ld2E4Gugry4_27irA8VRm58F2t-Cf8LAc200HnFvfd8z4vvXQ1TWYzfPCZcNLcNRhg9dJkt6Pn5I0CMmt3rdWba_r86n9XwZlmK-y_AEjrjcU 29 | sn://wg?eJxVzjkOgkAUANAJiYVnUYf_v8MMTCcoQYmiMaKUAnGLRuMSl45LGRsv4I3spLV91TMYY2jbHFFwx-GEz0-1FEUcJQdOZpPqJEFqoQA0ImhbyVyLvJlpQaVnDmRapjmYSK9WeFJe-Ejb8W6xGS89V7SwN-haidvPtkESUzRSp2N3vZmKd7qbRV7NR__W6ftOfl-HFFgmjifnRwC9S7y3cEXX4WJ5378LVmHs7La_Rtm9zo-Hxt9ZarLgWRQ_9Jg39g== 30 | sn://wg?eJxNzjkOgkAUANCJiYVnUYf_v8MMTCcoQYlbjKilQNwiwbjEpeNKFsbGC3gjOyltX_VKjDG0LI4ouK24enwqBSjiKDlwMhpUIwlSCwWgEUFbSiZaJI1YCyo8tiHWMkrAQHo1g6Nyg3vUCtPldrxyHdHEbr9jzp1evPPnIQ1G6njobLZT8Y7S2cCteuhd2z3PTm6bgHzTwPHkdPehew4zE9d0GS5Xt-ydszJjJ6f1LRXby-Kwr_-XSZMJzzz_AZawN5I= 31 | sn://wg?eJxNzrsOgjAUANBG49eopfdaWugmIEGJrxhRR4GAGA0GNT4GE_7IwcHFD3OT0fVMp0YIAcOgAJyagsLzUa9AIgVBGUWtgy0UTCguGVMATBlSxIrHnUhxrDwyWaREGDMN8N31j9L276ET7JPtLLUt3oXBqK-vrGG081YBjqfyWPSz7YJ_wv1ybDddcK-9oWvGt8xHT9dgNj_dPTY4B7kOG7xMkvSWf0rSIORkOd9atb2si0P7v1ydzFdZ_gAeVzcG 32 | sn://wg?eJxVzjkOgkAUANAJxtOow__fYQamA5SgxC1G1FIgbtFoXOJSmHAnCxsOZiet7auewRhD2-aIgjuSI7xflVIUcZQcOJlNqpMEqYUC0IigbSUzLbJmqgWVnjqQaplkYCJ93Ois_OiZtOL9cjte-Z5wsdvvWHOvl-7CeUyDkTqfOpvtVBTJfjbwawEG93YvcLLHJqLQMnE8uTxD6F7jg4Vrug2Xq8ehyFmVsYvX-hpl97Y4HRt_Z6Ft553nP3z4N24= 33 | sn://wg?eJxVzrsOgjAUANBG49eopfdaWugmKEGJrxhRR4GAEonGRxAHE_5JExc_zE1W1zOdGiEEDIMCcGpKCvz1qFcikYKgjKLWwRYKJhSXjCkApgwpIsWjTqg4Vh6aLFQiiJgG-O56Z2l796DnZ3E6T2yLd2E4HuhraxTu3bWPk5k8nwa7dMk_Qbaa2E0HnFt_5JhRsfPQ1TWYLy53lw2v_kGHLebTOCkOn5I0CLlYvW-t6uab07H9d9aVYT7L8geBlDd6 34 | sn://wg?eJxNzskOwVAUANAXiYVvweu91xvat9PSlMYUUSy1jSmEGGLY9aew8QP-yE6Xtmd1CowxtG2OKLijuHx-Sjlo4qg4cLJqVCEFyggNYBDB2FqlRqS1xAjKPXEgMSpOwUJ61cOj9sJ73Ii28_Vw4bmiju1uS07dTrIJphH1Bvp4aK3WY_GOt5OeV_bRvzY7vpPeViEF0sLh6HQPoH2OdhKXdOnPF7fdO2NFxk5u41vIt5fZYV_9L2tDEh5Z9gOYLDeW 35 | sn://wg?eJxVzjkOgkAUANCJiYVnUYf_v8MMTCcoQYlbjKilQNwiwbjEpeNOxth4AW9kJ63tq16JMYaWxREFtyVHeHwqhSjiKDlwMhpUIwlSCwWgEUFbSiZaJI1YCyo8tiHWMkrAQHo1g6Nyg3vUCtPldrxyHdHEbr9jzp1evPPnIQ1G6njobLZT8Y7S2cCteuhd2z3PTm6bgHzTwPHkdPehew4zE9d0GS5Xt-ydszJjJ6f1LRXdy-Kwr_-dhSYTnnn-A-8eN-g= 36 | sn://wg?eJxNzrsOgjAUANBG49eopfdSWtpNQIISXzGijAIRNRqNj_gYTPgl4-Dih7nJ6HqmUyGEgG1TAE6VoubzUS1BIgVBGUXDxAYKJjSXjGkApm0pMs0zM9UcS08VS7VIMmYAvlvhUbrhPfGi7WI9zl2Ht6Db71ix00s3QRzhYCSPh85qPeWfZDsbuHUf_Gu756vstgoxsAwYT073gHXP0c6CJV6Gi_y2-xSkRsjJ8b6VcnuZH_bN_zJqW72K4gcjtDcU 37 | sn://wg?eJxNzssOwUAUANAJ8TWYzr2mM-3stDSlqUdEsdQ2LUKIVtCFpP8kYePD7HRpe1anRggBw6AAnJqCytejXoFECoIyiloHWyiYUFwypgCYMqSIFY87keJYeWSySIkwZhrgu-tl0vaKsBcckt0stS3eheFooK8sP9q7qwDHU5mdB9vdgn_Cw3JsNx1wbn3fMeP71kNX12A2zwuXDS_BUYcNXidJej9-StIgJLd631q1va7Pp_Z_WSrDfJblDygwNyA= 38 | sn://wg?eJxNzrsOgjAUANBG49eopfdSWugmIEGJojGijAIBNRqNj_gYTPgjBwcXP8xNRtcznRohBEyTAnBqmVR_PuoVSKQgKKOo6dhCwYTikjEFwJQpRaZ4pqeKY-WpxVIlkoxpgO9OcJROcE_caJuvJ4Vj8w70hz0jtgfpxo8jDMfyeOit1jP-Sbbz0Gl64F27A8_KbqsAfUODyfR091n_HO0MWOJllBe33ackDUJOtvutVdvL4rBv_5erk_Uqyx8hazcO 39 | sn://wg?eJxNzrsOgjAUANAG49eopfdaWtpNUIISXzGijALxFY3GR3wMJvyRg4OLH-ZmR9czHYsQAq5LAThViqrno2RAIgVBGUW7jlUUTGguGdMATLtS5Jrn9UxzNJ4plmmR5swGfDeio_Sje9qMt_P1aOF7vAGdXttJvG62CZMY-0N5PLRX6wn_pNtp368EEFxb3UDlt1WEoWPDaHy6h6xzjncOLPEymC9uu09ByoScvObXMtvL7LCv_ZfNSb2K4gcmxDcc 40 | sn://wg?eJxNzjkOgkAUgOGJiYVnUYf3nsMMTCcoQYlbjKilQNwiwbjEpeNOxth4AW9kJ6XVn3zVX2KMoWVxRMHtIo9PpQBFHCUHTkaDaiRBaqEANCJoS8lEi6QRa0GFxzbEWkYJGEivZnBUbnCPWmG63I5XriOa2O13zLnTi3f-PKTBSB0Pnc12Kt5ROhu4VQ-9a7vn2cltE5BvGjienO4-dM9hZuKaLsPl6pa9c1Zm7OS0vqXi9rI47Ov_y0KTCc88_wGUYTeM 41 | sn://wg?eJxVzjkOgkAUANCJxtOow_zPMAPTCUpY4hYjSikQFaLRuMSlMOFOxth4MDtpbV_1aoQQME0KwKklKOivR70SiRQEZRQ1HVsomFBcMqYAmDKlyBTP9FRxrDy1WKpEkjEN8N0Jj9IJ70k32i6LycqxeQeCgW_Edj_deHGEw7E8Hvy8mPFPsp0PnaYL7rXXd63slofoGRpMpqe7x4JztDNgjZfRcnXbfUrSIORkd7-1qntZHPbtv7NQpvUsyx-AyDd4 42 | sn://wg?eJxVzskOwUAYAOAJ8TSYzv93OttNS1MaW0TpUdvYQoglloOk7-TAwYO56dX1O30lQggoRQE41Yqi_X6UC5FIQVBG0bKxhoIJwyVjBoAZJUVmeGanhmPhqWapEUnGLMBXIzxKL7wnzWg7X48Wnssb0Om1ndjtppsgjrA_lMdDe7We8E-ynfa9qg_-tdX1dXZbhRg4FozGp3vAOudo58ASL4P54rb75KRCyMltfktF9zI77Ot_Z22Ufub5D4VoN4Q= 43 | sn://wg?eJxNzjkOgkAUANAJxtOow_zvMAPTsUhQ4hYiSikQt2g0LnEpTLgThQ0Hs5PS9lVPI4SAaVIATi1JsXw3apBIQVBGUe9iGwUTikvGFABTphS54nk3UxxrzyyWKZHmTAf82OFFuuEr9eLDahetXYfbMBj1jcQZZvsgiXE8lZdzf7ub8yo9LMZuywf_0Rv6Vv7chhgYOkSz6ytgg1t8NGCD98lq_TxWBWkScnW8r1Zv78vzqfNf5sq0yqL4ASLlNxI= 44 | sn://wg?eJxVzjkOgkAUANCJiYVnUYf_v8MMTCcoQYlbjKilQNwiwbjEpeNGVsbGC3gjO2ltX_VKjDG0LI4ouG1xwsenUogijpIDJ6NBNZIgtVAAGhG0pWSiRdKItaDCYxtiLaMEDKRXMzgqN7hHrTBdbscr1xFN7PY75tzpxTt_HtJgpI6HzmY7Fe8onQ3cqofetd3z7OS2Ccg3DRxPTncfuucwM3FNl-FydcveOSszdnJa31LRvSwO-_rfGTSZ8MzzH-80N-g= 45 | sn://wg?eJxVzrsOgjAUANAG49eopfdaWtpNUIISXzGijALxFY3GR3wMJvyRg4OLH-ZmV9czHYsQAq5LAThViiI8HyUjEikIyijadayiYEJzyZgGYNqVItc8r2eao_FMsUyLNGc24LsRHaUf3dNmvJ2vRwvf4w3o9NpO4nWzTZjE2B_K46G9Wk_4J91O-34lgODa6gYqv60iDB0bRuPTPWSdc7xzYImXwXxx230KUibk5DW_luleZod97e9sUupVFD992Ddw 46 | sn://wg?eJxNzjkOgkAUANCJiYVnUYf_P8MMTCcoQYlbjKilQNyi0bjEpeNINsaGC3gjOyltX_VKjDG0bY4ouKO4-fxUClDEUXLgZJhUIwlSCwWgEUHbSqZapGaiBRWeOJBoGadgIL0b4Ul54SNuRrvFZrT0XNHATq9tzdxusg1mEfWH6nRsrzcTkce7ad-r-ujfWl3fSe_rkALLwNH4_Aigc4n2Fq7oOlgs7_s8Y2XGzm7zWyq21_nxUP8voyYLXln2A5LZN4g= 47 | sn://wg?eJxVzjkOgkAUANCJiYVnUYf_v8MMTCcoQYlbjKilQNwiwbjEpeNOxth4AW9kJ63tq16JMYaWxREFt21O-PhUClHEUXLgZDSoRhKkFgpAI4K2lEy0SBqxFlR4bEOsZZSAgfRqBkflBveoFabL7XjlOqKJ3X7HnDu9eOfPQxqM1PHQ2Wyn4h2ls4Fb9dC7tnuendw2AfmmgePJ6e5D9xxmJq7pMlyubtk7Z2XGTk7rWyq6l8VhX_87C00mPPP8B_MQN_I= 48 | sn://wg?eJxNzjkOgkAUANCJiYVnUYf_v8MMTCcoQYlbjKilQNwiwbjEpeNGVsbGC3gjOyltX_VKjDG0LI4ouG1x-_GpFKCIo-TAyWhQjSRILRSARgRtKZlokTRiLajw2IZYyygBA-nVDI7KDe5RK0yX2_HKdUQTu_2OOXd68c6fhzQYqeOhs9lOxTtKZwO36qF3bfc8O7ltAvJNA8eT092H7jnMTFzTZbhc3bJ3zsqMnZzWt1RsL4vDvv5fBk0mPPP8B5d9N5Q= 49 | sn://wg?eJxVzssOwUAUANAJ8TWY3ntNZ9rZaWlK4xVRLLVNixDiEY-FpP8kYuPD7HRre1anxBhDy-KIgtuSE7we5UIUcZQcOBkNqpEEqYUC0IigLSUTLZJGrAUVHtsQaxklYCC9m8FRucE9aoXbdD3OXEc0sdvvmHOnF2_8eUiDkToeOqv1VHyi7WzgVj30ru2eZye3VUC-aeB4crr70D2HOxOXdBmm2W33yVmFsZPT-paK7mVx2Nf_zlJb9jPPf39CN3Q= 50 | sn://wg?eJxVzrsOgjAUANBG49eopfdaWtpNUIISXzGijgLxFY1GMIiDCf_k4MKHucnqeqZTI4SAZVEATpWiCO9XvRKJFARlFI0OtlAwoblkTAMwbUkRax53Is2x8kixSIswZgbgp-sn0vGfYS84b4_znWPzLgzHA3Ntj6KTtw5wMpPJbXA4LnkZnlcTp-mC--iPXBXnBx8904D5In16bHgPLibsMZtud_mlLEiDkNTufWtVN9vcru2_M9eWehfFD4DgN3g= 51 | sn://wg?eJxNzjkOgkAUANAJxtOow_zvMAPTCUpY4hYjSikQUKPRuMSlMOFOmth4MDspbV_1NEIImCYF4NSSFF-PWgUSKQjKKOptbKJgQnHJmAJgypQiUzxrp4pj5anFUiWSjOmA7054lE54T7rRNl9PCsfmHQgGvhHb_XTjxREOx_J48FfrGf8k2_nQabjgXnt918puqxA9Q4fJ9HT3WHCOdgYs8TLKi9vuU5I6ISe7-9Wq7WVx2Lf-y4YyrWdZ_gAjpjcU 52 | sn://wg?eJxVzjkOgkAUANAJiYVnUYf_P8MMTAcoQYlbjKilQNyi0bjEpeNSxsYLeCM7aW1f9QzGGDoORxTclRyt56daiiKOkgMn06I6SZBaKACNCNpRMtcitzItqPTMhUzLNAcT6eXFJxXEj7SZ7Bab0TLwhYedXtue-d1sG80S6g_V6dhebybine6m_aAWYnhrdUM3v69jimwTR-PzI4LOJdnbuKLrYLG8798FqzB29ptfo-xe58dD4-8sNdnwLIof8vg38g== 53 | sn://wg?eJxVzrsOgjAUANBG49eopfda2tJNUIISXzGijgLxFY1GMIiDCf_k4MKHucnqeqZTI4SAUhSAU0tRNN-veiUSKQjKKBodbKFgQnPJmAZgWkkRax53Is2x8shikRZhzAzAT9dPpOM_w15w3h7nO8fmXRiOB-baHkUnbx3gZCaT2-BwXPIyPK8mTtMF99EfuVacH3z0TAPmi_TpseE9uJiwx2y63eWXsiANQlK7961V3Wxzu7b_zlwr610UP4MmN34= 54 | sn://wg?eJxNzjkOgkAUANCJiYVnUYf_v8MMTCcoQYlbjKilQNwiwbjEpeNSRgsv4I3spLR91SsxxtCyOKLgtuL0-lQKUMRRcuBkNKhGEqQWCkAjgraUTLRIGrEWVHhsQ6xllICB9GwGR-UG96gVpsvteOU6oondfsecO714589DGozU8dDZbKfiHaWzgVv10Lu2e56d3DYB-aaB48np7kP3HGYmrukyXK5u2TtnZcZOTutbKraXxWFf_y_bmkx45PkPmCw3lg== 55 | sn://wg?eJxNzskOwUAYAOAJ8TSYzv93OttNS1MaW0TpUdvYQoglloOkz8TBxYO56dH1O30lQggoRQE41Zqq56NcgEQKgjKKlo01FEwYLhkzAMwoKTLDMzs1HAtPNUuNSDJmAb4b4VF64T1pRtv5erTwXN6ATq_txG433QRxhP2hPB7aq_WEf5LttO9VffCvra6vs9sqxMCxYDQ-3QPWOUc7B5Z4GcwXt90nJxVCTm7zWyq2l9lhX_8v20bpV57_AChENyA= 56 | sn://wg?eJxVzj0PwUAYAOAL8Wtwvfd1vWtv09KUpj4iilHbtAghWkEHSX-SxGDxw2y6Wp_pqRFCwDAoAKempMCfj3olEikIyihqHWyhYEJxyZgCYMqQIlY87kSKY-WRySIlwphpgO-ul0nbK8JecEh2s9S2eBeGo4G-svxo764CHE9ldh5sdwv-CQ_Lsd10wLn1fceM71sPXV2D2TwvXDa8BEcdNnidJOn9-ClJg5Dc6n1rVfe6Pp_af2dQhvkqyx9-jDdy 57 | sn://wg?eJxVzssKgkAUgOGh6Gmqcc5xnNHZpSaWlEVkuUxFK4qiC10WgY8UtGjTg7XLbasfvtVfI4SAaVIATq0q-vNRr0QiBUEZRU3HFgomFJeMKQCmTCkyxTM9VRwrTy2WKpFkTAN8d4KjdIJ74kbbfD0pHJt3oD_sGbE9SDd-HGE4lsdDb7We8U-ynYdO0wPv2h14VnZbBegbGkymp7vP-udoZ8ASL6O8uO0-JWkQcrLdb63avSwO-_bfMyjTepXlD36SN3I= 58 | sn://wg?eJxVzjkOgkAUANCJiYVnUYf_v8MMTCcoQYlbjKilQNwiwbjEpeNINsbGC3gjO2ltX_VKjDG0LI4ouG1zEo9PpRBFHCUHTkaDaiRBaqEANCJoS8lEi6QRa0GFxzbEWkYJGEivZnBUbnCPWmG63I5XriOa2O13zLnTi3f-PKTBSB0Pnc12Kt5ROhu4VQ-9a7vn2cltE5BvGjienO4-dM9hZuKaLsPl6pa9c1Zm7OS0vqWie1kc9vW_M2oy4ZnnP_MWN_I= 59 | sn://wg?eJxVjjsOgkAUADckFp5Fhfeeyy5sJyhBiaIxopQC8ReNxk_8dFzK2HgBb2TntlYzmWoMxhg6jonITVdDPD9VXSRpNcEkq0l1EiAUlwAKEZQjRaF40cwVJ91zF3IlsgIspFcrOkk_emTtZLfYjJe-x1vYG3Tt1Ovn2zBNKB7J07G73kz5O9vNYr8WYHDr9AO3uK8jCm0Lx5PzI4TeJdnbuKLrcLG8798lqzB29tpfQ-9e58dD4-9ZKLLhWZY_9uI3_A== 60 | sn://wg?eJxVzssKgkAUgOGh6Gmqcc5pnNHZpSWWdCOyWqaiJUnRBbNF4CMFLdr0YO1y2-qHb_XXCCFgGBSAU1NWeT7qlUikICijqHWwhYIJxSVjCoApQ4pI8agTKo6VhyYLlQgipgG-u95Z2t496PlZnM4T2-JdGI4H-toahXt37eNkJs-nwS5d8k-QrSZ20wHn1h85ZlTsPHR1DeaLy91lw6t_0GGL-TROisOnJA1CLlbvW6t2883p2P57BmWYr7L8AXxAN2w= 61 | sn://wg?eJxVzjkOgkAUANCJiYVnUYf_P8MMTCcoQYlbjKilQNyi0bjEpeNKFsaGC3gjO2ltX_VKjDG0bY4ouCM5ms9PpRBFHCUHToZJNZIgtVAAGhG0rWSqRWomWlDhiQOJlnEKBtK7EZ6UFz7iZrRbbEZLzxUN7PTa1sztJttgFlF_qE7H9nozEXm8m_a9qo_-rdX1nfS-DimwDByNz48AOpdob-GKroPF8r7PM1Zm7Ow2v6Wie50fD_W_M2my4JVlP-_oN-o= 62 | sn://wg?eJxVzjkOgkAUANCJiYVnUYf_v8MMTCcoQYlbjKilQNwiwbjEpeNOxth4AW9kJ63tq16JMYaWxREFtxVH8fhUClHEUXLgZDSoRhKkFgpAI4K2lEy0SBqxFlR4bEOsZZSAgfRqBkflBveoFabL7XjlOqKJ3X7HnDu9eOfPQxqM1PHQ2Wyn4h2ls4Fb9dC7tnuendw2AfmmgePJ6e5D9xxmJq7pMlyubtk7Z2XGTk7rWyq6l8VhX_87C00mPPP8B_MCN_I= 63 | sn://wg?eJxNzjkOgkAUANCJiYVnUYf_v8MMTCcoQYlbjKilQNwiwbjEpeNOxth4AW9kJ6Xtq16JMYaWxREFtxWXj0-lAEUcJQdORoNqJEFqoQA0ImhLyUSLpBFrQYXHNsRaRgkYSK9mcFRucI9aYbrcjleuI5rY7XfMudOLd_48pMFIHQ-dzXYq3lE6G7hVD71ru-fZyW0TkG8aOJ6c7j50z2Fm4pouw-Xqlr1zVmbs5LS-pWJ7WRz29f-y0GTCM89_l3E3lA== 64 | sn://wg?eJxVzjkOgkAUANCJiYVnUYf_v8MMTCcoQYlbjKilQNwiwbjEpeNINsbGC3gjO2ltX_VKjDG0LI4ouC05isenUogijpIDJ6NBNZIgtVAAGhG0pWSiRdKItaDCYxtiLaMEDKRXMzgqN7hHrTBdbscr1xFN7PY75tzpxTt_HtJgpI6HzmY7Fe8onQ3cqofetd3z7OS2Ccg3DRxPTncfuucwM3FNl-FydcveOSszdnJa31LRvSwO-_rfGTWZ8MzzH-_qN-o= 65 | sn://wg?eJxNzjkOgkAUANCJiYVnUYf_P8MMTCcoQYlbjKilQNyi0bjEpeNGVsaGC3gjOyltX_VKjDG0bY4ouGNz8_mpFKCIo-TAyTCpRhKkFgpAI4K2lUy1SM1ECyo8cSDRMk7BQHo3wpPywkfcjHaLzWjpuaKBnV7bmrndZBvMIuoP1enYXm8mIo93075X9dG_tbq-k97XIQWWgaPx-RFA5xLtLVzRdbBY3vd5xsqMnd3mt1Rsr_Pjof5fBk0WvLLsB5LfN4g= 66 | sn://wg?eJxNzskOwUAYAOBJxdNgOv9vts5NS1MaW0TpUdvYQoglloOkjyRxcPFgbnp0_U6fRQgBrSkAp46m4vkoFaCQgqSMol3HKkomDVeMGQBmtJKZ4Vk9NRwLTx2WGplkzAZ8N8Kj8sJ70oy28_Vo4bm8AZ1eW8RuN90EcYT9oToe2qv1hH-S7bTvVXzwr62u72S3VYiBsGE0Pt0D1jlHOwFLvAzmi9vuk5MyISe3-bWK7WV22Nf-y2C088rzHyOyNxQ= 67 | sn://wg?eJxVjs0OwUAYADfE06Dd77PdbfempSlN_UQUR23TIoRoBT1I-k4iLh7MzV6dZjKnqRFCwDQ1AKZZCvz1qKsiUKlGNdQ72EJOuWSCUglApSl4IlnSiSVD1WOLxpJHCdUB310_F45fRr3wkO5mmWOzLgxHA2NlB_HeW4U4nor8PNjuFuwTHZZjp-mCe-sHrpXctz56hg6zeVF6dHgJjwZs8DpJs_vxU5EGIYXd-9bU7nV9PrX_nrk0rWdV_QCEqDeC 68 | sn://wg?eJxVzrsKwjAUANBQ8WvUNPeaJk02Wy3V4gux2tGm-EJRfOBjEPpJgoOLH-ZmV9czHYsQAq5LAThViiJ_PkqFSKQgKKNo17GKggnNJWMagGlXikzzrG40x8KNYkaLNGM24LsRHaUf3dNmvJ2vRwvf4w3o9NpO4nXNJkxi7A_l8dBerSf8k26nfb8SQHBtdQOV3VYRho4No_HpHrLOOd45sMTLYL647T45KRNy8ppfq-heZod97e8M2lWvPP8BgOY3eA== 69 | sn://wg?eJxVzjkOgkAUANCJiYVnUYf_v8MMTCcoQYlbjKilQNwiwbjEpeNGVsbGC3gjO2ltX_VKjDG0LI4ouC054eNTKUQRR8mBk9GgGkmQWigAjQjaUjLRImnEWlDhsQ2xllECBtKrGRyVG9yjVpgut-OV64gmdvsdc-704p0_D2kwUsdDZ7OdineUzgZu1UPv2u55dnLbBOSbBo4np7sP3XOYmbimy3C5umXvnJUZOzmtb6noXhaHff3vDJpMeOb5D-2cN-Q= 70 | sn://wg?eJxVzrsKwjAUANBQ8WvUNPeaJmk2Wy3V4gux2tGm-EJRfOBjEPpPIi5-mJtdXc90LEIIKEUBOHUFBfV6lAqRSEFQRtGuYxUFE5pLxjQA00qKTPOsbjTHwo3LjBZpxmzAdyM6Sj-6p814O1-PFr7HG9DptZ3E65pNmMTYH8rjob1aT_gn3U77fiWA4NrqBm52W0UYOjaMxqd7yDrneOfAEi-D-eK2--SkTMjJa36tonuZHfa1v7PQyn3m-Q-EnDeC 71 | sn://wg?eJxVjjsOgkAUADcmFp5Fhfeeyy5sJyhBib8YUUuB-IsE4yd-Oq5kYWy8gDeyc1urmUw1JcYY2raByA1HQzw-FV0kaTXAILNBNRIgFJcAChGULUWqeNpIFCfdEwcSJeIUTKRXMzxKL7zHrShbbscrz-VN7PY71tztJbtgHtFgJI-HzmY75e84mw28qo_-td3znfS2CSmwTBxPTvcAuucot3BNl-FydcvfBSszdnJb35LevSwO-_rfMymy4FkUP_PSN_Q= 72 | sn://wg?eJxVzssOwUAUANCJxMK3YHrvNZ2Zzk5LUxpKRLHUNl4hxCMeu_6U2PgBf2SnW9uzOiXGGGrNEQV3FEf9-lQKUcRRcuBkNahGEqQRCsAggtFKZkZkjdQIKjx1IDUyycBCejXDk_LCR9KKd4vNaOm5oondfseeub10G8xiiobqdOysNxPxTnbTyKv66N_aPd_J7uuQAtvC0fj8CKB7ifc2rug6WCzv-3fOyoyd3da3VHSv8-Oh_nfWhmx45vkP-So4Ag== 73 | sn://wg?eJxNzstugkAUANAJSRf9ltrh3ss8YHaAEpSobYy0LssQrUajEYyPHR_Vpht_wD9yV5Zuz-o4jDH0fY4oeKC493N7bkETR8WBk-tRhxQoIzSAQQTja1UaUXrWCGrdBmCNKkpwkf7CrNJxdim6-Wa-miziSIQ4GPXlLBradTrLafyuq31_ufoQ12LzOY5fEkxOvWESlOdlRql0cTKtLykMDvlW4jcd3-aL8_basCfG6qh7d9rt8Wu_e30sS0MSfpvmH5UcN44= 74 | sn://wg?eJxVzj0PwUAYAOAL8Wtwvfd1vWtv09KUpj4iilHbtAghWkEHSf-SGCx-mE1X6zM9NUIIGAYF4NQUFOTzUa9EIgVBGUWtgy0UTCguGVMATBlSxIrHnUhxrDwyWaREGDMN8N31Mml7RdgLDslultoW78JwNNBXlh_t3VWA46nMzoPtbsE_4WE5tpsOOLe-75jxfeuhq2swm-eFy4aX4KjDBq-TJL0fPyVpEJJbvW-t6l7X51P774zKMF9l-QOA0Dd4 75 | sn://wg?eJxNzjkOgkAUANCJiYVnUYf_P8MMTCcoQYlbjKilQNyi0bjEpeNKFsaGC3gjOyltX_VKjDG0bY4ouCO5-fxUClDEUXLgZJhUIwlSCwWgEUHbSqZapGaiBRWeOJBoGadgIL0b4Ul54SNuRrvFZrT0XNHATq9tzdxusg1mEfWH6nRsrzcTkce7ad-r-ujfWl3fSe_rkALLwNH4_Aigc4n2Fq7oOlgs7_s8Y2XGzm7zWyq21_nxUP8vkyYLXln2A5LTN4g= 76 | sn://wg?eJxNzjkOgkAUANCJiYVnUYf_P8MMTCcoQYlbjKilQNyi0bjEpeNKFsaGC3gjOyltX_VKjDG0bY4ouONw8_mpFKCIo-TAyTCpRhKkFgpAI4K2lUy1SM1ECyo8cSDRMk7BQHo3wpPywkfcjHaLzWjpuaKBnV7bmrndZBvMIuoP1enYXm8mIo93075X9dG_tbq-k97XIQWWgaPx-RFA5xLtLVzRdbBY3vd5xsqMnd3mt1Rsr_Pjof5fJk0WvLLsB5UuN44= 77 | sn://wg?eJxVzjsOgkAUQNEJiYVrUYf3nsMMTCcoQYmiMaKUAvEXjcZP_HRsyti4AXdkJ63VTU51DcYY2jZHFNwpI56faimKOEoOnMwm1UmC1EIBaETQtpK5Fnkz04JKzxzItExzMJFerfCkvPCRtuPdYjNeeq5oYW_QtRK3n22DJKZopE7H7nozFe90N4u8mo_-rdP3nfy-DimwTBxPzo8Aepd4b-GKrsPF8r5_F6zC2Nltf41y9zo_Hhp_z1KTBc-i-AH1Vjf4 78 | sn://wg?eJxNzjkOgkAUANAJiYVnUYf_v8MMTCcoQYmiMaKUAnGLRuMSl45LGRsv4I3spLR91TMYY2jbHFFwx-H281MtQRFHyYGT2aQ6SZBaKACNCNpWMtcib2ZaUOmZA5mWaQ4m0qsVnpQXPtJ2vFtsxkvPFS3sDbpW4vazbZDEFI3U6dhdb6bine5mkVfz0b91-r6T39chBZaJ48n5EUDvEu8tXNF1uFje9--CVRg7u-2vUW6v8-Oh8V-Wmix4FsUPnBM3oA== 79 | sn://wg?eJxVzj0PwUAYAOAL8Wtwvfd1vWtv09KUpj4iilHbtAghWkEHSf-RwWDxw2y6Wp_pqRFCwDAoAKemQRGej3olEikIyihqHWyhYEJxyZgCYMqQIlY87kSKY-WRySIlwphpgO-ul0nbK8JecEh2s9S2eBeGo4G-svxo764CHE9ldh5sdwv-CQ_Lsd10wLn1fceM71sPXV2D2TwvXDa8BEcdNnidJOn9-ClJg5Dc6n1rVfe6Pp_af-cqZb7K8gd9Djdu 80 | sn://wg?eJxNzssOwUAUANAJ8TWYzr2m89ppaUrjFVEstU2LEOIRj4Wk_yRh48PsdGl7VqdECAGlKACnWlP1epQLkEhBUEbRamANBROGS8YMADNKisTwpBEbjoXHmsVGRAmzAN_N4Cjd4B61wm26Hmeuw5vQ7XfsudOLN_48xMFIHg-d1XrKP9F2NnCrHnjXds_TyW0VoG9bMJ6c7j7rnsOdDUu8DNPstvvkpELIyWl9S8X2sjjs6_9laZR-5vkPK0g3KA== 81 | sn://wg?eJxNzrsOgjAUANAG49eopfdaWtpNUIISXzGijALxFY3GR3wMJvyRg4OLH-ZmR9czHYsQAq5LAThVisLzUTIgkYKgjKJdxyoKJjSXjGkApl0pcs3zeqY5Gs8Uy7RIc2YDvhvRUfrRPW3G2_l6tPA93oBOr-0kXjfbhEmM_aE8Htqr9YR_0u2071cCCK6tbqDy2yrC0LFhND7dQ9Y5xzsHlngZzBe33acgZUJOXvNrme1ldtjX_svmpF5F8QMgrDcM 82 | sn://wg?eJxNzjkOgkAUANAJxtOow_zvMAPTsUhQ4hYiSikQt2g0LnEpTLgThQ0Hs5PS9lVPI4SAaVIATi1JRflu1CCRgqCMot7FNgomFJeMKQCmTClyxfNupjjWnlksUyLNmQ74scOLdMNX6sWH1S5auw63YTDqG4kzzPZBEuN4Ki_n_nY351V6WIzdlg_-ozf0rfy5DTEwdIhm11fABrf4aMAG75PV-nmsCtIk5Op4X63e3pfnU-e_zJVplUXxAyXxNxo= 83 | sn://wg?eJxVzrsOgjAUANBG49eopfdS2tJNQIISXzGijAIRNRqNj_gYTPgmHVz8MDdZXc90KoQQUIoCcGoLCur5qJYikYKgjKJhYgMFE5pLxjQA00qKTPPMTDXH0lObpVokGTMA363wKN3wnnjRdrEe567DW9Dtd6zY6aWbII5wMJLHQ2e1nvJPsp0N3LoP_rXd8-3stgoxsAwYT073gHXP0c6CJV6Gi_y2-xSkRsjJ8b6VsnuZH_bNv7Oplf0qih-CVjd8 84 | sn://wg?eJxVzjkOgkAUANCJiYVnUYf_P8MMTCcoQYlbjKilQNyi0bjEpeNINsaGC3gjO2ltX_VKjDG0bY4ouCM5ms9PpRBFHCUHToZJNZIgtVAAGhG0rWSqRWomWlDhiQOJlnEKBtK7EZ6UFz7iZrRbbEZLzxUN7PTa1sztJttgFlF_qE7H9nozEXm8m_a9qo_-rdX1nfS-DimwDByNz48AOpdob-GKroPF8r7PM1Zm7Ow2v6Wie50fD_W_M2qy4JVlP-8kN-g= 85 | sn://wg?eJxVzrsOgjAUgOFG49OopedYWugmIEGJtxhRR4GAGA0GNV4GE17JOLj4YG6yOv3JN_01QggYBgXg1KyiPx_1SiRSEJRR1DrYQsGE4pIxBcCUIUWseNyJFMfKI5NFSoQx0wDfXf8obf8eOsE-2c5S2-JdGIz6-soaRjtvFeB4Ko9FP9su-CfcL8d20wX32hu6ZnzLfPR0DWbz091jg3OQ67DByyRJb_mnJA1CTpbzrVW7l3VxaP89ozLMV1n-AIDcN3g= 86 | sn://wg?eJxNzjkOgkAUANCJiYVnUYf_v8MMTCcoQYlbjKilQNwiwbjEpeNGVsbGC3gjOyltX_VKjDG0LI4ouC05Pj6VAhRxlBw4GQ2qkQSphQLQiKAtJRMtkkasBRUe2xBrGSVgIL2awVG5wT1qhelyO165jmhit98x504v3vnzkAYjdTx0NtupeEfpbOBWPfSu7Z5nJ7dNQL5p4HhyuvvQPYeZiWu6DJerW_bOWZmxk9P6lortZXHY1__LoMmEZ57_AI_DN4A= 87 | sn://wg?eJxNzjkOgkAUANCJiYVnUYf_P8MMTCcoQYlbjKilQNyi0bjEpeNMJsaGC3gjOyltX_VKjDG0bY4ouONw-_mpFKCIo-TAyTCpRhKkFgpAI4K2lUy1SM1ECyo8cSDRMk7BQHo3wpPywkfcjHaLzWjpuaKBnV7bmrndZBvMIuoP1enYXm8mIo93075X9dG_tbq-k97XIQWWgaPx-RFA5xLtLVzRdbBY3vd5xsqMnd3mt1Rsr_Pjof5fNjVZ8MqyH5nKN5o= 88 | sn://wg?eJxNzjkOgkAUANCJiYVnUYf_P8MMTCcoQYlbjKilQNyi0bjEpeNMJsaGC3gjOyltX_VKjDG0bY4ouCO5_fxUClDEUXLgZJhUIwlSCwWgEUHbSqZapGaiBRWeOJBoGadgIL0b4Ul54SNuRrvFZrT0XNHATq9tzdxusg1mEfWH6nRsrzcTkce7ad-r-ujfWl3fSe_rkALLwNH4_Aigc4n2Fq7oOlgs7_s8Y2XGzm7zWyq21_nxUP8vm5oseGXZD5dvN5Q= 89 | sn://wg?eJxNzjkOgkAUANAJiYVnUYf_v8MMTCcoQYmiMaKUAnGLRuMSl45LGRsv4I3spLR91TMYY2jbHFFwR3L1_FRLUMRRcuBkNqlOEqQWCkAjgraVzLXIm5kWVHrmQKZlmoOJ9GqFJ-WFj7Qd7xab8dJzRQt7g66VuP1sGyQxRSN1OnbXm6l4p7tZ5NV89G-dvu_k93VIgWXieHJ-BNC7xHsLV3QdLpb3_btgFcbObvtrlNvr_Hho_JelJgueRfEDmPM3mA== 90 | sn://wg?eJxVzjkOgkAUANCJiYVnUYf_v8MMTCcoQYlbjKilQNwiwbjEpeNKFsbGC3gjO2ltX_VKjDG0LI4ouC052o9PpRBFHCUHTkaDaiRBaqEANCJoS8lEi6QRa0GFxzbEWkYJGEivZnBUbnCPWmG63I5XriOa2O13zLnTi3f-PKTBSB0Pnc12Kt5ROhu4VQ-9a7vn2cltE5BvGjienO4-dM9hZuKaLsPl6pa9c1Zm7OS0vqWie1kc9vW_M2ky4ZnnP_SMN_Y= 91 | sn://wg?eJxNzjkOgkAUANAJxtOow_zvLMx0ghKUuMWIUgrELRqNS1wKE25kYWHjweyktH3Vswgh4DgUgFOtqXg-SgUopCApo2jXsYqSScMVYwaAGUfJzPCsnhqOhaeapUYmGbMB343wqLzwnjSj7Xw9Wngub0Cn1xax2003QRxhf6iOh_ZqPeGfZDvtexUf_Gur6-vstgoxEDaMxqd7wDrnaCdgiZfBfHHbfXJSJuTkNr9Wsb3MDvvaf7k46Vee_wAjuDcU 92 | sn://wg?eJxVzjkOgkAUANCJiYVnUYf_P8PMMJ2gBCVuMaKWAnGLRuMSl45LGRsv4I3spLV91SsxxlBrjii4qznZr0-lEEUcJQdOlk01kiCNUAAGEYxWMjMis1MjqPDUhdTIJAML6dWITsqPHkkz3i02o6XviQZ2em1n5nXTbTiLqT9Up2N7vZmId7Kb9v1qgMGt1Q3c7L6OKHQsHI3PjxA6l3jv4Iqug8Xyvn_nrMzY2Wt-S0X3Oj8e6n9nbciBZ57_APbgN_w= 93 | sn://wg?eJxVzrsOgjAUANAG49eopfda2tINUIISRWNEHQXiKxKMj_gYTPgnBxc_zE1W1zMdgxACSlEATm1JQb2ftUokUhCUUTTb2ETBhOaSMQ3AtJIi0zxrp5pj5anNUi2SjJmAbyc8SS98JJ04X-0ma8_lDvSHPWvhDtJ9sIgxGsvTsbfdzfgnyeeR1_DBv3UHvp3dtyEGlgmT6fkRsP4lLizY4HW0Wt-LT0nqhJzdzteoutfl8dD6Oyut7FdZ_gCG6jeI 94 | sn://wg?eJxNzskOwVAUANAXiYVvweu91xvat9PSlMYUUSy1jSmEGGLY9Y-sxMYP-CM7Xdqe1SkwxtC2OaLgjsPl41PKQRNHxYGTVaMKKVBGaACDCMbWKjUirSVGUO6JA4lRcQoW0qseHrUX3uNGtJ2vhwvPFXVsd1ty6naSTTCNqDfQx0NrtR6Ld7yd9Lyyj_612fGd9LYKKZAWDkenewDtc7STuKRLf7647d4ZKzJ2chvfQr69zA776n8ZDEl4ZtkPlTI3jg== 95 | sn://wg?eJxVzrsOgjAUgOEG49OopedYWtpNUIISbzGijALxFo3GS7wMJryTgw4-mJtd3f58028RQsB1KQCnSlEQ70fJiESTlFG061hFwYTmkjENwLQrRa55Xs80R-OZYpkWac5swFcjOko_uqfNeDtfjxa-xxvQ6bWdxOtmmzCJsT-Ux0N7tZ7wT7qd9v1KAMG11Q1UfltFGDo2jMane8g653jnwBIvg_nitvsUpEzIyWt-LbN7mR32tb9npV31LIofh7g3ig== 96 | sn://wg?eJxVzjkOgkAUANCJiYVnUYf_P8MMTCcoQYlbjKilQNyi0bjEpeNMJsaGC3gjO2ltX_VKjDG0bY4ouKM4wfNTKUQRR8mBk2FSjSRILRSARgRtK5lqkZqJFlR44kCiZZyCgfRuhCflhY-4Ge0Wm9HSc0UDO722NXO7yTaYRdQfqtOxvd5MRB7vpn2v6qN_a3V9J72vQwosA0fj8yOAziXaW7ii62CxvO_zjJUZO7vNb6noXufHQ_3vbGqy4JVlP-_uN-o= 97 | sn://wg?eJxNzskOwUAYAOBJxdNgOv9vls7ctDSlsUWUHrWNLYRYYjlI-k4kLh7MTY-u3-mzCCHgOBSAU60pvB6lAhRSkJRRtOtYRcmk4YoxA8CMo2RmeFZPDcfCU81SI5OM2YDvRnhUXnhPmtF2vh4tPJc3oNNri9jtppsgjrA_VMdDe7We8E-ynfa9ig_-tdX1dXZbhRgIG0bj0z1gnXO0E7DEy2C-uO0-OSkTcnKbX6vYXmaHfe2_LIyjn3n-AyRxNxY= 98 | sn://wg?eJxVzssOwUAUANAJ8TWY3ntNZ9rZaWlK4xVRLLVNixDiEY-FpJ8ksbDxYXa6tT2rU2KMoWVxRMFtyRGej3IhijhKDpyMBtVIgtRCAWhE0JaSiRZJI9aCCo9tiLWMEjCQ3s3gqNzgHrXCbboeZ64jmtjtd8y504s3_jykwUgdD53Veio-0XY2cKseetd2z7OT2yog3zRwPDndfeiew52JS7oM0-y2--SswtjJaX1LRfeyOOzrf2fUlv3K8x96sjdo 99 | sn://wg?eJxNzjkOgkAUANCJiYVnUYf_v8MMTCcoQYlbjKilQNwiwbjEpeNINsbGC3gjOyltX_VKjDG0LI4ouG1z6_GpFKCIo-TAyWhQjSRILRSARgRtKZlokTRiLajw2IZYyygBA-nVDI7KDe5RK0yX2_HKdUQTu_2OOXd68c6fhzQYqeOhs9lOxTtKZwO36qF3bfc8O7ltAvJNA8eT092H7jnMTFzTZbhc3bJ3zsqMnZzWt1RsL4vDvv5fRk0mPPP8B5hEN5Y= 100 | sn://wg?eJxNzjkOgkAUANCJiYVnUYf_v8MMTCcoQYlbjKilQNwiwbjEpeNSRgsv4I3spLR91SsxxtCyOKLgtuLy9akUoIij5MDJaFCNJEgtFIBGBG0pmWiRNGItqPDYhljLKAED6dkMjsoN7lErTJfb8cp1RBO7_Y45d3rxzp-HNBip46Gz2U7FO0pnA7fqoXdt9zw7uW0C8k0Dx5PT3YfuOcxMXNNluFzdsnfOyoydnNa3VGwvi8O-_l-2NZnwyPMfm0A3ng== 101 | sn://wg?eJxVzssOwUAUgOEJ8TSYzjmmM53ZaWlK4xZRLLVNixDiEpeFpG9kYWHjwezM1upP_tVXIoSA41AATpWJej7K5kikICijaDWwhoIJzSVjGoBpR4pU87SRaI7mJ4olWsQpswDfzfAovfAet6Jtth7nnsub0O137LnbSzbBPMLBSB4PndV6yj_xdjbwqj7413bPV-ltFWJgWzCenO4B656jnQ1LvAyz_Lb7FKRCyMltfUuGe1kc9vU_s0GpV1H8AIJoN3w= 102 | sn://wg?eJxVzjkOgkAUANAJxtOow_zvMAPTsUhQ4hYiSikQt2g0LnEpTLgThQ0Hs5PW9lVPI4SAaVIATi1JgZfvRi0SKQjKKOpdbKNgQnHJmAJgypQiVzzvZopj7ZnFMiXSnOmAHzu8SDd8pV58WO2itetwGwajvpE4w2wfJDGOp_Jy7m93c16lh8XYbfngP3pD38qf2xADQ4dodn0FbHCLjwZs8D5ZrZ_HqiBNQq6O99Xq7n15PnX-zlyZVlkUP4DSN3g= 103 | sn://wg?eJxVzjkOgkAUANCJiYVnUYf_v8MMTCcoQYlbjKilQNwiwbjEpeNOxth4AW9kJ63tq16JMYaWxREFtyUnenwqhSjiKDlwMhpUIwlSCwWgEUFbSiZaJI1YCyo8tiHWMkrAQHo1g6Nyg3vUCtPldrxyHdHEbr9jzp1evPPnIQ1G6njobLZT8Y7S2cCteuhd2z3PTm6bgHzTwPHkdPehew4zE9d0GS5Xt-ydszJjJ6f1LRXdy-Kwr_-dhSYTnnn-A_FyN-4= 104 | sn://wg?eJxVzjkOgkAUANAJiYVnUYf_P8MMTAcoQYlbjKilQNyi0bjEpeNSxsYLeCM7aW1f9QzGGDoORxTcVZys56daiiKOkgMn06I6SZBaKACNCNpRMtcitzItqPTMhUzLNAcT6eXFJxXEj7SZ7Bab0TLwhYedXtue-d1sG80S6g_V6dhebybine6m_aAWYnhrdUM3v69jimwTR-PzI4LOJdnbuKLrYLG8798FqzB29ptfo-xe58dD4-8sNdnwLIof9Iw39g== 105 | sn://wg?eJxVzjkOgkAUANAJxtOow_zvMAPTsUhQ4hYiSikQt2g0LnEpTLgThQ0Hs5PW9lVPI4SAaVIATi1BgZfvRi0SKQjKKOpdbKNgQnHJmAJgypQiVzzvZopj7ZnFMiXSnOmAHzu8SDd8pV58WO2itetwGwajvpE4w2wfJDGOp_Jy7m93c16lh8XYbfngP3pD38qf2xADQ4dodn0FbHCLjwZs8D5ZrZ_HqiBNQq6O99Xq7n15PnX-zlyZVlkUP4AIN3Y= 106 | sn://wg?eJxNzrsOgjAUgOFG49OopedQ2tJNQIISbzGijAIRNRqNl3gZTHgmHVx8MDcZHf9_-iqEEFCKAnBqK_p8VMuWSEFQRtEwsYGCCc0lYxqAaSVFpnlmpppj-VObpVokGTMA363wKN3wnnjRdrEe567DW9Dtd6zY6aWbII5wMJLHQ2e1nvJPsp0N3LoP_rXd8-3stgoxsAwYT073gHXP0c6CJV6Gi_y2-xSkRsjJ8b6VEnuZH_bNP7Gplf0qih_Gdzau 107 | sn://wg?eJxNzrsOgjAUANAG49eopfdaWtpNUIISXzGijFLiKxqNj_gYTPgnBx38MDcZXc90LEIIuC4F4FRJiu9HqQCJFARlFO06VlEwoblkTAMw7UqRaZ7VjeZYuFHMaJFmzAZ8NaKj9KN72oy38_Vo4Xu8AZ1e20m8rtmESYz9oTwe2qv1hH_S7bTvVwIIrq1uoLLbKsLQsWE0Pt1D1jnHOweWeBnMF7fdJydlQk5e82sV28vssK_9l5V21TPPfyaqNxw= 108 | sn://wg?eJxVzjkOgkAUANCJiYVnUYf_v8MMTCcoQYlbjKilQNwiwbjEpeNOxth4AW9kJ63tq16JMYaWxREFt22O6vGpFKKIo-TAyWhQjSRILRSARgRtKZlokTRiLajw2IZYyygBA-nVDI7KDe5RK0yX2_HKdUQTu_2OOXd68c6fhzQYqeOhs9lOxTtKZwO36qF3bfc8O7ltAvJNA8eT092H7jnMTFzTZbhc3bJ3zsqMnZzWt1R0L4vDvv53FppMeOb5D_bsN_w= 109 | sn://wg?eJxNzssOwUAUANCJxMK3YHrvNZ3pzE5LUxqviGKpbbxCiEc8dv0jK7HxA_7ITpe2Z3UKjDF0HI4ouNZcPz6lHBRxlBw4WTWqkARphAIwiGAcJVMj0lpiBOWeaEiMjFOwkF718Ki88B43ou18PVx4rqhju9uyp24n2QTTiHoDdTy0VuuxeMfbSc8r--hfmx1fp7dVSIFt4XB0ugfQPkc7G5d06c8Xt907Y0XGTm7jW8i3l9lhX_0vgyEbnln2A5hGN5Y= 110 | sn://wg?eJxNzskOwUAYAOBJxdNgOv9vls7ctDSlsUWUHrWNLYRYYjlI-k4OHDyYmx5dv9NnEULAcSgAp1pR8X6UClBIQVJG0a5jFSWThivGDAAzjpKZ4Vk9NRwLTzVLjUwyZgO-GuFReeE9aUbb-Xq08FzegE6vLWK3m26COML-UB0P7dV6wj_Jdtr3Kj7411bX19ltFWIgbBiNT_eAdc7RTsASL4P54rb75KRMyMltfq1ie5kd9rX_sjaOfub5DyjzNyI= 111 | sn://wg?eJxNzjkOgkAUANCJiYVnUYf_v8MMTCcoQYlbjKilQNwiwbjEpeNGVsbGC3gjOyltX_VKjDG0LI4ouG1zfHwqBSjiKDlwMhpUIwlSCwWgEUFbSiZaJI1YCyo8tiHWMkrAQHo1g6Nyg3vUCtPldrxyHdHEbr9jzp1evPPnIQ1G6njobLZT8Y7S2cCteuhd2z3PTm6bgHzTwPHkdPehew4zE9d0GS5Xt-ydszJjJ6f1LRXby-Kwr_-XQZMJzzz_AZIeN4Y= 112 | sn://wg?eJxVzjkOgkAUANAJxtOow_zvMAPTsUhQ4hYiSikQt2g0LnEpTLgThQ0Hs5PW9lVPI4SAaVIATi1JkZfvRi0SKQjKKOpdbKNgQnHJmAJgypQiVzzvZopj7ZnFMiXSnOmAHzu8SDd8pV58WO2itetwGwajvpE4w2wfJDGOp_Jy7m93c16lh8XYbfngP3pD38qf2xADQ4dodn0FbHCLjwZs8D5ZrZ_HqiBNQq6O99Xq7n15PnX-zlyZVlkUP4GYN3o= 113 | sn://wg?eJxNzrsKwjAUgOFQ8WnUNOeYJmk2Wy3V4g2x2tGmeENRvOBlEPpOIi4-mJsdHf9_-ixCCChFATh1FX09SkVLpCAoo2jXsYqCCc0lYxqAaSVFpnlWN5pj8Y3LjBZpxmzAdyM6Sj-6p814O1-PFr7HG9DptZ3E65pNmMTYH8rjob1aT_gn3U77fiWA4NrqBm52W0UYOjaMxqd7yDrneOfAEi-D-eK2--SkTMjJa36tAnuZHfa1P7HQyn3m-Q_Itza0 114 | sn://wg?eJxVzrsOgjAUANBG49eopfdS2tJNQIISXzGijAIRNRqNj_gYTPgnTVz8MDdZXc90KoQQUIoCcGoriubrUS1FIgVBGUXDxAYKJjSXjGkAppUUmeaZmWqOpac2S7VIMmYAvlvhUbrhPfGi7WI9zl2Ht6Db71ix00s3QRzhYCSPh85qPeWfZDsbuHUf_Gu759vZbRViYBkwnpzuAeueo50FS7wMF_lt9ylIjZCT430rZfcyP-ybf2dLK_tZFD-CYDd8 115 | sn://wg?eJxVzssOwUAUANAJ8TWY3ntNZ6az09KUxiuiWGobrxDiEY-FpP9kYdMPs9Ot7VmdEmMMteaIgjuaE7xf5UIUcZQcOFkNqpEEaYQCMIhgtJKpEWkjMYIKTxxIjIxTsJA-zfCsvPAZt6L9cjteea5oYrffseduL9kF84gGI3U-dTbbqcjj_WzgVX307-2e76SPTUiBbeF4cnkG0L1GBxvXdBsuV49DnrEKYxe39S0V3dvidKz_nYXRzjvLfn9SN3Q= 116 | sn://wg?eJxVzjkOgkAUANCJxtOow_-fYQamE5SgxC1GlFIgbtFoXOJSmHAmLWw8mJ20tq96JcYY2jZHFNxRnOD5KBeiiKPkwMkwqUYSpBYKQCOCtpXMtMjMVAsqPHUg1TLJwEB6N8Kj8sJ70oy28_Vo4bmigZ1e24rdbroJ4oj6Q3U8tFfrifgk22nfq_roX1td38luq5ACy8DR-HQPoHOOdhYu6TKYL267T84qjJ3c5rdUdC-zw77-dza17bzy_Ad9xjdw 117 | sn://wg?eJxVzskOwVAUgOEbiYVnwe05xx3au9PSlMYUUSy1jSmEGGLY9aGIjRfwRna6tfqTb_UXGGNo2xxRcCeP_fiUctHEUXHgZNWoQgqUERrAIIKxtUqNSGuJEZR74kBiVJyChfSqh0fthfe4EW3n6-HCc0Ud292WnLqdZBNMI-oN9PHQWq3H4h1vJz2v7KN_bXZ8J72tQgqkhcPR6R5A-xztJC7p0p8vbrt3xoqMndzGt5DvXmaHffXvWRqS8MyyH_eqN_4= 118 | sn://wg?eJxNzjsOgkAUQNEJiYVrUYf3nsMMTCcoQYmiMaKUAvEXjcZP_HRsyti4AXdkJ6XlvdUxGGNo2xxRcEfx16datiKOkgMns0l1kiC1UAAaEbStZK5F3sy0oPJnDmRapjmYSK9WeFJe-Ejb8W6xGS89V7SwN-haidvPtkESUzRSp2N3vZmKd7qbRV7NR__W6ftOfl-HFFgmjifnRwC9S7y3cEXX4WJ5378LVmHs7La_Rom9zo-Hxp_Y1mTBsyh-Okw3MA== 119 | sn://wg?eJxNzrsOgjAUANAG49eopfdaWtpNUIISXzGijALxFY3GR3wMJvyRg4OLH-ZmR9czHYsQAq5LAThVLlXPR8mARAqCMop2HasomNBcMqYBmHalyDXP65nmaDxTLNMizZkN-G5ER-lH97QZb-fr0cL3eAM6vbaTeN1sEyYx9ofyeGiv1hP-SbfTvl8JILi2uoHKb6sIQ8eG0fh0D1nnHO8cWOJlMF_cdp-ClAk5ec2vZbaX2WFf-y-bk3oVxQ8l_Tca 120 | sn://wg?eJxVzjkOgkAUgOGJiYVnUYf3nsMMTCcoQYlbjKilQNwiwbjEpeNGVsbGC3gjO2mt_uSr_hJjDC2LIwpuF7Efn0ohijhKDpyMBtVIgtRCAWhE0JaSiRZJI9aCCo9tiLWMEjCQXs3gqNzgHrXCdLkdr1xHNLHb75hzpxfv_HlIg5E6Hjqb7VS8o3Q2cKseetd2z7OT2yYg3zRwPDndfeiew8zENV2Gy9Ute-eszNjJaX1Lxe5lcdjX_55BkwnPPP8B9Jw39g== 121 | sn://wg?eJxNzrsKwjAUANBQ8WvUNPeaJk02Wy3V4gux2tGm-EJRfOBjEPpPIi5-mJsdXc90LEIIuC4F4FQpCq9HqQCJFARlFO06VlEwoblkTAMw7UqRaZ7VjeZYuFHMaJFmzAZ8N6Kj9KN72oy38_Vo4Xu8AZ1e20m8rtmESYz9oTwe2qv1hH_S7bTvVwIIrq1uoLLbKsLQsWE0Pt1D1jnHOweWeBnMF7fdJydlQk5e82sV28vssK_9l4V21TPPfyUyNxg= 122 | sn://wg?eJxVzjkOgkAUANCJiYVnUYf_P8MMTCcoQYlbjKilQNyi0bjEpeNOxthwAW9kJ63tq16JMYa2zREFdxyO5vNTKUQRR8mBk2FSjSRILRSARgRtK5lqkZqJFlR44kCiZZyCgfRuhCflhY-4Ge0Wm9HSc0UDO722NXO7yTaYRdQfqtOxvd5MRB7vpn2v6qN_a3V9J72vQwosA0fj8yOAziXaW7ii62CxvO_zjJUZO7vNb6noXufHQ_3vLDRZ8MqyH_PUN_Q= 123 | sn://wg?eJxVzj0PwUAYAOAL8Wtwvfd1vWtv09KUpj4iilHbtAghWkEHSX-SxGDxw2y6Wp_pqRFCwDAoAKemoMCfj3olEikIyihqHWyhYEJxyZgCYMqQIlY87kSKY-WRySIlwphpgO-ul0nbK8JecEh2s9S2eBeGo4G-svxo764CHE9ldh5sdwv-CQ_Lsd10wLn1fceM71sPXV2D2TwvXDa8BEcdNnidJOn9-ClJg5Dc6n1rVfe6Pp_af2dQhvkqyx99wjdw 124 | sn://wg?eJxVzsluglAUANAXki76LbWPey9vgLdjkKBEbWOkdVkgUIxG4xCHHR_Vpht_wD9yV7Zuz-pYjDF0XY4ouOdycn5uz51o4qg4cLId6pECZYQGMIhgXK1KI0qnMII6LzwojMpLsJH-_HSnw_SSR9mqWkzrMBA-DscDOQ9GxTKZZzR517vtoFl8iGu--pyELzHGp_4o9spzk1IibZzO9pcEhodsLfGbjm9VfV5fW_bE2D6I7lbXPX5tN68PZ2lIwm_b_gP0lDf2 125 | sn://wg?eJxNzjkOgkAUANCJiYVnUYf_v8MMTCcoQYlbjKilQNwiwbjEpeNGVsbGC3gjOyltX_VKjDG0LI4ouC25eHwqBSjiKDlwMhpUIwlSCwWgEUFbSiZaJI1YCyo8tiHWMkrAQHo1g6Nyg3vUCtPldrxyHdHEbr9jzp1evPPnIQ1G6njobLZT8Y7S2cCteuhd2z3PTm6bgHzTwPHkdPehew4zE9d0GS5Xt-ydszJjJ6f1LRXby-Kwr_-XQZMJzzz_AZISN4Y= 126 | sn://wg?eJxVzrsOgjAUANBG49eopfdSWtoNUIISXzGijgLBRzQY1PgYTPgnBxc_zE1W1zOdGiEEbJsCcKoUBfP1rFcikYKgjKJhYgsFE5pLxjQA07YUqeapmWiOlSeKJVrEKTMA3054kl74iDvRIdtN157LHegPe9bSHST7YBnhaCJPRW-7m_NPfFiMvKYP_q078FV634YYWAZMZ-dHwPqXKLdgg9dxtr7nn5I0CDm7nW-t6l5XxbH9d-baVq-y_AGBojd6 127 | sn://wg?eJxVzjkOgkAUANCJiYVnUYf_v8MMTCcoQYlbjKilQNwiwbjEpeNKFsbGC3gjO2ltX_VKjDG0LI4ouC05qsenUogijpIDJ6NBNZIgtVAAGhG0pWSiRdKItaDCYxtiLaMEDKRXMzgqN7hHrTBdbscr1xFN7PY75tzpxTt_HtJgpI6HzmY7Fe8onQ3cqofetd3z7OS2Ccg3DRxPTncfuucwM3FNl-FydcveOSszdnJa31LRvSwO-_rfmTSZ8MzzH_MAN_I= 128 | sn://wg?eJxNzssOwUAUANBJxddgOveazmvXlqY0lIhiqW28QohHPBaS_pOFjQ-z06XtWR2LEAJKUQBOtabwflZKkEhBUEbRbmIdBROGS8YMADNKitzwvJkZjqVnmmVGpDmzAd9udJJ-9EhbyW6xGS19j7vQ7XecmdfLtuEswXgoT8fOejPhn3Q3jf1aAMGt3Qt0fl9HGDo2jMbnR8i6l2TvwAqvg8Xyvv8UpErI2Wt9rXJ7nR8Pjf-yMkq_iuIHJrQ3HA== 129 | sn://wg?eJxNzjkOgkAUgOGJiYVnUYf3nsMMTCcoQYlbjKilQNwiwbjEpeNGVsbGC3gjOykt_7_6SowxtCyOKLgt-eNTKVoRR8mBk9GgGkmQWigAjQjaUjLRImnEWlDxYxtiLaMEDKRXMzgqN7hHrTBdbscr1xFN7PY75tzpxTt_HtJgpI6HzmY7Fe8onQ3cqofetd3z7OS2Ccg3DRxPTncfuucwM3FNl-FydcveOSszdnJa31KBvSwO-_qfGDSZ8MzzHzN2Nx4= 130 | sn://wg?eJxNzrsOgjAUgOFG49OopedYWugmIEGJtxhRR4GAGA0GNV4GE97IwcHFB3OT0fH_p69GCAHDoACcmoI-H_WqJVIQlFHUOthCwYTikjEFwJQhRax43IkUx-pHJouUCGOmAb67_lHa_j10gn2ynaW2xbswGPX1lTWMdt4qwPFUHot-tl3wT7hfju2mC-61N3TN-Jb56OkazOanu8cG5yDXYYOXSZLe8k9JGoScLOdbq7CXdXFo_4krkvkqyx_Crzak 131 | sn://wg?eJxVzjkOgkAUgOGJiYVnUYf3nsMMTCcoQYlbjKilQNwiwbjEpeNINsbGC3gjO2mt_uSr_hJjDC2LIwpuqyKPT6UQRRwlB05Gg2okQWqhADQiaEvJRIukEWtBhcc2xFpGCRhIr2ZwVG5wj1phutyOV64jmtjtd8y504t3_jykwUgdD53NdireUTobuFUPvWu759nJbROQbxo4npzuPnTPYWbimi7D5eqWvXNWZuzktL6lYveyOOzrf8-oyYRnnv8A7mQ35g== 132 | sn://wg?eJxVzrsOgjAUANBG49eopfdaWtpNUIISXzGijgLxFY1GMIiDCf_k4MKHucnqeqZTI4SAZVEATpWiIN-veiUSKQjKKBodbKFgQnPJmAZg2pIi1jzuRJpj5ZFikRZhzAzAT9dPpOM_w15w3h7nO8fmXRiOB-baHkUnbx3gZCaT2-BwXPIyPK8mTtMF99EfuSrODz56pgHzRfr02PAeXEzYYzbd7vJLWZAGIand-9aqbra5Xdt_Z64t9S6KH4SyN4I= 133 | sn://wg?eJxVzrsOgjAUANBG49eopfdSWugmIEGJojGijAIBNRqNj_gYTPgnY1z8MDdZXc90aoQQME0KwKklKeqvR70SiRQEZRQ1HVsomFBcMqYAmDKlyBTP9FRxrDy1WKpEkjEN8N0JjtIJ7okbbfP1pHBs3oH-sGfE9iDd-HGE4VgeD73VesY_yXYeOk0PvGt34FnZbRWgb2gwmZ7uPuufo50BS7yM8uK2-5SkQcjJdr-1qntZHPbtv7NQpvUsyx-CWDd8 134 | sn://wg?eJxVzrsOgjAUANAG49eopfdaWtpNUIISXzGijFLiKxqNj_gYTPgnBx38MDdZXc90LEIIuC4F4FQpCvz9KBUikYKgjKJdxyoKJjSXjGkApl0pMs2zutEcCzeKGS3SjNmAr0Z0lH50T5vxdr4eLXyPN6DTazuJ1zWbMImxP5THQ3u1nvBPup32_UoAwbXVDVR2W0UYOjaMxqd7yDrneOfAEi-D-eK2--SkTMjJa36tonuZHfa1v7PSrnrm-Q-GMDeG 135 | sn://wg?eJxVzrsOgjAUANBG49eopfdSWtpNQIISXzGijAIRNRqNj_gYTPgnBx38MDdZXc90KoQQsG0KwKlSFMz3o1qKRAqCMoqGiQ0UTGguGdMATNtSZJpnZqo5lp4qlmqRZMwAfLXCo3TDe-JF28V6nLsOb0G337Fip5dugjjCwUgeD53Veso_yXY2cOs--Nd2z1fZbRViYBkwnpzuAeueo50FS7wMF_lt9ylIjZCT430rZfcyP-ybf2elbfUsih-FbDeE 136 | sn://wg?eJxVzrsOgjAUANBG49eopfdaWugmIEGJrxhRR4GAGA0GNT4GE_7IwcHFD3OT1fVMp0YIAcOgAJyagiI8H_VKJFIQlFHUOthCwYTikjEFwJQhRax43IkUx8ojk0VKhDHTAN9d_yht_x46wT7ZzlLb4l0YjPr6yhpGO28V4Hgqj0U_2y74J9wvx3bTBffaG7pmfMt89HQNZvPT3WODc5DrsMHLJElv-ackDUJOlvOtVd3Luji0_85VynyV5Q97ejdq 137 | sn://wg?eJxNzrsKwjAUANBQ8WvUNPeaJk02Wy3V4gux2tGm-EJRfOBjEPpPIi5-mJsdXc90LEIIuC4F4FQpyl-PUgESKQjKKNp1rKJgQnPJmAZg2pUi0zyrG82xcKOY0SLNmA34bkRH6Uf3tBlv5-vRwvd4Azq9tpN4XbMJkxj7Q3k8tFfrCf-k22nfrwQQXFvdQGW3VYShY8NofLqHrHOOdw4s8TKYL267T07KhJy85tcqtpfZYV_7Lwvtqmee_wAnezce 138 | sn://wg?eJxVzrsKwjAUANBQ8WvUNPeaJk02Wy3V4gux2tGm-EJRfOBjEPpPIi5-mJtdXc90LEIIuC4F4FQpivB6lAqRSEFQRtGuYxUFE5pLxjQA064UmeZZ3WiOhRvFjBZpxmzAdyM6Sj-6p814O1-PFr7HG9DptZ3E65pNmMTYH8rjob1aT_gn3U77fiWA4NrqBiq7rSIMHRtG49M9ZJ1zvHNgiZfBfHHbfXJSJuTkNb9W0b3MDvva31loVz3z_AeCZDd8 139 | sn://wg?eJxNzssOwUAUANAJ8TWYzr2mM-3stDSlqUdEsdQ2LUKIVtCFpP8kYuPD7HRpe1anRggBw6AAnJqCitejXoFECoIyiloHWyiYUFwypgCYMqSIFY87keJYeWSySIkwZhrgu-tl0vaKsBcckt0stS3eheFooK8sP9q7qwDHU5mdB9vdgn_Cw3JsNx1wbn3fMeP71kNX12A2zwuXDS_BUYcNXidJej9-StIgJLd631q1va7Pp_Z_WSjDfJblDyasNxw= 140 | sn://wg?eJxNzrsOgjAUANBG49eopfdS2tKNhwQlvmJEHQUCajQaH_ExmPBPDi5-mJuMrmc6NUIIKEUBOLUVNd_PegUSKQjKKBomtlAwoblkTAMwraTINM_MVHOsPLVZqkWSMQPw7UQn6UWPxI93-WZSeC53oDfoWgu3n27DRYzDsTwdu-vNjH-S3XzoNQMIbp1-YGf3dYShZcBken6ErHeJ9xas8DrKi_v-U5IGIWfX_9aq7XV5PLT_y0or-1WWPydzNx4= 141 | sn://wg?eJxNzjkOgkAUANCJiYVnUYf_v8MMTCcoQYlbjKilQNwiwbjEpeNKFsbGC3gjOyltX_VKjDG0LI4ouG1z-fhUClDEUXLgZDSoRhKkFgpAI4K2lEy0SBqxFlR4bEOsZZSAgfRqBkflBveoFabL7XjlOqKJ3X7HnDu9eOfPQxqM1PHQ2Wyn4h2ls4Fb9dC7tnuendw2AfmmgePJ6e5D9xxmJq7pMlyubtk7Z2XGTk7rWyq2l8VhX_8vkyYTnnn-A5d9N5Q= 142 | sn://wg?eJxNzjkOgkAUANCJiYVnUYf_v8MMTCcoQYlbjKilQNwiwbjEpeNOxth4AW9kJ6Xtq16JMYaWxREFtxWnx6dSgCKOkgMno0E1kiC1UAAaEbSlZKJF0oi1oMJjG2ItowQMpFczOCo3uEetMF1uxyvXEU3s9jvm3OnFO38e0mCkjofOZjsV7yidDdyqh9613fPs5LYJyDcNHE9Odx-65zAzcU2X4XJ1y945KzN2clrfUrG9LA77-n9ZaDLhmec_lF03jA== 143 | sn://wg?eJxNzrsOgjAUANBG49eopfdSWugmIEGJojGijAIBNRqNj_gYTPgkEwcXP8xNRtcznRohBEyTAnBqSao_H_UKJFIQlFHUdGyhYEJxyZgCYMqUIlM801PFsfLUYqkSScY0wHcnOEonuCdutM3Xk8KxeQf6w54R24N048cRhmN5PPRW6xn_JNt56DQ98K7dgWdlt1WAvqHBZHq6-6x_jnYGLPEyyovb7lOSBiEn2_3Wqu1lcdi3_8ugTOtVlj8hZTcO 144 | sn://wg?eJxVzjkOgkAUANAJiYVnUYf_v8MMTCcoQYmiMaKUAnGLRuMSl45LGRsv4I3spLV91TMYY2jbHFFwR3K0n59qKYo4Sg6czCbVSYLUQgFoRNC2krkWeTPTgkrPHMi0THMwkV6t8KS88JG2491iM156rmhhb9C1ErefbYMkpmikTsfuejMV73Q3i7yaj_6t0_ed_L4OKbBMHE_OjwB6l3hv4Yquw8Xyvn8XrMLY2W1_jbJ7nR8Pjb-z1GTBsyh-9tY3_A== 145 | sn://wg?eJxVzrmugkAUANCJiYXfog73XoYZZjrBR1DiFiNqKRC3PKNxiUvHTxkt-IH3R6-T1vZUp8IYQ9fliIJrzdF-_9VKUcRRcuBk2dQgCdIIBWAQwbhKZkZkdmoElZ5qSI1MMrCQXq3opPzokbTj3XI7XvmeaGG333HmXi_9DecxDUbqdOxstlNRJLvZwK8HGNx-eoHO7puIQsfC8eT8CKF7ifcOruk6XK7u-yJnVcbOXvu_Unavi-Oh-XXWhhx45vkH96g3_g== 146 | sn://wg?eJxNzrsOgjAUANAG49eopfdaWtpNUIISXzGijALxFY3GR3wMJvyRg4OLH-ZmR9czHYsQAq5LAThViorno2RAIgVBGUW7jlUUTGguGdMATLtS5Jrn9UxzNJ4plmmR5swGfDeio_Sje9qMt_P1aOF7vAGdXttJvG62CZMY-0N5PLRX6wn_pNtp368EEFxb3UDlt1WEoWPDaHy6h6xzjncOLPEymC9uu09ByoScvObXMtvL7LCv_ZfNSb2K4gckezcW 147 | sn://wg?eJxNzskOwVAUANAXiYVvweu91xvat9PSlMYUUSy1jSmEGGLY9aOIjR_wR3a6tD2rU2CMoW1zRMEdh-PjU8pBE0fFgZNVowopUEZoAIMIxtYqNSKtJUZQ7okDiVFxChbSqx4etRfe40a0na-HC88VdWx3W3LqdpJNMI2oN9DHQ2u1Hot3vJ30vLKP_rXZ8Z30tgopkBYOR6d7AO1ztJO4pEt_vrjt3hkrMnZyG99Cvr3MDvvqf1kakvDMsh-V7TeQ 148 | sn://wg?eJxVzssOwUAUANAJ8TWY3ntNZ9rZaWlK4xVRLLVNixDiEY-FpH9kYWHjw-x0a3tWp8QYQ8viiILbiiM8H-VCFHGUHDgZDaqRBKmFAtCIoC0lEy2SRqwFFR7bEGsZJWAgvZvBUbnBPWqF23Q9zlxHNLHb75hzpxdv_HlIg5E6Hjqr9VR8ou1s4FY99K7tnmcnt1VAvmngeHK6-9A9hzsTl3QZptlt98lZhbGT0_qWiu5lcdjX_85Fyn7l-Q96ujdo 149 | sn://wg?eJxNzjkOgkAUANCJiYVnUYf_v8MMTCcoQYlbjKilQNwiwbjEpeNSRgsv4I3spLR91SsxxtCyOKLgtsXF61MpQBFHyYGT0aAaSZBaKACNCNpSMtEiacRaUOGxDbGWUQIG0rMZHJUb3KNWmC6345XriCZ2-x1z7vTinT8PaTBSx0Nns52Kd5TOBm7VQ-_a7nl2ctsE5JsGjienuw_dc5iZuKbLcLm6Ze-clRk7Oa1vqdheFod9_b9sazLhkec_mn83nA== 150 | sn://wg?eJxVzjkOgkAUANCJiYVnUYf_P8MMTCcoQYlbjKilQNyi0bjEpeNOxthwAW9kJ63tq16JMYa2zREFd2xO5vNTKUQRR8mBk2FSjSRILRSARgRtK5lqkZqJFlR44kCiZZyCgfRuhCflhY-4Ge0Wm9HSc0UDO722NXO7yTaYRdQfqtOxvd5MRB7vpn2v6qN_a3V9J72vQwosA0fj8yOAziXaW7ii62CxvO_zjJUZO7vNb6noXufHQ_3vLDRZ8MqyH_PQN_Q= 151 | sn://wg?eJxVzrkKwkAUQNEh4teok3nP2TKdiYZocEOMpjQJbiiKCy6FkH9SsPHD7ExrdeFU1yKEgNYUgFOniH49SoUopCApo2jXsYqSScMVYwaAGa1kZnhWTw3HwlOHpUYmGbMB343wqLzwnjSj7Xw9Wngub0Cn1xax2003QRxhf6iOh_ZqPeGfZDvtexUf_Gur6zvZbRViIGwYjU_3gHXO0U7AEi-D-eK2--SkTMjJbX6tYvcyO-xrf8_CaOeZ5z-FbjeE 152 | sn://wg?eJxVzjkOgkAUANCJiYVnUYf_P8MMTCcoQYlbjKilQNyi0bjEpeNMJsaGC3gjO2ltX_VKjDG0bY4ouCM52s9PpRBFHCUHToZJNZIgtVAAGhG0rWSqRWomWlDhiQOJlnEKBtK7EZ6UFz7iZrRbbEZLzxUN7PTa1sztJttgFlF_qE7H9nozEXm8m_a9qo_-rdX1nfS-DimwDByNz48AOpdob-GKroPF8r7PM1Zm7Ow2v6Wie50fD_W_s6nJgleW_QD0ijf2 153 | sn://wg?eJxVzs0OwUAUQOEJ8TSYzr2mM-3stDSlqZ-IYqltWoQQraALSd9JxMaD2enW6iTf6tQIIWAYFIBTswp_PeqVSKQgKKOodbCFggnFJWMKgClDiljxuBMpjpVHJouUCGOmAb67XiZtrwh7wSHZzVLb4l0Yjgb6yvKjvbsKcDyV2Xmw3S34Jzwsx3bTAefW9x0zvm89dHUNZvO8cNnwEhx12OB1kqT346ckDUJyq_etVbvX9fnU_nsWyjCfZfkDgyA3fg== 154 | sn://wg?eJxNzjkOgkAUANCJiYVnUYf_v8MMTCcoQYlbjKilQNwiwbjEpeNSauMFvJGdlLaveiXGGFoWRxTcllw9P5UCFHGUHDgZDaqRBKmFAtCIoC0lEy2SRqwFFR7bEGsZJWAgvZrBUbnBPWqF6XI7XrmOaGK33zHnTi_e-fOQBiN1PHQ226l4R-ls4FY99K7tnmcnt01AvmngeHK6-9A9h5mJa7oMl6tb9s5ZmbGT0_qWiu1lcdjX_8tKkwmPPP8BmbY3mg== 155 | sn://wg?eJxVzstugkAUANAJSRf9ltrh3ss8YHaAEpSobYy0LssQrUajEYyPHR_Vpht_wD9yV7Zuz-o4jDH0fY4oeKA5eT-351Y0cVQcOLkedUiBMkIDGEQwvlalEaVnjaDWbQDWqKIEF-kvzCodZ5eim2_mq8kijkSIg1FfzqKhXaeznMbvutr3l6sPcS02n-P4JcHk1BsmQXleZpRKFyfT-pLC4JBvJX7T8W2-OG-vDXtirI66d6ftHr_2u9eHszQk4bdp_gHzyDf0 156 | sn://wg?eJxVzssOwUAUANAJ8TWYzr2m89ppaUrjFVEstU2LEOIRj4WkvyQWNj7MTre2Z3VKhBBQigJwqjUF9XyUC5FIQVBG0WpgDQUThkvGDAAzSorE8KQRG46Fx5rFRkQJswDfzeAo3eAetcJtuh5nrsOb0O137LnTizf-PMTBSB4PndV6yj_RdjZwqx5413bP08ltFaBvWzCenO4-657DnQ1LvAzT7Lb75KRCyMlpfUtF97I47Ot_ZzRKv_L8B4PyN4A= 157 | sn://wg?eJxVzjkOgkAUANCJiYVnUYf_P8MMTCcoQYlbjKilQNyi0bjEpeNSRgsu4I3spLV91SsxxtC2OaLgjs3JfH8qhSjiKDlwMkyqkQSphQLQiKBtJVMtUjPRggpPHEi0jFMwkF6N8KS88BE3o91iM1p6rmhgp9e2Zm432QaziPpDdTq215uJyOPdtO9VffRvra7vpPd1SIFl4Gh8fgTQuUR7C1d0HSyW932esTJjZ7f5LRXd6_x4qP-dHU0WPLPsB_ekN_4= 158 | sn://wg?eJxVzjkOgkAUANCJiYVnUYf_v8MMTCcoQYlbjKilQNwiwbjEpeNOxth4AW9kJ63tq16JMYaWxREFty1O8PhUClHEUXLgZDSoRhKkFgpAI4K2lEy0SBqxFlR4bEOsZZSAgfRqBkflBveoFabL7XjlOqKJ3X7HnDu9eOfPQxqM1PHQ2Wyn4h2ls4Fb9dC7tnuendw2AfmmgePJ6e5D9xxmJq7pMlyubtk7Z2XGTk7rWyq6l8VhX_87C00mPPP8B_F-N-4= 159 | sn://wg?eJxNzksOwVAUANAXiYG14PXe633aN9PSlIYSUQy1jV8I8YnPrJsSExuwIzMdmp7RKTHG0LY5ouCOw-XrUylAE0fFgZPVoBopUEZoAIMIxtYqMyJrpEZQ4akDqVFJBhbSqxmetBc-kla8W2xGS88VTez2O3Lm9tJtMIspGurTsbPeTMQ72U0jr-qjf2v3fCe7r0MKpIWj8fkRQPcS7yWu6DpYLO_7d87KjJ3d1rdUbK_z46H-X7YNSXjm-Q-bSjee 160 | sn://wg?eJxVzssKgkAUgOGh6Gmqcc5pnNHZpSWWdCOyWqaiJUnRBbNF4DsFtenB2uW21Q_f6q8RQsAwKACnZhX5etQrkUhBUEZR62ALBROKS8YUAFOGFJHiUSdUHCsPTRYqEURMA3x3vbO0vXvQ87M4nSe2xbswHA_0tTUK9-7ax8lMnk-DXbrknyBbTeymA86tP3LMqNh56OoazBeXu8uGV_-gwxbzaZwUh09JGoRcrN63Vu3mm9Ox_fcslWE-y_IHhi43hg== 161 | sn://wg?eJxNzjkOgkAUANAJiYVnUYf_v8MMTCcoQYmiMaKUAnGLRuMSl45LGRsv4I3spLR91TMYY2jbHFFwx-H4_FRLUMRRcuBkNqlOEqQWCkAjgraVzLXIm5kWVHrmQKZlmoOJ9GqFJ-WFj7Qd7xab8dJzRQt7g66VuP1sGyQxRSN1OnbXm6l4p7tZ5NV89G-dvu_k93VIgWXieHJ-BNC7xHsLV3QdLpb3_btgFcbObvtrlNvr_Hho_JelJgueRfEDlrA3kg== 162 | sn://wg?eJxVzjkOgkAUANCJiYVnUYf_v8MMTCcoQYlbjKilQNwiwbjEpeNKFsbGC3gjO2ltX_VKjDG0LI4ouG1ztB6fSiGKOEoOnIwG1UiC1EIBaETQlpKJFkkj1oIKj22ItYwSMJBezeCo3OAetcJ0uR2vXEc0sdvvmHOnF-_8eUiDkToeOpvtVLyjdDZwqx5613bPs5PbJiDfNHA8Od196J7DzMQ1XYbL1S1756zM2MlpfUtF97I47Ot_Z9JkwjPPf_YqN_o= 163 | sn://wg?eJxVzrsOgjAUANBG49eopfdS2tINUIISXzGijgLBRzQY1PgYTPgnBxc_zE1W1zOdGiEElKIAnNqKovl61iuRSEFQRtEwsYWCCc0lYxqAaSVFqnlqJppj5YnNEi3ilBmAbyc8SS98xJ3okO2ma8_lDvSHPWvpDpJ9sIxwNJGnorfdzfknPixGXtMH_9Yd-HZ634YYWAZMZ-dHwPqXKLdgg9dxtr7nn5I0CDm7nW-t6l5XxbH9d-Za2a-y_AGBnjd6 164 | sn://wg?eJxVzskOwVAUgOEbiYVnwe05xx3au9PSlMYUUSy1jSmEGGLY9aGIjRfwRna6tfqTb_UXGGNo2xxRcCePfnxKuWjiqDhwsmpUIQXKCA1gEMHYWqVGpLXECMo9cSAxKk7BQnrVw6P2wnvciLbz9XDhuaKO7W5LTt1OsgmmEfUG-nhordZj8Y63k55X9tG_Nju-k95WIQXSwuHodA-gfY52Epd06c8Xt907Y0XGTm7jW8h3L7PDvvr3LA1JeGbZD_bkN_w= 165 | sn://wg?eJxNzjkOgkAUgOGJiYVnUYf3HsMMTCcoQYlbjKilQNyi0bjEpeNMJsaGC3gjOykt_7_6SowxtG2OKLhj8-enUrQijpIDJ8OkGkmQWigAjQjaVjLVIjUTLaj4iQOJlnEKBtK7EZ6UFz7iZrRbbEZLzxUN7PTa1sztJttgFlF_qE7H9nozEXm8m_a9qo_-rdX1nfS-DimwDByNz48AOpdob-GKroPF8r7PM1Zm7Ow2v6UCe50fD_U_sanJgleW_QA3SDco 166 | sn://wg?eJxNzrsOgjAUgOFG49OopedY2tJNUIISRGNEHQXiLRqNlyAMJryTg4sP5iaj4_9PX40QAkpRAE4tSd_PetUSKQjKKBodbKFgQnPJmAZgWkmRap52Es2x-onFEi3ilBmA765_lY5fxL3ouN5PN47NuzAcDcylHSQHbxlhOJHXy2C3n_NPfFyETtMF99EPXCvNdz56pgHT2a3w2PAenUzYYjZeb_LTpyQNQm5271ursNnqcm7_iZVW1qssf8lzNrY= 167 | sn://wg?eJxVjs0OwUAYADfE06Dd77PdbfempSlN_UQUR23TIoRoBT1I-kri4OLB3OzVaSZzmhohBExTA2CapcCfj7oqApVqVEO9gy3klEsmKJUAVJqCJ5IlnVgyVD22aCx5lFAd8N31c-H4ZdQLD-luljk268JwNDBWdhDvvVWI46nIz4PtbsE-0WE5dpouuLd-4FrJfeujZ-gwmxelR4eX8GjABq-TNLsfPxVpEFLYvW9N7V7X51P77xmlab2q6geBoDd6 168 | sn://wg?eJxNzjkOgkAUANAJiYVnUYf_v8MMTCcoQYmiMaKUAnGLRuMSl45LGRsv4I3spLR91TMYY2jbHFFwx-Hi-amWoIij5MDJbFKdJEgtFIBGBG0rmWuRNzMtqPTMgUzLNAcT6dUKT8oLH2k73i0246Xnihb2Bl0rcfvZNkhiikbqdOyuN1PxTnezyKv56N86fd_J7-uQAsvE8eT8CKB3ifcWrug6XCzv-3fBKoyd3fbXKLfX-fHQ-C9LTRY8i-IHmP83mA== 169 | sn://wg?eJxVzssOwUAUgOGJxMKzYHrOMZ3pzE5LUxq3iGKpbdxCiEtcdn0pYeEFvJGdbu3-fKu_wBhDx-GIgmvNUb4-pVwU5cmBk1WjCkmQRigAgwjGUTI1Iq0lRlDuiYbEyDgFC-lZD4_KC-9xI9rO18OF54o6trste-p2kk0wjag3UMdDa7Uei3e8nfS8so_-tdnxdXpbhRTYFg5Hp3sA7XO0s3FJl_58cdu9M1Zk7OQ2voV89zI77Kt_z9qQDY8s-wH5-jgE 170 | sn://wg?eJxNzssOwUAUANBJxddgOveazmvXlqY0lIhiqW28QohHPBaS_pOFjQ-z06XtWR2LEAJKUQBOtabO-1kpQSIFQRlFu4l1FEwYLhkzAMwoKXLD82ZmOJaeaZYZkebMBny70Un60SNtJbvFZrT0Pe5Ct99xZl4v24azBOOhPB07682Ef9LdNPZrAQS3di_Q-X0dYejYMBqfHyHrXpK9Ayu8DhbL-_5TkCohZ6_1tcrtdX48NP7Lyij9KoofKcA3JA== 171 | sn://wg?eJxNzskOwVAUANAXiYVvweu91xvat9PSlMYUUSy1jSmEGGLY9ZNsxMYP-CM7Xdqe1SkwxtC2OaLgjs3l41PKQRNHxYGTVaMKKVBGaACDCMbWKjUirSVGUO6JA4lRcQoW0qseHrUX3uNGtJ2vhwvPFXVsd1ty6naSTTCNqDfQx0NrtR6Ld7yd9Lyyj_612fGd9LYKKZAWDkenewDtc7STuKRLf7647d4ZKzJ2chvfQr69zA776n8ZDUl4ZtkPlSw3jg== 172 | sn://wg?eJxNzjsOgkAUQNEJiYVrUYf3nsMMTCcoQYmiMaKUAvEXjcZP_HRsyti4AXdkJ6XlvdUxGGNo2xxRcMfmz0-1bEUcJQdOZpPqJEFqoQA0ImhbyVyLvJlpQeXPHMi0THMwkV6t8KS88JG2491iM156rmhhb9C1ErefbYMkpmikTsfuejMV73Q3i7yaj_6t0_ed_L4OKbBMHE_OjwB6l3hv4Yquw8Xyvn8XrMLY2W1_jRJ7nR8PjT-x1GTBsyh-OY43Lg== 173 | sn://wg?eJxNzrsOgjAUANBG49eopfdaWugmIEGJrxhRR4GAGA0GNT4GE_7IwcHFD3OT0fVMp0YIAcOgAJyaksLzUa9AIgVBGUWtgy0UTCguGVMATBlSxIrHnUhxrDwyWaREGDMN8N31j9L276ET7JPtLLUt3oXBqK-vrGG081YBjqfyWPSz7YJ_wv1ybDddcK-9oWvGt8xHT9dgNj_dPTY4B7kOG7xMkvSWf0rSIORkOd9atb2si0P7v1ydzFdZ_gAfHjcI 174 | sn://wg?eJxVzjkOgkAUANCJiYVnUYf_v8MMTCcoQYlbjKilQNwiwbjEpeNOxth4AW9kJ63tq16JMYaWxREFtxUn8fhUClHEUXLgZDSoRhKkFgpAI4K2lEy0SBqxFlR4bEOsZZSAgfRqBkflBveoFabL7XjlOqKJ3X7HnDu9eOfPQxqM1PHQ2Wyn4h2ls4Fb9dC7tnuendw2AfmmgePJ6e5D9xxmJq7pMlyubtk7Z2XGTk7rWyq6l8VhX_87C00mPPP8B_PKN_Q= 175 | sn://wg?eJxVzrsOgjAUANAG49eopfdaWtpNUIISXzGijFLiKxqNj_gYTPgl4-Dih7nJ6nqmYxFCwHUpAKdKUFDPR6kQiRQEZRTtOlZRMKG5ZEwDMO1KkWme1Y3mWLhRzGiRZswGfDeio_Sje9qMt_P1aOF7vAGdXttJvK7ZhEmM_aE8Htqr9YR_0u2071cCCK6tbqCy2yrC0LFhND7dQ9Y5xzsHlngZzBe33ScnZUJOXvNrFd3L7LCv_Z1Ru-qV5z-CWDd8 176 | sn://wg?eJxNzrsOgjAUANBG49eopfdSWugmIEGJojGijAIBNRqNj_gYTPgnTVz8MDcZXc90aoQQME0KwKklqP561CuQSEFQRlHTsYWCCcUlYwqAKVOKTPFMTxXHylOLpUokGdMA353gKJ3gnrjRNl9PCsfmHegPe0ZsD9KNH0cYjuXx0FutZ_yTbOeh0_TAu3YHnpXdVgH6hgaT6enus_452hmwxMsoL267T0kahJxs91urtpfFYd_-LxvKtJ5l-QMjojcU 177 | sn://wg?eJxNzssOwUAUANAJ8TWYzr2m89ppaUrjFVEstU2LEOIRj4WknySxsPFhdrq0PatTIoSAUhSAU62pej7KBUikICijaDWwhoIJwyVjBoAZJUVieNKIDcfCY81iI6KEWYDvZnCUbnCPWuE2XY8z1-FN6PY79tzpxRt_HuJgJI-Hzmo95Z9oOxu4VQ-8a7vn6eS2CtC3LRhPTnefdc_hzoYlXoZpdtt9clIh5OS0vqVie1kc9vX_MhilX3n-AybCNxw= 178 | sn://wg?eJxNzrsOgjAUANAG49eopfdaWtpNUIISXzGijFLiKxqNj_gYTPgnBx38MDcZXc90LEIIuC4F4FRJKt6PUgESKQjKKNp1rKJgQnPJmAZg2pUi0zyrG82xcKOY0SLNmA34akRH6Uf3tBlv5-vRwvd4Azq9tpN4XbMJkxj7Q3k8tFfrCf-k22nfrwQQXFvdQGW3VYShY8NofLqHrHOOdw4s8TKYL267T07KhJy85tcqtpfZYV_7Lyvtqmee_wAptjck 179 | sn://wg?eJxNzjkOgkAUANCJiYVnUYf_v8MMTCcoQYlbjKilQNwiwbjEpeNGVsbGC3gjOyltX_VKjDG0LI4ouK04Pj6VAhRxlBw4GQ2qkQSphQLQiKAtJRMtkkasBRUe2xBrGSVgIL2awVG5wT1qhelyO165jmhit98x504v3vnzkAYjdTx0NtupeEfpbOBWPfSu7Z5nJ7dNQL5p4HhyuvvQPYeZiWu6DJerW_bOWZmxk9P6lortZXHY1__LoMmEZ57_AJCMN4I= 180 | sn://wg?eJxNzskOwVAUANAXiYVvweu91xvat9PSlMYUUSy1jSmEGGLY9aeEhR_wR3a6tD2rU2CMoW1zRMEdzeXrU8pBE0fFgZNVowopUEZoAIMIxtYqNSKtJUZQ7okDiVFxChbSsx4etRfe40a0na-HC88VdWx3W3LqdpJNMI2oN9DHQ2u1Hot3vJ30vLKP_rXZ8Z30tgopkBYOR6d7AO1ztJO4pEt_vrjt3hkrMnZyG99Cvr3MDvvqf9kxJOGRZT-aezec 181 | sn://wg?eJxNzjkOgkAUANAJiYVnUYf_v8MMTCcoQYmiMaKUAnGLRuMSl45LGRsv4I3spLR91TMYY2jbHFFwx-H4-lRLUMRRcuBkNqlOEqQWCkAjgraVzLXIm5kWVHrmQKZlmoOJ9GqFJ-WFj7Qd7xab8dJzRQt7g66VuP1sGyQxRSN1OnbXm6l4p7tZ5NV89G-dvu_k93VIgWXieHJ-BNC7xHsLV3QdLpb3_btgFcbObvtrlNvr_Hho_JdtTRY8i-IHmDY3lg== 182 | sn://wg?eJxVzskOwVAUANAXiYVvweu91xvat9PSlMYUUSy1jSmEGGLY9aOIjR_wR3a6tT2rU2CMoW1zRMEdxYken1IumjgqDpysGlVIgTJCAxhEMLZWqRFpLTGCck8cSIyKU7CQXvXwqL3wHjei7Xw9XHiuqGO725JTt5NsgmlEvYE-Hlqr9Vi84-2k55V99K_Nju-kt1VIgbRwODrdA2ifo53EJV3688Vt985YkbGT2_gW8u5ldthX_87SkIRnlv0A8jY38A== 183 | sn://wg?eJxVzrsOgjAUANBG49eopfdSWugmIEGJojGijAIBNRqNj_gYTPgl4-Dih7nJ6nqmUyOEgGlSAE4tQUF_PuqVSKQgKKOo6dhCwYTikjEFwJQpRaZ4pqeKY-WpxVIlkoxpgO9OcJROcE_caJuvJ4Vj8w70hz0jtgfpxo8jDMfyeOit1jP-Sbbz0Gl64F27A8_KbqsAfUODyfR091n_HO0MWOJllBe33ackDUJOtvutVd3L4rBv_51RmdarLH99wDdw 184 | sn://wg?eJxVzjkOgkAUANCJiYVnUYf_P8MMTCcoQYlbjKilQNyi0bjEpeNMJsaGC3gjO2ltX_VKjDG0bY4ouCM5quenUogijpIDJ8OkGkmQWigAjQjaVjLVIjUTLajwxIFEyzgFA-ndCE_KCx9xM9otNqOl54oGdnpta-Z2k20wi6g_VKdje72ZiDzeTfte1Uf_1ur6TnpfhxRYBo7G50cAnUu0t3BF18Fied_nGSszdnab31LRvc6Ph_rf2dRkwSvLfvPEN_Q= 185 | sn://wg?eJxNzj0PwUAYAOAL8Wtwvfd1vWtv09KUpj4iilHbtAghWkEHSf-SGCx-mE1H6zM9NUIIGAYF4NSUVD4f9QokUhCUUdQ62ELBhOKSMQXAlCFFrHjciRTHyiOTRUqEMdMA310vk7ZXhL3gkOxmqW3xLgxHA31l-dHeXQU4nsrsPNjuFvwTHpZju-mAc-v7jhnftx66ugazeV64bHgJjjps8DpJ0vvxU5IGIbnV-9aq7XV9PrX_y6gM81WWPyUyNxg= 186 | sn://wg?eJxNzssOwUAUANAJ8TWYzr2mM-3stDSlqUdEsdQ2LUKIVtCFpP8kYuPD7HRpe1anRggBw6AAnJqCytejXoFECoIyiloHWyiYUFwypgCYMqSIFY87keJYeWSySIkwZhrgu-tl0vaKsBcckt0stS3eheFooK8sP9q7qwDHU5mdB9vdgn_Cw3JsNx1wbn3fMeP71kNX12A2zwuXDS_BUYcNXidJej9-StIgJLd631q1va7Pp_Z_WSjDfJblDydvNx4= 187 | sn://wg?eJxNzrsOgjAUANBG49eopfdaWugmIEGJrxhRR4GAGA0GNT4GE_7IwcHFD3OT0fVMp0YIAcOgAJyagvLno16BRAqCMopaB1somFBcMqYAmDKkiBWPO5HiWHlkskiJMGYa4LvrH6Xt30Mn2CfbWWpbvAuDUV9fWcNo560CHE_lsehn2wX_hPvl2G664F57Q9eMb5mPnq7BbH66e2xwDnIdNniZJOkt_5SkQcjJcr61antZF4f2f7k6ma-y_AEgoDcM 188 | sn://wg?eJxVzjkOgkAUANCJiYVnUYf_v8MMTCcoQYlbjKilQNwiwbjEpeNINsbGC3gjO2ltX_VKjDG0LI4ouK04isenUogijpIDJ6NBNZIgtVAAGhG0pWSiRdKItaDCYxtiLaMEDKRXMzgqN7hHrTBdbscr1xFN7PY75tzpxTt_HtJgpI6HzmY7Fe8onQ3cqofetd3z7OS2Ccg3DRxPTncfuucwM3FNl-FydcveOSszdnJa31LRvSwO-_rfGTWZ8MzzH_C2N-w= 189 | sn://wg?eJxVzjkOgkAUANCJiYVnUYf_P8MMTCcoQYlbjKilQNyi0bjEpeNOxthwAW9kJ63tq16JMYa2zREFdxQn8_mpFKKIo-TAyTCpRhKkFgpAI4K2lUy1SM1ECyo8cSDRMk7BQHo3wpPywkfcjHaLzWjpuaKBnV7bmrndZBvMIuoP1enYXm8mIo93075X9dG_tbq-k97XIQWWgaPx-RFA5xLtLVzRdbBY3vd5xsqMnd3mt1R0r_Pjof53FposeGXZD_MEN_I= 190 | sn://wg?eJxVzrsOgjAUANBG49eopfdaWugmKEGJrxhRR4GAEonGRxAHE_7IwcHFD3OT1fVMp0YIAcOgAJyakoJ8PuqVSKQgKKOodbCFggnFJWMKgClDikjxqBMqjpWHJguVCCKmAb673lna3j3o-VmczhPb4l0Yjgf62hqFe3ft42Qmz6fBLl3yT5CtJnbTAefWHzlmVOw8dHUN5ovL3WXDq3_QYYv5NE6Kw6ckDUIuVu9bq7r55nRs_52rlPkqyx-AFjd2 191 | sn://wg?eJxNzrsOgjAUANBG49eopfdS2tJNQIISXzGijAIRNRqNj_gYTPgmHVz8MDcZXc90KoQQUIoCcGoLqp6PagkSKQjKKBomNlAwoblkTAMwraTINM_MVHMsPbVZqkWSMQPw3QqP0g3viRdtF-tx7jq8Bd1-x4qdXroJ4ggHI3k8dFbrKf8k29nArfvgX9s9385uqxADy4Dx5HQPWPcc7SxY4mW4yG-7T0FqhJwc71spt5f5Yd_8L5ta2a-i-AEl7zca 192 | sn://wg?eJxVzjkOgkAUgOGJiYVnUYf3nsMMTCcoQYlbjKilQNwiwbjEpeNSauMFvJGdtFZ_8lV_iTGGlsURBbeLqOenUogijpIDJ6NBNZIgtVAAGhG0pWSiRdKItaDCYxtiLaMEDKRXMzgqN7hHrTBdbscr1xFN7PY75tzpxTt_HtJgpI6HzmY7Fe8onQ3cqofetd3z7OS2Ccg3DRxPTncfuucwM3FNl-FydcveOSszdnJa31Kxe1kc9vW_Z6XJhEee_wD4bDgA 193 | sn://wg?eJxVzssKgkAUgOGh6Gmqcc5pnNHZpSaWdCOyWqaiGYVhRZdF4DsVtOnB2uW21Q_f6q8RQsAwKACnZhX5etQrkUhBUEZR62ALBROKS8YUAFOGFLHicSdSHCuPTBYpEcZMA3x3_aO0_XvoBPtkO0tti3dhMOrrK2sY7bxVgOOpPBb9bLvgn3C_HNtNF9xrb-ia8S3z0dM1mM1Pd48NzkGuwwYvkyS95Z-SNAg5Wc63Vu1e1sWh_fesK8N8luUPhKo3gg== 194 | sn://wg?eJxVzskOwVAUANAXiYVvweu91xvat9PSlMYUUSy1jSmEGGLY9Z9EbPyAP7LTre1ZnQJjDG2bIwru2Jzk41PKRRNHxYGTVaMKKVBGaACDCMbWKjUirSVGUO6JA4lRcQoW0qseHrUX3uNGtJ2vhwvPFXVsd1ty6naSTTCNqDfQx0NrtR6Ld7yd9Lyyj_612fGd9LYKKZAWDkenewDtc7STuKRLf7647d4ZKzJ2chvfQt69zA776t9ZGJLwzLIf9Vw3-A== 195 | sn://wg?eJxNzjkOgkAUANCJiYVnUYf_v8MMTCcoQYlbjKilQNwiwbjEpeNSauMFvJGdlLaveiXGGFoWRxTctrn1_FQKUMRRcuBkNKhGEqQWCkAjgraUTLRIGrEWVHhsQ6xllICB9GoGR-UG96gVpsvteOU6oondfsecO714589DGozU8dDZbKfiHaWzgVv10Lu2e56d3DYB-aaB48np7kP3HGYmrukyXK5u2TtnZcZOTutbKraXxWFf_y8rTSY88vwHnNY3og== 196 | sn://wg?eJxNzjkOgkAUANCJiYVnUYf_v8MMTCcoQYlbjKilQNwiwbjEpeNGVsbGC3gjOyltX_VKjDG0LI4ouG1z-fhUClDEUXLgZDSoRhKkFgpAI4K2lEy0SBqxFlR4bEOsZZSAgfRqBkflBveoFabL7XjlOqKJ3X7HnDu9eOfPQxqM1PHQ2Wyn4h2ls4Fb9dC7tnuendw2AfmmgePJ6e5D9xxmJq7pMlyubtk7Z2XGTk7rWyq2l8VhX_8vgyYTnnn-A5X3N5A= 197 | sn://wg?eJxVzjkOgkAUgOGJiYVnUYf3nsMMTCcoQYlbjKilQNwiwbjEpeNOxth4AW9kJ63Vn3zVX2KMoWVxRMHtIuLxqRSiiKPkwMloUI0kSC0UgEYEbSmZaJE0Yi2o8NiGWMsoAQPp1QyOyg3uUStMl9vxynVEE7v9jjl3evHOn4c0GKnjobPZTsU7SmcDt-qhd233PDu5bQLyTQPHk9Pdh-45zExc02W4XN2yd87KjJ2c1rdU7F4Wh33971loMuGZ5z_zzjf0 198 | sn://wg?eJxNzskOwVAUANAXiYVvweu91xvat9PSlMYUUSy1jSmEGGLY9aOIjR_wR3a6tD2rU2CMoW1zRMEdzenxKeWgiaPiwMmqUYUUKCM0gEEEY2uVGpHWEiMo98SBxKg4BQvpVQ-P2gvvcSPaztfDheeKOra7LTl1O8kmmEbUG-jjobVaj8U73k56XtlH_9rs-E56W4UUSAuHo9M9gPY52klc0qU_X9x274wVGTu5jW8h315mh331vywNSXhm2Q-VIDeO 199 | sn://wg?eJxVzjkOgkAUANCJiYVnUYf_v8MMTCcoQYlbjKilQNwiwbjEpeNOxth4AW9kJ63tq16JMYaWxREFtyVH8fhUClHEUXLgZDSoRhKkFgpAI4K2lEy0SBqxFlR4bEOsZZSAgfRqBkflBveoFabL7XjlOqKJ3X7HnDu9eOfPQxqM1PHQ2Wyn4h2ls4Fb9dC7tnuendw2AfmmgePJ6e5D9xxmJq7pMlyubtk7Z2XGTk7rWyq6l8VhX_87C00mPPP8B_I2N_A= 200 | sn://wg?eJxVzrkOgkAUQNEJxq9Rh3nPYQamY5GgxC1ElFIgbtFoXOJSmPBPFDZ8mJ20Vjc51dUIIWCaFIBTqw4v341aJFIQlFHUu9hGwYTikjEFwJQpRa543s0Ux9ozi2VKpDnTAT92eJFu-Eq9-LDaRWvX4TYMRn0jcYbZPkhiHE_l5dzf7ua8Sg-LsdvywX_0hr6VP7chBoYO0ez6CtjgFh8N2OB9slo_j1VBmoRcHe-r1bv35fnU-XvmyrTKovgBgZw3eg== --------------------------------------------------------------------------------