├── cv ├── matplotlibrc ├── pallete │ └── .gitignore ├── .gitignore ├── lena.jpg ├── pixel.py ├── resize_slice.py ├── crop.py ├── green_slice.py ├── split_channels.py ├── always_blue.py ├── change_color_component.py ├── resize.py ├── text.py ├── change_green_component.py ├── color_system.py ├── pyproject.toml ├── rotate.py ├── change_with_jump.py ├── metadata.py ├── mask.py ├── flip.py ├── merge_channels.py ├── histogram.py ├── pallete_improved.py ├── pallete.py ├── histogram_color.py ├── draw.py ├── rectangles.py ├── equalize_histogram.py └── README.md ├── toxpipenv ├── toxpipenv │ ├── __init__.py │ └── core.py ├── MANIFEST ├── tests │ └── test_core.py ├── tox.ini ├── setup.py ├── pyproject.toml ├── README.md └── poetry.lock ├── learningopencv ├── .gitignore ├── Lupi.AVI ├── lena.jpg ├── th_2013.png ├── cruzeiro_tux_2010_normal.png ├── image.py ├── add.py ├── README.md ├── abs.py ├── absdiff.py ├── simple_transformation.py ├── pyproject.toml ├── camera.py ├── avivideo.py ├── trackbar.py ├── writeavi.py ├── cannyreduce.py ├── videorgb2gray.py ├── logpolar.py └── poetry.lock ├── multistagepython ├── requirements.txt ├── example_pandas.py ├── Dockerfile.step4 ├── Dockerfile.step1 ├── Dockerfile.step2 ├── Dockerfile.step3 ├── Dockerfile.step5 └── README.md ├── selenium_tricks ├── requirements.txt ├── test_api │ ├── files │ │ ├── lena.jpg │ │ └── some_text.txt │ ├── templates │ │ ├── hello.html │ │ ├── list_files.html │ │ └── base.html │ └── app.py ├── headless │ ├── chrome_example.py │ ├── firefox_example.py │ └── README.md ├── README.md └── download_files_headless │ ├── firefox_example.py │ ├── chrome_example.py │ └── README.md ├── assets ├── site.png ├── magic.gif └── mime-response.png ├── love ├── heart.png ├── README.md ├── love.py └── love.go ├── fastapi-playground ├── .vscode │ └── settings.json ├── pyproject.toml ├── main.py ├── README.md └── poetry.lock ├── lights_out ├── game1.png ├── game2.png ├── README.md └── lights_out.py ├── snake_game ├── smw_coin.wav ├── backgroundmusic.ogg ├── README.md └── jogo.py ├── xlsx2csv ├── example_xlsx.xlsx ├── pyproject.toml ├── README.md ├── xlsx2csv.py └── poetry.lock ├── orderdictbyvalue ├── ord.py └── README.md ├── paulinhaclass ├── tabela.csv ├── README.md └── requirements.txt ├── asyncreturn ├── README.md └── asyncreturn.py ├── summation ├── README.md └── summation.py ├── dataanalysis ├── README.md ├── requirements.txt ├── Jupyter Notebook.ipynb ├── pokemon.csv └── google_stock_price.csv ├── onelinechristmas ├── README.md ├── formatchristmas.py ├── onelinechristmas.py └── colorized.py ├── dockerize ├── README.md ├── pyproject.toml ├── run.py └── poetry.lock ├── hiding_message_in_an_image └── README.md ├── copyextension ├── README.md └── copyextension.py ├── algorithms ├── sort.py ├── search.py ├── greedy.py ├── dijkstra.py └── bfs.py ├── .gitignore ├── README.md └── LICENSE /cv/matplotlibrc: -------------------------------------------------------------------------------- 1 | backend: agg 2 | -------------------------------------------------------------------------------- /toxpipenv/toxpipenv/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /cv/pallete/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /cv/.gitignore: -------------------------------------------------------------------------------- 1 | !lena.jpg 2 | *.jpg 3 | *.png 4 | -------------------------------------------------------------------------------- /learningopencv/.gitignore: -------------------------------------------------------------------------------- 1 | !./Lupi.AVI 2 | *.avi 3 | -------------------------------------------------------------------------------- /multistagepython/requirements.txt: -------------------------------------------------------------------------------- 1 | pandas==1.3.3 2 | -------------------------------------------------------------------------------- /selenium_tricks/requirements.txt: -------------------------------------------------------------------------------- 1 | selenium==3.141.0 2 | flask==2.3.2 3 | -------------------------------------------------------------------------------- /cv/lena.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cassiobotaro/rivendell/HEAD/cv/lena.jpg -------------------------------------------------------------------------------- /assets/site.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cassiobotaro/rivendell/HEAD/assets/site.png -------------------------------------------------------------------------------- /love/heart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cassiobotaro/rivendell/HEAD/love/heart.png -------------------------------------------------------------------------------- /assets/magic.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cassiobotaro/rivendell/HEAD/assets/magic.gif -------------------------------------------------------------------------------- /fastapi-playground/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "python.formatting.provider": "black" 3 | } -------------------------------------------------------------------------------- /lights_out/game1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cassiobotaro/rivendell/HEAD/lights_out/game1.png -------------------------------------------------------------------------------- /lights_out/game2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cassiobotaro/rivendell/HEAD/lights_out/game2.png -------------------------------------------------------------------------------- /assets/mime-response.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cassiobotaro/rivendell/HEAD/assets/mime-response.png -------------------------------------------------------------------------------- /learningopencv/Lupi.AVI: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cassiobotaro/rivendell/HEAD/learningopencv/Lupi.AVI -------------------------------------------------------------------------------- /learningopencv/lena.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cassiobotaro/rivendell/HEAD/learningopencv/lena.jpg -------------------------------------------------------------------------------- /snake_game/smw_coin.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cassiobotaro/rivendell/HEAD/snake_game/smw_coin.wav -------------------------------------------------------------------------------- /learningopencv/th_2013.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cassiobotaro/rivendell/HEAD/learningopencv/th_2013.png -------------------------------------------------------------------------------- /xlsx2csv/example_xlsx.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cassiobotaro/rivendell/HEAD/xlsx2csv/example_xlsx.xlsx -------------------------------------------------------------------------------- /snake_game/backgroundmusic.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cassiobotaro/rivendell/HEAD/snake_game/backgroundmusic.ogg -------------------------------------------------------------------------------- /toxpipenv/MANIFEST: -------------------------------------------------------------------------------- 1 | # file GENERATED by distutils, do NOT edit 2 | setup.py 3 | toxpipenv/__init__.py 4 | toxpipenv/core.py 5 | -------------------------------------------------------------------------------- /toxpipenv/tests/test_core.py: -------------------------------------------------------------------------------- 1 | from toxpipenv.core import square 2 | 3 | 4 | def test_square(): 5 | assert square(2) == 4 6 | -------------------------------------------------------------------------------- /selenium_tricks/test_api/files/lena.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cassiobotaro/rivendell/HEAD/selenium_tricks/test_api/files/lena.jpg -------------------------------------------------------------------------------- /selenium_tricks/test_api/templates/hello.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | {% block content %} 3 | Hello World! 4 | {% endblock %} 5 | -------------------------------------------------------------------------------- /learningopencv/cruzeiro_tux_2010_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cassiobotaro/rivendell/HEAD/learningopencv/cruzeiro_tux_2010_normal.png -------------------------------------------------------------------------------- /multistagepython/example_pandas.py: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | 3 | df = pd.DataFrame({'a': [1, 2, 3], 'b': [4, 5, 6]}) 4 | print(df['a'].sum()) 5 | -------------------------------------------------------------------------------- /orderdictbyvalue/ord.py: -------------------------------------------------------------------------------- 1 | from operator import itemgetter 2 | original = {1: 2, 2: 3, 3: 1} 3 | ordered = dict(sorted(original.items(), key=itemgetter(1))) 4 | print(ordered) 5 | -------------------------------------------------------------------------------- /toxpipenv/tox.ini: -------------------------------------------------------------------------------- 1 | [tox] 2 | envlist = py310,py311 3 | 4 | [testenv] 5 | passenv = HOME 6 | deps = poetry 7 | commands = 8 | poetry install 9 | poetry run python -m pytest tests 10 | -------------------------------------------------------------------------------- /toxpipenv/toxpipenv/core.py: -------------------------------------------------------------------------------- 1 | def square(number): 2 | """Calculates square of a number. 3 | 4 | :number: a number 5 | :returns: square of a number 6 | 7 | """ 8 | return number ** 2 9 | -------------------------------------------------------------------------------- /multistagepython/Dockerfile.step4: -------------------------------------------------------------------------------- 1 | FROM python:3-slim 2 | WORKDIR /app 3 | COPY requirements.txt /app 4 | RUN pip install -r requirements.txt --no-cache 5 | COPY . /app 6 | CMD ["python", "example_pandas.py"] 7 | -------------------------------------------------------------------------------- /paulinhaclass/tabela.csv: -------------------------------------------------------------------------------- 1 | faturamento,tempo 2 | 22.988656,88.099884 3 | 13.983982,75.129938 4 | 19.834573,86.648599 5 | 18.874949,84.828383 6 | 15.849892,81.746383 7 | 13.759219,77.937611 8 | 15.125478,80.547181 -------------------------------------------------------------------------------- /multistagepython/Dockerfile.step1: -------------------------------------------------------------------------------- 1 | FROM python:3 2 | COPY requirements.txt . 3 | RUN pip install -r requirements.txt && rm -rf /root/.cache 4 | WORKDIR /app 5 | COPY . /app 6 | CMD ["python", "example_pandas.py"] 7 | -------------------------------------------------------------------------------- /asyncreturn/README.md: -------------------------------------------------------------------------------- 1 | # AsyncReturn 2 | 3 | This module is an example of how to write async functions that return values, 4 | and how to retrieve these values. 5 | 6 | ## How to run 7 | 8 | `python asyncreturn.py` 9 | -------------------------------------------------------------------------------- /paulinhaclass/README.md: -------------------------------------------------------------------------------- 1 | # Paulinha's class 2 | 3 | Deep learning fundamentals. 4 | 5 | ## How to run 6 | 7 | ```bash 8 | $ python -m venv .env 9 | $ source .env/bin/activate 10 | $ jupyter notebook 11 | ``` 12 | -------------------------------------------------------------------------------- /cv/pixel.py: -------------------------------------------------------------------------------- 1 | # Module to read one pixel 2 | import cv2 3 | 4 | image = cv2.imread('lena.jpg') 5 | b, g, r = image[0, 0] 6 | print('The pixel (0, 0) has the following colors:') 7 | print(f'Red: {r}, Green: {g}, Blue: {b}') 8 | -------------------------------------------------------------------------------- /cv/resize_slice.py: -------------------------------------------------------------------------------- 1 | # Module to resize an image using slicing 2 | import cv2 3 | image = cv2.imread('lena.jpg') 4 | cv2.imshow('Original', image) 5 | resized_image = image[::2, ::2] 6 | cv2.imshow('Resized image', resized_image) 7 | cv2.waitKey(0) 8 | -------------------------------------------------------------------------------- /learningopencv/image.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | import cv2 4 | 5 | image = cv2.imread("lena.jpg") 6 | if image is None: 7 | print("Image not found.", file=sys.stderr) 8 | sys.exit(1) 9 | cv2.imshow("image", image) 10 | cv2.waitKey() 11 | -------------------------------------------------------------------------------- /cv/crop.py: -------------------------------------------------------------------------------- 1 | # Module to crop an image 2 | import cv2 3 | image = cv2.imread('lena.jpg') 4 | cropping = image[100:200, 100:200] 5 | cv2.imshow('Image cropping', cropping) 6 | cv2.waitKey(0) # wait to press any key 7 | cv2.imwrite('cropping.jpg', cropping) 8 | -------------------------------------------------------------------------------- /summation/README.md: -------------------------------------------------------------------------------- 1 | # Σ (summation) 2 | 3 | Sum terms from lower_bound until upper_bound, applying some function on each term. 4 | 5 | ## How to run 6 | 7 | Run doctest to check if test is correct. 8 | 9 | `python -m doctest summation.py` 10 | -------------------------------------------------------------------------------- /multistagepython/Dockerfile.step2: -------------------------------------------------------------------------------- 1 | FROM python:3.9-alpine 2 | RUN apk add --update build-base 3 | COPY requirements.txt . 4 | RUN pip install -r requirements.txt && rm -rf /root/.cache 5 | WORKDIR /app 6 | COPY . /app 7 | CMD ["python", "example_pandas.py"] 8 | -------------------------------------------------------------------------------- /selenium_tricks/test_api/templates/list_files.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | {% block content %} 3 | {% for file in files %} 4 | {{file}} 5 | {% endfor %} 6 | {% endblock %} 7 | -------------------------------------------------------------------------------- /cv/green_slice.py: -------------------------------------------------------------------------------- 1 | # Module to change a slice of pixels into green 2 | import cv2 3 | image = cv2.imread('lena.jpg') 4 | # from 30 to 50 in y color pixel to green 5 | image[30:50, :] = (0, 255, 0) 6 | cv2.imshow('Modified image', image) 7 | cv2.waitKey(0) # wait to press any key 8 | -------------------------------------------------------------------------------- /dataanalysis/README.md: -------------------------------------------------------------------------------- 1 | # Data Analysis with Panda 2 | 3 | This module contains notebooks made by course `data analysis with pandas` of udemy. 4 | 5 | ## How to run 6 | 7 | ```bash 8 | $ python -m venv .env 9 | $ source .env/bin/activate 10 | $ jupyter notebook 11 | ``` 12 | -------------------------------------------------------------------------------- /learningopencv/add.py: -------------------------------------------------------------------------------- 1 | import cv2 2 | 3 | image1 = cv2.imread("cruzeiro_tux_2010_normal.png") 4 | image2 = cv2.imread("th_2013.png") 5 | add = cv2.add(image1, image2) 6 | adds = cv2.add(image1, (0, 10, 30, 100)) 7 | cv2.imshow("add", add) 8 | cv2.imshow("adds", adds) 9 | cv2.waitKey() 10 | -------------------------------------------------------------------------------- /learningopencv/README.md: -------------------------------------------------------------------------------- 1 | # Learning opencv 2 | 3 | Opencv library studies(python version). 4 | 5 | Old c++ version [here](https://github.com/cassiobotaro/estudos_opencv). 6 | 7 | ## Requirements 8 | 9 | `pipenv install` 10 | 11 | ## How to run 12 | 13 | `pipenv run python ` 14 | -------------------------------------------------------------------------------- /toxpipenv/setup.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | from distutils.core import setup 4 | 5 | setup(name='toxpipenv', 6 | version='1.0', 7 | description='Just some tests', 8 | author='Cássio Botaro', 9 | author_email='cassiobotaro@gmail.com', 10 | packages=['toxpipenv'], 11 | ) 12 | -------------------------------------------------------------------------------- /learningopencv/abs.py: -------------------------------------------------------------------------------- 1 | import cv2 2 | 3 | image1 = cv2.imread("cruzeiro_tux_2010_normal.png") 4 | image2 = cv2.imread("th_2013.png") 5 | absdiff = cv2.absdiff(image1, image2) 6 | absdiffs = cv2.absdiff(absdiff, (100, 0, 0, 0)) 7 | cv2.imshow("absdiff", absdiff) 8 | cv2.imshow("absdiffs", absdiffs) 9 | cv2.waitKey() 10 | -------------------------------------------------------------------------------- /learningopencv/absdiff.py: -------------------------------------------------------------------------------- 1 | import cv2 2 | 3 | image1 = cv2.imread("cruzeiro_tux_2010_normal.png") 4 | image2 = cv2.imread("th_2013.png") 5 | absdiff = cv2.absdiff(image1, image2) 6 | absdiffs = cv2.absdiff(image1, (0, 0, 255, 0)) 7 | cv2.imshow("absdiff", absdiff) 8 | cv2.imshow("absdiffs", absdiffs) 9 | cv2.waitKey() 10 | -------------------------------------------------------------------------------- /selenium_tricks/test_api/templates/base.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Test API 7 | 8 | 9 | {% block content %}{% endblock %} 10 | 11 | 12 | -------------------------------------------------------------------------------- /cv/split_channels.py: -------------------------------------------------------------------------------- 1 | # Module that split color channels 2 | import cv2 3 | image = cv2.imread('lena.jpg') 4 | blue_channel, green_channel, red_channel = cv2.split(image) 5 | cv2.imshow('Original', image) 6 | cv2.imshow('Red', red_channel) 7 | cv2.imshow('Green', green_channel) 8 | cv2.imshow('Blue', blue_channel) 9 | cv2.waitKey(0) 10 | -------------------------------------------------------------------------------- /selenium_tricks/headless/chrome_example.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | from selenium import webdriver 4 | 5 | options = webdriver.ChromeOptions() 6 | options.headless = True 7 | driver = webdriver.Chrome(options=options) 8 | driver.get("http://localhost:5000/") 9 | print(driver.page_source) 10 | driver.quit() 11 | -------------------------------------------------------------------------------- /cv/always_blue.py: -------------------------------------------------------------------------------- 1 | # Module to modify an image pixels to blue 2 | import cv2 3 | image = cv2.imread('lena.jpg') 4 | height, width, _ = image.shape 5 | BLUE = (255, 0, 0) 6 | for y in range(height): 7 | for x in range(width): 8 | image[y, x] = BLUE 9 | cv2.imshow('Modified image', image) 10 | cv2.waitKey(0) # wait to press any key 11 | -------------------------------------------------------------------------------- /learningopencv/simple_transformation.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | import cv2 4 | 5 | image = cv2.imread("lena.jpg") 6 | if image is None: 7 | print("Image not found.", file=sys.stderr) 8 | sys.exit(1) 9 | smooth = cv2.GaussianBlur(image, ksize=(0, 0), sigmaX=4) 10 | cv2.imshow("image", image) 11 | cv2.imshow("smooth", smooth) 12 | cv2.waitKey() 13 | -------------------------------------------------------------------------------- /onelinechristmas/README.md: -------------------------------------------------------------------------------- 1 | # One line christmas 2 | 3 | An awesome christmas message. 4 | 5 | ``` 6 | How big is your tree?(Ex: 5) 5 7 | What's your christmas message? Ho ho ho! 8 | ....★..... 9 | ...★★★.... 10 | ..★★★★★... 11 | .★★★★★★★.. 12 | ★★★★★★★★★. 13 | ▓ 14 | 15 | Ho ho ho! 16 | ``` 17 | 18 | ## How to run 19 | 20 | `python onelinechristmas.py` 21 | -------------------------------------------------------------------------------- /cv/change_color_component.py: -------------------------------------------------------------------------------- 1 | # Module to modify an image pixels based on it's position 2 | import cv2 3 | image = cv2.imread('lena.jpg') 4 | height, width, _ = image.shape 5 | for y in range(height): 6 | for x in range(width): 7 | image[y, x] = (x % 256, y % 256, x % 256) 8 | cv2.imshow('Modified image', image) 9 | cv2.waitKey(0) # wait to press any key 10 | -------------------------------------------------------------------------------- /dockerize/README.md: -------------------------------------------------------------------------------- 1 | # Dockerize run 2 | 3 | Dockerize will run 42 containers,beign n(number of cores in machine) 4 | containers simutaneously, each one doing some task. 5 | 6 | ## How to run 7 | 8 | You should have [docker](https://docs.docker.com/engine/installation/) installed locally. 9 | 10 | Install requirements: `pipenv install` 11 | 12 | `pipenv run python run.py` 13 | -------------------------------------------------------------------------------- /dockerize/pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "dockerize" 3 | version = "0.1.0" 4 | description = "" 5 | authors = ["cassiobotaro "] 6 | readme = "README.md" 7 | 8 | [tool.poetry.dependencies] 9 | python = "^3.11" 10 | docker = "^6.0.1" 11 | 12 | 13 | [build-system] 14 | requires = ["poetry-core"] 15 | build-backend = "poetry.core.masonry.api" 16 | -------------------------------------------------------------------------------- /xlsx2csv/pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "xlsx2csv" 3 | version = "0.1.0" 4 | description = "" 5 | authors = ["cassiobotaro "] 6 | readme = "README.md" 7 | 8 | [tool.poetry.dependencies] 9 | python = "^3.11" 10 | openpyxl = "^3.0.10" 11 | 12 | 13 | [build-system] 14 | requires = ["poetry-core"] 15 | build-backend = "poetry.core.masonry.api" 16 | -------------------------------------------------------------------------------- /cv/resize.py: -------------------------------------------------------------------------------- 1 | # Module to resize an image 2 | import cv2 3 | image = cv2.imread('lena.jpg') 4 | cv2.imshow('Original', image) 5 | height, width, _ = image.shape 6 | proportion = 100.0 / width 7 | new_size = (100, int(height * proportion)) 8 | resized_image = cv2.resize(image, new_size, interpolation=cv2.INTER_AREA) 9 | cv2.imshow('Resized image', resized_image) 10 | cv2.waitKey(0) 11 | -------------------------------------------------------------------------------- /cv/text.py: -------------------------------------------------------------------------------- 1 | # Module to write a text into an image 2 | import cv2 3 | image = cv2.imread('lena.jpg') 4 | font = cv2.FONT_HERSHEY_TRIPLEX 5 | # cv2.putText(img, text, org, fontFace, fontScale, color[, thickness[, 6 | # lineType[, bottomLeftOrigin]]]) → None 7 | cv2.putText(image, 'Lena', (15, 65), font, 2, (255, 255, 255), 2, cv2.LINE_AA) 8 | cv2.imshow('Lena', image) 9 | cv2.waitKey(0) 10 | -------------------------------------------------------------------------------- /cv/change_green_component.py: -------------------------------------------------------------------------------- 1 | # Module to modify an image pixels based on it's position 2 | # Just modify green component 3 | import cv2 4 | image = cv2.imread('lena.jpg') 5 | height, width, _ = image.shape 6 | for y in range(height): 7 | for x in range(width): 8 | image[y, x] = (0, (x * y) % 256, 0) 9 | cv2.imshow('Modified image', image) 10 | cv2.waitKey(0) # wait to press any key 11 | -------------------------------------------------------------------------------- /cv/color_system.py: -------------------------------------------------------------------------------- 1 | # Module to show other color systems 2 | import cv2 3 | image = cv2.imread('lena.jpg') 4 | cv2.imshow('Original', image) 5 | gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) 6 | cv2.imshow('Gray', gray) 7 | hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) 8 | cv2.imshow('HSV', hsv) 9 | lab = cv2.cvtColor(image, cv2.COLOR_BGR2LAB) 10 | cv2.imshow('L*a*b*', lab) 11 | cv2.waitKey(0) 12 | -------------------------------------------------------------------------------- /learningopencv/pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "learningopencv" 3 | version = "0.1.0" 4 | description = "" 5 | authors = ["cassiobotaro "] 6 | readme = "README.md" 7 | 8 | [tool.poetry.dependencies] 9 | python = "^3.11" 10 | opencv-python = "^4.8.1.78" 11 | 12 | 13 | [build-system] 14 | requires = ["poetry-core"] 15 | build-backend = "poetry.core.masonry.api" 16 | -------------------------------------------------------------------------------- /cv/pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "cv" 3 | version = "0.1.0" 4 | description = "" 5 | authors = ["cassiobotaro "] 6 | 7 | [tool.poetry.dependencies] 8 | python = "^3.10" 9 | opencv-python = "^4.8.1" 10 | matplotlib = "^3.5.2" 11 | 12 | [tool.poetry.dev-dependencies] 13 | 14 | [build-system] 15 | requires = ["poetry-core>=1.0.0"] 16 | build-backend = "poetry.core.masonry.api" 17 | -------------------------------------------------------------------------------- /love/README.md: -------------------------------------------------------------------------------- 1 | # Love 2 | 3 | Draw a heart using a name. 4 | 5 | ![heart](./heart.png) 6 | 7 | ## How to build 8 | 9 | When build, set main.love or "Love" will be used as default. 10 | 11 | `go build -ldflags="-X main.love=" love.go` 12 | 13 | ## How to run 14 | 15 | **go version** 16 | 17 | `go run -ldflags="-X main.love=" love.go` 18 | 19 | **python version** 20 | 21 | `python love.py` 22 | -------------------------------------------------------------------------------- /selenium_tricks/headless/firefox_example.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | from selenium import webdriver 4 | 5 | 6 | # set browser headless 7 | options = webdriver.FirefoxOptions() 8 | options.headless = True 9 | driver = webdriver.Firefox(options=options) 10 | # navigate to site and print source page 11 | driver.get("http://localhost:5000/") 12 | print(driver.page_source) 13 | driver.quit() 14 | -------------------------------------------------------------------------------- /cv/rotate.py: -------------------------------------------------------------------------------- 1 | # Module to rotate an image 2 | import cv2 3 | image = cv2.imread('lena.jpg') 4 | height, width, _ = image.shape # caught height and width 5 | center = (width // 2, height // 2) # find the center 6 | rotation_matrix = cv2.getRotationMatrix2D(center, 30, 1.0) # 30 degrees 7 | rotated_image = cv2.warpAffine(image, rotation_matrix, (width, height)) 8 | cv2.imshow("Image rotated 30 degrees", rotated_image) 9 | cv2.waitKey(0) 10 | -------------------------------------------------------------------------------- /love/love.py: -------------------------------------------------------------------------------- 1 | matriz = [] 2 | nome = "amor" 3 | 4 | for y in range(30, -30, -1): 5 | linha = [] 6 | for x in range(-30, 30): 7 | if ((x * 0.05) ** 2 + (y * 0.1) ** 2 - 1) ** 3 - (x * 0.05) ** 2 * ( 8 | y * 0.1 9 | ) ** 3 <= 0: 10 | linha.append(nome[(x - y) % len(nome)]) 11 | else: 12 | linha.append(" ") 13 | matriz.append("".join(linha)) 14 | 15 | print("\n".join(matriz)) 16 | -------------------------------------------------------------------------------- /toxpipenv/pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "toxpipenv" 3 | version = "0.1.0" 4 | description = "" 5 | authors = ["cassiobotaro "] 6 | readme = "README.md" 7 | 8 | [tool.poetry.dependencies] 9 | python = "^3.10" 10 | 11 | 12 | [tool.poetry.group.dev.dependencies] 13 | tox = "^4.0.16" 14 | pytest = "^7.2.0" 15 | 16 | [build-system] 17 | requires = ["poetry-core"] 18 | build-backend = "poetry.core.masonry.api" 19 | -------------------------------------------------------------------------------- /snake_game/README.md: -------------------------------------------------------------------------------- 1 | # Jogo da Cobrinha 2 | 3 | Jogo da cobrinha é um jogo muito simples, onde o objetivo é coletar todas as frutas. 4 | 5 | ## Como executar o jogo 6 | 7 | Crie um ambiente virtual através do comando: `python -m venv .venv`. 8 | 9 | Para ativa-lo, digite: `source .venv/bin/activate` ou `.venv\Scripts\activate.bat` no windows. 10 | 11 | Com o ambiente ativado, digite `pip install pygame`. 12 | 13 | Por fim execute o jogo: `python jogo.py` -------------------------------------------------------------------------------- /cv/change_with_jump.py: -------------------------------------------------------------------------------- 1 | # Module to modify an image(yellow) pixels based on it's position 2 | # jumping some pixels 3 | import cv2 4 | image = cv2.imread('lena.jpg') 5 | height, width, _ = image.shape 6 | YELLOW = (0, 255, 255) 7 | for y in range(0, height, 10): # iterate lines 8 | for x in range(0, width, 10): # iterate columns 9 | image[y:y+5, x:x+5] = YELLOW 10 | cv2.imshow('Modified image', image) 11 | cv2.waitKey(0) # wait to press any key 12 | -------------------------------------------------------------------------------- /selenium_tricks/headless/README.md: -------------------------------------------------------------------------------- 1 | # Headless 2 | 3 | An example of how to run Chrome and Firefox headless without third parties. 4 | 5 | ## Problem 6 | 7 | Run browser headless without third parties. 8 | 9 | ## Discuss 10 | 11 | In recent versions of browsers and selenium you can set option `headless` to `True` and it will works very well. 12 | 13 | ## How to run 14 | 15 | `python firefox_example.py` 16 | 17 | or 18 | 19 | `python chrome_example.py` 20 | -------------------------------------------------------------------------------- /cv/metadata.py: -------------------------------------------------------------------------------- 1 | # Module to get image metadata 2 | import cv2 3 | 4 | image = cv2.imread('lena.jpg') 5 | height, width, channels = image.shape 6 | print(f'Width in pixels: {width}') 7 | print(f'Height in pixels: {height}') 8 | print(f'Qty of channels: {channels}') 9 | # Show image using function imshow 10 | cv2.imshow('Window\'s name', image) 11 | cv2.waitKey(0) # wait to press any key 12 | # Save image into disk using function imwrite() 13 | cv2.imwrite('output.jpg', image) 14 | -------------------------------------------------------------------------------- /learningopencv/camera.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | import cv2 4 | 5 | ENTER = 13 6 | 7 | capture = cv2.VideoCapture(0) 8 | if capture is None: 9 | print("Video not found.", file=sys.stderr) 10 | sys.exit(1) 11 | 12 | captured, frame = capture.read() 13 | key = 0 14 | 15 | while captured and key != ENTER: 16 | cv2.imshow('video', frame) 17 | captured, frame = capture.read() 18 | key = cv2.waitKey(delay=33) 19 | 20 | capture.release() 21 | cv2.destroyAllWindows() 22 | -------------------------------------------------------------------------------- /selenium_tricks/test_api/files/some_text.txt: -------------------------------------------------------------------------------- 1 | Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 2 | -------------------------------------------------------------------------------- /cv/mask.py: -------------------------------------------------------------------------------- 1 | # Module that apply a bitwise and mask 2 | import cv2 3 | import numpy as np 4 | image = cv2.imread('lena.jpg') 5 | cv2.imshow('Original', image) 6 | height, width, _ = image.shape 7 | mask = np.zeros((height, width), dtype=np.uint8) 8 | center = (width // 2, height // 2) 9 | cv2.circle(mask, center, radius=100, color=255, thickness=-1) 10 | masked_image = cv2.bitwise_and(image, image, mask=mask) 11 | cv2.imshow('Mask applied to image', masked_image) 12 | cv2.waitKey(0) 13 | -------------------------------------------------------------------------------- /fastapi-playground/pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "fastapi-playground" 3 | version = "0.1.0" 4 | description = "" 5 | authors = ["cassiobotaro "] 6 | 7 | [tool.poetry.dependencies] 8 | python = "^3.13" 9 | fastapi = "^0.120.3" 10 | uvicorn = "^0.38.0" 11 | 12 | [tool.poetry.group.dev.dependencies] 13 | pytest = "^8.4.2" 14 | black = "^25.9.0" 15 | 16 | [build-system] 17 | requires = ["poetry-core>=1.0.0"] 18 | build-backend = "poetry.core.masonry.api" 19 | -------------------------------------------------------------------------------- /lights_out/README.md: -------------------------------------------------------------------------------- 1 | # Lights Out 2 | 3 | Lights Out is game based on simple concept. Clicking on a cell toggles that cell and each of its immediate neighbors. The goal is to turn out all the lights, ideally with the minimum number of clicks. 4 | 5 | ![Game Image](./game1.png) ![Game Image](./game2.png) 6 | 7 | ## Requirements 8 | 9 | It is necessary to install the tkinter package. 10 | 11 | `sudo apt install python3-tkinter` 12 | 13 | ## How to run 14 | 15 | `python lights_out.py` 16 | -------------------------------------------------------------------------------- /orderdictbyvalue/README.md: -------------------------------------------------------------------------------- 1 | # Order a dict by values 2 | 3 | Given a dictionary, I want to sort its elements by their values, not by their keys. 4 | 5 | E.g. {1:2, 2:1} becomes {2:1, 1:2}. 6 | 7 | Firstly we get dict elements using function `items()`. The return is a list of tuples containing it's keys and values. 8 | Then we sort this list based on second element of the tuple. 9 | Finnaly we transform this list into a dict again. 10 | 11 | Remembering that only works with python 3.6+. 12 | -------------------------------------------------------------------------------- /learningopencv/avivideo.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | import cv2 4 | 5 | ENTER = 13 6 | 7 | capture = cv2.VideoCapture('Lupi.AVI') 8 | if capture is None: 9 | print("Video not found.", file=sys.stderr) 10 | sys.exit(1) 11 | 12 | captured, frame = capture.read() 13 | key = 0 14 | 15 | while captured and key != ENTER: 16 | cv2.imshow('video', frame) 17 | captured, frame = capture.read() 18 | key = cv2.waitKey(delay=33) 19 | 20 | capture.release() 21 | cv2.destroyAllWindows() 22 | -------------------------------------------------------------------------------- /multistagepython/Dockerfile.step3: -------------------------------------------------------------------------------- 1 | FROM python:3.9-alpine as builder 2 | RUN apk add --update build-base 3 | COPY requirements.txt . 4 | RUN pip install -r requirements.txt 5 | 6 | 7 | FROM python:3.9-alpine 8 | # required by pandas 9 | RUN apk add --update libstdc++ 10 | COPY --from=builder /root/.cache /root/.cache 11 | COPY --from=builder requirements.txt . 12 | RUN pip install -r requirements.txt && rm -rf /root/.cache 13 | WORKDIR /app 14 | COPY . /app 15 | CMD ["python", "example_pandas.py"] 16 | -------------------------------------------------------------------------------- /fastapi-playground/main.py: -------------------------------------------------------------------------------- 1 | import typing 2 | 3 | from fastapi import FastAPI 4 | from pydantic import BaseModel 5 | 6 | app = FastAPI() 7 | 8 | 9 | class AModel(BaseModel): 10 | name: str 11 | age: int 12 | 13 | 14 | class OtherModel(BaseModel): 15 | name: str 16 | weird: int 17 | 18 | 19 | class Response(BaseModel): 20 | msg: str 21 | 22 | 23 | @app.post("/union") 24 | def post_union(model: typing.Union[AModel, OtherModel]): 25 | return Response(msg=f"My name is {model.name} and my type {type(model)}") 26 | -------------------------------------------------------------------------------- /hiding_message_in_an_image/README.md: -------------------------------------------------------------------------------- 1 | # Hiding message in an image 2 | 3 | # Step 1 - Create virtual environment 4 | 5 | ```bash 6 | python -m venv .venv && source .venv/bin/activate 7 | ``` 8 | 9 | # Step 2 - Install Dependencies 10 | 11 | ```bash 12 | python -m pip install stegano 13 | ``` 14 | 15 | # Step 3 - Hiding image 16 | 17 | ```bash 18 | stegano-lsb hide -i ./tests/sample-files/Lenna.png -m "Secret Message" -o Lena1.png 19 | ``` 20 | 21 | # Step 4 - To reveal image execute: 22 | 23 | ```bash 24 | stegano-lsb reveal -i Lena1.png 25 | ``` 26 | -------------------------------------------------------------------------------- /copyextension/README.md: -------------------------------------------------------------------------------- 1 | # copyextension 2 | 3 | Small script to copy all files of 'extension' from 'source' to 'destiny'. 4 | 5 | 6 | ## How to run 7 | 8 | `python copyextension.py jpg source/ destiny/` 9 | 10 | ## help 11 | 12 | ``` 13 | usage: copyextension.py [-h] extension source destiny 14 | 15 | positional arguments: 16 | extension files extension 17 | source directory that will be scanned 18 | destiny directory where files will be pasted 19 | 20 | optional arguments: 21 | -h, --help show this help message and exit 22 | ``` 23 | -------------------------------------------------------------------------------- /cv/flip.py: -------------------------------------------------------------------------------- 1 | # Module to flip an image 2 | import cv2 3 | image = cv2.imread('lena.jpg') 4 | cv2.imshow('Original', image) 5 | horizontal_flip = image[::-1, :] # command below 6 | # horizontal_flip = cv2.flip(image, 1) 7 | cv2.imshow('Horizontal Flip', horizontal_flip) 8 | vertical_flip = image[:, ::-1] # command below 9 | # vertical_flip = cv2.flip(img, 0) 10 | cv2.imshow('Vertical Flip', vertical_flip) 11 | hv_flip = image[::-1, ::-1] # command below 12 | # hv_flip = cv2.flip(img, -1) 13 | cv2.imshow('Horizontal and Vertical Flip', hv_flip) 14 | cv2.waitKey(0) 15 | -------------------------------------------------------------------------------- /onelinechristmas/formatchristmas.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # One line python code to wish merry christmas with height and 3 | # custom message. 4 | # 5 | # * 6 | # *** 7 | # ***** 8 | # ******* 9 | # ********* 10 | # | 11 | # 12 | # Merry christmas! 13 | # Usage: python tree.py 14 | # Dependency: Python 3.12+ 15 | # fmt: off 16 | print(f'{'' * (width := 2 * int(input('How big is your tree?(E.g. 5) ')))}{'\n'.join(f"{'★' * stars:.^{width}}" for stars in range(1, width, 2))}\n{'▓':^{width}}\n\n{input("What's your christmas message? "):^{width}}') 17 | -------------------------------------------------------------------------------- /cv/merge_channels.py: -------------------------------------------------------------------------------- 1 | # Module that split color channels and merge with empty channels to generate 2 | # specific colored images 3 | import cv2 4 | import numpy as np 5 | 6 | image = cv2.imread("lena.jpg") 7 | blue_channel, green_channel, red_channel = cv2.split(image) 8 | zeros = np.zeros(image.shape[:2], dtype=np.uint8) 9 | 10 | cv2.imshow('Red', cv2.merge([zeros, zeros, red_channel])) 11 | cv2.imshow('Green', cv2.merge([zeros, green_channel, zeros])) 12 | cv2.imshow('Blue', cv2.merge([blue_channel, zeros, zeros])) 13 | cv2.imshow('Original', image) 14 | cv2.waitKey(0) 15 | -------------------------------------------------------------------------------- /xlsx2csv/README.md: -------------------------------------------------------------------------------- 1 | # xlsx2csv 2 | 3 | Convert xlsx to csv. 4 | 5 | ## Requirements 6 | 7 | `pipenv install` 8 | 9 | ## How to run 10 | 11 | `pipenv run python xlsx2csv.py example_xlsx.xlsx` 12 | 13 | or 14 | 15 | `pipenv run python xlsx2csv.py --sheet Planilha2 example_xlsx.xlsx` 16 | 17 | ## help 18 | 19 | ``` 20 | usage: convert.py [-h] [--sheet SHEET] filename 21 | 22 | positional arguments: 23 | filename name of xlsx file 24 | 25 | optional arguments: 26 | -h, --help show this help message and exit 27 | --sheet SHEET name of the sheet 28 | ``` 29 | -------------------------------------------------------------------------------- /summation/summation.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | 4 | def Σ(lower_bound, upper_bound, function): 5 | '''Summation is a math operator to easily represent a great sum of terms, 6 | even infinity. 7 | 8 | It's represented with the greek letter sigma. 9 | Sum terms from lower_bound until upper_bound, applying some function on 10 | each term. 11 | 12 | >>> Σ(1,5,lambda x:x) # 1 + 2 + 3 + 4 + 5 = 15 13 | 15 14 | ''' 15 | return sum(function(index) for index in range(lower_bound, 16 | upper_bound + 1)) 17 | -------------------------------------------------------------------------------- /multistagepython/Dockerfile.step5: -------------------------------------------------------------------------------- 1 | FROM python:3-slim as builder 2 | WORKDIR /app 3 | 4 | ENV PYTHONDONTWRITEBYTECODE=1 5 | ENV PYTHONUNBUFFERED=1 6 | 7 | RUN apt-get update &&\ 8 | apt-get install -y --no-install-recommends gcc 9 | 10 | COPY requirements.txt . 11 | RUN pip wheel --no-cache-dir --no-deps --wheel-dir /app/wheels -r requirements.txt 12 | 13 | FROM python:3-slim 14 | WORKDIR /app 15 | 16 | COPY --from=builder /app/wheels /wheels 17 | COPY --from=builder /app/requirements.txt . 18 | 19 | RUN pip install --no-cache /wheels/* 20 | 21 | COPY . /app 22 | CMD ["python", "example_pandas.py"] 23 | -------------------------------------------------------------------------------- /algorithms/sort.py: -------------------------------------------------------------------------------- 1 | def find_smallest(arr): 2 | 'Given a iterable, returns smallest index.' 3 | smallest, *_ = arr 4 | smallest_index = 0 5 | for i in range(1, len(arr)): 6 | if arr[i] < smallest: 7 | smallest = arr[i] 8 | smallest_index = i 9 | return smallest_index 10 | 11 | 12 | def selection_sort(arr): 13 | '''Order an iterable using selection sort. 14 | 15 | Complexity: O(n²) 16 | ''' 17 | ordered = [] 18 | for _ in range(len(arr)): 19 | smallest = find_smallest(arr) 20 | ordered.append(arr.pop(smallest)) 21 | return ordered 22 | -------------------------------------------------------------------------------- /cv/histogram.py: -------------------------------------------------------------------------------- 1 | # Module that plot gray scale image histogram 2 | import cv2 3 | import matplotlib.pyplot as plt 4 | 5 | gray = cv2.imread('lena.jpg', cv2.IMREAD_GRAYSCALE) 6 | cv2.imshow('Gray Image', gray) 7 | histogram = cv2.calcHist([gray], channels=[0], mask=None, 8 | histSize=[256], ranges=[0, 256]) 9 | plt.figure() 10 | plt.title('Histogram') 11 | plt.xlabel('Intesity') 12 | plt.ylabel('Quantity of Pixels') 13 | plt.plot(histogram) 14 | plt.xlim([0, 256]) 15 | # Another way to plot histogram 16 | # plt.hist(gray.ravel(), bins=256, range=[0, 256]) 17 | plt.savefig('histogram.png') 18 | cv2.waitKey() 19 | -------------------------------------------------------------------------------- /onelinechristmas/onelinechristmas.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # One line python code to wish merry christmas with height and 3 | # custom message. 4 | # 5 | # * 6 | # *** 7 | # ***** 8 | # ******* 9 | # ********* 10 | # | 11 | # 12 | # Merry christmas! 13 | # Usage: python tree.py 14 | # Dependency: Python 3.X 15 | 16 | (lambda width: print('{tree}\n{root}\n\n{message}\n'.format(tree='\n'.join('{}'.format(('★' * stars).center(width, '.')) for stars in range(1, width, 2)), root='▓'.center(width), message=input("What's your christmas message? ").center(width))))(2 * int(input('How big is your tree?(E.g. 5) '))) # noqa:E501 17 | -------------------------------------------------------------------------------- /cv/pallete_improved.py: -------------------------------------------------------------------------------- 1 | # module to generate images based on colors(improved version) 2 | import numpy as np 3 | import cv2 4 | 5 | width = height = 100 6 | channels = 3 7 | 8 | # name -> b,g,r 9 | colors = { 10 | 'white': (255, 255, 255), 11 | 'red': (0, 0, 255), 12 | 'blue': (255, 0, 0), 13 | 'green': (0, 255, 0), 14 | 'cyan': (255, 255, 0), 15 | 'magenta': (255, 0, 255), 16 | 'yellow': (0, 255, 255), 17 | 'black': (0, 0, 0), 18 | } 19 | 20 | for name, color in colors.items(): 21 | image = np.ndarray(shape=(width, height, channels), dtype=np.uint8) 22 | image[:] = color 23 | cv2.imwrite(f'pallete/{name}.jpg', image) 24 | -------------------------------------------------------------------------------- /onelinechristmas/colorized.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # One line python code to wish merry christmas with custom height and 3 | # message. 4 | # 5 | # * 6 | # *** 7 | # ***** 8 | # ******* 9 | # ********* 10 | # | 11 | # 12 | # Merry christmas! 13 | # Usage: python tree.py 14 | # Dependency: Python 3.X 15 | 16 | (lambda width: print('\033[0;32;40m{tree}\n{root}\n\n\033[5;31;40m{message}\n\033[0m'.format(tree='\n'.join('{}'.format(('★' * stars).center(width, '.')) for stars in range(1, width, 2)), root='▓'.center(width), message=input("What's your christmas message? ").center(width))))(2 * int(input('How big is your tree?(E.g. 5) '))) # noqa:E501 17 | -------------------------------------------------------------------------------- /selenium_tricks/test_api/app.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | from flask import Flask, render_template, send_from_directory 4 | 5 | app = Flask(__name__) 6 | 7 | 8 | @app.route('/') 9 | def index(): 10 | return render_template("hello.html") 11 | 12 | 13 | @app.route("/files/") 14 | def download_files(filename): 15 | files = os.path.join(app.root_path, "files") 16 | return send_from_directory( 17 | directory=files, filename=filename, as_attachment=True 18 | ) 19 | 20 | 21 | @app.route("/files") 22 | def list_files(): 23 | files = os.listdir(os.path.join(app.root_path, "files")) 24 | return render_template("list_files.html", files=files) 25 | -------------------------------------------------------------------------------- /cv/pallete.py: -------------------------------------------------------------------------------- 1 | # module to generate images based on colors 2 | import numpy as np 3 | import cv2 4 | 5 | width = height = 100 6 | channels = 3 7 | 8 | # name -> b,g,r 9 | colors = { 10 | 'white': (255, 255, 255), 11 | 'red': (0, 0, 255), 12 | 'blue': (255, 0, 0), 13 | 'green': (0, 255, 0), 14 | 'cyan': (255, 255, 0), 15 | 'magenta': (255, 0, 255), 16 | 'yellow': (0, 255, 255), 17 | 'black': (0, 0, 0), 18 | } 19 | 20 | for name, color in colors.items(): 21 | image = np.ndarray(shape=(width, height, channels), dtype=np.uint8) 22 | for y in range(height): 23 | for x in range(width): 24 | image[y, x] = color 25 | cv2.imwrite(f'pallete/{name}.jpg', image) 26 | -------------------------------------------------------------------------------- /cv/histogram_color.py: -------------------------------------------------------------------------------- 1 | # Module that plot color image histogram 2 | import cv2 3 | import matplotlib.pyplot as plt 4 | 5 | color = cv2.imread('lena.jpg') 6 | cv2.imshow('Color Image', color) 7 | 8 | # split channels 9 | channels = cv2.split(color) 10 | colors = ('b', 'g', 'r') 11 | plt.figure() 12 | plt.title('Histogram') 13 | plt.xlabel('Intesity') 14 | plt.ylabel('Quantity of Pixels') 15 | 16 | for channel, color in zip(channels, colors): 17 | # one loop for each channel 18 | hist = cv2.calcHist([channel], channels=[0], mask=None, 19 | histSize=[256], ranges=[0, 256]) 20 | plt.plot(hist, color=color) 21 | plt.xlim([0, 256]) 22 | plt.savefig('histogram-color.png') 23 | cv2.waitKey() 24 | -------------------------------------------------------------------------------- /cv/draw.py: -------------------------------------------------------------------------------- 1 | # Module to draw circles, rectangles and lines 2 | import cv2 3 | 4 | image = cv2.imread('lena.jpg') 5 | 6 | RED = (0, 0, 255) 7 | GREEN = (0, 255, 0) 8 | BLUE = (255, 0, 0) 9 | cv2.line(image, pt1=(0, 0), pt2=(100, 200), color=GREEN) 10 | cv2.line(image, pt1=(300, 200), pt2=(150, 150), color=RED, thickness=5) 11 | cv2.rectangle(image, pt1=(20, 20), pt2=(120, 120), color=BLUE, thickness=10) 12 | cv2.rectangle(image, pt1=(200, 50), pt2=(225, 125), color=GREEN, thickness=-1) 13 | height, width, _ = image.shape 14 | # image center 15 | center = (width // 2, height // 2) 16 | for radius in range(0, 175, 15): 17 | cv2.circle(image, center, radius, RED) 18 | cv2.imshow('Drawing over image', image) 19 | cv2.waitKey(0) 20 | -------------------------------------------------------------------------------- /algorithms/search.py: -------------------------------------------------------------------------------- 1 | def linear_search(list_, item): 2 | '''Searches for an item in linear way. 3 | 4 | Complexity: O(n) 5 | ''' 6 | for index, value in enumerate(list_): 7 | if value == item: 8 | return index 9 | return None 10 | 11 | 12 | def binary_search(list_, item): 13 | '''Searches for an item in a ordered list. 14 | 15 | Complexity: O(log(n))''' 16 | low = 0 17 | high = len(list_) - 1 18 | while low <= high: 19 | mid = (low + high) // 2 20 | guess = list_[mid] 21 | if guess == item: 22 | return mid 23 | elif guess > item: 24 | high = mid - 1 25 | else: 26 | low = mid + 1 27 | return None 28 | -------------------------------------------------------------------------------- /asyncreturn/asyncreturn.py: -------------------------------------------------------------------------------- 1 | ''' 2 | asyncreturn.py 3 | 4 | This module is an example of how to write async functions that return values, 5 | and how to retrieve these values. 6 | ''' 7 | import asyncio 8 | import random 9 | 10 | 11 | async def process(data, sleep): 12 | await asyncio.sleep(random.randint(1, 3)) 13 | return f'resultado do processamento {data}' 14 | 15 | 16 | async def data_analysis(): 17 | data = [1, 2, 3, 4, 5, 6] 18 | tasks = (process(data[:len(data)//2], 3), process(data[len(data)//2:], 2)) 19 | ret = await asyncio.gather(*tasks) 20 | for r in ret: 21 | print(r) 22 | 23 | 24 | if __name__ == "__main__": 25 | loop = asyncio.get_event_loop() 26 | loop.run_until_complete(data_analysis()) 27 | -------------------------------------------------------------------------------- /fastapi-playground/README.md: -------------------------------------------------------------------------------- 1 | # FastAPI Playground 🕹️ 2 | 3 | ## Requirements 4 | 5 | Use poetry to install dependencies: 6 | 7 | $ pip install poetry 8 | $ poetry install 9 | 10 | ## How to run 11 | 12 | $ poetry run uvicorn main:app --reload 13 | 14 | ## Questions 15 | 16 | **Q: How to receive different types of payload?** 17 | 18 | We can use `typing.Union` as you can see in `/union` endpoint. 19 | 20 | The OpenAPI specification is correctly created using the `anyOf` element. A detail is in the validation of the fields, if it does not fit in any of the structures, the lack of all fields of all structures will be reported, including those that are repeated. 21 | 22 | NOTE: `typing.Union` is not supported in Python 3.5 and can be replaced by `|` in Python 3.10. -------------------------------------------------------------------------------- /learningopencv/trackbar.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | import cv2 4 | 5 | ENTER = 13 6 | 7 | 8 | def on_trackbar_slide(position): 9 | capture.set(cv2.CAP_PROP_POS_FRAMES, position) 10 | 11 | 12 | capture = cv2.VideoCapture('Lupi.AVI') 13 | if capture is None: 14 | print("Video not found.", file=sys.stderr) 15 | sys.exit(1) 16 | cv2.namedWindow("Video", cv2.WINDOW_AUTOSIZE) 17 | frames = int(capture.get(cv2.CAP_PROP_FRAME_COUNT)) 18 | if frames != 0: 19 | cv2.createTrackbar("Position", "Video", 0, frames, on_trackbar_slide) 20 | captured, frame = capture.read() 21 | key = 0 22 | 23 | while captured and key != ENTER: 24 | cv2.imshow("Video", frame) 25 | captured, frame = capture.read() 26 | key = cv2.waitKey(delay=33) 27 | 28 | capture.release() 29 | cv2.destroyAllWindows() 30 | -------------------------------------------------------------------------------- /cv/rectangles.py: -------------------------------------------------------------------------------- 1 | # Module to draw rectangles in the image 2 | import cv2 3 | image = cv2.imread('lena.jpg') 4 | # Creates a blue rectangle over the entire width of the image 5 | image[30:50, :] = (255, 0, 0) 6 | # Creates a red square 7 | image[100:150, 50:100] = (0, 0, 255) 8 | # Created a yellow rectangle all over the image height 9 | image[:, 200:220] = (0, 255, 255) 10 | # Creates a green rectangle from line 150 to 300 on columns 250 to 350 11 | image[150:301, 250:351] = (0, 255, 0) 12 | # Creates a cyan square from line 300 to 400 on columns 50 to 150 13 | image[300:401, 50:251] = (255, 255, 0) 14 | # Creates a white square 15 | image[250:350, 300:400] = (255, 255, 255) 16 | # Creates a black rectangle 17 | image[70:100, 300: 450] = (0, 0, 0) 18 | 19 | cv2.imshow('Altered image', image) 20 | cv2.imwrite('rectangles.jpg', image) 21 | cv2.waitKey(0) 22 | -------------------------------------------------------------------------------- /cv/equalize_histogram.py: -------------------------------------------------------------------------------- 1 | # Module to equalize image histogram 2 | from matplotlib import pyplot as plt 3 | import cv2 4 | 5 | gray = cv2.imread('lena.jpg', cv2.IMREAD_GRAYSCALE) 6 | equalized_histogram = cv2.equalizeHist(gray) 7 | 8 | plt.figure() 9 | plt.title('Equalized histogram') 10 | plt.xlabel('Intensity') 11 | plt.ylabel('Quantity of Pixels') 12 | plt.hist(equalized_histogram.ravel(), bins=256, range=[0, 256]) 13 | plt.xlim([0, 256]) 14 | plt.savefig('equalized_histogram.png') 15 | cv2.imwrite('equalized_histogram.jpg', equalized_histogram) 16 | 17 | plt.figure() 18 | plt.title('Original histogram') 19 | plt.xlabel('Intensity') 20 | plt.ylabel('Quantity of Pixels') 21 | plt.hist(gray.ravel(), bins=256, range=[0, 256]) 22 | plt.xlim([0, 256]) 23 | plt.savefig('original_histogram.png') 24 | cv2.imwrite('original_histogram.jpg', gray) 25 | 26 | cv2.waitKey() 27 | -------------------------------------------------------------------------------- /learningopencv/writeavi.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | import cv2 4 | 5 | ENTER = 13 6 | 7 | capture = cv2.VideoCapture('Lupi.AVI') 8 | if capture is None: 9 | print("Video not found.", file=sys.stderr) 10 | sys.exit(1) 11 | 12 | fourcc = cv2.VideoWriter_fourcc(*'MJPG') 13 | output_size = (int(capture.get(cv2.CAP_PROP_FRAME_WIDTH)), 14 | int(capture.get(cv2.CAP_PROP_FRAME_HEIGHT))) 15 | fps = capture.get(cv2.CAP_PROP_FPS) 16 | output = cv2.VideoWriter('writeavi.avi', fourcc, fps, output_size, 17 | isColor=1) 18 | 19 | captured, frame = capture.read() 20 | key = 0 21 | 22 | while captured and key != ENTER: 23 | output.write(frame) 24 | cv2.imshow('video', frame) 25 | captured, frame = capture.read() 26 | key = cv2.waitKey(delay=33) 27 | 28 | capture.release() 29 | output.release() 30 | cv2.destroyAllWindows() 31 | -------------------------------------------------------------------------------- /love/love.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "math" 6 | "strings" 7 | ) 8 | 9 | var love string 10 | 11 | func main() { 12 | if love == "" { 13 | love = "Love" 14 | } 15 | lines := []string{} 16 | for y := 30.0; y > -30; y-- { 17 | arr := []string{} 18 | for x := -30.0; x <= 30; x++ { 19 | result := " " 20 | if math.Pow(math.Pow(x*0.05, 2)+math.Pow(y*0.1, 2)-1, 3)-math.Pow(x*0.05, 2)*math.Pow(y*0.1, 3) <= 0 { 21 | result = string(love[modPy(int(x-y), len(love))]) 22 | } 23 | arr = append(arr, result) 24 | } 25 | lines = append(lines, strings.Join(arr, "")) 26 | } 27 | fmt.Println(strings.Join(lines, "\n")) 28 | var exit rune 29 | fmt.Scanf("%c", &exit) 30 | } 31 | 32 | func modPy(d, m int) int { 33 | var res = d % m 34 | if (res < 0 && m > 0) || (res > 0 && m < 0) { 35 | return res + m 36 | } 37 | return res 38 | } 39 | -------------------------------------------------------------------------------- /learningopencv/cannyreduce.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | import cv2 4 | 5 | 6 | def do_pyr_down(image): 7 | height, width, *_ = image.shape 8 | assert width % 2 == 0 and height % 2 == 0 9 | return cv2.pyrDown(image) 10 | 11 | 12 | def do_canny(image, low_threshold, high_threshold, aperture): 13 | if len(image.shape) < 3: 14 | image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) 15 | return cv2.Canny(image, low_threshold, high_threshold, 16 | apertureSize=aperture) 17 | 18 | 19 | image = cv2.imread("lena.jpg") 20 | if image is None: 21 | print("Image not found.", file=sys.stderr) 22 | sys.exit(1) 23 | reduced_image = do_pyr_down(image) 24 | canny = do_canny(image, low_threshold=10, high_threshold=100, aperture=3) 25 | cv2.imshow("image", image) 26 | cv2.imshow("reduced image", reduced_image) 27 | cv2.imshow("canny", canny) 28 | cv2.waitKey() 29 | -------------------------------------------------------------------------------- /dockerize/run.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Dockerize 3 | 4 | Dockerize will run 42 containers,beign n(number of cores in machine) 5 | containers simutaneously, each one doing some task. 6 | ''' 7 | import os 8 | from multiprocessing import Pool 9 | 10 | import docker 11 | 12 | 13 | def run_container(command): 14 | # instantiate a client using default socket or enviroment variable. 15 | client = docker.from_env() 16 | # run some command using alpine:latest and then remove the container 17 | output = client.containers.run('alpine:latest', command, remove=True) 18 | # print standard output from container 19 | print(output.decode('utf-8')) 20 | 21 | 22 | # list of commands to run 23 | commands = [f'echo container {index}' for index in range(1, 43)] 24 | 25 | # do a process pool and invoke `run_container` with each command in commands 26 | # list 27 | with Pool(os.cpu_count()) as p: 28 | p.map(run_container, commands) 29 | -------------------------------------------------------------------------------- /selenium_tricks/README.md: -------------------------------------------------------------------------------- 1 | # Selenium tricks 2 | 3 | Many tricks using selenium. 4 | 5 | ## Requirements 6 | 7 | Install the following requirements to run the codes correctly 8 | 9 | * [geckodriver](https://github.com/mozilla/geckodriver/releases) 10 | 11 | * [chromedriver](https://sites.google.com/a/chromium.org/chromedriver/downloads) 12 | 13 | ```bash 14 | $ python -m venv .env 15 | $ source .env/bin/activate 16 | $ pip install -r requirements.txt 17 | ``` 18 | 19 | 20 | ## Summary 21 | 22 | |Title|Description| 23 | |:----|:----------| 24 | |[Headless Selenium](headless/)| An example of how to run headless browsers without third parties. | 25 | |[Download files in headless mode](download_files_headless/)| Download file using selenium. | 26 | 27 | 28 | ## TODO 29 | 30 | - download silent 31 | - proxy 32 | - crop image 33 | - page objects 34 | - dockerize 35 | - remote 36 | - wait open a new window 37 | - image is loaded 38 | -------------------------------------------------------------------------------- /learningopencv/videorgb2gray.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | import cv2 4 | 5 | ENTER = 13 6 | 7 | capture = cv2.VideoCapture('Lupi.AVI') 8 | if capture is None: 9 | print("Video not found.", file=sys.stderr) 10 | sys.exit(1) 11 | 12 | fourcc = cv2.VideoWriter_fourcc(*'MJPG') 13 | output_size = (int(capture.get(cv2.CAP_PROP_FRAME_WIDTH)), 14 | int(capture.get(cv2.CAP_PROP_FRAME_HEIGHT))) 15 | fps = capture.get(cv2.CAP_PROP_FPS) 16 | output = cv2.VideoWriter('videorgb2gray.avi', fourcc, fps, output_size, 17 | isColor=0) 18 | 19 | captured, frame = capture.read() 20 | key = 0 21 | 22 | while captured and key != ENTER: 23 | gray_frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY) 24 | output.write(gray_frame) 25 | cv2.imshow('video', frame) 26 | cv2.imshow('Black & white', gray_frame) 27 | captured, frame = capture.read() 28 | key = cv2.waitKey(delay=33) 29 | 30 | capture.release() 31 | output.release() 32 | cv2.destroyAllWindows() 33 | -------------------------------------------------------------------------------- /dataanalysis/requirements.txt: -------------------------------------------------------------------------------- 1 | backcall==0.1.0 2 | bleach==3.3.0 3 | cycler==0.10.0 4 | decorator==4.3.0 5 | defusedxml==0.5.0 6 | entrypoints==0.2.3 7 | ipykernel==5.1.0 8 | ipython==8.10.0 9 | ipython-genutils==0.2.0 10 | ipywidgets==7.4.2 11 | jedi==0.13.2 12 | Jinja2==3.1.6 13 | jsonschema==2.6.0 14 | jupyter==1.0.0 15 | jupyter-client==5.2.4 16 | jupyter-console==6.0.0 17 | jupyter-core==4.11.2 18 | kiwisolver==1.0.1 19 | MarkupSafe==1.1.0 20 | matplotlib==3.0.2 21 | mistune==2.0.3 22 | nbconvert==6.5.1 23 | nbformat==4.4.0 24 | notebook==6.4.12 25 | numpy==1.22.0 26 | pandas==0.23.4 27 | pandocfilters==1.4.2 28 | parso==0.5.0 29 | pexpect==4.6.0 30 | pickleshare==0.7.5 31 | prometheus-client==0.5.0 32 | prompt-toolkit==2.0.7 33 | ptyprocess==0.6.0 34 | Pygments==2.15.0 35 | pyparsing==2.3.0 36 | python-dateutil==2.7.5 37 | pytz==2018.7 38 | pyzmq==17.1.2 39 | qtconsole==4.4.3 40 | Send2Trash==1.5.0 41 | six==1.12.0 42 | terminado==0.8.1 43 | testpath==0.4.2 44 | tornado==6.5.1 45 | traitlets==4.3.2 46 | wcwidth==0.1.7 47 | webencodings==0.5.1 48 | widgetsnbextension==3.4.2 49 | -------------------------------------------------------------------------------- /paulinhaclass/requirements.txt: -------------------------------------------------------------------------------- 1 | backcall==0.1.0 2 | bleach==3.3.0 3 | cycler==0.10.0 4 | decorator==4.3.0 5 | entrypoints==0.2.3 6 | html5lib==1.0.1 7 | ipykernel==4.8.2 8 | ipython==8.10.0 9 | ipython-genutils==0.2.0 10 | ipywidgets==7.3.0 11 | jedi==0.12.1 12 | Jinja2==3.1.6 13 | jsonschema==2.6.0 14 | jupyter==1.0.0 15 | jupyter-client==5.2.3 16 | jupyter-console==5.2.0 17 | jupyter-core==4.11.2 18 | kiwisolver==1.0.1 19 | MarkupSafe==1.0 20 | matplotlib==2.2.2 21 | mistune==2.0.3 22 | nbconvert==6.5.1 23 | nbformat==4.4.0 24 | notebook==6.4.12 25 | numpy==1.22.0 26 | pandas==0.23.3 27 | pandocfilters==1.4.2 28 | parso==0.5.0 29 | pexpect==4.6.0 30 | pickleshare==0.7.4 31 | prometheus-client==0.3.0 32 | prompt-toolkit==1.0.15 33 | ptyprocess==0.6.0 34 | Pygments==2.15.0 35 | pyparsing==2.2.0 36 | python-dateutil==2.7.3 37 | pytz==2018.5 38 | pyzmq==17.1.0 39 | qtconsole==4.3.1 40 | Send2Trash==1.5.0 41 | simplegeneric==0.8.1 42 | six==1.11.0 43 | terminado==0.8.1 44 | testpath==0.3.1 45 | tornado==6.5.1 46 | traitlets==4.3.2 47 | wcwidth==0.1.7 48 | webencodings==0.5.1 49 | widgetsnbextension==3.3.0 50 | -------------------------------------------------------------------------------- /learningopencv/logpolar.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | import cv2 4 | 5 | ENTER = 13 6 | 7 | capture = cv2.VideoCapture('Lupi.AVI') 8 | if capture is None: 9 | print("Video not found.", file=sys.stderr) 10 | sys.exit(1) 11 | 12 | fourcc = cv2.VideoWriter_fourcc(*'MJPG') 13 | output_size = (int(capture.get(cv2.CAP_PROP_FRAME_WIDTH)), 14 | int(capture.get(cv2.CAP_PROP_FRAME_HEIGHT))) 15 | fps = capture.get(cv2.CAP_PROP_FPS) 16 | output = cv2.VideoWriter('logpolar.avi', fourcc, fps, output_size, 17 | isColor=1) 18 | 19 | captured, frame = capture.read() 20 | key = 0 21 | 22 | while captured and key != ENTER: 23 | width, height = output_size 24 | logpolar_frame = cv2.warpPolar( 25 | src=frame, 26 | dsize=output_size, 27 | center=(width//2, height//2), 28 | maxRadius=40, 29 | flags=cv2.INTER_LINEAR+cv2.WARP_FILL_OUTLIERS+cv2.WARP_INVERSE_MAP 30 | ) 31 | output.write(logpolar_frame) 32 | cv2.imshow('video', frame) 33 | cv2.imshow('Logpolar', logpolar_frame) 34 | captured, frame = capture.read() 35 | key = cv2.waitKey(delay=33) 36 | 37 | capture.release() 38 | output.release() 39 | cv2.destroyAllWindows() 40 | -------------------------------------------------------------------------------- /xlsx2csv/xlsx2csv.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | ''' 3 | xlsx2csv 4 | 5 | Convert xlsx to csv. 6 | 7 | usage: xlsx2csv.py [-h] [--sheet SHEET] filename 8 | 9 | positional arguments: 10 | filename name of xlsx file 11 | 12 | optional arguments: 13 | -h, --help show this help message and exit 14 | --sheet SHEET name of the sheet 15 | ''' 16 | import argparse 17 | import csv 18 | import sys 19 | 20 | import openpyxl 21 | 22 | # Define command line interface 23 | parser = argparse.ArgumentParser() 24 | parser.add_argument('filename', help='name of xlsx file') 25 | parser.add_argument('--sheet', required=False, help='name of the sheet') 26 | args = parser.parse_args() 27 | 28 | # load file, but don't convert fields 29 | workbook = openpyxl.load_workbook(filename=args.filename) 30 | # get first sheet or use name passed as parameter 31 | sheet_name, *_ = workbook.sheetnames 32 | if args.sheet: 33 | sheet_name = args.sheet 34 | 35 | # get sheet by it's name 36 | sheet = workbook[sheet_name] 37 | 38 | csv_writer = csv.writer(sys.stdout, quoting=csv.QUOTE_ALL, lineterminator='\n') 39 | # write each csv line in stdout 40 | for row in sheet.rows: 41 | csv_writer.writerow(column.value or '' for column in row) 42 | -------------------------------------------------------------------------------- /selenium_tricks/download_files_headless/firefox_example.py: -------------------------------------------------------------------------------- 1 | import os 2 | import time 3 | 4 | from selenium.webdriver import Firefox, FirefoxProfile, FirefoxOptions 5 | 6 | # set browser headless 7 | options = FirefoxOptions() 8 | options.headless = True 9 | # profile to download some mime types automatically 10 | profile = FirefoxProfile() 11 | profile.set_preference('browser.download.folderList', 2) 12 | profile.set_preference('browser.download.dir', os.getcwd()) 13 | # you can select multiple types of files by separating them with commas 14 | profile.set_preference('browser.helperApps.neverAsk.saveToDisk', 15 | 'text/plain,image/jpeg') 16 | # start firefox and connect into it 17 | driver = Firefox(options=options, firefox_profile=profile) 18 | url = 'http://localhost:5000/files' 19 | # warning: doing driver.get directly in the files downloads URL 20 | # causes a strange crash 21 | # navigate to the site 22 | driver.get(url) 23 | # get "a" element and click 24 | driver.find_element_by_css_selector('a[href $= "some_text.txt"]').click() 25 | # download image also 26 | driver.find_element_by_css_selector('a[href $= "lena.jpg"]').click() 27 | # wait downloads to finish 28 | time.sleep(3) 29 | # close firefox 30 | driver.quit() 31 | -------------------------------------------------------------------------------- /xlsx2csv/poetry.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Poetry and should not be changed by hand. 2 | 3 | [[package]] 4 | name = "et-xmlfile" 5 | version = "1.1.0" 6 | description = "An implementation of lxml.xmlfile for the standard library" 7 | category = "main" 8 | optional = false 9 | python-versions = ">=3.6" 10 | files = [ 11 | {file = "et_xmlfile-1.1.0-py3-none-any.whl", hash = "sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada"}, 12 | {file = "et_xmlfile-1.1.0.tar.gz", hash = "sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c"}, 13 | ] 14 | 15 | [[package]] 16 | name = "openpyxl" 17 | version = "3.0.10" 18 | description = "A Python library to read/write Excel 2010 xlsx/xlsm files" 19 | category = "main" 20 | optional = false 21 | python-versions = ">=3.6" 22 | files = [ 23 | {file = "openpyxl-3.0.10-py2.py3-none-any.whl", hash = "sha256:0ab6d25d01799f97a9464630abacbb34aafecdcaa0ef3cba6d6b3499867d0355"}, 24 | {file = "openpyxl-3.0.10.tar.gz", hash = "sha256:e47805627aebcf860edb4edf7987b1309c1b3632f3750538ed962bbcc3bd7449"}, 25 | ] 26 | 27 | [package.dependencies] 28 | et-xmlfile = "*" 29 | 30 | [metadata] 31 | lock-version = "2.0" 32 | python-versions = "^3.11" 33 | content-hash = "9f7b53fe6d82aab922aac531af29c18f1b5257a2a77eb035dd6cd27c6fb7eea9" 34 | -------------------------------------------------------------------------------- /copyextension/copyextension.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | ''' 3 | copytext 4 | 5 | Small script to copy all files of 'extension' from 'source' to 'destiny'. 6 | 7 | usage: copyextension.py [-h] extension source destiny 8 | 9 | positional arguments: 10 | extension files extension 11 | source directory that will be scanned 12 | destiny directory where files will be pasted 13 | 14 | optional arguments: 15 | -h, --help show this help message and exit 16 | ''' 17 | import argparse 18 | import shutil 19 | import sys 20 | from pathlib import Path 21 | 22 | # argparse is used to provide a better interface and help 23 | parser = argparse.ArgumentParser() 24 | parser.add_argument('extension', help='files extension') 25 | parser.add_argument('source', help='directory that will be scanned') 26 | parser.add_argument('destiny', help='directory where files will be pasted') 27 | args = parser.parse_args() 28 | extension, source, destiny = args.extension, Path(args.source), \ 29 | Path(args.destiny) 30 | 31 | # check if source and destiny exists 32 | if not source.is_dir() or not destiny.is_dir(): 33 | print('source or destiny doesn\'t exists.', file=sys.stderr) 34 | sys.exit(1) 35 | 36 | # iterate over source source directory looking for that extension, 37 | # then copy the file 38 | for file in source.glob(f'*.{extension}'): 39 | print(f'copying {file}...') 40 | shutil.copy2(file, destiny) 41 | 42 | print('Done!') 43 | -------------------------------------------------------------------------------- /algorithms/greedy.py: -------------------------------------------------------------------------------- 1 | '''Greedy algorithms module''' 2 | 3 | 4 | def _best_coverage(stations, states_to_cover): 5 | '''Return station and coverage states for best coverage.''' 6 | best_station = None 7 | coverage_states = {} 8 | for station, states in stations.items(): 9 | coverage = states_to_cover & states 10 | if len(coverage) > len(coverage_states): 11 | best_station = station 12 | coverage_states = coverage 13 | return best_station, coverage_states 14 | 15 | 16 | def optimize_stations(stations, states_to_cover): 17 | '''List stations to cover all states.''' 18 | final_stations = set() 19 | while states_to_cover: 20 | best_station, coverage_states = _best_coverage(stations) 21 | states_to_cover -= coverage_states 22 | final_stations.add(best_station) 23 | return final_stations 24 | 25 | 26 | def main(): 27 | '''Given states to cover and stations, pick less stations that cover 28 | all states.''' 29 | states_to_cover = {'mt', 'wa', 'or', 'id', 'nv', 'ut', 'ca', 'az'} 30 | 31 | stations = {} 32 | stations['kone'] = {'id', 'nv', 'ut'} 33 | stations['ktwo'] = {'wa', 'id', 'mt'} 34 | stations['kthree'] = {'or', 'nv', 'ca'} 35 | stations['kfour'] = {'nv', 'ut'} 36 | stations['kfive'] = {'ca', 'az'} 37 | print("Stations: ", optimize_stations(stations, states_to_cover)) 38 | 39 | 40 | if __name__ == "__main__": 41 | main() 42 | -------------------------------------------------------------------------------- /toxpipenv/README.md: -------------------------------------------------------------------------------- 1 | # pipenv + tox 2 | 3 | ## Steps to reproduce 4 | 5 | 1 - Follow [the instructions](http://pipenv.readthedocs.io/en/latest/install/#installing-pipenv) to install pipenv. 6 | 7 | 2 - start an empty project with clean setup.py, e.g. 8 | 9 | setup.py 10 | 11 | ```python 12 | #!/usr/bin/env python 13 | 14 | from distutils.core import setup 15 | 16 | setup(name='toxpipenv', 17 | version='1.0', 18 | description='Just some tests', 19 | author='Cássio Botaro', 20 | author_email='cassiobotaro@gmail.com', 21 | packages=['toxpipenv'], 22 | ) 23 | ``` 24 | 25 | 2 - add simple code and tests 26 | 27 | toxpipenv/core.py 28 | 29 | ```python 30 | def square(number): 31 | """Calculates square of a number. 32 | 33 | :number: a number 34 | :returns: square of a number 35 | 36 | """ 37 | return number ** 2 38 | ``` 39 | 40 | tests/test_core.py 41 | 42 | ```python 43 | from toxpipenv.core import square 44 | 45 | 46 | def test_square(): 47 | assert square(2) == 4 48 | ``` 49 | 50 | 3 - Install requirements 51 | 52 | tox 53 | 54 | `pipenv install tox --dev` 55 | 56 | own package 57 | 58 | `pipenv install -e . --dev` 59 | 60 | 4 - configure tox to run using pipenv and pytest 61 | 62 | ``` 63 | [tox] 64 | envlist = py27,py36 65 | 66 | [testenv] 67 | passenv = HOME 68 | deps = pipenv 69 | commands = 70 | pipenv install --dev 71 | pipenv run python -m pytest tests 72 | ``` 73 | 74 | 5 - Voilá. Tox is configured and running two different versions of python! 75 | 76 | `pipenv run tox` 77 | -------------------------------------------------------------------------------- /dataanalysis/Jupyter Notebook.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 4, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "import pandas as pd\n", 10 | "import numpy as np\n", 11 | "import matplotlib.pyplot as plt\n", 12 | "%matplotlib inline" 13 | ] 14 | }, 15 | { 16 | "cell_type": "code", 17 | "execution_count": 2, 18 | "metadata": {}, 19 | "outputs": [ 20 | { 21 | "data": { 22 | "text/plain": [ 23 | "'0.23.3'" 24 | ] 25 | }, 26 | "execution_count": 2, 27 | "metadata": {}, 28 | "output_type": "execute_result" 29 | } 30 | ], 31 | "source": [ 32 | "pd.__version__" 33 | ] 34 | }, 35 | { 36 | "cell_type": "code", 37 | "execution_count": 3, 38 | "metadata": {}, 39 | "outputs": [ 40 | { 41 | "data": { 42 | "text/plain": [ 43 | "'1.15.0'" 44 | ] 45 | }, 46 | "execution_count": 3, 47 | "metadata": {}, 48 | "output_type": "execute_result" 49 | } 50 | ], 51 | "source": [ 52 | "np.__version__" 53 | ] 54 | } 55 | ], 56 | "metadata": { 57 | "kernelspec": { 58 | "display_name": "Python 3", 59 | "language": "python", 60 | "name": "python3" 61 | }, 62 | "language_info": { 63 | "codemirror_mode": { 64 | "name": "ipython", 65 | "version": 3 66 | }, 67 | "file_extension": ".py", 68 | "mimetype": "text/x-python", 69 | "name": "python", 70 | "nbconvert_exporter": "python", 71 | "pygments_lexer": "ipython3", 72 | "version": "3.6.6" 73 | } 74 | }, 75 | "nbformat": 4, 76 | "nbformat_minor": 2 77 | } 78 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | env/ 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | 28 | # PyInstaller 29 | # Usually these files are written by a python script from a template 30 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 31 | *.manifest 32 | *.spec 33 | 34 | # Installer logs 35 | pip-log.txt 36 | pip-delete-this-directory.txt 37 | 38 | # Unit test / coverage reports 39 | htmlcov/ 40 | .tox/ 41 | .coverage 42 | .coverage.* 43 | .cache 44 | nosetests.xml 45 | coverage.xml 46 | *.cover 47 | .hypothesis/ 48 | 49 | # Translations 50 | *.mo 51 | *.pot 52 | 53 | # Django stuff: 54 | *.log 55 | local_settings.py 56 | 57 | # Flask stuff: 58 | instance/ 59 | .webassets-cache 60 | 61 | # Scrapy stuff: 62 | .scrapy 63 | 64 | # Sphinx documentation 65 | docs/_build/ 66 | 67 | # PyBuilder 68 | target/ 69 | 70 | # Jupyter Notebook 71 | .ipynb_checkpoints 72 | 73 | # pyenv 74 | .python-version 75 | 76 | # celery beat schedule file 77 | celerybeat-schedule 78 | 79 | # SageMath parsed files 80 | *.sage.py 81 | 82 | # dotenv 83 | .env 84 | 85 | # virtualenv 86 | .venv 87 | venv/ 88 | ENV/ 89 | 90 | # Spyder project settings 91 | .spyderproject 92 | .spyproject 93 | 94 | # Rope project settings 95 | .ropeproject 96 | 97 | # mkdocs documentation 98 | /site 99 | 100 | # mypy 101 | .mypy_cache/ 102 | -------------------------------------------------------------------------------- /selenium_tricks/download_files_headless/chrome_example.py: -------------------------------------------------------------------------------- 1 | import os 2 | import time 3 | 4 | from selenium.webdriver import Chrome, ChromeOptions 5 | 6 | 7 | def enable_download_in_headless_chrome(driver, download_dir): 8 | # hack founded in 9 | # https://stackoverflow.com/questions/45631715/downloading-with-chrome-headless-and-selenium 10 | # add missing support for chrome "send_command" to selenium webdriver 11 | driver.command_executor._commands["send_command"] = ( 12 | "POST", 13 | "/session/$sessionId/chromium/send_command", 14 | ) 15 | 16 | params = { 17 | "cmd": "Page.setDownloadBehavior", 18 | "params": {"behavior": "allow", "downloadPath": download_dir}, 19 | } 20 | driver.execute("send_command", params) 21 | 22 | 23 | # set browser headless 24 | options = ChromeOptions() 25 | options.headless = True 26 | # profile to download files automatically 27 | options.add_experimental_option( 28 | "prefs", 29 | { 30 | "download.default_directory": os.getcwd(), 31 | "download.prompt_for_download": False, 32 | "download.directory_upgrade": True, 33 | "safebrowsing.enabled": True, 34 | }, 35 | ) 36 | 37 | # start firefox and connect into it 38 | driver = Chrome(options=options) 39 | enable_download_in_headless_chrome(driver, os.getcwd()) 40 | url = "http://localhost:5000/files" 41 | # navigate to the site 42 | driver.get(url) 43 | # get "a" element and click 44 | driver.find_element_by_css_selector('a[href $= "some_text.txt"]').click() 45 | # download image also 46 | driver.find_element_by_css_selector('a[href $= "lena.jpg"]').click() 47 | # wait downloads to finish 48 | time.sleep(3) 49 | # close firefox 50 | driver.quit() 51 | -------------------------------------------------------------------------------- /cv/README.md: -------------------------------------------------------------------------------- 1 | # Computer Vision 2 | 3 | Fundamentals of computer vision. 4 | 5 | ## Requirements 6 | 7 | `poetry install` 8 | 9 | ## How to run 10 | 11 | `poetry run python ` 12 | 13 | ## Modules 14 | 15 | |module|description| 16 | |:----|:----------| 17 | | always\_blue.py | Module to modify an image pixels to blue | 18 | | change\_color\_component.py | Module to modify an image pixels based on it's position | 19 | | change\_green\_component.py | Module to modify an image pixels based on it's position | 20 | | change\_with\_jump.py | Module to modify an image(yellow) pixels based on it's position | 21 | | metadata.py | Module to get image metadata | 22 | | pallete.py | module to generate images based on colors | 23 | | pixel.py | Module to read one pixel | 24 | | green\_slice.py | Module to change a slice of pixels into green | 25 | | pallete\_improved.py | As pallete but smaller | 26 | | rectangles.py | Module to daw rectangles in the image | 27 | | draw.py | Module to draw rectangles in the image | 28 | | text.py | Module to write a text into an image | 29 | | crop.py | Module to crop an image | 30 | | resize.py | Module to resize an image | 31 | | resize\_slice.py | Module to resize an image using slicing | 32 | | flip.py | Module to flip an image | 33 | | rotate.py | Module to rotate an image | 34 | | mask.py | Module that apply a bitwise and mask | 35 | | color\_system.py | Module to show other color systems | 36 | | split\_channels.py | Module that split color channels | 37 | | merge\_channels.py| Module that split color channels and merge with empty channels to generate specific colored images | 38 | | histogram.py | Module that plot gray scale image histogram | 39 | | histogram\_color.py | Module that plot color image histogram | 40 | | equalize\_histogram.py | Module to equalize image histogram | 41 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Rivendell 2 | :seedling: A place of peace and beauty where knowledge and stories are preserved. 3 | 4 | ## Summary 5 | 6 | |Title|Description| 7 | |:----|:----------| 8 | |[Tox + Pipenv](toxpipenv/)| How to manage environments and run multiple python versions. | 9 | |[Order dict by values](orderdictbyvalue/)| Order dict by it's values. | 10 | |[One line christmas](onelinechristmas/)| Merry christmas with just one line. | 11 | |[Copy extension](copyextension/)| Small CLI to to copy all files of 'extension' from 'source' to 'destiny'. | 12 | |[Σ](summation/)| Sum terms from lower bound until upper bound, applying some function on each term. | 13 | |[Dockerize](dockerize/)| Run containers simutaneously and get output. | 14 | |[xlsx2csv](xlsx2csv/)| Convert xlsx to csv. | 15 | |[Multi-stage build with Python](multistagepython/)| How to optimize your python image using multi-stage build. | 16 | |[Paulinha's class](paulinhaclass/)| Deep learning fundamentals by [@paulinhacnn](http://github.com/paulinhacnn). | 17 | |[algorithms](algorithms/)| Many algorithms from book "Entendendo Algoritmos". | 18 | |[Async with return](asyncreturn/)| Async functions that return values and how to retrieve these values. | 19 | |[Data Analysis with pandas](dataanalysis/)| Notebooks about data analysis with python. | 20 | |[Computer vision 101](cv/)| Algorithms to learning computer vision. | 21 | |[Learning opencv](learningopencv/)| Opencv library studies(python version). | 22 | |[Love](love/)| Draw a heart using a name. | 23 | |[Selenium Tricks](selenium_tricks/)| Many tricks using selenium. | 24 | |[Lights Out](lights_out/)| Game to practice OOP. | 25 | |[Steganography](hiding_message_in_an_image/)| Hiding message in an image | 26 | |[FastAPI Playground](fastapi-playground/)| Some experiments with FastAPI | 27 | |[Snake game](snake_game/)| Snake game using Pygame | 28 | -------------------------------------------------------------------------------- /algorithms/dijkstra.py: -------------------------------------------------------------------------------- 1 | ''' Dijkstra's algorithm module''' 2 | 3 | # the graph 4 | graph = {} 5 | graph["start"] = {} 6 | graph["start"]["a"] = 6 7 | graph["start"]["b"] = 2 8 | 9 | graph["a"] = {} 10 | graph["a"]["end"] = 1 11 | 12 | graph["b"] = {} 13 | graph["b"]["a"] = 3 14 | graph["b"]["end"] = 5 15 | 16 | graph["end"] = {} 17 | 18 | # the costs table 19 | inendity = float("inf") 20 | costs = {} 21 | costs["a"] = 6 22 | costs["b"] = 2 23 | costs["end"] = inendity 24 | 25 | # the parents table 26 | parents = {} 27 | parents["a"] = "start" 28 | parents["b"] = "start" 29 | parents["end"] = None 30 | 31 | processed = [] 32 | 33 | 34 | def find_lowest_cost_node(costs): 35 | '''Find the lowest cost node.''' 36 | lowest_cost = float("inf") 37 | lowest_cost_node = None 38 | for node in costs: 39 | cost = costs[node] 40 | if cost < lowest_cost and node not in processed: 41 | lowest_cost = cost 42 | lowest_cost_node = node 43 | return lowest_cost_node 44 | 45 | 46 | def search(graph, costs, parents): 47 | '''Find the lowest-cost in a pounded graph.''' 48 | node = find_lowest_cost_node(costs) 49 | while node: 50 | cost = costs[node] 51 | neighbors = graph[node] 52 | for n in neighbors.keys(): 53 | new_cost = cost + neighbors[n] 54 | if costs[n] > new_cost: 55 | costs[n] = new_cost 56 | parents[n] = node 57 | processed.append(node) 58 | node = find_lowest_cost_node(costs) 59 | 60 | 61 | def path(parents): 62 | '''Draw path from start to end''' 63 | parent = parents["end"] 64 | path = ["end"] 65 | while parent: 66 | path.insert(0, parent) 67 | parent = parents.get(parent) 68 | return path 69 | 70 | 71 | def main(): 72 | '''Search shortest path from start to end.''' 73 | search(graph, costs, parents) 74 | print("Path: ", " -> ".join(path(parents))) 75 | 76 | 77 | if __name__ == "__main__": 78 | main() 79 | -------------------------------------------------------------------------------- /algorithms/bfs.py: -------------------------------------------------------------------------------- 1 | '''Breadth-First Search module. ''' 2 | from collections import deque 3 | 4 | GRAPH = {} 5 | GRAPH["you"] = ["alice", "bob", "claire"] 6 | GRAPH["bob"] = ["anuj", "peggy"] 7 | GRAPH["alice"] = ["peggy"] 8 | GRAPH["claire"] = ["thom", "jonny"] 9 | GRAPH["anuj"] = [] 10 | GRAPH["peggy"] = [] 11 | GRAPH["thom"] = [] 12 | GRAPH["jonny"] = [] 13 | 14 | 15 | def _sells_mango(person): 16 | return person.endswith("m") 17 | 18 | 19 | def search(name): 20 | '''Search people who sells mango''' 21 | search_queue = deque() 22 | search_queue += GRAPH[name] 23 | verified = [] 24 | while search_queue: 25 | person = search_queue.popleft() 26 | if person not in verified: 27 | if _sells_mango(person): 28 | print(f"{person} sells mango!") 29 | return True 30 | search_queue += GRAPH[person] 31 | verified.append(person) 32 | return False 33 | 34 | 35 | def search_path_bookstyle(name): 36 | '''Returns path to people who sells mango, empty if not found.''' 37 | search_queue = deque([(name, [name]), ]) 38 | verified = [] 39 | while search_queue: 40 | person, path = search_queue.popleft() 41 | if person not in verified: 42 | if _sells_mango(person): 43 | return path 44 | search_queue += ((next_, path + [next_]) 45 | for next_ in GRAPH[person]) 46 | verified.append(person) 47 | return [] 48 | 49 | 50 | def search_path(name): 51 | '''Returns path to people who sells mango, empty if not found.''' 52 | search_queue = deque([(name, [name]), ]) 53 | while search_queue: 54 | person, path = search_queue.popleft() 55 | for next_ in set(GRAPH[person]) - set(path): 56 | if _sells_mango(next_): 57 | return path + [next_] 58 | search_queue.append((next_, path + [next_])) 59 | return [] 60 | 61 | 62 | def main(): 63 | '''Search people who sells mango starting from you.''' 64 | search("you") 65 | print(search_path_bookstyle("you")) 66 | print(search_path("you")) 67 | 68 | 69 | if __name__ == "__main__": 70 | main() 71 | -------------------------------------------------------------------------------- /lights_out/lights_out.py: -------------------------------------------------------------------------------- 1 | from functools import partial 2 | import tkinter 3 | 4 | 5 | class Cell(tkinter.Button): 6 | 7 | ON_COLOR = 'yellow' 8 | OFF_COLOR = 'blue' 9 | 10 | def __init__(self): 11 | super().__init__() 12 | self.__state = "on" 13 | self.turn_on() 14 | self.configure(command=self.toggle_state) 15 | 16 | def turn_on(self): 17 | self.__state = "on" 18 | self.configure(bg=Cell.ON_COLOR) 19 | self.configure(activebackground=Cell.ON_COLOR) 20 | self.configure(relief=tkinter.RAISED) 21 | 22 | def turn_off(self): 23 | self.__state = "off" 24 | self.configure(bg=Cell.OFF_COLOR) 25 | self.configure(activebackground=Cell.OFF_COLOR) 26 | self.configure(relief=tkinter.SUNKEN) 27 | 28 | def toggle_state(self): 29 | if self.__state == "off": 30 | self.turn_on() 31 | else: 32 | self.turn_off() 33 | 34 | def set_command(self, block): 35 | def composition(): 36 | self.toggle_state() 37 | block() 38 | self.configure(command=composition) 39 | 40 | 41 | class Game(tkinter.Frame): 42 | def __init__(self, master=None, cnf={}, **kw): 43 | super().__init__(master=None, cnf={}, **kw) 44 | self.cells = [] 45 | for x in range(self.cells_per_side): 46 | line = [] 47 | for y in range(self.cells_per_side): 48 | line.append(self.new_cell_at(x, y)) 49 | self.cells.append(line) 50 | 51 | def new_cell_at(self, x, y): 52 | c = Cell() 53 | c.grid(row=x, column=y) 54 | c.set_command(partial(self.toggle_neighbours_of_cell_at, x, y)) 55 | return c 56 | 57 | def toggle_neighbours_of_cell_at(self, i, j): 58 | if i >= 1: 59 | self.cells[i - 1][j].toggle_state() 60 | if i < self.cells_per_side - 1: 61 | self.cells[i + 1][j].toggle_state() 62 | if j >= 1: 63 | self.cells[i][j - 1].toggle_state() 64 | if j < self.cells_per_side - 1: 65 | self.cells[i][j + 1].toggle_state() 66 | 67 | @property 68 | def cells_per_side(self): 69 | return 3 70 | 71 | 72 | if __name__ == "__main__": 73 | game = Game() 74 | game.mainloop() 75 | -------------------------------------------------------------------------------- /multistagepython/README.md: -------------------------------------------------------------------------------- 1 | # Multi-stage builds with Python 2 | 3 | How to optimize your python image using multi-stage build. 4 | 5 | ## How to run 6 | 7 | ### Step 1 8 | 9 | Build the fist image, that uses python:3(debian) as base. 10 | 11 | `docker build -t step1 -f Dockerfile.step1 .` 12 | 13 | This generate a fat image, around 1 GB. 14 | 15 | To check if it's running, type: 16 | 17 | `docker run --rm step1` 18 | 19 | 20 | ### Step 2 21 | 22 | Second image we change the base image, from debian to alpine. 23 | 24 | Be careful when you do that because some apps have system dependencies. 25 | 26 | `docker build -t step2 -f Dockerfile.step2 .` 27 | 28 | Image reduce your size by half. 29 | 30 | To check if it's running, type: 31 | 32 | `docker run --rm step2` 33 | 34 | ### Step 3 35 | 36 | Last step is to separate build and run process. We can use a machine with required compiler stuffs, to generate `.whl` and after copy it's files to another clean machine. 37 | 38 | Again, be careful when you do that because some apps have system dependencies. 39 | 40 | `docker build -t step3 -f Dockerfile.step3 .` 41 | 42 | Image size reduce once more. 43 | 44 | To check if it's running, type: 45 | 46 | `docker run --rm step3` 47 | 48 | ### Step 4 49 | 50 | Let's create a minimal dockerfile using `python:3-slim` as base. 51 | Alpine don't have whells and it is a problem, then we will use slim images to reduce image size. 52 | 53 | 54 | `docker build -t step4 -f Dockerfile.step4 .` 55 | 56 | To check if it's running, type: 57 | 58 | `docker run --rm step4` 59 | 60 | ### Step 5 61 | 62 | Exactly like step4 but we use multi stage building to cache our dependencies and improve build speed. 63 | 64 | `docker build -t step5 -f Dockerfile.step5 .` 65 | 66 | To check if it's running, type: 67 | 68 | `docker run --rm step5` 69 | 70 | 71 | ### Conclusion 72 | 73 | Multi stage build can help when you have to compile some dependencies, but as python have [wheels](https://pythonwheels.com/), maybe it's not the best choice for the language. 74 | 75 | Alpine is a tiny image, but don't support wheels and also have problems with system dependencies. Build takes a lot of time. 76 | 77 | ```bash 78 | docker images --filter=reference='step*' --format='{{.Repository}}:{{.Tag}} - {{.Size}}' | sort 79 | step1:latest - 1.04GB 80 | step2:latest - 333MB 81 | step3:latest - 192MB 82 | step4:latest - 247MB 83 | step5:latest - 259MB 84 | ``` 85 | 86 | Surprisingly, multi-stage build (step 5) is greater than minimum build with `python:3-slim` as base (step 4). -------------------------------------------------------------------------------- /selenium_tricks/download_files_headless/README.md: -------------------------------------------------------------------------------- 1 | # Download file using selenium 2 | 3 | ## Problem 4 | 5 | Crawl a website and download some content using browser headless. 6 | 7 | 8 | ## Discuss 9 | 10 | In firefox, we have to create a user profile and configure the directory where the files 11 | will be stored. We should also tell firefox to download certain types of files without asking the user. 12 | 13 | ```python 14 | # profile to download some mime types automatically 15 | profile = FirefoxProfile() 16 | profile.set_preference('browser.download.folderList', 2) 17 | profile.set_preference('browser.download.dir', os.getcwd()) 18 | # you can select multiple types of files by separating them with commas 19 | profile.set_preference('browser.helperApps.neverAsk.saveToDisk', 20 | 'text/plain,image/jpeg') 21 | # start firefox and connect into it 22 | driver = Firefox(options=options, firefox_profile=profile) 23 | ``` 24 | 25 | In chrome, we also set the directory where the files will be stored and don't prompt for download. 26 | 27 | ```python 28 | # set browser headless 29 | options = ChromeOptions() 30 | options.headless = True 31 | # profile to download files automatically 32 | options.add_experimental_option( 33 | "prefs", 34 | { 35 | "download.default_directory": os.getcwd(), 36 | "download.prompt_for_download": False, 37 | "download.directory_upgrade": True, 38 | "safebrowsing.enabled": True, 39 | }, 40 | ) 41 | ``` 42 | 43 | Unfornately we have to hack to make it work on headless mode. 44 | 45 | ```python 46 | def enable_download_in_headless_chrome(driver, download_dir): 47 | # hack founded in 48 | # https://stackoverflow.com/questions/45631715/downloading-with-chrome-headless-and-selenium 49 | # add missing support for chrome "send_command" to selenium webdriver 50 | driver.command_executor._commands["send_command"] = ( 51 | "POST", 52 | "/session/$sessionId/chromium/send_command", 53 | ) 54 | 55 | params = { 56 | "cmd": "Page.setDownloadBehavior", 57 | "params": {"behavior": "allow", "downloadPath": download_dir}, 58 | } 59 | driver.execute("send_command", params) 60 | ``` 61 | 62 | Another thing is that only works on newer versions of google chrome. 63 | 64 | ## How to run 65 | 66 | Start the test server: 67 | 68 | ```bash 69 | cd test_api 70 | flask run & 71 | ``` 72 | 73 | return to this repository and then: 74 | 75 | `python firefox_example.py` 76 | 77 | or 78 | 79 | `python chrome_example.py` 80 | -------------------------------------------------------------------------------- /learningopencv/poetry.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. 2 | 3 | [[package]] 4 | name = "numpy" 5 | version = "1.24.0" 6 | description = "Fundamental package for array computing in Python" 7 | optional = false 8 | python-versions = ">=3.8" 9 | files = [ 10 | {file = "numpy-1.24.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6e73a1f4f5b74a42abb55bc2b3d869f1b38cbc8776da5f8b66bf110284f7a437"}, 11 | {file = "numpy-1.24.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9387c7d6d50e8f8c31e7bfc034241e9c6f4b3eb5db8d118d6487047b922f82af"}, 12 | {file = "numpy-1.24.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ad6a024a32ee61d18f5b402cd02e9c0e22c0fb9dc23751991b3a16d209d972e"}, 13 | {file = "numpy-1.24.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73cf2c5b5a07450f20a0c8e04d9955491970177dce8df8d6903bf253e53268e0"}, 14 | {file = "numpy-1.24.0-cp310-cp310-win32.whl", hash = "sha256:cec79ff3984b2d1d103183fc4a3361f5b55bbb66cb395cbf5a920a4bb1fd588d"}, 15 | {file = "numpy-1.24.0-cp310-cp310-win_amd64.whl", hash = "sha256:4f5e78b8b710cd7cd1a8145994cfffc6ddd5911669a437777d8cedfce6c83a98"}, 16 | {file = "numpy-1.24.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4445f472b246cad6514cc09fbb5ecb7aab09ca2acc3c16f29f8dca6c468af501"}, 17 | {file = "numpy-1.24.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ec3e5e8172a0a6a4f3c2e7423d4a8434c41349141b04744b11a90e017a95bad5"}, 18 | {file = "numpy-1.24.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9168790149f917ad8e3cf5047b353fefef753bd50b07c547da0bdf30bc15d91"}, 19 | {file = "numpy-1.24.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ada6c1e9608ceadaf7020e1deea508b73ace85560a16f51bef26aecb93626a72"}, 20 | {file = "numpy-1.24.0-cp311-cp311-win32.whl", hash = "sha256:f3c4a9a9f92734a4728ddbd331e0124eabbc968a0359a506e8e74a9b0d2d419b"}, 21 | {file = "numpy-1.24.0-cp311-cp311-win_amd64.whl", hash = "sha256:90075ef2c6ac6397d0035bcd8b298b26e481a7035f7a3f382c047eb9c3414db0"}, 22 | {file = "numpy-1.24.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0885d9a7666cafe5f9876c57bfee34226e2b2847bfb94c9505e18d81011e5401"}, 23 | {file = "numpy-1.24.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e63d2157f9fc98cc178870db83b0e0c85acdadd598b134b00ebec9e0db57a01f"}, 24 | {file = "numpy-1.24.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf8960f72997e56781eb1c2ea256a70124f92a543b384f89e5fb3503a308b1d3"}, 25 | {file = "numpy-1.24.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f8e0df2ecc1928ef7256f18e309c9d6229b08b5be859163f5caa59c93d53646"}, 26 | {file = "numpy-1.24.0-cp38-cp38-win32.whl", hash = "sha256:fe44e925c68fb5e8db1334bf30ac1a1b6b963b932a19cf41d2e899cf02f36aab"}, 27 | {file = "numpy-1.24.0-cp38-cp38-win_amd64.whl", hash = "sha256:d7f223554aba7280e6057727333ed357b71b7da7422d02ff5e91b857888c25d1"}, 28 | {file = "numpy-1.24.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ab11f6a7602cf8ea4c093e091938207de3068c5693a0520168ecf4395750f7ea"}, 29 | {file = "numpy-1.24.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:12bba5561d8118981f2f1ff069ecae200c05d7b6c78a5cdac0911f74bc71cbd1"}, 30 | {file = "numpy-1.24.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9af91f794d2d3007d91d749ebc955302889261db514eb24caef30e03e8ec1e41"}, 31 | {file = "numpy-1.24.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b1ddfac6a82d4f3c8e99436c90b9c2c68c0bb14658d1684cdd00f05fab241f5"}, 32 | {file = "numpy-1.24.0-cp39-cp39-win32.whl", hash = "sha256:ac4fe68f1a5a18136acebd4eff91aab8bed00d1ef2fdb34b5d9192297ffbbdfc"}, 33 | {file = "numpy-1.24.0-cp39-cp39-win_amd64.whl", hash = "sha256:667b5b1f6a352419e340f6475ef9930348ae5cb7fca15f2cc3afcb530823715e"}, 34 | {file = "numpy-1.24.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4d01f7832fa319a36fd75ba10ea4027c9338ede875792f7bf617f4b45056fc3a"}, 35 | {file = "numpy-1.24.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbb0490f0a880700a6cc4d000384baf19c1f4df59fff158d9482d4dbbca2b239"}, 36 | {file = "numpy-1.24.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:0104d8adaa3a4cc60c2777cab5196593bf8a7f416eda133be1f3803dd0838886"}, 37 | {file = "numpy-1.24.0.tar.gz", hash = "sha256:c4ab7c9711fe6b235e86487ca74c1b092a6dd59a3cb45b63241ea0a148501853"}, 38 | ] 39 | 40 | [[package]] 41 | name = "opencv-python" 42 | version = "4.8.1.78" 43 | description = "Wrapper package for OpenCV python bindings." 44 | optional = false 45 | python-versions = ">=3.6" 46 | files = [ 47 | {file = "opencv-python-4.8.1.78.tar.gz", hash = "sha256:cc7adbbcd1112877a39274106cb2752e04984bc01a031162952e97450d6117f6"}, 48 | {file = "opencv_python-4.8.1.78-cp37-abi3-macosx_10_16_x86_64.whl", hash = "sha256:91d5f6f5209dc2635d496f6b8ca6573ecdad051a09e6b5de4c399b8e673c60da"}, 49 | {file = "opencv_python-4.8.1.78-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:bc31f47e05447da8b3089faa0a07ffe80e114c91ce0b171e6424f9badbd1c5cd"}, 50 | {file = "opencv_python-4.8.1.78-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9814beca408d3a0eca1bae7e3e5be68b07c17ecceb392b94170881216e09b319"}, 51 | {file = "opencv_python-4.8.1.78-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4c406bdb41eb21ea51b4e90dfbc989c002786c3f601c236a99c59a54670a394"}, 52 | {file = "opencv_python-4.8.1.78-cp37-abi3-win32.whl", hash = "sha256:a7aac3900fbacf55b551e7b53626c3dad4c71ce85643645c43e91fcb19045e47"}, 53 | {file = "opencv_python-4.8.1.78-cp37-abi3-win_amd64.whl", hash = "sha256:b983197f97cfa6fcb74e1da1802c7497a6f94ed561aba6980f1f33123f904956"}, 54 | ] 55 | 56 | [package.dependencies] 57 | numpy = {version = ">=1.23.5", markers = "python_version >= \"3.11\""} 58 | 59 | [metadata] 60 | lock-version = "2.0" 61 | python-versions = "^3.11" 62 | content-hash = "b35eabdb59383e1a21bcdbf70479c1777dc5b683ec7525e61de6fecb6102e486" 63 | -------------------------------------------------------------------------------- /snake_game/jogo.py: -------------------------------------------------------------------------------- 1 | import pygame 2 | import sys 3 | from random import randint 4 | 5 | pygame.init() 6 | 7 | largura = 640 8 | altura = 480 9 | centro_da_tela = largura // 2, altura // 2 10 | 11 | x_cobra, y_cobra = centro_da_tela 12 | 13 | x_maçã = randint(40, 600) 14 | y_maçã = randint(50, 430) 15 | 16 | velocidade = 10 17 | x_controle = velocidade 18 | y_controle = 0 19 | 20 | 21 | branco = (255, 255, 255) 22 | verde = (0, 255, 0) 23 | vermelho = (255, 0, 0) 24 | preto = (0, 0, 0) 25 | 26 | pontos = 0 27 | fonte = pygame.font.SysFont("arial", 20, bold=True, italic=True) 28 | 29 | comprimento_maximo_cobra = 5 30 | está_morto = False 31 | já_pausou = False 32 | 33 | pygame.mixer.music.set_volume(0.2) 34 | pygame.mixer.music.load("backgroundmusic.ogg") 35 | pygame.mixer.music.play(-1) 36 | 37 | barulho_colisão = pygame.mixer.Sound("smw_coin.wav") 38 | 39 | lista_cobra = [] 40 | 41 | 42 | 43 | tela = pygame.display.set_mode((largura, altura)) 44 | pygame.display.set_caption("Jogo") 45 | relogio = pygame.time.Clock() 46 | 47 | def aumenta_cobra(lista_cobra): 48 | for x, y in lista_cobra: 49 | pygame.draw.rect(tela, verde, (x, y, 20, 20)) 50 | 51 | def reiniciar_jogo(): 52 | global pontos, comprimento_maximo_cobra, x_cobra, y_cobra, lista_cobra, lista_cabeça, x_maçã, y_maçã, está_morto 53 | pontos = 0 54 | comprimento_maximo_cobra = 5 55 | x_cobra, y_cobra = centro_da_tela 56 | lista_cobra = [] 57 | lista_cabeça = [] 58 | x_maçã = randint(40, 600) 59 | y_maçã = randint(50, 430) 60 | está_morto = False 61 | 62 | while True: 63 | relogio.tick(20) 64 | tela.fill(branco) 65 | mensagem = f'Pontos: {pontos}' 66 | texto_formatado = fonte.render(mensagem, True, preto) 67 | for evento in pygame.event.get(): 68 | if evento.type == pygame.QUIT: 69 | pygame.quit() 70 | sys.exit() 71 | 72 | if evento.type == pygame.KEYDOWN: 73 | if evento.key == pygame.K_UP and y_controle != velocidade: 74 | y_controle = -velocidade 75 | x_controle = 0 76 | if evento.key == pygame.K_DOWN and y_controle != -velocidade: 77 | y_controle = velocidade 78 | x_controle = 0 79 | if evento.key == pygame.K_LEFT and x_controle != velocidade: 80 | x_controle = -velocidade 81 | y_controle = 0 82 | if evento.key == pygame.K_RIGHT and x_controle != -velocidade: 83 | x_controle = velocidade 84 | y_controle = 0 85 | 86 | x_cobra += x_controle 87 | y_cobra += y_controle 88 | 89 | cobra = pygame.draw.rect(tela, verde, (x_cobra, y_cobra, 20, 20)) 90 | maçã = pygame.draw.rect(tela, vermelho, (x_maçã, y_maçã, 20, 20)) 91 | 92 | if cobra.colliderect(maçã): 93 | x_maçã = randint(40, 600) 94 | y_maçã = randint(50, 430) 95 | pontos += 1 96 | barulho_colisão.play() 97 | comprimento_maximo_cobra += 1 98 | 99 | lista_cabeça = [] 100 | lista_cabeça.append(x_cobra) 101 | lista_cabeça.append(y_cobra) 102 | 103 | 104 | lista_cobra.append(lista_cabeça) 105 | 106 | if lista_cabeça in lista_cobra[:-1]: 107 | fonte2 = pygame.font.SysFont("arial", 20, bold=True, italic=True) 108 | mensagem = "Fim do Jogo! Pressione a tecla R para jogar novamente" 109 | texto_formatado = fonte2.render(mensagem, True, preto) 110 | retângulo_texto = texto_formatado.get_rect() 111 | 112 | está_morto = True 113 | while está_morto: 114 | tela.fill(branco) 115 | for evento in pygame.event.get(): 116 | if evento.type == pygame.QUIT: 117 | pygame.quit() 118 | sys.exit() 119 | if evento.type == pygame.KEYDOWN: 120 | if evento.key == pygame.K_r: 121 | reiniciar_jogo() 122 | retângulo_texto.center = centro_da_tela 123 | tela.blit(texto_formatado, retângulo_texto) 124 | pygame.display.update() 125 | 126 | if pontos == 5 and not já_pausou: 127 | fonte2 = pygame.font.SysFont("arial", 20, bold=True, italic=True) 128 | mensagem = "Você está indo bem!" 129 | instrução = "Aperte R para continuar passando o tempo" 130 | texto_formatado = fonte2.render(mensagem, True, vermelho) 131 | texto_formatado2 = fonte2.render(instrução, True, preto) 132 | retângulo_mensagem = texto_formatado.get_rect() 133 | retângulo_instrução = texto_formatado2.get_rect() 134 | 135 | está_morto = True 136 | while está_morto: 137 | tela.fill(branco) 138 | for evento in pygame.event.get(): 139 | if evento.type == pygame.QUIT: 140 | pygame.quit() 141 | sys.exit() 142 | if evento.type == pygame.KEYDOWN: 143 | if evento.key == pygame.K_r: 144 | reiniciar_jogo() 145 | retângulo_mensagem.center = (largura // 2, altura // 2) 146 | retângulo_instrução.center = (largura // 2, altura // 2 + retângulo_mensagem.height + 10) 147 | tela.blit(texto_formatado, retângulo_texto) 148 | tela.blit(texto_formatado2, retângulo_instrução) 149 | pygame.display.update() 150 | já_pausou = True 151 | 152 | if x_cobra > largura: 153 | x_cobra = 0 154 | elif x_cobra < 0: 155 | x_cobra = largura 156 | elif y_cobra < 0: 157 | y_cobra = altura 158 | elif y_cobra > altura: 159 | y_cobra = 0 160 | 161 | if len(lista_cobra) > comprimento_maximo_cobra: 162 | lista_cobra.pop(0) 163 | 164 | aumenta_cobra(lista_cobra) 165 | 166 | retângulo_texto = texto_formatado.get_rect() 167 | retângulo_texto.center = (largura // 2, retângulo_texto.height) 168 | tela.blit(texto_formatado, retângulo_texto) 169 | pygame.display.update() 170 | -------------------------------------------------------------------------------- /dockerize/poetry.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand. 2 | 3 | [[package]] 4 | name = "certifi" 5 | version = "2024.7.4" 6 | description = "Python package for providing Mozilla's CA Bundle." 7 | optional = false 8 | python-versions = ">=3.6" 9 | groups = ["main"] 10 | files = [ 11 | {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, 12 | {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, 13 | ] 14 | 15 | [[package]] 16 | name = "charset-normalizer" 17 | version = "2.1.1" 18 | description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." 19 | optional = false 20 | python-versions = ">=3.6.0" 21 | groups = ["main"] 22 | files = [ 23 | {file = "charset-normalizer-2.1.1.tar.gz", hash = "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845"}, 24 | {file = "charset_normalizer-2.1.1-py3-none-any.whl", hash = "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"}, 25 | ] 26 | 27 | [package.extras] 28 | unicode-backport = ["unicodedata2"] 29 | 30 | [[package]] 31 | name = "docker" 32 | version = "6.0.1" 33 | description = "A Python library for the Docker Engine API." 34 | optional = false 35 | python-versions = ">=3.7" 36 | groups = ["main"] 37 | files = [ 38 | {file = "docker-6.0.1-py3-none-any.whl", hash = "sha256:dbcb3bd2fa80dca0788ed908218bf43972772009b881ed1e20dfc29a65e49782"}, 39 | {file = "docker-6.0.1.tar.gz", hash = "sha256:896c4282e5c7af5c45e8b683b0b0c33932974fe6e50fc6906a0a83616ab3da97"}, 40 | ] 41 | 42 | [package.dependencies] 43 | packaging = ">=14.0" 44 | pywin32 = {version = ">=304", markers = "sys_platform == \"win32\""} 45 | requests = ">=2.26.0" 46 | urllib3 = ">=1.26.0" 47 | websocket-client = ">=0.32.0" 48 | 49 | [package.extras] 50 | ssh = ["paramiko (>=2.4.3)"] 51 | 52 | [[package]] 53 | name = "idna" 54 | version = "3.7" 55 | description = "Internationalized Domain Names in Applications (IDNA)" 56 | optional = false 57 | python-versions = ">=3.5" 58 | groups = ["main"] 59 | files = [ 60 | {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, 61 | {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, 62 | ] 63 | 64 | [[package]] 65 | name = "packaging" 66 | version = "22.0" 67 | description = "Core utilities for Python packages" 68 | optional = false 69 | python-versions = ">=3.7" 70 | groups = ["main"] 71 | files = [ 72 | {file = "packaging-22.0-py3-none-any.whl", hash = "sha256:957e2148ba0e1a3b282772e791ef1d8083648bc131c8ab0c1feba110ce1146c3"}, 73 | {file = "packaging-22.0.tar.gz", hash = "sha256:2198ec20bd4c017b8f9717e00f0c8714076fc2fd93816750ab48e2c41de2cfd3"}, 74 | ] 75 | 76 | [[package]] 77 | name = "pywin32" 78 | version = "305" 79 | description = "Python for Window Extensions" 80 | optional = false 81 | python-versions = "*" 82 | groups = ["main"] 83 | markers = "sys_platform == \"win32\"" 84 | files = [ 85 | {file = "pywin32-305-cp310-cp310-win32.whl", hash = "sha256:421f6cd86e84bbb696d54563c48014b12a23ef95a14e0bdba526be756d89f116"}, 86 | {file = "pywin32-305-cp310-cp310-win_amd64.whl", hash = "sha256:73e819c6bed89f44ff1d690498c0a811948f73777e5f97c494c152b850fad478"}, 87 | {file = "pywin32-305-cp310-cp310-win_arm64.whl", hash = "sha256:742eb905ce2187133a29365b428e6c3b9001d79accdc30aa8969afba1d8470f4"}, 88 | {file = "pywin32-305-cp311-cp311-win32.whl", hash = "sha256:19ca459cd2e66c0e2cc9a09d589f71d827f26d47fe4a9d09175f6aa0256b51c2"}, 89 | {file = "pywin32-305-cp311-cp311-win_amd64.whl", hash = "sha256:326f42ab4cfff56e77e3e595aeaf6c216712bbdd91e464d167c6434b28d65990"}, 90 | {file = "pywin32-305-cp311-cp311-win_arm64.whl", hash = "sha256:4ecd404b2c6eceaca52f8b2e3e91b2187850a1ad3f8b746d0796a98b4cea04db"}, 91 | {file = "pywin32-305-cp36-cp36m-win32.whl", hash = "sha256:48d8b1659284f3c17b68587af047d110d8c44837736b8932c034091683e05863"}, 92 | {file = "pywin32-305-cp36-cp36m-win_amd64.whl", hash = "sha256:13362cc5aa93c2beaf489c9c9017c793722aeb56d3e5166dadd5ef82da021fe1"}, 93 | {file = "pywin32-305-cp37-cp37m-win32.whl", hash = "sha256:a55db448124d1c1484df22fa8bbcbc45c64da5e6eae74ab095b9ea62e6d00496"}, 94 | {file = "pywin32-305-cp37-cp37m-win_amd64.whl", hash = "sha256:109f98980bfb27e78f4df8a51a8198e10b0f347257d1e265bb1a32993d0c973d"}, 95 | {file = "pywin32-305-cp38-cp38-win32.whl", hash = "sha256:9dd98384da775afa009bc04863426cb30596fd78c6f8e4e2e5bbf4edf8029504"}, 96 | {file = "pywin32-305-cp38-cp38-win_amd64.whl", hash = "sha256:56d7a9c6e1a6835f521788f53b5af7912090674bb84ef5611663ee1595860fc7"}, 97 | {file = "pywin32-305-cp39-cp39-win32.whl", hash = "sha256:9d968c677ac4d5cbdaa62fd3014ab241718e619d8e36ef8e11fb930515a1e918"}, 98 | {file = "pywin32-305-cp39-cp39-win_amd64.whl", hash = "sha256:50768c6b7c3f0b38b7fb14dd4104da93ebced5f1a50dc0e834594bff6fbe1271"}, 99 | ] 100 | 101 | [[package]] 102 | name = "requests" 103 | version = "2.32.4" 104 | description = "Python HTTP for Humans." 105 | optional = false 106 | python-versions = ">=3.8" 107 | groups = ["main"] 108 | files = [ 109 | {file = "requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c"}, 110 | {file = "requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422"}, 111 | ] 112 | 113 | [package.dependencies] 114 | certifi = ">=2017.4.17" 115 | charset_normalizer = ">=2,<4" 116 | idna = ">=2.5,<4" 117 | urllib3 = ">=1.21.1,<3" 118 | 119 | [package.extras] 120 | socks = ["PySocks (>=1.5.6,!=1.5.7)"] 121 | use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] 122 | 123 | [[package]] 124 | name = "urllib3" 125 | version = "2.6.0" 126 | description = "HTTP library with thread-safe connection pooling, file post, and more." 127 | optional = false 128 | python-versions = ">=3.9" 129 | groups = ["main"] 130 | files = [ 131 | {file = "urllib3-2.6.0-py3-none-any.whl", hash = "sha256:c90f7a39f716c572c4e3e58509581ebd83f9b59cced005b7db7ad2d22b0db99f"}, 132 | {file = "urllib3-2.6.0.tar.gz", hash = "sha256:cb9bcef5a4b345d5da5d145dc3e30834f58e8018828cbc724d30b4cb7d4d49f1"}, 133 | ] 134 | 135 | [package.extras] 136 | brotli = ["brotli (>=1.2.0) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=1.2.0.0) ; platform_python_implementation != \"CPython\""] 137 | h2 = ["h2 (>=4,<5)"] 138 | socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] 139 | zstd = ["backports-zstd (>=1.0.0) ; python_version < \"3.14\""] 140 | 141 | [[package]] 142 | name = "websocket-client" 143 | version = "1.4.2" 144 | description = "WebSocket client for Python with low level API options" 145 | optional = false 146 | python-versions = ">=3.7" 147 | groups = ["main"] 148 | files = [ 149 | {file = "websocket-client-1.4.2.tar.gz", hash = "sha256:d6e8f90ca8e2dd4e8027c4561adeb9456b54044312dba655e7cae652ceb9ae59"}, 150 | {file = "websocket_client-1.4.2-py3-none-any.whl", hash = "sha256:d6b06432f184438d99ac1f456eaf22fe1ade524c3dd16e661142dc54e9cba574"}, 151 | ] 152 | 153 | [package.extras] 154 | docs = ["Sphinx (>=3.4)", "sphinx-rtd-theme (>=0.5)"] 155 | optional = ["python-socks", "wsaccel"] 156 | test = ["websockets"] 157 | 158 | [metadata] 159 | lock-version = "2.1" 160 | python-versions = "^3.11" 161 | content-hash = "4afa20611398816362bacaaa3125d8e8c9193b164034d0989ca39e7469b33067" 162 | -------------------------------------------------------------------------------- /toxpipenv/poetry.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Poetry 1.8.5 and should not be changed by hand. 2 | 3 | [[package]] 4 | name = "attrs" 5 | version = "22.2.0" 6 | description = "Classes Without Boilerplate" 7 | optional = false 8 | python-versions = ">=3.6" 9 | files = [ 10 | {file = "attrs-22.2.0-py3-none-any.whl", hash = "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836"}, 11 | {file = "attrs-22.2.0.tar.gz", hash = "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99"}, 12 | ] 13 | 14 | [package.extras] 15 | cov = ["attrs[tests]", "coverage-enable-subprocess", "coverage[toml] (>=5.3)"] 16 | dev = ["attrs[docs,tests]"] 17 | docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope.interface"] 18 | tests = ["attrs[tests-no-zope]", "zope.interface"] 19 | tests-no-zope = ["cloudpickle", "cloudpickle", "hypothesis", "hypothesis", "mypy (>=0.971,<0.990)", "mypy (>=0.971,<0.990)", "pympler", "pympler", "pytest (>=4.3.0)", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-mypy-plugins", "pytest-xdist[psutil]", "pytest-xdist[psutil]"] 20 | 21 | [[package]] 22 | name = "cachetools" 23 | version = "5.2.0" 24 | description = "Extensible memoizing collections and decorators" 25 | optional = false 26 | python-versions = "~=3.7" 27 | files = [ 28 | {file = "cachetools-5.2.0-py3-none-any.whl", hash = "sha256:f9f17d2aec496a9aa6b76f53e3b614c965223c061982d434d160f930c698a9db"}, 29 | {file = "cachetools-5.2.0.tar.gz", hash = "sha256:6a94c6402995a99c3970cc7e4884bb60b4a8639938157eeed436098bf9831757"}, 30 | ] 31 | 32 | [[package]] 33 | name = "chardet" 34 | version = "5.1.0" 35 | description = "Universal encoding detector for Python 3" 36 | optional = false 37 | python-versions = ">=3.7" 38 | files = [ 39 | {file = "chardet-5.1.0-py3-none-any.whl", hash = "sha256:362777fb014af596ad31334fde1e8c327dfdb076e1960d1694662d46a6917ab9"}, 40 | {file = "chardet-5.1.0.tar.gz", hash = "sha256:0d62712b956bc154f85fb0a266e2a3c5913c2967e00348701b32411d6def31e5"}, 41 | ] 42 | 43 | [[package]] 44 | name = "colorama" 45 | version = "0.4.6" 46 | description = "Cross-platform colored terminal text." 47 | optional = false 48 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" 49 | files = [ 50 | {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, 51 | {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, 52 | ] 53 | 54 | [[package]] 55 | name = "distlib" 56 | version = "0.3.9" 57 | description = "Distribution utilities" 58 | optional = false 59 | python-versions = "*" 60 | files = [ 61 | {file = "distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87"}, 62 | {file = "distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"}, 63 | ] 64 | 65 | [[package]] 66 | name = "exceptiongroup" 67 | version = "1.1.0" 68 | description = "Backport of PEP 654 (exception groups)" 69 | optional = false 70 | python-versions = ">=3.7" 71 | files = [ 72 | {file = "exceptiongroup-1.1.0-py3-none-any.whl", hash = "sha256:327cbda3da756e2de031a3107b81ab7b3770a602c4d16ca618298c526f4bec1e"}, 73 | {file = "exceptiongroup-1.1.0.tar.gz", hash = "sha256:bcb67d800a4497e1b404c2dd44fca47d3b7a5e5433dbab67f96c1a685cdfdf23"}, 74 | ] 75 | 76 | [package.extras] 77 | test = ["pytest (>=6)"] 78 | 79 | [[package]] 80 | name = "filelock" 81 | version = "3.16.1" 82 | description = "A platform independent file lock." 83 | optional = false 84 | python-versions = ">=3.8" 85 | files = [ 86 | {file = "filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0"}, 87 | {file = "filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435"}, 88 | ] 89 | 90 | [package.extras] 91 | docs = ["furo (>=2024.8.6)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4.1)"] 92 | testing = ["covdefaults (>=2.3)", "coverage (>=7.6.1)", "diff-cover (>=9.2)", "pytest (>=8.3.3)", "pytest-asyncio (>=0.24)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.26.4)"] 93 | typing = ["typing-extensions (>=4.12.2)"] 94 | 95 | [[package]] 96 | name = "iniconfig" 97 | version = "1.1.1" 98 | description = "iniconfig: brain-dead simple config-ini parsing" 99 | optional = false 100 | python-versions = "*" 101 | files = [ 102 | {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, 103 | {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, 104 | ] 105 | 106 | [[package]] 107 | name = "packaging" 108 | version = "22.0" 109 | description = "Core utilities for Python packages" 110 | optional = false 111 | python-versions = ">=3.7" 112 | files = [ 113 | {file = "packaging-22.0-py3-none-any.whl", hash = "sha256:957e2148ba0e1a3b282772e791ef1d8083648bc131c8ab0c1feba110ce1146c3"}, 114 | {file = "packaging-22.0.tar.gz", hash = "sha256:2198ec20bd4c017b8f9717e00f0c8714076fc2fd93816750ab48e2c41de2cfd3"}, 115 | ] 116 | 117 | [[package]] 118 | name = "platformdirs" 119 | version = "4.3.6" 120 | description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." 121 | optional = false 122 | python-versions = ">=3.8" 123 | files = [ 124 | {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, 125 | {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, 126 | ] 127 | 128 | [package.extras] 129 | docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] 130 | test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"] 131 | type = ["mypy (>=1.11.2)"] 132 | 133 | [[package]] 134 | name = "pluggy" 135 | version = "1.0.0" 136 | description = "plugin and hook calling mechanisms for python" 137 | optional = false 138 | python-versions = ">=3.6" 139 | files = [ 140 | {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, 141 | {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, 142 | ] 143 | 144 | [package.extras] 145 | dev = ["pre-commit", "tox"] 146 | testing = ["pytest", "pytest-benchmark"] 147 | 148 | [[package]] 149 | name = "pyproject-api" 150 | version = "1.2.1" 151 | description = "API to interact with the python pyproject.toml based projects" 152 | optional = false 153 | python-versions = ">=3.7" 154 | files = [ 155 | {file = "pyproject_api-1.2.1-py3-none-any.whl", hash = "sha256:155d5623453173b7b4e9379a3146ccef2d52335234eb2d03d6ba730e7dad179c"}, 156 | {file = "pyproject_api-1.2.1.tar.gz", hash = "sha256:093c047d192ceadcab7afd6b501276bf2ce44adf41cb9c313234518cddd20818"}, 157 | ] 158 | 159 | [package.dependencies] 160 | packaging = ">=21.3" 161 | tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} 162 | 163 | [package.extras] 164 | docs = ["furo (>=2022.9.29)", "sphinx (>=5.3)", "sphinx-autodoc-typehints (>=1.19.5)"] 165 | testing = ["covdefaults (>=2.2.2)", "importlib-metadata (>=5.1)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "virtualenv (>=20.17)", "wheel (>=0.38.4)"] 166 | 167 | [[package]] 168 | name = "pytest" 169 | version = "7.2.0" 170 | description = "pytest: simple powerful testing with Python" 171 | optional = false 172 | python-versions = ">=3.7" 173 | files = [ 174 | {file = "pytest-7.2.0-py3-none-any.whl", hash = "sha256:892f933d339f068883b6fd5a459f03d85bfcb355e4981e146d2c7616c21fef71"}, 175 | {file = "pytest-7.2.0.tar.gz", hash = "sha256:c4014eb40e10f11f355ad4e3c2fb2c6c6d1919c73f3b5a433de4708202cade59"}, 176 | ] 177 | 178 | [package.dependencies] 179 | attrs = ">=19.2.0" 180 | colorama = {version = "*", markers = "sys_platform == \"win32\""} 181 | exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} 182 | iniconfig = "*" 183 | packaging = "*" 184 | pluggy = ">=0.12,<2.0" 185 | tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} 186 | 187 | [package.extras] 188 | testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] 189 | 190 | [[package]] 191 | name = "tomli" 192 | version = "2.0.1" 193 | description = "A lil' TOML parser" 194 | optional = false 195 | python-versions = ">=3.7" 196 | files = [ 197 | {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, 198 | {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, 199 | ] 200 | 201 | [[package]] 202 | name = "tox" 203 | version = "4.0.16" 204 | description = "tox is a generic virtualenv management and test command line tool" 205 | optional = false 206 | python-versions = ">=3.7" 207 | files = [ 208 | {file = "tox-4.0.16-py3-none-any.whl", hash = "sha256:1ba98d4a67b815403e616cf6ded707aeb0fadff10702928f9b990274c9703e9f"}, 209 | {file = "tox-4.0.16.tar.gz", hash = "sha256:968fc4e27110defdf15972893cb15fe1669f338c8408d8835077462fb07e07fe"}, 210 | ] 211 | 212 | [package.dependencies] 213 | cachetools = ">=5.2" 214 | chardet = ">=5.1" 215 | colorama = ">=0.4.6" 216 | filelock = ">=3.8.2" 217 | packaging = ">=22" 218 | platformdirs = ">=2.6" 219 | pluggy = ">=1" 220 | pyproject-api = ">=1.2.1" 221 | tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} 222 | virtualenv = ">=20.17.1" 223 | 224 | [package.extras] 225 | docs = ["furo (>=2022.12.7)", "sphinx (>=5.3)", "sphinx-argparse-cli (>=1.10)", "sphinx-autodoc-typehints (>=1.19.5)", "sphinx-copybutton (>=0.5.1)", "sphinx-inline-tabs (>=2022.1.2b11)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=22.8)"] 226 | testing = ["build[virtualenv] (>=0.9)", "covdefaults (>=2.2.2)", "devpi-process (>=0.3)", "diff-cover (>=7.3)", "distlib (>=0.3.6)", "flaky (>=3.7)", "hatch-vcs (>=0.3)", "hatchling (>=1.11.1)", "psutil (>=5.9.4)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "pytest-xdist (>=3.1)", "re-assert (>=1.1)", "time-machine (>=2.8.2)"] 227 | 228 | [[package]] 229 | name = "virtualenv" 230 | version = "20.26.6" 231 | description = "Virtual Python Environment builder" 232 | optional = false 233 | python-versions = ">=3.7" 234 | files = [ 235 | {file = "virtualenv-20.26.6-py3-none-any.whl", hash = "sha256:7345cc5b25405607a624d8418154577459c3e0277f5466dd79c49d5e492995f2"}, 236 | {file = "virtualenv-20.26.6.tar.gz", hash = "sha256:280aede09a2a5c317e409a00102e7077c6432c5a38f0ef938e643805a7ad2c48"}, 237 | ] 238 | 239 | [package.dependencies] 240 | distlib = ">=0.3.7,<1" 241 | filelock = ">=3.12.2,<4" 242 | platformdirs = ">=3.9.1,<5" 243 | 244 | [package.extras] 245 | docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] 246 | test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] 247 | 248 | [metadata] 249 | lock-version = "2.0" 250 | python-versions = "^3.10" 251 | content-hash = "658f668e1a79a897ee360fb2007fc6d89556359cb2a327cb9b15f694e1ab1ac0" 252 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /dataanalysis/pokemon.csv: -------------------------------------------------------------------------------- 1 | Pokemon,Type 2 | Bulbasaur,Grass 3 | Ivysaur,Grass 4 | Venusaur,Grass 5 | Charmander,Fire 6 | Charmeleon,Fire 7 | Charizard,Fire 8 | Squirtle,Water 9 | Wartortle,Water 10 | Blastoise,Water 11 | Caterpie,Bug 12 | Metapod,Bug 13 | Butterfree,Bug 14 | Weedle,Bug 15 | Kakuna,Bug 16 | Beedrill,Bug 17 | Pidgey,Normal 18 | Pidgeotto,Normal 19 | Pidgeot,Normal 20 | Rattata,Normal 21 | Raticate,Normal 22 | Spearow,Normal 23 | Fearow,Normal 24 | Ekans,Poison 25 | Arbok,Poison 26 | Pikachu,Electric 27 | Raichu,Electric 28 | Sandshrew,Ground 29 | Sandslash,Ground 30 | Nidoran,Poison 31 | Nidorina,Poison 32 | Nidoqueen,Poison 33 | Nidoran♂,Poison 34 | Nidorino,Poison 35 | Nidoking,Poison 36 | Clefairy,Fairy 37 | Clefable,Fairy 38 | Vulpix,Fire 39 | Ninetales,Fire 40 | Jigglypuff,Normal 41 | Wigglytuff,Normal 42 | Zubat,Poison 43 | Golbat,Poison 44 | Oddish,Grass 45 | Gloom,Grass 46 | Vileplume,Grass 47 | Paras,Bug 48 | Parasect,Bug 49 | Venonat,Bug 50 | Venomoth,Bug 51 | Diglett,Ground 52 | Dugtrio,Ground 53 | Meowth,Normal 54 | Persian,Normal 55 | Psyduck,Water 56 | Golduck,Water 57 | Mankey,Fighting 58 | Primeape,Fighting 59 | Growlithe,Fire 60 | Arcanine,Fire 61 | Poliwag,Water 62 | Poliwhirl,Water 63 | Poliwrath,Water 64 | Abra,Psychic 65 | Kadabra,Psychic 66 | Alakazam,Psychic 67 | Machop,Fighting 68 | Machoke,Fighting 69 | Machamp,Fighting 70 | Bellsprout,Grass 71 | Weepinbell,Grass 72 | Victreebel,Grass 73 | Tentacool,Water 74 | Tentacruel,Water 75 | Geodude,Rock 76 | Graveler,Rock 77 | Golem,Rock 78 | Ponyta,Fire 79 | Rapidash,Fire 80 | Slowpoke,Water 81 | Slowbro,Water 82 | Magnemite,Electric 83 | Magneton,Electric 84 | Farfetch'd,Normal 85 | Doduo,Normal 86 | Dodrio,Normal 87 | Seel,Water 88 | Dewgong,Water 89 | Grimer,Poison 90 | Muk,Poison 91 | Shellder,Water 92 | Cloyster,Water 93 | Gastly,Ghost 94 | Haunter,Ghost 95 | Gengar,Ghost 96 | Onix,Rock 97 | Drowzee,Psychic 98 | Hypno,Psychic 99 | Krabby,Water 100 | Kingler,Water 101 | Voltorb,Electric 102 | Electrode,Electric 103 | Exeggcute,Grass 104 | Exeggutor,Grass 105 | Cubone,Ground 106 | Marowak,Ground 107 | Hitmonlee,Fighting 108 | Hitmonchan,Fighting 109 | Lickitung,Normal 110 | Koffing,Poison 111 | Weezing,Poison 112 | Rhyhorn,Ground 113 | Rhydon,Ground 114 | Chansey,Normal 115 | Tangela,Grass 116 | Kangaskhan,Normal 117 | Horsea,Water 118 | Seadra,Water 119 | Goldeen,Water 120 | Seaking,Water 121 | Staryu,Water 122 | Starmie,Water 123 | Mr. Mime,Psychic 124 | Scyther,Bug 125 | Jynx,Ice 126 | Electabuzz,Electric 127 | Magmar,Fire 128 | Pinsir,Bug 129 | Tauros,Normal 130 | Magikarp,Water 131 | Gyarados,Water 132 | Lapras,Water 133 | Ditto,Normal 134 | Eevee,Normal 135 | Vaporeon,Water 136 | Jolteon,Electric 137 | Flareon,Fire 138 | Porygon,Normal 139 | Omanyte,Rock 140 | Omastar,Rock 141 | Kabuto,Rock 142 | Kabutops,Rock 143 | Aerodactyl,Rock 144 | Snorlax,Normal 145 | Articuno,Ice 146 | Zapdos,Electric 147 | Moltres,Fire 148 | Dratini,Dragon 149 | Dragonair,Dragon 150 | Dragonite,Dragon 151 | Mewtwo,Psychic 152 | Mew,Psychic 153 | Chikorita,Grass 154 | Bayleef,Grass 155 | Meganium,Grass 156 | Cyndaquil,Fire 157 | Quilava,Fire 158 | Typhlosion,Fire 159 | Totodile,Water 160 | Croconaw,Water 161 | Feraligatr,Water 162 | Sentret,Normal 163 | Furret,Normal 164 | Hoothoot,Normal 165 | Noctowl,Normal 166 | Ledyba,Bug 167 | Ledian,Bug 168 | Spinarak,Bug 169 | Ariados,Bug 170 | Crobat,Poison 171 | Chinchou,Water 172 | Lanturn,Water 173 | Pichu,Electric 174 | Cleffa,Fairy 175 | Igglybuff,Normal 176 | Togepi,Fairy 177 | Togetic,Fairy 178 | Natu,Psychic 179 | Xatu,Psychic 180 | Mareep,Electric 181 | Flaaffy,Electric 182 | Ampharos,Electric 183 | Bellossom,Grass 184 | Marill,Water 185 | Azumarill,Water 186 | Sudowoodo,Rock 187 | Politoed,Water 188 | Hoppip,Grass 189 | Skiploom,Grass 190 | Jumpluff,Grass 191 | Aipom,Normal 192 | Sunkern,Grass 193 | Sunflora,Grass 194 | Yanma,Bug 195 | Wooper,Water 196 | Quagsire,Water 197 | Espeon,Psychic 198 | Umbreon,Dark 199 | Murkrow,Dark 200 | Slowking,Water 201 | Misdreavus,Ghost 202 | Unown,Psychic 203 | Wobbuffet,Psychic 204 | Girafarig,Normal 205 | Pineco,Bug 206 | Forretress,Bug 207 | Dunsparce,Normal 208 | Gligar,Ground 209 | Steelix,Steel 210 | Snubbull,Fairy 211 | Granbull,Fairy 212 | Qwilfish,Water 213 | Scizor,Bug 214 | Shuckle,Bug 215 | Heracross,Bug 216 | Sneasel,Dark 217 | Teddiursa,Normal 218 | Ursaring,Normal 219 | Slugma,Fire 220 | Magcargo,Fire 221 | Swinub,Ice 222 | Piloswine,Ice 223 | Corsola,Water 224 | Remoraid,Water 225 | Octillery,Water 226 | Delibird,Ice 227 | Mantine,Water 228 | Skarmory,Steel 229 | Houndour,Dark 230 | Houndoom,Dark 231 | Kingdra,Water 232 | Phanpy,Ground 233 | Donphan,Ground 234 | Porygon2,Normal 235 | Stantler,Normal 236 | Smeargle,Normal 237 | Tyrogue,Fighting 238 | Hitmontop,Fighting 239 | Smoochum,Ice 240 | Elekid,Electric 241 | Magby,Fire 242 | Miltank,Normal 243 | Blissey,Normal 244 | Raikou,Electric 245 | Entei,Fire 246 | Suicune,Water 247 | Larvitar,Rock 248 | Pupitar,Rock 249 | Tyranitar,Rock 250 | Lugia,Psychic 251 | Ho-oh,Fire 252 | Celebi,Psychic 253 | Treecko,Grass 254 | Grovyle,Grass 255 | Sceptile,Grass 256 | Torchic,Fire 257 | Combusken,Fire 258 | Blaziken,Fire 259 | Mudkip,Water 260 | Marshtomp,Water 261 | Swampert,Water 262 | Poochyena,Dark 263 | Mightyena,Dark 264 | Zigzagoon,Normal 265 | Linoone,Normal 266 | Wurmple,Bug 267 | Silcoon,Bug 268 | Beautifly,Bug 269 | Cascoon,Bug 270 | Dustox,Bug 271 | Lotad,Water 272 | Lombre,Water 273 | Ludicolo,Water 274 | Seedot,Grass 275 | Nuzleaf,Grass 276 | Shiftry,Grass 277 | Taillow,Normal 278 | Swellow,Normal 279 | Wingull,Water 280 | Pelipper,Water 281 | Ralts,Psychic 282 | Kirlia,Psychic 283 | Gardevoir,Psychic 284 | Surskit,Bug 285 | Masquerain,Bug 286 | Shroomish,Grass 287 | Breloom,Grass 288 | Slakoth,Normal 289 | Vigoroth,Normal 290 | Slaking,Normal 291 | Nincada,Bug 292 | Ninjask,Bug 293 | Shedinja,Bug 294 | Whismur,Normal 295 | Loudred,Normal 296 | Exploud,Normal 297 | Makuhita,Fighting 298 | Hariyama,Fighting 299 | Azurill,Normal 300 | Nosepass,Rock 301 | Skitty,Normal 302 | Delcatty,Normal 303 | Sableye,Dark 304 | Mawile,Steel 305 | Aron,Steel 306 | Lairon,Steel 307 | Aggron,Steel 308 | Meditite,Fighting 309 | Medicham,Fighting 310 | Electrike,Electric 311 | Manectric,Electric 312 | Plusle,Electric 313 | Minun,Electric 314 | Volbeat,Bug 315 | Illumise,Bug 316 | Roselia,Grass 317 | Gulpin,Poison 318 | Swalot,Poison 319 | Carvanha,Water 320 | Sharpedo,Water 321 | Wailmer,Water 322 | Wailord,Water 323 | Numel,Fire 324 | Camerupt,Fire 325 | Torkoal,Fire 326 | Spoink,Psychic 327 | Grumpig,Psychic 328 | Spinda,Normal 329 | Trapinch,Ground 330 | Vibrava,Ground 331 | Flygon,Ground 332 | Cacnea,Grass 333 | Cacturne,Grass 334 | Swablu,Normal 335 | Altaria,Dragon 336 | Zangoose,Normal 337 | Seviper,Poison 338 | Lunatone,Rock 339 | Solrock,Rock 340 | Barboach,Water 341 | Whiscash,Water 342 | Corphish,Water 343 | Crawdaunt,Water 344 | Baltoy,Ground 345 | Claydol,Ground 346 | Lileep,Rock 347 | Cradily,Rock 348 | Anorith,Rock 349 | Armaldo,Rock 350 | Feebas,Water 351 | Milotic,Water 352 | Castform,Normal 353 | Kecleon,Normal 354 | Shuppet,Ghost 355 | Banette,Ghost 356 | Duskull,Ghost 357 | Dusclops,Ghost 358 | Tropius,Grass 359 | Chimecho,Psychic 360 | Absol,Dark 361 | Wynaut,Psychic 362 | Snorunt,Ice 363 | Glalie,Ice 364 | Spheal,Ice 365 | Sealeo,Ice 366 | Walrein,Ice 367 | Clamperl,Water 368 | Huntail,Water 369 | Gorebyss,Water 370 | Relicanth,Water 371 | Luvdisc,Water 372 | Bagon,Dragon 373 | Shelgon,Dragon 374 | Salamence,Dragon 375 | Beldum,Steel 376 | Metang,Steel 377 | Metagross,Steel 378 | Regirock,Rock 379 | Regice,Ice 380 | Registeel,Steel 381 | Latias,Dragon 382 | Latios,Dragon 383 | Kyogre,Water 384 | Groudon,Ground 385 | Rayquaza,Dragon 386 | Jirachi,Steel 387 | Deoxys,Psychic 388 | Turtwig,Grass 389 | Grotle,Grass 390 | Torterra,Grass 391 | Chimchar,Fire 392 | Monferno,Fire 393 | Infernape,Fire 394 | Piplup,Water 395 | Prinplup,Water 396 | Empoleon,Water 397 | Starly,Normal 398 | Staravia,Normal 399 | Staraptor,Normal 400 | Bidoof,Normal 401 | Bibarel,Normal 402 | Kricketot,Bug 403 | Kricketune,Bug 404 | Shinx,Electric 405 | Luxio,Electric 406 | Luxray,Electric 407 | Budew,Grass 408 | Roserade,Grass 409 | Cranidos,Rock 410 | Rampardos,Rock 411 | Shieldon,Rock 412 | Bastiodon,Rock 413 | Burmy,Bug 414 | Wormadam,Bug 415 | Mothim,Bug 416 | Combee,Bug 417 | Vespiquen,Bug 418 | Pachirisu,Electric 419 | Buizel,Water 420 | Floatzel,Water 421 | Cherubi,Grass 422 | Cherrim,Grass 423 | Shellos,Water 424 | Gastrodon,Water 425 | Ambipom,Normal 426 | Drifloon,Ghost 427 | Drifblim,Ghost 428 | Buneary,Normal 429 | Lopunny,Normal 430 | Mismagius,Ghost 431 | Honchkrow,Dark 432 | Glameow,Normal 433 | Purugly,Normal 434 | Chingling,Psychic 435 | Stunky,Poison 436 | Skuntank,Poison 437 | Bronzor,Steel 438 | Bronzong,Steel 439 | Bonsly,Rock 440 | Mime Jr.,Psychic 441 | Happiny,Normal 442 | Chatot,Normal 443 | Spiritomb,Ghost 444 | Gible,Dragon 445 | Gabite,Dragon 446 | Garchomp,Dragon 447 | Munchlax,Normal 448 | Riolu,Fighting 449 | Lucario,Fighting 450 | Hippopotas,Ground 451 | Hippowdon,Ground 452 | Skorupi,Poison 453 | Drapion,Poison 454 | Croagunk,Poison 455 | Toxicroak,Poison 456 | Carnivine,Grass 457 | Finneon,Water 458 | Lumineon,Water 459 | Mantyke,Water 460 | Snover,Grass 461 | Abomasnow,Grass 462 | Weavile,Dark 463 | Magnezone,Electric 464 | Lickilicky,Normal 465 | Rhyperior,Ground 466 | Tangrowth,Grass 467 | Electivire,Electric 468 | Magmortar,Fire 469 | Togekiss,Fairy 470 | Yanmega,Bug 471 | Leafeon,Grass 472 | Glaceon,Ice 473 | Gliscor,Ground 474 | Mamoswine,Ice 475 | Porygon-Z,Normal 476 | Gallade,Psychic 477 | Probopass,Rock 478 | Dusknoir,Ghost 479 | Froslass,Ice 480 | Rotom,Electric 481 | Uxie,Psychic 482 | Mesprit,Psychic 483 | Azelf,Psychic 484 | Dialga,Steel 485 | Palkia,Water 486 | Heatran,Fire 487 | Regigigas,Normal 488 | Giratina,Ghost 489 | Cresselia,Psychic 490 | Phione,Water 491 | Manaphy,Water 492 | Darkrai,Dark 493 | Shaymin,Grass 494 | Arceus,Normal 495 | Victini,Psychic 496 | Snivy,Grass 497 | Servine,Grass 498 | Serperior,Grass 499 | Tepig,Fire 500 | Pignite,Fire 501 | Emboar,Fire 502 | Oshawott,Water 503 | Dewott,Water 504 | Samurott,Water 505 | Patrat,Normal 506 | Watchog,Normal 507 | Lillipup,Normal 508 | Herdier,Normal 509 | Stoutland,Normal 510 | Purrloin,Dark 511 | Liepard,Dark 512 | Pansage,Grass 513 | Simisage,Grass 514 | Pansear,Fire 515 | Simisear,Fire 516 | Panpour,Water 517 | Simipour,Water 518 | Munna,Psychic 519 | Musharna,Psychic 520 | Pidove,Normal 521 | Tranquill,Normal 522 | Unfezant,Normal 523 | Blitzle,Electric 524 | Zebstrika,Electric 525 | Roggenrola,Rock 526 | Boldore,Rock 527 | Gigalith,Rock 528 | Woobat,Psychic 529 | Swoobat,Psychic 530 | Drilbur,Ground 531 | Excadrill,Ground 532 | Audino,Normal 533 | Timburr,Fighting 534 | Gurdurr,Fighting 535 | Conkeldurr,Fighting 536 | Tympole,Water 537 | Palpitoad,Water 538 | Seismitoad,Water 539 | Throh,Fighting 540 | Sawk,Fighting 541 | Sewaddle,Bug 542 | Swadloon,Bug 543 | Leavanny,Bug 544 | Venipede,Bug 545 | Whirlipede,Bug 546 | Scolipede,Bug 547 | Cottonee,Grass 548 | Whimsicott,Grass 549 | Petilil,Grass 550 | Lilligant,Grass 551 | Basculin,Water 552 | Sandile,Ground 553 | Krokorok,Ground 554 | Krookodile,Ground 555 | Darumaka,Fire 556 | Darmanitan,Fire 557 | Maractus,Grass 558 | Dwebble,Bug 559 | Crustle,Bug 560 | Scraggy,Dark 561 | Scrafty,Dark 562 | Sigilyph,Psychic 563 | Yamask,Ghost 564 | Cofagrigus,Ghost 565 | Tirtouga,Water 566 | Carracosta,Water 567 | Archen,Rock 568 | Archeops,Rock 569 | Trubbish,Poison 570 | Garbodor,Poison 571 | Zorua,Dark 572 | Zoroark,Dark 573 | Minccino,Normal 574 | Cinccino,Normal 575 | Gothita,Psychic 576 | Gothorita,Psychic 577 | Gothitelle,Psychic 578 | Solosis,Psychic 579 | Duosion,Psychic 580 | Reuniclus,Psychic 581 | Ducklett,Water 582 | Swanna,Water 583 | Vanillite,Ice 584 | Vanillish,Ice 585 | Vanilluxe,Ice 586 | Deerling,Normal 587 | Sawsbuck,Normal 588 | Emolga,Electric 589 | Karrablast,Bug 590 | Escavalier,Bug 591 | Foongus,Grass 592 | Amoonguss,Grass 593 | Frillish,Water 594 | Jellicent,Water 595 | Alomomola,Water 596 | Joltik,Bug 597 | Galvantula,Bug 598 | Ferroseed,Grass 599 | Ferrothorn,Grass 600 | Klink,Steel 601 | Klang,Steel 602 | Klinklang,Steel 603 | Tynamo,Electric 604 | Eelektrik,Electric 605 | Eelektross,Electric 606 | Elgyem,Psychic 607 | Beheeyem,Psychic 608 | Litwick,Ghost 609 | Lampent,Ghost 610 | Chandelure,Ghost 611 | Axew,Dragon 612 | Fraxure,Dragon 613 | Haxorus,Dragon 614 | Cubchoo,Ice 615 | Beartic,Ice 616 | Cryogonal,Ice 617 | Shelmet,Bug 618 | Accelgor,Bug 619 | Stunfisk,Ground 620 | Mienfoo,Fighting 621 | Mienshao,Fighting 622 | Druddigon,Dragon 623 | Golett,Ground 624 | Golurk,Ground 625 | Pawniard,Dark 626 | Bisharp,Dark 627 | Bouffalant,Normal 628 | Rufflet,Normal 629 | Braviary,Normal 630 | Vullaby,Dark 631 | Mandibuzz,Dark 632 | Heatmor,Fire 633 | Durant,Bug 634 | Deino,Dark 635 | Zweilous,Dark 636 | Hydreigon,Dark 637 | Larvesta,Bug 638 | Volcarona,Bug 639 | Cobalion,Steel 640 | Terrakion,Rock 641 | Virizion,Grass 642 | Tornadus,Flying 643 | Thundurus,Electric 644 | Reshiram,Dragon 645 | Zekrom,Dragon 646 | Landorus,Ground 647 | Kyurem,Dragon 648 | Keldeo,Water 649 | Meloetta,Normal 650 | Genesect,Bug 651 | Chespin,Grass 652 | Quilladin,Grass 653 | Chesnaught,Grass 654 | Fennekin,Fire 655 | Braixen,Fire 656 | Delphox,Fire 657 | Froakie,Water 658 | Frogadier,Water 659 | Greninja,Water 660 | Bunnelby,Normal 661 | Diggersby,Normal 662 | Fletchling,Normal 663 | Fletchinder,Fire 664 | Talonflame,Fire 665 | Scatterbug,Bug 666 | Spewpa,Bug 667 | Vivillon,Bug 668 | Litleo,Fire 669 | Pyroar,Fire 670 | Flabébé,Fairy 671 | Floette,Fairy 672 | Florges,Fairy 673 | Skiddo,Grass 674 | Gogoat,Grass 675 | Pancham,Fighting 676 | Pangoro,Fighting 677 | Furfrou,Normal 678 | Espurr,Psychic 679 | Meowstic,Psychic 680 | Honedge,Steel 681 | Doublade,Steel 682 | Aegislash,Steel 683 | Spritzee,Fairy 684 | Aromatisse,Fairy 685 | Swirlix,Fairy 686 | Slurpuff,Fairy 687 | Inkay,Dark 688 | Malamar,Dark 689 | Binacle,Rock 690 | Barbaracle,Rock 691 | Skrelp,Poison 692 | Dragalge,Poison 693 | Clauncher,Water 694 | Clawitzer,Water 695 | Helioptile,Electric 696 | Heliolisk,Electric 697 | Tyrunt,Rock 698 | Tyrantrum,Rock 699 | Amaura,Rock 700 | Aurorus,Rock 701 | Sylveon,Fairy 702 | Hawlucha,Fighting 703 | Dedenne,Electric 704 | Carbink,Rock 705 | Goomy,Dragon 706 | Sliggoo,Dragon 707 | Goodra,Dragon 708 | Klefki,Steel 709 | Phantump,Ghost 710 | Trevenant,Ghost 711 | Pumpkaboo,Ghost 712 | Gourgeist,Ghost 713 | Bergmite,Ice 714 | Avalugg,Ice 715 | Noibat,Flying 716 | Noivern,Flying 717 | Xerneas,Fairy 718 | Yveltal,Dark 719 | Zygarde,Dragon 720 | Diancie,Rock 721 | Hoopa,Psychic 722 | Volcanion,Fire 723 | -------------------------------------------------------------------------------- /fastapi-playground/poetry.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand. 2 | 3 | [[package]] 4 | name = "annotated-doc" 5 | version = "0.0.3" 6 | description = "Document parameters, class attributes, return types, and variables inline, with Annotated." 7 | optional = false 8 | python-versions = ">=3.8" 9 | groups = ["main"] 10 | files = [ 11 | {file = "annotated_doc-0.0.3-py3-none-any.whl", hash = "sha256:348ec6664a76f1fd3be81f43dffbee4c7e8ce931ba71ec67cc7f4ade7fbbb580"}, 12 | {file = "annotated_doc-0.0.3.tar.gz", hash = "sha256:e18370014c70187422c33e945053ff4c286f453a984eba84d0dbfa0c935adeda"}, 13 | ] 14 | 15 | [[package]] 16 | name = "annotated-types" 17 | version = "0.7.0" 18 | description = "Reusable constraint types to use with typing.Annotated" 19 | optional = false 20 | python-versions = ">=3.8" 21 | groups = ["main"] 22 | files = [ 23 | {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, 24 | {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, 25 | ] 26 | 27 | [[package]] 28 | name = "anyio" 29 | version = "4.11.0" 30 | description = "High-level concurrency and networking framework on top of asyncio or Trio" 31 | optional = false 32 | python-versions = ">=3.9" 33 | groups = ["main"] 34 | files = [ 35 | {file = "anyio-4.11.0-py3-none-any.whl", hash = "sha256:0287e96f4d26d4149305414d4e3bc32f0dcd0862365a4bddea19d7a1ec38c4fc"}, 36 | {file = "anyio-4.11.0.tar.gz", hash = "sha256:82a8d0b81e318cc5ce71a5f1f8b5c4e63619620b63141ef8c995fa0db95a57c4"}, 37 | ] 38 | 39 | [package.dependencies] 40 | idna = ">=2.8" 41 | sniffio = ">=1.1" 42 | 43 | [package.extras] 44 | trio = ["trio (>=0.31.0)"] 45 | 46 | [[package]] 47 | name = "black" 48 | version = "25.9.0" 49 | description = "The uncompromising code formatter." 50 | optional = false 51 | python-versions = ">=3.9" 52 | groups = ["dev"] 53 | files = [ 54 | {file = "black-25.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ce41ed2614b706fd55fd0b4a6909d06b5bab344ffbfadc6ef34ae50adba3d4f7"}, 55 | {file = "black-25.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2ab0ce111ef026790e9b13bd216fa7bc48edd934ffc4cbf78808b235793cbc92"}, 56 | {file = "black-25.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f96b6726d690c96c60ba682955199f8c39abc1ae0c3a494a9c62c0184049a713"}, 57 | {file = "black-25.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:d119957b37cc641596063cd7db2656c5be3752ac17877017b2ffcdb9dfc4d2b1"}, 58 | {file = "black-25.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:456386fe87bad41b806d53c062e2974615825c7a52159cde7ccaeb0695fa28fa"}, 59 | {file = "black-25.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a16b14a44c1af60a210d8da28e108e13e75a284bf21a9afa6b4571f96ab8bb9d"}, 60 | {file = "black-25.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aaf319612536d502fdd0e88ce52d8f1352b2c0a955cc2798f79eeca9d3af0608"}, 61 | {file = "black-25.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:c0372a93e16b3954208417bfe448e09b0de5cc721d521866cd9e0acac3c04a1f"}, 62 | {file = "black-25.9.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:1b9dc70c21ef8b43248f1d86aedd2aaf75ae110b958a7909ad8463c4aa0880b0"}, 63 | {file = "black-25.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8e46eecf65a095fa62e53245ae2795c90bdecabd53b50c448d0a8bcd0d2e74c4"}, 64 | {file = "black-25.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9101ee58ddc2442199a25cb648d46ba22cd580b00ca4b44234a324e3ec7a0f7e"}, 65 | {file = "black-25.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:77e7060a00c5ec4b3367c55f39cf9b06e68965a4f2e61cecacd6d0d9b7ec945a"}, 66 | {file = "black-25.9.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0172a012f725b792c358d57fe7b6b6e8e67375dd157f64fa7a3097b3ed3e2175"}, 67 | {file = "black-25.9.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3bec74ee60f8dfef564b573a96b8930f7b6a538e846123d5ad77ba14a8d7a64f"}, 68 | {file = "black-25.9.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b756fc75871cb1bcac5499552d771822fd9db5a2bb8db2a7247936ca48f39831"}, 69 | {file = "black-25.9.0-cp313-cp313-win_amd64.whl", hash = "sha256:846d58e3ce7879ec1ffe816bb9df6d006cd9590515ed5d17db14e17666b2b357"}, 70 | {file = "black-25.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ef69351df3c84485a8beb6f7b8f9721e2009e20ef80a8d619e2d1788b7816d47"}, 71 | {file = "black-25.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e3c1f4cd5e93842774d9ee4ef6cd8d17790e65f44f7cdbaab5f2cf8ccf22a823"}, 72 | {file = "black-25.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:154b06d618233fe468236ba1f0e40823d4eb08b26f5e9261526fde34916b9140"}, 73 | {file = "black-25.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:e593466de7b998374ea2585a471ba90553283fb9beefcfa430d84a2651ed5933"}, 74 | {file = "black-25.9.0-py3-none-any.whl", hash = "sha256:474b34c1342cdc157d307b56c4c65bce916480c4a8f6551fdc6bf9b486a7c4ae"}, 75 | {file = "black-25.9.0.tar.gz", hash = "sha256:0474bca9a0dd1b51791fcc507a4e02078a1c63f6d4e4ae5544b9848c7adfb619"}, 76 | ] 77 | 78 | [package.dependencies] 79 | click = ">=8.0.0" 80 | mypy-extensions = ">=0.4.3" 81 | packaging = ">=22.0" 82 | pathspec = ">=0.9.0" 83 | platformdirs = ">=2" 84 | pytokens = ">=0.1.10" 85 | 86 | [package.extras] 87 | colorama = ["colorama (>=0.4.3)"] 88 | d = ["aiohttp (>=3.10)"] 89 | jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] 90 | uvloop = ["uvloop (>=0.15.2)"] 91 | 92 | [[package]] 93 | name = "click" 94 | version = "8.3.0" 95 | description = "Composable command line interface toolkit" 96 | optional = false 97 | python-versions = ">=3.10" 98 | groups = ["main", "dev"] 99 | files = [ 100 | {file = "click-8.3.0-py3-none-any.whl", hash = "sha256:9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc"}, 101 | {file = "click-8.3.0.tar.gz", hash = "sha256:e7b8232224eba16f4ebe410c25ced9f7875cb5f3263ffc93cc3e8da705e229c4"}, 102 | ] 103 | 104 | [package.dependencies] 105 | colorama = {version = "*", markers = "platform_system == \"Windows\""} 106 | 107 | [[package]] 108 | name = "colorama" 109 | version = "0.4.6" 110 | description = "Cross-platform colored terminal text." 111 | optional = false 112 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" 113 | groups = ["main", "dev"] 114 | files = [ 115 | {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, 116 | {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, 117 | ] 118 | markers = {main = "platform_system == \"Windows\"", dev = "platform_system == \"Windows\" or sys_platform == \"win32\""} 119 | 120 | [[package]] 121 | name = "fastapi" 122 | version = "0.120.3" 123 | description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" 124 | optional = false 125 | python-versions = ">=3.8" 126 | groups = ["main"] 127 | files = [ 128 | {file = "fastapi-0.120.3-py3-none-any.whl", hash = "sha256:bfee21c98db9128dc425a686eafd14899e26e4471aab33076bff2427fd6dcd22"}, 129 | {file = "fastapi-0.120.3.tar.gz", hash = "sha256:17db50718ee86c9e01e54f9d8600abf130f6f762711cd0d8f02eb392668271ba"}, 130 | ] 131 | 132 | [package.dependencies] 133 | annotated-doc = ">=0.0.2" 134 | pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0" 135 | starlette = ">=0.40.0,<0.50.0" 136 | typing-extensions = ">=4.8.0" 137 | 138 | [package.extras] 139 | all = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.8)", "httpx (>=0.23.0,<1.0.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=3.1.5)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.18)", "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)"] 140 | standard = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.8)", "httpx (>=0.23.0,<1.0.0)", "jinja2 (>=3.1.5)", "python-multipart (>=0.0.18)", "uvicorn[standard] (>=0.12.0)"] 141 | standard-no-fastapi-cloud-cli = ["email-validator (>=2.0.0)", "fastapi-cli[standard-no-fastapi-cloud-cli] (>=0.0.8)", "httpx (>=0.23.0,<1.0.0)", "jinja2 (>=3.1.5)", "python-multipart (>=0.0.18)", "uvicorn[standard] (>=0.12.0)"] 142 | 143 | [[package]] 144 | name = "h11" 145 | version = "0.16.0" 146 | description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" 147 | optional = false 148 | python-versions = ">=3.8" 149 | groups = ["main"] 150 | files = [ 151 | {file = "h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86"}, 152 | {file = "h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1"}, 153 | ] 154 | 155 | [[package]] 156 | name = "idna" 157 | version = "3.11" 158 | description = "Internationalized Domain Names in Applications (IDNA)" 159 | optional = false 160 | python-versions = ">=3.8" 161 | groups = ["main"] 162 | files = [ 163 | {file = "idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea"}, 164 | {file = "idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902"}, 165 | ] 166 | 167 | [package.extras] 168 | all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] 169 | 170 | [[package]] 171 | name = "iniconfig" 172 | version = "2.3.0" 173 | description = "brain-dead simple config-ini parsing" 174 | optional = false 175 | python-versions = ">=3.10" 176 | groups = ["dev"] 177 | files = [ 178 | {file = "iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12"}, 179 | {file = "iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730"}, 180 | ] 181 | 182 | [[package]] 183 | name = "mypy-extensions" 184 | version = "1.1.0" 185 | description = "Type system extensions for programs checked with the mypy type checker." 186 | optional = false 187 | python-versions = ">=3.8" 188 | groups = ["dev"] 189 | files = [ 190 | {file = "mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505"}, 191 | {file = "mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558"}, 192 | ] 193 | 194 | [[package]] 195 | name = "packaging" 196 | version = "25.0" 197 | description = "Core utilities for Python packages" 198 | optional = false 199 | python-versions = ">=3.8" 200 | groups = ["dev"] 201 | files = [ 202 | {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"}, 203 | {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, 204 | ] 205 | 206 | [[package]] 207 | name = "pathspec" 208 | version = "0.12.1" 209 | description = "Utility library for gitignore style pattern matching of file paths." 210 | optional = false 211 | python-versions = ">=3.8" 212 | groups = ["dev"] 213 | files = [ 214 | {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, 215 | {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, 216 | ] 217 | 218 | [[package]] 219 | name = "platformdirs" 220 | version = "4.5.0" 221 | description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." 222 | optional = false 223 | python-versions = ">=3.10" 224 | groups = ["dev"] 225 | files = [ 226 | {file = "platformdirs-4.5.0-py3-none-any.whl", hash = "sha256:e578a81bb873cbb89a41fcc904c7ef523cc18284b7e3b3ccf06aca1403b7ebd3"}, 227 | {file = "platformdirs-4.5.0.tar.gz", hash = "sha256:70ddccdd7c99fc5942e9fc25636a8b34d04c24b335100223152c2803e4063312"}, 228 | ] 229 | 230 | [package.extras] 231 | docs = ["furo (>=2025.9.25)", "proselint (>=0.14)", "sphinx (>=8.2.3)", "sphinx-autodoc-typehints (>=3.2)"] 232 | test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.4.2)", "pytest-cov (>=7)", "pytest-mock (>=3.15.1)"] 233 | type = ["mypy (>=1.18.2)"] 234 | 235 | [[package]] 236 | name = "pluggy" 237 | version = "1.6.0" 238 | description = "plugin and hook calling mechanisms for python" 239 | optional = false 240 | python-versions = ">=3.9" 241 | groups = ["dev"] 242 | files = [ 243 | {file = "pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746"}, 244 | {file = "pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3"}, 245 | ] 246 | 247 | [package.extras] 248 | dev = ["pre-commit", "tox"] 249 | testing = ["coverage", "pytest", "pytest-benchmark"] 250 | 251 | [[package]] 252 | name = "pydantic" 253 | version = "2.12.3" 254 | description = "Data validation using Python type hints" 255 | optional = false 256 | python-versions = ">=3.9" 257 | groups = ["main"] 258 | files = [ 259 | {file = "pydantic-2.12.3-py3-none-any.whl", hash = "sha256:6986454a854bc3bc6e5443e1369e06a3a456af9d339eda45510f517d9ea5c6bf"}, 260 | {file = "pydantic-2.12.3.tar.gz", hash = "sha256:1da1c82b0fc140bb0103bc1441ffe062154c8d38491189751ee00fd8ca65ce74"}, 261 | ] 262 | 263 | [package.dependencies] 264 | annotated-types = ">=0.6.0" 265 | pydantic-core = "2.41.4" 266 | typing-extensions = ">=4.14.1" 267 | typing-inspection = ">=0.4.2" 268 | 269 | [package.extras] 270 | email = ["email-validator (>=2.0.0)"] 271 | timezone = ["tzdata ; python_version >= \"3.9\" and platform_system == \"Windows\""] 272 | 273 | [[package]] 274 | name = "pydantic-core" 275 | version = "2.41.4" 276 | description = "Core functionality for Pydantic validation and serialization" 277 | optional = false 278 | python-versions = ">=3.9" 279 | groups = ["main"] 280 | files = [ 281 | {file = "pydantic_core-2.41.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2442d9a4d38f3411f22eb9dd0912b7cbf4b7d5b6c92c4173b75d3e1ccd84e36e"}, 282 | {file = "pydantic_core-2.41.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:30a9876226dda131a741afeab2702e2d127209bde3c65a2b8133f428bc5d006b"}, 283 | {file = "pydantic_core-2.41.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d55bbac04711e2980645af68b97d445cdbcce70e5216de444a6c4b6943ebcccd"}, 284 | {file = "pydantic_core-2.41.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e1d778fb7849a42d0ee5927ab0f7453bf9f85eef8887a546ec87db5ddb178945"}, 285 | {file = "pydantic_core-2.41.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1b65077a4693a98b90ec5ad8f203ad65802a1b9b6d4a7e48066925a7e1606706"}, 286 | {file = "pydantic_core-2.41.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:62637c769dee16eddb7686bf421be48dfc2fae93832c25e25bc7242e698361ba"}, 287 | {file = "pydantic_core-2.41.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dfe3aa529c8f501babf6e502936b9e8d4698502b2cfab41e17a028d91b1ac7b"}, 288 | {file = "pydantic_core-2.41.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ca2322da745bf2eeb581fc9ea3bbb31147702163ccbcbf12a3bb630e4bf05e1d"}, 289 | {file = "pydantic_core-2.41.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e8cd3577c796be7231dcf80badcf2e0835a46665eaafd8ace124d886bab4d700"}, 290 | {file = "pydantic_core-2.41.4-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:1cae8851e174c83633f0833e90636832857297900133705ee158cf79d40f03e6"}, 291 | {file = "pydantic_core-2.41.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a26d950449aae348afe1ac8be5525a00ae4235309b729ad4d3399623125b43c9"}, 292 | {file = "pydantic_core-2.41.4-cp310-cp310-win32.whl", hash = "sha256:0cf2a1f599efe57fa0051312774280ee0f650e11152325e41dfd3018ef2c1b57"}, 293 | {file = "pydantic_core-2.41.4-cp310-cp310-win_amd64.whl", hash = "sha256:a8c2e340d7e454dc3340d3d2e8f23558ebe78c98aa8f68851b04dcb7bc37abdc"}, 294 | {file = "pydantic_core-2.41.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:28ff11666443a1a8cf2a044d6a545ebffa8382b5f7973f22c36109205e65dc80"}, 295 | {file = "pydantic_core-2.41.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:61760c3925d4633290292bad462e0f737b840508b4f722247d8729684f6539ae"}, 296 | {file = "pydantic_core-2.41.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eae547b7315d055b0de2ec3965643b0ab82ad0106a7ffd29615ee9f266a02827"}, 297 | {file = "pydantic_core-2.41.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ef9ee5471edd58d1fcce1c80ffc8783a650e3e3a193fe90d52e43bb4d87bff1f"}, 298 | {file = "pydantic_core-2.41.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:15dd504af121caaf2c95cb90c0ebf71603c53de98305621b94da0f967e572def"}, 299 | {file = "pydantic_core-2.41.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a926768ea49a8af4d36abd6a8968b8790f7f76dd7cbd5a4c180db2b4ac9a3a2"}, 300 | {file = "pydantic_core-2.41.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6916b9b7d134bff5440098a4deb80e4cb623e68974a87883299de9124126c2a8"}, 301 | {file = "pydantic_core-2.41.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5cf90535979089df02e6f17ffd076f07237efa55b7343d98760bde8743c4b265"}, 302 | {file = "pydantic_core-2.41.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7533c76fa647fade2d7ec75ac5cc079ab3f34879626dae5689b27790a6cf5a5c"}, 303 | {file = "pydantic_core-2.41.4-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:37e516bca9264cbf29612539801ca3cd5d1be465f940417b002905e6ed79d38a"}, 304 | {file = "pydantic_core-2.41.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0c19cb355224037c83642429b8ce261ae108e1c5fbf5c028bac63c77b0f8646e"}, 305 | {file = "pydantic_core-2.41.4-cp311-cp311-win32.whl", hash = "sha256:09c2a60e55b357284b5f31f5ab275ba9f7f70b7525e18a132ec1f9160b4f1f03"}, 306 | {file = "pydantic_core-2.41.4-cp311-cp311-win_amd64.whl", hash = "sha256:711156b6afb5cb1cb7c14a2cc2c4a8b4c717b69046f13c6b332d8a0a8f41ca3e"}, 307 | {file = "pydantic_core-2.41.4-cp311-cp311-win_arm64.whl", hash = "sha256:6cb9cf7e761f4f8a8589a45e49ed3c0d92d1d696a45a6feaee8c904b26efc2db"}, 308 | {file = "pydantic_core-2.41.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ab06d77e053d660a6faaf04894446df7b0a7e7aba70c2797465a0a1af00fc887"}, 309 | {file = "pydantic_core-2.41.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c53ff33e603a9c1179a9364b0a24694f183717b2e0da2b5ad43c316c956901b2"}, 310 | {file = "pydantic_core-2.41.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:304c54176af2c143bd181d82e77c15c41cbacea8872a2225dd37e6544dce9999"}, 311 | {file = "pydantic_core-2.41.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:025ba34a4cf4fb32f917d5d188ab5e702223d3ba603be4d8aca2f82bede432a4"}, 312 | {file = "pydantic_core-2.41.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b9f5f30c402ed58f90c70e12eff65547d3ab74685ffe8283c719e6bead8ef53f"}, 313 | {file = "pydantic_core-2.41.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd96e5d15385d301733113bcaa324c8bcf111275b7675a9c6e88bfb19fc05e3b"}, 314 | {file = "pydantic_core-2.41.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98f348cbb44fae6e9653c1055db7e29de67ea6a9ca03a5fa2c2e11a47cff0e47"}, 315 | {file = "pydantic_core-2.41.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ec22626a2d14620a83ca583c6f5a4080fa3155282718b6055c2ea48d3ef35970"}, 316 | {file = "pydantic_core-2.41.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3a95d4590b1f1a43bf33ca6d647b990a88f4a3824a8c4572c708f0b45a5290ed"}, 317 | {file = "pydantic_core-2.41.4-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:f9672ab4d398e1b602feadcffcdd3af44d5f5e6ddc15bc7d15d376d47e8e19f8"}, 318 | {file = "pydantic_core-2.41.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:84d8854db5f55fead3b579f04bda9a36461dab0730c5d570e1526483e7bb8431"}, 319 | {file = "pydantic_core-2.41.4-cp312-cp312-win32.whl", hash = "sha256:9be1c01adb2ecc4e464392c36d17f97e9110fbbc906bcbe1c943b5b87a74aabd"}, 320 | {file = "pydantic_core-2.41.4-cp312-cp312-win_amd64.whl", hash = "sha256:d682cf1d22bab22a5be08539dca3d1593488a99998f9f412137bc323179067ff"}, 321 | {file = "pydantic_core-2.41.4-cp312-cp312-win_arm64.whl", hash = "sha256:833eebfd75a26d17470b58768c1834dfc90141b7afc6eb0429c21fc5a21dcfb8"}, 322 | {file = "pydantic_core-2.41.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:85e050ad9e5f6fe1004eec65c914332e52f429bc0ae12d6fa2092407a462c746"}, 323 | {file = "pydantic_core-2.41.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e7393f1d64792763a48924ba31d1e44c2cfbc05e3b1c2c9abb4ceeadd912cced"}, 324 | {file = "pydantic_core-2.41.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94dab0940b0d1fb28bcab847adf887c66a27a40291eedf0b473be58761c9799a"}, 325 | {file = "pydantic_core-2.41.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:de7c42f897e689ee6f9e93c4bec72b99ae3b32a2ade1c7e4798e690ff5246e02"}, 326 | {file = "pydantic_core-2.41.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:664b3199193262277b8b3cd1e754fb07f2c6023289c815a1e1e8fb415cb247b1"}, 327 | {file = "pydantic_core-2.41.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d95b253b88f7d308b1c0b417c4624f44553ba4762816f94e6986819b9c273fb2"}, 328 | {file = "pydantic_core-2.41.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1351f5bbdbbabc689727cb91649a00cb9ee7203e0a6e54e9f5ba9e22e384b84"}, 329 | {file = "pydantic_core-2.41.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1affa4798520b148d7182da0615d648e752de4ab1a9566b7471bc803d88a062d"}, 330 | {file = "pydantic_core-2.41.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7b74e18052fea4aa8dea2fb7dbc23d15439695da6cbe6cfc1b694af1115df09d"}, 331 | {file = "pydantic_core-2.41.4-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:285b643d75c0e30abda9dc1077395624f314a37e3c09ca402d4015ef5979f1a2"}, 332 | {file = "pydantic_core-2.41.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:f52679ff4218d713b3b33f88c89ccbf3a5c2c12ba665fb80ccc4192b4608dbab"}, 333 | {file = "pydantic_core-2.41.4-cp313-cp313-win32.whl", hash = "sha256:ecde6dedd6fff127c273c76821bb754d793be1024bc33314a120f83a3c69460c"}, 334 | {file = "pydantic_core-2.41.4-cp313-cp313-win_amd64.whl", hash = "sha256:d081a1f3800f05409ed868ebb2d74ac39dd0c1ff6c035b5162356d76030736d4"}, 335 | {file = "pydantic_core-2.41.4-cp313-cp313-win_arm64.whl", hash = "sha256:f8e49c9c364a7edcbe2a310f12733aad95b022495ef2a8d653f645e5d20c1564"}, 336 | {file = "pydantic_core-2.41.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:ed97fd56a561f5eb5706cebe94f1ad7c13b84d98312a05546f2ad036bafe87f4"}, 337 | {file = "pydantic_core-2.41.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a870c307bf1ee91fc58a9a61338ff780d01bfae45922624816878dce784095d2"}, 338 | {file = "pydantic_core-2.41.4-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d25e97bc1f5f8f7985bdc2335ef9e73843bb561eb1fa6831fdfc295c1c2061cf"}, 339 | {file = "pydantic_core-2.41.4-cp313-cp313t-win_amd64.whl", hash = "sha256:d405d14bea042f166512add3091c1af40437c2e7f86988f3915fabd27b1e9cd2"}, 340 | {file = "pydantic_core-2.41.4-cp313-cp313t-win_arm64.whl", hash = "sha256:19f3684868309db5263a11bace3c45d93f6f24afa2ffe75a647583df22a2ff89"}, 341 | {file = "pydantic_core-2.41.4-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:e9205d97ed08a82ebb9a307e92914bb30e18cdf6f6b12ca4bedadb1588a0bfe1"}, 342 | {file = "pydantic_core-2.41.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:82df1f432b37d832709fbcc0e24394bba04a01b6ecf1ee87578145c19cde12ac"}, 343 | {file = "pydantic_core-2.41.4-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3b4cc4539e055cfa39a3763c939f9d409eb40e85813257dcd761985a108554"}, 344 | {file = "pydantic_core-2.41.4-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b1eb1754fce47c63d2ff57fdb88c351a6c0150995890088b33767a10218eaa4e"}, 345 | {file = "pydantic_core-2.41.4-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e6ab5ab30ef325b443f379ddb575a34969c333004fca5a1daa0133a6ffaad616"}, 346 | {file = "pydantic_core-2.41.4-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:31a41030b1d9ca497634092b46481b937ff9397a86f9f51bd41c4767b6fc04af"}, 347 | {file = "pydantic_core-2.41.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a44ac1738591472c3d020f61c6df1e4015180d6262ebd39bf2aeb52571b60f12"}, 348 | {file = "pydantic_core-2.41.4-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d72f2b5e6e82ab8f94ea7d0d42f83c487dc159c5240d8f83beae684472864e2d"}, 349 | {file = "pydantic_core-2.41.4-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:c4d1e854aaf044487d31143f541f7aafe7b482ae72a022c664b2de2e466ed0ad"}, 350 | {file = "pydantic_core-2.41.4-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:b568af94267729d76e6ee5ececda4e283d07bbb28e8148bb17adad93d025d25a"}, 351 | {file = "pydantic_core-2.41.4-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:6d55fb8b1e8929b341cc313a81a26e0d48aa3b519c1dbaadec3a6a2b4fcad025"}, 352 | {file = "pydantic_core-2.41.4-cp314-cp314-win32.whl", hash = "sha256:5b66584e549e2e32a1398df11da2e0a7eff45d5c2d9db9d5667c5e6ac764d77e"}, 353 | {file = "pydantic_core-2.41.4-cp314-cp314-win_amd64.whl", hash = "sha256:557a0aab88664cc552285316809cab897716a372afaf8efdbef756f8b890e894"}, 354 | {file = "pydantic_core-2.41.4-cp314-cp314-win_arm64.whl", hash = "sha256:3f1ea6f48a045745d0d9f325989d8abd3f1eaf47dd00485912d1a3a63c623a8d"}, 355 | {file = "pydantic_core-2.41.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6c1fe4c5404c448b13188dd8bd2ebc2bdd7e6727fa61ff481bcc2cca894018da"}, 356 | {file = "pydantic_core-2.41.4-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:523e7da4d43b113bf8e7b49fa4ec0c35bf4fe66b2230bfc5c13cc498f12c6c3e"}, 357 | {file = "pydantic_core-2.41.4-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5729225de81fb65b70fdb1907fcf08c75d498f4a6f15af005aabb1fdadc19dfa"}, 358 | {file = "pydantic_core-2.41.4-cp314-cp314t-win_amd64.whl", hash = "sha256:de2cfbb09e88f0f795fd90cf955858fc2c691df65b1f21f0aa00b99f3fbc661d"}, 359 | {file = "pydantic_core-2.41.4-cp314-cp314t-win_arm64.whl", hash = "sha256:d34f950ae05a83e0ede899c595f312ca976023ea1db100cd5aa188f7005e3ab0"}, 360 | {file = "pydantic_core-2.41.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:646e76293345954acea6966149683047b7b2ace793011922208c8e9da12b0062"}, 361 | {file = "pydantic_core-2.41.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cc8e85a63085a137d286e2791037f5fdfff0aabb8b899483ca9c496dd5797338"}, 362 | {file = "pydantic_core-2.41.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:692c622c8f859a17c156492783902d8370ac7e121a611bd6fe92cc71acf9ee8d"}, 363 | {file = "pydantic_core-2.41.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d1e2906efb1031a532600679b424ef1d95d9f9fb507f813951f23320903adbd7"}, 364 | {file = "pydantic_core-2.41.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e04e2f7f8916ad3ddd417a7abdd295276a0bf216993d9318a5d61cc058209166"}, 365 | {file = "pydantic_core-2.41.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df649916b81822543d1c8e0e1d079235f68acdc7d270c911e8425045a8cfc57e"}, 366 | {file = "pydantic_core-2.41.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66c529f862fdba70558061bb936fe00ddbaaa0c647fd26e4a4356ef1d6561891"}, 367 | {file = "pydantic_core-2.41.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fc3b4c5a1fd3a311563ed866c2c9b62da06cb6398bee186484ce95c820db71cb"}, 368 | {file = "pydantic_core-2.41.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6e0fc40d84448f941df9b3334c4b78fe42f36e3bf631ad54c3047a0cdddc2514"}, 369 | {file = "pydantic_core-2.41.4-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:44e7625332683b6c1c8b980461475cde9595eff94447500e80716db89b0da005"}, 370 | {file = "pydantic_core-2.41.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:170ee6835f6c71081d031ef1c3b4dc4a12b9efa6a9540f93f95b82f3c7571ae8"}, 371 | {file = "pydantic_core-2.41.4-cp39-cp39-win32.whl", hash = "sha256:3adf61415efa6ce977041ba9745183c0e1f637ca849773afa93833e04b163feb"}, 372 | {file = "pydantic_core-2.41.4-cp39-cp39-win_amd64.whl", hash = "sha256:a238dd3feee263eeaeb7dc44aea4ba1364682c4f9f9467e6af5596ba322c2332"}, 373 | {file = "pydantic_core-2.41.4-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:a1b2cfec3879afb742a7b0bcfa53e4f22ba96571c9e54d6a3afe1052d17d843b"}, 374 | {file = "pydantic_core-2.41.4-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:d175600d975b7c244af6eb9c9041f10059f20b8bbffec9e33fdd5ee3f67cdc42"}, 375 | {file = "pydantic_core-2.41.4-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f184d657fa4947ae5ec9c47bd7e917730fa1cbb78195037e32dcbab50aca5ee"}, 376 | {file = "pydantic_core-2.41.4-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ed810568aeffed3edc78910af32af911c835cc39ebbfacd1f0ab5dd53028e5c"}, 377 | {file = "pydantic_core-2.41.4-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:4f5d640aeebb438517150fdeec097739614421900e4a08db4a3ef38898798537"}, 378 | {file = "pydantic_core-2.41.4-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:4a9ab037b71927babc6d9e7fc01aea9e66dc2a4a34dff06ef0724a4049629f94"}, 379 | {file = "pydantic_core-2.41.4-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4dab9484ec605c3016df9ad4fd4f9a390bc5d816a3b10c6550f8424bb80b18c"}, 380 | {file = "pydantic_core-2.41.4-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8a5028425820731d8c6c098ab642d7b8b999758e24acae03ed38a66eca8335"}, 381 | {file = "pydantic_core-2.41.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:1e5ab4fc177dd41536b3c32b2ea11380dd3d4619a385860621478ac2d25ceb00"}, 382 | {file = "pydantic_core-2.41.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:3d88d0054d3fa11ce936184896bed3c1c5441d6fa483b498fac6a5d0dd6f64a9"}, 383 | {file = "pydantic_core-2.41.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b2a054a8725f05b4b6503357e0ac1c4e8234ad3b0c2ac130d6ffc66f0e170e2"}, 384 | {file = "pydantic_core-2.41.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b0d9db5a161c99375a0c68c058e227bee1d89303300802601d76a3d01f74e258"}, 385 | {file = "pydantic_core-2.41.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:6273ea2c8ffdac7b7fda2653c49682db815aebf4a89243a6feccf5e36c18c347"}, 386 | {file = "pydantic_core-2.41.4-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:4c973add636efc61de22530b2ef83a65f39b6d6f656df97f678720e20de26caa"}, 387 | {file = "pydantic_core-2.41.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b69d1973354758007f46cf2d44a4f3d0933f10b6dc9bf15cf1356e037f6f731a"}, 388 | {file = "pydantic_core-2.41.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:3619320641fd212aaf5997b6ca505e97540b7e16418f4a241f44cdf108ffb50d"}, 389 | {file = "pydantic_core-2.41.4-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:491535d45cd7ad7e4a2af4a5169b0d07bebf1adfd164b0368da8aa41e19907a5"}, 390 | {file = "pydantic_core-2.41.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:54d86c0cada6aba4ec4c047d0e348cbad7063b87ae0f005d9f8c9ad04d4a92a2"}, 391 | {file = "pydantic_core-2.41.4-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eca1124aced216b2500dc2609eade086d718e8249cb9696660ab447d50a758bd"}, 392 | {file = "pydantic_core-2.41.4-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6c9024169becccf0cb470ada03ee578d7348c119a0d42af3dcf9eda96e3a247c"}, 393 | {file = "pydantic_core-2.41.4-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:26895a4268ae5a2849269f4991cdc97236e4b9c010e51137becf25182daac405"}, 394 | {file = "pydantic_core-2.41.4-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:ca4df25762cf71308c446e33c9b1fdca2923a3f13de616e2a949f38bf21ff5a8"}, 395 | {file = "pydantic_core-2.41.4-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:5a28fcedd762349519276c36634e71853b4541079cab4acaaac60c4421827308"}, 396 | {file = "pydantic_core-2.41.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c173ddcd86afd2535e2b695217e82191580663a1d1928239f877f5a1649ef39f"}, 397 | {file = "pydantic_core-2.41.4.tar.gz", hash = "sha256:70e47929a9d4a1905a67e4b687d5946026390568a8e952b92824118063cee4d5"}, 398 | ] 399 | 400 | [package.dependencies] 401 | typing-extensions = ">=4.14.1" 402 | 403 | [[package]] 404 | name = "pygments" 405 | version = "2.19.2" 406 | description = "Pygments is a syntax highlighting package written in Python." 407 | optional = false 408 | python-versions = ">=3.8" 409 | groups = ["dev"] 410 | files = [ 411 | {file = "pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b"}, 412 | {file = "pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887"}, 413 | ] 414 | 415 | [package.extras] 416 | windows-terminal = ["colorama (>=0.4.6)"] 417 | 418 | [[package]] 419 | name = "pytest" 420 | version = "8.4.2" 421 | description = "pytest: simple powerful testing with Python" 422 | optional = false 423 | python-versions = ">=3.9" 424 | groups = ["dev"] 425 | files = [ 426 | {file = "pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79"}, 427 | {file = "pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01"}, 428 | ] 429 | 430 | [package.dependencies] 431 | colorama = {version = ">=0.4", markers = "sys_platform == \"win32\""} 432 | iniconfig = ">=1" 433 | packaging = ">=20" 434 | pluggy = ">=1.5,<2" 435 | pygments = ">=2.7.2" 436 | 437 | [package.extras] 438 | dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "requests", "setuptools", "xmlschema"] 439 | 440 | [[package]] 441 | name = "pytokens" 442 | version = "0.2.0" 443 | description = "A Fast, spec compliant Python 3.13+ tokenizer that runs on older Pythons." 444 | optional = false 445 | python-versions = ">=3.8" 446 | groups = ["dev"] 447 | files = [ 448 | {file = "pytokens-0.2.0-py3-none-any.whl", hash = "sha256:74d4b318c67f4295c13782ddd9abcb7e297ec5630ad060eb90abf7ebbefe59f8"}, 449 | {file = "pytokens-0.2.0.tar.gz", hash = "sha256:532d6421364e5869ea57a9523bf385f02586d4662acbcc0342afd69511b4dd43"}, 450 | ] 451 | 452 | [package.extras] 453 | dev = ["black", "build", "mypy", "pytest", "pytest-cov", "setuptools", "tox", "twine", "wheel"] 454 | 455 | [[package]] 456 | name = "sniffio" 457 | version = "1.3.1" 458 | description = "Sniff out which async library your code is running under" 459 | optional = false 460 | python-versions = ">=3.7" 461 | groups = ["main"] 462 | files = [ 463 | {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, 464 | {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, 465 | ] 466 | 467 | [[package]] 468 | name = "starlette" 469 | version = "0.49.1" 470 | description = "The little ASGI library that shines." 471 | optional = false 472 | python-versions = ">=3.9" 473 | groups = ["main"] 474 | files = [ 475 | {file = "starlette-0.49.1-py3-none-any.whl", hash = "sha256:d92ce9f07e4a3caa3ac13a79523bd18e3bc0042bb8ff2d759a8e7dd0e1859875"}, 476 | {file = "starlette-0.49.1.tar.gz", hash = "sha256:481a43b71e24ed8c43b11ea02f5353d77840e01480881b8cb5a26b8cae64a8cb"}, 477 | ] 478 | 479 | [package.dependencies] 480 | anyio = ">=3.6.2,<5" 481 | 482 | [package.extras] 483 | full = ["httpx (>=0.27.0,<0.29.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.18)", "pyyaml"] 484 | 485 | [[package]] 486 | name = "typing-extensions" 487 | version = "4.15.0" 488 | description = "Backported and Experimental Type Hints for Python 3.9+" 489 | optional = false 490 | python-versions = ">=3.9" 491 | groups = ["main"] 492 | files = [ 493 | {file = "typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"}, 494 | {file = "typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466"}, 495 | ] 496 | 497 | [[package]] 498 | name = "typing-inspection" 499 | version = "0.4.2" 500 | description = "Runtime typing introspection tools" 501 | optional = false 502 | python-versions = ">=3.9" 503 | groups = ["main"] 504 | files = [ 505 | {file = "typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7"}, 506 | {file = "typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464"}, 507 | ] 508 | 509 | [package.dependencies] 510 | typing-extensions = ">=4.12.0" 511 | 512 | [[package]] 513 | name = "uvicorn" 514 | version = "0.38.0" 515 | description = "The lightning-fast ASGI server." 516 | optional = false 517 | python-versions = ">=3.9" 518 | groups = ["main"] 519 | files = [ 520 | {file = "uvicorn-0.38.0-py3-none-any.whl", hash = "sha256:48c0afd214ceb59340075b4a052ea1ee91c16fbc2a9b1469cca0e54566977b02"}, 521 | {file = "uvicorn-0.38.0.tar.gz", hash = "sha256:fd97093bdd120a2609fc0d3afe931d4d4ad688b6e75f0f929fde1bc36fe0e91d"}, 522 | ] 523 | 524 | [package.dependencies] 525 | click = ">=7.0" 526 | h11 = ">=0.8" 527 | 528 | [package.extras] 529 | standard = ["colorama (>=0.4) ; sys_platform == \"win32\"", "httptools (>=0.6.3)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.15.1) ; sys_platform != \"win32\" and sys_platform != \"cygwin\" and platform_python_implementation != \"PyPy\"", "watchfiles (>=0.13)", "websockets (>=10.4)"] 530 | 531 | [metadata] 532 | lock-version = "2.1" 533 | python-versions = "^3.13" 534 | content-hash = "9b8680f2960908b9acf2facaad95f50d7967a6f8ae3aa90a1ab6e84749afb572" 535 | -------------------------------------------------------------------------------- /dataanalysis/google_stock_price.csv: -------------------------------------------------------------------------------- 1 | Stock Price 2 | 50.12 3 | 54.1 4 | 54.65 5 | 52.38 6 | 52.95 7 | 53.9 8 | 53.02 9 | 50.95 10 | 51.13 11 | 50.07 12 | 50.7 13 | 49.95 14 | 50.74 15 | 51.1 16 | 51.1 17 | 52.61 18 | 53.7 19 | 55.69 20 | 55.94 21 | 56.93 22 | 58.69 23 | 59.62 24 | 58.86 25 | 59.13 26 | 60.35 27 | 59.86 28 | 59.07 29 | 63.37 30 | 65.47 31 | 64.74 32 | 66.22 33 | 67.46 34 | 69.12 35 | 68.47 36 | 69.36 37 | 68.8 38 | 67.56 39 | 68.63 40 | 70.38 41 | 70.93 42 | 71.98 43 | 74.51 44 | 73.9 45 | 70.17 46 | 74.62 47 | 86.13 48 | 93.61 49 | 90.81 50 | 92.89 51 | 96.55 52 | 95.22 53 | 97.92 54 | 97.34 55 | 95.74 56 | 92.26 57 | 84.59 58 | 86.19 59 | 84.27 60 | 83.85 61 | 91.42 62 | 90.91 63 | 92.34 64 | 86.19 65 | 86.16 66 | 83.69 67 | 84.62 68 | 82.47 69 | 83.68 70 | 87.29 71 | 89.61 72 | 90.43 73 | 90.9 74 | 89.89 75 | 89.61 76 | 90.11 77 | 88.06 78 | 85.63 79 | 84.91 80 | 86.63 81 | 85.74 82 | 85.14 83 | 89.26 84 | 89.8 85 | 88.15 86 | 89.95 87 | 92.42 88 | 91.78 89 | 93.06 90 | 93.86 91 | 95.86 92 | 96.28 93 | 96.35 94 | 98.7 95 | 96.3 96 | 101.25 97 | 97.15 98 | 96.66 99 | 94.18 100 | 96.83 101 | 97.43 102 | 96.67 103 | 97.59 104 | 97.57 105 | 99.89 106 | 101.85 107 | 98.55 108 | 96.86 109 | 94.05 110 | 90.27 111 | 88.47 112 | 94.53 113 | 93.95 114 | 95.07 115 | 97.71 116 | 95.85 117 | 102.88 118 | 105.32 119 | 102.08 120 | 97.92 121 | 99.22 122 | 95.69 123 | 93.9 124 | 93.61 125 | 96.4 126 | 97.52 127 | 99.11 128 | 98.85 129 | 98.88 130 | 95.59 131 | 96.88 132 | 94.35 133 | 92.84 134 | 93.9 135 | 92.94 136 | 92.5 137 | 93.41 138 | 92.86 139 | 94.31 140 | 92.51 141 | 90.58 142 | 89.9 143 | 88.81 144 | 87.41 145 | 89.22 146 | 87.71 147 | 89.56 148 | 89.93 149 | 90.35 150 | 89.21 151 | 89.4 152 | 89.54 153 | 90.62 154 | 89.7 155 | 90.13 156 | 90.16 157 | 89.93 158 | 92.55 159 | 94.19 160 | 94.52 161 | 96.78 162 | 95.93 163 | 96.52 164 | 96.88 165 | 96.37 166 | 95.63 167 | 92.41 168 | 93.39 169 | 95.6 170 | 98.95 171 | 102.01 172 | 107.8 173 | 111.65 174 | 109.27 175 | 109.78 176 | 109.62 177 | 109.89 178 | 111.03 179 | 112.98 180 | 114.14 181 | 113.38 182 | 113.9 183 | 112.9 184 | 113.79 185 | 115.53 186 | 114.25 187 | 114.51 188 | 115.41 189 | 116.45 190 | 119.46 191 | 119.47 192 | 120.68 193 | 127.6 194 | 127.87 195 | 130.27 196 | 129.47 197 | 132.87 198 | 138.5 199 | 143.86 200 | 143.81 201 | 139.99 202 | 145.32 203 | 146.41 204 | 139.64 205 | 143.01 206 | 141.11 207 | 141.23 208 | 139.04 209 | 137.26 210 | 138.58 211 | 140 212 | 143.21 213 | 143.78 214 | 144.51 215 | 144.71 216 | 148.48 217 | 151.9 218 | 150.85 219 | 146.21 220 | 146.93 221 | 145.48 222 | 147.71 223 | 145.62 224 | 147.62 225 | 147.97 226 | 146.53 227 | 145.75 228 | 149.28 229 | 150.29 230 | 150.44 231 | 149.62 232 | 154.8 233 | 155.84 234 | 156.81 235 | 151.05 236 | 147.78 237 | 147.9 238 | 148.32 239 | 146.6 240 | 143.74 241 | 145.66 242 | 149.45 243 | 148.5 244 | 148.72 245 | 146.03 246 | 145.48 247 | 145.64 248 | 142.7 249 | 141.88 250 | 144.72 251 | 141.86 252 | 142.68 253 | 142.41 254 | 139.86 255 | 139.86 256 | 136.87 257 | 139.65 258 | 141.14 259 | 141.15 260 | 141.65 261 | 144.08 262 | 143.49 263 | 142.86 264 | 142.98 265 | 144.08 266 | 143.41 267 | 147.29 268 | 147.55 269 | 149.4 270 | 154.72 271 | 155.68 272 | 151.35 273 | 151.16 274 | 149.95 275 | 151.74 276 | 153.8 277 | 155.79 278 | 155.53 279 | 157.52 280 | 156.98 281 | 156.81 282 | 152.85 283 | 154.66 284 | 158.07 285 | 159.18 286 | 155.34 287 | 155.2 288 | 156.22 289 | 156.34 290 | 155.17 291 | 152.9 292 | 150.33 293 | 148.57 294 | 147.92 295 | 152.35 296 | 151.49 297 | 154.2 298 | 151.45 299 | 169.78 300 | 174.15 301 | 173.28 302 | 177.54 303 | 176.35 304 | 178.91 305 | 185.88 306 | 189.5 307 | 189.65 308 | 192.78 309 | 195.02 310 | 197.32 311 | 194.76 312 | 189.39 313 | 195.35 314 | 195 315 | 198.29 316 | 196.2 317 | 198.88 318 | 201.52 319 | 199.9 320 | 204.48 321 | 208.03 322 | 211.22 323 | 214.1 324 | 211.53 325 | 201.57 326 | 202.25 327 | 206.84 328 | 208.64 329 | 202.72 330 | 202.07 331 | 201.91 332 | 205.12 333 | 204.4 334 | 206.1 335 | 208.54 336 | 209.27 337 | 211.05 338 | 214.86 339 | 212.09 340 | 214.66 341 | 212.95 342 | 215.8 343 | 215.25 344 | 212.11 345 | 213.13 346 | 209.86 347 | 207.22 348 | 217.4 349 | 222.4 350 | 225.39 351 | 232.6 352 | 233.22 353 | 234.65 354 | 235.58 355 | 231.58 356 | 232.89 357 | 233.32 358 | 222.23 359 | 218 360 | 199.53 361 | 213.54 362 | 221.29 363 | 216.28 364 | 216.92 365 | 216.53 366 | 213.2 367 | 216.11 368 | 200.69 369 | 197.82 370 | 190.59 371 | 192.36 372 | 183.78 373 | 184.36 374 | 179.21 375 | 181.12 376 | 172.68 377 | 171.49 378 | 171.02 379 | 183.05 380 | 184.19 381 | 183.11 382 | 182.56 383 | 188.85 384 | 188.51 385 | 194.99 386 | 181.13 387 | 182.22 388 | 188.04 389 | 188.9 390 | 183.87 391 | 182.04 392 | 176.76 393 | 171.33 394 | 168.58 395 | 168.36 396 | 175.4 397 | 172.08 398 | 169.22 399 | 169.73 400 | 173.92 401 | 169.79 402 | 169.94 403 | 170.77 404 | 182.72 405 | 184.66 406 | 188.41 407 | 197.29 408 | 194.03 409 | 194.8 410 | 194.66 411 | 201.97 412 | 203.79 413 | 205.38 414 | 202.88 415 | 207.98 416 | 204.63 417 | 204.27 418 | 200.88 419 | 203.21 420 | 201.92 421 | 205.04 422 | 207.29 423 | 218.33 424 | 220.03 425 | 213.37 426 | 212.77 427 | 209.8 428 | 208.76 429 | 199.25 430 | 197.2 431 | 196.89 432 | 197.18 433 | 196.95 434 | 197.19 435 | 204.2 436 | 201.29 437 | 193.31 438 | 186.88 439 | 187.91 440 | 185.46 441 | 187.06 442 | 185.31 443 | 184.82 444 | 185.29 445 | 187.6 446 | 190.43 447 | 191.3 448 | 190.48 449 | 185.78 450 | 185.72 451 | 191.12 452 | 189.53 453 | 187.03 454 | 194.8 455 | 193.06 456 | 196.45 457 | 193.09 458 | 190.58 459 | 193.07 460 | 192 461 | 195.3 462 | 195.15 463 | 193.88 464 | 193.39 465 | 200.86 466 | 199.78 467 | 202.23 468 | 201.91 469 | 200.96 470 | 202.85 471 | 208.7 472 | 209.46 473 | 211.39 474 | 210.52 475 | 211.38 476 | 210.01 477 | 208.89 478 | 212.07 479 | 208.42 480 | 204.21 481 | 201.55 482 | 203.74 483 | 201.32 484 | 199.3 485 | 193.37 486 | 194.86 487 | 195.25 488 | 194.49 489 | 192.56 490 | 191.01 491 | 193.87 492 | 193.11 493 | 187.57 494 | 183.43 495 | 187.51 496 | 186.74 497 | 188.79 498 | 190.31 499 | 188.28 500 | 186.91 501 | 184.07 502 | 184.53 503 | 190.29 504 | 193.67 505 | 192.71 506 | 191.49 507 | 188.46 508 | 188.96 509 | 186.53 510 | 186.68 511 | 186.44 512 | 190.28 513 | 189.29 514 | 190.18 515 | 189.08 516 | 189.11 517 | 191.99 518 | 189.88 519 | 189.06 520 | 188.74 521 | 191.85 522 | 195.75 523 | 203.08 524 | 201.79 525 | 204.74 526 | 207.14 527 | 201.7 528 | 198.3 529 | 203.22 530 | 201.69 531 | 201.79 532 | 203.23 533 | 201.26 534 | 201.59 535 | 200.75 536 | 200.52 537 | 201.82 538 | 207.64 539 | 205.7 540 | 210.04 541 | 214.29 542 | 213.11 543 | 213.04 544 | 213.51 545 | 213.44 546 | 210.66 547 | 210.11 548 | 209.44 549 | 212.82 550 | 229.61 551 | 240.15 552 | 236.42 553 | 243.06 554 | 242.31 555 | 237.36 556 | 238.05 557 | 237.96 558 | 233.52 559 | 234.72 560 | 235.66 561 | 238.24 562 | 236.05 563 | 237.26 564 | 236.08 565 | 236.54 566 | 240.27 567 | 244.41 568 | 245.72 569 | 247.7 570 | 249.15 571 | 247.28 572 | 254.57 573 | 253.75 574 | 252.2 575 | 242.13 576 | 244.51 577 | 242.08 578 | 242.16 579 | 240.16 580 | 242.18 581 | 243.26 582 | 244.11 583 | 241.08 584 | 241.81 585 | 241.72 586 | 240.65 587 | 239.26 588 | 240.82 589 | 239.91 590 | 231.17 591 | 234.08 592 | 231.22 593 | 227.87 594 | 227.56 595 | 228.54 596 | 233.78 597 | 231.05 598 | 230.01 599 | 233.56 600 | 241.39 601 | 243.35 602 | 241.55 603 | 242.51 604 | 244.49 605 | 249.61 606 | 252.25 607 | 251.89 608 | 248.39 609 | 243.67 610 | 244.63 611 | 240.18 612 | 239.29 613 | 249.28 614 | 243.8 615 | 247.67 616 | 245.99 617 | 246.91 618 | 250.5 619 | 240.63 620 | 240.51 621 | 233.35 622 | 235.5 623 | 234.77 624 | 235.28 625 | 230.71 626 | 228.92 627 | 229.32 628 | 232.73 629 | 230.5 630 | 234.74 631 | 235.81 632 | 237.69 633 | 237.69 634 | 235.07 635 | 232.23 636 | 224.16 637 | 224.5 638 | 223.89 639 | 219.12 640 | 220.25 641 | 228.55 642 | 227.59 643 | 227.13 644 | 226.25 645 | 227.15 646 | 221.29 647 | 223.78 648 | 222.87 649 | 220.2 650 | 223.39 651 | 222.42 652 | 228.05 653 | 230.79 654 | 230.68 655 | 232.27 656 | 231.58 657 | 230.71 658 | 230.23 659 | 228.85 660 | 229.04 661 | 236.06 662 | 235.27 663 | 235.52 664 | 233.87 665 | 233.02 666 | 232.03 667 | 233.46 668 | 232.91 669 | 236.9 670 | 236.16 671 | 237.77 672 | 235.59 673 | 241 674 | 239.3 675 | 238.53 676 | 238.76 677 | 240.35 678 | 239.27 679 | 235.45 680 | 234.27 681 | 232.66 682 | 236.38 683 | 235.32 684 | 233.4 685 | 233.17 686 | 234.39 687 | 230.5 688 | 233.14 689 | 230.66 690 | 228.77 691 | 236.07 692 | 235.24 693 | 234.92 694 | 235.06 695 | 237.69 696 | 236.75 697 | 236.93 698 | 241.52 699 | 243.31 700 | 249.05 701 | 248.71 702 | 249.95 703 | 253.28 704 | 259.16 705 | 258.87 706 | 257.27 707 | 257.49 708 | 255.41 709 | 252.13 710 | 252.37 711 | 251.17 712 | 252.69 713 | 257.34 714 | 256.9 715 | 254.73 716 | 256.8 717 | 262.23 718 | 263.45 719 | 264.86 720 | 262.88 721 | 262.24 722 | 261.09 723 | 264.92 724 | 266.9 725 | 270.54 726 | 269.43 727 | 271.01 728 | 271.4 729 | 271.96 730 | 272.39 731 | 275.8 732 | 276.22 733 | 277.22 734 | 274.48 735 | 274.02 736 | 259.8 737 | 256 738 | 256.74 739 | 254.63 740 | 253.75 741 | 255.69 742 | 257.8 743 | 254.74 744 | 256.21 745 | 255.25 746 | 251.25 747 | 254.74 748 | 257.75 749 | 262.63 750 | 257.11 751 | 257.62 752 | 257.49 753 | 254.05 754 | 248.53 755 | 245.51 756 | 249.77 757 | 248.71 758 | 253.05 759 | 256.12 760 | 255.84 761 | 257.24 762 | 256.37 763 | 252.95 764 | 256.18 765 | 255.44 766 | 257.37 767 | 262.31 768 | 263.64 769 | 261.5 770 | 259.42 771 | 256.98 772 | 260.4 773 | 261.06 774 | 262.13 775 | 264.11 776 | 262.39 777 | 267.37 778 | 273.15 779 | 276.14 780 | 279.77 781 | 283.73 782 | 284.22 783 | 283.8 784 | 283.47 785 | 283.35 786 | 290.98 787 | 291.9 788 | 291.72 789 | 289.23 790 | 296.73 791 | 304.51 792 | 307.28 793 | 312.38 794 | 310.69 795 | 318.38 796 | 309.74 797 | 307.69 798 | 316.42 799 | 319.49 800 | 322.03 801 | 325.05 802 | 337.55 803 | 337.57 804 | 333.92 805 | 336.96 806 | 339.28 807 | 347.04 808 | 353.15 809 | 351.25 810 | 355.27 811 | 362.46 812 | 370.52 813 | 366.1 814 | 346.57 815 | 331.65 816 | 315.72 817 | 329.94 818 | 320.52 819 | 314.51 820 | 316.5 821 | 312.61 822 | 323.95 823 | 329.93 824 | 338.01 825 | 332.7 826 | 336.45 827 | 345.78 828 | 348.15 829 | 346.15 830 | 340.42 831 | 341.74 832 | 348.91 833 | 357.27 834 | 357.08 835 | 358.85 836 | 349.25 837 | 349.33 838 | 346.68 839 | 344.64 840 | 334.28 841 | 336.34 842 | 338.35 843 | 344.5 844 | 348 845 | 350.01 846 | 355.06 847 | 350.02 848 | 350.91 849 | 345.39 850 | 342.25 851 | 342.32 852 | 328.17 853 | 324.3 854 | 315.52 855 | 326.27 856 | 323.04 857 | 318.81 858 | 326.58 859 | 318.51 860 | 307.67 861 | 300.09 862 | 299.82 863 | 291.88 864 | 274.04 865 | 286.96 866 | 282.92 867 | 277.71 868 | 274.98 869 | 273.86 870 | 281.87 871 | 257.69 872 | 247.47 873 | 253.15 874 | 250.6 875 | 252.22 876 | 258.09 877 | 260.32 878 | 258.79 879 | 267.04 880 | 265.86 881 | 264.56 882 | 254.22 883 | 254.25 884 | 251.18 885 | 253.65 886 | 242.98 887 | 231.86 888 | 236.19 889 | 237.46 890 | 235.35 891 | 228.28 892 | 222.08 893 | 223.63 894 | 216.13 895 | 216.46 896 | 206.6 897 | 219.7 898 | 219.87 899 | 221.28 900 | 218.74 901 | 209.73 902 | 219.36 903 | 215.78 904 | 216.56 905 | 230.05 906 | 225.16 907 | 228.87 908 | 221.82 909 | 218.82 910 | 220.01 911 | 232.62 912 | 232.62 913 | 227.33 914 | 235.31 915 | 238.17 916 | 233.67 917 | 231.86 918 | 234.3 919 | 228.5 920 | 225.6 921 | 223.2 922 | 227.29 923 | 224.55 924 | 269.44 925 | 268.63 926 | 277.22 927 | 272.97 928 | 271.25 929 | 271.76 930 | 275.78 931 | 278.96 932 | 286.86 933 | 296.24 934 | 290.35 935 | 297.15 936 | 292.89 937 | 289.21 938 | 291.21 939 | 286.3 940 | 292.18 941 | 291.21 942 | 287.86 943 | 290.21 944 | 289.74 945 | 288.47 946 | 289.01 947 | 274.72 948 | 274.46 949 | 272.04 950 | 280.17 951 | 283.84 952 | 291.21 953 | 292.61 954 | 287.21 955 | 283.37 956 | 285.82 957 | 292.86 958 | 283.22 959 | 278.66 960 | 276.81 961 | 272.33 962 | 276.2 963 | 285.47 964 | 286.12 965 | 284.45 966 | 280.91 967 | 279.82 968 | 272.94 969 | 272.33 970 | 270.88 971 | 275.22 972 | 264.15 973 | 263.77 974 | 262.95 975 | 267.1 976 | 263.26 977 | 268.23 978 | 271.68 979 | 276.99 980 | 270.5 981 | 270.02 982 | 266.63 983 | 260.55 984 | 257.79 985 | 267.53 986 | 266.45 987 | 240.42 988 | 234.17 989 | 238.32 990 | 244.37 991 | 237.57 992 | 245.74 993 | 238.32 994 | 241.31 995 | 241.11 996 | 236.64 997 | 233.7 998 | 231.27 999 | 239.69 1000 | 242.93 1001 | 239.32 1002 | 247.26 1003 | 250.17 1004 | 251.05 1005 | 249.76 1006 | 252.49 1007 | 254.82 1008 | 248.9 1009 | 245 1010 | 242.26 1011 | 243.02 1012 | 245.05 1013 | 241.26 1014 | 236.84 1015 | 234.06 1016 | 236.65 1017 | 231.41 1018 | 232.39 1019 | 231.97 1020 | 224.9 1021 | 221.9 1022 | 209.76 1023 | 209.12 1024 | 206.87 1025 | 216.66 1026 | 218.61 1027 | 216.71 1028 | 221.24 1029 | 207.04 1030 | 219.32 1031 | 224.35 1032 | 214.85 1033 | 214.42 1034 | 217.34 1035 | 219.58 1036 | 215.3 1037 | 190.31 1038 | 200.06 1039 | 205.65 1040 | 195.05 1041 | 193.26 1042 | 185.42 1043 | 172.83 1044 | 168.89 1045 | 164.33 1046 | 165.83 1047 | 190.32 1048 | 181.17 1049 | 169.42 1050 | 176.33 1051 | 186.08 1052 | 189.47 1053 | 181.19 1054 | 177.66 1055 | 175.98 1056 | 169.48 1057 | 164.58 1058 | 184.19 1059 | 178.82 1060 | 179.67 1061 | 179.5 1062 | 173.07 1063 | 183.29 1064 | 170.95 1065 | 165.44 1066 | 165.4 1067 | 159.23 1068 | 155.57 1069 | 145.35 1070 | 155.88 1071 | 154.85 1072 | 149.91 1073 | 148.56 1074 | 139.95 1075 | 129.65 1076 | 131.08 1077 | 128.59 1078 | 140.88 1079 | 145.9 1080 | 146.33 1081 | 132.86 1082 | 137.42 1083 | 139.58 1084 | 137.03 1085 | 141.85 1086 | 150.9 1087 | 152.83 1088 | 154.26 1089 | 149.96 1090 | 157.72 1091 | 155.18 1092 | 162.48 1093 | 157.46 1094 | 154.98 1095 | 154.93 1096 | 148.41 1097 | 148.86 1098 | 151.32 1099 | 150.03 1100 | 148.56 1101 | 151.4 1102 | 153.67 1103 | 160.5 1104 | 163.86 1105 | 166.86 1106 | 160.84 1107 | 162.43 1108 | 157.38 1109 | 156.19 1110 | 157 1111 | 150.33 1112 | 149.35 1113 | 149.69 1114 | 141.23 1115 | 151.39 1116 | 153.1 1117 | 162.19 1118 | 161.77 1119 | 165.57 1120 | 174.16 1121 | 171.49 1122 | 169.1 1123 | 170.11 1124 | 170.05 1125 | 171.33 1126 | 176.68 1127 | 185.45 1128 | 189.2 1129 | 179.08 1130 | 178.84 1131 | 181.34 1132 | 178.66 1133 | 171.16 1134 | 176.38 1135 | 171.15 1136 | 173.05 1137 | 164.86 1138 | 172.55 1139 | 170.65 1140 | 168.42 1141 | 168.83 1142 | 163.42 1143 | 162.58 1144 | 159.3 1145 | 152.67 1146 | 154.13 1147 | 145.3 1148 | 153.93 1149 | 158.8 1150 | 161.6 1151 | 162.05 1152 | 159.69 1153 | 167.5 1154 | 166.38 1155 | 164.81 1156 | 164.91 1157 | 174.13 1158 | 173.41 1159 | 171.86 1160 | 176.47 1161 | 173.68 1162 | 171.17 1163 | 173.86 1164 | 176.87 1165 | 181.07 1166 | 184.71 1167 | 183.94 1168 | 179.15 1169 | 180.82 1170 | 186.06 1171 | 188.87 1172 | 184.27 1173 | 189.56 1174 | 194.18 1175 | 195.92 1176 | 189.46 1177 | 190.54 1178 | 191.74 1179 | 192.15 1180 | 194.55 1181 | 192.78 1182 | 191.66 1183 | 195.54 1184 | 197.79 1185 | 196.65 1186 | 200.79 1187 | 201.29 1188 | 201.53 1189 | 198.11 1190 | 203.46 1191 | 203.79 1192 | 199.31 1193 | 194.58 1194 | 193.56 1195 | 194.8 1196 | 198.22 1197 | 199.24 1198 | 198.39 1199 | 198.05 1200 | 196.55 1201 | 201.98 1202 | 202.58 1203 | 204.99 1204 | 208.41 1205 | 213.07 1206 | 213.99 1207 | 215.61 1208 | 219.92 1209 | 221.94 1210 | 219.17 1211 | 217.59 1212 | 216.08 1213 | 214.29 1214 | 212.21 1215 | 208.18 1216 | 207.79 1217 | 207.37 1218 | 206.82 1219 | 209.83 1220 | 203.47 1221 | 202.64 1222 | 204.44 1223 | 207.68 1224 | 212.45 1225 | 211.86 1226 | 210.58 1227 | 209.29 1228 | 204.04 1229 | 204.6 1230 | 198.12 1231 | 201.04 1232 | 204.99 1233 | 206.99 1234 | 211.94 1235 | 212.13 1236 | 218.87 1237 | 221.08 1238 | 214.91 1239 | 214.87 1240 | 213.74 1241 | 213.63 1242 | 218.45 1243 | 223.14 1244 | 222.18 1245 | 219.71 1246 | 217.9 1247 | 222.6 1248 | 221.3 1249 | 225.88 1250 | 226.64 1251 | 225.34 1252 | 224.95 1253 | 228.32 1254 | 228.08 1255 | 226.74 1256 | 229.06 1257 | 230.91 1258 | 229.77 1259 | 222.22 1260 | 222.42 1261 | 221.76 1262 | 229.97 1263 | 232.39 1264 | 234.13 1265 | 235.45 1266 | 233.77 1267 | 232.8 1268 | 232.14 1269 | 230.6 1270 | 227.65 1271 | 226.28 1272 | 228.53 1273 | 230.42 1274 | 229.08 1275 | 231.75 1276 | 235.23 1277 | 235.83 1278 | 237.32 1279 | 238.53 1280 | 243.9 1281 | 245.61 1282 | 245.48 1283 | 248.25 1284 | 249.28 1285 | 248.98 1286 | 248.14 1287 | 245.99 1288 | 249.02 1289 | 249.02 1290 | 247.68 1291 | 243.36 1292 | 242.05 1293 | 244.02 1294 | 249.12 1295 | 258.51 1296 | 256.83 1297 | 257.87 1298 | 261.76 1299 | 262.79 1300 | 267.39 1301 | 264.69 1302 | 274.65 1303 | 275.77 1304 | 275.58 1305 | 275.27 1306 | 276.77 1307 | 276.57 1308 | 276.83 1309 | 273.87 1310 | 269.88 1311 | 275.25 1312 | 267.79 1313 | 266.73 1314 | 268.38 1315 | 269.89 1316 | 274.05 1317 | 275.27 1318 | 280.97 1319 | 283.1 1320 | 284.99 1321 | 283.64 1322 | 285.74 1323 | 287.85 1324 | 288.46 1325 | 288.04 1326 | 286.21 1327 | 284.7 1328 | 290.88 1329 | 291.25 1330 | 292.58 1331 | 289.59 1332 | 291.21 1333 | 294.64 1334 | 293.46 1335 | 292.58 1336 | 292.21 1337 | 292.83 1338 | 293.23 1339 | 294.22 1340 | 295.45 1341 | 294.96 1342 | 297.57 1343 | 296.27 1344 | 298.58 1345 | 296.67 1346 | 297.91 1347 | 299.04 1348 | 300.26 1349 | 305.53 1350 | 308.93 1351 | 311.12 1352 | 309.39 1353 | 311.05 1354 | 309.68 1355 | 313.06 1356 | 311.68 1357 | 303.83 1358 | 296.75 1359 | 300.71 1360 | 300.25 1361 | 294.94 1362 | 293.25 1363 | 294.63 1364 | 289.71 1365 | 293.52 1366 | 289.91 1367 | 291.2 1368 | 274.73 1369 | 269.73 1370 | 270.94 1371 | 270.78 1372 | 266.88 1373 | 264.71 1374 | 266.24 1375 | 265.29 1376 | 270.14 1377 | 263.13 1378 | 265.38 1379 | 266.47 1380 | 267.95 1381 | 266.96 1382 | 267.93 1383 | 266.29 1384 | 270.38 1385 | 268.83 1386 | 271.34 1387 | 270.11 1388 | 271.13 1389 | 267.27 1390 | 265.47 1391 | 262.95 1392 | 263.14 1393 | 266.08 1394 | 270.26 1395 | 272.39 1396 | 277.02 1397 | 281.82 1398 | 280.96 1399 | 279.81 1400 | 287.94 1401 | 290.28 1402 | 289.48 1403 | 281.31 1404 | 282.32 1405 | 282.5 1406 | 282.92 1407 | 279.72 1408 | 278.47 1409 | 274.23 1410 | 278.39 1411 | 281.16 1412 | 281.06 1413 | 280.94 1414 | 283.07 1415 | 283.28 1416 | 285.22 1417 | 283.83 1418 | 281.49 1419 | 283.46 1420 | 282.83 1421 | 286.08 1422 | 293.09 1423 | 294.21 1424 | 297.35 1425 | 274.8 1426 | 274.77 1427 | 277.24 1428 | 276.87 1429 | 273.26 1430 | 272.22 1431 | 265.55 1432 | 264.26 1433 | 264.33 1434 | 265.73 1435 | 262.58 1436 | 265.03 1437 | 252.93 1438 | 254.63 1439 | 249.09 1440 | 246.32 1441 | 260.56 1442 | 254.27 1443 | 252.44 1444 | 255.18 1445 | 253.51 1446 | 253.73 1447 | 248.94 1448 | 246.97 1449 | 237.27 1450 | 235.79 1451 | 238.34 1452 | 238.3 1453 | 237.5 1454 | 244.98 1455 | 242.57 1456 | 240.94 1457 | 246.44 1458 | 252.55 1459 | 249.11 1460 | 242.52 1461 | 242.15 1462 | 236.77 1463 | 243.26 1464 | 244.01 1465 | 241.35 1466 | 248.75 1467 | 250.38 1468 | 249.79 1469 | 249.76 1470 | 244.04 1471 | 242.88 1472 | 240.78 1473 | 237.31 1474 | 236.1 1475 | 235.8 1476 | 226.9 1477 | 222.25 1478 | 219.53 1479 | 218.06 1480 | 217.82 1481 | 224.87 1482 | 228.05 1483 | 233.51 1484 | 237.68 1485 | 244.36 1486 | 245.42 1487 | 246.76 1488 | 229.57 1489 | 232.86 1490 | 240.55 1491 | 238.51 1492 | 242.16 1493 | 244.78 1494 | 244.24 1495 | 246.07 1496 | 241.93 1497 | 242.25 1498 | 242.18 1499 | 244.96 1500 | 244.67 1501 | 252.91 1502 | 253.8 1503 | 249.86 1504 | 252.42 1505 | 251.6 1506 | 245.62 1507 | 245.76 1508 | 242.93 1509 | 242.55 1510 | 245.01 1511 | 240.83 1512 | 233.75 1513 | 230.78 1514 | 231.8 1515 | 225.47 1516 | 227.08 1517 | 225.26 1518 | 229.19 1519 | 226.12 1520 | 224.78 1521 | 229.94 1522 | 231.36 1523 | 234.91 1524 | 231.97 1525 | 235.05 1526 | 237.85 1527 | 237.83 1528 | 240.89 1529 | 239.97 1530 | 240.08 1531 | 240.29 1532 | 244.83 1533 | 253.89 1534 | 256.47 1535 | 257.74 1536 | 256.48 1537 | 263.38 1538 | 264.94 1539 | 263.32 1540 | 263.58 1541 | 262.63 1542 | 262.55 1543 | 260.91 1544 | 268.85 1545 | 266.91 1546 | 264.74 1547 | 267.91 1548 | 269.15 1549 | 270.42 1550 | 271.38 1551 | 270.19 1552 | 300.42 1553 | 308.55 1554 | 303.61 1555 | 303.69 1556 | 305.69 1557 | 305.96 1558 | 307.94 1559 | 308.99 1560 | 307.93 1561 | 308.98 1562 | 306.54 1563 | 307.19 1564 | 307.49 1565 | 309.78 1566 | 311.82 1567 | 312.23 1568 | 313.07 1569 | 312.1 1570 | 311.13 1571 | 308.29 1572 | 301.34 1573 | 297.44 1574 | 291.57 1575 | 291.48 1576 | 297.98 1577 | 295.12 1578 | 295.31 1579 | 291.21 1580 | 297.19 1581 | 294.7 1582 | 290.76 1583 | 277.58 1584 | 281.89 1585 | 285.62 1586 | 286.21 1587 | 288.89 1588 | 293.28 1589 | 294.97 1590 | 295.45 1591 | 295.81 1592 | 297.01 1593 | 297.16 1594 | 294.85 1595 | 295.56 1596 | 295.1 1597 | 297.23 1598 | 301.23 1599 | 302.44 1600 | 301.81 1601 | 300.89 1602 | 299.16 1603 | 300.2 1604 | 299.13 1605 | 296.69 1606 | 301.87 1607 | 300.76 1608 | 304.23 1609 | 306.44 1610 | 307.91 1611 | 306.8 1612 | 307.7 1613 | 308.13 1614 | 308.04 1615 | 311.78 1616 | 319.5 1617 | 315.56 1618 | 313.07 1619 | 305.61 1620 | 305.23 1621 | 309.65 1622 | 307.94 1623 | 308.09 1624 | 300.19 1625 | 299.88 1626 | 305.21 1627 | 305.69 1628 | 304.77 1629 | 305.18 1630 | 306.84 1631 | 308.88 1632 | 307.94 1633 | 307.91 1634 | 311.94 1635 | 313.76 1636 | 311.76 1637 | 311.8 1638 | 312.32 1639 | 314.72 1640 | 304.8 1641 | 305.35 1642 | 304.11 1643 | 304.71 1644 | 306.39 1645 | 300.08 1646 | 300.09 1647 | 304.48 1648 | 300.01 1649 | 295.53 1650 | 295.86 1651 | 295.59 1652 | 289.86 1653 | 288.07 1654 | 284.71 1655 | 284.5 1656 | 278.27 1657 | 280.4 1658 | 280.25 1659 | 287.96 1660 | 288.37 1661 | 290.79 1662 | 293.15 1663 | 289.58 1664 | 287.39 1665 | 290.57 1666 | 290.63 1667 | 293.09 1668 | 295.6 1669 | 293.55 1670 | 284.26 1671 | 286.8 1672 | 289.71 1673 | 288.79 1674 | 288.4 1675 | 285.02 1676 | 287.85 1677 | 288.97 1678 | 265.08 1679 | 263.16 1680 | 260.5 1681 | 262.6 1682 | 262.29 1683 | 262.26 1684 | 266.14 1685 | 268.61 1686 | 268.72 1687 | 271.78 1688 | 269.01 1689 | 266.68 1690 | 267.63 1691 | 266.87 1692 | 267.38 1693 | 268.57 1694 | 271.06 1695 | 267.46 1696 | 267.26 1697 | 264.51 1698 | 258.95 1699 | 264.96 1700 | 264.64 1701 | 265.36 1702 | 261.75 1703 | 258.94 1704 | 258.87 1705 | 259.58 1706 | 258.81 1707 | 260.19 1708 | 264.25 1709 | 262.54 1710 | 263.77 1711 | 261.28 1712 | 260.27 1713 | 259.26 1714 | 259.33 1715 | 258.11 1716 | 254.5 1717 | 252.11 1718 | 253.93 1719 | 251.22 1720 | 249.93 1721 | 242.27 1722 | 242.05 1723 | 246.25 1724 | 243.26 1725 | 239.87 1726 | 237.2 1727 | 241.2 1728 | 246.58 1729 | 248.54 1730 | 252.94 1731 | 260.25 1732 | 265.95 1733 | 267.41 1734 | 273.03 1735 | 265.73 1736 | 263.38 1737 | 266.74 1738 | 268.86 1739 | 264.21 1740 | 298.51 1741 | 297.17 1742 | 300.97 1743 | 297.38 1744 | 303.19 1745 | 308.81 1746 | 309.18 1747 | 310.95 1748 | 303.31 1749 | 305.16 1750 | 301.54 1751 | 303.08 1752 | 296.77 1753 | 300.28 1754 | 288.47 1755 | 289.23 1756 | 272.74 1757 | 286.42 1758 | 274.23 1759 | 280.78 1760 | 281.6 1761 | 278.34 1762 | 269.23 1763 | 266.31 1764 | 252.19 1765 | 245.21 1766 | 248.84 1767 | 259.15 1768 | 261.38 1769 | 259.76 1770 | 263.17 1771 | 269.27 1772 | 270.08 1773 | 270.21 1774 | 265.98 1775 | 262.16 1776 | 260.83 1777 | 266.75 1778 | 267.21 1779 | 262.16 1780 | 264.79 1781 | 264.5 1782 | 265.77 1783 | 271.01 1784 | 273.07 1785 | 273.06 1786 | 273.04 1787 | 269.33 1788 | 260.07 1789 | 262.49 1790 | 265.68 1791 | 269.4 1792 | 264.16 1793 | 263.49 1794 | 257.26 1795 | 247.51 1796 | 250.7 1797 | 252.1 1798 | 257.1 1799 | 257.3 1800 | 268.32 1801 | 271.32 1802 | 273.98 1803 | 279.22 1804 | 295.54 1805 | 290.91 1806 | 294.96 1807 | 290.06 1808 | 291.54 1809 | 294.95 1810 | 297.91 1811 | 291.29 1812 | 292.86 1813 | 299.04 1814 | 299.77 1815 | 296.02 1816 | 289.04 1817 | 292.12 1818 | 298.45 1819 | 297.77 1820 | 303.86 1821 | 305.86 1822 | 300.17 1823 | 297.24 1824 | 303.87 1825 | 306.19 1826 | 307.97 1827 | 305.43 1828 | 300.13 1829 | 297.14 1830 | 290.18 1831 | 289.71 1832 | 284.77 1833 | 281.22 1834 | 293.8 1835 | 291.17 1836 | 299.4 1837 | 306.58 1838 | 309.87 1839 | 312.51 1840 | 311.57 1841 | 311.38 1842 | 307.72 1843 | 313.4 1844 | 312.38 1845 | 312.5 1846 | 308.73 1847 | 309.46 1848 | 312.67 1849 | 310.6 1850 | 314.87 1851 | 312.6 1852 | 314.54 1853 | 316.25 1854 | 319.8 1855 | 319.53 1856 | 320.88 1857 | 322.63 1858 | 332.37 1859 | 333.81 1860 | 329.18 1861 | 324.68 1862 | 310.92 1863 | 311.26 1864 | 312.67 1865 | 314.51 1866 | 312.18 1867 | 313.98 1868 | 316.14 1869 | 319.47 1870 | 292.7 1871 | 292.47 1872 | 290.17 1873 | 284.46 1874 | 283.77 1875 | 289.7 1876 | 288.56 1877 | 289.76 1878 | 290.12 1879 | 292.26 1880 | 297.87 1881 | 304.24 1882 | 303.08 1883 | 304.62 1884 | 305.42 1885 | 302.65 1886 | 305.79 1887 | 304.58 1888 | 302.48 1889 | 302.96 1890 | 302.02 1891 | 306.69 1892 | 303.67 1893 | 302.75 1894 | 304.65 1895 | 304.35 1896 | 308.89 1897 | 308.82 1898 | 310.89 1899 | 310.31 1900 | 306.82 1901 | 302.18 1902 | 303.1 1903 | 303.27 1904 | 299.82 1905 | 302.27 1906 | 308.58 1907 | 307.69 1908 | 310.25 1909 | 312.21 1910 | 316.67 1911 | 316.43 1912 | 319.67 1913 | 322.7 1914 | 320.97 1915 | 324.34 1916 | 323.19 1917 | 327.55 1918 | 323.88 1919 | 320.3 1920 | 323.14 1921 | 320.99 1922 | 317.26 1923 | 315.84 1924 | 315.1 1925 | 313.12 1926 | 317.66 1927 | 325.18 1928 | 311.99 1929 | 302.73 1930 | 304.48 1931 | 303.42 1932 | 299.35 1933 | 297.73 1934 | 298.5 1935 | 300.33 1936 | 304.56 1937 | 307.43 1938 | 307.18 1939 | 302.12 1940 | 301.91 1941 | 303.33 1942 | 305.2 1943 | 298.19 1944 | 303.47 1945 | 306.09 1946 | 304.27 1947 | 306.52 1948 | 302.31 1949 | 301.7 1950 | 305.25 1951 | 314.15 1952 | 311.21 1953 | 299.9 1954 | 306.75 1955 | 300.1 1956 | 304.43 1957 | 301.53 1958 | 295.47 1959 | 296.87 1960 | 293.82 1961 | 290.14 1962 | 285.2 1963 | 289.01 1964 | 284.92 1965 | 289.99 1966 | 288.83 1967 | 289.93 1968 | 283.97 1969 | 282.27 1970 | 280.26 1971 | 279.25 1972 | 281.97 1973 | 285.14 1974 | 290.47 1975 | 288.47 1976 | 282.32 1977 | 285.45 1978 | 280.07 1979 | 282.06 1980 | 284.36 1981 | 281.87 1982 | 289.74 1983 | 289.94 1984 | 293.62 1985 | 297.66 1986 | 292.7 1987 | 292.71 1988 | 290.56 1989 | 285.31 1990 | 284.95 1991 | 287.97 1992 | 287.17 1993 | 288.08 1994 | 290.09 1995 | 296.23 1996 | 305.1 1997 | 307.45 1998 | 303.48 1999 | 303.69 2000 | 306.37 2001 | 317.16 2002 | 315.83 2003 | 316.17 2004 | 316.02 2005 | 314.06 2006 | 320.34 2007 | 321.09 2008 | 319.95 2009 | 320.79 2010 | 320.85 2011 | 320.68 2012 | 329.67 2013 | 334 2014 | 333.44 2015 | 336.1 2016 | 338.23 2017 | 337.43 2018 | 334.42 2019 | 338.25 2020 | 338.06 2021 | 338.98 2022 | 334.28 2023 | 338.29 2024 | 343.66 2025 | 340.5 2026 | 342.2 2027 | 340.18 2028 | 340.02 2029 | 349.35 2030 | 352.72 2031 | 350.03 2032 | 345.75 2033 | 345.1 2034 | 352.67 2035 | 354.49 2036 | 354.64 2037 | 358.78 2038 | 363.39 2039 | 363.69 2040 | 366.63 2041 | 374.32 2042 | 374.21 2043 | 376.35 2044 | 377.87 2045 | 376.87 2046 | 380.51 2047 | 378.12 2048 | 380.87 2049 | 383.64 2050 | 383.44 2051 | 378.54 2052 | 371.67 2053 | 371.91 2054 | 375.36 2055 | 372 2056 | 370.12 2057 | 371.98 2058 | 377.37 2059 | 347.15 2060 | 340.55 2061 | 339 2062 | 339.83 2063 | 338.31 2064 | 338.54 2065 | 337.24 2066 | 339.81 2067 | 343.45 2068 | 343.62 2069 | 341.14 2070 | 340.52 2071 | 333.23 2072 | 325.82 2073 | 331.18 2074 | 332.62 2075 | 329.2 2076 | 325.95 2077 | 323.31 2078 | 323.27 2079 | 333.77 2080 | 334.65 2081 | 332.6 2082 | 333.65 2083 | 330.24 2084 | 335.02 2085 | 341.49 2086 | 345.6 2087 | 348.84 2088 | 347.28 2089 | 345.17 2090 | 343.57 2091 | 345.22 2092 | 341.76 2093 | 342.37 2094 | 348.09 2095 | 348.43 2096 | 351 2097 | 350.63 2098 | 360.03 2099 | 360.17 2100 | 359.69 2101 | 360.82 2102 | 357.46 2103 | 354.4 2104 | 354.08 2105 | 352.79 2106 | 349.65 2107 | 353.34 2108 | 361.26 2109 | 361.47 2110 | 368.62 2111 | 367.01 2112 | 366.28 2113 | 368.69 2114 | 370.37 2115 | 369.62 2116 | 361.26 2117 | 362.1 2118 | 357.24 2119 | 355.3 2120 | 351.9 2121 | 351.08 2122 | 370.38 2123 | 376.54 2124 | 376.46 2125 | 374.99 2126 | 376.46 2127 | 376.54 2128 | 377.47 2129 | 387.4 2130 | 379.13 2131 | 382.49 2132 | 384.7 2133 | 386.59 2134 | 392.29 2135 | 390.82 2136 | 389.96 2137 | 391.04 2138 | 393.52 2139 | 396.05 2140 | 403.02 2141 | 395.83 2142 | 397.37 2143 | 399.46 2144 | 394.99 2145 | 394.67 2146 | 399.49 2147 | 400.2 2148 | 402.69 2149 | 410.34 2150 | 418.88 2151 | 415.27 2152 | 415.88 2153 | 415.34 2154 | 416.99 2155 | 413.39 2156 | 412.24 2157 | 410.36 2158 | 406.74 2159 | 403.49 2160 | 405.25 2161 | 406.95 2162 | 405.22 2163 | 404.75 2164 | 404.42 2165 | 405.8 2166 | 400.93 2167 | 396.7 2168 | 400.19 2169 | 406.11 2170 | 402.7 2171 | 397.14 2172 | 391.13 2173 | 387.04 2174 | 388.44 2175 | 394.69 2176 | 394.8 2177 | 394.63 2178 | 390.57 2179 | 396.29 2180 | 390.89 2181 | 382.57 2182 | 399.54 2183 | 399.66 2184 | 403.55 2185 | 406.32 2186 | 404.15 2187 | 400.31 2188 | 409.12 2189 | 411.87 2190 | 409.8 2191 | 414.39 2192 | 422.44 2193 | 430.34 2194 | 428.19 2195 | 436.38 2196 | 435.3 2197 | 439.67 2198 | 438.33 2199 | 443.11 2200 | 457.49 2201 | 451.48 2202 | 454.14 2203 | 453.81 2204 | 453.03 2205 | 444.27 2206 | 440.95 2207 | 436.22 2208 | 440.19 2209 | 433.72 2210 | 434.94 2211 | 435.17 2212 | 433.38 2213 | 429.12 2214 | 429.42 2215 | 431.89 2216 | 439.43 2217 | 444.66 2218 | 439.47 2219 | 435.55 2220 | 438.06 2221 | 437.08 2222 | 442.68 2223 | 449.86 2224 | 449.89 2225 | 441.93 2226 | 440.02 2227 | 434.46 2228 | 432.67 2229 | 436.39 2230 | 438.1 2231 | 439.74 2232 | 443.5 2233 | 440.71 2234 | 442.77 2235 | 446.3 2236 | 452.09 2237 | 452.17 2238 | 452.54 2239 | 459.66 2240 | 461.04 2241 | 461.88 2242 | 459.34 2243 | 458.82 2244 | 454.88 2245 | 447.85 2246 | 454.89 2247 | 451.45 2248 | 451 2249 | 443.41 2250 | 442.23 2251 | 440.69 2252 | 445.01 2253 | 443.43 2254 | 451.66 2255 | 452.83 2256 | 452.05 2257 | 447.84 2258 | 444.88 2259 | 445.88 2260 | 444.76 2261 | 442.31 2262 | 440.18 2263 | 434.47 2264 | 429.4 2265 | 428.03 2266 | 432.39 2267 | 432.28 2268 | 434.23 2269 | 436.42 2270 | 434.67 2271 | 432.76 2272 | 424.65 2273 | 423.85 2274 | 427.29 2275 | 423.03 2276 | 429.76 2277 | 435.38 2278 | 439.34 2279 | 439.35 2280 | 443.58 2281 | 443.89 2282 | 447.65 2283 | 446.08 2284 | 444.09 2285 | 443.44 2286 | 442.61 2287 | 451.21 2288 | 448.75 2289 | 451.1 2290 | 442.81 2291 | 442.98 2292 | 438.18 2293 | 438.65 2294 | 437.76 2295 | 437.52 2296 | 443.06 2297 | 443.55 2298 | 437.61 2299 | 435.74 2300 | 432.44 2301 | 426.41 2302 | 427.5 2303 | 433.69 2304 | 435.56 2305 | 437.62 2306 | 440.56 2307 | 448.56 2308 | 443.95 2309 | 505.2 2310 | 501.15 2311 | 503 2312 | 515.19 2313 | 512.26 2314 | 507.09 2315 | 506.99 2316 | 517.6 2317 | 514.69 2318 | 514.77 2319 | 513.01 2320 | 512.54 2321 | 510.25 2322 | 510.86 2323 | 503.47 2324 | 507.51 2325 | 504.79 2326 | 505.38 2327 | 515.72 2328 | 517.1 2329 | 516.26 2330 | 515.26 2331 | 512.09 2332 | 510.64 2333 | 516.52 2334 | 515.43 2335 | 522.44 2336 | 528.68 2337 | 531.02 2338 | 529.27 2339 | 526.71 2340 | 526.1 2341 | 528.56 2342 | 528.14 2343 | 534.4 2344 | 538.53 2345 | 541.79 2346 | 538.11 2347 | 534.45 2348 | 529.86 2349 | 535.95 2350 | 534.4 2351 | 541.83 2352 | 542.57 2353 | 549.76 2354 | 556.99 2355 | 555.36 2356 | 558.17 2357 | 558.64 2358 | 554.18 2359 | 559.79 2360 | 556 2361 | 551.95 2362 | 558.1 2363 | 568.86 2364 | 570.04 2365 | 564.55 2366 | 564.52 2367 | 560.93 2368 | 574.13 2369 | 573.74 2370 | 577.53 2371 | 574.69 2372 | 581.27 2373 | 581.93 2374 | 579.47 2375 | 561.35 2376 | 550.06 2377 | 560.94 2378 | 552.91 2379 | 567.13 2380 | 589.89 2381 | 566.15 2382 | 568.51 2383 | 571.03 2384 | 579.4 2385 | 588.13 2386 | 585.88 2387 | 594.49 2388 | 592.75 2389 | 599.35 2390 | 600.8 2391 | 604.83 2392 | 600.57 2393 | 601.45 2394 | 601.29 2395 | 605.65 2396 | 609.39 2397 | 609.47 2398 | 609 2399 | 607.22 2400 | 600.74 2401 | 606.85 2402 | 608.52 2403 | 609.2 2404 | 606.79 2405 | 605.18 2406 | 599.4 2407 | 603.05 2408 | 593.94 2409 | 585.81 2410 | 595.45 2411 | 605.02 2412 | 599.03 2413 | 597.98 2414 | 590.93 2415 | 578.39 2416 | 578.78 2417 | 565.42 2418 | 556.58 2419 | 559.51 2420 | 556.7 2421 | 566.88 2422 | 566.98 2423 | 569.74 2424 | 543.14 2425 | 538.15 2426 | 554.9 2427 | 564.14 2428 | 540.95 2429 | 530.6 2430 | 532.52 2431 | 536.44 2432 | 556.54 2433 | 536.1 2434 | 528.62 2435 | 534.81 2436 | 526.94 2437 | 525.16 2438 | 516.18 2439 | 517.15 2440 | 527.7 2441 | 526.66 2442 | 531.35 2443 | 527.93 2444 | 527.81 2445 | 515.14 2446 | 509.96 2447 | 511 2448 | 518.73 2449 | 529.92 2450 | 533.09 2451 | 526.65 2452 | 519.98 2453 | 520.63 2454 | 528.86 2455 | 529.77 2456 | 538.94 2457 | 545.06 2458 | 552.7 2459 | 565.95 2460 | 561.68 2461 | 560.08 2462 | 559.89 2463 | 553.93 2464 | 544.94 2465 | 544.66 2466 | 553.9 2467 | 556.33 2468 | 562.12 2469 | 560.55 2470 | 558.84 2471 | 551.35 2472 | 551.76 2473 | 544.28 2474 | 543.01 2475 | 553.37 2476 | 554.9 2477 | 556.36 2478 | 564.95 2479 | 564.62 2480 | 578.65 2481 | 576 2482 | 577.24 2483 | 575.28 2484 | 582.67 2485 | 582.34 2486 | 584.73 2487 | 582.25 2488 | 571.09 2489 | 576.08 2490 | 571.1 2491 | 579.18 2492 | 584.87 2493 | 584.78 2494 | 582.66 2495 | 573.73 2496 | 595.08 2497 | 589.47 2498 | 594.74 2499 | 595.98 2500 | 593.35 2501 | 589.02 2502 | 590.6 2503 | 585.61 2504 | 587.42 2505 | 571.6 2506 | 566.07 2507 | 573.15 2508 | 565.07 2509 | 566.37 2510 | 563.36 2511 | 568.77 2512 | 567.88 2513 | 562.73 2514 | 574.78 2515 | 574.65 2516 | 573.48 2517 | 582.16 2518 | 586.86 2519 | 584.49 2520 | 583.37 2521 | 582.56 2522 | 580.2 2523 | 577.86 2524 | 571 2525 | 569.2 2526 | 571.6 2527 | 577.33 2528 | 577.94 2529 | 581.98 2530 | 586.08 2531 | 589.72 2532 | 581.01 2533 | 583.1 2534 | 581.35 2535 | 575.62 2536 | 573.1 2537 | 579.95 2538 | 584.77 2539 | 589.27 2540 | 596.08 2541 | 587.37 2542 | 581.13 2543 | 587.99 2544 | 575.06 2545 | 577.1 2546 | 576.36 2547 | 577.36 2548 | 568.27 2549 | 570.08 2550 | 575.28 2551 | 577.35 2552 | 563.74 2553 | 572.5 2554 | 560.88 2555 | 544.49 2556 | 533.21 2557 | 537.94 2558 | 530.03 2559 | 524.51 2560 | 511.17 2561 | 520.84 2562 | 526.54 2563 | 532.71 2564 | 543.98 2565 | 539.78 2566 | 540.77 2567 | 548.9 2568 | 549.33 2569 | 550.31 2570 | 559.08 2571 | 555.22 2572 | 554.11 2573 | 545.92 2574 | 542.04 2575 | 541.01 2576 | 547.49 2577 | 550.29 2578 | 547.31 2579 | 545.38 2580 | 544.4 2581 | 536.51 2582 | 535.03 2583 | 536.99 2584 | 534.83 2585 | 537.5 2586 | 539.27 2587 | 541.08 2588 | 540.37 2589 | 541.83 2590 | 533.8 2591 | 533.75 2592 | 531.32 2593 | 537.31 2594 | 525.26 2595 | 526.98 2596 | 533.37 2597 | 526.06 2598 | 528.34 2599 | 518.66 2600 | 513.8 2601 | 495.39 2602 | 504.89 2603 | 511.1 2604 | 516.35 2605 | 524.87 2606 | 530.59 2607 | 528.77 2608 | 534.03 2609 | 530.33 2610 | 530.42 2611 | 526.4 2612 | 524.81 2613 | 513.87 2614 | 501.96 2615 | 501.1 2616 | 502.68 2617 | 496.17 2618 | 492.55 2619 | 496.18 2620 | 500.87 2621 | 501.79 2622 | 508.08 2623 | 506.9 2624 | 518.04 2625 | 534.39 2626 | 539.95 2627 | 535.21 2628 | 518.63 2629 | 510 2630 | 510.66 2631 | 534.52 2632 | 528.48 2633 | 529.24 2634 | 522.76 2635 | 527.58 2636 | 531 2637 | 527.83 2638 | 536.94 2639 | 535.97 2640 | 542.93 2641 | 549.01 2642 | 542.84 2643 | 539.7 2644 | 542.87 2645 | 538.95 2646 | 531.91 2647 | 536.09 2648 | 543.87 2649 | 555.48 2650 | 558.4 2651 | 571.34 2652 | 573.64 2653 | 573.37 2654 | 575.33 2655 | 567.68 2656 | 568.85 2657 | 555.01 2658 | 551.18 2659 | 555.51 2660 | 547.32 2661 | 554.51 2662 | 550.84 2663 | 559.5 2664 | 557.99 2665 | 560.36 2666 | 558.81 2667 | 570.19 2668 | 558.78 2669 | 555.17 2670 | 548.34 2671 | 552.03 2672 | 548 2673 | 542.56 2674 | 535.53 2675 | 536.76 2676 | 537.02 2677 | 541.61 2678 | 540.78 2679 | 540.01 2680 | 539.17 2681 | 530.39 2682 | 532.53 2683 | 533.8 2684 | 524.05 2685 | 535.38 2686 | 533.97 2687 | 539.36 2688 | 547 2689 | 565.06 2690 | 555.37 2691 | 553.68 2692 | 549.08 2693 | 537.34 2694 | 537.9 2695 | 540.78 2696 | 530.8 2697 | 524.22 2698 | 530.7 2699 | 538.22 2700 | 535.7 2701 | 529.04 2702 | 529.62 2703 | 538.4 2704 | 533.85 2705 | 532.3 2706 | 537.36 2707 | 539.27 2708 | 542.51 2709 | 540.11 2710 | 532.32 2711 | 539.79 2712 | 539.78 2713 | 532.11 2714 | 533.99 2715 | 539.18 2716 | 540.31 2717 | 536.7 2718 | 533.33 2719 | 526.83 2720 | 526.69 2721 | 536.69 2722 | 534.61 2723 | 532.33 2724 | 527.2 2725 | 528.15 2726 | 529.26 2727 | 536.73 2728 | 536.69 2729 | 538.19 2730 | 540.48 2731 | 537.84 2732 | 535.23 2733 | 531.69 2734 | 521.52 2735 | 520.51 2736 | 521.84 2737 | 523.4 2738 | 522.86 2739 | 525.02 2740 | 516.83 2741 | 520.68 2742 | 530.13 2743 | 546.55 2744 | 561.1 2745 | 560.22 2746 | 579.85 2747 | 672.93 2748 | 663.02 2749 | 662.3 2750 | 662.1 2751 | 644.28 2752 | 623.56 2753 | 627.26 2754 | 628 2755 | 631.93 2756 | 632.59 2757 | 625.61 2758 | 631.21 2759 | 629.25 2760 | 643.78 2761 | 642.68 2762 | 635.3 2763 | 633.73 2764 | 660.78 2765 | 659.56 2766 | 656.45 2767 | 657.12 2768 | 660.87 2769 | 656.13 2770 | 660.9 2771 | 646.83 2772 | 612.48 2773 | 589.61 2774 | 582.06 2775 | 628.62 2776 | 637.61 2777 | 630.38 2778 | 618.25 2779 | 597.79 2780 | 614.34 2781 | 606.25 2782 | 600.7 2783 | 614.66 2784 | 612.72 2785 | 621.35 2786 | 625.77 2787 | 623.24 2788 | 635.14 2789 | 635.98 2790 | 642.9 2791 | 629.25 2792 | 635.44 2793 | 622.69 2794 | 622.36 2795 | 625.8 2796 | 611.97 2797 | 594.89 2798 | 594.97 2799 | 608.42 2800 | 611.29 2801 | 626.91 2802 | 641.47 2803 | 645.44 2804 | 642.36 2805 | 639.16 2806 | 643.61 2807 | 646.67 2808 | 652.3 2809 | 651.16 2810 | 661.74 2811 | 662.2 2812 | 666.1 2813 | 650.28 2814 | 642.61 2815 | 651.79 2816 | 702 2817 | 712.78 2818 | 708.49 2819 | 712.95 2820 | 716.92 2821 | 710.81 2822 | 721.11 2823 | 722.16 2824 | 728.11 2825 | 731.25 2826 | 733.76 2827 | 724.89 2828 | 728.32 2829 | 735.4 2830 | 731.23 2831 | 717 2832 | 728.96 2833 | 725.3 2834 | 740 2835 | 738.41 2836 | 756.6 2837 | 755.98 2838 | 748.28 2839 | 748.15 2840 | 750.26 2841 | 742.6 2842 | 767.04 2843 | 762.38 2844 | 752.54 2845 | 766.81 2846 | 763.25 2847 | 762.37 2848 | 751.61 2849 | 749.46 2850 | 738.87 2851 | 747.77 2852 | 743.4 2853 | 758.09 2854 | 749.43 2855 | 739.31 2856 | 747.77 2857 | 750 2858 | 750.31 2859 | 748.4 2860 | 762.51 2861 | 776.6 2862 | 771 2863 | 758.88 2864 | 741.84 2865 | 742.58 2866 | 743.62 2867 | 726.39 2868 | 714.47 2869 | 716.03 2870 | 726.07 2871 | 700.56 2872 | 714.72 2873 | 694.45 2874 | 701.79 2875 | 698.45 2876 | 706.59 2877 | 725.25 2878 | 711.67 2879 | 713.04 2880 | 699.99 2881 | 730.96 2882 | 742.95 2883 | 752 2884 | 764.65 2885 | 726.95 2886 | 708.01 2887 | 683.57 2888 | 682.74 2889 | 678.11 2890 | 684.12 2891 | 683.11 2892 | 682.4 2893 | 691 2894 | 708.4 2895 | 697.35 2896 | 700.91 2897 | 706.46 2898 | 695.85 2899 | 699.56 2900 | 705.75 2901 | 705.07 2902 | 697.77 2903 | 718.81 2904 | 718.85 2905 | 712.42 2906 | 710.89 2907 | 695.16 2908 | 693.97 2909 | 705.24 2910 | 712.82 2911 | 726.82 2912 | 730.49 2913 | 728.33 2914 | 736.09 2915 | 737.78 2916 | 737.6 2917 | 742.09 2918 | 740.75 2919 | 738.06 2920 | 735.3 2921 | 733.53 2922 | 744.77 2923 | 750.53 2924 | 744.95 2925 | 749.91 2926 | 745.29 2927 | 737.8 2928 | 745.69 2929 | 740.28 2930 | 739.15 2931 | 736.1 2932 | 743.09 2933 | 751.72 2934 | 753.2 2935 | 759 2936 | 766.61 2937 | 753.93 2938 | 752.67 2939 | 759.14 2940 | 718.77 2941 | 723.15 2942 | 708.14 2943 | 705.84 2944 | 691.02 2945 | 693.01 2946 | 698.21 2947 | 692.36 2948 | 695.7 2949 | 701.43 2950 | 711.12 2951 | 712.9 2952 | 723.18 2953 | 715.29 2954 | 713.31 2955 | 710.83 2956 | 716.49 2957 | 706.23 2958 | 706.63 2959 | 700.32 2960 | 709.74 2961 | 704.24 2962 | 720.09 2963 | 725.27 2964 | 724.12 2965 | 732.66 2966 | 735.72 2967 | 734.15 2968 | 730.4 2969 | 722.34 2970 | 716.55 2971 | 716.65 2972 | 728.28 2973 | 728.58 2974 | 719.41 2975 | 718.36 2976 | 718.27 2977 | 718.92 2978 | 710.36 2979 | 691.72 2980 | 693.71 2981 | 695.94 2982 | 697.46 2983 | 701.87 2984 | 675.22 2985 | 668.26 2986 | 680.04 2987 | 684.11 2988 | 692.1 2989 | 699.21 2990 | 694.49 2991 | 697.77 2992 | 695.36 2993 | 705.63 2994 | 715.09 2995 | 720.64 2996 | 716.98 2997 | 720.95 2998 | 719.85 2999 | 733.78 3000 | 736.96 3001 | 741.19 3002 | 738.63 3003 | 742.74 3004 | 739.77 3005 | 738.42 3006 | 741.77 3007 | 745.91 3008 | 768.79 3009 | 772.88 3010 | 771.07 3011 | 773.18 3012 | 771.61 3013 | 782.22 --------------------------------------------------------------------------------