├── doc └── FakeAPI.gif ├── requirements.txt ├── Pipfile ├── chatgpt_api_nokey ├── __init__.py ├── flask_server.py ├── config.py ├── singlethread_server.py └── fake_api.py ├── test.py ├── LICENSE ├── README.md ├── example.py ├── README_en.md ├── .gitignore └── Pipfile.lock /doc/FakeAPI.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MasterYip/ChatGPT_API_NoKey/HEAD/doc/FakeAPI.gif -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MasterYip/ChatGPT_API_NoKey/HEAD/requirements.txt -------------------------------------------------------------------------------- /Pipfile: -------------------------------------------------------------------------------- 1 | [[source]] 2 | url = "https://pypi.mirrors.ustc.edu.cn/simple" 3 | verify_ssl = true 4 | name = "pypi" 5 | 6 | [packages] 7 | openai = "*" 8 | bs4 = "*" 9 | html2text = "*" 10 | undetected-chromedriver = "*" 11 | 12 | [dev-packages] 13 | 14 | [requires] 15 | python_version = "3.7" 16 | -------------------------------------------------------------------------------- /chatgpt_api_nokey/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Author: MasterYip 2205929492@qq.com 3 | Date: 2023-08-06 14:47:12 4 | LastEditors: MasterYip 5 | LastEditTime: 2023-08-06 14:55:11 6 | FilePath: \ChatGPT_API_NoKey\chatgpt_api_nokey\__init__.py 7 | Description: package init 8 | ''' 9 | 10 | from .config import * 11 | -------------------------------------------------------------------------------- /test.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Author: MasterYip 2205929492@qq.com 3 | Date: 2023-08-06 14:58:29 4 | LastEditors: MasterYip 5 | LastEditTime: 2023-08-06 15:31:06 6 | FilePath: \ChatGPT_API_NoKey\test.py 7 | Description: file content 8 | ''' 9 | from chatgpt_api_nokey.singlethread_server import SingleThreadServer 10 | from chatgpt_api_nokey.flask_server import FlaskServer, launchFlaskServer 11 | 12 | launchFlaskServer() 13 | # server = FlaskServer() 14 | # print([i for i in range(1)]) -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Raymon Yip 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ChatGPT_API_NoKey 2 | 3 | **中文**|[English](README_en.md) 4 | 5 | 去他的APIKEY!调用没有APIKEY的ChatGPT! 6 | 7 | Screw the APIKEY! Chat to GPT with NO KEY! 8 | 9 | ## 功能介绍 10 | ![FakeAPI](doc/FakeAPI.gif) 11 | 12 | ChatGPT_API_NoKey通过模仿键鼠操作实现简单的ChatGPT fake API,以方便广大穷苦百姓免遭APIKEY的毒害。 13 | 14 | **注意**: 15 | 1. **首次使用时,应设置HEADLESS=False,手动登录ChatGPT,登陆后保存cookie便于后续自动登录。**(作者用头承诺脚本中不包含其他监听信息的功能) 16 | 2. 滥用此API可能导致账号异常,请适当控制请求频率。 17 | 3. 目前仅支持单线程阻塞模式,并发请求处理仍然在开发当中。 18 | 19 | ## 安装使用 20 | 1. 环境配置 21 | 22 | 请事先安装**Google Chrome**浏览器。 23 | ``` 24 | cd 25 | pip install -r .\requirements.txt 26 | ``` 27 | 2. Config配置 28 | 29 | `HEADLESS`:是否在无头模式下运行Chrome浏览器。如果设置为True,将以无头模式运行Chrome浏览器,不会显示浏览器窗口。如果设置为False,将以普通模式运行Chrome浏览器,会显示浏览器窗口。(**注意,undetected_chromedriver在HEADLESS=True时存在小bug, 解决方式在example.py中给出**) 30 | 31 | `HEADER`:浏览器请求的用户代理头。 32 | 33 | `SERVER_ADDRESS`:FakeAPI服务器的地址和端口号元组。 34 | 35 | `PROXY`:访问ChatGPT的代理。在这个配置中,代理设置为None,表示不使用代理(或系统默认代理)来访问ChatGPT。如果你需要使用代理,可以将代理地址设置为对应的字符串,如"http://127.0.0.1:7890"。请确保代理设置正确,以确保能够正确地访问ChatGPT。 36 | 37 | 3. 开箱使用(example.py包含相关例程) 38 | 39 | 运行example.py 40 | ``` 41 | python ./example.py 42 | ``` 43 | 44 | FakeAPI直接调用 45 | ``` 46 | api = FakeAPI(HEADLESS, PROXY, HEADER) 47 | print(api.request("Hello!")) 48 | ``` 49 | 作为Server使用 50 | ``` 51 | Thread(target=SingleThreadServer, args=(HEADLESS, PROXY, HEADER, SERVER_ADDRESS)).start() 52 | time.sleep(15) # Wait for the server to start (It's better to start the server in another thread) 53 | openai.api_base = "http://localhost:5000" 54 | openai.api_key = "whatever" 55 | completions = openai.ChatCompletion.create( 56 | model="whatever", 57 | messages="Hello!", 58 | ) 59 | print(completions['choices'][0]['message']['content']) 60 | ``` 61 | ## 未来工作 62 | - 基于Flask多线程并发请求处理 63 | 64 | ## 鸣谢 65 | 66 | 感谢以下项目对本项目的宝贵贡献: 67 | 68 | - [undetected-chromedriver](https://github.com/ultrafunkamsterdam/undetected-chromedriver) 69 | 70 | 以及其他不小心被忽略的项目 :) 71 | 72 | 特别感谢开源社区和所有为该项目作出贡献的贡献者。 73 | 74 | ## 许可证 75 | 本项目在MIT许可下发布。有关详细信息,请参阅[LICENSE](LICENSE)文件。 76 | 77 | ## 作者 78 | Master Yip 79 | 80 | 电子邮件:2205929492@qq.com 81 | 82 | GitHub:[Master Yip](https://github.com/MasterYip) -------------------------------------------------------------------------------- /chatgpt_api_nokey/flask_server.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Author: MasterYip 2205929492@qq.com 3 | Date: 2023-08-06 14:43:20 4 | LastEditors: MasterYip 5 | LastEditTime: 2023-08-06 15:58:40 6 | FilePath: \ChatGPT_API_NoKey\chatgpt_api_nokey\flask_server.py 7 | Description: file content 8 | ''' 9 | 10 | from .config import * 11 | from .fake_api import MultiThreadedFakeAPI, FakeAPI 12 | 13 | from flask import Flask, request 14 | from multiprocessing import cpu_count, Process 15 | from gevent import monkey 16 | from gevent.pywsgi import WSGIServer 17 | # monkey.patch_all() 18 | import json 19 | 20 | # Flask 21 | app = Flask(__name__) 22 | multiServer = None 23 | # api = MultiThreadedFakeAPI() 24 | api = FakeAPI() 25 | 26 | # 创建POST请求处理的路由 27 | @app.route('/post', methods=['POST']) 28 | def handle_post_request(): 29 | data = request.json 30 | return api.request(json.dumps(data)) 31 | 32 | def server_forever(): 33 | multiServer.start_accepting() 34 | multiServer._stop_event.wait() 35 | 36 | def launchFlaskServer(address=SERVER_ADDRESS): 37 | global multiServer 38 | multiServer = WSGIServer(address, app) 39 | multiServer.start() 40 | for i in range(2): 41 | print("Starting process " + str(i) + "...") 42 | p = Process(target=server_forever) 43 | p.start() 44 | 45 | class FlaskServer(object): 46 | 47 | def __init__(self, threadNum=THEAD_NUM, headless=HEADLESS, proxy=PROXY, header=HEADER, server_address=SERVER_ADDRESS): 48 | self.logger = logging.getLogger('FlaskServer') 49 | self.logger.addHandler(cil_handler) 50 | self.address = server_address 51 | self.api = MultiThreadedFakeAPI( 52 | threadNum=threadNum, headless=headless, proxy=proxy, header=header) 53 | self.launchFlaskServer() 54 | 55 | def launchFlaskServer(self): 56 | global multiServer 57 | multiServer = WSGIServer(self.address, app) 58 | multiServer.start() 59 | self.multiServer = multiServer 60 | global api 61 | api = self.api 62 | for i in range(cpu_count()): 63 | print("Starting process " + str(i) + "...") 64 | p = Process(target=server_forever) 65 | p.start() 66 | 67 | 68 | -------------------------------------------------------------------------------- /chatgpt_api_nokey/config.py: -------------------------------------------------------------------------------- 1 | import os 2 | import logging 3 | 4 | # CONFIG 5 | HEADLESS = False # Whether to run Chrome in headless mode 6 | """ 7 | Note: There is a bug in undetected-chromedriver when setting headless=True. 8 | For short term, you can modify the source code of undetected-chromedriver in `__init__.py` 9 | 385 if headless or options.headless: 10 | 387 # FIXME: uc version_main is > 108 11 | 388 if not self.patcher.version_main: 12 | 389 self.patcher.version_main = 110 13 | 390 if self.patcher.version_main < 108: 14 | 391 options.add_argument("--headless=chrome") 15 | 392 elif self.patcher.version_main >= 108: 16 | 393 options.add_argument("--headless=new") 17 | """ 18 | HEADER = "Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) \ 19 | AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Mobile/15E148 Safari/604.1" 20 | SERVER_ADDRESS = ('', 5000) # Server address (i.e. openai.api_base="http://localhost:5000") 21 | PROXY = None # Proxy used to access ChatGPT 22 | # PROXY = "http://127.0.0.1:7890" # If global proxy is set, you can leave it as None 23 | THEAD_NUM = 1 # Thread number of the server 24 | 25 | # Directory Management 26 | try: 27 | # Run in Terminal 28 | ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) 29 | except: 30 | # Run in ipykernel & interactive 31 | ROOT_DIR = os.getcwd() 32 | 33 | COOKIES_FILE = os.path.join(ROOT_DIR, 'cookies.json') 34 | TMP_SNAP_FILE = os.path.join(ROOT_DIR, 'tmp_snap.png') 35 | 36 | 37 | # Logger 38 | format_str = '%(asctime)s - %(name)s - %(levelname)s - %(filename)s[:%(lineno)d] - %(funcName)s - %(message)s' 39 | datefmt_str = "%y-%m-%d %H:%M:%S" 40 | root_logger = logging.getLogger() 41 | # Remove existing handlers for basicConfig to take effect. 42 | for h in root_logger.handlers: 43 | root_logger.removeHandler(h) 44 | logging.basicConfig(filename=os.path.join(ROOT_DIR, 'log.txt'), 45 | format=format_str, 46 | datefmt=datefmt_str, 47 | level=logging.INFO) 48 | cil_handler = logging.StreamHandler(os.sys.stderr) 49 | cil_handler.setLevel(logging.INFO) 50 | cil_handler.setFormatter(logging.Formatter( 51 | fmt=format_str, datefmt=datefmt_str)) 52 | -------------------------------------------------------------------------------- /example.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Author: MasterYip 2205929492@qq.com 3 | Date: 2023-08-06 16:31:07 4 | LastEditors: MasterYip 5 | LastEditTime: 2023-08-12 20:11:25 6 | FilePath: \ChatGPT_API_NoKey\example.py 7 | Description: file content 8 | ''' 9 | import time 10 | import openai 11 | from threading import Thread 12 | from chatgpt_api_nokey.fake_api import FakeAPI 13 | from chatgpt_api_nokey.singlethread_server import SingleThreadServer 14 | 15 | # CONFIG (default values are set in chatgpt_api_nokey/config.py) 16 | HEADLESS = False # Whether to run Chrome in headless mode 17 | """ 18 | Note: There is a bug in undetected-chromedriver when setting headless=True. 19 | For short term, you can modify the source code of undetected-chromedriver in `__init__.py` 20 | 385 if headless or options.headless: 21 | 387 # FIXME: uc version_main is > 108 22 | 388 if not self.patcher.version_main: 23 | 389 self.patcher.version_main = 110 24 | 390 if self.patcher.version_main < 108: 25 | 391 options.add_argument("--headless=chrome") 26 | 392 elif self.patcher.version_main >= 108: 27 | 393 options.add_argument("--headless=new") 28 | """ 29 | HEADER = "Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) \ 30 | AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Mobile/15E148 Safari/604.1" 31 | SERVER_ADDRESS = ('', 5000) # Server address (i.e. openai.api_base="http://localhost:5000") 32 | PROXY = None # Proxy used to access ChatGPT 33 | # PROXY = "http://127.0.0.1:7890" # If global proxy is set, you can leave it as None 34 | 35 | 36 | def FakeAPIExample(): 37 | api = FakeAPI(HEADLESS, PROXY, HEADER) 38 | print(api.request("Hello!")) 39 | 40 | 41 | def SingleThreadServerExample(): 42 | Thread(target=SingleThreadServer, args=(HEADLESS, PROXY, HEADER, SERVER_ADDRESS)).start() 43 | time.sleep(20) # Wait for the server to start (It's better to start the server in another thread) 44 | openai.api_base = "http://localhost:5000" 45 | openai.api_key = "whatever" 46 | completions = openai.ChatCompletion.create( 47 | model="whatever", 48 | messages="Hello!", 49 | ) 50 | print(completions['choices'][0]['message']['content']) 51 | completions = openai.ChatCompletion.create( 52 | model="whatever", 53 | messages="How to write a program that can get rid of the APIKEY?", 54 | ) 55 | print(completions['choices'][0]['message']['content']) 56 | 57 | 58 | if __name__ == "__main__": 59 | # Example 60 | FakeAPIExample() 61 | # SingleThreadServerExample() 62 | 63 | # Launch Server 64 | # SingleThreadServer(HEADLESS, PROXY, HEADER, SERVER_ADDRESS) 65 | 66 | -------------------------------------------------------------------------------- /chatgpt_api_nokey/singlethread_server.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Author: MasterYip 2205929492@qq.com 3 | Date: 2023-08-06 14:45:50 4 | LastEditors: MasterYip 5 | LastEditTime: 2023-08-06 15:27:38 6 | FilePath: \ChatGPT_API_NoKey\chatgpt_api_nokey\singlethread_server.py 7 | Description: file content 8 | ''' 9 | 10 | from .config import * 11 | from .fake_api import FakeAPI 12 | 13 | import json 14 | import time 15 | from http.server import BaseHTTPRequestHandler, HTTPServer 16 | 17 | class RequestHandler(BaseHTTPRequestHandler): 18 | 19 | def __init__(self, fakeapi, *args, **kwargs): 20 | self.logger = logging.getLogger('RequestHandler') 21 | self.logger.addHandler(cil_handler) 22 | self.api = fakeapi 23 | super().__init__(*args, **kwargs) 24 | 25 | def do_POST(self): 26 | # 获取请求的内容长度 27 | content_length = int(self.headers['Content-Length']) 28 | # 读取请求的内容 29 | post_data = self.rfile.read(content_length) 30 | 31 | # 将请求的JSON数据转换为Python字典 32 | data = json.loads(post_data) 33 | chatText = json.dumps(data) 34 | self.logger.info("Req Received") 35 | response = self.api.request(chatText) 36 | 37 | # 处理请求数据(这里可以根据你的需求做相应处理) 38 | response = { 39 | "id": "chatcmpl-abc123", 40 | "object": "chat.completion", 41 | "created": int(time.time()), 42 | "model": "fake-gpt-3.5-turbo", 43 | "usage": { 44 | "prompt_tokens": 0, 45 | "completion_tokens": 0, 46 | "total_tokens": 0 47 | }, 48 | "choices": [ 49 | { 50 | "message": { 51 | "role": "assistant", 52 | "content": response 53 | }, 54 | "finish_reason": "stop", 55 | "index": 0 56 | } 57 | ] 58 | } 59 | response_json = json.dumps(response) 60 | 61 | # 设置响应头 62 | self.send_response(200) 63 | self.send_header('Content-type', 'application/json') 64 | self.end_headers() 65 | 66 | # 发送响应数据 67 | self.wfile.write(response_json.encode()) 68 | 69 | 70 | class SingleThreadServer(object): 71 | 72 | def __init__(self, headless=HEADLESS, proxy=PROXY, header=HEADER, server_address=SERVER_ADDRESS): 73 | self.logger = logging.getLogger('SingleThreadServer') 74 | self.logger.addHandler(cil_handler) 75 | self.address = server_address 76 | self.api = FakeAPI(headless=headless, proxy=proxy, header=header) 77 | self.launchHTTPServer() 78 | 79 | def launchHTTPServer(self): 80 | self.server = HTTPServer(self.address, 81 | lambda *args, **kwargs: RequestHandler(self.api, *args, **kwargs)) 82 | if self.address[0] == '': 83 | self.logger.info( 84 | f'Server is running on http://localhost:{self.address[1]}') 85 | else: 86 | self.logger.info( 87 | f'Server is running on http://{self.address[0]}:{self.address[1]}') 88 | self.server.serve_forever() 89 | -------------------------------------------------------------------------------- /README_en.md: -------------------------------------------------------------------------------- 1 | # ChatGPT_API_NoKey 2 | 3 | [中文](README.md)|**English** 4 | 5 | 6 | Screw the APIKEY! Chat to GPT with NO KEY! 7 | ## Features 8 | ![FakeAPI](doc/FakeAPI.gif) 9 | 10 | ChatGPT_API_NoKey is a simple ChatGPT fake API that mimics keyboard and mouse operations, allowing users to interact with GPT without the need for an APIKEY. 11 | 12 | **Note**: 13 | 1. **For the first-time use, set `HEADLESS=False` and manually log in to ChatGPT to save cookies for automatic login in subsequent sessions.** The script does not include any other listening functionalities, as assured by the author. 14 | 2. Abusing this API may lead to account issues, so please control the request frequency appropriately. 15 | 3. Currently, only single-thread blocking mode is supported, and concurrent request processing is still under development. 16 | 17 | ## Installation and Usage 18 | 1. Environment Setup 19 | 20 | Please install **Google Chrome** first. 21 | ``` 22 | cd 23 | pip install -r .\requirements.txt 24 | ``` 25 | 2. Config Configuration 26 | 27 | `HEADLESS`: Whether to run Chrome in headless mode. If set to True, Chrome will run in headless mode without displaying the browser window. If set to False, Chrome will run in normal mode and display the browser window. (**Note: There is a small bug in undetected_chromedriver when `HEADLESS=True`. The solution is provided in `example.py`.**) 28 | 29 | `HEADER`: User-agent header for browser requests. 30 | 31 | `SERVER_ADDRESS`: Server address and port number tuple for the FakeAPI. 32 | 33 | `PROXY`: Proxy used to access ChatGPT. In this configuration, the proxy is set to None, indicating no proxy is used (or the system's default proxy) to access ChatGPT. If you need to use a proxy, you can set the proxy address to the corresponding string, such as "http://127.0.0.1:7890". Please ensure that the proxy is set correctly to ensure proper access to ChatGPT. 34 | 35 | 3. Quick Start (example.py includes relevant routines) 36 | 37 | run example.py 38 | ``` 39 | python ./example.py 40 | ``` 41 | 42 | Direct Call to FakeAPI 43 | ``` 44 | api = FakeAPI(HEADLESS, PROXY, HEADER) 45 | print(api.request("Hello!")) 46 | ``` 47 | Using as a Server 48 | ``` 49 | Thread(target=SingleThreadServer, args=(HEADLESS, PROXY, HEADER, SERVER_ADDRESS)).start() 50 | time.sleep(15) # Wait for the server to start (It's better to start the server in another thread) 51 | openai.api_base = "http://localhost:5000" 52 | openai.api_key = "whatever" 53 | completions = openai.ChatCompletion.create( 54 | model="whatever", 55 | messages="Hello!", 56 | ) 57 | print(completions['choices'][0]['message']['content']) 58 | ``` 59 | 60 | ## Future Work 61 | - Implement multi-threaded concurrent request processing based on Flask. 62 | 63 | ## Acknowledgements 64 | 65 | Thanks to the following projects for their valuable contributions to this project: 66 | 67 | - [undetected-chromedriver](https://github.com/ultrafunkamsterdam/undetected-chromedriver) 68 | 69 | And other projects that may have been accidentally overlooked :) 70 | 71 | Special thanks to the open-source community and all contributors for their contributions to this project. 72 | 73 | ## License 74 | This project is released under the MIT license. For more information, please see the [LICENSE](LICENSE) file. 75 | 76 | ## Author 77 | Master Yip 78 | 79 | Email: 2205929492@qq.com 80 | 81 | GitHub: [Master Yip](https://github.com/MasterYip) -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # User 2 | chatgpt_api_nokey/tmp_snap.png 3 | chatgpt_api_nokey/log.txt 4 | chatgpt_api_nokey/cookies.json 5 | 6 | # Byte-compiled / optimized / DLL files 7 | __pycache__/ 8 | *.py[cod] 9 | *$py.class 10 | 11 | # C extensions 12 | *.so 13 | 14 | # Distribution / packaging 15 | .Python 16 | build/ 17 | develop-eggs/ 18 | dist/ 19 | downloads/ 20 | eggs/ 21 | .eggs/ 22 | lib/ 23 | lib64/ 24 | parts/ 25 | sdist/ 26 | var/ 27 | wheels/ 28 | share/python-wheels/ 29 | *.egg-info/ 30 | .installed.cfg 31 | *.egg 32 | MANIFEST 33 | 34 | # PyInstaller 35 | # Usually these files are written by a python script from a template 36 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 37 | *.manifest 38 | *.spec 39 | 40 | # Installer logs 41 | pip-log.txt 42 | pip-delete-this-directory.txt 43 | 44 | # Unit test / coverage reports 45 | htmlcov/ 46 | .tox/ 47 | .nox/ 48 | .coverage 49 | .coverage.* 50 | .cache 51 | nosetests.xml 52 | coverage.xml 53 | *.cover 54 | *.py,cover 55 | .hypothesis/ 56 | .pytest_cache/ 57 | cover/ 58 | 59 | # Translations 60 | *.mo 61 | *.pot 62 | 63 | # Django stuff: 64 | *.log 65 | local_settings.py 66 | db.sqlite3 67 | db.sqlite3-journal 68 | 69 | # Flask stuff: 70 | instance/ 71 | .webassets-cache 72 | 73 | # Scrapy stuff: 74 | .scrapy 75 | 76 | # Sphinx documentation 77 | docs/_build/ 78 | 79 | # PyBuilder 80 | .pybuilder/ 81 | target/ 82 | 83 | # Jupyter Notebook 84 | .ipynb_checkpoints 85 | 86 | # IPython 87 | profile_default/ 88 | ipython_config.py 89 | 90 | # pyenv 91 | # For a library or package, you might want to ignore these files since the code is 92 | # intended to run in multiple environments; otherwise, check them in: 93 | # .python-version 94 | 95 | # pipenv 96 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 97 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 98 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 99 | # install all needed dependencies. 100 | #Pipfile.lock 101 | 102 | # poetry 103 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. 104 | # This is especially recommended for binary packages to ensure reproducibility, and is more 105 | # commonly ignored for libraries. 106 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control 107 | #poetry.lock 108 | 109 | # pdm 110 | # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. 111 | #pdm.lock 112 | # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it 113 | # in version control. 114 | # https://pdm.fming.dev/#use-with-ide 115 | .pdm.toml 116 | 117 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm 118 | __pypackages__/ 119 | 120 | # Celery stuff 121 | celerybeat-schedule 122 | celerybeat.pid 123 | 124 | # SageMath parsed files 125 | *.sage.py 126 | 127 | # Environments 128 | .env 129 | .venv 130 | env/ 131 | venv/ 132 | ENV/ 133 | env.bak/ 134 | venv.bak/ 135 | 136 | # Spyder project settings 137 | .spyderproject 138 | .spyproject 139 | 140 | # Rope project settings 141 | .ropeproject 142 | 143 | # mkdocs documentation 144 | /site 145 | 146 | # mypy 147 | .mypy_cache/ 148 | .dmypy.json 149 | dmypy.json 150 | 151 | # Pyre type checker 152 | .pyre/ 153 | 154 | # pytype static type analyzer 155 | .pytype/ 156 | 157 | # Cython debug symbols 158 | cython_debug/ 159 | 160 | # PyCharm 161 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can 162 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore 163 | # and can be added to the global gitignore or merged into this file. For a more nuclear 164 | # option (not recommended) you can uncomment the following to ignore the entire idea folder. 165 | #.idea/ 166 | -------------------------------------------------------------------------------- /chatgpt_api_nokey/fake_api.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Author: MasterYip 2205929492@qq.com 3 | Date: 2023-07-13 16:41:24 4 | LastEditors: MasterYip 5 | LastEditTime: 2023-08-12 20:05:44 6 | FilePath: \ChatGPT_API_NoKey\chatgpt_api_nokey\fake_api.py 7 | Description: file content 8 | ''' 9 | 10 | from .config import * 11 | 12 | import time 13 | import json 14 | import html2text 15 | # import tiktoken 16 | from bs4 import BeautifulSoup 17 | import undetected_chromedriver as uc 18 | from selenium.webdriver.common.by import By 19 | from selenium.webdriver.support.ui import WebDriverWait 20 | from selenium.webdriver.support import expected_conditions as EC 21 | 22 | 23 | def stringTokenNum(string: str, encoding_name: str = "cl100k_base") -> int: 24 | """Returns the number of tokens in a text string.""" 25 | encoding = tiktoken.get_encoding(encoding_name) 26 | num_tokens = len(encoding.encode(string)) 27 | return num_tokens 28 | 29 | class FakeAPI(object): 30 | 31 | def __init__(self, headless=HEADLESS, proxy=PROXY, header=HEADER): 32 | self.logger = logging.getLogger('FakeAPI') 33 | self.logger.addHandler(cil_handler) 34 | self.url = 'https://chat.openai.com/' 35 | 36 | # Configure the Chrome options 37 | chrome_options = uc.ChromeOptions() 38 | chrome_options.add_argument('--ignore-certificate-errors') 39 | chrome_options.add_argument( 40 | f"--user-agent={header}") 41 | chrome_options.add_argument("--enable-javascript") 42 | if proxy: 43 | chrome_options.add_argument( 44 | f'--proxy-server={proxy}') # Default: follow system 45 | if headless: 46 | chrome_options.add_argument('--headless') 47 | # Launch the Chrome browser with proxy settings 48 | self.driver = uc.Chrome(options=chrome_options) 49 | self.logger.info('Server Initialized.') 50 | self.loginGPT() 51 | self.logger.info('Login Succeeded.') 52 | self.available = True 53 | 54 | # Launch 55 | def loginGPT(self): 56 | self.driver.get(self.url) 57 | self.driver.delete_all_cookies() 58 | if os.path.isfile(COOKIES_FILE): 59 | cookies = json.load(open(COOKIES_FILE, 'r')) 60 | # cookies = json.load(open(COOKIES_FILE, 'r'), encoding='utf-8') 61 | # 方法1 将expiry类型变为int 62 | for cookie in cookies: 63 | # 并不是所有cookie都含有expiry 所以要用dict的get方法来获取 64 | if isinstance(cookie.get('expiry'), float): 65 | cookie['expiry'] = int(cookie['expiry']) 66 | if cookie.get('name') == '__Host-next-auth.csrf-token': 67 | continue 68 | self.driver.add_cookie(cookie) 69 | self.driver.get(self.url) 70 | self.skipHint() 71 | else: 72 | input('Please login and press Enter to continue...\nIf HEADLESS is True, please set it to False for the first time.') 73 | self.saveCookies() 74 | 75 | def skipHint(self): 76 | hintFlag = True 77 | while hintFlag: 78 | buttons = self.getButtons() 79 | for button in buttons: 80 | if button.text == 'Next': 81 | button.click() 82 | break 83 | elif 'Ok' in button.text or 'Done' in button.text: 84 | button.click() 85 | hintFlag = False 86 | break 87 | 88 | def saveCookies(self): 89 | cookies = self.driver.get_cookies() 90 | with open(COOKIES_FILE, 'w') as f: 91 | json.dump(cookies, f, indent=4, ensure_ascii=False) 92 | 93 | # Extract 94 | def getContent(self): 95 | raw_content = self.driver.page_source 96 | # Format html content 97 | return BeautifulSoup(raw_content, 'html.parser').prettify() 98 | 99 | def getButtons(self): 100 | # return self.driver.find_element(by='css selector', value='button') 101 | # return self.driver.find_element(by=By.XPATH, value="//button[contains(@class, 'btn-neutral')]") 102 | # This works 103 | return self.driver.find_elements(by=By.CLASS_NAME, value="btn") 104 | 105 | def getTextInput(self): 106 | areas = self.driver.find_elements(by=By.TAG_NAME, value="textarea") 107 | while len(areas) == 0: 108 | self.logger.warning('No textarea found, refreshing...') 109 | self.driver.refresh() 110 | # time.sleep(0.2) 111 | areas = self.driver.find_elements(by=By.TAG_NAME, value="textarea") 112 | return areas[0] 113 | 114 | # FIXME: Answer sometimes mismatched 115 | def getLatestAnswer(self): 116 | """Get the latest answer from the answer divs.""" 117 | ans = self.getAnswerDivs(toJson=True) 118 | if ans: 119 | # 将HTML富文本转换为Markdown 120 | # FIXME: This method is not perfect. 121 | return html2text.HTML2Text().handle(ans[-1]) 122 | 123 | def getAnswerDivs(self, toJson=False): 124 | xpath = "//div[contains(@class, 'markdown prose w-full break-words dark:prose-invert light')]" 125 | elements = self.driver.find_elements(by=By.XPATH, value=xpath) 126 | if toJson: 127 | return [BeautifulSoup(element.get_attribute('innerHTML'), 'html.parser').prettify() for element in elements] 128 | else: 129 | return elements 130 | 131 | # Server 132 | def wait(self, timeout=20, poll_frequency=0.05): 133 | # self.driver.implicitly_wait(timeout) 134 | xpath = "//div[contains(@class, 'result-streaming')]" 135 | # Wait result-streaming div to disappear 136 | wait1 = WebDriverWait(self.driver, timeout, poll_frequency=poll_frequency) 137 | wait2 = WebDriverWait(self.driver, timeout, poll_frequency=poll_frequency) 138 | try: 139 | wait1.until(EC.presence_of_element_located((By.XPATH, xpath))) 140 | wait2.until(EC.invisibility_of_element_located((By.XPATH, xpath))) 141 | return True 142 | except: 143 | return False 144 | 145 | def refresh(self, timeout=20): 146 | self.driver.refresh() 147 | # wait for the page to load 148 | wait = WebDriverWait(self.driver, timeout) 149 | try: 150 | wait.until(EC.presence_of_element_located((By.TAG_NAME, 'textarea'))) 151 | return True 152 | except: 153 | self.logger.warning('Refresh failed...') 154 | return False 155 | 156 | def request(self, chatText, refreshlimit=7): 157 | """Send a request to the server and return the answer. 158 | 159 | """ 160 | self.available = False 161 | flag = False 162 | textInput = self.getTextInput() 163 | textInput.send_keys(chatText) 164 | textInput.submit() 165 | while not flag: 166 | if self.wait(): 167 | flag = True 168 | break 169 | else: 170 | self.logger.warning('Wait timeout, refreshing...') 171 | self.refresh() 172 | textInput = self.getTextInput() 173 | textInput.send_keys(chatText) 174 | textInput.submit() 175 | time.sleep(0.2) 176 | answer = self.getLatestAnswer() 177 | if len(self.getAnswerDivs()) > refreshlimit: 178 | self.logger.info('Webpage answer limit reached, refreshing...') 179 | self.refresh() 180 | self.available = True 181 | return answer 182 | 183 | def quit(self): 184 | self.driver.quit() 185 | 186 | def isAvailable(self): 187 | return self.available 188 | 189 | # Debugging 190 | def printElementInfo(self, webElement, showsnap=True): 191 | print('tag_name:', webElement.tag_name) 192 | print('text:', webElement.text) 193 | print('location:', webElement.location) 194 | print('size:', webElement.size) 195 | print('id:', webElement.id) 196 | print('rect:', webElement.rect) 197 | if showsnap: 198 | webElement.screenshot(TMP_SNAP_FILE) 199 | os.startfile(TMP_SNAP_FILE) 200 | 201 | 202 | class MultiThreadedFakeAPI(object): 203 | 204 | def __init__(self, threadNum=THEAD_NUM, headless=HEADLESS, proxy=PROXY, header=HEADER): 205 | self.logger = logging.getLogger('MultiThreadedFakeAPI') 206 | self.logger.addHandler(cil_handler) 207 | self.logger.info( 208 | 'Initializing MultiThreadedFakeAPI(probably time-consuming)...') 209 | self.apis = [FakeAPI(headless=headless, proxy=proxy, 210 | header=header) for i in range(threadNum)] 211 | 212 | def request(self, chatText): 213 | while True: 214 | for api in self.apis: 215 | if api.isAvailable(): 216 | return api.request(chatText) 217 | time.sleep(0.1) 218 | 219 | 220 | 221 | -------------------------------------------------------------------------------- /Pipfile.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_meta": { 3 | "hash": { 4 | "sha256": "e58f48aeb6077535b85ac215a0ad8ee785ccaf21266f7acad99741085e541382" 5 | }, 6 | "pipfile-spec": 6, 7 | "requires": { 8 | "python_version": "3.7" 9 | }, 10 | "sources": [ 11 | { 12 | "name": "pypi", 13 | "url": "https://pypi.mirrors.ustc.edu.cn/simple", 14 | "verify_ssl": true 15 | } 16 | ] 17 | }, 18 | "default": { 19 | "aiohttp": { 20 | "hashes": [ 21 | "sha256:00ad4b6f185ec67f3e6562e8a1d2b69660be43070bd0ef6fcec5211154c7df67", 22 | "sha256:0175d745d9e85c40dcc51c8f88c74bfbaef9e7afeeeb9d03c37977270303064c", 23 | "sha256:01d4c0c874aa4ddfb8098e85d10b5e875a70adc63db91f1ae65a4b04d3344cda", 24 | "sha256:043d2299f6dfdc92f0ac5e995dfc56668e1587cea7f9aa9d8a78a1b6554e5755", 25 | "sha256:0c413c633d0512df4dc7fd2373ec06cc6a815b7b6d6c2f208ada7e9e93a5061d", 26 | "sha256:0d21c684808288a98914e5aaf2a7c6a3179d4df11d249799c32d1808e79503b5", 27 | "sha256:0e584a10f204a617d71d359fe383406305a4b595b333721fa50b867b4a0a1548", 28 | "sha256:1274477e4c71ce8cfe6c1ec2f806d57c015ebf84d83373676036e256bc55d690", 29 | "sha256:13bf85afc99ce6f9ee3567b04501f18f9f8dbbb2ea11ed1a2e079670403a7c84", 30 | "sha256:153c2549f6c004d2754cc60603d4668899c9895b8a89397444a9c4efa282aaf4", 31 | "sha256:1f7372f7341fcc16f57b2caded43e81ddd18df53320b6f9f042acad41f8e049a", 32 | "sha256:23fb25a9f0a1ca1f24c0a371523546366bb642397c94ab45ad3aedf2941cec6a", 33 | "sha256:28c543e54710d6158fc6f439296c7865b29e0b616629767e685a7185fab4a6b9", 34 | "sha256:2a482e6da906d5e6e653be079b29bc173a48e381600161c9932d89dfae5942ef", 35 | "sha256:2ad5c3c4590bb3cc28b4382f031f3783f25ec223557124c68754a2231d989e2b", 36 | "sha256:2ce2ac5708501afc4847221a521f7e4b245abf5178cf5ddae9d5b3856ddb2f3a", 37 | "sha256:2cf57fb50be5f52bda004b8893e63b48530ed9f0d6c96c84620dc92fe3cd9b9d", 38 | "sha256:2e1b1e51b0774408f091d268648e3d57f7260c1682e7d3a63cb00d22d71bb945", 39 | "sha256:2e2e9839e14dd5308ee773c97115f1e0a1cb1d75cbeeee9f33824fa5144c7634", 40 | "sha256:2e460be6978fc24e3df83193dc0cc4de46c9909ed92dd47d349a452ef49325b7", 41 | "sha256:312fcfbacc7880a8da0ae8b6abc6cc7d752e9caa0051a53d217a650b25e9a691", 42 | "sha256:33279701c04351a2914e1100b62b2a7fdb9a25995c4a104259f9a5ead7ed4802", 43 | "sha256:33776e945d89b29251b33a7e7d006ce86447b2cfd66db5e5ded4e5cd0340585c", 44 | "sha256:34dd0c107799dcbbf7d48b53be761a013c0adf5571bf50c4ecad5643fe9cfcd0", 45 | "sha256:3562b06567c06439d8b447037bb655ef69786c590b1de86c7ab81efe1c9c15d8", 46 | "sha256:368a42363c4d70ab52c2c6420a57f190ed3dfaca6a1b19afda8165ee16416a82", 47 | "sha256:4149d34c32f9638f38f544b3977a4c24052042affa895352d3636fa8bffd030a", 48 | "sha256:461908b2578955045efde733719d62f2b649c404189a09a632d245b445c9c975", 49 | "sha256:4a01951fabc4ce26ab791da5f3f24dca6d9a6f24121746eb19756416ff2d881b", 50 | "sha256:4e874cbf8caf8959d2adf572a78bba17cb0e9d7e51bb83d86a3697b686a0ab4d", 51 | "sha256:4f21e83f355643c345177a5d1d8079f9f28b5133bcd154193b799d380331d5d3", 52 | "sha256:5443910d662db951b2e58eb70b0fbe6b6e2ae613477129a5805d0b66c54b6cb7", 53 | "sha256:5798a9aad1879f626589f3df0f8b79b3608a92e9beab10e5fda02c8a2c60db2e", 54 | "sha256:5d20003b635fc6ae3f96d7260281dfaf1894fc3aa24d1888a9b2628e97c241e5", 55 | "sha256:5db3a5b833764280ed7618393832e0853e40f3d3e9aa128ac0ba0f8278d08649", 56 | "sha256:5ed1c46fb119f1b59304b5ec89f834f07124cd23ae5b74288e364477641060ff", 57 | "sha256:62360cb771707cb70a6fd114b9871d20d7dd2163a0feafe43fd115cfe4fe845e", 58 | "sha256:6809a00deaf3810e38c628e9a33271892f815b853605a936e2e9e5129762356c", 59 | "sha256:68c5a82c8779bdfc6367c967a4a1b2aa52cd3595388bf5961a62158ee8a59e22", 60 | "sha256:6e4a280e4b975a2e7745573e3fc9c9ba0d1194a3738ce1cbaa80626cc9b4f4df", 61 | "sha256:6e6783bcc45f397fdebc118d772103d751b54cddf5b60fbcc958382d7dd64f3e", 62 | "sha256:72a860c215e26192379f57cae5ab12b168b75db8271f111019509a1196dfc780", 63 | "sha256:7607ec3ce4993464368505888af5beb446845a014bc676d349efec0e05085905", 64 | "sha256:773dd01706d4db536335fcfae6ea2440a70ceb03dd3e7378f3e815b03c97ab51", 65 | "sha256:78d847e4cde6ecc19125ccbc9bfac4a7ab37c234dd88fbb3c5c524e8e14da543", 66 | "sha256:7dde0009408969a43b04c16cbbe252c4f5ef4574ac226bc8815cd7342d2028b6", 67 | "sha256:80bd372b8d0715c66c974cf57fe363621a02f359f1ec81cba97366948c7fc873", 68 | "sha256:841cd8233cbd2111a0ef0a522ce016357c5e3aff8a8ce92bcfa14cef890d698f", 69 | "sha256:84de26ddf621d7ac4c975dbea4c945860e08cccde492269db4e1538a6a6f3c35", 70 | "sha256:84f8ae3e09a34f35c18fa57f015cc394bd1389bce02503fb30c394d04ee6b938", 71 | "sha256:8af740fc2711ad85f1a5c034a435782fbd5b5f8314c9a3ef071424a8158d7f6b", 72 | "sha256:8b929b9bd7cd7c3939f8bcfffa92fae7480bd1aa425279d51a89327d600c704d", 73 | "sha256:910bec0c49637d213f5d9877105d26e0c4a4de2f8b1b29405ff37e9fc0ad52b8", 74 | "sha256:96943e5dcc37a6529d18766597c491798b7eb7a61d48878611298afc1fca946c", 75 | "sha256:a0215ce6041d501f3155dc219712bc41252d0ab76474615b9700d63d4d9292af", 76 | "sha256:a3cf433f127efa43fee6b90ea4c6edf6c4a17109d1d037d1a52abec84d8f2e42", 77 | "sha256:a6ce61195c6a19c785df04e71a4537e29eaa2c50fe745b732aa937c0c77169f3", 78 | "sha256:a7a75ef35f2df54ad55dbf4b73fe1da96f370e51b10c91f08b19603c64004acc", 79 | "sha256:a94159871304770da4dd371f4291b20cac04e8c94f11bdea1c3478e557fbe0d8", 80 | "sha256:aa1990247f02a54185dc0dff92a6904521172a22664c863a03ff64c42f9b5410", 81 | "sha256:ab88bafedc57dd0aab55fa728ea10c1911f7e4d8b43e1d838a1739f33712921c", 82 | "sha256:ad093e823df03bb3fd37e7dec9d4670c34f9e24aeace76808fc20a507cace825", 83 | "sha256:ae871a964e1987a943d83d6709d20ec6103ca1eaf52f7e0d36ee1b5bebb8b9b9", 84 | "sha256:b0ba0d15164eae3d878260d4c4df859bbdc6466e9e6689c344a13334f988bb53", 85 | "sha256:b5411d82cddd212644cf9360879eb5080f0d5f7d809d03262c50dad02f01421a", 86 | "sha256:b9552ec52cc147dbf1944ac7ac98af7602e51ea2dcd076ed194ca3c0d1c7d0bc", 87 | "sha256:bfb9162dcf01f615462b995a516ba03e769de0789de1cadc0f916265c257e5d8", 88 | "sha256:c0a9034379a37ae42dea7ac1e048352d96286626251862e448933c0f59cbd79c", 89 | "sha256:c1161b345c0a444ebcf46bf0a740ba5dcf50612fd3d0528883fdc0eff578006a", 90 | "sha256:c11f5b099adafb18e65c2c997d57108b5bbeaa9eeee64a84302c0978b1ec948b", 91 | "sha256:c44e65da1de4403d0576473e2344828ef9c4c6244d65cf4b75549bb46d40b8dd", 92 | "sha256:c48c5c0271149cfe467c0ff8eb941279fd6e3f65c9a388c984e0e6cf57538e14", 93 | "sha256:c7a815258e5895d8900aec4454f38dca9aed71085f227537208057853f9d13f2", 94 | "sha256:cae533195e8122584ec87531d6df000ad07737eaa3c81209e85c928854d2195c", 95 | "sha256:cc14be025665dba6202b6a71cfcdb53210cc498e50068bc088076624471f8bb9", 96 | "sha256:cd56db019015b6acfaaf92e1ac40eb8434847d9bf88b4be4efe5bfd260aee692", 97 | "sha256:d827176898a2b0b09694fbd1088c7a31836d1a505c243811c87ae53a3f6273c1", 98 | "sha256:df72ac063b97837a80d80dec8d54c241af059cc9bb42c4de68bd5b61ceb37caa", 99 | "sha256:e5980a746d547a6ba173fd5ee85ce9077e72d118758db05d229044b469d9029a", 100 | "sha256:e5d47ae48db0b2dcf70bc8a3bc72b3de86e2a590fc299fdbbb15af320d2659de", 101 | "sha256:e91d635961bec2d8f19dfeb41a539eb94bd073f075ca6dae6c8dc0ee89ad6f91", 102 | "sha256:ea353162f249c8097ea63c2169dd1aa55de1e8fecbe63412a9bc50816e87b761", 103 | "sha256:eaeed7abfb5d64c539e2db173f63631455f1196c37d9d8d873fc316470dfbacd", 104 | "sha256:eca4bf3734c541dc4f374ad6010a68ff6c6748f00451707f39857f429ca36ced", 105 | "sha256:f83a552443a526ea38d064588613aca983d0ee0038801bc93c0c916428310c28", 106 | "sha256:fb1558def481d84f03b45888473fc5a1f35747b5f334ef4e7a571bc0dfcb11f8", 107 | "sha256:fd1ed388ea7fbed22c4968dd64bab0198de60750a25fe8c0c9d4bef5abe13824" 108 | ], 109 | "markers": "python_version >= '3.6'", 110 | "version": "==3.8.5" 111 | }, 112 | "aiosignal": { 113 | "hashes": [ 114 | "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc", 115 | "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17" 116 | ], 117 | "markers": "python_version >= '3.7'", 118 | "version": "==1.3.1" 119 | }, 120 | "async-timeout": { 121 | "hashes": [ 122 | "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15", 123 | "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c" 124 | ], 125 | "markers": "python_version >= '3.6'", 126 | "version": "==4.0.2" 127 | }, 128 | "attrs": { 129 | "hashes": [ 130 | "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04", 131 | "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015" 132 | ], 133 | "markers": "python_version >= '3.7'", 134 | "version": "==23.1.0" 135 | }, 136 | "beautifulsoup4": { 137 | "hashes": [ 138 | "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da", 139 | "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a" 140 | ], 141 | "markers": "python_full_version >= '3.6.0'", 142 | "version": "==4.12.2" 143 | }, 144 | "bs4": { 145 | "hashes": [ 146 | "sha256:36ecea1fd7cc5c0c6e4a1ff075df26d50da647b75376626cc186e2212886dd3a" 147 | ], 148 | "index": "pypi", 149 | "version": "==0.0.1" 150 | }, 151 | "certifi": { 152 | "hashes": [ 153 | "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082", 154 | "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9" 155 | ], 156 | "markers": "python_version >= '3.6'", 157 | "version": "==2023.7.22" 158 | }, 159 | "cffi": { 160 | "hashes": [ 161 | "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5", 162 | "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef", 163 | "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104", 164 | "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426", 165 | "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405", 166 | "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375", 167 | "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a", 168 | "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e", 169 | "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc", 170 | "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf", 171 | "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185", 172 | "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497", 173 | "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3", 174 | "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35", 175 | "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c", 176 | "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83", 177 | "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21", 178 | "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca", 179 | "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984", 180 | "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac", 181 | "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd", 182 | "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee", 183 | "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a", 184 | "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2", 185 | "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192", 186 | "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7", 187 | "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585", 188 | "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f", 189 | "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e", 190 | "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27", 191 | "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b", 192 | "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e", 193 | "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e", 194 | "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d", 195 | "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c", 196 | "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415", 197 | "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82", 198 | "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02", 199 | "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314", 200 | "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325", 201 | "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c", 202 | "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3", 203 | "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914", 204 | "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045", 205 | "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d", 206 | "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9", 207 | "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5", 208 | "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2", 209 | "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c", 210 | "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3", 211 | "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2", 212 | "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8", 213 | "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d", 214 | "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d", 215 | "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9", 216 | "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162", 217 | "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76", 218 | "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4", 219 | "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e", 220 | "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9", 221 | "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6", 222 | "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b", 223 | "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01", 224 | "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0" 225 | ], 226 | "markers": "os_name == 'nt' and implementation_name != 'pypy'", 227 | "version": "==1.15.1" 228 | }, 229 | "charset-normalizer": { 230 | "hashes": [ 231 | "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96", 232 | "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c", 233 | "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710", 234 | "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706", 235 | "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020", 236 | "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252", 237 | "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad", 238 | "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329", 239 | "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a", 240 | "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f", 241 | "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6", 242 | "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4", 243 | "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a", 244 | "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46", 245 | "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2", 246 | "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23", 247 | "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace", 248 | "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd", 249 | "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982", 250 | "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10", 251 | "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2", 252 | "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea", 253 | "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09", 254 | "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5", 255 | "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149", 256 | "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489", 257 | "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9", 258 | "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80", 259 | "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592", 260 | "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3", 261 | "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6", 262 | "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed", 263 | "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c", 264 | "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200", 265 | "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a", 266 | "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e", 267 | "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d", 268 | "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6", 269 | "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623", 270 | "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669", 271 | "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3", 272 | "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa", 273 | "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9", 274 | "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2", 275 | "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f", 276 | "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1", 277 | "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4", 278 | "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a", 279 | "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8", 280 | "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3", 281 | "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029", 282 | "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f", 283 | "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959", 284 | "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22", 285 | "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7", 286 | "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952", 287 | "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346", 288 | "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e", 289 | "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d", 290 | "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299", 291 | "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd", 292 | "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a", 293 | "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3", 294 | "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037", 295 | "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94", 296 | "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c", 297 | "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858", 298 | "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a", 299 | "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449", 300 | "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c", 301 | "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918", 302 | "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1", 303 | "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c", 304 | "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac", 305 | "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa" 306 | ], 307 | "markers": "python_full_version >= '3.7.0'", 308 | "version": "==3.2.0" 309 | }, 310 | "colorama": { 311 | "hashes": [ 312 | "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", 313 | "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" 314 | ], 315 | "markers": "platform_system == 'Windows'", 316 | "version": "==0.4.6" 317 | }, 318 | "exceptiongroup": { 319 | "hashes": [ 320 | "sha256:12c3e887d6485d16943a309616de20ae5582633e0a2eda17f4e10fd61c1e8af5", 321 | "sha256:e346e69d186172ca7cf029c8c1d16235aa0e04035e5750b4b95039e65204328f" 322 | ], 323 | "markers": "python_version < '3.11'", 324 | "version": "==1.1.2" 325 | }, 326 | "frozenlist": { 327 | "hashes": [ 328 | "sha256:007df07a6e3eb3e33e9a1fe6a9db7af152bbd8a185f9aaa6ece10a3529e3e1c6", 329 | "sha256:008eb8b31b3ea6896da16c38c1b136cb9fec9e249e77f6211d479db79a4eaf01", 330 | "sha256:09163bdf0b2907454042edb19f887c6d33806adc71fbd54afc14908bfdc22251", 331 | "sha256:0c7c1b47859ee2cac3846fde1c1dc0f15da6cec5a0e5c72d101e0f83dcb67ff9", 332 | "sha256:0e5c8764c7829343d919cc2dfc587a8db01c4f70a4ebbc49abde5d4b158b007b", 333 | "sha256:10ff5faaa22786315ef57097a279b833ecab1a0bfb07d604c9cbb1c4cdc2ed87", 334 | "sha256:17ae5cd0f333f94f2e03aaf140bb762c64783935cc764ff9c82dff626089bebf", 335 | "sha256:19488c57c12d4e8095a922f328df3f179c820c212940a498623ed39160bc3c2f", 336 | "sha256:1a0848b52815006ea6596c395f87449f693dc419061cc21e970f139d466dc0a0", 337 | "sha256:1e78fb68cf9c1a6aa4a9a12e960a5c9dfbdb89b3695197aa7064705662515de2", 338 | "sha256:261b9f5d17cac914531331ff1b1d452125bf5daa05faf73b71d935485b0c510b", 339 | "sha256:2b8bcf994563466db019fab287ff390fffbfdb4f905fc77bc1c1d604b1c689cc", 340 | "sha256:38461d02d66de17455072c9ba981d35f1d2a73024bee7790ac2f9e361ef1cd0c", 341 | "sha256:490132667476f6781b4c9458298b0c1cddf237488abd228b0b3650e5ecba7467", 342 | "sha256:491e014f5c43656da08958808588cc6c016847b4360e327a62cb308c791bd2d9", 343 | "sha256:515e1abc578dd3b275d6a5114030b1330ba044ffba03f94091842852f806f1c1", 344 | "sha256:556de4430ce324c836789fa4560ca62d1591d2538b8ceb0b4f68fb7b2384a27a", 345 | "sha256:5833593c25ac59ede40ed4de6d67eb42928cca97f26feea219f21d0ed0959b79", 346 | "sha256:6221d84d463fb110bdd7619b69cb43878a11d51cbb9394ae3105d082d5199167", 347 | "sha256:6918d49b1f90821e93069682c06ffde41829c346c66b721e65a5c62b4bab0300", 348 | "sha256:6c38721585f285203e4b4132a352eb3daa19121a035f3182e08e437cface44bf", 349 | "sha256:71932b597f9895f011f47f17d6428252fc728ba2ae6024e13c3398a087c2cdea", 350 | "sha256:7211ef110a9194b6042449431e08c4d80c0481e5891e58d429df5899690511c2", 351 | "sha256:764226ceef3125e53ea2cb275000e309c0aa5464d43bd72abd661e27fffc26ab", 352 | "sha256:7645a8e814a3ee34a89c4a372011dcd817964ce8cb273c8ed6119d706e9613e3", 353 | "sha256:76d4711f6f6d08551a7e9ef28c722f4a50dd0fc204c56b4bcd95c6cc05ce6fbb", 354 | "sha256:7f4f399d28478d1f604c2ff9119907af9726aed73680e5ed1ca634d377abb087", 355 | "sha256:88f7bc0fcca81f985f78dd0fa68d2c75abf8272b1f5c323ea4a01a4d7a614efc", 356 | "sha256:8d0edd6b1c7fb94922bf569c9b092ee187a83f03fb1a63076e7774b60f9481a8", 357 | "sha256:901289d524fdd571be1c7be054f48b1f88ce8dddcbdf1ec698b27d4b8b9e5d62", 358 | "sha256:93ea75c050c5bb3d98016b4ba2497851eadf0ac154d88a67d7a6816206f6fa7f", 359 | "sha256:981b9ab5a0a3178ff413bca62526bb784249421c24ad7381e39d67981be2c326", 360 | "sha256:9ac08e601308e41eb533f232dbf6b7e4cea762f9f84f6357136eed926c15d12c", 361 | "sha256:a02eb8ab2b8f200179b5f62b59757685ae9987996ae549ccf30f983f40602431", 362 | "sha256:a0c6da9aee33ff0b1a451e867da0c1f47408112b3391dd43133838339e410963", 363 | "sha256:a6c8097e01886188e5be3e6b14e94ab365f384736aa1fca6a0b9e35bd4a30bc7", 364 | "sha256:aa384489fefeb62321b238e64c07ef48398fe80f9e1e6afeff22e140e0850eef", 365 | "sha256:ad2a9eb6d9839ae241701d0918f54c51365a51407fd80f6b8289e2dfca977cc3", 366 | "sha256:b206646d176a007466358aa21d85cd8600a415c67c9bd15403336c331a10d956", 367 | "sha256:b826d97e4276750beca7c8f0f1a4938892697a6bcd8ec8217b3312dad6982781", 368 | "sha256:b89ac9768b82205936771f8d2eb3ce88503b1556324c9f903e7156669f521472", 369 | "sha256:bd7bd3b3830247580de99c99ea2a01416dfc3c34471ca1298bccabf86d0ff4dc", 370 | "sha256:bdf1847068c362f16b353163391210269e4f0569a3c166bc6a9f74ccbfc7e839", 371 | "sha256:c11b0746f5d946fecf750428a95f3e9ebe792c1ee3b1e96eeba145dc631a9672", 372 | "sha256:c5374b80521d3d3f2ec5572e05adc94601985cc526fb276d0c8574a6d749f1b3", 373 | "sha256:ca265542ca427bf97aed183c1676e2a9c66942e822b14dc6e5f42e038f92a503", 374 | "sha256:ce31ae3e19f3c902de379cf1323d90c649425b86de7bbdf82871b8a2a0615f3d", 375 | "sha256:ceb6ec0a10c65540421e20ebd29083c50e6d1143278746a4ef6bcf6153171eb8", 376 | "sha256:d081f13b095d74b67d550de04df1c756831f3b83dc9881c38985834387487f1b", 377 | "sha256:d5655a942f5f5d2c9ed93d72148226d75369b4f6952680211972a33e59b1dfdc", 378 | "sha256:d5a32087d720c608f42caed0ef36d2b3ea61a9d09ee59a5142d6070da9041b8f", 379 | "sha256:d6484756b12f40003c6128bfcc3fa9f0d49a687e171186c2d85ec82e3758c559", 380 | "sha256:dd65632acaf0d47608190a71bfe46b209719bf2beb59507db08ccdbe712f969b", 381 | "sha256:de343e75f40e972bae1ef6090267f8260c1446a1695e77096db6cfa25e759a95", 382 | "sha256:e29cda763f752553fa14c68fb2195150bfab22b352572cb36c43c47bedba70eb", 383 | "sha256:e41f3de4df3e80de75845d3e743b3f1c4c8613c3997a912dbf0229fc61a8b963", 384 | "sha256:e66d2a64d44d50d2543405fb183a21f76b3b5fd16f130f5c99187c3fb4e64919", 385 | "sha256:e74b0506fa5aa5598ac6a975a12aa8928cbb58e1f5ac8360792ef15de1aa848f", 386 | "sha256:f0ed05f5079c708fe74bf9027e95125334b6978bf07fd5ab923e9e55e5fbb9d3", 387 | "sha256:f61e2dc5ad442c52b4887f1fdc112f97caeff4d9e6ebe78879364ac59f1663e1", 388 | "sha256:fec520865f42e5c7f050c2a79038897b1c7d1595e907a9e08e3353293ffc948e" 389 | ], 390 | "markers": "python_version >= '3.8'", 391 | "version": "==1.4.0" 392 | }, 393 | "h11": { 394 | "hashes": [ 395 | "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", 396 | "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761" 397 | ], 398 | "markers": "python_version >= '3.7'", 399 | "version": "==0.14.0" 400 | }, 401 | "html2text": { 402 | "hashes": [ 403 | "sha256:c7c629882da0cf377d66f073329ccf34a12ed2adf0169b9285ae4e63ef54c82b", 404 | "sha256:e296318e16b059ddb97f7a8a1d6a5c1d7af4544049a01e261731d2d5cc277bbb" 405 | ], 406 | "index": "pypi", 407 | "version": "==2020.1.16" 408 | }, 409 | "idna": { 410 | "hashes": [ 411 | "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4", 412 | "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2" 413 | ], 414 | "markers": "python_version >= '3.5'", 415 | "version": "==3.4" 416 | }, 417 | "multidict": { 418 | "hashes": [ 419 | "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9", 420 | "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8", 421 | "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03", 422 | "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710", 423 | "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161", 424 | "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664", 425 | "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569", 426 | "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067", 427 | "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313", 428 | "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706", 429 | "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2", 430 | "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636", 431 | "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49", 432 | "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93", 433 | "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603", 434 | "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0", 435 | "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60", 436 | "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4", 437 | "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e", 438 | "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1", 439 | "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60", 440 | "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951", 441 | "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc", 442 | "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe", 443 | "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95", 444 | "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d", 445 | "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8", 446 | "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed", 447 | "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2", 448 | "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775", 449 | "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87", 450 | "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c", 451 | "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2", 452 | "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98", 453 | "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3", 454 | "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe", 455 | "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78", 456 | "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660", 457 | "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176", 458 | "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e", 459 | "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988", 460 | "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c", 461 | "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c", 462 | "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0", 463 | "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449", 464 | "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f", 465 | "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde", 466 | "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5", 467 | "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d", 468 | "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac", 469 | "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a", 470 | "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9", 471 | "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca", 472 | "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11", 473 | "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35", 474 | "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063", 475 | "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b", 476 | "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982", 477 | "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258", 478 | "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1", 479 | "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52", 480 | "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480", 481 | "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7", 482 | "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461", 483 | "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d", 484 | "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc", 485 | "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779", 486 | "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a", 487 | "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547", 488 | "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0", 489 | "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171", 490 | "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf", 491 | "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d", 492 | "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba" 493 | ], 494 | "markers": "python_version >= '3.7'", 495 | "version": "==6.0.4" 496 | }, 497 | "openai": { 498 | "hashes": [ 499 | "sha256:2483095c7db1eee274cebac79e315a986c4e55207bb4fa7b82d185b3a2ed9536", 500 | "sha256:e0a7c2f7da26bdbe5354b03c6d4b82a2f34bd4458c7a17ae1a7092c3e397e03c" 501 | ], 502 | "index": "pypi", 503 | "version": "==0.27.8" 504 | }, 505 | "outcome": { 506 | "hashes": [ 507 | "sha256:6f82bd3de45da303cf1f771ecafa1633750a358436a8bb60e06a1ceb745d2672", 508 | "sha256:c4ab89a56575d6d38a05aa16daeaa333109c1f96167aba8901ab18b6b5e0f7f5" 509 | ], 510 | "markers": "python_version >= '3.7'", 511 | "version": "==1.2.0" 512 | }, 513 | "pycparser": { 514 | "hashes": [ 515 | "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9", 516 | "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206" 517 | ], 518 | "version": "==2.21" 519 | }, 520 | "pysocks": { 521 | "hashes": [ 522 | "sha256:08e69f092cc6dbe92a0fdd16eeb9b9ffbc13cadfe5ca4c7bd92ffb078b293299", 523 | "sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5", 524 | "sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0" 525 | ], 526 | "version": "==1.7.1" 527 | }, 528 | "requests": { 529 | "hashes": [ 530 | "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", 531 | "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1" 532 | ], 533 | "markers": "python_version >= '3.7'", 534 | "version": "==2.31.0" 535 | }, 536 | "selenium": { 537 | "hashes": [ 538 | "sha256:98e72117b194b3fa9c69b48998f44bf7dd4152c7bd98544911a1753b9f03cc7d", 539 | "sha256:9f9a5ed586280a3594f7461eb1d9dab3eac9d91e28572f365e9b98d9d03e02b5" 540 | ], 541 | "markers": "python_version >= '3.7'", 542 | "version": "==4.11.2" 543 | }, 544 | "sniffio": { 545 | "hashes": [ 546 | "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101", 547 | "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384" 548 | ], 549 | "markers": "python_version >= '3.7'", 550 | "version": "==1.3.0" 551 | }, 552 | "sortedcontainers": { 553 | "hashes": [ 554 | "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88", 555 | "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0" 556 | ], 557 | "version": "==2.4.0" 558 | }, 559 | "soupsieve": { 560 | "hashes": [ 561 | "sha256:1c1bfee6819544a3447586c889157365a27e10d88cde3ad3da0cf0ddf646feb8", 562 | "sha256:89d12b2d5dfcd2c9e8c22326da9d9aa9cb3dfab0a83a024f05704076ee8d35ea" 563 | ], 564 | "markers": "python_version >= '3.7'", 565 | "version": "==2.4.1" 566 | }, 567 | "tqdm": { 568 | "hashes": [ 569 | "sha256:1871fb68a86b8fb3b59ca4cdd3dcccbc7e6d613eeed31f4c332531977b89beb5", 570 | "sha256:c4f53a17fe37e132815abceec022631be8ffe1b9381c2e6e30aa70edc99e9671" 571 | ], 572 | "markers": "python_version >= '3.7'", 573 | "version": "==4.65.0" 574 | }, 575 | "trio": { 576 | "hashes": [ 577 | "sha256:3887cf18c8bcc894433420305468388dac76932e9668afa1c49aa3806b6accb3", 578 | "sha256:f43da357620e5872b3d940a2e3589aa251fd3f881b65a608d742e00809b1ec38" 579 | ], 580 | "markers": "python_version >= '3.7'", 581 | "version": "==0.22.2" 582 | }, 583 | "trio-websocket": { 584 | "hashes": [ 585 | "sha256:1a748604ad906a7dcab9a43c6eb5681e37de4793ba0847ef0bc9486933ed027b", 586 | "sha256:a9937d48e8132ebf833019efde2a52ca82d223a30a7ea3e8d60a7d28f75a4e3a" 587 | ], 588 | "markers": "python_version >= '3.7'", 589 | "version": "==0.10.3" 590 | }, 591 | "undetected-chromedriver": { 592 | "hashes": [ 593 | "sha256:355bfc5bc78800795a9a49ef2a1199402d461483f6c0efd7bd7a85809464df6c" 594 | ], 595 | "index": "pypi", 596 | "version": "==3.5.0" 597 | }, 598 | "urllib3": { 599 | "hashes": [ 600 | "sha256:8d22f86aae8ef5e410d4f539fde9ce6b2113a001bb4d189e0aed70642d602b11", 601 | "sha256:de7df1803967d2c2a98e4b11bb7d6bd9210474c46e8a0401514e3a42a75ebde4" 602 | ], 603 | "markers": "python_version >= '3.7'", 604 | "version": "==2.0.4" 605 | }, 606 | "websockets": { 607 | "hashes": [ 608 | "sha256:01f5567d9cf6f502d655151645d4e8b72b453413d3819d2b6f1185abc23e82dd", 609 | "sha256:03aae4edc0b1c68498f41a6772d80ac7c1e33c06c6ffa2ac1c27a07653e79d6f", 610 | "sha256:0ac56b661e60edd453585f4bd68eb6a29ae25b5184fd5ba51e97652580458998", 611 | "sha256:0ee68fe502f9031f19d495dae2c268830df2760c0524cbac5d759921ba8c8e82", 612 | "sha256:1553cb82942b2a74dd9b15a018dce645d4e68674de2ca31ff13ebc2d9f283788", 613 | "sha256:1a073fc9ab1c8aff37c99f11f1641e16da517770e31a37265d2755282a5d28aa", 614 | "sha256:1d2256283fa4b7f4c7d7d3e84dc2ece74d341bce57d5b9bf385df109c2a1a82f", 615 | "sha256:1d5023a4b6a5b183dc838808087033ec5df77580485fc533e7dab2567851b0a4", 616 | "sha256:1fdf26fa8a6a592f8f9235285b8affa72748dc12e964a5518c6c5e8f916716f7", 617 | "sha256:2529338a6ff0eb0b50c7be33dc3d0e456381157a31eefc561771ee431134a97f", 618 | "sha256:279e5de4671e79a9ac877427f4ac4ce93751b8823f276b681d04b2156713b9dd", 619 | "sha256:2d903ad4419f5b472de90cd2d40384573b25da71e33519a67797de17ef849b69", 620 | "sha256:332d126167ddddec94597c2365537baf9ff62dfcc9db4266f263d455f2f031cb", 621 | "sha256:34fd59a4ac42dff6d4681d8843217137f6bc85ed29722f2f7222bd619d15e95b", 622 | "sha256:3580dd9c1ad0701169e4d6fc41e878ffe05e6bdcaf3c412f9d559389d0c9e016", 623 | "sha256:3ccc8a0c387629aec40f2fc9fdcb4b9d5431954f934da3eaf16cdc94f67dbfac", 624 | "sha256:41f696ba95cd92dc047e46b41b26dd24518384749ed0d99bea0a941ca87404c4", 625 | "sha256:42cc5452a54a8e46a032521d7365da775823e21bfba2895fb7b77633cce031bb", 626 | "sha256:4841ed00f1026dfbced6fca7d963c4e7043aa832648671b5138008dc5a8f6d99", 627 | "sha256:4b253869ea05a5a073ebfdcb5cb3b0266a57c3764cf6fe114e4cd90f4bfa5f5e", 628 | "sha256:54c6e5b3d3a8936a4ab6870d46bdd6ec500ad62bde9e44462c32d18f1e9a8e54", 629 | "sha256:619d9f06372b3a42bc29d0cd0354c9bb9fb39c2cbc1a9c5025b4538738dbffaf", 630 | "sha256:6505c1b31274723ccaf5f515c1824a4ad2f0d191cec942666b3d0f3aa4cb4007", 631 | "sha256:660e2d9068d2bedc0912af508f30bbeb505bbbf9774d98def45f68278cea20d3", 632 | "sha256:6681ba9e7f8f3b19440921e99efbb40fc89f26cd71bf539e45d8c8a25c976dc6", 633 | "sha256:68b977f21ce443d6d378dbd5ca38621755f2063d6fdb3335bda981d552cfff86", 634 | "sha256:69269f3a0b472e91125b503d3c0b3566bda26da0a3261c49f0027eb6075086d1", 635 | "sha256:6f1a3f10f836fab6ca6efa97bb952300b20ae56b409414ca85bff2ad241d2a61", 636 | "sha256:7622a89d696fc87af8e8d280d9b421db5133ef5b29d3f7a1ce9f1a7bf7fcfa11", 637 | "sha256:777354ee16f02f643a4c7f2b3eff8027a33c9861edc691a2003531f5da4f6bc8", 638 | "sha256:84d27a4832cc1a0ee07cdcf2b0629a8a72db73f4cf6de6f0904f6661227f256f", 639 | "sha256:8531fdcad636d82c517b26a448dcfe62f720e1922b33c81ce695d0edb91eb931", 640 | "sha256:86d2a77fd490ae3ff6fae1c6ceaecad063d3cc2320b44377efdde79880e11526", 641 | "sha256:88fc51d9a26b10fc331be344f1781224a375b78488fc343620184e95a4b27016", 642 | "sha256:8a34e13a62a59c871064dfd8ffb150867e54291e46d4a7cf11d02c94a5275bae", 643 | "sha256:8c82f11964f010053e13daafdc7154ce7385ecc538989a354ccc7067fd7028fd", 644 | "sha256:92b2065d642bf8c0a82d59e59053dd2fdde64d4ed44efe4870fa816c1232647b", 645 | "sha256:97b52894d948d2f6ea480171a27122d77af14ced35f62e5c892ca2fae9344311", 646 | "sha256:9d9acd80072abcc98bd2c86c3c9cd4ac2347b5a5a0cae7ed5c0ee5675f86d9af", 647 | "sha256:9f59a3c656fef341a99e3d63189852be7084c0e54b75734cde571182c087b152", 648 | "sha256:aa5003845cdd21ac0dc6c9bf661c5beddd01116f6eb9eb3c8e272353d45b3288", 649 | "sha256:b16fff62b45eccb9c7abb18e60e7e446998093cdcb50fed33134b9b6878836de", 650 | "sha256:b30c6590146e53149f04e85a6e4fcae068df4289e31e4aee1fdf56a0dead8f97", 651 | "sha256:b58cbf0697721120866820b89f93659abc31c1e876bf20d0b3d03cef14faf84d", 652 | "sha256:b67c6f5e5a401fc56394f191f00f9b3811fe843ee93f4a70df3c389d1adf857d", 653 | "sha256:bceab846bac555aff6427d060f2fcfff71042dba6f5fca7dc4f75cac815e57ca", 654 | "sha256:bee9fcb41db2a23bed96c6b6ead6489702c12334ea20a297aa095ce6d31370d0", 655 | "sha256:c114e8da9b475739dde229fd3bc6b05a6537a88a578358bc8eb29b4030fac9c9", 656 | "sha256:c1f0524f203e3bd35149f12157438f406eff2e4fb30f71221c8a5eceb3617b6b", 657 | "sha256:c792ea4eabc0159535608fc5658a74d1a81020eb35195dd63214dcf07556f67e", 658 | "sha256:c7f3cb904cce8e1be667c7e6fef4516b98d1a6a0635a58a57528d577ac18a128", 659 | "sha256:d67ac60a307f760c6e65dad586f556dde58e683fab03323221a4e530ead6f74d", 660 | "sha256:dcacf2c7a6c3a84e720d1bb2b543c675bf6c40e460300b628bab1b1efc7c034c", 661 | "sha256:de36fe9c02995c7e6ae6efe2e205816f5f00c22fd1fbf343d4d18c3d5ceac2f5", 662 | "sha256:def07915168ac8f7853812cc593c71185a16216e9e4fa886358a17ed0fd9fcf6", 663 | "sha256:df41b9bc27c2c25b486bae7cf42fccdc52ff181c8c387bfd026624a491c2671b", 664 | "sha256:e052b8467dd07d4943936009f46ae5ce7b908ddcac3fda581656b1b19c083d9b", 665 | "sha256:e063b1865974611313a3849d43f2c3f5368093691349cf3c7c8f8f75ad7cb280", 666 | "sha256:e1459677e5d12be8bbc7584c35b992eea142911a6236a3278b9b5ce3326f282c", 667 | "sha256:e1a99a7a71631f0efe727c10edfba09ea6bee4166a6f9c19aafb6c0b5917d09c", 668 | "sha256:e590228200fcfc7e9109509e4d9125eace2042fd52b595dd22bbc34bb282307f", 669 | "sha256:e6316827e3e79b7b8e7d8e3b08f4e331af91a48e794d5d8b099928b6f0b85f20", 670 | "sha256:e7837cb169eca3b3ae94cc5787c4fed99eef74c0ab9506756eea335e0d6f3ed8", 671 | "sha256:e848f46a58b9fcf3d06061d17be388caf70ea5b8cc3466251963c8345e13f7eb", 672 | "sha256:ed058398f55163a79bb9f06a90ef9ccc063b204bb346c4de78efc5d15abfe602", 673 | "sha256:f2e58f2c36cc52d41f2659e4c0cbf7353e28c8c9e63e30d8c6d3494dc9fdedcf", 674 | "sha256:f467ba0050b7de85016b43f5a22b46383ef004c4f672148a8abf32bc999a87f0", 675 | "sha256:f61bdb1df43dc9c131791fbc2355535f9024b9a04398d3bd0684fc16ab07df74", 676 | "sha256:fb06eea71a00a7af0ae6aefbb932fb8a7df3cb390cc217d51a9ad7343de1b8d0", 677 | "sha256:ffd7dcaf744f25f82190856bc26ed81721508fc5cbf2a330751e135ff1283564" 678 | ], 679 | "markers": "python_version >= '3.7'", 680 | "version": "==11.0.3" 681 | }, 682 | "wsproto": { 683 | "hashes": [ 684 | "sha256:ad565f26ecb92588a3e43bc3d96164de84cd9902482b130d0ddbaa9664a85065", 685 | "sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736" 686 | ], 687 | "markers": "python_full_version >= '3.7.0'", 688 | "version": "==1.2.0" 689 | }, 690 | "yarl": { 691 | "hashes": [ 692 | "sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571", 693 | "sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3", 694 | "sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3", 695 | "sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c", 696 | "sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7", 697 | "sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04", 698 | "sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191", 699 | "sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea", 700 | "sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4", 701 | "sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4", 702 | "sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095", 703 | "sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e", 704 | "sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74", 705 | "sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef", 706 | "sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33", 707 | "sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde", 708 | "sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45", 709 | "sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf", 710 | "sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b", 711 | "sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac", 712 | "sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0", 713 | "sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528", 714 | "sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716", 715 | "sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb", 716 | "sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18", 717 | "sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72", 718 | "sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6", 719 | "sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582", 720 | "sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5", 721 | "sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368", 722 | "sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc", 723 | "sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9", 724 | "sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be", 725 | "sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a", 726 | "sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80", 727 | "sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8", 728 | "sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6", 729 | "sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417", 730 | "sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574", 731 | "sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59", 732 | "sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608", 733 | "sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82", 734 | "sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1", 735 | "sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3", 736 | "sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d", 737 | "sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8", 738 | "sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc", 739 | "sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac", 740 | "sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8", 741 | "sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955", 742 | "sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0", 743 | "sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367", 744 | "sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb", 745 | "sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a", 746 | "sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623", 747 | "sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2", 748 | "sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6", 749 | "sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7", 750 | "sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4", 751 | "sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051", 752 | "sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938", 753 | "sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8", 754 | "sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9", 755 | "sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3", 756 | "sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5", 757 | "sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9", 758 | "sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333", 759 | "sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185", 760 | "sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3", 761 | "sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560", 762 | "sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b", 763 | "sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7", 764 | "sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78", 765 | "sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7" 766 | ], 767 | "markers": "python_version >= '3.7'", 768 | "version": "==1.9.2" 769 | } 770 | }, 771 | "develop": {} 772 | } 773 | --------------------------------------------------------------------------------