<img src="https://raw.githubusercontent.com/martineastwood/penaltyblog/refs/heads/master/logo.png" width="0" height="0" style="display:none;"/>
<meta property="og:image" content="https://raw.githubusercontent.com/martineastwood/penaltyblog/refs/heads/master/logo.png" />
<meta property="og:image:alt" content="penaltyblog python package for soccer modeling" />
<meta name="twitter:image" content="https://raw.githubusercontent.com/martineastwood/penaltyblog/refs/heads/master/logo.png">
<meta name="twitter:card" content="summary_large_image">
# Penalty Blog
<div align="center">
<a href="">[](https://pypi.org/project/penaltyblog/)</a>
<a href="https://codecov.io/github/martineastwood/penaltyblog" >
<img src="https://codecov.io/github/martineastwood/penaltyblog/branch/master/graph/badge.svg?token=P0WDHRGIG2"/>
</a>
<a href="">[](https://pypi.org/project/penaltyblog/)</a>
<a href="">[](https://pepy.tech/project/penaltyblog)</a>
<a href="">[](https://opensource.org/licenses/MIT)</a>
<a href="">[](https://github.com/psf/black)</a>
<a href="">[](https://github.com/pre-commit/pre-commit)</a>
</div>
<div align="center">
<img src="logo.png" alt="Penalty Blog Logo" width="200">
</div>
# penaltyblog: Football Data & Modelling Made Easy
**penaltyblog** is a production-ready Python package designed for football (soccer) analytics, providing powerful tools from [pena.lt/y/blog](https://pena.lt/y/blog) for data analysis, outcome modelling, and betting insights. Optimized with Cython, **penaltyblog** delivers high-performance modelling to power faster, efficient predictions.
## Features
- 🔄 **Streamline JSON Workflows with MatchFlow:** Process nested football data using a lazy, streaming pipeline built for JSON. Filter, select, flatten, join, group, and summarize large datasets without loading everything into memory.
- 📊 **Model Matches Efficiently:** High-performance implementations of Poisson, Bivariate Poisson, Dixon-Coles, and other advanced statistical models, optimized with Cython for rapid analysis.
- ⚽ **Scrape Data:** Collect match statistics from sources like FBRef, Understat, Club Elo, and Fantasy Premier League.
- 💰 **Bet Smarter:** Precisely estimate probabilities for Asian handicaps, over/under totals, match outcomes, and more.
- 🏆 **Rank Teams:** Evaluate team strengths with sophisticated methods including Elo, Massey, Colley, and Pi ratings.
- 📈 **Decode Bookmaker Odds:** Accurately extract implied probabilities by removing bookmaker margins (overrounds).
- 🎯 **Fantasy Football Optimisation:** Mathematically optimize your fantasy football squad to maximize performance.
- 🎨 **Visualize with Style:** Create publication-ready pitch visualizations and data flow diagrams with customizable themes, supporting multiple data providers and flexible layouts.
Take your football analytics and betting strategy to the next level with **penaltyblog** 🚀
## Installation
```bash
pip install penaltyblog
```
## 🚀 Quick Start - Try it Now!
Run these examples directly in your browser (no installation required):
| Example | Description | Colab |
|---------|-------------|-------|
| **Predict Soccer Match Results** | Build a match prediction model from scratch | [](https://colab.research.google.com/drive/1GjrDG_iq_9_lxEQK_aBmr-jCCCnFt0v7?usp=sharing) |
| **Process Soccer Data the Easy Way** | Lazy processing of football data using Matchflow | [](https://colab.research.google.com/drive/1rRJV8mNOTLTXmn5cOGT4faxIwIP44pC-?usp=sharing) |
| **Calculate Massey Ratings** | Calculate teams' attack and defense strengths | [](https://colab.research.google.com/drive/1d_WPJwQgrogeSI9oIO9fY8s18CPPZ8nL?usp=sharing) |
| **Use Pi Ratings** | Like Elo ratings, but better | [](https://colab.research.google.com/drive/12qEDCNYG-FFHOJ_kURe0cm80sScandyh?usp=sharing) |
| **Create Interactive Charts** | Create your own interactive football vizualisations | [](https://colab.research.google.com/drive/1xFfIdvmbFcjHlS_2eHEu3NxD-xLNrbpY?usp=sharing) |
| **Work Directly With Statsbomb Data** | Connect directly to Statsbomb's API, including their free open data sets | [](https://colab.research.google.com/drive/1xFfIdvmbFcjHlS_2eHEu3NxD-xLNrbpY?usp=sharing) |
| **Calculate Implied Probabilities** | Calculate implied probabilities from bookmaker's odds | [](https://colab.research.google.com/drive/1o-tOetyWmSY_1WczN8WhWsl62Uz5T65F?usp=sharing) |
## Documentation
Learn more about how to utilize `penaltyblog` by exploring the [official documentation](https://penaltyblog.readthedocs.io/en/latest/) and detailed examples:
- [Processing football event data with MatchFlow](https://penaltyblog.readthedocs.io/en/latest/matchflow/index.html)
- [Scraping football data](https://penaltyblog.readthedocs.io/en/latest/scrapers/index.html)
- [Predicting football matches and betting markets](https://penaltyblog.readthedocs.io/en/latest/models/index.html)
- [Estimating implied odds from bookmaker prices](https://penaltyblog.readthedocs.io/en/latest/implied/index.html)
- [Calculating Massey, Colley, Pi, and Elo ratings](https://penaltyblog.readthedocs.io/en/latest/ratings/index.html)
- [Calculating metrics such as Ranked Probability Scores](https://penaltyblog.readthedocs.io/en/latest/metrics/index.html)
## Why Penaltyblog?
Unlike many football analytics resources that are academic, one-off, or hard to scale, `penaltyblog` is designed from the ground up to be **production-ready**, **performance-optimized**, and **practically useful**.
It combines advanced statistical models, efficient implementations (via **Cython**), and real-world workflows, from scraping public data to modelling outcomes and optimising fantasy teams.
Built by [Martin Eastwood](https://pena.lt/y/about), who has worked with football clubs, governing bodies, player agencies and betting syndicates worldwide, `penaltyblog` is the foundation for football analytics.
Whether you're a club analyst, independent researcher, or just data-curious, `penaltyblog` gives you the tools to go from data to insight - fast, flexibly, and with confidence.
## Support & Collaboration
If you're working at a football club, agency, or organisation and want help applying these tools to your own data or workflows, I'm open to:
- 📂 Integration support
- 🔧 Custom model development
- 🧠 Technical collaboration on football analytics projects
➡️ Get in touch [here](https://pena.lt/y/contact)
Raw data
{
"_id": null,
"home_page": null,
"name": "penaltyblog",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.10",
"maintainer_email": null,
"keywords": "football, soccer, goals, modelling, dixon coles, poisson, scraper, scraping, backtest, matchflow",
"author": null,
"author_email": "Martin Eastwood <martin.eastwood@gmx.com>",
"download_url": "https://files.pythonhosted.org/packages/1b/36/b84f63578de78236062422f95019e7d7991b864b929bb7014ddf657fbdf7/penaltyblog-1.6.2.tar.gz",
"platform": null,
"description": "<img src=\"https://raw.githubusercontent.com/martineastwood/penaltyblog/refs/heads/master/logo.png\" width=\"0\" height=\"0\" style=\"display:none;\"/>\n\n<meta property=\"og:image\" content=\"https://raw.githubusercontent.com/martineastwood/penaltyblog/refs/heads/master/logo.png\" />\n<meta property=\"og:image:alt\" content=\"penaltyblog python package for soccer modeling\" />\n<meta name=\"twitter:image\" content=\"https://raw.githubusercontent.com/martineastwood/penaltyblog/refs/heads/master/logo.png\">\n<meta name=\"twitter:card\" content=\"summary_large_image\">\n\n# Penalty Blog\n\n<div align=\"center\">\n\n <a href=\"\">[](https://pypi.org/project/penaltyblog/)</a>\n<a href=\"https://codecov.io/github/martineastwood/penaltyblog\" >\n<img src=\"https://codecov.io/github/martineastwood/penaltyblog/branch/master/graph/badge.svg?token=P0WDHRGIG2\"/>\n</a>\n <a href=\"\">[](https://pypi.org/project/penaltyblog/)</a>\n <a href=\"\">[](https://pepy.tech/project/penaltyblog)</a>\n <a href=\"\">[](https://opensource.org/licenses/MIT)</a>\n <a href=\"\">[](https://github.com/psf/black)</a>\n <a href=\"\">[](https://github.com/pre-commit/pre-commit)</a>\n\n</div>\n\n\n<div align=\"center\">\n <img src=\"logo.png\" alt=\"Penalty Blog Logo\" width=\"200\">\n</div>\n\n\n# penaltyblog: Football Data & Modelling Made Easy\n\n**penaltyblog** is a production-ready Python package designed for football (soccer) analytics, providing powerful tools from [pena.lt/y/blog](https://pena.lt/y/blog) for data analysis, outcome modelling, and betting insights. Optimized with Cython, **penaltyblog** delivers high-performance modelling to power faster, efficient predictions.\n\n## Features\n\n- \ud83d\udd04 **Streamline JSON Workflows with MatchFlow:** Process nested football data using a lazy, streaming pipeline built for JSON. Filter, select, flatten, join, group, and summarize large datasets without loading everything into memory.\n- \ud83d\udcca **Model Matches Efficiently:** High-performance implementations of Poisson, Bivariate Poisson, Dixon-Coles, and other advanced statistical models, optimized with Cython for rapid analysis.\n- \u26bd **Scrape Data:** Collect match statistics from sources like FBRef, Understat, Club Elo, and Fantasy Premier League.\n- \ud83d\udcb0 **Bet Smarter:** Precisely estimate probabilities for Asian handicaps, over/under totals, match outcomes, and more.\n- \ud83c\udfc6 **Rank Teams:** Evaluate team strengths with sophisticated methods including Elo, Massey, Colley, and Pi ratings.\n- \ud83d\udcc8 **Decode Bookmaker Odds:** Accurately extract implied probabilities by removing bookmaker margins (overrounds).\n- \ud83c\udfaf **Fantasy Football Optimisation:** Mathematically optimize your fantasy football squad to maximize performance.\n- \ud83c\udfa8 **Visualize with Style:** Create publication-ready pitch visualizations and data flow diagrams with customizable themes, supporting multiple data providers and flexible layouts.\n\nTake your football analytics and betting strategy to the next level with **penaltyblog** \ud83d\ude80\n\n## Installation\n\n```bash\npip install penaltyblog\n```\n\n## \ud83d\ude80 Quick Start - Try it Now!\n\nRun these examples directly in your browser (no installation required):\n\n| Example | Description | Colab |\n|---------|-------------|-------|\n| **Predict Soccer Match Results** | Build a match prediction model from scratch | [](https://colab.research.google.com/drive/1GjrDG_iq_9_lxEQK_aBmr-jCCCnFt0v7?usp=sharing) |\n| **Process Soccer Data the Easy Way** | Lazy processing of football data using Matchflow | [](https://colab.research.google.com/drive/1rRJV8mNOTLTXmn5cOGT4faxIwIP44pC-?usp=sharing) |\n| **Calculate Massey Ratings** | Calculate teams' attack and defense strengths | [](https://colab.research.google.com/drive/1d_WPJwQgrogeSI9oIO9fY8s18CPPZ8nL?usp=sharing) |\n| **Use Pi Ratings** | Like Elo ratings, but better | [](https://colab.research.google.com/drive/12qEDCNYG-FFHOJ_kURe0cm80sScandyh?usp=sharing) |\n| **Create Interactive Charts** | Create your own interactive football vizualisations | [](https://colab.research.google.com/drive/1xFfIdvmbFcjHlS_2eHEu3NxD-xLNrbpY?usp=sharing) |\n| **Work Directly With Statsbomb Data** | Connect directly to Statsbomb's API, including their free open data sets | [](https://colab.research.google.com/drive/1xFfIdvmbFcjHlS_2eHEu3NxD-xLNrbpY?usp=sharing) |\n| **Calculate Implied Probabilities** | Calculate implied probabilities from bookmaker's odds | [](https://colab.research.google.com/drive/1o-tOetyWmSY_1WczN8WhWsl62Uz5T65F?usp=sharing) |\n\n\n## Documentation\n\nLearn more about how to utilize `penaltyblog` by exploring the [official documentation](https://penaltyblog.readthedocs.io/en/latest/) and detailed examples:\n\n- [Processing football event data with MatchFlow](https://penaltyblog.readthedocs.io/en/latest/matchflow/index.html)\n- [Scraping football data](https://penaltyblog.readthedocs.io/en/latest/scrapers/index.html)\n- [Predicting football matches and betting markets](https://penaltyblog.readthedocs.io/en/latest/models/index.html)\n- [Estimating implied odds from bookmaker prices](https://penaltyblog.readthedocs.io/en/latest/implied/index.html)\n- [Calculating Massey, Colley, Pi, and Elo ratings](https://penaltyblog.readthedocs.io/en/latest/ratings/index.html)\n- [Calculating metrics such as Ranked Probability Scores](https://penaltyblog.readthedocs.io/en/latest/metrics/index.html)\n\n## Why Penaltyblog?\n\nUnlike many football analytics resources that are academic, one-off, or hard to scale, `penaltyblog` is designed from the ground up to be **production-ready**, **performance-optimized**, and **practically useful**.\n\nIt combines advanced statistical models, efficient implementations (via **Cython**), and real-world workflows, from scraping public data to modelling outcomes and optimising fantasy teams.\n\nBuilt by [Martin Eastwood](https://pena.lt/y/about), who has worked with football clubs, governing bodies, player agencies and betting syndicates worldwide, `penaltyblog` is the foundation for football analytics.\n\nWhether you're a club analyst, independent researcher, or just data-curious, `penaltyblog` gives you the tools to go from data to insight - fast, flexibly, and with confidence.\n\n## Support & Collaboration\n\nIf you're working at a football club, agency, or organisation and want help applying these tools to your own data or workflows, I'm open to:\n\n- \ud83d\udcc2 Integration support\n- \ud83d\udd27 Custom model development\n- \ud83e\udde0 Technical collaboration on football analytics projects\n\n\u27a1\ufe0f Get in touch [here](https://pena.lt/y/contact)\n",
"bugtrack_url": null,
"license": null,
"summary": "Football (soccer) Data & Modelling Made Easy",
"version": "1.6.2",
"project_urls": {
"Homepage": "https://github.com/martineastwood/penaltyblog",
"Repository": "https://github.com/martineastwood/penaltyblog"
},
"split_keywords": [
"football",
" soccer",
" goals",
" modelling",
" dixon coles",
" poisson",
" scraper",
" scraping",
" backtest",
" matchflow"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "3f4920e62373ce75495d14877778b22a1bdd2b4ba5492ffb65be68bc18bbd52f",
"md5": "9865c7b959d3d598bae9f7ac25f043db",
"sha256": "d4963adaf02ce47a6469c8cc0b83fb81e9633506927378015d232995182ef65e"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp310-cp310-macosx_10_9_x86_64.whl",
"has_sig": false,
"md5_digest": "9865c7b959d3d598bae9f7ac25f043db",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.10",
"size": 1264233,
"upload_time": "2025-10-22T16:35:06",
"upload_time_iso_8601": "2025-10-22T16:35:06.526372Z",
"url": "https://files.pythonhosted.org/packages/3f/49/20e62373ce75495d14877778b22a1bdd2b4ba5492ffb65be68bc18bbd52f/penaltyblog-1.6.2-cp310-cp310-macosx_10_9_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "2fcec4191c3b80caf9a731df8f2cb5968cdc11af48a187585f6f6ce4910c9481",
"md5": "1a34b8f7bdb7252b3d38fb432e9b9114",
"sha256": "3deef311e99d79528b99070027d20b2b4cd0dfbbd5dbd9601a9416c937b3e8b8"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp310-cp310-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "1a34b8f7bdb7252b3d38fb432e9b9114",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.10",
"size": 1265545,
"upload_time": "2025-10-22T16:35:09",
"upload_time_iso_8601": "2025-10-22T16:35:09.057219Z",
"url": "https://files.pythonhosted.org/packages/2f/ce/c4191c3b80caf9a731df8f2cb5968cdc11af48a187585f6f6ce4910c9481/penaltyblog-1.6.2-cp310-cp310-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "60d558dc398be71c5eeec7905f6b9c88f2b97cbb038647fb76cb156df2a96e93",
"md5": "92888e5bafb0ebd453fb988af96c7d22",
"sha256": "3c3a548da46e4287f6b82d57c9a3d3e5ffc1c81aa0545648b33553d5985e81ad"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl",
"has_sig": false,
"md5_digest": "92888e5bafb0ebd453fb988af96c7d22",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.10",
"size": 3283234,
"upload_time": "2025-10-22T16:35:10",
"upload_time_iso_8601": "2025-10-22T16:35:10.382032Z",
"url": "https://files.pythonhosted.org/packages/60/d5/58dc398be71c5eeec7905f6b9c88f2b97cbb038647fb76cb156df2a96e93/penaltyblog-1.6.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "01ab13f9dab49f61770b108de858820ef510fab7d473f08cc5f2f700ca7a9b8f",
"md5": "d22b3398c5b511c9883f3bb2aab69d68",
"sha256": "bc186e7fb0396128ac7eadc3f8c481dde172789ff2ec220b101b94b6a5c6aeba"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
"has_sig": false,
"md5_digest": "d22b3398c5b511c9883f3bb2aab69d68",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.10",
"size": 3307704,
"upload_time": "2025-10-22T16:35:12",
"upload_time_iso_8601": "2025-10-22T16:35:12.002459Z",
"url": "https://files.pythonhosted.org/packages/01/ab/13f9dab49f61770b108de858820ef510fab7d473f08cc5f2f700ca7a9b8f/penaltyblog-1.6.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "5307ce469aeca63db0b5926592081893738624697943d3b19d3887a858ccd475",
"md5": "a6815731731fd2c497a0c5f3b1271060",
"sha256": "c584be745611d0f88f694b0829f7505f6d374b5f33102121c89058da52e6ba03"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp310-cp310-musllinux_1_2_aarch64.whl",
"has_sig": false,
"md5_digest": "a6815731731fd2c497a0c5f3b1271060",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.10",
"size": 3248747,
"upload_time": "2025-10-22T16:35:13",
"upload_time_iso_8601": "2025-10-22T16:35:13.734301Z",
"url": "https://files.pythonhosted.org/packages/53/07/ce469aeca63db0b5926592081893738624697943d3b19d3887a858ccd475/penaltyblog-1.6.2-cp310-cp310-musllinux_1_2_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "33f7a98d0c21e48f7947071996de1f5006a6f2aa618abb39b7e4c580264e078b",
"md5": "8d91f3192ca50ac17a5856c99d4c64a9",
"sha256": "6317657d03ab91c1b8942919b334383aad6e25f5fb4562bc11942554bd30b1b3"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp310-cp310-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "8d91f3192ca50ac17a5856c99d4c64a9",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.10",
"size": 3320002,
"upload_time": "2025-10-22T16:35:15",
"upload_time_iso_8601": "2025-10-22T16:35:15.195424Z",
"url": "https://files.pythonhosted.org/packages/33/f7/a98d0c21e48f7947071996de1f5006a6f2aa618abb39b7e4c580264e078b/penaltyblog-1.6.2-cp310-cp310-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "958981d12673f37452f9bc6d4b81bea9fe73e81f238f5f58819fcbe8a563f45f",
"md5": "6b18f6844605c40251526fa0421bf819",
"sha256": "4f4c7f812804fc13890ed7e973c86b3b02ffd7b9a0bd3a78722b87596983adba"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp310-cp310-win32.whl",
"has_sig": false,
"md5_digest": "6b18f6844605c40251526fa0421bf819",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.10",
"size": 1171386,
"upload_time": "2025-10-22T16:35:16",
"upload_time_iso_8601": "2025-10-22T16:35:16.504249Z",
"url": "https://files.pythonhosted.org/packages/95/89/81d12673f37452f9bc6d4b81bea9fe73e81f238f5f58819fcbe8a563f45f/penaltyblog-1.6.2-cp310-cp310-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "270ed2ead7afdb67b7c28dd15ecb578e58559143a241c48c2ee0a8733252f069",
"md5": "1d7ab826f875b808259209f495ab1979",
"sha256": "6b4ef8a0e0ec503531051f2826413f4f1f3e0c487be8d23b26b0a2bf2cbd1e6f"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp310-cp310-win_amd64.whl",
"has_sig": false,
"md5_digest": "1d7ab826f875b808259209f495ab1979",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.10",
"size": 1231310,
"upload_time": "2025-10-22T16:35:18",
"upload_time_iso_8601": "2025-10-22T16:35:18.161006Z",
"url": "https://files.pythonhosted.org/packages/27/0e/d2ead7afdb67b7c28dd15ecb578e58559143a241c48c2ee0a8733252f069/penaltyblog-1.6.2-cp310-cp310-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "383aa677d46cbe8f8b746079ed70c478b4ace380d593de233ff88adf9e3d149d",
"md5": "8e118840852d6c26b58cbecbe98143b7",
"sha256": "3d5ac72cd3a33ddf558e718a102c85051f4aa5d477f8962fd140df8d42630424"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp311-cp311-macosx_10_9_x86_64.whl",
"has_sig": false,
"md5_digest": "8e118840852d6c26b58cbecbe98143b7",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.10",
"size": 1269140,
"upload_time": "2025-10-22T16:35:19",
"upload_time_iso_8601": "2025-10-22T16:35:19.945752Z",
"url": "https://files.pythonhosted.org/packages/38/3a/a677d46cbe8f8b746079ed70c478b4ace380d593de233ff88adf9e3d149d/penaltyblog-1.6.2-cp311-cp311-macosx_10_9_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "16bc25c5facc72f277861835e4cc4f50e9e636f32a0796967e4af44e9f699d87",
"md5": "cdb0f127a72e08d5969542aeabc417ca",
"sha256": "3c9121c079b471d3dd0d1e10f2692c77e77ca2696ef6adf76f78a83b6024deb3"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp311-cp311-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "cdb0f127a72e08d5969542aeabc417ca",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.10",
"size": 1271551,
"upload_time": "2025-10-22T16:35:21",
"upload_time_iso_8601": "2025-10-22T16:35:21.693837Z",
"url": "https://files.pythonhosted.org/packages/16/bc/25c5facc72f277861835e4cc4f50e9e636f32a0796967e4af44e9f699d87/penaltyblog-1.6.2-cp311-cp311-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "2f1df6200e6a3c2cc58d925575a606e6b490e10caa893fd1088aef2e78793b75",
"md5": "7d932c0e505b57f043745b7e7f6fe144",
"sha256": "4782caf5fc99396ec5f085ef787a826c773bdf585700ddf6ef217f7153312549"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl",
"has_sig": false,
"md5_digest": "7d932c0e505b57f043745b7e7f6fe144",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.10",
"size": 3414525,
"upload_time": "2025-10-22T16:35:23",
"upload_time_iso_8601": "2025-10-22T16:35:23.558101Z",
"url": "https://files.pythonhosted.org/packages/2f/1d/f6200e6a3c2cc58d925575a606e6b490e10caa893fd1088aef2e78793b75/penaltyblog-1.6.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "324ecf2f7323f79df5f7ae35ce388910be6978a714dfec4bacb72afda9e0f4d3",
"md5": "de92e96ddb3333a774a1bd69ed0c95c9",
"sha256": "3ef55ee4381d0c903a6616f46ab099b706ebfa4033a36999f1f6e7220ced60a3"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
"has_sig": false,
"md5_digest": "de92e96ddb3333a774a1bd69ed0c95c9",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.10",
"size": 3444231,
"upload_time": "2025-10-22T16:35:25",
"upload_time_iso_8601": "2025-10-22T16:35:25.037579Z",
"url": "https://files.pythonhosted.org/packages/32/4e/cf2f7323f79df5f7ae35ce388910be6978a714dfec4bacb72afda9e0f4d3/penaltyblog-1.6.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "3b94cf31fef1bad225873330374c7e77b8d19637cba7f20bf6ab10bbecda61df",
"md5": "6edae25e7caa01c40d5dfe7502e47b17",
"sha256": "296ca677245fe134de6c422739bd073a217bc26687f254c59192e1047bf91d8e"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp311-cp311-musllinux_1_2_aarch64.whl",
"has_sig": false,
"md5_digest": "6edae25e7caa01c40d5dfe7502e47b17",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.10",
"size": 3381635,
"upload_time": "2025-10-22T16:35:26",
"upload_time_iso_8601": "2025-10-22T16:35:26.898648Z",
"url": "https://files.pythonhosted.org/packages/3b/94/cf31fef1bad225873330374c7e77b8d19637cba7f20bf6ab10bbecda61df/penaltyblog-1.6.2-cp311-cp311-musllinux_1_2_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "99fdf4b46db7e1f882fb535118224b9b6db9630b38ca9c3d11104a5cabbbdb8e",
"md5": "baab7d5070907a66e1c8a08a06b8ee2b",
"sha256": "b7846aff2f03b75291651bf857ee580c4843919139813ebb871ae06a28110e91"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp311-cp311-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "baab7d5070907a66e1c8a08a06b8ee2b",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.10",
"size": 3457277,
"upload_time": "2025-10-22T16:35:28",
"upload_time_iso_8601": "2025-10-22T16:35:28.435030Z",
"url": "https://files.pythonhosted.org/packages/99/fd/f4b46db7e1f882fb535118224b9b6db9630b38ca9c3d11104a5cabbbdb8e/penaltyblog-1.6.2-cp311-cp311-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "e9f38034cfcad8b74db1d1e1f339fe766dc9f67d4f01f3e20fbfa4e012900e59",
"md5": "21762917f30a951244507e3d44f60e6b",
"sha256": "e3f513c38d1d45f8ba1f2ba715c086f45c6903cb5cde08c66e7b0f31169fd93c"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp311-cp311-win32.whl",
"has_sig": false,
"md5_digest": "21762917f30a951244507e3d44f60e6b",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.10",
"size": 1170135,
"upload_time": "2025-10-22T16:35:29",
"upload_time_iso_8601": "2025-10-22T16:35:29.862337Z",
"url": "https://files.pythonhosted.org/packages/e9/f3/8034cfcad8b74db1d1e1f339fe766dc9f67d4f01f3e20fbfa4e012900e59/penaltyblog-1.6.2-cp311-cp311-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "cdf669ce416217d2e5ffad32278ea3bf64f2ed76aef572c6f1f8976d768e9098",
"md5": "e2e4f1521a6ddff04c97e3dd6fac6b54",
"sha256": "7a36e308a02c0a2d2973e2b95e6771bee3a7ea7225f95f439ef2bfc4d7858510"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp311-cp311-win_amd64.whl",
"has_sig": false,
"md5_digest": "e2e4f1521a6ddff04c97e3dd6fac6b54",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.10",
"size": 1231062,
"upload_time": "2025-10-22T16:35:31",
"upload_time_iso_8601": "2025-10-22T16:35:31.265909Z",
"url": "https://files.pythonhosted.org/packages/cd/f6/69ce416217d2e5ffad32278ea3bf64f2ed76aef572c6f1f8976d768e9098/penaltyblog-1.6.2-cp311-cp311-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "1120d4af001008b9c191b5448bcce303f8825c723396376c95929ca6a59aa434",
"md5": "d775fa5c61a87d8d55cdacd9566cab79",
"sha256": "630036df221abce8d0f4879ffe317ed0137a2641ac6463b08f0b377067208065"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp312-cp312-macosx_10_13_x86_64.whl",
"has_sig": false,
"md5_digest": "d775fa5c61a87d8d55cdacd9566cab79",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.10",
"size": 1271807,
"upload_time": "2025-10-22T16:35:33",
"upload_time_iso_8601": "2025-10-22T16:35:33.123698Z",
"url": "https://files.pythonhosted.org/packages/11/20/d4af001008b9c191b5448bcce303f8825c723396376c95929ca6a59aa434/penaltyblog-1.6.2-cp312-cp312-macosx_10_13_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "a5a83a405b392ffece2bc32b51314682c8eda2e67e5a9496bfeb7cb3dd222f6e",
"md5": "3037205a1c83448f4170d2f2ed5d6d04",
"sha256": "09b93efccf26c0169c1e272e500f6369534639b9025eb23f73473545be351e43"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp312-cp312-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "3037205a1c83448f4170d2f2ed5d6d04",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.10",
"size": 1274735,
"upload_time": "2025-10-22T16:35:34",
"upload_time_iso_8601": "2025-10-22T16:35:34.672474Z",
"url": "https://files.pythonhosted.org/packages/a5/a8/3a405b392ffece2bc32b51314682c8eda2e67e5a9496bfeb7cb3dd222f6e/penaltyblog-1.6.2-cp312-cp312-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "346be9af08abd2671d57817bf1c4c9c4cbc99e6c81cf9c985750af4fe8cc5707",
"md5": "0076d9c7c34f16b4198b0d010947c7b3",
"sha256": "4c68ac670986167f610372fe95c7bf735240df52bc8b2c3cd86510911a220a7f"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl",
"has_sig": false,
"md5_digest": "0076d9c7c34f16b4198b0d010947c7b3",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.10",
"size": 3421559,
"upload_time": "2025-10-22T16:35:36",
"upload_time_iso_8601": "2025-10-22T16:35:36.066319Z",
"url": "https://files.pythonhosted.org/packages/34/6b/e9af08abd2671d57817bf1c4c9c4cbc99e6c81cf9c985750af4fe8cc5707/penaltyblog-1.6.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "b3808e6a95e35ba985c14820e8e6083eacb6c58cebc4b62fd167cfdcb3d1b4d2",
"md5": "38bc2884f2644f32b1d2b8f933dc02fc",
"sha256": "8a40ffaae7df86f47c06a663e115682db9a12fae62222d79b8a28253c8b8820c"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
"has_sig": false,
"md5_digest": "38bc2884f2644f32b1d2b8f933dc02fc",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.10",
"size": 3463881,
"upload_time": "2025-10-22T16:35:37",
"upload_time_iso_8601": "2025-10-22T16:35:37.881615Z",
"url": "https://files.pythonhosted.org/packages/b3/80/8e6a95e35ba985c14820e8e6083eacb6c58cebc4b62fd167cfdcb3d1b4d2/penaltyblog-1.6.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "f77ee94fe883a276907ef4ebfcf67fcd8bc6f8fc776dbd670dfd4ff804619a7c",
"md5": "0b3c24aaed515c61a8eb9c7c9eedad95",
"sha256": "0a2f417551bb6d1299342e07f3535759db6d9e7106e3d7918f36b2ad19e6edd4"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp312-cp312-musllinux_1_2_aarch64.whl",
"has_sig": false,
"md5_digest": "0b3c24aaed515c61a8eb9c7c9eedad95",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.10",
"size": 3364407,
"upload_time": "2025-10-22T16:35:39",
"upload_time_iso_8601": "2025-10-22T16:35:39.322915Z",
"url": "https://files.pythonhosted.org/packages/f7/7e/e94fe883a276907ef4ebfcf67fcd8bc6f8fc776dbd670dfd4ff804619a7c/penaltyblog-1.6.2-cp312-cp312-musllinux_1_2_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "f8253bb42dfb22f1a44b9f67933574e5832d44a843d2e0dcb721c2b1af44f9bf",
"md5": "27d4446205c09939a9b0b3fb5e317e8f",
"sha256": "91311de5886bee6cc439ab012389fc2a5a59779e617f31d33ebf6bf2103dfbeb"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp312-cp312-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "27d4446205c09939a9b0b3fb5e317e8f",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.10",
"size": 3449268,
"upload_time": "2025-10-22T16:35:42",
"upload_time_iso_8601": "2025-10-22T16:35:42.094220Z",
"url": "https://files.pythonhosted.org/packages/f8/25/3bb42dfb22f1a44b9f67933574e5832d44a843d2e0dcb721c2b1af44f9bf/penaltyblog-1.6.2-cp312-cp312-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "4fb3e6338263980955effa9ea2bb67ecfef3a568936da4498c0b3649c10ddf20",
"md5": "34b03896d56898d284f549cc09493ed8",
"sha256": "90bf2630894bd302a3223922bc20756c2c9aa354c84a0144cd099130b92d9b0a"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp312-cp312-win32.whl",
"has_sig": false,
"md5_digest": "34b03896d56898d284f549cc09493ed8",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.10",
"size": 1170532,
"upload_time": "2025-10-22T16:35:44",
"upload_time_iso_8601": "2025-10-22T16:35:44.029880Z",
"url": "https://files.pythonhosted.org/packages/4f/b3/e6338263980955effa9ea2bb67ecfef3a568936da4498c0b3649c10ddf20/penaltyblog-1.6.2-cp312-cp312-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "83d7989f758d086e4d6eb1926eea1cdf49cd6b645f094ff60220ecf615a81e1d",
"md5": "2e84dabde2dbb614b563464c0c701f26",
"sha256": "4c99f5ef207b7045418474e9beabaf75b0bb9b875691fda5ac65e2ff40882072"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp312-cp312-win_amd64.whl",
"has_sig": false,
"md5_digest": "2e84dabde2dbb614b563464c0c701f26",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.10",
"size": 1233718,
"upload_time": "2025-10-22T16:35:45",
"upload_time_iso_8601": "2025-10-22T16:35:45.427208Z",
"url": "https://files.pythonhosted.org/packages/83/d7/989f758d086e4d6eb1926eea1cdf49cd6b645f094ff60220ecf615a81e1d/penaltyblog-1.6.2-cp312-cp312-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "714b79d104d29d849cf5835c2565887e6d456b49d441320f0e665cd395f3a44e",
"md5": "91b6ab0712c3445199d8c596860c1d68",
"sha256": "405e7c5f355e6e8b6884d7a6846c5db6ec4d740210d145a9455bcd098f56b5aa"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp313-cp313-macosx_10_13_x86_64.whl",
"has_sig": false,
"md5_digest": "91b6ab0712c3445199d8c596860c1d68",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.10",
"size": 1267750,
"upload_time": "2025-10-22T16:35:46",
"upload_time_iso_8601": "2025-10-22T16:35:46.906562Z",
"url": "https://files.pythonhosted.org/packages/71/4b/79d104d29d849cf5835c2565887e6d456b49d441320f0e665cd395f3a44e/penaltyblog-1.6.2-cp313-cp313-macosx_10_13_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "b327a8389082607bb8f9962d8ba1837fa170dab5f5ae6efbab48bc2b113dfe00",
"md5": "c2dfbe79e4d5e228a4316edb9fb80247",
"sha256": "5abb3380794ce65fc764111ef76052ae7701ec4097e191c370a3908e135cdb7a"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp313-cp313-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "c2dfbe79e4d5e228a4316edb9fb80247",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.10",
"size": 1270891,
"upload_time": "2025-10-22T16:35:48",
"upload_time_iso_8601": "2025-10-22T16:35:48.386605Z",
"url": "https://files.pythonhosted.org/packages/b3/27/a8389082607bb8f9962d8ba1837fa170dab5f5ae6efbab48bc2b113dfe00/penaltyblog-1.6.2-cp313-cp313-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "004347e1147a9266aa249057341ae640953e9aa68906bef0e4d2bcef31e6f70f",
"md5": "838577aef14c49c0e4a6767bcb35eec7",
"sha256": "2bfe7c18afe2fac41f7f36909058ca458cb356254e6de131adaeb4369864cdf2"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl",
"has_sig": false,
"md5_digest": "838577aef14c49c0e4a6767bcb35eec7",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.10",
"size": 3398706,
"upload_time": "2025-10-22T16:35:49",
"upload_time_iso_8601": "2025-10-22T16:35:49.869401Z",
"url": "https://files.pythonhosted.org/packages/00/43/47e1147a9266aa249057341ae640953e9aa68906bef0e4d2bcef31e6f70f/penaltyblog-1.6.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "b6f68caae6be51c814f48a35f7bf9982a3229637f1a975e7fac13faaba843786",
"md5": "ee3e455b20a084779b162a97de14c152",
"sha256": "1be53421af79420877afea180eb2a8aa863ca4e43df5b5a9aa76e9f83231ce5e"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
"has_sig": false,
"md5_digest": "ee3e455b20a084779b162a97de14c152",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.10",
"size": 3450334,
"upload_time": "2025-10-22T16:35:51",
"upload_time_iso_8601": "2025-10-22T16:35:51.356318Z",
"url": "https://files.pythonhosted.org/packages/b6/f6/8caae6be51c814f48a35f7bf9982a3229637f1a975e7fac13faaba843786/penaltyblog-1.6.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "65667ad5c297122e225c8ba919663ac9e0e9183ffc0e475ceef271617f792f49",
"md5": "3a197c790460694ff36865dea97200e1",
"sha256": "1fb39774bc62ac459b3f01443936cbc6390774b33cec68ee79d853d12e2dd08c"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp313-cp313-musllinux_1_2_aarch64.whl",
"has_sig": false,
"md5_digest": "3a197c790460694ff36865dea97200e1",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.10",
"size": 3347741,
"upload_time": "2025-10-22T16:35:52",
"upload_time_iso_8601": "2025-10-22T16:35:52.792481Z",
"url": "https://files.pythonhosted.org/packages/65/66/7ad5c297122e225c8ba919663ac9e0e9183ffc0e475ceef271617f792f49/penaltyblog-1.6.2-cp313-cp313-musllinux_1_2_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "e6300ec4cb4b2c16c994a1c767ad9d2865a977a7b9493d99c66fa56391e6ad1b",
"md5": "0209891c53d6a2402b4adc70552bbdf9",
"sha256": "bb05722ff84442bac8ae6625fa228df0a83938c8815343fa7ab88ca358b35515"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp313-cp313-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "0209891c53d6a2402b4adc70552bbdf9",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.10",
"size": 3436165,
"upload_time": "2025-10-22T16:35:54",
"upload_time_iso_8601": "2025-10-22T16:35:54.593801Z",
"url": "https://files.pythonhosted.org/packages/e6/30/0ec4cb4b2c16c994a1c767ad9d2865a977a7b9493d99c66fa56391e6ad1b/penaltyblog-1.6.2-cp313-cp313-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "74793e0a121985c7db9d932fb3f46adc35d7e2bfb23212919f69e6137fde213c",
"md5": "65e0f0af5d5ea65a1d1a1ec48667a9b0",
"sha256": "e4e15d3a88139c5177cf6b6aee6f0eb0a9b53abc60fbbe728cfa9d15b69bb6a1"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp313-cp313-win32.whl",
"has_sig": false,
"md5_digest": "65e0f0af5d5ea65a1d1a1ec48667a9b0",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.10",
"size": 1169673,
"upload_time": "2025-10-22T16:35:56",
"upload_time_iso_8601": "2025-10-22T16:35:56.167575Z",
"url": "https://files.pythonhosted.org/packages/74/79/3e0a121985c7db9d932fb3f46adc35d7e2bfb23212919f69e6137fde213c/penaltyblog-1.6.2-cp313-cp313-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "64d172ab1e8b4d860676d930bec86ea158e408d7e12b2bb636a6ac9297f06327",
"md5": "01e8b1b10ec19c82f6dd239b25dfaa29",
"sha256": "0f7593d84c73be8387e236d2c0a26af06be36972f1c9395ebf241ed51d24d565"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp313-cp313-win_amd64.whl",
"has_sig": false,
"md5_digest": "01e8b1b10ec19c82f6dd239b25dfaa29",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.10",
"size": 1232955,
"upload_time": "2025-10-22T16:35:57",
"upload_time_iso_8601": "2025-10-22T16:35:57.513641Z",
"url": "https://files.pythonhosted.org/packages/64/d1/72ab1e8b4d860676d930bec86ea158e408d7e12b2bb636a6ac9297f06327/penaltyblog-1.6.2-cp313-cp313-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "9bda7fba908faaf2f7064608a6a71c9951782e76a4d3bf233d1678a79fecbc80",
"md5": "d3c601f1ea9f747d0bee0fbdb667dd06",
"sha256": "675913a0e1c230f8fea6868c56c171f3678fd3dcf66a9eeb8a560452e872fd75"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp314-cp314-macosx_10_15_x86_64.whl",
"has_sig": false,
"md5_digest": "d3c601f1ea9f747d0bee0fbdb667dd06",
"packagetype": "bdist_wheel",
"python_version": "cp314",
"requires_python": ">=3.10",
"size": 1268393,
"upload_time": "2025-10-22T16:35:59",
"upload_time_iso_8601": "2025-10-22T16:35:59.183398Z",
"url": "https://files.pythonhosted.org/packages/9b/da/7fba908faaf2f7064608a6a71c9951782e76a4d3bf233d1678a79fecbc80/penaltyblog-1.6.2-cp314-cp314-macosx_10_15_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "fc601e89466abdd25e4facb93a576ad6c7bfb0db13c0c859c16de0d1a1ac04e2",
"md5": "384d0d0baa69bcc1a865e2f0608bf4e1",
"sha256": "bc26d6e5a72667dce4c05a221ad6efc7c6d9926928f77c490ff7d995cff2ef66"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp314-cp314-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "384d0d0baa69bcc1a865e2f0608bf4e1",
"packagetype": "bdist_wheel",
"python_version": "cp314",
"requires_python": ">=3.10",
"size": 1273589,
"upload_time": "2025-10-22T16:36:00",
"upload_time_iso_8601": "2025-10-22T16:36:00.976291Z",
"url": "https://files.pythonhosted.org/packages/fc/60/1e89466abdd25e4facb93a576ad6c7bfb0db13c0c859c16de0d1a1ac04e2/penaltyblog-1.6.2-cp314-cp314-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "61811147f84ac9988e28ac3ff2edaef6d98f7188b5ffacb390cac4d387ab6abb",
"md5": "c77f74ec1aa49ce4eab0373aa0c26f7c",
"sha256": "3108238e166bd90055fbcb4ddaf17d3a475362e2ae1835af02aa36fa4162d143"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl",
"has_sig": false,
"md5_digest": "c77f74ec1aa49ce4eab0373aa0c26f7c",
"packagetype": "bdist_wheel",
"python_version": "cp314",
"requires_python": ">=3.10",
"size": 3397596,
"upload_time": "2025-10-22T16:36:02",
"upload_time_iso_8601": "2025-10-22T16:36:02.488367Z",
"url": "https://files.pythonhosted.org/packages/61/81/1147f84ac9988e28ac3ff2edaef6d98f7188b5ffacb390cac4d387ab6abb/penaltyblog-1.6.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "46293cffcb07648b5391aacaa28c82b6f24acae270c67c2852ced660621d21dd",
"md5": "5b574473341939cefae78acc8a30ccdc",
"sha256": "8c77d1eeee5c7bedf66f621a69d62e2376aa64224e19a32e8438c32b9760be07"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
"has_sig": false,
"md5_digest": "5b574473341939cefae78acc8a30ccdc",
"packagetype": "bdist_wheel",
"python_version": "cp314",
"requires_python": ">=3.10",
"size": 3429121,
"upload_time": "2025-10-22T16:36:04",
"upload_time_iso_8601": "2025-10-22T16:36:04.087427Z",
"url": "https://files.pythonhosted.org/packages/46/29/3cffcb07648b5391aacaa28c82b6f24acae270c67c2852ced660621d21dd/penaltyblog-1.6.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "f766d5ef42e7a9e0c3718aaa4ab6f855703a952a31d6640d121c878fb4bf6c4e",
"md5": "11b594fa30d381207fecd06278655028",
"sha256": "03202b2ec72a68be3c4678ddf0b8a712070d162a7e5b66a6cfff26b46844552b"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp314-cp314-musllinux_1_2_aarch64.whl",
"has_sig": false,
"md5_digest": "11b594fa30d381207fecd06278655028",
"packagetype": "bdist_wheel",
"python_version": "cp314",
"requires_python": ">=3.10",
"size": 3348253,
"upload_time": "2025-10-22T16:36:06",
"upload_time_iso_8601": "2025-10-22T16:36:06.471405Z",
"url": "https://files.pythonhosted.org/packages/f7/66/d5ef42e7a9e0c3718aaa4ab6f855703a952a31d6640d121c878fb4bf6c4e/penaltyblog-1.6.2-cp314-cp314-musllinux_1_2_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "ef17d10d0bc5226d3b47c59066d20e77bd027c6c384bc6c5ab49138535cf5cdf",
"md5": "7a8c499f7e69088c4693cd55bf0c7b3c",
"sha256": "96f771e5cfc85806e348b12a38f0c0ddf432a07d34d21760b731bead818922d4"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp314-cp314-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "7a8c499f7e69088c4693cd55bf0c7b3c",
"packagetype": "bdist_wheel",
"python_version": "cp314",
"requires_python": ">=3.10",
"size": 3415679,
"upload_time": "2025-10-22T16:36:08",
"upload_time_iso_8601": "2025-10-22T16:36:08.393050Z",
"url": "https://files.pythonhosted.org/packages/ef/17/d10d0bc5226d3b47c59066d20e77bd027c6c384bc6c5ab49138535cf5cdf/penaltyblog-1.6.2-cp314-cp314-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "0db48a955aadfa4bdc796f70a128272ce45033e6bb08c06aa583fef48275bff1",
"md5": "eda616b306a82b2e7925cc91c8aea8ff",
"sha256": "22d58f4b5a66e03aaf61c1a592eec938e2a5cf6c513024b7c1674673b58334d2"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp314-cp314t-macosx_10_15_x86_64.whl",
"has_sig": false,
"md5_digest": "eda616b306a82b2e7925cc91c8aea8ff",
"packagetype": "bdist_wheel",
"python_version": "cp314",
"requires_python": ">=3.10",
"size": 1290207,
"upload_time": "2025-10-22T16:36:13",
"upload_time_iso_8601": "2025-10-22T16:36:13.010685Z",
"url": "https://files.pythonhosted.org/packages/0d/b4/8a955aadfa4bdc796f70a128272ce45033e6bb08c06aa583fef48275bff1/penaltyblog-1.6.2-cp314-cp314t-macosx_10_15_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "77df80efbec2db655f9e7b57b3998256bb201233a6091ec417b07bfc7f0c7fb0",
"md5": "762e7cf6ace0703b36258b9ffa5a7f98",
"sha256": "4d0bb6a710e197d13bcf896c8f576d26e02cd8dbd4cbf85869292dbb5ce7f954"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp314-cp314t-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "762e7cf6ace0703b36258b9ffa5a7f98",
"packagetype": "bdist_wheel",
"python_version": "cp314",
"requires_python": ">=3.10",
"size": 1298120,
"upload_time": "2025-10-22T16:36:14",
"upload_time_iso_8601": "2025-10-22T16:36:14.661639Z",
"url": "https://files.pythonhosted.org/packages/77/df/80efbec2db655f9e7b57b3998256bb201233a6091ec417b07bfc7f0c7fb0/penaltyblog-1.6.2-cp314-cp314t-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "b48defdf55575f7697e6a04e7ecc0eec3ad6822ec0f2035f088fac674599c23c",
"md5": "30a92ee69496495faeda90b48319600c",
"sha256": "428a14e818a2d8aec4f9e407455d27f72cd81ee6e31c7807e92ddd8048272714"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl",
"has_sig": false,
"md5_digest": "30a92ee69496495faeda90b48319600c",
"packagetype": "bdist_wheel",
"python_version": "cp314",
"requires_python": ">=3.10",
"size": 3428159,
"upload_time": "2025-10-22T16:36:16",
"upload_time_iso_8601": "2025-10-22T16:36:16.187695Z",
"url": "https://files.pythonhosted.org/packages/b4/8d/efdf55575f7697e6a04e7ecc0eec3ad6822ec0f2035f088fac674599c23c/penaltyblog-1.6.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "2482f0a3387a04200cb33b52a497849a826e9696d2d5fce3246986063ab1cc57",
"md5": "933adbc01e8be768d1760834d1f822ca",
"sha256": "57a3136e1e2ba2d271c0b3fe67247ddaa175ef9929be2e43dbbc3525ca47d432"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
"has_sig": false,
"md5_digest": "933adbc01e8be768d1760834d1f822ca",
"packagetype": "bdist_wheel",
"python_version": "cp314",
"requires_python": ">=3.10",
"size": 3383800,
"upload_time": "2025-10-22T16:36:17",
"upload_time_iso_8601": "2025-10-22T16:36:17.682333Z",
"url": "https://files.pythonhosted.org/packages/24/82/f0a3387a04200cb33b52a497849a826e9696d2d5fce3246986063ab1cc57/penaltyblog-1.6.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "f87cd3a630288283992fbfd056f7e9e39c6f5f8b377e4fd1bd7759305923974f",
"md5": "240b55b6917cc21ede625486252c6359",
"sha256": "894927c2ff44a37c689ba1bb530d17fd79a88ddb6f4843ab4001846e72d9ec57"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp314-cp314t-musllinux_1_2_aarch64.whl",
"has_sig": false,
"md5_digest": "240b55b6917cc21ede625486252c6359",
"packagetype": "bdist_wheel",
"python_version": "cp314",
"requires_python": ">=3.10",
"size": 3336754,
"upload_time": "2025-10-22T16:36:19",
"upload_time_iso_8601": "2025-10-22T16:36:19.418887Z",
"url": "https://files.pythonhosted.org/packages/f8/7c/d3a630288283992fbfd056f7e9e39c6f5f8b377e4fd1bd7759305923974f/penaltyblog-1.6.2-cp314-cp314t-musllinux_1_2_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "2e81984a78385aaa4567a71831174870f7d60f9345568d600646896231350086",
"md5": "3b5a7bd608ec0a4ebd1754c439b419ee",
"sha256": "c3ce44c3586d147d3fde7df9456c6e33f25a8b51057081c0f232235ca549be1b"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp314-cp314t-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "3b5a7bd608ec0a4ebd1754c439b419ee",
"packagetype": "bdist_wheel",
"python_version": "cp314",
"requires_python": ">=3.10",
"size": 3350966,
"upload_time": "2025-10-22T16:36:20",
"upload_time_iso_8601": "2025-10-22T16:36:20.858322Z",
"url": "https://files.pythonhosted.org/packages/2e/81/984a78385aaa4567a71831174870f7d60f9345568d600646896231350086/penaltyblog-1.6.2-cp314-cp314t-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "f719bea72db355892c368ef21ed690a579676ac4ad1d18cccac0177365c62b49",
"md5": "e6eceb0233fdd36288857c4ed7213e2f",
"sha256": "fb5dabbf0665b7f71a58f8bd8c32788ec8d6892e81b29daa95e219cb22ecef6a"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp314-cp314t-win32.whl",
"has_sig": false,
"md5_digest": "e6eceb0233fdd36288857c4ed7213e2f",
"packagetype": "bdist_wheel",
"python_version": "cp314",
"requires_python": ">=3.10",
"size": 1220150,
"upload_time": "2025-10-22T16:36:22",
"upload_time_iso_8601": "2025-10-22T16:36:22.559271Z",
"url": "https://files.pythonhosted.org/packages/f7/19/bea72db355892c368ef21ed690a579676ac4ad1d18cccac0177365c62b49/penaltyblog-1.6.2-cp314-cp314t-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "5e6576e7274d776ebfa091ee1dea0a0e1925512068fe5ab83b266976078b5041",
"md5": "971068e79a9c07c2d392615fe1dd1d7c",
"sha256": "693909cf32bde1d2fb26869b084471c50fa3be59cd6740040c0dfcff15c555dc"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp314-cp314t-win_amd64.whl",
"has_sig": false,
"md5_digest": "971068e79a9c07c2d392615fe1dd1d7c",
"packagetype": "bdist_wheel",
"python_version": "cp314",
"requires_python": ">=3.10",
"size": 1299956,
"upload_time": "2025-10-22T16:36:23",
"upload_time_iso_8601": "2025-10-22T16:36:23.936478Z",
"url": "https://files.pythonhosted.org/packages/5e/65/76e7274d776ebfa091ee1dea0a0e1925512068fe5ab83b266976078b5041/penaltyblog-1.6.2-cp314-cp314t-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "79cd8db53c21a1bb6a347cedb3d915b367fa5d3bbd03cff429a49e8d8a5d3257",
"md5": "ad6bc3e11051d762d261f28b77806bc6",
"sha256": "d9f7851866b66f7fc39fb7af8ac3cb986a056f29c02e6690c0c6d30fcc2623ae"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp314-cp314-win32.whl",
"has_sig": false,
"md5_digest": "ad6bc3e11051d762d261f28b77806bc6",
"packagetype": "bdist_wheel",
"python_version": "cp314",
"requires_python": ">=3.10",
"size": 1171559,
"upload_time": "2025-10-22T16:36:09",
"upload_time_iso_8601": "2025-10-22T16:36:09.753299Z",
"url": "https://files.pythonhosted.org/packages/79/cd/8db53c21a1bb6a347cedb3d915b367fa5d3bbd03cff429a49e8d8a5d3257/penaltyblog-1.6.2-cp314-cp314-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "1254c9c65ed02b768bacb189c6e9479bb9ab66b5851915e1be3d972806b13f37",
"md5": "e564168b81289c4d2cc8712227e55917",
"sha256": "f05c80868d55f098ed343d8352cdb837fb33095bada7c98688ba8eeef72765e5"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2-cp314-cp314-win_amd64.whl",
"has_sig": false,
"md5_digest": "e564168b81289c4d2cc8712227e55917",
"packagetype": "bdist_wheel",
"python_version": "cp314",
"requires_python": ">=3.10",
"size": 1236752,
"upload_time": "2025-10-22T16:36:11",
"upload_time_iso_8601": "2025-10-22T16:36:11.250053Z",
"url": "https://files.pythonhosted.org/packages/12/54/c9c65ed02b768bacb189c6e9479bb9ab66b5851915e1be3d972806b13f37/penaltyblog-1.6.2-cp314-cp314-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "1b36b84f63578de78236062422f95019e7d7991b864b929bb7014ddf657fbdf7",
"md5": "e42ada7565457ea62fbc75bf8dcaead6",
"sha256": "004256043b15ec3cb13c762d449277d05005ec4f4b992467ed1e4fcaa95f32a8"
},
"downloads": -1,
"filename": "penaltyblog-1.6.2.tar.gz",
"has_sig": false,
"md5_digest": "e42ada7565457ea62fbc75bf8dcaead6",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.10",
"size": 830934,
"upload_time": "2025-10-22T16:36:25",
"upload_time_iso_8601": "2025-10-22T16:36:25.345308Z",
"url": "https://files.pythonhosted.org/packages/1b/36/b84f63578de78236062422f95019e7d7991b864b929bb7014ddf657fbdf7/penaltyblog-1.6.2.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-10-22 16:36:25",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "martineastwood",
"github_project": "penaltyblog",
"travis_ci": false,
"coveralls": true,
"github_actions": true,
"lcname": "penaltyblog"
}