├── .github └── workflows │ └── update_poetry_lock.yml ├── .gitignore ├── LICENSE ├── README.md ├── nonebot_plugin_imageutils ├── __init__.py ├── build_image.py ├── config.py ├── fonts.py ├── gradient.py ├── text2image.py └── types.py ├── poetry.lock └── pyproject.toml /.github/workflows/update_poetry_lock.yml: -------------------------------------------------------------------------------- 1 | name: Update poetry.lock 2 | 3 | on: 4 | push: 5 | branches: 6 | - "main" 7 | paths: 8 | - "pyproject.toml" 9 | 10 | jobs: 11 | update-and-push: 12 | runs-on: ubuntu-latest 13 | steps: 14 | - uses: actions/checkout@v3 15 | 16 | - name: Setup python 17 | uses: actions/setup-python@v3 18 | with: 19 | python-version: "3.10" 20 | 21 | - name: Setup Poetry 22 | uses: Gr1N/setup-poetry@v7 23 | 24 | - name: Update poetry.lock 25 | run: poetry update --lock 26 | 27 | - name: Commit & Push changes 28 | uses: actions-js/push@master 29 | with: 30 | github_token: ${{ secrets.GITHUB_TOKEN }} 31 | branch: "main" 32 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *__pycache__/ 2 | dist/ 3 | .vscode/ 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 MeetWq 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 | ## nonebot-plugin-imageutils 2 | 3 | > 本仓库将在一段时间后停止维护 4 | > 5 | > 推荐使用 非NoneBot插件的版本 [pil-utils](https://github.com/MeetWq/pil-utils) 6 | > 7 | > 非插件版除没有配置项外,与插件版功能基本一致 8 | 9 | 10 | ### 功能 11 | 12 | - 提供 `BuildImage` 类,方便图片尺寸修改、添加文字等操作 13 | - 提供 `Text2Image` 类,方便实现文字转图,支持少量 `BBCode` 标签 14 | - 文字支持多种字体切换,能够支持 `emoji` 15 | - 添加文字自动调节字体大小 16 | 17 | 18 | ### 安装 19 | 20 | - 使用 nb-cli 21 | 22 | ``` 23 | nb plugin install nonebot_plugin_imageutils 24 | ``` 25 | 26 | - 使用 pip 27 | 28 | ``` 29 | pip install nonebot_plugin_imageutils 30 | ``` 31 | 32 | 33 | ### 配置字体 34 | 35 | 本插件选择了一些不同系统上的字体,以支持更多的字符 36 | 37 | > 对于 `Ubuntu` 系统,建议安装 `fonts-noto` 软件包 以支持中文字体和 emoji 38 | > 39 | > 并将简体中文设置为默认语言:(否则会有部分中文显示为异体(日文)字形,详见 [ArchWiki](https://wiki.archlinux.org/title/Localization_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)/Simplified_Chinese_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)#%E4%BF%AE%E6%AD%A3%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87%E6%98%BE%E7%A4%BA%E4%B8%BA%E5%BC%82%E4%BD%93%EF%BC%88%E6%97%A5%E6%96%87%EF%BC%89%E5%AD%97%E5%BD%A2)) 40 | > ```bash 41 | > sudo apt install fonts-noto 42 | > sudo locale-gen zh_CN zh_CN.UTF-8 43 | > sudo update-locale LC_ALL=zh_CN.UTF-8 LANG=zh_CN.UTF-8 44 | > fc-cache -fv 45 | > ``` 46 | 47 | 默认备选字体列表如下: 48 | ``` 49 | "Arial", "Tahoma", "Helvetica Neue", "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans SC", "Noto Sans CJK JP", "WenQuanYi Micro Hei", "Apple Color Emoji", "Noto Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol" 50 | ``` 51 | 52 | 可在 `.env.*` 文件中添加 `default_fallback_fonts` 变量 来自定义备选字体 53 | 54 | 字体文件需要在系统目录下,或放置于自定义字体路径中 55 | 56 | 自定义字体路径默认为机器人运行目录下的 `data/fonts/` 文件夹, 57 | 58 | 可在 `.env.*` 文件中添加 `custom_font_path` 变量 自定义字体路径 59 | 60 | 其他插件可以通过 `nonebot_plugin_imageutils/fonts.py` 中的 `add_font` 函数往字体文件夹中添加字体 61 | 62 | 63 | ### 使用示例 64 | 65 | 66 | - `BuildImage` 67 | 68 | ```python 69 | from nonebot_plugin_imageutils import BuildImage 70 | 71 | # output: BytesIO 72 | output = BuildImage.new((300, 300)).circle().draw_text((30, 30, 270, 270), "测试ymddl😂").save_jpg() 73 | ``` 74 | 75 | ![1.jpg](https://s2.loli.net/2022/05/19/gFdpwWPCzreb2X6.jpg) 76 | 77 | 78 | - `Text2Image` 79 | 80 | ```python 81 | from nonebot_plugin_imageutils import Text2Image 82 | 83 | # img: PIL.Image.Image 84 | img = Text2Image.from_text("@mnixry 🤗", 50).to_image() 85 | 86 | # 以上结果为 PIL 的 Image 格式,若要直接 MessageSegment 发送,可以转为 BytesIO 87 | output = BytesIO() 88 | img.save(output, format="png") 89 | await matcher.send(MessageSegment.image(output)) 90 | ``` 91 | 92 | ![2.png](https://s2.loli.net/2022/05/19/14EXViZQwcGUW5I.png) 93 | 94 | 95 | - 使用 `BBCode` 96 | 97 | ```python 98 | from nonebot_plugin_imageutils import text2image 99 | 100 | # img: PIL.Image.Image 101 | img = text2image("N[size=40][color=red]o[/color][/size]neBo[size=30][color=blue]T[/color][/size]\n[align=center]太强啦[/align]") 102 | 103 | # 以上结果为 PIL 的 Image 格式,若要直接 MessageSegment 发送,可以转为 BytesIO 104 | output = BytesIO() 105 | img.save(output, format="png") 106 | await matcher.send(MessageSegment.image(output)) 107 | ``` 108 | 109 | ![3.png](https://s2.loli.net/2022/05/19/VZAXsKB2x65q7rl.png) 110 | 111 | 目前支持的 `BBCode` 标签: 112 | - `[align=left|right|center][/align]`: 文字对齐方式 113 | - `[color=#66CCFF|red|black][/color]`: 字体颜色 114 | - `[stroke=#66CCFF|red|black][/stroke]`: 描边颜色 115 | - `[font=msyh.ttc][/font]`: 文字字体 116 | - `[size=30][/size]`: 文字大小 117 | - `[b][/b]`: 文字加粗 118 | 119 | 120 | ### 特别感谢 121 | 122 | - [HibiKier/zhenxun_bot](https://github.com/HibiKier/zhenxun_bot) 基于 Nonebot2 和 go-cqhttp 开发,以 postgresql 作为数据库,非常可爱的绪山真寻bot 123 | -------------------------------------------------------------------------------- /nonebot_plugin_imageutils/__init__.py: -------------------------------------------------------------------------------- 1 | from .build_image import BuildImage 2 | from .text2image import Text2Image, text2image 3 | -------------------------------------------------------------------------------- /nonebot_plugin_imageutils/build_image.py: -------------------------------------------------------------------------------- 1 | import cv2 2 | import numpy as np 3 | from io import BytesIO 4 | from pathlib import Path 5 | from PIL import Image, ImageDraw 6 | from PIL.ImageColor import getrgb 7 | from PIL.Image import Image as IMG 8 | from PIL.ImageFilter import Filter 9 | from PIL.ImageDraw import ImageDraw as Draw 10 | from typing import List, Optional, Type, Union 11 | 12 | from .types import * 13 | from .gradient import Gradient 14 | from .text2image import Text2Image 15 | 16 | 17 | class BuildImage: 18 | def __init__(self, image: IMG): 19 | self.image = image 20 | 21 | @property 22 | def width(self) -> int: 23 | return self.image.width 24 | 25 | @property 26 | def height(self) -> int: 27 | return self.image.height 28 | 29 | @property 30 | def size(self) -> SizeType: 31 | return self.image.size 32 | 33 | @property 34 | def mode(self) -> ModeType: 35 | return self.image.mode # type: ignore 36 | 37 | @property 38 | def draw(self) -> Draw: 39 | return ImageDraw.Draw(self.image) 40 | 41 | @classmethod 42 | def new( 43 | cls, mode: ModeType, size: SizeType, color: Optional[ColorType] = None 44 | ) -> "BuildImage": 45 | return cls(Image.new(mode, size, color)) # type: ignore 46 | 47 | @classmethod 48 | def open(cls, file: Union[str, BytesIO, Path]) -> "BuildImage": 49 | return cls(Image.open(file)) 50 | 51 | def copy(self) -> "BuildImage": 52 | return BuildImage(self.image.copy()) 53 | 54 | def resize( 55 | self, 56 | size: SizeType, 57 | resample: ResampleType = Image.ANTIALIAS, 58 | keep_ratio: bool = False, 59 | inside: bool = False, 60 | direction: DirectionType = "center", 61 | bg_color: Optional[ColorType] = None, 62 | **kwargs, 63 | ) -> "BuildImage": 64 | """ 65 | 调整图片尺寸 66 | 67 | :参数: 68 | * ``size``: 期望图片大小 69 | * ``keep_ratio``: 是否保持长宽比,默认为 `False` 70 | * ``inside``: `keep_ratio` 为 `True` 时, 71 | 若 `inside` 为 `True`,则调整图片大小至包含于期望尺寸,不足部分设为指定颜色; 72 | 若 `inside` 为 `False`,则调整图片大小至包含期望尺寸,超出部分裁剪 73 | * ``direction``: 调整图片大小时图片的方位;默认为居中 74 | * ``bg_color``: 不足部分设置的颜色 75 | """ 76 | width, height = size 77 | if keep_ratio: 78 | if inside: 79 | ratio = min(width / self.width, height / self.height) 80 | else: 81 | ratio = max(width / self.width, height / self.height) 82 | width = int(self.width * ratio) 83 | height = int(self.height * ratio) 84 | 85 | image = BuildImage( 86 | self.image.resize((width, height), resample=resample, **kwargs) 87 | ) 88 | 89 | if keep_ratio: 90 | image = image.resize_canvas(size, direction, bg_color) 91 | return image 92 | 93 | def resize_canvas( 94 | self, 95 | size: SizeType, 96 | direction: DirectionType = "center", 97 | bg_color: Optional[ColorType] = None, 98 | ) -> "BuildImage": 99 | """ 100 | 调整“画布”大小,超出部分裁剪,不足部分设为指定颜色 101 | 102 | :参数: 103 | * ``size``: 期望图片大小 104 | * ``direction``: 调整图片大小时图片的方位;默认为居中 105 | * ``bg_color``: 不足部分设置的颜色 106 | """ 107 | w, h = size 108 | x = int((w - self.width) / 2) 109 | y = int((h - self.height) / 2) 110 | if direction in ["north", "northwest", "northeast"]: 111 | y = 0 112 | elif direction in ["south", "southwest", "southeast"]: 113 | y = h - self.height 114 | if direction in ["west", "northwest", "southwest"]: 115 | x = 0 116 | elif direction in ["east", "northeast", "southeast"]: 117 | x = w - self.width 118 | image = BuildImage.new(self.mode, size, bg_color) 119 | image.paste(self.image, (x, y)) 120 | return image 121 | 122 | def resize_width(self, width: int, **kwargs) -> "BuildImage": 123 | """调整图片宽度,不改变长宽比""" 124 | return self.resize((width, int(self.height * width / self.width)), **kwargs) 125 | 126 | def resize_height(self, height: int, **kwargs) -> "BuildImage": 127 | """调整图片高度,不改变长宽比""" 128 | return self.resize((int(self.width * height / self.height), height), **kwargs) 129 | 130 | def rotate( 131 | self, 132 | angle: float, 133 | resample: ResampleType = Image.BICUBIC, 134 | expand: bool = False, 135 | **kwargs, 136 | ) -> "BuildImage": 137 | """旋转图片""" 138 | image = BuildImage( 139 | self.image.rotate(angle, resample=resample, expand=expand, **kwargs) 140 | ) 141 | return image 142 | 143 | def square(self) -> "BuildImage": 144 | """将图片裁剪为方形""" 145 | length = min(self.width, self.height) 146 | return self.resize_canvas((length, length)) 147 | 148 | def circle(self) -> "BuildImage": 149 | """将图片裁剪为圆形""" 150 | image = self.square().image.convert("RGBA") 151 | mask = Image.new("L", (image.width * 5, image.height * 5), 0) 152 | draw = ImageDraw.Draw(mask) 153 | draw.ellipse((0, 0, mask.width, mask.height), 255) 154 | mask = mask.resize(image.size, Image.ANTIALIAS) 155 | bg = Image.new("RGBA", image.size, (255, 255, 255, 0)) 156 | return BuildImage(Image.composite(image, bg, mask)) 157 | 158 | def circle_corner(self, r: float) -> "BuildImage": 159 | """将图片裁剪为圆角矩形""" 160 | image = self.image.convert("RGBA") 161 | mask = Image.new("L", (image.width * 5, image.height * 5), 0) 162 | draw = ImageDraw.Draw(mask) 163 | draw.rounded_rectangle((0, 0, mask.width, mask.height), r * 5, fill=255) 164 | mask = mask.resize(image.size, Image.ANTIALIAS) 165 | bg = Image.new("RGBA", image.size, (255, 255, 255, 0)) 166 | return BuildImage(Image.composite(image, bg, mask)) 167 | 168 | def crop(self, box: BoxType) -> "BuildImage": 169 | """裁剪图片""" 170 | return BuildImage(self.image.crop(box)) 171 | 172 | def convert(self, mode: ModeType, **kwargs) -> "BuildImage": 173 | return BuildImage(self.image.convert(mode, **kwargs)) 174 | 175 | def paste( 176 | self, 177 | img: Union[IMG, "BuildImage"], 178 | pos: PosTypeInt = (0, 0), 179 | alpha: bool = False, 180 | below: bool = False, 181 | ) -> "BuildImage": 182 | """ 183 | 粘贴图片 184 | 185 | :参数: 186 | * ``img``: 待粘贴的图片 187 | * ``pos``: 粘贴位置 188 | * ``alpha``: 图片背景是否为透明 189 | * ``below``: 是否粘贴到底层 190 | """ 191 | if isinstance(img, BuildImage): 192 | img = img.image 193 | new_img = Image.new(self.mode, self.size) if below else self.image.copy() 194 | if alpha: 195 | img = img.convert("RGBA") 196 | new_img.paste(img, pos, mask=img) 197 | else: 198 | new_img.paste(img, pos) 199 | if below: 200 | new_img.paste(self.image, mask=self.image if self.mode == "RGBA" else None) 201 | self.image = new_img 202 | return self 203 | 204 | def alpha_composite( 205 | self, 206 | img: Union[IMG, "BuildImage"], 207 | dest: PosTypeInt = (0, 0), 208 | source: Union[PosTypeInt, BoxType] = (0, 0), 209 | ) -> "BuildImage": 210 | if isinstance(img, BuildImage): 211 | img = img.image 212 | return BuildImage(self.image.alpha_composite(img, dest=dest, source=source)) # type: ignore 213 | 214 | def filter(self, filter: Union[Filter, Type[Filter]]) -> "BuildImage": 215 | """滤波""" 216 | return BuildImage(self.image.filter(filter)) 217 | 218 | def transpose(self, method: TransposeType) -> "BuildImage": 219 | """变换""" 220 | return BuildImage(self.image.transpose(method)) 221 | 222 | def perspective(self, points: PointsTYpe) -> "BuildImage": 223 | """ 224 | 透视变换 225 | 226 | :参数: 227 | * ``points``: 变换后点的位置,顺序依次为:左上->右上->右下->左下 228 | """ 229 | 230 | def find_coeffs(pa: PointsTYpe, pb: PointsTYpe): 231 | matrix = [] 232 | for p1, p2 in zip(pa, pb): 233 | matrix.append( 234 | [p1[0], p1[1], 1, 0, 0, 0, -p2[0] * p1[0], -p2[0] * p1[1]] 235 | ) 236 | matrix.append( 237 | [0, 0, 0, p1[0], p1[1], 1, -p2[1] * p1[0], -p2[1] * p1[1]] 238 | ) 239 | A = np.matrix(matrix, dtype=np.float32) 240 | B = np.array(pb).reshape(8) 241 | res = np.dot(np.linalg.inv(A.T * A) * A.T, B) 242 | return np.array(res).reshape(8) 243 | 244 | img_w, img_h = self.size 245 | points_w = [p[0] for p in points] 246 | points_h = [p[1] for p in points] 247 | new_w = int(max(points_w) - min(points_w)) 248 | new_h = int(max(points_h) - min(points_h)) 249 | p = ((0, 0), (img_w, 0), (img_w, img_h), (0, img_h)) 250 | coeffs = find_coeffs(points, p) 251 | return BuildImage( 252 | self.image.transform( 253 | (new_w, new_h), Image.PERSPECTIVE, coeffs, Image.BICUBIC 254 | ) 255 | ) 256 | 257 | def gradient_color(self, gradient: Gradient) -> "BuildImage": 258 | """ 259 | 渐变色 260 | 261 | :参数: 262 | * ``gradient``: 渐变对象 263 | """ 264 | return BuildImage(gradient.create_image(self.size)) 265 | 266 | def motion_blur(self, angle: float = 0, degree: int = 0) -> "BuildImage": 267 | """ 268 | 运动模糊 269 | 270 | :参数: 271 | * ``angle``: 运动方向 272 | * ``degree``: 模糊程度 273 | """ 274 | if degree == 0: 275 | return self.copy() 276 | matrix = cv2.getRotationMatrix2D((degree / 2, degree / 2), angle + 45, 1) 277 | kernel = np.diag(np.ones(degree)) 278 | kernel = cv2.warpAffine(kernel, matrix, (degree, degree)) / degree 279 | blurred = cv2.filter2D(np.asarray(self.image), -1, kernel) 280 | cv2.normalize(blurred, blurred, 0, 255, cv2.NORM_MINMAX) 281 | return BuildImage(Image.fromarray(np.array(blurred, dtype=np.uint8))) 282 | 283 | def distort(self, coefficients: DistortType) -> "BuildImage": 284 | """ 285 | 畸变 286 | 287 | :参数: 288 | * ``coefficients``: 畸变参数 289 | """ 290 | res = cv2.undistort( 291 | np.asarray(self.image), 292 | np.array([[100, 0, self.width / 2], [0, 100, self.height / 2], [0, 0, 1]]), 293 | np.asarray(coefficients), 294 | ) 295 | return BuildImage(Image.fromarray(np.array(res, dtype=np.uint8))) 296 | 297 | def color_mask(self, color: ColorType) -> "BuildImage": 298 | """ 299 | 颜色滤镜,改变图片色调 300 | 301 | :参数: 302 | * ``color``: 目标颜色 303 | """ 304 | img = self.image.convert("RGB") 305 | w, h = img.size 306 | img_array = np.asarray(img) 307 | img_gray = cv2.cvtColor(img_array, cv2.COLOR_RGB2GRAY) 308 | img_hsl = cv2.cvtColor(img_array, cv2.COLOR_RGB2HLS) 309 | img_new = np.zeros((h, w, 3), np.uint8) 310 | 311 | if isinstance(color, str): 312 | color = getrgb(color) 313 | r = color[0] 314 | g = color[1] 315 | b = color[2] 316 | rgb_sum = sum(color) 317 | for i in range(h): 318 | for j in range(w): 319 | value = img_gray[i, j] 320 | new_color = ( 321 | [ 322 | int(value * r / rgb_sum), 323 | int(value * g / rgb_sum), 324 | int(value * b / rgb_sum), 325 | ] 326 | if rgb_sum 327 | else [0, 0, 0] 328 | ) 329 | img_new[i, j] = new_color 330 | img_new_hsl = cv2.cvtColor(img_new, cv2.COLOR_RGB2HLS) 331 | result = np.dstack( 332 | (img_new_hsl[:, :, 0], img_hsl[:, :, 1], img_new_hsl[:, :, 2]) 333 | ) 334 | result = cv2.cvtColor(result, cv2.COLOR_HLS2RGB) 335 | return BuildImage(Image.fromarray(result)) 336 | 337 | def draw_point( 338 | self, pos: PosTypeFloat, fill: Optional[ColorType] = None 339 | ) -> "BuildImage": 340 | """在图片上画点""" 341 | self.draw.point(pos, fill=fill) 342 | return self 343 | 344 | def draw_line( 345 | self, 346 | xy: XYType, 347 | fill: Optional[ColorType] = None, 348 | width: float = 1, 349 | ) -> "BuildImage": 350 | """在图片上画直线""" 351 | self.draw.line(xy, fill=fill, width=width) 352 | return self 353 | 354 | def draw_rectangle( 355 | self, 356 | xy: XYType, 357 | fill: Optional[ColorType] = None, 358 | outline: Optional[ColorType] = None, 359 | width: float = 1, 360 | ) -> "BuildImage": 361 | """在图片上画矩形""" 362 | self.draw.rectangle(xy, fill, outline, width) 363 | return self 364 | 365 | def draw_rounded_rectangle( 366 | self, 367 | xy: XYType, 368 | radius: int = 0, 369 | fill: Optional[ColorType] = None, 370 | outline: Optional[ColorType] = None, 371 | width: float = 1, 372 | ) -> "BuildImage": 373 | """在图片上画圆角矩形""" 374 | self.draw.rounded_rectangle(xy, radius, fill, outline, width) 375 | return self 376 | 377 | def draw_polygon( 378 | self, 379 | xy: List[PosTypeFloat], 380 | fill: Optional[ColorType] = None, 381 | outline: Optional[ColorType] = None, 382 | width: float = 1, 383 | ) -> "BuildImage": 384 | """在图片上画多边形""" 385 | self.draw.polygon(xy, fill, outline, width) 386 | return self 387 | 388 | def draw_arc( 389 | self, 390 | xy: XYType, 391 | start: float, 392 | end: float, 393 | fill: Optional[ColorType] = None, 394 | width: float = 1, 395 | ) -> "BuildImage": 396 | """在图片上画圆弧""" 397 | self.draw.arc(xy, start, end, fill, width) 398 | return self 399 | 400 | def draw_ellipse( 401 | self, 402 | xy: XYType, 403 | fill: Optional[ColorType] = None, 404 | outline: Optional[ColorType] = None, 405 | width: float = 1, 406 | ) -> "BuildImage": 407 | """在图片上画圆""" 408 | self.draw.ellipse(xy, fill, outline, width) 409 | return self 410 | 411 | def draw_text( 412 | self, 413 | xy: Union[PosTypeFloat, XYType], 414 | text: str, 415 | *, 416 | fontsize: int = 16, 417 | max_fontsize: int = 30, 418 | min_fontsize: int = 12, 419 | allow_wrap: bool = False, 420 | style: FontStyle = "normal", 421 | weight: FontWeight = "normal", 422 | fill: ColorType = "black", 423 | spacing: int = 4, 424 | halign: HAlignType = "center", 425 | valign: VAlignType = "center", 426 | lines_align: HAlignType = "left", 427 | stroke_ratio: float = 0, 428 | stroke_fill: Optional[ColorType] = None, 429 | font_fallback: bool = True, 430 | fontname: str = "", 431 | fallback_fonts: List[str] = [], 432 | ) -> "BuildImage": 433 | """ 434 | 在图片上指定区域画文字 435 | 436 | :参数: 437 | * ``xy``: 文字位置或文字区域;传入 4 个参数时为文字区域,顺序依次为 左,上,右,下 438 | * ``text``: 文字,支持多行 439 | * ``fontsize``: 字体大小 440 | * ``max_fontsize``: 允许的最大字体大小 441 | * ``min_fontsize``: 允许的最小字体大小 442 | * ``allow_wrap``: 是否允许折行 443 | * ``style``: 字体样式,默认为 "normal" 444 | * ``weight``: 字体粗细,默认为 "normal" 445 | * ``fill``: 文字颜色 446 | * ``spacing``: 多行文字间距 447 | * ``halign``: 横向对齐方式,默认为居中 448 | * ``valign``: 纵向对齐方式,默认为居中 449 | * ``lines_align``: 多行文字对齐方式,默认为靠左 450 | * ``stroke_ratio``: 文字描边的比例,即 描边宽度 / 字体大小 451 | * ``stroke_fill``: 描边颜色 452 | * ``font_fallback``: 是否使用后备字体,默认为 `True` 453 | * ``fontname``: 指定首选字体 454 | * ``fallback_fonts``: 指定备选字体 455 | """ 456 | 457 | if len(xy) == 2: 458 | text2img = Text2Image.from_bbcode_text( 459 | text, 460 | fontsize, 461 | fill, 462 | spacing, 463 | lines_align, 464 | stroke_ratio, 465 | stroke_fill, 466 | font_fallback, 467 | fontname, 468 | fallback_fonts, 469 | ) 470 | text2img.draw_on_image(self.image, xy) 471 | return self 472 | 473 | left = xy[0] 474 | top = xy[1] 475 | width = xy[2] - xy[0] 476 | height = xy[3] - xy[1] 477 | fontsize = max_fontsize 478 | while True: 479 | text2img = Text2Image.from_text( 480 | text, 481 | fontsize, 482 | style, 483 | weight, 484 | fill, 485 | spacing, 486 | lines_align, 487 | int(fontsize * stroke_ratio), 488 | stroke_fill, 489 | font_fallback, 490 | fontname, 491 | fallback_fonts, 492 | ) 493 | text_w = text2img.width 494 | text_h = text2img.height 495 | if text_w > width and allow_wrap: 496 | text2img.wrap(width) 497 | text_w = text2img.width 498 | text_h = text2img.height 499 | if text_w > width or text_h > height: 500 | fontsize -= 1 501 | if fontsize < min_fontsize: 502 | raise ValueError("在指定的区域和字体大小范围内画不下这段文字") 503 | else: 504 | x = left # "left" 505 | if halign == "center": 506 | x += (width - text_w) / 2 507 | elif halign == "right": 508 | x += width - text_w 509 | 510 | y = top # "top" 511 | if valign == "center": 512 | y += (height - text_h) / 2 513 | elif valign == "bottom": 514 | y += height - text_h 515 | 516 | text2img.draw_on_image(self.image, (x, y)) 517 | return self 518 | 519 | def draw_bbcode_text( 520 | self, 521 | xy: Union[PosTypeFloat, XYType], 522 | text: str, 523 | *, 524 | fontsize: int = 16, 525 | max_fontsize: int = 30, 526 | min_fontsize: int = 12, 527 | allow_wrap: bool = False, 528 | fill: ColorType = "black", 529 | spacing: int = 4, 530 | halign: HAlignType = "center", 531 | valign: VAlignType = "center", 532 | lines_align: HAlignType = "left", 533 | stroke_ratio: float = 0, 534 | stroke_fill: Optional[ColorType] = None, 535 | font_fallback: bool = True, 536 | fontname: str = "", 537 | fallback_fonts: List[str] = [], 538 | ) -> "BuildImage": 539 | """ 540 | 在图片上指定区域画文字 541 | 542 | :参数: 543 | * ``xy``: 文字位置或文字区域;传入 4 个参数时为文字区域,顺序依次为 左,上,右,下 544 | * ``text``: 文字,支持多行 545 | * ``fontsize``: 字体大小 546 | * ``max_fontsize``: 允许的最大字体大小 547 | * ``min_fontsize``: 允许的最小字体大小 548 | * ``allow_wrap``: 是否允许折行 549 | * ``fill``: 文字颜色 550 | * ``spacing``: 多行文字间距 551 | * ``halign``: 横向对齐方式,默认为居中 552 | * ``valign``: 纵向对齐方式,默认为居中 553 | * ``lines_align``: 多行文字对齐方式,默认为靠左 554 | * ``stroke_ratio``: 文字描边的比例,即 描边宽度 / 字体大小 555 | * ``stroke_fill``: 描边颜色 556 | * ``font_fallback``: 是否使用后备字体,默认为 `True` 557 | * ``fontname``: 指定首选字体 558 | * ``fallback_fonts``: 指定备选字体 559 | """ 560 | 561 | if len(xy) == 2: 562 | text2img = Text2Image.from_bbcode_text( 563 | text, 564 | fontsize, 565 | fill, 566 | spacing, 567 | lines_align, 568 | stroke_ratio, 569 | stroke_fill, 570 | font_fallback, 571 | fontname, 572 | fallback_fonts, 573 | ) 574 | text2img.draw_on_image(self.image, xy) 575 | return self 576 | 577 | left = xy[0] 578 | top = xy[1] 579 | width = xy[2] - xy[0] 580 | height = xy[3] - xy[1] 581 | fontsize = max_fontsize 582 | while True: 583 | text2img = Text2Image.from_bbcode_text( 584 | text, 585 | fontsize, 586 | fill, 587 | spacing, 588 | lines_align, 589 | stroke_ratio, 590 | stroke_fill, 591 | font_fallback, 592 | fontname, 593 | fallback_fonts, 594 | ) 595 | text_w = text2img.width 596 | text_h = text2img.height 597 | if text_w > width and allow_wrap: 598 | text2img.wrap(width) 599 | text_w = text2img.width 600 | text_h = text2img.height 601 | if text_w > width or text_h > height: 602 | fontsize -= 1 603 | if fontsize < min_fontsize: 604 | raise ValueError("在指定的区域和字体大小范围内画不下这段文字") 605 | else: 606 | x = left # "left" 607 | if halign == "center": 608 | x += (width - text_w) / 2 609 | elif halign == "right": 610 | x += width - text_w 611 | 612 | y = top # "top" 613 | if valign == "center": 614 | y += (height - text_h) / 2 615 | elif valign == "bottom": 616 | y += height - text_h 617 | 618 | text2img.draw_on_image(self.image, (x, y)) 619 | return self 620 | 621 | def save(self, format: str, **params) -> BytesIO: 622 | output = BytesIO() 623 | self.image.save(output, format, **params) 624 | return output 625 | 626 | def save_jpg(self, bg_color: ColorType = "white") -> BytesIO: 627 | """ 628 | 保存图片为 jpg 格式 629 | 630 | :参数: 631 | * ``bg_color``: 由 png 转为 jpg 时的背景颜色,默认为白色 632 | """ 633 | if self.mode == "RGBA": 634 | img = self.new("RGBA", self.size, bg_color) 635 | img.paste(self.image, alpha=True) 636 | else: 637 | img = self 638 | return img.convert("RGB").save("jpeg") 639 | 640 | def save_png(self) -> BytesIO: 641 | """保存图片为 png 格式""" 642 | return self.convert("RGBA").save("png") 643 | -------------------------------------------------------------------------------- /nonebot_plugin_imageutils/config.py: -------------------------------------------------------------------------------- 1 | from typing import List 2 | from pathlib import Path 3 | from pydantic import BaseModel, Extra 4 | 5 | 6 | class Config(BaseModel, extra=Extra.ignore): 7 | custom_font_path: Path = Path("data/fonts") 8 | default_fallback_fonts: List[str] = [ 9 | "Arial", 10 | "Tahoma", 11 | "Helvetica Neue", 12 | "Segoe UI", 13 | "PingFang SC", 14 | "Hiragino Sans GB", 15 | "Microsoft YaHei", 16 | "Source Han Sans SC", 17 | "Noto Sans SC", 18 | "Noto Sans CJK JP", 19 | "WenQuanYi Micro Hei", 20 | "Apple Color Emoji", 21 | "Noto Color Emoji", 22 | "Segoe UI Emoji", 23 | "Segoe UI Symbol", 24 | ] 25 | -------------------------------------------------------------------------------- /nonebot_plugin_imageutils/fonts.py: -------------------------------------------------------------------------------- 1 | import anyio 2 | import httpx 3 | import shutil 4 | import traceback 5 | from pathlib import Path 6 | from PIL import ImageFont 7 | from functools import lru_cache 8 | from fontTools.ttLib import TTFont 9 | from collections import namedtuple 10 | from PIL.ImageFont import FreeTypeFont 11 | from matplotlib.ft2font import FT2Font 12 | from typing import List, Union, Optional, Set, Iterator 13 | from matplotlib.font_manager import FontManager, FontProperties 14 | 15 | from .types import * 16 | from .config import Config 17 | 18 | try: 19 | from nonebot import get_driver 20 | from nonebot.log import logger 21 | 22 | imageutils_config = Config.parse_obj(get_driver().config.dict()) 23 | except: 24 | import loguru 25 | 26 | logger = loguru.logger 27 | imageutils_config = Config() 28 | 29 | FONT_PATH = imageutils_config.custom_font_path 30 | 31 | font_manager = FontManager() 32 | 33 | 34 | def local_fonts() -> Iterator[str]: 35 | if not FONT_PATH.exists(): 36 | return 37 | for f in FONT_PATH.iterdir(): 38 | if f.is_file() and f.suffix in [".otf", ".ttf", ".ttc", ".afm"]: 39 | yield f.name 40 | 41 | 42 | def add_font_to_manager(path: Union[str, Path]): 43 | try: 44 | if isinstance(path, Path): 45 | path = str(path.resolve()) 46 | font_manager.addfont(path) 47 | except OSError as exc: 48 | logger.warning(f"Failed to open font file {path}: {exc}") 49 | except Exception as exc: 50 | logger.warning(f"Failed to extract font properties from {path}: {exc}") 51 | 52 | 53 | for fontname in local_fonts(): 54 | add_font_to_manager(FONT_PATH / fontname) 55 | 56 | 57 | class Font: 58 | def __init__(self, family: str, fontpath: Path, valid_size: Optional[int] = None): 59 | self.family = family 60 | """字体族名字""" 61 | self.path = fontpath.resolve() 62 | """字体文件路径""" 63 | self.valid_size = valid_size 64 | """某些字体不支持缩放,只能以特定的大小加载""" 65 | self._glyph_table: Set[int] = set() 66 | for table in TTFont(self.path, fontNumber=0)["cmap"].tables: # type: ignore 67 | for key in table.cmap.keys(): 68 | self._glyph_table.add(key) 69 | 70 | @classmethod 71 | @lru_cache() 72 | def find( 73 | cls, 74 | family: str, 75 | style: FontStyle = "normal", 76 | weight: FontWeight = "normal", 77 | fallback_to_default: bool = True, 78 | ) -> "Font": 79 | """查找插件路径和系统路径下的字体""" 80 | font = cls.find_special_font(family) 81 | if font: 82 | return font 83 | font = cls.find_local_font(family) 84 | if font: 85 | return font 86 | font = cls.find_pil_font(family) 87 | if font: 88 | return font 89 | filepath = font_manager.findfont( 90 | FontProperties(family, style=style, weight=weight), # type: ignore 91 | fallback_to_default=fallback_to_default, 92 | ) 93 | font = FT2Font(filepath) 94 | return cls(font.family_name, Path(font.fname)) 95 | 96 | @classmethod 97 | def find_local_font(cls, name: str) -> Optional["Font"]: 98 | """查找插件路径下的字体""" 99 | for fontname in local_fonts(): 100 | if name == fontname or name == fontname.split(".")[0]: 101 | fontpath = FONT_PATH / fontname 102 | return cls(fontname, fontpath) 103 | 104 | @classmethod 105 | def find_pil_font(cls, name: str) -> Optional["Font"]: 106 | """通过 PIL ImageFont 查找系统字体""" 107 | try: 108 | font = ImageFont.truetype(name, 20) 109 | fontpath = Path(str(font.path)) 110 | return cls(name, fontpath) 111 | except OSError: 112 | pass 113 | 114 | @classmethod 115 | def find_special_font(cls, family: str) -> Optional["Font"]: 116 | """查找特殊字体,主要是不可缩放的emoji字体""" 117 | 118 | SpecialFont = namedtuple("SpecialFont", ["family", "fontname", "valid_size"]) 119 | SPECIAL_FONTS = { 120 | "Apple Color Emoji": SpecialFont( 121 | "Apple Color Emoji", "Apple Color Emoji.ttc", 160 122 | ), 123 | "Noto Color Emoji": SpecialFont( 124 | "Noto Color Emoji", "NotoColorEmoji.ttf", 109 125 | ), 126 | } 127 | 128 | if family in SPECIAL_FONTS: 129 | prop = SPECIAL_FONTS[family] 130 | fontname = prop.fontname 131 | valid_size = prop.valid_size 132 | fontpath = None 133 | if fontname in local_fonts(): 134 | fontpath = FONT_PATH / fontname 135 | else: 136 | try: 137 | font = ImageFont.truetype(fontname, valid_size) 138 | fontpath = Path(str(font.path)) 139 | except OSError: 140 | pass 141 | if fontpath: 142 | return cls(family, fontpath, valid_size) 143 | 144 | @lru_cache() 145 | def load_font(self, fontsize: int) -> FreeTypeFont: 146 | """以指定大小加载字体""" 147 | return ImageFont.truetype(str(self.path), fontsize, encoding="utf-8") 148 | 149 | @lru_cache() 150 | def has_char(self, char: str) -> bool: 151 | """检查字体是否支持某个字符""" 152 | return ord(char) in self._glyph_table 153 | 154 | 155 | default_fallback_fonts = imageutils_config.default_fallback_fonts 156 | 157 | 158 | def get_proper_font( 159 | char: str, 160 | style: FontStyle = "normal", 161 | weight: FontWeight = "normal", 162 | fontname: Optional[str] = None, 163 | fallback_fonts: List[str] = [], 164 | ) -> Font: 165 | """ 166 | 获取合适的字体,将依次检查备选字体是否支持想要的字符 167 | 168 | :参数: 169 | * ``char``: 字符 170 | * ``style``: 字体样式,默认为 "normal" 171 | * ``weight``: 字体粗细,默认为 "normal" 172 | * ``fontname``: 可选,指定首选字体 173 | * ``fallback_fonts``: 可选,指定备选字体 174 | """ 175 | fallback_fonts = fallback_fonts or default_fallback_fonts.copy() 176 | if fontname: 177 | fallback_fonts.insert(0, fontname) 178 | 179 | for family in fallback_fonts: 180 | try: 181 | font = Font.find(family, style, weight, fallback_to_default=False) 182 | except ValueError as e: 183 | logger.info(str(e)) 184 | try: 185 | default_fallback_fonts.remove(family) 186 | except: 187 | pass 188 | continue 189 | if font.has_char(char): 190 | return font 191 | 192 | logger.warning(f"在当前字体列表中找不到可以显示字符“{char}”的字体") 193 | return Font.find("serif", style, weight) 194 | 195 | 196 | async def add_font(fontname: str, source: Union[str, Path]): 197 | """通过字体文件路径或下载链接添加字体到插件路径""" 198 | fontpath = FONT_PATH / fontname 199 | if fontpath.exists(): 200 | return 201 | FONT_PATH.mkdir(parents=True, exist_ok=True) 202 | try: 203 | if isinstance(source, Path): 204 | if source.is_file(): 205 | shutil.copyfile(source, fontpath) 206 | else: 207 | await download_font(source, fontpath) 208 | add_font_to_manager(fontpath) 209 | except: 210 | logger.warning( 211 | f"Add font {fontname} from {source} failed\n{traceback.format_exc()}" 212 | ) 213 | fontpath.unlink(missing_ok=True) 214 | 215 | 216 | async def download_font(url: str, fontpath: Path): 217 | """下载字体到插件路径""" 218 | async with httpx.AsyncClient() as client: 219 | async with client.stream("GET", url) as resp: 220 | logger.info(f"Begin to download font from {url}") 221 | async with await anyio.open_file(fontpath, "wb") as file: 222 | async for chunk in resp.aiter_bytes(): 223 | await file.write(chunk) 224 | -------------------------------------------------------------------------------- /nonebot_plugin_imageutils/gradient.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | from PIL import Image 3 | from PIL.ImageColor import getrgb 4 | from PIL.Image import Image as IMG 5 | from typing import List, TYPE_CHECKING 6 | 7 | if TYPE_CHECKING: 8 | from .types import ColorType, SizeType, XYType 9 | 10 | 11 | class ColorStop: 12 | def __init__(self, stop: float, color: "ColorType"): 13 | self.stop = stop 14 | """介于 0.0 与 1.0 之间的值,表示渐变中开始与结束之间的位置""" 15 | if isinstance(color, str): 16 | color = getrgb(color) 17 | if len(color) == 3: 18 | color = (color[0], color[1], color[2], 255) 19 | self.color = color 20 | """在 stop 位置显示的颜色值""" 21 | 22 | def __lt__(self, other: "ColorStop"): 23 | return self.stop < other.stop 24 | 25 | 26 | class Gradient: 27 | def __init__(self, color_stops: List[ColorStop] = []): 28 | self.color_stops = color_stops 29 | self.color_stops.sort() 30 | 31 | def add_color_stop(self, stop: float, color: "ColorType"): 32 | self.color_stops.append(ColorStop(stop, color)) 33 | self.color_stops.sort() 34 | 35 | def create_image(self, size: "SizeType") -> IMG: 36 | raise NotImplementedError 37 | 38 | 39 | class LinearGradient(Gradient): 40 | def __init__(self, xy: "XYType", color_stops: List[ColorStop] = []): 41 | self.xy = xy 42 | self.x0 = xy[0] 43 | """渐变开始点的 x 坐标""" 44 | self.y0 = xy[1] 45 | """渐变开始点的 y 坐标""" 46 | self.x1 = xy[2] 47 | """渐变结束点的 x 坐标""" 48 | self.y1 = xy[3] 49 | """渐变结束点的 y 坐标""" 50 | super().__init__(color_stops) 51 | 52 | def create_image(self, size: "SizeType") -> IMG: 53 | w = size[0] 54 | h = size[1] 55 | x0 = self.x0 56 | y0 = self.y0 57 | x1 = self.x1 58 | y1 = self.y1 59 | x01 = x1 - x0 60 | y01 = y1 - y0 61 | d = x01**2 + y01**2 62 | arr = np.zeros([h, w, 4], np.uint8) 63 | if len(self.color_stops) == 1: 64 | arr[:, :, :] = self.color_stops[0].color 65 | elif self.color_stops: 66 | for x in range(w): 67 | for y in range(h): 68 | x0p = x - x0 69 | y0p = y - y0 70 | ratio = (x0p * x01 + y0p * y01) / d 71 | color = (0, 0, 0, 0) 72 | if ratio < 0: 73 | color = self.color_stops[0].color 74 | if ratio >= 1: 75 | color = self.color_stops[-1].color 76 | for i in range(len(self.color_stops) - 1): 77 | color_stop0 = self.color_stops[i] 78 | color_stop1 = self.color_stops[i + 1] 79 | stop0 = color_stop0.stop 80 | stop1 = color_stop1.stop 81 | color0 = color_stop0.color 82 | color1 = color_stop1.color 83 | if stop0 <= ratio < stop1: 84 | e = (ratio - stop0) / (stop1 - stop0) 85 | color = [ 86 | round((1 - e) * color0[j] + e * color1[j]) 87 | for j in range(4) 88 | ] 89 | arr[y, x, :] = color 90 | return Image.fromarray(arr) 91 | 92 | 93 | if __name__ == "__main__": 94 | img = LinearGradient( 95 | (0, 0, 255, 255), 96 | [ 97 | ColorStop(0, "red"), 98 | ColorStop(0.1, "orange"), 99 | ColorStop(0.25, "yellow"), 100 | ColorStop(0.4, "green"), 101 | ColorStop(0.6, "blue"), 102 | ColorStop(0.8, "cyan"), 103 | ColorStop(1, "purple"), 104 | ], 105 | ).create_image((255, 255)) 106 | img.save("test.png") 107 | -------------------------------------------------------------------------------- /nonebot_plugin_imageutils/text2image.py: -------------------------------------------------------------------------------- 1 | import re 2 | from bbcode import Parser 3 | from functools import lru_cache 4 | from PIL import Image, ImageDraw 5 | from PIL.Image import Image as IMG 6 | from PIL.ImageColor import colormap 7 | from typing import List, Optional, Iterator 8 | 9 | from .types import * 10 | from .fonts import Font, get_proper_font 11 | 12 | 13 | class Char: 14 | def __init__( 15 | self, 16 | char: str, 17 | font: Font, 18 | fontsize: int = 16, 19 | fill: ColorType = "black", 20 | stroke_width: int = 0, 21 | stroke_fill: Optional[ColorType] = None, 22 | ): 23 | self.char = char 24 | self.font = font 25 | self.fontsize = fontsize 26 | self.fill = fill 27 | self.stroke_width = stroke_width 28 | self.stroke_fill = stroke_fill 29 | 30 | if self.font.valid_size: 31 | self.stroke_width = 0 32 | self.pilfont = self.font.load_font(self.font.valid_size) 33 | else: 34 | self.pilfont = self.font.load_font(fontsize) 35 | 36 | self.ascent, self.descent = self.pilfont.getmetrics() 37 | self.width, self.height = self.pilfont.getsize( 38 | self.char, stroke_width=self.stroke_width 39 | ) 40 | 41 | if self.font.valid_size: 42 | ratio = fontsize / self.font.valid_size 43 | self.ascent = round(self.ascent * ratio) 44 | self.descent = round(self.descent * ratio) 45 | self.width = round(self.width * ratio) 46 | self.height = round(self.height * ratio) 47 | 48 | def draw_on(self, img: IMG, pos: PosTypeInt): 49 | if self.font.valid_size: 50 | ratio = self.font.valid_size / self.fontsize 51 | new_img = Image.new( 52 | "RGBA", (int(self.width * ratio), int(self.height * ratio)) 53 | ) 54 | draw = ImageDraw.Draw(new_img) 55 | draw.text( 56 | (0, 0), 57 | self.char, 58 | font=self.pilfont, 59 | fill=self.fill, 60 | embedded_color=True, 61 | ) 62 | new_img = new_img.resize( 63 | (int(self.width), int(self.height)), resample=Image.ANTIALIAS 64 | ) 65 | img.paste(new_img, pos, mask=new_img) 66 | else: 67 | draw = ImageDraw.Draw(img) 68 | draw.text( 69 | pos, 70 | self.char, 71 | font=self.pilfont, 72 | fill=self.fill, 73 | stroke_width=self.stroke_width, 74 | stroke_fill=self.stroke_fill, 75 | embedded_color=True, 76 | ) 77 | 78 | 79 | class Line: 80 | def __init__( 81 | self, 82 | chars: List[Char], 83 | align: HAlignType = "left", 84 | fontsize: int = 16, 85 | fontname: Optional[str] = None, 86 | ): 87 | self.chars: List[Char] = chars 88 | self.align: HAlignType = align 89 | self.fontsize = fontsize 90 | self.fontname = fontname 91 | 92 | @lru_cache(maxsize=None) 93 | def _char_a(self) -> Char: 94 | return Char( 95 | "A", get_proper_font("A", fontname=self.fontname), fontsize=self.fontsize 96 | ) 97 | 98 | @property 99 | def width(self) -> int: 100 | if not self.chars: 101 | return 0 102 | return ( 103 | sum([char.width - char.stroke_width * 2 for char in self.chars]) 104 | + self.chars[0].stroke_width 105 | + self.chars[-1].stroke_width 106 | ) 107 | 108 | @property 109 | def height(self) -> int: 110 | if not self.chars: 111 | return self._char_a().height 112 | return max([char.ascent + char.stroke_width for char in self.chars]) + max( 113 | [char.descent + char.stroke_width for char in self.chars] 114 | ) 115 | 116 | @property 117 | def ascent(self) -> int: 118 | if not self.chars: 119 | return self._char_a().ascent 120 | return max([char.ascent for char in self.chars]) 121 | 122 | @property 123 | def descent(self) -> int: 124 | if not self.chars: 125 | return self._char_a().descent 126 | return max([char.descent for char in self.chars]) 127 | 128 | @property 129 | def max_stroke_width(self) -> int: 130 | if not self.chars: 131 | return 0 132 | return max([char.stroke_width for char in self.chars]) 133 | 134 | def wrap(self, width: float) -> Iterator["Line"]: 135 | last_idx = 0 136 | for idx in range(len(self.chars)): 137 | if Line(self.chars[last_idx : idx + 1]).width > width: 138 | yield Line(self.chars[last_idx:idx], self.align) 139 | last_idx = idx 140 | yield Line(self.chars[last_idx:], self.align) 141 | 142 | 143 | class Text2Image: 144 | def __init__(self, lines: List[Line], spacing: int = 4): 145 | self.lines = lines 146 | self.spacing = spacing 147 | 148 | @classmethod 149 | def from_text( 150 | cls, 151 | text: str, 152 | fontsize: int, 153 | style: FontStyle = "normal", 154 | weight: FontWeight = "normal", 155 | fill: ColorType = "black", 156 | spacing: int = 4, 157 | align: HAlignType = "left", 158 | stroke_width: int = 0, 159 | stroke_fill: Optional[ColorType] = None, 160 | font_fallback: bool = True, 161 | fontname: str = "", 162 | fallback_fonts: List[str] = [], 163 | ) -> "Text2Image": 164 | """ 165 | 从文本构建 `Text2Image` 对象 166 | 167 | :参数: 168 | * ``text``: 文本 169 | * ``fontsize``: 字体大小 170 | * ``style``: 字体样式,默认为 "normal" 171 | * ``weight``: 字体粗细,默认为 "normal" 172 | * ``fill``: 文字颜色 173 | * ``spacing``: 多行文字间距 174 | * ``align``: 多行文字对齐方式,默认为靠左 175 | * ``stroke_width``: 文字描边宽度 176 | * ``stroke_fill``: 描边颜色 177 | * ``font_fallback``: 是否使用后备字体,默认为 `True` 178 | * ``fontname``: 指定首选字体 179 | * ``fallback_fonts``: 指定备选字体 180 | """ 181 | 182 | font = None 183 | if not font_fallback: 184 | if not fontname: 185 | raise ValueError("`font_fallback` 为 `False` 时必须指定 `fontname`") 186 | font = Font.find(fontname, fallback_to_default=False) 187 | 188 | lines: List[Line] = [] 189 | chars: List[Char] = [] 190 | 191 | text = text.replace("\r\n", "\n").replace("\r", "\n") 192 | for char in text: 193 | if char == "\n": 194 | lines.append(Line(chars, align, fontsize, fontname)) 195 | chars = [] 196 | continue 197 | if font_fallback: 198 | font = get_proper_font(char, style, weight, fontname, fallback_fonts) 199 | else: 200 | assert font 201 | chars.append(Char(char, font, fontsize, fill, stroke_width, stroke_fill)) 202 | if chars: 203 | lines.append(Line(chars, align, fontsize, fontname)) 204 | return cls(lines, spacing) 205 | 206 | @classmethod 207 | def from_bbcode_text( 208 | cls, 209 | text: str, 210 | fontsize: int = 30, 211 | fill: ColorType = "black", 212 | spacing: int = 6, 213 | align: HAlignType = "left", 214 | stroke_ratio: float = 0, 215 | stroke_fill: Optional[ColorType] = None, 216 | font_fallback: bool = True, 217 | fontname: str = "", 218 | fallback_fonts: List[str] = [], 219 | ) -> "Text2Image": 220 | """ 221 | 从含有 `BBCode` 的文本构建 `Text2Image` 对象 222 | 223 | 目前支持的 `BBCode` 标签: 224 | * ``[align=left|right|center][/align]``: 文字对齐方式 225 | * ``[color=#66CCFF|red|black][/color]``: 字体颜色 226 | * ``[stroke=#66CCFF|red|black][/stroke]``: 描边颜色 227 | * ``[font=msyh.ttc][/font]``: 文字字体 228 | * ``[size=30][/size]``: 文字大小 229 | * ``[b][/b]``: 文字加粗 230 | 231 | :参数: 232 | * ``text``: 文本 233 | * ``fontsize``: 字体大小,默认为 30 234 | * ``fill``: 文字颜色,默认为 `black` 235 | * ``spacing``: 多行文字间距 236 | * ``align``: 多行文字对齐方式,默认为靠左 237 | * ``stroke_ratio``: 文字描边的比例,即 描边宽度 / 字体大小 238 | * ``stroke_fill``: 描边颜色 239 | * ``font_fallback``: 是否使用后备字体,默认为 `True` 240 | * ``fontname``: 指定首选字体 241 | * ``fallback_fonts``: 指定备选字体 242 | """ 243 | 244 | font = None 245 | if not font_fallback: 246 | if not fontname: 247 | raise ValueError("`font_fallback` 为 `False` 时必须指定 `fontname`") 248 | font = Font.find(fontname, fallback_to_default=False) 249 | 250 | lines: List[Line] = [] 251 | chars: List[Char] = [] 252 | 253 | def new_line(): 254 | nonlocal lines 255 | nonlocal chars 256 | lines.append(Line(chars, last_align, fontsize, fontname)) 257 | chars = [] 258 | 259 | align_stack: List[HAlignType] = [] 260 | color_stack: List[ColorType] = [] 261 | stroke_stack: List[ColorType] = [] 262 | font_stack: List[str] = [] 263 | size_stack: List[int] = [] 264 | bold_stack: List[bool] = [] 265 | last_align: HAlignType = align 266 | 267 | align_pattern = r"left|right|center" 268 | colors = "|".join(colormap.keys()) 269 | color_pattern = rf"#[a-fA-F0-9]{{6}}|{colors}" 270 | stroke_pattern = color_pattern 271 | font_pattern = r".+" 272 | size_pattern = r"\d+" 273 | 274 | parser = Parser() 275 | parser.recognized_tags = {} 276 | parser.add_formatter("align", None) 277 | parser.add_formatter("color", None) 278 | parser.add_formatter("stroke", None) 279 | parser.add_formatter("font", None) 280 | parser.add_formatter("size", None) 281 | parser.add_formatter("b", None) 282 | 283 | text = text.replace("\r\n", "\n").replace("\r", "\n") 284 | tokens = parser.tokenize(text) 285 | for token_type, tag_name, tag_opts, token_text in tokens: 286 | if token_type == 1: 287 | if tag_name == "align": 288 | if re.fullmatch(align_pattern, tag_opts["align"]): 289 | align_stack.append(tag_opts["align"]) 290 | elif tag_name == "color": 291 | if re.fullmatch(color_pattern, tag_opts["color"]): 292 | color_stack.append(tag_opts["color"]) 293 | elif tag_name == "stroke": 294 | if re.fullmatch(stroke_pattern, tag_opts["stroke"]): 295 | stroke_stack.append(tag_opts["stroke"]) 296 | elif tag_name == "font": 297 | if re.fullmatch(font_pattern, tag_opts["font"]): 298 | font_stack.append(tag_opts["font"]) 299 | elif tag_name == "size": 300 | if re.fullmatch(size_pattern, tag_opts["size"]): 301 | size_stack.append(int(tag_opts["size"])) 302 | elif tag_name == "b": 303 | bold_stack.append(True) 304 | elif token_type == 2: 305 | if tag_name == "align": 306 | if align_stack: 307 | align_stack.pop() 308 | elif tag_name == "color": 309 | if color_stack: 310 | color_stack.pop() 311 | elif tag_name == "stroke": 312 | if stroke_stack: 313 | stroke_stack.pop() 314 | elif tag_name == "font": 315 | if font_stack: 316 | font_stack.pop() 317 | elif tag_name == "size": 318 | if size_stack: 319 | size_stack.pop() 320 | elif tag_name == "b": 321 | if bold_stack: 322 | bold_stack.pop() 323 | elif token_type == 3: 324 | new_line() 325 | elif token_type == 4: 326 | char_align = align_stack[-1] if align_stack else align 327 | char_color = color_stack[-1] if color_stack else fill 328 | char_stroke = stroke_stack[-1] if stroke_stack else stroke_fill 329 | char_font = font_stack[-1] if font_stack else fontname 330 | char_size = size_stack[-1] if size_stack else fontsize 331 | char_bold = bold_stack[-1] if bold_stack else False 332 | 333 | if char_align != last_align: 334 | if chars: 335 | new_line() 336 | last_align = char_align 337 | for char in token_text: 338 | if font_fallback: 339 | font = get_proper_font( 340 | char, 341 | weight="bold" if char_bold else "normal", 342 | fontname=char_font, 343 | fallback_fonts=fallback_fonts, 344 | ) 345 | else: 346 | assert font 347 | chars.append( 348 | Char( 349 | char, 350 | font, 351 | int(char_size), 352 | char_color, 353 | int(char_size * stroke_ratio), 354 | char_stroke, 355 | ) 356 | ) 357 | 358 | if chars: 359 | new_line() 360 | 361 | return cls(lines, spacing) 362 | 363 | @property 364 | def width(self) -> int: 365 | if not self.lines: 366 | return 0 367 | return max([line.width for line in self.lines]) 368 | 369 | @property 370 | def height(self) -> int: 371 | if not self.lines: 372 | return 0 373 | return ( 374 | sum([line.ascent for line in self.lines]) 375 | + self.lines[-1].descent 376 | + self.spacing * (len(self.lines) - 1) 377 | + self.lines[0].max_stroke_width 378 | + self.lines[-1].max_stroke_width 379 | ) 380 | 381 | def wrap(self, width: float) -> "Text2Image": 382 | new_lines: List[Line] = [] 383 | for line in self.lines: 384 | new_lines.extend(line.wrap(width)) 385 | self.lines = new_lines 386 | return self 387 | 388 | def to_image( 389 | self, 390 | bg_color: Optional[ColorType] = None, 391 | padding: Union[SizeType, BoxType] = (0, 0), 392 | ) -> IMG: 393 | if len(padding) == 4: 394 | padding_left, padding_top, padding_right, padding_bottom = padding 395 | else: 396 | padding_left = padding_right = padding[0] 397 | padding_top = padding_bottom = padding[1] 398 | 399 | img = Image.new( 400 | "RGBA", 401 | ( 402 | self.width + padding_left + padding_right, 403 | self.height + padding_top + padding_bottom, 404 | ), 405 | bg_color, # type: ignore 406 | ) 407 | 408 | top = padding_top 409 | for line in self.lines: 410 | left = padding_left 411 | if line.align == "center": 412 | left += (self.width - line.width) / 2 413 | elif line.align == "right": 414 | left += self.width - line.width 415 | 416 | x = left 417 | if line.chars: 418 | x += line.chars[0].stroke_width 419 | for char in line.chars: 420 | y = top + line.ascent - char.ascent 421 | char.draw_on(img, (int(x), int(y))) 422 | x += char.width - char.stroke_width * 2 423 | top += line.ascent + self.spacing 424 | 425 | return img 426 | 427 | def draw_on_image(self, img: IMG, pos: PosTypeFloat): 428 | top = pos[1] 429 | for line in self.lines: 430 | left = pos[0] 431 | if line.align == "center": 432 | left += (self.width - line.width) / 2 433 | elif line.align == "right": 434 | left += self.width - line.width 435 | 436 | x = left 437 | if line.chars: 438 | x += line.chars[0].stroke_width 439 | for char in line.chars: 440 | y = top + line.ascent - char.ascent 441 | char.draw_on(img, (int(x), int(y))) 442 | x += char.width - char.stroke_width * 2 443 | top += line.ascent + self.spacing 444 | 445 | 446 | def text2image( 447 | text: str, 448 | bg_color: ColorType = "white", 449 | padding: Union[SizeType, BoxType] = (10, 10), 450 | max_width: Optional[int] = None, 451 | font_fallback: bool = True, 452 | **kwargs, 453 | ) -> IMG: 454 | """ 455 | 文字转图片,支持少量 `BBCode` 标签,具体见 `Text2Image` 类的 `from_bbcode_text` 函数 456 | 457 | :参数: 458 | * ``text``: 文本 459 | * ``bg_color``: 图片背景颜色 460 | * ``padding``: 图片边距 461 | * ``max_width``: 图片最大宽度,不设置则不限宽度 462 | * ``font_fallback``: 是否使用后备字体,默认为 `True` 463 | """ 464 | text2img = Text2Image.from_bbcode_text(text, font_fallback=font_fallback, **kwargs) 465 | if max_width: 466 | text2img.wrap(max_width) 467 | return text2img.to_image(bg_color, padding) 468 | -------------------------------------------------------------------------------- /nonebot_plugin_imageutils/types.py: -------------------------------------------------------------------------------- 1 | from typing import Tuple, Union, Literal 2 | 3 | 4 | ModeType = Literal[ 5 | "1", "CMYK", "F", "HSV", "I", "L", "LAB", "P", "RGB", "RGBA", "RGBX", "YCbCr" 6 | ] 7 | ColorType = Union[str, Tuple[int, int, int], Tuple[int, int, int, int]] 8 | PosTypeFloat = Tuple[float, float] 9 | PosTypeInt = Tuple[int, int] 10 | XYType = Tuple[float, float, float, float] 11 | BoxType = Tuple[int, int, int, int] 12 | PointsTYpe = Tuple[PosTypeFloat, PosTypeFloat, PosTypeFloat, PosTypeFloat] 13 | DistortType = Tuple[float, float, float, float] 14 | SizeType = Tuple[int, int] 15 | HAlignType = Literal["left", "right", "center"] 16 | VAlignType = Literal["top", "bottom", "center"] 17 | OrientType = Literal["horizontal", "vertical"] 18 | DirectionType = Literal[ 19 | "center", 20 | "north", 21 | "south", 22 | "west", 23 | "east", 24 | "northwest", 25 | "northeast", 26 | "southwest", 27 | "southeast", 28 | ] 29 | ResampleType = Literal[0, 1, 2, 3, 4, 5] 30 | TransposeType = Literal[0, 1, 2, 3, 4, 5, 6] 31 | 32 | FontStyle = Literal["normal", "italic", "oblique"] 33 | FontWeight = Literal["ultralight", "light", "normal", "bold", "ultrabold", "heavy"] 34 | -------------------------------------------------------------------------------- /poetry.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Poetry and should not be changed by hand. 2 | 3 | [[package]] 4 | name = "anyio" 5 | version = "3.6.2" 6 | description = "High level compatibility layer for multiple asynchronous event loop implementations" 7 | category = "main" 8 | optional = false 9 | python-versions = ">=3.6.2" 10 | files = [ 11 | {file = "anyio-3.6.2-py3-none-any.whl", hash = "sha256:fbbe32bd270d2a2ef3ed1c5d45041250284e31fc0a4df4a5a6071842051a51e3"}, 12 | {file = "anyio-3.6.2.tar.gz", hash = "sha256:25ea0d673ae30af41a0c442f81cf3b38c7e79fdc7b60335a4c14e05eb0947421"}, 13 | ] 14 | 15 | [package.dependencies] 16 | idna = ">=2.8" 17 | sniffio = ">=1.1" 18 | 19 | [package.extras] 20 | doc = ["packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] 21 | test = ["contextlib2", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (<0.15)", "uvloop (>=0.15)"] 22 | trio = ["trio (>=0.16,<0.22)"] 23 | 24 | [[package]] 25 | name = "arrow" 26 | version = "1.2.3" 27 | description = "Better dates & times for Python" 28 | category = "dev" 29 | optional = false 30 | python-versions = ">=3.6" 31 | files = [ 32 | {file = "arrow-1.2.3-py3-none-any.whl", hash = "sha256:5a49ab92e3b7b71d96cd6bfcc4df14efefc9dfa96ea19045815914a6ab6b1fe2"}, 33 | {file = "arrow-1.2.3.tar.gz", hash = "sha256:3934b30ca1b9f292376d9db15b19446088d12ec58629bc3f0da28fd55fb633a1"}, 34 | ] 35 | 36 | [package.dependencies] 37 | python-dateutil = ">=2.7.0" 38 | 39 | [[package]] 40 | name = "bbcode" 41 | version = "1.1.0" 42 | description = "A pure python bbcode parser and formatter." 43 | category = "main" 44 | optional = false 45 | python-versions = "*" 46 | files = [ 47 | {file = "bbcode-1.1.0-py2.py3-none-any.whl", hash = "sha256:83802f4b40c92426841a98350bd6ff9ea8fdf8f9b37df1968a88c5864fd225fa"}, 48 | {file = "bbcode-1.1.0.tar.gz", hash = "sha256:eac4fb1d0f6c7ce5c41e4b5c0522562b15a1ac036fb9131adc59e9a28c7dc1d0"}, 49 | ] 50 | 51 | [[package]] 52 | name = "binaryornot" 53 | version = "0.4.4" 54 | description = "Ultra-lightweight pure Python package to check if a file is binary or text." 55 | category = "dev" 56 | optional = false 57 | python-versions = "*" 58 | files = [ 59 | {file = "binaryornot-0.4.4-py2.py3-none-any.whl", hash = "sha256:b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4"}, 60 | {file = "binaryornot-0.4.4.tar.gz", hash = "sha256:359501dfc9d40632edc9fac890e19542db1a287bbcfa58175b66658392018061"}, 61 | ] 62 | 63 | [package.dependencies] 64 | chardet = ">=3.0.2" 65 | 66 | [[package]] 67 | name = "black" 68 | version = "22.12.0" 69 | description = "The uncompromising code formatter." 70 | category = "dev" 71 | optional = false 72 | python-versions = ">=3.7" 73 | files = [ 74 | {file = "black-22.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eedd20838bd5d75b80c9f5487dbcb06836a43833a37846cf1d8c1cc01cef59d"}, 75 | {file = "black-22.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:159a46a4947f73387b4d83e87ea006dbb2337eab6c879620a3ba52699b1f4351"}, 76 | {file = "black-22.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d30b212bffeb1e252b31dd269dfae69dd17e06d92b87ad26e23890f3efea366f"}, 77 | {file = "black-22.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:7412e75863aa5c5411886804678b7d083c7c28421210180d67dfd8cf1221e1f4"}, 78 | {file = "black-22.12.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c116eed0efb9ff870ded8b62fe9f28dd61ef6e9ddd28d83d7d264a38417dcee2"}, 79 | {file = "black-22.12.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1f58cbe16dfe8c12b7434e50ff889fa479072096d79f0a7f25e4ab8e94cd8350"}, 80 | {file = "black-22.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77d86c9f3db9b1bf6761244bc0b3572a546f5fe37917a044e02f3166d5aafa7d"}, 81 | {file = "black-22.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:82d9fe8fee3401e02e79767016b4907820a7dc28d70d137eb397b92ef3cc5bfc"}, 82 | {file = "black-22.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:101c69b23df9b44247bd88e1d7e90154336ac4992502d4197bdac35dd7ee3320"}, 83 | {file = "black-22.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:559c7a1ba9a006226f09e4916060982fd27334ae1998e7a38b3f33a37f7a2148"}, 84 | {file = "black-22.12.0-py3-none-any.whl", hash = "sha256:436cc9167dd28040ad90d3b404aec22cedf24a6e4d7de221bec2730ec0c97bcf"}, 85 | {file = "black-22.12.0.tar.gz", hash = "sha256:229351e5a18ca30f447bf724d007f890f97e13af070bb6ad4c0a441cd7596a2f"}, 86 | ] 87 | 88 | [package.dependencies] 89 | click = ">=8.0.0" 90 | mypy-extensions = ">=0.4.3" 91 | pathspec = ">=0.9.0" 92 | platformdirs = ">=2" 93 | tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} 94 | typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} 95 | 96 | [package.extras] 97 | colorama = ["colorama (>=0.4.3)"] 98 | d = ["aiohttp (>=3.7.4)"] 99 | jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] 100 | uvloop = ["uvloop (>=0.15.2)"] 101 | 102 | [[package]] 103 | name = "cashews" 104 | version = "5.2.0" 105 | description = "cache tools with async power" 106 | category = "dev" 107 | optional = false 108 | python-versions = ">=3.7" 109 | files = [ 110 | {file = "cashews-5.2.0-py3-none-any.whl", hash = "sha256:e8ef00f09ab444a58400782f9dff5f49ef3fa9e717f769844bb043b04d32751d"}, 111 | {file = "cashews-5.2.0.tar.gz", hash = "sha256:8852bc7fbd80073dfc3ba0764998e5dcfe0ea4ccb9b18e1b66c2802bb98393f0"}, 112 | ] 113 | 114 | [package.extras] 115 | dill = ["dill"] 116 | diskcache = ["diskcache (>=5.0.0)"] 117 | redis = ["redis (>=4.3.1)"] 118 | speedup = ["bitarray (<3.0.0)", "hiredis", "xxhash (<4.0.0)"] 119 | tests = ["hypothesis", "pytest", "pytest-asyncio"] 120 | 121 | [[package]] 122 | name = "certifi" 123 | version = "2022.12.7" 124 | description = "Python package for providing Mozilla's CA Bundle." 125 | category = "main" 126 | optional = false 127 | python-versions = ">=3.6" 128 | files = [ 129 | {file = "certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"}, 130 | {file = "certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"}, 131 | ] 132 | 133 | [[package]] 134 | name = "chardet" 135 | version = "5.1.0" 136 | description = "Universal encoding detector for Python 3" 137 | category = "dev" 138 | optional = false 139 | python-versions = ">=3.7" 140 | files = [ 141 | {file = "chardet-5.1.0-py3-none-any.whl", hash = "sha256:362777fb014af596ad31334fde1e8c327dfdb076e1960d1694662d46a6917ab9"}, 142 | {file = "chardet-5.1.0.tar.gz", hash = "sha256:0d62712b956bc154f85fb0a266e2a3c5913c2967e00348701b32411d6def31e5"}, 143 | ] 144 | 145 | [[package]] 146 | name = "charset-normalizer" 147 | version = "3.0.1" 148 | description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." 149 | category = "dev" 150 | optional = false 151 | python-versions = "*" 152 | files = [ 153 | {file = "charset-normalizer-3.0.1.tar.gz", hash = "sha256:ebea339af930f8ca5d7a699b921106c6e29c617fe9606fa7baa043c1cdae326f"}, 154 | {file = "charset_normalizer-3.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88600c72ef7587fe1708fd242b385b6ed4b8904976d5da0893e31df8b3480cb6"}, 155 | {file = "charset_normalizer-3.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c75ffc45f25324e68ab238cb4b5c0a38cd1c3d7f1fb1f72b5541de469e2247db"}, 156 | {file = "charset_normalizer-3.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:db72b07027db150f468fbada4d85b3b2729a3db39178abf5c543b784c1254539"}, 157 | {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62595ab75873d50d57323a91dd03e6966eb79c41fa834b7a1661ed043b2d404d"}, 158 | {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ff6f3db31555657f3163b15a6b7c6938d08df7adbfc9dd13d9d19edad678f1e8"}, 159 | {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:772b87914ff1152b92a197ef4ea40efe27a378606c39446ded52c8f80f79702e"}, 160 | {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70990b9c51340e4044cfc394a81f614f3f90d41397104d226f21e66de668730d"}, 161 | {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:292d5e8ba896bbfd6334b096e34bffb56161c81408d6d036a7dfa6929cff8783"}, 162 | {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:2edb64ee7bf1ed524a1da60cdcd2e1f6e2b4f66ef7c077680739f1641f62f555"}, 163 | {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:31a9ddf4718d10ae04d9b18801bd776693487cbb57d74cc3458a7673f6f34639"}, 164 | {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:44ba614de5361b3e5278e1241fda3dc1838deed864b50a10d7ce92983797fa76"}, 165 | {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:12db3b2c533c23ab812c2b25934f60383361f8a376ae272665f8e48b88e8e1c6"}, 166 | {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c512accbd6ff0270939b9ac214b84fb5ada5f0409c44298361b2f5e13f9aed9e"}, 167 | {file = "charset_normalizer-3.0.1-cp310-cp310-win32.whl", hash = "sha256:502218f52498a36d6bf5ea77081844017bf7982cdbe521ad85e64cabee1b608b"}, 168 | {file = "charset_normalizer-3.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:601f36512f9e28f029d9481bdaf8e89e5148ac5d89cffd3b05cd533eeb423b59"}, 169 | {file = "charset_normalizer-3.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0298eafff88c99982a4cf66ba2efa1128e4ddaca0b05eec4c456bbc7db691d8d"}, 170 | {file = "charset_normalizer-3.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a8d0fc946c784ff7f7c3742310cc8a57c5c6dc31631269876a88b809dbeff3d3"}, 171 | {file = "charset_normalizer-3.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:87701167f2a5c930b403e9756fab1d31d4d4da52856143b609e30a1ce7160f3c"}, 172 | {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14e76c0f23218b8f46c4d87018ca2e441535aed3632ca134b10239dfb6dadd6b"}, 173 | {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c0a590235ccd933d9892c627dec5bc7511ce6ad6c1011fdf5b11363022746c1"}, 174 | {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c7fe7afa480e3e82eed58e0ca89f751cd14d767638e2550c77a92a9e749c317"}, 175 | {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79909e27e8e4fcc9db4addea88aa63f6423ebb171db091fb4373e3312cb6d603"}, 176 | {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ac7b6a045b814cf0c47f3623d21ebd88b3e8cf216a14790b455ea7ff0135d18"}, 177 | {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:72966d1b297c741541ca8cf1223ff262a6febe52481af742036a0b296e35fa5a"}, 178 | {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f9d0c5c045a3ca9bedfc35dca8526798eb91a07aa7a2c0fee134c6c6f321cbd7"}, 179 | {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5995f0164fa7df59db4746112fec3f49c461dd6b31b841873443bdb077c13cfc"}, 180 | {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4a8fcf28c05c1f6d7e177a9a46a1c52798bfe2ad80681d275b10dcf317deaf0b"}, 181 | {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:761e8904c07ad053d285670f36dd94e1b6ab7f16ce62b9805c475b7aa1cffde6"}, 182 | {file = "charset_normalizer-3.0.1-cp311-cp311-win32.whl", hash = "sha256:71140351489970dfe5e60fc621ada3e0f41104a5eddaca47a7acb3c1b851d6d3"}, 183 | {file = "charset_normalizer-3.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:9ab77acb98eba3fd2a85cd160851816bfce6871d944d885febf012713f06659c"}, 184 | {file = "charset_normalizer-3.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:84c3990934bae40ea69a82034912ffe5a62c60bbf6ec5bc9691419641d7d5c9a"}, 185 | {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74292fc76c905c0ef095fe11e188a32ebd03bc38f3f3e9bcb85e4e6db177b7ea"}, 186 | {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c95a03c79bbe30eec3ec2b7f076074f4281526724c8685a42872974ef4d36b72"}, 187 | {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4c39b0e3eac288fedc2b43055cfc2ca7a60362d0e5e87a637beac5d801ef478"}, 188 | {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df2c707231459e8a4028eabcd3cfc827befd635b3ef72eada84ab13b52e1574d"}, 189 | {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93ad6d87ac18e2a90b0fe89df7c65263b9a99a0eb98f0a3d2e079f12a0735837"}, 190 | {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:59e5686dd847347e55dffcc191a96622f016bc0ad89105e24c14e0d6305acbc6"}, 191 | {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:cd6056167405314a4dc3c173943f11249fa0f1b204f8b51ed4bde1a9cd1834dc"}, 192 | {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:083c8d17153ecb403e5e1eb76a7ef4babfc2c48d58899c98fcaa04833e7a2f9a"}, 193 | {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:f5057856d21e7586765171eac8b9fc3f7d44ef39425f85dbcccb13b3ebea806c"}, 194 | {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:7eb33a30d75562222b64f569c642ff3dc6689e09adda43a082208397f016c39a"}, 195 | {file = "charset_normalizer-3.0.1-cp36-cp36m-win32.whl", hash = "sha256:95dea361dd73757c6f1c0a1480ac499952c16ac83f7f5f4f84f0658a01b8ef41"}, 196 | {file = "charset_normalizer-3.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:eaa379fcd227ca235d04152ca6704c7cb55564116f8bc52545ff357628e10602"}, 197 | {file = "charset_normalizer-3.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3e45867f1f2ab0711d60c6c71746ac53537f1684baa699f4f668d4c6f6ce8e14"}, 198 | {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cadaeaba78750d58d3cc6ac4d1fd867da6fc73c88156b7a3212a3cd4819d679d"}, 199 | {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:911d8a40b2bef5b8bbae2e36a0b103f142ac53557ab421dc16ac4aafee6f53dc"}, 200 | {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:503e65837c71b875ecdd733877d852adbc465bd82c768a067badd953bf1bc5a3"}, 201 | {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a60332922359f920193b1d4826953c507a877b523b2395ad7bc716ddd386d866"}, 202 | {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:16a8663d6e281208d78806dbe14ee9903715361cf81f6d4309944e4d1e59ac5b"}, 203 | {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:a16418ecf1329f71df119e8a65f3aa68004a3f9383821edcb20f0702934d8087"}, 204 | {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9d9153257a3f70d5f69edf2325357251ed20f772b12e593f3b3377b5f78e7ef8"}, 205 | {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:02a51034802cbf38db3f89c66fb5d2ec57e6fe7ef2f4a44d070a593c3688667b"}, 206 | {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:2e396d70bc4ef5325b72b593a72c8979999aa52fb8bcf03f701c1b03e1166918"}, 207 | {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:11b53acf2411c3b09e6af37e4b9005cba376c872503c8f28218c7243582df45d"}, 208 | {file = "charset_normalizer-3.0.1-cp37-cp37m-win32.whl", hash = "sha256:0bf2dae5291758b6f84cf923bfaa285632816007db0330002fa1de38bfcb7154"}, 209 | {file = "charset_normalizer-3.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:2c03cc56021a4bd59be889c2b9257dae13bf55041a3372d3295416f86b295fb5"}, 210 | {file = "charset_normalizer-3.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:024e606be3ed92216e2b6952ed859d86b4cfa52cd5bc5f050e7dc28f9b43ec42"}, 211 | {file = "charset_normalizer-3.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4b0d02d7102dd0f997580b51edc4cebcf2ab6397a7edf89f1c73b586c614272c"}, 212 | {file = "charset_normalizer-3.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:358a7c4cb8ba9b46c453b1dd8d9e431452d5249072e4f56cfda3149f6ab1405e"}, 213 | {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81d6741ab457d14fdedc215516665050f3822d3e56508921cc7239f8c8e66a58"}, 214 | {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8b8af03d2e37866d023ad0ddea594edefc31e827fee64f8de5611a1dbc373174"}, 215 | {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9cf4e8ad252f7c38dd1f676b46514f92dc0ebeb0db5552f5f403509705e24753"}, 216 | {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e696f0dd336161fca9adbb846875d40752e6eba585843c768935ba5c9960722b"}, 217 | {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c22d3fe05ce11d3671297dc8973267daa0f938b93ec716e12e0f6dee81591dc1"}, 218 | {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:109487860ef6a328f3eec66f2bf78b0b72400280d8f8ea05f69c51644ba6521a"}, 219 | {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:37f8febc8ec50c14f3ec9637505f28e58d4f66752207ea177c1d67df25da5aed"}, 220 | {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:f97e83fa6c25693c7a35de154681fcc257c1c41b38beb0304b9c4d2d9e164479"}, 221 | {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a152f5f33d64a6be73f1d30c9cc82dfc73cec6477ec268e7c6e4c7d23c2d2291"}, 222 | {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:39049da0ffb96c8cbb65cbf5c5f3ca3168990adf3551bd1dee10c48fce8ae820"}, 223 | {file = "charset_normalizer-3.0.1-cp38-cp38-win32.whl", hash = "sha256:4457ea6774b5611f4bed5eaa5df55f70abde42364d498c5134b7ef4c6958e20e"}, 224 | {file = "charset_normalizer-3.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:e62164b50f84e20601c1ff8eb55620d2ad25fb81b59e3cd776a1902527a788af"}, 225 | {file = "charset_normalizer-3.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8eade758719add78ec36dc13201483f8e9b5d940329285edcd5f70c0a9edbd7f"}, 226 | {file = "charset_normalizer-3.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8499ca8f4502af841f68135133d8258f7b32a53a1d594aa98cc52013fff55678"}, 227 | {file = "charset_normalizer-3.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3fc1c4a2ffd64890aebdb3f97e1278b0cc72579a08ca4de8cd2c04799a3a22be"}, 228 | {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00d3ffdaafe92a5dc603cb9bd5111aaa36dfa187c8285c543be562e61b755f6b"}, 229 | {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2ac1b08635a8cd4e0cbeaf6f5e922085908d48eb05d44c5ae9eabab148512ca"}, 230 | {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6f45710b4459401609ebebdbcfb34515da4fc2aa886f95107f556ac69a9147e"}, 231 | {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ae1de54a77dc0d6d5fcf623290af4266412a7c4be0b1ff7444394f03f5c54e3"}, 232 | {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b590df687e3c5ee0deef9fc8c547d81986d9a1b56073d82de008744452d6541"}, 233 | {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab5de034a886f616a5668aa5d098af2b5385ed70142090e2a31bcbd0af0fdb3d"}, 234 | {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9cb3032517f1627cc012dbc80a8ec976ae76d93ea2b5feaa9d2a5b8882597579"}, 235 | {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:608862a7bf6957f2333fc54ab4399e405baad0163dc9f8d99cb236816db169d4"}, 236 | {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0f438ae3532723fb6ead77e7c604be7c8374094ef4ee2c5e03a3a17f1fca256c"}, 237 | {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:356541bf4381fa35856dafa6a965916e54bed415ad8a24ee6de6e37deccf2786"}, 238 | {file = "charset_normalizer-3.0.1-cp39-cp39-win32.whl", hash = "sha256:39cf9ed17fe3b1bc81f33c9ceb6ce67683ee7526e65fde1447c772afc54a1bb8"}, 239 | {file = "charset_normalizer-3.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:0a11e971ed097d24c534c037d298ad32c6ce81a45736d31e0ff0ad37ab437d59"}, 240 | {file = "charset_normalizer-3.0.1-py3-none-any.whl", hash = "sha256:7e189e2e1d3ed2f4aebabd2d5b0f931e883676e51c7624826e0a4e5fe8a0bf24"}, 241 | ] 242 | 243 | [[package]] 244 | name = "click" 245 | version = "8.1.3" 246 | description = "Composable command line interface toolkit" 247 | category = "main" 248 | optional = false 249 | python-versions = ">=3.7" 250 | files = [ 251 | {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, 252 | {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, 253 | ] 254 | 255 | [package.dependencies] 256 | colorama = {version = "*", markers = "platform_system == \"Windows\""} 257 | 258 | [[package]] 259 | name = "colorama" 260 | version = "0.4.6" 261 | description = "Cross-platform colored terminal text." 262 | category = "main" 263 | optional = false 264 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" 265 | files = [ 266 | {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, 267 | {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, 268 | ] 269 | 270 | [[package]] 271 | name = "contourpy" 272 | version = "1.0.7" 273 | description = "Python library for calculating contours of 2D quadrilateral grids" 274 | category = "main" 275 | optional = false 276 | python-versions = ">=3.8" 277 | files = [ 278 | {file = "contourpy-1.0.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:95c3acddf921944f241b6773b767f1cbce71d03307270e2d769fd584d5d1092d"}, 279 | {file = "contourpy-1.0.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fc1464c97579da9f3ab16763c32e5c5d5bb5fa1ec7ce509a4ca6108b61b84fab"}, 280 | {file = "contourpy-1.0.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8acf74b5d383414401926c1598ed77825cd530ac7b463ebc2e4f46638f56cce6"}, 281 | {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c71fdd8f1c0f84ffd58fca37d00ca4ebaa9e502fb49825484da075ac0b0b803"}, 282 | {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f99e9486bf1bb979d95d5cffed40689cb595abb2b841f2991fc894b3452290e8"}, 283 | {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87f4d8941a9564cda3f7fa6a6cd9b32ec575830780677932abdec7bcb61717b0"}, 284 | {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9e20e5a1908e18aaa60d9077a6d8753090e3f85ca25da6e25d30dc0a9e84c2c6"}, 285 | {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a877ada905f7d69b2a31796c4b66e31a8068b37aa9b78832d41c82fc3e056ddd"}, 286 | {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6381fa66866b0ea35e15d197fc06ac3840a9b2643a6475c8fff267db8b9f1e69"}, 287 | {file = "contourpy-1.0.7-cp310-cp310-win32.whl", hash = "sha256:3c184ad2433635f216645fdf0493011a4667e8d46b34082f5a3de702b6ec42e3"}, 288 | {file = "contourpy-1.0.7-cp310-cp310-win_amd64.whl", hash = "sha256:3caea6365b13119626ee996711ab63e0c9d7496f65641f4459c60a009a1f3e80"}, 289 | {file = "contourpy-1.0.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ed33433fc3820263a6368e532f19ddb4c5990855e4886088ad84fd7c4e561c71"}, 290 | {file = "contourpy-1.0.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:38e2e577f0f092b8e6774459317c05a69935a1755ecfb621c0a98f0e3c09c9a5"}, 291 | {file = "contourpy-1.0.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ae90d5a8590e5310c32a7630b4b8618cef7563cebf649011da80874d0aa8f414"}, 292 | {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:130230b7e49825c98edf0b428b7aa1125503d91732735ef897786fe5452b1ec2"}, 293 | {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58569c491e7f7e874f11519ef46737cea1d6eda1b514e4eb5ac7dab6aa864d02"}, 294 | {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54d43960d809c4c12508a60b66cb936e7ed57d51fb5e30b513934a4a23874fae"}, 295 | {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:152fd8f730c31fd67fe0ffebe1df38ab6a669403da93df218801a893645c6ccc"}, 296 | {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:9056c5310eb1daa33fc234ef39ebfb8c8e2533f088bbf0bc7350f70a29bde1ac"}, 297 | {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a9d7587d2fdc820cc9177139b56795c39fb8560f540bba9ceea215f1f66e1566"}, 298 | {file = "contourpy-1.0.7-cp311-cp311-win32.whl", hash = "sha256:4ee3ee247f795a69e53cd91d927146fb16c4e803c7ac86c84104940c7d2cabf0"}, 299 | {file = "contourpy-1.0.7-cp311-cp311-win_amd64.whl", hash = "sha256:5caeacc68642e5f19d707471890f037a13007feba8427eb7f2a60811a1fc1350"}, 300 | {file = "contourpy-1.0.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fd7dc0e6812b799a34f6d12fcb1000539098c249c8da54f3566c6a6461d0dbad"}, 301 | {file = "contourpy-1.0.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0f9d350b639db6c2c233d92c7f213d94d2e444d8e8fc5ca44c9706cf72193772"}, 302 | {file = "contourpy-1.0.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e96a08b62bb8de960d3a6afbc5ed8421bf1a2d9c85cc4ea73f4bc81b4910500f"}, 303 | {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:031154ed61f7328ad7f97662e48660a150ef84ee1bc8876b6472af88bf5a9b98"}, 304 | {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e9ebb4425fc1b658e13bace354c48a933b842d53c458f02c86f371cecbedecc"}, 305 | {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efb8f6d08ca7998cf59eaf50c9d60717f29a1a0a09caa46460d33b2924839dbd"}, 306 | {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6c180d89a28787e4b73b07e9b0e2dac7741261dbdca95f2b489c4f8f887dd810"}, 307 | {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b8d587cc39057d0afd4166083d289bdeff221ac6d3ee5046aef2d480dc4b503c"}, 308 | {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:769eef00437edf115e24d87f8926955f00f7704bede656ce605097584f9966dc"}, 309 | {file = "contourpy-1.0.7-cp38-cp38-win32.whl", hash = "sha256:62398c80ef57589bdbe1eb8537127321c1abcfdf8c5f14f479dbbe27d0322e66"}, 310 | {file = "contourpy-1.0.7-cp38-cp38-win_amd64.whl", hash = "sha256:57119b0116e3f408acbdccf9eb6ef19d7fe7baf0d1e9aaa5381489bc1aa56556"}, 311 | {file = "contourpy-1.0.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:30676ca45084ee61e9c3da589042c24a57592e375d4b138bd84d8709893a1ba4"}, 312 | {file = "contourpy-1.0.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e927b3868bd1e12acee7cc8f3747d815b4ab3e445a28d2e5373a7f4a6e76ba1"}, 313 | {file = "contourpy-1.0.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:366a0cf0fc079af5204801786ad7a1c007714ee3909e364dbac1729f5b0849e5"}, 314 | {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89ba9bb365446a22411f0673abf6ee1fea3b2cf47b37533b970904880ceb72f3"}, 315 | {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:71b0bf0c30d432278793d2141362ac853859e87de0a7dee24a1cea35231f0d50"}, 316 | {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7281244c99fd7c6f27c1c6bfafba878517b0b62925a09b586d88ce750a016d2"}, 317 | {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b6d0f9e1d39dbfb3977f9dd79f156c86eb03e57a7face96f199e02b18e58d32a"}, 318 | {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7f6979d20ee5693a1057ab53e043adffa1e7418d734c1532e2d9e915b08d8ec2"}, 319 | {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5dd34c1ae752515318224cba7fc62b53130c45ac6a1040c8b7c1a223c46e8967"}, 320 | {file = "contourpy-1.0.7-cp39-cp39-win32.whl", hash = "sha256:c5210e5d5117e9aec8c47d9156d1d3835570dd909a899171b9535cb4a3f32693"}, 321 | {file = "contourpy-1.0.7-cp39-cp39-win_amd64.whl", hash = "sha256:60835badb5ed5f4e194a6f21c09283dd6e007664a86101431bf870d9e86266c4"}, 322 | {file = "contourpy-1.0.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ce41676b3d0dd16dbcfabcc1dc46090aaf4688fd6e819ef343dbda5a57ef0161"}, 323 | {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a011cf354107b47c58ea932d13b04d93c6d1d69b8b6dce885e642531f847566"}, 324 | {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:31a55dccc8426e71817e3fe09b37d6d48ae40aae4ecbc8c7ad59d6893569c436"}, 325 | {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69f8ff4db108815addd900a74df665e135dbbd6547a8a69333a68e1f6e368ac2"}, 326 | {file = "contourpy-1.0.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efe99298ba37e37787f6a2ea868265465410822f7bea163edcc1bd3903354ea9"}, 327 | {file = "contourpy-1.0.7-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a1e97b86f73715e8670ef45292d7cc033548266f07d54e2183ecb3c87598888f"}, 328 | {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc331c13902d0f50845099434cd936d49d7a2ca76cb654b39691974cb1e4812d"}, 329 | {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24847601071f740837aefb730e01bd169fbcaa610209779a78db7ebb6e6a7051"}, 330 | {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abf298af1e7ad44eeb93501e40eb5a67abbf93b5d90e468d01fc0c4451971afa"}, 331 | {file = "contourpy-1.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:64757f6460fc55d7e16ed4f1de193f362104285c667c112b50a804d482777edd"}, 332 | {file = "contourpy-1.0.7.tar.gz", hash = "sha256:d8165a088d31798b59e91117d1f5fc3df8168d8b48c4acc10fc0df0d0bdbcc5e"}, 333 | ] 334 | 335 | [package.dependencies] 336 | numpy = ">=1.16" 337 | 338 | [package.extras] 339 | bokeh = ["bokeh", "chromedriver", "selenium"] 340 | docs = ["furo", "sphinx-copybutton"] 341 | mypy = ["contourpy[bokeh]", "docutils-stubs", "mypy (==0.991)", "types-Pillow"] 342 | test = ["Pillow", "matplotlib", "pytest"] 343 | test-no-images = ["pytest"] 344 | 345 | [[package]] 346 | name = "cookiecutter" 347 | version = "2.1.1" 348 | description = "A command-line utility that creates projects from project templates, e.g. creating a Python package project from a Python package project template." 349 | category = "dev" 350 | optional = false 351 | python-versions = ">=3.7" 352 | files = [ 353 | {file = "cookiecutter-2.1.1-py2.py3-none-any.whl", hash = "sha256:9f3ab027cec4f70916e28f03470bdb41e637a3ad354b4d65c765d93aad160022"}, 354 | {file = "cookiecutter-2.1.1.tar.gz", hash = "sha256:f3982be8d9c53dac1261864013fdec7f83afd2e42ede6f6dd069c5e149c540d5"}, 355 | ] 356 | 357 | [package.dependencies] 358 | binaryornot = ">=0.4.4" 359 | click = ">=7.0,<9.0.0" 360 | Jinja2 = ">=2.7,<4.0.0" 361 | jinja2-time = ">=0.2.0" 362 | python-slugify = ">=4.0.0" 363 | pyyaml = ">=5.3.1" 364 | requests = ">=2.23.0" 365 | 366 | [[package]] 367 | name = "cycler" 368 | version = "0.11.0" 369 | description = "Composable style cycles" 370 | category = "main" 371 | optional = false 372 | python-versions = ">=3.6" 373 | files = [ 374 | {file = "cycler-0.11.0-py3-none-any.whl", hash = "sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3"}, 375 | {file = "cycler-0.11.0.tar.gz", hash = "sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f"}, 376 | ] 377 | 378 | [[package]] 379 | name = "distlib" 380 | version = "0.3.6" 381 | description = "Distribution utilities" 382 | category = "dev" 383 | optional = false 384 | python-versions = "*" 385 | files = [ 386 | {file = "distlib-0.3.6-py2.py3-none-any.whl", hash = "sha256:f35c4b692542ca110de7ef0bea44d73981caeb34ca0b9b6b2e6d7790dda8f80e"}, 387 | {file = "distlib-0.3.6.tar.gz", hash = "sha256:14bad2d9b04d3a36127ac97f30b12a19268f211063d8f8ee4f47108896e11b46"}, 388 | ] 389 | 390 | [[package]] 391 | name = "fastapi" 392 | version = "0.92.0" 393 | description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" 394 | category = "main" 395 | optional = true 396 | python-versions = ">=3.7" 397 | files = [ 398 | {file = "fastapi-0.92.0-py3-none-any.whl", hash = "sha256:ae7b97c778e2f2ec3fb3cb4fb14162129411d99907fb71920f6d69a524340ebf"}, 399 | {file = "fastapi-0.92.0.tar.gz", hash = "sha256:023a0f5bd2c8b2609014d3bba1e14a1d7df96c6abea0a73070621c9862b9a4de"}, 400 | ] 401 | 402 | [package.dependencies] 403 | pydantic = ">=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0" 404 | starlette = ">=0.25.0,<0.26.0" 405 | 406 | [package.extras] 407 | all = ["email-validator (>=1.1.1)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] 408 | dev = ["pre-commit (>=2.17.0,<3.0.0)", "ruff (==0.0.138)", "uvicorn[standard] (>=0.12.0,<0.21.0)"] 409 | doc = ["mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-markdownextradata-plugin (>=0.1.7,<0.3.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "pyyaml (>=5.3.1,<7.0.0)", "typer[all] (>=0.6.1,<0.8.0)"] 410 | test = ["anyio[trio] (>=3.2.1,<4.0.0)", "black (==22.10.0)", "coverage[toml] (>=6.5.0,<8.0)", "databases[sqlite] (>=0.3.2,<0.7.0)", "email-validator (>=1.1.1,<2.0.0)", "flask (>=1.1.2,<3.0.0)", "httpx (>=0.23.0,<0.24.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.982)", "orjson (>=3.2.1,<4.0.0)", "passlib[bcrypt] (>=1.7.2,<2.0.0)", "peewee (>=3.13.3,<4.0.0)", "pytest (>=7.1.3,<8.0.0)", "python-jose[cryptography] (>=3.3.0,<4.0.0)", "python-multipart (>=0.0.5,<0.0.6)", "pyyaml (>=5.3.1,<7.0.0)", "ruff (==0.0.138)", "sqlalchemy (>=1.3.18,<1.4.43)", "types-orjson (==3.6.2)", "types-ujson (==5.6.0.0)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0,<6.0.0)"] 411 | 412 | [[package]] 413 | name = "filelock" 414 | version = "3.9.0" 415 | description = "A platform independent file lock." 416 | category = "dev" 417 | optional = false 418 | python-versions = ">=3.7" 419 | files = [ 420 | {file = "filelock-3.9.0-py3-none-any.whl", hash = "sha256:f58d535af89bb9ad5cd4df046f741f8553a418c01a7856bf0d173bbc9f6bd16d"}, 421 | {file = "filelock-3.9.0.tar.gz", hash = "sha256:7b319f24340b51f55a2bf7a12ac0755a9b03e718311dac567a0f4f7fabd2f5de"}, 422 | ] 423 | 424 | [package.extras] 425 | docs = ["furo (>=2022.12.7)", "sphinx (>=5.3)", "sphinx-autodoc-typehints (>=1.19.5)"] 426 | testing = ["covdefaults (>=2.2.2)", "coverage (>=7.0.1)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-timeout (>=2.1)"] 427 | 428 | [[package]] 429 | name = "fonttools" 430 | version = "4.38.0" 431 | description = "Tools to manipulate font files" 432 | category = "main" 433 | optional = false 434 | python-versions = ">=3.7" 435 | files = [ 436 | {file = "fonttools-4.38.0-py3-none-any.whl", hash = "sha256:820466f43c8be8c3009aef8b87e785014133508f0de64ec469e4efb643ae54fb"}, 437 | {file = "fonttools-4.38.0.zip", hash = "sha256:2bb244009f9bf3fa100fc3ead6aeb99febe5985fa20afbfbaa2f8946c2fbdaf1"}, 438 | ] 439 | 440 | [package.extras] 441 | all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=14.0.0)", "xattr", "zopfli (>=0.1.4)"] 442 | graphite = ["lz4 (>=1.7.4.2)"] 443 | interpolatable = ["munkres", "scipy"] 444 | lxml = ["lxml (>=4.0,<5)"] 445 | pathops = ["skia-pathops (>=0.5.0)"] 446 | plot = ["matplotlib"] 447 | repacker = ["uharfbuzz (>=0.23.0)"] 448 | symfont = ["sympy"] 449 | type1 = ["xattr"] 450 | ufo = ["fs (>=2.2.0,<3)"] 451 | unicode = ["unicodedata2 (>=14.0.0)"] 452 | woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] 453 | 454 | [[package]] 455 | name = "h11" 456 | version = "0.14.0" 457 | description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" 458 | category = "main" 459 | optional = false 460 | python-versions = ">=3.7" 461 | files = [ 462 | {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, 463 | {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, 464 | ] 465 | 466 | [[package]] 467 | name = "httpcore" 468 | version = "0.16.3" 469 | description = "A minimal low-level HTTP client." 470 | category = "main" 471 | optional = false 472 | python-versions = ">=3.7" 473 | files = [ 474 | {file = "httpcore-0.16.3-py3-none-any.whl", hash = "sha256:da1fb708784a938aa084bde4feb8317056c55037247c787bd7e19eb2c2949dc0"}, 475 | {file = "httpcore-0.16.3.tar.gz", hash = "sha256:c5d6f04e2fc530f39e0c077e6a30caa53f1451096120f1f38b954afd0b17c0cb"}, 476 | ] 477 | 478 | [package.dependencies] 479 | anyio = ">=3.0,<5.0" 480 | certifi = "*" 481 | h11 = ">=0.13,<0.15" 482 | sniffio = ">=1.0.0,<2.0.0" 483 | 484 | [package.extras] 485 | http2 = ["h2 (>=3,<5)"] 486 | socks = ["socksio (>=1.0.0,<2.0.0)"] 487 | 488 | [[package]] 489 | name = "httptools" 490 | version = "0.5.0" 491 | description = "A collection of framework independent HTTP protocol utils." 492 | category = "main" 493 | optional = true 494 | python-versions = ">=3.5.0" 495 | files = [ 496 | {file = "httptools-0.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8f470c79061599a126d74385623ff4744c4e0f4a0997a353a44923c0b561ee51"}, 497 | {file = "httptools-0.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e90491a4d77d0cb82e0e7a9cb35d86284c677402e4ce7ba6b448ccc7325c5421"}, 498 | {file = "httptools-0.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1d2357f791b12d86faced7b5736dea9ef4f5ecdc6c3f253e445ee82da579449"}, 499 | {file = "httptools-0.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f90cd6fd97c9a1b7fe9215e60c3bd97336742a0857f00a4cb31547bc22560c2"}, 500 | {file = "httptools-0.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5230a99e724a1bdbbf236a1b58d6e8504b912b0552721c7c6b8570925ee0ccde"}, 501 | {file = "httptools-0.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3a47a34f6015dd52c9eb629c0f5a8a5193e47bf2a12d9a3194d231eaf1bc451a"}, 502 | {file = "httptools-0.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:24bb4bb8ac3882f90aa95403a1cb48465de877e2d5298ad6ddcfdebec060787d"}, 503 | {file = "httptools-0.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e67d4f8734f8054d2c4858570cc4b233bf753f56e85217de4dfb2495904cf02e"}, 504 | {file = "httptools-0.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7e5eefc58d20e4c2da82c78d91b2906f1a947ef42bd668db05f4ab4201a99f49"}, 505 | {file = "httptools-0.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0297822cea9f90a38df29f48e40b42ac3d48a28637368f3ec6d15eebefd182f9"}, 506 | {file = "httptools-0.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:557be7fbf2bfa4a2ec65192c254e151684545ebab45eca5d50477d562c40f986"}, 507 | {file = "httptools-0.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:54465401dbbec9a6a42cf737627fb0f014d50dc7365a6b6cd57753f151a86ff0"}, 508 | {file = "httptools-0.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4d9ebac23d2de960726ce45f49d70eb5466725c0087a078866043dad115f850f"}, 509 | {file = "httptools-0.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:e8a34e4c0ab7b1ca17b8763613783e2458e77938092c18ac919420ab8655c8c1"}, 510 | {file = "httptools-0.5.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f659d7a48401158c59933904040085c200b4be631cb5f23a7d561fbae593ec1f"}, 511 | {file = "httptools-0.5.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef1616b3ba965cd68e6f759eeb5d34fbf596a79e84215eeceebf34ba3f61fdc7"}, 512 | {file = "httptools-0.5.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3625a55886257755cb15194efbf209584754e31d336e09e2ffe0685a76cb4b60"}, 513 | {file = "httptools-0.5.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:72ad589ba5e4a87e1d404cc1cb1b5780bfcb16e2aec957b88ce15fe879cc08ca"}, 514 | {file = "httptools-0.5.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:850fec36c48df5a790aa735417dca8ce7d4b48d59b3ebd6f83e88a8125cde324"}, 515 | {file = "httptools-0.5.0-cp36-cp36m-win_amd64.whl", hash = "sha256:f222e1e9d3f13b68ff8a835574eda02e67277d51631d69d7cf7f8e07df678c86"}, 516 | {file = "httptools-0.5.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3cb8acf8f951363b617a8420768a9f249099b92e703c052f9a51b66342eea89b"}, 517 | {file = "httptools-0.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:550059885dc9c19a072ca6d6735739d879be3b5959ec218ba3e013fd2255a11b"}, 518 | {file = "httptools-0.5.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a04fe458a4597aa559b79c7f48fe3dceabef0f69f562daf5c5e926b153817281"}, 519 | {file = "httptools-0.5.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7d0c1044bce274ec6711f0770fd2d5544fe392591d204c68328e60a46f88843b"}, 520 | {file = "httptools-0.5.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c6eeefd4435055a8ebb6c5cc36111b8591c192c56a95b45fe2af22d9881eee25"}, 521 | {file = "httptools-0.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:5b65be160adcd9de7a7e6413a4966665756e263f0d5ddeffde277ffeee0576a5"}, 522 | {file = "httptools-0.5.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fe9c766a0c35b7e3d6b6939393c8dfdd5da3ac5dec7f971ec9134f284c6c36d6"}, 523 | {file = "httptools-0.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:85b392aba273566c3d5596a0a490978c085b79700814fb22bfd537d381dd230c"}, 524 | {file = "httptools-0.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5e3088f4ed33947e16fd865b8200f9cfae1144f41b64a8cf19b599508e096bc"}, 525 | {file = "httptools-0.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c2a56b6aad7cc8f5551d8e04ff5a319d203f9d870398b94702300de50190f63"}, 526 | {file = "httptools-0.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9b571b281a19762adb3f48a7731f6842f920fa71108aff9be49888320ac3e24d"}, 527 | {file = "httptools-0.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa47ffcf70ba6f7848349b8a6f9b481ee0f7637931d91a9860a1838bfc586901"}, 528 | {file = "httptools-0.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:bede7ee075e54b9a5bde695b4fc8f569f30185891796b2e4e09e2226801d09bd"}, 529 | {file = "httptools-0.5.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:64eba6f168803a7469866a9c9b5263a7463fa8b7a25b35e547492aa7322036b6"}, 530 | {file = "httptools-0.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4b098e4bb1174096a93f48f6193e7d9aa7071506a5877da09a783509ca5fff42"}, 531 | {file = "httptools-0.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9423a2de923820c7e82e18980b937893f4aa8251c43684fa1772e341f6e06887"}, 532 | {file = "httptools-0.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca1b7becf7d9d3ccdbb2f038f665c0f4857e08e1d8481cbcc1a86a0afcfb62b2"}, 533 | {file = "httptools-0.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:50d4613025f15f4b11f1c54bbed4761c0020f7f921b95143ad6d58c151198142"}, 534 | {file = "httptools-0.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8ffce9d81c825ac1deaa13bc9694c0562e2840a48ba21cfc9f3b4c922c16f372"}, 535 | {file = "httptools-0.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:1af91b3650ce518d226466f30bbba5b6376dbd3ddb1b2be8b0658c6799dd450b"}, 536 | {file = "httptools-0.5.0.tar.gz", hash = "sha256:295874861c173f9101960bba332429bb77ed4dcd8cdf5cee9922eb00e4f6bc09"}, 537 | ] 538 | 539 | [package.extras] 540 | test = ["Cython (>=0.29.24,<0.30.0)"] 541 | 542 | [[package]] 543 | name = "httpx" 544 | version = "0.23.3" 545 | description = "The next generation HTTP client." 546 | category = "main" 547 | optional = false 548 | python-versions = ">=3.7" 549 | files = [ 550 | {file = "httpx-0.23.3-py3-none-any.whl", hash = "sha256:a211fcce9b1254ea24f0cd6af9869b3d29aba40154e947d2a07bb499b3e310d6"}, 551 | {file = "httpx-0.23.3.tar.gz", hash = "sha256:9818458eb565bb54898ccb9b8b251a28785dd4a55afbc23d0eb410754fe7d0f9"}, 552 | ] 553 | 554 | [package.dependencies] 555 | certifi = "*" 556 | httpcore = ">=0.15.0,<0.17.0" 557 | rfc3986 = {version = ">=1.3,<2", extras = ["idna2008"]} 558 | sniffio = "*" 559 | 560 | [package.extras] 561 | brotli = ["brotli", "brotlicffi"] 562 | cli = ["click (>=8.0.0,<9.0.0)", "pygments (>=2.0.0,<3.0.0)", "rich (>=10,<13)"] 563 | http2 = ["h2 (>=3,<5)"] 564 | socks = ["socksio (>=1.0.0,<2.0.0)"] 565 | 566 | [[package]] 567 | name = "idna" 568 | version = "3.4" 569 | description = "Internationalized Domain Names in Applications (IDNA)" 570 | category = "main" 571 | optional = false 572 | python-versions = ">=3.5" 573 | files = [ 574 | {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, 575 | {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, 576 | ] 577 | 578 | [[package]] 579 | name = "importlib-metadata" 580 | version = "6.0.0" 581 | description = "Read metadata from Python packages" 582 | category = "dev" 583 | optional = false 584 | python-versions = ">=3.7" 585 | files = [ 586 | {file = "importlib_metadata-6.0.0-py3-none-any.whl", hash = "sha256:7efb448ec9a5e313a57655d35aa54cd3e01b7e1fbcf72dce1bf06119420f5bad"}, 587 | {file = "importlib_metadata-6.0.0.tar.gz", hash = "sha256:e354bedeb60efa6affdcc8ae121b73544a7aa74156d047311948f6d711cd378d"}, 588 | ] 589 | 590 | [package.dependencies] 591 | zipp = ">=0.5" 592 | 593 | [package.extras] 594 | docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] 595 | perf = ["ipython"] 596 | testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] 597 | 598 | [[package]] 599 | name = "importlib-resources" 600 | version = "5.12.0" 601 | description = "Read resources from Python packages" 602 | category = "main" 603 | optional = false 604 | python-versions = ">=3.7" 605 | files = [ 606 | {file = "importlib_resources-5.12.0-py3-none-any.whl", hash = "sha256:7b1deeebbf351c7578e09bf2f63fa2ce8b5ffec296e0d349139d43cca061a81a"}, 607 | {file = "importlib_resources-5.12.0.tar.gz", hash = "sha256:4be82589bf5c1d7999aedf2a45159d10cb3ca4f19b2271f8792bc8e6da7b22f6"}, 608 | ] 609 | 610 | [package.dependencies] 611 | zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} 612 | 613 | [package.extras] 614 | docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] 615 | testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] 616 | 617 | [[package]] 618 | name = "jinja2" 619 | version = "3.1.2" 620 | description = "A very fast and expressive template engine." 621 | category = "dev" 622 | optional = false 623 | python-versions = ">=3.7" 624 | files = [ 625 | {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, 626 | {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, 627 | ] 628 | 629 | [package.dependencies] 630 | MarkupSafe = ">=2.0" 631 | 632 | [package.extras] 633 | i18n = ["Babel (>=2.7)"] 634 | 635 | [[package]] 636 | name = "jinja2-time" 637 | version = "0.2.0" 638 | description = "Jinja2 Extension for Dates and Times" 639 | category = "dev" 640 | optional = false 641 | python-versions = "*" 642 | files = [ 643 | {file = "jinja2-time-0.2.0.tar.gz", hash = "sha256:d14eaa4d315e7688daa4969f616f226614350c48730bfa1692d2caebd8c90d40"}, 644 | {file = "jinja2_time-0.2.0-py2.py3-none-any.whl", hash = "sha256:d3eab6605e3ec8b7a0863df09cc1d23714908fa61aa6986a845c20ba488b4efa"}, 645 | ] 646 | 647 | [package.dependencies] 648 | arrow = "*" 649 | jinja2 = "*" 650 | 651 | [[package]] 652 | name = "kiwisolver" 653 | version = "1.4.4" 654 | description = "A fast implementation of the Cassowary constraint solver" 655 | category = "main" 656 | optional = false 657 | python-versions = ">=3.7" 658 | files = [ 659 | {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2f5e60fabb7343a836360c4f0919b8cd0d6dbf08ad2ca6b9cf90bf0c76a3c4f6"}, 660 | {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:10ee06759482c78bdb864f4109886dff7b8a56529bc1609d4f1112b93fe6423c"}, 661 | {file = "kiwisolver-1.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c79ebe8f3676a4c6630fd3f777f3cfecf9289666c84e775a67d1d358578dc2e3"}, 662 | {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:abbe9fa13da955feb8202e215c4018f4bb57469b1b78c7a4c5c7b93001699938"}, 663 | {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7577c1987baa3adc4b3c62c33bd1118c3ef5c8ddef36f0f2c950ae0b199e100d"}, 664 | {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ad8285b01b0d4695102546b342b493b3ccc6781fc28c8c6a1bb63e95d22f09"}, 665 | {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ed58b8acf29798b036d347791141767ccf65eee7f26bde03a71c944449e53de"}, 666 | {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a68b62a02953b9841730db7797422f983935aeefceb1679f0fc85cbfbd311c32"}, 667 | {file = "kiwisolver-1.4.4-cp310-cp310-win32.whl", hash = "sha256:e92a513161077b53447160b9bd8f522edfbed4bd9759e4c18ab05d7ef7e49408"}, 668 | {file = "kiwisolver-1.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:3fe20f63c9ecee44560d0e7f116b3a747a5d7203376abeea292ab3152334d004"}, 669 | {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ea21f66820452a3f5d1655f8704a60d66ba1191359b96541eaf457710a5fc6"}, 670 | {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bc9db8a3efb3e403e4ecc6cd9489ea2bac94244f80c78e27c31dcc00d2790ac2"}, 671 | {file = "kiwisolver-1.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d5b61785a9ce44e5a4b880272baa7cf6c8f48a5180c3e81c59553ba0cb0821ca"}, 672 | {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c2dbb44c3f7e6c4d3487b31037b1bdbf424d97687c1747ce4ff2895795c9bf69"}, 673 | {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6295ecd49304dcf3bfbfa45d9a081c96509e95f4b9d0eb7ee4ec0530c4a96514"}, 674 | {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4bd472dbe5e136f96a4b18f295d159d7f26fd399136f5b17b08c4e5f498cd494"}, 675 | {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf7d9fce9bcc4752ca4a1b80aabd38f6d19009ea5cbda0e0856983cf6d0023f5"}, 676 | {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78d6601aed50c74e0ef02f4204da1816147a6d3fbdc8b3872d263338a9052c51"}, 677 | {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:877272cf6b4b7e94c9614f9b10140e198d2186363728ed0f701c6eee1baec1da"}, 678 | {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:db608a6757adabb32f1cfe6066e39b3706d8c3aa69bbc353a5b61edad36a5cb4"}, 679 | {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5853eb494c71e267912275e5586fe281444eb5e722de4e131cddf9d442615626"}, 680 | {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f0a1dbdb5ecbef0d34eb77e56fcb3e95bbd7e50835d9782a45df81cc46949750"}, 681 | {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:283dffbf061a4ec60391d51e6155e372a1f7a4f5b15d59c8505339454f8989e4"}, 682 | {file = "kiwisolver-1.4.4-cp311-cp311-win32.whl", hash = "sha256:d06adcfa62a4431d404c31216f0f8ac97397d799cd53800e9d3efc2fbb3cf14e"}, 683 | {file = "kiwisolver-1.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:e7da3fec7408813a7cebc9e4ec55afed2d0fd65c4754bc376bf03498d4e92686"}, 684 | {file = "kiwisolver-1.4.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:62ac9cc684da4cf1778d07a89bf5f81b35834cb96ca523d3a7fb32509380cbf6"}, 685 | {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41dae968a94b1ef1897cb322b39360a0812661dba7c682aa45098eb8e193dbdf"}, 686 | {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02f79693ec433cb4b5f51694e8477ae83b3205768a6fb48ffba60549080e295b"}, 687 | {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d0611a0a2a518464c05ddd5a3a1a0e856ccc10e67079bb17f265ad19ab3c7597"}, 688 | {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:db5283d90da4174865d520e7366801a93777201e91e79bacbac6e6927cbceede"}, 689 | {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1041feb4cda8708ce73bb4dcb9ce1ccf49d553bf87c3954bdfa46f0c3f77252c"}, 690 | {file = "kiwisolver-1.4.4-cp37-cp37m-win32.whl", hash = "sha256:a553dadda40fef6bfa1456dc4be49b113aa92c2a9a9e8711e955618cd69622e3"}, 691 | {file = "kiwisolver-1.4.4-cp37-cp37m-win_amd64.whl", hash = "sha256:03baab2d6b4a54ddbb43bba1a3a2d1627e82d205c5cf8f4c924dc49284b87166"}, 692 | {file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:841293b17ad704d70c578f1f0013c890e219952169ce8a24ebc063eecf775454"}, 693 | {file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f4f270de01dd3e129a72efad823da90cc4d6aafb64c410c9033aba70db9f1ff0"}, 694 | {file = "kiwisolver-1.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f9f39e2f049db33a908319cf46624a569b36983c7c78318e9726a4cb8923b26c"}, 695 | {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c97528e64cb9ebeff9701e7938653a9951922f2a38bd847787d4a8e498cc83ae"}, 696 | {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d1573129aa0fd901076e2bfb4275a35f5b7aa60fbfb984499d661ec950320b0"}, 697 | {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ad881edc7ccb9d65b0224f4e4d05a1e85cf62d73aab798943df6d48ab0cd79a1"}, 698 | {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b428ef021242344340460fa4c9185d0b1f66fbdbfecc6c63eff4b7c29fad429d"}, 699 | {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2e407cb4bd5a13984a6c2c0fe1845e4e41e96f183e5e5cd4d77a857d9693494c"}, 700 | {file = "kiwisolver-1.4.4-cp38-cp38-win32.whl", hash = "sha256:75facbe9606748f43428fc91a43edb46c7ff68889b91fa31f53b58894503a191"}, 701 | {file = "kiwisolver-1.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:5bce61af018b0cb2055e0e72e7d65290d822d3feee430b7b8203d8a855e78766"}, 702 | {file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8c808594c88a025d4e322d5bb549282c93c8e1ba71b790f539567932722d7bd8"}, 703 | {file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0a71d85ecdd570ded8ac3d1c0f480842f49a40beb423bb8014539a9f32a5897"}, 704 | {file = "kiwisolver-1.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b533558eae785e33e8c148a8d9921692a9fe5aa516efbdff8606e7d87b9d5824"}, 705 | {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:efda5fc8cc1c61e4f639b8067d118e742b812c930f708e6667a5ce0d13499e29"}, 706 | {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7c43e1e1206cd421cd92e6b3280d4385d41d7166b3ed577ac20444b6995a445f"}, 707 | {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc8d3bd6c72b2dd9decf16ce70e20abcb3274ba01b4e1c96031e0c4067d1e7cd"}, 708 | {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ea39b0ccc4f5d803e3337dd46bcce60b702be4d86fd0b3d7531ef10fd99a1ac"}, 709 | {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:968f44fdbf6dd757d12920d63b566eeb4d5b395fd2d00d29d7ef00a00582aac9"}, 710 | {file = "kiwisolver-1.4.4-cp39-cp39-win32.whl", hash = "sha256:da7e547706e69e45d95e116e6939488d62174e033b763ab1496b4c29b76fabea"}, 711 | {file = "kiwisolver-1.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:ba59c92039ec0a66103b1d5fe588fa546373587a7d68f5c96f743c3396afc04b"}, 712 | {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:91672bacaa030f92fc2f43b620d7b337fd9a5af28b0d6ed3f77afc43c4a64b5a"}, 713 | {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:787518a6789009c159453da4d6b683f468ef7a65bbde796bcea803ccf191058d"}, 714 | {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da152d8cdcab0e56e4f45eb08b9aea6455845ec83172092f09b0e077ece2cf7a"}, 715 | {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ecb1fa0db7bf4cff9dac752abb19505a233c7f16684c5826d1f11ebd9472b871"}, 716 | {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:28bc5b299f48150b5f822ce68624e445040595a4ac3d59251703779836eceff9"}, 717 | {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:81e38381b782cc7e1e46c4e14cd997ee6040768101aefc8fa3c24a4cc58e98f8"}, 718 | {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2a66fdfb34e05b705620dd567f5a03f239a088d5a3f321e7b6ac3239d22aa286"}, 719 | {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:872b8ca05c40d309ed13eb2e582cab0c5a05e81e987ab9c521bf05ad1d5cf5cb"}, 720 | {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:70e7c2e7b750585569564e2e5ca9845acfaa5da56ac46df68414f29fea97be9f"}, 721 | {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9f85003f5dfa867e86d53fac6f7e6f30c045673fa27b603c397753bebadc3008"}, 722 | {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e307eb9bd99801f82789b44bb45e9f541961831c7311521b13a6c85afc09767"}, 723 | {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1792d939ec70abe76f5054d3f36ed5656021dcad1322d1cc996d4e54165cef9"}, 724 | {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6cb459eea32a4e2cf18ba5fcece2dbdf496384413bc1bae15583f19e567f3b2"}, 725 | {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36dafec3d6d6088d34e2de6b85f9d8e2324eb734162fba59d2ba9ed7a2043d5b"}, 726 | {file = "kiwisolver-1.4.4.tar.gz", hash = "sha256:d41997519fcba4a1e46eb4a2fe31bc12f0ff957b2b81bac28db24744f333e955"}, 727 | ] 728 | 729 | [[package]] 730 | name = "loguru" 731 | version = "0.6.0" 732 | description = "Python logging made (stupidly) simple" 733 | category = "main" 734 | optional = false 735 | python-versions = ">=3.5" 736 | files = [ 737 | {file = "loguru-0.6.0-py3-none-any.whl", hash = "sha256:4e2414d534a2ab57573365b3e6d0234dfb1d84b68b7f3b948e6fb743860a77c3"}, 738 | {file = "loguru-0.6.0.tar.gz", hash = "sha256:066bd06758d0a513e9836fd9c6b5a75bfb3fd36841f4b996bc60b547a309d41c"}, 739 | ] 740 | 741 | [package.dependencies] 742 | colorama = {version = ">=0.3.4", markers = "sys_platform == \"win32\""} 743 | win32-setctime = {version = ">=1.0.0", markers = "sys_platform == \"win32\""} 744 | 745 | [package.extras] 746 | dev = ["Sphinx (>=4.1.1)", "black (>=19.10b0)", "colorama (>=0.3.4)", "docutils (==0.16)", "flake8 (>=3.7.7)", "isort (>=5.1.1)", "pytest (>=4.6.2)", "pytest-cov (>=2.7.1)", "sphinx-autobuild (>=0.7.1)", "sphinx-rtd-theme (>=0.4.3)", "tox (>=3.9.0)"] 747 | 748 | [[package]] 749 | name = "markupsafe" 750 | version = "2.1.2" 751 | description = "Safely add untrusted strings to HTML/XML markup." 752 | category = "dev" 753 | optional = false 754 | python-versions = ">=3.7" 755 | files = [ 756 | {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:665a36ae6f8f20a4676b53224e33d456a6f5a72657d9c83c2aa00765072f31f7"}, 757 | {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:340bea174e9761308703ae988e982005aedf427de816d1afe98147668cc03036"}, 758 | {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22152d00bf4a9c7c83960521fc558f55a1adbc0631fbb00a9471e097b19d72e1"}, 759 | {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28057e985dace2f478e042eaa15606c7efccb700797660629da387eb289b9323"}, 760 | {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca244fa73f50a800cf8c3ebf7fd93149ec37f5cb9596aa8873ae2c1d23498601"}, 761 | {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d9d971ec1e79906046aa3ca266de79eac42f1dbf3612a05dc9368125952bd1a1"}, 762 | {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7e007132af78ea9df29495dbf7b5824cb71648d7133cf7848a2a5dd00d36f9ff"}, 763 | {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7313ce6a199651c4ed9d7e4cfb4aa56fe923b1adf9af3b420ee14e6d9a73df65"}, 764 | {file = "MarkupSafe-2.1.2-cp310-cp310-win32.whl", hash = "sha256:c4a549890a45f57f1ebf99c067a4ad0cb423a05544accaf2b065246827ed9603"}, 765 | {file = "MarkupSafe-2.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:835fb5e38fd89328e9c81067fd642b3593c33e1e17e2fdbf77f5676abb14a156"}, 766 | {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2ec4f2d48ae59bbb9d1f9d7efb9236ab81429a764dedca114f5fdabbc3788013"}, 767 | {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:608e7073dfa9e38a85d38474c082d4281f4ce276ac0010224eaba11e929dd53a"}, 768 | {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65608c35bfb8a76763f37036547f7adfd09270fbdbf96608be2bead319728fcd"}, 769 | {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2bfb563d0211ce16b63c7cb9395d2c682a23187f54c3d79bfec33e6705473c6"}, 770 | {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da25303d91526aac3672ee6d49a2f3db2d9502a4a60b55519feb1a4c7714e07d"}, 771 | {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9cad97ab29dfc3f0249b483412c85c8ef4766d96cdf9dcf5a1e3caa3f3661cf1"}, 772 | {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:085fd3201e7b12809f9e6e9bc1e5c96a368c8523fad5afb02afe3c051ae4afcc"}, 773 | {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1bea30e9bf331f3fef67e0a3877b2288593c98a21ccb2cf29b74c581a4eb3af0"}, 774 | {file = "MarkupSafe-2.1.2-cp311-cp311-win32.whl", hash = "sha256:7df70907e00c970c60b9ef2938d894a9381f38e6b9db73c5be35e59d92e06625"}, 775 | {file = "MarkupSafe-2.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:e55e40ff0cc8cc5c07996915ad367fa47da6b3fc091fdadca7f5403239c5fec3"}, 776 | {file = "MarkupSafe-2.1.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a6e40afa7f45939ca356f348c8e23048e02cb109ced1eb8420961b2f40fb373a"}, 777 | {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf877ab4ed6e302ec1d04952ca358b381a882fbd9d1b07cccbfd61783561f98a"}, 778 | {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63ba06c9941e46fa389d389644e2d8225e0e3e5ebcc4ff1ea8506dce646f8c8a"}, 779 | {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f1cd098434e83e656abf198f103a8207a8187c0fc110306691a2e94a78d0abb2"}, 780 | {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:55f44b440d491028addb3b88f72207d71eeebfb7b5dbf0643f7c023ae1fba619"}, 781 | {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a6f2fcca746e8d5910e18782f976489939d54a91f9411c32051b4aab2bd7c513"}, 782 | {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0b462104ba25f1ac006fdab8b6a01ebbfbce9ed37fd37fd4acd70c67c973e460"}, 783 | {file = "MarkupSafe-2.1.2-cp37-cp37m-win32.whl", hash = "sha256:7668b52e102d0ed87cb082380a7e2e1e78737ddecdde129acadb0eccc5423859"}, 784 | {file = "MarkupSafe-2.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6d6607f98fcf17e534162f0709aaad3ab7a96032723d8ac8750ffe17ae5a0666"}, 785 | {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a806db027852538d2ad7555b203300173dd1b77ba116de92da9afbc3a3be3eed"}, 786 | {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a4abaec6ca3ad8660690236d11bfe28dfd707778e2442b45addd2f086d6ef094"}, 787 | {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f03a532d7dee1bed20bc4884194a16160a2de9ffc6354b3878ec9682bb623c54"}, 788 | {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cf06cdc1dda95223e9d2d3c58d3b178aa5dacb35ee7e3bbac10e4e1faacb419"}, 789 | {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22731d79ed2eb25059ae3df1dfc9cb1546691cc41f4e3130fe6bfbc3ecbbecfa"}, 790 | {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f8ffb705ffcf5ddd0e80b65ddf7bed7ee4f5a441ea7d3419e861a12eaf41af58"}, 791 | {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8db032bf0ce9022a8e41a22598eefc802314e81b879ae093f36ce9ddf39ab1ba"}, 792 | {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2298c859cfc5463f1b64bd55cb3e602528db6fa0f3cfd568d3605c50678f8f03"}, 793 | {file = "MarkupSafe-2.1.2-cp38-cp38-win32.whl", hash = "sha256:50c42830a633fa0cf9e7d27664637532791bfc31c731a87b202d2d8ac40c3ea2"}, 794 | {file = "MarkupSafe-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:bb06feb762bade6bf3c8b844462274db0c76acc95c52abe8dbed28ae3d44a147"}, 795 | {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99625a92da8229df6d44335e6fcc558a5037dd0a760e11d84be2260e6f37002f"}, 796 | {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8bca7e26c1dd751236cfb0c6c72d4ad61d986e9a41bbf76cb445f69488b2a2bd"}, 797 | {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40627dcf047dadb22cd25ea7ecfe9cbf3bbbad0482ee5920b582f3809c97654f"}, 798 | {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40dfd3fefbef579ee058f139733ac336312663c6706d1163b82b3003fb1925c4"}, 799 | {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:090376d812fb6ac5f171e5938e82e7f2d7adc2b629101cec0db8b267815c85e2"}, 800 | {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2e7821bffe00aa6bd07a23913b7f4e01328c3d5cc0b40b36c0bd81d362faeb65"}, 801 | {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c0a33bc9f02c2b17c3ea382f91b4db0e6cde90b63b296422a939886a7a80de1c"}, 802 | {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b8526c6d437855442cdd3d87eede9c425c4445ea011ca38d937db299382e6fa3"}, 803 | {file = "MarkupSafe-2.1.2-cp39-cp39-win32.whl", hash = "sha256:137678c63c977754abe9086a3ec011e8fd985ab90631145dfb9294ad09c102a7"}, 804 | {file = "MarkupSafe-2.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:0576fe974b40a400449768941d5d0858cc624e3249dfd1e0c33674e5c7ca7aed"}, 805 | {file = "MarkupSafe-2.1.2.tar.gz", hash = "sha256:abcabc8c2b26036d62d4c746381a6f7cf60aafcc653198ad678306986b09450d"}, 806 | ] 807 | 808 | [[package]] 809 | name = "matplotlib" 810 | version = "3.7.0" 811 | description = "Python plotting package" 812 | category = "main" 813 | optional = false 814 | python-versions = ">=3.8" 815 | files = [ 816 | {file = "matplotlib-3.7.0-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:3da8b9618188346239e51f1ea6c0f8f05c6e218cfcc30b399dd7dd7f52e8bceb"}, 817 | {file = "matplotlib-3.7.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:c0592ba57217c22987b7322df10f75ef95bc44dce781692b4b7524085de66019"}, 818 | {file = "matplotlib-3.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:21269450243d6928da81a9bed201f0909432a74e7d0d65db5545b9fa8a0d0223"}, 819 | {file = "matplotlib-3.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb2e76cd429058d8954121c334dddfcd11a6186c6975bca61f3f248c99031b05"}, 820 | {file = "matplotlib-3.7.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de20eb1247725a2f889173d391a6d9e7e0f2540feda24030748283108b0478ec"}, 821 | {file = "matplotlib-3.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5465735eaaafd1cfaec3fed60aee776aeb3fd3992aa2e49f4635339c931d443"}, 822 | {file = "matplotlib-3.7.0-cp310-cp310-win32.whl", hash = "sha256:092e6abc80cdf8a95f7d1813e16c0e99ceda8d5b195a3ab859c680f3487b80a2"}, 823 | {file = "matplotlib-3.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:4f640534ec2760e270801056bc0d8a10777c48b30966eef78a7c35d8590915ba"}, 824 | {file = "matplotlib-3.7.0-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:f336e7014889c38c59029ebacc35c59236a852e4b23836708cfd3f43d1eaeed5"}, 825 | {file = "matplotlib-3.7.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3a10428d4f8d1a478ceabd652e61a175b2fdeed4175ab48da4a7b8deb561e3fa"}, 826 | {file = "matplotlib-3.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:46ca923e980f76d34c1c633343a72bb042d6ba690ecc649aababf5317997171d"}, 827 | {file = "matplotlib-3.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c849aa94ff2a70fb71f318f48a61076d1205c6013b9d3885ade7f992093ac434"}, 828 | {file = "matplotlib-3.7.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:827e78239292e561cfb70abf356a9d7eaf5bf6a85c97877f254009f20b892f89"}, 829 | {file = "matplotlib-3.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:691ef1f15360e439886186d0db77b5345b24da12cbc4fc57b26c4826db4d6cab"}, 830 | {file = "matplotlib-3.7.0-cp311-cp311-win32.whl", hash = "sha256:21a8aeac39b4a795e697265d800ce52ab59bdeb6bb23082e2d971f3041074f02"}, 831 | {file = "matplotlib-3.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:01681566e95b9423021b49dea6a2395c16fa054604eacb87f0f4c439750f9114"}, 832 | {file = "matplotlib-3.7.0-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:cf119eee4e57389fba5ac8b816934e95c256535e55f0b21628b4205737d1de85"}, 833 | {file = "matplotlib-3.7.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:21bd4033c40b95abd5b8453f036ed5aa70856e56ecbd887705c37dce007a4c21"}, 834 | {file = "matplotlib-3.7.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:111ef351f28fd823ed7177632070a6badd6f475607122bc9002a526f2502a0b5"}, 835 | {file = "matplotlib-3.7.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f91d35b3ef51d29d9c661069b9e4ba431ce283ffc533b981506889e144b5b40e"}, 836 | {file = "matplotlib-3.7.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0a776462a4a63c0bfc9df106c15a0897aa2dbab6795c693aa366e8e283958854"}, 837 | {file = "matplotlib-3.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0dfd4a0cbd151f6439e6d7f8dca5292839ca311e7e650596d073774847ca2e4f"}, 838 | {file = "matplotlib-3.7.0-cp38-cp38-win32.whl", hash = "sha256:56b7b79488209041a9bf7ddc34f1b069274489ce69e34dc63ae241d0d6b4b736"}, 839 | {file = "matplotlib-3.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:8665855f3919c80551f377bc16df618ceabf3ef65270bc14b60302dce88ca9ab"}, 840 | {file = "matplotlib-3.7.0-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:f910d924da8b9fb066b5beae0b85e34ed1b6293014892baadcf2a51da1c65807"}, 841 | {file = "matplotlib-3.7.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:cf6346644e8fe234dc847e6232145dac199a650d3d8025b3ef65107221584ba4"}, 842 | {file = "matplotlib-3.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3d1e52365d8d5af699f04581ca191112e1d1220a9ce4386b57d807124d8b55e6"}, 843 | {file = "matplotlib-3.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c869b646489c6a94375714032e5cec08e3aa8d3f7d4e8ef2b0fb50a52b317ce6"}, 844 | {file = "matplotlib-3.7.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4ddac5f59e78d04b20469bc43853a8e619bb6505c7eac8ffb343ff2c516d72f"}, 845 | {file = "matplotlib-3.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb0304c1cd802e9a25743414c887e8a7cd51d96c9ec96d388625d2cd1c137ae3"}, 846 | {file = "matplotlib-3.7.0-cp39-cp39-win32.whl", hash = "sha256:a06a6c9822e80f323549c6bc9da96d4f233178212ad9a5f4ab87fd153077a507"}, 847 | {file = "matplotlib-3.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:cb52aa97b92acdee090edfb65d1cb84ea60ab38e871ba8321a10bbcebc2a3540"}, 848 | {file = "matplotlib-3.7.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3493b48e56468c39bd9c1532566dff3b8062952721b7521e1f394eb6791495f4"}, 849 | {file = "matplotlib-3.7.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d0dcd1a0bf8d56551e8617d6dc3881d8a1c7fb37d14e5ec12cbb293f3e6170a"}, 850 | {file = "matplotlib-3.7.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51fb664c37714cbaac69c16d6b3719f517a13c96c3f76f4caadd5a0aa7ed0329"}, 851 | {file = "matplotlib-3.7.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4497d88c559b76da320b7759d64db442178beeea06a52dc0c629086982082dcd"}, 852 | {file = "matplotlib-3.7.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9d85355c48ef8b9994293eb7c00f44aa8a43cad7a297fbf0770a25cdb2244b91"}, 853 | {file = "matplotlib-3.7.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:03eb2c8ff8d85da679b71e14c7c95d16d014c48e0c0bfa14db85f6cdc5c92aad"}, 854 | {file = "matplotlib-3.7.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71b751d06b2ed1fd017de512d7439c0259822864ea16731522b251a27c0b2ede"}, 855 | {file = "matplotlib-3.7.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b51ab8a5d5d3bbd4527af633a638325f492e09e45e78afdf816ef55217a09664"}, 856 | {file = "matplotlib-3.7.0.tar.gz", hash = "sha256:8f6efd313430d7ef70a38a3276281cb2e8646b3a22b3b21eb227da20e15e6813"}, 857 | ] 858 | 859 | [package.dependencies] 860 | contourpy = ">=1.0.1" 861 | cycler = ">=0.10" 862 | fonttools = ">=4.22.0" 863 | importlib-resources = {version = ">=3.2.0", markers = "python_version < \"3.10\""} 864 | kiwisolver = ">=1.0.1" 865 | numpy = ">=1.20" 866 | packaging = ">=20.0" 867 | pillow = ">=6.2.0" 868 | pyparsing = ">=2.3.1" 869 | python-dateutil = ">=2.7" 870 | 871 | [[package]] 872 | name = "multidict" 873 | version = "6.0.4" 874 | description = "multidict implementation" 875 | category = "main" 876 | optional = true 877 | python-versions = ">=3.7" 878 | files = [ 879 | {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, 880 | {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, 881 | {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"}, 882 | {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"}, 883 | {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"}, 884 | {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"}, 885 | {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"}, 886 | {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"}, 887 | {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"}, 888 | {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"}, 889 | {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"}, 890 | {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"}, 891 | {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"}, 892 | {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"}, 893 | {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"}, 894 | {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"}, 895 | {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"}, 896 | {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"}, 897 | {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"}, 898 | {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"}, 899 | {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"}, 900 | {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"}, 901 | {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"}, 902 | {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"}, 903 | {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"}, 904 | {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"}, 905 | {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"}, 906 | {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"}, 907 | {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"}, 908 | {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"}, 909 | {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"}, 910 | {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"}, 911 | {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"}, 912 | {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"}, 913 | {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"}, 914 | {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"}, 915 | {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"}, 916 | {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"}, 917 | {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"}, 918 | {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"}, 919 | {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"}, 920 | {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"}, 921 | {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"}, 922 | {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"}, 923 | {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"}, 924 | {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"}, 925 | {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"}, 926 | {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"}, 927 | {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"}, 928 | {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"}, 929 | {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"}, 930 | {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"}, 931 | {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"}, 932 | {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"}, 933 | {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"}, 934 | {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"}, 935 | {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"}, 936 | {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"}, 937 | {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"}, 938 | {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"}, 939 | {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"}, 940 | {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"}, 941 | {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"}, 942 | {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"}, 943 | {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"}, 944 | {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"}, 945 | {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"}, 946 | {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"}, 947 | {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"}, 948 | {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"}, 949 | {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"}, 950 | {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"}, 951 | {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"}, 952 | {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, 953 | ] 954 | 955 | [[package]] 956 | name = "mypy-extensions" 957 | version = "1.0.0" 958 | description = "Type system extensions for programs checked with the mypy type checker." 959 | category = "dev" 960 | optional = false 961 | python-versions = ">=3.5" 962 | files = [ 963 | {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, 964 | {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, 965 | ] 966 | 967 | [[package]] 968 | name = "nb-cli" 969 | version = "1.0.4" 970 | description = "CLI for nonebot2" 971 | category = "dev" 972 | optional = false 973 | python-versions = ">=3.8, <4.0" 974 | files = [ 975 | {file = "nb-cli-1.0.4.tar.gz", hash = "sha256:f196967be533a2e46fd0b4dca51a4df7dbf65018f63c66be706b9fdaf8b6b854"}, 976 | {file = "nb_cli-1.0.4-py3-none-any.whl", hash = "sha256:44a0c289e2c77dd57d18731d083b739158f11ea3d2315bda9111d076185ca3b2"}, 977 | ] 978 | 979 | [package.dependencies] 980 | anyio = ">=3.6,<4.0" 981 | cashews = ">=5.0,<6.0" 982 | click = ">=8.0,<9.0" 983 | cookiecutter = ">=2.1,<3.0" 984 | httpx = ">=0.18,<1.0" 985 | importlib-metadata = {version = ">=4.6", markers = "python_version < \"3.10\""} 986 | jinja2 = ">=3.0,<4.0" 987 | noneprompt = ">=0.1.7,<1.0.0" 988 | pydantic = ">=1.9,<2.0" 989 | pyfiglet = ">=0.8.post1,<1.0.0" 990 | tomlkit = ">=0.10,<1.0" 991 | typing-extensions = ">=4.4,<5.0" 992 | virtualenv = ">=20.17.1,<20.18.0" 993 | watchfiles = ">=0.16,<1.0" 994 | wcwidth = ">=0.2,<1.0" 995 | 996 | [[package]] 997 | name = "nonebot2" 998 | version = "2.0.0rc3" 999 | description = "An asynchronous python bot framework." 1000 | category = "main" 1001 | optional = true 1002 | python-versions = ">=3.8,<4.0" 1003 | files = [ 1004 | {file = "nonebot2-2.0.0rc3-py3-none-any.whl", hash = "sha256:6596e9837e95e99a6cfa7c4e21d75a54a5f3529d34f30454136ebfef6aa374f4"}, 1005 | {file = "nonebot2-2.0.0rc3.tar.gz", hash = "sha256:a16da07b7c764d536cbdf9bcb86eb7cc21b1d254c966552ec5d20e0cb303cec2"}, 1006 | ] 1007 | 1008 | [package.dependencies] 1009 | fastapi = {version = ">=0.87.0,<0.89.0 || >0.89.0,<1.0.0", optional = true, markers = "extra == \"fastapi\" or extra == \"all\""} 1010 | loguru = ">=0.6.0,<0.7.0" 1011 | pydantic = {version = ">=1.10.0,<2.0.0", extras = ["dotenv"]} 1012 | pygtrie = ">=2.4.1,<3.0.0" 1013 | tomlkit = ">=0.10.0,<1.0.0" 1014 | typing-extensions = ">=3.10.0,<5.0.0" 1015 | uvicorn = {version = ">=0.20.0,<1.0.0", extras = ["standard"], optional = true, markers = "extra == \"quart\" or extra == \"fastapi\" or extra == \"all\""} 1016 | yarl = ">=1.7.2,<2.0.0" 1017 | 1018 | [package.extras] 1019 | aiohttp = ["aiohttp[speedups] (>=3.7.4,<4.0.0)"] 1020 | all = ["Quart (>=0.18.0,<1.0.0)", "aiohttp[speedups] (>=3.7.4,<4.0.0)", "fastapi (>=0.87.0,!=0.89.0,<1.0.0)", "httpx[http2] (>=0.20.0,<1.0.0)", "uvicorn[standard] (>=0.20.0,<1.0.0)", "websockets (>=10.0,<11.0)"] 1021 | fastapi = ["fastapi (>=0.87.0,!=0.89.0,<1.0.0)", "uvicorn[standard] (>=0.20.0,<1.0.0)"] 1022 | httpx = ["httpx[http2] (>=0.20.0,<1.0.0)"] 1023 | quart = ["Quart (>=0.18.0,<1.0.0)", "uvicorn[standard] (>=0.20.0,<1.0.0)"] 1024 | websockets = ["websockets (>=10.0,<11.0)"] 1025 | 1026 | [[package]] 1027 | name = "noneprompt" 1028 | version = "0.1.7" 1029 | description = "Prompt toolkit for console interaction" 1030 | category = "dev" 1031 | optional = false 1032 | python-versions = ">=3.7.3,<4.0.0" 1033 | files = [ 1034 | {file = "noneprompt-0.1.7-py3-none-any.whl", hash = "sha256:f45d86b147fafaefb7dd9ae6cdf06c9211c2fbe31193770153dc832573930296"}, 1035 | {file = "noneprompt-0.1.7.tar.gz", hash = "sha256:f21a6473ae02dec301e7b591ff5799c15b6ef0206f0eef3a0da510cea9cabdbf"}, 1036 | ] 1037 | 1038 | [package.dependencies] 1039 | prompt-toolkit = ">=3.0.19,<4.0.0" 1040 | 1041 | [[package]] 1042 | name = "numpy" 1043 | version = "1.24.2" 1044 | description = "Fundamental package for array computing in Python" 1045 | category = "main" 1046 | optional = false 1047 | python-versions = ">=3.8" 1048 | files = [ 1049 | {file = "numpy-1.24.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eef70b4fc1e872ebddc38cddacc87c19a3709c0e3e5d20bf3954c147b1dd941d"}, 1050 | {file = "numpy-1.24.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e8d2859428712785e8a8b7d2b3ef0a1d1565892367b32f915c4a4df44d0e64f5"}, 1051 | {file = "numpy-1.24.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6524630f71631be2dabe0c541e7675db82651eb998496bbe16bc4f77f0772253"}, 1052 | {file = "numpy-1.24.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a51725a815a6188c662fb66fb32077709a9ca38053f0274640293a14fdd22978"}, 1053 | {file = "numpy-1.24.2-cp310-cp310-win32.whl", hash = "sha256:2620e8592136e073bd12ee4536149380695fbe9ebeae845b81237f986479ffc9"}, 1054 | {file = "numpy-1.24.2-cp310-cp310-win_amd64.whl", hash = "sha256:97cf27e51fa078078c649a51d7ade3c92d9e709ba2bfb97493007103c741f1d0"}, 1055 | {file = "numpy-1.24.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7de8fdde0003f4294655aa5d5f0a89c26b9f22c0a58790c38fae1ed392d44a5a"}, 1056 | {file = "numpy-1.24.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4173bde9fa2a005c2c6e2ea8ac1618e2ed2c1c6ec8a7657237854d42094123a0"}, 1057 | {file = "numpy-1.24.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4cecaed30dc14123020f77b03601559fff3e6cd0c048f8b5289f4eeabb0eb281"}, 1058 | {file = "numpy-1.24.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a23f8440561a633204a67fb44617ce2a299beecf3295f0d13c495518908e910"}, 1059 | {file = "numpy-1.24.2-cp311-cp311-win32.whl", hash = "sha256:e428c4fbfa085f947b536706a2fc349245d7baa8334f0c5723c56a10595f9b95"}, 1060 | {file = "numpy-1.24.2-cp311-cp311-win_amd64.whl", hash = "sha256:557d42778a6869c2162deb40ad82612645e21d79e11c1dc62c6e82a2220ffb04"}, 1061 | {file = "numpy-1.24.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d0a2db9d20117bf523dde15858398e7c0858aadca7c0f088ac0d6edd360e9ad2"}, 1062 | {file = "numpy-1.24.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c72a6b2f4af1adfe193f7beb91ddf708ff867a3f977ef2ec53c0ffb8283ab9f5"}, 1063 | {file = "numpy-1.24.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c29e6bd0ec49a44d7690ecb623a8eac5ab8a923bce0bea6293953992edf3a76a"}, 1064 | {file = "numpy-1.24.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2eabd64ddb96a1239791da78fa5f4e1693ae2dadc82a76bc76a14cbb2b966e96"}, 1065 | {file = "numpy-1.24.2-cp38-cp38-win32.whl", hash = "sha256:e3ab5d32784e843fc0dd3ab6dcafc67ef806e6b6828dc6af2f689be0eb4d781d"}, 1066 | {file = "numpy-1.24.2-cp38-cp38-win_amd64.whl", hash = "sha256:76807b4063f0002c8532cfeac47a3068a69561e9c8715efdad3c642eb27c0756"}, 1067 | {file = "numpy-1.24.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4199e7cfc307a778f72d293372736223e39ec9ac096ff0a2e64853b866a8e18a"}, 1068 | {file = "numpy-1.24.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:adbdce121896fd3a17a77ab0b0b5eedf05a9834a18699db6829a64e1dfccca7f"}, 1069 | {file = "numpy-1.24.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:889b2cc88b837d86eda1b17008ebeb679d82875022200c6e8e4ce6cf549b7acb"}, 1070 | {file = "numpy-1.24.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f64bb98ac59b3ea3bf74b02f13836eb2e24e48e0ab0145bbda646295769bd780"}, 1071 | {file = "numpy-1.24.2-cp39-cp39-win32.whl", hash = "sha256:63e45511ee4d9d976637d11e6c9864eae50e12dc9598f531c035265991910468"}, 1072 | {file = "numpy-1.24.2-cp39-cp39-win_amd64.whl", hash = "sha256:a77d3e1163a7770164404607b7ba3967fb49b24782a6ef85d9b5f54126cc39e5"}, 1073 | {file = "numpy-1.24.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:92011118955724465fb6853def593cf397b4a1367495e0b59a7e69d40c4eb71d"}, 1074 | {file = "numpy-1.24.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9006288bcf4895917d02583cf3411f98631275bc67cce355a7f39f8c14338fa"}, 1075 | {file = "numpy-1.24.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:150947adbdfeceec4e5926d956a06865c1c690f2fd902efede4ca6fe2e657c3f"}, 1076 | {file = "numpy-1.24.2.tar.gz", hash = "sha256:003a9f530e880cb2cd177cba1af7220b9aa42def9c4afc2a2fc3ee6be7eb2b22"}, 1077 | ] 1078 | 1079 | [[package]] 1080 | name = "opencv-python-headless" 1081 | version = "4.7.0.68" 1082 | description = "Wrapper package for OpenCV python bindings." 1083 | category = "main" 1084 | optional = false 1085 | python-versions = ">=3.6" 1086 | files = [ 1087 | {file = "opencv-python-headless-4.7.0.68.tar.gz", hash = "sha256:a2109193e88570bbbdf5335541c74b5b27573f1c922e38f523febaeae77a81be"}, 1088 | {file = "opencv_python_headless-4.7.0.68-cp37-abi3-macosx_10_13_x86_64.whl", hash = "sha256:e0c5ab677ff730c87317f3d2e4ee97ce1d95052bec35886a1bf8c8ef328c82a2"}, 1089 | {file = "opencv_python_headless-4.7.0.68-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:f39df64ca733eebe1ed78fe4ac13bedb0ef77beeabddbb2c0e291cc6bf5fbcdc"}, 1090 | {file = "opencv_python_headless-4.7.0.68-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdda3cc5b65bf41be8c76f7d2ab9fda78a204a4837689351206d054444b5bb24"}, 1091 | {file = "opencv_python_headless-4.7.0.68-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abfbac281ab85d90c4d17f13febf5adb640b727e2c3557e1ae49a71359a87c31"}, 1092 | {file = "opencv_python_headless-4.7.0.68-cp37-abi3-win32.whl", hash = "sha256:636d9517d946048c3ba34bc0addbe1b9fd4273954e228d3dcd96687cd5d447c7"}, 1093 | {file = "opencv_python_headless-4.7.0.68-cp37-abi3-win_amd64.whl", hash = "sha256:e1cb2120720e54e0e563615ae4ccccf0f63d4f8a29b27722a185a22a7638103b"}, 1094 | ] 1095 | 1096 | [package.dependencies] 1097 | numpy = [ 1098 | {version = ">=1.21.0", markers = "python_version <= \"3.9\" and platform_system == \"Darwin\" and platform_machine == \"arm64\""}, 1099 | {version = ">=1.21.2", markers = "python_version >= \"3.10\""}, 1100 | {version = ">=1.21.4", markers = "python_version >= \"3.10\" and platform_system == \"Darwin\""}, 1101 | {version = ">=1.19.3", markers = "python_version >= \"3.6\" and platform_system == \"Linux\" and platform_machine == \"aarch64\" or python_version >= \"3.9\""}, 1102 | {version = ">=1.17.0", markers = "python_version >= \"3.7\""}, 1103 | {version = ">=1.17.3", markers = "python_version >= \"3.8\""}, 1104 | ] 1105 | 1106 | [[package]] 1107 | name = "packaging" 1108 | version = "23.0" 1109 | description = "Core utilities for Python packages" 1110 | category = "main" 1111 | optional = false 1112 | python-versions = ">=3.7" 1113 | files = [ 1114 | {file = "packaging-23.0-py3-none-any.whl", hash = "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2"}, 1115 | {file = "packaging-23.0.tar.gz", hash = "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97"}, 1116 | ] 1117 | 1118 | [[package]] 1119 | name = "pathspec" 1120 | version = "0.11.0" 1121 | description = "Utility library for gitignore style pattern matching of file paths." 1122 | category = "dev" 1123 | optional = false 1124 | python-versions = ">=3.7" 1125 | files = [ 1126 | {file = "pathspec-0.11.0-py3-none-any.whl", hash = "sha256:3a66eb970cbac598f9e5ccb5b2cf58930cd8e3ed86d393d541eaf2d8b1705229"}, 1127 | {file = "pathspec-0.11.0.tar.gz", hash = "sha256:64d338d4e0914e91c1792321e6907b5a593f1ab1851de7fc269557a21b30ebbc"}, 1128 | ] 1129 | 1130 | [[package]] 1131 | name = "pillow" 1132 | version = "9.4.0" 1133 | description = "Python Imaging Library (Fork)" 1134 | category = "main" 1135 | optional = false 1136 | python-versions = ">=3.7" 1137 | files = [ 1138 | {file = "Pillow-9.4.0-1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1b4b4e9dda4f4e4c4e6896f93e84a8f0bcca3b059de9ddf67dac3c334b1195e1"}, 1139 | {file = "Pillow-9.4.0-1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:fb5c1ad6bad98c57482236a21bf985ab0ef42bd51f7ad4e4538e89a997624e12"}, 1140 | {file = "Pillow-9.4.0-1-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:f0caf4a5dcf610d96c3bd32932bfac8aee61c96e60481c2a0ea58da435e25acd"}, 1141 | {file = "Pillow-9.4.0-1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:3f4cc516e0b264c8d4ccd6b6cbc69a07c6d582d8337df79be1e15a5056b258c9"}, 1142 | {file = "Pillow-9.4.0-1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:b8c2f6eb0df979ee99433d8b3f6d193d9590f735cf12274c108bd954e30ca858"}, 1143 | {file = "Pillow-9.4.0-1-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b70756ec9417c34e097f987b4d8c510975216ad26ba6e57ccb53bc758f490dab"}, 1144 | {file = "Pillow-9.4.0-1-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:43521ce2c4b865d385e78579a082b6ad1166ebed2b1a2293c3be1d68dd7ca3b9"}, 1145 | {file = "Pillow-9.4.0-2-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:9d9a62576b68cd90f7075876f4e8444487db5eeea0e4df3ba298ee38a8d067b0"}, 1146 | {file = "Pillow-9.4.0-2-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:87708d78a14d56a990fbf4f9cb350b7d89ee8988705e58e39bdf4d82c149210f"}, 1147 | {file = "Pillow-9.4.0-2-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:8a2b5874d17e72dfb80d917213abd55d7e1ed2479f38f001f264f7ce7bae757c"}, 1148 | {file = "Pillow-9.4.0-2-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:83125753a60cfc8c412de5896d10a0a405e0bd88d0470ad82e0869ddf0cb3848"}, 1149 | {file = "Pillow-9.4.0-2-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:9e5f94742033898bfe84c93c831a6f552bb629448d4072dd312306bab3bd96f1"}, 1150 | {file = "Pillow-9.4.0-2-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:013016af6b3a12a2f40b704677f8b51f72cb007dac785a9933d5c86a72a7fe33"}, 1151 | {file = "Pillow-9.4.0-2-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:99d92d148dd03fd19d16175b6d355cc1b01faf80dae93c6c3eb4163709edc0a9"}, 1152 | {file = "Pillow-9.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:2968c58feca624bb6c8502f9564dd187d0e1389964898f5e9e1fbc8533169157"}, 1153 | {file = "Pillow-9.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c5c1362c14aee73f50143d74389b2c158707b4abce2cb055b7ad37ce60738d47"}, 1154 | {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd752c5ff1b4a870b7661234694f24b1d2b9076b8bf337321a814c612665f343"}, 1155 | {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a3049a10261d7f2b6514d35bbb7a4dfc3ece4c4de14ef5876c4b7a23a0e566d"}, 1156 | {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16a8df99701f9095bea8a6c4b3197da105df6f74e6176c5b410bc2df2fd29a57"}, 1157 | {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:94cdff45173b1919350601f82d61365e792895e3c3a3443cf99819e6fbf717a5"}, 1158 | {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:ed3e4b4e1e6de75fdc16d3259098de7c6571b1a6cc863b1a49e7d3d53e036070"}, 1159 | {file = "Pillow-9.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5b2f8a31bd43e0f18172d8ac82347c8f37ef3e0b414431157718aa234991b28"}, 1160 | {file = "Pillow-9.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:09b89ddc95c248ee788328528e6a2996e09eaccddeeb82a5356e92645733be35"}, 1161 | {file = "Pillow-9.4.0-cp310-cp310-win32.whl", hash = "sha256:f09598b416ba39a8f489c124447b007fe865f786a89dbfa48bb5cf395693132a"}, 1162 | {file = "Pillow-9.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:f6e78171be3fb7941f9910ea15b4b14ec27725865a73c15277bc39f5ca4f8391"}, 1163 | {file = "Pillow-9.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:3fa1284762aacca6dc97474ee9c16f83990b8eeb6697f2ba17140d54b453e133"}, 1164 | {file = "Pillow-9.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:eaef5d2de3c7e9b21f1e762f289d17b726c2239a42b11e25446abf82b26ac132"}, 1165 | {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4dfdae195335abb4e89cc9762b2edc524f3c6e80d647a9a81bf81e17e3fb6f0"}, 1166 | {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6abfb51a82e919e3933eb137e17c4ae9c0475a25508ea88993bb59faf82f3b35"}, 1167 | {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:451f10ef963918e65b8869e17d67db5e2f4ab40e716ee6ce7129b0cde2876eab"}, 1168 | {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:6663977496d616b618b6cfa43ec86e479ee62b942e1da76a2c3daa1c75933ef4"}, 1169 | {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:60e7da3a3ad1812c128750fc1bc14a7ceeb8d29f77e0a2356a8fb2aa8925287d"}, 1170 | {file = "Pillow-9.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:19005a8e58b7c1796bc0167862b1f54a64d3b44ee5d48152b06bb861458bc0f8"}, 1171 | {file = "Pillow-9.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f715c32e774a60a337b2bb8ad9839b4abf75b267a0f18806f6f4f5f1688c4b5a"}, 1172 | {file = "Pillow-9.4.0-cp311-cp311-win32.whl", hash = "sha256:b222090c455d6d1a64e6b7bb5f4035c4dff479e22455c9eaa1bdd4c75b52c80c"}, 1173 | {file = "Pillow-9.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:ba6612b6548220ff5e9df85261bddc811a057b0b465a1226b39bfb8550616aee"}, 1174 | {file = "Pillow-9.4.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:5f532a2ad4d174eb73494e7397988e22bf427f91acc8e6ebf5bb10597b49c493"}, 1175 | {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dd5a9c3091a0f414a963d427f920368e2b6a4c2f7527fdd82cde8ef0bc7a327"}, 1176 | {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef21af928e807f10bf4141cad4746eee692a0dd3ff56cfb25fce076ec3cc8abe"}, 1177 | {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:847b114580c5cc9ebaf216dd8c8dbc6b00a3b7ab0131e173d7120e6deade1f57"}, 1178 | {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:653d7fb2df65efefbcbf81ef5fe5e5be931f1ee4332c2893ca638c9b11a409c4"}, 1179 | {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:46f39cab8bbf4a384ba7cb0bc8bae7b7062b6a11cfac1ca4bc144dea90d4a9f5"}, 1180 | {file = "Pillow-9.4.0-cp37-cp37m-win32.whl", hash = "sha256:7ac7594397698f77bce84382929747130765f66406dc2cd8b4ab4da68ade4c6e"}, 1181 | {file = "Pillow-9.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:46c259e87199041583658457372a183636ae8cd56dbf3f0755e0f376a7f9d0e6"}, 1182 | {file = "Pillow-9.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:0e51f608da093e5d9038c592b5b575cadc12fd748af1479b5e858045fff955a9"}, 1183 | {file = "Pillow-9.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:765cb54c0b8724a7c12c55146ae4647e0274a839fb6de7bcba841e04298e1011"}, 1184 | {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:519e14e2c49fcf7616d6d2cfc5c70adae95682ae20f0395e9280db85e8d6c4df"}, 1185 | {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d197df5489004db87d90b918033edbeee0bd6df3848a204bca3ff0a903bef837"}, 1186 | {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0845adc64fe9886db00f5ab68c4a8cd933ab749a87747555cec1c95acea64b0b"}, 1187 | {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:e1339790c083c5a4de48f688b4841f18df839eb3c9584a770cbd818b33e26d5d"}, 1188 | {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:a96e6e23f2b79433390273eaf8cc94fec9c6370842e577ab10dabdcc7ea0a66b"}, 1189 | {file = "Pillow-9.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7cfc287da09f9d2a7ec146ee4d72d6ea1342e770d975e49a8621bf54eaa8f30f"}, 1190 | {file = "Pillow-9.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d7081c084ceb58278dd3cf81f836bc818978c0ccc770cbbb202125ddabec6628"}, 1191 | {file = "Pillow-9.4.0-cp38-cp38-win32.whl", hash = "sha256:df41112ccce5d47770a0c13651479fbcd8793f34232a2dd9faeccb75eb5d0d0d"}, 1192 | {file = "Pillow-9.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:7a21222644ab69ddd9967cfe6f2bb420b460dae4289c9d40ff9a4896e7c35c9a"}, 1193 | {file = "Pillow-9.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0f3269304c1a7ce82f1759c12ce731ef9b6e95b6df829dccd9fe42912cc48569"}, 1194 | {file = "Pillow-9.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cb362e3b0976dc994857391b776ddaa8c13c28a16f80ac6522c23d5257156bed"}, 1195 | {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2e0f87144fcbbe54297cae708c5e7f9da21a4646523456b00cc956bd4c65815"}, 1196 | {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:28676836c7796805914b76b1837a40f76827ee0d5398f72f7dcc634bae7c6264"}, 1197 | {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0884ba7b515163a1a05440a138adeb722b8a6ae2c2b33aea93ea3118dd3a899e"}, 1198 | {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:53dcb50fbdc3fb2c55431a9b30caeb2f7027fcd2aeb501459464f0214200a503"}, 1199 | {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:e8c5cf126889a4de385c02a2c3d3aba4b00f70234bfddae82a5eaa3ee6d5e3e6"}, 1200 | {file = "Pillow-9.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6c6b1389ed66cdd174d040105123a5a1bc91d0aa7059c7261d20e583b6d8cbd2"}, 1201 | {file = "Pillow-9.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0dd4c681b82214b36273c18ca7ee87065a50e013112eea7d78c7a1b89a739153"}, 1202 | {file = "Pillow-9.4.0-cp39-cp39-win32.whl", hash = "sha256:6d9dfb9959a3b0039ee06c1a1a90dc23bac3b430842dcb97908ddde05870601c"}, 1203 | {file = "Pillow-9.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:54614444887e0d3043557d9dbc697dbb16cfb5a35d672b7a0fcc1ed0cf1c600b"}, 1204 | {file = "Pillow-9.4.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b9b752ab91e78234941e44abdecc07f1f0d8f51fb62941d32995b8161f68cfe5"}, 1205 | {file = "Pillow-9.4.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3b56206244dc8711f7e8b7d6cad4663917cd5b2d950799425076681e8766286"}, 1206 | {file = "Pillow-9.4.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aabdab8ec1e7ca7f1434d042bf8b1e92056245fb179790dc97ed040361f16bfd"}, 1207 | {file = "Pillow-9.4.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:db74f5562c09953b2c5f8ec4b7dfd3f5421f31811e97d1dbc0a7c93d6e3a24df"}, 1208 | {file = "Pillow-9.4.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e9d7747847c53a16a729b6ee5e737cf170f7a16611c143d95aa60a109a59c336"}, 1209 | {file = "Pillow-9.4.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b52ff4f4e002f828ea6483faf4c4e8deea8d743cf801b74910243c58acc6eda3"}, 1210 | {file = "Pillow-9.4.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:575d8912dca808edd9acd6f7795199332696d3469665ef26163cd090fa1f8bfa"}, 1211 | {file = "Pillow-9.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3c4ed2ff6760e98d262e0cc9c9a7f7b8a9f61aa4d47c58835cdaf7b0b8811bb"}, 1212 | {file = "Pillow-9.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e621b0246192d3b9cb1dc62c78cfa4c6f6d2ddc0ec207d43c0dedecb914f152a"}, 1213 | {file = "Pillow-9.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:8f127e7b028900421cad64f51f75c051b628db17fb00e099eb148761eed598c9"}, 1214 | {file = "Pillow-9.4.0.tar.gz", hash = "sha256:a1c2d7780448eb93fbcc3789bf3916aa5720d942e37945f4056680317f1cd23e"}, 1215 | ] 1216 | 1217 | [package.extras] 1218 | docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-issues (>=3.0.1)", "sphinx-removed-in", "sphinxext-opengraph"] 1219 | tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] 1220 | 1221 | [[package]] 1222 | name = "platformdirs" 1223 | version = "2.6.2" 1224 | description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." 1225 | category = "dev" 1226 | optional = false 1227 | python-versions = ">=3.7" 1228 | files = [ 1229 | {file = "platformdirs-2.6.2-py3-none-any.whl", hash = "sha256:83c8f6d04389165de7c9b6f0c682439697887bca0aa2f1c87ef1826be3584490"}, 1230 | {file = "platformdirs-2.6.2.tar.gz", hash = "sha256:e1fea1fe471b9ff8332e229df3cb7de4f53eeea4998d3b6bfff542115e998bd2"}, 1231 | ] 1232 | 1233 | [package.extras] 1234 | docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=5.3)", "sphinx-autodoc-typehints (>=1.19.5)"] 1235 | test = ["appdirs (==1.4.4)", "covdefaults (>=2.2.2)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] 1236 | 1237 | [[package]] 1238 | name = "prompt-toolkit" 1239 | version = "3.0.36" 1240 | description = "Library for building powerful interactive command lines in Python" 1241 | category = "dev" 1242 | optional = false 1243 | python-versions = ">=3.6.2" 1244 | files = [ 1245 | {file = "prompt_toolkit-3.0.36-py3-none-any.whl", hash = "sha256:aa64ad242a462c5ff0363a7b9cfe696c20d55d9fc60c11fd8e632d064804d305"}, 1246 | {file = "prompt_toolkit-3.0.36.tar.gz", hash = "sha256:3e163f254bef5a03b146397d7c1963bd3e2812f0964bb9a24e6ec761fd28db63"}, 1247 | ] 1248 | 1249 | [package.dependencies] 1250 | wcwidth = "*" 1251 | 1252 | [[package]] 1253 | name = "pydantic" 1254 | version = "1.10.5" 1255 | description = "Data validation and settings management using python type hints" 1256 | category = "main" 1257 | optional = false 1258 | python-versions = ">=3.7" 1259 | files = [ 1260 | {file = "pydantic-1.10.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5920824fe1e21cbb3e38cf0f3dd24857c8959801d1031ce1fac1d50857a03bfb"}, 1261 | {file = "pydantic-1.10.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3bb99cf9655b377db1a9e47fa4479e3330ea96f4123c6c8200e482704bf1eda2"}, 1262 | {file = "pydantic-1.10.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2185a3b3d98ab4506a3f6707569802d2d92c3a7ba3a9a35683a7709ea6c2aaa2"}, 1263 | {file = "pydantic-1.10.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f582cac9d11c227c652d3ce8ee223d94eb06f4228b52a8adaafa9fa62e73d5c9"}, 1264 | {file = "pydantic-1.10.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c9e5b778b6842f135902e2d82624008c6a79710207e28e86966cd136c621bfee"}, 1265 | {file = "pydantic-1.10.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:72ef3783be8cbdef6bca034606a5de3862be6b72415dc5cb1fb8ddbac110049a"}, 1266 | {file = "pydantic-1.10.5-cp310-cp310-win_amd64.whl", hash = "sha256:45edea10b75d3da43cfda12f3792833a3fa70b6eee4db1ed6aed528cef17c74e"}, 1267 | {file = "pydantic-1.10.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:63200cd8af1af2c07964546b7bc8f217e8bda9d0a2ef0ee0c797b36353914984"}, 1268 | {file = "pydantic-1.10.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:305d0376c516b0dfa1dbefeae8c21042b57b496892d721905a6ec6b79494a66d"}, 1269 | {file = "pydantic-1.10.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1fd326aff5d6c36f05735c7c9b3d5b0e933b4ca52ad0b6e4b38038d82703d35b"}, 1270 | {file = "pydantic-1.10.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6bb0452d7b8516178c969d305d9630a3c9b8cf16fcf4713261c9ebd465af0d73"}, 1271 | {file = "pydantic-1.10.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:9a9d9155e2a9f38b2eb9374c88f02fd4d6851ae17b65ee786a87d032f87008f8"}, 1272 | {file = "pydantic-1.10.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f836444b4c5ece128b23ec36a446c9ab7f9b0f7981d0d27e13a7c366ee163f8a"}, 1273 | {file = "pydantic-1.10.5-cp311-cp311-win_amd64.whl", hash = "sha256:8481dca324e1c7b715ce091a698b181054d22072e848b6fc7895cd86f79b4449"}, 1274 | {file = "pydantic-1.10.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:87f831e81ea0589cd18257f84386bf30154c5f4bed373b7b75e5cb0b5d53ea87"}, 1275 | {file = "pydantic-1.10.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ce1612e98c6326f10888df951a26ec1a577d8df49ddcaea87773bfbe23ba5cc"}, 1276 | {file = "pydantic-1.10.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58e41dd1e977531ac6073b11baac8c013f3cd8706a01d3dc74e86955be8b2c0c"}, 1277 | {file = "pydantic-1.10.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6a4b0aab29061262065bbdede617ef99cc5914d1bf0ddc8bcd8e3d7928d85bd6"}, 1278 | {file = "pydantic-1.10.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:36e44a4de37b8aecffa81c081dbfe42c4d2bf9f6dff34d03dce157ec65eb0f15"}, 1279 | {file = "pydantic-1.10.5-cp37-cp37m-win_amd64.whl", hash = "sha256:261f357f0aecda005934e413dfd7aa4077004a174dafe414a8325e6098a8e419"}, 1280 | {file = "pydantic-1.10.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b429f7c457aebb7fbe7cd69c418d1cd7c6fdc4d3c8697f45af78b8d5a7955760"}, 1281 | {file = "pydantic-1.10.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:663d2dd78596c5fa3eb996bc3f34b8c2a592648ad10008f98d1348be7ae212fb"}, 1282 | {file = "pydantic-1.10.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51782fd81f09edcf265823c3bf43ff36d00db246eca39ee765ef58dc8421a642"}, 1283 | {file = "pydantic-1.10.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c428c0f64a86661fb4873495c4fac430ec7a7cef2b8c1c28f3d1a7277f9ea5ab"}, 1284 | {file = "pydantic-1.10.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:76c930ad0746c70f0368c4596020b736ab65b473c1f9b3872310a835d852eb19"}, 1285 | {file = "pydantic-1.10.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3257bd714de9db2102b742570a56bf7978e90441193acac109b1f500290f5718"}, 1286 | {file = "pydantic-1.10.5-cp38-cp38-win_amd64.whl", hash = "sha256:f5bee6c523d13944a1fdc6f0525bc86dbbd94372f17b83fa6331aabacc8fd08e"}, 1287 | {file = "pydantic-1.10.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:532e97c35719f137ee5405bd3eeddc5c06eb91a032bc755a44e34a712420daf3"}, 1288 | {file = "pydantic-1.10.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ca9075ab3de9e48b75fa8ccb897c34ccc1519177ad8841d99f7fd74cf43be5bf"}, 1289 | {file = "pydantic-1.10.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd46a0e6296346c477e59a954da57beaf9c538da37b9df482e50f836e4a7d4bb"}, 1290 | {file = "pydantic-1.10.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3353072625ea2a9a6c81ad01b91e5c07fa70deb06368c71307529abf70d23325"}, 1291 | {file = "pydantic-1.10.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:3f9d9b2be177c3cb6027cd67fbf323586417868c06c3c85d0d101703136e6b31"}, 1292 | {file = "pydantic-1.10.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b473d00ccd5c2061fd896ac127b7755baad233f8d996ea288af14ae09f8e0d1e"}, 1293 | {file = "pydantic-1.10.5-cp39-cp39-win_amd64.whl", hash = "sha256:5f3bc8f103b56a8c88021d481410874b1f13edf6e838da607dcb57ecff9b4594"}, 1294 | {file = "pydantic-1.10.5-py3-none-any.whl", hash = "sha256:7c5b94d598c90f2f46b3a983ffb46ab806a67099d118ae0da7ef21a2a4033b28"}, 1295 | {file = "pydantic-1.10.5.tar.gz", hash = "sha256:9e337ac83686645a46db0e825acceea8e02fca4062483f40e9ae178e8bd1103a"}, 1296 | ] 1297 | 1298 | [package.dependencies] 1299 | python-dotenv = {version = ">=0.10.4", optional = true, markers = "extra == \"dotenv\""} 1300 | typing-extensions = ">=4.2.0" 1301 | 1302 | [package.extras] 1303 | dotenv = ["python-dotenv (>=0.10.4)"] 1304 | email = ["email-validator (>=1.0.3)"] 1305 | 1306 | [[package]] 1307 | name = "pyfiglet" 1308 | version = "0.8.post1" 1309 | description = "Pure-python FIGlet implementation" 1310 | category = "dev" 1311 | optional = false 1312 | python-versions = "*" 1313 | files = [ 1314 | {file = "pyfiglet-0.8.post1-py2.py3-none-any.whl", hash = "sha256:d555bcea17fbeaf70eaefa48bb119352487e629c9b56f30f383e2c62dd67a01c"}, 1315 | {file = "pyfiglet-0.8.post1.tar.gz", hash = "sha256:c6c2321755d09267b438ec7b936825a4910fec696292139e664ca8670e103639"}, 1316 | ] 1317 | 1318 | [[package]] 1319 | name = "pygtrie" 1320 | version = "2.5.0" 1321 | description = "A pure Python trie data structure implementation." 1322 | category = "main" 1323 | optional = true 1324 | python-versions = "*" 1325 | files = [ 1326 | {file = "pygtrie-2.5.0-py3-none-any.whl", hash = "sha256:8795cda8105493d5ae159a5bef313ff13156c5d4d72feddefacaad59f8c8ce16"}, 1327 | {file = "pygtrie-2.5.0.tar.gz", hash = "sha256:203514ad826eb403dab1d2e2ddd034e0d1534bbe4dbe0213bb0593f66beba4e2"}, 1328 | ] 1329 | 1330 | [[package]] 1331 | name = "pyparsing" 1332 | version = "3.0.9" 1333 | description = "pyparsing module - Classes and methods to define and execute parsing grammars" 1334 | category = "main" 1335 | optional = false 1336 | python-versions = ">=3.6.8" 1337 | files = [ 1338 | {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, 1339 | {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, 1340 | ] 1341 | 1342 | [package.extras] 1343 | diagrams = ["jinja2", "railroad-diagrams"] 1344 | 1345 | [[package]] 1346 | name = "python-dateutil" 1347 | version = "2.8.2" 1348 | description = "Extensions to the standard Python datetime module" 1349 | category = "main" 1350 | optional = false 1351 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" 1352 | files = [ 1353 | {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, 1354 | {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, 1355 | ] 1356 | 1357 | [package.dependencies] 1358 | six = ">=1.5" 1359 | 1360 | [[package]] 1361 | name = "python-dotenv" 1362 | version = "0.21.1" 1363 | description = "Read key-value pairs from a .env file and set them as environment variables" 1364 | category = "main" 1365 | optional = true 1366 | python-versions = ">=3.7" 1367 | files = [ 1368 | {file = "python-dotenv-0.21.1.tar.gz", hash = "sha256:1c93de8f636cde3ce377292818d0e440b6e45a82f215c3744979151fa8151c49"}, 1369 | {file = "python_dotenv-0.21.1-py3-none-any.whl", hash = "sha256:41e12e0318bebc859fcc4d97d4db8d20ad21721a6aa5047dd59f090391cb549a"}, 1370 | ] 1371 | 1372 | [package.extras] 1373 | cli = ["click (>=5.0)"] 1374 | 1375 | [[package]] 1376 | name = "python-slugify" 1377 | version = "8.0.0" 1378 | description = "A Python slugify application that also handles Unicode" 1379 | category = "dev" 1380 | optional = false 1381 | python-versions = ">=3.7" 1382 | files = [ 1383 | {file = "python-slugify-8.0.0.tar.gz", hash = "sha256:f1da83f3c7ab839b3f84543470cd95bdb5a81f1a0b80fed502f78b7dca256062"}, 1384 | {file = "python_slugify-8.0.0-py2.py3-none-any.whl", hash = "sha256:51f217508df20a6c166c7821683384b998560adcf8f19a6c2ca8b460528ccd9c"}, 1385 | ] 1386 | 1387 | [package.dependencies] 1388 | text-unidecode = ">=1.3" 1389 | 1390 | [package.extras] 1391 | unidecode = ["Unidecode (>=1.1.1)"] 1392 | 1393 | [[package]] 1394 | name = "pyyaml" 1395 | version = "6.0" 1396 | description = "YAML parser and emitter for Python" 1397 | category = "main" 1398 | optional = false 1399 | python-versions = ">=3.6" 1400 | files = [ 1401 | {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, 1402 | {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, 1403 | {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, 1404 | {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, 1405 | {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, 1406 | {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, 1407 | {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, 1408 | {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, 1409 | {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, 1410 | {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, 1411 | {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, 1412 | {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, 1413 | {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, 1414 | {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, 1415 | {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, 1416 | {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, 1417 | {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, 1418 | {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, 1419 | {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, 1420 | {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, 1421 | {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, 1422 | {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, 1423 | {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, 1424 | {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, 1425 | {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, 1426 | {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, 1427 | {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, 1428 | {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, 1429 | {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, 1430 | {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, 1431 | {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, 1432 | {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, 1433 | {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, 1434 | {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, 1435 | {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, 1436 | {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, 1437 | {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, 1438 | {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, 1439 | {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, 1440 | {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, 1441 | ] 1442 | 1443 | [[package]] 1444 | name = "requests" 1445 | version = "2.28.2" 1446 | description = "Python HTTP for Humans." 1447 | category = "dev" 1448 | optional = false 1449 | python-versions = ">=3.7, <4" 1450 | files = [ 1451 | {file = "requests-2.28.2-py3-none-any.whl", hash = "sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa"}, 1452 | {file = "requests-2.28.2.tar.gz", hash = "sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf"}, 1453 | ] 1454 | 1455 | [package.dependencies] 1456 | certifi = ">=2017.4.17" 1457 | charset-normalizer = ">=2,<4" 1458 | idna = ">=2.5,<4" 1459 | urllib3 = ">=1.21.1,<1.27" 1460 | 1461 | [package.extras] 1462 | socks = ["PySocks (>=1.5.6,!=1.5.7)"] 1463 | use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] 1464 | 1465 | [[package]] 1466 | name = "rfc3986" 1467 | version = "1.5.0" 1468 | description = "Validating URI References per RFC 3986" 1469 | category = "main" 1470 | optional = false 1471 | python-versions = "*" 1472 | files = [ 1473 | {file = "rfc3986-1.5.0-py2.py3-none-any.whl", hash = "sha256:a86d6e1f5b1dc238b218b012df0aa79409667bb209e58da56d0b94704e712a97"}, 1474 | {file = "rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"}, 1475 | ] 1476 | 1477 | [package.dependencies] 1478 | idna = {version = "*", optional = true, markers = "extra == \"idna2008\""} 1479 | 1480 | [package.extras] 1481 | idna2008 = ["idna"] 1482 | 1483 | [[package]] 1484 | name = "six" 1485 | version = "1.16.0" 1486 | description = "Python 2 and 3 compatibility utilities" 1487 | category = "main" 1488 | optional = false 1489 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" 1490 | files = [ 1491 | {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, 1492 | {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, 1493 | ] 1494 | 1495 | [[package]] 1496 | name = "sniffio" 1497 | version = "1.3.0" 1498 | description = "Sniff out which async library your code is running under" 1499 | category = "main" 1500 | optional = false 1501 | python-versions = ">=3.7" 1502 | files = [ 1503 | {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, 1504 | {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, 1505 | ] 1506 | 1507 | [[package]] 1508 | name = "starlette" 1509 | version = "0.25.0" 1510 | description = "The little ASGI library that shines." 1511 | category = "main" 1512 | optional = true 1513 | python-versions = ">=3.7" 1514 | files = [ 1515 | {file = "starlette-0.25.0-py3-none-any.whl", hash = "sha256:774f1df1983fd594b9b6fb3ded39c2aa1979d10ac45caac0f4255cbe2acb8628"}, 1516 | {file = "starlette-0.25.0.tar.gz", hash = "sha256:854c71e73736c429c2bdb07801f2c76c9cba497e7c3cf4988fde5e95fe4cdb3c"}, 1517 | ] 1518 | 1519 | [package.dependencies] 1520 | anyio = ">=3.4.0,<5" 1521 | typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} 1522 | 1523 | [package.extras] 1524 | full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyaml"] 1525 | 1526 | [[package]] 1527 | name = "text-unidecode" 1528 | version = "1.3" 1529 | description = "The most basic Text::Unidecode port" 1530 | category = "dev" 1531 | optional = false 1532 | python-versions = "*" 1533 | files = [ 1534 | {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, 1535 | {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, 1536 | ] 1537 | 1538 | [[package]] 1539 | name = "tomli" 1540 | version = "2.0.1" 1541 | description = "A lil' TOML parser" 1542 | category = "dev" 1543 | optional = false 1544 | python-versions = ">=3.7" 1545 | files = [ 1546 | {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, 1547 | {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, 1548 | ] 1549 | 1550 | [[package]] 1551 | name = "tomlkit" 1552 | version = "0.11.6" 1553 | description = "Style preserving TOML library" 1554 | category = "main" 1555 | optional = false 1556 | python-versions = ">=3.6" 1557 | files = [ 1558 | {file = "tomlkit-0.11.6-py3-none-any.whl", hash = "sha256:07de26b0d8cfc18f871aec595fda24d95b08fef89d147caa861939f37230bf4b"}, 1559 | {file = "tomlkit-0.11.6.tar.gz", hash = "sha256:71b952e5721688937fb02cf9d354dbcf0785066149d2855e44531ebdd2b65d73"}, 1560 | ] 1561 | 1562 | [[package]] 1563 | name = "typing-extensions" 1564 | version = "4.5.0" 1565 | description = "Backported and Experimental Type Hints for Python 3.7+" 1566 | category = "main" 1567 | optional = false 1568 | python-versions = ">=3.7" 1569 | files = [ 1570 | {file = "typing_extensions-4.5.0-py3-none-any.whl", hash = "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4"}, 1571 | {file = "typing_extensions-4.5.0.tar.gz", hash = "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb"}, 1572 | ] 1573 | 1574 | [[package]] 1575 | name = "urllib3" 1576 | version = "1.26.14" 1577 | description = "HTTP library with thread-safe connection pooling, file post, and more." 1578 | category = "dev" 1579 | optional = false 1580 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" 1581 | files = [ 1582 | {file = "urllib3-1.26.14-py2.py3-none-any.whl", hash = "sha256:75edcdc2f7d85b137124a6c3c9fc3933cdeaa12ecb9a6a959f22797a0feca7e1"}, 1583 | {file = "urllib3-1.26.14.tar.gz", hash = "sha256:076907bf8fd355cde77728471316625a4d2f7e713c125f51953bb5b3eecf4f72"}, 1584 | ] 1585 | 1586 | [package.extras] 1587 | brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] 1588 | secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] 1589 | socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] 1590 | 1591 | [[package]] 1592 | name = "uvicorn" 1593 | version = "0.20.0" 1594 | description = "The lightning-fast ASGI server." 1595 | category = "main" 1596 | optional = true 1597 | python-versions = ">=3.7" 1598 | files = [ 1599 | {file = "uvicorn-0.20.0-py3-none-any.whl", hash = "sha256:c3ed1598a5668208723f2bb49336f4509424ad198d6ab2615b7783db58d919fd"}, 1600 | {file = "uvicorn-0.20.0.tar.gz", hash = "sha256:a4e12017b940247f836bc90b72e725d7dfd0c8ed1c51eb365f5ba30d9f5127d8"}, 1601 | ] 1602 | 1603 | [package.dependencies] 1604 | click = ">=7.0" 1605 | colorama = {version = ">=0.4", optional = true, markers = "sys_platform == \"win32\" and extra == \"standard\""} 1606 | h11 = ">=0.8" 1607 | httptools = {version = ">=0.5.0", optional = true, markers = "extra == \"standard\""} 1608 | python-dotenv = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} 1609 | pyyaml = {version = ">=5.1", optional = true, markers = "extra == \"standard\""} 1610 | uvloop = {version = ">=0.14.0,<0.15.0 || >0.15.0,<0.15.1 || >0.15.1", optional = true, markers = "sys_platform != \"win32\" and sys_platform != \"cygwin\" and platform_python_implementation != \"PyPy\" and extra == \"standard\""} 1611 | watchfiles = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} 1612 | websockets = {version = ">=10.4", optional = true, markers = "extra == \"standard\""} 1613 | 1614 | [package.extras] 1615 | standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] 1616 | 1617 | [[package]] 1618 | name = "uvloop" 1619 | version = "0.17.0" 1620 | description = "Fast implementation of asyncio event loop on top of libuv" 1621 | category = "main" 1622 | optional = true 1623 | python-versions = ">=3.7" 1624 | files = [ 1625 | {file = "uvloop-0.17.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ce9f61938d7155f79d3cb2ffa663147d4a76d16e08f65e2c66b77bd41b356718"}, 1626 | {file = "uvloop-0.17.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:68532f4349fd3900b839f588972b3392ee56042e440dd5873dfbbcd2cc67617c"}, 1627 | {file = "uvloop-0.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0949caf774b9fcefc7c5756bacbbbd3fc4c05a6b7eebc7c7ad6f825b23998d6d"}, 1628 | {file = "uvloop-0.17.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff3d00b70ce95adce264462c930fbaecb29718ba6563db354608f37e49e09024"}, 1629 | {file = "uvloop-0.17.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a5abddb3558d3f0a78949c750644a67be31e47936042d4f6c888dd6f3c95f4aa"}, 1630 | {file = "uvloop-0.17.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8efcadc5a0003d3a6e887ccc1fb44dec25594f117a94e3127954c05cf144d811"}, 1631 | {file = "uvloop-0.17.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3378eb62c63bf336ae2070599e49089005771cc651c8769aaad72d1bd9385a7c"}, 1632 | {file = "uvloop-0.17.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6aafa5a78b9e62493539456f8b646f85abc7093dd997f4976bb105537cf2635e"}, 1633 | {file = "uvloop-0.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c686a47d57ca910a2572fddfe9912819880b8765e2f01dc0dd12a9bf8573e539"}, 1634 | {file = "uvloop-0.17.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:864e1197139d651a76c81757db5eb199db8866e13acb0dfe96e6fc5d1cf45fc4"}, 1635 | {file = "uvloop-0.17.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2a6149e1defac0faf505406259561bc14b034cdf1d4711a3ddcdfbaa8d825a05"}, 1636 | {file = "uvloop-0.17.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6708f30db9117f115eadc4f125c2a10c1a50d711461699a0cbfaa45b9a78e376"}, 1637 | {file = "uvloop-0.17.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:23609ca361a7fc587031429fa25ad2ed7242941adec948f9d10c045bfecab06b"}, 1638 | {file = "uvloop-0.17.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2deae0b0fb00a6af41fe60a675cec079615b01d68beb4cc7b722424406b126a8"}, 1639 | {file = "uvloop-0.17.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45cea33b208971e87a31c17622e4b440cac231766ec11e5d22c76fab3bf9df62"}, 1640 | {file = "uvloop-0.17.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9b09e0f0ac29eee0451d71798878eae5a4e6a91aa275e114037b27f7db72702d"}, 1641 | {file = "uvloop-0.17.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:dbbaf9da2ee98ee2531e0c780455f2841e4675ff580ecf93fe5c48fe733b5667"}, 1642 | {file = "uvloop-0.17.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a4aee22ece20958888eedbad20e4dbb03c37533e010fb824161b4f05e641f738"}, 1643 | {file = "uvloop-0.17.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:307958f9fc5c8bb01fad752d1345168c0abc5d62c1b72a4a8c6c06f042b45b20"}, 1644 | {file = "uvloop-0.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ebeeec6a6641d0adb2ea71dcfb76017602ee2bfd8213e3fcc18d8f699c5104f"}, 1645 | {file = "uvloop-0.17.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1436c8673c1563422213ac6907789ecb2b070f5939b9cbff9ef7113f2b531595"}, 1646 | {file = "uvloop-0.17.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8887d675a64cfc59f4ecd34382e5b4f0ef4ae1da37ed665adba0c2badf0d6578"}, 1647 | {file = "uvloop-0.17.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3db8de10ed684995a7f34a001f15b374c230f7655ae840964d51496e2f8a8474"}, 1648 | {file = "uvloop-0.17.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7d37dccc7ae63e61f7b96ee2e19c40f153ba6ce730d8ba4d3b4e9738c1dccc1b"}, 1649 | {file = "uvloop-0.17.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cbbe908fda687e39afd6ea2a2f14c2c3e43f2ca88e3a11964b297822358d0e6c"}, 1650 | {file = "uvloop-0.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d97672dc709fa4447ab83276f344a165075fd9f366a97b712bdd3fee05efae8"}, 1651 | {file = "uvloop-0.17.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1e507c9ee39c61bfddd79714e4f85900656db1aec4d40c6de55648e85c2799c"}, 1652 | {file = "uvloop-0.17.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c092a2c1e736086d59ac8e41f9c98f26bbf9b9222a76f21af9dfe949b99b2eb9"}, 1653 | {file = "uvloop-0.17.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:30babd84706115626ea78ea5dbc7dd8d0d01a2e9f9b306d24ca4ed5796c66ded"}, 1654 | {file = "uvloop-0.17.0.tar.gz", hash = "sha256:0ddf6baf9cf11a1a22c71487f39f15b2cf78eb5bde7e5b45fbb99e8a9d91b9e1"}, 1655 | ] 1656 | 1657 | [package.extras] 1658 | dev = ["Cython (>=0.29.32,<0.30.0)", "Sphinx (>=4.1.2,<4.2.0)", "aiohttp", "flake8 (>=3.9.2,<3.10.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=22.0.0,<22.1.0)", "pycodestyle (>=2.7.0,<2.8.0)", "pytest (>=3.6.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] 1659 | docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] 1660 | test = ["Cython (>=0.29.32,<0.30.0)", "aiohttp", "flake8 (>=3.9.2,<3.10.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=22.0.0,<22.1.0)", "pycodestyle (>=2.7.0,<2.8.0)"] 1661 | 1662 | [[package]] 1663 | name = "virtualenv" 1664 | version = "20.17.1" 1665 | description = "Virtual Python Environment builder" 1666 | category = "dev" 1667 | optional = false 1668 | python-versions = ">=3.6" 1669 | files = [ 1670 | {file = "virtualenv-20.17.1-py3-none-any.whl", hash = "sha256:ce3b1684d6e1a20a3e5ed36795a97dfc6af29bc3970ca8dab93e11ac6094b3c4"}, 1671 | {file = "virtualenv-20.17.1.tar.gz", hash = "sha256:f8b927684efc6f1cc206c9db297a570ab9ad0e51c16fa9e45487d36d1905c058"}, 1672 | ] 1673 | 1674 | [package.dependencies] 1675 | distlib = ">=0.3.6,<1" 1676 | filelock = ">=3.4.1,<4" 1677 | platformdirs = ">=2.4,<3" 1678 | 1679 | [package.extras] 1680 | docs = ["proselint (>=0.13)", "sphinx (>=5.3)", "sphinx-argparse (>=0.3.2)", "sphinx-rtd-theme (>=1)", "towncrier (>=22.8)"] 1681 | testing = ["coverage (>=6.2)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=21.3)", "pytest (>=7.0.1)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.2)", "pytest-mock (>=3.6.1)", "pytest-randomly (>=3.10.3)", "pytest-timeout (>=2.1)"] 1682 | 1683 | [[package]] 1684 | name = "watchfiles" 1685 | version = "0.18.1" 1686 | description = "Simple, modern and high performance file watching and code reload in python." 1687 | category = "main" 1688 | optional = false 1689 | python-versions = ">=3.7" 1690 | files = [ 1691 | {file = "watchfiles-0.18.1-cp37-abi3-macosx_10_7_x86_64.whl", hash = "sha256:9891d3c94272108bcecf5597a592e61105279def1313521e637f2d5acbe08bc9"}, 1692 | {file = "watchfiles-0.18.1-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:7102342d60207fa635e24c02a51c6628bf0472e5fef067f78a612386840407fc"}, 1693 | {file = "watchfiles-0.18.1-cp37-abi3-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:00ea0081eca5e8e695cffbc3a726bb90da77f4e3f78ce29b86f0d95db4e70ef7"}, 1694 | {file = "watchfiles-0.18.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b8e6db99e49cd7125d8a4c9d33c0735eea7b75a942c6ad68b75be3e91c242fb"}, 1695 | {file = "watchfiles-0.18.1-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bc7c726855f04f22ac79131b51bf0c9f728cb2117419ed830a43828b2c4a5fcb"}, 1696 | {file = "watchfiles-0.18.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cbaff354d12235002e62d9d3fa8bcf326a8490c1179aa5c17195a300a9e5952f"}, 1697 | {file = "watchfiles-0.18.1-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:888db233e06907c555eccd10da99b9cd5ed45deca47e41766954292dc9f7b198"}, 1698 | {file = "watchfiles-0.18.1-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:dde79930d1b28f15994ad6613aa2865fc7a403d2bb14585a8714a53233b15717"}, 1699 | {file = "watchfiles-0.18.1-cp37-abi3-win32.whl", hash = "sha256:e2b2bdd26bf8d6ed90763e6020b475f7634f919dbd1730ea1b6f8cb88e21de5d"}, 1700 | {file = "watchfiles-0.18.1-cp37-abi3-win_amd64.whl", hash = "sha256:c541e0f2c3e95e83e4f84561c893284ba984e9d0025352057396d96dceb09f44"}, 1701 | {file = "watchfiles-0.18.1-cp37-abi3-win_arm64.whl", hash = "sha256:9a26272ef3e930330fc0c2c148cc29706cc2c40d25760c7ccea8d768a8feef8b"}, 1702 | {file = "watchfiles-0.18.1-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:9fb12a5e2b42e0b53769455ff93546e6bc9ab14007fbd436978d827a95ca5bd1"}, 1703 | {file = "watchfiles-0.18.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:548d6b42303d40264118178053c78820533b683b20dfbb254a8706ca48467357"}, 1704 | {file = "watchfiles-0.18.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e0d8fdfebc50ac7569358f5c75f2b98bb473befccf9498cf23b3e39993bb45a"}, 1705 | {file = "watchfiles-0.18.1-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:0f9a22fff1745e2bb930b1e971c4c5b67ea3b38ae17a6adb9019371f80961219"}, 1706 | {file = "watchfiles-0.18.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b02e7fa03cd4059dd61ff0600080a5a9e7a893a85cb8e5178943533656eec65e"}, 1707 | {file = "watchfiles-0.18.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a868ce2c7565137f852bd4c863a164dc81306cae7378dbdbe4e2aca51ddb8857"}, 1708 | {file = "watchfiles-0.18.1.tar.gz", hash = "sha256:4ec0134a5e31797eb3c6c624dbe9354f2a8ee9c720e0b46fc5b7bab472b7c6d4"}, 1709 | ] 1710 | 1711 | [package.dependencies] 1712 | anyio = ">=3.0.0" 1713 | 1714 | [[package]] 1715 | name = "wcwidth" 1716 | version = "0.2.6" 1717 | description = "Measures the displayed width of unicode strings in a terminal" 1718 | category = "dev" 1719 | optional = false 1720 | python-versions = "*" 1721 | files = [ 1722 | {file = "wcwidth-0.2.6-py2.py3-none-any.whl", hash = "sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e"}, 1723 | {file = "wcwidth-0.2.6.tar.gz", hash = "sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0"}, 1724 | ] 1725 | 1726 | [[package]] 1727 | name = "websockets" 1728 | version = "10.4" 1729 | description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" 1730 | category = "main" 1731 | optional = true 1732 | python-versions = ">=3.7" 1733 | files = [ 1734 | {file = "websockets-10.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d58804e996d7d2307173d56c297cf7bc132c52df27a3efaac5e8d43e36c21c48"}, 1735 | {file = "websockets-10.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc0b82d728fe21a0d03e65f81980abbbcb13b5387f733a1a870672c5be26edab"}, 1736 | {file = "websockets-10.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ba089c499e1f4155d2a3c2a05d2878a3428cf321c848f2b5a45ce55f0d7d310c"}, 1737 | {file = "websockets-10.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33d69ca7612f0ddff3316b0c7b33ca180d464ecac2d115805c044bf0a3b0d032"}, 1738 | {file = "websockets-10.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62e627f6b6d4aed919a2052efc408da7a545c606268d5ab5bfab4432734b82b4"}, 1739 | {file = "websockets-10.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ea7b82bfcae927eeffc55d2ffa31665dc7fec7b8dc654506b8e5a518eb4d50"}, 1740 | {file = "websockets-10.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e0cb5cc6ece6ffa75baccfd5c02cffe776f3f5c8bf486811f9d3ea3453676ce8"}, 1741 | {file = "websockets-10.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ae5e95cfb53ab1da62185e23b3130e11d64431179debac6dc3c6acf08760e9b1"}, 1742 | {file = "websockets-10.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7c584f366f46ba667cfa66020344886cf47088e79c9b9d39c84ce9ea98aaa331"}, 1743 | {file = "websockets-10.4-cp310-cp310-win32.whl", hash = "sha256:b029fb2032ae4724d8ae8d4f6b363f2cc39e4c7b12454df8df7f0f563ed3e61a"}, 1744 | {file = "websockets-10.4-cp310-cp310-win_amd64.whl", hash = "sha256:8dc96f64ae43dde92530775e9cb169979f414dcf5cff670455d81a6823b42089"}, 1745 | {file = "websockets-10.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:47a2964021f2110116cc1125b3e6d87ab5ad16dea161949e7244ec583b905bb4"}, 1746 | {file = "websockets-10.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e789376b52c295c4946403bd0efecf27ab98f05319df4583d3c48e43c7342c2f"}, 1747 | {file = "websockets-10.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7d3f0b61c45c3fa9a349cf484962c559a8a1d80dae6977276df8fd1fa5e3cb8c"}, 1748 | {file = "websockets-10.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f55b5905705725af31ccef50e55391621532cd64fbf0bc6f4bac935f0fccec46"}, 1749 | {file = "websockets-10.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00c870522cdb69cd625b93f002961ffb0c095394f06ba8c48f17eef7c1541f96"}, 1750 | {file = "websockets-10.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f38706e0b15d3c20ef6259fd4bc1700cd133b06c3c1bb108ffe3f8947be15fa"}, 1751 | {file = "websockets-10.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f2c38d588887a609191d30e902df2a32711f708abfd85d318ca9b367258cfd0c"}, 1752 | {file = "websockets-10.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:fe10ddc59b304cb19a1bdf5bd0a7719cbbc9fbdd57ac80ed436b709fcf889106"}, 1753 | {file = "websockets-10.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:90fcf8929836d4a0e964d799a58823547df5a5e9afa83081761630553be731f9"}, 1754 | {file = "websockets-10.4-cp311-cp311-win32.whl", hash = "sha256:b9968694c5f467bf67ef97ae7ad4d56d14be2751000c1207d31bf3bb8860bae8"}, 1755 | {file = "websockets-10.4-cp311-cp311-win_amd64.whl", hash = "sha256:a7a240d7a74bf8d5cb3bfe6be7f21697a28ec4b1a437607bae08ac7acf5b4882"}, 1756 | {file = "websockets-10.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:74de2b894b47f1d21cbd0b37a5e2b2392ad95d17ae983e64727e18eb281fe7cb"}, 1757 | {file = "websockets-10.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3a686ecb4aa0d64ae60c9c9f1a7d5d46cab9bfb5d91a2d303d00e2cd4c4c5cc"}, 1758 | {file = "websockets-10.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0d15c968ea7a65211e084f523151dbf8ae44634de03c801b8bd070b74e85033"}, 1759 | {file = "websockets-10.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00213676a2e46b6ebf6045bc11d0f529d9120baa6f58d122b4021ad92adabd41"}, 1760 | {file = "websockets-10.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:e23173580d740bf8822fd0379e4bf30aa1d5a92a4f252d34e893070c081050df"}, 1761 | {file = "websockets-10.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:dd500e0a5e11969cdd3320935ca2ff1e936f2358f9c2e61f100a1660933320ea"}, 1762 | {file = "websockets-10.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4239b6027e3d66a89446908ff3027d2737afc1a375f8fd3eea630a4842ec9a0c"}, 1763 | {file = "websockets-10.4-cp37-cp37m-win32.whl", hash = "sha256:8a5cc00546e0a701da4639aa0bbcb0ae2bb678c87f46da01ac2d789e1f2d2038"}, 1764 | {file = "websockets-10.4-cp37-cp37m-win_amd64.whl", hash = "sha256:a9f9a735deaf9a0cadc2d8c50d1a5bcdbae8b6e539c6e08237bc4082d7c13f28"}, 1765 | {file = "websockets-10.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5c1289596042fad2cdceb05e1ebf7aadf9995c928e0da2b7a4e99494953b1b94"}, 1766 | {file = "websockets-10.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0cff816f51fb33c26d6e2b16b5c7d48eaa31dae5488ace6aae468b361f422b63"}, 1767 | {file = "websockets-10.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:dd9becd5fe29773d140d68d607d66a38f60e31b86df75332703757ee645b6faf"}, 1768 | {file = "websockets-10.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45ec8e75b7dbc9539cbfafa570742fe4f676eb8b0d3694b67dabe2f2ceed8aa6"}, 1769 | {file = "websockets-10.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f72e5cd0f18f262f5da20efa9e241699e0cf3a766317a17392550c9ad7b37d8"}, 1770 | {file = "websockets-10.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:185929b4808b36a79c65b7865783b87b6841e852ef5407a2fb0c03381092fa3b"}, 1771 | {file = "websockets-10.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7d27a7e34c313b3a7f91adcd05134315002aaf8540d7b4f90336beafaea6217c"}, 1772 | {file = "websockets-10.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:884be66c76a444c59f801ac13f40c76f176f1bfa815ef5b8ed44321e74f1600b"}, 1773 | {file = "websockets-10.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:931c039af54fc195fe6ad536fde4b0de04da9d5916e78e55405436348cfb0e56"}, 1774 | {file = "websockets-10.4-cp38-cp38-win32.whl", hash = "sha256:db3c336f9eda2532ec0fd8ea49fef7a8df8f6c804cdf4f39e5c5c0d4a4ad9a7a"}, 1775 | {file = "websockets-10.4-cp38-cp38-win_amd64.whl", hash = "sha256:48c08473563323f9c9debac781ecf66f94ad5a3680a38fe84dee5388cf5acaf6"}, 1776 | {file = "websockets-10.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:40e826de3085721dabc7cf9bfd41682dadc02286d8cf149b3ad05bff89311e4f"}, 1777 | {file = "websockets-10.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:56029457f219ade1f2fc12a6504ea61e14ee227a815531f9738e41203a429112"}, 1778 | {file = "websockets-10.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f5fc088b7a32f244c519a048c170f14cf2251b849ef0e20cbbb0fdf0fdaf556f"}, 1779 | {file = "websockets-10.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fc8709c00704194213d45e455adc106ff9e87658297f72d544220e32029cd3d"}, 1780 | {file = "websockets-10.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0154f7691e4fe6c2b2bc275b5701e8b158dae92a1ab229e2b940efe11905dff4"}, 1781 | {file = "websockets-10.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c6d2264f485f0b53adf22697ac11e261ce84805c232ed5dbe6b1bcb84b00ff0"}, 1782 | {file = "websockets-10.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9bc42e8402dc5e9905fb8b9649f57efcb2056693b7e88faa8fb029256ba9c68c"}, 1783 | {file = "websockets-10.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:edc344de4dac1d89300a053ac973299e82d3db56330f3494905643bb68801269"}, 1784 | {file = "websockets-10.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:84bc2a7d075f32f6ed98652db3a680a17a4edb21ca7f80fe42e38753a58ee02b"}, 1785 | {file = "websockets-10.4-cp39-cp39-win32.whl", hash = "sha256:c94ae4faf2d09f7c81847c63843f84fe47bf6253c9d60b20f25edfd30fb12588"}, 1786 | {file = "websockets-10.4-cp39-cp39-win_amd64.whl", hash = "sha256:bbccd847aa0c3a69b5f691a84d2341a4f8a629c6922558f2a70611305f902d74"}, 1787 | {file = "websockets-10.4-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:82ff5e1cae4e855147fd57a2863376ed7454134c2bf49ec604dfe71e446e2193"}, 1788 | {file = "websockets-10.4-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d210abe51b5da0ffdbf7b43eed0cfdff8a55a1ab17abbec4301c9ff077dd0342"}, 1789 | {file = "websockets-10.4-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:942de28af58f352a6f588bc72490ae0f4ccd6dfc2bd3de5945b882a078e4e179"}, 1790 | {file = "websockets-10.4-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9b27d6c1c6cd53dc93614967e9ce00ae7f864a2d9f99fe5ed86706e1ecbf485"}, 1791 | {file = "websockets-10.4-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:3d3cac3e32b2c8414f4f87c1b2ab686fa6284a980ba283617404377cd448f631"}, 1792 | {file = "websockets-10.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:da39dd03d130162deb63da51f6e66ed73032ae62e74aaccc4236e30edccddbb0"}, 1793 | {file = "websockets-10.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:389f8dbb5c489e305fb113ca1b6bdcdaa130923f77485db5b189de343a179393"}, 1794 | {file = "websockets-10.4-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09a1814bb15eff7069e51fed0826df0bc0702652b5cb8f87697d469d79c23576"}, 1795 | {file = "websockets-10.4-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff64a1d38d156d429404aaa84b27305e957fd10c30e5880d1765c9480bea490f"}, 1796 | {file = "websockets-10.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:b343f521b047493dc4022dd338fc6db9d9282658862756b4f6fd0e996c1380e1"}, 1797 | {file = "websockets-10.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:932af322458da7e4e35df32f050389e13d3d96b09d274b22a7aa1808f292fee4"}, 1798 | {file = "websockets-10.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6a4162139374a49eb18ef5b2f4da1dd95c994588f5033d64e0bbfda4b6b6fcf"}, 1799 | {file = "websockets-10.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c57e4c1349fbe0e446c9fa7b19ed2f8a4417233b6984277cce392819123142d3"}, 1800 | {file = "websockets-10.4-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b627c266f295de9dea86bd1112ed3d5fafb69a348af30a2422e16590a8ecba13"}, 1801 | {file = "websockets-10.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:05a7233089f8bd355e8cbe127c2e8ca0b4ea55467861906b80d2ebc7db4d6b72"}, 1802 | {file = "websockets-10.4.tar.gz", hash = "sha256:eef610b23933c54d5d921c92578ae5f89813438fded840c2e9809d378dc765d3"}, 1803 | ] 1804 | 1805 | [[package]] 1806 | name = "win32-setctime" 1807 | version = "1.1.0" 1808 | description = "A small Python utility to set file creation time on Windows" 1809 | category = "main" 1810 | optional = false 1811 | python-versions = ">=3.5" 1812 | files = [ 1813 | {file = "win32_setctime-1.1.0-py3-none-any.whl", hash = "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad"}, 1814 | {file = "win32_setctime-1.1.0.tar.gz", hash = "sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2"}, 1815 | ] 1816 | 1817 | [package.extras] 1818 | dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] 1819 | 1820 | [[package]] 1821 | name = "yarl" 1822 | version = "1.8.2" 1823 | description = "Yet another URL library" 1824 | category = "main" 1825 | optional = true 1826 | python-versions = ">=3.7" 1827 | files = [ 1828 | {file = "yarl-1.8.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:bb81f753c815f6b8e2ddd2eef3c855cf7da193b82396ac013c661aaa6cc6b0a5"}, 1829 | {file = "yarl-1.8.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:47d49ac96156f0928f002e2424299b2c91d9db73e08c4cd6742923a086f1c863"}, 1830 | {file = "yarl-1.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3fc056e35fa6fba63248d93ff6e672c096f95f7836938241ebc8260e062832fe"}, 1831 | {file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58a3c13d1c3005dbbac5c9f0d3210b60220a65a999b1833aa46bd6677c69b08e"}, 1832 | {file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10b08293cda921157f1e7c2790999d903b3fd28cd5c208cf8826b3b508026996"}, 1833 | {file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de986979bbd87272fe557e0a8fcb66fd40ae2ddfe28a8b1ce4eae22681728fef"}, 1834 | {file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c4fcfa71e2c6a3cb568cf81aadc12768b9995323186a10827beccf5fa23d4f8"}, 1835 | {file = "yarl-1.8.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae4d7ff1049f36accde9e1ef7301912a751e5bae0a9d142459646114c70ecba6"}, 1836 | {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:bf071f797aec5b96abfc735ab97da9fd8f8768b43ce2abd85356a3127909d146"}, 1837 | {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:74dece2bfc60f0f70907c34b857ee98f2c6dd0f75185db133770cd67300d505f"}, 1838 | {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:df60a94d332158b444301c7f569659c926168e4d4aad2cfbf4bce0e8fb8be826"}, 1839 | {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:63243b21c6e28ec2375f932a10ce7eda65139b5b854c0f6b82ed945ba526bff3"}, 1840 | {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cfa2bbca929aa742b5084fd4663dd4b87c191c844326fcb21c3afd2d11497f80"}, 1841 | {file = "yarl-1.8.2-cp310-cp310-win32.whl", hash = "sha256:b05df9ea7496df11b710081bd90ecc3a3db6adb4fee36f6a411e7bc91a18aa42"}, 1842 | {file = "yarl-1.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:24ad1d10c9db1953291f56b5fe76203977f1ed05f82d09ec97acb623a7976574"}, 1843 | {file = "yarl-1.8.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2a1fca9588f360036242f379bfea2b8b44cae2721859b1c56d033adfd5893634"}, 1844 | {file = "yarl-1.8.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f37db05c6051eff17bc832914fe46869f8849de5b92dc4a3466cd63095d23dfd"}, 1845 | {file = "yarl-1.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:77e913b846a6b9c5f767b14dc1e759e5aff05502fe73079f6f4176359d832581"}, 1846 | {file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0978f29222e649c351b173da2b9b4665ad1feb8d1daa9d971eb90df08702668a"}, 1847 | {file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:388a45dc77198b2460eac0aca1efd6a7c09e976ee768b0d5109173e521a19daf"}, 1848 | {file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2305517e332a862ef75be8fad3606ea10108662bc6fe08509d5ca99503ac2aee"}, 1849 | {file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42430ff511571940d51e75cf42f1e4dbdded477e71c1b7a17f4da76c1da8ea76"}, 1850 | {file = "yarl-1.8.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3150078118f62371375e1e69b13b48288e44f6691c1069340081c3fd12c94d5b"}, 1851 | {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c15163b6125db87c8f53c98baa5e785782078fbd2dbeaa04c6141935eb6dab7a"}, 1852 | {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4d04acba75c72e6eb90745447d69f84e6c9056390f7a9724605ca9c56b4afcc6"}, 1853 | {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e7fd20d6576c10306dea2d6a5765f46f0ac5d6f53436217913e952d19237efc4"}, 1854 | {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:75c16b2a900b3536dfc7014905a128a2bea8fb01f9ee26d2d7d8db0a08e7cb2c"}, 1855 | {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6d88056a04860a98341a0cf53e950e3ac9f4e51d1b6f61a53b0609df342cc8b2"}, 1856 | {file = "yarl-1.8.2-cp311-cp311-win32.whl", hash = "sha256:fb742dcdd5eec9f26b61224c23baea46c9055cf16f62475e11b9b15dfd5c117b"}, 1857 | {file = "yarl-1.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:8c46d3d89902c393a1d1e243ac847e0442d0196bbd81aecc94fcebbc2fd5857c"}, 1858 | {file = "yarl-1.8.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ceff9722e0df2e0a9e8a79c610842004fa54e5b309fe6d218e47cd52f791d7ef"}, 1859 | {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f6b4aca43b602ba0f1459de647af954769919c4714706be36af670a5f44c9c1"}, 1860 | {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1684a9bd9077e922300ecd48003ddae7a7474e0412bea38d4631443a91d61077"}, 1861 | {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ebb78745273e51b9832ef90c0898501006670d6e059f2cdb0e999494eb1450c2"}, 1862 | {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3adeef150d528ded2a8e734ebf9ae2e658f4c49bf413f5f157a470e17a4a2e89"}, 1863 | {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57a7c87927a468e5a1dc60c17caf9597161d66457a34273ab1760219953f7f4c"}, 1864 | {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:efff27bd8cbe1f9bd127e7894942ccc20c857aa8b5a0327874f30201e5ce83d0"}, 1865 | {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a783cd344113cb88c5ff7ca32f1f16532a6f2142185147822187913eb989f739"}, 1866 | {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:705227dccbe96ab02c7cb2c43e1228e2826e7ead880bb19ec94ef279e9555b5b"}, 1867 | {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:34c09b43bd538bf6c4b891ecce94b6fa4f1f10663a8d4ca589a079a5018f6ed7"}, 1868 | {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a48f4f7fea9a51098b02209d90297ac324241bf37ff6be6d2b0149ab2bd51b37"}, 1869 | {file = "yarl-1.8.2-cp37-cp37m-win32.whl", hash = "sha256:0414fd91ce0b763d4eadb4456795b307a71524dbacd015c657bb2a39db2eab89"}, 1870 | {file = "yarl-1.8.2-cp37-cp37m-win_amd64.whl", hash = "sha256:d881d152ae0007809c2c02e22aa534e702f12071e6b285e90945aa3c376463c5"}, 1871 | {file = "yarl-1.8.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5df5e3d04101c1e5c3b1d69710b0574171cc02fddc4b23d1b2813e75f35a30b1"}, 1872 | {file = "yarl-1.8.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7a66c506ec67eb3159eea5096acd05f5e788ceec7b96087d30c7d2865a243918"}, 1873 | {file = "yarl-1.8.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2b4fa2606adf392051d990c3b3877d768771adc3faf2e117b9de7eb977741229"}, 1874 | {file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e21fb44e1eff06dd6ef971d4bdc611807d6bd3691223d9c01a18cec3677939e"}, 1875 | {file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93202666046d9edadfe9f2e7bf5e0782ea0d497b6d63da322e541665d65a044e"}, 1876 | {file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fc77086ce244453e074e445104f0ecb27530d6fd3a46698e33f6c38951d5a0f1"}, 1877 | {file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64dd68a92cab699a233641f5929a40f02a4ede8c009068ca8aa1fe87b8c20ae3"}, 1878 | {file = "yarl-1.8.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1b372aad2b5f81db66ee7ec085cbad72c4da660d994e8e590c997e9b01e44901"}, 1879 | {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e6f3515aafe0209dd17fb9bdd3b4e892963370b3de781f53e1746a521fb39fc0"}, 1880 | {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:dfef7350ee369197106805e193d420b75467b6cceac646ea5ed3049fcc950a05"}, 1881 | {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:728be34f70a190566d20aa13dc1f01dc44b6aa74580e10a3fb159691bc76909d"}, 1882 | {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:ff205b58dc2929191f68162633d5e10e8044398d7a45265f90a0f1d51f85f72c"}, 1883 | {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baf211dcad448a87a0d9047dc8282d7de59473ade7d7fdf22150b1d23859f946"}, 1884 | {file = "yarl-1.8.2-cp38-cp38-win32.whl", hash = "sha256:272b4f1599f1b621bf2aabe4e5b54f39a933971f4e7c9aa311d6d7dc06965165"}, 1885 | {file = "yarl-1.8.2-cp38-cp38-win_amd64.whl", hash = "sha256:326dd1d3caf910cd26a26ccbfb84c03b608ba32499b5d6eeb09252c920bcbe4f"}, 1886 | {file = "yarl-1.8.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f8ca8ad414c85bbc50f49c0a106f951613dfa5f948ab69c10ce9b128d368baf8"}, 1887 | {file = "yarl-1.8.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:418857f837347e8aaef682679f41e36c24250097f9e2f315d39bae3a99a34cbf"}, 1888 | {file = "yarl-1.8.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ae0eec05ab49e91a78700761777f284c2df119376e391db42c38ab46fd662b77"}, 1889 | {file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:009a028127e0a1755c38b03244c0bea9d5565630db9c4cf9572496e947137a87"}, 1890 | {file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3edac5d74bb3209c418805bda77f973117836e1de7c000e9755e572c1f7850d0"}, 1891 | {file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da65c3f263729e47351261351b8679c6429151ef9649bba08ef2528ff2c423b2"}, 1892 | {file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ef8fb25e52663a1c85d608f6dd72e19bd390e2ecaf29c17fb08f730226e3a08"}, 1893 | {file = "yarl-1.8.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bcd7bb1e5c45274af9a1dd7494d3c52b2be5e6bd8d7e49c612705fd45420b12d"}, 1894 | {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:44ceac0450e648de86da8e42674f9b7077d763ea80c8ceb9d1c3e41f0f0a9951"}, 1895 | {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:97209cc91189b48e7cfe777237c04af8e7cc51eb369004e061809bcdf4e55220"}, 1896 | {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:48dd18adcf98ea9cd721a25313aef49d70d413a999d7d89df44f469edfb38a06"}, 1897 | {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e59399dda559688461762800d7fb34d9e8a6a7444fd76ec33220a926c8be1516"}, 1898 | {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d617c241c8c3ad5c4e78a08429fa49e4b04bedfc507b34b4d8dceb83b4af3588"}, 1899 | {file = "yarl-1.8.2-cp39-cp39-win32.whl", hash = "sha256:cb6d48d80a41f68de41212f3dfd1a9d9898d7841c8f7ce6696cf2fd9cb57ef83"}, 1900 | {file = "yarl-1.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:6604711362f2dbf7160df21c416f81fac0de6dbcf0b5445a2ef25478ecc4c778"}, 1901 | {file = "yarl-1.8.2.tar.gz", hash = "sha256:49d43402c6e3013ad0978602bf6bf5328535c48d192304b91b97a3c6790b1562"}, 1902 | ] 1903 | 1904 | [package.dependencies] 1905 | idna = ">=2.0" 1906 | multidict = ">=4.0" 1907 | 1908 | [[package]] 1909 | name = "zipp" 1910 | version = "3.14.0" 1911 | description = "Backport of pathlib-compatible object wrapper for zip files" 1912 | category = "main" 1913 | optional = false 1914 | python-versions = ">=3.7" 1915 | files = [ 1916 | {file = "zipp-3.14.0-py3-none-any.whl", hash = "sha256:188834565033387710d046e3fe96acfc9b5e86cbca7f39ff69cf21a4128198b7"}, 1917 | {file = "zipp-3.14.0.tar.gz", hash = "sha256:9e5421e176ef5ab4c0ad896624e87a7b2f07aca746c9b2aa305952800cb8eecb"}, 1918 | ] 1919 | 1920 | [package.extras] 1921 | docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] 1922 | testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] 1923 | 1924 | [metadata] 1925 | lock-version = "2.0" 1926 | python-versions = "^3.8" 1927 | content-hash = "dc122dc274f42ad67dbc757f889660325a1acda6e9f88819033957c86995b8b2" 1928 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "nonebot_plugin_imageutils" 3 | version = "0.1.17" 4 | description = "Nonebot2 PIL工具插件" 5 | authors = ["meetwq "] 6 | license = "MIT" 7 | readme = "README.md" 8 | homepage = "https://github.com/noneplugin/nonebot-plugin-imageutils" 9 | repository = "https://github.com/noneplugin/nonebot-plugin-imageutils" 10 | 11 | [tool.poetry.dependencies] 12 | python = "^3.8" 13 | nonebot2 = {version = "^2.0.0-rc.1", extras = ["fastapi"], optional = true} 14 | loguru = "^0.6.0" 15 | fonttools = "^4.0.0" 16 | Pillow = "^9.0.0" 17 | httpx = ">=0.19.0" 18 | numpy = "^1.20.0" 19 | opencv-python-headless = "^4.0.0" 20 | bbcode = "^1.1.0" 21 | matplotlib = "^3.0.0" 22 | 23 | [tool.poetry.dev-dependencies] 24 | nb-cli = "^1.0.0" 25 | black = "^22.1.0" 26 | 27 | [build-system] 28 | requires = ["poetry-core>=1.0.0"] 29 | build-backend = "poetry.core.masonry.api" 30 | --------------------------------------------------------------------------------